All files vendors~main.e506543c24c65cd5de83.bundle.js

35.04% Statements 11330/32333
19.42% Branches 5206/26803
33.82% Functions 3547/10488
88.89% Lines 216/243

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 20191768x                             5248x             108x               30x               36x               180x             468x             2x             2x               180x                             624x             1120x             2x               18x             186x             2x                               2x             2x                                         2x               4x             2x               2x             8x             2x                           2x                                           2x                             2x             2x               2x                                                         2x                             2x                             10x             2x             2x             668x             2x                                           2x             2x               2x                                           2x             2x             2x                               2x                             4x                             2x                           6x             2x                                             2x                             2x             2x                             2x               4x             2x               236x             10x             2x             2x                                           200x               2x             62x             60x             2x                             2x             2x               2x               12x             2x                             2x               98x               8x             30x             2x             12x                                           2x             2x               2x             10x             4x                                           6x             68x             62x                                                                                                 88x                       56x               118x             2840x             1210x             12034x             8x             940x               2x             2x               2x             2x             2x                           2x               2x                           2x                             8x             4x             8784x             148x             320x             494x             116x               2x                                           18x             2x             8x             2x             1626x             8x             12x             10x             128x             118x             104x             16x             248x             2x             36x             126x             13268x                           2x             2x             8x               2x                             2x             2x             2x                             2x             8x             506x             2x             44x             2x             2x             2x             2x             2x             8x             2x             1120x             608x             1120x             104x             2x                             2x             2x             2x               2x             2x             520x             264x               230x             2x             2x             2x                           2x               1100x         1146x         4x                 1078x           288x             1250x               998x               2494x             690x               8x             4x             1380x             42x                                           185300x                             2x             10x               2x             2x               12x                             2x               1338x               1236x             2x             2x                             2x             2x               2x             2x             2x               2x             2x             2x               86x                           2x                             2x             2x             2x                             2x             10x             2x                           2x             2x                             4x             12x             2x             2x               2x                             2x                           2x               2x             2x             2x               2x             1120x             32x             4x             40x             40x  
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],[function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"c",function(){return __extends}),__webpack_require__.d(__webpack_exports__,"a",function(){return __assign}),__webpack_require__.d(__webpack_exports__,"b",function(){return __decorate}),__webpack_require__.d(__webpack_exports__,"e",function(){return __param}),__webpack_require__.d(__webpack_exports__,"d",function(){return __metadata}),__webpack_require__.d(__webpack_exports__,"h",function(){return __values}),__webpack_require__.d(__webpack_exports__,"f",function(){return __read}),__webpack_require__.d(__webpack_exports__,"g",function(){return __spread});
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
 
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
 
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
var extendStatics=function(d,b){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p])})(d,b)};function __extends(d,b){function __(){this.constructor=d}extendStatics(d,b),d.prototype=null===b?Object.create(b):(__.prototype=b.prototype,new __)}var __assign=function(){return(__assign=Object.assign||function __assign(t){for(var s,i=1,n=arguments.length;i<n;i++)for(var p in s=arguments[i])Object.prototype.hasOwnProperty.call(s,p)&&(t[p]=s[p]);return t}).apply(this,arguments)};function __decorate(decorators,target,key,desc){var d,c=arguments.length,r=c<3?target:null===desc?desc=Object.getOwnPropertyDescriptor(target,key):desc;Iif("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(decorators,target,key,desc);else for(var i=decorators.length-1;i>=0;i--)(d=decorators[i])&&(r=(c<3?d(r):c>3?d(target,key,r):d(target,key))||r);return c>3&&r&&Object.defineProperty(target,key,r),r}function __param(paramIndex,decorator){return function(target,key){decorator(target,key,paramIndex)}}function __metadata(metadataKey,metadataValue){Eif("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(metadataKey,metadataValue)}function __values(o){var m="function"==typeof Symbol&&o[Symbol.iterator],i=0;return m?m.call(o):{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}}}function __read(o,n){var m="function"==typeof Symbol&&o[Symbol.iterator];Iif(!m)return o;var r,e,i=m.call(o),ar=[];try{for(;(void 0===n||n-- >0)&&!(r=i.next()).done;)ar.push(r.value)}catch(error){e={error:error}}finally{try{r&&!r.done&&(m=i.return)&&m.call(i)}finally{Iif(e)throw e.error}}return ar}function __spread(){for(var ar=[],i=0;i<arguments.length;i++)ar=ar.concat(__read(arguments[i]));return ar}},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(global){__webpack_require__.d(__webpack_exports__,"f",function(){return ApplicationRef}),__webpack_require__.d(__webpack_exports__,"jb",function(){return createPlatformFactory}),__webpack_require__.d(__webpack_exports__,"H",function(){return NgProbeToken}),__webpack_require__.d(__webpack_exports__,"kb",function(){return enableProdMode}),__webpack_require__.d(__webpack_exports__,"nb",function(){return isDevMode}),__webpack_require__.d(__webpack_exports__,"b",function(){return APP_ID}),__webpack_require__.d(__webpack_exports__,"L",function(){return PACKAGE_ROOT_URL}),__webpack_require__.d(__webpack_exports__,"N",function(){return PLATFORM_INITIALIZER}),__webpack_require__.d(__webpack_exports__,"M",function(){return PLATFORM_ID}),__webpack_require__.d(__webpack_exports__,"c",function(){return APP_INITIALIZER}),__webpack_require__.d(__webpack_exports__,"d",function(){return ApplicationInitStatus}),__webpack_require__.d(__webpack_exports__,"mb",function(){return getDebugNode}),__webpack_require__.d(__webpack_exports__,"cb",function(){return Testability}),__webpack_require__.d(__webpack_exports__,"pb",function(){return setTestabilityGetter}),__webpack_require__.d(__webpack_exports__,"Z",function(){return TRANSLATIONS$1}),__webpack_require__.d(__webpack_exports__,"ab",function(){return TRANSLATIONS_FORMAT}),__webpack_require__.d(__webpack_exports__,"C",function(){return LOCALE_ID}),__webpack_require__.d(__webpack_exports__,"D",function(){return MissingTranslationStrategy}),__webpack_require__.d(__webpack_exports__,"e",function(){return ApplicationModule}),__webpack_require__.d(__webpack_exports__,"db",function(){return Type}),__webpack_require__.d(__webpack_exports__,"t",function(){return EventEmitter}),__webpack_require__.d(__webpack_exports__,"s",function(){return ErrorHandler}),__webpack_require__.d(__webpack_exports__,"U",function(){return Sanitizer}),__webpack_require__.d(__webpack_exports__,"V",function(){return SecurityContext}),__webpack_require__.d(__webpack_exports__,"g",function(){return Attribute}),__webpack_require__.d(__webpack_exports__,"a",function(){return ANALYZE_FOR_ENTRY_COMPONENTS}),__webpack_require__.d(__webpack_exports__,"fb",function(){return ViewChild}),__webpack_require__.d(__webpack_exports__,"m",function(){return Component}),__webpack_require__.d(__webpack_exports__,"q",function(){return Directive}),__webpack_require__.d(__webpack_exports__,"z",function(){return Input}),__webpack_require__.d(__webpack_exports__,"K",function(){return Output}),__webpack_require__.d(__webpack_exports__,"O",function(){return Pipe}),__webpack_require__.d(__webpack_exports__,"E",function(){return NgModule}),__webpack_require__.d(__webpack_exports__,"hb",function(){return ViewEncapsulation}),__webpack_require__.d(__webpack_exports__,"eb",function(){return Version}),__webpack_require__.d(__webpack_exports__,"cc",function(){return ɵɵdefineInjectable}),__webpack_require__.d(__webpack_exports__,"lb",function(){return forwardRef}),__webpack_require__.d(__webpack_exports__,"w",function(){return Injectable}),__webpack_require__.d(__webpack_exports__,"y",function(){return Injector}),__webpack_require__.d(__webpack_exports__,"gc",function(){return ɵɵinject}),__webpack_require__.d(__webpack_exports__,"x",function(){return InjectionToken}),__webpack_require__.d(__webpack_exports__,"v",function(){return Inject}),__webpack_require__.d(__webpack_exports__,"J",function(){return Optional}),__webpack_require__.d(__webpack_exports__,"W",function(){return Self}),__webpack_require__.d(__webpack_exports__,"Y",function(){return SkipSelf}),__webpack_require__.d(__webpack_exports__,"u",function(){return Host}),__webpack_require__.d(__webpack_exports__,"I",function(){return NgZone}),__webpack_require__.d(__webpack_exports__,"Q",function(){return Renderer}),__webpack_require__.d(__webpack_exports__,"R",function(){return Renderer2}),__webpack_require__.d(__webpack_exports__,"S",function(){return RendererFactory2}),__webpack_require__.d(__webpack_exports__,"T",function(){return RendererStyleFlags2}),__webpack_require__.d(__webpack_exports__,"h",function(){return COMPILER_OPTIONS}),__webpack_require__.d(__webpack_exports__,"k",function(){return Compiler}),__webpack_require__.d(__webpack_exports__,"l",function(){return CompilerFactory}),__webpack_require__.d(__webpack_exports__,"n",function(){return ComponentFactory}),__webpack_require__.d(__webpack_exports__,"p",function(){return ComponentRef}),__webpack_require__.d(__webpack_exports__,"o",function(){return ComponentFactoryResolver}),__webpack_require__.d(__webpack_exports__,"r",function(){return ElementRef}),__webpack_require__.d(__webpack_exports__,"F",function(){return NgModuleFactory}),__webpack_require__.d(__webpack_exports__,"G",function(){return NgModuleRef}),__webpack_require__.d(__webpack_exports__,"P",function(){return QueryList}),__webpack_require__.d(__webpack_exports__,"bb",function(){return TemplateRef}),__webpack_require__.d(__webpack_exports__,"gb",function(){return ViewContainerRef}),__webpack_require__.d(__webpack_exports__,"i",function(){return ChangeDetectionStrategy}),__webpack_require__.d(__webpack_exports__,"j",function(){return ChangeDetectorRef}),__webpack_require__.d(__webpack_exports__,"A",function(){return IterableDiffers}),__webpack_require__.d(__webpack_exports__,"B",function(){return KeyValueDiffers}),__webpack_require__.d(__webpack_exports__,"X",function(){return SimpleChange}),__webpack_require__.d(__webpack_exports__,"ib",function(){return WrappedValue}),__webpack_require__.d(__webpack_exports__,"ob",function(){return platformCore}),__webpack_require__.d(__webpack_exports__,"Ib",function(){return isListLikeIterable}),__webpack_require__.d(__webpack_exports__,"sb",function(){return Console}),__webpack_require__.d(__webpack_exports__,"qb",function(){return APP_ROOT}),__webpack_require__.d(__webpack_exports__,"rb",function(){return CodegenComponentFactoryResolver}),__webpack_require__.d(__webpack_exports__,"vb",function(){return ReflectionCapabilities}),__webpack_require__.d(__webpack_exports__,"wb",function(){return _sanitizeHtml}),__webpack_require__.d(__webpack_exports__,"xb",function(){return _sanitizeStyle}),__webpack_require__.d(__webpack_exports__,"yb",function(){return _sanitizeUrl}),__webpack_require__.d(__webpack_exports__,"Fb",function(){return _global}),__webpack_require__.d(__webpack_exports__,"Lb",function(){return looseIdentical}),__webpack_require__.d(__webpack_exports__,"Xb",function(){return stringify}),__webpack_require__.d(__webpack_exports__,"Jb",function(){return isObservable}),__webpack_require__.d(__webpack_exports__,"Kb",function(){return isPromise}),__webpack_require__.d(__webpack_exports__,"bc",function(){return ɵɵdefineDirective}),__webpack_require__.d(__webpack_exports__,"dc",function(){return ɵɵelementHostStyling}),__webpack_require__.d(__webpack_exports__,"fc",function(){return ɵɵelementHostStylingMap}),__webpack_require__.d(__webpack_exports__,"ec",function(){return ɵɵelementHostStylingApply}),__webpack_require__.d(__webpack_exports__,"Wb",function(){return registerModuleFactory}),__webpack_require__.d(__webpack_exports__,"tb",function(){return EMPTY_ARRAY$3}),__webpack_require__.d(__webpack_exports__,"ub",function(){return EMPTY_MAP}),__webpack_require__.d(__webpack_exports__,"zb",function(){return anchorDef}),__webpack_require__.d(__webpack_exports__,"Ab",function(){return createComponentFactory}),__webpack_require__.d(__webpack_exports__,"Bb",function(){return createNgModuleFactory}),__webpack_require__.d(__webpack_exports__,"Cb",function(){return createRendererType2}),__webpack_require__.d(__webpack_exports__,"Db",function(){return directiveDef}),__webpack_require__.d(__webpack_exports__,"Eb",function(){return elementDef}),__webpack_require__.d(__webpack_exports__,"Gb",function(){return inlineInterpolate}),__webpack_require__.d(__webpack_exports__,"Hb",function(){return interpolate}),__webpack_require__.d(__webpack_exports__,"Mb",function(){return moduleDef}),__webpack_require__.d(__webpack_exports__,"Nb",function(){return moduleProvideDef}),__webpack_require__.d(__webpack_exports__,"Ob",function(){return ngContentDef}),__webpack_require__.d(__webpack_exports__,"Pb",function(){return nodeValue}),__webpack_require__.d(__webpack_exports__,"Rb",function(){return pipeDef}),__webpack_require__.d(__webpack_exports__,"Ub",function(){return providerDef}),__webpack_require__.d(__webpack_exports__,"Qb",function(){return pureArrayDef}),__webpack_require__.d(__webpack_exports__,"Sb",function(){return pureObjectDef}),__webpack_require__.d(__webpack_exports__,"Tb",function(){return purePipeDef}),__webpack_require__.d(__webpack_exports__,"Vb",function(){return queryDef}),__webpack_require__.d(__webpack_exports__,"Yb",function(){return textDef}),__webpack_require__.d(__webpack_exports__,"Zb",function(){return unwrapValue}),__webpack_require__.d(__webpack_exports__,"ac",function(){return viewDef});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),rxjs__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(11),rxjs__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(63),rxjs__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(5),rxjs__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(588),rxjs_operators__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(587),ANNOTATIONS="__annotations__",PARAMETERS="__parameters__",PROP_METADATA="__prop__metadata__";function makeDecorator(name,props,parentClass,additionalProcessing,typeFn){var metaCtor=makeMetadataCtor(props);function DecoratorFactory(){for(var _a,args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];if(this instanceof DecoratorFactory)return metaCtor.call.apply(metaCtor,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([this],args)),this;var annotationInstance=new((_a=DecoratorFactory).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)));return function TypeDecorator(cls){return typeFn&&typeFn.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([cls],args)),(cls.hasOwnProperty(ANNOTATIONS)?cls[ANNOTATIONS]:Object.defineProperty(cls,ANNOTATIONS,{value:[]})[ANNOTATIONS]).push(annotationInstance),additionalProcessing&&additionalProcessing(cls),cls}}return parentClass&&(DecoratorFactory.prototype=Object.create(parentClass.prototype)),DecoratorFactory.prototype.ngMetadataName=name,DecoratorFactory.annotationCls=DecoratorFactory,DecoratorFactory}function makeMetadataCtor(props){return function ctor(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];if(props){var values=props.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(args));for(var propName in values)this[propName]=values[propName]}}}function makeParamDecorator(name,props,parentClass){var metaCtor=makeMetadataCtor(props);function ParamDecoratorFactory(){for(var _a,args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];if(this instanceof ParamDecoratorFactory)return metaCtor.apply(this,args),this;var annotationInstance=new((_a=ParamDecoratorFactory).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)));return ParamDecorator.annotation=annotationInstance,ParamDecorator;function ParamDecorator(cls,unusedKey,index){for(var parameters=cls.hasOwnProperty(PARAMETERS)?cls[PARAMETERS]:Object.defineProperty(cls,PARAMETERS,{value:[]})[PARAMETERS];parameters.length<=index;)parameters.push(null);return(parameters[index]=parameters[index]||[]).push(annotationInstance),cls}}return parentClass&&(ParamDecoratorFactory.prototype=Object.create(parentClass.prototype)),ParamDecoratorFactory.prototype.ngMetadataName=name,ParamDecoratorFactory.annotationCls=ParamDecoratorFactory,ParamDecoratorFactory}function makePropDecorator(name,props,parentClass,additionalProcessing){var metaCtor=makeMetadataCtor(props);function PropDecoratorFactory(){for(var _a,args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];if(this instanceof PropDecoratorFactory)return metaCtor.apply(this,args),this;var decoratorInstance=new((_a=PropDecoratorFactory).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)));return function PropDecorator(target,name){var constructor=target.constructor,meta=constructor.hasOwnProperty(PROP_METADATA)?constructor[PROP_METADATA]:Object.defineProperty(constructor,PROP_METADATA,{value:{}})[PROP_METADATA];meta[name]=meta.hasOwnProperty(name)&&meta[name]||[],meta[name].unshift(decoratorInstance),additionalProcessing&&additionalProcessing.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([target,name],args))}}return parentClass&&(PropDecoratorFactory.prototype=Object.create(parentClass.prototype)),PropDecoratorFactory.prototype.ngMetadataName=name,PropDecoratorFactory.annotationCls=PropDecoratorFactory,PropDecoratorFactory}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var InjectFlags,Inject=makeParamDecorator("Inject",function(token){return{token:token}}),Optional=makeParamDecorator("Optional"),Self=makeParamDecorator("Self"),SkipSelf=makeParamDecorator("SkipSelf"),Host=makeParamDecorator("Host"),Attribute=makeParamDecorator("Attribute",function(attributeName){return{attributeName:attributeName}});
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function getClosureSafeProperty(objWithPropertyToExtract){for(var key in objWithPropertyToExtract)if(objWithPropertyToExtract[key]===getClosureSafeProperty)return key;throw Error("Could not find renamed property on target object.")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function ɵɵdefineInjectable(opts){return{providedIn:opts.providedIn||null,factory:opts.factory,value:void 0}}!function(InjectFlags){InjectFlags[InjectFlags.Default=0]="Default",InjectFlags[InjectFlags.Host=1]="Host",InjectFlags[InjectFlags.Self=2]="Self",InjectFlags[InjectFlags.SkipSelf=4]="SkipSelf",InjectFlags[InjectFlags.Optional=8]="Optional"}(InjectFlags||(InjectFlags={}));function ɵɵdefineInjector(options){return{factory:options.factory,providers:options.providers||[],imports:options.imports||[]}}function getInjectableDef(type){return type&&type.hasOwnProperty(NG_INJECTABLE_DEF)?type[NG_INJECTABLE_DEF]:null}function getInjectorDef(type){return type&&type.hasOwnProperty(NG_INJECTOR_DEF)?type[NG_INJECTOR_DEF]:null}var NG_INJECTABLE_DEF=getClosureSafeProperty({ngInjectableDef:getClosureSafeProperty}),NG_INJECTOR_DEF=getClosureSafeProperty({ngInjectorDef:getClosureSafeProperty});
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function stringify(token){Iif("string"==typeof token)return token;if(token instanceof Array)return"["+token.map(stringify).join(", ")+"]";Iif(null==token)return""+token;Iif(token.overriddenName)return""+token.overriddenName;if(token.name)return""+token.name;var res=token.toString();Iif(null==res)return""+res;var newLineIndex=res.indexOf("\n");return-1===newLineIndex?res:res.substring(0,newLineIndex)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var __forward_ref__=getClosureSafeProperty({__forward_ref__:getClosureSafeProperty});function forwardRef(forwardRefFn){return forwardRefFn.__forward_ref__=forwardRef,forwardRefFn.toString=function(){return stringify(this())},forwardRefFn}function resolveForwardRef(type){var fn=type;return"function"==typeof fn&&fn.hasOwnProperty(__forward_ref__)&&fn.__forward_ref__===forwardRef?fn():type}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var R3ResolvedDependencyType,_global=function getGlobal(){var __globalThis="undefined"!=typeof globalThis&&globalThis,__window="undefined"!=typeof window&&window,__self="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self;return __globalThis||void 0!==global&&global||__window||__self}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(R3ResolvedDependencyType){R3ResolvedDependencyType[R3ResolvedDependencyType.Token=0]="Token",R3ResolvedDependencyType[R3ResolvedDependencyType.Attribute=1]="Attribute"}(R3ResolvedDependencyType||(R3ResolvedDependencyType={}));
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var _injectImplementation,_currentInjector=void 0;function setCurrentInjector(injector){var former=_currentInjector;return _currentInjector=injector,former}function setInjectImplementation(impl){var previous=_injectImplementation;return _injectImplementation=impl,previous}function ɵɵinject(token,flags){return void 0===flags&&(flags=InjectFlags.Default),(_injectImplementation||function injectInjectorOnly(token,flags){if(void 0===flags&&(flags=InjectFlags.Default),void 0===_currentInjector)throw new Error("inject() must be called from an injection context");return null===_currentInjector?injectRootLimpMode(token,void 0,flags):_currentInjector.get(token,flags&InjectFlags.Optional?null:void 0,flags)})(token,flags)}function injectRootLimpMode(token,notFoundValue,flags){var injectableDef=getInjectableDef(token);if(injectableDef&&"root"==injectableDef.providedIn)return void 0===injectableDef.value?injectableDef.value=injectableDef.factory():injectableDef.value;if(flags&InjectFlags.Optional)return null;if(void 0!==notFoundValue)return notFoundValue;throw new Error("Injector: NOT_FOUND ["+stringify(token)+"]")}function injectArgs(types){for(var args=[],i=0;i<types.length;i++){var arg=types[i];if(Array.isArray(arg)){if(0===arg.length)throw new Error("Arguments array must have arguments.");for(var type=void 0,flags=InjectFlags.Default,j=0;j<arg.length;j++){var meta=arg[j];meta instanceof Optional||"Optional"===meta.ngMetadataName?flags|=InjectFlags.Optional:meta instanceof SkipSelf||"SkipSelf"===meta.ngMetadataName?flags|=InjectFlags.SkipSelf:meta instanceof Self||"Self"===meta.ngMetadataName?flags|=InjectFlags.Self:type=meta instanceof Inject?meta.token:meta}args.push(ɵɵinject(type,flags))}else args.push(ɵɵinject(arg))}return args}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var Type=Function;function isType(v){return"function"==typeof v}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var DELEGATE_CTOR=/^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*arguments\)/,INHERITED_CLASS=/^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/,INHERITED_CLASS_WITH_CTOR=/^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/,INHERITED_CLASS_WITH_DELEGATE_CTOR=/^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{\s+super\(\.\.\.arguments\)/,ReflectionCapabilities=function(){function ReflectionCapabilities(reflect){this._reflect=reflect||_global.Reflect}return ReflectionCapabilities.prototype.isReflectionEnabled=function(){return!0},ReflectionCapabilities.prototype.factory=function(t){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];return new(t.bind.apply(t,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)))}},ReflectionCapabilities.prototype._zipTypesAndAnnotations=function(paramTypes,paramAnnotations){var result;result=void 0===paramTypes?new Array(paramAnnotations.length):new Array(paramTypes.length);for(var i=0;i<result.length;i++)void 0===paramTypes?result[i]=[]:paramTypes[i]!=Object?result[i]=[paramTypes[i]]:result[i]=[],paramAnnotations&&null!=paramAnnotations[i]&&(result[i]=result[i].concat(paramAnnotations[i]));return result},ReflectionCapabilities.prototype._ownParameters=function(type,parentCtor){var typeStr=type.toString();if(DELEGATE_CTOR.exec(typeStr)||INHERITED_CLASS_WITH_DELEGATE_CTOR.exec(typeStr)||INHERITED_CLASS.exec(typeStr)&&!INHERITED_CLASS_WITH_CTOR.exec(typeStr))return null;Iif(type.parameters&&type.parameters!==parentCtor.parameters)return type.parameters;var tsickleCtorParams=type.ctorParameters;Iif(tsickleCtorParams&&tsickleCtorParams!==parentCtor.ctorParameters){var ctorParameters="function"==typeof tsickleCtorParams?tsickleCtorParams():tsickleCtorParams,paramTypes_1=ctorParameters.map(function(ctorParam){return ctorParam&&ctorParam.type}),paramAnnotations_1=ctorParameters.map(function(ctorParam){return ctorParam&&convertTsickleDecoratorIntoMetadata(ctorParam.decorators)});return this._zipTypesAndAnnotations(paramTypes_1,paramAnnotations_1)}var paramAnnotations=type.hasOwnProperty(PARAMETERS)&&type[PARAMETERS],paramTypes=this._reflect&&this._reflect.getOwnMetadata&&this._reflect.getOwnMetadata("design:paramtypes",type);return paramTypes||paramAnnotations?this._zipTypesAndAnnotations(paramTypes,paramAnnotations):new Array(type.length).fill(void 0)},ReflectionCapabilities.prototype.parameters=function(type){Iif(!isType(type))return[];var parentCtor=getParentCtor(type),parameters=this._ownParameters(type,parentCtor);return parameters||parentCtor===Object||(parameters=this.parameters(parentCtor)),parameters||[]},ReflectionCapabilities.prototype._ownAnnotations=function(typeOrFunc,parentCtor){Iif(typeOrFunc.annotations&&typeOrFunc.annotations!==parentCtor.annotations){var annotations=typeOrFunc.annotations;return"function"==typeof annotations&&annotations.annotations&&(annotations=annotations.annotations),annotations}return typeOrFunc.decorators&&typeOrFunc.decorators!==parentCtor.decorators?convertTsickleDecoratorIntoMetadata(typeOrFunc.decorators):typeOrFunc.hasOwnProperty(ANNOTATIONS)?typeOrFunc[ANNOTATIONS]:null},ReflectionCapabilities.prototype.annotations=function(typeOrFunc){Iif(!isType(typeOrFunc))return[];var parentCtor=getParentCtor(typeOrFunc),ownAnnotations=this._ownAnnotations(typeOrFunc,parentCtor)||[];return(parentCtor!==Object?this.annotations(parentCtor):[]).concat(ownAnnotations)},ReflectionCapabilities.prototype._ownPropMetadata=function(typeOrFunc,parentCtor){Iif(typeOrFunc.propMetadata&&typeOrFunc.propMetadata!==parentCtor.propMetadata){var propMetadata=typeOrFunc.propMetadata;return"function"==typeof propMetadata&&propMetadata.propMetadata&&(propMetadata=propMetadata.propMetadata),propMetadata}Iif(typeOrFunc.propDecorators&&typeOrFunc.propDecorators!==parentCtor.propDecorators){var propDecorators_1=typeOrFunc.propDecorators,propMetadata_1={};return Object.keys(propDecorators_1).forEach(function(prop){propMetadata_1[prop]=convertTsickleDecoratorIntoMetadata(propDecorators_1[prop])}),propMetadata_1}return typeOrFunc.hasOwnProperty(PROP_METADATA)?typeOrFunc[PROP_METADATA]:null},ReflectionCapabilities.prototype.propMetadata=function(typeOrFunc){Iif(!isType(typeOrFunc))return{};var parentCtor=getParentCtor(typeOrFunc),propMetadata={};if(parentCtor!==Object){var parentPropMetadata_1=this.propMetadata(parentCtor);Object.keys(parentPropMetadata_1).forEach(function(propName){propMetadata[propName]=parentPropMetadata_1[propName]})}var ownPropMetadata=this._ownPropMetadata(typeOrFunc,parentCtor);return ownPropMetadata&&Object.keys(ownPropMetadata).forEach(function(propName){var decorators=[];propMetadata.hasOwnProperty(propName)&&decorators.push.apply(decorators,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(propMetadata[propName])),decorators.push.apply(decorators,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ownPropMetadata[propName])),propMetadata[propName]=decorators}),propMetadata},ReflectionCapabilities.prototype.ownPropMetadata=function(typeOrFunc){return isType(typeOrFunc)&&this._ownPropMetadata(typeOrFunc,getParentCtor(typeOrFunc))||{}},ReflectionCapabilities.prototype.hasLifecycleHook=function(type,lcProperty){return type instanceof Type&&lcProperty in type.prototype},ReflectionCapabilities.prototype.guards=function(type){return{}},ReflectionCapabilities.prototype.getter=function(name){return new Function("o","return o."+name+";")},ReflectionCapabilities.prototype.setter=function(name){return new Function("o","v","return o."+name+" = v;")},ReflectionCapabilities.prototype.method=function(name){return new Function("o","args","if (!o."+name+") throw new Error('\""+name+"\" is undefined');\n        return o."+name+".apply(o, args);")},ReflectionCapabilities.prototype.importUri=function(type){return"object"==typeof type&&type.filePath?type.filePath:"./"+stringify(type)},ReflectionCapabilities.prototype.resourceUri=function(type){return"./"+stringify(type)},ReflectionCapabilities.prototype.resolveIdentifier=function(name,moduleUrl,members,runtime){return runtime},ReflectionCapabilities.prototype.resolveEnum=function(enumIdentifier,name){return enumIdentifier[name]},ReflectionCapabilities}();function convertTsickleDecoratorIntoMetadata(decoratorInvocations){return decoratorInvocations?decoratorInvocations.map(function(decoratorInvocation){var annotationCls=decoratorInvocation.type.annotationCls,annotationArgs=decoratorInvocation.args?decoratorInvocation.args:[];return new(annotationCls.bind.apply(annotationCls,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],annotationArgs)))}):[]}function getParentCtor(ctor){var parentProto=ctor.prototype?Object.getPrototypeOf(ctor.prototype):null;return(parentProto?parentProto.constructor:null)||Object}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */getClosureSafeProperty({provide:String,useValue:getClosureSafeProperty});
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var USE_VALUE$1=getClosureSafeProperty({provide:String,useValue:getClosureSafeProperty}),EMPTY_ARRAY=[];function convertInjectableProviderToFactory(type,provider){Iif(!provider){var deps_1=(reflectionCapabilities=new ReflectionCapabilities).parameters(type);return function(){return new(type.bind.apply(type,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],injectArgs(deps_1))))}}Iif(USE_VALUE$1 in provider){var valueProvider_1=provider;return function(){return valueProvider_1.useValue}}Iif(provider.useExisting){var existingProvider_1=provider;return function(){return ɵɵinject(existingProvider_1.useExisting)}}Iif(provider.useFactory){var factoryProvider_1=provider;return function(){return factoryProvider_1.useFactory.apply(factoryProvider_1,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(injectArgs(factoryProvider_1.deps||EMPTY_ARRAY)))}}Eif(provider.useClass){var classProvider_1=provider,deps_2=provider.deps;Eif(!deps_2){var reflectionCapabilities=new ReflectionCapabilities;deps_2=reflectionCapabilities.parameters(type)}return function(){var _a;return new((_a=classProvider_1.useClass).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],injectArgs(deps_2))))}}var deps_3=provider.deps;if(!deps_3){reflectionCapabilities=new ReflectionCapabilities;deps_3=reflectionCapabilities.parameters(type)}return function(){return new(type.bind.apply(type,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],injectArgs(deps_3))))}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var Injectable=makeDecorator("Injectable",void 0,void 0,void 0,function(type,meta){return SWITCH_COMPILE_INJECTABLE(type,meta)});var SWITCH_COMPILE_INJECTABLE=function render2CompileInjectable(injectableType,options){options&&void 0!==options.providedIn&&!getInjectableDef(injectableType)&&(injectableType.ngInjectableDef=ɵɵdefineInjectable({providedIn:options.providedIn,factory:convertInjectableProviderToFactory(injectableType,options)}))},InjectionToken=function(){function InjectionToken(_desc,options){this._desc=_desc,this.ngMetadataName="InjectionToken",this.ngInjectableDef=void 0,"number"==typeof options?this.__NG_ELEMENT_ID__=options:void 0!==options&&(this.ngInjectableDef=ɵɵdefineInjectable({providedIn:options.providedIn||"root",factory:options.factory}))}return InjectionToken.prototype.toString=function(){return"InjectionToken "+this._desc},InjectionToken}(),SOURCE="__source",_THROW_IF_NOT_FOUND=new Object,THROW_IF_NOT_FOUND=_THROW_IF_NOT_FOUND,INJECTOR=new InjectionToken("INJECTOR",-1),NullInjector=function(){function NullInjector(){}return NullInjector.prototype.get=function(token,notFoundValue){Iif(void 0===notFoundValue&&(notFoundValue=_THROW_IF_NOT_FOUND),notFoundValue===_THROW_IF_NOT_FOUND){var error=new Error("NullInjectorError: No provider for "+stringify(token)+"!");throw error.name="NullInjectorError",error}return notFoundValue},NullInjector}(),Injector=function(){function Injector(){}return Injector.create=function(options,parent){return Array.isArray(options)?new StaticInjector(options,parent):new StaticInjector(options.providers,options.parent,options.name||null)},Injector.THROW_IF_NOT_FOUND=_THROW_IF_NOT_FOUND,Injector.NULL=new NullInjector,Injector.ngInjectableDef=ɵɵdefineInjectable({providedIn:"any",factory:function(){return ɵɵinject(INJECTOR)}}),Injector.__NG_ELEMENT_ID__=-1,Injector}(),IDENT=function(value){return value},EMPTY=[],CIRCULAR=IDENT,MULTI_PROVIDER_FN=function(){return Array.prototype.slice.call(arguments)},USE_VALUE$2=getClosureSafeProperty({provide:String,useValue:getClosureSafeProperty}),NG_TOKEN_PATH="ngTokenPath",NG_TEMP_TOKEN_PATH="ngTempTokenPath",NEW_LINE=/\n/gm,NO_NEW_LINE="ɵ",StaticInjector=function(){function StaticInjector(providers,parent,source){void 0===parent&&(parent=Injector.NULL),void 0===source&&(source=null),this.parent=parent,this.source=source;var records=this._records=new Map;records.set(Injector,{token:Injector,fn:IDENT,deps:EMPTY,value:this,useNew:!1}),records.set(INJECTOR,{token:INJECTOR,fn:IDENT,deps:EMPTY,value:this,useNew:!1}),function recursivelyProcessProviders(records,provider){Eif(provider)if((provider=resolveForwardRef(provider))instanceof Array)for(var i=0;i<provider.length;i++)recursivelyProcessProviders(records,provider[i]);else{Iif("function"==typeof provider)throw staticError("Function/Class not supported",provider);Iif(!provider||"object"!=typeof provider||!provider.provide)throw staticError("Unexpected provider",provider);var token=resolveForwardRef(provider.provide),resolvedProvider=function resolveProvider(provider){var deps=function computeDeps(provider){var deps=EMPTY,providerDeps=provider.deps;if(providerDeps&&providerDeps.length){deps=[];for(var i=0;i<providerDeps.length;i++){var options=6;if((token=resolveForwardRef(providerDeps[i]))instanceof Array)for(var j=0,annotations=token;j<annotations.length;j++){var annotation=annotations[j];annotation instanceof Optional||annotation==Optional?options|=1:annotation instanceof SkipSelf||annotation==SkipSelf?options&=-3:annotation instanceof Self||annotation==Self?options&=-5:token=annotation instanceof Inject?annotation.token:resolveForwardRef(annotation)}deps.push({token:token,options:options})}}else if(provider.useExisting){var token=resolveForwardRef(provider.useExisting);deps=[{token:token,options:6}]}else Iif(!(providerDeps||USE_VALUE$2 in provider))throw staticError("'deps' required",provider);return deps}(provider),fn=IDENT,value=EMPTY,useNew=!1,provide=resolveForwardRef(provider.provide);if(USE_VALUE$2 in provider)value=provider.useValue;else if(provider.useFactory)fn=provider.useFactory;else if(provider.useExisting);else if(provider.useClass)useNew=!0,fn=resolveForwardRef(provider.useClass);else{Iif("function"!=typeof provide)throw staticError("StaticProvider does not have [useValue|useFactory|useExisting|useClass] or [provide] is not newable",provider);useNew=!0,fn=provide}return{deps:deps,fn:fn,useNew:useNew,value:value}}(provider);if(!0===provider.multi){var multiProvider=records.get(token);if(multiProvider){Iif(multiProvider.fn!==MULTI_PROVIDER_FN)throw multiProviderMixError(token)}else records.set(token,multiProvider={token:provider.provide,deps:[],useNew:!1,fn:MULTI_PROVIDER_FN,value:EMPTY});token=provider,multiProvider.deps.push({token:token,options:6})}var record=records.get(token);Iif(record&&record.fn==MULTI_PROVIDER_FN)throw multiProviderMixError(token);records.set(token,resolvedProvider)}}(records,providers)}return StaticInjector.prototype.get=function(token,notFoundValue,flags){void 0===flags&&(flags=InjectFlags.Default);var record=this._records.get(token);try{return tryResolveToken(token,record,this._records,this.parent,notFoundValue,flags)}catch(e){return catchInjectorError(e,token,"StaticInjectorError",this.source)}},StaticInjector.prototype.toString=function(){var tokens=[];return this._records.forEach(function(v,token){return tokens.push(stringify(token))}),"StaticInjector["+tokens.join(", ")+"]"},StaticInjector}();function multiProviderMixError(token){return staticError("Cannot mix multi providers and regular providers",token)}function tryResolveToken(token,record,records,parent,notFoundValue,flags){try{return function resolveToken(token,record,records,parent,notFoundValue,flags){var _a,value;if(!record||flags&InjectFlags.SkipSelf)flags&InjectFlags.Self||(value=parent.get(token,notFoundValue,InjectFlags.Default));else{Iif((value=record.value)==CIRCULAR)throw Error(NO_NEW_LINE+"Circular dependency");if(value===EMPTY){record.value=CIRCULAR;var useNew=record.useNew,fn=record.fn,depRecords=record.deps,deps=EMPTY;if(depRecords.length){deps=[];for(var i=0;i<depRecords.length;i++){var depRecord=depRecords[i],options=depRecord.options,childRecord=2&options?records.get(depRecord.token):void 0;deps.push(tryResolveToken(depRecord.token,childRecord,records,childRecord||4&options?parent:Injector.NULL,1&options?null:Injector.THROW_IF_NOT_FOUND,InjectFlags.Default))}}record.value=value=useNew?new((_a=fn).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],deps))):fn.apply(void 0,deps)}}return value}(token,record,records,parent,notFoundValue,flags)}catch(e){throw e instanceof Error||(e=new Error(e)),(e[NG_TEMP_TOKEN_PATH]=e[NG_TEMP_TOKEN_PATH]||[]).unshift(token),record&&record.value==CIRCULAR&&(record.value=EMPTY),e}}function catchInjectorError(e,token,injectorErrorName,source){var tokenPath=e[NG_TEMP_TOKEN_PATH];throw token[SOURCE]&&tokenPath.unshift(token[SOURCE]),e.message=formatError("\n"+e.message,tokenPath,injectorErrorName,source),e[NG_TOKEN_PATH]=tokenPath,e[NG_TEMP_TOKEN_PATH]=null,e}function formatError(text,obj,injectorErrorName,source){void 0===source&&(source=null),text=text&&"\n"===text.charAt(0)&&text.charAt(1)==NO_NEW_LINE?text.substr(2):text;var context=stringify(obj);if(obj instanceof Array)context=obj.map(stringify).join(" -> ");else if("object"==typeof obj){var parts=[];for(var key in obj)if(obj.hasOwnProperty(key)){var value=obj[key];parts.push(key+":"+("string"==typeof value?JSON.stringify(value):stringify(value)))}context="{"+parts.join(", ")+"}"}return injectorErrorName+(source?"("+source+")":"")+"["+context+"]: "+text.replace(NEW_LINE,"\n  ")}function staticError(text,obj){return new Error(formatError(text,obj,"StaticInjectorError"))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ERROR_DEBUG_CONTEXT="ngDebugContext",ERROR_ORIGINAL_ERROR="ngOriginalError",ERROR_LOGGER="ngErrorLogger";function constructResolvingPath(keys){return keys.length>1?" ("+
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function findFirstClosedCycle(keys){for(var res=[],i=0;i<keys.length;++i){if(res.indexOf(keys[i])>-1)return res.push(keys[i]),res;res.push(keys[i])}return res}(keys.slice().reverse()).map(function(k){return stringify(k.token)}).join(" -> ")+")":""}function injectionError(injector,key,constructResolvingMessage,originalError){var keys=[key],errMsg=constructResolvingMessage(keys),error=originalError?function wrappedError(message,originalError){var msg=message+" caused by: "+(originalError instanceof Error?originalError.message:originalError),error=Error(msg);return error[ERROR_ORIGINAL_ERROR]=originalError,error}(errMsg,originalError):Error(errMsg);return error.addKey=addKey,error.keys=keys,error.injectors=[injector],error.constructResolvingMessage=constructResolvingMessage,error[ERROR_ORIGINAL_ERROR]=originalError,error}function addKey(injector,key){this.injectors.push(injector),this.keys.push(key),this.message=this.constructResolvingMessage(this.keys)}function noAnnotationError(typeOrFunc,params){for(var signature=[],i=0,ii=params.length;i<ii;i++){var parameter=params[i];parameter&&0!=parameter.length?signature.push(parameter.map(stringify).join(" ")):signature.push("?")}return Error("Cannot resolve all parameters for '"+stringify(typeOrFunc)+"'("+signature.join(", ")+"). Make sure that all the parameters are decorated with Inject or have valid type annotations and that '"+stringify(typeOrFunc)+"' is decorated with Injectable.")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ReflectiveKey=function(){function ReflectiveKey(token,id){Iif(this.token=token,this.id=id,!token)throw new Error("Token must be defined!");this.displayName=stringify(this.token)}return ReflectiveKey.get=function(token){return _globalKeyRegistry.get(resolveForwardRef(token))},Object.defineProperty(ReflectiveKey,"numberOfKeys",{get:function(){return _globalKeyRegistry.numberOfKeys},enumerable:!0,configurable:!0}),ReflectiveKey}(),_globalKeyRegistry=new(function(){function KeyRegistry(){this._allKeys=new Map}return KeyRegistry.prototype.get=function(token){Iif(token instanceof ReflectiveKey)return token;Iif(this._allKeys.has(token))return this._allKeys.get(token);var newKey=new ReflectiveKey(token,ReflectiveKey.numberOfKeys);return this._allKeys.set(token,newKey),newKey},Object.defineProperty(KeyRegistry.prototype,"numberOfKeys",{get:function(){return this._allKeys.size},enumerable:!0,configurable:!0}),KeyRegistry}()),reflector=new(function(){function Reflector(reflectionCapabilities){this.reflectionCapabilities=reflectionCapabilities}return Reflector.prototype.updateCapabilities=function(caps){this.reflectionCapabilities=caps},Reflector.prototype.factory=function(type){return this.reflectionCapabilities.factory(type)},Reflector.prototype.parameters=function(typeOrFunc){return this.reflectionCapabilities.parameters(typeOrFunc)},Reflector.prototype.annotations=function(typeOrFunc){return this.reflectionCapabilities.annotations(typeOrFunc)},Reflector.prototype.propMetadata=function(typeOrFunc){return this.reflectionCapabilities.propMetadata(typeOrFunc)},Reflector.prototype.hasLifecycleHook=function(type,lcProperty){return this.reflectionCapabilities.hasLifecycleHook(type,lcProperty)},Reflector.prototype.getter=function(name){return this.reflectionCapabilities.getter(name)},Reflector.prototype.setter=function(name){return this.reflectionCapabilities.setter(name)},Reflector.prototype.method=function(name){return this.reflectionCapabilities.method(name)},Reflector.prototype.importUri=function(type){return this.reflectionCapabilities.importUri(type)},Reflector.prototype.resourceUri=function(type){return this.reflectionCapabilities.resourceUri(type)},Reflector.prototype.resolveIdentifier=function(name,moduleUrl,members,runtime){return this.reflectionCapabilities.resolveIdentifier(name,moduleUrl,members,runtime)},Reflector.prototype.resolveEnum=function(identifier,name){return this.reflectionCapabilities.resolveEnum(identifier,name)},Reflector}())(new ReflectionCapabilities),ReflectiveDependency=function(){function ReflectiveDependency(key,optional,visibility){this.key=key,this.optional=optional,this.visibility=visibility}return ReflectiveDependency.fromKey=function(key){return new ReflectiveDependency(key,!1,null)},ReflectiveDependency}(),_EMPTY_LIST=[],ResolvedReflectiveProvider_=function ResolvedReflectiveProvider_(key,resolvedFactories,multiProvider){this.key=key,this.resolvedFactories=resolvedFactories,this.multiProvider=multiProvider,this.resolvedFactory=this.resolvedFactories[0]},ResolvedReflectiveFactory=function ResolvedReflectiveFactory(factory,dependencies){this.factory=factory,this.dependencies=dependencies};function resolveReflectiveFactory(provider){var factoryFn,resolvedDeps;if(provider.useClass){var useClass=resolveForwardRef(provider.useClass);factoryFn=reflector.factory(useClass),resolvedDeps=_dependenciesFor(useClass)}else provider.useExisting?(factoryFn=function(aliasInstance){return aliasInstance},resolvedDeps=[ReflectiveDependency.fromKey(ReflectiveKey.get(provider.useExisting))]):provider.useFactory?(factoryFn=provider.useFactory,resolvedDeps=function constructDependencies(typeOrFunc,dependencies){if(dependencies){var params_1=dependencies.map(function(t){return[t]});return dependencies.map(function(t){return _extractToken(typeOrFunc,t,params_1)})}return _dependenciesFor(typeOrFunc)}(provider.useFactory,provider.deps)):(factoryFn=function(){return provider.useValue},resolvedDeps=_EMPTY_LIST);return new ResolvedReflectiveFactory(factoryFn,resolvedDeps)}function resolveReflectiveProvider(provider){return new ResolvedReflectiveProvider_(ReflectiveKey.get(provider.provide),[resolveReflectiveFactory(provider)],provider.multi||!1)}function resolveReflectiveProviders(providers){var resolvedProviderMap=function mergeResolvedReflectiveProviders(providers,normalizedProvidersMap){for(var i=0;i<providers.length;i++){var provider=providers[i],existing=normalizedProvidersMap.get(provider.key.id);if(existing){if(provider.multiProvider!==existing.multiProvider)throw Error("Cannot mix multi providers and regular providers, got: "+existing+" "+provider);if(provider.multiProvider)for(var j=0;j<provider.resolvedFactories.length;j++)existing.resolvedFactories.push(provider.resolvedFactories[j]);else normalizedProvidersMap.set(provider.key.id,provider)}else{var resolvedProvider=void 0;resolvedProvider=provider.multiProvider?new ResolvedReflectiveProvider_(provider.key,provider.resolvedFactories.slice(),provider.multiProvider):provider,normalizedProvidersMap.set(provider.key.id,resolvedProvider)}}return normalizedProvidersMap}(function _normalizeProviders(providers,res){providers.forEach(function(b){if(b instanceof Type)res.push({provide:b,useClass:b});else if(b&&"object"==typeof b&&void 0!==b.provide)res.push(b);else{if(!(b instanceof Array))throw function invalidProviderError(provider){return Error("Invalid provider - only instances of Provider and Type are allowed, got: "+provider)}(b);_normalizeProviders(b,res)}});return res}(providers,[]).map(resolveReflectiveProvider),new Map);return Array.from(resolvedProviderMap.values())}function _dependenciesFor(typeOrFunc){var params=reflector.parameters(typeOrFunc);if(!params)return[];if(params.some(function(p){return null==p}))throw noAnnotationError(typeOrFunc,params);return params.map(function(p){return _extractToken(typeOrFunc,p,params)})}function _extractToken(typeOrFunc,metadata,params){var token=null,optional=!1;if(!Array.isArray(metadata))return _createDependency(metadata instanceof Inject?metadata.token:metadata,optional,null);for(var visibility=null,i=0;i<metadata.length;++i){var paramMetadata=metadata[i];paramMetadata instanceof Type?token=paramMetadata:paramMetadata instanceof Inject?token=paramMetadata.token:paramMetadata instanceof Optional?optional=!0:paramMetadata instanceof Self||paramMetadata instanceof SkipSelf?visibility=paramMetadata:paramMetadata instanceof InjectionToken&&(token=paramMetadata)}if(null!=(token=resolveForwardRef(token)))return _createDependency(token,optional,visibility);throw noAnnotationError(typeOrFunc,params)}function _createDependency(token,optional,visibility){return new ReflectiveDependency(ReflectiveKey.get(token),optional,visibility)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var UNDEFINED=new Object,ReflectiveInjector=function(){function ReflectiveInjector(){}return ReflectiveInjector.resolve=function(providers){return resolveReflectiveProviders(providers)},ReflectiveInjector.resolveAndCreate=function(providers,parent){var ResolvedReflectiveProviders=ReflectiveInjector.resolve(providers);return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders,parent)},ReflectiveInjector.fromResolvedProviders=function(providers,parent){return new ReflectiveInjector_(providers,parent)},ReflectiveInjector}(),ReflectiveInjector_=function(){function ReflectiveInjector_(_providers,_parent){this._constructionCounter=0,this._providers=_providers,this.parent=_parent||null;var len=_providers.length;this.keyIds=new Array(len),this.objs=new Array(len);for(var i=0;i<len;i++)this.keyIds[i]=_providers[i].key.id,this.objs[i]=UNDEFINED}return ReflectiveInjector_.prototype.get=function(token,notFoundValue){return void 0===notFoundValue&&(notFoundValue=THROW_IF_NOT_FOUND),this._getByKey(ReflectiveKey.get(token),null,notFoundValue)},ReflectiveInjector_.prototype.resolveAndCreateChild=function(providers){var ResolvedReflectiveProviders=ReflectiveInjector.resolve(providers);return this.createChildFromResolved(ResolvedReflectiveProviders)},ReflectiveInjector_.prototype.createChildFromResolved=function(providers){var inj=new ReflectiveInjector_(providers);return inj.parent=this,inj},ReflectiveInjector_.prototype.resolveAndInstantiate=function(provider){return this.instantiateResolved(ReflectiveInjector.resolve([provider])[0])},ReflectiveInjector_.prototype.instantiateResolved=function(provider){return this._instantiateProvider(provider)},ReflectiveInjector_.prototype.getProviderAtIndex=function(index){if(index<0||index>=this._providers.length)throw function outOfBoundsError(index){return Error("Index "+index+" is out-of-bounds.")}(index);return this._providers[index]},ReflectiveInjector_.prototype._new=function(provider){if(this._constructionCounter++>this._getMaxNumberOfObjects())throw function cyclicDependencyError(injector,key){return injectionError(injector,key,function(keys){return"Cannot instantiate cyclic dependency!"+constructResolvingPath(keys)})}(this,provider.key);return this._instantiateProvider(provider)},ReflectiveInjector_.prototype._getMaxNumberOfObjects=function(){return this.objs.length},ReflectiveInjector_.prototype._instantiateProvider=function(provider){if(provider.multiProvider){for(var res=new Array(provider.resolvedFactories.length),i=0;i<provider.resolvedFactories.length;++i)res[i]=this._instantiate(provider,provider.resolvedFactories[i]);return res}return this._instantiate(provider,provider.resolvedFactories[0])},ReflectiveInjector_.prototype._instantiate=function(provider,ResolvedReflectiveFactory){var deps,obj,_this=this,factory=ResolvedReflectiveFactory.factory;try{deps=ResolvedReflectiveFactory.dependencies.map(function(dep){return _this._getByReflectiveDependency(dep)})}catch(e){throw e.addKey&&e.addKey(this,provider.key),e}try{obj=factory.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(deps))}catch(e){throw function instantiationError(injector,originalException,originalStack,key){return injectionError(injector,key,function(keys){var first=stringify(keys[0].token);return originalException.message+": Error during instantiation of "+first+"!"+constructResolvingPath(keys)+"."},originalException)}(this,e,e.stack,provider.key)}return obj},ReflectiveInjector_.prototype._getByReflectiveDependency=function(dep){return this._getByKey(dep.key,dep.visibility,dep.optional?null:THROW_IF_NOT_FOUND)},ReflectiveInjector_.prototype._getByKey=function(key,visibility,notFoundValue){return key===ReflectiveInjector_.INJECTOR_KEY?this:visibility instanceof Self?this._getByKeySelf(key,notFoundValue):this._getByKeyDefault(key,notFoundValue,visibility)},ReflectiveInjector_.prototype._getObjByKeyId=function(keyId){for(var i=0;i<this.keyIds.length;i++)if(this.keyIds[i]===keyId)return this.objs[i]===UNDEFINED&&(this.objs[i]=this._new(this._providers[i])),this.objs[i];return UNDEFINED},ReflectiveInjector_.prototype._throwOrNull=function(key,notFoundValue){if(notFoundValue!==THROW_IF_NOT_FOUND)return notFoundValue;throw function noProviderError(injector,key){return injectionError(injector,key,function(keys){return"No provider for "+stringify(keys[0].token)+"!"+constructResolvingPath(keys)})}(this,key)},ReflectiveInjector_.prototype._getByKeySelf=function(key,notFoundValue){var obj=this._getObjByKeyId(key.id);return obj!==UNDEFINED?obj:this._throwOrNull(key,notFoundValue)},ReflectiveInjector_.prototype._getByKeyDefault=function(key,notFoundValue,visibility){var inj;for(inj=visibility instanceof SkipSelf?this.parent:this;inj instanceof ReflectiveInjector_;){var inj_=inj,obj=inj_._getObjByKeyId(key.id);if(obj!==UNDEFINED)return obj;inj=inj_.parent}return null!==inj?inj.get(key.token,notFoundValue):this._throwOrNull(key,notFoundValue)},Object.defineProperty(ReflectiveInjector_.prototype,"displayName",{get:function(){return"ReflectiveInjector(providers: ["+function _mapProviders(injector,fn){for(var res=new Array(injector._providers.length),i=0;i<injector._providers.length;++i)res[i]=fn(injector.getProviderAtIndex(i));return res}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(this,function(b){return' "'+b.key.displayName+'" '}).join(", ")+"])"},enumerable:!0,configurable:!0}),ReflectiveInjector_.prototype.toString=function(){return this.displayName},ReflectiveInjector_.INJECTOR_KEY=ReflectiveKey.get(Injector),ReflectiveInjector_}();var ChangeDetectionStrategy,ChangeDetectorStatus,ANALYZE_FOR_ENTRY_COMPONENTS=new InjectionToken("AnalyzeForEntryComponents"),Query=function Query(){},ViewChild=(makePropDecorator("ContentChildren",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!1,isViewQuery:!1,descendants:!1},data)},Query),makePropDecorator("ContentChild",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!0,isViewQuery:!1,descendants:!0},data)},Query),makePropDecorator("ViewChildren",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!1,isViewQuery:!0,descendants:!0},data)},Query),makePropDecorator("ViewChild",function(selector,data){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!0,isViewQuery:!0,descendants:!0},data)},Query));!function(ChangeDetectionStrategy){ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush=0]="OnPush",ChangeDetectionStrategy[ChangeDetectionStrategy.Default=1]="Default"}(ChangeDetectionStrategy||(ChangeDetectionStrategy={})),function(ChangeDetectorStatus){ChangeDetectorStatus[ChangeDetectorStatus.CheckOnce=0]="CheckOnce",ChangeDetectorStatus[ChangeDetectorStatus.Checked=1]="Checked",ChangeDetectorStatus[ChangeDetectorStatus.CheckAlways=2]="CheckAlways",ChangeDetectorStatus[ChangeDetectorStatus.Detached=3]="Detached",ChangeDetectorStatus[ChangeDetectorStatus.Errored=4]="Errored",ChangeDetectorStatus[ChangeDetectorStatus.Destroyed=5]="Destroyed"}(ChangeDetectorStatus||(ChangeDetectorStatus={}));var ViewEncapsulation;new Map,new Set;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function noSideEffects(fn){return""+{toString:fn}}
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/!function(ViewEncapsulation){ViewEncapsulation[ViewEncapsulation.Emulated=0]="Emulated",ViewEncapsulation[ViewEncapsulation.Native=1]="Native",ViewEncapsulation[ViewEncapsulation.None=2]="None",ViewEncapsulation[ViewEncapsulation.ShadowDom=3]="ShadowDom"}(ViewEncapsulation||(ViewEncapsulation={})),("undefined"==typeof ngDevMode||ngDevMode)&&
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function ngDevModeResetPerfCounters(){var newCounters={firstTemplatePass:0,tNode:0,tView:0,rendererCreateTextNode:0,rendererSetText:0,rendererCreateElement:0,rendererAddEventListener:0,rendererSetAttribute:0,rendererRemoveAttribute:0,rendererSetProperty:0,rendererSetClassName:0,rendererAddClass:0,rendererRemoveClass:0,rendererSetStyle:0,rendererRemoveStyle:0,rendererDestroy:0,rendererDestroyNode:0,rendererMoveNode:0,rendererRemoveNode:0,rendererCreateComment:0,stylingMap:0,stylingMapCacheMiss:0,stylingProp:0,stylingPropCacheMiss:0,stylingApply:0,stylingApplyCacheMiss:0};return _global.ngDevMode=newCounters,newCounters}();var EMPTY_OBJ={},EMPTY_ARRAY$1=[];"undefined"!=typeof ngDevMode&&ngDevMode&&(Object.freeze(EMPTY_OBJ),Object.freeze(EMPTY_ARRAY$1))
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var NG_COMPONENT_DEF=getClosureSafeProperty({ngComponentDef:getClosureSafeProperty}),NG_DIRECTIVE_DEF=getClosureSafeProperty({ngDirectiveDef:getClosureSafeProperty}),NG_PIPE_DEF=getClosureSafeProperty({ngPipeDef:getClosureSafeProperty}),NG_MODULE_DEF=getClosureSafeProperty({ngModuleDef:getClosureSafeProperty}),NG_ELEMENT_ID=(getClosureSafeProperty({ngBaseDef:getClosureSafeProperty}),getClosureSafeProperty({__NG_ELEMENT_ID__:getClosureSafeProperty})),_renderCompCount=0;function ɵɵdefineComponent(componentDefinition){var type=componentDefinition.type,typePrototype=type.prototype,declaredInputs={},def={type:type,providersResolver:null,consts:componentDefinition.consts,vars:componentDefinition.vars,factory:componentDefinition.factory,template:componentDefinition.template||null,ngContentSelectors:componentDefinition.ngContentSelectors,hostBindings:componentDefinition.hostBindings||null,contentQueries:componentDefinition.contentQueries||null,declaredInputs:declaredInputs,inputs:null,outputs:null,exportAs:componentDefinition.exportAs||null,onChanges:null,onInit:typePrototype.ngOnInit||null,doCheck:typePrototype.ngDoCheck||null,afterContentInit:typePrototype.ngAfterContentInit||null,afterContentChecked:typePrototype.ngAfterContentChecked||null,afterViewInit:typePrototype.ngAfterViewInit||null,afterViewChecked:typePrototype.ngAfterViewChecked||null,onDestroy:typePrototype.ngOnDestroy||null,onPush:componentDefinition.changeDetection===ChangeDetectionStrategy.OnPush,directiveDefs:null,pipeDefs:null,selectors:componentDefinition.selectors,viewQuery:componentDefinition.viewQuery||null,features:componentDefinition.features||null,data:componentDefinition.data||{},encapsulation:componentDefinition.encapsulation||ViewEncapsulation.Emulated,id:"c",styles:componentDefinition.styles||EMPTY_ARRAY$1,_:null,setInput:null,schemas:componentDefinition.schemas||null};return def._=noSideEffects(function(){var directiveTypes=componentDefinition.directives,feature=componentDefinition.features,pipeTypes=componentDefinition.pipes;def.id+=_renderCompCount++,def.inputs=invertObject(componentDefinition.inputs,declaredInputs),def.outputs=invertObject(componentDefinition.outputs),feature&&feature.forEach(function(fn){return fn(def)}),def.directiveDefs=directiveTypes?function(){return("function"==typeof directiveTypes?directiveTypes():directiveTypes).map(extractDirectiveDef)}:null,def.pipeDefs=pipeTypes?function(){return("function"==typeof pipeTypes?pipeTypes():pipeTypes).map(extractPipeDef)}:null,type.hasOwnProperty(NG_INJECTABLE_DEF)||(type[NG_INJECTABLE_DEF]=ɵɵdefineInjectable({factory:componentDefinition.factory}))}),def}function extractDirectiveDef(type){var def=getComponentDef(type)||getDirectiveDef(type);if(ngDevMode&&!def)throw new Error("'"+type.name+"' is neither 'ComponentType' or 'DirectiveType'.");return def}function extractPipeDef(type){var def=getPipeDef(type);if(ngDevMode&&!def)throw new Error("'"+type.name+"' is not a 'PipeType'.");return def}function invertObject(obj,secondary){Eif(null==obj)return EMPTY_OBJ;var newLookup={};for(var minifiedKey in obj)if(obj.hasOwnProperty(minifiedKey)){var publicName=obj[minifiedKey],declaredName=publicName;Array.isArray(publicName)&&(declaredName=publicName[1],publicName=publicName[0]),newLookup[publicName]=minifiedKey,secondary&&(secondary[publicName]=declaredName)}return newLookup}var ɵɵdefineDirective=ɵɵdefineComponent;function getComponentDef(type){return type[NG_COMPONENT_DEF]||null}function getDirectiveDef(type){return type[NG_DIRECTIVE_DEF]||null}function getPipeDef(type){return type[NG_PIPE_DEF]||null}function getNgModuleDef(type,throwNotFound){var ngModuleDef=type[NG_MODULE_DEF]||null;if(!ngModuleDef&&!0===throwNotFound)throw new Error("Type "+stringify(type)+" does not have 'ngModuleDef' property.");return ngModuleDef}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function renderStringify(value){return"function"==typeof value?value.name||value:"string"==typeof value?value:null==value?"":""+value}function stringifyForError(value){return"object"==typeof value&&null!=value&&"function"==typeof value.type?value.type.name||value.type:renderStringify(value)}var defaultScheduler=("undefined"!=typeof requestAnimationFrame&&requestAnimationFrame||setTimeout).bind(_global);var INTERPOLATION_DELIMITER="�";function isPropMetadataString(str){return str.indexOf(INTERPOLATION_DELIMITER)>=0}function maybeUnwrapFn(value){return value instanceof Function?value():value}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function assertEqual(actual,expected,msg){actual!=expected&&throwError(msg)}function assertNotEqual(actual,expected,msg){actual==expected&&throwError(msg)}function assertLessThan(actual,expected,msg){actual>=expected&&throwError(msg)}function assertGreaterThan(actual,expected,msg){actual<=expected&&throwError(msg)}function assertDefined(actual,msg){null==actual&&throwError(msg)}function throwError(msg){throw new Error("ASSERTION ERROR: "+msg)}function assertDomNode(node){assertEqual("undefined"!=typeof Node&&node instanceof Node||"object"==typeof node&&"WebWorkerRenderNode"===node.constructor.name,!0,"The provided value must be an instance of a DOM Node")}function assertDataInRange(arr,index){assertLessThan(index,arr?arr.length:0,"index expected to be a valid data index")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var HOST=0,TVIEW=1,FLAGS=2,PARENT=3,NEXT=4,QUERIES=5,T_HOST=6,BINDING_INDEX=7,CLEANUP=8,CONTEXT=9,INJECTOR$1=10,RENDERER_FACTORY=11,RENDERER=12,SANITIZER=13,CHILD_HEAD=14,CHILD_TAIL=15,CONTENT_QUERIES=16,DECLARATION_VIEW=17,PREORDER_HOOK_FLAGS=18,HEADER_OFFSET=20,TYPE=1,ACTIVE_INDEX=2,NATIVE=7,VIEWS=8,MONKEY_PATCH_KEY_NAME="__ngContext__";
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function unwrapRNode(value){for(;Array.isArray(value);)value=value[HOST];return value}function isLView(value){return Array.isArray(value)&&"object"==typeof value[TYPE]}function isLContainer(value){return Array.isArray(value)&&!0===value[TYPE]}function getNativeByTNode(tNode,hostView){return unwrapRNode(hostView[tNode.index])}function getTNode(index,view){return ngDevMode&&assertGreaterThan(index,-1,"wrong index for TNode"),ngDevMode&&assertLessThan(index,view[TVIEW].data.length,"wrong index for TNode"),view[TVIEW].data[index+HEADER_OFFSET]}function getComponentViewByIndex(nodeIndex,hostView){var slotValue=hostView[nodeIndex];return isLView(slotValue)?slotValue:slotValue[HOST]}function isComponent(tNode){return 1==(1&tNode.flags)}function isComponentDef(def){return null!==def.template}function isRootView(target){return 0!=(512&target[FLAGS])}function readPatchedData(target){return ngDevMode&&assertDefined(target,"Target expected"),target[MONKEY_PATCH_KEY_NAME]}function readPatchedLView(target){var value=readPatchedData(target);return value?Array.isArray(value)?value:value.lView:null}function viewAttachedToContainer(view){return isLContainer(view[PARENT])}function resetPreOrderHookFlags(lView){lView[PREORDER_HOOK_FLAGS]=0}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function assertComponentType(actual,msg){void 0===msg&&(msg="Type passed in is not ComponentType, it does not have 'ngComponentDef' property."),getComponentDef(actual)||throwError(msg)}function assertPreviousIsParent(isParent){assertEqual(isParent,!0,"previousOrParentTNode should be a parent")}function assertLContainer(value){assertDefined(value,"LContainer must be defined"),assertEqual(isLContainer(value),!0,"Expecting LContainer")}function assertLViewOrUndefined(value){value&&assertEqual(isLView(value),!0,"Expecting LView or undefined or null")}function assertLView(value){assertDefined(value,"LView must be defined"),assertEqual(isLView(value),!0,"Expecting LView")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var TNODE=8,PARENT_INJECTOR=8,INJECTOR_BLOOM_PARENT_SIZE=9,NO_PARENT_INJECTOR=-1,NodeInjectorFactory=function NodeInjectorFactory(factory,isViewProvider,injectImplementation){this.factory=factory,this.resolving=!1,this.canSeeViewProviders=isViewProvider,this.injectImpl=injectImplementation};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function assertNodeType(tNode,type){assertDefined(tNode,"should be called with a TNode"),assertEqual(tNode.type,type,"should be a "+typeName(type))}function assertNodeOfPossibleTypes(tNode){for(var types=[],_i=1;_i<arguments.length;_i++)types[_i-1]=arguments[_i];assertDefined(tNode,"should be called with a TNode"),assertEqual(types.some(function(type){return tNode.type===type}),!0,"Should be one of "+types.map(typeName).join(", ")+" but got "+typeName(tNode.type))}function typeName(type){return 1==type?"Projection":0==type?"Container":2==type?"View":3==type?"Element":4==type?"ElementContainer":"<unknown>"}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function registerPreOrderHooks(directiveIndex,directiveDef,tView,nodeIndex,initialPreOrderHooksLength,initialPreOrderCheckHooksLength){ngDevMode&&assertEqual(tView.firstTemplatePass,!0,"Should only be called on first template pass");var onChanges=directiveDef.onChanges,onInit=directiveDef.onInit,doCheck=directiveDef.doCheck;initialPreOrderHooksLength>=0&&(!tView.preOrderHooks||initialPreOrderHooksLength===tView.preOrderHooks.length)&&(onChanges||onInit||doCheck)&&(tView.preOrderHooks||(tView.preOrderHooks=[])).push(nodeIndex),initialPreOrderCheckHooksLength>=0&&(!tView.preOrderCheckHooks||initialPreOrderCheckHooksLength===tView.preOrderCheckHooks.length)&&(onChanges||doCheck)&&(tView.preOrderCheckHooks||(tView.preOrderCheckHooks=[])).push(nodeIndex),onChanges&&((tView.preOrderHooks||(tView.preOrderHooks=[])).push(directiveIndex,onChanges),(tView.preOrderCheckHooks||(tView.preOrderCheckHooks=[])).push(directiveIndex,onChanges)),onInit&&(tView.preOrderHooks||(tView.preOrderHooks=[])).push(-directiveIndex,onInit),doCheck&&((tView.preOrderHooks||(tView.preOrderHooks=[])).push(directiveIndex,doCheck),(tView.preOrderCheckHooks||(tView.preOrderCheckHooks=[])).push(directiveIndex,doCheck))}function registerPostOrderHooks(tView,tNode){if(tView.firstTemplatePass)for(var i=tNode.directiveStart,end=tNode.directiveEnd;i<end;i++){var directiveDef=tView.data[i];directiveDef.afterContentInit&&(tView.contentHooks||(tView.contentHooks=[])).push(-i,directiveDef.afterContentInit),directiveDef.afterContentChecked&&((tView.contentHooks||(tView.contentHooks=[])).push(i,directiveDef.afterContentChecked),(tView.contentCheckHooks||(tView.contentCheckHooks=[])).push(i,directiveDef.afterContentChecked)),directiveDef.afterViewInit&&(tView.viewHooks||(tView.viewHooks=[])).push(-i,directiveDef.afterViewInit),directiveDef.afterViewChecked&&((tView.viewHooks||(tView.viewHooks=[])).push(i,directiveDef.afterViewChecked),(tView.viewCheckHooks||(tView.viewCheckHooks=[])).push(i,directiveDef.afterViewChecked)),null!=directiveDef.onDestroy&&(tView.destroyHooks||(tView.destroyHooks=[])).push(i,directiveDef.onDestroy)}}function executePreOrderHooks(currentView,tView,checkNoChangesMode,currentNodeIndex){checkNoChangesMode||executeHooks(currentView,tView.preOrderHooks,tView.preOrderCheckHooks,checkNoChangesMode,0,void 0!==currentNodeIndex?currentNodeIndex:null)}function executeHooks(currentView,firstPassHooks,checkHooks,checkNoChangesMode,initPhaseState,currentNodeIndex){if(!checkNoChangesMode){var hooksToCall=(3&currentView[FLAGS])===initPhaseState?firstPassHooks:checkHooks;hooksToCall&&function callHooks(currentView,arr,initPhase,currentNodeIndex){for(var startIndex=void 0!==currentNodeIndex?65535&currentView[PREORDER_HOOK_FLAGS]:0,nodeIndexLimit=null!=currentNodeIndex?currentNodeIndex:-1,lastNodeIndexFound=0,i=startIndex;i<arr.length;i++){if("number"==typeof arr[i+1]){if(lastNodeIndexFound=arr[i],null!=currentNodeIndex&&lastNodeIndexFound>=currentNodeIndex)break}else arr[i]<0&&(currentView[PREORDER_HOOK_FLAGS]+=65536),(lastNodeIndexFound<nodeIndexLimit||-1==nodeIndexLimit)&&(callHook(currentView,initPhase,arr,i),currentView[PREORDER_HOOK_FLAGS]=(4294901760&currentView[PREORDER_HOOK_FLAGS])+i+2),i++}}(currentView,hooksToCall,initPhaseState,currentNodeIndex),null==currentNodeIndex&&(3&currentView[FLAGS])===initPhaseState&&3!==initPhaseState&&(currentView[FLAGS]&=1023,currentView[FLAGS]+=1)}}function callHook(currentView,initPhase,arr,i){var isInitHook=arr[i]<0,hook=arr[i+1],directive=currentView[isInitHook?-arr[i]:arr[i]];isInitHook?currentView[FLAGS]>>10<currentView[PREORDER_HOOK_FLAGS]>>16&&(3&currentView[FLAGS])===initPhase&&(currentView[FLAGS]+=1024,hook.call(directive)):hook.call(directive)}var stylingContext=null;function setCachedStylingContext(context){stylingContext=context}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function setCurrentDirectiveDef(def){def}function getLView(){return lView}var previousOrParentTNode,isParent,lView,MIN_DIRECTIVE_ID=1,activeDirectiveId=MIN_DIRECTIVE_ID,activeDirectiveSuperClassDepthPosition=0,activeDirectiveSuperClassHeight=0;function setActiveHostElement(elementIndex){void 0===elementIndex&&(elementIndex=null),_selectedIndex!==elementIndex&&(setSelectedIndex(null==elementIndex?-1:elementIndex),activeDirectiveId=MIN_DIRECTIVE_ID,activeDirectiveSuperClassDepthPosition=0,activeDirectiveSuperClassHeight=0)}function incrementActiveDirectiveId(){activeDirectiveId+=1+activeDirectiveSuperClassHeight,activeDirectiveSuperClassDepthPosition=0,activeDirectiveSuperClassHeight=0}function getPreviousOrParentTNode(){return previousOrParentTNode}function setPreviousOrParentTNode(tNode){previousOrParentTNode=tNode}function setTNodeAndViewData(tNode,view){ngDevMode&&assertLViewOrUndefined(view),previousOrParentTNode=tNode,lView=view}function getIsParent(){return isParent}function setIsParent(value){isParent=value}function isCreationMode(view){return void 0===view&&(view=lView),4==(4&view[FLAGS])}var checkNoChangesMode=!1;function getCheckNoChangesMode(){return checkNoChangesMode}function setCheckNoChangesMode(mode){checkNoChangesMode=mode}function setBindingRoot(value){value}function setCurrentQueryIndex(value){value}function enterView(newView,hostTNode){ngDevMode&&assertLViewOrUndefined(newView);var oldView=lView;if(newView){var tView=newView[TVIEW];tView.bindingStartIndex}return previousOrParentTNode=hostTNode,isParent=!0,lView=newView,oldView}function leaveView(newView){var tView=lView[TVIEW];if(isCreationMode(lView))lView[FLAGS]&=-5;else try{resetPreOrderHookFlags(lView),executeHooks(lView,tView.viewHooks,tView.viewCheckHooks,checkNoChangesMode,2,void 0)}finally{lView[FLAGS]&=-73,lView[BINDING_INDEX]=tView.bindingStartIndex}setCachedStylingContext(null),enterView(newView,null)}var _selectedIndex=-1;function getSelectedIndex(){return _selectedIndex}function setSelectedIndex(index){_selectedIndex=index,setCachedStylingContext(null)}var RendererStyleFlags3,_currentNamespace=null;function ɵɵnamespaceHTML(){_currentNamespace=null}function isProceduralRenderer(renderer){return!!renderer.listen}!function(RendererStyleFlags3){RendererStyleFlags3[RendererStyleFlags3.Important=1]="Important",RendererStyleFlags3[RendererStyleFlags3.DashCase=2]="DashCase"}(RendererStyleFlags3||(RendererStyleFlags3={}));var domRendererFactory3={createRenderer:function(hostElement,rendererType){return document}};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function getLContext(target){var mpValue=readPatchedData(target);if(mpValue){if(Array.isArray(mpValue)){var lView=mpValue,nodeIndex=void 0,component=void 0,directives=void 0;if(function isComponentInstance(instance){return instance&&instance.constructor&&instance.constructor.ngComponentDef}(target)){if(-1==(nodeIndex=findViaComponent(lView,target)))throw new Error("The provided component was not found in the application");component=target}else if(function isDirectiveInstance(instance){return instance&&instance.constructor&&instance.constructor.ngDirectiveDef}(target)){if(-1==(nodeIndex=function findViaDirective(lView,directiveInstance){var tNode=lView[TVIEW].firstChild;for(;tNode;){for(var directiveIndexStart=tNode.directiveStart,directiveIndexEnd=tNode.directiveEnd,i=directiveIndexStart;i<directiveIndexEnd;i++)if(lView[i]===directiveInstance)return tNode.index;tNode=traverseNextElement(tNode)}return-1}(lView,target)))throw new Error("The provided directive was not found in the application");directives=getDirectivesAtNodeIndex(nodeIndex,lView,!1)}else if(-1==(nodeIndex=findViaNativeElement(lView,target)))return null;var existingCtx=readPatchedData(native=unwrapRNode(lView[nodeIndex])),context=existingCtx&&!Array.isArray(existingCtx)?existingCtx:createLContext(lView,nodeIndex,native);if(component&&void 0===context.component&&(context.component=component,attachPatchData(context.component,context)),directives&&void 0===context.directives){context.directives=directives;for(var i=0;i<directives.length;i++)attachPatchData(directives[i],context)}attachPatchData(context.native,context),mpValue=context}}else{var rElement=target;ngDevMode&&assertDomNode(rElement);for(var parent_1=rElement;parent_1=parent_1.parentNode;){var parentContext=readPatchedData(parent_1);if(parentContext){lView=void 0;if(!(lView=Array.isArray(parentContext)?parentContext:parentContext.lView))return null;var index=findViaNativeElement(lView,rElement);if(index>=0){var native;attachPatchData(native=unwrapRNode(lView[index]),context=createLContext(lView,index,native)),mpValue=context;break}}}}return mpValue||null}function createLContext(lView,nodeIndex,native){return{lView:lView,nodeIndex:nodeIndex,native:native,component:void 0,directives:void 0,localRefs:void 0}}function attachPatchData(target,data){target[MONKEY_PATCH_KEY_NAME]=data}function findViaNativeElement(lView,target){for(var tNode=lView[TVIEW].firstChild;tNode;){if(getNativeByTNode(tNode,lView)===target)return tNode.index;tNode=traverseNextElement(tNode)}return-1}function traverseNextElement(tNode){if(tNode.child)return tNode.child;if(tNode.next)return tNode.next;for(;tNode.parent&&!tNode.parent.next;)tNode=tNode.parent;return tNode.parent&&tNode.parent.next}function findViaComponent(lView,componentInstance){var componentIndices=lView[TVIEW].components;if(componentIndices)for(var i=0;i<componentIndices.length;i++){var elementComponentIndex=componentIndices[i];if(getComponentViewByIndex(elementComponentIndex,lView)[CONTEXT]===componentInstance)return elementComponentIndex}else if(getComponentViewByIndex(HEADER_OFFSET,lView)[CONTEXT]===componentInstance)return HEADER_OFFSET;return-1}function getDirectivesAtNodeIndex(nodeIndex,lView,includeComponents){var tNode=lView[TVIEW].data[nodeIndex],directiveStartIndex=tNode.directiveStart;if(0==directiveStartIndex)return EMPTY_ARRAY$1;var directiveEndIndex=tNode.directiveEnd;return!includeComponents&&1&tNode.flags&&directiveStartIndex++,lView.slice(directiveStartIndex,directiveEndIndex)}var CorePlayerHandler=function(){function CorePlayerHandler(){this._players=[]}return CorePlayerHandler.prototype.flushPlayers=function(){for(var i=0;i<this._players.length;i++){var player=this._players[i];player.parent||0!==player.state||player.play()}this._players.length=0},CorePlayerHandler.prototype.queuePlayer=function(player){this._players.push(player)},CorePlayerHandler}(),DEFAULT_TEMPLATE_DIRECTIVE_INDEX=0;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function createEmptyStylingContext(wrappedElement,sanitizer,initialStyles,initialClasses){var context=[wrappedElement||null,0,[],initialStyles||[null,null],initialClasses||[null,null],[0,0],[0],[0],null,null];return allocateOrUpdateDirectiveIntoContext(context,DEFAULT_TEMPLATE_DIRECTIVE_INDEX),context}function allocateOrUpdateDirectiveIntoContext(context,directiveIndex,singlePropValuesIndex,styleSanitizer){void 0===singlePropValuesIndex&&(singlePropValuesIndex=-1);for(var directiveRegistry=context[2],index=2*directiveIndex,limit=index+2,i=directiveRegistry.length;i<limit;i+=2)directiveRegistry.push(-1,null);var propValuesStartPosition=index+0;singlePropValuesIndex>=0&&-1===directiveRegistry[propValuesStartPosition]&&(directiveRegistry[propValuesStartPosition]=singlePropValuesIndex,directiveRegistry[index+1]=styleSanitizer||null)}function getStylingContextFromLView(index,viewData){for(var storageIndex=index,slotValue=viewData[storageIndex],wrapper=viewData;Array.isArray(slotValue);)wrapper=slotValue,slotValue=slotValue[HOST];if(function isStylingContext(value){return Array.isArray(value)&&"number"==typeof value[TYPE]}(wrapper))return wrapper;var stylingTemplate=getTNode(index-HEADER_OFFSET,viewData).stylingTemplate;return wrapper!==viewData&&(storageIndex=HOST),wrapper[storageIndex]=stylingTemplate?function allocStylingContext(element,templateStyleContext){for(var context=templateStyleContext.slice(),i=0;i<10;i++){var value=templateStyleContext[i];Array.isArray(value)&&(context[i]=value.slice())}return context[0]=element,context[1]|=16,context}(slotValue,stylingTemplate):createEmptyStylingContext(slotValue)}function addPlayerInternal(playerContext,rootContext,element,player,playerContextIndex,ref){return ref=ref||element,playerContextIndex?playerContext[playerContextIndex]=player:playerContext.push(player),!!player&&(player.addEventListener(200,function(){var index=playerContext.indexOf(player),nonFactoryPlayerIndex=playerContext[0];index&&(index<nonFactoryPlayerIndex?playerContext[index]=null:playerContext.splice(index,1)),player.destroy()}),(rootContext.playerHandler||(rootContext.playerHandler=new CorePlayerHandler)).queuePlayer(player,ref),!0)}function getPlayerContext(stylingContext){return stylingContext[9]}function allocPlayerContext(data){return data[9]=[5,null,null,null,null]}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function hasParentInjector(parentLocation){return parentLocation!==NO_PARENT_INJECTOR}function getParentInjectorIndex(parentLocation){return 32767&parentLocation}function getParentInjectorViewOffset(parentLocation){return parentLocation>>16}function getParentInjectorView(location,startView){for(var viewOffset=getParentInjectorViewOffset(location),parentView=startView;viewOffset>0;)parentView=parentView[DECLARATION_VIEW],viewOffset--;return parentView}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function getLViewParent(lView){ngDevMode&&assertLView(lView);var parent=lView[PARENT];return isLContainer(parent)?parent[PARENT]:parent}function findComponentView(lView){for(var rootTNode=lView[T_HOST];rootTNode&&2===rootTNode.type;)ngDevMode&&assertDefined(lView[DECLARATION_VIEW],"lView[DECLARATION_VIEW]"),rootTNode=(lView=lView[DECLARATION_VIEW])[T_HOST];return ngDevMode&&assertLView(lView),lView}function getRootContext(viewOrComponent){var rootView=function getRootView(componentOrLView){ngDevMode&&assertDefined(componentOrLView,"component");for(var lView=isLView(componentOrLView)?componentOrLView:readPatchedLView(componentOrLView);lView&&!(512&lView[FLAGS]);)lView=getLViewParent(lView);return ngDevMode&&assertLView(lView),lView}(viewOrComponent);return ngDevMode&&assertDefined(rootView[CONTEXT],"RootView has no context. Perhaps it is disconnected?"),rootView[CONTEXT]}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var includeViewProviders=!0;function setIncludeViewProviders(v){var oldValue=includeViewProviders;return includeViewProviders=v,oldValue}var BLOOM_MASK=255,nextNgElementId=0;function getOrCreateNodeInjectorForNode(tNode,hostView){var existingInjectorIndex=getInjectorIndex(tNode,hostView);if(-1!==existingInjectorIndex)return existingInjectorIndex;var tView=hostView[TVIEW];tView.firstTemplatePass&&(tNode.injectorIndex=hostView.length,insertBloom(tView.data,tNode),insertBloom(hostView,null),insertBloom(tView.blueprint,null),ngDevMode&&assertEqual(0===tNode.flags||1===tNode.flags,!0,"expected tNode.flags to not be initialized"));var parentLoc=getParentInjectorLocation(tNode,hostView),parentIndex=getParentInjectorIndex(parentLoc),parentLView=getParentInjectorView(parentLoc,hostView),injectorIndex=tNode.injectorIndex;if(hasParentInjector(parentLoc))for(var parentData=parentLView[TVIEW].data,i=0;i<8;i++)hostView[injectorIndex+i]=parentLView[parentIndex+i]|parentData[parentIndex+i];return hostView[injectorIndex+PARENT_INJECTOR]=parentLoc,injectorIndex}function insertBloom(arr,footer){arr.push(0,0,0,0,0,0,0,0,footer)}function getInjectorIndex(tNode,hostView){return-1===tNode.injectorIndex||tNode.parent&&tNode.parent.injectorIndex===tNode.injectorIndex||null==hostView[tNode.injectorIndex+PARENT_INJECTOR]?-1:tNode.injectorIndex}function getParentInjectorLocation(tNode,view){if(tNode.parent&&-1!==tNode.parent.injectorIndex)return tNode.parent.injectorIndex;for(var hostTNode=view[T_HOST],viewOffset=1;hostTNode&&-1===hostTNode.injectorIndex;)hostTNode=(view=view[DECLARATION_VIEW])?view[T_HOST]:null,viewOffset++;return hostTNode?hostTNode.injectorIndex|viewOffset<<16:-1}function diPublicInInjector(injectorIndex,view,token){!function bloomAdd(injectorIndex,tView,type){ngDevMode&&assertEqual(tView.firstTemplatePass,!0,"expected firstTemplatePass to be true");var id="string"!=typeof type?type[NG_ELEMENT_ID]:type.charCodeAt(0)||0;null==id&&(id=type[NG_ELEMENT_ID]=nextNgElementId++);var bloomBit=id&BLOOM_MASK,mask=1<<bloomBit,b7=128&bloomBit,b6=64&bloomBit,b5=32&bloomBit,tData=tView.data;b7?b6?b5?tData[injectorIndex+7]|=mask:tData[injectorIndex+6]|=mask:b5?tData[injectorIndex+5]|=mask:tData[injectorIndex+4]|=mask:b6?b5?tData[injectorIndex+3]|=mask:tData[injectorIndex+2]|=mask:b5?tData[injectorIndex+1]|=mask:tData[injectorIndex]|=mask}(injectorIndex,view[TVIEW],token)}function getOrCreateInjectable(tNode,lView,token,flags,notFoundValue){if(void 0===flags&&(flags=InjectFlags.Default),tNode){var bloomHash=function bloomHashBitOrFactory(token){if(ngDevMode&&assertDefined(token,"token must be defined"),"string"==typeof token)return token.charCodeAt(0)||0;var tokenId=token[NG_ELEMENT_ID];return"number"==typeof tokenId&&tokenId>0?tokenId&BLOOM_MASK:tokenId}(token);if("function"==typeof bloomHash){var savePreviousOrParentTNode=getPreviousOrParentTNode(),saveLView=getLView();setTNodeAndViewData(tNode,lView);try{var value=bloomHash();if(null!=value||flags&InjectFlags.Optional)return value;throw new Error("No provider for "+stringifyForError(token)+"!")}finally{setTNodeAndViewData(savePreviousOrParentTNode,saveLView)}}else if("number"==typeof bloomHash){if(-1===bloomHash)return new NodeInjector(tNode,lView);var previousTView=null,injectorIndex=getInjectorIndex(tNode,lView),parentLocation=NO_PARENT_INJECTOR,hostTElementNode=flags&InjectFlags.Host?findComponentView(lView)[T_HOST]:null;for((-1===injectorIndex||flags&InjectFlags.SkipSelf)&&(parentLocation=-1===injectorIndex?getParentInjectorLocation(tNode,lView):lView[injectorIndex+PARENT_INJECTOR],shouldSearchParent(flags,!1)?(previousTView=lView[TVIEW],injectorIndex=getParentInjectorIndex(parentLocation),lView=getParentInjectorView(parentLocation,lView)):injectorIndex=-1);-1!==injectorIndex;){parentLocation=lView[injectorIndex+PARENT_INJECTOR];var tView=lView[TVIEW];if(bloomHasToken(bloomHash,injectorIndex,tView.data)){var instance=searchTokensOnInjector(injectorIndex,lView,token,previousTView,flags,hostTElementNode);if(instance!==NOT_FOUND)return instance}shouldSearchParent(flags,lView[TVIEW].data[injectorIndex+TNODE]===hostTElementNode)&&bloomHasToken(bloomHash,injectorIndex,lView)?(previousTView=tView,injectorIndex=getParentInjectorIndex(parentLocation),lView=getParentInjectorView(parentLocation,lView)):injectorIndex=-1}}}if(flags&InjectFlags.Optional&&void 0===notFoundValue&&(notFoundValue=null),0==(flags&(InjectFlags.Self|InjectFlags.Host))){var moduleInjector=lView[INJECTOR$1],previousInjectImplementation=setInjectImplementation(void 0);try{return moduleInjector?moduleInjector.get(token,notFoundValue,flags&InjectFlags.Optional):injectRootLimpMode(token,notFoundValue,flags&InjectFlags.Optional)}finally{setInjectImplementation(previousInjectImplementation)}}if(flags&InjectFlags.Optional)return notFoundValue;throw new Error("NodeInjector: NOT_FOUND ["+stringifyForError(token)+"]")}var NOT_FOUND={};function searchTokensOnInjector(injectorIndex,lView,token,previousTView,flags,hostTElementNode){var currentTView=lView[TVIEW],tNode=currentTView.data[injectorIndex+TNODE],injectableIdx=locateDirectiveOrProvider(tNode,lView,token,null==previousTView?isComponent(tNode)&&includeViewProviders:previousTView!=currentTView&&3===tNode.type,flags&InjectFlags.Host&&hostTElementNode===tNode);return null!==injectableIdx?getNodeInjectable(currentTView.data,lView,injectableIdx,tNode):NOT_FOUND}function locateDirectiveOrProvider(tNode,lView,token,canAccessViewProviders,isHostSpecialCase){for(var tView=lView[TVIEW],nodeProviderIndexes=tNode.providerIndexes,tInjectables=tView.data,injectablesStart=65535&nodeProviderIndexes,directivesStart=tNode.directiveStart,directiveEnd=tNode.directiveEnd,cptViewProvidersCount=nodeProviderIndexes>>16,endIndex=isHostSpecialCase?injectablesStart+cptViewProvidersCount:directiveEnd,i=canAccessViewProviders?injectablesStart:injectablesStart+cptViewProvidersCount;i<endIndex;i++){var providerTokenOrDef=tInjectables[i];if(i<directivesStart&&token===providerTokenOrDef||i>=directivesStart&&providerTokenOrDef.type===token)return i}if(isHostSpecialCase){var dirDef=tInjectables[directivesStart];if(dirDef&&isComponentDef(dirDef)&&dirDef.type===token)return directivesStart}return null}function getNodeInjectable(tData,lData,index,tNode){var value=lData[index];if(function isFactory(obj){return null!==obj&&"object"==typeof obj&&Object.getPrototypeOf(obj)==NodeInjectorFactory.prototype}(value)){var factory=value;if(factory.resolving)throw new Error("Circular dep for "+stringifyForError(tData[index]));var previousIncludeViewProviders=setIncludeViewProviders(factory.canSeeViewProviders);factory.resolving=!0;var previousInjectImplementation=void 0;factory.injectImpl&&(previousInjectImplementation=setInjectImplementation(factory.injectImpl));var savePreviousOrParentTNode=getPreviousOrParentTNode(),saveLView=getLView();setTNodeAndViewData(tNode,lData);try{value=lData[index]=factory.factory(null,tData,lData,tNode)}finally{factory.injectImpl&&setInjectImplementation(previousInjectImplementation),setIncludeViewProviders(previousIncludeViewProviders),factory.resolving=!1,setTNodeAndViewData(savePreviousOrParentTNode,saveLView)}}return value}function bloomHasToken(bloomHash,injectorIndex,injectorView){var mask=1<<bloomHash,b6=64&bloomHash,b5=32&bloomHash;return!!((128&bloomHash?b6?b5?injectorView[injectorIndex+7]:injectorView[injectorIndex+6]:b5?injectorView[injectorIndex+5]:injectorView[injectorIndex+4]:b6?b5?injectorView[injectorIndex+3]:injectorView[injectorIndex+2]:b5?injectorView[injectorIndex+1]:injectorView[injectorIndex])&mask)}function shouldSearchParent(flags,isFirstHostTNode){return!(flags&InjectFlags.Self||flags&InjectFlags.Host&&isFirstHostTNode)}var NodeInjector=function(){function NodeInjector(_tNode,_lView){this._tNode=_tNode,this._lView=_lView}return NodeInjector.prototype.get=function(token,notFoundValue){return getOrCreateInjectable(this._tNode,this._lView,token,void 0,notFoundValue)},NodeInjector}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function getDebugContext(error){return error[ERROR_DEBUG_CONTEXT]}function getOriginalError(error){return error[ERROR_ORIGINAL_ERROR]}function defaultErrorLogger(console){for(var values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];console.error.apply(console,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(values))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ErrorHandler=function(){function ErrorHandler(){this._console=console}return ErrorHandler.prototype.handleError=function(error){var originalError=this._findOriginalError(error),context=this._findContext(error),errorLogger=function getErrorLogger(error){return error[ERROR_LOGGER]||defaultErrorLogger}(error);errorLogger(this._console,"ERROR",error),originalError&&errorLogger(this._console,"ORIGINAL ERROR",originalError),context&&errorLogger(this._console,"ERROR CONTEXT",context)},ErrorHandler.prototype._findContext=function(error){return error?getDebugContext(error)?getDebugContext(error):this._findContext(getOriginalError(error)):null},ErrorHandler.prototype._findOriginalError=function(error){for(var e=getOriginalError(error);e&&getOriginalError(e);)e=getOriginalError(e);return e},ErrorHandler}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var _devMode=!0,_runModeLocked=!1;function isDevMode(){return _runModeLocked=!0,_devMode}function enableProdMode(){Iif(_runModeLocked)throw new Error("Cannot enable prod mode after platform setup.");_devMode=!1}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var InertBodyHelper=function(){function InertBodyHelper(defaultDoc){if(this.defaultDoc=defaultDoc,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert"),this.inertBodyElement=this.inertDocument.body,null==this.inertBodyElement){var inertHtml=this.inertDocument.createElement("html");this.inertDocument.appendChild(inertHtml),this.inertBodyElement=this.inertDocument.createElement("body"),inertHtml.appendChild(this.inertBodyElement)}this.inertBodyElement.innerHTML='<svg><g onload="this.parentNode.remove()"></g></svg>',!this.inertBodyElement.querySelector||this.inertBodyElement.querySelector("svg")?(this.inertBodyElement.innerHTML='<svg><p><style><img src="</style><img src=x onerror=alert(1)//">',this.inertBodyElement.querySelector&&this.inertBodyElement.querySelector("svg img")&&function isDOMParserAvailable(){try{return!!window.DOMParser}catch(_a){return!1}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */()?this.getInertBodyElement=this.getInertBodyElement_DOMParser:this.getInertBodyElement=this.getInertBodyElement_InertDocument):this.getInertBodyElement=this.getInertBodyElement_XHR}return InertBodyHelper.prototype.getInertBodyElement_XHR=function(html){html="<body><remove></remove>"+html+"</body>";try{html=encodeURI(html)}catch(_a){return null}var xhr=new XMLHttpRequest;xhr.responseType="document",xhr.open("GET","data:text/html;charset=utf-8,"+html,!1),xhr.send(void 0);var body=xhr.response.body;return body.removeChild(body.firstChild),body},InertBodyHelper.prototype.getInertBodyElement_DOMParser=function(html){html="<body><remove></remove>"+html+"</body>";try{var body=(new window.DOMParser).parseFromString(html,"text/html").body;return body.removeChild(body.firstChild),body}catch(_a){return null}},InertBodyHelper.prototype.getInertBodyElement_InertDocument=function(html){var templateEl=this.inertDocument.createElement("template");return"content"in templateEl?(templateEl.innerHTML=html,templateEl):(this.inertBodyElement.innerHTML=html,this.defaultDoc.documentMode&&this.stripCustomNsAttrs(this.inertBodyElement),this.inertBodyElement)},InertBodyHelper.prototype.stripCustomNsAttrs=function(el){for(var elAttrs=el.attributes,i=elAttrs.length-1;0<i;i--){var attrName=elAttrs.item(i).name;"xmlns:ns1"!==attrName&&0!==attrName.indexOf("ns1:")||el.removeAttribute(attrName)}for(var childNode=el.firstChild;childNode;)childNode.nodeType===Node.ELEMENT_NODE&&this.stripCustomNsAttrs(childNode),childNode=childNode.nextSibling},InertBodyHelper}();var SAFE_URL_PATTERN=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:\/?#]*(?:[\/?#]|$))/gi,DATA_URL_PATTERN=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function _sanitizeUrl(url){return(url=String(url)).match(SAFE_URL_PATTERN)||url.match(DATA_URL_PATTERN)?url:(isDevMode()&&console.warn("WARNING: sanitizing unsafe URL value "+url+" (see http://g.co/ng/security#xss)"),"unsafe:"+url)}function sanitizeSrcset(srcset){return(srcset=String(srcset)).split(",").map(function(srcset){return _sanitizeUrl(srcset.trim())}).join(", ")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function tagSet(tags){var e_1,_a,res={};try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(tags.split(",")),_c=_b.next();!_c.done;_c=_b.next()){res[_c.value]=!0}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{Iif(e_1)throw e_1.error}}return res}function merge(){for(var e_2,_a,sets=[],_i=0;_i<arguments.length;_i++)sets[_i]=arguments[_i];var res={};try{for(var sets_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(sets),sets_1_1=sets_1.next();!sets_1_1.done;sets_1_1=sets_1.next()){var s=sets_1_1.value;for(var v in s)s.hasOwnProperty(v)&&(res[v]=!0)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{sets_1_1&&!sets_1_1.done&&(_a=sets_1.return)&&_a.call(sets_1)}finally{Iif(e_2)throw e_2.error}}return res}var inertBodyHelper,SecurityContext,VOID_ELEMENTS=tagSet("area,br,col,hr,img,wbr"),OPTIONAL_END_TAG_BLOCK_ELEMENTS=tagSet("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),OPTIONAL_END_TAG_INLINE_ELEMENTS=tagSet("rp,rt"),OPTIONAL_END_TAG_ELEMENTS=merge(OPTIONAL_END_TAG_INLINE_ELEMENTS,OPTIONAL_END_TAG_BLOCK_ELEMENTS),BLOCK_ELEMENTS=merge(OPTIONAL_END_TAG_BLOCK_ELEMENTS,tagSet("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),INLINE_ELEMENTS=merge(OPTIONAL_END_TAG_INLINE_ELEMENTS,tagSet("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),VALID_ELEMENTS=merge(VOID_ELEMENTS,BLOCK_ELEMENTS,INLINE_ELEMENTS,OPTIONAL_END_TAG_ELEMENTS),URI_ATTRS=tagSet("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),SRCSET_ATTRS=tagSet("srcset"),HTML_ATTRS=tagSet("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),ARIA_ATTRS=tagSet("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),VALID_ATTRS=merge(URI_ATTRS,SRCSET_ATTRS,HTML_ATTRS,ARIA_ATTRS),SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS=tagSet("script,style,template"),SanitizingHtmlSerializer=function(){function SanitizingHtmlSerializer(){this.sanitizedSomething=!1,this.buf=[]}return SanitizingHtmlSerializer.prototype.sanitizeChildren=function(el){for(var current=el.firstChild,traverseContent=!0;current;)if(current.nodeType===Node.ELEMENT_NODE?traverseContent=this.startElement(current):current.nodeType===Node.TEXT_NODE?this.chars(current.nodeValue):this.sanitizedSomething=!0,traverseContent&&current.firstChild)current=current.firstChild;else for(;current;){current.nodeType===Node.ELEMENT_NODE&&this.endElement(current);var next=this.checkClobberedElement(current,current.nextSibling);if(next){current=next;break}current=this.checkClobberedElement(current,current.parentNode)}return this.buf.join("")},SanitizingHtmlSerializer.prototype.startElement=function(element){var tagName=element.nodeName.toLowerCase();if(!VALID_ELEMENTS.hasOwnProperty(tagName))return this.sanitizedSomething=!0,!SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS.hasOwnProperty(tagName);this.buf.push("<"),this.buf.push(tagName);for(var elAttrs=element.attributes,i=0;i<elAttrs.length;i++){var elAttr=elAttrs.item(i),attrName=elAttr.name,lower=attrName.toLowerCase();if(VALID_ATTRS.hasOwnProperty(lower)){var value=elAttr.value;URI_ATTRS[lower]&&(value=_sanitizeUrl(value)),SRCSET_ATTRS[lower]&&(value=sanitizeSrcset(value)),this.buf.push(" ",attrName,'="',encodeEntities(value),'"')}else this.sanitizedSomething=!0}return this.buf.push(">"),!0},SanitizingHtmlSerializer.prototype.endElement=function(current){var tagName=current.nodeName.toLowerCase();VALID_ELEMENTS.hasOwnProperty(tagName)&&!VOID_ELEMENTS.hasOwnProperty(tagName)&&(this.buf.push("</"),this.buf.push(tagName),this.buf.push(">"))},SanitizingHtmlSerializer.prototype.chars=function(chars){this.buf.push(encodeEntities(chars))},SanitizingHtmlSerializer.prototype.checkClobberedElement=function(node,nextNode){if(nextNode&&(node.compareDocumentPosition(nextNode)&Node.DOCUMENT_POSITION_CONTAINED_BY)===Node.DOCUMENT_POSITION_CONTAINED_BY)throw new Error("Failed to sanitize html because the element is clobbered: "+node.outerHTML);return nextNode},SanitizingHtmlSerializer}(),SURROGATE_PAIR_REGEXP=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,NON_ALPHANUMERIC_REGEXP=/([^\#-~ |!])/g;function encodeEntities(value){return value.replace(/&/g,"&amp;").replace(SURROGATE_PAIR_REGEXP,function(match){return"&#"+(1024*(match.charCodeAt(0)-55296)+(match.charCodeAt(1)-56320)+65536)+";"}).replace(NON_ALPHANUMERIC_REGEXP,function(match){return"&#"+match.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function _sanitizeHtml(defaultDoc,unsafeHtmlInput){var inertBodyElement=null;try{inertBodyHelper=inertBodyHelper||new InertBodyHelper(defaultDoc);var unsafeHtml=unsafeHtmlInput?String(unsafeHtmlInput):"";inertBodyElement=inertBodyHelper.getInertBodyElement(unsafeHtml);var mXSSAttempts=5,parsedHtml=unsafeHtml;do{if(0===mXSSAttempts)throw new Error("Failed to sanitize html because the input is unstable");mXSSAttempts--,unsafeHtml=parsedHtml,parsedHtml=inertBodyElement.innerHTML,inertBodyElement=inertBodyHelper.getInertBodyElement(unsafeHtml)}while(unsafeHtml!==parsedHtml);var sanitizer=new SanitizingHtmlSerializer,safeHtml=sanitizer.sanitizeChildren(getTemplateContent(inertBodyElement)||inertBodyElement);return isDevMode()&&sanitizer.sanitizedSomething&&console.warn("WARNING: sanitizing HTML stripped some content, see http://g.co/ng/security#xss"),safeHtml}finally{if(inertBodyElement)for(var parent_1=getTemplateContent(inertBodyElement)||inertBodyElement;parent_1.firstChild;)parent_1.removeChild(parent_1.firstChild)}}function getTemplateContent(el){return"content"in el&&function isTemplateElement(el){return el.nodeType===Node.ELEMENT_NODE&&"TEMPLATE"===el.nodeName}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(el)?el.content:null}!function(SecurityContext){SecurityContext[SecurityContext.NONE=0]="NONE",SecurityContext[SecurityContext.HTML=1]="HTML",SecurityContext[SecurityContext.STYLE=2]="STYLE",SecurityContext[SecurityContext.SCRIPT=3]="SCRIPT",SecurityContext[SecurityContext.URL=4]="URL",SecurityContext[SecurityContext.RESOURCE_URL=5]="RESOURCE_URL"}(SecurityContext||(SecurityContext={}));var Sanitizer=function Sanitizer(){},SAFE_STYLE_VALUE=new RegExp("^([-,.\"'%_!# a-zA-Z0-9]+|(?:(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|3d)?|(?:rgb|hsl)a?|(?:repeating-)?(?:linear|radial)-gradient|(?:calc|attr))\\([-0-9.%, #a-zA-Z]+\\))$","g"),URL_RE=/^url\(([^)]+)\)$/;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function _sanitizeStyle(value){if(!(value=String(value).trim()))return"";var urlMatch=value.match(URL_RE);return urlMatch&&_sanitizeUrl(urlMatch[1])===urlMatch[1]||value.match(SAFE_STYLE_VALUE)&&function hasBalancedQuotes(value){for(var outsideSingle=!0,outsideDouble=!0,i=0;i<value.length;i++){var c=value.charAt(i);"'"===c&&outsideDouble?outsideSingle=!outsideSingle:'"'===c&&outsideSingle&&(outsideDouble=!outsideDouble)}return outsideSingle&&outsideDouble}(value)?value:(isDevMode()&&console.warn("WARNING: sanitizing unsafe style value "+value+" (see http://g.co/ng/security#xss)."),"unsafe")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function normalizeDebugBindingName(name){return"ng-reflect-"+(name=function camelCaseToDashCase(input){return input.replace(CAMEL_CASE_REGEXP,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];return"-"+m[1].toLowerCase()})}(name.replace(/[$@]/g,"_")))}var CAMEL_CASE_REGEXP=/([A-Z])/g;function normalizeDebugBindingValue(value){try{return null!=value?value.toString().slice(0,30):value}catch(e){return"[ERROR] Exception while trying to serialize the value"}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ELEMENT_MARKER={marker:"element"},COMMENT_MARKER={marker:"comment"};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function attachDebugObject(obj,debug){Object.defineProperty(obj,"debug",{value:debug,enumerable:!1})}function toDebug(obj){if(obj){var debug=obj.debug;return assertDefined(debug,"Object does not have a debug representation."),debug}return obj}function toHtml(value,includeChildren){void 0===includeChildren&&(includeChildren=!1);var node=unwrapRNode(value);if(node){var isTextNode=node.nodeType===Node.TEXT_NODE,outerHTML=(isTextNode?node.textContent:node.outerHTML)||"";if(includeChildren||isTextNode)return outerHTML;var innerHTML=node.innerHTML;return outerHTML.split(innerHTML)[0]||null}return null}var LViewDebug=function(){function LViewDebug(_raw_lView){this._raw_lView=_raw_lView}return Object.defineProperty(LViewDebug.prototype,"flags",{get:function(){var flags=this._raw_lView[FLAGS];return{__raw__flags__:flags,initPhaseState:3&flags,creationMode:!!(4&flags),firstViewPass:!!(8&flags),checkAlways:!!(16&flags),dirty:!!(64&flags),attached:!!(128&flags),destroyed:!!(256&flags),isRoot:!!(512&flags),indexWithinInitPhase:flags>>10}},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"parent",{get:function(){return toDebug(this._raw_lView[PARENT])},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"host",{get:function(){return toHtml(this._raw_lView[HOST],!0)},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"context",{get:function(){return this._raw_lView[CONTEXT]},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"nodes",{get:function(){var lView=this._raw_lView;return function toDebugNodes(tNode,lView){if(tNode){for(var debugNodes=[],tNodeCursor=tNode;tNodeCursor;){var rawValue=lView[tNode.index],native=unwrapRNode(rawValue),componentLViewDebug=toDebug(readLViewValue(rawValue));debugNodes.push({html:toHtml(native),native:native,nodes:toDebugNodes(tNode.child,lView),component:componentLViewDebug}),tNodeCursor=tNodeCursor.next}return debugNodes}return null}(lView[TVIEW].firstChild,lView)},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"__other__",{get:function(){return{tView:this._raw_lView[TVIEW],cleanup:this._raw_lView[CLEANUP],injector:this._raw_lView[INJECTOR$1],rendererFactory:this._raw_lView[RENDERER_FACTORY],renderer:this._raw_lView[RENDERER],sanitizer:this._raw_lView[SANITIZER],childHead:toDebug(this._raw_lView[CHILD_HEAD]),next:toDebug(this._raw_lView[NEXT]),childTail:toDebug(this._raw_lView[CHILD_TAIL]),declarationView:toDebug(this._raw_lView[DECLARATION_VIEW]),contentQueries:this._raw_lView[CONTENT_QUERIES],queries:this._raw_lView[QUERIES],tHost:this._raw_lView[T_HOST],bindingIndex:this._raw_lView[BINDING_INDEX]}},enumerable:!0,configurable:!0}),Object.defineProperty(LViewDebug.prototype,"childViews",{get:function(){for(var childViews=[],child=this.__other__.childHead;child;)childViews.push(child),child=child.__other__.next;return childViews},enumerable:!0,configurable:!0}),LViewDebug}();!function(){function LContainerDebug(_raw_lContainer){this._raw_lContainer=_raw_lContainer}Object.defineProperty(LContainerDebug.prototype,"activeIndex",{get:function(){return this._raw_lContainer[ACTIVE_INDEX]},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"views",{get:function(){return this._raw_lContainer[VIEWS].map(toDebug)},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"parent",{get:function(){return toDebug(this._raw_lContainer[PARENT])},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"queries",{get:function(){return this._raw_lContainer[QUERIES]},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"host",{get:function(){return this._raw_lContainer[HOST]},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"native",{get:function(){return this._raw_lContainer[NATIVE]},enumerable:!0,configurable:!0}),Object.defineProperty(LContainerDebug.prototype,"__other__",{get:function(){return{next:toDebug(this._raw_lContainer[NEXT])}},enumerable:!0,configurable:!0})}();function readLViewValue(value){for(;Array.isArray(value);){if(value.length>=HEADER_OFFSET-1)return value;value=value[HOST]}return null}var I18NDebugItem=function(){function I18NDebugItem(__raw_opCode,_lView,nodeIndex,type){this.__raw_opCode=__raw_opCode,this._lView=_lView,this.nodeIndex=nodeIndex,this.type=type}return Object.defineProperty(I18NDebugItem.prototype,"tNode",{get:function(){return getTNode(this.nodeIndex,this._lView)},enumerable:!0,configurable:!0}),I18NDebugItem}();(function(){function I18nMutateOpCodesDebug(__raw_opCodes,__lView){this.__raw_opCodes=__raw_opCodes,this.__lView=__lView}Object.defineProperty(I18nMutateOpCodesDebug.prototype,"operations",{get:function(){for(var __lView=this.__lView,__raw_opCodes=this.__raw_opCodes,results=[],i=0;i<__raw_opCodes.length;i++){var opCode=__raw_opCodes[i],result=void 0;if("string"==typeof opCode&&(result={__raw_opCode:opCode,type:"Create Text Node",nodeIndex:__raw_opCodes[++i],text:opCode}),"number"==typeof opCode)switch(7&opCode){case 1:result=new I18NDebugItem(opCode,__lView,opCode>>>17,"AppendChild");break;case 0:result=new I18NDebugItem(opCode,__lView,opCode>>>3,"Select");break;case 5:var elementIndex=opCode>>>3;result=new I18NDebugItem(opCode,__lView,elementIndex,"ElementEnd");break;case 4:(result=new I18NDebugItem(opCode,__lView,elementIndex=opCode>>>3,"Attr")).attrName=__raw_opCodes[++i],result.attrValue=__raw_opCodes[++i]}if(!result)switch(opCode){case COMMENT_MARKER:result={__raw_opCode:opCode,type:"COMMENT_MARKER",commentValue:__raw_opCodes[++i],nodeIndex:__raw_opCodes[++i]};break;case ELEMENT_MARKER:result={__raw_opCode:opCode,type:"ELEMENT_MARKER"}}result||(result={__raw_opCode:opCode,type:"Unknown Op Code",code:opCode}),results.push(result)}return results},enumerable:!0,configurable:!0})})(),function(){function I18nUpdateOpCodesDebug(__raw_opCodes,icus,__lView){this.__raw_opCodes=__raw_opCodes,this.icus=icus,this.__lView=__lView}Object.defineProperty(I18nUpdateOpCodesDebug.prototype,"operations",{get:function(){for(var __lView=this.__lView,__raw_opCodes=this.__raw_opCodes,icus=this.icus,results=[],i=0;i<__raw_opCodes.length;i++){for(var checkBit=__raw_opCodes[i],skipCodes=__raw_opCodes[++i],value="",j=i+1;j<=i+skipCodes;j++){var opCode=__raw_opCodes[j];if("string"==typeof opCode)value+=opCode;else if("number"==typeof opCode)if(opCode<0)value+="�"+(-opCode-1)+"�";else{var nodeIndex=opCode>>>2,tIcuIndex=void 0,tIcu=void 0;switch(3&opCode){case 1:var attrName=__raw_opCodes[++j],sanitizeFn=__raw_opCodes[++j];results.push({__raw_opCode:opCode,checkBit:checkBit,type:"Attr",attrValue:value,attrName:attrName,sanitizeFn:sanitizeFn});break;case 0:results.push({__raw_opCode:opCode,checkBit:checkBit,type:"Text",nodeIndex:nodeIndex,text:value});break;case 2:tIcu=icus[tIcuIndex=__raw_opCodes[++j]];var result=new I18NDebugItem(opCode,__lView,nodeIndex,"IcuSwitch");result.tIcuIndex=tIcuIndex,result.checkBit=checkBit,result.mainBinding=value,result.tIcu=tIcu,results.push(result);break;case 3:tIcu=icus[tIcuIndex=__raw_opCodes[++j]],(result=new I18NDebugItem(opCode,__lView,nodeIndex,"IcuUpdate")).tIcuIndex=tIcuIndex,result.checkBit=checkBit,result.tIcu=tIcu,results.push(result)}}}i+=skipCodes}return results},enumerable:!0,configurable:!0})}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var NO_CHANGE={};function enqueueHostInstruction(context,priority,instructionFn,instructionFnArgs){var buffer=context[8],index=function findNextInsertionIndex(buffer,priority){for(var i=1;i<buffer.length;i+=3){if(buffer[i+0]>priority)return i}return buffer.length}(buffer,priority);buffer.splice(index,0,priority,instructionFn,instructionFnArgs)}var BoundPlayerFactory=function BoundPlayerFactory(fn,value){this.fn=fn,this.value=value};function renderInitialClasses(element,context,renderer,startIndex){for(var initialClasses=context[4],i=startIndex||2;i<initialClasses.length;){initialClasses[i+1]&&setClass(element,initialClasses[i+0],!0,renderer,null),i+=3}return i}function renderInitialStyles(element,context,renderer,startIndex){for(var initialStyles=context[3],i=startIndex||2;i<initialStyles.length;){var value=initialStyles[i+1];value&&setStyle(element,initialStyles[i+0],value,renderer,null),i+=3}return i}function updateContextWithBindings(context,directiveIndex,classBindingNames,styleBindingNames,styleSanitizer){if(!(16&context[1])&&function findOrPatchDirectiveIntoRegistry(context,directiveIndex,staticModeOnly,styleSanitizer){var directiveRegistry=context[2],index=2*directiveIndex,singlePropStartPosition=index+0;if(index<directiveRegistry.length&&directiveRegistry[singlePropStartPosition]>=0)return!1;var singlePropsStartIndex=staticModeOnly?-1:context[5].length;return allocateOrUpdateDirectiveIntoContext(context,directiveIndex,singlePropsStartIndex,styleSanitizer),!0}(context,directiveIndex,!1,styleSanitizer)){styleBindingNames&&(styleBindingNames=function hyphenateEntries(entries){for(var newEntries=[],i=0;i<entries.length;i++)newEntries.push(hyphenate(entries[i]));return newEntries}(styleBindingNames));var singlePropOffsetValues=context[5],totalCurrentClassBindings=singlePropOffsetValues[1],totalCurrentStyleBindings=singlePropOffsetValues[0],cachedClassMapValues=context[6],cachedStyleMapValues=context[7],stylesOffset=4*totalCurrentStyleBindings,singleClassesStartIndex=10+stylesOffset,multiStylesStartIndex=singleClassesStartIndex+4*totalCurrentClassBindings,multiClassesStartIndex=multiStylesStartIndex+stylesOffset,currentSinglePropsLength=singlePropOffsetValues.length;singlePropOffsetValues.push(styleBindingNames?styleBindingNames.length:0,classBindingNames?classBindingNames.length:0);var insertionOffset=0,filteredStyleBindingNames=[];if(styleBindingNames&&styleBindingNames.length)for(var i_1=0;i_1<styleBindingNames.length;i_1++){var name_1=styleBindingNames[i_1];-1==(singlePropIndex=getMatchingBindingIndex(context,name_1,10,singleClassesStartIndex))&&(singlePropIndex=singleClassesStartIndex+insertionOffset,insertionOffset+=4,filteredStyleBindingNames.push(name_1)),singlePropOffsetValues.push(singlePropIndex)}var filteredClassBindingNames=[];if(classBindingNames&&classBindingNames.length)for(var i_2=0;i_2<classBindingNames.length;i_2++){var singlePropIndex,name_2=classBindingNames[i_2];-1==(singlePropIndex=getMatchingBindingIndex(context,name_2,singleClassesStartIndex,multiStylesStartIndex))?(singlePropIndex=multiStylesStartIndex+insertionOffset,insertionOffset+=4,filteredClassBindingNames.push(name_2)):singlePropIndex+=4*filteredStyleBindingNames.length,singlePropOffsetValues.push(singlePropIndex)}var i=2;if(filteredStyleBindingNames.length)for(;i<currentSinglePropsLength;){var totalStyles=singlePropOffsetValues[i+0],totalClasses=singlePropOffsetValues[i+1];if(totalClasses)for(var start=i+2+totalStyles,j=start;j<start+totalClasses;j++)singlePropOffsetValues[j]+=4*filteredStyleBindingNames.length;i+=2+(totalStyles+totalClasses)}for(var totalNewEntries=filteredClassBindingNames.length+filteredStyleBindingNames.length,i_3=10;i_3<context.length;i_3+=4){var isMultiBased=i_3>=multiStylesStartIndex,isClassBased=i_3>=(isMultiBased?multiClassesStartIndex:singleClassesStartIndex),flag=getPointers(context,i_3),staticIndex=getInitialIndex(flag),singleOrMultiIndex=getMultiOrSingleIndex(flag);setFlag(context,i_3,pointers(flag,staticIndex,singleOrMultiIndex+=isMultiBased?isClassBased?4*filteredStyleBindingNames.length:0:4*totalNewEntries+4*(isClassBased?filteredStyleBindingNames.length:0)))}for(var i_4=0;i_4<4*filteredStyleBindingNames.length;i_4++)context.splice(multiClassesStartIndex,0,null),context.splice(singleClassesStartIndex,0,null),singleClassesStartIndex++,multiStylesStartIndex++,multiClassesStartIndex+=2;for(var i_5=0;i_5<4*filteredClassBindingNames.length;i_5++)context.splice(multiStylesStartIndex,0,null),context.push(null),multiStylesStartIndex++,multiClassesStartIndex++;for(var initialClasses=context[4],initialStyles=context[3],i_6=0;i_6<totalNewEntries;i_6++){var entryIsClassBased=i_6>=filteredStyleBindingNames.length,adjustedIndex=entryIsClassBased?i_6-filteredStyleBindingNames.length:i_6,propName=entryIsClassBased?filteredClassBindingNames[adjustedIndex]:filteredStyleBindingNames[adjustedIndex],multiIndex=void 0,singleIndex=void 0;entryIsClassBased?(multiIndex=multiClassesStartIndex+4*(totalCurrentClassBindings+adjustedIndex),singleIndex=singleClassesStartIndex+4*(totalCurrentClassBindings+adjustedIndex)):(multiIndex=multiStylesStartIndex+4*(totalCurrentStyleBindings+adjustedIndex),singleIndex=10+4*(totalCurrentStyleBindings+adjustedIndex));var initialValuesToLookup=entryIsClassBased?initialClasses:initialStyles,indexForInitial=getInitialStylingValuesIndexOf(initialValuesToLookup,propName);-1===indexForInitial?indexForInitial=addOrUpdateStaticStyle(null,initialValuesToLookup,propName,!entryIsClassBased&&null,directiveIndex)+1:indexForInitial+=1;var initialFlag=prepareInitialFlag(context,propName,entryIsClassBased,styleSanitizer||null);setFlag(context,singleIndex,pointers(initialFlag,indexForInitial,multiIndex)),setProp(context,singleIndex,propName),setValue(context,singleIndex,null),setPlayerBuilderIndex(context,singleIndex,0,directiveIndex),setFlag(context,multiIndex,pointers(initialFlag,indexForInitial,singleIndex)),setProp(context,multiIndex,propName),setValue(context,multiIndex,null),setPlayerBuilderIndex(context,multiIndex,0,directiveIndex)}singlePropOffsetValues[1]=totalCurrentClassBindings+filteredClassBindingNames.length,singlePropOffsetValues[0]=totalCurrentStyleBindings+filteredStyleBindingNames.length,cachedClassMapValues[0]+=filteredClassBindingNames.length,cachedStyleMapValues[0]+=filteredStyleBindingNames.length;var newStylesSpaceAllocationSize=4*filteredStyleBindingNames.length,newClassesSpaceAllocationSize=4*filteredClassBindingNames.length,directiveMultiStylesStartIndex=multiStylesStartIndex+4*totalCurrentStyleBindings,cachedStyleMapIndex=cachedStyleMapValues.length;registerMultiMapEntry(context,directiveIndex,!1,directiveMultiStylesStartIndex,filteredStyleBindingNames.length);for(var i_7=1;i_7<cachedStyleMapIndex;i_7+=4)cachedStyleMapValues[i_7+1]+=newClassesSpaceAllocationSize+newStylesSpaceAllocationSize;var directiveMultiClassesStartIndex=multiClassesStartIndex+4*totalCurrentClassBindings,cachedClassMapIndex=cachedClassMapValues.length;registerMultiMapEntry(context,directiveIndex,!0,directiveMultiClassesStartIndex,filteredClassBindingNames.length);for(var i_8=1;i_8<cachedClassMapIndex;i_8+=4)cachedClassMapValues[i_8+1]+=2*newStylesSpaceAllocationSize+newClassesSpaceAllocationSize;setFlag(context,1,pointers(0,0,multiStylesStartIndex))}}function getMatchingBindingIndex(context,bindingName,start,end){for(var j=start;j<end;j+=4)if(getProp(context,j)===bindingName)return j;return-1}function updateStylingMap(context,classesInput,stylesInput,directiveIndex){void 0===directiveIndex&&(directiveIndex=0),ngDevMode&&ngDevMode.stylingMap++,ngDevMode&&assertValidDirectiveIndex(context,directiveIndex),stylesInput=stylesInput||null;var ignoreAllClassUpdates=isMultiValueCacheHit(context,!0,directiveIndex,classesInput=classesInput||null),ignoreAllStyleUpdates=isMultiValueCacheHit(context,!1,directiveIndex,stylesInput);if(!ignoreAllClassUpdates||!ignoreAllStyleUpdates){classesInput=classesInput===NO_CHANGE?readCachedMapValue(context,!0,directiveIndex):classesInput,stylesInput=stylesInput===NO_CHANGE?readCachedMapValue(context,!1,directiveIndex):stylesInput;var element=context[0],classesPlayerBuilder=classesInput instanceof BoundPlayerFactory?new ClassAndStylePlayerBuilder(classesInput,element,1):null,stylesPlayerBuilder=stylesInput instanceof BoundPlayerFactory?new ClassAndStylePlayerBuilder(stylesInput,element,2):null,classesValue=classesPlayerBuilder?classesInput.value:classesInput,stylesValue=stylesPlayerBuilder?stylesInput.value:stylesInput,classNames=EMPTY_ARRAY$1,applyAllClasses=!1,playerBuildersAreDirty=!1,classesPlayerBuilderIndex=classesPlayerBuilder?1:0;hasPlayerBuilderChanged(context,classesPlayerBuilder,1)&&(setPlayerBuilder(context,classesPlayerBuilder,1),playerBuildersAreDirty=!0);var stylesPlayerBuilderIndex=stylesPlayerBuilder?3:0;hasPlayerBuilderChanged(context,stylesPlayerBuilder,3)&&(setPlayerBuilder(context,stylesPlayerBuilder,3),playerBuildersAreDirty=!0),ignoreAllClassUpdates||("string"==typeof classesValue?(classNames=classesValue.split(/\s+/),applyAllClasses=!0):classNames=classesValue?Object.keys(classesValue):EMPTY_ARRAY$1);var multiStylesStartIndex=getMultiStylesStartIndex(context),multiClassesStartIndex=function getMultiClassesStartIndex(context){return context[6][2]}(context),multiClassesEndIndex=context.length;if(!ignoreAllStyleUpdates){var totalNewEntries=patchStylingMapIntoContext(context,directiveIndex,stylesPlayerBuilderIndex,multiStylesStartIndex,multiClassesStartIndex,stylesValue?Object.keys(stylesValue):EMPTY_ARRAY$1,stylesValue||EMPTY_OBJ,stylesInput,!1);totalNewEntries&&(multiClassesStartIndex+=4*totalNewEntries,multiClassesEndIndex+=4*totalNewEntries)}if(!ignoreAllClassUpdates)patchStylingMapIntoContext(context,directiveIndex,classesPlayerBuilderIndex,multiClassesStartIndex,multiClassesEndIndex,classNames,applyAllClasses||(classesValue||EMPTY_OBJ),classesInput,!0);playerBuildersAreDirty&&setContextPlayersDirty(context,!0),ngDevMode&&ngDevMode.stylingMapCacheMiss++}}function patchStylingMapIntoContext(context,directiveIndex,playerBuilderIndex,ctxStart,ctxEnd,props,values,cacheValue,entryIsClassBased){for(var dirty=!1,cacheIndex=1+4*directiveIndex,cachedValues=context[entryIsClassBased?6:7],ownershipValuesStartIndex=cachedValues[cacheIndex+1],existingCachedValue=cachedValues[cacheIndex+2],existingCachedValueCount=cachedValues[cacheIndex+3],valuesEntryShapeChange=1===cachedValues[cacheIndex+0]||!(existingCachedValue||!cacheValue),totalUniqueValues=0,totalNewAllocatedSlots=0,applyAllProps=!0===values,ctxIndex=ctxStart,totalRemainingProperties=props.length;ctxIndex<ownershipValuesStartIndex;){var currentProp=getProp(context,ctxIndex);if(totalRemainingProperties)for(var i=0;i<props.length;i++){if((normalizedProp=(mapProp=props[i])?entryIsClassBased?mapProp:hyphenate(mapProp):null)&&currentProp===normalizedProp){var currentValue=getValue(context,ctxIndex),currentDirectiveIndex=getDirectiveIndexFromEntry(context,ctxIndex),value=!!applyAllProps||values[normalizedProp],currentFlag=getPointers(context,ctxIndex);hasValueChanged(currentFlag,currentValue,value)&&allowValueChange(currentValue,value,currentDirectiveIndex,directiveIndex)&&(setValue(context,ctxIndex,value),setPlayerBuilderIndex(context,ctxIndex,playerBuilderIndex,directiveIndex),hasInitialValueChanged(context,currentFlag,value)&&(setDirty(context,ctxIndex,!0),dirty=!0)),props[i]=null,totalRemainingProperties--;break}}ctxIndex+=4}if(totalRemainingProperties){var sanitizer=entryIsClassBased?null:getStyleSanitizer(context,directiveIndex);propertiesLoop:for(i=0;i<props.length;i++){var mapProp;if(mapProp=props[i]){value=!!applyAllProps||values[mapProp];for(var normalizedProp=entryIsClassBased?mapProp:hyphenate(mapProp),isInsideOwnershipArea=ctxIndex>=ownershipValuesStartIndex,j=ctxIndex;j<ctxEnd;j+=4){if(getProp(context,j)===normalizedProp){var distantCtxDirectiveIndex=getDirectiveIndexFromEntry(context,j),distantCtxPlayerBuilderIndex=getPlayerBuilderIndex(context,j),distantCtxValue=getValue(context,j),distantCtxFlag=getPointers(context,j);allowValueChange(distantCtxValue,value,distantCtxDirectiveIndex,directiveIndex)&&(isInsideOwnershipArea&&(swapMultiContextEntries(context,ctxIndex,j),totalUniqueValues++),hasValueChanged(distantCtxFlag,distantCtxValue,value)&&((null===value||void 0===value&&value!==distantCtxValue)&&(valuesEntryShapeChange=!0),setValue(context,ctxIndex,value),(null!==distantCtxValue||hasInitialValueChanged(context,distantCtxFlag,value))&&(setDirty(context,ctxIndex,!0),dirty=!0)),distantCtxDirectiveIndex===directiveIndex&&playerBuilderIndex===distantCtxPlayerBuilderIndex||setPlayerBuilderIndex(context,ctxIndex,playerBuilderIndex,directiveIndex)),ctxIndex+=4;continue propertiesLoop}}if(null!=value)valuesEntryShapeChange=!0,totalUniqueValues++,insertNewMultiProperty(context,isInsideOwnershipArea?ctxIndex:ownershipValuesStartIndex+4*totalNewAllocatedSlots,entryIsClassBased,normalizedProp,1|prepareInitialFlag(context,normalizedProp,entryIsClassBased,sanitizer),value,directiveIndex,playerBuilderIndex),totalNewAllocatedSlots++,ctxEnd+=4,ctxIndex+=4,dirty=!0}}}for(;ctxIndex<ctxEnd;){valuesEntryShapeChange=!0;var ctxValue=getValue(context,ctxIndex),ctxFlag=getPointers(context,ctxIndex);getDirectiveIndexFromEntry(context,ctxIndex);null!=ctxValue&&(valuesEntryShapeChange=!0),hasValueChanged(ctxFlag,ctxValue,null)&&(setValue(context,ctxIndex,null),hasInitialValueChanged(context,ctxFlag,ctxValue)&&(setDirty(context,ctxIndex,!0),dirty=!0),setPlayerBuilderIndex(context,ctxIndex,playerBuilderIndex,directiveIndex)),ctxIndex+=4}return function updateCachedMapValue(context,directiveIndex,entryIsClassBased,cacheValue,startPosition,endPosition,totalValues,dirtyFutureValues){var values=context[entryIsClassBased?6:7],index=1+4*directiveIndex;if(dirtyFutureValues)for(var nextStartPosition=startPosition+4*totalValues,i=index+4;i<values.length;i+=4)values[i+1]=nextStartPosition,values[i+0]=1;values[index+0]=0,values[index+1]=startPosition,values[index+2]=cacheValue,values[index+3]=totalValues;var totalStylingEntries=totalValues;for(i=1;i<index;i+=4)totalStylingEntries+=values[i+3];if(!entryIsClassBased){var classCache=context[6],classesStartPosition=classCache[2],diffInStartPosition=endPosition-classesStartPosition;for(i=1;i<classCache.length;i+=4)classCache[i+1]+=diffInStartPosition}values[0]=totalStylingEntries}(context,directiveIndex,entryIsClassBased,cacheValue,ownershipValuesStartIndex,ctxEnd,totalUniqueValues,valuesEntryShapeChange=valuesEntryShapeChange||existingCachedValueCount!==totalUniqueValues),dirty&&setContextDirty(context,!0),totalNewAllocatedSlots}function renderStyling(context,renderer,rootOrView,isFirstRender,classesStore,stylesStore,directiveIndex){void 0===directiveIndex&&(directiveIndex=0);var totalPlayersQueued=0;if(ngDevMode&&ngDevMode.stylingApply++,function allowFlush(context,directiveIndex){var buffer=context[8];return!buffer||buffer[0]===directiveIndex}(context,directiveIndex)&&(function flushQueue(context){var buffer=context[8];if(buffer){for(var i=1;i<buffer.length;i+=3){var fn=buffer[i+1],args=buffer[i+2];fn.apply(this,args)}buffer.length=1}}(context),function isContextDirty(context){return isDirty(context,1)}(context))){ngDevMode&&ngDevMode.stylingApplyCacheMiss++;for(var native=context[0],flushPlayerBuilders=8&context[1],multiStartIndex=getMultiStylesStartIndex(context),i=10;i<context.length;i+=4)if(isDirty(context,i)){var flag=getPointers(context,i),directiveIndex_1=getDirectiveIndexFromEntry(context,i),prop=getProp(context,i),value=getValue(context,i),styleSanitizer=4&flag?getStyleSanitizer(context,directiveIndex_1):null,playerBuilder=getPlayerBuilder(context,i),isClassBased=!!(2&flag),valueToApply=value;if(i<multiStartIndex&&!valueExists(valueToApply,isClassBased))valueToApply=getValue(context,getMultiOrSingleIndex(flag));valueExists(valueToApply,isClassBased)||(valueToApply=getInitialValue(context,flag)),renderer&&(!isFirstRender||valueToApply)&&(isClassBased?setClass(native,prop,!!valueToApply,renderer,classesStore,playerBuilder):setStyle(native,prop,valueToApply,renderer,styleSanitizer,stylesStore,playerBuilder)),setDirty(context,i,!1)}if(flushPlayerBuilders){var rootContext=Array.isArray(rootOrView)?getRootContext(rootOrView):rootOrView,playerContext=getPlayerContext(context),playersStartIndex=playerContext[0];for(i=1;i<playersStartIndex;i+=2){var builder=playerContext[i],playerInsertionIndex=i+1,oldPlayer=playerContext[playerInsertionIndex];if(builder){var player=builder.buildPlayer(oldPlayer,isFirstRender);if(void 0!==player){if(null!=player)addPlayerInternal(playerContext,rootContext,native,player,playerInsertionIndex)&&totalPlayersQueued++;oldPlayer&&oldPlayer.destroy()}}else oldPlayer&&oldPlayer.destroy()}setContextPlayersDirty(context,!1)}setContextDirty(context,!1)}return totalPlayersQueued}function setStyle(native,prop,value,renderer,sanitizer,store,playerBuilder){value=sanitizer&&value?sanitizer(prop,value):value,store||playerBuilder?(store&&store.setValue(prop,value),playerBuilder&&playerBuilder.setValue(prop,value)):value?(value=value.toString(),ngDevMode&&ngDevMode.rendererSetStyle++,isProceduralRenderer(renderer)?renderer.setStyle(native,prop,value,RendererStyleFlags3.DashCase):native.style.setProperty(prop,value)):(ngDevMode&&ngDevMode.rendererRemoveStyle++,isProceduralRenderer(renderer)?renderer.removeStyle(native,prop,RendererStyleFlags3.DashCase):native.style.removeProperty(prop))}function setClass(native,className,add,renderer,store,playerBuilder){store||playerBuilder?(store&&store.setValue(className,add),playerBuilder&&playerBuilder.setValue(className,add)):""!==className&&(add?(ngDevMode&&ngDevMode.rendererAddClass++,isProceduralRenderer(renderer)?renderer.addClass(native,className):native.classList.add(className)):(ngDevMode&&ngDevMode.rendererRemoveClass++,isProceduralRenderer(renderer)?renderer.removeClass(native,className):native.classList.remove(className)))}function setDirty(context,index,isDirtyYes){var adjustedIndex=index>=10?index+0:index;isDirtyYes?context[adjustedIndex]|=1:context[adjustedIndex]&=-2}function isDirty(context,index){return 1==(1&context[index>=10?index+0:index])}function isClassBasedValue(context,index){return 2==(2&context[index>=10?index+0:index])}function isSanitizable(context,index){return 4==(4&context[index>=10?index+0:index])}function pointers(configFlag,staticIndex,dynamicIndex){return 31&configFlag|staticIndex<<5|dynamicIndex<<19}function getInitialValue(context,flag){var index=getInitialIndex(flag);return(2&flag?context[4]:context[3])[index]}function getInitialIndex(flag){return flag>>5&16383}function getMultiOrSingleIndex(flag){var index=flag>>19&16383;return index>=10?index:-1}function getMultiStylesStartIndex(context){return context[7][2]}function setProp(context,index,prop){context[index+1]=prop}function setValue(context,index,value){context[index+2]=value}function hasPlayerBuilderChanged(context,builder,index){var playerContext=context[9];if(builder){if(!playerContext||0===index)return!0}else if(!playerContext)return!1;return playerContext[index]!==builder}function setPlayerBuilder(context,builder,insertionIndex){var playerContext=context[9]||allocPlayerContext(context);return insertionIndex>0?playerContext[insertionIndex]=builder:(insertionIndex=playerContext[0],playerContext.splice(insertionIndex,0,builder,null),playerContext[0]+=2),insertionIndex}function setPlayerBuilderIndex(context,index,playerBuilderIndex,directiveIndex){var value=function directiveOwnerPointers(directiveIndex,playerIndex){return playerIndex<<16|directiveIndex}(directiveIndex,playerBuilderIndex);context[index+3]=value}function getPlayerBuilderIndex(context,index){return context[index+3]>>16&65535}function getPlayerBuilder(context,index){var playerBuilderIndex=getPlayerBuilderIndex(context,index);if(playerBuilderIndex){var playerContext=context[9];if(playerContext)return playerContext[playerBuilderIndex]}return null}function setFlag(context,index,flag){context[1===index?index:index+0]=flag}function getPointers(context,index){return context[1===index?index:index+0]}function getValue(context,index){return context[index+2]}function getProp(context,index){return context[index+1]}function setContextDirty(context,isDirtyYes){setDirty(context,1,isDirtyYes)}function setContextPlayersDirty(context,isDirtyYes){isDirtyYes?context[1]|=8:context[1]&=-9}function swapMultiContextEntries(context,indexA,indexB){if(indexA!==indexB){var tmpValue=getValue(context,indexA),tmpProp=getProp(context,indexA),tmpFlag=getPointers(context,indexA),tmpPlayerBuilderIndex=getPlayerBuilderIndex(context,indexA),tmpDirectiveIndex=getDirectiveIndexFromEntry(context,indexA),flagA=tmpFlag,flagB=getPointers(context,indexB),singleIndexA=getMultiOrSingleIndex(flagA);if(singleIndexA>=0)setFlag(context,singleIndexA,pointers(_flag=getPointers(context,singleIndexA),getInitialIndex(_flag),indexB));var _flag,singleIndexB=getMultiOrSingleIndex(flagB);if(singleIndexB>=0)setFlag(context,singleIndexB,pointers(_flag=getPointers(context,singleIndexB),getInitialIndex(_flag),indexA));setValue(context,indexA,getValue(context,indexB)),setProp(context,indexA,getProp(context,indexB)),setFlag(context,indexA,getPointers(context,indexB)),setPlayerBuilderIndex(context,indexA,getPlayerBuilderIndex(context,indexB),getDirectiveIndexFromEntry(context,indexB)),setValue(context,indexB,tmpValue),setProp(context,indexB,tmpProp),setFlag(context,indexB,tmpFlag),setPlayerBuilderIndex(context,indexB,tmpPlayerBuilderIndex,tmpDirectiveIndex)}}function insertNewMultiProperty(context,index,classBased,name,flag,value,directiveIndex,playerIndex){var doShift=index<context.length;context.splice(index,0,1|flag|(classBased?2:0),name,value,0),setPlayerBuilderIndex(context,index,playerIndex,directiveIndex),doShift&&function updateSinglePointerValues(context,indexStartPosition){for(var i=indexStartPosition;i<context.length;i+=4){var singleIndex=getMultiOrSingleIndex(getPointers(context,i));if(singleIndex>0){var initialIndexForSingle=getInitialIndex(getPointers(context,singleIndex));setFlag(context,singleIndex,pointers((isDirty(context,singleIndex)?1:0)|(isClassBasedValue(context,singleIndex)?2:0)|(isSanitizable(context,singleIndex)?4:0),initialIndexForSingle,i))}}}(context,index+4)}function valueExists(value,isClassBased){return null!==value}function prepareInitialFlag(context,prop,entryIsClassBased,sanitizer){var initialIndex,flag=sanitizer&&sanitizer(prop)?4:0;return entryIsClassBased?(flag|=2,initialIndex=getInitialStylingValuesIndexOf(context[4],prop)):initialIndex=getInitialStylingValuesIndexOf(context[3],prop),pointers(flag,initialIndex=initialIndex>0?initialIndex+1:0,0)}function hasInitialValueChanged(context,flag,newValue){var initialValue=getInitialValue(context,flag);return!initialValue||hasValueChanged(flag,initialValue,newValue)}function hasValueChanged(flag,a,b){return!(2&flag)&&(a&&b)&&4&flag?a.toString()!==b.toString():a!==b}var ClassAndStylePlayerBuilder=function(){function ClassAndStylePlayerBuilder(factory,_element,_type){this._element=_element,this._type=_type,this._values={},this._dirty=!1,this._factory=factory}return ClassAndStylePlayerBuilder.prototype.setValue=function(prop,value){this._values[prop]!==value&&(this._values[prop]=value,this._dirty=!0)},ClassAndStylePlayerBuilder.prototype.buildPlayer=function(currentPlayer,isFirstRender){if(this._dirty){var player=this._factory.fn(this._element,this._type,this._values,isFirstRender,currentPlayer||null);return this._values={},this._dirty=!1,player}},ClassAndStylePlayerBuilder}();function getDirectiveIndexFromEntry(context,index){return 65535&context[index+3]}function getInitialStylingValuesIndexOf(keyValues,key){for(var i=2;i<keyValues.length;i+=3)if(keyValues[i]===key)return i;return-1}function getStyleSanitizer(context,directiveIndex){var dirs=context[2];return dirs[2*directiveIndex+1]||dirs[1]||null}function allowValueChange(currentValue,newValue,currentDirectiveOwner,newDirectiveOwner){return null==currentValue||(null!=newValue?newDirectiveOwner<=currentDirectiveOwner:currentDirectiveOwner===newDirectiveOwner)}function readCachedMapValue(context,entryIsClassBased,directiveIndex){return context[entryIsClassBased?6:7][1+4*directiveIndex+2]||null}function isMultiValueCacheHit(context,entryIsClassBased,directiveIndex,newValue){return!context[entryIsClassBased?6:7][1+4*directiveIndex+0]&&(newValue===NO_CHANGE||readCachedMapValue(context,entryIsClassBased,directiveIndex)===newValue)}function hyphenate(value){return value.replace(/[a-z][A-Z]/g,function(match){return match.charAt(0)+"-"+match.charAt(1).toLowerCase()})}function registerMultiMapEntry(context,directiveIndex,entryIsClassBased,startPosition,count){void 0===count&&(count=0);var cachedValues=context[entryIsClassBased?6:7];if(directiveIndex>0)for(var limit=1+4*directiveIndex;cachedValues.length<limit;)cachedValues.push(0,startPosition,null,0);cachedValues.push(0,startPosition,null,count)}function addOrUpdateStaticStyle(index,staticStyles,prop,value,directiveOwnerIndex){return null===index&&(index=staticStyles.length,staticStyles.push(null,null,null),staticStyles[index+0]=prop),staticStyles[index+1]=value,staticStyles[index+2]=directiveOwnerIndex,index}function assertValidDirectiveIndex(context,directiveIndex){var dirs=context[2],index=2*directiveIndex;if(index>=dirs.length||-1===dirs[index+0])throw new Error("The provided directive is not registered with the styling context")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var _CLEAN_PROMISE=Promise.resolve(null);function refreshDescendantViews(lView){var tView=lView[TVIEW],creationMode=isCreationMode(lView);if(tView.firstTemplatePass=!1,lView[BINDING_INDEX]=tView.bindingStartIndex,!creationMode){var checkNoChangesMode=getCheckNoChangesMode();executePreOrderHooks(lView,tView,checkNoChangesMode,void 0),function refreshDynamicEmbeddedViews(lView){for(var current=lView[CHILD_HEAD];null!==current;current=current[NEXT])if(current.length<HEADER_OFFSET&&-1===current[ACTIVE_INDEX])for(var container=current,i=0;i<container[VIEWS].length;i++){var dynamicViewData=container[VIEWS][i];ngDevMode&&assertDefined(dynamicViewData[TVIEW],"TView must be allocated"),renderEmbeddedTemplate(dynamicViewData,dynamicViewData[TVIEW],dynamicViewData[CONTEXT])}}(lView),refreshContentQueries(tView,lView),resetPreOrderHookFlags(lView),executeHooks(lView,tView.contentHooks,tView.contentCheckHooks,checkNoChangesMode,1,void 0),function setHostBindings(tView,viewData){var selectedIndex=getSelectedIndex();try{if(tView.expandoInstructions){var bindingRootIndex=viewData[BINDING_INDEX]=tView.expandoStartIndex;setBindingRoot(bindingRootIndex);for(var currentDirectiveIndex=-1,currentElementIndex=-1,i=0;i<tView.expandoInstructions.length;i++){var instruction=tView.expandoInstructions[i];if("number"==typeof instruction){if(instruction<=0){setActiveHostElement(currentElementIndex=-instruction);var providerCount=tView.expandoInstructions[++i];currentDirectiveIndex=bindingRootIndex+=INJECTOR_BLOOM_PARENT_SIZE+providerCount}else bindingRootIndex+=instruction;setBindingRoot(bindingRootIndex)}else{if(null!==instruction){viewData[BINDING_INDEX]=bindingRootIndex;var hostCtx=unwrapRNode(viewData[currentDirectiveIndex]);instruction(2,hostCtx,currentElementIndex),incrementActiveDirectiveId()}currentDirectiveIndex++}}}}finally{setActiveHostElement(selectedIndex)}}(tView,lView)}creationMode&&tView.staticContentQueries&&refreshContentQueries(tView,lView),function refreshChildComponents(components){if(null!=components)for(var i=0;i<components.length;i++)componentRefresh(components[i])}(tView.components)}function refreshContentQueries(tView,lView){if(null!=tView.contentQueries){setCurrentQueryIndex(0);for(var i=0;i<tView.contentQueries.length;i++){var directiveDefIdx=tView.contentQueries[i],directiveDef=tView.data[directiveDefIdx];ngDevMode&&assertDefined(directiveDef.contentQueries,"contentQueries function should be defined"),directiveDef.contentQueries(2,lView[directiveDefIdx],directiveDefIdx)}}}function elementCreate(name,overriddenRenderer){var rendererToUse=overriddenRenderer||getLView()[RENDERER],namespace=function getNamespace(){return _currentNamespace}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */();return isProceduralRenderer(rendererToUse)?rendererToUse.createElement(name,namespace):null===namespace?rendererToUse.createElement(name):rendererToUse.createElementNS(namespace,name)}function createLView(parentLView,tView,context,flags,host,tHostNode,rendererFactory,renderer,sanitizer,injector){var lView=tView.blueprint.slice();return lView[HOST]=host,lView[FLAGS]=140|flags,resetPreOrderHookFlags(lView),lView[PARENT]=lView[DECLARATION_VIEW]=parentLView,lView[CONTEXT]=context,lView[RENDERER_FACTORY]=rendererFactory||parentLView&&parentLView[RENDERER_FACTORY],ngDevMode&&assertDefined(lView[RENDERER_FACTORY],"RendererFactory is required"),lView[RENDERER]=renderer||parentLView&&parentLView[RENDERER],ngDevMode&&assertDefined(lView[RENDERER],"Renderer is required"),lView[SANITIZER]=sanitizer||parentLView&&parentLView[SANITIZER]||null,lView[INJECTOR$1]=injector||parentLView&&parentLView[INJECTOR$1]||null,lView[T_HOST]=tHostNode,ngDevMode&&function attachLViewDebug(lView){attachDebugObject(lView,new LViewDebug(lView))}(lView),lView}function createNodeAtIndex(index,type,native,name,attrs){var lView=getLView(),tView=lView[TVIEW],adjustedIndex=index+HEADER_OFFSET;ngDevMode&&assertLessThan(adjustedIndex,lView.length,"Slot should have been initialized with null"),lView[adjustedIndex]=native;var previousOrParentTNode=getPreviousOrParentTNode(),isParent=getIsParent(),tNode=tView.data[adjustedIndex];if(null==tNode){var parent_1=isParent?previousOrParentTNode:previousOrParentTNode&&previousOrParentTNode.parent,tParentNode=parent_1&&parent_1!==lView[T_HOST]?parent_1:null;tNode=tView.data[adjustedIndex]=createTNode(tParentNode,type,adjustedIndex,name,attrs)}return previousOrParentTNode&&(!isParent||null!=previousOrParentTNode.child||null===tNode.parent&&2!==previousOrParentTNode.type?isParent||(previousOrParentTNode.next=tNode):previousOrParentTNode.child=tNode),null==tView.firstChild&&(tView.firstChild=tNode),setPreviousOrParentTNode(tNode),setIsParent(!0),tNode}function assignTViewNodeToLView(tView,tParentNode,index,lView){var tNode=tView.node;return null==tNode&&(ngDevMode&&tParentNode&&assertNodeOfPossibleTypes(tParentNode,3,0),tView.node=tNode=createTNode(tParentNode,2,index,null,null)),lView[T_HOST]=tNode}function renderEmbeddedTemplate(viewToRender,tView,context){var oldView,_isParent=getIsParent(),_previousOrParentTNode=getPreviousOrParentTNode();if(512&viewToRender[FLAGS])tickRootContext(getRootContext(viewToRender));else try{setIsParent(!0),setPreviousOrParentTNode(null),oldView=enterView(viewToRender,viewToRender[T_HOST]),resetPreOrderHookFlags(viewToRender),executeTemplate(tView.template,getRenderFlags(viewToRender),context),viewToRender[TVIEW].firstTemplatePass=!1,refreshDescendantViews(viewToRender)}finally{leaveView(oldView),setIsParent(_isParent),setPreviousOrParentTNode(_previousOrParentTNode)}}function renderComponentOrTemplate(hostView,context,templateFn){var rendererFactory=hostView[RENDERER_FACTORY],oldView=enterView(hostView,hostView[T_HOST]),normalExecutionPath=!getCheckNoChangesMode(),creationModeIsActive=isCreationMode(hostView);try{normalExecutionPath&&!creationModeIsActive&&rendererFactory.begin&&rendererFactory.begin(),creationModeIsActive&&(templateFn&&executeTemplate(templateFn,1,context),refreshDescendantViews(hostView),hostView[FLAGS]&=-5),resetPreOrderHookFlags(hostView),templateFn&&executeTemplate(templateFn,2,context),refreshDescendantViews(hostView)}finally{normalExecutionPath&&!creationModeIsActive&&rendererFactory.end&&rendererFactory.end(),leaveView(oldView)}}function executeTemplate(templateFn,rf,context){ɵɵnamespaceHTML();var prevSelectedIndex=getSelectedIndex();try{setActiveHostElement(null),templateFn(rf,context)}finally{setSelectedIndex(prevSelectedIndex)}}function getRenderFlags(view){return isCreationMode(view)?1:2}function getOrCreateTView(templateFn,consts,vars,directives,pipes,viewQuery,schemas){return templateFn.ngPrivateData||(templateFn.ngPrivateData=createTView(-1,templateFn,consts,vars,directives,pipes,viewQuery,schemas))}function createTView(viewIndex,templateFn,consts,vars,directives,pipes,viewQuery,schemas){ngDevMode&&ngDevMode.tView++;var bindingStartIndex=HEADER_OFFSET+consts,initialViewLength=bindingStartIndex+vars,blueprint=function createViewBlueprint(bindingStartIndex,initialViewLength){var blueprint=new Array(initialViewLength).fill(null,0,bindingStartIndex).fill(NO_CHANGE,bindingStartIndex);return blueprint[BINDING_INDEX]=bindingStartIndex,blueprint}(bindingStartIndex,initialViewLength);return blueprint[TVIEW]={id:viewIndex,blueprint:blueprint,template:templateFn,viewQuery:viewQuery,node:null,data:blueprint.slice().fill(null,bindingStartIndex),bindingStartIndex:bindingStartIndex,viewQueryStartIndex:initialViewLength,expandoStartIndex:initialViewLength,expandoInstructions:null,firstTemplatePass:!0,staticViewQueries:!1,staticContentQueries:!1,preOrderHooks:null,preOrderCheckHooks:null,contentHooks:null,contentCheckHooks:null,viewHooks:null,viewCheckHooks:null,destroyHooks:null,cleanup:null,contentQueries:null,components:null,directiveRegistry:"function"==typeof directives?directives():directives,pipeRegistry:"function"==typeof pipes?pipes():pipes,firstChild:null,schemas:schemas}}function createError(text,token){return new Error("Renderer: "+text+" ["+stringifyForError(token)+"]")}function locateHostElement(factory,elementOrSelector){var defaultRenderer=factory.createRenderer(null,null),rNode="string"==typeof elementOrSelector?isProceduralRenderer(defaultRenderer)?defaultRenderer.selectRootElement(elementOrSelector):defaultRenderer.querySelector(elementOrSelector):elementOrSelector;if(ngDevMode&&!rNode)throw createError("string"==typeof elementOrSelector?"Host node with selector not found:":"Host node is required:",elementOrSelector);return rNode}function createTNode(tParent,type,adjustedIndex,tagName,attrs){return ngDevMode&&ngDevMode.tNode++,{type:type,index:adjustedIndex,injectorIndex:tParent?tParent.injectorIndex:-1,directiveStart:-1,directiveEnd:-1,propertyMetadataStartIndex:-1,propertyMetadataEndIndex:-1,flags:0,providerIndexes:0,tagName:tagName,attrs:attrs,localNames:null,initialInputs:void 0,inputs:void 0,outputs:void 0,tViews:null,next:null,projectionNext:null,child:null,parent:tParent,stylingTemplate:null,projection:null,onElementCreationFns:null}}function invokeHostBindingsInCreationMode(def,expando,directive,tNode,firstTemplatePass){var previousExpandoLength=expando.length;setCurrentDirectiveDef(def);var elementIndex=tNode.index-HEADER_OFFSET;def.hostBindings(1,directive,elementIndex),setCurrentDirectiveDef(null),previousExpandoLength===expando.length&&firstTemplatePass&&expando.push(def.hostBindings)}function generateExpandoInstructionBlock(tView,tNode,directiveCount){ngDevMode&&assertEqual(tView.firstTemplatePass,!0,"Expando block should only be generated on first template pass.");var elementIndex=-(tNode.index-HEADER_OFFSET),providerStartIndex=65535&tNode.providerIndexes,providerCount=tView.data.length-providerStartIndex;(tView.expandoInstructions||(tView.expandoInstructions=[])).push(elementIndex,providerCount,directiveCount)}function postProcessBaseDirective(lView,previousOrParentTNode,directive){var native=getNativeByTNode(previousOrParentTNode,lView);ngDevMode&&assertEqual(lView[BINDING_INDEX],lView[TVIEW].bindingStartIndex,"directives should be created before any bindings"),ngDevMode&&assertPreviousIsParent(getIsParent()),attachPatchData(directive,lView),native&&attachPatchData(native,lView)}function queueComponentIndexForCheck(previousOrParentTNode){var tView=getLView()[TVIEW];ngDevMode&&assertEqual(tView.firstTemplatePass,!0,"Should only be called in first template pass."),(tView.components||(tView.components=[])).push(previousOrParentTNode.index)}function initNodeFlags(tNode,index,numberOfDirectives){var flags=tNode.flags;ngDevMode&&assertEqual(0===flags||1===flags,!0,"expected node flags to not be initialized"),ngDevMode&&assertNotEqual(numberOfDirectives,tNode.directiveEnd-tNode.directiveStart,"Reached the max number of directives"),tNode.flags=1&flags,tNode.directiveStart=index,tNode.directiveEnd=index+numberOfDirectives,tNode.providerIndexes=index}function baseResolveDirective(tView,viewData,def,directiveFactory){tView.data.push(def);var nodeInjectorFactory=new NodeInjectorFactory(directiveFactory,isComponentDef(def),null);tView.blueprint.push(nodeInjectorFactory),viewData.push(nodeInjectorFactory)}function componentRefresh(adjustedElementIndex){var lView=getLView();ngDevMode&&assertDataInRange(lView,adjustedElementIndex);var hostView=getComponentViewByIndex(adjustedElementIndex,lView);ngDevMode&&assertNodeType(lView[TVIEW].data[adjustedElementIndex],3),(function viewAttachedToChangeDetector(view){return 128==(128&view[FLAGS])}(hostView)||isCreationMode(lView))&&80&hostView[FLAGS]&&(!function syncViewWithBlueprint(componentView){for(var componentTView=componentView[TVIEW],i=componentView.length;i<componentTView.blueprint.length;i++)componentView[i]=componentTView.blueprint[i]}(hostView),checkView(hostView,hostView[CONTEXT]))}function addToViewTree(lView,lViewOrLContainer){return lView[CHILD_HEAD]?lView[CHILD_TAIL][NEXT]=lViewOrLContainer:lView[CHILD_HEAD]=lViewOrLContainer,lView[CHILD_TAIL]=lViewOrLContainer,lViewOrLContainer}function markViewDirty(lView){for(;lView;){lView[FLAGS]|=64;var parent_2=getLViewParent(lView);if(isRootView(lView)&&!parent_2)return lView;lView=parent_2}return null}function scheduleTick(rootContext,flags){var res_1,nothingScheduled=0===rootContext.flags;(rootContext.flags|=flags,nothingScheduled&&rootContext.clean==_CLEAN_PROMISE)&&(rootContext.clean=new Promise(function(r){return res_1=r}),rootContext.scheduler(function(){if(1&rootContext.flags&&(rootContext.flags&=-2,tickRootContext(rootContext)),2&rootContext.flags){rootContext.flags&=-3;var playerHandler=rootContext.playerHandler;playerHandler&&playerHandler.flushPlayers()}rootContext.clean=_CLEAN_PROMISE,res_1(null)}))}function tickRootContext(rootContext){for(var i=0;i<rootContext.components.length;i++){var rootComponent=rootContext.components[i];renderComponentOrTemplate(readPatchedLView(rootComponent),rootComponent)}}function detectChangesInternal(view,context){var rendererFactory=view[RENDERER_FACTORY];rendererFactory.begin&&rendererFactory.begin();try{isCreationMode(view)&&checkView(view,context),checkView(view,context)}catch(error){throw handleError(view,error),error}finally{rendererFactory.end&&rendererFactory.end()}}function detectChangesInRootView(lView){tickRootContext(lView[CONTEXT])}function checkView(hostView,component){var hostTView=hostView[TVIEW],oldView=enterView(hostView,hostView[T_HOST]),templateFn=hostTView.template,creationMode=isCreationMode(hostView);try{resetPreOrderHookFlags(hostView),creationMode&&executeViewQueryFn(1,hostTView,component),executeTemplate(templateFn,getRenderFlags(hostView),component),refreshDescendantViews(hostView),creationMode&&!hostTView.staticViewQueries||executeViewQueryFn(2,hostTView,component)}finally{leaveView(oldView)}}function executeViewQueryFn(flags,tView,component){var viewQuery=tView.viewQuery;viewQuery&&(setCurrentQueryIndex(tView.viewQueryStartIndex),viewQuery(flags,component))}var CLEAN_PROMISE=_CLEAN_PROMISE;function getCleanup(view){return view[CLEANUP]||(view[CLEANUP]=[])}function getTViewCleanup(view){return view[TVIEW].cleanup||(view[TVIEW].cleanup=[])}function handleError(lView,error){var injector=lView[INJECTOR$1],errorHandler=injector?injector.get(ErrorHandler,null):null;errorHandler&&errorHandler.handleError(error)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function applyOnCreateInstructions(tNode){var fns;if(fns=tNode.onElementCreationFns){for(var i=0;i<fns.length;i++)fns[i]();tNode.onElementCreationFns=null}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function getLContainer(tNode,embeddedView){ngDevMode&&assertLView(embeddedView);var container=embeddedView[PARENT];return-1===tNode.index?isLContainer(container)?container:null:(ngDevMode&&assertLContainer(container),container)}var projectionNodeStack=[];function walkTNodeTree(viewToWalk,action,renderer,renderParent,beforeNode){for(var e_1,_a,rootTNode=viewToWalk[TVIEW].node,projectionNodeIndex=-1,currentView=viewToWalk,tNode=rootTNode.child;tNode;){var nextTNode=null;if(3===tNode.type||4===tNode.type){executeNodeAction(action,renderer,renderParent,getNativeByTNode(tNode,currentView),tNode,beforeNode);var nodeOrContainer=currentView[tNode.index];isLContainer(nodeOrContainer)&&(executeNodeAction(action,renderer,renderParent,nodeOrContainer[NATIVE],tNode,beforeNode),nodeOrContainer[VIEWS].length&&(nextTNode=(currentView=nodeOrContainer[VIEWS][0])[TVIEW].node,beforeNode=nodeOrContainer[NATIVE]))}else if(0===tNode.type){var lContainer=currentView[tNode.index];executeNodeAction(action,renderer,renderParent,lContainer[NATIVE],tNode,beforeNode),lContainer[VIEWS].length&&(nextTNode=(currentView=lContainer[VIEWS][0])[TVIEW].node,beforeNode=lContainer[NATIVE])}else if(1===tNode.type){var componentView=findComponentView(currentView),head=componentView[T_HOST].projection[tNode.projection];if(Array.isArray(head))try{for(var head_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(head),head_1_1=head_1.next();!head_1_1.done;head_1_1=head_1.next()){executeNodeAction(action,renderer,renderParent,head_1_1.value,tNode,beforeNode)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{head_1_1&&!head_1_1.done&&(_a=head_1.return)&&_a.call(head_1)}finally{if(e_1)throw e_1.error}}else projectionNodeStack[++projectionNodeIndex]=tNode,projectionNodeStack[++projectionNodeIndex]=currentView,head&&(nextTNode=(currentView=componentView[PARENT])[TVIEW].data[head.index])}else nextTNode=tNode.child;if(null===nextTNode)for(null===tNode.projectionNext&&2&tNode.flags&&(currentView=projectionNodeStack[projectionNodeIndex--],tNode=projectionNodeStack[projectionNodeIndex--]),nextTNode=2&tNode.flags?tNode.projectionNext:4===tNode.type&&tNode.child||tNode.next;!nextTNode;){if(null===(tNode=tNode.parent||currentView[T_HOST])||tNode===rootTNode)return;if(0===tNode.type&&(beforeNode=(currentView=getLViewParent(currentView))[tNode.index][NATIVE]),2===tNode.type){for(;!currentView[NEXT]&&currentView[PARENT]&&(!tNode.parent||!tNode.parent.next);){if(tNode===rootTNode)return;if(isLContainer(currentView=currentView[PARENT])){tNode=currentView[T_HOST],beforeNode=(currentView=currentView[PARENT])[tNode.index][NATIVE];break}tNode=currentView[T_HOST]}nextTNode=currentView[NEXT]?(currentView=currentView[NEXT])[T_HOST]:4===tNode.type&&tNode.child||tNode.next}else nextTNode=tNode.next}tNode=nextTNode}}function executeNodeAction(action,renderer,parent,node,tNode,beforeNode){0===action?nativeInsertBefore(renderer,parent,node,beforeNode||null):1===action?nativeRemoveNode(renderer,node,isComponent(tNode)):2===action&&(ngDevMode&&ngDevMode.rendererDestroyNode++,renderer.destroyNode(node))}function insertView(lView,lContainer,index){ngDevMode&&assertLView(lView),ngDevMode&&assertLContainer(lContainer);var views=lContainer[VIEWS];ngDevMode&&assertDefined(views,"Container must have views"),index>0&&(views[index-1][NEXT]=lView),index<views.length?(lView[NEXT]=views[index],views.splice(index,0,lView)):(views.push(lView),lView[NEXT]=null),lView[PARENT]=lContainer,lView[QUERIES]&&lView[QUERIES].insertView(index),lView[FLAGS]|=128}function destroyLView(view){if(!(256&view[FLAGS])){var renderer=view[RENDERER];isProceduralRenderer(renderer)&&renderer.destroyNode&&walkTNodeTree(view,2,renderer,null),function destroyViewTree(rootView){var lViewOrLContainer=rootView[CHILD_HEAD];if(!lViewOrLContainer)return cleanUpView(rootView);for(;lViewOrLContainer;){var next=null;if(isLView(lViewOrLContainer))next=lViewOrLContainer[CHILD_HEAD];else{ngDevMode&&assertLContainer(lViewOrLContainer);var views=lViewOrLContainer[VIEWS];views.length>0&&(next=views[0])}if(!next){for(;lViewOrLContainer&&!lViewOrLContainer[NEXT]&&lViewOrLContainer!==rootView;)cleanUpView(lViewOrLContainer),lViewOrLContainer=getParentState(lViewOrLContainer,rootView);cleanUpView(lViewOrLContainer||rootView),next=lViewOrLContainer&&lViewOrLContainer[NEXT]}lViewOrLContainer=next}}(view)}}function getParentState(lViewOrLContainer,rootView){var tNode;return isLView(lViewOrLContainer)&&(tNode=lViewOrLContainer[T_HOST])&&2===tNode.type?getLContainer(tNode,lViewOrLContainer):lViewOrLContainer[PARENT]===rootView?null:lViewOrLContainer[PARENT]}function cleanUpView(view){if(isLView(view)&&!(256&view[FLAGS])){view[FLAGS]&=-129,view[FLAGS]|=256,function executeOnDestroys(view){var destroyHooks,tView=view[TVIEW];if(null!=tView&&null!=(destroyHooks=tView.destroyHooks))for(var i=0;i<destroyHooks.length;i+=2){var context=view[destroyHooks[i]];context instanceof NodeInjectorFactory||destroyHooks[i+1].call(context)}}(view),function removeListeners(lView){var tCleanup=lView[TVIEW].cleanup;if(null!=tCleanup){for(var lCleanup=lView[CLEANUP],i=0;i<tCleanup.length-1;i+=2)if("string"==typeof tCleanup[i]){var idxOrTargetGetter=tCleanup[i+1],target="function"==typeof idxOrTargetGetter?idxOrTargetGetter(lView):unwrapRNode(lView[idxOrTargetGetter]),listener=lCleanup[tCleanup[i+2]],useCaptureOrSubIdx=tCleanup[i+3];"boolean"==typeof useCaptureOrSubIdx?target.removeEventListener(tCleanup[i],listener,useCaptureOrSubIdx):useCaptureOrSubIdx>=0?lCleanup[useCaptureOrSubIdx]():lCleanup[-useCaptureOrSubIdx].unsubscribe(),i+=2}else{var context=lCleanup[tCleanup[i+1]];tCleanup[i].call(context)}lView[CLEANUP]=null}}(view);var hostTNode=view[T_HOST];hostTNode&&3===hostTNode.type&&isProceduralRenderer(view[RENDERER])&&(ngDevMode&&ngDevMode.rendererDestroy++,view[RENDERER].destroy()),viewAttachedToContainer(view)&&view[QUERIES]&&view[QUERIES].removeView()}}function nativeInsertBefore(renderer,parent,child,beforeNode){isProceduralRenderer(renderer)?renderer.insertBefore(parent,child,beforeNode):parent.insertBefore(child,beforeNode,!0)}function nativeParentNode(renderer,node){return isProceduralRenderer(renderer)?renderer.parentNode(node):node.parentNode}function nativeRemoveNode(renderer,rNode,isHostElement){var nativeParent=nativeParentNode(renderer,rNode);nativeParent&&function nativeRemoveChild(renderer,parent,child,isHostElement){isProceduralRenderer(renderer)?renderer.removeChild(parent,child,isHostElement):parent.removeChild(child)}(renderer,nativeParent,rNode,isHostElement)}function ɵɵelementHostStyling(classBindingNames,styleBindingNames,styleSanitizer){var tNode=getPreviousOrParentTNode();tNode.stylingTemplate||(tNode.stylingTemplate=createEmptyStylingContext());var directiveStylingIndex=getActiveDirectiveStylingIndex();allocateOrUpdateDirectiveIntoContext(tNode.stylingTemplate,directiveStylingIndex),(tNode.onElementCreationFns=tNode.onElementCreationFns||[]).push(function(){initElementStyling(tNode,classBindingNames,styleBindingNames,styleSanitizer,directiveStylingIndex),function registerHostDirective(context,directiveIndex){var buffer=context[8];buffer||(buffer=context[8]=[DEFAULT_TEMPLATE_DIRECTIVE_INDEX]),buffer[0]=directiveIndex}(tNode.stylingTemplate,directiveStylingIndex)})}function initElementStyling(tNode,classBindingNames,styleBindingNames,styleSanitizer,directiveStylingIndex){updateContextWithBindings(tNode.stylingTemplate,directiveStylingIndex,classBindingNames,styleBindingNames,styleSanitizer)}function ɵɵelementHostStylingMap(classes,styles){var directiveStylingIndex=getActiveDirectiveStylingIndex(),stylingContext=getStylingContext(getSelectedIndex(),getLView());enqueueHostInstruction(stylingContext,directiveStylingIndex,updateStylingMap,[stylingContext,classes,styles,directiveStylingIndex])}function ɵɵelementHostStylingApply(){elementStylingApplyInternal(getActiveDirectiveStylingIndex(),getSelectedIndex())}function elementStylingApplyInternal(directiveStylingIndex,index){var lView=getLView(),renderer=3===getTNode(index,lView).type?lView[RENDERER]:null,isFirstRender=0!=(8&lView[FLAGS]);renderStyling(getStylingContext(index,lView),renderer,lView,isFirstRender,null,null,directiveStylingIndex)>0&&scheduleTick(getRootContext(lView),2);setCachedStylingContext(null)}function getActiveDirectiveStylingIndex(){return function getActiveDirectiveId(){return activeDirectiveId}()+function getActiveDirectiveSuperClassDepth(){return activeDirectiveSuperClassDepthPosition}()}function getStylingContext(index,lView){var context=function getCachedStylingContext(){return stylingContext}();if(context){if(ngDevMode){assertEqual(context,getStylingContextFromLView(index+HEADER_OFFSET,lView),"The cached styling context is invalid")}}else setCachedStylingContext(context=getStylingContextFromLView(index+HEADER_OFFSET,lView));return context}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function isPromise(obj){return!!obj&&"function"==typeof obj.then}function isObservable(obj){return!!obj&&"function"==typeof obj.subscribe}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var _symbolIterator=null;function getSymbolIterator(){Eif(!_symbolIterator){var Symbol_1=_global.Symbol;Eif(Symbol_1&&Symbol_1.iterator)_symbolIterator=Symbol_1.iterator;else for(var keys=Object.getOwnPropertyNames(Map.prototype),i=0;i<keys.length;++i){var key=keys[i];"entries"!==key&&"size"!==key&&Map.prototype[key]===Map.prototype.entries&&(_symbolIterator=key)}}return _symbolIterator}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function looseIdentical(a,b){return a===b||"number"==typeof a&&"number"==typeof b&&isNaN(a)&&isNaN(b)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function devModeEqual(a,b){var isListLikeIterableA=isListLikeIterable(a),isListLikeIterableB=isListLikeIterable(b);return isListLikeIterableA&&isListLikeIterableB?function areIterablesEqual(a,b,comparator){var iterator1=a[getSymbolIterator()](),iterator2=b[getSymbolIterator()]();for(;;){var item1=iterator1.next(),item2=iterator2.next();if(item1.done&&item2.done)return!0;if(item1.done||item2.done)return!1;if(!comparator(item1.value,item2.value))return!1}}(a,b,devModeEqual):!(isListLikeIterableA||!(a&&("object"==typeof a||"function"==typeof a))||isListLikeIterableB||!(b&&("object"==typeof b||"function"==typeof b)))||looseIdentical(a,b)}var WrappedValue=function(){function WrappedValue(value){this.wrapped=value}return WrappedValue.wrap=function(value){return new WrappedValue(value)},WrappedValue.unwrap=function(value){return WrappedValue.isWrapped(value)?value.wrapped:value},WrappedValue.isWrapped=function(value){return value instanceof WrappedValue},WrappedValue}();function isListLikeIterable(obj){return!!isJsObject(obj)&&(Array.isArray(obj)||!(obj instanceof Map)&&getSymbolIterator()in obj)}function isJsObject(o){return null!==o&&("function"==typeof o||"object"==typeof o)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function getComponent(element){var context=loadLContextFromNode(element);return void 0===context.component&&(context.component=function getComponentAtNodeIndex(nodeIndex,lView){var tNode=lView[TVIEW].data[nodeIndex],directiveStartIndex=tNode.directiveStart;return 1&tNode.flags?lView[directiveStartIndex]:null}(context.nodeIndex,context.lView)),context.component}function getContext(element){return loadLContextFromNode(element).lView[CONTEXT]}function getViewComponent(element){var parent,lView=loadLContext(element).lView;for(ngDevMode&&assertLView(lView);null===lView[HOST]&&(parent=getLViewParent(lView));)lView=parent;return 512&lView[FLAGS]?null:lView[CONTEXT]}function getInjector(target){var context=loadLContext(target),tNode=context.lView[TVIEW].data[context.nodeIndex];return new NodeInjector(tNode,context.lView)}function loadLContext(target,throwOnNotFound){void 0===throwOnNotFound&&(throwOnNotFound=!0);var context=getLContext(target);if(!context&&throwOnNotFound)throw new Error(ngDevMode?"Unable to find context associated with "+stringifyForError(target):"Invalid ng target");return context}function getLocalRefs(target){var context=loadLContext(target);return void 0===context.localRefs&&(context.localRefs=function discoverLocalRefs(lView,nodeIndex){var tNode=lView[TVIEW].data[nodeIndex];if(tNode&&tNode.localNames){for(var result={},localIndex=tNode.index+1,i=0;i<tNode.localNames.length;i+=2)result[tNode.localNames[i]]=lView[localIndex],localIndex++;return result}return null}(context.lView,context.nodeIndex)),context.localRefs||{}}function loadLContextFromNode(node){if(!(node instanceof Node))throw new Error("Expecting instance of DOM Node");return loadLContext(node)}function isBrowserEvents(listener){return"boolean"==typeof listener.useCapture}function getListeners(element){var lView=loadLContextFromNode(element).lView,tView=lView[TVIEW],lCleanup=lView[CLEANUP],tCleanup=tView.cleanup,listeners=[];if(tCleanup&&lCleanup)for(var i=0;i<tCleanup.length;){var firstParam=tCleanup[i++],secondParam=tCleanup[i++];if("string"==typeof firstParam){var name_1=firstParam,listenerElement=unwrapRNode(lView[secondParam]),callback=lCleanup[tCleanup[i++]],useCaptureOrIndx=tCleanup[i++],useCapture="boolean"==typeof useCaptureOrIndx?useCaptureOrIndx:!(useCaptureOrIndx>=0)&&null;element==listenerElement&&listeners.push({element:element,name:name_1,callback:callback,useCapture:useCapture})}}return listeners.sort(sortListeners),listeners}function sortListeners(a,b){return a.name==b.name?0:a.name<b.name?-1:1}function createRootComponentView(rNode,def,rootView,rendererFactory,renderer,sanitizer){!function resetComponentState(){isParent=!1,previousOrParentTNode=null,0,!0}();var tView=rootView[TVIEW],tNode=createNodeAtIndex(0,3,rNode,null,null),componentView=createLView(rootView,getOrCreateTView(def.template,def.consts,def.vars,def.directiveDefs,def.pipeDefs,def.viewQuery,def.schemas),null,def.onPush?64:16,rootView[HEADER_OFFSET],tNode,rendererFactory,renderer,sanitizer);return tView.firstTemplatePass&&(diPublicInInjector(getOrCreateNodeInjectorForNode(tNode,rootView),rootView,def.type),tNode.flags=1,initNodeFlags(tNode,rootView.length,1),queueComponentIndexForCheck(tNode)),rootView[HEADER_OFFSET]=componentView}function createRootComponent(componentView,componentDef,rootView,rootContext,hostFeatures){var tView=rootView[TVIEW],component=function instantiateRootComponent(tView,viewData,def){var rootTNode=getPreviousOrParentTNode();tView.firstTemplatePass&&(def.providersResolver&&def.providersResolver(def),generateExpandoInstructionBlock(tView,rootTNode,1),baseResolveDirective(tView,viewData,def,def.factory));var directive=getNodeInjectable(tView.data,viewData,viewData.length-1,rootTNode);return postProcessBaseDirective(viewData,rootTNode,directive),directive}(tView,rootView,componentDef);rootContext.components.push(component),componentView[CONTEXT]=component,hostFeatures&&hostFeatures.forEach(function(feature){return feature(component,componentDef)}),componentDef.contentQueries&&componentDef.contentQueries(1,component,rootView.length-1);var rootTNode=getPreviousOrParentTNode();if(tView.firstTemplatePass&&componentDef.hostBindings){setActiveHostElement(rootTNode.index-HEADER_OFFSET);var expando=tView.expandoInstructions;invokeHostBindingsInCreationMode(componentDef,expando,component,rootTNode,tView.firstTemplatePass),rootTNode.onElementCreationFns&&applyOnCreateInstructions(rootTNode),setActiveHostElement(null)}if(rootTNode.stylingTemplate){var native=componentView[HOST];renderInitialClasses(native,rootTNode.stylingTemplate,componentView[RENDERER]),renderInitialStyles(native,rootTNode.stylingTemplate,componentView[RENDERER])}return component}function createRootContext(scheduler,playerHandler){return{components:[],scheduler:scheduler||defaultScheduler,clean:CLEAN_PROMISE,playerHandler:playerHandler||null,flags:0}}function LifecycleHooksFeature(component,def){var rootTView=readPatchedLView(component)[TVIEW],dirIndex=rootTView.data.length-1;registerPreOrderHooks(dirIndex,def,rootTView,-1,-1,-1),registerPostOrderHooks(rootTView,{directiveStart:dirIndex,directiveEnd:dirIndex+1})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var SimpleChange=function(){function SimpleChange(previousValue,currentValue,firstChange){this.previousValue=previousValue,this.currentValue=currentValue,this.firstChange=firstChange}return SimpleChange.prototype.isFirstChange=function(){return this.firstChange},SimpleChange}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var APP_ROOT=new InjectionToken("The presence of this token marks an injector as being the root injector."),NOT_YET={},CIRCULAR$1={},EMPTY_ARRAY$2=[],NULL_INJECTOR=void 0;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function getNullInjector(){return void 0===NULL_INJECTOR&&(NULL_INJECTOR=new NullInjector),NULL_INJECTOR}var R3Injector=function(){function R3Injector(def,additionalProviders,parent,source){var _this=this;void 0===source&&(source=null),this.parent=parent,this.records=new Map,this.injectorDefTypes=new Set,this.onDestroy=new Set,this._destroyed=!1;var dedupStack=[];deepForEach([def],function(injectorDef){return _this.processInjectorType(injectorDef,[],dedupStack)}),additionalProviders&&deepForEach(additionalProviders,function(provider){return _this.processProvider(provider,def,additionalProviders)}),this.records.set(INJECTOR,makeRecord(void 0,this)),this.isRootInjector=this.records.has(APP_ROOT),this.injectorDefTypes.forEach(function(defType){return _this.get(defType)}),this.source=source||(def instanceof Array?null:stringify(def))}return Object.defineProperty(R3Injector.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),R3Injector.prototype.destroy=function(){this.assertNotDestroyed(),this._destroyed=!0;try{this.onDestroy.forEach(function(service){return service.ngOnDestroy()})}finally{this.records.clear(),this.onDestroy.clear(),this.injectorDefTypes.clear()}},R3Injector.prototype.get=function(token,notFoundValue,flags){void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND),void 0===flags&&(flags=InjectFlags.Default),this.assertNotDestroyed();var previousInjector=setCurrentInjector(this);try{if(!(flags&InjectFlags.SkipSelf)){var record=this.records.get(token);if(void 0===record){var def=function couldBeInjectableType(value){return"function"==typeof value||"object"==typeof value&&value instanceof InjectionToken}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(token)&&getInjectableDef(token);def&&this.injectableDefInScope(def)&&(record=makeRecord(injectableDefOrInjectorDefFactory(token),NOT_YET),this.records.set(token,record))}if(void 0!==record)return this.hydrate(token,record)}return(flags&InjectFlags.Self?getNullInjector():this.parent).get(token,flags&InjectFlags.Optional?null:notFoundValue)}catch(e){if("NullInjectorError"===e.name){if((e[NG_TEMP_TOKEN_PATH]=e[NG_TEMP_TOKEN_PATH]||[]).unshift(stringify(token)),previousInjector)throw e;return catchInjectorError(e,token,"R3InjectorError",this.source)}throw e}finally{setCurrentInjector(previousInjector)}},R3Injector.prototype.assertNotDestroyed=function(){if(this._destroyed)throw new Error("Injector has already been destroyed.")},R3Injector.prototype.processInjectorType=function(defOrWrappedDef,parents,dedupStack){var _this=this;if(defOrWrappedDef=resolveForwardRef(defOrWrappedDef)){var def=getInjectorDef(defOrWrappedDef),ngModule=null==def&&defOrWrappedDef.ngModule||void 0,defType=void 0===ngModule?defOrWrappedDef:ngModule;if(ngDevMode&&-1!==parents.indexOf(defType)){var defName=stringify(defType);throw new Error("Circular dependency in DI detected for type "+defName+". Dependency path: "+parents.map(function(defType){return stringify(defType)}).join(" > ")+" > "+defName+".")}var isDuplicate=-1!==dedupStack.indexOf(defType),providers=void 0!==ngModule&&defOrWrappedDef.providers||EMPTY_ARRAY$2;if(void 0!==ngModule&&(def=getInjectorDef(ngModule)),null!=def){if(this.injectorDefTypes.add(defType),this.records.set(defType,makeRecord(def.factory,NOT_YET)),null!=def.imports&&!isDuplicate){ngDevMode&&parents.push(defType),dedupStack.push(defType);try{deepForEach(def.imports,function(imported){return _this.processInjectorType(imported,parents,dedupStack)})}finally{ngDevMode&&parents.pop()}}var defProviders=def.providers;if(null!=defProviders&&!isDuplicate){var injectorType_1=defOrWrappedDef;deepForEach(defProviders,function(provider){return _this.processProvider(provider,injectorType_1,defProviders)})}var ngModuleType=defOrWrappedDef.ngModule;deepForEach(providers,function(provider){return _this.processProvider(provider,ngModuleType,providers)})}}},R3Injector.prototype.processProvider=function(provider,ngModuleType,providers){var token=isTypeProvider(provider=resolveForwardRef(provider))?provider:resolveForwardRef(provider&&provider.provide),record=function providerToRecord(provider,ngModuleType,providers){var factory=providerToFactory(provider,ngModuleType,providers);return isValueProvider(provider)?makeRecord(void 0,provider.useValue):makeRecord(factory,NOT_YET)}(provider,ngModuleType,providers);if(isTypeProvider(provider)||!0!==provider.multi){var existing=this.records.get(token);if(existing&&void 0!==existing.multi)throw new Error("Mixed multi-provider for "+stringify(token))}else{var multiRecord_1=this.records.get(token);if(multiRecord_1){if(void 0===multiRecord_1.multi)throw new Error("Mixed multi-provider for "+token+".")}else(multiRecord_1=makeRecord(void 0,NOT_YET,!0)).factory=function(){return injectArgs(multiRecord_1.multi)},this.records.set(token,multiRecord_1);token=provider,multiRecord_1.multi.push(provider)}this.records.set(token,record)},R3Injector.prototype.hydrate=function(token,record){if(record.value===CIRCULAR$1)throw new Error("Cannot instantiate cyclic dependency! "+stringify(token));return record.value===NOT_YET&&(record.value=CIRCULAR$1,record.value=record.factory()),"object"==typeof record.value&&record.value&&function hasOnDestroy(value){return null!==value&&"object"==typeof value&&"function"==typeof value.ngOnDestroy}(record.value)&&this.onDestroy.add(record.value),record.value},R3Injector.prototype.injectableDefInScope=function(def){return!!def.providedIn&&("string"==typeof def.providedIn?"any"===def.providedIn||"root"===def.providedIn&&this.isRootInjector:this.injectorDefTypes.has(def.providedIn))},R3Injector}();function injectableDefOrInjectorDefFactory(token){var injectableDef=getInjectableDef(token);if(null===injectableDef){var injectorDef=getInjectorDef(token);if(null!==injectorDef)return injectorDef.factory;if(token instanceof InjectionToken)throw new Error("Token "+stringify(token)+" is missing an ngInjectableDef definition.");if(token instanceof Function){var paramLength=token.length;if(paramLength>0){var args=new Array(paramLength).fill("?");throw new Error("Can't resolve all parameters for "+stringify(token)+": ("+args.join(", ")+").")}return function(){return new token}}throw new Error("unreachable")}return injectableDef.factory}function providerToFactory(provider,ngModuleType,providers){var factory=void 0;if(isTypeProvider(provider))return injectableDefOrInjectorDefFactory(resolveForwardRef(provider));if(isValueProvider(provider))factory=function(){return resolveForwardRef(provider.useValue)};else if(function isExistingProvider(value){return!(!value||!value.useExisting)}(provider))factory=function(){return ɵɵinject(resolveForwardRef(provider.useExisting))};else if(function isFactoryProvider(value){return!(!value||!value.useFactory)}(provider))factory=function(){return provider.useFactory.apply(provider,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(injectArgs(provider.deps||[])))};else{var classRef_1=resolveForwardRef(provider&&(provider.useClass||provider.provide));if(!classRef_1){var ngModuleDetail="";if(ngModuleType&&providers)ngModuleDetail=" - only instances of Provider and Type are allowed, got: ["+providers.map(function(v){return v==provider?"?"+provider+"?":"..."}).join(", ")+"]";throw new Error("Invalid provider for the NgModule '"+stringify(ngModuleType)+"'"+ngModuleDetail)}if(!function hasDeps(value){return!!value.deps}(provider))return injectableDefOrInjectorDefFactory(classRef_1);factory=function(){return new(classRef_1.bind.apply(classRef_1,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],injectArgs(provider.deps))))}}return factory}function makeRecord(factory,value,multi){return void 0===multi&&(multi=!1),{factory:factory,value:value,multi:multi?[]:void 0}}function deepForEach(input,fn){input.forEach(function(value){return Array.isArray(value)?deepForEach(value,fn):fn(value)})}function isValueProvider(value){return null!==value&&"object"==typeof value&&USE_VALUE$2 in value}function isTypeProvider(value){return"function"==typeof value}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ComponentRef=function ComponentRef(){},ComponentFactory=function ComponentFactory(){};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function noComponentFactoryError(component){var error=Error("No component factory found for "+stringify(component)+". Did you add it to @NgModule.entryComponents?");return error[ERROR_COMPONENT]=component,error}var R3ElementRef,R3TemplateRef,ERROR_COMPONENT="ngComponent",_NullComponentFactoryResolver=function(){function _NullComponentFactoryResolver(){}return _NullComponentFactoryResolver.prototype.resolveComponentFactory=function(component){throw noComponentFactoryError(component)},_NullComponentFactoryResolver}(),ComponentFactoryResolver=function(){function ComponentFactoryResolver(){}return ComponentFactoryResolver.NULL=new _NullComponentFactoryResolver,ComponentFactoryResolver}(),CodegenComponentFactoryResolver=function(){function CodegenComponentFactoryResolver(factories,_parent,_ngModule){this._parent=_parent,this._ngModule=_ngModule,this._factories=new Map;for(var i=0;i<factories.length;i++){var factory=factories[i];this._factories.set(factory.componentType,factory)}}return CodegenComponentFactoryResolver.prototype.resolveComponentFactory=function(component){var factory=this._factories.get(component);Iif(!factory&&this._parent&&(factory=this._parent.resolveComponentFactory(component)),!factory)throw noComponentFactoryError(component);return new ComponentFactoryBoundToModule(factory,this._ngModule)},CodegenComponentFactoryResolver}(),ComponentFactoryBoundToModule=function(_super){function ComponentFactoryBoundToModule(factory,ngModule){var _this=_super.call(this)||this;return _this.factory=factory,_this.ngModule=ngModule,_this.selector=factory.selector,_this.componentType=factory.componentType,_this.ngContentSelectors=factory.ngContentSelectors,_this.inputs=factory.inputs,_this.outputs=factory.outputs,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentFactoryBoundToModule,_super),ComponentFactoryBoundToModule.prototype.create=function(injector,projectableNodes,rootSelectorOrNode,ngModule){return this.factory.create(injector,projectableNodes,rootSelectorOrNode,ngModule||this.ngModule)},ComponentFactoryBoundToModule}(ComponentFactory),NgModuleRef=function NgModuleRef(){},NgModuleFactory=function NgModuleFactory(){},ViewRef=function(){function ViewRef(_lView,_context,_componentIndex){this._context=_context,this._componentIndex=_componentIndex,this._appRef=null,this._viewContainerRef=null,this._tViewNode=null,this._lView=_lView}return Object.defineProperty(ViewRef.prototype,"rootNodes",{get:function(){if(null==this._lView[HOST]){var tView=this._lView[T_HOST];return function collectNativeNodes(lView,parentTNode,result){var tNodeChild=parentTNode.child;for(;tNodeChild;){var nativeNode=getNativeByTNode(tNodeChild,lView);if(nativeNode&&result.push(nativeNode),4===tNodeChild.type)collectNativeNodes(lView,tNodeChild,result);else if(1===tNodeChild.type)for(var componentView=findComponentView(lView),componentHost=componentView[T_HOST],parentView=getLViewParent(componentView),currentProjectedNode=componentHost.projection[tNodeChild.projection];currentProjectedNode&&parentView;)result.push(getNativeByTNode(currentProjectedNode,parentView)),currentProjectedNode=currentProjectedNode.next;tNodeChild=tNodeChild.next}return result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(this._lView,tView,[])}return[]},enumerable:!0,configurable:!0}),Object.defineProperty(ViewRef.prototype,"context",{get:function(){return this._context?this._context:this._lookUpContext()},enumerable:!0,configurable:!0}),Object.defineProperty(ViewRef.prototype,"destroyed",{get:function(){return 256==(256&this._lView[FLAGS])},enumerable:!0,configurable:!0}),ViewRef.prototype.destroy=function(){if(this._appRef)this._appRef.detachView(this);else if(this._viewContainerRef){var index=this._viewContainerRef.indexOf(this);index>-1&&this._viewContainerRef.detach(index),this._viewContainerRef=null}destroyLView(this._lView)},ViewRef.prototype.onDestroy=function(callback){!function storeCleanupFn(view,cleanupFn){getCleanup(view).push(cleanupFn),view[TVIEW].firstTemplatePass&&getTViewCleanup(view).push(view[CLEANUP].length-1,null)}(this._lView,callback)},ViewRef.prototype.markForCheck=function(){markViewDirty(this._lView)},ViewRef.prototype.detach=function(){this._lView[FLAGS]&=-129},ViewRef.prototype.reattach=function(){this._lView[FLAGS]|=128},ViewRef.prototype.detectChanges=function(){detectChangesInternal(this._lView,this.context)},ViewRef.prototype.checkNoChanges=function(){!function checkNoChangesInternal(view,context){setCheckNoChangesMode(!0);try{detectChangesInternal(view,context)}finally{setCheckNoChangesMode(!1)}}(this._lView,this.context)},ViewRef.prototype.attachToViewContainerRef=function(vcRef){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=vcRef},ViewRef.prototype.detachFromAppRef=function(){this._appRef=null,function renderDetachView(lView){walkTNodeTree(lView,1,lView[RENDERER],null)}(this._lView)},ViewRef.prototype.attachToAppRef=function(appRef){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=appRef},ViewRef.prototype._lookUpContext=function(){return this._context=getLViewParent(this._lView)[this._componentIndex]},ViewRef}(),RootViewRef=function(_super){function RootViewRef(_view){var _this=_super.call(this,_view,null,-1)||this;return _this._view=_view,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(RootViewRef,_super),RootViewRef.prototype.detectChanges=function(){detectChangesInRootView(this._view)},RootViewRef.prototype.checkNoChanges=function(){!function checkNoChangesInRootView(lView){setCheckNoChangesMode(!0);try{detectChangesInRootView(lView)}finally{setCheckNoChangesMode(!1)}}(this._view)},Object.defineProperty(RootViewRef.prototype,"context",{get:function(){return null},enumerable:!0,configurable:!0}),RootViewRef}(ViewRef);function createElementRef(ElementRefToken,tNode,view){return R3ElementRef||(R3ElementRef=function(_super){function ElementRef_(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ElementRef_,_super),ElementRef_}(ElementRefToken)),new R3ElementRef(getNativeByTNode(tNode,view))}function createTemplateRef(TemplateRefToken,ElementRefToken,hostTNode,hostView){if(R3TemplateRef||(R3TemplateRef=function(_super){function TemplateRef_(_declarationParentView,elementRef,_tView,_hostLContainer,_injectorIndex){var _this=_super.call(this)||this;return _this._declarationParentView=_declarationParentView,_this.elementRef=elementRef,_this._tView=_tView,_this._hostLContainer=_hostLContainer,_this._injectorIndex=_injectorIndex,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TemplateRef_,_super),TemplateRef_.prototype.createEmbeddedView=function(context,container,index){var currentQueries=this._declarationParentView[QUERIES];currentQueries&&null==this._hostLContainer[QUERIES]&&(this._hostLContainer[QUERIES]=currentQueries.container());var lView=function createEmbeddedViewAndNode(tView,context,declarationView,queries,injectorIndex){var _isParent=getIsParent(),_previousOrParentTNode=getPreviousOrParentTNode();setIsParent(!0),setPreviousOrParentTNode(null);var lView=createLView(declarationView,tView,context,16,null,null);return lView[DECLARATION_VIEW]=declarationView,queries&&(lView[QUERIES]=queries.createView()),assignTViewNodeToLView(tView,null,-1,lView),tView.firstTemplatePass&&(tView.node.injectorIndex=injectorIndex),setIsParent(_isParent),setPreviousOrParentTNode(_previousOrParentTNode),lView}(this._tView,context,this._declarationParentView,this._hostLContainer[QUERIES],this._injectorIndex);container&&insertView(lView,container,index),renderEmbeddedTemplate(lView,this._tView,context);var viewRef=new ViewRef(lView,context,-1);return viewRef._tViewNode=lView[T_HOST],viewRef},TemplateRef_}(TemplateRefToken)),0===hostTNode.type){var hostContainer=hostView[hostTNode.index];return ngDevMode&&assertDefined(hostTNode.tViews,"TView must be allocated"),new R3TemplateRef(hostView,createElementRef(ElementRefToken,hostTNode,hostView),hostTNode.tViews,hostContainer,hostTNode.injectorIndex)}return null}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function noop(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i]}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var RendererStyleFlags2,ElementRef=function(){function ElementRef(nativeElement){this.nativeElement=nativeElement}return ElementRef.__NG_ELEMENT_ID__=function(){return SWITCH_ELEMENT_REF_FACTORY(ElementRef)},ElementRef}(),SWITCH_ELEMENT_REF_FACTORY=noop,Renderer=function Renderer(){},RendererFactory2=(new InjectionToken("Renderer2Interceptor"),function RendererFactory2(){});!function(RendererStyleFlags2){RendererStyleFlags2[RendererStyleFlags2.Important=1]="Important",RendererStyleFlags2[RendererStyleFlags2.DashCase=2]="DashCase"}(RendererStyleFlags2||(RendererStyleFlags2={}));var Renderer2=function(){function Renderer2(){}return Renderer2.__NG_ELEMENT_ID__=function(){return SWITCH_RENDERER2_FACTORY()},Renderer2}(),SWITCH_RENDERER2_FACTORY=noop,Version=function Version(full){this.full=full,this.major=full.split(".")[0],this.minor=full.split(".")[1],this.patch=full.split(".").slice(2).join(".")},VERSION=new Version("8.0.3"),DefaultIterableDifferFactory=function(){function DefaultIterableDifferFactory(){}return DefaultIterableDifferFactory.prototype.supports=function(obj){return isListLikeIterable(obj)},DefaultIterableDifferFactory.prototype.create=function(trackByFn){return new DefaultIterableDiffer(trackByFn)},DefaultIterableDifferFactory}(),trackByIdentity=function(index,item){return item},DefaultIterableDiffer=function(){function DefaultIterableDiffer(trackByFn){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=trackByFn||trackByIdentity}return DefaultIterableDiffer.prototype.forEachItem=function(fn){var record;for(record=this._itHead;null!==record;record=record._next)fn(record)},DefaultIterableDiffer.prototype.forEachOperation=function(fn){for(var nextIt=this._itHead,nextRemove=this._removalsHead,addRemoveOffset=0,moveOffsets=null;nextIt||nextRemove;){var record=!nextRemove||nextIt&&nextIt.currentIndex<getPreviousIndex(nextRemove,addRemoveOffset,moveOffsets)?nextIt:nextRemove,adjPreviousIndex=getPreviousIndex(record,addRemoveOffset,moveOffsets),currentIndex=record.currentIndex;if(record===nextRemove)addRemoveOffset--,nextRemove=nextRemove._nextRemoved;else if(nextIt=nextIt._next,null==record.previousIndex)addRemoveOffset++;else{moveOffsets||(moveOffsets=[]);var localMovePreviousIndex=adjPreviousIndex-addRemoveOffset,localCurrentIndex=currentIndex-addRemoveOffset;if(localMovePreviousIndex!=localCurrentIndex){for(var i=0;i<localMovePreviousIndex;i++){var offset=i<moveOffsets.length?moveOffsets[i]:moveOffsets[i]=0,index=offset+i;localCurrentIndex<=index&&index<localMovePreviousIndex&&(moveOffsets[i]=offset+1)}moveOffsets[record.previousIndex]=localCurrentIndex-localMovePreviousIndex}}adjPreviousIndex!==currentIndex&&fn(record,adjPreviousIndex,currentIndex)}},DefaultIterableDiffer.prototype.forEachPreviousItem=function(fn){var record;for(record=this._previousItHead;null!==record;record=record._nextPrevious)fn(record)},DefaultIterableDiffer.prototype.forEachAddedItem=function(fn){var record;for(record=this._additionsHead;null!==record;record=record._nextAdded)fn(record)},DefaultIterableDiffer.prototype.forEachMovedItem=function(fn){var record;for(record=this._movesHead;null!==record;record=record._nextMoved)fn(record)},DefaultIterableDiffer.prototype.forEachRemovedItem=function(fn){var record;for(record=this._removalsHead;null!==record;record=record._nextRemoved)fn(record)},DefaultIterableDiffer.prototype.forEachIdentityChange=function(fn){var record;for(record=this._identityChangesHead;null!==record;record=record._nextIdentityChange)fn(record)},DefaultIterableDiffer.prototype.diff=function(collection){if(null==collection&&(collection=[]),!isListLikeIterable(collection))throw new Error("Error trying to diff '"+stringify(collection)+"'. Only arrays and iterables are allowed");return this.check(collection)?this:null},DefaultIterableDiffer.prototype.onDestroy=function(){},DefaultIterableDiffer.prototype.check=function(collection){var _this=this;this._reset();var index,item,itemTrackBy,record=this._itHead,mayBeDirty=!1;if(Array.isArray(collection)){this.length=collection.length;for(var index_1=0;index_1<this.length;index_1++)item=collection[index_1],itemTrackBy=this._trackByFn(index_1,item),null!==record&&looseIdentical(record.trackById,itemTrackBy)?(mayBeDirty&&(record=this._verifyReinsertion(record,item,itemTrackBy,index_1)),looseIdentical(record.item,item)||this._addIdentityChange(record,item)):(record=this._mismatch(record,item,itemTrackBy,index_1),mayBeDirty=!0),record=record._next}else index=0,function iterateListLike(obj,fn){if(Array.isArray(obj))for(var i=0;i<obj.length;i++)fn(obj[i]);else for(var iterator=obj[getSymbolIterator()](),item=void 0;!(item=iterator.next()).done;)fn(item.value)}(collection,function(item){itemTrackBy=_this._trackByFn(index,item),null!==record&&looseIdentical(record.trackById,itemTrackBy)?(mayBeDirty&&(record=_this._verifyReinsertion(record,item,itemTrackBy,index)),looseIdentical(record.item,item)||_this._addIdentityChange(record,item)):(record=_this._mismatch(record,item,itemTrackBy,index),mayBeDirty=!0),record=record._next,index++}),this.length=index;return this._truncate(record),this.collection=collection,this.isDirty},Object.defineProperty(DefaultIterableDiffer.prototype,"isDirty",{get:function(){return null!==this._additionsHead||null!==this._movesHead||null!==this._removalsHead||null!==this._identityChangesHead},enumerable:!0,configurable:!0}),DefaultIterableDiffer.prototype._reset=function(){if(this.isDirty){var record=void 0,nextRecord=void 0;for(record=this._previousItHead=this._itHead;null!==record;record=record._next)record._nextPrevious=record._next;for(record=this._additionsHead;null!==record;record=record._nextAdded)record.previousIndex=record.currentIndex;for(this._additionsHead=this._additionsTail=null,record=this._movesHead;null!==record;record=nextRecord)record.previousIndex=record.currentIndex,nextRecord=record._nextMoved;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}},DefaultIterableDiffer.prototype._mismatch=function(record,item,itemTrackBy,index){var previousRecord;return null===record?previousRecord=this._itTail:(previousRecord=record._prev,this._remove(record)),null!==(record=null===this._linkedRecords?null:this._linkedRecords.get(itemTrackBy,index))?(looseIdentical(record.item,item)||this._addIdentityChange(record,item),this._moveAfter(record,previousRecord,index)):null!==(record=null===this._unlinkedRecords?null:this._unlinkedRecords.get(itemTrackBy,null))?(looseIdentical(record.item,item)||this._addIdentityChange(record,item),this._reinsertAfter(record,previousRecord,index)):record=this._addAfter(new IterableChangeRecord_(item,itemTrackBy),previousRecord,index),record},DefaultIterableDiffer.prototype._verifyReinsertion=function(record,item,itemTrackBy,index){var reinsertRecord=null===this._unlinkedRecords?null:this._unlinkedRecords.get(itemTrackBy,null);return null!==reinsertRecord?record=this._reinsertAfter(reinsertRecord,record._prev,index):record.currentIndex!=index&&(record.currentIndex=index,this._addToMoves(record,index)),record},DefaultIterableDiffer.prototype._truncate=function(record){for(;null!==record;){var nextRecord=record._next;this._addToRemovals(this._unlink(record)),record=nextRecord}null!==this._unlinkedRecords&&this._unlinkedRecords.clear(),null!==this._additionsTail&&(this._additionsTail._nextAdded=null),null!==this._movesTail&&(this._movesTail._nextMoved=null),null!==this._itTail&&(this._itTail._next=null),null!==this._removalsTail&&(this._removalsTail._nextRemoved=null),null!==this._identityChangesTail&&(this._identityChangesTail._nextIdentityChange=null)},DefaultIterableDiffer.prototype._reinsertAfter=function(record,prevRecord,index){null!==this._unlinkedRecords&&this._unlinkedRecords.remove(record);var prev=record._prevRemoved,next=record._nextRemoved;return null===prev?this._removalsHead=next:prev._nextRemoved=next,null===next?this._removalsTail=prev:next._prevRemoved=prev,this._insertAfter(record,prevRecord,index),this._addToMoves(record,index),record},DefaultIterableDiffer.prototype._moveAfter=function(record,prevRecord,index){return this._unlink(record),this._insertAfter(record,prevRecord,index),this._addToMoves(record,index),record},DefaultIterableDiffer.prototype._addAfter=function(record,prevRecord,index){return this._insertAfter(record,prevRecord,index),null===this._additionsTail?this._additionsTail=this._additionsHead=record:this._additionsTail=this._additionsTail._nextAdded=record,record},DefaultIterableDiffer.prototype._insertAfter=function(record,prevRecord,index){var next=null===prevRecord?this._itHead:prevRecord._next;return record._next=next,record._prev=prevRecord,null===next?this._itTail=record:next._prev=record,null===prevRecord?this._itHead=record:prevRecord._next=record,null===this._linkedRecords&&(this._linkedRecords=new _DuplicateMap),this._linkedRecords.put(record),record.currentIndex=index,record},DefaultIterableDiffer.prototype._remove=function(record){return this._addToRemovals(this._unlink(record))},DefaultIterableDiffer.prototype._unlink=function(record){null!==this._linkedRecords&&this._linkedRecords.remove(record);var prev=record._prev,next=record._next;return null===prev?this._itHead=next:prev._next=next,null===next?this._itTail=prev:next._prev=prev,record},DefaultIterableDiffer.prototype._addToMoves=function(record,toIndex){return record.previousIndex===toIndex?record:(null===this._movesTail?this._movesTail=this._movesHead=record:this._movesTail=this._movesTail._nextMoved=record,record)},DefaultIterableDiffer.prototype._addToRemovals=function(record){return null===this._unlinkedRecords&&(this._unlinkedRecords=new _DuplicateMap),this._unlinkedRecords.put(record),record.currentIndex=null,record._nextRemoved=null,null===this._removalsTail?(this._removalsTail=this._removalsHead=record,record._prevRemoved=null):(record._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=record),record},DefaultIterableDiffer.prototype._addIdentityChange=function(record,item){return record.item=item,null===this._identityChangesTail?this._identityChangesTail=this._identityChangesHead=record:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=record,record},DefaultIterableDiffer}(),IterableChangeRecord_=function IterableChangeRecord_(item,trackById){this.item=item,this.trackById=trackById,this.currentIndex=null,this.previousIndex=null,this._nextPrevious=null,this._prev=null,this._next=null,this._prevDup=null,this._nextDup=null,this._prevRemoved=null,this._nextRemoved=null,this._nextAdded=null,this._nextMoved=null,this._nextIdentityChange=null},_DuplicateItemRecordList=function(){function _DuplicateItemRecordList(){this._head=null,this._tail=null}return _DuplicateItemRecordList.prototype.add=function(record){null===this._head?(this._head=this._tail=record,record._nextDup=null,record._prevDup=null):(this._tail._nextDup=record,record._prevDup=this._tail,record._nextDup=null,this._tail=record)},_DuplicateItemRecordList.prototype.get=function(trackById,atOrAfterIndex){var record;for(record=this._head;null!==record;record=record._nextDup)if((null===atOrAfterIndex||atOrAfterIndex<=record.currentIndex)&&looseIdentical(record.trackById,trackById))return record;return null},_DuplicateItemRecordList.prototype.remove=function(record){var prev=record._prevDup,next=record._nextDup;return null===prev?this._head=next:prev._nextDup=next,null===next?this._tail=prev:next._prevDup=prev,null===this._head},_DuplicateItemRecordList}(),_DuplicateMap=function(){function _DuplicateMap(){this.map=new Map}return _DuplicateMap.prototype.put=function(record){var key=record.trackById,duplicates=this.map.get(key);duplicates||(duplicates=new _DuplicateItemRecordList,this.map.set(key,duplicates)),duplicates.add(record)},_DuplicateMap.prototype.get=function(trackById,atOrAfterIndex){var key=trackById,recordList=this.map.get(key);return recordList?recordList.get(trackById,atOrAfterIndex):null},_DuplicateMap.prototype.remove=function(record){var key=record.trackById;return this.map.get(key).remove(record)&&this.map.delete(key),record},Object.defineProperty(_DuplicateMap.prototype,"isEmpty",{get:function(){return 0===this.map.size},enumerable:!0,configurable:!0}),_DuplicateMap.prototype.clear=function(){this.map.clear()},_DuplicateMap}();function getPreviousIndex(item,addRemoveOffset,moveOffsets){var previousIndex=item.previousIndex;if(null===previousIndex)return previousIndex;var moveOffset=0;return moveOffsets&&previousIndex<moveOffsets.length&&(moveOffset=moveOffsets[previousIndex]),previousIndex+addRemoveOffset+moveOffset}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var DefaultKeyValueDifferFactory=function(){function DefaultKeyValueDifferFactory(){}return DefaultKeyValueDifferFactory.prototype.supports=function(obj){return obj instanceof Map||isJsObject(obj)},DefaultKeyValueDifferFactory.prototype.create=function(){return new DefaultKeyValueDiffer},DefaultKeyValueDifferFactory}(),DefaultKeyValueDiffer=function(){function DefaultKeyValueDiffer(){this._records=new Map,this._mapHead=null,this._appendAfter=null,this._previousMapHead=null,this._changesHead=null,this._changesTail=null,this._additionsHead=null,this._additionsTail=null,this._removalsHead=null,this._removalsTail=null}return Object.defineProperty(DefaultKeyValueDiffer.prototype,"isDirty",{get:function(){return null!==this._additionsHead||null!==this._changesHead||null!==this._removalsHead},enumerable:!0,configurable:!0}),DefaultKeyValueDiffer.prototype.forEachItem=function(fn){var record;for(record=this._mapHead;null!==record;record=record._next)fn(record)},DefaultKeyValueDiffer.prototype.forEachPreviousItem=function(fn){var record;for(record=this._previousMapHead;null!==record;record=record._nextPrevious)fn(record)},DefaultKeyValueDiffer.prototype.forEachChangedItem=function(fn){var record;for(record=this._changesHead;null!==record;record=record._nextChanged)fn(record)},DefaultKeyValueDiffer.prototype.forEachAddedItem=function(fn){var record;for(record=this._additionsHead;null!==record;record=record._nextAdded)fn(record)},DefaultKeyValueDiffer.prototype.forEachRemovedItem=function(fn){var record;for(record=this._removalsHead;null!==record;record=record._nextRemoved)fn(record)},DefaultKeyValueDiffer.prototype.diff=function(map){if(map){if(!(map instanceof Map||isJsObject(map)))throw new Error("Error trying to diff '"+stringify(map)+"'. Only maps and objects are allowed")}else map=new Map;return this.check(map)?this:null},DefaultKeyValueDiffer.prototype.onDestroy=function(){},DefaultKeyValueDiffer.prototype.check=function(map){var _this=this;this._reset();var insertBefore=this._mapHead;if(this._appendAfter=null,this._forEach(map,function(value,key){if(insertBefore&&insertBefore.key===key)_this._maybeAddToChanges(insertBefore,value),_this._appendAfter=insertBefore,insertBefore=insertBefore._next;else{var record=_this._getOrCreateRecordForKey(key,value);insertBefore=_this._insertBeforeOrAppend(insertBefore,record)}}),insertBefore){insertBefore._prev&&(insertBefore._prev._next=null),this._removalsHead=insertBefore;for(var record=insertBefore;null!==record;record=record._nextRemoved)record===this._mapHead&&(this._mapHead=null),this._records.delete(record.key),record._nextRemoved=record._next,record.previousValue=record.currentValue,record.currentValue=null,record._prev=null,record._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty},DefaultKeyValueDiffer.prototype._insertBeforeOrAppend=function(before,record){if(before){var prev=before._prev;return record._next=before,record._prev=prev,before._prev=record,prev&&(prev._next=record),before===this._mapHead&&(this._mapHead=record),this._appendAfter=before,before}return this._appendAfter?(this._appendAfter._next=record,record._prev=this._appendAfter):this._mapHead=record,this._appendAfter=record,null},DefaultKeyValueDiffer.prototype._getOrCreateRecordForKey=function(key,value){if(this._records.has(key)){var record_1=this._records.get(key);this._maybeAddToChanges(record_1,value);var prev=record_1._prev,next=record_1._next;return prev&&(prev._next=next),next&&(next._prev=prev),record_1._next=null,record_1._prev=null,record_1}var record=new KeyValueChangeRecord_(key);return this._records.set(key,record),record.currentValue=value,this._addToAdditions(record),record},DefaultKeyValueDiffer.prototype._reset=function(){if(this.isDirty){var record=void 0;for(this._previousMapHead=this._mapHead,record=this._previousMapHead;null!==record;record=record._next)record._nextPrevious=record._next;for(record=this._changesHead;null!==record;record=record._nextChanged)record.previousValue=record.currentValue;for(record=this._additionsHead;null!=record;record=record._nextAdded)record.previousValue=record.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}},DefaultKeyValueDiffer.prototype._maybeAddToChanges=function(record,newValue){looseIdentical(newValue,record.currentValue)||(record.previousValue=record.currentValue,record.currentValue=newValue,this._addToChanges(record))},DefaultKeyValueDiffer.prototype._addToAdditions=function(record){null===this._additionsHead?this._additionsHead=this._additionsTail=record:(this._additionsTail._nextAdded=record,this._additionsTail=record)},DefaultKeyValueDiffer.prototype._addToChanges=function(record){null===this._changesHead?this._changesHead=this._changesTail=record:(this._changesTail._nextChanged=record,this._changesTail=record)},DefaultKeyValueDiffer.prototype._forEach=function(obj,fn){obj instanceof Map?obj.forEach(fn):Object.keys(obj).forEach(function(k){return fn(obj[k],k)})},DefaultKeyValueDiffer}(),KeyValueChangeRecord_=function KeyValueChangeRecord_(key){this.key=key,this.previousValue=null,this.currentValue=null,this._nextPrevious=null,this._next=null,this._prev=null,this._nextAdded=null,this._nextRemoved=null,this._nextChanged=null},IterableDiffers=function(){function IterableDiffers(factories){this.factories=factories}return IterableDiffers.create=function(factories,parent){if(null!=parent){var copied=parent.factories.slice();factories=factories.concat(copied)}return new IterableDiffers(factories)},IterableDiffers.extend=function(factories){return{provide:IterableDiffers,useFactory:function(parent){if(!parent)throw new Error("Cannot extend IterableDiffers without a parent injector");return IterableDiffers.create(factories,parent)},deps:[[IterableDiffers,new SkipSelf,new Optional]]}},IterableDiffers.prototype.find=function(iterable){var factory=this.factories.find(function(f){return f.supports(iterable)});if(null!=factory)return factory;throw new Error("Cannot find a differ supporting object '"+iterable+"' of type '"+function getTypeNameForDebugging(type){return type.name||typeof type}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(iterable)+"'")},IterableDiffers.ngInjectableDef=ɵɵdefineInjectable({providedIn:"root",factory:function(){return new IterableDiffers([new DefaultIterableDifferFactory])}}),IterableDiffers}();var KeyValueDiffers=function(){function KeyValueDiffers(factories){this.factories=factories}return KeyValueDiffers.create=function(factories,parent){if(parent){var copied=parent.factories.slice();factories=factories.concat(copied)}return new KeyValueDiffers(factories)},KeyValueDiffers.extend=function(factories){return{provide:KeyValueDiffers,useFactory:function(parent){if(!parent)throw new Error("Cannot extend KeyValueDiffers without a parent injector");return KeyValueDiffers.create(factories,parent)},deps:[[KeyValueDiffers,new SkipSelf,new Optional]]}},KeyValueDiffers.prototype.find=function(kv){var factory=this.factories.find(function(f){return f.supports(kv)});if(factory)return factory;throw new Error("Cannot find a differ supporting object '"+kv+"'")},KeyValueDiffers.ngInjectableDef=ɵɵdefineInjectable({providedIn:"root",factory:function(){return new KeyValueDiffers([new DefaultKeyValueDifferFactory])}}),KeyValueDiffers}(),ChangeDetectorRef=function(){function ChangeDetectorRef(){}return ChangeDetectorRef.__NG_ELEMENT_ID__=function(){return SWITCH_CHANGE_DETECTOR_REF_FACTORY()},ChangeDetectorRef}(),SWITCH_CHANGE_DETECTOR_REF_FACTORY=function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i]},keyValDiff=[new DefaultKeyValueDifferFactory],iterableDiff=[new DefaultIterableDifferFactory],defaultIterableDiffers=new IterableDiffers(iterableDiff),defaultKeyValueDiffers=new KeyValueDiffers(keyValDiff),TemplateRef=function(){function TemplateRef(){}return TemplateRef.__NG_ELEMENT_ID__=function(){return SWITCH_TEMPLATE_REF_FACTORY(TemplateRef,ElementRef)},TemplateRef}(),SWITCH_TEMPLATE_REF_FACTORY=noop,ViewContainerRef=function(){function ViewContainerRef(){}return ViewContainerRef.__NG_ELEMENT_ID__=function(){return SWITCH_VIEW_CONTAINER_REF_FACTORY(ViewContainerRef,ElementRef)},ViewContainerRef}(),SWITCH_VIEW_CONTAINER_REF_FACTORY=noop;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function expressionChangedAfterItHasBeenCheckedError(context,oldValue,currValue,isFirstCheck){var msg="ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '"+oldValue+"'. Current value: '"+currValue+"'.";return isFirstCheck&&(msg+=" It seems like the view has been created after its parent and its children have been dirty checked. Has it been created in a change detection hook ?"),function viewDebugError(msg,context){var err=new Error(msg);return _addDebugContext(err,context),err}(msg,context)}function _addDebugContext(err,context){err[ERROR_DEBUG_CONTEXT]=context,err[ERROR_LOGGER]=context.logError.bind(context)}function viewDestroyedError(action){return new Error("ViewDestroyedError: Attempt to use a destroyed view: "+action)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function shiftInitState(view,priorInitState,newInitState){var state=view.state,initState=1792&state;return initState===priorInitState?(view.state=-1793&state|newInitState,view.initIndex=-1,!0):initState===newInitState}function shouldCallLifecycleInitHook(view,initState,index){return(1792&view.state)===initState&&view.initIndex<=index&&(view.initIndex=index+1,!0)}function asTextData(view,index){return view.nodes[index]}function asElementData(view,index){return view.nodes[index]}function asProviderData(view,index){return view.nodes[index]}function asPureExpressionData(view,index){return view.nodes[index]}function asQueryList(view,index){return view.nodes[index]}var Services={setCurrentNode:void 0,createRootView:void 0,createEmbeddedView:void 0,createComponentView:void 0,createNgModuleRef:void 0,overrideProvider:void 0,overrideComponentView:void 0,clearOverrides:void 0,checkAndUpdateView:void 0,checkNoChangesView:void 0,destroyView:void 0,resolveDep:void 0,createDebugContext:void 0,handleEvent:void 0,updateDirectives:void 0,updateRenderer:void 0,dirtyParentQueries:void 0},NOOP=function(){},_tokenKeyCache=new Map;function tokenKey(token){var key=_tokenKeyCache.get(token);return key||(key=stringify(token)+"_"+_tokenKeyCache.size,_tokenKeyCache.set(token,key)),key}function unwrapValue(view,nodeIdx,bindingIdx,value){if(WrappedValue.isWrapped(value)){value=WrappedValue.unwrap(value);var globalBindingIdx=view.def.nodes[nodeIdx].bindingIndex+bindingIdx,oldValue=WrappedValue.unwrap(view.oldValues[globalBindingIdx]);view.oldValues[globalBindingIdx]=new WrappedValue(oldValue)}return value}var UNDEFINED_RENDERER_TYPE_ID="$$undefined",EMPTY_RENDERER_TYPE_ID="$$empty";function createRendererType2(values){return{id:UNDEFINED_RENDERER_TYPE_ID,styles:values.styles,encapsulation:values.encapsulation,data:values.data}}var _renderCompCount$1=0;function checkBinding(view,def,bindingIdx,value){var oldValues=view.oldValues;return!(!(2&view.state)&&looseIdentical(oldValues[def.bindingIndex+bindingIdx],value))}function checkAndUpdateBinding(view,def,bindingIdx,value){return!!checkBinding(view,def,bindingIdx,value)&&(view.oldValues[def.bindingIndex+bindingIdx]=value,!0)}function checkBindingNoChanges(view,def,bindingIdx,value){var oldValue=view.oldValues[def.bindingIndex+bindingIdx];if(1&view.state||!devModeEqual(oldValue,value)){var bindingName=def.bindings[bindingIdx].name;throw expressionChangedAfterItHasBeenCheckedError(Services.createDebugContext(view,def.nodeIndex),bindingName+": "+oldValue,bindingName+": "+value,0!=(1&view.state))}}function markParentViewsForCheck(view){for(var currView=view;currView;)2&currView.def.flags&&(currView.state|=8),currView=currView.viewContainerParent||currView.parent}function markParentViewsForCheckProjectedViews(view,endView){for(var currView=view;currView&&currView!==endView;)currView.state|=64,currView=currView.viewContainerParent||currView.parent}function dispatchEvent(view,nodeIndex,eventName,event){try{return markParentViewsForCheck(33554432&view.def.nodes[nodeIndex].flags?asElementData(view,nodeIndex).componentView:view),Services.handleEvent(view,nodeIndex,eventName,event)}catch(e){view.root.errorHandler.handleError(e)}}function declaredViewContainer(view){return view.parent?asElementData(view.parent,view.parentNodeDef.nodeIndex):null}function viewParentEl(view){return view.parent?view.parentNodeDef.parent:null}function renderNode(view,def){switch(201347067&def.flags){case 1:return asElementData(view,def.nodeIndex).renderElement;case 2:return asTextData(view,def.nodeIndex).renderText}}function isComponentView(view){return!!view.parent&&!!(32768&view.parentNodeDef.flags)}function isEmbeddedView(view){return!(!view.parent||32768&view.parentNodeDef.flags)}function filterQueryId(queryId){return 1<<queryId%32}function splitMatchedQueriesDsl(matchedQueriesDsl){var matchedQueries={},matchedQueryIds=0,references={};return matchedQueriesDsl&&matchedQueriesDsl.forEach(function(_a){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),queryId=_b[0],valueType=_b[1];"number"==typeof queryId?(matchedQueries[queryId]=valueType,matchedQueryIds|=filterQueryId(queryId)):references[queryId]=valueType}),{matchedQueries:matchedQueries,references:references,matchedQueryIds:matchedQueryIds}}function splitDepsDsl(deps,sourceName){return deps.map(function(value){var _a,token,flags;return Array.isArray(value)?(flags=(_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(value,2))[0],token=_a[1]):(flags=0,token=value),token&&("function"==typeof token||"object"==typeof token)&&sourceName&&Object.defineProperty(token,SOURCE,{value:sourceName,configurable:!0}),{flags:flags,token:token,tokenKey:tokenKey(token)}})}function getParentRenderElement(view,renderHost,def){var renderParent=def.renderParent;return renderParent?0==(1&renderParent.flags)||0==(33554432&renderParent.flags)||renderParent.element.componentRendererType&&renderParent.element.componentRendererType.encapsulation===ViewEncapsulation.Native?asElementData(view,def.renderParent.nodeIndex).renderElement:void 0:renderHost}var DEFINITION_CACHE=new WeakMap;function resolveDefinition(factory){var value=DEFINITION_CACHE.get(factory);return value||((value=factory(function(){return NOOP})).factory=factory,DEFINITION_CACHE.set(factory,value)),value}function visitRootRenderNodes(view,action,parentNode,nextSibling,target){3===action&&(parentNode=view.renderer.parentNode(renderNode(view,view.def.lastRenderRootNode))),visitSiblingRenderNodes(view,action,0,view.def.nodes.length-1,parentNode,nextSibling,target)}function visitSiblingRenderNodes(view,action,startIndex,endIndex,parentNode,nextSibling,target){for(var i=startIndex;i<=endIndex;i++){var nodeDef=view.def.nodes[i];11&nodeDef.flags&&visitRenderNode(view,nodeDef,action,parentNode,nextSibling,target),i+=nodeDef.childCount}}function visitProjectedRenderNodes(view,ngContentIndex,action,parentNode,nextSibling,target){for(var compView=view;compView&&!isComponentView(compView);)compView=compView.parent;for(var hostView=compView.parent,hostElDef=viewParentEl(compView),startIndex=hostElDef.nodeIndex+1,endIndex=hostElDef.nodeIndex+hostElDef.childCount,i=startIndex;i<=endIndex;i++){var nodeDef=hostView.def.nodes[i];nodeDef.ngContentIndex===ngContentIndex&&visitRenderNode(hostView,nodeDef,action,parentNode,nextSibling,target),i+=nodeDef.childCount}if(!hostView.parent){var projectedNodes=view.root.projectableNodes[ngContentIndex];if(projectedNodes)for(i=0;i<projectedNodes.length;i++)execRenderNodeAction(view,projectedNodes[i],action,parentNode,nextSibling,target)}}function visitRenderNode(view,nodeDef,action,parentNode,nextSibling,target){Iif(8&nodeDef.flags)visitProjectedRenderNodes(view,nodeDef.ngContent.index,action,parentNode,nextSibling,target);else{var rn=renderNode(view,nodeDef);Iif(3===action&&33554432&nodeDef.flags&&48&nodeDef.bindingFlags){if(16&nodeDef.bindingFlags&&execRenderNodeAction(view,rn,action,parentNode,nextSibling,target),32&nodeDef.bindingFlags)execRenderNodeAction(asElementData(view,nodeDef.nodeIndex).componentView,rn,action,parentNode,nextSibling,target)}else execRenderNodeAction(view,rn,action,parentNode,nextSibling,target);Iif(16777216&nodeDef.flags)for(var embeddedViews=asElementData(view,nodeDef.nodeIndex).viewContainer._embeddedViews,k=0;k<embeddedViews.length;k++)visitRootRenderNodes(embeddedViews[k],action,parentNode,nextSibling,target);1&nodeDef.flags&&!nodeDef.element.name&&visitSiblingRenderNodes(view,action,nodeDef.nodeIndex+1,nodeDef.nodeIndex+nodeDef.childCount,parentNode,nextSibling,target)}}function execRenderNodeAction(view,renderNode,action,parentNode,nextSibling,target){var renderer=view.renderer;switch(action){case 1:renderer.appendChild(parentNode,renderNode);break;case 2:renderer.insertBefore(parentNode,renderNode,nextSibling);break;case 3:renderer.removeChild(parentNode,renderNode);break;case 0:target.push(renderNode)}}var NS_PREFIX_RE=/^:([^:]+):(.+)$/;function splitNamespace(name){Iif(":"===name[0]){var match=name.match(NS_PREFIX_RE);return[match[1],match[2]]}return["",name]}function calcBindingFlags(bindings){for(var flags=0,i=0;i<bindings.length;i++)flags|=bindings[i].flags;return flags}function interpolate(valueCount,constAndInterp){for(var result="",i=0;i<2*valueCount;i+=2)result=result+constAndInterp[i]+_toStringWithNull(constAndInterp[i+1]);return result+constAndInterp[2*valueCount]}function inlineInterpolate(valueCount,c0,a1,c1,a2,c2,a3,c3,a4,c4,a5,c5,a6,c6,a7,c7,a8,c8,a9,c9){switch(valueCount){case 1:return c0+_toStringWithNull(a1)+c1;case 2:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2;case 3:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3;case 4:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4;case 5:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4+_toStringWithNull(a5)+c5;case 6:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4+_toStringWithNull(a5)+c5+_toStringWithNull(a6)+c6;case 7:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4+_toStringWithNull(a5)+c5+_toStringWithNull(a6)+c6+_toStringWithNull(a7)+c7;case 8:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4+_toStringWithNull(a5)+c5+_toStringWithNull(a6)+c6+_toStringWithNull(a7)+c7+_toStringWithNull(a8)+c8;case 9:return c0+_toStringWithNull(a1)+c1+_toStringWithNull(a2)+c2+_toStringWithNull(a3)+c3+_toStringWithNull(a4)+c4+_toStringWithNull(a5)+c5+_toStringWithNull(a6)+c6+_toStringWithNull(a7)+c7+_toStringWithNull(a8)+c8+_toStringWithNull(a9)+c9;default:throw new Error("Does not support more than 9 expressions")}}function _toStringWithNull(v){return null!=v?v.toString():""}var EMPTY_ARRAY$3=[],EMPTY_MAP={},UNDEFINED_VALUE=new Object,InjectorRefTokenKey=tokenKey(Injector),INJECTORRefTokenKey=tokenKey(INJECTOR),NgModuleRefTokenKey=tokenKey(NgModuleRef);function moduleProvideDef(flags,token,value,deps){return value=resolveForwardRef(value),{index:-1,deps:splitDepsDsl(deps,stringify(token)),flags:flags,token:token,value:value}}function moduleDef(providers){for(var providersByKey={},modules=[],isRoot=!1,i=0;i<providers.length;i++){var provider=providers[i];provider.token===APP_ROOT&&!0===provider.value&&(isRoot=!0),1073741824&provider.flags&&modules.push(provider.token),provider.index=i,providersByKey[tokenKey(provider.token)]=provider}return{factory:null,providersByKey:providersByKey,providers:providers,modules:modules,isRoot:isRoot}}function resolveNgModuleDep(data,depDef,notFoundValue){void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND);var former=setCurrentInjector(data);try{if(8&depDef.flags)return depDef.token;if(2&depDef.flags&&(notFoundValue=null),1&depDef.flags)return data._parent.get(depDef.token,notFoundValue);var tokenKey_1=depDef.tokenKey;switch(tokenKey_1){case InjectorRefTokenKey:case INJECTORRefTokenKey:case NgModuleRefTokenKey:return data}var providerDef=data._def.providersByKey[tokenKey_1],injectableDef=void 0;if(providerDef){var providerInstance=data._providers[providerDef.index];return void 0===providerInstance&&(providerInstance=data._providers[providerDef.index]=_createProviderInstance(data,providerDef)),providerInstance===UNDEFINED_VALUE?void 0:providerInstance}Iif((injectableDef=getInjectableDef(depDef.token))&&function targetsModule(ngModule,def){return null!=def.providedIn&&(function moduleTransitivelyPresent(ngModule,scope){return ngModule._def.modules.indexOf(scope)>-1}(ngModule,def.providedIn)||"root"===def.providedIn&&ngModule._def.isRoot)}(data,injectableDef)){var index=data._providers.length;return data._def.providers[index]=data._def.providersByKey[depDef.tokenKey]={flags:5120,value:injectableDef.factory,deps:[],index:index,token:depDef.token},data._providers[index]=UNDEFINED_VALUE,data._providers[index]=_createProviderInstance(data,data._def.providersByKey[depDef.tokenKey])}return 4&depDef.flags?notFoundValue:data._parent.get(depDef.token,notFoundValue)}finally{setCurrentInjector(former)}}function _createProviderInstance(ngModule,providerDef){var injectable;switch(201347067&providerDef.flags){case 512:injectable=function _createClass(ngModule,ctor,deps){var len=deps.length;switch(len){case 0:return new ctor;case 1:return new ctor(resolveNgModuleDep(ngModule,deps[0]));case 2:return new ctor(resolveNgModuleDep(ngModule,deps[0]),resolveNgModuleDep(ngModule,deps[1]));case 3:return new ctor(resolveNgModuleDep(ngModule,deps[0]),resolveNgModuleDep(ngModule,deps[1]),resolveNgModuleDep(ngModule,deps[2]));default:for(var depValues=new Array(len),i=0;i<len;i++)depValues[i]=resolveNgModuleDep(ngModule,deps[i]);return new(ctor.bind.apply(ctor,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],depValues)))}}(ngModule,providerDef.value,providerDef.deps);break;case 1024:injectable=function _callFactory(ngModule,factory,deps){var len=deps.length;switch(len){case 0:return factory();case 1:return factory(resolveNgModuleDep(ngModule,deps[0]));case 2:return factory(resolveNgModuleDep(ngModule,deps[0]),resolveNgModuleDep(ngModule,deps[1]));case 3:return factory(resolveNgModuleDep(ngModule,deps[0]),resolveNgModuleDep(ngModule,deps[1]),resolveNgModuleDep(ngModule,deps[2]));default:for(var depValues=Array(len),i=0;i<len;i++)depValues[i]=resolveNgModuleDep(ngModule,deps[i]);return factory.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(depValues))}}(ngModule,providerDef.value,providerDef.deps);break;case 2048:injectable=resolveNgModuleDep(ngModule,providerDef.deps[0]);break;case 256:injectable=providerDef.value}return injectable===UNDEFINED_VALUE||null===injectable||"object"!=typeof injectable||131072&providerDef.flags||"function"!=typeof injectable.ngOnDestroy||(providerDef.flags|=131072),void 0===injectable?UNDEFINED_VALUE:injectable}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function attachEmbeddedView(parentView,elementData,viewIndex,view){var embeddedViews=elementData.viewContainer._embeddedViews;null==viewIndex&&(viewIndex=embeddedViews.length),view.viewContainerParent=parentView,addToArray(embeddedViews,viewIndex,view),function attachProjectedView(vcElementData,view){var dvcElementData=declaredViewContainer(view);Eif(!dvcElementData||dvcElementData===vcElementData||16&view.state)return;view.state|=16;var projectedViews=dvcElementData.template._projectedViews;projectedViews||(projectedViews=dvcElementData.template._projectedViews=[]);projectedViews.push(view),function markNodeAsProjectedTemplate(viewDef,nodeDef){if(4&nodeDef.flags)return;viewDef.nodeFlags|=4,nodeDef.flags|=4;var parentNodeDef=nodeDef.parent;for(;parentNodeDef;)parentNodeDef.childFlags|=4,parentNodeDef=parentNodeDef.parent}(view.parent.def,view.parentNodeDef)}(elementData,view),Services.dirtyParentQueries(view),renderAttachEmbeddedView(elementData,viewIndex>0?embeddedViews[viewIndex-1]:null,view)}function detachEmbeddedView(elementData,viewIndex){var embeddedViews=elementData.viewContainer._embeddedViews;if((null==viewIndex||viewIndex>=embeddedViews.length)&&(viewIndex=embeddedViews.length-1),viewIndex<0)return null;var view=embeddedViews[viewIndex];return view.viewContainerParent=null,removeFromArray(embeddedViews,viewIndex),Services.dirtyParentQueries(view),renderDetachView$1(view),view}function renderAttachEmbeddedView(elementData,prevView,view){var prevRenderNode=prevView?renderNode(prevView,prevView.def.lastRenderRootNode):elementData.renderElement,parentNode=view.renderer.parentNode(prevRenderNode),nextSibling=view.renderer.nextSibling(prevRenderNode);visitRootRenderNodes(view,2,parentNode,nextSibling,void 0)}function renderDetachView$1(view){visitRootRenderNodes(view,3,null,null,void 0)}function addToArray(arr,index,value){index>=arr.length?arr.push(value):arr.splice(index,0,value)}function removeFromArray(arr,index){index>=arr.length-1?arr.pop():arr.splice(index,1)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var EMPTY_CONTEXT=new Object;function createComponentFactory(selector,componentType,viewDefFactory,inputs,outputs,ngContentSelectors){return new ComponentFactory_(selector,componentType,viewDefFactory,inputs,outputs,ngContentSelectors)}var ComponentFactory_=function(_super){function ComponentFactory_(selector,componentType,viewDefFactory,_inputs,_outputs,ngContentSelectors){var _this=_super.call(this)||this;return _this.selector=selector,_this.componentType=componentType,_this._inputs=_inputs,_this._outputs=_outputs,_this.ngContentSelectors=ngContentSelectors,_this.viewDefFactory=viewDefFactory,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentFactory_,_super),Object.defineProperty(ComponentFactory_.prototype,"inputs",{get:function(){var inputsArr=[],inputs=this._inputs;for(var propName in inputs){var templateName=inputs[propName];inputsArr.push({propName:propName,templateName:templateName})}return inputsArr},enumerable:!0,configurable:!0}),Object.defineProperty(ComponentFactory_.prototype,"outputs",{get:function(){var outputsArr=[];for(var propName in this._outputs){var templateName=this._outputs[propName];outputsArr.push({propName:propName,templateName:templateName})}return outputsArr},enumerable:!0,configurable:!0}),ComponentFactory_.prototype.create=function(injector,projectableNodes,rootSelectorOrNode,ngModule){Iif(!ngModule)throw new Error("ngModule should be provided");var viewDef=resolveDefinition(this.viewDefFactory),componentNodeIndex=viewDef.nodes[0].element.componentProvider.nodeIndex,view=Services.createRootView(injector,projectableNodes||[],rootSelectorOrNode,viewDef,ngModule,EMPTY_CONTEXT),component=asProviderData(view,componentNodeIndex).instance;return rootSelectorOrNode&&view.renderer.setAttribute(asElementData(view,0).renderElement,"ng-version",VERSION.full),new ComponentRef_(view,new ViewRef_(view),component)},ComponentFactory_}(ComponentFactory),ComponentRef_=function(_super){function ComponentRef_(_view,_viewRef,_component){var _this=_super.call(this)||this;return _this._view=_view,_this._viewRef=_viewRef,_this._component=_component,_this._elDef=_this._view.def.nodes[0],_this.hostView=_viewRef,_this.changeDetectorRef=_viewRef,_this.instance=_component,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentRef_,_super),Object.defineProperty(ComponentRef_.prototype,"location",{get:function(){return new ElementRef(asElementData(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(ComponentRef_.prototype,"injector",{get:function(){return new Injector_(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(ComponentRef_.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),ComponentRef_.prototype.destroy=function(){this._viewRef.destroy()},ComponentRef_.prototype.onDestroy=function(callback){this._viewRef.onDestroy(callback)},ComponentRef_}(ComponentRef);function createViewContainerData(view,elDef,elData){return new ViewContainerRef_(view,elDef,elData)}var ViewContainerRef_=function(){function ViewContainerRef_(_view,_elDef,_data){this._view=_view,this._elDef=_elDef,this._data=_data,this._embeddedViews=[]}return Object.defineProperty(ViewContainerRef_.prototype,"element",{get:function(){return new ElementRef(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(ViewContainerRef_.prototype,"injector",{get:function(){return new Injector_(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(ViewContainerRef_.prototype,"parentInjector",{get:function(){for(var view=this._view,elDef=this._elDef.parent;!elDef&&view;)elDef=viewParentEl(view),view=view.parent;return view?new Injector_(view,elDef):new Injector_(this._view,null)},enumerable:!0,configurable:!0}),ViewContainerRef_.prototype.clear=function(){for(var i=this._embeddedViews.length-1;i>=0;i--){var view=detachEmbeddedView(this._data,i);Services.destroyView(view)}},ViewContainerRef_.prototype.get=function(index){var view=this._embeddedViews[index];if(view){var ref=new ViewRef_(view);return ref.attachToViewContainerRef(this),ref}return null},Object.defineProperty(ViewContainerRef_.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),ViewContainerRef_.prototype.createEmbeddedView=function(templateRef,context,index){var viewRef=templateRef.createEmbeddedView(context||{});return this.insert(viewRef,index),viewRef},ViewContainerRef_.prototype.createComponent=function(componentFactory,index,injector,projectableNodes,ngModuleRef){var contextInjector=injector||this.parentInjector;ngModuleRef||componentFactory instanceof ComponentFactoryBoundToModule||(ngModuleRef=contextInjector.get(NgModuleRef));var componentRef=componentFactory.create(contextInjector,projectableNodes,void 0,ngModuleRef);return this.insert(componentRef.hostView,index),componentRef},ViewContainerRef_.prototype.insert=function(viewRef,index){Iif(viewRef.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var viewRef_=viewRef,viewData=viewRef_._view;return attachEmbeddedView(this._view,this._data,index,viewData),viewRef_.attachToViewContainerRef(this),viewRef},ViewContainerRef_.prototype.move=function(viewRef,currentIndex){if(viewRef.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var previousIndex=this._embeddedViews.indexOf(viewRef._view);return function moveEmbeddedView(elementData,oldViewIndex,newViewIndex){var embeddedViews=elementData.viewContainer._embeddedViews,view=embeddedViews[oldViewIndex];return removeFromArray(embeddedViews,oldViewIndex),null==newViewIndex&&(newViewIndex=embeddedViews.length),addToArray(embeddedViews,newViewIndex,view),Services.dirtyParentQueries(view),renderDetachView$1(view),renderAttachEmbeddedView(elementData,newViewIndex>0?embeddedViews[newViewIndex-1]:null,view),view}(this._data,previousIndex,currentIndex),viewRef},ViewContainerRef_.prototype.indexOf=function(viewRef){return this._embeddedViews.indexOf(viewRef._view)},ViewContainerRef_.prototype.remove=function(index){var viewData=detachEmbeddedView(this._data,index);viewData&&Services.destroyView(viewData)},ViewContainerRef_.prototype.detach=function(index){var view=detachEmbeddedView(this._data,index);return view?new ViewRef_(view):null},ViewContainerRef_}();function createChangeDetectorRef(view){return new ViewRef_(view)}var ViewRef_=function(){function ViewRef_(_view){this._view=_view,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(ViewRef_.prototype,"rootNodes",{get:function(){return function rootRenderNodes(view){var renderNodes=[];return visitRootRenderNodes(view,0,void 0,void 0,renderNodes),renderNodes}(this._view)},enumerable:!0,configurable:!0}),Object.defineProperty(ViewRef_.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(ViewRef_.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),ViewRef_.prototype.markForCheck=function(){markParentViewsForCheck(this._view)},ViewRef_.prototype.detach=function(){this._view.state&=-5},ViewRef_.prototype.detectChanges=function(){var fs=this._view.root.rendererFactory;fs.begin&&fs.begin();try{Services.checkAndUpdateView(this._view)}finally{fs.end&&fs.end()}},ViewRef_.prototype.checkNoChanges=function(){Services.checkNoChangesView(this._view)},ViewRef_.prototype.reattach=function(){this._view.state|=4},ViewRef_.prototype.onDestroy=function(callback){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(callback)},ViewRef_.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),Services.destroyView(this._view)},ViewRef_.prototype.detachFromAppRef=function(){this._appRef=null,renderDetachView$1(this._view),Services.dirtyParentQueries(this._view)},ViewRef_.prototype.attachToAppRef=function(appRef){Iif(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=appRef},ViewRef_.prototype.attachToViewContainerRef=function(vcRef){Iif(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=vcRef},ViewRef_}();function createTemplateData(view,def){return new TemplateRef_(view,def)}var TemplateRef_=function(_super){function TemplateRef_(_parentView,_def){var _this=_super.call(this)||this;return _this._parentView=_parentView,_this._def=_def,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TemplateRef_,_super),TemplateRef_.prototype.createEmbeddedView=function(context){return new ViewRef_(Services.createEmbeddedView(this._parentView,this._def,this._def.element.template,context))},Object.defineProperty(TemplateRef_.prototype,"elementRef",{get:function(){return new ElementRef(asElementData(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),TemplateRef_}(TemplateRef);function createInjector$1(view,elDef){return new Injector_(view,elDef)}var Injector_=function(){function Injector_(view,elDef){this.view=view,this.elDef=elDef}return Injector_.prototype.get=function(token,notFoundValue){void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND);var allowPrivateServices=!!this.elDef&&0!=(33554432&this.elDef.flags);return Services.resolveDep(this.view,this.elDef,allowPrivateServices,{flags:0,token:token,tokenKey:tokenKey(token)},notFoundValue)},Injector_}();function nodeValue(view,index){var def=view.def.nodes[index];if(1&def.flags){var elData=asElementData(view,def.nodeIndex);return def.element.template?elData.template:elData.renderElement}if(2&def.flags)return asTextData(view,def.nodeIndex).renderText;if(20240&def.flags)return asProviderData(view,def.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+index)}function createRendererV1(view){return new RendererAdapter(view.renderer)}var RendererAdapter=function(){function RendererAdapter(delegate){this.delegate=delegate}return RendererAdapter.prototype.selectRootElement=function(selectorOrNode){return this.delegate.selectRootElement(selectorOrNode)},RendererAdapter.prototype.createElement=function(parent,namespaceAndName){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNamespace(namespaceAndName),2),ns=_a[0],name=_a[1],el=this.delegate.createElement(name,ns);return parent&&this.delegate.appendChild(parent,el),el},RendererAdapter.prototype.createViewRoot=function(hostElement){return hostElement},RendererAdapter.prototype.createTemplateAnchor=function(parentElement){var comment=this.delegate.createComment("");return parentElement&&this.delegate.appendChild(parentElement,comment),comment},RendererAdapter.prototype.createText=function(parentElement,value){var node=this.delegate.createText(value);return parentElement&&this.delegate.appendChild(parentElement,node),node},RendererAdapter.prototype.projectNodes=function(parentElement,nodes){for(var i=0;i<nodes.length;i++)this.delegate.appendChild(parentElement,nodes[i])},RendererAdapter.prototype.attachViewAfter=function(node,viewRootNodes){for(var parentElement=this.delegate.parentNode(node),nextSibling=this.delegate.nextSibling(node),i=0;i<viewRootNodes.length;i++)this.delegate.insertBefore(parentElement,viewRootNodes[i],nextSibling)},RendererAdapter.prototype.detachView=function(viewRootNodes){for(var i=0;i<viewRootNodes.length;i++){var node=viewRootNodes[i],parentElement=this.delegate.parentNode(node);this.delegate.removeChild(parentElement,node)}},RendererAdapter.prototype.destroyView=function(hostElement,viewAllNodes){for(var i=0;i<viewAllNodes.length;i++)this.delegate.destroyNode(viewAllNodes[i])},RendererAdapter.prototype.listen=function(renderElement,name,callback){return this.delegate.listen(renderElement,name,callback)},RendererAdapter.prototype.listenGlobal=function(target,name,callback){return this.delegate.listen(target,name,callback)},RendererAdapter.prototype.setElementProperty=function(renderElement,propertyName,propertyValue){this.delegate.setProperty(renderElement,propertyName,propertyValue)},RendererAdapter.prototype.setElementAttribute=function(renderElement,namespaceAndName,attributeValue){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNamespace(namespaceAndName),2),ns=_a[0],name=_a[1];null!=attributeValue?this.delegate.setAttribute(renderElement,name,attributeValue,ns):this.delegate.removeAttribute(renderElement,name,ns)},RendererAdapter.prototype.setBindingDebugInfo=function(renderElement,propertyName,propertyValue){},RendererAdapter.prototype.setElementClass=function(renderElement,className,isAdd){isAdd?this.delegate.addClass(renderElement,className):this.delegate.removeClass(renderElement,className)},RendererAdapter.prototype.setElementStyle=function(renderElement,styleName,styleValue){null!=styleValue?this.delegate.setStyle(renderElement,styleName,styleValue):this.delegate.removeStyle(renderElement,styleName)},RendererAdapter.prototype.invokeElementMethod=function(renderElement,methodName,args){renderElement[methodName].apply(renderElement,args)},RendererAdapter.prototype.setText=function(renderNode,text){this.delegate.setValue(renderNode,text)},RendererAdapter.prototype.animate=function(){throw new Error("Renderer.animate is no longer supported!")},RendererAdapter}();function createNgModuleRef(moduleType,parent,bootstrapComponents,def){return new NgModuleRef_(moduleType,parent,bootstrapComponents,def)}var NgModuleRef_=function(){function NgModuleRef_(_moduleType,_parent,_bootstrapComponents,_def){this._moduleType=_moduleType,this._parent=_parent,this._bootstrapComponents=_bootstrapComponents,this._def=_def,this._destroyListeners=[],this._destroyed=!1,this.injector=this,function initNgModule(data){for(var def=data._def,providers=data._providers=new Array(def.providers.length),i=0;i<def.providers.length;i++){var provDef=def.providers[i];4096&provDef.flags||void 0===providers[i]&&(providers[i]=_createProviderInstance(data,provDef))}}(this)}return NgModuleRef_.prototype.get=function(token,notFoundValue,injectFlags){void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND),void 0===injectFlags&&(injectFlags=InjectFlags.Default);var flags=0;return injectFlags&InjectFlags.SkipSelf?flags|=1:injectFlags&InjectFlags.Self&&(flags|=4),resolveNgModuleDep(this,{token:token,tokenKey:tokenKey(token),flags:flags},notFoundValue)},Object.defineProperty(NgModuleRef_.prototype,"instance",{get:function(){return this.get(this._moduleType)},enumerable:!0,configurable:!0}),Object.defineProperty(NgModuleRef_.prototype,"componentFactoryResolver",{get:function(){return this.get(ComponentFactoryResolver)},enumerable:!0,configurable:!0}),NgModuleRef_.prototype.destroy=function(){if(this._destroyed)throw new Error("The ng module "+stringify(this.instance.constructor)+" has already been destroyed.");this._destroyed=!0,function callNgModuleLifecycle(ngModule,lifecycles){for(var def=ngModule._def,destroyed=new Set,i=0;i<def.providers.length;i++){if(131072&def.providers[i].flags){var instance=ngModule._providers[i];if(instance&&instance!==UNDEFINED_VALUE){var onDestroy=instance.ngOnDestroy;"function"!=typeof onDestroy||destroyed.has(instance)||(onDestroy.apply(instance),destroyed.add(instance))}}}}(this),this._destroyListeners.forEach(function(listener){return listener()})},NgModuleRef_.prototype.onDestroy=function(callback){this._destroyListeners.push(callback)},NgModuleRef_}(),RendererV1TokenKey=tokenKey(Renderer),Renderer2TokenKey=tokenKey(Renderer2),ElementRefTokenKey=tokenKey(ElementRef),ViewContainerRefTokenKey=tokenKey(ViewContainerRef),TemplateRefTokenKey=tokenKey(TemplateRef),ChangeDetectorRefTokenKey=tokenKey(ChangeDetectorRef),InjectorRefTokenKey$1=tokenKey(Injector),INJECTORRefTokenKey$1=tokenKey(INJECTOR);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function directiveDef(checkIndex,flags,matchedQueries,childCount,ctor,deps,props,outputs){var bindings=[];Iif(props)for(var prop in props){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(props[prop],2),bindingIndex=_a[0],nonMinifiedName=_a[1];bindings[bindingIndex]={flags:8,name:prop,nonMinifiedName:nonMinifiedName,ns:null,securityContext:null,suffix:null}}var outputDefs=[];Iif(outputs)for(var propName in outputs)outputDefs.push({type:1,propName:propName,target:null,eventName:outputs[propName]});return _def(checkIndex,flags|=16384,matchedQueries,childCount,ctor,ctor,deps,bindings,outputDefs)}function pipeDef(flags,ctor,deps){return _def(-1,flags|=16,null,0,ctor,ctor,deps)}function providerDef(flags,matchedQueries,token,value,deps){return _def(-1,flags,matchedQueries,0,token,value,deps)}function _def(checkIndex,flags,matchedQueriesDsl,childCount,token,value,deps,bindings,outputs){var _a=splitMatchedQueriesDsl(matchedQueriesDsl),matchedQueries=_a.matchedQueries,references=_a.references,matchedQueryIds=_a.matchedQueryIds;outputs||(outputs=[]),bindings||(bindings=[]),value=resolveForwardRef(value);var depDefs=splitDepsDsl(deps,stringify(token));return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:checkIndex,flags:flags,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:matchedQueries,matchedQueryIds:matchedQueryIds,references:references,ngContentIndex:-1,childCount:childCount,bindings:bindings,bindingFlags:calcBindingFlags(bindings),outputs:outputs,element:null,provider:{token:token,value:value,deps:depDefs},text:null,query:null,ngContent:null}}function createProviderInstance(view,def){return _createProviderInstance$1(view,def)}function createPipeInstance(view,def){for(var compView=view;compView.parent&&!isComponentView(compView);)compView=compView.parent;return createClass(compView.parent,viewParentEl(compView),!0,def.provider.value,def.provider.deps)}function createDirectiveInstance(view,def){var allowPrivateServices=(32768&def.flags)>0,instance=createClass(view,def.parent,allowPrivateServices,def.provider.value,def.provider.deps);Iif(def.outputs.length)for(var i=0;i<def.outputs.length;i++){var output=def.outputs[i],outputObservable=instance[output.propName];if(!isObservable(outputObservable))throw new Error("@Output "+output.propName+" not initialized in '"+instance.constructor.name+"'.");var subscription=outputObservable.subscribe(eventHandlerClosure(view,def.parent.nodeIndex,output.eventName));view.disposables[def.outputIndex+i]=subscription.unsubscribe.bind(subscription)}return instance}function eventHandlerClosure(view,index,eventName){return function(event){return dispatchEvent(view,index,eventName,event)}}function _createProviderInstance$1(view,def){var allowPrivateServices=(8192&def.flags)>0,providerDef=def.provider;switch(201347067&def.flags){case 512:return createClass(view,def.parent,allowPrivateServices,providerDef.value,providerDef.deps);case 1024:return function callFactory(view,elDef,allowPrivateServices,factory,deps){var len=deps.length;switch(len){case 0:return factory();case 1:return factory(resolveDep(view,elDef,allowPrivateServices,deps[0]));case 2:return factory(resolveDep(view,elDef,allowPrivateServices,deps[0]),resolveDep(view,elDef,allowPrivateServices,deps[1]));case 3:return factory(resolveDep(view,elDef,allowPrivateServices,deps[0]),resolveDep(view,elDef,allowPrivateServices,deps[1]),resolveDep(view,elDef,allowPrivateServices,deps[2]));default:for(var depValues=Array(len),i=0;i<len;i++)depValues[i]=resolveDep(view,elDef,allowPrivateServices,deps[i]);return factory.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(depValues))}}(view,def.parent,allowPrivateServices,providerDef.value,providerDef.deps);case 2048:return resolveDep(view,def.parent,allowPrivateServices,providerDef.deps[0]);case 256:return providerDef.value}}function createClass(view,elDef,allowPrivateServices,ctor,deps){var len=deps.length;switch(len){case 0:return new ctor;case 1:return new ctor(resolveDep(view,elDef,allowPrivateServices,deps[0]));case 2:return new ctor(resolveDep(view,elDef,allowPrivateServices,deps[0]),resolveDep(view,elDef,allowPrivateServices,deps[1]));case 3:return new ctor(resolveDep(view,elDef,allowPrivateServices,deps[0]),resolveDep(view,elDef,allowPrivateServices,deps[1]),resolveDep(view,elDef,allowPrivateServices,deps[2]));default:for(var depValues=new Array(len),i=0;i<len;i++)depValues[i]=resolveDep(view,elDef,allowPrivateServices,deps[i]);return new(ctor.bind.apply(ctor,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],depValues)))}}var NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR={};function resolveDep(view,elDef,allowPrivateServices,depDef,notFoundValue){Iif(void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND),8&depDef.flags)return depDef.token;var startView=view;2&depDef.flags&&(notFoundValue=null);var tokenKey=depDef.tokenKey;tokenKey===ChangeDetectorRefTokenKey&&(allowPrivateServices=!(!elDef||!elDef.element.componentView)),elDef&&1&depDef.flags&&(allowPrivateServices=!1,elDef=elDef.parent);for(var searchView=view;searchView;){Eif(elDef)switch(tokenKey){case RendererV1TokenKey:return createRendererV1(findCompView(searchView,elDef,allowPrivateServices));case Renderer2TokenKey:return findCompView(searchView,elDef,allowPrivateServices).renderer;case ElementRefTokenKey:return new ElementRef(asElementData(searchView,elDef.nodeIndex).renderElement);case ViewContainerRefTokenKey:return asElementData(searchView,elDef.nodeIndex).viewContainer;case TemplateRefTokenKey:if(elDef.element.template)return asElementData(searchView,elDef.nodeIndex).template;break;case ChangeDetectorRefTokenKey:return createChangeDetectorRef(findCompView(searchView,elDef,allowPrivateServices));case InjectorRefTokenKey$1:case INJECTORRefTokenKey$1:return createInjector$1(searchView,elDef);default:var providerDef_1=(allowPrivateServices?elDef.element.allProviders:elDef.element.publicProviders)[tokenKey];Iif(providerDef_1){var providerData=asProviderData(searchView,providerDef_1.nodeIndex);return providerData||(providerData={instance:_createProviderInstance$1(searchView,providerDef_1)},searchView.nodes[providerDef_1.nodeIndex]=providerData),providerData.instance}}allowPrivateServices=isComponentView(searchView),elDef=viewParentEl(searchView),searchView=searchView.parent,4&depDef.flags&&(searchView=null)}var value=startView.root.injector.get(depDef.token,NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR);return value!==NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR||notFoundValue===NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR?value:startView.root.ngModule.injector.get(depDef.token,notFoundValue)}function findCompView(view,elDef,allowPrivateServices){var compView;Eif(allowPrivateServices)compView=asElementData(view,elDef.nodeIndex).componentView;else for(compView=view;compView.parent&&!isComponentView(compView);)compView=compView.parent;return compView}function updateProp(view,providerData,def,bindingIdx,value,changes){if(32768&def.flags){var compView=asElementData(view,def.parent.nodeIndex).componentView;2&compView.def.flags&&(compView.state|=8)}var propName=def.bindings[bindingIdx].name;if(providerData.instance[propName]=value,524288&def.flags){changes=changes||{};var oldValue=WrappedValue.unwrap(view.oldValues[def.bindingIndex+bindingIdx]);changes[def.bindings[bindingIdx].nonMinifiedName]=new SimpleChange(oldValue,value,0!=(2&view.state))}return view.oldValues[def.bindingIndex+bindingIdx]=value,changes}function callLifecycleHooksChildrenFirst(view,lifecycles){Iif(view.def.nodeFlags&lifecycles)for(var nodes=view.def.nodes,initIndex=0,i=0;i<nodes.length;i++){var nodeDef=nodes[i],parent_1=nodeDef.parent;for(!parent_1&&nodeDef.flags&lifecycles&&callProviderLifecycles(view,i,nodeDef.flags&lifecycles,initIndex++),0==(nodeDef.childFlags&lifecycles)&&(i+=nodeDef.childCount);parent_1&&1&parent_1.flags&&i===parent_1.nodeIndex+parent_1.childCount;)parent_1.directChildFlags&lifecycles&&(initIndex=callElementProvidersLifecycles(view,parent_1,lifecycles,initIndex)),parent_1=parent_1.parent}}function callElementProvidersLifecycles(view,elDef,lifecycles,initIndex){for(var i=elDef.nodeIndex+1;i<=elDef.nodeIndex+elDef.childCount;i++){var nodeDef=view.def.nodes[i];nodeDef.flags&lifecycles&&callProviderLifecycles(view,i,nodeDef.flags&lifecycles,initIndex++),i+=nodeDef.childCount}return initIndex}function callProviderLifecycles(view,index,lifecycles,initIndex){var providerData=asProviderData(view,index);if(providerData){var provider=providerData.instance;provider&&(Services.setCurrentNode(view,index),1048576&lifecycles&&shouldCallLifecycleInitHook(view,512,initIndex)&&provider.ngAfterContentInit(),2097152&lifecycles&&provider.ngAfterContentChecked(),4194304&lifecycles&&shouldCallLifecycleInitHook(view,768,initIndex)&&provider.ngAfterViewInit(),8388608&lifecycles&&provider.ngAfterViewChecked(),131072&lifecycles&&provider.ngOnDestroy())}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ComponentFactoryResolver$1=function(_super){function ComponentFactoryResolver(ngModule){var _this=_super.call(this)||this;return _this.ngModule=ngModule,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentFactoryResolver,_super),ComponentFactoryResolver.prototype.resolveComponentFactory=function(component){ngDevMode&&assertComponentType(component);var componentDef=getComponentDef(component);return new ComponentFactory$1(componentDef,this.ngModule)},ComponentFactoryResolver}(ComponentFactoryResolver);function toRefArray(map){var array=[];for(var nonMinified in map)if(map.hasOwnProperty(nonMinified)){var minified=map[nonMinified];array.push({propName:minified,templateName:nonMinified})}return array}var ROOT_CONTEXT=new InjectionToken("ROOT_CONTEXT_TOKEN",{providedIn:"root",factory:function(){return createRootContext(ɵɵinject(SCHEDULER))}}),SCHEDULER=new InjectionToken("SCHEDULER_TOKEN",{providedIn:"root",factory:function(){return defaultScheduler}});var ComponentFactory$1=function(_super){function ComponentFactory(componentDef,ngModule){var _this=_super.call(this)||this;return _this.componentDef=componentDef,_this.ngModule=ngModule,_this.componentType=componentDef.type,_this.selector=componentDef.selectors[0][0],_this.ngContentSelectors=componentDef.ngContentSelectors?componentDef.ngContentSelectors:[],_this.isBoundToModule=!!ngModule,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentFactory,_super),Object.defineProperty(ComponentFactory.prototype,"inputs",{get:function(){return toRefArray(this.componentDef.inputs)},enumerable:!0,configurable:!0}),Object.defineProperty(ComponentFactory.prototype,"outputs",{get:function(){return toRefArray(this.componentDef.outputs)},enumerable:!0,configurable:!0}),ComponentFactory.prototype.create=function(injector,projectableNodes,rootSelectorOrNode,ngModule){var isInternalRootView=void 0===rootSelectorOrNode,rootViewInjector=(ngModule=ngModule||this.ngModule)?function createChainedInjector(rootViewInjector,moduleInjector){return{get:function(token,notFoundValue,flags){var value=rootViewInjector.get(token,NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR,flags);return value!==NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR||notFoundValue===NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR?value:moduleInjector.get(token,notFoundValue,flags)}}}(injector,ngModule.injector):injector,rendererFactory=rootViewInjector.get(RendererFactory2,domRendererFactory3),sanitizer=rootViewInjector.get(Sanitizer,null),hostRNode=isInternalRootView?elementCreate(this.selector,rendererFactory.createRenderer(null,this.componentDef)):locateHostElement(rendererFactory,rootSelectorOrNode),rootFlags=this.componentDef.onPush?576:528,isIsolated="string"==typeof rootSelectorOrNode&&/^#root-ng-internal-isolated-\d+/.test(rootSelectorOrNode),rootContext=isInternalRootView||isIsolated?createRootContext():rootViewInjector.get(ROOT_CONTEXT),renderer=rendererFactory.createRenderer(hostRNode,this.componentDef);rootSelectorOrNode&&hostRNode&&(ngDevMode&&ngDevMode.rendererSetAttribute++,isProceduralRenderer(renderer)?renderer.setAttribute(hostRNode,"ng-version",VERSION.full):hostRNode.setAttribute("ng-version",VERSION.full));var component,tElementNode,rootLView=createLView(null,createTView(-1,null,1,0,null,null,null,null),rootContext,rootFlags,null,null,rendererFactory,renderer,sanitizer,rootViewInjector),oldLView=enterView(rootLView,null);try{var componentView=createRootComponentView(hostRNode,this.componentDef,rootLView,rendererFactory,renderer);tElementNode=getTNode(0,rootLView),projectableNodes&&(tElementNode.projection=projectableNodes.map(function(nodesforSlot){return Array.from(nodesforSlot)})),component=createRootComponent(componentView,this.componentDef,rootLView,rootContext,[LifecycleHooksFeature]),addToViewTree(rootLView,componentView),refreshDescendantViews(rootLView)}finally{leaveView(oldLView)}var componentRef=new ComponentRef$1(this.componentType,component,createElementRef(ElementRef,tElementNode,rootLView),rootLView,tElementNode);return isInternalRootView&&(componentRef.hostView._tViewNode.child=tElementNode),componentRef},ComponentFactory}(ComponentFactory),ComponentRef$1=(new ComponentFactoryResolver$1,function(_super){function ComponentRef(componentType,instance,location,_rootLView,_tNode){var _this=_super.call(this)||this;return _this.location=location,_this._rootLView=_rootLView,_this._tNode=_tNode,_this.destroyCbs=[],_this.instance=instance,_this.hostView=_this.changeDetectorRef=new RootViewRef(_rootLView),_this.hostView._tViewNode=assignTViewNodeToLView(_rootLView[TVIEW],null,-1,_rootLView),_this.componentType=componentType,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ComponentRef,_super),Object.defineProperty(ComponentRef.prototype,"injector",{get:function(){return new NodeInjector(this._tNode,this._rootLView)},enumerable:!0,configurable:!0}),ComponentRef.prototype.destroy=function(){ngDevMode&&assertDefined(this.destroyCbs,"NgModule already destroyed"),this.destroyCbs.forEach(function(fn){return fn()}),this.destroyCbs=null,!this.hostView.destroyed&&this.hostView.destroy()},ComponentRef.prototype.onDestroy=function(callback){ngDevMode&&assertDefined(this.destroyCbs,"NgModule already destroyed"),this.destroyCbs.push(callback)},ComponentRef}(ComponentRef));function flatten(list,dst){void 0===dst&&(dst=list);for(var i=0;i<list.length;i++){var item=list[i];Array.isArray(item)?(dst===list&&(dst=list.slice(0,i)),flatten(item,dst)):dst!==list&&dst.push(item)}return dst}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
"undefined"==typeof ngI18nClosureMode&&(_global.ngI18nClosureMode="undefined"!=typeof goog&&"function"==typeof goog.getMsg)
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var Plural;!function(Plural){Plural[Plural.Zero=0]="Zero",Plural[Plural.One=1]="One",Plural[Plural.Two=2]="Two",Plural[Plural.Few=3]="Few",Plural[Plural.Many=4]="Many",Plural[Plural.Other=5]="Other"}(Plural||(Plural={}));
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var COMPONENT_FACTORY_RESOLVER={provide:ComponentFactoryResolver,useClass:ComponentFactoryResolver$1,deps:[NgModuleRef]},NgModuleRef$1=function(_super){function NgModuleRef$1(ngModuleType,_parent){var _this=_super.call(this)||this;_this._parent=_parent,_this._bootstrapComponents=[],_this.injector=_this,_this.destroyCbs=[];var ngModuleDef=getNgModuleDef(ngModuleType);ngDevMode&&assertDefined(ngModuleDef,"NgModule '"+stringify(ngModuleType)+"' is not a subtype of 'NgModuleType'."),_this._bootstrapComponents=maybeUnwrapFn(ngModuleDef.bootstrap);var additionalProviders=[{provide:NgModuleRef,useValue:_this},COMPONENT_FACTORY_RESOLVER];return _this._r3Injector=function createInjector(defType,parent,additionalProviders,name){return void 0===parent&&(parent=null),void 0===additionalProviders&&(additionalProviders=null),parent=parent||getNullInjector(),new R3Injector(defType,additionalProviders,parent,name)}(ngModuleType,_parent,additionalProviders,stringify(ngModuleType)),_this.instance=_this.get(ngModuleType),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(NgModuleRef$1,_super),NgModuleRef$1.prototype.get=function(token,notFoundValue,injectFlags){return void 0===notFoundValue&&(notFoundValue=Injector.THROW_IF_NOT_FOUND),void 0===injectFlags&&(injectFlags=InjectFlags.Default),token===Injector||token===NgModuleRef||token===INJECTOR?this:this._r3Injector.get(token,notFoundValue,injectFlags)},Object.defineProperty(NgModuleRef$1.prototype,"componentFactoryResolver",{get:function(){return this.get(ComponentFactoryResolver)},enumerable:!0,configurable:!0}),NgModuleRef$1.prototype.destroy=function(){ngDevMode&&assertDefined(this.destroyCbs,"NgModule already destroyed");var injector=this._r3Injector;!injector.destroyed&&injector.destroy(),this.destroyCbs.forEach(function(fn){return fn()}),this.destroyCbs=null},NgModuleRef$1.prototype.onDestroy=function(callback){ngDevMode&&assertDefined(this.destroyCbs,"NgModule already destroyed"),this.destroyCbs.push(callback)},NgModuleRef$1}(NgModuleRef);!function(_super){function NgModuleFactory(moduleType){var _this=_super.call(this)||this;return _this.moduleType=moduleType,_this}Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(NgModuleFactory,_super),NgModuleFactory.prototype.create=function(parentInjector){return new NgModuleRef$1(this.moduleType,parentInjector)}}(NgModuleFactory);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var EventEmitter=function(_super){function EventEmitter(isAsync){void 0===isAsync&&(isAsync=!1);var _this=_super.call(this)||this;return _this.__isAsync=isAsync,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(EventEmitter,_super),EventEmitter.prototype.emit=function(value){_super.prototype.next.call(this,value)},EventEmitter.prototype.subscribe=function(generatorOrNext,error,complete){var schedulerFn,errorFn=function(err){return null},completeFn=function(){return null};generatorOrNext&&"object"==typeof generatorOrNext?(schedulerFn=this.__isAsync?function(value){setTimeout(function(){return generatorOrNext.next(value)})}:function(value){generatorOrNext.next(value)},generatorOrNext.error&&(errorFn=this.__isAsync?function(err){setTimeout(function(){return generatorOrNext.error(err)})}:function(err){generatorOrNext.error(err)}),generatorOrNext.complete&&(completeFn=this.__isAsync?function(){setTimeout(function(){return generatorOrNext.complete()})}:function(){generatorOrNext.complete()})):(schedulerFn=this.__isAsync?function(value){setTimeout(function(){return generatorOrNext(value)})}:function(value){generatorOrNext(value)},error&&(errorFn=this.__isAsync?function(err){setTimeout(function(){return error(err)})}:function(err){error(err)}),complete&&(completeFn=this.__isAsync?function(){setTimeout(function(){return complete()})}:function(){complete()}));var sink=_super.prototype.subscribe.call(this,schedulerFn,errorFn,completeFn);return generatorOrNext instanceof rxjs__WEBPACK_IMPORTED_MODULE_1__.a&&generatorOrNext.add(sink),sink},EventEmitter}(rxjs__WEBPACK_IMPORTED_MODULE_2__.a),QueryList=function(){function QueryList(){this.dirty=!0,this._results=[],this.changes=new EventEmitter,this.length=0}return QueryList.prototype.map=function(fn){return this._results.map(fn)},QueryList.prototype.filter=function(fn){return this._results.filter(fn)},QueryList.prototype.find=function(fn){return this._results.find(fn)},QueryList.prototype.reduce=function(fn,init){return this._results.reduce(fn,init)},QueryList.prototype.forEach=function(fn){this._results.forEach(fn)},QueryList.prototype.some=function(fn){return this._results.some(fn)},QueryList.prototype.toArray=function(){return this._results.slice()},QueryList.prototype[getSymbolIterator()]=function(){return this._results[getSymbolIterator()]()},QueryList.prototype.toString=function(){return this._results.toString()},QueryList.prototype.reset=function(resultsTree){this._results=flatten(resultsTree),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},QueryList.prototype.notifyOnChanges=function(){this.changes.emit(this)},QueryList.prototype.setDirty=function(){this.dirty=!0},QueryList.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},QueryList}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(){function LQueries_(parent,shallow,deep){this.parent=parent,this.shallow=shallow,this.deep=deep}LQueries_.prototype.track=function(queryList,predicate,descend,read){descend?this.deep=createQuery(this.deep,queryList,predicate,null!=read?read:null):this.shallow=createQuery(this.shallow,queryList,predicate,null!=read?read:null)},LQueries_.prototype.clone=function(){return new LQueries_(this,null,this.deep)},LQueries_.prototype.container=function(){var shallowResults=copyQueriesToContainer(this.shallow),deepResults=copyQueriesToContainer(this.deep);return shallowResults||deepResults?new LQueries_(this,shallowResults,deepResults):null},LQueries_.prototype.createView=function(){var shallowResults=copyQueriesToView(this.shallow),deepResults=copyQueriesToView(this.deep);return shallowResults||deepResults?new LQueries_(this,shallowResults,deepResults):null},LQueries_.prototype.insertView=function(index){insertView$1(index,this.shallow),insertView$1(index,this.deep)},LQueries_.prototype.addNode=function(tNode){add(this.deep,tNode,!1),add(this.shallow,tNode,!1)},LQueries_.prototype.insertNodeBeforeViews=function(tNode){add(this.deep,tNode,!0),add(this.shallow,tNode,!0)},LQueries_.prototype.removeView=function(){removeView$1(this.shallow),removeView$1(this.deep)}}();function copyQueriesToContainer(query){for(var result=null;query;){var containerValues=[];query.values.push(containerValues),result={next:result,list:query.list,predicate:query.predicate,values:containerValues,containerValues:null},query=query.next}return result}function copyQueriesToView(query){for(var result=null;query;){result={next:result,list:query.list,predicate:query.predicate,values:[],containerValues:query.values},query=query.next}return result}function insertView$1(index,query){for(;query;)ngDevMode&&assertViewQueryhasPointerToDeclarationContainer(query),query.containerValues.splice(index,0,query.values),query.values.length&&query.list.setDirty(),query=query.next}function removeView$1(query){for(;query;){ngDevMode&&assertViewQueryhasPointerToDeclarationContainer(query);var containerValues=query.containerValues,viewValuesIdx=containerValues.indexOf(query.values),removed=containerValues.splice(viewValuesIdx,1);ngDevMode&&assertEqual(removed.length,1,"removed.length"),removed[0].length&&query.list.setDirty(),query=query.next}}function assertViewQueryhasPointerToDeclarationContainer(query){assertDefined(query.containerValues,"View queries need to have a pointer to container values.")}function getIdxOfMatchingSelector(tNode,selector){var localNames=tNode.localNames;if(localNames)for(var i=0;i<localNames.length;i+=2)if(localNames[i]===selector)return localNames[i+1];return null}function queryByReadToken(read,tNode,currentView){var factoryFn=read[NG_ELEMENT_ID];if("function"==typeof factoryFn)return factoryFn();var matchingIdx=locateDirectiveOrProvider(tNode,currentView,read,!1,!1);return null!==matchingIdx?getNodeInjectable(currentView[TVIEW].data,currentView,matchingIdx,tNode):null}function queryByTemplateRef(templateRefToken,tNode,currentView,read){var templateRefResult=templateRefToken[NG_ELEMENT_ID]();return read?templateRefResult?queryByReadToken(read,tNode,currentView):null:templateRefResult}function queryRead(tNode,currentView,read,matchingIdx){return read?queryByReadToken(read,tNode,currentView):matchingIdx>-1?getNodeInjectable(currentView[TVIEW].data,currentView,matchingIdx,tNode):function queryByTNodeType(tNode,currentView){return 3===tNode.type||4===tNode.type?createElementRef(ElementRef,tNode,currentView):0===tNode.type?createTemplateRef(TemplateRef,ElementRef,tNode,currentView):null}(tNode,currentView)}function add(query,tNode,insertBeforeContainer){for(var currentView=getLView();query;){var predicate=query.predicate,type=predicate.type;if(type){var result=null;if(type===TemplateRef)result=queryByTemplateRef(type,tNode,currentView,predicate.read);else null!==(matchingIdx=locateDirectiveOrProvider(tNode,currentView,type,!1,!1))&&(result=queryRead(tNode,currentView,predicate.read,matchingIdx));null!==result&&addMatch(query,result,insertBeforeContainer)}else for(var selector=predicate.selector,i=0;i<selector.length;i++){var matchingIdx;if(null!==(matchingIdx=getIdxOfMatchingSelector(tNode,selector[i])))null!==(result=queryRead(tNode,currentView,predicate.read,matchingIdx))&&addMatch(query,result,insertBeforeContainer)}query=query.next}}function addMatch(query,matchingValue,insertBeforeViewMatches){insertBeforeViewMatches?query.values.splice(-1,0,matchingValue):query.values.push(matchingValue),query.list.setDirty()}function createPredicate(predicate,read){var isArray=Array.isArray(predicate);return{type:isArray?null:predicate,selector:isArray?predicate:null,read:read}}function createQuery(previous,queryList,predicate,read){return{next:previous,list:queryList,predicate:createPredicate(predicate,read),values:queryList._valuesTree,containerValues:null}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var modules=new Map;function registerModuleFactory(id,factory){var existing=modules.get(id);assertSameOrNotExisting(id,existing&&existing.moduleType,factory.moduleType),modules.set(id,factory)}function assertSameOrNotExisting(id,type,incoming){if(type&&type!==incoming)throw new Error("Duplicate module registered for "+id+" - "+stringify(type)+" vs "+stringify(type.name))}new Map,new Map;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var Directive=makeDecorator("Directive",function(dir){return void 0===dir&&(dir={}),dir},void 0,void 0,function(type,meta){return SWITCH_COMPILE_DIRECTIVE(type,meta)}),Component=makeDecorator("Component",function(c){return void 0===c&&(c={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({changeDetection:ChangeDetectionStrategy.Default},c)},Directive,void 0,function(type,meta){return SWITCH_COMPILE_COMPONENT(type,meta)}),Pipe=makeDecorator("Pipe",function(p){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({pure:!0},p)},void 0,void 0,function(type,meta){return SWITCH_COMPILE_PIPE(type,meta)}),Input=makePropDecorator("Input",function(bindingPropertyName){return{bindingPropertyName:bindingPropertyName}}),Output=makePropDecorator("Output",function(bindingPropertyName){return{bindingPropertyName:bindingPropertyName}}),SWITCH_COMPILE_COMPONENT=(makePropDecorator("HostBinding",function(hostPropertyName){return{hostPropertyName:hostPropertyName}}),makePropDecorator("HostListener",function(eventName,args){return{eventName:eventName,args:args}}),noop),SWITCH_COMPILE_DIRECTIVE=noop,SWITCH_COMPILE_PIPE=noop,NgModule=makeDecorator("NgModule",function(ngModule){return ngModule},void 0,void 0,function(type,meta){return SWITCH_COMPILE_NGMODULE(type,meta)});var SWITCH_COMPILE_NGMODULE=function preR3NgModuleCompile(moduleType,metadata){var imports=metadata&&metadata.imports||[];metadata&&metadata.exports&&(imports=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(imports,[metadata.exports])),moduleType.ngInjectorDef=ɵɵdefineInjector({factory:convertInjectableProviderToFactory(moduleType,{useClass:moduleType}),providers:metadata&&metadata.providers,imports:imports})},APP_INITIALIZER=new InjectionToken("Application Initializer"),ApplicationInitStatus=function(){function ApplicationInitStatus(appInits){var _this=this;this.appInits=appInits,this.initialized=!1,this.done=!1,this.donePromise=new Promise(function(res,rej){_this.resolve=res,_this.reject=rej})}return ApplicationInitStatus.prototype.runInitializers=function(){var _this=this;Eif(!this.initialized){var asyncInitPromises=[],complete=function(){_this.done=!0,_this.resolve()};Eif(this.appInits)for(var i=0;i<this.appInits.length;i++){var initResult=this.appInits[i]();isPromise(initResult)&&asyncInitPromises.push(initResult)}Promise.all(asyncInitPromises).then(function(){complete()}).catch(function(e){_this.reject(e)}),0===asyncInitPromises.length&&complete(),this.initialized=!0}},ApplicationInitStatus=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.e)(0,Inject(APP_INITIALIZER)),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.e)(0,Optional()),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[Array])],ApplicationInitStatus)}(),APP_ID=new InjectionToken("AppId");var APP_ID_RANDOM_PROVIDER={provide:APP_ID,useFactory:function _appIdRandomProviderFactory(){return""+_randomChar()+_randomChar()+_randomChar()},deps:[]};function _randomChar(){return String.fromCharCode(97+Math.floor(25*Math.random()))}var PLATFORM_INITIALIZER=new InjectionToken("Platform Initializer"),PLATFORM_ID=new InjectionToken("Platform ID"),APP_BOOTSTRAP_LISTENER=new InjectionToken("appBootstrapListener"),PACKAGE_ROOT_URL=new InjectionToken("Application Packages Root URL"),Console=function(){function Console(){}return Console.prototype.log=function(message){console.log(message)},Console.prototype.warn=function(message){console.warn(message)},Console=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable()],Console)}();function _throwError(){throw new Error("Runtime compiler is not loaded")}var trace,events,Compiler_compileModuleSync=_throwError,Compiler_compileModuleAsync=_throwError,Compiler_compileModuleAndAllComponentsSync=_throwError,Compiler_compileModuleAndAllComponentsAsync=_throwError,Compiler=function(){function Compiler(){this.compileModuleSync=Compiler_compileModuleSync,this.compileModuleAsync=Compiler_compileModuleAsync,this.compileModuleAndAllComponentsSync=Compiler_compileModuleAndAllComponentsSync,this.compileModuleAndAllComponentsAsync=Compiler_compileModuleAndAllComponentsAsync}return Compiler.prototype.clearCache=function(){},Compiler.prototype.clearCacheFor=function(type){},Compiler.prototype.getModuleId=function(moduleType){},Compiler=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable()],Compiler)}(),COMPILER_OPTIONS=new InjectionToken("compilerOptions"),CompilerFactory=function CompilerFactory(){};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var wtfEnabled=function detectWTF(){var wtf=_global.wtf;return!(!wtf||!(trace=wtf.trace))&&(events=trace.events,!0)}();function noopScope(arg0,arg1){return null}var wtfCreateScope=wtfEnabled?function createScope(signature,flags){return void 0===flags&&(flags=null),events.createScope(signature,flags)}:function(signature,flags){return noopScope},wtfLeave=wtfEnabled?function leave(scope,returnValue){return trace.leaveScope(scope,returnValue),returnValue}:function(s,r){return r},promise=Promise.resolve(0);function scheduleMicroTask(fn){"undefined"==typeof Zone?promise.then(function(){fn&&fn.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",fn)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var NgZone=function(){function NgZone(_a){var _b=_a.enableLongStackTrace,enableLongStackTrace=void 0!==_b&&_b;Iif(this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new EventEmitter(!1),this.onMicrotaskEmpty=new EventEmitter(!1),this.onStable=new EventEmitter(!1),this.onError=new EventEmitter(!1),"undefined"==typeof Zone)throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched();this._nesting=0,this._outer=this._inner=Zone.current,Zone.wtfZoneSpec&&(this._inner=this._inner.fork(Zone.wtfZoneSpec)),Zone.TaskTrackingZoneSpec&&(this._inner=this._inner.fork(new Zone.TaskTrackingZoneSpec)),enableLongStackTrace&&Zone.longStackTraceZoneSpec&&(this._inner=this._inner.fork(Zone.longStackTraceZoneSpec)),function forkInnerZoneWithAngularBehavior(zone){zone._inner=zone._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:function(delegate,current,target,task,applyThis,applyArgs){try{return onEnter(zone),delegate.invokeTask(target,task,applyThis,applyArgs)}finally{onLeave(zone)}},onInvoke:function(delegate,current,target,callback,applyThis,applyArgs,source){try{return onEnter(zone),delegate.invoke(target,callback,applyThis,applyArgs,source)}finally{onLeave(zone)}},onHasTask:function(delegate,current,target,hasTaskState){delegate.hasTask(target,hasTaskState),current===target&&("microTask"==hasTaskState.change?(zone.hasPendingMicrotasks=hasTaskState.microTask,checkStable(zone)):"macroTask"==hasTaskState.change&&(zone.hasPendingMacrotasks=hasTaskState.macroTask))},onHandleError:function(delegate,current,target,error){return delegate.handleError(target,error),zone.runOutsideAngular(function(){return zone.onError.emit(error)}),!1}})}(this)}return NgZone.isInAngularZone=function(){return!0===Zone.current.get("isAngularZone")},NgZone.assertInAngularZone=function(){if(!NgZone.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")},NgZone.assertNotInAngularZone=function(){Iif(NgZone.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")},NgZone.prototype.run=function(fn,applyThis,applyArgs){return this._inner.run(fn,applyThis,applyArgs)},NgZone.prototype.runTask=function(fn,applyThis,applyArgs,name){var zone=this._inner,task=zone.scheduleEventTask("NgZoneEvent: "+name,fn,EMPTY_PAYLOAD,noop$1,noop$1);try{return zone.runTask(task,applyThis,applyArgs)}finally{zone.cancelTask(task)}},NgZone.prototype.runGuarded=function(fn,applyThis,applyArgs){return this._inner.runGuarded(fn,applyThis,applyArgs)},NgZone.prototype.runOutsideAngular=function(fn){return this._outer.run(fn)},NgZone}();function noop$1(){}var EMPTY_PAYLOAD={};function checkStable(zone){if(0==zone._nesting&&!zone.hasPendingMicrotasks&&!zone.isStable)try{zone._nesting++,zone.onMicrotaskEmpty.emit(null)}finally{Eif(zone._nesting--,!zone.hasPendingMicrotasks)try{zone.runOutsideAngular(function(){return zone.onStable.emit(null)})}finally{zone.isStable=!0}}}function onEnter(zone){zone._nesting++,zone.isStable&&(zone.isStable=!1,zone.onUnstable.emit(null))}function onLeave(zone){zone._nesting--,checkStable(zone)}var NoopNgZone=function(){function NoopNgZone(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new EventEmitter,this.onMicrotaskEmpty=new EventEmitter,this.onStable=new EventEmitter,this.onError=new EventEmitter}return NoopNgZone.prototype.run=function(fn){return fn()},NoopNgZone.prototype.runGuarded=function(fn){return fn()},NoopNgZone.prototype.runOutsideAngular=function(fn){return fn()},NoopNgZone.prototype.runTask=function(fn){return fn()},NoopNgZone}(),Testability=function(){function Testability(_ngZone){var _this=this;this._ngZone=_ngZone,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,this._watchAngularEvents(),_ngZone.run(function(){_this.taskTrackingZone="undefined"==typeof Zone?null:Zone.current.get("TaskTrackingZone")})}return Testability.prototype._watchAngularEvents=function(){var _this=this;this._ngZone.onUnstable.subscribe({next:function(){_this._didWork=!0,_this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(function(){_this._ngZone.onStable.subscribe({next:function(){NgZone.assertNotInAngularZone(),scheduleMicroTask(function(){_this._isZoneStable=!0,_this._runCallbacksIfReady()})}})})},Testability.prototype.increasePendingRequestCount=function(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount},Testability.prototype.decreasePendingRequestCount=function(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount},Testability.prototype.isStable=function(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks},Testability.prototype._runCallbacksIfReady=function(){var _this=this;Eif(this.isStable())scheduleMicroTask(function(){for(;0!==_this._callbacks.length;){var cb=_this._callbacks.pop();clearTimeout(cb.timeoutId),cb.doneCb(_this._didWork)}_this._didWork=!1});else{var pending_1=this.getPendingTasks();this._callbacks=this._callbacks.filter(function(cb){return!cb.updateCb||!cb.updateCb(pending_1)||(clearTimeout(cb.timeoutId),!1)}),this._didWork=!0}},Testability.prototype.getPendingTasks=function(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(function(t){return{source:t.source,creationLocation:t.creationLocation,data:t.data}}):[]},Testability.prototype.addCallback=function(cb,timeout,updateCb){var _this=this,timeoutId=-1;timeout&&timeout>0&&(timeoutId=setTimeout(function(){_this._callbacks=_this._callbacks.filter(function(cb){return cb.timeoutId!==timeoutId}),cb(_this._didWork,_this.getPendingTasks())},timeout)),this._callbacks.push({doneCb:cb,timeoutId:timeoutId,updateCb:updateCb})},Testability.prototype.whenStable=function(doneCb,timeout,updateCb){if(updateCb&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/dist/task-tracking.js" loaded?');this.addCallback(doneCb,timeout,updateCb),this._runCallbacksIfReady()},Testability.prototype.getPendingRequestCount=function(){return this._pendingCount},Testability.prototype.findProviders=function(using,provider,exactMatch){return[]},Testability=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[NgZone])],Testability)}(),TestabilityRegistry=function(){function TestabilityRegistry(){this._applications=new Map,_testabilityGetter.addToWindow(this)}return TestabilityRegistry.prototype.registerApplication=function(token,testability){this._applications.set(token,testability)},TestabilityRegistry.prototype.unregisterApplication=function(token){this._applications.delete(token)},TestabilityRegistry.prototype.unregisterAllApplications=function(){this._applications.clear()},TestabilityRegistry.prototype.getTestability=function(elem){return this._applications.get(elem)||null},TestabilityRegistry.prototype.getAllTestabilities=function(){return Array.from(this._applications.values())},TestabilityRegistry.prototype.getAllRootElements=function(){return Array.from(this._applications.keys())},TestabilityRegistry.prototype.findTestabilityInTree=function(elem,findInAncestors){return void 0===findInAncestors&&(findInAncestors=!0),_testabilityGetter.findTestabilityInTree(this,elem,findInAncestors)},TestabilityRegistry=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[])],TestabilityRegistry)}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function setTestabilityGetter(getter){_testabilityGetter=getter}var _platform,_testabilityGetter=new(function(){function _NoopGetTestability(){}return _NoopGetTestability.prototype.addToWindow=function(registry){},_NoopGetTestability.prototype.findTestabilityInTree=function(registry,elem,findInAncestors){return null},_NoopGetTestability}()),compileNgModuleFactory=function compileNgModuleFactory__PRE_R3__(injector,options,moduleType){return injector.get(CompilerFactory).createCompiler([options]).compileModuleAsync(moduleType)};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var isBoundToModule=function isBoundToModule__PRE_R3__(cf){return cf instanceof ComponentFactoryBoundToModule};var ALLOW_MULTIPLE_PLATFORMS=new InjectionToken("AllowMultipleToken"),NgProbeToken=function NgProbeToken(name,token){this.name=name,this.token=token};function createPlatformFactory(parentPlatformFactory,name,providers){void 0===providers&&(providers=[]);var desc="Platform: "+name,marker=new InjectionToken(desc);return function(extraProviders){void 0===extraProviders&&(extraProviders=[]);var platform=getPlatform();Eif(!platform||platform.injector.get(ALLOW_MULTIPLE_PLATFORMS,!1))if(parentPlatformFactory)parentPlatformFactory(providers.concat(extraProviders).concat({provide:marker,useValue:!0}));else{var injectedProviders=providers.concat(extraProviders).concat({provide:marker,useValue:!0});!function createPlatform(injector){Iif(_platform&&!_platform.destroyed&&!_platform.injector.get(ALLOW_MULTIPLE_PLATFORMS,!1))throw new Error("There can be only one platform. Destroy the previous one to create a new one.");_platform=injector.get(PlatformRef);var inits=injector.get(PLATFORM_INITIALIZER,null);return inits&&inits.forEach(function(init){return init()}),_platform}(Injector.create({providers:injectedProviders,name:desc}))}return function assertPlatform(requiredToken){var platform=getPlatform();Iif(!platform)throw new Error("No platform exists!");Iif(!platform.injector.get(requiredToken,null))throw new Error("A platform with a different configuration has been created. Please destroy it first.");return platform}(marker)}}function getPlatform(){return _platform&&!_platform.destroyed?_platform:null}var PlatformRef=function(){function PlatformRef(_injector){this._injector=_injector,this._modules=[],this._destroyListeners=[],this._destroyed=!1}return PlatformRef.prototype.bootstrapModuleFactory=function(moduleFactory,options){var _this=this,ngZone=function getNgZone(ngZoneOption){var ngZone;ngZone="noop"===ngZoneOption?new NoopNgZone:("zone.js"===ngZoneOption?void 0:ngZoneOption)||new NgZone({enableLongStackTrace:isDevMode()});return ngZone}(options?options.ngZone:void 0),providers=[{provide:NgZone,useValue:ngZone}];return ngZone.run(function(){var ngZoneInjector=Injector.create({providers:providers,parent:_this.injector,name:moduleFactory.moduleType.name}),moduleRef=moduleFactory.create(ngZoneInjector),exceptionHandler=moduleRef.injector.get(ErrorHandler,null);Iif(!exceptionHandler)throw new Error("No ErrorHandler. Is platform module (BrowserModule) included?");return moduleRef.onDestroy(function(){return remove(_this._modules,moduleRef)}),ngZone.runOutsideAngular(function(){return ngZone.onError.subscribe({next:function(error){exceptionHandler.handleError(error)}})}),function _callAndReportToErrorHandler(errorHandler,ngZone,callback){try{var result=callback();return isPromise(result)?result.catch(function(e){throw ngZone.runOutsideAngular(function(){return errorHandler.handleError(e)}),e}):result}catch(e){throw ngZone.runOutsideAngular(function(){return errorHandler.handleError(e)}),e}}(exceptionHandler,ngZone,function(){var initStatus=moduleRef.injector.get(ApplicationInitStatus);return initStatus.runInitializers(),initStatus.donePromise.then(function(){return _this._moduleDoBootstrap(moduleRef),moduleRef})})})},PlatformRef.prototype.bootstrapModule=function(moduleType,compilerOptions){var _this=this;void 0===compilerOptions&&(compilerOptions=[]);var options=optionsReducer({},compilerOptions);return compileNgModuleFactory(this.injector,options,moduleType).then(function(moduleFactory){return _this.bootstrapModuleFactory(moduleFactory,options)})},PlatformRef.prototype._moduleDoBootstrap=function(moduleRef){var appRef=moduleRef.injector.get(ApplicationRef);Eif(moduleRef._bootstrapComponents.length>0)moduleRef._bootstrapComponents.forEach(function(f){return appRef.bootstrap(f)});else{if(!moduleRef.instance.ngDoBootstrap)throw new Error("The module "+stringify(moduleRef.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');moduleRef.instance.ngDoBootstrap(appRef)}this._modules.push(moduleRef)},PlatformRef.prototype.onDestroy=function(callback){this._destroyListeners.push(callback)},Object.defineProperty(PlatformRef.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),PlatformRef.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(module){return module.destroy()}),this._destroyListeners.forEach(function(listener){return listener()}),this._destroyed=!0},Object.defineProperty(PlatformRef.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),PlatformRef=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[Injector])],PlatformRef)}();function optionsReducer(dst,objs){return dst=Array.isArray(objs)?objs.reduce(optionsReducer,dst):Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},dst,objs)}var ApplicationRef=function(){function ApplicationRef(_zone,_console,_injector,_exceptionHandler,_componentFactoryResolver,_initStatus){var _this=this;this._zone=_zone,this._console=_console,this._injector=_injector,this._exceptionHandler=_exceptionHandler,this._componentFactoryResolver=_componentFactoryResolver,this._initStatus=_initStatus,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=isDevMode(),this._zone.onMicrotaskEmpty.subscribe({next:function(){_this._zone.run(function(){_this.tick()})}});var isCurrentlyStable=new rxjs__WEBPACK_IMPORTED_MODULE_3__.a(function(observer){_this._stable=_this._zone.isStable&&!_this._zone.hasPendingMacrotasks&&!_this._zone.hasPendingMicrotasks,_this._zone.runOutsideAngular(function(){observer.next(_this._stable),observer.complete()})}),isStable=new rxjs__WEBPACK_IMPORTED_MODULE_3__.a(function(observer){var stableSub;_this._zone.runOutsideAngular(function(){stableSub=_this._zone.onStable.subscribe(function(){NgZone.assertNotInAngularZone(),scheduleMicroTask(function(){_this._stable||_this._zone.hasPendingMacrotasks||_this._zone.hasPendingMicrotasks||(_this._stable=!0,observer.next(!0))})})});var unstableSub=_this._zone.onUnstable.subscribe(function(){NgZone.assertInAngularZone(),_this._stable&&(_this._stable=!1,_this._zone.runOutsideAngular(function(){observer.next(!1)}))});return function(){stableSub.unsubscribe(),unstableSub.unsubscribe()}});this.isStable=Object(rxjs__WEBPACK_IMPORTED_MODULE_4__.a)(isCurrentlyStable,isStable.pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_5__.a)()))}var ApplicationRef_1;return ApplicationRef_1=ApplicationRef,ApplicationRef.prototype.bootstrap=function(componentOrFactory,rootSelectorOrNode){var componentFactory,_this=this;Iif(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");componentFactory=componentOrFactory instanceof ComponentFactory?componentOrFactory:this._componentFactoryResolver.resolveComponentFactory(componentOrFactory),this.componentTypes.push(componentFactory.componentType);var ngModule=isBoundToModule(componentFactory)?null:this._injector.get(NgModuleRef),selectorOrNode=rootSelectorOrNode||componentFactory.selector,compRef=componentFactory.create(Injector.NULL,[],selectorOrNode,ngModule);compRef.onDestroy(function(){_this._unloadComponent(compRef)});var testability=compRef.injector.get(Testability,null);return testability&&compRef.injector.get(TestabilityRegistry).registerApplication(compRef.location.nativeElement,testability),this._loadComponent(compRef),isDevMode()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),compRef},ApplicationRef.prototype.tick=function(){var e_1,_a,e_2,_b,_this=this;Iif(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var scope=ApplicationRef_1._tickScope();try{this._runningTick=!0;try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(this._views),_d=_c.next();!_d.done;_d=_c.next()){_d.value.detectChanges()}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{Iif(e_1)throw e_1.error}}Iif(this._enforceNoNewChanges)try{for(var _e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(this._views),_f=_e.next();!_f.done;_f=_e.next()){_f.value.checkNoChanges()}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_f&&!_f.done&&(_b=_e.return)&&_b.call(_e)}finally{if(e_2)throw e_2.error}}}catch(e){this._zone.runOutsideAngular(function(){return _this._exceptionHandler.handleError(e)})}finally{this._runningTick=!1,wtfLeave(scope)}},ApplicationRef.prototype.attachView=function(viewRef){var view=viewRef;this._views.push(view),view.attachToAppRef(this)},ApplicationRef.prototype.detachView=function(viewRef){var view=viewRef;remove(this._views,view),view.detachFromAppRef()},ApplicationRef.prototype._loadComponent=function(componentRef){this.attachView(componentRef.hostView),this.tick(),this.components.push(componentRef),this._injector.get(APP_BOOTSTRAP_LISTENER,[]).concat(this._bootstrapListeners).forEach(function(listener){return listener(componentRef)})},ApplicationRef.prototype._unloadComponent=function(componentRef){this.detachView(componentRef.hostView),remove(this.components,componentRef)},ApplicationRef.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(view){return view.destroy()})},Object.defineProperty(ApplicationRef.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),ApplicationRef._tickScope=wtfCreateScope("ApplicationRef#tick()"),ApplicationRef=ApplicationRef_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[NgZone,Console,Injector,ErrorHandler,ComponentFactoryResolver,ApplicationInitStatus])],ApplicationRef)}();function remove(list,el){var index=list.indexOf(el);index>-1&&list.splice(index,1)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var SystemJsNgModuleLoaderConfig=function SystemJsNgModuleLoaderConfig(){},DEFAULT_CONFIG={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"};!function(){function SystemJsNgModuleLoader(_compiler,config){this._compiler=_compiler,this._config=config||DEFAULT_CONFIG}SystemJsNgModuleLoader.prototype.load=function(path){return this._compiler instanceof Compiler?this.loadFactory(path):this.loadAndCompile(path)},SystemJsNgModuleLoader.prototype.loadAndCompile=function(path){var _this=this,_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(path.split("#"),2),module=_a[0],exportName=_a[1];return void 0===exportName&&(exportName="default"),__webpack_require__(264)(module).then(function(module){return module[exportName]}).then(function(type){return checkNotEmpty(type,module,exportName)}).then(function(type){return _this._compiler.compileModuleAsync(type)})},SystemJsNgModuleLoader.prototype.loadFactory=function(path){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(path.split("#"),2),module=_a[0],exportName=_a[1],factoryClassSuffix="NgFactory";return void 0===exportName&&(exportName="default",factoryClassSuffix=""),__webpack_require__(264)(this._config.factoryPathPrefix+module+this._config.factoryPathSuffix).then(function(module){return module[exportName+factoryClassSuffix]}).then(function(factory){return checkNotEmpty(factory,module,exportName)})},SystemJsNgModuleLoader=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([Injectable(),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.e)(1,Optional()),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[Compiler,SystemJsNgModuleLoaderConfig])],SystemJsNgModuleLoader)}();function checkNotEmpty(value,modulePath,exportName){if(!value)throw new Error("Cannot find '"+exportName+"' in '"+modulePath+"'");return value}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(_super){function EmbeddedViewRef(){return null!==_super&&_super.apply(this,arguments)||this}Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(EmbeddedViewRef,_super)}(function(_super){function ViewRef(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ViewRef,_super),ViewRef}(ChangeDetectorRef));var DebugEventListener=function DebugEventListener(name,callback){this.name=name,this.callback=callback},DebugNode__PRE_R3__=function(){function DebugNode__PRE_R3__(nativeNode,parent,_debugContext){this.listeners=[],this.parent=null,this._debugContext=_debugContext,this.nativeNode=nativeNode,parent&&parent instanceof DebugElement__PRE_R3__&&parent.addChild(this)}return Object.defineProperty(DebugNode__PRE_R3__.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__PRE_R3__.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__PRE_R3__.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__PRE_R3__.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__PRE_R3__.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),DebugNode__PRE_R3__}(),DebugElement__PRE_R3__=function(_super){function DebugElement__PRE_R3__(nativeNode,parent,_debugContext){var _this=_super.call(this,nativeNode,parent,_debugContext)||this;return _this.properties={},_this.attributes={},_this.classes={},_this.styles={},_this.childNodes=[],_this.nativeElement=nativeNode,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(DebugElement__PRE_R3__,_super),DebugElement__PRE_R3__.prototype.addChild=function(child){child&&(this.childNodes.push(child),child.parent=this)},DebugElement__PRE_R3__.prototype.removeChild=function(child){var childIndex=this.childNodes.indexOf(child);-1!==childIndex&&(child.parent=null,this.childNodes.splice(childIndex,1))},DebugElement__PRE_R3__.prototype.insertChildrenAfter=function(child,newChildren){var _a,_this=this,siblingIndex=this.childNodes.indexOf(child);-1!==siblingIndex&&((_a=this.childNodes).splice.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([siblingIndex+1,0],newChildren)),newChildren.forEach(function(c){c.parent&&c.parent.removeChild(c),child.parent=_this}))},DebugElement__PRE_R3__.prototype.insertBefore=function(refChild,newChild){var refIndex=this.childNodes.indexOf(refChild);-1===refIndex?this.addChild(newChild):(newChild.parent&&newChild.parent.removeChild(newChild),newChild.parent=this,this.childNodes.splice(refIndex,0,newChild))},DebugElement__PRE_R3__.prototype.query=function(predicate){return this.queryAll(predicate)[0]||null},DebugElement__PRE_R3__.prototype.queryAll=function(predicate){var matches=[];return _queryElementChildren(this,predicate,matches),matches},DebugElement__PRE_R3__.prototype.queryAllNodes=function(predicate){var matches=[];return _queryNodeChildren(this,predicate,matches),matches},Object.defineProperty(DebugElement__PRE_R3__.prototype,"children",{get:function(){return this.childNodes.filter(function(node){return node instanceof DebugElement__PRE_R3__})},enumerable:!0,configurable:!0}),DebugElement__PRE_R3__.prototype.triggerEventHandler=function(eventName,eventObj){this.listeners.forEach(function(listener){listener.name==eventName&&listener.callback(eventObj)})},DebugElement__PRE_R3__}(DebugNode__PRE_R3__);function _queryElementChildren(element,predicate,matches){element.childNodes.forEach(function(node){node instanceof DebugElement__PRE_R3__&&(predicate(node)&&matches.push(node),_queryElementChildren(node,predicate,matches))})}function _queryNodeChildren(parentNode,predicate,matches){parentNode instanceof DebugElement__PRE_R3__&&parentNode.childNodes.forEach(function(node){predicate(node)&&matches.push(node),node instanceof DebugElement__PRE_R3__&&_queryNodeChildren(node,predicate,matches)})}var DebugNode__POST_R3__=function(){function DebugNode__POST_R3__(nativeNode){this.nativeNode=nativeNode}return Object.defineProperty(DebugNode__POST_R3__.prototype,"parent",{get:function(){var parent=this.nativeNode.parentNode;return parent?new DebugElement__POST_R3__(parent):null},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"injector",{get:function(){return getInjector(this.nativeNode)},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"componentInstance",{get:function(){var nativeElement=this.nativeNode;return nativeElement&&(getComponent(nativeElement)||getViewComponent(nativeElement))},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"context",{get:function(){return getContext(this.nativeNode)},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"listeners",{get:function(){return getListeners(this.nativeNode).filter(isBrowserEvents)},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"references",{get:function(){return getLocalRefs(this.nativeNode)},enumerable:!0,configurable:!0}),Object.defineProperty(DebugNode__POST_R3__.prototype,"providerTokens",{get:function(){return function getInjectionTokens(element){var context=loadLContext(element,!1);if(!context)return[];for(var obj,tView=context.lView[TVIEW],tNode=tView.data[context.nodeIndex],providerTokens=[],startIndex=65535&tNode.providerIndexes,endIndex=tNode.directiveEnd,i=startIndex;i<endIndex;i++){var value=tView.data[i];void 0!==(obj=value).type&&void 0!==obj.template&&void 0!==obj.declaredInputs&&(value=value.type),providerTokens.push(value)}return providerTokens}(this.nativeNode)},enumerable:!0,configurable:!0}),DebugNode__POST_R3__}(),DebugElement__POST_R3__=function(_super){function DebugElement__POST_R3__(nativeNode){return ngDevMode&&assertDomNode(nativeNode),_super.call(this,nativeNode)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(DebugElement__POST_R3__,_super),Object.defineProperty(DebugElement__POST_R3__.prototype,"nativeElement",{get:function(){return this.nativeNode.nodeType==Node.ELEMENT_NODE?this.nativeNode:null},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"name",{get:function(){return this.nativeElement.nodeName},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"properties",{get:function(){var context=loadLContext(this.nativeNode),lView=context.lView,tData=lView[TVIEW].data,tNode=tData[context.nodeIndex],properties=function collectPropertyBindings(tNode,lView,tData){var properties={},bindingIndex=function getFirstBindingIndex(metadataIndex,tData){var currentBindingIndex=metadataIndex-1,currentValue=tData[currentBindingIndex];for(;"string"==typeof currentValue&&!isPropMetadataString(currentValue);)currentValue=tData[--currentBindingIndex];return currentBindingIndex+1}(tNode.propertyMetadataStartIndex,tData);for(;bindingIndex<tNode.propertyMetadataEndIndex;){for(var value=void 0,propMetadata=tData[bindingIndex];!isPropMetadataString(propMetadata);)value=(value||"")+renderStringify(lView[bindingIndex])+tData[bindingIndex],propMetadata=tData[++bindingIndex];value=void 0===value?lView[bindingIndex]:value+=lView[bindingIndex];var metadataParts=propMetadata.split(INTERPOLATION_DELIMITER),propertyName=metadataParts[0];propertyName&&(properties[propertyName]=metadataParts[1]&&metadataParts[2]?metadataParts[1]+value+metadataParts[2]:value),bindingIndex++}return properties}(tNode,lView,tData),hostProperties=function collectHostPropertyBindings(tNode,lView,tData){var properties={},hostPropIndex=tNode.directiveEnd,propMetadata=tData[hostPropIndex];for(;"string"==typeof propMetadata;){var propertyName=propMetadata.split(INTERPOLATION_DELIMITER)[0];properties[propertyName]=lView[hostPropIndex],propMetadata=tData[++hostPropIndex]}return properties}(tNode,lView,tData),className=function collectClassNames(debugElement){var e_2,_a,classes=debugElement.classes,output="";try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(Object.keys(classes)),_c=_b.next();!_c.done;_c=_b.next()){var className=_c.value;classes[className]&&(output=output?output+" "+className:className)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}return output}(this),output=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},properties,hostProperties);return className&&(output.className=output.className?output.className+" "+className:className),output},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"attributes",{get:function(){var attributes={},element=this.nativeElement;if(element)for(var eAttrs=element.attributes,i=0;i<eAttrs.length;i++){var attr=eAttrs[i];attributes[attr.name]=attr.value}return attributes},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"classes",{get:function(){var classes={},element=this.nativeElement;if(element){var lContext=loadLContextFromNode(element),stylingContext=getStylingContextFromLView(lContext.nodeIndex,lContext.lView);if(stylingContext){for(var i=10;i<stylingContext.length;i+=4)if(isClassBasedValue(stylingContext,i)){var className=getProp(stylingContext,i),value=getValue(stylingContext,i);"boolean"==typeof value&&(classes[className]=value)}}else{var eClasses=element.classList;for(i=0;i<eClasses.length;i++)classes[eClasses[i]]=!0}}return classes},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"styles",{get:function(){var styles={},element=this.nativeElement;if(element){var lContext=loadLContextFromNode(element),stylingContext=getStylingContextFromLView(lContext.nodeIndex,lContext.lView);if(stylingContext){for(var i=10;i<stylingContext.length;i+=4)if(!isClassBasedValue(stylingContext,i)){var styleName=getProp(stylingContext,i),value=getValue(stylingContext,i);null!==value&&(styles[styleName]=value)}}else{var eStyles=element.style;for(i=0;i<eStyles.length;i++){var name_1=eStyles.item(i);styles[name_1]=eStyles.getPropertyValue(name_1)}}}return styles},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"childNodes",{get:function(){for(var childNodes=this.nativeNode.childNodes,children=[],i=0;i<childNodes.length;i++){var element=childNodes[i];children.push(getDebugNode__POST_R3__(element))}return children},enumerable:!0,configurable:!0}),Object.defineProperty(DebugElement__POST_R3__.prototype,"children",{get:function(){var nativeElement=this.nativeElement;if(!nativeElement)return[];for(var childNodes=nativeElement.children,children=[],i=0;i<childNodes.length;i++){var element=childNodes[i];children.push(getDebugNode__POST_R3__(element))}return children},enumerable:!0,configurable:!0}),DebugElement__POST_R3__.prototype.query=function(predicate){return this.queryAll(predicate)[0]||null},DebugElement__POST_R3__.prototype.queryAll=function(predicate){var matches=[];return _queryAllR3(this,predicate,matches,!0),matches},DebugElement__POST_R3__.prototype.queryAllNodes=function(predicate){var matches=[];return _queryAllR3(this,predicate,matches,!1),matches},DebugElement__POST_R3__.prototype.triggerEventHandler=function(eventName,eventObj){this.listeners.forEach(function(listener){listener.name===eventName&&listener.callback(eventObj)})},DebugElement__POST_R3__}(DebugNode__POST_R3__);function _queryAllR3(parentElement,predicate,matches,elementsOnly){var context=loadLContext(parentElement.nativeNode);_queryNodeChildrenR3(context.lView[TVIEW].data[context.nodeIndex],context.lView,predicate,matches,elementsOnly,parentElement.nativeNode)}function _queryNodeChildrenR3(tNode,lView,predicate,matches,elementsOnly,rootNativeNode){var e_1,_a;if(3===tNode.type||4===tNode.type){if(_addQueryMatchR3(getNativeByTNode(tNode,lView),predicate,matches,elementsOnly,rootNativeNode),isComponent(tNode))(componentView=getComponentViewByIndex(tNode.index,lView))&&componentView[TVIEW].firstChild&&_queryNodeChildrenR3(componentView[TVIEW].firstChild,componentView,predicate,matches,elementsOnly,rootNativeNode);else tNode.child&&_queryNodeChildrenR3(tNode.child,lView,predicate,matches,elementsOnly,rootNativeNode);var nodeOrContainer=lView[tNode.index];isLContainer(nodeOrContainer)&&_queryNodeChildrenInContainerR3(nodeOrContainer,predicate,matches,elementsOnly,rootNativeNode)}else if(0===tNode.type){var lContainer=lView[tNode.index];_addQueryMatchR3(lContainer[NATIVE],predicate,matches,elementsOnly,rootNativeNode),_queryNodeChildrenInContainerR3(lContainer,predicate,matches,elementsOnly,rootNativeNode)}else if(1===tNode.type){var componentView,head=(componentView=findComponentView(lView))[T_HOST].projection[tNode.projection];if(Array.isArray(head))try{for(var head_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(head),head_1_1=head_1.next();!head_1_1.done;head_1_1=head_1.next()){_addQueryMatchR3(head_1_1.value,predicate,matches,elementsOnly,rootNativeNode)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{head_1_1&&!head_1_1.done&&(_a=head_1.return)&&_a.call(head_1)}finally{if(e_1)throw e_1.error}}else if(head){var nextLView=componentView[PARENT];_queryNodeChildrenR3(nextLView[TVIEW].data[head.index],nextLView,predicate,matches,elementsOnly,rootNativeNode)}}else tNode.child&&_queryNodeChildrenR3(tNode.child,lView,predicate,matches,elementsOnly,rootNativeNode);var nextTNode=2&tNode.flags?tNode.projectionNext:tNode.next;nextTNode&&_queryNodeChildrenR3(nextTNode,lView,predicate,matches,elementsOnly,rootNativeNode)}function _queryNodeChildrenInContainerR3(lContainer,predicate,matches,elementsOnly,rootNativeNode){for(var i=0;i<lContainer[VIEWS].length;i++){var childView=lContainer[VIEWS][i];_queryNodeChildrenR3(childView[TVIEW].node,childView,predicate,matches,elementsOnly,rootNativeNode)}}function _addQueryMatchR3(nativeNode,predicate,matches,elementsOnly,rootNativeNode){if(rootNativeNode!==nativeNode){var debugNode=getDebugNode(nativeNode);debugNode&&(!elementsOnly||debugNode instanceof DebugElement__POST_R3__)&&predicate(debugNode)&&matches.push(debugNode)}}var _nativeNodeToDebugNode=new Map;function getDebugNode__POST_R3__(nativeNode){return nativeNode instanceof Node?nativeNode.nodeType==Node.ELEMENT_NODE?new DebugElement__POST_R3__(nativeNode):new DebugNode__POST_R3__(nativeNode):null}var getDebugNode=function getDebugNode__PRE_R3__(nativeNode){return _nativeNodeToDebugNode.get(nativeNode)||null};function indexDebugNode(node){_nativeNodeToDebugNode.set(node.nativeNode,node)}var MissingTranslationStrategy,platformCore=createPlatformFactory(null,"core",[{provide:PLATFORM_ID,useValue:"unknown"},{provide:PlatformRef,deps:[Injector]},{provide:TestabilityRegistry,deps:[]},{provide:Console,deps:[]}]),LOCALE_ID=new InjectionToken("LocaleId"),TRANSLATIONS$1=new InjectionToken("Translations"),TRANSLATIONS_FORMAT=new InjectionToken("TranslationsFormat");!function(MissingTranslationStrategy){MissingTranslationStrategy[MissingTranslationStrategy.Error=0]="Error",MissingTranslationStrategy[MissingTranslationStrategy.Warning=1]="Warning",MissingTranslationStrategy[MissingTranslationStrategy.Ignore=2]="Ignore"}(MissingTranslationStrategy||(MissingTranslationStrategy={}));var APPLICATION_MODULE_PROVIDERS=[{provide:ApplicationRef,useClass:ApplicationRef,deps:[NgZone,Console,Injector,ErrorHandler,ComponentFactoryResolver,ApplicationInitStatus]},{provide:SCHEDULER,deps:[NgZone],useFactory:function zoneSchedulerFactory(ngZone){var queue=[];return ngZone.onStable.subscribe(function(){for(;queue.length;)queue.pop()()}),function(fn){queue.push(fn)}}},{provide:ApplicationInitStatus,useClass:ApplicationInitStatus,deps:[[new Optional,APP_INITIALIZER]]},{provide:Compiler,useClass:Compiler,deps:[]},APP_ID_RANDOM_PROVIDER,{provide:IterableDiffers,useFactory:
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function _iterableDiffersFactory(){return defaultIterableDiffers},deps:[]},{provide:KeyValueDiffers,useFactory:function _keyValueDiffersFactory(){return defaultKeyValueDiffers},deps:[]},{provide:LOCALE_ID,useFactory:function _localeFactory(locale){return locale||"en-US"},deps:[[new Inject(LOCALE_ID),new Optional,new SkipSelf]]}];var ViewAction,ApplicationModule=function(){function ApplicationModule(appRef){}return ApplicationModule=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.b)([NgModule({providers:APPLICATION_MODULE_PROVIDERS}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.d)("design:paramtypes",[ApplicationRef])],ApplicationModule)}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function anchorDef(flags,matchedQueriesDsl,ngContentIndex,childCount,handleEvent,templateFactory){flags|=1;var _a=splitMatchedQueriesDsl(matchedQueriesDsl),matchedQueries=_a.matchedQueries,references=_a.references;return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,flags:flags,checkIndex:-1,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:matchedQueries,matchedQueryIds:_a.matchedQueryIds,references:references,ngContentIndex:ngContentIndex,childCount:childCount,bindings:[],bindingFlags:0,outputs:[],element:{ns:null,name:null,attrs:null,template:templateFactory?resolveDefinition(templateFactory):null,componentProvider:null,componentView:null,componentRendererType:null,publicProviders:null,allProviders:null,handleEvent:handleEvent||NOOP},provider:null,text:null,query:null,ngContent:null}}function elementDef(checkIndex,flags,matchedQueriesDsl,ngContentIndex,childCount,namespaceAndName,fixedAttrs,bindings,outputs,handleEvent,componentView,componentRendererType){var _a;void 0===fixedAttrs&&(fixedAttrs=[]),handleEvent||(handleEvent=NOOP);var _b=splitMatchedQueriesDsl(matchedQueriesDsl),matchedQueries=_b.matchedQueries,references=_b.references,matchedQueryIds=_b.matchedQueryIds,ns=null,name=null;namespaceAndName&&(ns=(_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNamespace(namespaceAndName),2))[0],name=_a[1]),bindings=bindings||[];for(var bindingDefs=new Array(bindings.length),i=0;i<bindings.length;i++){var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(bindings[i],3),bindingFlags=_c[0],namespaceAndName_1=_c[1],suffixOrSecurityContext=_c[2],_d=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNamespace(namespaceAndName_1),2),ns_1=_d[0],name_1=_d[1],securityContext=void 0,suffix=void 0;switch(15&bindingFlags){case 4:suffix=suffixOrSecurityContext;break;case 1:case 8:securityContext=suffixOrSecurityContext}bindingDefs[i]={flags:bindingFlags,ns:ns_1,name:name_1,nonMinifiedName:name_1,securityContext:securityContext,suffix:suffix}}outputs=outputs||[];var outputDefs=new Array(outputs.length);for(i=0;i<outputs.length;i++){var _e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(outputs[i],2),target=_e[0],eventName=_e[1];outputDefs[i]={type:0,target:target,eventName:eventName,propName:null}}var attrs=(fixedAttrs=fixedAttrs||[]).map(function(_a){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),namespaceAndName=_b[0],value=_b[1],_c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNamespace(namespaceAndName),2);return[_c[0],_c[1],value]});return componentRendererType=function resolveRendererType2(type){if(type&&type.id===UNDEFINED_RENDERER_TYPE_ID){var isFilled=null!=type.encapsulation&&type.encapsulation!==ViewEncapsulation.None||type.styles.length||Object.keys(type.data).length;type.id=isFilled?"c"+_renderCompCount$1++:EMPTY_RENDERER_TYPE_ID}return type&&type.id===EMPTY_RENDERER_TYPE_ID&&(type=null),type||null}(componentRendererType),componentView&&(flags|=33554432),{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:checkIndex,flags:flags|=1,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:matchedQueries,matchedQueryIds:matchedQueryIds,references:references,ngContentIndex:ngContentIndex,childCount:childCount,bindings:bindingDefs,bindingFlags:calcBindingFlags(bindingDefs),outputs:outputDefs,element:{ns:ns,name:name,attrs:attrs,template:null,componentProvider:null,componentView:componentView||null,componentRendererType:componentRendererType,publicProviders:null,allProviders:null,handleEvent:handleEvent||NOOP},provider:null,text:null,query:null,ngContent:null}}function createElement(view,renderHost,def){var el,elDef=def.element,rootSelectorOrNode=view.root.selectorOrNode,renderer=view.renderer;if(view.parent||!rootSelectorOrNode){el=elDef.name?renderer.createElement(elDef.name,elDef.ns):renderer.createComment("");var parentEl=getParentRenderElement(view,renderHost,def);parentEl&&renderer.appendChild(parentEl,el)}else{var preserveContent=!!elDef.componentRendererType&&elDef.componentRendererType.encapsulation===ViewEncapsulation.ShadowDom;el=renderer.selectRootElement(rootSelectorOrNode,preserveContent)}if(elDef.attrs)for(var i=0;i<elDef.attrs.length;i++){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(elDef.attrs[i],3),ns=_a[0],name_2=_a[1],value=_a[2];renderer.setAttribute(el,name_2,value,ns)}return el}function listenToElementOutputs(view,compView,def,el){for(var i=0;i<def.outputs.length;i++){var output=def.outputs[i],handleEventClosure=renderEventHandlerClosure(view,def.nodeIndex,(target=output.target,name=output.eventName,target?target+":"+name:name)),listenTarget=output.target,listenerView=view;"component"===output.target&&(listenTarget=null,listenerView=compView);var disposable=listenerView.renderer.listen(listenTarget||el,output.eventName,handleEventClosure);view.disposables[def.outputIndex+i]=disposable}var target,name}function renderEventHandlerClosure(view,index,eventName){return function(event){return dispatchEvent(view,index,eventName,event)}}function checkAndUpdateElementValue(view,def,bindingIdx,value){if(!checkAndUpdateBinding(view,def,bindingIdx,value))return!1;var binding=def.bindings[bindingIdx],elData=asElementData(view,def.nodeIndex),renderNode=elData.renderElement,name=binding.name;switch(15&binding.flags){case 1:!function setElementAttribute(view,binding,renderNode,ns,name,value){var securityContext=binding.securityContext,renderValue=securityContext?view.root.sanitizer.sanitize(securityContext,value):value;renderValue=null!=renderValue?renderValue.toString():null;var renderer=view.renderer;null!=value?renderer.setAttribute(renderNode,name,renderValue,ns):renderer.removeAttribute(renderNode,name,ns)}(view,binding,renderNode,binding.ns,name,value);break;case 2:!function setElementClass(view,renderNode,name,value){var renderer=view.renderer;value?renderer.addClass(renderNode,name):renderer.removeClass(renderNode,name)}(view,renderNode,name,value);break;case 4:!function setElementStyle(view,binding,renderNode,name,value){var renderValue=view.root.sanitizer.sanitize(SecurityContext.STYLE,value);if(null!=renderValue){renderValue=renderValue.toString();var unit=binding.suffix;null!=unit&&(renderValue+=unit)}else renderValue=null;var renderer=view.renderer;null!=renderValue?renderer.setStyle(renderNode,name,renderValue):renderer.removeStyle(renderNode,name)}(view,binding,renderNode,name,value);break;case 8:!function setElementProperty(view,binding,renderNode,name,value){var securityContext=binding.securityContext,renderValue=securityContext?view.root.sanitizer.sanitize(securityContext,value):value;view.renderer.setProperty(renderNode,name,renderValue)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(33554432&def.flags&&32&binding.flags?elData.componentView:view,binding,renderNode,name,value)}return!0}function queryDef(flags,id,bindings){var bindingDefs=[];for(var propName in bindings){var bindingType=bindings[propName];bindingDefs.push({propName:propName,bindingType:bindingType})}return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:-1,flags:flags,childFlags:0,directChildFlags:0,childMatchedQueries:0,ngContentIndex:-1,matchedQueries:{},matchedQueryIds:0,references:{},childCount:0,bindings:[],bindingFlags:0,outputs:[],element:null,provider:null,text:null,query:{id:id,filterId:filterQueryId(id),bindings:bindingDefs},ngContent:null}}function dirtyParentQueries(view){for(var queryIds=view.def.nodeMatchedQueries;view.parent&&isEmbeddedView(view);){var tplDef=view.parentNodeDef;view=view.parent;for(var end=tplDef.nodeIndex+tplDef.childCount,i=0;i<=end;i++){67108864&(nodeDef=view.def.nodes[i]).flags&&536870912&nodeDef.flags&&(nodeDef.query.filterId&queryIds)===nodeDef.query.filterId&&asQueryList(view,i).setDirty(),!(1&nodeDef.flags&&i+nodeDef.childCount<tplDef.nodeIndex)&&67108864&nodeDef.childFlags&&536870912&nodeDef.childFlags||(i+=nodeDef.childCount)}}Iif(134217728&view.def.nodeFlags)for(i=0;i<view.def.nodes.length;i++){var nodeDef;134217728&(nodeDef=view.def.nodes[i]).flags&&536870912&nodeDef.flags&&asQueryList(view,i).setDirty(),i+=nodeDef.childCount}}function checkAndUpdateQuery(view,nodeDef){var queryList=asQueryList(view,nodeDef.nodeIndex);Eif(queryList.dirty){var directiveInstance,newValues=void 0;Iif(67108864&nodeDef.flags){var elementDef=nodeDef.parent.parent;newValues=calcQueryValues(view,elementDef.nodeIndex,elementDef.nodeIndex+elementDef.childCount,nodeDef.query,[]),directiveInstance=asProviderData(view,nodeDef.parent.nodeIndex).instance}else 134217728&nodeDef.flags&&(newValues=calcQueryValues(view,0,view.def.nodes.length-1,nodeDef.query,[]),directiveInstance=view.component);queryList.reset(newValues);for(var bindings=nodeDef.query.bindings,notify=!1,i=0;i<bindings.length;i++){var binding=bindings[i],boundValue=void 0;switch(binding.bindingType){case 0:boundValue=queryList.first;break;case 1:boundValue=queryList,notify=!0}directiveInstance[binding.propName]=boundValue}notify&&queryList.notifyOnChanges()}}function calcQueryValues(view,startIndex,endIndex,queryDef,values){for(var i=startIndex;i<=endIndex;i++){var nodeDef=view.def.nodes[i],valueType=nodeDef.matchedQueries[queryDef.id];Iif(null!=valueType&&values.push(getQueryValue(view,nodeDef,valueType)),1&nodeDef.flags&&nodeDef.element.template&&(nodeDef.element.template.nodeMatchedQueries&queryDef.filterId)===queryDef.filterId){var elementData=asElementData(view,i);if((nodeDef.childMatchedQueries&queryDef.filterId)===queryDef.filterId&&(calcQueryValues(view,i+1,i+nodeDef.childCount,queryDef,values),i+=nodeDef.childCount),16777216&nodeDef.flags)for(var embeddedViews=elementData.viewContainer._embeddedViews,k=0;k<embeddedViews.length;k++){var embeddedView=embeddedViews[k],dvc=declaredViewContainer(embeddedView);dvc&&dvc===elementData&&calcQueryValues(embeddedView,0,embeddedView.def.nodes.length-1,queryDef,values)}var projectedViews=elementData.template._projectedViews;if(projectedViews)for(k=0;k<projectedViews.length;k++){var projectedView=projectedViews[k];calcQueryValues(projectedView,0,projectedView.def.nodes.length-1,queryDef,values)}}(nodeDef.childMatchedQueries&queryDef.filterId)!==queryDef.filterId&&(i+=nodeDef.childCount)}return values}function getQueryValue(view,nodeDef,queryValueType){Eif(null!=queryValueType)switch(queryValueType){case 1:return asElementData(view,nodeDef.nodeIndex).renderElement;case 0:return new ElementRef(asElementData(view,nodeDef.nodeIndex).renderElement);case 2:return asElementData(view,nodeDef.nodeIndex).template;case 3:return asElementData(view,nodeDef.nodeIndex).viewContainer;case 4:return asProviderData(view,nodeDef.nodeIndex).instance}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function ngContentDef(ngContentIndex,index){return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:-1,flags:8,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:ngContentIndex,childCount:0,bindings:[],bindingFlags:0,outputs:[],element:null,provider:null,text:null,query:null,ngContent:{index:index}}}function appendNgContent(view,renderHost,def){var parentEl=getParentRenderElement(view,renderHost,def);parentEl&&visitProjectedRenderNodes(view,def.ngContent.index,1,parentEl,null,void 0)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function purePipeDef(checkIndex,argCount){return _pureExpressionDef(128,checkIndex,new Array(argCount+1))}function pureArrayDef(checkIndex,argCount){return _pureExpressionDef(32,checkIndex,new Array(argCount))}function pureObjectDef(checkIndex,propToIndex){for(var keys=Object.keys(propToIndex),nbKeys=keys.length,propertyNames=new Array(nbKeys),i=0;i<nbKeys;i++){var key=keys[i];propertyNames[propToIndex[key]]=key}return _pureExpressionDef(64,checkIndex,propertyNames)}function _pureExpressionDef(flags,checkIndex,propertyNames){for(var bindings=new Array(propertyNames.length),i=0;i<propertyNames.length;i++){var prop=propertyNames[i];bindings[i]={flags:8,name:prop,ns:null,nonMinifiedName:prop,securityContext:null,suffix:null}}return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:checkIndex,flags:flags,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:-1,childCount:0,bindings:bindings,bindingFlags:calcBindingFlags(bindings),outputs:[],element:null,provider:null,text:null,query:null,ngContent:null}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function textDef(checkIndex,ngContentIndex,staticText){for(var bindings=new Array(staticText.length-1),i=1;i<staticText.length;i++)bindings[i-1]={flags:8,name:null,ns:null,nonMinifiedName:null,securityContext:null,suffix:staticText[i]};return{nodeIndex:-1,parent:null,renderParent:null,bindingIndex:-1,outputIndex:-1,checkIndex:checkIndex,flags:2,childFlags:0,directChildFlags:0,childMatchedQueries:0,matchedQueries:{},matchedQueryIds:0,references:{},ngContentIndex:ngContentIndex,childCount:0,bindings:bindings,bindingFlags:8,outputs:[],element:null,provider:null,text:{prefix:staticText[0]},query:null,ngContent:null}}function createText(view,renderHost,def){var renderNode,renderer=view.renderer;renderNode=renderer.createText(def.text.prefix);var parentEl=getParentRenderElement(view,renderHost,def);return parentEl&&renderer.appendChild(parentEl,renderNode),{renderText:renderNode}}function _addInterpolationPart(value,binding){return(null!=value?value.toString():"")+binding.suffix}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function viewDef(flags,nodes,updateDirectives,updateRenderer){for(var viewBindingCount=0,viewDisposableCount=0,viewNodeFlags=0,viewRootNodeFlags=0,viewMatchedQueries=0,currentParent=null,currentRenderParent=null,currentElementHasPublicProviders=!1,currentElementHasPrivateProviders=!1,lastRenderRootNode=null,i=0;i<nodes.length;i++){var node=nodes[i];if(node.nodeIndex=i,node.parent=currentParent,node.bindingIndex=viewBindingCount,node.outputIndex=viewDisposableCount,node.renderParent=currentRenderParent,viewNodeFlags|=node.flags,viewMatchedQueries|=node.matchedQueryIds,node.element){var elDef=node.element;elDef.publicProviders=currentParent?currentParent.element.publicProviders:Object.create(null),elDef.allProviders=elDef.publicProviders,currentElementHasPublicProviders=!1,currentElementHasPrivateProviders=!1,node.element.template&&(viewMatchedQueries|=node.element.template.nodeMatchedQueries)}if(validateNode(currentParent,node,nodes.length),viewBindingCount+=node.bindings.length,viewDisposableCount+=node.outputs.length,!currentRenderParent&&3&node.flags&&(lastRenderRootNode=node),20224&node.flags){currentElementHasPublicProviders||(currentElementHasPublicProviders=!0,currentParent.element.publicProviders=Object.create(currentParent.element.publicProviders),currentParent.element.allProviders=currentParent.element.publicProviders);var isPrivateService=0!=(8192&node.flags),isComponent=0!=(32768&node.flags);!isPrivateService||isComponent?currentParent.element.publicProviders[tokenKey(node.provider.token)]=node:(currentElementHasPrivateProviders||(currentElementHasPrivateProviders=!0,currentParent.element.allProviders=Object.create(currentParent.element.publicProviders)),currentParent.element.allProviders[tokenKey(node.provider.token)]=node),isComponent&&(currentParent.element.componentProvider=node)}if(currentParent?(currentParent.childFlags|=node.flags,currentParent.directChildFlags|=node.flags,currentParent.childMatchedQueries|=node.matchedQueryIds,node.element&&node.element.template&&(currentParent.childMatchedQueries|=node.element.template.nodeMatchedQueries)):viewRootNodeFlags|=node.flags,node.childCount>0)currentParent=node,isNgContainer(node)||(currentRenderParent=node);else for(;currentParent&&i===currentParent.nodeIndex+currentParent.childCount;){var newParent=currentParent.parent;newParent&&(newParent.childFlags|=currentParent.childFlags,newParent.childMatchedQueries|=currentParent.childMatchedQueries),currentRenderParent=(currentParent=newParent)&&isNgContainer(currentParent)?currentParent.renderParent:currentParent}}return{factory:null,nodeFlags:viewNodeFlags,rootNodeFlags:viewRootNodeFlags,nodeMatchedQueries:viewMatchedQueries,flags:flags,nodes:nodes,updateDirectives:updateDirectives||NOOP,updateRenderer:updateRenderer||NOOP,handleEvent:function(view,nodeIndex,eventName,event){return nodes[nodeIndex].element.handleEvent(view,eventName,event)},bindingCount:viewBindingCount,outputCount:viewDisposableCount,lastRenderRootNode:lastRenderRootNode}}function isNgContainer(node){return 0!=(1&node.flags)&&null===node.element.name}function validateNode(parent,node,nodeCount){var template=node.element&&node.element.template;if(template){Iif(!template.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");Iif(template.lastRenderRootNode&&16777216&template.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+node.nodeIndex+"!")}Iif(20224&node.flags&&0==(1&(parent?parent.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+node.nodeIndex+"!");if(node.query){Iif(67108864&node.flags&&(!parent||0==(16384&parent.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+node.nodeIndex+"!");Iif(134217728&node.flags&&parent)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+node.nodeIndex+"!")}if(node.childCount){var parentEnd=parent?parent.nodeIndex+parent.childCount:nodeCount-1;Iif(node.nodeIndex<=parentEnd&&node.nodeIndex+node.childCount>parentEnd)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+node.nodeIndex+"!")}}function createEmbeddedView(parent,anchorDef,viewDef,context){var view=createView(parent.root,parent.renderer,parent,anchorDef,viewDef);return initView(view,parent.component,context),createViewNodes(view),view}function createRootView(root,def,context){var view=createView(root,root.renderer,null,null,def);return initView(view,context,context),createViewNodes(view),view}function createComponentView(parentView,nodeDef,viewDef,hostElement){var compRenderer,rendererType=nodeDef.element.componentRendererType;return compRenderer=rendererType?parentView.root.rendererFactory.createRenderer(hostElement,rendererType):parentView.root.renderer,createView(parentView.root,compRenderer,parentView,nodeDef.element.componentProvider,viewDef)}function createView(root,renderer,parent,parentNodeDef,def){var nodes=new Array(def.nodes.length),disposables=def.outputCount?new Array(def.outputCount):null;return{def:def,parent:parent,viewContainerParent:null,parentNodeDef:parentNodeDef,context:null,component:null,nodes:nodes,state:13,root:root,renderer:renderer,oldValues:new Array(def.bindingCount),disposables:disposables,initIndex:-1}}function initView(view,component,context){view.component=component,view.context=context}function createViewNodes(view){var renderHost;if(isComponentView(view)){var hostDef=view.parentNodeDef;renderHost=asElementData(view.parent,hostDef.parent.nodeIndex).renderElement}for(var def=view.def,nodes=view.nodes,i=0;i<def.nodes.length;i++){var nodeDef=def.nodes[i];Services.setCurrentNode(view,i);var nodeData=void 0;switch(201347067&nodeDef.flags){case 1:var el=createElement(view,renderHost,nodeDef),componentView=void 0;if(33554432&nodeDef.flags){var compViewDef=resolveDefinition(nodeDef.element.componentView);componentView=Services.createComponentView(view,nodeDef,compViewDef,el)}listenToElementOutputs(view,componentView,nodeDef,el),nodeData={renderElement:el,componentView:componentView,viewContainer:null,template:nodeDef.element.template?createTemplateData(view,nodeDef):void 0},16777216&nodeDef.flags&&(nodeData.viewContainer=createViewContainerData(view,nodeDef,nodeData));break;case 2:nodeData=createText(view,renderHost,nodeDef);break;case 512:case 1024:case 2048:case 256:if(!((nodeData=nodes[i])||4096&nodeDef.flags))nodeData={instance:createProviderInstance(view,nodeDef)};break;case 16:nodeData={instance:createPipeInstance(view,nodeDef)};break;case 16384:Eif(!(nodeData=nodes[i]))nodeData={instance:createDirectiveInstance(view,nodeDef)};Eif(32768&nodeDef.flags)initView(asElementData(view,nodeDef.parent.nodeIndex).componentView,nodeData.instance,nodeData.instance);break;case 32:case 64:case 128:nodeData={value:void 0};break;case 67108864:case 134217728:nodeData=new QueryList;break;case 8:appendNgContent(view,renderHost,nodeDef),nodeData=void 0}nodes[i]=nodeData}execComponentViewsAction(view,ViewAction.CreateViewNodes),execQueriesAction(view,201326592,268435456,0)}function checkNoChangesView(view){markProjectedViewsForCheck(view),Services.updateDirectives(view,1),execEmbeddedViewsAction(view,ViewAction.CheckNoChanges),Services.updateRenderer(view,1),execComponentViewsAction(view,ViewAction.CheckNoChanges),view.state&=-97}function checkAndUpdateView(view){1&view.state?(view.state&=-2,view.state|=2):view.state&=-3,shiftInitState(view,0,256),markProjectedViewsForCheck(view),Services.updateDirectives(view,0),execEmbeddedViewsAction(view,ViewAction.CheckAndUpdate),execQueriesAction(view,67108864,536870912,0);var callInit=shiftInitState(view,256,512);callLifecycleHooksChildrenFirst(view,2097152|(callInit?1048576:0)),Services.updateRenderer(view,0),execComponentViewsAction(view,ViewAction.CheckAndUpdate),execQueriesAction(view,134217728,536870912,0),callLifecycleHooksChildrenFirst(view,8388608|((callInit=shiftInitState(view,512,768))?4194304:0)),2&view.def.flags&&(view.state&=-9),view.state&=-97,shiftInitState(view,768,1024)}function checkAndUpdateNode(view,nodeDef,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){return 0===argStyle?function checkAndUpdateNodeInline(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){switch(201347067&nodeDef.flags){case 1:return function checkAndUpdateElementInline(view,def,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var bindLen=def.bindings.length,changed=!1;return bindLen>0&&checkAndUpdateElementValue(view,def,0,v0)&&(changed=!0),bindLen>1&&checkAndUpdateElementValue(view,def,1,v1)&&(changed=!0),bindLen>2&&checkAndUpdateElementValue(view,def,2,v2)&&(changed=!0),bindLen>3&&checkAndUpdateElementValue(view,def,3,v3)&&(changed=!0),bindLen>4&&checkAndUpdateElementValue(view,def,4,v4)&&(changed=!0),bindLen>5&&checkAndUpdateElementValue(view,def,5,v5)&&(changed=!0),bindLen>6&&checkAndUpdateElementValue(view,def,6,v6)&&(changed=!0),bindLen>7&&checkAndUpdateElementValue(view,def,7,v7)&&(changed=!0),bindLen>8&&checkAndUpdateElementValue(view,def,8,v8)&&(changed=!0),bindLen>9&&checkAndUpdateElementValue(view,def,9,v9)&&(changed=!0),changed}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9);case 2:return function checkAndUpdateTextInline(view,def,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var changed=!1,bindings=def.bindings,bindLen=bindings.length;if(bindLen>0&&checkAndUpdateBinding(view,def,0,v0)&&(changed=!0),bindLen>1&&checkAndUpdateBinding(view,def,1,v1)&&(changed=!0),bindLen>2&&checkAndUpdateBinding(view,def,2,v2)&&(changed=!0),bindLen>3&&checkAndUpdateBinding(view,def,3,v3)&&(changed=!0),bindLen>4&&checkAndUpdateBinding(view,def,4,v4)&&(changed=!0),bindLen>5&&checkAndUpdateBinding(view,def,5,v5)&&(changed=!0),bindLen>6&&checkAndUpdateBinding(view,def,6,v6)&&(changed=!0),bindLen>7&&checkAndUpdateBinding(view,def,7,v7)&&(changed=!0),bindLen>8&&checkAndUpdateBinding(view,def,8,v8)&&(changed=!0),bindLen>9&&checkAndUpdateBinding(view,def,9,v9)&&(changed=!0),changed){var value=def.text.prefix;bindLen>0&&(value+=_addInterpolationPart(v0,bindings[0])),bindLen>1&&(value+=_addInterpolationPart(v1,bindings[1])),bindLen>2&&(value+=_addInterpolationPart(v2,bindings[2])),bindLen>3&&(value+=_addInterpolationPart(v3,bindings[3])),bindLen>4&&(value+=_addInterpolationPart(v4,bindings[4])),bindLen>5&&(value+=_addInterpolationPart(v5,bindings[5])),bindLen>6&&(value+=_addInterpolationPart(v6,bindings[6])),bindLen>7&&(value+=_addInterpolationPart(v7,bindings[7])),bindLen>8&&(value+=_addInterpolationPart(v8,bindings[8])),bindLen>9&&(value+=_addInterpolationPart(v9,bindings[9]));var renderNode=asTextData(view,def.nodeIndex).renderText;view.renderer.setValue(renderNode,value)}return changed}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9);case 16384:return function checkAndUpdateDirectiveInline(view,def,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var providerData=asProviderData(view,def.nodeIndex),directive=providerData.instance,changed=!1,changes=void 0,bindLen=def.bindings.length;return bindLen>0&&checkBinding(view,def,0,v0)&&(changed=!0,changes=updateProp(view,providerData,def,0,v0,changes)),bindLen>1&&checkBinding(view,def,1,v1)&&(changed=!0,changes=updateProp(view,providerData,def,1,v1,changes)),bindLen>2&&checkBinding(view,def,2,v2)&&(changed=!0,changes=updateProp(view,providerData,def,2,v2,changes)),bindLen>3&&checkBinding(view,def,3,v3)&&(changed=!0,changes=updateProp(view,providerData,def,3,v3,changes)),bindLen>4&&checkBinding(view,def,4,v4)&&(changed=!0,changes=updateProp(view,providerData,def,4,v4,changes)),bindLen>5&&checkBinding(view,def,5,v5)&&(changed=!0,changes=updateProp(view,providerData,def,5,v5,changes)),bindLen>6&&checkBinding(view,def,6,v6)&&(changed=!0,changes=updateProp(view,providerData,def,6,v6,changes)),bindLen>7&&checkBinding(view,def,7,v7)&&(changed=!0,changes=updateProp(view,providerData,def,7,v7,changes)),bindLen>8&&checkBinding(view,def,8,v8)&&(changed=!0,changes=updateProp(view,providerData,def,8,v8,changes)),bindLen>9&&checkBinding(view,def,9,v9)&&(changed=!0,changes=updateProp(view,providerData,def,9,v9,changes)),changes&&directive.ngOnChanges(changes),65536&def.flags&&shouldCallLifecycleInitHook(view,256,def.nodeIndex)&&directive.ngOnInit(),262144&def.flags&&directive.ngDoCheck(),changed}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9);case 32:case 64:case 128:return function checkAndUpdatePureExpressionInline(view,def,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var bindings=def.bindings,changed=!1,bindLen=bindings.length;if(bindLen>0&&checkAndUpdateBinding(view,def,0,v0)&&(changed=!0),bindLen>1&&checkAndUpdateBinding(view,def,1,v1)&&(changed=!0),bindLen>2&&checkAndUpdateBinding(view,def,2,v2)&&(changed=!0),bindLen>3&&checkAndUpdateBinding(view,def,3,v3)&&(changed=!0),bindLen>4&&checkAndUpdateBinding(view,def,4,v4)&&(changed=!0),bindLen>5&&checkAndUpdateBinding(view,def,5,v5)&&(changed=!0),bindLen>6&&checkAndUpdateBinding(view,def,6,v6)&&(changed=!0),bindLen>7&&checkAndUpdateBinding(view,def,7,v7)&&(changed=!0),bindLen>8&&checkAndUpdateBinding(view,def,8,v8)&&(changed=!0),bindLen>9&&checkAndUpdateBinding(view,def,9,v9)&&(changed=!0),changed){var data=asPureExpressionData(view,def.nodeIndex),value=void 0;switch(201347067&def.flags){case 32:value=new Array(bindings.length),bindLen>0&&(value[0]=v0),bindLen>1&&(value[1]=v1),bindLen>2&&(value[2]=v2),bindLen>3&&(value[3]=v3),bindLen>4&&(value[4]=v4),bindLen>5&&(value[5]=v5),bindLen>6&&(value[6]=v6),bindLen>7&&(value[7]=v7),bindLen>8&&(value[8]=v8),bindLen>9&&(value[9]=v9);break;case 64:value={},bindLen>0&&(value[bindings[0].name]=v0),bindLen>1&&(value[bindings[1].name]=v1),bindLen>2&&(value[bindings[2].name]=v2),bindLen>3&&(value[bindings[3].name]=v3),bindLen>4&&(value[bindings[4].name]=v4),bindLen>5&&(value[bindings[5].name]=v5),bindLen>6&&(value[bindings[6].name]=v6),bindLen>7&&(value[bindings[7].name]=v7),bindLen>8&&(value[bindings[8].name]=v8),bindLen>9&&(value[bindings[9].name]=v9);break;case 128:var pipe=v0;switch(bindLen){case 1:value=pipe.transform(v0);break;case 2:value=pipe.transform(v1);break;case 3:value=pipe.transform(v1,v2);break;case 4:value=pipe.transform(v1,v2,v3);break;case 5:value=pipe.transform(v1,v2,v3,v4);break;case 6:value=pipe.transform(v1,v2,v3,v4,v5);break;case 7:value=pipe.transform(v1,v2,v3,v4,v5,v6);break;case 8:value=pipe.transform(v1,v2,v3,v4,v5,v6,v7);break;case 9:value=pipe.transform(v1,v2,v3,v4,v5,v6,v7,v8);break;case 10:value=pipe.transform(v1,v2,v3,v4,v5,v6,v7,v8,v9)}}data.value=value}return changed}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9);default:throw"unreachable"}}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9):function checkAndUpdateNodeDynamic(view,nodeDef,values){switch(201347067&nodeDef.flags){case 1:return function checkAndUpdateElementDynamic(view,def,values){for(var changed=!1,i=0;i<values.length;i++)checkAndUpdateElementValue(view,def,i,values[i])&&(changed=!0);return changed}(view,nodeDef,values);case 2:return function checkAndUpdateTextDynamic(view,def,values){for(var bindings=def.bindings,changed=!1,i=0;i<values.length;i++)checkAndUpdateBinding(view,def,i,values[i])&&(changed=!0);if(changed){var value="";for(i=0;i<values.length;i++)value+=_addInterpolationPart(values[i],bindings[i]);value=def.text.prefix+value;var renderNode=asTextData(view,def.nodeIndex).renderText;view.renderer.setValue(renderNode,value)}return changed}(view,nodeDef,values);case 16384:return function checkAndUpdateDirectiveDynamic(view,def,values){for(var providerData=asProviderData(view,def.nodeIndex),directive=providerData.instance,changed=!1,changes=void 0,i=0;i<values.length;i++)checkBinding(view,def,i,values[i])&&(changed=!0,changes=updateProp(view,providerData,def,i,values[i],changes));return changes&&directive.ngOnChanges(changes),65536&def.flags&&shouldCallLifecycleInitHook(view,256,def.nodeIndex)&&directive.ngOnInit(),262144&def.flags&&directive.ngDoCheck(),changed}(view,nodeDef,values);case 32:case 64:case 128:return function checkAndUpdatePureExpressionDynamic(view,def,values){for(var bindings=def.bindings,changed=!1,i=0;i<values.length;i++)checkAndUpdateBinding(view,def,i,values[i])&&(changed=!0);if(changed){var data=asPureExpressionData(view,def.nodeIndex),value=void 0;switch(201347067&def.flags){case 32:value=values;break;case 64:value={};for(i=0;i<values.length;i++)value[bindings[i].name]=values[i];break;case 128:var pipe=values[0],params=values.slice(1);value=pipe.transform.apply(pipe,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(params))}data.value=value}return changed}(view,nodeDef,values);default:throw"unreachable"}}(view,nodeDef,v0)}function markProjectedViewsForCheck(view){var def=view.def;Iif(4&def.nodeFlags)for(var i=0;i<def.nodes.length;i++){var nodeDef=def.nodes[i];if(4&nodeDef.flags){var projectedViews=asElementData(view,i).template._projectedViews;if(projectedViews)for(var i_1=0;i_1<projectedViews.length;i_1++){var projectedView=projectedViews[i_1];projectedView.state|=32,markParentViewsForCheckProjectedViews(projectedView,view)}}else 0==(4&nodeDef.childFlags)&&(i+=nodeDef.childCount)}}function checkNoChangesNode(view,nodeDef,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){return 0===argStyle?function checkNoChangesNodeInline(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var bindLen=nodeDef.bindings.length;bindLen>0&&checkBindingNoChanges(view,nodeDef,0,v0);bindLen>1&&checkBindingNoChanges(view,nodeDef,1,v1);bindLen>2&&checkBindingNoChanges(view,nodeDef,2,v2);bindLen>3&&checkBindingNoChanges(view,nodeDef,3,v3);bindLen>4&&checkBindingNoChanges(view,nodeDef,4,v4);bindLen>5&&checkBindingNoChanges(view,nodeDef,5,v5);bindLen>6&&checkBindingNoChanges(view,nodeDef,6,v6);bindLen>7&&checkBindingNoChanges(view,nodeDef,7,v7);bindLen>8&&checkBindingNoChanges(view,nodeDef,8,v8);bindLen>9&&checkBindingNoChanges(view,nodeDef,9,v9)}(view,nodeDef,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9):function checkNoChangesNodeDynamic(view,nodeDef,values){for(var i=0;i<values.length;i++)checkBindingNoChanges(view,nodeDef,i,values[i])}(view,nodeDef,v0),!1}function checkNoChangesQuery(view,nodeDef){if(asQueryList(view,nodeDef.nodeIndex).dirty)throw expressionChangedAfterItHasBeenCheckedError(Services.createDebugContext(view,nodeDef.nodeIndex),"Query "+nodeDef.query.id+" not dirty","Query "+nodeDef.query.id+" dirty",0!=(1&view.state))}function destroyView(view){if(!(128&view.state)){if(execEmbeddedViewsAction(view,ViewAction.Destroy),execComponentViewsAction(view,ViewAction.Destroy),callLifecycleHooksChildrenFirst(view,131072),view.disposables)for(var i=0;i<view.disposables.length;i++)view.disposables[i]();!function detachProjectedView(view){if(16&view.state){var dvcElementData=declaredViewContainer(view);if(dvcElementData){var projectedViews=dvcElementData.template._projectedViews;projectedViews&&(removeFromArray(projectedViews,projectedViews.indexOf(view)),Services.dirtyParentQueries(view))}}}(view),view.renderer.destroyNode&&function destroyViewNodes(view){for(var len=view.def.nodes.length,i=0;i<len;i++){var def=view.def.nodes[i];1&def.flags?view.renderer.destroyNode(asElementData(view,i).renderElement):2&def.flags?view.renderer.destroyNode(asTextData(view,i).renderText):(67108864&def.flags||134217728&def.flags)&&asQueryList(view,i).destroy()}}(view),isComponentView(view)&&view.renderer.destroy(),view.state|=128}}function execComponentViewsAction(view,action){var def=view.def;if(33554432&def.nodeFlags)for(var i=0;i<def.nodes.length;i++){var nodeDef=def.nodes[i];33554432&nodeDef.flags?callViewAction(asElementData(view,i).componentView,action):0==(33554432&nodeDef.childFlags)&&(i+=nodeDef.childCount)}}function execEmbeddedViewsAction(view,action){var def=view.def;if(16777216&def.nodeFlags)for(var i=0;i<def.nodes.length;i++){var nodeDef=def.nodes[i];if(16777216&nodeDef.flags)for(var embeddedViews=asElementData(view,i).viewContainer._embeddedViews,k=0;k<embeddedViews.length;k++)callViewAction(embeddedViews[k],action);else 0==(16777216&nodeDef.childFlags)&&(i+=nodeDef.childCount)}}function callViewAction(view,action){var viewState=view.state;switch(action){case ViewAction.CheckNoChanges:0==(128&viewState)&&(12==(12&viewState)?checkNoChangesView(view):64&viewState&&execProjectedViewsAction(view,ViewAction.CheckNoChangesProjectedViews));break;case ViewAction.CheckNoChangesProjectedViews:0==(128&viewState)&&(32&viewState?checkNoChangesView(view):64&viewState&&execProjectedViewsAction(view,action));break;case ViewAction.CheckAndUpdate:0==(128&viewState)&&(12==(12&viewState)?checkAndUpdateView(view):64&viewState&&execProjectedViewsAction(view,ViewAction.CheckAndUpdateProjectedViews));break;case ViewAction.CheckAndUpdateProjectedViews:0==(128&viewState)&&(32&viewState?checkAndUpdateView(view):64&viewState&&execProjectedViewsAction(view,action));break;case ViewAction.Destroy:destroyView(view);break;case ViewAction.CreateViewNodes:createViewNodes(view)}}function execProjectedViewsAction(view,action){execEmbeddedViewsAction(view,action),execComponentViewsAction(view,action)}function execQueriesAction(view,queryFlags,staticDynamicQueryFlag,checkType){if(view.def.nodeFlags&queryFlags&&view.def.nodeFlags&staticDynamicQueryFlag)for(var nodeCount=view.def.nodes.length,i=0;i<nodeCount;i++){var nodeDef=view.def.nodes[i];if(nodeDef.flags&queryFlags&&nodeDef.flags&staticDynamicQueryFlag)switch(Services.setCurrentNode(view,nodeDef.nodeIndex),checkType){case 0:checkAndUpdateQuery(view,nodeDef);break;case 1:checkNoChangesQuery(view,nodeDef)}nodeDef.childFlags&queryFlags&&nodeDef.childFlags&staticDynamicQueryFlag||(i+=nodeDef.childCount)}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(ViewAction){ViewAction[ViewAction.CreateViewNodes=0]="CreateViewNodes",ViewAction[ViewAction.CheckNoChanges=1]="CheckNoChanges",ViewAction[ViewAction.CheckNoChangesProjectedViews=2]="CheckNoChangesProjectedViews",ViewAction[ViewAction.CheckAndUpdate=3]="CheckAndUpdate",ViewAction[ViewAction.CheckAndUpdateProjectedViews=4]="CheckAndUpdateProjectedViews",ViewAction[ViewAction.Destroy=5]="Destroy"}(ViewAction||(ViewAction={}));var initialized=!1;function initServicesIfNeeded(){Eif(!initialized){initialized=!0;var services=isDevMode()?function createDebugServices(){return{setCurrentNode:debugSetCurrentNode,createRootView:debugCreateRootView,createEmbeddedView:debugCreateEmbeddedView,createComponentView:debugCreateComponentView,createNgModuleRef:debugCreateNgModuleRef,overrideProvider:debugOverrideProvider,overrideComponentView:debugOverrideComponentView,clearOverrides:debugClearOverrides,checkAndUpdateView:debugCheckAndUpdateView,checkNoChangesView:debugCheckNoChangesView,destroyView:debugDestroyView,createDebugContext:function(view,nodeIndex){return new DebugContext_(view,nodeIndex)},handleEvent:debugHandleEvent,updateDirectives:debugUpdateDirectives,updateRenderer:debugUpdateRenderer}}():function createProdServices(){return{setCurrentNode:function(){},createRootView:createProdRootView,createEmbeddedView:createEmbeddedView,createComponentView:createComponentView,createNgModuleRef:createNgModuleRef,overrideProvider:NOOP,overrideComponentView:NOOP,clearOverrides:NOOP,checkAndUpdateView:checkAndUpdateView,checkNoChangesView:checkNoChangesView,destroyView:destroyView,createDebugContext:function(view,nodeIndex){return new DebugContext_(view,nodeIndex)},handleEvent:function(view,nodeIndex,eventName,event){return view.def.handleEvent(view,nodeIndex,eventName,event)},updateDirectives:function(view,checkType){return view.def.updateDirectives(0===checkType?prodCheckAndUpdateNode:prodCheckNoChangesNode,view)},updateRenderer:function(view,checkType){return view.def.updateRenderer(0===checkType?prodCheckAndUpdateNode:prodCheckNoChangesNode,view)}}}();Services.setCurrentNode=services.setCurrentNode,Services.createRootView=services.createRootView,Services.createEmbeddedView=services.createEmbeddedView,Services.createComponentView=services.createComponentView,Services.createNgModuleRef=services.createNgModuleRef,Services.overrideProvider=services.overrideProvider,Services.overrideComponentView=services.overrideComponentView,Services.clearOverrides=services.clearOverrides,Services.checkAndUpdateView=services.checkAndUpdateView,Services.checkNoChangesView=services.checkNoChangesView,Services.destroyView=services.destroyView,Services.resolveDep=resolveDep,Services.createDebugContext=services.createDebugContext,Services.handleEvent=services.handleEvent,Services.updateDirectives=services.updateDirectives,Services.updateRenderer=services.updateRenderer,Services.dirtyParentQueries=dirtyParentQueries}}function createProdRootView(elInjector,projectableNodes,rootSelectorOrNode,def,ngModule,context){var rendererFactory=ngModule.injector.get(RendererFactory2);return createRootView(createRootData(elInjector,ngModule,rendererFactory,projectableNodes,rootSelectorOrNode),def,context)}function debugCreateRootView(elInjector,projectableNodes,rootSelectorOrNode,def,ngModule,context){var rendererFactory=ngModule.injector.get(RendererFactory2),root=createRootData(elInjector,ngModule,new DebugRendererFactory2(rendererFactory),projectableNodes,rootSelectorOrNode),defWithOverride=applyProviderOverridesToView(def);return callWithDebugContext(DebugAction.create,createRootView,null,[root,defWithOverride,context])}function createRootData(elInjector,ngModule,rendererFactory,projectableNodes,rootSelectorOrNode){var sanitizer=ngModule.injector.get(Sanitizer),errorHandler=ngModule.injector.get(ErrorHandler),renderer=rendererFactory.createRenderer(null,null);return{ngModule:ngModule,injector:elInjector,projectableNodes:projectableNodes,selectorOrNode:rootSelectorOrNode,sanitizer:sanitizer,rendererFactory:rendererFactory,renderer:renderer,errorHandler:errorHandler}}function debugCreateEmbeddedView(parentView,anchorDef,viewDef,context){var defWithOverride=applyProviderOverridesToView(viewDef);return callWithDebugContext(DebugAction.create,createEmbeddedView,null,[parentView,anchorDef,defWithOverride,context])}function debugCreateComponentView(parentView,nodeDef,viewDef,hostElement){var overrideComponentView=viewDefOverrides.get(nodeDef.element.componentProvider.provider.token);return viewDef=overrideComponentView||applyProviderOverridesToView(viewDef),callWithDebugContext(DebugAction.create,createComponentView,null,[parentView,nodeDef,viewDef,hostElement])}function debugCreateNgModuleRef(moduleType,parentInjector,bootstrapComponents,def){return createNgModuleRef(moduleType,parentInjector,bootstrapComponents,function applyProviderOverridesToNgModule(def){var _a=function calcHasOverrides(def){var hasOverrides=!1,hasDeprecatedOverrides=!1;if(0===providerOverrides.size)return{hasOverrides:hasOverrides,hasDeprecatedOverrides:hasDeprecatedOverrides};return def.providers.forEach(function(node){var override=providerOverrides.get(node.token);3840&node.flags&&override&&(hasOverrides=!0,hasDeprecatedOverrides=hasDeprecatedOverrides||override.deprecatedBehavior)}),def.modules.forEach(function(module){providerOverridesWithScope.forEach(function(override,token){getInjectableDef(token).providedIn===module&&(hasOverrides=!0,hasDeprecatedOverrides=hasDeprecatedOverrides||override.deprecatedBehavior)})}),{hasOverrides:hasOverrides,hasDeprecatedOverrides:hasDeprecatedOverrides}}(def),hasOverrides=_a.hasOverrides,hasDeprecatedOverrides=_a.hasDeprecatedOverrides;if(!hasOverrides)return def;return function applyProviderOverrides(def){for(var i=0;i<def.providers.length;i++){var provider=def.providers[i];hasDeprecatedOverrides&&(provider.flags|=4096);var override=providerOverrides.get(provider.token);override&&(provider.flags=-3841&provider.flags|override.flags,provider.deps=splitDepsDsl(override.deps),provider.value=override.value)}if(providerOverridesWithScope.size>0){var moduleSet_1=new Set(def.modules);providerOverridesWithScope.forEach(function(override,token){if(moduleSet_1.has(getInjectableDef(token).providedIn)){var provider={token:token,flags:override.flags|(hasDeprecatedOverrides?4096:0),deps:splitDepsDsl(override.deps),value:override.value,index:def.providers.length};def.providers.push(provider),def.providersByKey[tokenKey(token)]=provider}})}}(def=def.factory(function(){return NOOP})),def}(def))}var DebugAction,_currentAction,_currentView,_currentNodeIndex,providerOverrides=new Map,providerOverridesWithScope=new Map,viewDefOverrides=new Map;function debugOverrideProvider(override){var injectableDef;providerOverrides.set(override.token,override),"function"==typeof override.token&&(injectableDef=getInjectableDef(override.token))&&"function"==typeof injectableDef.providedIn&&providerOverridesWithScope.set(override.token,override)}function debugOverrideComponentView(comp,compFactory){var hostViewDef=resolveDefinition(function getComponentViewDefinitionFactory(componentFactory){return componentFactory.viewDefFactory}(compFactory)),compViewDef=resolveDefinition(hostViewDef.nodes[0].element.componentView);viewDefOverrides.set(comp,compViewDef)}function debugClearOverrides(){providerOverrides.clear(),providerOverridesWithScope.clear(),viewDefOverrides.clear()}function applyProviderOverridesToView(def){if(0===providerOverrides.size)return def;var elementIndicesWithOverwrittenProviders=function findElementIndicesWithOverwrittenProviders(def){for(var elIndicesWithOverwrittenProviders=[],lastElementDef=null,i=0;i<def.nodes.length;i++){var nodeDef=def.nodes[i];1&nodeDef.flags&&(lastElementDef=nodeDef),lastElementDef&&3840&nodeDef.flags&&providerOverrides.has(nodeDef.provider.token)&&(elIndicesWithOverwrittenProviders.push(lastElementDef.nodeIndex),lastElementDef=null)}return elIndicesWithOverwrittenProviders}(def);if(0===elementIndicesWithOverwrittenProviders.length)return def;def=def.factory(function(){return NOOP});for(var i=0;i<elementIndicesWithOverwrittenProviders.length;i++)applyProviderOverridesToElement(def,elementIndicesWithOverwrittenProviders[i]);return def;function applyProviderOverridesToElement(viewDef,elIndex){for(var i=elIndex+1;i<viewDef.nodes.length;i++){var nodeDef=viewDef.nodes[i];if(1&nodeDef.flags)return;if(3840&nodeDef.flags){var provider=nodeDef.provider,override=providerOverrides.get(provider.token);override&&(nodeDef.flags=-3841&nodeDef.flags|override.flags,provider.deps=splitDepsDsl(override.deps),provider.value=override.value)}}}}function prodCheckAndUpdateNode(view,checkIndex,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var nodeDef=view.def.nodes[checkIndex];return checkAndUpdateNode(view,nodeDef,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9),224&nodeDef.flags?asPureExpressionData(view,checkIndex).value:void 0}function prodCheckNoChangesNode(view,checkIndex,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9){var nodeDef=view.def.nodes[checkIndex];return checkNoChangesNode(view,nodeDef,argStyle,v0,v1,v2,v3,v4,v5,v6,v7,v8,v9),224&nodeDef.flags?asPureExpressionData(view,checkIndex).value:void 0}function debugCheckAndUpdateView(view){return callWithDebugContext(DebugAction.detectChanges,checkAndUpdateView,null,[view])}function debugCheckNoChangesView(view){return callWithDebugContext(DebugAction.checkNoChanges,checkNoChangesView,null,[view])}function debugDestroyView(view){return callWithDebugContext(DebugAction.destroy,destroyView,null,[view])}function debugSetCurrentNode(view,nodeIndex){_currentView=view,_currentNodeIndex=nodeIndex}function debugHandleEvent(view,nodeIndex,eventName,event){return debugSetCurrentNode(view,nodeIndex),callWithDebugContext(DebugAction.handleEvent,view.def.handleEvent,null,[view,nodeIndex,eventName,event])}function debugUpdateDirectives(view,checkType){if(128&view.state)throw viewDestroyedError(DebugAction[_currentAction]);return debugSetCurrentNode(view,nextDirectiveWithBinding(view,0)),view.def.updateDirectives(function debugCheckDirectivesFn(view,nodeIndex,argStyle){for(var values=[],_i=3;_i<arguments.length;_i++)values[_i-3]=arguments[_i];var nodeDef=view.def.nodes[nodeIndex];0===checkType?debugCheckAndUpdateNode(view,nodeDef,argStyle,values):debugCheckNoChangesNode(view,nodeDef,argStyle,values);16384&nodeDef.flags&&debugSetCurrentNode(view,nextDirectiveWithBinding(view,nodeIndex));return 224&nodeDef.flags?asPureExpressionData(view,nodeDef.nodeIndex).value:void 0},view)}function debugUpdateRenderer(view,checkType){if(128&view.state)throw viewDestroyedError(DebugAction[_currentAction]);return debugSetCurrentNode(view,nextRenderNodeWithBinding(view,0)),view.def.updateRenderer(function debugCheckRenderNodeFn(view,nodeIndex,argStyle){for(var values=[],_i=3;_i<arguments.length;_i++)values[_i-3]=arguments[_i];var nodeDef=view.def.nodes[nodeIndex];0===checkType?debugCheckAndUpdateNode(view,nodeDef,argStyle,values):debugCheckNoChangesNode(view,nodeDef,argStyle,values);3&nodeDef.flags&&debugSetCurrentNode(view,nextRenderNodeWithBinding(view,nodeIndex));return 224&nodeDef.flags?asPureExpressionData(view,nodeDef.nodeIndex).value:void 0},view)}function debugCheckAndUpdateNode(view,nodeDef,argStyle,givenValues){if(checkAndUpdateNode.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([view,nodeDef,argStyle],givenValues))){var values=1===argStyle?givenValues[0]:givenValues;if(16384&nodeDef.flags){for(var bindingValues={},i=0;i<nodeDef.bindings.length;i++){var binding=nodeDef.bindings[i],value=values[i];8&binding.flags&&(bindingValues[normalizeDebugBindingName(binding.nonMinifiedName)]=normalizeDebugBindingValue(value))}var elDef=nodeDef.parent,el=asElementData(view,elDef.nodeIndex).renderElement;if(elDef.element.name)for(var attr in bindingValues){null!=(value=bindingValues[attr])?view.renderer.setAttribute(el,attr,value):view.renderer.removeAttribute(el,attr)}else view.renderer.setValue(el,"bindings="+JSON.stringify(bindingValues,null,2))}}}function debugCheckNoChangesNode(view,nodeDef,argStyle,values){checkNoChangesNode.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([view,nodeDef,argStyle],values))}function nextDirectiveWithBinding(view,nodeIndex){for(var i=nodeIndex;i<view.def.nodes.length;i++){var nodeDef=view.def.nodes[i];if(16384&nodeDef.flags&&nodeDef.bindings&&nodeDef.bindings.length)return i}return null}function nextRenderNodeWithBinding(view,nodeIndex){for(var i=nodeIndex;i<view.def.nodes.length;i++){var nodeDef=view.def.nodes[i];if(3&nodeDef.flags&&nodeDef.bindings&&nodeDef.bindings.length)return i}return null}!function(DebugAction){DebugAction[DebugAction.create=0]="create",DebugAction[DebugAction.detectChanges=1]="detectChanges",DebugAction[DebugAction.checkNoChanges=2]="checkNoChanges",DebugAction[DebugAction.destroy=3]="destroy",DebugAction[DebugAction.handleEvent=4]="handleEvent"}(DebugAction||(DebugAction={}));var DebugContext_=function(){function DebugContext_(view,nodeIndex){this.view=view,this.nodeIndex=nodeIndex,null==nodeIndex&&(this.nodeIndex=nodeIndex=0),this.nodeDef=view.def.nodes[nodeIndex];for(var elDef=this.nodeDef,elView=view;elDef&&0==(1&elDef.flags);)elDef=elDef.parent;if(!elDef)for(;!elDef&&elView;)elDef=viewParentEl(elView),elView=elView.parent;this.elDef=elDef,this.elView=elView}return Object.defineProperty(DebugContext_.prototype,"elOrCompView",{get:function(){return asElementData(this.elView,this.elDef.nodeIndex).componentView||this.view},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"injector",{get:function(){return createInjector$1(this.elView,this.elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"component",{get:function(){return this.elOrCompView.component},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"context",{get:function(){return this.elOrCompView.context},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"providerTokens",{get:function(){var tokens=[];if(this.elDef)for(var i=this.elDef.nodeIndex+1;i<=this.elDef.nodeIndex+this.elDef.childCount;i++){var childDef=this.elView.def.nodes[i];20224&childDef.flags&&tokens.push(childDef.provider.token),i+=childDef.childCount}return tokens},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"references",{get:function(){var references={};if(this.elDef){collectReferences(this.elView,this.elDef,references);for(var i=this.elDef.nodeIndex+1;i<=this.elDef.nodeIndex+this.elDef.childCount;i++){var childDef=this.elView.def.nodes[i];20224&childDef.flags&&collectReferences(this.elView,childDef,references),i+=childDef.childCount}}return references},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"componentRenderElement",{get:function(){var elData=function findHostElement(view){for(;view&&!isComponentView(view);)view=view.parent;if(view.parent)return asElementData(view.parent,viewParentEl(view).nodeIndex);return null}(this.elOrCompView);return elData?elData.renderElement:void 0},enumerable:!0,configurable:!0}),Object.defineProperty(DebugContext_.prototype,"renderNode",{get:function(){return 2&this.nodeDef.flags?renderNode(this.view,this.nodeDef):renderNode(this.elView,this.elDef)},enumerable:!0,configurable:!0}),DebugContext_.prototype.logError=function(console){for(var logViewDef,logNodeIndex,values=[],_i=1;_i<arguments.length;_i++)values[_i-1]=arguments[_i];2&this.nodeDef.flags?(logViewDef=this.view.def,logNodeIndex=this.nodeDef.nodeIndex):(logViewDef=this.elView.def,logNodeIndex=this.elDef.nodeIndex);var renderNodeIndex=getRenderNodeIndex(logViewDef,logNodeIndex),currRenderNodeIndex=-1,nodeLogger=function(){var _a;return++currRenderNodeIndex===renderNodeIndex?(_a=console.error).bind.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([console],values)):NOOP};logViewDef.factory(nodeLogger),currRenderNodeIndex<renderNodeIndex&&(console.error("Illegal state: the ViewDefinitionFactory did not call the logger!"),console.error.apply(console,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(values)))},DebugContext_}();function getRenderNodeIndex(viewDef,nodeIndex){for(var renderNodeIndex=-1,i=0;i<=nodeIndex;i++){3&viewDef.nodes[i].flags&&renderNodeIndex++}return renderNodeIndex}function collectReferences(view,nodeDef,references){for(var refName in nodeDef.references)references[refName]=getQueryValue(view,nodeDef,nodeDef.references[refName])}function callWithDebugContext(action,fn,self,args){var oldAction=_currentAction,oldView=_currentView,oldNodeIndex=_currentNodeIndex;try{_currentAction=action;var result=fn.apply(self,args);return _currentView=oldView,_currentNodeIndex=oldNodeIndex,_currentAction=oldAction,result}catch(e){if(function isViewDebugError(err){return!!getDebugContext(err)}(e)||!_currentView)throw e;throw function viewWrappedDebugError(err,context){return err instanceof Error||(err=new Error(err.toString())),_addDebugContext(err,context),err}(e,getCurrentDebugContext())}}function getCurrentDebugContext(){return _currentView?new DebugContext_(_currentView,_currentNodeIndex):null}var DebugRendererFactory2=function(){function DebugRendererFactory2(delegate){this.delegate=delegate}return DebugRendererFactory2.prototype.createRenderer=function(element,renderData){return new DebugRenderer2(this.delegate.createRenderer(element,renderData))},DebugRendererFactory2.prototype.begin=function(){this.delegate.begin&&this.delegate.begin()},DebugRendererFactory2.prototype.end=function(){this.delegate.end&&this.delegate.end()},DebugRendererFactory2.prototype.whenRenderingDone=function(){return this.delegate.whenRenderingDone?this.delegate.whenRenderingDone():Promise.resolve(null)},DebugRendererFactory2}(),DebugRenderer2=function(){function DebugRenderer2(delegate){this.delegate=delegate,this.debugContextFactory=getCurrentDebugContext,this.data=this.delegate.data}return DebugRenderer2.prototype.createDebugContext=function(nativeElement){return this.debugContextFactory(nativeElement)},DebugRenderer2.prototype.destroyNode=function(node){!function removeDebugNodeFromIndex(node){_nativeNodeToDebugNode.delete(node.nativeNode)}(getDebugNode(node)),this.delegate.destroyNode&&this.delegate.destroyNode(node)},DebugRenderer2.prototype.destroy=function(){this.delegate.destroy()},DebugRenderer2.prototype.createElement=function(name,namespace){var el=this.delegate.createElement(name,namespace),debugCtx=this.createDebugContext(el);if(debugCtx){var debugEl=new DebugElement__PRE_R3__(el,null,debugCtx);debugEl.name=name,indexDebugNode(debugEl)}return el},DebugRenderer2.prototype.createComment=function(value){var comment=this.delegate.createComment(value),debugCtx=this.createDebugContext(comment);return debugCtx&&indexDebugNode(new DebugNode__PRE_R3__(comment,null,debugCtx)),comment},DebugRenderer2.prototype.createText=function(value){var text=this.delegate.createText(value),debugCtx=this.createDebugContext(text);return debugCtx&&indexDebugNode(new DebugNode__PRE_R3__(text,null,debugCtx)),text},DebugRenderer2.prototype.appendChild=function(parent,newChild){var debugEl=getDebugNode(parent),debugChildEl=getDebugNode(newChild);debugEl&&debugChildEl&&debugEl instanceof DebugElement__PRE_R3__&&debugEl.addChild(debugChildEl),this.delegate.appendChild(parent,newChild)},DebugRenderer2.prototype.insertBefore=function(parent,newChild,refChild){var debugEl=getDebugNode(parent),debugChildEl=getDebugNode(newChild),debugRefEl=getDebugNode(refChild);debugEl&&debugChildEl&&debugEl instanceof DebugElement__PRE_R3__&&debugEl.insertBefore(debugRefEl,debugChildEl),this.delegate.insertBefore(parent,newChild,refChild)},DebugRenderer2.prototype.removeChild=function(parent,oldChild){var debugEl=getDebugNode(parent),debugChildEl=getDebugNode(oldChild);debugEl&&debugChildEl&&debugEl instanceof DebugElement__PRE_R3__&&debugEl.removeChild(debugChildEl),this.delegate.removeChild(parent,oldChild)},DebugRenderer2.prototype.selectRootElement=function(selectorOrNode,preserveContent){var el=this.delegate.selectRootElement(selectorOrNode,preserveContent),debugCtx=getCurrentDebugContext();return debugCtx&&indexDebugNode(new DebugElement__PRE_R3__(el,null,debugCtx)),el},DebugRenderer2.prototype.setAttribute=function(el,name,value,namespace){var debugEl=getDebugNode(el);if(debugEl&&debugEl instanceof DebugElement__PRE_R3__){var fullName=namespace?namespace+":"+name:name;debugEl.attributes[fullName]=value}this.delegate.setAttribute(el,name,value,namespace)},DebugRenderer2.prototype.removeAttribute=function(el,name,namespace){var debugEl=getDebugNode(el);if(debugEl&&debugEl instanceof DebugElement__PRE_R3__){var fullName=namespace?namespace+":"+name:name;debugEl.attributes[fullName]=null}this.delegate.removeAttribute(el,name,namespace)},DebugRenderer2.prototype.addClass=function(el,name){var debugEl=getDebugNode(el);debugEl&&debugEl instanceof DebugElement__PRE_R3__&&(debugEl.classes[name]=!0),this.delegate.addClass(el,name)},DebugRenderer2.prototype.removeClass=function(el,name){var debugEl=getDebugNode(el);debugEl&&debugEl instanceof DebugElement__PRE_R3__&&(debugEl.classes[name]=!1),this.delegate.removeClass(el,name)},DebugRenderer2.prototype.setStyle=function(el,style,value,flags){var debugEl=getDebugNode(el);debugEl&&debugEl instanceof DebugElement__PRE_R3__&&(debugEl.styles[style]=value),this.delegate.setStyle(el,style,value,flags)},DebugRenderer2.prototype.removeStyle=function(el,style,flags){var debugEl=getDebugNode(el);debugEl&&debugEl instanceof DebugElement__PRE_R3__&&(debugEl.styles[style]=null),this.delegate.removeStyle(el,style,flags)},DebugRenderer2.prototype.setProperty=function(el,name,value){var debugEl=getDebugNode(el);debugEl&&debugEl instanceof DebugElement__PRE_R3__&&(debugEl.properties[name]=value),this.delegate.setProperty(el,name,value)},DebugRenderer2.prototype.listen=function(target,eventName,callback){if("string"!=typeof target){var debugEl=getDebugNode(target);debugEl&&debugEl.listeners.push(new DebugEventListener(eventName,callback))}return this.delegate.listen(target,eventName,callback)},DebugRenderer2.prototype.parentNode=function(node){return this.delegate.parentNode(node)},DebugRenderer2.prototype.nextSibling=function(node){return this.delegate.nextSibling(node)},DebugRenderer2.prototype.setValue=function(node,value){return this.delegate.setValue(node,value)},DebugRenderer2}();function createNgModuleFactory(ngModuleType,bootstrapComponents,defFactory){return new NgModuleFactory_(ngModuleType,bootstrapComponents,defFactory)}var NgModuleFactory_=function(_super){function NgModuleFactory_(moduleType,_bootstrapComponents,_ngModuleDefFactory){var _this=_super.call(this)||this;return _this.moduleType=moduleType,_this._bootstrapComponents=_bootstrapComponents,_this._ngModuleDefFactory=_ngModuleDefFactory,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(NgModuleFactory_,_super),NgModuleFactory_.prototype.create=function(parentInjector){initServicesIfNeeded();var def=function cloneNgModuleDefinition(def){var providers=Array.from(def.providers),modules=Array.from(def.modules),providersByKey={};for(var key in def.providersByKey)providersByKey[key]=def.providersByKey[key];return{factory:def.factory,isRoot:def.isRoot,providers:providers,modules:modules,providersByKey:providersByKey}}(resolveDefinition(this._ngModuleDefFactory));return Services.createNgModuleRef(this.moduleType,parentInjector||Injector.NULL,this._bootstrapComponents,def)},NgModuleFactory_}(NgModuleFactory);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */}).call(this,__webpack_require__(18))},function(module,__webpack_exports__,__webpack_require__){"use strict";(function(global){__webpack_require__.d(__webpack_exports__,"c",function(){return CompilerConfig}),__webpack_require__.d(__webpack_exports__,"j",function(){return Identifiers}),__webpack_require__.d(__webpack_exports__,"k",function(){return JitCompiler}),__webpack_require__.d(__webpack_exports__,"e",function(){return DirectiveResolver}),__webpack_require__.d(__webpack_exports__,"r",function(){return PipeResolver}),__webpack_require__.d(__webpack_exports__,"p",function(){return NgModuleResolver}),__webpack_require__.d(__webpack_exports__,"o",function(){return NgModuleCompiler}),__webpack_require__.d(__webpack_exports__,"l",function(){return JitEvaluator}),__webpack_require__.d(__webpack_exports__,"z",function(){return ViewCompiler}),__webpack_require__.d(__webpack_exports__,"B",function(){return syntaxError}),__webpack_require__.d(__webpack_exports__,"s",function(){return ProviderMeta}),__webpack_require__.d(__webpack_exports__,"u",function(){return StaticSymbolCache}),__webpack_require__.d(__webpack_exports__,"w",function(){return SummaryResolver}),__webpack_require__.d(__webpack_exports__,"m",function(){return JitSummaryResolver}),__webpack_require__.d(__webpack_exports__,"b",function(){return CompileReflector}),__webpack_require__.d(__webpack_exports__,"y",function(){return UrlResolver}),__webpack_require__.d(__webpack_exports__,"A",function(){return getUrlScheme}),__webpack_require__.d(__webpack_exports__,"t",function(){return ResourceLoader}),__webpack_require__.d(__webpack_exports__,"g",function(){return ElementSchemaRegistry}),__webpack_require__.d(__webpack_exports__,"i",function(){return I18NHtmlParser}),__webpack_require__.d(__webpack_exports__,"d",function(){return DirectiveNormalizer}),__webpack_require__.d(__webpack_exports__,"n",function(){return Lexer}),__webpack_require__.d(__webpack_exports__,"q",function(){return Parser$1}),__webpack_require__.d(__webpack_exports__,"a",function(){return CompileMetadataResolver}),__webpack_require__.d(__webpack_exports__,"h",function(){return HtmlParser}),__webpack_require__.d(__webpack_exports__,"f",function(){return DomElementSchemaRegistry}),__webpack_require__.d(__webpack_exports__,"v",function(){return StyleCompiler}),__webpack_require__.d(__webpack_exports__,"x",function(){return TemplateParser});var TagContentType,tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0);
/**
 * @license Angular v8.0.3
 * (c) 2010-2019 Google LLC. https://angular.io/
 * License: MIT
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function splitNsName(elementName){Eif(":"!=elementName[0])return[null,elementName];var colonIndex=elementName.indexOf(":",1);if(-1==colonIndex)throw new Error('Unsupported format "'+elementName+'" expecting ":namespace:name"');return[elementName.slice(1,colonIndex),elementName.slice(colonIndex+1)]}function isNgContainer(tagName){return"ng-container"===splitNsName(tagName)[1]}function isNgContent(tagName){return"ng-content"===splitNsName(tagName)[1]}function isNgTemplate(tagName){return"ng-template"===splitNsName(tagName)[1]}function getNsPrefix(fullName){return null===fullName?null:splitNsName(fullName)[0]}function mergeNsAndName(prefix,localName){return prefix?":"+prefix+":"+localName:localName}!function(TagContentType){TagContentType[TagContentType.RAW_TEXT=0]="RAW_TEXT",TagContentType[TagContentType.ESCAPABLE_RAW_TEXT=1]="ESCAPABLE_RAW_TEXT",TagContentType[TagContentType.PARSABLE_DATA=2]="PARSABLE_DATA"}(TagContentType||(TagContentType={}));var NAMED_ENTITIES={Aacute:"Á",aacute:"á",Acirc:"Â",acirc:"â",acute:"´",AElig:"Æ",aelig:"æ",Agrave:"À",agrave:"à",alefsym:"ℵ",Alpha:"Α",alpha:"α",amp:"&",and:"∧",ang:"∠",apos:"'",Aring:"Å",aring:"å",asymp:"≈",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",bdquo:"„",Beta:"Β",beta:"β",brvbar:"¦",bull:"•",cap:"∩",Ccedil:"Ç",ccedil:"ç",cedil:"¸",cent:"¢",Chi:"Χ",chi:"χ",circ:"ˆ",clubs:"♣",cong:"≅",copy:"©",crarr:"↵",cup:"∪",curren:"¤",dagger:"†",Dagger:"‡",darr:"↓",dArr:"⇓",deg:"°",Delta:"Δ",delta:"δ",diams:"♦",divide:"÷",Eacute:"É",eacute:"é",Ecirc:"Ê",ecirc:"ê",Egrave:"È",egrave:"è",empty:"∅",emsp:" ",ensp:" ",Epsilon:"Ε",epsilon:"ε",equiv:"≡",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",exist:"∃",fnof:"ƒ",forall:"∀",frac12:"½",frac14:"¼",frac34:"¾",frasl:"⁄",Gamma:"Γ",gamma:"γ",ge:"≥",gt:">",harr:"↔",hArr:"⇔",hearts:"♥",hellip:"…",Iacute:"Í",iacute:"í",Icirc:"Î",icirc:"î",iexcl:"¡",Igrave:"Ì",igrave:"ì",image:"ℑ",infin:"∞",int:"∫",Iota:"Ι",iota:"ι",iquest:"¿",isin:"∈",Iuml:"Ï",iuml:"ï",Kappa:"Κ",kappa:"κ",Lambda:"Λ",lambda:"λ",lang:"⟨",laquo:"«",larr:"←",lArr:"⇐",lceil:"⌈",ldquo:"“",le:"≤",lfloor:"⌊",lowast:"∗",loz:"◊",lrm:"‎",lsaquo:"‹",lsquo:"‘",lt:"<",macr:"¯",mdash:"—",micro:"µ",middot:"·",minus:"−",Mu:"Μ",mu:"μ",nabla:"∇",nbsp:" ",ndash:"–",ne:"≠",ni:"∋",not:"¬",notin:"∉",nsub:"⊄",Ntilde:"Ñ",ntilde:"ñ",Nu:"Ν",nu:"ν",Oacute:"Ó",oacute:"ó",Ocirc:"Ô",ocirc:"ô",OElig:"Œ",oelig:"œ",Ograve:"Ò",ograve:"ò",oline:"‾",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",oplus:"⊕",or:"∨",ordf:"ª",ordm:"º",Oslash:"Ø",oslash:"ø",Otilde:"Õ",otilde:"õ",otimes:"⊗",Ouml:"Ö",ouml:"ö",para:"¶",permil:"‰",perp:"⊥",Phi:"Φ",phi:"φ",Pi:"Π",pi:"π",piv:"ϖ",plusmn:"±",pound:"£",prime:"′",Prime:"″",prod:"∏",prop:"∝",Psi:"Ψ",psi:"ψ",quot:'"',radic:"√",rang:"⟩",raquo:"»",rarr:"→",rArr:"⇒",rceil:"⌉",rdquo:"”",real:"ℜ",reg:"®",rfloor:"⌋",Rho:"Ρ",rho:"ρ",rlm:"‏",rsaquo:"›",rsquo:"’",sbquo:"‚",Scaron:"Š",scaron:"š",sdot:"⋅",sect:"§",shy:"­",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sim:"∼",spades:"♠",sub:"⊂",sube:"⊆",sum:"∑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supe:"⊇",szlig:"ß",Tau:"Τ",tau:"τ",there4:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thinsp:" ",THORN:"Þ",thorn:"þ",tilde:"˜",times:"×",trade:"™",Uacute:"Ú",uacute:"ú",uarr:"↑",uArr:"⇑",Ucirc:"Û",ucirc:"û",Ugrave:"Ù",ugrave:"ù",uml:"¨",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",Uuml:"Ü",uuml:"ü",weierp:"℘",Xi:"Ξ",xi:"ξ",Yacute:"Ý",yacute:"ý",yen:"¥",yuml:"ÿ",Yuml:"Ÿ",Zeta:"Ζ",zeta:"ζ",zwj:"‍",zwnj:"‌"},NGSP_UNICODE="";NAMED_ENTITIES.ngsp=NGSP_UNICODE;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var _DEFAULT_TAG_DEFINITION,TAG_DEFINITIONS,HtmlTagDefinition=function(){function HtmlTagDefinition(_a){var _this=this,_b=void 0===_a?{}:_a,closedByChildren=_b.closedByChildren,implicitNamespacePrefix=_b.implicitNamespacePrefix,_c=_b.contentType,contentType=void 0===_c?TagContentType.PARSABLE_DATA:_c,_d=_b.closedByParent,closedByParent=void 0!==_d&&_d,_e=_b.isVoid,isVoid=void 0!==_e&&_e,_f=_b.ignoreFirstLf,ignoreFirstLf=void 0!==_f&&_f;this.closedByChildren={},this.closedByParent=!1,this.canSelfClose=!1,closedByChildren&&closedByChildren.length>0&&closedByChildren.forEach(function(tagName){return _this.closedByChildren[tagName]=!0}),this.isVoid=isVoid,this.closedByParent=closedByParent||isVoid,this.implicitNamespacePrefix=implicitNamespacePrefix||null,this.contentType=contentType,this.ignoreFirstLf=ignoreFirstLf}return HtmlTagDefinition.prototype.isClosedByChild=function(name){return this.isVoid||name.toLowerCase()in this.closedByChildren},HtmlTagDefinition}();function getHtmlTagDefinition(tagName){return TAG_DEFINITIONS||(_DEFAULT_TAG_DEFINITION=new HtmlTagDefinition,TAG_DEFINITIONS={base:new HtmlTagDefinition({isVoid:!0}),meta:new HtmlTagDefinition({isVoid:!0}),area:new HtmlTagDefinition({isVoid:!0}),embed:new HtmlTagDefinition({isVoid:!0}),link:new HtmlTagDefinition({isVoid:!0}),img:new HtmlTagDefinition({isVoid:!0}),input:new HtmlTagDefinition({isVoid:!0}),param:new HtmlTagDefinition({isVoid:!0}),hr:new HtmlTagDefinition({isVoid:!0}),br:new HtmlTagDefinition({isVoid:!0}),source:new HtmlTagDefinition({isVoid:!0}),track:new HtmlTagDefinition({isVoid:!0}),wbr:new HtmlTagDefinition({isVoid:!0}),p:new HtmlTagDefinition({closedByChildren:["address","article","aside","blockquote","div","dl","fieldset","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","main","nav","ol","p","pre","section","table","ul"],closedByParent:!0}),thead:new HtmlTagDefinition({closedByChildren:["tbody","tfoot"]}),tbody:new HtmlTagDefinition({closedByChildren:["tbody","tfoot"],closedByParent:!0}),tfoot:new HtmlTagDefinition({closedByChildren:["tbody"],closedByParent:!0}),tr:new HtmlTagDefinition({closedByChildren:["tr"],closedByParent:!0}),td:new HtmlTagDefinition({closedByChildren:["td","th"],closedByParent:!0}),th:new HtmlTagDefinition({closedByChildren:["td","th"],closedByParent:!0}),col:new HtmlTagDefinition({isVoid:!0}),svg:new HtmlTagDefinition({implicitNamespacePrefix:"svg"}),math:new HtmlTagDefinition({implicitNamespacePrefix:"math"}),li:new HtmlTagDefinition({closedByChildren:["li"],closedByParent:!0}),dt:new HtmlTagDefinition({closedByChildren:["dt","dd"]}),dd:new HtmlTagDefinition({closedByChildren:["dt","dd"],closedByParent:!0}),rb:new HtmlTagDefinition({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rt:new HtmlTagDefinition({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),rtc:new HtmlTagDefinition({closedByChildren:["rb","rtc","rp"],closedByParent:!0}),rp:new HtmlTagDefinition({closedByChildren:["rb","rt","rtc","rp"],closedByParent:!0}),optgroup:new HtmlTagDefinition({closedByChildren:["optgroup"],closedByParent:!0}),option:new HtmlTagDefinition({closedByChildren:["option","optgroup"],closedByParent:!0}),pre:new HtmlTagDefinition({ignoreFirstLf:!0}),listing:new HtmlTagDefinition({ignoreFirstLf:!0}),style:new HtmlTagDefinition({contentType:TagContentType.RAW_TEXT}),script:new HtmlTagDefinition({contentType:TagContentType.RAW_TEXT}),title:new HtmlTagDefinition({contentType:TagContentType.ESCAPABLE_RAW_TEXT}),textarea:new HtmlTagDefinition({contentType:TagContentType.ESCAPABLE_RAW_TEXT,ignoreFirstLf:!0})}),TAG_DEFINITIONS[tagName.toLowerCase()]||_DEFAULT_TAG_DEFINITION}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ViewEncapsulation,ChangeDetectionStrategy,_SELECTOR_REGEXP=new RegExp("(\\:not\\()|([-\\w]+)|(?:\\.([-\\w]+))|(?:\\[([-.\\w*]+)(?:=([\"']?)([^\\]\"']*)\\5)?\\])|(\\))|(\\s*,\\s*)","g"),CssSelector=function(){function CssSelector(){this.element=null,this.classNames=[],this.attrs=[],this.notSelectors=[]}return CssSelector.parse=function(selector){var match,results=[],_addResult=function(res,cssSel){cssSel.notSelectors.length>0&&!cssSel.element&&0==cssSel.classNames.length&&0==cssSel.attrs.length&&(cssSel.element="*"),res.push(cssSel)},cssSelector=new CssSelector,current=cssSelector,inNot=!1;for(_SELECTOR_REGEXP.lastIndex=0;match=_SELECTOR_REGEXP.exec(selector);){if(match[1]){Iif(inNot)throw new Error("Nesting :not is not allowed in a selector");inNot=!0,current=new CssSelector,cssSelector.notSelectors.push(current)}if(match[2]&&current.setElement(match[2]),match[3]&&current.addClassName(match[3]),match[4]&&current.addAttribute(match[4],match[6]),match[7]&&(inNot=!1,current=cssSelector),match[8]){Iif(inNot)throw new Error("Multiple selectors in :not are not supported");_addResult(results,cssSelector),cssSelector=current=new CssSelector}}return _addResult(results,cssSelector),results},CssSelector.prototype.isElementSelector=function(){return this.hasElementSelector()&&0==this.classNames.length&&0==this.attrs.length&&0===this.notSelectors.length},CssSelector.prototype.hasElementSelector=function(){return!!this.element},CssSelector.prototype.setElement=function(element){void 0===element&&(element=null),this.element=element},CssSelector.prototype.getMatchingElementTemplate=function(){for(var tagName=this.element||"div",classAttr=this.classNames.length>0?' class="'+this.classNames.join(" ")+'"':"",attrs="",i=0;i<this.attrs.length;i+=2){attrs+=" "+this.attrs[i]+(""!==this.attrs[i+1]?'="'+this.attrs[i+1]+'"':"")}return getHtmlTagDefinition(tagName).isVoid?"<"+tagName+classAttr+attrs+"/>":"<"+tagName+classAttr+attrs+"></"+tagName+">"},CssSelector.prototype.getAttrs=function(){var result=[];return this.classNames.length>0&&result.push("class",this.classNames.join(" ")),result.concat(this.attrs)},CssSelector.prototype.addAttribute=function(name,value){void 0===value&&(value=""),this.attrs.push(name,value&&value.toLowerCase()||"")},CssSelector.prototype.addClassName=function(name){this.classNames.push(name.toLowerCase())},CssSelector.prototype.toString=function(){var res=this.element||"";if(this.classNames&&this.classNames.forEach(function(klass){return res+="."+klass}),this.attrs)for(var i=0;i<this.attrs.length;i+=2){var name_1=this.attrs[i],value=this.attrs[i+1];res+="["+name_1+(value?"="+value:"")+"]"}return this.notSelectors.forEach(function(notSelector){return res+=":not("+notSelector+")"}),res},CssSelector}(),SelectorMatcher=function(){function SelectorMatcher(){this._elementMap=new Map,this._elementPartialMap=new Map,this._classMap=new Map,this._classPartialMap=new Map,this._attrValueMap=new Map,this._attrValuePartialMap=new Map,this._listContexts=[]}return SelectorMatcher.createNotMatcher=function(notSelectors){var notMatcher=new SelectorMatcher;return notMatcher.addSelectables(notSelectors,null),notMatcher},SelectorMatcher.prototype.addSelectables=function(cssSelectors,callbackCtxt){var listContext=null;cssSelectors.length>1&&(listContext=new SelectorListContext(cssSelectors),this._listContexts.push(listContext));for(var i=0;i<cssSelectors.length;i++)this._addSelectable(cssSelectors[i],callbackCtxt,listContext)},SelectorMatcher.prototype._addSelectable=function(cssSelector,callbackCtxt,listContext){var matcher=this,element=cssSelector.element,classNames=cssSelector.classNames,attrs=cssSelector.attrs,selectable=new SelectorContext(cssSelector,callbackCtxt,listContext);element&&((isTerminal=0===attrs.length&&0===classNames.length)?this._addTerminal(matcher._elementMap,element,selectable):matcher=this._addPartial(matcher._elementPartialMap,element));Eif(classNames)for(var i=0;i<classNames.length;i++){var isTerminal=0===attrs.length&&i===classNames.length-1,className=classNames[i];isTerminal?this._addTerminal(matcher._classMap,className,selectable):matcher=this._addPartial(matcher._classPartialMap,className)}Eif(attrs)for(i=0;i<attrs.length;i+=2){isTerminal=i===attrs.length-2;var name_2=attrs[i],value=attrs[i+1];if(isTerminal){var terminalMap=matcher._attrValueMap,terminalValuesMap=terminalMap.get(name_2);terminalValuesMap||(terminalValuesMap=new Map,terminalMap.set(name_2,terminalValuesMap)),this._addTerminal(terminalValuesMap,value,selectable)}else{var partialMap=matcher._attrValuePartialMap,partialValuesMap=partialMap.get(name_2);partialValuesMap||(partialValuesMap=new Map,partialMap.set(name_2,partialValuesMap)),matcher=this._addPartial(partialValuesMap,value)}}},SelectorMatcher.prototype._addTerminal=function(map,name,selectable){var terminalList=map.get(name);terminalList||(terminalList=[],map.set(name,terminalList)),terminalList.push(selectable)},SelectorMatcher.prototype._addPartial=function(map,name){var matcher=map.get(name);return matcher||(matcher=new SelectorMatcher,map.set(name,matcher)),matcher},SelectorMatcher.prototype.match=function(cssSelector,matchedCallback){for(var result=!1,element=cssSelector.element,classNames=cssSelector.classNames,attrs=cssSelector.attrs,i=0;i<this._listContexts.length;i++)this._listContexts[i].alreadyMatched=!1;Eif(result=this._matchTerminal(this._elementMap,element,cssSelector,matchedCallback)||result,result=this._matchPartial(this._elementPartialMap,element,cssSelector,matchedCallback)||result,classNames)for(i=0;i<classNames.length;i++){var className=classNames[i];result=this._matchTerminal(this._classMap,className,cssSelector,matchedCallback)||result,result=this._matchPartial(this._classPartialMap,className,cssSelector,matchedCallback)||result}Eif(attrs)for(i=0;i<attrs.length;i+=2){var name_3=attrs[i],value=attrs[i+1],terminalValuesMap=this._attrValueMap.get(name_3);value&&(result=this._matchTerminal(terminalValuesMap,"",cssSelector,matchedCallback)||result),result=this._matchTerminal(terminalValuesMap,value,cssSelector,matchedCallback)||result;var partialValuesMap=this._attrValuePartialMap.get(name_3);value&&(result=this._matchPartial(partialValuesMap,"",cssSelector,matchedCallback)||result),result=this._matchPartial(partialValuesMap,value,cssSelector,matchedCallback)||result}return result},SelectorMatcher.prototype._matchTerminal=function(map,name,cssSelector,matchedCallback){if(!map||"string"!=typeof name)return!1;var selectables=map.get(name)||[],starSelectables=map.get("*");if(starSelectables&&(selectables=selectables.concat(starSelectables)),0===selectables.length)return!1;for(var result=!1,i=0;i<selectables.length;i++)result=selectables[i].finalize(cssSelector,matchedCallback)||result;return result},SelectorMatcher.prototype._matchPartial=function(map,name,cssSelector,matchedCallback){if(!map||"string"!=typeof name)return!1;var nestedSelector=map.get(name);return!!nestedSelector&&nestedSelector.match(cssSelector,matchedCallback)},SelectorMatcher}(),SelectorListContext=function SelectorListContext(selectors){this.selectors=selectors,this.alreadyMatched=!1},SelectorContext=function(){function SelectorContext(selector,cbContext,listContext){this.selector=selector,this.cbContext=cbContext,this.listContext=listContext,this.notSelectors=selector.notSelectors}return SelectorContext.prototype.finalize=function(cssSelector,callback){var result=!0;!(this.notSelectors.length>0)||this.listContext&&this.listContext.alreadyMatched||(result=!SelectorMatcher.createNotMatcher(this.notSelectors).match(cssSelector,null));return!result||!callback||this.listContext&&this.listContext.alreadyMatched||(this.listContext&&(this.listContext.alreadyMatched=!0),callback(this.selector,this.cbContext)),result},SelectorContext}(),createInject=makeMetadataFactory("Inject",function(token){return{token:token}}),createInjectionToken=makeMetadataFactory("InjectionToken",function(desc){return{_desc:desc,ngInjectableDef:void 0}}),createAttribute=makeMetadataFactory("Attribute",function(attributeName){return{attributeName:attributeName}}),createContentChildren=makeMetadataFactory("ContentChildren",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!1,isViewQuery:!1,descendants:!1},data)}),createContentChild=makeMetadataFactory("ContentChild",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!0,isViewQuery:!1,descendants:!0},data)}),createViewChildren=makeMetadataFactory("ViewChildren",function(selector,data){return void 0===data&&(data={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!1,isViewQuery:!0,descendants:!0},data)}),createViewChild=makeMetadataFactory("ViewChild",function(selector,data){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({selector:selector,first:!0,isViewQuery:!0,descendants:!0},data)}),createDirective=makeMetadataFactory("Directive",function(dir){return void 0===dir&&(dir={}),dir});!function(ViewEncapsulation){ViewEncapsulation[ViewEncapsulation.Emulated=0]="Emulated",ViewEncapsulation[ViewEncapsulation.Native=1]="Native",ViewEncapsulation[ViewEncapsulation.None=2]="None",ViewEncapsulation[ViewEncapsulation.ShadowDom=3]="ShadowDom"}(ViewEncapsulation||(ViewEncapsulation={})),function(ChangeDetectionStrategy){ChangeDetectionStrategy[ChangeDetectionStrategy.OnPush=0]="OnPush",ChangeDetectionStrategy[ChangeDetectionStrategy.Default=1]="Default"}(ChangeDetectionStrategy||(ChangeDetectionStrategy={}));var SecurityContext,MissingTranslationStrategy,createComponent=makeMetadataFactory("Component",function(c){return void 0===c&&(c={}),Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({changeDetection:ChangeDetectionStrategy.Default},c)}),createPipe=makeMetadataFactory("Pipe",function(p){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({pure:!0},p)}),createInput=makeMetadataFactory("Input",function(bindingPropertyName){return{bindingPropertyName:bindingPropertyName}}),createOutput=makeMetadataFactory("Output",function(bindingPropertyName){return{bindingPropertyName:bindingPropertyName}}),createHostBinding=makeMetadataFactory("HostBinding",function(hostPropertyName){return{hostPropertyName:hostPropertyName}}),createHostListener=makeMetadataFactory("HostListener",function(eventName,args){return{eventName:eventName,args:args}}),createNgModule=makeMetadataFactory("NgModule",function(ngModule){return ngModule}),createInjectable=makeMetadataFactory("Injectable",function(injectable){return void 0===injectable&&(injectable={}),injectable}),CUSTOM_ELEMENTS_SCHEMA={name:"custom-elements"},NO_ERRORS_SCHEMA={name:"no-errors-schema"},createOptional=makeMetadataFactory("Optional"),createSelf=makeMetadataFactory("Self"),createSkipSelf=makeMetadataFactory("SkipSelf"),createHost=makeMetadataFactory("Host"),Type=Function;function makeMetadataFactory(name,props){function factory(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];var values=props?props.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(args)):{};return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({ngMetadataName:name},values)}return factory.isTypeOf=function(obj){return obj&&obj.ngMetadataName===name},factory.ngMetadataName=name,factory}function parserSelectorToR3Selector(selector){var positive=function parserSelectorToSimpleSelector(selector){var classes=selector.classNames&&selector.classNames.length?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([8],selector.classNames):[],elementName=selector.element&&"*"!==selector.element?selector.element:"";return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([elementName],selector.attrs,classes)}(selector),negative=selector.notSelectors&&selector.notSelectors.length?selector.notSelectors.map(function(notSelector){return function parserSelectorToNegativeSelector(selector){var classes=selector.classNames&&selector.classNames.length?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([8],selector.classNames):[];return selector.element?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([5,selector.element],selector.attrs,classes):selector.attrs.length?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([3],selector.attrs,classes):selector.classNames&&selector.classNames.length?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([9],selector.classNames):[]}(notSelector)}):[];return positive.concat.apply(positive,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(negative))}function parseSelectorToR3Selector(selector){return selector?CssSelector.parse(selector).map(parserSelectorToR3Selector):[]}!function(SecurityContext){SecurityContext[SecurityContext.NONE=0]="NONE",SecurityContext[SecurityContext.HTML=1]="HTML",SecurityContext[SecurityContext.STYLE=2]="STYLE",SecurityContext[SecurityContext.SCRIPT=3]="SCRIPT",SecurityContext[SecurityContext.URL=4]="URL",SecurityContext[SecurityContext.RESOURCE_URL=5]="RESOURCE_URL"}(SecurityContext||(SecurityContext={})),function(MissingTranslationStrategy){MissingTranslationStrategy[MissingTranslationStrategy.Error=0]="Error",MissingTranslationStrategy[MissingTranslationStrategy.Warning=1]="Warning",MissingTranslationStrategy[MissingTranslationStrategy.Ignore=2]="Ignore"}(MissingTranslationStrategy||(MissingTranslationStrategy={}));var TypeModifier;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(TypeModifier){TypeModifier[TypeModifier.Const=0]="Const"}(TypeModifier||(TypeModifier={}));var BuiltinTypeName,Type$1=function(){function Type(modifiers){void 0===modifiers&&(modifiers=null),this.modifiers=modifiers,modifiers||(this.modifiers=[])}return Type.prototype.hasModifier=function(modifier){return-1!==this.modifiers.indexOf(modifier)},Type}();!function(BuiltinTypeName){BuiltinTypeName[BuiltinTypeName.Dynamic=0]="Dynamic",BuiltinTypeName[BuiltinTypeName.Bool=1]="Bool",BuiltinTypeName[BuiltinTypeName.String=2]="String",BuiltinTypeName[BuiltinTypeName.Int=3]="Int",BuiltinTypeName[BuiltinTypeName.Number=4]="Number",BuiltinTypeName[BuiltinTypeName.Function=5]="Function",BuiltinTypeName[BuiltinTypeName.Inferred=6]="Inferred",BuiltinTypeName[BuiltinTypeName.None=7]="None"}(BuiltinTypeName||(BuiltinTypeName={}));var BinaryOperator,BuiltinType=function(_super){function BuiltinType(name,modifiers){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers)||this;return _this.name=name,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(BuiltinType,_super),BuiltinType.prototype.visitType=function(visitor,context){return visitor.visitBuiltinType(this,context)},BuiltinType}(Type$1),ExpressionType=function(_super){function ExpressionType(value,modifiers,typeParams){void 0===modifiers&&(modifiers=null),void 0===typeParams&&(typeParams=null);var _this=_super.call(this,modifiers)||this;return _this.value=value,_this.typeParams=typeParams,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ExpressionType,_super),ExpressionType.prototype.visitType=function(visitor,context){return visitor.visitExpressionType(this,context)},ExpressionType}(Type$1),ArrayType=function(_super){function ArrayType(of,modifiers){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers)||this;return _this.of=of,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ArrayType,_super),ArrayType.prototype.visitType=function(visitor,context){return visitor.visitArrayType(this,context)},ArrayType}(Type$1),MapType=function(_super){function MapType(valueType,modifiers){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers)||this;return _this.valueType=valueType||null,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(MapType,_super),MapType.prototype.visitType=function(visitor,context){return visitor.visitMapType(this,context)},MapType}(Type$1),DYNAMIC_TYPE=new BuiltinType(BuiltinTypeName.Dynamic),INFERRED_TYPE=new BuiltinType(BuiltinTypeName.Inferred),BOOL_TYPE=new BuiltinType(BuiltinTypeName.Bool),NUMBER_TYPE=(new BuiltinType(BuiltinTypeName.Int),new BuiltinType(BuiltinTypeName.Number)),NONE_TYPE=(new BuiltinType(BuiltinTypeName.String),new BuiltinType(BuiltinTypeName.Function),new BuiltinType(BuiltinTypeName.None));function nullSafeIsEquivalent(base,other){return null==base||null==other?base==other:base.isEquivalent(other)}function areAllEquivalent(base,other){var len=base.length;if(len!==other.length)return!1;for(var i=0;i<len;i++)if(!base[i].isEquivalent(other[i]))return!1;return!0}!function(BinaryOperator){BinaryOperator[BinaryOperator.Equals=0]="Equals",BinaryOperator[BinaryOperator.NotEquals=1]="NotEquals",BinaryOperator[BinaryOperator.Identical=2]="Identical",BinaryOperator[BinaryOperator.NotIdentical=3]="NotIdentical",BinaryOperator[BinaryOperator.Minus=4]="Minus",BinaryOperator[BinaryOperator.Plus=5]="Plus",BinaryOperator[BinaryOperator.Divide=6]="Divide",BinaryOperator[BinaryOperator.Multiply=7]="Multiply",BinaryOperator[BinaryOperator.Modulo=8]="Modulo",BinaryOperator[BinaryOperator.And=9]="And",BinaryOperator[BinaryOperator.Or=10]="Or",BinaryOperator[BinaryOperator.BitwiseAnd=11]="BitwiseAnd",BinaryOperator[BinaryOperator.Lower=12]="Lower",BinaryOperator[BinaryOperator.LowerEquals=13]="LowerEquals",BinaryOperator[BinaryOperator.Bigger=14]="Bigger",BinaryOperator[BinaryOperator.BiggerEquals=15]="BiggerEquals"}(BinaryOperator||(BinaryOperator={}));var BuiltinVar,Expression=function(){function Expression(type,sourceSpan){this.type=type||null,this.sourceSpan=sourceSpan||null}return Expression.prototype.prop=function(name,sourceSpan){return new ReadPropExpr(this,name,null,sourceSpan)},Expression.prototype.key=function(index,type,sourceSpan){return new ReadKeyExpr(this,index,type,sourceSpan)},Expression.prototype.callMethod=function(name,params,sourceSpan){return new InvokeMethodExpr(this,name,params,null,sourceSpan)},Expression.prototype.callFn=function(params,sourceSpan){return new InvokeFunctionExpr(this,params,null,sourceSpan)},Expression.prototype.instantiate=function(params,type,sourceSpan){return new InstantiateExpr(this,params,type,sourceSpan)},Expression.prototype.conditional=function(trueCase,falseCase,sourceSpan){return void 0===falseCase&&(falseCase=null),new ConditionalExpr(this,trueCase,falseCase,null,sourceSpan)},Expression.prototype.equals=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Equals,this,rhs,null,sourceSpan)},Expression.prototype.notEquals=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.NotEquals,this,rhs,null,sourceSpan)},Expression.prototype.identical=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Identical,this,rhs,null,sourceSpan)},Expression.prototype.notIdentical=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.NotIdentical,this,rhs,null,sourceSpan)},Expression.prototype.minus=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Minus,this,rhs,null,sourceSpan)},Expression.prototype.plus=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Plus,this,rhs,null,sourceSpan)},Expression.prototype.divide=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Divide,this,rhs,null,sourceSpan)},Expression.prototype.multiply=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Multiply,this,rhs,null,sourceSpan)},Expression.prototype.modulo=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Modulo,this,rhs,null,sourceSpan)},Expression.prototype.and=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.And,this,rhs,null,sourceSpan)},Expression.prototype.bitwiseAnd=function(rhs,sourceSpan,parens){return void 0===parens&&(parens=!0),new BinaryOperatorExpr(BinaryOperator.BitwiseAnd,this,rhs,null,sourceSpan,parens)},Expression.prototype.or=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Or,this,rhs,null,sourceSpan)},Expression.prototype.lower=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Lower,this,rhs,null,sourceSpan)},Expression.prototype.lowerEquals=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.LowerEquals,this,rhs,null,sourceSpan)},Expression.prototype.bigger=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.Bigger,this,rhs,null,sourceSpan)},Expression.prototype.biggerEquals=function(rhs,sourceSpan){return new BinaryOperatorExpr(BinaryOperator.BiggerEquals,this,rhs,null,sourceSpan)},Expression.prototype.isBlank=function(sourceSpan){return this.equals(TYPED_NULL_EXPR,sourceSpan)},Expression.prototype.cast=function(type,sourceSpan){return new CastExpr(this,type,sourceSpan)},Expression.prototype.toStmt=function(){return new ExpressionStatement(this,null)},Expression}();!function(BuiltinVar){BuiltinVar[BuiltinVar.This=0]="This",BuiltinVar[BuiltinVar.Super=1]="Super",BuiltinVar[BuiltinVar.CatchError=2]="CatchError",BuiltinVar[BuiltinVar.CatchStack=3]="CatchStack"}(BuiltinVar||(BuiltinVar={}));var BuiltinMethod,ReadVarExpr=function(_super){function ReadVarExpr(name,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return"string"==typeof name?(_this.name=name,_this.builtin=null):(_this.name=null,_this.builtin=name),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ReadVarExpr,_super),ReadVarExpr.prototype.isEquivalent=function(e){return e instanceof ReadVarExpr&&this.name===e.name&&this.builtin===e.builtin},ReadVarExpr.prototype.isConstant=function(){return!1},ReadVarExpr.prototype.visitExpression=function(visitor,context){return visitor.visitReadVarExpr(this,context)},ReadVarExpr.prototype.set=function(value){Iif(!this.name)throw new Error("Built in variable "+this.builtin+" can not be assigned to.");return new WriteVarExpr(this.name,value,null,this.sourceSpan)},ReadVarExpr}(Expression),TypeofExpr=function(_super){function TypeofExpr(expr,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.expr=expr,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TypeofExpr,_super),TypeofExpr.prototype.visitExpression=function(visitor,context){return visitor.visitTypeofExpr(this,context)},TypeofExpr.prototype.isEquivalent=function(e){return e instanceof TypeofExpr&&e.expr.isEquivalent(this.expr)},TypeofExpr.prototype.isConstant=function(){return this.expr.isConstant()},TypeofExpr}(Expression),WrappedNodeExpr=function(_super){function WrappedNodeExpr(node,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.node=node,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(WrappedNodeExpr,_super),WrappedNodeExpr.prototype.isEquivalent=function(e){return e instanceof WrappedNodeExpr&&this.node===e.node},WrappedNodeExpr.prototype.isConstant=function(){return!1},WrappedNodeExpr.prototype.visitExpression=function(visitor,context){return visitor.visitWrappedNodeExpr(this,context)},WrappedNodeExpr}(Expression),WriteVarExpr=function(_super){function WriteVarExpr(name,value,type,sourceSpan){var _this=_super.call(this,type||value.type,sourceSpan)||this;return _this.name=name,_this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(WriteVarExpr,_super),WriteVarExpr.prototype.isEquivalent=function(e){return e instanceof WriteVarExpr&&this.name===e.name&&this.value.isEquivalent(e.value)},WriteVarExpr.prototype.isConstant=function(){return!1},WriteVarExpr.prototype.visitExpression=function(visitor,context){return visitor.visitWriteVarExpr(this,context)},WriteVarExpr.prototype.toDeclStmt=function(type,modifiers){return new DeclareVarStmt(this.name,this.value,type,modifiers,this.sourceSpan)},WriteVarExpr.prototype.toConstDecl=function(){return this.toDeclStmt(INFERRED_TYPE,[StmtModifier.Final])},WriteVarExpr}(Expression),WriteKeyExpr=function(_super){function WriteKeyExpr(receiver,index,value,type,sourceSpan){var _this=_super.call(this,type||value.type,sourceSpan)||this;return _this.receiver=receiver,_this.index=index,_this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(WriteKeyExpr,_super),WriteKeyExpr.prototype.isEquivalent=function(e){return e instanceof WriteKeyExpr&&this.receiver.isEquivalent(e.receiver)&&this.index.isEquivalent(e.index)&&this.value.isEquivalent(e.value)},WriteKeyExpr.prototype.isConstant=function(){return!1},WriteKeyExpr.prototype.visitExpression=function(visitor,context){return visitor.visitWriteKeyExpr(this,context)},WriteKeyExpr}(Expression),WritePropExpr=function(_super){function WritePropExpr(receiver,name,value,type,sourceSpan){var _this=_super.call(this,type||value.type,sourceSpan)||this;return _this.receiver=receiver,_this.name=name,_this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(WritePropExpr,_super),WritePropExpr.prototype.isEquivalent=function(e){return e instanceof WritePropExpr&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name&&this.value.isEquivalent(e.value)},WritePropExpr.prototype.isConstant=function(){return!1},WritePropExpr.prototype.visitExpression=function(visitor,context){return visitor.visitWritePropExpr(this,context)},WritePropExpr}(Expression);!function(BuiltinMethod){BuiltinMethod[BuiltinMethod.ConcatArray=0]="ConcatArray",BuiltinMethod[BuiltinMethod.SubscribeObservable=1]="SubscribeObservable",BuiltinMethod[BuiltinMethod.Bind=2]="Bind"}(BuiltinMethod||(BuiltinMethod={}));var StmtModifier,InvokeMethodExpr=function(_super){function InvokeMethodExpr(receiver,method,args,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.receiver=receiver,_this.args=args,"string"==typeof method?(_this.name=method,_this.builtin=null):(_this.name=null,_this.builtin=method),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(InvokeMethodExpr,_super),InvokeMethodExpr.prototype.isEquivalent=function(e){return e instanceof InvokeMethodExpr&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name&&this.builtin===e.builtin&&areAllEquivalent(this.args,e.args)},InvokeMethodExpr.prototype.isConstant=function(){return!1},InvokeMethodExpr.prototype.visitExpression=function(visitor,context){return visitor.visitInvokeMethodExpr(this,context)},InvokeMethodExpr}(Expression),InvokeFunctionExpr=function(_super){function InvokeFunctionExpr(fn,args,type,sourceSpan,pure){void 0===pure&&(pure=!1);var _this=_super.call(this,type,sourceSpan)||this;return _this.fn=fn,_this.args=args,_this.pure=pure,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(InvokeFunctionExpr,_super),InvokeFunctionExpr.prototype.isEquivalent=function(e){return e instanceof InvokeFunctionExpr&&this.fn.isEquivalent(e.fn)&&areAllEquivalent(this.args,e.args)&&this.pure===e.pure},InvokeFunctionExpr.prototype.isConstant=function(){return!1},InvokeFunctionExpr.prototype.visitExpression=function(visitor,context){return visitor.visitInvokeFunctionExpr(this,context)},InvokeFunctionExpr}(Expression),InstantiateExpr=function(_super){function InstantiateExpr(classExpr,args,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.classExpr=classExpr,_this.args=args,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(InstantiateExpr,_super),InstantiateExpr.prototype.isEquivalent=function(e){return e instanceof InstantiateExpr&&this.classExpr.isEquivalent(e.classExpr)&&areAllEquivalent(this.args,e.args)},InstantiateExpr.prototype.isConstant=function(){return!1},InstantiateExpr.prototype.visitExpression=function(visitor,context){return visitor.visitInstantiateExpr(this,context)},InstantiateExpr}(Expression),LiteralExpr=function(_super){function LiteralExpr(value,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralExpr,_super),LiteralExpr.prototype.isEquivalent=function(e){return e instanceof LiteralExpr&&this.value===e.value},LiteralExpr.prototype.isConstant=function(){return!0},LiteralExpr.prototype.visitExpression=function(visitor,context){return visitor.visitLiteralExpr(this,context)},LiteralExpr}(Expression),ExternalExpr=function(_super){function ExternalExpr(value,type,typeParams,sourceSpan){void 0===typeParams&&(typeParams=null);var _this=_super.call(this,type,sourceSpan)||this;return _this.value=value,_this.typeParams=typeParams,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ExternalExpr,_super),ExternalExpr.prototype.isEquivalent=function(e){return e instanceof ExternalExpr&&this.value.name===e.value.name&&this.value.moduleName===e.value.moduleName&&this.value.runtime===e.value.runtime},ExternalExpr.prototype.isConstant=function(){return!1},ExternalExpr.prototype.visitExpression=function(visitor,context){return visitor.visitExternalExpr(this,context)},ExternalExpr}(Expression),ExternalReference=function ExternalReference(moduleName,name,runtime){this.moduleName=moduleName,this.name=name,this.runtime=runtime},ConditionalExpr=function(_super){function ConditionalExpr(condition,trueCase,falseCase,type,sourceSpan){void 0===falseCase&&(falseCase=null);var _this=_super.call(this,type||trueCase.type,sourceSpan)||this;return _this.condition=condition,_this.falseCase=falseCase,_this.trueCase=trueCase,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ConditionalExpr,_super),ConditionalExpr.prototype.isEquivalent=function(e){return e instanceof ConditionalExpr&&this.condition.isEquivalent(e.condition)&&this.trueCase.isEquivalent(e.trueCase)&&nullSafeIsEquivalent(this.falseCase,e.falseCase)},ConditionalExpr.prototype.isConstant=function(){return!1},ConditionalExpr.prototype.visitExpression=function(visitor,context){return visitor.visitConditionalExpr(this,context)},ConditionalExpr}(Expression),NotExpr=function(_super){function NotExpr(condition,sourceSpan){var _this=_super.call(this,BOOL_TYPE,sourceSpan)||this;return _this.condition=condition,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(NotExpr,_super),NotExpr.prototype.isEquivalent=function(e){return e instanceof NotExpr&&this.condition.isEquivalent(e.condition)},NotExpr.prototype.isConstant=function(){return!1},NotExpr.prototype.visitExpression=function(visitor,context){return visitor.visitNotExpr(this,context)},NotExpr}(Expression),AssertNotNull=function(_super){function AssertNotNull(condition,sourceSpan){var _this=_super.call(this,condition.type,sourceSpan)||this;return _this.condition=condition,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(AssertNotNull,_super),AssertNotNull.prototype.isEquivalent=function(e){return e instanceof AssertNotNull&&this.condition.isEquivalent(e.condition)},AssertNotNull.prototype.isConstant=function(){return!1},AssertNotNull.prototype.visitExpression=function(visitor,context){return visitor.visitAssertNotNullExpr(this,context)},AssertNotNull}(Expression),CastExpr=function(_super){function CastExpr(value,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(CastExpr,_super),CastExpr.prototype.isEquivalent=function(e){return e instanceof CastExpr&&this.value.isEquivalent(e.value)},CastExpr.prototype.isConstant=function(){return!1},CastExpr.prototype.visitExpression=function(visitor,context){return visitor.visitCastExpr(this,context)},CastExpr}(Expression),FnParam=function(){function FnParam(name,type){void 0===type&&(type=null),this.name=name,this.type=type}return FnParam.prototype.isEquivalent=function(param){return this.name===param.name},FnParam}(),FunctionExpr=function(_super){function FunctionExpr(params,statements,type,sourceSpan,name){var _this=_super.call(this,type,sourceSpan)||this;return _this.params=params,_this.statements=statements,_this.name=name,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(FunctionExpr,_super),FunctionExpr.prototype.isEquivalent=function(e){return e instanceof FunctionExpr&&areAllEquivalent(this.params,e.params)&&areAllEquivalent(this.statements,e.statements)},FunctionExpr.prototype.isConstant=function(){return!1},FunctionExpr.prototype.visitExpression=function(visitor,context){return visitor.visitFunctionExpr(this,context)},FunctionExpr.prototype.toDeclStmt=function(name,modifiers){return void 0===modifiers&&(modifiers=null),new DeclareFunctionStmt(name,this.params,this.statements,this.type,modifiers,this.sourceSpan)},FunctionExpr}(Expression),BinaryOperatorExpr=function(_super){function BinaryOperatorExpr(operator,lhs,rhs,type,sourceSpan,parens){void 0===parens&&(parens=!0);var _this=_super.call(this,type||lhs.type,sourceSpan)||this;return _this.operator=operator,_this.rhs=rhs,_this.parens=parens,_this.lhs=lhs,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(BinaryOperatorExpr,_super),BinaryOperatorExpr.prototype.isEquivalent=function(e){return e instanceof BinaryOperatorExpr&&this.operator===e.operator&&this.lhs.isEquivalent(e.lhs)&&this.rhs.isEquivalent(e.rhs)},BinaryOperatorExpr.prototype.isConstant=function(){return!1},BinaryOperatorExpr.prototype.visitExpression=function(visitor,context){return visitor.visitBinaryOperatorExpr(this,context)},BinaryOperatorExpr}(Expression),ReadPropExpr=function(_super){function ReadPropExpr(receiver,name,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.receiver=receiver,_this.name=name,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ReadPropExpr,_super),ReadPropExpr.prototype.isEquivalent=function(e){return e instanceof ReadPropExpr&&this.receiver.isEquivalent(e.receiver)&&this.name===e.name},ReadPropExpr.prototype.isConstant=function(){return!1},ReadPropExpr.prototype.visitExpression=function(visitor,context){return visitor.visitReadPropExpr(this,context)},ReadPropExpr.prototype.set=function(value){return new WritePropExpr(this.receiver,this.name,value,null,this.sourceSpan)},ReadPropExpr}(Expression),ReadKeyExpr=function(_super){function ReadKeyExpr(receiver,index,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.receiver=receiver,_this.index=index,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ReadKeyExpr,_super),ReadKeyExpr.prototype.isEquivalent=function(e){return e instanceof ReadKeyExpr&&this.receiver.isEquivalent(e.receiver)&&this.index.isEquivalent(e.index)},ReadKeyExpr.prototype.isConstant=function(){return!1},ReadKeyExpr.prototype.visitExpression=function(visitor,context){return visitor.visitReadKeyExpr(this,context)},ReadKeyExpr.prototype.set=function(value){return new WriteKeyExpr(this.receiver,this.index,value,null,this.sourceSpan)},ReadKeyExpr}(Expression),LiteralArrayExpr=function(_super){function LiteralArrayExpr(entries,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.entries=entries,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralArrayExpr,_super),LiteralArrayExpr.prototype.isConstant=function(){return this.entries.every(function(e){return e.isConstant()})},LiteralArrayExpr.prototype.isEquivalent=function(e){return e instanceof LiteralArrayExpr&&areAllEquivalent(this.entries,e.entries)},LiteralArrayExpr.prototype.visitExpression=function(visitor,context){return visitor.visitLiteralArrayExpr(this,context)},LiteralArrayExpr}(Expression),LiteralMapEntry=function(){function LiteralMapEntry(key,value,quoted){this.key=key,this.value=value,this.quoted=quoted}return LiteralMapEntry.prototype.isEquivalent=function(e){return this.key===e.key&&this.value.isEquivalent(e.value)},LiteralMapEntry}(),LiteralMapExpr=function(_super){function LiteralMapExpr(entries,type,sourceSpan){var _this=_super.call(this,type,sourceSpan)||this;return _this.entries=entries,_this.valueType=null,type&&(_this.valueType=type.valueType),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralMapExpr,_super),LiteralMapExpr.prototype.isEquivalent=function(e){return e instanceof LiteralMapExpr&&areAllEquivalent(this.entries,e.entries)},LiteralMapExpr.prototype.isConstant=function(){return this.entries.every(function(e){return e.value.isConstant()})},LiteralMapExpr.prototype.visitExpression=function(visitor,context){return visitor.visitLiteralMapExpr(this,context)},LiteralMapExpr}(Expression),CommaExpr=function(_super){function CommaExpr(parts,sourceSpan){var _this=_super.call(this,parts[parts.length-1].type,sourceSpan)||this;return _this.parts=parts,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(CommaExpr,_super),CommaExpr.prototype.isEquivalent=function(e){return e instanceof CommaExpr&&areAllEquivalent(this.parts,e.parts)},CommaExpr.prototype.isConstant=function(){return!1},CommaExpr.prototype.visitExpression=function(visitor,context){return visitor.visitCommaExpr(this,context)},CommaExpr}(Expression),NULL_EXPR=(new ReadVarExpr(BuiltinVar.This,null,null),new ReadVarExpr(BuiltinVar.Super,null,null),new ReadVarExpr(BuiltinVar.CatchError,null,null),new ReadVarExpr(BuiltinVar.CatchStack,null,null),new LiteralExpr(null,null,null)),TYPED_NULL_EXPR=new LiteralExpr(null,INFERRED_TYPE,null);!function(StmtModifier){StmtModifier[StmtModifier.Final=0]="Final",StmtModifier[StmtModifier.Private=1]="Private",StmtModifier[StmtModifier.Exported=2]="Exported",StmtModifier[StmtModifier.Static=3]="Static"}(StmtModifier||(StmtModifier={}));var Statement=function(){function Statement(modifiers,sourceSpan){this.modifiers=modifiers||[],this.sourceSpan=sourceSpan||null}return Statement.prototype.hasModifier=function(modifier){return-1!==this.modifiers.indexOf(modifier)},Statement}(),DeclareVarStmt=function(_super){function DeclareVarStmt(name,value,type,modifiers,sourceSpan){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers,sourceSpan)||this;return _this.name=name,_this.value=value,_this.type=type||value&&value.type||null,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(DeclareVarStmt,_super),DeclareVarStmt.prototype.isEquivalent=function(stmt){return stmt instanceof DeclareVarStmt&&this.name===stmt.name&&(this.value?!!stmt.value&&this.value.isEquivalent(stmt.value):!stmt.value)},DeclareVarStmt.prototype.visitStatement=function(visitor,context){return visitor.visitDeclareVarStmt(this,context)},DeclareVarStmt}(Statement),DeclareFunctionStmt=function(_super){function DeclareFunctionStmt(name,params,statements,type,modifiers,sourceSpan){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers,sourceSpan)||this;return _this.name=name,_this.params=params,_this.statements=statements,_this.type=type||null,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(DeclareFunctionStmt,_super),DeclareFunctionStmt.prototype.isEquivalent=function(stmt){return stmt instanceof DeclareFunctionStmt&&areAllEquivalent(this.params,stmt.params)&&areAllEquivalent(this.statements,stmt.statements)},DeclareFunctionStmt.prototype.visitStatement=function(visitor,context){return visitor.visitDeclareFunctionStmt(this,context)},DeclareFunctionStmt}(Statement),ExpressionStatement=function(_super){function ExpressionStatement(expr,sourceSpan){var _this=_super.call(this,null,sourceSpan)||this;return _this.expr=expr,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ExpressionStatement,_super),ExpressionStatement.prototype.isEquivalent=function(stmt){return stmt instanceof ExpressionStatement&&this.expr.isEquivalent(stmt.expr)},ExpressionStatement.prototype.visitStatement=function(visitor,context){return visitor.visitExpressionStmt(this,context)},ExpressionStatement}(Statement),ReturnStatement=function(_super){function ReturnStatement(value,sourceSpan){var _this=_super.call(this,null,sourceSpan)||this;return _this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ReturnStatement,_super),ReturnStatement.prototype.isEquivalent=function(stmt){return stmt instanceof ReturnStatement&&this.value.isEquivalent(stmt.value)},ReturnStatement.prototype.visitStatement=function(visitor,context){return visitor.visitReturnStmt(this,context)},ReturnStatement}(Statement),AbstractClassPart=function(){function AbstractClassPart(type,modifiers){this.modifiers=modifiers,modifiers||(this.modifiers=[]),this.type=type||null}return AbstractClassPart.prototype.hasModifier=function(modifier){return-1!==this.modifiers.indexOf(modifier)},AbstractClassPart}(),ClassField=function(_super){function ClassField(name,type,modifiers,initializer){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,type,modifiers)||this;return _this.name=name,_this.initializer=initializer,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ClassField,_super),ClassField.prototype.isEquivalent=function(f){return this.name===f.name},ClassField}(AbstractClassPart),ClassMethod=function(_super){function ClassMethod(name,params,body,type,modifiers){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,type,modifiers)||this;return _this.name=name,_this.params=params,_this.body=body,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ClassMethod,_super),ClassMethod.prototype.isEquivalent=function(m){return this.name===m.name&&areAllEquivalent(this.body,m.body)},ClassMethod}(AbstractClassPart),ClassGetter=function(_super){function ClassGetter(name,body,type,modifiers){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,type,modifiers)||this;return _this.name=name,_this.body=body,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ClassGetter,_super),ClassGetter.prototype.isEquivalent=function(m){return this.name===m.name&&areAllEquivalent(this.body,m.body)},ClassGetter}(AbstractClassPart),ClassStmt=function(_super){function ClassStmt(name,parent,fields,getters,constructorMethod,methods,modifiers,sourceSpan){void 0===modifiers&&(modifiers=null);var _this=_super.call(this,modifiers,sourceSpan)||this;return _this.name=name,_this.parent=parent,_this.fields=fields,_this.getters=getters,_this.constructorMethod=constructorMethod,_this.methods=methods,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ClassStmt,_super),ClassStmt.prototype.isEquivalent=function(stmt){return stmt instanceof ClassStmt&&this.name===stmt.name&&nullSafeIsEquivalent(this.parent,stmt.parent)&&areAllEquivalent(this.fields,stmt.fields)&&areAllEquivalent(this.getters,stmt.getters)&&this.constructorMethod.isEquivalent(stmt.constructorMethod)&&areAllEquivalent(this.methods,stmt.methods)},ClassStmt.prototype.visitStatement=function(visitor,context){return visitor.visitDeclareClassStmt(this,context)},ClassStmt}(Statement),IfStmt=function(_super){function IfStmt(condition,trueCase,falseCase,sourceSpan){void 0===falseCase&&(falseCase=[]);var _this=_super.call(this,null,sourceSpan)||this;return _this.condition=condition,_this.trueCase=trueCase,_this.falseCase=falseCase,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(IfStmt,_super),IfStmt.prototype.isEquivalent=function(stmt){return stmt instanceof IfStmt&&this.condition.isEquivalent(stmt.condition)&&areAllEquivalent(this.trueCase,stmt.trueCase)&&areAllEquivalent(this.falseCase,stmt.falseCase)},IfStmt.prototype.visitStatement=function(visitor,context){return visitor.visitIfStmt(this,context)},IfStmt}(Statement),JSDocCommentStmt=(function(_super){function CommentStmt(comment,multiline,sourceSpan){void 0===multiline&&(multiline=!1);var _this=_super.call(this,null,sourceSpan)||this;return _this.comment=comment,_this.multiline=multiline,_this}Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(CommentStmt,_super),CommentStmt.prototype.isEquivalent=function(stmt){return stmt instanceof CommentStmt},CommentStmt.prototype.visitStatement=function(visitor,context){return visitor.visitCommentStmt(this,context)}}(Statement),function(_super){function JSDocCommentStmt(tags,sourceSpan){void 0===tags&&(tags=[]);var _this=_super.call(this,null,sourceSpan)||this;return _this.tags=tags,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(JSDocCommentStmt,_super),JSDocCommentStmt.prototype.isEquivalent=function(stmt){return stmt instanceof JSDocCommentStmt&&this.toString()===stmt.toString()},JSDocCommentStmt.prototype.visitStatement=function(visitor,context){return visitor.visitJSDocCommentStmt(this,context)},JSDocCommentStmt.prototype.toString=function(){return function serializeTags(tags){var e_1,_a;if(0===tags.length)return"";var out="*\n";try{for(var tags_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(tags),tags_1_1=tags_1.next();!tags_1_1.done;tags_1_1=tags_1.next()){var tag=tags_1_1.value;out+=" *",out+=tagToString(tag).replace(/\n/g,"\n * "),out+="\n"}}catch(e_1_1){e_1={error:e_1_1}}finally{try{tags_1_1&&!tags_1_1.done&&(_a=tags_1.return)&&_a.call(tags_1)}finally{if(e_1)throw e_1.error}}return out+=" "}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(this.tags)},JSDocCommentStmt}(Statement)),TryCatchStmt=function(_super){function TryCatchStmt(bodyStmts,catchStmts,sourceSpan){var _this=_super.call(this,null,sourceSpan)||this;return _this.bodyStmts=bodyStmts,_this.catchStmts=catchStmts,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TryCatchStmt,_super),TryCatchStmt.prototype.isEquivalent=function(stmt){return stmt instanceof TryCatchStmt&&areAllEquivalent(this.bodyStmts,stmt.bodyStmts)&&areAllEquivalent(this.catchStmts,stmt.catchStmts)},TryCatchStmt.prototype.visitStatement=function(visitor,context){return visitor.visitTryCatchStmt(this,context)},TryCatchStmt}(Statement),ThrowStmt=function(_super){function ThrowStmt(error,sourceSpan){var _this=_super.call(this,null,sourceSpan)||this;return _this.error=error,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ThrowStmt,_super),ThrowStmt.prototype.isEquivalent=function(stmt){return stmt instanceof TryCatchStmt&&this.error.isEquivalent(stmt.error)},ThrowStmt.prototype.visitStatement=function(visitor,context){return visitor.visitThrowStmt(this,context)},ThrowStmt}(Statement),AstTransformer=function(){function AstTransformer(){}return AstTransformer.prototype.transformExpr=function(expr,context){return expr},AstTransformer.prototype.transformStmt=function(stmt,context){return stmt},AstTransformer.prototype.visitReadVarExpr=function(ast,context){return this.transformExpr(ast,context)},AstTransformer.prototype.visitWrappedNodeExpr=function(ast,context){return this.transformExpr(ast,context)},AstTransformer.prototype.visitTypeofExpr=function(expr,context){return this.transformExpr(new TypeofExpr(expr.expr.visitExpression(this,context),expr.type,expr.sourceSpan),context)},AstTransformer.prototype.visitWriteVarExpr=function(expr,context){return this.transformExpr(new WriteVarExpr(expr.name,expr.value.visitExpression(this,context),expr.type,expr.sourceSpan),context)},AstTransformer.prototype.visitWriteKeyExpr=function(expr,context){return this.transformExpr(new WriteKeyExpr(expr.receiver.visitExpression(this,context),expr.index.visitExpression(this,context),expr.value.visitExpression(this,context),expr.type,expr.sourceSpan),context)},AstTransformer.prototype.visitWritePropExpr=function(expr,context){return this.transformExpr(new WritePropExpr(expr.receiver.visitExpression(this,context),expr.name,expr.value.visitExpression(this,context),expr.type,expr.sourceSpan),context)},AstTransformer.prototype.visitInvokeMethodExpr=function(ast,context){var method=ast.builtin||ast.name;return this.transformExpr(new InvokeMethodExpr(ast.receiver.visitExpression(this,context),method,this.visitAllExpressions(ast.args,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitInvokeFunctionExpr=function(ast,context){return this.transformExpr(new InvokeFunctionExpr(ast.fn.visitExpression(this,context),this.visitAllExpressions(ast.args,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitInstantiateExpr=function(ast,context){return this.transformExpr(new InstantiateExpr(ast.classExpr.visitExpression(this,context),this.visitAllExpressions(ast.args,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitLiteralExpr=function(ast,context){return this.transformExpr(ast,context)},AstTransformer.prototype.visitExternalExpr=function(ast,context){return this.transformExpr(ast,context)},AstTransformer.prototype.visitConditionalExpr=function(ast,context){return this.transformExpr(new ConditionalExpr(ast.condition.visitExpression(this,context),ast.trueCase.visitExpression(this,context),ast.falseCase.visitExpression(this,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitNotExpr=function(ast,context){return this.transformExpr(new NotExpr(ast.condition.visitExpression(this,context),ast.sourceSpan),context)},AstTransformer.prototype.visitAssertNotNullExpr=function(ast,context){return this.transformExpr(new AssertNotNull(ast.condition.visitExpression(this,context),ast.sourceSpan),context)},AstTransformer.prototype.visitCastExpr=function(ast,context){return this.transformExpr(new CastExpr(ast.value.visitExpression(this,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitFunctionExpr=function(ast,context){return this.transformExpr(new FunctionExpr(ast.params,this.visitAllStatements(ast.statements,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitBinaryOperatorExpr=function(ast,context){return this.transformExpr(new BinaryOperatorExpr(ast.operator,ast.lhs.visitExpression(this,context),ast.rhs.visitExpression(this,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitReadPropExpr=function(ast,context){return this.transformExpr(new ReadPropExpr(ast.receiver.visitExpression(this,context),ast.name,ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitReadKeyExpr=function(ast,context){return this.transformExpr(new ReadKeyExpr(ast.receiver.visitExpression(this,context),ast.index.visitExpression(this,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitLiteralArrayExpr=function(ast,context){return this.transformExpr(new LiteralArrayExpr(this.visitAllExpressions(ast.entries,context),ast.type,ast.sourceSpan),context)},AstTransformer.prototype.visitLiteralMapExpr=function(ast,context){var _this=this,entries=ast.entries.map(function(entry){return new LiteralMapEntry(entry.key,entry.value.visitExpression(_this,context),entry.quoted)}),mapType=new MapType(ast.valueType,null);return this.transformExpr(new LiteralMapExpr(entries,mapType,ast.sourceSpan),context)},AstTransformer.prototype.visitCommaExpr=function(ast,context){return this.transformExpr(new CommaExpr(this.visitAllExpressions(ast.parts,context),ast.sourceSpan),context)},AstTransformer.prototype.visitAllExpressions=function(exprs,context){var _this=this;return exprs.map(function(expr){return expr.visitExpression(_this,context)})},AstTransformer.prototype.visitDeclareVarStmt=function(stmt,context){var value=stmt.value&&stmt.value.visitExpression(this,context);return this.transformStmt(new DeclareVarStmt(stmt.name,value,stmt.type,stmt.modifiers,stmt.sourceSpan),context)},AstTransformer.prototype.visitDeclareFunctionStmt=function(stmt,context){return this.transformStmt(new DeclareFunctionStmt(stmt.name,stmt.params,this.visitAllStatements(stmt.statements,context),stmt.type,stmt.modifiers,stmt.sourceSpan),context)},AstTransformer.prototype.visitExpressionStmt=function(stmt,context){return this.transformStmt(new ExpressionStatement(stmt.expr.visitExpression(this,context),stmt.sourceSpan),context)},AstTransformer.prototype.visitReturnStmt=function(stmt,context){return this.transformStmt(new ReturnStatement(stmt.value.visitExpression(this,context),stmt.sourceSpan),context)},AstTransformer.prototype.visitDeclareClassStmt=function(stmt,context){var _this=this,parent=stmt.parent.visitExpression(this,context),getters=stmt.getters.map(function(getter){return new ClassGetter(getter.name,_this.visitAllStatements(getter.body,context),getter.type,getter.modifiers)}),ctorMethod=stmt.constructorMethod&&new ClassMethod(stmt.constructorMethod.name,stmt.constructorMethod.params,this.visitAllStatements(stmt.constructorMethod.body,context),stmt.constructorMethod.type,stmt.constructorMethod.modifiers),methods=stmt.methods.map(function(method){return new ClassMethod(method.name,method.params,_this.visitAllStatements(method.body,context),method.type,method.modifiers)});return this.transformStmt(new ClassStmt(stmt.name,parent,stmt.fields,getters,ctorMethod,methods,stmt.modifiers,stmt.sourceSpan),context)},AstTransformer.prototype.visitIfStmt=function(stmt,context){return this.transformStmt(new IfStmt(stmt.condition.visitExpression(this,context),this.visitAllStatements(stmt.trueCase,context),this.visitAllStatements(stmt.falseCase,context),stmt.sourceSpan),context)},AstTransformer.prototype.visitTryCatchStmt=function(stmt,context){return this.transformStmt(new TryCatchStmt(this.visitAllStatements(stmt.bodyStmts,context),this.visitAllStatements(stmt.catchStmts,context),stmt.sourceSpan),context)},AstTransformer.prototype.visitThrowStmt=function(stmt,context){return this.transformStmt(new ThrowStmt(stmt.error.visitExpression(this,context),stmt.sourceSpan),context)},AstTransformer.prototype.visitCommentStmt=function(stmt,context){return this.transformStmt(stmt,context)},AstTransformer.prototype.visitJSDocCommentStmt=function(stmt,context){return this.transformStmt(stmt,context)},AstTransformer.prototype.visitAllStatements=function(stmts,context){var _this=this;return stmts.map(function(stmt){return stmt.visitStatement(_this,context)})},AstTransformer}(),RecursiveAstVisitor=function(){function RecursiveAstVisitor(){}return RecursiveAstVisitor.prototype.visitType=function(ast,context){return ast},RecursiveAstVisitor.prototype.visitExpression=function(ast,context){return ast.type&&ast.type.visitType(this,context),ast},RecursiveAstVisitor.prototype.visitBuiltinType=function(type,context){return this.visitType(type,context)},RecursiveAstVisitor.prototype.visitExpressionType=function(type,context){var _this=this;return type.value.visitExpression(this,context),null!==type.typeParams&&type.typeParams.forEach(function(param){return _this.visitType(param,context)}),this.visitType(type,context)},RecursiveAstVisitor.prototype.visitArrayType=function(type,context){return this.visitType(type,context)},RecursiveAstVisitor.prototype.visitMapType=function(type,context){return this.visitType(type,context)},RecursiveAstVisitor.prototype.visitWrappedNodeExpr=function(ast,context){return ast},RecursiveAstVisitor.prototype.visitTypeofExpr=function(ast,context){return this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitReadVarExpr=function(ast,context){return this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitWriteVarExpr=function(ast,context){return ast.value.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitWriteKeyExpr=function(ast,context){return ast.receiver.visitExpression(this,context),ast.index.visitExpression(this,context),ast.value.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitWritePropExpr=function(ast,context){return ast.receiver.visitExpression(this,context),ast.value.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitInvokeMethodExpr=function(ast,context){return ast.receiver.visitExpression(this,context),this.visitAllExpressions(ast.args,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitInvokeFunctionExpr=function(ast,context){return ast.fn.visitExpression(this,context),this.visitAllExpressions(ast.args,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitInstantiateExpr=function(ast,context){return ast.classExpr.visitExpression(this,context),this.visitAllExpressions(ast.args,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitLiteralExpr=function(ast,context){return this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitExternalExpr=function(ast,context){var _this=this;return ast.typeParams&&ast.typeParams.forEach(function(type){return type.visitType(_this,context)}),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitConditionalExpr=function(ast,context){return ast.condition.visitExpression(this,context),ast.trueCase.visitExpression(this,context),ast.falseCase.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitNotExpr=function(ast,context){return ast.condition.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitAssertNotNullExpr=function(ast,context){return ast.condition.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitCastExpr=function(ast,context){return ast.value.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitFunctionExpr=function(ast,context){return this.visitAllStatements(ast.statements,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitBinaryOperatorExpr=function(ast,context){return ast.lhs.visitExpression(this,context),ast.rhs.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitReadPropExpr=function(ast,context){return ast.receiver.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitReadKeyExpr=function(ast,context){return ast.receiver.visitExpression(this,context),ast.index.visitExpression(this,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitLiteralArrayExpr=function(ast,context){return this.visitAllExpressions(ast.entries,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitLiteralMapExpr=function(ast,context){var _this=this;return ast.entries.forEach(function(entry){return entry.value.visitExpression(_this,context)}),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitCommaExpr=function(ast,context){return this.visitAllExpressions(ast.parts,context),this.visitExpression(ast,context)},RecursiveAstVisitor.prototype.visitAllExpressions=function(exprs,context){var _this=this;exprs.forEach(function(expr){return expr.visitExpression(_this,context)})},RecursiveAstVisitor.prototype.visitDeclareVarStmt=function(stmt,context){return stmt.value&&stmt.value.visitExpression(this,context),stmt.type&&stmt.type.visitType(this,context),stmt},RecursiveAstVisitor.prototype.visitDeclareFunctionStmt=function(stmt,context){return this.visitAllStatements(stmt.statements,context),stmt.type&&stmt.type.visitType(this,context),stmt},RecursiveAstVisitor.prototype.visitExpressionStmt=function(stmt,context){return stmt.expr.visitExpression(this,context),stmt},RecursiveAstVisitor.prototype.visitReturnStmt=function(stmt,context){return stmt.value.visitExpression(this,context),stmt},RecursiveAstVisitor.prototype.visitDeclareClassStmt=function(stmt,context){var _this=this;return stmt.parent.visitExpression(this,context),stmt.getters.forEach(function(getter){return _this.visitAllStatements(getter.body,context)}),stmt.constructorMethod&&this.visitAllStatements(stmt.constructorMethod.body,context),stmt.methods.forEach(function(method){return _this.visitAllStatements(method.body,context)}),stmt},RecursiveAstVisitor.prototype.visitIfStmt=function(stmt,context){return stmt.condition.visitExpression(this,context),this.visitAllStatements(stmt.trueCase,context),this.visitAllStatements(stmt.falseCase,context),stmt},RecursiveAstVisitor.prototype.visitTryCatchStmt=function(stmt,context){return this.visitAllStatements(stmt.bodyStmts,context),this.visitAllStatements(stmt.catchStmts,context),stmt},RecursiveAstVisitor.prototype.visitThrowStmt=function(stmt,context){return stmt.error.visitExpression(this,context),stmt},RecursiveAstVisitor.prototype.visitCommentStmt=function(stmt,context){return stmt},RecursiveAstVisitor.prototype.visitJSDocCommentStmt=function(stmt,context){return stmt},RecursiveAstVisitor.prototype.visitAllStatements=function(stmts,context){var _this=this;stmts.forEach(function(stmt){return stmt.visitStatement(_this,context)})},RecursiveAstVisitor}();function findReadVarNames(stmts){var visitor=new _ReadVarVisitor;return visitor.visitAllStatements(stmts,null),visitor.varNames}var _ReadVarVisitor=function(_super){function _ReadVarVisitor(){var _this=null!==_super&&_super.apply(this,arguments)||this;return _this.varNames=new Set,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_ReadVarVisitor,_super),_ReadVarVisitor.prototype.visitDeclareFunctionStmt=function(stmt,context){return stmt},_ReadVarVisitor.prototype.visitDeclareClassStmt=function(stmt,context){return stmt},_ReadVarVisitor.prototype.visitReadVarExpr=function(ast,context){return ast.name&&this.varNames.add(ast.name),null},_ReadVarVisitor}(RecursiveAstVisitor);!function(_super){function _FindExternalReferencesVisitor(){var _this=null!==_super&&_super.apply(this,arguments)||this;return _this.externalReferences=[],_this}Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_FindExternalReferencesVisitor,_super),_FindExternalReferencesVisitor.prototype.visitExternalExpr=function(e,context){return this.externalReferences.push(e.value),_super.prototype.visitExternalExpr.call(this,e,context)}}(RecursiveAstVisitor);function applySourceSpanToStatementIfNeeded(stmt,sourceSpan){Iif(!sourceSpan)return stmt;var transformer=new _ApplySourceSpanTransformer(sourceSpan);return stmt.visitStatement(transformer,null)}function applySourceSpanToExpressionIfNeeded(expr,sourceSpan){if(!sourceSpan)return expr;var transformer=new _ApplySourceSpanTransformer(sourceSpan);return expr.visitExpression(transformer,null)}var _ApplySourceSpanTransformer=function(_super){function _ApplySourceSpanTransformer(sourceSpan){var _this=_super.call(this)||this;return _this.sourceSpan=sourceSpan,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_ApplySourceSpanTransformer,_super),_ApplySourceSpanTransformer.prototype._clone=function(obj){var clone=Object.create(obj.constructor.prototype);for(var prop in obj)clone[prop]=obj[prop];return clone},_ApplySourceSpanTransformer.prototype.transformExpr=function(expr,context){return expr.sourceSpan||((expr=this._clone(expr)).sourceSpan=this.sourceSpan),expr},_ApplySourceSpanTransformer.prototype.transformStmt=function(stmt,context){return stmt.sourceSpan||((stmt=this._clone(stmt)).sourceSpan=this.sourceSpan),stmt},_ApplySourceSpanTransformer}(AstTransformer);function variable(name,type,sourceSpan){return new ReadVarExpr(name,type,sourceSpan)}function importExpr(id,typeParams,sourceSpan){return void 0===typeParams&&(typeParams=null),new ExternalExpr(id,null,typeParams,sourceSpan)}function importType(id,typeParams,typeModifiers){return void 0===typeParams&&(typeParams=null),void 0===typeModifiers&&(typeModifiers=null),null!=id?expressionType(importExpr(id,typeParams,null),typeModifiers):null}function expressionType(expr,typeModifiers,typeParams){return void 0===typeModifiers&&(typeModifiers=null),void 0===typeParams&&(typeParams=null),new ExpressionType(expr,typeModifiers,typeParams)}function literalArr(values,type,sourceSpan){return new LiteralArrayExpr(values,type,sourceSpan)}function literalMap(values,type){return void 0===type&&(type=null),new LiteralMapExpr(values.map(function(e){return new LiteralMapEntry(e.key,e.value,e.quoted)}),type,null)}function fn(params,body,type,sourceSpan,name){return new FunctionExpr(params,body,type,sourceSpan,name)}function ifStmt(condition,thenClause,elseClause){return new IfStmt(condition,thenClause,elseClause)}function literal(value,type,sourceSpan){return new LiteralExpr(value,type,sourceSpan)}function tagToString(tag){var out="";if(tag.tagName&&(out+=" @"+tag.tagName),tag.text){if(tag.text.match(/\/\*|\*\//))throw new Error('JSDoc text cannot contain "/*" and "*/"');out+=" "+tag.text.replace(/@/g,"\\@")}return out}var DASH_CASE_REGEXP=/-+([a-z0-9])/g;function splitAtColon(input,defaultValues){return _splitAt(input,":",defaultValues)}function _splitAt(input,character,defaultValues){var characterIndex=input.indexOf(character);return-1==characterIndex?defaultValues:[input.slice(0,characterIndex).trim(),input.slice(characterIndex+1).trim()]}function visitValue(value,visitor,context){return Array.isArray(value)?visitor.visitArray(value,context):function isStrictStringMap(obj){return"object"==typeof obj&&null!==obj&&Object.getPrototypeOf(obj)===STRING_MAP_PROTO}(value)?visitor.visitStringMap(value,context):null==value||"string"==typeof value||"number"==typeof value||"boolean"==typeof value?visitor.visitPrimitive(value,context):visitor.visitOther(value,context)}function isDefined(val){return null!=val}function noUndefined(val){return void 0===val?null:val}var ValueTransformer=function(){function ValueTransformer(){}return ValueTransformer.prototype.visitArray=function(arr,context){var _this=this;return arr.map(function(value){return visitValue(value,_this,context)})},ValueTransformer.prototype.visitStringMap=function(map,context){var _this=this,result={};return Object.keys(map).forEach(function(key){result[key]=visitValue(map[key],_this,context)}),result},ValueTransformer.prototype.visitPrimitive=function(value,context){return value},ValueTransformer.prototype.visitOther=function(value,context){return value},ValueTransformer}(),SyncAsync_assertSync=function(value){if(isPromise(value))throw new Error("Illegal state: value cannot be a promise");return value},SyncAsync_then=function(value,cb){return isPromise(value)?value.then(cb):cb(value)},SyncAsync_all=function(syncAsyncValues){return syncAsyncValues.some(isPromise)?Promise.all(syncAsyncValues):syncAsyncValues};function error(msg){throw new Error("Internal Error: "+msg)}function syntaxError(msg,parseErrors){var error=Error(msg);return error[ERROR_SYNTAX_ERROR]=!0,parseErrors&&(error[ERROR_PARSE_ERRORS]=parseErrors),error}var ERROR_SYNTAX_ERROR="ngSyntaxError",ERROR_PARSE_ERRORS="ngParseErrors";function escapeRegExp(s){return s.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}var STRING_MAP_PROTO=Object.getPrototypeOf({});function utf8Encode(str){for(var encoded="",index=0;index<str.length;index++){var codePoint=str.charCodeAt(index);if(codePoint>=55296&&codePoint<=56319&&str.length>index+1){var low=str.charCodeAt(index+1);low>=56320&&low<=57343&&(index++,codePoint=(codePoint-55296<<10)+low-56320+65536)}codePoint<=127?encoded+=String.fromCharCode(codePoint):codePoint<=2047?encoded+=String.fromCharCode(codePoint>>6&31|192,63&codePoint|128):codePoint<=65535?encoded+=String.fromCharCode(codePoint>>12|224,codePoint>>6&63|128,63&codePoint|128):codePoint<=2097151&&(encoded+=String.fromCharCode(codePoint>>18&7|240,codePoint>>12&63|128,codePoint>>6&63|128,63&codePoint|128))}return encoded}function stringify(token){Iif("string"==typeof token)return token;Iif(token instanceof Array)return"["+token.map(stringify).join(", ")+"]";Iif(null==token)return""+token;if(token.overriddenName)return""+token.overriddenName;if(token.name)return""+token.name;var res=token.toString();Iif(null==res)return""+res;var newLineIndex=res.indexOf("\n");return-1===newLineIndex?res:res.substring(0,newLineIndex)}function resolveForwardRef(type){return"function"==typeof type&&type.hasOwnProperty("__forward_ref__")?type():type}function isPromise(obj){return!!obj&&"function"==typeof obj.then}var Version=function Version(full){this.full=full;var splits=full.split(".");this.major=splits[0],this.minor=splits[1],this.patch=splits.slice(2).join(".")},__window="undefined"!=typeof window&&window,__self="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,_global=void 0!==global&&global||__window||__self,KEY_CONTEXT={},FixupExpression=function(_super){function FixupExpression(resolved){var _this=_super.call(this,resolved.type)||this;return _this.resolved=resolved,_this.original=resolved,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(FixupExpression,_super),FixupExpression.prototype.visitExpression=function(visitor,context){return context===KEY_CONTEXT?this.original.visitExpression(visitor,context):this.resolved.visitExpression(visitor,context)},FixupExpression.prototype.isEquivalent=function(e){return e instanceof FixupExpression&&this.resolved.isEquivalent(e.resolved)},FixupExpression.prototype.isConstant=function(){return!0},FixupExpression.prototype.fixup=function(expression){this.resolved=expression,this.shared=!0},FixupExpression}(Expression),ConstantPool=function(){function ConstantPool(){this.statements=[],this.literals=new Map,this.literalFactories=new Map,this.injectorDefinitions=new Map,this.directiveDefinitions=new Map,this.componentDefinitions=new Map,this.pipeDefinitions=new Map,this.nextNameIndex=0}return ConstantPool.prototype.getConstLiteral=function(literal,forceShared){if(literal instanceof LiteralExpr||literal instanceof FixupExpression)return literal;var key=this.keyOf(literal),fixup=this.literals.get(key),newValue=!1;if(fixup||(fixup=new FixupExpression(literal),this.literals.set(key,fixup),newValue=!0),!newValue&&!fixup.shared||newValue&&forceShared){var name_1=this.freshName();this.statements.push(variable(name_1).set(literal).toDeclStmt(INFERRED_TYPE,[StmtModifier.Final])),fixup.fixup(variable(name_1))}return fixup},ConstantPool.prototype.getDefinition=function(type,kind,ctx,forceShared){void 0===forceShared&&(forceShared=!1);var definitions=this.definitionsOf(kind),fixup=definitions.get(type),newValue=!1;if(!fixup){var property=this.propertyNameOf(kind);fixup=new FixupExpression(ctx.importExpr(type).prop(property)),definitions.set(type,fixup),newValue=!0}if(!newValue&&!fixup.shared||newValue&&forceShared){var name_2=this.freshName();this.statements.push(variable(name_2).set(fixup.resolved).toDeclStmt(INFERRED_TYPE,[StmtModifier.Final])),fixup.fixup(variable(name_2))}return fixup},ConstantPool.prototype.getLiteralFactory=function(literal$1){if(literal$1 instanceof LiteralArrayExpr){var argumentsForKey=literal$1.entries.map(function(e){return e.isConstant()?e:literal(null)}),key=this.keyOf(literalArr(argumentsForKey));return this._getLiteralFactory(key,literal$1.entries,function(entries){return literalArr(entries)})}var expressionForKey=literalMap(literal$1.entries.map(function(e){return{key:e.key,value:e.value.isConstant()?e.value:literal(null),quoted:e.quoted}}));key=this.keyOf(expressionForKey);return this._getLiteralFactory(key,literal$1.entries.map(function(e){return e.value}),function(entries){return literalMap(entries.map(function(value,index){return{key:literal$1.entries[index].key,value:value,quoted:literal$1.entries[index].quoted}}))})},ConstantPool.prototype._getLiteralFactory=function(key,values,resultMap){var _this=this,literalFactory=this.literalFactories.get(key),literalFactoryArguments=values.filter(function(e){return!e.isConstant()});if(!literalFactory){var resultExpressions=values.map(function(e,index){return e.isConstant()?_this.getConstLiteral(e,!0):variable("a"+index)}),pureFunctionDeclaration=fn(resultExpressions.filter(isVariable).map(function(e){return new FnParam(e.name,DYNAMIC_TYPE)}),[new ReturnStatement(resultMap(resultExpressions))],INFERRED_TYPE),name_3=this.freshName();this.statements.push(variable(name_3).set(pureFunctionDeclaration).toDeclStmt(INFERRED_TYPE,[StmtModifier.Final])),literalFactory=variable(name_3),this.literalFactories.set(key,literalFactory)}return{literalFactory:literalFactory,literalFactoryArguments:literalFactoryArguments}},ConstantPool.prototype.uniqueName=function(prefix){return""+prefix+this.nextNameIndex++},ConstantPool.prototype.definitionsOf=function(kind){switch(kind){case 2:return this.componentDefinitions;case 1:return this.directiveDefinitions;case 0:return this.injectorDefinitions;case 3:return this.pipeDefinitions}return error("Unknown definition kind "+kind),this.componentDefinitions},ConstantPool.prototype.propertyNameOf=function(kind){switch(kind){case 2:return"ngComponentDef";case 1:return"ngDirectiveDef";case 0:return"ngInjectorDef";case 3:return"ngPipeDef"}return error("Unknown definition kind "+kind),"<unknown>"},ConstantPool.prototype.freshName=function(){return this.uniqueName("_c")},ConstantPool.prototype.keyOf=function(expression){return expression.visitExpression(new KeyVisitor,KEY_CONTEXT)},ConstantPool}(),KeyVisitor=function(){function KeyVisitor(){this.visitWrappedNodeExpr=invalid,this.visitWriteVarExpr=invalid,this.visitWriteKeyExpr=invalid,this.visitWritePropExpr=invalid,this.visitInvokeMethodExpr=invalid,this.visitInvokeFunctionExpr=invalid,this.visitInstantiateExpr=invalid,this.visitConditionalExpr=invalid,this.visitNotExpr=invalid,this.visitAssertNotNullExpr=invalid,this.visitCastExpr=invalid,this.visitFunctionExpr=invalid,this.visitBinaryOperatorExpr=invalid,this.visitReadPropExpr=invalid,this.visitReadKeyExpr=invalid,this.visitCommaExpr=invalid}return KeyVisitor.prototype.visitLiteralExpr=function(ast){return""+("string"==typeof ast.value?'"'+ast.value+'"':ast.value)},KeyVisitor.prototype.visitLiteralArrayExpr=function(ast,context){var _this=this;return"["+ast.entries.map(function(entry){return entry.visitExpression(_this,context)}).join(",")+"]"},KeyVisitor.prototype.visitLiteralMapExpr=function(ast,context){var _this=this;return"{"+ast.entries.map(function(entry){return function(entry){var quote=entry.quoted?'"':"";return""+quote+entry.key+quote}(entry)+":"+entry.value.visitExpression(_this,context)}).join(",")},KeyVisitor.prototype.visitExternalExpr=function(ast){return ast.value.moduleName?"EX:"+ast.value.moduleName+":"+ast.value.name:"EX:"+ast.value.runtime.name},KeyVisitor.prototype.visitReadVarExpr=function(node){return"VAR:"+node.name},KeyVisitor.prototype.visitTypeofExpr=function(node,context){return"TYPEOF:"+node.expr.visitExpression(this,context)},KeyVisitor}();function invalid(arg){throw new Error("Invalid state: Visitor "+this.constructor.name+" doesn't handle "+arg.constructor.name)}function isVariable(e){return e instanceof ReadVarExpr}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var CORE="@angular/core",Identifiers=function(){function Identifiers(){}return Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS={name:"ANALYZE_FOR_ENTRY_COMPONENTS",moduleName:CORE},Identifiers.ElementRef={name:"ElementRef",moduleName:CORE},Identifiers.NgModuleRef={name:"NgModuleRef",moduleName:CORE},Identifiers.ViewContainerRef={name:"ViewContainerRef",moduleName:CORE},Identifiers.ChangeDetectorRef={name:"ChangeDetectorRef",moduleName:CORE},Identifiers.QueryList={name:"QueryList",moduleName:CORE},Identifiers.TemplateRef={name:"TemplateRef",moduleName:CORE},Identifiers.Renderer2={name:"Renderer2",moduleName:CORE},Identifiers.CodegenComponentFactoryResolver={name:"ɵCodegenComponentFactoryResolver",moduleName:CORE},Identifiers.ComponentFactoryResolver={name:"ComponentFactoryResolver",moduleName:CORE},Identifiers.ComponentFactory={name:"ComponentFactory",moduleName:CORE},Identifiers.ComponentRef={name:"ComponentRef",moduleName:CORE},Identifiers.NgModuleFactory={name:"NgModuleFactory",moduleName:CORE},Identifiers.createModuleFactory={name:"ɵcmf",moduleName:CORE},Identifiers.moduleDef={name:"ɵmod",moduleName:CORE},Identifiers.moduleProviderDef={name:"ɵmpd",moduleName:CORE},Identifiers.RegisterModuleFactoryFn={name:"ɵregisterModuleFactory",moduleName:CORE},Identifiers.inject={name:"ɵɵinject",moduleName:CORE},Identifiers.INJECTOR={name:"INJECTOR",moduleName:CORE},Identifiers.Injector={name:"Injector",moduleName:CORE},Identifiers.ɵɵdefineInjectable={name:"ɵɵdefineInjectable",moduleName:CORE},Identifiers.InjectableDef={name:"ɵɵInjectableDef",moduleName:CORE},Identifiers.ViewEncapsulation={name:"ViewEncapsulation",moduleName:CORE},Identifiers.ChangeDetectionStrategy={name:"ChangeDetectionStrategy",moduleName:CORE},Identifiers.SecurityContext={name:"SecurityContext",moduleName:CORE},Identifiers.LOCALE_ID={name:"LOCALE_ID",moduleName:CORE},Identifiers.TRANSLATIONS_FORMAT={name:"TRANSLATIONS_FORMAT",moduleName:CORE},Identifiers.inlineInterpolate={name:"ɵinlineInterpolate",moduleName:CORE},Identifiers.interpolate={name:"ɵinterpolate",moduleName:CORE},Identifiers.EMPTY_ARRAY={name:"ɵEMPTY_ARRAY",moduleName:CORE},Identifiers.EMPTY_MAP={name:"ɵEMPTY_MAP",moduleName:CORE},Identifiers.Renderer={name:"Renderer",moduleName:CORE},Identifiers.viewDef={name:"ɵvid",moduleName:CORE},Identifiers.elementDef={name:"ɵeld",moduleName:CORE},Identifiers.anchorDef={name:"ɵand",moduleName:CORE},Identifiers.textDef={name:"ɵted",moduleName:CORE},Identifiers.directiveDef={name:"ɵdid",moduleName:CORE},Identifiers.providerDef={name:"ɵprd",moduleName:CORE},Identifiers.queryDef={name:"ɵqud",moduleName:CORE},Identifiers.pureArrayDef={name:"ɵpad",moduleName:CORE},Identifiers.pureObjectDef={name:"ɵpod",moduleName:CORE},Identifiers.purePipeDef={name:"ɵppd",moduleName:CORE},Identifiers.pipeDef={name:"ɵpid",moduleName:CORE},Identifiers.nodeValue={name:"ɵnov",moduleName:CORE},Identifiers.ngContentDef={name:"ɵncd",moduleName:CORE},Identifiers.unwrapValue={name:"ɵunv",moduleName:CORE},Identifiers.createRendererType2={name:"ɵcrt",moduleName:CORE},Identifiers.RendererType2={name:"RendererType2",moduleName:CORE},Identifiers.ViewDefinition={name:"ɵViewDefinition",moduleName:CORE},Identifiers.createComponentFactory={name:"ɵccf",moduleName:CORE},Identifiers.setClassMetadata={name:"ɵsetClassMetadata",moduleName:CORE},Identifiers}();function createTokenForReference(reference){return{identifier:{reference:reference}}}function createTokenForExternalReference(reflector,reference){return createTokenForReference(reflector.resolveExternalReference(reference))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var StaticSymbol=function(){function StaticSymbol(filePath,name,members){this.filePath=filePath,this.name=name,this.members=members}return StaticSymbol.prototype.assertNoMembers=function(){if(this.members.length)throw new Error("Illegal state: symbol without members expected, but got "+JSON.stringify(this)+".")},StaticSymbol}(),StaticSymbolCache=function(){function StaticSymbolCache(){this.cache=new Map}return StaticSymbolCache.prototype.get=function(declarationFile,name,members){var key='"'+declarationFile+'".'+name+((members=members||[]).length?"."+members.join("."):""),result=this.cache.get(key);return result||(result=new StaticSymbol(declarationFile,name,members),this.cache.set(key,result)),result},StaticSymbolCache}(),HOST_REG_EXP=/^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))|(\@[-\w]+)$/;function sanitizeIdentifier(name){return name.replace(/\W/g,"_")}var CompileSummaryKind,_anonymousTypeIndex=0;function identifierName(compileIdentifier){if(!compileIdentifier||!compileIdentifier.reference)return null;var ref=compileIdentifier.reference;Iif(ref instanceof StaticSymbol)return ref.name;Iif(ref.__anonymousType)return ref.__anonymousType;var identifier=stringify(ref);return identifier.indexOf("(")>=0?(identifier="anonymous_"+_anonymousTypeIndex++,ref.__anonymousType=identifier):identifier=sanitizeIdentifier(identifier),identifier}function identifierModuleUrl(compileIdentifier){var ref=compileIdentifier.reference;return ref instanceof StaticSymbol?ref.filePath:"./"+stringify(ref)}function viewClassName(compType,embeddedTemplateIndex){return"View_"+identifierName({reference:compType})+"_"+embeddedTemplateIndex}function rendererTypeName(compType){return"RenderType_"+identifierName({reference:compType})}function componentFactoryName(compType){return identifierName({reference:compType})+"NgFactory"}function tokenName(token){return null!=token.value?sanitizeIdentifier(token.value):identifierName(token.identifier)}function tokenReference(token){return null!=token.identifier?token.identifier.reference:token.value}!function(CompileSummaryKind){CompileSummaryKind[CompileSummaryKind.Pipe=0]="Pipe",CompileSummaryKind[CompileSummaryKind.Directive=1]="Directive",CompileSummaryKind[CompileSummaryKind.NgModule=2]="NgModule",CompileSummaryKind[CompileSummaryKind.Injectable=3]="Injectable"}(CompileSummaryKind||(CompileSummaryKind={}));var CompileStylesheetMetadata=function CompileStylesheetMetadata(_a){var _b=void 0===_a?{}:_a,moduleUrl=_b.moduleUrl,styles=_b.styles,styleUrls=_b.styleUrls;this.moduleUrl=moduleUrl||null,this.styles=_normalizeArray(styles),this.styleUrls=_normalizeArray(styleUrls)},CompileTemplateMetadata=function(){function CompileTemplateMetadata(_a){var encapsulation=_a.encapsulation,template=_a.template,templateUrl=_a.templateUrl,htmlAst=_a.htmlAst,styles=_a.styles,styleUrls=_a.styleUrls,externalStylesheets=_a.externalStylesheets,animations=_a.animations,ngContentSelectors=_a.ngContentSelectors,interpolation=_a.interpolation,isInline=_a.isInline,preserveWhitespaces=_a.preserveWhitespaces;Iif(this.encapsulation=encapsulation,this.template=template,this.templateUrl=templateUrl,this.htmlAst=htmlAst,this.styles=_normalizeArray(styles),this.styleUrls=_normalizeArray(styleUrls),this.externalStylesheets=_normalizeArray(externalStylesheets),this.animations=animations?flatten(animations):[],this.ngContentSelectors=ngContentSelectors||[],interpolation&&2!=interpolation.length)throw new Error("'interpolation' should have a start and an end symbol.");this.interpolation=interpolation,this.isInline=isInline,this.preserveWhitespaces=preserveWhitespaces}return CompileTemplateMetadata.prototype.toSummary=function(){return{ngContentSelectors:this.ngContentSelectors,encapsulation:this.encapsulation,styles:this.styles,animations:this.animations}},CompileTemplateMetadata}(),CompileDirectiveMetadata=function(){function CompileDirectiveMetadata(_a){var isHost=_a.isHost,type=_a.type,isComponent=_a.isComponent,selector=_a.selector,exportAs=_a.exportAs,changeDetection=_a.changeDetection,inputs=_a.inputs,outputs=_a.outputs,hostListeners=_a.hostListeners,hostProperties=_a.hostProperties,hostAttributes=_a.hostAttributes,providers=_a.providers,viewProviders=_a.viewProviders,queries=_a.queries,guards=_a.guards,viewQueries=_a.viewQueries,entryComponents=_a.entryComponents,template=_a.template,componentViewType=_a.componentViewType,rendererType=_a.rendererType,componentFactory=_a.componentFactory;this.isHost=!!isHost,this.type=type,this.isComponent=isComponent,this.selector=selector,this.exportAs=exportAs,this.changeDetection=changeDetection,this.inputs=inputs,this.outputs=outputs,this.hostListeners=hostListeners,this.hostProperties=hostProperties,this.hostAttributes=hostAttributes,this.providers=_normalizeArray(providers),this.viewProviders=_normalizeArray(viewProviders),this.queries=_normalizeArray(queries),this.guards=guards,this.viewQueries=_normalizeArray(viewQueries),this.entryComponents=_normalizeArray(entryComponents),this.template=template,this.componentViewType=componentViewType,this.rendererType=rendererType,this.componentFactory=componentFactory}return CompileDirectiveMetadata.create=function(_a){var isHost=_a.isHost,type=_a.type,isComponent=_a.isComponent,selector=_a.selector,exportAs=_a.exportAs,changeDetection=_a.changeDetection,inputs=_a.inputs,outputs=_a.outputs,host=_a.host,providers=_a.providers,viewProviders=_a.viewProviders,queries=_a.queries,guards=_a.guards,viewQueries=_a.viewQueries,entryComponents=_a.entryComponents,template=_a.template,componentViewType=_a.componentViewType,rendererType=_a.rendererType,componentFactory=_a.componentFactory,hostListeners={},hostProperties={},hostAttributes={};null!=host&&Object.keys(host).forEach(function(key){var value=host[key],matches=key.match(HOST_REG_EXP);null===matches?hostAttributes[key]=value:null!=matches[1]?hostProperties[matches[1]]=value:null!=matches[2]&&(hostListeners[matches[2]]=value)});var inputsMap={};null!=inputs&&inputs.forEach(function(bindConfig){var parts=splitAtColon(bindConfig,[bindConfig,bindConfig]);inputsMap[parts[0]]=parts[1]});var outputsMap={};return null!=outputs&&outputs.forEach(function(bindConfig){var parts=splitAtColon(bindConfig,[bindConfig,bindConfig]);outputsMap[parts[0]]=parts[1]}),new CompileDirectiveMetadata({isHost:isHost,type:type,isComponent:!!isComponent,selector:selector,exportAs:exportAs,changeDetection:changeDetection,inputs:inputsMap,outputs:outputsMap,hostListeners:hostListeners,hostProperties:hostProperties,hostAttributes:hostAttributes,providers:providers,viewProviders:viewProviders,queries:queries,guards:guards,viewQueries:viewQueries,entryComponents:entryComponents,template:template,componentViewType:componentViewType,rendererType:rendererType,componentFactory:componentFactory})},CompileDirectiveMetadata.prototype.toSummary=function(){return{summaryKind:CompileSummaryKind.Directive,type:this.type,isComponent:this.isComponent,selector:this.selector,exportAs:this.exportAs,inputs:this.inputs,outputs:this.outputs,hostListeners:this.hostListeners,hostProperties:this.hostProperties,hostAttributes:this.hostAttributes,providers:this.providers,viewProviders:this.viewProviders,queries:this.queries,guards:this.guards,viewQueries:this.viewQueries,entryComponents:this.entryComponents,changeDetection:this.changeDetection,template:this.template&&this.template.toSummary(),componentViewType:this.componentViewType,rendererType:this.rendererType,componentFactory:this.componentFactory}},CompileDirectiveMetadata}(),CompilePipeMetadata=function(){function CompilePipeMetadata(_a){var type=_a.type,name=_a.name,pure=_a.pure;this.type=type,this.name=name,this.pure=!!pure}return CompilePipeMetadata.prototype.toSummary=function(){return{summaryKind:CompileSummaryKind.Pipe,type:this.type,name:this.name,pure:this.pure}},CompilePipeMetadata}(),CompileNgModuleMetadata=function(){function CompileNgModuleMetadata(_a){var type=_a.type,providers=_a.providers,declaredDirectives=_a.declaredDirectives,exportedDirectives=_a.exportedDirectives,declaredPipes=_a.declaredPipes,exportedPipes=_a.exportedPipes,entryComponents=_a.entryComponents,bootstrapComponents=_a.bootstrapComponents,importedModules=_a.importedModules,exportedModules=_a.exportedModules,schemas=_a.schemas,transitiveModule=_a.transitiveModule,id=_a.id;this.type=type||null,this.declaredDirectives=_normalizeArray(declaredDirectives),this.exportedDirectives=_normalizeArray(exportedDirectives),this.declaredPipes=_normalizeArray(declaredPipes),this.exportedPipes=_normalizeArray(exportedPipes),this.providers=_normalizeArray(providers),this.entryComponents=_normalizeArray(entryComponents),this.bootstrapComponents=_normalizeArray(bootstrapComponents),this.importedModules=_normalizeArray(importedModules),this.exportedModules=_normalizeArray(exportedModules),this.schemas=_normalizeArray(schemas),this.id=id||null,this.transitiveModule=transitiveModule||null}return CompileNgModuleMetadata.prototype.toSummary=function(){var module=this.transitiveModule;return{summaryKind:CompileSummaryKind.NgModule,type:this.type,entryComponents:module.entryComponents,providers:module.providers,modules:module.modules,exportedDirectives:module.exportedDirectives,exportedPipes:module.exportedPipes}},CompileNgModuleMetadata}(),TransitiveCompileNgModuleMetadata=function(){function TransitiveCompileNgModuleMetadata(){this.directivesSet=new Set,this.directives=[],this.exportedDirectivesSet=new Set,this.exportedDirectives=[],this.pipesSet=new Set,this.pipes=[],this.exportedPipesSet=new Set,this.exportedPipes=[],this.modulesSet=new Set,this.modules=[],this.entryComponentsSet=new Set,this.entryComponents=[],this.providers=[]}return TransitiveCompileNgModuleMetadata.prototype.addProvider=function(provider,module){this.providers.push({provider:provider,module:module})},TransitiveCompileNgModuleMetadata.prototype.addDirective=function(id){this.directivesSet.has(id.reference)||(this.directivesSet.add(id.reference),this.directives.push(id))},TransitiveCompileNgModuleMetadata.prototype.addExportedDirective=function(id){this.exportedDirectivesSet.has(id.reference)||(this.exportedDirectivesSet.add(id.reference),this.exportedDirectives.push(id))},TransitiveCompileNgModuleMetadata.prototype.addPipe=function(id){this.pipesSet.has(id.reference)||(this.pipesSet.add(id.reference),this.pipes.push(id))},TransitiveCompileNgModuleMetadata.prototype.addExportedPipe=function(id){this.exportedPipesSet.has(id.reference)||(this.exportedPipesSet.add(id.reference),this.exportedPipes.push(id))},TransitiveCompileNgModuleMetadata.prototype.addModule=function(id){this.modulesSet.has(id.reference)||(this.modulesSet.add(id.reference),this.modules.push(id))},TransitiveCompileNgModuleMetadata.prototype.addEntryComponent=function(ec){this.entryComponentsSet.has(ec.componentType)||(this.entryComponentsSet.add(ec.componentType),this.entryComponents.push(ec))},TransitiveCompileNgModuleMetadata}();function _normalizeArray(obj){return obj||[]}var ProviderMeta=function ProviderMeta(token,_a){var useClass=_a.useClass,useValue=_a.useValue,useExisting=_a.useExisting,useFactory=_a.useFactory,deps=_a.deps,multi=_a.multi;this.token=token,this.useClass=useClass||null,this.useValue=useValue,this.useExisting=useExisting,this.useFactory=useFactory||null,this.dependencies=deps||null,this.multi=!!multi};function flatten(list){return list.reduce(function(flat,item){var flatItem=Array.isArray(item)?flatten(item):item;return flat.concat(flatItem)},[])}function jitSourceUrl(url){return url.replace(/(\w+:\/\/[\w:-]+)?(\/+)?/,"ng:///")}function templateSourceUrl(ngModuleType,compMeta,templateMeta){var url;return url=templateMeta.isInline?compMeta.type.reference instanceof StaticSymbol?compMeta.type.reference.filePath+"."+compMeta.type.reference.name+".html":identifierName(ngModuleType)+"/"+identifierName(compMeta.type)+".html":templateMeta.templateUrl,compMeta.type.reference instanceof StaticSymbol?url:jitSourceUrl(url)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var CORE$1="@angular/core",Identifiers$1=function(){function Identifiers(){}return Identifiers.NEW_METHOD="factory",Identifiers.TRANSFORM_METHOD="transform",Identifiers.PATCH_DEPS="patchedDeps",Identifiers.namespaceHTML={name:"ɵɵnamespaceHTML",moduleName:CORE$1},Identifiers.namespaceMathML={name:"ɵɵnamespaceMathML",moduleName:CORE$1},Identifiers.namespaceSVG={name:"ɵɵnamespaceSVG",moduleName:CORE$1},Identifiers.element={name:"ɵɵelement",moduleName:CORE$1},Identifiers.elementStart={name:"ɵɵelementStart",moduleName:CORE$1},Identifiers.elementEnd={name:"ɵɵelementEnd",moduleName:CORE$1},Identifiers.elementProperty={name:"ɵɵelementProperty",moduleName:CORE$1},Identifiers.select={name:"ɵɵselect",moduleName:CORE$1},Identifiers.componentHostSyntheticProperty={name:"ɵɵcomponentHostSyntheticProperty",moduleName:CORE$1},Identifiers.componentHostSyntheticListener={name:"ɵɵcomponentHostSyntheticListener",moduleName:CORE$1},Identifiers.elementAttribute={name:"ɵɵelementAttribute",moduleName:CORE$1},Identifiers.elementClassProp={name:"ɵɵelementClassProp",moduleName:CORE$1},Identifiers.elementContainerStart={name:"ɵɵelementContainerStart",moduleName:CORE$1},Identifiers.elementContainerEnd={name:"ɵɵelementContainerEnd",moduleName:CORE$1},Identifiers.elementStyling={name:"ɵɵelementStyling",moduleName:CORE$1},Identifiers.elementStylingMap={name:"ɵɵelementStylingMap",moduleName:CORE$1},Identifiers.elementStyleProp={name:"ɵɵelementStyleProp",moduleName:CORE$1},Identifiers.elementStylingApply={name:"ɵɵelementStylingApply",moduleName:CORE$1},Identifiers.elementHostAttrs={name:"ɵɵelementHostAttrs",moduleName:CORE$1},Identifiers.elementHostStyling={name:"ɵɵelementHostStyling",moduleName:CORE$1},Identifiers.elementHostStylingMap={name:"ɵɵelementHostStylingMap",moduleName:CORE$1},Identifiers.elementHostStyleProp={name:"ɵɵelementHostStyleProp",moduleName:CORE$1},Identifiers.elementHostClassProp={name:"ɵɵelementHostClassProp",moduleName:CORE$1},Identifiers.elementHostStylingApply={name:"ɵɵelementHostStylingApply",moduleName:CORE$1},Identifiers.containerCreate={name:"ɵɵcontainer",moduleName:CORE$1},Identifiers.nextContext={name:"ɵɵnextContext",moduleName:CORE$1},Identifiers.templateCreate={name:"ɵɵtemplate",moduleName:CORE$1},Identifiers.text={name:"ɵɵtext",moduleName:CORE$1},Identifiers.textBinding={name:"ɵɵtextBinding",moduleName:CORE$1},Identifiers.bind={name:"ɵɵbind",moduleName:CORE$1},Identifiers.enableBindings={name:"ɵɵenableBindings",moduleName:CORE$1},Identifiers.disableBindings={name:"ɵɵdisableBindings",moduleName:CORE$1},Identifiers.allocHostVars={name:"ɵɵallocHostVars",moduleName:CORE$1},Identifiers.getCurrentView={name:"ɵɵgetCurrentView",moduleName:CORE$1},Identifiers.restoreView={name:"ɵɵrestoreView",moduleName:CORE$1},Identifiers.interpolation1={name:"ɵɵinterpolation1",moduleName:CORE$1},Identifiers.interpolation2={name:"ɵɵinterpolation2",moduleName:CORE$1},Identifiers.interpolation3={name:"ɵɵinterpolation3",moduleName:CORE$1},Identifiers.interpolation4={name:"ɵɵinterpolation4",moduleName:CORE$1},Identifiers.interpolation5={name:"ɵɵinterpolation5",moduleName:CORE$1},Identifiers.interpolation6={name:"ɵɵinterpolation6",moduleName:CORE$1},Identifiers.interpolation7={name:"ɵɵinterpolation7",moduleName:CORE$1},Identifiers.interpolation8={name:"ɵɵinterpolation8",moduleName:CORE$1},Identifiers.interpolationV={name:"ɵɵinterpolationV",moduleName:CORE$1},Identifiers.pureFunction0={name:"ɵɵpureFunction0",moduleName:CORE$1},Identifiers.pureFunction1={name:"ɵɵpureFunction1",moduleName:CORE$1},Identifiers.pureFunction2={name:"ɵɵpureFunction2",moduleName:CORE$1},Identifiers.pureFunction3={name:"ɵɵpureFunction3",moduleName:CORE$1},Identifiers.pureFunction4={name:"ɵɵpureFunction4",moduleName:CORE$1},Identifiers.pureFunction5={name:"ɵɵpureFunction5",moduleName:CORE$1},Identifiers.pureFunction6={name:"ɵɵpureFunction6",moduleName:CORE$1},Identifiers.pureFunction7={name:"ɵɵpureFunction7",moduleName:CORE$1},Identifiers.pureFunction8={name:"ɵɵpureFunction8",moduleName:CORE$1},Identifiers.pureFunctionV={name:"ɵɵpureFunctionV",moduleName:CORE$1},Identifiers.pipeBind1={name:"ɵɵpipeBind1",moduleName:CORE$1},Identifiers.pipeBind2={name:"ɵɵpipeBind2",moduleName:CORE$1},Identifiers.pipeBind3={name:"ɵɵpipeBind3",moduleName:CORE$1},Identifiers.pipeBind4={name:"ɵɵpipeBind4",moduleName:CORE$1},Identifiers.pipeBindV={name:"ɵɵpipeBindV",moduleName:CORE$1},Identifiers.property={name:"ɵɵproperty",moduleName:CORE$1},Identifiers.propertyInterpolate={name:"ɵɵpropertyInterpolate",moduleName:CORE$1},Identifiers.propertyInterpolate1={name:"ɵɵpropertyInterpolate1",moduleName:CORE$1},Identifiers.propertyInterpolate2={name:"ɵɵpropertyInterpolate2",moduleName:CORE$1},Identifiers.propertyInterpolate3={name:"ɵɵpropertyInterpolate3",moduleName:CORE$1},Identifiers.propertyInterpolate4={name:"ɵɵpropertyInterpolate4",moduleName:CORE$1},Identifiers.propertyInterpolate5={name:"ɵɵpropertyInterpolate5",moduleName:CORE$1},Identifiers.propertyInterpolate6={name:"ɵɵpropertyInterpolate6",moduleName:CORE$1},Identifiers.propertyInterpolate7={name:"ɵɵpropertyInterpolate7",moduleName:CORE$1},Identifiers.propertyInterpolate8={name:"ɵɵpropertyInterpolate8",moduleName:CORE$1},Identifiers.propertyInterpolateV={name:"ɵɵpropertyInterpolateV",moduleName:CORE$1},Identifiers.i18n={name:"ɵɵi18n",moduleName:CORE$1},Identifiers.i18nAttributes={name:"ɵɵi18nAttributes",moduleName:CORE$1},Identifiers.i18nExp={name:"ɵɵi18nExp",moduleName:CORE$1},Identifiers.i18nStart={name:"ɵɵi18nStart",moduleName:CORE$1},Identifiers.i18nEnd={name:"ɵɵi18nEnd",moduleName:CORE$1},Identifiers.i18nApply={name:"ɵɵi18nApply",moduleName:CORE$1},Identifiers.i18nPostprocess={name:"ɵɵi18nPostprocess",moduleName:CORE$1},Identifiers.i18nLocalize={name:"ɵɵi18nLocalize",moduleName:CORE$1},Identifiers.load={name:"ɵɵload",moduleName:CORE$1},Identifiers.pipe={name:"ɵɵpipe",moduleName:CORE$1},Identifiers.projection={name:"ɵɵprojection",moduleName:CORE$1},Identifiers.projectionDef={name:"ɵɵprojectionDef",moduleName:CORE$1},Identifiers.reference={name:"ɵɵreference",moduleName:CORE$1},Identifiers.inject={name:"ɵɵinject",moduleName:CORE$1},Identifiers.injectAttribute={name:"ɵɵinjectAttribute",moduleName:CORE$1},Identifiers.directiveInject={name:"ɵɵdirectiveInject",moduleName:CORE$1},Identifiers.templateRefExtractor={name:"ɵɵtemplateRefExtractor",moduleName:CORE$1},Identifiers.resolveWindow={name:"ɵɵresolveWindow",moduleName:CORE$1},Identifiers.resolveDocument={name:"ɵɵresolveDocument",moduleName:CORE$1},Identifiers.resolveBody={name:"ɵɵresolveBody",moduleName:CORE$1},Identifiers.defineBase={name:"ɵɵdefineBase",moduleName:CORE$1},Identifiers.BaseDef={name:"ɵɵBaseDef",moduleName:CORE$1},Identifiers.defineComponent={name:"ɵɵdefineComponent",moduleName:CORE$1},Identifiers.setComponentScope={name:"ɵɵsetComponentScope",moduleName:CORE$1},Identifiers.ComponentDefWithMeta={name:"ɵɵComponentDefWithMeta",moduleName:CORE$1},Identifiers.defineDirective={name:"ɵɵdefineDirective",moduleName:CORE$1},Identifiers.DirectiveDefWithMeta={name:"ɵɵDirectiveDefWithMeta",moduleName:CORE$1},Identifiers.InjectorDef={name:"ɵɵInjectorDef",moduleName:CORE$1},Identifiers.defineInjector={name:"ɵɵdefineInjector",moduleName:CORE$1},Identifiers.NgModuleDefWithMeta={name:"ɵɵNgModuleDefWithMeta",moduleName:CORE$1},Identifiers.defineNgModule={name:"ɵɵdefineNgModule",moduleName:CORE$1},Identifiers.setNgModuleScope={name:"ɵɵsetNgModuleScope",moduleName:CORE$1},Identifiers.PipeDefWithMeta={name:"ɵɵPipeDefWithMeta",moduleName:CORE$1},Identifiers.definePipe={name:"ɵɵdefinePipe",moduleName:CORE$1},Identifiers.queryRefresh={name:"ɵɵqueryRefresh",moduleName:CORE$1},Identifiers.viewQuery={name:"ɵɵviewQuery",moduleName:CORE$1},Identifiers.staticViewQuery={name:"ɵɵstaticViewQuery",moduleName:CORE$1},Identifiers.staticContentQuery={name:"ɵɵstaticContentQuery",moduleName:CORE$1},Identifiers.loadViewQuery={name:"ɵɵloadViewQuery",moduleName:CORE$1},Identifiers.contentQuery={name:"ɵɵcontentQuery",moduleName:CORE$1},Identifiers.loadContentQuery={name:"ɵɵloadContentQuery",moduleName:CORE$1},Identifiers.NgOnChangesFeature={name:"ɵɵNgOnChangesFeature",moduleName:CORE$1},Identifiers.InheritDefinitionFeature={name:"ɵɵInheritDefinitionFeature",moduleName:CORE$1},Identifiers.ProvidersFeature={name:"ɵɵProvidersFeature",moduleName:CORE$1},Identifiers.listener={name:"ɵɵlistener",moduleName:CORE$1},Identifiers.getFactoryOf={name:"ɵɵgetFactoryOf",moduleName:CORE$1},Identifiers.getInheritedFactory={name:"ɵɵgetInheritedFactory",moduleName:CORE$1},Identifiers.registerNgModuleType={name:"ɵregisterNgModuleType",moduleName:CORE$1},Identifiers.sanitizeHtml={name:"ɵɵsanitizeHtml",moduleName:CORE$1},Identifiers.sanitizeStyle={name:"ɵɵsanitizeStyle",moduleName:CORE$1},Identifiers.defaultStyleSanitizer={name:"ɵɵdefaultStyleSanitizer",moduleName:CORE$1},Identifiers.sanitizeResourceUrl={name:"ɵɵsanitizeResourceUrl",moduleName:CORE$1},Identifiers.sanitizeScript={name:"ɵɵsanitizeScript",moduleName:CORE$1},Identifiers.sanitizeUrl={name:"ɵɵsanitizeUrl",moduleName:CORE$1},Identifiers.sanitizeUrlOrResourceUrl={name:"ɵɵsanitizeUrlOrResourceUrl",moduleName:CORE$1},Identifiers}(),Text=function(){function Text(value,sourceSpan){this.value=value,this.sourceSpan=sourceSpan}return Text.prototype.visit=function(visitor){return visitor.visitText(this)},Text}(),BoundText=function(){function BoundText(value,sourceSpan,i18n){this.value=value,this.sourceSpan=sourceSpan,this.i18n=i18n}return BoundText.prototype.visit=function(visitor){return visitor.visitBoundText(this)},BoundText}(),TextAttribute=function(){function TextAttribute(name,value,sourceSpan,valueSpan,i18n){this.name=name,this.value=value,this.sourceSpan=sourceSpan,this.valueSpan=valueSpan,this.i18n=i18n}return TextAttribute.prototype.visit=function(visitor){return visitor.visitTextAttribute(this)},TextAttribute}(),BoundAttribute=function(){function BoundAttribute(name,type,securityContext,value,unit,sourceSpan,i18n){this.name=name,this.type=type,this.securityContext=securityContext,this.value=value,this.unit=unit,this.sourceSpan=sourceSpan,this.i18n=i18n}return BoundAttribute.fromBoundElementProperty=function(prop,i18n){return new BoundAttribute(prop.name,prop.type,prop.securityContext,prop.value,prop.unit,prop.sourceSpan,i18n)},BoundAttribute.prototype.visit=function(visitor){return visitor.visitBoundAttribute(this)},BoundAttribute}(),BoundEvent=function(){function BoundEvent(name,type,handler,target,phase,sourceSpan,handlerSpan){this.name=name,this.type=type,this.handler=handler,this.target=target,this.phase=phase,this.sourceSpan=sourceSpan,this.handlerSpan=handlerSpan}return BoundEvent.fromParsedEvent=function(event){var target=0===event.type?event.targetOrPhase:null,phase=1===event.type?event.targetOrPhase:null;return new BoundEvent(event.name,event.type,event.handler,target,phase,event.sourceSpan,event.handlerSpan)},BoundEvent.prototype.visit=function(visitor){return visitor.visitBoundEvent(this)},BoundEvent}(),Element=function(){function Element(name,attributes,inputs,outputs,children,references,sourceSpan,startSourceSpan,endSourceSpan,i18n){this.name=name,this.attributes=attributes,this.inputs=inputs,this.outputs=outputs,this.children=children,this.references=references,this.sourceSpan=sourceSpan,this.startSourceSpan=startSourceSpan,this.endSourceSpan=endSourceSpan,this.i18n=i18n,0===children.length&&startSourceSpan&&endSourceSpan&&(this.sourceSpan=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},sourceSpan,{end:endSourceSpan.end}))}return Element.prototype.visit=function(visitor){return visitor.visitElement(this)},Element}(),Template=function(){function Template(tagName,attributes,inputs,outputs,templateAttrs,children,references,variables,sourceSpan,startSourceSpan,endSourceSpan,i18n){this.tagName=tagName,this.attributes=attributes,this.inputs=inputs,this.outputs=outputs,this.templateAttrs=templateAttrs,this.children=children,this.references=references,this.variables=variables,this.sourceSpan=sourceSpan,this.startSourceSpan=startSourceSpan,this.endSourceSpan=endSourceSpan,this.i18n=i18n}return Template.prototype.visit=function(visitor){return visitor.visitTemplate(this)},Template}(),Content=function(){function Content(selector,attributes,sourceSpan,i18n){this.selector=selector,this.attributes=attributes,this.sourceSpan=sourceSpan,this.i18n=i18n}return Content.prototype.visit=function(visitor){return visitor.visitContent(this)},Content}(),Variable=function(){function Variable(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan}return Variable.prototype.visit=function(visitor){return visitor.visitVariable(this)},Variable}(),Reference=function(){function Reference(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan}return Reference.prototype.visit=function(visitor){return visitor.visitReference(this)},Reference}(),Icu=function(){function Icu(vars,placeholders,sourceSpan,i18n){this.vars=vars,this.placeholders=placeholders,this.sourceSpan=sourceSpan,this.i18n=i18n}return Icu.prototype.visit=function(visitor){return visitor.visitIcu(this)},Icu}();function visitAll(visitor,nodes){var e_1,_a,e_2,_b,result=[];if(visitor.visit)try{for(var nodes_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(nodes),nodes_1_1=nodes_1.next();!nodes_1_1.done;nodes_1_1=nodes_1.next())var node=nodes_1_1.value,newNode=visitor.visit(node)||node.visit(visitor)}catch(e_1_1){e_1={error:e_1_1}}finally{try{nodes_1_1&&!nodes_1_1.done&&(_a=nodes_1.return)&&_a.call(nodes_1)}finally{if(e_1)throw e_1.error}}else try{for(var nodes_2=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(nodes),nodes_2_1=nodes_2.next();!nodes_2_1.done;nodes_2_1=nodes_2.next()){(newNode=(node=nodes_2_1.value).visit(visitor))&&result.push(newNode)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{nodes_2_1&&!nodes_2_1.done&&(_b=nodes_2.return)&&_b.call(nodes_2)}finally{if(e_2)throw e_2.error}}return result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var Message=function Message(nodes,placeholders,placeholderToMessage,meaning,description,id){this.nodes=nodes,this.placeholders=placeholders,this.placeholderToMessage=placeholderToMessage,this.meaning=meaning,this.description=description,this.id=id,nodes.length?this.sources=[{filePath:nodes[0].sourceSpan.start.file.url,startLine:nodes[0].sourceSpan.start.line+1,startCol:nodes[0].sourceSpan.start.col+1,endLine:nodes[nodes.length-1].sourceSpan.end.line+1,endCol:nodes[0].sourceSpan.start.col+1}]:this.sources=[]},Text$1=function(){function Text(value,sourceSpan){this.value=value,this.sourceSpan=sourceSpan}return Text.prototype.visit=function(visitor,context){return visitor.visitText(this,context)},Text}(),Container=function(){function Container(children,sourceSpan){this.children=children,this.sourceSpan=sourceSpan}return Container.prototype.visit=function(visitor,context){return visitor.visitContainer(this,context)},Container}(),Icu$1=function(){function Icu(expression,type,cases,sourceSpan){this.expression=expression,this.type=type,this.cases=cases,this.sourceSpan=sourceSpan}return Icu.prototype.visit=function(visitor,context){return visitor.visitIcu(this,context)},Icu}(),TagPlaceholder=function(){function TagPlaceholder(tag,attrs,startName,closeName,children,isVoid,sourceSpan){this.tag=tag,this.attrs=attrs,this.startName=startName,this.closeName=closeName,this.children=children,this.isVoid=isVoid,this.sourceSpan=sourceSpan}return TagPlaceholder.prototype.visit=function(visitor,context){return visitor.visitTagPlaceholder(this,context)},TagPlaceholder}(),Placeholder=function(){function Placeholder(value,name,sourceSpan){this.value=value,this.name=name,this.sourceSpan=sourceSpan}return Placeholder.prototype.visit=function(visitor,context){return visitor.visitPlaceholder(this,context)},Placeholder}(),IcuPlaceholder=function(){function IcuPlaceholder(value,name,sourceSpan){this.value=value,this.name=name,this.sourceSpan=sourceSpan}return IcuPlaceholder.prototype.visit=function(visitor,context){return visitor.visitIcuPlaceholder(this,context)},IcuPlaceholder}(),CloneVisitor=function(){function CloneVisitor(){}return CloneVisitor.prototype.visitText=function(text,context){return new Text$1(text.value,text.sourceSpan)},CloneVisitor.prototype.visitContainer=function(container,context){var _this=this,children=container.children.map(function(n){return n.visit(_this,context)});return new Container(children,container.sourceSpan)},CloneVisitor.prototype.visitIcu=function(icu,context){var _this=this,cases={};Object.keys(icu.cases).forEach(function(key){return cases[key]=icu.cases[key].visit(_this,context)});var msg=new Icu$1(icu.expression,icu.type,cases,icu.sourceSpan);return msg.expressionPlaceholder=icu.expressionPlaceholder,msg},CloneVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this,children=ph.children.map(function(n){return n.visit(_this,context)});return new TagPlaceholder(ph.tag,ph.attrs,ph.startName,ph.closeName,children,ph.isVoid,ph.sourceSpan)},CloneVisitor.prototype.visitPlaceholder=function(ph,context){return new Placeholder(ph.value,ph.name,ph.sourceSpan)},CloneVisitor.prototype.visitIcuPlaceholder=function(ph,context){return new IcuPlaceholder(ph.value,ph.name,ph.sourceSpan)},CloneVisitor}(),RecurseVisitor=function(){function RecurseVisitor(){}return RecurseVisitor.prototype.visitText=function(text,context){},RecurseVisitor.prototype.visitContainer=function(container,context){var _this=this;container.children.forEach(function(child){return child.visit(_this)})},RecurseVisitor.prototype.visitIcu=function(icu,context){var _this=this;Object.keys(icu.cases).forEach(function(k){icu.cases[k].visit(_this)})},RecurseVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this;ph.children.forEach(function(child){return child.visit(_this)})},RecurseVisitor.prototype.visitPlaceholder=function(ph,context){},RecurseVisitor.prototype.visitIcuPlaceholder=function(ph,context){},RecurseVisitor}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function digest(message){return message.id||function sha1(str){var _a,_b,utf8=utf8Encode(str),words32=function stringToWords32(str,endian){for(var words32=Array(str.length+3>>>2),i=0;i<words32.length;i++)words32[i]=wordAt(str,4*i,endian);return words32}(utf8,Endian.Big),len=8*utf8.length,w=new Array(80),_c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([1732584193,4023233417,2562383102,271733878,3285377520],5),a=_c[0],b=_c[1],c=_c[2],d=_c[3],e=_c[4];words32[len>>5]|=128<<24-len%32,words32[15+(len+64>>9<<4)]=len;for(var i=0;i<words32.length;i+=16){for(var _d=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([a,b,c,d,e],5),h0=_d[0],h1=_d[1],h2=_d[2],h3=_d[3],h4=_d[4],j=0;j<80;j++){w[j]=j<16?words32[i+j]:rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);var _e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(fk(j,b,c,d),2),f=_e[0],k=_e[1],temp=[rol32(a,5),f,e,k,w[j]].reduce(add32);_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([d,c,rol32(b,30),a,temp],5),e=_a[0],d=_a[1],c=_a[2],b=_a[3],a=_a[4]}_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([add32(a,h0),add32(b,h1),add32(c,h2),add32(d,h3),add32(e,h4)],5),a=_b[0],b=_b[1],c=_b[2],d=_b[3],e=_b[4]}return function byteStringToHexString(str){for(var hex="",i=0;i<str.length;i++){var b=byteAt(str,i);hex+=(b>>>4).toString(16)+(15&b).toString(16)}return hex.toLowerCase()}(words32ToByteString([a,b,c,d,e]))}(function serializeNodes(nodes){return nodes.map(function(a){return a.visit(serializerVisitor,null)})}(message.nodes).join("")+"["+message.meaning+"]")}function decimalDigest(message){if(message.id)return message.id;var visitor=new _SerializerIgnoreIcuExpVisitor;return function computeMsgId(msg,meaning){var _a,_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(fingerprint(msg),2),hi=_b[0],lo=_b[1];if(meaning){var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(fingerprint(meaning),2),him=_c[0],lom=_c[1];_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(function add64(_a,_b){var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),ah=_c[0],al=_c[1],_d=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_b,2),bh=_d[0],bl=_d[1],_e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(add32to64(al,bl),2),carry=_e[0],l=_e[1];return[add32(add32(ah,bh),carry),l]}(function rol64(_a,count){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),hi=_b[0],lo=_b[1];return[hi<<count|lo>>>32-count,lo<<count|hi>>>32-count]}([hi,lo],1),[him,lom]),2),hi=_a[0],lo=_a[1]}return function byteStringToDecString(str){for(var decimal="",toThePower="1",i=str.length-1;i>=0;i--)decimal=addBigInt(decimal,numberTimesBigInt(byteAt(str,i),toThePower)),toThePower=numberTimesBigInt(256,toThePower);return decimal.split("").reverse().join("")}(words32ToByteString([2147483647&hi,lo]))}(message.nodes.map(function(a){return a.visit(visitor,null)}).join(""),message.meaning)}var _SerializerVisitor=function(){function _SerializerVisitor(){}return _SerializerVisitor.prototype.visitText=function(text,context){return text.value},_SerializerVisitor.prototype.visitContainer=function(container,context){var _this=this;return"["+container.children.map(function(child){return child.visit(_this)}).join(", ")+"]"},_SerializerVisitor.prototype.visitIcu=function(icu,context){var _this=this,strCases=Object.keys(icu.cases).map(function(k){return k+" {"+icu.cases[k].visit(_this)+"}"});return"{"+icu.expression+", "+icu.type+", "+strCases.join(", ")+"}"},_SerializerVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this;return ph.isVoid?'<ph tag name="'+ph.startName+'"/>':'<ph tag name="'+ph.startName+'">'+ph.children.map(function(child){return child.visit(_this)}).join(", ")+'</ph name="'+ph.closeName+'">'},_SerializerVisitor.prototype.visitPlaceholder=function(ph,context){return ph.value?'<ph name="'+ph.name+'">'+ph.value+"</ph>":'<ph name="'+ph.name+'"/>'},_SerializerVisitor.prototype.visitIcuPlaceholder=function(ph,context){return'<ph icu name="'+ph.name+'">'+ph.value.visit(this)+"</ph>"},_SerializerVisitor}(),serializerVisitor=new _SerializerVisitor;var Endian,_SerializerIgnoreIcuExpVisitor=function(_super){function _SerializerIgnoreIcuExpVisitor(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_SerializerIgnoreIcuExpVisitor,_super),_SerializerIgnoreIcuExpVisitor.prototype.visitIcu=function(icu,context){var _this=this,strCases=Object.keys(icu.cases).map(function(k){return k+" {"+icu.cases[k].visit(_this)+"}"});return"{"+icu.type+", "+strCases.join(", ")+"}"},_SerializerIgnoreIcuExpVisitor}(_SerializerVisitor);function fk(index,b,c,d){return index<20?[b&c|~b&d,1518500249]:index<40?[b^c^d,1859775393]:index<60?[b&c|b&d|c&d,2400959708]:[b^c^d,3395469782]}function fingerprint(str){var utf8=utf8Encode(str),_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([hash32(utf8,0),hash32(utf8,102072)],2),hi=_a[0],lo=_a[1];return 0!=hi||0!=lo&&1!=lo||(hi^=319790063,lo^=-1801410264),[hi,lo]}function hash32(str,c){var _a,i,_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)([2654435769,2654435769],2),a=_b[0],b=_b[1],len=str.length;for(i=0;i+12<=len;i+=12)a=add32(a,wordAt(str,i,Endian.Little)),b=add32(b,wordAt(str,i+4,Endian.Little)),c=add32(c,wordAt(str,i+8,Endian.Little)),a=(_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(mix([a,b,c]),3))[0],b=_a[1],c=_a[2];return a=add32(a,wordAt(str,i,Endian.Little)),b=add32(b,wordAt(str,i+4,Endian.Little)),c=add32(c,len),mix([a,b,c=add32(c,wordAt(str,i+8,Endian.Little)<<8)])[2]}function mix(_a){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,3),a=_b[0],b=_b[1],c=_b[2];return a=sub32(a,b),a=sub32(a,c),a^=c>>>13,b=sub32(b,c),b=sub32(b,a),b^=a<<8,c=sub32(c,a),c=sub32(c,b),c^=b>>>13,a=sub32(a,b),a=sub32(a,c),a^=c>>>12,b=sub32(b,c),b=sub32(b,a),b^=a<<16,c=sub32(c,a),c=sub32(c,b),c^=b>>>5,a=sub32(a,b),a=sub32(a,c),a^=c>>>3,b=sub32(b,c),b=sub32(b,a),b^=a<<10,c=sub32(c,a),c=sub32(c,b),[a,b,c^=b>>>15]}function add32(a,b){return add32to64(a,b)[1]}function add32to64(a,b){var low=(65535&a)+(65535&b),high=(a>>>16)+(b>>>16)+(low>>>16);return[high>>>16,high<<16|65535&low]}function sub32(a,b){var low=(65535&a)-(65535&b);return(a>>16)-(b>>16)+(low>>16)<<16|65535&low}function rol32(a,count){return a<<count|a>>>32-count}function byteAt(str,index){return index>=str.length?0:255&str.charCodeAt(index)}function wordAt(str,index,endian){var word=0;if(endian===Endian.Big)for(var i=0;i<4;i++)word+=byteAt(str,index+i)<<24-8*i;else for(i=0;i<4;i++)word+=byteAt(str,index+i)<<8*i;return word}function words32ToByteString(words32){return words32.reduce(function(str,word){return str+function word32ToByteString(word){for(var str="",i=0;i<4;i++)str+=String.fromCharCode(word>>>8*(3-i)&255);return str}(word)},"")}function addBigInt(x,y){for(var sum="",len=Math.max(x.length,y.length),i=0,carry=0;i<len||carry;i++){var tmpSum=carry+ +(x[i]||0)+ +(y[i]||0);tmpSum>=10?(carry=1,sum+=tmpSum-10):(carry=0,sum+=tmpSum)}return sum}function numberTimesBigInt(num,b){for(var product="",bToThePower=b;0!==num;num>>>=1)1&num&&(product=addBigInt(product,bToThePower)),bToThePower=addBigInt(bToThePower,bToThePower);return product}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(Endian){Endian[Endian.Little=0]="Little",Endian[Endian.Big=1]="Big"}(Endian||(Endian={}));var Serializer=function(){function Serializer(){}return Serializer.prototype.createNameMapper=function(message){return null},Serializer}(),SimplePlaceholderMapper=function(_super){function SimplePlaceholderMapper(message,mapName){var _this=_super.call(this)||this;return _this.mapName=mapName,_this.internalToPublic={},_this.publicToNextId={},_this.publicToInternal={},message.nodes.forEach(function(node){return node.visit(_this)}),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(SimplePlaceholderMapper,_super),SimplePlaceholderMapper.prototype.toPublicName=function(internalName){return this.internalToPublic.hasOwnProperty(internalName)?this.internalToPublic[internalName]:null},SimplePlaceholderMapper.prototype.toInternalName=function(publicName){return this.publicToInternal.hasOwnProperty(publicName)?this.publicToInternal[publicName]:null},SimplePlaceholderMapper.prototype.visitText=function(text,context){return null},SimplePlaceholderMapper.prototype.visitTagPlaceholder=function(ph,context){this.visitPlaceholderName(ph.startName),_super.prototype.visitTagPlaceholder.call(this,ph,context),this.visitPlaceholderName(ph.closeName)},SimplePlaceholderMapper.prototype.visitPlaceholder=function(ph,context){this.visitPlaceholderName(ph.name)},SimplePlaceholderMapper.prototype.visitIcuPlaceholder=function(ph,context){this.visitPlaceholderName(ph.name)},SimplePlaceholderMapper.prototype.visitPlaceholderName=function(internalName){if(internalName&&!this.internalToPublic.hasOwnProperty(internalName)){var publicName=this.mapName(internalName);if(this.publicToInternal.hasOwnProperty(publicName)){var nextId=this.publicToNextId[publicName];this.publicToNextId[publicName]=nextId+1,publicName=publicName+"_"+nextId}else this.publicToNextId[publicName]=1;this.internalToPublic[internalName]=publicName,this.publicToInternal[publicName]=internalName}},SimplePlaceholderMapper}(RecurseVisitor),_visitor=new(function(){function _Visitor(){}return _Visitor.prototype.visitTag=function(tag){var _this=this,strAttrs=this._serializeAttributes(tag.attrs);if(0==tag.children.length)return"<"+tag.name+strAttrs+"/>";var strChildren=tag.children.map(function(node){return node.visit(_this)});return"<"+tag.name+strAttrs+">"+strChildren.join("")+"</"+tag.name+">"},_Visitor.prototype.visitText=function(text){return text.value},_Visitor.prototype.visitDeclaration=function(decl){return"<?xml"+this._serializeAttributes(decl.attrs)+" ?>"},_Visitor.prototype._serializeAttributes=function(attrs){var strAttrs=Object.keys(attrs).map(function(name){return name+'="'+attrs[name]+'"'}).join(" ");return strAttrs.length>0?" "+strAttrs:""},_Visitor.prototype.visitDoctype=function(doctype){return"<!DOCTYPE "+doctype.rootTag+" [\n"+doctype.dtd+"\n]>"},_Visitor}());function serialize(nodes){return nodes.map(function(node){return node.visit(_visitor)}).join("")}var Declaration=function(){function Declaration(unescapedAttrs){var _this=this;this.attrs={},Object.keys(unescapedAttrs).forEach(function(k){_this.attrs[k]=escapeXml(unescapedAttrs[k])})}return Declaration.prototype.visit=function(visitor){return visitor.visitDeclaration(this)},Declaration}(),Doctype=function(){function Doctype(rootTag,dtd){this.rootTag=rootTag,this.dtd=dtd}return Doctype.prototype.visit=function(visitor){return visitor.visitDoctype(this)},Doctype}(),Tag=function(){function Tag(name,unescapedAttrs,children){var _this=this;void 0===unescapedAttrs&&(unescapedAttrs={}),void 0===children&&(children=[]),this.name=name,this.children=children,this.attrs={},Object.keys(unescapedAttrs).forEach(function(k){_this.attrs[k]=escapeXml(unescapedAttrs[k])})}return Tag.prototype.visit=function(visitor){return visitor.visitTag(this)},Tag}(),Text$2=function(){function Text(unescapedValue){this.value=escapeXml(unescapedValue)}return Text.prototype.visit=function(visitor){return visitor.visitText(this)},Text}(),CR=function(_super){function CR(ws){return void 0===ws&&(ws=0),_super.call(this,"\n"+new Array(ws+1).join(" "))||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(CR,_super),CR}(Text$2),_ESCAPED_CHARS=[[/&/g,"&amp;"],[/"/g,"&quot;"],[/'/g,"&apos;"],[/</g,"&lt;"],[/>/g,"&gt;"]];function escapeXml(text){return _ESCAPED_CHARS.reduce(function(text,entry){return text.replace(entry[0],entry[1])},text)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var Xmb=function(_super){function Xmb(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Xmb,_super),Xmb.prototype.write=function(messages,locale){var exampleVisitor=new ExampleVisitor,visitor=new _Visitor$1,rootNode=new Tag("messagebundle");return messages.forEach(function(message){var attrs={id:message.id};message.description&&(attrs.desc=message.description),message.meaning&&(attrs.meaning=message.meaning);var sourceTags=[];message.sources.forEach(function(source){sourceTags.push(new Tag("source",{},[new Text$2(source.filePath+":"+source.startLine+(source.endLine!==source.startLine?","+source.endLine:""))]))}),rootNode.children.push(new CR(2),new Tag("msg",attrs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(sourceTags,visitor.serialize(message.nodes))))}),rootNode.children.push(new CR),serialize([new Declaration({version:"1.0",encoding:"UTF-8"}),new CR,new Doctype("messagebundle",'<!ELEMENT messagebundle (msg)*>\n<!ATTLIST messagebundle class CDATA #IMPLIED>\n\n<!ELEMENT msg (#PCDATA|ph|source)*>\n<!ATTLIST msg id CDATA #IMPLIED>\n<!ATTLIST msg seq CDATA #IMPLIED>\n<!ATTLIST msg name CDATA #IMPLIED>\n<!ATTLIST msg desc CDATA #IMPLIED>\n<!ATTLIST msg meaning CDATA #IMPLIED>\n<!ATTLIST msg obsolete (obsolete) #IMPLIED>\n<!ATTLIST msg xml:space (default|preserve) "default">\n<!ATTLIST msg is_hidden CDATA #IMPLIED>\n\n<!ELEMENT source (#PCDATA)>\n\n<!ELEMENT ph (#PCDATA|ex)*>\n<!ATTLIST ph name CDATA #REQUIRED>\n\n<!ELEMENT ex (#PCDATA)>'),new CR,exampleVisitor.addDefaultExamples(rootNode),new CR])},Xmb.prototype.load=function(content,url){throw new Error("Unsupported")},Xmb.prototype.digest=function(message){return digest$1(message)},Xmb.prototype.createNameMapper=function(message){return new SimplePlaceholderMapper(message,toPublicName)},Xmb}(Serializer),_Visitor$1=function(){function _Visitor(){}return _Visitor.prototype.visitText=function(text,context){return[new Text$2(text.value)]},_Visitor.prototype.visitContainer=function(container,context){var _this=this,nodes=[];return container.children.forEach(function(node){return nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(node.visit(_this)))}),nodes},_Visitor.prototype.visitIcu=function(icu,context){var _this=this,nodes=[new Text$2("{"+icu.expressionPlaceholder+", "+icu.type+", ")];return Object.keys(icu.cases).forEach(function(c){nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new Text$2(c+" {")],icu.cases[c].visit(_this),[new Text$2("} ")]))}),nodes.push(new Text$2("}")),nodes},_Visitor.prototype.visitTagPlaceholder=function(ph,context){var startTagAsText=new Text$2("<"+ph.tag+">"),startEx=new Tag("ex",{},[startTagAsText]),startTagPh=new Tag("ph",{name:ph.startName},[startEx,startTagAsText]);if(ph.isVoid)return[startTagPh];var closeTagAsText=new Text$2("</"+ph.tag+">"),closeEx=new Tag("ex",{},[closeTagAsText]),closeTagPh=new Tag("ph",{name:ph.closeName},[closeEx,closeTagAsText]);return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([startTagPh],this.serialize(ph.children),[closeTagPh])},_Visitor.prototype.visitPlaceholder=function(ph,context){var interpolationAsText=new Text$2("{{"+ph.value+"}}"),exTag=new Tag("ex",{},[interpolationAsText]);return[new Tag("ph",{name:ph.name},[exTag,interpolationAsText])]},_Visitor.prototype.visitIcuPlaceholder=function(ph,context){var icuExpression=ph.value.expression,icuType=ph.value.type,icuCases=Object.keys(ph.value.cases).map(function(value){return value+" {...}"}).join(" "),icuAsText=new Text$2("{"+icuExpression+", "+icuType+", "+icuCases+"}"),exTag=new Tag("ex",{},[icuAsText]);return[new Tag("ph",{name:ph.name},[exTag,icuAsText])]},_Visitor.prototype.serialize=function(nodes){var _this=this;return[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(nodes.map(function(node){return node.visit(_this)})))},_Visitor}();function digest$1(message){return decimalDigest(message)}var ExampleVisitor=function(){function ExampleVisitor(){}return ExampleVisitor.prototype.addDefaultExamples=function(node){return node.visit(this),node},ExampleVisitor.prototype.visitTag=function(tag){var _this=this;if("ph"===tag.name){if(!tag.children||0==tag.children.length){var exText=new Text$2(tag.attrs.name||"...");tag.children=[new Tag("ex",{},[exText])]}}else tag.children&&tag.children.forEach(function(node){return node.visit(_this)})},ExampleVisitor.prototype.visitText=function(text){},ExampleVisitor.prototype.visitDeclaration=function(decl){},ExampleVisitor.prototype.visitDoctype=function(doctype){},ExampleVisitor}();function toPublicName(internalName){return internalName.toUpperCase().replace(/[^A-Z0-9_]/g,"_")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function mapLiteral(obj,quoted){return void 0===quoted&&(quoted=!1),literalMap(Object.keys(obj).map(function(key){return{key:key,quoted:quoted,value:obj[key]}}))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var CLOSURE_TRANSLATION_PREFIX="MSG_",GOOG_GET_MSG="goog.getMsg",NG_I18N_CLOSURE_MODE="ngI18nClosureMode",I18N_MEANING_SEPARATOR="|",I18N_ID_SEPARATOR="@@",I18N_ATTR="i18n",I18N_ATTR_PREFIX="i18n-",I18N_PLACEHOLDER_SYMBOL="�";function i18nTranslationToDeclStmt(variable$1,closureVar,message,meta,params){var statements=[];statements.push(new DeclareVarStmt(variable$1.name,void 0,INFERRED_TYPE,null,variable$1.sourceSpan));var args=[literal(message)];params&&Object.keys(params).length&&args.push(mapLiteral(params,!0));var docStatements=function i18nMetaToDocStmt(meta){var tags=[];meta.description&&tags.push({tagName:"desc",text:meta.description});meta.meaning&&tags.push({tagName:"meaning",text:meta.meaning});return 0==tags.length?null:new JSDocCommentStmt(tags)}(meta),thenStatements=docStatements?[docStatements]:[],googFnCall=variable(GOOG_GET_MSG).callFn(args);thenStatements.push(closureVar.set(googFnCall).toConstDecl()),thenStatements.push(new ExpressionStatement(variable$1.set(closureVar)));var localizeFnCall=importExpr(Identifiers$1.i18nLocalize).callFn(args),elseStatements=[new ExpressionStatement(variable$1.set(localizeFnCall))];return statements.push(ifStmt(variable(NG_I18N_CLOSURE_MODE),thenStatements,elseStatements)),statements}function isI18nAttribute(name){return name===I18N_ATTR||name.startsWith(I18N_ATTR_PREFIX)}function isI18nRootNode(meta){return meta instanceof Message}function isSingleI18nIcu(meta){return isI18nRootNode(meta)&&1===meta.nodes.length&&meta.nodes[0]instanceof Icu$1}function metaFromI18nMessage(message,id){return void 0===id&&(id=null),{id:"string"==typeof id?id:message.id||"",meaning:message.meaning||"",description:message.description||""}}function icuFromI18nMessage(message){return message.nodes[0]}function wrapI18nPlaceholder(content,contextId){return void 0===contextId&&(contextId=0),""+I18N_PLACEHOLDER_SYMBOL+content+(contextId>0?":"+contextId:"")+I18N_PLACEHOLDER_SYMBOL}function getSeqNumberGenerator(startsAt){void 0===startsAt&&(startsAt=0);var current=startsAt;return function(){return current++}}function placeholdersToParams(placeholders){var params={};return placeholders.forEach(function(values,key){params[key]=literal(values.length>1?"["+values.join("|")+"]":values[0])}),params}function updatePlaceholderMap(map,name){for(var values=[],_i=2;_i<arguments.length;_i++)values[_i-2]=arguments[_i];var current=map.get(name)||[];current.push.apply(current,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(values)),map.set(name,current)}function assembleBoundTextPlaceholders(meta,bindingStartIndex,contextId){void 0===bindingStartIndex&&(bindingStartIndex=0),void 0===contextId&&(contextId=0);var startIdx=bindingStartIndex,placeholders=new Map,node=meta instanceof Message?meta.nodes.find(function(node){return node instanceof Container}):meta;return node&&node.children.filter(function(child){return child instanceof Placeholder}).forEach(function(child,idx){var content=wrapI18nPlaceholder(startIdx+idx,contextId);updatePlaceholderMap(placeholders,child.name,content)}),placeholders}function formatI18nPlaceholderName(name){var postfix,chunks=toPublicName(name).split("_");if(1===chunks.length)return name.toLowerCase();/^\d+$/.test(chunks[chunks.length-1])&&(postfix=chunks.pop());var raw=chunks.shift().toLowerCase();return chunks.length&&(raw+=chunks.map(function(c){return c.charAt(0).toUpperCase()+c.slice(1).toLowerCase()}).join("")),postfix?raw+"_"+postfix:raw}function getTranslationConstPrefix(extra){return(""+CLOSURE_TRANSLATION_PREFIX+extra).toUpperCase()}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var UNSAFE_OBJECT_KEY_NAME_REGEXP=/-/,TEMPORARY_NAME="_t",CONTEXT_NAME="ctx",RENDER_FLAGS="rf";function temporaryAllocator(statements,name){var temp=null;return function(){return temp||(statements.push(new DeclareVarStmt(TEMPORARY_NAME,void 0,DYNAMIC_TYPE)),temp=variable(name)),temp}}function unsupported(feature){if(this)throw new Error("Builder "+this.constructor.name+" doesn't support "+feature+" yet");throw new Error("Feature "+feature+" is not supported yet")}function invalid$1(arg){throw new Error("Invalid state: Visitor "+this.constructor.name+" doesn't handle "+arg.constructor.name)}function asLiteral(value){return Array.isArray(value)?literalArr(value.map(asLiteral)):literal(value,INFERRED_TYPE)}function conditionallyCreateMapObjectLiteral(keys,keepDeclared){return Object.getOwnPropertyNames(keys).length>0?function mapToExpression(map,keepDeclared){return literalMap(Object.getOwnPropertyNames(map).map(function(key){var _a,_b,declaredName,publicName,minifiedName,value=map[key];return Array.isArray(value)?(publicName=(_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(value,2))[0],declaredName=_a[1]):(declaredName=(_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitAtColon(key,[key,value]),2))[0],publicName=_b[1]),{key:minifiedName=declaredName,quoted:UNSAFE_OBJECT_KEY_NAME_REGEXP.test(minifiedName),value:keepDeclared&&publicName!==declaredName?literalArr([asLiteral(publicName),asLiteral(declaredName)]):asLiteral(publicName)}}))}(keys,keepDeclared):null}function trimTrailingNulls(parameters){for(;(exp=parameters[parameters.length-1])instanceof LiteralExpr&&null===exp.value;)parameters.pop();var exp;return parameters}function getQueryPredicate(query,constantPool){if(Array.isArray(query.predicate)){var predicate_1=[];return query.predicate.forEach(function(selector){var selectors=selector.split(",").map(function(token){return literal(token.trim())});predicate_1.push.apply(predicate_1,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(selectors))}),constantPool.getConstLiteral(literalArr(predicate_1),!0)}return query.predicate}var R3FactoryDelegateType,R3ResolvedDependencyType,DefinitionMap=function(){function DefinitionMap(){this.values=[]}return DefinitionMap.prototype.set=function(key,value){value&&this.values.push({key:key,value:value,quoted:!1})},DefinitionMap.prototype.toLiteralMap=function(){return literalMap(this.values)},DefinitionMap}();function getAttrsForDirectiveMatching(elOrTpl){var attributesMap={};return elOrTpl instanceof Template&&"ng-template"!==elOrTpl.tagName?elOrTpl.templateAttrs.forEach(function(a){return attributesMap[a.name]=""}):(elOrTpl.attributes.forEach(function(a){isI18nAttribute(a.name)||(attributesMap[a.name]=a.value)}),elOrTpl.inputs.forEach(function(i){attributesMap[i.name]=""}),elOrTpl.outputs.forEach(function(o){attributesMap[o.name]=""})),attributesMap}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function compileFactoryFunction(meta){var t=variable("t"),statements=[],typeForCtor=isDelegatedMetadata(meta)?t:new BinaryOperatorExpr(BinaryOperator.Or,t,meta.type),ctorExpr=null;if(null!==meta.deps)"invalid"!==meta.deps&&(ctorExpr=new InstantiateExpr(typeForCtor,injectDependencies(meta.deps,meta.injectFn)));else{var baseFactory=variable("ɵ"+meta.name+"_BaseFactory"),getInheritedFactory=importExpr(Identifiers$1.getInheritedFactory),baseFactoryStmt=baseFactory.set(getInheritedFactory.callFn([meta.type])).toDeclStmt(INFERRED_TYPE,[StmtModifier.Exported,StmtModifier.Final]);statements.push(baseFactoryStmt),ctorExpr=baseFactory.callFn([typeForCtor])}var ctorExprFinal=ctorExpr,body=[],retExpr=null;function makeConditionalFactory(nonCtorExpr){var r=variable("r");body.push(r.set(NULL_EXPR).toDeclStmt());var ctorStmt=null;return ctorStmt=null!==ctorExprFinal?r.set(ctorExprFinal).toStmt():makeErrorStmt(meta.name),body.push(ifStmt(t,[ctorStmt],[r.set(nonCtorExpr).toStmt()])),r}if(isDelegatedMetadata(meta)&&meta.delegateType===R3FactoryDelegateType.Factory){var delegateFactory=variable("ɵ"+meta.name+"_BaseFactory"),getFactoryOf=importExpr(Identifiers$1.getFactoryOf);if(meta.delegate.isEquivalent(meta.type))throw new Error("Illegal state: compiling factory that delegates to itself");var delegateFactoryStmt=delegateFactory.set(getFactoryOf.callFn([meta.delegate])).toDeclStmt(INFERRED_TYPE,[StmtModifier.Exported,StmtModifier.Final]);statements.push(delegateFactoryStmt),retExpr=makeConditionalFactory(delegateFactory.callFn([]))}else if(isDelegatedMetadata(meta)){var delegateArgs=injectDependencies(meta.delegateDeps,meta.injectFn);retExpr=makeConditionalFactory(new(meta.delegateType===R3FactoryDelegateType.Class?InstantiateExpr:InvokeFunctionExpr)(meta.delegate,delegateArgs))}else retExpr=function isExpressionFactoryMetadata(meta){return void 0!==meta.expression}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(meta)?makeConditionalFactory(meta.expression):ctorExpr;return null!==retExpr?body.push(new ReturnStatement(retExpr)):body.push(makeErrorStmt(meta.name)),{factory:fn([new FnParam("t",DYNAMIC_TYPE)],body,INFERRED_TYPE,void 0,meta.name+"_Factory"),statements:statements}}function injectDependencies(deps,injectFn){return deps.map(function(dep){return function compileInjectDependency(dep,injectFn){switch(dep.resolved){case R3ResolvedDependencyType.Token:var flags=0|(dep.self?2:0)|(dep.skipSelf?4:0)|(dep.host?1:0)|(dep.optional?8:0),injectArgs=[dep.token];return(0!==flags||dep.optional)&&injectArgs.push(literal(flags)),importExpr(injectFn).callFn(injectArgs);case R3ResolvedDependencyType.Attribute:return importExpr(Identifiers$1.injectAttribute).callFn([dep.token]);default:return unsupported("Unknown R3ResolvedDependencyType: "+R3ResolvedDependencyType[dep.resolved])}}(dep,injectFn)})}function dependenciesFromGlobalMetadata(type,outputCtx,reflector){reflector.resolveExternalReference(Identifiers.Injector);var e_1,_a,deps=[];try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(type.diDeps),_c=_b.next();!_c.done;_c=_b.next()){var dependency=_c.value;if(dependency.token){var tokenRef=tokenReference(dependency.token),resolved=dependency.isAttribute?R3ResolvedDependencyType.Attribute:R3ResolvedDependencyType.Token,token=tokenRef instanceof StaticSymbol?outputCtx.importExpr(tokenRef):literal(tokenRef);deps.push({token:token,resolved:resolved,host:!!dependency.isHost,optional:!!dependency.isOptional,self:!!dependency.isSelf,skipSelf:!!dependency.isSkipSelf})}else unsupported("dependency without a token")}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}return deps}function makeErrorStmt(name){return new ThrowStmt(new InstantiateExpr(new ReadVarExpr("Error"),[literal(name+" has a constructor which is not compatible with Dependency Injection. It should probably not be @Injectable().")]))}function isDelegatedMetadata(meta){return void 0!==meta.delegateType}function mapToMapExpression(map){return literalMap(Object.keys(map).map(function(key){return{key:key,value:map[key],quoted:!1}}))}function convertMetaToOutput(meta,ctx){if(Array.isArray(meta))return literalArr(meta.map(function(entry){return convertMetaToOutput(entry,ctx)}));if(meta instanceof StaticSymbol)return ctx.importExpr(meta);if(null==meta)return literal(meta);throw new Error("Internal error: Unsupported or unknown metadata: "+meta)}function typeWithParameters(type,numParams){var params=null;if(numParams>0){params=[];for(var i=0;i<numParams;i++)params.push(DYNAMIC_TYPE)}return expressionType(type,null,params)}!function(R3FactoryDelegateType){R3FactoryDelegateType[R3FactoryDelegateType.Class=0]="Class",R3FactoryDelegateType[R3FactoryDelegateType.Function=1]="Function",R3FactoryDelegateType[R3FactoryDelegateType.Factory=2]="Factory"}(R3FactoryDelegateType||(R3FactoryDelegateType={})),function(R3ResolvedDependencyType){R3ResolvedDependencyType[R3ResolvedDependencyType.Token=0]="Token",R3ResolvedDependencyType[R3ResolvedDependencyType.Attribute=1]="Attribute"}(R3ResolvedDependencyType||(R3ResolvedDependencyType={}));var ANIMATE_SYMBOL_PREFIX="@";function prepareSyntheticPropertyName(name){return""+ANIMATE_SYMBOL_PREFIX+name}function prepareSyntheticListenerFunctionName(name,phase){return"animation_"+name+"_"+phase}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function assertArrayOfStrings(identifier,value){if(null!=value){Iif(!Array.isArray(value))throw new Error("Expected '"+identifier+"' to be an array of strings.");for(var i=0;i<value.length;i+=1)Iif("string"!=typeof value[i])throw new Error("Expected '"+identifier+"' to be an array of strings.")}}var UNUSABLE_INTERPOLATION_REGEXPS=[/^\s*$/,/[<>]/,/^[{}]$/,/&(#|[a-z])/i,/^\/\//];function assertInterpolationSymbols(identifier,value){Iif(!(null==value||Array.isArray(value)&&2==value.length))throw new Error("Expected '"+identifier+"' to be an array, [start, end].");Iif(null!=value){var start_1=value[0],end_1=value[1];UNUSABLE_INTERPOLATION_REGEXPS.forEach(function(regexp){if(regexp.test(start_1)||regexp.test(end_1))throw new Error("['"+start_1+"', '"+end_1+"'] contains unusable interpolation symbol.")})}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var InterpolationConfig=function(){function InterpolationConfig(start,end){this.start=start,this.end=end}return InterpolationConfig.fromArray=function(markers){return markers?(assertInterpolationSymbols("interpolation",markers),new InterpolationConfig(markers[0],markers[1])):DEFAULT_INTERPOLATION_CONFIG},InterpolationConfig}(),DEFAULT_INTERPOLATION_CONFIG=new InterpolationConfig("{{","}}"),SourceMapGenerator=function(){function SourceMapGenerator(file){void 0===file&&(file=null),this.file=file,this.sourcesContent=new Map,this.lines=[],this.lastCol0=0,this.hasMappings=!1}return SourceMapGenerator.prototype.addSource=function(url,content){return void 0===content&&(content=null),this.sourcesContent.has(url)||this.sourcesContent.set(url,content),this},SourceMapGenerator.prototype.addLine=function(){return this.lines.push([]),this.lastCol0=0,this},SourceMapGenerator.prototype.addMapping=function(col0,sourceUrl,sourceLine0,sourceCol0){if(!this.currentLine)throw new Error("A line must be added before mappings can be added");if(null!=sourceUrl&&!this.sourcesContent.has(sourceUrl))throw new Error('Unknown source file "'+sourceUrl+'"');if(null==col0)throw new Error("The column in the generated code must be provided");if(col0<this.lastCol0)throw new Error("Mapping should be added in output order");if(sourceUrl&&(null==sourceLine0||null==sourceCol0))throw new Error("The source location must be provided when a source url is provided");return this.hasMappings=!0,this.lastCol0=col0,this.currentLine.push({col0:col0,sourceUrl:sourceUrl,sourceLine0:sourceLine0,sourceCol0:sourceCol0}),this},Object.defineProperty(SourceMapGenerator.prototype,"currentLine",{get:function(){return this.lines.slice(-1)[0]},enumerable:!0,configurable:!0}),SourceMapGenerator.prototype.toJSON=function(){var _this=this;if(!this.hasMappings)return null;var sourcesIndex=new Map,sources=[],sourcesContent=[];Array.from(this.sourcesContent.keys()).forEach(function(url,i){sourcesIndex.set(url,i),sources.push(url),sourcesContent.push(_this.sourcesContent.get(url)||null)});var mappings="",lastCol0=0,lastSourceIndex=0,lastSourceLine0=0,lastSourceCol0=0;return this.lines.forEach(function(segments){lastCol0=0,mappings+=segments.map(function(segment){var segAsStr=toBase64VLQ(segment.col0-lastCol0);return lastCol0=segment.col0,null!=segment.sourceUrl&&(segAsStr+=toBase64VLQ(sourcesIndex.get(segment.sourceUrl)-lastSourceIndex),lastSourceIndex=sourcesIndex.get(segment.sourceUrl),segAsStr+=toBase64VLQ(segment.sourceLine0-lastSourceLine0),lastSourceLine0=segment.sourceLine0,segAsStr+=toBase64VLQ(segment.sourceCol0-lastSourceCol0),lastSourceCol0=segment.sourceCol0),segAsStr}).join(","),mappings+=";"}),mappings=mappings.slice(0,-1),{file:this.file||"",version:3,sourceRoot:"",sources:sources,sourcesContent:sourcesContent,mappings:mappings}},SourceMapGenerator.prototype.toJsComment=function(){return this.hasMappings?"//# sourceMappingURL=data:application/json;base64,"+function toBase64String(value){var b64="";value=utf8Encode(value);for(var i=0;i<value.length;){var i1=value.charCodeAt(i++),i2=value.charCodeAt(i++),i3=value.charCodeAt(i++);b64+=toBase64Digit(i1>>2),b64+=toBase64Digit((3&i1)<<4|(isNaN(i2)?0:i2>>4)),b64+=isNaN(i2)?"=":toBase64Digit((15&i2)<<2|i3>>6),b64+=isNaN(i2)||isNaN(i3)?"=":toBase64Digit(63&i3)}return b64}(JSON.stringify(this,null,0)):""},SourceMapGenerator}();function toBase64VLQ(value){value=value<0?1+(-value<<1):value<<1;var out="";do{var digit=31&value;(value>>=5)>0&&(digit|=32),out+=toBase64Digit(digit)}while(value>0);return out}var B64_DIGITS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function toBase64Digit(value){if(value<0||value>=64)throw new Error("Can only encode value in the range [0, 63]");return B64_DIGITS[value]}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var _SINGLE_QUOTE_ESCAPE_STRING_RE=/'|\\|\n|\r|\$/g,_LEGAL_IDENTIFIER_RE=/^[$A-Z_][0-9A-Z_$]*$/i,_INDENT_WITH="  ",CATCH_ERROR_VAR$1=variable("error",null,null),CATCH_STACK_VAR$1=variable("stack",null,null),_EmittedLine=function _EmittedLine(indent){this.indent=indent,this.partsLength=0,this.parts=[],this.srcSpans=[]},EmitterVisitorContext=function(){function EmitterVisitorContext(_indent){this._indent=_indent,this._classes=[],this._preambleLineCount=0,this._lines=[new _EmittedLine(_indent)]}return EmitterVisitorContext.createRoot=function(){return new EmitterVisitorContext(0)},Object.defineProperty(EmitterVisitorContext.prototype,"_currentLine",{get:function(){return this._lines[this._lines.length-1]},enumerable:!0,configurable:!0}),EmitterVisitorContext.prototype.println=function(from,lastPart){void 0===lastPart&&(lastPart=""),this.print(from||null,lastPart,!0)},EmitterVisitorContext.prototype.lineIsEmpty=function(){return 0===this._currentLine.parts.length},EmitterVisitorContext.prototype.lineLength=function(){return this._currentLine.indent*_INDENT_WITH.length+this._currentLine.partsLength},EmitterVisitorContext.prototype.print=function(from,part,newLine){void 0===newLine&&(newLine=!1),part.length>0&&(this._currentLine.parts.push(part),this._currentLine.partsLength+=part.length,this._currentLine.srcSpans.push(from&&from.sourceSpan||null)),newLine&&this._lines.push(new _EmittedLine(this._indent))},EmitterVisitorContext.prototype.removeEmptyLastLine=function(){this.lineIsEmpty()&&this._lines.pop()},EmitterVisitorContext.prototype.incIndent=function(){this._indent++,this.lineIsEmpty()&&(this._currentLine.indent=this._indent)},EmitterVisitorContext.prototype.decIndent=function(){this._indent--,this.lineIsEmpty()&&(this._currentLine.indent=this._indent)},EmitterVisitorContext.prototype.pushClass=function(clazz){this._classes.push(clazz)},EmitterVisitorContext.prototype.popClass=function(){return this._classes.pop()},Object.defineProperty(EmitterVisitorContext.prototype,"currentClass",{get:function(){return this._classes.length>0?this._classes[this._classes.length-1]:null},enumerable:!0,configurable:!0}),EmitterVisitorContext.prototype.toSource=function(){return this.sourceLines.map(function(l){return l.parts.length>0?_createIndent(l.indent)+l.parts.join(""):""}).join("\n")},EmitterVisitorContext.prototype.toSourceMapGenerator=function(genFilePath,startsAtLine){void 0===startsAtLine&&(startsAtLine=0);for(var map=new SourceMapGenerator(genFilePath),firstOffsetMapped=!1,mapFirstOffsetIfNeeded=function(){firstOffsetMapped||(map.addSource(genFilePath," ").addMapping(0,genFilePath,0,0),firstOffsetMapped=!0)},i=0;i<startsAtLine;i++)map.addLine(),mapFirstOffsetIfNeeded();return this.sourceLines.forEach(function(line,lineIdx){map.addLine();for(var spans=line.srcSpans,parts=line.parts,col0=line.indent*_INDENT_WITH.length,spanIdx=0;spanIdx<spans.length&&!spans[spanIdx];)col0+=parts[spanIdx].length,spanIdx++;for(spanIdx<spans.length&&0===lineIdx&&0===col0?firstOffsetMapped=!0:mapFirstOffsetIfNeeded();spanIdx<spans.length;){var span=spans[spanIdx],source=span.start.file,sourceLine=span.start.line,sourceCol=span.start.col;for(map.addSource(source.url,source.content).addMapping(col0,source.url,sourceLine,sourceCol),col0+=parts[spanIdx].length,spanIdx++;spanIdx<spans.length&&(span===spans[spanIdx]||!spans[spanIdx]);)col0+=parts[spanIdx].length,spanIdx++}}),map},EmitterVisitorContext.prototype.setPreambleLineCount=function(count){return this._preambleLineCount=count},EmitterVisitorContext.prototype.spanOf=function(line,column){var emittedLine=this._lines[line-this._preambleLineCount];if(emittedLine)for(var columnsLeft=column-_createIndent(emittedLine.indent).length,partIndex=0;partIndex<emittedLine.parts.length;partIndex++){var part=emittedLine.parts[partIndex];if(part.length>columnsLeft)return emittedLine.srcSpans[partIndex];columnsLeft-=part.length}return null},Object.defineProperty(EmitterVisitorContext.prototype,"sourceLines",{get:function(){return this._lines.length&&0===this._lines[this._lines.length-1].parts.length?this._lines.slice(0,-1):this._lines},enumerable:!0,configurable:!0}),EmitterVisitorContext}(),AbstractEmitterVisitor=function(){function AbstractEmitterVisitor(_escapeDollarInStrings){this._escapeDollarInStrings=_escapeDollarInStrings}return AbstractEmitterVisitor.prototype.visitExpressionStmt=function(stmt,ctx){return stmt.expr.visitExpression(this,ctx),ctx.println(stmt,";"),null},AbstractEmitterVisitor.prototype.visitReturnStmt=function(stmt,ctx){return ctx.print(stmt,"return "),stmt.value.visitExpression(this,ctx),ctx.println(stmt,";"),null},AbstractEmitterVisitor.prototype.visitIfStmt=function(stmt,ctx){ctx.print(stmt,"if ("),stmt.condition.visitExpression(this,ctx),ctx.print(stmt,") {");var hasElseCase=null!=stmt.falseCase&&stmt.falseCase.length>0;return stmt.trueCase.length<=1&&!hasElseCase?(ctx.print(stmt," "),this.visitAllStatements(stmt.trueCase,ctx),ctx.removeEmptyLastLine(),ctx.print(stmt," ")):(ctx.println(),ctx.incIndent(),this.visitAllStatements(stmt.trueCase,ctx),ctx.decIndent(),hasElseCase&&(ctx.println(stmt,"} else {"),ctx.incIndent(),this.visitAllStatements(stmt.falseCase,ctx),ctx.decIndent())),ctx.println(stmt,"}"),null},AbstractEmitterVisitor.prototype.visitThrowStmt=function(stmt,ctx){return ctx.print(stmt,"throw "),stmt.error.visitExpression(this,ctx),ctx.println(stmt,";"),null},AbstractEmitterVisitor.prototype.visitCommentStmt=function(stmt,ctx){return stmt.multiline?ctx.println(stmt,"/* "+stmt.comment+" */"):stmt.comment.split("\n").forEach(function(line){ctx.println(stmt,"// "+line)}),null},AbstractEmitterVisitor.prototype.visitJSDocCommentStmt=function(stmt,ctx){return ctx.println(stmt,"/*"+stmt.toString()+"*/"),null},AbstractEmitterVisitor.prototype.visitWriteVarExpr=function(expr,ctx){var lineWasEmpty=ctx.lineIsEmpty();return lineWasEmpty||ctx.print(expr,"("),ctx.print(expr,expr.name+" = "),expr.value.visitExpression(this,ctx),lineWasEmpty||ctx.print(expr,")"),null},AbstractEmitterVisitor.prototype.visitWriteKeyExpr=function(expr,ctx){var lineWasEmpty=ctx.lineIsEmpty();return lineWasEmpty||ctx.print(expr,"("),expr.receiver.visitExpression(this,ctx),ctx.print(expr,"["),expr.index.visitExpression(this,ctx),ctx.print(expr,"] = "),expr.value.visitExpression(this,ctx),lineWasEmpty||ctx.print(expr,")"),null},AbstractEmitterVisitor.prototype.visitWritePropExpr=function(expr,ctx){var lineWasEmpty=ctx.lineIsEmpty();return lineWasEmpty||ctx.print(expr,"("),expr.receiver.visitExpression(this,ctx),ctx.print(expr,"."+expr.name+" = "),expr.value.visitExpression(this,ctx),lineWasEmpty||ctx.print(expr,")"),null},AbstractEmitterVisitor.prototype.visitInvokeMethodExpr=function(expr,ctx){expr.receiver.visitExpression(this,ctx);var name=expr.name;return null!=expr.builtin&&null==(name=this.getBuiltinMethodName(expr.builtin))?null:(ctx.print(expr,"."+name+"("),this.visitAllExpressions(expr.args,ctx,","),ctx.print(expr,")"),null)},AbstractEmitterVisitor.prototype.visitInvokeFunctionExpr=function(expr,ctx){return expr.fn.visitExpression(this,ctx),ctx.print(expr,"("),this.visitAllExpressions(expr.args,ctx,","),ctx.print(expr,")"),null},AbstractEmitterVisitor.prototype.visitWrappedNodeExpr=function(ast,ctx){throw new Error("Abstract emitter cannot visit WrappedNodeExpr.")},AbstractEmitterVisitor.prototype.visitTypeofExpr=function(expr,ctx){ctx.print(expr,"typeof "),expr.expr.visitExpression(this,ctx)},AbstractEmitterVisitor.prototype.visitReadVarExpr=function(ast,ctx){var varName=ast.name;Iif(null!=ast.builtin)switch(ast.builtin){case BuiltinVar.Super:varName="super";break;case BuiltinVar.This:varName="this";break;case BuiltinVar.CatchError:varName=CATCH_ERROR_VAR$1.name;break;case BuiltinVar.CatchStack:varName=CATCH_STACK_VAR$1.name;break;default:throw new Error("Unknown builtin variable "+ast.builtin)}return ctx.print(ast,varName),null},AbstractEmitterVisitor.prototype.visitInstantiateExpr=function(ast,ctx){return ctx.print(ast,"new "),ast.classExpr.visitExpression(this,ctx),ctx.print(ast,"("),this.visitAllExpressions(ast.args,ctx,","),ctx.print(ast,")"),null},AbstractEmitterVisitor.prototype.visitLiteralExpr=function(ast,ctx){var value=ast.value;return"string"==typeof value?ctx.print(ast,escapeIdentifier(value,this._escapeDollarInStrings)):ctx.print(ast,""+value),null},AbstractEmitterVisitor.prototype.visitConditionalExpr=function(ast,ctx){return ctx.print(ast,"("),ast.condition.visitExpression(this,ctx),ctx.print(ast,"? "),ast.trueCase.visitExpression(this,ctx),ctx.print(ast,": "),ast.falseCase.visitExpression(this,ctx),ctx.print(ast,")"),null},AbstractEmitterVisitor.prototype.visitNotExpr=function(ast,ctx){return ctx.print(ast,"!"),ast.condition.visitExpression(this,ctx),null},AbstractEmitterVisitor.prototype.visitAssertNotNullExpr=function(ast,ctx){return ast.condition.visitExpression(this,ctx),null},AbstractEmitterVisitor.prototype.visitBinaryOperatorExpr=function(ast,ctx){var opStr;switch(ast.operator){case BinaryOperator.Equals:opStr="==";break;case BinaryOperator.Identical:opStr="===";break;case BinaryOperator.NotEquals:opStr="!=";break;case BinaryOperator.NotIdentical:opStr="!==";break;case BinaryOperator.And:opStr="&&";break;case BinaryOperator.BitwiseAnd:opStr="&";break;case BinaryOperator.Or:opStr="||";break;case BinaryOperator.Plus:opStr="+";break;case BinaryOperator.Minus:opStr="-";break;case BinaryOperator.Divide:opStr="/";break;case BinaryOperator.Multiply:opStr="*";break;case BinaryOperator.Modulo:opStr="%";break;case BinaryOperator.Lower:opStr="<";break;case BinaryOperator.LowerEquals:opStr="<=";break;case BinaryOperator.Bigger:opStr=">";break;case BinaryOperator.BiggerEquals:opStr=">=";break;default:throw new Error("Unknown operator "+ast.operator)}return ast.parens&&ctx.print(ast,"("),ast.lhs.visitExpression(this,ctx),ctx.print(ast," "+opStr+" "),ast.rhs.visitExpression(this,ctx),ast.parens&&ctx.print(ast,")"),null},AbstractEmitterVisitor.prototype.visitReadPropExpr=function(ast,ctx){return ast.receiver.visitExpression(this,ctx),ctx.print(ast,"."),ctx.print(ast,ast.name),null},AbstractEmitterVisitor.prototype.visitReadKeyExpr=function(ast,ctx){return ast.receiver.visitExpression(this,ctx),ctx.print(ast,"["),ast.index.visitExpression(this,ctx),ctx.print(ast,"]"),null},AbstractEmitterVisitor.prototype.visitLiteralArrayExpr=function(ast,ctx){return ctx.print(ast,"["),this.visitAllExpressions(ast.entries,ctx,","),ctx.print(ast,"]"),null},AbstractEmitterVisitor.prototype.visitLiteralMapExpr=function(ast,ctx){var _this=this;return ctx.print(ast,"{"),this.visitAllObjects(function(entry){ctx.print(ast,escapeIdentifier(entry.key,_this._escapeDollarInStrings,entry.quoted)+":"),entry.value.visitExpression(_this,ctx)},ast.entries,ctx,","),ctx.print(ast,"}"),null},AbstractEmitterVisitor.prototype.visitCommaExpr=function(ast,ctx){return ctx.print(ast,"("),this.visitAllExpressions(ast.parts,ctx,","),ctx.print(ast,")"),null},AbstractEmitterVisitor.prototype.visitAllExpressions=function(expressions,ctx,separator){var _this=this;this.visitAllObjects(function(expr){return expr.visitExpression(_this,ctx)},expressions,ctx,separator)},AbstractEmitterVisitor.prototype.visitAllObjects=function(handler,expressions,ctx,separator){for(var incrementedIndent=!1,i=0;i<expressions.length;i++)i>0&&(ctx.lineLength()>80?(ctx.print(null,separator,!0),incrementedIndent||(ctx.incIndent(),ctx.incIndent(),incrementedIndent=!0)):ctx.print(null,separator,!1)),handler(expressions[i]);incrementedIndent&&(ctx.decIndent(),ctx.decIndent())},AbstractEmitterVisitor.prototype.visitAllStatements=function(statements,ctx){var _this=this;statements.forEach(function(stmt){return stmt.visitStatement(_this,ctx)})},AbstractEmitterVisitor}();function escapeIdentifier(input,escapeDollar,alwaysQuote){Iif(void 0===alwaysQuote&&(alwaysQuote=!0),null==input)return null;var body=input.replace(_SINGLE_QUOTE_ESCAPE_STRING_RE,function(){for(var match=[],_i=0;_i<arguments.length;_i++)match[_i]=arguments[_i];return"$"==match[0]?escapeDollar?"\\$":"$":"\n"==match[0]?"\\n":"\r"==match[0]?"\\r":"\\"+match[0]});return alwaysQuote||!_LEGAL_IDENTIFIER_RE.test(body)?"'"+body+"'":body}function _createIndent(count){for(var res="",i=0;i<count;i++)res+=_INDENT_WITH;return res}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var AbstractJsEmitterVisitor=function(_super){function AbstractJsEmitterVisitor(){return _super.call(this,!1)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(AbstractJsEmitterVisitor,_super),AbstractJsEmitterVisitor.prototype.visitDeclareClassStmt=function(stmt,ctx){var _this=this;return ctx.pushClass(stmt),this._visitClassConstructor(stmt,ctx),null!=stmt.parent&&(ctx.print(stmt,stmt.name+".prototype = Object.create("),stmt.parent.visitExpression(this,ctx),ctx.println(stmt,".prototype);")),stmt.getters.forEach(function(getter){return _this._visitClassGetter(stmt,getter,ctx)}),stmt.methods.forEach(function(method){return _this._visitClassMethod(stmt,method,ctx)}),ctx.popClass(),null},AbstractJsEmitterVisitor.prototype._visitClassConstructor=function(stmt,ctx){ctx.print(stmt,"function "+stmt.name+"("),null!=stmt.constructorMethod&&this._visitParams(stmt.constructorMethod.params,ctx),ctx.println(stmt,") {"),ctx.incIndent(),null!=stmt.constructorMethod&&stmt.constructorMethod.body.length>0&&(ctx.println(stmt,"var self = this;"),this.visitAllStatements(stmt.constructorMethod.body,ctx)),ctx.decIndent(),ctx.println(stmt,"}")},AbstractJsEmitterVisitor.prototype._visitClassGetter=function(stmt,getter,ctx){ctx.println(stmt,"Object.defineProperty("+stmt.name+".prototype, '"+getter.name+"', { get: function() {"),ctx.incIndent(),getter.body.length>0&&(ctx.println(stmt,"var self = this;"),this.visitAllStatements(getter.body,ctx)),ctx.decIndent(),ctx.println(stmt,"}});")},AbstractJsEmitterVisitor.prototype._visitClassMethod=function(stmt,method,ctx){ctx.print(stmt,stmt.name+".prototype."+method.name+" = function("),this._visitParams(method.params,ctx),ctx.println(stmt,") {"),ctx.incIndent(),method.body.length>0&&(ctx.println(stmt,"var self = this;"),this.visitAllStatements(method.body,ctx)),ctx.decIndent(),ctx.println(stmt,"};")},AbstractJsEmitterVisitor.prototype.visitWrappedNodeExpr=function(ast,ctx){throw new Error("Cannot emit a WrappedNodeExpr in Javascript.")},AbstractJsEmitterVisitor.prototype.visitReadVarExpr=function(ast,ctx){Iif(ast.builtin===BuiltinVar.This)ctx.print(ast,"self");else{Iif(ast.builtin===BuiltinVar.Super)throw new Error("'super' needs to be handled at a parent ast node, not at the variable level!");_super.prototype.visitReadVarExpr.call(this,ast,ctx)}return null},AbstractJsEmitterVisitor.prototype.visitDeclareVarStmt=function(stmt,ctx){return ctx.print(stmt,"var "+stmt.name),stmt.value&&(ctx.print(stmt," = "),stmt.value.visitExpression(this,ctx)),ctx.println(stmt,";"),null},AbstractJsEmitterVisitor.prototype.visitCastExpr=function(ast,ctx){return ast.value.visitExpression(this,ctx),null},AbstractJsEmitterVisitor.prototype.visitInvokeFunctionExpr=function(expr,ctx){var fnExpr=expr.fn;return fnExpr instanceof ReadVarExpr&&fnExpr.builtin===BuiltinVar.Super?(ctx.currentClass.parent.visitExpression(this,ctx),ctx.print(expr,".call(this"),expr.args.length>0&&(ctx.print(expr,", "),this.visitAllExpressions(expr.args,ctx,",")),ctx.print(expr,")")):_super.prototype.visitInvokeFunctionExpr.call(this,expr,ctx),null},AbstractJsEmitterVisitor.prototype.visitFunctionExpr=function(ast,ctx){return ctx.print(ast,"function"+(ast.name?" "+ast.name:"")+"("),this._visitParams(ast.params,ctx),ctx.println(ast,") {"),ctx.incIndent(),this.visitAllStatements(ast.statements,ctx),ctx.decIndent(),ctx.print(ast,"}"),null},AbstractJsEmitterVisitor.prototype.visitDeclareFunctionStmt=function(stmt,ctx){return ctx.print(stmt,"function "+stmt.name+"("),this._visitParams(stmt.params,ctx),ctx.println(stmt,") {"),ctx.incIndent(),this.visitAllStatements(stmt.statements,ctx),ctx.decIndent(),ctx.println(stmt,"}"),null},AbstractJsEmitterVisitor.prototype.visitTryCatchStmt=function(stmt,ctx){ctx.println(stmt,"try {"),ctx.incIndent(),this.visitAllStatements(stmt.bodyStmts,ctx),ctx.decIndent(),ctx.println(stmt,"} catch ("+CATCH_ERROR_VAR$1.name+") {"),ctx.incIndent();var catchStmts=[CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop("stack")).toDeclStmt(null,[StmtModifier.Final])].concat(stmt.catchStmts);return this.visitAllStatements(catchStmts,ctx),ctx.decIndent(),ctx.println(stmt,"}"),null},AbstractJsEmitterVisitor.prototype._visitParams=function(params,ctx){this.visitAllObjects(function(param){return ctx.print(null,param.name)},params,ctx,",")},AbstractJsEmitterVisitor.prototype.getBuiltinMethodName=function(method){var name;switch(method){case BuiltinMethod.ConcatArray:name="concat";break;case BuiltinMethod.SubscribeObservable:name="subscribe";break;case BuiltinMethod.Bind:name="bind";break;default:throw new Error("Unknown builtin method: "+method)}return name},AbstractJsEmitterVisitor}(AbstractEmitterVisitor),JitEvaluator=function(){function JitEvaluator(){}return JitEvaluator.prototype.evaluateStatements=function(sourceUrl,statements,reflector,createSourceMaps){var converter=new JitEmitterVisitor(reflector),ctx=EmitterVisitorContext.createRoot();return statements.length>0&&!function isUseStrictStatement(statement){return statement.isEquivalent(literal("use strict").toStmt())}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(statements[0])&&(statements=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([literal("use strict").toStmt()],statements)),converter.visitAllStatements(statements,ctx),converter.createReturnStmt(ctx),this.evaluateCode(sourceUrl,ctx,converter.getArgs(),createSourceMaps)},JitEvaluator.prototype.evaluateCode=function(sourceUrl,ctx,vars,createSourceMap){var fnBody=ctx.toSource()+"\n//# sourceURL="+sourceUrl,fnArgNames=[],fnArgValues=[];for(var argName in vars)fnArgValues.push(vars[argName]),fnArgNames.push(argName);Iif(createSourceMap){var emptyFn=(new(Function.bind.apply(Function,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],fnArgNames.concat("return null;"))))).toString(),headerLines=emptyFn.slice(0,emptyFn.indexOf("return null;")).split("\n").length-1;fnBody+="\n"+ctx.toSourceMapGenerator(sourceUrl,headerLines).toJsComment()}var fn=new(Function.bind.apply(Function,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],fnArgNames.concat(fnBody))));return this.executeFunction(fn,fnArgValues)},JitEvaluator.prototype.executeFunction=function(fn,args){return fn.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(args))},JitEvaluator}(),JitEmitterVisitor=function(_super){function JitEmitterVisitor(reflector){var _this=_super.call(this)||this;return _this.reflector=reflector,_this._evalArgNames=[],_this._evalArgValues=[],_this._evalExportedVars=[],_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(JitEmitterVisitor,_super),JitEmitterVisitor.prototype.createReturnStmt=function(ctx){new ReturnStatement(new LiteralMapExpr(this._evalExportedVars.map(function(resultVar){return new LiteralMapEntry(resultVar,variable(resultVar),!1)}))).visitStatement(this,ctx)},JitEmitterVisitor.prototype.getArgs=function(){for(var result={},i=0;i<this._evalArgNames.length;i++)result[this._evalArgNames[i]]=this._evalArgValues[i];return result},JitEmitterVisitor.prototype.visitExternalExpr=function(ast,ctx){return this._emitReferenceToExternal(ast,this.reflector.resolveExternalReference(ast.value),ctx),null},JitEmitterVisitor.prototype.visitWrappedNodeExpr=function(ast,ctx){return this._emitReferenceToExternal(ast,ast.node,ctx),null},JitEmitterVisitor.prototype.visitDeclareVarStmt=function(stmt,ctx){return stmt.hasModifier(StmtModifier.Exported)&&this._evalExportedVars.push(stmt.name),_super.prototype.visitDeclareVarStmt.call(this,stmt,ctx)},JitEmitterVisitor.prototype.visitDeclareFunctionStmt=function(stmt,ctx){return stmt.hasModifier(StmtModifier.Exported)&&this._evalExportedVars.push(stmt.name),_super.prototype.visitDeclareFunctionStmt.call(this,stmt,ctx)},JitEmitterVisitor.prototype.visitDeclareClassStmt=function(stmt,ctx){return stmt.hasModifier(StmtModifier.Exported)&&this._evalExportedVars.push(stmt.name),_super.prototype.visitDeclareClassStmt.call(this,stmt,ctx)},JitEmitterVisitor.prototype._emitReferenceToExternal=function(ast,value,ctx){var id=this._evalArgValues.indexOf(value);if(-1===id){id=this._evalArgValues.length,this._evalArgValues.push(value);var name_1=identifierName({reference:value})||"val";this._evalArgNames.push("jit_"+name_1+"_"+id)}ctx.print(ast,this._evalArgNames[id])},JitEmitterVisitor}(AbstractJsEmitterVisitor);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var $EOF=0,$TAB=9,$LF=10,$VTAB=11,$FF=12,$CR=13,$SPACE=32,$DQ=34,$$=36,$SQ=39,$PLUS=43,$MINUS=45,$SLASH=47,$SEMICOLON=59,$EQ=61,$GT=62,$0=48,$7=55,$9=57,$A=65,$E=69,$F=70,$Z=90,$_=95,$a=97,$e=101,$f=102,$n=110,$r=114,$t=116,$v=118,$z=122,$NBSP=160,$BT=96;function isWhitespace(code){return code>=$TAB&&code<=$SPACE||code==$NBSP}function isDigit(code){return $0<=code&&code<=$9}function isAsciiLetter(code){return code>=$a&&code<=$z||code>=$A&&code<=$Z}function isNewLine(code){return code===$LF||code===$CR}function isOctalDigit(code){return $0<=code&&code<=$7}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ParseErrorLevel,ParseLocation=function(){function ParseLocation(file,offset,line,col){this.file=file,this.offset=offset,this.line=line,this.col=col}return ParseLocation.prototype.toString=function(){return null!=this.offset?this.file.url+"@"+this.line+":"+this.col:this.file.url},ParseLocation.prototype.moveBy=function(delta){for(var source=this.file.content,len=source.length,offset=this.offset,line=this.line,col=this.col;offset>0&&delta<0;){if(offset--,delta++,(ch=source.charCodeAt(offset))==$LF){line--;var priorLine=source.substr(0,offset-1).lastIndexOf(String.fromCharCode($LF));col=priorLine>0?offset-priorLine:offset}else col--}for(;offset<len&&delta>0;){var ch=source.charCodeAt(offset);offset++,delta--,ch==$LF?(line++,col=0):col++}return new ParseLocation(this.file,offset,line,col)},ParseLocation.prototype.getContext=function(maxChars,maxLines){var content=this.file.content,startOffset=this.offset;if(null!=startOffset){startOffset>content.length-1&&(startOffset=content.length-1);for(var endOffset=startOffset,ctxChars=0,ctxLines=0;ctxChars<maxChars&&startOffset>0&&(ctxChars++,"\n"!=content[--startOffset]||++ctxLines!=maxLines););for(ctxChars=0,ctxLines=0;ctxChars<maxChars&&endOffset<content.length-1&&(ctxChars++,"\n"!=content[++endOffset]||++ctxLines!=maxLines););return{before:content.substring(startOffset,this.offset),after:content.substring(this.offset,endOffset+1)}}return null},ParseLocation}(),ParseSourceFile=function ParseSourceFile(content,url){this.content=content,this.url=url},ParseSourceSpan=function(){function ParseSourceSpan(start,end,details){void 0===details&&(details=null),this.start=start,this.end=end,this.details=details}return ParseSourceSpan.prototype.toString=function(){return this.start.file.content.substring(this.start.offset,this.end.offset)},ParseSourceSpan}();!function(ParseErrorLevel){ParseErrorLevel[ParseErrorLevel.WARNING=0]="WARNING",ParseErrorLevel[ParseErrorLevel.ERROR=1]="ERROR"}(ParseErrorLevel||(ParseErrorLevel={}));var ParseError=function(){function ParseError(span,msg,level){void 0===level&&(level=ParseErrorLevel.ERROR),this.span=span,this.msg=msg,this.level=level}return ParseError.prototype.contextualMessage=function(){var ctx=this.span.start.getContext(100,3);return ctx?this.msg+' ("'+ctx.before+"["+ParseErrorLevel[this.level]+" ->]"+ctx.after+'")':this.msg},ParseError.prototype.toString=function(){var details=this.span.details?", "+this.span.details:"";return this.contextualMessage()+": "+this.span.start+details},ParseError}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var R3JitReflector=function(){function R3JitReflector(context){this.context=context}return R3JitReflector.prototype.resolveExternalReference=function(ref){if("@angular/core"!==ref.moduleName)throw new Error("Cannot resolve external reference to "+ref.moduleName+", only references to @angular/core are supported.");if(!this.context.hasOwnProperty(ref.name))throw new Error("No value provided for @angular/core symbol '"+ref.name+"'.");return this.context[ref.name]},R3JitReflector.prototype.parameters=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.annotations=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.shallowAnnotations=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.tryAnnotations=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.propMetadata=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.hasLifecycleHook=function(type,lcProperty){throw new Error("Not implemented.")},R3JitReflector.prototype.guards=function(typeOrFunc){throw new Error("Not implemented.")},R3JitReflector.prototype.componentModuleUrl=function(type,cmpMetadata){throw new Error("Not implemented.")},R3JitReflector}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function compileNgModule(meta){var moduleType=meta.type,bootstrap=meta.bootstrap,declarations=meta.declarations,imports=meta.imports,exports=meta.exports,schemas=meta.schemas,containsForwardDecls=meta.containsForwardDecls,emitInline=meta.emitInline,additionalStatements=[],definitionMap={type:moduleType};if(bootstrap.length&&(definitionMap.bootstrap=refsToArray(bootstrap,containsForwardDecls)),emitInline)declarations.length&&(definitionMap.declarations=refsToArray(declarations,containsForwardDecls)),imports.length&&(definitionMap.imports=refsToArray(imports,containsForwardDecls)),exports.length&&(definitionMap.exports=refsToArray(exports,containsForwardDecls));else{var setNgModuleScopeCall=function generateSetNgModuleScopeCall(meta){var moduleType=meta.type,declarations=meta.declarations,imports=meta.imports,exports=meta.exports,containsForwardDecls=meta.containsForwardDecls,scopeMap={};declarations.length&&(scopeMap.declarations=refsToArray(declarations,containsForwardDecls));imports.length&&(scopeMap.imports=refsToArray(imports,containsForwardDecls));exports.length&&(scopeMap.exports=refsToArray(exports,containsForwardDecls));if(0===Object.keys(scopeMap).length)return null;return new InvokeFunctionExpr(importExpr(Identifiers$1.setNgModuleScope),[moduleType,mapToMapExpression(scopeMap)],void 0,void 0,!0).toStmt()}(meta);null!==setNgModuleScopeCall&&additionalStatements.push(setNgModuleScopeCall)}return schemas&&schemas.length&&(definitionMap.schemas=literalArr(schemas.map(function(ref){return ref.value}))),{expression:importExpr(Identifiers$1.defineNgModule).callFn([mapToMapExpression(definitionMap)]),type:new ExpressionType(importExpr(Identifiers$1.NgModuleDefWithMeta,[new ExpressionType(moduleType),tupleTypeOf(declarations),tupleTypeOf(imports),tupleTypeOf(exports)])),additionalStatements:additionalStatements}}function tupleTypeOf(exp){var types=exp.map(function(ref){return function typeofExpr(expr){return new TypeofExpr(expr)}(ref.type)});return exp.length>0?expressionType(literalArr(types)):NONE_TYPE}function refsToArray(refs,shouldForwardDeclare){var values=literalArr(refs.map(function(ref){return ref.value}));return shouldForwardDeclare?fn([],[new ReturnStatement(values)]):values}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function compilePipeFromMetadata(metadata){var definitionMapValues=[];definitionMapValues.push({key:"name",value:literal(metadata.pipeName),quoted:!1}),definitionMapValues.push({key:"type",value:metadata.type,quoted:!1});var templateFactory=compileFactoryFunction({name:metadata.name,type:metadata.type,deps:metadata.deps,injectFn:Identifiers$1.directiveInject});return definitionMapValues.push({key:"factory",value:templateFactory.factory,quoted:!1}),definitionMapValues.push({key:"pure",value:literal(metadata.pure),quoted:!1}),{expression:importExpr(Identifiers$1.definePipe).callFn([literalMap(definitionMapValues)]),type:new ExpressionType(importExpr(Identifiers$1.PipeDefWithMeta,[typeWithParameters(metadata.type,metadata.typeArgumentCount),new ExpressionType(new LiteralExpr(metadata.pipeName))])),statements:templateFactory.statements}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ParserError=function ParserError(message,input,errLocation,ctxLocation){this.input=input,this.errLocation=errLocation,this.ctxLocation=ctxLocation,this.message="Parser Error: "+message+" "+errLocation+" ["+input+"] in "+ctxLocation},ParseSpan=function ParseSpan(start,end){this.start=start,this.end=end},AST=function(){function AST(span){this.span=span}return AST.prototype.visit=function(visitor,context){return void 0===context&&(context=null),null},AST.prototype.toString=function(){return"AST"},AST}(),Quote=function(_super){function Quote(span,prefix,uninterpretedExpression,location){var _this=_super.call(this,span)||this;return _this.prefix=prefix,_this.uninterpretedExpression=uninterpretedExpression,_this.location=location,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Quote,_super),Quote.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitQuote(this,context)},Quote.prototype.toString=function(){return"Quote"},Quote}(AST),EmptyExpr=function(_super){function EmptyExpr(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(EmptyExpr,_super),EmptyExpr.prototype.visit=function(visitor,context){void 0===context&&(context=null)},EmptyExpr}(AST),ImplicitReceiver=function(_super){function ImplicitReceiver(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ImplicitReceiver,_super),ImplicitReceiver.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitImplicitReceiver(this,context)},ImplicitReceiver}(AST),Chain=function(_super){function Chain(span,expressions){var _this=_super.call(this,span)||this;return _this.expressions=expressions,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Chain,_super),Chain.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitChain(this,context)},Chain}(AST),Conditional=function(_super){function Conditional(span,condition,trueExp,falseExp){var _this=_super.call(this,span)||this;return _this.condition=condition,_this.trueExp=trueExp,_this.falseExp=falseExp,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Conditional,_super),Conditional.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitConditional(this,context)},Conditional}(AST),PropertyRead=function(_super){function PropertyRead(span,receiver,name){var _this=_super.call(this,span)||this;return _this.receiver=receiver,_this.name=name,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(PropertyRead,_super),PropertyRead.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitPropertyRead(this,context)},PropertyRead}(AST),PropertyWrite=function(_super){function PropertyWrite(span,receiver,name,value){var _this=_super.call(this,span)||this;return _this.receiver=receiver,_this.name=name,_this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(PropertyWrite,_super),PropertyWrite.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitPropertyWrite(this,context)},PropertyWrite}(AST),SafePropertyRead=function(_super){function SafePropertyRead(span,receiver,name){var _this=_super.call(this,span)||this;return _this.receiver=receiver,_this.name=name,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(SafePropertyRead,_super),SafePropertyRead.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitSafePropertyRead(this,context)},SafePropertyRead}(AST),KeyedRead=function(_super){function KeyedRead(span,obj,key){var _this=_super.call(this,span)||this;return _this.obj=obj,_this.key=key,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(KeyedRead,_super),KeyedRead.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitKeyedRead(this,context)},KeyedRead}(AST),KeyedWrite=function(_super){function KeyedWrite(span,obj,key,value){var _this=_super.call(this,span)||this;return _this.obj=obj,_this.key=key,_this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(KeyedWrite,_super),KeyedWrite.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitKeyedWrite(this,context)},KeyedWrite}(AST),BindingPipe=function(_super){function BindingPipe(span,exp,name,args){var _this=_super.call(this,span)||this;return _this.exp=exp,_this.name=name,_this.args=args,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(BindingPipe,_super),BindingPipe.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitPipe(this,context)},BindingPipe}(AST),LiteralPrimitive=function(_super){function LiteralPrimitive(span,value){var _this=_super.call(this,span)||this;return _this.value=value,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralPrimitive,_super),LiteralPrimitive.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitLiteralPrimitive(this,context)},LiteralPrimitive}(AST),LiteralArray=function(_super){function LiteralArray(span,expressions){var _this=_super.call(this,span)||this;return _this.expressions=expressions,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralArray,_super),LiteralArray.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitLiteralArray(this,context)},LiteralArray}(AST),LiteralMap=function(_super){function LiteralMap(span,keys,values){var _this=_super.call(this,span)||this;return _this.keys=keys,_this.values=values,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(LiteralMap,_super),LiteralMap.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitLiteralMap(this,context)},LiteralMap}(AST),Interpolation=function(_super){function Interpolation(span,strings,expressions){var _this=_super.call(this,span)||this;return _this.strings=strings,_this.expressions=expressions,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Interpolation,_super),Interpolation.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitInterpolation(this,context)},Interpolation}(AST),Binary=function(_super){function Binary(span,operation,left,right){var _this=_super.call(this,span)||this;return _this.operation=operation,_this.left=left,_this.right=right,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Binary,_super),Binary.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitBinary(this,context)},Binary}(AST),PrefixNot=function(_super){function PrefixNot(span,expression){var _this=_super.call(this,span)||this;return _this.expression=expression,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(PrefixNot,_super),PrefixNot.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitPrefixNot(this,context)},PrefixNot}(AST),NonNullAssert=function(_super){function NonNullAssert(span,expression){var _this=_super.call(this,span)||this;return _this.expression=expression,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(NonNullAssert,_super),NonNullAssert.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitNonNullAssert(this,context)},NonNullAssert}(AST),MethodCall=function(_super){function MethodCall(span,receiver,name,args){var _this=_super.call(this,span)||this;return _this.receiver=receiver,_this.name=name,_this.args=args,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(MethodCall,_super),MethodCall.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitMethodCall(this,context)},MethodCall}(AST),SafeMethodCall=function(_super){function SafeMethodCall(span,receiver,name,args){var _this=_super.call(this,span)||this;return _this.receiver=receiver,_this.name=name,_this.args=args,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(SafeMethodCall,_super),SafeMethodCall.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitSafeMethodCall(this,context)},SafeMethodCall}(AST),FunctionCall=function(_super){function FunctionCall(span,target,args){var _this=_super.call(this,span)||this;return _this.target=target,_this.args=args,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(FunctionCall,_super),FunctionCall.prototype.visit=function(visitor,context){return void 0===context&&(context=null),visitor.visitFunctionCall(this,context)},FunctionCall}(AST),ASTWithSource=function(_super){function ASTWithSource(ast,source,location,errors){var _this=_super.call(this,new ParseSpan(0,null==source?0:source.length))||this;return _this.ast=ast,_this.source=source,_this.location=location,_this.errors=errors,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ASTWithSource,_super),ASTWithSource.prototype.visit=function(visitor,context){return void 0===context&&(context=null),this.ast.visit(visitor,context)},ASTWithSource.prototype.toString=function(){return this.source+" in "+this.location},ASTWithSource}(AST),TemplateBinding=function TemplateBinding(span,key,keyIsVar,name,expression){this.span=span,this.key=key,this.keyIsVar=keyIsVar,this.name=name,this.expression=expression},RecursiveAstVisitor$1=(function(){function NullAstVisitor(){}NullAstVisitor.prototype.visitBinary=function(ast,context){},NullAstVisitor.prototype.visitChain=function(ast,context){},NullAstVisitor.prototype.visitConditional=function(ast,context){},NullAstVisitor.prototype.visitFunctionCall=function(ast,context){},NullAstVisitor.prototype.visitImplicitReceiver=function(ast,context){},NullAstVisitor.prototype.visitInterpolation=function(ast,context){},NullAstVisitor.prototype.visitKeyedRead=function(ast,context){},NullAstVisitor.prototype.visitKeyedWrite=function(ast,context){},NullAstVisitor.prototype.visitLiteralArray=function(ast,context){},NullAstVisitor.prototype.visitLiteralMap=function(ast,context){},NullAstVisitor.prototype.visitLiteralPrimitive=function(ast,context){},NullAstVisitor.prototype.visitMethodCall=function(ast,context){},NullAstVisitor.prototype.visitPipe=function(ast,context){},NullAstVisitor.prototype.visitPrefixNot=function(ast,context){},NullAstVisitor.prototype.visitNonNullAssert=function(ast,context){},NullAstVisitor.prototype.visitPropertyRead=function(ast,context){},NullAstVisitor.prototype.visitPropertyWrite=function(ast,context){},NullAstVisitor.prototype.visitQuote=function(ast,context){},NullAstVisitor.prototype.visitSafeMethodCall=function(ast,context){},NullAstVisitor.prototype.visitSafePropertyRead=function(ast,context){}}(),function(){function RecursiveAstVisitor(){}return RecursiveAstVisitor.prototype.visitBinary=function(ast,context){return ast.left.visit(this),ast.right.visit(this),null},RecursiveAstVisitor.prototype.visitChain=function(ast,context){return this.visitAll(ast.expressions,context)},RecursiveAstVisitor.prototype.visitConditional=function(ast,context){return ast.condition.visit(this),ast.trueExp.visit(this),ast.falseExp.visit(this),null},RecursiveAstVisitor.prototype.visitPipe=function(ast,context){return ast.exp.visit(this),this.visitAll(ast.args,context),null},RecursiveAstVisitor.prototype.visitFunctionCall=function(ast,context){return ast.target.visit(this),this.visitAll(ast.args,context),null},RecursiveAstVisitor.prototype.visitImplicitReceiver=function(ast,context){return null},RecursiveAstVisitor.prototype.visitInterpolation=function(ast,context){return this.visitAll(ast.expressions,context)},RecursiveAstVisitor.prototype.visitKeyedRead=function(ast,context){return ast.obj.visit(this),ast.key.visit(this),null},RecursiveAstVisitor.prototype.visitKeyedWrite=function(ast,context){return ast.obj.visit(this),ast.key.visit(this),ast.value.visit(this),null},RecursiveAstVisitor.prototype.visitLiteralArray=function(ast,context){return this.visitAll(ast.expressions,context)},RecursiveAstVisitor.prototype.visitLiteralMap=function(ast,context){return this.visitAll(ast.values,context)},RecursiveAstVisitor.prototype.visitLiteralPrimitive=function(ast,context){return null},RecursiveAstVisitor.prototype.visitMethodCall=function(ast,context){return ast.receiver.visit(this),this.visitAll(ast.args,context)},RecursiveAstVisitor.prototype.visitPrefixNot=function(ast,context){return ast.expression.visit(this),null},RecursiveAstVisitor.prototype.visitNonNullAssert=function(ast,context){return ast.expression.visit(this),null},RecursiveAstVisitor.prototype.visitPropertyRead=function(ast,context){return ast.receiver.visit(this),null},RecursiveAstVisitor.prototype.visitPropertyWrite=function(ast,context){return ast.receiver.visit(this),ast.value.visit(this),null},RecursiveAstVisitor.prototype.visitSafePropertyRead=function(ast,context){return ast.receiver.visit(this),null},RecursiveAstVisitor.prototype.visitSafeMethodCall=function(ast,context){return ast.receiver.visit(this),this.visitAll(ast.args,context)},RecursiveAstVisitor.prototype.visitAll=function(asts,context){var _this=this;return asts.forEach(function(ast){return ast.visit(_this,context)}),null},RecursiveAstVisitor.prototype.visitQuote=function(ast,context){return null},RecursiveAstVisitor}()),AstTransformer$1=function(){function AstTransformer(){}return AstTransformer.prototype.visitImplicitReceiver=function(ast,context){return ast},AstTransformer.prototype.visitInterpolation=function(ast,context){return new Interpolation(ast.span,ast.strings,this.visitAll(ast.expressions))},AstTransformer.prototype.visitLiteralPrimitive=function(ast,context){return new LiteralPrimitive(ast.span,ast.value)},AstTransformer.prototype.visitPropertyRead=function(ast,context){return new PropertyRead(ast.span,ast.receiver.visit(this),ast.name)},AstTransformer.prototype.visitPropertyWrite=function(ast,context){return new PropertyWrite(ast.span,ast.receiver.visit(this),ast.name,ast.value.visit(this))},AstTransformer.prototype.visitSafePropertyRead=function(ast,context){return new SafePropertyRead(ast.span,ast.receiver.visit(this),ast.name)},AstTransformer.prototype.visitMethodCall=function(ast,context){return new MethodCall(ast.span,ast.receiver.visit(this),ast.name,this.visitAll(ast.args))},AstTransformer.prototype.visitSafeMethodCall=function(ast,context){return new SafeMethodCall(ast.span,ast.receiver.visit(this),ast.name,this.visitAll(ast.args))},AstTransformer.prototype.visitFunctionCall=function(ast,context){return new FunctionCall(ast.span,ast.target.visit(this),this.visitAll(ast.args))},AstTransformer.prototype.visitLiteralArray=function(ast,context){return new LiteralArray(ast.span,this.visitAll(ast.expressions))},AstTransformer.prototype.visitLiteralMap=function(ast,context){return new LiteralMap(ast.span,ast.keys,this.visitAll(ast.values))},AstTransformer.prototype.visitBinary=function(ast,context){return new Binary(ast.span,ast.operation,ast.left.visit(this),ast.right.visit(this))},AstTransformer.prototype.visitPrefixNot=function(ast,context){return new PrefixNot(ast.span,ast.expression.visit(this))},AstTransformer.prototype.visitNonNullAssert=function(ast,context){return new NonNullAssert(ast.span,ast.expression.visit(this))},AstTransformer.prototype.visitConditional=function(ast,context){return new Conditional(ast.span,ast.condition.visit(this),ast.trueExp.visit(this),ast.falseExp.visit(this))},AstTransformer.prototype.visitPipe=function(ast,context){return new BindingPipe(ast.span,ast.exp.visit(this),ast.name,this.visitAll(ast.args))},AstTransformer.prototype.visitKeyedRead=function(ast,context){return new KeyedRead(ast.span,ast.obj.visit(this),ast.key.visit(this))},AstTransformer.prototype.visitKeyedWrite=function(ast,context){return new KeyedWrite(ast.span,ast.obj.visit(this),ast.key.visit(this),ast.value.visit(this))},AstTransformer.prototype.visitAll=function(asts){for(var res=new Array(asts.length),i=0;i<asts.length;++i)res[i]=asts[i].visit(this);return res},AstTransformer.prototype.visitChain=function(ast,context){return new Chain(ast.span,this.visitAll(ast.expressions))},AstTransformer.prototype.visitQuote=function(ast,context){return new Quote(ast.span,ast.prefix,ast.uninterpretedExpression,ast.location)},AstTransformer}(),AstMemoryEfficientTransformer=function(){function AstMemoryEfficientTransformer(){}return AstMemoryEfficientTransformer.prototype.visitImplicitReceiver=function(ast,context){return ast},AstMemoryEfficientTransformer.prototype.visitInterpolation=function(ast,context){var expressions=this.visitAll(ast.expressions);return expressions!==ast.expressions?new Interpolation(ast.span,ast.strings,expressions):ast},AstMemoryEfficientTransformer.prototype.visitLiteralPrimitive=function(ast,context){return ast},AstMemoryEfficientTransformer.prototype.visitPropertyRead=function(ast,context){var receiver=ast.receiver.visit(this);return receiver!==ast.receiver?new PropertyRead(ast.span,receiver,ast.name):ast},AstMemoryEfficientTransformer.prototype.visitPropertyWrite=function(ast,context){var receiver=ast.receiver.visit(this),value=ast.value.visit(this);return receiver!==ast.receiver||value!==ast.value?new PropertyWrite(ast.span,receiver,ast.name,value):ast},AstMemoryEfficientTransformer.prototype.visitSafePropertyRead=function(ast,context){var receiver=ast.receiver.visit(this);return receiver!==ast.receiver?new SafePropertyRead(ast.span,receiver,ast.name):ast},AstMemoryEfficientTransformer.prototype.visitMethodCall=function(ast,context){var receiver=ast.receiver.visit(this),args=this.visitAll(ast.args);return receiver!==ast.receiver||args!==ast.args?new MethodCall(ast.span,receiver,ast.name,args):ast},AstMemoryEfficientTransformer.prototype.visitSafeMethodCall=function(ast,context){var receiver=ast.receiver.visit(this),args=this.visitAll(ast.args);return receiver!==ast.receiver||args!==ast.args?new SafeMethodCall(ast.span,receiver,ast.name,args):ast},AstMemoryEfficientTransformer.prototype.visitFunctionCall=function(ast,context){var target=ast.target&&ast.target.visit(this),args=this.visitAll(ast.args);return target!==ast.target||args!==ast.args?new FunctionCall(ast.span,target,args):ast},AstMemoryEfficientTransformer.prototype.visitLiteralArray=function(ast,context){var expressions=this.visitAll(ast.expressions);return expressions!==ast.expressions?new LiteralArray(ast.span,expressions):ast},AstMemoryEfficientTransformer.prototype.visitLiteralMap=function(ast,context){var values=this.visitAll(ast.values);return values!==ast.values?new LiteralMap(ast.span,ast.keys,values):ast},AstMemoryEfficientTransformer.prototype.visitBinary=function(ast,context){var left=ast.left.visit(this),right=ast.right.visit(this);return left!==ast.left||right!==ast.right?new Binary(ast.span,ast.operation,left,right):ast},AstMemoryEfficientTransformer.prototype.visitPrefixNot=function(ast,context){var expression=ast.expression.visit(this);return expression!==ast.expression?new PrefixNot(ast.span,expression):ast},AstMemoryEfficientTransformer.prototype.visitNonNullAssert=function(ast,context){var expression=ast.expression.visit(this);return expression!==ast.expression?new NonNullAssert(ast.span,expression):ast},AstMemoryEfficientTransformer.prototype.visitConditional=function(ast,context){var condition=ast.condition.visit(this),trueExp=ast.trueExp.visit(this),falseExp=ast.falseExp.visit(this);return condition!==ast.condition||trueExp!==ast.trueExp||falseExp!==ast.falseExp?new Conditional(ast.span,condition,trueExp,falseExp):ast},AstMemoryEfficientTransformer.prototype.visitPipe=function(ast,context){var exp=ast.exp.visit(this),args=this.visitAll(ast.args);return exp!==ast.exp||args!==ast.args?new BindingPipe(ast.span,exp,ast.name,args):ast},AstMemoryEfficientTransformer.prototype.visitKeyedRead=function(ast,context){var obj=ast.obj.visit(this),key=ast.key.visit(this);return obj!==ast.obj||key!==ast.key?new KeyedRead(ast.span,obj,key):ast},AstMemoryEfficientTransformer.prototype.visitKeyedWrite=function(ast,context){var obj=ast.obj.visit(this),key=ast.key.visit(this),value=ast.value.visit(this);return obj!==ast.obj||key!==ast.key||value!==ast.value?new KeyedWrite(ast.span,obj,key,value):ast},AstMemoryEfficientTransformer.prototype.visitAll=function(asts){for(var res=new Array(asts.length),modified=!1,i=0;i<asts.length;++i){var original=asts[i],value=original.visit(this);res[i]=value,modified=modified||value!==original}return modified?res:asts},AstMemoryEfficientTransformer.prototype.visitChain=function(ast,context){var expressions=this.visitAll(ast.expressions);return expressions!==ast.expressions?new Chain(ast.span,expressions):ast},AstMemoryEfficientTransformer.prototype.visitQuote=function(ast,context){return ast},AstMemoryEfficientTransformer}();var ParsedPropertyType,ParsedProperty=function ParsedProperty(name,expression,type,sourceSpan){this.name=name,this.expression=expression,this.type=type,this.sourceSpan=sourceSpan,this.isLiteral=this.type===ParsedPropertyType.LITERAL_ATTR,this.isAnimation=this.type===ParsedPropertyType.ANIMATION};!function(ParsedPropertyType){ParsedPropertyType[ParsedPropertyType.DEFAULT=0]="DEFAULT",ParsedPropertyType[ParsedPropertyType.LITERAL_ATTR=1]="LITERAL_ATTR",ParsedPropertyType[ParsedPropertyType.ANIMATION=2]="ANIMATION"}(ParsedPropertyType||(ParsedPropertyType={}));var ParsedEvent=function ParsedEvent(name,targetOrPhase,type,handler,sourceSpan,handlerSpan){this.name=name,this.targetOrPhase=targetOrPhase,this.type=type,this.handler=handler,this.sourceSpan=sourceSpan,this.handlerSpan=handlerSpan},ParsedVariable=function ParsedVariable(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan},BoundElementProperty=function BoundElementProperty(name,type,securityContext,value,unit,sourceSpan){this.name=name,this.type=type,this.securityContext=securityContext,this.value=value,this.unit=unit,this.sourceSpan=sourceSpan},EventHandlerVars=function(){function EventHandlerVars(){}return EventHandlerVars.event=variable("$event"),EventHandlerVars}(),ConvertActionBindingResult=function ConvertActionBindingResult(stmts,allowDefault){this.stmts=stmts,this.allowDefault=allowDefault,this.render3Stmts=stmts.map(function(statement){Eif(statement instanceof DeclareVarStmt&&statement.name==allowDefault.name&&statement.value instanceof BinaryOperatorExpr){var lhs=statement.value.lhs;return new ReturnStatement(lhs.value)}return statement})};function convertActionBinding(localResolver,implicitReceiver,action,bindingId,interpolationFunction,baseSourceSpan){localResolver||(localResolver=new DefaultLocalResolver);var actionWithoutBuiltins=convertPropertyBindingBuiltins({createLiteralArrayConverter:function(argCount){return function(args){return literalArr(args)}},createLiteralMapConverter:function(keys){return function(values){return literalMap(keys.map(function(k,i){return{key:k.key,value:values[i],quoted:k.quoted}}))}},createPipeConverter:function(name){throw new Error("Illegal State: Actions are not allowed to contain pipes. Pipe: "+name)}},action),visitor=new _AstToIrVisitor(localResolver,implicitReceiver,bindingId,interpolationFunction,baseSourceSpan),actionStmts=[];!function flattenStatements(arg,output){Array.isArray(arg)?arg.forEach(function(entry){return flattenStatements(entry,output)}):output.push(arg)}(actionWithoutBuiltins.visit(visitor,_Mode.Statement),actionStmts),function prependTemporaryDecls(temporaryCount,bindingId,statements){for(var i=temporaryCount-1;i>=0;i--)statements.unshift(temporaryDeclaration(bindingId,i))}(visitor.temporaryCount,bindingId,actionStmts),visitor.usesImplicitReceiver&&localResolver.notifyImplicitReceiverUse();var lastIndex=actionStmts.length-1,preventDefaultVar=null;Eif(lastIndex>=0){var returnExpr=function convertStmtIntoExpression(stmt){Eif(stmt instanceof ExpressionStatement)return stmt.expr;if(stmt instanceof ReturnStatement)return stmt.value;return null}(actionStmts[lastIndex]);returnExpr&&(preventDefaultVar=function createPreventDefaultVar(bindingId){return variable("pd_"+bindingId)}(bindingId),actionStmts[lastIndex]=preventDefaultVar.set(returnExpr.cast(DYNAMIC_TYPE).notIdentical(literal(!1))).toDeclStmt(null,[StmtModifier.Final]))}return new ConvertActionBindingResult(actionStmts,preventDefaultVar)}function convertPropertyBindingBuiltins(converterFactory,ast){return function convertBuiltins(converterFactory,ast){var visitor=new _BuiltinAstConverter(converterFactory);return ast.visit(visitor)}(converterFactory,ast)}var BindingForm,_Mode,ConvertPropertyBindingResult=function ConvertPropertyBindingResult(stmts,currValExpr){this.stmts=stmts,this.currValExpr=currValExpr};function convertPropertyBinding(localResolver,implicitReceiver,expressionWithoutBuiltins,bindingId,form,interpolationFunction){localResolver||(localResolver=new DefaultLocalResolver);var currValExpr=function createCurrValueExpr(bindingId){return variable("currVal_"+bindingId)}(bindingId),visitor=new _AstToIrVisitor(localResolver,implicitReceiver,bindingId,interpolationFunction),outputExpr=expressionWithoutBuiltins.visit(visitor,_Mode.Expression),stmts=getStatementsFromVisitor(visitor,bindingId);return visitor.usesImplicitReceiver&&localResolver.notifyImplicitReceiverUse(),0===visitor.temporaryCount&&form==BindingForm.TrySimple?new ConvertPropertyBindingResult([],outputExpr):(stmts.push(currValExpr.set(outputExpr).toDeclStmt(DYNAMIC_TYPE,[StmtModifier.Final])),new ConvertPropertyBindingResult(stmts,currValExpr))}function getStatementsFromVisitor(visitor,bindingId){for(var stmts=[],i=0;i<visitor.temporaryCount;i++)stmts.push(temporaryDeclaration(bindingId,i));return stmts}function temporaryName(bindingId,temporaryNumber){return"tmp_"+bindingId+"_"+temporaryNumber}function temporaryDeclaration(bindingId,temporaryNumber){return new DeclareVarStmt(temporaryName(bindingId,temporaryNumber),NULL_EXPR)}function ensureExpressionMode(mode,ast){Iif(mode!==_Mode.Expression)throw new Error("Expected an expression, but saw "+ast)}function convertToStatementIfNeeded(mode,expr){return mode===_Mode.Statement?expr.toStmt():expr}!function(BindingForm){BindingForm[BindingForm.General=0]="General",BindingForm[BindingForm.TrySimple=1]="TrySimple"}(BindingForm||(BindingForm={})),function(_Mode){_Mode[_Mode.Statement=0]="Statement",_Mode[_Mode.Expression=1]="Expression"}(_Mode||(_Mode={}));var _BuiltinAstConverter=function(_super){function _BuiltinAstConverter(_converterFactory){var _this=_super.call(this)||this;return _this._converterFactory=_converterFactory,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_BuiltinAstConverter,_super),_BuiltinAstConverter.prototype.visitPipe=function(ast,context){var _this=this,args=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([ast.exp],ast.args).map(function(ast){return ast.visit(_this,context)});return new BuiltinFunctionCall(ast.span,args,this._converterFactory.createPipeConverter(ast.name,args.length))},_BuiltinAstConverter.prototype.visitLiteralArray=function(ast,context){var _this=this,args=ast.expressions.map(function(ast){return ast.visit(_this,context)});return new BuiltinFunctionCall(ast.span,args,this._converterFactory.createLiteralArrayConverter(ast.expressions.length))},_BuiltinAstConverter.prototype.visitLiteralMap=function(ast,context){var _this=this,args=ast.values.map(function(ast){return ast.visit(_this,context)});return new BuiltinFunctionCall(ast.span,args,this._converterFactory.createLiteralMapConverter(ast.keys))},_BuiltinAstConverter}(AstTransformer$1),_AstToIrVisitor=function(){function _AstToIrVisitor(_localResolver,_implicitReceiver,bindingId,interpolationFunction,baseSourceSpan){this._localResolver=_localResolver,this._implicitReceiver=_implicitReceiver,this.bindingId=bindingId,this.interpolationFunction=interpolationFunction,this.baseSourceSpan=baseSourceSpan,this._nodeMap=new Map,this._resultMap=new Map,this._currentTemporary=0,this.temporaryCount=0,this.usesImplicitReceiver=!1}return _AstToIrVisitor.prototype.visitBinary=function(ast,mode){var op;switch(ast.operation){case"+":op=BinaryOperator.Plus;break;case"-":op=BinaryOperator.Minus;break;case"*":op=BinaryOperator.Multiply;break;case"/":op=BinaryOperator.Divide;break;case"%":op=BinaryOperator.Modulo;break;case"&&":op=BinaryOperator.And;break;case"||":op=BinaryOperator.Or;break;case"==":op=BinaryOperator.Equals;break;case"!=":op=BinaryOperator.NotEquals;break;case"===":op=BinaryOperator.Identical;break;case"!==":op=BinaryOperator.NotIdentical;break;case"<":op=BinaryOperator.Lower;break;case">":op=BinaryOperator.Bigger;break;case"<=":op=BinaryOperator.LowerEquals;break;case">=":op=BinaryOperator.BiggerEquals;break;default:throw new Error("Unsupported operation "+ast.operation)}return convertToStatementIfNeeded(mode,new BinaryOperatorExpr(op,this._visit(ast.left,_Mode.Expression),this._visit(ast.right,_Mode.Expression),void 0,this.convertSourceSpan(ast.span)))},_AstToIrVisitor.prototype.visitChain=function(ast,mode){return function ensureStatementMode(mode,ast){if(mode!==_Mode.Statement)throw new Error("Expected a statement, but saw "+ast)}(mode,ast),this.visitAll(ast.expressions,mode)},_AstToIrVisitor.prototype.visitConditional=function(ast,mode){return convertToStatementIfNeeded(mode,this._visit(ast.condition,_Mode.Expression).conditional(this._visit(ast.trueExp,_Mode.Expression),this._visit(ast.falseExp,_Mode.Expression),this.convertSourceSpan(ast.span)))},_AstToIrVisitor.prototype.visitPipe=function(ast,mode){throw new Error("Illegal state: Pipes should have been converted into functions. Pipe: "+ast.name)},_AstToIrVisitor.prototype.visitFunctionCall=function(ast,mode){var convertedArgs=this.visitAll(ast.args,_Mode.Expression);return convertToStatementIfNeeded(mode,ast instanceof BuiltinFunctionCall?ast.converter(convertedArgs):this._visit(ast.target,_Mode.Expression).callFn(convertedArgs,this.convertSourceSpan(ast.span)))},_AstToIrVisitor.prototype.visitImplicitReceiver=function(ast,mode){return ensureExpressionMode(mode,ast),this.usesImplicitReceiver=!0,this._implicitReceiver},_AstToIrVisitor.prototype.visitInterpolation=function(ast,mode){ensureExpressionMode(mode,ast);for(var args=[literal(ast.expressions.length)],i=0;i<ast.strings.length-1;i++)args.push(literal(ast.strings[i])),args.push(this._visit(ast.expressions[i],_Mode.Expression));return args.push(literal(ast.strings[ast.strings.length-1])),this.interpolationFunction?this.interpolationFunction(args):ast.expressions.length<=9?importExpr(Identifiers.inlineInterpolate).callFn(args):importExpr(Identifiers.interpolate).callFn([args[0],literalArr(args.slice(1),void 0,this.convertSourceSpan(ast.span))])},_AstToIrVisitor.prototype.visitKeyedRead=function(ast,mode){var leftMostSafe=this.leftMostSafeNode(ast);return leftMostSafe?this.convertSafeAccess(ast,leftMostSafe,mode):convertToStatementIfNeeded(mode,this._visit(ast.obj,_Mode.Expression).key(this._visit(ast.key,_Mode.Expression)))},_AstToIrVisitor.prototype.visitKeyedWrite=function(ast,mode){var obj=this._visit(ast.obj,_Mode.Expression),key=this._visit(ast.key,_Mode.Expression),value=this._visit(ast.value,_Mode.Expression);return convertToStatementIfNeeded(mode,obj.key(key).set(value))},_AstToIrVisitor.prototype.visitLiteralArray=function(ast,mode){throw new Error("Illegal State: literal arrays should have been converted into functions")},_AstToIrVisitor.prototype.visitLiteralMap=function(ast,mode){throw new Error("Illegal State: literal maps should have been converted into functions")},_AstToIrVisitor.prototype.visitLiteralPrimitive=function(ast,mode){var type=null===ast.value||void 0===ast.value||!0===ast.value||!0===ast.value?INFERRED_TYPE:void 0;return convertToStatementIfNeeded(mode,literal(ast.value,type,this.convertSourceSpan(ast.span)))},_AstToIrVisitor.prototype._getLocal=function(name){return this._localResolver.getLocal(name)},_AstToIrVisitor.prototype.visitMethodCall=function(ast,mode){Iif(ast.receiver instanceof ImplicitReceiver&&"$any"==ast.name){if(1!=(args=this.visitAll(ast.args,_Mode.Expression)).length)throw new Error("Invalid call to $any, expected 1 argument but received "+(args.length||"none"));return args[0].cast(DYNAMIC_TYPE,this.convertSourceSpan(ast.span))}var leftMostSafe=this.leftMostSafeNode(ast);Iif(leftMostSafe)return this.convertSafeAccess(ast,leftMostSafe,mode);var args=this.visitAll(ast.args,_Mode.Expression),prevUsesImplicitReceiver=this.usesImplicitReceiver,result=null,receiver=this._visit(ast.receiver,_Mode.Expression);Eif(receiver===this._implicitReceiver){var varExpr=this._getLocal(ast.name);varExpr&&(this.usesImplicitReceiver=prevUsesImplicitReceiver,result=varExpr.callFn(args))}return null==result&&(result=receiver.callMethod(ast.name,args,this.convertSourceSpan(ast.span))),convertToStatementIfNeeded(mode,result)},_AstToIrVisitor.prototype.visitPrefixNot=function(ast,mode){return convertToStatementIfNeeded(mode,function not(expr,sourceSpan){return new NotExpr(expr,sourceSpan)}(this._visit(ast.expression,_Mode.Expression)))},_AstToIrVisitor.prototype.visitNonNullAssert=function(ast,mode){return convertToStatementIfNeeded(mode,function assertNotNull(expr,sourceSpan){return new AssertNotNull(expr,sourceSpan)}(this._visit(ast.expression,_Mode.Expression)))},_AstToIrVisitor.prototype.visitPropertyRead=function(ast,mode){var leftMostSafe=this.leftMostSafeNode(ast);Iif(leftMostSafe)return this.convertSafeAccess(ast,leftMostSafe,mode);var result=null,prevUsesImplicitReceiver=this.usesImplicitReceiver,receiver=this._visit(ast.receiver,_Mode.Expression);return receiver===this._implicitReceiver&&(result=this._getLocal(ast.name))&&(this.usesImplicitReceiver=prevUsesImplicitReceiver),null==result&&(result=receiver.prop(ast.name)),convertToStatementIfNeeded(mode,result)},_AstToIrVisitor.prototype.visitPropertyWrite=function(ast,mode){var receiver=this._visit(ast.receiver,_Mode.Expression),prevUsesImplicitReceiver=this.usesImplicitReceiver,varExpr=null;if(receiver===this._implicitReceiver){var localExpr=this._getLocal(ast.name);if(localExpr){if(!(localExpr instanceof ReadPropExpr))throw new Error("Cannot assign to a reference or variable!");varExpr=localExpr,this.usesImplicitReceiver=prevUsesImplicitReceiver}}return null===varExpr&&(varExpr=receiver.prop(ast.name)),convertToStatementIfNeeded(mode,varExpr.set(this._visit(ast.value,_Mode.Expression)))},_AstToIrVisitor.prototype.visitSafePropertyRead=function(ast,mode){return this.convertSafeAccess(ast,this.leftMostSafeNode(ast),mode)},_AstToIrVisitor.prototype.visitSafeMethodCall=function(ast,mode){return this.convertSafeAccess(ast,this.leftMostSafeNode(ast),mode)},_AstToIrVisitor.prototype.visitAll=function(asts,mode){var _this=this;return asts.map(function(ast){return _this._visit(ast,mode)})},_AstToIrVisitor.prototype.visitQuote=function(ast,mode){throw new Error("Quotes are not supported for evaluation!\n        Statement: "+ast.uninterpretedExpression+" located at "+ast.location)},_AstToIrVisitor.prototype._visit=function(ast,mode){var result=this._resultMap.get(ast);return result||(this._nodeMap.get(ast)||ast).visit(this,mode)},_AstToIrVisitor.prototype.convertSafeAccess=function(ast,leftMostSafe,mode){var guardedExpression=this._visit(leftMostSafe.receiver,_Mode.Expression),temporary=void 0;this.needsTemporary(leftMostSafe.receiver)&&(guardedExpression=(temporary=this.allocateTemporary()).set(guardedExpression),this._resultMap.set(leftMostSafe.receiver,temporary));var condition=guardedExpression.isBlank();leftMostSafe instanceof SafeMethodCall?this._nodeMap.set(leftMostSafe,new MethodCall(leftMostSafe.span,leftMostSafe.receiver,leftMostSafe.name,leftMostSafe.args)):this._nodeMap.set(leftMostSafe,new PropertyRead(leftMostSafe.span,leftMostSafe.receiver,leftMostSafe.name));var access=this._visit(ast,_Mode.Expression);return this._nodeMap.delete(leftMostSafe),temporary&&this.releaseTemporary(temporary),convertToStatementIfNeeded(mode,condition.conditional(literal(null),access))},_AstToIrVisitor.prototype.leftMostSafeNode=function(ast){var _this=this,visit=function(visitor,ast){return(_this._nodeMap.get(ast)||ast).visit(visitor)};return ast.visit({visitBinary:function(ast){return null},visitChain:function(ast){return null},visitConditional:function(ast){return null},visitFunctionCall:function(ast){return null},visitImplicitReceiver:function(ast){return null},visitInterpolation:function(ast){return null},visitKeyedRead:function(ast){return visit(this,ast.obj)},visitKeyedWrite:function(ast){return null},visitLiteralArray:function(ast){return null},visitLiteralMap:function(ast){return null},visitLiteralPrimitive:function(ast){return null},visitMethodCall:function(ast){return visit(this,ast.receiver)},visitPipe:function(ast){return null},visitPrefixNot:function(ast){return null},visitNonNullAssert:function(ast){return null},visitPropertyRead:function(ast){return visit(this,ast.receiver)},visitPropertyWrite:function(ast){return null},visitQuote:function(ast){return null},visitSafeMethodCall:function(ast){return visit(this,ast.receiver)||ast},visitSafePropertyRead:function(ast){return visit(this,ast.receiver)||ast}})},_AstToIrVisitor.prototype.needsTemporary=function(ast){var _this=this,visit=function(visitor,ast){return ast&&(_this._nodeMap.get(ast)||ast).visit(visitor)};return ast.visit({visitBinary:function(ast){return visit(this,ast.left)||visit(this,ast.right)},visitChain:function(ast){return!1},visitConditional:function(ast){return visit(this,ast.condition)||visit(this,ast.trueExp)||visit(this,ast.falseExp)},visitFunctionCall:function(ast){return!0},visitImplicitReceiver:function(ast){return!1},visitInterpolation:function(ast){return function(visitor,ast){return ast.some(function(ast){return visit(visitor,ast)})}(this,ast.expressions)},visitKeyedRead:function(ast){return!1},visitKeyedWrite:function(ast){return!1},visitLiteralArray:function(ast){return!0},visitLiteralMap:function(ast){return!0},visitLiteralPrimitive:function(ast){return!1},visitMethodCall:function(ast){return!0},visitPipe:function(ast){return!0},visitPrefixNot:function(ast){return visit(this,ast.expression)},visitNonNullAssert:function(ast){return visit(this,ast.expression)},visitPropertyRead:function(ast){return!1},visitPropertyWrite:function(ast){return!1},visitQuote:function(ast){return!1},visitSafeMethodCall:function(ast){return!0},visitSafePropertyRead:function(ast){return!1}})},_AstToIrVisitor.prototype.allocateTemporary=function(){var tempNumber=this._currentTemporary++;return this.temporaryCount=Math.max(this._currentTemporary,this.temporaryCount),new ReadVarExpr(temporaryName(this.bindingId,tempNumber))},_AstToIrVisitor.prototype.releaseTemporary=function(temporary){if(this._currentTemporary--,temporary.name!=temporaryName(this.bindingId,this._currentTemporary))throw new Error("Temporary "+temporary.name+" released out of order")},_AstToIrVisitor.prototype.convertSourceSpan=function(span){Iif(this.baseSourceSpan){var start=this.baseSourceSpan.start.moveBy(span.start),end=this.baseSourceSpan.start.moveBy(span.end);return new ParseSourceSpan(start,end)}return null},_AstToIrVisitor}();var DefaultLocalResolver=function(){function DefaultLocalResolver(){}return DefaultLocalResolver.prototype.notifyImplicitReceiverUse=function(){},DefaultLocalResolver.prototype.getLocal=function(name){return name===EventHandlerVars.event.name?EventHandlerVars.event:null},DefaultLocalResolver}();var BuiltinFunctionCall=function(_super){function BuiltinFunctionCall(span,args,converter){var _this=_super.call(this,span,null,args)||this;return _this.args=args,_this.converter=converter,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(BuiltinFunctionCall,_super),BuiltinFunctionCall}(FunctionCall),ShadowCss=function(){function ShadowCss(){this.strictStyling=!0}return ShadowCss.prototype.shimCssText=function(cssText,selector,hostSelector){void 0===hostSelector&&(hostSelector="");var commentsWithHash=function extractCommentsWithHash(input){return input.match(_commentWithHashRe)||[]}(cssText);cssText=function stripComments(input){return input.replace(_commentRe,"")}(cssText),cssText=this._insertDirectives(cssText);var scopedCssText=this._scopeCssText(cssText,selector,hostSelector);return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([scopedCssText],commentsWithHash).join("\n")},ShadowCss.prototype._insertDirectives=function(cssText){return cssText=this._insertPolyfillDirectivesInCssText(cssText),this._insertPolyfillRulesInCssText(cssText)},ShadowCss.prototype._insertPolyfillDirectivesInCssText=function(cssText){return cssText.replace(_cssContentNextSelectorRe,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];return m[2]+"{"})},ShadowCss.prototype._insertPolyfillRulesInCssText=function(cssText){return cssText.replace(_cssContentRuleRe,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];var rule=m[0].replace(m[1],"").replace(m[2],"");return m[4]+rule})},ShadowCss.prototype._scopeCssText=function(cssText,scopeSelector,hostSelector){var unscopedRules=this._extractUnscopedRulesFromCssText(cssText);return cssText=this._insertPolyfillHostInCssText(cssText),cssText=this._convertColonHost(cssText),cssText=this._convertColonHostContext(cssText),cssText=this._convertShadowDOMSelectors(cssText),scopeSelector&&(cssText=this._scopeSelectors(cssText,scopeSelector,hostSelector)),(cssText=cssText+"\n"+unscopedRules).trim()},ShadowCss.prototype._extractUnscopedRulesFromCssText=function(cssText){var m,r="";for(_cssContentUnscopedRuleRe.lastIndex=0;null!==(m=_cssContentUnscopedRuleRe.exec(cssText));){r+=m[0].replace(m[2],"").replace(m[1],m[4])+"\n\n"}return r},ShadowCss.prototype._convertColonHost=function(cssText){return this._convertColonRule(cssText,_cssColonHostRe,this._colonHostPartReplacer)},ShadowCss.prototype._convertColonHostContext=function(cssText){return this._convertColonRule(cssText,_cssColonHostContextRe,this._colonHostContextPartReplacer)},ShadowCss.prototype._convertColonRule=function(cssText,regExp,partReplacer){return cssText.replace(regExp,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];if(m[2]){for(var parts=m[2].split(","),r=[],i=0;i<parts.length;i++){var p=parts[i].trim();if(!p)break;r.push(partReplacer(_polyfillHostNoCombinator,p,m[3]))}return r.join(",")}return _polyfillHostNoCombinator+m[3]})},ShadowCss.prototype._colonHostContextPartReplacer=function(host,part,suffix){return part.indexOf(_polyfillHost)>-1?this._colonHostPartReplacer(host,part,suffix):host+part+suffix+", "+part+" "+host+suffix},ShadowCss.prototype._colonHostPartReplacer=function(host,part,suffix){return host+part.replace(_polyfillHost,"")+suffix},ShadowCss.prototype._convertShadowDOMSelectors=function(cssText){return _shadowDOMSelectorsRe.reduce(function(result,pattern){return result.replace(pattern," ")},cssText)},ShadowCss.prototype._scopeSelectors=function(cssText,scopeSelector,hostSelector){var _this=this;return function processRules(input,ruleCallback){var inputWithEscapedBlocks=function escapeBlocks(input){for(var inputParts=input.split(_curlyRe),resultParts=[],escapedBlocks=[],bracketCount=0,currentBlockParts=[],partIndex=0;partIndex<inputParts.length;partIndex++){var part=inputParts[partIndex];part==CLOSE_CURLY&&bracketCount--,bracketCount>0?currentBlockParts.push(part):(currentBlockParts.length>0&&(escapedBlocks.push(currentBlockParts.join("")),resultParts.push(BLOCK_PLACEHOLDER),currentBlockParts=[]),resultParts.push(part)),part==OPEN_CURLY&&bracketCount++}currentBlockParts.length>0&&(escapedBlocks.push(currentBlockParts.join("")),resultParts.push(BLOCK_PLACEHOLDER));return new StringWithEscapedBlocks(resultParts.join(""),escapedBlocks)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(input),nextBlockIndex=0;return inputWithEscapedBlocks.escapedString.replace(_ruleRe,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];var selector=m[2],content="",suffix=m[4],contentPrefix="";suffix&&suffix.startsWith("{"+BLOCK_PLACEHOLDER)&&(content=inputWithEscapedBlocks.blocks[nextBlockIndex++],suffix=suffix.substring(BLOCK_PLACEHOLDER.length+1),contentPrefix="{");var rule=ruleCallback(new CssRule(selector,content));return""+m[1]+rule.selector+m[3]+contentPrefix+rule.content+suffix})}(cssText,function(rule){var selector=rule.selector,content=rule.content;return"@"!=rule.selector[0]?selector=_this._scopeSelector(rule.selector,scopeSelector,hostSelector,_this.strictStyling):(rule.selector.startsWith("@media")||rule.selector.startsWith("@supports")||rule.selector.startsWith("@page")||rule.selector.startsWith("@document"))&&(content=_this._scopeSelectors(rule.content,scopeSelector,hostSelector)),new CssRule(selector,content)})},ShadowCss.prototype._scopeSelector=function(selector,scopeSelector,hostSelector,strict){var _this=this;return selector.split(",").map(function(part){return part.trim().split(_shadowDeepSelectors)}).map(function(deepParts){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(deepParts),shallowPart=_a[0],otherParts=_a.slice(1);return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([function(shallowPart){return _this._selectorNeedsScoping(shallowPart,scopeSelector)?strict?_this._applyStrictSelectorScope(shallowPart,scopeSelector,hostSelector):_this._applySelectorScope(shallowPart,scopeSelector,hostSelector):shallowPart}(shallowPart)],otherParts).join(" ")}).join(", ")},ShadowCss.prototype._selectorNeedsScoping=function(selector,scopeSelector){return!this._makeScopeMatcher(scopeSelector).test(selector)},ShadowCss.prototype._makeScopeMatcher=function(scopeSelector){return scopeSelector=scopeSelector.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+scopeSelector+")"+_selectorReSuffix,"m")},ShadowCss.prototype._applySelectorScope=function(selector,scopeSelector,hostSelector){return this._applySimpleSelectorScope(selector,scopeSelector,hostSelector)},ShadowCss.prototype._applySimpleSelectorScope=function(selector,scopeSelector,hostSelector){if(_polyfillHostRe.lastIndex=0,_polyfillHostRe.test(selector)){var replaceBy_1=this.strictStyling?"["+hostSelector+"]":scopeSelector;return selector.replace(_polyfillHostNoCombinatorRe,function(hnc,selector){return selector.replace(/([^:]*)(:*)(.*)/,function(_,before,colon,after){return before+replaceBy_1+colon+after})}).replace(_polyfillHostRe,replaceBy_1+" ")}return scopeSelector+" "+selector},ShadowCss.prototype._applyStrictSelectorScope=function(selector,scopeSelector,hostSelector){for(var res,_this=this,attrName="["+(scopeSelector=scopeSelector.replace(/\[is=([^\]]*)\]/g,function(_){for(var parts=[],_i=1;_i<arguments.length;_i++)parts[_i-1]=arguments[_i];return parts[0]}))+"]",_scopeSelectorPart=function(p){var scopedP=p.trim();if(!scopedP)return"";if(p.indexOf(_polyfillHostNoCombinator)>-1)scopedP=_this._applySimpleSelectorScope(p,scopeSelector,hostSelector);else{var t=p.replace(_polyfillHostRe,"");if(t.length>0){var matches=t.match(/([^:]*)(:*)(.*)/);matches&&(scopedP=matches[1]+attrName+matches[2]+matches[3])}}return scopedP},safeContent=new SafeSelector(selector),scopedSelector="",startIndex=0,sep=/( |>|\+|~(?!=))\s*/g,shouldScope=!((selector=safeContent.content()).indexOf(_polyfillHostNoCombinator)>-1);null!==(res=sep.exec(selector));){var separator=res[1],part_1=selector.slice(startIndex,res.index).trim();scopedSelector+=((shouldScope=shouldScope||part_1.indexOf(_polyfillHostNoCombinator)>-1)?_scopeSelectorPart(part_1):part_1)+" "+separator+" ",startIndex=sep.lastIndex}var part=selector.substring(startIndex);return scopedSelector+=(shouldScope=shouldScope||part.indexOf(_polyfillHostNoCombinator)>-1)?_scopeSelectorPart(part):part,safeContent.restore(scopedSelector)},ShadowCss.prototype._insertPolyfillHostInCssText=function(selector){return selector.replace(_colonHostContextRe,_polyfillHostContext).replace(_colonHostRe,_polyfillHost)},ShadowCss}(),SafeSelector=function(){function SafeSelector(selector){var _this=this;this.placeholders=[],this.index=0,selector=selector.replace(/(\[[^\]]*\])/g,function(_,keep){var replaceBy="__ph-"+_this.index+"__";return _this.placeholders.push(keep),_this.index++,replaceBy}),this._content=selector.replace(/(:nth-[-\w]+)(\([^)]+\))/g,function(_,pseudo,exp){var replaceBy="__ph-"+_this.index+"__";return _this.placeholders.push(exp),_this.index++,pseudo+replaceBy})}return SafeSelector.prototype.restore=function(content){var _this=this;return content.replace(/__ph-(\d+)__/g,function(ph,index){return _this.placeholders[+index]})},SafeSelector.prototype.content=function(){return this._content},SafeSelector}(),_cssContentNextSelectorRe=/polyfill-next-selector[^}]*content:[\s]*?(['"])(.*?)\1[;\s]*}([^{]*?){/gim,_cssContentRuleRe=/(polyfill-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim,_cssContentUnscopedRuleRe=/(polyfill-unscoped-rule)[^}]*(content:[\s]*(['"])(.*?)\3)[;\s]*[^}]*}/gim,_polyfillHost="-shadowcsshost",_polyfillHostContext="-shadowcsscontext",_parenSuffix=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",_cssColonHostRe=new RegExp("("+_polyfillHost+_parenSuffix,"gim"),_cssColonHostContextRe=new RegExp("("+_polyfillHostContext+_parenSuffix,"gim"),_polyfillHostNoCombinator=_polyfillHost+"-no-combinator",_polyfillHostNoCombinatorRe=/-shadowcsshost-no-combinator([^\s]*)/,_shadowDOMSelectorsRe=[/::shadow/g,/::content/g,/\/shadow-deep\//g,/\/shadow\//g],_shadowDeepSelectors=/(?:>>>)|(?:\/deep\/)|(?:::ng-deep)/g,_selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",_polyfillHostRe=/-shadowcsshost/gim,_colonHostRe=/:host/gim,_colonHostContextRe=/:host-context/gim,_commentRe=/\/\*\s*[\s\S]*?\*\//g;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var _commentWithHashRe=/\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g;var _ruleRe=/(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g,_curlyRe=/([{}])/g,OPEN_CURLY="{",CLOSE_CURLY="}",BLOCK_PLACEHOLDER="%BLOCK%",CssRule=function CssRule(selector,content){this.selector=selector,this.content=content};var StringWithEscapedBlocks=function StringWithEscapedBlocks(escapedString,blocks){this.escapedString=escapedString,this.blocks=blocks};var HOST_ATTR="_nghost-%COMP%",CONTENT_ATTR="_ngcontent-%COMP%",StylesCompileDependency=function StylesCompileDependency(name,moduleUrl,setValue){this.name=name,this.moduleUrl=moduleUrl,this.setValue=setValue},CompiledStylesheet=function CompiledStylesheet(outputCtx,stylesVar,dependencies,isShimmed,meta){this.outputCtx=outputCtx,this.stylesVar=stylesVar,this.dependencies=dependencies,this.isShimmed=isShimmed,this.meta=meta},StyleCompiler=function(){function StyleCompiler(_urlResolver){this._urlResolver=_urlResolver,this._shadowCss=new ShadowCss}return StyleCompiler.prototype.compileComponent=function(outputCtx,comp){var template=comp.template;return this._compileStyles(outputCtx,comp,new CompileStylesheetMetadata({styles:template.styles,styleUrls:template.styleUrls,moduleUrl:identifierModuleUrl(comp.type)}),this.needsStyleShim(comp),!0)},StyleCompiler.prototype.compileStyles=function(outputCtx,comp,stylesheet,shim){return void 0===shim&&(shim=this.needsStyleShim(comp)),this._compileStyles(outputCtx,comp,stylesheet,shim,!1)},StyleCompiler.prototype.needsStyleShim=function(comp){return comp.template.encapsulation===ViewEncapsulation.Emulated},StyleCompiler.prototype._compileStyles=function(outputCtx,comp,stylesheet,shim,isComponentStylesheet){var _this=this,styleExpressions=stylesheet.styles.map(function(plainStyle){return literal(_this._shimIfNeeded(plainStyle,shim))}),dependencies=[];stylesheet.styleUrls.forEach(function(styleUrl){var exprIndex=styleExpressions.length;styleExpressions.push(null),dependencies.push(new StylesCompileDependency(getStylesVarName(null),styleUrl,function(value){return styleExpressions[exprIndex]=outputCtx.importExpr(value)}))});var stylesVar=getStylesVarName(isComponentStylesheet?comp:null),stmt=variable(stylesVar).set(literalArr(styleExpressions,new ArrayType(DYNAMIC_TYPE,[TypeModifier.Const]))).toDeclStmt(null,isComponentStylesheet?[StmtModifier.Final]:[StmtModifier.Final,StmtModifier.Exported]);return outputCtx.statements.push(stmt),new CompiledStylesheet(outputCtx,stylesVar,dependencies,shim,stylesheet)},StyleCompiler.prototype._shimIfNeeded=function(style,shim){return shim?this._shadowCss.shimCssText(style,CONTENT_ATTR,HOST_ATTR):style},StyleCompiler}();function getStylesVarName(component){var result="styles";return component&&(result+="_"+identifierName(component.type)),result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(){function AstPath(path,position){void 0===position&&(position=-1),this.path=path,this.position=position}Object.defineProperty(AstPath.prototype,"empty",{get:function(){return!this.path||!this.path.length},enumerable:!0,configurable:!0}),Object.defineProperty(AstPath.prototype,"head",{get:function(){return this.path[0]},enumerable:!0,configurable:!0}),Object.defineProperty(AstPath.prototype,"tail",{get:function(){return this.path[this.path.length-1]},enumerable:!0,configurable:!0}),AstPath.prototype.parentOf=function(node){return node&&this.path[this.path.indexOf(node)-1]},AstPath.prototype.childOf=function(node){return this.path[this.path.indexOf(node)+1]},AstPath.prototype.first=function(ctor){for(var i=this.path.length-1;i>=0;i--){var item=this.path[i];if(item instanceof ctor)return item}},AstPath.prototype.push=function(node){this.path.push(node)},AstPath.prototype.pop=function(){return this.path.pop()}}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var Text$3=function(){function Text(value,sourceSpan,i18n){this.value=value,this.sourceSpan=sourceSpan,this.i18n=i18n}return Text.prototype.visit=function(visitor,context){return visitor.visitText(this,context)},Text}(),Expansion=function(){function Expansion(switchValue,type,cases,sourceSpan,switchValueSourceSpan,i18n){this.switchValue=switchValue,this.type=type,this.cases=cases,this.sourceSpan=sourceSpan,this.switchValueSourceSpan=switchValueSourceSpan,this.i18n=i18n}return Expansion.prototype.visit=function(visitor,context){return visitor.visitExpansion(this,context)},Expansion}(),ExpansionCase=function(){function ExpansionCase(value,expression,sourceSpan,valueSourceSpan,expSourceSpan){this.value=value,this.expression=expression,this.sourceSpan=sourceSpan,this.valueSourceSpan=valueSourceSpan,this.expSourceSpan=expSourceSpan}return ExpansionCase.prototype.visit=function(visitor,context){return visitor.visitExpansionCase(this,context)},ExpansionCase}(),Attribute=function(){function Attribute(name,value,sourceSpan,valueSpan,i18n){this.name=name,this.value=value,this.sourceSpan=sourceSpan,this.valueSpan=valueSpan,this.i18n=i18n}return Attribute.prototype.visit=function(visitor,context){return visitor.visitAttribute(this,context)},Attribute}(),Element$1=function(){function Element(name,attrs,children,sourceSpan,startSourceSpan,endSourceSpan,i18n){void 0===startSourceSpan&&(startSourceSpan=null),void 0===endSourceSpan&&(endSourceSpan=null),this.name=name,this.attrs=attrs,this.children=children,this.sourceSpan=sourceSpan,this.startSourceSpan=startSourceSpan,this.endSourceSpan=endSourceSpan,this.i18n=i18n}return Element.prototype.visit=function(visitor,context){return visitor.visitElement(this,context)},Element}(),Comment=function(){function Comment(value,sourceSpan){this.value=value,this.sourceSpan=sourceSpan}return Comment.prototype.visit=function(visitor,context){return visitor.visitComment(this,context)},Comment}();function visitAll$1(visitor,nodes,context){void 0===context&&(context=null);var result=[],visit=visitor.visit?function(ast){return visitor.visit(ast,context)||ast.visit(visitor,context)}:function(ast){return ast.visit(visitor,context)};return nodes.forEach(function(ast){var astResult=visit(ast);astResult&&result.push(astResult)}),result}var TokenType;!function(){function RecursiveVisitor(){}RecursiveVisitor.prototype.visitElement=function(ast,context){this.visitChildren(context,function(visit){visit(ast.attrs),visit(ast.children)})},RecursiveVisitor.prototype.visitAttribute=function(ast,context){},RecursiveVisitor.prototype.visitText=function(ast,context){},RecursiveVisitor.prototype.visitComment=function(ast,context){},RecursiveVisitor.prototype.visitExpansion=function(ast,context){return this.visitChildren(context,function(visit){visit(ast.cases)})},RecursiveVisitor.prototype.visitExpansionCase=function(ast,context){},RecursiveVisitor.prototype.visitChildren=function(context,cb){var results=[],t=this;return cb(function visit(children){children&&results.push(visitAll$1(t,children,context))}),[].concat.apply([],results)}}();!function(TokenType){TokenType[TokenType.TAG_OPEN_START=0]="TAG_OPEN_START",TokenType[TokenType.TAG_OPEN_END=1]="TAG_OPEN_END",TokenType[TokenType.TAG_OPEN_END_VOID=2]="TAG_OPEN_END_VOID",TokenType[TokenType.TAG_CLOSE=3]="TAG_CLOSE",TokenType[TokenType.TEXT=4]="TEXT",TokenType[TokenType.ESCAPABLE_RAW_TEXT=5]="ESCAPABLE_RAW_TEXT",TokenType[TokenType.RAW_TEXT=6]="RAW_TEXT",TokenType[TokenType.COMMENT_START=7]="COMMENT_START",TokenType[TokenType.COMMENT_END=8]="COMMENT_END",TokenType[TokenType.CDATA_START=9]="CDATA_START",TokenType[TokenType.CDATA_END=10]="CDATA_END",TokenType[TokenType.ATTR_NAME=11]="ATTR_NAME",TokenType[TokenType.ATTR_QUOTE=12]="ATTR_QUOTE",TokenType[TokenType.ATTR_VALUE=13]="ATTR_VALUE",TokenType[TokenType.DOC_TYPE=14]="DOC_TYPE",TokenType[TokenType.EXPANSION_FORM_START=15]="EXPANSION_FORM_START",TokenType[TokenType.EXPANSION_CASE_VALUE=16]="EXPANSION_CASE_VALUE",TokenType[TokenType.EXPANSION_CASE_EXP_START=17]="EXPANSION_CASE_EXP_START",TokenType[TokenType.EXPANSION_CASE_EXP_END=18]="EXPANSION_CASE_EXP_END",TokenType[TokenType.EXPANSION_FORM_END=19]="EXPANSION_FORM_END",TokenType[TokenType.EOF=20]="EOF"}(TokenType||(TokenType={}));var Token=function Token(type,parts,sourceSpan){this.type=type,this.parts=parts,this.sourceSpan=sourceSpan},TokenError=function(_super){function TokenError(errorMsg,tokenType,span){var _this=_super.call(this,span,errorMsg)||this;return _this.tokenType=tokenType,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TokenError,_super),TokenError}(ParseError),TokenizeResult=function TokenizeResult(tokens,errors){this.tokens=tokens,this.errors=errors};var _CR_OR_CRLF_REGEXP=/\r\n?/g;function _unexpectedCharacterErrorMsg(charCode){return'Unexpected character "'+(charCode===$EOF?"EOF":String.fromCharCode(charCode))+'"'}function _unknownEntityErrorMsg(entitySrc){return'Unknown entity "'+entitySrc+'" - use the "&#<decimal>;" or  "&#x<hex>;" syntax'}var _ControlFlowError=function _ControlFlowError(error){this.error=error},_Tokenizer=function(){function _Tokenizer(_file,_getTagDefinition,options){this._getTagDefinition=_getTagDefinition,this._currentTokenStart=null,this._currentTokenType=null,this._expansionCaseStack=[],this._inInterpolation=!1,this.tokens=[],this.errors=[],this._tokenizeIcu=options.tokenizeExpansionForms||!1,this._interpolationConfig=options.interpolationConfig||DEFAULT_INTERPOLATION_CONFIG,this._leadingTriviaCodePoints=options.leadingTriviaChars&&options.leadingTriviaChars.map(function(c){return c.codePointAt(0)||0});var range=options.range||{endPos:_file.content.length,startPos:0,startLine:0,startCol:0};this._cursor=options.escapedString?new EscapedCharacterCursor(_file,range):new PlainCharacterCursor(_file,range);try{this._cursor.init()}catch(e){this.handleError(e)}}return _Tokenizer.prototype._processCarriageReturns=function(content){return content.replace(_CR_OR_CRLF_REGEXP,"\n")},_Tokenizer.prototype.tokenize=function(){for(;this._cursor.peek()!==$EOF;){var start=this._cursor.clone();try{this._attemptCharCode(60)?this._attemptCharCode(33)?this._attemptCharCode(91)?this._consumeCdata(start):this._attemptCharCode($MINUS)?this._consumeComment(start):this._consumeDocType(start):this._attemptCharCode($SLASH)?this._consumeTagClose(start):this._consumeTagOpen(start):this._tokenizeIcu&&this._tokenizeExpansionForm()||this._consumeText()}catch(e){this.handleError(e)}}return this._beginToken(TokenType.EOF),this._endToken([]),new TokenizeResult(function mergeTextTokens(srcTokens){for(var dstTokens=[],lastDstToken=void 0,i=0;i<srcTokens.length;i++){var token=srcTokens[i];lastDstToken&&lastDstToken.type==TokenType.TEXT&&token.type==TokenType.TEXT?(lastDstToken.parts[0]+=token.parts[0],lastDstToken.sourceSpan.end=token.sourceSpan.end):(lastDstToken=token,dstTokens.push(lastDstToken))}return dstTokens}(this.tokens),this.errors)},_Tokenizer.prototype._tokenizeExpansionForm=function(){Iif(this.isExpansionFormStart())return this._consumeExpansionFormStart(),!0;Iif(function isExpansionCaseStart(peek){return peek===$EQ||isAsciiLetter(peek)||isDigit(peek)}(this._cursor.peek())&&this._isInExpansionForm())return this._consumeExpansionCaseStart(),!0;Iif(125===this._cursor.peek()){if(this._isInExpansionCase())return this._consumeExpansionCaseEnd(),!0;if(this._isInExpansionForm())return this._consumeExpansionFormEnd(),!0}return!1},_Tokenizer.prototype._beginToken=function(type,start){void 0===start&&(start=this._cursor.clone()),this._currentTokenStart=start,this._currentTokenType=type},_Tokenizer.prototype._endToken=function(parts,end){Iif(void 0===end&&(end=this._cursor.clone()),null===this._currentTokenStart)throw new TokenError("Programming error - attempted to end a token when there was no start to the token",this._currentTokenType,this._cursor.getSpan(end));Iif(null===this._currentTokenType)throw new TokenError("Programming error - attempted to end a token which has no token type",null,this._cursor.getSpan(this._currentTokenStart));var token=new Token(this._currentTokenType,parts,this._cursor.getSpan(this._currentTokenStart,this._leadingTriviaCodePoints));return this.tokens.push(token),this._currentTokenStart=null,this._currentTokenType=null,token},_Tokenizer.prototype._createError=function(msg,span){this._isInExpansionForm()&&(msg+=' (Do you have an unescaped "{" in your template? Use "{{ \'{\' }}") to escape it.)');var error=new TokenError(msg,this._currentTokenType,span);return this._currentTokenStart=null,this._currentTokenType=null,new _ControlFlowError(error)},_Tokenizer.prototype.handleError=function(e){if(e instanceof CursorError&&(e=this._createError(e.msg,this._cursor.getSpan(e.cursor))),!(e instanceof _ControlFlowError))throw e;this.errors.push(e.error)},_Tokenizer.prototype._attemptCharCode=function(charCode){return this._cursor.peek()===charCode&&(this._cursor.advance(),!0)},_Tokenizer.prototype._attemptCharCodeCaseInsensitive=function(charCode){return!!function compareCharCodeCaseInsensitive(code1,code2){return toUpperCaseCharCode(code1)==toUpperCaseCharCode(code2)}(this._cursor.peek(),charCode)&&(this._cursor.advance(),!0)},_Tokenizer.prototype._requireCharCode=function(charCode){var location=this._cursor.clone();Iif(!this._attemptCharCode(charCode))throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()),this._cursor.getSpan(location))},_Tokenizer.prototype._attemptStr=function(chars){var len=chars.length;if(this._cursor.charsLeft()<len)return!1;for(var initialPosition=this._cursor.clone(),i=0;i<len;i++)if(!this._attemptCharCode(chars.charCodeAt(i)))return this._cursor=initialPosition,!1;return!0},_Tokenizer.prototype._attemptStrCaseInsensitive=function(chars){for(var i=0;i<chars.length;i++)if(!this._attemptCharCodeCaseInsensitive(chars.charCodeAt(i)))return!1;return!0},_Tokenizer.prototype._requireStr=function(chars){var location=this._cursor.clone();if(!this._attemptStr(chars))throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()),this._cursor.getSpan(location))},_Tokenizer.prototype._attemptCharCodeUntilFn=function(predicate){for(;!predicate(this._cursor.peek());)this._cursor.advance()},_Tokenizer.prototype._requireCharCodeUntilFn=function(predicate,len){var start=this._cursor.clone();Iif(this._attemptCharCodeUntilFn(predicate),this._cursor.clone().diff(start)<len)throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()),this._cursor.getSpan(start))},_Tokenizer.prototype._attemptUntilChar=function(char){for(;this._cursor.peek()!==char;)this._cursor.advance()},_Tokenizer.prototype._readChar=function(decodeEntities){Iif(decodeEntities&&38===this._cursor.peek())return this._decodeEntity();var char=String.fromCodePoint(this._cursor.peek());return this._cursor.advance(),char},_Tokenizer.prototype._decodeEntity=function(){var start=this._cursor.clone();if(this._cursor.advance(),!this._attemptCharCode(35)){var nameStart=this._cursor.clone();if(this._attemptCharCodeUntilFn(isNamedEntityEnd),this._cursor.peek()!=$SEMICOLON)return this._cursor=nameStart,"&";var name_1=this._cursor.getChars(nameStart);this._cursor.advance();var char=NAMED_ENTITIES[name_1];if(!char)throw this._createError(_unknownEntityErrorMsg(name_1),this._cursor.getSpan(start));return char}var isHex=this._attemptCharCode(120)||this._attemptCharCode(88),codeStart=this._cursor.clone();if(this._attemptCharCodeUntilFn(isDigitEntityEnd),this._cursor.peek()!=$SEMICOLON)throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()),this._cursor.getSpan());var strNum=this._cursor.getChars(codeStart);this._cursor.advance();try{var charCode=parseInt(strNum,isHex?16:10);return String.fromCharCode(charCode)}catch(_a){throw this._createError(_unknownEntityErrorMsg(this._cursor.getChars(start)),this._cursor.getSpan())}},_Tokenizer.prototype._consumeRawText=function(decodeEntities,endMarkerPredicate){this._beginToken(decodeEntities?TokenType.ESCAPABLE_RAW_TEXT:TokenType.RAW_TEXT);for(var parts=[];;){var tagCloseStart=this._cursor.clone(),foundEndMarker=endMarkerPredicate();if(this._cursor=tagCloseStart,foundEndMarker)break;parts.push(this._readChar(decodeEntities))}return this._endToken([this._processCarriageReturns(parts.join(""))])},_Tokenizer.prototype._consumeComment=function(start){var _this=this;this._beginToken(TokenType.COMMENT_START,start),this._requireCharCode($MINUS),this._endToken([]),this._consumeRawText(!1,function(){return _this._attemptStr("--\x3e")}),this._beginToken(TokenType.COMMENT_END),this._requireStr("--\x3e"),this._endToken([])},_Tokenizer.prototype._consumeCdata=function(start){var _this=this;this._beginToken(TokenType.CDATA_START,start),this._requireStr("CDATA["),this._endToken([]),this._consumeRawText(!1,function(){return _this._attemptStr("]]>")}),this._beginToken(TokenType.CDATA_END),this._requireStr("]]>"),this._endToken([])},_Tokenizer.prototype._consumeDocType=function(start){this._beginToken(TokenType.DOC_TYPE,start);var contentStart=this._cursor.clone();this._attemptUntilChar($GT);var content=this._cursor.getChars(contentStart);this._cursor.advance(),this._endToken([content])},_Tokenizer.prototype._consumePrefixAndName=function(){for(var code,nameStart,nameOrPrefixStart=this._cursor.clone(),prefix="";58!==this._cursor.peek()&&!(((code=this._cursor.peek())<$a||$z<code)&&(code<$A||$Z<code)&&(code<$0||code>$9));)this._cursor.advance();return 58===this._cursor.peek()?(prefix=this._cursor.getChars(nameOrPrefixStart),this._cursor.advance(),nameStart=this._cursor.clone()):nameStart=nameOrPrefixStart,this._requireCharCodeUntilFn(isNameEnd,""===prefix?0:1),[prefix,this._cursor.getChars(nameStart)]},_Tokenizer.prototype._consumeTagOpen=function(start){var tagName,prefix,openTagToken,tokensBeforeTagOpen=this.tokens.length,innerStart=this._cursor.clone();try{Iif(!isAsciiLetter(this._cursor.peek()))throw this._createError(_unexpectedCharacterErrorMsg(this._cursor.peek()),this._cursor.getSpan(start));for(prefix=(openTagToken=this._consumeTagOpenStart(start)).parts[0],tagName=openTagToken.parts[1],this._attemptCharCodeUntilFn(isNotWhitespace);this._cursor.peek()!==$SLASH&&this._cursor.peek()!==$GT;)this._consumeAttributeName(),this._attemptCharCodeUntilFn(isNotWhitespace),this._attemptCharCode($EQ)&&(this._attemptCharCodeUntilFn(isNotWhitespace),this._consumeAttributeValue()),this._attemptCharCodeUntilFn(isNotWhitespace);this._consumeTagOpenEnd()}catch(e){if(e instanceof _ControlFlowError)return this._cursor=innerStart,openTagToken&&(this.tokens.length=tokensBeforeTagOpen),this._beginToken(TokenType.TEXT,start),void this._endToken(["<"]);throw e}var contentTokenType=this._getTagDefinition(tagName).contentType;contentTokenType===TagContentType.RAW_TEXT?this._consumeRawTextWithTagClose(prefix,tagName,!1):contentTokenType===TagContentType.ESCAPABLE_RAW_TEXT&&this._consumeRawTextWithTagClose(prefix,tagName,!0)},_Tokenizer.prototype._consumeRawTextWithTagClose=function(prefix,tagName,decodeEntities){var _this=this;this._consumeRawText(decodeEntities,function(){return!!_this._attemptCharCode(60)&&(!!_this._attemptCharCode($SLASH)&&(_this._attemptCharCodeUntilFn(isNotWhitespace),!!_this._attemptStrCaseInsensitive(tagName)&&(_this._attemptCharCodeUntilFn(isNotWhitespace),_this._attemptCharCode($GT))))});this._beginToken(TokenType.TAG_CLOSE),this._requireCharCodeUntilFn(function(code){return code===$GT},3),this._cursor.advance(),this._endToken([prefix,tagName])},_Tokenizer.prototype._consumeTagOpenStart=function(start){this._beginToken(TokenType.TAG_OPEN_START,start);var parts=this._consumePrefixAndName();return this._endToken(parts)},_Tokenizer.prototype._consumeAttributeName=function(){var attrNameStart=this._cursor.peek();Iif(attrNameStart===$SQ||attrNameStart===$DQ)throw this._createError(_unexpectedCharacterErrorMsg(attrNameStart),this._cursor.getSpan());this._beginToken(TokenType.ATTR_NAME);var prefixAndName=this._consumePrefixAndName();this._endToken(prefixAndName)},_Tokenizer.prototype._consumeAttributeValue=function(){var value;Eif(this._cursor.peek()===$SQ||this._cursor.peek()===$DQ){this._beginToken(TokenType.ATTR_QUOTE);var quoteChar=this._cursor.peek();this._cursor.advance(),this._endToken([String.fromCodePoint(quoteChar)]),this._beginToken(TokenType.ATTR_VALUE);for(var parts=[];this._cursor.peek()!==quoteChar;)parts.push(this._readChar(!0));value=parts.join(""),this._endToken([this._processCarriageReturns(value)]),this._beginToken(TokenType.ATTR_QUOTE),this._cursor.advance(),this._endToken([String.fromCodePoint(quoteChar)])}else{this._beginToken(TokenType.ATTR_VALUE);var valueStart=this._cursor.clone();this._requireCharCodeUntilFn(isNameEnd,1),value=this._cursor.getChars(valueStart),this._endToken([this._processCarriageReturns(value)])}},_Tokenizer.prototype._consumeTagOpenEnd=function(){var tokenType=this._attemptCharCode($SLASH)?TokenType.TAG_OPEN_END_VOID:TokenType.TAG_OPEN_END;this._beginToken(tokenType),this._requireCharCode($GT),this._endToken([])},_Tokenizer.prototype._consumeTagClose=function(start){this._beginToken(TokenType.TAG_CLOSE,start),this._attemptCharCodeUntilFn(isNotWhitespace);var prefixAndName=this._consumePrefixAndName();this._attemptCharCodeUntilFn(isNotWhitespace),this._requireCharCode($GT),this._endToken(prefixAndName)},_Tokenizer.prototype._consumeExpansionFormStart=function(){this._beginToken(TokenType.EXPANSION_FORM_START),this._requireCharCode(123),this._endToken([]),this._expansionCaseStack.push(TokenType.EXPANSION_FORM_START),this._beginToken(TokenType.RAW_TEXT);var condition=this._readUntil(44);this._endToken([condition]),this._requireCharCode(44),this._attemptCharCodeUntilFn(isNotWhitespace),this._beginToken(TokenType.RAW_TEXT);var type=this._readUntil(44);this._endToken([type]),this._requireCharCode(44),this._attemptCharCodeUntilFn(isNotWhitespace)},_Tokenizer.prototype._consumeExpansionCaseStart=function(){this._beginToken(TokenType.EXPANSION_CASE_VALUE);var value=this._readUntil(123).trim();this._endToken([value]),this._attemptCharCodeUntilFn(isNotWhitespace),this._beginToken(TokenType.EXPANSION_CASE_EXP_START),this._requireCharCode(123),this._endToken([]),this._attemptCharCodeUntilFn(isNotWhitespace),this._expansionCaseStack.push(TokenType.EXPANSION_CASE_EXP_START)},_Tokenizer.prototype._consumeExpansionCaseEnd=function(){this._beginToken(TokenType.EXPANSION_CASE_EXP_END),this._requireCharCode(125),this._endToken([]),this._attemptCharCodeUntilFn(isNotWhitespace),this._expansionCaseStack.pop()},_Tokenizer.prototype._consumeExpansionFormEnd=function(){this._beginToken(TokenType.EXPANSION_FORM_END),this._requireCharCode(125),this._endToken([]),this._expansionCaseStack.pop()},_Tokenizer.prototype._consumeText=function(){var start=this._cursor.clone();this._beginToken(TokenType.TEXT,start);var parts=[];do{this._interpolationConfig&&this._attemptStr(this._interpolationConfig.start)?(parts.push(this._interpolationConfig.start),this._inInterpolation=!0):this._interpolationConfig&&this._inInterpolation&&this._attemptStr(this._interpolationConfig.end)?(parts.push(this._interpolationConfig.end),this._inInterpolation=!1):parts.push(this._readChar(!0))}while(!this._isTextEnd());this._endToken([this._processCarriageReturns(parts.join(""))])},_Tokenizer.prototype._isTextEnd=function(){if(60===this._cursor.peek()||this._cursor.peek()===$EOF)return!0;if(this._tokenizeIcu&&!this._inInterpolation){Iif(this.isExpansionFormStart())return!0;Iif(125===this._cursor.peek()&&this._isInExpansionCase())return!0}return!1},_Tokenizer.prototype._readUntil=function(char){var start=this._cursor.clone();return this._attemptUntilChar(char),this._cursor.getChars(start)},_Tokenizer.prototype._isInExpansionCase=function(){return this._expansionCaseStack.length>0&&this._expansionCaseStack[this._expansionCaseStack.length-1]===TokenType.EXPANSION_CASE_EXP_START},_Tokenizer.prototype._isInExpansionForm=function(){return this._expansionCaseStack.length>0&&this._expansionCaseStack[this._expansionCaseStack.length-1]===TokenType.EXPANSION_FORM_START},_Tokenizer.prototype.isExpansionFormStart=function(){if(123!==this._cursor.peek())return!1;Eif(this._interpolationConfig){var start=this._cursor.clone(),isInterpolation=this._attemptStr(this._interpolationConfig.start);return this._cursor=start,!isInterpolation}return!0},_Tokenizer}();function isNotWhitespace(code){return!isWhitespace(code)||code===$EOF}function isNameEnd(code){return isWhitespace(code)||code===$GT||code===$SLASH||code===$SQ||code===$DQ||code===$EQ}function isDigitEntityEnd(code){return code==$SEMICOLON||code==$EOF||!function isAsciiHexDigit(code){return code>=$a&&code<=$f||code>=$A&&code<=$F||isDigit(code)}(code)}function isNamedEntityEnd(code){return code==$SEMICOLON||code==$EOF||!isAsciiLetter(code)}function toUpperCaseCharCode(code){return code>=$a&&code<=$z?code-$a+$A:code}var PlainCharacterCursor=function(){function PlainCharacterCursor(fileOrCursor,range){if(fileOrCursor instanceof PlainCharacterCursor)this.file=fileOrCursor.file,this.input=fileOrCursor.input,this.end=fileOrCursor.end,this.state=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},fileOrCursor.state);else{Iif(!range)throw new Error("Programming error: the range argument must be provided with a file argument.");this.file=fileOrCursor,this.input=fileOrCursor.content,this.end=range.endPos,this.state={peek:-1,offset:range.startPos,line:range.startLine,column:range.startCol}}}return PlainCharacterCursor.prototype.clone=function(){return new PlainCharacterCursor(this)},PlainCharacterCursor.prototype.peek=function(){return this.state.peek},PlainCharacterCursor.prototype.charsLeft=function(){return this.end-this.state.offset},PlainCharacterCursor.prototype.diff=function(other){return this.state.offset-other.state.offset},PlainCharacterCursor.prototype.advance=function(){this.advanceState(this.state)},PlainCharacterCursor.prototype.init=function(){this.updatePeek(this.state)},PlainCharacterCursor.prototype.getSpan=function(start,leadingTriviaCodePoints){Iif(start=start||this,leadingTriviaCodePoints)for(start=start.clone();this.diff(start)>0&&-1!==leadingTriviaCodePoints.indexOf(start.peek());)start.advance();return new ParseSourceSpan(new ParseLocation(start.file,start.state.offset,start.state.line,start.state.column),new ParseLocation(this.file,this.state.offset,this.state.line,this.state.column))},PlainCharacterCursor.prototype.getChars=function(start){return this.input.substring(start.state.offset,this.state.offset)},PlainCharacterCursor.prototype.charAt=function(pos){return this.input.charCodeAt(pos)},PlainCharacterCursor.prototype.advanceState=function(state){Iif(state.offset>=this.end)throw this.state=state,new CursorError('Unexpected character "EOF"',this);var currentChar=this.charAt(state.offset);currentChar===$LF?(state.line++,state.column=0):isNewLine(currentChar)||state.column++,state.offset++,this.updatePeek(state)},PlainCharacterCursor.prototype.updatePeek=function(state){state.peek=state.offset>=this.end?$EOF:this.charAt(state.offset)},PlainCharacterCursor}(),EscapedCharacterCursor=function(_super){function EscapedCharacterCursor(fileOrCursor,range){var _this=this;return fileOrCursor instanceof EscapedCharacterCursor?(_this=_super.call(this,fileOrCursor)||this).internalState=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},fileOrCursor.internalState):(_this=_super.call(this,fileOrCursor,range)||this).internalState=_this.state,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(EscapedCharacterCursor,_super),EscapedCharacterCursor.prototype.advance=function(){this.state=this.internalState,_super.prototype.advance.call(this),this.processEscapeSequence()},EscapedCharacterCursor.prototype.init=function(){_super.prototype.init.call(this),this.processEscapeSequence()},EscapedCharacterCursor.prototype.clone=function(){return new EscapedCharacterCursor(this)},EscapedCharacterCursor.prototype.getChars=function(start){for(var cursor=start.clone(),chars="";cursor.internalState.offset<this.internalState.offset;)chars+=String.fromCodePoint(cursor.peek()),cursor.advance();return chars},EscapedCharacterCursor.prototype.processEscapeSequence=function(){var _this=this,peek=function(){return _this.internalState.peek};if(92===peek())if(this.internalState=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},this.state),this.advanceState(this.internalState),peek()===$n)this.state.peek=$LF;else if(peek()===$r)this.state.peek=$CR;else if(peek()===$v)this.state.peek=$VTAB;else if(peek()===$t)this.state.peek=$TAB;else if(98===peek())this.state.peek=8;else if(peek()===$f)this.state.peek=$FF;else if(117===peek())if(this.advanceState(this.internalState),123===peek()){this.advanceState(this.internalState);for(var digitStart=this.clone(),length_1=0;125!==peek();)this.advanceState(this.internalState),length_1++;this.state.peek=this.decodeHexDigits(digitStart,length_1)}else{digitStart=this.clone();this.advanceState(this.internalState),this.advanceState(this.internalState),this.advanceState(this.internalState),this.state.peek=this.decodeHexDigits(digitStart,4)}else if(120===peek()){this.advanceState(this.internalState);digitStart=this.clone();this.advanceState(this.internalState),this.state.peek=this.decodeHexDigits(digitStart,2)}else if(isOctalDigit(peek())){for(var octal="",length_2=0,previous=this.clone();isOctalDigit(peek())&&length_2<3;)previous=this.clone(),octal+=String.fromCodePoint(peek()),this.advanceState(this.internalState),length_2++;this.state.peek=parseInt(octal,8),this.internalState=previous.internalState}else isNewLine(this.internalState.peek)?(this.advanceState(this.internalState),this.state=this.internalState):this.state.peek=this.internalState.peek},EscapedCharacterCursor.prototype.decodeHexDigits=function(start,length){var hex=this.input.substr(start.internalState.offset,length),charCode=parseInt(hex,16);if(isNaN(charCode))throw start.state=start.internalState,new CursorError("Invalid hexadecimal escape sequence",start);return charCode},EscapedCharacterCursor}(PlainCharacterCursor),CursorError=function CursorError(msg,cursor){this.msg=msg,this.cursor=cursor},TreeError=function(_super){function TreeError(elementName,span,msg){var _this=_super.call(this,span,msg)||this;return _this.elementName=elementName,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TreeError,_super),TreeError.create=function(elementName,span,msg){return new TreeError(elementName,span,msg)},TreeError}(ParseError),ParseTreeResult=function ParseTreeResult(rootNodes,errors){this.rootNodes=rootNodes,this.errors=errors},Parser=function(){function Parser(getTagDefinition){this.getTagDefinition=getTagDefinition}return Parser.prototype.parse=function(source,url,options){var tokensAndErrors=function tokenize(source,url,getTagDefinition,options){return void 0===options&&(options={}),new _Tokenizer(new ParseSourceFile(source,url),getTagDefinition,options).tokenize()}(source,url,this.getTagDefinition,options),treeAndErrors=new _TreeBuilder(tokensAndErrors.tokens,this.getTagDefinition).build();return new ParseTreeResult(treeAndErrors.rootNodes,tokensAndErrors.errors.concat(treeAndErrors.errors))},Parser}(),_TreeBuilder=function(){function _TreeBuilder(tokens,getTagDefinition){this.tokens=tokens,this.getTagDefinition=getTagDefinition,this._index=-1,this._rootNodes=[],this._errors=[],this._elementStack=[],this._advance()}return _TreeBuilder.prototype.build=function(){for(;this._peek.type!==TokenType.EOF;)this._peek.type===TokenType.TAG_OPEN_START?this._consumeStartTag(this._advance()):this._peek.type===TokenType.TAG_CLOSE?this._consumeEndTag(this._advance()):this._peek.type===TokenType.CDATA_START?(this._closeVoidElement(),this._consumeCdata(this._advance())):this._peek.type===TokenType.COMMENT_START?(this._closeVoidElement(),this._consumeComment(this._advance())):this._peek.type===TokenType.TEXT||this._peek.type===TokenType.RAW_TEXT||this._peek.type===TokenType.ESCAPABLE_RAW_TEXT?(this._closeVoidElement(),this._consumeText(this._advance())):this._peek.type===TokenType.EXPANSION_FORM_START?this._consumeExpansion(this._advance()):this._advance();return new ParseTreeResult(this._rootNodes,this._errors)},_TreeBuilder.prototype._advance=function(){var prev=this._peek;return this._index<this.tokens.length-1&&this._index++,this._peek=this.tokens[this._index],prev},_TreeBuilder.prototype._advanceIf=function(type){return this._peek.type===type?this._advance():null},_TreeBuilder.prototype._consumeCdata=function(startToken){this._consumeText(this._advance()),this._advanceIf(TokenType.CDATA_END)},_TreeBuilder.prototype._consumeComment=function(token){var text=this._advanceIf(TokenType.RAW_TEXT);this._advanceIf(TokenType.COMMENT_END);var value=null!=text?text.parts[0].trim():null;this._addToParent(new Comment(value,token.sourceSpan))},_TreeBuilder.prototype._consumeExpansion=function(token){for(var switchValue=this._advance(),type=this._advance(),cases=[];this._peek.type===TokenType.EXPANSION_CASE_VALUE;){var expCase=this._parseExpansionCase();if(!expCase)return;cases.push(expCase)}if(this._peek.type===TokenType.EXPANSION_FORM_END){var sourceSpan=new ParseSourceSpan(token.sourceSpan.start,this._peek.sourceSpan.end);this._addToParent(new Expansion(switchValue.parts[0],type.parts[0],cases,sourceSpan,switchValue.sourceSpan)),this._advance()}else this._errors.push(TreeError.create(null,this._peek.sourceSpan,"Invalid ICU message. Missing '}'."))},_TreeBuilder.prototype._parseExpansionCase=function(){var value=this._advance();if(this._peek.type!==TokenType.EXPANSION_CASE_EXP_START)return this._errors.push(TreeError.create(null,this._peek.sourceSpan,"Invalid ICU message. Missing '{'.")),null;var start=this._advance(),exp=this._collectExpansionExpTokens(start);if(!exp)return null;var end=this._advance();exp.push(new Token(TokenType.EOF,[],end.sourceSpan));var parsedExp=new _TreeBuilder(exp,this.getTagDefinition).build();if(parsedExp.errors.length>0)return this._errors=this._errors.concat(parsedExp.errors),null;var sourceSpan=new ParseSourceSpan(value.sourceSpan.start,end.sourceSpan.end),expSourceSpan=new ParseSourceSpan(start.sourceSpan.start,end.sourceSpan.end);return new ExpansionCase(value.parts[0],parsedExp.rootNodes,sourceSpan,value.sourceSpan,expSourceSpan)},_TreeBuilder.prototype._collectExpansionExpTokens=function(start){for(var exp=[],expansionFormStack=[TokenType.EXPANSION_CASE_EXP_START];;){if(this._peek.type!==TokenType.EXPANSION_FORM_START&&this._peek.type!==TokenType.EXPANSION_CASE_EXP_START||expansionFormStack.push(this._peek.type),this._peek.type===TokenType.EXPANSION_CASE_EXP_END){if(!lastOnStack(expansionFormStack,TokenType.EXPANSION_CASE_EXP_START))return this._errors.push(TreeError.create(null,start.sourceSpan,"Invalid ICU message. Missing '}'.")),null;if(expansionFormStack.pop(),0==expansionFormStack.length)return exp}if(this._peek.type===TokenType.EXPANSION_FORM_END){if(!lastOnStack(expansionFormStack,TokenType.EXPANSION_FORM_START))return this._errors.push(TreeError.create(null,start.sourceSpan,"Invalid ICU message. Missing '}'.")),null;expansionFormStack.pop()}if(this._peek.type===TokenType.EOF)return this._errors.push(TreeError.create(null,start.sourceSpan,"Invalid ICU message. Missing '}'.")),null;exp.push(this._advance())}},_TreeBuilder.prototype._consumeText=function(token){var text=token.parts[0];if(text.length>0&&"\n"==text[0]){var parent_1=this._getParentElement();null!=parent_1&&0==parent_1.children.length&&this.getTagDefinition(parent_1.name).ignoreFirstLf&&(text=text.substring(1))}text.length>0&&this._addToParent(new Text$3(text,token.sourceSpan))},_TreeBuilder.prototype._closeVoidElement=function(){var el=this._getParentElement();el&&this.getTagDefinition(el.name).isVoid&&this._elementStack.pop()},_TreeBuilder.prototype._consumeStartTag=function(startTagToken){for(var prefix=startTagToken.parts[0],name=startTagToken.parts[1],attrs=[];this._peek.type===TokenType.ATTR_NAME;)attrs.push(this._consumeAttr(this._advance()));var fullName=this._getElementFullName(prefix,name,this._getParentElement()),selfClosing=!1;Iif(this._peek.type===TokenType.TAG_OPEN_END_VOID){this._advance(),selfClosing=!0;var tagDef=this.getTagDefinition(fullName);tagDef.canSelfClose||null!==getNsPrefix(fullName)||tagDef.isVoid||this._errors.push(TreeError.create(fullName,startTagToken.sourceSpan,'Only void and foreign elements can be self closed "'+startTagToken.parts[1]+'"'))}else this._peek.type===TokenType.TAG_OPEN_END&&(this._advance(),selfClosing=!1);var end=this._peek.sourceSpan.start,span=new ParseSourceSpan(startTagToken.sourceSpan.start,end),el=new Element$1(fullName,attrs,[],span,span,void 0);this._pushElement(el),selfClosing&&(this._popElement(fullName),el.endSourceSpan=span)},_TreeBuilder.prototype._pushElement=function(el){var parentEl=this._getParentElement();parentEl&&this.getTagDefinition(parentEl.name).isClosedByChild(el.name)&&this._elementStack.pop(),this._addToParent(el),this._elementStack.push(el)},_TreeBuilder.prototype._consumeEndTag=function(endTagToken){var fullName=this._getElementFullName(endTagToken.parts[0],endTagToken.parts[1],this._getParentElement());Iif(this._getParentElement()&&(this._getParentElement().endSourceSpan=endTagToken.sourceSpan),this.getTagDefinition(fullName).isVoid)this._errors.push(TreeError.create(fullName,endTagToken.sourceSpan,'Void elements do not have end tags "'+endTagToken.parts[1]+'"'));else Iif(!this._popElement(fullName)){var errMsg='Unexpected closing tag "'+fullName+'". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags';this._errors.push(TreeError.create(fullName,endTagToken.sourceSpan,errMsg))}},_TreeBuilder.prototype._popElement=function(fullName){for(var stackIndex=this._elementStack.length-1;stackIndex>=0;stackIndex--){var el=this._elementStack[stackIndex];Eif(el.name==fullName)return this._elementStack.splice(stackIndex,this._elementStack.length-stackIndex),!0;if(!this.getTagDefinition(el.name).closedByParent)return!1}return!1},_TreeBuilder.prototype._consumeAttr=function(attrName){var fullName=mergeNsAndName(attrName.parts[0],attrName.parts[1]),end=attrName.sourceSpan.end,value="",valueSpan=void 0;if(this._peek.type===TokenType.ATTR_QUOTE&&this._advance(),this._peek.type===TokenType.ATTR_VALUE){var valueToken=this._advance();value=valueToken.parts[0],end=valueToken.sourceSpan.end,valueSpan=valueToken.sourceSpan}this._peek.type===TokenType.ATTR_QUOTE&&(end=this._advance().sourceSpan.end);return new Attribute(fullName,value,new ParseSourceSpan(attrName.sourceSpan.start,end),valueSpan)},_TreeBuilder.prototype._getParentElement=function(){return this._elementStack.length>0?this._elementStack[this._elementStack.length-1]:null},_TreeBuilder.prototype._getParentElementSkippingContainers=function(){for(var container=null,i=this._elementStack.length-1;i>=0;i--){if(!isNgContainer(this._elementStack[i].name))return{parent:this._elementStack[i],container:container};container=this._elementStack[i]}return{parent:null,container:container}},_TreeBuilder.prototype._addToParent=function(node){var parent=this._getParentElement();null!=parent?parent.children.push(node):this._rootNodes.push(node)},_TreeBuilder.prototype._insertBeforeContainer=function(parent,container,node){if(container){if(parent){var index=parent.children.indexOf(container);parent.children[index]=node}else this._rootNodes.push(node);node.children.push(container),this._elementStack.splice(this._elementStack.indexOf(container),0,node)}else this._addToParent(node),this._elementStack.push(node)},_TreeBuilder.prototype._getElementFullName=function(prefix,localName,parentElement){return""===prefix&&""===(prefix=this.getTagDefinition(localName).implicitNamespacePrefix||"")&&null!=parentElement&&(prefix=getNsPrefix(parentElement.name)),mergeNsAndName(prefix,localName)},_TreeBuilder}();function lastOnStack(stack,element){return stack.length>0&&stack[stack.length-1]===element}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var HtmlParser=function(_super){function HtmlParser(){return _super.call(this,getHtmlTagDefinition)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(HtmlParser,_super),HtmlParser.prototype.parse=function(source,url,options){return _super.prototype.parse.call(this,source,url,options)},HtmlParser}(Parser),PRESERVE_WS_ATTR_NAME="ngPreserveWhitespaces",SKIP_WS_TRIM_TAGS=new Set(["pre","template","textarea","script","style"]),WS_CHARS=" \f\n\r\t\v ᠎ - \u2028\u2029   \ufeff",NO_WS_REGEXP=new RegExp("[^"+WS_CHARS+"]"),WS_REPLACE_REGEXP=new RegExp("["+WS_CHARS+"]{2,}","g");
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function replaceNgsp(value){return value.replace(new RegExp(NGSP_UNICODE,"g")," ")}var WhitespaceVisitor=function(){function WhitespaceVisitor(){}return WhitespaceVisitor.prototype.visitElement=function(element,context){return SKIP_WS_TRIM_TAGS.has(element.name)||function hasPreserveWhitespacesAttr(attrs){return attrs.some(function(attr){return attr.name===PRESERVE_WS_ATTR_NAME})}(element.attrs)?new Element$1(element.name,visitAll$1(this,element.attrs),element.children,element.sourceSpan,element.startSourceSpan,element.endSourceSpan,element.i18n):new Element$1(element.name,element.attrs,visitAll$1(this,element.children),element.sourceSpan,element.startSourceSpan,element.endSourceSpan,element.i18n)},WhitespaceVisitor.prototype.visitAttribute=function(attribute,context){return attribute.name!==PRESERVE_WS_ATTR_NAME?attribute:null},WhitespaceVisitor.prototype.visitText=function(text,context){return text.value.match(NO_WS_REGEXP)?new Text$3(replaceNgsp(text.value).replace(WS_REPLACE_REGEXP," "),text.sourceSpan,text.i18n):null},WhitespaceVisitor.prototype.visitComment=function(comment,context){return comment},WhitespaceVisitor.prototype.visitExpansion=function(expansion,context){return expansion},WhitespaceVisitor.prototype.visitExpansionCase=function(expansionCase,context){return expansionCase},WhitespaceVisitor}();function removeWhitespaces(htmlAstWithErrors){return new ParseTreeResult(visitAll$1(new WhitespaceVisitor,htmlAstWithErrors.rootNodes),htmlAstWithErrors.errors)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var PLURAL_CASES=["zero","one","two","few","many","other"];function expandNodes(nodes){var expander=new _Expander;return new ExpansionResult(visitAll$1(expander,nodes),expander.isExpanded,expander.errors)}var _a,ExpansionResult=function ExpansionResult(nodes,expanded,errors){this.nodes=nodes,this.expanded=expanded,this.errors=errors},ExpansionError=function(_super){function ExpansionError(span,errorMsg){return _super.call(this,span,errorMsg)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ExpansionError,_super),ExpansionError}(ParseError),_Expander=function(){function _Expander(){this.isExpanded=!1,this.errors=[]}return _Expander.prototype.visitElement=function(element,context){return new Element$1(element.name,element.attrs,visitAll$1(this,element.children),element.sourceSpan,element.startSourceSpan,element.endSourceSpan)},_Expander.prototype.visitAttribute=function(attribute,context){return attribute},_Expander.prototype.visitText=function(text,context){return text},_Expander.prototype.visitComment=function(comment,context){return comment},_Expander.prototype.visitExpansion=function(icu,context){return this.isExpanded=!0,"plural"==icu.type?function _expandPluralForm(ast,errors){var children=ast.cases.map(function(c){-1!=PLURAL_CASES.indexOf(c.value)||c.value.match(/^=\d+$/)||errors.push(new ExpansionError(c.valueSourceSpan,'Plural cases should be "=<number>" or one of '+PLURAL_CASES.join(", ")));var expansionResult=expandNodes(c.expression);return errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(expansionResult.errors)),new Element$1("ng-template",[new Attribute("ngPluralCase",""+c.value,c.valueSourceSpan)],expansionResult.nodes,c.sourceSpan,c.sourceSpan,c.sourceSpan)}),switchAttr=new Attribute("[ngPlural]",ast.switchValue,ast.switchValueSourceSpan);return new Element$1("ng-container",[switchAttr],children,ast.sourceSpan,ast.sourceSpan,ast.sourceSpan)}(icu,this.errors):function _expandDefaultForm(ast,errors){var children=ast.cases.map(function(c){var expansionResult=expandNodes(c.expression);return errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(expansionResult.errors)),"other"===c.value?new Element$1("ng-template",[new Attribute("ngSwitchDefault","",c.valueSourceSpan)],expansionResult.nodes,c.sourceSpan,c.sourceSpan,c.sourceSpan):new Element$1("ng-template",[new Attribute("ngSwitchCase",""+c.value,c.valueSourceSpan)],expansionResult.nodes,c.sourceSpan,c.sourceSpan,c.sourceSpan)}),switchAttr=new Attribute("[ngSwitch]",ast.switchValue,ast.switchValueSourceSpan);return new Element$1("ng-container",[switchAttr],children,ast.sourceSpan,ast.sourceSpan,ast.sourceSpan)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(icu,this.errors)},_Expander.prototype.visitExpansionCase=function(icuCase,context){throw new Error("Should not be reached")},_Expander}();var ProviderAstType,TextAst=function(){function TextAst(value,ngContentIndex,sourceSpan){this.value=value,this.ngContentIndex=ngContentIndex,this.sourceSpan=sourceSpan}return TextAst.prototype.visit=function(visitor,context){return visitor.visitText(this,context)},TextAst}(),BoundTextAst=function(){function BoundTextAst(value,ngContentIndex,sourceSpan){this.value=value,this.ngContentIndex=ngContentIndex,this.sourceSpan=sourceSpan}return BoundTextAst.prototype.visit=function(visitor,context){return visitor.visitBoundText(this,context)},BoundTextAst}(),AttrAst=function(){function AttrAst(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan}return AttrAst.prototype.visit=function(visitor,context){return visitor.visitAttr(this,context)},AttrAst}(),BoundPropertyMapping=((_a={})[4]=4,_a[1]=1,_a[2]=2,_a[0]=0,_a[3]=3,_a),BoundElementPropertyAst=function(){function BoundElementPropertyAst(name,type,securityContext,value,unit,sourceSpan){this.name=name,this.type=type,this.securityContext=securityContext,this.value=value,this.unit=unit,this.sourceSpan=sourceSpan,this.isAnimation=4===this.type}return BoundElementPropertyAst.fromBoundProperty=function(prop){var type=BoundPropertyMapping[prop.type];return new BoundElementPropertyAst(prop.name,type,prop.securityContext,prop.value,prop.unit,prop.sourceSpan)},BoundElementPropertyAst.prototype.visit=function(visitor,context){return visitor.visitElementProperty(this,context)},BoundElementPropertyAst}(),BoundEventAst=function(){function BoundEventAst(name,target,phase,handler,sourceSpan,handlerSpan){this.name=name,this.target=target,this.phase=phase,this.handler=handler,this.sourceSpan=sourceSpan,this.handlerSpan=handlerSpan,this.fullName=BoundEventAst.calcFullName(this.name,this.target,this.phase),this.isAnimation=!!this.phase}return BoundEventAst.calcFullName=function(name,target,phase){return target?target+":"+name:phase?"@"+name+"."+phase:name},BoundEventAst.fromParsedEvent=function(event){var target=0===event.type?event.targetOrPhase:null,phase=1===event.type?event.targetOrPhase:null;return new BoundEventAst(event.name,target,phase,event.handler,event.sourceSpan,event.handlerSpan)},BoundEventAst.prototype.visit=function(visitor,context){return visitor.visitEvent(this,context)},BoundEventAst}(),ReferenceAst=function(){function ReferenceAst(name,value,originalValue,sourceSpan){this.name=name,this.value=value,this.originalValue=originalValue,this.sourceSpan=sourceSpan}return ReferenceAst.prototype.visit=function(visitor,context){return visitor.visitReference(this,context)},ReferenceAst}(),VariableAst=function(){function VariableAst(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan}return VariableAst.fromParsedVariable=function(v){return new VariableAst(v.name,v.value,v.sourceSpan)},VariableAst.prototype.visit=function(visitor,context){return visitor.visitVariable(this,context)},VariableAst}(),ElementAst=function(){function ElementAst(name,attrs,inputs,outputs,references,directives,providers,hasViewContainer,queryMatches,children,ngContentIndex,sourceSpan,endSourceSpan){this.name=name,this.attrs=attrs,this.inputs=inputs,this.outputs=outputs,this.references=references,this.directives=directives,this.providers=providers,this.hasViewContainer=hasViewContainer,this.queryMatches=queryMatches,this.children=children,this.ngContentIndex=ngContentIndex,this.sourceSpan=sourceSpan,this.endSourceSpan=endSourceSpan}return ElementAst.prototype.visit=function(visitor,context){return visitor.visitElement(this,context)},ElementAst}(),EmbeddedTemplateAst=function(){function EmbeddedTemplateAst(attrs,outputs,references,variables,directives,providers,hasViewContainer,queryMatches,children,ngContentIndex,sourceSpan){this.attrs=attrs,this.outputs=outputs,this.references=references,this.variables=variables,this.directives=directives,this.providers=providers,this.hasViewContainer=hasViewContainer,this.queryMatches=queryMatches,this.children=children,this.ngContentIndex=ngContentIndex,this.sourceSpan=sourceSpan}return EmbeddedTemplateAst.prototype.visit=function(visitor,context){return visitor.visitEmbeddedTemplate(this,context)},EmbeddedTemplateAst}(),BoundDirectivePropertyAst=function(){function BoundDirectivePropertyAst(directiveName,templateName,value,sourceSpan){this.directiveName=directiveName,this.templateName=templateName,this.value=value,this.sourceSpan=sourceSpan}return BoundDirectivePropertyAst.prototype.visit=function(visitor,context){return visitor.visitDirectiveProperty(this,context)},BoundDirectivePropertyAst}(),DirectiveAst=function(){function DirectiveAst(directive,inputs,hostProperties,hostEvents,contentQueryStartId,sourceSpan){this.directive=directive,this.inputs=inputs,this.hostProperties=hostProperties,this.hostEvents=hostEvents,this.contentQueryStartId=contentQueryStartId,this.sourceSpan=sourceSpan}return DirectiveAst.prototype.visit=function(visitor,context){return visitor.visitDirective(this,context)},DirectiveAst}(),ProviderAst=function(){function ProviderAst(token,multiProvider,eager,providers,providerType,lifecycleHooks,sourceSpan,isModule){this.token=token,this.multiProvider=multiProvider,this.eager=eager,this.providers=providers,this.providerType=providerType,this.lifecycleHooks=lifecycleHooks,this.sourceSpan=sourceSpan,this.isModule=isModule}return ProviderAst.prototype.visit=function(visitor,context){return null},ProviderAst}();!function(ProviderAstType){ProviderAstType[ProviderAstType.PublicService=0]="PublicService",ProviderAstType[ProviderAstType.PrivateService=1]="PrivateService",ProviderAstType[ProviderAstType.Component=2]="Component",ProviderAstType[ProviderAstType.Directive=3]="Directive",ProviderAstType[ProviderAstType.Builtin=4]="Builtin"}(ProviderAstType||(ProviderAstType={}));var NgContentAst=function(){function NgContentAst(index,ngContentIndex,sourceSpan){this.index=index,this.ngContentIndex=ngContentIndex,this.sourceSpan=sourceSpan}return NgContentAst.prototype.visit=function(visitor,context){return visitor.visitNgContent(this,context)},NgContentAst}();!function(_super){function RecursiveTemplateAstVisitor(){return _super.call(this)||this}Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(RecursiveTemplateAstVisitor,_super),RecursiveTemplateAstVisitor.prototype.visitEmbeddedTemplate=function(ast,context){return this.visitChildren(context,function(visit){visit(ast.attrs),visit(ast.references),visit(ast.variables),visit(ast.directives),visit(ast.providers),visit(ast.children)})},RecursiveTemplateAstVisitor.prototype.visitElement=function(ast,context){return this.visitChildren(context,function(visit){visit(ast.attrs),visit(ast.inputs),visit(ast.outputs),visit(ast.references),visit(ast.directives),visit(ast.providers),visit(ast.children)})},RecursiveTemplateAstVisitor.prototype.visitDirective=function(ast,context){return this.visitChildren(context,function(visit){visit(ast.inputs),visit(ast.hostProperties),visit(ast.hostEvents)})},RecursiveTemplateAstVisitor.prototype.visitChildren=function(context,cb){var results=[],t=this;return cb(function visit(children){children&&children.length&&results.push(templateVisitAll(t,children,context))}),[].concat.apply([],results)}}(function(){function NullTemplateVisitor(){}return NullTemplateVisitor.prototype.visitNgContent=function(ast,context){},NullTemplateVisitor.prototype.visitEmbeddedTemplate=function(ast,context){},NullTemplateVisitor.prototype.visitElement=function(ast,context){},NullTemplateVisitor.prototype.visitReference=function(ast,context){},NullTemplateVisitor.prototype.visitVariable=function(ast,context){},NullTemplateVisitor.prototype.visitEvent=function(ast,context){},NullTemplateVisitor.prototype.visitElementProperty=function(ast,context){},NullTemplateVisitor.prototype.visitAttr=function(ast,context){},NullTemplateVisitor.prototype.visitBoundText=function(ast,context){},NullTemplateVisitor.prototype.visitText=function(ast,context){},NullTemplateVisitor.prototype.visitDirective=function(ast,context){},NullTemplateVisitor.prototype.visitDirectiveProperty=function(ast,context){},NullTemplateVisitor}());function templateVisitAll(visitor,asts,context){void 0===context&&(context=null);var result=[],visit=visitor.visit?function(ast){return visitor.visit(ast,context)||ast.visit(visitor,context)}:function(ast){return ast.visit(visitor,context)};return asts.forEach(function(ast){var astResult=visit(ast);astResult&&result.push(astResult)}),result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ProviderError=function(_super){function ProviderError(message,span){return _super.call(this,span,message)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ProviderError,_super),ProviderError}(ParseError),ProviderViewContext=function ProviderViewContext(reflector,component){var _this=this;this.reflector=reflector,this.component=component,this.errors=[],this.viewQueries=function _getViewQueries(component){var viewQueryId=1,viewQueries=new Map;return component.viewQueries&&component.viewQueries.forEach(function(query){return _addQueryToTokenMap(viewQueries,{meta:query,queryId:viewQueryId++})}),viewQueries}(component),this.viewProviders=new Map,component.viewProviders.forEach(function(provider){null==_this.viewProviders.get(tokenReference(provider.token))&&_this.viewProviders.set(tokenReference(provider.token),!0)})},ProviderElementContext=function(){function ProviderElementContext(viewContext,_parent,_isViewRoot,_directiveAsts,attrs,refs,isTemplate,contentQueryStartId,_sourceSpan){var _this=this;this.viewContext=viewContext,this._parent=_parent,this._isViewRoot=_isViewRoot,this._directiveAsts=_directiveAsts,this._sourceSpan=_sourceSpan,this._transformedProviders=new Map,this._seenProviders=new Map,this._queriedTokens=new Map,this.transformedHasViewContainer=!1,this._attrs={},attrs.forEach(function(attrAst){return _this._attrs[attrAst.name]=attrAst.value});var directivesMeta=_directiveAsts.map(function(directiveAst){return directiveAst.directive});if(this._allProviders=function _resolveProvidersFromDirectives(directives,sourceSpan,targetErrors){var providersByToken=new Map;return directives.forEach(function(directive){_resolveProviders([{token:{identifier:directive.type},useClass:directive.type}],directive.isComponent?ProviderAstType.Component:ProviderAstType.Directive,!0,sourceSpan,targetErrors,providersByToken,!1)}),directives.filter(function(dir){return dir.isComponent}).concat(directives.filter(function(dir){return!dir.isComponent})).forEach(function(directive){_resolveProviders(directive.providers,ProviderAstType.PublicService,!1,sourceSpan,targetErrors,providersByToken,!1),_resolveProviders(directive.viewProviders,ProviderAstType.PrivateService,!1,sourceSpan,targetErrors,providersByToken,!1)}),providersByToken}(directivesMeta,_sourceSpan,viewContext.errors),this._contentQueries=function _getContentQueries(contentQueryStartId,directives){var contentQueryId=contentQueryStartId,contentQueries=new Map;return directives.forEach(function(directive,directiveIndex){directive.queries&&directive.queries.forEach(function(query){return _addQueryToTokenMap(contentQueries,{meta:query,queryId:contentQueryId++})})}),contentQueries}(contentQueryStartId,directivesMeta),Array.from(this._allProviders.values()).forEach(function(provider){_this._addQueryReadsTo(provider.token,provider.token,_this._queriedTokens)}),isTemplate){var templateRefId=createTokenForExternalReference(this.viewContext.reflector,Identifiers.TemplateRef);this._addQueryReadsTo(templateRefId,templateRefId,this._queriedTokens)}refs.forEach(function(refAst){var defaultQueryValue=refAst.value||createTokenForExternalReference(_this.viewContext.reflector,Identifiers.ElementRef);_this._addQueryReadsTo({value:refAst.name},defaultQueryValue,_this._queriedTokens)}),this._queriedTokens.get(this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef))&&(this.transformedHasViewContainer=!0),Array.from(this._allProviders.values()).forEach(function(provider){(provider.eager||_this._queriedTokens.get(tokenReference(provider.token)))&&_this._getOrCreateLocalProvider(provider.providerType,provider.token,!0)})}return ProviderElementContext.prototype.afterElement=function(){var _this=this;Array.from(this._allProviders.values()).forEach(function(provider){_this._getOrCreateLocalProvider(provider.providerType,provider.token,!1)})},Object.defineProperty(ProviderElementContext.prototype,"transformProviders",{get:function(){var lazyProviders=[],eagerProviders=[];return this._transformedProviders.forEach(function(provider){provider.eager?eagerProviders.push(provider):lazyProviders.push(provider)}),lazyProviders.concat(eagerProviders)},enumerable:!0,configurable:!0}),Object.defineProperty(ProviderElementContext.prototype,"transformedDirectiveAsts",{get:function(){var sortedProviderTypes=this.transformProviders.map(function(provider){return provider.token.identifier}),sortedDirectives=this._directiveAsts.slice();return sortedDirectives.sort(function(dir1,dir2){return sortedProviderTypes.indexOf(dir1.directive.type)-sortedProviderTypes.indexOf(dir2.directive.type)}),sortedDirectives},enumerable:!0,configurable:!0}),Object.defineProperty(ProviderElementContext.prototype,"queryMatches",{get:function(){var allMatches=[];return this._queriedTokens.forEach(function(matches){allMatches.push.apply(allMatches,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(matches))}),allMatches},enumerable:!0,configurable:!0}),ProviderElementContext.prototype._addQueryReadsTo=function(token,defaultValue,queryReadTokens){this._getQueriesFor(token).forEach(function(query){var queryValue=query.meta.read||defaultValue,tokenRef=tokenReference(queryValue),queryMatches=queryReadTokens.get(tokenRef);queryMatches||(queryMatches=[],queryReadTokens.set(tokenRef,queryMatches)),queryMatches.push({queryId:query.queryId,value:queryValue})})},ProviderElementContext.prototype._getQueriesFor=function(token){for(var queries,result=[],currentEl=this,distance=0;null!==currentEl;)(queries=currentEl._contentQueries.get(tokenReference(token)))&&result.push.apply(result,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(queries.filter(function(query){return query.meta.descendants||distance<=1}))),currentEl._directiveAsts.length>0&&distance++,currentEl=currentEl._parent;return(queries=this.viewContext.viewQueries.get(tokenReference(token)))&&result.push.apply(result,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(queries)),result},ProviderElementContext.prototype._getOrCreateLocalProvider=function(requestingProviderType,token,eager){var _this=this,resolvedProvider=this._allProviders.get(tokenReference(token));if(!resolvedProvider||(requestingProviderType===ProviderAstType.Directive||requestingProviderType===ProviderAstType.PublicService)&&resolvedProvider.providerType===ProviderAstType.PrivateService||(requestingProviderType===ProviderAstType.PrivateService||requestingProviderType===ProviderAstType.PublicService)&&resolvedProvider.providerType===ProviderAstType.Builtin)return null;var transformedProviderAst=this._transformedProviders.get(tokenReference(token));if(transformedProviderAst)return transformedProviderAst;Iif(null!=this._seenProviders.get(tokenReference(token)))return this.viewContext.errors.push(new ProviderError("Cannot instantiate cyclic dependency! "+tokenName(token),this._sourceSpan)),null;this._seenProviders.set(tokenReference(token),!0);var transformedProviders=resolvedProvider.providers.map(function(provider){var transformedUseValue=provider.useValue,transformedUseExisting=provider.useExisting,transformedDeps=void 0;Iif(null!=provider.useExisting){var existingDiDep=_this._getDependency(resolvedProvider.providerType,{token:provider.useExisting},eager);null!=existingDiDep.token?transformedUseExisting=existingDiDep.token:(transformedUseExisting=null,transformedUseValue=existingDiDep.value)}else Iif(provider.useFactory){transformedDeps=(provider.deps||provider.useFactory.diDeps).map(function(dep){return _this._getDependency(resolvedProvider.providerType,dep,eager)})}else Eif(provider.useClass){transformedDeps=(provider.deps||provider.useClass.diDeps).map(function(dep){return _this._getDependency(resolvedProvider.providerType,dep,eager)})}return _transformProvider(provider,{useExisting:transformedUseExisting,useValue:transformedUseValue,deps:transformedDeps})});return transformedProviderAst=_transformProviderAst(resolvedProvider,{eager:eager,providers:transformedProviders}),this._transformedProviders.set(tokenReference(token),transformedProviderAst),transformedProviderAst},ProviderElementContext.prototype._getLocalDependency=function(requestingProviderType,dep,eager){Iif(void 0===eager&&(eager=!1),dep.isAttribute){var attrValue=this._attrs[dep.token.value];return{isValue:!0,value:null==attrValue?null:attrValue}}Eif(null!=dep.token){Eif(requestingProviderType===ProviderAstType.Directive||requestingProviderType===ProviderAstType.Component){if(tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.Renderer)||tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.ElementRef)||tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.ChangeDetectorRef)||tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.TemplateRef))return dep;tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.ViewContainerRef)&&(this.transformedHasViewContainer=!0)}Iif(tokenReference(dep.token)===this.viewContext.reflector.resolveExternalReference(Identifiers.Injector))return dep;Iif(null!=this._getOrCreateLocalProvider(requestingProviderType,dep.token,eager))return dep}return null},ProviderElementContext.prototype._getDependency=function(requestingProviderType,dep,eager){void 0===eager&&(eager=!1);var currElement=this,currEager=eager,result=null;Iif(dep.isSkipSelf||(result=this._getLocalDependency(requestingProviderType,dep,eager)),dep.isSelf)!result&&dep.isOptional&&(result={isValue:!0,value:null});else{for(;!result&&currElement._parent;){var prevElement=currElement;currElement=currElement._parent,prevElement._isViewRoot&&(currEager=!1),result=currElement._getLocalDependency(ProviderAstType.PublicService,dep,currEager)}result||(result=!dep.isHost||this.viewContext.component.isHost||this.viewContext.component.type.reference===tokenReference(dep.token)||null!=this.viewContext.viewProviders.get(tokenReference(dep.token))?dep:dep.isOptional?{isValue:!0,value:null}:null)}return result||this.viewContext.errors.push(new ProviderError("No provider for "+tokenName(dep.token),this._sourceSpan)),result},ProviderElementContext}(),NgModuleProviderAnalyzer=function(){function NgModuleProviderAnalyzer(reflector,ngModule,extraProviders,sourceSpan){var _this=this;this.reflector=reflector,this._transformedProviders=new Map,this._seenProviders=new Map,this._errors=[],this._allProviders=new Map,ngModule.transitiveModule.modules.forEach(function(ngModuleType){_resolveProviders([{token:{identifier:ngModuleType},useClass:ngModuleType}],ProviderAstType.PublicService,!0,sourceSpan,_this._errors,_this._allProviders,!0)}),_resolveProviders(ngModule.transitiveModule.providers.map(function(entry){return entry.provider}).concat(extraProviders),ProviderAstType.PublicService,!1,sourceSpan,this._errors,this._allProviders,!1)}return NgModuleProviderAnalyzer.prototype.parse=function(){var _this=this;Iif(Array.from(this._allProviders.values()).forEach(function(provider){_this._getOrCreateLocalProvider(provider.token,provider.eager)}),this._errors.length>0){var errorString=this._errors.join("\n");throw new Error("Provider parse errors:\n"+errorString)}var lazyProviders=[],eagerProviders=[];return this._transformedProviders.forEach(function(provider){provider.eager?eagerProviders.push(provider):lazyProviders.push(provider)}),lazyProviders.concat(eagerProviders)},NgModuleProviderAnalyzer.prototype._getOrCreateLocalProvider=function(token,eager){var _this=this,resolvedProvider=this._allProviders.get(tokenReference(token));if(!resolvedProvider)return null;var transformedProviderAst=this._transformedProviders.get(tokenReference(token));if(transformedProviderAst)return transformedProviderAst;Iif(null!=this._seenProviders.get(tokenReference(token)))return this._errors.push(new ProviderError("Cannot instantiate cyclic dependency! "+tokenName(token),resolvedProvider.sourceSpan)),null;this._seenProviders.set(tokenReference(token),!0);var transformedProviders=resolvedProvider.providers.map(function(provider){var transformedUseValue=provider.useValue,transformedUseExisting=provider.useExisting,transformedDeps=void 0;if(null!=provider.useExisting){var existingDiDep=_this._getDependency({token:provider.useExisting},eager,resolvedProvider.sourceSpan);null!=existingDiDep.token?transformedUseExisting=existingDiDep.token:(transformedUseExisting=null,transformedUseValue=existingDiDep.value)}else if(provider.useFactory){transformedDeps=(provider.deps||provider.useFactory.diDeps).map(function(dep){return _this._getDependency(dep,eager,resolvedProvider.sourceSpan)})}else if(provider.useClass){transformedDeps=(provider.deps||provider.useClass.diDeps).map(function(dep){return _this._getDependency(dep,eager,resolvedProvider.sourceSpan)})}return _transformProvider(provider,{useExisting:transformedUseExisting,useValue:transformedUseValue,deps:transformedDeps})});return transformedProviderAst=_transformProviderAst(resolvedProvider,{eager:eager,providers:transformedProviders}),this._transformedProviders.set(tokenReference(token),transformedProviderAst),transformedProviderAst},NgModuleProviderAnalyzer.prototype._getDependency=function(dep,eager,requestorSourceSpan){return void 0===eager&&(eager=!1),dep.isSkipSelf||null==dep.token||tokenReference(dep.token)===this.reflector.resolveExternalReference(Identifiers.Injector)||tokenReference(dep.token)===this.reflector.resolveExternalReference(Identifiers.ComponentFactoryResolver)||this._getOrCreateLocalProvider(dep.token,eager),dep},NgModuleProviderAnalyzer}();function _transformProvider(provider,_a){var useExisting=_a.useExisting,useValue=_a.useValue,deps=_a.deps;return{token:provider.token,useClass:provider.useClass,useExisting:useExisting,useFactory:provider.useFactory,useValue:useValue,deps:deps,multi:provider.multi}}function _transformProviderAst(provider,_a){var eager=_a.eager,providers=_a.providers;return new ProviderAst(provider.token,provider.multiProvider,provider.eager||eager,providers,provider.providerType,provider.lifecycleHooks,provider.sourceSpan,provider.isModule)}function _resolveProviders(providers,providerType,eager,sourceSpan,targetErrors,targetProvidersByToken,isModule){providers.forEach(function(provider){var resolvedProvider=targetProvidersByToken.get(tokenReference(provider.token));if(null!=resolvedProvider&&!!resolvedProvider.multiProvider!=!!provider.multi&&targetErrors.push(new ProviderError("Mixing multi and non multi provider is not possible for token "+tokenName(resolvedProvider.token),sourceSpan)),resolvedProvider)provider.multi||(resolvedProvider.providers.length=0),resolvedProvider.providers.push(provider);else{var lifecycleHooks=provider.token.identifier&&provider.token.identifier.lifecycleHooks?provider.token.identifier.lifecycleHooks:[],isUseValue=!(provider.useClass||provider.useExisting||provider.useFactory);resolvedProvider=new ProviderAst(provider.token,!!provider.multi,eager||isUseValue,[provider],providerType,lifecycleHooks,sourceSpan,isModule),targetProvidersByToken.set(tokenReference(provider.token),resolvedProvider)}})}function _addQueryToTokenMap(map,query){query.meta.selectors.forEach(function(token){var entry=map.get(tokenReference(token));entry||(entry=[],map.set(tokenReference(token),entry)),entry.push(query)})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var StyleWithImports=function StyleWithImports(style,styleUrls){this.style=style,this.styleUrls=styleUrls};function isStyleUrlResolvable(url){if(null==url||0===url.length||"/"==url[0])return!1;var schemeMatch=url.match(URL_WITH_SCHEMA_REGEXP);return null===schemeMatch||"package"==schemeMatch[1]||"asset"==schemeMatch[1]}var CSS_IMPORT_REGEXP=/@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g,CSS_STRIPPABLE_COMMENT_REGEXP=/\/\*(?!#\s*(?:sourceURL|sourceMappingURL)=)[\s\S]+?\*\//g,URL_WITH_SCHEMA_REGEXP=/^([^:\/?#]+):/,BindingParser=function(){function BindingParser(_exprParser,_interpolationConfig,_schemaRegistry,pipes,errors){Eif(this._exprParser=_exprParser,this._interpolationConfig=_interpolationConfig,this._schemaRegistry=_schemaRegistry,this.errors=errors,this.pipesByName=null,this._usedPipes=new Map,pipes){var pipesByName_1=new Map;pipes.forEach(function(pipe){return pipesByName_1.set(pipe.name,pipe)}),this.pipesByName=pipesByName_1}}return Object.defineProperty(BindingParser.prototype,"interpolationConfig",{get:function(){return this._interpolationConfig},enumerable:!0,configurable:!0}),BindingParser.prototype.getUsedPipes=function(){return Array.from(this._usedPipes.values())},BindingParser.prototype.createBoundHostProperties=function(dirMeta,sourceSpan){var _this=this;Eif(dirMeta.hostProperties){var boundProps_1=[];return Object.keys(dirMeta.hostProperties).forEach(function(propName){var expression=dirMeta.hostProperties[propName];"string"==typeof expression?_this.parsePropertyBinding(propName,expression,!0,sourceSpan,[],boundProps_1):_this._reportError('Value of the host property binding "'+propName+'" needs to be a string representing an expression but got "'+expression+'" ('+typeof expression+")",sourceSpan)}),boundProps_1}return null},BindingParser.prototype.createDirectiveHostPropertyAsts=function(dirMeta,elementSelector,sourceSpan){var _this=this,boundProps=this.createBoundHostProperties(dirMeta,sourceSpan);return boundProps&&boundProps.map(function(prop){return _this.createBoundElementProperty(elementSelector,prop)})},BindingParser.prototype.createDirectiveHostEventAsts=function(dirMeta,sourceSpan){var _this=this;Eif(dirMeta.hostListeners){var targetEvents_1=[];return Object.keys(dirMeta.hostListeners).forEach(function(propName){var expression=dirMeta.hostListeners[propName];"string"==typeof expression?_this.parseEvent(propName,expression,sourceSpan,sourceSpan,[],targetEvents_1):_this._reportError('Value of the host listener "'+propName+'" needs to be a string representing an expression but got "'+expression+'" ('+typeof expression+")",sourceSpan)}),targetEvents_1}return null},BindingParser.prototype.parseInterpolation=function(value,sourceSpan){var sourceInfo=sourceSpan.start.toString();try{var ast=this._exprParser.parseInterpolation(value,sourceInfo,this._interpolationConfig);return ast&&this._reportExpressionParserErrors(ast.errors,sourceSpan),this._checkPipes(ast,sourceSpan),ast}catch(e){return this._reportError(""+e,sourceSpan),this._exprParser.wrapLiteralPrimitive("ERROR",sourceInfo)}},BindingParser.prototype.parseInlineTemplateBinding=function(tplKey,tplValue,sourceSpan,targetMatchableAttrs,targetProps,targetVars){for(var bindings=this._parseTemplateBindings(tplKey,tplValue,sourceSpan),i=0;i<bindings.length;i++){var binding=bindings[i];binding.keyIsVar?targetVars.push(new ParsedVariable(binding.key,binding.name,sourceSpan)):binding.expression?this._parsePropertyAst(binding.key,binding.expression,sourceSpan,targetMatchableAttrs,targetProps):(targetMatchableAttrs.push([binding.key,""]),this.parseLiteralAttr(binding.key,null,sourceSpan,targetMatchableAttrs,targetProps))}},BindingParser.prototype._parseTemplateBindings=function(tplKey,tplValue,sourceSpan){var _this=this,sourceInfo=sourceSpan.start.toString();try{var bindingsResult=this._exprParser.parseTemplateBindings(tplKey,tplValue,sourceInfo);return this._reportExpressionParserErrors(bindingsResult.errors,sourceSpan),bindingsResult.templateBindings.forEach(function(binding){binding.expression&&_this._checkPipes(binding.expression,sourceSpan)}),bindingsResult.warnings.forEach(function(warning){_this._reportError(warning,sourceSpan,ParseErrorLevel.WARNING)}),bindingsResult.templateBindings}catch(e){return this._reportError(""+e,sourceSpan),[]}},BindingParser.prototype.parseLiteralAttr=function(name,value,sourceSpan,targetMatchableAttrs,targetProps){isAnimationLabel(name)?(name=name.substring(1),value&&this._reportError('Assigning animation triggers via @prop="exp" attributes with an expression is invalid. Use property bindings (e.g. [@prop]="exp") or use an attribute without a value (e.g. @prop) instead.',sourceSpan,ParseErrorLevel.ERROR),this._parseAnimation(name,value,sourceSpan,targetMatchableAttrs,targetProps)):targetProps.push(new ParsedProperty(name,this._exprParser.wrapLiteralPrimitive(value,""),ParsedPropertyType.LITERAL_ATTR,sourceSpan))},BindingParser.prototype.parsePropertyBinding=function(name,expression,isHost,sourceSpan,targetMatchableAttrs,targetProps){var isAnimationProp=!1;name.startsWith("animate-")?(isAnimationProp=!0,name=name.substring("animate-".length)):isAnimationLabel(name)&&(isAnimationProp=!0,name=name.substring(1)),isAnimationProp?this._parseAnimation(name,expression,sourceSpan,targetMatchableAttrs,targetProps):this._parsePropertyAst(name,this._parseBinding(expression,isHost,sourceSpan),sourceSpan,targetMatchableAttrs,targetProps)},BindingParser.prototype.parsePropertyInterpolation=function(name,value,sourceSpan,targetMatchableAttrs,targetProps){var expr=this.parseInterpolation(value,sourceSpan);return!!expr&&(this._parsePropertyAst(name,expr,sourceSpan,targetMatchableAttrs,targetProps),!0)},BindingParser.prototype._parsePropertyAst=function(name,ast,sourceSpan,targetMatchableAttrs,targetProps){targetMatchableAttrs.push([name,ast.source]),targetProps.push(new ParsedProperty(name,ast,ParsedPropertyType.DEFAULT,sourceSpan))},BindingParser.prototype._parseAnimation=function(name,expression,sourceSpan,targetMatchableAttrs,targetProps){var ast=this._parseBinding(expression||"undefined",!1,sourceSpan);targetMatchableAttrs.push([name,ast.source]),targetProps.push(new ParsedProperty(name,ast,ParsedPropertyType.ANIMATION,sourceSpan))},BindingParser.prototype._parseBinding=function(value,isHostBinding,sourceSpan){var sourceInfo=(sourceSpan&&sourceSpan.start||"(unknown)").toString();try{var ast=isHostBinding?this._exprParser.parseSimpleBinding(value,sourceInfo,this._interpolationConfig):this._exprParser.parseBinding(value,sourceInfo,this._interpolationConfig);return ast&&this._reportExpressionParserErrors(ast.errors,sourceSpan),this._checkPipes(ast,sourceSpan),ast}catch(e){return this._reportError(""+e,sourceSpan),this._exprParser.wrapLiteralPrimitive("ERROR",sourceInfo)}},BindingParser.prototype.createBoundElementProperty=function(elementSelector,boundProp,skipValidation,mapPropertyName){if(void 0===skipValidation&&(skipValidation=!1),void 0===mapPropertyName&&(mapPropertyName=!0),boundProp.isAnimation)return new BoundElementProperty(boundProp.name,4,SecurityContext.NONE,boundProp.expression,null,boundProp.sourceSpan);var unit=null,bindingType=void 0,boundPropertyName=null,parts=boundProp.name.split("."),securityContexts=void 0;if(parts.length>1)if("attr"==parts[0]){boundPropertyName=parts[1],skipValidation||this._validatePropertyOrAttributeName(boundPropertyName,boundProp.sourceSpan,!0),securityContexts=calcPossibleSecurityContexts(this._schemaRegistry,elementSelector,boundPropertyName,!0);var nsSeparatorIdx=boundPropertyName.indexOf(":");if(nsSeparatorIdx>-1){var ns=boundPropertyName.substring(0,nsSeparatorIdx),name_1=boundPropertyName.substring(nsSeparatorIdx+1);boundPropertyName=mergeNsAndName(ns,name_1)}bindingType=1}else"class"==parts[0]?(boundPropertyName=parts[1],bindingType=2,securityContexts=[SecurityContext.NONE]):"style"==parts[0]&&(unit=parts.length>2?parts[2]:null,boundPropertyName=parts[1],bindingType=3,securityContexts=[SecurityContext.STYLE]);if(null===boundPropertyName){var mappedPropName=this._schemaRegistry.getMappedPropName(boundProp.name);boundPropertyName=mapPropertyName?mappedPropName:boundProp.name,securityContexts=calcPossibleSecurityContexts(this._schemaRegistry,elementSelector,mappedPropName,!1),bindingType=0,skipValidation||this._validatePropertyOrAttributeName(mappedPropName,boundProp.sourceSpan,!1)}return new BoundElementProperty(boundPropertyName,bindingType,securityContexts[0],boundProp.expression,unit,boundProp.sourceSpan)},BindingParser.prototype.parseEvent=function(name,expression,sourceSpan,handlerSpan,targetMatchableAttrs,targetEvents){isAnimationLabel(name)?(name=name.substr(1),this._parseAnimationEvent(name,expression,sourceSpan,handlerSpan,targetEvents)):this._parseRegularEvent(name,expression,sourceSpan,handlerSpan,targetMatchableAttrs,targetEvents)},BindingParser.prototype.calcPossibleSecurityContexts=function(selector,propName,isAttribute){var prop=this._schemaRegistry.getMappedPropName(propName);return calcPossibleSecurityContexts(this._schemaRegistry,selector,prop,isAttribute)},BindingParser.prototype._parseAnimationEvent=function(name,expression,sourceSpan,handlerSpan,targetEvents){var matches=function splitAtPeriod(input,defaultValues){return _splitAt(input,".",defaultValues)}(name,[name,""]),eventName=matches[0],phase=matches[1].toLowerCase();if(phase)switch(phase){case"start":case"done":var ast=this._parseAction(expression,handlerSpan);targetEvents.push(new ParsedEvent(eventName,phase,1,ast,sourceSpan,handlerSpan));break;default:this._reportError('The provided animation output phase value "'+phase+'" for "@'+eventName+'" is not supported (use start or done)',sourceSpan)}else this._reportError("The animation trigger output event (@"+eventName+") is missing its phase value name (start or done are currently supported)",sourceSpan)},BindingParser.prototype._parseRegularEvent=function(name,expression,sourceSpan,handlerSpan,targetMatchableAttrs,targetEvents){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitAtColon(name,[null,name]),2),target=_a[0],eventName=_a[1],ast=this._parseAction(expression,handlerSpan);targetMatchableAttrs.push([name,ast.source]),targetEvents.push(new ParsedEvent(eventName,target,0,ast,sourceSpan,handlerSpan))},BindingParser.prototype._parseAction=function(value,sourceSpan){var sourceInfo=(sourceSpan&&sourceSpan.start||"(unknown").toString();try{var ast=this._exprParser.parseAction(value,sourceInfo,this._interpolationConfig);return ast&&this._reportExpressionParserErrors(ast.errors,sourceSpan),!ast||ast.ast instanceof EmptyExpr?(this._reportError("Empty expressions are not allowed",sourceSpan),this._exprParser.wrapLiteralPrimitive("ERROR",sourceInfo)):(this._checkPipes(ast,sourceSpan),ast)}catch(e){return this._reportError(""+e,sourceSpan),this._exprParser.wrapLiteralPrimitive("ERROR",sourceInfo)}},BindingParser.prototype._reportError=function(message,sourceSpan,level){void 0===level&&(level=ParseErrorLevel.ERROR),this.errors.push(new ParseError(sourceSpan,message,level))},BindingParser.prototype._reportExpressionParserErrors=function(errors,sourceSpan){var e_1,_a;try{for(var errors_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(errors),errors_1_1=errors_1.next();!errors_1_1.done;errors_1_1=errors_1.next()){var error=errors_1_1.value;this._reportError(error.message,sourceSpan)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{errors_1_1&&!errors_1_1.done&&(_a=errors_1.return)&&_a.call(errors_1)}finally{Iif(e_1)throw e_1.error}}},BindingParser.prototype._checkPipes=function(ast,sourceSpan){var _this=this;if(ast&&this.pipesByName){var collector=new PipeCollector;ast.visit(collector),collector.pipes.forEach(function(ast,pipeName){var pipeMeta=_this.pipesByName.get(pipeName);pipeMeta?_this._usedPipes.set(pipeName,pipeMeta):_this._reportError("The pipe '"+pipeName+"' could not be found",new ParseSourceSpan(sourceSpan.start.moveBy(ast.span.start),sourceSpan.start.moveBy(ast.span.end)))})}},BindingParser.prototype._validatePropertyOrAttributeName=function(propName,sourceSpan,isAttr){var report=isAttr?this._schemaRegistry.validateAttribute(propName):this._schemaRegistry.validateProperty(propName);report.error&&this._reportError(report.msg,sourceSpan,ParseErrorLevel.ERROR)},BindingParser}(),PipeCollector=function(_super){function PipeCollector(){var _this=null!==_super&&_super.apply(this,arguments)||this;return _this.pipes=new Map,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(PipeCollector,_super),PipeCollector.prototype.visitPipe=function(ast,context){return this.pipes.set(ast.name,ast),ast.exp.visit(this),this.visitAll(ast.args,context),null},PipeCollector}(RecursiveAstVisitor$1);function isAnimationLabel(name){return"@"==name[0]}function calcPossibleSecurityContexts(registry,selector,propName,isAttribute){var ctxs=[];return CssSelector.parse(selector).forEach(function(selector){var elementNames=selector.element?[selector.element]:registry.allKnownElementNames(),notElementNames=new Set(selector.notSelectors.filter(function(selector){return selector.isElementSelector()}).map(function(selector){return selector.element})),possibleElementNames=elementNames.filter(function(elementName){return!notElementNames.has(elementName)});ctxs.push.apply(ctxs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(possibleElementNames.map(function(elementName){return registry.securityContext(elementName,propName,isAttribute)})))}),0===ctxs.length?[SecurityContext.NONE]:Array.from(new Set(ctxs)).sort()}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var PreparsedElementType,NG_CONTENT_SELECT_ATTR="select",LINK_ELEMENT="link",LINK_STYLE_REL_ATTR="rel",LINK_STYLE_HREF_ATTR="href",LINK_STYLE_REL_VALUE="stylesheet",STYLE_ELEMENT="style",SCRIPT_ELEMENT="script",NG_NON_BINDABLE_ATTR="ngNonBindable",NG_PROJECT_AS="ngProjectAs";function preparseElement(ast){var selectAttr=null,hrefAttr=null,relAttr=null,nonBindable=!1,projectAs="";ast.attrs.forEach(function(attr){var lcAttrName=attr.name.toLowerCase();lcAttrName==NG_CONTENT_SELECT_ATTR?selectAttr=attr.value:lcAttrName==LINK_STYLE_HREF_ATTR?hrefAttr=attr.value:lcAttrName==LINK_STYLE_REL_ATTR?relAttr=attr.value:attr.name==NG_NON_BINDABLE_ATTR?nonBindable=!0:attr.name==NG_PROJECT_AS&&attr.value.length>0&&(projectAs=attr.value)}),selectAttr=function normalizeNgContentSelect(selectAttr){Eif(null===selectAttr||0===selectAttr.length)return"*";return selectAttr}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(selectAttr);var nodeName=ast.name.toLowerCase(),type=PreparsedElementType.OTHER;return isNgContent(nodeName)?type=PreparsedElementType.NG_CONTENT:nodeName==STYLE_ELEMENT?type=PreparsedElementType.STYLE:nodeName==SCRIPT_ELEMENT?type=PreparsedElementType.SCRIPT:nodeName==LINK_ELEMENT&&relAttr==LINK_STYLE_REL_VALUE&&(type=PreparsedElementType.STYLESHEET),new PreparsedElement(type,selectAttr,hrefAttr,nonBindable,projectAs)}!function(PreparsedElementType){PreparsedElementType[PreparsedElementType.NG_CONTENT=0]="NG_CONTENT",PreparsedElementType[PreparsedElementType.STYLE=1]="STYLE",PreparsedElementType[PreparsedElementType.STYLESHEET=2]="STYLESHEET",PreparsedElementType[PreparsedElementType.SCRIPT=3]="SCRIPT",PreparsedElementType[PreparsedElementType.OTHER=4]="OTHER"}(PreparsedElementType||(PreparsedElementType={}));var PreparsedElement=function PreparsedElement(type,selectAttr,hrefAttr,nonBindable,projectAs){this.type=type,this.selectAttr=selectAttr,this.hrefAttr=hrefAttr,this.nonBindable=nonBindable,this.projectAs=projectAs};var _TEXT_CSS_SELECTOR,BIND_NAME_REGEXP=/^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/,CLASS_ATTR="class";function TEXT_CSS_SELECTOR(){return _TEXT_CSS_SELECTOR||(_TEXT_CSS_SELECTOR=CssSelector.parse("*")[0]),_TEXT_CSS_SELECTOR}var TemplateParseError=function(_super){function TemplateParseError(message,span,level){return _super.call(this,span,message,level)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TemplateParseError,_super),TemplateParseError}(ParseError),TemplateParseResult=function TemplateParseResult(templateAst,usedPipes,errors){this.templateAst=templateAst,this.usedPipes=usedPipes,this.errors=errors},TemplateParser=function(){function TemplateParser(_config,_reflector,_exprParser,_schemaRegistry,_htmlParser,_console,transforms){this._config=_config,this._reflector=_reflector,this._exprParser=_exprParser,this._schemaRegistry=_schemaRegistry,this._htmlParser=_htmlParser,this._console=_console,this.transforms=transforms}return Object.defineProperty(TemplateParser.prototype,"expressionParser",{get:function(){return this._exprParser},enumerable:!0,configurable:!0}),TemplateParser.prototype.parse=function(component,template,directives,pipes,schemas,templateUrl,preserveWhitespaces){var result=this.tryParse(component,template,directives,pipes,schemas,templateUrl,preserveWhitespaces),warnings=result.errors.filter(function(error){return error.level===ParseErrorLevel.WARNING}),errors=result.errors.filter(function(error){return error.level===ParseErrorLevel.ERROR});Iif(warnings.length>0&&this._console.warn("Template parse warnings:\n"+warnings.join("\n")),errors.length>0)throw syntaxError("Template parse errors:\n"+errors.join("\n"),errors);return{template:result.templateAst,pipes:result.usedPipes}},TemplateParser.prototype.tryParse=function(component,template,directives,pipes,schemas,templateUrl,preserveWhitespaces){var htmlParseResult="string"==typeof template?this._htmlParser.parse(template,templateUrl,{tokenizeExpansionForms:!0,interpolationConfig:this.getInterpolationConfig(component)}):template;return preserveWhitespaces||(htmlParseResult=removeWhitespaces(htmlParseResult)),this.tryParseHtml(this.expandHtml(htmlParseResult),component,directives,pipes,schemas)},TemplateParser.prototype.tryParseHtml=function(htmlAstWithErrors,component,directives,pipes,schemas){var result,errors=htmlAstWithErrors.errors,usedPipes=[];Eif(htmlAstWithErrors.rootNodes.length>0){var uniqDirectives=removeSummaryDuplicates(directives),uniqPipes=removeSummaryDuplicates(pipes),providerViewContext=new ProviderViewContext(this._reflector,component),interpolationConfig=void 0;component.template&&component.template.interpolation&&(interpolationConfig={start:component.template.interpolation[0],end:component.template.interpolation[1]});var bindingParser=new BindingParser(this._exprParser,interpolationConfig,this._schemaRegistry,uniqPipes,errors),parseVisitor=new TemplateParseVisitor(this._reflector,this._config,providerViewContext,uniqDirectives,bindingParser,this._schemaRegistry,schemas,errors);result=visitAll$1(parseVisitor,htmlAstWithErrors.rootNodes,EMPTY_ELEMENT_CONTEXT),errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(providerViewContext.errors)),usedPipes.push.apply(usedPipes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(bindingParser.getUsedPipes()))}else result=[];return this._assertNoReferenceDuplicationOnTemplate(result,errors),errors.length>0?new TemplateParseResult(result,usedPipes,errors):(this.transforms&&this.transforms.forEach(function(transform){result=templateVisitAll(transform,result)}),new TemplateParseResult(result,usedPipes,errors))},TemplateParser.prototype.expandHtml=function(htmlAstWithErrors,forced){void 0===forced&&(forced=!1);var errors=htmlAstWithErrors.errors;Eif(0==errors.length||forced){var expandedHtmlAst=expandNodes(htmlAstWithErrors.rootNodes);errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(expandedHtmlAst.errors)),htmlAstWithErrors=new ParseTreeResult(expandedHtmlAst.nodes,errors)}return htmlAstWithErrors},TemplateParser.prototype.getInterpolationConfig=function(component){if(component.template)return InterpolationConfig.fromArray(component.template.interpolation)},TemplateParser.prototype._assertNoReferenceDuplicationOnTemplate=function(result,errors){var existingReferences=[];result.filter(function(element){return!!element.references}).forEach(function(element){return element.references.forEach(function(reference){var name=reference.name;Eif(existingReferences.indexOf(name)<0)existingReferences.push(name);else{var error=new TemplateParseError('Reference "#'+name+'" is defined several times',reference.sourceSpan,ParseErrorLevel.ERROR);errors.push(error)}})})},TemplateParser}(),TemplateParseVisitor=function(){function TemplateParseVisitor(reflector,config,providerViewContext,directives,_bindingParser,_schemaRegistry,_schemas,_targetErrors){var _this=this;this.reflector=reflector,this.config=config,this.providerViewContext=providerViewContext,this._bindingParser=_bindingParser,this._schemaRegistry=_schemaRegistry,this._schemas=_schemas,this._targetErrors=_targetErrors,this.selectorMatcher=new SelectorMatcher,this.directivesIndex=new Map,this.ngContentCount=0,this.contentQueryStartId=providerViewContext.component.viewQueries.length+1,directives.forEach(function(directive,index){var selector=CssSelector.parse(directive.selector);_this.selectorMatcher.addSelectables(selector,directive),_this.directivesIndex.set(directive,index)})}return TemplateParseVisitor.prototype.visitExpansion=function(expansion,context){return null},TemplateParseVisitor.prototype.visitExpansionCase=function(expansionCase,context){return null},TemplateParseVisitor.prototype.visitText=function(text,parent){var ngContentIndex=parent.findNgContentIndex(TEXT_CSS_SELECTOR()),valueNoNgsp=replaceNgsp(text.value),expr=this._bindingParser.parseInterpolation(valueNoNgsp,text.sourceSpan);return expr?new BoundTextAst(expr,ngContentIndex,text.sourceSpan):new TextAst(valueNoNgsp,ngContentIndex,text.sourceSpan)},TemplateParseVisitor.prototype.visitAttribute=function(attribute,context){return new AttrAst(attribute.name,attribute.value,attribute.sourceSpan)},TemplateParseVisitor.prototype.visitComment=function(comment,context){return null},TemplateParseVisitor.prototype.visitElement=function(element,parent){var _this=this,queryStartIndex=this.contentQueryStartId,elName=element.name,preparsedElement=preparseElement(element);Iif(preparsedElement.type===PreparsedElementType.SCRIPT||preparsedElement.type===PreparsedElementType.STYLE)return null;Iif(preparsedElement.type===PreparsedElementType.STYLESHEET&&isStyleUrlResolvable(preparsedElement.hrefAttr))return null;var matchableAttrs=[],elementOrDirectiveProps=[],elementOrDirectiveRefs=[],elementVars=[],events=[],templateElementOrDirectiveProps=[],templateMatchableAttrs=[],templateElementVars=[],hasInlineTemplates=!1,attrs=[],isTemplateElement=isNgTemplate(element.name);element.attrs.forEach(function(attr){var templateValue,templateKey,hasBinding=_this._parseAttr(isTemplateElement,attr,matchableAttrs,elementOrDirectiveProps,events,elementOrDirectiveRefs,elementVars);elementVars.push.apply(elementVars,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([].map(function(v){return VariableAst.fromParsedVariable(v)})));var normalizedName=_this._normalizeAttributeName(attr.name);normalizedName.startsWith("*")&&(templateValue=attr.value,templateKey=normalizedName.substring("*".length));var hasTemplateBinding=null!=templateValue;Iif(hasTemplateBinding){hasInlineTemplates&&_this._reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *",attr.sourceSpan),hasInlineTemplates=!0;var parsedVariables_1=[];_this._bindingParser.parseInlineTemplateBinding(templateKey,templateValue,attr.sourceSpan,templateMatchableAttrs,templateElementOrDirectiveProps,parsedVariables_1),templateElementVars.push.apply(templateElementVars,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(parsedVariables_1.map(function(v){return VariableAst.fromParsedVariable(v)})))}hasBinding||hasTemplateBinding||(attrs.push(_this.visitAttribute(attr,null)),matchableAttrs.push([attr.name,attr.value]))});var elementCssSelector=createElementCssSelector(elName,matchableAttrs),_a=this._parseDirectives(this.selectorMatcher,elementCssSelector),directiveMetas=_a.directives,matchElement=_a.matchElement,references=[],boundDirectivePropNames=new Set,directiveAsts=this._createDirectiveAsts(isTemplateElement,element.name,directiveMetas,elementOrDirectiveProps,elementOrDirectiveRefs,element.sourceSpan,references,boundDirectivePropNames),elementProps=this._createElementPropertyAsts(element.name,elementOrDirectiveProps,boundDirectivePropNames),isViewRoot=parent.isTemplateElement||hasInlineTemplates,providerContext=new ProviderElementContext(this.providerViewContext,parent.providerContext,isViewRoot,directiveAsts,attrs,references,isTemplateElement,queryStartIndex,element.sourceSpan),children=visitAll$1(preparsedElement.nonBindable?NON_BINDABLE_VISITOR:this,element.children,ElementContext.create(isTemplateElement,directiveAsts,isTemplateElement?parent.providerContext:providerContext));providerContext.afterElement();var parsedElement,projectionSelector=""!=preparsedElement.projectAs?CssSelector.parse(preparsedElement.projectAs)[0]:elementCssSelector,ngContentIndex=parent.findNgContentIndex(projectionSelector);Iif(preparsedElement.type===PreparsedElementType.NG_CONTENT)element.children&&!element.children.every(_isEmptyTextNode)&&this._reportError("<ng-content> element cannot have content.",element.sourceSpan),parsedElement=new NgContentAst(this.ngContentCount++,hasInlineTemplates?null:ngContentIndex,element.sourceSpan);else if(isTemplateElement)this._assertAllEventsPublishedByDirectives(directiveAsts,events),this._assertNoComponentsNorElementBindingsOnTemplate(directiveAsts,elementProps,element.sourceSpan),parsedElement=new EmbeddedTemplateAst(attrs,events,references,elementVars,providerContext.transformedDirectiveAsts,providerContext.transformProviders,providerContext.transformedHasViewContainer,providerContext.queryMatches,children,hasInlineTemplates?null:ngContentIndex,element.sourceSpan);else{this._assertElementExists(matchElement,element),this._assertOnlyOneComponent(directiveAsts,element.sourceSpan);var ngContentIndex_1=hasInlineTemplates?null:parent.findNgContentIndex(projectionSelector);parsedElement=new ElementAst(elName,attrs,elementProps,events,references,providerContext.transformedDirectiveAsts,providerContext.transformProviders,providerContext.transformedHasViewContainer,providerContext.queryMatches,children,hasInlineTemplates?null:ngContentIndex_1,element.sourceSpan,element.endSourceSpan||null)}Iif(hasInlineTemplates){var templateQueryStartIndex=this.contentQueryStartId,templateSelector=createElementCssSelector("ng-template",templateMatchableAttrs),directives=this._parseDirectives(this.selectorMatcher,templateSelector).directives,templateBoundDirectivePropNames=new Set,templateDirectiveAsts=this._createDirectiveAsts(!0,elName,directives,templateElementOrDirectiveProps,[],element.sourceSpan,[],templateBoundDirectivePropNames),templateElementProps=this._createElementPropertyAsts(elName,templateElementOrDirectiveProps,templateBoundDirectivePropNames);this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectiveAsts,templateElementProps,element.sourceSpan);var templateProviderContext=new ProviderElementContext(this.providerViewContext,parent.providerContext,parent.isTemplateElement,templateDirectiveAsts,[],[],!0,templateQueryStartIndex,element.sourceSpan);templateProviderContext.afterElement(),parsedElement=new EmbeddedTemplateAst([],[],[],templateElementVars,templateProviderContext.transformedDirectiveAsts,templateProviderContext.transformProviders,templateProviderContext.transformedHasViewContainer,templateProviderContext.queryMatches,[parsedElement],ngContentIndex,element.sourceSpan)}return parsedElement},TemplateParseVisitor.prototype._parseAttr=function(isTemplateElement,attr,targetMatchableAttrs,targetProps,targetEvents,targetRefs,targetVars){var name=this._normalizeAttributeName(attr.name),value=attr.value,srcSpan=attr.sourceSpan,boundEvents=[],bindParts=name.match(BIND_NAME_REGEXP),hasBinding=!1;Eif(null!==bindParts)Iif(hasBinding=!0,null!=bindParts[1])this._bindingParser.parsePropertyBinding(bindParts[7],value,!1,srcSpan,targetMatchableAttrs,targetProps);else Iif(bindParts[2])if(isTemplateElement){var identifier=bindParts[7];this._parseVariable(identifier,value,srcSpan,targetVars)}else this._reportError('"let-" is only supported on ng-template elements.',srcSpan);else if(bindParts[3]){identifier=bindParts[7];this._parseReference(identifier,value,srcSpan,targetRefs)}else bindParts[4]?this._bindingParser.parseEvent(bindParts[7],value,srcSpan,attr.valueSpan||srcSpan,targetMatchableAttrs,boundEvents):bindParts[5]?(this._bindingParser.parsePropertyBinding(bindParts[7],value,!1,srcSpan,targetMatchableAttrs,targetProps),this._parseAssignmentEvent(bindParts[7],value,srcSpan,attr.valueSpan||srcSpan,targetMatchableAttrs,boundEvents)):bindParts[6]?this._bindingParser.parseLiteralAttr(name,value,srcSpan,targetMatchableAttrs,targetProps):bindParts[8]?(this._bindingParser.parsePropertyBinding(bindParts[8],value,!1,srcSpan,targetMatchableAttrs,targetProps),this._parseAssignmentEvent(bindParts[8],value,srcSpan,attr.valueSpan||srcSpan,targetMatchableAttrs,boundEvents)):bindParts[9]?this._bindingParser.parsePropertyBinding(bindParts[9],value,!1,srcSpan,targetMatchableAttrs,targetProps):bindParts[10]&&this._bindingParser.parseEvent(bindParts[10],value,srcSpan,attr.valueSpan||srcSpan,targetMatchableAttrs,boundEvents);else hasBinding=this._bindingParser.parsePropertyInterpolation(name,value,srcSpan,targetMatchableAttrs,targetProps);return hasBinding||this._bindingParser.parseLiteralAttr(name,value,srcSpan,targetMatchableAttrs,targetProps),targetEvents.push.apply(targetEvents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(boundEvents.map(function(e){return BoundEventAst.fromParsedEvent(e)}))),hasBinding},TemplateParseVisitor.prototype._normalizeAttributeName=function(attrName){return/^data-/i.test(attrName)?attrName.substring(5):attrName},TemplateParseVisitor.prototype._parseVariable=function(identifier,value,sourceSpan,targetVars){identifier.indexOf("-")>-1&&this._reportError('"-" is not allowed in variable names',sourceSpan),targetVars.push(new VariableAst(identifier,value,sourceSpan))},TemplateParseVisitor.prototype._parseReference=function(identifier,value,sourceSpan,targetRefs){identifier.indexOf("-")>-1&&this._reportError('"-" is not allowed in reference names',sourceSpan),targetRefs.push(new ElementOrDirectiveRef(identifier,value,sourceSpan))},TemplateParseVisitor.prototype._parseAssignmentEvent=function(name,expression,sourceSpan,valueSpan,targetMatchableAttrs,targetEvents){this._bindingParser.parseEvent(name+"Change",expression+"=$event",sourceSpan,valueSpan,targetMatchableAttrs,targetEvents)},TemplateParseVisitor.prototype._parseDirectives=function(selectorMatcher,elementCssSelector){var _this=this,directives=new Array(this.directivesIndex.size),matchElement=!1;return selectorMatcher.match(elementCssSelector,function(selector,directive){directives[_this.directivesIndex.get(directive)]=directive,matchElement=matchElement||selector.hasElementSelector()}),{directives:directives.filter(function(dir){return!!dir}),matchElement:matchElement}},TemplateParseVisitor.prototype._createDirectiveAsts=function(isTemplateElement,elementName,directives,props,elementOrDirectiveRefs,elementSourceSpan,targetReferences,targetBoundDirectivePropNames){var _this=this,matchedReferences=new Set,component=null,directiveAsts=directives.map(function(directive){var sourceSpan=new ParseSourceSpan(elementSourceSpan.start,elementSourceSpan.end,"Directive "+identifierName(directive.type));directive.isComponent&&(component=directive);var directiveProperties=[],hostProperties=_this._bindingParser.createDirectiveHostPropertyAsts(directive,elementName,sourceSpan).map(function(prop){return BoundElementPropertyAst.fromBoundProperty(prop)});hostProperties=_this._checkPropertiesInSchema(elementName,hostProperties);var parsedEvents=_this._bindingParser.createDirectiveHostEventAsts(directive,sourceSpan);_this._createDirectivePropertyAsts(directive.inputs,props,directiveProperties,targetBoundDirectivePropNames),elementOrDirectiveRefs.forEach(function(elOrDirRef){(0===elOrDirRef.value.length&&directive.isComponent||elOrDirRef.isReferenceToDirective(directive))&&(targetReferences.push(new ReferenceAst(elOrDirRef.name,createTokenForReference(directive.type.reference),elOrDirRef.value,elOrDirRef.sourceSpan)),matchedReferences.add(elOrDirRef.name))});var hostEvents=parsedEvents.map(function(e){return BoundEventAst.fromParsedEvent(e)}),contentQueryStartId=_this.contentQueryStartId;return _this.contentQueryStartId+=directive.queries.length,new DirectiveAst(directive,directiveProperties,hostProperties,hostEvents,contentQueryStartId,sourceSpan)});return elementOrDirectiveRefs.forEach(function(elOrDirRef){Iif(elOrDirRef.value.length>0)matchedReferences.has(elOrDirRef.name)||_this._reportError('There is no directive with "exportAs" set to "'+elOrDirRef.value+'"',elOrDirRef.sourceSpan);else Eif(!component){var refToken=null;isTemplateElement&&(refToken=createTokenForExternalReference(_this.reflector,Identifiers.TemplateRef)),targetReferences.push(new ReferenceAst(elOrDirRef.name,refToken,elOrDirRef.value,elOrDirRef.sourceSpan))}}),directiveAsts},TemplateParseVisitor.prototype._createDirectivePropertyAsts=function(directiveProperties,boundProps,targetBoundDirectiveProps,targetBoundDirectivePropNames){Eif(directiveProperties){var boundPropsByName_1=new Map;boundProps.forEach(function(boundProp){var prevValue=boundPropsByName_1.get(boundProp.name);prevValue&&!prevValue.isLiteral||boundPropsByName_1.set(boundProp.name,boundProp)}),Object.keys(directiveProperties).forEach(function(dirProp){var elProp=directiveProperties[dirProp],boundProp=boundPropsByName_1.get(elProp);boundProp&&(targetBoundDirectivePropNames.add(boundProp.name),isEmptyExpression(boundProp.expression)||targetBoundDirectiveProps.push(new BoundDirectivePropertyAst(dirProp,boundProp.name,boundProp.expression,boundProp.sourceSpan)))})}},TemplateParseVisitor.prototype._createElementPropertyAsts=function(elementName,props,boundDirectivePropNames){var _this=this,boundElementProps=[];return props.forEach(function(prop){if(!prop.isLiteral&&!boundDirectivePropNames.has(prop.name)){var boundProp=_this._bindingParser.createBoundElementProperty(elementName,prop);boundElementProps.push(BoundElementPropertyAst.fromBoundProperty(boundProp))}}),this._checkPropertiesInSchema(elementName,boundElementProps)},TemplateParseVisitor.prototype._findComponentDirectives=function(directives){return directives.filter(function(directive){return directive.directive.isComponent})},TemplateParseVisitor.prototype._findComponentDirectiveNames=function(directives){return this._findComponentDirectives(directives).map(function(directive){return identifierName(directive.directive.type)})},TemplateParseVisitor.prototype._assertOnlyOneComponent=function(directives,sourceSpan){var componentTypeNames=this._findComponentDirectiveNames(directives);componentTypeNames.length>1&&this._reportError("More than one component matched on this element.\nMake sure that only one component's selector can match a given element.\nConflicting components: "+componentTypeNames.join(","),sourceSpan)},TemplateParseVisitor.prototype._assertElementExists=function(matchElement,element){var elName=element.name.replace(/^:xhtml:/,"");Iif(!matchElement&&!this._schemaRegistry.hasElement(elName,this._schemas)){var errorMsg="'"+elName+"' is not a known element:\n";errorMsg+="1. If '"+elName+"' is an Angular component, then verify that it is part of this module.\n",elName.indexOf("-")>-1?errorMsg+="2. If '"+elName+"' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.":errorMsg+="2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.",this._reportError(errorMsg,element.sourceSpan)}},TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate=function(directives,elementProps,sourceSpan){var _this=this,componentTypeNames=this._findComponentDirectiveNames(directives);componentTypeNames.length>0&&this._reportError("Components on an embedded template: "+componentTypeNames.join(","),sourceSpan),elementProps.forEach(function(prop){_this._reportError("Property binding "+prop.name+' not used by any directive on an embedded template. Make sure that the property name is spelled correctly and all directives are listed in the "@NgModule.declarations".',sourceSpan)})},TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives=function(directives,events){var _this=this,allDirectiveEvents=new Set;directives.forEach(function(directive){Object.keys(directive.directive.outputs).forEach(function(k){var eventName=directive.directive.outputs[k];allDirectiveEvents.add(eventName)})}),events.forEach(function(event){null==event.target&&allDirectiveEvents.has(event.name)||_this._reportError("Event binding "+event.fullName+' not emitted by any directive on an embedded template. Make sure that the event name is spelled correctly and all directives are listed in the "@NgModule.declarations".',event.sourceSpan)})},TemplateParseVisitor.prototype._checkPropertiesInSchema=function(elementName,boundProps){var _this=this;return boundProps.filter(function(boundProp){if(0===boundProp.type&&!_this._schemaRegistry.hasProperty(elementName,boundProp.name,_this._schemas)){var errorMsg="Can't bind to '"+boundProp.name+"' since it isn't a known property of '"+elementName+"'.";elementName.startsWith("ng-")?errorMsg+="\n1. If '"+boundProp.name+"' is an Angular directive, then add 'CommonModule' to the '@NgModule.imports' of this component.\n2. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.":elementName.indexOf("-")>-1&&(errorMsg+="\n1. If '"+elementName+"' is an Angular component and it has '"+boundProp.name+"' input, then verify that it is part of this module.\n2. If '"+elementName+"' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.\n3. To allow any property add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component."),_this._reportError(errorMsg,boundProp.sourceSpan)}return!isEmptyExpression(boundProp.value)})},TemplateParseVisitor.prototype._reportError=function(message,sourceSpan,level){void 0===level&&(level=ParseErrorLevel.ERROR),this._targetErrors.push(new ParseError(sourceSpan,message,level))},TemplateParseVisitor}(),NonBindableVisitor=function(){function NonBindableVisitor(){}return NonBindableVisitor.prototype.visitElement=function(ast,parent){var preparsedElement=preparseElement(ast);if(preparsedElement.type===PreparsedElementType.SCRIPT||preparsedElement.type===PreparsedElementType.STYLE||preparsedElement.type===PreparsedElementType.STYLESHEET)return null;var attrNameAndValues=ast.attrs.map(function(attr){return[attr.name,attr.value]}),selector=createElementCssSelector(ast.name,attrNameAndValues),ngContentIndex=parent.findNgContentIndex(selector),children=visitAll$1(this,ast.children,EMPTY_ELEMENT_CONTEXT);return new ElementAst(ast.name,visitAll$1(this,ast.attrs),[],[],[],[],[],!1,[],children,ngContentIndex,ast.sourceSpan,ast.endSourceSpan)},NonBindableVisitor.prototype.visitComment=function(comment,context){return null},NonBindableVisitor.prototype.visitAttribute=function(attribute,context){return new AttrAst(attribute.name,attribute.value,attribute.sourceSpan)},NonBindableVisitor.prototype.visitText=function(text,parent){var ngContentIndex=parent.findNgContentIndex(TEXT_CSS_SELECTOR());return new TextAst(text.value,ngContentIndex,text.sourceSpan)},NonBindableVisitor.prototype.visitExpansion=function(expansion,context){return expansion},NonBindableVisitor.prototype.visitExpansionCase=function(expansionCase,context){return expansionCase},NonBindableVisitor}(),ElementOrDirectiveRef=function(){function ElementOrDirectiveRef(name,value,sourceSpan){this.name=name,this.value=value,this.sourceSpan=sourceSpan}return ElementOrDirectiveRef.prototype.isReferenceToDirective=function(directive){return-1!==function splitExportAs(exportAs){return exportAs?exportAs.split(",").map(function(e){return e.trim()}):[]}(directive.exportAs).indexOf(this.value)},ElementOrDirectiveRef}();var ElementContext=function(){function ElementContext(isTemplateElement,_ngContentIndexMatcher,_wildcardNgContentIndex,providerContext){this.isTemplateElement=isTemplateElement,this._ngContentIndexMatcher=_ngContentIndexMatcher,this._wildcardNgContentIndex=_wildcardNgContentIndex,this.providerContext=providerContext}return ElementContext.create=function(isTemplateElement,directives,providerContext){var matcher=new SelectorMatcher,wildcardNgContentIndex=null,component=directives.find(function(directive){return directive.directive.isComponent});if(component)for(var ngContentSelectors=component.directive.template.ngContentSelectors,i=0;i<ngContentSelectors.length;i++){"*"===ngContentSelectors[i]?wildcardNgContentIndex=i:matcher.addSelectables(CssSelector.parse(ngContentSelectors[i]),i)}return new ElementContext(isTemplateElement,matcher,wildcardNgContentIndex,providerContext)},ElementContext.prototype.findNgContentIndex=function(selector){var ngContentIndices=[];return this._ngContentIndexMatcher.match(selector,function(selector,ngContentIndex){ngContentIndices.push(ngContentIndex)}),ngContentIndices.sort(),null!=this._wildcardNgContentIndex&&ngContentIndices.push(this._wildcardNgContentIndex),ngContentIndices.length>0?ngContentIndices[0]:null},ElementContext}();function createElementCssSelector(elementName,attributes){var cssSelector=new CssSelector,elNameNoNs=splitNsName(elementName)[1];cssSelector.setElement(elNameNoNs);for(var i=0;i<attributes.length;i++){var attrName=attributes[i][0],attrNameNoNs=splitNsName(attrName)[1],attrValue=attributes[i][1];Iif(cssSelector.addAttribute(attrNameNoNs,attrValue),attrName.toLowerCase()==CLASS_ATTR)attrValue.trim().split(/\s+/g).forEach(function(className){return cssSelector.addClassName(className)})}return cssSelector}var EMPTY_ELEMENT_CONTEXT=new ElementContext(!0,new SelectorMatcher,null,null),NON_BINDABLE_VISITOR=new NonBindableVisitor;function _isEmptyTextNode(node){return node instanceof Text$3&&0==node.value.trim().length}function removeSummaryDuplicates(items){var map=new Map;return items.forEach(function(item){map.get(item.type.reference)||map.set(item.type.reference,item)}),Array.from(map.values())}function isEmptyExpression(ast){return ast instanceof ASTWithSource&&(ast=ast.ast),ast instanceof EmptyExpr}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function stripUnnecessaryQuotes(value){var qS=value.charCodeAt(0);if(qS==value.charCodeAt(value.length-1)&&(39==qS||34==qS)){var tempValue=value.substring(1,value.length-1);-1==tempValue.indexOf("'")&&-1==tempValue.indexOf('"')&&(value=tempValue)}return value}function hyphenate(value){return value.replace(/[a-z][A-Z]/g,function(v){return v.charAt(0)+"-"+v.charAt(1)}).toLowerCase()}var TokenType$1,IMPORTANT_FLAG="!important",StylingBuilder=function(){function StylingBuilder(_elementIndexExpr,_directiveExpr){this._elementIndexExpr=_elementIndexExpr,this._directiveExpr=_directiveExpr,this._hasInitialValues=!1,this.hasBindings=!1,this._classMapInput=null,this._styleMapInput=null,this._singleStyleInputs=null,this._singleClassInputs=null,this._lastStylingInput=null,this._stylesIndex=new Map,this._classesIndex=new Map,this._initialStyleValues=[],this._initialClassValues=[],this._useDefaultSanitizer=!1}return StylingBuilder.prototype.registerBoundInput=function(input){var binding=null,name=input.name;switch(input.type){case 0:binding=this.registerInputBasedOnName(name,input.value,input.sourceSpan);break;case 3:binding=this.registerStyleInput(name,!1,input.value,input.sourceSpan,input.unit);break;case 2:binding=this.registerClassInput(name,!1,input.value,input.sourceSpan)}return!!binding},StylingBuilder.prototype.registerInputBasedOnName=function(name,expression,sourceSpan){var binding=null,nameToMatch=name.substring(0,5),isStyle="style"===nameToMatch;if(isStyle||!isStyle&&"class"===nameToMatch){var isMapBased="."!==name.charAt(5),property=name.substr(isMapBased?5:6);binding=isStyle?this.registerStyleInput(property,isMapBased,expression,sourceSpan):this.registerClassInput(property,isMapBased,expression,sourceSpan)}return binding},StylingBuilder.prototype.registerStyleInput=function(name,isMapBased,value,sourceSpan,unit){if(isEmptyExpression(value))return null;var _a=parseProperty(name),property=_a.property,hasOverrideFlag=_a.hasOverrideFlag,bindingUnit=_a.unit,entry={name:property,unit:unit||bindingUnit,value:value,sourceSpan:sourceSpan,hasOverrideFlag:hasOverrideFlag};return isMapBased?(this._useDefaultSanitizer=!0,this._styleMapInput=entry):((this._singleStyleInputs=this._singleStyleInputs||[]).push(entry),this._useDefaultSanitizer=this._useDefaultSanitizer||function isStyleSanitizable(prop){return"background-image"===prop||"background"===prop||"border-image"===prop||"filter"===prop||"list-style"===prop||"list-style-image"===prop}(name),registerIntoMap(this._stylesIndex,property)),this._lastStylingInput=entry,this.hasBindings=!0,entry},StylingBuilder.prototype.registerClassInput=function(name,isMapBased,value,sourceSpan){if(isEmptyExpression(value))return null;var _a=parseProperty(name),property=_a.property,entry={name:property,value:value,sourceSpan:sourceSpan,hasOverrideFlag:_a.hasOverrideFlag,unit:null};return isMapBased?this._classMapInput=entry:((this._singleClassInputs=this._singleClassInputs||[]).push(entry),registerIntoMap(this._classesIndex,property)),this._lastStylingInput=entry,this.hasBindings=!0,entry},StylingBuilder.prototype.registerStyleAttr=function(value){this._initialStyleValues=function parse(value){for(var styles=[],i=0,parenDepth=0,quote=0,valueStart=0,propStart=0,currentProp=null,valueHasQuotes=!1;i<value.length;){switch(value.charCodeAt(i++)){case 40:parenDepth++;break;case 41:parenDepth--;break;case 39:valueHasQuotes=valueHasQuotes||valueStart>0,0===quote?quote=39:39===quote&&92!==value.charCodeAt(i-1)&&(quote=0);break;case 34:valueHasQuotes=valueHasQuotes||valueStart>0,0===quote?quote=34:34===quote&&92!==value.charCodeAt(i-1)&&(quote=0);break;case 58:currentProp||0!==parenDepth||0!==quote||(currentProp=hyphenate(value.substring(propStart,i-1).trim()),valueStart=i);break;case 59:if(currentProp&&valueStart>0&&0===parenDepth&&0===quote){var styleVal=value.substring(valueStart,i-1).trim();styles.push(currentProp,valueHasQuotes?stripUnnecessaryQuotes(styleVal):styleVal),propStart=i,valueStart=0,currentProp=null,valueHasQuotes=!1}}}if(currentProp&&valueStart){styleVal=value.substr(valueStart).trim();styles.push(currentProp,valueHasQuotes?stripUnnecessaryQuotes(styleVal):styleVal)}return styles}(value),this._hasInitialValues=!0},StylingBuilder.prototype.registerClassAttr=function(value){this._initialClassValues=value.trim().split(/\s+/g),this._hasInitialValues=!0},StylingBuilder.prototype.populateInitialStylingAttrs=function(attrs){if(this._initialClassValues.length){attrs.push(literal(1));for(var i=0;i<this._initialClassValues.length;i++)attrs.push(literal(this._initialClassValues[i]))}if(this._initialStyleValues.length){attrs.push(literal(2));for(i=0;i<this._initialStyleValues.length;i+=2)attrs.push(literal(this._initialStyleValues[i]),literal(this._initialStyleValues[i+1]))}},StylingBuilder.prototype.buildHostAttrsInstruction=function(sourceSpan,attrs,constantPool){var _this=this;return this._directiveExpr&&(attrs.length||this._hasInitialValues)?{sourceSpan:sourceSpan,reference:Identifiers$1.elementHostAttrs,allocateBindingSlots:0,buildParams:function(){return _this.populateInitialStylingAttrs(attrs),[attrs.some(function(attr){return attr instanceof WrappedNodeExpr})?literalArr(attrs):getConstantLiteralFromArray(constantPool,attrs)]}}:null},StylingBuilder.prototype.buildElementStylingInstruction=function(sourceSpan,constantPool){var _this=this,reference=this._directiveExpr?Identifiers$1.elementHostStyling:Identifiers$1.elementStyling;return this.hasBindings?{sourceSpan:sourceSpan,allocateBindingSlots:0,reference:reference,buildParams:function(){var styleBindingProps=_this._singleStyleInputs?_this._singleStyleInputs.map(function(i){return literal(i.name)}):[],classBindingNames=_this._singleClassInputs?_this._singleClassInputs.map(function(i){return literal(i.name)}):[],params=[],expectedNumberOfArgs=0;return _this._useDefaultSanitizer?expectedNumberOfArgs=3:styleBindingProps.length?expectedNumberOfArgs=2:classBindingNames.length&&(expectedNumberOfArgs=1),addParam(params,classBindingNames.length>0,getConstantLiteralFromArray(constantPool,classBindingNames),1,expectedNumberOfArgs),addParam(params,styleBindingProps.length>0,getConstantLiteralFromArray(constantPool,styleBindingProps),2,expectedNumberOfArgs),addParam(params,_this._useDefaultSanitizer,importExpr(Identifiers$1.defaultStyleSanitizer),3,expectedNumberOfArgs),params}}:null},StylingBuilder.prototype.buildElementStylingMapInstruction=function(valueConverter){var _this=this;if(this._classMapInput||this._styleMapInput){var stylingInput=this._classMapInput||this._styleMapInput,totalBindingSlotsRequired=0,mapBasedClassValue_1=this._classMapInput?this._classMapInput.value.visit(valueConverter):null;mapBasedClassValue_1 instanceof Interpolation&&(totalBindingSlotsRequired+=mapBasedClassValue_1.expressions.length);var mapBasedStyleValue_1=this._styleMapInput?this._styleMapInput.value.visit(valueConverter):null;mapBasedStyleValue_1 instanceof Interpolation&&(totalBindingSlotsRequired+=mapBasedStyleValue_1.expressions.length);var isHostBinding_1=this._directiveExpr,reference=isHostBinding_1?Identifiers$1.elementHostStylingMap:Identifiers$1.elementStylingMap;return{sourceSpan:stylingInput.sourceSpan,reference:reference,allocateBindingSlots:totalBindingSlotsRequired,buildParams:function(convertFn){var params=[];isHostBinding_1||params.push(_this._elementIndexExpr);var expectedNumberOfArgs=0;return mapBasedStyleValue_1?expectedNumberOfArgs=2:mapBasedClassValue_1&&(expectedNumberOfArgs=1),addParam(params,mapBasedClassValue_1,mapBasedClassValue_1?convertFn(mapBasedClassValue_1):null,1,expectedNumberOfArgs),addParam(params,mapBasedStyleValue_1,mapBasedStyleValue_1?convertFn(mapBasedStyleValue_1):null,2,expectedNumberOfArgs),params}}}return null},StylingBuilder.prototype._buildSingleInputs=function(reference,isHostBinding,inputs,mapIndex,allowUnits,valueConverter){var _this=this,totalBindingSlotsRequired=0;return inputs.map(function(input){var bindingIndex=mapIndex.get(input.name),value=input.value.visit(valueConverter);return totalBindingSlotsRequired+=value instanceof Interpolation?value.expressions.length:0,{sourceSpan:input.sourceSpan,allocateBindingSlots:totalBindingSlotsRequired,reference:reference,buildParams:function(convertFn){var params=[];return isHostBinding||params.push(_this._elementIndexExpr),params.push(literal(bindingIndex)),params.push(convertFn(value)),allowUnits&&(input.unit?params.push(literal(input.unit)):input.hasOverrideFlag&&params.push(NULL_EXPR)),input.hasOverrideFlag&&params.push(literal(!0)),params}}})},StylingBuilder.prototype._buildClassInputs=function(valueConverter){if(this._singleClassInputs){var isHostBinding=!!this._directiveExpr,reference=isHostBinding?Identifiers$1.elementHostClassProp:Identifiers$1.elementClassProp;return this._buildSingleInputs(reference,isHostBinding,this._singleClassInputs,this._classesIndex,!1,valueConverter)}return[]},StylingBuilder.prototype._buildStyleInputs=function(valueConverter){if(this._singleStyleInputs){var isHostBinding=!!this._directiveExpr,reference=isHostBinding?Identifiers$1.elementHostStyleProp:Identifiers$1.elementStyleProp;return this._buildSingleInputs(reference,isHostBinding,this._singleStyleInputs,this._stylesIndex,!0,valueConverter)}return[]},StylingBuilder.prototype._buildApplyFn=function(){var _this=this,isHostBinding=this._directiveExpr,reference=isHostBinding?Identifiers$1.elementHostStylingApply:Identifiers$1.elementStylingApply;return{sourceSpan:this._lastStylingInput?this._lastStylingInput.sourceSpan:null,reference:reference,allocateBindingSlots:0,buildParams:function(){return isHostBinding?[]:[_this._elementIndexExpr]}}},StylingBuilder.prototype.buildUpdateLevelInstructions=function(valueConverter){var instructions=[];if(this.hasBindings){var mapInstruction=this.buildElementStylingMapInstruction(valueConverter);mapInstruction&&instructions.push(mapInstruction),instructions.push.apply(instructions,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._buildStyleInputs(valueConverter))),instructions.push.apply(instructions,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._buildClassInputs(valueConverter))),instructions.push(this._buildApplyFn())}return instructions},StylingBuilder}();function registerIntoMap(map,key){map.has(key)||map.set(key,map.size)}function getConstantLiteralFromArray(constantPool,values){return values.length?constantPool.getConstLiteral(literalArr(values),!0):NULL_EXPR}function addParam(params,predicate,value,argNumber,totalExpectedArgs){predicate&&value?params.push(value):argNumber<totalExpectedArgs&&params.push(NULL_EXPR)}function parseProperty(name){var hasOverrideFlag=!1,overrideIndex=name.indexOf(IMPORTANT_FLAG);-1!==overrideIndex&&(name=overrideIndex>0?name.substring(0,overrideIndex):"",hasOverrideFlag=!0);var unit="",property=name,unitIndex=name.lastIndexOf(".");return unitIndex>0&&(unit=name.substr(unitIndex+1),property=name.substring(0,unitIndex)),{property:property,unit:unit,hasOverrideFlag:hasOverrideFlag}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(TokenType){TokenType[TokenType.Character=0]="Character",TokenType[TokenType.Identifier=1]="Identifier",TokenType[TokenType.Keyword=2]="Keyword",TokenType[TokenType.String=3]="String",TokenType[TokenType.Operator=4]="Operator",TokenType[TokenType.Number=5]="Number",TokenType[TokenType.Error=6]="Error"}(TokenType$1||(TokenType$1={}));var KEYWORDS=["var","let","as","null","undefined","true","false","if","else","this"],Lexer=function(){function Lexer(){}return Lexer.prototype.tokenize=function(text){for(var scanner=new _Scanner(text),tokens=[],token=scanner.scanToken();null!=token;)tokens.push(token),token=scanner.scanToken();return tokens},Lexer}(),Token$1=function(){function Token(index,type,numValue,strValue){this.index=index,this.type=type,this.numValue=numValue,this.strValue=strValue}return Token.prototype.isCharacter=function(code){return this.type==TokenType$1.Character&&this.numValue==code},Token.prototype.isNumber=function(){return this.type==TokenType$1.Number},Token.prototype.isString=function(){return this.type==TokenType$1.String},Token.prototype.isOperator=function(operator){return this.type==TokenType$1.Operator&&this.strValue==operator},Token.prototype.isIdentifier=function(){return this.type==TokenType$1.Identifier},Token.prototype.isKeyword=function(){return this.type==TokenType$1.Keyword},Token.prototype.isKeywordLet=function(){return this.type==TokenType$1.Keyword&&"let"==this.strValue},Token.prototype.isKeywordAs=function(){return this.type==TokenType$1.Keyword&&"as"==this.strValue},Token.prototype.isKeywordNull=function(){return this.type==TokenType$1.Keyword&&"null"==this.strValue},Token.prototype.isKeywordUndefined=function(){return this.type==TokenType$1.Keyword&&"undefined"==this.strValue},Token.prototype.isKeywordTrue=function(){return this.type==TokenType$1.Keyword&&"true"==this.strValue},Token.prototype.isKeywordFalse=function(){return this.type==TokenType$1.Keyword&&"false"==this.strValue},Token.prototype.isKeywordThis=function(){return this.type==TokenType$1.Keyword&&"this"==this.strValue},Token.prototype.isError=function(){return this.type==TokenType$1.Error},Token.prototype.toNumber=function(){return this.type==TokenType$1.Number?this.numValue:-1},Token.prototype.toString=function(){switch(this.type){case TokenType$1.Character:case TokenType$1.Identifier:case TokenType$1.Keyword:case TokenType$1.Operator:case TokenType$1.String:case TokenType$1.Error:return this.strValue;case TokenType$1.Number:return this.numValue.toString();default:return null}},Token}();function newCharacterToken(index,code){return new Token$1(index,TokenType$1.Character,code,String.fromCharCode(code))}function newOperatorToken(index,text){return new Token$1(index,TokenType$1.Operator,0,text)}var EOF=new Token$1(-1,TokenType$1.Character,0,""),_Scanner=function(){function _Scanner(input){this.input=input,this.peek=0,this.index=-1,this.length=input.length,this.advance()}return _Scanner.prototype.advance=function(){this.peek=++this.index>=this.length?$EOF:this.input.charCodeAt(this.index)},_Scanner.prototype.scanToken=function(){for(var input=this.input,length=this.length,peek=this.peek,index=this.index;peek<=$SPACE;){if(++index>=length){peek=$EOF;break}peek=input.charCodeAt(index)}if(this.peek=peek,this.index=index,index>=length)return null;if(isIdentifierStart(peek))return this.scanIdentifier();Iif(isDigit(peek))return this.scanNumber(index);var start=index;switch(peek){case 46:return this.advance(),isDigit(this.peek)?this.scanNumber(start):newCharacterToken(start,46);case 40:case 41:case 123:case 125:case 91:case 93:case 44:case 58:case $SEMICOLON:return this.scanCharacter(start,peek);case $SQ:case $DQ:return this.scanString();case 35:case $PLUS:case $MINUS:case 42:case $SLASH:case 37:case 94:return this.scanOperator(start,String.fromCharCode(peek));case 63:return this.scanComplexOperator(start,"?",46,".");case 60:case $GT:return this.scanComplexOperator(start,String.fromCharCode(peek),$EQ,"=");case 33:case $EQ:return this.scanComplexOperator(start,String.fromCharCode(peek),$EQ,"=",$EQ,"=");case 38:return this.scanComplexOperator(start,"&",38,"&");case 124:return this.scanComplexOperator(start,"|",124,"|");case $NBSP:for(;isWhitespace(this.peek);)this.advance();return this.scanToken()}return this.advance(),this.error("Unexpected character ["+String.fromCharCode(peek)+"]",0)},_Scanner.prototype.scanCharacter=function(start,code){return this.advance(),newCharacterToken(start,code)},_Scanner.prototype.scanOperator=function(start,str){return this.advance(),newOperatorToken(start,str)},_Scanner.prototype.scanComplexOperator=function(start,one,twoCode,two,threeCode,three){this.advance();var str=one;return this.peek==twoCode&&(this.advance(),str+=two),null!=threeCode&&this.peek==threeCode&&(this.advance(),str+=three),newOperatorToken(start,str)},_Scanner.prototype.scanIdentifier=function(){var start=this.index;for(this.advance();isIdentifierPart(this.peek);)this.advance();var str=this.input.substring(start,this.index);return KEYWORDS.indexOf(str)>-1?function newKeywordToken(index,text){return new Token$1(index,TokenType$1.Keyword,0,text)}(start,str):function newIdentifierToken(index,text){return new Token$1(index,TokenType$1.Identifier,0,text)}(start,str)},_Scanner.prototype.scanNumber=function(start){var code,simple=this.index===start;for(this.advance();;){if(isDigit(this.peek));else if(46==this.peek)simple=!1;else{if((code=this.peek)!=$e&&code!=$E)break;if(this.advance(),isExponentSign(this.peek)&&this.advance(),!isDigit(this.peek))return this.error("Invalid exponent",-1);simple=!1}this.advance()}var str=this.input.substring(start,this.index);return function newNumberToken(index,n){return new Token$1(index,TokenType$1.Number,n,"")}(start,simple?function parseIntAutoRadix(text){var result=parseInt(text);if(isNaN(result))throw new Error("Invalid integer literal when parsing "+text);return result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(str):parseFloat(str))},_Scanner.prototype.scanString=function(){var start=this.index,quote=this.peek;this.advance();for(var buffer="",marker=this.index,input=this.input;this.peek!=quote;)if(92==this.peek){buffer+=input.substring(marker,this.index),this.advance();var unescapedCode=void 0;if(this.peek=this.peek,117==this.peek){var hex=input.substring(this.index+1,this.index+5);if(!/^[0-9a-f]+$/i.test(hex))return this.error("Invalid unicode escape [\\u"+hex+"]",0);unescapedCode=parseInt(hex,16);for(var i=0;i<5;i++)this.advance()}else unescapedCode=unescape(this.peek),this.advance();buffer+=String.fromCharCode(unescapedCode),marker=this.index}else{if(this.peek==$EOF)return this.error("Unterminated quote",0);this.advance()}var last=input.substring(marker,this.index);return this.advance(),function newStringToken(index,text){return new Token$1(index,TokenType$1.String,0,text)}(start,buffer+last)},_Scanner.prototype.error=function(message,offset){var position=this.index+offset;return function newErrorToken(index,message){return new Token$1(index,TokenType$1.Error,0,message)}(position,"Lexer Error: "+message+" at column "+position+" in expression ["+this.input+"]")},_Scanner}();function isIdentifierStart(code){return $a<=code&&code<=$z||$A<=code&&code<=$Z||code==$_||code==$$}function isIdentifierPart(code){return isAsciiLetter(code)||isDigit(code)||code==$_||code==$$}function isExponentSign(code){return code==$MINUS||code==$PLUS}function unescape(code){switch(code){case $n:return $LF;case $f:return $FF;case $r:return $CR;case $t:return $TAB;case $v:return $VTAB;default:return code}}var SplitInterpolation=function SplitInterpolation(strings,expressions,offsets){this.strings=strings,this.expressions=expressions,this.offsets=offsets},TemplateBindingParseResult=function TemplateBindingParseResult(templateBindings,warnings,errors){this.templateBindings=templateBindings,this.warnings=warnings,this.errors=errors};function _createInterpolateRegExp(config){var pattern=escapeRegExp(config.start)+"([\\s\\S]*?)"+escapeRegExp(config.end);return new RegExp(pattern,"g")}var _SECURITY_SCHEMA,Parser$1=function(){function Parser(_lexer){this._lexer=_lexer,this.errors=[]}return Parser.prototype.parseAction=function(input,location,interpolationConfig){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG),this._checkNoInterpolation(input,location,interpolationConfig);var sourceToLex=this._stripComments(input),tokens=this._lexer.tokenize(this._stripComments(input)),ast=new _ParseAST(input,location,tokens,sourceToLex.length,!0,this.errors,input.length-sourceToLex.length).parseChain();return new ASTWithSource(ast,input,location,this.errors)},Parser.prototype.parseBinding=function(input,location,interpolationConfig){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG);var ast=this._parseBindingAst(input,location,interpolationConfig);return new ASTWithSource(ast,input,location,this.errors)},Parser.prototype.parseSimpleBinding=function(input,location,interpolationConfig){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG);var ast=this._parseBindingAst(input,location,interpolationConfig),errors=SimpleExpressionChecker.check(ast);return errors.length>0&&this._reportError("Host binding expression cannot contain "+errors.join(" "),input,location),new ASTWithSource(ast,input,location,this.errors)},Parser.prototype._reportError=function(message,input,errLocation,ctxLocation){this.errors.push(new ParserError(message,input,errLocation,ctxLocation))},Parser.prototype._parseBindingAst=function(input,location,interpolationConfig){var quote=this._parseQuote(input,location);if(null!=quote)return quote;this._checkNoInterpolation(input,location,interpolationConfig);var sourceToLex=this._stripComments(input),tokens=this._lexer.tokenize(sourceToLex);return new _ParseAST(input,location,tokens,sourceToLex.length,!1,this.errors,input.length-sourceToLex.length).parseChain()},Parser.prototype._parseQuote=function(input,location){if(null==input)return null;var prefixSeparatorIndex=input.indexOf(":");if(-1==prefixSeparatorIndex)return null;var prefix=input.substring(0,prefixSeparatorIndex).trim();if(!function isIdentifier(input){if(0==input.length)return!1;var scanner=new _Scanner(input);if(!isIdentifierStart(scanner.peek))return!1;for(scanner.advance();scanner.peek!==$EOF;){if(!isIdentifierPart(scanner.peek))return!1;scanner.advance()}return!0}(prefix))return null;var uninterpretedExpression=input.substring(prefixSeparatorIndex+1);return new Quote(new ParseSpan(0,input.length),prefix,uninterpretedExpression,location)},Parser.prototype.parseTemplateBindings=function(tplKey,tplValue,location){var tokens=this._lexer.tokenize(tplValue);return new _ParseAST(tplValue,location,tokens,tplValue.length,!1,this.errors,0).parseTemplateBindings(tplKey)},Parser.prototype.parseInterpolation=function(input,location,interpolationConfig){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG);var split=this.splitInterpolation(input,location,interpolationConfig);if(null==split)return null;for(var expressions=[],i=0;i<split.expressions.length;++i){var expressionText=split.expressions[i],sourceToLex=this._stripComments(expressionText),tokens=this._lexer.tokenize(sourceToLex),ast=new _ParseAST(input,location,tokens,sourceToLex.length,!1,this.errors,split.offsets[i]+(expressionText.length-sourceToLex.length)).parseChain();expressions.push(ast)}return new ASTWithSource(new Interpolation(new ParseSpan(0,null==input?0:input.length),split.strings,expressions),input,location,this.errors)},Parser.prototype.splitInterpolation=function(input,location,interpolationConfig){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG);var regexp=_createInterpolateRegExp(interpolationConfig),parts=input.split(regexp);if(parts.length<=1)return null;for(var strings=[],expressions=[],offsets=[],offset=0,i=0;i<parts.length;i++){var part=parts[i];i%2==0?(strings.push(part),offset+=part.length):part.trim().length>0?(offset+=interpolationConfig.start.length,expressions.push(part),offsets.push(offset),offset+=part.length+interpolationConfig.end.length):(this._reportError("Blank expressions are not allowed in interpolated strings",input,"at column "+this._findInterpolationErrorColumn(parts,i,interpolationConfig)+" in",location),expressions.push("$implict"),offsets.push(offset))}return new SplitInterpolation(strings,expressions,offsets)},Parser.prototype.wrapLiteralPrimitive=function(input,location){return new ASTWithSource(new LiteralPrimitive(new ParseSpan(0,null==input?0:input.length),input),input,location,this.errors)},Parser.prototype._stripComments=function(input){var i=this._commentStart(input);return null!=i?input.substring(0,i).trim():input},Parser.prototype._commentStart=function(input){for(var code,outerQuote=null,i=0;i<input.length-1;i++){var char=input.charCodeAt(i),nextChar=input.charCodeAt(i+1);Iif(char===$SLASH&&nextChar==$SLASH&&null==outerQuote)return i;outerQuote===char?outerQuote=null:null==outerQuote&&((code=char)===$SQ||code===$DQ||code===$BT)&&(outerQuote=char)}return null},Parser.prototype._checkNoInterpolation=function(input,location,interpolationConfig){var regexp=_createInterpolateRegExp(interpolationConfig),parts=input.split(regexp);parts.length>1&&this._reportError("Got interpolation ("+interpolationConfig.start+interpolationConfig.end+") where expression was expected",input,"at column "+this._findInterpolationErrorColumn(parts,1,interpolationConfig)+" in",location)},Parser.prototype._findInterpolationErrorColumn=function(parts,partInErrIdx,interpolationConfig){for(var errLocation="",j=0;j<partInErrIdx;j++)errLocation+=j%2==0?parts[j]:""+interpolationConfig.start+parts[j]+interpolationConfig.end;return errLocation.length},Parser}(),_ParseAST=function(){function _ParseAST(input,location,tokens,inputLength,parseAction,errors,offset){this.input=input,this.location=location,this.tokens=tokens,this.inputLength=inputLength,this.parseAction=parseAction,this.errors=errors,this.offset=offset,this.rparensExpected=0,this.rbracketsExpected=0,this.rbracesExpected=0,this.index=0}return _ParseAST.prototype.peek=function(offset){var i=this.index+offset;return i<this.tokens.length?this.tokens[i]:EOF},Object.defineProperty(_ParseAST.prototype,"next",{get:function(){return this.peek(0)},enumerable:!0,configurable:!0}),Object.defineProperty(_ParseAST.prototype,"inputIndex",{get:function(){return this.index<this.tokens.length?this.next.index+this.offset:this.inputLength+this.offset},enumerable:!0,configurable:!0}),_ParseAST.prototype.span=function(start){return new ParseSpan(start,this.inputIndex)},_ParseAST.prototype.advance=function(){this.index++},_ParseAST.prototype.optionalCharacter=function(code){return!!this.next.isCharacter(code)&&(this.advance(),!0)},_ParseAST.prototype.peekKeywordLet=function(){return this.next.isKeywordLet()},_ParseAST.prototype.peekKeywordAs=function(){return this.next.isKeywordAs()},_ParseAST.prototype.expectCharacter=function(code){this.optionalCharacter(code)||this.error("Missing expected "+String.fromCharCode(code))},_ParseAST.prototype.optionalOperator=function(op){return!!this.next.isOperator(op)&&(this.advance(),!0)},_ParseAST.prototype.expectOperator=function(operator){this.optionalOperator(operator)||this.error("Missing expected operator "+operator)},_ParseAST.prototype.expectIdentifierOrKeyword=function(){var n=this.next;return n.isIdentifier()||n.isKeyword()?(this.advance(),n.toString()):(this.error("Unexpected token "+n+", expected identifier or keyword"),"")},_ParseAST.prototype.expectIdentifierOrKeywordOrString=function(){var n=this.next;return n.isIdentifier()||n.isKeyword()||n.isString()?(this.advance(),n.toString()):(this.error("Unexpected token "+n+", expected identifier, keyword, or string"),"")},_ParseAST.prototype.parseChain=function(){for(var exprs=[],start=this.inputIndex;this.index<this.tokens.length;){var expr=this.parsePipe();Iif(exprs.push(expr),this.optionalCharacter($SEMICOLON))for(this.parseAction||this.error("Binding expression cannot contain chained expression");this.optionalCharacter($SEMICOLON););else this.index<this.tokens.length&&this.error("Unexpected token '"+this.next+"'")}return 0==exprs.length?new EmptyExpr(this.span(start)):1==exprs.length?exprs[0]:new Chain(this.span(start),exprs)},_ParseAST.prototype.parsePipe=function(){var result=this.parseExpression();Iif(this.optionalOperator("|")){this.parseAction&&this.error("Cannot have a pipe in an action expression");do{for(var name_1=this.expectIdentifierOrKeyword(),args=[];this.optionalCharacter(58);)args.push(this.parseExpression());result=new BindingPipe(this.span(result.span.start),result,name_1,args)}while(this.optionalOperator("|"))}return result},_ParseAST.prototype.parseExpression=function(){return this.parseConditional()},_ParseAST.prototype.parseConditional=function(){var start=this.inputIndex,result=this.parseLogicalOr();Iif(this.optionalOperator("?")){var yes=this.parsePipe(),no=void 0;if(this.optionalCharacter(58))no=this.parsePipe();else{var end=this.inputIndex,expression=this.input.substring(start,end);this.error("Conditional expression "+expression+" requires all 3 expressions"),no=new EmptyExpr(this.span(start))}return new Conditional(this.span(start),result,yes,no)}return result},_ParseAST.prototype.parseLogicalOr=function(){for(var result=this.parseLogicalAnd();this.optionalOperator("||");){var right=this.parseLogicalAnd();result=new Binary(this.span(result.span.start),"||",result,right)}return result},_ParseAST.prototype.parseLogicalAnd=function(){for(var result=this.parseEquality();this.optionalOperator("&&");){var right=this.parseEquality();result=new Binary(this.span(result.span.start),"&&",result,right)}return result},_ParseAST.prototype.parseEquality=function(){for(var result=this.parseRelational();this.next.type==TokenType$1.Operator;){var operator=this.next.strValue;switch(operator){case"==":case"===":case"!=":case"!==":this.advance();var right=this.parseRelational();result=new Binary(this.span(result.span.start),operator,result,right);continue}break}return result},_ParseAST.prototype.parseRelational=function(){for(var result=this.parseAdditive();this.next.type==TokenType$1.Operator;){var operator=this.next.strValue;switch(operator){case"<":case">":case"<=":case">=":this.advance();var right=this.parseAdditive();result=new Binary(this.span(result.span.start),operator,result,right);continue}break}return result},_ParseAST.prototype.parseAdditive=function(){for(var result=this.parseMultiplicative();this.next.type==TokenType$1.Operator;){var operator=this.next.strValue;switch(operator){case"+":case"-":this.advance();var right=this.parseMultiplicative();result=new Binary(this.span(result.span.start),operator,result,right);continue}break}return result},_ParseAST.prototype.parseMultiplicative=function(){for(var result=this.parsePrefix();this.next.type==TokenType$1.Operator;){var operator=this.next.strValue;switch(operator){case"*":case"%":case"/":this.advance();var right=this.parsePrefix();result=new Binary(this.span(result.span.start),operator,result,right);continue}break}return result},_ParseAST.prototype.parsePrefix=function(){Iif(this.next.type==TokenType$1.Operator){var start=this.inputIndex,operator=this.next.strValue,result=void 0;switch(operator){case"+":return this.advance(),result=this.parsePrefix(),new Binary(this.span(start),"-",result,new LiteralPrimitive(new ParseSpan(start,start),0));case"-":return this.advance(),result=this.parsePrefix(),new Binary(this.span(start),operator,new LiteralPrimitive(new ParseSpan(start,start),0),result);case"!":return this.advance(),result=this.parsePrefix(),new PrefixNot(this.span(start),result)}}return this.parseCallChain()},_ParseAST.prototype.parseCallChain=function(){for(var result=this.parsePrimary();;)Iif(this.optionalCharacter(46))result=this.parseAccessMemberOrMethodCall(result,!1);else Iif(this.optionalOperator("?."))result=this.parseAccessMemberOrMethodCall(result,!0);else Iif(this.optionalCharacter(91)){this.rbracketsExpected++;var key=this.parsePipe();if(this.rbracketsExpected--,this.expectCharacter(93),this.optionalOperator("=")){var value=this.parseConditional();result=new KeyedWrite(this.span(result.span.start),result,key,value)}else result=new KeyedRead(this.span(result.span.start),result,key)}else Iif(this.optionalCharacter(40)){this.rparensExpected++;var args=this.parseCallArguments();this.rparensExpected--,this.expectCharacter(41),result=new FunctionCall(this.span(result.span.start),result,args)}else{Eif(!this.optionalOperator("!"))return result;result=new NonNullAssert(this.span(result.span.start),result)}},_ParseAST.prototype.parsePrimary=function(){var start=this.inputIndex;Iif(this.optionalCharacter(40)){this.rparensExpected++;var result=this.parsePipe();return this.rparensExpected--,this.expectCharacter(41),result}Iif(this.next.isKeywordNull())return this.advance(),new LiteralPrimitive(this.span(start),null);Iif(this.next.isKeywordUndefined())return this.advance(),new LiteralPrimitive(this.span(start),void 0);Iif(this.next.isKeywordTrue())return this.advance(),new LiteralPrimitive(this.span(start),!0);Iif(this.next.isKeywordFalse())return this.advance(),new LiteralPrimitive(this.span(start),!1);Iif(this.next.isKeywordThis())return this.advance(),new ImplicitReceiver(this.span(start));Iif(this.optionalCharacter(91)){this.rbracketsExpected++;var elements=this.parseExpressionList(93);return this.rbracketsExpected--,this.expectCharacter(93),new LiteralArray(this.span(start),elements)}Iif(this.next.isCharacter(123))return this.parseLiteralMap();Eif(this.next.isIdentifier())return this.parseAccessMemberOrMethodCall(new ImplicitReceiver(this.span(start)),!1);if(this.next.isNumber()){var value=this.next.toNumber();return this.advance(),new LiteralPrimitive(this.span(start),value)}if(this.next.isString()){var literalValue=this.next.toString();return this.advance(),new LiteralPrimitive(this.span(start),literalValue)}return this.index>=this.tokens.length?(this.error("Unexpected end of expression: "+this.input),new EmptyExpr(this.span(start))):(this.error("Unexpected token "+this.next),new EmptyExpr(this.span(start)))},_ParseAST.prototype.parseExpressionList=function(terminator){var result=[];if(!this.next.isCharacter(terminator))do{result.push(this.parsePipe())}while(this.optionalCharacter(44));return result},_ParseAST.prototype.parseLiteralMap=function(){var keys=[],values=[],start=this.inputIndex;if(this.expectCharacter(123),!this.optionalCharacter(125)){this.rbracesExpected++;do{var quoted=this.next.isString(),key=this.expectIdentifierOrKeywordOrString();keys.push({key:key,quoted:quoted}),this.expectCharacter(58),values.push(this.parsePipe())}while(this.optionalCharacter(44));this.rbracesExpected--,this.expectCharacter(125)}return new LiteralMap(this.span(start),keys,values)},_ParseAST.prototype.parseAccessMemberOrMethodCall=function(receiver,isSafe){void 0===isSafe&&(isSafe=!1);var start=receiver.span.start,id=this.expectIdentifierOrKeyword();if(this.optionalCharacter(40)){this.rparensExpected++;var args=this.parseCallArguments();this.expectCharacter(41),this.rparensExpected--;var span=this.span(start);return isSafe?new SafeMethodCall(span,receiver,id,args):new MethodCall(span,receiver,id,args)}Iif(isSafe)return this.optionalOperator("=")?(this.error("The '?.' operator cannot be used in the assignment"),new EmptyExpr(this.span(start))):new SafePropertyRead(this.span(start),receiver,id);Iif(this.optionalOperator("=")){if(!this.parseAction)return this.error("Bindings cannot contain assignments"),new EmptyExpr(this.span(start));var value=this.parseConditional();return new PropertyWrite(this.span(start),receiver,id,value)}return new PropertyRead(this.span(start),receiver,id)},_ParseAST.prototype.parseCallArguments=function(){Eif(this.next.isCharacter(41))return[];var positionals=[];do{positionals.push(this.parsePipe())}while(this.optionalCharacter(44));return positionals},_ParseAST.prototype.expectTemplateBindingKey=function(){var result="",operatorFound=!1;do{result+=this.expectIdentifierOrKeywordOrString(),(operatorFound=this.optionalOperator("-"))&&(result+="-")}while(operatorFound);return result.toString()},_ParseAST.prototype.parseTemplateBindings=function(tplKey){var firstBinding=!0,bindings=[];do{var start=this.inputIndex,rawKey=void 0,key=void 0,isVar=!1;firstBinding?(rawKey=key=tplKey,firstBinding=!1):((isVar=this.peekKeywordLet())&&this.advance(),rawKey=this.expectTemplateBindingKey(),key=isVar?rawKey:tplKey+rawKey[0].toUpperCase()+rawKey.substring(1),this.optionalCharacter(58));var name_2=null,expression=null;if(isVar)name_2=this.optionalOperator("=")?this.expectTemplateBindingKey():"$implicit";else if(this.peekKeywordAs())this.advance(),name_2=rawKey,key=this.expectTemplateBindingKey(),isVar=!0;else if(this.next!==EOF&&!this.peekKeywordLet()){var start_1=this.inputIndex,ast=this.parsePipe(),source=this.input.substring(start_1-this.offset,this.inputIndex-this.offset);expression=new ASTWithSource(ast,source,this.location,this.errors)}if(bindings.push(new TemplateBinding(this.span(start),key,isVar,name_2,expression)),this.peekKeywordAs()&&!isVar){var letStart=this.inputIndex;this.advance();var letName=this.expectTemplateBindingKey();bindings.push(new TemplateBinding(this.span(letStart),letName,!0,key,null))}this.optionalCharacter($SEMICOLON)||this.optionalCharacter(44)}while(this.index<this.tokens.length);return new TemplateBindingParseResult(bindings,[],this.errors)},_ParseAST.prototype.error=function(message,index){void 0===index&&(index=null),this.errors.push(new ParserError(message,this.input,this.locationText(index),this.location)),this.skip()},_ParseAST.prototype.locationText=function(index){return void 0===index&&(index=null),null==index&&(index=this.index),index<this.tokens.length?"at column "+(this.tokens[index].index+1)+" in":"at the end of the expression"},_ParseAST.prototype.skip=function(){for(var n=this.next;this.index<this.tokens.length&&!n.isCharacter($SEMICOLON)&&(this.rparensExpected<=0||!n.isCharacter(41))&&(this.rbracesExpected<=0||!n.isCharacter(125))&&(this.rbracketsExpected<=0||!n.isCharacter(93));)this.next.isError()&&this.errors.push(new ParserError(this.next.toString(),this.input,this.locationText(),this.location)),this.advance(),n=this.next},_ParseAST}(),SimpleExpressionChecker=function(){function SimpleExpressionChecker(){this.errors=[]}return SimpleExpressionChecker.check=function(ast){var s=new SimpleExpressionChecker;return ast.visit(s),s.errors},SimpleExpressionChecker.prototype.visitImplicitReceiver=function(ast,context){},SimpleExpressionChecker.prototype.visitInterpolation=function(ast,context){},SimpleExpressionChecker.prototype.visitLiteralPrimitive=function(ast,context){},SimpleExpressionChecker.prototype.visitPropertyRead=function(ast,context){},SimpleExpressionChecker.prototype.visitPropertyWrite=function(ast,context){},SimpleExpressionChecker.prototype.visitSafePropertyRead=function(ast,context){},SimpleExpressionChecker.prototype.visitMethodCall=function(ast,context){},SimpleExpressionChecker.prototype.visitSafeMethodCall=function(ast,context){},SimpleExpressionChecker.prototype.visitFunctionCall=function(ast,context){},SimpleExpressionChecker.prototype.visitLiteralArray=function(ast,context){this.visitAll(ast.expressions)},SimpleExpressionChecker.prototype.visitLiteralMap=function(ast,context){this.visitAll(ast.values)},SimpleExpressionChecker.prototype.visitBinary=function(ast,context){},SimpleExpressionChecker.prototype.visitPrefixNot=function(ast,context){},SimpleExpressionChecker.prototype.visitNonNullAssert=function(ast,context){},SimpleExpressionChecker.prototype.visitConditional=function(ast,context){},SimpleExpressionChecker.prototype.visitPipe=function(ast,context){this.errors.push("pipes")},SimpleExpressionChecker.prototype.visitKeyedRead=function(ast,context){},SimpleExpressionChecker.prototype.visitKeyedWrite=function(ast,context){},SimpleExpressionChecker.prototype.visitAll=function(asts){var _this=this;return asts.map(function(node){return node.visit(_this)})},SimpleExpressionChecker.prototype.visitChain=function(ast,context){},SimpleExpressionChecker.prototype.visitQuote=function(ast,context){},SimpleExpressionChecker}();function SECURITY_SCHEMA(){return _SECURITY_SCHEMA||(_SECURITY_SCHEMA={},registerContext(SecurityContext.HTML,["iframe|srcdoc","*|innerHTML","*|outerHTML"]),registerContext(SecurityContext.STYLE,["*|style"]),registerContext(SecurityContext.URL,["*|formAction","area|href","area|ping","audio|src","a|href","a|ping","blockquote|cite","body|background","del|cite","form|action","img|src","img|srcset","input|src","ins|cite","q|cite","source|src","source|srcset","track|src","video|poster","video|src"]),registerContext(SecurityContext.RESOURCE_URL,["applet|code","applet|codebase","base|href","embed|src","frame|src","head|profile","html|manifest","iframe|src","link|href","media|src","object|codebase","object|data","script|src"])),_SECURITY_SCHEMA}function registerContext(ctx,specs){var e_1,_a;try{for(var specs_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(specs),specs_1_1=specs_1.next();!specs_1_1.done;specs_1_1=specs_1.next()){var spec=specs_1_1.value;_SECURITY_SCHEMA[spec.toLowerCase()]=ctx}}catch(e_1_1){e_1={error:e_1_1}}finally{try{specs_1_1&&!specs_1_1.done&&(_a=specs_1.return)&&_a.call(specs_1)}finally{if(e_1)throw e_1.error}}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ElementSchemaRegistry=function ElementSchemaRegistry(){},BOOLEAN="boolean",NUMBER="number",STRING="string",OBJECT="object",SCHEMA=["[Element]|textContent,%classList,className,id,innerHTML,*beforecopy,*beforecut,*beforepaste,*copy,*cut,*paste,*search,*selectstart,*webkitfullscreenchange,*webkitfullscreenerror,*wheel,outerHTML,#scrollLeft,#scrollTop,slot,*message,*mozfullscreenchange,*mozfullscreenerror,*mozpointerlockchange,*mozpointerlockerror,*webglcontextcreationerror,*webglcontextlost,*webglcontextrestored","[HTMLElement]^[Element]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate","abbr,address,article,aside,b,bdi,bdo,cite,code,dd,dfn,dt,em,figcaption,figure,footer,header,i,kbd,main,mark,nav,noscript,rb,rp,rt,rtc,ruby,s,samp,section,small,strong,sub,sup,u,var,wbr^[HTMLElement]|accessKey,contentEditable,dir,!draggable,!hidden,innerText,lang,*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,outerText,!spellcheck,%style,#tabIndex,title,!translate","media^[HTMLElement]|!autoplay,!controls,%controlsList,%crossOrigin,#currentTime,!defaultMuted,#defaultPlaybackRate,!disableRemotePlayback,!loop,!muted,*encrypted,*waitingforkey,#playbackRate,preload,src,%srcObject,#volume",":svg:^[HTMLElement]|*abort,*auxclick,*blur,*cancel,*canplay,*canplaythrough,*change,*click,*close,*contextmenu,*cuechange,*dblclick,*drag,*dragend,*dragenter,*dragleave,*dragover,*dragstart,*drop,*durationchange,*emptied,*ended,*error,*focus,*gotpointercapture,*input,*invalid,*keydown,*keypress,*keyup,*load,*loadeddata,*loadedmetadata,*loadstart,*lostpointercapture,*mousedown,*mouseenter,*mouseleave,*mousemove,*mouseout,*mouseover,*mouseup,*mousewheel,*pause,*play,*playing,*pointercancel,*pointerdown,*pointerenter,*pointerleave,*pointermove,*pointerout,*pointerover,*pointerup,*progress,*ratechange,*reset,*resize,*scroll,*seeked,*seeking,*select,*show,*stalled,*submit,*suspend,*timeupdate,*toggle,*volumechange,*waiting,%style,#tabIndex",":svg:graphics^:svg:|",":svg:animation^:svg:|*begin,*end,*repeat",":svg:geometry^:svg:|",":svg:componentTransferFunction^:svg:|",":svg:gradient^:svg:|",":svg:textContent^:svg:graphics|",":svg:textPositioning^:svg:textContent|","a^[HTMLElement]|charset,coords,download,hash,host,hostname,href,hreflang,name,password,pathname,ping,port,protocol,referrerPolicy,rel,rev,search,shape,target,text,type,username","area^[HTMLElement]|alt,coords,download,hash,host,hostname,href,!noHref,password,pathname,ping,port,protocol,referrerPolicy,rel,search,shape,target,username","audio^media|","br^[HTMLElement]|clear","base^[HTMLElement]|href,target","body^[HTMLElement]|aLink,background,bgColor,link,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,text,vLink","button^[HTMLElement]|!autofocus,!disabled,formAction,formEnctype,formMethod,!formNoValidate,formTarget,name,type,value","canvas^[HTMLElement]|#height,#width","content^[HTMLElement]|select","dl^[HTMLElement]|!compact","datalist^[HTMLElement]|","details^[HTMLElement]|!open","dialog^[HTMLElement]|!open,returnValue","dir^[HTMLElement]|!compact","div^[HTMLElement]|align","embed^[HTMLElement]|align,height,name,src,type,width","fieldset^[HTMLElement]|!disabled,name","font^[HTMLElement]|color,face,size","form^[HTMLElement]|acceptCharset,action,autocomplete,encoding,enctype,method,name,!noValidate,target","frame^[HTMLElement]|frameBorder,longDesc,marginHeight,marginWidth,name,!noResize,scrolling,src","frameset^[HTMLElement]|cols,*beforeunload,*blur,*error,*focus,*hashchange,*languagechange,*load,*message,*offline,*online,*pagehide,*pageshow,*popstate,*rejectionhandled,*resize,*scroll,*storage,*unhandledrejection,*unload,rows","hr^[HTMLElement]|align,color,!noShade,size,width","head^[HTMLElement]|","h1,h2,h3,h4,h5,h6^[HTMLElement]|align","html^[HTMLElement]|version","iframe^[HTMLElement]|align,!allowFullscreen,frameBorder,height,longDesc,marginHeight,marginWidth,name,referrerPolicy,%sandbox,scrolling,src,srcdoc,width","img^[HTMLElement]|align,alt,border,%crossOrigin,#height,#hspace,!isMap,longDesc,lowsrc,name,referrerPolicy,sizes,src,srcset,useMap,#vspace,#width","input^[HTMLElement]|accept,align,alt,autocapitalize,autocomplete,!autofocus,!checked,!defaultChecked,defaultValue,dirName,!disabled,%files,formAction,formEnctype,formMethod,!formNoValidate,formTarget,#height,!incremental,!indeterminate,max,#maxLength,min,#minLength,!multiple,name,pattern,placeholder,!readOnly,!required,selectionDirection,#selectionEnd,#selectionStart,#size,src,step,type,useMap,value,%valueAsDate,#valueAsNumber,#width","li^[HTMLElement]|type,#value","label^[HTMLElement]|htmlFor","legend^[HTMLElement]|align","link^[HTMLElement]|as,charset,%crossOrigin,!disabled,href,hreflang,integrity,media,referrerPolicy,rel,%relList,rev,%sizes,target,type","map^[HTMLElement]|name","marquee^[HTMLElement]|behavior,bgColor,direction,height,#hspace,#loop,#scrollAmount,#scrollDelay,!trueSpeed,#vspace,width","menu^[HTMLElement]|!compact","meta^[HTMLElement]|content,httpEquiv,name,scheme","meter^[HTMLElement]|#high,#low,#max,#min,#optimum,#value","ins,del^[HTMLElement]|cite,dateTime","ol^[HTMLElement]|!compact,!reversed,#start,type","object^[HTMLElement]|align,archive,border,code,codeBase,codeType,data,!declare,height,#hspace,name,standby,type,useMap,#vspace,width","optgroup^[HTMLElement]|!disabled,label","option^[HTMLElement]|!defaultSelected,!disabled,label,!selected,text,value","output^[HTMLElement]|defaultValue,%htmlFor,name,value","p^[HTMLElement]|align","param^[HTMLElement]|name,type,value,valueType","picture^[HTMLElement]|","pre^[HTMLElement]|#width","progress^[HTMLElement]|#max,#value","q,blockquote,cite^[HTMLElement]|","script^[HTMLElement]|!async,charset,%crossOrigin,!defer,event,htmlFor,integrity,src,text,type","select^[HTMLElement]|!autofocus,!disabled,#length,!multiple,name,!required,#selectedIndex,#size,value","shadow^[HTMLElement]|","slot^[HTMLElement]|name","source^[HTMLElement]|media,sizes,src,srcset,type","span^[HTMLElement]|","style^[HTMLElement]|!disabled,media,type","caption^[HTMLElement]|align","th,td^[HTMLElement]|abbr,align,axis,bgColor,ch,chOff,#colSpan,headers,height,!noWrap,#rowSpan,scope,vAlign,width","col,colgroup^[HTMLElement]|align,ch,chOff,#span,vAlign,width","table^[HTMLElement]|align,bgColor,border,%caption,cellPadding,cellSpacing,frame,rules,summary,%tFoot,%tHead,width","tr^[HTMLElement]|align,bgColor,ch,chOff,vAlign","tfoot,thead,tbody^[HTMLElement]|align,ch,chOff,vAlign","template^[HTMLElement]|","textarea^[HTMLElement]|autocapitalize,!autofocus,#cols,defaultValue,dirName,!disabled,#maxLength,#minLength,name,placeholder,!readOnly,!required,#rows,selectionDirection,#selectionEnd,#selectionStart,value,wrap","title^[HTMLElement]|text","track^[HTMLElement]|!default,kind,label,src,srclang","ul^[HTMLElement]|!compact,type","unknown^[HTMLElement]|","video^media|#height,poster,#width",":svg:a^:svg:graphics|",":svg:animate^:svg:animation|",":svg:animateMotion^:svg:animation|",":svg:animateTransform^:svg:animation|",":svg:circle^:svg:geometry|",":svg:clipPath^:svg:graphics|",":svg:defs^:svg:graphics|",":svg:desc^:svg:|",":svg:discard^:svg:|",":svg:ellipse^:svg:geometry|",":svg:feBlend^:svg:|",":svg:feColorMatrix^:svg:|",":svg:feComponentTransfer^:svg:|",":svg:feComposite^:svg:|",":svg:feConvolveMatrix^:svg:|",":svg:feDiffuseLighting^:svg:|",":svg:feDisplacementMap^:svg:|",":svg:feDistantLight^:svg:|",":svg:feDropShadow^:svg:|",":svg:feFlood^:svg:|",":svg:feFuncA^:svg:componentTransferFunction|",":svg:feFuncB^:svg:componentTransferFunction|",":svg:feFuncG^:svg:componentTransferFunction|",":svg:feFuncR^:svg:componentTransferFunction|",":svg:feGaussianBlur^:svg:|",":svg:feImage^:svg:|",":svg:feMerge^:svg:|",":svg:feMergeNode^:svg:|",":svg:feMorphology^:svg:|",":svg:feOffset^:svg:|",":svg:fePointLight^:svg:|",":svg:feSpecularLighting^:svg:|",":svg:feSpotLight^:svg:|",":svg:feTile^:svg:|",":svg:feTurbulence^:svg:|",":svg:filter^:svg:|",":svg:foreignObject^:svg:graphics|",":svg:g^:svg:graphics|",":svg:image^:svg:graphics|",":svg:line^:svg:geometry|",":svg:linearGradient^:svg:gradient|",":svg:mpath^:svg:|",":svg:marker^:svg:|",":svg:mask^:svg:|",":svg:metadata^:svg:|",":svg:path^:svg:geometry|",":svg:pattern^:svg:|",":svg:polygon^:svg:geometry|",":svg:polyline^:svg:geometry|",":svg:radialGradient^:svg:gradient|",":svg:rect^:svg:geometry|",":svg:svg^:svg:graphics|#currentScale,#zoomAndPan",":svg:script^:svg:|type",":svg:set^:svg:animation|",":svg:stop^:svg:|",":svg:style^:svg:|!disabled,media,title,type",":svg:switch^:svg:graphics|",":svg:symbol^:svg:|",":svg:tspan^:svg:textPositioning|",":svg:text^:svg:textPositioning|",":svg:textPath^:svg:textContent|",":svg:title^:svg:|",":svg:use^:svg:graphics|",":svg:view^:svg:|#zoomAndPan","data^[HTMLElement]|value","keygen^[HTMLElement]|!autofocus,challenge,!disabled,form,keytype,name","menuitem^[HTMLElement]|type,label,icon,!disabled,!checked,radiogroup,!default","summary^[HTMLElement]|","time^[HTMLElement]|dateTime",":svg:cursor^:svg:|"],_ATTR_TO_PROP={class:"className",for:"htmlFor",formaction:"formAction",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},DomElementSchemaRegistry=function(_super){function DomElementSchemaRegistry(){var _this=_super.call(this)||this;return _this._schema={},SCHEMA.forEach(function(encodedType){var type={},_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(encodedType.split("|"),2),strType=_a[0],properties=_a[1].split(","),_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(strType.split("^"),2),typeNames=_b[0],superName=_b[1];typeNames.split(",").forEach(function(tag){return _this._schema[tag.toLowerCase()]=type});var superType=superName&&_this._schema[superName.toLowerCase()];superType&&Object.keys(superType).forEach(function(prop){type[prop]=superType[prop]}),properties.forEach(function(property){if(property.length>0)switch(property[0]){case"*":break;case"!":type[property.substring(1)]=BOOLEAN;break;case"#":type[property.substring(1)]=NUMBER;break;case"%":type[property.substring(1)]=OBJECT;break;default:type[property]=STRING}})}),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(DomElementSchemaRegistry,_super),DomElementSchemaRegistry.prototype.hasProperty=function(tagName,propName,schemaMetas){if(schemaMetas.some(function(schema){return schema.name===NO_ERRORS_SCHEMA.name}))return!0;if(tagName.indexOf("-")>-1){if(isNgContainer(tagName)||isNgContent(tagName))return!1;if(schemaMetas.some(function(schema){return schema.name===CUSTOM_ELEMENTS_SCHEMA.name}))return!0}return!!(this._schema[tagName.toLowerCase()]||this._schema.unknown)[propName]},DomElementSchemaRegistry.prototype.hasElement=function(tagName,schemaMetas){Iif(schemaMetas.some(function(schema){return schema.name===NO_ERRORS_SCHEMA.name}))return!0;Iif(tagName.indexOf("-")>-1){if(isNgContainer(tagName)||isNgContent(tagName))return!0;if(schemaMetas.some(function(schema){return schema.name===CUSTOM_ELEMENTS_SCHEMA.name}))return!0}return!!this._schema[tagName.toLowerCase()]},DomElementSchemaRegistry.prototype.securityContext=function(tagName,propName,isAttribute){isAttribute&&(propName=this.getMappedPropName(propName)),tagName=tagName.toLowerCase(),propName=propName.toLowerCase();var ctx=SECURITY_SCHEMA()[tagName+"|"+propName];return ctx||((ctx=SECURITY_SCHEMA()["*|"+propName])||SecurityContext.NONE)},DomElementSchemaRegistry.prototype.getMappedPropName=function(propName){return _ATTR_TO_PROP[propName]||propName},DomElementSchemaRegistry.prototype.getDefaultComponentElementName=function(){return"ng-component"},DomElementSchemaRegistry.prototype.validateProperty=function(name){return name.toLowerCase().startsWith("on")?{error:!0,msg:"Binding to event property '"+name+"' is disallowed for security reasons, please use ("+name.slice(2)+")=...\nIf '"+name+"' is a directive input, make sure the directive is imported by the current module."}:{error:!1}},DomElementSchemaRegistry.prototype.validateAttribute=function(name){return name.toLowerCase().startsWith("on")?{error:!0,msg:"Binding to event attribute '"+name+"' is disallowed for security reasons, please use ("+name.slice(2)+")=..."}:{error:!1}},DomElementSchemaRegistry.prototype.allKnownElementNames=function(){return Object.keys(this._schema)},DomElementSchemaRegistry.prototype.normalizeAnimationStyleProperty=function(propName){return function dashCaseToCamelCase(input){return input.replace(DASH_CASE_REGEXP,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];return m[1].toUpperCase()})}(propName)},DomElementSchemaRegistry.prototype.normalizeAnimationStyleValue=function(camelCaseProp,userProvidedProp,val){var unit="",strVal=val.toString().trim(),errorMsg=null;if(function _isPixelDimensionStyle(prop){switch(prop){case"width":case"height":case"minWidth":case"minHeight":case"maxWidth":case"maxHeight":case"left":case"top":case"bottom":case"right":case"fontSize":case"outlineWidth":case"outlineOffset":case"paddingTop":case"paddingLeft":case"paddingBottom":case"paddingRight":case"marginTop":case"marginLeft":case"marginBottom":case"marginRight":case"borderRadius":case"borderWidth":case"borderTopWidth":case"borderLeftWidth":case"borderRightWidth":case"borderBottomWidth":case"textIndent":return!0;default:return!1}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(camelCaseProp)&&0!==val&&"0"!==val)if("number"==typeof val)unit="px";else{var valAndSuffixMatch=val.match(/^[+-]?[\d\.]+([a-z]*)$/);valAndSuffixMatch&&0==valAndSuffixMatch[1].length&&(errorMsg="Please provide a CSS unit value for "+userProvidedProp+":"+val)}return{error:errorMsg,value:strVal+unit}},DomElementSchemaRegistry}(ElementSchemaRegistry);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var BIND_NAME_REGEXP$1=/^(?:(?:(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/;function htmlAstToRender3Ast(htmlNodes,bindingParser){var transformer=new HtmlAstToIvyAst(bindingParser),ivyNodes=visitAll$1(transformer,htmlNodes),allErrors=bindingParser.errors.concat(transformer.errors),errors=allErrors.filter(function(e){return e.level===ParseErrorLevel.ERROR});if(errors.length>0)throw syntaxError("Template parse errors:\n"+errors.join("\n"),errors);return{nodes:ivyNodes,errors:allErrors,styleUrls:transformer.styleUrls,styles:transformer.styles}}var TagType,HtmlAstToIvyAst=function(){function HtmlAstToIvyAst(bindingParser){this.bindingParser=bindingParser,this.errors=[],this.styles=[],this.styleUrls=[]}return HtmlAstToIvyAst.prototype.visitElement=function(element){var e_1,_a,_this=this,preparsedElement=preparseElement(element);if(preparsedElement.type===PreparsedElementType.SCRIPT)return null;if(preparsedElement.type===PreparsedElementType.STYLE){var contents=function textContents(node){return 1===node.children.length&&node.children[0]instanceof Text$3?node.children[0].value:null}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(element);return null!==contents&&this.styles.push(contents),null}if(preparsedElement.type===PreparsedElementType.STYLESHEET&&isStyleUrlResolvable(preparsedElement.hrefAttr))return this.styleUrls.push(preparsedElement.hrefAttr),null;var isTemplateElement=isNgTemplate(element.name),parsedProperties=[],boundEvents=[],variables=[],references=[],attributes=[],i18nAttrsMeta={},templateParsedProperties=[],templateVariables=[],elementHasInlineTemplate=!1;try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(element.attrs),_c=_b.next();!_c.done;_c=_b.next()){var attribute=_c.value,hasBinding=!1,normalizedName=normalizeAttributeName(attribute.name),isTemplateBinding=!1;if(attribute.i18n&&(i18nAttrsMeta[attribute.name]=attribute.i18n),normalizedName.startsWith("*")){elementHasInlineTemplate&&this.reportError("Can't have multiple template bindings on one element. Use only one attribute prefixed with *",attribute.sourceSpan),isTemplateBinding=!0,elementHasInlineTemplate=!0;var templateValue=attribute.value,templateKey=normalizedName.substring("*".length),parsedVariables=[];this.bindingParser.parseInlineTemplateBinding(templateKey,templateValue,attribute.sourceSpan,[],templateParsedProperties,parsedVariables),templateVariables.push.apply(templateVariables,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(parsedVariables.map(function(v){return new Variable(v.name,v.value,v.sourceSpan)})))}else hasBinding=this.parseAttribute(isTemplateElement,attribute,[],parsedProperties,boundEvents,variables,references);hasBinding||isTemplateBinding||attributes.push(this.visitAttribute(attribute))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}var parsedElement,children=visitAll$1(preparsedElement.nonBindable?NON_BINDABLE_VISITOR$1:this,element.children);if(preparsedElement.type===PreparsedElementType.NG_CONTENT){element.children&&!element.children.every(function(node){return function isEmptyTextNode(node){return node instanceof Text$3&&0==node.value.trim().length}(node)||function isCommentNode(node){return node instanceof Comment}(node)})&&this.reportError("<ng-content> element cannot have content.",element.sourceSpan);var selector=preparsedElement.selectAttr,attrs=element.attrs.map(function(attr){return _this.visitAttribute(attr)});parsedElement=new Content(selector,attrs,element.sourceSpan,element.i18n)}else if(isTemplateElement){attrs=this.extractAttributes(element.name,parsedProperties,i18nAttrsMeta);parsedElement=new Template(element.name,attributes,attrs.bound,boundEvents,[],children,references,variables,element.sourceSpan,element.startSourceSpan,element.endSourceSpan,element.i18n)}else{attrs=this.extractAttributes(element.name,parsedProperties,i18nAttrsMeta);parsedElement=new Element(element.name,attributes,attrs.bound,boundEvents,children,references,element.sourceSpan,element.startSourceSpan,element.endSourceSpan,element.i18n)}if(elementHasInlineTemplate){attrs=this.extractAttributes("ng-template",templateParsedProperties,i18nAttrsMeta);var templateAttrs_1=[];attrs.literal.forEach(function(attr){return templateAttrs_1.push(attr)}),attrs.bound.forEach(function(attr){return templateAttrs_1.push(attr)});var hoistedAttrs=parsedElement instanceof Element?{attributes:parsedElement.attributes,inputs:parsedElement.inputs,outputs:parsedElement.outputs}:{attributes:[],inputs:[],outputs:[]};parsedElement=new Template(parsedElement.name,hoistedAttrs.attributes,hoistedAttrs.inputs,hoistedAttrs.outputs,templateAttrs_1,[parsedElement],[],templateVariables,element.sourceSpan,element.startSourceSpan,element.endSourceSpan,element.i18n)}return parsedElement},HtmlAstToIvyAst.prototype.visitAttribute=function(attribute){return new TextAttribute(attribute.name,attribute.value,attribute.sourceSpan,attribute.valueSpan,attribute.i18n)},HtmlAstToIvyAst.prototype.visitText=function(text){return this._visitTextWithInterpolation(text.value,text.sourceSpan,text.i18n)},HtmlAstToIvyAst.prototype.visitExpansion=function(expansion){var _this=this,meta=expansion.i18n;if(!meta)return null;var vars={},placeholders={};return Object.keys(meta.placeholders).forEach(function(key){var value=meta.placeholders[key];if(key.startsWith("VAR_")){var config=_this.bindingParser.interpolationConfig,wrapped=""+config.start+value+config.end;vars[key]=_this._visitTextWithInterpolation(wrapped,expansion.sourceSpan)}else placeholders[key]=_this._visitTextWithInterpolation(value,expansion.sourceSpan)}),new Icu(vars,placeholders,expansion.sourceSpan,meta)},HtmlAstToIvyAst.prototype.visitExpansionCase=function(expansionCase){return null},HtmlAstToIvyAst.prototype.visitComment=function(comment){return null},HtmlAstToIvyAst.prototype.extractAttributes=function(elementName,properties,i18nPropsMeta){var _this=this,bound=[],literal=[];return properties.forEach(function(prop){var i18n=i18nPropsMeta[prop.name];if(prop.isLiteral)literal.push(new TextAttribute(prop.name,prop.expression.source||"",prop.sourceSpan,void 0,i18n));else{var bep=_this.bindingParser.createBoundElementProperty(elementName,prop,!0,!1);bound.push(BoundAttribute.fromBoundElementProperty(bep,i18n))}}),{bound:bound,literal:literal}},HtmlAstToIvyAst.prototype.parseAttribute=function(isTemplateElement,attribute,matchableAttributes,parsedProperties,boundEvents,variables,references){var name=normalizeAttributeName(attribute.name),value=attribute.value,srcSpan=attribute.sourceSpan,bindParts=name.match(BIND_NAME_REGEXP$1),hasBinding=!1;if(bindParts){if(hasBinding=!0,null!=bindParts[1])this.bindingParser.parsePropertyBinding(bindParts[7],value,!1,srcSpan,matchableAttributes,parsedProperties);else if(bindParts[2])if(isTemplateElement){var identifier=bindParts[7];this.parseVariable(identifier,value,srcSpan,variables)}else this.reportError('"let-" is only supported on ng-template elements.',srcSpan);else if(bindParts[3]){identifier=bindParts[7];this.parseReference(identifier,value,srcSpan,references)}else if(bindParts[4]){var events=[];this.bindingParser.parseEvent(bindParts[7],value,srcSpan,attribute.valueSpan||srcSpan,matchableAttributes,events),addEvents(events,boundEvents)}else if(bindParts[5])this.bindingParser.parsePropertyBinding(bindParts[7],value,!1,srcSpan,matchableAttributes,parsedProperties),this.parseAssignmentEvent(bindParts[7],value,srcSpan,attribute.valueSpan,matchableAttributes,boundEvents);else if(bindParts[6])this.bindingParser.parseLiteralAttr(name,value,srcSpan,matchableAttributes,parsedProperties);else if(bindParts[8])this.bindingParser.parsePropertyBinding(bindParts[8],value,!1,srcSpan,matchableAttributes,parsedProperties),this.parseAssignmentEvent(bindParts[8],value,srcSpan,attribute.valueSpan,matchableAttributes,boundEvents);else if(bindParts[9])this.bindingParser.parsePropertyBinding(bindParts[9],value,!1,srcSpan,matchableAttributes,parsedProperties);else if(bindParts[10]){events=[];this.bindingParser.parseEvent(bindParts[10],value,srcSpan,attribute.valueSpan||srcSpan,matchableAttributes,events),addEvents(events,boundEvents)}}else hasBinding=this.bindingParser.parsePropertyInterpolation(name,value,srcSpan,matchableAttributes,parsedProperties);return hasBinding},HtmlAstToIvyAst.prototype._visitTextWithInterpolation=function(value,sourceSpan,i18n){var valueNoNgsp=replaceNgsp(value),expr=this.bindingParser.parseInterpolation(valueNoNgsp,sourceSpan);return expr?new BoundText(expr,sourceSpan,i18n):new Text(valueNoNgsp,sourceSpan)},HtmlAstToIvyAst.prototype.parseVariable=function(identifier,value,sourceSpan,variables){identifier.indexOf("-")>-1&&this.reportError('"-" is not allowed in variable names',sourceSpan),variables.push(new Variable(identifier,value,sourceSpan))},HtmlAstToIvyAst.prototype.parseReference=function(identifier,value,sourceSpan,references){identifier.indexOf("-")>-1&&this.reportError('"-" is not allowed in reference names',sourceSpan),references.push(new Reference(identifier,value,sourceSpan))},HtmlAstToIvyAst.prototype.parseAssignmentEvent=function(name,expression,sourceSpan,valueSpan,targetMatchableAttrs,boundEvents){var events=[];this.bindingParser.parseEvent(name+"Change",expression+"=$event",sourceSpan,valueSpan||sourceSpan,targetMatchableAttrs,events),addEvents(events,boundEvents)},HtmlAstToIvyAst.prototype.reportError=function(message,sourceSpan,level){void 0===level&&(level=ParseErrorLevel.ERROR),this.errors.push(new ParseError(sourceSpan,message,level))},HtmlAstToIvyAst}(),NON_BINDABLE_VISITOR$1=new(function(){function NonBindableVisitor(){}return NonBindableVisitor.prototype.visitElement=function(ast){var preparsedElement=preparseElement(ast);if(preparsedElement.type===PreparsedElementType.SCRIPT||preparsedElement.type===PreparsedElementType.STYLE||preparsedElement.type===PreparsedElementType.STYLESHEET)return null;var children=visitAll$1(this,ast.children,null);return new Element(ast.name,visitAll$1(this,ast.attrs),[],[],children,[],ast.sourceSpan,ast.startSourceSpan,ast.endSourceSpan)},NonBindableVisitor.prototype.visitComment=function(comment){return null},NonBindableVisitor.prototype.visitAttribute=function(attribute){return new TextAttribute(attribute.name,attribute.value,attribute.sourceSpan,void 0,attribute.i18n)},NonBindableVisitor.prototype.visitText=function(text){return new Text(text.value,text.sourceSpan)},NonBindableVisitor.prototype.visitExpansion=function(expansion){return null},NonBindableVisitor.prototype.visitExpansionCase=function(expansionCase){return null},NonBindableVisitor}());function normalizeAttributeName(attrName){return/^data-/i.test(attrName)?attrName.substring(5):attrName}function addEvents(events,boundEvents){boundEvents.push.apply(boundEvents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(events.map(function(e){return BoundEvent.fromParsedEvent(e)})))}!function(TagType){TagType[TagType.ELEMENT=0]="ELEMENT",TagType[TagType.TEMPLATE=1]="TEMPLATE"}(TagType||(TagType={}));var I18nContext=function(){function I18nContext(index,ref,level,templateIndex,meta,registry){void 0===level&&(level=0),void 0===templateIndex&&(templateIndex=null),this.index=index,this.ref=ref,this.level=level,this.templateIndex=templateIndex,this.meta=meta,this.registry=registry,this.bindings=new Set,this.placeholders=new Map,this.isEmitted=!1,this._unresolvedCtxCount=0,this._registry=registry||function setupRegistry(){return{getUniqueId:getSeqNumberGenerator(),icus:new Map}}(),this.id=this._registry.getUniqueId()}return I18nContext.prototype.appendTag=function(type,node,index,closed){if(!node.isVoid||!closed){var ph=node.isVoid||!closed?node.startName:node.closeName,content={type:type,index:index,ctx:this.id,isVoid:node.isVoid,closed:closed};updatePlaceholderMap(this.placeholders,ph,content)}},Object.defineProperty(I18nContext.prototype,"icus",{get:function(){return this._registry.icus},enumerable:!0,configurable:!0}),Object.defineProperty(I18nContext.prototype,"isRoot",{get:function(){return 0===this.level},enumerable:!0,configurable:!0}),Object.defineProperty(I18nContext.prototype,"isResolved",{get:function(){return 0===this._unresolvedCtxCount},enumerable:!0,configurable:!0}),I18nContext.prototype.getSerializedPlaceholders=function(){var result=new Map;return this.placeholders.forEach(function(values,key){return result.set(key,values.map(serializePlaceholderValue))}),result},I18nContext.prototype.appendBinding=function(binding){this.bindings.add(binding)},I18nContext.prototype.appendIcu=function(name,ref){updatePlaceholderMap(this._registry.icus,name,ref)},I18nContext.prototype.appendBoundText=function(node){var _this=this;assembleBoundTextPlaceholders(node,this.bindings.size,this.id).forEach(function(values,key){return updatePlaceholderMap.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([_this.placeholders,key],values))})},I18nContext.prototype.appendTemplate=function(node,index){this.appendTag(TagType.TEMPLATE,node,index,!1),this.appendTag(TagType.TEMPLATE,node,index,!0),this._unresolvedCtxCount++},I18nContext.prototype.appendElement=function(node,index,closed){this.appendTag(TagType.ELEMENT,node,index,closed)},I18nContext.prototype.forkChildContext=function(index,templateIndex,meta){return new I18nContext(index,this.ref,this.level+1,templateIndex,meta,this._registry)},I18nContext.prototype.reconcileChildContext=function(context){var _this=this;["start","close"].forEach(function(op){var key=context.meta[op+"Name"],tag=(_this.placeholders.get(key)||[]).find(findTemplateFn(_this.id,context.templateIndex));tag&&(tag.ctx=context.id)}),context.placeholders.forEach(function(values,key){var phs=_this.placeholders.get(key);if(phs){var tmplIdx=function findIndex(items,callback){for(var i=0;i<items.length;i++)if(callback(items[i]))return i;return-1}(phs,findTemplateFn(context.id,context.templateIndex));if(tmplIdx>=0){var isCloseTag=key.startsWith("CLOSE");if(key.endsWith("NG-TEMPLATE"))phs.splice.apply(phs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([tmplIdx+(isCloseTag?0:1),0],values));else values[isCloseTag?values.length-1:0].tmpl=phs[tmplIdx],phs.splice.apply(phs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([tmplIdx,1],values))}else phs.push.apply(phs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(values));_this.placeholders.set(key,phs)}else _this.placeholders.set(key,values)}),this._unresolvedCtxCount--},I18nContext}();function wrap(symbol,index,contextId,closed){return wrapI18nPlaceholder(""+(closed?"/":"")+symbol+index,contextId)}function wrapTag(symbol,_a,closed){var index=_a.index,ctx=_a.ctx;return _a.isVoid?wrap(symbol,index,ctx)+wrap(symbol,index,ctx,!0):wrap(symbol,index,ctx,closed)}function findTemplateFn(ctx,templateIndex){return function(token){return"object"==typeof token&&token.type===TagType.TEMPLATE&&token.index===templateIndex&&token.ctx===ctx}}function serializePlaceholderValue(value){var element=function(data,closed){return wrapTag("#",data,closed)},template=function(data,closed){return wrapTag("*",data,closed)};switch(value.type){case TagType.ELEMENT:return value.closed?element(value,!0)+(value.tmpl?template(value.tmpl,!0):""):value.tmpl?template(value.tmpl)+element(value)+(value.isVoid?template(value.tmpl,!0):""):element(value);case TagType.TEMPLATE:return template(value,value.closed);default:return value}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var TAG_TO_PLACEHOLDER_NAMES={A:"LINK",B:"BOLD_TEXT",BR:"LINE_BREAK",EM:"EMPHASISED_TEXT",H1:"HEADING_LEVEL1",H2:"HEADING_LEVEL2",H3:"HEADING_LEVEL3",H4:"HEADING_LEVEL4",H5:"HEADING_LEVEL5",H6:"HEADING_LEVEL6",HR:"HORIZONTAL_RULE",I:"ITALIC_TEXT",LI:"LIST_ITEM",LINK:"MEDIA_LINK",OL:"ORDERED_LIST",P:"PARAGRAPH",Q:"QUOTATION",S:"STRIKETHROUGH_TEXT",SMALL:"SMALL_TEXT",SUB:"SUBSTRIPT",SUP:"SUPERSCRIPT",TBODY:"TABLE_BODY",TD:"TABLE_CELL",TFOOT:"TABLE_FOOTER",TH:"TABLE_HEADER_CELL",THEAD:"TABLE_HEADER",TR:"TABLE_ROW",TT:"MONOSPACED_TEXT",U:"UNDERLINED_TEXT",UL:"UNORDERED_LIST"},PlaceholderRegistry=function(){function PlaceholderRegistry(){this._placeHolderNameCounts={},this._signatureToName={}}return PlaceholderRegistry.prototype.getStartTagPlaceholderName=function(tag,attrs,isVoid){var signature=this._hashTag(tag,attrs,isVoid);if(this._signatureToName[signature])return this._signatureToName[signature];var upperTag=tag.toUpperCase(),baseName=TAG_TO_PLACEHOLDER_NAMES[upperTag]||"TAG_"+upperTag,name=this._generateUniqueName(isVoid?baseName:"START_"+baseName);return this._signatureToName[signature]=name,name},PlaceholderRegistry.prototype.getCloseTagPlaceholderName=function(tag){var signature=this._hashClosingTag(tag);if(this._signatureToName[signature])return this._signatureToName[signature];var upperTag=tag.toUpperCase(),baseName=TAG_TO_PLACEHOLDER_NAMES[upperTag]||"TAG_"+upperTag,name=this._generateUniqueName("CLOSE_"+baseName);return this._signatureToName[signature]=name,name},PlaceholderRegistry.prototype.getPlaceholderName=function(name,content){var upperName=name.toUpperCase(),signature="PH: "+upperName+"="+content;if(this._signatureToName[signature])return this._signatureToName[signature];var uniqueName=this._generateUniqueName(upperName);return this._signatureToName[signature]=uniqueName,uniqueName},PlaceholderRegistry.prototype.getUniquePlaceholder=function(name){return this._generateUniqueName(name.toUpperCase())},PlaceholderRegistry.prototype._hashTag=function(tag,attrs,isVoid){return"<"+tag+Object.keys(attrs).sort().map(function(name){return" "+name+"="+attrs[name]}).join("")+(isVoid?"/>":"></"+tag+">")},PlaceholderRegistry.prototype._hashClosingTag=function(tag){return this._hashTag("/"+tag,{},!1)},PlaceholderRegistry.prototype._generateUniqueName=function(base){if(!this._placeHolderNameCounts.hasOwnProperty(base))return this._placeHolderNameCounts[base]=1,base;var id=this._placeHolderNameCounts[base];return this._placeHolderNameCounts[base]=id+1,base+"_"+id},PlaceholderRegistry}(),_expParser=new Parser$1(new Lexer);function createI18nMessageFactory(interpolationConfig){var visitor=new _I18nVisitor(_expParser,interpolationConfig);return function(nodes,meaning,description,id,visitNodeFn){return visitor.toI18nMessage(nodes,meaning,description,id,visitNodeFn)}}var _I18nVisitor=function(){function _I18nVisitor(_expressionParser,_interpolationConfig){this._expressionParser=_expressionParser,this._interpolationConfig=_interpolationConfig}return _I18nVisitor.prototype.toI18nMessage=function(nodes,meaning,description,id,visitNodeFn){this._isIcu=1==nodes.length&&nodes[0]instanceof Expansion,this._icuDepth=0,this._placeholderRegistry=new PlaceholderRegistry,this._placeholderToContent={},this._placeholderToMessage={},this._visitNodeFn=visitNodeFn;var i18nodes=visitAll$1(this,nodes,{});return new Message(i18nodes,this._placeholderToContent,this._placeholderToMessage,meaning,description,id)},_I18nVisitor.prototype._visitNode=function(html,i18n){return this._visitNodeFn&&this._visitNodeFn(html,i18n),i18n},_I18nVisitor.prototype.visitElement=function(el,context){var children=visitAll$1(this,el.children),attrs={};el.attrs.forEach(function(attr){attrs[attr.name]=attr.value});var isVoid=getHtmlTagDefinition(el.name).isVoid,startPhName=this._placeholderRegistry.getStartTagPlaceholderName(el.name,attrs,isVoid);this._placeholderToContent[startPhName]=el.sourceSpan.toString();var closePhName="";isVoid||(closePhName=this._placeholderRegistry.getCloseTagPlaceholderName(el.name),this._placeholderToContent[closePhName]="</"+el.name+">");var node=new TagPlaceholder(el.name,attrs,startPhName,closePhName,children,isVoid,el.sourceSpan);return this._visitNode(el,node)},_I18nVisitor.prototype.visitAttribute=function(attribute,context){var node=this._visitTextWithInterpolation(attribute.value,attribute.sourceSpan);return this._visitNode(attribute,node)},_I18nVisitor.prototype.visitText=function(text,context){var node=this._visitTextWithInterpolation(text.value,text.sourceSpan);return this._visitNode(text,node)},_I18nVisitor.prototype.visitComment=function(comment,context){return null},_I18nVisitor.prototype.visitExpansion=function(icu,context){var _this=this;this._icuDepth++;var i18nIcuCases={},i18nIcu=new Icu$1(icu.switchValue,icu.type,i18nIcuCases,icu.sourceSpan);if(icu.cases.forEach(function(caze){i18nIcuCases[caze.value]=new Container(caze.expression.map(function(node){return node.visit(_this,{})}),caze.expSourceSpan)}),this._icuDepth--,this._isIcu||this._icuDepth>0){var expPh=this._placeholderRegistry.getUniquePlaceholder("VAR_"+icu.type);return i18nIcu.expressionPlaceholder=expPh,this._placeholderToContent[expPh]=icu.switchValue,this._visitNode(icu,i18nIcu)}var phName=this._placeholderRegistry.getPlaceholderName("ICU",icu.sourceSpan.toString()),visitor=new _I18nVisitor(this._expressionParser,this._interpolationConfig);this._placeholderToMessage[phName]=visitor.toI18nMessage([icu],"","","");var node=new IcuPlaceholder(i18nIcu,phName,icu.sourceSpan);return this._visitNode(icu,node)},_I18nVisitor.prototype.visitExpansionCase=function(icuCase,context){throw new Error("Unreachable code")},_I18nVisitor.prototype._visitTextWithInterpolation=function(text,sourceSpan){var splitInterpolation=this._expressionParser.splitInterpolation(text,sourceSpan.start.toString(),this._interpolationConfig);if(!splitInterpolation)return new Text$1(text,sourceSpan);for(var nodes=[],container=new Container(nodes,sourceSpan),_a=this._interpolationConfig,sDelimiter=_a.start,eDelimiter=_a.end,i=0;i<splitInterpolation.strings.length-1;i++){var expression=splitInterpolation.expressions[i],baseName=expression.split(_CUSTOM_PH_EXP)[2]||"INTERPOLATION",phName=this._placeholderRegistry.getPlaceholderName(baseName,expression);splitInterpolation.strings[i].length&&nodes.push(new Text$1(splitInterpolation.strings[i],sourceSpan)),nodes.push(new Placeholder(expression,phName,sourceSpan)),this._placeholderToContent[phName]=sDelimiter+expression+eDelimiter}var lastStringIdx=splitInterpolation.strings.length-1;return splitInterpolation.strings[lastStringIdx].length&&nodes.push(new Text$1(splitInterpolation.strings[lastStringIdx],sourceSpan)),container},_I18nVisitor}(),_CUSTOM_PH_EXP=/\/\/[\s\S]*i18n[\s\S]*\([\s\S]*ph[\s\S]*=[\s\S]*("|')([\s\S]*?)\1[\s\S]*\)/g;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function setI18nRefs(html,i18n){html.i18n=i18n}var I18nMetaVisitor=function(){function I18nMetaVisitor(interpolationConfig,keepI18nAttrs){void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG),void 0===keepI18nAttrs&&(keepI18nAttrs=!1),this.interpolationConfig=interpolationConfig,this.keepI18nAttrs=keepI18nAttrs,this._createI18nMessage=createI18nMessageFactory(interpolationConfig)}return I18nMetaVisitor.prototype._generateI18nMessage=function(nodes,meta,visitNodeFn){void 0===meta&&(meta="");var parsed="string"==typeof meta?function parseI18nMeta(meta){var _a,_b,id,meaning,description;if(meta){var idIndex=meta.indexOf(I18N_ID_SEPARATOR),descIndex=meta.indexOf(I18N_MEANING_SEPARATOR),meaningAndDesc=void 0;meaningAndDesc=(_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(idIndex>-1?[meta.slice(0,idIndex),meta.slice(idIndex+2)]:[meta,""],2))[0],id=_a[1],meaning=(_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(descIndex>-1?[meaningAndDesc.slice(0,descIndex),meaningAndDesc.slice(descIndex+1)]:["",meaningAndDesc],2))[0],description=_b[1]}return{id:id,meaning:meaning,description:description}}(meta):metaFromI18nMessage(meta),message=this._createI18nMessage(nodes,parsed.meaning||"",parsed.description||"",parsed.id||"",visitNodeFn);return message.id||(message.id="string"!=typeof meta&&meta.id||decimalDigest(message)),message},I18nMetaVisitor.prototype.visitElement=function(element,context){var e_1,_a,e_2,_b;if(function hasI18nAttrs(element){return element.attrs.some(function(attr){return isI18nAttribute(attr.name)})}(element)){var attrs=[],attrsMeta={};try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(element.attrs),_d=_c.next();!_d.done;_d=_c.next()){if((attr=_d.value).name===I18N_ATTR){var i18n_1=element.i18n||attr.value,message=this._generateI18nMessage(element.children,i18n_1,setI18nRefs);message.nodes.length&&(element.i18n=message)}else if(attr.name.startsWith(I18N_ATTR_PREFIX)){attrsMeta[attr.name.slice(I18N_ATTR_PREFIX.length)]=attr.value}else attrs.push(attr)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_1)throw e_1.error}}if(Object.keys(attrsMeta).length)try{for(var attrs_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(attrs),attrs_1_1=attrs_1.next();!attrs_1_1.done;attrs_1_1=attrs_1.next()){var attr,meta=attrsMeta[(attr=attrs_1_1.value).name];void 0!==meta&&attr.value&&(attr.i18n=this._generateI18nMessage([attr],attr.i18n||meta))}}catch(e_2_1){e_2={error:e_2_1}}finally{try{attrs_1_1&&!attrs_1_1.done&&(_b=attrs_1.return)&&_b.call(attrs_1)}finally{if(e_2)throw e_2.error}}this.keepI18nAttrs||(element.attrs=attrs)}return visitAll$1(this,element.children),element},I18nMetaVisitor.prototype.visitExpansion=function(expansion,context){var message,meta=expansion.i18n;if(meta instanceof IcuPlaceholder){var name_1=meta.name;icuFromI18nMessage(message=this._generateI18nMessage([expansion],meta)).name=name_1}else message=this._generateI18nMessage([expansion],meta);return expansion.i18n=message,expansion},I18nMetaVisitor.prototype.visitText=function(text,context){return text},I18nMetaVisitor.prototype.visitAttribute=function(attribute,context){return attribute},I18nMetaVisitor.prototype.visitComment=function(comment,context){return comment},I18nMetaVisitor.prototype.visitExpansionCase=function(expansionCase,context){return expansionCase},I18nMetaVisitor}(),formatPh=function(value){return"{$"+formatI18nPlaceholderName(value)+"}"},serializerVisitor$1=new(function(){function SerializerVisitor(){}return SerializerVisitor.prototype.visitText=function(text,context){return text.value},SerializerVisitor.prototype.visitContainer=function(container,context){var _this=this;return container.children.map(function(child){return child.visit(_this)}).join("")},SerializerVisitor.prototype.visitIcu=function(icu,context){var _this=this,strCases=Object.keys(icu.cases).map(function(k){return k+" {"+icu.cases[k].visit(_this)+"}"});return"{"+icu.expressionPlaceholder+", "+icu.type+", "+strCases.join(" ")+"}"},SerializerVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this;return ph.isVoid?formatPh(ph.startName):""+formatPh(ph.startName)+ph.children.map(function(child){return child.visit(_this)}).join("")+formatPh(ph.closeName)},SerializerVisitor.prototype.visitPlaceholder=function(ph,context){return formatPh(ph.name)},SerializerVisitor.prototype.visitIcuPlaceholder=function(ph,context){return formatPh(ph.name)},SerializerVisitor}());
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var GLOBAL_TARGET_RESOLVERS=new Map([["window",Identifiers$1.resolveWindow],["document",Identifiers$1.resolveDocument],["body",Identifiers$1.resolveBody]]),LEADING_TRIVIA_CHARS=[" ","\n","\r","\t"];function renderFlagCheckIfStmt(flags,statements){return ifStmt(variable(RENDER_FLAGS).bitwiseAnd(literal(flags),null,!1),statements)}function prepareEventListenerParameters(eventAst,handlerName,scope){void 0===handlerName&&(handlerName=null),void 0===scope&&(scope=null);var type=eventAst.type,name=eventAst.name,target=eventAst.target,phase=eventAst.phase,handler=eventAst.handler;if(target&&!GLOBAL_TARGET_RESOLVERS.has(target))throw new Error("Unexpected global target '"+target+"' defined for '"+name+"' event.\n        Supported list of global targets: "+Array.from(GLOBAL_TARGET_RESOLVERS.keys())+".");var implicitReceiverExpr=null===scope||0===scope.bindingLevel?variable(CONTEXT_NAME):scope.getOrCreateSharedContextVar(0),bindingExpr=convertActionBinding(scope,implicitReceiverExpr,handler,"b",function(){return error("Unexpected interpolation")},eventAst.handlerSpan),statements=[];scope&&(statements.push.apply(statements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(scope.restoreViewStatement())),statements.push.apply(statements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(scope.variableDeclarations()))),statements.push.apply(statements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(bindingExpr.render3Stmts));var eventName=1===type?function prepareSyntheticListenerName(name,phase){return""+ANIMATE_SYMBOL_PREFIX+name+"."+phase}(name,phase):name,fnName=handlerName&&sanitizeIdentifier(handlerName),handlerFn=fn([new FnParam("$event",DYNAMIC_TYPE)],statements,INFERRED_TYPE,null,fnName),params=[literal(eventName),handlerFn];return target&&params.push(literal(!1),importExpr(GLOBAL_TARGET_RESOLVERS.get(target))),params}var TemplateDefinitionBuilder=function(){function TemplateDefinitionBuilder(constantPool,parentBindingScope,level,contextName,i18nContext,templateIndex,templateName,directiveMatcher,directives,pipeTypeByName,pipes,_namespace,relativeContextFilePath,i18nUseExternalIds){var _this=this;void 0===level&&(level=0),this.constantPool=constantPool,this.level=level,this.contextName=contextName,this.i18nContext=i18nContext,this.templateIndex=templateIndex,this.templateName=templateName,this.directiveMatcher=directiveMatcher,this.directives=directives,this.pipeTypeByName=pipeTypeByName,this.pipes=pipes,this._namespace=_namespace,this.relativeContextFilePath=relativeContextFilePath,this.i18nUseExternalIds=i18nUseExternalIds,this._dataIndex=0,this._bindingContext=0,this._prefixCode=[],this._creationCodeFns=[],this._updateCodeFns=[],this._lastNodeIndexWithFlush=-1,this._tempVariables=[],this._nestedTemplateFns=[],this._unsupported=unsupported,this.i18n=null,this._pureFunctionSlots=0,this._bindingSlots=0,this._ngContentReservedSlots=[],this._ngContentSelectorsOffset=0,this._implicitReceiverExpr=null,this.visitReference=invalid$1,this.visitVariable=invalid$1,this.visitTextAttribute=invalid$1,this.visitBoundAttribute=invalid$1,this.visitBoundEvent=invalid$1,this._bindingScope=parentBindingScope.nestedScope(level),this.fileBasedI18nSuffix=relativeContextFilePath.replace(/[^A-Za-z0-9]/g,"_")+"_",this._valueConverter=new ValueConverter(constantPool,function(){return _this.allocateDataSlot()},function(numSlots){return _this.allocatePureFunctionSlots(numSlots)},function(name,localName,slot,value){var pipeType=pipeTypeByName.get(name);pipeType&&_this.pipes.add(pipeType),_this._bindingScope.set(_this.level,localName,value),_this.creationInstruction(null,Identifiers$1.pipe,[literal(slot),literal(name)])})}return TemplateDefinitionBuilder.prototype.registerContextVariables=function(variable$1){var scopedName=this._bindingScope.freshReferenceName(),retrievalLevel=this.level,lhs=variable(variable$1.name+scopedName);this._bindingScope.set(retrievalLevel,variable$1.name,lhs,1,function(scope,relativeLevel){var rhs;if(scope.bindingLevel===retrievalLevel)rhs=variable(CONTEXT_NAME);else{var sharedCtxVar=scope.getSharedContextName(retrievalLevel);rhs=sharedCtxVar||generateNextContextExpr(relativeLevel)}return[lhs.set(rhs.prop(variable$1.value||"$implicit")).toConstDecl()]})},TemplateDefinitionBuilder.prototype.buildTemplateFunction=function(nodes,variables,ngContentSelectorsOffset,i18n){var _this=this;void 0===ngContentSelectorsOffset&&(ngContentSelectorsOffset=0),this._ngContentSelectorsOffset=ngContentSelectorsOffset,this._namespace!==Identifiers$1.namespaceHTML&&this.creationInstruction(null,this._namespace),variables.forEach(function(v){return _this.registerContextVariables(v)});var initI18nContext=this.i18nContext||isI18nRootNode(i18n)&&!isSingleI18nIcu(i18n)&&!(function isSingleElementTemplate(children){return 1===children.length&&children[0]instanceof Element}(nodes)&&nodes[0].i18n===i18n),selfClosingI18nInstruction=hasTextChildrenOnly(nodes);if(initI18nContext&&this.i18nStart(null,i18n,selfClosingI18nInstruction),visitAll(this,nodes),this._pureFunctionSlots+=this._bindingSlots,this._valueConverter.updatePipeSlotOffsets(this._bindingSlots),this._nestedTemplateFns.forEach(function(buildTemplateFn){return buildTemplateFn()}),0===this.level&&this._ngContentReservedSlots.length){var parameters=[];if(this._ngContentReservedSlots.length>1||"*"!==this._ngContentReservedSlots[0]){var r3ReservedSlots=this._ngContentReservedSlots.map(function(s){return"*"!==s?parseSelectorToR3Selector(s):s});parameters.push(this.constantPool.getConstLiteral(asLiteral(r3ReservedSlots),!0))}this.creationInstruction(null,Identifiers$1.projectionDef,parameters,!0)}initI18nContext&&this.i18nEnd(null,selfClosingI18nInstruction);var creationStatements=this._creationCodeFns.map(function(fn){return fn()}),updateStatements=this._updateCodeFns.map(function(fn){return fn()}),creationVariables=this._bindingScope.viewSnapshotStatements(),updateVariables=this._bindingScope.variableDeclarations().concat(this._tempVariables),creationBlock=creationStatements.length>0?[renderFlagCheckIfStmt(1,creationVariables.concat(creationStatements))]:[],updateBlock=updateStatements.length>0?[renderFlagCheckIfStmt(2,updateVariables.concat(updateStatements))]:[];return fn([new FnParam(RENDER_FLAGS,NUMBER_TYPE),new FnParam(CONTEXT_NAME,null)],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._prefixCode,creationBlock,updateBlock),INFERRED_TYPE,null,this.templateName)},TemplateDefinitionBuilder.prototype.getLocal=function(name){return this._bindingScope.get(name)},TemplateDefinitionBuilder.prototype.notifyImplicitReceiverUse=function(){this._bindingScope.notifyImplicitReceiverUse()},TemplateDefinitionBuilder.prototype.i18nTranslate=function(message,params,ref,transformFn){var _a;void 0===params&&(params={});var _ref=ref||variable(this.constantPool.uniqueName("I18N_")),closureVar=this.i18nGenerateClosureVar(message.id),_params={};params&&Object.keys(params).length&&Object.keys(params).forEach(function(key){return _params[formatI18nPlaceholderName(key)]=params[key]});var meta=metaFromI18nMessage(message),statements=function getTranslationDeclStmts(variable,closureVar,message,meta,params,transformFn){void 0===params&&(params={});var statements=[];return statements.push.apply(statements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(i18nTranslationToDeclStmt(variable,closureVar,message,meta,params))),transformFn&&statements.push(new ExpressionStatement(variable.set(transformFn(variable)))),statements}(_ref,closureVar,function getSerializedI18nContent(message){return message.nodes.map(function(node){return node.visit(serializerVisitor$1,null)}).join("")}(message),meta,_params,transformFn);return(_a=this.constantPool.statements).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(statements)),_ref},TemplateDefinitionBuilder.prototype.i18nAppendBindings=function(expressions){var _this=this;expressions.length>0&&expressions.forEach(function(expression){return _this.i18n.appendBinding(expression)})},TemplateDefinitionBuilder.prototype.i18nBindProps=function(props){var _this=this,bound={};return Object.keys(props).forEach(function(key){var prop=props[key];if(prop instanceof Text)bound[key]=literal(prop.value);else{var value=prop.value.visit(_this._valueConverter);if(_this.allocateBindingSlots(value),value instanceof Interpolation){var strings=value.strings,expressions=value.expressions,_a=_this.i18n,id=_a.id,label=function assembleI18nBoundString(strings,bindingStartIndex,contextId){if(void 0===bindingStartIndex&&(bindingStartIndex=0),void 0===contextId&&(contextId=0),!strings.length)return"";for(var acc="",lastIdx=strings.length-1,i=0;i<lastIdx;i++)acc+=""+strings[i]+wrapI18nPlaceholder(bindingStartIndex+i,contextId);return acc+=strings[lastIdx]}(strings,_a.bindings.size,id);_this.i18nAppendBindings(expressions),bound[key]=literal(label)}}}),bound},TemplateDefinitionBuilder.prototype.i18nGenerateClosureVar=function(messageId){var name,suffix=this.fileBasedI18nSuffix.toUpperCase();if(this.i18nUseExternalIds){var prefix=getTranslationConstPrefix("EXTERNAL_"),uniqueSuffix=this.constantPool.uniqueName(suffix);name=""+prefix+sanitizeIdentifier(messageId)+"$$"+uniqueSuffix}else{prefix=getTranslationConstPrefix(suffix);name=this.constantPool.uniqueName(prefix)}return variable(name)},TemplateDefinitionBuilder.prototype.i18nUpdateRef=function(context){var icus=context.icus,meta=context.meta,isRoot=context.isRoot,isResolved=context.isResolved,isEmitted=context.isEmitted;if(isRoot&&isResolved&&!isEmitted&&!isSingleI18nIcu(meta)){context.isEmitted=!0;var placeholders=context.getSerializedPlaceholders(),icuMapping_1={},params_1=placeholders.size?placeholdersToParams(placeholders):{};icus.size&&icus.forEach(function(refs,key){if(1===refs.length)params_1[key]=refs[0];else{var placeholder=wrapI18nPlaceholder("I18N_EXP_"+key);params_1[key]=literal(placeholder),icuMapping_1[key]=literalArr(refs)}});var transformFn=void 0;(Array.from(placeholders.values()).some(function(value){return value.length>1})||Object.keys(icuMapping_1).length)&&(transformFn=function(raw){var args=[raw];return Object.keys(icuMapping_1).length&&args.push(mapLiteral(icuMapping_1,!0)),instruction(null,Identifiers$1.i18nPostprocess,args)}),this.i18nTranslate(meta,params_1,context.ref,transformFn)}},TemplateDefinitionBuilder.prototype.i18nStart=function(span,meta,selfClosing){void 0===span&&(span=null);var index=this.allocateDataSlot();if(this.i18nContext)this.i18n=this.i18nContext.forkChildContext(index,this.templateIndex,meta);else{var ref_1=variable(this.constantPool.uniqueName("I18N_"));this.i18n=new I18nContext(index,ref_1,0,this.templateIndex,meta)}var _a=this.i18n,id=_a.id,ref=_a.ref,params=[literal(index),ref];id>0&&params.push(literal(id)),this.creationInstruction(span,selfClosing?Identifiers$1.i18n:Identifiers$1.i18nStart,params)},TemplateDefinitionBuilder.prototype.i18nEnd=function(span,selfClosing){var _this=this;if(void 0===span&&(span=null),!this.i18n)throw new Error("i18nEnd is executed with no i18n context present");this.i18nContext?(this.i18nContext.reconcileChildContext(this.i18n),this.i18nUpdateRef(this.i18nContext)):this.i18nUpdateRef(this.i18n);var _a=this.i18n,index=_a.index,bindings=_a.bindings;bindings.size&&(bindings.forEach(function(binding){_this.updateInstruction(index,span,Identifiers$1.i18nExp,function(){return[_this.convertPropertyBinding(binding)]})}),this.updateInstruction(index,span,Identifiers$1.i18nApply,[literal(index)])),selfClosing||this.creationInstruction(span,Identifiers$1.i18nEnd),this.i18n=null},TemplateDefinitionBuilder.prototype.visitContent=function(ngContent){var slot=this.allocateDataSlot(),projectionSlotIdx=this._ngContentSelectorsOffset+this._ngContentReservedSlots.length,parameters=[literal(slot)],attributes=[];this._ngContentReservedSlots.push(ngContent.selector),ngContent.attributes.forEach(function(attribute){var name=attribute.name,value=attribute.value;"ngProjectAs"===name?attributes.push.apply(attributes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(getNgProjectAsLiteral(attribute))):"select"!==name.toLowerCase()&&attributes.push(literal(name),literal(value))}),attributes.length>0?parameters.push(literal(projectionSlotIdx),literalArr(attributes)):0!==projectionSlotIdx&&parameters.push(literal(projectionSlotIdx)),this.creationInstruction(ngContent.sourceSpan,Identifiers$1.projection,parameters)},TemplateDefinitionBuilder.prototype.getNamespaceInstruction=function(namespaceKey){switch(namespaceKey){case"math":return Identifiers$1.namespaceMathML;case"svg":return Identifiers$1.namespaceSVG;default:return Identifiers$1.namespaceHTML}},TemplateDefinitionBuilder.prototype.addNamespaceInstruction=function(nsInstruction,element){this._namespace=nsInstruction,this.creationInstruction(element.sourceSpan,nsInstruction)},TemplateDefinitionBuilder.prototype.visitElement=function(element){var e_1,_a,_this=this,elementIndex=this.allocateDataSlot(),stylingBuilder=new StylingBuilder(literal(elementIndex),null),isNonBindableMode=!1,isI18nRootElement=isI18nRootNode(element.i18n)&&!isSingleI18nIcu(element.i18n);if(isI18nRootElement&&this.i18n)throw new Error("Could not mark an element as translatable inside of a translatable section");var i18nAttrs=[],outputAttrs=[],_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNsName(element.name),2),namespaceKey=_b[0],elementName=_b[1],isNgContainer$1=isNgContainer(element.name);try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(element.attributes),_d=_c.next();!_d.done;_d=_c.next()){var attr=_d.value,name_1=attr.name,value=attr.value;"ngNonBindable"===name_1?isNonBindableMode=!0:"style"===name_1?stylingBuilder.registerStyleAttr(value):"class"===name_1?stylingBuilder.registerClassAttr(value):(attr.i18n&&i18nAttrs.push(attr),outputAttrs.push(attr))}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_1)throw e_1.error}}this.matchDirectives(element.name,element);var parameters=[literal(elementIndex)];isNgContainer$1||parameters.push(literal(elementName));var attributes=[],allOtherInputs=[];element.inputs.forEach(function(input){stylingBuilder.registerBoundInput(input)||(0===input.type&&input.i18n&&i18nAttrs.push(input),allOtherInputs.push(input))}),outputAttrs.forEach(function(attr){"ngProjectAs"===attr.name?attributes.push.apply(attributes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(getNgProjectAsLiteral(attr))):attributes.push.apply(attributes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(getAttributeNameLiterals(attr.name),[literal(attr.value)]))}),attributes.push.apply(attributes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this.prepareNonRenderAttrs(allOtherInputs,element.outputs,stylingBuilder))),parameters.push(this.toAttrsParam(attributes)),parameters.push(this.prepareRefsParameter(element.references));var wasInNamespace=this._namespace,currentNamespace=this.getNamespaceInstruction(namespaceKey);currentNamespace!==wasInNamespace&&this.addNamespaceInstruction(currentNamespace,element),this.i18n&&this.i18n.appendElement(element.i18n,elementIndex);var createSelfClosingInstruction=!stylingBuilder.hasBindings&&!isNgContainer$1&&0===element.outputs.length&&0===i18nAttrs.length&&!(!isI18nRootElement&&_this.i18n?!hasTextChildrenOnly(element.children):element.children.length>0),createSelfClosingI18nInstruction=!createSelfClosingInstruction&&!stylingBuilder.hasBindings&&hasTextChildrenOnly(element.children);if(createSelfClosingInstruction)this.creationInstruction(element.sourceSpan,Identifiers$1.element,trimTrailingNulls(parameters));else{if(this.creationInstruction(element.sourceSpan,isNgContainer$1?Identifiers$1.elementContainerStart:Identifiers$1.elementStart,trimTrailingNulls(parameters)),isNonBindableMode&&this.creationInstruction(element.sourceSpan,Identifiers$1.disableBindings),i18nAttrs.length){var hasBindings_1=!1,i18nAttrArgs_1=[];if(i18nAttrs.forEach(function(attr){var message=attr.i18n;if(attr instanceof TextAttribute)i18nAttrArgs_1.push(literal(attr.name),_this.i18nTranslate(message));else{var converted=attr.value.visit(_this._valueConverter);if(_this.allocateBindingSlots(converted),converted instanceof Interpolation){var params=placeholdersToParams(assembleBoundTextPlaceholders(message));i18nAttrArgs_1.push(literal(attr.name),_this.i18nTranslate(message,params)),converted.expressions.forEach(function(expression){hasBindings_1=!0;var binding=_this.convertExpressionBinding(expression);_this.updateInstruction(elementIndex,element.sourceSpan,Identifiers$1.i18nExp,[binding])})}}}),i18nAttrArgs_1.length){var index=literal(this.allocateDataSlot()),args=this.constantPool.getConstLiteral(literalArr(i18nAttrArgs_1),!0);this.creationInstruction(element.sourceSpan,Identifiers$1.i18nAttributes,[index,args]),hasBindings_1&&this.updateInstruction(elementIndex,element.sourceSpan,Identifiers$1.i18nApply,[index])}}this.processStylingInstruction(stylingBuilder.buildElementStylingInstruction(element.sourceSpan,this.constantPool),!0),element.outputs.forEach(function(outputAst){_this.creationInstruction(outputAst.sourceSpan,Identifiers$1.listener,_this.prepareListenerParameter(element.name,outputAst,elementIndex))}),isI18nRootElement&&this.i18nStart(element.sourceSpan,element.i18n,createSelfClosingI18nInstruction)}stylingBuilder.buildUpdateLevelInstructions(this._valueConverter).forEach(function(instruction){_this._bindingSlots+=instruction.allocateBindingSlots,_this.processStylingInstruction(instruction,!1)});var emptyValueBindInstruction=literal(void 0);if(allOtherInputs.forEach(function(input){var inputType=input.type;if(4===inputType){var value_1=input.value.visit(_this._valueConverter),hasValue_1=!(value_1 instanceof LiteralPrimitive)||!!value_1.value;_this.allocateBindingSlots(value_1);var bindingName_1=prepareSyntheticPropertyName(input.name);_this.updateInstruction(elementIndex,input.sourceSpan,Identifiers$1.property,function(){return[literal(bindingName_1),hasValue_1?_this.convertPropertyBinding(value_1,!0):emptyValueBindInstruction]})}else{if(input.i18n)return;var value_2=input.value.visit(_this._valueConverter);if(void 0!==value_2){var instruction_1,params_2=[],_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNsName(input.name),2),attrNamespace=_a[0],attrName_1=_a[1],isAttributeBinding=1===inputType,sanitizationRef=resolveSanitizationFn(input.securityContext,isAttributeBinding);if(sanitizationRef&&params_2.push(sanitizationRef),attrNamespace){var namespaceLiteral=literal(attrNamespace);sanitizationRef?params_2.push(namespaceLiteral):params_2.push(literal(null),namespaceLiteral)}if(_this.allocateBindingSlots(value_2),0===inputType)value_2 instanceof Interpolation?_this.updateInstruction(elementIndex,input.sourceSpan,function getPropertyInterpolationExpression(interpolation){switch(function getInterpolationArgsLength(interpolation){var expressions=interpolation.expressions,strings=interpolation.strings;return 1===expressions.length&&2===strings.length&&""===strings[0]&&""===strings[1]?1:expressions.length+strings.length}(interpolation)){case 1:return Identifiers$1.propertyInterpolate;case 3:return Identifiers$1.propertyInterpolate1;case 5:return Identifiers$1.propertyInterpolate2;case 7:return Identifiers$1.propertyInterpolate3;case 9:return Identifiers$1.propertyInterpolate4;case 11:return Identifiers$1.propertyInterpolate5;case 13:return Identifiers$1.propertyInterpolate6;case 15:return Identifiers$1.propertyInterpolate7;case 17:return Identifiers$1.propertyInterpolate8;default:return Identifiers$1.propertyInterpolateV}}(value_2),function(){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([literal(attrName_1)],_this.getUpdateInstructionArguments(value_2),params_2)}):_this.updateInstruction(elementIndex,input.sourceSpan,Identifiers$1.property,function(){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([literal(attrName_1),_this.convertPropertyBinding(value_2,!0)],params_2)});else instruction_1=2===inputType?Identifiers$1.elementClassProp:Identifiers$1.elementAttribute,_this.updateInstruction(elementIndex,input.sourceSpan,instruction_1,function(){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([literal(elementIndex),literal(attrName_1),_this.convertPropertyBinding(value_2)],params_2)})}}}),visitAll(this,element.children),!isI18nRootElement&&this.i18n&&this.i18n.appendElement(element.i18n,elementIndex,!0),!createSelfClosingInstruction){var span=element.endSourceSpan||element.sourceSpan;isI18nRootElement&&this.i18nEnd(span,createSelfClosingI18nInstruction),isNonBindableMode&&this.creationInstruction(span,Identifiers$1.enableBindings),this.creationInstruction(span,isNgContainer$1?Identifiers$1.elementContainerEnd:Identifiers$1.elementEnd)}},TemplateDefinitionBuilder.prototype.visitTemplate=function(template){var _this=this,templateIndex=this.allocateDataSlot();this.i18n&&this.i18n.appendTemplate(template.i18n,templateIndex);var tagName=sanitizeIdentifier(template.tagName||""),contextName=this.contextName+(tagName?"_"+tagName:"")+"_"+templateIndex,templateName=contextName+"_Template",parameters=[literal(templateIndex),variable(templateName),literal(template.tagName?splitNsName(template.tagName)[1]:template.tagName)];this.matchDirectives("ng-template",template);var attrsExprs=[];template.attributes.forEach(function(a){attrsExprs.push(asLiteral(a.name),asLiteral(a.value))}),attrsExprs.push.apply(attrsExprs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this.prepareNonRenderAttrs(template.inputs,template.outputs,void 0,template.templateAttrs))),parameters.push(this.toAttrsParam(attrsExprs)),template.references&&template.references.length&&(parameters.push(this.prepareRefsParameter(template.references)),parameters.push(importExpr(Identifiers$1.templateRefExtractor)));var templateVisitor=new TemplateDefinitionBuilder(this.constantPool,this._bindingScope,this.level+1,contextName,this.i18n,templateIndex,templateName,this.directiveMatcher,this.directives,this.pipeTypeByName,this.pipes,this._namespace,this.fileBasedI18nSuffix,this.i18nUseExternalIds);this._nestedTemplateFns.push(function(){var _a,templateFunctionExpr=templateVisitor.buildTemplateFunction(template.children,template.variables,_this._ngContentReservedSlots.length+_this._ngContentSelectorsOffset,template.i18n);_this.constantPool.statements.push(templateFunctionExpr.toDeclStmt(templateName,null)),templateVisitor._ngContentReservedSlots.length&&(_a=_this._ngContentReservedSlots).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(templateVisitor._ngContentReservedSlots))}),this.creationInstruction(template.sourceSpan,Identifiers$1.templateCreate,function(){return parameters.splice(2,0,literal(templateVisitor.getConstCount()),literal(templateVisitor.getVarCount())),trimTrailingNulls(parameters)}),this.templatePropertyBindings(template,templateIndex,template.templateAttrs),"ng-template"===template.tagName&&(this.templatePropertyBindings(template,templateIndex,template.inputs),template.outputs.forEach(function(outputAst){_this.creationInstruction(outputAst.sourceSpan,Identifiers$1.listener,_this.prepareListenerParameter("ng_template",outputAst,templateIndex))}))},TemplateDefinitionBuilder.prototype.visitBoundText=function(text){var _this=this;if(this.i18n){var value_3=text.value.visit(this._valueConverter);return this.allocateBindingSlots(value_3),void(value_3 instanceof Interpolation&&(this.i18n.appendBoundText(text.i18n),this.i18nAppendBindings(value_3.expressions)))}var nodeIndex=this.allocateDataSlot();this.creationInstruction(text.sourceSpan,Identifiers$1.text,[literal(nodeIndex)]);var value=text.value.visit(this._valueConverter);this.allocateBindingSlots(value),this.updateInstruction(nodeIndex,text.sourceSpan,Identifiers$1.textBinding,function(){return[literal(nodeIndex),_this.convertPropertyBinding(value)]})},TemplateDefinitionBuilder.prototype.visitText=function(text){this.i18n||this.creationInstruction(text.sourceSpan,Identifiers$1.text,[literal(this.allocateDataSlot()),literal(text.value)])},TemplateDefinitionBuilder.prototype.visitIcu=function(icu){var initWasInvoked=!1;this.i18n||(initWasInvoked=!0,this.i18nStart(null,icu.i18n,!0));var i18n=this.i18n,vars=this.i18nBindProps(icu.vars),placeholders=this.i18nBindProps(icu.placeholders),message=icu.i18n,transformFn=function(raw){return instruction(null,Identifiers$1.i18nPostprocess,[raw,mapLiteral(vars,!0)])};if(isSingleI18nIcu(i18n.meta))this.i18nTranslate(message,placeholders,i18n.ref,transformFn);else{var ref=this.i18nTranslate(message,placeholders,void 0,transformFn);i18n.appendIcu(icuFromI18nMessage(message).name,ref)}return initWasInvoked&&this.i18nEnd(null,!0),null},TemplateDefinitionBuilder.prototype.allocateDataSlot=function(){return this._dataIndex++},TemplateDefinitionBuilder.prototype.getConstCount=function(){return this._dataIndex},TemplateDefinitionBuilder.prototype.getVarCount=function(){return this._pureFunctionSlots},TemplateDefinitionBuilder.prototype.getNgContentSelectors=function(){return this._ngContentReservedSlots.length?this.constantPool.getConstLiteral(asLiteral(this._ngContentReservedSlots),!0):null},TemplateDefinitionBuilder.prototype.bindingContext=function(){return""+this._bindingContext++},TemplateDefinitionBuilder.prototype.templatePropertyBindings=function(template,templateIndex,attrs){var _this=this;attrs.forEach(function(input){if(input instanceof BoundAttribute){var value_4=input.value.visit(_this._valueConverter);_this.allocateBindingSlots(value_4),_this.updateInstruction(templateIndex,template.sourceSpan,Identifiers$1.property,function(){return[literal(input.name),_this.convertPropertyBinding(value_4,!0)]})}})},TemplateDefinitionBuilder.prototype.instructionFn=function(fns,span,reference,paramsOrFn,prepend){void 0===prepend&&(prepend=!1),fns[prepend?"unshift":"push"](function(){var params=Array.isArray(paramsOrFn)?paramsOrFn:paramsOrFn();return instruction(span,reference,params).toStmt()})},TemplateDefinitionBuilder.prototype.processStylingInstruction=function(instruction,createMode){var _this=this;if(instruction){var paramsFn=function(){return instruction.buildParams(function(value){return _this.convertPropertyBinding(value,!0)})};createMode?this.creationInstruction(instruction.sourceSpan,instruction.reference,paramsFn):this.updateInstruction(-1,instruction.sourceSpan,instruction.reference,paramsFn)}},TemplateDefinitionBuilder.prototype.creationInstruction=function(span,reference,paramsOrFn,prepend){this.instructionFn(this._creationCodeFns,span,reference,paramsOrFn||[],prepend)},TemplateDefinitionBuilder.prototype.updateInstruction=function(nodeIndex,span,reference,paramsOrFn){this._lastNodeIndexWithFlush<nodeIndex&&(this.instructionFn(this._updateCodeFns,span,Identifiers$1.select,[literal(nodeIndex)]),this._lastNodeIndexWithFlush=nodeIndex),this.instructionFn(this._updateCodeFns,span,reference,paramsOrFn||[])},TemplateDefinitionBuilder.prototype.allocatePureFunctionSlots=function(numSlots){var originalSlots=this._pureFunctionSlots;return this._pureFunctionSlots+=numSlots,originalSlots},TemplateDefinitionBuilder.prototype.allocateBindingSlots=function(value){this._bindingSlots+=value instanceof Interpolation?value.expressions.length:1},TemplateDefinitionBuilder.prototype.getImplicitReceiverExpr=function(){return this._implicitReceiverExpr?this._implicitReceiverExpr:this._implicitReceiverExpr=0===this.level?variable(CONTEXT_NAME):this._bindingScope.getOrCreateSharedContextVar(0)},TemplateDefinitionBuilder.prototype.convertExpressionBinding=function(value){var valExpr=convertPropertyBinding(this,this.getImplicitReceiverExpr(),value,this.bindingContext(),BindingForm.TrySimple).currValExpr;return importExpr(Identifiers$1.bind).callFn([valExpr])},TemplateDefinitionBuilder.prototype.convertPropertyBinding=function(value,skipBindFn){var _a,interpolationFn=value instanceof Interpolation?interpolate:function(){return error("Unexpected interpolation")},convertedPropertyBinding=convertPropertyBinding(this,this.getImplicitReceiverExpr(),value,this.bindingContext(),BindingForm.TrySimple,interpolationFn),valExpr=convertedPropertyBinding.currValExpr;return(_a=this._tempVariables).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(convertedPropertyBinding.stmts)),value instanceof Interpolation||skipBindFn?valExpr:importExpr(Identifiers$1.bind).callFn([valExpr])},TemplateDefinitionBuilder.prototype.getUpdateInstructionArguments=function(value){var _a,_b=function convertUpdateArguments(localResolver,contextVariableExpression,expressionWithArgumentsToExtract,bindingId){var visitor=new _AstToIrVisitor(localResolver,contextVariableExpression,bindingId,void 0),outputExpr=expressionWithArgumentsToExtract.visit(visitor,_Mode.Expression);visitor.usesImplicitReceiver&&localResolver.notifyImplicitReceiverUse();var stmts=getStatementsFromVisitor(visitor,bindingId),args=outputExpr.args.slice(1);if(expressionWithArgumentsToExtract instanceof Interpolation){var strings=expressionWithArgumentsToExtract.strings;3===args.length&&""===strings[0]&&""===strings[1]?args=[args[1]]:args.length>=19&&(args=[literalArr(args)])}return{stmts:stmts,args:args}}(this,this.getImplicitReceiverExpr(),value,this.bindingContext()),args=_b.args,stmts=_b.stmts;return(_a=this._tempVariables).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(stmts)),args},TemplateDefinitionBuilder.prototype.matchDirectives=function(tagName,elOrTpl){var _this=this;if(this.directiveMatcher){var selector=function createCssSelector(tag,attributes){var cssSelector=new CssSelector;return cssSelector.setElement(tag),Object.getOwnPropertyNames(attributes).forEach(function(name){var value=attributes[name];(cssSelector.addAttribute(name,value),"class"===name.toLowerCase())&&value.trim().split(/\s+/).forEach(function(className){return cssSelector.addClassName(className)})}),cssSelector}(tagName,getAttrsForDirectiveMatching(elOrTpl));this.directiveMatcher.match(selector,function(cssSelector,staticType){_this.directives.add(staticType)})}},TemplateDefinitionBuilder.prototype.prepareNonRenderAttrs=function(inputs,outputs,styles,templateAttrs){void 0===templateAttrs&&(templateAttrs=[]);var alreadySeen=new Set,attrExprs=[];function addAttrExpr(key,value){"string"==typeof key?alreadySeen.has(key)||(attrExprs.push.apply(attrExprs,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(getAttributeNameLiterals(key))),void 0!==value&&attrExprs.push(value),alreadySeen.add(key)):attrExprs.push(literal(key))}if(styles&&styles.populateInitialStylingAttrs(attrExprs),inputs.length||outputs.length){for(var attrsStartIndex=attrExprs.length,i=0;i<inputs.length;i++){var input=inputs[i];4!==input.type&&addAttrExpr(input.name)}for(i=0;i<outputs.length;i++){var output=outputs[i];1!==output.type&&addAttrExpr(output.name)}attrExprs.length&&attrExprs.splice(attrsStartIndex,0,literal(3))}return templateAttrs.length&&(attrExprs.push(literal(4)),templateAttrs.forEach(function(attr){return addAttrExpr(attr.name)})),attrExprs},TemplateDefinitionBuilder.prototype.toAttrsParam=function(attrsExprs){return attrsExprs.length>0?this.constantPool.getConstLiteral(literalArr(attrsExprs),!0):TYPED_NULL_EXPR},TemplateDefinitionBuilder.prototype.prepareRefsParameter=function(references){var _this=this;if(!references||0===references.length)return TYPED_NULL_EXPR;var refsParam=flatten(references.map(function(reference){var slot=_this.allocateDataSlot(),variableName=_this._bindingScope.freshReferenceName(),retrievalLevel=_this.level,lhs=variable(variableName);return _this._bindingScope.set(retrievalLevel,reference.name,lhs,0,function(scope,relativeLevel){var nextContextStmt=relativeLevel>0?[generateNextContextExpr(relativeLevel).toStmt()]:[],refExpr=lhs.set(importExpr(Identifiers$1.reference).callFn([literal(slot)]));return nextContextStmt.concat(refExpr.toConstDecl())},!0),[reference.name,reference.value]}));return this.constantPool.getConstLiteral(asLiteral(refsParam),!0)},TemplateDefinitionBuilder.prototype.prepareListenerParameter=function(tagName,outputAst,index){var _this=this;return function(){var eventName=outputAst.name,bindingFnName=1===outputAst.type?prepareSyntheticListenerFunctionName(eventName,outputAst.phase):sanitizeIdentifier(eventName),handlerName=_this.templateName+"_"+tagName+"_"+bindingFnName+"_"+index+"_listener",scope=_this._bindingScope.nestedScope(_this._bindingScope.bindingLevel);return prepareEventListenerParameters(outputAst,handlerName,scope)}},TemplateDefinitionBuilder}(),ValueConverter=function(_super){function ValueConverter(constantPool,allocateSlot,allocatePureFunctionSlots,definePipe){var _this=_super.call(this)||this;return _this.constantPool=constantPool,_this.allocateSlot=allocateSlot,_this.allocatePureFunctionSlots=allocatePureFunctionSlots,_this.definePipe=definePipe,_this._pipeBindExprs=[],_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ValueConverter,_super),ValueConverter.prototype.visitPipe=function(pipe,context){var slot=this.allocateSlot(),slotPseudoLocal="PIPE:"+slot,pureFunctionSlot=this.allocatePureFunctionSlots(2+pipe.args.length),target=new PropertyRead(pipe.span,new ImplicitReceiver(pipe.span),slotPseudoLocal),_a=function pipeBindingCallInfo(args){var identifier=pipeBindingIdentifiers[args.length];return{identifier:identifier||Identifiers$1.pipeBindV,isVarLength:!identifier}}(pipe.args),identifier=_a.identifier,isVarLength=_a.isVarLength;this.definePipe(pipe.name,slotPseudoLocal,slot,importExpr(identifier));var args=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([pipe.exp],pipe.args),convertedArgs=isVarLength?this.visitAll([new LiteralArray(pipe.span,args)]):this.visitAll(args),pipeBindExpr=new FunctionCall(pipe.span,target,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new LiteralPrimitive(pipe.span,slot),new LiteralPrimitive(pipe.span,pureFunctionSlot)],convertedArgs));return this._pipeBindExprs.push(pipeBindExpr),pipeBindExpr},ValueConverter.prototype.updatePipeSlotOffsets=function(bindingSlots){this._pipeBindExprs.forEach(function(pipe){pipe.args[1].value+=bindingSlots})},ValueConverter.prototype.visitLiteralArray=function(array,context){var _this=this;return new BuiltinFunctionCall(array.span,this.visitAll(array.expressions),function(values){var literal=literalArr(values);return values.every(function(a){return a.isConstant()})?_this.constantPool.getConstLiteral(literal,!0):getLiteralFactory(_this.constantPool,literal,_this.allocatePureFunctionSlots)})},ValueConverter.prototype.visitLiteralMap=function(map,context){var _this=this;return new BuiltinFunctionCall(map.span,this.visitAll(map.values),function(values){var literal=literalMap(values.map(function(value,index){return{key:map.keys[index].key,value:value,quoted:map.keys[index].quoted}}));return values.every(function(a){return a.isConstant()})?_this.constantPool.getConstLiteral(literal,!0):getLiteralFactory(_this.constantPool,literal,_this.allocatePureFunctionSlots)})},ValueConverter}(AstMemoryEfficientTransformer),pipeBindingIdentifiers=[Identifiers$1.pipeBind1,Identifiers$1.pipeBind2,Identifiers$1.pipeBind3,Identifiers$1.pipeBind4];var pureFunctionIdentifiers=[Identifiers$1.pureFunction0,Identifiers$1.pureFunction1,Identifiers$1.pureFunction2,Identifiers$1.pureFunction3,Identifiers$1.pureFunction4,Identifiers$1.pureFunction5,Identifiers$1.pureFunction6,Identifiers$1.pureFunction7,Identifiers$1.pureFunction8];function instruction(span,reference,params){return importExpr(reference,null,span).callFn(params,span)}function generateNextContextExpr(relativeLevelDiff){return importExpr(Identifiers$1.nextContext).callFn(relativeLevelDiff>1?[literal(relativeLevelDiff)]:[])}function getLiteralFactory(constantPool,literal$1,allocateSlots){var _a=constantPool.getLiteralFactory(literal$1),literalFactory=_a.literalFactory,literalFactoryArguments=_a.literalFactoryArguments,startSlot=allocateSlots(1+literalFactoryArguments.length);literalFactoryArguments.length>0||error("Expected arguments to a literal factory function");var _b=function pureFunctionCallInfo(args){var identifier=pureFunctionIdentifiers[args.length];return{identifier:identifier||Identifiers$1.pureFunctionV,isVarLength:!identifier}}(literalFactoryArguments),identifier=_b.identifier,isVarLength=_b.isVarLength,args=[literal(startSlot),literalFactory];return isVarLength?args.push(literalArr(literalFactoryArguments)):args.push.apply(args,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(literalFactoryArguments)),importExpr(identifier).callFn(args)}function getAttributeNameLiterals(name){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(splitNsName(name),2),attributeNamespace=_a[0],nameLiteral=literal(_a[1]);return attributeNamespace?[literal(0),literal(attributeNamespace),nameLiteral]:[nameLiteral]}var BindingScope=function(){function BindingScope(bindingLevel,parent){void 0===bindingLevel&&(bindingLevel=0),void 0===parent&&(parent=null),this.bindingLevel=bindingLevel,this.parent=parent,this.map=new Map,this.referenceNameIndex=0,this.restoreViewVariable=null}return Object.defineProperty(BindingScope,"ROOT_SCOPE",{get:function(){return BindingScope._ROOT_SCOPE||(BindingScope._ROOT_SCOPE=(new BindingScope).set(0,"$event",variable("$event"))),BindingScope._ROOT_SCOPE},enumerable:!0,configurable:!0}),BindingScope.prototype.get=function(name){for(var current=this;current;){var value=current.map.get(name);if(null!=value)return current!==this&&(value={retrievalLevel:value.retrievalLevel,lhs:value.lhs,declareLocalCallback:value.declareLocalCallback,declare:!1,priority:value.priority,localRef:value.localRef},this.map.set(name,value),this.maybeGenerateSharedContextVar(value),this.maybeRestoreView(value.retrievalLevel,value.localRef)),value.declareLocalCallback&&!value.declare&&(value.declare=!0),value.lhs;current=current.parent}return 0===this.bindingLevel?null:this.getComponentProperty(name)},BindingScope.prototype.set=function(retrievalLevel,name,lhs,priority,declareLocalCallback,localRef){if(void 0===priority&&(priority=0),this.map.has(name)){if(localRef)return this;error("The name "+name+" is already defined in scope to be "+this.map.get(name))}return this.map.set(name,{retrievalLevel:retrievalLevel,lhs:lhs,declare:!1,declareLocalCallback:declareLocalCallback,priority:priority,localRef:localRef||!1}),this},BindingScope.prototype.getLocal=function(name){return this.get(name)},BindingScope.prototype.notifyImplicitReceiverUse=function(){0!==this.bindingLevel&&(this.map.get("$$shared_ctx$$0").declare=!0)},BindingScope.prototype.nestedScope=function(level){var newScope=new BindingScope(level,this);return level>0&&newScope.generateSharedContextVar(0),newScope},BindingScope.prototype.getOrCreateSharedContextVar=function(retrievalLevel){var bindingKey="$$shared_ctx$$"+retrievalLevel;return this.map.has(bindingKey)||this.generateSharedContextVar(retrievalLevel),this.map.get(bindingKey).lhs},BindingScope.prototype.getSharedContextName=function(retrievalLevel){var sharedCtxObj=this.map.get("$$shared_ctx$$"+retrievalLevel);return sharedCtxObj&&sharedCtxObj.declare?sharedCtxObj.lhs:null},BindingScope.prototype.maybeGenerateSharedContextVar=function(value){if(1===value.priority&&value.retrievalLevel<this.bindingLevel){var sharedCtxObj=this.map.get("$$shared_ctx$$"+value.retrievalLevel);sharedCtxObj?sharedCtxObj.declare=!0:this.generateSharedContextVar(value.retrievalLevel)}},BindingScope.prototype.generateSharedContextVar=function(retrievalLevel){var lhs=variable(CONTEXT_NAME+this.freshReferenceName());this.map.set("$$shared_ctx$$"+retrievalLevel,{retrievalLevel:retrievalLevel,lhs:lhs,declareLocalCallback:function(scope,relativeLevel){return[lhs.set(generateNextContextExpr(relativeLevel)).toConstDecl()]},declare:!1,priority:2,localRef:!1})},BindingScope.prototype.getComponentProperty=function(name){var componentValue=this.map.get("$$shared_ctx$$0");return componentValue.declare=!0,this.maybeRestoreView(0,!1),componentValue.lhs.prop(name)},BindingScope.prototype.maybeRestoreView=function(retrievalLevel,localRefLookup){this.isListenerScope()&&(retrievalLevel<this.bindingLevel||localRefLookup)&&(this.parent.restoreViewVariable||(this.parent.restoreViewVariable=variable(this.parent.freshReferenceName())),this.restoreViewVariable=this.parent.restoreViewVariable)},BindingScope.prototype.restoreViewStatement=function(){return this.restoreViewVariable?[instruction(null,Identifiers$1.restoreView,[this.restoreViewVariable]).toStmt()]:[]},BindingScope.prototype.viewSnapshotStatements=function(){var getCurrentViewInstruction=instruction(null,Identifiers$1.getCurrentView,[]);return this.restoreViewVariable?[this.restoreViewVariable.set(getCurrentViewInstruction).toConstDecl()]:[]},BindingScope.prototype.isListenerScope=function(){return this.parent&&this.parent.bindingLevel===this.bindingLevel},BindingScope.prototype.variableDeclarations=function(){var _this=this,currentContextLevel=0;return Array.from(this.map.values()).filter(function(value){return value.declare}).sort(function(a,b){return b.retrievalLevel-a.retrievalLevel||b.priority-a.priority}).reduce(function(stmts,value){var levelDiff=_this.bindingLevel-value.retrievalLevel,currStmts=value.declareLocalCallback(_this,levelDiff-currentContextLevel);return currentContextLevel=levelDiff,stmts.concat(currStmts)},[])},BindingScope.prototype.freshReferenceName=function(){for(var current=this;current.parent;)current=current.parent;return"_r"+current.referenceNameIndex++},BindingScope}();function getNgProjectAsLiteral(attribute){var parsedR3Selector=parseSelectorToR3Selector(attribute.value)[0];return[literal(5),asLiteral(parsedR3Selector)]}function interpolate(args){switch((args=args.slice(1)).length){case 3:return importExpr(Identifiers$1.interpolation1).callFn(args);case 5:return importExpr(Identifiers$1.interpolation2).callFn(args);case 7:return importExpr(Identifiers$1.interpolation3).callFn(args);case 9:return importExpr(Identifiers$1.interpolation4).callFn(args);case 11:return importExpr(Identifiers$1.interpolation5).callFn(args);case 13:return importExpr(Identifiers$1.interpolation6).callFn(args);case 15:return importExpr(Identifiers$1.interpolation7).callFn(args);case 17:return importExpr(Identifiers$1.interpolation8).callFn(args)}return args.length>=19&&args.length%2==1||error("Invalid interpolation argument length "+args.length),importExpr(Identifiers$1.interpolationV).callFn([literalArr(args)])}function makeBindingParser(interpolationConfig){return void 0===interpolationConfig&&(interpolationConfig=DEFAULT_INTERPOLATION_CONFIG),new BindingParser(new Parser$1(new Lexer),interpolationConfig,new DomElementSchemaRegistry,null,[])}function resolveSanitizationFn(context,isAttribute){switch(context){case SecurityContext.HTML:return importExpr(Identifiers$1.sanitizeHtml);case SecurityContext.SCRIPT:return importExpr(Identifiers$1.sanitizeScript);case SecurityContext.STYLE:return isAttribute?importExpr(Identifiers$1.sanitizeStyle):null;case SecurityContext.URL:return importExpr(Identifiers$1.sanitizeUrl);case SecurityContext.RESOURCE_URL:return importExpr(Identifiers$1.sanitizeResourceUrl);default:return null}}function isTextNode(node){return node instanceof Text||node instanceof BoundText||node instanceof Icu}function hasTextChildrenOnly(children){return children.every(isTextNode)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var EMPTY_ARRAY=[],ATTR_REGEX=/attr\.([^\]]+)/;function baseDirectiveFields(meta,constantPool,bindingParser){var definitionMap=new DefinitionMap;definitionMap.set("type",meta.type),definitionMap.set("selectors",function createDirectiveSelector(selector){return asLiteral(parseSelectorToR3Selector(selector))}(meta.selector));var result=compileFactoryFunction({name:meta.name,type:meta.type,deps:meta.deps,injectFn:Identifiers$1.directiveInject});definitionMap.set("factory",result.factory),meta.queries.length>0&&definitionMap.set("contentQueries",createContentQueriesFunction(meta.queries,constantPool,meta.name)),meta.viewQueries.length&&definitionMap.set("viewQuery",createViewQueriesFunction(meta.viewQueries,constantPool,meta.name));var hostVarsCount=Object.keys(meta.host.properties).filter(function(name){var prefix=function getStylingPrefix(name){return name.substring(0,5)}(name);return"style"!==prefix&&"class"!==prefix}).length,elVarExp=variable("elIndex"),contextVarExp=variable(CONTEXT_NAME),styleBuilder=new StylingBuilder(elVarExp,contextVarExp),_a=meta.host.specialAttributes,styleAttr=_a.styleAttr,classAttr=_a.classAttr;return void 0!==styleAttr&&styleBuilder.registerStyleAttr(styleAttr),void 0!==classAttr&&styleBuilder.registerClassAttr(classAttr),definitionMap.set("hostBindings",function createHostBindingsFunction(meta,elVarExp,bindingContext,staticAttributesAndValues,styleBuilder,bindingParser,constantPool,hostVarsCount){var valueConverter,createStatements=[],updateStatements=[],totalHostVarsCount=hostVarsCount,hostBindingSourceSpan=meta.typeSourceSpan,directiveSummary=metadataAsSummary(meta),getValueConverter=function(){if(!valueConverter){valueConverter=new ValueConverter(constantPool,function(){return error("Unexpected node")},function(numSlots){var originalVarsCount=totalHostVarsCount;return totalHostVarsCount+=numSlots,originalVarsCount},function(){return error("Unexpected pipe")})}return valueConverter},eventBindings=bindingParser.createDirectiveHostEventAsts(directiveSummary,hostBindingSourceSpan);if(eventBindings&&eventBindings.length){var listeners=function createHostListeners(eventBindings,meta){return eventBindings.map(function(binding){var bindingName=binding.name&&sanitizeIdentifier(binding.name),bindingFnName=1===binding.type?prepareSyntheticListenerFunctionName(bindingName,binding.targetOrPhase):bindingName,handlerName=meta.name&&bindingName?meta.name+"_"+bindingFnName+"_HostBindingHandler":null,params=prepareEventListenerParameters(BoundEvent.fromParsedEvent(binding),handlerName);return importExpr(1==binding.type?Identifiers$1.componentHostSyntheticListener:Identifiers$1.listener).callFn(params).toStmt()})}(eventBindings,meta);createStatements.push.apply(createStatements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(listeners))}(bindingParser.createBoundHostProperties(directiveSummary,hostBindingSourceSpan)||[]).forEach(function(binding){var name=binding.name;if(!styleBuilder.registerInputBasedOnName(name,binding.expression,binding.sourceSpan)){var value=binding.expression.visit(getValueConverter()),bindingExpr=bindingFn(bindingContext,value),_a=function getBindingNameAndInstruction(binding){var instruction,bindingName=binding.name,attrMatches=bindingName.match(ATTR_REGEX);attrMatches?(bindingName=attrMatches[1],instruction=Identifiers$1.elementAttribute):binding.isAnimation?(bindingName=prepareSyntheticPropertyName(bindingName),instruction=Identifiers$1.componentHostSyntheticProperty):instruction=Identifiers$1.property;return{bindingName:bindingName,instruction:instruction,isAttribute:!!attrMatches}}(binding),bindingName=_a.bindingName,instruction=_a.instruction,isAttribute=_a.isAttribute,securityContexts=bindingParser.calcPossibleSecurityContexts(meta.selector||"",bindingName,isAttribute).filter(function(context){return context!==SecurityContext.NONE}),sanitizerFn=null;securityContexts.length&&(sanitizerFn=2===securityContexts.length&&securityContexts.indexOf(SecurityContext.URL)>-1&&securityContexts.indexOf(SecurityContext.RESOURCE_URL)>-1?importExpr(Identifiers$1.sanitizeUrlOrResourceUrl):resolveSanitizationFn(securityContexts[0],isAttribute));var instructionParams=instruction===Identifiers$1.property?[literal(bindingName),bindingExpr.currValExpr]:[elVarExp,literal(bindingName),importExpr(Identifiers$1.bind).callFn([bindingExpr.currValExpr])];sanitizerFn&&instructionParams.push(sanitizerFn),isAttribute||(sanitizerFn||instructionParams.push(literal(null)),instructionParams.push(literal(!0))),updateStatements.push.apply(updateStatements,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(bindingExpr.stmts)),updateStatements.push(importExpr(instruction).callFn(instructionParams).toStmt())}});var hostAttrs=function convertAttributesToExpressions(attributes){var e_2,_a,values=[];try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(Object.getOwnPropertyNames(attributes)),_c=_b.next();!_c.done;_c=_b.next()){var key=_c.value,value=attributes[key];values.push(literal(key),value)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}return values}(staticAttributesAndValues),hostInstruction=styleBuilder.buildHostAttrsInstruction(null,hostAttrs,constantPool);hostInstruction&&createStatements.push(createStylingStmt(hostInstruction,bindingContext,bindingFn));if(styleBuilder.hasBindings){var elementStylingInstruction=styleBuilder.buildElementStylingInstruction(null,constantPool);elementStylingInstruction&&createStatements.push(createStylingStmt(elementStylingInstruction,bindingContext,bindingFn)),styleBuilder.buildUpdateLevelInstructions(getValueConverter()).forEach(function(instruction){updateStatements.push(createStylingStmt(instruction,bindingContext,bindingFn))})}totalHostVarsCount&&createStatements.unshift(importExpr(Identifiers$1.allocHostVars).callFn([literal(totalHostVarsCount)]).toStmt());if(createStatements.length>0||updateStatements.length>0){var hostBindingsFnName=meta.name?meta.name+"_HostBindings":null,statements=[];return createStatements.length>0&&statements.push(renderFlagCheckIfStmt(1,createStatements)),updateStatements.length>0&&statements.push(renderFlagCheckIfStmt(2,updateStatements)),fn([new FnParam(RENDER_FLAGS,NUMBER_TYPE),new FnParam(CONTEXT_NAME,null),new FnParam(elVarExp.name,NUMBER_TYPE)],statements,INFERRED_TYPE,null,hostBindingsFnName)}return null}(meta,elVarExp,contextVarExp,meta.host.attributes,styleBuilder,bindingParser,constantPool,hostVarsCount)),definitionMap.set("inputs",conditionallyCreateMapObjectLiteral(meta.inputs,!0)),definitionMap.set("outputs",conditionallyCreateMapObjectLiteral(meta.outputs)),null!==meta.exportAs&&definitionMap.set("exportAs",literalArr(meta.exportAs.map(function(e){return literal(e)}))),{definitionMap:definitionMap,statements:result.statements}}function addFeatures(definitionMap,meta){var features=[],providers=meta.providers,viewProviders=meta.viewProviders;if(providers||viewProviders){var args=[providers||new LiteralArrayExpr([])];viewProviders&&args.push(viewProviders),features.push(importExpr(Identifiers$1.ProvidersFeature).callFn(args))}meta.usesInheritance&&features.push(importExpr(Identifiers$1.InheritDefinitionFeature)),meta.lifecycle.usesOnChanges&&features.push(importExpr(Identifiers$1.NgOnChangesFeature).callFn(EMPTY_ARRAY)),features.length&&definitionMap.set("features",literalArr(features))}function compileDirectiveFromMetadata(meta,constantPool,bindingParser){var _a=baseDirectiveFields(meta,constantPool,bindingParser),definitionMap=_a.definitionMap,statements=_a.statements;addFeatures(definitionMap,meta);var expression=importExpr(Identifiers$1.defineDirective).callFn([definitionMap.toLiteralMap()]);if(!meta.selector)throw new Error("Directive "+meta.name+" has no selector, please add it!");return{expression:expression,type:createTypeForDef(meta,Identifiers$1.DirectiveDefWithMeta),statements:statements}}function compileComponentFromMetadata(meta,constantPool,bindingParser){var e_1,_a,_b=baseDirectiveFields(meta,constantPool,bindingParser),definitionMap=_b.definitionMap,statements=_b.statements;addFeatures(definitionMap,meta);var selector=meta.selector&&CssSelector.parse(meta.selector),firstSelector=selector&&selector[0];if(firstSelector){var selectorAttributes=firstSelector.getAttrs();selectorAttributes.length&&definitionMap.set("attrs",constantPool.getConstLiteral(literalArr(selectorAttributes.map(function(value){return literal(null!=value?value:void 0)})),!0))}var directiveMatcher=null;if(meta.directives.length>0){var matcher=new SelectorMatcher;try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(meta.directives),_d=_c.next();!_d.done;_d=_c.next()){var _e=_d.value,selector_1=_e.selector,expression_1=_e.expression;matcher.addSelectables(CssSelector.parse(selector_1),expression_1)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_1)throw e_1.error}}directiveMatcher=matcher}var templateTypeName=meta.name,templateName=templateTypeName?templateTypeName+"_Template":null,directivesUsed=new Set,pipesUsed=new Set,changeDetection=meta.changeDetection,template=meta.template,templateBuilder=new TemplateDefinitionBuilder(constantPool,BindingScope.ROOT_SCOPE,0,templateTypeName,null,null,templateName,directiveMatcher,directivesUsed,meta.pipes,pipesUsed,Identifiers$1.namespaceHTML,meta.relativeContextFilePath,meta.i18nUseExternalIds),templateFunctionExpression=templateBuilder.buildTemplateFunction(template.nodes,[]),ngContentSelectors=templateBuilder.getNgContentSelectors();if(ngContentSelectors&&definitionMap.set("ngContentSelectors",ngContentSelectors),definitionMap.set("consts",literal(templateBuilder.getConstCount())),definitionMap.set("vars",literal(templateBuilder.getVarCount())),definitionMap.set("template",templateFunctionExpression),directivesUsed.size){var directivesExpr=literalArr(Array.from(directivesUsed));meta.wrapDirectivesAndPipesInClosure&&(directivesExpr=fn([],[new ReturnStatement(directivesExpr)])),definitionMap.set("directives",directivesExpr)}if(pipesUsed.size){var pipesExpr=literalArr(Array.from(pipesUsed));meta.wrapDirectivesAndPipesInClosure&&(pipesExpr=fn([],[new ReturnStatement(pipesExpr)])),definitionMap.set("pipes",pipesExpr)}if(null===meta.encapsulation&&(meta.encapsulation=ViewEncapsulation.Emulated),meta.styles&&meta.styles.length){var strings=(meta.encapsulation==ViewEncapsulation.Emulated?function compileStyles(styles,selector,hostSelector){var shadowCss=new ShadowCss;return styles.map(function(style){return shadowCss.shimCssText(style,selector,hostSelector)})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(meta.styles,CONTENT_ATTR,HOST_ATTR):meta.styles).map(function(str){return literal(str)});definitionMap.set("styles",literalArr(strings))}else meta.encapsulation===ViewEncapsulation.Emulated&&(meta.encapsulation=ViewEncapsulation.None);meta.encapsulation!==ViewEncapsulation.Emulated&&definitionMap.set("encapsulation",literal(meta.encapsulation)),null!==meta.animations&&definitionMap.set("data",literalMap([{key:"animation",value:meta.animations,quoted:!1}])),null!=changeDetection&&changeDetection!==ChangeDetectionStrategy.Default&&definitionMap.set("changeDetection",literal(changeDetection));(meta.selector||"").replace(/\n/g,"");return{expression:importExpr(Identifiers$1.defineComponent).callFn([definitionMap.toLiteralMap()]),type:createTypeForDef(meta,Identifiers$1.ComponentDefWithMeta),statements:statements}}function directiveMetadataFromGlobalMetadata(directive,outputCtx,reflector){throw new Error("unsupported")}function queriesFromGlobalMetadata(queries,outputCtx){return queries.map(function(query){var read=null;return query.read&&query.read.identifier&&(read=outputCtx.importExpr(query.read.identifier.reference)),{propertyName:query.propertyName,first:query.first,predicate:selectorsFromGlobalMetadata(query.selectors,outputCtx),descendants:query.descendants,read:read,static:!!query.static}})}function selectorsFromGlobalMetadata(selectors,outputCtx){if(selectors.length>1||1==selectors.length&&selectors[0].value){var selectorStrings=selectors.map(function(value){return value.value});return selectorStrings.some(function(value){return!value})&&error("Found a type among the string selectors expected"),outputCtx.constantPool.getConstLiteral(literalArr(selectorStrings.map(function(value){return literal(value)})))}if(1==selectors.length){var first=selectors[0];if(first.identifier)return outputCtx.importExpr(first.identifier.reference)}return error("Unexpected query form"),NULL_EXPR}function prepareQueryParams(query,constantPool){return[getQueryPredicate(query,constantPool),literal(query.descendants),query.read||literal(null)]}function createContentQueriesFunction(queries,constantPool,name){var e_3,_a,createStatements=[],updateStatements=[],tempAllocator=temporaryAllocator(updateStatements,TEMPORARY_NAME);try{for(var queries_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(queries),queries_1_1=queries_1.next();!queries_1_1.done;queries_1_1=queries_1.next()){var query=queries_1_1.value,args=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([variable("dirIndex")],prepareQueryParams(query,constantPool)),queryInstruction=query.static?Identifiers$1.staticContentQuery:Identifiers$1.contentQuery;createStatements.push(importExpr(queryInstruction).callFn(args).toStmt());var temporary=tempAllocator(),getQueryList=importExpr(Identifiers$1.loadContentQuery).callFn([]),refresh=importExpr(Identifiers$1.queryRefresh).callFn([temporary.set(getQueryList)]),updateDirective=variable(CONTEXT_NAME).prop(query.propertyName).set(query.first?temporary.prop("first"):temporary);updateStatements.push(refresh.and(updateDirective).toStmt())}}catch(e_3_1){e_3={error:e_3_1}}finally{try{queries_1_1&&!queries_1_1.done&&(_a=queries_1.return)&&_a.call(queries_1)}finally{if(e_3)throw e_3.error}}var contentQueriesFnName=name?name+"_ContentQueries":null;return fn([new FnParam(RENDER_FLAGS,NUMBER_TYPE),new FnParam(CONTEXT_NAME,null),new FnParam("dirIndex",null)],[renderFlagCheckIfStmt(1,createStatements),renderFlagCheckIfStmt(2,updateStatements)],INFERRED_TYPE,null,contentQueriesFnName)}function stringMapAsType(map){return expressionType(literalMap(Object.keys(map).map(function(key){return{key:key,value:literal(Array.isArray(map[key])?map[key][0]:map[key]),quoted:!0}})))}function stringArrayAsType(arr){return arr.length>0?expressionType(literalArr(arr.map(function(value){return literal(value)}))):NONE_TYPE}function createTypeForDef(meta,typeBase){var str,selectorForType=(meta.selector||"").replace(/\n/g,"");return expressionType(importExpr(typeBase,[typeWithParameters(meta.type,meta.typeArgumentCount),(str=selectorForType,expressionType(literal(str))),null!==meta.exportAs?stringArrayAsType(meta.exportAs):NONE_TYPE,stringMapAsType(meta.inputs),stringMapAsType(meta.outputs),stringArrayAsType(meta.queries.map(function(q){return q.propertyName}))]))}function createViewQueriesFunction(viewQueries,constantPool,name){var createStatements=[],updateStatements=[],tempAllocator=temporaryAllocator(updateStatements,TEMPORARY_NAME);viewQueries.forEach(function(query){var queryDefinition=importExpr(query.static?Identifiers$1.staticViewQuery:Identifiers$1.viewQuery).callFn(prepareQueryParams(query,constantPool));createStatements.push(queryDefinition.toStmt());var temporary=tempAllocator(),getQueryList=importExpr(Identifiers$1.loadViewQuery).callFn([]),refresh=importExpr(Identifiers$1.queryRefresh).callFn([temporary.set(getQueryList)]),updateDirective=variable(CONTEXT_NAME).prop(query.propertyName).set(query.first?temporary.prop("first"):temporary);updateStatements.push(refresh.and(updateDirective).toStmt())});var viewQueryFnName=name?name+"_Query":null;return fn([new FnParam(RENDER_FLAGS,NUMBER_TYPE),new FnParam(CONTEXT_NAME,null)],[renderFlagCheckIfStmt(1,createStatements),renderFlagCheckIfStmt(2,updateStatements)],INFERRED_TYPE,null,viewQueryFnName)}function bindingFn(implicit,value){return convertPropertyBinding(null,implicit,value,"b",BindingForm.TrySimple,function(){return error("Unexpected interpolation")})}function createStylingStmt(instruction,bindingContext,bindingFn){var params=instruction.buildParams(function(value){return bindingFn(bindingContext,value).currValExpr});return importExpr(instruction.reference,null,instruction.sourceSpan).callFn(params,instruction.sourceSpan).toStmt()}function metadataAsSummary(meta){return{hostAttributes:{},hostListeners:meta.host.listeners,hostProperties:meta.host.properties}}function typeMapToExpressionMap(map,outputCtx){var entries=Array.from(map).map(function(_a){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),key=_b[0],type=_b[1];return[key,outputCtx.importExpr(type)]});return new Map(entries)}var HOST_REG_EXP$1=/^(?:\[([^\]]+)\])|(?:\(([^\)]+)\))$/;var ResourceLoader=function(){function ResourceLoader(){}return ResourceLoader.prototype.get=function(url){return""},ResourceLoader}(),CompilerFacadeImpl=function(){function CompilerFacadeImpl(jitEvaluator){void 0===jitEvaluator&&(jitEvaluator=new JitEvaluator),this.jitEvaluator=jitEvaluator,this.R3ResolvedDependencyType=R3ResolvedDependencyType,this.ResourceLoader=ResourceLoader,this.elementSchemaRegistry=new DomElementSchemaRegistry}return CompilerFacadeImpl.prototype.compilePipe=function(angularCoreEnv,sourceMapUrl,facade){var res=compilePipeFromMetadata({name:facade.name,type:new WrappedNodeExpr(facade.type),typeArgumentCount:facade.typeArgumentCount,deps:convertR3DependencyMetadataArray(facade.deps),pipeName:facade.pipeName,pure:facade.pure});return this.jitExpression(res.expression,angularCoreEnv,sourceMapUrl,res.statements)},CompilerFacadeImpl.prototype.compileInjectable=function(angularCoreEnv,sourceMapUrl,facade){var _a=function compileInjectable(meta){var result=null,factoryMeta={name:meta.name,type:meta.type,deps:meta.ctorDeps,injectFn:Identifiers.inject};if(void 0!==meta.useClass){var useClassOnSelf=meta.useClass.isEquivalent(meta.type),deps=void 0;void 0!==meta.userDeps&&(deps=meta.userDeps),result=compileFactoryFunction(void 0!==deps?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},factoryMeta,{delegate:meta.useClass,delegateDeps:deps,delegateType:R3FactoryDelegateType.Class}):useClassOnSelf?factoryMeta:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},factoryMeta,{delegate:meta.useClass,delegateType:R3FactoryDelegateType.Factory}))}else result=void 0!==meta.useFactory?compileFactoryFunction(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},factoryMeta,{delegate:meta.useFactory,delegateDeps:meta.userDeps||[],delegateType:R3FactoryDelegateType.Function})):void 0!==meta.useValue?compileFactoryFunction(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},factoryMeta,{expression:meta.useValue})):void 0!==meta.useExisting?compileFactoryFunction(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},factoryMeta,{expression:importExpr(Identifiers.inject).callFn([meta.useExisting])})):compileFactoryFunction(factoryMeta);var token=meta.type,providedIn=meta.providedIn;return{expression:importExpr(Identifiers.ɵɵdefineInjectable).callFn([mapToMapExpression({token:token,factory:result.factory,providedIn:providedIn})]),type:new ExpressionType(importExpr(Identifiers.InjectableDef,[typeWithParameters(meta.type,meta.typeArgumentCount)])),statements:result.statements}}({name:facade.name,type:new WrappedNodeExpr(facade.type),typeArgumentCount:facade.typeArgumentCount,providedIn:computeProvidedIn(facade.providedIn),useClass:wrapExpression(facade,USE_CLASS),useFactory:wrapExpression(facade,USE_FACTORY),useValue:wrapExpression(facade,USE_VALUE),useExisting:wrapExpression(facade,USE_EXISTING),ctorDeps:convertR3DependencyMetadataArray(facade.ctorDeps),userDeps:convertR3DependencyMetadataArray(facade.userDeps)||void 0}),expression=_a.expression,statements=_a.statements;return this.jitExpression(expression,angularCoreEnv,sourceMapUrl,statements)},CompilerFacadeImpl.prototype.compileInjector=function(angularCoreEnv,sourceMapUrl,facade){var res=function compileInjector(meta){var result=compileFactoryFunction({name:meta.name,type:meta.type,deps:meta.deps,injectFn:Identifiers$1.inject}),definitionMap={factory:result.factory};return null!==meta.providers&&(definitionMap.providers=meta.providers),meta.imports.length>0&&(definitionMap.imports=literalArr(meta.imports)),{expression:importExpr(Identifiers$1.defineInjector).callFn([mapToMapExpression(definitionMap)]),type:new ExpressionType(importExpr(Identifiers$1.InjectorDef,[new ExpressionType(meta.type)])),statements:result.statements}}({name:facade.name,type:new WrappedNodeExpr(facade.type),deps:convertR3DependencyMetadataArray(facade.deps),providers:new WrappedNodeExpr(facade.providers),imports:facade.imports.map(function(i){return new WrappedNodeExpr(i)})});return this.jitExpression(res.expression,angularCoreEnv,sourceMapUrl,res.statements)},CompilerFacadeImpl.prototype.compileNgModule=function(angularCoreEnv,sourceMapUrl,facade){var res=compileNgModule({type:new WrappedNodeExpr(facade.type),bootstrap:facade.bootstrap.map(wrapReference),declarations:facade.declarations.map(wrapReference),imports:facade.imports.map(wrapReference),exports:facade.exports.map(wrapReference),emitInline:!0,containsForwardDecls:!1,schemas:facade.schemas?facade.schemas.map(wrapReference):null});return this.jitExpression(res.expression,angularCoreEnv,sourceMapUrl,[])},CompilerFacadeImpl.prototype.compileDirective=function(angularCoreEnv,sourceMapUrl,facade){var constantPool=new ConstantPool,bindingParser=makeBindingParser(),res=compileDirectiveFromMetadata(convertDirectiveFacadeToMetadata(facade),constantPool,bindingParser),preStatements=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(constantPool.statements,res.statements);return this.jitExpression(res.expression,angularCoreEnv,sourceMapUrl,preStatements)},CompilerFacadeImpl.prototype.compileComponent=function(angularCoreEnv,sourceMapUrl,facade){var constantPool=new ConstantPool,interpolationConfig=facade.interpolation?InterpolationConfig.fromArray(facade.interpolation):DEFAULT_INTERPOLATION_CONFIG,template=function parseTemplate(template,templateUrl,options){void 0===options&&(options={});var interpolationConfig=options.interpolationConfig,preserveWhitespaces=options.preserveWhitespaces,bindingParser=makeBindingParser(interpolationConfig),parseResult=(new HtmlParser).parse(template,templateUrl,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},options,{tokenizeExpansionForms:!0,leadingTriviaChars:LEADING_TRIVIA_CHARS}));if(parseResult.errors&&parseResult.errors.length>0)return{errors:parseResult.errors,nodes:[],styleUrls:[],styles:[]};var rootNodes=parseResult.rootNodes;rootNodes=visitAll$1(new I18nMetaVisitor(interpolationConfig,!preserveWhitespaces),rootNodes),preserveWhitespaces||(rootNodes=visitAll$1(new WhitespaceVisitor,rootNodes),rootNodes=visitAll$1(new I18nMetaVisitor(interpolationConfig,!1),rootNodes));var _a=htmlAstToRender3Ast(rootNodes,bindingParser),nodes=_a.nodes,errors=_a.errors,styleUrls=_a.styleUrls,styles=_a.styles;return errors&&errors.length>0?{errors:errors,nodes:[],styleUrls:[],styles:[]}:{nodes:nodes,styleUrls:styleUrls,styles:styles}}(facade.template,sourceMapUrl,{preserveWhitespaces:facade.preserveWhitespaces,interpolationConfig:interpolationConfig});if(void 0!==template.errors){var errors=template.errors.map(function(err){return err.toString()}).join(", ");throw new Error("Errors during JIT compilation of template for "+facade.name+": "+errors)}var res=compileComponentFromMetadata(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},facade,convertDirectiveFacadeToMetadata(facade),{selector:facade.selector||this.elementSchemaRegistry.getDefaultComponentElementName(),template:template,wrapDirectivesAndPipesInClosure:!1,styles:facade.styles||[],encapsulation:facade.encapsulation,interpolation:interpolationConfig,changeDetection:facade.changeDetection,animations:null!=facade.animations?new WrappedNodeExpr(facade.animations):null,viewProviders:null!=facade.viewProviders?new WrappedNodeExpr(facade.viewProviders):null,relativeContextFilePath:"",i18nUseExternalIds:!0}),constantPool,makeBindingParser(interpolationConfig)),preStatements=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(constantPool.statements,res.statements);return this.jitExpression(res.expression,angularCoreEnv,"ng:///"+facade.name+".js",preStatements)},CompilerFacadeImpl.prototype.compileBase=function(angularCoreEnv,sourceMapUrl,facade){var constantPool=new ConstantPool,res=function compileBaseDefFromMetadata(meta,constantPool){var definitionMap=new DefinitionMap;if(meta.inputs){var inputs_1=meta.inputs,inputsMap=Object.keys(inputs_1).map(function(key){var v=inputs_1[key];return{key:key,value:Array.isArray(v)?literalArr(v.map(function(vx){return literal(vx)})):literal(v),quoted:!1}});definitionMap.set("inputs",literalMap(inputsMap))}if(meta.outputs){var outputs_1=meta.outputs,outputsMap=Object.keys(outputs_1).map(function(key){return{key:key,value:literal(outputs_1[key]),quoted:!1}});definitionMap.set("outputs",literalMap(outputsMap))}return meta.viewQueries&&meta.viewQueries.length>0&&definitionMap.set("viewQuery",createViewQueriesFunction(meta.viewQueries,constantPool)),meta.queries&&meta.queries.length>0&&definitionMap.set("contentQueries",createContentQueriesFunction(meta.queries,constantPool)),{expression:importExpr(Identifiers$1.defineBase).callFn([definitionMap.toLiteralMap()]),type:new ExpressionType(importExpr(Identifiers$1.BaseDef))}}(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},facade,{viewQueries:facade.viewQueries?facade.viewQueries.map(convertToR3QueryMetadata):facade.viewQueries,queries:facade.queries?facade.queries.map(convertToR3QueryMetadata):facade.queries}),constantPool);return this.jitExpression(res.expression,angularCoreEnv,sourceMapUrl,constantPool.statements)},CompilerFacadeImpl.prototype.createParseSourceSpan=function(kind,typeName,sourceUrl){return function r3JitTypeSourceSpan(kind,typeName,sourceUrl){var sourceFile=new ParseSourceFile("","in "+kind+" "+typeName+" in "+sourceUrl);return new ParseSourceSpan(new ParseLocation(sourceFile,-1,-1,-1),new ParseLocation(sourceFile,-1,-1,-1))}(kind,typeName,sourceUrl)},CompilerFacadeImpl.prototype.jitExpression=function(def,context,sourceUrl,preStatements){var statements=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(preStatements,[new DeclareVarStmt("$def",def,void 0,[StmtModifier.Exported])]);return this.jitEvaluator.evaluateStatements(sourceUrl,statements,new R3JitReflector(context),!0).$def},CompilerFacadeImpl}(),USE_CLASS=Object.keys({useClass:null})[0],USE_FACTORY=Object.keys({useFactory:null})[0],USE_VALUE=Object.keys({useValue:null})[0],USE_EXISTING=Object.keys({useExisting:null})[0],wrapReference=function(value){var wrapped=new WrappedNodeExpr(value);return{value:wrapped,type:wrapped}};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function convertToR3QueryMetadata(facade){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},facade,{predicate:Array.isArray(facade.predicate)?facade.predicate:new WrappedNodeExpr(facade.predicate),read:facade.read?new WrappedNodeExpr(facade.read):null,static:facade.static})}function convertDirectiveFacadeToMetadata(facade){var inputsFromMetadata=parseInputOutputs(facade.inputs||[]),outputsFromMetadata=parseInputOutputs(facade.outputs||[]),propMetadata=facade.propMetadata,inputsFromType={},outputsFromType={},_loop_1=function(field){propMetadata.hasOwnProperty(field)&&propMetadata[field].forEach(function(ann){!function isInput(value){return"Input"===value.ngMetadataName}(ann)?function isOutput(value){return"Output"===value.ngMetadataName}(ann)&&(outputsFromType[field]=ann.bindingPropertyName||field):inputsFromType[field]=ann.bindingPropertyName?[ann.bindingPropertyName,field]:field})};for(var field in propMetadata)_loop_1(field);return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},facade,{typeSourceSpan:facade.typeSourceSpan,type:new WrappedNodeExpr(facade.type),deps:convertR3DependencyMetadataArray(facade.deps),host:extractHostBindings(facade.host,facade.propMetadata,facade.typeSourceSpan),inputs:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},inputsFromMetadata,inputsFromType),outputs:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},outputsFromMetadata,outputsFromType),queries:facade.queries.map(convertToR3QueryMetadata),providers:null!=facade.providers?new WrappedNodeExpr(facade.providers):null,viewQueries:facade.viewQueries.map(convertToR3QueryMetadata)})}function wrapExpression(obj,property){return obj.hasOwnProperty(property)?new WrappedNodeExpr(obj[property]):void 0}function computeProvidedIn(providedIn){return null==providedIn||"string"==typeof providedIn?new LiteralExpr(providedIn):new WrappedNodeExpr(providedIn)}function convertR3DependencyMetadata(facade){return{token:null===facade.token?new LiteralExpr(null):facade.resolved===R3ResolvedDependencyType.Attribute?new LiteralExpr(facade.token):new WrappedNodeExpr(facade.token),resolved:facade.resolved,host:facade.host,optional:facade.optional,self:facade.self,skipSelf:facade.skipSelf}}function convertR3DependencyMetadataArray(facades){return null==facades?null:facades.map(convertR3DependencyMetadata)}function extractHostBindings(host,propMetadata,sourceSpan){var bindings=function parseHostBindings(host){var e_4,_a,attributes={},listeners={},properties={},specialAttributes={};try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(Object.keys(host)),_c=_b.next();!_c.done;_c=_b.next()){var key=_c.value,value=host[key],matches=key.match(HOST_REG_EXP$1);if(null===matches)switch(key){case"class":if("string"!=typeof value)throw new Error("Class binding must be string");specialAttributes.classAttr=value;break;case"style":if("string"!=typeof value)throw new Error("Style binding must be string");specialAttributes.styleAttr=value;break;default:attributes[key]="string"==typeof value?literal(value):value}else if(null!=matches[1]){if("string"!=typeof value)throw new Error("Property binding must be string");properties[matches[1]]=value}else if(null!=matches[2]){if("string"!=typeof value)throw new Error("Event binding must be string");listeners[matches[2]]=value}}}catch(e_4_1){e_4={error:e_4_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_4)throw e_4.error}}return{attributes:attributes,listeners:listeners,properties:properties,specialAttributes:specialAttributes}}(host||{}),errors=function verifyHostBindings(bindings,sourceSpan){var summary=metadataAsSummary({host:bindings}),bindingParser=makeBindingParser();return bindingParser.createDirectiveHostEventAsts(summary,sourceSpan),bindingParser.createBoundHostProperties(summary,sourceSpan),bindingParser.errors}(bindings,sourceSpan);if(errors.length)throw new Error(errors.map(function(error){return error.msg}).join("\n"));var _loop_2=function(field){propMetadata.hasOwnProperty(field)&&propMetadata[field].forEach(function(ann){!function isHostBinding(value){return"HostBinding"===value.ngMetadataName}(ann)?function isHostListener(value){return"HostListener"===value.ngMetadataName}(ann)&&(bindings.listeners[ann.eventName||field]=field+"("+(ann.args||[]).join(",")+")"):bindings.properties[ann.hostPropertyName||field]=field})};for(var field in propMetadata)_loop_2(field);return bindings}function parseInputOutputs(values){return values.reduce(function(map,value){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(value.split(",").map(function(piece){return piece.trim()}),2),field=_a[0],property=_a[1];return map[field]=property||field,map},{})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
new Version("8.0.3");
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var CompilerConfig=function CompilerConfig(_a){var _b=void 0===_a?{}:_a,_c=_b.defaultEncapsulation,defaultEncapsulation=void 0===_c?ViewEncapsulation.Emulated:_c,_d=_b.useJit,useJit=void 0===_d||_d,_e=_b.jitDevMode,jitDevMode=void 0!==_e&&_e,_f=_b.missingTranslation,missingTranslation=void 0===_f?null:_f,preserveWhitespaces=_b.preserveWhitespaces,strictInjectionParameters=_b.strictInjectionParameters;this.defaultEncapsulation=defaultEncapsulation,this.useJit=!!useJit,this.jitDevMode=!!jitDevMode,this.missingTranslation=missingTranslation,this.preserveWhitespaces=preserveWhitespacesDefault(noUndefined(preserveWhitespaces)),this.strictInjectionParameters=!0===strictInjectionParameters};function preserveWhitespacesDefault(preserveWhitespacesOption,defaultSetting){return void 0===defaultSetting&&(defaultSetting=!1),null===preserveWhitespacesOption?defaultSetting:preserveWhitespacesOption}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var DirectiveNormalizer=function(){function DirectiveNormalizer(_resourceLoader,_urlResolver,_htmlParser,_config){this._resourceLoader=_resourceLoader,this._urlResolver=_urlResolver,this._htmlParser=_htmlParser,this._config=_config,this._resourceLoaderCache=new Map}return DirectiveNormalizer.prototype.clearCache=function(){this._resourceLoaderCache.clear()},DirectiveNormalizer.prototype.clearCacheFor=function(normalizedDirective){var _this=this;if(normalizedDirective.isComponent){var template=normalizedDirective.template;this._resourceLoaderCache.delete(template.templateUrl),template.externalStylesheets.forEach(function(stylesheet){_this._resourceLoaderCache.delete(stylesheet.moduleUrl)})}},DirectiveNormalizer.prototype._fetch=function(url){var result=this._resourceLoaderCache.get(url);return result||(result=this._resourceLoader.get(url),this._resourceLoaderCache.set(url,result)),result},DirectiveNormalizer.prototype.normalizeTemplate=function(prenormData){var _this=this;Eif(isDefined(prenormData.template)){Iif(isDefined(prenormData.templateUrl))throw syntaxError("'"+stringify(prenormData.componentType)+"' component cannot define both template and templateUrl");Iif("string"!=typeof prenormData.template)throw syntaxError("The template specified for component "+stringify(prenormData.componentType)+" is not a string")}else{if(!isDefined(prenormData.templateUrl))throw syntaxError("No template specified for component "+stringify(prenormData.componentType));if("string"!=typeof prenormData.templateUrl)throw syntaxError("The templateUrl specified for component "+stringify(prenormData.componentType)+" is not a string")}Iif(isDefined(prenormData.preserveWhitespaces)&&"boolean"!=typeof prenormData.preserveWhitespaces)throw syntaxError("The preserveWhitespaces option for component "+stringify(prenormData.componentType)+" must be a boolean");return SyncAsync_then(this._preParseTemplate(prenormData),function(preparsedTemplate){return _this._normalizeTemplateMetadata(prenormData,preparsedTemplate)})},DirectiveNormalizer.prototype._preParseTemplate=function(prenomData){var template,templateUrl,_this=this;return null!=prenomData.template?(template=prenomData.template,templateUrl=prenomData.moduleUrl):(templateUrl=this._urlResolver.resolve(prenomData.moduleUrl,prenomData.templateUrl),template=this._fetch(templateUrl)),SyncAsync_then(template,function(template){return _this._preparseLoadedTemplate(prenomData,template,templateUrl)})},DirectiveNormalizer.prototype._preparseLoadedTemplate=function(prenormData,template,templateAbsUrl){var isInline=!!prenormData.template,interpolationConfig=InterpolationConfig.fromArray(prenormData.interpolation),templateUrl=templateSourceUrl({reference:prenormData.ngModuleType},{type:{reference:prenormData.componentType}},{isInline:isInline,templateUrl:templateAbsUrl}),rootNodesAndErrors=this._htmlParser.parse(template,templateUrl,{tokenizeExpansionForms:!0,interpolationConfig:interpolationConfig});Iif(rootNodesAndErrors.errors.length>0)throw syntaxError("Template parse errors:\n"+rootNodesAndErrors.errors.join("\n"));var templateMetadataStyles=this._normalizeStylesheet(new CompileStylesheetMetadata({styles:prenormData.styles,moduleUrl:prenormData.moduleUrl})),visitor=new TemplatePreparseVisitor;visitAll$1(visitor,rootNodesAndErrors.rootNodes);var templateStyles=this._normalizeStylesheet(new CompileStylesheetMetadata({styles:visitor.styles,styleUrls:visitor.styleUrls,moduleUrl:templateAbsUrl}));return{template:template,templateUrl:templateAbsUrl,isInline:isInline,htmlAst:rootNodesAndErrors,styles:templateMetadataStyles.styles.concat(templateStyles.styles),inlineStyleUrls:templateMetadataStyles.styleUrls.concat(templateStyles.styleUrls),styleUrls:this._normalizeStylesheet(new CompileStylesheetMetadata({styleUrls:prenormData.styleUrls,moduleUrl:prenormData.moduleUrl})).styleUrls,ngContentSelectors:visitor.ngContentSelectors}},DirectiveNormalizer.prototype._normalizeTemplateMetadata=function(prenormData,preparsedTemplate){var _this=this;return SyncAsync_then(this._loadMissingExternalStylesheets(preparsedTemplate.styleUrls.concat(preparsedTemplate.inlineStyleUrls)),function(externalStylesheets){return _this._normalizeLoadedTemplateMetadata(prenormData,preparsedTemplate,externalStylesheets)})},DirectiveNormalizer.prototype._normalizeLoadedTemplateMetadata=function(prenormData,preparsedTemplate,stylesheets){var _this=this,styles=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(preparsedTemplate.styles);this._inlineStyles(preparsedTemplate.inlineStyleUrls,stylesheets,styles);var styleUrls=preparsedTemplate.styleUrls,externalStylesheets=styleUrls.map(function(styleUrl){var stylesheet=stylesheets.get(styleUrl),styles=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(stylesheet.styles);return _this._inlineStyles(stylesheet.styleUrls,stylesheets,styles),new CompileStylesheetMetadata({moduleUrl:styleUrl,styles:styles})}),encapsulation=prenormData.encapsulation;return null==encapsulation&&(encapsulation=this._config.defaultEncapsulation),encapsulation===ViewEncapsulation.Emulated&&0===styles.length&&0===styleUrls.length&&(encapsulation=ViewEncapsulation.None),new CompileTemplateMetadata({encapsulation:encapsulation,template:preparsedTemplate.template,templateUrl:preparsedTemplate.templateUrl,htmlAst:preparsedTemplate.htmlAst,styles:styles,styleUrls:styleUrls,ngContentSelectors:preparsedTemplate.ngContentSelectors,animations:prenormData.animations,interpolation:prenormData.interpolation,isInline:preparsedTemplate.isInline,externalStylesheets:externalStylesheets,preserveWhitespaces:preserveWhitespacesDefault(prenormData.preserveWhitespaces,this._config.preserveWhitespaces)})},DirectiveNormalizer.prototype._inlineStyles=function(styleUrls,stylesheets,targetStyles){var _this=this;styleUrls.forEach(function(styleUrl){var stylesheet=stylesheets.get(styleUrl);stylesheet.styles.forEach(function(style){return targetStyles.push(style)}),_this._inlineStyles(stylesheet.styleUrls,stylesheets,targetStyles)})},DirectiveNormalizer.prototype._loadMissingExternalStylesheets=function(styleUrls,loadedStylesheets){var _this=this;return void 0===loadedStylesheets&&(loadedStylesheets=new Map),SyncAsync_then(SyncAsync_all(styleUrls.filter(function(styleUrl){return!loadedStylesheets.has(styleUrl)}).map(function(styleUrl){return SyncAsync_then(_this._fetch(styleUrl),function(loadedStyle){var stylesheet=_this._normalizeStylesheet(new CompileStylesheetMetadata({styles:[loadedStyle],moduleUrl:styleUrl}));return loadedStylesheets.set(styleUrl,stylesheet),_this._loadMissingExternalStylesheets(stylesheet.styleUrls,loadedStylesheets)})})),function(_){return loadedStylesheets})},DirectiveNormalizer.prototype._normalizeStylesheet=function(stylesheet){var _this=this,moduleUrl=stylesheet.moduleUrl,allStyleUrls=stylesheet.styleUrls.filter(isStyleUrlResolvable).map(function(url){return _this._urlResolver.resolve(moduleUrl,url)}),allStyles=stylesheet.styles.map(function(style){var styleWithImports=function extractStyleUrls(resolver,baseUrl,cssText){var foundUrls=[],modifiedCssText=cssText.replace(CSS_STRIPPABLE_COMMENT_REGEXP,"").replace(CSS_IMPORT_REGEXP,function(){for(var m=[],_i=0;_i<arguments.length;_i++)m[_i]=arguments[_i];var url=m[1]||m[2];return isStyleUrlResolvable(url)?(foundUrls.push(resolver.resolve(baseUrl,url)),""):m[0]});return new StyleWithImports(modifiedCssText,foundUrls)}(_this._urlResolver,moduleUrl,style);return allStyleUrls.push.apply(allStyleUrls,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(styleWithImports.styleUrls)),styleWithImports.style});return new CompileStylesheetMetadata({styles:allStyles,styleUrls:allStyleUrls,moduleUrl:moduleUrl})},DirectiveNormalizer}(),TemplatePreparseVisitor=function(){function TemplatePreparseVisitor(){this.ngContentSelectors=[],this.styles=[],this.styleUrls=[],this.ngNonBindableStackCount=0}return TemplatePreparseVisitor.prototype.visitElement=function(ast,context){var preparsedElement=preparseElement(ast);switch(preparsedElement.type){case PreparsedElementType.NG_CONTENT:0===this.ngNonBindableStackCount&&this.ngContentSelectors.push(preparsedElement.selectAttr);break;case PreparsedElementType.STYLE:var textContent_1="";ast.children.forEach(function(child){child instanceof Text$3&&(textContent_1+=child.value)}),this.styles.push(textContent_1);break;case PreparsedElementType.STYLESHEET:this.styleUrls.push(preparsedElement.hrefAttr)}return preparsedElement.nonBindable&&this.ngNonBindableStackCount++,visitAll$1(this,ast.children),preparsedElement.nonBindable&&this.ngNonBindableStackCount--,null},TemplatePreparseVisitor.prototype.visitExpansion=function(ast,context){visitAll$1(this,ast.cases)},TemplatePreparseVisitor.prototype.visitExpansionCase=function(ast,context){visitAll$1(this,ast.expression)},TemplatePreparseVisitor.prototype.visitComment=function(ast,context){return null},TemplatePreparseVisitor.prototype.visitAttribute=function(ast,context){return null},TemplatePreparseVisitor.prototype.visitText=function(ast,context){return null},TemplatePreparseVisitor}(),QUERY_METADATA_IDENTIFIERS=[createViewChild,createViewChildren,createContentChild,createContentChildren],DirectiveResolver=function(){function DirectiveResolver(_reflector){this._reflector=_reflector}return DirectiveResolver.prototype.isDirective=function(type){var typeMetadata=this._reflector.annotations(resolveForwardRef(type));return typeMetadata&&typeMetadata.some(isDirectiveMetadata)},DirectiveResolver.prototype.resolve=function(type,throwIfNotFound){void 0===throwIfNotFound&&(throwIfNotFound=!0);var typeMetadata=this._reflector.annotations(resolveForwardRef(type));Eif(typeMetadata){var metadata=findLast(typeMetadata,isDirectiveMetadata);Eif(metadata){var propertyMetadata=this._reflector.propMetadata(type),guards=this._reflector.guards(type);return this._mergeWithPropertyMetadata(metadata,propertyMetadata,guards,type)}}if(throwIfNotFound)throw new Error("No Directive annotation found on "+stringify(type));return null},DirectiveResolver.prototype._mergeWithPropertyMetadata=function(dm,propertyMetadata,guards,directiveType){var inputs=[],outputs=[],host={},queries={};return Object.keys(propertyMetadata).forEach(function(propName){var input=findLast(propertyMetadata[propName],function(a){return createInput.isTypeOf(a)});input&&(input.bindingPropertyName?inputs.push(propName+": "+input.bindingPropertyName):inputs.push(propName));var output=findLast(propertyMetadata[propName],function(a){return createOutput.isTypeOf(a)});output&&(output.bindingPropertyName?outputs.push(propName+": "+output.bindingPropertyName):outputs.push(propName)),propertyMetadata[propName].filter(function(a){return createHostBinding.isTypeOf(a)}).forEach(function(hostBinding){if(hostBinding.hostPropertyName){var startWith=hostBinding.hostPropertyName[0];if("("===startWith)throw new Error("@HostBinding can not bind to events. Use @HostListener instead.");if("["===startWith)throw new Error("@HostBinding parameter should be a property name, 'class.<name>', or 'attr.<name>'.");host["["+hostBinding.hostPropertyName+"]"]=propName}else host["["+propName+"]"]=propName}),propertyMetadata[propName].filter(function(a){return createHostListener.isTypeOf(a)}).forEach(function(hostListener){var args=hostListener.args||[];host["("+hostListener.eventName+")"]=propName+"("+args.join(",")+")"});var query=findLast(propertyMetadata[propName],function(a){return QUERY_METADATA_IDENTIFIERS.some(function(i){return i.isTypeOf(a)})});query&&(queries[propName]=query)}),this._merge(dm,inputs,outputs,host,queries,guards,directiveType)},DirectiveResolver.prototype._extractPublicName=function(def){return splitAtColon(def,[null,def])[1].trim()},DirectiveResolver.prototype._dedupeBindings=function(bindings){for(var names=new Set,publicNames=new Set,reversedResult=[],i=bindings.length-1;i>=0;i--){var binding=bindings[i],name_1=this._extractPublicName(binding);publicNames.add(name_1),names.has(name_1)||(names.add(name_1),reversedResult.push(binding))}return reversedResult.reverse()},DirectiveResolver.prototype._merge=function(directive,inputs,outputs,host,queries,guards,directiveType){var mergedInputs=this._dedupeBindings(directive.inputs?directive.inputs.concat(inputs):inputs),mergedOutputs=this._dedupeBindings(directive.outputs?directive.outputs.concat(outputs):outputs),mergedHost=directive.host?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},directive.host,host):host,mergedQueries=directive.queries?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},directive.queries,queries):queries;if(createComponent.isTypeOf(directive)){var comp=directive;return createComponent({selector:comp.selector,inputs:mergedInputs,outputs:mergedOutputs,host:mergedHost,exportAs:comp.exportAs,moduleId:comp.moduleId,queries:mergedQueries,changeDetection:comp.changeDetection,providers:comp.providers,viewProviders:comp.viewProviders,entryComponents:comp.entryComponents,template:comp.template,templateUrl:comp.templateUrl,styles:comp.styles,styleUrls:comp.styleUrls,encapsulation:comp.encapsulation,animations:comp.animations,interpolation:comp.interpolation,preserveWhitespaces:directive.preserveWhitespaces})}return createDirective({selector:directive.selector,inputs:mergedInputs,outputs:mergedOutputs,host:mergedHost,exportAs:directive.exportAs,queries:mergedQueries,providers:directive.providers,guards:guards})},DirectiveResolver}();function isDirectiveMetadata(type){return createDirective.isTypeOf(type)||createComponent.isTypeOf(type)}function findLast(arr,condition){for(var i=arr.length-1;i>=0;i--)if(condition(arr[i]))return arr[i];return null}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var I18nError=function(_super){function I18nError(span,msg){return _super.call(this,span,msg)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(I18nError,_super),I18nError}(ParseError),_I18N_ATTR="i18n",_I18N_COMMENT_PREFIX_REGEXP=/^i18n:?/,MEANING_SEPARATOR="|",ID_SEPARATOR="@@",i18nCommentsWarned=!1;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var _VisitorMode,ExtractionResult=function ExtractionResult(messages,errors){this.messages=messages,this.errors=errors};!function(_VisitorMode){_VisitorMode[_VisitorMode.Extract=0]="Extract",_VisitorMode[_VisitorMode.Merge=1]="Merge"}(_VisitorMode||(_VisitorMode={}));var _Visitor$2=function(){function _Visitor(_implicitTags,_implicitAttrs){this._implicitTags=_implicitTags,this._implicitAttrs=_implicitAttrs}return _Visitor.prototype.extract=function(nodes,interpolationConfig){var _this=this;return this._init(_VisitorMode.Extract,interpolationConfig),nodes.forEach(function(node){return node.visit(_this,null)}),this._inI18nBlock&&this._reportError(nodes[nodes.length-1],"Unclosed block"),new ExtractionResult(this._messages,this._errors)},_Visitor.prototype.merge=function(nodes,translations,interpolationConfig){this._init(_VisitorMode.Merge,interpolationConfig),this._translations=translations;var translatedNode=new Element$1("wrapper",[],nodes,void 0,void 0,void 0).visit(this,null);return this._inI18nBlock&&this._reportError(nodes[nodes.length-1],"Unclosed block"),new ParseTreeResult(translatedNode.children,this._errors)},_Visitor.prototype.visitExpansionCase=function(icuCase,context){var expression=visitAll$1(this,icuCase.expression,context);if(this._mode===_VisitorMode.Merge)return new ExpansionCase(icuCase.value,expression,icuCase.sourceSpan,icuCase.valueSourceSpan,icuCase.expSourceSpan)},_Visitor.prototype.visitExpansion=function(icu,context){this._mayBeAddBlockChildren(icu);var wasInIcu=this._inIcu;this._inIcu||(this._isInTranslatableSection&&this._addMessage([icu]),this._inIcu=!0);var cases=visitAll$1(this,icu.cases,context);return this._mode===_VisitorMode.Merge&&(icu=new Expansion(icu.switchValue,icu.type,cases,icu.sourceSpan,icu.switchValueSourceSpan)),this._inIcu=wasInIcu,icu},_Visitor.prototype.visitComment=function(comment,context){var isOpening=function _isOpeningComment(n){return!!(n instanceof Comment&&n.value&&n.value.startsWith("i18n"))}(comment);if(isOpening&&this._isInTranslatableSection)this._reportError(comment,"Could not start a block inside a translatable section");else{var isClosing=function _isClosingComment(n){return!!(n instanceof Comment&&n.value&&"/i18n"===n.value)}(comment);if(!isClosing||this._inI18nBlock){if(!this._inI18nNode&&!this._inIcu)if(this._inI18nBlock){if(isClosing){if(this._depth==this._blockStartDepth){this._closeTranslatableSection(comment,this._blockChildren),this._inI18nBlock=!1;var message=this._addMessage(this._blockChildren,this._blockMeaningAndDesc);return visitAll$1(this,this._translateMessage(comment,message))}return void this._reportError(comment,"I18N blocks should not cross element boundaries")}}else if(isOpening){if(!i18nCommentsWarned&&console&&console.warn){i18nCommentsWarned=!0;var details=comment.sourceSpan.details?", "+comment.sourceSpan.details:"";console.warn("I18n comments are deprecated, use an <ng-container> element instead ("+comment.sourceSpan.start+details+")")}this._inI18nBlock=!0,this._blockStartDepth=this._depth,this._blockChildren=[],this._blockMeaningAndDesc=comment.value.replace(_I18N_COMMENT_PREFIX_REGEXP,"").trim(),this._openTranslatableSection(comment)}}else this._reportError(comment,"Trying to close an unopened block")}},_Visitor.prototype.visitText=function(text,context){return this._isInTranslatableSection&&this._mayBeAddBlockChildren(text),text},_Visitor.prototype.visitElement=function(el,context){var _this=this;this._mayBeAddBlockChildren(el),this._depth++;var wasInI18nNode=this._inI18nNode,wasInImplicitNode=this._inImplicitNode,childNodes=[],translatedChildNodes=void 0,i18nAttr=function _getI18nAttr(p){return p.attrs.find(function(attr){return attr.name===_I18N_ATTR})||null}(el),i18nMeta=i18nAttr?i18nAttr.value:"",isImplicit=this._implicitTags.some(function(tag){return el.name===tag})&&!this._inIcu&&!this._isInTranslatableSection,isTopLevelImplicit=!wasInImplicitNode&&isImplicit;Iif(this._inImplicitNode=wasInImplicitNode||isImplicit,this._isInTranslatableSection||this._inIcu)(i18nAttr||isTopLevelImplicit)&&this._reportError(el,"Could not mark an element as translatable inside a translatable section"),this._mode==_VisitorMode.Extract&&visitAll$1(this,el.children);else{Iif(i18nAttr||isTopLevelImplicit){this._inI18nNode=!0;var message=this._addMessage(el.children,i18nMeta);translatedChildNodes=this._translateMessage(el,message)}Iif(this._mode==_VisitorMode.Extract){var isTranslatable=i18nAttr||isTopLevelImplicit;isTranslatable&&this._openTranslatableSection(el),visitAll$1(this,el.children),isTranslatable&&this._closeTranslatableSection(el,el.children)}}this._mode===_VisitorMode.Merge&&(translatedChildNodes||el.children).forEach(function(child){var visited=child.visit(_this,context);visited&&!_this._isInTranslatableSection&&(childNodes=childNodes.concat(visited))});Eif(this._visitAttributesOf(el),this._depth--,this._inI18nNode=wasInI18nNode,this._inImplicitNode=wasInImplicitNode,this._mode===_VisitorMode.Merge){var translatedAttrs=this._translateAttributes(el);return new Element$1(el.name,translatedAttrs,childNodes,el.sourceSpan,el.startSourceSpan,el.endSourceSpan)}return null},_Visitor.prototype.visitAttribute=function(attribute,context){throw new Error("unreachable code")},_Visitor.prototype._init=function(mode,interpolationConfig){this._mode=mode,this._inI18nBlock=!1,this._inI18nNode=!1,this._depth=0,this._inIcu=!1,this._msgCountAtSectionStart=void 0,this._errors=[],this._messages=[],this._inImplicitNode=!1,this._createI18nMessage=createI18nMessageFactory(interpolationConfig)},_Visitor.prototype._visitAttributesOf=function(el){var _this=this,explicitAttrNameToValue={},implicitAttrNames=this._implicitAttrs[el.name]||[];el.attrs.filter(function(attr){return attr.name.startsWith("i18n-")}).forEach(function(attr){return explicitAttrNameToValue[attr.name.slice("i18n-".length)]=attr.value}),el.attrs.forEach(function(attr){attr.name in explicitAttrNameToValue?_this._addMessage([attr],explicitAttrNameToValue[attr.name]):implicitAttrNames.some(function(name){return attr.name===name})&&_this._addMessage([attr])})},_Visitor.prototype._addMessage=function(ast,msgMeta){if(0==ast.length||1==ast.length&&ast[0]instanceof Attribute&&!ast[0].value)return null;var _a=_parseMessageMeta(msgMeta),meaning=_a.meaning,description=_a.description,id=_a.id,message=this._createI18nMessage(ast,meaning,description,id);return this._messages.push(message),message},_Visitor.prototype._translateMessage=function(el,message){if(message&&this._mode===_VisitorMode.Merge){var nodes=this._translations.get(message);if(nodes)return nodes;this._reportError(el,'Translation unavailable for message id="'+this._translations.digest(message)+'"')}return[]},_Visitor.prototype._translateAttributes=function(el){var _this=this,attributes=el.attrs,i18nParsedMessageMeta={};attributes.forEach(function(attr){attr.name.startsWith("i18n-")&&(i18nParsedMessageMeta[attr.name.slice("i18n-".length)]=_parseMessageMeta(attr.value))});var translatedAttributes=[];return attributes.forEach(function(attr){Eif(attr.name!==_I18N_ATTR&&!attr.name.startsWith("i18n-"))Iif(attr.value&&""!=attr.value&&i18nParsedMessageMeta.hasOwnProperty(attr.name)){var _a=i18nParsedMessageMeta[attr.name],meaning=_a.meaning,description=_a.description,id=_a.id,message=_this._createI18nMessage([attr],meaning,description,id),nodes=_this._translations.get(message);if(nodes)if(0==nodes.length)translatedAttributes.push(new Attribute(attr.name,"",attr.sourceSpan));else if(nodes[0]instanceof Text$3){var value=nodes[0].value;translatedAttributes.push(new Attribute(attr.name,value,attr.sourceSpan))}else _this._reportError(el,'Unexpected translation for attribute "'+attr.name+'" (id="'+(id||_this._translations.digest(message))+'")');else _this._reportError(el,'Translation unavailable for attribute "'+attr.name+'" (id="'+(id||_this._translations.digest(message))+'")')}else translatedAttributes.push(attr)}),translatedAttributes},_Visitor.prototype._mayBeAddBlockChildren=function(node){this._inI18nBlock&&!this._inIcu&&this._depth==this._blockStartDepth&&this._blockChildren.push(node)},_Visitor.prototype._openTranslatableSection=function(node){this._isInTranslatableSection?this._reportError(node,"Unexpected section start"):this._msgCountAtSectionStart=this._messages.length},Object.defineProperty(_Visitor.prototype,"_isInTranslatableSection",{get:function(){return void 0!==this._msgCountAtSectionStart},enumerable:!0,configurable:!0}),_Visitor.prototype._closeTranslatableSection=function(node,directChildren){if(this._isInTranslatableSection){var startIndex=this._msgCountAtSectionStart;if(1==directChildren.reduce(function(count,node){return count+(node instanceof Comment?0:1)},0))for(var i=this._messages.length-1;i>=startIndex;i--){var ast=this._messages[i].nodes;if(!(1==ast.length&&ast[0]instanceof Text$1)){this._messages.splice(i,1);break}}this._msgCountAtSectionStart=void 0}else this._reportError(node,"Unexpected section end")},_Visitor.prototype._reportError=function(node,msg){this._errors.push(new I18nError(node.sourceSpan,msg))},_Visitor}();function _parseMessageMeta(i18n){if(!i18n)return{meaning:"",description:"",id:""};var idIndex=i18n.indexOf(ID_SEPARATOR),descIndex=i18n.indexOf(MEANING_SEPARATOR),_a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(idIndex>-1?[i18n.slice(0,idIndex),i18n.slice(idIndex+2)]:[i18n,""],2),meaningAndDesc=_a[0],id=_a[1],_b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(descIndex>-1?[meaningAndDesc.slice(0,descIndex),meaningAndDesc.slice(descIndex+1)]:["",meaningAndDesc],2);return{meaning:_b[0],description:_b[1],id:id}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var _TAG_DEFINITION=new(function(){function XmlTagDefinition(){this.closedByParent=!1,this.contentType=TagContentType.PARSABLE_DATA,this.isVoid=!1,this.ignoreFirstLf=!1,this.canSelfClose=!0}return XmlTagDefinition.prototype.requireExtraParent=function(currentParent){return!1},XmlTagDefinition.prototype.isClosedByChild=function(name){return!1},XmlTagDefinition}());function getXmlTagDefinition(tagName){return _TAG_DEFINITION}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var XmlParser=function(_super){function XmlParser(){return _super.call(this,getXmlTagDefinition)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(XmlParser,_super),XmlParser.prototype.parse=function(source,url,options){return _super.prototype.parse.call(this,source,url,options)},XmlParser}(Parser),Xliff=function(_super){function Xliff(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Xliff,_super),Xliff.prototype.write=function(messages,locale){var visitor=new _WriteVisitor,transUnits=[];messages.forEach(function(message){var _a,contextTags=[];message.sources.forEach(function(source){var contextGroupTag=new Tag("context-group",{purpose:"location"});contextGroupTag.children.push(new CR(10),new Tag("context",{"context-type":"sourcefile"},[new Text$2(source.filePath)]),new CR(10),new Tag("context",{"context-type":"linenumber"},[new Text$2(""+source.startLine)]),new CR(8)),contextTags.push(new CR(8),contextGroupTag)});var transUnit=new Tag("trans-unit",{id:message.id,datatype:"html"});(_a=transUnit.children).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new CR(8),new Tag("source",{},visitor.serialize(message.nodes))],contextTags)),message.description&&transUnit.children.push(new CR(8),new Tag("note",{priority:"1",from:"description"},[new Text$2(message.description)])),message.meaning&&transUnit.children.push(new CR(8),new Tag("note",{priority:"1",from:"meaning"},[new Text$2(message.meaning)])),transUnit.children.push(new CR(6)),transUnits.push(new CR(6),transUnit)});var body=new Tag("body",{},Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(transUnits,[new CR(4)])),file=new Tag("file",{"source-language":locale||"en",datatype:"plaintext",original:"ng2.template"},[new CR(4),body,new CR(2)]),xliff=new Tag("xliff",{version:"1.2",xmlns:"urn:oasis:names:tc:xliff:document:1.2"},[new CR(2),file,new CR]);return serialize([new Declaration({version:"1.0",encoding:"UTF-8"}),new CR,xliff,new CR])},Xliff.prototype.load=function(content,url){var _a=(new XliffParser).parse(content,url),locale=_a.locale,msgIdToHtml=_a.msgIdToHtml,errors=_a.errors,i18nNodesByMsgId={},converter=new XmlToI18n;if(Object.keys(msgIdToHtml).forEach(function(msgId){var _a=converter.convert(msgIdToHtml[msgId],url),i18nNodes=_a.i18nNodes,e=_a.errors;errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(e)),i18nNodesByMsgId[msgId]=i18nNodes}),errors.length)throw new Error("xliff parse errors:\n"+errors.join("\n"));return{locale:locale,i18nNodesByMsgId:i18nNodesByMsgId}},Xliff.prototype.digest=function(message){return digest(message)},Xliff}(Serializer),_WriteVisitor=function(){function _WriteVisitor(){}return _WriteVisitor.prototype.visitText=function(text,context){return[new Text$2(text.value)]},_WriteVisitor.prototype.visitContainer=function(container,context){var _this=this,nodes=[];return container.children.forEach(function(node){return nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(node.visit(_this)))}),nodes},_WriteVisitor.prototype.visitIcu=function(icu,context){var _this=this,nodes=[new Text$2("{"+icu.expressionPlaceholder+", "+icu.type+", ")];return Object.keys(icu.cases).forEach(function(c){nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new Text$2(c+" {")],icu.cases[c].visit(_this),[new Text$2("} ")]))}),nodes.push(new Text$2("}")),nodes},_WriteVisitor.prototype.visitTagPlaceholder=function(ph,context){var ctype=function getCtypeForTag(tag){switch(tag.toLowerCase()){case"br":return"lb";case"img":return"image";default:return"x-"+tag}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(ph.tag);if(ph.isVoid)return[new Tag("x",{id:ph.startName,ctype:ctype,"equiv-text":"<"+ph.tag+"/>"})];var startTagPh=new Tag("x",{id:ph.startName,ctype:ctype,"equiv-text":"<"+ph.tag+">"}),closeTagPh=new Tag("x",{id:ph.closeName,ctype:ctype,"equiv-text":"</"+ph.tag+">"});return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([startTagPh],this.serialize(ph.children),[closeTagPh])},_WriteVisitor.prototype.visitPlaceholder=function(ph,context){return[new Tag("x",{id:ph.name,"equiv-text":"{{"+ph.value+"}}"})]},_WriteVisitor.prototype.visitIcuPlaceholder=function(ph,context){var equivText="{"+ph.value.expression+", "+ph.value.type+", "+Object.keys(ph.value.cases).map(function(value){return value+" {...}"}).join(" ")+"}";return[new Tag("x",{id:ph.name,"equiv-text":equivText})]},_WriteVisitor.prototype.serialize=function(nodes){var _this=this;return[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(nodes.map(function(node){return node.visit(_this)})))},_WriteVisitor}(),XliffParser=function(){function XliffParser(){this._locale=null}return XliffParser.prototype.parse=function(xliff,url){this._unitMlString=null,this._msgIdToHtml={};var xml=(new XmlParser).parse(xliff,url);return this._errors=xml.errors,visitAll$1(this,xml.rootNodes,null),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},XliffParser.prototype.visitElement=function(element,context){switch(element.name){case"trans-unit":this._unitMlString=null;var idAttr=element.attrs.find(function(attr){return"id"===attr.name});if(idAttr){var id=idAttr.value;this._msgIdToHtml.hasOwnProperty(id)?this._addError(element,"Duplicated translations for msg "+id):(visitAll$1(this,element.children,null),"string"==typeof this._unitMlString?this._msgIdToHtml[id]=this._unitMlString:this._addError(element,"Message "+id+" misses a translation"))}else this._addError(element,'<trans-unit> misses the "id" attribute');break;case"source":case"seg-source":break;case"target":var innerTextStart=element.startSourceSpan.end.offset,innerTextEnd=element.endSourceSpan.start.offset,innerText=element.startSourceSpan.start.file.content.slice(innerTextStart,innerTextEnd);this._unitMlString=innerText;break;case"file":var localeAttr=element.attrs.find(function(attr){return"target-language"===attr.name});localeAttr&&(this._locale=localeAttr.value),visitAll$1(this,element.children,null);break;default:visitAll$1(this,element.children,null)}},XliffParser.prototype.visitAttribute=function(attribute,context){},XliffParser.prototype.visitText=function(text,context){},XliffParser.prototype.visitComment=function(comment,context){},XliffParser.prototype.visitExpansion=function(expansion,context){},XliffParser.prototype.visitExpansionCase=function(expansionCase,context){},XliffParser.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},XliffParser}(),XmlToI18n=function(){function XmlToI18n(){}return XmlToI18n.prototype.convert=function(message,url){var xmlIcu=(new XmlParser).parse(message,url,{tokenizeExpansionForms:!0});return this._errors=xmlIcu.errors,{i18nNodes:this._errors.length>0||0==xmlIcu.rootNodes.length?[]:[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitAll$1(this,xmlIcu.rootNodes))),errors:this._errors}},XmlToI18n.prototype.visitText=function(text,context){return new Text$1(text.value,text.sourceSpan)},XmlToI18n.prototype.visitElement=function(el,context){if("x"===el.name){var nameAttr=el.attrs.find(function(attr){return"id"===attr.name});return nameAttr?new Placeholder("",nameAttr.value,el.sourceSpan):(this._addError(el,'<x> misses the "id" attribute'),null)}return"mrk"===el.name?[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitAll$1(this,el.children))):(this._addError(el,"Unexpected tag"),null)},XmlToI18n.prototype.visitExpansion=function(icu,context){var caseMap={};return visitAll$1(this,icu.cases).forEach(function(c){caseMap[c.value]=new Container(c.nodes,icu.sourceSpan)}),new Icu$1(icu.switchValue,icu.type,caseMap,icu.sourceSpan)},XmlToI18n.prototype.visitExpansionCase=function(icuCase,context){return{value:icuCase.value,nodes:visitAll$1(this,icuCase.expression)}},XmlToI18n.prototype.visitComment=function(comment,context){},XmlToI18n.prototype.visitAttribute=function(attribute,context){},XmlToI18n.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},XmlToI18n}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var Xliff2=function(_super){function Xliff2(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Xliff2,_super),Xliff2.prototype.write=function(messages,locale){var visitor=new _WriteVisitor$1,units=[];messages.forEach(function(message){var unit=new Tag("unit",{id:message.id}),notes=new Tag("notes");(message.description||message.meaning)&&(message.description&&notes.children.push(new CR(8),new Tag("note",{category:"description"},[new Text$2(message.description)])),message.meaning&&notes.children.push(new CR(8),new Tag("note",{category:"meaning"},[new Text$2(message.meaning)]))),message.sources.forEach(function(source){notes.children.push(new CR(8),new Tag("note",{category:"location"},[new Text$2(source.filePath+":"+source.startLine+(source.endLine!==source.startLine?","+source.endLine:""))]))}),notes.children.push(new CR(6)),unit.children.push(new CR(6),notes);var segment=new Tag("segment");segment.children.push(new CR(8),new Tag("source",{},visitor.serialize(message.nodes)),new CR(6)),unit.children.push(new CR(6),segment,new CR(4)),units.push(new CR(4),unit)});var file=new Tag("file",{original:"ng.template",id:"ngi18n"},Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(units,[new CR(2)])),xliff=new Tag("xliff",{version:"2.0",xmlns:"urn:oasis:names:tc:xliff:document:2.0",srcLang:locale||"en"},[new CR(2),file,new CR]);return serialize([new Declaration({version:"1.0",encoding:"UTF-8"}),new CR,xliff,new CR])},Xliff2.prototype.load=function(content,url){var _a=(new Xliff2Parser).parse(content,url),locale=_a.locale,msgIdToHtml=_a.msgIdToHtml,errors=_a.errors,i18nNodesByMsgId={},converter=new XmlToI18n$1;if(Object.keys(msgIdToHtml).forEach(function(msgId){var _a=converter.convert(msgIdToHtml[msgId],url),i18nNodes=_a.i18nNodes,e=_a.errors;errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(e)),i18nNodesByMsgId[msgId]=i18nNodes}),errors.length)throw new Error("xliff2 parse errors:\n"+errors.join("\n"));return{locale:locale,i18nNodesByMsgId:i18nNodesByMsgId}},Xliff2.prototype.digest=function(message){return decimalDigest(message)},Xliff2}(Serializer),_WriteVisitor$1=function(){function _WriteVisitor(){}return _WriteVisitor.prototype.visitText=function(text,context){return[new Text$2(text.value)]},_WriteVisitor.prototype.visitContainer=function(container,context){var _this=this,nodes=[];return container.children.forEach(function(node){return nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(node.visit(_this)))}),nodes},_WriteVisitor.prototype.visitIcu=function(icu,context){var _this=this,nodes=[new Text$2("{"+icu.expressionPlaceholder+", "+icu.type+", ")];return Object.keys(icu.cases).forEach(function(c){nodes.push.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new Text$2(c+" {")],icu.cases[c].visit(_this),[new Text$2("} ")]))}),nodes.push(new Text$2("}")),nodes},_WriteVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this,type=function getTypeForTag(tag){switch(tag.toLowerCase()){case"br":case"b":case"i":case"u":return"fmt";case"img":return"image";case"a":return"link";default:return"other"}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(ph.tag);if(ph.isVoid)return[new Tag("ph",{id:(this._nextPlaceholderId++).toString(),equiv:ph.startName,type:type,disp:"<"+ph.tag+"/>"})];var tagPc=new Tag("pc",{id:(this._nextPlaceholderId++).toString(),equivStart:ph.startName,equivEnd:ph.closeName,type:type,dispStart:"<"+ph.tag+">",dispEnd:"</"+ph.tag+">"}),nodes=[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ph.children.map(function(node){return node.visit(_this)})));return nodes.length?nodes.forEach(function(node){return tagPc.children.push(node)}):tagPc.children.push(new Text$2("")),[tagPc]},_WriteVisitor.prototype.visitPlaceholder=function(ph,context){var idStr=(this._nextPlaceholderId++).toString();return[new Tag("ph",{id:idStr,equiv:ph.name,disp:"{{"+ph.value+"}}"})]},_WriteVisitor.prototype.visitIcuPlaceholder=function(ph,context){var cases=Object.keys(ph.value.cases).map(function(value){return value+" {...}"}).join(" "),idStr=(this._nextPlaceholderId++).toString();return[new Tag("ph",{id:idStr,equiv:ph.name,disp:"{"+ph.value.expression+", "+ph.value.type+", "+cases+"}"})]},_WriteVisitor.prototype.serialize=function(nodes){var _this=this;return this._nextPlaceholderId=0,[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(nodes.map(function(node){return node.visit(_this)})))},_WriteVisitor}(),Xliff2Parser=function(){function Xliff2Parser(){this._locale=null}return Xliff2Parser.prototype.parse=function(xliff,url){this._unitMlString=null,this._msgIdToHtml={};var xml=(new XmlParser).parse(xliff,url);return this._errors=xml.errors,visitAll$1(this,xml.rootNodes,null),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},Xliff2Parser.prototype.visitElement=function(element,context){switch(element.name){case"unit":this._unitMlString=null;var idAttr=element.attrs.find(function(attr){return"id"===attr.name});if(idAttr){var id=idAttr.value;this._msgIdToHtml.hasOwnProperty(id)?this._addError(element,"Duplicated translations for msg "+id):(visitAll$1(this,element.children,null),"string"==typeof this._unitMlString?this._msgIdToHtml[id]=this._unitMlString:this._addError(element,"Message "+id+" misses a translation"))}else this._addError(element,'<unit> misses the "id" attribute');break;case"source":break;case"target":var innerTextStart=element.startSourceSpan.end.offset,innerTextEnd=element.endSourceSpan.start.offset,innerText=element.startSourceSpan.start.file.content.slice(innerTextStart,innerTextEnd);this._unitMlString=innerText;break;case"xliff":var localeAttr=element.attrs.find(function(attr){return"trgLang"===attr.name});localeAttr&&(this._locale=localeAttr.value);var versionAttr=element.attrs.find(function(attr){return"version"===attr.name});if(versionAttr){var version=versionAttr.value;"2.0"!==version?this._addError(element,"The XLIFF file version "+version+" is not compatible with XLIFF 2.0 serializer"):visitAll$1(this,element.children,null)}break;default:visitAll$1(this,element.children,null)}},Xliff2Parser.prototype.visitAttribute=function(attribute,context){},Xliff2Parser.prototype.visitText=function(text,context){},Xliff2Parser.prototype.visitComment=function(comment,context){},Xliff2Parser.prototype.visitExpansion=function(expansion,context){},Xliff2Parser.prototype.visitExpansionCase=function(expansionCase,context){},Xliff2Parser.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},Xliff2Parser}(),XmlToI18n$1=function(){function XmlToI18n(){}return XmlToI18n.prototype.convert=function(message,url){var xmlIcu=(new XmlParser).parse(message,url,{tokenizeExpansionForms:!0});return this._errors=xmlIcu.errors,{i18nNodes:this._errors.length>0||0==xmlIcu.rootNodes.length?[]:[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitAll$1(this,xmlIcu.rootNodes))),errors:this._errors}},XmlToI18n.prototype.visitText=function(text,context){return new Text$1(text.value,text.sourceSpan)},XmlToI18n.prototype.visitElement=function(el,context){var _this=this;switch(el.name){case"ph":var nameAttr=el.attrs.find(function(attr){return"equiv"===attr.name});if(nameAttr)return[new Placeholder("",nameAttr.value,el.sourceSpan)];this._addError(el,'<ph> misses the "equiv" attribute');break;case"pc":var startAttr=el.attrs.find(function(attr){return"equivStart"===attr.name}),endAttr=el.attrs.find(function(attr){return"equivEnd"===attr.name});if(startAttr){if(endAttr){var startId=startAttr.value,endId=endAttr.value,nodes=[];return nodes.concat.apply(nodes,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([new Placeholder("",startId,el.sourceSpan)],el.children.map(function(node){return node.visit(_this,null)}),[new Placeholder("",endId,el.sourceSpan)]))}this._addError(el,'<ph> misses the "equivEnd" attribute')}else this._addError(el,'<ph> misses the "equivStart" attribute');break;case"mrk":return[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitAll$1(this,el.children)));default:this._addError(el,"Unexpected tag")}return null},XmlToI18n.prototype.visitExpansion=function(icu,context){var caseMap={};return visitAll$1(this,icu.cases).forEach(function(c){caseMap[c.value]=new Container(c.nodes,icu.sourceSpan)}),new Icu$1(icu.switchValue,icu.type,caseMap,icu.sourceSpan)},XmlToI18n.prototype.visitExpansionCase=function(icuCase,context){return{value:icuCase.value,nodes:[].concat.apply([],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitAll$1(this,icuCase.expression)))}},XmlToI18n.prototype.visitComment=function(comment,context){},XmlToI18n.prototype.visitAttribute=function(attribute,context){},XmlToI18n.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},XmlToI18n}();var Xtb=function(_super){function Xtb(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(Xtb,_super),Xtb.prototype.write=function(messages,locale){throw new Error("Unsupported")},Xtb.prototype.load=function(content,url){var _a=(new XtbParser).parse(content,url),locale=_a.locale,msgIdToHtml=_a.msgIdToHtml,errors=_a.errors,i18nNodesByMsgId={},converter=new XmlToI18n$2;if(Object.keys(msgIdToHtml).forEach(function(msgId){!function createLazyProperty(messages,id,valueFn){Object.defineProperty(messages,id,{configurable:!0,enumerable:!0,get:function(){var value=valueFn();return Object.defineProperty(messages,id,{enumerable:!0,value:value}),value},set:function(_){throw new Error("Could not overwrite an XTB translation")}})}(i18nNodesByMsgId,msgId,function(){var _a=converter.convert(msgIdToHtml[msgId],url),i18nNodes=_a.i18nNodes,errors=_a.errors;if(errors.length)throw new Error("xtb parse errors:\n"+errors.join("\n"));return i18nNodes})}),errors.length)throw new Error("xtb parse errors:\n"+errors.join("\n"));return{locale:locale,i18nNodesByMsgId:i18nNodesByMsgId}},Xtb.prototype.digest=function(message){return digest$1(message)},Xtb.prototype.createNameMapper=function(message){return new SimplePlaceholderMapper(message,toPublicName)},Xtb}(Serializer);var XtbParser=function(){function XtbParser(){this._locale=null}return XtbParser.prototype.parse=function(xtb,url){this._bundleDepth=0,this._msgIdToHtml={};var xml=(new XmlParser).parse(xtb,url);return this._errors=xml.errors,visitAll$1(this,xml.rootNodes),{msgIdToHtml:this._msgIdToHtml,errors:this._errors,locale:this._locale}},XtbParser.prototype.visitElement=function(element,context){switch(element.name){case"translationbundle":this._bundleDepth++,this._bundleDepth>1&&this._addError(element,"<translationbundle> elements can not be nested");var langAttr=element.attrs.find(function(attr){return"lang"===attr.name});langAttr&&(this._locale=langAttr.value),visitAll$1(this,element.children,null),this._bundleDepth--;break;case"translation":var idAttr=element.attrs.find(function(attr){return"id"===attr.name});if(idAttr){var id=idAttr.value;if(this._msgIdToHtml.hasOwnProperty(id))this._addError(element,"Duplicated translations for msg "+id);else{var innerTextStart=element.startSourceSpan.end.offset,innerTextEnd=element.endSourceSpan.start.offset,innerText=element.startSourceSpan.start.file.content.slice(innerTextStart,innerTextEnd);this._msgIdToHtml[id]=innerText}}else this._addError(element,'<translation> misses the "id" attribute');break;default:this._addError(element,"Unexpected tag")}},XtbParser.prototype.visitAttribute=function(attribute,context){},XtbParser.prototype.visitText=function(text,context){},XtbParser.prototype.visitComment=function(comment,context){},XtbParser.prototype.visitExpansion=function(expansion,context){},XtbParser.prototype.visitExpansionCase=function(expansionCase,context){},XtbParser.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},XtbParser}(),XmlToI18n$2=function(){function XmlToI18n(){}return XmlToI18n.prototype.convert=function(message,url){var xmlIcu=(new XmlParser).parse(message,url,{tokenizeExpansionForms:!0});return this._errors=xmlIcu.errors,{i18nNodes:this._errors.length>0||0==xmlIcu.rootNodes.length?[]:visitAll$1(this,xmlIcu.rootNodes),errors:this._errors}},XmlToI18n.prototype.visitText=function(text,context){return new Text$1(text.value,text.sourceSpan)},XmlToI18n.prototype.visitExpansion=function(icu,context){var caseMap={};return visitAll$1(this,icu.cases).forEach(function(c){caseMap[c.value]=new Container(c.nodes,icu.sourceSpan)}),new Icu$1(icu.switchValue,icu.type,caseMap,icu.sourceSpan)},XmlToI18n.prototype.visitExpansionCase=function(icuCase,context){return{value:icuCase.value,nodes:visitAll$1(this,icuCase.expression)}},XmlToI18n.prototype.visitElement=function(el,context){if("ph"===el.name){var nameAttr=el.attrs.find(function(attr){return"name"===attr.name});if(nameAttr)return new Placeholder("",nameAttr.value,el.sourceSpan);this._addError(el,'<ph> misses the "name" attribute')}else this._addError(el,"Unexpected tag");return null},XmlToI18n.prototype.visitComment=function(comment,context){},XmlToI18n.prototype.visitAttribute=function(attribute,context){},XmlToI18n.prototype._addError=function(node,message){this._errors.push(new I18nError(node.sourceSpan,message))},XmlToI18n}(),TranslationBundle=function(){function TranslationBundle(_i18nNodesByMsgId,locale,digest,mapperFactory,missingTranslationStrategy,console){void 0===_i18nNodesByMsgId&&(_i18nNodesByMsgId={}),void 0===missingTranslationStrategy&&(missingTranslationStrategy=MissingTranslationStrategy.Warning),this._i18nNodesByMsgId=_i18nNodesByMsgId,this.digest=digest,this.mapperFactory=mapperFactory,this._i18nToHtml=new I18nToHtmlVisitor(_i18nNodesByMsgId,locale,digest,mapperFactory,missingTranslationStrategy,console)}return TranslationBundle.load=function(content,url,serializer,missingTranslationStrategy,console){var _a=serializer.load(content,url),locale=_a.locale;return new TranslationBundle(_a.i18nNodesByMsgId,locale,function(m){return serializer.digest(m)},function(m){return serializer.createNameMapper(m)},missingTranslationStrategy,console)},TranslationBundle.prototype.get=function(srcMsg){var html=this._i18nToHtml.convert(srcMsg);if(html.errors.length)throw new Error(html.errors.join("\n"));return html.nodes},TranslationBundle.prototype.has=function(srcMsg){return this.digest(srcMsg)in this._i18nNodesByMsgId},TranslationBundle}(),I18nToHtmlVisitor=function(){function I18nToHtmlVisitor(_i18nNodesByMsgId,_locale,_digest,_mapperFactory,_missingTranslationStrategy,_console){void 0===_i18nNodesByMsgId&&(_i18nNodesByMsgId={}),this._i18nNodesByMsgId=_i18nNodesByMsgId,this._locale=_locale,this._digest=_digest,this._mapperFactory=_mapperFactory,this._missingTranslationStrategy=_missingTranslationStrategy,this._console=_console,this._contextStack=[],this._errors=[]}return I18nToHtmlVisitor.prototype.convert=function(srcMsg){this._contextStack.length=0,this._errors.length=0;var text=this._convertToText(srcMsg),url=srcMsg.nodes[0].sourceSpan.start.file.url,html=(new HtmlParser).parse(text,url,{tokenizeExpansionForms:!0});return{nodes:html.rootNodes,errors:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._errors,html.errors)}},I18nToHtmlVisitor.prototype.visitText=function(text,context){return escapeXml(text.value)},I18nToHtmlVisitor.prototype.visitContainer=function(container,context){var _this=this;return container.children.map(function(n){return n.visit(_this)}).join("")},I18nToHtmlVisitor.prototype.visitIcu=function(icu,context){var _this=this,cases=Object.keys(icu.cases).map(function(k){return k+" {"+icu.cases[k].visit(_this)+"}"});return"{"+(this._srcMsg.placeholders.hasOwnProperty(icu.expression)?this._srcMsg.placeholders[icu.expression]:icu.expression)+", "+icu.type+", "+cases.join(" ")+"}"},I18nToHtmlVisitor.prototype.visitPlaceholder=function(ph,context){var phName=this._mapper(ph.name);return this._srcMsg.placeholders.hasOwnProperty(phName)?this._srcMsg.placeholders[phName]:this._srcMsg.placeholderToMessage.hasOwnProperty(phName)?this._convertToText(this._srcMsg.placeholderToMessage[phName]):(this._addError(ph,'Unknown placeholder "'+ph.name+'"'),"")},I18nToHtmlVisitor.prototype.visitTagPlaceholder=function(ph,context){var _this=this,tag=""+ph.tag,attrs=Object.keys(ph.attrs).map(function(name){return name+'="'+ph.attrs[name]+'"'}).join(" ");return ph.isVoid?"<"+tag+" "+attrs+"/>":"<"+tag+" "+attrs+">"+ph.children.map(function(c){return c.visit(_this)}).join("")+"</"+tag+">"},I18nToHtmlVisitor.prototype.visitIcuPlaceholder=function(ph,context){return this._convertToText(this._srcMsg.placeholderToMessage[ph.name])},I18nToHtmlVisitor.prototype._convertToText=function(srcMsg){var nodes,_this=this,id=this._digest(srcMsg),mapper=this._mapperFactory?this._mapperFactory(srcMsg):null;if(this._contextStack.push({msg:this._srcMsg,mapper:this._mapper}),this._srcMsg=srcMsg,this._i18nNodesByMsgId.hasOwnProperty(id))nodes=this._i18nNodesByMsgId[id],this._mapper=function(name){return mapper?mapper.toInternalName(name):name};else{if(this._missingTranslationStrategy===MissingTranslationStrategy.Error){var ctx=this._locale?' for locale "'+this._locale+'"':"";this._addError(srcMsg.nodes[0],'Missing translation for message "'+id+'"'+ctx)}else if(this._console&&this._missingTranslationStrategy===MissingTranslationStrategy.Warning){ctx=this._locale?' for locale "'+this._locale+'"':"";this._console.warn('Missing translation for message "'+id+'"'+ctx)}nodes=srcMsg.nodes,this._mapper=function(name){return name}}var text=nodes.map(function(node){return node.visit(_this)}).join(""),context=this._contextStack.pop();return this._srcMsg=context.msg,this._mapper=context.mapper,text},I18nToHtmlVisitor.prototype._addError=function(el,msg){this._errors.push(new I18nError(el.sourceSpan,msg))},I18nToHtmlVisitor}(),I18NHtmlParser=function(){function I18NHtmlParser(_htmlParser,translations,translationsFormat,missingTranslation,console){Iif(void 0===missingTranslation&&(missingTranslation=MissingTranslationStrategy.Warning),this._htmlParser=_htmlParser,translations){var serializer=function createSerializer(format){switch(format=(format||"xlf").toLowerCase()){case"xmb":return new Xmb;case"xtb":return new Xtb;case"xliff2":case"xlf2":return new Xliff2;case"xliff":case"xlf":default:return new Xliff}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(translationsFormat);this._translationBundle=TranslationBundle.load(translations,"i18n",serializer,missingTranslation,console)}else this._translationBundle=new TranslationBundle({},null,digest,void 0,missingTranslation,console)}return I18NHtmlParser.prototype.parse=function(source,url,options){void 0===options&&(options={});var interpolationConfig=options.interpolationConfig||DEFAULT_INTERPOLATION_CONFIG,parseResult=this._htmlParser.parse(source,url,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({interpolationConfig:interpolationConfig},options));return parseResult.errors.length?new ParseTreeResult(parseResult.rootNodes,parseResult.errors):function mergeTranslations(nodes,translations,interpolationConfig,implicitTags,implicitAttrs){return new _Visitor$2(implicitTags,implicitAttrs).merge(nodes,translations,interpolationConfig)}(parseResult.rootNodes,this._translationBundle,interpolationConfig,[],{})},I18NHtmlParser}();function convertValueToOutputAst(ctx,value,type){return void 0===type&&(type=null),visitValue(value,new _ValueOutputAstTransformer(ctx),type)}var _ValueOutputAstTransformer=function(){function _ValueOutputAstTransformer(ctx){this.ctx=ctx}return _ValueOutputAstTransformer.prototype.visitArray=function(arr,type){var _this=this;return literalArr(arr.map(function(value){return visitValue(value,_this,null)}),type)},_ValueOutputAstTransformer.prototype.visitStringMap=function(map,type){var _this=this,entries=[],quotedSet=new Set(map&&map.$quoted$);return Object.keys(map).forEach(function(key){entries.push(new LiteralMapEntry(key,visitValue(map[key],_this,null),quotedSet.has(key)))}),new LiteralMapExpr(entries,type)},_ValueOutputAstTransformer.prototype.visitPrimitive=function(value,type){return literal(value,type)},_ValueOutputAstTransformer.prototype.visitOther=function(value,type){return value instanceof Expression?value:this.ctx.importExpr(value)},_ValueOutputAstTransformer}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function mapEntry(key,value){return{key:key,value:value,quoted:!1}}!function(){function InjectableCompiler(reflector,alwaysGenerateDef){this.reflector=reflector,this.alwaysGenerateDef=alwaysGenerateDef,this.tokenInjector=reflector.resolveExternalReference(Identifiers.Injector)}InjectableCompiler.prototype.depsArray=function(deps,ctx){var _this=this;return deps.map(function(dep){var tokenExpr,token=dep,args=[token],flags=0;if(Array.isArray(dep))for(var i=0;i<dep.length;i++){var v=dep[i];v&&("Optional"===v.ngMetadataName?flags|=8:"SkipSelf"===v.ngMetadataName?flags|=4:"Self"===v.ngMetadataName?flags|=2:token="Inject"===v.ngMetadataName?v.token:v)}return tokenExpr="string"==typeof token?literal(token):token===_this.tokenInjector?importExpr(Identifiers.INJECTOR):ctx.importExpr(token),args=0!==flags?[tokenExpr,literal(flags)]:[tokenExpr],importExpr(Identifiers.inject).callFn(args)})},InjectableCompiler.prototype.factoryFor=function(injectable,ctx){var retValue;if(injectable.useExisting)retValue=importExpr(Identifiers.inject).callFn([ctx.importExpr(injectable.useExisting)]);else if(injectable.useFactory){var deps=injectable.deps||[];if(!(deps.length>0))return ctx.importExpr(injectable.useFactory);retValue=ctx.importExpr(injectable.useFactory).callFn(this.depsArray(deps,ctx))}else if(injectable.useValue)retValue=convertValueToOutputAst(ctx,injectable.useValue);else{var clazz=injectable.useClass||injectable.symbol,depArgs=this.depsArray(this.reflector.parameters(clazz),ctx);retValue=new InstantiateExpr(ctx.importExpr(clazz),depArgs)}return fn([],[new ReturnStatement(retValue)],void 0,void 0,injectable.symbol.name+"_Factory")},InjectableCompiler.prototype.injectableDef=function(injectable,ctx){var providedIn=NULL_EXPR;void 0!==injectable.providedIn&&(providedIn=null===injectable.providedIn?NULL_EXPR:"string"==typeof injectable.providedIn?literal(injectable.providedIn):ctx.importExpr(injectable.providedIn));var def=[mapEntry("factory",this.factoryFor(injectable,ctx)),mapEntry("token",ctx.importExpr(injectable.type.reference)),mapEntry("providedIn",providedIn)];return importExpr(Identifiers.ɵɵdefineInjectable).callFn([literalMap(def)])},InjectableCompiler.prototype.compile=function(injectable,ctx){if(this.alwaysGenerateDef||void 0!==injectable.providedIn){var className=identifierName(injectable.type),clazz=new ClassStmt(className,null,[new ClassField("ngInjectableDef",INFERRED_TYPE,[StmtModifier.Static],this.injectableDef(injectable,ctx))],[],new ClassMethod(null,[],[]),[]);ctx.statements.push(clazz)}}}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var STRIP_SRC_FILE_SUFFIXES=/(\.ts|\.d\.ts|\.js|\.jsx|\.tsx)$/,GENERATED_FILE=/\.ngfactory\.|\.ngsummary\./,JIT_SUMMARY_FILE=/\.ngsummary\./,JIT_SUMMARY_NAME=/NgSummary$/;function ngfactoryFilePath(filePath,forceSourceFile){void 0===forceSourceFile&&(forceSourceFile=!1);var urlWithSuffix=splitTypescriptSuffix(filePath,forceSourceFile);return urlWithSuffix[0]+".ngfactory"+normalizeGenFileSuffix(urlWithSuffix[1])}function stripGeneratedFileSuffix(filePath){return filePath.replace(GENERATED_FILE,".")}function splitTypescriptSuffix(path,forceSourceFile){if(void 0===forceSourceFile&&(forceSourceFile=!1),path.endsWith(".d.ts"))return[path.slice(0,-5),forceSourceFile?".ts":".d.ts"];var lastDot=path.lastIndexOf(".");return-1!==lastDot?[path.substring(0,lastDot),path.substring(lastDot)]:[path,""]}function normalizeGenFileSuffix(srcFileSuffix){return".tsx"===srcFileSuffix?".ts":srcFileSuffix}function summaryFileName(fileName){return fileName.replace(STRIP_SRC_FILE_SUFFIXES,"")+".ngsummary.json"}function summaryForJitFileName(fileName,forceSourceFile){void 0===forceSourceFile&&(forceSourceFile=!1);var urlWithSuffix=splitTypescriptSuffix(stripGeneratedFileSuffix(fileName),forceSourceFile);return urlWithSuffix[0]+".ngsummary"+urlWithSuffix[1]}function summaryForJitName(symbolName){return symbolName+"NgSummary"}var LifecycleHooks,LOWERED_SYMBOL=/\u0275\d+/;!function(LifecycleHooks){LifecycleHooks[LifecycleHooks.OnInit=0]="OnInit",LifecycleHooks[LifecycleHooks.OnDestroy=1]="OnDestroy",LifecycleHooks[LifecycleHooks.DoCheck=2]="DoCheck",LifecycleHooks[LifecycleHooks.OnChanges=3]="OnChanges",LifecycleHooks[LifecycleHooks.AfterContentInit=4]="AfterContentInit",LifecycleHooks[LifecycleHooks.AfterContentChecked=5]="AfterContentChecked",LifecycleHooks[LifecycleHooks.AfterViewInit=6]="AfterViewInit",LifecycleHooks[LifecycleHooks.AfterViewChecked=7]="AfterViewChecked"}(LifecycleHooks||(LifecycleHooks={}));var LIFECYCLE_HOOKS_VALUES=[LifecycleHooks.OnInit,LifecycleHooks.OnDestroy,LifecycleHooks.DoCheck,LifecycleHooks.OnChanges,LifecycleHooks.AfterContentInit,LifecycleHooks.AfterContentChecked,LifecycleHooks.AfterViewInit,LifecycleHooks.AfterViewChecked];function hasLifecycleHook(reflector,hook,token){return reflector.hasLifecycleHook(token,function getHookName(hook){switch(hook){case LifecycleHooks.OnInit:return"ngOnInit";case LifecycleHooks.OnDestroy:return"ngOnDestroy";case LifecycleHooks.DoCheck:return"ngDoCheck";case LifecycleHooks.OnChanges:return"ngOnChanges";case LifecycleHooks.AfterContentInit:return"ngAfterContentInit";case LifecycleHooks.AfterContentChecked:return"ngAfterContentChecked";case LifecycleHooks.AfterViewInit:return"ngAfterViewInit";case LifecycleHooks.AfterViewChecked:return"ngAfterViewChecked";default:throw new Error("unexpected "+hook)}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(hook))}var ERROR_COMPONENT_TYPE="ngComponentType",CompileMetadataResolver=function(){function CompileMetadataResolver(_config,_htmlParser,_ngModuleResolver,_directiveResolver,_pipeResolver,_summaryResolver,_schemaRegistry,_directiveNormalizer,_console,_staticSymbolCache,_reflector,_errorCollector){this._config=_config,this._htmlParser=_htmlParser,this._ngModuleResolver=_ngModuleResolver,this._directiveResolver=_directiveResolver,this._pipeResolver=_pipeResolver,this._summaryResolver=_summaryResolver,this._schemaRegistry=_schemaRegistry,this._directiveNormalizer=_directiveNormalizer,this._console=_console,this._staticSymbolCache=_staticSymbolCache,this._reflector=_reflector,this._errorCollector=_errorCollector,this._nonNormalizedDirectiveCache=new Map,this._directiveCache=new Map,this._summaryCache=new Map,this._pipeCache=new Map,this._ngModuleCache=new Map,this._ngModuleOfTypes=new Map,this._shallowModuleCache=new Map}return CompileMetadataResolver.prototype.getReflector=function(){return this._reflector},CompileMetadataResolver.prototype.clearCacheFor=function(type){var dirMeta=this._directiveCache.get(type);this._directiveCache.delete(type),this._nonNormalizedDirectiveCache.delete(type),this._summaryCache.delete(type),this._pipeCache.delete(type),this._ngModuleOfTypes.delete(type),this._ngModuleCache.clear(),dirMeta&&this._directiveNormalizer.clearCacheFor(dirMeta)},CompileMetadataResolver.prototype.clearCache=function(){this._directiveCache.clear(),this._nonNormalizedDirectiveCache.clear(),this._summaryCache.clear(),this._pipeCache.clear(),this._ngModuleCache.clear(),this._ngModuleOfTypes.clear(),this._directiveNormalizer.clearCache()},CompileMetadataResolver.prototype._createProxyClass=function(baseType,name){var delegate=null,proxyClass=function(){Iif(!delegate)throw new Error("Illegal state: Class "+name+" for type "+stringify(baseType)+" is not compiled yet!");return delegate.apply(this,arguments)};return proxyClass.setDelegate=function(d){delegate=d,proxyClass.prototype=d.prototype},proxyClass.overriddenName=name,proxyClass},CompileMetadataResolver.prototype.getGeneratedClass=function(dirType,name){return dirType instanceof StaticSymbol?this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath),name):this._createProxyClass(dirType,name)},CompileMetadataResolver.prototype.getComponentViewClass=function(dirType){return this.getGeneratedClass(dirType,viewClassName(dirType,0))},CompileMetadataResolver.prototype.getHostComponentViewClass=function(dirType){return this.getGeneratedClass(dirType,function hostViewClassName(compType){return"HostView_"+identifierName({reference:compType})}(dirType))},CompileMetadataResolver.prototype.getHostComponentType=function(dirType){var name=identifierName({reference:dirType})+"_Host";return dirType instanceof StaticSymbol?this._staticSymbolCache.get(dirType.filePath,name):this._createProxyClass(dirType,name)},CompileMetadataResolver.prototype.getRendererType=function(dirType){return dirType instanceof StaticSymbol?this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath),rendererTypeName(dirType)):{}},CompileMetadataResolver.prototype.getComponentFactory=function(selector,dirType,inputs,outputs){Iif(dirType instanceof StaticSymbol)return this._staticSymbolCache.get(ngfactoryFilePath(dirType.filePath),componentFactoryName(dirType));var hostView=this.getHostComponentViewClass(dirType);return this._reflector.resolveExternalReference(Identifiers.createComponentFactory)(selector,dirType,hostView,inputs,outputs,[])},CompileMetadataResolver.prototype.initComponentFactory=function(factory,ngContentSelectors){var _a;factory instanceof StaticSymbol||(_a=factory.ngContentSelectors).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ngContentSelectors))},CompileMetadataResolver.prototype._loadSummary=function(type,kind){var typeSummary=this._summaryCache.get(type);if(!typeSummary){var summary=this._summaryResolver.resolveSummary(type);typeSummary=summary?summary.type:null,this._summaryCache.set(type,typeSummary||null)}return typeSummary&&typeSummary.summaryKind===kind?typeSummary:null},CompileMetadataResolver.prototype.getHostComponentMetadata=function(compMeta,hostViewType){var hostType=this.getHostComponentType(compMeta.type.reference);hostViewType||(hostViewType=this.getHostComponentViewClass(hostType));var template=CssSelector.parse(compMeta.selector)[0].getMatchingElementTemplate(),htmlAst=this._htmlParser.parse(template,"");return CompileDirectiveMetadata.create({isHost:!0,type:{reference:hostType,diDeps:[],lifecycleHooks:[]},template:new CompileTemplateMetadata({encapsulation:ViewEncapsulation.None,template:template,templateUrl:"",htmlAst:htmlAst,styles:[],styleUrls:[],ngContentSelectors:[],animations:[],isInline:!0,externalStylesheets:[],interpolation:null,preserveWhitespaces:!1}),exportAs:null,changeDetection:ChangeDetectionStrategy.Default,inputs:[],outputs:[],host:{},isComponent:!0,selector:"*",providers:[],viewProviders:[],queries:[],guards:{},viewQueries:[],componentViewType:hostViewType,rendererType:{id:"__Host__",encapsulation:ViewEncapsulation.None,styles:[],data:{}},entryComponents:[],componentFactory:null})},CompileMetadataResolver.prototype.loadDirectiveMetadata=function(ngModuleType,directiveType,isSync){var _this=this;Iif(this._directiveCache.has(directiveType))return null;directiveType=resolveForwardRef(directiveType);var _a=this.getNonNormalizedDirectiveMetadata(directiveType),annotation=_a.annotation,metadata=_a.metadata,createDirectiveMetadata=function(templateMetadata){var normalizedDirMeta=new CompileDirectiveMetadata({isHost:!1,type:metadata.type,isComponent:metadata.isComponent,selector:metadata.selector,exportAs:metadata.exportAs,changeDetection:metadata.changeDetection,inputs:metadata.inputs,outputs:metadata.outputs,hostListeners:metadata.hostListeners,hostProperties:metadata.hostProperties,hostAttributes:metadata.hostAttributes,providers:metadata.providers,viewProviders:metadata.viewProviders,queries:metadata.queries,guards:metadata.guards,viewQueries:metadata.viewQueries,entryComponents:metadata.entryComponents,componentViewType:metadata.componentViewType,rendererType:metadata.rendererType,componentFactory:metadata.componentFactory,template:templateMetadata});return templateMetadata&&_this.initComponentFactory(metadata.componentFactory,templateMetadata.ngContentSelectors),_this._directiveCache.set(directiveType,normalizedDirMeta),_this._summaryCache.set(directiveType,normalizedDirMeta.toSummary()),null};if(metadata.isComponent){var template=metadata.template,templateMeta=this._directiveNormalizer.normalizeTemplate({ngModuleType:ngModuleType,componentType:directiveType,moduleUrl:this._reflector.componentModuleUrl(directiveType,annotation),encapsulation:template.encapsulation,template:template.template,templateUrl:template.templateUrl,styles:template.styles,styleUrls:template.styleUrls,animations:template.animations,interpolation:template.interpolation,preserveWhitespaces:template.preserveWhitespaces});return isPromise(templateMeta)&&isSync?(this._reportError(function componentStillLoadingError(compType){var error=Error("Can't compile synchronously as "+stringify(compType)+" is still being loaded!");return error[ERROR_COMPONENT_TYPE]=compType,error}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(directiveType),directiveType),null):SyncAsync_then(templateMeta,createDirectiveMetadata)}return createDirectiveMetadata(null),null},CompileMetadataResolver.prototype.getNonNormalizedDirectiveMetadata=function(directiveType){var _this=this;Iif(!(directiveType=resolveForwardRef(directiveType)))return null;var cacheEntry=this._nonNormalizedDirectiveCache.get(directiveType);if(cacheEntry)return cacheEntry;var dirMeta=this._directiveResolver.resolve(directiveType,!1);Iif(!dirMeta)return null;var nonNormalizedTemplateMetadata=void 0;if(createComponent.isTypeOf(dirMeta)){assertArrayOfStrings("styles",(compMeta=dirMeta).styles),assertArrayOfStrings("styleUrls",compMeta.styleUrls),assertInterpolationSymbols("interpolation",compMeta.interpolation);var animations=compMeta.animations;nonNormalizedTemplateMetadata=new CompileTemplateMetadata({encapsulation:noUndefined(compMeta.encapsulation),template:noUndefined(compMeta.template),templateUrl:noUndefined(compMeta.templateUrl),htmlAst:null,styles:compMeta.styles||[],styleUrls:compMeta.styleUrls||[],animations:animations||[],interpolation:noUndefined(compMeta.interpolation),isInline:!!compMeta.template,externalStylesheets:[],ngContentSelectors:[],preserveWhitespaces:noUndefined(dirMeta.preserveWhitespaces)})}var compMeta,changeDetectionStrategy=null,viewProviders=[],entryComponentMetadata=[],selector=dirMeta.selector;createComponent.isTypeOf(dirMeta)?(changeDetectionStrategy=(compMeta=dirMeta).changeDetection,compMeta.viewProviders&&(viewProviders=this._getProvidersMetadata(compMeta.viewProviders,entryComponentMetadata,'viewProviders for "'+stringifyType(directiveType)+'"',[],directiveType)),compMeta.entryComponents&&(entryComponentMetadata=flattenAndDedupeArray(compMeta.entryComponents).map(function(type){return _this._getEntryComponentMetadata(type)}).concat(entryComponentMetadata)),selector||(selector=this._schemaRegistry.getDefaultComponentElementName())):selector||(this._reportError(syntaxError("Directive "+stringifyType(directiveType)+" has no selector, please add it!"),directiveType),selector="error");var providers=[];null!=dirMeta.providers&&(providers=this._getProvidersMetadata(dirMeta.providers,entryComponentMetadata,'providers for "'+stringifyType(directiveType)+'"',[],directiveType));var queries=[],viewQueries=[];null!=dirMeta.queries&&(queries=this._getQueriesMetadata(dirMeta.queries,!1,directiveType),viewQueries=this._getQueriesMetadata(dirMeta.queries,!0,directiveType));var metadata=CompileDirectiveMetadata.create({isHost:!1,selector:selector,exportAs:noUndefined(dirMeta.exportAs),isComponent:!!nonNormalizedTemplateMetadata,type:this._getTypeMetadata(directiveType),template:nonNormalizedTemplateMetadata,changeDetection:changeDetectionStrategy,inputs:dirMeta.inputs||[],outputs:dirMeta.outputs||[],host:dirMeta.host||{},providers:providers||[],viewProviders:viewProviders||[],queries:queries||[],guards:dirMeta.guards||{},viewQueries:viewQueries||[],entryComponents:entryComponentMetadata,componentViewType:nonNormalizedTemplateMetadata?this.getComponentViewClass(directiveType):null,rendererType:nonNormalizedTemplateMetadata?this.getRendererType(directiveType):null,componentFactory:null});return nonNormalizedTemplateMetadata&&(metadata.componentFactory=this.getComponentFactory(selector,directiveType,metadata.inputs,metadata.outputs)),cacheEntry={metadata:metadata,annotation:dirMeta},this._nonNormalizedDirectiveCache.set(directiveType,cacheEntry),cacheEntry},CompileMetadataResolver.prototype.getDirectiveMetadata=function(directiveType){var dirMeta=this._directiveCache.get(directiveType);return dirMeta||this._reportError(syntaxError("Illegal state: getDirectiveMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Directive "+stringifyType(directiveType)+"."),directiveType),dirMeta},CompileMetadataResolver.prototype.getDirectiveSummary=function(dirType){var dirSummary=this._loadSummary(dirType,CompileSummaryKind.Directive);return dirSummary||this._reportError(syntaxError("Illegal state: Could not load the summary for directive "+stringifyType(dirType)+"."),dirType),dirSummary},CompileMetadataResolver.prototype.isDirective=function(type){return!!this._loadSummary(type,CompileSummaryKind.Directive)||this._directiveResolver.isDirective(type)},CompileMetadataResolver.prototype.isPipe=function(type){return!!this._loadSummary(type,CompileSummaryKind.Pipe)||this._pipeResolver.isPipe(type)},CompileMetadataResolver.prototype.isNgModule=function(type){return!!this._loadSummary(type,CompileSummaryKind.NgModule)||this._ngModuleResolver.isNgModule(type)},CompileMetadataResolver.prototype.getNgModuleSummary=function(moduleType,alreadyCollecting){void 0===alreadyCollecting&&(alreadyCollecting=null);var moduleSummary=this._loadSummary(moduleType,CompileSummaryKind.NgModule);Eif(!moduleSummary){var moduleMeta=this.getNgModuleMetadata(moduleType,!1,alreadyCollecting);(moduleSummary=moduleMeta?moduleMeta.toSummary():null)&&this._summaryCache.set(moduleType,moduleSummary)}return moduleSummary},CompileMetadataResolver.prototype.loadNgModuleDirectiveAndPipeMetadata=function(moduleType,isSync,throwIfNotFound){var _this=this;void 0===throwIfNotFound&&(throwIfNotFound=!0);var ngModule=this.getNgModuleMetadata(moduleType,throwIfNotFound),loading=[];return ngModule&&(ngModule.declaredDirectives.forEach(function(id){var promise=_this.loadDirectiveMetadata(moduleType,id.reference,isSync);promise&&loading.push(promise)}),ngModule.declaredPipes.forEach(function(id){return _this._loadPipeMetadata(id.reference)})),Promise.all(loading)},CompileMetadataResolver.prototype.getShallowModuleMetadata=function(moduleType){var compileMeta=this._shallowModuleCache.get(moduleType);if(compileMeta)return compileMeta;var ngModuleMeta=findLast(this._reflector.shallowAnnotations(moduleType),createNgModule.isTypeOf);return compileMeta={type:this._getTypeMetadata(moduleType),rawExports:ngModuleMeta.exports,rawImports:ngModuleMeta.imports,rawProviders:ngModuleMeta.providers},this._shallowModuleCache.set(moduleType,compileMeta),compileMeta},CompileMetadataResolver.prototype.getNgModuleMetadata=function(moduleType,throwIfNotFound,alreadyCollecting){var _this=this;void 0===throwIfNotFound&&(throwIfNotFound=!0),void 0===alreadyCollecting&&(alreadyCollecting=null),moduleType=resolveForwardRef(moduleType);var compileMeta=this._ngModuleCache.get(moduleType);if(compileMeta)return compileMeta;var meta=this._ngModuleResolver.resolve(moduleType,throwIfNotFound);if(!meta)return null;var declaredDirectives=[],exportedNonModuleIdentifiers=[],declaredPipes=[],importedModules=[],exportedModules=[],providers=[],entryComponents=[],bootstrapComponents=[],schemas=[];meta.imports&&flattenAndDedupeArray(meta.imports).forEach(function(importedType){var importedModuleType=void 0;Eif(isValidType(importedType))importedModuleType=importedType;else if(importedType&&importedType.ngModule){var moduleWithProviders=importedType;importedModuleType=moduleWithProviders.ngModule,moduleWithProviders.providers&&providers.push.apply(providers,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(_this._getProvidersMetadata(moduleWithProviders.providers,entryComponents,"provider for the NgModule '"+stringifyType(importedModuleType)+"'",[],importedType)))}Eif(importedModuleType){Eif(!_this._checkSelfImport(moduleType,importedModuleType))Iif(alreadyCollecting||(alreadyCollecting=new Set),alreadyCollecting.has(importedModuleType))_this._reportError(syntaxError(_this._getTypeDescriptor(importedModuleType)+" '"+stringifyType(importedType)+"' is imported recursively by the module '"+stringifyType(moduleType)+"'."),moduleType);else{alreadyCollecting.add(importedModuleType);var importedModuleSummary=_this.getNgModuleSummary(importedModuleType,alreadyCollecting);alreadyCollecting.delete(importedModuleType),importedModuleSummary?importedModules.push(importedModuleSummary):_this._reportError(syntaxError("Unexpected "+_this._getTypeDescriptor(importedType)+" '"+stringifyType(importedType)+"' imported by the module '"+stringifyType(moduleType)+"'. Please add a @NgModule annotation."),moduleType)}}else _this._reportError(syntaxError("Unexpected value '"+stringifyType(importedType)+"' imported by the module '"+stringifyType(moduleType)+"'"),moduleType)}),meta.exports&&flattenAndDedupeArray(meta.exports).forEach(function(exportedType){Eif(isValidType(exportedType))Iif(alreadyCollecting||(alreadyCollecting=new Set),alreadyCollecting.has(exportedType))_this._reportError(syntaxError(_this._getTypeDescriptor(exportedType)+" '"+stringify(exportedType)+"' is exported recursively by the module '"+stringifyType(moduleType)+"'"),moduleType);else{alreadyCollecting.add(exportedType);var exportedModuleSummary=_this.getNgModuleSummary(exportedType,alreadyCollecting);alreadyCollecting.delete(exportedType),exportedModuleSummary?exportedModules.push(exportedModuleSummary):exportedNonModuleIdentifiers.push(_this._getIdentifierMetadata(exportedType))}else _this._reportError(syntaxError("Unexpected value '"+stringifyType(exportedType)+"' exported by the module '"+stringifyType(moduleType)+"'"),moduleType)});var transitiveModule=this._getTransitiveNgModuleMetadata(importedModules,exportedModules);meta.declarations&&flattenAndDedupeArray(meta.declarations).forEach(function(declaredType){Eif(isValidType(declaredType)){var declaredIdentifier=_this._getIdentifierMetadata(declaredType);if(_this.isDirective(declaredType))transitiveModule.addDirective(declaredIdentifier),declaredDirectives.push(declaredIdentifier),_this._addTypeToModule(declaredType,moduleType);else{Iif(!_this.isPipe(declaredType))return void _this._reportError(syntaxError("Unexpected "+_this._getTypeDescriptor(declaredType)+" '"+stringifyType(declaredType)+"' declared by the module '"+stringifyType(moduleType)+"'. Please add a @Pipe/@Directive/@Component annotation."),moduleType);transitiveModule.addPipe(declaredIdentifier),transitiveModule.pipes.push(declaredIdentifier),declaredPipes.push(declaredIdentifier),_this._addTypeToModule(declaredType,moduleType)}}else _this._reportError(syntaxError("Unexpected value '"+stringifyType(declaredType)+"' declared by the module '"+stringifyType(moduleType)+"'"),moduleType)});var exportedDirectives=[],exportedPipes=[];return exportedNonModuleIdentifiers.forEach(function(exportedId){if(transitiveModule.directivesSet.has(exportedId.reference))exportedDirectives.push(exportedId),transitiveModule.addExportedDirective(exportedId);else{Iif(!transitiveModule.pipesSet.has(exportedId.reference))return void _this._reportError(syntaxError("Can't export "+_this._getTypeDescriptor(exportedId.reference)+" "+stringifyType(exportedId.reference)+" from "+stringifyType(moduleType)+" as it was neither declared nor imported!"),moduleType);exportedPipes.push(exportedId),transitiveModule.addExportedPipe(exportedId)}}),meta.providers&&providers.push.apply(providers,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._getProvidersMetadata(meta.providers,entryComponents,"provider for the NgModule '"+stringifyType(moduleType)+"'",[],moduleType))),meta.entryComponents&&entryComponents.push.apply(entryComponents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(flattenAndDedupeArray(meta.entryComponents).map(function(type){return _this._getEntryComponentMetadata(type)}))),meta.bootstrap&&flattenAndDedupeArray(meta.bootstrap).forEach(function(type){isValidType(type)?bootstrapComponents.push(_this._getIdentifierMetadata(type)):_this._reportError(syntaxError("Unexpected value '"+stringifyType(type)+"' used in the bootstrap property of module '"+stringifyType(moduleType)+"'"),moduleType)}),entryComponents.push.apply(entryComponents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(bootstrapComponents.map(function(type){return _this._getEntryComponentMetadata(type.reference)}))),meta.schemas&&schemas.push.apply(schemas,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(flattenAndDedupeArray(meta.schemas))),compileMeta=new CompileNgModuleMetadata({type:this._getTypeMetadata(moduleType),providers:providers,entryComponents:entryComponents,bootstrapComponents:bootstrapComponents,schemas:schemas,declaredDirectives:declaredDirectives,exportedDirectives:exportedDirectives,declaredPipes:declaredPipes,exportedPipes:exportedPipes,importedModules:importedModules,exportedModules:exportedModules,transitiveModule:transitiveModule,id:meta.id||null}),entryComponents.forEach(function(id){return transitiveModule.addEntryComponent(id)}),providers.forEach(function(provider){return transitiveModule.addProvider(provider,compileMeta.type)}),transitiveModule.addModule(compileMeta.type),this._ngModuleCache.set(moduleType,compileMeta),compileMeta},CompileMetadataResolver.prototype._checkSelfImport=function(moduleType,importedModuleType){return moduleType===importedModuleType&&(this._reportError(syntaxError("'"+stringifyType(moduleType)+"' module can't import itself"),moduleType),!0)},CompileMetadataResolver.prototype._getTypeDescriptor=function(type){if(isValidType(type)){if(this.isDirective(type))return"directive";if(this.isPipe(type))return"pipe";if(this.isNgModule(type))return"module"}return type.provide?"provider":"value"},CompileMetadataResolver.prototype._addTypeToModule=function(type,moduleType){var oldModule=this._ngModuleOfTypes.get(type);oldModule&&oldModule!==moduleType?this._reportError(syntaxError("Type "+stringifyType(type)+" is part of the declarations of 2 modules: "+stringifyType(oldModule)+" and "+stringifyType(moduleType)+"! Please consider moving "+stringifyType(type)+" to a higher module that imports "+stringifyType(oldModule)+" and "+stringifyType(moduleType)+". You can also create a new NgModule that exports and includes "+stringifyType(type)+" then import that NgModule in "+stringifyType(oldModule)+" and "+stringifyType(moduleType)+"."),moduleType):this._ngModuleOfTypes.set(type,moduleType)},CompileMetadataResolver.prototype._getTransitiveNgModuleMetadata=function(importedModules,exportedModules){var result=new TransitiveCompileNgModuleMetadata,modulesByToken=new Map;return importedModules.concat(exportedModules).forEach(function(modSummary){modSummary.modules.forEach(function(mod){return result.addModule(mod)}),modSummary.entryComponents.forEach(function(comp){return result.addEntryComponent(comp)});var addedTokens=new Set;modSummary.providers.forEach(function(entry){var tokenRef=tokenReference(entry.provider.token),prevModules=modulesByToken.get(tokenRef);prevModules||(prevModules=new Set,modulesByToken.set(tokenRef,prevModules));var moduleRef=entry.module.reference;!addedTokens.has(tokenRef)&&prevModules.has(moduleRef)||(prevModules.add(moduleRef),addedTokens.add(tokenRef),result.addProvider(entry.provider,entry.module))})}),exportedModules.forEach(function(modSummary){modSummary.exportedDirectives.forEach(function(id){return result.addExportedDirective(id)}),modSummary.exportedPipes.forEach(function(id){return result.addExportedPipe(id)})}),importedModules.forEach(function(modSummary){modSummary.exportedDirectives.forEach(function(id){return result.addDirective(id)}),modSummary.exportedPipes.forEach(function(id){return result.addPipe(id)})}),result},CompileMetadataResolver.prototype._getIdentifierMetadata=function(type){return{reference:type=resolveForwardRef(type)}},CompileMetadataResolver.prototype.isInjectable=function(type){return this._reflector.tryAnnotations(type).some(function(ann){return createInjectable.isTypeOf(ann)})},CompileMetadataResolver.prototype.getInjectableSummary=function(type){return{summaryKind:CompileSummaryKind.Injectable,type:this._getTypeMetadata(type,null,!1)}},CompileMetadataResolver.prototype.getInjectableMetadata=function(type,dependencies,throwOnUnknownDeps){void 0===dependencies&&(dependencies=null),void 0===throwOnUnknownDeps&&(throwOnUnknownDeps=!0);var typeSummary=this._loadSummary(type,CompileSummaryKind.Injectable),typeMetadata=typeSummary?typeSummary.type:this._getTypeMetadata(type,dependencies,throwOnUnknownDeps),annotations=this._reflector.annotations(type).filter(function(ann){return createInjectable.isTypeOf(ann)});if(0===annotations.length)return null;var meta=annotations[annotations.length-1];return{symbol:type,type:typeMetadata,providedIn:meta.providedIn,useValue:meta.useValue,useClass:meta.useClass,useExisting:meta.useExisting,useFactory:meta.useFactory,deps:meta.deps}},CompileMetadataResolver.prototype._getTypeMetadata=function(type,dependencies,throwOnUnknownDeps){void 0===dependencies&&(dependencies=null),void 0===throwOnUnknownDeps&&(throwOnUnknownDeps=!0);var reflector,token,identifier=this._getIdentifierMetadata(type);return{reference:identifier.reference,diDeps:this._getDependenciesMetadata(identifier.reference,dependencies,throwOnUnknownDeps),lifecycleHooks:(reflector=this._reflector,token=identifier.reference,LIFECYCLE_HOOKS_VALUES.filter(function(hook){return hasLifecycleHook(reflector,hook,token)}))}},CompileMetadataResolver.prototype._getFactoryMetadata=function(factory,dependencies){return void 0===dependencies&&(dependencies=null),{reference:factory=resolveForwardRef(factory),diDeps:this._getDependenciesMetadata(factory,dependencies)}},CompileMetadataResolver.prototype.getPipeMetadata=function(pipeType){var pipeMeta=this._pipeCache.get(pipeType);return pipeMeta||this._reportError(syntaxError("Illegal state: getPipeMetadata can only be called after loadNgModuleDirectiveAndPipeMetadata for a module that declares it. Pipe "+stringifyType(pipeType)+"."),pipeType),pipeMeta||null},CompileMetadataResolver.prototype.getPipeSummary=function(pipeType){var pipeSummary=this._loadSummary(pipeType,CompileSummaryKind.Pipe);return pipeSummary||this._reportError(syntaxError("Illegal state: Could not load the summary for pipe "+stringifyType(pipeType)+"."),pipeType),pipeSummary},CompileMetadataResolver.prototype.getOrLoadPipeMetadata=function(pipeType){var pipeMeta=this._pipeCache.get(pipeType);return pipeMeta||(pipeMeta=this._loadPipeMetadata(pipeType)),pipeMeta},CompileMetadataResolver.prototype._loadPipeMetadata=function(pipeType){pipeType=resolveForwardRef(pipeType);var pipeAnnotation=this._pipeResolver.resolve(pipeType),pipeMeta=new CompilePipeMetadata({type:this._getTypeMetadata(pipeType),name:pipeAnnotation.name,pure:!!pipeAnnotation.pure});return this._pipeCache.set(pipeType,pipeMeta),this._summaryCache.set(pipeType,pipeMeta.toSummary()),pipeMeta},CompileMetadataResolver.prototype._getDependenciesMetadata=function(typeOrFunc,dependencies,throwOnUnknownDeps){var _this=this;void 0===throwOnUnknownDeps&&(throwOnUnknownDeps=!0);var hasUnknownDeps=!1,dependenciesMetadata=(dependencies||this._reflector.parameters(typeOrFunc)||[]).map(function(param){var isAttribute=!1,isHost=!1,isSelf=!1,isSkipSelf=!1,isOptional=!1,token=null;return Array.isArray(param)?param.forEach(function(paramEntry){createHost.isTypeOf(paramEntry)?isHost=!0:createSelf.isTypeOf(paramEntry)?isSelf=!0:createSkipSelf.isTypeOf(paramEntry)?isSkipSelf=!0:createOptional.isTypeOf(paramEntry)?isOptional=!0:createAttribute.isTypeOf(paramEntry)?(isAttribute=!0,token=paramEntry.attributeName):createInject.isTypeOf(paramEntry)?token=paramEntry.token:createInjectionToken.isTypeOf(paramEntry)||paramEntry instanceof StaticSymbol?token=paramEntry:isValidType(paramEntry)&&null==token&&(token=paramEntry)}):token=param,null==token?(hasUnknownDeps=!0,{}):{isAttribute:isAttribute,isHost:isHost,isSelf:isSelf,isSkipSelf:isSkipSelf,isOptional:isOptional,token:_this._getTokenMetadata(token)}});Iif(hasUnknownDeps){var depsTokens=dependenciesMetadata.map(function(dep){return dep.token?stringifyType(dep.token):"?"}).join(", "),message="Can't resolve all parameters for "+stringifyType(typeOrFunc)+": ("+depsTokens+").";throwOnUnknownDeps||this._config.strictInjectionParameters?this._reportError(syntaxError(message),typeOrFunc):this._console.warn("Warning: "+message+" This will become an error in Angular v6.x")}return dependenciesMetadata},CompileMetadataResolver.prototype._getTokenMetadata=function(token){return"string"==typeof(token=resolveForwardRef(token))?{value:token}:{identifier:{reference:token}}},CompileMetadataResolver.prototype._getProvidersMetadata=function(providers,targetEntryComponents,debugInfo,compileProviders,type){var _this=this;return void 0===compileProviders&&(compileProviders=[]),providers.forEach(function(provider,providerIdx){if(Array.isArray(provider))_this._getProvidersMetadata(provider,targetEntryComponents,debugInfo,compileProviders);else{var providerMeta=void 0;if((provider=resolveForwardRef(provider))&&"object"==typeof provider&&provider.hasOwnProperty("provide"))_this._validateProvider(provider),providerMeta=new ProviderMeta(provider.provide,provider);else{Iif(!isValidType(provider)){if(void 0===provider)return void _this._reportError(syntaxError("Encountered undefined provider! Usually this means you have a circular dependencies. This might be caused by using 'barrel' index.ts files."));var providersInfo=providers.reduce(function(soFar,seenProvider,seenProviderIdx){return seenProviderIdx<providerIdx?soFar.push(""+stringifyType(seenProvider)):seenProviderIdx==providerIdx?soFar.push("?"+stringifyType(seenProvider)+"?"):seenProviderIdx==providerIdx+1&&soFar.push("..."),soFar},[]).join(", ");return void _this._reportError(syntaxError("Invalid "+(debugInfo||"provider")+" - only instances of Provider and Type are allowed, got: ["+providersInfo+"]"),type)}providerMeta=new ProviderMeta(provider,{useClass:provider})}providerMeta.token===_this._reflector.resolveExternalReference(Identifiers.ANALYZE_FOR_ENTRY_COMPONENTS)?targetEntryComponents.push.apply(targetEntryComponents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(_this._getEntryComponentsFromProvider(providerMeta,type))):compileProviders.push(_this.getProviderMetadata(providerMeta))}}),compileProviders},CompileMetadataResolver.prototype._validateProvider=function(provider){provider.hasOwnProperty("useClass")&&null==provider.useClass&&this._reportError(syntaxError("Invalid provider for "+stringifyType(provider.provide)+". useClass cannot be "+provider.useClass+".\n           Usually it happens when:\n           1. There's a circular dependency (might be caused by using index.ts (barrel) files).\n           2. Class was used before it was declared. Use forwardRef in this case."))},CompileMetadataResolver.prototype._getEntryComponentsFromProvider=function(provider,type){var _this=this,components=[],collectedIdentifiers=[];return provider.useFactory||provider.useExisting||provider.useClass?(this._reportError(syntaxError("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports useValue!"),type),[]):provider.multi?(function extractIdentifiers(value,targetIdentifiers){visitValue(value,new _CompileValueConverter,targetIdentifiers)}(provider.useValue,collectedIdentifiers),collectedIdentifiers.forEach(function(identifier){var entry=_this._getEntryComponentMetadata(identifier.reference,!1);entry&&components.push(entry)}),components):(this._reportError(syntaxError("The ANALYZE_FOR_ENTRY_COMPONENTS token only supports 'multi = true'!"),type),[])},CompileMetadataResolver.prototype._getEntryComponentMetadata=function(dirType,throwIfNotFound){void 0===throwIfNotFound&&(throwIfNotFound=!0);var dirMeta=this.getNonNormalizedDirectiveMetadata(dirType);Eif(dirMeta&&dirMeta.metadata.isComponent)return{componentType:dirType,componentFactory:dirMeta.metadata.componentFactory};var dirSummary=this._loadSummary(dirType,CompileSummaryKind.Directive);if(dirSummary&&dirSummary.isComponent)return{componentType:dirType,componentFactory:dirSummary.componentFactory};if(throwIfNotFound)throw syntaxError(dirType.name+" cannot be used as an entry component.");return null},CompileMetadataResolver.prototype._getInjectableTypeMetadata=function(type,dependencies){void 0===dependencies&&(dependencies=null);var typeSummary=this._loadSummary(type,CompileSummaryKind.Injectable);return typeSummary?typeSummary.type:this._getTypeMetadata(type,dependencies)},CompileMetadataResolver.prototype.getProviderMetadata=function(provider){var compileDeps=void 0,compileTypeMetadata=null,compileFactoryMetadata=null,token=this._getTokenMetadata(provider.token);return provider.useClass?(compileDeps=(compileTypeMetadata=this._getInjectableTypeMetadata(provider.useClass,provider.dependencies)).diDeps,provider.token===provider.useClass&&(token={identifier:compileTypeMetadata})):provider.useFactory&&(compileDeps=(compileFactoryMetadata=this._getFactoryMetadata(provider.useFactory,provider.dependencies)).diDeps),{token:token,useClass:compileTypeMetadata,useValue:provider.useValue,useFactory:compileFactoryMetadata,useExisting:provider.useExisting?this._getTokenMetadata(provider.useExisting):void 0,deps:compileDeps,multi:provider.multi}},CompileMetadataResolver.prototype._getQueriesMetadata=function(queries,isViewQuery,directiveType){var _this=this,res=[];return Object.keys(queries).forEach(function(propertyName){var query=queries[propertyName];query.isViewQuery===isViewQuery&&res.push(_this._getQueryMetadata(query,propertyName,directiveType))}),res},CompileMetadataResolver.prototype._queryVarBindings=function(selector){return selector.split(/\s*,\s*/)},CompileMetadataResolver.prototype._getQueryMetadata=function(q,propertyName,typeOrFunc){var selectors,_this=this;return"string"==typeof q.selector?selectors=this._queryVarBindings(q.selector).map(function(varName){return _this._getTokenMetadata(varName)}):q.selector?selectors=[this._getTokenMetadata(q.selector)]:(this._reportError(syntaxError("Can't construct a query for the property \""+propertyName+'" of "'+stringifyType(typeOrFunc)+"\" since the query selector wasn't defined."),typeOrFunc),selectors=[]),{selectors:selectors,first:q.first,descendants:q.descendants,propertyName:propertyName,read:q.read?this._getTokenMetadata(q.read):null,static:q.static}},CompileMetadataResolver.prototype._reportError=function(error,type,otherType){if(!this._errorCollector)throw error;this._errorCollector(error,type),otherType&&this._errorCollector(error,otherType)},CompileMetadataResolver}();function flattenAndDedupeArray(tree){return function dedupeArray(array){return array?Array.from(new Set(array)):[]}(function flattenArray(tree,out){Eif(void 0===out&&(out=[]),tree)for(var i=0;i<tree.length;i++){var item=resolveForwardRef(tree[i]);Array.isArray(item)?flattenArray(item,out):out.push(item)}return out}(tree))}function isValidType(value){return value instanceof StaticSymbol||value instanceof Type}var _CompileValueConverter=function(_super){function _CompileValueConverter(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_CompileValueConverter,_super),_CompileValueConverter.prototype.visitOther=function(value,targetIdentifiers){targetIdentifiers.push({reference:value})},_CompileValueConverter}(ValueTransformer);function stringifyType(type){return type instanceof StaticSymbol?type.name+" in "+type.filePath:stringify(type)}function providerDef(ctx,providerAst){var flags=0;providerAst.eager||(flags|=4096),providerAst.providerType===ProviderAstType.PrivateService&&(flags|=8192),providerAst.isModule&&(flags|=1073741824),providerAst.lifecycleHooks.forEach(function(lifecycleHook){lifecycleHook!==LifecycleHooks.OnDestroy&&providerAst.providerType!==ProviderAstType.Directive&&providerAst.providerType!==ProviderAstType.Component||(flags|=lifecycleHookToNodeFlag(lifecycleHook))});var _a=providerAst.multiProvider?function multiProviderDef(ctx,flags,providers){var allDepDefs=[],allParams=[],exprs=providers.map(function(provider,providerIndex){var expr;if(provider.useClass){var depExprs=convertDeps(providerIndex,provider.deps||provider.useClass.diDeps);expr=ctx.importExpr(provider.useClass.reference).instantiate(depExprs)}else Eif(provider.useFactory){depExprs=convertDeps(providerIndex,provider.deps||provider.useFactory.diDeps);expr=ctx.importExpr(provider.useFactory.reference).callFn(depExprs)}else if(provider.useExisting){expr=(depExprs=convertDeps(providerIndex,[{token:provider.useExisting}]))[0]}else expr=convertValueToOutputAst(ctx,provider.useValue);return expr});return{providerExpr:fn(allParams,[new ReturnStatement(literalArr(exprs))],INFERRED_TYPE),flags:1024|flags,depsExpr:literalArr(allDepDefs)};function convertDeps(providerIndex,deps){return deps.map(function(dep,depIndex){var paramName="p"+providerIndex+"_"+depIndex;return allParams.push(new FnParam(paramName,DYNAMIC_TYPE)),allDepDefs.push(depDef(ctx,dep)),variable(paramName)})}}(ctx,flags,providerAst.providers):singleProviderDef(ctx,flags,providerAst.providerType,providerAst.providers[0]);return{providerExpr:_a.providerExpr,flags:_a.flags,depsExpr:_a.depsExpr,tokenExpr:tokenExpr(ctx,providerAst.token)}}function singleProviderDef(ctx,flags,providerType,providerMeta){var providerExpr,deps;return providerType===ProviderAstType.Directive||providerType===ProviderAstType.Component?(providerExpr=ctx.importExpr(providerMeta.useClass.reference),flags|=16384,deps=providerMeta.deps||providerMeta.useClass.diDeps):providerMeta.useClass?(providerExpr=ctx.importExpr(providerMeta.useClass.reference),flags|=512,deps=providerMeta.deps||providerMeta.useClass.diDeps):providerMeta.useFactory?(providerExpr=ctx.importExpr(providerMeta.useFactory.reference),flags|=1024,deps=providerMeta.deps||providerMeta.useFactory.diDeps):providerMeta.useExisting?(providerExpr=NULL_EXPR,flags|=2048,deps=[{token:providerMeta.useExisting}]):(providerExpr=convertValueToOutputAst(ctx,providerMeta.useValue),flags|=256,deps=[]),{providerExpr:providerExpr,flags:flags,depsExpr:literalArr(deps.map(function(dep){return depDef(ctx,dep)}))}}function tokenExpr(ctx,tokenMeta){return tokenMeta.identifier?ctx.importExpr(tokenMeta.identifier.reference):literal(tokenMeta.value)}function depDef(ctx,dep){var expr=dep.isValue?convertValueToOutputAst(ctx,dep.value):tokenExpr(ctx,dep.token),flags=0;return dep.isSkipSelf&&(flags|=1),dep.isOptional&&(flags|=2),dep.isSelf&&(flags|=4),dep.isValue&&(flags|=8),0===flags?expr:literalArr([literal(flags),expr])}function lifecycleHookToNodeFlag(lifecycleHook){var nodeFlag=0;switch(lifecycleHook){case LifecycleHooks.AfterContentChecked:nodeFlag=2097152;break;case LifecycleHooks.AfterContentInit:nodeFlag=1048576;break;case LifecycleHooks.AfterViewChecked:nodeFlag=8388608;break;case LifecycleHooks.AfterViewInit:nodeFlag=4194304;break;case LifecycleHooks.DoCheck:nodeFlag=262144;break;case LifecycleHooks.OnChanges:nodeFlag=524288;break;case LifecycleHooks.OnDestroy:nodeFlag=131072;break;case LifecycleHooks.OnInit:nodeFlag=65536}return nodeFlag}function componentFactoryResolverProviderDef(reflector,ctx,flags,entryComponents){var entryComponentFactories=entryComponents.map(function(entryComponent){return ctx.importExpr(entryComponent.componentFactory)}),token=createTokenForExternalReference(reflector,Identifiers.ComponentFactoryResolver),classMeta={diDeps:[{isValue:!0,value:literalArr(entryComponentFactories)},{token:token,isSkipSelf:!0,isOptional:!0},{token:createTokenForExternalReference(reflector,Identifiers.NgModuleRef)}],lifecycleHooks:[],reference:reflector.resolveExternalReference(Identifiers.CodegenComponentFactoryResolver)},_a=singleProviderDef(ctx,flags,ProviderAstType.PrivateService,{token:token,multi:!1,useClass:classMeta});return{providerExpr:_a.providerExpr,flags:_a.flags,depsExpr:_a.depsExpr,tokenExpr:tokenExpr(ctx,token)}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var NgModuleCompileResult=function NgModuleCompileResult(ngModuleFactoryVar){this.ngModuleFactoryVar=ngModuleFactoryVar},LOG_VAR=variable("_l"),NgModuleCompiler=function(){function NgModuleCompiler(reflector){this.reflector=reflector}return NgModuleCompiler.prototype.compile=function(ctx,ngModuleMeta,extraProviders){var sourceSpan=function typeSourceSpan(kind,type){var moduleUrl=identifierModuleUrl(type),sourceFileName=null!=moduleUrl?"in "+kind+" "+identifierName(type)+" in "+moduleUrl:"in "+kind+" "+identifierName(type),sourceFile=new ParseSourceFile("",sourceFileName);return new ParseSourceSpan(new ParseLocation(sourceFile,-1,-1,-1),new ParseLocation(sourceFile,-1,-1,-1))}("NgModule",ngModuleMeta.type),entryComponentFactories=ngModuleMeta.transitiveModule.entryComponents,bootstrapComponents=ngModuleMeta.bootstrapComponents,providerParser=new NgModuleProviderAnalyzer(this.reflector,ngModuleMeta,extraProviders,sourceSpan),providerDefs=[componentFactoryResolverProviderDef(this.reflector,ctx,0,entryComponentFactories)].concat(providerParser.parse().map(function(provider){return providerDef(ctx,provider)})).map(function(_a){var providerExpr=_a.providerExpr,depsExpr=_a.depsExpr,flags=_a.flags,tokenExpr=_a.tokenExpr;return importExpr(Identifiers.moduleProviderDef).callFn([literal(flags),tokenExpr,providerExpr,depsExpr])}),ngModuleDef=importExpr(Identifiers.moduleDef).callFn([literalArr(providerDefs)]),ngModuleDefFactory=fn([new FnParam(LOG_VAR.name)],[new ReturnStatement(ngModuleDef)],INFERRED_TYPE),ngModuleFactoryVar=identifierName(ngModuleMeta.type)+"NgFactory";Iif(this._createNgModuleFactory(ctx,ngModuleMeta.type.reference,importExpr(Identifiers.createModuleFactory).callFn([ctx.importExpr(ngModuleMeta.type.reference),literalArr(bootstrapComponents.map(function(id){return ctx.importExpr(id.reference)})),ngModuleDefFactory])),ngModuleMeta.id){var id="string"==typeof ngModuleMeta.id?literal(ngModuleMeta.id):ctx.importExpr(ngModuleMeta.id),registerFactoryStmt=importExpr(Identifiers.RegisterModuleFactoryFn).callFn([id,variable(ngModuleFactoryVar)]).toStmt();ctx.statements.push(registerFactoryStmt)}return new NgModuleCompileResult(ngModuleFactoryVar)},NgModuleCompiler.prototype.createStub=function(ctx,ngModuleReference){this._createNgModuleFactory(ctx,ngModuleReference,NULL_EXPR)},NgModuleCompiler.prototype._createNgModuleFactory=function(ctx,reference,value){var ngModuleFactoryStmt=variable(identifierName({reference:reference})+"NgFactory").set(value).toDeclStmt(importType(Identifiers.NgModuleFactory,[expressionType(ctx.importExpr(reference))],[TypeModifier.Const]),[StmtModifier.Final,StmtModifier.Exported]);ctx.statements.push(ngModuleFactoryStmt)},NgModuleCompiler}(),NgModuleResolver=function(){function NgModuleResolver(_reflector){this._reflector=_reflector}return NgModuleResolver.prototype.isNgModule=function(type){return this._reflector.annotations(type).some(createNgModule.isTypeOf)},NgModuleResolver.prototype.resolve=function(type,throwIfNotFound){void 0===throwIfNotFound&&(throwIfNotFound=!0);var ngModuleMeta=findLast(this._reflector.annotations(type),createNgModule.isTypeOf);if(ngModuleMeta)return ngModuleMeta;Iif(throwIfNotFound)throw new Error("No NgModule metadata found for '"+stringify(type)+"'.");return null},NgModuleResolver}();!function(){function TypeScriptEmitter(){}TypeScriptEmitter.prototype.emitStatementsAndContext=function(genFilePath,stmts,preamble,emitSourceMaps,referenceFilter,importFilter){void 0===preamble&&(preamble=""),void 0===emitSourceMaps&&(emitSourceMaps=!0);var converter=new _TsEmitterVisitor(referenceFilter,importFilter),ctx=EmitterVisitorContext.createRoot();converter.visitAllStatements(stmts,ctx);var preambleLines=preamble?preamble.split("\n"):[];converter.reexports.forEach(function(reexports,exportedModuleName){var reexportsCode=reexports.map(function(reexport){return reexport.name+" as "+reexport.as}).join(",");preambleLines.push("export {"+reexportsCode+"} from '"+exportedModuleName+"';")}),converter.importsWithPrefixes.forEach(function(prefix,importedModuleName){preambleLines.push("import * as "+prefix+" from '"+importedModuleName+"';")});var sm=emitSourceMaps?ctx.toSourceMapGenerator(genFilePath,preambleLines.length).toJsComment():"",lines=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(preambleLines,[ctx.toSource(),sm]);return sm&&lines.push(""),ctx.setPreambleLineCount(preambleLines.length),{sourceText:lines.join("\n"),context:ctx}},TypeScriptEmitter.prototype.emitStatements=function(genFilePath,stmts,preamble){return void 0===preamble&&(preamble=""),this.emitStatementsAndContext(genFilePath,stmts,preamble).sourceText}}();var _TsEmitterVisitor=function(_super){function _TsEmitterVisitor(referenceFilter,importFilter){var _this=_super.call(this,!1)||this;return _this.referenceFilter=referenceFilter,_this.importFilter=importFilter,_this.typeExpression=0,_this.importsWithPrefixes=new Map,_this.reexports=new Map,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(_TsEmitterVisitor,_super),_TsEmitterVisitor.prototype.visitType=function(t,ctx,defaultType){void 0===defaultType&&(defaultType="any"),t?(this.typeExpression++,t.visitType(this,ctx),this.typeExpression--):ctx.print(null,defaultType)},_TsEmitterVisitor.prototype.visitLiteralExpr=function(ast,ctx){var value=ast.value;return null==value&&ast.type!=INFERRED_TYPE?(ctx.print(ast,"("+value+" as any)"),null):_super.prototype.visitLiteralExpr.call(this,ast,ctx)},_TsEmitterVisitor.prototype.visitLiteralArrayExpr=function(ast,ctx){0===ast.entries.length&&ctx.print(ast,"(");var result=_super.prototype.visitLiteralArrayExpr.call(this,ast,ctx);return 0===ast.entries.length&&ctx.print(ast," as any[])"),result},_TsEmitterVisitor.prototype.visitExternalExpr=function(ast,ctx){return this._visitIdentifier(ast.value,ast.typeParams,ctx),null},_TsEmitterVisitor.prototype.visitAssertNotNullExpr=function(ast,ctx){var result=_super.prototype.visitAssertNotNullExpr.call(this,ast,ctx);return ctx.print(ast,"!"),result},_TsEmitterVisitor.prototype.visitDeclareVarStmt=function(stmt,ctx){if(stmt.hasModifier(StmtModifier.Exported)&&stmt.value instanceof ExternalExpr&&!stmt.type){var _a=stmt.value.value,name_1=_a.name,moduleName=_a.moduleName;if(moduleName){var reexports=this.reexports.get(moduleName);return reexports||(reexports=[],this.reexports.set(moduleName,reexports)),reexports.push({name:name_1,as:stmt.name}),null}}return stmt.hasModifier(StmtModifier.Exported)&&ctx.print(stmt,"export "),stmt.hasModifier(StmtModifier.Final)?ctx.print(stmt,"const"):ctx.print(stmt,"var"),ctx.print(stmt," "+stmt.name),this._printColonType(stmt.type,ctx),stmt.value&&(ctx.print(stmt," = "),stmt.value.visitExpression(this,ctx)),ctx.println(stmt,";"),null},_TsEmitterVisitor.prototype.visitWrappedNodeExpr=function(ast,ctx){throw new Error("Cannot visit a WrappedNodeExpr when outputting Typescript.")},_TsEmitterVisitor.prototype.visitCastExpr=function(ast,ctx){return ctx.print(ast,"(<"),ast.type.visitType(this,ctx),ctx.print(ast,">"),ast.value.visitExpression(this,ctx),ctx.print(ast,")"),null},_TsEmitterVisitor.prototype.visitInstantiateExpr=function(ast,ctx){return ctx.print(ast,"new "),this.typeExpression++,ast.classExpr.visitExpression(this,ctx),this.typeExpression--,ctx.print(ast,"("),this.visitAllExpressions(ast.args,ctx,","),ctx.print(ast,")"),null},_TsEmitterVisitor.prototype.visitDeclareClassStmt=function(stmt,ctx){var _this=this;return ctx.pushClass(stmt),stmt.hasModifier(StmtModifier.Exported)&&ctx.print(stmt,"export "),ctx.print(stmt,"class "+stmt.name),null!=stmt.parent&&(ctx.print(stmt," extends "),this.typeExpression++,stmt.parent.visitExpression(this,ctx),this.typeExpression--),ctx.println(stmt," {"),ctx.incIndent(),stmt.fields.forEach(function(field){return _this._visitClassField(field,ctx)}),null!=stmt.constructorMethod&&this._visitClassConstructor(stmt,ctx),stmt.getters.forEach(function(getter){return _this._visitClassGetter(getter,ctx)}),stmt.methods.forEach(function(method){return _this._visitClassMethod(method,ctx)}),ctx.decIndent(),ctx.println(stmt,"}"),ctx.popClass(),null},_TsEmitterVisitor.prototype._visitClassField=function(field,ctx){field.hasModifier(StmtModifier.Private)&&ctx.print(null,"/*private*/ "),field.hasModifier(StmtModifier.Static)&&ctx.print(null,"static "),ctx.print(null,field.name),this._printColonType(field.type,ctx),field.initializer&&(ctx.print(null," = "),field.initializer.visitExpression(this,ctx)),ctx.println(null,";")},_TsEmitterVisitor.prototype._visitClassGetter=function(getter,ctx){getter.hasModifier(StmtModifier.Private)&&ctx.print(null,"private "),ctx.print(null,"get "+getter.name+"()"),this._printColonType(getter.type,ctx),ctx.println(null," {"),ctx.incIndent(),this.visitAllStatements(getter.body,ctx),ctx.decIndent(),ctx.println(null,"}")},_TsEmitterVisitor.prototype._visitClassConstructor=function(stmt,ctx){ctx.print(stmt,"constructor("),this._visitParams(stmt.constructorMethod.params,ctx),ctx.println(stmt,") {"),ctx.incIndent(),this.visitAllStatements(stmt.constructorMethod.body,ctx),ctx.decIndent(),ctx.println(stmt,"}")},_TsEmitterVisitor.prototype._visitClassMethod=function(method,ctx){method.hasModifier(StmtModifier.Private)&&ctx.print(null,"private "),ctx.print(null,method.name+"("),this._visitParams(method.params,ctx),ctx.print(null,")"),this._printColonType(method.type,ctx,"void"),ctx.println(null," {"),ctx.incIndent(),this.visitAllStatements(method.body,ctx),ctx.decIndent(),ctx.println(null,"}")},_TsEmitterVisitor.prototype.visitFunctionExpr=function(ast,ctx){return ast.name&&(ctx.print(ast,"function "),ctx.print(ast,ast.name)),ctx.print(ast,"("),this._visitParams(ast.params,ctx),ctx.print(ast,")"),this._printColonType(ast.type,ctx,"void"),ast.name||ctx.print(ast," => "),ctx.println(ast,"{"),ctx.incIndent(),this.visitAllStatements(ast.statements,ctx),ctx.decIndent(),ctx.print(ast,"}"),null},_TsEmitterVisitor.prototype.visitDeclareFunctionStmt=function(stmt,ctx){return stmt.hasModifier(StmtModifier.Exported)&&ctx.print(stmt,"export "),ctx.print(stmt,"function "+stmt.name+"("),this._visitParams(stmt.params,ctx),ctx.print(stmt,")"),this._printColonType(stmt.type,ctx,"void"),ctx.println(stmt," {"),ctx.incIndent(),this.visitAllStatements(stmt.statements,ctx),ctx.decIndent(),ctx.println(stmt,"}"),null},_TsEmitterVisitor.prototype.visitTryCatchStmt=function(stmt,ctx){ctx.println(stmt,"try {"),ctx.incIndent(),this.visitAllStatements(stmt.bodyStmts,ctx),ctx.decIndent(),ctx.println(stmt,"} catch ("+CATCH_ERROR_VAR$1.name+") {"),ctx.incIndent();var catchStmts=[CATCH_STACK_VAR$1.set(CATCH_ERROR_VAR$1.prop("stack",null)).toDeclStmt(null,[StmtModifier.Final])].concat(stmt.catchStmts);return this.visitAllStatements(catchStmts,ctx),ctx.decIndent(),ctx.println(stmt,"}"),null},_TsEmitterVisitor.prototype.visitBuiltinType=function(type,ctx){var typeStr;switch(type.name){case BuiltinTypeName.Bool:typeStr="boolean";break;case BuiltinTypeName.Dynamic:typeStr="any";break;case BuiltinTypeName.Function:typeStr="Function";break;case BuiltinTypeName.Number:case BuiltinTypeName.Int:typeStr="number";break;case BuiltinTypeName.String:typeStr="string";break;case BuiltinTypeName.None:typeStr="never";break;default:throw new Error("Unsupported builtin type "+type.name)}return ctx.print(null,typeStr),null},_TsEmitterVisitor.prototype.visitExpressionType=function(ast,ctx){var _this=this;return ast.value.visitExpression(this,ctx),null!==ast.typeParams&&(ctx.print(null,"<"),this.visitAllObjects(function(type){return _this.visitType(type,ctx)},ast.typeParams,ctx,","),ctx.print(null,">")),null},_TsEmitterVisitor.prototype.visitArrayType=function(type,ctx){return this.visitType(type.of,ctx),ctx.print(null,"[]"),null},_TsEmitterVisitor.prototype.visitMapType=function(type,ctx){return ctx.print(null,"{[key: string]:"),this.visitType(type.valueType,ctx),ctx.print(null,"}"),null},_TsEmitterVisitor.prototype.getBuiltinMethodName=function(method){var name;switch(method){case BuiltinMethod.ConcatArray:name="concat";break;case BuiltinMethod.SubscribeObservable:name="subscribe";break;case BuiltinMethod.Bind:name="bind";break;default:throw new Error("Unknown builtin method: "+method)}return name},_TsEmitterVisitor.prototype._visitParams=function(params,ctx){var _this=this;this.visitAllObjects(function(param){ctx.print(null,param.name),_this._printColonType(param.type,ctx)},params,ctx,",")},_TsEmitterVisitor.prototype._visitIdentifier=function(value,typeParams,ctx){var _this=this,name=value.name,moduleName=value.moduleName;if(this.referenceFilter&&this.referenceFilter(value))ctx.print(null,"(null as any)");else{if(moduleName&&(!this.importFilter||!this.importFilter(value))){var prefix=this.importsWithPrefixes.get(moduleName);null==prefix&&(prefix="i"+this.importsWithPrefixes.size,this.importsWithPrefixes.set(moduleName,prefix)),ctx.print(null,prefix+".")}if(ctx.print(null,name),this.typeExpression>0)(typeParams||[]).length>0&&(ctx.print(null,"<"),this.visitAllObjects(function(type){return type.visitType(_this,ctx)},typeParams,ctx,","),ctx.print(null,">"))}},_TsEmitterVisitor.prototype._printColonType=function(type,ctx,defaultType){type!==INFERRED_TYPE&&(ctx.print(null,":"),this.visitType(type,ctx,defaultType))},_TsEmitterVisitor}(AbstractEmitterVisitor),PipeResolver=function(){function PipeResolver(_reflector){this._reflector=_reflector}return PipeResolver.prototype.isPipe=function(type){var typeMetadata=this._reflector.annotations(resolveForwardRef(type));return typeMetadata&&typeMetadata.some(createPipe.isTypeOf)},PipeResolver.prototype.resolve=function(type,throwIfNotFound){void 0===throwIfNotFound&&(throwIfNotFound=!0);var metas=this._reflector.annotations(resolveForwardRef(type));Eif(metas){var annotation=findLast(metas,createPipe.isTypeOf);Eif(annotation)return annotation}if(throwIfNotFound)throw new Error("No Pipe decorator found on "+stringify(type));return null},PipeResolver}(),defaultResolver=(function(){function TypeCheckCompiler(options,reflector){this.options=options,this.reflector=reflector}TypeCheckCompiler.prototype.compileComponent=function(componentId,component,template,usedPipes,externalReferenceVars,ctx){var _this=this,pipes=new Map;usedPipes.forEach(function(p){return pipes.set(p.name,p.type.reference)});var embeddedViewCount=0,viewBuilderFactory=function(parent,guards){var embeddedViewIndex=embeddedViewCount++;return new ViewBuilder(_this.options,_this.reflector,externalReferenceVars,parent,component.type.reference,component.isHost,embeddedViewIndex,pipes,guards,ctx,viewBuilderFactory)},visitor=viewBuilderFactory(null,[]);return visitor.visitAll([],template),visitor.build(componentId)}}(),new(function(){function TypeCheckLocalResolver(){}return TypeCheckLocalResolver.prototype.notifyImplicitReceiverUse=function(){},TypeCheckLocalResolver.prototype.getLocal=function(name){return name===EventHandlerVars.event.name?variable("_any"):null},TypeCheckLocalResolver}())),ViewBuilder=function(){function ViewBuilder(options,reflector,externalReferenceVars,parent,component,isHostComponent,embeddedViewIndex,pipes,guards,ctx,viewBuilderFactory){this.options=options,this.reflector=reflector,this.externalReferenceVars=externalReferenceVars,this.parent=parent,this.component=component,this.isHostComponent=isHostComponent,this.embeddedViewIndex=embeddedViewIndex,this.pipes=pipes,this.guards=guards,this.ctx=ctx,this.viewBuilderFactory=viewBuilderFactory,this.refOutputVars=new Map,this.variables=[],this.children=[],this.updates=[],this.actions=[]}return ViewBuilder.prototype.getOutputVar=function(type){var varName;if(!(varName=type===this.component&&this.isHostComponent?"_any":type instanceof StaticSymbol?this.externalReferenceVars.get(type):"_any"))throw new Error("Illegal State: referring to a type without a variable "+JSON.stringify(type));return varName},ViewBuilder.prototype.getTypeGuardExpressions=function(ast){var e_1,_a,e_2,_b,result=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this.guards);try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(ast.directives),_d=_c.next();!_d.done;_d=_c.next()){var directive=_d.value;try{for(var _e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(directive.inputs),_f=_e.next();!_f.done;_f=_e.next()){var input=_f.value,guard=directive.directive.guards[input.directiveName];if(guard){var useIf="UseIf"===guard;result.push({guard:guard,useIf:useIf,expression:{context:this.component,value:input.value}})}}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_f&&!_f.done&&(_b=_e.return)&&_b.call(_e)}finally{if(e_2)throw e_2.error}}}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_1)throw e_1.error}}return result},ViewBuilder.prototype.visitAll=function(variables,astNodes){this.variables=variables,templateVisitAll(this,astNodes)},ViewBuilder.prototype.build=function(componentId,targetStatements){var e_3,_a,_this=this;void 0===targetStatements&&(targetStatements=[]),this.children.forEach(function(child){return child.build(componentId,targetStatements)});var viewStmts=[variable("_any").set(NULL_EXPR).toDeclStmt(DYNAMIC_TYPE)],bindingCount=0;if(this.updates.forEach(function(expression){var _a=_this.preprocessUpdateExpression(expression),sourceSpan=_a.sourceSpan,context=_a.context,value=_a.value,bindingId=""+bindingCount++,_b=convertPropertyBinding(context===_this.component?_this:defaultResolver,variable(_this.getOutputVar(context)),value,bindingId,BindingForm.General),stmts=_b.stmts,currValExpr=_b.currValExpr;stmts.push(new ExpressionStatement(currValExpr)),viewStmts.push.apply(viewStmts,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(stmts.map(function(stmt){return applySourceSpanToStatementIfNeeded(stmt,sourceSpan)})))}),this.actions.forEach(function(_a){var sourceSpan=_a.sourceSpan,context=_a.context,value=_a.value,bindingId=""+bindingCount++,stmts=convertActionBinding(context===_this.component?_this:defaultResolver,variable(_this.getOutputVar(context)),value,bindingId).stmts;viewStmts.push.apply(viewStmts,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(stmts.map(function(stmt){return applySourceSpanToStatementIfNeeded(stmt,sourceSpan)})))}),this.guards.length){var guardExpression=void 0;try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(this.guards),_c=_b.next();!_c.done;_c=_b.next()){var guard=_c.value,_d=this.preprocessUpdateExpression(guard.expression),context=_d.context,value=_d.value,bindingId=""+bindingCount++,_e=convertPropertyBinding(context===this.component?this:defaultResolver,variable(this.getOutputVar(context)),value,bindingId,BindingForm.TrySimple),stmts=_e.stmts,currValExpr=_e.currValExpr;if(0==stmts.length){var guardClause=guard.useIf?currValExpr:this.ctx.importExpr(guard.guard).callFn([currValExpr]);guardExpression=guardExpression?guardExpression.and(guardClause):guardClause}}}catch(e_3_1){e_3={error:e_3_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_3)throw e_3.error}}guardExpression&&(viewStmts=[new IfStmt(guardExpression,viewStmts)])}var viewName="_View_"+componentId+"_"+this.embeddedViewIndex,viewFactory=new DeclareFunctionStmt(viewName,[],viewStmts);return targetStatements.push(viewFactory),targetStatements},ViewBuilder.prototype.visitBoundText=function(ast,context){var _this=this;ast.value.ast.expressions.forEach(function(expr){return _this.updates.push({context:_this.component,value:expr,sourceSpan:ast.sourceSpan})})},ViewBuilder.prototype.visitEmbeddedTemplate=function(ast,context){if(this.visitElementOrTemplate(ast),this.options.fullTemplateTypeCheck){var guards=this.getTypeGuardExpressions(ast),childVisitor=this.viewBuilderFactory(this,guards);this.children.push(childVisitor),childVisitor.visitAll(ast.variables,ast.children)}},ViewBuilder.prototype.visitElement=function(ast,context){var _this=this;this.visitElementOrTemplate(ast),ast.inputs.forEach(function(inputAst){_this.updates.push({context:_this.component,value:inputAst.value,sourceSpan:inputAst.sourceSpan})}),templateVisitAll(this,ast.children)},ViewBuilder.prototype.visitElementOrTemplate=function(ast){var _this=this;ast.directives.forEach(function(dirAst){_this.visitDirective(dirAst)}),ast.references.forEach(function(ref){var outputVarType=null;outputVarType=ref.value&&ref.value.identifier&&_this.options.fullTemplateTypeCheck?ref.value.identifier.reference:BuiltinTypeName.Dynamic,_this.refOutputVars.set(ref.name,outputVarType)}),ast.outputs.forEach(function(outputAst){_this.actions.push({context:_this.component,value:outputAst.handler,sourceSpan:outputAst.sourceSpan})})},ViewBuilder.prototype.visitDirective=function(dirAst){var _this=this,dirType=dirAst.directive.type.reference;dirAst.inputs.forEach(function(input){return _this.updates.push({context:_this.component,value:input.value,sourceSpan:input.sourceSpan})}),this.options.fullTemplateTypeCheck&&(dirAst.hostProperties.forEach(function(inputAst){return _this.updates.push({context:dirType,value:inputAst.value,sourceSpan:inputAst.sourceSpan})}),dirAst.hostEvents.forEach(function(hostEventAst){return _this.actions.push({context:dirType,value:hostEventAst.handler,sourceSpan:hostEventAst.sourceSpan})}))},ViewBuilder.prototype.notifyImplicitReceiverUse=function(){},ViewBuilder.prototype.getLocal=function(name){if(name==EventHandlerVars.event.name)return variable(this.getOutputVar(BuiltinTypeName.Dynamic));for(var currBuilder=this;currBuilder;currBuilder=currBuilder.parent){var outputVarType=void 0;if(null==(outputVarType=currBuilder.refOutputVars.get(name)))currBuilder.variables.find(function(varAst){return varAst.name===name})&&(outputVarType=BuiltinTypeName.Dynamic);if(null!=outputVarType)return variable(this.getOutputVar(outputVarType))}return null},ViewBuilder.prototype.pipeOutputVar=function(name){var pipe=this.pipes.get(name);if(!pipe)throw new Error("Illegal State: Could not find pipe "+name+" in template of "+this.component);return this.getOutputVar(pipe)},ViewBuilder.prototype.preprocessUpdateExpression=function(expression){var _this=this;return{sourceSpan:expression.sourceSpan,context:expression.context,value:convertPropertyBindingBuiltins({createLiteralArrayConverter:function(argCount){return function(args){var arr=literalArr(args);return _this.options.fullTemplateTypeCheck?arr:arr.cast(DYNAMIC_TYPE)}},createLiteralMapConverter:function(keys){return function(values){var map=literalMap(keys.map(function(k,i){return{key:k.key,value:values[i],quoted:k.quoted}}));return _this.options.fullTemplateTypeCheck?map:map.cast(DYNAMIC_TYPE)}},createPipeConverter:function(name,argCount){return function(args){return(_this.options.fullTemplateTypeCheck?variable(_this.pipeOutputVar(name)):variable(_this.getOutputVar(BuiltinTypeName.Dynamic))).callMethod("transform",args)}}},expression.value)}},ViewBuilder.prototype.visitNgContent=function(ast,context){},ViewBuilder.prototype.visitText=function(ast,context){},ViewBuilder.prototype.visitDirectiveProperty=function(ast,context){},ViewBuilder.prototype.visitReference=function(ast,context){},ViewBuilder.prototype.visitVariable=function(ast,context){},ViewBuilder.prototype.visitEvent=function(ast,context){},ViewBuilder.prototype.visitElementProperty=function(ast,context){},ViewBuilder.prototype.visitAttr=function(ast,context){},ViewBuilder}(),CLASS_ATTR$1="class",STYLE_ATTR="style",ViewCompileResult=function ViewCompileResult(viewClassVar,rendererTypeVar){this.viewClassVar=viewClassVar,this.rendererTypeVar=rendererTypeVar},ViewCompiler=function(){function ViewCompiler(_reflector){this._reflector=_reflector}return ViewCompiler.prototype.compileComponent=function(outputCtx,component,template,styles,usedPipes){var _a,_this=this,embeddedViewCount=0,staticQueryIds=function findStaticQueryIds(nodes,result){void 0===result&&(result=new Map);nodes.forEach(function(node){var staticQueryIds=new Set,dynamicQueryIds=new Set,queryMatches=void 0;node instanceof ElementAst?(findStaticQueryIds(node.children,result),node.children.forEach(function(child){var childData=result.get(child);childData.staticQueryIds.forEach(function(queryId){return staticQueryIds.add(queryId)}),childData.dynamicQueryIds.forEach(function(queryId){return dynamicQueryIds.add(queryId)})}),queryMatches=node.queryMatches):node instanceof EmbeddedTemplateAst&&(findStaticQueryIds(node.children,result),node.children.forEach(function(child){var childData=result.get(child);childData.staticQueryIds.forEach(function(queryId){return dynamicQueryIds.add(queryId)}),childData.dynamicQueryIds.forEach(function(queryId){return dynamicQueryIds.add(queryId)})}),queryMatches=node.queryMatches),queryMatches&&queryMatches.forEach(function(match){return staticQueryIds.add(match.queryId)}),dynamicQueryIds.forEach(function(queryId){return staticQueryIds.delete(queryId)}),result.set(node,{staticQueryIds:staticQueryIds,dynamicQueryIds:dynamicQueryIds})});return result}(template),renderComponentVarName=void 0;if(!component.isHost){var template_1=component.template,customRenderData=[];template_1.animations&&template_1.animations.length&&customRenderData.push(new LiteralMapEntry("animation",convertValueToOutputAst(outputCtx,template_1.animations),!0));var renderComponentVar=variable(rendererTypeName(component.type.reference));renderComponentVarName=renderComponentVar.name,outputCtx.statements.push(renderComponentVar.set(importExpr(Identifiers.createRendererType2).callFn([new LiteralMapExpr([new LiteralMapEntry("encapsulation",literal(template_1.encapsulation),!1),new LiteralMapEntry("styles",styles,!1),new LiteralMapEntry("data",new LiteralMapExpr(customRenderData),!1)])])).toDeclStmt(importType(Identifiers.RendererType2),[StmtModifier.Final,StmtModifier.Exported]))}var viewBuilderFactory=function(parent){var embeddedViewIndex=embeddedViewCount++;return new ViewBuilder$1(_this._reflector,outputCtx,parent,component,embeddedViewIndex,usedPipes,staticQueryIds,viewBuilderFactory)},visitor=viewBuilderFactory(null);return visitor.visitAll([],template),(_a=outputCtx.statements).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(visitor.build())),new ViewCompileResult(visitor.viewName,renderComponentVarName)},ViewCompiler}(),LOG_VAR$1=variable("_l"),VIEW_VAR=variable("_v"),CHECK_VAR=variable("_ck"),COMP_VAR=variable("_co"),EVENT_NAME_VAR=variable("en"),ALLOW_DEFAULT_VAR=variable("ad"),ViewBuilder$1=function(){function ViewBuilder(reflector,outputCtx,parent,component,embeddedViewIndex,usedPipes,staticQueryIds,viewBuilderFactory){this.reflector=reflector,this.outputCtx=outputCtx,this.parent=parent,this.component=component,this.embeddedViewIndex=embeddedViewIndex,this.usedPipes=usedPipes,this.staticQueryIds=staticQueryIds,this.viewBuilderFactory=viewBuilderFactory,this.nodes=[],this.purePipeNodeIndices=Object.create(null),this.refNodeIndices=Object.create(null),this.variables=[],this.children=[],this.compType=this.embeddedViewIndex>0?DYNAMIC_TYPE:expressionType(outputCtx.importExpr(this.component.type.reference)),this.viewName=viewClassName(this.component.type.reference,this.embeddedViewIndex)}return ViewBuilder.prototype.visitAll=function(variables,astNodes){var _this=this;if(this.variables=variables,this.parent||this.usedPipes.forEach(function(pipe){pipe.pure&&(_this.purePipeNodeIndices[pipe.name]=_this._createPipe(null,pipe))}),!this.parent){var queryIds_1=function staticViewQueryIds(nodeStaticQueryIds){var staticQueryIds=new Set,dynamicQueryIds=new Set;return Array.from(nodeStaticQueryIds.values()).forEach(function(entry){entry.staticQueryIds.forEach(function(queryId){return staticQueryIds.add(queryId)}),entry.dynamicQueryIds.forEach(function(queryId){return dynamicQueryIds.add(queryId)})}),dynamicQueryIds.forEach(function(queryId){return staticQueryIds.delete(queryId)}),{staticQueryIds:staticQueryIds,dynamicQueryIds:dynamicQueryIds}}(this.staticQueryIds);this.component.viewQueries.forEach(function(query,queryIndex){var queryId=queryIndex+1,bindingType=query.first?0:1,flags=134217728|calcStaticDynamicQueryFlags(queryIds_1,queryId,query);_this.nodes.push(function(){return{sourceSpan:null,nodeFlags:flags,nodeDef:importExpr(Identifiers.queryDef).callFn([literal(flags),literal(queryId),new LiteralMapExpr([new LiteralMapEntry(query.propertyName,literal(bindingType),!1)])])}})})}templateVisitAll(this,astNodes),this.parent&&(0===astNodes.length||function needsAdditionalRootNode(astNodes){var lastAstNode=astNodes[astNodes.length-1];if(lastAstNode instanceof EmbeddedTemplateAst)return lastAstNode.hasViewContainer;if(lastAstNode instanceof ElementAst)return isNgContainer(lastAstNode.name)&&lastAstNode.children.length?needsAdditionalRootNode(lastAstNode.children):lastAstNode.hasViewContainer;return lastAstNode instanceof NgContentAst}(astNodes))&&this.nodes.push(function(){return{sourceSpan:null,nodeFlags:1,nodeDef:importExpr(Identifiers.anchorDef).callFn([literal(0),NULL_EXPR,NULL_EXPR,literal(0)])}})},ViewBuilder.prototype.build=function(targetStatements){void 0===targetStatements&&(targetStatements=[]),this.children.forEach(function(child){return child.build(targetStatements)});var _a=this._createNodeExpressions(),updateRendererStmts=_a.updateRendererStmts,updateDirectivesStmts=_a.updateDirectivesStmts,nodeDefExprs=_a.nodeDefExprs,updateRendererFn=this._createUpdateFn(updateRendererStmts),updateDirectivesFn=this._createUpdateFn(updateDirectivesStmts),viewFlags=0;this.parent||this.component.changeDetection!==ChangeDetectionStrategy.OnPush||(viewFlags|=2);var viewFactory=new DeclareFunctionStmt(this.viewName,[new FnParam(LOG_VAR$1.name)],[new ReturnStatement(importExpr(Identifiers.viewDef).callFn([literal(viewFlags),literalArr(nodeDefExprs),updateDirectivesFn,updateRendererFn]))],importType(Identifiers.ViewDefinition),0===this.embeddedViewIndex?[StmtModifier.Exported]:[]);return targetStatements.push(viewFactory),targetStatements},ViewBuilder.prototype._createUpdateFn=function(updateStmts){var updateFn;if(updateStmts.length>0){var preStmts=[];!this.component.isHost&&findReadVarNames(updateStmts).has(COMP_VAR.name)&&preStmts.push(COMP_VAR.set(VIEW_VAR.prop("component")).toDeclStmt(this.compType)),updateFn=fn([new FnParam(CHECK_VAR.name,INFERRED_TYPE),new FnParam(VIEW_VAR.name,INFERRED_TYPE)],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(preStmts,updateStmts),INFERRED_TYPE)}else updateFn=NULL_EXPR;return updateFn},ViewBuilder.prototype.visitNgContent=function(ast,context){this.nodes.push(function(){return{sourceSpan:ast.sourceSpan,nodeFlags:8,nodeDef:importExpr(Identifiers.ngContentDef).callFn([literal(ast.ngContentIndex),literal(ast.index)])}})},ViewBuilder.prototype.visitText=function(ast,context){this.nodes.push(function(){return{sourceSpan:ast.sourceSpan,nodeFlags:2,nodeDef:importExpr(Identifiers.textDef).callFn([literal(-1),literal(ast.ngContentIndex),literalArr([literal(ast.value)])])}})},ViewBuilder.prototype.visitBoundText=function(ast,context){var _this=this,nodeIndex=this.nodes.length;this.nodes.push(null);var inter=ast.value.ast,updateRendererExpressions=inter.expressions.map(function(expr,bindingIndex){return _this._preprocessUpdateExpression({nodeIndex:nodeIndex,bindingIndex:bindingIndex,sourceSpan:ast.sourceSpan,context:COMP_VAR,value:expr})}),checkIndex=nodeIndex;this.nodes[nodeIndex]=function(){return{sourceSpan:ast.sourceSpan,nodeFlags:2,nodeDef:importExpr(Identifiers.textDef).callFn([literal(checkIndex),literal(ast.ngContentIndex),literalArr(inter.strings.map(function(s){return literal(s)}))]),updateRenderer:updateRendererExpressions}}},ViewBuilder.prototype.visitEmbeddedTemplate=function(ast,context){var _this=this,nodeIndex=this.nodes.length;this.nodes.push(null);var _a=this._visitElementOrTemplate(nodeIndex,ast),flags=_a.flags,queryMatchesExpr=_a.queryMatchesExpr,hostEvents=_a.hostEvents,childVisitor=this.viewBuilderFactory(this);this.children.push(childVisitor),childVisitor.visitAll(ast.variables,ast.children);var childCount=this.nodes.length-nodeIndex-1;this.nodes[nodeIndex]=function(){return{sourceSpan:ast.sourceSpan,nodeFlags:1|flags,nodeDef:importExpr(Identifiers.anchorDef).callFn([literal(flags),queryMatchesExpr,literal(ast.ngContentIndex),literal(childCount),_this._createElementHandleEventFn(nodeIndex,hostEvents),variable(childVisitor.viewName)])}}},ViewBuilder.prototype.visitElement=function(ast,context){var _this=this,nodeIndex=this.nodes.length;this.nodes.push(null);var elName=isNgContainer(ast.name)?null:ast.name,_a=this._visitElementOrTemplate(nodeIndex,ast),flags=_a.flags,usedEvents=_a.usedEvents,queryMatchesExpr=_a.queryMatchesExpr,dirHostBindings=_a.hostBindings,hostEvents=_a.hostEvents,inputDefs=[],updateRendererExpressions=[],outputDefs=[];Eif(elName){var hostBindings=ast.inputs.map(function(inputAst){return{context:COMP_VAR,inputAst:inputAst,dirAst:null}}).concat(dirHostBindings);hostBindings.length&&(updateRendererExpressions=hostBindings.map(function(hostBinding,bindingIndex){return _this._preprocessUpdateExpression({context:hostBinding.context,nodeIndex:nodeIndex,bindingIndex:bindingIndex,sourceSpan:hostBinding.inputAst.sourceSpan,value:hostBinding.inputAst.value})}),inputDefs=hostBindings.map(function(hostBinding){return function elementBindingDef(inputAst,dirAst){var inputType=inputAst.type;switch(inputType){case 1:return literalArr([literal(1),literal(inputAst.name),literal(inputAst.securityContext)]);case 0:return literalArr([literal(8),literal(inputAst.name),literal(inputAst.securityContext)]);case 4:return literalArr([literal(8|(dirAst&&dirAst.directive.isComponent?32:16)),literal("@"+inputAst.name),literal(inputAst.securityContext)]);case 2:return literalArr([literal(2),literal(inputAst.name),NULL_EXPR]);case 3:return literalArr([literal(4),literal(inputAst.name),literal(inputAst.unit)]);default:throw new Error("unexpected "+inputType)}}(hostBinding.inputAst,hostBinding.dirAst)})),outputDefs=usedEvents.map(function(_a){var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(_a,2),target=_b[0],eventName=_b[1];return literalArr([literal(target),literal(eventName)])})}templateVisitAll(this,ast.children);var childCount=this.nodes.length-nodeIndex-1,compAst=ast.directives.find(function(dirAst){return dirAst.directive.isComponent}),compRendererType=NULL_EXPR,compView=NULL_EXPR;compAst&&(compView=this.outputCtx.importExpr(compAst.directive.componentViewType),compRendererType=this.outputCtx.importExpr(compAst.directive.rendererType));var checkIndex=nodeIndex;this.nodes[nodeIndex]=function(){return{sourceSpan:ast.sourceSpan,nodeFlags:1|flags,nodeDef:importExpr(Identifiers.elementDef).callFn([literal(checkIndex),literal(flags),queryMatchesExpr,literal(ast.ngContentIndex),literal(childCount),literal(elName),elName?fixedAttrsDef(ast):NULL_EXPR,inputDefs.length?literalArr(inputDefs):NULL_EXPR,outputDefs.length?literalArr(outputDefs):NULL_EXPR,_this._createElementHandleEventFn(nodeIndex,hostEvents),compView,compRendererType]),updateRenderer:updateRendererExpressions}}},ViewBuilder.prototype._visitElementOrTemplate=function(nodeIndex,ast){var _this=this,flags=0;ast.hasViewContainer&&(flags|=16777216);var usedEvents=new Map;ast.outputs.forEach(function(event){var _a=elementEventNameAndTarget(event,null),name=_a.name,target=_a.target;usedEvents.set(elementEventFullName(target,name),[target,name])}),ast.directives.forEach(function(dirAst){dirAst.hostEvents.forEach(function(event){var _a=elementEventNameAndTarget(event,dirAst),name=_a.name,target=_a.target;usedEvents.set(elementEventFullName(target,name),[target,name])})});var hostBindings=[],hostEvents=[];this._visitComponentFactoryResolverProvider(ast.directives),ast.providers.forEach(function(providerAst,providerIndex){var dirAst=void 0,dirIndex=void 0;Eif(ast.directives.forEach(function(localDirAst,i){localDirAst.directive.type.reference===tokenReference(providerAst.token)&&(dirAst=localDirAst,dirIndex=i)}),dirAst){var _a=_this._visitDirective(providerAst,dirAst,dirIndex,nodeIndex,ast.references,ast.queryMatches,usedEvents,_this.staticQueryIds.get(ast)),dirHostBindings=_a.hostBindings,dirHostEvents=_a.hostEvents;hostBindings.push.apply(hostBindings,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(dirHostBindings)),hostEvents.push.apply(hostEvents,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(dirHostEvents))}else _this._visitProvider(providerAst,ast.queryMatches)});var queryMatchExprs=[];return ast.queryMatches.forEach(function(match){var valueType=void 0;tokenReference(match.value)===_this.reflector.resolveExternalReference(Identifiers.ElementRef)?valueType=0:tokenReference(match.value)===_this.reflector.resolveExternalReference(Identifiers.ViewContainerRef)?valueType=3:tokenReference(match.value)===_this.reflector.resolveExternalReference(Identifiers.TemplateRef)&&(valueType=2),null!=valueType&&queryMatchExprs.push(literalArr([literal(match.queryId),literal(valueType)]))}),ast.references.forEach(function(ref){var valueType=void 0;ref.value?tokenReference(ref.value)===_this.reflector.resolveExternalReference(Identifiers.TemplateRef)&&(valueType=2):valueType=1,null!=valueType&&(_this.refNodeIndices[ref.name]=nodeIndex,queryMatchExprs.push(literalArr([literal(ref.name),literal(valueType)])))}),ast.outputs.forEach(function(outputAst){hostEvents.push({context:COMP_VAR,eventAst:outputAst,dirAst:null})}),{flags:flags,usedEvents:Array.from(usedEvents.values()),queryMatchesExpr:queryMatchExprs.length?literalArr(queryMatchExprs):NULL_EXPR,hostBindings:hostBindings,hostEvents:hostEvents}},ViewBuilder.prototype._visitDirective=function(providerAst,dirAst,directiveIndex,elementNodeIndex,refs,queryMatches,usedEvents,queryIds){var _this=this,nodeIndex=this.nodes.length;this.nodes.push(null),dirAst.directive.queries.forEach(function(query,queryIndex){var queryId=dirAst.contentQueryStartId+queryIndex,flags=67108864|calcStaticDynamicQueryFlags(queryIds,queryId,query),bindingType=query.first?0:1;_this.nodes.push(function(){return{sourceSpan:dirAst.sourceSpan,nodeFlags:flags,nodeDef:importExpr(Identifiers.queryDef).callFn([literal(flags),literal(queryId),new LiteralMapExpr([new LiteralMapEntry(query.propertyName,literal(bindingType),!1)])])}})});var childCount=this.nodes.length-nodeIndex-1,_a=this._visitProviderOrDirective(providerAst,queryMatches),flags=_a.flags,queryMatchExprs=_a.queryMatchExprs,providerExpr=_a.providerExpr,depsExpr=_a.depsExpr;refs.forEach(function(ref){ref.value&&tokenReference(ref.value)===tokenReference(providerAst.token)&&(_this.refNodeIndices[ref.name]=nodeIndex,queryMatchExprs.push(literalArr([literal(ref.name),literal(4)])))}),dirAst.directive.isComponent&&(flags|=32768);var inputDefs=dirAst.inputs.map(function(inputAst,inputIndex){var mapValue=literalArr([literal(inputIndex),literal(inputAst.directiveName)]);return new LiteralMapEntry(inputAst.directiveName,mapValue,!1)}),outputDefs=[],dirMeta=dirAst.directive;Object.keys(dirMeta.outputs).forEach(function(propName){var eventName=dirMeta.outputs[propName];usedEvents.has(eventName)&&outputDefs.push(new LiteralMapEntry(propName,literal(eventName),!1))});var updateDirectiveExpressions=[];(dirAst.inputs.length||(327680&flags)>0)&&(updateDirectiveExpressions=dirAst.inputs.map(function(input,bindingIndex){return _this._preprocessUpdateExpression({nodeIndex:nodeIndex,bindingIndex:bindingIndex,sourceSpan:input.sourceSpan,context:COMP_VAR,value:input.value})}));var dirContextExpr=importExpr(Identifiers.nodeValue).callFn([VIEW_VAR,literal(nodeIndex)]),hostBindings=dirAst.hostProperties.map(function(inputAst){return{context:dirContextExpr,dirAst:dirAst,inputAst:inputAst}}),hostEvents=dirAst.hostEvents.map(function(hostEventAst){return{context:dirContextExpr,eventAst:hostEventAst,dirAst:dirAst}}),checkIndex=nodeIndex;return this.nodes[nodeIndex]=function(){return{sourceSpan:dirAst.sourceSpan,nodeFlags:16384|flags,nodeDef:importExpr(Identifiers.directiveDef).callFn([literal(checkIndex),literal(flags),queryMatchExprs.length?literalArr(queryMatchExprs):NULL_EXPR,literal(childCount),providerExpr,depsExpr,inputDefs.length?new LiteralMapExpr(inputDefs):NULL_EXPR,outputDefs.length?new LiteralMapExpr(outputDefs):NULL_EXPR]),updateDirectives:updateDirectiveExpressions,directive:dirAst.directive.type}},{hostBindings:hostBindings,hostEvents:hostEvents}},ViewBuilder.prototype._visitProvider=function(providerAst,queryMatches){this._addProviderNode(this._visitProviderOrDirective(providerAst,queryMatches))},ViewBuilder.prototype._visitComponentFactoryResolverProvider=function(directives){var componentDirMeta=directives.find(function(dirAst){return dirAst.directive.isComponent});Iif(componentDirMeta&&componentDirMeta.directive.entryComponents.length){var _a=componentFactoryResolverProviderDef(this.reflector,this.outputCtx,8192,componentDirMeta.directive.entryComponents),providerExpr=_a.providerExpr,depsExpr=_a.depsExpr,flags=_a.flags,tokenExpr=_a.tokenExpr;this._addProviderNode({providerExpr:providerExpr,depsExpr:depsExpr,flags:flags,tokenExpr:tokenExpr,queryMatchExprs:[],sourceSpan:componentDirMeta.sourceSpan})}},ViewBuilder.prototype._addProviderNode=function(data){this.nodes.length;this.nodes.push(function(){return{sourceSpan:data.sourceSpan,nodeFlags:data.flags,nodeDef:importExpr(Identifiers.providerDef).callFn([literal(data.flags),data.queryMatchExprs.length?literalArr(data.queryMatchExprs):NULL_EXPR,data.tokenExpr,data.providerExpr,data.depsExpr])}})},ViewBuilder.prototype._visitProviderOrDirective=function(providerAst,queryMatches){var queryMatchExprs=[];queryMatches.forEach(function(match){tokenReference(match.value)===tokenReference(providerAst.token)&&queryMatchExprs.push(literalArr([literal(match.queryId),literal(4)]))});var _a=providerDef(this.outputCtx,providerAst),providerExpr=_a.providerExpr,depsExpr=_a.depsExpr,providerFlags=_a.flags,tokenExpr=_a.tokenExpr;return{flags:0|providerFlags,queryMatchExprs:queryMatchExprs,providerExpr:providerExpr,depsExpr:depsExpr,tokenExpr:tokenExpr,sourceSpan:providerAst.sourceSpan}},ViewBuilder.prototype.getLocal=function(name){Iif(name==EventHandlerVars.event.name)return EventHandlerVars.event;for(var currViewExpr=VIEW_VAR,currBuilder=this;currBuilder;currBuilder=currBuilder.parent,currViewExpr=currViewExpr.prop("parent").cast(DYNAMIC_TYPE)){var refNodeIndex=currBuilder.refNodeIndices[name];Iif(null!=refNodeIndex)return importExpr(Identifiers.nodeValue).callFn([currViewExpr,literal(refNodeIndex)]);var varAst=currBuilder.variables.find(function(varAst){return varAst.name===name});Iif(varAst){var varValue=varAst.value||"$implicit";return currViewExpr.prop("context").prop(varValue)}}return null},ViewBuilder.prototype.notifyImplicitReceiverUse=function(){},ViewBuilder.prototype._createLiteralArrayConverter=function(sourceSpan,argCount){if(0===argCount){var valueExpr_1=importExpr(Identifiers.EMPTY_ARRAY);return function(){return valueExpr_1}}var checkIndex=this.nodes.length;return this.nodes.push(function(){return{sourceSpan:sourceSpan,nodeFlags:32,nodeDef:importExpr(Identifiers.pureArrayDef).callFn([literal(checkIndex),literal(argCount)])}}),function(args){return callCheckStmt(checkIndex,args)}},ViewBuilder.prototype._createLiteralMapConverter=function(sourceSpan,keys){if(0===keys.length){var valueExpr_2=importExpr(Identifiers.EMPTY_MAP);return function(){return valueExpr_2}}var map=literalMap(keys.map(function(e,i){return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},e,{value:literal(i)})})),checkIndex=this.nodes.length;return this.nodes.push(function(){return{sourceSpan:sourceSpan,nodeFlags:64,nodeDef:importExpr(Identifiers.pureObjectDef).callFn([literal(checkIndex),map])}}),function(args){return callCheckStmt(checkIndex,args)}},ViewBuilder.prototype._createPipeConverter=function(expression,name,argCount){var pipe=this.usedPipes.find(function(pipeSummary){return pipeSummary.name===name});if(pipe.pure){var checkIndex_1=this.nodes.length;this.nodes.push(function(){return{sourceSpan:expression.sourceSpan,nodeFlags:128,nodeDef:importExpr(Identifiers.purePipeDef).callFn([literal(checkIndex_1),literal(argCount)])}});for(var compViewExpr=VIEW_VAR,compBuilder=this;compBuilder.parent;)compBuilder=compBuilder.parent,compViewExpr=compViewExpr.prop("parent").cast(DYNAMIC_TYPE);var pipeNodeIndex=compBuilder.purePipeNodeIndices[name],pipeValueExpr_1=importExpr(Identifiers.nodeValue).callFn([compViewExpr,literal(pipeNodeIndex)]);return function(args){return callUnwrapValue(expression.nodeIndex,expression.bindingIndex,callCheckStmt(checkIndex_1,[pipeValueExpr_1].concat(args)))}}var nodeIndex=this._createPipe(expression.sourceSpan,pipe),nodeValueExpr_1=importExpr(Identifiers.nodeValue).callFn([VIEW_VAR,literal(nodeIndex)]);return function(args){return callUnwrapValue(expression.nodeIndex,expression.bindingIndex,nodeValueExpr_1.callMethod("transform",args))}},ViewBuilder.prototype._createPipe=function(sourceSpan,pipe){var _this=this,nodeIndex=this.nodes.length,flags=0;pipe.type.lifecycleHooks.forEach(function(lifecycleHook){lifecycleHook===LifecycleHooks.OnDestroy&&(flags|=lifecycleHookToNodeFlag(lifecycleHook))});var depExprs=pipe.type.diDeps.map(function(diDep){return depDef(_this.outputCtx,diDep)});return this.nodes.push(function(){return{sourceSpan:sourceSpan,nodeFlags:16,nodeDef:importExpr(Identifiers.pipeDef).callFn([literal(flags),_this.outputCtx.importExpr(pipe.type.reference),literalArr(depExprs)])}}),nodeIndex},ViewBuilder.prototype._preprocessUpdateExpression=function(expression){var _this=this;return{nodeIndex:expression.nodeIndex,bindingIndex:expression.bindingIndex,sourceSpan:expression.sourceSpan,context:expression.context,value:convertPropertyBindingBuiltins({createLiteralArrayConverter:function(argCount){return _this._createLiteralArrayConverter(expression.sourceSpan,argCount)},createLiteralMapConverter:function(keys){return _this._createLiteralMapConverter(expression.sourceSpan,keys)},createPipeConverter:function(name,argCount){return _this._createPipeConverter(expression,name,argCount)}},expression.value)}},ViewBuilder.prototype._createNodeExpressions=function(){var self=this,updateBindingCount=0,updateRendererStmts=[],updateDirectivesStmts=[],nodeDefExprs=this.nodes.map(function(factory,nodeIndex){var _a=factory(),nodeDef=_a.nodeDef,nodeFlags=_a.nodeFlags,updateDirectives=_a.updateDirectives,updateRenderer=_a.updateRenderer,sourceSpan=_a.sourceSpan;return updateRenderer&&updateRendererStmts.push.apply(updateRendererStmts,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(createUpdateStatements(nodeIndex,sourceSpan,updateRenderer,!1))),updateDirectives&&updateDirectivesStmts.push.apply(updateDirectivesStmts,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(createUpdateStatements(nodeIndex,sourceSpan,updateDirectives,(327680&nodeFlags)>0))),applySourceSpanToExpressionIfNeeded(3&nodeFlags?new CommaExpr([LOG_VAR$1.callFn([]).callFn([]),nodeDef]):nodeDef,sourceSpan)});return{updateRendererStmts:updateRendererStmts,updateDirectivesStmts:updateDirectivesStmts,nodeDefExprs:nodeDefExprs};function createUpdateStatements(nodeIndex,sourceSpan,expressions,allowEmptyExprs){var updateStmts=[],exprs=expressions.map(function(_a){var sourceSpan=_a.sourceSpan,context=_a.context,value=_a.value,bindingId=""+updateBindingCount++,_b=convertPropertyBinding(context===COMP_VAR?self:null,context,value,bindingId,BindingForm.General),stmts=_b.stmts,currValExpr=_b.currValExpr;return updateStmts.push.apply(updateStmts,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(stmts.map(function(stmt){return applySourceSpanToStatementIfNeeded(stmt,sourceSpan)}))),applySourceSpanToExpressionIfNeeded(currValExpr,sourceSpan)});return(expressions.length||allowEmptyExprs)&&updateStmts.push(applySourceSpanToStatementIfNeeded(callCheckStmt(nodeIndex,exprs).toStmt(),sourceSpan)),updateStmts}},ViewBuilder.prototype._createElementHandleEventFn=function(nodeIndex,handlers){var handleEventFn,_this=this,handleEventStmts=[],handleEventBindingCount=0;if(handlers.forEach(function(_a){var context=_a.context,eventAst=_a.eventAst,dirAst=_a.dirAst,bindingId=""+handleEventBindingCount++,_b=convertActionBinding(context===COMP_VAR?_this:null,context,eventAst.handler,bindingId),stmts=_b.stmts,allowDefault=_b.allowDefault,trueStmts=stmts;allowDefault&&trueStmts.push(ALLOW_DEFAULT_VAR.set(allowDefault.and(ALLOW_DEFAULT_VAR)).toStmt());var _c=elementEventNameAndTarget(eventAst,dirAst),fullEventName=elementEventFullName(_c.target,_c.name);handleEventStmts.push(applySourceSpanToStatementIfNeeded(new IfStmt(literal(fullEventName).identical(EVENT_NAME_VAR),trueStmts),eventAst.sourceSpan))}),handleEventStmts.length>0){var preStmts=[ALLOW_DEFAULT_VAR.set(literal(!0)).toDeclStmt(BOOL_TYPE)];!this.component.isHost&&findReadVarNames(handleEventStmts).has(COMP_VAR.name)&&preStmts.push(COMP_VAR.set(VIEW_VAR.prop("component")).toDeclStmt(this.compType)),handleEventFn=fn([new FnParam(VIEW_VAR.name,INFERRED_TYPE),new FnParam(EVENT_NAME_VAR.name,INFERRED_TYPE),new FnParam(EventHandlerVars.event.name,INFERRED_TYPE)],Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(preStmts,handleEventStmts,[new ReturnStatement(ALLOW_DEFAULT_VAR)]),INFERRED_TYPE)}else handleEventFn=NULL_EXPR;return handleEventFn},ViewBuilder.prototype.visitDirective=function(ast,context){},ViewBuilder.prototype.visitDirectiveProperty=function(ast,context){},ViewBuilder.prototype.visitReference=function(ast,context){},ViewBuilder.prototype.visitVariable=function(ast,context){},ViewBuilder.prototype.visitEvent=function(ast,context){},ViewBuilder.prototype.visitElementProperty=function(ast,context){},ViewBuilder.prototype.visitAttr=function(ast,context){},ViewBuilder}();function fixedAttrsDef(elementAst){var mapResult=Object.create(null);return elementAst.attrs.forEach(function(attrAst){mapResult[attrAst.name]=attrAst.value}),elementAst.directives.forEach(function(dirAst){Object.keys(dirAst.directive.hostAttributes).forEach(function(name){var value=dirAst.directive.hostAttributes[name],prevValue=mapResult[name];mapResult[name]=null!=prevValue?function mergeAttributeValue(attrName,attrValue1,attrValue2){return attrName==CLASS_ATTR$1||attrName==STYLE_ATTR?attrValue1+" "+attrValue2:attrValue2}(name,prevValue,value):value})}),literalArr(Object.keys(mapResult).sort().map(function(attrName){return literalArr([literal(attrName),literal(mapResult[attrName])])}))}function callCheckStmt(nodeIndex,exprs){return exprs.length>10?CHECK_VAR.callFn([VIEW_VAR,literal(nodeIndex),literal(1),literalArr(exprs)]):CHECK_VAR.callFn(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([VIEW_VAR,literal(nodeIndex),literal(0)],exprs))}function callUnwrapValue(nodeIndex,bindingIdx,expr){return importExpr(Identifiers.unwrapValue).callFn([VIEW_VAR,literal(nodeIndex),literal(bindingIdx),expr])}function elementEventNameAndTarget(eventAst,dirAst){return eventAst.isAnimation?{name:"@"+eventAst.name+"."+eventAst.phase,target:dirAst&&dirAst.directive.isComponent?"component":null}:eventAst}function calcStaticDynamicQueryFlags(queryIds,queryId,query){var flags=0;return query.first&&function shouldResolveAsStaticQuery(queryIds,queryId,query){return query.static||null==query.static&&(queryIds.staticQueryIds.has(queryId)||!queryIds.dynamicQueryIds.has(queryId))}(queryIds,queryId,query)?flags|=268435456:flags|=536870912,flags}function elementEventFullName(target,name){return target?target+":"+name:name}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var MessageBundle=function(){function MessageBundle(_htmlParser,_implicitTags,_implicitAttrs,_locale){void 0===_locale&&(_locale=null),this._htmlParser=_htmlParser,this._implicitTags=_implicitTags,this._implicitAttrs=_implicitAttrs,this._locale=_locale,this._messages=[]}return MessageBundle.prototype.updateFromTemplate=function(html,url,interpolationConfig){var _a,htmlParserResult=this._htmlParser.parse(html,url,{tokenizeExpansionForms:!0,interpolationConfig:interpolationConfig});if(htmlParserResult.errors.length)return htmlParserResult.errors;var i18nParserResult=function extractMessages(nodes,interpolationConfig,implicitTags,implicitAttrs){return new _Visitor$2(implicitTags,implicitAttrs).extract(nodes,interpolationConfig)}(htmlParserResult.rootNodes,interpolationConfig,this._implicitTags,this._implicitAttrs);return i18nParserResult.errors.length?i18nParserResult.errors:((_a=this._messages).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(i18nParserResult.messages)),[])},MessageBundle.prototype.getMessages=function(){return this._messages},MessageBundle.prototype.write=function(serializer,filterSources){var messages={},mapperVisitor=new MapPlaceholderNames;this._messages.forEach(function(message){var _a,id=serializer.digest(message);messages.hasOwnProperty(id)?(_a=messages[id].sources).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(message.sources)):messages[id]=message});var msgList=Object.keys(messages).map(function(id){var mapper=serializer.createNameMapper(messages[id]),src=messages[id],nodes=mapper?mapperVisitor.convert(src.nodes,mapper):src.nodes,transformedMessage=new Message(nodes,{},{},src.meaning,src.description,id);return transformedMessage.sources=src.sources,filterSources&&transformedMessage.sources.forEach(function(source){return source.filePath=filterSources(source.filePath)}),transformedMessage});return serializer.write(msgList,this._locale)},MessageBundle}(),MapPlaceholderNames=function(_super){function MapPlaceholderNames(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(MapPlaceholderNames,_super),MapPlaceholderNames.prototype.convert=function(nodes,mapper){var _this=this;return mapper?nodes.map(function(n){return n.visit(_this,mapper)}):nodes},MapPlaceholderNames.prototype.visitTagPlaceholder=function(ph,mapper){var _this=this,startName=mapper.toPublicName(ph.startName),closeName=ph.closeName?mapper.toPublicName(ph.closeName):ph.closeName,children=ph.children.map(function(n){return n.visit(_this,mapper)});return new TagPlaceholder(ph.tag,ph.attrs,startName,closeName,children,ph.isVoid,ph.sourceSpan)},MapPlaceholderNames.prototype.visitPlaceholder=function(ph,mapper){return new Placeholder(ph.value,mapper.toPublicName(ph.name),ph.sourceSpan)},MapPlaceholderNames.prototype.visitIcuPlaceholder=function(ph,mapper){return new IcuPlaceholder(ph.value,mapper.toPublicName(ph.name),ph.sourceSpan)},MapPlaceholderNames}(CloneVisitor),GeneratedFile=function(){function GeneratedFile(srcFileUrl,genFileUrl,sourceOrStmts){this.srcFileUrl=srcFileUrl,this.genFileUrl=genFileUrl,"string"==typeof sourceOrStmts?(this.source=sourceOrStmts,this.stmts=null):(this.source=null,this.stmts=sourceOrStmts)}return GeneratedFile.prototype.isEquivalent=function(other){return this.genFileUrl===other.genFileUrl&&(this.source?this.source===other.source:null!=other.stmts&&areAllEquivalent(this.stmts,other.stmts))},GeneratedFile}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function listLazyRoutes(moduleMeta,reflector){var e_1,_a,e_2,_b,allLazyRoutes=[];try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(moduleMeta.transitiveModule.providers),_d=_c.next();!_d.done;_d=_c.next()){var _e=_d.value,provider=_e.provider,module=_e.module;if(tokenReference(provider.token)===reflector.ROUTES){var loadChildren=_collectLoadChildren(provider.useValue);try{for(var loadChildren_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(loadChildren),loadChildren_1_1=loadChildren_1.next();!loadChildren_1_1.done;loadChildren_1_1=loadChildren_1.next()){var route=loadChildren_1_1.value;allLazyRoutes.push(parseLazyRoute(route,reflector,module.reference))}}catch(e_2_1){e_2={error:e_2_1}}finally{try{loadChildren_1_1&&!loadChildren_1_1.done&&(_b=loadChildren_1.return)&&_b.call(loadChildren_1)}finally{if(e_2)throw e_2.error}}}}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_1)throw e_1.error}}return allLazyRoutes}function _collectLoadChildren(routes,target){var e_3,_a;if(void 0===target&&(target=[]),"string"==typeof routes)target.push(routes);else if(Array.isArray(routes))try{for(var routes_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(routes),routes_1_1=routes_1.next();!routes_1_1.done;routes_1_1=routes_1.next()){_collectLoadChildren(routes_1_1.value,target)}}catch(e_3_1){e_3={error:e_3_1}}finally{try{routes_1_1&&!routes_1_1.done&&(_a=routes_1.return)&&_a.call(routes_1)}finally{if(e_3)throw e_3.error}}else routes.loadChildren?_collectLoadChildren(routes.loadChildren,target):routes.children&&_collectLoadChildren(routes.children,target);return target}function parseLazyRoute(route,reflector,module){var _a=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.f)(route.split("#"),2),routePath=_a[0],routeName=_a[1],referencedModule=reflector.resolveExternalReference({moduleName:routePath,name:routeName},module?module.filePath:void 0);return{route:route,module:module||referencedModule,referencedModule:referencedModule}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var TS=/^(?!.*\.d\.ts$).*\.ts$/,ResolvedStaticSymbol=function ResolvedStaticSymbol(symbol,metadata){this.symbol=symbol,this.metadata=metadata},StaticSymbolResolver=function(){function StaticSymbolResolver(host,staticSymbolCache,summaryResolver,errorRecorder){this.host=host,this.staticSymbolCache=staticSymbolCache,this.summaryResolver=summaryResolver,this.errorRecorder=errorRecorder,this.metadataCache=new Map,this.resolvedSymbols=new Map,this.resolvedFilePaths=new Set,this.importAs=new Map,this.symbolResourcePaths=new Map,this.symbolFromFile=new Map,this.knownFileNameToModuleNames=new Map}return StaticSymbolResolver.prototype.resolveSymbol=function(staticSymbol){if(staticSymbol.members.length>0)return this._resolveSymbolMembers(staticSymbol);var resultFromSummary=this._resolveSymbolFromSummary(staticSymbol);if(resultFromSummary)return resultFromSummary;var resultFromCache=this.resolvedSymbols.get(staticSymbol);return resultFromCache||(this._createSymbolsOf(staticSymbol.filePath),this.resolvedSymbols.get(staticSymbol))},StaticSymbolResolver.prototype.getImportAs=function(staticSymbol,useSummaries){if(void 0===useSummaries&&(useSummaries=!0),staticSymbol.members.length){var baseSymbol=this.getStaticSymbol(staticSymbol.filePath,staticSymbol.name);return(baseImportAs=this.getImportAs(baseSymbol,useSummaries))?this.getStaticSymbol(baseImportAs.filePath,baseImportAs.name,staticSymbol.members):null}var summarizedFileName=function stripSummaryForJitFileSuffix(filePath){return filePath.replace(JIT_SUMMARY_FILE,".")}(staticSymbol.filePath);if(summarizedFileName!==staticSymbol.filePath){var baseImportAs,summarizedName=function stripSummaryForJitNameSuffix(symbolName){return symbolName.replace(JIT_SUMMARY_NAME,"")}(staticSymbol.name);baseSymbol=this.getStaticSymbol(summarizedFileName,summarizedName,staticSymbol.members);return(baseImportAs=this.getImportAs(baseSymbol,useSummaries))?this.getStaticSymbol(summaryForJitFileName(baseImportAs.filePath),summaryForJitName(baseImportAs.name),baseSymbol.members):null}var result=useSummaries&&this.summaryResolver.getImportAs(staticSymbol)||null;return result||(result=this.importAs.get(staticSymbol)),result},StaticSymbolResolver.prototype.getResourcePath=function(staticSymbol){return this.symbolResourcePaths.get(staticSymbol)||staticSymbol.filePath},StaticSymbolResolver.prototype.getTypeArity=function(staticSymbol){if(function isGeneratedFile(filePath){return GENERATED_FILE.test(filePath)}(staticSymbol.filePath))return null;for(var resolvedSymbol=unwrapResolvedMetadata(this.resolveSymbol(staticSymbol));resolvedSymbol&&resolvedSymbol.metadata instanceof StaticSymbol;)resolvedSymbol=unwrapResolvedMetadata(this.resolveSymbol(resolvedSymbol.metadata));return resolvedSymbol&&resolvedSymbol.metadata&&resolvedSymbol.metadata.arity||null},StaticSymbolResolver.prototype.getKnownModuleName=function(filePath){return this.knownFileNameToModuleNames.get(filePath)||null},StaticSymbolResolver.prototype.recordImportAs=function(sourceSymbol,targetSymbol){sourceSymbol.assertNoMembers(),targetSymbol.assertNoMembers(),this.importAs.set(sourceSymbol,targetSymbol)},StaticSymbolResolver.prototype.recordModuleNameForFileName=function(fileName,moduleName){this.knownFileNameToModuleNames.set(fileName,moduleName)},StaticSymbolResolver.prototype.invalidateFile=function(fileName){var e_1,_a;this.metadataCache.delete(fileName),this.resolvedFilePaths.delete(fileName);var symbols=this.symbolFromFile.get(fileName);if(symbols){this.symbolFromFile.delete(fileName);try{for(var symbols_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(symbols),symbols_1_1=symbols_1.next();!symbols_1_1.done;symbols_1_1=symbols_1.next()){var symbol=symbols_1_1.value;this.resolvedSymbols.delete(symbol),this.importAs.delete(symbol),this.symbolResourcePaths.delete(symbol)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{symbols_1_1&&!symbols_1_1.done&&(_a=symbols_1.return)&&_a.call(symbols_1)}finally{if(e_1)throw e_1.error}}}},StaticSymbolResolver.prototype.ignoreErrorsFor=function(cb){var recorder=this.errorRecorder;this.errorRecorder=function(){};try{return cb()}finally{this.errorRecorder=recorder}},StaticSymbolResolver.prototype._resolveSymbolMembers=function(staticSymbol){var members=staticSymbol.members,baseResolvedSymbol=this.resolveSymbol(this.getStaticSymbol(staticSymbol.filePath,staticSymbol.name));if(!baseResolvedSymbol)return null;var baseMetadata=unwrapResolvedMetadata(baseResolvedSymbol.metadata);if(baseMetadata instanceof StaticSymbol)return new ResolvedStaticSymbol(staticSymbol,this.getStaticSymbol(baseMetadata.filePath,baseMetadata.name,members));if(!baseMetadata||"class"!==baseMetadata.__symbolic){for(var value=baseMetadata,i=0;i<members.length&&value;i++)value=value[members[i]];return new ResolvedStaticSymbol(staticSymbol,value)}return baseMetadata.statics&&1===members.length?new ResolvedStaticSymbol(staticSymbol,baseMetadata.statics[members[0]]):null},StaticSymbolResolver.prototype._resolveSymbolFromSummary=function(staticSymbol){var summary=this.summaryResolver.resolveSummary(staticSymbol);return summary?new ResolvedStaticSymbol(staticSymbol,summary.metadata):null},StaticSymbolResolver.prototype.getStaticSymbol=function(declarationFile,name,members){return this.staticSymbolCache.get(declarationFile,name,members)},StaticSymbolResolver.prototype.hasDecorators=function(filePath){var metadata=this.getModuleMetadata(filePath);return!!metadata.metadata&&Object.keys(metadata.metadata).some(function(metadataKey){var entry=metadata.metadata[metadataKey];return entry&&"class"===entry.__symbolic&&entry.decorators})},StaticSymbolResolver.prototype.getSymbolsOf=function(filePath){var summarySymbols=this.summaryResolver.getSymbolsOf(filePath);if(summarySymbols)return summarySymbols;this._createSymbolsOf(filePath);var metadataSymbols=[];return this.resolvedSymbols.forEach(function(resolvedSymbol){resolvedSymbol.symbol.filePath===filePath&&metadataSymbols.push(resolvedSymbol.symbol)}),metadataSymbols},StaticSymbolResolver.prototype._createSymbolsOf=function(filePath){var e_2,_a,_this=this;if(!this.resolvedFilePaths.has(filePath)){this.resolvedFilePaths.add(filePath);var resolvedSymbols=[],metadata=this.getModuleMetadata(filePath);if(metadata.importAs&&this.knownFileNameToModuleNames.set(filePath,metadata.importAs),metadata.exports){var _loop_1=function(moduleExport){if(moduleExport.export)moduleExport.export.forEach(function(exportSymbol){var symbolName,symName=symbolName=unescapeIdentifier(symbolName="string"==typeof exportSymbol?exportSymbol:exportSymbol.as);"string"!=typeof exportSymbol&&(symName=unescapeIdentifier(exportSymbol.name));var resolvedModule=_this.resolveModule(moduleExport.from,filePath);if(resolvedModule){var targetSymbol=_this.getStaticSymbol(resolvedModule,symName),sourceSymbol=_this.getStaticSymbol(filePath,symbolName);resolvedSymbols.push(_this.createExport(sourceSymbol,targetSymbol))}});else{var resolvedModule=this_1.resolveModule(moduleExport.from,filePath);if(resolvedModule)this_1.getSymbolsOf(resolvedModule).forEach(function(targetSymbol){var sourceSymbol=_this.getStaticSymbol(filePath,targetSymbol.name);resolvedSymbols.push(_this.createExport(sourceSymbol,targetSymbol))})}},this_1=this;try{for(var _b=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(metadata.exports),_c=_b.next();!_c.done;_c=_b.next()){_loop_1(_c.value)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}}if(metadata.metadata){var topLevelSymbolNames_1=new Set(Object.keys(metadata.metadata).map(unescapeIdentifier)),origins_1=metadata.origins||{};Object.keys(metadata.metadata).forEach(function(metadataKey){var symbolMeta=metadata.metadata[metadataKey],name=unescapeIdentifier(metadataKey),symbol=_this.getStaticSymbol(filePath,name),origin=origins_1.hasOwnProperty(metadataKey)&&origins_1[metadataKey];if(origin){var originFilePath=_this.resolveModule(origin,filePath);originFilePath?_this.symbolResourcePaths.set(symbol,originFilePath):_this.reportError(new Error("Couldn't resolve original symbol for "+origin+" from "+_this.host.getOutputName(filePath)))}resolvedSymbols.push(_this.createResolvedSymbol(symbol,filePath,topLevelSymbolNames_1,symbolMeta))})}resolvedSymbols.forEach(function(resolvedSymbol){return _this.resolvedSymbols.set(resolvedSymbol.symbol,resolvedSymbol)}),this.symbolFromFile.set(filePath,resolvedSymbols.map(function(resolvedSymbol){return resolvedSymbol.symbol}))}},StaticSymbolResolver.prototype.createResolvedSymbol=function(sourceSymbol,topLevelPath,topLevelSymbolNames,metadata){var _originalFileMemo,_this=this,isTsFile=TS.test(sourceSymbol.filePath);if(this.summaryResolver.isLibraryFile(sourceSymbol.filePath)&&!isTsFile&&metadata&&"class"===metadata.__symbolic){var transformedMeta_1={__symbolic:"class",arity:metadata.arity};return new ResolvedStaticSymbol(sourceSymbol,transformedMeta_1)}var getOriginalName=function(){return _originalFileMemo||(_originalFileMemo=_this.host.getOutputName(topLevelPath.replace(/((\.ts)|(\.d\.ts)|)$/,".ts").replace(/^.*node_modules[\/\\]/,""))),_originalFileMemo},self=this,transformedMeta=visitValue(metadata,new(function(_super){function ReferenceTransformer(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ReferenceTransformer,_super),ReferenceTransformer.prototype.visitStringMap=function(map,functionParams){var symbolic=map.__symbolic;if("function"===symbolic){var oldLen=functionParams.length;functionParams.push.apply(functionParams,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(map.parameters||[]));var result=_super.prototype.visitStringMap.call(this,map,functionParams);return functionParams.length=oldLen,result}if("reference"!==symbolic)return"error"===symbolic?Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},map,{fileName:getOriginalName()}):_super.prototype.visitStringMap.call(this,map,functionParams);var module=map.module,name_1=map.name?unescapeIdentifier(map.name):map.name;if(!name_1)return null;var filePath=void 0;return module?(filePath=self.resolveModule(module,sourceSymbol.filePath))?{__symbolic:"resolved",symbol:self.getStaticSymbol(filePath,name_1),line:map.line,character:map.character,fileName:getOriginalName()}:{__symbolic:"error",message:"Could not resolve "+module+" relative to "+self.host.getMetadataFor(sourceSymbol.filePath)+".",line:map.line,character:map.character,fileName:getOriginalName()}:functionParams.indexOf(name_1)>=0?{__symbolic:"reference",name:name_1}:topLevelSymbolNames.has(name_1)?self.getStaticSymbol(topLevelPath,name_1):void 0},ReferenceTransformer}(ValueTransformer)),[]),unwrappedTransformedMeta=unwrapResolvedMetadata(transformedMeta);return unwrappedTransformedMeta instanceof StaticSymbol?this.createExport(sourceSymbol,unwrappedTransformedMeta):new ResolvedStaticSymbol(sourceSymbol,transformedMeta)},StaticSymbolResolver.prototype.createExport=function(sourceSymbol,targetSymbol){return sourceSymbol.assertNoMembers(),targetSymbol.assertNoMembers(),this.summaryResolver.isLibraryFile(sourceSymbol.filePath)&&this.summaryResolver.isLibraryFile(targetSymbol.filePath)&&this.importAs.set(targetSymbol,this.getImportAs(sourceSymbol)||sourceSymbol),new ResolvedStaticSymbol(sourceSymbol,targetSymbol)},StaticSymbolResolver.prototype.reportError=function(error,context,path){if(!this.errorRecorder)throw error;this.errorRecorder(error,context&&context.filePath||path)},StaticSymbolResolver.prototype.getModuleMetadata=function(module){var moduleMetadata=this.metadataCache.get(module);if(!moduleMetadata){var moduleMetadatas=this.host.getMetadataFor(module);if(moduleMetadatas){var maxVersion_1=-1;moduleMetadatas.forEach(function(md){md&&md.version>maxVersion_1&&(maxVersion_1=md.version,moduleMetadata=md)})}if(moduleMetadata||(moduleMetadata={__symbolic:"module",version:4,module:module,metadata:{}}),4!=moduleMetadata.version){var errorMessage=2==moduleMetadata.version?"Unsupported metadata version "+moduleMetadata.version+" for module "+module+". This module should be compiled with a newer version of ngc":"Metadata version mismatch for module "+this.host.getOutputName(module)+", found version "+moduleMetadata.version+", expected 4";this.reportError(new Error(errorMessage))}this.metadataCache.set(module,moduleMetadata)}return moduleMetadata},StaticSymbolResolver.prototype.getSymbolByModule=function(module,symbolName,containingFile){var filePath=this.resolveModule(module,containingFile);return filePath?this.getStaticSymbol(filePath,symbolName):(this.reportError(new Error("Could not resolve module "+module+(containingFile?" relative to "+this.host.getOutputName(containingFile):""))),this.getStaticSymbol("ERROR:"+module,symbolName))},StaticSymbolResolver.prototype.resolveModule=function(module,containingFile){try{return this.host.moduleNameToFileName(module,containingFile)}catch(e){console.error("Could not resolve module '"+module+"' relative to file "+containingFile),this.reportError(e,void 0,containingFile)}return null},StaticSymbolResolver}();function unescapeIdentifier(identifier){return identifier.startsWith("___")?identifier.substr(1):identifier}function unwrapResolvedMetadata(metadata){return metadata&&"resolved"===metadata.__symbolic?metadata.symbol:metadata}function createSummaryForJitFunction(outputCtx,reference,value){var fnName=summaryForJitName(reference.name);outputCtx.statements.push(fn([],[new ReturnStatement(value)],new ArrayType(DYNAMIC_TYPE)).toDeclStmt(fnName,[StmtModifier.Final,StmtModifier.Exported]))}var ToJsonSerializer=function(_super){function ToJsonSerializer(symbolResolver,summaryResolver,srcFileName){var _this=_super.call(this)||this;return _this.symbolResolver=symbolResolver,_this.summaryResolver=summaryResolver,_this.srcFileName=srcFileName,_this.symbols=[],_this.indexBySymbol=new Map,_this.reexportedBy=new Map,_this.processedSummaryBySymbol=new Map,_this.processedSummaries=[],_this.unprocessedSymbolSummariesBySymbol=new Map,_this.moduleName=symbolResolver.getKnownModuleName(srcFileName),_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(ToJsonSerializer,_super),ToJsonSerializer.prototype.addSummary=function(summary){var _this=this,unprocessedSummary=this.unprocessedSymbolSummariesBySymbol.get(summary.symbol),processedSummary=this.processedSummaryBySymbol.get(summary.symbol);if(unprocessedSummary||(unprocessedSummary={symbol:summary.symbol,metadata:void 0},this.unprocessedSymbolSummariesBySymbol.set(summary.symbol,unprocessedSummary),processedSummary={symbol:this.processValue(summary.symbol,0)},this.processedSummaries.push(processedSummary),this.processedSummaryBySymbol.set(summary.symbol,processedSummary)),!unprocessedSummary.metadata&&summary.metadata){var metadata_1=summary.metadata||{};if("class"===metadata_1.__symbolic){var clone_1={};Object.keys(metadata_1).forEach(function(propName){"decorators"!==propName&&(clone_1[propName]=metadata_1[propName])}),metadata_1=clone_1}else isCall(metadata_1)&&(function isFunctionCall(metadata){return isCall(metadata)&&unwrapResolvedMetadata(metadata.expression)instanceof StaticSymbol}(metadata_1)||function isMethodCallOnVariable(metadata){return isCall(metadata)&&metadata.expression&&"select"===metadata.expression.__symbolic&&unwrapResolvedMetadata(metadata.expression.expression)instanceof StaticSymbol}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(metadata_1)||(metadata_1={__symbolic:"error",message:"Complex function calls are not supported."}));if(unprocessedSummary.metadata=metadata_1,processedSummary.metadata=this.processValue(metadata_1,1),metadata_1 instanceof StaticSymbol&&this.summaryResolver.isLibraryFile(metadata_1.filePath)){var declarationSymbol=this.symbols[this.indexBySymbol.get(metadata_1)];(function isLoweredSymbol(name){return LOWERED_SYMBOL.test(name)})(declarationSymbol.name)||this.reexportedBy.set(declarationSymbol,summary.symbol)}}if(!unprocessedSummary.type&&summary.type&&(unprocessedSummary.type=summary.type,processedSummary.type=this.processValue(summary.type,0),summary.type.summaryKind===CompileSummaryKind.NgModule)){var ngModuleSummary=summary.type;ngModuleSummary.exportedDirectives.concat(ngModuleSummary.exportedPipes).forEach(function(id){var symbol=id.reference;if(_this.summaryResolver.isLibraryFile(symbol.filePath)&&!_this.unprocessedSymbolSummariesBySymbol.has(symbol)){var summary_1=_this.summaryResolver.resolveSummary(symbol);summary_1&&_this.addSummary(summary_1)}})}},ToJsonSerializer.prototype.serialize=function(createExternalSymbolReexports){var _this=this,exportAs=[];return{json:JSON.stringify({moduleName:this.moduleName,summaries:this.processedSummaries,symbols:this.symbols.map(function(symbol,index){symbol.assertNoMembers();var importAs=void 0;if(_this.summaryResolver.isLibraryFile(symbol.filePath)){var reexportSymbol=_this.reexportedBy.get(symbol);if(reexportSymbol)importAs=_this.indexBySymbol.get(reexportSymbol);else if(createExternalSymbolReexports){var summary=_this.unprocessedSymbolSummariesBySymbol.get(symbol);summary&&summary.metadata&&"interface"===summary.metadata.__symbolic||(importAs=symbol.name+"_"+index,exportAs.push({symbol:symbol,exportAs:importAs}))}}return{__symbol:index,name:symbol.name,filePath:_this.summaryResolver.toSummaryFileName(symbol.filePath,_this.srcFileName),importAs:importAs}})}),exportAs:exportAs}},ToJsonSerializer.prototype.processValue=function(value,flags){return visitValue(value,this,flags)},ToJsonSerializer.prototype.visitOther=function(value,context){if(value instanceof StaticSymbol){var baseSymbol=this.symbolResolver.getStaticSymbol(value.filePath,value.name);return{__symbol:this.visitStaticSymbol(baseSymbol,context),members:value.members}}},ToJsonSerializer.prototype.visitStringMap=function(map,context){return"resolved"===map.__symbolic?visitValue(map.symbol,this,context):("error"===map.__symbolic&&(delete map.line,delete map.character),_super.prototype.visitStringMap.call(this,map,context))},ToJsonSerializer.prototype.visitStaticSymbol=function(baseSymbol,flags){var index=this.indexBySymbol.get(baseSymbol),summary=null;if(1&flags&&this.summaryResolver.isLibraryFile(baseSymbol.filePath)){if(this.unprocessedSymbolSummariesBySymbol.has(baseSymbol))return index;(summary=this.loadSummary(baseSymbol))&&summary.metadata instanceof StaticSymbol&&(index=this.visitStaticSymbol(summary.metadata,flags),summary=null)}else if(null!=index)return index;return null==index&&(index=this.symbols.length,this.symbols.push(baseSymbol)),this.indexBySymbol.set(baseSymbol,index),summary&&this.addSummary(summary),index},ToJsonSerializer.prototype.loadSummary=function(symbol){var summary=this.summaryResolver.resolveSummary(symbol);if(!summary){var resolvedSymbol=this.symbolResolver.resolveSymbol(symbol);resolvedSymbol&&(summary={symbol:resolvedSymbol.symbol,metadata:resolvedSymbol.metadata})}return summary},ToJsonSerializer}(ValueTransformer),ForJitSerializer=function(){function ForJitSerializer(outputCtx,symbolResolver,summaryResolver){this.outputCtx=outputCtx,this.symbolResolver=symbolResolver,this.summaryResolver=summaryResolver,this.data=[]}return ForJitSerializer.prototype.addSourceType=function(summary,metadata){this.data.push({summary:summary,metadata:metadata,isLibrary:!1})},ForJitSerializer.prototype.addLibType=function(summary){this.data.push({summary:summary,metadata:null,isLibrary:!0})},ForJitSerializer.prototype.serialize=function(exportAsArr){var e_1,_a,e_2,_b,e_3,_c,_this=this,exportAsBySymbol=new Map;try{for(var exportAsArr_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(exportAsArr),exportAsArr_1_1=exportAsArr_1.next();!exportAsArr_1_1.done;exportAsArr_1_1=exportAsArr_1.next()){var _d=exportAsArr_1_1.value,symbol=_d.symbol,exportAs=_d.exportAs;exportAsBySymbol.set(symbol,exportAs)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{exportAsArr_1_1&&!exportAsArr_1_1.done&&(_a=exportAsArr_1.return)&&_a.call(exportAsArr_1)}finally{if(e_1)throw e_1.error}}var ngModuleSymbols=new Set;try{for(var _e=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(this.data),_f=_e.next();!_f.done;_f=_e.next()){var _g=_f.value,summary=_g.summary,metadata=_g.metadata,isLibrary=_g.isLibrary;if(summary.summaryKind===CompileSummaryKind.NgModule){ngModuleSymbols.add(summary.type.reference);var modSummary=summary;try{for(var _h=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(modSummary.modules),_j=_h.next();!_j.done;_j=_h.next()){var mod=_j.value;ngModuleSymbols.add(mod.reference)}}catch(e_3_1){e_3={error:e_3_1}}finally{try{_j&&!_j.done&&(_c=_h.return)&&_c.call(_h)}finally{if(e_3)throw e_3.error}}}if(!isLibrary){summaryForJitName(summary.type.reference.name);createSummaryForJitFunction(this.outputCtx,summary.type.reference,this.serializeSummaryWithDeps(summary,metadata))}}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_f&&!_f.done&&(_b=_e.return)&&_b.call(_e)}finally{if(e_2)throw e_2.error}}ngModuleSymbols.forEach(function(ngModuleSymbol){if(_this.summaryResolver.isLibraryFile(ngModuleSymbol.filePath)){var jitExportAsName=summaryForJitName(exportAsBySymbol.get(ngModuleSymbol)||ngModuleSymbol.name);_this.outputCtx.statements.push(variable(jitExportAsName).set(_this.serializeSummaryRef(ngModuleSymbol)).toDeclStmt(null,[StmtModifier.Exported]))}})},ForJitSerializer.prototype.serializeSummaryWithDeps=function(summary,metadata){var _this=this,expressions=[this.serializeSummary(summary)],providers=[];if(metadata instanceof CompileNgModuleMetadata)expressions.push.apply(expressions,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(metadata.declaredDirectives.concat(metadata.declaredPipes).map(function(type){return type.reference}).concat(metadata.transitiveModule.modules.map(function(type){return type.reference}).filter(function(ref){return ref!==metadata.type.reference})).map(function(ref){return _this.serializeSummaryRef(ref)}))),providers=metadata.providers;else if(summary.summaryKind===CompileSummaryKind.Directive){var dirSummary=summary;providers=dirSummary.providers.concat(dirSummary.viewProviders)}return expressions.push.apply(expressions,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(providers.filter(function(provider){return!!provider.useClass}).map(function(provider){return _this.serializeSummary({summaryKind:CompileSummaryKind.Injectable,type:provider.useClass})}))),literalArr(expressions)},ForJitSerializer.prototype.serializeSummaryRef=function(typeSymbol){var jitImportedSymbol=this.symbolResolver.getStaticSymbol(summaryForJitFileName(typeSymbol.filePath),summaryForJitName(typeSymbol.name));return this.outputCtx.importExpr(jitImportedSymbol)},ForJitSerializer.prototype.serializeSummary=function(data){var outputCtx=this.outputCtx,Transformer=function(){function Transformer(){}return Transformer.prototype.visitArray=function(arr,context){var _this=this;return literalArr(arr.map(function(entry){return visitValue(entry,_this,context)}))},Transformer.prototype.visitStringMap=function(map,context){var _this=this;return new LiteralMapExpr(Object.keys(map).map(function(key){return new LiteralMapEntry(key,visitValue(map[key],_this,context),!1)}))},Transformer.prototype.visitPrimitive=function(value,context){return literal(value)},Transformer.prototype.visitOther=function(value,context){if(value instanceof StaticSymbol)return outputCtx.importExpr(value);throw new Error("Illegal State: Encountered value "+value)},Transformer}();return visitValue(data,new Transformer,null)},ForJitSerializer}(),FromJsonDeserializer=function(_super){function FromJsonDeserializer(symbolCache,summaryResolver){var _this=_super.call(this)||this;return _this.symbolCache=symbolCache,_this.summaryResolver=summaryResolver,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(FromJsonDeserializer,_super),FromJsonDeserializer.prototype.deserialize=function(libraryFileName,json){var _this=this,data=JSON.parse(json),allImportAs=[];this.symbols=data.symbols.map(function(serializedSymbol){return _this.symbolCache.get(_this.summaryResolver.fromSummaryFileName(serializedSymbol.filePath,libraryFileName),serializedSymbol.name)}),data.symbols.forEach(function(serializedSymbol,index){var symbol=_this.symbols[index],importAs=serializedSymbol.importAs;"number"==typeof importAs?allImportAs.push({symbol:symbol,importAs:_this.symbols[importAs]}):"string"==typeof importAs&&allImportAs.push({symbol:symbol,importAs:_this.symbolCache.get(ngfactoryFilePath(libraryFileName),importAs)})});var summaries=visitValue(data.summaries,this,null);return{moduleName:data.moduleName,summaries:summaries,importAs:allImportAs}},FromJsonDeserializer.prototype.visitStringMap=function(map,context){if("__symbol"in map){var baseSymbol=this.symbols[map.__symbol],members=map.members;return members.length?this.symbolCache.get(baseSymbol.filePath,baseSymbol.name,members):baseSymbol}return _super.prototype.visitStringMap.call(this,map,context)},FromJsonDeserializer}(ValueTransformer);function isCall(metadata){return metadata&&"call"===metadata.__symbolic}!function(){function AotCompiler(_config,_options,_host,reflector,_metadataResolver,_templateParser,_styleCompiler,_viewCompiler,_typeCheckCompiler,_ngModuleCompiler,_injectableCompiler,_outputEmitter,_summaryResolver,_symbolResolver){this._config=_config,this._options=_options,this._host=_host,this.reflector=reflector,this._metadataResolver=_metadataResolver,this._templateParser=_templateParser,this._styleCompiler=_styleCompiler,this._viewCompiler=_viewCompiler,this._typeCheckCompiler=_typeCheckCompiler,this._ngModuleCompiler=_ngModuleCompiler,this._injectableCompiler=_injectableCompiler,this._outputEmitter=_outputEmitter,this._summaryResolver=_summaryResolver,this._symbolResolver=_symbolResolver,this._templateAstCache=new Map,this._analyzedFiles=new Map,this._analyzedFilesForInjectables=new Map}AotCompiler.prototype.clearCache=function(){this._metadataResolver.clearCache()},AotCompiler.prototype.analyzeModulesSync=function(rootFiles){var _this=this,analyzeResult=analyzeAndValidateNgModules(rootFiles,this._host,this._symbolResolver,this._metadataResolver);return analyzeResult.ngModules.forEach(function(ngModule){return _this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference,!0)}),analyzeResult},AotCompiler.prototype.analyzeModulesAsync=function(rootFiles){var _this=this,analyzeResult=analyzeAndValidateNgModules(rootFiles,this._host,this._symbolResolver,this._metadataResolver);return Promise.all(analyzeResult.ngModules.map(function(ngModule){return _this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference,!1)})).then(function(){return analyzeResult})},AotCompiler.prototype._analyzeFile=function(fileName){var analyzedFile=this._analyzedFiles.get(fileName);return analyzedFile||(analyzedFile=analyzeFile(this._host,this._symbolResolver,this._metadataResolver,fileName),this._analyzedFiles.set(fileName,analyzedFile)),analyzedFile},AotCompiler.prototype._analyzeFileForInjectables=function(fileName){var analyzedFile=this._analyzedFilesForInjectables.get(fileName);return analyzedFile||(analyzedFile=function analyzeFileForInjectables(host,staticSymbolResolver,metadataResolver,fileName){var injectables=[],shallowModules=[];staticSymbolResolver.hasDecorators(fileName)&&staticSymbolResolver.getSymbolsOf(fileName).forEach(function(symbol){var symbolMeta=staticSymbolResolver.resolveSymbol(symbol).metadata;if(symbolMeta&&"error"!==symbolMeta.__symbolic&&"class"===symbolMeta.__symbolic)if(metadataResolver.isInjectable(symbol)){var injectable=metadataResolver.getInjectableMetadata(symbol,null,!1);injectable&&injectables.push(injectable)}else if(metadataResolver.isNgModule(symbol)){var module=metadataResolver.getShallowModuleMetadata(symbol);module&&shallowModules.push(module)}});return{fileName:fileName,injectables:injectables,shallowModules:shallowModules}}(this._host,this._symbolResolver,this._metadataResolver,fileName),this._analyzedFilesForInjectables.set(fileName,analyzedFile)),analyzedFile},AotCompiler.prototype.findGeneratedFileNames=function(fileName){var _this=this,genFileNames=[],file=this._analyzeFile(fileName);(this._options.allowEmptyCodegenFiles||file.directives.length||file.pipes.length||file.injectables.length||file.ngModules.length||file.exportsNonSourceFiles)&&(genFileNames.push(ngfactoryFilePath(file.fileName,!0)),this._options.enableSummariesForJit&&genFileNames.push(summaryForJitFileName(file.fileName,!0)));var fileSuffix=normalizeGenFileSuffix(splitTypescriptSuffix(file.fileName,!0)[1]);return file.directives.forEach(function(dirSymbol){var compMeta=_this._metadataResolver.getNonNormalizedDirectiveMetadata(dirSymbol).metadata;compMeta.isComponent&&compMeta.template.styleUrls.forEach(function(styleUrl){var normalizedUrl=_this._host.resourceNameToFileName(styleUrl,file.fileName);if(!normalizedUrl)throw syntaxError("Couldn't resolve resource "+styleUrl+" relative to "+file.fileName);var needsShim=(compMeta.template.encapsulation||_this._config.defaultEncapsulation)===ViewEncapsulation.Emulated;genFileNames.push(_stylesModuleUrl(normalizedUrl,needsShim,fileSuffix)),_this._options.allowEmptyCodegenFiles&&genFileNames.push(_stylesModuleUrl(normalizedUrl,!needsShim,fileSuffix))})}),genFileNames},AotCompiler.prototype.emitBasicStub=function(genFileName,originalFileName){var outputCtx=this._createOutputContext(genFileName);if(genFileName.endsWith(".ngfactory.ts")){if(!originalFileName)throw new Error("Assertion error: require the original file for .ngfactory.ts stubs. File: "+genFileName);var originalFile=this._analyzeFile(originalFileName);this._createNgFactoryStub(outputCtx,originalFile,1)}else if(genFileName.endsWith(".ngsummary.ts")){if(this._options.enableSummariesForJit){if(!originalFileName)throw new Error("Assertion error: require the original file for .ngsummary.ts stubs. File: "+genFileName);originalFile=this._analyzeFile(originalFileName);_createEmptyStub(outputCtx),originalFile.ngModules.forEach(function(ngModule){!function createForJitStub(outputCtx,reference){return createSummaryForJitFunction(outputCtx,reference,NULL_EXPR)}(outputCtx,ngModule.type.reference)})}}else genFileName.endsWith(".ngstyle.ts")&&_createEmptyStub(outputCtx);return this._codegenSourceModule("unknown",outputCtx)},AotCompiler.prototype.emitTypeCheckStub=function(genFileName,originalFileName){var originalFile=this._analyzeFile(originalFileName),outputCtx=this._createOutputContext(genFileName);return genFileName.endsWith(".ngfactory.ts")&&this._createNgFactoryStub(outputCtx,originalFile,2),outputCtx.statements.length>0?this._codegenSourceModule(originalFile.fileName,outputCtx):null},AotCompiler.prototype.loadFilesAsync=function(fileNames,tsFiles){var _this=this,files=fileNames.map(function(fileName){return _this._analyzeFile(fileName)}),loadingPromises=[];files.forEach(function(file){return file.ngModules.forEach(function(ngModule){return loadingPromises.push(_this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference,!1))})});var analyzedInjectables=tsFiles.map(function(tsFile){return _this._analyzeFileForInjectables(tsFile)});return Promise.all(loadingPromises).then(function(_){return{analyzedModules:mergeAndValidateNgFiles(files),analyzedInjectables:analyzedInjectables}})},AotCompiler.prototype.loadFilesSync=function(fileNames,tsFiles){var _this=this,files=fileNames.map(function(fileName){return _this._analyzeFile(fileName)});files.forEach(function(file){return file.ngModules.forEach(function(ngModule){return _this._metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference,!0)})});var analyzedInjectables=tsFiles.map(function(tsFile){return _this._analyzeFileForInjectables(tsFile)});return{analyzedModules:mergeAndValidateNgFiles(files),analyzedInjectables:analyzedInjectables}},AotCompiler.prototype._createNgFactoryStub=function(outputCtx,file,emitFlags){var _this=this,componentId=0;file.ngModules.forEach(function(ngModuleMeta,ngModuleIndex){_this._ngModuleCompiler.createStub(outputCtx,ngModuleMeta.type.reference);var externalReferences=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ngModuleMeta.transitiveModule.directives.map(function(d){return d.reference}),ngModuleMeta.transitiveModule.pipes.map(function(d){return d.reference}),ngModuleMeta.importedModules.map(function(m){return m.type.reference}),ngModuleMeta.exportedModules.map(function(m){return m.type.reference}),_this._externalIdentifierReferences([Identifiers.TemplateRef,Identifiers.ElementRef])),externalReferenceVars=new Map;externalReferences.forEach(function(ref,typeIndex){externalReferenceVars.set(ref,"_decl"+ngModuleIndex+"_"+typeIndex)}),externalReferenceVars.forEach(function(varName,reference){outputCtx.statements.push(variable(varName).set(NULL_EXPR.cast(DYNAMIC_TYPE)).toDeclStmt(expressionType(outputCtx.importExpr(reference,null,!1))))}),2&emitFlags&&ngModuleMeta.declaredDirectives.forEach(function(dirId){var compMeta=_this._metadataResolver.getDirectiveMetadata(dirId.reference);compMeta.isComponent&&(componentId++,_this._createTypeCheckBlock(outputCtx,compMeta.type.reference.name+"_Host_"+componentId,ngModuleMeta,_this._metadataResolver.getHostComponentMetadata(compMeta),[compMeta.type],externalReferenceVars),_this._createTypeCheckBlock(outputCtx,compMeta.type.reference.name+"_"+componentId,ngModuleMeta,compMeta,ngModuleMeta.transitiveModule.directives,externalReferenceVars))})}),0===outputCtx.statements.length&&_createEmptyStub(outputCtx)},AotCompiler.prototype._externalIdentifierReferences=function(references){var e_1,_a,result=[];try{for(var references_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(references),references_1_1=references_1.next();!references_1_1.done;references_1_1=references_1.next()){var reference=references_1_1.value,token=createTokenForExternalReference(this.reflector,reference);token.identifier&&result.push(token.identifier.reference)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{references_1_1&&!references_1_1.done&&(_a=references_1.return)&&_a.call(references_1)}finally{if(e_1)throw e_1.error}}return result},AotCompiler.prototype._createTypeCheckBlock=function(ctx,componentId,moduleMeta,compMeta,directives,externalReferenceVars){var _a,_b=this._parseTemplate(compMeta,moduleMeta,directives),parsedTemplate=_b.template,usedPipes=_b.pipes;(_a=ctx.statements).push.apply(_a,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._typeCheckCompiler.compileComponent(componentId,compMeta,parsedTemplate,usedPipes,externalReferenceVars,ctx)))},AotCompiler.prototype.emitMessageBundle=function(analyzeResult,locale){var _this=this,errors=[],htmlParser=new HtmlParser,messageBundle=new MessageBundle(htmlParser,[],{},locale);if(analyzeResult.files.forEach(function(file){var compMetas=[];file.directives.forEach(function(directiveType){var dirMeta=_this._metadataResolver.getDirectiveMetadata(directiveType);dirMeta&&dirMeta.isComponent&&compMetas.push(dirMeta)}),compMetas.forEach(function(compMeta){var html=compMeta.template.template,templateUrl=compMeta.template.templateUrl,interpolationConfig=InterpolationConfig.fromArray(compMeta.template.interpolation);errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(messageBundle.updateFromTemplate(html,templateUrl,interpolationConfig)))})}),errors.length)throw new Error(errors.map(function(e){return e.toString()}).join("\n"));return messageBundle},AotCompiler.prototype.emitAllPartialModules=function(_a,r3Files){var _this=this,ngModuleByPipeOrDirective=_a.ngModuleByPipeOrDirective,files=_a.files,contextMap=new Map,getContext=function(fileName){return contextMap.has(fileName)||contextMap.set(fileName,_this._createOutputContext(fileName)),contextMap.get(fileName)};return files.forEach(function(file){return _this._compilePartialModule(file.fileName,ngModuleByPipeOrDirective,file.directives,file.pipes,file.ngModules,file.injectables,getContext(file.fileName))}),r3Files.forEach(function(file){return _this._compileShallowModules(file.fileName,file.shallowModules,getContext(file.fileName))}),Array.from(contextMap.values()).map(function(context){return{fileName:context.genFilePath,statements:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(context.constantPool.statements,context.statements)}})},AotCompiler.prototype._compileShallowModules=function(fileName,shallowModules,context){var _this=this;shallowModules.forEach(function(module){return function compileNgModuleFromRender2(ctx,ngModule,injectableCompiler){var className=identifierName(ngModule.type),rawImports=ngModule.rawImports?[ngModule.rawImports]:[],rawExports=ngModule.rawExports?[ngModule.rawExports]:[],injectorDefArg=mapLiteral({factory:injectableCompiler.factoryFor({type:ngModule.type,symbol:ngModule.type.reference},ctx),providers:convertMetaToOutput(ngModule.rawProviders,ctx),imports:convertMetaToOutput(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(rawImports,rawExports),ctx)}),injectorDef=importExpr(Identifiers$1.defineInjector).callFn([injectorDefArg]);ctx.statements.push(new ClassStmt(className,null,[new ClassField("ngInjectorDef",INFERRED_TYPE,[StmtModifier.Static],injectorDef)],[],new ClassMethod(null,[],[]),[]))}(context,module,_this._injectableCompiler)})},AotCompiler.prototype._compilePartialModule=function(fileName,ngModuleByPipeOrDirective,directives,pipes,ngModules,injectables,context){var _this=this,schemaRegistry=new DomElementSchemaRegistry,hostBindingParser=new BindingParser(this._templateParser.expressionParser,DEFAULT_INTERPOLATION_CONFIG,schemaRegistry,[],[]);directives.forEach(function(directiveType){var directiveMetadata=_this._metadataResolver.getDirectiveMetadata(directiveType);if(directiveMetadata.isComponent){var module=ngModuleByPipeOrDirective.get(directiveType);module||error("Cannot determine the module for component '"+identifierName(directiveMetadata.type)+"'");var htmlAst=directiveMetadata.template.htmlAst;directiveMetadata.template.preserveWhitespaces||(htmlAst=removeWhitespaces(htmlAst));var render3Ast=htmlAstToRender3Ast(htmlAst.rootNodes,hostBindingParser),directiveTypeBySel_1=new Map;module.transitiveModule.directives.map(function(dir){return _this._metadataResolver.getDirectiveSummary(dir.reference)}).forEach(function(directive){directive.selector&&directiveTypeBySel_1.set(directive.selector,directive.type.reference)});var pipeTypeByName_1=new Map;module.transitiveModule.pipes.map(function(pipe){return _this._metadataResolver.getPipeSummary(pipe.reference)}).forEach(function(pipe){pipeTypeByName_1.set(pipe.name,pipe.type.reference)}),function compileComponentFromRender2(outputCtx,component,render3Ast,reflector,bindingParser,directiveTypeBySel,pipeTypeByName){var name=identifierName(component.type);name||error("Cannot resolver the name of "+component.type);var definitionField=outputCtx.constantPool.propertyNameOf(2),summary=component.toSummary(),res=compileComponentFromMetadata(Object(tslib__WEBPACK_IMPORTED_MODULE_0__.a)({},directiveMetadataFromGlobalMetadata(component,outputCtx,reflector),{selector:component.selector,template:{nodes:render3Ast.nodes},directives:[],pipes:typeMapToExpressionMap(pipeTypeByName,outputCtx),viewQueries:queriesFromGlobalMetadata(component.viewQueries,outputCtx),wrapDirectivesAndPipesInClosure:!1,styles:summary.template&&summary.template.styles||EMPTY_ARRAY,encapsulation:summary.template&&summary.template.encapsulation||ViewEncapsulation.Emulated,interpolation:DEFAULT_INTERPOLATION_CONFIG,animations:null,viewProviders:component.viewProviders.length>0?new WrappedNodeExpr(component.viewProviders):null,relativeContextFilePath:"",i18nUseExternalIds:!0}),outputCtx.constantPool,bindingParser);outputCtx.statements.push(new ClassStmt(name,null,[new ClassField(definitionField,INFERRED_TYPE,[StmtModifier.Static],res.expression)],[],new ClassMethod(null,[],[]),[]))}(context,directiveMetadata,render3Ast,_this.reflector,hostBindingParser,0,pipeTypeByName_1)}else!function compileDirectiveFromRender2(outputCtx,directive,reflector,bindingParser){var name=identifierName(directive.type);name||error("Cannot resolver the name of "+directive.type);var definitionField=outputCtx.constantPool.propertyNameOf(1),res=compileDirectiveFromMetadata(directiveMetadataFromGlobalMetadata(directive,outputCtx,reflector),outputCtx.constantPool,bindingParser);outputCtx.statements.push(new ClassStmt(name,null,[new ClassField(definitionField,INFERRED_TYPE,[StmtModifier.Static],res.expression)],[],new ClassMethod(null,[],[]),[]))}(context,directiveMetadata,_this.reflector,hostBindingParser)}),pipes.forEach(function(pipeType){var pipeMetadata=_this._metadataResolver.getPipeMetadata(pipeType);pipeMetadata&&function compilePipeFromRender2(outputCtx,pipe,reflector){var name=identifierName(pipe.type);if(!name)return error("Cannot resolve the name of "+pipe.type);var res=compilePipeFromMetadata({name:name,pipeName:pipe.name,type:outputCtx.importExpr(pipe.type.reference),typeArgumentCount:0,deps:dependenciesFromGlobalMetadata(pipe.type,outputCtx,reflector),pure:pipe.pure}),definitionField=outputCtx.constantPool.propertyNameOf(3);outputCtx.statements.push(new ClassStmt(name,null,[new ClassField(definitionField,INFERRED_TYPE,[StmtModifier.Static],res.expression)],[],new ClassMethod(null,[],[]),[]))}(context,pipeMetadata,_this.reflector)}),injectables.forEach(function(injectable){return _this._injectableCompiler.compile(injectable,context)})},AotCompiler.prototype.emitAllPartialModules2=function(files){var _this=this;return files.reduce(function(r,file){return r.push.apply(r,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(_this._emitPartialModule2(file.fileName,file.injectables))),r},[])},AotCompiler.prototype._emitPartialModule2=function(fileName,injectables){var _this=this,context=this._createOutputContext(fileName);return injectables.forEach(function(injectable){return _this._injectableCompiler.compile(injectable,context)}),context.statements&&context.statements.length>0?[{fileName:fileName,statements:Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(context.constantPool.statements,context.statements)}]:[]},AotCompiler.prototype.emitAllImpls=function(analyzeResult){var _this=this,ngModuleByPipeOrDirective=analyzeResult.ngModuleByPipeOrDirective;return flatten(analyzeResult.files.map(function(file){return _this._compileImplFile(file.fileName,ngModuleByPipeOrDirective,file.directives,file.pipes,file.ngModules,file.injectables)}))},AotCompiler.prototype._compileImplFile=function(srcFileUrl,ngModuleByPipeOrDirective,directives,pipes,ngModules,injectables){var _this=this,fileSuffix=normalizeGenFileSuffix(splitTypescriptSuffix(srcFileUrl,!0)[1]),generatedFiles=[],outputCtx=this._createOutputContext(ngfactoryFilePath(srcFileUrl,!0));if(generatedFiles.push.apply(generatedFiles,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(this._createSummary(srcFileUrl,directives,pipes,ngModules,injectables,outputCtx))),ngModules.forEach(function(ngModuleMeta){return _this._compileModule(outputCtx,ngModuleMeta)}),directives.forEach(function(dirType){var compMeta=_this._metadataResolver.getDirectiveMetadata(dirType);if(compMeta.isComponent){var ngModule=ngModuleByPipeOrDirective.get(dirType);if(!ngModule)throw new Error("Internal Error: cannot determine the module for component "+identifierName(compMeta.type)+"!");var componentStylesheet=_this._styleCompiler.compileComponent(outputCtx,compMeta);compMeta.template.externalStylesheets.forEach(function(stylesheetMeta){var shim=_this._styleCompiler.needsStyleShim(compMeta);generatedFiles.push(_this._codegenStyles(srcFileUrl,compMeta,stylesheetMeta,shim,fileSuffix)),_this._options.allowEmptyCodegenFiles&&generatedFiles.push(_this._codegenStyles(srcFileUrl,compMeta,stylesheetMeta,!shim,fileSuffix))});_this._compileComponent(outputCtx,compMeta,ngModule,ngModule.transitiveModule.directives,componentStylesheet,fileSuffix);_this._compileComponentFactory(outputCtx,compMeta,ngModule,fileSuffix)}}),outputCtx.statements.length>0||this._options.allowEmptyCodegenFiles){var srcModule=this._codegenSourceModule(srcFileUrl,outputCtx);generatedFiles.unshift(srcModule)}return generatedFiles},AotCompiler.prototype._createSummary=function(srcFileName,directives,pipes,ngModules,injectables,ngFactoryCtx){var _this=this,symbolSummaries=this._symbolResolver.getSymbolsOf(srcFileName).map(function(symbol){return _this._symbolResolver.resolveSymbol(symbol)}),typeData=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ngModules.map(function(meta){return{summary:_this._metadataResolver.getNgModuleSummary(meta.type.reference),metadata:_this._metadataResolver.getNgModuleMetadata(meta.type.reference)}}),directives.map(function(ref){return{summary:_this._metadataResolver.getDirectiveSummary(ref),metadata:_this._metadataResolver.getDirectiveMetadata(ref)}}),pipes.map(function(ref){return{summary:_this._metadataResolver.getPipeSummary(ref),metadata:_this._metadataResolver.getPipeMetadata(ref)}}),injectables.map(function(ref){return{summary:_this._metadataResolver.getInjectableSummary(ref.symbol),metadata:_this._metadataResolver.getInjectableSummary(ref.symbol).type}})),forJitOutputCtx=this._options.enableSummariesForJit?this._createOutputContext(summaryForJitFileName(srcFileName,!0)):null,_a=function serializeSummaries(srcFileName,forJitCtx,summaryResolver,symbolResolver,symbols,types,createExternalSymbolReexports){void 0===createExternalSymbolReexports&&(createExternalSymbolReexports=!1);var toJsonSerializer=new ToJsonSerializer(symbolResolver,summaryResolver,srcFileName);symbols.forEach(function(resolvedSymbol){return toJsonSerializer.addSummary({symbol:resolvedSymbol.symbol,metadata:resolvedSymbol.metadata})}),types.forEach(function(_a){var summary=_a.summary;_a.metadata;toJsonSerializer.addSummary({symbol:summary.type.reference,metadata:void 0,type:summary})});var _a=toJsonSerializer.serialize(createExternalSymbolReexports),json=_a.json,exportAs=_a.exportAs;if(forJitCtx){var forJitSerializer_1=new ForJitSerializer(forJitCtx,symbolResolver,summaryResolver);types.forEach(function(_a){var summary=_a.summary,metadata=_a.metadata;forJitSerializer_1.addSourceType(summary,metadata)}),toJsonSerializer.unprocessedSymbolSummariesBySymbol.forEach(function(summary){summaryResolver.isLibraryFile(summary.symbol.filePath)&&summary.type&&forJitSerializer_1.addLibType(summary.type)}),forJitSerializer_1.serialize(exportAs)}return{json:json,exportAs:exportAs}}(srcFileName,forJitOutputCtx,this._summaryResolver,this._symbolResolver,symbolSummaries,typeData,this._options.createExternalSymbolFactoryReexports),json=_a.json;_a.exportAs.forEach(function(entry){ngFactoryCtx.statements.push(variable(entry.exportAs).set(ngFactoryCtx.importExpr(entry.symbol)).toDeclStmt(null,[StmtModifier.Exported]))});var result=[new GeneratedFile(srcFileName,summaryFileName(srcFileName),json)];return forJitOutputCtx&&result.push(this._codegenSourceModule(srcFileName,forJitOutputCtx)),result},AotCompiler.prototype._compileModule=function(outputCtx,ngModule){var providers=[];if(this._options.locale){var normalizedLocale=this._options.locale.replace(/_/g,"-");providers.push({token:createTokenForExternalReference(this.reflector,Identifiers.LOCALE_ID),useValue:normalizedLocale})}this._options.i18nFormat&&providers.push({token:createTokenForExternalReference(this.reflector,Identifiers.TRANSLATIONS_FORMAT),useValue:this._options.i18nFormat}),this._ngModuleCompiler.compile(outputCtx,ngModule,providers)},AotCompiler.prototype._compileComponentFactory=function(outputCtx,compMeta,ngModule,fileSuffix){var hostMeta=this._metadataResolver.getHostComponentMetadata(compMeta),hostViewFactoryVar=this._compileComponent(outputCtx,hostMeta,ngModule,[compMeta.type],null,fileSuffix).viewClassVar,compFactoryVar=componentFactoryName(compMeta.type.reference),inputsExprs=[];for(var propName in compMeta.inputs){var templateName=compMeta.inputs[propName];inputsExprs.push(new LiteralMapEntry(propName,literal(templateName),!1))}var outputsExprs=[];for(var propName in compMeta.outputs){templateName=compMeta.outputs[propName];outputsExprs.push(new LiteralMapEntry(propName,literal(templateName),!1))}outputCtx.statements.push(variable(compFactoryVar).set(importExpr(Identifiers.createComponentFactory).callFn([literal(compMeta.selector),outputCtx.importExpr(compMeta.type.reference),variable(hostViewFactoryVar),new LiteralMapExpr(inputsExprs),new LiteralMapExpr(outputsExprs),literalArr(compMeta.template.ngContentSelectors.map(function(selector){return literal(selector)}))])).toDeclStmt(importType(Identifiers.ComponentFactory,[expressionType(outputCtx.importExpr(compMeta.type.reference))],[TypeModifier.Const]),[StmtModifier.Final,StmtModifier.Exported]))},AotCompiler.prototype._compileComponent=function(outputCtx,compMeta,ngModule,directiveIdentifiers,componentStyles,fileSuffix){var _a=this._parseTemplate(compMeta,ngModule,directiveIdentifiers),parsedTemplate=_a.template,usedPipes=_a.pipes,stylesExpr=componentStyles?variable(componentStyles.stylesVar):literalArr([]),viewResult=this._viewCompiler.compileComponent(outputCtx,compMeta,parsedTemplate,stylesExpr,usedPipes);return componentStyles&&_resolveStyleStatements(this._symbolResolver,componentStyles,this._styleCompiler.needsStyleShim(compMeta),fileSuffix),viewResult},AotCompiler.prototype._parseTemplate=function(compMeta,ngModule,directiveIdentifiers){var _this=this;if(this._templateAstCache.has(compMeta.type.reference))return this._templateAstCache.get(compMeta.type.reference);var preserveWhitespaces=compMeta.template.preserveWhitespaces,directives=directiveIdentifiers.map(function(dir){return _this._metadataResolver.getDirectiveSummary(dir.reference)}),pipes=ngModule.transitiveModule.pipes.map(function(pipe){return _this._metadataResolver.getPipeSummary(pipe.reference)}),result=this._templateParser.parse(compMeta,compMeta.template.htmlAst,directives,pipes,ngModule.schemas,templateSourceUrl(ngModule.type,compMeta,compMeta.template),preserveWhitespaces);return this._templateAstCache.set(compMeta.type.reference,result),result},AotCompiler.prototype._createOutputContext=function(genFilePath){var _this=this;return{statements:[],genFilePath:genFilePath,importExpr:function(symbol,typeParams,useSummaries){if(void 0===typeParams&&(typeParams=null),void 0===useSummaries&&(useSummaries=!0),!(symbol instanceof StaticSymbol))throw new Error("Internal error: unknown identifier "+JSON.stringify(symbol));var arity=_this._symbolResolver.getTypeArity(symbol)||0,_a=_this._symbolResolver.getImportAs(symbol,useSummaries)||symbol,filePath=_a.filePath,name=_a.name,members=_a.members,importModule=_this._fileNameToModuleName(filePath,genFilePath),moduleName=importModule===_this._fileNameToModuleName(genFilePath,genFilePath)?null:importModule,suppliedTypeParams=typeParams||[],missingTypeParamsCount=arity-suppliedTypeParams.length,allTypeParams=suppliedTypeParams.concat(new Array(missingTypeParamsCount).fill(DYNAMIC_TYPE));return members.reduce(function(expr,memberName){return expr.prop(memberName)},importExpr(new ExternalReference(moduleName,name,null),allTypeParams))},constantPool:new ConstantPool}},AotCompiler.prototype._fileNameToModuleName=function(importedFilePath,containingFilePath){return this._summaryResolver.getKnownModuleName(importedFilePath)||this._symbolResolver.getKnownModuleName(importedFilePath)||this._host.fileNameToModuleName(importedFilePath,containingFilePath)},AotCompiler.prototype._codegenStyles=function(srcFileUrl,compMeta,stylesheetMetadata,isShimmed,fileSuffix){var outputCtx=this._createOutputContext(_stylesModuleUrl(stylesheetMetadata.moduleUrl,isShimmed,fileSuffix)),compiledStylesheet=this._styleCompiler.compileStyles(outputCtx,compMeta,stylesheetMetadata,isShimmed);return _resolveStyleStatements(this._symbolResolver,compiledStylesheet,isShimmed,fileSuffix),this._codegenSourceModule(srcFileUrl,outputCtx)},AotCompiler.prototype._codegenSourceModule=function(srcFileUrl,ctx){return new GeneratedFile(srcFileUrl,ctx.genFilePath,ctx.statements)},AotCompiler.prototype.listLazyRoutes=function(entryRoute,analyzedModules){var e_2,_a,e_3,_b,self=this;if(entryRoute)return function visitLazyRoute(symbol,seenRoutes,allLazyRoutes){var e_4,_a;void 0===seenRoutes&&(seenRoutes=new Set);void 0===allLazyRoutes&&(allLazyRoutes=[]);if(seenRoutes.has(symbol)||!symbol.name)return allLazyRoutes;seenRoutes.add(symbol);var lazyRoutes=listLazyRoutes(self._metadataResolver.getNgModuleMetadata(symbol,!0),self.reflector);try{for(var lazyRoutes_2=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(lazyRoutes),lazyRoutes_2_1=lazyRoutes_2.next();!lazyRoutes_2_1.done;lazyRoutes_2_1=lazyRoutes_2.next()){var lazyRoute=lazyRoutes_2_1.value;allLazyRoutes.push(lazyRoute),visitLazyRoute(lazyRoute.referencedModule,seenRoutes,allLazyRoutes)}}catch(e_4_1){e_4={error:e_4_1}}finally{try{lazyRoutes_2_1&&!lazyRoutes_2_1.done&&(_a=lazyRoutes_2.return)&&_a.call(lazyRoutes_2)}finally{if(e_4)throw e_4.error}}return allLazyRoutes}(parseLazyRoute(entryRoute,this.reflector).referencedModule);if(analyzedModules){var allLazyRoutes=[];try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(analyzedModules.ngModules),_d=_c.next();!_d.done;_d=_c.next()){var lazyRoutes=listLazyRoutes(_d.value,this.reflector);try{for(var lazyRoutes_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(lazyRoutes),lazyRoutes_1_1=lazyRoutes_1.next();!lazyRoutes_1_1.done;lazyRoutes_1_1=lazyRoutes_1.next()){var lazyRoute=lazyRoutes_1_1.value;allLazyRoutes.push(lazyRoute)}}catch(e_3_1){e_3={error:e_3_1}}finally{try{lazyRoutes_1_1&&!lazyRoutes_1_1.done&&(_b=lazyRoutes_1.return)&&_b.call(lazyRoutes_1)}finally{if(e_3)throw e_3.error}}}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_2)throw e_2.error}}return allLazyRoutes}throw new Error("Either route or analyzedModules has to be specified!")}}();function _createEmptyStub(outputCtx){outputCtx.statements.push(importExpr(Identifiers.ComponentFactory).toStmt())}function _resolveStyleStatements(symbolResolver,compileResult,needsShim,fileSuffix){compileResult.dependencies.forEach(function(dep){dep.setValue(symbolResolver.getStaticSymbol(_stylesModuleUrl(dep.moduleUrl,needsShim,fileSuffix),dep.name))})}function _stylesModuleUrl(stylesheetUrl,shim,suffix){return stylesheetUrl+(shim?".shim":"")+".ngstyle"+suffix}function analyzeNgModules(fileNames,host,staticSymbolResolver,metadataResolver){return mergeAnalyzedFiles(function _analyzeFilesIncludingNonProgramFiles(fileNames,host,staticSymbolResolver,metadataResolver){var seenFiles=new Set,files=[],visitFile=function(fileName){if(seenFiles.has(fileName)||!host.isSourceFile(fileName))return!1;seenFiles.add(fileName);var analyzedFile=analyzeFile(host,staticSymbolResolver,metadataResolver,fileName);files.push(analyzedFile),analyzedFile.ngModules.forEach(function(ngModule){ngModule.transitiveModule.modules.forEach(function(modMeta){return visitFile(modMeta.reference.filePath)})})};return fileNames.forEach(function(fileName){return visitFile(fileName)}),files}(fileNames,host,staticSymbolResolver,metadataResolver))}function analyzeAndValidateNgModules(fileNames,host,staticSymbolResolver,metadataResolver){return validateAnalyzedModules(analyzeNgModules(fileNames,host,staticSymbolResolver,metadataResolver))}function validateAnalyzedModules(analyzedModules){if(analyzedModules.symbolsMissingModule&&analyzedModules.symbolsMissingModule.length)throw syntaxError(analyzedModules.symbolsMissingModule.map(function(s){return"Cannot determine the module for class "+s.name+" in "+s.filePath+"! Add "+s.name+" to the NgModule to fix it."}).join("\n"));return analyzedModules}function analyzeFile(host,staticSymbolResolver,metadataResolver,fileName){var directives=[],pipes=[],injectables=[],ngModules=[],hasDecorators=staticSymbolResolver.hasDecorators(fileName),exportsNonSourceFiles=!1;return fileName.endsWith(".d.ts")&&!hasDecorators||staticSymbolResolver.getSymbolsOf(fileName).forEach(function(symbol){var symbolMeta=staticSymbolResolver.resolveSymbol(symbol).metadata;if(symbolMeta&&"error"!==symbolMeta.__symbolic){var isNgSymbol=!1;if("class"===symbolMeta.__symbolic)if(metadataResolver.isDirective(symbol))isNgSymbol=!0,directives.push(symbol);else if(metadataResolver.isPipe(symbol))isNgSymbol=!0,pipes.push(symbol);else if(metadataResolver.isNgModule(symbol)){var ngModule=metadataResolver.getNgModuleMetadata(symbol,!1);ngModule&&(isNgSymbol=!0,ngModules.push(ngModule))}else if(metadataResolver.isInjectable(symbol)){isNgSymbol=!0;var injectable=metadataResolver.getInjectableMetadata(symbol,null,!1);injectable&&injectables.push(injectable)}isNgSymbol||(exportsNonSourceFiles=exportsNonSourceFiles||function isValueExportingNonSourceFile(host,metadata){var exportsNonSourceFiles=!1,Visitor=function(){function Visitor(){}return Visitor.prototype.visitArray=function(arr,context){var _this=this;arr.forEach(function(v){return visitValue(v,_this,context)})},Visitor.prototype.visitStringMap=function(map,context){var _this=this;Object.keys(map).forEach(function(key){return visitValue(map[key],_this,context)})},Visitor.prototype.visitPrimitive=function(value,context){},Visitor.prototype.visitOther=function(value,context){value instanceof StaticSymbol&&!host.isSourceFile(value.filePath)&&(exportsNonSourceFiles=!0)},Visitor}();return visitValue(metadata,new Visitor,null),exportsNonSourceFiles}(host,symbolMeta))}}),{fileName:fileName,directives:directives,pipes:pipes,ngModules:ngModules,injectables:injectables,exportsNonSourceFiles:exportsNonSourceFiles}}function mergeAnalyzedFiles(analyzedFiles){var allNgModules=[],ngModuleByPipeOrDirective=new Map,allPipesAndDirectives=new Set;analyzedFiles.forEach(function(af){af.ngModules.forEach(function(ngModule){allNgModules.push(ngModule),ngModule.declaredDirectives.forEach(function(d){return ngModuleByPipeOrDirective.set(d.reference,ngModule)}),ngModule.declaredPipes.forEach(function(p){return ngModuleByPipeOrDirective.set(p.reference,ngModule)})}),af.directives.forEach(function(d){return allPipesAndDirectives.add(d)}),af.pipes.forEach(function(p){return allPipesAndDirectives.add(p)})});var symbolsMissingModule=[];return allPipesAndDirectives.forEach(function(ref){ngModuleByPipeOrDirective.has(ref)||symbolsMissingModule.push(ref)}),{ngModules:allNgModules,ngModuleByPipeOrDirective:ngModuleByPipeOrDirective,symbolsMissingModule:symbolsMissingModule,files:analyzedFiles}}function mergeAndValidateNgFiles(files){return validateAnalyzedModules(mergeAnalyzedFiles(files))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var FORMATTED_MESSAGE="ngFormattedMessage";function formatChain(chain,indent){if(void 0===indent&&(indent=0),!chain)return"";var position=chain.position?chain.position.fileName+"("+(chain.position.line+1)+","+(chain.position.column+1)+")":"",postfix=position&&0!==indent?" at "+position:"",message=""+(position&&0===indent?position+": ":"")+chain.message+postfix;return""+function indentStr(level){if(level<=0)return"";if(level<6)return[""," ","  ","   ","    ","     "][level];var half=indentStr(Math.floor(level/2));return half+half+(level%2==1?" ":"")}(indent)+message+(chain.next&&"\n"+formatChain(chain.next,indent+2)||"")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ANGULAR_CORE="@angular/core",HIDDEN_KEY=/^\$.*\$$/,IGNORE={__symbolic:"ignore"},USE_VALUE$1="useValue",PROVIDE="provide",REFERENCE_SET=new Set([USE_VALUE$1,"useFactory","data","id","loadChildren"]);function shouldIgnore(value){return value&&"ignore"==value.__symbolic}var StaticReflector=function(){function StaticReflector(summaryResolver,symbolResolver,knownMetadataClasses,knownMetadataFunctions,errorRecorder){var _this=this;void 0===knownMetadataClasses&&(knownMetadataClasses=[]),void 0===knownMetadataFunctions&&(knownMetadataFunctions=[]),this.summaryResolver=summaryResolver,this.symbolResolver=symbolResolver,this.errorRecorder=errorRecorder,this.annotationCache=new Map,this.shallowAnnotationCache=new Map,this.propertyCache=new Map,this.parameterCache=new Map,this.methodCache=new Map,this.staticCache=new Map,this.conversionMap=new Map,this.resolvedExternalReferences=new Map,this.annotationForParentClassWithSummaryKind=new Map,this.initializeConversionMap(),knownMetadataClasses.forEach(function(kc){return _this._registerDecoratorOrConstructor(_this.getStaticSymbol(kc.filePath,kc.name),kc.ctor)}),knownMetadataFunctions.forEach(function(kf){return _this._registerFunction(_this.getStaticSymbol(kf.filePath,kf.name),kf.fn)}),this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Directive,[createDirective,createComponent]),this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Pipe,[createPipe]),this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.NgModule,[createNgModule]),this.annotationForParentClassWithSummaryKind.set(CompileSummaryKind.Injectable,[createInjectable,createPipe,createDirective,createComponent,createNgModule])}return StaticReflector.prototype.componentModuleUrl=function(typeOrFunc){var staticSymbol=this.findSymbolDeclaration(typeOrFunc);return this.symbolResolver.getResourcePath(staticSymbol)},StaticReflector.prototype.resolveExternalReference=function(ref,containingFile){var key=void 0;if(!containingFile){key=ref.moduleName+":"+ref.name;var declarationSymbol_1=this.resolvedExternalReferences.get(key);if(declarationSymbol_1)return declarationSymbol_1}var refSymbol=this.symbolResolver.getSymbolByModule(ref.moduleName,ref.name,containingFile),declarationSymbol=this.findSymbolDeclaration(refSymbol);return containingFile||(this.symbolResolver.recordModuleNameForFileName(refSymbol.filePath,ref.moduleName),this.symbolResolver.recordImportAs(declarationSymbol,refSymbol)),key&&this.resolvedExternalReferences.set(key,declarationSymbol),declarationSymbol},StaticReflector.prototype.findDeclaration=function(moduleUrl,name,containingFile){return this.findSymbolDeclaration(this.symbolResolver.getSymbolByModule(moduleUrl,name,containingFile))},StaticReflector.prototype.tryFindDeclaration=function(moduleUrl,name,containingFile){var _this=this;return this.symbolResolver.ignoreErrorsFor(function(){return _this.findDeclaration(moduleUrl,name,containingFile)})},StaticReflector.prototype.findSymbolDeclaration=function(symbol){var resolvedSymbol=this.symbolResolver.resolveSymbol(symbol);if(resolvedSymbol){var resolvedMetadata=resolvedSymbol.metadata;if(resolvedMetadata&&"resolved"===resolvedMetadata.__symbolic&&(resolvedMetadata=resolvedMetadata.symbol),resolvedMetadata instanceof StaticSymbol)return this.findSymbolDeclaration(resolvedSymbol.metadata)}return symbol},StaticReflector.prototype.tryAnnotations=function(type){var originalRecorder=this.errorRecorder;this.errorRecorder=function(error,fileName){};try{return this.annotations(type)}finally{this.errorRecorder=originalRecorder}},StaticReflector.prototype.annotations=function(type){var _this=this;return this._annotations(type,function(type,decorators){return _this.simplify(type,decorators)},this.annotationCache)},StaticReflector.prototype.shallowAnnotations=function(type){var _this=this;return this._annotations(type,function(type,decorators){return _this.simplify(type,decorators,!0)},this.shallowAnnotationCache)},StaticReflector.prototype._annotations=function(type,simplify,annotationCache){var annotations=annotationCache.get(type);if(!annotations){annotations=[];var classMetadata=this.getTypeMetadata(type),parentType=this.findParentType(type,classMetadata);if(parentType){var parentAnnotations=this.annotations(parentType);annotations.push.apply(annotations,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(parentAnnotations))}var ownAnnotations_1=[];if(classMetadata.decorators&&(ownAnnotations_1=simplify(type,classMetadata.decorators))&&annotations.push.apply(annotations,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(ownAnnotations_1)),parentType&&!this.summaryResolver.isLibraryFile(type.filePath)&&this.summaryResolver.isLibraryFile(parentType.filePath)){var summary=this.summaryResolver.resolveSummary(parentType);if(summary&&summary.type){var requiredAnnotationTypes=this.annotationForParentClassWithSummaryKind.get(summary.type.summaryKind);requiredAnnotationTypes.some(function(requiredType){return ownAnnotations_1.some(function(ann){return requiredType.isTypeOf(ann)})})||this.reportError(formatMetadataError(metadataError("Class "+type.name+" in "+type.filePath+" extends from a "+CompileSummaryKind[summary.type.summaryKind]+" in another compilation unit without duplicating the decorator",void 0,"Please add a "+requiredAnnotationTypes.map(function(type){return type.ngMetadataName}).join(" or ")+" decorator to the class"),type),type)}}annotationCache.set(type,annotations.filter(function(ann){return!!ann}))}return annotations},StaticReflector.prototype.propMetadata=function(type){var _this=this,propMetadata=this.propertyCache.get(type);if(!propMetadata){var classMetadata=this.getTypeMetadata(type);propMetadata={};var parentType=this.findParentType(type,classMetadata);if(parentType){var parentPropMetadata_1=this.propMetadata(parentType);Object.keys(parentPropMetadata_1).forEach(function(parentProp){propMetadata[parentProp]=parentPropMetadata_1[parentProp]})}var members_1=classMetadata.members||{};Object.keys(members_1).forEach(function(propName){var prop=members_1[propName].find(function(a){return"property"==a.__symbolic||"method"==a.__symbolic}),decorators=[];propMetadata[propName]&&decorators.push.apply(decorators,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(propMetadata[propName])),propMetadata[propName]=decorators,prop&&prop.decorators&&decorators.push.apply(decorators,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(_this.simplify(type,prop.decorators)))}),this.propertyCache.set(type,propMetadata)}return propMetadata},StaticReflector.prototype.parameters=function(type){var _this=this;if(!(type instanceof StaticSymbol))return this.reportError(new Error("parameters received "+JSON.stringify(type)+" which is not a StaticSymbol"),type),[];try{var parameters_1=this.parameterCache.get(type);if(!parameters_1){var classMetadata=this.getTypeMetadata(type),parentType=this.findParentType(type,classMetadata),members=classMetadata?classMetadata.members:null,ctorData=members?members.__ctor__:null;if(ctorData){var ctor=ctorData.find(function(a){return"constructor"==a.__symbolic}),rawParameterTypes=ctor.parameters||[],parameterDecorators_1=this.simplify(type,ctor.parameterDecorators||[]);parameters_1=[],rawParameterTypes.forEach(function(rawParamType,index){var nestedResult=[],paramType=_this.trySimplify(type,rawParamType);paramType&&nestedResult.push(paramType);var decorators=parameterDecorators_1?parameterDecorators_1[index]:null;decorators&&nestedResult.push.apply(nestedResult,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(decorators)),parameters_1.push(nestedResult)})}else parentType&&(parameters_1=this.parameters(parentType));parameters_1||(parameters_1=[]),this.parameterCache.set(type,parameters_1)}return parameters_1}catch(e){throw console.error("Failed on type "+JSON.stringify(type)+" with error "+e),e}},StaticReflector.prototype._methodNames=function(type){var methodNames=this.methodCache.get(type);if(!methodNames){var classMetadata=this.getTypeMetadata(type);methodNames={};var parentType=this.findParentType(type,classMetadata);if(parentType){var parentMethodNames_1=this._methodNames(parentType);Object.keys(parentMethodNames_1).forEach(function(parentProp){methodNames[parentProp]=parentMethodNames_1[parentProp]})}var members_2=classMetadata.members||{};Object.keys(members_2).forEach(function(propName){var isMethod=members_2[propName].some(function(a){return"method"==a.__symbolic});methodNames[propName]=methodNames[propName]||isMethod}),this.methodCache.set(type,methodNames)}return methodNames},StaticReflector.prototype._staticMembers=function(type){var staticMembers=this.staticCache.get(type);if(!staticMembers){var staticMemberData=this.getTypeMetadata(type).statics||{};staticMembers=Object.keys(staticMemberData),this.staticCache.set(type,staticMembers)}return staticMembers},StaticReflector.prototype.findParentType=function(type,classMetadata){var parentType=this.trySimplify(type,classMetadata.extends);if(parentType instanceof StaticSymbol)return parentType},StaticReflector.prototype.hasLifecycleHook=function(type,lcProperty){type instanceof StaticSymbol||this.reportError(new Error("hasLifecycleHook received "+JSON.stringify(type)+" which is not a StaticSymbol"),type);try{return!!this._methodNames(type)[lcProperty]}catch(e){throw console.error("Failed on type "+JSON.stringify(type)+" with error "+e),e}},StaticReflector.prototype.guards=function(type){var e_1,_a;if(!(type instanceof StaticSymbol))return this.reportError(new Error("guards received "+JSON.stringify(type)+" which is not a StaticSymbol"),type),{};var staticMembers=this._staticMembers(type),result={};try{for(var staticMembers_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(staticMembers),staticMembers_1_1=staticMembers_1.next();!staticMembers_1_1.done;staticMembers_1_1=staticMembers_1.next()){var name_1=staticMembers_1_1.value;if(name_1.endsWith("TypeGuard")){var property=name_1.substr(0,name_1.length-"TypeGuard".length),value=void 0;property.endsWith("UseIf")?(property=name_1.substr(0,property.length-"UseIf".length),value="UseIf"):value=this.getStaticSymbol(type.filePath,type.name,[name_1]),result[property]=value}}}catch(e_1_1){e_1={error:e_1_1}}finally{try{staticMembers_1_1&&!staticMembers_1_1.done&&(_a=staticMembers_1.return)&&_a.call(staticMembers_1)}finally{if(e_1)throw e_1.error}}return result},StaticReflector.prototype._registerDecoratorOrConstructor=function(type,ctor){this.conversionMap.set(type,function(context,args){return new(ctor.bind.apply(ctor,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)))})},StaticReflector.prototype._registerFunction=function(type,fn){this.conversionMap.set(type,function(context,args){return fn.apply(void 0,args)})},StaticReflector.prototype.initializeConversionMap=function(){this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Injectable"),createInjectable),this.injectionToken=this.findDeclaration(ANGULAR_CORE,"InjectionToken"),this.opaqueToken=this.findDeclaration(ANGULAR_CORE,"OpaqueToken"),this.ROUTES=this.tryFindDeclaration("@angular/router","ROUTES"),this.ANALYZE_FOR_ENTRY_COMPONENTS=this.findDeclaration(ANGULAR_CORE,"ANALYZE_FOR_ENTRY_COMPONENTS"),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Host"),createHost),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Self"),createSelf),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"SkipSelf"),createSkipSelf),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Inject"),createInject),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Optional"),createOptional),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Attribute"),createAttribute),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"ContentChild"),createContentChild),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"ContentChildren"),createContentChildren),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"ViewChild"),createViewChild),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"ViewChildren"),createViewChildren),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Input"),createInput),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Output"),createOutput),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Pipe"),createPipe),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"HostBinding"),createHostBinding),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"HostListener"),createHostListener),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Directive"),createDirective),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Component"),createComponent),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"NgModule"),createNgModule),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Host"),createHost),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Self"),createSelf),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"SkipSelf"),createSkipSelf),this._registerDecoratorOrConstructor(this.findDeclaration(ANGULAR_CORE,"Optional"),createOptional)},StaticReflector.prototype.getStaticSymbol=function(declarationFile,name,members){return this.symbolResolver.getStaticSymbol(declarationFile,name,members)},StaticReflector.prototype.trySimplify=function(context,value){var originalRecorder=this.errorRecorder;this.errorRecorder=function(error,fileName){};var result=this.simplify(context,value);return this.errorRecorder=originalRecorder,result},StaticReflector.prototype.simplify=function(context,value,lazy){void 0===lazy&&(lazy=!1);var result,self=this,scope=BindingScope$1.empty,calling=new Map;try{result=function simplifyInContext(context,value,depth,references){function resolveReferenceValue(staticSymbol){var resolvedSymbol=self.symbolResolver.resolveSymbol(staticSymbol);return resolvedSymbol?resolvedSymbol.metadata:null}function simplifyEagerly(value){return simplifyInContext(context,value,depth,0)}function simplifyNested(nestedContext,value){if(nestedContext===context)return simplifyInContext(nestedContext,value,depth+1,references);try{return simplifyInContext(nestedContext,value,depth+1,references)}catch(e){if(!isMetadataError(e))throw e;var summaryMsg=e.chain?"references '"+e.symbol.name+"'":function errorSummary(error){if(error.summary)return error.summary;switch(error.message){case REFERENCE_TO_NONEXPORTED_CLASS:if(error.context&&error.context.className)return"references non-exported class "+error.context.className;break;case VARIABLE_NOT_INITIALIZED:return"is not initialized";case DESTRUCTURE_NOT_SUPPORTED:return"is a destructured variable";case COULD_NOT_RESOLVE_TYPE:return"could not be resolved";case FUNCTION_CALL_NOT_SUPPORTED:return error.context&&error.context.name?"calls '"+error.context.name+"'":"calls a function";case REFERENCE_TO_LOCAL_SYMBOL:return error.context&&error.context.name?"references local variable "+error.context.name:"references a local variable"}return"contains the error"}(e),chain={message:"'"+nestedContext.name+"' "+summaryMsg,position:e.position,next:e.chain};self.error({message:e.message,advise:e.advise,context:e.context,chain:chain,symbol:nestedContext},context)}}function simplify(expression){var e_2,_a,e_3,_b;if(isPrimitive(expression))return expression;if(expression instanceof Array){var result_2=[];try{for(var _c=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(expression),_d=_c.next();!_d.done;_d=_c.next()){var item=_d.value;if(item&&"spread"===item.__symbolic){var spreadArray=simplifyEagerly(item.expression);if(Array.isArray(spreadArray)){try{for(var spreadArray_1=Object(tslib__WEBPACK_IMPORTED_MODULE_0__.h)(spreadArray),spreadArray_1_1=spreadArray_1.next();!spreadArray_1_1.done;spreadArray_1_1=spreadArray_1.next()){var spreadItem=spreadArray_1_1.value;result_2.push(spreadItem)}}catch(e_3_1){e_3={error:e_3_1}}finally{try{spreadArray_1_1&&!spreadArray_1_1.done&&(_b=spreadArray_1.return)&&_b.call(spreadArray_1)}finally{if(e_3)throw e_3.error}}continue}}var value_2=simplify(item);shouldIgnore(value_2)||result_2.push(value_2)}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_d&&!_d.done&&(_a=_c.return)&&_a.call(_c)}finally{if(e_2)throw e_2.error}}return result_2}if(expression instanceof StaticSymbol)return expression===self.injectionToken||self.conversionMap.has(expression)||references>0&&!expression.members.length?expression:null!=(declarationValue=resolveReferenceValue(staticSymbol=expression))?simplifyNested(staticSymbol,declarationValue):staticSymbol;if(expression){if(expression.__symbolic){var staticSymbol=void 0;switch(expression.__symbolic){case"binop":var left=simplify(expression.left);if(shouldIgnore(left))return left;var right=simplify(expression.right);if(shouldIgnore(right))return right;switch(expression.operator){case"&&":return left&&right;case"||":return left||right;case"|":return left|right;case"^":return left^right;case"&":return left&right;case"==":return left==right;case"!=":return left!=right;case"===":return left===right;case"!==":return left!==right;case"<":return left<right;case">":return left>right;case"<=":return left<=right;case">=":return left>=right;case"<<":return left<<right;case">>":return left>>right;case"+":return left+right;case"-":return left-right;case"*":return left*right;case"/":return left/right;case"%":return left%right}return null;case"if":var condition=simplify(expression.condition);return simplify(condition?expression.thenExpression:expression.elseExpression);case"pre":var operand=simplify(expression.operand);if(shouldIgnore(operand))return operand;switch(expression.operator){case"+":return operand;case"-":return-operand;case"!":return!operand;case"~":return~operand}return null;case"index":var indexTarget=simplifyEagerly(expression.expression),index=simplifyEagerly(expression.index);return indexTarget&&isPrimitive(index)?indexTarget[index]:null;case"select":var member=expression.member,selectContext=context,selectTarget=simplify(expression.expression);if(selectTarget instanceof StaticSymbol){var declarationValue,members=selectTarget.members.concat(member);return null!=(declarationValue=resolveReferenceValue(selectContext=self.getStaticSymbol(selectTarget.filePath,selectTarget.name,members)))?simplifyNested(selectContext,declarationValue):selectContext}return selectTarget&&isPrimitive(member)?simplifyNested(selectContext,selectTarget[member]):null;case"reference":var name_2=expression.name,localValue=scope.resolve(name_2);if(localValue!=BindingScope$1.missing)return localValue;break;case"resolved":try{return simplify(expression.symbol)}catch(e){throw isMetadataError(e)&&null!=expression.fileName&&null!=expression.line&&null!=expression.character&&(e.position={fileName:expression.fileName,line:expression.line,column:expression.character}),e}case"class":case"function":return context;case"new":case"call":if((staticSymbol=simplifyInContext(context,expression.expression,depth+1,0))instanceof StaticSymbol){if(staticSymbol===self.injectionToken||staticSymbol===self.opaqueToken)return context;var argExpressions=expression.arguments||[],converter=self.conversionMap.get(staticSymbol);if(converter){var args=argExpressions.map(function(arg){return simplifyNested(context,arg)}).map(function(arg){return shouldIgnore(arg)?void 0:arg});return converter(context,args)}return function simplifyCall(functionSymbol,targetFunction,args,targetExpression){if(targetFunction&&"function"==targetFunction.__symbolic){calling.get(functionSymbol)&&self.error({message:"Recursion is not supported",summary:"called '"+functionSymbol.name+"' recursively",value:targetFunction},functionSymbol);try{var value_1=targetFunction.value;if(value_1&&(0!=depth||"error"!=value_1.__symbolic)){var parameters=targetFunction.parameters,defaults=targetFunction.defaults;args=args.map(function(arg){return simplifyNested(context,arg)}).map(function(arg){return shouldIgnore(arg)?void 0:arg}),defaults&&defaults.length>args.length&&args.push.apply(args,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(defaults.slice(args.length).map(function(value){return simplify(value)}))),calling.set(functionSymbol,!0);for(var functionScope=BindingScope$1.build(),i=0;i<parameters.length;i++)functionScope.define(parameters[i],args[i]);var result_1,oldScope=scope;try{scope=functionScope.done(),result_1=simplifyNested(functionSymbol,value_1)}finally{scope=oldScope}return result_1}}finally{calling.delete(functionSymbol)}}if(0===depth)return IGNORE;var position=void 0;if(targetExpression&&"resolved"==targetExpression.__symbolic){var line=targetExpression.line,character=targetExpression.character,fileName=targetExpression.fileName;null!=fileName&&null!=line&&null!=character&&(position={fileName:fileName,line:line,column:character})}self.error({message:FUNCTION_CALL_NOT_SUPPORTED,context:functionSymbol,value:targetFunction,position:position},context)}(staticSymbol,resolveReferenceValue(staticSymbol),argExpressions,expression.expression)}return IGNORE;case"error":var message=expression.message;return null!=expression.line?self.error({message:message,context:expression.context,value:expression,position:{fileName:expression.fileName,line:expression.line,column:expression.character}},context):self.error({message:message,context:expression.context},context),IGNORE;case"ignore":return expression}return null}return function mapStringMap(input,transform){if(!input)return{};var result={};return Object.keys(input).forEach(function(key){var value=transform(input[key],key);shouldIgnore(value)||(HIDDEN_KEY.test(key)?Object.defineProperty(result,key,{enumerable:!1,configurable:!0,value:value}):result[key]=value)}),result}(expression,function(value,name){if(REFERENCE_SET.has(name)){if(name===USE_VALUE$1&&PROVIDE in expression){var provide=simplify(expression.provide);if(provide===self.ROUTES||provide==self.ANALYZE_FOR_ENTRY_COMPONENTS)return simplify(value)}return function simplifyLazily(value){return simplifyInContext(context,value,depth,references+1)}(value)}return simplify(value)})}return IGNORE}return simplify(value)}(context,value,0,lazy?1:0)}catch(e){if(!this.errorRecorder)throw formatMetadataError(e,context);this.reportError(e,context)}if(!shouldIgnore(result))return result},StaticReflector.prototype.getTypeMetadata=function(type){var resolvedSymbol=this.symbolResolver.resolveSymbol(type);return resolvedSymbol&&resolvedSymbol.metadata?resolvedSymbol.metadata:{__symbolic:"class"}},StaticReflector.prototype.reportError=function(error,context,path){if(!this.errorRecorder)throw error;this.errorRecorder(formatMetadataError(error,context),context&&context.filePath||path)},StaticReflector.prototype.error=function(_a,reportingContext){var message=_a.message,summary=_a.summary,advise=_a.advise,position=_a.position,context=_a.context,symbol=(_a.value,_a.symbol),chain=_a.chain;this.reportError(metadataError(message,summary,advise,position,symbol,context,chain),reportingContext)},StaticReflector}(),METADATA_ERROR="ngMetadataError";function metadataError(message,summary,advise,position,symbol,context,chain){var error=syntaxError(message);return error[METADATA_ERROR]=!0,advise&&(error.advise=advise),position&&(error.position=position),summary&&(error.summary=summary),context&&(error.context=context),chain&&(error.chain=chain),symbol&&(error.symbol=symbol),error}function isMetadataError(error){return!!error[METADATA_ERROR]}var REFERENCE_TO_NONEXPORTED_CLASS="Reference to non-exported class",VARIABLE_NOT_INITIALIZED="Variable not initialized",DESTRUCTURE_NOT_SUPPORTED="Destructuring not supported",COULD_NOT_RESOLVE_TYPE="Could not resolve type",FUNCTION_CALL_NOT_SUPPORTED="Function call not supported",REFERENCE_TO_LOCAL_SYMBOL="Reference to a local symbol",LAMBDA_NOT_SUPPORTED="Lambda not supported";function isPrimitive(o){return null===o||"function"!=typeof o&&"object"!=typeof o}var BindingScope$1=function(){function BindingScope(){}return BindingScope.build=function(){var current=new Map;return{define:function(name,value){return current.set(name,value),this},done:function(){return current.size>0?new PopulatedScope(current):BindingScope.empty}}},BindingScope.missing={},BindingScope.empty={resolve:function(name){return BindingScope.missing}},BindingScope}(),PopulatedScope=function(_super){function PopulatedScope(bindings){var _this=_super.call(this)||this;return _this.bindings=bindings,_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(PopulatedScope,_super),PopulatedScope.prototype.resolve=function(name){return this.bindings.has(name)?this.bindings.get(name):BindingScope$1.missing},PopulatedScope}(BindingScope$1);function formatMetadataMessageChain(chain,advise){return{message:""+function expandedMessage(message,context){switch(message){case REFERENCE_TO_NONEXPORTED_CLASS:if(context&&context.className)return"References to a non-exported class are not supported in decorators but "+context.className+" was referenced.";break;case VARIABLE_NOT_INITIALIZED:return"Only initialized variables and constants can be referenced in decorators because the value of this variable is needed by the template compiler";case DESTRUCTURE_NOT_SUPPORTED:return"Referencing an exported destructured variable or constant is not supported in decorators and this value is needed by the template compiler";case COULD_NOT_RESOLVE_TYPE:if(context&&context.typeName)return"Could not resolve type "+context.typeName;break;case FUNCTION_CALL_NOT_SUPPORTED:return context&&context.name?"Function calls are not supported in decorators but '"+context.name+"' was called":"Function calls are not supported in decorators";case REFERENCE_TO_LOCAL_SYMBOL:if(context&&context.name)return"Reference to a local (non-exported) symbols are not supported in decorators but '"+context.name+"' was referenced";break;case LAMBDA_NOT_SUPPORTED:return"Function expressions are not supported in decorators"}return message}(chain.message,chain.context)+(chain.symbol?" in '"+chain.symbol.name+"'":""),position:chain.position,next:chain.next?formatMetadataMessageChain(chain.next,advise):advise?{message:advise}:void 0}}function formatMetadataError(e,context){if(isMetadataError(e)){var position=e.position;return function formattedError(chain){var error=syntaxError(formatChain(chain)+".");return error[FORMATTED_MESSAGE]=!0,error.chain=chain,error.position=chain.position,error}(formatMetadataMessageChain({message:"Error during template compile of '"+context.name+"'",position:position,next:{message:e.message,next:e.chain,context:e.context,symbol:e.symbol}},e.advise||function messageAdvise(message,context){switch(message){case REFERENCE_TO_NONEXPORTED_CLASS:if(context&&context.className)return"Consider exporting '"+context.className+"'";break;case DESTRUCTURE_NOT_SUPPORTED:return"Consider simplifying to avoid destructuring";case REFERENCE_TO_LOCAL_SYMBOL:if(context&&context.name)return"Consider exporting '"+context.name+"'";break;case LAMBDA_NOT_SUPPORTED:return"Consider changing the function expression into an exported function"}}(e.message,e.context)))}return e}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var AotSummaryResolver=function(){function AotSummaryResolver(host,staticSymbolCache){this.host=host,this.staticSymbolCache=staticSymbolCache,this.summaryCache=new Map,this.loadedFilePaths=new Map,this.importAs=new Map,this.knownFileNameToModuleNames=new Map}return AotSummaryResolver.prototype.isLibraryFile=function(filePath){return!this.host.isSourceFile(stripGeneratedFileSuffix(filePath))},AotSummaryResolver.prototype.toSummaryFileName=function(filePath,referringSrcFileName){return this.host.toSummaryFileName(filePath,referringSrcFileName)},AotSummaryResolver.prototype.fromSummaryFileName=function(fileName,referringLibFileName){return this.host.fromSummaryFileName(fileName,referringLibFileName)},AotSummaryResolver.prototype.resolveSummary=function(staticSymbol){var rootSymbol=staticSymbol.members.length?this.staticSymbolCache.get(staticSymbol.filePath,staticSymbol.name):staticSymbol,summary=this.summaryCache.get(rootSymbol);return summary||(this._loadSummaryFile(staticSymbol.filePath),summary=this.summaryCache.get(staticSymbol)),rootSymbol===staticSymbol&&summary||null},AotSummaryResolver.prototype.getSymbolsOf=function(filePath){return this._loadSummaryFile(filePath)?Array.from(this.summaryCache.keys()).filter(function(symbol){return symbol.filePath===filePath}):null},AotSummaryResolver.prototype.getImportAs=function(staticSymbol){return staticSymbol.assertNoMembers(),this.importAs.get(staticSymbol)},AotSummaryResolver.prototype.getKnownModuleName=function(importedFilePath){return this.knownFileNameToModuleNames.get(importedFilePath)||null},AotSummaryResolver.prototype.addSummary=function(summary){this.summaryCache.set(summary.symbol,summary)},AotSummaryResolver.prototype._loadSummaryFile=function(filePath){var _this=this,hasSummary=this.loadedFilePaths.get(filePath);if(null!=hasSummary)return hasSummary;var json=null;if(this.isLibraryFile(filePath)){var summaryFilePath=summaryFileName(filePath);try{json=this.host.loadSummary(summaryFilePath)}catch(e){throw console.error("Error loading summary file "+summaryFilePath),e}}if(hasSummary=null!=json,this.loadedFilePaths.set(filePath,hasSummary),json){var _a=function deserializeSummaries(symbolCache,summaryResolver,libraryFileName,json){return new FromJsonDeserializer(symbolCache,summaryResolver).deserialize(libraryFileName,json)}(this.staticSymbolCache,this,filePath,json),moduleName=_a.moduleName,summaries=_a.summaries,importAs=_a.importAs;summaries.forEach(function(summary){return _this.summaryCache.set(summary.symbol,summary)}),moduleName&&this.knownFileNameToModuleNames.set(filePath,moduleName),importAs.forEach(function(importAs){_this.importAs.set(importAs.symbol,importAs.importAs)})}return hasSummary},AotSummaryResolver}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function createAotUrlResolver(host){return{resolve:function(basePath,url){var filePath=host.resourceNameToFileName(url,basePath);if(!filePath)throw syntaxError("Couldn't resolve resource "+url+" from "+basePath);return filePath}}}var SummaryResolver=function SummaryResolver(){},JitSummaryResolver=function(){function JitSummaryResolver(){this._summaries=new Map}return JitSummaryResolver.prototype.isLibraryFile=function(){return!1},JitSummaryResolver.prototype.toSummaryFileName=function(fileName){return fileName},JitSummaryResolver.prototype.fromSummaryFileName=function(fileName){return fileName},JitSummaryResolver.prototype.resolveSummary=function(reference){return this._summaries.get(reference)||null},JitSummaryResolver.prototype.getSymbolsOf=function(){return[]},JitSummaryResolver.prototype.getImportAs=function(reference){return reference},JitSummaryResolver.prototype.getKnownModuleName=function(fileName){return null},JitSummaryResolver.prototype.addSummary=function(summary){this._summaries.set(summary.symbol,summary)},JitSummaryResolver}();function _executeFunctionStatements(varNames,varValues,statements,ctx,visitor){for(var childCtx=ctx.createChildWihtLocalVars(),i=0;i<varNames.length;i++)childCtx.vars.set(varNames[i],varValues[i]);var result=visitor.visitAllStatements(statements,childCtx);return result?result.value:null}var _ExecutionContext=function(){function _ExecutionContext(parent,instance,className,vars){this.parent=parent,this.instance=instance,this.className=className,this.vars=vars,this.exports=[]}return _ExecutionContext.prototype.createChildWihtLocalVars=function(){return new _ExecutionContext(this,this.instance,this.className,new Map)},_ExecutionContext}(),ReturnValue=function ReturnValue(value){this.value=value};var StatementInterpreter=function(){function StatementInterpreter(reflector){this.reflector=reflector}return StatementInterpreter.prototype.debugAst=function(ast){
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */return function debugOutputAstAsTypeScript(ast){var converter=new _TsEmitterVisitor,ctx=EmitterVisitorContext.createRoot();return(Array.isArray(ast)?ast:[ast]).forEach(function(ast){if(ast instanceof Statement)ast.visitStatement(converter,ctx);else if(ast instanceof Expression)ast.visitExpression(converter,ctx);else{if(!(ast instanceof Type$1))throw new Error("Don't know how to print debug info for "+ast);ast.visitType(converter,ctx)}}),ctx.toSource()}(ast)},StatementInterpreter.prototype.visitDeclareVarStmt=function(stmt,ctx){var initialValue=stmt.value?stmt.value.visitExpression(this,ctx):void 0;return ctx.vars.set(stmt.name,initialValue),stmt.hasModifier(StmtModifier.Exported)&&ctx.exports.push(stmt.name),null},StatementInterpreter.prototype.visitWriteVarExpr=function(expr,ctx){for(var value=expr.value.visitExpression(this,ctx),currCtx=ctx;null!=currCtx;){if(currCtx.vars.has(expr.name))return currCtx.vars.set(expr.name,value),value;currCtx=currCtx.parent}throw new Error("Not declared variable "+expr.name)},StatementInterpreter.prototype.visitWrappedNodeExpr=function(ast,ctx){throw new Error("Cannot interpret a WrappedNodeExpr.")},StatementInterpreter.prototype.visitTypeofExpr=function(ast,ctx){throw new Error("Cannot interpret a TypeofExpr")},StatementInterpreter.prototype.visitReadVarExpr=function(ast,ctx){var varName=ast.name;if(null!=ast.builtin)switch(ast.builtin){case BuiltinVar.Super:return ctx.instance.__proto__;case BuiltinVar.This:return ctx.instance;case BuiltinVar.CatchError:varName=CATCH_ERROR_VAR$2;break;case BuiltinVar.CatchStack:varName=CATCH_STACK_VAR$2;break;default:throw new Error("Unknown builtin variable "+ast.builtin)}for(var currCtx=ctx;null!=currCtx;){if(currCtx.vars.has(varName))return currCtx.vars.get(varName);currCtx=currCtx.parent}throw new Error("Not declared variable "+varName)},StatementInterpreter.prototype.visitWriteKeyExpr=function(expr,ctx){var receiver=expr.receiver.visitExpression(this,ctx),index=expr.index.visitExpression(this,ctx),value=expr.value.visitExpression(this,ctx);return receiver[index]=value,value},StatementInterpreter.prototype.visitWritePropExpr=function(expr,ctx){var receiver=expr.receiver.visitExpression(this,ctx),value=expr.value.visitExpression(this,ctx);return receiver[expr.name]=value,value},StatementInterpreter.prototype.visitInvokeMethodExpr=function(expr,ctx){var result,receiver=expr.receiver.visitExpression(this,ctx),args=this.visitAllExpressions(expr.args,ctx);if(null!=expr.builtin)switch(expr.builtin){case BuiltinMethod.ConcatArray:result=receiver.concat.apply(receiver,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(args));break;case BuiltinMethod.SubscribeObservable:result=receiver.subscribe({next:args[0]});break;case BuiltinMethod.Bind:result=receiver.bind.apply(receiver,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(args));break;default:throw new Error("Unknown builtin method "+expr.builtin)}else result=receiver[expr.name].apply(receiver,args);return result},StatementInterpreter.prototype.visitInvokeFunctionExpr=function(stmt,ctx){var args=this.visitAllExpressions(stmt.args,ctx),fnExpr=stmt.fn;return fnExpr instanceof ReadVarExpr&&fnExpr.builtin===BuiltinVar.Super?(ctx.instance.constructor.prototype.constructor.apply(ctx.instance,args),null):stmt.fn.visitExpression(this,ctx).apply(null,args)},StatementInterpreter.prototype.visitReturnStmt=function(stmt,ctx){return new ReturnValue(stmt.value.visitExpression(this,ctx))},StatementInterpreter.prototype.visitDeclareClassStmt=function(stmt,ctx){var clazz=function createDynamicClass(_classStmt,_ctx,_visitor){var propertyDescriptors={};_classStmt.getters.forEach(function(getter){propertyDescriptors[getter.name]={configurable:!1,get:function(){var instanceCtx=new _ExecutionContext(_ctx,this,_classStmt.name,_ctx.vars);return _executeFunctionStatements([],[],getter.body,instanceCtx,_visitor)}}}),_classStmt.methods.forEach(function(method){var paramNames=method.params.map(function(param){return param.name});propertyDescriptors[method.name]={writable:!1,configurable:!1,value:function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];var instanceCtx=new _ExecutionContext(_ctx,this,_classStmt.name,_ctx.vars);return _executeFunctionStatements(paramNames,args,method.body,instanceCtx,_visitor)}}});var ctorParamNames=_classStmt.constructorMethod.params.map(function(param){return param.name}),ctor=function(){for(var _this=this,args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];var instanceCtx=new _ExecutionContext(_ctx,this,_classStmt.name,_ctx.vars);_classStmt.fields.forEach(function(field){_this[field.name]=void 0}),_executeFunctionStatements(ctorParamNames,args,_classStmt.constructorMethod.body,instanceCtx,_visitor)},superClass=_classStmt.parent?_classStmt.parent.visitExpression(_visitor,_ctx):Object;return ctor.prototype=Object.create(superClass.prototype,propertyDescriptors),ctor}(stmt,ctx,this);return ctx.vars.set(stmt.name,clazz),stmt.hasModifier(StmtModifier.Exported)&&ctx.exports.push(stmt.name),null},StatementInterpreter.prototype.visitExpressionStmt=function(stmt,ctx){return stmt.expr.visitExpression(this,ctx)},StatementInterpreter.prototype.visitIfStmt=function(stmt,ctx){return stmt.condition.visitExpression(this,ctx)?this.visitAllStatements(stmt.trueCase,ctx):null!=stmt.falseCase?this.visitAllStatements(stmt.falseCase,ctx):null},StatementInterpreter.prototype.visitTryCatchStmt=function(stmt,ctx){try{return this.visitAllStatements(stmt.bodyStmts,ctx)}catch(e){var childCtx=ctx.createChildWihtLocalVars();return childCtx.vars.set(CATCH_ERROR_VAR$2,e),childCtx.vars.set(CATCH_STACK_VAR$2,e.stack),this.visitAllStatements(stmt.catchStmts,childCtx)}},StatementInterpreter.prototype.visitThrowStmt=function(stmt,ctx){throw stmt.error.visitExpression(this,ctx)},StatementInterpreter.prototype.visitCommentStmt=function(stmt,context){return null},StatementInterpreter.prototype.visitJSDocCommentStmt=function(stmt,context){return null},StatementInterpreter.prototype.visitInstantiateExpr=function(ast,ctx){var args=this.visitAllExpressions(ast.args,ctx),clazz=ast.classExpr.visitExpression(this,ctx);return new(clazz.bind.apply(clazz,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)([void 0],args)))},StatementInterpreter.prototype.visitLiteralExpr=function(ast,ctx){return ast.value},StatementInterpreter.prototype.visitExternalExpr=function(ast,ctx){return this.reflector.resolveExternalReference(ast.value)},StatementInterpreter.prototype.visitConditionalExpr=function(ast,ctx){return ast.condition.visitExpression(this,ctx)?ast.trueCase.visitExpression(this,ctx):null!=ast.falseCase?ast.falseCase.visitExpression(this,ctx):null},StatementInterpreter.prototype.visitNotExpr=function(ast,ctx){return!ast.condition.visitExpression(this,ctx)},StatementInterpreter.prototype.visitAssertNotNullExpr=function(ast,ctx){return ast.condition.visitExpression(this,ctx)},StatementInterpreter.prototype.visitCastExpr=function(ast,ctx){return ast.value.visitExpression(this,ctx)},StatementInterpreter.prototype.visitFunctionExpr=function(ast,ctx){return _declareFn(ast.params.map(function(param){return param.name}),ast.statements,ctx,this)},StatementInterpreter.prototype.visitDeclareFunctionStmt=function(stmt,ctx){var paramNames=stmt.params.map(function(param){return param.name});return ctx.vars.set(stmt.name,_declareFn(paramNames,stmt.statements,ctx,this)),stmt.hasModifier(StmtModifier.Exported)&&ctx.exports.push(stmt.name),null},StatementInterpreter.prototype.visitBinaryOperatorExpr=function(ast,ctx){var _this=this,lhs=function(){return ast.lhs.visitExpression(_this,ctx)},rhs=function(){return ast.rhs.visitExpression(_this,ctx)};switch(ast.operator){case BinaryOperator.Equals:return lhs()==rhs();case BinaryOperator.Identical:return lhs()===rhs();case BinaryOperator.NotEquals:return lhs()!=rhs();case BinaryOperator.NotIdentical:return lhs()!==rhs();case BinaryOperator.And:return lhs()&&rhs();case BinaryOperator.Or:return lhs()||rhs();case BinaryOperator.Plus:return lhs()+rhs();case BinaryOperator.Minus:return lhs()-rhs();case BinaryOperator.Divide:return lhs()/rhs();case BinaryOperator.Multiply:return lhs()*rhs();case BinaryOperator.Modulo:return lhs()%rhs();case BinaryOperator.Lower:return lhs()<rhs();case BinaryOperator.LowerEquals:return lhs()<=rhs();case BinaryOperator.Bigger:return lhs()>rhs();case BinaryOperator.BiggerEquals:return lhs()>=rhs();default:throw new Error("Unknown operator "+ast.operator)}},StatementInterpreter.prototype.visitReadPropExpr=function(ast,ctx){return ast.receiver.visitExpression(this,ctx)[ast.name]},StatementInterpreter.prototype.visitReadKeyExpr=function(ast,ctx){return ast.receiver.visitExpression(this,ctx)[ast.index.visitExpression(this,ctx)]},StatementInterpreter.prototype.visitLiteralArrayExpr=function(ast,ctx){return this.visitAllExpressions(ast.entries,ctx)},StatementInterpreter.prototype.visitLiteralMapExpr=function(ast,ctx){var _this=this,result={};return ast.entries.forEach(function(entry){return result[entry.key]=entry.value.visitExpression(_this,ctx)}),result},StatementInterpreter.prototype.visitCommaExpr=function(ast,context){var values=this.visitAllExpressions(ast.parts,context);return values[values.length-1]},StatementInterpreter.prototype.visitAllExpressions=function(expressions,ctx){var _this=this;return expressions.map(function(expr){return expr.visitExpression(_this,ctx)})},StatementInterpreter.prototype.visitAllStatements=function(statements,ctx){for(var i=0;i<statements.length;i++){var val=statements[i].visitStatement(this,ctx);if(val instanceof ReturnValue)return val}return null},StatementInterpreter}();function _declareFn(varNames,statements,ctx,visitor){return function(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];return _executeFunctionStatements(varNames,args,statements,ctx,visitor)}}var CATCH_ERROR_VAR$2="error",CATCH_STACK_VAR$2="stack",JitCompiler=function(){function JitCompiler(_metadataResolver,_templateParser,_styleCompiler,_viewCompiler,_ngModuleCompiler,_summaryResolver,_reflector,_jitEvaluator,_compilerConfig,_console,getExtraNgModuleProviders){this._metadataResolver=_metadataResolver,this._templateParser=_templateParser,this._styleCompiler=_styleCompiler,this._viewCompiler=_viewCompiler,this._ngModuleCompiler=_ngModuleCompiler,this._summaryResolver=_summaryResolver,this._reflector=_reflector,this._jitEvaluator=_jitEvaluator,this._compilerConfig=_compilerConfig,this._console=_console,this.getExtraNgModuleProviders=getExtraNgModuleProviders,this._compiledTemplateCache=new Map,this._compiledHostTemplateCache=new Map,this._compiledDirectiveWrapperCache=new Map,this._compiledNgModuleCache=new Map,this._sharedStylesheetCount=0,this._addedAotSummaries=new Set}return JitCompiler.prototype.compileModuleSync=function(moduleType){return SyncAsync_assertSync(this._compileModuleAndComponents(moduleType,!0))},JitCompiler.prototype.compileModuleAsync=function(moduleType){return Promise.resolve(this._compileModuleAndComponents(moduleType,!1))},JitCompiler.prototype.compileModuleAndAllComponentsSync=function(moduleType){return SyncAsync_assertSync(this._compileModuleAndAllComponents(moduleType,!0))},JitCompiler.prototype.compileModuleAndAllComponentsAsync=function(moduleType){return Promise.resolve(this._compileModuleAndAllComponents(moduleType,!1))},JitCompiler.prototype.getComponentFactory=function(component){return this._metadataResolver.getDirectiveSummary(component).componentFactory},JitCompiler.prototype.loadAotSummaries=function(summaries){this.clearCache(),this._addAotSummaries(summaries)},JitCompiler.prototype._addAotSummaries=function(fn){if(!this._addedAotSummaries.has(fn)){this._addedAotSummaries.add(fn);for(var summaries=fn(),i=0;i<summaries.length;i++){var entry=summaries[i];if("function"==typeof entry)this._addAotSummaries(entry);else{var summary=entry;this._summaryResolver.addSummary({symbol:summary.type.reference,metadata:null,type:summary})}}}},JitCompiler.prototype.hasAotSummary=function(ref){return!!this._summaryResolver.resolveSummary(ref)},JitCompiler.prototype._filterJitIdentifiers=function(ids){var _this=this;return ids.map(function(mod){return mod.reference}).filter(function(ref){return!_this.hasAotSummary(ref)})},JitCompiler.prototype._compileModuleAndComponents=function(moduleType,isSync){var _this=this;return SyncAsync_then(this._loadModules(moduleType,isSync),function(){return _this._compileComponents(moduleType,null),_this._compileModule(moduleType)})},JitCompiler.prototype._compileModuleAndAllComponents=function(moduleType,isSync){var _this=this;return SyncAsync_then(this._loadModules(moduleType,isSync),function(){var componentFactories=[];return _this._compileComponents(moduleType,componentFactories),{ngModuleFactory:_this._compileModule(moduleType),componentFactories:componentFactories}})},JitCompiler.prototype._loadModules=function(mainModule,isSync){var _this=this,loading=[],mainNgModule=this._metadataResolver.getNgModuleMetadata(mainModule);return this._filterJitIdentifiers(mainNgModule.transitiveModule.modules).forEach(function(nestedNgModule){var moduleMeta=_this._metadataResolver.getNgModuleMetadata(nestedNgModule);_this._filterJitIdentifiers(moduleMeta.declaredDirectives).forEach(function(ref){var promise=_this._metadataResolver.loadDirectiveMetadata(moduleMeta.type.reference,ref,isSync);promise&&loading.push(promise)}),_this._filterJitIdentifiers(moduleMeta.declaredPipes).forEach(function(ref){return _this._metadataResolver.getOrLoadPipeMetadata(ref)})}),SyncAsync_all(loading)},JitCompiler.prototype._compileModule=function(moduleType){var ngModuleFactory=this._compiledNgModuleCache.get(moduleType);Eif(!ngModuleFactory){var moduleMeta=this._metadataResolver.getNgModuleMetadata(moduleType),extraProviders=this.getExtraNgModuleProviders(moduleMeta.type.reference),outputCtx=createOutputContext(),compileResult=this._ngModuleCompiler.compile(outputCtx,moduleMeta,extraProviders);ngModuleFactory=this._interpretOrJit(function ngModuleJitUrl(moduleMeta){return jitSourceUrl(identifierName(moduleMeta.type)+"/module.ngfactory.js")}(moduleMeta),outputCtx.statements)[compileResult.ngModuleFactoryVar],this._compiledNgModuleCache.set(moduleMeta.type.reference,ngModuleFactory)}return ngModuleFactory},JitCompiler.prototype._compileComponents=function(mainModule,allComponentFactories){var _this=this,ngModule=this._metadataResolver.getNgModuleMetadata(mainModule),moduleByJitDirective=new Map,templates=new Set,transJitModules=this._filterJitIdentifiers(ngModule.transitiveModule.modules);transJitModules.forEach(function(localMod){var localModuleMeta=_this._metadataResolver.getNgModuleMetadata(localMod);_this._filterJitIdentifiers(localModuleMeta.declaredDirectives).forEach(function(dirRef){moduleByJitDirective.set(dirRef,localModuleMeta);var dirMeta=_this._metadataResolver.getDirectiveMetadata(dirRef);Iif(dirMeta.isComponent&&(templates.add(_this._createCompiledTemplate(dirMeta,localModuleMeta)),allComponentFactories)){var template=_this._createCompiledHostTemplate(dirMeta.type.reference,localModuleMeta);templates.add(template),allComponentFactories.push(dirMeta.componentFactory)}})}),transJitModules.forEach(function(localMod){var localModuleMeta=_this._metadataResolver.getNgModuleMetadata(localMod);_this._filterJitIdentifiers(localModuleMeta.declaredDirectives).forEach(function(dirRef){var dirMeta=_this._metadataResolver.getDirectiveMetadata(dirRef);dirMeta.isComponent&&dirMeta.entryComponents.forEach(function(entryComponentType){var moduleMeta=moduleByJitDirective.get(entryComponentType.componentType);templates.add(_this._createCompiledHostTemplate(entryComponentType.componentType,moduleMeta))})}),localModuleMeta.entryComponents.forEach(function(entryComponentType){Eif(!_this.hasAotSummary(entryComponentType.componentType)){var moduleMeta=moduleByJitDirective.get(entryComponentType.componentType);templates.add(_this._createCompiledHostTemplate(entryComponentType.componentType,moduleMeta))}})}),templates.forEach(function(template){return _this._compileTemplate(template)})},JitCompiler.prototype.clearCacheFor=function(type){this._compiledNgModuleCache.delete(type),this._metadataResolver.clearCacheFor(type),this._compiledHostTemplateCache.delete(type),this._compiledTemplateCache.get(type)&&this._compiledTemplateCache.delete(type)},JitCompiler.prototype.clearCache=function(){this._metadataResolver.clearCache(),this._compiledTemplateCache.clear(),this._compiledHostTemplateCache.clear(),this._compiledNgModuleCache.clear()},JitCompiler.prototype._createCompiledHostTemplate=function(compType,ngModule){Iif(!ngModule)throw new Error("Component "+stringify(compType)+" is not part of any NgModule or the module has not been imported into your module.");var compiledTemplate=this._compiledHostTemplateCache.get(compType);Eif(!compiledTemplate){var compMeta=this._metadataResolver.getDirectiveMetadata(compType);assertComponent(compMeta);var hostMeta=this._metadataResolver.getHostComponentMetadata(compMeta,compMeta.componentFactory.viewDefFactory);compiledTemplate=new CompiledTemplate(!0,compMeta.type,hostMeta,ngModule,[compMeta.type]),this._compiledHostTemplateCache.set(compType,compiledTemplate)}return compiledTemplate},JitCompiler.prototype._createCompiledTemplate=function(compMeta,ngModule){var compiledTemplate=this._compiledTemplateCache.get(compMeta.type.reference);return compiledTemplate||(assertComponent(compMeta),compiledTemplate=new CompiledTemplate(!1,compMeta.type,compMeta,ngModule,ngModule.transitiveModule.directives),this._compiledTemplateCache.set(compMeta.type.reference,compiledTemplate)),compiledTemplate},JitCompiler.prototype._compileTemplate=function(template){var _this=this;Eif(!template.isCompiled){var compMeta=template.compMeta,externalStylesheetsByModuleUrl=new Map,outputContext=createOutputContext(),componentStylesheet=this._styleCompiler.compileComponent(outputContext,compMeta);compMeta.template.externalStylesheets.forEach(function(stylesheetMeta){var compiledStylesheet=_this._styleCompiler.compileStyles(createOutputContext(),compMeta,stylesheetMeta);externalStylesheetsByModuleUrl.set(stylesheetMeta.moduleUrl,compiledStylesheet)}),this._resolveStylesCompileResult(componentStylesheet,externalStylesheetsByModuleUrl);template.ngModule.transitiveModule.pipes.map(function(pipe){return _this._metadataResolver.getPipeSummary(pipe.reference)});var _a=this._parseTemplate(compMeta,template.ngModule,template.directives),parsedTemplate=_a.template,usedPipes=_a.pipes,compileResult=this._viewCompiler.compileComponent(outputContext,compMeta,parsedTemplate,variable(componentStylesheet.stylesVar),usedPipes),evalResult=this._interpretOrJit(function templateJitUrl(ngModuleType,compMeta){return jitSourceUrl(identifierName(ngModuleType)+"/"+identifierName(compMeta.type)+".ngfactory.js")}(template.ngModule.type,template.compMeta),outputContext.statements),viewClass=evalResult[compileResult.viewClassVar],rendererType=evalResult[compileResult.rendererTypeVar];template.compiled(viewClass,rendererType)}},JitCompiler.prototype._parseTemplate=function(compMeta,ngModule,directiveIdentifiers){var _this=this,preserveWhitespaces=compMeta.template.preserveWhitespaces,directives=directiveIdentifiers.map(function(dir){return _this._metadataResolver.getDirectiveSummary(dir.reference)}),pipes=ngModule.transitiveModule.pipes.map(function(pipe){return _this._metadataResolver.getPipeSummary(pipe.reference)});return this._templateParser.parse(compMeta,compMeta.template.htmlAst,directives,pipes,ngModule.schemas,templateSourceUrl(ngModule.type,compMeta,compMeta.template),preserveWhitespaces)},JitCompiler.prototype._resolveStylesCompileResult=function(result,externalStylesheetsByModuleUrl){var _this=this;result.dependencies.forEach(function(dep,i){var nestedCompileResult=externalStylesheetsByModuleUrl.get(dep.moduleUrl),nestedStylesArr=_this._resolveAndEvalStylesCompileResult(nestedCompileResult,externalStylesheetsByModuleUrl);dep.setValue(nestedStylesArr)})},JitCompiler.prototype._resolveAndEvalStylesCompileResult=function(result,externalStylesheetsByModuleUrl){return this._resolveStylesCompileResult(result,externalStylesheetsByModuleUrl),this._interpretOrJit(function sharedStylesheetJitUrl(meta,id){var pathParts=meta.moduleUrl.split(/\/\\/g);return jitSourceUrl("css/"+id+pathParts[pathParts.length-1]+".ngstyle.js")}(result.meta,this._sharedStylesheetCount++),result.outputCtx.statements)[result.stylesVar]},JitCompiler.prototype._interpretOrJit=function(sourceUrl,statements){return this._compilerConfig.useJit?this._jitEvaluator.evaluateStatements(sourceUrl,statements,this._reflector,this._compilerConfig.jitDevMode):
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function interpretStatements(statements,reflector){var ctx=new _ExecutionContext(null,null,null,new Map);new StatementInterpreter(reflector).visitAllStatements(statements,ctx);var result={};return ctx.exports.forEach(function(exportName){result[exportName]=ctx.vars.get(exportName)}),result}(statements,this._reflector)},JitCompiler}(),CompiledTemplate=function(){function CompiledTemplate(isHost,compType,compMeta,ngModule,directives){this.isHost=isHost,this.compType=compType,this.compMeta=compMeta,this.ngModule=ngModule,this.directives=directives,this._viewClass=null,this.isCompiled=!1}return CompiledTemplate.prototype.compiled=function(viewClass,rendererType){for(var prop in this._viewClass=viewClass,this.compMeta.componentViewType.setDelegate(viewClass),rendererType)this.compMeta.rendererType[prop]=rendererType[prop];this.isCompiled=!0},CompiledTemplate}();function assertComponent(meta){Iif(!meta.isComponent)throw new Error("Could not compile '"+identifierName(meta.type)+"' because it is not a component.")}function createOutputContext(){return{statements:[],genFilePath:"",importExpr:function(symbol){return importExpr({name:identifierName(symbol),moduleName:null,runtime:symbol})},constantPool:new ConstantPool}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var CompileReflector=function CompileReflector(){};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var UrlResolver=function(){function UrlResolverImpl(_packagePrefix){void 0===_packagePrefix&&(_packagePrefix=null),this._packagePrefix=_packagePrefix}return UrlResolverImpl.prototype.resolve=function(baseUrl,url){var resolvedUrl=url;null!=baseUrl&&baseUrl.length>0&&(resolvedUrl=function _resolveUrl(base,url){var parts=_split(encodeURI(url)),baseParts=_split(base);if(null!=parts[_ComponentIndex.Scheme])return _joinAndCanonicalizePath(parts);parts[_ComponentIndex.Scheme]=baseParts[_ComponentIndex.Scheme];for(var i=_ComponentIndex.Scheme;i<=_ComponentIndex.Port;i++)null==parts[i]&&(parts[i]=baseParts[i]);if("/"==parts[_ComponentIndex.Path][0])return _joinAndCanonicalizePath(parts);var path=baseParts[_ComponentIndex.Path];null==path&&(path="/");var index=path.lastIndexOf("/");return path=path.substring(0,index+1)+parts[_ComponentIndex.Path],parts[_ComponentIndex.Path]=path,_joinAndCanonicalizePath(parts)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(baseUrl,resolvedUrl));var resolvedParts=_split(resolvedUrl),prefix=this._packagePrefix;if(null!=prefix&&null!=resolvedParts&&"package"==resolvedParts[_ComponentIndex.Scheme]){var path=resolvedParts[_ComponentIndex.Path];return(prefix=prefix.replace(/\/+$/,""))+"/"+(path=path.replace(/^\/+/,""))}return resolvedUrl},UrlResolverImpl}();function getUrlScheme(url){var match=_split(url);return match&&match[_ComponentIndex.Scheme]||""}var _ComponentIndex,_splitRe=new RegExp("^(?:([^:/?#.]+):)?(?://(?:([^/?#]*)@)?([\\w\\d\\-\\u0100-\\uffff.%]*)(?::([0-9]+))?)?([^?#]+)?(?:\\?([^#]*))?(?:#(.*))?$");function _split(uri){return uri.match(_splitRe)}function _joinAndCanonicalizePath(parts){var path=parts[_ComponentIndex.Path];return path=null==path?"":function _removeDotSegments(path){if("/"==path)return"/";for(var leadingSlash="/"==path[0]?"/":"",trailingSlash="/"===path[path.length-1]?"/":"",segments=path.split("/"),out=[],up=0,pos=0;pos<segments.length;pos++){var segment=segments[pos];switch(segment){case"":case".":break;case"..":out.length>0?out.pop():up++;break;default:out.push(segment)}}if(""==leadingSlash){for(;up-- >0;)out.unshift("..");0===out.length&&out.push(".")}return leadingSlash+out.join("/")+trailingSlash}(path),parts[_ComponentIndex.Path]=path,function _buildFromEncodedParts(opt_scheme,opt_userInfo,opt_domain,opt_port,opt_path,opt_queryData,opt_fragment){var out=[];return null!=opt_scheme&&out.push(opt_scheme+":"),null!=opt_domain&&(out.push("//"),null!=opt_userInfo&&out.push(opt_userInfo+"@"),out.push(opt_domain),null!=opt_port&&out.push(":"+opt_port)),null!=opt_path&&out.push(opt_path),null!=opt_queryData&&out.push("?"+opt_queryData),null!=opt_fragment&&out.push("#"+opt_fragment),out.join("")}(parts[_ComponentIndex.Scheme],parts[_ComponentIndex.UserInfo],parts[_ComponentIndex.Domain],parts[_ComponentIndex.Port],path,parts[_ComponentIndex.QueryData],parts[_ComponentIndex.Fragment])}!function(_ComponentIndex){_ComponentIndex[_ComponentIndex.Scheme=1]="Scheme",_ComponentIndex[_ComponentIndex.UserInfo=2]="UserInfo",_ComponentIndex[_ComponentIndex.Domain=3]="Domain",_ComponentIndex[_ComponentIndex.Port=4]="Port",_ComponentIndex[_ComponentIndex.Path=5]="Path",_ComponentIndex[_ComponentIndex.QueryData=6]="QueryData",_ComponentIndex[_ComponentIndex.Fragment=7]="Fragment"}(_ComponentIndex||(_ComponentIndex={}));(function(){function Extractor(host,staticSymbolResolver,messageBundle,metadataResolver){this.host=host,this.staticSymbolResolver=staticSymbolResolver,this.messageBundle=messageBundle,this.metadataResolver=metadataResolver}Extractor.prototype.extract=function(rootFiles){var _this=this,_a=analyzeAndValidateNgModules(rootFiles,this.host,this.staticSymbolResolver,this.metadataResolver),files=_a.files,ngModules=_a.ngModules;return Promise.all(ngModules.map(function(ngModule){return _this.metadataResolver.loadNgModuleDirectiveAndPipeMetadata(ngModule.type.reference,!1)})).then(function(){var errors=[];if(files.forEach(function(file){var compMetas=[];file.directives.forEach(function(directiveType){var dirMeta=_this.metadataResolver.getDirectiveMetadata(directiveType);dirMeta&&dirMeta.isComponent&&compMetas.push(dirMeta)}),compMetas.forEach(function(compMeta){var html=compMeta.template.template,templateUrl=compMeta.template.templateUrl,interpolationConfig=InterpolationConfig.fromArray(compMeta.template.interpolation);errors.push.apply(errors,Object(tslib__WEBPACK_IMPORTED_MODULE_0__.g)(_this.messageBundle.updateFromTemplate(html,templateUrl,interpolationConfig)))})}),errors.length)throw new Error(errors.map(function(e){return e.toString()}).join("\n"));return _this.messageBundle})},Extractor.create=function(host,locale){var htmlParser=new HtmlParser,urlResolver=createAotUrlResolver(host),symbolCache=new StaticSymbolCache,summaryResolver=new AotSummaryResolver(host,symbolCache),staticSymbolResolver=new StaticSymbolResolver(host,symbolCache,summaryResolver),staticReflector=new StaticReflector(summaryResolver,staticSymbolResolver),config=new CompilerConfig({defaultEncapsulation:ViewEncapsulation.Emulated,useJit:!1}),normalizer=new DirectiveNormalizer({get:function(url){return host.loadResource(url)}},urlResolver,htmlParser,config),elementSchemaRegistry=new DomElementSchemaRegistry,resolver=new CompileMetadataResolver(config,htmlParser,new NgModuleResolver(staticReflector),new DirectiveResolver(staticReflector),new PipeResolver(staticReflector),summaryResolver,elementSchemaRegistry,normalizer,console,symbolCache,staticReflector),messageBundle=new MessageBundle(htmlParser,[],{},locale);return{extractor:new Extractor(host,staticSymbolResolver,messageBundle,resolver),staticReflector:staticReflector}}})(),function(){function R3TargetBinder(directiveMatcher){this.directiveMatcher=directiveMatcher}R3TargetBinder.prototype.bind=function(target){if(!target.template)throw new Error("Binding without a template not yet supported");var scope=Scope.apply(target.template),_a=DirectiveBinder.apply(target.template,this.directiveMatcher),directives=_a.directives,bindings=_a.bindings,references=_a.references,_b=TemplateBinder.apply(target.template,scope),expressions=_b.expressions,symbols=_b.symbols,nestingLevel=_b.nestingLevel,usedPipes=_b.usedPipes;return new R3BoundTarget(target,directives,bindings,references,expressions,symbols,nestingLevel,usedPipes)}}()
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var Scope=function(){function Scope(parentScope){this.parentScope=parentScope,this.namedEntities=new Map,this.childScopes=new Map}return Scope.apply=function(template){var scope=new Scope;return scope.ingest(template),scope},Scope.prototype.ingest=function(template){var _this=this;template instanceof Template?(template.variables.forEach(function(node){return _this.visitVariable(node)}),template.children.forEach(function(node){return node.visit(_this)})):template.forEach(function(node){return node.visit(_this)})},Scope.prototype.visitElement=function(element){var _this=this;element.references.forEach(function(node){return _this.visitReference(node)}),element.children.forEach(function(node){return node.visit(_this)})},Scope.prototype.visitTemplate=function(template){var _this=this;template.references.forEach(function(node){return _this.visitReference(node)});var scope=new Scope(this);scope.ingest(template),this.childScopes.set(template,scope)},Scope.prototype.visitVariable=function(variable){this.maybeDeclare(variable)},Scope.prototype.visitReference=function(reference){this.maybeDeclare(reference)},Scope.prototype.visitContent=function(content){},Scope.prototype.visitBoundAttribute=function(attr){},Scope.prototype.visitBoundEvent=function(event){},Scope.prototype.visitBoundText=function(text){},Scope.prototype.visitText=function(text){},Scope.prototype.visitTextAttribute=function(attr){},Scope.prototype.visitIcu=function(icu){},Scope.prototype.maybeDeclare=function(thing){this.namedEntities.has(thing.name)||this.namedEntities.set(thing.name,thing)},Scope.prototype.lookup=function(name){return this.namedEntities.has(name)?this.namedEntities.get(name):void 0!==this.parentScope?this.parentScope.lookup(name):null},Scope.prototype.getChildScope=function(template){var res=this.childScopes.get(template);if(void 0===res)throw new Error("Assertion error: child scope for "+template+" not found");return res},Scope}(),DirectiveBinder=function(){function DirectiveBinder(matcher,directives,bindings,references){this.matcher=matcher,this.directives=directives,this.bindings=bindings,this.references=references}return DirectiveBinder.apply=function(template,selectorMatcher){var directives=new Map,bindings=new Map,references=new Map;return new DirectiveBinder(selectorMatcher,directives,bindings,references).ingest(template),{directives:directives,bindings:bindings,references:references}},DirectiveBinder.prototype.ingest=function(template){var _this=this;template.forEach(function(node){return node.visit(_this)})},DirectiveBinder.prototype.visitElement=function(element){this.visitElementOrTemplate(element.name,element)},DirectiveBinder.prototype.visitTemplate=function(template){this.visitElementOrTemplate("ng-template",template)},DirectiveBinder.prototype.visitElementOrTemplate=function(tag,node){var _this=this,cssSelector=new CssSelector;cssSelector.setElement(tag);var attrs=getAttrsForDirectiveMatching(node);Object.getOwnPropertyNames(attrs).forEach(function(name){var value=attrs[name];(cssSelector.addAttribute(name,value),"class"===name.toLowerCase())&&value.trim().split(/\s+/g).forEach(function(className){return cssSelector.addClassName(className)})});var directives=[];this.matcher.match(cssSelector,function(_,directive){return directives.push(directive)}),directives.length>0&&this.directives.set(node,directives),node.references.forEach(function(ref){var dirTarget=null;if(""===ref.value.trim())dirTarget=directives.find(function(dir){return dir.isComponent})||null;else if(null===(dirTarget=directives.find(function(dir){return null!==dir.exportAs&&dir.exportAs.some(function(value){return value===ref.value})})||null))throw new Error("Assertion error: failed to find directive with exportAs: "+ref.value);null!==dirTarget?_this.references.set(ref,{directive:dirTarget,node:node}):_this.references.set(ref,node)});var processAttribute=function(attribute){var dir=directives.find(function(dir){return dir.inputs.hasOwnProperty(attribute.name)});void 0!==dir?_this.bindings.set(attribute,dir):_this.bindings.set(attribute,node)};node.attributes.forEach(processAttribute),node.inputs.forEach(processAttribute),node.outputs.forEach(processAttribute),node instanceof Template&&node.templateAttrs.forEach(processAttribute),node.children.forEach(function(child){return child.visit(_this)})},DirectiveBinder.prototype.visitContent=function(content){},DirectiveBinder.prototype.visitVariable=function(variable){},DirectiveBinder.prototype.visitReference=function(reference){},DirectiveBinder.prototype.visitTextAttribute=function(attribute){},DirectiveBinder.prototype.visitBoundAttribute=function(attribute){},DirectiveBinder.prototype.visitBoundEvent=function(attribute){},DirectiveBinder.prototype.visitBoundAttributeOrEvent=function(node){},DirectiveBinder.prototype.visitText=function(text){},DirectiveBinder.prototype.visitBoundText=function(text){},DirectiveBinder.prototype.visitIcu=function(icu){},DirectiveBinder}(),TemplateBinder=function(_super){function TemplateBinder(bindings,symbols,usedPipes,nestingLevel,scope,template,level){var _this=_super.call(this)||this;return _this.bindings=bindings,_this.symbols=symbols,_this.usedPipes=usedPipes,_this.nestingLevel=nestingLevel,_this.scope=scope,_this.template=template,_this.level=level,_this.pipesUsed=[],_this.visitNode=function(node){return node.visit(_this)},_this}return Object(tslib__WEBPACK_IMPORTED_MODULE_0__.c)(TemplateBinder,_super),TemplateBinder.apply=function(template,scope){var expressions=new Map,symbols=new Map,nestingLevel=new Map,usedPipes=new Set;return new TemplateBinder(expressions,symbols,usedPipes,nestingLevel,scope,template instanceof Template?template:null,0).ingest(template),{expressions:expressions,symbols:symbols,nestingLevel:nestingLevel,usedPipes:usedPipes}},TemplateBinder.prototype.ingest=function(template){template instanceof Template?(template.inputs.forEach(this.visitNode),template.outputs.forEach(this.visitNode),template.templateAttrs.forEach(this.visitNode),template.variables.forEach(this.visitNode),template.children.forEach(this.visitNode),this.nestingLevel.set(template,this.level)):template.forEach(this.visitNode)},TemplateBinder.prototype.visitElement=function(element){element.inputs.forEach(this.visitNode),element.outputs.forEach(this.visitNode),element.children.forEach(this.visitNode)},TemplateBinder.prototype.visitTemplate=function(template){template.inputs.forEach(this.visitNode),template.outputs.forEach(this.visitNode),template.templateAttrs.forEach(this.visitNode),template.references.forEach(this.visitNode);var childScope=this.scope.getChildScope(template);new TemplateBinder(this.bindings,this.symbols,this.usedPipes,this.nestingLevel,childScope,template,this.level+1).ingest(template)},TemplateBinder.prototype.visitVariable=function(variable){null!==this.template&&this.symbols.set(variable,this.template)},TemplateBinder.prototype.visitReference=function(reference){null!==this.template&&this.symbols.set(reference,this.template)},TemplateBinder.prototype.visitText=function(text){},TemplateBinder.prototype.visitContent=function(content){},TemplateBinder.prototype.visitTextAttribute=function(attribute){},TemplateBinder.prototype.visitIcu=function(icu){},TemplateBinder.prototype.visitBoundAttribute=function(attribute){attribute.value.visit(this)},TemplateBinder.prototype.visitBoundEvent=function(event){event.handler.visit(this)},TemplateBinder.prototype.visitBoundText=function(text){text.value.visit(this)},TemplateBinder.prototype.visitPipe=function(ast,context){return this.usedPipes.add(ast.name),_super.prototype.visitPipe.call(this,ast,context)},TemplateBinder.prototype.visitPropertyRead=function(ast,context){return this.maybeMap(context,ast,ast.name),_super.prototype.visitPropertyRead.call(this,ast,context)},TemplateBinder.prototype.visitSafePropertyRead=function(ast,context){return this.maybeMap(context,ast,ast.name),_super.prototype.visitSafePropertyRead.call(this,ast,context)},TemplateBinder.prototype.visitPropertyWrite=function(ast,context){return this.maybeMap(context,ast,ast.name),_super.prototype.visitPropertyWrite.call(this,ast,context)},TemplateBinder.prototype.visitMethodCall=function(ast,context){return this.maybeMap(context,ast,ast.name),_super.prototype.visitMethodCall.call(this,ast,context)},TemplateBinder.prototype.visitSafeMethodCall=function(ast,context){return this.maybeMap(context,ast,ast.name),_super.prototype.visitSafeMethodCall.call(this,ast,context)},TemplateBinder.prototype.maybeMap=function(scope,ast,name){if(ast.receiver instanceof ImplicitReceiver){var target=this.scope.lookup(name);null!==target&&this.bindings.set(ast,target)}},TemplateBinder}(RecursiveAstVisitor$1),R3BoundTarget=function(){function R3BoundTarget(target,directives,bindings,references,exprTargets,symbols,nestingLevel,usedPipes){this.target=target,this.directives=directives,this.bindings=bindings,this.references=references,this.exprTargets=exprTargets,this.symbols=symbols,this.nestingLevel=nestingLevel,this.usedPipes=usedPipes}return R3BoundTarget.prototype.getDirectivesOfNode=function(node){return this.directives.get(node)||null},R3BoundTarget.prototype.getReferenceTarget=function(ref){return this.references.get(ref)||null},R3BoundTarget.prototype.getConsumerOfBinding=function(binding){return this.bindings.get(binding)||null},R3BoundTarget.prototype.getExpressionTarget=function(expr){return this.exprTargets.get(expr)||null},R3BoundTarget.prototype.getTemplateOfSymbol=function(symbol){return this.symbols.get(symbol)||null},R3BoundTarget.prototype.getNestingLevel=function(template){return this.nestingLevel.get(template)||0},R3BoundTarget.prototype.getUsedDirectives=function(){var set=new Set;return this.directives.forEach(function(dirs){return dirs.forEach(function(dir){return set.add(dir)})}),Array.from(set.values())},R3BoundTarget.prototype.getUsedPipes=function(){return Array.from(this.usedPipes)},R3BoundTarget}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
!function publishFacade(global){(global.ng||(global.ng={})).ɵcompilerFacade=new CompilerFacadeImpl}(_global)}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){var global=__webpack_require__(7),getOwnPropertyDescriptor=__webpack_require__(31).f,hide=__webpack_require__(25),redefine=__webpack_require__(32),setGlobal=__webpack_require__(145),copyConstructorProperties=__webpack_require__(199),isForced=__webpack_require__(105);module.exports=function(options,source){var target,key,targetProperty,sourceProperty,descriptor,TARGET=options.target,GLOBAL=options.global,STATIC=options.stat;Eif(target=GLOBAL?global:STATIC?global[TARGET]||setGlobal(TARGET,{}):(global[TARGET]||{}).prototype)for(key in source){if(sourceProperty=source[key],targetProperty=options.noTargetGet?(descriptor=getOwnPropertyDescriptor(target,key))&&descriptor.value:target[key],!isForced(GLOBAL?key:TARGET+(STATIC?".":"#")+key,options.forced)&&void 0!==targetProperty){Eif(typeof sourceProperty==typeof targetProperty)continue;copyConstructorProperties(sourceProperty,targetProperty)}(options.sham||targetProperty&&targetProperty.sham)&&hide(sourceProperty,"sham",!0),redefine(target,key,sourceProperty,options)}}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10);module.exports=function(it){Iif(!isObject(it))throw TypeError(String(it)+" is not an object");return it}},function(module,__webpack_exports__,__webpack_require__){"use strict";var Subscriber=__webpack_require__(8);var rxSubscriber=__webpack_require__(64),Observer=__webpack_require__(77);var observable=__webpack_require__(36),noop=__webpack_require__(29);function pipeFromArray(fns){return fns?1===fns.length?fns[0]:function piped(input){return fns.reduce(function(prev,fn){return fn(prev)},input)}:noop.a}var config=__webpack_require__(21);__webpack_require__.d(__webpack_exports__,"a",function(){return Observable_Observable});var Observable_Observable=function(){function Observable(subscribe){this._isScalar=!1,subscribe&&(this._subscribe=subscribe)}return Observable.prototype.lift=function(operator){var observable=new Observable;return observable.source=this,observable.operator=operator,observable},Observable.prototype.subscribe=function(observerOrNext,error,complete){var operator=this.operator,sink=function toSubscriber(nextOrObserver,error,complete){Eif(nextOrObserver){if(nextOrObserver instanceof Subscriber.a)return nextOrObserver;Iif(nextOrObserver[rxSubscriber.a])return nextOrObserver[rxSubscriber.a]()}return nextOrObserver||error||complete?new Subscriber.a(nextOrObserver,error,complete):new Subscriber.a(Observer.a)}(observerOrNext,error,complete);Iif(operator?sink.add(operator.call(sink,this.source)):sink.add(this.source||config.a.useDeprecatedSynchronousErrorHandling&&!sink.syncErrorThrowable?this._subscribe(sink):this._trySubscribe(sink)),config.a.useDeprecatedSynchronousErrorHandling&&sink.syncErrorThrowable&&(sink.syncErrorThrowable=!1,sink.syncErrorThrown))throw sink.syncErrorValue;return sink},Observable.prototype._trySubscribe=function(sink){try{return this._subscribe(sink)}catch(err){config.a.useDeprecatedSynchronousErrorHandling&&(sink.syncErrorThrown=!0,sink.syncErrorValue=err),!function canReportError(observer){for(;observer;){var _a=observer,closed_1=_a.closed,destination=_a.destination,isStopped=_a.isStopped;if(closed_1||isStopped)return!1;observer=destination&&destination instanceof Subscriber.a?destination:null}return!0}(sink)?console.warn(err):sink.error(err)}},Observable.prototype.forEach=function(next,promiseCtor){var _this=this;return new(promiseCtor=getPromiseCtor(promiseCtor))(function(resolve,reject){var subscription;subscription=_this.subscribe(function(value){try{next(value)}catch(err){reject(err),subscription&&subscription.unsubscribe()}},reject,resolve)})},Observable.prototype._subscribe=function(subscriber){var source=this.source;return source&&source.subscribe(subscriber)},Observable.prototype[observable.a]=function(){return this},Observable.prototype.pipe=function(){for(var operations=[],_i=0;_i<arguments.length;_i++)operations[_i]=arguments[_i];return 0===operations.length?this:pipeFromArray(operations)(this)},Observable.prototype.toPromise=function(promiseCtor){var _this=this;return new(promiseCtor=getPromiseCtor(promiseCtor))(function(resolve,reject){var value;_this.subscribe(function(x){return value=x},function(err){return reject(err)},function(){return resolve(value)})})},Observable.create=function(subscribe){return new Observable(subscribe)},Observable}();function getPromiseCtor(promiseCtor){if(promiseCtor||(promiseCtor=config.a.Promise||Promise),!promiseCtor)throw new Error("no Promise impl found");return promiseCtor}},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14);__webpack_require__(3)({target:"Object",stat:!0,forced:!DESCRIPTORS,sham:!DESCRIPTORS},{defineProperty:__webpack_require__(15).f})},function(module,exports){module.exports="object"==typeof window&&window&&window.Math==Math?window:"object"==typeof self&&self&&self.Math==Math?self:Function("return this")()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return Subscriber});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_util_isFunction__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(62),_Observer__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(77),_Subscription__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(11),_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(64),_config__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(21),_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(49),Subscriber=function(_super){function Subscriber(destinationOrNext,error,complete){var _this=_super.call(this)||this;switch(_this.syncErrorValue=null,_this.syncErrorThrown=!1,_this.syncErrorThrowable=!1,_this.isStopped=!1,arguments.length){case 0:_this.destination=_Observer__WEBPACK_IMPORTED_MODULE_2__.a;break;case 1:Iif(!destinationOrNext){_this.destination=_Observer__WEBPACK_IMPORTED_MODULE_2__.a;break}Eif("object"==typeof destinationOrNext){destinationOrNext instanceof Subscriber?(_this.syncErrorThrowable=destinationOrNext.syncErrorThrowable,_this.destination=destinationOrNext,destinationOrNext.add(_this)):(_this.syncErrorThrowable=!0,_this.destination=new SafeSubscriber(_this,destinationOrNext));break}default:_this.syncErrorThrowable=!0,_this.destination=new SafeSubscriber(_this,destinationOrNext,error,complete)}return _this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(Subscriber,_super),Subscriber.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_4__.a]=function(){return this},Subscriber.create=function(next,error,complete){var subscriber=new Subscriber(next,error,complete);return subscriber.syncErrorThrowable=!1,subscriber},Subscriber.prototype.next=function(value){this.isStopped||this._next(value)},Subscriber.prototype.error=function(err){this.isStopped||(this.isStopped=!0,this._error(err))},Subscriber.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},Subscriber.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,_super.prototype.unsubscribe.call(this))},Subscriber.prototype._next=function(value){this.destination.next(value)},Subscriber.prototype._error=function(err){this.destination.error(err),this.unsubscribe()},Subscriber.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},Subscriber.prototype._unsubscribeAndRecycle=function(){var _parent=this._parent,_parents=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=_parent,this._parents=_parents,this},Subscriber}(_Subscription__WEBPACK_IMPORTED_MODULE_3__.a),SafeSubscriber=function(_super){function SafeSubscriber(_parentSubscriber,observerOrNext,error,complete){var next,_this=_super.call(this)||this;_this._parentSubscriber=_parentSubscriber;var context=_this;return Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__.a)(observerOrNext)?next=observerOrNext:observerOrNext&&(next=observerOrNext.next,error=observerOrNext.error,complete=observerOrNext.complete,observerOrNext!==_Observer__WEBPACK_IMPORTED_MODULE_2__.a&&(context=Object.create(observerOrNext),Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_1__.a)(context.unsubscribe)&&_this.add(context.unsubscribe.bind(context)),context.unsubscribe=_this.unsubscribe.bind(_this))),_this._context=context,_this._next=next,_this._error=error,_this._complete=complete,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(SafeSubscriber,_super),SafeSubscriber.prototype.next=function(value){Eif(!this.isStopped&&this._next){var _parentSubscriber=this._parentSubscriber;_config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling&&_parentSubscriber.syncErrorThrowable?this.__tryOrSetError(_parentSubscriber,this._next,value)&&this.unsubscribe():this.__tryOrUnsub(this._next,value)}},SafeSubscriber.prototype.error=function(err){if(!this.isStopped){var _parentSubscriber=this._parentSubscriber,useDeprecatedSynchronousErrorHandling=_config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling;if(this._error)useDeprecatedSynchronousErrorHandling&&_parentSubscriber.syncErrorThrowable?(this.__tryOrSetError(_parentSubscriber,this._error,err),this.unsubscribe()):(this.__tryOrUnsub(this._error,err),this.unsubscribe());else if(_parentSubscriber.syncErrorThrowable)useDeprecatedSynchronousErrorHandling?(_parentSubscriber.syncErrorValue=err,_parentSubscriber.syncErrorThrown=!0):Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__.a)(err),this.unsubscribe();else{if(this.unsubscribe(),useDeprecatedSynchronousErrorHandling)throw err;Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__.a)(err)}}},SafeSubscriber.prototype.complete=function(){var _this=this;Eif(!this.isStopped){var _parentSubscriber=this._parentSubscriber;Iif(this._complete){var wrappedComplete=function(){return _this._complete.call(_this._context)};_config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling&&_parentSubscriber.syncErrorThrowable?(this.__tryOrSetError(_parentSubscriber,wrappedComplete),this.unsubscribe()):(this.__tryOrUnsub(wrappedComplete),this.unsubscribe())}else this.unsubscribe()}},SafeSubscriber.prototype.__tryOrUnsub=function(fn,value){try{fn.call(this._context,value)}catch(err){if(this.unsubscribe(),_config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling)throw err;Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__.a)(err)}},SafeSubscriber.prototype.__tryOrSetError=function(parent,fn,value){if(!_config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{fn.call(this._context,value)}catch(err){return _config__WEBPACK_IMPORTED_MODULE_5__.a.useDeprecatedSynchronousErrorHandling?(parent.syncErrorValue=err,parent.syncErrorThrown=!0,!0):(Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_6__.a)(err),!0)}return!1},SafeSubscriber.prototype._unsubscribe=function(){var _parentSubscriber=this._parentSubscriber;this._context=null,this._parentSubscriber=null,_parentSubscriber.unsubscribe()},SafeSubscriber}(Subscriber)},function(module,exports){module.exports=function(exec){try{return!!exec()}catch(error){return!0}}},function(module,exports){module.exports=function(it){return"object"==typeof it?null!==it:"function"==typeof it}},function(module,__webpack_exports__,__webpack_require__){"use strict";var isArray=__webpack_require__(120),isObject=__webpack_require__(121),isFunction=__webpack_require__(62);function UnsubscriptionErrorImpl(errors){return Error.call(this),this.message=errors?errors.length+" errors occurred during unsubscription:\n"+errors.map(function(err,i){return i+1+") "+err.toString()}).join("\n  "):"",this.name="UnsubscriptionError",this.errors=errors,this}UnsubscriptionErrorImpl.prototype=Object.create(Error.prototype);var UnsubscriptionError=UnsubscriptionErrorImpl;__webpack_require__.d(__webpack_exports__,"a",function(){return Subscription_Subscription});var Subscription_Subscription=function(){function Subscription(unsubscribe){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,unsubscribe&&(this._unsubscribe=unsubscribe)}var empty;return Subscription.prototype.unsubscribe=function(){var errors,hasErrors=!1;Eif(!this.closed){var _parent=this._parent,_parents=this._parents,_unsubscribe=this._unsubscribe,_subscriptions=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var index=-1,len=_parents?_parents.length:0;_parent;)_parent.remove(this),_parent=++index<len&&_parents[index]||null;if(Object(isFunction.a)(_unsubscribe))try{_unsubscribe.call(this)}catch(e){hasErrors=!0,errors=e instanceof UnsubscriptionError?flattenUnsubscriptionErrors(e.errors):[e]}if(Object(isArray.a)(_subscriptions))for(index=-1,len=_subscriptions.length;++index<len;){var sub=_subscriptions[index];Eif(Object(isObject.a)(sub))try{sub.unsubscribe()}catch(e){hasErrors=!0,errors=errors||[],e instanceof UnsubscriptionError?errors=errors.concat(flattenUnsubscriptionErrors(e.errors)):errors.push(e)}}Iif(hasErrors)throw new UnsubscriptionError(errors)}},Subscription.prototype.add=function(teardown){var subscription=teardown;switch(typeof teardown){case"function":subscription=new Subscription(teardown);case"object":if(subscription===this||subscription.closed||"function"!=typeof subscription.unsubscribe)return subscription;if(this.closed)return subscription.unsubscribe(),subscription;Iif(!(subscription instanceof Subscription)){var tmp=subscription;(subscription=new Subscription)._subscriptions=[tmp]}break;default:if(!teardown)return Subscription.EMPTY;throw new Error("unrecognized teardown "+teardown+" added to Subscription.")}Eif(subscription._addParent(this)){var subscriptions=this._subscriptions;subscriptions?subscriptions.push(subscription):this._subscriptions=[subscription]}return subscription},Subscription.prototype.remove=function(subscription){var subscriptions=this._subscriptions;Iif(subscriptions){var subscriptionIndex=subscriptions.indexOf(subscription);-1!==subscriptionIndex&&subscriptions.splice(subscriptionIndex,1)}},Subscription.prototype._addParent=function(parent){var _parent=this._parent,_parents=this._parents;return _parent!==parent&&(_parent?_parents?-1===_parents.indexOf(parent)&&(_parents.push(parent),!0):(this._parents=[parent],!0):(this._parent=parent,!0))},Subscription.EMPTY=((empty=new Subscription).closed=!0,empty),Subscription}();function flattenUnsubscriptionErrors(errors){return errors.reduce(function(errs,err){return errs.concat(err instanceof UnsubscriptionError?err.errors:err)},[])}},function(module,exports,__webpack_require__){var store=__webpack_require__(71)("wks"),uid=__webpack_require__(99),Symbol=__webpack_require__(7).Symbol,NATIVE_SYMBOL=__webpack_require__(196);module.exports=function(name){return store[name]||(store[name]=NATIVE_SYMBOL&&Symbol[name]||(NATIVE_SYMBOL?Symbol:uid)("Symbol."+name))}},function(module,exports,__webpack_require__){"use strict";var keys=__webpack_require__(137),hasSymbols="function"==typeof Symbol&&"symbol"==typeof Symbol("foo"),toStr=Object.prototype.toString,concat=Array.prototype.concat,origDefineProperty=Object.defineProperty,supportsDescriptors=origDefineProperty&&function(){var obj={};try{for(var _ in origDefineProperty(obj,"x",{enumerable:!1,value:obj}),obj)return!1;return obj.x===obj}catch(e){return!1}}(),defineProperty=function(object,name,value,predicate){var fn;name in object&&("function"!=typeof(fn=predicate)||"[object Function]"!==toStr.call(fn)||!predicate())||(supportsDescriptors?origDefineProperty(object,name,{configurable:!0,enumerable:!1,value:value,writable:!0}):object[name]=value)},defineProperties=function(object,map){var predicates=arguments.length>2?arguments[2]:{},props=keys(map);hasSymbols&&(props=concat.call(props,Object.getOwnPropertySymbols(map)));for(var i=0;i<props.length;i+=1)defineProperty(object,props[i],map[props[i]],predicates[props[i]])};defineProperties.supportsDescriptors=!!supportsDescriptors,module.exports=defineProperties},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(9)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14),IE8_DOM_DEFINE=__webpack_require__(194),anObject=__webpack_require__(4),toPrimitive=__webpack_require__(69),nativeDefineProperty=Object.defineProperty;exports.f=DESCRIPTORS?nativeDefineProperty:function defineProperty(O,P,Attributes){if(anObject(O),P=toPrimitive(P,!0),anObject(Attributes),IE8_DOM_DEFINE)try{return nativeDefineProperty(O,P,Attributes)}catch(error){}if("get"in Attributes||"set"in Attributes)throw TypeError("Accessors not supported");return"value"in Attributes&&(O[P]=Attributes.value),O}},function(module,exports){var hasOwnProperty={}.hasOwnProperty;module.exports=function(it,key){return hasOwnProperty.call(it,key)}},function(module,exports,__webpack_require__){var path=__webpack_require__(85),has=__webpack_require__(16),wrappedWellKnownSymbolModule=__webpack_require__(205),defineProperty=__webpack_require__(15).f;module.exports=function(NAME){var Symbol=path.Symbol||(path.Symbol={});has(Symbol,NAME)||defineProperty(Symbol,NAME,{value:wrappedWellKnownSymbolModule.f(NAME)})}},function(module,exports){var g;g=function(){return this}();try{g=g||new Function("return this")()}catch(e){"object"==typeof window&&(g=window)}module.exports=g},function(module,exports,__webpack_require__){var DOMIterables=__webpack_require__(212),forEach=__webpack_require__(213),hide=__webpack_require__(25),global=__webpack_require__(7);for(var COLLECTION_NAME in DOMIterables){var Collection=global[COLLECTION_NAME],CollectionPrototype=Collection&&Collection.prototype;if(CollectionPrototype&&CollectionPrototype.forEach!==forEach)try{hide(CollectionPrototype,"forEach",forEach)}catch(error){CollectionPrototype.forEach=forEach}}},function(module,exports,__webpack_require__){(function(global){var win;win="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{},module.exports=win}).call(this,__webpack_require__(18))},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return config});var _enable_super_gross_mode_that_will_cause_bad_things=!1,config={Promise:void 0,set useDeprecatedSynchronousErrorHandling(value){value&&(new Error).stack;_enable_super_gross_mode_that_will_cause_bad_things=value},get useDeprecatedSynchronousErrorHandling(){return _enable_super_gross_mode_that_will_cause_bad_things}}},function(module,exports,__webpack_require__){"use strict";var forEach=__webpack_require__(213);__webpack_require__(3)({target:"Array",proto:!0,forced:[].forEach!=forEach},{forEach:forEach})},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(287);module.exports=Function.prototype.bind||implementation},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(98),min=Math.min;module.exports=function(argument){return argument>0?min(toInteger(argument),9007199254740991):0}},function(module,exports,__webpack_require__){var definePropertyModule=__webpack_require__(15),createPropertyDescriptor=__webpack_require__(70);module.exports=__webpack_require__(14)?function(object,key,value){return definePropertyModule.f(object,key,createPropertyDescriptor(1,value))}:function(object,key,value){return object[key]=value,object}},function(module,exports,__webpack_require__){var toString=__webpack_require__(356),ObjectPrototype=Object.prototype;toString!==ObjectPrototype.toString&&__webpack_require__(32)(ObjectPrototype,"toString",toString,{unsafe:!0})},function(module,exports,__webpack_require__){"use strict";var toIndexedObject=__webpack_require__(40),addToUnscopables=__webpack_require__(209),Iterators=__webpack_require__(86),InternalStateModule=__webpack_require__(50),defineIterator=__webpack_require__(147),setInternalState=InternalStateModule.set,getInternalState=InternalStateModule.getterFor("Array Iterator");module.exports=defineIterator(Array,"Array",function(iterated,kind){setInternalState(this,{type:"Array Iterator",target:toIndexedObject(iterated),index:0,kind:kind})},function(){var state=getInternalState(this),target=state.target,kind=state.kind,index=state.index++;return!target||index>=target.length?(state.target=void 0,{value:void 0,done:!0}):"keys"==kind?{value:index,done:!1}:"values"==kind?{value:target[index],done:!1}:{value:[index,target[index]],done:!1}},"values"),Iterators.Arguments=Iterators.Array,addToUnscopables("keys"),addToUnscopables("values"),addToUnscopables("entries")},function(module,exports,__webpack_require__){var freeGlobal=__webpack_require__(230),freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")();module.exports=root},function(module,__webpack_exports__,__webpack_require__){"use strict";function noop(){}__webpack_require__.d(__webpack_exports__,"a",function(){return noop})},function(module,exports,__webpack_require__){var requireObjectCoercible=__webpack_require__(39);module.exports=function(argument){return Object(requireObjectCoercible(argument))}},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14),propertyIsEnumerableModule=__webpack_require__(83),createPropertyDescriptor=__webpack_require__(70),toIndexedObject=__webpack_require__(40),toPrimitive=__webpack_require__(69),has=__webpack_require__(16),IE8_DOM_DEFINE=__webpack_require__(194),nativeGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor;exports.f=DESCRIPTORS?nativeGetOwnPropertyDescriptor:function getOwnPropertyDescriptor(O,P){if(O=toIndexedObject(O),P=toPrimitive(P,!0),IE8_DOM_DEFINE)try{return nativeGetOwnPropertyDescriptor(O,P)}catch(error){}if(has(O,P))return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O,P),O[P])}},function(module,exports,__webpack_require__){var global=__webpack_require__(7),hide=__webpack_require__(25),has=__webpack_require__(16),setGlobal=__webpack_require__(145),nativeFunctionToString=__webpack_require__(197),InternalStateModule=__webpack_require__(50),getInternalState=InternalStateModule.get,enforceInternalState=InternalStateModule.enforce,TEMPLATE=String(nativeFunctionToString).split("toString");__webpack_require__(71)("inspectSource",function(it){return nativeFunctionToString.call(it)}),(module.exports=function(O,key,value,options){var unsafe=!!options&&!!options.unsafe,simple=!!options&&!!options.enumerable,noTargetGet=!!options&&!!options.noTargetGet;"function"==typeof value&&("string"!=typeof key||has(value,"name")||hide(value,"name",key),enforceInternalState(value).source=TEMPLATE.join("string"==typeof key?key:"")),O!==global?(unsafe?!noTargetGet&&O[key]&&(simple=!0):delete O[key],simple?O[key]=value:hide(O,key,value)):simple?O[key]=value:setGlobal(key,value)})(Function.prototype,"toString",function toString(){return"function"==typeof this&&getInternalState(this).source||nativeFunctionToString.call(this)})},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(7),has=__webpack_require__(16),DESCRIPTORS=__webpack_require__(14),IS_PURE=__webpack_require__(82),$export=__webpack_require__(3),redefine=__webpack_require__(32),hiddenKeys=__webpack_require__(84),fails=__webpack_require__(9),shared=__webpack_require__(71),setToStringTag=__webpack_require__(56),uid=__webpack_require__(99),wellKnownSymbol=__webpack_require__(12),wrappedWellKnownSymbolModule=__webpack_require__(205),defineWellKnownSymbol=__webpack_require__(17),enumKeys=__webpack_require__(357),isArray=__webpack_require__(81),anObject=__webpack_require__(4),isObject=__webpack_require__(10),toIndexedObject=__webpack_require__(40),toPrimitive=__webpack_require__(69),createPropertyDescriptor=__webpack_require__(70),nativeObjectCreate=__webpack_require__(57),getOwnPropertyNamesExternal=__webpack_require__(358),getOwnPropertyDescriptorModule=__webpack_require__(31),definePropertyModule=__webpack_require__(15),propertyIsEnumerableModule=__webpack_require__(83),hide=__webpack_require__(25),objectKeys=__webpack_require__(72),HIDDEN=__webpack_require__(102)("hidden"),InternalStateModule=__webpack_require__(50),setInternalState=InternalStateModule.set,getInternalState=InternalStateModule.getterFor("Symbol"),nativeGetOwnPropertyDescriptor=getOwnPropertyDescriptorModule.f,nativeDefineProperty=definePropertyModule.f,nativeGetOwnPropertyNames=getOwnPropertyNamesExternal.f,$Symbol=global.Symbol,JSON=global.JSON,nativeJSONStringify=JSON&&JSON.stringify,TO_PRIMITIVE=wellKnownSymbol("toPrimitive"),nativePropertyIsEnumerable=propertyIsEnumerableModule.f,SymbolRegistry=shared("symbol-registry"),AllSymbols=shared("symbols"),ObjectPrototypeSymbols=shared("op-symbols"),WellKnownSymbolsStore=shared("wks"),ObjectPrototype=Object.prototype,QObject=global.QObject,NATIVE_SYMBOL=__webpack_require__(196),USE_SETTER=!QObject||!QObject.prototype||!QObject.prototype.findChild,setSymbolDescriptor=DESCRIPTORS&&fails(function(){return 7!=nativeObjectCreate(nativeDefineProperty({},"a",{get:function(){return nativeDefineProperty(this,"a",{value:7}).a}})).a})?function(it,key,D){var ObjectPrototypeDescriptor=nativeGetOwnPropertyDescriptor(ObjectPrototype,key);ObjectPrototypeDescriptor&&delete ObjectPrototype[key],nativeDefineProperty(it,key,D),ObjectPrototypeDescriptor&&it!==ObjectPrototype&&nativeDefineProperty(ObjectPrototype,key,ObjectPrototypeDescriptor)}:nativeDefineProperty,wrap=function(tag,description){var symbol=AllSymbols[tag]=nativeObjectCreate($Symbol.prototype);return setInternalState(symbol,{type:"Symbol",tag:tag,description:description}),DESCRIPTORS||(symbol.description=description),symbol},isSymbol=NATIVE_SYMBOL&&"symbol"==typeof $Symbol.iterator?function(it){return"symbol"==typeof it}:function(it){return Object(it)instanceof $Symbol},$defineProperty=function defineProperty(it,key,D){return it===ObjectPrototype&&$defineProperty(ObjectPrototypeSymbols,key,D),anObject(it),key=toPrimitive(key,!0),anObject(D),has(AllSymbols,key)?(D.enumerable?(has(it,HIDDEN)&&it[HIDDEN][key]&&(it[HIDDEN][key]=!1),D=nativeObjectCreate(D,{enumerable:createPropertyDescriptor(0,!1)})):(has(it,HIDDEN)||nativeDefineProperty(it,HIDDEN,createPropertyDescriptor(1,{})),it[HIDDEN][key]=!0),setSymbolDescriptor(it,key,D)):nativeDefineProperty(it,key,D)},$defineProperties=function defineProperties(it,P){anObject(it);for(var key,keys=enumKeys(P=toIndexedObject(P)),i=0,l=keys.length;l>i;)$defineProperty(it,key=keys[i++],P[key]);return it},$propertyIsEnumerable=function propertyIsEnumerable(key){var E=nativePropertyIsEnumerable.call(this,key=toPrimitive(key,!0));return!(this===ObjectPrototype&&has(AllSymbols,key)&&!has(ObjectPrototypeSymbols,key))&&(!(E||!has(this,key)||!has(AllSymbols,key)||has(this,HIDDEN)&&this[HIDDEN][key])||E)},$getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){if(it=toIndexedObject(it),key=toPrimitive(key,!0),it!==ObjectPrototype||!has(AllSymbols,key)||has(ObjectPrototypeSymbols,key)){var D=nativeGetOwnPropertyDescriptor(it,key);return!D||!has(AllSymbols,key)||has(it,HIDDEN)&&it[HIDDEN][key]||(D.enumerable=!0),D}},$getOwnPropertyNames=function getOwnPropertyNames(it){for(var key,names=nativeGetOwnPropertyNames(toIndexedObject(it)),result=[],i=0;names.length>i;)has(AllSymbols,key=names[i++])||has(hiddenKeys,key)||result.push(key);return result},$getOwnPropertySymbols=function getOwnPropertySymbols(it){for(var key,IS_OP=it===ObjectPrototype,names=nativeGetOwnPropertyNames(IS_OP?ObjectPrototypeSymbols:toIndexedObject(it)),result=[],i=0;names.length>i;)!has(AllSymbols,key=names[i++])||IS_OP&&!has(ObjectPrototype,key)||result.push(AllSymbols[key]);return result};NATIVE_SYMBOL||(redefine(($Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor");var description=void 0===arguments[0]?void 0:String(arguments[0]),tag=uid(description),setter=function(value){this===ObjectPrototype&&setter.call(ObjectPrototypeSymbols,value),has(this,HIDDEN)&&has(this[HIDDEN],tag)&&(this[HIDDEN][tag]=!1),setSymbolDescriptor(this,tag,createPropertyDescriptor(1,value))};return DESCRIPTORS&&USE_SETTER&&setSymbolDescriptor(ObjectPrototype,tag,{configurable:!0,set:setter}),wrap(tag,description)}).prototype,"toString",function toString(){return getInternalState(this).tag}),propertyIsEnumerableModule.f=$propertyIsEnumerable,definePropertyModule.f=$defineProperty,getOwnPropertyDescriptorModule.f=$getOwnPropertyDescriptor,__webpack_require__(103).f=getOwnPropertyNamesExternal.f=$getOwnPropertyNames,__webpack_require__(104).f=$getOwnPropertySymbols,DESCRIPTORS&&(nativeDefineProperty($Symbol.prototype,"description",{configurable:!0,get:function description(){return getInternalState(this).description}}),IS_PURE||redefine(ObjectPrototype,"propertyIsEnumerable",$propertyIsEnumerable,{unsafe:!0})),wrappedWellKnownSymbolModule.f=function(name){return wrap(wellKnownSymbol(name),name)}),$export({global:!0,wrap:!0,forced:!NATIVE_SYMBOL,sham:!NATIVE_SYMBOL},{Symbol:$Symbol});for(var wellKnownSymbols=objectKeys(WellKnownSymbolsStore),k=0;wellKnownSymbols.length>k;)defineWellKnownSymbol(wellKnownSymbols[k++]);$export({target:"Symbol",stat:!0,forced:!NATIVE_SYMBOL},{for:function(key){return has(SymbolRegistry,key+="")?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key)},keyFor:function keyFor(sym){if(!isSymbol(sym))throw TypeError(sym+" is not a symbol");for(var key in SymbolRegistry)if(SymbolRegistry[key]===sym)return key},useSetter:function(){USE_SETTER=!0},useSimple:function(){USE_SETTER=!1}}),$export({target:"Object",stat:!0,forced:!NATIVE_SYMBOL,sham:!DESCRIPTORS},{create:function create(it,P){return void 0===P?nativeObjectCreate(it):$defineProperties(nativeObjectCreate(it),P)},defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor}),$export({target:"Object",stat:!0,forced:!NATIVE_SYMBOL},{getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols}),JSON&&$export({target:"JSON",stat:!0,forced:!NATIVE_SYMBOL||fails(function(){var symbol=$Symbol();return"[null]"!=nativeJSONStringify([symbol])||"{}"!=nativeJSONStringify({a:symbol})||"{}"!=nativeJSONStringify(Object(symbol))})},{stringify:function stringify(it){for(var replacer,$replacer,args=[it],i=1;arguments.length>i;)args.push(arguments[i++]);if($replacer=replacer=args[1],(isObject(replacer)||void 0!==it)&&!isSymbol(it))return isArray(replacer)||(replacer=function(key,value){if("function"==typeof $replacer&&(value=$replacer.call(this,key,value)),!isSymbol(value))return value}),args[1]=replacer,nativeJSONStringify.apply(JSON,args)}}),$Symbol.prototype[TO_PRIMITIVE]||hide($Symbol.prototype,TO_PRIMITIVE,$Symbol.prototype.valueOf),setToStringTag($Symbol,"Symbol"),hiddenKeys[HIDDEN]=!0},function(module,exports,__webpack_require__){"use strict";var DESCRIPTORS=__webpack_require__(14),has=__webpack_require__(16),isObject=__webpack_require__(10),defineProperty=__webpack_require__(15).f,copyConstructorProperties=__webpack_require__(199),NativeSymbol=__webpack_require__(7).Symbol;Iif(DESCRIPTORS&&"function"==typeof NativeSymbol&&(!("description"in NativeSymbol.prototype)||void 0!==NativeSymbol().description)){var EmptyStringDescriptionStore={},SymbolWrapper=function Symbol(){var description=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),result=this instanceof SymbolWrapper?new NativeSymbol(description):void 0===description?NativeSymbol():NativeSymbol(description);return""===description&&(EmptyStringDescriptionStore[result]=!0),result};copyConstructorProperties(SymbolWrapper,NativeSymbol);var symbolPrototype=SymbolWrapper.prototype=NativeSymbol.prototype;symbolPrototype.constructor=SymbolWrapper;var symbolToString=symbolPrototype.toString,native="Symbol(test)"==String(NativeSymbol("test")),regexp=/^Symbol\((.*)\)[^)]+$/;defineProperty(symbolPrototype,"description",{configurable:!0,get:function description(){var symbol=isObject(this)?this.valueOf():this,string=symbolToString.call(symbol);if(has(EmptyStringDescriptionStore,symbol))return"";var desc=native?string.slice(7,-1):string.replace(regexp,"$1");return""===desc?void 0:desc}}),__webpack_require__(3)({global:!0,forced:!0},{Symbol:SymbolWrapper})}},function(module,exports,__webpack_require__){var DOMIterables=__webpack_require__(212),ArrayIteratorMethods=__webpack_require__(27),global=__webpack_require__(7),hide=__webpack_require__(25),wellKnownSymbol=__webpack_require__(12),ITERATOR=wellKnownSymbol("iterator"),TO_STRING_TAG=wellKnownSymbol("toStringTag"),ArrayValues=ArrayIteratorMethods.values;for(var COLLECTION_NAME in DOMIterables){var Collection=global[COLLECTION_NAME],CollectionPrototype=Collection&&Collection.prototype;if(CollectionPrototype){Iif(CollectionPrototype[ITERATOR]!==ArrayValues)try{hide(CollectionPrototype,ITERATOR,ArrayValues)}catch(error){CollectionPrototype[ITERATOR]=ArrayValues}if(CollectionPrototype[TO_STRING_TAG]||hide(CollectionPrototype,TO_STRING_TAG,COLLECTION_NAME),DOMIterables[COLLECTION_NAME])for(var METHOD_NAME in ArrayIteratorMethods)Iif(CollectionPrototype[METHOD_NAME]!==ArrayIteratorMethods[METHOD_NAME])try{hide(CollectionPrototype,METHOD_NAME,ArrayIteratorMethods[METHOD_NAME])}catch(error){CollectionPrototype[METHOD_NAME]=ArrayIteratorMethods[METHOD_NAME]}}}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return observable});var observable="function"==typeof Symbol&&Symbol.observable||"@@observable"},function(module,exports,__webpack_require__){"use strict";var isArray=__webpack_require__(81),isObject=__webpack_require__(10),toObject=__webpack_require__(30),toLength=__webpack_require__(24),createProperty=__webpack_require__(143),arraySpeciesCreate=__webpack_require__(195),IS_CONCAT_SPREADABLE=__webpack_require__(12)("isConcatSpreadable"),IS_CONCAT_SPREADABLE_SUPPORT=!__webpack_require__(9)(function(){var array=[];return array[IS_CONCAT_SPREADABLE]=!1,array.concat()[0]!==array}),SPECIES_SUPPORT=__webpack_require__(100)("concat"),isConcatSpreadable=function(O){if(!isObject(O))return!1;var spreadable=O[IS_CONCAT_SPREADABLE];return void 0!==spreadable?!!spreadable:isArray(O)},FORCED=!IS_CONCAT_SPREADABLE_SUPPORT||!SPECIES_SUPPORT;__webpack_require__(3)({target:"Array",proto:!0,forced:FORCED},{concat:function concat(arg){var i,k,length,len,E,O=toObject(this),A=arraySpeciesCreate(O,0),n=0;for(i=-1,length=arguments.length;i<length;i++)if(E=-1===i?O:arguments[i],isConcatSpreadable(E)){if(n+(len=toLength(E.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(k=0;k<len;k++,n++)k in E&&createProperty(A,n,E[k])}else{if(n>=9007199254740991)throw TypeError("Maximum allowed index exceeded");createProperty(A,n++,E)}return A.length=n,A}})},function(module,exports){var toString={}.toString;module.exports=function(it){return toString.call(it).slice(8,-1)}},function(module,exports){module.exports=function(it){Iif(null==it)throw TypeError("Can't call method on "+it);return it}},function(module,exports,__webpack_require__){var IndexedObject=__webpack_require__(101),requireObjectCoercible=__webpack_require__(39);module.exports=function(it){return IndexedObject(requireObjectCoercible(it))}},function(module,exports,__webpack_require__){__webpack_require__(17)("iterator")},function(module,exports,__webpack_require__){var has=__webpack_require__(16),toObject=__webpack_require__(30),IE_PROTO=__webpack_require__(102)("IE_PROTO"),CORRECT_PROTOTYPE_GETTER=__webpack_require__(148),ObjectPrototype=Object.prototype;module.exports=CORRECT_PROTOTYPE_GETTER?Object.getPrototypeOf:function(O){return O=toObject(O),has(O,IE_PROTO)?O[IE_PROTO]:"function"==typeof O.constructor&&O instanceof O.constructor?O.constructor.prototype:O instanceof Object?ObjectPrototype:null}},function(module,exports){module.exports=function(it){if("function"!=typeof it)throw TypeError(String(it)+" is not a function");return it}},function(module,exports,__webpack_require__){var assign=__webpack_require__(386);__webpack_require__(3)({target:"Object",stat:!0,forced:Object.assign!==assign},{assign:assign})},function(module,exports,__webpack_require__){var toObject=__webpack_require__(30),nativeKeys=__webpack_require__(72),FAILS_ON_PRIMITIVES=__webpack_require__(9)(function(){nativeKeys(1)});__webpack_require__(3)({target:"Object",stat:!0,forced:FAILS_ON_PRIMITIVES},{keys:function keys(it){return nativeKeys(toObject(it))}})},function(module,exports,__webpack_require__){"use strict";var codePointAt=__webpack_require__(221),InternalStateModule=__webpack_require__(50),defineIterator=__webpack_require__(147),setInternalState=InternalStateModule.set,getInternalState=InternalStateModule.getterFor("String Iterator");defineIterator(String,"String",function(iterated){setInternalState(this,{type:"String Iterator",string:String(iterated),index:0})},function next(){var point,state=getInternalState(this),string=state.string,index=state.index;return index>=string.length?{value:void 0,done:!0}:(point=codePointAt(string,index,!0),state.index+=point.length,{value:point,done:!1})})},function(module,exports){module.exports=function isObject(value){var type=typeof value;return null!=value&&("object"==type||"function"==type)}},function(module,exports,__webpack_require__){var Map=__webpack_require__(247),WeakMap=__webpack_require__(545),shared=__webpack_require__(71)("metadata"),store=shared.store||(shared.store=new WeakMap),getOrCreateMetadataMap=function(target,targetKey,create){var targetMetadata=store.get(target);if(!targetMetadata){if(!create)return;store.set(target,targetMetadata=new Map)}var keyMetadata=targetMetadata.get(targetKey);if(!keyMetadata){Iif(!create)return;targetMetadata.set(targetKey,keyMetadata=new Map)}return keyMetadata};module.exports={store:store,getMap:getOrCreateMetadataMap,has:function(MetadataKey,O,P){var metadataMap=getOrCreateMetadataMap(O,P,!1);return void 0!==metadataMap&&metadataMap.has(MetadataKey)},get:function(MetadataKey,O,P){var metadataMap=getOrCreateMetadataMap(O,P,!1);return void 0===metadataMap?void 0:metadataMap.get(MetadataKey)},set:function(MetadataKey,MetadataValue,O,P){getOrCreateMetadataMap(O,P,!0).set(MetadataKey,MetadataValue)},keys:function(target,targetKey){var metadataMap=getOrCreateMetadataMap(target,targetKey,!1),keys=[];return metadataMap&&metadataMap.forEach(function(_,key){keys.push(key)}),keys},toKey:function(it){return void 0===it||"symbol"==typeof it?it:String(it)}}},function(module,__webpack_exports__,__webpack_require__){"use strict";function hostReportError(err){setTimeout(function(){throw err})}__webpack_require__.d(__webpack_exports__,"a",function(){return hostReportError})},function(module,exports,__webpack_require__){var set,get,has,NATIVE_WEAK_MAP=__webpack_require__(198),isObject=__webpack_require__(10),hide=__webpack_require__(25),objectHas=__webpack_require__(16),sharedKey=__webpack_require__(102),hiddenKeys=__webpack_require__(84),WeakMap=__webpack_require__(7).WeakMap;Eif(NATIVE_WEAK_MAP){var store=new WeakMap,wmget=store.get,wmhas=store.has,wmset=store.set;set=function(it,metadata){return wmset.call(store,it,metadata),metadata},get=function(it){return wmget.call(store,it)||{}},has=function(it){return wmhas.call(store,it)}}else{var STATE=sharedKey("state");hiddenKeys[STATE]=!0,set=function(it,metadata){return hide(it,STATE,metadata),metadata},get=function(it){return objectHas(it,STATE)?it[STATE]:{}},has=function(it){return objectHas(it,STATE)}}module.exports={set:set,get:get,has:has,enforce:function(it){return has(it)?get(it):set(it,{})},getterFor:function(TYPE){return function(it){var state;if(!isObject(it)||(state=get(it)).type!==TYPE)throw TypeError("Incompatible receiver, "+TYPE+" required");return state}}}},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Array",stat:!0},{isArray:__webpack_require__(81)})},function(module,__webpack_exports__,__webpack_require__){"use strict";function getSymbolIterator(){return"function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"}__webpack_require__.d(__webpack_exports__,"a",function(){return iterator});var iterator=getSymbolIterator()},function(module,__webpack_exports__,__webpack_require__){"use strict";function ObjectUnsubscribedErrorImpl(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}__webpack_require__.d(__webpack_exports__,"a",function(){return ObjectUnsubscribedError}),ObjectUnsubscribedErrorImpl.prototype=Object.create(Error.prototype);var ObjectUnsubscribedError=ObjectUnsubscribedErrorImpl},function(module,exports,__webpack_require__){"use strict";(function(global){var origSymbol=global.Symbol,hasSymbolSham=__webpack_require__(296);module.exports=function hasNativeSymbols(){return"function"==typeof origSymbol&&("function"==typeof Symbol&&("symbol"==typeof origSymbol("foo")&&("symbol"==typeof Symbol("bar")&&hasSymbolSham())))}}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";var ThrowTypeError=Object.getOwnPropertyDescriptor?function(){return Object.getOwnPropertyDescriptor(arguments,"callee").get}():function(){throw new TypeError},hasSymbols="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator,getProto=Object.getPrototypeOf||function(x){return x.__proto__},asyncGenIterator=void 0,TypedArray="undefined"==typeof Uint8Array?void 0:getProto(Uint8Array),INTRINSICS={"$ %Array%":Array,"$ %ArrayBuffer%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer,"$ %ArrayBufferPrototype%":"undefined"==typeof ArrayBuffer?void 0:ArrayBuffer.prototype,"$ %ArrayIteratorPrototype%":hasSymbols?getProto([][Symbol.iterator]()):void 0,"$ %ArrayPrototype%":Array.prototype,"$ %ArrayProto_entries%":Array.prototype.entries,"$ %ArrayProto_forEach%":Array.prototype.forEach,"$ %ArrayProto_keys%":Array.prototype.keys,"$ %ArrayProto_values%":Array.prototype.values,"$ %AsyncFromSyncIteratorPrototype%":void 0,"$ %AsyncFunction%":void 0,"$ %AsyncFunctionPrototype%":void 0,"$ %AsyncGenerator%":void 0,"$ %AsyncGeneratorFunction%":void 0,"$ %AsyncGeneratorPrototype%":void 0,"$ %AsyncIteratorPrototype%":asyncGenIterator&&hasSymbols&&Symbol.asyncIterator?asyncGenIterator[Symbol.asyncIterator]():void 0,"$ %Atomics%":"undefined"==typeof Atomics?void 0:Atomics,"$ %Boolean%":Boolean,"$ %BooleanPrototype%":Boolean.prototype,"$ %DataView%":"undefined"==typeof DataView?void 0:DataView,"$ %DataViewPrototype%":"undefined"==typeof DataView?void 0:DataView.prototype,"$ %Date%":Date,"$ %DatePrototype%":Date.prototype,"$ %decodeURI%":decodeURI,"$ %decodeURIComponent%":decodeURIComponent,"$ %encodeURI%":encodeURI,"$ %encodeURIComponent%":encodeURIComponent,"$ %Error%":Error,"$ %ErrorPrototype%":Error.prototype,"$ %eval%":eval,"$ %EvalError%":EvalError,"$ %EvalErrorPrototype%":EvalError.prototype,"$ %Float32Array%":"undefined"==typeof Float32Array?void 0:Float32Array,"$ %Float32ArrayPrototype%":"undefined"==typeof Float32Array?void 0:Float32Array.prototype,"$ %Float64Array%":"undefined"==typeof Float64Array?void 0:Float64Array,"$ %Float64ArrayPrototype%":"undefined"==typeof Float64Array?void 0:Float64Array.prototype,"$ %Function%":Function,"$ %FunctionPrototype%":Function.prototype,"$ %Generator%":void 0,"$ %GeneratorFunction%":void 0,"$ %GeneratorPrototype%":void 0,"$ %Int8Array%":"undefined"==typeof Int8Array?void 0:Int8Array,"$ %Int8ArrayPrototype%":"undefined"==typeof Int8Array?void 0:Int8Array.prototype,"$ %Int16Array%":"undefined"==typeof Int16Array?void 0:Int16Array,"$ %Int16ArrayPrototype%":"undefined"==typeof Int16Array?void 0:Int8Array.prototype,"$ %Int32Array%":"undefined"==typeof Int32Array?void 0:Int32Array,"$ %Int32ArrayPrototype%":"undefined"==typeof Int32Array?void 0:Int32Array.prototype,"$ %isFinite%":isFinite,"$ %isNaN%":isNaN,"$ %IteratorPrototype%":hasSymbols?getProto(getProto([][Symbol.iterator]())):void 0,"$ %JSON%":JSON,"$ %JSONParse%":JSON.parse,"$ %Map%":"undefined"==typeof Map?void 0:Map,"$ %MapIteratorPrototype%":"undefined"!=typeof Map&&hasSymbols?getProto((new Map)[Symbol.iterator]()):void 0,"$ %MapPrototype%":"undefined"==typeof Map?void 0:Map.prototype,"$ %Math%":Math,"$ %Number%":Number,"$ %NumberPrototype%":Number.prototype,"$ %Object%":Object,"$ %ObjectPrototype%":Object.prototype,"$ %ObjProto_toString%":Object.prototype.toString,"$ %ObjProto_valueOf%":Object.prototype.valueOf,"$ %parseFloat%":parseFloat,"$ %parseInt%":parseInt,"$ %Promise%":"undefined"==typeof Promise?void 0:Promise,"$ %PromisePrototype%":"undefined"==typeof Promise?void 0:Promise.prototype,"$ %PromiseProto_then%":"undefined"==typeof Promise?void 0:Promise.prototype.then,"$ %Promise_all%":"undefined"==typeof Promise?void 0:Promise.all,"$ %Promise_reject%":"undefined"==typeof Promise?void 0:Promise.reject,"$ %Promise_resolve%":"undefined"==typeof Promise?void 0:Promise.resolve,"$ %Proxy%":"undefined"==typeof Proxy?void 0:Proxy,"$ %RangeError%":RangeError,"$ %RangeErrorPrototype%":RangeError.prototype,"$ %ReferenceError%":ReferenceError,"$ %ReferenceErrorPrototype%":ReferenceError.prototype,"$ %Reflect%":"undefined"==typeof Reflect?void 0:Reflect,"$ %RegExp%":RegExp,"$ %RegExpPrototype%":RegExp.prototype,"$ %Set%":"undefined"==typeof Set?void 0:Set,"$ %SetIteratorPrototype%":"undefined"!=typeof Set&&hasSymbols?getProto((new Set)[Symbol.iterator]()):void 0,"$ %SetPrototype%":"undefined"==typeof Set?void 0:Set.prototype,"$ %SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer,"$ %SharedArrayBufferPrototype%":"undefined"==typeof SharedArrayBuffer?void 0:SharedArrayBuffer.prototype,"$ %String%":String,"$ %StringIteratorPrototype%":hasSymbols?getProto(""[Symbol.iterator]()):void 0,"$ %StringPrototype%":String.prototype,"$ %Symbol%":hasSymbols?Symbol:void 0,"$ %SymbolPrototype%":hasSymbols?Symbol.prototype:void 0,"$ %SyntaxError%":SyntaxError,"$ %SyntaxErrorPrototype%":SyntaxError.prototype,"$ %ThrowTypeError%":ThrowTypeError,"$ %TypedArray%":TypedArray,"$ %TypedArrayPrototype%":TypedArray?TypedArray.prototype:void 0,"$ %TypeError%":TypeError,"$ %TypeErrorPrototype%":TypeError.prototype,"$ %Uint8Array%":"undefined"==typeof Uint8Array?void 0:Uint8Array,"$ %Uint8ArrayPrototype%":"undefined"==typeof Uint8Array?void 0:Uint8Array.prototype,"$ %Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray,"$ %Uint8ClampedArrayPrototype%":"undefined"==typeof Uint8ClampedArray?void 0:Uint8ClampedArray.prototype,"$ %Uint16Array%":"undefined"==typeof Uint16Array?void 0:Uint16Array,"$ %Uint16ArrayPrototype%":"undefined"==typeof Uint16Array?void 0:Uint16Array.prototype,"$ %Uint32Array%":"undefined"==typeof Uint32Array?void 0:Uint32Array,"$ %Uint32ArrayPrototype%":"undefined"==typeof Uint32Array?void 0:Uint32Array.prototype,"$ %URIError%":URIError,"$ %URIErrorPrototype%":URIError.prototype,"$ %WeakMap%":"undefined"==typeof WeakMap?void 0:WeakMap,"$ %WeakMapPrototype%":"undefined"==typeof WeakMap?void 0:WeakMap.prototype,"$ %WeakSet%":"undefined"==typeof WeakSet?void 0:WeakSet,"$ %WeakSetPrototype%":"undefined"==typeof WeakSet?void 0:WeakSet.prototype};module.exports=function GetIntrinsic(name,allowMissing){Iif(arguments.length>1&&"boolean"!=typeof allowMissing)throw new TypeError('"allowMissing" argument must be a boolean');var key="$ "+name;Iif(!(key in INTRINSICS))throw new SyntaxError("intrinsic "+name+" does not exist!");Iif(void 0===INTRINSICS[key]&&!allowMissing)throw new TypeError("intrinsic "+name+" exists, but is not available. Please file an issue!");return INTRINSICS[key]}},function(module,exports,__webpack_require__){var defineProperty=__webpack_require__(15).f,has=__webpack_require__(16),TO_STRING_TAG=__webpack_require__(12)("toStringTag");module.exports=function(it,TAG,STATIC){it&&!has(it=STATIC?it:it.prototype,TO_STRING_TAG)&&defineProperty(it,TO_STRING_TAG,{configurable:!0,value:TAG})}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4),defineProperties=__webpack_require__(206),enumBugKeys=__webpack_require__(146),html=__webpack_require__(207),documentCreateElement=__webpack_require__(144),IE_PROTO=__webpack_require__(102)("IE_PROTO"),Empty=function(){},createDict=function(){var iframeDocument,iframe=documentCreateElement("iframe"),length=enumBugKeys.length;for(iframe.style.display="none",html.appendChild(iframe),iframe.src=String("javascript:"),(iframeDocument=iframe.contentWindow.document).open(),iframeDocument.write("<script>document.F=Object<\/script>"),iframeDocument.close(),createDict=iframeDocument.F;length--;)delete createDict.prototype[enumBugKeys[length]];return createDict()};module.exports=Object.create||function create(O,Properties){var result;return null!==O?(Empty.prototype=anObject(O),result=new Empty,Empty.prototype=null,result[IE_PROTO]=O):result=createDict(),void 0===Properties?result:defineProperties(result,Properties)},__webpack_require__(84)[IE_PROTO]=!0},function(module,exports){module.exports=function(module){return module.webpackPolyfill||(module.deprecate=function(){},module.paths=[],module.children||(module.children=[]),Object.defineProperty(module,"loaded",{enumerable:!0,get:function(){return module.l}}),Object.defineProperty(module,"id",{enumerable:!0,get:function(){return module.i}}),module.webpackPolyfill=1),module}},function(module,exports,__webpack_require__){var baseIsNative=__webpack_require__(415),getValue=__webpack_require__(420);module.exports=function getNative(object,key){var value=getValue(object,key);return baseIsNative(value)?value:void 0}},function(module,exports){module.exports=function isObjectLike(value){return null!=value&&"object"==typeof value}},function(module,exports){var isArray=Array.isArray;module.exports=isArray},function(module,__webpack_exports__,__webpack_require__){"use strict";function isFunction(x){return"function"==typeof x}__webpack_require__.d(__webpack_exports__,"a",function(){return isFunction})},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"b",function(){return SubjectSubscriber}),__webpack_require__.d(__webpack_exports__,"a",function(){return Subject});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Observable__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(5),_Subscriber__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(8),_Subscription__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(11),_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(53),_SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(122),_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(64),SubjectSubscriber=function(_super){function SubjectSubscriber(destination){var _this=_super.call(this,destination)||this;return _this.destination=destination,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(SubjectSubscriber,_super),SubjectSubscriber}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__.a),Subject=function(_super){function Subject(){var _this=_super.call(this)||this;return _this.observers=[],_this.closed=!1,_this.isStopped=!1,_this.hasError=!1,_this.thrownError=null,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(Subject,_super),Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__.a]=function(){return new SubjectSubscriber(this)},Subject.prototype.lift=function(operator){var subject=new AnonymousSubject(this,this);return subject.operator=operator,subject},Subject.prototype.next=function(value){Iif(this.closed)throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__.a;Eif(!this.isStopped)for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].next(value)},Subject.prototype.error=function(err){if(this.closed)throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__.a;this.hasError=!0,this.thrownError=err,this.isStopped=!0;for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].error(err);this.observers.length=0},Subject.prototype.complete=function(){if(this.closed)throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__.a;this.isStopped=!0;for(var observers=this.observers,len=observers.length,copy=observers.slice(),i=0;i<len;i++)copy[i].complete();this.observers.length=0},Subject.prototype.unsubscribe=function(){this.isStopped=!0,this.closed=!0,this.observers=null},Subject.prototype._trySubscribe=function(subscriber){Iif(this.closed)throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__.a;return _super.prototype._trySubscribe.call(this,subscriber)},Subject.prototype._subscribe=function(subscriber){Iif(this.closed)throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__.a;return this.hasError?(subscriber.error(this.thrownError),_Subscription__WEBPACK_IMPORTED_MODULE_3__.a.EMPTY):this.isStopped?(subscriber.complete(),_Subscription__WEBPACK_IMPORTED_MODULE_3__.a.EMPTY):(this.observers.push(subscriber),new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__.a(this,subscriber))},Subject.prototype.asObservable=function(){var observable=new _Observable__WEBPACK_IMPORTED_MODULE_1__.a;return observable.source=this,observable},Subject.create=function(destination,source){return new AnonymousSubject(destination,source)},Subject}(_Observable__WEBPACK_IMPORTED_MODULE_1__.a),AnonymousSubject=function(_super){function AnonymousSubject(destination,source){var _this=_super.call(this)||this;return _this.destination=destination,_this.source=source,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(AnonymousSubject,_super),AnonymousSubject.prototype.next=function(value){var destination=this.destination;destination&&destination.next&&destination.next(value)},AnonymousSubject.prototype.error=function(err){var destination=this.destination;destination&&destination.error&&this.destination.error(err)},AnonymousSubject.prototype.complete=function(){var destination=this.destination;destination&&destination.complete&&this.destination.complete()},AnonymousSubject.prototype._subscribe=function(subscriber){return this.source?this.source.subscribe(subscriber):_Subscription__WEBPACK_IMPORTED_MODULE_3__.a.EMPTY},AnonymousSubject}(Subject)},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return rxSubscriber});var rxSubscriber="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random()},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return fromArray});var _Observable__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(5),_Subscription__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(11),_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(127);function fromArray(input,scheduler){return scheduler?new _Observable__WEBPACK_IMPORTED_MODULE_0__.a(function(subscriber){var sub=new _Subscription__WEBPACK_IMPORTED_MODULE_1__.a,i=0;return sub.add(scheduler.schedule(function(){i!==input.length?(subscriber.next(input[i++]),subscriber.closed||sub.add(this.schedule())):subscriber.complete()})),sub}):new _Observable__WEBPACK_IMPORTED_MODULE_0__.a(Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_2__.a)(input))}},function(module,exports,__webpack_require__){"use strict";(function(module){__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"storiesOf",{enumerable:!0,get:function get(){return _preview.storiesOf}}),Object.defineProperty(exports,"setAddon",{enumerable:!0,get:function get(){return _preview.setAddon}}),Object.defineProperty(exports,"addDecorator",{enumerable:!0,get:function get(){return _preview.addDecorator}}),Object.defineProperty(exports,"addParameters",{enumerable:!0,get:function get(){return _preview.addParameters}}),Object.defineProperty(exports,"configure",{enumerable:!0,get:function get(){return _preview.configure}}),Object.defineProperty(exports,"getStorybook",{enumerable:!0,get:function get(){return _preview.getStorybook}}),Object.defineProperty(exports,"forceReRender",{enumerable:!0,get:function get(){return _preview.forceReRender}}),Object.defineProperty(exports,"raw",{enumerable:!0,get:function get(){return _preview.raw}}),Object.defineProperty(exports,"moduleMetadata",{enumerable:!0,get:function get(){return _decorators.moduleMetadata}});var _preview=__webpack_require__(378),_decorators=__webpack_require__(558);module&&module.hot&&module.hot.decline&&module.hot.decline()}).call(this,__webpack_require__(58)(module))},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(23);module.exports=bind.call(Function.call,Object.prototype.hasOwnProperty)},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(139)},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10);module.exports=function(it,S){if(!isObject(it))return it;var fn,val;if(S&&"function"==typeof(fn=it.toString)&&!isObject(val=fn.call(it)))return val;if("function"==typeof(fn=it.valueOf)&&!isObject(val=fn.call(it)))return val;if(!S&&"function"==typeof(fn=it.toString)&&!isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value")}},function(module,exports){module.exports=function(bitmap,value){return{enumerable:!(1&bitmap),configurable:!(2&bitmap),writable:!(4&bitmap),value:value}}},function(module,exports,__webpack_require__){var global=__webpack_require__(7),setGlobal=__webpack_require__(145),store=global["__core-js_shared__"]||setGlobal("__core-js_shared__",{});(module.exports=function(key,value){return store[key]||(store[key]=void 0!==value?value:{})})("versions",[]).push({version:"3.0.1",mode:__webpack_require__(82)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(module,exports,__webpack_require__){var internalObjectKeys=__webpack_require__(201),enumBugKeys=__webpack_require__(146);module.exports=Object.keys||function keys(O){return internalObjectKeys(O,enumBugKeys)}},function(module,exports,__webpack_require__){"use strict";(function(global){__webpack_require__(37),__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.logger=void 0;var console=global.console,logger={debug:function debug(message){for(var _len=arguments.length,rest=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)rest[_key-1]=arguments[_key];return console.debug.apply(console,[message].concat(rest))},log:function log(message){for(var _len2=arguments.length,rest=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)rest[_key2-1]=arguments[_key2];return console.log.apply(console,[message].concat(rest))},info:function info(message){for(var _len3=arguments.length,rest=new Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++)rest[_key3-1]=arguments[_key3];return console.info.apply(console,[message].concat(rest))},warn:function warn(message){for(var _len4=arguments.length,rest=new Array(_len4>1?_len4-1:0),_key4=1;_key4<_len4;_key4++)rest[_key4-1]=arguments[_key4];return console.warn.apply(console,[message].concat(rest))},error:function error(message){for(var _len5=arguments.length,rest=new Array(_len5>1?_len5-1:0),_key5=1;_key5<_len5;_key5++)rest[_key5-1]=arguments[_key5];return console.error.apply(console,[message].concat(rest))}};exports.logger=logger}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";var events;__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.STORY_THREW_EXCEPTION=exports.STORY_CHANGED=exports.STORY_ERRORED=exports.STORY_MISSING=exports.STORY_RENDERED=exports.STORY_RENDER=exports.STORY_ADDED=exports.STORY_INIT=exports.REGISTER_SUBSCRIPTION=exports.FORCE_RE_RENDER=exports.PREVIEW_KEYDOWN=exports.SELECT_STORY=exports.STORIES_CONFIGURED=exports.SET_STORIES=exports.GET_STORIES=exports.SET_CURRENT_STORY=exports.GET_CURRENT_STORY=exports.CHANNEL_CREATED=exports.default=void 0,function(events){events.CHANNEL_CREATED="channelCreated",events.GET_CURRENT_STORY="getCurrentStory",events.SET_CURRENT_STORY="setCurrentStory",events.GET_STORIES="getStories",events.SET_STORIES="setStories",events.STORIES_CONFIGURED="storiesConfigured",events.SELECT_STORY="selectStory",events.PREVIEW_KEYDOWN="previewKeydown",events.STORY_ADDED="storyAdded",events.STORY_CHANGED="storyChanged",events.STORY_UNCHANGED="storyUnchanged",events.FORCE_RE_RENDER="forceReRender",events.REGISTER_SUBSCRIPTION="registerSubscription",events.STORY_INIT="storyInit",events.STORY_RENDER="storyRender",events.STORY_RENDERED="storyRendered",events.STORY_MISSING="storyMissing",events.STORY_ERRORED="storyErrored",events.STORY_THREW_EXCEPTION="storyThrewException"}(events||(events={}));var _default=events;exports.default=_default;var CHANNEL_CREATED=events.CHANNEL_CREATED;exports.CHANNEL_CREATED=CHANNEL_CREATED;var GET_CURRENT_STORY=events.GET_CURRENT_STORY;exports.GET_CURRENT_STORY=GET_CURRENT_STORY;var SET_CURRENT_STORY=events.SET_CURRENT_STORY;exports.SET_CURRENT_STORY=SET_CURRENT_STORY;var GET_STORIES=events.GET_STORIES;exports.GET_STORIES=GET_STORIES;var SET_STORIES=events.SET_STORIES;exports.SET_STORIES=SET_STORIES;var STORIES_CONFIGURED=events.STORIES_CONFIGURED;exports.STORIES_CONFIGURED=STORIES_CONFIGURED;var SELECT_STORY=events.SELECT_STORY;exports.SELECT_STORY=SELECT_STORY;var PREVIEW_KEYDOWN=events.PREVIEW_KEYDOWN;exports.PREVIEW_KEYDOWN=PREVIEW_KEYDOWN;var FORCE_RE_RENDER=events.FORCE_RE_RENDER;exports.FORCE_RE_RENDER=FORCE_RE_RENDER;var REGISTER_SUBSCRIPTION=events.REGISTER_SUBSCRIPTION;exports.REGISTER_SUBSCRIPTION=REGISTER_SUBSCRIPTION;var STORY_INIT=events.STORY_INIT;exports.STORY_INIT=STORY_INIT;var STORY_ADDED=events.STORY_ADDED;exports.STORY_ADDED=STORY_ADDED;var STORY_RENDER=events.STORY_RENDER;exports.STORY_RENDER=STORY_RENDER;var STORY_RENDERED=events.STORY_RENDERED;exports.STORY_RENDERED=STORY_RENDERED;var STORY_MISSING=events.STORY_MISSING;exports.STORY_MISSING=STORY_MISSING;var STORY_ERRORED=events.STORY_ERRORED;exports.STORY_ERRORED=STORY_ERRORED;var STORY_CHANGED=events.STORY_CHANGED;exports.STORY_CHANGED=STORY_CHANGED;var STORY_THREW_EXCEPTION=events.STORY_THREW_EXCEPTION;exports.STORY_THREW_EXCEPTION=STORY_THREW_EXCEPTION},function(module,exports,__webpack_require__){"use strict";var regexpExec=__webpack_require__(108);__webpack_require__(3)({target:"RegExp",proto:!0,forced:/./.exec!==regexpExec},{exec:regexpExec})},function(module,exports,__webpack_require__){var Symbol=__webpack_require__(113),getRawTag=__webpack_require__(416),objectToString=__webpack_require__(417),nullTag="[object Null]",undefinedTag="[object Undefined]",symToStringTag=Symbol?Symbol.toStringTag:void 0;module.exports=function baseGetTag(value){return null==value?void 0===value?undefinedTag:nullTag:symToStringTag&&symToStringTag in Object(value)?getRawTag(value):objectToString(value)}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return empty});var _config__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(21),_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(49),empty={closed:!0,next:function(value){},error:function(err){if(_config__WEBPACK_IMPORTED_MODULE_0__.a.useDeprecatedSynchronousErrorHandling)throw err;Object(_util_hostReportError__WEBPACK_IMPORTED_MODULE_1__.a)(err)},complete:function(){}}},function(module,exports,__webpack_require__){module.exports={Welcome:__webpack_require__(577).default,Button:__webpack_require__(578).default}},function(module,exports,__webpack_require__){var has=__webpack_require__(23).call(Function.call,Object.prototype.hasOwnProperty),$assign=Object.assign;module.exports=function assign(target,source){Eif($assign)return $assign(target,source);for(var key in source)has(source,key)&&(target[key]=source[key]);return target}},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(23),ES2016=__webpack_require__(139),assign=__webpack_require__(79),forEach=__webpack_require__(188),GetIntrinsic=__webpack_require__(55),$TypeError=GetIntrinsic("%TypeError%"),$isEnumerable=bind.call(Function.call,GetIntrinsic("%ObjectPrototype%").propertyIsEnumerable),$pushApply=bind.call(Function.apply,GetIntrinsic("%ArrayPrototype%").push),ES2017=assign(assign({},ES2016),{ToIndex:function ToIndex(value){if(void 0===value)return 0;var integerIndex=this.ToInteger(value);if(integerIndex<0)throw new RangeError("index must be >= 0");var index=this.ToLength(integerIndex);if(!this.SameValueZero(integerIndex,index))throw new RangeError("index must be >= 0 and < 2 ** 53 - 1");return index},EnumerableOwnProperties:function EnumerableOwnProperties(O,kind){var keys=ES2016.EnumerableOwnNames(O);if("key"===kind)return keys;if("value"===kind||"key+value"===kind){var results=[];return forEach(keys,function(key){$isEnumerable(O,key)&&$pushApply(results,["value"===kind?O[key]:[key,O[key]]])}),results}throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": '+kind)}});delete ES2017.EnumerableOwnNames,module.exports=ES2017},function(module,exports,__webpack_require__){var classof=__webpack_require__(38);module.exports=Array.isArray||function isArray(arg){return"Array"==classof(arg)}},function(module,exports){module.exports=!1},function(module,exports,__webpack_require__){"use strict";var nativePropertyIsEnumerable={}.propertyIsEnumerable,nativeGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,NASHORN_BUG=nativeGetOwnPropertyDescriptor&&!nativePropertyIsEnumerable.call({1:2},1);exports.f=NASHORN_BUG?function propertyIsEnumerable(V){var descriptor=nativeGetOwnPropertyDescriptor(this,V);return!!descriptor&&descriptor.enumerable}:nativePropertyIsEnumerable},function(module,exports){module.exports={}},function(module,exports,__webpack_require__){module.exports=__webpack_require__(7)},function(module,exports){module.exports={}},function(module,exports,__webpack_require__){var bind=__webpack_require__(88),IndexedObject=__webpack_require__(101),toObject=__webpack_require__(30),toLength=__webpack_require__(24),arraySpeciesCreate=__webpack_require__(195);module.exports=function(TYPE,specificCreate){var IS_MAP=1==TYPE,IS_FILTER=2==TYPE,IS_SOME=3==TYPE,IS_EVERY=4==TYPE,IS_FIND_INDEX=6==TYPE,NO_HOLES=5==TYPE||IS_FIND_INDEX,create=specificCreate||arraySpeciesCreate;return function($this,callbackfn,that){for(var value,result,O=toObject($this),self=IndexedObject(O),boundFunction=bind(callbackfn,that,3),length=toLength(self.length),index=0,target=IS_MAP?create($this,length):IS_FILTER?create($this,0):void 0;length>index;index++)if((NO_HOLES||index in self)&&(result=boundFunction(value=self[index],index,O),TYPE))if(IS_MAP)target[index]=result;else if(result)switch(TYPE){case 3:return!0;case 5:return value;case 6:return index;case 2:target.push(value)}else if(IS_EVERY)return!1;return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:target}}},function(module,exports,__webpack_require__){var aFunction=__webpack_require__(43);module.exports=function(fn,that,length){if(aFunction(fn),void 0===that)return fn;switch(length){case 0:return function(){return fn.call(that)};case 1:return function(a){return fn.call(that,a)};case 2:return function(a,b){return fn.call(that,a,b)};case 3:return function(a,b,c){return fn.call(that,a,b,c)}}return function(){return fn.apply(that,arguments)}}},function(module,exports,__webpack_require__){var INCORRECT_ITERATION=!__webpack_require__(149)(function(iterable){Array.from(iterable)});__webpack_require__(3)({target:"Array",stat:!0,forced:INCORRECT_ITERATION},{from:__webpack_require__(384)})},function(module,exports,__webpack_require__){var DatePrototype=Date.prototype,nativeDateToString=DatePrototype.toString,getTime=DatePrototype.getTime;new Date(NaN)+""!="Invalid Date"&&__webpack_require__(32)(DatePrototype,"toString",function toString(){var value=getTime.call(this);return value==value?nativeDateToString.call(this):"Invalid Date"})},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(4),fails=__webpack_require__(9),flags=__webpack_require__(220),DESCRIPTORS=__webpack_require__(14),nativeToString=/./.toString,NOT_GENERIC=fails(function(){return"/a/b"!=nativeToString.call({source:"a",flags:"b"})}),INCORRECT_NAME="toString"!=nativeToString.name;(NOT_GENERIC||INCORRECT_NAME)&&__webpack_require__(32)(RegExp.prototype,"toString",function toString(){var R=anObject(this);return"/".concat(R.source,"/","flags"in R?R.flags:!DESCRIPTORS&&R instanceof RegExp?flags.call(R):void 0)},{unsafe:!0})},function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(6),__webpack_require__(45),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0});var _exportNames={};exports.default=void 0;var _index=__webpack_require__(387);Object.keys(_index).forEach(function(key){"default"!==key&&"__esModule"!==key&&(Object.prototype.hasOwnProperty.call(_exportNames,key)||Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _index[key]}}))});var _makeDecorator=__webpack_require__(389);Object.keys(_makeDecorator).forEach(function(key){"default"!==key&&"__esModule"!==key&&(Object.prototype.hasOwnProperty.call(_exportNames,key)||Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _makeDecorator[key]}}))});var _storybookChannelMock=__webpack_require__(390);Object.keys(_storybookChannelMock).forEach(function(key){"default"!==key&&"__esModule"!==key&&(Object.prototype.hasOwnProperty.call(_exportNames,key)||Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _storybookChannelMock[key]}}))});var _default=_index.addons;exports.default=_default},function(module,exports,__webpack_require__){module.exports=__webpack_require__(394)},function(module,exports){module.exports=function eq(value,other){return value===other||value!=value&&other!=other}},function(module,exports,__webpack_require__){var METADATA=__webpack_require__(99)("meta"),FREEZING=__webpack_require__(170),isObject=__webpack_require__(10),has=__webpack_require__(16),defineProperty=__webpack_require__(15).f,id=0,isExtensible=Object.isExtensible||function(){return!0},setMetadata=function(it){defineProperty(it,METADATA,{value:{objectID:"O"+ ++id,weakData:{}}})},meta=module.exports={REQUIRED:!1,fastKey:function(it,create){if(!isObject(it))return"symbol"==typeof it?it:("string"==typeof it?"S":"P")+it;if(!has(it,METADATA)){if(!isExtensible(it))return"F";if(!create)return"E";setMetadata(it)}return it[METADATA].objectID},getWeakData:function(it,create){if(!has(it,METADATA)){if(!isExtensible(it))return!0;if(!create)return!1;setMetadata(it)}return it[METADATA].weakData},onFreeze:function(it){return FREEZING&&meta.REQUIRED&&isExtensible(it)&&!has(it,METADATA)&&setMetadata(it),it}};__webpack_require__(84)[METADATA]=!0},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4),isArrayIteratorMethod=__webpack_require__(217),toLength=__webpack_require__(24),bind=__webpack_require__(88),getIteratorMethod=__webpack_require__(218),callWithSafeIterationClosing=__webpack_require__(216),BREAK={};(module.exports=function(iterable,fn,that,ENTRIES,ITERATOR){var iterator,iterFn,index,length,step,boundFunction=bind(fn,that,ENTRIES?2:1);if(ITERATOR)iterator=iterable;else{if("function"!=typeof(iterFn=getIteratorMethod(iterable)))throw TypeError("Target is not iterable");if(isArrayIteratorMethod(iterFn)){for(index=0,length=toLength(iterable.length);length>index;index++)if((ENTRIES?boundFunction(anObject(step=iterable[index])[0],step[1]):boundFunction(iterable[index]))===BREAK)return BREAK;return}iterator=iterFn.call(iterable)}for(;!(step=iterator.next()).done;)if(callWithSafeIterationClosing(iterator,boundFunction,step.value,ENTRIES)===BREAK)return BREAK}).BREAK=BREAK},function(module,exports,__webpack_require__){"use strict";var fnToStr=Function.prototype.toString,constructorRegex=/^\s*class\b/,isES6ClassFn=function isES6ClassFunction(value){try{var fnStr=fnToStr.call(value);return constructorRegex.test(fnStr)}catch(e){return!1}},toStr=Object.prototype.toString,hasToStringTag="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;module.exports=function isCallable(value){Iif(!value)return!1;Iif("function"!=typeof value&&"object"!=typeof value)return!1;Eif("function"==typeof value&&!value.prototype)return!0;if(hasToStringTag)return function tryFunctionToStr(value){try{return!isES6ClassFn(value)&&(fnToStr.call(value),!0)}catch(e){return!1}}(value);if(isES6ClassFn(value))return!1;var strClass=toStr.call(value);return"[object Function]"===strClass||"[object GeneratorFunction]"===strClass}},function(module,exports){var ceil=Math.ceil,floor=Math.floor;module.exports=function(argument){return isNaN(argument=+argument)?0:(argument>0?floor:ceil)(argument)}},function(module,exports){var id=0,postfix=Math.random();module.exports=function(key){return"Symbol(".concat(void 0===key?"":key,")_",(++id+postfix).toString(36))}},function(module,exports,__webpack_require__){var fails=__webpack_require__(9),SPECIES=__webpack_require__(12)("species");module.exports=function(METHOD_NAME){return!fails(function(){var array=[];return(array.constructor={})[SPECIES]=function(){return{foo:1}},1!==array[METHOD_NAME](Boolean).foo})}},function(module,exports,__webpack_require__){var fails=__webpack_require__(9),classof=__webpack_require__(38),split="".split;module.exports=fails(function(){return!Object("z").propertyIsEnumerable(0)})?function(it){return"String"==classof(it)?split.call(it,""):Object(it)}:Object},function(module,exports,__webpack_require__){var shared=__webpack_require__(71)("keys"),uid=__webpack_require__(99);module.exports=function(key){return shared[key]||(shared[key]=uid(key))}},function(module,exports,__webpack_require__){var internalObjectKeys=__webpack_require__(201),hiddenKeys=__webpack_require__(146).concat("length","prototype");exports.f=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return internalObjectKeys(O,hiddenKeys)}},function(module,exports){exports.f=Object.getOwnPropertySymbols},function(module,exports,__webpack_require__){var fails=__webpack_require__(9),replacement=/#|\.prototype\./,isForced=function(feature,detection){var value=data[normalize(feature)];return value==POLYFILL||value!=NATIVE&&("function"==typeof detection?fails(detection):!!detection)},normalize=isForced.normalize=function(string){return String(string).replace(replacement,".").toLowerCase()},data=isForced.data={},NATIVE=isForced.NATIVE="N",POLYFILL=isForced.POLYFILL="P";module.exports=isForced},function(module,exports,__webpack_require__){var validateSetPrototypeOfArguments=__webpack_require__(211);module.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var setter,correctSetter=!1,test={};try{(setter=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(test,[]),correctSetter=test instanceof Array}catch(error){}return function setPrototypeOf(O,proto){return validateSetPrototypeOfArguments(O,proto),correctSetter?setter.call(O,proto):O.__proto__=proto,O}}():void 0)},function(module,exports,__webpack_require__){"use strict";var fails=__webpack_require__(9);module.exports=function(METHOD_NAME,argument){var method=[][METHOD_NAME];return!method||!fails(function(){method.call(null,argument||function(){throw 1},1)})}},function(module,exports,__webpack_require__){"use strict";var re1,re2,regexpFlags=__webpack_require__(220),nativeExec=RegExp.prototype.exec,nativeReplace=String.prototype.replace,patchedExec=nativeExec,UPDATES_LAST_INDEX_WRONG=(re1=/a/,re2=/b*/g,nativeExec.call(re1,"a"),nativeExec.call(re2,"a"),0!==re1.lastIndex||0!==re2.lastIndex),NPCG_INCLUDED=void 0!==/()??/.exec("")[1];(UPDATES_LAST_INDEX_WRONG||NPCG_INCLUDED)&&(patchedExec=function exec(str){var lastIndex,reCopy,match,i,re=this;return NPCG_INCLUDED&&(reCopy=new RegExp("^"+re.source+"$(?!\\s)",regexpFlags.call(re))),UPDATES_LAST_INDEX_WRONG&&(lastIndex=re.lastIndex),match=nativeExec.call(re,str),UPDATES_LAST_INDEX_WRONG&&match&&(re.lastIndex=re.global?match.index+match[0].length:lastIndex),NPCG_INCLUDED&&match&&match.length>1&&nativeReplace.call(match[0],reCopy,function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(match[i]=void 0)}),match}),module.exports=patchedExec},function(module,exports,__webpack_require__){var classof=__webpack_require__(38),regexpExec=__webpack_require__(108);module.exports=function(R,S){var exec=R.exec;if("function"==typeof exec){var result=exec.call(R,S);if("object"!=typeof result)throw TypeError("RegExp exec method returned something other than an Object or null");return result}if("RegExp"!==classof(R))throw TypeError("RegExp#exec called on incompatible receiver");return regexpExec.call(R,S)}},function(module,exports,__webpack_require__){"use strict";var hide=__webpack_require__(25),redefine=__webpack_require__(32),fails=__webpack_require__(9),wellKnownSymbol=__webpack_require__(12),regexpExec=__webpack_require__(108),SPECIES=wellKnownSymbol("species"),REPLACE_SUPPORTS_NAMED_GROUPS=!fails(function(){var re=/./;return re.exec=function(){var result=[];return result.groups={a:"7"},result},"7"!=="".replace(re,"$<a>")}),SPLIT_WORKS_WITH_OVERWRITTEN_EXEC=!fails(function(){var re=/(?:)/,originalExec=re.exec;re.exec=function(){return originalExec.apply(this,arguments)};var result="ab".split(re);return 2!==result.length||"a"!==result[0]||"b"!==result[1]});module.exports=function(KEY,length,exec,sham){var SYMBOL=wellKnownSymbol(KEY),DELEGATES_TO_SYMBOL=!fails(function(){var O={};return O[SYMBOL]=function(){return 7},7!=""[KEY](O)}),DELEGATES_TO_EXEC=DELEGATES_TO_SYMBOL&&!fails(function(){var execCalled=!1,re=/a/;return re.exec=function(){return execCalled=!0,null},"split"===KEY&&(re.constructor={},re.constructor[SPECIES]=function(){return re}),re[SYMBOL](""),!execCalled});if(!DELEGATES_TO_SYMBOL||!DELEGATES_TO_EXEC||"replace"===KEY&&!REPLACE_SUPPORTS_NAMED_GROUPS||"split"===KEY&&!SPLIT_WORKS_WITH_OVERWRITTEN_EXEC){var nativeRegExpMethod=/./[SYMBOL],methods=exec(SYMBOL,""[KEY],function(nativeMethod,regexp,str,arg2,forceStringMethod){return regexp.exec===regexpExec?DELEGATES_TO_SYMBOL&&!forceStringMethod?{done:!0,value:nativeRegExpMethod.call(regexp,str,arg2)}:{done:!0,value:nativeMethod.call(str,regexp,arg2)}:{done:!1}}),stringMethod=methods[0],regexMethod=methods[1];redefine(String.prototype,KEY,stringMethod),redefine(RegExp.prototype,SYMBOL,2==length?function(string,arg){return regexMethod.call(string,this,arg)}:function(string){return regexMethod.call(string,this)}),sham&&hide(RegExp.prototype[SYMBOL],"sham",!0)}}},function(module,exports,__webpack_require__){var listCacheClear=__webpack_require__(405),listCacheDelete=__webpack_require__(406),listCacheGet=__webpack_require__(407),listCacheHas=__webpack_require__(408),listCacheSet=__webpack_require__(409);function ListCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}ListCache.prototype.clear=listCacheClear,ListCache.prototype.delete=listCacheDelete,ListCache.prototype.get=listCacheGet,ListCache.prototype.has=listCacheHas,ListCache.prototype.set=listCacheSet,module.exports=ListCache},function(module,exports,__webpack_require__){var eq=__webpack_require__(94);module.exports=function assocIndexOf(array,key){for(var length=array.length;length--;)if(eq(array[length][0],key))return length;return-1}},function(module,exports,__webpack_require__){var Symbol=__webpack_require__(28).Symbol;module.exports=Symbol},function(module,exports,__webpack_require__){var nativeCreate=__webpack_require__(59)(Object,"create");module.exports=nativeCreate},function(module,exports,__webpack_require__){var isKeyable=__webpack_require__(429);module.exports=function getMapData(map,key){var data=map.__data__;return isKeyable(key)?data["string"==typeof key?"string":"hash"]:data.map}},function(module,exports,__webpack_require__){var isFunction=__webpack_require__(163),isLength=__webpack_require__(238);module.exports=function isArrayLike(value){return null!=value&&isLength(value.length)&&!isFunction(value)}},function(module,exports,__webpack_require__){var baseGetTag=__webpack_require__(76),isObjectLike=__webpack_require__(60),symbolTag="[object Symbol]";module.exports=function isSymbol(value){return"symbol"==typeof value||isObjectLike(value)&&baseGetTag(value)==symbolTag}},function(module,exports){module.exports=function(it,Constructor,name){if(!(it instanceof Constructor))throw TypeError("Incorrect "+(name?name+" ":"")+"invocation");return it}},function(module,exports,__webpack_require__){var redefine=__webpack_require__(32);module.exports=function(target,src,options){for(var key in src)redefine(target,key,src[key],options);return target}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return isArray});var isArray=Array.isArray||function(x){return x&&"number"==typeof x.length}},function(module,__webpack_exports__,__webpack_require__){"use strict";function isObject(x){return null!==x&&"object"==typeof x}__webpack_require__.d(__webpack_exports__,"a",function(){return isObject})},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return SubjectSubscription});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),SubjectSubscription=function(_super){function SubjectSubscription(subject,subscriber){var _this=_super.call(this)||this;return _this.subject=subject,_this.subscriber=subscriber,_this.closed=!1,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(SubjectSubscription,_super),SubjectSubscription.prototype.unsubscribe=function(){Eif(!this.closed){this.closed=!0;var subject=this.subject,observers=subject.observers;Eif(this.subject=null,observers&&0!==observers.length&&!subject.isStopped&&!subject.closed){var subscriberIndex=observers.indexOf(this.subscriber);-1!==subscriberIndex&&observers.splice(subscriberIndex,1)}}},SubjectSubscription}(__webpack_require__(11).a)},function(module,__webpack_exports__,__webpack_require__){"use strict";function isScheduler(value){return value&&"function"==typeof value.schedule}__webpack_require__.d(__webpack_exports__,"a",function(){return isScheduler})},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeTo});var _Observable__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(5),_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(127),_subscribeToPromise__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(129),_subscribeToIterable__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(130),_subscribeToObservable__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(125),_isArrayLike__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(126),_isPromise__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(128),_isObject__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(121),_symbol_iterator__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(52),_symbol_observable__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(36),subscribeTo=function(result){if(result instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__.a)return function(subscriber){return result._isScalar?(subscriber.next(result.value),void subscriber.complete()):result.subscribe(subscriber)};if(result&&"function"==typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_9__.a])return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_4__.a)(result);if(Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_5__.a)(result))return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__.a)(result);if(Object(_isPromise__WEBPACK_IMPORTED_MODULE_6__.a)(result))return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_2__.a)(result);if(result&&"function"==typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_8__.a])return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_3__.a)(result);var value=Object(_isObject__WEBPACK_IMPORTED_MODULE_7__.a)(result)?"an invalid object":"'"+result+"'";throw new TypeError("You provided "+value+" where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.")}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeToObservable});var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(36),subscribeToObservable=function(obj){return function(subscriber){var obs=obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__.a]();if("function"!=typeof obs.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return obs.subscribe(subscriber)}}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return isArrayLike});var isArrayLike=function(x){return x&&"number"==typeof x.length&&"function"!=typeof x}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeToArray});var subscribeToArray=function(array){return function(subscriber){for(var i=0,len=array.length;i<len&&!subscriber.closed;i++)subscriber.next(array[i]);subscriber.closed||subscriber.complete()}}},function(module,__webpack_exports__,__webpack_require__){"use strict";function isPromise(value){return!!value&&"function"!=typeof value.subscribe&&"function"==typeof value.then}__webpack_require__.d(__webpack_exports__,"a",function(){return isPromise})},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeToPromise});var _hostReportError__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(49),subscribeToPromise=function(promise){return function(subscriber){return promise.then(function(value){subscriber.closed||(subscriber.next(value),subscriber.complete())},function(err){return subscriber.error(err)}).then(null,_hostReportError__WEBPACK_IMPORTED_MODULE_0__.a),subscriber}}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeToIterable});var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(52),subscribeToIterable=function(iterable){return function(subscriber){for(var iterator=iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__.a]();;){var item=iterator.next();if(item.done){subscriber.complete();break}if(subscriber.next(item.value),subscriber.closed)break}return"function"==typeof iterator.return&&subscriber.add(function(){iterator.return&&iterator.return()}),subscriber}}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return map});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Subscriber__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(8);function map(project,thisArg){return function mapOperation(source){if("function"!=typeof project)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return source.lift(new MapOperator(project,thisArg))}}var MapOperator=function(){function MapOperator(project,thisArg){this.project=project,this.thisArg=thisArg}return MapOperator.prototype.call=function(subscriber,source){return source.subscribe(new MapSubscriber(subscriber,this.project,this.thisArg))},MapOperator}(),MapSubscriber=function(_super){function MapSubscriber(destination,project,thisArg){var _this=_super.call(this,destination)||this;return _this.project=project,_this.count=0,_this.thisArg=thisArg||_this,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(MapSubscriber,_super),MapSubscriber.prototype._next=function(value){var result;try{result=this.project.call(this.thisArg,value,this.count++)}catch(err){return void this.destination.error(err)}this.destination.next(result)},MapSubscriber}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__.a)},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return InnerSubscriber});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),InnerSubscriber=function(_super){function InnerSubscriber(parent,outerValue,outerIndex){var _this=_super.call(this)||this;return _this.parent=parent,_this.outerValue=outerValue,_this.outerIndex=outerIndex,_this.index=0,_this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(InnerSubscriber,_super),InnerSubscriber.prototype._next=function(value){this.parent.notifyNext(this.outerValue,value,this.outerIndex,this.index++,this)},InnerSubscriber.prototype._error=function(error){this.parent.notifyError(error,this),this.unsubscribe()},InnerSubscriber.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},InnerSubscriber}(__webpack_require__(8).a)},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return subscribeToResult});var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(132),_subscribeTo__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(124);function subscribeToResult(outerSubscriber,result,outerValue,outerIndex,destination){if(void 0===destination&&(destination=new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__.a(outerSubscriber,outerValue,outerIndex)),!destination.closed)return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__.a)(result)(destination)}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"a",function(){return OuterSubscriber});var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),OuterSubscriber=function(_super){function OuterSubscriber(){return null!==_super&&_super.apply(this,arguments)||this}return tslib__WEBPACK_IMPORTED_MODULE_0__.c(OuterSubscriber,_super),OuterSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.destination.next(innerValue)},OuterSubscriber.prototype.notifyError=function(error,innerSub){this.destination.error(error)},OuterSubscriber.prototype.notifyComplete=function(innerSub){this.destination.complete()},OuterSubscriber}(__webpack_require__(8).a)},function(module,__webpack_exports__,__webpack_require__){"use strict";function identity(x){return x}__webpack_require__.d(__webpack_exports__,"a",function(){return identity})},,function(module,exports,__webpack_require__){"use strict";var slice=Array.prototype.slice,isArgs=__webpack_require__(177),origKeys=Object.keys,keysShim=origKeys?function keys(o){return origKeys(o)}:__webpack_require__(284),originalKeys=Object.keys;keysShim.shim=function shimObjectKeys(){Object.keys?function(){var args=Object.keys(arguments);return args&&args.length===arguments.length}(1,2)||(Object.keys=function keys(object){return isArgs(object)?originalKeys(slice.call(object)):originalKeys(object)}):Object.keys=keysShim;return Object.keys||keysShim},module.exports=keysShim},function(module,exports,__webpack_require__){"use strict";var has=__webpack_require__(67),toPrimitive=__webpack_require__(293),keys=__webpack_require__(137),GetIntrinsic=__webpack_require__(55),$TypeError=GetIntrinsic("%TypeError%"),$SyntaxError=GetIntrinsic("%SyntaxError%"),$Array=GetIntrinsic("%Array%"),$String=GetIntrinsic("%String%"),$Object=GetIntrinsic("%Object%"),$Number=GetIntrinsic("%Number%"),$Symbol=GetIntrinsic("%Symbol%",!0),$RegExp=GetIntrinsic("%RegExp%"),hasSymbols=!!$Symbol,assertRecord=__webpack_require__(181),$isNaN=__webpack_require__(182),$isFinite=__webpack_require__(183),MAX_SAFE_INTEGER=$Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1,assign=__webpack_require__(79),sign=__webpack_require__(184),mod=__webpack_require__(185),isPrimitive=__webpack_require__(297),parseInteger=parseInt,bind=__webpack_require__(23),arraySlice=bind.call(Function.call,$Array.prototype.slice),strSlice=bind.call(Function.call,$String.prototype.slice),isBinary=bind.call(Function.call,$RegExp.prototype.test,/^0b[01]+$/i),isOctal=bind.call(Function.call,$RegExp.prototype.test,/^0o[0-7]+$/i),regexExec=bind.call(Function.call,$RegExp.prototype.exec),nonWSregex=new $RegExp("["+["…","​","￾"].join("")+"]","g"),hasNonWS=bind.call(Function.call,$RegExp.prototype.test,nonWSregex),isInvalidHexLiteral=bind.call(Function.call,$RegExp.prototype.test,/^[-+]0x[0-9a-f]+$/i),$charCodeAt=bind.call(Function.call,$String.prototype.charCodeAt),toStr=bind.call(Function.call,Object.prototype.toString),$NumberValueOf=bind.call(Function.call,GetIntrinsic("%NumberPrototype%").valueOf),$BooleanValueOf=bind.call(Function.call,GetIntrinsic("%BooleanPrototype%").valueOf),$StringValueOf=bind.call(Function.call,GetIntrinsic("%StringPrototype%").valueOf),$DateValueOf=bind.call(Function.call,GetIntrinsic("%DatePrototype%").valueOf),$floor=Math.floor,$abs=Math.abs,$ObjectCreate=Object.create,$gOPD=$Object.getOwnPropertyDescriptor,$isExtensible=$Object.isExtensible,$defineProperty=$Object.defineProperty,ws=["\t\n\v\f\r   ᠎    ","          \u2028","\u2029\ufeff"].join(""),trimRegex=new RegExp("(^["+ws+"]+)|(["+ws+"]+$)","g"),replace=bind.call(Function.call,$String.prototype.replace),ES5=__webpack_require__(186),hasRegExpMatcher=__webpack_require__(187),ES6=assign(assign({},ES5),{Call:function Call(F,V){var args=arguments.length>2?arguments[2]:[];if(!this.IsCallable(F))throw new $TypeError(F+" is not a function");return F.apply(V,args)},ToPrimitive:toPrimitive,ToNumber:function ToNumber(argument){var value=isPrimitive(argument)?argument:toPrimitive(argument,$Number);if("symbol"==typeof value)throw new $TypeError("Cannot convert a Symbol value to a number");if("string"==typeof value){if(isBinary(value))return this.ToNumber(parseInteger(strSlice(value,2),2));if(isOctal(value))return this.ToNumber(parseInteger(strSlice(value,2),8));if(hasNonWS(value)||isInvalidHexLiteral(value))return NaN;var trimmed=function(value){return replace(value,trimRegex,"")}(value);if(trimmed!==value)return this.ToNumber(trimmed)}return $Number(value)},ToInt16:function ToInt16(argument){var int16bit=this.ToUint16(argument);return int16bit>=32768?int16bit-65536:int16bit},ToInt8:function ToInt8(argument){var int8bit=this.ToUint8(argument);return int8bit>=128?int8bit-256:int8bit},ToUint8:function ToUint8(argument){var number=this.ToNumber(argument);if($isNaN(number)||0===number||!$isFinite(number))return 0;var posInt=sign(number)*$floor($abs(number));return mod(posInt,256)},ToUint8Clamp:function ToUint8Clamp(argument){var number=this.ToNumber(argument);if($isNaN(number)||number<=0)return 0;if(number>=255)return 255;var f=$floor(argument);return f+.5<number?f+1:number<f+.5?f:f%2!=0?f+1:f},ToString:function ToString(argument){if("symbol"==typeof argument)throw new $TypeError("Cannot convert a Symbol value to a string");return $String(argument)},ToObject:function ToObject(value){return this.RequireObjectCoercible(value),$Object(value)},ToPropertyKey:function ToPropertyKey(argument){var key=this.ToPrimitive(argument,$String);return"symbol"==typeof key?key:this.ToString(key)},ToLength:function ToLength(argument){var len=this.ToInteger(argument);return len<=0?0:len>MAX_SAFE_INTEGER?MAX_SAFE_INTEGER:len},CanonicalNumericIndexString:function CanonicalNumericIndexString(argument){if("[object String]"!==toStr(argument))throw new $TypeError("must be a string");if("-0"===argument)return-0;var n=this.ToNumber(argument);return this.SameValue(this.ToString(n),argument)?n:void 0},RequireObjectCoercible:ES5.CheckObjectCoercible,IsArray:$Array.isArray||function IsArray(argument){return"[object Array]"===toStr(argument)},IsConstructor:function IsConstructor(argument){return"function"==typeof argument&&!!argument.prototype},IsExtensible:Object.preventExtensions?function IsExtensible(obj){return!isPrimitive(obj)&&$isExtensible(obj)}:function isExtensible(obj){return!0},IsInteger:function IsInteger(argument){if("number"!=typeof argument||$isNaN(argument)||!$isFinite(argument))return!1;var abs=$abs(argument);return $floor(abs)===abs},IsPropertyKey:function IsPropertyKey(argument){return"string"==typeof argument||"symbol"==typeof argument},IsRegExp:function IsRegExp(argument){if(!argument||"object"!=typeof argument)return!1;if(hasSymbols){var isRegExp=argument[$Symbol.match];if(void 0!==isRegExp)return ES5.ToBoolean(isRegExp)}return hasRegExpMatcher(argument)},SameValueZero:function SameValueZero(x,y){return x===y||$isNaN(x)&&$isNaN(y)},GetV:function GetV(V,P){if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");return this.ToObject(V)[P]},GetMethod:function GetMethod(O,P){if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");var func=this.GetV(O,P);if(null!=func){if(!this.IsCallable(func))throw new $TypeError(P+"is not a function");return func}},Get:function Get(O,P){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");return O[P]},Type:function Type(x){return"symbol"==typeof x?"Symbol":ES5.Type(x)},SpeciesConstructor:function SpeciesConstructor(O,defaultConstructor){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");var C=O.constructor;if(void 0===C)return defaultConstructor;if("Object"!==this.Type(C))throw new $TypeError("O.constructor is not an Object");var S=hasSymbols&&$Symbol.species?C[$Symbol.species]:void 0;if(null==S)return defaultConstructor;if(this.IsConstructor(S))return S;throw new $TypeError("no constructor found")},CompletePropertyDescriptor:function CompletePropertyDescriptor(Desc){return assertRecord(this,"Property Descriptor","Desc",Desc),this.IsGenericDescriptor(Desc)||this.IsDataDescriptor(Desc)?(has(Desc,"[[Value]]")||(Desc["[[Value]]"]=void 0),has(Desc,"[[Writable]]")||(Desc["[[Writable]]"]=!1)):(has(Desc,"[[Get]]")||(Desc["[[Get]]"]=void 0),has(Desc,"[[Set]]")||(Desc["[[Set]]"]=void 0)),has(Desc,"[[Enumerable]]")||(Desc["[[Enumerable]]"]=!1),has(Desc,"[[Configurable]]")||(Desc["[[Configurable]]"]=!1),Desc},Set:function Set(O,P,V,Throw){if("Object"!==this.Type(O))throw new $TypeError("O must be an Object");if(!this.IsPropertyKey(P))throw new $TypeError("P must be a Property Key");if("Boolean"!==this.Type(Throw))throw new $TypeError("Throw must be a Boolean");if(Throw)return O[P]=V,!0;try{O[P]=V}catch(e){return!1}},HasOwnProperty:function HasOwnProperty(O,P){if("Object"!==this.Type(O))throw new $TypeError("O must be an Object");if(!this.IsPropertyKey(P))throw new $TypeError("P must be a Property Key");return has(O,P)},HasProperty:function HasProperty(O,P){if("Object"!==this.Type(O))throw new $TypeError("O must be an Object");if(!this.IsPropertyKey(P))throw new $TypeError("P must be a Property Key");return P in O},IsConcatSpreadable:function IsConcatSpreadable(O){if("Object"!==this.Type(O))return!1;if(hasSymbols&&"symbol"==typeof $Symbol.isConcatSpreadable){var spreadable=this.Get(O,Symbol.isConcatSpreadable);if(void 0!==spreadable)return this.ToBoolean(spreadable)}return this.IsArray(O)},Invoke:function Invoke(O,P){if(!this.IsPropertyKey(P))throw new $TypeError("P must be a Property Key");var argumentsList=arraySlice(arguments,2),func=this.GetV(O,P);return this.Call(func,O,argumentsList)},GetIterator:function GetIterator(obj,method){if(!hasSymbols)throw new SyntaxError("ES.GetIterator depends on native iterator support.");var actualMethod=method;arguments.length<2&&(actualMethod=this.GetMethod(obj,$Symbol.iterator));var iterator=this.Call(actualMethod,obj);if("Object"!==this.Type(iterator))throw new $TypeError("iterator must return an object");return iterator},IteratorNext:function IteratorNext(iterator,value){var result=this.Invoke(iterator,"next",arguments.length<2?[]:[value]);if("Object"!==this.Type(result))throw new $TypeError("iterator next must return an object");return result},IteratorComplete:function IteratorComplete(iterResult){if("Object"!==this.Type(iterResult))throw new $TypeError("Assertion failed: Type(iterResult) is not Object");return this.ToBoolean(this.Get(iterResult,"done"))},IteratorValue:function IteratorValue(iterResult){if("Object"!==this.Type(iterResult))throw new $TypeError("Assertion failed: Type(iterResult) is not Object");return this.Get(iterResult,"value")},IteratorStep:function IteratorStep(iterator){var result=this.IteratorNext(iterator);return!0!==this.IteratorComplete(result)&&result},IteratorClose:function IteratorClose(iterator,completion){if("Object"!==this.Type(iterator))throw new $TypeError("Assertion failed: Type(iterator) is not Object");if(!this.IsCallable(completion))throw new $TypeError("Assertion failed: completion is not a thunk for a Completion Record");var completionRecord,completionThunk=completion,iteratorReturn=this.GetMethod(iterator,"return");if(void 0===iteratorReturn)return completionThunk();try{var innerResult=this.Call(iteratorReturn,iterator,[])}catch(e){throw completionRecord=completionThunk(),completionThunk=null,e}if(completionRecord=completionThunk(),completionThunk=null,"Object"!==this.Type(innerResult))throw new $TypeError("iterator .return must return an object");return completionRecord},CreateIterResultObject:function CreateIterResultObject(value,done){if("Boolean"!==this.Type(done))throw new $TypeError("Assertion failed: Type(done) is not Boolean");return{value:value,done:done}},RegExpExec:function RegExpExec(R,S){if("Object"!==this.Type(R))throw new $TypeError("R must be an Object");if("String"!==this.Type(S))throw new $TypeError("S must be a String");var exec=this.Get(R,"exec");if(this.IsCallable(exec)){var result=this.Call(exec,R,[S]);if(null===result||"Object"===this.Type(result))return result;throw new $TypeError('"exec" method must return `null` or an Object')}return regexExec(R,S)},ArraySpeciesCreate:function ArraySpeciesCreate(originalArray,length){if(!this.IsInteger(length)||length<0)throw new $TypeError("Assertion failed: length must be an integer >= 0");var C,len=0===length?0:length;if(this.IsArray(originalArray)&&(C=this.Get(originalArray,"constructor"),"Object"===this.Type(C)&&hasSymbols&&$Symbol.species&&null===(C=this.Get(C,$Symbol.species))&&(C=void 0)),void 0===C)return $Array(len);if(!this.IsConstructor(C))throw new $TypeError("C must be a constructor");return new C(len)},CreateDataProperty:function CreateDataProperty(O,P,V){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");var oldDesc=$gOPD(O,P),extensible=oldDesc||"function"!=typeof $isExtensible||$isExtensible(O);return!(!(!oldDesc||oldDesc.writable&&oldDesc.configurable)||!extensible)&&($defineProperty(O,P,{configurable:!0,enumerable:!0,value:V,writable:!0}),!0)},CreateDataPropertyOrThrow:function CreateDataPropertyOrThrow(O,P,V){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");var success=this.CreateDataProperty(O,P,V);if(!success)throw new $TypeError("unable to create data property");return success},ObjectCreate:function ObjectCreate(proto,internalSlotsList){Iif(null!==proto&&"Object"!==this.Type(proto))throw new $TypeError("Assertion failed: proto must be null or an object");var slots=arguments.length<2?[]:internalSlotsList;Iif(slots.length>0)throw new $SyntaxError("es-abstract does not yet support internal slots");Iif(null===proto&&!$ObjectCreate)throw new $SyntaxError("native Object.create support is required to create null objects");return $ObjectCreate(proto)},AdvanceStringIndex:function AdvanceStringIndex(S,index,unicode){if("String"!==this.Type(S))throw new $TypeError("S must be a String");if(!this.IsInteger(index)||index<0||index>MAX_SAFE_INTEGER)throw new $TypeError("Assertion failed: length must be an integer >= 0 and <= 2**53");if("Boolean"!==this.Type(unicode))throw new $TypeError("Assertion failed: unicode must be a Boolean");if(!unicode)return index+1;if(index+1>=S.length)return index+1;var first=$charCodeAt(S,index);if(first<55296||first>56319)return index+1;var second=$charCodeAt(S,index+1);return second<56320||second>57343?index+1:index+2},CreateMethodProperty:function CreateMethodProperty(O,P,V){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");return!!$defineProperty(O,P,{configurable:!0,enumerable:!1,value:V,writable:!0})},DefinePropertyOrThrow:function DefinePropertyOrThrow(O,P,desc){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");return!!$defineProperty(O,P,desc)},DeletePropertyOrThrow:function DeletePropertyOrThrow(O,P){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");if(!this.IsPropertyKey(P))throw new $TypeError("Assertion failed: IsPropertyKey(P) is not true");var success=delete O[P];if(!success)throw new TypeError("Attempt to delete property failed.");return success},EnumerableOwnNames:function EnumerableOwnNames(O){if("Object"!==this.Type(O))throw new $TypeError("Assertion failed: Type(O) is not Object");return keys(O)},thisNumberValue:function thisNumberValue(value){return"Number"===this.Type(value)?value:$NumberValueOf(value)},thisBooleanValue:function thisBooleanValue(value){return"Boolean"===this.Type(value)?value:$BooleanValueOf(value)},thisStringValue:function thisStringValue(value){return"String"===this.Type(value)?value:$StringValueOf(value)},thisTimeValue:function thisTimeValue(value){return $DateValueOf(value)}});delete ES6.CheckObjectCoercible,module.exports=ES6},function(module,exports,__webpack_require__){"use strict";var ES2015=__webpack_require__(138),assign=__webpack_require__(79),ES2016=assign(assign({},ES2015),{SameValueNonNumber:function SameValueNonNumber(x,y){if("number"==typeof x||typeof x!=typeof y)throw new TypeError("SameValueNonNumber requires two non-number values of the same type.");return this.SameValue(x,y)}});module.exports=ES2016},function(module,exports,__webpack_require__){"use strict";module.exports=function requirePromise(){Iif("function"!=typeof Promise)throw new TypeError("`Promise.prototype.finally` requires a global `Promise` be available.")}},function(module,exports,__webpack_require__){"use strict";var assign=__webpack_require__(79),ES5=__webpack_require__(186),ES2015=__webpack_require__(138),ES2016=__webpack_require__(139),ES={ES5:ES5,ES6:ES2015,ES2015:ES2015,ES7:ES2016,ES2016:ES2016,ES2017:__webpack_require__(80),ES2018:__webpack_require__(190)};assign(ES,ES5),delete ES.CheckObjectCoercible,assign(ES,ES2015),module.exports=ES},function(module,exports,__webpack_require__){"use strict";module.exports=function requirePromise(){Iif("function"!=typeof Promise)throw new TypeError("`Promise.allSettled` requires a global `Promise` be available.");Iif("function"!=typeof Array.from)throw new TypeError("`Promise.allSettled` requires `Array.from` be available.")}},function(module,exports,__webpack_require__){"use strict";var toPrimitive=__webpack_require__(69),definePropertyModule=__webpack_require__(15),createPropertyDescriptor=__webpack_require__(70);module.exports=function(object,key,value){var propertyKey=toPrimitive(key);propertyKey in object?definePropertyModule.f(object,propertyKey,createPropertyDescriptor(0,value)):object[propertyKey]=value}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),document=__webpack_require__(7).document,exist=isObject(document)&&isObject(document.createElement);module.exports=function(it){return exist?document.createElement(it):{}}},function(module,exports,__webpack_require__){var global=__webpack_require__(7),hide=__webpack_require__(25);module.exports=function(key,value){try{hide(global,key,value)}catch(error){global[key]=value}return value}},function(module,exports){module.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(module,exports,__webpack_require__){"use strict";var $export=__webpack_require__(3),createIteratorConstructor=__webpack_require__(377),getPrototypeOf=__webpack_require__(42),setPrototypeOf=__webpack_require__(106),setToStringTag=__webpack_require__(56),hide=__webpack_require__(25),redefine=__webpack_require__(32),IS_PURE=__webpack_require__(82),ITERATOR=__webpack_require__(12)("iterator"),Iterators=__webpack_require__(86),IteratorsCore=__webpack_require__(210),IteratorPrototype=IteratorsCore.IteratorPrototype,BUGGY_SAFARI_ITERATORS=IteratorsCore.BUGGY_SAFARI_ITERATORS,returnThis=function(){return this};module.exports=function(Iterable,NAME,IteratorConstructor,next,DEFAULT,IS_SET,FORCED){createIteratorConstructor(IteratorConstructor,NAME,next);var CurrentIteratorPrototype,methods,KEY,getIterationMethod=function(KIND){if(KIND===DEFAULT&&defaultIterator)return defaultIterator;Eif(!BUGGY_SAFARI_ITERATORS&&KIND in IterablePrototype)return IterablePrototype[KIND];switch(KIND){case"keys":return function keys(){return new IteratorConstructor(this,KIND)};case"values":return function values(){return new IteratorConstructor(this,KIND)};case"entries":return function entries(){return new IteratorConstructor(this,KIND)}}return function(){return new IteratorConstructor(this)}},TO_STRING_TAG=NAME+" Iterator",INCORRECT_VALUES_NAME=!1,IterablePrototype=Iterable.prototype,nativeIterator=IterablePrototype[ITERATOR]||IterablePrototype["@@iterator"]||DEFAULT&&IterablePrototype[DEFAULT],defaultIterator=!BUGGY_SAFARI_ITERATORS&&nativeIterator||getIterationMethod(DEFAULT),anyNativeIterator="Array"==NAME&&IterablePrototype.entries||nativeIterator;if(anyNativeIterator&&(CurrentIteratorPrototype=getPrototypeOf(anyNativeIterator.call(new Iterable)),IteratorPrototype!==Object.prototype&&CurrentIteratorPrototype.next&&(IS_PURE||getPrototypeOf(CurrentIteratorPrototype)===IteratorPrototype||(setPrototypeOf?setPrototypeOf(CurrentIteratorPrototype,IteratorPrototype):"function"!=typeof CurrentIteratorPrototype[ITERATOR]&&hide(CurrentIteratorPrototype,ITERATOR,returnThis)),setToStringTag(CurrentIteratorPrototype,TO_STRING_TAG,!0,!0),IS_PURE&&(Iterators[TO_STRING_TAG]=returnThis))),"values"==DEFAULT&&nativeIterator&&"values"!==nativeIterator.name&&(INCORRECT_VALUES_NAME=!0,defaultIterator=function values(){return nativeIterator.call(this)}),IS_PURE&&!FORCED||IterablePrototype[ITERATOR]===defaultIterator||hide(IterablePrototype,ITERATOR,defaultIterator),Iterators[NAME]=defaultIterator,DEFAULT)if(methods={values:getIterationMethod("values"),keys:IS_SET?defaultIterator:getIterationMethod("keys"),entries:getIterationMethod("entries")},FORCED)for(KEY in methods)!BUGGY_SAFARI_ITERATORS&&!INCORRECT_VALUES_NAME&&KEY in IterablePrototype||redefine(IterablePrototype,KEY,methods[KEY]);else $export({target:NAME,proto:!0,forced:BUGGY_SAFARI_ITERATORS||INCORRECT_VALUES_NAME},methods);return methods}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(9)(function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype})},function(module,exports,__webpack_require__){var ITERATOR=__webpack_require__(12)("iterator"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR]=function(){return this},Array.from(iteratorWithReturn,function(){throw 2})}catch(error){}module.exports=function(exec,SKIP_CLOSING){Iif(!SKIP_CLOSING&&!SAFE_CLOSING)return!1;var ITERATION_SUPPORT=!1;try{var object={};object[ITERATOR]=function(){return{next:function(){return{done:ITERATION_SUPPORT=!0}}}},exec(object)}catch(error){}return ITERATION_SUPPORT}},function(module,exports,__webpack_require__){"use strict";var internalMap=__webpack_require__(87)(1),SPECIES_SUPPORT=__webpack_require__(100)("map");__webpack_require__(3)({target:"Array",proto:!0,forced:!SPECIES_SUPPORT},{map:function map(callbackfn){return internalMap(this,callbackfn,arguments[1])}})},function(module,exports,__webpack_require__){"use strict";var internalReduce=__webpack_require__(385),SLOPPY_METHOD=__webpack_require__(107)("reduce");__webpack_require__(3)({target:"Array",proto:!0,forced:SLOPPY_METHOD},{reduce:function reduce(callbackfn){return internalReduce(this,callbackfn,arguments.length,arguments[1],!1)}})},function(module,exports,__webpack_require__){var objectToArray=__webpack_require__(219);__webpack_require__(3)({target:"Object",stat:!0},{entries:function entries(O){return objectToArray(O,!0)}})},function(module,exports,__webpack_require__){var objectToArray=__webpack_require__(219);__webpack_require__(3)({target:"Object",stat:!0},{values:function values(O){return objectToArray(O)}})},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14),defineProperty=__webpack_require__(15).f,FunctionPrototype=Function.prototype,FunctionPrototypeToString=FunctionPrototype.toString,nameRE=/^\s*function ([^ (]*)/;!DESCRIPTORS||"name"in FunctionPrototype||defineProperty(FunctionPrototype,"name",{configurable:!0,get:function(){try{return FunctionPrototypeToString.call(this).match(nameRE)[1]}catch(error){return""}}})},function(module,exports,__webpack_require__){"use strict";var internalFilter=__webpack_require__(87)(2),SPECIES_SUPPORT=__webpack_require__(100)("filter");__webpack_require__(3)({target:"Array",proto:!0,forced:!SPECIES_SUPPORT},{filter:function filter(callbackfn){return internalFilter(this,callbackfn,arguments[1])}})},function(module,exports,__webpack_require__){"use strict";var isObject=__webpack_require__(10),isArray=__webpack_require__(81),toAbsoluteIndex=__webpack_require__(203),toLength=__webpack_require__(24),toIndexedObject=__webpack_require__(40),createProperty=__webpack_require__(143),SPECIES=__webpack_require__(12)("species"),nativeSlice=[].slice,max=Math.max,SPECIES_SUPPORT=__webpack_require__(100)("slice");__webpack_require__(3)({target:"Array",proto:!0,forced:!SPECIES_SUPPORT},{slice:function slice(start,end){var Constructor,result,n,O=toIndexedObject(this),length=toLength(O.length),k=toAbsoluteIndex(start,length),fin=toAbsoluteIndex(void 0===end?length:end,length);if(isArray(O)&&("function"!=typeof(Constructor=O.constructor)||Constructor!==Array&&!isArray(Constructor.prototype)?isObject(Constructor)&&null===(Constructor=Constructor[SPECIES])&&(Constructor=void 0):Constructor=void 0,Constructor===Array||void 0===Constructor))return nativeSlice.call(O,k,fin);for(result=new(void 0===Constructor?Array:Constructor)(max(fin-k,0)),n=0;k<fin;k++,n++)k in O&&createProperty(result,n,O[k]);return result.length=n,result}})},function(module,exports,__webpack_require__){var defer,channel,port,global=__webpack_require__(7),classof=__webpack_require__(38),bind=__webpack_require__(88),html=__webpack_require__(207),createElement=__webpack_require__(144),set=global.setImmediate,clear=global.clearImmediate,process=global.process,MessageChannel=global.MessageChannel,Dispatch=global.Dispatch,counter=0,queue={},run=function(){var id=+this;if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id],fn()}},listener=function(event){run.call(event.data)};set&&clear||(set=function setImmediate(fn){for(var args=[],i=1;arguments.length>i;)args.push(arguments[i++]);return queue[++counter]=function(){("function"==typeof fn?fn:Function(fn)).apply(void 0,args)},defer(counter),counter},clear=function clearImmediate(id){delete queue[id]},"process"==classof(process)?defer=function(id){process.nextTick(bind(run,id,1))}:Dispatch&&Dispatch.now?defer=function(id){Dispatch.now(bind(run,id,1))}:MessageChannel?(port=(channel=new MessageChannel).port2,channel.port1.onmessage=listener,defer=bind(port.postMessage,port,1)):global.addEventListener&&"function"==typeof postMessage&&!global.importScripts?(defer=function(id){global.postMessage(id+"","*")},global.addEventListener("message",listener,!1)):defer="onreadystatechange"in createElement("script")?function(id){html.appendChild(createElement("script")).onreadystatechange=function(){html.removeChild(this),run.call(id)}}:function(id){setTimeout(bind(run,id,1),0)}),module.exports={set:set,clear:clear}},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(4),toLength=__webpack_require__(24),requireObjectCoercible=__webpack_require__(39),advanceStringIndex=__webpack_require__(159),regExpExec=__webpack_require__(109);__webpack_require__(110)("match",1,function(MATCH,nativeMatch,maybeCallNative){return[function match(regexp){var O=requireObjectCoercible(this),matcher=null==regexp?void 0:regexp[MATCH];return void 0!==matcher?matcher.call(regexp,O):new RegExp(regexp)[MATCH](String(O))},function(regexp){var res=maybeCallNative(nativeMatch,regexp,this);if(res.done)return res.value;var rx=anObject(regexp),S=String(this);if(!rx.global)return regExpExec(rx,S);var fullUnicode=rx.unicode;rx.lastIndex=0;for(var result,A=[],n=0;null!==(result=regExpExec(rx,S));){var matchStr=String(result[0]);A[n]=matchStr,""===matchStr&&(rx.lastIndex=advanceStringIndex(S,toLength(rx.lastIndex),fullUnicode)),n++}return 0===n?null:A}]})},function(module,exports,__webpack_require__){"use strict";var codePointAt=__webpack_require__(221);module.exports=function(S,index,unicode){return index+(unicode?codePointAt(S,index,!0).length:1)}},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(4),requireObjectCoercible=__webpack_require__(39),sameValue=__webpack_require__(395),regExpExec=__webpack_require__(109);__webpack_require__(110)("search",1,function(SEARCH,nativeSearch,maybeCallNative){return[function search(regexp){var O=requireObjectCoercible(this),searcher=null==regexp?void 0:regexp[SEARCH];return void 0!==searcher?searcher.call(regexp,O):new RegExp(regexp)[SEARCH](String(O))},function(regexp){var res=maybeCallNative(nativeSearch,regexp,this);if(res.done)return res.value;var rx=anObject(regexp),S=String(this),previousLastIndex=rx.lastIndex;sameValue(previousLastIndex,0)||(rx.lastIndex=0);var result=regExpExec(rx,S);return sameValue(rx.lastIndex,previousLastIndex)||(rx.lastIndex=previousLastIndex),null===result?-1:result.index}]})},function(module,exports,__webpack_require__){var require;module.exports=function e(t,n,r){function s(o,u){if(!n[o]){Iif(!t[o]){if(!u&&"function"==typeof require&&require)return require(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n||e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){module.exports=function(forceSimilar){return"function"!=typeof Map||forceSimilar?new(_dereq_("./similar")):new Map}},{"./similar":2}],2:[function(_dereq_,module,exports){function Similar(){return this.list=[],this.lastItem=void 0,this.size=0,this}Similar.prototype.get=function(key){var index;return this.lastItem&&this.isEqual(this.lastItem.key,key)?this.lastItem.val:(index=this.indexOf(key))>=0?(this.lastItem=this.list[index],this.list[index].val):void 0},Similar.prototype.set=function(key,val){var index;return this.lastItem&&this.isEqual(this.lastItem.key,key)?(this.lastItem.val=val,this):(index=this.indexOf(key))>=0?(this.lastItem=this.list[index],this.list[index].val=val,this):(this.lastItem={key:key,val:val},this.list.push(this.lastItem),this.size++,this)},Similar.prototype.delete=function(key){var index;if(this.lastItem&&this.isEqual(this.lastItem.key,key)&&(this.lastItem=void 0),(index=this.indexOf(key))>=0)return this.size--,this.list.splice(index,1)[0]},Similar.prototype.has=function(key){var index;return!(!this.lastItem||!this.isEqual(this.lastItem.key,key))||(index=this.indexOf(key))>=0&&(this.lastItem=this.list[index],!0)},Similar.prototype.forEach=function(callback,thisArg){var i;for(i=0;i<this.size;i++)callback.call(thisArg||this,this.list[i].val,this.list[i].key,this)},Similar.prototype.indexOf=function(key){var i;for(i=0;i<this.size;i++)if(this.isEqual(this.list[i].key,key))return i;return-1},Similar.prototype.isEqual=function(val1,val2){return val1===val2||val1!=val1&&val2!=val2},module.exports=Similar},{}],3:[function(_dereq_,module,exports){var MapOrSimilar=_dereq_("map-or-similar");function moveToMostRecentLru(lru,lruPath){var isMatch,i,ii,val1,val2,lruLen=lru.length,lruPathLen=lruPath.length;for(i=0;i<lruLen;i++){for(isMatch=!0,ii=0;ii<lruPathLen;ii++)if(val1=lru[i][ii].arg,val2=lruPath[ii].arg,val1!==val2&&(val1==val1||val2==val2)){isMatch=!1;break}if(isMatch)break}lru.push(lru.splice(i,1)[0])}function removeCachedResult(removedLru){var tmp,i,removedLruLen=removedLru.length,currentLru=removedLru[removedLruLen-1];for(currentLru.cacheItem.delete(currentLru.arg),i=removedLruLen-2;i>=0&&(!(tmp=(currentLru=removedLru[i]).cacheItem.get(currentLru.arg))||!tmp.size);i--)currentLru.cacheItem.delete(currentLru.arg)}module.exports=function(limit){var cache=new MapOrSimilar(!1),lru=[];return function(fn){var memoizerific=function(){var newMap,fnResult,i,currentCache=cache,argsLengthMinusOne=arguments.length-1,lruPath=Array(argsLengthMinusOne+1),isMemoized=!0;Iif((memoizerific.numArgs||0===memoizerific.numArgs)&&memoizerific.numArgs!==argsLengthMinusOne+1)throw new Error("Memoizerific functions should always be called with the same number of arguments");for(i=0;i<argsLengthMinusOne;i++)lruPath[i]={cacheItem:currentCache,arg:arguments[i]},currentCache.has(arguments[i])?currentCache=currentCache.get(arguments[i]):(isMemoized=!1,newMap=new MapOrSimilar(!1),currentCache.set(arguments[i],newMap),currentCache=newMap);return isMemoized&&(currentCache.has(arguments[argsLengthMinusOne])?fnResult=currentCache.get(arguments[argsLengthMinusOne]):isMemoized=!1),isMemoized||(fnResult=fn.apply(null,arguments),currentCache.set(arguments[argsLengthMinusOne],fnResult)),limit>0&&(lruPath[argsLengthMinusOne]={cacheItem:currentCache,arg:arguments[argsLengthMinusOne]},isMemoized?moveToMostRecentLru(lru,lruPath):lru.push(lruPath),lru.length>limit&&removeCachedResult(lru.shift())),memoizerific.wasMemoized=isMemoized,memoizerific.numArgs=argsLengthMinusOne+1,fnResult};return memoizerific.limit=limit,memoizerific.wasMemoized=!1,memoizerific.cache=cache,memoizerific.lru=lru,memoizerific}}},{"map-or-similar":1}]},{},[3])(3)},function(module,exports,__webpack_require__){var Map=__webpack_require__(59)(__webpack_require__(28),"Map");module.exports=Map},function(module,exports,__webpack_require__){var baseGetTag=__webpack_require__(76),isObject=__webpack_require__(47),asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]";module.exports=function isFunction(value){Iif(!isObject(value))return!1;var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}},function(module,exports,__webpack_require__){var mapCacheClear=__webpack_require__(421),mapCacheDelete=__webpack_require__(428),mapCacheGet=__webpack_require__(430),mapCacheHas=__webpack_require__(431),mapCacheSet=__webpack_require__(432);function MapCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}MapCache.prototype.clear=mapCacheClear,MapCache.prototype.delete=mapCacheDelete,MapCache.prototype.get=mapCacheGet,MapCache.prototype.has=mapCacheHas,MapCache.prototype.set=mapCacheSet,module.exports=MapCache},function(module,exports,__webpack_require__){var defineProperty=__webpack_require__(233);module.exports=function baseAssignValue(object,key,value){"__proto__"==key&&defineProperty?defineProperty(object,key,{configurable:!0,enumerable:!0,value:value,writable:!0}):object[key]=value}},function(module,exports){var objectProto=Object.prototype;module.exports=function isPrototype(value){var Ctor=value&&value.constructor;return value===("function"==typeof Ctor&&Ctor.prototype||objectProto)}},function(module,exports,__webpack_require__){(function(module){var root=__webpack_require__(28),stubFalse=__webpack_require__(444),freeExports=exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,Buffer=freeModule&&freeModule.exports===freeExports?root.Buffer:void 0,isBuffer=(Buffer?Buffer.isBuffer:void 0)||stubFalse;module.exports=isBuffer}).call(this,__webpack_require__(58)(module))},function(module,exports,__webpack_require__){var baseIsTypedArray=__webpack_require__(446),baseUnary=__webpack_require__(447),nodeUtil=__webpack_require__(448),nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray,isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;module.exports=isTypedArray},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(7),isForced=__webpack_require__(105),$export=__webpack_require__(3),redefine=__webpack_require__(32),InternalMetadataModule=__webpack_require__(95),iterate=__webpack_require__(96),anInstance=__webpack_require__(118),isObject=__webpack_require__(10),fails=__webpack_require__(9),checkCorrectnessOfIteration=__webpack_require__(149),setToStringTag=__webpack_require__(56),inheritIfRequired=__webpack_require__(248);module.exports=function(CONSTRUCTOR_NAME,wrapper,common,IS_MAP,IS_WEAK){var NativeConstructor=global[CONSTRUCTOR_NAME],NativePrototype=NativeConstructor&&NativeConstructor.prototype,Constructor=NativeConstructor,ADDER=IS_MAP?"set":"add",exported={},fixMethod=function(KEY){var nativeMethod=NativePrototype[KEY];redefine(NativePrototype,KEY,"add"==KEY?function add(a){return nativeMethod.call(this,0===a?0:a),this}:"delete"==KEY?function(a){return!(IS_WEAK&&!isObject(a))&&nativeMethod.call(this,0===a?0:a)}:"get"==KEY?function get(a){return IS_WEAK&&!isObject(a)?void 0:nativeMethod.call(this,0===a?0:a)}:"has"==KEY?function has(a){return!(IS_WEAK&&!isObject(a))&&nativeMethod.call(this,0===a?0:a)}:function set(a,b){return nativeMethod.call(this,0===a?0:a,b),this})};Iif(isForced(CONSTRUCTOR_NAME,"function"!=typeof NativeConstructor||!(IS_WEAK||NativePrototype.forEach&&!fails(function(){(new NativeConstructor).entries().next()}))))Constructor=common.getConstructor(wrapper,CONSTRUCTOR_NAME,IS_MAP,ADDER),InternalMetadataModule.REQUIRED=!0;else Eif(isForced(CONSTRUCTOR_NAME,!0)){var instance=new Constructor,HASNT_CHAINING=instance[ADDER](IS_WEAK?{}:-0,1)!=instance,THROWS_ON_PRIMITIVES=fails(function(){instance.has(1)}),ACCEPT_ITERABLES=checkCorrectnessOfIteration(function(iterable){new NativeConstructor(iterable)}),BUGGY_ZERO=!IS_WEAK&&fails(function(){for(var $instance=new NativeConstructor,index=5;index--;)$instance[ADDER](index,index);return!$instance.has(-0)});ACCEPT_ITERABLES||((Constructor=wrapper(function(target,iterable){anInstance(target,Constructor,CONSTRUCTOR_NAME);var that=inheritIfRequired(new NativeConstructor,target,Constructor);return null!=iterable&&iterate(iterable,that[ADDER],that,IS_MAP),that})).prototype=NativePrototype,NativePrototype.constructor=Constructor),(THROWS_ON_PRIMITIVES||BUGGY_ZERO)&&(fixMethod("delete"),fixMethod("has"),IS_MAP&&fixMethod("get")),(BUGGY_ZERO||HASNT_CHAINING)&&fixMethod(ADDER),IS_WEAK&&NativePrototype.clear&&delete NativePrototype.clear}return exported[CONSTRUCTOR_NAME]=Constructor,$export({global:!0,forced:Constructor!=NativeConstructor},exported),setToStringTag(Constructor,CONSTRUCTOR_NAME),IS_WEAK||common.setStrong(Constructor,CONSTRUCTOR_NAME,IS_MAP),Constructor}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(9)(function(){return Object.isExtensible(Object.preventExtensions({}))})},function(module,exports,__webpack_require__){var navigator=__webpack_require__(7).navigator;module.exports=navigator&&navigator.userAgent||""},function(module,exports,__webpack_require__){"use strict";__webpack_require__(44),__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.action=function action(name){var options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},actionOptions=Object.assign({},_configureActions.config,options);return function actionHandler(){for(var channel=_addons.addons.getChannel(),id=(0,_v.default)(),minDepth=5,_len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var actionDisplayToEmit={id:id,count:0,data:{name:name,args:args},options:Object.assign({},actionOptions,{depth:minDepth+(actionOptions.depth||3),allowFunction:actionOptions.allowFunction||!1})};channel.emit(_constants.EVENT_ID,actionDisplayToEmit)}};var _v=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(568)),_addons=__webpack_require__(92),_constants=__webpack_require__(265),_configureActions=__webpack_require__(173)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(44),__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.configureActions=exports.config=void 0;var config={depth:10,clearOnStoryChange:!0,limit:50};exports.config=config;exports.configureActions=function configureActions(){var options=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Object.assign(config,options)}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(44),__webpack_require__(6),__webpack_require__(45),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0}),exports.actions=function actions(){for(var options=_configureActions.config,_len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var names=args;1!==names.length&&"string"!=typeof args[args.length-1]&&(options=Object.assign({},_configureActions.config,names.pop()));var namesObject=names[0];1===names.length&&"string"!=typeof namesObject||(namesObject={},names.forEach(function(name){namesObject[name]=name}));var actionsObject={};return Object.keys(namesObject).forEach(function(name){actionsObject[name]=(0,_action.action)(namesObject[name],options)}),actionsObject};var _action=__webpack_require__(172),_configureActions=__webpack_require__(173)},,function(module,exports){var cachedSetTimeout,cachedClearTimeout,process=module.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(fun){if(cachedSetTimeout===setTimeout)return setTimeout(fun,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(fun,0);try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(e){cachedSetTimeout=defaultSetTimout}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(e){cachedClearTimeout=defaultClearTimeout}}();var currentQueue,queue=[],draining=!1,queueIndex=-1;function cleanUpNextTick(){draining&&currentQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var timeout=runTimeout(cleanUpNextTick);draining=!0;for(var len=queue.length;len;){for(currentQueue=queue,queue=[];++queueIndex<len;)currentQueue&&currentQueue[queueIndex].run();queueIndex=-1,len=queue.length}currentQueue=null,draining=!1,function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout)return clearTimeout(marker);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(marker);try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}(timeout)}}function Item(fun,array){this.fun=fun,this.array=array}function noop(){}process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)args[i-1]=arguments[i];queue.push(new Item(fun,args)),1!==queue.length||draining||runTimeout(drainQueue)},Item.prototype.run=function(){this.fun.apply(null,this.array)},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.prependListener=noop,process.prependOnceListener=noop,process.listeners=function(name){return[]},process.binding=function(name){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(dir){throw new Error("process.chdir is not supported")},process.umask=function(){return 0}},function(module,exports,__webpack_require__){"use strict";var toStr=Object.prototype.toString;module.exports=function isArguments(value){var str=toStr.call(value),isArgs="[object Arguments]"===str;return isArgs||(isArgs="[object Array]"!==str&&null!==value&&"object"==typeof value&&"number"==typeof value.length&&value.length>=0&&"[object Function]"===toStr.call(value.callee)),isArgs}},function(module,exports,__webpack_require__){"use strict";var functionsHaveNames=function functionsHaveNames(){return"string"==typeof function f(){}.name},gOPD=Object.getOwnPropertyDescriptor;functionsHaveNames.functionsHaveConfigurableNames=function functionsHaveConfigurableNames(){return functionsHaveNames()&&gOPD&&!!gOPD(function(){},"name").configurable},module.exports=functionsHaveNames},function(module,exports){module.exports=function isPrimitive(value){return null===value||"function"!=typeof value&&"object"!=typeof value}},function(module,exports,__webpack_require__){"use strict";var toStr=Object.prototype.toString;Eif(__webpack_require__(54)()){var symToStr=Symbol.prototype.toString,symStringRegex=/^Symbol\(.*\)$/;module.exports=function isSymbol(value){Iif("symbol"==typeof value)return!0;Eif("[object Symbol]"!==toStr.call(value))return!1;try{return function isRealSymbolObject(value){return"symbol"==typeof value.valueOf()&&symStringRegex.test(symToStr.call(value))}(value)}catch(e){return!1}}}else module.exports=function isSymbol(value){return!1}},function(module,exports,__webpack_require__){"use strict";var GetIntrinsic=__webpack_require__(55),$TypeError=GetIntrinsic("%TypeError%"),$SyntaxError=GetIntrinsic("%SyntaxError%"),has=__webpack_require__(67),predicates={"Property Descriptor":function isPropertyDescriptor(ES,Desc){if("Object"!==ES.Type(Desc))return!1;var allowed={"[[Configurable]]":!0,"[[Enumerable]]":!0,"[[Get]]":!0,"[[Set]]":!0,"[[Value]]":!0,"[[Writable]]":!0};for(var key in Desc)if(has(Desc,key)&&!allowed[key])return!1;var isData=has(Desc,"[[Value]]"),IsAccessor=has(Desc,"[[Get]]")||has(Desc,"[[Set]]");if(isData&&IsAccessor)throw new $TypeError("Property Descriptors may not be both accessor and data descriptors");return!0}};module.exports=function assertRecord(ES,recordType,argumentName,value){var predicate=predicates[recordType];if("function"!=typeof predicate)throw new $SyntaxError("unknown record type: "+recordType);if(!predicate(ES,value))throw new $TypeError(argumentName+" must be a "+recordType);console.log(predicate(ES,value),value)}},function(module,exports){module.exports=Number.isNaN||function isNaN(a){return a!=a}},function(module,exports){var $isNaN=Number.isNaN||function(a){return a!=a};module.exports=Number.isFinite||function(x){return"number"==typeof x&&!$isNaN(x)&&x!==1/0&&x!==-1/0}},function(module,exports){module.exports=function sign(number){return number>=0?1:-1}},function(module,exports){module.exports=function mod(number,modulo){var remain=number%modulo;return Math.floor(remain>=0?remain:remain+modulo)}},function(module,exports,__webpack_require__){"use strict";var GetIntrinsic=__webpack_require__(55),$Object=GetIntrinsic("%Object%"),$TypeError=GetIntrinsic("%TypeError%"),$String=GetIntrinsic("%String%"),assertRecord=__webpack_require__(181),$isNaN=__webpack_require__(182),$isFinite=__webpack_require__(183),sign=__webpack_require__(184),mod=__webpack_require__(185),IsCallable=__webpack_require__(97),toPrimitive=__webpack_require__(298),has=__webpack_require__(67),ES5={ToPrimitive:toPrimitive,ToBoolean:function ToBoolean(value){return!!value},ToNumber:function ToNumber(value){return+value},ToInteger:function ToInteger(value){var number=this.ToNumber(value);return $isNaN(number)?0:0!==number&&$isFinite(number)?sign(number)*Math.floor(Math.abs(number)):number},ToInt32:function ToInt32(x){return this.ToNumber(x)>>0},ToUint32:function ToUint32(x){return this.ToNumber(x)>>>0},ToUint16:function ToUint16(value){var number=this.ToNumber(value);if($isNaN(number)||0===number||!$isFinite(number))return 0;var posInt=sign(number)*Math.floor(Math.abs(number));return mod(posInt,65536)},ToString:function ToString(value){return $String(value)},ToObject:function ToObject(value){return this.CheckObjectCoercible(value),$Object(value)},CheckObjectCoercible:function CheckObjectCoercible(value,optMessage){if(null==value)throw new $TypeError(optMessage||"Cannot call method on "+value);return value},IsCallable:IsCallable,SameValue:function SameValue(x,y){return x===y?0!==x||1/x==1/y:$isNaN(x)&&$isNaN(y)},Type:function Type(x){return null===x?"Null":void 0===x?"Undefined":"function"==typeof x||"object"==typeof x?"Object":"number"==typeof x?"Number":"boolean"==typeof x?"Boolean":"string"==typeof x?"String":void 0},IsPropertyDescriptor:function IsPropertyDescriptor(Desc){if("Object"!==this.Type(Desc))return!1;var allowed={"[[Configurable]]":!0,"[[Enumerable]]":!0,"[[Get]]":!0,"[[Set]]":!0,"[[Value]]":!0,"[[Writable]]":!0};for(var key in Desc)if(has(Desc,key)&&!allowed[key])return!1;var isData=has(Desc,"[[Value]]"),IsAccessor=has(Desc,"[[Get]]")||has(Desc,"[[Set]]");if(isData&&IsAccessor)throw new $TypeError("Property Descriptors may not be both accessor and data descriptors");return!0},IsAccessorDescriptor:function IsAccessorDescriptor(Desc){return void 0!==Desc&&(assertRecord(this,"Property Descriptor","Desc",Desc),!(!has(Desc,"[[Get]]")&&!has(Desc,"[[Set]]")))},IsDataDescriptor:function IsDataDescriptor(Desc){return void 0!==Desc&&(assertRecord(this,"Property Descriptor","Desc",Desc),!(!has(Desc,"[[Value]]")&&!has(Desc,"[[Writable]]")))},IsGenericDescriptor:function IsGenericDescriptor(Desc){return void 0!==Desc&&(assertRecord(this,"Property Descriptor","Desc",Desc),!this.IsAccessorDescriptor(Desc)&&!this.IsDataDescriptor(Desc))},FromPropertyDescriptor:function FromPropertyDescriptor(Desc){if(void 0===Desc)return Desc;if(assertRecord(this,"Property Descriptor","Desc",Desc),this.IsDataDescriptor(Desc))return{value:Desc["[[Value]]"],writable:!!Desc["[[Writable]]"],enumerable:!!Desc["[[Enumerable]]"],configurable:!!Desc["[[Configurable]]"]};if(this.IsAccessorDescriptor(Desc))return{get:Desc["[[Get]]"],set:Desc["[[Set]]"],enumerable:!!Desc["[[Enumerable]]"],configurable:!!Desc["[[Configurable]]"]};throw new $TypeError("FromPropertyDescriptor must be called with a fully populated Property Descriptor")},ToPropertyDescriptor:function ToPropertyDescriptor(Obj){if("Object"!==this.Type(Obj))throw new $TypeError("ToPropertyDescriptor requires an object");var desc={};if(has(Obj,"enumerable")&&(desc["[[Enumerable]]"]=this.ToBoolean(Obj.enumerable)),has(Obj,"configurable")&&(desc["[[Configurable]]"]=this.ToBoolean(Obj.configurable)),has(Obj,"value")&&(desc["[[Value]]"]=Obj.value),has(Obj,"writable")&&(desc["[[Writable]]"]=this.ToBoolean(Obj.writable)),has(Obj,"get")){var getter=Obj.get;if(void 0!==getter&&!this.IsCallable(getter))throw new TypeError("getter must be a function");desc["[[Get]]"]=getter}if(has(Obj,"set")){var setter=Obj.set;if(void 0!==setter&&!this.IsCallable(setter))throw new $TypeError("setter must be a function");desc["[[Set]]"]=setter}if((has(desc,"[[Get]]")||has(desc,"[[Set]]"))&&(has(desc,"[[Value]]")||has(desc,"[[Writable]]")))throw new $TypeError("Invalid property descriptor. Cannot both specify accessors and a value or writable attribute");return desc}};module.exports=ES5},function(module,exports,__webpack_require__){"use strict";var has=__webpack_require__(67),regexExec=RegExp.prototype.exec,gOPD=Object.getOwnPropertyDescriptor,toStr=Object.prototype.toString,hasToStringTag="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;module.exports=function isRegex(value){if(!value||"object"!=typeof value)return!1;Iif(!hasToStringTag)return"[object RegExp]"===toStr.call(value);var descriptor=gOPD(value,"lastIndex");return!(!descriptor||!has(descriptor,"value"))&&function tryRegexExec(value){try{var lastIndex=value.lastIndex;return value.lastIndex=0,regexExec.call(value),!0}catch(e){return!1}finally{value.lastIndex=lastIndex}}(value)}},function(module,exports,__webpack_require__){"use strict";module.exports=function forEach(array,callback){for(var i=0;i<array.length;i+=1)callback(array[i],i,array)}},function(module,exports,__webpack_require__){"use strict";var getInferredName;try{getInferredName=Function("s","return { [s]() {} }[s].name;")}catch(e){}module.exports=getInferredName&&"inferred"===function(){}.name?getInferredName:null},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(23),keys=__webpack_require__(137),ES2017=__webpack_require__(80),assign=__webpack_require__(79),forEach=__webpack_require__(188),GetIntrinsic=__webpack_require__(55),$String=GetIntrinsic("%String%"),$Object=GetIntrinsic("%Object%"),$SymbolProto=GetIntrinsic("%SymbolPrototype%",!0),$SymbolValueOf=$SymbolProto?bind.call(Function.call,$SymbolProto.valueOf):null,$StringProto=GetIntrinsic("%StringPrototype%"),$charAt=bind.call(Function.call,$StringProto.charAt),$PromiseResolveOrig=GetIntrinsic("%Promise_resolve%",!0),$PromiseResolve=$PromiseResolveOrig?bind.call(Function.call,$PromiseResolveOrig):null,$isEnumerable=bind.call(Function.call,GetIntrinsic("%ObjectPrototype%").propertyIsEnumerable),$pushApply=bind.call(Function.apply,GetIntrinsic("%ArrayPrototype%").push),$gOPS=$SymbolValueOf?$Object.getOwnPropertySymbols:null,ES2018=assign(assign({},ES2017),{EnumerableOwnPropertyNames:ES2017.EnumerableOwnProperties,thisSymbolValue:function thisSymbolValue(value){if(!$SymbolValueOf)throw new SyntaxError("Symbols are not supported; thisSymbolValue requires that `value` be a Symbol or a Symbol object");return"Symbol"===this.Type(value)?value:$SymbolValueOf(value)},IsStringPrefix:function IsStringPrefix(p,q){if("String"!==this.Type(p))throw new TypeError('Assertion failed: "p" must be a String');if("String"!==this.Type(q))throw new TypeError('Assertion failed: "q" must be a String');if(p===q||""===p)return!0;var pLength=p.length;if(pLength>=q.length)return!1;for(var i=0;i<pLength;i+=1)if($charAt(p,i)!==$charAt(q,i))return!1;return!0},NumberToString:function NumberToString(m){if("Number"!==this.Type(m))throw new TypeError('Assertion failed: "m" must be a String');return $String(m)},CopyDataProperties:function CopyDataProperties(target,source,excludedItems){if("Object"!==this.Type(target))throw new TypeError('Assertion failed: "target" must be an Object');if(!this.IsArray(excludedItems))throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');for(var i=0;i<excludedItems.length;i+=1)if(!this.IsPropertyKey(excludedItems[i]))throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys');if(null==source)return target;var ES=this,fromObj=ES.ToObject(source),sourceKeys=function OwnPropertyKeys(ES,source){var ownKeys=keys(source);return $gOPS&&$pushApply(ownKeys,$gOPS(source)),ownKeys}(0,fromObj);return forEach(sourceKeys,function(nextKey){var excluded=!1;forEach(excludedItems,function(e){!0===ES.SameValue(e,nextKey)&&(excluded=!0)});var enumerable=$isEnumerable(fromObj,nextKey)||"string"==typeof source&&nextKey>=0&&ES.IsInteger(ES.ToNumber(nextKey));if(!1===excluded&&enumerable){var propValue=ES.Get(fromObj,nextKey);ES.CreateDataProperty(target,nextKey,propValue)}}),target},PromiseResolve:function PromiseResolve(C,x){if(!$PromiseResolve)throw new SyntaxError("This environment does not support Promises.");return $PromiseResolve(C,x)}});delete ES2018.EnumerableOwnProperties,delete ES2018.IsPropertyDescriptor,module.exports=ES2018},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(141),flagsGetter=__webpack_require__(342),RegExpStringIterator=__webpack_require__(344),OrigRegExp=RegExp,regexMatchAll=function SymbolMatchAll(string){var R=this;if("Object"!==ES.Type(R))throw new TypeError('"this" value must be an Object');var S=ES.ToString(string),tmp=function constructRegex(C,R){var matcher,flags=ES.Get(R,"flags");return"string"==typeof flags?matcher=new C(R,flags):C===OrigRegExp?(flags=flagsGetter(R),matcher=new C(R.source,flags)):matcher=new C(R,flags=flagsGetter(R)),{flags:flags,matcher:matcher}}(ES.SpeciesConstructor(R,OrigRegExp),R),flags=tmp.flags,matcher=tmp.matcher,lastIndex=ES.ToLength(ES.Get(R,"lastIndex"));return ES.Set(matcher,"lastIndex",lastIndex,!0),function CreateRegExpStringIterator(R,S,global,fullUnicode){if("String"!==ES.Type(S))throw new TypeError('"S" value must be a String');if("Boolean"!==ES.Type(global))throw new TypeError('"global" value must be a Boolean');if("Boolean"!==ES.Type(fullUnicode))throw new TypeError('"fullUnicode" value must be a Boolean');return new RegExpStringIterator(R,S,global,fullUnicode)}(matcher,S,flags.indexOf("g")>-1,flags.indexOf("u")>-1)},defineP=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor;Eif(defineP&&gOPD){var desc=gOPD(regexMatchAll,"name");desc&&desc.configurable&&defineP(regexMatchAll,"name",{value:"[Symbol.matchAll]"})}module.exports=regexMatchAll},function(module,exports,__webpack_require__){"use strict";var toObject=Object,TypeErr=TypeError;module.exports=function flags(){if(null!=this&&this!==toObject(this))throw new TypeErr("RegExp.prototype.flags getter called on non-object");var result="";return this.global&&(result+="g"),this.ignoreCase&&(result+="i"),this.multiline&&(result+="m"),this.dotAll&&(result+="s"),this.unicode&&(result+="u"),this.sticky&&(result+="y"),result}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(192),supportsDescriptors=__webpack_require__(13).supportsDescriptors,gOPD=Object.getOwnPropertyDescriptor,TypeErr=TypeError;module.exports=function getPolyfill(){if(!supportsDescriptors)throw new TypeErr("RegExp.prototype.flags requires a true ES5 environment that supports property descriptors");if("gim"===/a/gim.flags){var descriptor=gOPD(RegExp.prototype,"flags");if(descriptor&&"function"==typeof descriptor.get&&"boolean"==typeof/a/.dotAll)return descriptor.get}return implementation}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(14)&&!__webpack_require__(9)(function(){return 7!=Object.defineProperty(__webpack_require__(144)("div"),"a",{get:function(){return 7}}).a})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),isArray=__webpack_require__(81),SPECIES=__webpack_require__(12)("species");module.exports=function(originalArray,length){var C;return isArray(originalArray)&&("function"!=typeof(C=originalArray.constructor)||C!==Array&&!isArray(C.prototype)?isObject(C)&&null===(C=C[SPECIES])&&(C=void 0):C=void 0),new(void 0===C?Array:C)(0===length?0:length)}},function(module,exports,__webpack_require__){module.exports=!__webpack_require__(9)(function(){return!String(Symbol())})},function(module,exports,__webpack_require__){module.exports=__webpack_require__(71)("native-function-to-string",Function.toString)},function(module,exports,__webpack_require__){var nativeFunctionToString=__webpack_require__(197),WeakMap=__webpack_require__(7).WeakMap;module.exports="function"==typeof WeakMap&&/native code/.test(nativeFunctionToString.call(WeakMap))},function(module,exports,__webpack_require__){var has=__webpack_require__(16),ownKeys=__webpack_require__(200),getOwnPropertyDescriptorModule=__webpack_require__(31),definePropertyModule=__webpack_require__(15);module.exports=function(target,source){for(var keys=ownKeys(source),defineProperty=definePropertyModule.f,getOwnPropertyDescriptor=getOwnPropertyDescriptorModule.f,i=0;i<keys.length;i++){var key=keys[i];has(target,key)||defineProperty(target,key,getOwnPropertyDescriptor(source,key))}}},function(module,exports,__webpack_require__){var getOwnPropertyNamesModule=__webpack_require__(103),getOwnPropertySymbolsModule=__webpack_require__(104),anObject=__webpack_require__(4),Reflect=__webpack_require__(7).Reflect;module.exports=Reflect&&Reflect.ownKeys||function ownKeys(it){var keys=getOwnPropertyNamesModule.f(anObject(it)),getOwnPropertySymbols=getOwnPropertySymbolsModule.f;return getOwnPropertySymbols?keys.concat(getOwnPropertySymbols(it)):keys}},function(module,exports,__webpack_require__){var has=__webpack_require__(16),toIndexedObject=__webpack_require__(40),arrayIndexOf=__webpack_require__(202)(!1),hiddenKeys=__webpack_require__(84);module.exports=function(object,names){var key,O=toIndexedObject(object),i=0,result=[];for(key in O)!has(hiddenKeys,key)&&has(O,key)&&result.push(key);for(;names.length>i;)has(O,key=names[i++])&&(~arrayIndexOf(result,key)||result.push(key));return result}},function(module,exports,__webpack_require__){var toIndexedObject=__webpack_require__(40),toLength=__webpack_require__(24),toAbsoluteIndex=__webpack_require__(203);module.exports=function(IS_INCLUDES){return function($this,el,fromIndex){var value,O=toIndexedObject($this),length=toLength(O.length),index=toAbsoluteIndex(fromIndex,length);if(IS_INCLUDES&&el!=el){for(;length>index;)if((value=O[index++])!=value)return!0}else for(;length>index;index++)if((IS_INCLUDES||index in O)&&O[index]===el)return IS_INCLUDES||index||0;return!IS_INCLUDES&&-1}}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(98),max=Math.max,min=Math.min;module.exports=function(index,length){var integer=toInteger(index);return integer<0?max(integer+length,0):min(integer,length)}},function(module,exports,__webpack_require__){var classofRaw=__webpack_require__(38),TO_STRING_TAG=__webpack_require__(12)("toStringTag"),CORRECT_ARGUMENTS="Arguments"==classofRaw(function(){return arguments}());module.exports=function(it){var O,tag,result;return void 0===it?"Undefined":null===it?"Null":"string"==typeof(tag=function(it,key){try{return it[key]}catch(error){}}(O=Object(it),TO_STRING_TAG))?tag:CORRECT_ARGUMENTS?classofRaw(O):"Object"==(result=classofRaw(O))&&"function"==typeof O.callee?"Arguments":result}},function(module,exports,__webpack_require__){exports.f=__webpack_require__(12)},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14),definePropertyModule=__webpack_require__(15),anObject=__webpack_require__(4),objectKeys=__webpack_require__(72);module.exports=DESCRIPTORS?Object.defineProperties:function defineProperties(O,Properties){anObject(O);for(var key,keys=objectKeys(Properties),length=keys.length,i=0;length>i;)definePropertyModule.f(O,key=keys[i++],Properties[key]);return O}},function(module,exports,__webpack_require__){var document=__webpack_require__(7).document;module.exports=document&&document.documentElement},function(module,exports){module.exports=function(originalModule){Eif(!originalModule.webpackPolyfill){var module=Object.create(originalModule);module.children||(module.children=[]),Object.defineProperty(module,"loaded",{enumerable:!0,get:function(){return module.l}}),Object.defineProperty(module,"id",{enumerable:!0,get:function(){return module.i}}),Object.defineProperty(module,"exports",{enumerable:!0}),module.webpackPolyfill=1}return module}},function(module,exports,__webpack_require__){var UNSCOPABLES=__webpack_require__(12)("unscopables"),create=__webpack_require__(57),hide=__webpack_require__(25),ArrayPrototype=Array.prototype;null==ArrayPrototype[UNSCOPABLES]&&hide(ArrayPrototype,UNSCOPABLES,create(null)),module.exports=function(key){ArrayPrototype[UNSCOPABLES][key]=!0}},function(module,exports,__webpack_require__){"use strict";var IteratorPrototype,PrototypeOfArrayIteratorPrototype,arrayIterator,getPrototypeOf=__webpack_require__(42),hide=__webpack_require__(25),has=__webpack_require__(16),IS_PURE=__webpack_require__(82),ITERATOR=__webpack_require__(12)("iterator"),BUGGY_SAFARI_ITERATORS=!1;[].keys&&("next"in(arrayIterator=[].keys())?(PrototypeOfArrayIteratorPrototype=getPrototypeOf(getPrototypeOf(arrayIterator)))!==Object.prototype&&(IteratorPrototype=PrototypeOfArrayIteratorPrototype):BUGGY_SAFARI_ITERATORS=!0),null==IteratorPrototype&&(IteratorPrototype={}),IS_PURE||has(IteratorPrototype,ITERATOR)||hide(IteratorPrototype,ITERATOR,function(){return this}),module.exports={IteratorPrototype:IteratorPrototype,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),anObject=__webpack_require__(4);module.exports=function(O,proto){if(anObject(O),!isObject(proto)&&null!==proto)throw TypeError("Can't set "+String(proto)+" as a prototype")}},function(module,exports){module.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(module,exports,__webpack_require__){"use strict";var nativeForEach=[].forEach,internalForEach=__webpack_require__(87)(0),SLOPPY_METHOD=__webpack_require__(107)("forEach");module.exports=SLOPPY_METHOD?function forEach(callbackfn){return internalForEach(this,callbackfn,arguments[1])}:nativeForEach},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),__webpack_require__(382),Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"ClientApi",{enumerable:!0,get:function get(){return _client_api.default}}),Object.defineProperty(exports,"defaultDecorateStory",{enumerable:!0,get:function get(){return _client_api.defaultDecorateStory}}),Object.defineProperty(exports,"StoryStore",{enumerable:!0,get:function get(){return _story_store.default}}),Object.defineProperty(exports,"ConfigApi",{enumerable:!0,get:function get(){return _config_api.default}}),Object.defineProperty(exports,"subscriptionsStore",{enumerable:!0,get:function get(){return _subscriptions_store.default}}),Object.defineProperty(exports,"pathToId",{enumerable:!0,get:function get(){return _pathToId.default}}),Object.defineProperty(exports,"getQueryParams",{enumerable:!0,get:function get(){return _queryparams.getQueryParams}}),Object.defineProperty(exports,"getQueryParam",{enumerable:!0,get:function get(){return _queryparams.getQueryParam}});var _client_api=function _interopRequireWildcard(obj){Eif(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)if(Object.prototype.hasOwnProperty.call(obj,key)){var desc=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):{};desc.get||desc.set?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}return newObj.default=obj,newObj}(__webpack_require__(383)),_story_store=_interopRequireDefault(__webpack_require__(500)),_config_api=_interopRequireDefault(__webpack_require__(511)),_subscriptions_store=_interopRequireDefault(__webpack_require__(246)),_pathToId=_interopRequireDefault(__webpack_require__(259)),_queryparams=__webpack_require__(260);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}},function(module,exports,__webpack_require__){"use strict";var internalFind=__webpack_require__(87)(5),SKIPS_HOLES=!0;"find"in[]&&Array(1).find(function(){SKIPS_HOLES=!1}),__webpack_require__(3)({target:"Array",proto:!0,forced:SKIPS_HOLES},{find:function find(callbackfn){return internalFind(this,callbackfn,arguments.length>1?arguments[1]:void 0)}}),__webpack_require__(209)("find")},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4);module.exports=function(iterator,fn,value,ENTRIES){try{return ENTRIES?fn(anObject(value)[0],value[1]):fn(value)}catch(error){var returnMethod=iterator.return;throw void 0!==returnMethod&&anObject(returnMethod.call(iterator)),error}}},function(module,exports,__webpack_require__){var Iterators=__webpack_require__(86),ITERATOR=__webpack_require__(12)("iterator"),ArrayPrototype=Array.prototype;module.exports=function(it){return void 0!==it&&(Iterators.Array===it||ArrayPrototype[ITERATOR]===it)}},function(module,exports,__webpack_require__){var classof=__webpack_require__(204),ITERATOR=__webpack_require__(12)("iterator"),Iterators=__webpack_require__(86);module.exports=function(it){if(null!=it)return it[ITERATOR]||it["@@iterator"]||Iterators[classof(it)]}},function(module,exports,__webpack_require__){var objectKeys=__webpack_require__(72),toIndexedObject=__webpack_require__(40),propertyIsEnumerable=__webpack_require__(83).f;module.exports=function(it,TO_ENTRIES){for(var key,O=toIndexedObject(it),keys=objectKeys(O),length=keys.length,i=0,result=[];length>i;)propertyIsEnumerable.call(O,key=keys[i++])&&result.push(TO_ENTRIES?[key,O[key]]:O[key]);return result}},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(4);module.exports=function(){var that=anObject(this),result="";return that.global&&(result+="g"),that.ignoreCase&&(result+="i"),that.multiline&&(result+="m"),that.unicode&&(result+="u"),that.sticky&&(result+="y"),result}},function(module,exports,__webpack_require__){var toInteger=__webpack_require__(98),requireObjectCoercible=__webpack_require__(39);module.exports=function(that,pos,CONVERT_TO_STRING){var first,second,S=String(requireObjectCoercible(that)),position=toInteger(pos),size=S.length;return position<0||position>=size?CONVERT_TO_STRING?"":void 0:(first=S.charCodeAt(position))<55296||first>56319||position+1===size||(second=S.charCodeAt(position+1))<56320||second>57343?CONVERT_TO_STRING?S.charAt(position):first:CONVERT_TO_STRING?S.slice(position,position+2):second-56320+(first-55296<<10)+65536}},function(module,exports,__webpack_require__){(function(global){function config(name){try{Iif(!global.localStorage)return!1}catch(_){return!1}var val=global.localStorage[name];return null!=val&&"true"===String(val).toLowerCase()}module.exports=function deprecate(fn,msg){Iif(config("noDeprecation"))return fn;var warned=!1;return function deprecated(){if(!warned){if(config("throwDeprecation"))throw new Error(msg);config("traceDeprecation")?console.trace(msg):console.warn(msg),warned=!0}return fn.apply(this,arguments)}}}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";(function(setImmediate){function _toConsumableArray(arr){return function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}}(arr)||function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||"[object Arguments]"===Object.prototype.toString.call(iter))return Array.from(iter)}(arr)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(155),__webpack_require__(22),__webpack_require__(89),__webpack_require__(51),__webpack_require__(27),__webpack_require__(156),__webpack_require__(90),__webpack_require__(6),__webpack_require__(45),__webpack_require__(26),__webpack_require__(91),__webpack_require__(46),__webpack_require__(19),__webpack_require__(35),__webpack_require__(393),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Channel=void 0;var generateRandomId=function generateRandomId(){return Math.random().toString(16).slice(2)},Channel=function(){function Channel(){var _this=this,_ref=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},transport=_ref.transport,_ref$async=_ref.async,async=void 0!==_ref$async&&_ref$async;!function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,Channel),this.isAsync=void 0,this.sender=generateRandomId(),this.events={},this.transport=void 0,this.isAsync=async,transport&&(this.transport=transport,this.transport.setHandler(function(event){return _this.handleEvent(event)}))}return function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Constructor}(Channel,[{key:"addListener",value:function addListener(eventName,listener){this.events[eventName]=this.events[eventName]||[],this.events[eventName].push(listener)}},{key:"addPeerListener",value:function addPeerListener(eventName,listener){var peerListener=listener;peerListener.ignorePeer=!0,this.addListener(eventName,peerListener)}},{key:"emit",value:function emit(eventName){for(var _this2=this,_len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var event={type:eventName,args:args,from:this.sender},options={};args.length>=1&&args[0]&&args[0].options&&(options=args[0].options);var handler=function handler(){_this2.transport&&_this2.transport.send(event,options),_this2.handleEvent(event,!0)};this.isAsync?setImmediate(handler):handler()}},{key:"eventNames",value:function eventNames(){return Object.keys(this.events)}},{key:"listenerCount",value:function listenerCount(eventName){var listeners=this.listeners(eventName);return listeners?listeners.length:0}},{key:"listeners",value:function listeners(eventName){var listeners=this.events[eventName];return listeners||void 0}},{key:"once",value:function once(eventName,listener){var onceListener=this.onceListener(eventName,listener);this.addListener(eventName,onceListener)}},{key:"removeAllListeners",value:function removeAllListeners(eventName){eventName?this.events[eventName]&&delete this.events[eventName]:this.events={}}},{key:"removeListener",value:function removeListener(eventName,listener){var listeners=this.listeners(eventName);listeners&&(this.events[eventName]=listeners.filter(function(l){return l!==listener}))}},{key:"on",value:function on(eventName,listener){this.addListener(eventName,listener)}},{key:"handleEvent",value:function handleEvent(event){var isPeer=arguments.length>1&&void 0!==arguments[1]&&arguments[1],listeners=this.listeners(event.type);listeners&&(isPeer||event.from!==this.sender)&&listeners.forEach(function(fn){return!(isPeer&&fn.ignorePeer)&&fn.apply(void 0,_toConsumableArray(event.args))})}},{key:"onceListener",value:function onceListener(eventName,listener){var _this3=this,onceListener=function onceListener(){return _this3.removeListener(eventName,onceListener),listener.apply(void 0,arguments)};return onceListener}},{key:"hasTransport",get:function get(){return!!this.transport}}]),Channel}();exports.Channel=Channel;var _default=Channel;exports.default=_default}).call(this,__webpack_require__(391).setImmediate)},function(module,exports,__webpack_require__){"use strict";var anObject=__webpack_require__(4),toObject=__webpack_require__(30),toLength=__webpack_require__(24),toInteger=__webpack_require__(98),requireObjectCoercible=__webpack_require__(39),advanceStringIndex=__webpack_require__(159),regExpExec=__webpack_require__(109),max=Math.max,min=Math.min,floor=Math.floor,SUBSTITUTION_SYMBOLS=/\$([$&`']|\d\d?|<[^>]*>)/g,SUBSTITUTION_SYMBOLS_NO_NAMED=/\$([$&`']|\d\d?)/g;__webpack_require__(110)("replace",2,function(REPLACE,nativeReplace,maybeCallNative){return[function replace(searchValue,replaceValue){var O=requireObjectCoercible(this),replacer=null==searchValue?void 0:searchValue[REPLACE];return void 0!==replacer?replacer.call(searchValue,O,replaceValue):nativeReplace.call(String(O),searchValue,replaceValue)},function(regexp,replaceValue){var res=maybeCallNative(nativeReplace,regexp,this,replaceValue);Eif(res.done)return res.value;var rx=anObject(regexp),S=String(this),functionalReplace="function"==typeof replaceValue;functionalReplace||(replaceValue=String(replaceValue));var global=rx.global;if(global){var fullUnicode=rx.unicode;rx.lastIndex=0}for(var results=[];;){var result=regExpExec(rx,S);if(null===result)break;if(results.push(result),!global)break;""===String(result[0])&&(rx.lastIndex=advanceStringIndex(S,toLength(rx.lastIndex),fullUnicode))}for(var it,accumulatedResult="",nextSourcePosition=0,i=0;i<results.length;i++){result=results[i];for(var matched=String(result[0]),position=max(min(toInteger(result.index),S.length),0),captures=[],j=1;j<result.length;j++)captures.push(void 0===(it=result[j])?it:String(it));var namedCaptures=result.groups;if(functionalReplace){var replacerArgs=[matched].concat(captures,position,S);void 0!==namedCaptures&&replacerArgs.push(namedCaptures);var replacement=String(replaceValue.apply(void 0,replacerArgs))}else replacement=getSubstitution(matched,S,position,captures,namedCaptures,replaceValue);position>=nextSourcePosition&&(accumulatedResult+=S.slice(nextSourcePosition,position)+replacement,nextSourcePosition=position+matched.length)}return accumulatedResult+S.slice(nextSourcePosition)}];function getSubstitution(matched,str,position,captures,namedCaptures,replacement){var tailPos=position+matched.length,m=captures.length,symbols=SUBSTITUTION_SYMBOLS_NO_NAMED;return void 0!==namedCaptures&&(namedCaptures=toObject(namedCaptures),symbols=SUBSTITUTION_SYMBOLS),nativeReplace.call(replacement,symbols,function(match,ch){var capture;switch(ch.charAt(0)){case"$":return"$";case"&":return matched;case"`":return str.slice(0,position);case"'":return str.slice(tailPos);case"<":capture=namedCaptures[ch.slice(1,-1)];break;default:var n=+ch;if(0===n)return match;if(n>m){var f=floor(n/10);return 0===f?match:f<=m?void 0===captures[f-1]?ch.charAt(1):captures[f-1]+ch.charAt(1):match}capture=captures[n-1]}return void 0===capture?"":capture})}})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),classof=__webpack_require__(38),MATCH=__webpack_require__(12)("match");module.exports=function(it){var isRegExp;return isObject(it)&&(void 0!==(isRegExp=it[MATCH])?!!isRegExp:"RegExp"==classof(it))}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4),aFunction=__webpack_require__(43),SPECIES=__webpack_require__(12)("species");module.exports=function(O,defaultConstructor){var S,C=anObject(O).constructor;return void 0===C||null==(S=anObject(C)[SPECIES])?defaultConstructor:aFunction(S)}},function(module,exports,__webpack_require__){"use strict";var has=Object.prototype.hasOwnProperty,isArray=Array.isArray,hexTable=function(){for(var array=[],i=0;i<256;++i)array.push("%"+((i<16?"0":"")+i.toString(16)).toUpperCase());return array}(),arrayToObject=function arrayToObject(source,options){for(var obj=options&&options.plainObjects?Object.create(null):{},i=0;i<source.length;++i)void 0!==source[i]&&(obj[i]=source[i]);return obj};module.exports={arrayToObject:arrayToObject,assign:function assignSingleSource(target,source){return Object.keys(source).reduce(function(acc,key){return acc[key]=source[key],acc},target)},combine:function combine(a,b){return[].concat(a,b)},compact:function compact(value){for(var queue=[{obj:{o:value},prop:"o"}],refs=[],i=0;i<queue.length;++i)for(var item=queue[i],obj=item.obj[item.prop],keys=Object.keys(obj),j=0;j<keys.length;++j){var key=keys[j],val=obj[key];"object"==typeof val&&null!==val&&-1===refs.indexOf(val)&&(queue.push({obj:obj,prop:key}),refs.push(val))}return function compactQueue(queue){for(;queue.length>1;){var item=queue.pop(),obj=item.obj[item.prop];if(isArray(obj)){for(var compacted=[],j=0;j<obj.length;++j)void 0!==obj[j]&&compacted.push(obj[j]);item.obj[item.prop]=compacted}}}(queue),value},decode:function(str,decoder,charset){var strWithoutPlus=str.replace(/\+/g," ");if("iso-8859-1"===charset)return strWithoutPlus.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(strWithoutPlus)}catch(e){return strWithoutPlus}},encode:function encode(str,defaultEncoder,charset){if(0===str.length)return str;var string="string"==typeof str?str:String(str);if("iso-8859-1"===charset)return escape(string).replace(/%u[0-9a-f]{4}/gi,function($0){return"%26%23"+parseInt($0.slice(2),16)+"%3B"});for(var out="",i=0;i<string.length;++i){var c=string.charCodeAt(i);45===c||46===c||95===c||126===c||c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122?out+=string.charAt(i):c<128?out+=hexTable[c]:c<2048?out+=hexTable[192|c>>6]+hexTable[128|63&c]:c<55296||c>=57344?out+=hexTable[224|c>>12]+hexTable[128|c>>6&63]+hexTable[128|63&c]:(i+=1,c=65536+((1023&c)<<10|1023&string.charCodeAt(i)),out+=hexTable[240|c>>18]+hexTable[128|c>>12&63]+hexTable[128|c>>6&63]+hexTable[128|63&c])}return out},isBuffer:function isBuffer(obj){return!(!obj||"object"!=typeof obj)&&!!(obj.constructor&&obj.constructor.isBuffer&&obj.constructor.isBuffer(obj))},isRegExp:function isRegExp(obj){return"[object RegExp]"===Object.prototype.toString.call(obj)},merge:function merge(target,source,options){if(!source)return target;if("object"!=typeof source){if(isArray(target))target.push(source);else{if(!target||"object"!=typeof target)return[target,source];(options&&(options.plainObjects||options.allowPrototypes)||!has.call(Object.prototype,source))&&(target[source]=!0)}return target}if(!target||"object"!=typeof target)return[target].concat(source);var mergeTarget=target;return isArray(target)&&!isArray(source)&&(mergeTarget=arrayToObject(target,options)),isArray(target)&&isArray(source)?(source.forEach(function(item,i){if(has.call(target,i)){var targetItem=target[i];targetItem&&"object"==typeof targetItem&&item&&"object"==typeof item?target[i]=merge(targetItem,item,options):target.push(item)}else target[i]=item}),target):Object.keys(source).reduce(function(acc,key){var value=source[key];return has.call(acc,key)?acc[key]=merge(acc[key],value,options):acc[key]=value,acc},mergeTarget)}}},function(module,exports,__webpack_require__){"use strict";var replace=String.prototype.replace,percentTwenties=/%20/g;module.exports={default:"RFC3986",formatters:{RFC1738:function(value){return replace.call(value,percentTwenties,"+")},RFC3986:function(value){return value}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},function(module,exports,__webpack_require__){var ListCache=__webpack_require__(111),stackClear=__webpack_require__(410),stackDelete=__webpack_require__(411),stackGet=__webpack_require__(412),stackHas=__webpack_require__(413),stackSet=__webpack_require__(414);function Stack(entries){var data=this.__data__=new ListCache(entries);this.size=data.size}Stack.prototype.clear=stackClear,Stack.prototype.delete=stackDelete,Stack.prototype.get=stackGet,Stack.prototype.has=stackHas,Stack.prototype.set=stackSet,module.exports=Stack},function(module,exports,__webpack_require__){(function(global){var freeGlobal="object"==typeof global&&global&&global.Object===Object&&global;module.exports=freeGlobal}).call(this,__webpack_require__(18))},function(module,exports){var funcToString=Function.prototype.toString;module.exports=function toSource(func){Eif(null!=func){try{return funcToString.call(func)}catch(e){}try{return func+""}catch(e){}}return""}},function(module,exports,__webpack_require__){var baseAssignValue=__webpack_require__(165),eq=__webpack_require__(94);module.exports=function assignMergeValue(object,key,value){(void 0===value||eq(object[key],value))&&(void 0!==value||key in object)||baseAssignValue(object,key,value)}},function(module,exports,__webpack_require__){var getNative=__webpack_require__(59),defineProperty=function(){try{var func=getNative(Object,"defineProperty");return func({},"",{}),func}catch(e){}}();module.exports=defineProperty},function(module,exports,__webpack_require__){var Uint8Array=__webpack_require__(28).Uint8Array;module.exports=Uint8Array},function(module,exports,__webpack_require__){var getPrototype=__webpack_require__(236)(Object.getPrototypeOf,Object);module.exports=getPrototype},function(module,exports){module.exports=function overArg(func,transform){return function(arg){return func(transform(arg))}}},function(module,exports,__webpack_require__){var baseIsArguments=__webpack_require__(442),isObjectLike=__webpack_require__(60),objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,propertyIsEnumerable=objectProto.propertyIsEnumerable,isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")};module.exports=isArguments},function(module,exports){var MAX_SAFE_INTEGER=9007199254740991;module.exports=function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}},function(module,exports){module.exports=function safeGet(object,key){if(("constructor"!==key||"function"!=typeof object[key])&&"__proto__"!=key)return object[key]}},function(module,exports,__webpack_require__){var arrayLikeKeys=__webpack_require__(241),baseKeysIn=__webpack_require__(453),isArrayLike=__webpack_require__(116);module.exports=function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,!0):baseKeysIn(object)}},function(module,exports,__webpack_require__){var baseTimes=__webpack_require__(452),isArguments=__webpack_require__(237),isArray=__webpack_require__(61),isBuffer=__webpack_require__(167),isIndex=__webpack_require__(242),isTypedArray=__webpack_require__(168),hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function arrayLikeKeys(value,inherited){var isArr=isArray(value),isArg=!isArr&&isArguments(value),isBuff=!isArr&&!isArg&&isBuffer(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),skipIndexes=isArr||isArg||isBuff||isType,result=skipIndexes?baseTimes(value.length,String):[],length=result.length;for(var key in value)!inherited&&!hasOwnProperty.call(value,key)||skipIndexes&&("length"==key||isBuff&&("offset"==key||"parent"==key)||isType&&("buffer"==key||"byteLength"==key||"byteOffset"==key)||isIndex(key,length))||result.push(key);return result}},function(module,exports){var MAX_SAFE_INTEGER=9007199254740991,reIsUint=/^(?:0|[1-9]\d*)$/;module.exports=function isIndex(value,length){var type=typeof value;return!!(length=null==length?MAX_SAFE_INTEGER:length)&&("number"==type||"symbol"!=type&&reIsUint.test(value))&&value>-1&&value%1==0&&value<length}},function(module,exports){module.exports=function identity(value){return value}},function(module,exports,__webpack_require__){var SetCache=__webpack_require__(467),arraySome=__webpack_require__(470),cacheHas=__webpack_require__(471),COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;module.exports=function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength))return!1;var stacked=stack.get(array);if(stacked&&stack.get(other))return stacked==other;var index=-1,result=!0,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:void 0;for(stack.set(array,other),stack.set(other,array);++index<arrLength;){var arrValue=array[index],othValue=other[index];if(customizer)var compared=isPartial?customizer(othValue,arrValue,index,other,array,stack):customizer(arrValue,othValue,index,array,other,stack);if(void 0!==compared){if(compared)continue;result=!1;break}if(seen){if(!arraySome(other,function(othValue,othIndex){if(!cacheHas(seen,othIndex)&&(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack)))return seen.push(othIndex)})){result=!1;break}}else if(arrValue!==othValue&&!equalFunc(arrValue,othValue,bitmask,customizer,stack)){result=!1;break}}return stack.delete(array),stack.delete(other),result}},function(module,exports,__webpack_require__){var baseGet=__webpack_require__(490);module.exports=function get(object,path,defaultValue){var result=null==object?void 0:baseGet(object,path);return void 0===result?defaultValue:result}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(27),__webpack_require__(247),__webpack_require__(6),__webpack_require__(26),__webpack_require__(46),__webpack_require__(19),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.createSubscriptionsStore=void 0;var createSubscriptionsStore=function createSubscriptionsStore(){var subscripions=new Map;return{register:function register(subscribe){var subscription=subscripions.get(subscribe);subscription||(subscription={unsubscribe:subscribe()},subscripions.set(subscribe,subscription)),subscription.used=!0},markAllAsUnused:function markAllAsUnused(){subscripions.forEach(function(subscription){subscription.used=!1})},clearUnused:function clearUnused(){subscripions.forEach(function(subscripion,key){subscripion.used||(subscripion.unsubscribe(),subscripions.delete(key))})}}};exports.createSubscriptionsStore=createSubscriptionsStore;var _default=createSubscriptionsStore();exports.default=_default},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(169)("Map",function(get){return function Map(){return get(this,arguments.length>0?arguments[0]:void 0)}},__webpack_require__(249),!0)},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),setPrototypeOf=__webpack_require__(106);module.exports=function(that,target,C){var P,S=target.constructor;return S!==C&&"function"==typeof S&&(P=S.prototype)!==C.prototype&&isObject(P)&&setPrototypeOf&&setPrototypeOf(that,P),that}},function(module,exports,__webpack_require__){"use strict";var defineProperty=__webpack_require__(15).f,create=__webpack_require__(57),redefineAll=__webpack_require__(119),bind=__webpack_require__(88),anInstance=__webpack_require__(118),iterate=__webpack_require__(96),defineIterator=__webpack_require__(147),setSpecies=__webpack_require__(250),DESCRIPTORS=__webpack_require__(14),fastKey=__webpack_require__(95).fastKey,InternalStateModule=__webpack_require__(50),setInternalState=InternalStateModule.set,internalStateGetterFor=InternalStateModule.getterFor;module.exports={getConstructor:function(wrapper,CONSTRUCTOR_NAME,IS_MAP,ADDER){var C=wrapper(function(that,iterable){anInstance(that,C,CONSTRUCTOR_NAME),setInternalState(that,{type:CONSTRUCTOR_NAME,index:create(null),first:void 0,last:void 0,size:0}),DESCRIPTORS||(that.size=0),null!=iterable&&iterate(iterable,that[ADDER],that,IS_MAP)}),getInternalState=internalStateGetterFor(CONSTRUCTOR_NAME),define=function(that,key,value){var previous,index,state=getInternalState(that),entry=getEntry(that,key);return entry?entry.value=value:(state.last=entry={index:index=fastKey(key,!0),key:key,value:value,previous:previous=state.last,next:void 0,removed:!1},state.first||(state.first=entry),previous&&(previous.next=entry),DESCRIPTORS?state.size++:that.size++,"F"!==index&&(state.index[index]=entry)),that},getEntry=function(that,key){var entry,state=getInternalState(that),index=fastKey(key);if("F"!==index)return state.index[index];for(entry=state.first;entry;entry=entry.next)if(entry.key==key)return entry};return redefineAll(C.prototype,{clear:function clear(){for(var state=getInternalState(this),data=state.index,entry=state.first;entry;)entry.removed=!0,entry.previous&&(entry.previous=entry.previous.next=void 0),delete data[entry.index],entry=entry.next;state.first=state.last=void 0,DESCRIPTORS?state.size=0:this.size=0},delete:function(key){var state=getInternalState(this),entry=getEntry(this,key);if(entry){var next=entry.next,prev=entry.previous;delete state.index[entry.index],entry.removed=!0,prev&&(prev.next=next),next&&(next.previous=prev),state.first==entry&&(state.first=next),state.last==entry&&(state.last=prev),DESCRIPTORS?state.size--:this.size--}return!!entry},forEach:function forEach(callbackfn){for(var entry,state=getInternalState(this),boundFunction=bind(callbackfn,arguments.length>1?arguments[1]:void 0,3);entry=entry?entry.next:state.first;)for(boundFunction(entry.value,entry.key,this);entry&&entry.removed;)entry=entry.previous},has:function has(key){return!!getEntry(this,key)}}),redefineAll(C.prototype,IS_MAP?{get:function get(key){var entry=getEntry(this,key);return entry&&entry.value},set:function set(key,value){return define(this,0===key?0:key,value)}}:{add:function add(value){return define(this,value=0===value?0:value,value)}}),DESCRIPTORS&&defineProperty(C.prototype,"size",{get:function(){return getInternalState(this).size}}),C},setStrong:function(C,CONSTRUCTOR_NAME,IS_MAP){var ITERATOR_NAME=CONSTRUCTOR_NAME+" Iterator",getInternalCollectionState=internalStateGetterFor(CONSTRUCTOR_NAME),getInternalIteratorState=internalStateGetterFor(ITERATOR_NAME);defineIterator(C,CONSTRUCTOR_NAME,function(iterated,kind){setInternalState(this,{type:ITERATOR_NAME,target:iterated,state:getInternalCollectionState(iterated),kind:kind,last:void 0})},function(){for(var state=getInternalIteratorState(this),kind=state.kind,entry=state.last;entry&&entry.removed;)entry=entry.previous;return state.target&&(state.last=entry=entry?entry.next:state.state.first)?"keys"==kind?{value:entry.key,done:!1}:"values"==kind?{value:entry.value,done:!1}:{value:[entry.key,entry.value],done:!1}:(state.target=void 0,{value:void 0,done:!0})},IS_MAP?"entries":"values",!IS_MAP,!0),setSpecies(CONSTRUCTOR_NAME)}}},function(module,exports,__webpack_require__){"use strict";var getBuiltIn=__webpack_require__(251),definePropertyModule=__webpack_require__(15),DESCRIPTORS=__webpack_require__(14),SPECIES=__webpack_require__(12)("species");module.exports=function(CONSTRUCTOR_NAME){var C=getBuiltIn(CONSTRUCTOR_NAME),defineProperty=definePropertyModule.f;DESCRIPTORS&&C&&!C[SPECIES]&&defineProperty(C,SPECIES,{configurable:!0,get:function(){return this}})}},function(module,exports,__webpack_require__){var path=__webpack_require__(85),global=__webpack_require__(7),aFunction=function(variable){return"function"==typeof variable?variable:void 0};module.exports=function(namespace,method){return arguments.length<2?aFunction(path[namespace])||aFunction(global[namespace]):path[namespace]&&path[namespace][method]||global[namespace]&&global[namespace][method]}},function(module,exports,__webpack_require__){"use strict";var internalIndexOf=__webpack_require__(202)(!1),nativeIndexOf=[].indexOf,NEGATIVE_ZERO=!!nativeIndexOf&&1/[1].indexOf(1,-0)<0,SLOPPY_METHOD=__webpack_require__(107)("indexOf");__webpack_require__(3)({target:"Array",proto:!0,forced:NEGATIVE_ZERO||SLOPPY_METHOD},{indexOf:function indexOf(searchElement){return NEGATIVE_ZERO?nativeIndexOf.apply(this,arguments)||0:internalIndexOf(this,searchElement,arguments[1])}})},function(module,exports,__webpack_require__){var DESCRIPTORS=__webpack_require__(14);__webpack_require__(3)({target:"Object",stat:!0,forced:!DESCRIPTORS,sham:!DESCRIPTORS},{defineProperties:__webpack_require__(206)})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),onFreeze=__webpack_require__(95).onFreeze,nativeFreeze=Object.freeze,FREEZING=__webpack_require__(170),FAILS_ON_PRIMITIVES=__webpack_require__(9)(function(){nativeFreeze(1)});__webpack_require__(3)({target:"Object",stat:!0,forced:FAILS_ON_PRIMITIVES,sham:!FREEZING},{freeze:function freeze(it){return nativeFreeze&&isObject(it)?nativeFreeze(onFreeze(it)):it}})},function(module,exports,__webpack_require__){var global=__webpack_require__(7),userAgent=__webpack_require__(171),slice=[].slice,MSIE=/MSIE .\./.test(userAgent),wrap=function(set){return function(fn,time){var boundArgs=arguments.length>2,args=!!boundArgs&&slice.call(arguments,2);return set(boundArgs?function(){("function"==typeof fn?fn:Function(fn)).apply(this,args)}:fn,time)}};__webpack_require__(3)({global:!0,bind:!0,forced:MSIE},{setTimeout:wrap(global.setTimeout),setInterval:wrap(global.setInterval)})},function(module,exports,__webpack_require__){"use strict";var stringify=__webpack_require__(505),parse=__webpack_require__(506),formats=__webpack_require__(258);module.exports={formats:formats,parse:parse,stringify:stringify}},function(module,exports,__webpack_require__){"use strict";var has=Object.prototype.hasOwnProperty,isArray=Array.isArray,hexTable=function(){for(var array=[],i=0;i<256;++i)array.push("%"+((i<16?"0":"")+i.toString(16)).toUpperCase());return array}(),arrayToObject=function arrayToObject(source,options){for(var obj=options&&options.plainObjects?Object.create(null):{},i=0;i<source.length;++i)void 0!==source[i]&&(obj[i]=source[i]);return obj};module.exports={arrayToObject:arrayToObject,assign:function assignSingleSource(target,source){return Object.keys(source).reduce(function(acc,key){return acc[key]=source[key],acc},target)},combine:function combine(a,b){return[].concat(a,b)},compact:function compact(value){for(var queue=[{obj:{o:value},prop:"o"}],refs=[],i=0;i<queue.length;++i)for(var item=queue[i],obj=item.obj[item.prop],keys=Object.keys(obj),j=0;j<keys.length;++j){var key=keys[j],val=obj[key];"object"==typeof val&&null!==val&&-1===refs.indexOf(val)&&(queue.push({obj:obj,prop:key}),refs.push(val))}return function compactQueue(queue){for(;queue.length>1;){var item=queue.pop(),obj=item.obj[item.prop];if(isArray(obj)){for(var compacted=[],j=0;j<obj.length;++j)void 0!==obj[j]&&compacted.push(obj[j]);item.obj[item.prop]=compacted}}}(queue),value},decode:function(str,decoder,charset){var strWithoutPlus=str.replace(/\+/g," ");Iif("iso-8859-1"===charset)return strWithoutPlus.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(strWithoutPlus)}catch(e){return strWithoutPlus}},encode:function encode(str,defaultEncoder,charset){if(0===str.length)return str;var string="string"==typeof str?str:String(str);if("iso-8859-1"===charset)return escape(string).replace(/%u[0-9a-f]{4}/gi,function($0){return"%26%23"+parseInt($0.slice(2),16)+"%3B"});for(var out="",i=0;i<string.length;++i){var c=string.charCodeAt(i);45===c||46===c||95===c||126===c||c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122?out+=string.charAt(i):c<128?out+=hexTable[c]:c<2048?out+=hexTable[192|c>>6]+hexTable[128|63&c]:c<55296||c>=57344?out+=hexTable[224|c>>12]+hexTable[128|c>>6&63]+hexTable[128|63&c]:(i+=1,c=65536+((1023&c)<<10|1023&string.charCodeAt(i)),out+=hexTable[240|c>>18]+hexTable[128|c>>12&63]+hexTable[128|c>>6&63]+hexTable[128|63&c])}return out},isBuffer:function isBuffer(obj){return!(!obj||"object"!=typeof obj)&&!!(obj.constructor&&obj.constructor.isBuffer&&obj.constructor.isBuffer(obj))},isRegExp:function isRegExp(obj){return"[object RegExp]"===Object.prototype.toString.call(obj)},merge:function merge(target,source,options){Iif(!source)return target;Iif("object"!=typeof source){if(isArray(target))target.push(source);else{if(!target||"object"!=typeof target)return[target,source];(options&&(options.plainObjects||options.allowPrototypes)||!has.call(Object.prototype,source))&&(target[source]=!0)}return target}Iif(!target||"object"!=typeof target)return[target].concat(source);var mergeTarget=target;return isArray(target)&&!isArray(source)&&(mergeTarget=arrayToObject(target,options)),isArray(target)&&isArray(source)?(source.forEach(function(item,i){if(has.call(target,i)){var targetItem=target[i];targetItem&&"object"==typeof targetItem&&item&&"object"==typeof item?target[i]=merge(targetItem,item,options):target.push(item)}else target[i]=item}),target):Object.keys(source).reduce(function(acc,key){var value=source[key];return has.call(acc,key)?acc[key]=merge(acc[key],value,options):acc[key]=value,acc},mergeTarget)}}},function(module,exports,__webpack_require__){"use strict";var replace=String.prototype.replace,percentTwenties=/%20/g;module.exports={default:"RFC3986",formatters:{RFC1738:function(value){return replace.call(value,percentTwenties,"+")},RFC3986:function(value){return value}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),__webpack_require__(75),__webpack_require__(158),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function pathToId(path){var match=(path||"").match(/^\/story\/(.+)/);if(!match)throw new Error("Invalid path '".concat(path,"',  must start with '/story/'"));return match[1]}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),__webpack_require__(75),__webpack_require__(160),Object.defineProperty(exports,"__esModule",{value:!0}),exports.getQueryParam=exports.getQueryParams=void 0;var _global=__webpack_require__(20),_qs=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(256));var getQueryParams=function getQueryParams(){return _global.document&&_global.document.location&&_global.document.location.search?_qs.default.parse(_global.document.location.search,{ignoreQueryPrefix:!0}):{}};exports.getQueryParams=getQueryParams;exports.getQueryParam=function getQueryParam(key){return getQueryParams()[key]}},function(module,exports,__webpack_require__){"use strict";var aFunction=__webpack_require__(43),isObject=__webpack_require__(10),arraySlice=[].slice,factories={},construct=function(C,argsLength,args){if(!(argsLength in factories)){for(var list=[],i=0;i<argsLength;i++)list[i]="a["+i+"]";factories[argsLength]=Function("C,a","return new C("+list.join(",")+")")}return factories[argsLength](C,args)};module.exports=Function.bind||function bind(that){var fn=aFunction(this),partArgs=arraySlice.call(arguments,1),boundFunction=function bound(){var args=partArgs.concat(arraySlice.call(arguments));return this instanceof boundFunction?construct(fn,args.length,args):fn.apply(that,args)};return isObject(fn.prototype)&&(boundFunction.prototype=fn.prototype),boundFunction}},function(module,exports,__webpack_require__){"use strict";var Internal,OwnPromiseCapability,PromiseWrapper,PROMISE="Promise",IS_PURE=__webpack_require__(82),global=__webpack_require__(7),$export=__webpack_require__(3),isObject=__webpack_require__(10),aFunction=__webpack_require__(43),anInstance=__webpack_require__(118),classof=__webpack_require__(38),iterate=__webpack_require__(96),checkCorrectnessOfIteration=__webpack_require__(149),speciesConstructor=__webpack_require__(226),task=__webpack_require__(157).set,microtask=__webpack_require__(520),promiseResolve=__webpack_require__(521),hostReportErrors=__webpack_require__(522),newPromiseCapabilityModule=__webpack_require__(263),perform=__webpack_require__(523),userAgent=__webpack_require__(171),SPECIES=__webpack_require__(12)("species"),InternalStateModule=__webpack_require__(50),isForced=__webpack_require__(105),getInternalState=InternalStateModule.get,setInternalState=InternalStateModule.set,getInternalPromiseState=InternalStateModule.getterFor(PROMISE),PromiseConstructor=global.Promise,TypeError=global.TypeError,document=global.document,process=global.process,$fetch=global.fetch,versions=process&&process.versions,v8=versions&&versions.v8||"",newPromiseCapability=newPromiseCapabilityModule.f,newGenericPromiseCapability=newPromiseCapability,IS_NODE="process"==classof(process),DISPATCH_EVENT=!!(document&&document.createEvent&&global.dispatchEvent),FORCED=isForced(PROMISE,function(){var promise=PromiseConstructor.resolve(1),empty=function(){},FakePromise=(promise.constructor={})[SPECIES]=function(exec){exec(empty,empty)};return!((IS_NODE||"function"==typeof PromiseRejectionEvent)&&(!IS_PURE||promise.finally)&&promise.then(empty)instanceof FakePromise&&0!==v8.indexOf("6.6")&&-1===userAgent.indexOf("Chrome/66"))}),INCORRECT_ITERATION=FORCED||!checkCorrectnessOfIteration(function(iterable){PromiseConstructor.all(iterable).catch(function(){})}),isThenable=function(it){var then;return!(!isObject(it)||"function"!=typeof(then=it.then))&&then},notify=function(promise,state,isReject){if(!state.notified){state.notified=!0;var chain=state.reactions;microtask(function(){for(var value=state.value,ok=1==state.state,i=0,run=function(reaction){var result,then,exited,handler=ok?reaction.ok:reaction.fail,resolve=reaction.resolve,reject=reaction.reject,domain=reaction.domain;try{handler?(ok||(2===state.rejection&&onHandleUnhandled(promise,state),state.rejection=1),!0===handler?result=value:(domain&&domain.enter(),result=handler(value),domain&&(domain.exit(),exited=!0)),result===reaction.promise?reject(TypeError("Promise-chain cycle")):(then=isThenable(result))?then.call(result,resolve,reject):resolve(result)):reject(value)}catch(error){domain&&!exited&&domain.exit(),reject(error)}};chain.length>i;)run(chain[i++]);state.reactions=[],state.notified=!1,isReject&&!state.rejection&&onUnhandled(promise,state)})}},dispatchEvent=function(name,promise,reason){var event,handler;DISPATCH_EVENT?((event=document.createEvent("Event")).promise=promise,event.reason=reason,event.initEvent(name,!1,!0),global.dispatchEvent(event)):event={promise:promise,reason:reason},(handler=global["on"+name])?handler(event):"unhandledrejection"===name&&hostReportErrors("Unhandled promise rejection",reason)},onUnhandled=function(promise,state){task.call(global,function(){var result,value=state.value;if(isUnhandled(state)&&(result=perform(function(){IS_NODE?process.emit("unhandledRejection",value,promise):dispatchEvent("unhandledrejection",promise,value)}),state.rejection=IS_NODE||isUnhandled(state)?2:1,result.error))throw result.value})},isUnhandled=function(state){return 1!==state.rejection&&!state.parent},onHandleUnhandled=function(promise,state){task.call(global,function(){IS_NODE?process.emit("rejectionHandled",promise):dispatchEvent("rejectionhandled",promise,state.value)})},bind=function(fn,promise,state,unwrap){return function(value){fn(promise,state,value,unwrap)}},internalReject=function(promise,state,value,unwrap){state.done||(state.done=!0,unwrap&&(state=unwrap),state.value=value,state.state=2,notify(promise,state,!0))},internalResolve=function(promise,state,value,unwrap){if(!state.done){state.done=!0,unwrap&&(state=unwrap);try{if(promise===value)throw TypeError("Promise can't be resolved itself");var then=isThenable(value);then?microtask(function(){var wrapper={done:!1};try{then.call(value,bind(internalResolve,promise,wrapper,state),bind(internalReject,promise,wrapper,state))}catch(error){internalReject(promise,wrapper,error,state)}}):(state.value=value,state.state=1,notify(promise,state,!1))}catch(error){internalReject(promise,{done:!1},error,state)}}};FORCED&&(PromiseConstructor=function Promise(executor){anInstance(this,PromiseConstructor,PROMISE),aFunction(executor),Internal.call(this);var state=getInternalState(this);try{executor(bind(internalResolve,this,state),bind(internalReject,this,state))}catch(error){internalReject(this,state,error)}},(Internal=function Promise(executor){setInternalState(this,{type:PROMISE,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=__webpack_require__(119)(PromiseConstructor.prototype,{then:function then(onFulfilled,onRejected){var state=getInternalPromiseState(this),reaction=newPromiseCapability(speciesConstructor(this,PromiseConstructor));return reaction.ok="function"!=typeof onFulfilled||onFulfilled,reaction.fail="function"==typeof onRejected&&onRejected,reaction.domain=IS_NODE?process.domain:void 0,state.parent=!0,state.reactions.push(reaction),0!=state.state&&notify(this,state,!1),reaction.promise},catch:function(onRejected){return this.then(void 0,onRejected)}}),OwnPromiseCapability=function(){var promise=new Internal,state=getInternalState(promise);this.promise=promise,this.resolve=bind(internalResolve,promise,state),this.reject=bind(internalReject,promise,state)},newPromiseCapabilityModule.f=newPromiseCapability=function(C){return C===PromiseConstructor||C===PromiseWrapper?new OwnPromiseCapability(C):newGenericPromiseCapability(C)},IS_PURE||"function"!=typeof $fetch||$export({global:!0,enumerable:!0,forced:!0},{fetch:function fetch(input){return promiseResolve(PromiseConstructor,$fetch.apply(global,arguments))}})),$export({global:!0,wrap:!0,forced:FORCED},{Promise:PromiseConstructor}),__webpack_require__(56)(PromiseConstructor,PROMISE,!1,!0),__webpack_require__(250)(PROMISE),PromiseWrapper=__webpack_require__(85).Promise,$export({target:PROMISE,stat:!0,forced:FORCED},{reject:function reject(r){var capability=newPromiseCapability(this);return capability.reject.call(void 0,r),capability.promise}}),$export({target:PROMISE,stat:!0,forced:IS_PURE||FORCED},{resolve:function resolve(x){return promiseResolve(IS_PURE&&this===PromiseWrapper?PromiseConstructor:this,x)}}),$export({target:PROMISE,stat:!0,forced:INCORRECT_ITERATION},{all:function all(iterable){var C=this,capability=newPromiseCapability(C),resolve=capability.resolve,reject=capability.reject,result=perform(function(){var values=[],counter=0,remaining=1;iterate(iterable,function(promise){var index=counter++,alreadyCalled=!1;values.push(void 0),remaining++,C.resolve(promise).then(function(value){alreadyCalled||(alreadyCalled=!0,values[index]=value,--remaining||resolve(values))},reject)}),--remaining||resolve(values)});return result.error&&reject(result.value),capability.promise},race:function race(iterable){var C=this,capability=newPromiseCapability(C),reject=capability.reject,result=perform(function(){iterate(iterable,function(promise){C.resolve(promise).then(capability.resolve,reject)})});return result.error&&reject(result.value),capability.promise}})},function(module,exports,__webpack_require__){"use strict";var aFunction=__webpack_require__(43),PromiseCapability=function(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(void 0!==resolve||void 0!==reject)throw TypeError("Bad Promise constructor");resolve=$$resolve,reject=$$reject}),this.resolve=aFunction(resolve),this.reject=aFunction(reject)};module.exports.f=function(C){return new PromiseCapability(C)}},,function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.CYCLIC_KEY=exports.EVENT_ID=exports.PANEL_ID=exports.ADDON_ID=void 0;var ADDON_ID="storybook/actions";exports.ADDON_ID=ADDON_ID;var PANEL_ID="".concat(ADDON_ID,"/panel");exports.PANEL_ID=PANEL_ID;var EVENT_ID="".concat(ADDON_ID,"/action-event");exports.EVENT_ID=EVENT_ID;exports.CYCLIC_KEY="$___storybook.isCyclic"},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(22),__webpack_require__(51),__webpack_require__(27),__webpack_require__(150),__webpack_require__(6),__webpack_require__(152),__webpack_require__(26),__webpack_require__(75),__webpack_require__(46),__webpack_require__(158),__webpack_require__(19),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.withActions=exports.createDecorator=void 0;var lastSubscription,lastArgs,_global=__webpack_require__(20),_lodash=__webpack_require__(572),_addons=__webpack_require__(92),_coreEvents=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(74)),_actions=__webpack_require__(174);function _slicedToArray(arr,i){return function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}(arr)||function _iterableToArrayLimit(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var delegateEventSplitter=/^(\S+)\s*(.*)$/,matchesMethod=null!=_global.Element&&!_global.Element.prototype.matches?"msMatchesSelector":"matches",root=_global.document&&_global.document.getElementById("root"),hasMatchInAncestry=function hasMatchInAncestry(element,selector){if(element[matchesMethod](selector))return!0;var parent=element.parentElement;return!!parent&&hasMatchInAncestry(parent,selector)},createHandlers=function createHandlers(actionsFn){for(var _len=arguments.length,args=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++)args[_key-1]=arguments[_key];var actionsObject=actionsFn.apply(void 0,args);return Object.entries(actionsObject).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],action=_ref2[1],_key$match2=_slicedToArray(key.match(delegateEventSplitter),3),eventName=(_key$match2[0],_key$match2[1]),selector=_key$match2[2];return{eventName:eventName,handler:function handler(e){selector&&!hasMatchInAncestry(e.target,selector)||action(e)}}})},actionsSubscription=function actionsSubscription(){for(var _len2=arguments.length,args=new Array(_len2),_key2=0;_key2<_len2;_key2++)args[_key2]=arguments[_key2];if(!(0,_lodash.isEqual)(args,lastArgs)){lastArgs=args;var handlers=createHandlers.apply(void 0,args);lastSubscription=function lastSubscription(){return handlers.forEach(function(_ref3){var eventName=_ref3.eventName,handler=_ref3.handler;return root.addEventListener(eventName,handler)}),function(){return handlers.forEach(function(_ref4){var eventName=_ref4.eventName,handler=_ref4.handler;return root.removeEventListener(eventName,handler)})}}}return lastSubscription},createDecorator=function createDecorator(actionsFn){return function(){for(var _len3=arguments.length,args=new Array(_len3),_key3=0;_key3<_len3;_key3++)args[_key3]=arguments[_key3];return function(storyFn){return null!=root&&_addons.addons.getChannel().emit(_coreEvents.default.REGISTER_SUBSCRIPTION,actionsSubscription.apply(void 0,[actionsFn].concat(args))),storyFn()}}};exports.createDecorator=createDecorator;var withActions=createDecorator(_actions.actions);exports.withActions=withActions},function(module,exports,__webpack_require__){"use strict";var has=Object.prototype.hasOwnProperty,isArray=Array.isArray,hexTable=function(){for(var array=[],i=0;i<256;++i)array.push("%"+((i<16?"0":"")+i.toString(16)).toUpperCase());return array}(),arrayToObject=function arrayToObject(source,options){for(var obj=options&&options.plainObjects?Object.create(null):{},i=0;i<source.length;++i)void 0!==source[i]&&(obj[i]=source[i]);return obj};module.exports={arrayToObject:arrayToObject,assign:function assignSingleSource(target,source){return Object.keys(source).reduce(function(acc,key){return acc[key]=source[key],acc},target)},combine:function combine(a,b){return[].concat(a,b)},compact:function compact(value){for(var queue=[{obj:{o:value},prop:"o"}],refs=[],i=0;i<queue.length;++i)for(var item=queue[i],obj=item.obj[item.prop],keys=Object.keys(obj),j=0;j<keys.length;++j){var key=keys[j],val=obj[key];"object"==typeof val&&null!==val&&-1===refs.indexOf(val)&&(queue.push({obj:obj,prop:key}),refs.push(val))}return function compactQueue(queue){for(;queue.length>1;){var item=queue.pop(),obj=item.obj[item.prop];if(isArray(obj)){for(var compacted=[],j=0;j<obj.length;++j)void 0!==obj[j]&&compacted.push(obj[j]);item.obj[item.prop]=compacted}}}(queue),value},decode:function(str,decoder,charset){var strWithoutPlus=str.replace(/\+/g," ");if("iso-8859-1"===charset)return strWithoutPlus.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(strWithoutPlus)}catch(e){return strWithoutPlus}},encode:function encode(str,defaultEncoder,charset){if(0===str.length)return str;var string="string"==typeof str?str:String(str);if("iso-8859-1"===charset)return escape(string).replace(/%u[0-9a-f]{4}/gi,function($0){return"%26%23"+parseInt($0.slice(2),16)+"%3B"});for(var out="",i=0;i<string.length;++i){var c=string.charCodeAt(i);45===c||46===c||95===c||126===c||c>=48&&c<=57||c>=65&&c<=90||c>=97&&c<=122?out+=string.charAt(i):c<128?out+=hexTable[c]:c<2048?out+=hexTable[192|c>>6]+hexTable[128|63&c]:c<55296||c>=57344?out+=hexTable[224|c>>12]+hexTable[128|c>>6&63]+hexTable[128|63&c]:(i+=1,c=65536+((1023&c)<<10|1023&string.charCodeAt(i)),out+=hexTable[240|c>>18]+hexTable[128|c>>12&63]+hexTable[128|c>>6&63]+hexTable[128|63&c])}return out},isBuffer:function isBuffer(obj){return!(!obj||"object"!=typeof obj)&&!!(obj.constructor&&obj.constructor.isBuffer&&obj.constructor.isBuffer(obj))},isRegExp:function isRegExp(obj){return"[object RegExp]"===Object.prototype.toString.call(obj)},merge:function merge(target,source,options){if(!source)return target;if("object"!=typeof source){if(isArray(target))target.push(source);else{if(!target||"object"!=typeof target)return[target,source];(options&&(options.plainObjects||options.allowPrototypes)||!has.call(Object.prototype,source))&&(target[source]=!0)}return target}if(!target||"object"!=typeof target)return[target].concat(source);var mergeTarget=target;return isArray(target)&&!isArray(source)&&(mergeTarget=arrayToObject(target,options)),isArray(target)&&isArray(source)?(source.forEach(function(item,i){if(has.call(target,i)){var targetItem=target[i];targetItem&&"object"==typeof targetItem&&item&&"object"==typeof item?target[i]=merge(targetItem,item,options):target.push(item)}else target[i]=item}),target):Object.keys(source).reduce(function(acc,key){var value=source[key];return has.call(acc,key)?acc[key]=merge(acc[key],value,options):acc[key]=value,acc},mergeTarget)}}},function(module,exports,__webpack_require__){"use strict";var replace=String.prototype.replace,percentTwenties=/%20/g;module.exports={default:"RFC3986",formatters:{RFC1738:function(value){return replace.call(value,percentTwenties,"+")},RFC3986:function(value){return value}},RFC1738:"RFC1738",RFC3986:"RFC3986"}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}(),_templateObject=function _taggedTemplateLiteral(strings,raw){return Object.freeze(Object.defineProperties(strings,{raw:{value:Object.freeze(raw)}}))}(["",""],["",""]);var TemplateTag_TemplateTag=function(){function TemplateTag(){for(var _this=this,_len=arguments.length,transformers=Array(_len),_key=0;_key<_len;_key++)transformers[_key]=arguments[_key];return function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,TemplateTag),this.tag=function(strings){for(var _len2=arguments.length,expressions=Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)expressions[_key2-1]=arguments[_key2];return"function"==typeof strings?_this.interimTag.bind(_this,strings):"string"==typeof strings?_this.transformEndResult(strings):(strings=strings.map(_this.transformString.bind(_this)),_this.transformEndResult(strings.reduce(_this.processSubstitutions.bind(_this,expressions))))},transformers.length>0&&Array.isArray(transformers[0])&&(transformers=transformers[0]),this.transformers=transformers.map(function(transformer){return"function"==typeof transformer?transformer():transformer}),this.tag}return _createClass(TemplateTag,[{key:"interimTag",value:function interimTag(previousTag,template){for(var _len3=arguments.length,substitutions=Array(_len3>2?_len3-2:0),_key3=2;_key3<_len3;_key3++)substitutions[_key3-2]=arguments[_key3];return this.tag(_templateObject,previousTag.apply(void 0,[template].concat(substitutions)))}},{key:"processSubstitutions",value:function processSubstitutions(substitutions,resultSoFar,remainingPart){var substitution=this.transformSubstitution(substitutions.shift(),resultSoFar);return"".concat(resultSoFar,substitution,remainingPart)}},{key:"transformString",value:function transformString(str){return this.transformers.reduce(function cb(res,transform){return transform.onString?transform.onString(res):res},str)}},{key:"transformSubstitution",value:function transformSubstitution(substitution,resultSoFar){return this.transformers.reduce(function cb(res,transform){return transform.onSubstitution?transform.onSubstitution(res,resultSoFar):res},substitution)}},{key:"transformEndResult",value:function transformEndResult(endResult){return this.transformers.reduce(function cb(res,transform){return transform.onEndResult?transform.onEndResult(res):res},endResult)}}]),TemplateTag}(),trimResultTransformer_trimResultTransformer=function trimResultTransformer(){var side=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return{onEndResult:function onEndResult(endResult){if(""===side)return endResult.trim();if("start"===(side=side.toLowerCase())||"left"===side)return endResult.replace(/^\s*/,"");if("end"===side||"right"===side)return endResult.replace(/\s*$/,"");throw new Error("Side not supported: "+side)}}};function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}return Array.from(arr)}var stripIndentTransformer_stripIndentTransformer=function stripIndentTransformer(){var type=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"initial";return{onEndResult:function onEndResult(endResult){if("initial"===type){var match=endResult.match(/^[^\S\n]*(?=\S)/gm),indent=match&&Math.min.apply(Math,_toConsumableArray(match.map(function(el){return el.length})));if(indent){var regexp=new RegExp("^.{"+indent+"}","gm");return endResult.replace(regexp,"")}return endResult}if("all"===type)return endResult.replace(/^[^\S\n]+/gm,"");throw new Error("Unknown type: "+type)}}},replaceResultTransformer_replaceResultTransformer=function replaceResultTransformer(replaceWhat,replaceWith){return{onEndResult:function onEndResult(endResult){if(null==replaceWhat||null==replaceWith)throw new Error("replaceResultTransformer requires at least 2 arguments.");return endResult.replace(replaceWhat,replaceWith)}}},replaceSubstitutionTransformer_replaceSubstitutionTransformer=function replaceSubstitutionTransformer(replaceWhat,replaceWith){return{onSubstitution:function onSubstitution(substitution,resultSoFar){if(null==replaceWhat||null==replaceWith)throw new Error("replaceSubstitutionTransformer requires at least 2 arguments.");return null==substitution?substitution:substitution.toString().replace(replaceWhat,replaceWith)}}},replaceStringTransformer_replaceStringTransformer=function replaceStringTransformer(replaceWhat,replaceWith){return{onString:function onString(str){if(null==replaceWhat||null==replaceWith)throw new Error("replaceStringTransformer requires at least 2 arguments.");return str.replace(replaceWhat,replaceWith)}}},defaults={separator:"",conjunction:"",serial:!1},inlineArrayTransformer_inlineArrayTransformer=function inlineArrayTransformer(){var opts=arguments.length>0&&void 0!==arguments[0]?arguments[0]:defaults;return{onSubstitution:function onSubstitution(substitution,resultSoFar){if(Array.isArray(substitution)){var arrayLength=substitution.length,separator=opts.separator,conjunction=opts.conjunction,serial=opts.serial,indent=resultSoFar.match(/(\n?[^\S\n]+)$/);if(substitution=indent?substitution.join(separator+indent[1]):substitution.join(separator+" "),conjunction&&arrayLength>1){var separatorIndex=substitution.lastIndexOf(separator);substitution=substitution.slice(0,separatorIndex)+(serial?separator:"")+" "+conjunction+substitution.slice(separatorIndex+1)}}return substitution}}},splitStringTransformer_splitStringTransformer=function splitStringTransformer(splitBy){return{onSubstitution:function onSubstitution(substitution,resultSoFar){if(null==splitBy||"string"!=typeof splitBy)throw new Error("You need to specify a string character to split by.");return"string"==typeof substitution&&substitution.includes(splitBy)&&(substitution=substitution.split(splitBy)),substitution}}},isValidValue=function isValidValue(x){return null!=x&&!Number.isNaN(x)&&"boolean"!=typeof x},removeNonPrintingValuesTransformer_removeNonPrintingValuesTransformer=function removeNonPrintingValuesTransformer(){return{onSubstitution:function onSubstitution(substitution){return Array.isArray(substitution)?substitution.filter(isValidValue):isValidValue(substitution)?substitution:""}}},commaLists_commaLists=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:","}),stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),commaListsAnd_commaListsAnd=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:",",conjunction:"and"}),stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),commaListsOr_commaListsOr=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:",",conjunction:"or"}),stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),html_html=new TemplateTag_TemplateTag(splitStringTransformer_splitStringTransformer("\n"),removeNonPrintingValuesTransformer_removeNonPrintingValuesTransformer,inlineArrayTransformer_inlineArrayTransformer,stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),safeHtml_safeHtml=new TemplateTag_TemplateTag(splitStringTransformer_splitStringTransformer("\n"),inlineArrayTransformer_inlineArrayTransformer,stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer,replaceSubstitutionTransformer_replaceSubstitutionTransformer(/&/g,"&amp;"),replaceSubstitutionTransformer_replaceSubstitutionTransformer(/</g,"&lt;"),replaceSubstitutionTransformer_replaceSubstitutionTransformer(/>/g,"&gt;"),replaceSubstitutionTransformer_replaceSubstitutionTransformer(/"/g,"&quot;"),replaceSubstitutionTransformer_replaceSubstitutionTransformer(/'/g,"&#x27;"),replaceSubstitutionTransformer_replaceSubstitutionTransformer(/`/g,"&#x60;")),oneLine_oneLine=new TemplateTag_TemplateTag(replaceResultTransformer_replaceResultTransformer(/(?:\n(?:\s*))+/g," "),trimResultTransformer_trimResultTransformer),oneLineTrim_oneLineTrim=new TemplateTag_TemplateTag(replaceResultTransformer_replaceResultTransformer(/(?:\n\s*)/g,""),trimResultTransformer_trimResultTransformer),oneLineCommaLists_oneLineCommaLists=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:","}),replaceResultTransformer_replaceResultTransformer(/(?:\s+)/g," "),trimResultTransformer_trimResultTransformer),oneLineCommaListsOr_oneLineCommaListsOr=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:",",conjunction:"or"}),replaceResultTransformer_replaceResultTransformer(/(?:\s+)/g," "),trimResultTransformer_trimResultTransformer),oneLineCommaListsAnd_oneLineCommaListsAnd=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer({separator:",",conjunction:"and"}),replaceResultTransformer_replaceResultTransformer(/(?:\s+)/g," "),trimResultTransformer_trimResultTransformer),inlineLists_inlineLists=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer,stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),oneLineInlineLists_oneLineInlineLists=new TemplateTag_TemplateTag(inlineArrayTransformer_inlineArrayTransformer,replaceResultTransformer_replaceResultTransformer(/(?:\s+)/g," "),trimResultTransformer_trimResultTransformer),stripIndent_stripIndent=new TemplateTag_TemplateTag(stripIndentTransformer_stripIndentTransformer,trimResultTransformer_trimResultTransformer),stripIndents_stripIndents=new TemplateTag_TemplateTag(stripIndentTransformer_stripIndentTransformer("all"),trimResultTransformer_trimResultTransformer);__webpack_require__.d(__webpack_exports__,"TemplateTag",function(){return TemplateTag_TemplateTag}),__webpack_require__.d(__webpack_exports__,"trimResultTransformer",function(){return trimResultTransformer_trimResultTransformer}),__webpack_require__.d(__webpack_exports__,"stripIndentTransformer",function(){return stripIndentTransformer_stripIndentTransformer}),__webpack_require__.d(__webpack_exports__,"replaceResultTransformer",function(){return replaceResultTransformer_replaceResultTransformer}),__webpack_require__.d(__webpack_exports__,"replaceSubstitutionTransformer",function(){return replaceSubstitutionTransformer_replaceSubstitutionTransformer}),__webpack_require__.d(__webpack_exports__,"replaceStringTransformer",function(){return replaceStringTransformer_replaceStringTransformer}),__webpack_require__.d(__webpack_exports__,"inlineArrayTransformer",function(){return inlineArrayTransformer_inlineArrayTransformer}),__webpack_require__.d(__webpack_exports__,"splitStringTransformer",function(){return splitStringTransformer_splitStringTransformer}),__webpack_require__.d(__webpack_exports__,"removeNonPrintingValuesTransformer",function(){return removeNonPrintingValuesTransformer_removeNonPrintingValuesTransformer}),__webpack_require__.d(__webpack_exports__,"commaLists",function(){return commaLists_commaLists}),__webpack_require__.d(__webpack_exports__,"commaListsAnd",function(){return commaListsAnd_commaListsAnd}),__webpack_require__.d(__webpack_exports__,"commaListsOr",function(){return commaListsOr_commaListsOr}),__webpack_require__.d(__webpack_exports__,"html",function(){return html_html}),__webpack_require__.d(__webpack_exports__,"codeBlock",function(){return html_html}),__webpack_require__.d(__webpack_exports__,"source",function(){return html_html}),__webpack_require__.d(__webpack_exports__,"safeHtml",function(){return safeHtml_safeHtml}),__webpack_require__.d(__webpack_exports__,"oneLine",function(){return oneLine_oneLine}),__webpack_require__.d(__webpack_exports__,"oneLineTrim",function(){return oneLineTrim_oneLineTrim}),__webpack_require__.d(__webpack_exports__,"oneLineCommaLists",function(){return oneLineCommaLists_oneLineCommaLists}),__webpack_require__.d(__webpack_exports__,"oneLineCommaListsOr",function(){return oneLineCommaListsOr_oneLineCommaListsOr}),__webpack_require__.d(__webpack_exports__,"oneLineCommaListsAnd",function(){return oneLineCommaListsAnd_oneLineCommaListsAnd}),__webpack_require__.d(__webpack_exports__,"inlineLists",function(){return inlineLists_inlineLists}),__webpack_require__.d(__webpack_exports__,"oneLineInlineLists",function(){return oneLineInlineLists_oneLineInlineLists}),__webpack_require__.d(__webpack_exports__,"stripIndent",function(){return stripIndent_stripIndent}),__webpack_require__.d(__webpack_exports__,"stripIndents",function(){return stripIndents_stripIndents})},function(module,exports,__webpack_require__){"use strict";(function(module){__webpack_require__(22),__webpack_require__(6),__webpack_require__(45),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0});var _constants=__webpack_require__(265);Object.keys(_constants).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _constants[key]}})});var _models=__webpack_require__(561);Object.keys(_models).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _models[key]}})});var _preview=__webpack_require__(567);Object.keys(_preview).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _preview[key]}})}),module&&module.hot&&module.hot.decline&&module.hot.decline()}).call(this,__webpack_require__(58)(module))},function(module,exports,__webpack_require__){"use strict";(function(module){__webpack_require__(156),__webpack_require__(253),__webpack_require__(6),__webpack_require__(254),Object.defineProperty(exports,"__esModule",{value:!0}),exports.LinkTo=function LinkTo(){hasWarned||(console.error((0,_commonTags.stripIndents)(_templateObject())),hasWarned=!0);return null},Object.defineProperty(exports,"linkTo",{enumerable:!0,get:function get(){return _preview.linkTo}}),Object.defineProperty(exports,"hrefTo",{enumerable:!0,get:function get(){return _preview.hrefTo}}),Object.defineProperty(exports,"withLinks",{enumerable:!0,get:function get(){return _preview.withLinks}});var _commonTags=__webpack_require__(269),_preview=__webpack_require__(573);function _templateObject(){var data=function _taggedTemplateLiteral(strings,raw){raw||(raw=strings.slice(0));return Object.freeze(Object.defineProperties(strings,{raw:{value:Object.freeze(raw)}}))}(["\n      LinkTo has moved to addon-links/react:\n      import LinkTo from '@storybook/addon-links/react';\n    "]);return _templateObject=function _templateObject(){return data},data}var hasWarned=!1;module&&module.hot&&module.hot.decline&&module.hot.decline()}).call(this,__webpack_require__(58)(module))},,function(module,__webpack_exports__,__webpack_require__){"use strict";var Observable=__webpack_require__(5),isPromise=__webpack_require__(128),isArrayLike=__webpack_require__(126),symbol_observable=__webpack_require__(36);var symbol_iterator=__webpack_require__(52);var fromArray=__webpack_require__(65),Subscription=__webpack_require__(11),subscribeToPromise=__webpack_require__(129);var subscribeToIterable=__webpack_require__(130);var subscribeToObservable=__webpack_require__(125);var subscribeTo=__webpack_require__(124);function from(input,scheduler){if(!scheduler)return input instanceof Observable.a?input:new Observable.a(Object(subscribeTo.a)(input));if(null!=input){if(function isInteropObservable(input){return input&&"function"==typeof input[symbol_observable.a]}(input))return function fromObservable(input,scheduler){return scheduler?new Observable.a(function(subscriber){var sub=new Subscription.a;return sub.add(scheduler.schedule(function(){var observable=input[symbol_observable.a]();sub.add(observable.subscribe({next:function(value){sub.add(scheduler.schedule(function(){return subscriber.next(value)}))},error:function(err){sub.add(scheduler.schedule(function(){return subscriber.error(err)}))},complete:function(){sub.add(scheduler.schedule(function(){return subscriber.complete()}))}}))})),sub}):new Observable.a(Object(subscribeToObservable.a)(input))}(input,scheduler);if(Object(isPromise.a)(input))return function fromPromise(input,scheduler){return scheduler?new Observable.a(function(subscriber){var sub=new Subscription.a;return sub.add(scheduler.schedule(function(){return input.then(function(value){sub.add(scheduler.schedule(function(){subscriber.next(value),sub.add(scheduler.schedule(function(){return subscriber.complete()}))}))},function(err){sub.add(scheduler.schedule(function(){return subscriber.error(err)}))})})),sub}):new Observable.a(Object(subscribeToPromise.a)(input))}(input,scheduler);if(Object(isArrayLike.a)(input))return Object(fromArray.a)(input,scheduler);if(function isIterable(input){return input&&"function"==typeof input[symbol_iterator.a]}(input)||"string"==typeof input)return function fromIterable(input,scheduler){if(!input)throw new Error("Iterable cannot be null");return scheduler?new Observable.a(function(subscriber){var iterator,sub=new Subscription.a;return sub.add(function(){iterator&&"function"==typeof iterator.return&&iterator.return()}),sub.add(scheduler.schedule(function(){iterator=input[symbol_iterator.a](),sub.add(scheduler.schedule(function(){if(!subscriber.closed){var value,done;try{var result=iterator.next();value=result.value,done=result.done}catch(err){return void subscriber.error(err)}done?subscriber.complete():(subscriber.next(value),this.schedule())}}))})),sub}):new Observable.a(Object(subscribeToIterable.a)(input))}(input,scheduler)}throw new TypeError((null!==input&&typeof input||input)+" is not observable")}__webpack_require__.d(__webpack_exports__,"a",function(){return from})},,function(module,exports,__webpack_require__){"use strict";__webpack_require__(276),__webpack_require__(277),__webpack_require__(354)},function(module,exports){!function(global){"use strict";var undefined,Op=Object.prototype,hasOwn=Op.hasOwnProperty,$Symbol="function"==typeof Symbol?Symbol:{},iteratorSymbol=$Symbol.iterator||"@@iterator",asyncIteratorSymbol=$Symbol.asyncIterator||"@@asyncIterator",toStringTagSymbol=$Symbol.toStringTag||"@@toStringTag",inModule="object"==typeof module,runtime=global.regeneratorRuntime;Iif(runtime)inModule&&(module.exports=runtime);else{(runtime=global.regeneratorRuntime=inModule?module.exports:{}).wrap=wrap;var GenStateSuspendedStart="suspendedStart",GenStateSuspendedYield="suspendedYield",GenStateExecuting="executing",GenStateCompleted="completed",ContinueSentinel={},IteratorPrototype={};IteratorPrototype[iteratorSymbol]=function(){return this};var getProto=Object.getPrototypeOf,NativeIteratorPrototype=getProto&&getProto(getProto(values([])));NativeIteratorPrototype&&NativeIteratorPrototype!==Op&&hasOwn.call(NativeIteratorPrototype,iteratorSymbol)&&(IteratorPrototype=NativeIteratorPrototype);var Gp=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(IteratorPrototype);GeneratorFunction.prototype=Gp.constructor=GeneratorFunctionPrototype,GeneratorFunctionPrototype.constructor=GeneratorFunction,GeneratorFunctionPrototype[toStringTagSymbol]=GeneratorFunction.displayName="GeneratorFunction",runtime.isGeneratorFunction=function(genFun){var ctor="function"==typeof genFun&&genFun.constructor;return!!ctor&&(ctor===GeneratorFunction||"GeneratorFunction"===(ctor.displayName||ctor.name))},runtime.mark=function(genFun){return Object.setPrototypeOf?Object.setPrototypeOf(genFun,GeneratorFunctionPrototype):(genFun.__proto__=GeneratorFunctionPrototype,toStringTagSymbol in genFun||(genFun[toStringTagSymbol]="GeneratorFunction")),genFun.prototype=Object.create(Gp),genFun},runtime.awrap=function(arg){return{__await:arg}},defineIteratorMethods(AsyncIterator.prototype),AsyncIterator.prototype[asyncIteratorSymbol]=function(){return this},runtime.AsyncIterator=AsyncIterator,runtime.async=function(innerFn,outerFn,self,tryLocsList){var iter=new AsyncIterator(wrap(innerFn,outerFn,self,tryLocsList));return runtime.isGeneratorFunction(outerFn)?iter:iter.next().then(function(result){return result.done?result.value:iter.next()})},defineIteratorMethods(Gp),Gp[toStringTagSymbol]="Generator",Gp[iteratorSymbol]=function(){return this},Gp.toString=function(){return"[object Generator]"},runtime.keys=function(object){var keys=[];for(var key in object)keys.push(key);return keys.reverse(),function next(){for(;keys.length;){var key=keys.pop();if(key in object)return next.value=key,next.done=!1,next}return next.done=!0,next}},runtime.values=values,Context.prototype={constructor:Context,reset:function(skipTempReset){if(this.prev=0,this.next=0,this.sent=this._sent=undefined,this.done=!1,this.delegate=null,this.method="next",this.arg=undefined,this.tryEntries.forEach(resetTryEntry),!skipTempReset)for(var name in this)"t"===name.charAt(0)&&hasOwn.call(this,name)&&!isNaN(+name.slice(1))&&(this[name]=undefined)},stop:function(){this.done=!0;var rootRecord=this.tryEntries[0].completion;if("throw"===rootRecord.type)throw rootRecord.arg;return this.rval},dispatchException:function(exception){if(this.done)throw exception;var context=this;function handle(loc,caught){return record.type="throw",record.arg=exception,context.next=loc,caught&&(context.method="next",context.arg=undefined),!!caught}for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i],record=entry.completion;if("root"===entry.tryLoc)return handle("end");if(entry.tryLoc<=this.prev){var hasCatch=hasOwn.call(entry,"catchLoc"),hasFinally=hasOwn.call(entry,"finallyLoc");if(hasCatch&&hasFinally){if(this.prev<entry.catchLoc)return handle(entry.catchLoc,!0);if(this.prev<entry.finallyLoc)return handle(entry.finallyLoc)}else if(hasCatch){if(this.prev<entry.catchLoc)return handle(entry.catchLoc,!0)}else{if(!hasFinally)throw new Error("try statement without catch or finally");if(this.prev<entry.finallyLoc)return handle(entry.finallyLoc)}}}},abrupt:function(type,arg){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev<entry.finallyLoc){var finallyEntry=entry;break}}finallyEntry&&("break"===type||"continue"===type)&&finallyEntry.tryLoc<=arg&&arg<=finallyEntry.finallyLoc&&(finallyEntry=null);var record=finallyEntry?finallyEntry.completion:{};return record.type=type,record.arg=arg,finallyEntry?(this.method="next",this.next=finallyEntry.finallyLoc,ContinueSentinel):this.complete(record)},complete:function(record,afterLoc){if("throw"===record.type)throw record.arg;return"break"===record.type||"continue"===record.type?this.next=record.arg:"return"===record.type?(this.rval=this.arg=record.arg,this.method="return",this.next="end"):"normal"===record.type&&afterLoc&&(this.next=afterLoc),ContinueSentinel},finish:function(finallyLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.finallyLoc===finallyLoc)return this.complete(entry.completion,entry.afterLoc),resetTryEntry(entry),ContinueSentinel}},catch:function(tryLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc===tryLoc){var record=entry.completion;if("throw"===record.type){var thrown=record.arg;resetTryEntry(entry)}return thrown}}throw new Error("illegal catch attempt")},delegateYield:function(iterable,resultName,nextLoc){return this.delegate={iterator:values(iterable),resultName:resultName,nextLoc:nextLoc},"next"===this.method&&(this.arg=undefined),ContinueSentinel}}}function wrap(innerFn,outerFn,self,tryLocsList){var protoGenerator=outerFn&&outerFn.prototype instanceof Generator?outerFn:Generator,generator=Object.create(protoGenerator.prototype),context=new Context(tryLocsList||[]);return generator._invoke=function makeInvokeMethod(innerFn,self,context){var state=GenStateSuspendedStart;return function invoke(method,arg){if(state===GenStateExecuting)throw new Error("Generator is already running");if(state===GenStateCompleted){if("throw"===method)throw arg;return doneResult()}for(context.method=method,context.arg=arg;;){var delegate=context.delegate;if(delegate){var delegateResult=maybeInvokeDelegate(delegate,context);if(delegateResult){if(delegateResult===ContinueSentinel)continue;return delegateResult}}if("next"===context.method)context.sent=context._sent=context.arg;else if("throw"===context.method){if(state===GenStateSuspendedStart)throw state=GenStateCompleted,context.arg;context.dispatchException(context.arg)}else"return"===context.method&&context.abrupt("return",context.arg);state=GenStateExecuting;var record=tryCatch(innerFn,self,context);if("normal"===record.type){if(state=context.done?GenStateCompleted:GenStateSuspendedYield,record.arg===ContinueSentinel)continue;return{value:record.arg,done:context.done}}"throw"===record.type&&(state=GenStateCompleted,context.method="throw",context.arg=record.arg)}}}(innerFn,self,context),generator}function tryCatch(fn,obj,arg){try{return{type:"normal",arg:fn.call(obj,arg)}}catch(err){return{type:"throw",arg:err}}}function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}function defineIteratorMethods(prototype){["next","throw","return"].forEach(function(method){prototype[method]=function(arg){return this._invoke(method,arg)}})}function AsyncIterator(generator){var previousPromise;this._invoke=function enqueue(method,arg){function callInvokeWithMethodAndArg(){return new Promise(function(resolve,reject){!function invoke(method,arg,resolve,reject){var record=tryCatch(generator[method],generator,arg);if("throw"!==record.type){var result=record.arg,value=result.value;return value&&"object"==typeof value&&hasOwn.call(value,"__await")?Promise.resolve(value.__await).then(function(value){invoke("next",value,resolve,reject)},function(err){invoke("throw",err,resolve,reject)}):Promise.resolve(value).then(function(unwrapped){result.value=unwrapped,resolve(result)},function(error){return invoke("throw",error,resolve,reject)})}reject(record.arg)}(method,arg,resolve,reject)})}return previousPromise=previousPromise?previousPromise.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}}function maybeInvokeDelegate(delegate,context){var method=delegate.iterator[context.method];if(method===undefined){if(context.delegate=null,"throw"===context.method){if(delegate.iterator.return&&(context.method="return",context.arg=undefined,maybeInvokeDelegate(delegate,context),"throw"===context.method))return ContinueSentinel;context.method="throw",context.arg=new TypeError("The iterator does not provide a 'throw' method")}return ContinueSentinel}var record=tryCatch(method,delegate.iterator,context.arg);if("throw"===record.type)return context.method="throw",context.arg=record.arg,context.delegate=null,ContinueSentinel;var info=record.arg;return info?info.done?(context[delegate.resultName]=info.value,context.next=delegate.nextLoc,"return"!==context.method&&(context.method="next",context.arg=undefined),context.delegate=null,ContinueSentinel):info:(context.method="throw",context.arg=new TypeError("iterator result is not an object"),context.delegate=null,ContinueSentinel)}function pushTryEntry(locs){var entry={tryLoc:locs[0]};1 in locs&&(entry.catchLoc=locs[1]),2 in locs&&(entry.finallyLoc=locs[2],entry.afterLoc=locs[3]),this.tryEntries.push(entry)}function resetTryEntry(entry){var record=entry.completion||{};record.type="normal",delete record.arg,entry.completion=record}function Context(tryLocsList){this.tryEntries=[{tryLoc:"root"}],tryLocsList.forEach(pushTryEntry,this),this.reset(!0)}function values(iterable){Eif(iterable){var iteratorMethod=iterable[iteratorSymbol];Eif(iteratorMethod)return iteratorMethod.call(iterable);if("function"==typeof iterable.next)return iterable;if(!isNaN(iterable.length)){var i=-1,next=function next(){for(;++i<iterable.length;)if(hasOwn.call(iterable,i))return next.value=iterable[i],next.done=!1,next;return next.value=undefined,next.done=!0,next};return next.next=next}}return{next:doneResult}}function doneResult(){return{value:undefined,done:!0}}}(function(){return this||"object"==typeof self&&self}()||Function("return this")())},function(module,exports,__webpack_require__){"use strict";__webpack_require__(278)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(279),__webpack_require__(280),__webpack_require__(281)},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__;
/*!
 * https://github.com/es-shims/es5-shim
 * @license es5-shim Copyright 2009-2015 by contributors, MIT License
 * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
 */!function(root,factory){"use strict";void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=function(){var isRegex,isString,$Array=Array,ArrayPrototype=$Array.prototype,$Object=Object,ObjectPrototype=$Object.prototype,$Function=Function,FunctionPrototype=$Function.prototype,$String=String,StringPrototype=$String.prototype,$Number=Number,NumberPrototype=$Number.prototype,array_slice=ArrayPrototype.slice,array_splice=ArrayPrototype.splice,array_push=ArrayPrototype.push,array_unshift=ArrayPrototype.unshift,array_concat=ArrayPrototype.concat,array_join=ArrayPrototype.join,call=FunctionPrototype.call,apply=FunctionPrototype.apply,max=Math.max,min=Math.min,to_string=ObjectPrototype.toString,hasToStringTag="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag,fnToStr=Function.prototype.toString,constructorRegex=/^\s*class /,isES6ClassFn=function isES6ClassFn(value){try{var spaceStripped=fnToStr.call(value).replace(/\/\/.*\n/g,"").replace(/\/\*[.\s\S]*\*\//g,"").replace(/\n/gm," ").replace(/ {2}/g," ");return constructorRegex.test(spaceStripped)}catch(e){return!1}},tryFunctionObject=function tryFunctionObject(value){try{return!isES6ClassFn(value)&&(fnToStr.call(value),!0)}catch(e){return!1}},fnClass="[object Function]",genClass="[object GeneratorFunction]",isCallable=function isCallable(value){if(!value)return!1;Iif("function"!=typeof value&&"object"!=typeof value)return!1;Eif(hasToStringTag)return tryFunctionObject(value);if(isES6ClassFn(value))return!1;var strClass=to_string.call(value);return strClass===fnClass||strClass===genClass},regexExec=RegExp.prototype.exec,tryRegexExec=function tryRegexExec(value){try{return regexExec.call(value),!0}catch(e){return!1}},regexClass="[object RegExp]";isRegex=function isRegex(value){return"object"==typeof value&&(hasToStringTag?tryRegexExec(value):to_string.call(value)===regexClass)};var strValue=String.prototype.valueOf,tryStringObject=function tryStringObject(value){try{return strValue.call(value),!0}catch(e){return!1}},stringClass="[object String]";isString=function isString(value){return"string"==typeof value||"object"==typeof value&&(hasToStringTag?tryStringObject(value):to_string.call(value)===stringClass)};var supportsDescriptors=$Object.defineProperty&&function(){try{var obj={};for(var _ in $Object.defineProperty(obj,"x",{enumerable:!1,value:obj}),obj)return!1;return obj.x===obj}catch(e){return!1}}(),defineProperties=(has=ObjectPrototype.hasOwnProperty,defineProperty=supportsDescriptors?function(object,name,method,forceAssign){!forceAssign&&name in object||$Object.defineProperty(object,name,{configurable:!0,enumerable:!1,writable:!0,value:method})}:function(object,name,method,forceAssign){!forceAssign&&name in object||(object[name]=method)},function defineProperties(object,map,forceAssign){for(var name in map)has.call(map,name)&&defineProperty(object,name,map[name],forceAssign)}),isPrimitive=function isPrimitive(input){var type=typeof input;return null===input||"object"!==type&&"function"!==type},isActualNaN=$Number.isNaN||function isActualNaN(x){return x!=x},ES={ToInteger:function ToInteger(num){var n=+num;return isActualNaN(n)?n=0:0!==n&&n!==1/0&&n!==-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n},ToPrimitive:function ToPrimitive(input){var val,valueOf,toStr;if(isPrimitive(input))return input;if(valueOf=input.valueOf,isCallable(valueOf)&&(val=valueOf.call(input),isPrimitive(val)))return val;if(toStr=input.toString,isCallable(toStr)&&(val=toStr.call(input),isPrimitive(val)))return val;throw new TypeError},ToObject:function(o){if(null==o)throw new TypeError("can't convert "+o+" to object");return $Object(o)},ToUint32:function ToUint32(x){return x>>>0}},Empty=function Empty(){};var has,defineProperty;defineProperties(FunctionPrototype,{bind:function bind(that){var target=this;if(!isCallable(target))throw new TypeError("Function.prototype.bind called on incompatible "+target);for(var bound,args=array_slice.call(arguments,1),binder=function(){if(this instanceof bound){var result=apply.call(target,this,array_concat.call(args,array_slice.call(arguments)));return $Object(result)===result?result:this}return apply.call(target,that,array_concat.call(args,array_slice.call(arguments)))},boundLength=max(0,target.length-args.length),boundArgs=[],i=0;i<boundLength;i++)array_push.call(boundArgs,"$"+i);return bound=$Function("binder","return function ("+array_join.call(boundArgs,",")+"){ return binder.apply(this, arguments); }")(binder),target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound}});var owns=call.bind(ObjectPrototype.hasOwnProperty),toStr=call.bind(ObjectPrototype.toString),arraySlice=call.bind(array_slice),arraySliceApply=apply.bind(array_slice);Eif("object"==typeof document&&document&&document.documentElement)try{arraySlice(document.documentElement.childNodes)}catch(e){var origArraySlice=arraySlice,origArraySliceApply=arraySliceApply;arraySlice=function arraySliceIE(arr){for(var r=[],i=arr.length;i-- >0;)r[i]=arr[i];return origArraySliceApply(r,origArraySlice(arguments,1))},arraySliceApply=function arraySliceApplyIE(arr,args){return origArraySliceApply(arraySlice(arr),args)}}var strSlice=call.bind(StringPrototype.slice),strSplit=call.bind(StringPrototype.split),strIndexOf=call.bind(StringPrototype.indexOf),pushCall=call.bind(array_push),isEnum=call.bind(ObjectPrototype.propertyIsEnumerable),arraySort=call.bind(ArrayPrototype.sort),isArray=$Array.isArray||function isArray(obj){return"[object Array]"===toStr(obj)},hasUnshiftReturnValueBug=1!==[].unshift(0);defineProperties(ArrayPrototype,{unshift:function(){return array_unshift.apply(this,arguments),this.length}},hasUnshiftReturnValueBug),defineProperties($Array,{isArray:isArray});var boxedString=$Object("a"),splitString="a"!==boxedString[0]||!(0 in boxedString),properlyBoxesContext=function properlyBoxed(method){var properlyBoxesNonStrict=!0,properlyBoxesStrict=!0,threwException=!1;Eif(method)try{method.call("foo",function(_,__,context){"object"!=typeof context&&(properlyBoxesNonStrict=!1)}),method.call([1],function(){properlyBoxesStrict="string"==typeof this},"x")}catch(e){threwException=!0}return!!method&&!threwException&&properlyBoxesNonStrict&&properlyBoxesStrict};defineProperties(ArrayPrototype,{forEach:function forEach(callbackfn){var T,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,i=-1,length=ES.ToUint32(self.length);if(arguments.length>1&&(T=arguments[1]),!isCallable(callbackfn))throw new TypeError("Array.prototype.forEach callback must be a function");for(;++i<length;)i in self&&(void 0===T?callbackfn(self[i],i,object):callbackfn.call(T,self[i],i,object))}},!properlyBoxesContext(ArrayPrototype.forEach)),defineProperties(ArrayPrototype,{map:function map(callbackfn){var T,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length),result=$Array(length);if(arguments.length>1&&(T=arguments[1]),!isCallable(callbackfn))throw new TypeError("Array.prototype.map callback must be a function");for(var i=0;i<length;i++)i in self&&(result[i]=void 0===T?callbackfn(self[i],i,object):callbackfn.call(T,self[i],i,object));return result}},!properlyBoxesContext(ArrayPrototype.map)),defineProperties(ArrayPrototype,{filter:function filter(callbackfn){var value,T,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length),result=[];if(arguments.length>1&&(T=arguments[1]),!isCallable(callbackfn))throw new TypeError("Array.prototype.filter callback must be a function");for(var i=0;i<length;i++)i in self&&(value=self[i],(void 0===T?callbackfn(value,i,object):callbackfn.call(T,value,i,object))&&pushCall(result,value));return result}},!properlyBoxesContext(ArrayPrototype.filter)),defineProperties(ArrayPrototype,{every:function every(callbackfn){var T,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length);if(arguments.length>1&&(T=arguments[1]),!isCallable(callbackfn))throw new TypeError("Array.prototype.every callback must be a function");for(var i=0;i<length;i++)if(i in self&&!(void 0===T?callbackfn(self[i],i,object):callbackfn.call(T,self[i],i,object)))return!1;return!0}},!properlyBoxesContext(ArrayPrototype.every)),defineProperties(ArrayPrototype,{some:function some(callbackfn){var T,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length);if(arguments.length>1&&(T=arguments[1]),!isCallable(callbackfn))throw new TypeError("Array.prototype.some callback must be a function");for(var i=0;i<length;i++)if(i in self&&(void 0===T?callbackfn(self[i],i,object):callbackfn.call(T,self[i],i,object)))return!0;return!1}},!properlyBoxesContext(ArrayPrototype.some));var reduceCoercesToObject=!1;ArrayPrototype.reduce&&(reduceCoercesToObject="object"==typeof ArrayPrototype.reduce.call("es5",function(_,__,___,list){return list}));defineProperties(ArrayPrototype,{reduce:function reduce(callbackfn){var object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length);if(!isCallable(callbackfn))throw new TypeError("Array.prototype.reduce callback must be a function");if(0===length&&1===arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;i<length;i++)i in self&&(result=callbackfn(result,self[i],i,object));return result}},!reduceCoercesToObject);var reduceRightCoercesToObject=!1;ArrayPrototype.reduceRight&&(reduceRightCoercesToObject="object"==typeof ArrayPrototype.reduceRight.call("es5",function(_,__,___,list){return list}));defineProperties(ArrayPrototype,{reduceRight:function reduceRight(callbackfn){var result,object=ES.ToObject(this),self=splitString&&isString(this)?strSplit(this,""):object,length=ES.ToUint32(self.length);if(!isCallable(callbackfn))throw new TypeError("Array.prototype.reduceRight callback must be a function");if(0===length&&1===arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(--i<0)throw new TypeError("reduceRight of empty array with no initial value")}if(i<0)return result;do{i in self&&(result=callbackfn(result,self[i],i,object))}while(i--);return result}},!reduceRightCoercesToObject);var hasFirefox2IndexOfBug=ArrayPrototype.indexOf&&-1!==[0,1].indexOf(1,2);defineProperties(ArrayPrototype,{indexOf:function indexOf(searchElement){var self=splitString&&isString(this)?strSplit(this,""):ES.ToObject(this),length=ES.ToUint32(self.length);if(0===length)return-1;var i=0;for(arguments.length>1&&(i=ES.ToInteger(arguments[1])),i=i>=0?i:max(0,length+i);i<length;i++)if(i in self&&self[i]===searchElement)return i;return-1}},hasFirefox2IndexOfBug);var hasFirefox2LastIndexOfBug=ArrayPrototype.lastIndexOf&&-1!==[0,1].lastIndexOf(0,-3);defineProperties(ArrayPrototype,{lastIndexOf:function lastIndexOf(searchElement){var self=splitString&&isString(this)?strSplit(this,""):ES.ToObject(this),length=ES.ToUint32(self.length);if(0===length)return-1;var i=length-1;for(arguments.length>1&&(i=min(i,ES.ToInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&searchElement===self[i])return i;return-1}},hasFirefox2LastIndexOfBug);var spliceNoopReturnsEmptyArray=(a=[1,2],result=a.splice(),2===a.length&&isArray(result)&&0===result.length);var a,result;defineProperties(ArrayPrototype,{splice:function splice(start,deleteCount){return 0===arguments.length?[]:array_splice.apply(this,arguments)}},!spliceNoopReturnsEmptyArray);var spliceWorksWithEmptyObject=(obj={},ArrayPrototype.splice.call(obj,0,0,1),1===obj.length);var obj;defineProperties(ArrayPrototype,{splice:function splice(start,deleteCount){if(0===arguments.length)return[];var args=arguments;return this.length=max(ES.ToInteger(this.length),0),arguments.length>0&&"number"!=typeof deleteCount&&((args=arraySlice(arguments)).length<2?pushCall(args,this.length-start):args[1]=ES.ToInteger(deleteCount)),array_splice.apply(this,args)}},!spliceWorksWithEmptyObject);var spliceWorksWithLargeSparseArrays=(arr=new $Array(1e5),arr[8]="x",arr.splice(1,1),7===arr.indexOf("x")),spliceWorksWithSmallSparseArrays=function(){var arr=[];return arr[256]="a",arr.splice(257,0,"b"),"a"===arr[256]}();var arr;defineProperties(ArrayPrototype,{splice:function splice(start,deleteCount){for(var from,O=ES.ToObject(this),A=[],len=ES.ToUint32(O.length),relativeStart=ES.ToInteger(start),actualStart=relativeStart<0?max(len+relativeStart,0):min(relativeStart,len),actualDeleteCount=min(max(ES.ToInteger(deleteCount),0),len-actualStart),k=0;k<actualDeleteCount;)from=$String(actualStart+k),owns(O,from)&&(A[k]=O[from]),k+=1;var to,items=arraySlice(arguments,2),itemCount=items.length;if(itemCount<actualDeleteCount){k=actualStart;for(var maxK=len-actualDeleteCount;k<maxK;)from=$String(k+actualDeleteCount),to=$String(k+itemCount),owns(O,from)?O[to]=O[from]:delete O[to],k+=1;k=len;for(var minK=len-actualDeleteCount+itemCount;k>minK;)delete O[k-1],k-=1}else if(itemCount>actualDeleteCount)for(k=len-actualDeleteCount;k>actualStart;)from=$String(k+actualDeleteCount-1),to=$String(k+itemCount-1),owns(O,from)?O[to]=O[from]:delete O[to],k-=1;k=actualStart;for(var i=0;i<items.length;++i)O[k]=items[i],k+=1;return O.length=len-actualDeleteCount+itemCount,A}},!spliceWorksWithLargeSparseArrays||!spliceWorksWithSmallSparseArrays);var hasStringJoinBug,originalJoin=ArrayPrototype.join;try{hasStringJoinBug="1,2,3"!==Array.prototype.join.call("123",",")}catch(e){hasStringJoinBug=!0}hasStringJoinBug&&defineProperties(ArrayPrototype,{join:function join(separator){var sep=void 0===separator?",":separator;return originalJoin.call(isString(this)?strSplit(this,""):this,sep)}},hasStringJoinBug);var hasJoinUndefinedBug="1,2"!==[1,2].join(void 0);hasJoinUndefinedBug&&defineProperties(ArrayPrototype,{join:function join(separator){var sep=void 0===separator?",":separator;return originalJoin.call(this,sep)}},hasJoinUndefinedBug);var pushShim=function push(item){for(var O=ES.ToObject(this),n=ES.ToUint32(O.length),i=0;i<arguments.length;)O[n+i]=arguments[i],i+=1;return O.length=n+i,n+i},pushIsNotGeneric=function(){var obj={};return 1!==Array.prototype.push.call(obj,void 0)||1!==obj.length||void 0!==obj[0]||!owns(obj,0)}();defineProperties(ArrayPrototype,{push:function push(item){return isArray(this)?array_push.apply(this,arguments):pushShim.apply(this,arguments)}},pushIsNotGeneric);var pushUndefinedIsWeird=function(){var arr=[];return 1!==arr.push(void 0)||1!==arr.length||void 0!==arr[0]||!owns(arr,0)}();defineProperties(ArrayPrototype,{push:pushShim},pushUndefinedIsWeird),defineProperties(ArrayPrototype,{slice:function(start,end){var arr=isString(this)?strSplit(this,""):this;return arraySliceApply(arr,arguments)}},splitString);var sortIgnoresNonFunctions=function(){try{[1,2].sort(null)}catch(e){try{[1,2].sort({})}catch(e2){return!1}}return!0}(),sortThrowsOnRegex=function(){try{return[1,2].sort(/a/),!1}catch(e){}return!0}(),sortIgnoresUndefined=function(){try{return[1,2].sort(void 0),!0}catch(e){}return!1}();defineProperties(ArrayPrototype,{sort:function sort(compareFn){if(void 0===compareFn)return arraySort(this);if(!isCallable(compareFn))throw new TypeError("Array.prototype.sort callback must be a function");return arraySort(this,compareFn)}},sortIgnoresNonFunctions||!sortIgnoresUndefined||!sortThrowsOnRegex);var hasDontEnumBug=!isEnum({toString:null},"toString"),hasProtoEnumBug=isEnum(function(){},"prototype"),hasStringEnumBug=!owns("x","0"),equalsConstructorPrototype=function(o){var ctor=o.constructor;return ctor&&ctor.prototype===o},excludedKeys={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0,$width:!0,$height:!0,$top:!0,$localStorage:!0},hasAutomationEqualityBug=function(){Iif("undefined"==typeof window)return!1;for(var k in window)try{!excludedKeys["$"+k]&&owns(window,k)&&null!==window[k]&&"object"==typeof window[k]&&equalsConstructorPrototype(window[k])}catch(e){return!0}return!1}(),equalsConstructorPrototypeIfNotBuggy=function(object){if("undefined"==typeof window||!hasAutomationEqualityBug)return equalsConstructorPrototype(object);try{return equalsConstructorPrototype(object)}catch(e){return!1}},dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length,isStandardArguments=function isArguments(value){return"[object Arguments]"===toStr(value)},isLegacyArguments=function isArguments(value){return null!==value&&"object"==typeof value&&"number"==typeof value.length&&value.length>=0&&!isArray(value)&&isCallable(value.callee)},isArguments=isStandardArguments(arguments)?isStandardArguments:isLegacyArguments;defineProperties($Object,{keys:function keys(object){var isFn=isCallable(object),isArgs=isArguments(object),isObject=null!==object&&"object"==typeof object,isStr=isObject&&isString(object);if(!isObject&&!isFn&&!isArgs)throw new TypeError("Object.keys called on a non-object");var theKeys=[],skipProto=hasProtoEnumBug&&isFn;if(isStr&&hasStringEnumBug||isArgs)for(var i=0;i<object.length;++i)pushCall(theKeys,$String(i));if(!isArgs)for(var name in object)skipProto&&"prototype"===name||!owns(object,name)||pushCall(theKeys,$String(name));if(hasDontEnumBug)for(var skipConstructor=equalsConstructorPrototypeIfNotBuggy(object),j=0;j<dontEnumsLength;j++){var dontEnum=dontEnums[j];skipConstructor&&"constructor"===dontEnum||!owns(object,dontEnum)||pushCall(theKeys,dontEnum)}return theKeys}});var keysWorksWithArguments=$Object.keys&&function(){return 2===$Object.keys(arguments).length}(1,2),keysHasArgumentsLengthBug=$Object.keys&&function(){var argKeys=$Object.keys(arguments);return 1!==arguments.length||1!==argKeys.length||1!==argKeys[0]}(1),originalKeys=$Object.keys;defineProperties($Object,{keys:function keys(object){return isArguments(object)?originalKeys(arraySlice(object)):originalKeys(object)}},!keysWorksWithArguments||keysHasArgumentsLengthBug);var hasToDateStringFormatBug,hasToStringFormatBug,hasNegativeMonthYearBug=0!==new Date(-0xc782b5b342b24).getUTCMonth(),aNegativeTestDate=new Date(-0x55d318d56a724),aPositiveTestDate=new Date(14496624e5),hasToUTCStringFormatBug="Mon, 01 Jan -45875 11:59:59 GMT"!==aNegativeTestDate.toUTCString(),timeZoneOffset=aNegativeTestDate.getTimezoneOffset();timeZoneOffset<-720?(hasToDateStringFormatBug="Tue Jan 02 -45875"!==aNegativeTestDate.toDateString(),hasToStringFormatBug=!/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-+]\d\d\d\d(?: |$)/.test(String(aPositiveTestDate))):(hasToDateStringFormatBug="Mon Jan 01 -45875"!==aNegativeTestDate.toDateString(),hasToStringFormatBug=!/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-+]\d\d\d\d(?: |$)/.test(String(aPositiveTestDate)));var originalGetFullYear=call.bind(Date.prototype.getFullYear),originalGetMonth=call.bind(Date.prototype.getMonth),originalGetDate=call.bind(Date.prototype.getDate),originalGetUTCFullYear=call.bind(Date.prototype.getUTCFullYear),originalGetUTCMonth=call.bind(Date.prototype.getUTCMonth),originalGetUTCDate=call.bind(Date.prototype.getUTCDate),originalGetUTCDay=call.bind(Date.prototype.getUTCDay),originalGetUTCHours=call.bind(Date.prototype.getUTCHours),originalGetUTCMinutes=call.bind(Date.prototype.getUTCMinutes),originalGetUTCSeconds=call.bind(Date.prototype.getUTCSeconds),originalGetUTCMilliseconds=call.bind(Date.prototype.getUTCMilliseconds),dayName=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],monthName=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],daysInMonth=function daysInMonth(month,year){return originalGetDate(new Date(year,month,0))};defineProperties(Date.prototype,{getFullYear:function getFullYear(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetFullYear(this);return year<0&&originalGetMonth(this)>11?year+1:year},getMonth:function getMonth(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetFullYear(this),month=originalGetMonth(this);return year<0&&month>11?0:month},getDate:function getDate(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetFullYear(this),month=originalGetMonth(this),date=originalGetDate(this);return year<0&&month>11?12===month?date:daysInMonth(0,year+1)-date+1:date},getUTCFullYear:function getUTCFullYear(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetUTCFullYear(this);return year<0&&originalGetUTCMonth(this)>11?year+1:year},getUTCMonth:function getUTCMonth(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetUTCFullYear(this),month=originalGetUTCMonth(this);return year<0&&month>11?0:month},getUTCDate:function getUTCDate(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var year=originalGetUTCFullYear(this),month=originalGetUTCMonth(this),date=originalGetUTCDate(this);return year<0&&month>11?12===month?date:daysInMonth(0,year+1)-date+1:date}},hasNegativeMonthYearBug),defineProperties(Date.prototype,{toUTCString:function toUTCString(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var day=originalGetUTCDay(this),date=originalGetUTCDate(this),month=originalGetUTCMonth(this),year=originalGetUTCFullYear(this),hour=originalGetUTCHours(this),minute=originalGetUTCMinutes(this),second=originalGetUTCSeconds(this);return dayName[day]+", "+(date<10?"0"+date:date)+" "+monthName[month]+" "+year+" "+(hour<10?"0"+hour:hour)+":"+(minute<10?"0"+minute:minute)+":"+(second<10?"0"+second:second)+" GMT"}},hasNegativeMonthYearBug||hasToUTCStringFormatBug),defineProperties(Date.prototype,{toDateString:function toDateString(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var day=this.getDay(),date=this.getDate(),month=this.getMonth(),year=this.getFullYear();return dayName[day]+" "+monthName[month]+" "+(date<10?"0"+date:date)+" "+year}},hasNegativeMonthYearBug||hasToDateStringFormatBug),(hasNegativeMonthYearBug||hasToStringFormatBug)&&(Date.prototype.toString=function toString(){if(!(this&&this instanceof Date))throw new TypeError("this is not a Date object.");var day=this.getDay(),date=this.getDate(),month=this.getMonth(),year=this.getFullYear(),hour=this.getHours(),minute=this.getMinutes(),second=this.getSeconds(),timezoneOffset=this.getTimezoneOffset(),hoursOffset=Math.floor(Math.abs(timezoneOffset)/60),minutesOffset=Math.floor(Math.abs(timezoneOffset)%60);return dayName[day]+" "+monthName[month]+" "+(date<10?"0"+date:date)+" "+year+" "+(hour<10?"0"+hour:hour)+":"+(minute<10?"0"+minute:minute)+":"+(second<10?"0"+second:second)+" GMT"+(timezoneOffset>0?"-":"+")+(hoursOffset<10?"0"+hoursOffset:hoursOffset)+(minutesOffset<10?"0"+minutesOffset:minutesOffset)},supportsDescriptors&&$Object.defineProperty(Date.prototype,"toString",{configurable:!0,enumerable:!1,writable:!0}));var negativeDate=-621987552e5,negativeYearString="-000001",hasNegativeDateBug=Date.prototype.toISOString&&-1===new Date(negativeDate).toISOString().indexOf(negativeYearString),hasSafari51DateBug=Date.prototype.toISOString&&"1969-12-31T23:59:59.999Z"!==new Date(-1).toISOString(),getTime=call.bind(Date.prototype.getTime);defineProperties(Date.prototype,{toISOString:function toISOString(){if(!isFinite(this)||!isFinite(getTime(this)))throw new RangeError("Date.prototype.toISOString called on non-finite value.");var year=originalGetUTCFullYear(this),month=originalGetUTCMonth(this);year+=Math.floor(month/12);var result=[(month=(month%12+12)%12)+1,originalGetUTCDate(this),originalGetUTCHours(this),originalGetUTCMinutes(this),originalGetUTCSeconds(this)];year=(year<0?"-":year>9999?"+":"")+strSlice("00000"+Math.abs(year),0<=year&&year<=9999?-4:-6);for(var i=0;i<result.length;++i)result[i]=strSlice("00"+result[i],-2);return year+"-"+arraySlice(result,0,2).join("-")+"T"+arraySlice(result,2).join(":")+"."+strSlice("000"+originalGetUTCMilliseconds(this),-3)+"Z"}},hasNegativeDateBug||hasSafari51DateBug);var dateToJSONIsSupported=function(){try{return Date.prototype.toJSON&&null===new Date(NaN).toJSON()&&-1!==new Date(negativeDate).toJSON().indexOf(negativeYearString)&&Date.prototype.toJSON.call({toISOString:function(){return!0}})}catch(e){return!1}}();dateToJSONIsSupported||(Date.prototype.toJSON=function toJSON(key){var O=$Object(this),tv=ES.ToPrimitive(O);if("number"==typeof tv&&!isFinite(tv))return null;var toISO=O.toISOString;if(!isCallable(toISO))throw new TypeError("toISOString property is not callable");return toISO.call(O)});var supportsExtendedYears=1e15===Date.parse("+033658-09-27T01:46:40.000Z"),acceptsInvalidDates=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z")),doesNotParseY2KNewYear=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));Eif(doesNotParseY2KNewYear||acceptsInvalidDates||!supportsExtendedYears){var maxSafeUnsigned32Bit=Math.pow(2,31)-1,hasSafariSignedIntBug=isActualNaN(new Date(1970,0,1,0,0,0,maxSafeUnsigned32Bit+1).getTime());Date=function(NativeDate){var DateShim=function Date(Y,M,D,h,m,s,ms){var date,length=arguments.length;Eif(this instanceof NativeDate){var seconds=s,millis=ms;Iif(hasSafariSignedIntBug&&length>=7&&ms>maxSafeUnsigned32Bit){var msToShift=Math.floor(ms/maxSafeUnsigned32Bit)*maxSafeUnsigned32Bit,sToShift=Math.floor(msToShift/1e3);seconds+=sToShift,millis-=1e3*sToShift}date=1===length&&$String(Y)===Y?new NativeDate(DateShim.parse(Y)):length>=7?new NativeDate(Y,M,D,h,m,seconds,millis):length>=6?new NativeDate(Y,M,D,h,m,seconds):length>=5?new NativeDate(Y,M,D,h,m):length>=4?new NativeDate(Y,M,D,h):length>=3?new NativeDate(Y,M,D):length>=2?new NativeDate(Y,M):length>=1?new NativeDate(Y instanceof NativeDate?+Y:Y):new NativeDate}else date=NativeDate.apply(this,arguments);return isPrimitive(date)||defineProperties(date,{constructor:DateShim},!0),date},isoDateExpression=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:(\\.\\d{1,}))?)?(Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$"),months=[0,31,59,90,120,151,181,212,243,273,304,334,365],dayFromMonth=function dayFromMonth(year,month){var t=month>1?1:0;return months[month]+Math.floor((year-1969+t)/4)-Math.floor((year-1901+t)/100)+Math.floor((year-1601+t)/400)+365*(year-1970)},toUTC=function toUTC(t){var s=0,ms=t;if(hasSafariSignedIntBug&&ms>maxSafeUnsigned32Bit){var msToShift=Math.floor(ms/maxSafeUnsigned32Bit)*maxSafeUnsigned32Bit,sToShift=Math.floor(msToShift/1e3);s+=sToShift,ms-=1e3*sToShift}return $Number(new NativeDate(1970,0,1,0,0,s,ms))};for(var key in NativeDate)owns(NativeDate,key)&&(DateShim[key]=NativeDate[key]);defineProperties(DateShim,{now:NativeDate.now,UTC:NativeDate.UTC},!0),DateShim.prototype=NativeDate.prototype,defineProperties(DateShim.prototype,{constructor:DateShim},!0);return defineProperties(DateShim,{parse:function parse(string){var match=isoDateExpression.exec(string);if(match){var result,year=$Number(match[1]),month=$Number(match[2]||1)-1,day=$Number(match[3]||1)-1,hour=$Number(match[4]||0),minute=$Number(match[5]||0),second=$Number(match[6]||0),millisecond=Math.floor(1e3*$Number(match[7]||0)),isLocalTime=Boolean(match[4]&&!match[8]),signOffset="-"===match[9]?1:-1,hourOffset=$Number(match[10]||0),minuteOffset=$Number(match[11]||0),hasMinutesOrSecondsOrMilliseconds=minute>0||second>0||millisecond>0;return hour<(hasMinutesOrSecondsOrMilliseconds?24:25)&&minute<60&&second<60&&millisecond<1e3&&month>-1&&month<12&&hourOffset<24&&minuteOffset<60&&day>-1&&day<dayFromMonth(year,month+1)-dayFromMonth(year,month)&&(result=1e3*(60*((result=60*(24*(dayFromMonth(year,month)+day)+hour+hourOffset*signOffset))+minute+minuteOffset*signOffset)+second)+millisecond,isLocalTime&&(result=toUTC(result)),-864e13<=result&&result<=864e13)?result:NaN}return NativeDate.parse.apply(this,arguments)}}),DateShim}(Date)}Date.now||(Date.now=function now(){return(new Date).getTime()});var hasToFixedBugs=NumberPrototype.toFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0)),toFixedHelpers={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function multiply(n,c){for(var i=-1,c2=c;++i<toFixedHelpers.size;)c2+=n*toFixedHelpers.data[i],toFixedHelpers.data[i]=c2%toFixedHelpers.base,c2=Math.floor(c2/toFixedHelpers.base)},divide:function divide(n){for(var i=toFixedHelpers.size,c=0;--i>=0;)c+=toFixedHelpers.data[i],toFixedHelpers.data[i]=Math.floor(c/n),c=c%n*toFixedHelpers.base},numToString:function numToString(){for(var i=toFixedHelpers.size,s="";--i>=0;)if(""!==s||0===i||0!==toFixedHelpers.data[i]){var t=$String(toFixedHelpers.data[i]);""===s?s=t:s+=strSlice("0000000",0,7-t.length)+t}return s},pow:function pow(x,n,acc){return 0===n?acc:n%2==1?pow(x,n-1,acc*x):pow(x*x,n/2,acc)},log:function log(x){for(var n=0,x2=x;x2>=4096;)n+=12,x2/=4096;for(;x2>=2;)n+=1,x2/=2;return n}},toFixedShim=function toFixed(fractionDigits){var f,x,s,m,e,z,j,k;if(f=$Number(fractionDigits),(f=isActualNaN(f)?0:Math.floor(f))<0||f>20)throw new RangeError("Number.toFixed called with invalid number of decimals");if(x=$Number(this),isActualNaN(x))return"NaN";if(x<=-1e21||x>=1e21)return $String(x);if(s="",x<0&&(s="-",x=-x),m="0",x>1e-21)if(z=(e=toFixedHelpers.log(x*toFixedHelpers.pow(2,69,1))-69)<0?x*toFixedHelpers.pow(2,-e,1):x/toFixedHelpers.pow(2,e,1),z*=4503599627370496,(e=52-e)>0){for(toFixedHelpers.multiply(0,z),j=f;j>=7;)toFixedHelpers.multiply(1e7,0),j-=7;for(toFixedHelpers.multiply(toFixedHelpers.pow(10,j,1),0),j=e-1;j>=23;)toFixedHelpers.divide(1<<23),j-=23;toFixedHelpers.divide(1<<j),toFixedHelpers.multiply(1,1),toFixedHelpers.divide(2),m=toFixedHelpers.numToString()}else toFixedHelpers.multiply(0,z),toFixedHelpers.multiply(1<<-e,0),m=toFixedHelpers.numToString()+strSlice("0.00000000000000000000",2,2+f);return m=f>0?(k=m.length)<=f?s+strSlice("0.0000000000000000000",0,f-k+2)+m:s+strSlice(m,0,k-f)+"."+strSlice(m,k-f):s+m};defineProperties(NumberPrototype,{toFixed:toFixedShim},hasToFixedBugs);var hasToPrecisionUndefinedBug=function(){try{return"1"===1..toPrecision(void 0)}catch(e){return!0}}(),originalToPrecision=NumberPrototype.toPrecision;defineProperties(NumberPrototype,{toPrecision:function toPrecision(precision){return void 0===precision?originalToPrecision.call(this):originalToPrecision.call(this,precision)}},hasToPrecisionUndefinedBug),2!=="ab".split(/(?:ab)*/).length||4!==".".split(/(.?)(.?)/).length||"t"==="tesst".split(/(s)*/)[1]||4!=="test".split(/(?:)/,-1).length||"".split(/.?/).length||".".split(/()()/).length>1?(compliantExecNpcg=void 0===/()??/.exec("")[1],maxSafe32BitInt=Math.pow(2,32)-1,StringPrototype.split=function(separator,limit){var string=String(this);if(void 0===separator&&0===limit)return[];if(!isRegex(separator))return strSplit(this,separator,limit);var separator2,match,lastIndex,lastLength,output=[],flags=(separator.ignoreCase?"i":"")+(separator.multiline?"m":"")+(separator.unicode?"u":"")+(separator.sticky?"y":""),lastLastIndex=0,separatorCopy=new RegExp(separator.source,flags+"g");compliantExecNpcg||(separator2=new RegExp("^"+separatorCopy.source+"$(?!\\s)",flags));var splitLimit=void 0===limit?maxSafe32BitInt:ES.ToUint32(limit);for(match=separatorCopy.exec(string);match&&!((lastIndex=match.index+match[0].length)>lastLastIndex&&(pushCall(output,strSlice(string,lastLastIndex,match.index)),!compliantExecNpcg&&match.length>1&&match[0].replace(separator2,function(){for(var i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(match[i]=void 0)}),match.length>1&&match.index<string.length&&array_push.apply(output,arraySlice(match,1)),lastLength=match[0].length,lastLastIndex=lastIndex,output.length>=splitLimit));)separatorCopy.lastIndex===match.index&&separatorCopy.lastIndex++,match=separatorCopy.exec(string);return lastLastIndex===string.length?!lastLength&&separatorCopy.test("")||pushCall(output,""):pushCall(output,strSlice(string,lastLastIndex)),output.length>splitLimit?arraySlice(output,0,splitLimit):output}):"0".split(void 0,0).length&&(StringPrototype.split=function split(separator,limit){return void 0===separator&&0===limit?[]:strSplit(this,separator,limit)});var compliantExecNpcg,maxSafe32BitInt;var str_replace=StringPrototype.replace,replaceReportsGroupsCorrectly=(groups=[],"x".replace(/x(.)?/g,function(match,group){pushCall(groups,group)}),1===groups.length&&void 0===groups[0]);var groups;replaceReportsGroupsCorrectly||(StringPrototype.replace=function replace(searchValue,replaceValue){var isFn=isCallable(replaceValue),hasCapturingGroups=isRegex(searchValue)&&/\)[*?]/.test(searchValue.source);if(isFn&&hasCapturingGroups){return str_replace.call(this,searchValue,function(match){var length=arguments.length,originalLastIndex=searchValue.lastIndex;searchValue.lastIndex=0;var args=searchValue.exec(match)||[];return searchValue.lastIndex=originalLastIndex,pushCall(args,arguments[length-2],arguments[length-1]),replaceValue.apply(this,args)})}return str_replace.call(this,searchValue,replaceValue)});var string_substr=StringPrototype.substr,hasNegativeSubstrBug="".substr&&"b"!=="0b".substr(-1);defineProperties(StringPrototype,{substr:function substr(start,length){var normalizedStart=start;return start<0&&(normalizedStart=max(this.length+start,0)),string_substr.call(this,normalizedStart,length)}},hasNegativeSubstrBug);var ws="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff",zeroWidth="​",wsRegexChars="["+ws+"]",trimBeginRegexp=new RegExp("^"+wsRegexChars+wsRegexChars+"*"),trimEndRegexp=new RegExp(wsRegexChars+wsRegexChars+"*$"),hasTrimWhitespaceBug=StringPrototype.trim&&(ws.trim()||!zeroWidth.trim());defineProperties(StringPrototype,{trim:function trim(){Iif(null==this)throw new TypeError("can't convert "+this+" to object");return $String(this).replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}},hasTrimWhitespaceBug);var trim=call.bind(String.prototype.trim),hasLastIndexBug=StringPrototype.lastIndexOf&&-1!=="abcあい".lastIndexOf("あい",2);defineProperties(StringPrototype,{lastIndexOf:function lastIndexOf(searchString){if(null==this)throw new TypeError("can't convert "+this+" to object");for(var S=$String(this),searchStr=$String(searchString),numPos=arguments.length>1?$Number(arguments[1]):NaN,pos=isActualNaN(numPos)?1/0:ES.ToInteger(numPos),start=min(max(pos,0),S.length),searchLen=searchStr.length,k=start+searchLen;k>0;){k=max(0,k-searchLen);var index=strIndexOf(strSlice(S,k,start+searchLen),searchStr);if(-1!==index)return k+index}return-1}},hasLastIndexBug);var originalLastIndexOf=StringPrototype.lastIndexOf;defineProperties(StringPrototype,{lastIndexOf:function lastIndexOf(searchString){return originalLastIndexOf.apply(this,arguments)}},1!==StringPrototype.lastIndexOf.length),(8!==parseInt(ws+"08")||22!==parseInt(ws+"0x16"))&&(parseInt=(origParseInt=parseInt,hexRegex=/^[-+]?0[xX]/,function parseInt(str,radix){var string=trim(String(str)),defaultedRadix=$Number(radix)||(hexRegex.test(string)?16:10);return origParseInt(string,defaultedRadix)}));var origParseInt,hexRegex;1/parseFloat("-0")!=-1/0&&(parseFloat=(origParseFloat=parseFloat,function parseFloat(string){var inputString=trim(String(string)),result=origParseFloat(inputString);return 0===result&&"-"===strSlice(inputString,0,1)?-0:result}));var origParseFloat;Iif("RangeError: test"!==String(new RangeError("test"))){var errorToStringShim=function toString(){if(null==this)throw new TypeError("can't convert "+this+" to object");var name=this.name;void 0===name?name="Error":"string"!=typeof name&&(name=$String(name));var msg=this.message;return void 0===msg?msg="":"string"!=typeof msg&&(msg=$String(msg)),name?msg?name+": "+msg:name:msg};Error.prototype.toString=errorToStringShim}Eif(supportsDescriptors){var ensureNonEnumerable=function(obj,prop){Iif(isEnum(obj,prop)){var desc=Object.getOwnPropertyDescriptor(obj,prop);desc.configurable&&(desc.enumerable=!1,Object.defineProperty(obj,prop,desc))}};ensureNonEnumerable(Error.prototype,"message"),""!==Error.prototype.message&&(Error.prototype.message=""),ensureNonEnumerable(Error.prototype,"name")}Iif("/a/gim"!==String(/a/gim)){var regexToString=function toString(){var str="/"+this.source+"/";return this.global&&(str+="g"),this.ignoreCase&&(str+="i"),this.multiline&&(str+="m"),str};RegExp.prototype.toString=regexToString}})?__WEBPACK_AMD_DEFINE_FACTORY__.call(exports,__webpack_require__,exports,module):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}()},function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__;
/*!
 * https://github.com/es-shims/es5-shim
 * @license es5-shim Copyright 2009-2015 by contributors, MIT License
 * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
 */!function(root,factory){"use strict";void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=function(){var defineGetter,defineSetter,lookupGetter,lookupSetter,call=Function.call,prototypeOfObject=Object.prototype,owns=call.bind(prototypeOfObject.hasOwnProperty),isEnumerable=call.bind(prototypeOfObject.propertyIsEnumerable),toStr=call.bind(prototypeOfObject.toString),supportsAccessors=owns(prototypeOfObject,"__defineGetter__");supportsAccessors&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__));var isPrimitive=function isPrimitive(o){return null==o||"object"!=typeof o&&"function"!=typeof o};Object.getPrototypeOf||(Object.getPrototypeOf=function getPrototypeOf(object){var proto=object.__proto__;return proto||null===proto?proto:"[object Function]"===toStr(object.constructor)?object.constructor.prototype:object instanceof Object?prototypeOfObject:null});var doesGetOwnPropertyDescriptorWork=function doesGetOwnPropertyDescriptorWork(object){try{return object.sentinel=0,0===Object.getOwnPropertyDescriptor(object,"sentinel").value}catch(exception){return!1}};Eif(Object.defineProperty){var getOwnPropertyDescriptorWorksOnObject=doesGetOwnPropertyDescriptorWork({});Iif(!("undefined"==typeof document||doesGetOwnPropertyDescriptorWork(document.createElement("div")))||!getOwnPropertyDescriptorWorksOnObject)var getOwnPropertyDescriptorFallback=Object.getOwnPropertyDescriptor}Iif(!Object.getOwnPropertyDescriptor||getOwnPropertyDescriptorFallback){Object.getOwnPropertyDescriptor=function getOwnPropertyDescriptor(object,property){if(isPrimitive(object))throw new TypeError("Object.getOwnPropertyDescriptor called on a non-object: "+object);if(getOwnPropertyDescriptorFallback)try{return getOwnPropertyDescriptorFallback.call(Object,object,property)}catch(exception){}var descriptor;if(!owns(object,property))return descriptor;if(descriptor={enumerable:isEnumerable(object,property),configurable:!0},supportsAccessors){var prototype=object.__proto__,notPrototypeOfObject=object!==prototypeOfObject;notPrototypeOfObject&&(object.__proto__=prototypeOfObject);var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(notPrototypeOfObject&&(object.__proto__=prototype),getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor.writable=!0,descriptor}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function getOwnPropertyNames(object){return Object.keys(object)});Iif(!Object.create){var createEmpty,supportsProto=!({__proto__:null}instanceof Object);createEmpty=supportsProto||"undefined"==typeof document?function(){return{__proto__:null}}:function(){var empty=function shouldUseActiveX(){if(!document.domain)return!1;try{return!!new ActiveXObject("htmlfile")}catch(exception){return!1}}()?function getEmptyViaActiveX(){var empty,xDoc;return(xDoc=new ActiveXObject("htmlfile")).write("<script><\/script>"),xDoc.close(),empty=xDoc.parentWindow.Object.prototype,xDoc=null,empty}():function getEmptyViaIFrame(){var empty,iframe=document.createElement("iframe"),parent=document.body||document.documentElement;return iframe.style.display="none",parent.appendChild(iframe),iframe.src="javascript:",empty=iframe.contentWindow.Object.prototype,parent.removeChild(iframe),iframe=null,empty}();delete empty.constructor,delete empty.hasOwnProperty,delete empty.propertyIsEnumerable,delete empty.isPrototypeOf,delete empty.toLocaleString,delete empty.toString,delete empty.valueOf;var Empty=function Empty(){};return Empty.prototype=empty,createEmpty=function(){return new Empty},new Empty},Object.create=function create(prototype,properties){var object,Type=function Type(){};if(null===prototype)object=createEmpty();else{if(null!==prototype&&isPrimitive(prototype))throw new TypeError("Object prototype may only be an Object or null");Type.prototype=prototype,(object=new Type).__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}var doesDefinePropertyWork=function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){return!1}};Eif(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));Iif(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty,definePropertiesFallback=Object.defineProperties}Iif(!Object.defineProperty||definePropertyFallback){Object.defineProperty=function defineProperty(object,property,descriptor){if(isPrimitive(object))throw new TypeError("Object.defineProperty called on non-object: "+object);if(isPrimitive(descriptor))throw new TypeError("Property description must be an object: "+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if("value"in descriptor)if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{var hasGetter="get"in descriptor,hasSetter="set"in descriptor;if(!supportsAccessors&&(hasGetter||hasSetter))throw new TypeError("getters & setters can not be defined on this javascript engine");hasGetter&&defineGetter(object,property,descriptor.get),hasSetter&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties&&!definePropertiesFallback||(Object.defineProperties=function defineProperties(object,properties){if(definePropertiesFallback)try{return definePropertiesFallback.call(Object,object,properties)}catch(exception){}return Object.keys(properties).forEach(function(property){"__proto__"!==property&&Object.defineProperty(object,property,properties[property])}),object});Object.seal||(Object.seal=function seal(object){if(Object(object)!==object)throw new TypeError("Object.seal can only be called on Objects.");return object});Object.freeze||(Object.freeze=function freeze(object){if(Object(object)!==object)throw new TypeError("Object.freeze can only be called on Objects.");return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=(freezeObject=Object.freeze,function freeze(object){return"function"==typeof object?object:freezeObject(object)})}var freezeObject;Object.preventExtensions||(Object.preventExtensions=function preventExtensions(object){if(Object(object)!==object)throw new TypeError("Object.preventExtensions can only be called on Objects.");return object});Object.isSealed||(Object.isSealed=function isSealed(object){if(Object(object)!==object)throw new TypeError("Object.isSealed can only be called on Objects.");return!1});Object.isFrozen||(Object.isFrozen=function isFrozen(object){if(Object(object)!==object)throw new TypeError("Object.isFrozen can only be called on Objects.");return!1});Object.isExtensible||(Object.isExtensible=function isExtensible(object){if(Object(object)!==object)throw new TypeError("Object.isExtensible can only be called on Objects.");for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue})})?__WEBPACK_AMD_DEFINE_FACTORY__.call(exports,__webpack_require__,exports,module):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}()},function(module,exports,__webpack_require__){"use strict";__webpack_require__(282),__webpack_require__(283)(),__webpack_require__(288)},function(module,exports,__webpack_require__){(function(global,process){var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__;
/*!
 * https://github.com/paulmillr/es6-shim
 * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com)
 *   and contributors,  MIT License
 * es6-shim: v0.35.4
 * see https://github.com/paulmillr/es6-shim/blob/0.35.3/LICENSE
 * Details and documentation:
 * https://github.com/paulmillr/es6-shim/
 */void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=function(){"use strict";var ArrayIterator,_apply=Function.call.bind(Function.apply),_call=Function.call.bind(Function.call),isArray=Array.isArray,keys=Object.keys,not=function notThunker(func){return function notThunk(){return!_apply(func,this,arguments)}},throwsError=function(func){try{return func(),!1}catch(e){return!0}},valueOrFalseIfThrows=function valueOrFalseIfThrows(func){try{return func()}catch(e){return!1}},isCallableWithoutNew=not(throwsError),arePropertyDescriptorsSupported=function(){return!throwsError(function(){return Object.defineProperty({},"x",{get:function(){}})})},supportsDescriptors=!!Object.defineProperty&&arePropertyDescriptorsSupported(),functionsHaveNames="foo"===function foo(){}.name,_forEach=Function.call.bind(Array.prototype.forEach),_reduce=Function.call.bind(Array.prototype.reduce),_filter=Function.call.bind(Array.prototype.filter),_some=Function.call.bind(Array.prototype.some),defineProperty=function(object,name,value,force){!force&&name in object||(supportsDescriptors?Object.defineProperty(object,name,{configurable:!0,enumerable:!1,writable:!0,value:value}):object[name]=value)},defineProperties=function(object,map,forceOverride){_forEach(keys(map),function(name){var method=map[name];defineProperty(object,name,method,!!forceOverride)})},_toString=Function.call.bind(Object.prototype.toString),isCallable=function IsCallableFast(x){return"function"==typeof x},Value={getter:function(object,name,getter){Iif(!supportsDescriptors)throw new TypeError("getters require true ES5 support");Object.defineProperty(object,name,{configurable:!0,enumerable:!1,get:getter})},proxy:function(originalObject,key,targetObject){if(!supportsDescriptors)throw new TypeError("getters require true ES5 support");var originalDescriptor=Object.getOwnPropertyDescriptor(originalObject,key);Object.defineProperty(targetObject,key,{configurable:originalDescriptor.configurable,enumerable:originalDescriptor.enumerable,get:function getKey(){return originalObject[key]},set:function setKey(value){originalObject[key]=value}})},redefine:function(object,property,newValue){if(supportsDescriptors){var descriptor=Object.getOwnPropertyDescriptor(object,property);descriptor.value=newValue,Object.defineProperty(object,property,descriptor)}else object[property]=newValue},defineByDescriptor:function(object,property,descriptor){supportsDescriptors?Object.defineProperty(object,property,descriptor):"value"in descriptor&&(object[property]=descriptor.value)},preserveToString:function(target,source){source&&isCallable(source.toString)&&defineProperty(target,"toString",source.toString.bind(source),!0)}},create=Object.create||function(prototype,properties){var Prototype=function Prototype(){};Prototype.prototype=prototype;var object=new Prototype;return void 0!==properties&&keys(properties).forEach(function(key){Value.defineByDescriptor(object,key,properties[key])}),object},supportsSubclassing=function(C,f){return!!Object.setPrototypeOf&&valueOrFalseIfThrows(function(){var Sub=function Subclass(arg){var o=new C(arg);return Object.setPrototypeOf(o,Subclass.prototype),o};return Object.setPrototypeOf(Sub,C),Sub.prototype=create(C.prototype,{constructor:{value:Sub}}),f(Sub)})},getGlobal=function(){Eif("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==global)return global;throw new Error("unable to locate global object")},globals=getGlobal(),globalIsFinite=globals.isFinite,_indexOf=Function.call.bind(String.prototype.indexOf),_arrayIndexOfApply=Function.apply.bind(Array.prototype.indexOf),_concat=Function.call.bind(Array.prototype.concat),_strSlice=Function.call.bind(String.prototype.slice),_push=Function.call.bind(Array.prototype.push),_pushApply=Function.apply.bind(Array.prototype.push),_shift=Function.call.bind(Array.prototype.shift),_max=Math.max,_min=Math.min,_floor=Math.floor,_abs=Math.abs,_exp=Math.exp,_log=Math.log,_sqrt=Math.sqrt,_hasOwnProperty=Function.call.bind(Object.prototype.hasOwnProperty),noop=function(){},OrigMap=globals.Map,origMapDelete=OrigMap&&OrigMap.prototype.delete,origMapGet=OrigMap&&OrigMap.prototype.get,origMapHas=OrigMap&&OrigMap.prototype.has,origMapSet=OrigMap&&OrigMap.prototype.set,Symbol=globals.Symbol||{},symbolSpecies=Symbol.species||"@@species",numberIsNaN=Number.isNaN||function isNaN(value){return value!=value},numberIsFinite=Number.isFinite||function isFinite(value){return"number"==typeof value&&globalIsFinite(value)},_sign=isCallable(Math.sign)?Math.sign:function sign(value){var number=Number(value);return 0===number?number:numberIsNaN(number)?number:number<0?-1:1},_log1p=function log1p(value){var x=Number(value);return x<-1||numberIsNaN(x)?NaN:0===x||x===1/0?x:-1===x?-1/0:1+x-1==0?x:x*(_log(1+x)/(1+x-1))},isStandardArguments=function isArguments(value){return"[object Arguments]"===_toString(value)},isLegacyArguments=function isArguments(value){return null!==value&&"object"==typeof value&&"number"==typeof value.length&&value.length>=0&&"[object Array]"!==_toString(value)&&"[object Function]"===_toString(value.callee)},isArguments=isStandardArguments(arguments)?isStandardArguments:isLegacyArguments,Type={primitive:function(x){return null===x||"function"!=typeof x&&"object"!=typeof x},string:function(x){return"[object String]"===_toString(x)},regex:function(x){return"[object RegExp]"===_toString(x)},symbol:function(x){return"function"==typeof globals.Symbol&&"symbol"==typeof x}},overrideNative=function overrideNative(object,property,replacement){var original=object[property];defineProperty(object,property,replacement,!0),Value.preserveToString(object[property],original)},hasSymbols="function"==typeof Symbol&&"function"==typeof Symbol.for&&Type.symbol(Symbol()),$iterator$=Type.symbol(Symbol.iterator)?Symbol.iterator:"_es6-shim iterator_";globals.Set&&"function"==typeof(new globals.Set)["@@iterator"]&&($iterator$="@@iterator"),globals.Reflect||defineProperty(globals,"Reflect",{},!0);var o,Reflect=globals.Reflect,$String=String,domAll="undefined"!=typeof document&&document?document.all:null,isNullOrUndefined=null==domAll?function isNullOrUndefined(x){return null==x}:function isNullOrUndefinedAndNotDocumentAll(x){return null==x&&x!==domAll},ES={Call:function Call(F,V){var args=arguments.length>2?arguments[2]:[];if(!ES.IsCallable(F))throw new TypeError(F+" is not a function");return _apply(F,V,args)},RequireObjectCoercible:function(x,optMessage){Iif(isNullOrUndefined(x))throw new TypeError(optMessage||"Cannot call method on "+x);return x},TypeIsObject:function(x){return null!=x&&!0!==x&&!1!==x&&("function"==typeof x||"object"==typeof x||x===domAll)},ToObject:function(o,optMessage){return Object(ES.RequireObjectCoercible(o,optMessage))},IsCallable:isCallable,IsConstructor:function(x){return ES.IsCallable(x)},ToInt32:function(x){return ES.ToNumber(x)>>0},ToUint32:function(x){return ES.ToNumber(x)>>>0},ToNumber:function(value){if("[object Symbol]"===_toString(value))throw new TypeError("Cannot convert a Symbol value to a number");return+value},ToInteger:function(value){var number=ES.ToNumber(value);return numberIsNaN(number)?0:0!==number&&numberIsFinite(number)?(number>0?1:-1)*_floor(_abs(number)):number},ToLength:function(value){var len=ES.ToInteger(value);return len<=0?0:len>Number.MAX_SAFE_INTEGER?Number.MAX_SAFE_INTEGER:len},SameValue:function(a,b){return a===b?0!==a||1/a==1/b:numberIsNaN(a)&&numberIsNaN(b)},SameValueZero:function(a,b){return a===b||numberIsNaN(a)&&numberIsNaN(b)},IsIterable:function(o){return ES.TypeIsObject(o)&&(void 0!==o[$iterator$]||isArguments(o))},GetIterator:function(o){if(isArguments(o))return new ArrayIterator(o,"value");var itFn=ES.GetMethod(o,$iterator$);if(!ES.IsCallable(itFn))throw new TypeError("value is not an iterable");var it=ES.Call(itFn,o);if(!ES.TypeIsObject(it))throw new TypeError("bad iterator");return it},GetMethod:function(o,p){var func=ES.ToObject(o)[p];if(!isNullOrUndefined(func)){if(!ES.IsCallable(func))throw new TypeError("Method not callable: "+p);return func}},IteratorComplete:function(iterResult){return!!iterResult.done},IteratorClose:function(iterator,completionIsThrow){var returnMethod=ES.GetMethod(iterator,"return");if(void 0!==returnMethod){var innerResult,innerException;try{innerResult=ES.Call(returnMethod,iterator)}catch(e){innerException=e}if(!completionIsThrow){if(innerException)throw innerException;if(!ES.TypeIsObject(innerResult))throw new TypeError("Iterator's return method returned a non-object.")}}},IteratorNext:function(it){var result=arguments.length>1?it.next(arguments[1]):it.next();if(!ES.TypeIsObject(result))throw new TypeError("bad iterator");return result},IteratorStep:function(it){var result=ES.IteratorNext(it);return!ES.IteratorComplete(result)&&result},Construct:function(C,args,newTarget,isES6internal){var target=void 0===newTarget?C:newTarget;if(!isES6internal&&Reflect.construct)return Reflect.construct(C,args,target);var proto=target.prototype;ES.TypeIsObject(proto)||(proto=Object.prototype);var obj=create(proto),result=ES.Call(C,obj,args);return ES.TypeIsObject(result)?result:obj},SpeciesConstructor:function(O,defaultConstructor){var C=O.constructor;if(void 0===C)return defaultConstructor;if(!ES.TypeIsObject(C))throw new TypeError("Bad constructor");var S=C[symbolSpecies];if(isNullOrUndefined(S))return defaultConstructor;if(!ES.IsConstructor(S))throw new TypeError("Bad @@species");return S},CreateHTML:function(string,tag,attribute,value){var S=ES.ToString(string),p1="<"+tag;return""!==attribute&&(p1+=" "+attribute+'="'+ES.ToString(value).replace(/"/g,"&quot;")+'"'),p1+">"+S+"</"+tag+">"},IsRegExp:function IsRegExp(argument){if(!ES.TypeIsObject(argument))return!1;var isRegExp=argument[Symbol.match];return void 0!==isRegExp?!!isRegExp:Type.regex(argument)},ToString:function ToString(string){return $String(string)}};Eif(supportsDescriptors&&hasSymbols){var defineWellKnownSymbol=function defineWellKnownSymbol(name){if(Type.symbol(Symbol[name]))return Symbol[name];var sym=Symbol.for("Symbol."+name);return Object.defineProperty(Symbol,name,{configurable:!1,enumerable:!1,writable:!1,value:sym}),sym};Iif(!Type.symbol(Symbol.search)){var symbolSearch=defineWellKnownSymbol("search"),originalSearch=String.prototype.search;defineProperty(RegExp.prototype,symbolSearch,function search(string){return ES.Call(originalSearch,string,[this])});var searchShim=function search(regexp){var O=ES.RequireObjectCoercible(this);if(!isNullOrUndefined(regexp)){var searcher=ES.GetMethod(regexp,symbolSearch);if(void 0!==searcher)return ES.Call(searcher,regexp,[O])}return ES.Call(originalSearch,O,[ES.ToString(regexp)])};overrideNative(String.prototype,"search",searchShim)}Iif(!Type.symbol(Symbol.replace)){var symbolReplace=defineWellKnownSymbol("replace"),originalReplace=String.prototype.replace;defineProperty(RegExp.prototype,symbolReplace,function replace(string,replaceValue){return ES.Call(originalReplace,string,[this,replaceValue])});var replaceShim=function replace(searchValue,replaceValue){var O=ES.RequireObjectCoercible(this);if(!isNullOrUndefined(searchValue)){var replacer=ES.GetMethod(searchValue,symbolReplace);if(void 0!==replacer)return ES.Call(replacer,searchValue,[O,replaceValue])}return ES.Call(originalReplace,O,[ES.ToString(searchValue),replaceValue])};overrideNative(String.prototype,"replace",replaceShim)}Iif(!Type.symbol(Symbol.split)){var symbolSplit=defineWellKnownSymbol("split"),originalSplit=String.prototype.split;defineProperty(RegExp.prototype,symbolSplit,function split(string,limit){return ES.Call(originalSplit,string,[this,limit])});var splitShim=function split(separator,limit){var O=ES.RequireObjectCoercible(this);if(!isNullOrUndefined(separator)){var splitter=ES.GetMethod(separator,symbolSplit);if(void 0!==splitter)return ES.Call(splitter,separator,[O,limit])}return ES.Call(originalSplit,O,[ES.ToString(separator),limit])};overrideNative(String.prototype,"split",splitShim)}var symbolMatchExists=Type.symbol(Symbol.match),stringMatchIgnoresSymbolMatch=symbolMatchExists&&((o={})[Symbol.match]=function(){return 42},42!=="a".match(o));Iif(!symbolMatchExists||stringMatchIgnoresSymbolMatch){var symbolMatch=defineWellKnownSymbol("match"),originalMatch=String.prototype.match;defineProperty(RegExp.prototype,symbolMatch,function match(string){return ES.Call(originalMatch,string,[this])});var matchShim=function match(regexp){var O=ES.RequireObjectCoercible(this);if(!isNullOrUndefined(regexp)){var matcher=ES.GetMethod(regexp,symbolMatch);if(void 0!==matcher)return ES.Call(matcher,regexp,[O])}return ES.Call(originalMatch,O,[ES.ToString(regexp)])};overrideNative(String.prototype,"match",matchShim)}}var wrapConstructor=function wrapConstructor(original,replacement,keysToSkip){Value.preserveToString(replacement,original),Object.setPrototypeOf&&Object.setPrototypeOf(original,replacement),supportsDescriptors?_forEach(Object.getOwnPropertyNames(original),function(key){key in noop||keysToSkip[key]||Value.proxy(original,key,replacement)}):_forEach(Object.keys(original),function(key){key in noop||keysToSkip[key]||(replacement[key]=original[key])}),replacement.prototype=original.prototype,Value.redefine(original.prototype,"constructor",replacement)},defaultSpeciesGetter=function(){return this},addDefaultSpecies=function(C){supportsDescriptors&&!_hasOwnProperty(C,symbolSpecies)&&Value.getter(C,symbolSpecies,defaultSpeciesGetter)},addIterator=function(prototype,impl){var implementation=impl||function iterator(){return this};defineProperty(prototype,$iterator$,implementation),!prototype[$iterator$]&&Type.symbol($iterator$)&&(prototype[$iterator$]=implementation)},createDataProperty=function createDataProperty(object,name,value){supportsDescriptors?Object.defineProperty(object,name,{configurable:!0,enumerable:!0,writable:!0,value:value}):object[name]=value},createDataPropertyOrThrow=function createDataPropertyOrThrow(object,name,value){if(createDataProperty(object,name,value),!ES.SameValue(object[name],value))throw new TypeError("property is nonconfigurable")},emulateES6construct=function(o,defaultNewTarget,defaultProto,slots){Iif(!ES.TypeIsObject(o))throw new TypeError("Constructor requires `new`: "+defaultNewTarget.name);var proto=defaultNewTarget.prototype;ES.TypeIsObject(proto)||(proto=defaultProto);var obj=create(proto);for(var name in slots)Eif(_hasOwnProperty(slots,name)){var value=slots[name];defineProperty(obj,name,value,!0)}return obj};Iif(String.fromCodePoint&&1!==String.fromCodePoint.length){var originalFromCodePoint=String.fromCodePoint;overrideNative(String,"fromCodePoint",function fromCodePoint(codePoints){return ES.Call(originalFromCodePoint,this,arguments)})}var StringShims={fromCodePoint:function fromCodePoint(codePoints){for(var next,result=[],i=0,length=arguments.length;i<length;i++){if(next=Number(arguments[i]),!ES.SameValue(next,ES.ToInteger(next))||next<0||next>1114111)throw new RangeError("Invalid code point "+next);next<65536?_push(result,String.fromCharCode(next)):(next-=65536,_push(result,String.fromCharCode(55296+(next>>10))),_push(result,String.fromCharCode(next%1024+56320)))}return result.join("")},raw:function raw(callSite){var cooked=ES.ToObject(callSite,"bad callSite"),rawString=ES.ToObject(cooked.raw,"bad raw value"),len=rawString.length,literalsegments=ES.ToLength(len);if(literalsegments<=0)return"";for(var nextKey,next,nextSeg,nextSub,stringElements=[],nextIndex=0;nextIndex<literalsegments&&(nextKey=ES.ToString(nextIndex),nextSeg=ES.ToString(rawString[nextKey]),_push(stringElements,nextSeg),!(nextIndex+1>=literalsegments));)next=nextIndex+1<arguments.length?arguments[nextIndex+1]:"",nextSub=ES.ToString(next),_push(stringElements,nextSub),nextIndex+=1;return stringElements.join("")}};String.raw&&"xy"!==String.raw({raw:{0:"x",1:"y",length:2}})&&overrideNative(String,"raw",StringShims.raw),defineProperties(String,StringShims);var stringRepeat=function repeat(s,times){if(times<1)return"";if(times%2)return repeat(s,times-1)+s;var half=repeat(s,times/2);return half+half},stringMaxLength=1/0,StringPrototypeShims={repeat:function repeat(times){var thisStr=ES.ToString(ES.RequireObjectCoercible(this)),numTimes=ES.ToInteger(times);if(numTimes<0||numTimes>=stringMaxLength)throw new RangeError("repeat count must be less than infinity and not overflow maximum string size");return stringRepeat(thisStr,numTimes)},startsWith:function startsWith(searchString){var S=ES.ToString(ES.RequireObjectCoercible(this));if(ES.IsRegExp(searchString))throw new TypeError('Cannot call method "startsWith" with a regex');var position,searchStr=ES.ToString(searchString);arguments.length>1&&(position=arguments[1]);var start=_max(ES.ToInteger(position),0);return _strSlice(S,start,start+searchStr.length)===searchStr},endsWith:function endsWith(searchString){var S=ES.ToString(ES.RequireObjectCoercible(this));if(ES.IsRegExp(searchString))throw new TypeError('Cannot call method "endsWith" with a regex');var endPosition,searchStr=ES.ToString(searchString),len=S.length;arguments.length>1&&(endPosition=arguments[1]);var pos=void 0===endPosition?len:ES.ToInteger(endPosition),end=_min(_max(pos,0),len);return _strSlice(S,end-searchStr.length,end)===searchStr},includes:function includes(searchString){if(ES.IsRegExp(searchString))throw new TypeError('"includes" does not accept a RegExp');var position,searchStr=ES.ToString(searchString);return arguments.length>1&&(position=arguments[1]),-1!==_indexOf(this,searchStr,position)},codePointAt:function codePointAt(pos){var thisStr=ES.ToString(ES.RequireObjectCoercible(this)),position=ES.ToInteger(pos),length=thisStr.length;if(position>=0&&position<length){var first=thisStr.charCodeAt(position);if(first<55296||first>56319||position+1===length)return first;var second=thisStr.charCodeAt(position+1);return second<56320||second>57343?first:1024*(first-55296)+(second-56320)+65536}}};Eif(String.prototype.includes&&!1!=="a".includes("a",1/0)&&overrideNative(String.prototype,"includes",StringPrototypeShims.includes),String.prototype.startsWith&&String.prototype.endsWith){var startsWithRejectsRegex=throwsError(function(){return"/a/".startsWith(/a/)}),startsWithHandlesInfinity=valueOrFalseIfThrows(function(){return!1==="abc".startsWith("a",1/0)});startsWithRejectsRegex&&startsWithHandlesInfinity||(overrideNative(String.prototype,"startsWith",StringPrototypeShims.startsWith),overrideNative(String.prototype,"endsWith",StringPrototypeShims.endsWith))}Eif(hasSymbols){var startsWithSupportsSymbolMatch=valueOrFalseIfThrows(function(){var re=/a/;return re[Symbol.match]=!1,"/a/".startsWith(re)});startsWithSupportsSymbolMatch||overrideNative(String.prototype,"startsWith",StringPrototypeShims.startsWith);var endsWithSupportsSymbolMatch=valueOrFalseIfThrows(function(){var re=/a/;return re[Symbol.match]=!1,"/a/".endsWith(re)});endsWithSupportsSymbolMatch||overrideNative(String.prototype,"endsWith",StringPrototypeShims.endsWith);var includesSupportsSymbolMatch=valueOrFalseIfThrows(function(){var re=/a/;return re[Symbol.match]=!1,"/a/".includes(re)});includesSupportsSymbolMatch||overrideNative(String.prototype,"includes",StringPrototypeShims.includes)}defineProperties(String.prototype,StringPrototypeShims);var ws=["\t\n\v\f\r   ᠎    ","          \u2028","\u2029\ufeff"].join(""),trimRegexp=new RegExp("(^["+ws+"]+)|(["+ws+"]+$)","g"),trimShim=function trim(){return ES.ToString(ES.RequireObjectCoercible(this)).replace(trimRegexp,"")},nonWS=["…","​","￾"].join(""),nonWSregex=new RegExp("["+nonWS+"]","g"),isBadHexRegex=/^[-+]0x[0-9a-f]+$/i,hasStringTrimBug=nonWS.trim().length!==nonWS.length;defineProperty(String.prototype,"trim",trimShim,hasStringTrimBug);var iteratorResult=function(x){return{value:x,done:0===arguments.length}},StringIterator=function(s){ES.RequireObjectCoercible(s),this._s=ES.ToString(s),this._i=0};StringIterator.prototype.next=function(){var s=this._s,i=this._i;if(void 0===s||i>=s.length)return this._s=void 0,iteratorResult();var second,len,first=s.charCodeAt(i);return len=first<55296||first>56319||i+1===s.length?1:(second=s.charCodeAt(i+1))<56320||second>57343?1:2,this._i=i+len,iteratorResult(s.substr(i,len))},addIterator(StringIterator.prototype),addIterator(String.prototype,function(){return new StringIterator(this)});var ArrayShims={from:function from(items){var mapFn,mapping,T,C=this;if(arguments.length>1&&(mapFn=arguments[1]),void 0===mapFn)mapping=!1;else{if(!ES.IsCallable(mapFn))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(T=arguments[2]),mapping=!0}var length,result,i,usingIterator=void 0!==(isArguments(items)||ES.GetMethod(items,$iterator$));if(usingIterator){result=ES.IsConstructor(C)?Object(new C):[];var next,nextValue,iterator=ES.GetIterator(items);for(i=0;!1!==(next=ES.IteratorStep(iterator));){nextValue=next.value;try{mapping&&(nextValue=void 0===T?mapFn(nextValue,i):_call(mapFn,T,nextValue,i)),result[i]=nextValue}catch(e){throw ES.IteratorClose(iterator,!0),e}i+=1}length=i}else{var value,arrayLike=ES.ToObject(items);for(length=ES.ToLength(arrayLike.length),result=ES.IsConstructor(C)?Object(new C(length)):new Array(length),i=0;i<length;++i)value=arrayLike[i],mapping&&(value=void 0===T?mapFn(value,i):_call(mapFn,T,value,i)),createDataPropertyOrThrow(result,i,value)}return result.length=length,result},of:function of(){for(var len=arguments.length,C=this,A=isArray(C)||!ES.IsCallable(C)?new Array(len):ES.Construct(C,[len]),k=0;k<len;++k)createDataPropertyOrThrow(A,k,arguments[k]);return A.length=len,A}};defineProperties(Array,ArrayShims),addDefaultSpecies(Array),defineProperties((ArrayIterator=function(array,kind){this.i=0,this.array=array,this.kind=kind}).prototype,{next:function(){var i=this.i,array=this.array;if(!(this instanceof ArrayIterator))throw new TypeError("Not an ArrayIterator");if(void 0!==array)for(var len=ES.ToLength(array.length);i<len;i++){var retval,kind=this.kind;return"key"===kind?retval=i:"value"===kind?retval=array[i]:"entry"===kind&&(retval=[i,array[i]]),this.i=i+1,iteratorResult(retval)}return this.array=void 0,iteratorResult()}}),addIterator(ArrayIterator.prototype);var arrayOfSupportsSubclassing=Array.of===ArrayShims.of||function(){var Foo=function Foo(len){this.length=len};Foo.prototype=[];var fooArr=Array.of.apply(Foo,[1,2]);return fooArr instanceof Foo&&2===fooArr.length}();arrayOfSupportsSubclassing||overrideNative(Array,"of",ArrayShims.of);var ArrayPrototypeShims={copyWithin:function copyWithin(target,start){var end,o=ES.ToObject(this),len=ES.ToLength(o.length),relativeTarget=ES.ToInteger(target),relativeStart=ES.ToInteger(start),to=relativeTarget<0?_max(len+relativeTarget,0):_min(relativeTarget,len),from=relativeStart<0?_max(len+relativeStart,0):_min(relativeStart,len);arguments.length>2&&(end=arguments[2]);var relativeEnd=void 0===end?len:ES.ToInteger(end),finalItem=relativeEnd<0?_max(len+relativeEnd,0):_min(relativeEnd,len),count=_min(finalItem-from,len-to),direction=1;for(from<to&&to<from+count&&(direction=-1,from+=count-1,to+=count-1);count>0;)from in o?o[to]=o[from]:delete o[to],from+=direction,to+=direction,count-=1;return o},fill:function fill(value){var start,end;arguments.length>1&&(start=arguments[1]),arguments.length>2&&(end=arguments[2]);var O=ES.ToObject(this),len=ES.ToLength(O.length);start=ES.ToInteger(void 0===start?0:start),end=ES.ToInteger(void 0===end?len:end);for(var relativeStart=start<0?_max(len+start,0):_min(start,len),relativeEnd=end<0?len+end:end,i=relativeStart;i<len&&i<relativeEnd;++i)O[i]=value;return O},find:function find(predicate){var list=ES.ToObject(this),length=ES.ToLength(list.length);if(!ES.IsCallable(predicate))throw new TypeError("Array#find: predicate must be a function");for(var value,thisArg=arguments.length>1?arguments[1]:null,i=0;i<length;i++)if(value=list[i],thisArg){if(_call(predicate,thisArg,value,i,list))return value}else if(predicate(value,i,list))return value},findIndex:function findIndex(predicate){var list=ES.ToObject(this),length=ES.ToLength(list.length);if(!ES.IsCallable(predicate))throw new TypeError("Array#findIndex: predicate must be a function");for(var thisArg=arguments.length>1?arguments[1]:null,i=0;i<length;i++)if(thisArg){if(_call(predicate,thisArg,list[i],i,list))return i}else if(predicate(list[i],i,list))return i;return-1},keys:function keys(){return new ArrayIterator(this,"key")},values:function values(){return new ArrayIterator(this,"value")},entries:function entries(){return new ArrayIterator(this,"entry")}};Iif(Array.prototype.keys&&!ES.IsCallable([1].keys().next)&&delete Array.prototype.keys,Array.prototype.entries&&!ES.IsCallable([1].entries().next)&&delete Array.prototype.entries,Array.prototype.keys&&Array.prototype.entries&&!Array.prototype.values&&Array.prototype[$iterator$]&&(defineProperties(Array.prototype,{values:Array.prototype[$iterator$]}),Type.symbol(Symbol.unscopables)&&(Array.prototype[Symbol.unscopables].values=!0)),functionsHaveNames&&Array.prototype.values&&"values"!==Array.prototype.values.name){var originalArrayPrototypeValues=Array.prototype.values;overrideNative(Array.prototype,"values",function values(){return ES.Call(originalArrayPrototypeValues,this,arguments)}),defineProperty(Array.prototype,$iterator$,Array.prototype.values,!0)}defineProperties(Array.prototype,ArrayPrototypeShims),1/[!0].indexOf(!0,-0)<0&&defineProperty(Array.prototype,"indexOf",function indexOf(searchElement){var value=_arrayIndexOfApply(this,arguments);return 0===value&&1/value<0?0:value},!0),addIterator(Array.prototype,function(){return this.values()}),Object.getPrototypeOf&&addIterator(Object.getPrototypeOf([].values()));var arr,arrayFromSwallowsNegativeLengths=valueOrFalseIfThrows(function(){return 0===Array.from({length:-1}).length}),arrayFromHandlesIterables=1===(arr=Array.from([0].entries())).length&&isArray(arr[0])&&0===arr[0][0]&&0===arr[0][1];arrayFromSwallowsNegativeLengths&&arrayFromHandlesIterables||overrideNative(Array,"from",ArrayShims.from);var arrayFromHandlesUndefinedMapFunction=valueOrFalseIfThrows(function(){return Array.from([0],void 0)});Iif(!arrayFromHandlesUndefinedMapFunction){var origArrayFrom=Array.from;overrideNative(Array,"from",function from(items){return arguments.length>1&&void 0!==arguments[1]?ES.Call(origArrayFrom,this,arguments):_call(origArrayFrom,this,items)})}var int32sAsOne=-(Math.pow(2,32)-1),toLengthsCorrectly=function(method,reversed){var obj={length:int32sAsOne};return obj[reversed?(obj.length>>>0)-1:0]=!0,valueOrFalseIfThrows(function(){return _call(method,obj,function(){throw new RangeError("should not reach here")},[]),!0})};Iif(!toLengthsCorrectly(Array.prototype.forEach)){var originalForEach=Array.prototype.forEach;overrideNative(Array.prototype,"forEach",function forEach(callbackFn){return ES.Call(originalForEach,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.map)){var originalMap=Array.prototype.map;overrideNative(Array.prototype,"map",function map(callbackFn){return ES.Call(originalMap,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.filter)){var originalFilter=Array.prototype.filter;overrideNative(Array.prototype,"filter",function filter(callbackFn){return ES.Call(originalFilter,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.some)){var originalSome=Array.prototype.some;overrideNative(Array.prototype,"some",function some(callbackFn){return ES.Call(originalSome,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.every)){var originalEvery=Array.prototype.every;overrideNative(Array.prototype,"every",function every(callbackFn){return ES.Call(originalEvery,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.reduce)){var originalReduce=Array.prototype.reduce;overrideNative(Array.prototype,"reduce",function reduce(callbackFn){return ES.Call(originalReduce,this.length>=0?this:[],arguments)},!0)}Iif(!toLengthsCorrectly(Array.prototype.reduceRight,!0)){var originalReduceRight=Array.prototype.reduceRight;overrideNative(Array.prototype,"reduceRight",function reduceRight(callbackFn){return ES.Call(originalReduceRight,this.length>=0?this:[],arguments)},!0)}var lacksOctalSupport=8!==Number("0o10"),lacksBinarySupport=2!==Number("0b10"),trimsNonWhitespace=_some(nonWS,function(c){return 0===Number(c+0+c)});Iif(lacksOctalSupport||lacksBinarySupport||trimsNonWhitespace){var OrigNumber=Number,binaryRegex=/^0b[01]+$/i,octalRegex=/^0o[0-7]+$/i,isBinary=binaryRegex.test.bind(binaryRegex),isOctal=octalRegex.test.bind(octalRegex),toPrimitive=function(O){var result;if("function"==typeof O.valueOf&&(result=O.valueOf(),Type.primitive(result)))return result;if("function"==typeof O.toString&&(result=O.toString(),Type.primitive(result)))return result;throw new TypeError("No default value")},hasNonWS=nonWSregex.test.bind(nonWSregex),isBadHex=isBadHexRegex.test.bind(isBadHexRegex),NumberShim=function(){var NumberShim=function Number(value){var primValue;"string"==typeof(primValue=arguments.length>0?Type.primitive(value)?value:toPrimitive(value,"number"):0)&&(primValue=ES.Call(trimShim,primValue),isBinary(primValue)?primValue=parseInt(_strSlice(primValue,2),2):isOctal(primValue)?primValue=parseInt(_strSlice(primValue,2),8):(hasNonWS(primValue)||isBadHex(primValue))&&(primValue=NaN));var receiver=this,valueOfSucceeds=valueOrFalseIfThrows(function(){return OrigNumber.prototype.valueOf.call(receiver),!0});return receiver instanceof NumberShim&&!valueOfSucceeds?new OrigNumber(primValue):OrigNumber(primValue)};return NumberShim}();wrapConstructor(OrigNumber,NumberShim,{}),defineProperties(NumberShim,{NaN:OrigNumber.NaN,MAX_VALUE:OrigNumber.MAX_VALUE,MIN_VALUE:OrigNumber.MIN_VALUE,NEGATIVE_INFINITY:OrigNumber.NEGATIVE_INFINITY,POSITIVE_INFINITY:OrigNumber.POSITIVE_INFINITY}),Number=NumberShim,Value.redefine(globals,"Number",NumberShim)}var maxSafeInteger=Math.pow(2,53)-1;defineProperties(Number,{MAX_SAFE_INTEGER:maxSafeInteger,MIN_SAFE_INTEGER:-maxSafeInteger,EPSILON:2220446049250313e-31,parseInt:globals.parseInt,parseFloat:globals.parseFloat,isFinite:numberIsFinite,isInteger:function isInteger(value){return numberIsFinite(value)&&ES.ToInteger(value)===value},isSafeInteger:function isSafeInteger(value){return Number.isInteger(value)&&_abs(value)<=Number.MAX_SAFE_INTEGER},isNaN:numberIsNaN}),defineProperty(Number,"parseInt",globals.parseInt,Number.parseInt!==globals.parseInt),1===[,1].find(function(){return!0})&&overrideNative(Array.prototype,"find",ArrayPrototypeShims.find),0!==[,1].findIndex(function(){return!0})&&overrideNative(Array.prototype,"findIndex",ArrayPrototypeShims.findIndex);var FAKENULL,gpo,spo,isEnumerableOn=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable),ensureEnumerable=function ensureEnumerable(obj,prop){supportsDescriptors&&isEnumerableOn(obj,prop)&&Object.defineProperty(obj,prop,{enumerable:!1})},sliceArgs=function sliceArgs(){for(var initial=Number(this),len=arguments.length,desiredArgCount=len-initial,args=new Array(desiredArgCount<0?0:desiredArgCount),i=initial;i<len;++i)args[i-initial]=arguments[i];return args},assignTo=function assignTo(source){return function assignToSource(target,key){return target[key]=source[key],target}},assignReducer=function(target,source){var symbols,sourceKeys=keys(Object(source));return ES.IsCallable(Object.getOwnPropertySymbols)&&(symbols=_filter(Object.getOwnPropertySymbols(Object(source)),isEnumerableOn(source))),_reduce(_concat(sourceKeys,symbols||[]),assignTo(source),target)},ObjectShims={assign:function(target,source){var to=ES.ToObject(target,"Cannot convert undefined or null to object");return _reduce(ES.Call(sliceArgs,1,arguments),assignReducer,to)},is:function is(a,b){return ES.SameValue(a,b)}},assignHasPendingExceptions=Object.assign&&Object.preventExtensions&&function(){var thrower=Object.preventExtensions({1:2});try{Object.assign(thrower,"xy")}catch(e){return"y"===thrower[1]}}();Eif(assignHasPendingExceptions&&overrideNative(Object,"assign",ObjectShims.assign),defineProperties(Object,ObjectShims),supportsDescriptors){var ES5ObjectShims={setPrototypeOf:function(Object,magic){var set,setPrototypeOf=function(O,proto){return function(O,proto){if(!ES.TypeIsObject(O))throw new TypeError("cannot set prototype on a non-object");if(null!==proto&&!ES.TypeIsObject(proto))throw new TypeError("can only set prototype to an object or null"+proto)}(O,proto),_call(set,O,proto),O};try{set=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,_call(set,{},null)}catch(e){if(Object.prototype!=={}.__proto__)return;set=function(proto){this.__proto__=proto},setPrototypeOf.polyfill=setPrototypeOf(setPrototypeOf({},null),Object.prototype)instanceof Object}return setPrototypeOf}(Object)};defineProperties(Object,ES5ObjectShims)}Object.setPrototypeOf&&Object.getPrototypeOf&&null!==Object.getPrototypeOf(Object.setPrototypeOf({},null))&&null===Object.getPrototypeOf(Object.create(null))&&(FAKENULL=Object.create(null),gpo=Object.getPrototypeOf,spo=Object.setPrototypeOf,Object.getPrototypeOf=function(o){var result=gpo(o);return result===FAKENULL?null:result},Object.setPrototypeOf=function(o,p){return spo(o,null===p?FAKENULL:p)},Object.setPrototypeOf.polyfill=!1);var objectKeysAcceptsPrimitives=!throwsError(function(){return Object.keys("foo")});Iif(!objectKeysAcceptsPrimitives){var originalObjectKeys=Object.keys;overrideNative(Object,"keys",function keys(value){return originalObjectKeys(ES.ToObject(value))}),keys=Object.keys}var objectKeysRejectsRegex=throwsError(function(){return Object.keys(/a/g)});Iif(objectKeysRejectsRegex){var regexRejectingObjectKeys=Object.keys;overrideNative(Object,"keys",function keys(value){if(Type.regex(value)){var regexKeys=[];for(var k in value)_hasOwnProperty(value,k)&&_push(regexKeys,k);return regexKeys}return regexRejectingObjectKeys(value)}),keys=Object.keys}Eif(Object.getOwnPropertyNames){var objectGOPNAcceptsPrimitives=!throwsError(function(){return Object.getOwnPropertyNames("foo")});Iif(!objectGOPNAcceptsPrimitives){var cachedWindowNames="object"==typeof window?Object.getOwnPropertyNames(window):[],originalObjectGetOwnPropertyNames=Object.getOwnPropertyNames;overrideNative(Object,"getOwnPropertyNames",function getOwnPropertyNames(value){var val=ES.ToObject(value);if("[object Window]"===_toString(val))try{return originalObjectGetOwnPropertyNames(val)}catch(e){return _concat([],cachedWindowNames)}return originalObjectGetOwnPropertyNames(val)})}}Eif(Object.getOwnPropertyDescriptor){var objectGOPDAcceptsPrimitives=!throwsError(function(){return Object.getOwnPropertyDescriptor("foo","bar")});Iif(!objectGOPDAcceptsPrimitives){var originalObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor;overrideNative(Object,"getOwnPropertyDescriptor",function getOwnPropertyDescriptor(value,property){return originalObjectGetOwnPropertyDescriptor(ES.ToObject(value),property)})}}Eif(Object.seal){var objectSealAcceptsPrimitives=!throwsError(function(){return Object.seal("foo")});Iif(!objectSealAcceptsPrimitives){var originalObjectSeal=Object.seal;overrideNative(Object,"seal",function seal(value){return ES.TypeIsObject(value)?originalObjectSeal(value):value})}}Eif(Object.isSealed){var objectIsSealedAcceptsPrimitives=!throwsError(function(){return Object.isSealed("foo")});Iif(!objectIsSealedAcceptsPrimitives){var originalObjectIsSealed=Object.isSealed;overrideNative(Object,"isSealed",function isSealed(value){return!ES.TypeIsObject(value)||originalObjectIsSealed(value)})}}Eif(Object.freeze){var objectFreezeAcceptsPrimitives=!throwsError(function(){return Object.freeze("foo")});Iif(!objectFreezeAcceptsPrimitives){var originalObjectFreeze=Object.freeze;overrideNative(Object,"freeze",function freeze(value){return ES.TypeIsObject(value)?originalObjectFreeze(value):value})}}Eif(Object.isFrozen){var objectIsFrozenAcceptsPrimitives=!throwsError(function(){return Object.isFrozen("foo")});Iif(!objectIsFrozenAcceptsPrimitives){var originalObjectIsFrozen=Object.isFrozen;overrideNative(Object,"isFrozen",function isFrozen(value){return!ES.TypeIsObject(value)||originalObjectIsFrozen(value)})}}Eif(Object.preventExtensions){var objectPreventExtensionsAcceptsPrimitives=!throwsError(function(){return Object.preventExtensions("foo")});Iif(!objectPreventExtensionsAcceptsPrimitives){var originalObjectPreventExtensions=Object.preventExtensions;overrideNative(Object,"preventExtensions",function preventExtensions(value){return ES.TypeIsObject(value)?originalObjectPreventExtensions(value):value})}}Eif(Object.isExtensible){var objectIsExtensibleAcceptsPrimitives=!throwsError(function(){return Object.isExtensible("foo")});Iif(!objectIsExtensibleAcceptsPrimitives){var originalObjectIsExtensible=Object.isExtensible;overrideNative(Object,"isExtensible",function isExtensible(value){return!!ES.TypeIsObject(value)&&originalObjectIsExtensible(value)})}}Eif(Object.getPrototypeOf){var objectGetProtoAcceptsPrimitives=!throwsError(function(){return Object.getPrototypeOf("foo")});Iif(!objectGetProtoAcceptsPrimitives){var originalGetProto=Object.getPrototypeOf;overrideNative(Object,"getPrototypeOf",function getPrototypeOf(value){return originalGetProto(ES.ToObject(value))})}}var desc,hasFlags=supportsDescriptors&&((desc=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags"))&&ES.IsCallable(desc.get));Iif(supportsDescriptors&&!hasFlags){var regExpFlagsGetter=function flags(){if(!ES.TypeIsObject(this))throw new TypeError("Method called on incompatible type: must be an object.");var result="";return this.global&&(result+="g"),this.ignoreCase&&(result+="i"),this.multiline&&(result+="m"),this.unicode&&(result+="u"),this.sticky&&(result+="y"),result};Value.getter(RegExp.prototype,"flags",regExpFlagsGetter)}var regex,regExpSupportsFlagsWithRegex=supportsDescriptors&&valueOrFalseIfThrows(function(){return"/a/i"===String(new RegExp(/a/g,"i"))}),regExpNeedsToSupportSymbolMatch=hasSymbols&&supportsDescriptors&&((regex=/./)[Symbol.match]=!1,RegExp(regex)===regex),regexToStringIsGeneric=valueOrFalseIfThrows(function(){return"/abc/"===RegExp.prototype.toString.call({source:"abc"})}),regexToStringSupportsGenericFlags=regexToStringIsGeneric&&valueOrFalseIfThrows(function(){return"/a/b"===RegExp.prototype.toString.call({source:"a",flags:"b"})});Eif(!regexToStringIsGeneric||!regexToStringSupportsGenericFlags){var origRegExpToString=RegExp.prototype.toString;defineProperty(RegExp.prototype,"toString",function toString(){var R=ES.RequireObjectCoercible(this);return Type.regex(R)?_call(origRegExpToString,R):"/"+$String(R.source)+"/"+$String(R.flags)},!0),Value.preserveToString(RegExp.prototype.toString,origRegExpToString)}Iif(supportsDescriptors&&(!regExpSupportsFlagsWithRegex||regExpNeedsToSupportSymbolMatch)){var flagsGetter=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get,sourceDesc=Object.getOwnPropertyDescriptor(RegExp.prototype,"source")||{},legacySourceGetter=function(){return this.source},sourceGetter=ES.IsCallable(sourceDesc.get)?sourceDesc.get:legacySourceGetter,OrigRegExp=RegExp,RegExpShim=function RegExp(pattern,flags){var patternIsRegExp=ES.IsRegExp(pattern);return this instanceof RegExp||!patternIsRegExp||void 0!==flags||pattern.constructor!==RegExp?Type.regex(pattern)?new RegExp(ES.Call(sourceGetter,pattern),void 0===flags?ES.Call(flagsGetter,pattern):flags):(patternIsRegExp&&(pattern.source,void 0===flags&&pattern.flags),new OrigRegExp(pattern,flags)):pattern};wrapConstructor(OrigRegExp,RegExpShim,{$input:!0}),RegExp=RegExpShim,Value.redefine(globals,"RegExp",RegExpShim)}Eif(supportsDescriptors){var regexGlobals={input:"$_",lastMatch:"$&",lastParen:"$+",leftContext:"$`",rightContext:"$'"};_forEach(keys(regexGlobals),function(prop){prop in RegExp&&!(regexGlobals[prop]in RegExp)&&Value.getter(RegExp,regexGlobals[prop],function get(){return RegExp[prop]})})}addDefaultSpecies(RegExp);var inverseEpsilon=1/Number.EPSILON,roundTiesToEven=function roundTiesToEven(n){return n+inverseEpsilon-inverseEpsilon},BINARY_32_EPSILON=Math.pow(2,-23),BINARY_32_MAX_VALUE=Math.pow(2,127)*(2-BINARY_32_EPSILON),BINARY_32_MIN_VALUE=Math.pow(2,-126),E=Math.E,LOG2E=Math.LOG2E,LOG10E=Math.LOG10E,numberCLZ=Number.prototype.clz;delete Number.prototype.clz;var MathShims={acosh:function acosh(value){var x=Number(value);if(numberIsNaN(x)||value<1)return NaN;if(1===x)return 0;if(x===1/0)return x;var xInvSquared=1/(x*x);if(x<2)return _log1p(x-1+_sqrt(1-xInvSquared)*x);var halfX=x/2;return _log1p(halfX+_sqrt(1-xInvSquared)*halfX-1)+1/LOG2E},asinh:function asinh(value){var x=Number(value);if(0===x||!globalIsFinite(x))return x;var a=_abs(x),aSquared=a*a,s=_sign(x);return a<1?s*_log1p(a+aSquared/(_sqrt(aSquared+1)+1)):s*(_log1p(a/2+_sqrt(1+1/aSquared)*a/2-1)+1/LOG2E)},atanh:function atanh(value){var x=Number(value);if(0===x)return x;if(-1===x)return-1/0;if(1===x)return 1/0;if(numberIsNaN(x)||x<-1||x>1)return NaN;var a=_abs(x);return _sign(x)*_log1p(2*a/(1-a))/2},cbrt:function cbrt(value){var x=Number(value);if(0===x)return x;var result,negate=x<0;return negate&&(x=-x),result=x===1/0?1/0:(x/((result=_exp(_log(x)/3))*result)+2*result)/3,negate?-result:result},clz32:function clz32(value){var x=Number(value),number=ES.ToUint32(x);return 0===number?32:numberCLZ?ES.Call(numberCLZ,number):31-_floor(_log(number+.5)*LOG2E)},cosh:function cosh(value){var x=Number(value);if(0===x)return 1;if(numberIsNaN(x))return NaN;if(!globalIsFinite(x))return 1/0;var t=_exp(_abs(x)-1);return(t+1/(t*E*E))*(E/2)},expm1:function expm1(value){var x=Number(value);if(x===-1/0)return-1;if(!globalIsFinite(x)||0===x)return x;if(_abs(x)>.5)return _exp(x)-1;for(var t=x,sum=0,n=1;sum+t!==sum;)sum+=t,t*=x/(n+=1);return sum},hypot:function hypot(x,y){for(var result=0,largest=0,i=0;i<arguments.length;++i){var value=_abs(Number(arguments[i]));largest<value?(result*=largest/value*(largest/value),result+=1,largest=value):result+=value>0?value/largest*(value/largest):value}return largest===1/0?1/0:largest*_sqrt(result)},log2:function log2(value){return _log(value)*LOG2E},log10:function log10(value){return _log(value)*LOG10E},log1p:_log1p,sign:_sign,sinh:function sinh(value){var x=Number(value);if(!globalIsFinite(x)||0===x)return x;var a=_abs(x);if(a<1){var u=Math.expm1(a);return _sign(x)*u*(1+1/(u+1))/2}var t=_exp(a-1);return _sign(x)*(t-1/(t*E*E))*(E/2)},tanh:function tanh(value){var x=Number(value);return numberIsNaN(x)||0===x?x:x>=20?1:x<=-20?-1:(Math.expm1(x)-Math.expm1(-x))/(_exp(x)+_exp(-x))},trunc:function trunc(value){var x=Number(value);return x<0?-_floor(-x):_floor(x)},imul:function imul(x,y){var a=ES.ToUint32(x),b=ES.ToUint32(y),al=65535&a,bl=65535&b;return al*bl+((a>>>16&65535)*bl+al*(b>>>16&65535)<<16>>>0)|0},fround:function fround(x){var v=Number(x);if(0===v||v===1/0||v===-1/0||numberIsNaN(v))return v;var sign=_sign(v),abs=_abs(v);if(abs<BINARY_32_MIN_VALUE)return sign*roundTiesToEven(abs/BINARY_32_MIN_VALUE/BINARY_32_EPSILON)*BINARY_32_MIN_VALUE*BINARY_32_EPSILON;var a=(1+BINARY_32_EPSILON/Number.EPSILON)*abs,result=a-(a-abs);return result>BINARY_32_MAX_VALUE||numberIsNaN(result)?sign*(1/0):sign*result}},withinULPDistance=function withinULPDistance(result,expected,distance){return _abs(1-result/expected)/Number.EPSILON<(distance||8)};defineProperties(Math,MathShims),defineProperty(Math,"sinh",MathShims.sinh,Math.sinh(710)===1/0),defineProperty(Math,"cosh",MathShims.cosh,Math.cosh(710)===1/0),defineProperty(Math,"log1p",MathShims.log1p,-1e-17!==Math.log1p(-1e-17)),defineProperty(Math,"asinh",MathShims.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7)),defineProperty(Math,"asinh",MathShims.asinh,Math.asinh(1e300)===1/0),defineProperty(Math,"atanh",MathShims.atanh,0===Math.atanh(1e-300)),defineProperty(Math,"tanh",MathShims.tanh,-2e-17!==Math.tanh(-2e-17)),defineProperty(Math,"acosh",MathShims.acosh,Math.acosh(Number.MAX_VALUE)===1/0),defineProperty(Math,"acosh",MathShims.acosh,!withinULPDistance(Math.acosh(1+Number.EPSILON),Math.sqrt(2*Number.EPSILON))),defineProperty(Math,"cbrt",MathShims.cbrt,!withinULPDistance(Math.cbrt(1e-300),1e-100)),defineProperty(Math,"sinh",MathShims.sinh,-2e-17!==Math.sinh(-2e-17));var expm1OfTen=Math.expm1(10);defineProperty(Math,"expm1",MathShims.expm1,expm1OfTen>22025.465794806718||expm1OfTen<22025.465794806718);var origMathRound=Math.round,roundHandlesBoundaryConditions=0===Math.round(.5-Number.EPSILON/4)&&1===Math.round(Number.EPSILON/3.99-.5),smallestPositiveNumberWhereRoundBreaks=inverseEpsilon+1,largestPositiveNumberWhereRoundBreaks=2*inverseEpsilon-1,roundDoesNotIncreaseIntegers=[smallestPositiveNumberWhereRoundBreaks,largestPositiveNumberWhereRoundBreaks].every(function(num){return Math.round(num)===num});defineProperty(Math,"round",function round(x){var floor=_floor(x);return x-floor<.5?floor:-1===floor?-0:floor+1},!roundHandlesBoundaryConditions||!roundDoesNotIncreaseIntegers),Value.preserveToString(Math.round,origMathRound);var origImul=Math.imul;-5!==Math.imul(4294967295,5)&&(Math.imul=MathShims.imul,Value.preserveToString(Math.imul,origImul)),2!==Math.imul.length&&overrideNative(Math,"imul",function imul(x,y){return ES.Call(origImul,Math,arguments)});var count,thenable,PromiseShim=function(){var setTimeout=globals.setTimeout;Eif("function"==typeof setTimeout||"object"==typeof setTimeout){ES.IsPromise=function(promise){return!!ES.TypeIsObject(promise)&&void 0!==promise._promise};var makeZeroTimeout,PromiseCapability=function(C){Iif(!ES.IsConstructor(C))throw new TypeError("Bad promise constructor");var capability=this;Iif(capability.resolve=void 0,capability.reject=void 0,capability.promise=new C(function(resolve,reject){Iif(void 0!==capability.resolve||void 0!==capability.reject)throw new TypeError("Bad Promise implementation!");capability.resolve=resolve,capability.reject=reject}),!ES.IsCallable(capability.resolve)||!ES.IsCallable(capability.reject))throw new TypeError("Bad promise constructor")};"undefined"!=typeof window&&ES.IsCallable(window.postMessage)&&(makeZeroTimeout=function(){var timeouts=[];return window.addEventListener("message",function(event){if(event.source===window&&"zero-timeout-message"===event.data){if(event.stopPropagation(),0===timeouts.length)return;_shift(timeouts)()}},!0),function(fn){_push(timeouts,fn),window.postMessage("zero-timeout-message","*")}});var P,pr,Promise$prototype,Promise$prototype$then,enqueue=ES.IsCallable(globals.setImmediate)?globals.setImmediate:"object"==typeof process&&process.nextTick?process.nextTick:(P=globals.Promise,(pr=P&&P.resolve&&P.resolve())&&function(task){return pr.then(task)}||(ES.IsCallable(makeZeroTimeout)?makeZeroTimeout():function(task){setTimeout(task,0)})),PROMISE_IDENTITY=function(x){return x},PROMISE_THROWER=function(e){throw e},PROMISE_FAKE_CAPABILITY={},enqueuePromiseReactionJob=function(handler,capability,argument){enqueue(function(){promiseReactionJob(handler,capability,argument)})},promiseReactionJob=function(handler,promiseCapability,argument){var handlerResult,f;if(promiseCapability===PROMISE_FAKE_CAPABILITY)return handler(argument);try{handlerResult=handler(argument),f=promiseCapability.resolve}catch(e){handlerResult=e,f=promiseCapability.reject}f(handlerResult)},fulfillPromise=function(promise,value){var _promise=promise._promise,length=_promise.reactionLength;if(length>0&&(enqueuePromiseReactionJob(_promise.fulfillReactionHandler0,_promise.reactionCapability0,value),_promise.fulfillReactionHandler0=void 0,_promise.rejectReactions0=void 0,_promise.reactionCapability0=void 0,length>1))for(var i=1,idx=0;i<length;i++,idx+=3)enqueuePromiseReactionJob(_promise[idx+0],_promise[idx+2],value),promise[idx+0]=void 0,promise[idx+1]=void 0,promise[idx+2]=void 0;_promise.result=value,_promise.state=1,_promise.reactionLength=0},rejectPromise=function(promise,reason){var _promise=promise._promise,length=_promise.reactionLength;if(length>0&&(enqueuePromiseReactionJob(_promise.rejectReactionHandler0,_promise.reactionCapability0,reason),_promise.fulfillReactionHandler0=void 0,_promise.rejectReactions0=void 0,_promise.reactionCapability0=void 0,length>1))for(var i=1,idx=0;i<length;i++,idx+=3)enqueuePromiseReactionJob(_promise[idx+1],_promise[idx+2],reason),promise[idx+0]=void 0,promise[idx+1]=void 0,promise[idx+2]=void 0;_promise.result=reason,_promise.state=2,_promise.reactionLength=0},createResolvingFunctions=function(promise){var alreadyResolved=!1;return{resolve:function(resolution){var then;if(!alreadyResolved){if(alreadyResolved=!0,resolution===promise)return rejectPromise(promise,new TypeError("Self resolution"));if(!ES.TypeIsObject(resolution))return fulfillPromise(promise,resolution);try{then=resolution.then}catch(e){return rejectPromise(promise,e)}if(!ES.IsCallable(then))return fulfillPromise(promise,resolution);enqueue(function(){promiseResolveThenableJob(promise,resolution,then)})}},reject:function(reason){if(!alreadyResolved)return alreadyResolved=!0,rejectPromise(promise,reason)}}},optimizedThen=function(then,thenable,resolve,reject){then===Promise$prototype$then?_call(then,thenable,resolve,reject,PROMISE_FAKE_CAPABILITY):_call(then,thenable,resolve,reject)},promiseResolveThenableJob=function(promise,thenable,then){var resolvingFunctions=createResolvingFunctions(promise),resolve=resolvingFunctions.resolve,reject=resolvingFunctions.reject;try{optimizedThen(then,thenable,resolve,reject)}catch(e){reject(e)}},Promise=function(){var PromiseShim=function Promise(resolver){Iif(!(this instanceof PromiseShim))throw new TypeError('Constructor Promise requires "new"');Iif(this&&this._promise)throw new TypeError("Bad construction");Iif(!ES.IsCallable(resolver))throw new TypeError("not a valid resolver");var promise=emulateES6construct(this,PromiseShim,Promise$prototype,{_promise:{result:void 0,state:0,reactionLength:0,fulfillReactionHandler0:void 0,rejectReactionHandler0:void 0,reactionCapability0:void 0}}),resolvingFunctions=createResolvingFunctions(promise),reject=resolvingFunctions.reject;try{resolver(resolvingFunctions.resolve,reject)}catch(e){reject(e)}return promise};return PromiseShim}();Promise$prototype=Promise.prototype;var _promiseAllResolver=function(index,values,capability,remaining){var alreadyCalled=!1;return function(x){alreadyCalled||(alreadyCalled=!0,values[index]=x,0==--remaining.count&&(0,capability.resolve)(values))}};return defineProperties(Promise,{all:function all(iterable){var C=this;if(!ES.TypeIsObject(C))throw new TypeError("Promise is not object");var iterator,iteratorRecord,capability=new PromiseCapability(C);try{return function(iteratorRecord,C,resultCapability){for(var next,nextValue,it=iteratorRecord.iterator,values=[],remaining={count:1},index=0;;){try{if(!1===(next=ES.IteratorStep(it))){iteratorRecord.done=!0;break}nextValue=next.value}catch(e){throw iteratorRecord.done=!0,e}values[index]=void 0;var nextPromise=C.resolve(nextValue),resolveElement=_promiseAllResolver(index,values,resultCapability,remaining);remaining.count+=1,optimizedThen(nextPromise.then,nextPromise,resolveElement,resultCapability.reject),index+=1}return 0==--remaining.count&&(0,resultCapability.resolve)(values),resultCapability.promise}(iteratorRecord={iterator:iterator=ES.GetIterator(iterable),done:!1},C,capability)}catch(e){var exception=e;if(iteratorRecord&&!iteratorRecord.done)try{ES.IteratorClose(iterator,!0)}catch(ee){exception=ee}return(0,capability.reject)(exception),capability.promise}},race:function race(iterable){var C=this;if(!ES.TypeIsObject(C))throw new TypeError("Promise is not object");var iterator,iteratorRecord,capability=new PromiseCapability(C);try{return function(iteratorRecord,C,resultCapability){for(var next,nextValue,nextPromise,it=iteratorRecord.iterator;;){try{if(!1===(next=ES.IteratorStep(it))){iteratorRecord.done=!0;break}nextValue=next.value}catch(e){throw iteratorRecord.done=!0,e}nextPromise=C.resolve(nextValue),optimizedThen(nextPromise.then,nextPromise,resultCapability.resolve,resultCapability.reject)}return resultCapability.promise}(iteratorRecord={iterator:iterator=ES.GetIterator(iterable),done:!1},C,capability)}catch(e){var exception=e;if(iteratorRecord&&!iteratorRecord.done)try{ES.IteratorClose(iterator,!0)}catch(ee){exception=ee}return(0,capability.reject)(exception),capability.promise}},reject:function reject(reason){if(!ES.TypeIsObject(this))throw new TypeError("Bad promise constructor");var capability=new PromiseCapability(this);return(0,capability.reject)(reason),capability.promise},resolve:function resolve(v){var C=this;if(!ES.TypeIsObject(C))throw new TypeError("Bad promise constructor");if(ES.IsPromise(v)&&v.constructor===C)return v;var capability=new PromiseCapability(C);return(0,capability.resolve)(v),capability.promise}}),defineProperties(Promise$prototype,{catch:function(onRejected){return this.then(null,onRejected)},then:function then(onFulfilled,onRejected){var promise=this;if(!ES.IsPromise(promise))throw new TypeError("not a promise");var resultCapability,C=ES.SpeciesConstructor(promise,Promise),returnValueIsIgnored=arguments.length>2&&arguments[2]===PROMISE_FAKE_CAPABILITY;resultCapability=returnValueIsIgnored&&C===Promise?PROMISE_FAKE_CAPABILITY:new PromiseCapability(C);var value,fulfillReactionHandler=ES.IsCallable(onFulfilled)?onFulfilled:PROMISE_IDENTITY,rejectReactionHandler=ES.IsCallable(onRejected)?onRejected:PROMISE_THROWER,_promise=promise._promise;if(0===_promise.state){if(0===_promise.reactionLength)_promise.fulfillReactionHandler0=fulfillReactionHandler,_promise.rejectReactionHandler0=rejectReactionHandler,_promise.reactionCapability0=resultCapability;else{var idx=3*(_promise.reactionLength-1);_promise[idx+0]=fulfillReactionHandler,_promise[idx+1]=rejectReactionHandler,_promise[idx+2]=resultCapability}_promise.reactionLength+=1}else if(1===_promise.state)value=_promise.result,enqueuePromiseReactionJob(fulfillReactionHandler,resultCapability,value);else{if(2!==_promise.state)throw new TypeError("unexpected Promise state");value=_promise.result,enqueuePromiseReactionJob(rejectReactionHandler,resultCapability,value)}return resultCapability.promise}}),PROMISE_FAKE_CAPABILITY=new PromiseCapability(Promise),Promise$prototype$then=Promise$prototype.then,Promise}}();Eif(globals.Promise&&(delete globals.Promise.accept,delete globals.Promise.defer,delete globals.Promise.prototype.chain),"function"==typeof PromiseShim){defineProperties(globals,{Promise:PromiseShim});var promiseSupportsSubclassing=supportsSubclassing(globals.Promise,function(S){return S.resolve(42).then(function(){})instanceof S}),promiseIgnoresNonFunctionThenCallbacks=!throwsError(function(){return globals.Promise.reject(42).then(null,5).then(null,noop)}),promiseRequiresObjectContext=throwsError(function(){return globals.Promise.call(3,noop)}),promiseResolveBroken=function(Promise){var p=Promise.resolve(5);p.constructor={};var p2=Promise.resolve(p);try{p2.then(null,noop).then(null,noop)}catch(e){return!0}return p===p2}(globals.Promise),getsThenSynchronously=supportsDescriptors&&(count=0,thenable=Object.defineProperty({},"then",{get:function(){count+=1}}),Promise.resolve(thenable),1===count),BadResolverPromise=function BadResolverPromise(executor){var p=new Promise(executor);executor(3,function(){}),this.then=p.then,this.constructor=BadResolverPromise};BadResolverPromise.prototype=Promise.prototype,BadResolverPromise.all=Promise.all;var hasBadResolverPromise=valueOrFalseIfThrows(function(){return!!BadResolverPromise.all([1,2])});Iif(promiseSupportsSubclassing&&promiseIgnoresNonFunctionThenCallbacks&&promiseRequiresObjectContext&&!promiseResolveBroken&&getsThenSynchronously&&!hasBadResolverPromise||(Promise=PromiseShim,overrideNative(globals,"Promise",PromiseShim)),1!==Promise.all.length){var origAll=Promise.all;overrideNative(Promise,"all",function all(iterable){return ES.Call(origAll,this,arguments)})}Iif(1!==Promise.race.length){var origRace=Promise.race;overrideNative(Promise,"race",function race(iterable){return ES.Call(origRace,this,arguments)})}Iif(1!==Promise.resolve.length){var origResolve=Promise.resolve;overrideNative(Promise,"resolve",function resolve(x){return ES.Call(origResolve,this,arguments)})}Iif(1!==Promise.reject.length){var origReject=Promise.reject;overrideNative(Promise,"reject",function reject(r){return ES.Call(origReject,this,arguments)})}ensureEnumerable(Promise,"all"),ensureEnumerable(Promise,"race"),ensureEnumerable(Promise,"resolve"),ensureEnumerable(Promise,"reject"),addDefaultSpecies(Promise)}var s,m,testOrder=function(a){var b=keys(_reduce(a,function(o,k){return o[k]=!0,o},{}));return a.join(":")===b.join(":")},preservesInsertionOrder=testOrder(["z","a","bb"]),preservesNumericInsertionOrder=testOrder(["z",1,"a","3",2]);Eif(supportsDescriptors){var fastkey=function fastkey(key,skipInsertionOrderCheck){return skipInsertionOrderCheck||preservesInsertionOrder?isNullOrUndefined(key)?"^"+ES.ToString(key):"string"==typeof key?"$"+key:"number"==typeof key?preservesNumericInsertionOrder?key:"n"+key:"boolean"==typeof key?"b"+key:null:null},emptyObject=function emptyObject(){return Object.create?Object.create(null):{}},addIterableToMap=function addIterableToMap(MapConstructor,map,iterable){if(isArray(iterable)||Type.string(iterable))_forEach(iterable,function(entry){if(!ES.TypeIsObject(entry))throw new TypeError("Iterator value "+entry+" is not an entry object");map.set(entry[0],entry[1])});else if(iterable instanceof MapConstructor)_call(MapConstructor.prototype.forEach,iterable,function(value,key){map.set(key,value)});else{var iter,adder;if(!isNullOrUndefined(iterable)){if(adder=map.set,!ES.IsCallable(adder))throw new TypeError("bad map");iter=ES.GetIterator(iterable)}if(void 0!==iter)for(;;){var next=ES.IteratorStep(iter);if(!1===next)break;var nextItem=next.value;try{if(!ES.TypeIsObject(nextItem))throw new TypeError("Iterator value "+nextItem+" is not an entry object");_call(adder,map,nextItem[0],nextItem[1])}catch(e){throw ES.IteratorClose(iter,!0),e}}}},addIterableToSet=function addIterableToSet(SetConstructor,set,iterable){if(isArray(iterable)||Type.string(iterable))_forEach(iterable,function(value){set.add(value)});else if(iterable instanceof SetConstructor)_call(SetConstructor.prototype.forEach,iterable,function(value){set.add(value)});else{var iter,adder;if(!isNullOrUndefined(iterable)){if(adder=set.add,!ES.IsCallable(adder))throw new TypeError("bad set");iter=ES.GetIterator(iterable)}if(void 0!==iter)for(;;){var next=ES.IteratorStep(iter);if(!1===next)break;var nextValue=next.value;try{_call(adder,set,nextValue)}catch(e){throw ES.IteratorClose(iter,!0),e}}}},collectionShims={Map:function(){var empty={},MapEntry=function MapEntry(key,value){this.key=key,this.value=value,this.next=null,this.prev=null};MapEntry.prototype.isRemoved=function isRemoved(){return this.key===empty};var Map$prototype,requireMapSlot=function requireMapSlot(map,method){if(!ES.TypeIsObject(map)||!function isMap(map){return!!map._es6map}(map))throw new TypeError("Method Map.prototype."+method+" called on incompatible receiver "+ES.ToString(map))},MapIterator=function MapIterator(map,kind){requireMapSlot(map,"[[MapIterator]]"),this.head=map._head,this.i=this.head,this.kind=kind};addIterator(MapIterator.prototype={isMapIterator:!0,next:function next(){if(!this.isMapIterator)throw new TypeError("Not a MapIterator");var result,i=this.i,kind=this.kind,head=this.head;if(void 0===this.i)return iteratorResult();for(;i.isRemoved()&&i!==head;)i=i.prev;for(;i.next!==head;)if(!(i=i.next).isRemoved())return result="key"===kind?i.key:"value"===kind?i.value:[i.key,i.value],this.i=i,iteratorResult(result);return this.i=void 0,iteratorResult()}});var MapShim=function Map(){if(!(this instanceof Map))throw new TypeError('Constructor Map requires "new"');if(this&&this._es6map)throw new TypeError("Bad construction");var map=emulateES6construct(this,Map,Map$prototype,{_es6map:!0,_head:null,_map:OrigMap?new OrigMap:null,_size:0,_storage:emptyObject()}),head=new MapEntry(null,null);return head.next=head.prev=head,map._head=head,arguments.length>0&&addIterableToMap(Map,map,arguments[0]),map};return Map$prototype=MapShim.prototype,Value.getter(Map$prototype,"size",function(){if(void 0===this._size)throw new TypeError("size method called on incompatible Map");return this._size}),defineProperties(Map$prototype,{get:function get(key){var entry;requireMapSlot(this,"get");var fkey=fastkey(key,!0);if(null!==fkey)return(entry=this._storage[fkey])?entry.value:void 0;if(this._map)return(entry=origMapGet.call(this._map,key))?entry.value:void 0;for(var head=this._head,i=head;(i=i.next)!==head;)if(ES.SameValueZero(i.key,key))return i.value},has:function has(key){requireMapSlot(this,"has");var fkey=fastkey(key,!0);if(null!==fkey)return void 0!==this._storage[fkey];if(this._map)return origMapHas.call(this._map,key);for(var head=this._head,i=head;(i=i.next)!==head;)if(ES.SameValueZero(i.key,key))return!0;return!1},set:function set(key,value){requireMapSlot(this,"set");var entry,head=this._head,i=head,fkey=fastkey(key,!0);if(null!==fkey){if(void 0!==this._storage[fkey])return this._storage[fkey].value=value,this;entry=this._storage[fkey]=new MapEntry(key,value),i=head.prev}else this._map&&(origMapHas.call(this._map,key)?origMapGet.call(this._map,key).value=value:(entry=new MapEntry(key,value),origMapSet.call(this._map,key,entry),i=head.prev));for(;(i=i.next)!==head;)if(ES.SameValueZero(i.key,key))return i.value=value,this;return entry=entry||new MapEntry(key,value),ES.SameValue(-0,key)&&(entry.key=0),entry.next=this._head,entry.prev=this._head.prev,entry.prev.next=entry,entry.next.prev=entry,this._size+=1,this},delete:function(key){requireMapSlot(this,"delete");var head=this._head,i=head,fkey=fastkey(key,!0);if(null!==fkey){if(void 0===this._storage[fkey])return!1;i=this._storage[fkey].prev,delete this._storage[fkey]}else if(this._map){if(!origMapHas.call(this._map,key))return!1;i=origMapGet.call(this._map,key).prev,origMapDelete.call(this._map,key)}for(;(i=i.next)!==head;)if(ES.SameValueZero(i.key,key))return i.key=empty,i.value=empty,i.prev.next=i.next,i.next.prev=i.prev,this._size-=1,!0;return!1},clear:function clear(){requireMapSlot(this,"clear"),this._map=OrigMap?new OrigMap:null,this._size=0,this._storage=emptyObject();for(var head=this._head,i=head,p=i.next;(i=p)!==head;)i.key=empty,i.value=empty,p=i.next,i.next=i.prev=head;head.next=head.prev=head},keys:function keys(){return requireMapSlot(this,"keys"),new MapIterator(this,"key")},values:function values(){return requireMapSlot(this,"values"),new MapIterator(this,"value")},entries:function entries(){return requireMapSlot(this,"entries"),new MapIterator(this,"key+value")},forEach:function forEach(callback){requireMapSlot(this,"forEach");for(var context=arguments.length>1?arguments[1]:null,it=this.entries(),entry=it.next();!entry.done;entry=it.next())context?_call(callback,context,entry.value[1],entry.value[0],this):callback(entry.value[1],entry.value[0],this)}}),addIterator(Map$prototype,Map$prototype.entries),MapShim}(),Set:function(){var Set$prototype,requireSetSlot=function requireSetSlot(set,method){if(!ES.TypeIsObject(set)||!function isSet(set){return set._es6set&&void 0!==set._storage}(set))throw new TypeError("Set.prototype."+method+" called on incompatible receiver "+ES.ToString(set))},SetShim=function Set(){if(!(this instanceof Set))throw new TypeError('Constructor Set requires "new"');if(this&&this._es6set)throw new TypeError("Bad construction");var set=emulateES6construct(this,Set,Set$prototype,{_es6set:!0,"[[SetData]]":null,_storage:emptyObject()});if(!set._es6set)throw new TypeError("bad set");return arguments.length>0&&addIterableToSet(Set,set,arguments[0]),set};Set$prototype=SetShim.prototype;var ensureMap=function ensureMap(set){if(!set["[[SetData]]"]){var m=new collectionShims.Map;set["[[SetData]]"]=m,_forEach(keys(set._storage),function(key){var k=function(key){var k=key;if("^null"===k)return null;if("^undefined"!==k){var first=k.charAt(0);return"$"===first?_strSlice(k,1):"n"===first?+_strSlice(k,1):"b"===first?"btrue"===k:+k}}(key);m.set(k,k)}),set["[[SetData]]"]=m}set._storage=null};Value.getter(SetShim.prototype,"size",function(){return requireSetSlot(this,"size"),this._storage?keys(this._storage).length:(ensureMap(this),this["[[SetData]]"].size)}),defineProperties(SetShim.prototype,{has:function has(key){var fkey;return requireSetSlot(this,"has"),this._storage&&null!==(fkey=fastkey(key))?!!this._storage[fkey]:(ensureMap(this),this["[[SetData]]"].has(key))},add:function add(key){var fkey;return requireSetSlot(this,"add"),this._storage&&null!==(fkey=fastkey(key))?(this._storage[fkey]=!0,this):(ensureMap(this),this["[[SetData]]"].set(key,key),this)},delete:function(key){var fkey;if(requireSetSlot(this,"delete"),this._storage&&null!==(fkey=fastkey(key))){var hasFKey=_hasOwnProperty(this._storage,fkey);return delete this._storage[fkey]&&hasFKey}return ensureMap(this),this["[[SetData]]"].delete(key)},clear:function clear(){requireSetSlot(this,"clear"),this._storage&&(this._storage=emptyObject()),this["[[SetData]]"]&&this["[[SetData]]"].clear()},values:function values(){return requireSetSlot(this,"values"),ensureMap(this),new SetIterator(this["[[SetData]]"].values())},entries:function entries(){return requireSetSlot(this,"entries"),ensureMap(this),new SetIterator(this["[[SetData]]"].entries())},forEach:function forEach(callback){requireSetSlot(this,"forEach");var context=arguments.length>1?arguments[1]:null,entireSet=this;ensureMap(entireSet),this["[[SetData]]"].forEach(function(value,key){context?_call(callback,context,key,key,entireSet):callback(key,key,entireSet)})}}),defineProperty(SetShim.prototype,"keys",SetShim.prototype.values,!0),addIterator(SetShim.prototype,SetShim.prototype.values);var SetIterator=function SetIterator(it){this.it=it};return SetIterator.prototype={isSetIterator:!0,next:function next(){if(!this.isSetIterator)throw new TypeError("Not a SetIterator");return this.it.next()}},addIterator(SetIterator.prototype),SetShim}()},isGoogleTranslate=globals.Set&&!Set.prototype.delete&&Set.prototype.remove&&Set.prototype.items&&Set.prototype.map&&Array.isArray((new Set).keys);Eif(isGoogleTranslate&&(globals.Set=collectionShims.Set),globals.Map||globals.Set){var mapAcceptsArguments=valueOrFalseIfThrows(function(){return 2===new Map([[1,2]]).get(1)});mapAcceptsArguments||(globals.Map=function Map(){if(!(this instanceof Map))throw new TypeError('Constructor Map requires "new"');var m=new OrigMap;return arguments.length>0&&addIterableToMap(Map,m,arguments[0]),delete m.constructor,Object.setPrototypeOf(m,globals.Map.prototype),m},globals.Map.prototype=create(OrigMap.prototype),defineProperty(globals.Map.prototype,"constructor",globals.Map,!0),Value.preserveToString(globals.Map,OrigMap));var testMap=new Map,mapUsesSameValueZero=((m=new Map([[1,0],[2,0],[3,0],[4,0]])).set(-0,m),m.get(0)===m&&m.get(-0)===m&&m.has(0)&&m.has(-0)),mapSupportsChaining=testMap.set(1,2)===testMap;mapUsesSameValueZero&&mapSupportsChaining||overrideNative(Map.prototype,"set",function set(k,v){return _call(origMapSet,this,0===k?0:k,v),this}),mapUsesSameValueZero||(defineProperties(Map.prototype,{get:function get(k){return _call(origMapGet,this,0===k?0:k)},has:function has(k){return _call(origMapHas,this,0===k?0:k)}},!0),Value.preserveToString(Map.prototype.get,origMapGet),Value.preserveToString(Map.prototype.has,origMapHas));var testSet=new Set,setUsesSameValueZero=Set.prototype.delete&&Set.prototype.add&&Set.prototype.has&&((s=testSet).delete(0),s.add(-0),!s.has(0)),setSupportsChaining=testSet.add(1)===testSet;Eif(!setUsesSameValueZero||!setSupportsChaining){var origSetAdd=Set.prototype.add;Set.prototype.add=function add(v){return _call(origSetAdd,this,0===v?0:v),this},Value.preserveToString(Set.prototype.add,origSetAdd)}Eif(!setUsesSameValueZero){var origSetHas=Set.prototype.has;Set.prototype.has=function has(v){return _call(origSetHas,this,0===v?0:v)},Value.preserveToString(Set.prototype.has,origSetHas);var origSetDel=Set.prototype.delete;Set.prototype.delete=function SetDelete(v){return _call(origSetDel,this,0===v?0:v)},Value.preserveToString(Set.prototype.delete,origSetDel)}var mapSupportsSubclassing=supportsSubclassing(globals.Map,function(M){var m=new M([]);return m.set(42,42),m instanceof M}),mapFailsToSupportSubclassing=Object.setPrototypeOf&&!mapSupportsSubclassing,mapRequiresNew=function(){try{return!(globals.Map()instanceof globals.Map)}catch(e){return e instanceof TypeError}}();0===globals.Map.length&&!mapFailsToSupportSubclassing&&mapRequiresNew||(globals.Map=function Map(){if(!(this instanceof Map))throw new TypeError('Constructor Map requires "new"');var m=new OrigMap;return arguments.length>0&&addIterableToMap(Map,m,arguments[0]),delete m.constructor,Object.setPrototypeOf(m,Map.prototype),m},globals.Map.prototype=OrigMap.prototype,defineProperty(globals.Map.prototype,"constructor",globals.Map,!0),Value.preserveToString(globals.Map,OrigMap));var setSupportsSubclassing=supportsSubclassing(globals.Set,function(S){var s=new S([]);return s.add(42,42),s instanceof S}),setFailsToSupportSubclassing=Object.setPrototypeOf&&!setSupportsSubclassing,setRequiresNew=function(){try{return!(globals.Set()instanceof globals.Set)}catch(e){return e instanceof TypeError}}();Iif(0!==globals.Set.length||setFailsToSupportSubclassing||!setRequiresNew){var OrigSet=globals.Set;globals.Set=function Set(){if(!(this instanceof Set))throw new TypeError('Constructor Set requires "new"');var s=new OrigSet;return arguments.length>0&&addIterableToSet(Set,s,arguments[0]),delete s.constructor,Object.setPrototypeOf(s,Set.prototype),s},globals.Set.prototype=OrigSet.prototype,defineProperty(globals.Set.prototype,"constructor",globals.Set,!0),Value.preserveToString(globals.Set,OrigSet)}var newMap=new globals.Map,mapIterationThrowsStopIterator=!valueOrFalseIfThrows(function(){return newMap.keys().next().done});Iif(("function"!=typeof globals.Map.prototype.clear||0!==(new globals.Set).size||0!==newMap.size||"function"!=typeof globals.Map.prototype.keys||"function"!=typeof globals.Set.prototype.keys||"function"!=typeof globals.Map.prototype.forEach||"function"!=typeof globals.Set.prototype.forEach||isCallableWithoutNew(globals.Map)||isCallableWithoutNew(globals.Set)||"function"!=typeof newMap.keys().next||mapIterationThrowsStopIterator||!mapSupportsSubclassing)&&defineProperties(globals,{Map:collectionShims.Map,Set:collectionShims.Set},!0),globals.Set.prototype.keys!==globals.Set.prototype.values&&defineProperty(globals.Set.prototype,"keys",globals.Set.prototype.values,!0),addIterator(Object.getPrototypeOf((new globals.Map).keys())),addIterator(Object.getPrototypeOf((new globals.Set).keys())),functionsHaveNames&&"has"!==globals.Set.prototype.has.name){var anonymousSetHas=globals.Set.prototype.has;overrideNative(globals.Set.prototype,"has",function has(key){return _call(anonymousSetHas,this,key)})}}defineProperties(globals,collectionShims),addDefaultSpecies(globals.Map),addDefaultSpecies(globals.Set)}var throwUnlessTargetIsObject=function throwUnlessTargetIsObject(target){Iif(!ES.TypeIsObject(target))throw new TypeError("target must be an object")},ReflectShims={apply:function apply(){return ES.Call(ES.Call,null,arguments)},construct:function construct(constructor,args){if(!ES.IsConstructor(constructor))throw new TypeError("First argument must be a constructor.");var newTarget=arguments.length>2?arguments[2]:constructor;if(!ES.IsConstructor(newTarget))throw new TypeError("new.target must be a constructor.");return ES.Construct(constructor,args,newTarget,"internal")},deleteProperty:function deleteProperty(target,key){if(throwUnlessTargetIsObject(target),supportsDescriptors){var desc=Object.getOwnPropertyDescriptor(target,key);if(desc&&!desc.configurable)return!1}return delete target[key]},has:function has(target,key){return throwUnlessTargetIsObject(target),key in target}};Object.getOwnPropertyNames&&Object.assign(ReflectShims,{ownKeys:function ownKeys(target){throwUnlessTargetIsObject(target);var keys=Object.getOwnPropertyNames(target);return ES.IsCallable(Object.getOwnPropertySymbols)&&_pushApply(keys,Object.getOwnPropertySymbols(target)),keys}});var callAndCatchException=function ConvertExceptionToBoolean(func){return!throwsError(func)};Eif(Object.preventExtensions&&Object.assign(ReflectShims,{isExtensible:function isExtensible(target){return throwUnlessTargetIsObject(target),Object.isExtensible(target)},preventExtensions:function preventExtensions(target){return throwUnlessTargetIsObject(target),callAndCatchException(function(){return Object.preventExtensions(target)})}}),supportsDescriptors){var internalGet=function get(target,key,receiver){var desc=Object.getOwnPropertyDescriptor(target,key);if(!desc){var parent=Object.getPrototypeOf(target);if(null===parent)return;return internalGet(parent,key,receiver)}return"value"in desc?desc.value:desc.get?ES.Call(desc.get,receiver):void 0},internalSet=function set(target,key,value,receiver){var desc=Object.getOwnPropertyDescriptor(target,key);if(!desc){var parent=Object.getPrototypeOf(target);if(null!==parent)return internalSet(parent,key,value,receiver);desc={value:void 0,writable:!0,enumerable:!0,configurable:!0}}return"value"in desc?!!desc.writable&&!!ES.TypeIsObject(receiver)&&(Object.getOwnPropertyDescriptor(receiver,key)?Reflect.defineProperty(receiver,key,{value:value}):Reflect.defineProperty(receiver,key,{value:value,writable:!0,enumerable:!0,configurable:!0})):!!desc.set&&(_call(desc.set,receiver,value),!0)};Object.assign(ReflectShims,{defineProperty:function defineProperty(target,propertyKey,attributes){return throwUnlessTargetIsObject(target),callAndCatchException(function(){return Object.defineProperty(target,propertyKey,attributes)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(target,propertyKey){return throwUnlessTargetIsObject(target),Object.getOwnPropertyDescriptor(target,propertyKey)},get:function get(target,key){throwUnlessTargetIsObject(target);var receiver=arguments.length>2?arguments[2]:target;return internalGet(target,key,receiver)},set:function set(target,key,value){throwUnlessTargetIsObject(target);var receiver=arguments.length>3?arguments[3]:target;return internalSet(target,key,value,receiver)}})}Eif(Object.getPrototypeOf){var objectDotGetPrototypeOf=Object.getPrototypeOf;ReflectShims.getPrototypeOf=function getPrototypeOf(target){return throwUnlessTargetIsObject(target),objectDotGetPrototypeOf(target)}}Eif(Object.setPrototypeOf&&ReflectShims.getPrototypeOf){var willCreateCircularPrototype=function(object,lastProto){for(var proto=lastProto;proto;){if(object===proto)return!0;proto=ReflectShims.getPrototypeOf(proto)}return!1};Object.assign(ReflectShims,{setPrototypeOf:function setPrototypeOf(object,proto){if(throwUnlessTargetIsObject(object),null!==proto&&!ES.TypeIsObject(proto))throw new TypeError("proto must be an object or null");return proto===Reflect.getPrototypeOf(object)||!(Reflect.isExtensible&&!Reflect.isExtensible(object))&&!willCreateCircularPrototype(object,proto)&&(Object.setPrototypeOf(object,proto),!0)}})}var defineOrOverrideReflectProperty=function(key,shim){ES.IsCallable(globals.Reflect[key])?valueOrFalseIfThrows(function(){return globals.Reflect[key](1),globals.Reflect[key](NaN),globals.Reflect[key](!0),!0})&&overrideNative(globals.Reflect,key,shim):defineProperty(globals.Reflect,key,shim)};Object.keys(ReflectShims).forEach(function(key){defineOrOverrideReflectProperty(key,ReflectShims[key])});var originalReflectGetProto=globals.Reflect.getPrototypeOf;Iif(functionsHaveNames&&originalReflectGetProto&&"getPrototypeOf"!==originalReflectGetProto.name&&overrideNative(globals.Reflect,"getPrototypeOf",function getPrototypeOf(target){return _call(originalReflectGetProto,globals.Reflect,target)}),globals.Reflect.setPrototypeOf&&valueOrFalseIfThrows(function(){return globals.Reflect.setPrototypeOf(1,{}),!0})&&overrideNative(globals.Reflect,"setPrototypeOf",ReflectShims.setPrototypeOf),globals.Reflect.defineProperty&&(valueOrFalseIfThrows(function(){var basic=!globals.Reflect.defineProperty(1,"test",{value:1}),extensible="function"!=typeof Object.preventExtensions||!globals.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return basic&&extensible})||overrideNative(globals.Reflect,"defineProperty",ReflectShims.defineProperty)),globals.Reflect.construct&&(valueOrFalseIfThrows(function(){var F=function F(){};return globals.Reflect.construct(function(){},[],F)instanceof F})||overrideNative(globals.Reflect,"construct",ReflectShims.construct)),"Invalid Date"!==String(new Date(NaN))){var dateToString=Date.prototype.toString,shimmedDateToString=function toString(){var valueOf=+this;return valueOf!=valueOf?"Invalid Date":ES.Call(dateToString,this)};overrideNative(Date.prototype,"toString",shimmedDateToString)}var stringHTMLshims={anchor:function anchor(name){return ES.CreateHTML(this,"a","name",name)},big:function big(){return ES.CreateHTML(this,"big","","")},blink:function blink(){return ES.CreateHTML(this,"blink","","")},bold:function bold(){return ES.CreateHTML(this,"b","","")},fixed:function fixed(){return ES.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(color){return ES.CreateHTML(this,"font","color",color)},fontsize:function fontsize(size){return ES.CreateHTML(this,"font","size",size)},italics:function italics(){return ES.CreateHTML(this,"i","","")},link:function link(url){return ES.CreateHTML(this,"a","href",url)},small:function small(){return ES.CreateHTML(this,"small","","")},strike:function strike(){return ES.CreateHTML(this,"strike","","")},sub:function sub(){return ES.CreateHTML(this,"sub","","")},sup:function sub(){return ES.CreateHTML(this,"sup","","")}};_forEach(Object.keys(stringHTMLshims),function(key){var method=String.prototype[key],shouldOverwrite=!1;Eif(ES.IsCallable(method)){var output=_call(method,"",' " '),quotesCount=_concat([],output.match(/"/g)).length;shouldOverwrite=output!==output.toLowerCase()||quotesCount>2}else shouldOverwrite=!0;shouldOverwrite&&overrideNative(String.prototype,key,stringHTMLshims[key])});var JSONstringifiesSymbols=function(){Iif(!hasSymbols)return!1;var stringify="object"==typeof JSON&&"function"==typeof JSON.stringify?JSON.stringify:null;Iif(!stringify)return!1;Iif(void 0!==stringify(Symbol()))return!0;Iif("[null]"!==stringify([Symbol()]))return!0;var obj={a:Symbol()};return obj[Symbol()]=!0,"{}"!==stringify(obj)}(),JSONstringifyAcceptsObjectSymbol=valueOrFalseIfThrows(function(){return!hasSymbols||"{}"===JSON.stringify(Object(Symbol()))&&"[{}]"===JSON.stringify([Object(Symbol())])});Iif(JSONstringifiesSymbols||!JSONstringifyAcceptsObjectSymbol){var origStringify=JSON.stringify;overrideNative(JSON,"stringify",function stringify(value){if("symbol"!=typeof value){var replacer;arguments.length>1&&(replacer=arguments[1]);var args=[value];if(isArray(replacer))args.push(replacer);else{var replaceFn=ES.IsCallable(replacer)?replacer:null,wrappedReplacer=function(key,val){var parsedValue=replaceFn?_call(replaceFn,this,key,val):val;if("symbol"!=typeof parsedValue)return Type.symbol(parsedValue)?assignTo({})(parsedValue):parsedValue};args.push(wrappedReplacer)}return arguments.length>2&&args.push(arguments[2]),origStringify.apply(this,args)}})}return globals})?__WEBPACK_AMD_DEFINE_FACTORY__.call(exports,__webpack_require__,exports,module):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}).call(this,__webpack_require__(18),__webpack_require__(176))},function(module,exports,__webpack_require__){"use strict";var supportsDescriptors=__webpack_require__(13).supportsDescriptors,functionsHaveNames=__webpack_require__(178)(),getPolyfill=__webpack_require__(285),defineProperty=Object.defineProperty,TypeErr=TypeError;module.exports=function shimName(){var polyfill=getPolyfill();Eif(functionsHaveNames)return polyfill;if(!supportsDescriptors)throw new TypeErr("Shimming Function.prototype.name support requires ES5 property descriptor support.");var functionProto=Function.prototype;return defineProperty(functionProto,"name",{configurable:!0,enumerable:!1,get:function(){var name=polyfill.call(this);return this!==functionProto&&defineProperty(this,"name",{configurable:!0,enumerable:!1,value:name,writable:!1}),name}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var keysShim;if(!Object.keys){var has=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,isArgs=__webpack_require__(177),isEnumerable=Object.prototype.propertyIsEnumerable,hasDontEnumBug=!isEnumerable.call({toString:null},"toString"),hasProtoEnumBug=isEnumerable.call(function(){},"prototype"),dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],equalsConstructorPrototype=function(o){var ctor=o.constructor;return ctor&&ctor.prototype===o},excludedKeys={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},hasAutomationEqualityBug=function(){if("undefined"==typeof window)return!1;for(var k in window)try{if(!excludedKeys["$"+k]&&has.call(window,k)&&null!==window[k]&&"object"==typeof window[k])try{equalsConstructorPrototype(window[k])}catch(e){return!0}}catch(e){return!0}return!1}();keysShim=function keys(object){var isObject=null!==object&&"object"==typeof object,isFunction="[object Function]"===toStr.call(object),isArguments=isArgs(object),isString=isObject&&"[object String]"===toStr.call(object),theKeys=[];if(!isObject&&!isFunction&&!isArguments)throw new TypeError("Object.keys called on a non-object");var skipProto=hasProtoEnumBug&&isFunction;if(isString&&object.length>0&&!has.call(object,0))for(var i=0;i<object.length;++i)theKeys.push(String(i));if(isArguments&&object.length>0)for(var j=0;j<object.length;++j)theKeys.push(String(j));else for(var name in object)skipProto&&"prototype"===name||!has.call(object,name)||theKeys.push(String(name));if(hasDontEnumBug)for(var skipConstructor=function(o){if("undefined"==typeof window||!hasAutomationEqualityBug)return equalsConstructorPrototype(o);try{return equalsConstructorPrototype(o)}catch(e){return!1}}(object),k=0;k<dontEnums.length;++k)skipConstructor&&"constructor"===dontEnums[k]||!has.call(object,dontEnums[k])||theKeys.push(dontEnums[k]);return theKeys}}module.exports=keysShim},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(286);module.exports=function getPolyfill(){return implementation}},function(module,exports,__webpack_require__){"use strict";var isCallable=__webpack_require__(97),functionsHaveNames=__webpack_require__(178)(),bind=__webpack_require__(23),functionToString=bind.call(Function.call,Function.prototype.toString),stringMatch=bind.call(Function.call,String.prototype.match),classRegex=/^class /,regex=/\s*function\s+([^(\s]*)\s*/,functionProto=Function.prototype;module.exports=function getName(){if(!function isClassConstructor(fn){if(isCallable(fn))return!1;if("function"!=typeof fn)return!1;try{return!!stringMatch(functionToString(fn),classRegex)}catch(e){}return!1}(this)&&!isCallable(this))throw new TypeError("Function.prototype.name sham getter called on non-function");if(functionsHaveNames)return this.name;if(this===functionProto)return"";var str=functionToString(this),match=stringMatch(str,regex);return match&&match[1]}},function(module,exports,__webpack_require__){"use strict";var ERROR_MESSAGE="Function.prototype.bind called on incompatible ",slice=Array.prototype.slice,toStr=Object.prototype.toString;module.exports=function bind(that){var target=this;if("function"!=typeof target||"[object Function]"!==toStr.call(target))throw new TypeError(ERROR_MESSAGE+target);for(var bound,args=slice.call(arguments,1),binder=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))},boundLength=Math.max(0,target.length-args.length),boundArgs=[],i=0;i<boundLength;i++)boundArgs.push("$"+i);if(bound=Function("binder","return function ("+boundArgs.join(",")+"){ return binder.apply(this,arguments); }")(binder),target.prototype){var Empty=function Empty(){};Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null}return bound}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(289)(),__webpack_require__(299)},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),getPolyfill=__webpack_require__(290);module.exports=function shimArrayPrototypeIncludes(){var polyfill=getPolyfill();return define(Array.prototype,{includes:polyfill},{includes:function(){return Array.prototype.includes!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(291);module.exports=function getPolyfill(){return Array.prototype.includes||implementation}},function(module,exports,__webpack_require__){"use strict";(function(global){var ES=__webpack_require__(292),$isNaN=Number.isNaN||function isNaN(a){return a!=a},$isFinite=Number.isFinite||function isFinite(n){return"number"==typeof n&&global.isFinite(n)},indexOf=Array.prototype.indexOf;module.exports=function includes(searchElement){var fromIndex=arguments.length>1?ES.ToInteger(arguments[1]):0;if(indexOf&&!$isNaN(searchElement)&&$isFinite(fromIndex)&&void 0!==searchElement)return indexOf.apply(this,arguments)>-1;var O=ES.ToObject(this),length=ES.ToLength(O.length);if(0===length)return!1;for(var k=fromIndex>=0?fromIndex:Math.max(0,length+fromIndex);k<length;){if(ES.SameValueZero(searchElement,O[k]))return!0;k+=1}return!1}}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(138)},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(294)},function(module,exports,__webpack_require__){"use strict";var hasSymbols="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator,isPrimitive=__webpack_require__(179),isCallable=__webpack_require__(97),isDate=__webpack_require__(295),isSymbol=__webpack_require__(180),ordinaryToPrimitive=function OrdinaryToPrimitive(O,hint){if(null==O)throw new TypeError("Cannot call method on "+O);if("string"!=typeof hint||"number"!==hint&&"string"!==hint)throw new TypeError('hint must be "string" or "number"');var method,result,i,methodNames="string"===hint?["toString","valueOf"]:["valueOf","toString"];for(i=0;i<methodNames.length;++i)if(method=O[methodNames[i]],isCallable(method)&&(result=method.call(O),isPrimitive(result)))return result;throw new TypeError("No default value")},GetMethod=function GetMethod(O,P){var func=O[P];if(null!=func){if(!isCallable(func))throw new TypeError(func+" returned for property "+P+" of object "+O+" is not a function");return func}};module.exports=function ToPrimitive(input){if(isPrimitive(input))return input;var exoticToPrim,hint="default";if(arguments.length>1&&(arguments[1]===String?hint="string":arguments[1]===Number&&(hint="number")),hasSymbols&&(Symbol.toPrimitive?exoticToPrim=GetMethod(input,Symbol.toPrimitive):isSymbol(input)&&(exoticToPrim=Symbol.prototype.valueOf)),void 0!==exoticToPrim){var result=exoticToPrim.call(input,hint);if(isPrimitive(result))return result;throw new TypeError("unable to convert exotic object to primitive")}return"default"===hint&&(isDate(input)||isSymbol(input))&&(hint="string"),ordinaryToPrimitive(input,"default"===hint?"number":hint)}},function(module,exports,__webpack_require__){"use strict";var getDay=Date.prototype.getDay,toStr=Object.prototype.toString,hasToStringTag="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;module.exports=function isDateObject(value){return"object"==typeof value&&null!==value&&(hasToStringTag?function tryDateObject(value){try{return getDay.call(value),!0}catch(e){return!1}}(value):"[object Date]"===toStr.call(value))}},function(module,exports,__webpack_require__){"use strict";module.exports=function hasSymbols(){Iif("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;Eif("symbol"==typeof Symbol.iterator)return!0;var obj={},sym=Symbol("test"),symObj=Object(sym);if("string"==typeof sym)return!1;if("[object Symbol]"!==Object.prototype.toString.call(sym))return!1;if("[object Symbol]"!==Object.prototype.toString.call(symObj))return!1;for(sym in obj[sym]=42,obj)return!1;if("function"==typeof Object.keys&&0!==Object.keys(obj).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(obj).length)return!1;var syms=Object.getOwnPropertySymbols(obj);if(1!==syms.length||syms[0]!==sym)return!1;if(!Object.prototype.propertyIsEnumerable.call(obj,sym))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var descriptor=Object.getOwnPropertyDescriptor(obj,sym);if(42!==descriptor.value||!0!==descriptor.enumerable)return!1}return!0}},function(module,exports){module.exports=function isPrimitive(value){return null===value||"function"!=typeof value&&"object"!=typeof value}},function(module,exports,__webpack_require__){"use strict";var toStr=Object.prototype.toString,isPrimitive=__webpack_require__(179),isCallable=__webpack_require__(97),ES5internalSlots___DefaultValue__=function(O){var actualHint;if((actualHint=arguments.length>1?arguments[1]:"[object Date]"===toStr.call(O)?String:Number)===String||actualHint===Number){var value,i,methods=actualHint===String?["toString","valueOf"]:["valueOf","toString"];for(i=0;i<methods.length;++i)if(isCallable(O[methods[i]])&&(value=O[methods[i]](),isPrimitive(value)))return value;throw new TypeError("No default value")}throw new TypeError("invalid [[DefaultValue]] hint supplied")};module.exports=function ToPrimitive(input){return isPrimitive(input)?input:arguments.length>1?ES5internalSlots___DefaultValue__(input,arguments[1]):ES5internalSlots___DefaultValue__(input)}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(300)(),__webpack_require__(303)(),__webpack_require__(306)(),__webpack_require__(309)(),__webpack_require__(312)(),__webpack_require__(315)},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(301),define=__webpack_require__(13);module.exports=function shimValues(){var polyfill=getPolyfill();return define(Object,{values:polyfill},{values:function testValues(){return Object.values!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(302);module.exports=function getPolyfill(){return"function"==typeof Object.values?Object.values:implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(68),has=__webpack_require__(67),isEnumerable=__webpack_require__(23).call(Function.call,Object.prototype.propertyIsEnumerable);module.exports=function values(O){var obj=ES.RequireObjectCoercible(O),vals=[];for(var key in obj)has(obj,key)&&isEnumerable(obj,key)&&vals.push(obj[key]);return vals}},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(304),define=__webpack_require__(13);module.exports=function shimEntries(){var polyfill=getPolyfill();return define(Object,{entries:polyfill},{entries:function testEntries(){return Object.entries!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(305);module.exports=function getPolyfill(){return"function"==typeof Object.entries?Object.entries:implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(68),has=__webpack_require__(67),isEnumerable=__webpack_require__(23).call(Function.call,Object.prototype.propertyIsEnumerable);module.exports=function entries(O){var obj=ES.RequireObjectCoercible(O),entrys=[];for(var key in obj)has(obj,key)&&isEnumerable(obj,key)&&entrys.push([key,obj[key]]);return entrys}},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(307),define=__webpack_require__(13);module.exports=function shimPadStart(){var polyfill=getPolyfill();return define(String.prototype,{padStart:polyfill},{padStart:function(){return String.prototype.padStart!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(308);module.exports=function getPolyfill(){return"function"==typeof String.prototype.padStart?String.prototype.padStart:implementation}},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(23),ES=__webpack_require__(68),slice=bind.call(Function.call,String.prototype.slice);module.exports=function padStart(maxLength){var fillString,O=ES.RequireObjectCoercible(this),S=ES.ToString(O),stringLength=ES.ToLength(S.length);arguments.length>1&&(fillString=arguments[1]);var filler=void 0===fillString?"":ES.ToString(fillString);""===filler&&(filler=" ");var intMaxLength=ES.ToLength(maxLength);if(intMaxLength<=stringLength)return S;for(var fillLen=intMaxLength-stringLength;filler.length<fillLen;){var fLen=filler.length,remainingCodeUnits=fillLen-fLen;filler+=fLen>remainingCodeUnits?slice(filler,0,remainingCodeUnits):filler}var truncatedStringFiller=filler.length>fillLen?slice(filler,0,fillLen):filler;return truncatedStringFiller+S}},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(310),define=__webpack_require__(13);module.exports=function shimPadEnd(){var polyfill=getPolyfill();return define(String.prototype,{padEnd:polyfill},{padEnd:function(){return String.prototype.padEnd!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(311);module.exports=function getPolyfill(){return"function"==typeof String.prototype.padEnd?String.prototype.padEnd:implementation}},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(23),ES=__webpack_require__(68),slice=bind.call(Function.call,String.prototype.slice);module.exports=function padEnd(maxLength){var fillString,O=ES.RequireObjectCoercible(this),S=ES.ToString(O),stringLength=ES.ToLength(S.length);arguments.length>1&&(fillString=arguments[1]);var filler=void 0===fillString?"":ES.ToString(fillString);""===filler&&(filler=" ");var intMaxLength=ES.ToLength(maxLength);if(intMaxLength<=stringLength)return S;for(var fillLen=intMaxLength-stringLength;filler.length<fillLen;){var fLen=filler.length,remainingCodeUnits=fillLen-fLen;filler+=fLen>remainingCodeUnits?slice(filler,0,remainingCodeUnits):filler}var truncatedStringFiller=filler.length>fillLen?slice(filler,0,fillLen):filler;return S+truncatedStringFiller}},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(313),define=__webpack_require__(13);module.exports=function shimGetOwnPropertyDescriptors(){var polyfill=getPolyfill();return define(Object,{getOwnPropertyDescriptors:polyfill},{getOwnPropertyDescriptors:function(){return Object.getOwnPropertyDescriptors!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(314);module.exports=function getPolyfill(){return"function"==typeof Object.getOwnPropertyDescriptors?Object.getOwnPropertyDescriptors:implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(68),defineProperty=Object.defineProperty,getDescriptor=Object.getOwnPropertyDescriptor,getOwnNames=Object.getOwnPropertyNames,getSymbols=Object.getOwnPropertySymbols,concat=Function.call.bind(Array.prototype.concat),reduce=Function.call.bind(Array.prototype.reduce),getAll=getSymbols?function(obj){return concat(getOwnNames(obj),getSymbols(obj))}:getOwnNames,isES5=ES.IsCallable(getDescriptor)&&ES.IsCallable(getOwnNames);module.exports=function getOwnPropertyDescriptors(value){if(ES.RequireObjectCoercible(value),!isES5)throw new TypeError("getOwnPropertyDescriptors requires Object.getOwnPropertyDescriptor");var O=ES.ToObject(value);return reduce(getAll(O),function(acc,key){var descriptor=getDescriptor(O,key);return void 0!==descriptor&&function put(obj,prop,val){defineProperty&&prop in obj?defineProperty(obj,prop,{configurable:!0,enumerable:!0,value:val,writable:!0}):obj[prop]=val}(acc,key,descriptor),acc},{})}},function(module,exports,__webpack_require__){"use strict";"function"==typeof Promise&&__webpack_require__(316),__webpack_require__(320)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(317)()},function(module,exports,__webpack_require__){"use strict";var requirePromise=__webpack_require__(140),getPolyfill=__webpack_require__(318),define=__webpack_require__(13);module.exports=function shimPromiseFinally(){requirePromise();var polyfill=getPolyfill();return define(Promise.prototype,{finally:polyfill},{finally:function testFinally(){return Promise.prototype.finally!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var requirePromise=__webpack_require__(140),implementation=__webpack_require__(319);module.exports=function getPolyfill(){return requirePromise(),"function"==typeof Promise.prototype.finally?Promise.prototype.finally:implementation}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(140)();var ES=__webpack_require__(68),bind=__webpack_require__(23),promiseResolve=function PromiseResolve(C,value){return new C(function(resolve){resolve(value)})},OriginalPromise=Promise,then=bind.call(Function.call,OriginalPromise.prototype.then),promiseFinally=function finally_(onFinally){then(this,null,function(){});var C=ES.SpeciesConstructor(this,OriginalPromise),thenFinally=onFinally,catchFinally=onFinally;return ES.IsCallable(onFinally)&&(thenFinally=function CreateThenFinally(C,onFinally){return function(value){var result=onFinally();return promiseResolve(C,result).then(function(){return value})}}(C,onFinally),catchFinally=function CreateCatchFinally(C,onFinally){return function(reason){var result=onFinally();return promiseResolve(C,result).then(function(){throw reason})}}(C,onFinally)),this.then(thenFinally,catchFinally)};Eif(Object.getOwnPropertyDescriptor){var descriptor=Object.getOwnPropertyDescriptor(promiseFinally,"name");descriptor&&descriptor.configurable&&Object.defineProperty(promiseFinally,"name",{configurable:!0,value:"finally"})}module.exports=promiseFinally},function(module,exports,__webpack_require__){"use strict";__webpack_require__(321),__webpack_require__(325),__webpack_require__(329),__webpack_require__(333),__webpack_require__(337)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(322)()},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),getPolyfill=__webpack_require__(323);module.exports=function shimFlat(){var polyfill=getPolyfill();return define(Array.prototype,{flat:polyfill},{flat:function(){return Array.prototype.flat!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(324);module.exports=function getPolyfill(){return Array.prototype.flat||implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(80),MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1,FlattenIntoArray=function FlattenIntoArray(target,source,sourceLen,start,depth){for(var targetIndex=start,sourceIndex=0;sourceIndex<sourceLen;){var P=ES.ToString(sourceIndex);if(ES.HasProperty(source,P)){var element=ES.Get(source,P),shouldFlatten=!1;if(depth>0&&(shouldFlatten=ES.IsArray(element)),shouldFlatten){targetIndex=FlattenIntoArray(target,element,ES.ToLength(ES.Get(element,"length")),targetIndex,depth-1)}else{if(targetIndex>=MAX_SAFE_INTEGER)throw new TypeError("index too large");ES.CreateDataPropertyOrThrow(target,ES.ToString(targetIndex),element),targetIndex+=1}}sourceIndex+=1}return targetIndex};module.exports=function flat(){var O=ES.ToObject(this),sourceLen=ES.ToLength(ES.Get(O,"length")),depthNum=1;arguments.length>0&&void 0!==arguments[0]&&(depthNum=ES.ToInteger(arguments[0]));var A=ES.ArraySpeciesCreate(O,0);return FlattenIntoArray(A,O,sourceLen,0,depthNum),A}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(326)()},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),getPolyfill=__webpack_require__(327);module.exports=function shimFlatMap(){var polyfill=getPolyfill();return define(Array.prototype,{flatMap:polyfill},{flatMap:function(){return Array.prototype.flatMap!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(328);module.exports=function getPolyfill(){return Array.prototype.flatMap||implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(80),MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1,FlattenIntoArray=function FlattenIntoArray(target,source,sourceLen,start,depth){var mapperFunction,targetIndex=start,sourceIndex=0;for(arguments.length>5&&(mapperFunction=arguments[5]);sourceIndex<sourceLen;){var P=ES.ToString(sourceIndex),exists=ES.HasProperty(source,P);if(exists){var element=ES.Get(source,P);if(void 0!==mapperFunction){if(arguments.length<=6)throw new TypeError("Assertion failed: thisArg is required when mapperFunction is provided");element=ES.Call(mapperFunction,arguments[6],[element,sourceIndex,source])}var shouldFlatten=!1;if(depth>0&&(shouldFlatten=ES.IsArray(element)),shouldFlatten){var elementLen=ES.ToLength(ES.Get(element,"length"));targetIndex=FlattenIntoArray(target,element,elementLen,targetIndex,depth-1)}else{if(targetIndex>=MAX_SAFE_INTEGER)throw new TypeError("index too large");ES.CreateDataPropertyOrThrow(target,ES.ToString(targetIndex),element),targetIndex+=1}}sourceIndex+=1}return targetIndex};module.exports=function flatMap(callbackfn){var T,O=ES.ToObject(this),sourceLen=ES.ToLength(ES.Get(O,"length"));if(!ES.IsCallable(callbackfn))throw new TypeError("callback must be a function");arguments.length>1&&(T=arguments[1]);var A=ES.ArraySpeciesCreate(O,0);return FlattenIntoArray(A,O,sourceLen,0,1,callbackfn,T),A}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(330)()},function(module,exports,__webpack_require__){"use strict";var hasSymbols=__webpack_require__(54)(),polyfill=__webpack_require__(331),getInferredName=__webpack_require__(189),gOPD=Object.getOwnPropertyDescriptor,dP=Object.defineProperty,setProto=Object.setPrototypeOf,define=function defineGetter(getter){dP(Symbol.prototype,"description",{configurable:!0,enumerable:!1,get:getter})};module.exports=function shimSymbolDescription(){Iif(!hasSymbols)return!1;var desc=gOPD(Symbol.prototype,"description"),getter=polyfill(),isMissing=!desc||"function"!=typeof desc.get,isBroken=!isMissing&&(void 0!==Symbol().description||""!==Symbol("").description);Eif(isMissing||isBroken){Eif(!getInferredName)return function shimGlobalSymbol(getter){var origSym=Function.apply.bind(Symbol),emptyStrings=Object.create?Object.create(null):{},SymNew=function Symbol(){var sym=origSym(this,arguments);return arguments.length>0&&""===arguments[0]&&(emptyStrings[sym]=!0),sym};SymNew.prototype=Symbol.prototype,setProto(SymNew,Symbol),Symbol=SymNew;var boundGetter=Function.call.bind(getter),wrappedGetter=function description(){var symbolDescription=boundGetter(this);return emptyStrings[this]?"":symbolDescription};return define(wrappedGetter),wrappedGetter}(getter);define(getter)}return getter}},function(module,exports,__webpack_require__){"use strict";var hasSymbols=__webpack_require__(54)(),implementation=__webpack_require__(332),gOPD=Object.getOwnPropertyDescriptor;module.exports=function descriptionPolyfill(){Iif(!hasSymbols||"function"!=typeof gOPD)return null;var desc=gOPD(Symbol.prototype,"description");return desc&&"function"==typeof desc.get?void 0!==desc.get.call(Symbol())||""!==desc.get.call(Symbol())||"a"!==desc.get.call(Symbol("a"))?implementation:desc.get:implementation}},function(module,exports,__webpack_require__){"use strict";var symToStr=__webpack_require__(54)()?Function.call.bind(Symbol.prototype.toString):null,getInferredName=__webpack_require__(189);module.exports=function description(){var str=symToStr(this);Iif(getInferredName){var name=getInferredName(this);if(""===name)return;return name.slice(1,-1)}var desc=str.slice(7,-1);Iif(desc)return desc}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(334)()},function(module,exports,__webpack_require__){"use strict";var getPolyfill=__webpack_require__(335),define=__webpack_require__(13);module.exports=function shimEntries(){var polyfill=getPolyfill();return define(Object,{fromEntries:polyfill},{fromEntries:function testEntries(){return Object.fromEntries!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(336);module.exports=function getPolyfill(){return"function"==typeof Object.fromEntries?Object.fromEntries:implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(80),ThrowCompletion=function Throw(error){throw error},hasSymbols="function"==typeof Symbol&&"symbol"==typeof Symbol("foo");module.exports=function fromEntries(iterable){ES.RequireObjectCoercible(iterable);var obj={};if(!hasSymbols){if(!ES.IsArray(iterable))throw new TypeError("this environment lacks native Symbols, and can not support non-Array iterables");return function assign(obj,entries){for(var i=0;i<entries.length;++i){var entry=entries[i];if("Object"!==ES.Type(entry))throw new TypeError("iterator returned a non-object; entry expected");var key=ES.Get(entry,"0"),value=ES.Get(entry,"1"),propertyKey=ES.ToPropertyKey(key);ES.CreateDataPropertyOrThrow(obj,propertyKey,value)}}(obj,iterable),obj}for(var iter=ES.GetIterator(iterable);;){var next=ES.IteratorStep(iter);if(!1===next)return obj;var nextItem=ES.IteratorValue(next);if("Object"!==ES.Type(nextItem)){var error=new TypeError("iterator returned a non-object; entry expected");return ES.IteratorClose(iter,ThrowCompletion(error))}try{var key=ES.Get(nextItem,"0"),value=ES.Get(nextItem,"1"),propertyKey=ES.ToPropertyKey(key);ES.CreateDataPropertyOrThrow(obj,propertyKey,value)}catch(e){return ES.IteratorClose(iter,ThrowCompletion(e))}}}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(338),__webpack_require__(346),__webpack_require__(350)},function(module,exports,__webpack_require__){"use strict";__webpack_require__(339)()},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),hasSymbols=__webpack_require__(54)(),getPolyfill=__webpack_require__(340),regexMatchAll=__webpack_require__(191),defineP=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor;module.exports=function shimMatchAll(){var polyfill=getPolyfill();Eif(define(String.prototype,{matchAll:polyfill},{matchAll:function(){return String.prototype.matchAll!==polyfill}}),hasSymbols){var symbol=Symbol.matchAll||(Symbol.for?Symbol.for("Symbol.matchAll"):Symbol("Symbol.matchAll"));Eif(define(Symbol,{matchAll:symbol},{matchAll:function(){return Symbol.matchAll!==symbol}}),defineP&&gOPD){var desc=gOPD(Symbol,symbol);desc&&!desc.configurable||defineP(Symbol,symbol,{configurable:!1,enumerable:!1,value:symbol,writable:!1})}var func={};func[symbol]=RegExp.prototype[symbol]||regexMatchAll;var predicate={};predicate[symbol]=function(){return RegExp.prototype[symbol]!==regexMatchAll},define(RegExp.prototype,func,predicate)}return polyfill}},function(module,exports,__webpack_require__){"use strict";var implementation=__webpack_require__(341);module.exports=function getPolyfill(){return String.prototype.matchAll||implementation}},function(module,exports,__webpack_require__){"use strict";var ES=__webpack_require__(141),hasSymbols=__webpack_require__(54)(),regexMatchAll=__webpack_require__(191);module.exports=function matchAll(regexp){var matcher,O=ES.RequireObjectCoercible(this);if(null!=regexp&&(hasSymbols&&"symbol"==typeof Symbol.matchAll?matcher=ES.GetMethod(regexp,Symbol.matchAll):ES.IsRegExp(regexp)&&(matcher=regexMatchAll),void 0!==matcher))return ES.Call(matcher,regexp,[O]);var S=ES.ToString(O),rx=new RegExp(regexp,"g");return hasSymbols&&"symbol"==typeof Symbol.matchAll?ES.Invoke(rx,Symbol.matchAll,[S]):ES.Call(regexMatchAll,rx,[S])}},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),implementation=__webpack_require__(192),getPolyfill=__webpack_require__(193),shim=__webpack_require__(343),flagsBound=Function.call.bind(implementation);define(flagsBound,{getPolyfill:getPolyfill,implementation:implementation,shim:shim}),module.exports=flagsBound},function(module,exports,__webpack_require__){"use strict";var supportsDescriptors=__webpack_require__(13).supportsDescriptors,getPolyfill=__webpack_require__(193),gOPD=Object.getOwnPropertyDescriptor,defineProperty=Object.defineProperty,TypeErr=TypeError,getProto=Object.getPrototypeOf,regex=/a/;module.exports=function shimFlags(){if(!supportsDescriptors||!getProto)throw new TypeErr("RegExp.prototype.flags requires a true ES5 environment that supports property descriptors");var polyfill=getPolyfill(),proto=getProto(regex),descriptor=gOPD(proto,"flags");return descriptor&&descriptor.get===polyfill||defineProperty(proto,"flags",{configurable:!0,enumerable:!1,get:polyfill}),polyfill}},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),ES=__webpack_require__(141),GetIntrinsic=__webpack_require__(55),hasSymbols=__webpack_require__(54)(),hidden=__webpack_require__(345)(),RegExpStringIterator=function RegExpStringIterator(R,S,global,fullUnicode){if("String"!==ES.Type(S))throw new TypeError("S must be a string");if("Boolean"!==ES.Type(global))throw new TypeError("global must be a boolean");if("Boolean"!==ES.Type(fullUnicode))throw new TypeError("fullUnicode must be a boolean");hidden.set(this,"[[IteratingRegExp]]",R),hidden.set(this,"[[IteratedString]]",S),hidden.set(this,"[[Global]]",global),hidden.set(this,"[[Unicode]]",fullUnicode),hidden.set(this,"[[Done]]",!1)},IteratorPrototype=GetIntrinsic("%IteratorPrototype%",!0);Eif(IteratorPrototype&&(RegExpStringIterator.prototype=ES.ObjectCreate(IteratorPrototype)),define(RegExpStringIterator.prototype,{next:function next(){var O=this;if("Object"!==ES.Type(O))throw new TypeError("receiver must be an object");if(!(O instanceof RegExpStringIterator&&hidden.has(O,"[[IteratingRegExp]]")&&hidden.has(O,"[[IteratedString]]")&&hidden.has(O,"[[Global]]")&&hidden.has(O,"[[Unicode]]")&&hidden.has(O,"[[Done]]")))throw new TypeError('"this" value must be a RegExpStringIterator instance');if(hidden.get(O,"[[Done]]"))return ES.CreateIterResultObject(void 0,!0);var R=hidden.get(O,"[[IteratingRegExp]]"),S=hidden.get(O,"[[IteratedString]]"),global=hidden.get(O,"[[Global]]"),fullUnicode=hidden.get(O,"[[Unicode]]"),match=ES.RegExpExec(R,S);if(null===match)return hidden.set(O,"[[Done]]",!0),ES.CreateIterResultObject(void 0,!0);if(global){if(""===ES.ToString(ES.Get(match,"0"))){var thisIndex=ES.ToLength(ES.Get(R,"lastIndex")),nextIndex=ES.AdvanceStringIndex(S,thisIndex,fullUnicode);ES.Set(R,"lastIndex",nextIndex,!0)}return ES.CreateIterResultObject(match,!1)}return hidden.set(O,"[[Done]]",!0),ES.CreateIterResultObject(match,!1)}}),hasSymbols){var defineP=Object.defineProperty;Iif(Symbol.toStringTag&&(defineP?defineP(RegExpStringIterator.prototype,Symbol.toStringTag,{configurable:!0,enumerable:!1,value:"RegExp String Iterator",writable:!1}):RegExpStringIterator.prototype[Symbol.toStringTag]="RegExp String Iterator"),!IteratorPrototype&&Symbol.iterator){var func={};func[Symbol.iterator]=RegExpStringIterator.prototype[Symbol.iterator]||function SymbolIterator(){return this};var predicate={};predicate[Symbol.iterator]=function(){return RegExpStringIterator.prototype[Symbol.iterator]!==func[Symbol.iterator]},define(RegExpStringIterator.prototype,func,predicate)}}module.exports=RegExpStringIterator},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13);module.exports=function getHiddenKeyManager(){var symbolCache={},makeKey=function key(prop){return symbolCache["$"+prop]?symbolCache["$"+prop]:"function"==typeof Symbol?(symbolCache["$"+prop]=Symbol(prop),symbolCache["$"+prop]):"___ "+prop+" ___"};return{get:function get(obj,prop){return obj[makeKey(prop)]},has:function has(obj,prop){return makeKey(prop)in obj},set:function set(obj,prop,value){var key=makeKey(prop);define.supportsDescriptors?Object.defineProperty(obj,key,{configurable:!1,enumerable:!1,value:value,writable:!0}):obj[key]=value}}}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(347)()},function(module,exports,__webpack_require__){"use strict";var define=__webpack_require__(13),getPolyfill=__webpack_require__(348);module.exports=function shimGlobal(){var polyfill=getPolyfill();Eif(define.supportsDescriptors){var descriptor=Object.getOwnPropertyDescriptor(polyfill,"globalThis");(!descriptor||descriptor.configurable&&(descriptor.enumerable||descriptor.writable||globalThis!==polyfill))&&Object.defineProperty(polyfill,"globalThis",{configurable:!0,enumerable:!1,value:polyfill,writable:!1})}else"object"==typeof globalThis&&globalThis===polyfill||(polyfill.globalThis=polyfill);return polyfill}},function(module,exports,__webpack_require__){"use strict";(function(global){var implementation=__webpack_require__(349);module.exports=function getPolyfill(){return"object"==typeof global&&global&&global.Math===Math&&global.Array===Array?global:implementation}}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";(function(global){"undefined"!=typeof self?module.exports=self:"undefined"!=typeof window?module.exports=window:module.exports=void 0!==global?global:Function("return this")()}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";__webpack_require__(351)()},function(module,exports,__webpack_require__){"use strict";var requirePromise=__webpack_require__(142),getPolyfill=__webpack_require__(352),define=__webpack_require__(13);module.exports=function shimAllSettled(){requirePromise();var polyfill=getPolyfill();return define(Promise,{allSettled:polyfill},{allSettled:function testAllSettled(){return Promise.allSettled!==polyfill}}),polyfill}},function(module,exports,__webpack_require__){"use strict";var requirePromise=__webpack_require__(142),implementation=__webpack_require__(353);module.exports=function getPolyfill(){return requirePromise(),"function"==typeof Promise.allSettled?Promise.allSettled:implementation}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(142)();var ES=__webpack_require__(190),getIntrinsic=__webpack_require__(55),bind=__webpack_require__(23),all=bind.call(Function.call,getIntrinsic("%Promise_all%")),reject=bind.call(Function.call,getIntrinsic("%Promise_reject%"));module.exports=function allSettled(iterable){var C=this;if("Object"!==ES.Type(C))throw new TypeError("`this` value must be an object");return all(C,Array.from(iterable,function(item){var itemPromise=ES.PromiseResolve(C,item);try{return itemPromise.then(function(value){return{status:"fulfilled",value:value}},function(reason){return{status:"rejected",reason:reason}})}catch(e){return reject(C,e)}}))}},function(module,exports,__webpack_require__){module.exports=__webpack_require__(355),__webpack_require__(372),__webpack_require__(373),__webpack_require__(374)},function(module,exports,__webpack_require__){__webpack_require__(37),__webpack_require__(26),__webpack_require__(33),__webpack_require__(359),__webpack_require__(34),__webpack_require__(360),__webpack_require__(361),__webpack_require__(41),__webpack_require__(362),__webpack_require__(363),__webpack_require__(364),__webpack_require__(365),__webpack_require__(366),__webpack_require__(367),__webpack_require__(368),__webpack_require__(369),__webpack_require__(370),__webpack_require__(371),module.exports=__webpack_require__(85).Symbol},function(module,exports,__webpack_require__){"use strict";var classof=__webpack_require__(204),test={};test[__webpack_require__(12)("toStringTag")]="z",module.exports="[object z]"!==String(test)?function toString(){return"[object "+classof(this)+"]"}:test.toString},function(module,exports,__webpack_require__){var objectKeys=__webpack_require__(72),getOwnPropertySymbolsModule=__webpack_require__(104),propertyIsEnumerableModule=__webpack_require__(83);module.exports=function(it){var result=objectKeys(it),getOwnPropertySymbols=getOwnPropertySymbolsModule.f;if(getOwnPropertySymbols)for(var key,symbols=getOwnPropertySymbols(it),propertyIsEnumerable=propertyIsEnumerableModule.f,i=0;symbols.length>i;)propertyIsEnumerable.call(it,key=symbols[i++])&&result.push(key);return result}},function(module,exports,__webpack_require__){var toIndexedObject=__webpack_require__(40),nativeGetOwnPropertyNames=__webpack_require__(103).f,toString={}.toString,windowNames="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];module.exports.f=function getOwnPropertyNames(it){return windowNames&&"[object Window]"==toString.call(it)?function(it){try{return nativeGetOwnPropertyNames(it)}catch(error){return windowNames.slice()}}(it):nativeGetOwnPropertyNames(toIndexedObject(it))}},function(module,exports,__webpack_require__){__webpack_require__(17)("asyncIterator")},function(module,exports,__webpack_require__){__webpack_require__(17)("hasInstance")},function(module,exports,__webpack_require__){__webpack_require__(17)("isConcatSpreadable")},function(module,exports,__webpack_require__){__webpack_require__(17)("match")},function(module,exports,__webpack_require__){__webpack_require__(17)("replace")},function(module,exports,__webpack_require__){__webpack_require__(17)("search")},function(module,exports,__webpack_require__){__webpack_require__(17)("species")},function(module,exports,__webpack_require__){__webpack_require__(17)("split")},function(module,exports,__webpack_require__){__webpack_require__(17)("toPrimitive")},function(module,exports,__webpack_require__){__webpack_require__(17)("toStringTag")},function(module,exports,__webpack_require__){__webpack_require__(17)("unscopables")},function(module,exports,__webpack_require__){__webpack_require__(56)(Math,"Math",!0)},function(module,exports,__webpack_require__){__webpack_require__(56)(__webpack_require__(7).JSON,"JSON",!0)},function(module,exports,__webpack_require__){__webpack_require__(17)("dispose")},function(module,exports,__webpack_require__){__webpack_require__(17)("observable")},function(module,exports,__webpack_require__){__webpack_require__(17)("patternMatch")},function(module,exports,__webpack_require__){"use strict";__webpack_require__(20).window.STORYBOOK_REACT_CLASSES={}},,function(module,exports,__webpack_require__){"use strict";var IteratorPrototype=__webpack_require__(210).IteratorPrototype,create=__webpack_require__(57),createPropertyDescriptor=__webpack_require__(70),setToStringTag=__webpack_require__(56),Iterators=__webpack_require__(86),returnThis=function(){return this};module.exports=function(IteratorConstructor,NAME,next){var TO_STRING_TAG=NAME+" Iterator";return IteratorConstructor.prototype=create(IteratorPrototype,{next:createPropertyDescriptor(1,next)}),setToStringTag(IteratorConstructor,TO_STRING_TAG,!1,!0),Iterators[TO_STRING_TAG]=returnThis,IteratorConstructor}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.forceReRender=exports.configure=exports.raw=exports.getStorybook=exports.clearDecorators=exports.addParameters=exports.addDecorator=exports.setAddon=exports.storiesOf=void 0;var _client=__webpack_require__(379);__webpack_require__(527);var _render=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(557));var _start=(0,_client.start)(_render.default),clientApi=_start.clientApi,configApi=_start.configApi,forceReRender=_start.forceReRender;exports.forceReRender=forceReRender;var storiesOf=clientApi.storiesOf,setAddon=clientApi.setAddon,addDecorator=clientApi.addDecorator,addParameters=clientApi.addParameters,clearDecorators=clientApi.clearDecorators,getStorybook=clientApi.getStorybook,raw=clientApi.raw;exports.raw=raw,exports.getStorybook=getStorybook,exports.clearDecorators=clearDecorators,exports.addParameters=addParameters,exports.addDecorator=addDecorator,exports.setAddon=setAddon,exports.storiesOf=storiesOf;var configure=configApi.configure;exports.configure=configure},function(module,exports,__webpack_require__){module.exports=__webpack_require__(380).default},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _default=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(381)).default;exports.default=_default},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _clientApi=__webpack_require__(214),_utils=__webpack_require__(93);var _default={start:function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(512)).default,toId:_utils.toId,ClientApi:_clientApi.ClientApi,ConfigApi:_clientApi.ConfigApi,StoryStore:_clientApi.StoryStore};exports.default=_default},function(module,exports,__webpack_require__){var toIndexedObject=__webpack_require__(40),nativeGetOwnPropertyDescriptor=__webpack_require__(31).f,DESCRIPTORS=__webpack_require__(14),FAILS_ON_PRIMITIVES=__webpack_require__(9)(function(){nativeGetOwnPropertyDescriptor(1)}),FORCED=!DESCRIPTORS||FAILS_ON_PRIMITIVES;__webpack_require__(3)({target:"Object",stat:!0,forced:FORCED,sham:!DESCRIPTORS},{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(it,key){return nativeGetOwnPropertyDescriptor(toIndexedObject(it),key)}})},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(215),__webpack_require__(22),__webpack_require__(89),__webpack_require__(51),__webpack_require__(27),__webpack_require__(150),__webpack_require__(151),__webpack_require__(90),__webpack_require__(44),__webpack_require__(6),__webpack_require__(152),__webpack_require__(45),__webpack_require__(26),__webpack_require__(91),__webpack_require__(46),__webpack_require__(19),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.defaultDecorateStory=void 0;var _isPlainObject=_interopRequireDefault(__webpack_require__(586)),_clientLogger=__webpack_require__(73),_addons=_interopRequireDefault(__webpack_require__(92)),_coreEvents=_interopRequireDefault(__webpack_require__(74)),_utils=__webpack_require__(93),_mergeWith=_interopRequireDefault(__webpack_require__(403)),_isEqual=_interopRequireDefault(__webpack_require__(464)),_get=_interopRequireDefault(__webpack_require__(245)),_subscriptions_store=_interopRequireDefault(__webpack_require__(246));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _toConsumableArray(arr){return function _arrayWithoutHoles(arr){Eif(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}}(arr)||function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||"[object Arguments]"===Object.prototype.toString.call(iter))return Array.from(iter)}(arr)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function _slicedToArray(arr,i){return function _arrayWithHoles(arr){Eif(Array.isArray(arr))return arr}(arr)||function _iterableToArrayLimit(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var merge=function merge(a,b){return(0,_mergeWith.default)({},a,b,function(objValue,srcValue){return Array.isArray(srcValue)&&Array.isArray(objValue)?(srcValue.forEach(function(s){objValue.find(function(o){return o===s||(0,_isEqual.default)(o,s)})||objValue.push(s)}),objValue):Array.isArray(objValue)?(_clientLogger.logger.log("the types mismatch, picking",objValue),objValue):void 0})},defaultDecorateStory=function defaultDecorateStory(storyFn,decorators){return decorators.reduce(function(decorated,decorator){return function(){var context=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return decorator(function(){var p=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return decorated(Object.assign(context,p,{parameters:Object.assign(context.parameters||{},p.parameters)},{options:Object.assign(context.options||{},p.options)}))},context)}},storyFn)};exports.defaultDecorateStory=defaultDecorateStory;var metaSubscription=function metaSubscription(){return _addons.default.getChannel().on(_coreEvents.default.REGISTER_SUBSCRIPTION,_subscriptions_store.default.register),function(){return _addons.default.getChannel().removeListener(_coreEvents.default.REGISTER_SUBSCRIPTION,_subscriptions_store.default.register)}},withSubscriptionTracking=function withSubscriptionTracking(storyFn){Iif(!_addons.default.hasChannel())return storyFn();_subscriptions_store.default.markAllAsUnused(),_subscriptions_store.default.register(metaSubscription);var result=storyFn();return _subscriptions_store.default.clearUnused(),result};exports.default=function ClientApi(){var _this=this,_ref=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},storyStore=_ref.storyStore,_ref$decorateStory=_ref.decorateStory,decorateStory=void 0===_ref$decorateStory?defaultDecorateStory:_ref$decorateStory;Iif(_classCallCheck(this,ClientApi),this.setAddon=function(addon){_this._addons=Object.assign({},_this._addons,addon)},this.getSeparators=function(){return Object.assign({},{hierarchyRootSeparator:"|",hierarchySeparator:/\/|\./},_this._globalParameters.options)},this.addDecorator=function(decorator){_this._globalDecorators.push(decorator)},this.addParameters=function(parameters){_this._globalParameters=Object.assign({},_this._globalParameters,parameters,{options:Object.assign({},merge((0,_get.default)(_this._globalParameters,"options",{}),(0,_get.default)(parameters,"options",{})))})},this.clearDecorators=function(){_this._globalDecorators=[]},this.storiesOf=function(kind,m){Iif(!kind&&"string"!=typeof kind)throw new Error("Invalid or missing kind provided for stories, should be a string");m||_clientLogger.logger.warn("Missing 'module' parameter for story with a kind of '".concat(kind,"'. It will break your HMR")),m&&m.hot&&m.hot.dispose&&m.hot.dispose(function(){_this._storyStore.remove(),_this._storyStore.removeStoryKind(kind),_this._storyStore.incrementRevision()});var localDecorators=[],localParameters={},hasAdded=!1,api={kind:kind};return Object.keys(_this._addons).forEach(function(name){var addon=_this._addons[name];api[name]=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return addon.apply(api,args),api}}),api.add=function(storyName,storyFn,parameters){hasAdded=!0;var _globalParameters=_this._globalParameters,_globalDecorators=_this._globalDecorators,id=(0,_utils.toId)(kind,storyName);Iif("string"!=typeof storyName)throw new Error('Invalid or missing storyName provided for a "'.concat(kind,'" story.'));m&&m.hot&&m.hot.dispose&&m.hot.dispose(function(){_this._storyStore.remove(id)});var fileName=m&&m.id?"".concat(m.id):void 0,_this$getSeparators=_this.getSeparators(),allParam=[{options:{hierarchyRootSeparator:_this$getSeparators.hierarchyRootSeparator,hierarchySeparator:_this$getSeparators.hierarchySeparator}},_globalParameters,localParameters,parameters].reduce(function(acc,p){return p&&Object.entries(p).forEach(function(_ref2){var _ref3=_slicedToArray(_ref2,2),key=_ref3[0],value=_ref3[1],existingValue=acc[key];Array.isArray(value)?acc[key]=value:(0,_isPlainObject.default)(value)&&(0,_isPlainObject.default)(existingValue)?acc[key]=merge(existingValue,value):acc[key]=value}),acc},{fileName:fileName});return _this._storyStore.addStory({id:id,kind:kind,name:storyName,storyFn:storyFn,parameters:allParam},{applyDecorators:_this._decorateStory,getDecorators:function getDecorators(){return[].concat(_toConsumableArray(allParam.decorators||[]),localDecorators,_toConsumableArray(_globalDecorators),[withSubscriptionTracking])}}),api},api.addDecorator=function(decorator){return hasAdded&&_clientLogger.logger.warn("You have added a decorator to the kind '".concat(kind,"' after a story has already been added.\nIn Storybook 4 this applied the decorator only to subsequent stories. In Storybook 5+ it applies to all stories.\nThis is probably not what you intended. Read more here: https://github.com/storybookjs/storybook/blob/master/MIGRATION.md")),localDecorators.push(decorator),api},api.addParameters=function(parameters){return localParameters=Object.assign({},localParameters,parameters),api},api},this.getStorybook=function(){return _this._storyStore.getStoryKinds().map(function(kind){var fileName=_this._storyStore.getStoryFileName(kind),stories=_this._storyStore.getStories(kind).map(function(name){return{name:name,render:_this._storyStore.getStoryWithContext(kind,name)}});return{kind:kind,fileName:fileName,stories:stories}})},this.raw=function(){return _this._storyStore.raw()},this.store=function(){return _this._storyStore},this._storyStore=storyStore,this._addons={},this._globalDecorators=[],this._globalParameters={},this._decorateStory=decorateStory,!storyStore)throw new Error("storyStore is required")}},function(module,exports,__webpack_require__){"use strict";var bind=__webpack_require__(88),toObject=__webpack_require__(30),callWithSafeIterationClosing=__webpack_require__(216),isArrayIteratorMethod=__webpack_require__(217),toLength=__webpack_require__(24),createProperty=__webpack_require__(143),getIteratorMethod=__webpack_require__(218);module.exports=function from(arrayLike){var length,result,step,iterator,O=toObject(arrayLike),C="function"==typeof this?this:Array,argumentsLength=arguments.length,mapfn=argumentsLength>1?arguments[1]:void 0,mapping=void 0!==mapfn,index=0,iteratorMethod=getIteratorMethod(O);if(mapping&&(mapfn=bind(mapfn,argumentsLength>2?arguments[2]:void 0,2)),null==iteratorMethod||C==Array&&isArrayIteratorMethod(iteratorMethod))for(result=new C(length=toLength(O.length));length>index;index++)createProperty(result,index,mapping?mapfn(O[index],index):O[index]);else for(iterator=iteratorMethod.call(O),result=new C;!(step=iterator.next()).done;index++)createProperty(result,index,mapping?callWithSafeIterationClosing(iterator,mapfn,[step.value,index],!0):step.value);return result.length=index,result}},function(module,exports,__webpack_require__){var aFunction=__webpack_require__(43),toObject=__webpack_require__(30),IndexedObject=__webpack_require__(101),toLength=__webpack_require__(24);module.exports=function(that,callbackfn,argumentsLength,memo,isRight){aFunction(callbackfn);var O=toObject(that),self=IndexedObject(O),length=toLength(O.length),index=isRight?length-1:0,i=isRight?-1:1;if(argumentsLength<2)for(;;){if(index in self){memo=self[index],index+=i;break}if(index+=i,isRight?index<0:length<=index)throw TypeError("Reduce of empty array with no initial value")}for(;isRight?index>=0:length>index;index+=i)index in self&&(memo=callbackfn(memo,self[index],index,O));return memo}},function(module,exports,__webpack_require__){"use strict";var objectKeys=__webpack_require__(72),getOwnPropertySymbolsModule=__webpack_require__(104),propertyIsEnumerableModule=__webpack_require__(83),toObject=__webpack_require__(30),IndexedObject=__webpack_require__(101),nativeAssign=Object.assign;module.exports=!nativeAssign||__webpack_require__(9)(function(){var A={},B={},symbol=Symbol();return A[symbol]=7,"abcdefghijklmnopqrst".split("").forEach(function(chr){B[chr]=chr}),7!=nativeAssign({},A)[symbol]||"abcdefghijklmnopqrst"!=objectKeys(nativeAssign({},B)).join("")})?function assign(target,source){for(var T=toObject(target),argumentsLength=arguments.length,index=1,getOwnPropertySymbols=getOwnPropertySymbolsModule.f,propertyIsEnumerable=propertyIsEnumerableModule.f;argumentsLength>index;)for(var key,S=IndexedObject(arguments[index++]),keys=getOwnPropertySymbols?objectKeys(S).concat(getOwnPropertySymbols(S)):objectKeys(S),length=keys.length,j=0;length>j;)propertyIsEnumerable.call(S,key=keys[j++])&&(T[key]=S[key]);return T}:nativeAssign},function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(44),__webpack_require__(6),__webpack_require__(153),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"types",{enumerable:!0,get:function get(){return _types.types}}),Object.defineProperty(exports,"Types",{enumerable:!0,get:function get(){return _types.Types}}),Object.defineProperty(exports,"isSupportedType",{enumerable:!0,get:function get(){return _types.isSupportedType}}),exports.addons=exports.AddonStore=void 0;var _global=_interopRequireDefault(__webpack_require__(20)),_clientLogger=_interopRequireDefault(__webpack_require__(73)),_types=__webpack_require__(388);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var AddonStore=function AddonStore(){var _this=this;!function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,AddonStore),this.loaders={},this.elements={},this.channel=void 0,this.getChannel=function(){if(!_this.channel)throw new Error("Accessing non-existent addons channel, see https://storybook.js.org/basics/faq/#why-is-there-no-addons-channel");return _this.channel},this.hasChannel=function(){return!!_this.channel},this.setChannel=function(channel){_this.channel=channel},this.getElements=function(type){return _this.elements[type]||(_this.elements[type]={}),_this.elements[type]},this.addPanel=function(name,options){_this.add(name,Object.assign({type:_types.types.PANEL},options))},this.add=function(name,addon){var type=addon.type;_this.getElements(type)[name]=Object.assign({id:name},addon)},this.register=function(name,registerCallback){_this.loaders[name]&&_clientLogger.default.warn("".concat(name," was loaded twice, this could have bad side-effects")),_this.loaders[name]=registerCallback},this.loadAddons=function(api){Object.values(_this.loaders).forEach(function(value){return value(api)})}};exports.AddonStore=AddonStore;var KEY="__STORYBOOK_ADDONS";var addons=function getAddonsStore(){return _global.default[KEY]||(_global.default[KEY]=new AddonStore),_global.default[KEY]}();exports.addons=addons},function(module,exports,__webpack_require__){"use strict";var types;__webpack_require__(215),__webpack_require__(6),__webpack_require__(153),Object.defineProperty(exports,"__esModule",{value:!0}),exports.isSupportedType=function isSupportedType(type){return!!Object.values(types).find(function(typeVal){return typeVal===type})},exports.types=void 0,exports.types=types,function(types){types.TAB="tab",types.PANEL="panel",types.TOOL="tool",types.PREVIEW="preview",types.NOTES_ELEMENT="notes-element"}(types||(exports.types=types={}))},function(module,exports,__webpack_require__){"use strict";__webpack_require__(37),__webpack_require__(154),__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.makeDecorator=void 0;var _utilDeprecate=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(222));exports.makeDecorator=function makeDecorator(_ref){var name=_ref.name,parameterName=_ref.parameterName,wrapper=_ref.wrapper,_ref$skipIfNoParamete=_ref.skipIfNoParametersOrOptions,skipIfNoParametersOrOptions=void 0!==_ref$skipIfNoParamete&&_ref$skipIfNoParamete,_ref$allowDeprecatedU=_ref.allowDeprecatedUsage,allowDeprecatedUsage=void 0!==_ref$allowDeprecatedU&&_ref$allowDeprecatedU,decorator=function decorator(options){return function(getStory,context){var parameters=context.parameters&&context.parameters[parameterName];return parameters&&parameters.disable?getStory(context):!skipIfNoParametersOrOptions||options||parameters?wrapper(getStory,context,{options:options,parameters:parameters}):getStory(context)}};return function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return"function"==typeof args[0]?decorator().apply(void 0,args):function(){for(var _len2=arguments.length,innerArgs=new Array(_len2),_key2=0;_key2<_len2;_key2++)innerArgs[_key2]=arguments[_key2];if(innerArgs.length>1)return decorator.apply(void 0,args).apply(void 0,innerArgs);if(allowDeprecatedUsage)return(0,_utilDeprecate.default)(function(context){return decorator.apply(void 0,args)(innerArgs[0],context)},"Passing stories directly into ".concat(name,"() is deprecated,\n          instead use addDecorator(").concat(name,") and pass options with the '").concat(parameterName,"' parameter"));throw new Error("Passing stories directly into ".concat(name,"() is not allowed,\n        instead use addDecorator(").concat(name,") and pass options with the '").concat(parameterName,"' parameter"))}}}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.mockChannel=function mockChannel(){return new _channels.default({transport:{setHandler:function setHandler(){},send:function send(){}}})};var _channels=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(223))},function(module,exports,__webpack_require__){(function(global){var scope=void 0!==global&&global||"undefined"!=typeof self&&self||window,apply=Function.prototype.apply;function Timeout(id,clearFn){this._id=id,this._clearFn=clearFn}exports.setTimeout=function(){return new Timeout(apply.call(setTimeout,scope,arguments),clearTimeout)},exports.setInterval=function(){return new Timeout(apply.call(setInterval,scope,arguments),clearInterval)},exports.clearTimeout=exports.clearInterval=function(timeout){timeout&&timeout.close()},Timeout.prototype.unref=Timeout.prototype.ref=function(){},Timeout.prototype.close=function(){this._clearFn.call(scope,this._id)},exports.enroll=function(item,msecs){clearTimeout(item._idleTimeoutId),item._idleTimeout=msecs},exports.unenroll=function(item){clearTimeout(item._idleTimeoutId),item._idleTimeout=-1},exports._unrefActive=exports.active=function(item){clearTimeout(item._idleTimeoutId);var msecs=item._idleTimeout;msecs>=0&&(item._idleTimeoutId=setTimeout(function onTimeout(){item._onTimeout&&item._onTimeout()},msecs))},__webpack_require__(392),exports.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==global&&global.setImmediate||this&&this.setImmediate,exports.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==global&&global.clearImmediate||this&&this.clearImmediate}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){(function(global,process){!function(global,undefined){"use strict";Eif(!global.setImmediate){var registerImmediate,nextHandle=1,tasksByHandle={},currentlyRunningATask=!1,doc=global.document,attachTo=Object.getPrototypeOf&&Object.getPrototypeOf(global);attachTo=attachTo&&attachTo.setTimeout?attachTo:global,"[object process]"==={}.toString.call(global.process)?function installNextTickImplementation(){registerImmediate=function(handle){process.nextTick(function(){runIfPresent(handle)})}}():!function canUsePostMessage(){Eif(global.postMessage&&!global.importScripts){var postMessageIsAsynchronous=!0,oldOnMessage=global.onmessage;return global.onmessage=function(){postMessageIsAsynchronous=!1},global.postMessage("","*"),global.onmessage=oldOnMessage,postMessageIsAsynchronous}}()?global.MessageChannel?function installMessageChannelImplementation(){var channel=new MessageChannel;channel.port1.onmessage=function(event){runIfPresent(event.data)},registerImmediate=function(handle){channel.port2.postMessage(handle)}}():doc&&"onreadystatechange"in doc.createElement("script")?function installReadyStateChangeImplementation(){var html=doc.documentElement;registerImmediate=function(handle){var script=doc.createElement("script");script.onreadystatechange=function(){runIfPresent(handle),script.onreadystatechange=null,html.removeChild(script),script=null},html.appendChild(script)}}():function installSetTimeoutImplementation(){registerImmediate=function(handle){setTimeout(runIfPresent,0,handle)}}():function installPostMessageImplementation(){var messagePrefix="setImmediate$"+Math.random()+"$",onGlobalMessage=function(event){event.source===global&&"string"==typeof event.data&&0===event.data.indexOf(messagePrefix)&&runIfPresent(+event.data.slice(messagePrefix.length))};global.addEventListener?global.addEventListener("message",onGlobalMessage,!1):global.attachEvent("onmessage",onGlobalMessage),registerImmediate=function(handle){global.postMessage(messagePrefix+handle,"*")}}(),attachTo.setImmediate=function setImmediate(callback){"function"!=typeof callback&&(callback=new Function(""+callback));for(var args=new Array(arguments.length-1),i=0;i<args.length;i++)args[i]=arguments[i+1];var task={callback:callback,args:args};return tasksByHandle[nextHandle]=task,registerImmediate(nextHandle),nextHandle++},attachTo.clearImmediate=clearImmediate}function clearImmediate(handle){delete tasksByHandle[handle]}function runIfPresent(handle){if(currentlyRunningATask)setTimeout(runIfPresent,0,handle);else{var task=tasksByHandle[handle];if(task){currentlyRunningATask=!0;try{!function run(task){var callback=task.callback,args=task.args;switch(args.length){case 0:callback();break;case 1:callback(args[0]);break;case 2:callback(args[0],args[1]);break;case 3:callback(args[0],args[1],args[2]);break;default:callback.apply(undefined,args)}}(task)}finally{clearImmediate(handle),currentlyRunningATask=!1}}}}}("undefined"==typeof self?void 0===global?this:global:self)}).call(this,__webpack_require__(18),__webpack_require__(176))},function(module,exports,__webpack_require__){var global=__webpack_require__(7),task=__webpack_require__(157),FORCED=!global.setImmediate||!global.clearImmediate;__webpack_require__(3)({global:!0,bind:!0,enumerable:!0,forced:FORCED},{setImmediate:task.set,clearImmediate:task.clear})},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(155),__webpack_require__(51),__webpack_require__(27),__webpack_require__(44),__webpack_require__(6),__webpack_require__(26),__webpack_require__(75),__webpack_require__(46),__webpack_require__(158),__webpack_require__(224),__webpack_require__(160),__webpack_require__(396),__webpack_require__(397),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseKind=exports.getMatch=exports.stringifyQuery=exports.queryFromLocation=exports.queryFromString=exports.parsePath=exports.toId=exports.sanitize=exports.knownNonViewModesRegex=void 0;var _qs=_interopRequireDefault(__webpack_require__(400)),_memoizerific=_interopRequireDefault(__webpack_require__(161));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _slicedToArray(arr,i){return function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}(arr)||function _iterableToArrayLimit(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var knownNonViewModesRegex=/(settings)/;exports.knownNonViewModesRegex=knownNonViewModesRegex;var splitPathRegex=/\/([^\/]+)\/([^\/]+)?/,sanitize=function sanitize(string){return string.toLowerCase().replace(/[ ’–—―′¿'`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi,"-").replace(/-+/g,"-").replace(/^-+/,"").replace(/-+$/,"")};exports.sanitize=sanitize;var sanitizeSafe=function sanitizeSafe(string,part){var sanitized=sanitize(string);Iif(""===sanitized)throw new Error("Invalid ".concat(part," '").concat(string,"', must include alphanumeric characters"));return sanitized};exports.toId=function toId(kind,name){return"".concat(sanitizeSafe(kind,"kind"),"--").concat(sanitizeSafe(name,"name"))};var parsePath=(0,_memoizerific.default)(1e3)(function(path){var result={viewMode:void 0,storyId:void 0};if(path){var _ref2=_slicedToArray(path.match(splitPathRegex)||[void 0,void 0,void 0],3),viewMode=_ref2[1],storyId=_ref2[2];viewMode&&!viewMode.match(knownNonViewModesRegex)&&Object.assign(result,{viewMode:viewMode,storyId:storyId})}return result});exports.parsePath=parsePath;var queryFromString=(0,_memoizerific.default)(1e3)(function(s){return _qs.default.parse(s,{ignoreQueryPrefix:!0})});exports.queryFromString=queryFromString;exports.queryFromLocation=function queryFromLocation(location){return queryFromString(location.search)};exports.stringifyQuery=function stringifyQuery(query){return _qs.default.stringify(query,{addQueryPrefix:!0,encode:!1})};var getMatch=(0,_memoizerific.default)(1e3)(function(current,target){var startsWith=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],startsWithTarget=current&&startsWith&&current.startsWith(target),currentIsTarget="string"==typeof target&&current===target,matchTarget=current&&target&&current.match(target);return startsWithTarget||currentIsTarget||matchTarget?{path:current}:null});exports.getMatch=getMatch;exports.parseKind=function parseKind(kind,_ref3){var rootSeparator=_ref3.rootSeparator,groupSeparator=_ref3.groupSeparator,_kind$split2=_slicedToArray(kind.split(rootSeparator,2),2),root=_kind$split2[0],remainder=_kind$split2[1];return{root:remainder?root:null,groups:(remainder||kind).split(groupSeparator).filter(function(i){return!!i})}}},function(module,exports){module.exports=Object.is||function is(x,y){return x===y?0!==x||1/x==1/y:x!=x&&y!=y}},function(module,exports,__webpack_require__){"use strict";var isRegExp=__webpack_require__(225),anObject=__webpack_require__(4),requireObjectCoercible=__webpack_require__(39),speciesConstructor=__webpack_require__(226),advanceStringIndex=__webpack_require__(159),toLength=__webpack_require__(24),callRegExpExec=__webpack_require__(109),regexpExec=__webpack_require__(108),fails=__webpack_require__(9),arrayPush=[].push,min=Math.min,SUPPORTS_Y=!fails(function(){return!RegExp(4294967295,"y")});__webpack_require__(110)("split",2,function(SPLIT,nativeSplit,maybeCallNative){var internalSplit;return internalSplit="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(separator,limit){var string=String(requireObjectCoercible(this)),lim=void 0===limit?4294967295:limit>>>0;if(0===lim)return[];if(void 0===separator)return[string];if(!isRegExp(separator))return nativeSplit.call(string,separator,lim);for(var match,lastIndex,lastLength,output=[],flags=(separator.ignoreCase?"i":"")+(separator.multiline?"m":"")+(separator.unicode?"u":"")+(separator.sticky?"y":""),lastLastIndex=0,separatorCopy=new RegExp(separator.source,flags+"g");(match=regexpExec.call(separatorCopy,string))&&!((lastIndex=separatorCopy.lastIndex)>lastLastIndex&&(output.push(string.slice(lastLastIndex,match.index)),match.length>1&&match.index<string.length&&arrayPush.apply(output,match.slice(1)),lastLength=match[0].length,lastLastIndex=lastIndex,output.length>=lim));)separatorCopy.lastIndex===match.index&&separatorCopy.lastIndex++;return lastLastIndex===string.length?!lastLength&&separatorCopy.test("")||output.push(""):output.push(string.slice(lastLastIndex)),output.length>lim?output.slice(0,lim):output}:"0".split(void 0,0).length?function(separator,limit){return void 0===separator&&0===limit?[]:nativeSplit.call(this,separator,limit)}:nativeSplit,[function split(separator,limit){var O=requireObjectCoercible(this),splitter=null==separator?void 0:separator[SPLIT];return void 0!==splitter?splitter.call(separator,O,limit):internalSplit.call(String(O),separator,limit)},function(regexp,limit){var res=maybeCallNative(internalSplit,regexp,this,limit,internalSplit!==nativeSplit);if(res.done)return res.value;var rx=anObject(regexp),S=String(this),C=speciesConstructor(rx,RegExp),unicodeMatching=rx.unicode,flags=(rx.ignoreCase?"i":"")+(rx.multiline?"m":"")+(rx.unicode?"u":"")+(SUPPORTS_Y?"y":"g"),splitter=new C(SUPPORTS_Y?rx:"^(?:"+rx.source+")",flags),lim=void 0===limit?4294967295:limit>>>0;if(0===lim)return[];if(0===S.length)return null===callRegExpExec(splitter,S)?[S]:[];for(var p=0,q=0,A=[];q<S.length;){splitter.lastIndex=SUPPORTS_Y?q:0;var e,z=callRegExpExec(splitter,SUPPORTS_Y?S:S.slice(q));if(null===z||(e=min(toLength(splitter.lastIndex+(SUPPORTS_Y?0:q)),S.length))===p)q=advanceStringIndex(S,q,unicodeMatching);else{if(A.push(S.slice(p,q)),A.length===lim)return A;for(var i=1;i<=z.length-1;i++)if(A.push(z[i]),A.length===lim)return A;q=p=e}}return A.push(S.slice(p)),A}]},!SUPPORTS_Y)},function(module,exports,__webpack_require__){"use strict";var toLength=__webpack_require__(24),validateArguments=__webpack_require__(398),CORRECT_IS_REGEXP_LOGIC=__webpack_require__(399)("startsWith"),nativeStartsWith="".startsWith;__webpack_require__(3)({target:"String",proto:!0,forced:!CORRECT_IS_REGEXP_LOGIC},{startsWith:function startsWith(searchString){var that=validateArguments(this,searchString,"startsWith"),index=toLength(Math.min(arguments.length>1?arguments[1]:void 0,that.length)),search=String(searchString);return nativeStartsWith?nativeStartsWith.call(that,search,index):that.slice(index,index+search.length)===search}})},function(module,exports,__webpack_require__){var isRegExp=__webpack_require__(225),requireObjectCoercible=__webpack_require__(39);module.exports=function(that,searchString,NAME){if(isRegExp(searchString))throw TypeError("String.prototype."+NAME+" doesn't accept regex");return String(requireObjectCoercible(that))}},function(module,exports,__webpack_require__){var MATCH=__webpack_require__(12)("match");module.exports=function(METHOD_NAME){var regexp=/./;try{"/./"[METHOD_NAME](regexp)}catch(e){try{return regexp[MATCH]=!1,"/./"[METHOD_NAME](regexp)}catch(f){}}return!1}},function(module,exports,__webpack_require__){"use strict";var stringify=__webpack_require__(401),parse=__webpack_require__(402),formats=__webpack_require__(228);module.exports={formats:formats,parse:parse,stringify:stringify}},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(227),formats=__webpack_require__(228),has=Object.prototype.hasOwnProperty,arrayPrefixGenerators={brackets:function brackets(prefix){return prefix+"[]"},comma:"comma",indices:function indices(prefix,key){return prefix+"["+key+"]"},repeat:function repeat(prefix){return prefix}},isArray=Array.isArray,push=Array.prototype.push,pushToArray=function(arr,valueOrArray){push.apply(arr,isArray(valueOrArray)?valueOrArray:[valueOrArray])},toISO=Date.prototype.toISOString,defaults={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:utils.encode,encodeValuesOnly:!1,formatter:formats.formatters[formats.default],indices:!1,serializeDate:function serializeDate(date){return toISO.call(date)},skipNulls:!1,strictNullHandling:!1},stringify=function stringify(object,prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset){var obj=object;if("function"==typeof filter?obj=filter(prefix,obj):obj instanceof Date?obj=serializeDate(obj):"comma"===generateArrayPrefix&&isArray(obj)&&(obj=obj.join(",")),null===obj){if(strictNullHandling)return encoder&&!encodeValuesOnly?encoder(prefix,defaults.encoder,charset):prefix;obj=""}if("string"==typeof obj||"number"==typeof obj||"boolean"==typeof obj||utils.isBuffer(obj))return encoder?[formatter(encodeValuesOnly?prefix:encoder(prefix,defaults.encoder,charset))+"="+formatter(encoder(obj,defaults.encoder,charset))]:[formatter(prefix)+"="+formatter(String(obj))];var objKeys,values=[];if(void 0===obj)return values;if(isArray(filter))objKeys=filter;else{var keys=Object.keys(obj);objKeys=sort?keys.sort(sort):keys}for(var i=0;i<objKeys.length;++i){var key=objKeys[i];skipNulls&&null===obj[key]||(isArray(obj)?pushToArray(values,stringify(obj[key],"function"==typeof generateArrayPrefix?generateArrayPrefix(prefix,key):prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)):pushToArray(values,stringify(obj[key],prefix+(allowDots?"."+key:"["+key+"]"),generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)))}return values};module.exports=function(object,opts){var objKeys,obj=object,options=function normalizeStringifyOptions(opts){if(!opts)return defaults;if(null!==opts.encoder&&void 0!==opts.encoder&&"function"!=typeof opts.encoder)throw new TypeError("Encoder has to be a function.");var charset=opts.charset||defaults.charset;if(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var format=formats.default;if(void 0!==opts.format){if(!has.call(formats.formatters,opts.format))throw new TypeError("Unknown format option provided.");format=opts.format}var formatter=formats.formatters[format],filter=defaults.filter;return("function"==typeof opts.filter||isArray(opts.filter))&&(filter=opts.filter),{addQueryPrefix:"boolean"==typeof opts.addQueryPrefix?opts.addQueryPrefix:defaults.addQueryPrefix,allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,delimiter:void 0===opts.delimiter?defaults.delimiter:opts.delimiter,encode:"boolean"==typeof opts.encode?opts.encode:defaults.encode,encoder:"function"==typeof opts.encoder?opts.encoder:defaults.encoder,encodeValuesOnly:"boolean"==typeof opts.encodeValuesOnly?opts.encodeValuesOnly:defaults.encodeValuesOnly,filter:filter,formatter:formatter,serializeDate:"function"==typeof opts.serializeDate?opts.serializeDate:defaults.serializeDate,skipNulls:"boolean"==typeof opts.skipNulls?opts.skipNulls:defaults.skipNulls,sort:"function"==typeof opts.sort?opts.sort:null,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);"function"==typeof options.filter?obj=(0,options.filter)("",obj):isArray(options.filter)&&(objKeys=options.filter);var arrayFormat,keys=[];if("object"!=typeof obj||null===obj)return"";arrayFormat=opts&&opts.arrayFormat in arrayPrefixGenerators?opts.arrayFormat:opts&&"indices"in opts?opts.indices?"indices":"repeat":"indices";var generateArrayPrefix=arrayPrefixGenerators[arrayFormat];objKeys||(objKeys=Object.keys(obj)),options.sort&&objKeys.sort(options.sort);for(var i=0;i<objKeys.length;++i){var key=objKeys[i];options.skipNulls&&null===obj[key]||pushToArray(keys,stringify(obj[key],key,generateArrayPrefix,options.strictNullHandling,options.skipNulls,options.encode?options.encoder:null,options.filter,options.sort,options.allowDots,options.serializeDate,options.formatter,options.encodeValuesOnly,options.charset))}var joined=keys.join(options.delimiter),prefix=!0===options.addQueryPrefix?"?":"";return options.charsetSentinel&&("iso-8859-1"===options.charset?prefix+="utf8=%26%2310003%3B&":prefix+="utf8=%E2%9C%93&"),joined.length>0?prefix+joined:""}},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(227),has=Object.prototype.hasOwnProperty,defaults={allowDots:!1,allowPrototypes:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:utils.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(str){return str.replace(/&#(\d+);/g,function($0,numberStr){return String.fromCharCode(parseInt(numberStr,10))})},parseKeys=function parseQueryStringKeys(givenKey,val,options){if(givenKey){var key=options.allowDots?givenKey.replace(/\.([^.[]+)/g,"[$1]"):givenKey,child=/(\[[^[\]]*])/g,segment=/(\[[^[\]]*])/.exec(key),parent=segment?key.slice(0,segment.index):key,keys=[];if(parent){if(!options.plainObjects&&has.call(Object.prototype,parent)&&!options.allowPrototypes)return;keys.push(parent)}for(var i=0;null!==(segment=child.exec(key))&&i<options.depth;){if(i+=1,!options.plainObjects&&has.call(Object.prototype,segment[1].slice(1,-1))&&!options.allowPrototypes)return;keys.push(segment[1])}return segment&&keys.push("["+key.slice(segment.index)+"]"),function(chain,val,options){for(var leaf=val,i=chain.length-1;i>=0;--i){var obj,root=chain[i];if("[]"===root&&options.parseArrays)obj=[].concat(leaf);else{obj=options.plainObjects?Object.create(null):{};var cleanRoot="["===root.charAt(0)&&"]"===root.charAt(root.length-1)?root.slice(1,-1):root,index=parseInt(cleanRoot,10);options.parseArrays||""!==cleanRoot?!isNaN(index)&&root!==cleanRoot&&String(index)===cleanRoot&&index>=0&&options.parseArrays&&index<=options.arrayLimit?(obj=[])[index]=leaf:obj[cleanRoot]=leaf:obj={0:leaf}}leaf=obj}return leaf}(keys,val,options)}};module.exports=function(str,opts){var options=function normalizeParseOptions(opts){if(!opts)return defaults;if(null!==opts.decoder&&void 0!==opts.decoder&&"function"!=typeof opts.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new Error("The charset option must be either utf-8, iso-8859-1, or undefined");var charset=void 0===opts.charset?defaults.charset:opts.charset;return{allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,allowPrototypes:"boolean"==typeof opts.allowPrototypes?opts.allowPrototypes:defaults.allowPrototypes,arrayLimit:"number"==typeof opts.arrayLimit?opts.arrayLimit:defaults.arrayLimit,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,comma:"boolean"==typeof opts.comma?opts.comma:defaults.comma,decoder:"function"==typeof opts.decoder?opts.decoder:defaults.decoder,delimiter:"string"==typeof opts.delimiter||utils.isRegExp(opts.delimiter)?opts.delimiter:defaults.delimiter,depth:"number"==typeof opts.depth?opts.depth:defaults.depth,ignoreQueryPrefix:!0===opts.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof opts.interpretNumericEntities?opts.interpretNumericEntities:defaults.interpretNumericEntities,parameterLimit:"number"==typeof opts.parameterLimit?opts.parameterLimit:defaults.parameterLimit,parseArrays:!1!==opts.parseArrays,plainObjects:"boolean"==typeof opts.plainObjects?opts.plainObjects:defaults.plainObjects,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);if(""===str||null==str)return options.plainObjects?Object.create(null):{};for(var tempObj="string"==typeof str?function parseQueryStringValues(str,options){var i,obj={},cleanStr=options.ignoreQueryPrefix?str.replace(/^\?/,""):str,limit=options.parameterLimit===1/0?void 0:options.parameterLimit,parts=cleanStr.split(options.delimiter,limit),skipIndex=-1,charset=options.charset;if(options.charsetSentinel)for(i=0;i<parts.length;++i)0===parts[i].indexOf("utf8=")&&("utf8=%E2%9C%93"===parts[i]?charset="utf-8":"utf8=%26%2310003%3B"===parts[i]&&(charset="iso-8859-1"),skipIndex=i,i=parts.length);for(i=0;i<parts.length;++i)if(i!==skipIndex){var key,val,part=parts[i],bracketEqualsPos=part.indexOf("]="),pos=-1===bracketEqualsPos?part.indexOf("="):bracketEqualsPos+1;-1===pos?(key=options.decoder(part,defaults.decoder,charset),val=options.strictNullHandling?null:""):(key=options.decoder(part.slice(0,pos),defaults.decoder,charset),val=options.decoder(part.slice(pos+1),defaults.decoder,charset)),val&&options.interpretNumericEntities&&"iso-8859-1"===charset&&(val=interpretNumericEntities(val)),val&&options.comma&&val.indexOf(",")>-1&&(val=val.split(",")),has.call(obj,key)?obj[key]=utils.combine(obj[key],val):obj[key]=val}return obj}(str,options):str,obj=options.plainObjects?Object.create(null):{},keys=Object.keys(tempObj),i=0;i<keys.length;++i){var key=keys[i],newObj=parseKeys(key,tempObj[key],options);obj=utils.merge(obj,newObj,options)}return utils.compact(obj)}},function(module,exports,__webpack_require__){var baseMerge=__webpack_require__(404),mergeWith=__webpack_require__(455)(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer)});module.exports=mergeWith},function(module,exports,__webpack_require__){var Stack=__webpack_require__(229),assignMergeValue=__webpack_require__(232),baseFor=__webpack_require__(433),baseMergeDeep=__webpack_require__(435),isObject=__webpack_require__(47),keysIn=__webpack_require__(240),safeGet=__webpack_require__(239);module.exports=function baseMerge(object,source,srcIndex,customizer,stack){object!==source&&baseFor(source,function(srcValue,key){if(stack||(stack=new Stack),isObject(srcValue))baseMergeDeep(object,source,key,srcIndex,baseMerge,customizer,stack);else{var newValue=customizer?customizer(safeGet(object,key),srcValue,key+"",object,source,stack):void 0;void 0===newValue&&(newValue=srcValue),assignMergeValue(object,key,newValue)}},keysIn)}},function(module,exports){module.exports=function listCacheClear(){this.__data__=[],this.size=0}},function(module,exports,__webpack_require__){var assocIndexOf=__webpack_require__(112),splice=Array.prototype.splice;module.exports=function listCacheDelete(key){var data=this.__data__,index=assocIndexOf(data,key);return!(index<0)&&(index==data.length-1?data.pop():splice.call(data,index,1),--this.size,!0)}},function(module,exports,__webpack_require__){var assocIndexOf=__webpack_require__(112);module.exports=function listCacheGet(key){var data=this.__data__,index=assocIndexOf(data,key);return index<0?void 0:data[index][1]}},function(module,exports,__webpack_require__){var assocIndexOf=__webpack_require__(112);module.exports=function listCacheHas(key){return assocIndexOf(this.__data__,key)>-1}},function(module,exports,__webpack_require__){var assocIndexOf=__webpack_require__(112);module.exports=function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);return index<0?(++this.size,data.push([key,value])):data[index][1]=value,this}},function(module,exports,__webpack_require__){var ListCache=__webpack_require__(111);module.exports=function stackClear(){this.__data__=new ListCache,this.size=0}},function(module,exports){module.exports=function stackDelete(key){var data=this.__data__,result=data.delete(key);return this.size=data.size,result}},function(module,exports){module.exports=function stackGet(key){return this.__data__.get(key)}},function(module,exports){module.exports=function stackHas(key){return this.__data__.has(key)}},function(module,exports,__webpack_require__){var ListCache=__webpack_require__(111),Map=__webpack_require__(162),MapCache=__webpack_require__(164),LARGE_ARRAY_SIZE=200;module.exports=function stackSet(key,value){var data=this.__data__;if(data instanceof ListCache){var pairs=data.__data__;if(!Map||pairs.length<LARGE_ARRAY_SIZE-1)return pairs.push([key,value]),this.size=++data.size,this;data=this.__data__=new MapCache(pairs)}return data.set(key,value),this.size=data.size,this}},function(module,exports,__webpack_require__){var isFunction=__webpack_require__(163),isMasked=__webpack_require__(418),isObject=__webpack_require__(47),toSource=__webpack_require__(231),reIsHostCtor=/^\[object .+?Constructor\]$/,funcProto=Function.prototype,objectProto=Object.prototype,funcToString=funcProto.toString,hasOwnProperty=objectProto.hasOwnProperty,reIsNative=RegExp("^"+funcToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");module.exports=function baseIsNative(value){return!(!isObject(value)||isMasked(value))&&(isFunction(value)?reIsNative:reIsHostCtor).test(toSource(value))}},function(module,exports,__webpack_require__){var Symbol=__webpack_require__(113),objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeObjectToString=objectProto.toString,symToStringTag=Symbol?Symbol.toStringTag:void 0;module.exports=function getRawTag(value){var isOwn=hasOwnProperty.call(value,symToStringTag),tag=value[symToStringTag];try{value[symToStringTag]=void 0;var unmasked=!0}catch(e){}var result=nativeObjectToString.call(value);return unmasked&&(isOwn?value[symToStringTag]=tag:delete value[symToStringTag]),result}},function(module,exports){var nativeObjectToString=Object.prototype.toString;module.exports=function objectToString(value){return nativeObjectToString.call(value)}},function(module,exports,__webpack_require__){var uid,coreJsData=__webpack_require__(419),maskSrcKey=(uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||""))?"Symbol(src)_1."+uid:"";module.exports=function isMasked(func){return!!maskSrcKey&&maskSrcKey in func}},function(module,exports,__webpack_require__){var coreJsData=__webpack_require__(28)["__core-js_shared__"];module.exports=coreJsData},function(module,exports){module.exports=function getValue(object,key){return null==object?void 0:object[key]}},function(module,exports,__webpack_require__){var Hash=__webpack_require__(422),ListCache=__webpack_require__(111),Map=__webpack_require__(162);module.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}}},function(module,exports,__webpack_require__){var hashClear=__webpack_require__(423),hashDelete=__webpack_require__(424),hashGet=__webpack_require__(425),hashHas=__webpack_require__(426),hashSet=__webpack_require__(427);function Hash(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}Hash.prototype.clear=hashClear,Hash.prototype.delete=hashDelete,Hash.prototype.get=hashGet,Hash.prototype.has=hashHas,Hash.prototype.set=hashSet,module.exports=Hash},function(module,exports,__webpack_require__){var nativeCreate=__webpack_require__(114);module.exports=function hashClear(){this.__data__=nativeCreate?nativeCreate(null):{},this.size=0}},function(module,exports){module.exports=function hashDelete(key){var result=this.has(key)&&delete this.__data__[key];return this.size-=result?1:0,result}},function(module,exports,__webpack_require__){var nativeCreate=__webpack_require__(114),HASH_UNDEFINED="__lodash_hash_undefined__",hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function hashGet(key){var data=this.__data__;if(nativeCreate){var result=data[key];return result===HASH_UNDEFINED?void 0:result}return hasOwnProperty.call(data,key)?data[key]:void 0}},function(module,exports,__webpack_require__){var nativeCreate=__webpack_require__(114),hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function hashHas(key){var data=this.__data__;return nativeCreate?void 0!==data[key]:hasOwnProperty.call(data,key)}},function(module,exports,__webpack_require__){var nativeCreate=__webpack_require__(114),HASH_UNDEFINED="__lodash_hash_undefined__";module.exports=function hashSet(key,value){var data=this.__data__;return this.size+=this.has(key)?0:1,data[key]=nativeCreate&&void 0===value?HASH_UNDEFINED:value,this}},function(module,exports,__webpack_require__){var getMapData=__webpack_require__(115);module.exports=function mapCacheDelete(key){var result=getMapData(this,key).delete(key);return this.size-=result?1:0,result}},function(module,exports){module.exports=function isKeyable(value){var type=typeof value;return"string"==type||"number"==type||"symbol"==type||"boolean"==type?"__proto__"!==value:null===value}},function(module,exports,__webpack_require__){var getMapData=__webpack_require__(115);module.exports=function mapCacheGet(key){return getMapData(this,key).get(key)}},function(module,exports,__webpack_require__){var getMapData=__webpack_require__(115);module.exports=function mapCacheHas(key){return getMapData(this,key).has(key)}},function(module,exports,__webpack_require__){var getMapData=__webpack_require__(115);module.exports=function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;return data.set(key,value),this.size+=data.size==size?0:1,this}},function(module,exports,__webpack_require__){var baseFor=__webpack_require__(434)();module.exports=baseFor},function(module,exports){module.exports=function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var index=-1,iterable=Object(object),props=keysFunc(object),length=props.length;length--;){var key=props[fromRight?length:++index];if(!1===iteratee(iterable[key],key,iterable))break}return object}}},function(module,exports,__webpack_require__){var assignMergeValue=__webpack_require__(232),cloneBuffer=__webpack_require__(436),cloneTypedArray=__webpack_require__(437),copyArray=__webpack_require__(439),initCloneObject=__webpack_require__(440),isArguments=__webpack_require__(237),isArray=__webpack_require__(61),isArrayLikeObject=__webpack_require__(443),isBuffer=__webpack_require__(167),isFunction=__webpack_require__(163),isObject=__webpack_require__(47),isPlainObject=__webpack_require__(445),isTypedArray=__webpack_require__(168),safeGet=__webpack_require__(239),toPlainObject=__webpack_require__(449);module.exports=function baseMergeDeep(object,source,key,srcIndex,mergeFunc,customizer,stack){var objValue=safeGet(object,key),srcValue=safeGet(source,key),stacked=stack.get(srcValue);if(stacked)assignMergeValue(object,key,stacked);else{var newValue=customizer?customizer(objValue,srcValue,key+"",object,source,stack):void 0,isCommon=void 0===newValue;if(isCommon){var isArr=isArray(srcValue),isBuff=!isArr&&isBuffer(srcValue),isTyped=!isArr&&!isBuff&&isTypedArray(srcValue);newValue=srcValue,isArr||isBuff||isTyped?isArray(objValue)?newValue=objValue:isArrayLikeObject(objValue)?newValue=copyArray(objValue):isBuff?(isCommon=!1,newValue=cloneBuffer(srcValue,!0)):isTyped?(isCommon=!1,newValue=cloneTypedArray(srcValue,!0)):newValue=[]:isPlainObject(srcValue)||isArguments(srcValue)?(newValue=objValue,isArguments(objValue)?newValue=toPlainObject(objValue):isObject(objValue)&&!isFunction(objValue)||(newValue=initCloneObject(srcValue))):isCommon=!1}isCommon&&(stack.set(srcValue,newValue),mergeFunc(newValue,srcValue,srcIndex,customizer,stack),stack.delete(srcValue)),assignMergeValue(object,key,newValue)}}},function(module,exports,__webpack_require__){(function(module){var root=__webpack_require__(28),freeExports=exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,Buffer=freeModule&&freeModule.exports===freeExports?root.Buffer:void 0,allocUnsafe=Buffer?Buffer.allocUnsafe:void 0;module.exports=function cloneBuffer(buffer,isDeep){if(isDeep)return buffer.slice();var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);return buffer.copy(result),result}}).call(this,__webpack_require__(58)(module))},function(module,exports,__webpack_require__){var cloneArrayBuffer=__webpack_require__(438);module.exports=function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length)}},function(module,exports,__webpack_require__){var Uint8Array=__webpack_require__(234);module.exports=function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);return new Uint8Array(result).set(new Uint8Array(arrayBuffer)),result}},function(module,exports){module.exports=function copyArray(source,array){var index=-1,length=source.length;for(array||(array=Array(length));++index<length;)array[index]=source[index];return array}},function(module,exports,__webpack_require__){var baseCreate=__webpack_require__(441),getPrototype=__webpack_require__(235),isPrototype=__webpack_require__(166);module.exports=function initCloneObject(object){return"function"!=typeof object.constructor||isPrototype(object)?{}:baseCreate(getPrototype(object))}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(47),objectCreate=Object.create,baseCreate=function(){function object(){}return function(proto){if(!isObject(proto))return{};if(objectCreate)return objectCreate(proto);object.prototype=proto;var result=new object;return object.prototype=void 0,result}}();module.exports=baseCreate},function(module,exports,__webpack_require__){var baseGetTag=__webpack_require__(76),isObjectLike=__webpack_require__(60),argsTag="[object Arguments]";module.exports=function baseIsArguments(value){return isObjectLike(value)&&baseGetTag(value)==argsTag}},function(module,exports,__webpack_require__){var isArrayLike=__webpack_require__(116),isObjectLike=__webpack_require__(60);module.exports=function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value)}},function(module,exports){module.exports=function stubFalse(){return!1}},function(module,exports,__webpack_require__){var baseGetTag=__webpack_require__(76),getPrototype=__webpack_require__(235),isObjectLike=__webpack_require__(60),objectTag="[object Object]",funcProto=Function.prototype,objectProto=Object.prototype,funcToString=funcProto.toString,hasOwnProperty=objectProto.hasOwnProperty,objectCtorString=funcToString.call(Object);module.exports=function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag)return!1;var proto=getPrototype(value);if(null===proto)return!0;var Ctor=hasOwnProperty.call(proto,"constructor")&&proto.constructor;return"function"==typeof Ctor&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString}},function(module,exports,__webpack_require__){var baseGetTag=__webpack_require__(76),isLength=__webpack_require__(238),isObjectLike=__webpack_require__(60),typedArrayTags={};typedArrayTags["[object Float32Array]"]=typedArrayTags["[object Float64Array]"]=typedArrayTags["[object Int8Array]"]=typedArrayTags["[object Int16Array]"]=typedArrayTags["[object Int32Array]"]=typedArrayTags["[object Uint8Array]"]=typedArrayTags["[object Uint8ClampedArray]"]=typedArrayTags["[object Uint16Array]"]=typedArrayTags["[object Uint32Array]"]=!0,typedArrayTags["[object Arguments]"]=typedArrayTags["[object Array]"]=typedArrayTags["[object ArrayBuffer]"]=typedArrayTags["[object Boolean]"]=typedArrayTags["[object DataView]"]=typedArrayTags["[object Date]"]=typedArrayTags["[object Error]"]=typedArrayTags["[object Function]"]=typedArrayTags["[object Map]"]=typedArrayTags["[object Number]"]=typedArrayTags["[object Object]"]=typedArrayTags["[object RegExp]"]=typedArrayTags["[object Set]"]=typedArrayTags["[object String]"]=typedArrayTags["[object WeakMap]"]=!1,module.exports=function baseIsTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[baseGetTag(value)]}},function(module,exports){module.exports=function baseUnary(func){return function(value){return func(value)}}},function(module,exports,__webpack_require__){(function(module){var freeGlobal=__webpack_require__(230),freeExports=exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,freeProcess=freeModule&&freeModule.exports===freeExports&&freeGlobal.process,nodeUtil=function(){try{var types=freeModule&&freeModule.require&&freeModule.require("util").types;return types||freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}();module.exports=nodeUtil}).call(this,__webpack_require__(58)(module))},function(module,exports,__webpack_require__){var copyObject=__webpack_require__(450),keysIn=__webpack_require__(240);module.exports=function toPlainObject(value){return copyObject(value,keysIn(value))}},function(module,exports,__webpack_require__){var assignValue=__webpack_require__(451),baseAssignValue=__webpack_require__(165);module.exports=function copyObject(source,props,object,customizer){var isNew=!object;object||(object={});for(var index=-1,length=props.length;++index<length;){var key=props[index],newValue=customizer?customizer(object[key],source[key],key,object,source):void 0;void 0===newValue&&(newValue=source[key]),isNew?baseAssignValue(object,key,newValue):assignValue(object,key,newValue)}return object}},function(module,exports,__webpack_require__){var baseAssignValue=__webpack_require__(165),eq=__webpack_require__(94),hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function assignValue(object,key,value){var objValue=object[key];hasOwnProperty.call(object,key)&&eq(objValue,value)&&(void 0!==value||key in object)||baseAssignValue(object,key,value)}},function(module,exports){module.exports=function baseTimes(n,iteratee){for(var index=-1,result=Array(n);++index<n;)result[index]=iteratee(index);return result}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(47),isPrototype=__webpack_require__(166),nativeKeysIn=__webpack_require__(454),hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function baseKeysIn(object){if(!isObject(object))return nativeKeysIn(object);var isProto=isPrototype(object),result=[];for(var key in object)("constructor"!=key||!isProto&&hasOwnProperty.call(object,key))&&result.push(key);return result}},function(module,exports){module.exports=function nativeKeysIn(object){var result=[];if(null!=object)for(var key in Object(object))result.push(key);return result}},function(module,exports,__webpack_require__){var baseRest=__webpack_require__(456),isIterateeCall=__webpack_require__(463);module.exports=function createAssigner(assigner){return baseRest(function(object,sources){var index=-1,length=sources.length,customizer=length>1?sources[length-1]:void 0,guard=length>2?sources[2]:void 0;for(customizer=assigner.length>3&&"function"==typeof customizer?(length--,customizer):void 0,guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=length<3?void 0:customizer,length=1),object=Object(object);++index<length;){var source=sources[index];source&&assigner(object,source,index,customizer)}return object})}},function(module,exports,__webpack_require__){var identity=__webpack_require__(243),overRest=__webpack_require__(457),setToString=__webpack_require__(459);module.exports=function baseRest(func,start){return setToString(overRest(func,start,identity),func+"")}},function(module,exports,__webpack_require__){var apply=__webpack_require__(458),nativeMax=Math.max;module.exports=function overRest(func,start,transform){return start=nativeMax(void 0===start?func.length-1:start,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);++index<length;)array[index]=args[start+index];index=-1;for(var otherArgs=Array(start+1);++index<start;)otherArgs[index]=args[index];return otherArgs[start]=transform(array),apply(func,this,otherArgs)}}},function(module,exports){module.exports=function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2])}return func.apply(thisArg,args)}},function(module,exports,__webpack_require__){var baseSetToString=__webpack_require__(460),setToString=__webpack_require__(462)(baseSetToString);module.exports=setToString},function(module,exports,__webpack_require__){var constant=__webpack_require__(461),defineProperty=__webpack_require__(233),identity=__webpack_require__(243),baseSetToString=defineProperty?function(func,string){return defineProperty(func,"toString",{configurable:!0,enumerable:!1,value:constant(string),writable:!0})}:identity;module.exports=baseSetToString},function(module,exports){module.exports=function constant(value){return function(){return value}}},function(module,exports){var HOT_COUNT=800,HOT_SPAN=16,nativeNow=Date.now;module.exports=function shortOut(func){var count=0,lastCalled=0;return function(){var stamp=nativeNow(),remaining=HOT_SPAN-(stamp-lastCalled);Iif(lastCalled=stamp,remaining>0){if(++count>=HOT_COUNT)return arguments[0]}else count=0;return func.apply(void 0,arguments)}}},function(module,exports,__webpack_require__){var eq=__webpack_require__(94),isArrayLike=__webpack_require__(116),isIndex=__webpack_require__(242),isObject=__webpack_require__(47);module.exports=function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;return!!("number"==type?isArrayLike(object)&&isIndex(index,object.length):"string"==type&&index in object)&&eq(object[index],value)}},function(module,exports,__webpack_require__){var baseIsEqual=__webpack_require__(465);module.exports=function isEqual(value,other){return baseIsEqual(value,other)}},function(module,exports,__webpack_require__){var baseIsEqualDeep=__webpack_require__(466),isObjectLike=__webpack_require__(60);module.exports=function baseIsEqual(value,other,bitmask,customizer,stack){return value===other||(null==value||null==other||!isObjectLike(value)&&!isObjectLike(other)?value!=value&&other!=other:baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack))}},function(module,exports,__webpack_require__){var Stack=__webpack_require__(229),equalArrays=__webpack_require__(244),equalByTag=__webpack_require__(472),equalObjects=__webpack_require__(475),getTag=__webpack_require__(485),isArray=__webpack_require__(61),isBuffer=__webpack_require__(167),isTypedArray=__webpack_require__(168),COMPARE_PARTIAL_FLAG=1,argsTag="[object Arguments]",arrayTag="[object Array]",objectTag="[object Object]",hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=objIsArr?arrayTag:getTag(object),othTag=othIsArr?arrayTag:getTag(other),objIsObj=(objTag=objTag==argsTag?objectTag:objTag)==objectTag,othIsObj=(othTag=othTag==argsTag?objectTag:othTag)==objectTag,isSameTag=objTag==othTag;if(isSameTag&&isBuffer(object)){if(!isBuffer(other))return!1;objIsArr=!0,objIsObj=!1}if(isSameTag&&!objIsObj)return stack||(stack=new Stack),objIsArr||isTypedArray(object)?equalArrays(object,other,bitmask,customizer,equalFunc,stack):equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);if(!(bitmask&COMPARE_PARTIAL_FLAG)){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object.value():object,othUnwrapped=othIsWrapped?other.value():other;return stack||(stack=new Stack),equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}return!!isSameTag&&(stack||(stack=new Stack),equalObjects(object,other,bitmask,customizer,equalFunc,stack))}},function(module,exports,__webpack_require__){var MapCache=__webpack_require__(164),setCacheAdd=__webpack_require__(468),setCacheHas=__webpack_require__(469);function SetCache(values){var index=-1,length=null==values?0:values.length;for(this.__data__=new MapCache;++index<length;)this.add(values[index])}SetCache.prototype.add=SetCache.prototype.push=setCacheAdd,SetCache.prototype.has=setCacheHas,module.exports=SetCache},function(module,exports){var HASH_UNDEFINED="__lodash_hash_undefined__";module.exports=function setCacheAdd(value){return this.__data__.set(value,HASH_UNDEFINED),this}},function(module,exports){module.exports=function setCacheHas(value){return this.__data__.has(value)}},function(module,exports){module.exports=function arraySome(array,predicate){for(var index=-1,length=null==array?0:array.length;++index<length;)if(predicate(array[index],index,array))return!0;return!1}},function(module,exports){module.exports=function cacheHas(cache,key){return cache.has(key)}},function(module,exports,__webpack_require__){var Symbol=__webpack_require__(113),Uint8Array=__webpack_require__(234),eq=__webpack_require__(94),equalArrays=__webpack_require__(244),mapToArray=__webpack_require__(473),setToArray=__webpack_require__(474),COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2,boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",mapTag="[object Map]",numberTag="[object Number]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",symbolProto=Symbol?Symbol.prototype:void 0,symbolValueOf=symbolProto?symbolProto.valueOf:void 0;module.exports=function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){switch(tag){case dataViewTag:if(object.byteLength!=other.byteLength||object.byteOffset!=other.byteOffset)return!1;object=object.buffer,other=other.buffer;case arrayBufferTag:return!(object.byteLength!=other.byteLength||!equalFunc(new Uint8Array(object),new Uint8Array(other)));case boolTag:case dateTag:case numberTag:return eq(+object,+other);case errorTag:return object.name==other.name&&object.message==other.message;case regexpTag:case stringTag:return object==other+"";case mapTag:var convert=mapToArray;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG;if(convert||(convert=setToArray),object.size!=other.size&&!isPartial)return!1;var stacked=stack.get(object);if(stacked)return stacked==other;bitmask|=COMPARE_UNORDERED_FLAG,stack.set(object,other);var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);return stack.delete(object),result;case symbolTag:if(symbolValueOf)return symbolValueOf.call(object)==symbolValueOf.call(other)}return!1}},function(module,exports){module.exports=function mapToArray(map){var index=-1,result=Array(map.size);return map.forEach(function(value,key){result[++index]=[key,value]}),result}},function(module,exports){module.exports=function setToArray(set){var index=-1,result=Array(set.size);return set.forEach(function(value){result[++index]=value}),result}},function(module,exports,__webpack_require__){var getAllKeys=__webpack_require__(476),COMPARE_PARTIAL_FLAG=1,hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function equalObjects(object,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,objProps=getAllKeys(object),objLength=objProps.length;if(objLength!=getAllKeys(other).length&&!isPartial)return!1;for(var index=objLength;index--;){var key=objProps[index];if(!(isPartial?key in other:hasOwnProperty.call(other,key)))return!1}var stacked=stack.get(object);if(stacked&&stack.get(other))return stacked==other;var result=!0;stack.set(object,other),stack.set(other,object);for(var skipCtor=isPartial;++index<objLength;){var objValue=object[key=objProps[index]],othValue=other[key];if(customizer)var compared=isPartial?customizer(othValue,objValue,key,other,object,stack):customizer(objValue,othValue,key,object,other,stack);if(!(void 0===compared?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result=!1;break}skipCtor||(skipCtor="constructor"==key)}if(result&&!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor)&&(result=!1)}return stack.delete(object),stack.delete(other),result}},function(module,exports,__webpack_require__){var baseGetAllKeys=__webpack_require__(477),getSymbols=__webpack_require__(479),keys=__webpack_require__(482);module.exports=function getAllKeys(object){return baseGetAllKeys(object,keys,getSymbols)}},function(module,exports,__webpack_require__){var arrayPush=__webpack_require__(478),isArray=__webpack_require__(61);module.exports=function baseGetAllKeys(object,keysFunc,symbolsFunc){var result=keysFunc(object);return isArray(object)?result:arrayPush(result,symbolsFunc(object))}},function(module,exports){module.exports=function arrayPush(array,values){for(var index=-1,length=values.length,offset=array.length;++index<length;)array[offset+index]=values[index];return array}},function(module,exports,__webpack_require__){var arrayFilter=__webpack_require__(480),stubArray=__webpack_require__(481),propertyIsEnumerable=Object.prototype.propertyIsEnumerable,nativeGetSymbols=Object.getOwnPropertySymbols,getSymbols=nativeGetSymbols?function(object){return null==object?[]:(object=Object(object),arrayFilter(nativeGetSymbols(object),function(symbol){return propertyIsEnumerable.call(object,symbol)}))}:stubArray;module.exports=getSymbols},function(module,exports){module.exports=function arrayFilter(array,predicate){for(var index=-1,length=null==array?0:array.length,resIndex=0,result=[];++index<length;){var value=array[index];predicate(value,index,array)&&(result[resIndex++]=value)}return result}},function(module,exports){module.exports=function stubArray(){return[]}},function(module,exports,__webpack_require__){var arrayLikeKeys=__webpack_require__(241),baseKeys=__webpack_require__(483),isArrayLike=__webpack_require__(116);module.exports=function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}},function(module,exports,__webpack_require__){var isPrototype=__webpack_require__(166),nativeKeys=__webpack_require__(484),hasOwnProperty=Object.prototype.hasOwnProperty;module.exports=function baseKeys(object){if(!isPrototype(object))return nativeKeys(object);var result=[];for(var key in Object(object))hasOwnProperty.call(object,key)&&"constructor"!=key&&result.push(key);return result}},function(module,exports,__webpack_require__){var nativeKeys=__webpack_require__(236)(Object.keys,Object);module.exports=nativeKeys},function(module,exports,__webpack_require__){var DataView=__webpack_require__(486),Map=__webpack_require__(162),Promise=__webpack_require__(487),Set=__webpack_require__(488),WeakMap=__webpack_require__(489),baseGetTag=__webpack_require__(76),toSource=__webpack_require__(231),dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap),getTag=baseGetTag;(DataView&&"[object DataView]"!=getTag(new DataView(new ArrayBuffer(1)))||Map&&"[object Map]"!=getTag(new Map)||Promise&&"[object Promise]"!=getTag(Promise.resolve())||Set&&"[object Set]"!=getTag(new Set)||WeakMap&&"[object WeakMap]"!=getTag(new WeakMap))&&(getTag=function(value){var result=baseGetTag(value),Ctor="[object Object]"==result?value.constructor:void 0,ctorString=Ctor?toSource(Ctor):"";if(ctorString)switch(ctorString){case dataViewCtorString:return"[object DataView]";case mapCtorString:return"[object Map]";case promiseCtorString:return"[object Promise]";case setCtorString:return"[object Set]";case weakMapCtorString:return"[object WeakMap]"}return result}),module.exports=getTag},function(module,exports,__webpack_require__){var DataView=__webpack_require__(59)(__webpack_require__(28),"DataView");module.exports=DataView},function(module,exports,__webpack_require__){var Promise=__webpack_require__(59)(__webpack_require__(28),"Promise");module.exports=Promise},function(module,exports,__webpack_require__){var Set=__webpack_require__(59)(__webpack_require__(28),"Set");module.exports=Set},function(module,exports,__webpack_require__){var WeakMap=__webpack_require__(59)(__webpack_require__(28),"WeakMap");module.exports=WeakMap},function(module,exports,__webpack_require__){var castPath=__webpack_require__(491),toKey=__webpack_require__(499);module.exports=function baseGet(object,path){for(var index=0,length=(path=castPath(path,object)).length;null!=object&&index<length;)object=object[toKey(path[index++])];return index&&index==length?object:void 0}},function(module,exports,__webpack_require__){var isArray=__webpack_require__(61),isKey=__webpack_require__(492),stringToPath=__webpack_require__(493),toString=__webpack_require__(496);module.exports=function castPath(value,object){return isArray(value)?value:isKey(value,object)?[value]:stringToPath(toString(value))}},function(module,exports,__webpack_require__){var isArray=__webpack_require__(61),isSymbol=__webpack_require__(117),reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/;module.exports=function isKey(value,object){if(isArray(value))return!1;var type=typeof value;return!("number"!=type&&"symbol"!=type&&"boolean"!=type&&null!=value&&!isSymbol(value))||(reIsPlainProp.test(value)||!reIsDeepProp.test(value)||null!=object&&value in Object(object))}},function(module,exports,__webpack_require__){var memoizeCapped=__webpack_require__(494),rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,reEscapeChar=/\\(\\)?/g,stringToPath=memoizeCapped(function(string){var result=[];return 46===string.charCodeAt(0)&&result.push(""),string.replace(rePropName,function(match,number,quote,subString){result.push(quote?subString.replace(reEscapeChar,"$1"):number||match)}),result});module.exports=stringToPath},function(module,exports,__webpack_require__){var memoize=__webpack_require__(495),MAX_MEMOIZE_SIZE=500;module.exports=function memoizeCapped(func){var result=memoize(func,function(key){return cache.size===MAX_MEMOIZE_SIZE&&cache.clear(),key}),cache=result.cache;return result}},function(module,exports,__webpack_require__){var MapCache=__webpack_require__(164),FUNC_ERROR_TEXT="Expected a function";function memoize(func,resolver){Iif("function"!=typeof func||null!=resolver&&"function"!=typeof resolver)throw new TypeError(FUNC_ERROR_TEXT);var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key))return cache.get(key);var result=func.apply(this,args);return memoized.cache=cache.set(key,result)||cache,result};return memoized.cache=new(memoize.Cache||MapCache),memoized}memoize.Cache=MapCache,module.exports=memoize},function(module,exports,__webpack_require__){var baseToString=__webpack_require__(497);module.exports=function toString(value){return null==value?"":baseToString(value)}},function(module,exports,__webpack_require__){var Symbol=__webpack_require__(113),arrayMap=__webpack_require__(498),isArray=__webpack_require__(61),isSymbol=__webpack_require__(117),INFINITY=1/0,symbolProto=Symbol?Symbol.prototype:void 0,symbolToString=symbolProto?symbolProto.toString:void 0;module.exports=function baseToString(value){if("string"==typeof value)return value;if(isArray(value))return arrayMap(value,baseToString)+"";if(isSymbol(value))return symbolToString?symbolToString.call(value):"";var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}},function(module,exports){module.exports=function arrayMap(array,iteratee){for(var index=-1,length=null==array?0:array.length,result=Array(length);++index<length;)result[index]=iteratee(array[index],index,array);return result}},function(module,exports,__webpack_require__){var isSymbol=__webpack_require__(117),INFINITY=1/0;module.exports=function toKey(value){if("string"==typeof value||isSymbol(value))return value;var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(155),__webpack_require__(22),__webpack_require__(252),__webpack_require__(51),__webpack_require__(27),__webpack_require__(150),__webpack_require__(151),__webpack_require__(156),__webpack_require__(501),__webpack_require__(154),__webpack_require__(44),__webpack_require__(502),__webpack_require__(253),__webpack_require__(6),__webpack_require__(152),__webpack_require__(254),__webpack_require__(503),__webpack_require__(45),__webpack_require__(504),__webpack_require__(26),__webpack_require__(153),__webpack_require__(75),__webpack_require__(46),__webpack_require__(224),__webpack_require__(19),__webpack_require__(35),__webpack_require__(255),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _global=__webpack_require__(20),_qs=_interopRequireDefault(__webpack_require__(256)),_eventemitter=_interopRequireDefault(__webpack_require__(507)),_memoizerific=_interopRequireDefault(__webpack_require__(161)),_debounce=_interopRequireDefault(__webpack_require__(508)),_commonTags=__webpack_require__(269),_coreEvents=_interopRequireDefault(__webpack_require__(74)),_clientLogger=__webpack_require__(73),_utils=__webpack_require__(93),_pathToId=_interopRequireDefault(__webpack_require__(259)),_queryparams=__webpack_require__(260);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _typeof(obj){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function _typeof(obj){return typeof obj}:function _typeof(obj){return obj&&"function"==typeof Symbol&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj})(obj)}function _templateObject(){var data=function _taggedTemplateLiteral(strings,raw){raw||(raw=strings.slice(0));return Object.freeze(Object.defineProperties(strings,{raw:{value:Object.freeze(raw)}}))}(["\n        Story with id "," already exists in the store!\n\n        Perhaps you added the same story twice, or you have a name collision?\n        Story ids need to be unique -- ensure you aren't using the same names modolo url-sanitization.\n      "]);return _templateObject=function _templateObject(){return data},data}function _objectWithoutProperties(source,excluded){if(null==source)return{};var key,i,target=function _objectWithoutPropertiesLoose(source,excluded){if(null==source)return{};var key,i,target={},sourceKeys=Object.keys(source);for(i=0;i<sourceKeys.length;i++)key=sourceKeys[i],excluded.indexOf(key)>=0||(target[key]=source[key]);return target}(source,excluded);if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++)key=sourceSymbolKeys[i],excluded.indexOf(key)>=0||Object.prototype.propertyIsEnumerable.call(source,key)&&(target[key]=source[key])}return target}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}function _getPrototypeOf(o){return(_getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf:function _getPrototypeOf(o){return o.__proto__||Object.getPrototypeOf(o)})(o)}function _assertThisInitialized(self){Iif(void 0===self)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return self}function _setPrototypeOf(o,p){return(_setPrototypeOf=Object.setPrototypeOf||function _setPrototypeOf(o,p){return o.__proto__=p,o})(o,p)}function _defineProperty(obj,key,value){return key in obj?Object.defineProperty(obj,key,{value:value,enumerable:!0,configurable:!0,writable:!0}):obj[key]=value,obj}function _slicedToArray(arr,i){return function _arrayWithHoles(arr){Eif(Array.isArray(arr))return arr}(arr)||function _iterableToArrayLimit(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}var toKey=function toKey(input){return input.replace(/[^a-z0-9]+([a-z0-9])/gi,function(){for(var _len=arguments.length,params=new Array(_len),_key=0;_key<_len;_key++)params[_key]=arguments[_key];return params[1].toUpperCase()})},count=0;function getId(){return count+=1}var getIdFromLegacyQuery=function getIdFromLegacyQuery(_ref3){var path=_ref3.path,selectedKind=_ref3.selectedKind,selectedStory=_ref3.selectedStory;return path&&(0,_pathToId.default)(path)||selectedKind&&selectedStory&&(0,_utils.toId)(selectedKind,selectedStory)},StoryStore=function(_EventEmitter){function StoryStore(_params){var _this;return function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,StoryStore),(_this=function _possibleConstructorReturn(self,call){return!call||"object"!==_typeof(call)&&"function"!=typeof call?_assertThisInitialized(self):call}(this,_getPrototypeOf(StoryStore).call(this))).setChannel=function(channel){_this._channel=channel},_this.getIdOnPath=function(){return(0,_queryparams.getQueryParams)().id},_this.setPath=function(storyId){var params=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},path="".concat(_global.document.location.pathname,"?").concat(_qs.default.stringify(Object.assign({},params,{id:storyId})));_global.history.replaceState({},"",path)},_this.fromId=function(id){try{var data=_this._data[id];return data&&data.getDecorated?data:null}catch(e){return _clientLogger.logger.warn("failed to get story:",_this._data),_clientLogger.logger.error(e),{}}},_this.setSelection=function(data){_this._selection=data,setTimeout(function(){return _this.emit(_coreEvents.default.STORY_RENDER)},1)},_this.getSelection=function(){return _this._selection},_this.remove=function(id){var _data=_assertThisInitialized(_this)._data,story=_data[id];if(delete _data[id],story){var kind=story.kind,name=story.name,kindData=_this._legacydata[toKey(kind)];kindData&&delete kindData.stories[toKey(name)]}},_this.pushToManager=(0,_debounce.default)(function(){Eif(_this._channel){var stories=_this.extract();_this._channel.emit(_coreEvents.default.SET_STORIES,{stories:stories})}},0),_this._legacydata={},_this._data={},_this._revision=0,_this._selection={},_this._channel=_params.channel,_this.on(_coreEvents.default.STORY_INIT,function(){var storyId=_this.getIdOnPath();Iif(!storyId){var query=(0,_queryparams.getQueryParams)();if(storyId=getIdFromLegacyQuery(query)){query.path,query.selectedKind,query.selectedStory;var rest=_objectWithoutProperties(query,["path","selectedKind","selectedStory"]);_this.setPath(storyId,rest)}}_this.setSelection(_this.fromId(storyId))}),_this}return function _inherits(subClass,superClass){Iif("function"!=typeof superClass&&null!==superClass)throw new TypeError("Super expression must either be null or a function");subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,writable:!0,configurable:!0}}),superClass&&_setPrototypeOf(subClass,superClass)}(StoryStore,_eventemitter["default"]),function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Constructor}(StoryStore,[{key:"setSeparators",value:function setSeparators(data){this.separators=data}},{key:"raw",value:function raw(){var _this2=this;return Object.values(this._data).filter(function(i){return!!i.getDecorated}).map(function(_ref4){var id=_ref4.id;return _this2.fromId(id)})}},{key:"extract",value:function extract(){return Object.entries(this._data).reduce(function(a,_ref5){var _ref6=_slicedToArray(_ref5,2),k=_ref6[0],v=_ref6[1];return Object.assign(a,_defineProperty({},k,function toExtracted(obj){return Object.entries(obj).reduce(function(acc,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];return"function"==typeof value?acc:Array.isArray(value)?Object.assign(acc,_defineProperty({},key,value.slice().sort())):Object.assign(acc,_defineProperty({},key,value))},{})}(v)))},{})}},{key:"addStory",value:function addStory(_ref7,_ref8){var id=_ref7.id,kind=_ref7.kind,name=_ref7.name,original=_ref7.storyFn,_ref7$parameters=_ref7.parameters,parameters=void 0===_ref7$parameters?{}:_ref7$parameters,getDecorators=_ref8.getDecorators,applyDecorators=_ref8.applyDecorators,_data=this._data;_data[id]&&_clientLogger.logger.warn((0,_commonTags.stripIndents)(_templateObject(),id));var identification={id:id,kind:kind,name:name,story:name},getOriginal=function getOriginal(){return original},getDecorated=(0,_memoizerific.default)(1)(function(){return applyDecorators(getOriginal(),getDecorators())}),storyFn=function storyFn(p){return getDecorated()(Object.assign({},identification,{parameters:Object.assign({},parameters,p)}))};_data[id]=function toChild(it){return Object.assign({},it)}(Object.assign({},identification,{getDecorated:getDecorated,getOriginal:getOriginal,storyFn:storyFn,parameters:parameters})),this.addLegacyStory({kind:kind,name:name,storyFn:storyFn,parameters:parameters}),this.pushToManager()}},{key:"getRevision",value:function getRevision(){return this._revision}},{key:"incrementRevision",value:function incrementRevision(){this._revision+=1}},{key:"addLegacyStory",value:function addLegacyStory(_ref9){var kind=_ref9.kind,name=_ref9.name,storyFn=_ref9.storyFn,_ref9$parameters=_ref9.parameters,parameters=void 0===_ref9$parameters?{}:_ref9$parameters,k=toKey(kind);this._legacydata[k]||(this._legacydata[k]={kind:kind,fileName:parameters.fileName,index:getId(),stories:{}}),this._legacydata[k].stories[toKey(name)]={name:name,index:getId(),story:storyFn,parameters:parameters}}},{key:"getStoryKinds",value:function getStoryKinds(){return Object.values(this._legacydata).filter(function(kind){return Object.keys(kind.stories).length>0}).sort(function(info1,info2){return info1.index-info2.index}).map(function(info){return info.kind})}},{key:"getStories",value:function getStories(kind){var _this3=this,key=toKey(kind);return this._legacydata[key]?Object.keys(this._legacydata[key].stories).map(function(name){return _this3._legacydata[key].stories[name]}).sort(function(info1,info2){return info1.index-info2.index}).map(function(info){return info.name}):[]}},{key:"getStoryFileName",value:function getStoryFileName(kind){var key=toKey(kind),storiesKind=this._legacydata[key];return storiesKind?storiesKind.fileName:null}},{key:"getStoryAndParameters",value:function getStoryAndParameters(kind,name){if(!kind||!name)return null;var storiesKind=this._legacydata[toKey(kind)];if(!storiesKind)return null;var storyInfo=storiesKind.stories[toKey(name)];return storyInfo?{story:storyInfo.story,parameters:storyInfo.parameters}:null}},{key:"getStory",value:function getStory(kind,name){var data=this.getStoryAndParameters(kind,name);return data&&data.story}},{key:"getStoryWithContext",value:function getStoryWithContext(kind,name){var data=this.getStoryAndParameters(kind,name);return data?data.story:null}},{key:"removeStoryKind",value:function removeStoryKind(kind){this.hasStoryKind(kind)&&(this._legacydata[toKey(kind)].stories={},this._data=Object.entries(this._data).reduce(function(acc,_ref10){var _ref11=_slicedToArray(_ref10,2),id=_ref11[0],story=_ref11[1];return story.kind!==kind&&Object.assign(acc,_defineProperty({},id,story)),acc},{}))}},{key:"hasStoryKind",value:function hasStoryKind(kind){return Boolean(this._legacydata[toKey(kind)])}},{key:"hasStory",value:function hasStory(kind,name){return Boolean(this.getStory(kind,name))}},{key:"dumpStoryBook",value:function dumpStoryBook(){var _this4=this;return this.getStoryKinds().map(function(kind){return{kind:kind,stories:_this4.getStories(kind)}})}},{key:"size",value:function size(){return Object.keys(this._legacydata).length}},{key:"clean",value:function clean(){var _this5=this;this.getStoryKinds().forEach(function(kind){return delete _this5._legacydata[toKey(kind)]})}}]),StoryStore}();exports.default=StoryStore},function(module,exports,__webpack_require__){"use strict";var aFunction=__webpack_require__(43),toObject=__webpack_require__(30),fails=__webpack_require__(9),nativeSort=[].sort,test=[1,2,3],FAILS_ON_UNDEFINED=fails(function(){test.sort(void 0)}),FAILS_ON_NULL=fails(function(){test.sort(null)}),SLOPPY_METHOD=__webpack_require__(107)("sort"),FORCED=FAILS_ON_UNDEFINED||!FAILS_ON_NULL||SLOPPY_METHOD;__webpack_require__(3)({target:"Array",proto:!0,forced:FORCED},{sort:function sort(comparefn){return void 0===comparefn?nativeSort.call(toObject(this)):nativeSort.call(toObject(this),aFunction(comparefn))}})},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Object",stat:!0,sham:!__webpack_require__(14)},{create:__webpack_require__(57)})},function(module,exports,__webpack_require__){var toObject=__webpack_require__(30),nativeGetPrototypeOf=__webpack_require__(42),CORRECT_PROTOTYPE_GETTER=__webpack_require__(148),FAILS_ON_PRIMITIVES=__webpack_require__(9)(function(){nativeGetPrototypeOf(1)});__webpack_require__(3)({target:"Object",stat:!0,forced:FAILS_ON_PRIMITIVES,sham:!CORRECT_PROTOTYPE_GETTER},{getPrototypeOf:function getPrototypeOf(it){return nativeGetPrototypeOf(toObject(it))}})},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Object",stat:!0},{setPrototypeOf:__webpack_require__(106)})},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(257),formats=__webpack_require__(258),has=Object.prototype.hasOwnProperty,arrayPrefixGenerators={brackets:function brackets(prefix){return prefix+"[]"},comma:"comma",indices:function indices(prefix,key){return prefix+"["+key+"]"},repeat:function repeat(prefix){return prefix}},isArray=Array.isArray,push=Array.prototype.push,pushToArray=function(arr,valueOrArray){push.apply(arr,isArray(valueOrArray)?valueOrArray:[valueOrArray])},toISO=Date.prototype.toISOString,defaults={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:utils.encode,encodeValuesOnly:!1,formatter:formats.formatters[formats.default],indices:!1,serializeDate:function serializeDate(date){return toISO.call(date)},skipNulls:!1,strictNullHandling:!1},stringify=function stringify(object,prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset){var obj=object;if("function"==typeof filter?obj=filter(prefix,obj):obj instanceof Date?obj=serializeDate(obj):"comma"===generateArrayPrefix&&isArray(obj)&&(obj=obj.join(",")),null===obj){if(strictNullHandling)return encoder&&!encodeValuesOnly?encoder(prefix,defaults.encoder,charset):prefix;obj=""}if("string"==typeof obj||"number"==typeof obj||"boolean"==typeof obj||utils.isBuffer(obj))return encoder?[formatter(encodeValuesOnly?prefix:encoder(prefix,defaults.encoder,charset))+"="+formatter(encoder(obj,defaults.encoder,charset))]:[formatter(prefix)+"="+formatter(String(obj))];var objKeys,values=[];if(void 0===obj)return values;if(isArray(filter))objKeys=filter;else{var keys=Object.keys(obj);objKeys=sort?keys.sort(sort):keys}for(var i=0;i<objKeys.length;++i){var key=objKeys[i];skipNulls&&null===obj[key]||(isArray(obj)?pushToArray(values,stringify(obj[key],"function"==typeof generateArrayPrefix?generateArrayPrefix(prefix,key):prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)):pushToArray(values,stringify(obj[key],prefix+(allowDots?"."+key:"["+key+"]"),generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)))}return values};module.exports=function(object,opts){var objKeys,obj=object,options=function normalizeStringifyOptions(opts){if(!opts)return defaults;if(null!==opts.encoder&&void 0!==opts.encoder&&"function"!=typeof opts.encoder)throw new TypeError("Encoder has to be a function.");var charset=opts.charset||defaults.charset;if(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var format=formats.default;if(void 0!==opts.format){if(!has.call(formats.formatters,opts.format))throw new TypeError("Unknown format option provided.");format=opts.format}var formatter=formats.formatters[format],filter=defaults.filter;return("function"==typeof opts.filter||isArray(opts.filter))&&(filter=opts.filter),{addQueryPrefix:"boolean"==typeof opts.addQueryPrefix?opts.addQueryPrefix:defaults.addQueryPrefix,allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,delimiter:void 0===opts.delimiter?defaults.delimiter:opts.delimiter,encode:"boolean"==typeof opts.encode?opts.encode:defaults.encode,encoder:"function"==typeof opts.encoder?opts.encoder:defaults.encoder,encodeValuesOnly:"boolean"==typeof opts.encodeValuesOnly?opts.encodeValuesOnly:defaults.encodeValuesOnly,filter:filter,formatter:formatter,serializeDate:"function"==typeof opts.serializeDate?opts.serializeDate:defaults.serializeDate,skipNulls:"boolean"==typeof opts.skipNulls?opts.skipNulls:defaults.skipNulls,sort:"function"==typeof opts.sort?opts.sort:null,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);"function"==typeof options.filter?obj=(0,options.filter)("",obj):isArray(options.filter)&&(objKeys=options.filter);var arrayFormat,keys=[];if("object"!=typeof obj||null===obj)return"";arrayFormat=opts&&opts.arrayFormat in arrayPrefixGenerators?opts.arrayFormat:opts&&"indices"in opts?opts.indices?"indices":"repeat":"indices";var generateArrayPrefix=arrayPrefixGenerators[arrayFormat];objKeys||(objKeys=Object.keys(obj)),options.sort&&objKeys.sort(options.sort);for(var i=0;i<objKeys.length;++i){var key=objKeys[i];options.skipNulls&&null===obj[key]||pushToArray(keys,stringify(obj[key],key,generateArrayPrefix,options.strictNullHandling,options.skipNulls,options.encode?options.encoder:null,options.filter,options.sort,options.allowDots,options.serializeDate,options.formatter,options.encodeValuesOnly,options.charset))}var joined=keys.join(options.delimiter),prefix=!0===options.addQueryPrefix?"?":"";return options.charsetSentinel&&("iso-8859-1"===options.charset?prefix+="utf8=%26%2310003%3B&":prefix+="utf8=%E2%9C%93&"),joined.length>0?prefix+joined:""}},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(257),has=Object.prototype.hasOwnProperty,defaults={allowDots:!1,allowPrototypes:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:utils.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(str){return str.replace(/&#(\d+);/g,function($0,numberStr){return String.fromCharCode(parseInt(numberStr,10))})},parseKeys=function parseQueryStringKeys(givenKey,val,options){Eif(givenKey){var key=options.allowDots?givenKey.replace(/\.([^.[]+)/g,"[$1]"):givenKey,child=/(\[[^[\]]*])/g,segment=/(\[[^[\]]*])/.exec(key),parent=segment?key.slice(0,segment.index):key,keys=[];Eif(parent){Iif(!options.plainObjects&&has.call(Object.prototype,parent)&&!options.allowPrototypes)return;keys.push(parent)}for(var i=0;null!==(segment=child.exec(key))&&i<options.depth;){if(i+=1,!options.plainObjects&&has.call(Object.prototype,segment[1].slice(1,-1))&&!options.allowPrototypes)return;keys.push(segment[1])}return segment&&keys.push("["+key.slice(segment.index)+"]"),function(chain,val,options){for(var leaf=val,i=chain.length-1;i>=0;--i){var obj,root=chain[i];Iif("[]"===root&&options.parseArrays)obj=[].concat(leaf);else{obj=options.plainObjects?Object.create(null):{};var cleanRoot="["===root.charAt(0)&&"]"===root.charAt(root.length-1)?root.slice(1,-1):root,index=parseInt(cleanRoot,10);options.parseArrays||""!==cleanRoot?!isNaN(index)&&root!==cleanRoot&&String(index)===cleanRoot&&index>=0&&options.parseArrays&&index<=options.arrayLimit?(obj=[])[index]=leaf:obj[cleanRoot]=leaf:obj={0:leaf}}leaf=obj}return leaf}(keys,val,options)}};module.exports=function(str,opts){var options=function normalizeParseOptions(opts){Iif(!opts)return defaults;Iif(null!==opts.decoder&&void 0!==opts.decoder&&"function"!=typeof opts.decoder)throw new TypeError("Decoder has to be a function.");Iif(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new Error("The charset option must be either utf-8, iso-8859-1, or undefined");var charset=void 0===opts.charset?defaults.charset:opts.charset;return{allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,allowPrototypes:"boolean"==typeof opts.allowPrototypes?opts.allowPrototypes:defaults.allowPrototypes,arrayLimit:"number"==typeof opts.arrayLimit?opts.arrayLimit:defaults.arrayLimit,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,comma:"boolean"==typeof opts.comma?opts.comma:defaults.comma,decoder:"function"==typeof opts.decoder?opts.decoder:defaults.decoder,delimiter:"string"==typeof opts.delimiter||utils.isRegExp(opts.delimiter)?opts.delimiter:defaults.delimiter,depth:"number"==typeof opts.depth?opts.depth:defaults.depth,ignoreQueryPrefix:!0===opts.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof opts.interpretNumericEntities?opts.interpretNumericEntities:defaults.interpretNumericEntities,parameterLimit:"number"==typeof opts.parameterLimit?opts.parameterLimit:defaults.parameterLimit,parseArrays:!1!==opts.parseArrays,plainObjects:"boolean"==typeof opts.plainObjects?opts.plainObjects:defaults.plainObjects,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);Iif(""===str||null==str)return options.plainObjects?Object.create(null):{};for(var tempObj="string"==typeof str?function parseQueryStringValues(str,options){var i,obj={},cleanStr=options.ignoreQueryPrefix?str.replace(/^\?/,""):str,limit=options.parameterLimit===1/0?void 0:options.parameterLimit,parts=cleanStr.split(options.delimiter,limit),skipIndex=-1,charset=options.charset;Iif(options.charsetSentinel)for(i=0;i<parts.length;++i)0===parts[i].indexOf("utf8=")&&("utf8=%E2%9C%93"===parts[i]?charset="utf-8":"utf8=%26%2310003%3B"===parts[i]&&(charset="iso-8859-1"),skipIndex=i,i=parts.length);for(i=0;i<parts.length;++i)Eif(i!==skipIndex){var key,val,part=parts[i],bracketEqualsPos=part.indexOf("]="),pos=-1===bracketEqualsPos?part.indexOf("="):bracketEqualsPos+1;-1===pos?(key=options.decoder(part,defaults.decoder,charset),val=options.strictNullHandling?null:""):(key=options.decoder(part.slice(0,pos),defaults.decoder,charset),val=options.decoder(part.slice(pos+1),defaults.decoder,charset)),val&&options.interpretNumericEntities&&"iso-8859-1"===charset&&(val=interpretNumericEntities(val)),val&&options.comma&&val.indexOf(",")>-1&&(val=val.split(",")),has.call(obj,key)?obj[key]=utils.combine(obj[key],val):obj[key]=val}return obj}(str,options):str,obj=options.plainObjects?Object.create(null):{},keys=Object.keys(tempObj),i=0;i<keys.length;++i){var key=keys[i],newObj=parseKeys(key,tempObj[key],options);obj=utils.merge(obj,newObj,options)}return utils.compact(obj)}},function(module,exports,__webpack_require__){"use strict";var has=Object.prototype.hasOwnProperty,prefix="~";function Events(){}function EE(fn,context,once){this.fn=fn,this.context=context,this.once=once||!1}function addListener(emitter,event,fn,context,once){Iif("function"!=typeof fn)throw new TypeError("The listener must be a function");var listener=new EE(fn,context||emitter,once),evt=prefix?prefix+event:event;return emitter._events[evt]?emitter._events[evt].fn?emitter._events[evt]=[emitter._events[evt],listener]:emitter._events[evt].push(listener):(emitter._events[evt]=listener,emitter._eventsCount++),emitter}function clearEvent(emitter,evt){0==--emitter._eventsCount?emitter._events=new Events:delete emitter._events[evt]}function EventEmitter(){this._events=new Events,this._eventsCount=0}Object.create&&(Events.prototype=Object.create(null),(new Events).__proto__||(prefix=!1)),EventEmitter.prototype.eventNames=function eventNames(){var events,name,names=[];if(0===this._eventsCount)return names;for(name in events=this._events)has.call(events,name)&&names.push(prefix?name.slice(1):name);return Object.getOwnPropertySymbols?names.concat(Object.getOwnPropertySymbols(events)):names},EventEmitter.prototype.listeners=function listeners(event){var evt=prefix?prefix+event:event,handlers=this._events[evt];if(!handlers)return[];if(handlers.fn)return[handlers.fn];for(var i=0,l=handlers.length,ee=new Array(l);i<l;i++)ee[i]=handlers[i].fn;return ee},EventEmitter.prototype.listenerCount=function listenerCount(event){var evt=prefix?prefix+event:event,listeners=this._events[evt];return listeners?listeners.fn?1:listeners.length:0},EventEmitter.prototype.emit=function emit(event,a1,a2,a3,a4,a5){var evt=prefix?prefix+event:event;Iif(!this._events[evt])return!1;var args,i,listeners=this._events[evt],len=arguments.length;Eif(listeners.fn){switch(listeners.once&&this.removeListener(event,listeners.fn,void 0,!0),len){case 1:return listeners.fn.call(listeners.context),!0;case 2:return listeners.fn.call(listeners.context,a1),!0;case 3:return listeners.fn.call(listeners.context,a1,a2),!0;case 4:return listeners.fn.call(listeners.context,a1,a2,a3),!0;case 5:return listeners.fn.call(listeners.context,a1,a2,a3,a4),!0;case 6:return listeners.fn.call(listeners.context,a1,a2,a3,a4,a5),!0}for(i=1,args=new Array(len-1);i<len;i++)args[i-1]=arguments[i];listeners.fn.apply(listeners.context,args)}else{var j,length=listeners.length;for(i=0;i<length;i++)switch(listeners[i].once&&this.removeListener(event,listeners[i].fn,void 0,!0),len){case 1:listeners[i].fn.call(listeners[i].context);break;case 2:listeners[i].fn.call(listeners[i].context,a1);break;case 3:listeners[i].fn.call(listeners[i].context,a1,a2);break;case 4:listeners[i].fn.call(listeners[i].context,a1,a2,a3);break;default:if(!args)for(j=1,args=new Array(len-1);j<len;j++)args[j-1]=arguments[j];listeners[i].fn.apply(listeners[i].context,args)}}return!0},EventEmitter.prototype.on=function on(event,fn,context){return addListener(this,event,fn,context,!1)},EventEmitter.prototype.once=function once(event,fn,context){return addListener(this,event,fn,context,!0)},EventEmitter.prototype.removeListener=function removeListener(event,fn,context,once){var evt=prefix?prefix+event:event;if(!this._events[evt])return this;if(!fn)return clearEvent(this,evt),this;var listeners=this._events[evt];if(listeners.fn)listeners.fn!==fn||once&&!listeners.once||context&&listeners.context!==context||clearEvent(this,evt);else{for(var i=0,events=[],length=listeners.length;i<length;i++)(listeners[i].fn!==fn||once&&!listeners[i].once||context&&listeners[i].context!==context)&&events.push(listeners[i]);events.length?this._events[evt]=1===events.length?events[0]:events:clearEvent(this,evt)}return this},EventEmitter.prototype.removeAllListeners=function removeAllListeners(event){var evt;return event?(evt=prefix?prefix+event:event,this._events[evt]&&clearEvent(this,evt)):(this._events=new Events,this._eventsCount=0),this},EventEmitter.prototype.off=EventEmitter.prototype.removeListener,EventEmitter.prototype.addListener=EventEmitter.prototype.on,EventEmitter.prefixed=prefix,EventEmitter.EventEmitter=EventEmitter,module.exports=EventEmitter},function(module,exports,__webpack_require__){var isObject=__webpack_require__(47),now=__webpack_require__(509),toNumber=__webpack_require__(510),FUNC_ERROR_TEXT="Expected a function",nativeMax=Math.max,nativeMin=Math.min;module.exports=function debounce(func,wait,options){var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=!1,maxing=!1,trailing=!0;Iif("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);function invokeFunc(time){var args=lastArgs,thisArg=lastThis;return lastArgs=lastThis=void 0,lastInvokeTime=time,result=func.apply(thisArg,args)}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime;return void 0===lastCallTime||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&time-lastInvokeTime>=maxWait}function timerExpired(){var time=now();Eif(shouldInvoke(time))return trailingEdge(time);timerId=setTimeout(timerExpired,function remainingWait(time){var timeWaiting=wait-(time-lastCallTime);return maxing?nativeMin(timeWaiting,maxWait-(time-lastInvokeTime)):timeWaiting}(time))}function trailingEdge(time){return timerId=void 0,trailing&&lastArgs?invokeFunc(time):(lastArgs=lastThis=void 0,result)}function debounced(){var time=now(),isInvoking=shouldInvoke(time);Eif(lastArgs=arguments,lastThis=this,lastCallTime=time,isInvoking){if(void 0===timerId)return function leadingEdge(time){return lastInvokeTime=time,timerId=setTimeout(timerExpired,wait),leading?invokeFunc(time):result}(lastCallTime);Iif(maxing)return clearTimeout(timerId),timerId=setTimeout(timerExpired,wait),invokeFunc(lastCallTime)}return void 0===timerId&&(timerId=setTimeout(timerExpired,wait)),result}return wait=toNumber(wait)||0,isObject(options)&&(leading=!!options.leading,maxWait=(maxing="maxWait"in options)?nativeMax(toNumber(options.maxWait)||0,wait):maxWait,trailing="trailing"in options?!!options.trailing:trailing),debounced.cancel=function cancel(){void 0!==timerId&&clearTimeout(timerId),lastInvokeTime=0,lastArgs=lastCallTime=lastThis=timerId=void 0},debounced.flush=function flush(){return void 0===timerId?result:trailingEdge(now())},debounced}},function(module,exports,__webpack_require__){var root=__webpack_require__(28);module.exports=function(){return root.Date.now()}},function(module,exports,__webpack_require__){var isObject=__webpack_require__(47),isSymbol=__webpack_require__(117),NAN=NaN,reTrim=/^\s+|\s+$/g,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsOctal=/^0o[0-7]+$/i,freeParseInt=parseInt;module.exports=function toNumber(value){Eif("number"==typeof value)return value;if(isSymbol(value))return NAN;if(isObject(value)){var other="function"==typeof value.valueOf?value.valueOf():value;value=isObject(other)?other+"":other}if("string"!=typeof value)return 0===value?value:+value;value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),__webpack_require__(255),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _global=__webpack_require__(20),_coreEvents=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(74)),_clientLogger=__webpack_require__(73);function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}var ConfigApi=function(){function ConfigApi(_ref){var _this=this,channel=_ref.channel,storyStore=_ref.storyStore,clearDecorators=_ref.clearDecorators,clientApi=_ref.clientApi;!function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,ConfigApi),this.configure=function(loaders,module){var render=function render(){var errors=[];try{loaders&&loaders()}catch(e){_clientLogger.logger.error(e),errors.push(e)}try{_this._renderMain()}catch(e){_clientLogger.logger.error(e),errors.push(e)}errors.length&&(module.hot&&"apply"===module.hot.status()?(_clientLogger.logger.error("RELOAD THE PAGE","module.hot.status() === apply"),_global.location.reload()):_this._renderError(errors[0]))};module.hot&&(module.hot.accept(function(){setTimeout(render)}),module.hot.dispose(function(){_this._clearDecorators()})),_this._channel?(render(),setTimeout(function(){return _this._channel.emit(_coreEvents.default.STORIES_CONFIGURED)},0)):loaders()},this._channel=channel,this._storyStore=storyStore,this._clearDecorators=clearDecorators,this.clientApi=clientApi}return function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Constructor}(ConfigApi,[{key:"_renderMain",value:function _renderMain(){this._storyStore.emit(_coreEvents.default.STORY_INIT)}},{key:"_renderError",value:function _renderError(e){var error={stack:e.stack,message:e.message};this._storyStore.setSelection({error:error})}}]),ConfigApi}();exports.default=ConfigApi},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(252),__webpack_require__(154),__webpack_require__(44),__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function start(render){var decorateStory=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).decorateStory,context=getContext(decorateStory),clientApi=context.clientApi,channel=context.channel,configApi=context.configApi,storyStore=context.storyStore,previousKind="",previousStory="",previousRevision=-1,renderMain=function renderMain(forceRender){var revision=storyStore.getRevision(),selection=storyStore.getSelection(),_ref4=selection||{},kind=_ref4.kind,name=_ref4.name,getDecorated=_ref4.getDecorated,id=_ref4.id;Eif(getDecorated){Iif(!forceRender&&revision===previousRevision&&kind===previousKind&&previousStory===name)return void _addons.default.getChannel().emit(_coreEvents.default.STORY_UNCHANGED,id);!forceRender&&previousKind&&previousStory&&_addons.default.getChannel().emit(_coreEvents.default.STORY_CHANGED,id),render(Object.assign({},context,selection,{selectedKind:kind,selectedStory:name,forceRender:forceRender})),_addons.default.getChannel().emit(_coreEvents.default.STORY_RENDERED,id)}else!function showNopreview(){_global.document.body.classList.remove(classes.MAIN),_global.document.body.classList.remove(classes.ERROR),_global.document.body.classList.add(classes.NOPREVIEW)}(),_addons.default.getChannel().emit(_coreEvents.default.STORY_MISSING,id);previousRevision=revision,previousKind=kind,previousStory=name,forceRender||(_global.document.documentElement.scrollTop=0)},renderUI=function renderUI(forceRender){Eif(isBrowser)try{renderMain(forceRender)}catch(ex){showException(ex)}},forceReRender=function forceReRender(){return renderUI(!0)};Eif(isBrowser){var deprecatedToId=(0,_utilDeprecate.default)(_utils.toId,"Passing name+kind to the SET_CURRENT_STORY event is deprecated, use a storyId instead");channel.on(_coreEvents.default.FORCE_RE_RENDER,forceReRender),channel.on(_coreEvents.default.SET_CURRENT_STORY,function(_ref5){var inputStoryId=_ref5.storyId,name=_ref5.name,kind=_ref5.kind,storyId=inputStoryId;if(!storyId){if(!name||!kind)throw new Error("You should pass `storyId` into SET_CURRENT_STORY");storyId=deprecatedToId(kind,name)}var data=storyStore.fromId(storyId);storyStore.setSelection(data),storyStore.setPath(storyId)}),_global.window.onkeydown=function(event){if(!function focusInInput(event){return/input|textarea/i.test(event.target.tagName)||null!==event.target.getAttribute("contenteditable")}(event)){var altKey=event.altKey,ctrlKey=event.ctrlKey,metaKey=event.metaKey,shiftKey=event.shiftKey,key=event.key,code=event.code,keyCode=event.keyCode;channel.emit(_coreEvents.default.PREVIEW_KEYDOWN,{event:{altKey:altKey,ctrlKey:ctrlKey,metaKey:metaKey,shiftKey:shiftKey,key:key,code:code,keyCode:keyCode}})}}}storyStore.on(_coreEvents.default.STORY_RENDER,renderUI),void 0!==_global.window&&(_global.window.__STORYBOOK_CLIENT_API__=clientApi,_global.window.__STORYBOOK_ADDONS_CHANNEL__=channel);return{context:context,clientApi:clientApi,configApi:configApi,forceReRender:forceReRender}},exports.getContext=void 0;var _addons=_interopRequireDefault(__webpack_require__(92)),_global=__webpack_require__(20),_channelPostmessage=_interopRequireDefault(__webpack_require__(513)),_clientApi2=__webpack_require__(214),_utils=__webpack_require__(93),_clientLogger=__webpack_require__(73),_coreEvents=_interopRequireDefault(__webpack_require__(74)),_utilDeprecate=_interopRequireDefault(__webpack_require__(222));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}var classes={MAIN:"sb-show-main",NOPREVIEW:"sb-show-nopreview",ERROR:"sb-show-errordisplay"};function showMain(){_global.document.body.classList.remove(classes.NOPREVIEW),_global.document.body.classList.remove(classes.ERROR),_global.document.body.classList.add(classes.MAIN)}function showErrorDisplay(_ref){var message=_ref.message,stack=_ref.stack;_global.document.getElementById("error-message").textContent=message,_global.document.getElementById("error-stack").textContent=stack,_global.document.body.classList.remove(classes.MAIN),_global.document.body.classList.remove(classes.NOPREVIEW),_global.document.body.classList.add(classes.ERROR)}function showError(_ref2){var title=_ref2.title,description=_ref2.description;_addons.default.getChannel().emit(_coreEvents.default.STORY_ERRORED,{title:title,description:description}),showErrorDisplay({message:title,stack:description})}function showException(exception){_addons.default.getChannel().emit(_coreEvents.default.STORY_THREW_EXCEPTION,exception),showErrorDisplay(exception),_clientLogger.logger.error(exception.stack)}var isBrowser=_global.navigator&&_global.navigator.userAgent&&"storyshots"!==_global.navigator.userAgent&&!(_global.navigator.userAgent.indexOf("Node.js")>-1)&&!(_global.navigator.userAgent.indexOf("jsdom")>-1),getContext=function(decorateStory){var storyStore,clientApi,channel=null;Eif(isBrowser)try{channel=_addons.default.getChannel()}catch(e){channel=(0,_channelPostmessage.default)({page:"preview"}),_addons.default.setChannel(channel)}void 0!==_global.window&&_global.window.__STORYBOOK_CLIENT_API__?storyStore=(clientApi=_global.window.__STORYBOOK_CLIENT_API__)._storyStore:(storyStore=new _clientApi2.StoryStore({channel:channel}),clientApi=new _clientApi2.ClientApi({storyStore:storyStore,decorateStory:decorateStory}));var clearDecorators=clientApi.clearDecorators;return{configApi:new _clientApi2.ConfigApi({clearDecorators:clearDecorators,storyStore:storyStore,channel:channel,clientApi:clientApi}),storyStore:storyStore,channel:channel,clientApi:clientApi,showMain:showMain,showError:showError,showException:showException}};exports.getContext=getContext},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(22),__webpack_require__(89),__webpack_require__(51),__webpack_require__(27),__webpack_require__(90),__webpack_require__(514),__webpack_require__(515),__webpack_require__(518),__webpack_require__(6),__webpack_require__(26),__webpack_require__(262),__webpack_require__(91),__webpack_require__(46),__webpack_require__(19),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function createChannel(_ref2){var page=_ref2.page,transport=new PostmsgTransport({page:page});return new _channels.default({transport:transport})},exports.PostmsgTransport=exports.KEY=void 0;var _global=__webpack_require__(20),_channels=function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}(__webpack_require__(223)),_clientLogger=__webpack_require__(73),_telejson=__webpack_require__(524);function _toConsumableArray(arr){return function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}}(arr)||function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||"[object Arguments]"===Object.prototype.toString.call(iter))return Array.from(iter)}(arr)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}var KEY="storybook-channel";exports.KEY=KEY;var PostmsgTransport=function(){function PostmsgTransport(config){Iif(function _classCallCheck(instance,Constructor){Iif(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}(this,PostmsgTransport),this.config=config,this.buffer=void 0,this.handler=void 0,this.connected=void 0,this.buffer=[],this.handler=null,_global.window.addEventListener("message",this.handleEvent.bind(this),!1),"manager"!==config.page&&"preview"!==config.page)throw new Error('postmsg-channel: "config.page" cannot be "'.concat(config.page,'"'))}return function _createClass(Constructor,protoProps,staticProps){return protoProps&&_defineProperties(Constructor.prototype,protoProps),staticProps&&_defineProperties(Constructor,staticProps),Constructor}(PostmsgTransport,[{key:"setHandler",value:function setHandler(handler){var _this=this;this.handler=function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];handler.apply(_this,args),!_this.connected&&_this.getWindow()&&(_this.flush(),_this.connected=!0)}}},{key:"send",value:function send(event,options){var _this2=this,iframeWindow=this.getWindow();Iif(!iframeWindow)return new Promise(function(resolve,reject){_this2.buffer.push({event:event,resolve:resolve,reject:reject})});var depth=15,allowFunction=!0;options&&"boolean"==typeof options.allowFunction&&(allowFunction=options.allowFunction),options&&Number.isInteger(options.depth)&&(depth=options.depth);var data=(0,_telejson.stringify)({key:KEY,event:event},{maxDepth:depth,allowFunction:allowFunction});return iframeWindow.postMessage(data,"*"),Promise.resolve(null)}},{key:"flush",value:function flush(){var _this3=this,buffer=this.buffer;this.buffer=[],buffer.forEach(function(item){_this3.send(item.event).then(item.resolve).catch(item.reject)})}},{key:"getWindow",value:function getWindow(){Iif("manager"===this.config.page){var iframe=_global.document.getElementById("storybook-preview-iframe");return iframe?iframe.contentWindow:null}return _global.window.parent}},{key:"handleEvent",value:function handleEvent(rawEvent){try{var data=rawEvent.data,_ref="string"==typeof data&&(0,_telejson.isJSON)(data)?(0,_telejson.parse)(data):data,key=_ref.key,event=_ref.event;key===KEY&&(_clientLogger.logger.debug.apply(_clientLogger.logger,["message arrived at ".concat(this.config.page),event.type].concat(_toConsumableArray(event.args))),this.handler(event))}catch(error){_clientLogger.logger.error(error)}}}]),PostmsgTransport}();exports.PostmsgTransport=PostmsgTransport},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Function",proto:!0},{bind:__webpack_require__(261)})},function(module,exports,__webpack_require__){"use strict";var global=__webpack_require__(7),isForced=__webpack_require__(105),has=__webpack_require__(16),classof=__webpack_require__(38),inheritIfRequired=__webpack_require__(248),toPrimitive=__webpack_require__(69),fails=__webpack_require__(9),getOwnPropertyNames=__webpack_require__(103).f,getOwnPropertyDescriptor=__webpack_require__(31).f,defineProperty=__webpack_require__(15).f,internalStringTrim=__webpack_require__(516),NativeNumber=global.Number,NumberPrototype=NativeNumber.prototype,BROKEN_CLASSOF="Number"==classof(__webpack_require__(57)(NumberPrototype)),NATIVE_TRIM="trim"in String.prototype,toNumber=function(argument){var first,third,radix,maxCode,digits,length,i,code,it=toPrimitive(argument,!1);if("string"==typeof it&&it.length>2)if(43===(first=(it=NATIVE_TRIM?it.trim():internalStringTrim(it,3)).charCodeAt(0))||45===first){if(88===(third=it.charCodeAt(2))||120===third)return NaN}else if(48===first){switch(it.charCodeAt(1)){case 66:case 98:radix=2,maxCode=49;break;case 79:case 111:radix=8,maxCode=55;break;default:return+it}for(length=(digits=it.slice(2)).length,i=0;i<length;i++)if((code=digits.charCodeAt(i))<48||code>maxCode)return NaN;return parseInt(digits,radix)}return+it};Iif(isForced("Number",!NativeNumber(" 0o1")||!NativeNumber("0b1")||NativeNumber("+0x1"))){for(var key,NumberWrapper=function Number(value){var it=arguments.length<1?0:value,that=this;return that instanceof NumberWrapper&&(BROKEN_CLASSOF?fails(function(){NumberPrototype.valueOf.call(that)}):"Number"!=classof(that))?inheritIfRequired(new NativeNumber(toNumber(it)),that,NumberWrapper):toNumber(it)},keys=__webpack_require__(14)?getOwnPropertyNames(NativeNumber):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),j=0;keys.length>j;j++)has(NativeNumber,key=keys[j])&&!has(NumberWrapper,key)&&defineProperty(NumberWrapper,key,getOwnPropertyDescriptor(NativeNumber,key));NumberWrapper.prototype=NumberPrototype,NumberPrototype.constructor=NumberWrapper,__webpack_require__(32)(global,"Number",NumberWrapper)}},function(module,exports,__webpack_require__){var requireObjectCoercible=__webpack_require__(39),whitespace="["+__webpack_require__(517)+"]",ltrim=RegExp("^"+whitespace+whitespace+"*"),rtrim=RegExp(whitespace+whitespace+"*$");module.exports=function(string,TYPE){return string=String(requireObjectCoercible(string)),1&TYPE&&(string=string.replace(ltrim,"")),2&TYPE&&(string=string.replace(rtrim,"")),string}},function(module,exports){module.exports="\t\n\v\f\r                 \u2028\u2029\ufeff"},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Number",stat:!0},{isInteger:__webpack_require__(519)})},function(module,exports,__webpack_require__){var isObject=__webpack_require__(10),floor=Math.floor;module.exports=function isInteger(it){return!isObject(it)&&isFinite(it)&&floor(it)===it}},function(module,exports,__webpack_require__){var flush,head,last,notify,toggle,node,promise,global=__webpack_require__(7),getOwnPropertyDescriptor=__webpack_require__(31).f,classof=__webpack_require__(38),macrotask=__webpack_require__(157).set,userAgent=__webpack_require__(171),MutationObserver=global.MutationObserver||global.WebKitMutationObserver,process=global.process,Promise=global.Promise,IS_NODE="process"==classof(process),queueMicrotaskDescriptor=getOwnPropertyDescriptor(global,"queueMicrotask"),queueMicrotask=queueMicrotaskDescriptor&&queueMicrotaskDescriptor.value;queueMicrotask||(flush=function(){var parent,fn;for(IS_NODE&&(parent=process.domain)&&parent.exit();head;){fn=head.fn,head=head.next;try{fn()}catch(error){throw head?notify():last=void 0,error}}last=void 0,parent&&parent.enter()},IS_NODE?notify=function(){process.nextTick(flush)}:MutationObserver&&!/(iPhone|iPod|iPad).*AppleWebKit/i.test(userAgent)?(toggle=!0,node=document.createTextNode(""),new MutationObserver(flush).observe(node,{characterData:!0}),notify=function(){node.data=toggle=!toggle}):Promise&&Promise.resolve?(promise=Promise.resolve(void 0),notify=function(){promise.then(flush)}):notify=function(){macrotask.call(global,flush)}),module.exports=queueMicrotask||function(fn){var task={fn:fn,next:void 0};last&&(last.next=task),head||(head=task,notify()),last=task}},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4),isObject=__webpack_require__(10),newPromiseCapability=__webpack_require__(263);module.exports=function(C,x){if(anObject(C),isObject(x)&&x.constructor===C)return x;var promiseCapability=newPromiseCapability.f(C);return(0,promiseCapability.resolve)(x),promiseCapability.promise}},function(module,exports,__webpack_require__){var global=__webpack_require__(7);module.exports=function(a,b){var console=global.console;console&&console.error&&(1===arguments.length?console.error(a):console.error(a,b))}},function(module,exports){module.exports=function(exec){try{return{error:!1,value:exec()}}catch(error){return{error:!0,value:error}}}},function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parse=exports.stringify=exports.isJSON=exports.reviver=exports.replacer=void 0;var _global=__webpack_require__(20),_isRegex=_interopRequireDefault(__webpack_require__(187)),_isFunction=_interopRequireDefault(__webpack_require__(525)),_isSymbol=_interopRequireDefault(__webpack_require__(180)),_isobject=_interopRequireDefault(__webpack_require__(526)),_get=_interopRequireDefault(__webpack_require__(245)),_memoizerific=_interopRequireDefault(__webpack_require__(161));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function _iterableToArrayLimit(arr,i){var _arr=[],_n=!0,_d=!1,_e=void 0;try{for(var _s,_i=arr[Symbol.iterator]();!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}var removeCodeComments=function removeCodeComments(code){var inQuoteChar=null,inBlockComment=!1,inLineComment=!1,inRegexLiteral=!1,newCode="";if(code.indexOf("//")>=0||code.indexOf("/*")>=0)for(var i=0;i<code.length;i+=1)inQuoteChar||inBlockComment||inLineComment||inRegexLiteral?(inQuoteChar&&(code[i]===inQuoteChar&&"\\"!==code[i-1]||"\n"===code[i]&&"`"!==inQuoteChar)&&(inQuoteChar=null),inRegexLiteral&&("/"===code[i]&&"\\"!==code[i-1]||"\n"===code[i])&&(inRegexLiteral=!1),inBlockComment&&"/"===code[i-1]&&"*"===code[i-2]&&(inBlockComment=!1),inLineComment&&"\n"===code[i]&&(inLineComment=!1)):'"'===code[i]||"'"===code[i]||"`"===code[i]?inQuoteChar=code[i]:"/"===code[i]&&"*"===code[i+1]?inBlockComment=!0:"/"===code[i]&&"/"===code[i+1]?inLineComment=!0:"/"===code[i]&&"/"!==code[i+1]&&(inRegexLiteral=!0),inBlockComment||inLineComment||(newCode+=code[i]);else newCode=code;return newCode},cleanCode=(0,_memoizerific.default)(1e4)(function(code){return removeCodeComments(code).replace(/\n\s*/g,"").trim()}),dateFormat=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/,replacer=function replacer(options){var objects,stack,keys;return function replace(key,value){if(""===key)return keys=["root"],objects=[{keys:"root",value:value}],stack=[],value;for(;stack.length&&this!==stack[0];)stack.shift(),keys.pop();if((0,_isRegex.default)(value)){Iif(!options.allowRegExp)return;return"_regexp_".concat(value.flags,"|").concat(value.source)}Iif((0,_isFunction.default)(value)){if(!options.allowFunction)return;var name=value.name,stringified=value.toString();return stringified.match(/(\[native code\]|WEBPACK_IMPORTED_MODULE|__webpack_exports__|__webpack_require__)/)?"_function_".concat(name,"|").concat(function(){}.toString()):"_function_".concat(name,"|").concat(cleanCode(stringified))}Iif((0,_isSymbol.default)(value)){if(!options.allowSymbol)return;return"_symbol_".concat(value.toString().slice(7,-1))}Iif("string"==typeof value&&dateFormat.test(value)){if(!options.allowDate)return;return"_date_".concat(value)}Iif(void 0===value){if(!options.allowUndefined)return;return"_undefined_"}Iif("number"==typeof value)return value===-1/0?"_-Infinity_":value===1/0?"_Infinity_":Number.isNaN(value)?"_NaN_":value;if("string"==typeof value)return value;Iif(stack.length>=options.maxDepth)return Array.isArray(value)?"[Array(".concat(value.length,")]"):"[Object]";var found=objects.find(function(o){return o.value===value});Eif(!found){Iif(value&&(0,_isobject.default)(value)&&value.constructor&&value.constructor.name&&"Object"!==value.constructor.name){if(!options.allowClass)return;try{Object.assign(value,{"_constructor-name_":value.constructor.name})}catch(e){}}return keys.push(key),stack.unshift(value),objects.push({keys:keys.join("."),value:value}),value}return"_duplicate_".concat(found.keys)}};exports.replacer=replacer;var reviver=function reviver(){var refs=[],root;return function revive(key,value){if(""===key&&(root=value,refs.forEach(function(_ref){var target=_ref.target,container=_ref.container,replacement=_ref.replacement;container[target]="root"===replacement?root:(0,_get.default)(root,replacement.replace("root.",""))})),"_constructor-name_"===key)return value;if((0,_isobject.default)(value)&&value["_constructor-name_"]){var name=value["_constructor-name_"];if("Object"!==name){var Fn=new Function("return function ".concat(name,"(){}"))();Object.setPrototypeOf(value,new Fn)}return delete value["_constructor-name_"],value}if("string"==typeof value&&value.startsWith("_function_")){var _value$match=value.match(/_function_([^|]*)\|(.*)/),_value$match2=_slicedToArray(_value$match,3),_name=_value$match2[1],source=_value$match2[2],result=function result(){var f=eval("(".concat(source,")"));f.apply(void 0,arguments)};return Object.defineProperty(result,"toString",{value:function value(){return source}}),Object.defineProperty(result,"name",{value:_name}),result}if("string"==typeof value&&value.startsWith("_regexp_")){var _value$match3=value.match(/_regexp_([^|]*)\|(.*)/),_value$match4=_slicedToArray(_value$match3,3),flags=_value$match4[1],_source=_value$match4[2];return new RegExp(_source,flags)}return"string"==typeof value&&value.startsWith("_date_")?new Date(value.replace("_date_","")):"string"==typeof value&&value.startsWith("_duplicate_")?(refs.push({target:key,container:this,replacement:value.replace("_duplicate_","")}),null):"string"==typeof value&&value.startsWith("_symbol_")?Symbol(value.replace("_symbol_","")):"string"!=typeof value||"_undefined_"!==value?"string"==typeof value&&"_-Infinity_"===value?-1/0:"string"==typeof value&&"_Infinity_"===value?1/0:"string"==typeof value&&"_NaN_"===value?NaN:value:void 0}};exports.reviver=reviver;var isJSON=function isJSON(input){return input.match(/^[\[\{\"\}].*[\]\}\"]$/)};exports.isJSON=isJSON;var defaultOptions={maxDepth:10,space:void 0,allowFunction:!0,allowRegExp:!0,allowDate:!0,allowClass:!0,allowUndefined:!0,allowSymbol:!0},stringify=function stringify(data){var options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},mergedOptions=Object.assign({},defaultOptions,options);return JSON.stringify(data,replacer(mergedOptions),options.space)};exports.stringify=stringify;var parse=function parse(data){return JSON.parse(data,reviver())};exports.parse=parse},function(module,exports){module.exports=function isFunction(fn){var string=toString.call(fn);return"[object Function]"===string||"function"==typeof fn&&"[object RegExp]"!==string||"undefined"!=typeof window&&(fn===window.setTimeout||fn===window.alert||fn===window.confirm||fn===window.prompt)};var toString=Object.prototype.toString},function(module,exports,__webpack_require__){"use strict";
/*!
 * isobject <https://github.com/jonschlinkert/isobject>
 *
 * Copyright (c) 2014-2017, Jon Schlinkert.
 * Released under the MIT License.
 */module.exports=function isObject(val){return null!=val&&"object"==typeof val&&!1===Array.isArray(val)}},function(module,exports,__webpack_require__){"use strict";var _global=__webpack_require__(20);__webpack_require__(528),_global.window.STORYBOOK_ENV="angular"},function(module,exports,__webpack_require__){"use strict";__webpack_require__(529),__webpack_require__(543),__webpack_require__(556)},function(module,exports,__webpack_require__){__webpack_require__(530),__webpack_require__(531),__webpack_require__(532),__webpack_require__(533),__webpack_require__(534),__webpack_require__(535),__webpack_require__(536),__webpack_require__(537),__webpack_require__(538),__webpack_require__(539),__webpack_require__(540),__webpack_require__(541),__webpack_require__(542),module.exports=__webpack_require__(85).Reflect},function(module,exports,__webpack_require__){var aFunction=__webpack_require__(43),anObject=__webpack_require__(4),nativeApply=(__webpack_require__(7).Reflect||{}).apply,functionApply=Function.apply,OPTIONAL_ARGUMENTS_LIST=!__webpack_require__(9)(function(){nativeApply(function(){})});__webpack_require__(3)({target:"Reflect",stat:!0,forced:OPTIONAL_ARGUMENTS_LIST},{apply:function apply(target,thisArgument,argumentsList){return aFunction(target),anObject(argumentsList),nativeApply?nativeApply(target,thisArgument,argumentsList):functionApply.call(target,thisArgument,argumentsList)}})},function(module,exports,__webpack_require__){var create=__webpack_require__(57),aFunction=__webpack_require__(43),anObject=__webpack_require__(4),isObject=__webpack_require__(10),fails=__webpack_require__(9),bind=__webpack_require__(261),nativeConstruct=(__webpack_require__(7).Reflect||{}).construct,NEW_TARGET_BUG=fails(function(){function F(){}return!(nativeConstruct(function(){},[],F)instanceof F)}),ARGS_BUG=!fails(function(){nativeConstruct(function(){})}),FORCED=NEW_TARGET_BUG||ARGS_BUG;__webpack_require__(3)({target:"Reflect",stat:!0,forced:FORCED,sham:FORCED},{construct:function construct(Target,args){aFunction(Target),anObject(args);var newTarget=arguments.length<3?Target:aFunction(arguments[2]);if(ARGS_BUG&&!NEW_TARGET_BUG)return nativeConstruct(Target,args,newTarget);if(Target==newTarget){switch(args.length){case 0:return new Target;case 1:return new Target(args[0]);case 2:return new Target(args[0],args[1]);case 3:return new Target(args[0],args[1],args[2]);case 4:return new Target(args[0],args[1],args[2],args[3])}var $args=[null];return $args.push.apply($args,args),new(bind.apply(Target,$args))}var proto=newTarget.prototype,instance=create(isObject(proto)?proto:Object.prototype),result=Function.apply.call(Target,instance,args);return isObject(result)?result:instance}})},function(module,exports,__webpack_require__){var definePropertyModule=__webpack_require__(15),anObject=__webpack_require__(4),toPrimitive=__webpack_require__(69),DESCRIPTORS=__webpack_require__(14),ERROR_INSTEAD_OF_FALSE=__webpack_require__(9)(function(){Reflect.defineProperty(definePropertyModule.f({},1,{value:1}),1,{value:2})});__webpack_require__(3)({target:"Reflect",stat:!0,forced:ERROR_INSTEAD_OF_FALSE,sham:!DESCRIPTORS},{defineProperty:function defineProperty(target,propertyKey,attributes){anObject(target),propertyKey=toPrimitive(propertyKey,!0),anObject(attributes);try{return definePropertyModule.f(target,propertyKey,attributes),!0}catch(error){return!1}}})},function(module,exports,__webpack_require__){var getOwnPropertyDescriptor=__webpack_require__(31).f,anObject=__webpack_require__(4);__webpack_require__(3)({target:"Reflect",stat:!0},{deleteProperty:function deleteProperty(target,propertyKey){var descriptor=getOwnPropertyDescriptor(anObject(target),propertyKey);return!(descriptor&&!descriptor.configurable)&&delete target[propertyKey]}})},function(module,exports,__webpack_require__){var getOwnPropertyDescriptorModule=__webpack_require__(31),getPrototypeOf=__webpack_require__(42),has=__webpack_require__(16),isObject=__webpack_require__(10),anObject=__webpack_require__(4);__webpack_require__(3)({target:"Reflect",stat:!0},{get:function get(target,propertyKey){var descriptor,prototype,receiver=arguments.length<3?target:arguments[2];return anObject(target)===receiver?target[propertyKey]:(descriptor=getOwnPropertyDescriptorModule.f(target,propertyKey))?has(descriptor,"value")?descriptor.value:void 0===descriptor.get?void 0:descriptor.get.call(receiver):isObject(prototype=getPrototypeOf(target))?get(prototype,propertyKey,receiver):void 0}})},function(module,exports,__webpack_require__){var getOwnPropertyDescriptorModule=__webpack_require__(31),anObject=__webpack_require__(4),DESCRIPTORS=__webpack_require__(14);__webpack_require__(3)({target:"Reflect",stat:!0,sham:!DESCRIPTORS},{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(target,propertyKey){return getOwnPropertyDescriptorModule.f(anObject(target),propertyKey)}})},function(module,exports,__webpack_require__){var objectGetPrototypeOf=__webpack_require__(42),anObject=__webpack_require__(4),CORRECT_PROTOTYPE_GETTER=__webpack_require__(148);__webpack_require__(3)({target:"Reflect",stat:!0,sham:!CORRECT_PROTOTYPE_GETTER},{getPrototypeOf:function getPrototypeOf(target){return objectGetPrototypeOf(anObject(target))}})},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Reflect",stat:!0},{has:function has(target,propertyKey){return propertyKey in target}})},function(module,exports,__webpack_require__){var anObject=__webpack_require__(4),objectIsExtensible=Object.isExtensible;__webpack_require__(3)({target:"Reflect",stat:!0},{isExtensible:function isExtensible(target){return anObject(target),!objectIsExtensible||objectIsExtensible(target)}})},function(module,exports,__webpack_require__){__webpack_require__(3)({target:"Reflect",stat:!0},{ownKeys:__webpack_require__(200)})},function(module,exports,__webpack_require__){var getBuiltIn=__webpack_require__(251),anObject=__webpack_require__(4),FREEZING=__webpack_require__(170);__webpack_require__(3)({target:"Reflect",stat:!0,sham:!FREEZING},{preventExtensions:function preventExtensions(target){anObject(target);try{var objectPreventExtensions=getBuiltIn("Object","preventExtensions");return objectPreventExtensions&&objectPreventExtensions(target),!0}catch(error){return!1}}})},function(module,exports,__webpack_require__){var definePropertyModule=__webpack_require__(15),getOwnPropertyDescriptorModule=__webpack_require__(31),getPrototypeOf=__webpack_require__(42),has=__webpack_require__(16),createPropertyDescriptor=__webpack_require__(70),anObject=__webpack_require__(4),isObject=__webpack_require__(10);__webpack_require__(3)({target:"Reflect",stat:!0},{set:function set(target,propertyKey,V){var existingDescriptor,prototype,receiver=arguments.length<4?target:arguments[3],ownDescriptor=getOwnPropertyDescriptorModule.f(anObject(target),propertyKey);if(!ownDescriptor){if(isObject(prototype=getPrototypeOf(target)))return set(prototype,propertyKey,V,receiver);ownDescriptor=createPropertyDescriptor(0)}if(has(ownDescriptor,"value")){if(!1===ownDescriptor.writable||!isObject(receiver))return!1;if(existingDescriptor=getOwnPropertyDescriptorModule.f(receiver,propertyKey)){if(existingDescriptor.get||existingDescriptor.set||!1===existingDescriptor.writable)return!1;existingDescriptor.value=V,definePropertyModule.f(receiver,propertyKey,existingDescriptor)}else definePropertyModule.f(receiver,propertyKey,createPropertyDescriptor(0,V));return!0}return void 0!==ownDescriptor.set&&(ownDescriptor.set.call(receiver,V),!0)}})},function(module,exports,__webpack_require__){var objectSetPrototypeOf=__webpack_require__(106),validateSetPrototypeOfArguments=__webpack_require__(211);objectSetPrototypeOf&&__webpack_require__(3)({target:"Reflect",stat:!0},{setPrototypeOf:function setPrototypeOf(target,proto){validateSetPrototypeOfArguments(target,proto);try{return objectSetPrototypeOf(target,proto),!0}catch(error){return!1}}})},function(module,exports,__webpack_require__){__webpack_require__(544),__webpack_require__(547),__webpack_require__(548),__webpack_require__(549),__webpack_require__(551),__webpack_require__(552),__webpack_require__(553),__webpack_require__(554),__webpack_require__(555)},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),toMetadataKey=ReflectMetadataModule.toKey,ordinaryDefineOwnMetadata=ReflectMetadataModule.set;__webpack_require__(3)({target:"Reflect",stat:!0},{defineMetadata:function defineMetadata(metadataKey,metadataValue,target){var targetKey=arguments.length<4?void 0:toMetadataKey(arguments[3]);ordinaryDefineOwnMetadata(metadataKey,metadataValue,anObject(target),targetKey)}})},function(module,exports,__webpack_require__){"use strict";var InternalWeakMap,global=__webpack_require__(7),redefineAll=__webpack_require__(119),InternalMetadataModule=__webpack_require__(95),weak=__webpack_require__(546),isObject=__webpack_require__(10),enforceIternalState=__webpack_require__(50).enforce,NATIVE_WEAK_MAP=__webpack_require__(198),IS_IE11=!global.ActiveXObject&&"ActiveXObject"in global,isExtensible=Object.isExtensible,wrapper=function(get){return function WeakMap(){return get(this,arguments.length>0?arguments[0]:void 0)}},$WeakMap=module.exports=__webpack_require__(169)("WeakMap",wrapper,weak,!0,!0);Iif(NATIVE_WEAK_MAP&&IS_IE11){InternalWeakMap=weak.getConstructor(wrapper,"WeakMap",!0),InternalMetadataModule.REQUIRED=!0;var WeakMapPrototype=$WeakMap.prototype,nativeDelete=WeakMapPrototype.delete,nativeHas=WeakMapPrototype.has,nativeGet=WeakMapPrototype.get,nativeSet=WeakMapPrototype.set;redefineAll(WeakMapPrototype,{delete:function(key){if(isObject(key)&&!isExtensible(key)){var state=enforceIternalState(this);return state.frozen||(state.frozen=new InternalWeakMap),nativeDelete.call(this,key)||state.frozen.delete(key)}return nativeDelete.call(this,key)},has:function has(key){if(isObject(key)&&!isExtensible(key)){var state=enforceIternalState(this);return state.frozen||(state.frozen=new InternalWeakMap),nativeHas.call(this,key)||state.frozen.has(key)}return nativeHas.call(this,key)},get:function get(key){if(isObject(key)&&!isExtensible(key)){var state=enforceIternalState(this);return state.frozen||(state.frozen=new InternalWeakMap),nativeHas.call(this,key)?nativeGet.call(this,key):state.frozen.get(key)}return nativeGet.call(this,key)},set:function set(key,value){if(isObject(key)&&!isExtensible(key)){var state=enforceIternalState(this);state.frozen||(state.frozen=new InternalWeakMap),nativeHas.call(this,key)?nativeSet.call(this,key,value):state.frozen.set(key,value)}else nativeSet.call(this,key,value);return this}})}},function(module,exports,__webpack_require__){"use strict";var redefineAll=__webpack_require__(119),getWeakData=__webpack_require__(95).getWeakData,anObject=__webpack_require__(4),isObject=__webpack_require__(10),anInstance=__webpack_require__(118),iterate=__webpack_require__(96),createArrayMethod=__webpack_require__(87),$has=__webpack_require__(16),InternalStateModule=__webpack_require__(50),setInternalState=InternalStateModule.set,internalStateGetterFor=InternalStateModule.getterFor,arrayFind=createArrayMethod(5),arrayFindIndex=createArrayMethod(6),id=0,uncaughtFrozenStore=function(store){return store.frozen||(store.frozen=new UncaughtFrozenStore)},UncaughtFrozenStore=function(){this.entries=[]},findUncaughtFrozen=function(store,key){return arrayFind(store.entries,function(it){return it[0]===key})};UncaughtFrozenStore.prototype={get:function(key){var entry=findUncaughtFrozen(this,key);if(entry)return entry[1]},has:function(key){return!!findUncaughtFrozen(this,key)},set:function(key,value){var entry=findUncaughtFrozen(this,key);entry?entry[1]=value:this.entries.push([key,value])},delete:function(key){var index=arrayFindIndex(this.entries,function(it){return it[0]===key});return~index&&this.entries.splice(index,1),!!~index}},module.exports={getConstructor:function(wrapper,CONSTRUCTOR_NAME,IS_MAP,ADDER){var C=wrapper(function(that,iterable){anInstance(that,C,CONSTRUCTOR_NAME),setInternalState(that,{type:CONSTRUCTOR_NAME,id:id++,frozen:void 0}),null!=iterable&&iterate(iterable,that[ADDER],that,IS_MAP)}),getInternalState=internalStateGetterFor(CONSTRUCTOR_NAME),define=function(that,key,value){var state=getInternalState(that),data=getWeakData(anObject(key),!0);return!0===data?uncaughtFrozenStore(state).set(key,value):data[state.id]=value,that};return redefineAll(C.prototype,{delete:function(key){var state=getInternalState(this);if(!isObject(key))return!1;var data=getWeakData(key);return!0===data?uncaughtFrozenStore(state).delete(key):data&&$has(data,state.id)&&delete data[state.id]},has:function has(key){var state=getInternalState(this);if(!isObject(key))return!1;var data=getWeakData(key);return!0===data?uncaughtFrozenStore(state).has(key):data&&$has(data,state.id)}}),redefineAll(C.prototype,IS_MAP?{get:function get(key){var state=getInternalState(this);if(isObject(key)){var data=getWeakData(key);return!0===data?uncaughtFrozenStore(state).get(key):data?data[state.id]:void 0}},set:function set(key,value){return define(this,key,value)}}:{add:function add(value){return define(this,value,!0)}}),C}}},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),toMetadataKey=ReflectMetadataModule.toKey,getOrCreateMetadataMap=ReflectMetadataModule.getMap,store=ReflectMetadataModule.store;__webpack_require__(3)({target:"Reflect",stat:!0},{deleteMetadata:function deleteMetadata(metadataKey,target){var targetKey=arguments.length<3?void 0:toMetadataKey(arguments[2]),metadataMap=getOrCreateMetadataMap(anObject(target),targetKey,!1);if(void 0===metadataMap||!metadataMap.delete(metadataKey))return!1;if(metadataMap.size)return!0;var targetMetadata=store.get(target);return targetMetadata.delete(targetKey),!!targetMetadata.size||store.delete(target)}})},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),getPrototypeOf=__webpack_require__(42),ordinaryHasOwnMetadata=ReflectMetadataModule.has,ordinaryGetOwnMetadata=ReflectMetadataModule.get,toMetadataKey=ReflectMetadataModule.toKey,ordinaryGetMetadata=function(MetadataKey,O,P){if(ordinaryHasOwnMetadata(MetadataKey,O,P))return ordinaryGetOwnMetadata(MetadataKey,O,P);var parent=getPrototypeOf(O);return null!==parent?ordinaryGetMetadata(MetadataKey,parent,P):void 0};__webpack_require__(3)({target:"Reflect",stat:!0},{getMetadata:function getMetadata(metadataKey,target){var targetKey=arguments.length<3?void 0:toMetadataKey(arguments[2]);return ordinaryGetMetadata(metadataKey,anObject(target),targetKey)}})},function(module,exports,__webpack_require__){var Set=__webpack_require__(550),ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),getPrototypeOf=__webpack_require__(42),iterate=__webpack_require__(96),ordinaryOwnMetadataKeys=ReflectMetadataModule.keys,toMetadataKey=ReflectMetadataModule.toKey,ordinaryMetadataKeys=function(O,P){var oKeys=ordinaryOwnMetadataKeys(O,P),parent=getPrototypeOf(O);if(null===parent)return oKeys;var iter,result,pKeys=ordinaryMetadataKeys(parent,P);return pKeys.length?oKeys.length?(iter=new Set(oKeys.concat(pKeys)),iterate(iter,(result=[]).push,result),result):pKeys:oKeys};__webpack_require__(3)({target:"Reflect",stat:!0},{getMetadataKeys:function getMetadataKeys(target){var targetKey=arguments.length<2?void 0:toMetadataKey(arguments[1]);return ordinaryMetadataKeys(anObject(target),targetKey)}})},function(module,exports,__webpack_require__){"use strict";module.exports=__webpack_require__(169)("Set",function(get){return function Set(){return get(this,arguments.length>0?arguments[0]:void 0)}},__webpack_require__(249))},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),ordinaryGetOwnMetadata=ReflectMetadataModule.get,toMetadataKey=ReflectMetadataModule.toKey;__webpack_require__(3)({target:"Reflect",stat:!0},{getOwnMetadata:function getOwnMetadata(metadataKey,target){var targetKey=arguments.length<3?void 0:toMetadataKey(arguments[2]);return ordinaryGetOwnMetadata(metadataKey,anObject(target),targetKey)}})},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),ordinaryOwnMetadataKeys=ReflectMetadataModule.keys,toMetadataKey=ReflectMetadataModule.toKey;__webpack_require__(3)({target:"Reflect",stat:!0},{getOwnMetadataKeys:function getOwnMetadataKeys(target){var targetKey=arguments.length<2?void 0:toMetadataKey(arguments[1]);return ordinaryOwnMetadataKeys(anObject(target),targetKey)}})},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),getPrototypeOf=__webpack_require__(42),ordinaryHasOwnMetadata=ReflectMetadataModule.has,toMetadataKey=ReflectMetadataModule.toKey,ordinaryHasMetadata=function(MetadataKey,O,P){if(ordinaryHasOwnMetadata(MetadataKey,O,P))return!0;var parent=getPrototypeOf(O);return null!==parent&&ordinaryHasMetadata(MetadataKey,parent,P)};__webpack_require__(3)({target:"Reflect",stat:!0},{hasMetadata:function hasMetadata(metadataKey,target){var targetKey=arguments.length<3?void 0:toMetadataKey(arguments[2]);return ordinaryHasMetadata(metadataKey,anObject(target),targetKey)}})},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),ordinaryHasOwnMetadata=ReflectMetadataModule.has,toMetadataKey=ReflectMetadataModule.toKey;__webpack_require__(3)({target:"Reflect",stat:!0},{hasOwnMetadata:function hasOwnMetadata(metadataKey,target){var targetKey=arguments.length<3?void 0:toMetadataKey(arguments[2]);return ordinaryHasOwnMetadata(metadataKey,anObject(target),targetKey)}})},function(module,exports,__webpack_require__){var ReflectMetadataModule=__webpack_require__(48),anObject=__webpack_require__(4),toMetadataKey=ReflectMetadataModule.toKey,ordinaryDefineOwnMetadata=ReflectMetadataModule.set;__webpack_require__(3)({target:"Reflect",stat:!0},{metadata:function metadata(metadataKey,metadataValue){return function decorator(target,key){ordinaryDefineOwnMetadata(metadataKey,metadataValue,anObject(target),toMetadataKey(key))}}})},function(module,exports,__webpack_require__){(function(global){(function(){"use strict";
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(global){var performance=global.performance;function mark(name){performance&&performance.mark&&performance.mark(name)}function performanceMeasure(name,label){performance&&performance.measure&&performance.measure(name,label)}mark("Zone");var checkDuplicate=!0===global.__zone_symbol__forceDuplicateZoneCheck;Iif(global.Zone){if(checkDuplicate||"function"!=typeof global.Zone.__symbol__)throw new Error("Zone already loaded.");return global.Zone}var nativeMicroTaskQueuePromise,Zone=function(){function Zone(parent,zoneSpec){this._parent=parent,this._name=zoneSpec?zoneSpec.name||"unnamed":"<root>",this._properties=zoneSpec&&zoneSpec.properties||{},this._zoneDelegate=new ZoneDelegate(this,this._parent&&this._parent._zoneDelegate,zoneSpec)}return Zone.assertZonePatched=function(){Iif(global.Promise!==patches.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(Zone,"root",{get:function(){for(var zone=Zone.current;zone.parent;)zone=zone.parent;return zone},enumerable:!0,configurable:!0}),Object.defineProperty(Zone,"current",{get:function(){return _currentZoneFrame.zone},enumerable:!0,configurable:!0}),Object.defineProperty(Zone,"currentTask",{get:function(){return _currentTask},enumerable:!0,configurable:!0}),Zone.__load_patch=function(name,fn){Iif(patches.hasOwnProperty(name)){if(checkDuplicate)throw Error("Already loaded patch: "+name)}else Eif(!global["__Zone_disable_"+name]){var perfName="Zone:"+name;mark(perfName),patches[name]=fn(global,Zone,_api),performanceMeasure(perfName,perfName)}},Object.defineProperty(Zone.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(Zone.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),Zone.prototype.get=function(key){var zone=this.getZoneWith(key);if(zone)return zone._properties[key]},Zone.prototype.getZoneWith=function(key){for(var current=this;current;){if(current._properties.hasOwnProperty(key))return current;current=current._parent}return null},Zone.prototype.fork=function(zoneSpec){Iif(!zoneSpec)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,zoneSpec)},Zone.prototype.wrap=function(callback,source){if("function"!=typeof callback)throw new Error("Expecting function got: "+callback);var _callback=this._zoneDelegate.intercept(this,callback,source),zone=this;return function(){return zone.runGuarded(_callback,this,arguments,source)}},Zone.prototype.run=function(callback,applyThis,applyArgs,source){_currentZoneFrame={parent:_currentZoneFrame,zone:this};try{return this._zoneDelegate.invoke(this,callback,applyThis,applyArgs,source)}finally{_currentZoneFrame=_currentZoneFrame.parent}},Zone.prototype.runGuarded=function(callback,applyThis,applyArgs,source){void 0===applyThis&&(applyThis=null),_currentZoneFrame={parent:_currentZoneFrame,zone:this};try{try{return this._zoneDelegate.invoke(this,callback,applyThis,applyArgs,source)}catch(error){if(this._zoneDelegate.handleError(this,error))throw error}}finally{_currentZoneFrame=_currentZoneFrame.parent}},Zone.prototype.runTask=function(task,applyThis,applyArgs){Iif(task.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(task.zone||NO_ZONE).name+"; Execution: "+this.name+")");Eif(task.state!==notScheduled||task.type!==eventTask&&task.type!==macroTask){var reEntryGuard=task.state!=running;reEntryGuard&&task._transitionTo(running,scheduled),task.runCount++;var previousTask=_currentTask;_currentTask=task,_currentZoneFrame={parent:_currentZoneFrame,zone:this};try{task.type==macroTask&&task.data&&!task.data.isPeriodic&&(task.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,task,applyThis,applyArgs)}catch(error){if(this._zoneDelegate.handleError(this,error))throw error}}finally{task.state!==notScheduled&&task.state!==unknown&&(task.type==eventTask||task.data&&task.data.isPeriodic?reEntryGuard&&task._transitionTo(scheduled,running):(task.runCount=0,this._updateTaskCount(task,-1),reEntryGuard&&task._transitionTo(notScheduled,running,notScheduled))),_currentZoneFrame=_currentZoneFrame.parent,_currentTask=previousTask}}},Zone.prototype.scheduleTask=function(task){Iif(task.zone&&task.zone!==this)for(var newZone=this;newZone;){if(newZone===task.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+task.zone.name);newZone=newZone.parent}task._transitionTo(scheduling,notScheduled);var zoneDelegates=[];task._zoneDelegates=zoneDelegates,task._zone=this;try{task=this._zoneDelegate.scheduleTask(this,task)}catch(err){throw task._transitionTo(unknown,scheduling,notScheduled),this._zoneDelegate.handleError(this,err),err}return task._zoneDelegates===zoneDelegates&&this._updateTaskCount(task,1),task.state==scheduling&&task._transitionTo(scheduled,scheduling),task},Zone.prototype.scheduleMicroTask=function(source,callback,data,customSchedule){return this.scheduleTask(new ZoneTask(microTask,source,callback,data,customSchedule,void 0))},Zone.prototype.scheduleMacroTask=function(source,callback,data,customSchedule,customCancel){return this.scheduleTask(new ZoneTask(macroTask,source,callback,data,customSchedule,customCancel))},Zone.prototype.scheduleEventTask=function(source,callback,data,customSchedule,customCancel){return this.scheduleTask(new ZoneTask(eventTask,source,callback,data,customSchedule,customCancel))},Zone.prototype.cancelTask=function(task){if(task.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(task.zone||NO_ZONE).name+"; Execution: "+this.name+")");task._transitionTo(canceling,scheduled,running);try{this._zoneDelegate.cancelTask(this,task)}catch(err){throw task._transitionTo(unknown,canceling),this._zoneDelegate.handleError(this,err),err}return this._updateTaskCount(task,-1),task._transitionTo(notScheduled,canceling),task.runCount=0,task},Zone.prototype._updateTaskCount=function(task,count){var zoneDelegates=task._zoneDelegates;-1==count&&(task._zoneDelegates=null);for(var i=0;i<zoneDelegates.length;i++)zoneDelegates[i]._updateTaskCount(task.type,count)},Zone.__symbol__=__symbol__,Zone}(),DELEGATE_ZS={name:"",onHasTask:function(delegate,_,target,hasTaskState){return delegate.hasTask(target,hasTaskState)},onScheduleTask:function(delegate,_,target,task){return delegate.scheduleTask(target,task)},onInvokeTask:function(delegate,_,target,task,applyThis,applyArgs){return delegate.invokeTask(target,task,applyThis,applyArgs)},onCancelTask:function(delegate,_,target,task){return delegate.cancelTask(target,task)}},ZoneDelegate=function(){function ZoneDelegate(zone,parentDelegate,zoneSpec){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=zone,this._parentDelegate=parentDelegate,this._forkZS=zoneSpec&&(zoneSpec&&zoneSpec.onFork?zoneSpec:parentDelegate._forkZS),this._forkDlgt=zoneSpec&&(zoneSpec.onFork?parentDelegate:parentDelegate._forkDlgt),this._forkCurrZone=zoneSpec&&(zoneSpec.onFork?this.zone:parentDelegate.zone),this._interceptZS=zoneSpec&&(zoneSpec.onIntercept?zoneSpec:parentDelegate._interceptZS),this._interceptDlgt=zoneSpec&&(zoneSpec.onIntercept?parentDelegate:parentDelegate._interceptDlgt),this._interceptCurrZone=zoneSpec&&(zoneSpec.onIntercept?this.zone:parentDelegate.zone),this._invokeZS=zoneSpec&&(zoneSpec.onInvoke?zoneSpec:parentDelegate._invokeZS),this._invokeDlgt=zoneSpec&&(zoneSpec.onInvoke?parentDelegate:parentDelegate._invokeDlgt),this._invokeCurrZone=zoneSpec&&(zoneSpec.onInvoke?this.zone:parentDelegate.zone),this._handleErrorZS=zoneSpec&&(zoneSpec.onHandleError?zoneSpec:parentDelegate._handleErrorZS),this._handleErrorDlgt=zoneSpec&&(zoneSpec.onHandleError?parentDelegate:parentDelegate._handleErrorDlgt),this._handleErrorCurrZone=zoneSpec&&(zoneSpec.onHandleError?this.zone:parentDelegate.zone),this._scheduleTaskZS=zoneSpec&&(zoneSpec.onScheduleTask?zoneSpec:parentDelegate._scheduleTaskZS),this._scheduleTaskDlgt=zoneSpec&&(zoneSpec.onScheduleTask?parentDelegate:parentDelegate._scheduleTaskDlgt),this._scheduleTaskCurrZone=zoneSpec&&(zoneSpec.onScheduleTask?this.zone:parentDelegate.zone),this._invokeTaskZS=zoneSpec&&(zoneSpec.onInvokeTask?zoneSpec:parentDelegate._invokeTaskZS),this._invokeTaskDlgt=zoneSpec&&(zoneSpec.onInvokeTask?parentDelegate:parentDelegate._invokeTaskDlgt),this._invokeTaskCurrZone=zoneSpec&&(zoneSpec.onInvokeTask?this.zone:parentDelegate.zone),this._cancelTaskZS=zoneSpec&&(zoneSpec.onCancelTask?zoneSpec:parentDelegate._cancelTaskZS),this._cancelTaskDlgt=zoneSpec&&(zoneSpec.onCancelTask?parentDelegate:parentDelegate._cancelTaskDlgt),this._cancelTaskCurrZone=zoneSpec&&(zoneSpec.onCancelTask?this.zone:parentDelegate.zone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;var zoneSpecHasTask=zoneSpec&&zoneSpec.onHasTask,parentHasTask=parentDelegate&&parentDelegate._hasTaskZS;(zoneSpecHasTask||parentHasTask)&&(this._hasTaskZS=zoneSpecHasTask?zoneSpec:DELEGATE_ZS,this._hasTaskDlgt=parentDelegate,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=zone,zoneSpec.onScheduleTask||(this._scheduleTaskZS=DELEGATE_ZS,this._scheduleTaskDlgt=parentDelegate,this._scheduleTaskCurrZone=this.zone),zoneSpec.onInvokeTask||(this._invokeTaskZS=DELEGATE_ZS,this._invokeTaskDlgt=parentDelegate,this._invokeTaskCurrZone=this.zone),zoneSpec.onCancelTask||(this._cancelTaskZS=DELEGATE_ZS,this._cancelTaskDlgt=parentDelegate,this._cancelTaskCurrZone=this.zone))}return ZoneDelegate.prototype.fork=function(targetZone,zoneSpec){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,targetZone,zoneSpec):new Zone(targetZone,zoneSpec)},ZoneDelegate.prototype.intercept=function(targetZone,callback,source){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,targetZone,callback,source):callback},ZoneDelegate.prototype.invoke=function(targetZone,callback,applyThis,applyArgs,source){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,targetZone,callback,applyThis,applyArgs,source):callback.apply(applyThis,applyArgs)},ZoneDelegate.prototype.handleError=function(targetZone,error){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,targetZone,error)},ZoneDelegate.prototype.scheduleTask=function(targetZone,task){var returnTask=task;if(this._scheduleTaskZS)this._hasTaskZS&&returnTask._zoneDelegates.push(this._hasTaskDlgtOwner),(returnTask=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,targetZone,task))||(returnTask=task);else if(task.scheduleFn)task.scheduleFn(task);else{Iif(task.type!=microTask)throw new Error("Task is missing scheduleFn.");scheduleMicroTask(task)}return returnTask},ZoneDelegate.prototype.invokeTask=function(targetZone,task,applyThis,applyArgs){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,targetZone,task,applyThis,applyArgs):task.callback.apply(applyThis,applyArgs)},ZoneDelegate.prototype.cancelTask=function(targetZone,task){var value;if(this._cancelTaskZS)value=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,targetZone,task);else{if(!task.cancelFn)throw Error("Task is not cancelable");value=task.cancelFn(task)}return value},ZoneDelegate.prototype.hasTask=function(targetZone,isEmpty){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,targetZone,isEmpty)}catch(err){this.handleError(targetZone,err)}},ZoneDelegate.prototype._updateTaskCount=function(type,count){var counts=this._taskCounts,prev=counts[type],next=counts[type]=prev+count;Iif(next<0)throw new Error("More tasks executed then were scheduled.");if(0==prev||0==next){var isEmpty={microTask:counts.microTask>0,macroTask:counts.macroTask>0,eventTask:counts.eventTask>0,change:type};this.hasTask(this.zone,isEmpty)}},ZoneDelegate}(),ZoneTask=function(){function ZoneTask(type,source,callback,options,scheduleFn,cancelFn){this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=type,this.source=source,this.data=options,this.scheduleFn=scheduleFn,this.cancelFn=cancelFn,this.callback=callback;var self=this;type===eventTask&&options&&options.useG?this.invoke=ZoneTask.invokeTask:this.invoke=function(){return ZoneTask.invokeTask.call(global,self,this,arguments)}}return ZoneTask.invokeTask=function(task,target,args){task||(task=this),_numberOfNestedTaskFrames++;try{return task.runCount++,task.zone.runTask(task,target,args)}finally{1==_numberOfNestedTaskFrames&&drainMicroTaskQueue(),_numberOfNestedTaskFrames--}},Object.defineProperty(ZoneTask.prototype,"zone",{get:function(){return this._zone},enumerable:!0,configurable:!0}),Object.defineProperty(ZoneTask.prototype,"state",{get:function(){return this._state},enumerable:!0,configurable:!0}),ZoneTask.prototype.cancelScheduleRequest=function(){this._transitionTo(notScheduled,scheduling)},ZoneTask.prototype._transitionTo=function(toState,fromState1,fromState2){Iif(this._state!==fromState1&&this._state!==fromState2)throw new Error(this.type+" '"+this.source+"': can not transition to '"+toState+"', expecting state '"+fromState1+"'"+(fromState2?" or '"+fromState2+"'":"")+", was '"+this._state+"'.");this._state=toState,toState==notScheduled&&(this._zoneDelegates=null)},ZoneTask.prototype.toString=function(){return this.data&&void 0!==this.data.handleId?this.data.handleId.toString():Object.prototype.toString.call(this)},ZoneTask.prototype.toJSON=function(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}},ZoneTask}(),symbolSetTimeout=__symbol__("setTimeout"),symbolPromise=__symbol__("Promise"),symbolThen=__symbol__("then"),_microTaskQueue=[],_isDrainingMicrotaskQueue=!1;function scheduleMicroTask(task){Iif(0===_numberOfNestedTaskFrames&&0===_microTaskQueue.length)if(nativeMicroTaskQueuePromise||global[symbolPromise]&&(nativeMicroTaskQueuePromise=global[symbolPromise].resolve(0)),nativeMicroTaskQueuePromise){var nativeThen=nativeMicroTaskQueuePromise[symbolThen];nativeThen||(nativeThen=nativeMicroTaskQueuePromise.then),nativeThen.call(nativeMicroTaskQueuePromise,drainMicroTaskQueue)}else global[symbolSetTimeout](drainMicroTaskQueue,0);task&&_microTaskQueue.push(task)}function drainMicroTaskQueue(){Eif(!_isDrainingMicrotaskQueue){for(_isDrainingMicrotaskQueue=!0;_microTaskQueue.length;){var queue=_microTaskQueue;_microTaskQueue=[];for(var i=0;i<queue.length;i++){var task=queue[i];try{task.zone.runTask(task,null,null)}catch(error){_api.onUnhandledError(error)}}}_api.microtaskDrainDone(),_isDrainingMicrotaskQueue=!1}}var NO_ZONE={name:"NO ZONE"},notScheduled="notScheduled",scheduling="scheduling",scheduled="scheduled",running="running",canceling="canceling",unknown="unknown",microTask="microTask",macroTask="macroTask",eventTask="eventTask",patches={},_api={symbol:__symbol__,currentZoneFrame:function(){return _currentZoneFrame},onUnhandledError:noop,microtaskDrainDone:noop,scheduleMicroTask:scheduleMicroTask,showUncaughtError:function(){return!Zone[__symbol__("ignoreConsoleErrorUncaughtError")]},patchEventTarget:function(){return[]},patchOnProperties:noop,patchMethod:function(){return noop},bindArguments:function(){return[]},patchThen:function(){return noop},patchMacroTask:function(){return noop},setNativePromise:function(NativePromise){NativePromise&&"function"==typeof NativePromise.resolve&&(nativeMicroTaskQueuePromise=NativePromise.resolve(0))},patchEventPrototype:function(){return noop},isIEOrEdge:function(){return!1},getGlobalObjects:function(){},ObjectDefineProperty:function(){return noop},ObjectGetOwnPropertyDescriptor:function(){},ObjectCreate:function(){},ArraySlice:function(){return[]},patchClass:function(){return noop},wrapWithCurrentZone:function(){return noop},filterProperties:function(){return[]},attachOriginToPatched:function(){return noop},_redefineProperty:function(){return noop},patchCallbacks:function(){return noop}},_currentZoneFrame={parent:null,zone:new Zone(null,null)},_currentTask=null,_numberOfNestedTaskFrames=0;function noop(){}function __symbol__(name){return"__zone_symbol__"+name}performanceMeasure("Zone","Zone"),global.Zone=Zone}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);var __values=function(o){var m="function"==typeof Symbol&&o[Symbol.iterator],i=0;return m?m.call(o):{next:function(){return o&&i>=o.length&&(o=void 0),{value:o&&o[i++],done:!o}}}};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
Zone.__load_patch("ZoneAwarePromise",function(global,Zone,api){var ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,__symbol__=api.symbol,_uncaughtPromiseErrors=[],symbolPromise=__symbol__("Promise"),symbolThen=__symbol__("then"),creationTrace="__creationTrace__";api.onUnhandledError=function(e){if(api.showUncaughtError()){var rejection=e&&e.rejection;rejection?console.error("Unhandled Promise rejection:",rejection instanceof Error?rejection.message:rejection,"; Zone:",e.zone.name,"; Task:",e.task&&e.task.source,"; Value:",rejection,rejection instanceof Error?rejection.stack:void 0):console.error(e)}},api.microtaskDrainDone=function(){for(;_uncaughtPromiseErrors.length;)for(var _loop_1=function(){var uncaughtPromiseError=_uncaughtPromiseErrors.shift();try{uncaughtPromiseError.zone.runGuarded(function(){throw uncaughtPromiseError})}catch(error){handleUnhandledRejection(error)}};_uncaughtPromiseErrors.length;)_loop_1()};var UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL=__symbol__("unhandledPromiseRejectionHandler");function handleUnhandledRejection(e){api.onUnhandledError(e);try{var handler=Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];handler&&"function"==typeof handler&&handler.call(this,e)}catch(err){}}function isThenable(value){return value&&value.then}function forwardResolution(value){return value}function forwardRejection(rejection){return ZoneAwarePromise.reject(rejection)}var symbolState=__symbol__("state"),symbolValue=__symbol__("value"),symbolFinally=__symbol__("finally"),symbolParentPromiseValue=__symbol__("parentPromiseValue"),symbolParentPromiseState=__symbol__("parentPromiseState"),source="Promise.then",UNRESOLVED=null,RESOLVED=!0,REJECTED=!1,REJECTED_NO_CATCH=0;function makeResolver(promise,state){return function(v){try{resolvePromise(promise,state,v)}catch(err){resolvePromise(promise,!1,err)}}}var once=function(){var wasCalled=!1;return function wrapper(wrappedFunction){return function(){wasCalled||(wasCalled=!0,wrappedFunction.apply(null,arguments))}}},TYPE_ERROR="Promise resolved with itself",CURRENT_TASK_TRACE_SYMBOL=__symbol__("currentTaskTrace");function resolvePromise(promise,state,value){var onceWrapper=once();Iif(promise===value)throw new TypeError(TYPE_ERROR);if(promise[symbolState]===UNRESOLVED){var then=null;try{"object"!=typeof value&&"function"!=typeof value||(then=value&&value.then)}catch(err){return onceWrapper(function(){resolvePromise(promise,!1,err)})(),promise}Iif(state!==REJECTED&&value instanceof ZoneAwarePromise&&value.hasOwnProperty(symbolState)&&value.hasOwnProperty(symbolValue)&&value[symbolState]!==UNRESOLVED)clearRejectedNoCatch(value),resolvePromise(promise,value[symbolState],value[symbolValue]);else if(state!==REJECTED&&"function"==typeof then)try{then.call(value,onceWrapper(makeResolver(promise,state)),onceWrapper(makeResolver(promise,!1)))}catch(err){onceWrapper(function(){resolvePromise(promise,!1,err)})()}else{promise[symbolState]=state;var queue=promise[symbolValue];Iif(promise[symbolValue]=value,promise[symbolFinally]===symbolFinally&&state===RESOLVED&&(promise[symbolState]=promise[symbolParentPromiseState],promise[symbolValue]=promise[symbolParentPromiseValue]),state===REJECTED&&value instanceof Error){var trace=Zone.currentTask&&Zone.currentTask.data&&Zone.currentTask.data[creationTrace];trace&&ObjectDefineProperty(value,CURRENT_TASK_TRACE_SYMBOL,{configurable:!0,enumerable:!1,writable:!0,value:trace})}for(var i=0;i<queue.length;)scheduleResolveOrReject(promise,queue[i++],queue[i++],queue[i++],queue[i++]);Iif(0==queue.length&&state==REJECTED){promise[symbolState]=REJECTED_NO_CATCH;try{throw new Error("Uncaught (in promise): "+function readableObjectToString(obj){if(obj&&obj.toString===Object.prototype.toString){var className=obj.constructor&&obj.constructor.name;return(className||"")+": "+JSON.stringify(obj)}return obj?obj.toString():Object.prototype.toString.call(obj)}(value)+(value&&value.stack?"\n"+value.stack:""))}catch(err){var error_1=err;error_1.rejection=value,error_1.promise=promise,error_1.zone=Zone.current,error_1.task=Zone.currentTask,_uncaughtPromiseErrors.push(error_1),api.scheduleMicroTask()}}}}return promise}var REJECTION_HANDLED_HANDLER=__symbol__("rejectionHandledHandler");function clearRejectedNoCatch(promise){Iif(promise[symbolState]===REJECTED_NO_CATCH){try{var handler=Zone[REJECTION_HANDLED_HANDLER];handler&&"function"==typeof handler&&handler.call(this,{rejection:promise[symbolValue],promise:promise})}catch(err){}promise[symbolState]=REJECTED;for(var i=0;i<_uncaughtPromiseErrors.length;i++)promise===_uncaughtPromiseErrors[i].promise&&_uncaughtPromiseErrors.splice(i,1)}}function scheduleResolveOrReject(promise,zone,chainPromise,onFulfilled,onRejected){clearRejectedNoCatch(promise);var promiseState=promise[symbolState],delegate=promiseState?"function"==typeof onFulfilled?onFulfilled:forwardResolution:"function"==typeof onRejected?onRejected:forwardRejection;zone.scheduleMicroTask(source,function(){try{var parentPromiseValue=promise[symbolValue],isFinallyPromise=chainPromise&&symbolFinally===chainPromise[symbolFinally];isFinallyPromise&&(chainPromise[symbolParentPromiseValue]=parentPromiseValue,chainPromise[symbolParentPromiseState]=promiseState);var value=zone.run(delegate,void 0,isFinallyPromise&&delegate!==forwardRejection&&delegate!==forwardResolution?[]:[parentPromiseValue]);resolvePromise(chainPromise,!0,value)}catch(error){resolvePromise(chainPromise,!1,error)}},chainPromise)}var ZoneAwarePromise=function(){function ZoneAwarePromise(executor){Iif(!(this instanceof ZoneAwarePromise))throw new Error("Must be an instanceof Promise.");this[symbolState]=UNRESOLVED,this[symbolValue]=[];try{executor&&executor(makeResolver(this,RESOLVED),makeResolver(this,REJECTED))}catch(error){resolvePromise(this,!1,error)}}return ZoneAwarePromise.toString=function(){return"function ZoneAwarePromise() { [native code] }"},ZoneAwarePromise.resolve=function(value){return resolvePromise(new this(null),RESOLVED,value)},ZoneAwarePromise.reject=function(error){return resolvePromise(new this(null),REJECTED,error)},ZoneAwarePromise.race=function(values){var e_1,_a,resolve,reject,promise=new this(function(res,rej){resolve=res,reject=rej});function onResolve(value){resolve(value)}function onReject(error){reject(error)}try{for(var values_1=__values(values),values_1_1=values_1.next();!values_1_1.done;values_1_1=values_1.next()){var value=values_1_1.value;isThenable(value)||(value=this.resolve(value)),value.then(onResolve,onReject)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{values_1_1&&!values_1_1.done&&(_a=values_1.return)&&_a.call(values_1)}finally{if(e_1)throw e_1.error}}return promise},ZoneAwarePromise.all=function(values){var e_2,_a,resolve,reject,promise=new this(function(res,rej){resolve=res,reject=rej}),unresolvedCount=2,valueIndex=0,resolvedValues=[],_loop_2=function(value){isThenable(value)||(value=this_1.resolve(value));var curValueIndex=valueIndex;value.then(function(value){resolvedValues[curValueIndex]=value,0==--unresolvedCount&&resolve(resolvedValues)},reject),unresolvedCount++,valueIndex++},this_1=this;try{for(var values_2=__values(values),values_2_1=values_2.next();!values_2_1.done;values_2_1=values_2.next())_loop_2(values_2_1.value)}catch(e_2_1){e_2={error:e_2_1}}finally{try{values_2_1&&!values_2_1.done&&(_a=values_2.return)&&_a.call(values_2)}finally{Iif(e_2)throw e_2.error}}return 0==(unresolvedCount-=2)&&resolve(resolvedValues),promise},Object.defineProperty(ZoneAwarePromise.prototype,Symbol.toStringTag,{get:function(){return"Promise"},enumerable:!0,configurable:!0}),ZoneAwarePromise.prototype.then=function(onFulfilled,onRejected){var chainPromise=new this.constructor(null),zone=Zone.current;return this[symbolState]==UNRESOLVED?this[symbolValue].push(zone,chainPromise,onFulfilled,onRejected):scheduleResolveOrReject(this,zone,chainPromise,onFulfilled,onRejected),chainPromise},ZoneAwarePromise.prototype.catch=function(onRejected){return this.then(null,onRejected)},ZoneAwarePromise.prototype.finally=function(onFinally){var chainPromise=new this.constructor(null);chainPromise[symbolFinally]=symbolFinally;var zone=Zone.current;return this[symbolState]==UNRESOLVED?this[symbolValue].push(zone,chainPromise,onFinally,onFinally):scheduleResolveOrReject(this,zone,chainPromise,onFinally,onFinally),chainPromise},ZoneAwarePromise}();ZoneAwarePromise.resolve=ZoneAwarePromise.resolve,ZoneAwarePromise.reject=ZoneAwarePromise.reject,ZoneAwarePromise.race=ZoneAwarePromise.race,ZoneAwarePromise.all=ZoneAwarePromise.all;var NativePromise=global[symbolPromise]=global.Promise,ZONE_AWARE_PROMISE=Zone.__symbol__("ZoneAwarePromise"),desc=ObjectGetOwnPropertyDescriptor(global,"Promise");desc&&!desc.configurable||(desc&&delete desc.writable,desc&&delete desc.value,desc||(desc={configurable:!0,enumerable:!0}),desc.get=function(){return global[ZONE_AWARE_PROMISE]?global[ZONE_AWARE_PROMISE]:global[symbolPromise]},desc.set=function(NewNativePromise){NewNativePromise===ZoneAwarePromise?global[ZONE_AWARE_PROMISE]=NewNativePromise:(global[symbolPromise]=NewNativePromise,NewNativePromise.prototype[symbolThen]||patchThen(NewNativePromise),api.setNativePromise(NewNativePromise))},ObjectDefineProperty(global,"Promise",desc)),global.Promise=ZoneAwarePromise;var symbolThenPatched=__symbol__("thenPatched");function patchThen(Ctor){var proto=Ctor.prototype,prop=ObjectGetOwnPropertyDescriptor(proto,"then");Eif(!prop||!1!==prop.writable&&prop.configurable){var originalThen=proto.then;proto[symbolThen]=originalThen,Ctor.prototype.then=function(onResolve,onReject){var _this=this;return new ZoneAwarePromise(function(resolve,reject){originalThen.call(_this,resolve,reject)}).then(onResolve,onReject)},Ctor[symbolThenPatched]=!0}}Eif(api.patchThen=patchThen,NativePromise){patchThen(NativePromise);var fetch_1=global.fetch;"function"==typeof fetch_1&&(global[api.symbol("fetch")]=fetch_1,global.fetch=function zoneify(fn){return function(){var resultPromise=fn.apply(this,arguments);if(resultPromise instanceof ZoneAwarePromise)return resultPromise;var ctor=resultPromise.constructor;return ctor[symbolThenPatched]||patchThen(ctor),resultPromise}}(fetch_1))}return Promise[Zone.__symbol__("uncaughtPromiseErrors")]=_uncaughtPromiseErrors,ZoneAwarePromise});
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ObjectGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,ObjectDefineProperty=Object.defineProperty,ObjectGetPrototypeOf=Object.getPrototypeOf,ObjectCreate=Object.create,ArraySlice=Array.prototype.slice,ADD_EVENT_LISTENER_STR="addEventListener",REMOVE_EVENT_LISTENER_STR="removeEventListener",ZONE_SYMBOL_ADD_EVENT_LISTENER=Zone.__symbol__(ADD_EVENT_LISTENER_STR),ZONE_SYMBOL_REMOVE_EVENT_LISTENER=Zone.__symbol__(REMOVE_EVENT_LISTENER_STR),TRUE_STR="true",FALSE_STR="false",ZONE_SYMBOL_PREFIX="__zone_symbol__";function wrapWithCurrentZone(callback,source){return Zone.current.wrap(callback,source)}function scheduleMacroTaskWithCurrentZone(source,callback,data,customSchedule,customCancel){return Zone.current.scheduleMacroTask(source,callback,data,customSchedule,customCancel)}var zoneSymbol=Zone.__symbol__,isWindowExists="undefined"!=typeof window,internalWindow=isWindowExists?window:void 0,_global=isWindowExists&&internalWindow||"object"==typeof self&&self||global,REMOVE_ATTRIBUTE="removeAttribute",NULL_ON_PROP_VALUE=[null];function bindArguments(args,source){for(var i=args.length-1;i>=0;i--)"function"==typeof args[i]&&(args[i]=wrapWithCurrentZone(args[i],source+"_"+i));return args}function isPropertyWritable(propertyDesc){return!propertyDesc||!1!==propertyDesc.writable&&!("function"==typeof propertyDesc.get&&void 0===propertyDesc.set)}var isWebWorker="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,isNode=!("nw"in _global)&&void 0!==_global.process&&"[object process]"==={}.toString.call(_global.process),isBrowser=!isNode&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),isMix=void 0!==_global.process&&"[object process]"==={}.toString.call(_global.process)&&!isWebWorker&&!(!isWindowExists||!internalWindow.HTMLElement),zoneSymbolEventNames={},wrapFn=function(event){if(event=event||_global.event){var eventNameSymbol=zoneSymbolEventNames[event.type];eventNameSymbol||(eventNameSymbol=zoneSymbolEventNames[event.type]=zoneSymbol("ON_PROPERTY"+event.type));var result,target=this||event.target||_global,listener=target[eventNameSymbol];if(isBrowser&&target===internalWindow&&"error"===event.type){var errorEvent=event;!0===(result=listener&&listener.call(this,errorEvent.message,errorEvent.filename,errorEvent.lineno,errorEvent.colno,errorEvent.error))&&event.preventDefault()}else null==(result=listener&&listener.apply(this,arguments))||result||event.preventDefault();return result}};function patchProperty(obj,prop,prototype){var desc=ObjectGetOwnPropertyDescriptor(obj,prop);if(!desc&&prototype&&ObjectGetOwnPropertyDescriptor(prototype,prop)&&(desc={enumerable:!0,configurable:!0}),desc&&desc.configurable){var onPropPatchedSymbol=zoneSymbol("on"+prop+"patched");if(!obj.hasOwnProperty(onPropPatchedSymbol)||!obj[onPropPatchedSymbol]){delete desc.writable,delete desc.value;var originalDescGet=desc.get,originalDescSet=desc.set,eventName=prop.substr(2),eventNameSymbol=zoneSymbolEventNames[eventName];eventNameSymbol||(eventNameSymbol=zoneSymbolEventNames[eventName]=zoneSymbol("ON_PROPERTY"+eventName)),desc.set=function(newValue){var target=this;target||obj!==_global||(target=_global),target&&(target[eventNameSymbol]&&target.removeEventListener(eventName,wrapFn),originalDescSet&&originalDescSet.apply(target,NULL_ON_PROP_VALUE),"function"==typeof newValue?(target[eventNameSymbol]=newValue,target.addEventListener(eventName,wrapFn,!1)):target[eventNameSymbol]=null)},desc.get=function(){var target=this;if(target||obj!==_global||(target=_global),!target)return null;var listener=target[eventNameSymbol];if(listener)return listener;if(originalDescGet){var value=originalDescGet&&originalDescGet.call(this);if(value)return desc.set.call(this,value),"function"==typeof target[REMOVE_ATTRIBUTE]&&target.removeAttribute(prop),value}return null},ObjectDefineProperty(obj,prop,desc),obj[onPropPatchedSymbol]=!0}}}function patchOnProperties(obj,properties,prototype){Eif(properties)for(var i=0;i<properties.length;i++)patchProperty(obj,"on"+properties[i],prototype);else{var onProperties=[];for(var prop in obj)"on"==prop.substr(0,2)&&onProperties.push(prop);for(var j=0;j<onProperties.length;j++)patchProperty(obj,onProperties[j],prototype)}}var originalInstanceKey=zoneSymbol("originalInstance");function patchClass(className){var OriginalClass=_global[className];Eif(OriginalClass){_global[zoneSymbol(className)]=OriginalClass,_global[className]=function(){var a=bindArguments(arguments,className);switch(a.length){case 0:this[originalInstanceKey]=new OriginalClass;break;case 1:this[originalInstanceKey]=new OriginalClass(a[0]);break;case 2:this[originalInstanceKey]=new OriginalClass(a[0],a[1]);break;case 3:this[originalInstanceKey]=new OriginalClass(a[0],a[1],a[2]);break;case 4:this[originalInstanceKey]=new OriginalClass(a[0],a[1],a[2],a[3]);break;default:throw new Error("Arg list too long.")}},attachOriginToPatched(_global[className],OriginalClass);var prop,instance=new OriginalClass(function(){});for(prop in instance)"XMLHttpRequest"===className&&"responseBlob"===prop||function(prop){"function"==typeof instance[prop]?_global[className].prototype[prop]=function(){return this[originalInstanceKey][prop].apply(this[originalInstanceKey],arguments)}:ObjectDefineProperty(_global[className].prototype,prop,{set:function(fn){"function"==typeof fn?(this[originalInstanceKey][prop]=wrapWithCurrentZone(fn,className+"."+prop),attachOriginToPatched(this[originalInstanceKey][prop],fn)):this[originalInstanceKey][prop]=fn},get:function(){return this[originalInstanceKey][prop]}})}(prop);for(prop in OriginalClass)"prototype"!==prop&&OriginalClass.hasOwnProperty(prop)&&(_global[className][prop]=OriginalClass[prop])}}var shouldCopySymbolProperties=!1;function patchMethod(target,name,patchFn){for(var proto=target;proto&&!proto.hasOwnProperty(name);)proto=ObjectGetPrototypeOf(proto);!proto&&target[name]&&(proto=target);var delegateName=zoneSymbol(name),delegate=null;if(proto&&!(delegate=proto[delegateName])&&(delegate=proto[delegateName]=proto[name],isPropertyWritable(proto&&ObjectGetOwnPropertyDescriptor(proto,name)))){var patchDelegate_1=patchFn(delegate,delegateName,name);proto[name]=function(){return patchDelegate_1(this,arguments)},attachOriginToPatched(proto[name],delegate),shouldCopySymbolProperties&&function copySymbolProperties(src,dest){"function"==typeof Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(src).forEach(function(symbol){var desc=Object.getOwnPropertyDescriptor(src,symbol);Object.defineProperty(dest,symbol,{get:function(){return src[symbol]},set:function(value){(!desc||desc.writable&&"function"==typeof desc.set)&&(src[symbol]=value)},enumerable:!desc||desc.enumerable,configurable:!desc||desc.configurable})})}(delegate,proto[name])}return delegate}function patchMacroTask(obj,funcName,metaCreator){var setNative=null;function scheduleTask(task){var data=task.data;return data.args[data.cbIdx]=function(){task.invoke.apply(this,arguments)},setNative.apply(data.target,data.args),task}setNative=patchMethod(obj,funcName,function(delegate){return function(self,args){var meta=metaCreator(self,args);return meta.cbIdx>=0&&"function"==typeof args[meta.cbIdx]?scheduleMacroTaskWithCurrentZone(meta.name,args[meta.cbIdx],meta,scheduleTask):delegate.apply(self,args)}})}function attachOriginToPatched(patched,original){patched[zoneSymbol("OriginalDelegate")]=original}var isDetectedIEOrEdge=!1,ieOrEdge=!1;function isIE(){try{var ua=internalWindow.navigator.userAgent;if(-1!==ua.indexOf("MSIE ")||-1!==ua.indexOf("Trident/"))return!0}catch(error){}return!1}function isIEOrEdge(){Iif(isDetectedIEOrEdge)return ieOrEdge;isDetectedIEOrEdge=!0;try{var ua=internalWindow.navigator.userAgent;-1===ua.indexOf("MSIE ")&&-1===ua.indexOf("Trident/")&&-1===ua.indexOf("Edge/")||(ieOrEdge=!0)}catch(error){}return ieOrEdge}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */Zone.__load_patch("toString",function(global){var originalFunctionToString=Function.prototype.toString,ORIGINAL_DELEGATE_SYMBOL=zoneSymbol("OriginalDelegate"),PROMISE_SYMBOL=zoneSymbol("Promise"),ERROR_SYMBOL=zoneSymbol("Error"),newFunctionToString=function toString(){Eif("function"==typeof this){var originalDelegate=this[ORIGINAL_DELEGATE_SYMBOL];Iif(originalDelegate)return"function"==typeof originalDelegate?originalFunctionToString.call(originalDelegate):Object.prototype.toString.call(originalDelegate);if(this===Promise){var nativePromise=global[PROMISE_SYMBOL];Eif(nativePromise)return originalFunctionToString.call(nativePromise)}Iif(this===Error){var nativeError=global[ERROR_SYMBOL];if(nativeError)return originalFunctionToString.call(nativeError)}}return originalFunctionToString.call(this)};newFunctionToString[ORIGINAL_DELEGATE_SYMBOL]=originalFunctionToString,Function.prototype.toString=newFunctionToString;var originalObjectToString=Object.prototype.toString;Object.prototype.toString=function(){return this instanceof Promise?"[object Promise]":originalObjectToString.call(this)}});
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var passiveSupported=!1;Eif("undefined"!=typeof window)try{var options=Object.defineProperty({},"passive",{get:function(){passiveSupported=!0}});window.addEventListener("test",options,options),window.removeEventListener("test",options,options)}catch(err){passiveSupported=!1}var OPTIMIZED_ZONE_EVENT_TASK_DATA={useG:!0},zoneSymbolEventNames$1={},globalSources={},EVENT_NAME_SYMBOL_REGX=/^__zone_symbol__(\w+)(true|false)$/,IMMEDIATE_PROPAGATION_SYMBOL="__zone_symbol__propagationStopped";function patchEventTarget(_global,apis,patchOptions){var ADD_EVENT_LISTENER=patchOptions&&patchOptions.add||ADD_EVENT_LISTENER_STR,REMOVE_EVENT_LISTENER=patchOptions&&patchOptions.rm||REMOVE_EVENT_LISTENER_STR,LISTENERS_EVENT_LISTENER=patchOptions&&patchOptions.listeners||"eventListeners",REMOVE_ALL_LISTENERS_EVENT_LISTENER=patchOptions&&patchOptions.rmAll||"removeAllListeners",zoneSymbolAddEventListener=zoneSymbol(ADD_EVENT_LISTENER),ADD_EVENT_LISTENER_SOURCE="."+ADD_EVENT_LISTENER+":",PREPEND_EVENT_LISTENER="prependListener",PREPEND_EVENT_LISTENER_SOURCE="."+PREPEND_EVENT_LISTENER+":",invokeTask=function(task,target,event){Eif(!task.isRemoved){var delegate=task.callback;"object"==typeof delegate&&delegate.handleEvent&&(task.callback=function(event){return delegate.handleEvent(event)},task.originalDelegate=delegate),task.invoke(task,target,[event]);var options=task.options;Iif(options&&"object"==typeof options&&options.once){var delegate_1=task.originalDelegate?task.originalDelegate:task.callback;target[REMOVE_EVENT_LISTENER].call(target,event.type,delegate_1,options)}}},globalZoneAwareCallback=function(event){Eif(event=event||_global.event){var target=this||event.target||_global,tasks=target[zoneSymbolEventNames$1[event.type][FALSE_STR]];Eif(tasks)Eif(1===tasks.length)invokeTask(tasks[0],target,event);else for(var copyTasks=tasks.slice(),i=0;i<copyTasks.length&&(!event||!0!==event[IMMEDIATE_PROPAGATION_SYMBOL]);i++)invokeTask(copyTasks[i],target,event)}},globalZoneAwareCaptureCallback=function(event){if(event=event||_global.event){var target=this||event.target||_global,tasks=target[zoneSymbolEventNames$1[event.type][TRUE_STR]];if(tasks)if(1===tasks.length)invokeTask(tasks[0],target,event);else for(var copyTasks=tasks.slice(),i=0;i<copyTasks.length&&(!event||!0!==event[IMMEDIATE_PROPAGATION_SYMBOL]);i++)invokeTask(copyTasks[i],target,event)}};function patchEventTargetMethods(obj,patchOptions){Iif(!obj)return!1;var useGlobalCallback=!0;patchOptions&&void 0!==patchOptions.useG&&(useGlobalCallback=patchOptions.useG);var validateHandler=patchOptions&&patchOptions.vh,checkDuplicate=!0;patchOptions&&void 0!==patchOptions.chkDup&&(checkDuplicate=patchOptions.chkDup);var returnTarget=!1;patchOptions&&void 0!==patchOptions.rt&&(returnTarget=patchOptions.rt);for(var proto=obj;proto&&!proto.hasOwnProperty(ADD_EVENT_LISTENER);)proto=ObjectGetPrototypeOf(proto);Iif(!proto&&obj[ADD_EVENT_LISTENER]&&(proto=obj),!proto)return!1;if(proto[zoneSymbolAddEventListener])return!1;var nativePrependEventListener,eventNameToString=patchOptions&&patchOptions.eventNameToString,taskData={},nativeAddEventListener=proto[zoneSymbolAddEventListener]=proto[ADD_EVENT_LISTENER],nativeRemoveEventListener=proto[zoneSymbol(REMOVE_EVENT_LISTENER)]=proto[REMOVE_EVENT_LISTENER],nativeListeners=proto[zoneSymbol(LISTENERS_EVENT_LISTENER)]=proto[LISTENERS_EVENT_LISTENER],nativeRemoveAllListeners=proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)]=proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];function checkIsPassive(task){passiveSupported||"boolean"==typeof taskData.options||void 0===taskData.options||null===taskData.options||(task.options=!!taskData.options.capture,taskData.options=task.options)}patchOptions&&patchOptions.prepend&&(nativePrependEventListener=proto[zoneSymbol(patchOptions.prepend)]=proto[patchOptions.prepend]);var customSchedule=useGlobalCallback?function(task){Eif(!taskData.isExisting)return checkIsPassive(task),nativeAddEventListener.call(taskData.target,taskData.eventName,taskData.capture?globalZoneAwareCaptureCallback:globalZoneAwareCallback,taskData.options)}:function(task){return checkIsPassive(task),nativeAddEventListener.call(taskData.target,taskData.eventName,task.invoke,taskData.options)},customCancel=useGlobalCallback?function(task){if(!task.isRemoved){var symbolEventNames=zoneSymbolEventNames$1[task.eventName],symbolEventName=void 0;symbolEventNames&&(symbolEventName=symbolEventNames[task.capture?TRUE_STR:FALSE_STR]);var existingTasks=symbolEventName&&task.target[symbolEventName];if(existingTasks)for(var i=0;i<existingTasks.length;i++)if(existingTasks[i]===task){existingTasks.splice(i,1),task.isRemoved=!0,0===existingTasks.length&&(task.allRemoved=!0,task.target[symbolEventName]=null);break}}if(task.allRemoved)return nativeRemoveEventListener.call(task.target,task.eventName,task.capture?globalZoneAwareCaptureCallback:globalZoneAwareCallback,task.options)}:function(task){return nativeRemoveEventListener.call(task.target,task.eventName,task.invoke,task.options)},compare=patchOptions&&patchOptions.diff?patchOptions.diff:function(task,delegate){var typeOfDelegate=typeof delegate;return"function"===typeOfDelegate&&task.callback===delegate||"object"===typeOfDelegate&&task.originalDelegate===delegate},blackListedEvents=Zone[Zone.__symbol__("BLACK_LISTED_EVENTS")],makeAddListener=function(nativeListener,addSource,customScheduleFn,customCancelFn,returnTarget,prepend){return void 0===returnTarget&&(returnTarget=!1),void 0===prepend&&(prepend=!1),function(){var target=this||_global,eventName=arguments[0],delegate=arguments[1];Iif(!delegate)return nativeListener.apply(this,arguments);Iif(isNode&&"uncaughtException"===eventName)return nativeListener.apply(this,arguments);var isHandleEvent=!1;Iif("function"!=typeof delegate){if(!delegate.handleEvent)return nativeListener.apply(this,arguments);isHandleEvent=!0}Eif(!validateHandler||validateHandler(nativeListener,delegate,target,arguments)){var capture,options=arguments[2];Iif(blackListedEvents)for(var i=0;i<blackListedEvents.length;i++)if(eventName===blackListedEvents[i])return nativeListener.apply(this,arguments);var once=!1;void 0===options?capture=!1:!0===options?capture=!0:!1===options?capture=!1:(capture=!!options&&!!options.capture,once=!!options&&!!options.once);var symbolEventName,zone=Zone.current,symbolEventNames=zoneSymbolEventNames$1[eventName];Eif(symbolEventNames)symbolEventName=symbolEventNames[capture?TRUE_STR:FALSE_STR];else{var falseEventName=(eventNameToString?eventNameToString(eventName):eventName)+FALSE_STR,trueEventName=(eventNameToString?eventNameToString(eventName):eventName)+TRUE_STR,symbol=ZONE_SYMBOL_PREFIX+falseEventName,symbolCapture=ZONE_SYMBOL_PREFIX+trueEventName;zoneSymbolEventNames$1[eventName]={},zoneSymbolEventNames$1[eventName][FALSE_STR]=symbol,zoneSymbolEventNames$1[eventName][TRUE_STR]=symbolCapture,symbolEventName=capture?symbolCapture:symbol}var source,existingTasks=target[symbolEventName],isExisting=!1;Iif(existingTasks){if(isExisting=!0,checkDuplicate)for(i=0;i<existingTasks.length;i++)if(compare(existingTasks[i],delegate))return}else existingTasks=target[symbolEventName]=[];var constructorName=target.constructor.name,targetSource=globalSources[constructorName];targetSource&&(source=targetSource[eventName]),source||(source=constructorName+addSource+(eventNameToString?eventNameToString(eventName):eventName)),taskData.options=options,once&&(taskData.options.once=!1),taskData.target=target,taskData.capture=capture,taskData.eventName=eventName,taskData.isExisting=isExisting;var data=useGlobalCallback?OPTIMIZED_ZONE_EVENT_TASK_DATA:void 0;data&&(data.taskData=taskData);var task=zone.scheduleEventTask(source,delegate,data,customScheduleFn,customCancelFn);return taskData.target=null,data&&(data.taskData=null),once&&(options.once=!0),(passiveSupported||"boolean"!=typeof task.options)&&(task.options=options),task.target=target,task.capture=capture,task.eventName=eventName,isHandleEvent&&(task.originalDelegate=delegate),prepend?existingTasks.unshift(task):existingTasks.push(task),returnTarget?target:void 0}}};return proto[ADD_EVENT_LISTENER]=makeAddListener(nativeAddEventListener,ADD_EVENT_LISTENER_SOURCE,customSchedule,customCancel,returnTarget),nativePrependEventListener&&(proto[PREPEND_EVENT_LISTENER]=makeAddListener(nativePrependEventListener,PREPEND_EVENT_LISTENER_SOURCE,function(task){return nativePrependEventListener.call(taskData.target,taskData.eventName,task.invoke,taskData.options)},customCancel,returnTarget,!0)),proto[REMOVE_EVENT_LISTENER]=function(){var capture,target=this||_global,eventName=arguments[0],options=arguments[2];capture=void 0!==options&&(!0===options||!1!==options&&!!options&&!!options.capture);var delegate=arguments[1];if(!delegate)return nativeRemoveEventListener.apply(this,arguments);if(!validateHandler||validateHandler(nativeRemoveEventListener,delegate,target,arguments)){var symbolEventName,symbolEventNames=zoneSymbolEventNames$1[eventName];symbolEventNames&&(symbolEventName=symbolEventNames[capture?TRUE_STR:FALSE_STR]);var existingTasks=symbolEventName&&target[symbolEventName];if(existingTasks)for(var i=0;i<existingTasks.length;i++){var existingTask=existingTasks[i];if(compare(existingTask,delegate))return existingTasks.splice(i,1),existingTask.isRemoved=!0,0===existingTasks.length&&(existingTask.allRemoved=!0,target[symbolEventName]=null),existingTask.zone.cancelTask(existingTask),returnTarget?target:void 0}return nativeRemoveEventListener.apply(this,arguments)}},proto[LISTENERS_EVENT_LISTENER]=function(){for(var target=this||_global,eventName=arguments[0],listeners=[],tasks=findEventTasks(target,eventNameToString?eventNameToString(eventName):eventName),i=0;i<tasks.length;i++){var task=tasks[i],delegate=task.originalDelegate?task.originalDelegate:task.callback;listeners.push(delegate)}return listeners},proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER]=function(){var target=this||_global,eventName=arguments[0];if(eventName){var symbolEventNames=zoneSymbolEventNames$1[eventName];if(symbolEventNames){var symbolEventName=symbolEventNames[FALSE_STR],symbolCaptureEventName=symbolEventNames[TRUE_STR],tasks=target[symbolEventName],captureTasks=target[symbolCaptureEventName];if(tasks){var removeTasks=tasks.slice();for(i=0;i<removeTasks.length;i++){var delegate=(task=removeTasks[i]).originalDelegate?task.originalDelegate:task.callback;this[REMOVE_EVENT_LISTENER].call(this,eventName,delegate,task.options)}}if(captureTasks)for(removeTasks=captureTasks.slice(),i=0;i<removeTasks.length;i++){var task;delegate=(task=removeTasks[i]).originalDelegate?task.originalDelegate:task.callback,this[REMOVE_EVENT_LISTENER].call(this,eventName,delegate,task.options)}}}else{for(var keys=Object.keys(target),i=0;i<keys.length;i++){var prop=keys[i],match=EVENT_NAME_SYMBOL_REGX.exec(prop),evtName=match&&match[1];evtName&&"removeListener"!==evtName&&this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this,evtName)}this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this,"removeListener")}if(returnTarget)return this},attachOriginToPatched(proto[ADD_EVENT_LISTENER],nativeAddEventListener),attachOriginToPatched(proto[REMOVE_EVENT_LISTENER],nativeRemoveEventListener),nativeRemoveAllListeners&&attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER],nativeRemoveAllListeners),nativeListeners&&attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER],nativeListeners),!0}for(var results=[],i=0;i<apis.length;i++)results[i]=patchEventTargetMethods(apis[i],patchOptions);return results}function findEventTasks(target,eventName){var foundTasks=[];for(var prop in target){var match=EVENT_NAME_SYMBOL_REGX.exec(prop),evtName=match&&match[1];if(evtName&&(!eventName||evtName===eventName)){var tasks=target[prop];if(tasks)for(var i=0;i<tasks.length;i++)foundTasks.push(tasks[i])}}return foundTasks}function patchEventPrototype(global,api){var Event=global.Event;Event&&Event.prototype&&api.patchMethod(Event.prototype,"stopImmediatePropagation",function(delegate){return function(self,args){self[IMMEDIATE_PROPAGATION_SYMBOL]=!0,delegate&&delegate.apply(self,args)}})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function patchCallbacks(api,target,targetName,method,callbacks){var symbol=Zone.__symbol__(method);Eif(!target[symbol]){var nativeDelegate=target[symbol]=target[method];target[method]=function(name,opts,options){return opts&&opts.prototype&&callbacks.forEach(function(callback){var source=targetName+"."+method+"::"+callback,prototype=opts.prototype;if(prototype.hasOwnProperty(callback)){var descriptor=api.ObjectGetOwnPropertyDescriptor(prototype,callback);descriptor&&descriptor.value?(descriptor.value=api.wrapWithCurrentZone(descriptor.value,source),api._redefineProperty(opts.prototype,callback,descriptor)):prototype[callback]&&(prototype[callback]=api.wrapWithCurrentZone(prototype[callback],source))}else prototype[callback]&&(prototype[callback]=api.wrapWithCurrentZone(prototype[callback],source))}),nativeDelegate.call(target,name,opts,options)},api.attachOriginToPatched(target[method],nativeDelegate)}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var zoneSymbol$1=Zone.__symbol__,_defineProperty=Object[zoneSymbol$1("defineProperty")]=Object.defineProperty,_getOwnPropertyDescriptor=Object[zoneSymbol$1("getOwnPropertyDescriptor")]=Object.getOwnPropertyDescriptor,_create=Object.create,unconfigurablesKey=zoneSymbol$1("unconfigurables");function _redefineProperty(obj,prop,desc){var originalConfigurableFlag=desc.configurable;return _tryDefineProperty(obj,prop,desc=rewriteDescriptor(obj,prop,desc),originalConfigurableFlag)}function isUnconfigurable(obj,prop){return obj&&obj[unconfigurablesKey]&&obj[unconfigurablesKey][prop]}function rewriteDescriptor(obj,prop,desc){return Object.isFrozen(desc)||(desc.configurable=!0),desc.configurable||(obj[unconfigurablesKey]||Object.isFrozen(obj)||_defineProperty(obj,unconfigurablesKey,{writable:!0,value:{}}),obj[unconfigurablesKey]&&(obj[unconfigurablesKey][prop]=!0)),desc}function _tryDefineProperty(obj,prop,desc,originalConfigurableFlag){try{return _defineProperty(obj,prop,desc)}catch(error){if(!desc.configurable)throw error;void 0===originalConfigurableFlag?delete desc.configurable:desc.configurable=originalConfigurableFlag;try{return _defineProperty(obj,prop,desc)}catch(error){var descJson=null;try{descJson=JSON.stringify(desc)}catch(error){descJson=desc.toString()}console.log("Attempting to configure '"+prop+"' with descriptor '"+descJson+"' on object '"+obj+"' and got error, giving up: "+error)}}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var windowEventNames=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplyconnected","vrdisplaydisconnected","vrdisplaypresentchange"],mediaElementEventNames=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],frameEventNames=["load"],frameSetEventNames=["blur","error","focus","load","resize","scroll","messageerror"],marqueeEventNames=["bounce","finish","start"],XMLHttpRequestEventNames=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],IDBIndexEventNames=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],websocketEventNames=["close","error","open","message"],workerEventNames=["error","message"],eventNames=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],windowEventNames,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function filterProperties(target,onProperties,ignoreProperties){Eif(!ignoreProperties||0===ignoreProperties.length)return onProperties;var tip=ignoreProperties.filter(function(ip){return ip.target===target});if(!tip||0===tip.length)return onProperties;var targetIgnoreProperties=tip[0].ignoreProperties;return onProperties.filter(function(op){return-1===targetIgnoreProperties.indexOf(op)})}function patchFilteredProperties(target,onProperties,ignoreProperties,prototype){target&&patchOnProperties(target,filterProperties(target,onProperties,ignoreProperties),prototype)}function propertyDescriptorPatch(api,_global){Eif((!isNode||isMix)&&!Zone[api.symbol("patchEvents")]){var supportsWebSocket="undefined"!=typeof WebSocket,ignoreProperties=_global.__Zone_ignore_on_properties;Eif(isBrowser){var internalWindow=window,ignoreErrorProperties=isIE?[{target:internalWindow,ignoreProperties:["error"]}]:[];patchFilteredProperties(internalWindow,eventNames.concat(["messageerror"]),ignoreProperties?ignoreProperties.concat(ignoreErrorProperties):ignoreProperties,ObjectGetPrototypeOf(internalWindow)),patchFilteredProperties(Document.prototype,eventNames,ignoreProperties),void 0!==internalWindow.SVGElement&&patchFilteredProperties(internalWindow.SVGElement.prototype,eventNames,ignoreProperties),patchFilteredProperties(Element.prototype,eventNames,ignoreProperties),patchFilteredProperties(HTMLElement.prototype,eventNames,ignoreProperties),patchFilteredProperties(HTMLMediaElement.prototype,mediaElementEventNames,ignoreProperties),patchFilteredProperties(HTMLFrameSetElement.prototype,windowEventNames.concat(frameSetEventNames),ignoreProperties),patchFilteredProperties(HTMLBodyElement.prototype,windowEventNames.concat(frameSetEventNames),ignoreProperties),patchFilteredProperties(HTMLFrameElement.prototype,frameEventNames,ignoreProperties),patchFilteredProperties(HTMLIFrameElement.prototype,frameEventNames,ignoreProperties);var HTMLMarqueeElement_1=internalWindow.HTMLMarqueeElement;HTMLMarqueeElement_1&&patchFilteredProperties(HTMLMarqueeElement_1.prototype,marqueeEventNames,ignoreProperties);var Worker_1=internalWindow.Worker;Worker_1&&patchFilteredProperties(Worker_1.prototype,workerEventNames,ignoreProperties)}var XMLHttpRequest=_global.XMLHttpRequest;XMLHttpRequest&&patchFilteredProperties(XMLHttpRequest.prototype,XMLHttpRequestEventNames,ignoreProperties);var XMLHttpRequestEventTarget=_global.XMLHttpRequestEventTarget;XMLHttpRequestEventTarget&&patchFilteredProperties(XMLHttpRequestEventTarget&&XMLHttpRequestEventTarget.prototype,XMLHttpRequestEventNames,ignoreProperties),"undefined"!=typeof IDBIndex&&(patchFilteredProperties(IDBIndex.prototype,IDBIndexEventNames,ignoreProperties),patchFilteredProperties(IDBRequest.prototype,IDBIndexEventNames,ignoreProperties),patchFilteredProperties(IDBOpenDBRequest.prototype,IDBIndexEventNames,ignoreProperties),patchFilteredProperties(IDBDatabase.prototype,IDBIndexEventNames,ignoreProperties),patchFilteredProperties(IDBTransaction.prototype,IDBIndexEventNames,ignoreProperties),patchFilteredProperties(IDBCursor.prototype,IDBIndexEventNames,ignoreProperties)),supportsWebSocket&&patchFilteredProperties(WebSocket.prototype,websocketEventNames,ignoreProperties)}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function eventTargetLegacyPatch(_global,api){var _a=api.getGlobalObjects(),eventNames=_a.eventNames,globalSources=_a.globalSources,zoneSymbolEventNames=_a.zoneSymbolEventNames,TRUE_STR=_a.TRUE_STR,FALSE_STR=_a.FALSE_STR,ZONE_SYMBOL_PREFIX=_a.ZONE_SYMBOL_PREFIX,WTF_ISSUE_555="Anchor,Area,Audio,BR,Base,BaseFont,Body,Button,Canvas,Content,DList,Directory,Div,Embed,FieldSet,Font,Form,Frame,FrameSet,HR,Head,Heading,Html,IFrame,Image,Input,Keygen,LI,Label,Legend,Link,Map,Marquee,Media,Menu,Meta,Meter,Mod,OList,Object,OptGroup,Option,Output,Paragraph,Pre,Progress,Quote,Script,Select,Source,Span,Style,TableCaption,TableCell,TableCol,Table,TableRow,TableSection,TextArea,Title,Track,UList,Unknown,Video",NO_EVENT_TARGET="ApplicationCache,EventSource,FileReader,InputMethodContext,MediaController,MessagePort,Node,Performance,SVGElementInstance,SharedWorker,TextTrack,TextTrackCue,TextTrackList,WebKitNamedFlow,Window,Worker,WorkerGlobalScope,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload,IDBRequest,IDBOpenDBRequest,IDBDatabase,IDBTransaction,IDBCursor,DBIndex,WebSocket".split(","),apis=[],isWtf=_global.wtf,WTF_ISSUE_555_ARRAY=WTF_ISSUE_555.split(",");isWtf?apis=WTF_ISSUE_555_ARRAY.map(function(v){return"HTML"+v+"Element"}).concat(NO_EVENT_TARGET):_global.EventTarget?apis.push("EventTarget"):apis=NO_EVENT_TARGET;for(var isDisableIECheck=_global.__Zone_disable_IE_check||!1,isEnableCrossContextCheck=_global.__Zone_enable_cross_context_check||!1,ieOrEdge=api.isIEOrEdge(),BROWSER_TOOLS="function __BROWSERTOOLS_CONSOLE_SAFEFUNC() { [native code] }",i=0;i<eventNames.length;i++){var symbol=ZONE_SYMBOL_PREFIX+((eventName=eventNames[i])+FALSE_STR),symbolCapture=ZONE_SYMBOL_PREFIX+(eventName+TRUE_STR);zoneSymbolEventNames[eventName]={},zoneSymbolEventNames[eventName][FALSE_STR]=symbol,zoneSymbolEventNames[eventName][TRUE_STR]=symbolCapture}for(i=0;i<WTF_ISSUE_555.length;i++)for(var target=WTF_ISSUE_555_ARRAY[i],targets=globalSources[target]={},j=0;j<eventNames.length;j++){var eventName;targets[eventName=eventNames[j]]=target+".addEventListener:"+eventName}var apiTypes=[];for(i=0;i<apis.length;i++){var type=_global[apis[i]];apiTypes.push(type&&type.prototype)}return api.patchEventTarget(_global,apiTypes,{vh:function(nativeDelegate,delegate,target,args){Iif(!isDisableIECheck&&ieOrEdge){if(isEnableCrossContextCheck)try{var testString;if("[object FunctionWrapper]"===(testString=delegate.toString())||testString==BROWSER_TOOLS)return nativeDelegate.apply(target,args),!1}catch(error){return nativeDelegate.apply(target,args),!1}else if("[object FunctionWrapper]"===(testString=delegate.toString())||testString==BROWSER_TOOLS)return nativeDelegate.apply(target,args),!1}else Iif(isEnableCrossContextCheck)try{delegate.toString()}catch(error){return nativeDelegate.apply(target,args),!1}return!0}}),Zone[api.symbol("patchEventTarget")]=!!_global.EventTarget,!0}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function propertyDescriptorLegacyPatch(api,_global){var _a=api.getGlobalObjects(),isNode=_a.isNode,isMix=_a.isMix;Iif((!isNode||isMix)&&!function canPatchViaPropertyDescriptor(api,_global){var _a=api.getGlobalObjects(),isBrowser=_a.isBrowser,isMix=_a.isMix;Iif((isBrowser||isMix)&&!api.ObjectGetOwnPropertyDescriptor(HTMLElement.prototype,"onclick")&&"undefined"!=typeof Element){var desc=api.ObjectGetOwnPropertyDescriptor(Element.prototype,"onclick");if(desc&&!desc.configurable)return!1;if(desc){api.ObjectDefineProperty(Element.prototype,"onclick",{enumerable:!0,configurable:!0,get:function(){return!0}});var result=!!document.createElement("div").onclick;return api.ObjectDefineProperty(Element.prototype,"onclick",desc),result}}var XMLHttpRequest=_global.XMLHttpRequest;Iif(!XMLHttpRequest)return!1;var XMLHttpRequestPrototype=XMLHttpRequest.prototype,xhrDesc=api.ObjectGetOwnPropertyDescriptor(XMLHttpRequestPrototype,"onreadystatechange");Eif(xhrDesc)return api.ObjectDefineProperty(XMLHttpRequestPrototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return!0}}),result=!!(req=new XMLHttpRequest).onreadystatechange,api.ObjectDefineProperty(XMLHttpRequestPrototype,"onreadystatechange",xhrDesc||{}),result;var SYMBOL_FAKE_ONREADYSTATECHANGE_1=api.symbol("fake");api.ObjectDefineProperty(XMLHttpRequestPrototype,"onreadystatechange",{enumerable:!0,configurable:!0,get:function(){return this[SYMBOL_FAKE_ONREADYSTATECHANGE_1]},set:function(value){this[SYMBOL_FAKE_ONREADYSTATECHANGE_1]=value}});var req=new XMLHttpRequest,detectFunc=function(){};return req.onreadystatechange=detectFunc,result=req[SYMBOL_FAKE_ONREADYSTATECHANGE_1]===detectFunc,req.onreadystatechange=null,result}(api,_global)){var supportsWebSocket="undefined"!=typeof WebSocket;!function patchViaCapturingAllTheEvents(api){for(var eventNames=api.getGlobalObjects().eventNames,unboundKey=api.symbol("unbound"),_loop_1=function(i){var property=eventNames[i],onproperty="on"+property;self.addEventListener(property,function(event){var bound,source,elt=event.target;for(source=elt?elt.constructor.name+"."+onproperty:"unknown."+onproperty;elt;)elt[onproperty]&&!elt[onproperty][unboundKey]&&((bound=api.wrapWithCurrentZone(elt[onproperty],source))[unboundKey]=elt[onproperty],elt[onproperty]=bound),elt=elt.parentElement},!0)},i=0;i<eventNames.length;i++)_loop_1(i)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(api),api.patchClass("XMLHttpRequest"),supportsWebSocket&&function apply(api,_global){var _a=api.getGlobalObjects(),ADD_EVENT_LISTENER_STR=_a.ADD_EVENT_LISTENER_STR,REMOVE_EVENT_LISTENER_STR=_a.REMOVE_EVENT_LISTENER_STR,WS=_global.WebSocket;_global.EventTarget||api.patchEventTarget(_global,[WS.prototype]),_global.WebSocket=function(x,y){var proxySocket,proxySocketProto,socket=arguments.length>1?new WS(x,y):new WS(x),onmessageDesc=api.ObjectGetOwnPropertyDescriptor(socket,"onmessage");return onmessageDesc&&!1===onmessageDesc.configurable?(proxySocket=api.ObjectCreate(socket),proxySocketProto=socket,[ADD_EVENT_LISTENER_STR,REMOVE_EVENT_LISTENER_STR,"send","close"].forEach(function(propName){proxySocket[propName]=function(){var args=api.ArraySlice.call(arguments);if(propName===ADD_EVENT_LISTENER_STR||propName===REMOVE_EVENT_LISTENER_STR){var eventName=args.length>0?args[0]:void 0;if(eventName){var propertySymbol=Zone.__symbol__("ON_PROPERTY"+eventName);socket[propertySymbol]=proxySocket[propertySymbol]}}return socket[propName].apply(socket,args)}})):proxySocket=socket,api.patchOnProperties(proxySocket,["close","error","message","open"],proxySocketProto),proxySocket};var globalWebSocket=_global.WebSocket;for(var prop in WS)globalWebSocket[prop]=WS[prop]}(api,_global),Zone[api.symbol("patchEvents")]=!0}}Zone.__load_patch("util",function(global,Zone,api){api.patchOnProperties=patchOnProperties,api.patchMethod=patchMethod,api.bindArguments=bindArguments,api.patchMacroTask=patchMacroTask;var SYMBOL_BLACK_LISTED_EVENTS=Zone.__symbol__("BLACK_LISTED_EVENTS"),SYMBOL_UNPATCHED_EVENTS=Zone.__symbol__("UNPATCHED_EVENTS");global[SYMBOL_UNPATCHED_EVENTS]&&(global[SYMBOL_BLACK_LISTED_EVENTS]=global[SYMBOL_UNPATCHED_EVENTS]),global[SYMBOL_BLACK_LISTED_EVENTS]&&(Zone[SYMBOL_BLACK_LISTED_EVENTS]=Zone[SYMBOL_UNPATCHED_EVENTS]=global[SYMBOL_BLACK_LISTED_EVENTS]),api.patchEventPrototype=patchEventPrototype,api.patchEventTarget=patchEventTarget,api.isIEOrEdge=isIEOrEdge,api.ObjectDefineProperty=ObjectDefineProperty,api.ObjectGetOwnPropertyDescriptor=ObjectGetOwnPropertyDescriptor,api.ObjectCreate=ObjectCreate,api.ArraySlice=ArraySlice,api.patchClass=patchClass,api.wrapWithCurrentZone=wrapWithCurrentZone,api.filterProperties=filterProperties,api.attachOriginToPatched=attachOriginToPatched,api._redefineProperty=_redefineProperty,api.patchCallbacks=patchCallbacks,api.getGlobalObjects=function(){return{globalSources:globalSources,zoneSymbolEventNames:zoneSymbolEventNames$1,eventNames:eventNames,isBrowser:isBrowser,isMix:isMix,isNode:isNode,TRUE_STR:TRUE_STR,FALSE_STR:FALSE_STR,ZONE_SYMBOL_PREFIX:ZONE_SYMBOL_PREFIX,ADD_EVENT_LISTENER_STR:ADD_EVENT_LISTENER_STR,REMOVE_EVENT_LISTENER_STR:REMOVE_EVENT_LISTENER_STR}}}),
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function(_global){_global.__zone_symbol__legacyPatch=function(){var Zone=_global.Zone;Zone.__load_patch("registerElement",function(global,Zone,api){!function registerElementPatch(_global,api){var _a=api.getGlobalObjects(),isBrowser=_a.isBrowser,isMix=_a.isMix;(isBrowser||isMix)&&"registerElement"in _global.document&&api.patchCallbacks(api,document,"Document","registerElement",["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"])}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(global,api)}),Zone.__load_patch("EventTargetLegacy",function(global,Zone,api){eventTargetLegacyPatch(global,api),propertyDescriptorLegacyPatch(api,global)})}}("undefined"!=typeof window&&window||"undefined"!=typeof self&&self||global);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var taskSymbol=zoneSymbol("zoneTask");function patchTimer(window,setName,cancelName,nameSuffix){var setNative=null,clearNative=null;cancelName+=nameSuffix;var tasksByHandleId={};function scheduleTask(task){var data=task.data;return data.args[0]=function timer(){try{task.invoke.apply(this,arguments)}finally{task.data&&task.data.isPeriodic||("number"==typeof data.handleId?delete tasksByHandleId[data.handleId]:data.handleId&&(data.handleId[taskSymbol]=null))}},data.handleId=setNative.apply(window,data.args),task}function clearTask(task){return clearNative(task.data.handleId)}setNative=patchMethod(window,setName+=nameSuffix,function(delegate){return function(self,args){Eif("function"==typeof args[0]){var options={isPeriodic:"Interval"===nameSuffix,delay:"Timeout"===nameSuffix||"Interval"===nameSuffix?args[1]||0:void 0,args:args},task=scheduleMacroTaskWithCurrentZone(setName,args[0],options,scheduleTask,clearTask);Iif(!task)return task;var handle=task.data.handleId;return"number"==typeof handle?tasksByHandleId[handle]=task:handle&&(handle[taskSymbol]=task),handle&&handle.ref&&handle.unref&&"function"==typeof handle.ref&&"function"==typeof handle.unref&&(task.ref=handle.ref.bind(handle),task.unref=handle.unref.bind(handle)),"number"==typeof handle||handle?handle:task}return delegate.apply(window,args)}}),clearNative=patchMethod(window,cancelName,function(delegate){return function(self,args){var task,id=args[0];"number"==typeof id?task=tasksByHandleId[id]:(task=id&&id[taskSymbol])||(task=id),task&&"string"==typeof task.type?"notScheduled"!==task.state&&(task.cancelFn&&task.data.isPeriodic||0===task.runCount)&&("number"==typeof id?delete tasksByHandleId[id]:id&&(id[taskSymbol]=null),task.zone.cancelTask(task)):delegate.apply(window,args)}})}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function eventTargetPatch(_global,api){Iif(!Zone[api.symbol("patchEventTarget")]){for(var _a=api.getGlobalObjects(),eventNames=_a.eventNames,zoneSymbolEventNames=_a.zoneSymbolEventNames,TRUE_STR=_a.TRUE_STR,FALSE_STR=_a.FALSE_STR,ZONE_SYMBOL_PREFIX=_a.ZONE_SYMBOL_PREFIX,i=0;i<eventNames.length;i++){var eventName=eventNames[i],symbol=ZONE_SYMBOL_PREFIX+(eventName+FALSE_STR),symbolCapture=ZONE_SYMBOL_PREFIX+(eventName+TRUE_STR);zoneSymbolEventNames[eventName]={},zoneSymbolEventNames[eventName][FALSE_STR]=symbol,zoneSymbolEventNames[eventName][TRUE_STR]=symbolCapture}var EVENT_TARGET=_global.EventTarget;if(EVENT_TARGET&&EVENT_TARGET.prototype)return api.patchEventTarget(_global,[EVENT_TARGET&&EVENT_TARGET.prototype]),!0}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
Zone.__load_patch("legacy",function(global){var legacyPatch=global[Zone.__symbol__("legacyPatch")];legacyPatch&&legacyPatch()}),Zone.__load_patch("timers",function(global){patchTimer(global,"set","clear","Timeout"),patchTimer(global,"set","clear","Interval"),patchTimer(global,"set","clear","Immediate")}),Zone.__load_patch("requestAnimationFrame",function(global){patchTimer(global,"request","cancel","AnimationFrame"),patchTimer(global,"mozRequest","mozCancel","AnimationFrame"),patchTimer(global,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",function(global,Zone){for(var blockingMethods=["alert","prompt","confirm"],i=0;i<blockingMethods.length;i++)patchMethod(global,blockingMethods[i],function(delegate,symbol,name){return function(s,args){return Zone.current.run(delegate,global,args,name)}})}),Zone.__load_patch("EventTarget",function(global,Zone,api){!function patchEvent$1(global,api){api.patchEventPrototype(global,api)}(global,api),eventTargetPatch(global,api);var XMLHttpRequestEventTarget=global.XMLHttpRequestEventTarget;XMLHttpRequestEventTarget&&XMLHttpRequestEventTarget.prototype&&api.patchEventTarget(global,[XMLHttpRequestEventTarget.prototype]),patchClass("MutationObserver"),patchClass("WebKitMutationObserver"),patchClass("IntersectionObserver"),patchClass("FileReader")}),Zone.__load_patch("on_property",function(global,Zone,api){propertyDescriptorPatch(api,global),function propertyPatch(){Object.defineProperty=function(obj,prop,desc){Iif(isUnconfigurable(obj,prop))throw new TypeError("Cannot assign to read only property '"+prop+"' of "+obj);var originalConfigurableFlag=desc.configurable;return"prototype"!==prop&&(desc=rewriteDescriptor(obj,prop,desc)),_tryDefineProperty(obj,prop,desc,originalConfigurableFlag)},Object.defineProperties=function(obj,props){return Object.keys(props).forEach(function(prop){Object.defineProperty(obj,prop,props[prop])}),obj},Object.create=function(obj,proto){return"object"!=typeof proto||Object.isFrozen(proto)||Object.keys(proto).forEach(function(prop){proto[prop]=rewriteDescriptor(obj,prop,proto[prop])}),_create(obj,proto)},Object.getOwnPropertyDescriptor=function(obj,prop){var desc=_getOwnPropertyDescriptor(obj,prop);return desc&&isUnconfigurable(obj,prop)&&(desc.configurable=!1),desc}}()}),Zone.__load_patch("customElements",function(global,Zone,api){!function patchCustomElements(_global,api){var _a=api.getGlobalObjects(),isBrowser=_a.isBrowser,isMix=_a.isMix;(isBrowser||isMix)&&_global.customElements&&"customElements"in _global&&api.patchCallbacks(api,_global.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(global,api)}),Zone.__load_patch("XHR",function(global,Zone){!function patchXHR(window){var XMLHttpRequest=window.XMLHttpRequest;Eif(XMLHttpRequest){var XMLHttpRequestPrototype=XMLHttpRequest.prototype,oriAddListener=XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER],oriRemoveListener=XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];Iif(!oriAddListener){var XMLHttpRequestEventTarget_1=window.XMLHttpRequestEventTarget;if(XMLHttpRequestEventTarget_1){var XMLHttpRequestEventTargetPrototype=XMLHttpRequestEventTarget_1.prototype;oriAddListener=XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER],oriRemoveListener=XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]}}var READY_STATE_CHANGE="readystatechange",SCHEDULED="scheduled",openNative=patchMethod(XMLHttpRequestPrototype,"open",function(){return function(self,args){return self[XHR_SYNC]=0==args[2],self[XHR_URL]=args[1],openNative.apply(self,args)}}),fetchTaskAborting=zoneSymbol("fetchTaskAborting"),fetchTaskScheduling=zoneSymbol("fetchTaskScheduling"),sendNative=patchMethod(XMLHttpRequestPrototype,"send",function(){return function(self,args){if(!0===Zone.current[fetchTaskScheduling])return sendNative.apply(self,args);if(self[XHR_SYNC])return sendNative.apply(self,args);var options={target:self,url:self[XHR_URL],isPeriodic:!1,args:args,aborted:!1},task=scheduleMacroTaskWithCurrentZone("XMLHttpRequest.send",placeholderCallback,options,scheduleTask,clearTask);self&&!0===self[XHR_ERROR_BEFORE_SCHEDULED]&&!options.aborted&&task.state===SCHEDULED&&task.invoke()}}),abortNative=patchMethod(XMLHttpRequestPrototype,"abort",function(){return function(self,args){var task=function findPendingTask(target){return target[XHR_TASK]}(self);if(task&&"string"==typeof task.type){if(null==task.cancelFn||task.data&&task.data.aborted)return;task.zone.cancelTask(task)}else if(!0===Zone.current[fetchTaskAborting])return abortNative.apply(self,args)}})}function scheduleTask(task){var data=task.data,target=data.target;target[XHR_SCHEDULED]=!1,target[XHR_ERROR_BEFORE_SCHEDULED]=!1;var listener=target[XHR_LISTENER];oriAddListener||(oriAddListener=target[ZONE_SYMBOL_ADD_EVENT_LISTENER],oriRemoveListener=target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER]),listener&&oriRemoveListener.call(target,READY_STATE_CHANGE,listener);var newListener=target[XHR_LISTENER]=function(){if(target.readyState===target.DONE)if(!data.aborted&&target[XHR_SCHEDULED]&&task.state===SCHEDULED){var loadTasks=target.__zone_symbol__loadfalse;if(loadTasks&&loadTasks.length>0){var oriInvoke_1=task.invoke;task.invoke=function(){for(var loadTasks=target.__zone_symbol__loadfalse,i=0;i<loadTasks.length;i++)loadTasks[i]===task&&loadTasks.splice(i,1);data.aborted||task.state!==SCHEDULED||oriInvoke_1.call(task)},loadTasks.push(task)}else task.invoke()}else data.aborted||!1!==target[XHR_SCHEDULED]||(target[XHR_ERROR_BEFORE_SCHEDULED]=!0)};return oriAddListener.call(target,READY_STATE_CHANGE,newListener),target[XHR_TASK]||(target[XHR_TASK]=task),sendNative.apply(target,data.args),target[XHR_SCHEDULED]=!0,task}function placeholderCallback(){}function clearTask(task){var data=task.data;return data.aborted=!0,abortNative.apply(data.target,data.args)}}(global);var XHR_TASK=zoneSymbol("xhrTask"),XHR_SYNC=zoneSymbol("xhrSync"),XHR_LISTENER=zoneSymbol("xhrListener"),XHR_SCHEDULED=zoneSymbol("xhrScheduled"),XHR_URL=zoneSymbol("xhrURL"),XHR_ERROR_BEFORE_SCHEDULED=zoneSymbol("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",function(global){global.navigator&&global.navigator.geolocation&&function patchPrototype(prototype,fnNames){for(var source=prototype.constructor.name,_loop_1=function(i){var name_1=fnNames[i],delegate=prototype[name_1];Eif(delegate){Iif(!isPropertyWritable(ObjectGetOwnPropertyDescriptor(prototype,name_1)))return"continue";prototype[name_1]=function(delegate){var patched=function(){return delegate.apply(this,bindArguments(arguments,source+"."+name_1))};return attachOriginToPatched(patched,delegate),patched}(delegate)}},i=0;i<fnNames.length;i++)_loop_1(i)}(global.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",function(global,Zone){function findPromiseRejectionHandler(evtName){return function(e){findEventTasks(global,evtName).forEach(function(eventTask){var PromiseRejectionEvent=global.PromiseRejectionEvent;if(PromiseRejectionEvent){var evt=new PromiseRejectionEvent(evtName,{promise:e.promise,reason:e.rejection});eventTask.invoke(evt)}})}}global.PromiseRejectionEvent&&(Zone[zoneSymbol("unhandledPromiseRejectionHandler")]=findPromiseRejectionHandler("unhandledrejection"),Zone[zoneSymbol("rejectionHandledHandler")]=findPromiseRejectionHandler("rejectionhandled"))})})()}).call(this,__webpack_require__(18))},function(module,exports,__webpack_require__){"use strict";__webpack_require__(6),Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=function render(_ref){var storyFn=_ref.storyFn,showMain=_ref.showMain,forceRender=_ref.forceRender;showMain(),(0,_helpers.renderNgApp)(storyFn,forceRender)};var _helpers=__webpack_require__(585)},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,"moduleMetadata",function(){return moduleMetadata});const moduleMetadata=metadata=>storyFn=>{const story=storyFn(),storyMetadata=story.moduleMetadata||{};return metadata=metadata||{},Object.assign({},story,{moduleMetadata:{declarations:[...metadata.declarations||[],...storyMetadata.declarations||[]],entryComponents:[...metadata.entryComponents||[],...storyMetadata.entryComponents||[]],imports:[...metadata.imports||[],...storyMetadata.imports||[]],schemas:[...metadata.schemas||[],...storyMetadata.schemas||[]],providers:[...metadata.providers||[],...storyMetadata.providers||[]]}})}},,,function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(6),__webpack_require__(45),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0});var _ActionDisplay=__webpack_require__(562);Object.keys(_ActionDisplay).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _ActionDisplay[key]}})});var _ActionOptions=__webpack_require__(563);Object.keys(_ActionOptions).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _ActionOptions[key]}})});var _ActionsMap=__webpack_require__(564);Object.keys(_ActionsMap).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _ActionsMap[key]}})});var _DecoratorFunction=__webpack_require__(565);Object.keys(_DecoratorFunction).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _DecoratorFunction[key]}})});var _HandlerFunction=__webpack_require__(566);Object.keys(_HandlerFunction).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _HandlerFunction[key]}})})},function(module,exports,__webpack_require__){},function(module,exports,__webpack_require__){},function(module,exports,__webpack_require__){},function(module,exports,__webpack_require__){},function(module,exports,__webpack_require__){},function(module,exports,__webpack_require__){"use strict";__webpack_require__(22),__webpack_require__(6),__webpack_require__(45),__webpack_require__(19),Object.defineProperty(exports,"__esModule",{value:!0});var _action=__webpack_require__(172);Object.keys(_action).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _action[key]}})});var _actions=__webpack_require__(174);Object.keys(_actions).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _actions[key]}})});var _configureActions=__webpack_require__(173);Object.keys(_configureActions).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _configureActions[key]}})});var _decorateAction=__webpack_require__(571);Object.keys(_decorateAction).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _decorateAction[key]}})});var _withActions=__webpack_require__(266);Object.keys(_withActions).forEach(function(key){"default"!==key&&"__esModule"!==key&&Object.defineProperty(exports,key,{enumerable:!0,get:function get(){return _withActions[key]}})})},function(module,exports,__webpack_require__){var _nodeId,_clockseq,rng=__webpack_require__(569),bytesToUuid=__webpack_require__(570),_lastMSecs=0,_lastNSecs=0;module.exports=function v1(options,buf,offset){var i=buf&&offset||0,b=buf||[],node=(options=options||{}).node||_nodeId,clockseq=void 0!==options.clockseq?options.clockseq:_clockseq;if(null==node||null==clockseq){var seedBytes=rng();null==node&&(node=_nodeId=[1|seedBytes[0],seedBytes[1],seedBytes[2],seedBytes[3],seedBytes[4],seedBytes[5]]),null==clockseq&&(clockseq=_clockseq=16383&(seedBytes[6]<<8|seedBytes[7]))}var msecs=void 0!==options.msecs?options.msecs:(new Date).getTime(),nsecs=void 0!==options.nsecs?options.nsecs:_lastNSecs+1,dt=msecs-_lastMSecs+(nsecs-_lastNSecs)/1e4;if(dt<0&&void 0===options.clockseq&&(clockseq=clockseq+1&16383),(dt<0||msecs>_lastMSecs)&&void 0===options.nsecs&&(nsecs=0),nsecs>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");_lastMSecs=msecs,_lastNSecs=nsecs,_clockseq=clockseq;var tl=(1e4*(268435455&(msecs+=122192928e5))+nsecs)%4294967296;b[i++]=tl>>>24&255,b[i++]=tl>>>16&255,b[i++]=tl>>>8&255,b[i++]=255&tl;var tmh=msecs/4294967296*1e4&268435455;b[i++]=tmh>>>8&255,b[i++]=255&tmh,b[i++]=tmh>>>24&15|16,b[i++]=tmh>>>16&255,b[i++]=clockseq>>>8|128,b[i++]=255&clockseq;for(var n=0;n<6;++n)b[i+n]=node[n];return buf||bytesToUuid(b)}},function(module,exports){var getRandomValues="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);Eif(getRandomValues){var rnds8=new Uint8Array(16);module.exports=function whatwgRNG(){return getRandomValues(rnds8),rnds8}}else{var rnds=new Array(16);module.exports=function mathRNG(){for(var r,i=0;i<16;i++)0==(3&i)&&(r=4294967296*Math.random()),rnds[i]=r>>>((3&i)<<3)&255;return rnds}}},function(module,exports){for(var byteToHex=[],i=0;i<256;++i)byteToHex[i]=(i+256).toString(16).substr(1);module.exports=function bytesToUuid(buf,offset){var i=offset||0,bth=byteToHex;return[bth[buf[i++]],bth[buf[i++]],bth[buf[i++]],bth[buf[i++]],"-",bth[buf[i++]],bth[buf[i++]],"-",bth[buf[i++]],bth[buf[i++]],"-",bth[buf[i++]],bth[buf[i++]],"-",bth[buf[i++]],bth[buf[i++]],bth[buf[i++]],bth[buf[i++]],bth[buf[i++]],bth[buf[i++]]].join("")}},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(22),__webpack_require__(89),__webpack_require__(51),__webpack_require__(27),__webpack_require__(151),__webpack_require__(90),__webpack_require__(6),__webpack_require__(45),__webpack_require__(26),__webpack_require__(91),__webpack_require__(46),__webpack_require__(19),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.decorate=exports.decorateAction=void 0;var _action=__webpack_require__(172),_actions=__webpack_require__(174),_withActions=__webpack_require__(266);function _toConsumableArray(arr){return function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}}(arr)||function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||"[object Arguments]"===Object.prototype.toString.call(iter))return Array.from(iter)}(arr)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var applyDecorators=function applyDecorators(decorators,actionCallback){return function(){for(var _len=arguments.length,_args=new Array(_len),_key=0;_key<_len;_key++)_args[_key]=arguments[_key];var decorated=decorators.reduce(function(args,storyFn){return storyFn(args)},_args);actionCallback.apply(void 0,_toConsumableArray(decorated))}},decorateAction=function decorateAction(decorators){return function(name,options){var callAction=(0,_action.action)(name,options);return applyDecorators(decorators,callAction)}};exports.decorateAction=decorateAction;exports.decorate=function decorate(decorators){var decoratedActions=function decoratedActions(){var rawActions=_actions.actions.apply(void 0,arguments),actionsObject={};return Object.keys(rawActions).forEach(function(name){actionsObject[name]=applyDecorators(decorators,rawActions[name])}),actionsObject};return{action:decorateAction(decorators),actions:decoratedActions,withActions:(0,_withActions.createDecorator)(decoratedActions)}}},function(module,exports,__webpack_require__){(function(global,module){var __WEBPACK_AMD_DEFINE_RESULT__;
/**
 * @license
 * Lodash <https://lodash.com/>
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */(function(){var undefined,LARGE_ARRAY_SIZE=200,CORE_ERROR_TEXT="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",FUNC_ERROR_TEXT="Expected a function",HASH_UNDEFINED="__lodash_hash_undefined__",MAX_MEMOIZE_SIZE=500,PLACEHOLDER="__lodash_placeholder__",CLONE_DEEP_FLAG=1,CLONE_FLAT_FLAG=2,CLONE_SYMBOLS_FLAG=4,COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2,WRAP_BIND_FLAG=1,WRAP_BIND_KEY_FLAG=2,WRAP_CURRY_BOUND_FLAG=4,WRAP_CURRY_FLAG=8,WRAP_CURRY_RIGHT_FLAG=16,WRAP_PARTIAL_FLAG=32,WRAP_PARTIAL_RIGHT_FLAG=64,WRAP_ARY_FLAG=128,WRAP_REARG_FLAG=256,WRAP_FLIP_FLAG=512,DEFAULT_TRUNC_LENGTH=30,DEFAULT_TRUNC_OMISSION="...",HOT_COUNT=800,HOT_SPAN=16,LAZY_FILTER_FLAG=1,LAZY_MAP_FLAG=2,INFINITY=1/0,MAX_SAFE_INTEGER=9007199254740991,MAX_INTEGER=17976931348623157e292,NAN=NaN,MAX_ARRAY_LENGTH=4294967295,MAX_ARRAY_INDEX=MAX_ARRAY_LENGTH-1,HALF_MAX_ARRAY_LENGTH=MAX_ARRAY_LENGTH>>>1,wrapFlags=[["ary",WRAP_ARY_FLAG],["bind",WRAP_BIND_FLAG],["bindKey",WRAP_BIND_KEY_FLAG],["curry",WRAP_CURRY_FLAG],["curryRight",WRAP_CURRY_RIGHT_FLAG],["flip",WRAP_FLIP_FLAG],["partial",WRAP_PARTIAL_FLAG],["partialRight",WRAP_PARTIAL_RIGHT_FLAG],["rearg",WRAP_REARG_FLAG]],argsTag="[object Arguments]",arrayTag="[object Array]",asyncTag="[object AsyncFunction]",boolTag="[object Boolean]",dateTag="[object Date]",domExcTag="[object DOMException]",errorTag="[object Error]",funcTag="[object Function]",genTag="[object GeneratorFunction]",mapTag="[object Map]",numberTag="[object Number]",nullTag="[object Null]",objectTag="[object Object]",proxyTag="[object Proxy]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",undefinedTag="[object Undefined]",weakMapTag="[object WeakMap]",weakSetTag="[object WeakSet]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",reEmptyStringLeading=/\b__p \+= '';/g,reEmptyStringMiddle=/\b(__p \+=) '' \+/g,reEmptyStringTrailing=/(__e\(.*?\)|\b__t\)) \+\n'';/g,reEscapedHtml=/&(?:amp|lt|gt|quot|#39);/g,reUnescapedHtml=/[&<>"']/g,reHasEscapedHtml=RegExp(reEscapedHtml.source),reHasUnescapedHtml=RegExp(reUnescapedHtml.source),reEscape=/<%-([\s\S]+?)%>/g,reEvaluate=/<%([\s\S]+?)%>/g,reInterpolate=/<%=([\s\S]+?)%>/g,reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/,rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,reRegExpChar=/[\\^$.*+?()[\]{}|]/g,reHasRegExpChar=RegExp(reRegExpChar.source),reTrim=/^\s+|\s+$/g,reTrimStart=/^\s+/,reTrimEnd=/\s+$/,reWrapComment=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,reWrapDetails=/\{\n\/\* \[wrapped with (.+)\] \*/,reSplitDetails=/,? & /,reAsciiWord=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,reEscapeChar=/\\(\\)?/g,reEsTemplate=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,reFlags=/\w*$/,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsHostCtor=/^\[object .+?Constructor\]$/,reIsOctal=/^0o[0-7]+$/i,reIsUint=/^(?:0|[1-9]\d*)$/,reLatin=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,reNoMatch=/($^)/,reUnescapedString=/['\n\r\u2028\u2029\\]/g,rsComboRange="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",rsBreakRange="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",rsAstral="[\\ud800-\\udfff]",rsBreak="["+rsBreakRange+"]",rsCombo="["+rsComboRange+"]",rsDigits="\\d+",rsDingbat="[\\u2700-\\u27bf]",rsLower="[a-z\\xdf-\\xf6\\xf8-\\xff]",rsMisc="[^\\ud800-\\udfff"+rsBreakRange+rsDigits+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",rsFitz="\\ud83c[\\udffb-\\udfff]",rsNonAstral="[^\\ud800-\\udfff]",rsRegional="(?:\\ud83c[\\udde6-\\uddff]){2}",rsSurrPair="[\\ud800-\\udbff][\\udc00-\\udfff]",rsUpper="[A-Z\\xc0-\\xd6\\xd8-\\xde]",rsMiscLower="(?:"+rsLower+"|"+rsMisc+")",rsMiscUpper="(?:"+rsUpper+"|"+rsMisc+")",reOptMod="(?:"+rsCombo+"|"+rsFitz+")"+"?",rsSeq="[\\ufe0e\\ufe0f]?"+reOptMod+("(?:\\u200d(?:"+[rsNonAstral,rsRegional,rsSurrPair].join("|")+")[\\ufe0e\\ufe0f]?"+reOptMod+")*"),rsEmoji="(?:"+[rsDingbat,rsRegional,rsSurrPair].join("|")+")"+rsSeq,rsSymbol="(?:"+[rsNonAstral+rsCombo+"?",rsCombo,rsRegional,rsSurrPair,rsAstral].join("|")+")",reApos=RegExp("['’]","g"),reComboMark=RegExp(rsCombo,"g"),reUnicode=RegExp(rsFitz+"(?="+rsFitz+")|"+rsSymbol+rsSeq,"g"),reUnicodeWord=RegExp([rsUpper+"?"+rsLower+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[rsBreak,rsUpper,"$"].join("|")+")",rsMiscUpper+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[rsBreak,rsUpper+rsMiscLower,"$"].join("|")+")",rsUpper+"?"+rsMiscLower+"+(?:['’](?:d|ll|m|re|s|t|ve))?",rsUpper+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",rsDigits,rsEmoji].join("|"),"g"),reHasUnicode=RegExp("[\\u200d\\ud800-\\udfff"+rsComboRange+"\\ufe0e\\ufe0f]"),reHasUnicodeWord=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,contextProps=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],templateCounter=-1,typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var cloneableTags={};cloneableTags[argsTag]=cloneableTags[arrayTag]=cloneableTags[arrayBufferTag]=cloneableTags[dataViewTag]=cloneableTags[boolTag]=cloneableTags[dateTag]=cloneableTags[float32Tag]=cloneableTags[float64Tag]=cloneableTags[int8Tag]=cloneableTags[int16Tag]=cloneableTags[int32Tag]=cloneableTags[mapTag]=cloneableTags[numberTag]=cloneableTags[objectTag]=cloneableTags[regexpTag]=cloneableTags[setTag]=cloneableTags[stringTag]=cloneableTags[symbolTag]=cloneableTags[uint8Tag]=cloneableTags[uint8ClampedTag]=cloneableTags[uint16Tag]=cloneableTags[uint32Tag]=!0,cloneableTags[errorTag]=cloneableTags[funcTag]=cloneableTags[weakMapTag]=!1;var stringEscapes={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},freeParseFloat=parseFloat,freeParseInt=parseInt,freeGlobal="object"==typeof global&&global&&global.Object===Object&&global,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),freeExports=exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,freeProcess=moduleExports&&freeGlobal.process,nodeUtil=function(){try{var types=freeModule&&freeModule.require&&freeModule.require("util").types;return types||freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}(),nodeIsArrayBuffer=nodeUtil&&nodeUtil.isArrayBuffer,nodeIsDate=nodeUtil&&nodeUtil.isDate,nodeIsMap=nodeUtil&&nodeUtil.isMap,nodeIsRegExp=nodeUtil&&nodeUtil.isRegExp,nodeIsSet=nodeUtil&&nodeUtil.isSet,nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;function apply(func,thisArg,args){switch(args.length){case 0:return func.call(thisArg);case 1:return func.call(thisArg,args[0]);case 2:return func.call(thisArg,args[0],args[1]);case 3:return func.call(thisArg,args[0],args[1],args[2])}return func.apply(thisArg,args)}function arrayAggregator(array,setter,iteratee,accumulator){for(var index=-1,length=null==array?0:array.length;++index<length;){var value=array[index];setter(accumulator,value,iteratee(value),array)}return accumulator}function arrayEach(array,iteratee){for(var index=-1,length=null==array?0:array.length;++index<length&&!1!==iteratee(array[index],index,array););return array}function arrayEachRight(array,iteratee){for(var length=null==array?0:array.length;length--&&!1!==iteratee(array[length],length,array););return array}function arrayEvery(array,predicate){for(var index=-1,length=null==array?0:array.length;++index<length;)if(!predicate(array[index],index,array))return!1;return!0}function arrayFilter(array,predicate){for(var index=-1,length=null==array?0:array.length,resIndex=0,result=[];++index<length;){var value=array[index];predicate(value,index,array)&&(result[resIndex++]=value)}return result}function arrayIncludes(array,value){return!!(null==array?0:array.length)&&baseIndexOf(array,value,0)>-1}function arrayIncludesWith(array,value,comparator){for(var index=-1,length=null==array?0:array.length;++index<length;)if(comparator(value,array[index]))return!0;return!1}function arrayMap(array,iteratee){for(var index=-1,length=null==array?0:array.length,result=Array(length);++index<length;)result[index]=iteratee(array[index],index,array);return result}function arrayPush(array,values){for(var index=-1,length=values.length,offset=array.length;++index<length;)array[offset+index]=values[index];return array}function arrayReduce(array,iteratee,accumulator,initAccum){var index=-1,length=null==array?0:array.length;for(initAccum&&length&&(accumulator=array[++index]);++index<length;)accumulator=iteratee(accumulator,array[index],index,array);return accumulator}function arrayReduceRight(array,iteratee,accumulator,initAccum){var length=null==array?0:array.length;for(initAccum&&length&&(accumulator=array[--length]);length--;)accumulator=iteratee(accumulator,array[length],length,array);return accumulator}function arraySome(array,predicate){for(var index=-1,length=null==array?0:array.length;++index<length;)if(predicate(array[index],index,array))return!0;return!1}var asciiSize=baseProperty("length");function baseFindKey(collection,predicate,eachFunc){var result;return eachFunc(collection,function(value,key,collection){if(predicate(value,key,collection))return result=key,!1}),result}function baseFindIndex(array,predicate,fromIndex,fromRight){for(var length=array.length,index=fromIndex+(fromRight?1:-1);fromRight?index--:++index<length;)if(predicate(array[index],index,array))return index;return-1}function baseIndexOf(array,value,fromIndex){return value==value?function strictIndexOf(array,value,fromIndex){var index=fromIndex-1,length=array.length;for(;++index<length;)if(array[index]===value)return index;return-1}(array,value,fromIndex):baseFindIndex(array,baseIsNaN,fromIndex)}function baseIndexOfWith(array,value,fromIndex,comparator){for(var index=fromIndex-1,length=array.length;++index<length;)if(comparator(array[index],value))return index;return-1}function baseIsNaN(value){return value!=value}function baseMean(array,iteratee){var length=null==array?0:array.length;return length?baseSum(array,iteratee)/length:NAN}function baseProperty(key){return function(object){return null==object?undefined:object[key]}}function basePropertyOf(object){return function(key){return null==object?undefined:object[key]}}function baseReduce(collection,iteratee,accumulator,initAccum,eachFunc){return eachFunc(collection,function(value,index,collection){accumulator=initAccum?(initAccum=!1,value):iteratee(accumulator,value,index,collection)}),accumulator}function baseSum(array,iteratee){for(var result,index=-1,length=array.length;++index<length;){var current=iteratee(array[index]);current!==undefined&&(result=result===undefined?current:result+current)}return result}function baseTimes(n,iteratee){for(var index=-1,result=Array(n);++index<n;)result[index]=iteratee(index);return result}function baseUnary(func){return function(value){return func(value)}}function baseValues(object,props){return arrayMap(props,function(key){return object[key]})}function cacheHas(cache,key){return cache.has(key)}function charsStartIndex(strSymbols,chrSymbols){for(var index=-1,length=strSymbols.length;++index<length&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1;);return index}function charsEndIndex(strSymbols,chrSymbols){for(var index=strSymbols.length;index--&&baseIndexOf(chrSymbols,strSymbols[index],0)>-1;);return index}var deburrLetter=basePropertyOf({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),escapeHtmlChar=basePropertyOf({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function escapeStringChar(chr){return"\\"+stringEscapes[chr]}function hasUnicode(string){return reHasUnicode.test(string)}function mapToArray(map){var index=-1,result=Array(map.size);return map.forEach(function(value,key){result[++index]=[key,value]}),result}function overArg(func,transform){return function(arg){return func(transform(arg))}}function replaceHolders(array,placeholder){for(var index=-1,length=array.length,resIndex=0,result=[];++index<length;){var value=array[index];value!==placeholder&&value!==PLACEHOLDER||(array[index]=PLACEHOLDER,result[resIndex++]=index)}return result}function setToArray(set){var index=-1,result=Array(set.size);return set.forEach(function(value){result[++index]=value}),result}function setToPairs(set){var index=-1,result=Array(set.size);return set.forEach(function(value){result[++index]=[value,value]}),result}function stringSize(string){return hasUnicode(string)?function unicodeSize(string){var result=reUnicode.lastIndex=0;for(;reUnicode.test(string);)++result;return result}(string):asciiSize(string)}function stringToArray(string){return hasUnicode(string)?function unicodeToArray(string){return string.match(reUnicode)||[]}(string):function asciiToArray(string){return string.split("")}(string)}var unescapeHtmlChar=basePropertyOf({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var _=function runInContext(context){var uid,Array=(context=null==context?root:_.defaults(root.Object(),context,_.pick(root,contextProps))).Array,Date=context.Date,Error=context.Error,Function=context.Function,Math=context.Math,Object=context.Object,RegExp=context.RegExp,String=context.String,TypeError=context.TypeError,arrayProto=Array.prototype,funcProto=Function.prototype,objectProto=Object.prototype,coreJsData=context["__core-js_shared__"],funcToString=funcProto.toString,hasOwnProperty=objectProto.hasOwnProperty,idCounter=0,maskSrcKey=(uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||""))?"Symbol(src)_1."+uid:"",nativeObjectToString=objectProto.toString,objectCtorString=funcToString.call(Object),oldDash=root._,reIsNative=RegExp("^"+funcToString.call(hasOwnProperty).replace(reRegExpChar,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Buffer=moduleExports?context.Buffer:undefined,Symbol=context.Symbol,Uint8Array=context.Uint8Array,allocUnsafe=Buffer?Buffer.allocUnsafe:undefined,getPrototype=overArg(Object.getPrototypeOf,Object),objectCreate=Object.create,propertyIsEnumerable=objectProto.propertyIsEnumerable,splice=arrayProto.splice,spreadableSymbol=Symbol?Symbol.isConcatSpreadable:undefined,symIterator=Symbol?Symbol.iterator:undefined,symToStringTag=Symbol?Symbol.toStringTag:undefined,defineProperty=function(){try{var func=getNative(Object,"defineProperty");return func({},"",{}),func}catch(e){}}(),ctxClearTimeout=context.clearTimeout!==root.clearTimeout&&context.clearTimeout,ctxNow=Date&&Date.now!==root.Date.now&&Date.now,ctxSetTimeout=context.setTimeout!==root.setTimeout&&context.setTimeout,nativeCeil=Math.ceil,nativeFloor=Math.floor,nativeGetSymbols=Object.getOwnPropertySymbols,nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,nativeIsFinite=context.isFinite,nativeJoin=arrayProto.join,nativeKeys=overArg(Object.keys,Object),nativeMax=Math.max,nativeMin=Math.min,nativeNow=Date.now,nativeParseInt=context.parseInt,nativeRandom=Math.random,nativeReverse=arrayProto.reverse,DataView=getNative(context,"DataView"),Map=getNative(context,"Map"),Promise=getNative(context,"Promise"),Set=getNative(context,"Set"),WeakMap=getNative(context,"WeakMap"),nativeCreate=getNative(Object,"create"),metaMap=WeakMap&&new WeakMap,realNames={},dataViewCtorString=toSource(DataView),mapCtorString=toSource(Map),promiseCtorString=toSource(Promise),setCtorString=toSource(Set),weakMapCtorString=toSource(WeakMap),symbolProto=Symbol?Symbol.prototype:undefined,symbolValueOf=symbolProto?symbolProto.valueOf:undefined,symbolToString=symbolProto?symbolProto.toString:undefined;function lodash(value){if(isObjectLike(value)&&!isArray(value)&&!(value instanceof LazyWrapper)){if(value instanceof LodashWrapper)return value;if(hasOwnProperty.call(value,"__wrapped__"))return wrapperClone(value)}return new LodashWrapper(value)}var baseCreate=function(){function object(){}return function(proto){Iif(!isObject(proto))return{};Eif(objectCreate)return objectCreate(proto);object.prototype=proto;var result=new object;return object.prototype=undefined,result}}();function baseLodash(){}function LodashWrapper(value,chainAll){this.__wrapped__=value,this.__actions__=[],this.__chain__=!!chainAll,this.__index__=0,this.__values__=undefined}function LazyWrapper(value){this.__wrapped__=value,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=MAX_ARRAY_LENGTH,this.__views__=[]}function Hash(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function ListCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function MapCache(entries){var index=-1,length=null==entries?0:entries.length;for(this.clear();++index<length;){var entry=entries[index];this.set(entry[0],entry[1])}}function SetCache(values){var index=-1,length=null==values?0:values.length;for(this.__data__=new MapCache;++index<length;)this.add(values[index])}function Stack(entries){var data=this.__data__=new ListCache(entries);this.size=data.size}function arrayLikeKeys(value,inherited){var isArr=isArray(value),isArg=!isArr&&isArguments(value),isBuff=!isArr&&!isArg&&isBuffer(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),skipIndexes=isArr||isArg||isBuff||isType,result=skipIndexes?baseTimes(value.length,String):[],length=result.length;for(var key in value)!inherited&&!hasOwnProperty.call(value,key)||skipIndexes&&("length"==key||isBuff&&("offset"==key||"parent"==key)||isType&&("buffer"==key||"byteLength"==key||"byteOffset"==key)||isIndex(key,length))||result.push(key);return result}function arraySample(array){var length=array.length;return length?array[baseRandom(0,length-1)]:undefined}function arraySampleSize(array,n){return shuffleSelf(copyArray(array),baseClamp(n,0,array.length))}function arrayShuffle(array){return shuffleSelf(copyArray(array))}function assignMergeValue(object,key,value){(value===undefined||eq(object[key],value))&&(value!==undefined||key in object)||baseAssignValue(object,key,value)}function assignValue(object,key,value){var objValue=object[key];hasOwnProperty.call(object,key)&&eq(objValue,value)&&(value!==undefined||key in object)||baseAssignValue(object,key,value)}function assocIndexOf(array,key){for(var length=array.length;length--;)if(eq(array[length][0],key))return length;return-1}function baseAggregator(collection,setter,iteratee,accumulator){return baseEach(collection,function(value,key,collection){setter(accumulator,value,iteratee(value),collection)}),accumulator}function baseAssign(object,source){return object&&copyObject(source,keys(source),object)}function baseAssignValue(object,key,value){"__proto__"==key&&defineProperty?defineProperty(object,key,{configurable:!0,enumerable:!0,value:value,writable:!0}):object[key]=value}function baseAt(object,paths){for(var index=-1,length=paths.length,result=Array(length),skip=null==object;++index<length;)result[index]=skip?undefined:get(object,paths[index]);return result}function baseClamp(number,lower,upper){return number==number&&(upper!==undefined&&(number=number<=upper?number:upper),lower!==undefined&&(number=number>=lower?number:lower)),number}function baseClone(value,bitmask,customizer,key,object,stack){var result,isDeep=bitmask&CLONE_DEEP_FLAG,isFlat=bitmask&CLONE_FLAT_FLAG,isFull=bitmask&CLONE_SYMBOLS_FLAG;if(customizer&&(result=object?customizer(value,key,object,stack):customizer(value)),result!==undefined)return result;if(!isObject(value))return value;var isArr=isArray(value);if(isArr){if(result=function initCloneArray(array){var length=array.length,result=new array.constructor(length);length&&"string"==typeof array[0]&&hasOwnProperty.call(array,"index")&&(result.index=array.index,result.input=array.input);return result}(value),!isDeep)return copyArray(value,result)}else{var tag=getTag(value),isFunc=tag==funcTag||tag==genTag;if(isBuffer(value))return cloneBuffer(value,isDeep);if(tag==objectTag||tag==argsTag||isFunc&&!object){if(result=isFlat||isFunc?{}:initCloneObject(value),!isDeep)return isFlat?function copySymbolsIn(source,object){return copyObject(source,getSymbolsIn(source),object)}(value,function baseAssignIn(object,source){return object&&copyObject(source,keysIn(source),object)}(result,value)):function copySymbols(source,object){return copyObject(source,getSymbols(source),object)}(value,baseAssign(result,value))}else{if(!cloneableTags[tag])return object?value:{};result=function initCloneByTag(object,tag,isDeep){var Ctor=object.constructor;switch(tag){case arrayBufferTag:return cloneArrayBuffer(object);case boolTag:case dateTag:return new Ctor(+object);case dataViewTag:return function cloneDataView(dataView,isDeep){var buffer=isDeep?cloneArrayBuffer(dataView.buffer):dataView.buffer;return new dataView.constructor(buffer,dataView.byteOffset,dataView.byteLength)}(object,isDeep);case float32Tag:case float64Tag:case int8Tag:case int16Tag:case int32Tag:case uint8Tag:case uint8ClampedTag:case uint16Tag:case uint32Tag:return cloneTypedArray(object,isDeep);case mapTag:return new Ctor;case numberTag:case stringTag:return new Ctor(object);case regexpTag:return function cloneRegExp(regexp){var result=new regexp.constructor(regexp.source,reFlags.exec(regexp));return result.lastIndex=regexp.lastIndex,result}(object);case setTag:return new Ctor;case symbolTag:return function cloneSymbol(symbol){return symbolValueOf?Object(symbolValueOf.call(symbol)):{}}(object)}}(value,tag,isDeep)}}stack||(stack=new Stack);var stacked=stack.get(value);if(stacked)return stacked;stack.set(value,result),isSet(value)?value.forEach(function(subValue){result.add(baseClone(subValue,bitmask,customizer,subValue,value,stack))}):isMap(value)&&value.forEach(function(subValue,key){result.set(key,baseClone(subValue,bitmask,customizer,key,value,stack))});var props=isArr?undefined:(isFull?isFlat?getAllKeysIn:getAllKeys:isFlat?keysIn:keys)(value);return arrayEach(props||value,function(subValue,key){props&&(subValue=value[key=subValue]),assignValue(result,key,baseClone(subValue,bitmask,customizer,key,value,stack))}),result}function baseConformsTo(object,source,props){var length=props.length;if(null==object)return!length;for(object=Object(object);length--;){var key=props[length],predicate=source[key],value=object[key];if(value===undefined&&!(key in object)||!predicate(value))return!1}return!0}function baseDelay(func,wait,args){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return setTimeout(function(){func.apply(undefined,args)},wait)}function baseDifference(array,values,iteratee,comparator){var index=-1,includes=arrayIncludes,isCommon=!0,length=array.length,result=[],valuesLength=values.length;if(!length)return result;iteratee&&(values=arrayMap(values,baseUnary(iteratee))),comparator?(includes=arrayIncludesWith,isCommon=!1):values.length>=LARGE_ARRAY_SIZE&&(includes=cacheHas,isCommon=!1,values=new SetCache(values));outer:for(;++index<length;){var value=array[index],computed=null==iteratee?value:iteratee(value);if(value=comparator||0!==value?value:0,isCommon&&computed==computed){for(var valuesIndex=valuesLength;valuesIndex--;)if(values[valuesIndex]===computed)continue outer;result.push(value)}else includes(values,computed,comparator)||result.push(value)}return result}lodash.templateSettings={escape:reEscape,evaluate:reEvaluate,interpolate:reInterpolate,variable:"",imports:{_:lodash}},lodash.prototype=baseLodash.prototype,lodash.prototype.constructor=lodash,LodashWrapper.prototype=baseCreate(baseLodash.prototype),LodashWrapper.prototype.constructor=LodashWrapper,LazyWrapper.prototype=baseCreate(baseLodash.prototype),LazyWrapper.prototype.constructor=LazyWrapper,Hash.prototype.clear=function hashClear(){this.__data__=nativeCreate?nativeCreate(null):{},this.size=0},Hash.prototype.delete=function hashDelete(key){var result=this.has(key)&&delete this.__data__[key];return this.size-=result?1:0,result},Hash.prototype.get=function hashGet(key){var data=this.__data__;if(nativeCreate){var result=data[key];return result===HASH_UNDEFINED?undefined:result}return hasOwnProperty.call(data,key)?data[key]:undefined},Hash.prototype.has=function hashHas(key){var data=this.__data__;return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key)},Hash.prototype.set=function hashSet(key,value){var data=this.__data__;return this.size+=this.has(key)?0:1,data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value,this},ListCache.prototype.clear=function listCacheClear(){this.__data__=[],this.size=0},ListCache.prototype.delete=function listCacheDelete(key){var data=this.__data__,index=assocIndexOf(data,key);return!(index<0)&&(index==data.length-1?data.pop():splice.call(data,index,1),--this.size,!0)},ListCache.prototype.get=function listCacheGet(key){var data=this.__data__,index=assocIndexOf(data,key);return index<0?undefined:data[index][1]},ListCache.prototype.has=function listCacheHas(key){return assocIndexOf(this.__data__,key)>-1},ListCache.prototype.set=function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);return index<0?(++this.size,data.push([key,value])):data[index][1]=value,this},MapCache.prototype.clear=function mapCacheClear(){this.size=0,this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}},MapCache.prototype.delete=function mapCacheDelete(key){var result=getMapData(this,key).delete(key);return this.size-=result?1:0,result},MapCache.prototype.get=function mapCacheGet(key){return getMapData(this,key).get(key)},MapCache.prototype.has=function mapCacheHas(key){return getMapData(this,key).has(key)},MapCache.prototype.set=function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;return data.set(key,value),this.size+=data.size==size?0:1,this},SetCache.prototype.add=SetCache.prototype.push=function setCacheAdd(value){return this.__data__.set(value,HASH_UNDEFINED),this},SetCache.prototype.has=function setCacheHas(value){return this.__data__.has(value)},Stack.prototype.clear=function stackClear(){this.__data__=new ListCache,this.size=0},Stack.prototype.delete=function stackDelete(key){var data=this.__data__,result=data.delete(key);return this.size=data.size,result},Stack.prototype.get=function stackGet(key){return this.__data__.get(key)},Stack.prototype.has=function stackHas(key){return this.__data__.has(key)},Stack.prototype.set=function stackSet(key,value){var data=this.__data__;if(data instanceof ListCache){var pairs=data.__data__;if(!Map||pairs.length<LARGE_ARRAY_SIZE-1)return pairs.push([key,value]),this.size=++data.size,this;data=this.__data__=new MapCache(pairs)}return data.set(key,value),this.size=data.size,this};var baseEach=createBaseEach(baseForOwn),baseEachRight=createBaseEach(baseForOwnRight,!0);function baseEvery(collection,predicate){var result=!0;return baseEach(collection,function(value,index,collection){return result=!!predicate(value,index,collection)}),result}function baseExtremum(array,iteratee,comparator){for(var index=-1,length=array.length;++index<length;){var value=array[index],current=iteratee(value);if(null!=current&&(computed===undefined?current==current&&!isSymbol(current):comparator(current,computed)))var computed=current,result=value}return result}function baseFilter(collection,predicate){var result=[];return baseEach(collection,function(value,index,collection){predicate(value,index,collection)&&result.push(value)}),result}function baseFlatten(array,depth,predicate,isStrict,result){var index=-1,length=array.length;for(predicate||(predicate=isFlattenable),result||(result=[]);++index<length;){var value=array[index];depth>0&&predicate(value)?depth>1?baseFlatten(value,depth-1,predicate,isStrict,result):arrayPush(result,value):isStrict||(result[result.length]=value)}return result}var baseFor=createBaseFor(),baseForRight=createBaseFor(!0);function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys)}function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys)}function baseFunctions(object,props){return arrayFilter(props,function(key){return isFunction(object[key])})}function baseGet(object,path){for(var index=0,length=(path=castPath(path,object)).length;null!=object&&index<length;)object=object[toKey(path[index++])];return index&&index==length?object:undefined}function baseGetAllKeys(object,keysFunc,symbolsFunc){var result=keysFunc(object);return isArray(object)?result:arrayPush(result,symbolsFunc(object))}function baseGetTag(value){return null==value?value===undefined?undefinedTag:nullTag:symToStringTag&&symToStringTag in Object(value)?function getRawTag(value){var isOwn=hasOwnProperty.call(value,symToStringTag),tag=value[symToStringTag];try{value[symToStringTag]=undefined;var unmasked=!0}catch(e){}var result=nativeObjectToString.call(value);unmasked&&(isOwn?value[symToStringTag]=tag:delete value[symToStringTag]);return result}(value):function objectToString(value){return nativeObjectToString.call(value)}(value)}function baseGt(value,other){return value>other}function baseHas(object,key){return null!=object&&hasOwnProperty.call(object,key)}function baseHasIn(object,key){return null!=object&&key in Object(object)}function baseIntersection(arrays,iteratee,comparator){for(var includes=comparator?arrayIncludesWith:arrayIncludes,length=arrays[0].length,othLength=arrays.length,othIndex=othLength,caches=Array(othLength),maxLength=1/0,result=[];othIndex--;){var array=arrays[othIndex];othIndex&&iteratee&&(array=arrayMap(array,baseUnary(iteratee))),maxLength=nativeMin(array.length,maxLength),caches[othIndex]=!comparator&&(iteratee||length>=120&&array.length>=120)?new SetCache(othIndex&&array):undefined}array=arrays[0];var index=-1,seen=caches[0];outer:for(;++index<length&&result.length<maxLength;){var value=array[index],computed=iteratee?iteratee(value):value;if(value=comparator||0!==value?value:0,!(seen?cacheHas(seen,computed):includes(result,computed,comparator))){for(othIndex=othLength;--othIndex;){var cache=caches[othIndex];if(!(cache?cacheHas(cache,computed):includes(arrays[othIndex],computed,comparator)))continue outer}seen&&seen.push(computed),result.push(value)}}return result}function baseInvoke(object,path,args){var func=null==(object=parent(object,path=castPath(path,object)))?object:object[toKey(last(path))];return null==func?undefined:apply(func,object,args)}function baseIsArguments(value){return isObjectLike(value)&&baseGetTag(value)==argsTag}function baseIsEqual(value,other,bitmask,customizer,stack){return value===other||(null==value||null==other||!isObjectLike(value)&&!isObjectLike(other)?value!=value&&other!=other:function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray(object),othIsArr=isArray(other),objTag=objIsArr?arrayTag:getTag(object),othTag=othIsArr?arrayTag:getTag(other),objIsObj=(objTag=objTag==argsTag?objectTag:objTag)==objectTag,othIsObj=(othTag=othTag==argsTag?objectTag:othTag)==objectTag,isSameTag=objTag==othTag;if(isSameTag&&isBuffer(object)){if(!isBuffer(other))return!1;objIsArr=!0,objIsObj=!1}if(isSameTag&&!objIsObj)return stack||(stack=new Stack),objIsArr||isTypedArray(object)?equalArrays(object,other,bitmask,customizer,equalFunc,stack):function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){switch(tag){case dataViewTag:if(object.byteLength!=other.byteLength||object.byteOffset!=other.byteOffset)return!1;object=object.buffer,other=other.buffer;case arrayBufferTag:return!(object.byteLength!=other.byteLength||!equalFunc(new Uint8Array(object),new Uint8Array(other)));case boolTag:case dateTag:case numberTag:return eq(+object,+other);case errorTag:return object.name==other.name&&object.message==other.message;case regexpTag:case stringTag:return object==other+"";case mapTag:var convert=mapToArray;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG;if(convert||(convert=setToArray),object.size!=other.size&&!isPartial)return!1;var stacked=stack.get(object);if(stacked)return stacked==other;bitmask|=COMPARE_UNORDERED_FLAG,stack.set(object,other);var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);return stack.delete(object),result;case symbolTag:if(symbolValueOf)return symbolValueOf.call(object)==symbolValueOf.call(other)}return!1}(object,other,objTag,bitmask,customizer,equalFunc,stack);if(!(bitmask&COMPARE_PARTIAL_FLAG)){var objIsWrapped=objIsObj&&hasOwnProperty.call(object,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object.value():object,othUnwrapped=othIsWrapped?other.value():other;return stack||(stack=new Stack),equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}if(!isSameTag)return!1;return stack||(stack=new Stack),function equalObjects(object,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,objProps=getAllKeys(object),objLength=objProps.length,othLength=getAllKeys(other).length;if(objLength!=othLength&&!isPartial)return!1;var index=objLength;for(;index--;){var key=objProps[index];if(!(isPartial?key in other:hasOwnProperty.call(other,key)))return!1}var stacked=stack.get(object);if(stacked&&stack.get(other))return stacked==other;var result=!0;stack.set(object,other),stack.set(other,object);var skipCtor=isPartial;for(;++index<objLength;){key=objProps[index];var objValue=object[key],othValue=other[key];if(customizer)var compared=isPartial?customizer(othValue,objValue,key,other,object,stack):customizer(objValue,othValue,key,object,other,stack);if(!(compared===undefined?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result=!1;break}skipCtor||(skipCtor="constructor"==key)}if(result&&!skipCtor){var objCtor=object.constructor,othCtor=other.constructor;objCtor!=othCtor&&"constructor"in object&&"constructor"in other&&!("function"==typeof objCtor&&objCtor instanceof objCtor&&"function"==typeof othCtor&&othCtor instanceof othCtor)&&(result=!1)}return stack.delete(object),stack.delete(other),result}(object,other,bitmask,customizer,equalFunc,stack)}(value,other,bitmask,customizer,baseIsEqual,stack))}function baseIsMatch(object,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(null==object)return!length;for(object=Object(object);index--;){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object[data[0]]:!(data[0]in object))return!1}for(;++index<length;){var key=(data=matchData[index])[0],objValue=object[key],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===undefined&&!(key in object))return!1}else{var stack=new Stack;if(customizer)var result=customizer(objValue,srcValue,key,object,source,stack);if(!(result===undefined?baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG,customizer,stack):result))return!1}}return!0}function baseIsNative(value){return!(!isObject(value)||function isMasked(func){return!!maskSrcKey&&maskSrcKey in func}(value))&&(isFunction(value)?reIsNative:reIsHostCtor).test(toSource(value))}function baseIteratee(value){return"function"==typeof value?value:null==value?identity:"object"==typeof value?isArray(value)?baseMatchesProperty(value[0],value[1]):baseMatches(value):property(value)}function baseKeys(object){if(!isPrototype(object))return nativeKeys(object);var result=[];for(var key in Object(object))hasOwnProperty.call(object,key)&&"constructor"!=key&&result.push(key);return result}function baseKeysIn(object){if(!isObject(object))return function nativeKeysIn(object){var result=[];if(null!=object)for(var key in Object(object))result.push(key);return result}(object);var isProto=isPrototype(object),result=[];for(var key in object)("constructor"!=key||!isProto&&hasOwnProperty.call(object,key))&&result.push(key);return result}function baseLt(value,other){return value<other}function baseMap(collection,iteratee){var index=-1,result=isArrayLike(collection)?Array(collection.length):[];return baseEach(collection,function(value,key,collection){result[++index]=iteratee(value,key,collection)}),result}function baseMatches(source){var matchData=getMatchData(source);return 1==matchData.length&&matchData[0][2]?matchesStrictComparable(matchData[0][0],matchData[0][1]):function(object){return object===source||baseIsMatch(object,source,matchData)}}function baseMatchesProperty(path,srcValue){return isKey(path)&&isStrictComparable(srcValue)?matchesStrictComparable(toKey(path),srcValue):function(object){var objValue=get(object,path);return objValue===undefined&&objValue===srcValue?hasIn(object,path):baseIsEqual(srcValue,objValue,COMPARE_PARTIAL_FLAG|COMPARE_UNORDERED_FLAG)}}function baseMerge(object,source,srcIndex,customizer,stack){object!==source&&baseFor(source,function(srcValue,key){if(stack||(stack=new Stack),isObject(srcValue))!function baseMergeDeep(object,source,key,srcIndex,mergeFunc,customizer,stack){var objValue=safeGet(object,key),srcValue=safeGet(source,key),stacked=stack.get(srcValue);if(stacked)return void assignMergeValue(object,key,stacked);var newValue=customizer?customizer(objValue,srcValue,key+"",object,source,stack):undefined,isCommon=newValue===undefined;if(isCommon){var isArr=isArray(srcValue),isBuff=!isArr&&isBuffer(srcValue),isTyped=!isArr&&!isBuff&&isTypedArray(srcValue);newValue=srcValue,isArr||isBuff||isTyped?isArray(objValue)?newValue=objValue:isArrayLikeObject(objValue)?newValue=copyArray(objValue):isBuff?(isCommon=!1,newValue=cloneBuffer(srcValue,!0)):isTyped?(isCommon=!1,newValue=cloneTypedArray(srcValue,!0)):newValue=[]:isPlainObject(srcValue)||isArguments(srcValue)?(newValue=objValue,isArguments(objValue)?newValue=toPlainObject(objValue):isObject(objValue)&&!isFunction(objValue)||(newValue=initCloneObject(srcValue))):isCommon=!1}isCommon&&(stack.set(srcValue,newValue),mergeFunc(newValue,srcValue,srcIndex,customizer,stack),stack.delete(srcValue));assignMergeValue(object,key,newValue)}(object,source,key,srcIndex,baseMerge,customizer,stack);else{var newValue=customizer?customizer(safeGet(object,key),srcValue,key+"",object,source,stack):undefined;newValue===undefined&&(newValue=srcValue),assignMergeValue(object,key,newValue)}},keysIn)}function baseNth(array,n){var length=array.length;if(length)return isIndex(n+=n<0?length:0,length)?array[n]:undefined}function baseOrderBy(collection,iteratees,orders){var index=-1;return iteratees=arrayMap(iteratees.length?iteratees:[identity],baseUnary(getIteratee())),function baseSortBy(array,comparer){var length=array.length;for(array.sort(comparer);length--;)array[length]=array[length].value;return array}(baseMap(collection,function(value,key,collection){return{criteria:arrayMap(iteratees,function(iteratee){return iteratee(value)}),index:++index,value:value}}),function(object,other){return function compareMultiple(object,other,orders){var index=-1,objCriteria=object.criteria,othCriteria=other.criteria,length=objCriteria.length,ordersLength=orders.length;for(;++index<length;){var result=compareAscending(objCriteria[index],othCriteria[index]);if(result){if(index>=ordersLength)return result;var order=orders[index];return result*("desc"==order?-1:1)}}return object.index-other.index}(object,other,orders)})}function basePickBy(object,paths,predicate){for(var index=-1,length=paths.length,result={};++index<length;){var path=paths[index],value=baseGet(object,path);predicate(value,path)&&baseSet(result,castPath(path,object),value)}return result}function basePullAll(array,values,iteratee,comparator){var indexOf=comparator?baseIndexOfWith:baseIndexOf,index=-1,length=values.length,seen=array;for(array===values&&(values=copyArray(values)),iteratee&&(seen=arrayMap(array,baseUnary(iteratee)));++index<length;)for(var fromIndex=0,value=values[index],computed=iteratee?iteratee(value):value;(fromIndex=indexOf(seen,computed,fromIndex,comparator))>-1;)seen!==array&&splice.call(seen,fromIndex,1),splice.call(array,fromIndex,1);return array}function basePullAt(array,indexes){for(var length=array?indexes.length:0,lastIndex=length-1;length--;){var index=indexes[length];if(length==lastIndex||index!==previous){var previous=index;isIndex(index)?splice.call(array,index,1):baseUnset(array,index)}}return array}function baseRandom(lower,upper){return lower+nativeFloor(nativeRandom()*(upper-lower+1))}function baseRepeat(string,n){var result="";if(!string||n<1||n>MAX_SAFE_INTEGER)return result;do{n%2&&(result+=string),(n=nativeFloor(n/2))&&(string+=string)}while(n);return result}function baseRest(func,start){return setToString(overRest(func,start,identity),func+"")}function baseSample(collection){return arraySample(values(collection))}function baseSampleSize(collection,n){var array=values(collection);return shuffleSelf(array,baseClamp(n,0,array.length))}function baseSet(object,path,value,customizer){if(!isObject(object))return object;for(var index=-1,length=(path=castPath(path,object)).length,lastIndex=length-1,nested=object;null!=nested&&++index<length;){var key=toKey(path[index]),newValue=value;if(index!=lastIndex){var objValue=nested[key];(newValue=customizer?customizer(objValue,key,nested):undefined)===undefined&&(newValue=isObject(objValue)?objValue:isIndex(path[index+1])?[]:{})}assignValue(nested,key,newValue),nested=nested[key]}return object}var baseSetData=metaMap?function(func,data){return metaMap.set(func,data),func}:identity,baseSetToString=defineProperty?function(func,string){return defineProperty(func,"toString",{configurable:!0,enumerable:!1,value:constant(string),writable:!0})}:identity;function baseShuffle(collection){return shuffleSelf(values(collection))}function baseSlice(array,start,end){var index=-1,length=array.length;start<0&&(start=-start>length?0:length+start),(end=end>length?length:end)<0&&(end+=length),length=start>end?0:end-start>>>0,start>>>=0;for(var result=Array(length);++index<length;)result[index]=array[index+start];return result}function baseSome(collection,predicate){var result;return baseEach(collection,function(value,index,collection){return!(result=predicate(value,index,collection))}),!!result}function baseSortedIndex(array,value,retHighest){var low=0,high=null==array?low:array.length;if("number"==typeof value&&value==value&&high<=HALF_MAX_ARRAY_LENGTH){for(;low<high;){var mid=low+high>>>1,computed=array[mid];null!==computed&&!isSymbol(computed)&&(retHighest?computed<=value:computed<value)?low=mid+1:high=mid}return high}return baseSortedIndexBy(array,value,identity,retHighest)}function baseSortedIndexBy(array,value,iteratee,retHighest){value=iteratee(value);for(var low=0,high=null==array?0:array.length,valIsNaN=value!=value,valIsNull=null===value,valIsSymbol=isSymbol(value),valIsUndefined=value===undefined;low<high;){var mid=nativeFloor((low+high)/2),computed=iteratee(array[mid]),othIsDefined=computed!==undefined,othIsNull=null===computed,othIsReflexive=computed==computed,othIsSymbol=isSymbol(computed);if(valIsNaN)var setLow=retHighest||othIsReflexive;else setLow=valIsUndefined?othIsReflexive&&(retHighest||othIsDefined):valIsNull?othIsReflexive&&othIsDefined&&(retHighest||!othIsNull):valIsSymbol?othIsReflexive&&othIsDefined&&!othIsNull&&(retHighest||!othIsSymbol):!othIsNull&&!othIsSymbol&&(retHighest?computed<=value:computed<value);setLow?low=mid+1:high=mid}return nativeMin(high,MAX_ARRAY_INDEX)}function baseSortedUniq(array,iteratee){for(var index=-1,length=array.length,resIndex=0,result=[];++index<length;){var value=array[index],computed=iteratee?iteratee(value):value;if(!index||!eq(computed,seen)){var seen=computed;result[resIndex++]=0===value?0:value}}return result}function baseToNumber(value){return"number"==typeof value?value:isSymbol(value)?NAN:+value}function baseToString(value){if("string"==typeof value)return value;if(isArray(value))return arrayMap(value,baseToString)+"";if(isSymbol(value))return symbolToString?symbolToString.call(value):"";var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}function baseUniq(array,iteratee,comparator){var index=-1,includes=arrayIncludes,length=array.length,isCommon=!0,result=[],seen=result;if(comparator)isCommon=!1,includes=arrayIncludesWith;else if(length>=LARGE_ARRAY_SIZE){var set=iteratee?null:createSet(array);if(set)return setToArray(set);isCommon=!1,includes=cacheHas,seen=new SetCache}else seen=iteratee?[]:result;outer:for(;++index<length;){var value=array[index],computed=iteratee?iteratee(value):value;if(value=comparator||0!==value?value:0,isCommon&&computed==computed){for(var seenIndex=seen.length;seenIndex--;)if(seen[seenIndex]===computed)continue outer;iteratee&&seen.push(computed),result.push(value)}else includes(seen,computed,comparator)||(seen!==result&&seen.push(computed),result.push(value))}return result}function baseUnset(object,path){return null==(object=parent(object,path=castPath(path,object)))||delete object[toKey(last(path))]}function baseUpdate(object,path,updater,customizer){return baseSet(object,path,updater(baseGet(object,path)),customizer)}function baseWhile(array,predicate,isDrop,fromRight){for(var length=array.length,index=fromRight?length:-1;(fromRight?index--:++index<length)&&predicate(array[index],index,array););return isDrop?baseSlice(array,fromRight?0:index,fromRight?index+1:length):baseSlice(array,fromRight?index+1:0,fromRight?length:index)}function baseWrapperValue(value,actions){var result=value;return result instanceof LazyWrapper&&(result=result.value()),arrayReduce(actions,function(result,action){return action.func.apply(action.thisArg,arrayPush([result],action.args))},result)}function baseXor(arrays,iteratee,comparator){var length=arrays.length;if(length<2)return length?baseUniq(arrays[0]):[];for(var index=-1,result=Array(length);++index<length;)for(var array=arrays[index],othIndex=-1;++othIndex<length;)othIndex!=index&&(result[index]=baseDifference(result[index]||array,arrays[othIndex],iteratee,comparator));return baseUniq(baseFlatten(result,1),iteratee,comparator)}function baseZipObject(props,values,assignFunc){for(var index=-1,length=props.length,valsLength=values.length,result={};++index<length;){var value=index<valsLength?values[index]:undefined;assignFunc(result,props[index],value)}return result}function castArrayLikeObject(value){return isArrayLikeObject(value)?value:[]}function castFunction(value){return"function"==typeof value?value:identity}function castPath(value,object){return isArray(value)?value:isKey(value,object)?[value]:stringToPath(toString(value))}var castRest=baseRest;function castSlice(array,start,end){var length=array.length;return end=end===undefined?length:end,!start&&end>=length?array:baseSlice(array,start,end)}var clearTimeout=ctxClearTimeout||function(id){return root.clearTimeout(id)};function cloneBuffer(buffer,isDeep){if(isDeep)return buffer.slice();var length=buffer.length,result=allocUnsafe?allocUnsafe(length):new buffer.constructor(length);return buffer.copy(result),result}function cloneArrayBuffer(arrayBuffer){var result=new arrayBuffer.constructor(arrayBuffer.byteLength);return new Uint8Array(result).set(new Uint8Array(arrayBuffer)),result}function cloneTypedArray(typedArray,isDeep){var buffer=isDeep?cloneArrayBuffer(typedArray.buffer):typedArray.buffer;return new typedArray.constructor(buffer,typedArray.byteOffset,typedArray.length)}function compareAscending(value,other){if(value!==other){var valIsDefined=value!==undefined,valIsNull=null===value,valIsReflexive=value==value,valIsSymbol=isSymbol(value),othIsDefined=other!==undefined,othIsNull=null===other,othIsReflexive=other==other,othIsSymbol=isSymbol(other);if(!othIsNull&&!othIsSymbol&&!valIsSymbol&&value>other||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive)return 1;if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value<other||othIsSymbol&&valIsDefined&&valIsReflexive&&!valIsNull&&!valIsSymbol||othIsNull&&valIsDefined&&valIsReflexive||!othIsDefined&&valIsReflexive||!othIsReflexive)return-1}return 0}function composeArgs(args,partials,holders,isCurried){for(var argsIndex=-1,argsLength=args.length,holdersLength=holders.length,leftIndex=-1,leftLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(leftLength+rangeLength),isUncurried=!isCurried;++leftIndex<leftLength;)result[leftIndex]=partials[leftIndex];for(;++argsIndex<holdersLength;)(isUncurried||argsIndex<argsLength)&&(result[holders[argsIndex]]=args[argsIndex]);for(;rangeLength--;)result[leftIndex++]=args[argsIndex++];return result}function composeArgsRight(args,partials,holders,isCurried){for(var argsIndex=-1,argsLength=args.length,holdersIndex=-1,holdersLength=holders.length,rightIndex=-1,rightLength=partials.length,rangeLength=nativeMax(argsLength-holdersLength,0),result=Array(rangeLength+rightLength),isUncurried=!isCurried;++argsIndex<rangeLength;)result[argsIndex]=args[argsIndex];for(var offset=argsIndex;++rightIndex<rightLength;)result[offset+rightIndex]=partials[rightIndex];for(;++holdersIndex<holdersLength;)(isUncurried||argsIndex<argsLength)&&(result[offset+holders[holdersIndex]]=args[argsIndex++]);return result}function copyArray(source,array){var index=-1,length=source.length;for(array||(array=Array(length));++index<length;)array[index]=source[index];return array}function copyObject(source,props,object,customizer){var isNew=!object;object||(object={});for(var index=-1,length=props.length;++index<length;){var key=props[index],newValue=customizer?customizer(object[key],source[key],key,object,source):undefined;newValue===undefined&&(newValue=source[key]),isNew?baseAssignValue(object,key,newValue):assignValue(object,key,newValue)}return object}function createAggregator(setter,initializer){return function(collection,iteratee){var func=isArray(collection)?arrayAggregator:baseAggregator,accumulator=initializer?initializer():{};return func(collection,setter,getIteratee(iteratee,2),accumulator)}}function createAssigner(assigner){return baseRest(function(object,sources){var index=-1,length=sources.length,customizer=length>1?sources[length-1]:undefined,guard=length>2?sources[2]:undefined;for(customizer=assigner.length>3&&"function"==typeof customizer?(length--,customizer):undefined,guard&&isIterateeCall(sources[0],sources[1],guard)&&(customizer=length<3?undefined:customizer,length=1),object=Object(object);++index<length;){var source=sources[index];source&&assigner(object,source,index,customizer)}return object})}function createBaseEach(eachFunc,fromRight){return function(collection,iteratee){if(null==collection)return collection;if(!isArrayLike(collection))return eachFunc(collection,iteratee);for(var length=collection.length,index=fromRight?length:-1,iterable=Object(collection);(fromRight?index--:++index<length)&&!1!==iteratee(iterable[index],index,iterable););return collection}}function createBaseFor(fromRight){return function(object,iteratee,keysFunc){for(var index=-1,iterable=Object(object),props=keysFunc(object),length=props.length;length--;){var key=props[fromRight?length:++index];Iif(!1===iteratee(iterable[key],key,iterable))break}return object}}function createCaseFirst(methodName){return function(string){var strSymbols=hasUnicode(string=toString(string))?stringToArray(string):undefined,chr=strSymbols?strSymbols[0]:string.charAt(0),trailing=strSymbols?castSlice(strSymbols,1).join(""):string.slice(1);return chr[methodName]()+trailing}}function createCompounder(callback){return function(string){return arrayReduce(words(deburr(string).replace(reApos,"")),callback,"")}}function createCtor(Ctor){return function(){var args=arguments;switch(args.length){case 0:return new Ctor;case 1:return new Ctor(args[0]);case 2:return new Ctor(args[0],args[1]);case 3:return new Ctor(args[0],args[1],args[2]);case 4:return new Ctor(args[0],args[1],args[2],args[3]);case 5:return new Ctor(args[0],args[1],args[2],args[3],args[4]);case 6:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5]);case 7:return new Ctor(args[0],args[1],args[2],args[3],args[4],args[5],args[6])}var thisBinding=baseCreate(Ctor.prototype),result=Ctor.apply(thisBinding,args);return isObject(result)?result:thisBinding}}function createFind(findIndexFunc){return function(collection,predicate,fromIndex){var iterable=Object(collection);if(!isArrayLike(collection)){var iteratee=getIteratee(predicate,3);collection=keys(collection),predicate=function(key){return iteratee(iterable[key],key,iterable)}}var index=findIndexFunc(collection,predicate,fromIndex);return index>-1?iterable[iteratee?collection[index]:index]:undefined}}function createFlow(fromRight){return flatRest(function(funcs){var length=funcs.length,index=length,prereq=LodashWrapper.prototype.thru;for(fromRight&&funcs.reverse();index--;){var func=funcs[index];if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);if(prereq&&!wrapper&&"wrapper"==getFuncName(func))var wrapper=new LodashWrapper([],!0)}for(index=wrapper?index:length;++index<length;){var funcName=getFuncName(func=funcs[index]),data="wrapper"==funcName?getData(func):undefined;wrapper=data&&isLaziable(data[0])&&data[1]==(WRAP_ARY_FLAG|WRAP_CURRY_FLAG|WRAP_PARTIAL_FLAG|WRAP_REARG_FLAG)&&!data[4].length&&1==data[9]?wrapper[getFuncName(data[0])].apply(wrapper,data[3]):1==func.length&&isLaziable(func)?wrapper[funcName]():wrapper.thru(func)}return function(){var args=arguments,value=args[0];if(wrapper&&1==args.length&&isArray(value))return wrapper.plant(value).value();for(var index=0,result=length?funcs[index].apply(this,args):value;++index<length;)result=funcs[index].call(this,result);return result}})}function createHybrid(func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity){var isAry=bitmask&WRAP_ARY_FLAG,isBind=bitmask&WRAP_BIND_FLAG,isBindKey=bitmask&WRAP_BIND_KEY_FLAG,isCurried=bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG),isFlip=bitmask&WRAP_FLIP_FLAG,Ctor=isBindKey?undefined:createCtor(func);return function wrapper(){for(var length=arguments.length,args=Array(length),index=length;index--;)args[index]=arguments[index];if(isCurried)var placeholder=getHolder(wrapper),holdersCount=function countHolders(array,placeholder){for(var length=array.length,result=0;length--;)array[length]===placeholder&&++result;return result}(args,placeholder);if(partials&&(args=composeArgs(args,partials,holders,isCurried)),partialsRight&&(args=composeArgsRight(args,partialsRight,holdersRight,isCurried)),length-=holdersCount,isCurried&&length<arity){var newHolders=replaceHolders(args,placeholder);return createRecurry(func,bitmask,createHybrid,wrapper.placeholder,thisArg,args,newHolders,argPos,ary,arity-length)}var thisBinding=isBind?thisArg:this,fn=isBindKey?thisBinding[func]:func;return length=args.length,argPos?args=function reorder(array,indexes){for(var arrLength=array.length,length=nativeMin(indexes.length,arrLength),oldArray=copyArray(array);length--;){var index=indexes[length];array[length]=isIndex(index,arrLength)?oldArray[index]:undefined}return array}(args,argPos):isFlip&&length>1&&args.reverse(),isAry&&ary<length&&(args.length=ary),this&&this!==root&&this instanceof wrapper&&(fn=Ctor||createCtor(fn)),fn.apply(thisBinding,args)}}function createInverter(setter,toIteratee){return function(object,iteratee){return function baseInverter(object,setter,iteratee,accumulator){return baseForOwn(object,function(value,key,object){setter(accumulator,iteratee(value),key,object)}),accumulator}(object,setter,toIteratee(iteratee),{})}}function createMathOperation(operator,defaultValue){return function(value,other){var result;if(value===undefined&&other===undefined)return defaultValue;if(value!==undefined&&(result=value),other!==undefined){if(result===undefined)return other;"string"==typeof value||"string"==typeof other?(value=baseToString(value),other=baseToString(other)):(value=baseToNumber(value),other=baseToNumber(other)),result=operator(value,other)}return result}}function createOver(arrayFunc){return flatRest(function(iteratees){return iteratees=arrayMap(iteratees,baseUnary(getIteratee())),baseRest(function(args){var thisArg=this;return arrayFunc(iteratees,function(iteratee){return apply(iteratee,thisArg,args)})})})}function createPadding(length,chars){var charsLength=(chars=chars===undefined?" ":baseToString(chars)).length;if(charsLength<2)return charsLength?baseRepeat(chars,length):chars;var result=baseRepeat(chars,nativeCeil(length/stringSize(chars)));return hasUnicode(chars)?castSlice(stringToArray(result),0,length).join(""):result.slice(0,length)}function createRange(fromRight){return function(start,end,step){return step&&"number"!=typeof step&&isIterateeCall(start,end,step)&&(end=step=undefined),start=toFinite(start),end===undefined?(end=start,start=0):end=toFinite(end),function baseRange(start,end,step,fromRight){for(var index=-1,length=nativeMax(nativeCeil((end-start)/(step||1)),0),result=Array(length);length--;)result[fromRight?length:++index]=start,start+=step;return result}(start,end,step=step===undefined?start<end?1:-1:toFinite(step),fromRight)}}function createRelationalOperation(operator){return function(value,other){return"string"==typeof value&&"string"==typeof other||(value=toNumber(value),other=toNumber(other)),operator(value,other)}}function createRecurry(func,bitmask,wrapFunc,placeholder,thisArg,partials,holders,argPos,ary,arity){var isCurry=bitmask&WRAP_CURRY_FLAG;bitmask|=isCurry?WRAP_PARTIAL_FLAG:WRAP_PARTIAL_RIGHT_FLAG,(bitmask&=~(isCurry?WRAP_PARTIAL_RIGHT_FLAG:WRAP_PARTIAL_FLAG))&WRAP_CURRY_BOUND_FLAG||(bitmask&=~(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG));var newData=[func,bitmask,thisArg,isCurry?partials:undefined,isCurry?holders:undefined,isCurry?undefined:partials,isCurry?undefined:holders,argPos,ary,arity],result=wrapFunc.apply(undefined,newData);return isLaziable(func)&&setData(result,newData),result.placeholder=placeholder,setWrapToString(result,func,bitmask)}function createRound(methodName){var func=Math[methodName];return function(number,precision){if(number=toNumber(number),(precision=null==precision?0:nativeMin(toInteger(precision),292))&&nativeIsFinite(number)){var pair=(toString(number)+"e").split("e");return+((pair=(toString(func(pair[0]+"e"+(+pair[1]+precision)))+"e").split("e"))[0]+"e"+(+pair[1]-precision))}return func(number)}}var createSet=Set&&1/setToArray(new Set([,-0]))[1]==INFINITY?function(values){return new Set(values)}:noop;function createToPairs(keysFunc){return function(object){var tag=getTag(object);return tag==mapTag?mapToArray(object):tag==setTag?setToPairs(object):function baseToPairs(object,props){return arrayMap(props,function(key){return[key,object[key]]})}(object,keysFunc(object))}}function createWrap(func,bitmask,thisArg,partials,holders,argPos,ary,arity){var isBindKey=bitmask&WRAP_BIND_KEY_FLAG;if(!isBindKey&&"function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);var length=partials?partials.length:0;if(length||(bitmask&=~(WRAP_PARTIAL_FLAG|WRAP_PARTIAL_RIGHT_FLAG),partials=holders=undefined),ary=ary===undefined?ary:nativeMax(toInteger(ary),0),arity=arity===undefined?arity:toInteger(arity),length-=holders?holders.length:0,bitmask&WRAP_PARTIAL_RIGHT_FLAG){var partialsRight=partials,holdersRight=holders;partials=holders=undefined}var data=isBindKey?undefined:getData(func),newData=[func,bitmask,thisArg,partials,holders,partialsRight,holdersRight,argPos,ary,arity];if(data&&function mergeData(data,source){var bitmask=data[1],srcBitmask=source[1],newBitmask=bitmask|srcBitmask,isCommon=newBitmask<(WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG|WRAP_ARY_FLAG),isCombo=srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_CURRY_FLAG||srcBitmask==WRAP_ARY_FLAG&&bitmask==WRAP_REARG_FLAG&&data[7].length<=source[8]||srcBitmask==(WRAP_ARY_FLAG|WRAP_REARG_FLAG)&&source[7].length<=source[8]&&bitmask==WRAP_CURRY_FLAG;if(!isCommon&&!isCombo)return data;srcBitmask&WRAP_BIND_FLAG&&(data[2]=source[2],newBitmask|=bitmask&WRAP_BIND_FLAG?0:WRAP_CURRY_BOUND_FLAG);var value=source[3];if(value){var partials=data[3];data[3]=partials?composeArgs(partials,value,source[4]):value,data[4]=partials?replaceHolders(data[3],PLACEHOLDER):source[4]}(value=source[5])&&(partials=data[5],data[5]=partials?composeArgsRight(partials,value,source[6]):value,data[6]=partials?replaceHolders(data[5],PLACEHOLDER):source[6]);(value=source[7])&&(data[7]=value);srcBitmask&WRAP_ARY_FLAG&&(data[8]=null==data[8]?source[8]:nativeMin(data[8],source[8]));null==data[9]&&(data[9]=source[9]);return data[0]=source[0],data[1]=newBitmask,data}(newData,data),func=newData[0],bitmask=newData[1],thisArg=newData[2],partials=newData[3],holders=newData[4],!(arity=newData[9]=newData[9]===undefined?isBindKey?0:func.length:nativeMax(newData[9]-length,0))&&bitmask&(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG)&&(bitmask&=~(WRAP_CURRY_FLAG|WRAP_CURRY_RIGHT_FLAG)),bitmask&&bitmask!=WRAP_BIND_FLAG)result=bitmask==WRAP_CURRY_FLAG||bitmask==WRAP_CURRY_RIGHT_FLAG?function createCurry(func,bitmask,arity){var Ctor=createCtor(func);return function wrapper(){for(var length=arguments.length,args=Array(length),index=length,placeholder=getHolder(wrapper);index--;)args[index]=arguments[index];var holders=length<3&&args[0]!==placeholder&&args[length-1]!==placeholder?[]:replaceHolders(args,placeholder);return(length-=holders.length)<arity?createRecurry(func,bitmask,createHybrid,wrapper.placeholder,undefined,args,holders,undefined,undefined,arity-length):apply(this&&this!==root&&this instanceof wrapper?Ctor:func,this,args)}}(func,bitmask,arity):bitmask!=WRAP_PARTIAL_FLAG&&bitmask!=(WRAP_BIND_FLAG|WRAP_PARTIAL_FLAG)||holders.length?createHybrid.apply(undefined,newData):function createPartial(func,bitmask,thisArg,partials){var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);return function wrapper(){for(var argsIndex=-1,argsLength=arguments.length,leftIndex=-1,leftLength=partials.length,args=Array(leftLength+argsLength),fn=this&&this!==root&&this instanceof wrapper?Ctor:func;++leftIndex<leftLength;)args[leftIndex]=partials[leftIndex];for(;argsLength--;)args[leftIndex++]=arguments[++argsIndex];return apply(fn,isBind?thisArg:this,args)}}(func,bitmask,thisArg,partials);else var result=function createBind(func,bitmask,thisArg){var isBind=bitmask&WRAP_BIND_FLAG,Ctor=createCtor(func);return function wrapper(){return(this&&this!==root&&this instanceof wrapper?Ctor:func).apply(isBind?thisArg:this,arguments)}}(func,bitmask,thisArg);return setWrapToString((data?baseSetData:setData)(result,newData),func,bitmask)}function customDefaultsAssignIn(objValue,srcValue,key,object){return objValue===undefined||eq(objValue,objectProto[key])&&!hasOwnProperty.call(object,key)?srcValue:objValue}function customDefaultsMerge(objValue,srcValue,key,object,source,stack){return isObject(objValue)&&isObject(srcValue)&&(stack.set(srcValue,objValue),baseMerge(objValue,srcValue,undefined,customDefaultsMerge,stack),stack.delete(srcValue)),objValue}function customOmitClone(value){return isPlainObject(value)?undefined:value}function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength))return!1;var stacked=stack.get(array);if(stacked&&stack.get(other))return stacked==other;var index=-1,result=!0,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:undefined;for(stack.set(array,other),stack.set(other,array);++index<arrLength;){var arrValue=array[index],othValue=other[index];if(customizer)var compared=isPartial?customizer(othValue,arrValue,index,other,array,stack):customizer(arrValue,othValue,index,array,other,stack);if(compared!==undefined){if(compared)continue;result=!1;break}if(seen){if(!arraySome(other,function(othValue,othIndex){if(!cacheHas(seen,othIndex)&&(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack)))return seen.push(othIndex)})){result=!1;break}}else if(arrValue!==othValue&&!equalFunc(arrValue,othValue,bitmask,customizer,stack)){result=!1;break}}return stack.delete(array),stack.delete(other),result}function flatRest(func){return setToString(overRest(func,undefined,flatten),func+"")}function getAllKeys(object){return baseGetAllKeys(object,keys,getSymbols)}function getAllKeysIn(object){return baseGetAllKeys(object,keysIn,getSymbolsIn)}var getData=metaMap?function(func){return metaMap.get(func)}:noop;function getFuncName(func){for(var result=func.name+"",array=realNames[result],length=hasOwnProperty.call(realNames,result)?array.length:0;length--;){var data=array[length],otherFunc=data.func;if(null==otherFunc||otherFunc==func)return data.name}return result}function getHolder(func){return(hasOwnProperty.call(lodash,"placeholder")?lodash:func).placeholder}function getIteratee(){var result=lodash.iteratee||iteratee;return result=result===iteratee?baseIteratee:result,arguments.length?result(arguments[0],arguments[1]):result}function getMapData(map,key){var data=map.__data__;return function isKeyable(value){var type=typeof value;return"string"==type||"number"==type||"symbol"==type||"boolean"==type?"__proto__"!==value:null===value}(key)?data["string"==typeof key?"string":"hash"]:data.map}function getMatchData(object){for(var result=keys(object),length=result.length;length--;){var key=result[length],value=object[key];result[length]=[key,value,isStrictComparable(value)]}return result}function getNative(object,key){var value=function getValue(object,key){return null==object?undefined:object[key]}(object,key);return baseIsNative(value)?value:undefined}var getSymbols=nativeGetSymbols?function(object){return null==object?[]:(object=Object(object),arrayFilter(nativeGetSymbols(object),function(symbol){return propertyIsEnumerable.call(object,symbol)}))}:stubArray,getSymbolsIn=nativeGetSymbols?function(object){for(var result=[];object;)arrayPush(result,getSymbols(object)),object=getPrototype(object);return result}:stubArray,getTag=baseGetTag;function hasPath(object,path,hasFunc){for(var index=-1,length=(path=castPath(path,object)).length,result=!1;++index<length;){var key=toKey(path[index]);if(!(result=null!=object&&hasFunc(object,key)))break;object=object[key]}return result||++index!=length?result:!!(length=null==object?0:object.length)&&isLength(length)&&isIndex(key,length)&&(isArray(object)||isArguments(object))}function initCloneObject(object){return"function"!=typeof object.constructor||isPrototype(object)?{}:baseCreate(getPrototype(object))}function isFlattenable(value){return isArray(value)||isArguments(value)||!!(spreadableSymbol&&value&&value[spreadableSymbol])}function isIndex(value,length){var type=typeof value;return!!(length=null==length?MAX_SAFE_INTEGER:length)&&("number"==type||"symbol"!=type&&reIsUint.test(value))&&value>-1&&value%1==0&&value<length}function isIterateeCall(value,index,object){if(!isObject(object))return!1;var type=typeof index;return!!("number"==type?isArrayLike(object)&&isIndex(index,object.length):"string"==type&&index in object)&&eq(object[index],value)}function isKey(value,object){if(isArray(value))return!1;var type=typeof value;return!("number"!=type&&"symbol"!=type&&"boolean"!=type&&null!=value&&!isSymbol(value))||(reIsPlainProp.test(value)||!reIsDeepProp.test(value)||null!=object&&value in Object(object))}function isLaziable(func){var funcName=getFuncName(func),other=lodash[funcName];if("function"!=typeof other||!(funcName in LazyWrapper.prototype))return!1;if(func===other)return!0;var data=getData(other);return!!data&&func===data[0]}(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||Map&&getTag(new Map)!=mapTag||Promise&&"[object Promise]"!=getTag(Promise.resolve())||Set&&getTag(new Set)!=setTag||WeakMap&&getTag(new WeakMap)!=weakMapTag)&&(getTag=function(value){var result=baseGetTag(value),Ctor=result==objectTag?value.constructor:undefined,ctorString=Ctor?toSource(Ctor):"";if(ctorString)switch(ctorString){case dataViewCtorString:return dataViewTag;case mapCtorString:return mapTag;case promiseCtorString:return"[object Promise]";case setCtorString:return setTag;case weakMapCtorString:return weakMapTag}return result});var isMaskable=coreJsData?isFunction:stubFalse;function isPrototype(value){var Ctor=value&&value.constructor;return value===("function"==typeof Ctor&&Ctor.prototype||objectProto)}function isStrictComparable(value){return value==value&&!isObject(value)}function matchesStrictComparable(key,srcValue){return function(object){return null!=object&&(object[key]===srcValue&&(srcValue!==undefined||key in Object(object)))}}function overRest(func,start,transform){return start=nativeMax(start===undefined?func.length-1:start,0),function(){for(var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);++index<length;)array[index]=args[start+index];index=-1;for(var otherArgs=Array(start+1);++index<start;)otherArgs[index]=args[index];return otherArgs[start]=transform(array),apply(func,this,otherArgs)}}function parent(object,path){return path.length<2?object:baseGet(object,baseSlice(path,0,-1))}function safeGet(object,key){if(("constructor"!==key||"function"!=typeof object[key])&&"__proto__"!=key)return object[key]}var setData=shortOut(baseSetData),setTimeout=ctxSetTimeout||function(func,wait){return root.setTimeout(func,wait)},setToString=shortOut(baseSetToString);function setWrapToString(wrapper,reference,bitmask){var source=reference+"";return setToString(wrapper,function insertWrapDetails(source,details){var length=details.length;if(!length)return source;var lastIndex=length-1;return details[lastIndex]=(length>1?"& ":"")+details[lastIndex],details=details.join(length>2?", ":" "),source.replace(reWrapComment,"{\n/* [wrapped with "+details+"] */\n")}(source,function updateWrapDetails(details,bitmask){return arrayEach(wrapFlags,function(pair){var value="_."+pair[0];bitmask&pair[1]&&!arrayIncludes(details,value)&&details.push(value)}),details.sort()}(function getWrapDetails(source){var match=source.match(reWrapDetails);return match?match[1].split(reSplitDetails):[]}(source),bitmask)))}function shortOut(func){var count=0,lastCalled=0;return function(){var stamp=nativeNow(),remaining=HOT_SPAN-(stamp-lastCalled);if(lastCalled=stamp,remaining>0){Iif(++count>=HOT_COUNT)return arguments[0]}else count=0;return func.apply(undefined,arguments)}}function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;for(size=size===undefined?length:size;++index<size;){var rand=baseRandom(index,lastIndex),value=array[rand];array[rand]=array[index],array[index]=value}return array.length=size,array}var stringToPath=function memoizeCapped(func){var result=memoize(func,function(key){return cache.size===MAX_MEMOIZE_SIZE&&cache.clear(),key}),cache=result.cache;return result}(function(string){var result=[];return 46===string.charCodeAt(0)&&result.push(""),string.replace(rePropName,function(match,number,quote,subString){result.push(quote?subString.replace(reEscapeChar,"$1"):number||match)}),result});function toKey(value){if("string"==typeof value||isSymbol(value))return value;var result=value+"";return"0"==result&&1/value==-INFINITY?"-0":result}function toSource(func){Eif(null!=func){try{return funcToString.call(func)}catch(e){}try{return func+""}catch(e){}}return""}function wrapperClone(wrapper){if(wrapper instanceof LazyWrapper)return wrapper.clone();var result=new LodashWrapper(wrapper.__wrapped__,wrapper.__chain__);return result.__actions__=copyArray(wrapper.__actions__),result.__index__=wrapper.__index__,result.__values__=wrapper.__values__,result}var difference=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0)):[]}),differenceBy=baseRest(function(array,values){var iteratee=last(values);return isArrayLikeObject(iteratee)&&(iteratee=undefined),isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0),getIteratee(iteratee,2)):[]}),differenceWith=baseRest(function(array,values){var comparator=last(values);return isArrayLikeObject(comparator)&&(comparator=undefined),isArrayLikeObject(array)?baseDifference(array,baseFlatten(values,1,isArrayLikeObject,!0),undefined,comparator):[]});function findIndex(array,predicate,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=null==fromIndex?0:toInteger(fromIndex);return index<0&&(index=nativeMax(length+index,0)),baseFindIndex(array,getIteratee(predicate,3),index)}function findLastIndex(array,predicate,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=length-1;return fromIndex!==undefined&&(index=toInteger(fromIndex),index=fromIndex<0?nativeMax(length+index,0):nativeMin(index,length-1)),baseFindIndex(array,getIteratee(predicate,3),index,!0)}function flatten(array){return(null==array?0:array.length)?baseFlatten(array,1):[]}function head(array){return array&&array.length?array[0]:undefined}var intersection=baseRest(function(arrays){var mapped=arrayMap(arrays,castArrayLikeObject);return mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped):[]}),intersectionBy=baseRest(function(arrays){var iteratee=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);return iteratee===last(mapped)?iteratee=undefined:mapped.pop(),mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,getIteratee(iteratee,2)):[]}),intersectionWith=baseRest(function(arrays){var comparator=last(arrays),mapped=arrayMap(arrays,castArrayLikeObject);return(comparator="function"==typeof comparator?comparator:undefined)&&mapped.pop(),mapped.length&&mapped[0]===arrays[0]?baseIntersection(mapped,undefined,comparator):[]});function last(array){var length=null==array?0:array.length;return length?array[length-1]:undefined}var pull=baseRest(pullAll);function pullAll(array,values){return array&&array.length&&values&&values.length?basePullAll(array,values):array}var pullAt=flatRest(function(array,indexes){var length=null==array?0:array.length,result=baseAt(array,indexes);return basePullAt(array,arrayMap(indexes,function(index){return isIndex(index,length)?+index:index}).sort(compareAscending)),result});function reverse(array){return null==array?array:nativeReverse.call(array)}var union=baseRest(function(arrays){return baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0))}),unionBy=baseRest(function(arrays){var iteratee=last(arrays);return isArrayLikeObject(iteratee)&&(iteratee=undefined),baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0),getIteratee(iteratee,2))}),unionWith=baseRest(function(arrays){var comparator=last(arrays);return comparator="function"==typeof comparator?comparator:undefined,baseUniq(baseFlatten(arrays,1,isArrayLikeObject,!0),undefined,comparator)});function unzip(array){if(!array||!array.length)return[];var length=0;return array=arrayFilter(array,function(group){if(isArrayLikeObject(group))return length=nativeMax(group.length,length),!0}),baseTimes(length,function(index){return arrayMap(array,baseProperty(index))})}function unzipWith(array,iteratee){if(!array||!array.length)return[];var result=unzip(array);return null==iteratee?result:arrayMap(result,function(group){return apply(iteratee,undefined,group)})}var without=baseRest(function(array,values){return isArrayLikeObject(array)?baseDifference(array,values):[]}),xor=baseRest(function(arrays){return baseXor(arrayFilter(arrays,isArrayLikeObject))}),xorBy=baseRest(function(arrays){var iteratee=last(arrays);return isArrayLikeObject(iteratee)&&(iteratee=undefined),baseXor(arrayFilter(arrays,isArrayLikeObject),getIteratee(iteratee,2))}),xorWith=baseRest(function(arrays){var comparator=last(arrays);return comparator="function"==typeof comparator?comparator:undefined,baseXor(arrayFilter(arrays,isArrayLikeObject),undefined,comparator)}),zip=baseRest(unzip);var zipWith=baseRest(function(arrays){var length=arrays.length,iteratee=length>1?arrays[length-1]:undefined;return iteratee="function"==typeof iteratee?(arrays.pop(),iteratee):undefined,unzipWith(arrays,iteratee)});function chain(value){var result=lodash(value);return result.__chain__=!0,result}function thru(value,interceptor){return interceptor(value)}var wrapperAt=flatRest(function(paths){var length=paths.length,start=length?paths[0]:0,value=this.__wrapped__,interceptor=function(object){return baseAt(object,paths)};return!(length>1||this.__actions__.length)&&value instanceof LazyWrapper&&isIndex(start)?((value=value.slice(start,+start+(length?1:0))).__actions__.push({func:thru,args:[interceptor],thisArg:undefined}),new LodashWrapper(value,this.__chain__).thru(function(array){return length&&!array.length&&array.push(undefined),array})):this.thru(interceptor)});var countBy=createAggregator(function(result,value,key){hasOwnProperty.call(result,key)?++result[key]:baseAssignValue(result,key,1)});var find=createFind(findIndex),findLast=createFind(findLastIndex);function forEach(collection,iteratee){return(isArray(collection)?arrayEach:baseEach)(collection,getIteratee(iteratee,3))}function forEachRight(collection,iteratee){return(isArray(collection)?arrayEachRight:baseEachRight)(collection,getIteratee(iteratee,3))}var groupBy=createAggregator(function(result,value,key){hasOwnProperty.call(result,key)?result[key].push(value):baseAssignValue(result,key,[value])});var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc="function"==typeof path,result=isArrayLike(collection)?Array(collection.length):[];return baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args)}),result}),keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value)});function map(collection,iteratee){return(isArray(collection)?arrayMap:baseMap)(collection,getIteratee(iteratee,3))}var partition=createAggregator(function(result,value,key){result[key?0:1].push(value)},function(){return[[],[]]});var sortBy=baseRest(function(collection,iteratees){if(null==collection)return[];var length=iteratees.length;return length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])?iteratees=[]:length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])&&(iteratees=[iteratees[0]]),baseOrderBy(collection,baseFlatten(iteratees,1),[])}),now=ctxNow||function(){return root.Date.now()};function ary(func,n,guard){return n=guard?undefined:n,n=func&&null==n?func.length:n,createWrap(func,WRAP_ARY_FLAG,undefined,undefined,undefined,undefined,n)}function before(n,func){var result;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return n=toInteger(n),function(){return--n>0&&(result=func.apply(this,arguments)),n<=1&&(func=undefined),result}}var bind=baseRest(function(func,thisArg,partials){var bitmask=WRAP_BIND_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bind));bitmask|=WRAP_PARTIAL_FLAG}return createWrap(func,bitmask,thisArg,partials,holders)}),bindKey=baseRest(function(object,key,partials){var bitmask=WRAP_BIND_FLAG|WRAP_BIND_KEY_FLAG;if(partials.length){var holders=replaceHolders(partials,getHolder(bindKey));bitmask|=WRAP_PARTIAL_FLAG}return createWrap(key,bitmask,object,partials,holders)});function debounce(func,wait,options){var lastArgs,lastThis,maxWait,result,timerId,lastCallTime,lastInvokeTime=0,leading=!1,maxing=!1,trailing=!0;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);function invokeFunc(time){var args=lastArgs,thisArg=lastThis;return lastArgs=lastThis=undefined,lastInvokeTime=time,result=func.apply(thisArg,args)}function shouldInvoke(time){var timeSinceLastCall=time-lastCallTime;return lastCallTime===undefined||timeSinceLastCall>=wait||timeSinceLastCall<0||maxing&&time-lastInvokeTime>=maxWait}function timerExpired(){var time=now();if(shouldInvoke(time))return trailingEdge(time);timerId=setTimeout(timerExpired,function remainingWait(time){var timeWaiting=wait-(time-lastCallTime);return maxing?nativeMin(timeWaiting,maxWait-(time-lastInvokeTime)):timeWaiting}(time))}function trailingEdge(time){return timerId=undefined,trailing&&lastArgs?invokeFunc(time):(lastArgs=lastThis=undefined,result)}function debounced(){var time=now(),isInvoking=shouldInvoke(time);if(lastArgs=arguments,lastThis=this,lastCallTime=time,isInvoking){if(timerId===undefined)return function leadingEdge(time){return lastInvokeTime=time,timerId=setTimeout(timerExpired,wait),leading?invokeFunc(time):result}(lastCallTime);if(maxing)return clearTimeout(timerId),timerId=setTimeout(timerExpired,wait),invokeFunc(lastCallTime)}return timerId===undefined&&(timerId=setTimeout(timerExpired,wait)),result}return wait=toNumber(wait)||0,isObject(options)&&(leading=!!options.leading,maxWait=(maxing="maxWait"in options)?nativeMax(toNumber(options.maxWait)||0,wait):maxWait,trailing="trailing"in options?!!options.trailing:trailing),debounced.cancel=function cancel(){timerId!==undefined&&clearTimeout(timerId),lastInvokeTime=0,lastArgs=lastCallTime=lastThis=timerId=undefined},debounced.flush=function flush(){return timerId===undefined?result:trailingEdge(now())},debounced}var defer=baseRest(function(func,args){return baseDelay(func,1,args)}),delay=baseRest(function(func,wait,args){return baseDelay(func,toNumber(wait)||0,args)});function memoize(func,resolver){Iif("function"!=typeof func||null!=resolver&&"function"!=typeof resolver)throw new TypeError(FUNC_ERROR_TEXT);var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key))return cache.get(key);var result=func.apply(this,args);return memoized.cache=cache.set(key,result)||cache,result};return memoized.cache=new(memoize.Cache||MapCache),memoized}function negate(predicate){if("function"!=typeof predicate)throw new TypeError(FUNC_ERROR_TEXT);return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2])}return!predicate.apply(this,args)}}memoize.Cache=MapCache;var overArgs=castRest(function(func,transforms){var funcsLength=(transforms=1==transforms.length&&isArray(transforms[0])?arrayMap(transforms[0],baseUnary(getIteratee())):arrayMap(baseFlatten(transforms,1),baseUnary(getIteratee()))).length;return baseRest(function(args){for(var index=-1,length=nativeMin(args.length,funcsLength);++index<length;)args[index]=transforms[index].call(this,args[index]);return apply(func,this,args)})}),partial=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partial));return createWrap(func,WRAP_PARTIAL_FLAG,undefined,partials,holders)}),partialRight=baseRest(function(func,partials){var holders=replaceHolders(partials,getHolder(partialRight));return createWrap(func,WRAP_PARTIAL_RIGHT_FLAG,undefined,partials,holders)}),rearg=flatRest(function(func,indexes){return createWrap(func,WRAP_REARG_FLAG,undefined,undefined,undefined,indexes)});function eq(value,other){return value===other||value!=value&&other!=other}var gt=createRelationalOperation(baseGt),gte=createRelationalOperation(function(value,other){return value>=other}),isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")},isArray=Array.isArray,isArrayBuffer=nodeIsArrayBuffer?baseUnary(nodeIsArrayBuffer):function baseIsArrayBuffer(value){return isObjectLike(value)&&baseGetTag(value)==arrayBufferTag};function isArrayLike(value){return null!=value&&isLength(value.length)&&!isFunction(value)}function isArrayLikeObject(value){return isObjectLike(value)&&isArrayLike(value)}var isBuffer=nativeIsBuffer||stubFalse,isDate=nodeIsDate?baseUnary(nodeIsDate):function baseIsDate(value){return isObjectLike(value)&&baseGetTag(value)==dateTag};function isError(value){if(!isObjectLike(value))return!1;var tag=baseGetTag(value);return tag==errorTag||tag==domExcTag||"string"==typeof value.message&&"string"==typeof value.name&&!isPlainObject(value)}function isFunction(value){Iif(!isObject(value))return!1;var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}function isInteger(value){return"number"==typeof value&&value==toInteger(value)}function isLength(value){return"number"==typeof value&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}function isObject(value){var type=typeof value;return null!=value&&("object"==type||"function"==type)}function isObjectLike(value){return null!=value&&"object"==typeof value}var isMap=nodeIsMap?baseUnary(nodeIsMap):function baseIsMap(value){return isObjectLike(value)&&getTag(value)==mapTag};function isNumber(value){return"number"==typeof value||isObjectLike(value)&&baseGetTag(value)==numberTag}function isPlainObject(value){if(!isObjectLike(value)||baseGetTag(value)!=objectTag)return!1;var proto=getPrototype(value);if(null===proto)return!0;var Ctor=hasOwnProperty.call(proto,"constructor")&&proto.constructor;return"function"==typeof Ctor&&Ctor instanceof Ctor&&funcToString.call(Ctor)==objectCtorString}var isRegExp=nodeIsRegExp?baseUnary(nodeIsRegExp):function baseIsRegExp(value){return isObjectLike(value)&&baseGetTag(value)==regexpTag};var isSet=nodeIsSet?baseUnary(nodeIsSet):function baseIsSet(value){return isObjectLike(value)&&getTag(value)==setTag};function isString(value){return"string"==typeof value||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag}function isSymbol(value){return"symbol"==typeof value||isObjectLike(value)&&baseGetTag(value)==symbolTag}var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):function baseIsTypedArray(value){return isObjectLike(value)&&isLength(value.length)&&!!typedArrayTags[baseGetTag(value)]};var lt=createRelationalOperation(baseLt),lte=createRelationalOperation(function(value,other){return value<=other});function toArray(value){if(!value)return[];if(isArrayLike(value))return isString(value)?stringToArray(value):copyArray(value);if(symIterator&&value[symIterator])return function iteratorToArray(iterator){for(var data,result=[];!(data=iterator.next()).done;)result.push(data.value);return result}(value[symIterator]());var tag=getTag(value);return(tag==mapTag?mapToArray:tag==setTag?setToArray:values)(value)}function toFinite(value){return value?(value=toNumber(value))===INFINITY||value===-INFINITY?(value<0?-1:1)*MAX_INTEGER:value==value?value:0:0===value?value:0}function toInteger(value){var result=toFinite(value),remainder=result%1;return result==result?remainder?result-remainder:result:0}function toLength(value){return value?baseClamp(toInteger(value),0,MAX_ARRAY_LENGTH):0}function toNumber(value){if("number"==typeof value)return value;if(isSymbol(value))return NAN;if(isObject(value)){var other="function"==typeof value.valueOf?value.valueOf():value;value=isObject(other)?other+"":other}if("string"!=typeof value)return 0===value?value:+value;value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}function toPlainObject(value){return copyObject(value,keysIn(value))}function toString(value){return null==value?"":baseToString(value)}var assign=createAssigner(function(object,source){if(isPrototype(source)||isArrayLike(source))copyObject(source,keys(source),object);else for(var key in source)hasOwnProperty.call(source,key)&&assignValue(object,key,source[key])}),assignIn=createAssigner(function(object,source){copyObject(source,keysIn(source),object)}),assignInWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keysIn(source),object,customizer)}),assignWith=createAssigner(function(object,source,srcIndex,customizer){copyObject(source,keys(source),object,customizer)}),at=flatRest(baseAt);var defaults=baseRest(function(object,sources){object=Object(object);var index=-1,length=sources.length,guard=length>2?sources[2]:undefined;for(guard&&isIterateeCall(sources[0],sources[1],guard)&&(length=1);++index<length;)for(var source=sources[index],props=keysIn(source),propsIndex=-1,propsLength=props.length;++propsIndex<propsLength;){var key=props[propsIndex],value=object[key];(value===undefined||eq(value,objectProto[key])&&!hasOwnProperty.call(object,key))&&(object[key]=source[key])}return object}),defaultsDeep=baseRest(function(args){return args.push(undefined,customDefaultsMerge),apply(mergeWith,undefined,args)});function get(object,path,defaultValue){var result=null==object?undefined:baseGet(object,path);return result===undefined?defaultValue:result}function hasIn(object,path){return null!=object&&hasPath(object,path,baseHasIn)}var invert=createInverter(function(result,value,key){null!=value&&"function"!=typeof value.toString&&(value=nativeObjectToString.call(value)),result[value]=key},constant(identity)),invertBy=createInverter(function(result,value,key){null!=value&&"function"!=typeof value.toString&&(value=nativeObjectToString.call(value)),hasOwnProperty.call(result,value)?result[value].push(key):result[value]=[key]},getIteratee),invoke=baseRest(baseInvoke);function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}function keysIn(object){return isArrayLike(object)?arrayLikeKeys(object,!0):baseKeysIn(object)}var merge=createAssigner(function(object,source,srcIndex){baseMerge(object,source,srcIndex)}),mergeWith=createAssigner(function(object,source,srcIndex,customizer){baseMerge(object,source,srcIndex,customizer)}),omit=flatRest(function(object,paths){var result={};if(null==object)return result;var isDeep=!1;paths=arrayMap(paths,function(path){return path=castPath(path,object),isDeep||(isDeep=path.length>1),path}),copyObject(object,getAllKeysIn(object),result),isDeep&&(result=baseClone(result,CLONE_DEEP_FLAG|CLONE_FLAT_FLAG|CLONE_SYMBOLS_FLAG,customOmitClone));for(var length=paths.length;length--;)baseUnset(result,paths[length]);return result});var pick=flatRest(function(object,paths){return null==object?{}:function basePick(object,paths){return basePickBy(object,paths,function(value,path){return hasIn(object,path)})}(object,paths)});function pickBy(object,predicate){if(null==object)return{};var props=arrayMap(getAllKeysIn(object),function(prop){return[prop]});return predicate=getIteratee(predicate),basePickBy(object,props,function(value,path){return predicate(value,path[0])})}var toPairs=createToPairs(keys),toPairsIn=createToPairs(keysIn);function values(object){return null==object?[]:baseValues(object,keys(object))}var camelCase=createCompounder(function(result,word,index){return word=word.toLowerCase(),result+(index?capitalize(word):word)});function capitalize(string){return upperFirst(toString(string).toLowerCase())}function deburr(string){return(string=toString(string))&&string.replace(reLatin,deburrLetter).replace(reComboMark,"")}var kebabCase=createCompounder(function(result,word,index){return result+(index?"-":"")+word.toLowerCase()}),lowerCase=createCompounder(function(result,word,index){return result+(index?" ":"")+word.toLowerCase()}),lowerFirst=createCaseFirst("toLowerCase");var snakeCase=createCompounder(function(result,word,index){return result+(index?"_":"")+word.toLowerCase()});var startCase=createCompounder(function(result,word,index){return result+(index?" ":"")+upperFirst(word)});var upperCase=createCompounder(function(result,word,index){return result+(index?" ":"")+word.toUpperCase()}),upperFirst=createCaseFirst("toUpperCase");function words(string,pattern,guard){return string=toString(string),(pattern=guard?undefined:pattern)===undefined?function hasUnicodeWord(string){return reHasUnicodeWord.test(string)}(string)?function unicodeWords(string){return string.match(reUnicodeWord)||[]}(string):function asciiWords(string){return string.match(reAsciiWord)||[]}(string):string.match(pattern)||[]}var attempt=baseRest(function(func,args){try{return apply(func,undefined,args)}catch(e){return isError(e)?e:new Error(e)}}),bindAll=flatRest(function(object,methodNames){return arrayEach(methodNames,function(key){key=toKey(key),baseAssignValue(object,key,bind(object[key],object))}),object});function constant(value){return function(){return value}}var flow=createFlow(),flowRight=createFlow(!0);function identity(value){return value}function iteratee(func){return baseIteratee("function"==typeof func?func:baseClone(func,CLONE_DEEP_FLAG))}var method=baseRest(function(path,args){return function(object){return baseInvoke(object,path,args)}}),methodOf=baseRest(function(object,args){return function(path){return baseInvoke(object,path,args)}});function mixin(object,source,options){var props=keys(source),methodNames=baseFunctions(source,props);null!=options||isObject(source)&&(methodNames.length||!props.length)||(options=source,source=object,object=this,methodNames=baseFunctions(source,keys(source)));var chain=!(isObject(options)&&"chain"in options&&!options.chain),isFunc=isFunction(object);return arrayEach(methodNames,function(methodName){var func=source[methodName];object[methodName]=func,isFunc&&(object.prototype[methodName]=function(){var chainAll=this.__chain__;if(chain||chainAll){var result=object(this.__wrapped__),actions=result.__actions__=copyArray(this.__actions__);return actions.push({func:func,args:arguments,thisArg:object}),result.__chain__=chainAll,result}return func.apply(object,arrayPush([this.value()],arguments))})}),object}function noop(){}var over=createOver(arrayMap),overEvery=createOver(arrayEvery),overSome=createOver(arraySome);function property(path){return isKey(path)?baseProperty(toKey(path)):function basePropertyDeep(path){return function(object){return baseGet(object,path)}}(path)}var range=createRange(),rangeRight=createRange(!0);function stubArray(){return[]}function stubFalse(){return!1}var add=createMathOperation(function(augend,addend){return augend+addend},0),ceil=createRound("ceil"),divide=createMathOperation(function(dividend,divisor){return dividend/divisor},1),floor=createRound("floor");var source,multiply=createMathOperation(function(multiplier,multiplicand){return multiplier*multiplicand},1),round=createRound("round"),subtract=createMathOperation(function(minuend,subtrahend){return minuend-subtrahend},0);return lodash.after=function after(n,func){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return n=toInteger(n),function(){if(--n<1)return func.apply(this,arguments)}},lodash.ary=ary,lodash.assign=assign,lodash.assignIn=assignIn,lodash.assignInWith=assignInWith,lodash.assignWith=assignWith,lodash.at=at,lodash.before=before,lodash.bind=bind,lodash.bindAll=bindAll,lodash.bindKey=bindKey,lodash.castArray=function castArray(){if(!arguments.length)return[];var value=arguments[0];return isArray(value)?value:[value]},lodash.chain=chain,lodash.chunk=function chunk(array,size,guard){size=(guard?isIterateeCall(array,size,guard):size===undefined)?1:nativeMax(toInteger(size),0);var length=null==array?0:array.length;if(!length||size<1)return[];for(var index=0,resIndex=0,result=Array(nativeCeil(length/size));index<length;)result[resIndex++]=baseSlice(array,index,index+=size);return result},lodash.compact=function compact(array){for(var index=-1,length=null==array?0:array.length,resIndex=0,result=[];++index<length;){var value=array[index];value&&(result[resIndex++]=value)}return result},lodash.concat=function concat(){var length=arguments.length;if(!length)return[];for(var args=Array(length-1),array=arguments[0],index=length;index--;)args[index-1]=arguments[index];return arrayPush(isArray(array)?copyArray(array):[array],baseFlatten(args,1))},lodash.cond=function cond(pairs){var length=null==pairs?0:pairs.length,toIteratee=getIteratee();return pairs=length?arrayMap(pairs,function(pair){if("function"!=typeof pair[1])throw new TypeError(FUNC_ERROR_TEXT);return[toIteratee(pair[0]),pair[1]]}):[],baseRest(function(args){for(var index=-1;++index<length;){var pair=pairs[index];if(apply(pair[0],this,args))return apply(pair[1],this,args)}})},lodash.conforms=function conforms(source){return function baseConforms(source){var props=keys(source);return function(object){return baseConformsTo(object,source,props)}}(baseClone(source,CLONE_DEEP_FLAG))},lodash.constant=constant,lodash.countBy=countBy,lodash.create=function create(prototype,properties){var result=baseCreate(prototype);return null==properties?result:baseAssign(result,properties)},lodash.curry=function curry(func,arity,guard){var result=createWrap(func,WRAP_CURRY_FLAG,undefined,undefined,undefined,undefined,undefined,arity=guard?undefined:arity);return result.placeholder=curry.placeholder,result},lodash.curryRight=function curryRight(func,arity,guard){var result=createWrap(func,WRAP_CURRY_RIGHT_FLAG,undefined,undefined,undefined,undefined,undefined,arity=guard?undefined:arity);return result.placeholder=curryRight.placeholder,result},lodash.debounce=debounce,lodash.defaults=defaults,lodash.defaultsDeep=defaultsDeep,lodash.defer=defer,lodash.delay=delay,lodash.difference=difference,lodash.differenceBy=differenceBy,lodash.differenceWith=differenceWith,lodash.drop=function drop(array,n,guard){var length=null==array?0:array.length;return length?baseSlice(array,(n=guard||n===undefined?1:toInteger(n))<0?0:n,length):[]},lodash.dropRight=function dropRight(array,n,guard){var length=null==array?0:array.length;return length?baseSlice(array,0,(n=length-(n=guard||n===undefined?1:toInteger(n)))<0?0:n):[]},lodash.dropRightWhile=function dropRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!0,!0):[]},lodash.dropWhile=function dropWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!0):[]},lodash.fill=function fill(array,value,start,end){var length=null==array?0:array.length;return length?(start&&"number"!=typeof start&&isIterateeCall(array,value,start)&&(start=0,end=length),function baseFill(array,value,start,end){var length=array.length;for((start=toInteger(start))<0&&(start=-start>length?0:length+start),(end=end===undefined||end>length?length:toInteger(end))<0&&(end+=length),end=start>end?0:toLength(end);start<end;)array[start++]=value;return array}(array,value,start,end)):[]},lodash.filter=function filter(collection,predicate){return(isArray(collection)?arrayFilter:baseFilter)(collection,getIteratee(predicate,3))},lodash.flatMap=function flatMap(collection,iteratee){return baseFlatten(map(collection,iteratee),1)},lodash.flatMapDeep=function flatMapDeep(collection,iteratee){return baseFlatten(map(collection,iteratee),INFINITY)},lodash.flatMapDepth=function flatMapDepth(collection,iteratee,depth){return depth=depth===undefined?1:toInteger(depth),baseFlatten(map(collection,iteratee),depth)},lodash.flatten=flatten,lodash.flattenDeep=function flattenDeep(array){return(null==array?0:array.length)?baseFlatten(array,INFINITY):[]},lodash.flattenDepth=function flattenDepth(array,depth){return(null==array?0:array.length)?baseFlatten(array,depth=depth===undefined?1:toInteger(depth)):[]},lodash.flip=function flip(func){return createWrap(func,WRAP_FLIP_FLAG)},lodash.flow=flow,lodash.flowRight=flowRight,lodash.fromPairs=function fromPairs(pairs){for(var index=-1,length=null==pairs?0:pairs.length,result={};++index<length;){var pair=pairs[index];result[pair[0]]=pair[1]}return result},lodash.functions=function functions(object){return null==object?[]:baseFunctions(object,keys(object))},lodash.functionsIn=function functionsIn(object){return null==object?[]:baseFunctions(object,keysIn(object))},lodash.groupBy=groupBy,lodash.initial=function initial(array){return(null==array?0:array.length)?baseSlice(array,0,-1):[]},lodash.intersection=intersection,lodash.intersectionBy=intersectionBy,lodash.intersectionWith=intersectionWith,lodash.invert=invert,lodash.invertBy=invertBy,lodash.invokeMap=invokeMap,lodash.iteratee=iteratee,lodash.keyBy=keyBy,lodash.keys=keys,lodash.keysIn=keysIn,lodash.map=map,lodash.mapKeys=function mapKeys(object,iteratee){var result={};return iteratee=getIteratee(iteratee,3),baseForOwn(object,function(value,key,object){baseAssignValue(result,iteratee(value,key,object),value)}),result},lodash.mapValues=function mapValues(object,iteratee){var result={};return iteratee=getIteratee(iteratee,3),baseForOwn(object,function(value,key,object){baseAssignValue(result,key,iteratee(value,key,object))}),result},lodash.matches=function matches(source){return baseMatches(baseClone(source,CLONE_DEEP_FLAG))},lodash.matchesProperty=function matchesProperty(path,srcValue){return baseMatchesProperty(path,baseClone(srcValue,CLONE_DEEP_FLAG))},lodash.memoize=memoize,lodash.merge=merge,lodash.mergeWith=mergeWith,lodash.method=method,lodash.methodOf=methodOf,lodash.mixin=mixin,lodash.negate=negate,lodash.nthArg=function nthArg(n){return n=toInteger(n),baseRest(function(args){return baseNth(args,n)})},lodash.omit=omit,lodash.omitBy=function omitBy(object,predicate){return pickBy(object,negate(getIteratee(predicate)))},lodash.once=function once(func){return before(2,func)},lodash.orderBy=function orderBy(collection,iteratees,orders,guard){return null==collection?[]:(isArray(iteratees)||(iteratees=null==iteratees?[]:[iteratees]),isArray(orders=guard?undefined:orders)||(orders=null==orders?[]:[orders]),baseOrderBy(collection,iteratees,orders))},lodash.over=over,lodash.overArgs=overArgs,lodash.overEvery=overEvery,lodash.overSome=overSome,lodash.partial=partial,lodash.partialRight=partialRight,lodash.partition=partition,lodash.pick=pick,lodash.pickBy=pickBy,lodash.property=property,lodash.propertyOf=function propertyOf(object){return function(path){return null==object?undefined:baseGet(object,path)}},lodash.pull=pull,lodash.pullAll=pullAll,lodash.pullAllBy=function pullAllBy(array,values,iteratee){return array&&array.length&&values&&values.length?basePullAll(array,values,getIteratee(iteratee,2)):array},lodash.pullAllWith=function pullAllWith(array,values,comparator){return array&&array.length&&values&&values.length?basePullAll(array,values,undefined,comparator):array},lodash.pullAt=pullAt,lodash.range=range,lodash.rangeRight=rangeRight,lodash.rearg=rearg,lodash.reject=function reject(collection,predicate){return(isArray(collection)?arrayFilter:baseFilter)(collection,negate(getIteratee(predicate,3)))},lodash.remove=function remove(array,predicate){var result=[];if(!array||!array.length)return result;var index=-1,indexes=[],length=array.length;for(predicate=getIteratee(predicate,3);++index<length;){var value=array[index];predicate(value,index,array)&&(result.push(value),indexes.push(index))}return basePullAt(array,indexes),result},lodash.rest=function rest(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return baseRest(func,start=start===undefined?start:toInteger(start))},lodash.reverse=reverse,lodash.sampleSize=function sampleSize(collection,n,guard){return n=(guard?isIterateeCall(collection,n,guard):n===undefined)?1:toInteger(n),(isArray(collection)?arraySampleSize:baseSampleSize)(collection,n)},lodash.set=function set(object,path,value){return null==object?object:baseSet(object,path,value)},lodash.setWith=function setWith(object,path,value,customizer){return customizer="function"==typeof customizer?customizer:undefined,null==object?object:baseSet(object,path,value,customizer)},lodash.shuffle=function shuffle(collection){return(isArray(collection)?arrayShuffle:baseShuffle)(collection)},lodash.slice=function slice(array,start,end){var length=null==array?0:array.length;return length?(end&&"number"!=typeof end&&isIterateeCall(array,start,end)?(start=0,end=length):(start=null==start?0:toInteger(start),end=end===undefined?length:toInteger(end)),baseSlice(array,start,end)):[]},lodash.sortBy=sortBy,lodash.sortedUniq=function sortedUniq(array){return array&&array.length?baseSortedUniq(array):[]},lodash.sortedUniqBy=function sortedUniqBy(array,iteratee){return array&&array.length?baseSortedUniq(array,getIteratee(iteratee,2)):[]},lodash.split=function split(string,separator,limit){return limit&&"number"!=typeof limit&&isIterateeCall(string,separator,limit)&&(separator=limit=undefined),(limit=limit===undefined?MAX_ARRAY_LENGTH:limit>>>0)?(string=toString(string))&&("string"==typeof separator||null!=separator&&!isRegExp(separator))&&!(separator=baseToString(separator))&&hasUnicode(string)?castSlice(stringToArray(string),0,limit):string.split(separator,limit):[]},lodash.spread=function spread(func,start){if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return start=null==start?0:nativeMax(toInteger(start),0),baseRest(function(args){var array=args[start],otherArgs=castSlice(args,0,start);return array&&arrayPush(otherArgs,array),apply(func,this,otherArgs)})},lodash.tail=function tail(array){var length=null==array?0:array.length;return length?baseSlice(array,1,length):[]},lodash.take=function take(array,n,guard){return array&&array.length?baseSlice(array,0,(n=guard||n===undefined?1:toInteger(n))<0?0:n):[]},lodash.takeRight=function takeRight(array,n,guard){var length=null==array?0:array.length;return length?baseSlice(array,(n=length-(n=guard||n===undefined?1:toInteger(n)))<0?0:n,length):[]},lodash.takeRightWhile=function takeRightWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3),!1,!0):[]},lodash.takeWhile=function takeWhile(array,predicate){return array&&array.length?baseWhile(array,getIteratee(predicate,3)):[]},lodash.tap=function tap(value,interceptor){return interceptor(value),value},lodash.throttle=function throttle(func,wait,options){var leading=!0,trailing=!0;if("function"!=typeof func)throw new TypeError(FUNC_ERROR_TEXT);return isObject(options)&&(leading="leading"in options?!!options.leading:leading,trailing="trailing"in options?!!options.trailing:trailing),debounce(func,wait,{leading:leading,maxWait:wait,trailing:trailing})},lodash.thru=thru,lodash.toArray=toArray,lodash.toPairs=toPairs,lodash.toPairsIn=toPairsIn,lodash.toPath=function toPath(value){return isArray(value)?arrayMap(value,toKey):isSymbol(value)?[value]:copyArray(stringToPath(toString(value)))},lodash.toPlainObject=toPlainObject,lodash.transform=function transform(object,iteratee,accumulator){var isArr=isArray(object),isArrLike=isArr||isBuffer(object)||isTypedArray(object);if(iteratee=getIteratee(iteratee,4),null==accumulator){var Ctor=object&&object.constructor;accumulator=isArrLike?isArr?new Ctor:[]:isObject(object)&&isFunction(Ctor)?baseCreate(getPrototype(object)):{}}return(isArrLike?arrayEach:baseForOwn)(object,function(value,index,object){return iteratee(accumulator,value,index,object)}),accumulator},lodash.unary=function unary(func){return ary(func,1)},lodash.union=union,lodash.unionBy=unionBy,lodash.unionWith=unionWith,lodash.uniq=function uniq(array){return array&&array.length?baseUniq(array):[]},lodash.uniqBy=function uniqBy(array,iteratee){return array&&array.length?baseUniq(array,getIteratee(iteratee,2)):[]},lodash.uniqWith=function uniqWith(array,comparator){return comparator="function"==typeof comparator?comparator:undefined,array&&array.length?baseUniq(array,undefined,comparator):[]},lodash.unset=function unset(object,path){return null==object||baseUnset(object,path)},lodash.unzip=unzip,lodash.unzipWith=unzipWith,lodash.update=function update(object,path,updater){return null==object?object:baseUpdate(object,path,castFunction(updater))},lodash.updateWith=function updateWith(object,path,updater,customizer){return customizer="function"==typeof customizer?customizer:undefined,null==object?object:baseUpdate(object,path,castFunction(updater),customizer)},lodash.values=values,lodash.valuesIn=function valuesIn(object){return null==object?[]:baseValues(object,keysIn(object))},lodash.without=without,lodash.words=words,lodash.wrap=function wrap(value,wrapper){return partial(castFunction(wrapper),value)},lodash.xor=xor,lodash.xorBy=xorBy,lodash.xorWith=xorWith,lodash.zip=zip,lodash.zipObject=function zipObject(props,values){return baseZipObject(props||[],values||[],assignValue)},lodash.zipObjectDeep=function zipObjectDeep(props,values){return baseZipObject(props||[],values||[],baseSet)},lodash.zipWith=zipWith,lodash.entries=toPairs,lodash.entriesIn=toPairsIn,lodash.extend=assignIn,lodash.extendWith=assignInWith,mixin(lodash,lodash),lodash.add=add,lodash.attempt=attempt,lodash.camelCase=camelCase,lodash.capitalize=capitalize,lodash.ceil=ceil,lodash.clamp=function clamp(number,lower,upper){return upper===undefined&&(upper=lower,lower=undefined),upper!==undefined&&(upper=(upper=toNumber(upper))==upper?upper:0),lower!==undefined&&(lower=(lower=toNumber(lower))==lower?lower:0),baseClamp(toNumber(number),lower,upper)},lodash.clone=function clone(value){return baseClone(value,CLONE_SYMBOLS_FLAG)},lodash.cloneDeep=function cloneDeep(value){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG)},lodash.cloneDeepWith=function cloneDeepWith(value,customizer){return baseClone(value,CLONE_DEEP_FLAG|CLONE_SYMBOLS_FLAG,customizer="function"==typeof customizer?customizer:undefined)},lodash.cloneWith=function cloneWith(value,customizer){return baseClone(value,CLONE_SYMBOLS_FLAG,customizer="function"==typeof customizer?customizer:undefined)},lodash.conformsTo=function conformsTo(object,source){return null==source||baseConformsTo(object,source,keys(source))},lodash.deburr=deburr,lodash.defaultTo=function defaultTo(value,defaultValue){return null==value||value!=value?defaultValue:value},lodash.divide=divide,lodash.endsWith=function endsWith(string,target,position){string=toString(string),target=baseToString(target);var length=string.length,end=position=position===undefined?length:baseClamp(toInteger(position),0,length);return(position-=target.length)>=0&&string.slice(position,end)==target},lodash.eq=eq,lodash.escape=function escape(string){return(string=toString(string))&&reHasUnescapedHtml.test(string)?string.replace(reUnescapedHtml,escapeHtmlChar):string},lodash.escapeRegExp=function escapeRegExp(string){return(string=toString(string))&&reHasRegExpChar.test(string)?string.replace(reRegExpChar,"\\$&"):string},lodash.every=function every(collection,predicate,guard){var func=isArray(collection)?arrayEvery:baseEvery;return guard&&isIterateeCall(collection,predicate,guard)&&(predicate=undefined),func(collection,getIteratee(predicate,3))},lodash.find=find,lodash.findIndex=findIndex,lodash.findKey=function findKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwn)},lodash.findLast=findLast,lodash.findLastIndex=findLastIndex,lodash.findLastKey=function findLastKey(object,predicate){return baseFindKey(object,getIteratee(predicate,3),baseForOwnRight)},lodash.floor=floor,lodash.forEach=forEach,lodash.forEachRight=forEachRight,lodash.forIn=function forIn(object,iteratee){return null==object?object:baseFor(object,getIteratee(iteratee,3),keysIn)},lodash.forInRight=function forInRight(object,iteratee){return null==object?object:baseForRight(object,getIteratee(iteratee,3),keysIn)},lodash.forOwn=function forOwn(object,iteratee){return object&&baseForOwn(object,getIteratee(iteratee,3))},lodash.forOwnRight=function forOwnRight(object,iteratee){return object&&baseForOwnRight(object,getIteratee(iteratee,3))},lodash.get=get,lodash.gt=gt,lodash.gte=gte,lodash.has=function has(object,path){return null!=object&&hasPath(object,path,baseHas)},lodash.hasIn=hasIn,lodash.head=head,lodash.identity=identity,lodash.includes=function includes(collection,value,fromIndex,guard){collection=isArrayLike(collection)?collection:values(collection),fromIndex=fromIndex&&!guard?toInteger(fromIndex):0;var length=collection.length;return fromIndex<0&&(fromIndex=nativeMax(length+fromIndex,0)),isString(collection)?fromIndex<=length&&collection.indexOf(value,fromIndex)>-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1},lodash.indexOf=function indexOf(array,value,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=null==fromIndex?0:toInteger(fromIndex);return index<0&&(index=nativeMax(length+index,0)),baseIndexOf(array,value,index)},lodash.inRange=function inRange(number,start,end){return start=toFinite(start),end===undefined?(end=start,start=0):end=toFinite(end),function baseInRange(number,start,end){return number>=nativeMin(start,end)&&number<nativeMax(start,end)}(number=toNumber(number),start,end)},lodash.invoke=invoke,lodash.isArguments=isArguments,lodash.isArray=isArray,lodash.isArrayBuffer=isArrayBuffer,lodash.isArrayLike=isArrayLike,lodash.isArrayLikeObject=isArrayLikeObject,lodash.isBoolean=function isBoolean(value){return!0===value||!1===value||isObjectLike(value)&&baseGetTag(value)==boolTag},lodash.isBuffer=isBuffer,lodash.isDate=isDate,lodash.isElement=function isElement(value){return isObjectLike(value)&&1===value.nodeType&&!isPlainObject(value)},lodash.isEmpty=function isEmpty(value){if(null==value)return!0;if(isArrayLike(value)&&(isArray(value)||"string"==typeof value||"function"==typeof value.splice||isBuffer(value)||isTypedArray(value)||isArguments(value)))return!value.length;var tag=getTag(value);if(tag==mapTag||tag==setTag)return!value.size;if(isPrototype(value))return!baseKeys(value).length;for(var key in value)if(hasOwnProperty.call(value,key))return!1;return!0},lodash.isEqual=function isEqual(value,other){return baseIsEqual(value,other)},lodash.isEqualWith=function isEqualWith(value,other,customizer){var result=(customizer="function"==typeof customizer?customizer:undefined)?customizer(value,other):undefined;return result===undefined?baseIsEqual(value,other,undefined,customizer):!!result},lodash.isError=isError,lodash.isFinite=function isFinite(value){return"number"==typeof value&&nativeIsFinite(value)},lodash.isFunction=isFunction,lodash.isInteger=isInteger,lodash.isLength=isLength,lodash.isMap=isMap,lodash.isMatch=function isMatch(object,source){return object===source||baseIsMatch(object,source,getMatchData(source))},lodash.isMatchWith=function isMatchWith(object,source,customizer){return customizer="function"==typeof customizer?customizer:undefined,baseIsMatch(object,source,getMatchData(source),customizer)},lodash.isNaN=function isNaN(value){return isNumber(value)&&value!=+value},lodash.isNative=function isNative(value){if(isMaskable(value))throw new Error(CORE_ERROR_TEXT);return baseIsNative(value)},lodash.isNil=function isNil(value){return null==value},lodash.isNull=function isNull(value){return null===value},lodash.isNumber=isNumber,lodash.isObject=isObject,lodash.isObjectLike=isObjectLike,lodash.isPlainObject=isPlainObject,lodash.isRegExp=isRegExp,lodash.isSafeInteger=function isSafeInteger(value){return isInteger(value)&&value>=-MAX_SAFE_INTEGER&&value<=MAX_SAFE_INTEGER},lodash.isSet=isSet,lodash.isString=isString,lodash.isSymbol=isSymbol,lodash.isTypedArray=isTypedArray,lodash.isUndefined=function isUndefined(value){return value===undefined},lodash.isWeakMap=function isWeakMap(value){return isObjectLike(value)&&getTag(value)==weakMapTag},lodash.isWeakSet=function isWeakSet(value){return isObjectLike(value)&&baseGetTag(value)==weakSetTag},lodash.join=function join(array,separator){return null==array?"":nativeJoin.call(array,separator)},lodash.kebabCase=kebabCase,lodash.last=last,lodash.lastIndexOf=function lastIndexOf(array,value,fromIndex){var length=null==array?0:array.length;if(!length)return-1;var index=length;return fromIndex!==undefined&&(index=(index=toInteger(fromIndex))<0?nativeMax(length+index,0):nativeMin(index,length-1)),value==value?function strictLastIndexOf(array,value,fromIndex){for(var index=fromIndex+1;index--;)if(array[index]===value)return index;return index}(array,value,index):baseFindIndex(array,baseIsNaN,index,!0)},lodash.lowerCase=lowerCase,lodash.lowerFirst=lowerFirst,lodash.lt=lt,lodash.lte=lte,lodash.max=function max(array){return array&&array.length?baseExtremum(array,identity,baseGt):undefined},lodash.maxBy=function maxBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseGt):undefined},lodash.mean=function mean(array){return baseMean(array,identity)},lodash.meanBy=function meanBy(array,iteratee){return baseMean(array,getIteratee(iteratee,2))},lodash.min=function min(array){return array&&array.length?baseExtremum(array,identity,baseLt):undefined},lodash.minBy=function minBy(array,iteratee){return array&&array.length?baseExtremum(array,getIteratee(iteratee,2),baseLt):undefined},lodash.stubArray=stubArray,lodash.stubFalse=stubFalse,lodash.stubObject=function stubObject(){return{}},lodash.stubString=function stubString(){return""},lodash.stubTrue=function stubTrue(){return!0},lodash.multiply=multiply,lodash.nth=function nth(array,n){return array&&array.length?baseNth(array,toInteger(n)):undefined},lodash.noConflict=function noConflict(){return root._===this&&(root._=oldDash),this},lodash.noop=noop,lodash.now=now,lodash.pad=function pad(string,length,chars){string=toString(string);var strLength=(length=toInteger(length))?stringSize(string):0;if(!length||strLength>=length)return string;var mid=(length-strLength)/2;return createPadding(nativeFloor(mid),chars)+string+createPadding(nativeCeil(mid),chars)},lodash.padEnd=function padEnd(string,length,chars){string=toString(string);var strLength=(length=toInteger(length))?stringSize(string):0;return length&&strLength<length?string+createPadding(length-strLength,chars):string},lodash.padStart=function padStart(string,length,chars){string=toString(string);var strLength=(length=toInteger(length))?stringSize(string):0;return length&&strLength<length?createPadding(length-strLength,chars)+string:string},lodash.parseInt=function parseInt(string,radix,guard){return guard||null==radix?radix=0:radix&&(radix=+radix),nativeParseInt(toString(string).replace(reTrimStart,""),radix||0)},lodash.random=function random(lower,upper,floating){if(floating&&"boolean"!=typeof floating&&isIterateeCall(lower,upper,floating)&&(upper=floating=undefined),floating===undefined&&("boolean"==typeof upper?(floating=upper,upper=undefined):"boolean"==typeof lower&&(floating=lower,lower=undefined)),lower===undefined&&upper===undefined?(lower=0,upper=1):(lower=toFinite(lower),upper===undefined?(upper=lower,lower=0):upper=toFinite(upper)),lower>upper){var temp=lower;lower=upper,upper=temp}if(floating||lower%1||upper%1){var rand=nativeRandom();return nativeMin(lower+rand*(upper-lower+freeParseFloat("1e-"+((rand+"").length-1))),upper)}return baseRandom(lower,upper)},lodash.reduce=function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEach)},lodash.reduceRight=function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,getIteratee(iteratee,4),accumulator,initAccum,baseEachRight)},lodash.repeat=function repeat(string,n,guard){return n=(guard?isIterateeCall(string,n,guard):n===undefined)?1:toInteger(n),baseRepeat(toString(string),n)},lodash.replace=function replace(){var args=arguments,string=toString(args[0]);return args.length<3?string:string.replace(args[1],args[2])},lodash.result=function result(object,path,defaultValue){var index=-1,length=(path=castPath(path,object)).length;for(length||(length=1,object=undefined);++index<length;){var value=null==object?undefined:object[toKey(path[index])];value===undefined&&(index=length,value=defaultValue),object=isFunction(value)?value.call(object):value}return object},lodash.round=round,lodash.runInContext=runInContext,lodash.sample=function sample(collection){return(isArray(collection)?arraySample:baseSample)(collection)},lodash.size=function size(collection){if(null==collection)return 0;if(isArrayLike(collection))return isString(collection)?stringSize(collection):collection.length;var tag=getTag(collection);return tag==mapTag||tag==setTag?collection.size:baseKeys(collection).length},lodash.snakeCase=snakeCase,lodash.some=function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;return guard&&isIterateeCall(collection,predicate,guard)&&(predicate=undefined),func(collection,getIteratee(predicate,3))},lodash.sortedIndex=function sortedIndex(array,value){return baseSortedIndex(array,value)},lodash.sortedIndexBy=function sortedIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2))},lodash.sortedIndexOf=function sortedIndexOf(array,value){var length=null==array?0:array.length;if(length){var index=baseSortedIndex(array,value);if(index<length&&eq(array[index],value))return index}return-1},lodash.sortedLastIndex=function sortedLastIndex(array,value){return baseSortedIndex(array,value,!0)},lodash.sortedLastIndexBy=function sortedLastIndexBy(array,value,iteratee){return baseSortedIndexBy(array,value,getIteratee(iteratee,2),!0)},lodash.sortedLastIndexOf=function sortedLastIndexOf(array,value){if(null==array?0:array.length){var index=baseSortedIndex(array,value,!0)-1;if(eq(array[index],value))return index}return-1},lodash.startCase=startCase,lodash.startsWith=function startsWith(string,target,position){return string=toString(string),position=null==position?0:baseClamp(toInteger(position),0,string.length),target=baseToString(target),string.slice(position,position+target.length)==target},lodash.subtract=subtract,lodash.sum=function sum(array){return array&&array.length?baseSum(array,identity):0},lodash.sumBy=function sumBy(array,iteratee){return array&&array.length?baseSum(array,getIteratee(iteratee,2)):0},lodash.template=function template(string,options,guard){var settings=lodash.templateSettings;guard&&isIterateeCall(string,options,guard)&&(options=undefined),string=toString(string),options=assignInWith({},options,settings,customDefaultsAssignIn);var isEscaping,isEvaluating,imports=assignInWith({},options.imports,settings.imports,customDefaultsAssignIn),importsKeys=keys(imports),importsValues=baseValues(imports,importsKeys),index=0,interpolate=options.interpolate||reNoMatch,source="__p += '",reDelimiters=RegExp((options.escape||reNoMatch).source+"|"+interpolate.source+"|"+(interpolate===reInterpolate?reEsTemplate:reNoMatch).source+"|"+(options.evaluate||reNoMatch).source+"|$","g"),sourceURL="//# sourceURL="+(hasOwnProperty.call(options,"sourceURL")?(options.sourceURL+"").replace(/[\r\n]/g," "):"lodash.templateSources["+ ++templateCounter+"]")+"\n";string.replace(reDelimiters,function(match,escapeValue,interpolateValue,esTemplateValue,evaluateValue,offset){return interpolateValue||(interpolateValue=esTemplateValue),source+=string.slice(index,offset).replace(reUnescapedString,escapeStringChar),escapeValue&&(isEscaping=!0,source+="' +\n__e("+escapeValue+") +\n'"),evaluateValue&&(isEvaluating=!0,source+="';\n"+evaluateValue+";\n__p += '"),interpolateValue&&(source+="' +\n((__t = ("+interpolateValue+")) == null ? '' : __t) +\n'"),index=offset+match.length,match}),source+="';\n";var variable=hasOwnProperty.call(options,"variable")&&options.variable;variable||(source="with (obj) {\n"+source+"\n}\n"),source=(isEvaluating?source.replace(reEmptyStringLeading,""):source).replace(reEmptyStringMiddle,"$1").replace(reEmptyStringTrailing,"$1;"),source="function("+(variable||"obj")+") {\n"+(variable?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(isEscaping?", __e = _.escape":"")+(isEvaluating?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+source+"return __p\n}";var result=attempt(function(){return Function(importsKeys,sourceURL+"return "+source).apply(undefined,importsValues)});if(result.source=source,isError(result))throw result;return result},lodash.times=function times(n,iteratee){if((n=toInteger(n))<1||n>MAX_SAFE_INTEGER)return[];var index=MAX_ARRAY_LENGTH,length=nativeMin(n,MAX_ARRAY_LENGTH);iteratee=getIteratee(iteratee),n-=MAX_ARRAY_LENGTH;for(var result=baseTimes(length,iteratee);++index<n;)iteratee(index);return result},lodash.toFinite=toFinite,lodash.toInteger=toInteger,lodash.toLength=toLength,lodash.toLower=function toLower(value){return toString(value).toLowerCase()},lodash.toNumber=toNumber,lodash.toSafeInteger=function toSafeInteger(value){return value?baseClamp(toInteger(value),-MAX_SAFE_INTEGER,MAX_SAFE_INTEGER):0===value?value:0},lodash.toString=toString,lodash.toUpper=function toUpper(value){return toString(value).toUpperCase()},lodash.trim=function trim(string,chars,guard){if((string=toString(string))&&(guard||chars===undefined))return string.replace(reTrim,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string),chrSymbols=stringToArray(chars);return castSlice(strSymbols,charsStartIndex(strSymbols,chrSymbols),charsEndIndex(strSymbols,chrSymbols)+1).join("")},lodash.trimEnd=function trimEnd(string,chars,guard){if((string=toString(string))&&(guard||chars===undefined))return string.replace(reTrimEnd,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string);return castSlice(strSymbols,0,charsEndIndex(strSymbols,stringToArray(chars))+1).join("")},lodash.trimStart=function trimStart(string,chars,guard){if((string=toString(string))&&(guard||chars===undefined))return string.replace(reTrimStart,"");if(!string||!(chars=baseToString(chars)))return string;var strSymbols=stringToArray(string);return castSlice(strSymbols,charsStartIndex(strSymbols,stringToArray(chars))).join("")},lodash.truncate=function truncate(string,options){var length=DEFAULT_TRUNC_LENGTH,omission=DEFAULT_TRUNC_OMISSION;if(isObject(options)){var separator="separator"in options?options.separator:separator;length="length"in options?toInteger(options.length):length,omission="omission"in options?baseToString(options.omission):omission}var strLength=(string=toString(string)).length;if(hasUnicode(string)){var strSymbols=stringToArray(string);strLength=strSymbols.length}if(length>=strLength)return string;var end=length-stringSize(omission);if(end<1)return omission;var result=strSymbols?castSlice(strSymbols,0,end).join(""):string.slice(0,end);if(separator===undefined)return result+omission;if(strSymbols&&(end+=result.length-end),isRegExp(separator)){if(string.slice(end).search(separator)){var match,substring=result;for(separator.global||(separator=RegExp(separator.source,toString(reFlags.exec(separator))+"g")),separator.lastIndex=0;match=separator.exec(substring);)var newEnd=match.index;result=result.slice(0,newEnd===undefined?end:newEnd)}}else if(string.indexOf(baseToString(separator),end)!=end){var index=result.lastIndexOf(separator);index>-1&&(result=result.slice(0,index))}return result+omission},lodash.unescape=function unescape(string){return(string=toString(string))&&reHasEscapedHtml.test(string)?string.replace(reEscapedHtml,unescapeHtmlChar):string},lodash.uniqueId=function uniqueId(prefix){var id=++idCounter;return toString(prefix)+id},lodash.upperCase=upperCase,lodash.upperFirst=upperFirst,lodash.each=forEach,lodash.eachRight=forEachRight,lodash.first=head,mixin(lodash,(source={},baseForOwn(lodash,function(func,methodName){hasOwnProperty.call(lodash.prototype,methodName)||(source[methodName]=func)}),source),{chain:!1}),lodash.VERSION="4.17.15",arrayEach(["bind","bindKey","curry","curryRight","partial","partialRight"],function(methodName){lodash[methodName].placeholder=lodash}),arrayEach(["drop","take"],function(methodName,index){LazyWrapper.prototype[methodName]=function(n){n=n===undefined?1:nativeMax(toInteger(n),0);var result=this.__filtered__&&!index?new LazyWrapper(this):this.clone();return result.__filtered__?result.__takeCount__=nativeMin(n,result.__takeCount__):result.__views__.push({size:nativeMin(n,MAX_ARRAY_LENGTH),type:methodName+(result.__dir__<0?"Right":"")}),result},LazyWrapper.prototype[methodName+"Right"]=function(n){return this.reverse()[methodName](n).reverse()}}),arrayEach(["filter","map","takeWhile"],function(methodName,index){var type=index+1,isFilter=type==LAZY_FILTER_FLAG||3==type;LazyWrapper.prototype[methodName]=function(iteratee){var result=this.clone();return result.__iteratees__.push({iteratee:getIteratee(iteratee,3),type:type}),result.__filtered__=result.__filtered__||isFilter,result}}),arrayEach(["head","last"],function(methodName,index){var takeName="take"+(index?"Right":"");LazyWrapper.prototype[methodName]=function(){return this[takeName](1).value()[0]}}),arrayEach(["initial","tail"],function(methodName,index){var dropName="drop"+(index?"":"Right");LazyWrapper.prototype[methodName]=function(){return this.__filtered__?new LazyWrapper(this):this[dropName](1)}}),LazyWrapper.prototype.compact=function(){return this.filter(identity)},LazyWrapper.prototype.find=function(predicate){return this.filter(predicate).head()},LazyWrapper.prototype.findLast=function(predicate){return this.reverse().find(predicate)},LazyWrapper.prototype.invokeMap=baseRest(function(path,args){return"function"==typeof path?new LazyWrapper(this):this.map(function(value){return baseInvoke(value,path,args)})}),LazyWrapper.prototype.reject=function(predicate){return this.filter(negate(getIteratee(predicate)))},LazyWrapper.prototype.slice=function(start,end){start=toInteger(start);var result=this;return result.__filtered__&&(start>0||end<0)?new LazyWrapper(result):(start<0?result=result.takeRight(-start):start&&(result=result.drop(start)),end!==undefined&&(result=(end=toInteger(end))<0?result.dropRight(-end):result.take(end-start)),result)},LazyWrapper.prototype.takeRightWhile=function(predicate){return this.reverse().takeWhile(predicate).reverse()},LazyWrapper.prototype.toArray=function(){return this.take(MAX_ARRAY_LENGTH)},baseForOwn(LazyWrapper.prototype,function(func,methodName){var checkIteratee=/^(?:filter|find|map|reject)|While$/.test(methodName),isTaker=/^(?:head|last)$/.test(methodName),lodashFunc=lodash[isTaker?"take"+("last"==methodName?"Right":""):methodName],retUnwrapped=isTaker||/^find/.test(methodName);lodashFunc&&(lodash.prototype[methodName]=function(){var value=this.__wrapped__,args=isTaker?[1]:arguments,isLazy=value instanceof LazyWrapper,iteratee=args[0],useLazy=isLazy||isArray(value),interceptor=function(value){var result=lodashFunc.apply(lodash,arrayPush([value],args));return isTaker&&chainAll?result[0]:result};useLazy&&checkIteratee&&"function"==typeof iteratee&&1!=iteratee.length&&(isLazy=useLazy=!1);var chainAll=this.__chain__,isHybrid=!!this.__actions__.length,isUnwrapped=retUnwrapped&&!chainAll,onlyLazy=isLazy&&!isHybrid;if(!retUnwrapped&&useLazy){value=onlyLazy?value:new LazyWrapper(this);var result=func.apply(value,args);return result.__actions__.push({func:thru,args:[interceptor],thisArg:undefined}),new LodashWrapper(result,chainAll)}return isUnwrapped&&onlyLazy?func.apply(this,args):(result=this.thru(interceptor),isUnwrapped?isTaker?result.value()[0]:result.value():result)})}),arrayEach(["pop","push","shift","sort","splice","unshift"],function(methodName){var func=arrayProto[methodName],chainName=/^(?:push|sort|unshift)$/.test(methodName)?"tap":"thru",retUnwrapped=/^(?:pop|shift)$/.test(methodName);lodash.prototype[methodName]=function(){var args=arguments;if(retUnwrapped&&!this.__chain__){var value=this.value();return func.apply(isArray(value)?value:[],args)}return this[chainName](function(value){return func.apply(isArray(value)?value:[],args)})}}),baseForOwn(LazyWrapper.prototype,function(func,methodName){var lodashFunc=lodash[methodName];Eif(lodashFunc){var key=lodashFunc.name+"";hasOwnProperty.call(realNames,key)||(realNames[key]=[]),realNames[key].push({name:methodName,func:lodashFunc})}}),realNames[createHybrid(undefined,WRAP_BIND_KEY_FLAG).name]=[{name:"wrapper",func:undefined}],LazyWrapper.prototype.clone=function lazyClone(){var result=new LazyWrapper(this.__wrapped__);return result.__actions__=copyArray(this.__actions__),result.__dir__=this.__dir__,result.__filtered__=this.__filtered__,result.__iteratees__=copyArray(this.__iteratees__),result.__takeCount__=this.__takeCount__,result.__views__=copyArray(this.__views__),result},LazyWrapper.prototype.reverse=function lazyReverse(){if(this.__filtered__){var result=new LazyWrapper(this);result.__dir__=-1,result.__filtered__=!0}else(result=this.clone()).__dir__*=-1;return result},LazyWrapper.prototype.value=function lazyValue(){var array=this.__wrapped__.value(),dir=this.__dir__,isArr=isArray(array),isRight=dir<0,arrLength=isArr?array.length:0,view=function getView(start,end,transforms){var index=-1,length=transforms.length;for(;++index<length;){var data=transforms[index],size=data.size;switch(data.type){case"drop":start+=size;break;case"dropRight":end-=size;break;case"take":end=nativeMin(end,start+size);break;case"takeRight":start=nativeMax(start,end-size)}}return{start:start,end:end}}(0,arrLength,this.__views__),start=view.start,end=view.end,length=end-start,index=isRight?end:start-1,iteratees=this.__iteratees__,iterLength=iteratees.length,resIndex=0,takeCount=nativeMin(length,this.__takeCount__);if(!isArr||!isRight&&arrLength==length&&takeCount==length)return baseWrapperValue(array,this.__actions__);var result=[];outer:for(;length--&&resIndex<takeCount;){for(var iterIndex=-1,value=array[index+=dir];++iterIndex<iterLength;){var data=iteratees[iterIndex],iteratee=data.iteratee,type=data.type,computed=iteratee(value);if(type==LAZY_MAP_FLAG)value=computed;else if(!computed){if(type==LAZY_FILTER_FLAG)continue outer;break outer}}result[resIndex++]=value}return result},lodash.prototype.at=wrapperAt,lodash.prototype.chain=function wrapperChain(){return chain(this)},lodash.prototype.commit=function wrapperCommit(){return new LodashWrapper(this.value(),this.__chain__)},lodash.prototype.next=function wrapperNext(){this.__values__===undefined&&(this.__values__=toArray(this.value()));var done=this.__index__>=this.__values__.length;return{done:done,value:done?undefined:this.__values__[this.__index__++]}},lodash.prototype.plant=function wrapperPlant(value){for(var result,parent=this;parent instanceof baseLodash;){var clone=wrapperClone(parent);clone.__index__=0,clone.__values__=undefined,result?previous.__wrapped__=clone:result=clone;var previous=clone;parent=parent.__wrapped__}return previous.__wrapped__=value,result},lodash.prototype.reverse=function wrapperReverse(){var value=this.__wrapped__;if(value instanceof LazyWrapper){var wrapped=value;return this.__actions__.length&&(wrapped=new LazyWrapper(this)),(wrapped=wrapped.reverse()).__actions__.push({func:thru,args:[reverse],thisArg:undefined}),new LodashWrapper(wrapped,this.__chain__)}return this.thru(reverse)},lodash.prototype.toJSON=lodash.prototype.valueOf=lodash.prototype.value=function wrapperValue(){return baseWrapperValue(this.__wrapped__,this.__actions__)},lodash.prototype.first=lodash.prototype.head,symIterator&&(lodash.prototype[symIterator]=function wrapperToIterator(){return this}),lodash}();root._=_,(__WEBPACK_AMD_DEFINE_RESULT__=function(){return _}.call(exports,__webpack_require__,exports,module))===undefined||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}).call(this)}).call(this,__webpack_require__(18),__webpack_require__(58)(module))},function(module,exports,__webpack_require__){"use strict";__webpack_require__(33),__webpack_require__(34),__webpack_require__(41),__webpack_require__(37),__webpack_require__(89),__webpack_require__(51),__webpack_require__(27),__webpack_require__(90),__webpack_require__(44),__webpack_require__(6),__webpack_require__(26),__webpack_require__(262),__webpack_require__(75),__webpack_require__(91),__webpack_require__(46),__webpack_require__(160),__webpack_require__(35),Object.defineProperty(exports,"__esModule",{value:!0}),exports.withLinks=exports.hrefTo=exports.linkTo=exports.navigate=void 0;var _global=__webpack_require__(20),_qs=_interopRequireDefault(__webpack_require__(574)),_addons=_interopRequireDefault(__webpack_require__(92)),_coreEvents=__webpack_require__(74),_utils=__webpack_require__(93);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _toConsumableArray(arr){return function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++)arr2[i]=arr[i];return arr2}}(arr)||function _iterableToArray(iter){if(Symbol.iterator in Object(iter)||"[object Arguments]"===Object.prototype.toString.call(iter))return Array.from(iter)}(arr)||function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance")}()}var navigate=function navigate(params){return _addons.default.getChannel().emit(_coreEvents.SELECT_STORY,params)};exports.navigate=navigate;var valueOrCall=function valueOrCall(args){return function(value){return"function"==typeof value?value.apply(void 0,_toConsumableArray(args)):value}};exports.linkTo=function linkTo(kind,story){return function(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];var resolver=valueOrCall(args);navigate({kind:resolver(kind),story:resolver(story)})}};exports.hrefTo=function hrefTo(kind,name){return new Promise(function(resolve){resolve(function generateUrl(id){var location=_global.document.location,query=_qs.default.parse(location.search,{ignoreQueryPrefix:!0});return"".concat(location.origin+location.pathname,"?").concat(_qs.default.stringify(Object.assign({},query,{id:id}),{encode:!1}))}((0,_utils.toId)(kind,name)))})};var linksListener=function linksListener(e){var target=e.target;if(target instanceof _global.HTMLElement){var _element$dataset=target.dataset,kind=_element$dataset.sbKind,story=_element$dataset.sbStory;(kind||story)&&(e.preventDefault(),navigate({kind:kind,story:story}))}},hasListener=!1,off=function off(){hasListener&&(hasListener=!1,_global.document.removeEventListener("click",linksListener))};exports.withLinks=function withLinks(storyFn){return function on(){hasListener||(hasListener=!0,_global.document.addEventListener("click",linksListener))}(),_addons.default.getChannel().once(_coreEvents.STORY_CHANGED,off),storyFn()}},function(module,exports,__webpack_require__){"use strict";var stringify=__webpack_require__(575),parse=__webpack_require__(576),formats=__webpack_require__(268);module.exports={formats:formats,parse:parse,stringify:stringify}},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(267),formats=__webpack_require__(268),has=Object.prototype.hasOwnProperty,arrayPrefixGenerators={brackets:function brackets(prefix){return prefix+"[]"},comma:"comma",indices:function indices(prefix,key){return prefix+"["+key+"]"},repeat:function repeat(prefix){return prefix}},isArray=Array.isArray,push=Array.prototype.push,pushToArray=function(arr,valueOrArray){push.apply(arr,isArray(valueOrArray)?valueOrArray:[valueOrArray])},toISO=Date.prototype.toISOString,defaults={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:utils.encode,encodeValuesOnly:!1,formatter:formats.formatters[formats.default],indices:!1,serializeDate:function serializeDate(date){return toISO.call(date)},skipNulls:!1,strictNullHandling:!1},stringify=function stringify(object,prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset){var obj=object;if("function"==typeof filter?obj=filter(prefix,obj):obj instanceof Date?obj=serializeDate(obj):"comma"===generateArrayPrefix&&isArray(obj)&&(obj=obj.join(",")),null===obj){if(strictNullHandling)return encoder&&!encodeValuesOnly?encoder(prefix,defaults.encoder,charset):prefix;obj=""}if("string"==typeof obj||"number"==typeof obj||"boolean"==typeof obj||utils.isBuffer(obj))return encoder?[formatter(encodeValuesOnly?prefix:encoder(prefix,defaults.encoder,charset))+"="+formatter(encoder(obj,defaults.encoder,charset))]:[formatter(prefix)+"="+formatter(String(obj))];var objKeys,values=[];if(void 0===obj)return values;if(isArray(filter))objKeys=filter;else{var keys=Object.keys(obj);objKeys=sort?keys.sort(sort):keys}for(var i=0;i<objKeys.length;++i){var key=objKeys[i];skipNulls&&null===obj[key]||(isArray(obj)?pushToArray(values,stringify(obj[key],"function"==typeof generateArrayPrefix?generateArrayPrefix(prefix,key):prefix,generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)):pushToArray(values,stringify(obj[key],prefix+(allowDots?"."+key:"["+key+"]"),generateArrayPrefix,strictNullHandling,skipNulls,encoder,filter,sort,allowDots,serializeDate,formatter,encodeValuesOnly,charset)))}return values};module.exports=function(object,opts){var objKeys,obj=object,options=function normalizeStringifyOptions(opts){if(!opts)return defaults;if(null!==opts.encoder&&void 0!==opts.encoder&&"function"!=typeof opts.encoder)throw new TypeError("Encoder has to be a function.");var charset=opts.charset||defaults.charset;if(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var format=formats.default;if(void 0!==opts.format){if(!has.call(formats.formatters,opts.format))throw new TypeError("Unknown format option provided.");format=opts.format}var formatter=formats.formatters[format],filter=defaults.filter;return("function"==typeof opts.filter||isArray(opts.filter))&&(filter=opts.filter),{addQueryPrefix:"boolean"==typeof opts.addQueryPrefix?opts.addQueryPrefix:defaults.addQueryPrefix,allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,delimiter:void 0===opts.delimiter?defaults.delimiter:opts.delimiter,encode:"boolean"==typeof opts.encode?opts.encode:defaults.encode,encoder:"function"==typeof opts.encoder?opts.encoder:defaults.encoder,encodeValuesOnly:"boolean"==typeof opts.encodeValuesOnly?opts.encodeValuesOnly:defaults.encodeValuesOnly,filter:filter,formatter:formatter,serializeDate:"function"==typeof opts.serializeDate?opts.serializeDate:defaults.serializeDate,skipNulls:"boolean"==typeof opts.skipNulls?opts.skipNulls:defaults.skipNulls,sort:"function"==typeof opts.sort?opts.sort:null,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);"function"==typeof options.filter?obj=(0,options.filter)("",obj):isArray(options.filter)&&(objKeys=options.filter);var arrayFormat,keys=[];if("object"!=typeof obj||null===obj)return"";arrayFormat=opts&&opts.arrayFormat in arrayPrefixGenerators?opts.arrayFormat:opts&&"indices"in opts?opts.indices?"indices":"repeat":"indices";var generateArrayPrefix=arrayPrefixGenerators[arrayFormat];objKeys||(objKeys=Object.keys(obj)),options.sort&&objKeys.sort(options.sort);for(var i=0;i<objKeys.length;++i){var key=objKeys[i];options.skipNulls&&null===obj[key]||pushToArray(keys,stringify(obj[key],key,generateArrayPrefix,options.strictNullHandling,options.skipNulls,options.encode?options.encoder:null,options.filter,options.sort,options.allowDots,options.serializeDate,options.formatter,options.encodeValuesOnly,options.charset))}var joined=keys.join(options.delimiter),prefix=!0===options.addQueryPrefix?"?":"";return options.charsetSentinel&&("iso-8859-1"===options.charset?prefix+="utf8=%26%2310003%3B&":prefix+="utf8=%E2%9C%93&"),joined.length>0?prefix+joined:""}},function(module,exports,__webpack_require__){"use strict";var utils=__webpack_require__(267),has=Object.prototype.hasOwnProperty,defaults={allowDots:!1,allowPrototypes:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:utils.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(str){return str.replace(/&#(\d+);/g,function($0,numberStr){return String.fromCharCode(parseInt(numberStr,10))})},parseKeys=function parseQueryStringKeys(givenKey,val,options){if(givenKey){var key=options.allowDots?givenKey.replace(/\.([^.[]+)/g,"[$1]"):givenKey,child=/(\[[^[\]]*])/g,segment=/(\[[^[\]]*])/.exec(key),parent=segment?key.slice(0,segment.index):key,keys=[];if(parent){if(!options.plainObjects&&has.call(Object.prototype,parent)&&!options.allowPrototypes)return;keys.push(parent)}for(var i=0;null!==(segment=child.exec(key))&&i<options.depth;){if(i+=1,!options.plainObjects&&has.call(Object.prototype,segment[1].slice(1,-1))&&!options.allowPrototypes)return;keys.push(segment[1])}return segment&&keys.push("["+key.slice(segment.index)+"]"),function(chain,val,options){for(var leaf=val,i=chain.length-1;i>=0;--i){var obj,root=chain[i];if("[]"===root&&options.parseArrays)obj=[].concat(leaf);else{obj=options.plainObjects?Object.create(null):{};var cleanRoot="["===root.charAt(0)&&"]"===root.charAt(root.length-1)?root.slice(1,-1):root,index=parseInt(cleanRoot,10);options.parseArrays||""!==cleanRoot?!isNaN(index)&&root!==cleanRoot&&String(index)===cleanRoot&&index>=0&&options.parseArrays&&index<=options.arrayLimit?(obj=[])[index]=leaf:obj[cleanRoot]=leaf:obj={0:leaf}}leaf=obj}return leaf}(keys,val,options)}};module.exports=function(str,opts){var options=function normalizeParseOptions(opts){if(!opts)return defaults;if(null!==opts.decoder&&void 0!==opts.decoder&&"function"!=typeof opts.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==opts.charset&&"utf-8"!==opts.charset&&"iso-8859-1"!==opts.charset)throw new Error("The charset option must be either utf-8, iso-8859-1, or undefined");var charset=void 0===opts.charset?defaults.charset:opts.charset;return{allowDots:void 0===opts.allowDots?defaults.allowDots:!!opts.allowDots,allowPrototypes:"boolean"==typeof opts.allowPrototypes?opts.allowPrototypes:defaults.allowPrototypes,arrayLimit:"number"==typeof opts.arrayLimit?opts.arrayLimit:defaults.arrayLimit,charset:charset,charsetSentinel:"boolean"==typeof opts.charsetSentinel?opts.charsetSentinel:defaults.charsetSentinel,comma:"boolean"==typeof opts.comma?opts.comma:defaults.comma,decoder:"function"==typeof opts.decoder?opts.decoder:defaults.decoder,delimiter:"string"==typeof opts.delimiter||utils.isRegExp(opts.delimiter)?opts.delimiter:defaults.delimiter,depth:"number"==typeof opts.depth?opts.depth:defaults.depth,ignoreQueryPrefix:!0===opts.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof opts.interpretNumericEntities?opts.interpretNumericEntities:defaults.interpretNumericEntities,parameterLimit:"number"==typeof opts.parameterLimit?opts.parameterLimit:defaults.parameterLimit,parseArrays:!1!==opts.parseArrays,plainObjects:"boolean"==typeof opts.plainObjects?opts.plainObjects:defaults.plainObjects,strictNullHandling:"boolean"==typeof opts.strictNullHandling?opts.strictNullHandling:defaults.strictNullHandling}}(opts);if(""===str||null==str)return options.plainObjects?Object.create(null):{};for(var tempObj="string"==typeof str?function parseQueryStringValues(str,options){var i,obj={},cleanStr=options.ignoreQueryPrefix?str.replace(/^\?/,""):str,limit=options.parameterLimit===1/0?void 0:options.parameterLimit,parts=cleanStr.split(options.delimiter,limit),skipIndex=-1,charset=options.charset;if(options.charsetSentinel)for(i=0;i<parts.length;++i)0===parts[i].indexOf("utf8=")&&("utf8=%E2%9C%93"===parts[i]?charset="utf-8":"utf8=%26%2310003%3B"===parts[i]&&(charset="iso-8859-1"),skipIndex=i,i=parts.length);for(i=0;i<parts.length;++i)if(i!==skipIndex){var key,val,part=parts[i],bracketEqualsPos=part.indexOf("]="),pos=-1===bracketEqualsPos?part.indexOf("="):bracketEqualsPos+1;-1===pos?(key=options.decoder(part,defaults.decoder,charset),val=options.strictNullHandling?null:""):(key=options.decoder(part.slice(0,pos),defaults.decoder,charset),val=options.decoder(part.slice(pos+1),defaults.decoder,charset)),val&&options.interpretNumericEntities&&"iso-8859-1"===charset&&(val=interpretNumericEntities(val)),val&&options.comma&&val.indexOf(",")>-1&&(val=val.split(",")),has.call(obj,key)?obj[key]=utils.combine(obj[key],val):obj[key]=val}return obj}(str,options):str,obj=options.plainObjects?Object.create(null):{},keys=Object.keys(tempObj),i=0;i<keys.length;++i){var key=keys[i],newObj=parseKeys(key,tempObj[key],options);obj=utils.merge(obj,newObj,options)}return utils.compact(obj)}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_angular_core__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1);let WelcomeComponent=class WelcomeComponent{constructor(){this.showApp=new _angular_core__WEBPACK_IMPORTED_MODULE_1__.t}};tslib__WEBPACK_IMPORTED_MODULE_0__.b([Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__.K)(),tslib__WEBPACK_IMPORTED_MODULE_0__.d("design:type",Object)],WelcomeComponent.prototype,"showApp",void 0),WelcomeComponent=tslib__WEBPACK_IMPORTED_MODULE_0__.b([Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__.m)({selector:"storybook-welcome-component",template:'\n    <main>\n      <h1>Welcome to storybook</h1>\n      <p>This is a UI component dev environment for your app.</p>\n      <p>\n        We\'ve added some basic stories inside the\n        <span class="inline-code">src/stories</span> directory. <br />\n        A story is a single state of one or more UI components. You can have as many stories as you\n        want. <br />\n        (Basically a story is like a visual test case.)\n      </p>\n      <p>\n        See these sample\n        <a (click)="showApp.emit($event)" role="button" tabIndex="0">stories</a> for a component\n        called <span class="inline-code">Button</span> .\n      </p>\n      <p>\n        Just like that, you can add your own components as stories. <br />\n        You can also edit those components and see changes right away. <br />\n        (Try editing the <span class="inline-code">Button</span> stories located at\n        <span class="inline-code">src/stories/index.js</span>.)\n      </p>\n      <p>\n        Usually we create stories with smaller UI components in the app.<br />\n        Have a look at the\n        <a\n          href="https://storybook.js.org/basics/writing-stories"\n          target="_blank"\n          rel="noopener noreferrer"\n        >\n          Writing Stories\n        </a>\n        section in our documentation.\n      </p>\n      <p class="note">\n        <b>NOTE:</b> <br />\n        Have a look at the <span class="inline-code">.storybook/webpack.config.js</span> to add\n        webpack loaders and plugins you are using in this project.\n      </p>\n    </main>\n  ',styles:["\n      main {\n        padding: 15px;\n        line-height: 1.4;\n        font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif;\n        background-color: #ffffff;\n      }\n\n      .note {\n        opacity: 0.5;\n      }\n\n      .inline-code {\n        font-size: 15px;\n        font-weight: 600;\n        padding: 2px 5px;\n        border: 1px solid #eae9e9;\n        border-radius: 4px;\n        background-color: #f3f2f2;\n        color: #3a3a3a;\n      }\n\n      a {\n        color: #1474f3;\n        text-decoration: none;\n        border-bottom: 1px solid #1474f3;\n        padding-bottom: 2px;\n      }\n    "]})],WelcomeComponent),__webpack_exports__.default=WelcomeComponent},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);var tslib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_angular_core__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1);let ButtonComponent=class ButtonComponent{constructor(){this.text="",this.onClick=new _angular_core__WEBPACK_IMPORTED_MODULE_1__.t}};tslib__WEBPACK_IMPORTED_MODULE_0__.b([Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__.z)(),tslib__WEBPACK_IMPORTED_MODULE_0__.d("design:type",Object)],ButtonComponent.prototype,"text",void 0),tslib__WEBPACK_IMPORTED_MODULE_0__.b([Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__.K)(),tslib__WEBPACK_IMPORTED_MODULE_0__.d("design:type",Object)],ButtonComponent.prototype,"onClick",void 0),ButtonComponent=tslib__WEBPACK_IMPORTED_MODULE_0__.b([Object(_angular_core__WEBPACK_IMPORTED_MODULE_1__.m)({selector:"storybook-button-component",template:'\n    <button (click)="onClick.emit($event)">{{ text }}</button>\n  ',styles:["\n      button {\n        border: 1px solid #eee;\n        border-radius: 3px;\n        background-color: #ffffff;\n        cursor: pointer;\n        font-size: 15px;\n        padding: 3px 10px;\n        margin: 10px;\n      }\n    "]})],ButtonComponent),__webpack_exports__.default=ButtonComponent},,,,,function(module,exports,__webpack_require__){var fn,memo,stylesInDom={},isOldIE=(fn=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===memo&&(memo=fn.apply(this,arguments)),memo}),getElement=function(fn){var memo={};return function(target,parent){Iif("function"==typeof target)return target();Eif(void 0===memo[target]){var styleTarget=function(target,parent){return parent?parent.querySelector(target):document.querySelector(target)}.call(this,target,parent);Iif(window.HTMLIFrameElement&&styleTarget instanceof window.HTMLIFrameElement)try{styleTarget=styleTarget.contentDocument.head}catch(e){styleTarget=null}memo[target]=styleTarget}return memo[target]}}(),singleton=null,singletonCounter=0,stylesInsertedAtTop=[],fixUrls=__webpack_require__(584);function addStylesToDom(styles,options){for(var i=0;i<styles.length;i++){var item=styles[i],domStyle=stylesInDom[item.id];Iif(domStyle){domStyle.refs++;for(var j=0;j<domStyle.parts.length;j++)domStyle.parts[j](item.parts[j]);for(;j<item.parts.length;j++)domStyle.parts.push(addStyle(item.parts[j],options))}else{var parts=[];for(j=0;j<item.parts.length;j++)parts.push(addStyle(item.parts[j],options));stylesInDom[item.id]={id:item.id,refs:1,parts:parts}}}}function listToStyles(list,options){for(var styles=[],newStyles={},i=0;i<list.length;i++){var item=list[i],id=options.base?item[0]+options.base:item[0],part={css:item[1],media:item[2],sourceMap:item[3]};newStyles[id]?newStyles[id].parts.push(part):styles.push(newStyles[id]={id:id,parts:[part]})}return styles}function insertStyleElement(options,style){var target=getElement(options.insertInto);Iif(!target)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var lastStyleElementInsertedAtTop=stylesInsertedAtTop[stylesInsertedAtTop.length-1];Iif("top"===options.insertAt)lastStyleElementInsertedAtTop?lastStyleElementInsertedAtTop.nextSibling?target.insertBefore(style,lastStyleElementInsertedAtTop.nextSibling):target.appendChild(style):target.insertBefore(style,target.firstChild),stylesInsertedAtTop.push(style);else Eif("bottom"===options.insertAt)target.appendChild(style);else{if("object"!=typeof options.insertAt||!options.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var nextSibling=getElement(options.insertAt.before,target);target.insertBefore(style,nextSibling)}}function removeStyleElement(style){if(null===style.parentNode)return!1;style.parentNode.removeChild(style);var idx=stylesInsertedAtTop.indexOf(style);idx>=0&&stylesInsertedAtTop.splice(idx,1)}function createStyleElement(options){var style=document.createElement("style");Eif(void 0===options.attrs.type&&(options.attrs.type="text/css"),void 0===options.attrs.nonce){var nonce=function getNonce(){0;return __webpack_require__.nc}();nonce&&(options.attrs.nonce=nonce)}return addAttrs(style,options.attrs),insertStyleElement(options,style),style}function addAttrs(el,attrs){Object.keys(attrs).forEach(function(key){el.setAttribute(key,attrs[key])})}function addStyle(obj,options){var style,update,remove,result;Iif(options.transform&&obj.css){if(!(result="function"==typeof options.transform?options.transform(obj.css):options.transform.default(obj.css)))return function(){};obj.css=result}Iif(options.singleton){var styleIndex=singletonCounter++;style=singleton||(singleton=createStyleElement(options)),update=applyToSingletonTag.bind(null,style,styleIndex,!1),remove=applyToSingletonTag.bind(null,style,styleIndex,!0)}else obj.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(style=function createLinkElement(options){var link=document.createElement("link");return void 0===options.attrs.type&&(options.attrs.type="text/css"),options.attrs.rel="stylesheet",addAttrs(link,options.attrs),insertStyleElement(options,link),link}(options),update=function updateLink(link,options,obj){var css=obj.css,sourceMap=obj.sourceMap,autoFixUrls=void 0===options.convertToAbsoluteUrls&&sourceMap;(options.convertToAbsoluteUrls||autoFixUrls)&&(css=fixUrls(css));sourceMap&&(css+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))))+" */");var blob=new Blob([css],{type:"text/css"}),oldSrc=link.href;link.href=URL.createObjectURL(blob),oldSrc&&URL.revokeObjectURL(oldSrc)}.bind(null,style,options),remove=function(){removeStyleElement(style),style.href&&URL.revokeObjectURL(style.href)}):(style=createStyleElement(options),update=function applyToTag(style,obj){var css=obj.css,media=obj.media;media&&style.setAttribute("media",media);Iif(style.styleSheet)style.styleSheet.cssText=css;else{for(;style.firstChild;)style.removeChild(style.firstChild);style.appendChild(document.createTextNode(css))}}.bind(null,style),remove=function(){removeStyleElement(style)});return update(obj),function updateStyle(newObj){if(newObj){if(newObj.css===obj.css&&newObj.media===obj.media&&newObj.sourceMap===obj.sourceMap)return;update(obj=newObj)}else remove()}}module.exports=function(list,options){Iif("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(options=options||{}).attrs="object"==typeof options.attrs?options.attrs:{},options.singleton||"boolean"==typeof options.singleton||(options.singleton=isOldIE()),options.insertInto||(options.insertInto="head"),options.insertAt||(options.insertAt="bottom");var styles=listToStyles(list,options);return addStylesToDom(styles,options),function update(newList){for(var mayRemove=[],i=0;i<styles.length;i++){var item=styles[i];(domStyle=stylesInDom[item.id]).refs--,mayRemove.push(domStyle)}newList&&addStylesToDom(listToStyles(newList,options),options);for(i=0;i<mayRemove.length;i++){var domStyle;if(0===(domStyle=mayRemove[i]).refs){for(var j=0;j<domStyle.parts.length;j++)domStyle.parts[j]();delete stylesInDom[domStyle.id]}}}};var textStore,replaceText=(textStore=[],function(index,replacement){return textStore[index]=replacement,textStore.filter(Boolean).join("\n")});function applyToSingletonTag(style,index,remove,obj){var css=remove?"":obj.css;if(style.styleSheet)style.styleSheet.cssText=replaceText(index,css);else{var cssNode=document.createTextNode(css),childNodes=style.childNodes;childNodes[index]&&style.removeChild(childNodes[index]),childNodes.length?style.insertBefore(cssNode,childNodes[index]):style.appendChild(cssNode)}}},function(module,exports){module.exports=function(css){var location="undefined"!=typeof window&&window.location;if(!location)throw new Error("fixUrls requires window.location");if(!css||"string"!=typeof css)return css;var baseUrl=location.protocol+"//"+location.host,currentDir=baseUrl+location.pathname.replace(/\/[^\/]*$/,"/");return css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(fullMatch,origUrl){var newUrl,unquotedOrigUrl=origUrl.trim().replace(/^"(.*)"$/,function(o,$1){return $1}).replace(/^'(.*)'$/,function(o,$1){return $1});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(unquotedOrigUrl)?fullMatch:(newUrl=0===unquotedOrigUrl.indexOf("//")?unquotedOrigUrl:0===unquotedOrigUrl.indexOf("/")?baseUrl+unquotedOrigUrl:currentDir+unquotedOrigUrl.replace(/^\.\//,""),"url("+JSON.stringify(newUrl)+")")})}},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.r(__webpack_exports__);var global_window=__webpack_require__(20),core=__webpack_require__(1),tslib_es6=__webpack_require__(0),PlatformLocation=function PlatformLocation(){},LocationStrategy=(new core.x("Location Initialized"),function LocationStrategy(){}),APP_BASE_HREF=new core.x("appBaseHref"),common_Location=function(){function Location(platformStrategy,platformLocation){var _this=this;this._subject=new core.t,this._urlChangeListeners=[],this._platformStrategy=platformStrategy;var browserBaseHref=this._platformStrategy.getBaseHref();this._platformLocation=platformLocation,this._baseHref=Location_1.stripTrailingSlash(_stripIndexHtml(browserBaseHref)),this._platformStrategy.onPopState(function(ev){_this._subject.emit({url:_this.path(!0),pop:!0,state:ev.state,type:ev.type})})}var Location_1;return Location_1=Location,Location.prototype.path=function(includeHash){return void 0===includeHash&&(includeHash=!1),this.normalize(this._platformStrategy.path(includeHash))},Location.prototype.getState=function(){return this._platformLocation.getState()},Location.prototype.isCurrentPathEqualTo=function(path,query){return void 0===query&&(query=""),this.path()==this.normalize(path+Location_1.normalizeQueryParams(query))},Location.prototype.normalize=function(url){return Location_1.stripTrailingSlash(function _stripBaseHref(baseHref,url){return baseHref&&url.startsWith(baseHref)?url.substring(baseHref.length):url}(this._baseHref,_stripIndexHtml(url)))},Location.prototype.prepareExternalUrl=function(url){return url&&"/"!==url[0]&&(url="/"+url),this._platformStrategy.prepareExternalUrl(url)},Location.prototype.go=function(path,query,state){void 0===query&&(query=""),void 0===state&&(state=null),this._platformStrategy.pushState(state,"",path,query),this._notifyUrlChangeListeners(this.prepareExternalUrl(path+Location_1.normalizeQueryParams(query)),state)},Location.prototype.replaceState=function(path,query,state){void 0===query&&(query=""),void 0===state&&(state=null),this._platformStrategy.replaceState(state,"",path,query),this._notifyUrlChangeListeners(this.prepareExternalUrl(path+Location_1.normalizeQueryParams(query)),state)},Location.prototype.forward=function(){this._platformStrategy.forward()},Location.prototype.back=function(){this._platformStrategy.back()},Location.prototype.onUrlChange=function(fn){var _this=this;this._urlChangeListeners.push(fn),this.subscribe(function(v){_this._notifyUrlChangeListeners(v.url,v.state)})},Location.prototype._notifyUrlChangeListeners=function(url,state){void 0===url&&(url=""),this._urlChangeListeners.forEach(function(fn){return fn(url,state)})},Location.prototype.subscribe=function(onNext,onThrow,onReturn){return this._subject.subscribe({next:onNext,error:onThrow,complete:onReturn})},Location.normalizeQueryParams=function(params){return params&&"?"!==params[0]?"?"+params:params},Location.joinWithSlash=function(start,end){if(0==start.length)return end;if(0==end.length)return start;var slashes=0;return start.endsWith("/")&&slashes++,end.startsWith("/")&&slashes++,2==slashes?start+end.substring(1):1==slashes?start+end:start+"/"+end},Location.stripTrailingSlash=function(url){var match=url.match(/#|\?|$/),pathEndIdx=match&&match.index||url.length,droppedSlashIdx=pathEndIdx-("/"===url[pathEndIdx-1]?1:0);return url.slice(0,droppedSlashIdx)+url.slice(pathEndIdx)},Location=Location_1=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.d)("design:paramtypes",[LocationStrategy,PlatformLocation])],Location)}();function _stripIndexHtml(url){return url.replace(/\/index.html$/,"")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(function(_super){function HashLocationStrategy(_platformLocation,_baseHref){var _this=_super.call(this)||this;return _this._platformLocation=_platformLocation,_this._baseHref="",null!=_baseHref&&(_this._baseHref=_baseHref),_this}Object(tslib_es6.c)(HashLocationStrategy,_super),HashLocationStrategy.prototype.onPopState=function(fn){this._platformLocation.onPopState(fn),this._platformLocation.onHashChange(fn)},HashLocationStrategy.prototype.getBaseHref=function(){return this._baseHref},HashLocationStrategy.prototype.path=function(includeHash){void 0===includeHash&&(includeHash=!1);var path=this._platformLocation.hash;return null==path&&(path="#"),path.length>0?path.substring(1):path},HashLocationStrategy.prototype.prepareExternalUrl=function(internal){var url=common_Location.joinWithSlash(this._baseHref,internal);return url.length>0?"#"+url:url},HashLocationStrategy.prototype.pushState=function(state,title,path,queryParams){var url=this.prepareExternalUrl(path+common_Location.normalizeQueryParams(queryParams));0==url.length&&(url=this._platformLocation.pathname),this._platformLocation.pushState(state,title,url)},HashLocationStrategy.prototype.replaceState=function(state,title,path,queryParams){var url=this.prepareExternalUrl(path+common_Location.normalizeQueryParams(queryParams));0==url.length&&(url=this._platformLocation.pathname),this._platformLocation.replaceState(state,title,url)},HashLocationStrategy.prototype.forward=function(){this._platformLocation.forward()},HashLocationStrategy.prototype.back=function(){this._platformLocation.back()},HashLocationStrategy=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.v)(APP_BASE_HREF)),Object(tslib_es6.d)("design:paramtypes",[PlatformLocation,String])],HashLocationStrategy)})(LocationStrategy),function(_super){function PathLocationStrategy(_platformLocation,href){var _this=_super.call(this)||this;if(_this._platformLocation=_platformLocation,null==href&&(href=_this._platformLocation.getBaseHrefFromDOM()),null==href)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return _this._baseHref=href,_this}Object(tslib_es6.c)(PathLocationStrategy,_super),PathLocationStrategy.prototype.onPopState=function(fn){this._platformLocation.onPopState(fn),this._platformLocation.onHashChange(fn)},PathLocationStrategy.prototype.getBaseHref=function(){return this._baseHref},PathLocationStrategy.prototype.prepareExternalUrl=function(internal){return common_Location.joinWithSlash(this._baseHref,internal)},PathLocationStrategy.prototype.path=function(includeHash){void 0===includeHash&&(includeHash=!1);var pathname=this._platformLocation.pathname+common_Location.normalizeQueryParams(this._platformLocation.search),hash=this._platformLocation.hash;return hash&&includeHash?""+pathname+hash:pathname},PathLocationStrategy.prototype.pushState=function(state,title,url,queryParams){var externalUrl=this.prepareExternalUrl(url+common_Location.normalizeQueryParams(queryParams));this._platformLocation.pushState(state,title,externalUrl)},PathLocationStrategy.prototype.replaceState=function(state,title,url,queryParams){var externalUrl=this.prepareExternalUrl(url+common_Location.normalizeQueryParams(queryParams));this._platformLocation.replaceState(state,title,externalUrl)},PathLocationStrategy.prototype.forward=function(){this._platformLocation.forward()},PathLocationStrategy.prototype.back=function(){this._platformLocation.back()},PathLocationStrategy=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.v)(APP_BASE_HREF)),Object(tslib_es6.d)("design:paramtypes",[PlatformLocation,String])],PathLocationStrategy)}(LocationStrategy)
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var u=void 0;var localeEn=["en",[["a","p"],["AM","PM"],u],[["AM","PM"],u,u],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],u,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],u,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",u,"{1} 'at' {0}",u],[".",",",";","%","+","-","E","×","‰","∞","NaN",":"],["#,##0.###","#,##0%","¤#,##0.00","#E0"],"$","US Dollar",{},function plural(n){var i=Math.floor(Math.abs(n)),v=n.toString().replace(/^[^.]*\.?/,"").length;return 1===i&&0===v?1:5}],LOCALE_DATA={};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var NumberFormatStyle,Plural,FormStyle,TranslationWidth,FormatWidth,NumberSymbol,WeekDay,CURRENCIES_EN={ADP:[void 0,void 0,0],AFN:[void 0,void 0,0],ALL:[void 0,void 0,0],AMD:[void 0,void 0,0],AOA:[void 0,"Kz"],ARS:[void 0,"$"],AUD:["A$","$"],BAM:[void 0,"KM"],BBD:[void 0,"$"],BDT:[void 0,"৳"],BHD:[void 0,void 0,3],BIF:[void 0,void 0,0],BMD:[void 0,"$"],BND:[void 0,"$"],BOB:[void 0,"Bs"],BRL:["R$"],BSD:[void 0,"$"],BWP:[void 0,"P"],BYN:[void 0,"р.",2],BYR:[void 0,void 0,0],BZD:[void 0,"$"],CAD:["CA$","$",2],CHF:[void 0,void 0,2],CLF:[void 0,void 0,4],CLP:[void 0,"$",0],CNY:["CN¥","¥"],COP:[void 0,"$",0],CRC:[void 0,"₡",2],CUC:[void 0,"$"],CUP:[void 0,"$"],CZK:[void 0,"Kč",2],DJF:[void 0,void 0,0],DKK:[void 0,"kr",2],DOP:[void 0,"$"],EGP:[void 0,"E£"],ESP:[void 0,"₧",0],EUR:["€"],FJD:[void 0,"$"],FKP:[void 0,"£"],GBP:["£"],GEL:[void 0,"₾"],GIP:[void 0,"£"],GNF:[void 0,"FG",0],GTQ:[void 0,"Q"],GYD:[void 0,"$",0],HKD:["HK$","$"],HNL:[void 0,"L"],HRK:[void 0,"kn"],HUF:[void 0,"Ft",2],IDR:[void 0,"Rp",0],ILS:["₪"],INR:["₹"],IQD:[void 0,void 0,0],IRR:[void 0,void 0,0],ISK:[void 0,"kr",0],ITL:[void 0,void 0,0],JMD:[void 0,"$"],JOD:[void 0,void 0,3],JPY:["¥",void 0,0],KHR:[void 0,"៛"],KMF:[void 0,"CF",0],KPW:[void 0,"₩",0],KRW:["₩",void 0,0],KWD:[void 0,void 0,3],KYD:[void 0,"$"],KZT:[void 0,"₸"],LAK:[void 0,"₭",0],LBP:[void 0,"L£",0],LKR:[void 0,"Rs"],LRD:[void 0,"$"],LTL:[void 0,"Lt"],LUF:[void 0,void 0,0],LVL:[void 0,"Ls"],LYD:[void 0,void 0,3],MGA:[void 0,"Ar",0],MGF:[void 0,void 0,0],MMK:[void 0,"K",0],MNT:[void 0,"₮",0],MRO:[void 0,void 0,0],MUR:[void 0,"Rs",0],MXN:["MX$","$"],MYR:[void 0,"RM"],NAD:[void 0,"$"],NGN:[void 0,"₦"],NIO:[void 0,"C$"],NOK:[void 0,"kr",2],NPR:[void 0,"Rs"],NZD:["NZ$","$"],OMR:[void 0,void 0,3],PHP:[void 0,"₱"],PKR:[void 0,"Rs",0],PLN:[void 0,"zł"],PYG:[void 0,"₲",0],RON:[void 0,"lei"],RSD:[void 0,void 0,0],RUB:[void 0,"₽"],RUR:[void 0,"р."],RWF:[void 0,"RF",0],SBD:[void 0,"$"],SEK:[void 0,"kr",2],SGD:[void 0,"$"],SHP:[void 0,"£"],SLL:[void 0,void 0,0],SOS:[void 0,void 0,0],SRD:[void 0,"$"],SSP:[void 0,"£"],STD:[void 0,void 0,0],STN:[void 0,"Db"],SYP:[void 0,"£",0],THB:[void 0,"฿"],TMM:[void 0,void 0,0],TND:[void 0,void 0,3],TOP:[void 0,"T$"],TRL:[void 0,void 0,0],TRY:[void 0,"₺"],TTD:[void 0,"$"],TWD:["NT$","$",2],TZS:[void 0,void 0,0],UAH:[void 0,"₴"],UGX:[void 0,void 0,0],USD:["$"],UYI:[void 0,void 0,0],UYU:[void 0,"$"],UZS:[void 0,void 0,0],VEF:[void 0,"Bs"],VND:["₫",void 0,0],VUV:[void 0,void 0,0],XAF:["FCFA",void 0,0],XCD:["EC$","$"],XOF:["CFA",void 0,0],XPF:["CFPF",void 0,0],YER:[void 0,void 0,0],ZAR:[void 0,"R"],ZMK:[void 0,void 0,0],ZMW:[void 0,"ZK"],ZWD:[void 0,void 0,0]};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function getLocaleDateFormat(locale,width){return getLastDefinedValue(findLocaleData(locale)[10],width)}function getLocaleTimeFormat(locale,width){return getLastDefinedValue(findLocaleData(locale)[11],width)}function getLocaleDateTimeFormat(locale,width){return getLastDefinedValue(findLocaleData(locale)[12],width)}function getLocaleNumberSymbol(locale,symbol){var data=findLocaleData(locale),res=data[13][symbol];if(void 0===res){if(symbol===NumberSymbol.CurrencyDecimal)return data[13][NumberSymbol.Decimal];if(symbol===NumberSymbol.CurrencyGroup)return data[13][NumberSymbol.Group]}return res}function getLocaleNumberFormat(locale,type){return findLocaleData(locale)[14][type]}function checkFullData(data){if(!data[19])throw new Error('Missing extra locale data for the locale "'+data[0]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function getLastDefinedValue(data,index){for(var i=index;i>-1;i--)if(void 0!==data[i])return data[i];throw new Error("Locale data API: locale data undefined")}function extractTime(time){var _a=Object(tslib_es6.f)(time.split(":"),2);return{hours:+_a[0],minutes:+_a[1]}}function findLocaleData(locale){var normalizedLocale=locale.toLowerCase().replace(/_/g,"-"),match=LOCALE_DATA[normalizedLocale];if(match)return match;var parentLocale=normalizedLocale.split("-")[0];if(match=LOCALE_DATA[parentLocale])return match;if("en"===parentLocale)return localeEn;throw new Error('Missing locale data for the locale "'+locale+'".')}function getCurrencySymbol(code,format,locale){void 0===locale&&(locale="en");var currency=function getLocaleCurrencies(locale){return findLocaleData(locale)[17]}(locale)[code]||CURRENCIES_EN[code]||[],symbolNarrow=currency[1];return"narrow"===format&&"string"==typeof symbolNarrow?symbolNarrow:currency[0]||code}!function(NumberFormatStyle){NumberFormatStyle[NumberFormatStyle.Decimal=0]="Decimal",NumberFormatStyle[NumberFormatStyle.Percent=1]="Percent",NumberFormatStyle[NumberFormatStyle.Currency=2]="Currency",NumberFormatStyle[NumberFormatStyle.Scientific=3]="Scientific"}(NumberFormatStyle||(NumberFormatStyle={})),function(Plural){Plural[Plural.Zero=0]="Zero",Plural[Plural.One=1]="One",Plural[Plural.Two=2]="Two",Plural[Plural.Few=3]="Few",Plural[Plural.Many=4]="Many",Plural[Plural.Other=5]="Other"}(Plural||(Plural={})),function(FormStyle){FormStyle[FormStyle.Format=0]="Format",FormStyle[FormStyle.Standalone=1]="Standalone"}(FormStyle||(FormStyle={})),function(TranslationWidth){TranslationWidth[TranslationWidth.Narrow=0]="Narrow",TranslationWidth[TranslationWidth.Abbreviated=1]="Abbreviated",TranslationWidth[TranslationWidth.Wide=2]="Wide",TranslationWidth[TranslationWidth.Short=3]="Short"}(TranslationWidth||(TranslationWidth={})),function(FormatWidth){FormatWidth[FormatWidth.Short=0]="Short",FormatWidth[FormatWidth.Medium=1]="Medium",FormatWidth[FormatWidth.Long=2]="Long",FormatWidth[FormatWidth.Full=3]="Full"}(FormatWidth||(FormatWidth={})),function(NumberSymbol){NumberSymbol[NumberSymbol.Decimal=0]="Decimal",NumberSymbol[NumberSymbol.Group=1]="Group",NumberSymbol[NumberSymbol.List=2]="List",NumberSymbol[NumberSymbol.PercentSign=3]="PercentSign",NumberSymbol[NumberSymbol.PlusSign=4]="PlusSign",NumberSymbol[NumberSymbol.MinusSign=5]="MinusSign",NumberSymbol[NumberSymbol.Exponential=6]="Exponential",NumberSymbol[NumberSymbol.SuperscriptingExponent=7]="SuperscriptingExponent",NumberSymbol[NumberSymbol.PerMille=8]="PerMille",NumberSymbol[NumberSymbol[1/0]=9]="Infinity",NumberSymbol[NumberSymbol.NaN=10]="NaN",NumberSymbol[NumberSymbol.TimeSeparator=11]="TimeSeparator",NumberSymbol[NumberSymbol.CurrencyDecimal=12]="CurrencyDecimal",NumberSymbol[NumberSymbol.CurrencyGroup=13]="CurrencyGroup"}(NumberSymbol||(NumberSymbol={})),function(WeekDay){WeekDay[WeekDay.Sunday=0]="Sunday",WeekDay[WeekDay.Monday=1]="Monday",WeekDay[WeekDay.Tuesday=2]="Tuesday",WeekDay[WeekDay.Wednesday=3]="Wednesday",WeekDay[WeekDay.Thursday=4]="Thursday",WeekDay[WeekDay.Friday=5]="Friday",WeekDay[WeekDay.Saturday=6]="Saturday"}(WeekDay||(WeekDay={}));var DEFAULT_NB_OF_CURRENCY_DIGITS=2;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var ZoneWidth,DateType,TranslationType,ISO8601_DATE_REGEX=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,NAMED_FORMATS={},DATE_FORMATS_SPLIT=/((?:[^GyMLwWdEabBhHmsSzZO']+)|(?:'(?:[^']|'')*')|(?:G{1,5}|y{1,4}|M{1,5}|L{1,5}|w{1,2}|W{1}|d{1,2}|E{1,6}|a{1,5}|b{1,5}|B{1,5}|h{1,2}|H{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,4}|Z{1,5}|O{1,4}))([\s\S]*)/;function formatDate(value,format,locale,timezone){var date=function toDate(value){if(isDate(value))return value;if("number"==typeof value&&!isNaN(value))return new Date(value);if("string"==typeof value){value=value.trim();var parsedNb=parseFloat(value);if(!isNaN(value-parsedNb))return new Date(parsedNb);if(/^(\d{4}-\d{1,2}-\d{1,2})$/.test(value)){var _a=Object(tslib_es6.f)(value.split("-").map(function(val){return+val}),3),y=_a[0],m=_a[1],d=_a[2];return new Date(y,m-1,d)}var match;if(match=value.match(ISO8601_DATE_REGEX))return isoStringToDate(match)}var date=new Date(value);if(!isDate(date))throw new Error('Unable to convert "'+value+'" into a date');return date}(value);format=function getNamedFormat(locale,format){var localeId=function getLocaleId(locale){return findLocaleData(locale)[0]}(locale);NAMED_FORMATS[localeId]=NAMED_FORMATS[localeId]||{};if(NAMED_FORMATS[localeId][format])return NAMED_FORMATS[localeId][format];var formatValue="";switch(format){case"shortDate":formatValue=getLocaleDateFormat(locale,FormatWidth.Short);break;case"mediumDate":formatValue=getLocaleDateFormat(locale,FormatWidth.Medium);break;case"longDate":formatValue=getLocaleDateFormat(locale,FormatWidth.Long);break;case"fullDate":formatValue=getLocaleDateFormat(locale,FormatWidth.Full);break;case"shortTime":formatValue=getLocaleTimeFormat(locale,FormatWidth.Short);break;case"mediumTime":formatValue=getLocaleTimeFormat(locale,FormatWidth.Medium);break;case"longTime":formatValue=getLocaleTimeFormat(locale,FormatWidth.Long);break;case"fullTime":formatValue=getLocaleTimeFormat(locale,FormatWidth.Full);break;case"short":var shortTime=getNamedFormat(locale,"shortTime"),shortDate=getNamedFormat(locale,"shortDate");formatValue=formatDateTime(getLocaleDateTimeFormat(locale,FormatWidth.Short),[shortTime,shortDate]);break;case"medium":var mediumTime=getNamedFormat(locale,"mediumTime"),mediumDate=getNamedFormat(locale,"mediumDate");formatValue=formatDateTime(getLocaleDateTimeFormat(locale,FormatWidth.Medium),[mediumTime,mediumDate]);break;case"long":var longTime=getNamedFormat(locale,"longTime"),longDate=getNamedFormat(locale,"longDate");formatValue=formatDateTime(getLocaleDateTimeFormat(locale,FormatWidth.Long),[longTime,longDate]);break;case"full":var fullTime=getNamedFormat(locale,"fullTime"),fullDate=getNamedFormat(locale,"fullDate");formatValue=formatDateTime(getLocaleDateTimeFormat(locale,FormatWidth.Full),[fullTime,fullDate])}formatValue&&(NAMED_FORMATS[localeId][format]=formatValue);return formatValue}(locale,format)||format;for(var match,parts=[];format;){if(!(match=DATE_FORMATS_SPLIT.exec(format))){parts.push(format);break}var part=(parts=parts.concat(match.slice(1))).pop();if(!part)break;format=part}var dateTimezoneOffset=date.getTimezoneOffset();timezone&&(dateTimezoneOffset=timezoneToOffset(timezone,dateTimezoneOffset),date=function convertTimezoneToLocal(date,timezone,reverse){var reverseValue=reverse?-1:1,dateTimezoneOffset=date.getTimezoneOffset(),timezoneOffset=timezoneToOffset(timezone,dateTimezoneOffset);return function addDateMinutes(date,minutes){return(date=new Date(date.getTime())).setMinutes(date.getMinutes()+minutes),date}(date,reverseValue*(timezoneOffset-dateTimezoneOffset))}(date,timezone,!0));var text="";return parts.forEach(function(value){var dateFormatter=function getDateFormatter(format){if(DATE_FORMATS[format])return DATE_FORMATS[format];var formatter;switch(format){case"G":case"GG":case"GGG":formatter=dateStrGetter(TranslationType.Eras,TranslationWidth.Abbreviated);break;case"GGGG":formatter=dateStrGetter(TranslationType.Eras,TranslationWidth.Wide);break;case"GGGGG":formatter=dateStrGetter(TranslationType.Eras,TranslationWidth.Narrow);break;case"y":formatter=dateGetter(DateType.FullYear,1,0,!1,!0);break;case"yy":formatter=dateGetter(DateType.FullYear,2,0,!0,!0);break;case"yyy":formatter=dateGetter(DateType.FullYear,3,0,!1,!0);break;case"yyyy":formatter=dateGetter(DateType.FullYear,4,0,!1,!0);break;case"M":case"L":formatter=dateGetter(DateType.Month,1,1);break;case"MM":case"LL":formatter=dateGetter(DateType.Month,2,1);break;case"MMM":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Abbreviated);break;case"MMMM":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Wide);break;case"MMMMM":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Narrow);break;case"LLL":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Abbreviated,FormStyle.Standalone);break;case"LLLL":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Wide,FormStyle.Standalone);break;case"LLLLL":formatter=dateStrGetter(TranslationType.Months,TranslationWidth.Narrow,FormStyle.Standalone);break;case"w":formatter=weekGetter(1);break;case"ww":formatter=weekGetter(2);break;case"W":formatter=weekGetter(1,!0);break;case"d":formatter=dateGetter(DateType.Date,1);break;case"dd":formatter=dateGetter(DateType.Date,2);break;case"E":case"EE":case"EEE":formatter=dateStrGetter(TranslationType.Days,TranslationWidth.Abbreviated);break;case"EEEE":formatter=dateStrGetter(TranslationType.Days,TranslationWidth.Wide);break;case"EEEEE":formatter=dateStrGetter(TranslationType.Days,TranslationWidth.Narrow);break;case"EEEEEE":formatter=dateStrGetter(TranslationType.Days,TranslationWidth.Short);break;case"a":case"aa":case"aaa":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Abbreviated);break;case"aaaa":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Wide);break;case"aaaaa":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Narrow);break;case"b":case"bb":case"bbb":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Abbreviated,FormStyle.Standalone,!0);break;case"bbbb":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Wide,FormStyle.Standalone,!0);break;case"bbbbb":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Narrow,FormStyle.Standalone,!0);break;case"B":case"BB":case"BBB":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Abbreviated,FormStyle.Format,!0);break;case"BBBB":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Wide,FormStyle.Format,!0);break;case"BBBBB":formatter=dateStrGetter(TranslationType.DayPeriods,TranslationWidth.Narrow,FormStyle.Format,!0);break;case"h":formatter=dateGetter(DateType.Hours,1,-12);break;case"hh":formatter=dateGetter(DateType.Hours,2,-12);break;case"H":formatter=dateGetter(DateType.Hours,1);break;case"HH":formatter=dateGetter(DateType.Hours,2);break;case"m":formatter=dateGetter(DateType.Minutes,1);break;case"mm":formatter=dateGetter(DateType.Minutes,2);break;case"s":formatter=dateGetter(DateType.Seconds,1);break;case"ss":formatter=dateGetter(DateType.Seconds,2);break;case"S":formatter=dateGetter(DateType.FractionalSeconds,1);break;case"SS":formatter=dateGetter(DateType.FractionalSeconds,2);break;case"SSS":formatter=dateGetter(DateType.FractionalSeconds,3);break;case"Z":case"ZZ":case"ZZZ":formatter=timeZoneGetter(ZoneWidth.Short);break;case"ZZZZZ":formatter=timeZoneGetter(ZoneWidth.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":formatter=timeZoneGetter(ZoneWidth.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":formatter=timeZoneGetter(ZoneWidth.Long);break;default:return null}return DATE_FORMATS[format]=formatter,formatter}(value);text+=dateFormatter?dateFormatter(date,locale,dateTimezoneOffset):"''"===value?"'":value.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),text}function formatDateTime(str,opt_values){return opt_values&&(str=str.replace(/\{([^}]+)}/g,function(match,key){return null!=opt_values&&key in opt_values?opt_values[key]:match})),str}function padNumber(num,digits,minusSign,trim,negWrap){void 0===minusSign&&(minusSign="-");var neg="";(num<0||negWrap&&num<=0)&&(negWrap?num=1-num:(num=-num,neg=minusSign));for(var strNum=String(num);strNum.length<digits;)strNum="0"+strNum;return trim&&(strNum=strNum.substr(strNum.length-digits)),neg+strNum}function dateGetter(name,size,offset,trim,negWrap){return void 0===offset&&(offset=0),void 0===trim&&(trim=!1),void 0===negWrap&&(negWrap=!1),function(date,locale){var part=function getDatePart(part,date){switch(part){case DateType.FullYear:return date.getFullYear();case DateType.Month:return date.getMonth();case DateType.Date:return date.getDate();case DateType.Hours:return date.getHours();case DateType.Minutes:return date.getMinutes();case DateType.Seconds:return date.getSeconds();case DateType.FractionalSeconds:return date.getMilliseconds();case DateType.Day:return date.getDay();default:throw new Error('Unknown DateType value "'+part+'".')}}(name,date);if((offset>0||part>-offset)&&(part+=offset),name===DateType.Hours)0===part&&-12===offset&&(part=12);else if(name===DateType.FractionalSeconds)return function formatFractionalSeconds(milliseconds,digits){return padNumber(milliseconds,3).substr(0,digits)}(part,size);var localeMinus=getLocaleNumberSymbol(locale,NumberSymbol.MinusSign);return padNumber(part,size,localeMinus,trim,negWrap)}}function dateStrGetter(name,width,form,extended){return void 0===form&&(form=FormStyle.Format),void 0===extended&&(extended=!1),function(date,locale){return function getDateTranslation(date,locale,name,width,form,extended){switch(name){case TranslationType.Months:return function getLocaleMonthNames(locale,formStyle,width){var data=findLocaleData(locale),months=getLastDefinedValue([data[5],data[6]],formStyle);return getLastDefinedValue(months,width)}(locale,form,width)[date.getMonth()];case TranslationType.Days:return function getLocaleDayNames(locale,formStyle,width){var data=findLocaleData(locale),days=getLastDefinedValue([data[3],data[4]],formStyle);return getLastDefinedValue(days,width)}(locale,form,width)[date.getDay()];case TranslationType.DayPeriods:var currentHours_1=date.getHours(),currentMinutes_1=date.getMinutes();if(extended){var result_1,rules=function getLocaleExtraDayPeriodRules(locale){var data=findLocaleData(locale);return checkFullData(data),(data[19][2]||[]).map(function(rule){return"string"==typeof rule?extractTime(rule):[extractTime(rule[0]),extractTime(rule[1])]})}(locale),dayPeriods_1=function getLocaleExtraDayPeriods(locale,formStyle,width){var data=findLocaleData(locale);checkFullData(data);var dayPeriods=getLastDefinedValue([data[19][0],data[19][1]],formStyle)||[];return getLastDefinedValue(dayPeriods,width)||[]}(locale,form,width);if(rules.forEach(function(rule,index){if(Array.isArray(rule)){var _a=rule[0],hoursFrom=_a.hours,minutesFrom=_a.minutes,_b=rule[1],hoursTo=_b.hours,minutesTo=_b.minutes;currentHours_1>=hoursFrom&&currentMinutes_1>=minutesFrom&&(currentHours_1<hoursTo||currentHours_1===hoursTo&&currentMinutes_1<minutesTo)&&(result_1=dayPeriods_1[index])}else{var hours=rule.hours,minutes=rule.minutes;hours===currentHours_1&&minutes===currentMinutes_1&&(result_1=dayPeriods_1[index])}}),result_1)return result_1}return function getLocaleDayPeriods(locale,formStyle,width){var data=findLocaleData(locale),amPm=getLastDefinedValue([data[1],data[2]],formStyle);return getLastDefinedValue(amPm,width)}(locale,form,width)[currentHours_1<12?0:1];case TranslationType.Eras:return function getLocaleEraNames(locale,width){return getLastDefinedValue(findLocaleData(locale)[7],width)}(locale,width)[date.getFullYear()<=0?0:1];default:throw new Error("unexpected translation type "+name)}}(date,locale,name,width,form,extended)}}function timeZoneGetter(width){return function(date,locale,offset){var zone=-1*offset,minusSign=getLocaleNumberSymbol(locale,NumberSymbol.MinusSign),hours=zone>0?Math.floor(zone/60):Math.ceil(zone/60);switch(width){case ZoneWidth.Short:return(zone>=0?"+":"")+padNumber(hours,2,minusSign)+padNumber(Math.abs(zone%60),2,minusSign);case ZoneWidth.ShortGMT:return"GMT"+(zone>=0?"+":"")+padNumber(hours,1,minusSign);case ZoneWidth.Long:return"GMT"+(zone>=0?"+":"")+padNumber(hours,2,minusSign)+":"+padNumber(Math.abs(zone%60),2,minusSign);case ZoneWidth.Extended:return 0===offset?"Z":(zone>=0?"+":"")+padNumber(hours,2,minusSign)+":"+padNumber(Math.abs(zone%60),2,minusSign);default:throw new Error('Unknown zone width "'+width+'"')}}}!function(ZoneWidth){ZoneWidth[ZoneWidth.Short=0]="Short",ZoneWidth[ZoneWidth.ShortGMT=1]="ShortGMT",ZoneWidth[ZoneWidth.Long=2]="Long",ZoneWidth[ZoneWidth.Extended=3]="Extended"}(ZoneWidth||(ZoneWidth={})),function(DateType){DateType[DateType.FullYear=0]="FullYear",DateType[DateType.Month=1]="Month",DateType[DateType.Date=2]="Date",DateType[DateType.Hours=3]="Hours",DateType[DateType.Minutes=4]="Minutes",DateType[DateType.Seconds=5]="Seconds",DateType[DateType.FractionalSeconds=6]="FractionalSeconds",DateType[DateType.Day=7]="Day"}(DateType||(DateType={})),function(TranslationType){TranslationType[TranslationType.DayPeriods=0]="DayPeriods",TranslationType[TranslationType.Days=1]="Days",TranslationType[TranslationType.Months=2]="Months",TranslationType[TranslationType.Eras=3]="Eras"}(TranslationType||(TranslationType={}));var JANUARY=0,THURSDAY=4;function weekGetter(size,monthBased){return void 0===monthBased&&(monthBased=!1),function(date,locale){var result;if(monthBased){var nbDaysBefore1stDayOfMonth=new Date(date.getFullYear(),date.getMonth(),1).getDay()-1,today=date.getDate();result=1+Math.floor((today+nbDaysBefore1stDayOfMonth)/7)}else{var firstThurs=function getFirstThursdayOfYear(year){var firstDayOfYear=new Date(year,JANUARY,1).getDay();return new Date(year,0,1+(firstDayOfYear<=THURSDAY?THURSDAY:THURSDAY+7)-firstDayOfYear)}(date.getFullYear()),diff=function getThursdayThisWeek(datetime){return new Date(datetime.getFullYear(),datetime.getMonth(),datetime.getDate()+(THURSDAY-datetime.getDay()))}(date).getTime()-firstThurs.getTime();result=1+Math.round(diff/6048e5)}return padNumber(result,size,getLocaleNumberSymbol(locale,NumberSymbol.MinusSign))}}var DATE_FORMATS={};function timezoneToOffset(timezone,fallback){timezone=timezone.replace(/:/g,"");var requestedTimezoneOffset=Date.parse("Jan 01, 1970 00:00:00 "+timezone)/6e4;return isNaN(requestedTimezoneOffset)?fallback:requestedTimezoneOffset}function isoStringToDate(match){var date=new Date(0),tzHour=0,tzMin=0,dateSetter=match[8]?date.setUTCFullYear:date.setFullYear,timeSetter=match[8]?date.setUTCHours:date.setHours;match[9]&&(tzHour=Number(match[9]+match[10]),tzMin=Number(match[9]+match[11])),dateSetter.call(date,Number(match[1]),Number(match[2])-1,Number(match[3]));var h=Number(match[4]||0)-tzHour,m=Number(match[5]||0)-tzMin,s=Number(match[6]||0),ms=Math.round(1e3*parseFloat("0."+(match[7]||0)));return timeSetter.call(date,h,m,s,ms),date}function isDate(value){return value instanceof Date&&!isNaN(value.valueOf())}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var NUMBER_FORMAT_REGEXP=/^(\d+)?\.((\d+)(-(\d+))?)?$/,MAX_DIGITS=22,DECIMAL_SEP=".",ZERO_CHAR="0",PATTERN_SEP=";",GROUP_SEP=",",DIGIT_CHAR="#",CURRENCY_CHAR="¤",PERCENT_CHAR="%";function formatNumberToLocaleString(value,pattern,locale,groupSymbol,decimalSymbol,digitsInfo,isPercent){void 0===isPercent&&(isPercent=!1);var formattedText="",isZero=!1;if(isFinite(value)){var parsedNumber=function parseNumber(num){var digits,integerLen,i,j,zeros,numStr=Math.abs(num)+"",exponent=0;(integerLen=numStr.indexOf(DECIMAL_SEP))>-1&&(numStr=numStr.replace(DECIMAL_SEP,""));(i=numStr.search(/e/i))>0?(integerLen<0&&(integerLen=i),integerLen+=+numStr.slice(i+1),numStr=numStr.substring(0,i)):integerLen<0&&(integerLen=numStr.length);for(i=0;numStr.charAt(i)===ZERO_CHAR;i++);if(i===(zeros=numStr.length))digits=[0],integerLen=1;else{for(zeros--;numStr.charAt(zeros)===ZERO_CHAR;)zeros--;for(integerLen-=i,digits=[],j=0;i<=zeros;i++,j++)digits[j]=Number(numStr.charAt(i))}integerLen>MAX_DIGITS&&(digits=digits.splice(0,MAX_DIGITS-1),exponent=integerLen-1,integerLen=1);return{digits:digits,exponent:exponent,integerLen:integerLen}}(value);isPercent&&(parsedNumber=function toPercent(parsedNumber){if(0===parsedNumber.digits[0])return parsedNumber;var fractionLen=parsedNumber.digits.length-parsedNumber.integerLen;parsedNumber.exponent?parsedNumber.exponent+=2:(0===fractionLen?parsedNumber.digits.push(0,0):1===fractionLen&&parsedNumber.digits.push(0),parsedNumber.integerLen+=2);return parsedNumber}(parsedNumber));var minInt=pattern.minInt,minFraction=pattern.minFrac,maxFraction=pattern.maxFrac;if(digitsInfo){var parts=digitsInfo.match(NUMBER_FORMAT_REGEXP);if(null===parts)throw new Error(digitsInfo+" is not a valid digit info");var minIntPart=parts[1],minFractionPart=parts[3],maxFractionPart=parts[5];null!=minIntPart&&(minInt=parseIntAutoRadix(minIntPart)),null!=minFractionPart&&(minFraction=parseIntAutoRadix(minFractionPart)),null!=maxFractionPart?maxFraction=parseIntAutoRadix(maxFractionPart):null!=minFractionPart&&minFraction>maxFraction&&(maxFraction=minFraction)}!function roundNumber(parsedNumber,minFrac,maxFrac){if(minFrac>maxFrac)throw new Error("The minimum number of digits after fraction ("+minFrac+") is higher than the maximum ("+maxFrac+").");var digits=parsedNumber.digits,fractionLen=digits.length-parsedNumber.integerLen,fractionSize=Math.min(Math.max(minFrac,fractionLen),maxFrac),roundAt=fractionSize+parsedNumber.integerLen,digit=digits[roundAt];if(roundAt>0){digits.splice(Math.max(parsedNumber.integerLen,roundAt));for(var j=roundAt;j<digits.length;j++)digits[j]=0}else{fractionLen=Math.max(0,fractionLen),parsedNumber.integerLen=1,digits.length=Math.max(1,roundAt=fractionSize+1),digits[0]=0;for(var i=1;i<roundAt;i++)digits[i]=0}if(digit>=5)if(roundAt-1<0){for(var k=0;k>roundAt;k--)digits.unshift(0),parsedNumber.integerLen++;digits.unshift(1),parsedNumber.integerLen++}else digits[roundAt-1]++;for(;fractionLen<Math.max(0,fractionSize);fractionLen++)digits.push(0);var dropTrailingZeros=0!==fractionSize,minLen=minFrac+parsedNumber.integerLen,carry=digits.reduceRight(function(carry,d,i,digits){return d+=carry,digits[i]=d<10?d:d-10,dropTrailingZeros&&(0===digits[i]&&i>=minLen?digits.pop():dropTrailingZeros=!1),d>=10?1:0},0);carry&&(digits.unshift(carry),parsedNumber.integerLen++)}(parsedNumber,minFraction,maxFraction);var digits=parsedNumber.digits,integerLen=parsedNumber.integerLen,exponent=parsedNumber.exponent,decimals=[];for(isZero=digits.every(function(d){return!d});integerLen<minInt;integerLen++)digits.unshift(0);for(;integerLen<0;integerLen++)digits.unshift(0);integerLen>0?decimals=digits.splice(integerLen,digits.length):(decimals=digits,digits=[0]);var groups=[];for(digits.length>=pattern.lgSize&&groups.unshift(digits.splice(-pattern.lgSize,digits.length).join(""));digits.length>pattern.gSize;)groups.unshift(digits.splice(-pattern.gSize,digits.length).join(""));digits.length&&groups.unshift(digits.join("")),formattedText=groups.join(getLocaleNumberSymbol(locale,groupSymbol)),decimals.length&&(formattedText+=getLocaleNumberSymbol(locale,decimalSymbol)+decimals.join("")),exponent&&(formattedText+=getLocaleNumberSymbol(locale,NumberSymbol.Exponential)+"+"+exponent)}else formattedText=getLocaleNumberSymbol(locale,NumberSymbol.Infinity);return formattedText=value<0&&!isZero?pattern.negPre+formattedText+pattern.negSuf:pattern.posPre+formattedText+pattern.posSuf}function formatCurrency(value,locale,currency,currencyCode,digitsInfo){var pattern=parseNumberFormat(getLocaleNumberFormat(locale,NumberFormatStyle.Currency),getLocaleNumberSymbol(locale,NumberSymbol.MinusSign));return pattern.minFrac=function getNumberOfCurrencyDigits(code){var digits,currency=CURRENCIES_EN[code];return currency&&(digits=currency[2]),"number"==typeof digits?digits:DEFAULT_NB_OF_CURRENCY_DIGITS}(currencyCode),pattern.maxFrac=pattern.minFrac,formatNumberToLocaleString(value,pattern,locale,NumberSymbol.CurrencyGroup,NumberSymbol.CurrencyDecimal,digitsInfo).replace(CURRENCY_CHAR,currency).replace(CURRENCY_CHAR,"")}function parseNumberFormat(format,minusSign){void 0===minusSign&&(minusSign="-");var p={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},patternParts=format.split(PATTERN_SEP),positive=patternParts[0],negative=patternParts[1],positiveParts=-1!==positive.indexOf(DECIMAL_SEP)?positive.split(DECIMAL_SEP):[positive.substring(0,positive.lastIndexOf(ZERO_CHAR)+1),positive.substring(positive.lastIndexOf(ZERO_CHAR)+1)],integer=positiveParts[0],fraction=positiveParts[1]||"";p.posPre=integer.substr(0,integer.indexOf(DIGIT_CHAR));for(var i=0;i<fraction.length;i++){var ch=fraction.charAt(i);ch===ZERO_CHAR?p.minFrac=p.maxFrac=i+1:ch===DIGIT_CHAR?p.maxFrac=i+1:p.posSuf+=ch}var groups=integer.split(GROUP_SEP);if(p.gSize=groups[1]?groups[1].length:0,p.lgSize=groups[2]||groups[1]?(groups[2]||groups[1]).length:0,negative){var trunkLen=positive.length-p.posPre.length-p.posSuf.length,pos=negative.indexOf(DIGIT_CHAR);p.negPre=negative.substr(0,pos).replace(/'/g,""),p.negSuf=negative.substr(pos+trunkLen).replace(/'/g,"")}else p.negPre=minusSign+p.posPre,p.negSuf=p.posSuf;return p}function parseIntAutoRadix(text){var result=parseInt(text);if(isNaN(result))throw new Error("Invalid integer literal when parsing "+text);return result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var DEPRECATED_PLURAL_FN=new core.x("UseV4Plurals"),NgLocalization=function NgLocalization(){};function getPluralCategory(value,cases,ngLocalization,locale){var key="="+value;if(cases.indexOf(key)>-1)return key;if(key=ngLocalization.getPluralCategory(value,locale),cases.indexOf(key)>-1)return key;if(cases.indexOf("other")>-1)return"other";throw new Error('No plural message found for value "'+value+'"')}var common_NgLocaleLocalization=function(_super){function NgLocaleLocalization(locale,deprecatedPluralFn){var _this=_super.call(this)||this;return _this.locale=locale,_this.deprecatedPluralFn=deprecatedPluralFn,_this}return Object(tslib_es6.c)(NgLocaleLocalization,_super),NgLocaleLocalization.prototype.getPluralCategory=function(value,locale){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(locale||this.locale,value):function getLocalePluralCase(locale){return findLocaleData(locale)[18]}(locale||this.locale)(value)){case Plural.Zero:return"zero";case Plural.One:return"one";case Plural.Two:return"two";case Plural.Few:return"few";case Plural.Many:return"many";default:return"other"}},NgLocaleLocalization=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.v)(DEPRECATED_PLURAL_FN)),Object(tslib_es6.d)("design:paramtypes",[String,Object])],NgLocaleLocalization)}(NgLocalization);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
var StylingDiffer=function(){function StylingDiffer(_name,_options){this._name=_name,this._options=_options,this.value=null,this._lastSetValue=null,this._lastSetValueType=0,this._lastSetValueIdentityChange=!1}return StylingDiffer.prototype.setValue=function(value){if(Array.isArray(value))this._lastSetValueType=4;else if(value instanceof Set)this._lastSetValueType=8;else if(value&&"string"==typeof value){if(!(4&this._options))throw new Error(this._name+" string values are not allowed");this._lastSetValueType=1}else this._lastSetValueType=value?2:0;this._lastSetValueIdentityChange=!0,this._lastSetValue=value||null},StylingDiffer.prototype.hasValueChanged=function(){var valueHasChanged=this._lastSetValueIdentityChange;if(!(valueHasChanged||14&this._lastSetValueType))return!1;var finalValue=null,trimValues=!!(1&this._options),parseOutUnits=!!(8&this._options),allowSubKeys=!!(2&this._options);switch(this._lastSetValueType){case 1:var tokens=this._lastSetValue.split(/\s+/g);16&this._options?(finalValue={},tokens.forEach(function(token,i){return finalValue[token]=!0})):finalValue=tokens.reduce(function(str,token,i){return str+(i?" ":"")+token});break;case 2:var map=this._lastSetValue,keys=Object.keys(map);valueHasChanged||(valueHasChanged=!this.value||function mapHasChanged(keys,a,b){var oldKeys=Object.keys(a),newKeys=keys;if(!arrayEqualsArray(oldKeys,newKeys))return!0;for(var i=0;i<newKeys.length;i++){var key=newKeys[i];if(a[key]!==b[key])return!0}return!1}(keys,this.value,map)),valueHasChanged&&(finalValue=bulidMapFromValues(this._name,trimValues,parseOutUnits,allowSubKeys,map,keys));break;case 4:case 8:var values=Array.from(this._lastSetValue);if(!valueHasChanged)valueHasChanged=!arrayEqualsArray(Object.keys(this.value),values);valueHasChanged&&(finalValue=bulidMapFromValues(this._name,trimValues,parseOutUnits,allowSubKeys,values));break;default:finalValue=null}return valueHasChanged&&(this.value=finalValue),valueHasChanged},StylingDiffer}();function bulidMapFromValues(errorPrefix,trim,parseOutUnits,allowSubKeys,values,keys){var map={};if(keys)for(var i=0;i<keys.length;i++){var key=keys[i];setMapValues(map,key=trim?key.trim():key,value=values[key],parseOutUnits,allowSubKeys)}else for(i=0;i<values.length;i++){var value;assertValidValue(errorPrefix,value=values[i]),setMapValues(map,value=trim?value.trim():value,!0,!1,allowSubKeys)}return map}function assertValidValue(errorPrefix,value){if("string"!=typeof value)throw new Error(errorPrefix+" can only toggle CSS classes expressed as strings, got "+value)}function setMapValues(map,key,value,parseOutUnits,allowSubKeys){if(allowSubKeys&&key.indexOf(" ")>0)for(var innerKeys=key.split(/\s+/g),j=0;j<innerKeys.length;j++)setIndividualMapValue(map,innerKeys[j],value,parseOutUnits);else setIndividualMapValue(map,key,value,parseOutUnits)}function setIndividualMapValue(map,key,value,parseOutUnits){if(parseOutUnits){var values=function normalizeStyleKeyAndValue(key,value){var index=key.indexOf(".");if(index>0){var unit=key.substr(index+1);key=key.substring(0,index),null!=value&&(value+=unit)}return{key:key,value:value}}(key,value);value=values.value,key=values.key}map[key]=value}function arrayEqualsArray(a,b){if(a&&b){if(a.length!==b.length)return!1;for(var i=0;i<a.length;i++)if(-1===b.indexOf(a[i]))return!1;return!0}return!1}var NgClassImpl=function NgClassImpl(){},common_NgClassR2Impl=function(){function NgClassR2Impl(_iterableDiffers,_keyValueDiffers,_ngEl,_renderer){this._iterableDiffers=_iterableDiffers,this._keyValueDiffers=_keyValueDiffers,this._ngEl=_ngEl,this._renderer=_renderer,this._initialClasses=[]}return NgClassR2Impl.prototype.getValue=function(){return null},NgClassR2Impl.prototype.setClass=function(value){this._removeClasses(this._initialClasses),this._initialClasses="string"==typeof value?value.split(/\s+/):[],this._applyClasses(this._initialClasses),this._applyClasses(this._rawClass)},NgClassR2Impl.prototype.setNgClass=function(value){this._removeClasses(this._rawClass),this._applyClasses(this._initialClasses),this._iterableDiffer=null,this._keyValueDiffer=null,this._rawClass="string"==typeof value?value.split(/\s+/):value,this._rawClass&&(Object(core.Ib)(this._rawClass)?this._iterableDiffer=this._iterableDiffers.find(this._rawClass).create():this._keyValueDiffer=this._keyValueDiffers.find(this._rawClass).create())},NgClassR2Impl.prototype.applyChanges=function(){if(this._iterableDiffer){var iterableChanges=this._iterableDiffer.diff(this._rawClass);iterableChanges&&this._applyIterableChanges(iterableChanges)}else if(this._keyValueDiffer){var keyValueChanges=this._keyValueDiffer.diff(this._rawClass);keyValueChanges&&this._applyKeyValueChanges(keyValueChanges)}},NgClassR2Impl.prototype._applyKeyValueChanges=function(changes){var _this=this;changes.forEachAddedItem(function(record){return _this._toggleClass(record.key,record.currentValue)}),changes.forEachChangedItem(function(record){return _this._toggleClass(record.key,record.currentValue)}),changes.forEachRemovedItem(function(record){record.previousValue&&_this._toggleClass(record.key,!1)})},NgClassR2Impl.prototype._applyIterableChanges=function(changes){var _this=this;changes.forEachAddedItem(function(record){if("string"!=typeof record.item)throw new Error("NgClass can only toggle CSS classes expressed as strings, got "+Object(core.Xb)(record.item));_this._toggleClass(record.item,!0)}),changes.forEachRemovedItem(function(record){return _this._toggleClass(record.item,!1)})},NgClassR2Impl.prototype._applyClasses=function(rawClassVal){var _this=this;rawClassVal&&(Array.isArray(rawClassVal)||rawClassVal instanceof Set?rawClassVal.forEach(function(klass){return _this._toggleClass(klass,!0)}):Object.keys(rawClassVal).forEach(function(klass){return _this._toggleClass(klass,!!rawClassVal[klass])}))},NgClassR2Impl.prototype._removeClasses=function(rawClassVal){var _this=this;rawClassVal&&(Array.isArray(rawClassVal)||rawClassVal instanceof Set?rawClassVal.forEach(function(klass){return _this._toggleClass(klass,!1)}):Object.keys(rawClassVal).forEach(function(klass){return _this._toggleClass(klass,!1)}))},NgClassR2Impl.prototype._toggleClass=function(klass,enabled){var _this=this;(klass=klass.trim())&&klass.split(/\s+/g).forEach(function(klass){enabled?_this._renderer.addClass(_this._ngEl.nativeElement,klass):_this._renderer.removeClass(_this._ngEl.nativeElement,klass)})},NgClassR2Impl=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.d)("design:paramtypes",[core.A,core.B,core.r,core.R])],NgClassR2Impl)}(),NgClassImplProvider=(function(){function NgClassR3Impl(){this._value=null,this._ngClassDiffer=new StylingDiffer("NgClass",23),this._classStringDiffer=null}NgClassR3Impl.prototype.getValue=function(){return this._value},NgClassR3Impl.prototype.setClass=function(value){(value||this._classStringDiffer)&&(this._classStringDiffer=this._classStringDiffer||new StylingDiffer("class",20),this._classStringDiffer.setValue(value))},NgClassR3Impl.prototype.setNgClass=function(value){this._ngClassDiffer.setValue(value)},NgClassR3Impl.prototype.applyChanges=function(){var classChanged=!!this._classStringDiffer&&this._classStringDiffer.hasValueChanged(),ngClassChanged=this._ngClassDiffer.hasValueChanged();if(classChanged||ngClassChanged){var value=this._ngClassDiffer.value;if(this._classStringDiffer){var classValue=this._classStringDiffer.value;classValue&&(value=value?Object(tslib_es6.a)({},classValue,value):classValue)}this._value=value}},NgClassR3Impl=Object(tslib_es6.b)([Object(core.w)()],NgClassR3Impl)}(),{provide:NgClassImpl,useClass:common_NgClassR2Impl}),common_NgClass=(Object(core.bc)({type:function(){},selectors:null,factory:function(){},hostBindings:function(rf,ctx,elIndex){1&rf&&Object(core.dc)(),2&rf&&(Object(core.fc)(ctx.getValue()),Object(core.ec)())}}),function(_super){function NgClass(delegate){return _super.call(this,delegate)||this}return Object(tslib_es6.c)(NgClass,_super),Object.defineProperty(NgClass.prototype,"klass",{set:function(value){this._delegate.setClass(value)},enumerable:!0,configurable:!0}),Object.defineProperty(NgClass.prototype,"ngClass",{set:function(value){this._delegate.setNgClass(value)},enumerable:!0,configurable:!0}),NgClass.prototype.ngDoCheck=function(){this._delegate.applyChanges()},Object(tslib_es6.b)([Object(core.z)("class"),Object(tslib_es6.d)("design:type",String),Object(tslib_es6.d)("design:paramtypes",[String])],NgClass.prototype,"klass",null),Object(tslib_es6.b)([Object(core.z)("ngClass"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgClass.prototype,"ngClass",null),NgClass=Object(tslib_es6.b)([Object(core.q)({selector:"[ngClass]",providers:[NgClassImplProvider]}),Object(tslib_es6.d)("design:paramtypes",[NgClassImpl])],NgClass)}(function(){function NgClassBase(_delegate){this._delegate=_delegate}return NgClassBase.prototype.getValue=function(){return this._delegate.getValue()},NgClassBase.ngDirectiveDef=void 0,NgClassBase}())),common_NgComponentOutlet=function(){function NgComponentOutlet(_viewContainerRef){this._viewContainerRef=_viewContainerRef,this._componentRef=null,this._moduleRef=null}return NgComponentOutlet.prototype.ngOnChanges=function(changes){if(this._viewContainerRef.clear(),this._componentRef=null,this.ngComponentOutlet){var elInjector=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;if(changes.ngComponentOutletNgModuleFactory)if(this._moduleRef&&this._moduleRef.destroy(),this.ngComponentOutletNgModuleFactory){var parentModule=elInjector.get(core.G);this._moduleRef=this.ngComponentOutletNgModuleFactory.create(parentModule.injector)}else this._moduleRef=null;var componentFactory=(this._moduleRef?this._moduleRef.componentFactoryResolver:elInjector.get(core.o)).resolveComponentFactory(this.ngComponentOutlet);this._componentRef=this._viewContainerRef.createComponent(componentFactory,this._viewContainerRef.length,elInjector,this.ngComponentOutletContent)}},NgComponentOutlet.prototype.ngOnDestroy=function(){this._moduleRef&&this._moduleRef.destroy()},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",core.db)],NgComponentOutlet.prototype,"ngComponentOutlet",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",core.y)],NgComponentOutlet.prototype,"ngComponentOutletInjector",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Array)],NgComponentOutlet.prototype,"ngComponentOutletContent",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",core.F)],NgComponentOutlet.prototype,"ngComponentOutletNgModuleFactory",void 0),NgComponentOutlet=Object(tslib_es6.b)([Object(core.q)({selector:"[ngComponentOutlet]"}),Object(tslib_es6.d)("design:paramtypes",[core.gb])],NgComponentOutlet)}(),NgForOfContext=function(){function NgForOfContext($implicit,ngForOf,index,count){this.$implicit=$implicit,this.ngForOf=ngForOf,this.index=index,this.count=count}return Object.defineProperty(NgForOfContext.prototype,"first",{get:function(){return 0===this.index},enumerable:!0,configurable:!0}),Object.defineProperty(NgForOfContext.prototype,"last",{get:function(){return this.index===this.count-1},enumerable:!0,configurable:!0}),Object.defineProperty(NgForOfContext.prototype,"even",{get:function(){return this.index%2==0},enumerable:!0,configurable:!0}),Object.defineProperty(NgForOfContext.prototype,"odd",{get:function(){return!this.even},enumerable:!0,configurable:!0}),NgForOfContext}(),common_NgForOf=function(){function NgForOf(_viewContainer,_template,_differs){this._viewContainer=_viewContainer,this._template=_template,this._differs=_differs,this._ngForOfDirty=!0,this._differ=null}return Object.defineProperty(NgForOf.prototype,"ngForOf",{set:function(ngForOf){this._ngForOf=ngForOf,this._ngForOfDirty=!0},enumerable:!0,configurable:!0}),Object.defineProperty(NgForOf.prototype,"ngForTrackBy",{get:function(){return this._trackByFn},set:function(fn){Object(core.nb)()&&null!=fn&&"function"!=typeof fn&&console&&console.warn&&console.warn("trackBy must be a function, but received "+JSON.stringify(fn)+". See https://angular.io/docs/ts/latest/api/common/index/NgFor-directive.html#!#change-propagation for more information."),this._trackByFn=fn},enumerable:!0,configurable:!0}),Object.defineProperty(NgForOf.prototype,"ngForTemplate",{set:function(value){value&&(this._template=value)},enumerable:!0,configurable:!0}),NgForOf.prototype.ngDoCheck=function(){if(this._ngForOfDirty){this._ngForOfDirty=!1;var value=this._ngForOf;if(!this._differ&&value)try{this._differ=this._differs.find(value).create(this.ngForTrackBy)}catch(_a){throw new Error("Cannot find a differ supporting object '"+value+"' of type '"+function getTypeName(type){return type.name||typeof type}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(value)+"'. NgFor only supports binding to Iterables such as Arrays.")}}if(this._differ){var changes=this._differ.diff(this._ngForOf);changes&&this._applyChanges(changes)}},NgForOf.prototype._applyChanges=function(changes){var _this=this,insertTuples=[];changes.forEachOperation(function(item,adjustedPreviousIndex,currentIndex){if(null==item.previousIndex){var view=_this._viewContainer.createEmbeddedView(_this._template,new NgForOfContext(null,_this._ngForOf,-1,-1),currentIndex),tuple=new RecordViewTuple(item,view);insertTuples.push(tuple)}else if(null==currentIndex)_this._viewContainer.remove(adjustedPreviousIndex);else{view=_this._viewContainer.get(adjustedPreviousIndex);_this._viewContainer.move(view,currentIndex);tuple=new RecordViewTuple(item,view);insertTuples.push(tuple)}});for(var i=0;i<insertTuples.length;i++)this._perViewChange(insertTuples[i].view,insertTuples[i].record);i=0;for(var ilen=this._viewContainer.length;i<ilen;i++){var viewRef=this._viewContainer.get(i);viewRef.context.index=i,viewRef.context.count=ilen,viewRef.context.ngForOf=this._ngForOf}changes.forEachIdentityChange(function(record){_this._viewContainer.get(record.currentIndex).context.$implicit=record.item})},NgForOf.prototype._perViewChange=function(view,record){view.context.$implicit=record.item},NgForOf.ngTemplateContextGuard=function(dir,ctx){return!0},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgForOf.prototype,"ngForOf",null),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Function),Object(tslib_es6.d)("design:paramtypes",[Function])],NgForOf.prototype,"ngForTrackBy",null),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",core.bb),Object(tslib_es6.d)("design:paramtypes",[core.bb])],NgForOf.prototype,"ngForTemplate",null),NgForOf=Object(tslib_es6.b)([Object(core.q)({selector:"[ngFor][ngForOf]"}),Object(tslib_es6.d)("design:paramtypes",[core.gb,core.bb,core.A])],NgForOf)}(),RecordViewTuple=function RecordViewTuple(record,view){this.record=record,this.view=view};var common_NgIf=function(){function NgIf(_viewContainer,templateRef){this._viewContainer=_viewContainer,this._context=new NgIfContext,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=templateRef}return Object.defineProperty(NgIf.prototype,"ngIf",{set:function(condition){this._context.$implicit=this._context.ngIf=condition,this._updateView()},enumerable:!0,configurable:!0}),Object.defineProperty(NgIf.prototype,"ngIfThen",{set:function(templateRef){assertTemplate("ngIfThen",templateRef),this._thenTemplateRef=templateRef,this._thenViewRef=null,this._updateView()},enumerable:!0,configurable:!0}),Object.defineProperty(NgIf.prototype,"ngIfElse",{set:function(templateRef){assertTemplate("ngIfElse",templateRef),this._elseTemplateRef=templateRef,this._elseViewRef=null,this._updateView()},enumerable:!0,configurable:!0}),NgIf.prototype._updateView=function(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))},NgIf.ngTemplateGuard_ngIf=function(dir,expr){return!0},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgIf.prototype,"ngIf",null),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgIf.prototype,"ngIfThen",null),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgIf.prototype,"ngIfElse",null),NgIf=Object(tslib_es6.b)([Object(core.q)({selector:"[ngIf]"}),Object(tslib_es6.d)("design:paramtypes",[core.gb,core.bb])],NgIf)}(),NgIfContext=function NgIfContext(){this.$implicit=null,this.ngIf=null};function assertTemplate(property,templateRef){if(!!(templateRef&&!templateRef.createEmbeddedView))throw new Error(property+" must be a TemplateRef, but received '"+Object(core.Xb)(templateRef)+"'.")}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var SwitchView=function(){function SwitchView(_viewContainerRef,_templateRef){this._viewContainerRef=_viewContainerRef,this._templateRef=_templateRef,this._created=!1}return SwitchView.prototype.create=function(){this._created=!0,this._viewContainerRef.createEmbeddedView(this._templateRef)},SwitchView.prototype.destroy=function(){this._created=!1,this._viewContainerRef.clear()},SwitchView.prototype.enforceState=function(created){created&&!this._created?this.create():!created&&this._created&&this.destroy()},SwitchView}(),common_NgSwitch=function(){function NgSwitch(){this._defaultUsed=!1,this._caseCount=0,this._lastCaseCheckIndex=0,this._lastCasesMatched=!1}return Object.defineProperty(NgSwitch.prototype,"ngSwitch",{set:function(newValue){this._ngSwitch=newValue,0===this._caseCount&&this._updateDefaultCases(!0)},enumerable:!0,configurable:!0}),NgSwitch.prototype._addCase=function(){return this._caseCount++},NgSwitch.prototype._addDefault=function(view){this._defaultViews||(this._defaultViews=[]),this._defaultViews.push(view)},NgSwitch.prototype._matchCase=function(value){var matched=value==this._ngSwitch;return this._lastCasesMatched=this._lastCasesMatched||matched,this._lastCaseCheckIndex++,this._lastCaseCheckIndex===this._caseCount&&(this._updateDefaultCases(!this._lastCasesMatched),this._lastCaseCheckIndex=0,this._lastCasesMatched=!1),matched},NgSwitch.prototype._updateDefaultCases=function(useDefault){if(this._defaultViews&&useDefault!==this._defaultUsed){this._defaultUsed=useDefault;for(var i=0;i<this._defaultViews.length;i++){this._defaultViews[i].enforceState(useDefault)}}},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgSwitch.prototype,"ngSwitch",null),NgSwitch=Object(tslib_es6.b)([Object(core.q)({selector:"[ngSwitch]"})],NgSwitch)}(),common_NgSwitchCase=function(){function NgSwitchCase(viewContainer,templateRef,ngSwitch){this.ngSwitch=ngSwitch,ngSwitch._addCase(),this._view=new SwitchView(viewContainer,templateRef)}return NgSwitchCase.prototype.ngDoCheck=function(){this._view.enforceState(this.ngSwitch._matchCase(this.ngSwitchCase))},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object)],NgSwitchCase.prototype,"ngSwitchCase",void 0),NgSwitchCase=Object(tslib_es6.b)([Object(core.q)({selector:"[ngSwitchCase]"}),Object(tslib_es6.e)(2,Object(core.u)()),Object(tslib_es6.d)("design:paramtypes",[core.gb,core.bb,common_NgSwitch])],NgSwitchCase)}(),common_NgSwitchDefault=function(){function NgSwitchDefault(viewContainer,templateRef,ngSwitch){ngSwitch._addDefault(new SwitchView(viewContainer,templateRef))}return NgSwitchDefault=Object(tslib_es6.b)([Object(core.q)({selector:"[ngSwitchDefault]"}),Object(tslib_es6.e)(2,Object(core.u)()),Object(tslib_es6.d)("design:paramtypes",[core.gb,core.bb,common_NgSwitch])],NgSwitchDefault)}(),common_NgPlural=function(){function NgPlural(_localization){this._localization=_localization,this._caseViews={}}return Object.defineProperty(NgPlural.prototype,"ngPlural",{set:function(value){this._switchValue=value,this._updateView()},enumerable:!0,configurable:!0}),NgPlural.prototype.addCase=function(value,switchView){this._caseViews[value]=switchView},NgPlural.prototype._updateView=function(){this._clearViews();var cases=Object.keys(this._caseViews),key=getPluralCategory(this._switchValue,cases,this._localization);this._activateView(this._caseViews[key])},NgPlural.prototype._clearViews=function(){this._activeView&&this._activeView.destroy()},NgPlural.prototype._activateView=function(view){view&&(this._activeView=view,this._activeView.create())},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Number),Object(tslib_es6.d)("design:paramtypes",[Number])],NgPlural.prototype,"ngPlural",null),NgPlural=Object(tslib_es6.b)([Object(core.q)({selector:"[ngPlural]"}),Object(tslib_es6.d)("design:paramtypes",[NgLocalization])],NgPlural)}(),common_NgPluralCase=function(){function NgPluralCase(value,template,viewContainer,ngPlural){this.value=value;var isANumber=!isNaN(Number(value));ngPlural.addCase(isANumber?"="+value:value,new SwitchView(viewContainer,template))}return NgPluralCase=Object(tslib_es6.b)([Object(core.q)({selector:"[ngPluralCase]"}),Object(tslib_es6.e)(0,Object(core.g)("ngPluralCase")),Object(tslib_es6.e)(3,Object(core.u)()),Object(tslib_es6.d)("design:paramtypes",[String,core.bb,core.gb,common_NgPlural])],NgPluralCase)}(),NgStyleImpl=function NgStyleImpl(){},common_NgStyleR2Impl=function(){function NgStyleR2Impl(_ngEl,_differs,_renderer){this._ngEl=_ngEl,this._differs=_differs,this._renderer=_renderer}return NgStyleR2Impl.prototype.getValue=function(){return null},NgStyleR2Impl.prototype.setNgStyle=function(values){this._ngStyle=values,!this._differ&&values&&(this._differ=this._differs.find(values).create())},NgStyleR2Impl.prototype.applyChanges=function(){if(this._differ){var changes=this._differ.diff(this._ngStyle);changes&&this._applyChanges(changes)}},NgStyleR2Impl.prototype._applyChanges=function(changes){var _this=this;changes.forEachRemovedItem(function(record){return _this._setStyle(record.key,null)}),changes.forEachAddedItem(function(record){return _this._setStyle(record.key,record.currentValue)}),changes.forEachChangedItem(function(record){return _this._setStyle(record.key,record.currentValue)})},NgStyleR2Impl.prototype._setStyle=function(nameAndUnit,value){var _a=Object(tslib_es6.f)(nameAndUnit.split("."),2),name=_a[0],unit=_a[1];null!=(value=null!=value&&unit?""+value+unit:value)?this._renderer.setStyle(this._ngEl.nativeElement,name,value):this._renderer.removeStyle(this._ngEl.nativeElement,name)},NgStyleR2Impl=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.d)("design:paramtypes",[core.r,core.B,core.R])],NgStyleR2Impl)}(),NgStyleImplProvider=(function(){function NgStyleR3Impl(){this._differ=new StylingDiffer("NgStyle",8),this._value=null}NgStyleR3Impl.prototype.getValue=function(){return this._value},NgStyleR3Impl.prototype.setNgStyle=function(value){this._differ.setValue(value)},NgStyleR3Impl.prototype.applyChanges=function(){this._differ.hasValueChanged()&&(this._value=this._differ.value)},NgStyleR3Impl=Object(tslib_es6.b)([Object(core.w)()],NgStyleR3Impl)}(),{provide:NgStyleImpl,useClass:common_NgStyleR2Impl}),common_NgStyle=(Object(core.bc)({type:function(){},selectors:null,factory:function(){},hostBindings:function(rf,ctx,elIndex){1&rf&&Object(core.dc)(),2&rf&&(Object(core.fc)(null,ctx.getValue()),Object(core.ec)())}}),function(_super){function NgStyle(delegate){return _super.call(this,delegate)||this}return Object(tslib_es6.c)(NgStyle,_super),Object.defineProperty(NgStyle.prototype,"ngStyle",{set:function(value){this._delegate.setNgStyle(value)},enumerable:!0,configurable:!0}),NgStyle.prototype.ngDoCheck=function(){this._delegate.applyChanges()},Object(tslib_es6.b)([Object(core.z)("ngStyle"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgStyle.prototype,"ngStyle",null),NgStyle=Object(tslib_es6.b)([Object(core.q)({selector:"[ngStyle]",providers:[NgStyleImplProvider]}),Object(tslib_es6.d)("design:paramtypes",[NgStyleImpl])],NgStyle)}(function(){function NgStyleBase(_delegate){this._delegate=_delegate}return NgStyleBase.prototype.getValue=function(){return this._delegate.getValue()},NgStyleBase.ngDirectiveDef=void 0,NgStyleBase}())),COMMON_DIRECTIVES=[common_NgClass,common_NgComponentOutlet,common_NgForOf,common_NgIf,function(){function NgTemplateOutlet(_viewContainerRef){this._viewContainerRef=_viewContainerRef,this._viewRef=null,this.ngTemplateOutletContext=null,this.ngTemplateOutlet=null}return NgTemplateOutlet.prototype.ngOnChanges=function(changes){this._shouldRecreateView(changes)?(this._viewRef&&this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._viewRef)),this.ngTemplateOutlet&&(this._viewRef=this._viewContainerRef.createEmbeddedView(this.ngTemplateOutlet,this.ngTemplateOutletContext))):this._viewRef&&this.ngTemplateOutletContext&&this._updateExistingContext(this.ngTemplateOutletContext)},NgTemplateOutlet.prototype._shouldRecreateView=function(changes){var ctxChange=changes.ngTemplateOutletContext;return!!changes.ngTemplateOutlet||ctxChange&&this._hasContextShapeChanged(ctxChange)},NgTemplateOutlet.prototype._hasContextShapeChanged=function(ctxChange){var e_1,_a,prevCtxKeys=Object.keys(ctxChange.previousValue||{}),currCtxKeys=Object.keys(ctxChange.currentValue||{});if(prevCtxKeys.length===currCtxKeys.length){try{for(var currCtxKeys_1=Object(tslib_es6.h)(currCtxKeys),currCtxKeys_1_1=currCtxKeys_1.next();!currCtxKeys_1_1.done;currCtxKeys_1_1=currCtxKeys_1.next()){var propName=currCtxKeys_1_1.value;if(-1===prevCtxKeys.indexOf(propName))return!0}}catch(e_1_1){e_1={error:e_1_1}}finally{try{currCtxKeys_1_1&&!currCtxKeys_1_1.done&&(_a=currCtxKeys_1.return)&&_a.call(currCtxKeys_1)}finally{if(e_1)throw e_1.error}}return!1}return!0},NgTemplateOutlet.prototype._updateExistingContext=function(ctx){var e_2,_a;try{for(var _b=Object(tslib_es6.h)(Object.keys(ctx)),_c=_b.next();!_c.done;_c=_b.next()){var propName=_c.value;this._viewRef.context[propName]=this.ngTemplateOutletContext[propName]}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object)],NgTemplateOutlet.prototype,"ngTemplateOutletContext",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object)],NgTemplateOutlet.prototype,"ngTemplateOutlet",void 0),NgTemplateOutlet=Object(tslib_es6.b)([Object(core.q)({selector:"[ngTemplateOutlet]"}),Object(tslib_es6.d)("design:paramtypes",[core.gb])],NgTemplateOutlet)}(),common_NgStyle,common_NgSwitch,common_NgSwitchCase,common_NgSwitchDefault,common_NgPlural,common_NgPluralCase];
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function invalidPipeArgumentError(type,value){return Error("InvalidPipeArgument: '"+value+"' for pipe '"+Object(core.Xb)(type)+"'")}var NumberFormatter=function(){function NumberFormatter(){}return NumberFormatter.format=function(num,locale,style,opts){void 0===opts&&(opts={});var minimumIntegerDigits=opts.minimumIntegerDigits,minimumFractionDigits=opts.minimumFractionDigits,maximumFractionDigits=opts.maximumFractionDigits,currency=opts.currency,_a=opts.currencyAsSymbol,currencyAsSymbol=void 0!==_a&&_a,options={minimumIntegerDigits:minimumIntegerDigits,minimumFractionDigits:minimumFractionDigits,maximumFractionDigits:maximumFractionDigits,style:NumberFormatStyle[style].toLowerCase()};return style==NumberFormatStyle.Currency&&(options.currency="string"==typeof currency?currency:void 0,options.currencyDisplay=currencyAsSymbol?"symbol":"code"),new Intl.NumberFormat(locale,options).format(num)},NumberFormatter}(),DATE_FORMATS_SPLIT$1=/((?:[^yMLdHhmsazZEwGjJ']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|J+|j+|m+|s+|a|z|Z|G+|w+))(.*)/,PATTERN_ALIASES={yMMMdjms:datePartGetterFactory(combine([digitCondition("year",1),nameCondition("month",3),digitCondition("day",1),digitCondition("hour",1),digitCondition("minute",1),digitCondition("second",1)])),yMdjm:datePartGetterFactory(combine([digitCondition("year",1),digitCondition("month",1),digitCondition("day",1),digitCondition("hour",1),digitCondition("minute",1)])),yMMMMEEEEd:datePartGetterFactory(combine([digitCondition("year",1),nameCondition("month",4),nameCondition("weekday",4),digitCondition("day",1)])),yMMMMd:datePartGetterFactory(combine([digitCondition("year",1),nameCondition("month",4),digitCondition("day",1)])),yMMMd:datePartGetterFactory(combine([digitCondition("year",1),nameCondition("month",3),digitCondition("day",1)])),yMd:datePartGetterFactory(combine([digitCondition("year",1),digitCondition("month",1),digitCondition("day",1)])),jms:datePartGetterFactory(combine([digitCondition("hour",1),digitCondition("second",1),digitCondition("minute",1)])),jm:datePartGetterFactory(combine([digitCondition("hour",1),digitCondition("minute",1)]))},DATE_FORMATS$1={yyyy:datePartGetterFactory(digitCondition("year",4)),yy:datePartGetterFactory(digitCondition("year",2)),y:datePartGetterFactory(digitCondition("year",1)),MMMM:datePartGetterFactory(nameCondition("month",4)),MMM:datePartGetterFactory(nameCondition("month",3)),MM:datePartGetterFactory(digitCondition("month",2)),M:datePartGetterFactory(digitCondition("month",1)),LLLL:datePartGetterFactory(nameCondition("month",4)),L:datePartGetterFactory(nameCondition("month",1)),dd:datePartGetterFactory(digitCondition("day",2)),d:datePartGetterFactory(digitCondition("day",1)),HH:digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition("hour",2),!1)))),H:hourExtractor(datePartGetterFactory(hour12Modify(digitCondition("hour",1),!1))),hh:digitModifier(hourExtractor(datePartGetterFactory(hour12Modify(digitCondition("hour",2),!0)))),h:hourExtractor(datePartGetterFactory(hour12Modify(digitCondition("hour",1),!0))),jj:datePartGetterFactory(digitCondition("hour",2)),j:datePartGetterFactory(digitCondition("hour",1)),mm:digitModifier(datePartGetterFactory(digitCondition("minute",2))),m:datePartGetterFactory(digitCondition("minute",1)),ss:digitModifier(datePartGetterFactory(digitCondition("second",2))),s:datePartGetterFactory(digitCondition("second",1)),sss:datePartGetterFactory(digitCondition("second",3)),EEEE:datePartGetterFactory(nameCondition("weekday",4)),EEE:datePartGetterFactory(nameCondition("weekday",3)),EE:datePartGetterFactory(nameCondition("weekday",2)),E:datePartGetterFactory(nameCondition("weekday",1)),a:function hourClockExtractor(inner){return function(date,locale){return inner(date,locale).split(" ")[1]}}(datePartGetterFactory(hour12Modify(digitCondition("hour",1),!0))),Z:timeZoneGetter$1("short"),z:timeZoneGetter$1("long"),ww:datePartGetterFactory({}),w:datePartGetterFactory({}),G:datePartGetterFactory(nameCondition("era",1)),GG:datePartGetterFactory(nameCondition("era",2)),GGG:datePartGetterFactory(nameCondition("era",3)),GGGG:datePartGetterFactory(nameCondition("era",4))};function digitModifier(inner){return function(date,locale){var result=inner(date,locale);return 1==result.length?"0"+result:result}}function hourExtractor(inner){return function(date,locale){return inner(date,locale).split(" ")[0]}}function intlDateFormat(date,locale,options){return new Intl.DateTimeFormat(locale,options).format(date).replace(/[\u200e\u200f]/g,"")}function timeZoneGetter$1(timezone){var options={hour:"2-digit",hour12:!1,timeZoneName:timezone};return function(date,locale){var result=intlDateFormat(date,locale,options);return result?result.substring(3):""}}function hour12Modify(options,value){return options.hour12=value,options}function digitCondition(prop,len){var result={};return result[prop]=2===len?"2-digit":"numeric",result}function nameCondition(prop,len){var result={};return result[prop]=len<4?len>1?"short":"narrow":"long",result}function combine(options){return options.reduce(function(merged,opt){return Object(tslib_es6.a)({},merged,opt)},{})}function datePartGetterFactory(ret){return function(date,locale){return intlDateFormat(date,locale,ret)}}var DATE_FORMATTER_CACHE=new Map;var DateFormatter=function(){function DateFormatter(){}return DateFormatter.format=function(date,locale,pattern){return function dateFormatter(format,date,locale){var fn=PATTERN_ALIASES[format];if(fn)return fn(date,locale);var cacheKey=format,parts=DATE_FORMATTER_CACHE.get(cacheKey);if(!parts){parts=[];var match=void 0;DATE_FORMATS_SPLIT$1.exec(format);for(var _format=format;_format;)(match=DATE_FORMATS_SPLIT$1.exec(_format))?_format=(parts=parts.concat(match.slice(1))).pop():(parts.push(_format),_format=null);DATE_FORMATTER_CACHE.set(cacheKey,parts)}return parts.reduce(function(text,part){var fn=DATE_FORMATS$1[part];return text+(fn?fn(date,locale):function partToTime(part){return"''"===part?"'":part.replace(/(^'|'$)/g,"").replace(/''/g,"'")}(part))},"")}(pattern,date,locale)},DateFormatter}(),common_DeprecatedDatePipe=function(){function DeprecatedDatePipe(_locale){this._locale=_locale}var DeprecatedDatePipe_1;return DeprecatedDatePipe_1=DeprecatedDatePipe,DeprecatedDatePipe.prototype.transform=function(value,pattern){if(void 0===pattern&&(pattern="mediumDate"),null==value||""===value||value!=value)return null;var date;if("string"==typeof value&&(value=value.trim()),isDate$1(value))date=value;else if(isNaN(value-parseFloat(value)))if("string"==typeof value&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(value)){var _a=Object(tslib_es6.f)(value.split("-").map(function(val){return parseInt(val,10)}),3),y=_a[0],m=_a[1],d=_a[2];date=new Date(y,m-1,d)}else date=new Date(value);else date=new Date(parseFloat(value));if(!isDate$1(date)){var match=void 0;if("string"!=typeof value||!(match=value.match(ISO8601_DATE_REGEX)))throw invalidPipeArgumentError(DeprecatedDatePipe_1,value);date=isoStringToDate(match)}return DateFormatter.format(date,this._locale,DeprecatedDatePipe_1._ALIASES[pattern]||pattern)},DeprecatedDatePipe._ALIASES={medium:"yMMMdjms",short:"yMdjm",fullDate:"yMMMMEEEEd",longDate:"yMMMMd",mediumDate:"yMMMd",shortDate:"yMd",mediumTime:"jms",shortTime:"jm"},DeprecatedDatePipe=DeprecatedDatePipe_1=Object(tslib_es6.b)([Object(core.O)({name:"date",pure:!0}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DeprecatedDatePipe)}();
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
  */function isDate$1(value){return value instanceof Date&&!isNaN(value.valueOf())}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function formatNumber$1(pipe,locale,value,style,digits,currency,currencyAsSymbol){if(void 0===currency&&(currency=null),void 0===currencyAsSymbol&&(currencyAsSymbol=!1),null==value)return null;if("number"!=typeof(value="string"!=typeof value||isNaN(+value-parseFloat(value))?value:+value))throw invalidPipeArgumentError(pipe,value);var minInt,minFraction,maxFraction;if(style!==NumberFormatStyle.Currency&&(minInt=1,minFraction=0,maxFraction=3),digits){var parts=digits.match(NUMBER_FORMAT_REGEXP);if(null===parts)throw new Error(digits+" is not a valid digit info for number pipes");null!=parts[1]&&(minInt=parseIntAutoRadix(parts[1])),null!=parts[3]&&(minFraction=parseIntAutoRadix(parts[3])),null!=parts[5]&&(maxFraction=parseIntAutoRadix(parts[5]))}return NumberFormatter.format(value,locale,style,{minimumIntegerDigits:minInt,minimumFractionDigits:minFraction,maximumFractionDigits:maxFraction,currency:currency,currencyAsSymbol:currencyAsSymbol})}var COMMON_DEPRECATED_I18N_PIPES=[function(){function DeprecatedDecimalPipe(_locale){this._locale=_locale}var DeprecatedDecimalPipe_1;return DeprecatedDecimalPipe_1=DeprecatedDecimalPipe,DeprecatedDecimalPipe.prototype.transform=function(value,digits){return formatNumber$1(DeprecatedDecimalPipe_1,this._locale,value,NumberFormatStyle.Decimal,digits)},DeprecatedDecimalPipe=DeprecatedDecimalPipe_1=Object(tslib_es6.b)([Object(core.O)({name:"number"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DeprecatedDecimalPipe)}(),function(){function DeprecatedPercentPipe(_locale){this._locale=_locale}var DeprecatedPercentPipe_1;return DeprecatedPercentPipe_1=DeprecatedPercentPipe,DeprecatedPercentPipe.prototype.transform=function(value,digits){return formatNumber$1(DeprecatedPercentPipe_1,this._locale,value,NumberFormatStyle.Percent,digits)},DeprecatedPercentPipe=DeprecatedPercentPipe_1=Object(tslib_es6.b)([Object(core.O)({name:"percent"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DeprecatedPercentPipe)}(),function(){function DeprecatedCurrencyPipe(_locale){this._locale=_locale}var DeprecatedCurrencyPipe_1;return DeprecatedCurrencyPipe_1=DeprecatedCurrencyPipe,DeprecatedCurrencyPipe.prototype.transform=function(value,currencyCode,symbolDisplay,digits){return void 0===currencyCode&&(currencyCode="USD"),void 0===symbolDisplay&&(symbolDisplay=!1),formatNumber$1(DeprecatedCurrencyPipe_1,this._locale,value,NumberFormatStyle.Currency,digits,currencyCode,symbolDisplay)},DeprecatedCurrencyPipe=DeprecatedCurrencyPipe_1=Object(tslib_es6.b)([Object(core.O)({name:"currency"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DeprecatedCurrencyPipe)}(),common_DeprecatedDatePipe],ObservableStrategy=function(){function ObservableStrategy(){}return ObservableStrategy.prototype.createSubscription=function(async,updateLatestValue){return async.subscribe({next:updateLatestValue,error:function(e){throw e}})},ObservableStrategy.prototype.dispose=function(subscription){subscription.unsubscribe()},ObservableStrategy.prototype.onDestroy=function(subscription){subscription.unsubscribe()},ObservableStrategy}(),_promiseStrategy=new(function(){function PromiseStrategy(){}return PromiseStrategy.prototype.createSubscription=function(async,updateLatestValue){return async.then(updateLatestValue,function(e){throw e})},PromiseStrategy.prototype.dispose=function(subscription){},PromiseStrategy.prototype.onDestroy=function(subscription){},PromiseStrategy}()),_observableStrategy=new ObservableStrategy,common_AsyncPipe=function(){function AsyncPipe(_ref){this._ref=_ref,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}var AsyncPipe_1;return AsyncPipe_1=AsyncPipe,AsyncPipe.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},AsyncPipe.prototype.transform=function(obj){return this._obj?obj!==this._obj?(this._dispose(),this.transform(obj)):Object(core.Lb)(this._latestValue,this._latestReturnedValue)?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,core.ib.wrap(this._latestValue)):(obj&&this._subscribe(obj),this._latestReturnedValue=this._latestValue,this._latestValue)},AsyncPipe.prototype._subscribe=function(obj){var _this=this;this._obj=obj,this._strategy=this._selectStrategy(obj),this._subscription=this._strategy.createSubscription(obj,function(value){return _this._updateLatestValue(obj,value)})},AsyncPipe.prototype._selectStrategy=function(obj){if(Object(core.Kb)(obj))return _promiseStrategy;if(Object(core.Jb)(obj))return _observableStrategy;throw invalidPipeArgumentError(AsyncPipe_1,obj)},AsyncPipe.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},AsyncPipe.prototype._updateLatestValue=function(async,value){async===this._obj&&(this._latestValue=value,this._ref.markForCheck())},AsyncPipe=AsyncPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"async",pure:!1}),Object(tslib_es6.d)("design:paramtypes",[core.j])],AsyncPipe)}(),common_LowerCasePipe=function(){function LowerCasePipe(){}var LowerCasePipe_1;return LowerCasePipe_1=LowerCasePipe,LowerCasePipe.prototype.transform=function(value){if(!value)return value;if("string"!=typeof value)throw invalidPipeArgumentError(LowerCasePipe_1,value);return value.toLowerCase()},LowerCasePipe=LowerCasePipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"lowercase"})],LowerCasePipe)}(),unicodeWordMatch=/(?:[A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])\S*/g,common_TitleCasePipe=function(){function TitleCasePipe(){}var TitleCasePipe_1;return TitleCasePipe_1=TitleCasePipe,TitleCasePipe.prototype.transform=function(value){if(!value)return value;if("string"!=typeof value)throw invalidPipeArgumentError(TitleCasePipe_1,value);return value.replace(unicodeWordMatch,function(txt){return txt[0].toUpperCase()+txt.substr(1).toLowerCase()})},TitleCasePipe=TitleCasePipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"titlecase"})],TitleCasePipe)}(),common_UpperCasePipe=function(){function UpperCasePipe(){}var UpperCasePipe_1;return UpperCasePipe_1=UpperCasePipe,UpperCasePipe.prototype.transform=function(value){if(!value)return value;if("string"!=typeof value)throw invalidPipeArgumentError(UpperCasePipe_1,value);return value.toUpperCase()},UpperCasePipe=UpperCasePipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"uppercase"})],UpperCasePipe)}(),common_DatePipe=function(){function DatePipe(locale){this.locale=locale}var DatePipe_1;return DatePipe_1=DatePipe,DatePipe.prototype.transform=function(value,format,timezone,locale){if(void 0===format&&(format="mediumDate"),null==value||""===value||value!=value)return null;try{return formatDate(value,format,locale||this.locale,timezone)}catch(error){throw invalidPipeArgumentError(DatePipe_1,error.message)}},DatePipe=DatePipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"date",pure:!0}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DatePipe)}(),_INTERPOLATION_REGEXP=/#/g,common_I18nPluralPipe=function(){function I18nPluralPipe(_localization){this._localization=_localization}var I18nPluralPipe_1;return I18nPluralPipe_1=I18nPluralPipe,I18nPluralPipe.prototype.transform=function(value,pluralMap,locale){if(null==value)return"";if("object"!=typeof pluralMap||null===pluralMap)throw invalidPipeArgumentError(I18nPluralPipe_1,pluralMap);return pluralMap[getPluralCategory(value,Object.keys(pluralMap),this._localization,locale)].replace(_INTERPOLATION_REGEXP,value.toString())},I18nPluralPipe=I18nPluralPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"i18nPlural",pure:!0}),Object(tslib_es6.d)("design:paramtypes",[NgLocalization])],I18nPluralPipe)}(),common_I18nSelectPipe=function(){function I18nSelectPipe(){}var I18nSelectPipe_1;return I18nSelectPipe_1=I18nSelectPipe,I18nSelectPipe.prototype.transform=function(value,mapping){if(null==value)return"";if("object"!=typeof mapping||"string"!=typeof value)throw invalidPipeArgumentError(I18nSelectPipe_1,mapping);return mapping.hasOwnProperty(value)?mapping[value]:mapping.hasOwnProperty("other")?mapping.other:""},I18nSelectPipe=I18nSelectPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"i18nSelect",pure:!0})],I18nSelectPipe)}(),common_JsonPipe=function(){function JsonPipe(){}return JsonPipe.prototype.transform=function(value){return JSON.stringify(value,null,2)},JsonPipe=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"json",pure:!1})],JsonPipe)}();var common_KeyValuePipe=function(){function KeyValuePipe(differs){this.differs=differs,this.keyValues=[]}return KeyValuePipe.prototype.transform=function(input,compareFn){var _this=this;if(void 0===compareFn&&(compareFn=defaultComparator),!input||!(input instanceof Map)&&"object"!=typeof input)return null;this.differ||(this.differ=this.differs.find(input).create());var differChanges=this.differ.diff(input);return differChanges&&(this.keyValues=[],differChanges.forEachItem(function(r){_this.keyValues.push(
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function makeKeyValuePair(key,value){return{key:key,value:value}}(r.key,r.currentValue))}),this.keyValues.sort(compareFn)),this.keyValues},KeyValuePipe=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"keyvalue",pure:!1}),Object(tslib_es6.d)("design:paramtypes",[core.B])],KeyValuePipe)}();function defaultComparator(keyValueA,keyValueB){var a=keyValueA.key,b=keyValueB.key;if(a===b)return 0;if(void 0===a)return 1;if(void 0===b)return-1;if(null===a)return 1;if(null===b)return-1;if("string"==typeof a&&"string"==typeof b)return a<b?-1:1;if("number"==typeof a&&"number"==typeof b)return a-b;if("boolean"==typeof a&&"boolean"==typeof b)return a<b?-1:1;var aString=String(a),bString=String(b);return aString==bString?0:aString<bString?-1:1}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var common_DecimalPipe=function(){function DecimalPipe(_locale){this._locale=_locale}var DecimalPipe_1;return DecimalPipe_1=DecimalPipe,DecimalPipe.prototype.transform=function(value,digitsInfo,locale){if(isEmpty(value))return null;locale=locale||this._locale;try{return function formatNumber(value,locale,digitsInfo){return formatNumberToLocaleString(value,parseNumberFormat(getLocaleNumberFormat(locale,NumberFormatStyle.Decimal),getLocaleNumberSymbol(locale,NumberSymbol.MinusSign)),locale,NumberSymbol.Group,NumberSymbol.Decimal,digitsInfo)}(strToNumber(value),locale,digitsInfo)}catch(error){throw invalidPipeArgumentError(DecimalPipe_1,error.message)}},DecimalPipe=DecimalPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"number"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],DecimalPipe)}(),common_PercentPipe=function(){function PercentPipe(_locale){this._locale=_locale}var PercentPipe_1;return PercentPipe_1=PercentPipe,PercentPipe.prototype.transform=function(value,digitsInfo,locale){if(isEmpty(value))return null;locale=locale||this._locale;try{return function formatPercent(value,locale,digitsInfo){return formatNumberToLocaleString(value,parseNumberFormat(getLocaleNumberFormat(locale,NumberFormatStyle.Percent),getLocaleNumberSymbol(locale,NumberSymbol.MinusSign)),locale,NumberSymbol.Group,NumberSymbol.Decimal,digitsInfo,!0).replace(new RegExp(PERCENT_CHAR,"g"),getLocaleNumberSymbol(locale,NumberSymbol.PercentSign))}(strToNumber(value),locale,digitsInfo)}catch(error){throw invalidPipeArgumentError(PercentPipe_1,error.message)}},PercentPipe=PercentPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"percent"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],PercentPipe)}(),common_CurrencyPipe=function(){function CurrencyPipe(_locale){this._locale=_locale}var CurrencyPipe_1;return CurrencyPipe_1=CurrencyPipe,CurrencyPipe.prototype.transform=function(value,currencyCode,display,digitsInfo,locale){if(void 0===display&&(display="symbol"),isEmpty(value))return null;locale=locale||this._locale,"boolean"==typeof display&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),display=display?"symbol":"code");var currency=currencyCode||"USD";"code"!==display&&(currency="symbol"===display||"symbol-narrow"===display?getCurrencySymbol(currency,"symbol"===display?"wide":"narrow",locale):display);try{return formatCurrency(strToNumber(value),locale,currency,currencyCode,digitsInfo)}catch(error){throw invalidPipeArgumentError(CurrencyPipe_1,error.message)}},CurrencyPipe=CurrencyPipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"currency"}),Object(tslib_es6.e)(0,Object(core.v)(core.C)),Object(tslib_es6.d)("design:paramtypes",[String])],CurrencyPipe)}();function isEmpty(value){return null==value||""===value||value!=value}function strToNumber(value){if("string"==typeof value&&!isNaN(Number(value)-parseFloat(value)))return Number(value);if("number"!=typeof value)throw new Error(value+" is not a number");return value}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var COMMON_PIPES=[common_AsyncPipe,common_UpperCasePipe,common_LowerCasePipe,common_JsonPipe,function(){function SlicePipe(){}var SlicePipe_1;return SlicePipe_1=SlicePipe,SlicePipe.prototype.transform=function(value,start,end){if(null==value)return value;if(!this.supports(value))throw invalidPipeArgumentError(SlicePipe_1,value);return value.slice(start,end)},SlicePipe.prototype.supports=function(obj){return"string"==typeof obj||Array.isArray(obj)},SlicePipe=SlicePipe_1=Object(tslib_es6.b)([Object(core.w)(),Object(core.O)({name:"slice",pure:!1})],SlicePipe)}(),common_DecimalPipe,common_PercentPipe,common_TitleCasePipe,common_CurrencyPipe,common_DatePipe,common_I18nPluralPipe,common_I18nSelectPipe,common_KeyValuePipe],common_CommonModule=function(){function CommonModule(){}return CommonModule=Object(tslib_es6.b)([Object(core.E)({declarations:[COMMON_DIRECTIVES,COMMON_PIPES],exports:[COMMON_DIRECTIVES,COMMON_PIPES],providers:[{provide:NgLocalization,useClass:common_NgLocaleLocalization}]})],CommonModule)}(),ɵ0$2=function getPluralCase(locale,nLike){"string"==typeof nLike&&(nLike=parseInt(nLike,10));var n=nLike,nDecimal=n.toString().replace(/^[^.]*\.?/,""),i=Math.floor(Math.abs(n)),v=nDecimal.length,f=parseInt(nDecimal,10),t=parseInt(n.toString().replace(/^[^.]*\.?|0+$/g,""),10)||0;switch(locale.split("-")[0].toLowerCase()){case"af":case"asa":case"az":case"bem":case"bez":case"bg":case"brx":case"ce":case"cgg":case"chr":case"ckb":case"ee":case"el":case"eo":case"es":case"eu":case"fo":case"fur":case"gsw":case"ha":case"haw":case"hu":case"jgo":case"jmc":case"ka":case"kk":case"kkj":case"kl":case"ks":case"ksb":case"ky":case"lb":case"lg":case"mas":case"mgo":case"ml":case"mn":case"nb":case"nd":case"ne":case"nn":case"nnh":case"nyn":case"om":case"or":case"os":case"ps":case"rm":case"rof":case"rwk":case"saq":case"seh":case"sn":case"so":case"sq":case"ta":case"te":case"teo":case"tk":case"tr":case"ug":case"uz":case"vo":case"vun":case"wae":case"xog":return 1===n?Plural.One:Plural.Other;case"ak":case"ln":case"mg":case"pa":case"ti":return n===Math.floor(n)&&n>=0&&n<=1?Plural.One:Plural.Other;case"am":case"as":case"bn":case"fa":case"gu":case"hi":case"kn":case"mr":case"zu":return 0===i||1===n?Plural.One:Plural.Other;case"ar":return 0===n?Plural.Zero:1===n?Plural.One:2===n?Plural.Two:n%100===Math.floor(n%100)&&n%100>=3&&n%100<=10?Plural.Few:n%100===Math.floor(n%100)&&n%100>=11&&n%100<=99?Plural.Many:Plural.Other;case"ast":case"ca":case"de":case"en":case"et":case"fi":case"fy":case"gl":case"it":case"nl":case"sv":case"sw":case"ur":case"yi":return 1===i&&0===v?Plural.One:Plural.Other;case"be":return n%10==1&&n%100!=11?Plural.One:n%10===Math.floor(n%10)&&n%10>=2&&n%10<=4&&!(n%100>=12&&n%100<=14)?Plural.Few:n%10==0||n%10===Math.floor(n%10)&&n%10>=5&&n%10<=9||n%100===Math.floor(n%100)&&n%100>=11&&n%100<=14?Plural.Many:Plural.Other;case"br":return n%10==1&&n%100!=11&&n%100!=71&&n%100!=91?Plural.One:n%10==2&&n%100!=12&&n%100!=72&&n%100!=92?Plural.Two:n%10===Math.floor(n%10)&&(n%10>=3&&n%10<=4||n%10==9)&&!(n%100>=10&&n%100<=19||n%100>=70&&n%100<=79||n%100>=90&&n%100<=99)?Plural.Few:0!==n&&n%1e6==0?Plural.Many:Plural.Other;case"bs":case"hr":case"sr":return 0===v&&i%10==1&&i%100!=11||f%10==1&&f%100!=11?Plural.One:0===v&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)||f%10===Math.floor(f%10)&&f%10>=2&&f%10<=4&&!(f%100>=12&&f%100<=14)?Plural.Few:Plural.Other;case"cs":case"sk":return 1===i&&0===v?Plural.One:i===Math.floor(i)&&i>=2&&i<=4&&0===v?Plural.Few:0!==v?Plural.Many:Plural.Other;case"cy":return 0===n?Plural.Zero:1===n?Plural.One:2===n?Plural.Two:3===n?Plural.Few:6===n?Plural.Many:Plural.Other;case"da":return 1===n||0!==t&&(0===i||1===i)?Plural.One:Plural.Other;case"dsb":case"hsb":return 0===v&&i%100==1||f%100==1?Plural.One:0===v&&i%100==2||f%100==2?Plural.Two:0===v&&i%100===Math.floor(i%100)&&i%100>=3&&i%100<=4||f%100===Math.floor(f%100)&&f%100>=3&&f%100<=4?Plural.Few:Plural.Other;case"ff":case"fr":case"hy":case"kab":return 0===i||1===i?Plural.One:Plural.Other;case"fil":return 0===v&&(1===i||2===i||3===i)||0===v&&i%10!=4&&i%10!=6&&i%10!=9||0!==v&&f%10!=4&&f%10!=6&&f%10!=9?Plural.One:Plural.Other;case"ga":return 1===n?Plural.One:2===n?Plural.Two:n===Math.floor(n)&&n>=3&&n<=6?Plural.Few:n===Math.floor(n)&&n>=7&&n<=10?Plural.Many:Plural.Other;case"gd":return 1===n||11===n?Plural.One:2===n||12===n?Plural.Two:n===Math.floor(n)&&(n>=3&&n<=10||n>=13&&n<=19)?Plural.Few:Plural.Other;case"gv":return 0===v&&i%10==1?Plural.One:0===v&&i%10==2?Plural.Two:0!==v||i%100!=0&&i%100!=20&&i%100!=40&&i%100!=60&&i%100!=80?0!==v?Plural.Many:Plural.Other:Plural.Few;case"he":return 1===i&&0===v?Plural.One:2===i&&0===v?Plural.Two:0!==v||n>=0&&n<=10||n%10!=0?Plural.Other:Plural.Many;case"is":return 0===t&&i%10==1&&i%100!=11||0!==t?Plural.One:Plural.Other;case"ksh":return 0===n?Plural.Zero:1===n?Plural.One:Plural.Other;case"kw":case"naq":case"se":case"smn":return 1===n?Plural.One:2===n?Plural.Two:Plural.Other;case"lag":return 0===n?Plural.Zero:0!==i&&1!==i||0===n?Plural.Other:Plural.One;case"lt":return n%10!=1||n%100>=11&&n%100<=19?n%10===Math.floor(n%10)&&n%10>=2&&n%10<=9&&!(n%100>=11&&n%100<=19)?Plural.Few:0!==f?Plural.Many:Plural.Other:Plural.One;case"lv":case"prg":return n%10==0||n%100===Math.floor(n%100)&&n%100>=11&&n%100<=19||2===v&&f%100===Math.floor(f%100)&&f%100>=11&&f%100<=19?Plural.Zero:n%10==1&&n%100!=11||2===v&&f%10==1&&f%100!=11||2!==v&&f%10==1?Plural.One:Plural.Other;case"mk":return 0===v&&i%10==1||f%10==1?Plural.One:Plural.Other;case"mt":return 1===n?Plural.One:0===n||n%100===Math.floor(n%100)&&n%100>=2&&n%100<=10?Plural.Few:n%100===Math.floor(n%100)&&n%100>=11&&n%100<=19?Plural.Many:Plural.Other;case"pl":return 1===i&&0===v?Plural.One:0===v&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)?Plural.Few:0===v&&1!==i&&i%10===Math.floor(i%10)&&i%10>=0&&i%10<=1||0===v&&i%10===Math.floor(i%10)&&i%10>=5&&i%10<=9||0===v&&i%100===Math.floor(i%100)&&i%100>=12&&i%100<=14?Plural.Many:Plural.Other;case"pt":return n===Math.floor(n)&&n>=0&&n<=2&&2!==n?Plural.One:Plural.Other;case"ro":return 1===i&&0===v?Plural.One:0!==v||0===n||1!==n&&n%100===Math.floor(n%100)&&n%100>=1&&n%100<=19?Plural.Few:Plural.Other;case"ru":case"uk":return 0===v&&i%10==1&&i%100!=11?Plural.One:0===v&&i%10===Math.floor(i%10)&&i%10>=2&&i%10<=4&&!(i%100>=12&&i%100<=14)?Plural.Few:0===v&&i%10==0||0===v&&i%10===Math.floor(i%10)&&i%10>=5&&i%10<=9||0===v&&i%100===Math.floor(i%100)&&i%100>=11&&i%100<=14?Plural.Many:Plural.Other;case"shi":return 0===i||1===n?Plural.One:n===Math.floor(n)&&n>=2&&n<=10?Plural.Few:Plural.Other;case"si":return 0===n||1===n||0===i&&1===f?Plural.One:Plural.Other;case"sl":return 0===v&&i%100==1?Plural.One:0===v&&i%100==2?Plural.Two:0===v&&i%100===Math.floor(i%100)&&i%100>=3&&i%100<=4||0!==v?Plural.Few:Plural.Other;case"tzm":return n===Math.floor(n)&&n>=0&&n<=1||n===Math.floor(n)&&n>=11&&n<=99?Plural.One:Plural.Other;default:return Plural.Other}}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */,DOCUMENT=(function(){function DeprecatedI18NPipesModule(){}DeprecatedI18NPipesModule=Object(tslib_es6.b)([Object(core.E)({declarations:[COMMON_DEPRECATED_I18N_PIPES],exports:[COMMON_DEPRECATED_I18N_PIPES],providers:[{provide:DEPRECATED_PLURAL_FN,useValue:ɵ0$2}]})],DeprecatedI18NPipesModule)}(),new core.x("DocumentToken")),PLATFORM_BROWSER_ID="browser",PLATFORM_SERVER_ID="server";
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
new core.eb("8.0.3"),function(){function ViewportScroller(){}ViewportScroller.ngInjectableDef=Object(core.cc)({providedIn:"root",factory:function(){return new BrowserViewportScroller(Object(core.gc)(DOCUMENT),window,Object(core.gc)(core.s))}})}()
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var BrowserViewportScroller=function(){function BrowserViewportScroller(document,window,errorHandler){this.document=document,this.window=window,this.errorHandler=errorHandler,this.offset=function(){return[0,0]}}return BrowserViewportScroller.prototype.setOffset=function(offset){Array.isArray(offset)?this.offset=function(){return offset}:this.offset=offset},BrowserViewportScroller.prototype.getScrollPosition=function(){return this.supportScrollRestoration()?[this.window.scrollX,this.window.scrollY]:[0,0]},BrowserViewportScroller.prototype.scrollToPosition=function(position){this.supportScrollRestoration()&&this.window.scrollTo(position[0],position[1])},BrowserViewportScroller.prototype.scrollToAnchor=function(anchor){if(this.supportScrollRestoration()){anchor=this.window.CSS&&this.window.CSS.escape?this.window.CSS.escape(anchor):anchor.replace(/(\"|\'\ |:|\.|\[|\]|,|=)/g,"\\$1");try{var elSelectedById=this.document.querySelector("#"+anchor);if(elSelectedById)return void this.scrollToElement(elSelectedById);var elSelectedByName=this.document.querySelector("[name='"+anchor+"']");if(elSelectedByName)return void this.scrollToElement(elSelectedByName)}catch(e){this.errorHandler.handleError(e)}}},BrowserViewportScroller.prototype.setHistoryScrollRestoration=function(scrollRestoration){if(this.supportScrollRestoration()){var history_1=this.window.history;history_1&&history_1.scrollRestoration&&(history_1.scrollRestoration=scrollRestoration)}},BrowserViewportScroller.prototype.scrollToElement=function(el){var rect=el.getBoundingClientRect(),left=rect.left+this.window.pageXOffset,top=rect.top+this.window.pageYOffset,offset=this.offset();this.window.scrollTo(left-offset[0],top-offset[1])},BrowserViewportScroller.prototype.supportScrollRestoration=function(){try{return!!this.window&&!!this.window.scrollTo}catch(_a){return!1}},BrowserViewportScroller}(),_DOM=(function(){function NullViewportScroller(){}NullViewportScroller.prototype.setOffset=function(offset){},NullViewportScroller.prototype.getScrollPosition=function(){return[0,0]},NullViewportScroller.prototype.scrollToPosition=function(position){},NullViewportScroller.prototype.scrollToAnchor=function(anchor){},NullViewportScroller.prototype.setHistoryScrollRestoration=function(scrollRestoration){}}(),null);function getDOM(){return _DOM}var urlParsingNode,platform_browser_GenericBrowserDomAdapter=function(_super){function GenericBrowserDomAdapter(){var _this=_super.call(this)||this;_this._animationPrefix=null,_this._transitionEnd=null;try{var element_1=_this.createElement("div",document);Eif(null!=_this.getStyle(element_1,"animationName"))_this._animationPrefix="";else for(var domPrefixes=["Webkit","Moz","O","ms"],i=0;i<domPrefixes.length;i++)if(null!=_this.getStyle(element_1,domPrefixes[i]+"AnimationName")){_this._animationPrefix="-"+domPrefixes[i].toLowerCase()+"-";break}var transEndEventNames_1={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};Object.keys(transEndEventNames_1).forEach(function(key){null!=_this.getStyle(element_1,key)&&(_this._transitionEnd=transEndEventNames_1[key])})}catch(_a){_this._animationPrefix=null,_this._transitionEnd=null}return _this}return Object(tslib_es6.c)(GenericBrowserDomAdapter,_super),GenericBrowserDomAdapter.prototype.getDistributedNodes=function(el){return el.getDistributedNodes()},GenericBrowserDomAdapter.prototype.resolveAndSetHref=function(el,baseUrl,href){el.href=null==href?baseUrl:baseUrl+"/../"+href},GenericBrowserDomAdapter.prototype.supportsDOMEvents=function(){return!0},GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM=function(){return"function"==typeof document.body.createShadowRoot},GenericBrowserDomAdapter.prototype.getAnimationPrefix=function(){return this._animationPrefix?this._animationPrefix:""},GenericBrowserDomAdapter.prototype.getTransitionEnd=function(){return this._transitionEnd?this._transitionEnd:""},GenericBrowserDomAdapter.prototype.supportsAnimation=function(){return null!=this._animationPrefix&&null!=this._transitionEnd},GenericBrowserDomAdapter}(function(){function DomAdapter(){this.resourceLoaderType=null}return Object.defineProperty(DomAdapter.prototype,"attrToPropMap",{get:function(){return this._attrToPropMap},set:function(value){this._attrToPropMap=value},enumerable:!0,configurable:!0}),DomAdapter}()),_attrToPropMap={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},_keyMap={"\b":"Backspace","\t":"Tab","":"Delete","":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},_chromeNumKeyPadMap={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","":"NumLock"},nodeContains=function(){Eif(core.Fb.Node)return core.Fb.Node.prototype.contains||function(node){return!!(16&this.compareDocumentPosition(node))}}(),platform_browser_BrowserDomAdapter=function(_super){function BrowserDomAdapter(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(BrowserDomAdapter,_super),BrowserDomAdapter.prototype.parse=function(templateHtml){throw new Error("parse not implemented")},BrowserDomAdapter.makeCurrent=function(){!function setRootDomAdapter(adapter){_DOM||(_DOM=adapter)}(new BrowserDomAdapter)},BrowserDomAdapter.prototype.hasProperty=function(element,name){return name in element},BrowserDomAdapter.prototype.setProperty=function(el,name,value){el[name]=value},BrowserDomAdapter.prototype.getProperty=function(el,name){return el[name]},BrowserDomAdapter.prototype.invoke=function(el,methodName,args){var _a;(_a=el)[methodName].apply(_a,Object(tslib_es6.g)(args))},BrowserDomAdapter.prototype.logError=function(error){window.console&&(console.error?console.error(error):console.log(error))},BrowserDomAdapter.prototype.log=function(error){window.console&&window.console.log&&window.console.log(error)},BrowserDomAdapter.prototype.logGroup=function(error){window.console&&window.console.group&&window.console.group(error)},BrowserDomAdapter.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(BrowserDomAdapter.prototype,"attrToPropMap",{get:function(){return _attrToPropMap},enumerable:!0,configurable:!0}),BrowserDomAdapter.prototype.contains=function(nodeA,nodeB){return nodeContains.call(nodeA,nodeB)},BrowserDomAdapter.prototype.querySelector=function(el,selector){return el.querySelector(selector)},BrowserDomAdapter.prototype.querySelectorAll=function(el,selector){return el.querySelectorAll(selector)},BrowserDomAdapter.prototype.on=function(el,evt,listener){el.addEventListener(evt,listener,!1)},BrowserDomAdapter.prototype.onAndCancel=function(el,evt,listener){return el.addEventListener(evt,listener,!1),function(){el.removeEventListener(evt,listener,!1)}},BrowserDomAdapter.prototype.dispatchEvent=function(el,evt){el.dispatchEvent(evt)},BrowserDomAdapter.prototype.createMouseEvent=function(eventType){var evt=this.getDefaultDocument().createEvent("MouseEvent");return evt.initEvent(eventType,!0,!0),evt},BrowserDomAdapter.prototype.createEvent=function(eventType){var evt=this.getDefaultDocument().createEvent("Event");return evt.initEvent(eventType,!0,!0),evt},BrowserDomAdapter.prototype.preventDefault=function(evt){evt.preventDefault(),evt.returnValue=!1},BrowserDomAdapter.prototype.isPrevented=function(evt){return evt.defaultPrevented||null!=evt.returnValue&&!evt.returnValue},BrowserDomAdapter.prototype.getInnerHTML=function(el){return el.innerHTML},BrowserDomAdapter.prototype.getTemplateContent=function(el){return"content"in el&&this.isTemplateElement(el)?el.content:null},BrowserDomAdapter.prototype.getOuterHTML=function(el){return el.outerHTML},BrowserDomAdapter.prototype.nodeName=function(node){return node.nodeName},BrowserDomAdapter.prototype.nodeValue=function(node){return node.nodeValue},BrowserDomAdapter.prototype.type=function(node){return node.type},BrowserDomAdapter.prototype.content=function(node){return this.hasProperty(node,"content")?node.content:node},BrowserDomAdapter.prototype.firstChild=function(el){return el.firstChild},BrowserDomAdapter.prototype.nextSibling=function(el){return el.nextSibling},BrowserDomAdapter.prototype.parentElement=function(el){return el.parentNode},BrowserDomAdapter.prototype.childNodes=function(el){return el.childNodes},BrowserDomAdapter.prototype.childNodesAsList=function(el){for(var childNodes=el.childNodes,res=new Array(childNodes.length),i=0;i<childNodes.length;i++)res[i]=childNodes[i];return res},BrowserDomAdapter.prototype.clearNodes=function(el){for(;el.firstChild;)el.removeChild(el.firstChild)},BrowserDomAdapter.prototype.appendChild=function(el,node){el.appendChild(node)},BrowserDomAdapter.prototype.removeChild=function(el,node){el.removeChild(node)},BrowserDomAdapter.prototype.replaceChild=function(el,newChild,oldChild){el.replaceChild(newChild,oldChild)},BrowserDomAdapter.prototype.remove=function(node){return node.parentNode&&node.parentNode.removeChild(node),node},BrowserDomAdapter.prototype.insertBefore=function(parent,ref,node){parent.insertBefore(node,ref)},BrowserDomAdapter.prototype.insertAllBefore=function(parent,ref,nodes){nodes.forEach(function(n){return parent.insertBefore(n,ref)})},BrowserDomAdapter.prototype.insertAfter=function(parent,ref,node){parent.insertBefore(node,ref.nextSibling)},BrowserDomAdapter.prototype.setInnerHTML=function(el,value){el.innerHTML=value},BrowserDomAdapter.prototype.getText=function(el){return el.textContent},BrowserDomAdapter.prototype.setText=function(el,value){el.textContent=value},BrowserDomAdapter.prototype.getValue=function(el){return el.value},BrowserDomAdapter.prototype.setValue=function(el,value){el.value=value},BrowserDomAdapter.prototype.getChecked=function(el){return el.checked},BrowserDomAdapter.prototype.setChecked=function(el,value){el.checked=value},BrowserDomAdapter.prototype.createComment=function(text){return this.getDefaultDocument().createComment(text)},BrowserDomAdapter.prototype.createTemplate=function(html){var t=this.getDefaultDocument().createElement("template");return t.innerHTML=html,t},BrowserDomAdapter.prototype.createElement=function(tagName,doc){return(doc=doc||this.getDefaultDocument()).createElement(tagName)},BrowserDomAdapter.prototype.createElementNS=function(ns,tagName,doc){return(doc=doc||this.getDefaultDocument()).createElementNS(ns,tagName)},BrowserDomAdapter.prototype.createTextNode=function(text,doc){return(doc=doc||this.getDefaultDocument()).createTextNode(text)},BrowserDomAdapter.prototype.createScriptTag=function(attrName,attrValue,doc){var el=(doc=doc||this.getDefaultDocument()).createElement("SCRIPT");return el.setAttribute(attrName,attrValue),el},BrowserDomAdapter.prototype.createStyleElement=function(css,doc){var style=(doc=doc||this.getDefaultDocument()).createElement("style");return this.appendChild(style,this.createTextNode(css,doc)),style},BrowserDomAdapter.prototype.createShadowRoot=function(el){return el.createShadowRoot()},BrowserDomAdapter.prototype.getShadowRoot=function(el){return el.shadowRoot},BrowserDomAdapter.prototype.getHost=function(el){return el.host},BrowserDomAdapter.prototype.clone=function(node){return node.cloneNode(!0)},BrowserDomAdapter.prototype.getElementsByClassName=function(element,name){return element.getElementsByClassName(name)},BrowserDomAdapter.prototype.getElementsByTagName=function(element,name){return element.getElementsByTagName(name)},BrowserDomAdapter.prototype.classList=function(element){return Array.prototype.slice.call(element.classList,0)},BrowserDomAdapter.prototype.addClass=function(element,className){element.classList.add(className)},BrowserDomAdapter.prototype.removeClass=function(element,className){element.classList.remove(className)},BrowserDomAdapter.prototype.hasClass=function(element,className){return element.classList.contains(className)},BrowserDomAdapter.prototype.setStyle=function(element,styleName,styleValue){element.style[styleName]=styleValue},BrowserDomAdapter.prototype.removeStyle=function(element,stylename){element.style[stylename]=""},BrowserDomAdapter.prototype.getStyle=function(element,stylename){return element.style[stylename]},BrowserDomAdapter.prototype.hasStyle=function(element,styleName,styleValue){var value=this.getStyle(element,styleName)||"";return styleValue?value==styleValue:value.length>0},BrowserDomAdapter.prototype.tagName=function(element){return element.tagName},BrowserDomAdapter.prototype.attributeMap=function(element){for(var res=new Map,elAttrs=element.attributes,i=0;i<elAttrs.length;i++){var attrib=elAttrs.item(i);res.set(attrib.name,attrib.value)}return res},BrowserDomAdapter.prototype.hasAttribute=function(element,attribute){return element.hasAttribute(attribute)},BrowserDomAdapter.prototype.hasAttributeNS=function(element,ns,attribute){return element.hasAttributeNS(ns,attribute)},BrowserDomAdapter.prototype.getAttribute=function(element,attribute){return element.getAttribute(attribute)},BrowserDomAdapter.prototype.getAttributeNS=function(element,ns,name){return element.getAttributeNS(ns,name)},BrowserDomAdapter.prototype.setAttribute=function(element,name,value){element.setAttribute(name,value)},BrowserDomAdapter.prototype.setAttributeNS=function(element,ns,name,value){element.setAttributeNS(ns,name,value)},BrowserDomAdapter.prototype.removeAttribute=function(element,attribute){element.removeAttribute(attribute)},BrowserDomAdapter.prototype.removeAttributeNS=function(element,ns,name){element.removeAttributeNS(ns,name)},BrowserDomAdapter.prototype.templateAwareRoot=function(el){return this.isTemplateElement(el)?this.content(el):el},BrowserDomAdapter.prototype.createHtmlDocument=function(){return document.implementation.createHTMLDocument("fakeTitle")},BrowserDomAdapter.prototype.getDefaultDocument=function(){return document},BrowserDomAdapter.prototype.getBoundingClientRect=function(el){try{return el.getBoundingClientRect()}catch(_a){return{top:0,bottom:0,left:0,right:0,width:0,height:0}}},BrowserDomAdapter.prototype.getTitle=function(doc){return doc.title},BrowserDomAdapter.prototype.setTitle=function(doc,newTitle){doc.title=newTitle||""},BrowserDomAdapter.prototype.elementMatches=function(n,selector){return!!this.isElementNode(n)&&(n.matches&&n.matches(selector)||n.msMatchesSelector&&n.msMatchesSelector(selector)||n.webkitMatchesSelector&&n.webkitMatchesSelector(selector))},BrowserDomAdapter.prototype.isTemplateElement=function(el){return this.isElementNode(el)&&"TEMPLATE"===el.nodeName},BrowserDomAdapter.prototype.isTextNode=function(node){return node.nodeType===Node.TEXT_NODE},BrowserDomAdapter.prototype.isCommentNode=function(node){return node.nodeType===Node.COMMENT_NODE},BrowserDomAdapter.prototype.isElementNode=function(node){return node.nodeType===Node.ELEMENT_NODE},BrowserDomAdapter.prototype.hasShadowRoot=function(node){return null!=node.shadowRoot&&node instanceof HTMLElement},BrowserDomAdapter.prototype.isShadowRoot=function(node){return node instanceof DocumentFragment},BrowserDomAdapter.prototype.importIntoDoc=function(node){return document.importNode(this.templateAwareRoot(node),!0)},BrowserDomAdapter.prototype.adoptNode=function(node){return document.adoptNode(node)},BrowserDomAdapter.prototype.getHref=function(el){return el.getAttribute("href")},BrowserDomAdapter.prototype.getEventKey=function(event){var key=event.key;if(null==key){if(null==(key=event.keyIdentifier))return"Unidentified";key.startsWith("U+")&&(key=String.fromCharCode(parseInt(key.substring(2),16)),3===event.location&&_chromeNumKeyPadMap.hasOwnProperty(key)&&(key=_chromeNumKeyPadMap[key]))}return _keyMap[key]||key},BrowserDomAdapter.prototype.getGlobalEventTarget=function(doc,target){return"window"===target?window:"document"===target?doc:"body"===target?doc.body:null},BrowserDomAdapter.prototype.getHistory=function(){return window.history},BrowserDomAdapter.prototype.getLocation=function(){return window.location},BrowserDomAdapter.prototype.getBaseHref=function(doc){var href=function getBaseElementHref(){if(!baseElement&&!(baseElement=document.querySelector("base")))return null;return baseElement.getAttribute("href")}();return null==href?null:function relativePath(url){urlParsingNode||(urlParsingNode=document.createElement("a"));return urlParsingNode.setAttribute("href",url),"/"===urlParsingNode.pathname.charAt(0)?urlParsingNode.pathname:"/"+urlParsingNode.pathname}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(href)},BrowserDomAdapter.prototype.resetBaseElement=function(){baseElement=null},BrowserDomAdapter.prototype.getUserAgent=function(){return window.navigator.userAgent},BrowserDomAdapter.prototype.setData=function(element,name,value){this.setAttribute(element,"data-"+name,value)},BrowserDomAdapter.prototype.getData=function(element,name){return this.getAttribute(element,"data-"+name)},BrowserDomAdapter.prototype.getComputedStyle=function(element){return getComputedStyle(element)},BrowserDomAdapter.prototype.supportsWebAnimation=function(){return"function"==typeof Element.prototype.animate},BrowserDomAdapter.prototype.performanceNow=function(){return window.performance&&window.performance.now?window.performance.now():(new Date).getTime()},BrowserDomAdapter.prototype.supportsCookies=function(){return!0},BrowserDomAdapter.prototype.getCookie=function(name){return function parseCookieValue(cookieStr,name){var e_1,_a;name=encodeURIComponent(name);try{for(var _b=Object(tslib_es6.h)(cookieStr.split(";")),_c=_b.next();!_c.done;_c=_b.next()){var cookie=_c.value,eqIndex=cookie.indexOf("="),_d=Object(tslib_es6.f)(-1==eqIndex?[cookie,""]:[cookie.slice(0,eqIndex),cookie.slice(eqIndex+1)],2),cookieName=_d[0],cookieValue=_d[1];if(cookieName.trim()===name)return decodeURIComponent(cookieValue)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}return null}(document.cookie,name)},BrowserDomAdapter.prototype.setCookie=function(name,value){document.cookie=encodeURIComponent(name)+"="+encodeURIComponent(value)},BrowserDomAdapter}(platform_browser_GenericBrowserDomAdapter),baseElement=null;
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function supportsState(){return!!window.history.pushState}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var platform_browser_BrowserPlatformLocation=function(_super){function BrowserPlatformLocation(_doc){var _this=_super.call(this)||this;return _this._doc=_doc,_this._init(),_this}return Object(tslib_es6.c)(BrowserPlatformLocation,_super),BrowserPlatformLocation.prototype._init=function(){this.location=getDOM().getLocation(),this._history=getDOM().getHistory()},BrowserPlatformLocation.prototype.getBaseHrefFromDOM=function(){return getDOM().getBaseHref(this._doc)},BrowserPlatformLocation.prototype.onPopState=function(fn){getDOM().getGlobalEventTarget(this._doc,"window").addEventListener("popstate",fn,!1)},BrowserPlatformLocation.prototype.onHashChange=function(fn){getDOM().getGlobalEventTarget(this._doc,"window").addEventListener("hashchange",fn,!1)},Object.defineProperty(BrowserPlatformLocation.prototype,"href",{get:function(){return this.location.href},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"protocol",{get:function(){return this.location.protocol},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"hostname",{get:function(){return this.location.hostname},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"port",{get:function(){return this.location.port},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"pathname",{get:function(){return this.location.pathname},set:function(newPath){this.location.pathname=newPath},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"search",{get:function(){return this.location.search},enumerable:!0,configurable:!0}),Object.defineProperty(BrowserPlatformLocation.prototype,"hash",{get:function(){return this.location.hash},enumerable:!0,configurable:!0}),BrowserPlatformLocation.prototype.pushState=function(state,title,url){supportsState()?this._history.pushState(state,title,url):this.location.hash=url},BrowserPlatformLocation.prototype.replaceState=function(state,title,url){supportsState()?this._history.replaceState(state,title,url):this.location.hash=url},BrowserPlatformLocation.prototype.forward=function(){this._history.forward()},BrowserPlatformLocation.prototype.back=function(){this._history.back()},BrowserPlatformLocation.prototype.getState=function(){return this._history.state},BrowserPlatformLocation=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],BrowserPlatformLocation)}(PlatformLocation),TRANSITION_ID=new core.x("TRANSITION_ID");
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var SERVER_TRANSITION_PROVIDERS=[{provide:core.c,useFactory:function appInitializerFactory(transitionId,document,injector){return function(){injector.get(core.d).donePromise.then(function(){var dom=getDOM();Array.prototype.slice.apply(dom.querySelectorAll(document,"style[ng-transition]")).filter(function(el){return dom.getAttribute(el,"ng-transition")===transitionId}).forEach(function(el){return dom.remove(el)})})}},deps:[TRANSITION_ID,DOCUMENT,core.y],multi:!0}],platform_browser_BrowserGetTestability=function(){function BrowserGetTestability(){}return BrowserGetTestability.init=function(){Object(core.pb)(new BrowserGetTestability)},BrowserGetTestability.prototype.addToWindow=function(registry){core.Fb.getAngularTestability=function(elem,findInAncestors){void 0===findInAncestors&&(findInAncestors=!0);var testability=registry.findTestabilityInTree(elem,findInAncestors);if(null==testability)throw new Error("Could not find testability for element.");return testability},core.Fb.getAllAngularTestabilities=function(){return registry.getAllTestabilities()},core.Fb.getAllAngularRootElements=function(){return registry.getAllRootElements()};core.Fb.frameworkStabilizers||(core.Fb.frameworkStabilizers=[]),core.Fb.frameworkStabilizers.push(function(callback){var testabilities=core.Fb.getAllAngularTestabilities(),count=testabilities.length,didWork=!1,decrement=function(didWork_){didWork=didWork||didWork_,0==--count&&callback(didWork)};testabilities.forEach(function(testability){testability.whenStable(decrement)})})},BrowserGetTestability.prototype.findTestabilityInTree=function(registry,elem,findInAncestors){if(null==elem)return null;var t=registry.getTestability(elem);return null!=t?t:findInAncestors?getDOM().isShadowRoot(elem)?this.findTestabilityInTree(registry,getDOM().getHost(elem),!0):this.findTestabilityInTree(registry,getDOM().parentElement(elem),!0):null},BrowserGetTestability}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function exportNgVar(name,value){"undefined"!=typeof COMPILED&&COMPILED||((core.Fb.ng=core.Fb.ng||{})[name]=value)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var CORE_TOKENS={ApplicationRef:core.f,NgZone:core.I},INSPECT_GLOBAL_NAME="probe",CORE_TOKENS_GLOBAL_NAME="coreTokens";function inspectNativeElement(element){return Object(core.mb)(element)}var ELEMENT_PROBE_PROVIDERS=[{provide:core.c,useFactory:function _createNgProbe(coreTokens){return exportNgVar(INSPECT_GLOBAL_NAME,inspectNativeElement),exportNgVar(CORE_TOKENS_GLOBAL_NAME,Object(tslib_es6.a)({},CORE_TOKENS,function _ngProbeTokensToMap(tokens){return tokens.reduce(function(prev,t){return prev[t.name]=t.token,prev},{})}(coreTokens||[]))),function(){return inspectNativeElement}},deps:[[core.H,new core.J]],multi:!0}],EVENT_MANAGER_PLUGINS=new core.x("EventManagerPlugins"),platform_browser_EventManager=function(){function EventManager(plugins,_zone){var _this=this;this._zone=_zone,this._eventNameToPlugin=new Map,plugins.forEach(function(p){return p.manager=_this}),this._plugins=plugins.slice().reverse()}return EventManager.prototype.addEventListener=function(element,eventName,handler){return this._findPluginFor(eventName).addEventListener(element,eventName,handler)},EventManager.prototype.addGlobalEventListener=function(target,eventName,handler){return this._findPluginFor(eventName).addGlobalEventListener(target,eventName,handler)},EventManager.prototype.getZone=function(){return this._zone},EventManager.prototype._findPluginFor=function(eventName){var plugin=this._eventNameToPlugin.get(eventName);Iif(plugin)return plugin;for(var plugins=this._plugins,i=0;i<plugins.length;i++){var plugin_1=plugins[i];if(plugin_1.supports(eventName))return this._eventNameToPlugin.set(eventName,plugin_1),plugin_1}throw new Error("No event manager plugin found for event "+eventName)},EventManager=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(EVENT_MANAGER_PLUGINS)),Object(tslib_es6.d)("design:paramtypes",[Array,core.I])],EventManager)}(),EventManagerPlugin=function(){function EventManagerPlugin(_doc){this._doc=_doc}return EventManagerPlugin.prototype.addGlobalEventListener=function(element,eventName,handler){var target=getDOM().getGlobalEventTarget(this._doc,element);if(!target)throw new Error("Unsupported event target "+target+" for event "+eventName);return this.addEventListener(target,eventName,handler)},EventManagerPlugin}(),platform_browser_SharedStylesHost=function(){function SharedStylesHost(){this._stylesSet=new Set}return SharedStylesHost.prototype.addStyles=function(styles){var _this=this,additions=new Set;styles.forEach(function(style){_this._stylesSet.has(style)||(_this._stylesSet.add(style),additions.add(style))}),this.onStylesAdded(additions)},SharedStylesHost.prototype.onStylesAdded=function(additions){},SharedStylesHost.prototype.getAllStyles=function(){return Array.from(this._stylesSet)},SharedStylesHost=Object(tslib_es6.b)([Object(core.w)()],SharedStylesHost)}(),platform_browser_DomSharedStylesHost=function(_super){function DomSharedStylesHost(_doc){var _this=_super.call(this)||this;return _this._doc=_doc,_this._hostNodes=new Set,_this._styleNodes=new Set,_this._hostNodes.add(_doc.head),_this}return Object(tslib_es6.c)(DomSharedStylesHost,_super),DomSharedStylesHost.prototype._addStylesToHost=function(styles,host){var _this=this;styles.forEach(function(style){var styleEl=_this._doc.createElement("style");styleEl.textContent=style,_this._styleNodes.add(host.appendChild(styleEl))})},DomSharedStylesHost.prototype.addHost=function(hostNode){this._addStylesToHost(this._stylesSet,hostNode),this._hostNodes.add(hostNode)},DomSharedStylesHost.prototype.removeHost=function(hostNode){this._hostNodes.delete(hostNode)},DomSharedStylesHost.prototype.onStylesAdded=function(additions){var _this=this;this._hostNodes.forEach(function(hostNode){return _this._addStylesToHost(additions,hostNode)})},DomSharedStylesHost.prototype.ngOnDestroy=function(){this._styleNodes.forEach(function(styleNode){return getDOM().remove(styleNode)})},DomSharedStylesHost=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],DomSharedStylesHost)}(platform_browser_SharedStylesHost),NAMESPACE_URIS={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},COMPONENT_REGEX=/%COMP%/g,HOST_ATTR="_nghost-%COMP%",CONTENT_ATTR="_ngcontent-%COMP%";function flattenStyles(compId,styles,target){for(var i=0;i<styles.length;i++){var style=styles[i];Array.isArray(style)?flattenStyles(compId,style,target):(style=style.replace(COMPONENT_REGEX,compId),target.push(style))}return target}function decoratePreventDefault(eventHandler){return function(event){!1===eventHandler(event)&&(event.preventDefault(),event.returnValue=!1)}}var platform_browser_DomRendererFactory2=function(){function DomRendererFactory2(eventManager,sharedStylesHost,appId){this.eventManager=eventManager,this.sharedStylesHost=sharedStylesHost,this.appId=appId,this.rendererByCompId=new Map,this.defaultRenderer=new platform_browser_DefaultDomRenderer2(eventManager)}return DomRendererFactory2.prototype.createRenderer=function(element,type){if(!element||!type)return this.defaultRenderer;switch(type.encapsulation){case core.hb.Emulated:var renderer=this.rendererByCompId.get(type.id);return renderer||(renderer=new platform_browser_EmulatedEncapsulationDomRenderer2(this.eventManager,this.sharedStylesHost,type,this.appId),this.rendererByCompId.set(type.id,renderer)),renderer.applyToHost(element),renderer;case core.hb.Native:case core.hb.ShadowDom:return new platform_browser_ShadowDomRenderer(this.eventManager,this.sharedStylesHost,element,type);default:if(!this.rendererByCompId.has(type.id)){var styles=flattenStyles(type.id,type.styles,[]);this.sharedStylesHost.addStyles(styles),this.rendererByCompId.set(type.id,this.defaultRenderer)}return this.defaultRenderer}},DomRendererFactory2.prototype.begin=function(){},DomRendererFactory2.prototype.end=function(){},DomRendererFactory2=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(2,Object(core.v)(core.b)),Object(tslib_es6.d)("design:paramtypes",[platform_browser_EventManager,platform_browser_DomSharedStylesHost,String])],DomRendererFactory2)}(),platform_browser_DefaultDomRenderer2=function(){function DefaultDomRenderer2(eventManager){this.eventManager=eventManager,this.data=Object.create(null)}return DefaultDomRenderer2.prototype.destroy=function(){},DefaultDomRenderer2.prototype.createElement=function(name,namespace){return namespace?document.createElementNS(NAMESPACE_URIS[namespace]||namespace,name):document.createElement(name)},DefaultDomRenderer2.prototype.createComment=function(value){return document.createComment(value)},DefaultDomRenderer2.prototype.createText=function(value){return document.createTextNode(value)},DefaultDomRenderer2.prototype.appendChild=function(parent,newChild){parent.appendChild(newChild)},DefaultDomRenderer2.prototype.insertBefore=function(parent,newChild,refChild){parent&&parent.insertBefore(newChild,refChild)},DefaultDomRenderer2.prototype.removeChild=function(parent,oldChild){parent&&parent.removeChild(oldChild)},DefaultDomRenderer2.prototype.selectRootElement=function(selectorOrNode,preserveContent){var el="string"==typeof selectorOrNode?document.querySelector(selectorOrNode):selectorOrNode;Iif(!el)throw new Error('The selector "'+selectorOrNode+'" did not match any elements');return preserveContent||(el.textContent=""),el},DefaultDomRenderer2.prototype.parentNode=function(node){return node.parentNode},DefaultDomRenderer2.prototype.nextSibling=function(node){return node.nextSibling},DefaultDomRenderer2.prototype.setAttribute=function(el,name,value,namespace){Iif(namespace){name=namespace+":"+name;var namespaceUri=NAMESPACE_URIS[namespace];namespaceUri?el.setAttributeNS(namespaceUri,name,value):el.setAttribute(name,value)}else el.setAttribute(name,value)},DefaultDomRenderer2.prototype.removeAttribute=function(el,name,namespace){if(namespace){var namespaceUri=NAMESPACE_URIS[namespace];namespaceUri?el.removeAttributeNS(namespaceUri,name):el.removeAttribute(namespace+":"+name)}else el.removeAttribute(name)},DefaultDomRenderer2.prototype.addClass=function(el,name){el.classList.add(name)},DefaultDomRenderer2.prototype.removeClass=function(el,name){el.classList.remove(name)},DefaultDomRenderer2.prototype.setStyle=function(el,style,value,flags){flags&core.T.DashCase?el.style.setProperty(style,value,flags&core.T.Important?"important":""):el.style[style]=value},DefaultDomRenderer2.prototype.removeStyle=function(el,style,flags){flags&core.T.DashCase?el.style.removeProperty(style):el.style[style]=""},DefaultDomRenderer2.prototype.setProperty=function(el,name,value){checkNoSyntheticProp(name,"property"),el[name]=value},DefaultDomRenderer2.prototype.setValue=function(node,value){node.nodeValue=value},DefaultDomRenderer2.prototype.listen=function(target,event,callback){return checkNoSyntheticProp(event,"listener"),"string"==typeof target?this.eventManager.addGlobalEventListener(target,event,decoratePreventDefault(callback)):this.eventManager.addEventListener(target,event,decoratePreventDefault(callback))},DefaultDomRenderer2}(),AT_CHARCODE="@".charCodeAt(0);function checkNoSyntheticProp(name,nameKind){Iif(name.charCodeAt(0)===AT_CHARCODE)throw new Error("Found the synthetic "+nameKind+" "+name+'. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.')}var platform_browser_EmulatedEncapsulationDomRenderer2=function(_super){function EmulatedEncapsulationDomRenderer2(eventManager,sharedStylesHost,component,appId){var _this=_super.call(this,eventManager)||this;_this.component=component;var styles=flattenStyles(appId+"-"+component.id,component.styles,[]);return sharedStylesHost.addStyles(styles),_this.contentAttr=function shimContentAttribute(componentShortId){return CONTENT_ATTR.replace(COMPONENT_REGEX,componentShortId)}(appId+"-"+component.id),_this.hostAttr=function shimHostAttribute(componentShortId){return HOST_ATTR.replace(COMPONENT_REGEX,componentShortId)}(appId+"-"+component.id),_this}return Object(tslib_es6.c)(EmulatedEncapsulationDomRenderer2,_super),EmulatedEncapsulationDomRenderer2.prototype.applyToHost=function(element){_super.prototype.setAttribute.call(this,element,this.hostAttr,"")},EmulatedEncapsulationDomRenderer2.prototype.createElement=function(parent,name){var el=_super.prototype.createElement.call(this,parent,name);return _super.prototype.setAttribute.call(this,el,this.contentAttr,""),el},EmulatedEncapsulationDomRenderer2}(platform_browser_DefaultDomRenderer2),platform_browser_ShadowDomRenderer=function(_super){function ShadowDomRenderer(eventManager,sharedStylesHost,hostEl,component){var _this=_super.call(this,eventManager)||this;_this.sharedStylesHost=sharedStylesHost,_this.hostEl=hostEl,_this.component=component,component.encapsulation===core.hb.ShadowDom?_this.shadowRoot=hostEl.attachShadow({mode:"open"}):_this.shadowRoot=hostEl.createShadowRoot(),_this.sharedStylesHost.addHost(_this.shadowRoot);for(var styles=flattenStyles(component.id,component.styles,[]),i=0;i<styles.length;i++){var styleEl=document.createElement("style");styleEl.textContent=styles[i],_this.shadowRoot.appendChild(styleEl)}return _this}return Object(tslib_es6.c)(ShadowDomRenderer,_super),ShadowDomRenderer.prototype.nodeOrShadowRoot=function(node){return node===this.hostEl?this.shadowRoot:node},ShadowDomRenderer.prototype.destroy=function(){this.sharedStylesHost.removeHost(this.shadowRoot)},ShadowDomRenderer.prototype.appendChild=function(parent,newChild){return _super.prototype.appendChild.call(this,this.nodeOrShadowRoot(parent),newChild)},ShadowDomRenderer.prototype.insertBefore=function(parent,newChild,refChild){return _super.prototype.insertBefore.call(this,this.nodeOrShadowRoot(parent),newChild,refChild)},ShadowDomRenderer.prototype.removeChild=function(parent,oldChild){return _super.prototype.removeChild.call(this,this.nodeOrShadowRoot(parent),oldChild)},ShadowDomRenderer.prototype.parentNode=function(node){return this.nodeOrShadowRoot(_super.prototype.parentNode.call(this,this.nodeOrShadowRoot(node)))},ShadowDomRenderer}(platform_browser_DefaultDomRenderer2),__symbol__="undefined"!=typeof Zone&&Zone.__symbol__||function(v){return"__zone_symbol__"+v},ADD_EVENT_LISTENER=__symbol__("addEventListener"),REMOVE_EVENT_LISTENER=__symbol__("removeEventListener"),symbolNames={},stopSymbol="__zone_symbol__propagationStopped",blackListedMap=function(){var blackListedEvents="undefined"!=typeof Zone&&Zone[__symbol__("BLACK_LISTED_EVENTS")];Iif(blackListedEvents){var res_1={};return blackListedEvents.forEach(function(eventName){res_1[eventName]=eventName}),res_1}}(),isBlackListedEvent=function(eventName){return!!blackListedMap&&blackListedMap.hasOwnProperty(eventName)},globalListener=function(event){var symbolName=symbolNames[event.type];if(symbolName){var taskDatas=this[symbolName];if(taskDatas){var args=[event];if(1===taskDatas.length)return(taskData=taskDatas[0]).zone!==Zone.current?taskData.zone.run(taskData.handler,this,args):taskData.handler.apply(this,args);for(var copiedTasks=taskDatas.slice(),i=0;i<copiedTasks.length&&!0!==event[stopSymbol];i++){var taskData;(taskData=copiedTasks[i]).zone!==Zone.current?taskData.zone.run(taskData.handler,this,args):taskData.handler.apply(this,args)}}}},platform_browser_DomEventsPlugin=function(_super){function DomEventsPlugin(doc,ngZone,platformId){var _this=_super.call(this,doc)||this;return _this.ngZone=ngZone,platformId&&function isPlatformServer(platformId){return platformId===PLATFORM_SERVER_ID}(platformId)||_this.patchEvent(),_this}return Object(tslib_es6.c)(DomEventsPlugin,_super),DomEventsPlugin.prototype.patchEvent=function(){Iif("undefined"!=typeof Event&&Event&&Event.prototype&&!Event.prototype.__zone_symbol__stopImmediatePropagation){var delegate=Event.prototype.__zone_symbol__stopImmediatePropagation=Event.prototype.stopImmediatePropagation;Event.prototype.stopImmediatePropagation=function(){this&&(this[stopSymbol]=!0),delegate&&delegate.apply(this,arguments)}}},DomEventsPlugin.prototype.supports=function(eventName){return!0},DomEventsPlugin.prototype.addEventListener=function(element,eventName,handler){var _this=this,zoneJsLoaded=element[ADD_EVENT_LISTENER],callback=handler;Eif(!zoneJsLoaded||core.I.isInAngularZone()&&!isBlackListedEvent(eventName))element.addEventListener(eventName,callback,!1);else{var symbolName=symbolNames[eventName];symbolName||(symbolName=symbolNames[eventName]=__symbol__("ANGULAR"+eventName+"FALSE"));var taskDatas=element[symbolName],globalListenerRegistered=taskDatas&&taskDatas.length>0;taskDatas||(taskDatas=element[symbolName]=[]);var zone=isBlackListedEvent(eventName)?Zone.root:Zone.current;if(0===taskDatas.length)taskDatas.push({zone:zone,handler:callback});else{for(var callbackRegistered=!1,i=0;i<taskDatas.length;i++)if(taskDatas[i].handler===callback){callbackRegistered=!0;break}callbackRegistered||taskDatas.push({zone:zone,handler:callback})}globalListenerRegistered||element[ADD_EVENT_LISTENER](eventName,globalListener,!1)}return function(){return _this.removeEventListener(element,eventName,callback)}},DomEventsPlugin.prototype.removeEventListener=function(target,eventName,callback){var underlyingRemove=target[REMOVE_EVENT_LISTENER];if(!underlyingRemove)return target.removeEventListener.apply(target,[eventName,callback,!1]);var symbolName=symbolNames[eventName],taskDatas=symbolName&&target[symbolName];if(!taskDatas)return target.removeEventListener.apply(target,[eventName,callback,!1]);for(var found=!1,i=0;i<taskDatas.length;i++)if(taskDatas[i].handler===callback){found=!0,taskDatas.splice(i,1);break}found?0===taskDatas.length&&underlyingRemove.apply(target,[eventName,globalListener,!1]):target.removeEventListener.apply(target,[eventName,callback,!1])},DomEventsPlugin=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.v)(core.M)),Object(tslib_es6.d)("design:paramtypes",[Object,core.I,Object])],DomEventsPlugin)}(EventManagerPlugin),EVENT_NAMES={pan:!0,panstart:!0,panmove:!0,panend:!0,pancancel:!0,panleft:!0,panright:!0,panup:!0,pandown:!0,pinch:!0,pinchstart:!0,pinchmove:!0,pinchend:!0,pinchcancel:!0,pinchin:!0,pinchout:!0,press:!0,pressup:!0,rotate:!0,rotatestart:!0,rotatemove:!0,rotateend:!0,rotatecancel:!0,swipe:!0,swipeleft:!0,swiperight:!0,swipeup:!0,swipedown:!0,tap:!0},HAMMER_GESTURE_CONFIG=new core.x("HammerGestureConfig"),HAMMER_LOADER=new core.x("HammerLoader"),platform_browser_HammerGestureConfig=function(){function HammerGestureConfig(){this.events=[],this.overrides={}}return HammerGestureConfig.prototype.buildHammer=function(element){var mc=new Hammer(element,this.options);for(var eventName in mc.get("pinch").set({enable:!0}),mc.get("rotate").set({enable:!0}),this.overrides)mc.get(eventName).set(this.overrides[eventName]);return mc},HammerGestureConfig=Object(tslib_es6.b)([Object(core.w)()],HammerGestureConfig)}(),platform_browser_HammerGesturesPlugin=function(_super){function HammerGesturesPlugin(doc,_config,console,loader){var _this=_super.call(this,doc)||this;return _this._config=_config,_this.console=console,_this.loader=loader,_this}return Object(tslib_es6.c)(HammerGesturesPlugin,_super),HammerGesturesPlugin.prototype.supports=function(eventName){return!(!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase())&&!this.isCustomEvent(eventName))&&(!(!window.Hammer&&!this.loader)||(this.console.warn('The "'+eventName+'" event cannot be bound because Hammer.JS is not loaded and no custom loader has been specified.'),!1))},HammerGesturesPlugin.prototype.addEventListener=function(element,eventName,handler){var _this=this,zone=this.manager.getZone();if(eventName=eventName.toLowerCase(),!window.Hammer&&this.loader){var cancelRegistration_1=!1,deregister_1=function(){cancelRegistration_1=!0};return this.loader().then(function(){if(!window.Hammer)return _this.console.warn("The custom HAMMER_LOADER completed, but Hammer.JS is not present."),void(deregister_1=function(){});cancelRegistration_1||(deregister_1=_this.addEventListener(element,eventName,handler))}).catch(function(){_this.console.warn('The "'+eventName+'" event cannot be bound because the custom Hammer.JS loader failed.'),deregister_1=function(){}}),function(){deregister_1()}}return zone.runOutsideAngular(function(){var mc=_this._config.buildHammer(element),callback=function(eventObj){zone.runGuarded(function(){handler(eventObj)})};return mc.on(eventName,callback),function(){mc.off(eventName,callback),"function"==typeof mc.destroy&&mc.destroy()}})},HammerGesturesPlugin.prototype.isCustomEvent=function(eventName){return this._config.events.indexOf(eventName)>-1},HammerGesturesPlugin=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.e)(1,Object(core.v)(HAMMER_GESTURE_CONFIG)),Object(tslib_es6.e)(3,Object(core.J)()),Object(tslib_es6.e)(3,Object(core.v)(HAMMER_LOADER)),Object(tslib_es6.d)("design:paramtypes",[Object,platform_browser_HammerGestureConfig,core.sb,Object])],HammerGesturesPlugin)}(EventManagerPlugin),MODIFIER_KEYS=["alt","control","meta","shift"],MODIFIER_KEY_GETTERS={alt:function(event){return event.altKey},control:function(event){return event.ctrlKey},meta:function(event){return event.metaKey},shift:function(event){return event.shiftKey}},platform_browser_KeyEventsPlugin=function(_super){function KeyEventsPlugin(doc){return _super.call(this,doc)||this}var KeyEventsPlugin_1;return Object(tslib_es6.c)(KeyEventsPlugin,_super),KeyEventsPlugin_1=KeyEventsPlugin,KeyEventsPlugin.prototype.supports=function(eventName){return null!=KeyEventsPlugin_1.parseEventName(eventName)},KeyEventsPlugin.prototype.addEventListener=function(element,eventName,handler){var parsedEvent=KeyEventsPlugin_1.parseEventName(eventName),outsideHandler=KeyEventsPlugin_1.eventCallback(parsedEvent.fullKey,handler,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return getDOM().onAndCancel(element,parsedEvent.domEventName,outsideHandler)})},KeyEventsPlugin.parseEventName=function(eventName){var parts=eventName.toLowerCase().split("."),domEventName=parts.shift();Eif(0===parts.length||"keydown"!==domEventName&&"keyup"!==domEventName)return null;var key=KeyEventsPlugin_1._normalizeKey(parts.pop()),fullKey="";if(MODIFIER_KEYS.forEach(function(modifierName){var index=parts.indexOf(modifierName);index>-1&&(parts.splice(index,1),fullKey+=modifierName+".")}),fullKey+=key,0!=parts.length||0===key.length)return null;var result={};return result.domEventName=domEventName,result.fullKey=fullKey,result},KeyEventsPlugin.getEventFullKey=function(event){var fullKey="",key=getDOM().getEventKey(event);return" "===(key=key.toLowerCase())?key="space":"."===key&&(key="dot"),MODIFIER_KEYS.forEach(function(modifierName){modifierName!=key&&((0,MODIFIER_KEY_GETTERS[modifierName])(event)&&(fullKey+=modifierName+"."))}),fullKey+=key},KeyEventsPlugin.eventCallback=function(fullKey,handler,zone){return function(event){KeyEventsPlugin_1.getEventFullKey(event)===fullKey&&zone.runGuarded(function(){return handler(event)})}},KeyEventsPlugin._normalizeKey=function(keyName){switch(keyName){case"esc":return"escape";default:return keyName}},KeyEventsPlugin=KeyEventsPlugin_1=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],KeyEventsPlugin)}(EventManagerPlugin),DomSanitizer=function DomSanitizer(){},platform_browser_DomSanitizerImpl=function(_super){function DomSanitizerImpl(_doc){var _this=_super.call(this)||this;return _this._doc=_doc,_this}return Object(tslib_es6.c)(DomSanitizerImpl,_super),DomSanitizerImpl.prototype.sanitize=function(ctx,value){if(null==value)return null;switch(ctx){case core.V.NONE:return value;case core.V.HTML:return value instanceof platform_browser_SafeHtmlImpl?value.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(value,"HTML"),Object(core.wb)(this._doc,String(value)));case core.V.STYLE:return value instanceof platform_browser_SafeStyleImpl?value.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(value,"Style"),Object(core.xb)(value));case core.V.SCRIPT:if(value instanceof platform_browser_SafeScriptImpl)return value.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(value,"Script"),new Error("unsafe value used in a script context");case core.V.URL:return value instanceof platform_browser_SafeResourceUrlImpl||value instanceof platform_browser_SafeUrlImpl?value.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(value,"URL"),Object(core.yb)(String(value)));case core.V.RESOURCE_URL:if(value instanceof platform_browser_SafeResourceUrlImpl)return value.changingThisBreaksApplicationSecurity;throw this.checkNotSafeValue(value,"ResourceURL"),new Error("unsafe value used in a resource URL context (see http://g.co/ng/security#xss)");default:throw new Error("Unexpected SecurityContext "+ctx+" (see http://g.co/ng/security#xss)")}},DomSanitizerImpl.prototype.checkNotSafeValue=function(value,expectedType){if(value instanceof SafeValueImpl)throw new Error("Required a safe "+expectedType+", got a "+value.getTypeName()+" (see http://g.co/ng/security#xss)")},DomSanitizerImpl.prototype.bypassSecurityTrustHtml=function(value){return new platform_browser_SafeHtmlImpl(value)},DomSanitizerImpl.prototype.bypassSecurityTrustStyle=function(value){return new platform_browser_SafeStyleImpl(value)},DomSanitizerImpl.prototype.bypassSecurityTrustScript=function(value){return new platform_browser_SafeScriptImpl(value)},DomSanitizerImpl.prototype.bypassSecurityTrustUrl=function(value){return new platform_browser_SafeUrlImpl(value)},DomSanitizerImpl.prototype.bypassSecurityTrustResourceUrl=function(value){return new platform_browser_SafeResourceUrlImpl(value)},DomSanitizerImpl=Object(tslib_es6.b)([Object(core.w)(),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],DomSanitizerImpl)}(DomSanitizer),SafeValueImpl=function(){function SafeValueImpl(changingThisBreaksApplicationSecurity){this.changingThisBreaksApplicationSecurity=changingThisBreaksApplicationSecurity}return SafeValueImpl.prototype.toString=function(){return"SafeValue must use [property]=binding: "+this.changingThisBreaksApplicationSecurity+" (see http://g.co/ng/security#xss)"},SafeValueImpl}(),platform_browser_SafeHtmlImpl=function(_super){function SafeHtmlImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(SafeHtmlImpl,_super),SafeHtmlImpl.prototype.getTypeName=function(){return"HTML"},SafeHtmlImpl}(SafeValueImpl),platform_browser_SafeStyleImpl=function(_super){function SafeStyleImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(SafeStyleImpl,_super),SafeStyleImpl.prototype.getTypeName=function(){return"Style"},SafeStyleImpl}(SafeValueImpl),platform_browser_SafeScriptImpl=function(_super){function SafeScriptImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(SafeScriptImpl,_super),SafeScriptImpl.prototype.getTypeName=function(){return"Script"},SafeScriptImpl}(SafeValueImpl),platform_browser_SafeUrlImpl=function(_super){function SafeUrlImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(SafeUrlImpl,_super),SafeUrlImpl.prototype.getTypeName=function(){return"URL"},SafeUrlImpl}(SafeValueImpl),platform_browser_SafeResourceUrlImpl=function(_super){function SafeResourceUrlImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(SafeResourceUrlImpl,_super),SafeResourceUrlImpl.prototype.getTypeName=function(){return"ResourceURL"},SafeResourceUrlImpl}(SafeValueImpl),ɵ0$5=PLATFORM_BROWSER_ID,INTERNAL_BROWSER_PLATFORM_PROVIDERS=[{provide:core.M,useValue:ɵ0$5},{provide:core.N,useValue:function initDomAdapter(){platform_browser_BrowserDomAdapter.makeCurrent(),platform_browser_BrowserGetTestability.init()},multi:!0},{provide:PlatformLocation,useClass:platform_browser_BrowserPlatformLocation,deps:[DOCUMENT]},{provide:DOCUMENT,useFactory:function _document(){return document},deps:[]}],BROWSER_SANITIZATION_PROVIDERS=[{provide:core.U,useExisting:DomSanitizer},{provide:DomSanitizer,useClass:platform_browser_DomSanitizerImpl,deps:[DOCUMENT]}];Object(core.jb)(core.ob,"browser",INTERNAL_BROWSER_PLATFORM_PROVIDERS);var BROWSER_MODULE_PROVIDERS=[BROWSER_SANITIZATION_PROVIDERS,{provide:core.qb,useValue:!0},{provide:core.s,useFactory:function errorHandler(){return new core.s},deps:[]},{provide:EVENT_MANAGER_PLUGINS,useClass:platform_browser_DomEventsPlugin,multi:!0,deps:[DOCUMENT,core.I,core.M]},{provide:EVENT_MANAGER_PLUGINS,useClass:platform_browser_KeyEventsPlugin,multi:!0,deps:[DOCUMENT]},{provide:EVENT_MANAGER_PLUGINS,useClass:platform_browser_HammerGesturesPlugin,multi:!0,deps:[DOCUMENT,HAMMER_GESTURE_CONFIG,core.sb,[new core.J,HAMMER_LOADER]]},{provide:HAMMER_GESTURE_CONFIG,useClass:platform_browser_HammerGestureConfig,deps:[]},{provide:platform_browser_DomRendererFactory2,useClass:platform_browser_DomRendererFactory2,deps:[platform_browser_EventManager,platform_browser_DomSharedStylesHost,core.b]},{provide:core.S,useExisting:platform_browser_DomRendererFactory2},{provide:platform_browser_SharedStylesHost,useExisting:platform_browser_DomSharedStylesHost},{provide:platform_browser_DomSharedStylesHost,useClass:platform_browser_DomSharedStylesHost,deps:[DOCUMENT]},{provide:core.cb,useClass:core.cb,deps:[core.I]},{provide:platform_browser_EventManager,useClass:platform_browser_EventManager,deps:[EVENT_MANAGER_PLUGINS,core.I]},ELEMENT_PROBE_PROVIDERS],platform_browser_BrowserModule=function(){function BrowserModule(parentModule){Iif(parentModule)throw new Error("BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.")}var BrowserModule_1;return BrowserModule_1=BrowserModule,BrowserModule.withServerTransition=function(params){return{ngModule:BrowserModule_1,providers:[{provide:core.b,useValue:params.appId},{provide:TRANSITION_ID,useExisting:core.b},SERVER_TRANSITION_PROVIDERS]}},BrowserModule=BrowserModule_1=Object(tslib_es6.b)([Object(core.E)({providers:BROWSER_MODULE_PROVIDERS,exports:[common_CommonModule,core.e]}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.Y)()),Object(tslib_es6.e)(0,Object(core.v)(BrowserModule_1)),Object(tslib_es6.d)("design:paramtypes",[Object])],BrowserModule)}();function createMeta(){return new platform_browser_Meta(Object(core.gc)(DOCUMENT))}var platform_browser_Meta=function(){function Meta(_doc){this._doc=_doc,this._dom=getDOM()}return Meta.prototype.addTag=function(tag,forceCreation){return void 0===forceCreation&&(forceCreation=!1),tag?this._getOrCreateElement(tag,forceCreation):null},Meta.prototype.addTags=function(tags,forceCreation){var _this=this;return void 0===forceCreation&&(forceCreation=!1),tags?tags.reduce(function(result,tag){return tag&&result.push(_this._getOrCreateElement(tag,forceCreation)),result},[]):[]},Meta.prototype.getTag=function(attrSelector){return attrSelector&&this._dom.querySelector(this._doc,"meta["+attrSelector+"]")||null},Meta.prototype.getTags=function(attrSelector){if(!attrSelector)return[];var list=this._dom.querySelectorAll(this._doc,"meta["+attrSelector+"]");return list?[].slice.call(list):[]},Meta.prototype.updateTag=function(tag,selector){if(!tag)return null;selector=selector||this._parseSelector(tag);var meta=this.getTag(selector);return meta?this._setMetaElementAttributes(tag,meta):this._getOrCreateElement(tag,!0)},Meta.prototype.removeTag=function(attrSelector){this.removeTagElement(this.getTag(attrSelector))},Meta.prototype.removeTagElement=function(meta){meta&&this._dom.remove(meta)},Meta.prototype._getOrCreateElement=function(meta,forceCreation){if(void 0===forceCreation&&(forceCreation=!1),!forceCreation){var selector=this._parseSelector(meta),elem=this.getTag(selector);if(elem&&this._containsAttributes(meta,elem))return elem}var element=this._dom.createElement("meta");this._setMetaElementAttributes(meta,element);var head=this._dom.getElementsByTagName(this._doc,"head")[0];return this._dom.appendChild(head,element),element},Meta.prototype._setMetaElementAttributes=function(tag,el){var _this=this;return Object.keys(tag).forEach(function(prop){return _this._dom.setAttribute(el,prop,tag[prop])}),el},Meta.prototype._parseSelector=function(tag){var attr=tag.name?"name":"property";return attr+'="'+tag[attr]+'"'},Meta.prototype._containsAttributes=function(tag,elem){var _this=this;return Object.keys(tag).every(function(key){return _this._dom.getAttribute(elem,key)===tag[key]})},Meta.ngInjectableDef=Object(core.cc)({factory:createMeta,token:Meta,providedIn:"root"}),Meta=Object(tslib_es6.b)([Object(core.w)({providedIn:"root",useFactory:createMeta,deps:[]}),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],Meta)}();function createTitle(){return new platform_browser_Title(Object(core.gc)(DOCUMENT))}var platform_browser_Title=function(){function Title(_doc){this._doc=_doc}return Title.prototype.getTitle=function(){return getDOM().getTitle(this._doc)},Title.prototype.setTitle=function(newTitle){getDOM().setTitle(this._doc,newTitle)},Title.ngInjectableDef=Object(core.cc)({factory:createTitle,token:Title,providedIn:"root"}),Title=Object(tslib_es6.b)([Object(core.w)({providedIn:"root",useFactory:createTitle,deps:[]}),Object(tslib_es6.e)(0,Object(core.v)(DOCUMENT)),Object(tslib_es6.d)("design:paramtypes",[Object])],Title)}(),win="undefined"!=typeof window&&window||{},ChangeDetectionPerfRecord=function ChangeDetectionPerfRecord(msPerTick,numTicks){this.msPerTick=msPerTick,this.numTicks=numTicks};
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */!function(){function AngularProfiler(ref){this.appRef=ref.injector.get(core.f)}AngularProfiler.prototype.timeChangeDetection=function(config){var record=config&&config.record,isProfilerAvailable=null!=win.console.profile;record&&isProfilerAvailable&&win.console.profile("Change Detection");for(var start=getDOM().performanceNow(),numTicks=0;numTicks<5||getDOM().performanceNow()-start<500;)this.appRef.tick(),numTicks++;var end=getDOM().performanceNow();record&&isProfilerAvailable&&win.console.profileEnd("Change Detection");var msPerTick=(end-start)/numTicks;return win.console.log("ran "+numTicks+" change detection cycles"),win.console.log(msPerTick.toFixed(2)+" ms per check"),new ChangeDetectionPerfRecord(msPerTick,numTicks)}}();var platform_browser_TransferState=function(){function TransferState(){this.store={},this.onSerializeCallbacks={}}var TransferState_1;return TransferState_1=TransferState,TransferState.init=function(initState){var transferState=new TransferState_1;return transferState.store=initState,transferState},TransferState.prototype.get=function(key,defaultValue){return void 0!==this.store[key]?this.store[key]:defaultValue},TransferState.prototype.set=function(key,value){this.store[key]=value},TransferState.prototype.remove=function(key){delete this.store[key]},TransferState.prototype.hasKey=function(key){return this.store.hasOwnProperty(key)},TransferState.prototype.onSerialize=function(key,callback){this.onSerializeCallbacks[key]=callback},TransferState.prototype.toJson=function(){for(var key in this.onSerializeCallbacks)if(this.onSerializeCallbacks.hasOwnProperty(key))try{this.store[key]=this.onSerializeCallbacks[key]()}catch(e){console.warn("Exception in onSerialize callback: ",e)}return JSON.stringify(this.store)},TransferState=TransferState_1=Object(tslib_es6.b)([Object(core.w)()],TransferState)}();function initTransferState(doc,appId){var script=doc.getElementById(appId+"-state"),initialState={};if(script&&script.textContent)try{initialState=JSON.parse(function unescapeHtml(text){var unescapedText={"&a;":"&","&q;":'"',"&s;":"'","&l;":"<","&g;":">"};return text.replace(/&[^;]+;/g,function(s){return unescapedText[s]})}(script.textContent))}catch(e){console.warn("Exception while restoring TransferState for app "+appId,e)}return platform_browser_TransferState.init(initialState)}(function(){function BrowserTransferStateModule(){}BrowserTransferStateModule=Object(tslib_es6.b)([Object(core.E)({providers:[{provide:platform_browser_TransferState,useFactory:initTransferState,deps:[DOCUMENT,core.b]}]})],BrowserTransferStateModule)})(),function(){function By(){}By.all=function(){return function(debugElement){return!0}},By.css=function(selector){return function(debugElement){return null!=debugElement.nativeElement&&getDOM().elementMatches(debugElement.nativeElement,selector)}},By.directive=function(type){return function(debugElement){return-1!==debugElement.providerTokens.indexOf(type)}}}(),new core.eb("8.0.3")
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */;var Observable=__webpack_require__(5),isArray=__webpack_require__(120),EMPTY=new Observable.a(function(subscriber){return subscriber.complete()});function empty(scheduler){return scheduler?function emptyScheduled(scheduler){return new Observable.a(function(subscriber){return scheduler.schedule(function(){return subscriber.complete()})})}(scheduler):EMPTY}var subscribeToResult=__webpack_require__(133),OuterSubscriber=__webpack_require__(134),operators_map=__webpack_require__(131);var forkJoin_ForkJoinSubscriber=function(_super){function ForkJoinSubscriber(destination,sources){var _this=_super.call(this,destination)||this;_this.sources=sources,_this.completed=0,_this.haveValues=0;var len=sources.length;_this.values=new Array(len);for(var i=0;i<len;i++){var source=sources[i],innerSubscription=Object(subscribeToResult.a)(_this,source,null,i);innerSubscription&&_this.add(innerSubscription)}return _this}return tslib_es6.c(ForkJoinSubscriber,_super),ForkJoinSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.values[outerIndex]=innerValue,innerSub._hasValue||(innerSub._hasValue=!0,this.haveValues++)},ForkJoinSubscriber.prototype.notifyComplete=function(innerSub){var destination=this.destination,haveValues=this.haveValues,values=this.values,len=values.length;innerSub._hasValue?(this.completed++,this.completed===len&&(haveValues===len&&destination.next(values),destination.complete())):destination.complete()},ForkJoinSubscriber}(OuterSubscriber.a),from=__webpack_require__(273),NG_VALUE_ACCESSOR=new core.x("NgValueAccessor"),CHECKBOX_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_CheckboxControlValueAccessor}),multi:!0},forms_CheckboxControlValueAccessor=function(){function CheckboxControlValueAccessor(_renderer,_elementRef){this._renderer=_renderer,this._elementRef=_elementRef,this.onChange=function(_){},this.onTouched=function(){}}return CheckboxControlValueAccessor.prototype.writeValue=function(value){this._renderer.setProperty(this._elementRef.nativeElement,"checked",value)},CheckboxControlValueAccessor.prototype.registerOnChange=function(fn){this.onChange=fn},CheckboxControlValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},CheckboxControlValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},CheckboxControlValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]",host:{"(change)":"onChange($event.target.checked)","(blur)":"onTouched()"},providers:[CHECKBOX_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r])],CheckboxControlValueAccessor)}(),DEFAULT_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_DefaultValueAccessor}),multi:!0};var COMPOSITION_BUFFER_MODE=new core.x("CompositionEventMode"),forms_DefaultValueAccessor=function(){function DefaultValueAccessor(_renderer,_elementRef,_compositionMode){this._renderer=_renderer,this._elementRef=_elementRef,this._compositionMode=_compositionMode,this.onChange=function(_){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function _isAndroid(){var userAgent=getDOM()?getDOM().getUserAgent():"";return/android (\d+)/.test(userAgent.toLowerCase())}())}return DefaultValueAccessor.prototype.writeValue=function(value){var normalizedValue=null==value?"":value;this._renderer.setProperty(this._elementRef.nativeElement,"value",normalizedValue)},DefaultValueAccessor.prototype.registerOnChange=function(fn){this.onChange=fn},DefaultValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},DefaultValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},DefaultValueAccessor.prototype._handleInput=function(value){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(value)},DefaultValueAccessor.prototype._compositionStart=function(){this._composing=!0},DefaultValueAccessor.prototype._compositionEnd=function(value){this._composing=!1,this._compositionMode&&this.onChange(value)},DefaultValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]",host:{"(input)":"$any(this)._handleInput($event.target.value)","(blur)":"onTouched()","(compositionstart)":"$any(this)._compositionStart()","(compositionend)":"$any(this)._compositionEnd($event.target.value)"},providers:[DEFAULT_VALUE_ACCESSOR]}),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.v)(COMPOSITION_BUFFER_MODE)),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r,Boolean])],DefaultValueAccessor)}(),AbstractControlDirective=function(){function AbstractControlDirective(){}return Object.defineProperty(AbstractControlDirective.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlDirective.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),AbstractControlDirective.prototype.reset=function(value){void 0===value&&(value=void 0),this.control&&this.control.reset(value)},AbstractControlDirective.prototype.hasError=function(errorCode,path){return!!this.control&&this.control.hasError(errorCode,path)},AbstractControlDirective.prototype.getError=function(errorCode,path){return this.control?this.control.getError(errorCode,path):null},AbstractControlDirective}(),forms_ControlContainer=function(_super){function ControlContainer(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(ControlContainer,_super),Object.defineProperty(ControlContainer.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(ControlContainer.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),ControlContainer}(AbstractControlDirective);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function unimplemented(){throw new Error("unimplemented")}var forms_NgControl=function(_super){function NgControl(){var _this=null!==_super&&_super.apply(this,arguments)||this;return _this._parent=null,_this.name=null,_this.valueAccessor=null,_this._rawValidators=[],_this._rawAsyncValidators=[],_this}return Object(tslib_es6.c)(NgControl,_super),Object.defineProperty(NgControl.prototype,"validator",{get:function(){return unimplemented()},enumerable:!0,configurable:!0}),Object.defineProperty(NgControl.prototype,"asyncValidator",{get:function(){return unimplemented()},enumerable:!0,configurable:!0}),NgControl}(AbstractControlDirective),AbstractControlStatus=function(){function AbstractControlStatus(cd){this._cd=cd}return Object.defineProperty(AbstractControlStatus.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControlStatus.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),AbstractControlStatus}(),ngControlStatusHost={"[class.ng-untouched]":"ngClassUntouched","[class.ng-touched]":"ngClassTouched","[class.ng-pristine]":"ngClassPristine","[class.ng-dirty]":"ngClassDirty","[class.ng-valid]":"ngClassValid","[class.ng-invalid]":"ngClassInvalid","[class.ng-pending]":"ngClassPending"},forms_NgControlStatus=function(_super){function NgControlStatus(cd){return _super.call(this,cd)||this}return Object(tslib_es6.c)(NgControlStatus,_super),NgControlStatus=Object(tslib_es6.b)([Object(core.q)({selector:"[formControlName],[ngModel],[formControl]",host:ngControlStatusHost}),Object(tslib_es6.e)(0,Object(core.W)()),Object(tslib_es6.d)("design:paramtypes",[forms_NgControl])],NgControlStatus)}(AbstractControlStatus),forms_NgControlStatusGroup=function(_super){function NgControlStatusGroup(cd){return _super.call(this,cd)||this}return Object(tslib_es6.c)(NgControlStatusGroup,_super),NgControlStatusGroup=Object(tslib_es6.b)([Object(core.q)({selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]",host:ngControlStatusHost}),Object(tslib_es6.e)(0,Object(core.W)()),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer])],NgControlStatusGroup)}(AbstractControlStatus);
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function isEmptyInputValue(value){return null==value||0===value.length}var NG_VALIDATORS=new core.x("NgValidators"),NG_ASYNC_VALIDATORS=new core.x("NgAsyncValidators"),EMAIL_REGEXP=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+\/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,forms_Validators=function(){function Validators(){}return Validators.min=function(min){return function(control){if(isEmptyInputValue(control.value)||isEmptyInputValue(min))return null;var value=parseFloat(control.value);return!isNaN(value)&&value<min?{min:{min:min,actual:control.value}}:null}},Validators.max=function(max){return function(control){if(isEmptyInputValue(control.value)||isEmptyInputValue(max))return null;var value=parseFloat(control.value);return!isNaN(value)&&value>max?{max:{max:max,actual:control.value}}:null}},Validators.required=function(control){return isEmptyInputValue(control.value)?{required:!0}:null},Validators.requiredTrue=function(control){return!0===control.value?null:{required:!0}},Validators.email=function(control){return isEmptyInputValue(control.value)?null:EMAIL_REGEXP.test(control.value)?null:{email:!0}},Validators.minLength=function(minLength){return function(control){if(isEmptyInputValue(control.value))return null;var length=control.value?control.value.length:0;return length<minLength?{minlength:{requiredLength:minLength,actualLength:length}}:null}},Validators.maxLength=function(maxLength){return function(control){var length=control.value?control.value.length:0;return length>maxLength?{maxlength:{requiredLength:maxLength,actualLength:length}}:null}},Validators.pattern=function(pattern){return pattern?("string"==typeof pattern?(regexStr="","^"!==pattern.charAt(0)&&(regexStr+="^"),regexStr+=pattern,"$"!==pattern.charAt(pattern.length-1)&&(regexStr+="$"),regex=new RegExp(regexStr)):(regexStr=pattern.toString(),regex=pattern),function(control){if(isEmptyInputValue(control.value))return null;var value=control.value;return regex.test(value)?null:{pattern:{requiredPattern:regexStr,actualValue:value}}}):Validators.nullValidator;var regex,regexStr},Validators.nullValidator=function(control){return null},Validators.compose=function(validators){if(!validators)return null;var presentValidators=validators.filter(isPresent);return 0==presentValidators.length?null:function(control){return _mergeErrors(function _executeValidators(control,validators){return validators.map(function(v){return v(control)})}(control,presentValidators))}},Validators.composeAsync=function(validators){if(!validators)return null;var presentValidators=validators.filter(isPresent);return 0==presentValidators.length?null:function(control){return function forkJoin(){for(var resultSelector,sources=[],_i=0;_i<arguments.length;_i++)sources[_i]=arguments[_i];return"function"==typeof sources[sources.length-1]&&(resultSelector=sources.pop()),1===sources.length&&Object(isArray.a)(sources[0])&&(sources=sources[0]),0===sources.length?EMPTY:resultSelector?forkJoin(sources).pipe(Object(operators_map.a)(function(args){return resultSelector.apply(void 0,args)})):new Observable.a(function(subscriber){return new forkJoin_ForkJoinSubscriber(subscriber,sources)})}(function _executeAsyncValidators(control,validators){return validators.map(function(v){return v(control)})}(control,presentValidators).map(toObservable)).pipe(Object(operators_map.a)(_mergeErrors))}},Validators}();function isPresent(o){return null!=o}function toObservable(r){var obs=Object(core.Kb)(r)?Object(from.a)(r):r;if(!Object(core.Jb)(obs))throw new Error("Expected validator to return Promise or Observable.");return obs}function _mergeErrors(arrayOfErrors){var res=arrayOfErrors.reduce(function(res,errors){return null!=errors?Object(tslib_es6.a)({},res,errors):res},{});return 0===Object.keys(res).length?null:res}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function normalizeValidator(validator){return validator.validate?function(c){return validator.validate(c)}:validator}function normalizeAsyncValidator(validator){return validator.validate?function(c){return validator.validate(c)}:validator}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var NUMBER_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_NumberValueAccessor}),multi:!0},forms_NumberValueAccessor=function(){function NumberValueAccessor(_renderer,_elementRef){this._renderer=_renderer,this._elementRef=_elementRef,this.onChange=function(_){},this.onTouched=function(){}}return NumberValueAccessor.prototype.writeValue=function(value){var normalizedValue=null==value?"":value;this._renderer.setProperty(this._elementRef.nativeElement,"value",normalizedValue)},NumberValueAccessor.prototype.registerOnChange=function(fn){this.onChange=function(value){fn(""==value?null:parseFloat(value))}},NumberValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},NumberValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},NumberValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]",host:{"(change)":"onChange($event.target.value)","(input)":"onChange($event.target.value)","(blur)":"onTouched()"},providers:[NUMBER_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r])],NumberValueAccessor)}(),RADIO_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_RadioControlValueAccessor}),multi:!0},forms_RadioControlRegistry=function(){function RadioControlRegistry(){this._accessors=[]}return RadioControlRegistry.prototype.add=function(control,accessor){this._accessors.push([control,accessor])},RadioControlRegistry.prototype.remove=function(accessor){for(var i=this._accessors.length-1;i>=0;--i)if(this._accessors[i][1]===accessor)return void this._accessors.splice(i,1)},RadioControlRegistry.prototype.select=function(accessor){var _this=this;this._accessors.forEach(function(c){_this._isSameGroup(c,accessor)&&c[1]!==accessor&&c[1].fireUncheck(accessor.value)})},RadioControlRegistry.prototype._isSameGroup=function(controlPair,accessor){return!!controlPair[0].control&&(controlPair[0]._parent===accessor._control._parent&&controlPair[1].name===accessor.name)},RadioControlRegistry=Object(tslib_es6.b)([Object(core.w)()],RadioControlRegistry)}(),forms_RadioControlValueAccessor=function(){function RadioControlValueAccessor(_renderer,_elementRef,_registry,_injector){this._renderer=_renderer,this._elementRef=_elementRef,this._registry=_registry,this._injector=_injector,this.onChange=function(){},this.onTouched=function(){}}return RadioControlValueAccessor.prototype.ngOnInit=function(){this._control=this._injector.get(forms_NgControl),this._checkName(),this._registry.add(this._control,this)},RadioControlValueAccessor.prototype.ngOnDestroy=function(){this._registry.remove(this)},RadioControlValueAccessor.prototype.writeValue=function(value){this._state=value===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},RadioControlValueAccessor.prototype.registerOnChange=function(fn){var _this=this;this._fn=fn,this.onChange=function(){fn(_this.value),_this._registry.select(_this)}},RadioControlValueAccessor.prototype.fireUncheck=function(value){this.writeValue(value)},RadioControlValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},RadioControlValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},RadioControlValueAccessor.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},RadioControlValueAccessor.prototype._throwNameError=function(){throw new Error('\n      If you define both a name and a formControlName attribute on your radio button, their values\n      must match. Ex: <input type="radio" formControlName="food" name="food">\n    ')},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",String)],RadioControlValueAccessor.prototype,"name",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",String)],RadioControlValueAccessor.prototype,"formControlName",void 0),Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object)],RadioControlValueAccessor.prototype,"value",void 0),RadioControlValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]",host:{"(change)":"onChange()","(blur)":"onTouched()"},providers:[RADIO_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r,forms_RadioControlRegistry,core.y])],RadioControlValueAccessor)}(),RANGE_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_RangeValueAccessor}),multi:!0},forms_RangeValueAccessor=function(){function RangeValueAccessor(_renderer,_elementRef){this._renderer=_renderer,this._elementRef=_elementRef,this.onChange=function(_){},this.onTouched=function(){}}return RangeValueAccessor.prototype.writeValue=function(value){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(value))},RangeValueAccessor.prototype.registerOnChange=function(fn){this.onChange=function(value){fn(""==value?null:parseFloat(value))}},RangeValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},RangeValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},RangeValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]",host:{"(change)":"onChange($event.target.value)","(input)":"onChange($event.target.value)","(blur)":"onTouched()"},providers:[RANGE_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r])],RangeValueAccessor)}(),FormErrorExamples_formControlName='\n    <div [formGroup]="myGroup">\n      <input formControlName="firstName">\n    </div>\n\n    In your class:\n\n    this.myGroup = new FormGroup({\n       firstName: new FormControl()\n    });',FormErrorExamples_formGroupName='\n    <div [formGroup]="myGroup">\n       <div formGroupName="person">\n          <input formControlName="firstName">\n       </div>\n    </div>\n\n    In your class:\n\n    this.myGroup = new FormGroup({\n       person: new FormGroup({ firstName: new FormControl() })\n    });',FormErrorExamples_formArrayName='\n    <div [formGroup]="myGroup">\n      <div formArrayName="cities">\n        <div *ngFor="let city of cityArray.controls; index as i">\n          <input [formControlName]="i">\n        </div>\n      </div>\n    </div>\n\n    In your class:\n\n    this.cityArray = new FormArray([new FormControl(\'SF\')]);\n    this.myGroup = new FormGroup({\n      cities: this.cityArray\n    });',FormErrorExamples_ngModelGroup='\n    <form>\n       <div ngModelGroup="person">\n          <input [(ngModel)]="person.name" name="firstName">\n       </div>\n    </form>',FormErrorExamples_ngModelWithFormGroup='\n    <div [formGroup]="myGroup">\n       <input formControlName="firstName">\n       <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">\n    </div>\n  ',ReactiveErrors=function(){function ReactiveErrors(){}return ReactiveErrors.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive.  You'll want to add a formGroup\n       directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      Example:\n\n      "+FormErrorExamples_formControlName)},ReactiveErrors.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n       that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n       Option 1:  Update the parent to be formGroupName (reactive form strategy)\n\n        '+FormErrorExamples_formGroupName+"\n\n        Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n        "+FormErrorExamples_ngModelGroup)},ReactiveErrors.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n       Example:\n\n       "+FormErrorExamples_formControlName)},ReactiveErrors.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive.  You'll want to add a formGroup\n      directive and pass it an existing FormGroup instance (you can create one in your class).\n\n      Example:\n\n      "+FormErrorExamples_formGroupName)},ReactiveErrors.arrayParentException=function(){throw new Error("formArrayName must be used with a parent formGroup directive.  You'll want to add a formGroup\n       directive and pass it an existing FormGroup instance (you can create one in your class).\n\n        Example:\n\n        "+FormErrorExamples_formArrayName)},ReactiveErrors.disabledAttrWarning=function(){console.warn("\n      It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n      when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n      you. We recommend using this approach to avoid 'changed after checked' errors.\n       \n      Example: \n      form = new FormGroup({\n        first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n        last: new FormControl('Drew', Validators.required)\n      });\n    ")},ReactiveErrors.ngModelWarning=function(directiveName){console.warn("\n    It looks like you're using ngModel on the same form field as "+directiveName+". \n    Support for using the ngModel input property and ngModelChange event with \n    reactive form directives has been deprecated in Angular v6 and will be removed \n    in Angular v7.\n    \n    For more information on this, see our API docs here:\n    https://angular.io/api/forms/"+("formControl"===directiveName?"FormControlDirective":"FormControlName")+"#use-with-ngmodel\n    ")},ReactiveErrors}(),SELECT_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_SelectControlValueAccessor}),multi:!0};function _buildValueString(id,value){return null==id?""+value:(value&&"object"==typeof value&&(value="Object"),(id+": "+value).slice(0,50))}var forms_SelectControlValueAccessor=function(){function SelectControlValueAccessor(_renderer,_elementRef){this._renderer=_renderer,this._elementRef=_elementRef,this._optionMap=new Map,this._idCounter=0,this.onChange=function(_){},this.onTouched=function(){},this._compareWith=core.Lb}return Object.defineProperty(SelectControlValueAccessor.prototype,"compareWith",{set:function(fn){if("function"!=typeof fn)throw new Error("compareWith must be a function, but received "+JSON.stringify(fn));this._compareWith=fn},enumerable:!0,configurable:!0}),SelectControlValueAccessor.prototype.writeValue=function(value){this.value=value;var id=this._getOptionId(value);null==id&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var valueString=_buildValueString(id,value);this._renderer.setProperty(this._elementRef.nativeElement,"value",valueString)},SelectControlValueAccessor.prototype.registerOnChange=function(fn){var _this=this;this.onChange=function(valueString){_this.value=_this._getOptionValue(valueString),fn(_this.value)}},SelectControlValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},SelectControlValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},SelectControlValueAccessor.prototype._registerOption=function(){return(this._idCounter++).toString()},SelectControlValueAccessor.prototype._getOptionId=function(value){var e_1,_a;try{for(var _b=Object(tslib_es6.h)(Array.from(this._optionMap.keys())),_c=_b.next();!_c.done;_c=_b.next()){var id=_c.value;if(this._compareWith(this._optionMap.get(id),value))return id}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}return null},SelectControlValueAccessor.prototype._getOptionValue=function(valueString){var id=function _extractId(valueString){return valueString.split(":")[0]}(valueString);return this._optionMap.has(id)?this._optionMap.get(id):valueString},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Function),Object(tslib_es6.d)("design:paramtypes",[Function])],SelectControlValueAccessor.prototype,"compareWith",null),SelectControlValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]",host:{"(change)":"onChange($event.target.value)","(blur)":"onTouched()"},providers:[SELECT_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r])],SelectControlValueAccessor)}(),forms_NgSelectOption=function(){function NgSelectOption(_element,_renderer,_select){this._element=_element,this._renderer=_renderer,this._select=_select,this._select&&(this.id=this._select._registerOption())}return Object.defineProperty(NgSelectOption.prototype,"ngValue",{set:function(value){null!=this._select&&(this._select._optionMap.set(this.id,value),this._setElementValue(_buildValueString(this.id,value)),this._select.writeValue(this._select.value))},enumerable:!0,configurable:!0}),Object.defineProperty(NgSelectOption.prototype,"value",{set:function(value){this._setElementValue(value),this._select&&this._select.writeValue(this._select.value)},enumerable:!0,configurable:!0}),NgSelectOption.prototype._setElementValue=function(value){this._renderer.setProperty(this._element.nativeElement,"value",value)},NgSelectOption.prototype.ngOnDestroy=function(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))},Object(tslib_es6.b)([Object(core.z)("ngValue"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgSelectOption.prototype,"ngValue",null),Object(tslib_es6.b)([Object(core.z)("value"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],NgSelectOption.prototype,"value",null),NgSelectOption=Object(tslib_es6.b)([Object(core.q)({selector:"option"}),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.u)()),Object(tslib_es6.d)("design:paramtypes",[core.r,core.R,forms_SelectControlValueAccessor])],NgSelectOption)}(),SELECT_MULTIPLE_VALUE_ACCESSOR={provide:NG_VALUE_ACCESSOR,useExisting:Object(core.lb)(function(){return forms_SelectMultipleControlValueAccessor}),multi:!0};function _buildValueString$1(id,value){return null==id?""+value:("string"==typeof value&&(value="'"+value+"'"),value&&"object"==typeof value&&(value="Object"),(id+": "+value).slice(0,50))}var forms_SelectMultipleControlValueAccessor=function(){function SelectMultipleControlValueAccessor(_renderer,_elementRef){this._renderer=_renderer,this._elementRef=_elementRef,this._optionMap=new Map,this._idCounter=0,this.onChange=function(_){},this.onTouched=function(){},this._compareWith=core.Lb}return Object.defineProperty(SelectMultipleControlValueAccessor.prototype,"compareWith",{set:function(fn){if("function"!=typeof fn)throw new Error("compareWith must be a function, but received "+JSON.stringify(fn));this._compareWith=fn},enumerable:!0,configurable:!0}),SelectMultipleControlValueAccessor.prototype.writeValue=function(value){var optionSelectedStateSetter,_this=this;if(this.value=value,Array.isArray(value)){var ids_1=value.map(function(v){return _this._getOptionId(v)});optionSelectedStateSetter=function(opt,o){opt._setSelected(ids_1.indexOf(o.toString())>-1)}}else optionSelectedStateSetter=function(opt,o){opt._setSelected(!1)};this._optionMap.forEach(optionSelectedStateSetter)},SelectMultipleControlValueAccessor.prototype.registerOnChange=function(fn){var _this=this;this.onChange=function(_){var selected=[];if(_.hasOwnProperty("selectedOptions"))for(var options=_.selectedOptions,i=0;i<options.length;i++){var opt=options.item(i),val=_this._getOptionValue(opt.value);selected.push(val)}else for(options=_.options,i=0;i<options.length;i++){if((opt=options.item(i)).selected){val=_this._getOptionValue(opt.value);selected.push(val)}}_this.value=selected,fn(selected)}},SelectMultipleControlValueAccessor.prototype.registerOnTouched=function(fn){this.onTouched=fn},SelectMultipleControlValueAccessor.prototype.setDisabledState=function(isDisabled){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",isDisabled)},SelectMultipleControlValueAccessor.prototype._registerOption=function(value){var id=(this._idCounter++).toString();return this._optionMap.set(id,value),id},SelectMultipleControlValueAccessor.prototype._getOptionId=function(value){var e_1,_a;try{for(var _b=Object(tslib_es6.h)(Array.from(this._optionMap.keys())),_c=_b.next();!_c.done;_c=_b.next()){var id=_c.value;if(this._compareWith(this._optionMap.get(id)._value,value))return id}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}return null},SelectMultipleControlValueAccessor.prototype._getOptionValue=function(valueString){var id=function _extractId$1(valueString){return valueString.split(":")[0]}(valueString);return this._optionMap.has(id)?this._optionMap.get(id)._value:valueString},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Function),Object(tslib_es6.d)("design:paramtypes",[Function])],SelectMultipleControlValueAccessor.prototype,"compareWith",null),SelectMultipleControlValueAccessor=Object(tslib_es6.b)([Object(core.q)({selector:"select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]",host:{"(change)":"onChange($event.target)","(blur)":"onTouched()"},providers:[SELECT_MULTIPLE_VALUE_ACCESSOR]}),Object(tslib_es6.d)("design:paramtypes",[core.R,core.r])],SelectMultipleControlValueAccessor)}(),forms_NgSelectMultipleOption=function(){function ɵNgSelectMultipleOption(_element,_renderer,_select){this._element=_element,this._renderer=_renderer,this._select=_select,this._select&&(this.id=this._select._registerOption(this))}return Object.defineProperty(ɵNgSelectMultipleOption.prototype,"ngValue",{set:function(value){null!=this._select&&(this._value=value,this._setElementValue(_buildValueString$1(this.id,value)),this._select.writeValue(this._select.value))},enumerable:!0,configurable:!0}),Object.defineProperty(ɵNgSelectMultipleOption.prototype,"value",{set:function(value){this._select?(this._value=value,this._setElementValue(_buildValueString$1(this.id,value)),this._select.writeValue(this._select.value)):this._setElementValue(value)},enumerable:!0,configurable:!0}),ɵNgSelectMultipleOption.prototype._setElementValue=function(value){this._renderer.setProperty(this._element.nativeElement,"value",value)},ɵNgSelectMultipleOption.prototype._setSelected=function(selected){this._renderer.setProperty(this._element.nativeElement,"selected",selected)},ɵNgSelectMultipleOption.prototype.ngOnDestroy=function(){this._select&&(this._select._optionMap.delete(this.id),this._select.writeValue(this._select.value))},Object(tslib_es6.b)([Object(core.z)("ngValue"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],ɵNgSelectMultipleOption.prototype,"ngValue",null),Object(tslib_es6.b)([Object(core.z)("value"),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],ɵNgSelectMultipleOption.prototype,"value",null),ɵNgSelectMultipleOption=Object(tslib_es6.b)([Object(core.q)({selector:"option"}),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.u)()),Object(tslib_es6.d)("design:paramtypes",[core.r,core.R,forms_SelectMultipleControlValueAccessor])],ɵNgSelectMultipleOption)}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function controlPath(name,parent){return Object(tslib_es6.g)(parent.path,[name])}function setUpControl(control,dir){control||_throwError(dir,"Cannot find control with"),dir.valueAccessor||_throwError(dir,"No value accessor for form control with"),control.validator=forms_Validators.compose([control.validator,dir.validator]),control.asyncValidator=forms_Validators.composeAsync([control.asyncValidator,dir.asyncValidator]),dir.valueAccessor.writeValue(control.value),function setUpViewChangePipeline(control,dir){dir.valueAccessor.registerOnChange(function(newValue){control._pendingValue=newValue,control._pendingChange=!0,control._pendingDirty=!0,"change"===control.updateOn&&updateControl(control,dir)})}(control,dir),function setUpModelChangePipeline(control,dir){control.registerOnChange(function(newValue,emitModelEvent){dir.valueAccessor.writeValue(newValue),emitModelEvent&&dir.viewToModelUpdate(newValue)})}(control,dir),function setUpBlurPipeline(control,dir){dir.valueAccessor.registerOnTouched(function(){control._pendingTouched=!0,"blur"===control.updateOn&&control._pendingChange&&updateControl(control,dir),"submit"!==control.updateOn&&control.markAsTouched()})}(control,dir),dir.valueAccessor.setDisabledState&&control.registerOnDisabledChange(function(isDisabled){dir.valueAccessor.setDisabledState(isDisabled)}),dir._rawValidators.forEach(function(validator){validator.registerOnValidatorChange&&validator.registerOnValidatorChange(function(){return control.updateValueAndValidity()})}),dir._rawAsyncValidators.forEach(function(validator){validator.registerOnValidatorChange&&validator.registerOnValidatorChange(function(){return control.updateValueAndValidity()})})}function updateControl(control,dir){control._pendingDirty&&control.markAsDirty(),control.setValue(control._pendingValue,{emitModelToViewChange:!1}),dir.viewToModelUpdate(control._pendingValue),control._pendingChange=!1}function setUpFormContainer(control,dir){null==control&&_throwError(dir,"Cannot find control with"),control.validator=forms_Validators.compose([control.validator,dir.validator]),control.asyncValidator=forms_Validators.composeAsync([control.asyncValidator,dir.asyncValidator])}function _noControlError(dir){return _throwError(dir,"There is no FormControl instance attached to form control element with")}function _throwError(dir,message){var messageEnd;throw messageEnd=dir.path.length>1?"path: '"+dir.path.join(" -> ")+"'":dir.path[0]?"name: '"+dir.path+"'":"unspecified name attribute",new Error(message+" "+messageEnd)}function composeValidators(validators){return null!=validators?forms_Validators.compose(validators.map(normalizeValidator)):null}function composeAsyncValidators(validators){return null!=validators?forms_Validators.composeAsync(validators.map(normalizeAsyncValidator)):null}function isPropertyUpdated(changes,viewModel){if(!changes.hasOwnProperty("model"))return!1;var change=changes.model;return!!change.isFirstChange()||!Object(core.Lb)(viewModel,change.currentValue)}var BUILTIN_ACCESSORS=[forms_CheckboxControlValueAccessor,forms_RangeValueAccessor,forms_NumberValueAccessor,forms_SelectControlValueAccessor,forms_SelectMultipleControlValueAccessor,forms_RadioControlValueAccessor];function syncPendingControls(form,directives){form._syncPendingControls(),directives.forEach(function(dir){var control=dir.control;"submit"===control.updateOn&&control._pendingChange&&(dir.viewToModelUpdate(control._pendingValue),control._pendingChange=!1)})}function selectValueAccessor(dir,valueAccessors){if(!valueAccessors)return null;Array.isArray(valueAccessors)||_throwError(dir,"Value accessor was not provided as an array for form control with");var defaultAccessor=void 0,builtinAccessor=void 0,customAccessor=void 0;return valueAccessors.forEach(function(v){v.constructor===forms_DefaultValueAccessor?defaultAccessor=v:!function isBuiltInAccessor(valueAccessor){return BUILTIN_ACCESSORS.some(function(a){return valueAccessor.constructor===a})}(v)?(customAccessor&&_throwError(dir,"More than one custom value accessor matches form control with"),customAccessor=v):(builtinAccessor&&_throwError(dir,"More than one built-in value accessor matches form control with"),builtinAccessor=v)}),customAccessor||(builtinAccessor||(defaultAccessor||(_throwError(dir,"No valid value accessor for form control with"),null)))}function removeDir(list,el){var index=list.indexOf(el);index>-1&&list.splice(index,1)}function _ngModelWarning(name,type,instance,warningConfig){Object(core.nb)()&&"never"!==warningConfig&&((null!==warningConfig&&"once"!==warningConfig||type._ngModelWarningSentOnce)&&("always"!==warningConfig||instance._ngModelWarningSent)||(ReactiveErrors.ngModelWarning(name),type._ngModelWarningSentOnce=!0,instance._ngModelWarningSent=!0))}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */function coerceToValidator(validatorOrOpts){var validator=isOptionsObj(validatorOrOpts)?validatorOrOpts.validators:validatorOrOpts;return Array.isArray(validator)?composeValidators(validator):validator||null}function coerceToAsyncValidator(asyncValidator,validatorOrOpts){var origAsyncValidator=isOptionsObj(validatorOrOpts)?validatorOrOpts.asyncValidators:asyncValidator;return Array.isArray(origAsyncValidator)?composeAsyncValidators(origAsyncValidator):origAsyncValidator||null}function isOptionsObj(validatorOrOpts){return null!=validatorOrOpts&&!Array.isArray(validatorOrOpts)&&"object"==typeof validatorOrOpts}var forms_AbstractControl=function(){function AbstractControl(validator,asyncValidator){this.validator=validator,this.asyncValidator=asyncValidator,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(AbstractControl.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractControl.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),AbstractControl.prototype.setValidators=function(newValidator){this.validator=coerceToValidator(newValidator)},AbstractControl.prototype.setAsyncValidators=function(newValidator){this.asyncValidator=coerceToAsyncValidator(newValidator)},AbstractControl.prototype.clearValidators=function(){this.validator=null},AbstractControl.prototype.clearAsyncValidators=function(){this.asyncValidator=null},AbstractControl.prototype.markAsTouched=function(opts){void 0===opts&&(opts={}),this.touched=!0,this._parent&&!opts.onlySelf&&this._parent.markAsTouched(opts)},AbstractControl.prototype.markAllAsTouched=function(){this.markAsTouched({onlySelf:!0}),this._forEachChild(function(control){return control.markAllAsTouched()})},AbstractControl.prototype.markAsUntouched=function(opts){void 0===opts&&(opts={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(control){control.markAsUntouched({onlySelf:!0})}),this._parent&&!opts.onlySelf&&this._parent._updateTouched(opts)},AbstractControl.prototype.markAsDirty=function(opts){void 0===opts&&(opts={}),this.pristine=!1,this._parent&&!opts.onlySelf&&this._parent.markAsDirty(opts)},AbstractControl.prototype.markAsPristine=function(opts){void 0===opts&&(opts={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(control){control.markAsPristine({onlySelf:!0})}),this._parent&&!opts.onlySelf&&this._parent._updatePristine(opts)},AbstractControl.prototype.markAsPending=function(opts){void 0===opts&&(opts={}),this.status="PENDING",!1!==opts.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!opts.onlySelf&&this._parent.markAsPending(opts)},AbstractControl.prototype.disable=function(opts){void 0===opts&&(opts={});var skipPristineCheck=this._parentMarkedDirty(opts.onlySelf);this.status="DISABLED",this.errors=null,this._forEachChild(function(control){control.disable(Object(tslib_es6.a)({},opts,{onlySelf:!0}))}),this._updateValue(),!1!==opts.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Object(tslib_es6.a)({},opts,{skipPristineCheck:skipPristineCheck})),this._onDisabledChange.forEach(function(changeFn){return changeFn(!0)})},AbstractControl.prototype.enable=function(opts){void 0===opts&&(opts={});var skipPristineCheck=this._parentMarkedDirty(opts.onlySelf);this.status="VALID",this._forEachChild(function(control){control.enable(Object(tslib_es6.a)({},opts,{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:opts.emitEvent}),this._updateAncestors(Object(tslib_es6.a)({},opts,{skipPristineCheck:skipPristineCheck})),this._onDisabledChange.forEach(function(changeFn){return changeFn(!1)})},AbstractControl.prototype._updateAncestors=function(opts){this._parent&&!opts.onlySelf&&(this._parent.updateValueAndValidity(opts),opts.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())},AbstractControl.prototype.setParent=function(parent){this._parent=parent},AbstractControl.prototype.updateValueAndValidity=function(opts){void 0===opts&&(opts={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(opts.emitEvent)),!1!==opts.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!opts.onlySelf&&this._parent.updateValueAndValidity(opts)},AbstractControl.prototype._updateTreeValidity=function(opts){void 0===opts&&(opts={emitEvent:!0}),this._forEachChild(function(ctrl){return ctrl._updateTreeValidity(opts)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:opts.emitEvent})},AbstractControl.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},AbstractControl.prototype._runValidator=function(){return this.validator?this.validator(this):null},AbstractControl.prototype._runAsyncValidator=function(emitEvent){var _this=this;if(this.asyncValidator){this.status="PENDING";var obs=toObservable(this.asyncValidator(this));this._asyncValidationSubscription=obs.subscribe(function(errors){return _this.setErrors(errors,{emitEvent:emitEvent})})}},AbstractControl.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},AbstractControl.prototype.setErrors=function(errors,opts){void 0===opts&&(opts={}),this.errors=errors,this._updateControlsErrors(!1!==opts.emitEvent)},AbstractControl.prototype.get=function(path){return function _find(control,path,delimiter){return null==path?null:(path instanceof Array||(path=path.split(delimiter)),path instanceof Array&&0===path.length?null:path.reduce(function(v,name){return v instanceof forms_FormGroup?v.controls.hasOwnProperty(name)?v.controls[name]:null:v instanceof forms_FormArray&&v.at(name)||null},control))}(this,path,".")},AbstractControl.prototype.getError=function(errorCode,path){var control=path?this.get(path):this;return control&&control.errors?control.errors[errorCode]:null},AbstractControl.prototype.hasError=function(errorCode,path){return!!this.getError(errorCode,path)},Object.defineProperty(AbstractControl.prototype,"root",{get:function(){for(var x=this;x._parent;)x=x._parent;return x},enumerable:!0,configurable:!0}),AbstractControl.prototype._updateControlsErrors=function(emitEvent){this.status=this._calculateStatus(),emitEvent&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(emitEvent)},AbstractControl.prototype._initObservables=function(){this.valueChanges=new core.t,this.statusChanges=new core.t},AbstractControl.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},AbstractControl.prototype._anyControlsHaveStatus=function(status){return this._anyControls(function(control){return control.status===status})},AbstractControl.prototype._anyControlsDirty=function(){return this._anyControls(function(control){return control.dirty})},AbstractControl.prototype._anyControlsTouched=function(){return this._anyControls(function(control){return control.touched})},AbstractControl.prototype._updatePristine=function(opts){void 0===opts&&(opts={}),this.pristine=!this._anyControlsDirty(),this._parent&&!opts.onlySelf&&this._parent._updatePristine(opts)},AbstractControl.prototype._updateTouched=function(opts){void 0===opts&&(opts={}),this.touched=this._anyControlsTouched(),this._parent&&!opts.onlySelf&&this._parent._updateTouched(opts)},AbstractControl.prototype._isBoxedValue=function(formState){return"object"==typeof formState&&null!==formState&&2===Object.keys(formState).length&&"value"in formState&&"disabled"in formState},AbstractControl.prototype._registerOnCollectionChange=function(fn){this._onCollectionChange=fn},AbstractControl.prototype._setUpdateStrategy=function(opts){isOptionsObj(opts)&&null!=opts.updateOn&&(this._updateOn=opts.updateOn)},AbstractControl.prototype._parentMarkedDirty=function(onlySelf){var parentDirty=this._parent&&this._parent.dirty;return!onlySelf&&parentDirty&&!this._parent._anyControlsDirty()},AbstractControl}(),forms_FormControl=function(_super){function FormControl(formState,validatorOrOpts,asyncValidator){void 0===formState&&(formState=null);var _this=_super.call(this,coerceToValidator(validatorOrOpts),coerceToAsyncValidator(asyncValidator,validatorOrOpts))||this;return _this._onChange=[],_this._applyFormState(formState),_this._setUpdateStrategy(validatorOrOpts),_this.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),_this._initObservables(),_this}return Object(tslib_es6.c)(FormControl,_super),FormControl.prototype.setValue=function(value,options){var _this=this;void 0===options&&(options={}),this.value=this._pendingValue=value,this._onChange.length&&!1!==options.emitModelToViewChange&&this._onChange.forEach(function(changeFn){return changeFn(_this.value,!1!==options.emitViewToModelChange)}),this.updateValueAndValidity(options)},FormControl.prototype.patchValue=function(value,options){void 0===options&&(options={}),this.setValue(value,options)},FormControl.prototype.reset=function(formState,options){void 0===formState&&(formState=null),void 0===options&&(options={}),this._applyFormState(formState),this.markAsPristine(options),this.markAsUntouched(options),this.setValue(this.value,options),this._pendingChange=!1},FormControl.prototype._updateValue=function(){},FormControl.prototype._anyControls=function(condition){return!1},FormControl.prototype._allControlsDisabled=function(){return this.disabled},FormControl.prototype.registerOnChange=function(fn){this._onChange.push(fn)},FormControl.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},FormControl.prototype.registerOnDisabledChange=function(fn){this._onDisabledChange.push(fn)},FormControl.prototype._forEachChild=function(cb){},FormControl.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange))&&(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0)},FormControl.prototype._applyFormState=function(formState){this._isBoxedValue(formState)?(this.value=this._pendingValue=formState.value,formState.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=formState},FormControl}(forms_AbstractControl),forms_FormGroup=function(_super){function FormGroup(controls,validatorOrOpts,asyncValidator){var _this=_super.call(this,coerceToValidator(validatorOrOpts),coerceToAsyncValidator(asyncValidator,validatorOrOpts))||this;return _this.controls=controls,_this._initObservables(),_this._setUpdateStrategy(validatorOrOpts),_this._setUpControls(),_this.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),_this}return Object(tslib_es6.c)(FormGroup,_super),FormGroup.prototype.registerControl=function(name,control){return this.controls[name]?this.controls[name]:(this.controls[name]=control,control.setParent(this),control._registerOnCollectionChange(this._onCollectionChange),control)},FormGroup.prototype.addControl=function(name,control){this.registerControl(name,control),this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.removeControl=function(name){this.controls[name]&&this.controls[name]._registerOnCollectionChange(function(){}),delete this.controls[name],this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.setControl=function(name,control){this.controls[name]&&this.controls[name]._registerOnCollectionChange(function(){}),delete this.controls[name],control&&this.registerControl(name,control),this.updateValueAndValidity(),this._onCollectionChange()},FormGroup.prototype.contains=function(controlName){return this.controls.hasOwnProperty(controlName)&&this.controls[controlName].enabled},FormGroup.prototype.setValue=function(value,options){var _this=this;void 0===options&&(options={}),this._checkAllValuesPresent(value),Object.keys(value).forEach(function(name){_this._throwIfControlMissing(name),_this.controls[name].setValue(value[name],{onlySelf:!0,emitEvent:options.emitEvent})}),this.updateValueAndValidity(options)},FormGroup.prototype.patchValue=function(value,options){var _this=this;void 0===options&&(options={}),Object.keys(value).forEach(function(name){_this.controls[name]&&_this.controls[name].patchValue(value[name],{onlySelf:!0,emitEvent:options.emitEvent})}),this.updateValueAndValidity(options)},FormGroup.prototype.reset=function(value,options){void 0===value&&(value={}),void 0===options&&(options={}),this._forEachChild(function(control,name){control.reset(value[name],{onlySelf:!0,emitEvent:options.emitEvent})}),this._updatePristine(options),this._updateTouched(options),this.updateValueAndValidity(options)},FormGroup.prototype.getRawValue=function(){return this._reduceChildren({},function(acc,control,name){return acc[name]=control instanceof forms_FormControl?control.value:control.getRawValue(),acc})},FormGroup.prototype._syncPendingControls=function(){var subtreeUpdated=this._reduceChildren(!1,function(updated,child){return!!child._syncPendingControls()||updated});return subtreeUpdated&&this.updateValueAndValidity({onlySelf:!0}),subtreeUpdated},FormGroup.prototype._throwIfControlMissing=function(name){if(!Object.keys(this.controls).length)throw new Error("\n        There are no form controls registered with this group yet.  If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.controls[name])throw new Error("Cannot find form control with name: "+name+".")},FormGroup.prototype._forEachChild=function(cb){var _this=this;Object.keys(this.controls).forEach(function(k){return cb(_this.controls[k],k)})},FormGroup.prototype._setUpControls=function(){var _this=this;this._forEachChild(function(control){control.setParent(_this),control._registerOnCollectionChange(_this._onCollectionChange)})},FormGroup.prototype._updateValue=function(){this.value=this._reduceValue()},FormGroup.prototype._anyControls=function(condition){var _this=this,res=!1;return this._forEachChild(function(control,name){res=res||_this.contains(name)&&condition(control)}),res},FormGroup.prototype._reduceValue=function(){var _this=this;return this._reduceChildren({},function(acc,control,name){return(control.enabled||_this.disabled)&&(acc[name]=control.value),acc})},FormGroup.prototype._reduceChildren=function(initValue,fn){var res=initValue;return this._forEachChild(function(control,name){res=fn(res,control,name)}),res},FormGroup.prototype._allControlsDisabled=function(){var e_1,_a;try{for(var _b=Object(tslib_es6.h)(Object.keys(this.controls)),_c=_b.next();!_c.done;_c=_b.next()){var controlName=_c.value;if(this.controls[controlName].enabled)return!1}}catch(e_1_1){e_1={error:e_1_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_1)throw e_1.error}}return Object.keys(this.controls).length>0||this.disabled},FormGroup.prototype._checkAllValuesPresent=function(value){this._forEachChild(function(control,name){if(void 0===value[name])throw new Error("Must supply a value for form control with name: '"+name+"'.")})},FormGroup}(forms_AbstractControl),forms_FormArray=function(_super){function FormArray(controls,validatorOrOpts,asyncValidator){var _this=_super.call(this,coerceToValidator(validatorOrOpts),coerceToAsyncValidator(asyncValidator,validatorOrOpts))||this;return _this.controls=controls,_this._initObservables(),_this._setUpdateStrategy(validatorOrOpts),_this._setUpControls(),_this.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),_this}return Object(tslib_es6.c)(FormArray,_super),FormArray.prototype.at=function(index){return this.controls[index]},FormArray.prototype.push=function(control){this.controls.push(control),this._registerControl(control),this.updateValueAndValidity(),this._onCollectionChange()},FormArray.prototype.insert=function(index,control){this.controls.splice(index,0,control),this._registerControl(control),this.updateValueAndValidity()},FormArray.prototype.removeAt=function(index){this.controls[index]&&this.controls[index]._registerOnCollectionChange(function(){}),this.controls.splice(index,1),this.updateValueAndValidity()},FormArray.prototype.setControl=function(index,control){this.controls[index]&&this.controls[index]._registerOnCollectionChange(function(){}),this.controls.splice(index,1),control&&(this.controls.splice(index,0,control),this._registerControl(control)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(FormArray.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),FormArray.prototype.setValue=function(value,options){var _this=this;void 0===options&&(options={}),this._checkAllValuesPresent(value),value.forEach(function(newValue,index){_this._throwIfControlMissing(index),_this.at(index).setValue(newValue,{onlySelf:!0,emitEvent:options.emitEvent})}),this.updateValueAndValidity(options)},FormArray.prototype.patchValue=function(value,options){var _this=this;void 0===options&&(options={}),value.forEach(function(newValue,index){_this.at(index)&&_this.at(index).patchValue(newValue,{onlySelf:!0,emitEvent:options.emitEvent})}),this.updateValueAndValidity(options)},FormArray.prototype.reset=function(value,options){void 0===value&&(value=[]),void 0===options&&(options={}),this._forEachChild(function(control,index){control.reset(value[index],{onlySelf:!0,emitEvent:options.emitEvent})}),this._updatePristine(options),this._updateTouched(options),this.updateValueAndValidity(options)},FormArray.prototype.getRawValue=function(){return this.controls.map(function(control){return control instanceof forms_FormControl?control.value:control.getRawValue()})},FormArray.prototype.clear=function(){this.controls.length<1||(this._forEachChild(function(control){return control._registerOnCollectionChange(function(){})}),this.controls.splice(0),this.updateValueAndValidity())},FormArray.prototype._syncPendingControls=function(){var subtreeUpdated=this.controls.reduce(function(updated,child){return!!child._syncPendingControls()||updated},!1);return subtreeUpdated&&this.updateValueAndValidity({onlySelf:!0}),subtreeUpdated},FormArray.prototype._throwIfControlMissing=function(index){if(!this.controls.length)throw new Error("\n        There are no form controls registered with this array yet.  If you're using ngModel,\n        you may want to check next tick (e.g. use setTimeout).\n      ");if(!this.at(index))throw new Error("Cannot find form control at index "+index)},FormArray.prototype._forEachChild=function(cb){this.controls.forEach(function(control,index){cb(control,index)})},FormArray.prototype._updateValue=function(){var _this=this;this.value=this.controls.filter(function(control){return control.enabled||_this.disabled}).map(function(control){return control.value})},FormArray.prototype._anyControls=function(condition){return this.controls.some(function(control){return control.enabled&&condition(control)})},FormArray.prototype._setUpControls=function(){var _this=this;this._forEachChild(function(control){return _this._registerControl(control)})},FormArray.prototype._checkAllValuesPresent=function(value){this._forEachChild(function(control,i){if(void 0===value[i])throw new Error("Must supply a value for form control at index: "+i+".")})},FormArray.prototype._allControlsDisabled=function(){var e_2,_a;try{for(var _b=Object(tslib_es6.h)(this.controls),_c=_b.next();!_c.done;_c=_b.next()){if(_c.value.enabled)return!1}}catch(e_2_1){e_2={error:e_2_1}}finally{try{_c&&!_c.done&&(_a=_b.return)&&_a.call(_b)}finally{if(e_2)throw e_2.error}}return this.controls.length>0||this.disabled},FormArray.prototype._registerControl=function(control){control.setParent(this),control._registerOnCollectionChange(this._onCollectionChange)},FormArray}(forms_AbstractControl),formDirectiveProvider={provide:forms_ControlContainer,useExisting:Object(core.lb)(function(){return forms_NgForm})},resolvedPromise=Promise.resolve(null),forms_NgForm=function(_super){function NgForm(validators,asyncValidators){var _this=_super.call(this)||this;return _this.submitted=!1,_this._directives=[],_this.ngSubmit=new core.t,_this.form=new forms_FormGroup({},composeValidators(validators),composeAsyncValidators(asyncValidators)),_this}return Object(tslib_es6.c)(NgForm,_super),NgForm.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(NgForm.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(NgForm.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),NgForm.prototype.addControl=function(dir){var _this=this;resolvedPromise.then(function(){var container=_this._findContainer(dir.path);dir.control=container.registerControl(dir.name,dir.control),setUpControl(dir.control,dir),dir.control.updateValueAndValidity({emitEvent:!1}),_this._directives.push(dir)})},NgForm.prototype.getControl=function(dir){return this.form.get(dir.path)},NgForm.prototype.removeControl=function(dir){var _this=this;resolvedPromise.then(function(){var container=_this._findContainer(dir.path);container&&container.removeControl(dir.name),removeDir(_this._directives,dir)})},NgForm.prototype.addFormGroup=function(dir){var _this=this;resolvedPromise.then(function(){var container=_this._findContainer(dir.path),group=new forms_FormGroup({});setUpFormContainer(group,dir),container.registerControl(dir.name,group),group.updateValueAndValidity({emitEvent:!1})})},NgForm.prototype.removeFormGroup=function(dir){var _this=this;resolvedPromise.then(function(){var container=_this._findContainer(dir.path);container&&container.removeControl(dir.name)})},NgForm.prototype.getFormGroup=function(dir){return this.form.get(dir.path)},NgForm.prototype.updateModel=function(dir,value){var _this=this;resolvedPromise.then(function(){_this.form.get(dir.path).setValue(value)})},NgForm.prototype.setValue=function(value){this.control.setValue(value)},NgForm.prototype.onSubmit=function($event){return this.submitted=!0,syncPendingControls(this.form,this._directives),this.ngSubmit.emit($event),!1},NgForm.prototype.onReset=function(){this.resetForm()},NgForm.prototype.resetForm=function(value){void 0===value&&(value=void 0),this.form.reset(value),this.submitted=!1},NgForm.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},NgForm.prototype._findContainer=function(path){return path.pop(),path.length?this.form.get(path):this.form},Object(tslib_es6.b)([Object(core.z)("ngFormOptions"),Object(tslib_es6.d)("design:type",Object)],NgForm.prototype,"options",void 0),NgForm=Object(tslib_es6.b)([Object(core.q)({selector:"form:not([ngNoForm]):not([formGroup]),ngForm,ng-form,[ngForm]",providers:[formDirectiveProvider],host:{"(submit)":"onSubmit($event)","(reset)":"onReset()"},outputs:["ngSubmit"],exportAs:"ngForm"}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.W)()),Object(tslib_es6.e)(0,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.d)("design:paramtypes",[Array,Array])],NgForm)}(forms_ControlContainer),TemplateDrivenErrors=function(){function TemplateDrivenErrors(){}return TemplateDrivenErrors.modelParentException=function(){throw new Error('\n      ngModel cannot be used to register form controls with a parent formGroup directive.  Try using\n      formGroup\'s partner directive "formControlName" instead.  Example:\n\n      '+FormErrorExamples_formControlName+"\n\n      Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions:\n\n      Example:\n\n      "+FormErrorExamples_ngModelWithFormGroup)},TemplateDrivenErrors.formGroupNameException=function(){throw new Error("\n      ngModel cannot be used to register form controls with a parent formGroupName or formArrayName directive.\n\n      Option 1: Use formControlName instead of ngModel (reactive strategy):\n\n      "+FormErrorExamples_formGroupName+"\n\n      Option 2:  Update ngModel's parent be ngModelGroup (template-driven strategy):\n\n      "+FormErrorExamples_ngModelGroup)},TemplateDrivenErrors.missingNameException=function(){throw new Error('If ngModel is used within a form tag, either the name attribute must be set or the form\n      control must be defined as \'standalone\' in ngModelOptions.\n\n      Example 1: <input [(ngModel)]="person.firstName" name="first">\n      Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">')},TemplateDrivenErrors.modelGroupParentException=function(){throw new Error("\n      ngModelGroup cannot be used with a parent formGroup directive.\n\n      Option 1: Use formGroupName instead of ngModelGroup (reactive strategy):\n\n      "+FormErrorExamples_formGroupName+"\n\n      Option 2:  Use a regular form tag instead of the formGroup directive (template-driven strategy):\n\n      "+FormErrorExamples_ngModelGroup)},TemplateDrivenErrors.ngFormWarning=function(){console.warn("\n    It looks like you're using 'ngForm'.\n\n    Support for using the 'ngForm' element selector has been deprecated in Angular v6 and will be removed\n    in Angular v9.\n\n    Use 'ng-form' instead.\n\n    Before:\n    <ngForm #myForm=\"ngForm\">\n\n    After:\n    <ng-form #myForm=\"ngForm\">\n    ")},TemplateDrivenErrors}(),NG_FORM_SELECTOR_WARNING=new core.x("NgFormSelectorWarning"),forms_NgFormSelectorWarning=function(){function NgFormSelectorWarning(ngFormWarning){(ngFormWarning&&"once"!==ngFormWarning||NgFormSelectorWarning_1._ngFormWarning)&&"always"!==ngFormWarning||(TemplateDrivenErrors.ngFormWarning(),NgFormSelectorWarning_1._ngFormWarning=!0)}var NgFormSelectorWarning_1;return NgFormSelectorWarning_1=NgFormSelectorWarning,NgFormSelectorWarning._ngFormWarning=!1,NgFormSelectorWarning=NgFormSelectorWarning_1=Object(tslib_es6.b)([Object(core.q)({selector:"ngForm"}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.v)(NG_FORM_SELECTOR_WARNING)),Object(tslib_es6.d)("design:paramtypes",[Object])],NgFormSelectorWarning)}(),forms_AbstractFormGroupDirective=function(_super){function AbstractFormGroupDirective(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(AbstractFormGroupDirective,_super),AbstractFormGroupDirective.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},AbstractFormGroupDirective.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(AbstractFormGroupDirective.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"validator",{get:function(){return composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(AbstractFormGroupDirective.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),AbstractFormGroupDirective.prototype._checkParentType=function(){},AbstractFormGroupDirective}(forms_ControlContainer),modelGroupProvider={provide:forms_ControlContainer,useExisting:Object(core.lb)(function(){return forms_NgModelGroup})},forms_NgModelGroup=function(_super){function NgModelGroup(parent,validators,asyncValidators){var _this=_super.call(this)||this;return _this._parent=parent,_this._validators=validators,_this._asyncValidators=asyncValidators,_this}var NgModelGroup_1;return Object(tslib_es6.c)(NgModelGroup,_super),NgModelGroup_1=NgModelGroup,NgModelGroup.prototype._checkParentType=function(){this._parent instanceof NgModelGroup_1||this._parent instanceof forms_NgForm||TemplateDrivenErrors.modelGroupParentException()},Object(tslib_es6.b)([Object(core.z)("ngModelGroup"),Object(tslib_es6.d)("design:type",String)],NgModelGroup.prototype,"name",void 0),NgModelGroup=NgModelGroup_1=Object(tslib_es6.b)([Object(core.q)({selector:"[ngModelGroup]",providers:[modelGroupProvider],exportAs:"ngModelGroup"}),Object(tslib_es6.e)(0,Object(core.u)()),Object(tslib_es6.e)(0,Object(core.Y)()),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer,Array,Array])],NgModelGroup)}(forms_AbstractFormGroupDirective),formControlBinding={provide:forms_NgControl,useExisting:Object(core.lb)(function(){return forms_NgModel})},resolvedPromise$1=Promise.resolve(null),forms_NgModel=function(_super){function NgModel(parent,validators,asyncValidators,valueAccessors){var _this=_super.call(this)||this;return _this.control=new forms_FormControl,_this._registered=!1,_this.update=new core.t,_this._parent=parent,_this._rawValidators=validators||[],_this._rawAsyncValidators=asyncValidators||[],_this.valueAccessor=selectValueAccessor(_this,valueAccessors),_this}return Object(tslib_es6.c)(NgModel,_super),NgModel.prototype.ngOnChanges=function(changes){this._checkForErrors(),this._registered||this._setUpControl(),"isDisabled"in changes&&this._updateDisabled(changes),isPropertyUpdated(changes,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)},NgModel.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},Object.defineProperty(NgModel.prototype,"path",{get:function(){return this._parent?controlPath(this.name,this._parent):[this.name]},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(NgModel.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),NgModel.prototype.viewToModelUpdate=function(newValue){this.viewModel=newValue,this.update.emit(newValue)},NgModel.prototype._setUpControl=function(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0},NgModel.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)},NgModel.prototype._isStandalone=function(){return!this._parent||!(!this.options||!this.options.standalone)},NgModel.prototype._setUpStandalone=function(){setUpControl(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})},NgModel.prototype._checkForErrors=function(){this._isStandalone()||this._checkParentType(),this._checkName()},NgModel.prototype._checkParentType=function(){!(this._parent instanceof forms_NgModelGroup)&&this._parent instanceof forms_AbstractFormGroupDirective?TemplateDrivenErrors.formGroupNameException():this._parent instanceof forms_NgModelGroup||this._parent instanceof forms_NgForm||TemplateDrivenErrors.modelParentException()},NgModel.prototype._checkName=function(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()||this.name||TemplateDrivenErrors.missingNameException()},NgModel.prototype._updateValue=function(value){var _this=this;resolvedPromise$1.then(function(){_this.control.setValue(value,{emitViewToModelChange:!1})})},NgModel.prototype._updateDisabled=function(changes){var _this=this,disabledValue=changes.isDisabled.currentValue,isDisabled=""===disabledValue||disabledValue&&"false"!==disabledValue;resolvedPromise$1.then(function(){isDisabled&&!_this.control.disabled?_this.control.disable():!isDisabled&&_this.control.disabled&&_this.control.enable()})},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",String)],NgModel.prototype,"name",void 0),Object(tslib_es6.b)([Object(core.z)("disabled"),Object(tslib_es6.d)("design:type",Boolean)],NgModel.prototype,"isDisabled",void 0),Object(tslib_es6.b)([Object(core.z)("ngModel"),Object(tslib_es6.d)("design:type",Object)],NgModel.prototype,"model",void 0),Object(tslib_es6.b)([Object(core.z)("ngModelOptions"),Object(tslib_es6.d)("design:type",Object)],NgModel.prototype,"options",void 0),Object(tslib_es6.b)([Object(core.K)("ngModelChange"),Object(tslib_es6.d)("design:type",Object)],NgModel.prototype,"update",void 0),NgModel=Object(tslib_es6.b)([Object(core.q)({selector:"[ngModel]:not([formControlName]):not([formControl])",providers:[formControlBinding],exportAs:"ngModel"}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.u)()),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.e)(3,Object(core.J)()),Object(tslib_es6.e)(3,Object(core.W)()),Object(tslib_es6.e)(3,Object(core.v)(NG_VALUE_ACCESSOR)),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer,Array,Array,Array])],NgModel)}(forms_NgControl),forms_NgNoValidate=function(){function ɵNgNoValidate(){}return ɵNgNoValidate=Object(tslib_es6.b)([Object(core.q)({selector:"form:not([ngNoForm]):not([ngNativeValidate])",host:{novalidate:""}})],ɵNgNoValidate)}(),NG_MODEL_WITH_FORM_CONTROL_WARNING=new core.x("NgModelWithFormControlWarning"),formControlBinding$1={provide:forms_NgControl,useExisting:Object(core.lb)(function(){return forms_FormControlDirective})},forms_FormControlDirective=function(_super){function FormControlDirective(validators,asyncValidators,valueAccessors,_ngModelWarningConfig){var _this=_super.call(this)||this;return _this._ngModelWarningConfig=_ngModelWarningConfig,_this.update=new core.t,_this._ngModelWarningSent=!1,_this._rawValidators=validators||[],_this._rawAsyncValidators=asyncValidators||[],_this.valueAccessor=selectValueAccessor(_this,valueAccessors),_this}var FormControlDirective_1;return Object(tslib_es6.c)(FormControlDirective,_super),FormControlDirective_1=FormControlDirective,Object.defineProperty(FormControlDirective.prototype,"isDisabled",{set:function(isDisabled){ReactiveErrors.disabledAttrWarning()},enumerable:!0,configurable:!0}),FormControlDirective.prototype.ngOnChanges=function(changes){this._isControlChanged(changes)&&(setUpControl(this.form,this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this.form.updateValueAndValidity({emitEvent:!1})),isPropertyUpdated(changes,this.viewModel)&&(_ngModelWarning("formControl",FormControlDirective_1,this,this._ngModelWarningConfig),this.form.setValue(this.model),this.viewModel=this.model)},Object.defineProperty(FormControlDirective.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlDirective.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),FormControlDirective.prototype.viewToModelUpdate=function(newValue){this.viewModel=newValue,this.update.emit(newValue)},FormControlDirective.prototype._isControlChanged=function(changes){return changes.hasOwnProperty("form")},FormControlDirective._ngModelWarningSentOnce=!1,Object(tslib_es6.b)([Object(core.z)("formControl"),Object(tslib_es6.d)("design:type",forms_FormControl)],FormControlDirective.prototype,"form",void 0),Object(tslib_es6.b)([Object(core.z)("disabled"),Object(tslib_es6.d)("design:type",Boolean),Object(tslib_es6.d)("design:paramtypes",[Boolean])],FormControlDirective.prototype,"isDisabled",null),Object(tslib_es6.b)([Object(core.z)("ngModel"),Object(tslib_es6.d)("design:type",Object)],FormControlDirective.prototype,"model",void 0),Object(tslib_es6.b)([Object(core.K)("ngModelChange"),Object(tslib_es6.d)("design:type",Object)],FormControlDirective.prototype,"update",void 0),FormControlDirective=FormControlDirective_1=Object(tslib_es6.b)([Object(core.q)({selector:"[formControl]",providers:[formControlBinding$1],exportAs:"ngForm"}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.W)()),Object(tslib_es6.e)(0,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_VALUE_ACCESSOR)),Object(tslib_es6.e)(3,Object(core.J)()),Object(tslib_es6.e)(3,Object(core.v)(NG_MODEL_WITH_FORM_CONTROL_WARNING)),Object(tslib_es6.d)("design:paramtypes",[Array,Array,Array,Object])],FormControlDirective)}(forms_NgControl),formDirectiveProvider$1={provide:forms_ControlContainer,useExisting:Object(core.lb)(function(){return forms_FormGroupDirective})},forms_FormGroupDirective=function(_super){function FormGroupDirective(_validators,_asyncValidators){var _this=_super.call(this)||this;return _this._validators=_validators,_this._asyncValidators=_asyncValidators,_this.submitted=!1,_this.directives=[],_this.form=null,_this.ngSubmit=new core.t,_this}return Object(tslib_es6.c)(FormGroupDirective,_super),FormGroupDirective.prototype.ngOnChanges=function(changes){this._checkFormPresent(),changes.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(FormGroupDirective.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(FormGroupDirective.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(FormGroupDirective.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),FormGroupDirective.prototype.addControl=function(dir){var ctrl=this.form.get(dir.path);return setUpControl(ctrl,dir),ctrl.updateValueAndValidity({emitEvent:!1}),this.directives.push(dir),ctrl},FormGroupDirective.prototype.getControl=function(dir){return this.form.get(dir.path)},FormGroupDirective.prototype.removeControl=function(dir){removeDir(this.directives,dir)},FormGroupDirective.prototype.addFormGroup=function(dir){var ctrl=this.form.get(dir.path);setUpFormContainer(ctrl,dir),ctrl.updateValueAndValidity({emitEvent:!1})},FormGroupDirective.prototype.removeFormGroup=function(dir){},FormGroupDirective.prototype.getFormGroup=function(dir){return this.form.get(dir.path)},FormGroupDirective.prototype.addFormArray=function(dir){var ctrl=this.form.get(dir.path);setUpFormContainer(ctrl,dir),ctrl.updateValueAndValidity({emitEvent:!1})},FormGroupDirective.prototype.removeFormArray=function(dir){},FormGroupDirective.prototype.getFormArray=function(dir){return this.form.get(dir.path)},FormGroupDirective.prototype.updateModel=function(dir,value){this.form.get(dir.path).setValue(value)},FormGroupDirective.prototype.onSubmit=function($event){return this.submitted=!0,syncPendingControls(this.form,this.directives),this.ngSubmit.emit($event),!1},FormGroupDirective.prototype.onReset=function(){this.resetForm()},FormGroupDirective.prototype.resetForm=function(value){void 0===value&&(value=void 0),this.form.reset(value),this.submitted=!1},FormGroupDirective.prototype._updateDomValue=function(){var _this=this;this.directives.forEach(function(dir){var newCtrl=_this.form.get(dir.path);dir.control!==newCtrl&&(!function cleanUpControl(control,dir){dir.valueAccessor.registerOnChange(function(){return _noControlError(dir)}),dir.valueAccessor.registerOnTouched(function(){return _noControlError(dir)}),dir._rawValidators.forEach(function(validator){validator.registerOnValidatorChange&&validator.registerOnValidatorChange(null)}),dir._rawAsyncValidators.forEach(function(validator){validator.registerOnValidatorChange&&validator.registerOnValidatorChange(null)}),control&&control._clearChangeFns()}(dir.control,dir),newCtrl&&setUpControl(newCtrl,dir),dir.control=newCtrl)}),this.form._updateTreeValidity({emitEvent:!1})},FormGroupDirective.prototype._updateRegistrations=function(){var _this=this;this.form._registerOnCollectionChange(function(){return _this._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},FormGroupDirective.prototype._updateValidators=function(){var sync=composeValidators(this._validators);this.form.validator=forms_Validators.compose([this.form.validator,sync]);var async=composeAsyncValidators(this._asyncValidators);this.form.asyncValidator=forms_Validators.composeAsync([this.form.asyncValidator,async])},FormGroupDirective.prototype._checkFormPresent=function(){this.form||ReactiveErrors.missingFormException()},Object(tslib_es6.b)([Object(core.z)("formGroup"),Object(tslib_es6.d)("design:type",forms_FormGroup)],FormGroupDirective.prototype,"form",void 0),Object(tslib_es6.b)([Object(core.K)(),Object(tslib_es6.d)("design:type",Object)],FormGroupDirective.prototype,"ngSubmit",void 0),FormGroupDirective=Object(tslib_es6.b)([Object(core.q)({selector:"[formGroup]",providers:[formDirectiveProvider$1],host:{"(submit)":"onSubmit($event)","(reset)":"onReset()"},exportAs:"ngForm"}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.W)()),Object(tslib_es6.e)(0,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.d)("design:paramtypes",[Array,Array])],FormGroupDirective)}(forms_ControlContainer),formGroupNameProvider={provide:forms_ControlContainer,useExisting:Object(core.lb)(function(){return forms_FormGroupName})},forms_FormGroupName=function(_super){function FormGroupName(parent,validators,asyncValidators){var _this=_super.call(this)||this;return _this._parent=parent,_this._validators=validators,_this._asyncValidators=asyncValidators,_this}return Object(tslib_es6.c)(FormGroupName,_super),FormGroupName.prototype._checkParentType=function(){_hasInvalidParent(this._parent)&&ReactiveErrors.groupParentException()},Object(tslib_es6.b)([Object(core.z)("formGroupName"),Object(tslib_es6.d)("design:type",String)],FormGroupName.prototype,"name",void 0),FormGroupName=Object(tslib_es6.b)([Object(core.q)({selector:"[formGroupName]",providers:[formGroupNameProvider]}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.u)()),Object(tslib_es6.e)(0,Object(core.Y)()),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer,Array,Array])],FormGroupName)}(forms_AbstractFormGroupDirective),formArrayNameProvider={provide:forms_ControlContainer,useExisting:Object(core.lb)(function(){return forms_FormArrayName})},forms_FormArrayName=function(_super){function FormArrayName(parent,validators,asyncValidators){var _this=_super.call(this)||this;return _this._parent=parent,_this._validators=validators,_this._asyncValidators=asyncValidators,_this}return Object(tslib_es6.c)(FormArrayName,_super),FormArrayName.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},FormArrayName.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(FormArrayName.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"validator",{get:function(){return composeValidators(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormArrayName.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._asyncValidators)},enumerable:!0,configurable:!0}),FormArrayName.prototype._checkParentType=function(){_hasInvalidParent(this._parent)&&ReactiveErrors.arrayParentException()},Object(tslib_es6.b)([Object(core.z)("formArrayName"),Object(tslib_es6.d)("design:type",String)],FormArrayName.prototype,"name",void 0),FormArrayName=Object(tslib_es6.b)([Object(core.q)({selector:"[formArrayName]",providers:[formArrayNameProvider]}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.u)()),Object(tslib_es6.e)(0,Object(core.Y)()),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer,Array,Array])],FormArrayName)}(forms_ControlContainer);function _hasInvalidParent(parent){return!(parent instanceof forms_FormGroupName||parent instanceof forms_FormGroupDirective||parent instanceof forms_FormArrayName)}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var controlNameBinding={provide:forms_NgControl,useExisting:Object(core.lb)(function(){return forms_FormControlName})},forms_FormControlName=function(_super){function FormControlName(parent,validators,asyncValidators,valueAccessors,_ngModelWarningConfig){var _this=_super.call(this)||this;return _this._ngModelWarningConfig=_ngModelWarningConfig,_this._added=!1,_this.update=new core.t,_this._ngModelWarningSent=!1,_this._parent=parent,_this._rawValidators=validators||[],_this._rawAsyncValidators=asyncValidators||[],_this.valueAccessor=selectValueAccessor(_this,valueAccessors),_this}var FormControlName_1;return Object(tslib_es6.c)(FormControlName,_super),FormControlName_1=FormControlName,Object.defineProperty(FormControlName.prototype,"isDisabled",{set:function(isDisabled){ReactiveErrors.disabledAttrWarning()},enumerable:!0,configurable:!0}),FormControlName.prototype.ngOnChanges=function(changes){this._added||this._setUpControl(),isPropertyUpdated(changes,this.viewModel)&&(_ngModelWarning("formControlName",FormControlName_1,this,this._ngModelWarningConfig),this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},FormControlName.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},FormControlName.prototype.viewToModelUpdate=function(newValue){this.viewModel=newValue,this.update.emit(newValue)},Object.defineProperty(FormControlName.prototype,"path",{get:function(){return controlPath(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"validator",{get:function(){return composeValidators(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(FormControlName.prototype,"asyncValidator",{get:function(){return composeAsyncValidators(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),FormControlName.prototype._checkParentType=function(){!(this._parent instanceof forms_FormGroupName)&&this._parent instanceof forms_AbstractFormGroupDirective?ReactiveErrors.ngModelGroupException():this._parent instanceof forms_FormGroupName||this._parent instanceof forms_FormGroupDirective||this._parent instanceof forms_FormArrayName||ReactiveErrors.controlParentException()},FormControlName.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},FormControlName._ngModelWarningSentOnce=!1,Object(tslib_es6.b)([Object(core.z)("formControlName"),Object(tslib_es6.d)("design:type",String)],FormControlName.prototype,"name",void 0),Object(tslib_es6.b)([Object(core.z)("disabled"),Object(tslib_es6.d)("design:type",Boolean),Object(tslib_es6.d)("design:paramtypes",[Boolean])],FormControlName.prototype,"isDisabled",null),Object(tslib_es6.b)([Object(core.z)("ngModel"),Object(tslib_es6.d)("design:type",Object)],FormControlName.prototype,"model",void 0),Object(tslib_es6.b)([Object(core.K)("ngModelChange"),Object(tslib_es6.d)("design:type",Object)],FormControlName.prototype,"update",void 0),FormControlName=FormControlName_1=Object(tslib_es6.b)([Object(core.q)({selector:"[formControlName]",providers:[controlNameBinding]}),Object(tslib_es6.e)(0,Object(core.J)()),Object(tslib_es6.e)(0,Object(core.u)()),Object(tslib_es6.e)(0,Object(core.Y)()),Object(tslib_es6.e)(1,Object(core.J)()),Object(tslib_es6.e)(1,Object(core.W)()),Object(tslib_es6.e)(1,Object(core.v)(NG_VALIDATORS)),Object(tslib_es6.e)(2,Object(core.J)()),Object(tslib_es6.e)(2,Object(core.W)()),Object(tslib_es6.e)(2,Object(core.v)(NG_ASYNC_VALIDATORS)),Object(tslib_es6.e)(3,Object(core.J)()),Object(tslib_es6.e)(3,Object(core.W)()),Object(tslib_es6.e)(3,Object(core.v)(NG_VALUE_ACCESSOR)),Object(tslib_es6.e)(4,Object(core.J)()),Object(tslib_es6.e)(4,Object(core.v)(NG_MODEL_WITH_FORM_CONTROL_WARNING)),Object(tslib_es6.d)("design:paramtypes",[forms_ControlContainer,Array,Array,Array,Object])],FormControlName)}(forms_NgControl),REQUIRED_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_RequiredValidator}),multi:!0},CHECKBOX_REQUIRED_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_CheckboxRequiredValidator}),multi:!0},forms_RequiredValidator=function(){function RequiredValidator(){}return Object.defineProperty(RequiredValidator.prototype,"required",{get:function(){return this._required},set:function(value){this._required=null!=value&&!1!==value&&""+value!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),RequiredValidator.prototype.validate=function(control){return this.required?forms_Validators.required(control):null},RequiredValidator.prototype.registerOnValidatorChange=function(fn){this._onChange=fn},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],RequiredValidator.prototype,"required",null),RequiredValidator=Object(tslib_es6.b)([Object(core.q)({selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",providers:[REQUIRED_VALIDATOR],host:{"[attr.required]":'required ? "" : null'}})],RequiredValidator)}(),forms_CheckboxRequiredValidator=function(_super){function CheckboxRequiredValidator(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(CheckboxRequiredValidator,_super),CheckboxRequiredValidator.prototype.validate=function(control){return this.required?forms_Validators.requiredTrue(control):null},CheckboxRequiredValidator=Object(tslib_es6.b)([Object(core.q)({selector:"input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]",providers:[CHECKBOX_REQUIRED_VALIDATOR],host:{"[attr.required]":'required ? "" : null'}})],CheckboxRequiredValidator)}(forms_RequiredValidator),EMAIL_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_EmailValidator}),multi:!0},forms_EmailValidator=function(){function EmailValidator(){}return Object.defineProperty(EmailValidator.prototype,"email",{set:function(value){this._enabled=""===value||!0===value||"true"===value,this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),EmailValidator.prototype.validate=function(control){return this._enabled?forms_Validators.email(control):null},EmailValidator.prototype.registerOnValidatorChange=function(fn){this._onChange=fn},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object),Object(tslib_es6.d)("design:paramtypes",[Object])],EmailValidator.prototype,"email",null),EmailValidator=Object(tslib_es6.b)([Object(core.q)({selector:"[email][formControlName],[email][formControl],[email][ngModel]",providers:[EMAIL_VALIDATOR]})],EmailValidator)}(),MIN_LENGTH_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_MinLengthValidator}),multi:!0},forms_MinLengthValidator=function(){function MinLengthValidator(){}return MinLengthValidator.prototype.ngOnChanges=function(changes){"minlength"in changes&&(this._createValidator(),this._onChange&&this._onChange())},MinLengthValidator.prototype.validate=function(control){return null==this.minlength?null:this._validator(control)},MinLengthValidator.prototype.registerOnValidatorChange=function(fn){this._onChange=fn},MinLengthValidator.prototype._createValidator=function(){this._validator=forms_Validators.minLength(parseInt(this.minlength,10))},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",String)],MinLengthValidator.prototype,"minlength",void 0),MinLengthValidator=Object(tslib_es6.b)([Object(core.q)({selector:"[minlength][formControlName],[minlength][formControl],[minlength][ngModel]",providers:[MIN_LENGTH_VALIDATOR],host:{"[attr.minlength]":"minlength ? minlength : null"}})],MinLengthValidator)}(),MAX_LENGTH_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_MaxLengthValidator}),multi:!0},forms_MaxLengthValidator=function(){function MaxLengthValidator(){}return MaxLengthValidator.prototype.ngOnChanges=function(changes){"maxlength"in changes&&(this._createValidator(),this._onChange&&this._onChange())},MaxLengthValidator.prototype.validate=function(control){return null!=this.maxlength?this._validator(control):null},MaxLengthValidator.prototype.registerOnValidatorChange=function(fn){this._onChange=fn},MaxLengthValidator.prototype._createValidator=function(){this._validator=forms_Validators.maxLength(parseInt(this.maxlength,10))},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",String)],MaxLengthValidator.prototype,"maxlength",void 0),MaxLengthValidator=Object(tslib_es6.b)([Object(core.q)({selector:"[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",providers:[MAX_LENGTH_VALIDATOR],host:{"[attr.maxlength]":"maxlength ? maxlength : null"}})],MaxLengthValidator)}(),PATTERN_VALIDATOR={provide:NG_VALIDATORS,useExisting:Object(core.lb)(function(){return forms_PatternValidator}),multi:!0},forms_PatternValidator=function(){function PatternValidator(){}return PatternValidator.prototype.ngOnChanges=function(changes){"pattern"in changes&&(this._createValidator(),this._onChange&&this._onChange())},PatternValidator.prototype.validate=function(control){return this._validator(control)},PatternValidator.prototype.registerOnValidatorChange=function(fn){this._onChange=fn},PatternValidator.prototype._createValidator=function(){this._validator=forms_Validators.pattern(this.pattern)},Object(tslib_es6.b)([Object(core.z)(),Object(tslib_es6.d)("design:type",Object)],PatternValidator.prototype,"pattern",void 0),PatternValidator=Object(tslib_es6.b)([Object(core.q)({selector:"[pattern][formControlName],[pattern][formControl],[pattern][ngModel]",providers:[PATTERN_VALIDATOR],host:{"[attr.pattern]":"pattern ? pattern : null"}})],PatternValidator)}(),SHARED_FORM_DIRECTIVES=[forms_NgNoValidate,forms_NgSelectOption,forms_NgSelectMultipleOption,forms_DefaultValueAccessor,forms_NumberValueAccessor,forms_RangeValueAccessor,forms_CheckboxControlValueAccessor,forms_SelectControlValueAccessor,forms_SelectMultipleControlValueAccessor,forms_RadioControlValueAccessor,forms_NgControlStatus,forms_NgControlStatusGroup,forms_RequiredValidator,forms_MinLengthValidator,forms_MaxLengthValidator,forms_PatternValidator,forms_CheckboxRequiredValidator,forms_EmailValidator],TEMPLATE_DRIVEN_DIRECTIVES=[forms_NgModel,forms_NgModelGroup,forms_NgForm,forms_NgFormSelectorWarning],REACTIVE_DRIVEN_DIRECTIVES=[forms_FormControlDirective,forms_FormGroupDirective,forms_FormControlName,forms_FormGroupName,forms_FormArrayName],forms_InternalFormsSharedModule=function(){function ɵInternalFormsSharedModule(){}return ɵInternalFormsSharedModule=Object(tslib_es6.b)([Object(core.E)({declarations:SHARED_FORM_DIRECTIVES,exports:SHARED_FORM_DIRECTIVES})],ɵInternalFormsSharedModule)}();var forms_FormBuilder=function(){function FormBuilder(){}return FormBuilder.prototype.group=function(controlsConfig,options){void 0===options&&(options=null);var controls=this._reduceControls(controlsConfig),validators=null,asyncValidators=null,updateOn=void 0;return null!=options&&(!
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */
function isAbstractControlOptions(options){return void 0!==options.asyncValidators||void 0!==options.validators||void 0!==options.updateOn}(options)?(validators=null!=options.validator?options.validator:null,asyncValidators=null!=options.asyncValidator?options.asyncValidator:null):(validators=null!=options.validators?options.validators:null,asyncValidators=null!=options.asyncValidators?options.asyncValidators:null,updateOn=null!=options.updateOn?options.updateOn:void 0)),new forms_FormGroup(controls,{asyncValidators:asyncValidators,updateOn:updateOn,validators:validators})},FormBuilder.prototype.control=function(formState,validatorOrOpts,asyncValidator){return new forms_FormControl(formState,validatorOrOpts,asyncValidator)},FormBuilder.prototype.array=function(controlsConfig,validatorOrOpts,asyncValidator){var _this=this,controls=controlsConfig.map(function(c){return _this._createControl(c)});return new forms_FormArray(controls,validatorOrOpts,asyncValidator)},FormBuilder.prototype._reduceControls=function(controlsConfig){var _this=this,controls={};return Object.keys(controlsConfig).forEach(function(controlName){controls[controlName]=_this._createControl(controlsConfig[controlName])}),controls},FormBuilder.prototype._createControl=function(controlConfig){if(controlConfig instanceof forms_FormControl||controlConfig instanceof forms_FormGroup||controlConfig instanceof forms_FormArray)return controlConfig;if(Array.isArray(controlConfig)){var value=controlConfig[0],validator=controlConfig.length>1?controlConfig[1]:null,asyncValidator=controlConfig.length>2?controlConfig[2]:null;return this.control(value,validator,asyncValidator)}return this.control(controlConfig)},FormBuilder=Object(tslib_es6.b)([Object(core.w)()],FormBuilder)}(),forms_FormsModule=(new core.eb("8.0.3"),function(){function FormsModule(){}var FormsModule_1;return FormsModule_1=FormsModule,FormsModule.withConfig=function(opts){return{ngModule:FormsModule_1,providers:[{provide:NG_FORM_SELECTOR_WARNING,useValue:opts.warnOnDeprecatedNgFormSelector}]}},FormsModule=FormsModule_1=Object(tslib_es6.b)([Object(core.E)({declarations:TEMPLATE_DRIVEN_DIRECTIVES,providers:[forms_RadioControlRegistry],exports:[forms_InternalFormsSharedModule,TEMPLATE_DRIVEN_DIRECTIVES]})],FormsModule)}()),compiler=(function(){function ReactiveFormsModule(){}var ReactiveFormsModule_1;ReactiveFormsModule_1=ReactiveFormsModule,ReactiveFormsModule.withConfig=function(opts){return{ngModule:ReactiveFormsModule_1,providers:[{provide:NG_MODEL_WITH_FORM_CONTROL_WARNING,useValue:opts.warnOnNgModelWithFormControl}]}},ReactiveFormsModule=ReactiveFormsModule_1=Object(tslib_es6.b)([Object(core.E)({declarations:[REACTIVE_DRIVEN_DIRECTIVES],providers:[forms_FormBuilder,forms_RadioControlRegistry],exports:[forms_InternalFormsSharedModule,REACTIVE_DRIVEN_DIRECTIVES]})],ReactiveFormsModule)}(),__webpack_require__(2)),builtinExternalReferences=function createBuiltinExternalReferencesMap(){var map=new Map;return map.set(compiler.j.ANALYZE_FOR_ENTRY_COMPONENTS,core.a),map.set(compiler.j.ElementRef,core.r),map.set(compiler.j.NgModuleRef,core.G),map.set(compiler.j.ViewContainerRef,core.gb),map.set(compiler.j.ChangeDetectorRef,core.j),map.set(compiler.j.Renderer2,core.R),map.set(compiler.j.QueryList,core.P),map.set(compiler.j.TemplateRef,core.bb),map.set(compiler.j.CodegenComponentFactoryResolver,core.rb),map.set(compiler.j.ComponentFactoryResolver,core.o),map.set(compiler.j.ComponentFactory,core.n),map.set(compiler.j.ComponentRef,core.p),map.set(compiler.j.NgModuleFactory,core.F),map.set(compiler.j.createModuleFactory,core.Bb),map.set(compiler.j.moduleDef,core.Mb),map.set(compiler.j.moduleProviderDef,core.Nb),map.set(compiler.j.RegisterModuleFactoryFn,core.Wb),map.set(compiler.j.Injector,core.y),map.set(compiler.j.ViewEncapsulation,core.hb),map.set(compiler.j.ChangeDetectionStrategy,core.i),map.set(compiler.j.SecurityContext,core.V),map.set(compiler.j.LOCALE_ID,core.C),map.set(compiler.j.TRANSLATIONS_FORMAT,core.ab),map.set(compiler.j.inlineInterpolate,core.Gb),map.set(compiler.j.interpolate,core.Hb),map.set(compiler.j.EMPTY_ARRAY,core.tb),map.set(compiler.j.EMPTY_MAP,core.ub),map.set(compiler.j.Renderer,core.Q),map.set(compiler.j.viewDef,core.ac),map.set(compiler.j.elementDef,core.Eb),map.set(compiler.j.anchorDef,core.zb),map.set(compiler.j.textDef,core.Yb),map.set(compiler.j.directiveDef,core.Db),map.set(compiler.j.providerDef,core.Ub),map.set(compiler.j.queryDef,core.Vb),map.set(compiler.j.pureArrayDef,core.Qb),map.set(compiler.j.pureObjectDef,core.Sb),map.set(compiler.j.purePipeDef,core.Tb),map.set(compiler.j.pipeDef,core.Rb),map.set(compiler.j.nodeValue,core.Pb),map.set(compiler.j.ngContentDef,core.Ob),map.set(compiler.j.unwrapValue,core.Zb),map.set(compiler.j.createRendererType2,core.Cb),map.set(compiler.j.createComponentFactory,core.Ab),map}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */(),platform_browser_dynamic_JitReflector=function(){function JitReflector(){this.reflectionCapabilities=new core.vb}return JitReflector.prototype.componentModuleUrl=function(type,cmpMetadata){var moduleId=cmpMetadata.moduleId;Iif("string"==typeof moduleId)return Object(compiler.A)(moduleId)?moduleId:"package:"+moduleId;Iif(null!=moduleId)throw Object(compiler.B)('moduleId should be a string in "'+Object(core.Xb)(type)+"\". See https://goo.gl/wIDDiL for more information.\nIf you're using Webpack you should inline the template and the styles, see https://goo.gl/X2J8zc.");return"./"+Object(core.Xb)(type)},JitReflector.prototype.parameters=function(typeOrFunc){return this.reflectionCapabilities.parameters(typeOrFunc)},JitReflector.prototype.tryAnnotations=function(typeOrFunc){return this.annotations(typeOrFunc)},JitReflector.prototype.annotations=function(typeOrFunc){return this.reflectionCapabilities.annotations(typeOrFunc)},JitReflector.prototype.shallowAnnotations=function(typeOrFunc){throw new Error("Not supported in JIT mode")},JitReflector.prototype.propMetadata=function(typeOrFunc){return this.reflectionCapabilities.propMetadata(typeOrFunc)},JitReflector.prototype.hasLifecycleHook=function(type,lcProperty){return this.reflectionCapabilities.hasLifecycleHook(type,lcProperty)},JitReflector.prototype.guards=function(type){return this.reflectionCapabilities.guards(type)},JitReflector.prototype.resolveExternalReference=function(ref){return builtinExternalReferences.get(ref)||ref.runtime},JitReflector}();
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var ERROR_COLLECTOR_TOKEN=new core.x("ErrorCollector"),DEFAULT_PACKAGE_URL_PROVIDER={provide:core.L,useValue:"/"},_NO_RESOURCE_LOADER={get:function(url){throw new Error("No ResourceLoader implementation has been provided. Can't read the url \""+url+'"')}},baseHtmlParser=new core.x("HtmlParser"),platform_browser_dynamic_CompilerImpl=function(){function CompilerImpl(injector,_metadataResolver,templateParser,styleCompiler,viewCompiler,ngModuleCompiler,summaryResolver,compileReflector,jitEvaluator,compilerConfig,console){this._metadataResolver=_metadataResolver,this._delegate=new compiler.k(_metadataResolver,templateParser,styleCompiler,viewCompiler,ngModuleCompiler,summaryResolver,compileReflector,jitEvaluator,compilerConfig,console,this.getExtraNgModuleProviders.bind(this)),this.injector=injector}return CompilerImpl.prototype.getExtraNgModuleProviders=function(){return[this._metadataResolver.getProviderMetadata(new compiler.s(core.k,{useValue:this}))]},CompilerImpl.prototype.compileModuleSync=function(moduleType){return this._delegate.compileModuleSync(moduleType)},CompilerImpl.prototype.compileModuleAsync=function(moduleType){return this._delegate.compileModuleAsync(moduleType)},CompilerImpl.prototype.compileModuleAndAllComponentsSync=function(moduleType){var result=this._delegate.compileModuleAndAllComponentsSync(moduleType);return{ngModuleFactory:result.ngModuleFactory,componentFactories:result.componentFactories}},CompilerImpl.prototype.compileModuleAndAllComponentsAsync=function(moduleType){return this._delegate.compileModuleAndAllComponentsAsync(moduleType).then(function(result){return{ngModuleFactory:result.ngModuleFactory,componentFactories:result.componentFactories}})},CompilerImpl.prototype.loadAotSummaries=function(summaries){this._delegate.loadAotSummaries(summaries)},CompilerImpl.prototype.hasAotSummary=function(ref){return this._delegate.hasAotSummary(ref)},CompilerImpl.prototype.getComponentFactory=function(component){return this._delegate.getComponentFactory(component)},CompilerImpl.prototype.clearCache=function(){this._delegate.clearCache()},CompilerImpl.prototype.clearCacheFor=function(type){this._delegate.clearCacheFor(type)},CompilerImpl.prototype.getModuleId=function(moduleType){var meta=this._metadataResolver.getNgModuleMetadata(moduleType);return meta&&meta.id||void 0},CompilerImpl}(),COMPILER_PROVIDERS=[{provide:compiler.b,useValue:new platform_browser_dynamic_JitReflector},{provide:compiler.t,useValue:_NO_RESOURCE_LOADER},{provide:compiler.m,deps:[]},{provide:compiler.w,useExisting:compiler.m},{provide:core.sb,deps:[]},{provide:compiler.n,deps:[]},{provide:compiler.q,deps:[compiler.n]},{provide:baseHtmlParser,useClass:compiler.h,deps:[]},{provide:compiler.i,useFactory:function(parser,translations,format,config,console){var missingTranslation=(translations=translations||"")?config.missingTranslation:core.D.Ignore;return new compiler.i(parser,translations,format,missingTranslation,console)},deps:[baseHtmlParser,[new core.J,new core.v(core.Z)],[new core.J,new core.v(core.ab)],[compiler.c],[core.sb]]},{provide:compiler.h,useExisting:compiler.i},{provide:compiler.x,deps:[compiler.c,compiler.b,compiler.q,compiler.g,compiler.i,core.sb]},{provide:compiler.l,useClass:compiler.l,deps:[]},{provide:compiler.d,deps:[compiler.t,compiler.y,compiler.h,compiler.c]},{provide:compiler.a,deps:[compiler.c,compiler.h,compiler.p,compiler.e,compiler.r,compiler.w,compiler.g,compiler.d,core.sb,[core.J,compiler.u],compiler.b,[core.J,ERROR_COLLECTOR_TOKEN]]},DEFAULT_PACKAGE_URL_PROVIDER,{provide:compiler.v,deps:[compiler.y]},{provide:compiler.z,deps:[compiler.b]},{provide:compiler.o,deps:[compiler.b]},{provide:compiler.c,useValue:new compiler.c},{provide:core.k,useClass:platform_browser_dynamic_CompilerImpl,deps:[core.y,compiler.a,compiler.x,compiler.v,compiler.z,compiler.o,compiler.w,compiler.b,compiler.l,compiler.c,core.sb]},{provide:compiler.f,deps:[]},{provide:compiler.g,useExisting:compiler.f},{provide:compiler.y,deps:[core.L]},{provide:compiler.e,deps:[compiler.b]},{provide:compiler.r,deps:[compiler.b]},{provide:compiler.p,deps:[compiler.b]}],platform_browser_dynamic_JitCompilerFactory=function(){function JitCompilerFactory(defaultOptions){var compilerOptions={useJit:!0,defaultEncapsulation:core.hb.Emulated,missingTranslation:core.D.Warning};this._defaultOptions=Object(tslib_es6.g)([compilerOptions],defaultOptions)}return JitCompilerFactory.prototype.createCompiler=function(options){void 0===options&&(options=[]);var opts=function _mergeOptions(optionsArr){return{useJit:_lastDefined(optionsArr.map(function(options){return options.useJit})),defaultEncapsulation:_lastDefined(optionsArr.map(function(options){return options.defaultEncapsulation})),providers:_mergeArrays(optionsArr.map(function(options){return options.providers})),missingTranslation:_lastDefined(optionsArr.map(function(options){return options.missingTranslation})),preserveWhitespaces:_lastDefined(optionsArr.map(function(options){return options.preserveWhitespaces}))}}(this._defaultOptions.concat(options));return core.y.create([COMPILER_PROVIDERS,{provide:compiler.c,useFactory:function(){return new compiler.c({useJit:opts.useJit,jitDevMode:Object(core.nb)(),defaultEncapsulation:opts.defaultEncapsulation,missingTranslation:opts.missingTranslation,preserveWhitespaces:opts.preserveWhitespaces})},deps:[]},opts.providers]).get(core.k)},JitCompilerFactory}();function _lastDefined(args){for(var i=args.length-1;i>=0;i--)if(void 0!==args[i])return args[i]}function _mergeArrays(parts){var result=[];return parts.forEach(function(part){return part&&result.push.apply(result,Object(tslib_es6.g)(part))}),result}
/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */var NotificationKind,platformCoreDynamic=Object(core.jb)(core.ob,"coreDynamic",[{provide:core.h,useValue:{},multi:!0},{provide:core.l,useClass:platform_browser_dynamic_JitCompilerFactory,deps:[core.h]}]),platform_browser_dynamic_ResourceLoaderImpl=function(_super){function ResourceLoaderImpl(){return null!==_super&&_super.apply(this,arguments)||this}return Object(tslib_es6.c)(ResourceLoaderImpl,_super),ResourceLoaderImpl.prototype.get=function(url){var resolve,reject,promise=new Promise(function(res,rej){resolve=res,reject=rej}),xhr=new XMLHttpRequest;return xhr.open("GET",url,!0),xhr.responseType="text",xhr.onload=function(){var response=xhr.response||xhr.responseText,status=1223===xhr.status?204:xhr.status;0===status&&(status=response?200:0),200<=status&&status<=300?resolve(response):reject("Failed to load "+url)},xhr.onerror=function(){reject("Failed to load "+url)},xhr.send(),promise},ResourceLoaderImpl=Object(tslib_es6.b)([Object(core.w)()],ResourceLoaderImpl)}(compiler.t),platform_browser_dynamic_0$1={providers:[{provide:compiler.t,useClass:platform_browser_dynamic_ResourceLoaderImpl,deps:[]}]},platform_browser_dynamic_1=PLATFORM_BROWSER_ID,INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS=[INTERNAL_BROWSER_PLATFORM_PROVIDERS,{provide:core.h,useValue:platform_browser_dynamic_0$1,multi:!0},{provide:core.M,useValue:platform_browser_dynamic_1}],platform_browser_dynamic_CachedResourceLoader=function(_super){function CachedResourceLoader(){var _this=_super.call(this)||this;if(_this._cache=core.Fb.$templateCache,null==_this._cache)throw new Error("CachedResourceLoader: Template cache was not found in $templateCache.");return _this}return Object(tslib_es6.c)(CachedResourceLoader,_super),CachedResourceLoader.prototype.get=function(url){return this._cache.hasOwnProperty(url)?Promise.resolve(this._cache[url]):Promise.reject("CachedResourceLoader: Did not find cached template for "+url)},CachedResourceLoader}(compiler.t),platformBrowserDynamic=(new core.eb("8.0.3"),compiler.t,Object(core.jb)(platformCoreDynamic,"browserDynamic",INTERNAL_BROWSER_DYNAMIC_PLATFORM_PROVIDERS)),Subject=__webpack_require__(63),Subscription=__webpack_require__(11),QueueAction_QueueAction=function(_super){function QueueAction(scheduler,work){var _this=_super.call(this,scheduler,work)||this;return _this.scheduler=scheduler,_this.work=work,_this}return tslib_es6.c(QueueAction,_super),QueueAction.prototype.schedule=function(state,delay){return void 0===delay&&(delay=0),delay>0?_super.prototype.schedule.call(this,state,delay):(this.delay=delay,this.state=state,this.scheduler.flush(this),this)},QueueAction.prototype.execute=function(state,delay){return delay>0||this.closed?_super.prototype.execute.call(this,state,delay):this._execute(state,delay)},QueueAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),null!==delay&&delay>0||null===delay&&this.delay>0?_super.prototype.requestAsyncId.call(this,scheduler,id,delay):scheduler.flush(this)},QueueAction}(function(_super){function AsyncAction(scheduler,work){var _this=_super.call(this,scheduler,work)||this;return _this.scheduler=scheduler,_this.work=work,_this.pending=!1,_this}return tslib_es6.c(AsyncAction,_super),AsyncAction.prototype.schedule=function(state,delay){if(void 0===delay&&(delay=0),this.closed)return this;this.state=state;var id=this.id,scheduler=this.scheduler;return null!=id&&(this.id=this.recycleAsyncId(scheduler,id,delay)),this.pending=!0,this.delay=delay,this.id=this.id||this.requestAsyncId(scheduler,this.id,delay),this},AsyncAction.prototype.requestAsyncId=function(scheduler,id,delay){return void 0===delay&&(delay=0),setInterval(scheduler.flush.bind(scheduler,this),delay)},AsyncAction.prototype.recycleAsyncId=function(scheduler,id,delay){if(void 0===delay&&(delay=0),null!==delay&&this.delay===delay&&!1===this.pending)return id;clearInterval(id)},AsyncAction.prototype.execute=function(state,delay){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var error=this._execute(state,delay);if(error)return error;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},AsyncAction.prototype._execute=function(state,delay){var errored=!1,errorValue=void 0;try{this.work(state)}catch(e){errored=!0,errorValue=!!e&&e||new Error(e)}if(errored)return this.unsubscribe(),errorValue},AsyncAction.prototype._unsubscribe=function(){var id=this.id,scheduler=this.scheduler,actions=scheduler.actions,index=actions.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==index&&actions.splice(index,1),null!=id&&(this.id=this.recycleAsyncId(scheduler,id,null)),this.delay=null},AsyncAction}(function(_super){function Action(scheduler,work){return _super.call(this)||this}return tslib_es6.c(Action,_super),Action.prototype.schedule=function(state,delay){return void 0===delay&&(delay=0),this},Action}(Subscription.a))),Scheduler=function(){function Scheduler(SchedulerAction,now){void 0===now&&(now=Scheduler.now),this.SchedulerAction=SchedulerAction,this.now=now}return Scheduler.prototype.schedule=function(work,delay,state){return void 0===delay&&(delay=0),new this.SchedulerAction(this,work).schedule(state,delay)},Scheduler.now=function(){return Date.now()},Scheduler}(),queue=new(function(_super){function QueueScheduler(){return null!==_super&&_super.apply(this,arguments)||this}return tslib_es6.c(QueueScheduler,_super),QueueScheduler}(function(_super){function AsyncScheduler(SchedulerAction,now){void 0===now&&(now=Scheduler.now);var _this=_super.call(this,SchedulerAction,function(){return AsyncScheduler.delegate&&AsyncScheduler.delegate!==_this?AsyncScheduler.delegate.now():now()})||this;return _this.actions=[],_this.active=!1,_this.scheduled=void 0,_this}return tslib_es6.c(AsyncScheduler,_super),AsyncScheduler.prototype.schedule=function(work,delay,state){return void 0===delay&&(delay=0),AsyncScheduler.delegate&&AsyncScheduler.delegate!==this?AsyncScheduler.delegate.schedule(work,delay,state):_super.prototype.schedule.call(this,work,delay,state)},AsyncScheduler.prototype.flush=function(action){var actions=this.actions;if(this.active)actions.push(action);else{var error;this.active=!0;do{if(error=action.execute(action.state,action.delay))break}while(action=actions.shift());if(this.active=!1,error){for(;action=actions.shift();)action.unsubscribe();throw error}}},AsyncScheduler}(Scheduler)))(QueueAction_QueueAction),Subscriber=__webpack_require__(8),isScheduler=__webpack_require__(123),fromArray=__webpack_require__(65);function of(){for(var args=[],_i=0;_i<arguments.length;_i++)args[_i]=arguments[_i];var scheduler=args[args.length-1];switch(Object(isScheduler.a)(scheduler)?args.pop():scheduler=void 0,args.length){case 0:return empty(scheduler);case 1:return scheduler?Object(fromArray.a)(args,scheduler):function scalar(value){var result=new Observable.a(function(subscriber){subscriber.next(value),subscriber.complete()});return result._isScalar=!0,result.value=value,result}(args[0]);default:return Object(fromArray.a)(args,scheduler)}}function dispatch(_a){var error=_a.error;_a.subscriber.error(error)}NotificationKind||(NotificationKind={});var Notification_Notification=function(){function Notification(kind,value,error){this.kind=kind,this.value=value,this.error=error,this.hasValue="N"===kind}return Notification.prototype.observe=function(observer){switch(this.kind){case"N":return observer.next&&observer.next(this.value);case"E":return observer.error&&observer.error(this.error);case"C":return observer.complete&&observer.complete()}},Notification.prototype.do=function(next,error,complete){switch(this.kind){case"N":return next&&next(this.value);case"E":return error&&error(this.error);case"C":return complete&&complete()}},Notification.prototype.accept=function(nextOrObserver,error,complete){return nextOrObserver&&"function"==typeof nextOrObserver.next?this.observe(nextOrObserver):this.do(nextOrObserver,error,complete)},Notification.prototype.toObservable=function(){switch(this.kind){case"N":return of(this.value);case"E":return function throwError(error,scheduler){return scheduler?new Observable.a(function(subscriber){return scheduler.schedule(dispatch,0,{error:error,subscriber:subscriber})}):new Observable.a(function(subscriber){return subscriber.error(error)})}(this.error);case"C":return empty()}throw new Error("unexpected notification kind value")},Notification.createNext=function(value){return void 0!==value?new Notification("N",value):Notification.undefinedValueNotification},Notification.createError=function(err){return new Notification("E",void 0,err)},Notification.createComplete=function(){return Notification.completeNotification},Notification.completeNotification=new Notification("C"),Notification.undefinedValueNotification=new Notification("N",void 0),Notification}();var observeOn_ObserveOnSubscriber=function(_super){function ObserveOnSubscriber(destination,scheduler,delay){void 0===delay&&(delay=0);var _this=_super.call(this,destination)||this;return _this.scheduler=scheduler,_this.delay=delay,_this}return tslib_es6.c(ObserveOnSubscriber,_super),ObserveOnSubscriber.dispatch=function(arg){var notification=arg.notification,destination=arg.destination;notification.observe(destination),this.unsubscribe()},ObserveOnSubscriber.prototype.scheduleMessage=function(notification){this.destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch,this.delay,new ObserveOnMessage(notification,this.destination)))},ObserveOnSubscriber.prototype._next=function(value){this.scheduleMessage(Notification_Notification.createNext(value))},ObserveOnSubscriber.prototype._error=function(err){this.scheduleMessage(Notification_Notification.createError(err)),this.unsubscribe()},ObserveOnSubscriber.prototype._complete=function(){this.scheduleMessage(Notification_Notification.createComplete()),this.unsubscribe()},ObserveOnSubscriber}(Subscriber.a),ObserveOnMessage=function(){return function ObserveOnMessage(notification,destination){this.notification=notification,this.destination=destination}}(),ObjectUnsubscribedError=__webpack_require__(53),SubjectSubscription=__webpack_require__(122),ReplaySubject_ReplaySubject=function(_super){function ReplaySubject(bufferSize,windowTime,scheduler){void 0===bufferSize&&(bufferSize=Number.POSITIVE_INFINITY),void 0===windowTime&&(windowTime=Number.POSITIVE_INFINITY);var _this=_super.call(this)||this;return _this.scheduler=scheduler,_this._events=[],_this._infiniteTimeWindow=!1,_this._bufferSize=bufferSize<1?1:bufferSize,_this._windowTime=windowTime<1?1:windowTime,windowTime===Number.POSITIVE_INFINITY?(_this._infiniteTimeWindow=!0,_this.next=_this.nextInfiniteTimeWindow):_this.next=_this.nextTimeWindow,_this}return tslib_es6.c(ReplaySubject,_super),ReplaySubject.prototype.nextInfiniteTimeWindow=function(value){var _events=this._events;_events.push(value),_events.length>this._bufferSize&&_events.shift(),_super.prototype.next.call(this,value)},ReplaySubject.prototype.nextTimeWindow=function(value){this._events.push(new ReplayEvent(this._getNow(),value)),this._trimBufferThenGetEvents(),_super.prototype.next.call(this,value)},ReplaySubject.prototype._subscribe=function(subscriber){var subscription,_infiniteTimeWindow=this._infiniteTimeWindow,_events=_infiniteTimeWindow?this._events:this._trimBufferThenGetEvents(),scheduler=this.scheduler,len=_events.length;Iif(this.closed)throw new ObjectUnsubscribedError.a;Eif(this.isStopped||this.hasError?subscription=Subscription.a.EMPTY:(this.observers.push(subscriber),subscription=new SubjectSubscription.a(this,subscriber)),scheduler&&subscriber.add(subscriber=new observeOn_ObserveOnSubscriber(subscriber,scheduler)),_infiniteTimeWindow)for(var i=0;i<len&&!subscriber.closed;i++)subscriber.next(_events[i]);else for(i=0;i<len&&!subscriber.closed;i++)subscriber.next(_events[i].value);return this.hasError?subscriber.error(this.thrownError):this.isStopped&&subscriber.complete(),subscription},ReplaySubject.prototype._getNow=function(){return(this.scheduler||queue).now()},ReplaySubject.prototype._trimBufferThenGetEvents=function(){for(var now=this._getNow(),_bufferSize=this._bufferSize,_windowTime=this._windowTime,_events=this._events,eventsCount=_events.length,spliceCount=0;spliceCount<eventsCount&&!(now-_events[spliceCount].time<_windowTime);)spliceCount++;return eventsCount>_bufferSize&&(spliceCount=Math.max(spliceCount,eventsCount-_bufferSize)),spliceCount>0&&_events.splice(0,spliceCount),_events},ReplaySubject}(Subject.a),ReplayEvent=function(){return function ReplayEvent(time,value){this.time=time,this.value=value}}();function EmptyErrorImpl(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}EmptyErrorImpl.prototype=Object.create(Error.prototype);var EmptyError=EmptyErrorImpl;var FilterOperator=function(){function FilterOperator(predicate,thisArg){this.predicate=predicate,this.thisArg=thisArg}return FilterOperator.prototype.call=function(subscriber,source){return source.subscribe(new filter_FilterSubscriber(subscriber,this.predicate,this.thisArg))},FilterOperator}(),filter_FilterSubscriber=function(_super){function FilterSubscriber(destination,predicate,thisArg){var _this=_super.call(this,destination)||this;return _this.predicate=predicate,_this.thisArg=thisArg,_this.count=0,_this}return tslib_es6.c(FilterSubscriber,_super),FilterSubscriber.prototype._next=function(value){var result;try{result=this.predicate.call(this.thisArg,value,this.count++)}catch(err){return void this.destination.error(err)}result&&this.destination.next(value)},FilterSubscriber}(Subscriber.a);function ArgumentOutOfRangeErrorImpl(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}ArgumentOutOfRangeErrorImpl.prototype=Object.create(Error.prototype);var ArgumentOutOfRangeError=ArgumentOutOfRangeErrorImpl;var take_TakeOperator=function(){function TakeOperator(total){Iif(this.total=total,this.total<0)throw new ArgumentOutOfRangeError}return TakeOperator.prototype.call=function(subscriber,source){return source.subscribe(new take_TakeSubscriber(subscriber,this.total))},TakeOperator}(),take_TakeSubscriber=function(_super){function TakeSubscriber(destination,total){var _this=_super.call(this,destination)||this;return _this.total=total,_this.count=0,_this}return tslib_es6.c(TakeSubscriber,_super),TakeSubscriber.prototype._next=function(value){var total=this.total,count=++this.count;count<=total&&(this.destination.next(value),count===total&&(this.destination.complete(),this.unsubscribe()))},TakeSubscriber}(Subscriber.a);var DefaultIfEmptyOperator=function(){function DefaultIfEmptyOperator(defaultValue){this.defaultValue=defaultValue}return DefaultIfEmptyOperator.prototype.call=function(subscriber,source){return source.subscribe(new defaultIfEmpty_DefaultIfEmptySubscriber(subscriber,this.defaultValue))},DefaultIfEmptyOperator}(),defaultIfEmpty_DefaultIfEmptySubscriber=function(_super){function DefaultIfEmptySubscriber(destination,defaultValue){var _this=_super.call(this,destination)||this;return _this.defaultValue=defaultValue,_this.isEmpty=!0,_this}return tslib_es6.c(DefaultIfEmptySubscriber,_super),DefaultIfEmptySubscriber.prototype._next=function(value){this.isEmpty=!1,this.destination.next(value)},DefaultIfEmptySubscriber.prototype._complete=function(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()},DefaultIfEmptySubscriber}(Subscriber.a),noop=__webpack_require__(29),isFunction=__webpack_require__(62);var DoOperator=function(){function DoOperator(nextOrObserver,error,complete){this.nextOrObserver=nextOrObserver,this.error=error,this.complete=complete}return DoOperator.prototype.call=function(subscriber,source){return source.subscribe(new tap_TapSubscriber(subscriber,this.nextOrObserver,this.error,this.complete))},DoOperator}(),tap_TapSubscriber=function(_super){function TapSubscriber(destination,observerOrNext,error,complete){var _this=_super.call(this,destination)||this;return _this._tapNext=noop.a,_this._tapError=noop.a,_this._tapComplete=noop.a,_this._tapError=error||noop.a,_this._tapComplete=complete||noop.a,Object(isFunction.a)(observerOrNext)?(_this._context=_this,_this._tapNext=observerOrNext):observerOrNext&&(_this._context=observerOrNext,_this._tapNext=observerOrNext.next||noop.a,_this._tapError=observerOrNext.error||noop.a,_this._tapComplete=observerOrNext.complete||noop.a),_this}return tslib_es6.c(TapSubscriber,_super),TapSubscriber.prototype._next=function(value){try{this._tapNext.call(this._context,value)}catch(err){return void this.destination.error(err)}this.destination.next(value)},TapSubscriber.prototype._error=function(err){try{this._tapError.call(this._context,err)}catch(err){return void this.destination.error(err)}this.destination.error(err)},TapSubscriber.prototype._complete=function(){try{this._tapComplete.call(this._context)}catch(err){return void this.destination.error(err)}return this.destination.complete()},TapSubscriber}(Subscriber.a),throwIfEmpty=function(errorFactory){return void 0===errorFactory&&(errorFactory=defaultErrorFactory),function tap(nextOrObserver,error,complete){return function tapOperatorFunction(source){return source.lift(new DoOperator(nextOrObserver,error,complete))}}({hasValue:!1,next:function(){this.hasValue=!0},complete:function(){Iif(!this.hasValue)throw errorFactory()}})};function defaultErrorFactory(){return new EmptyError}var identity=__webpack_require__(135);function first(predicate,defaultValue){var hasDefaultValue=arguments.length>=2;return function(source){return source.pipe(predicate?function filter(predicate,thisArg){return function filterOperatorFunction(source){return source.lift(new FilterOperator(predicate,thisArg))}}(function(v,i){return predicate(v,i,source)}):identity.a,function take(count){return function(source){return 0===count?empty():source.lift(new take_TakeOperator(count))}}(1),hasDefaultValue?function defaultIfEmpty(defaultValue){return void 0===defaultValue&&(defaultValue=null),function(source){return source.lift(new DefaultIfEmptyOperator(defaultValue))}}(defaultValue):throwIfEmpty(function(){return new EmptyError}))}}const STORY=new core.x("story");var app_component_a,app_component_b,app_component_c,app_component_d;let app_component_AppComponent=class AppComponent{constructor(cfr,changeDetectorRef,data){this.cfr=cfr,this.changeDetectorRef=changeDetectorRef,this.data=data}ngOnInit(){this.data.pipe(first()).subscribe(data=>{this.target.clear();const compFactory=this.cfr.resolveComponentFactory(data.component),componentRef=this.target.createComponent(compFactory),{instance:instance}=componentRef,childChangeDetectorRef=componentRef.injector.get(core.j);this.subscription=this.data.subscribe(newData=>{this.setProps(instance,newData),childChangeDetectorRef.markForCheck(),this.changeDetectorRef.detectChanges()})})}ngOnDestroy(){this.target.clear(),this.subscription&&this.subscription.unsubscribe()}setProps(instance,{props:props={}}){const changes={},hasNgOnChangesHook=!!instance.ngOnChanges;Object.keys(props).forEach(key=>{const value=props[key],instanceProperty=instance[key];instanceProperty instanceof core.t||null==value?"function"==typeof value&&"ngModelChange"!==key&&instanceProperty.subscribe(value):(instance[key]=value,hasNgOnChangesHook&&(changes[key]=new core.X(void 0,value,void 0===instanceProperty)))}),this.callNgOnChangesHook(instance,changes),this.setNgModel(instance,props)}callNgOnChangesHook(instance,changes){Object.keys(changes).length&&instance.ngOnChanges(changes)}setNgModel(instance,props){props.ngModel&&instance.writeValue(props.ngModel),"function"==typeof props.ngModelChange&&instance.registerOnChange(props.ngModelChange)}};tslib_es6.b([Object(core.fb)("target",{read:core.gb}),tslib_es6.d("design:type","function"==typeof(app_component_a=void 0!==core.gb&&core.gb)?app_component_a:Object)],app_component_AppComponent.prototype,"target",void 0),app_component_AppComponent=tslib_es6.b([Object(core.m)({selector:"storybook-dynamic-app-root",template:"<ng-template #target></ng-template>"}),tslib_es6.e(2,Object(core.v)(STORY)),tslib_es6.d("design:paramtypes",["function"==typeof(app_component_b=void 0!==core.o&&core.o)?app_component_b:Object,"function"==typeof(app_component_c=void 0!==core.j&&core.j)?app_component_c:Object,"function"==typeof(app_component_d=void 0!==Observable.a&&Observable.a)?app_component_d:Object])],app_component_AppComponent),__webpack_require__.d(__webpack_exports__,"renderNgApp",function(){return renderNgApp});let platform=null,promises=[];const storyData=new ReplaySubject_ReplaySubject(1),getExistenceOfComponentInModules=(component,declarations,imports)=>!(!declarations||!declarations.some(declaration=>declaration===component))||!!imports&&imports.some(importItem=>{const extractedNgModuleMetadata=(importItem=>{const decorators=Reflect&&Reflect.getOwnPropertyDescriptor?Reflect.getOwnPropertyDescriptor(importItem,"__annotations__").value:importItem.__annotations__;if(!decorators||0===decorators.length)return null;const ngModuleDecorator=decorators.find(decorator=>decorator instanceof core.E);return ngModuleDecorator||null})(importItem);return!!extractedNgModuleMetadata&&getExistenceOfComponentInModules(component,extractedNgModuleMetadata.declarations,extractedNgModuleMetadata.imports)}),initModule=storyFn=>{const storyObj=storyFn(),{component:component,template:template,props:props,styles:styles,moduleMetadata:moduleMetadata={}}=storyObj,isCreatingComponentFromTemplate=Boolean(template),AnnotatedComponent=isCreatingComponentFromTemplate?((template,styles)=>Object(core.m)({template:template,styles:styles})(class DynamicComponent{}))(template,styles):component;return((declarations,entryComponents,bootstrap,data,moduleMetadata)=>{storyData.next(data);const moduleMeta={declarations:[...declarations,...moduleMetadata.declarations||[]],imports:[platform_browser_BrowserModule,forms_FormsModule,...moduleMetadata.imports||[]],providers:[{provide:STORY,useValue:storyData},...moduleMetadata.providers||[]],entryComponents:[...entryComponents,...moduleMetadata.entryComponents||[]],schemas:[...moduleMetadata.schemas||[]],bootstrap:[...bootstrap]};return Object(core.E)(moduleMeta)(class DynamicModule{})})(isCreatingComponentFromTemplate||!getExistenceOfComponentInModules(component,moduleMetadata.declarations,moduleMetadata.imports)?[app_component_AppComponent,AnnotatedComponent]:[app_component_AppComponent],[AnnotatedComponent],[app_component_AppComponent],{component:AnnotatedComponent,props:props},moduleMetadata)},staticRoot=global_window.document.getElementById("root"),insertDynamicRoot=()=>{const app=global_window.document.createElement("storybook-dynamic-app-root");staticRoot.appendChild(app)},renderNgApp=(storyFn,forced)=>{forced?storyData.next(storyFn()):(newModule=>{Iif(platform)Promise.all(promises).then(modules=>{modules.forEach(mod=>mod.destroy()),insertDynamicRoot(),(promises=[]).push(platform.bootstrapModule(newModule))});else{insertDynamicRoot();try{Object(core.kb)()}catch(e){}platform=platformBrowserDynamic(),promises.push(platform.bootstrapModule(newModule))}})(initModule(storyFn))}},function(module,__webpack_exports__,__webpack_require__){"use strict";
/*!
 * is-plain-object <https://github.com/jonschlinkert/is-plain-object>
 *
 * Copyright (c) 2014-2017, Jon Schlinkert.
 * Released under the MIT License.
 */
function isObjectObject(o){return!0===
/*!
 * isobject <https://github.com/jonschlinkert/isobject>
 *
 * Copyright (c) 2014-2017, Jon Schlinkert.
 * Released under the MIT License.
 */
function isObject(val){return null!=val&&"object"==typeof val&&!1===Array.isArray(val)}(o)&&"[object Object]"===Object.prototype.toString.call(o)}function isPlainObject(o){var ctor,prot;return!1!==isObjectObject(o)&&("function"==typeof(ctor=o.constructor)&&(!1!==isObjectObject(prot=ctor.prototype)&&!1!==prot.hasOwnProperty("isPrototypeOf")))}__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,"default",function(){return isPlainObject})},function(module,__webpack_exports__,__webpack_require__){"use strict";var tslib_es6=__webpack_require__(0),Subject=__webpack_require__(63),Observable=__webpack_require__(5),Subscriber=__webpack_require__(8),Subscription=__webpack_require__(11);function refCount(){return function refCountOperatorFunction(source){return source.lift(new RefCountOperator(source))}}var RefCountOperator=function(){function RefCountOperator(connectable){this.connectable=connectable}return RefCountOperator.prototype.call=function(subscriber,source){var connectable=this.connectable;connectable._refCount++;var refCounter=new refCount_RefCountSubscriber(subscriber,connectable),subscription=source.subscribe(refCounter);return refCounter.closed||(refCounter.connection=connectable.connect()),subscription},RefCountOperator}(),refCount_RefCountSubscriber=function(_super){function RefCountSubscriber(destination,connectable){var _this=_super.call(this,destination)||this;return _this.connectable=connectable,_this}return tslib_es6.c(RefCountSubscriber,_super),RefCountSubscriber.prototype._unsubscribe=function(){var connectable=this.connectable;if(connectable){this.connectable=null;var refCount=connectable._refCount;if(refCount<=0)this.connection=null;else if(connectable._refCount=refCount-1,refCount>1)this.connection=null;else{var connection=this.connection,sharedConnection=connectable._connection;this.connection=null,!sharedConnection||connection&&sharedConnection!==connection||sharedConnection.unsubscribe()}}else this.connection=null},RefCountSubscriber}(Subscriber.a),connectableProto=function(_super){function ConnectableObservable(source,subjectFactory){var _this=_super.call(this)||this;return _this.source=source,_this.subjectFactory=subjectFactory,_this._refCount=0,_this._isComplete=!1,_this}return tslib_es6.c(ConnectableObservable,_super),ConnectableObservable.prototype._subscribe=function(subscriber){return this.getSubject().subscribe(subscriber)},ConnectableObservable.prototype.getSubject=function(){var subject=this._subject;return subject&&!subject.isStopped||(this._subject=this.subjectFactory()),this._subject},ConnectableObservable.prototype.connect=function(){var connection=this._connection;return connection||(this._isComplete=!1,(connection=this._connection=new Subscription.a).add(this.source.subscribe(new ConnectableObservable_ConnectableSubscriber(this.getSubject(),this))),connection.closed?(this._connection=null,connection=Subscription.a.EMPTY):this._connection=connection),connection},ConnectableObservable.prototype.refCount=function(){return refCount()(this)},ConnectableObservable}(Observable.a).prototype,connectableObservableDescriptor={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:connectableProto._subscribe},_isComplete:{value:connectableProto._isComplete,writable:!0},getSubject:{value:connectableProto.getSubject},connect:{value:connectableProto.connect},refCount:{value:connectableProto.refCount}},ConnectableObservable_ConnectableSubscriber=function(_super){function ConnectableSubscriber(destination,connectable){var _this=_super.call(this,destination)||this;return _this.connectable=connectable,_this}return tslib_es6.c(ConnectableSubscriber,_super),ConnectableSubscriber.prototype._error=function(err){this._unsubscribe(),_super.prototype._error.call(this,err)},ConnectableSubscriber.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),_super.prototype._complete.call(this)},ConnectableSubscriber.prototype._unsubscribe=function(){var connectable=this.connectable;if(connectable){this.connectable=null;var connection=connectable._connection;connectable._refCount=0,connectable._subject=null,connectable._connection=null,connection&&connection.unsubscribe()}},ConnectableSubscriber}(Subject.b);Subscriber.a;var MulticastOperator=function(){function MulticastOperator(subjectFactory,selector){this.subjectFactory=subjectFactory,this.selector=selector}return MulticastOperator.prototype.call=function(subscriber,source){var selector=this.selector,subject=this.subjectFactory(),subscription=selector(subject).subscribe(subscriber);return subscription.add(source.subscribe(subject)),subscription},MulticastOperator}();function shareSubjectFactory(){return new Subject.a}function share(){return function(source){return refCount()(function multicast(subjectOrSubjectFactory,selector){return function multicastOperatorFunction(source){var subjectFactory;Iif(subjectFactory="function"==typeof subjectOrSubjectFactory?subjectOrSubjectFactory:function subjectFactory(){return subjectOrSubjectFactory},"function"==typeof selector)return source.lift(new MulticastOperator(subjectFactory,selector));var connectable=Object.create(source,connectableObservableDescriptor);return connectable.source=source,connectable.subjectFactory=subjectFactory,connectable}}(shareSubjectFactory)(source))}}__webpack_require__.d(__webpack_exports__,"a",function(){return share})},function(module,__webpack_exports__,__webpack_require__){"use strict";var Observable=__webpack_require__(5),isScheduler=__webpack_require__(123),tslib_es6=__webpack_require__(0),subscribeToResult=__webpack_require__(133),OuterSubscriber=__webpack_require__(134),InnerSubscriber=__webpack_require__(132),map=__webpack_require__(131),from=__webpack_require__(273);var MergeMapOperator=function(){function MergeMapOperator(project,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),this.project=project,this.concurrent=concurrent}return MergeMapOperator.prototype.call=function(observer,source){return source.subscribe(new mergeMap_MergeMapSubscriber(observer,this.project,this.concurrent))},MergeMapOperator}(),mergeMap_MergeMapSubscriber=function(_super){function MergeMapSubscriber(destination,project,concurrent){void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY);var _this=_super.call(this,destination)||this;return _this.project=project,_this.concurrent=concurrent,_this.hasCompleted=!1,_this.buffer=[],_this.active=0,_this.index=0,_this}return tslib_es6.c(MergeMapSubscriber,_super),MergeMapSubscriber.prototype._next=function(value){this.active<this.concurrent?this._tryNext(value):this.buffer.push(value)},MergeMapSubscriber.prototype._tryNext=function(value){var result,index=this.index++;try{result=this.project(value,index)}catch(err){return void this.destination.error(err)}this.active++,this._innerSub(result,value,index)},MergeMapSubscriber.prototype._innerSub=function(ish,value,index){var innerSubscriber=new InnerSubscriber.a(this,void 0,void 0);this.destination.add(innerSubscriber),Object(subscribeToResult.a)(this,ish,value,index,innerSubscriber)},MergeMapSubscriber.prototype._complete=function(){this.hasCompleted=!0,0===this.active&&0===this.buffer.length&&this.destination.complete(),this.unsubscribe()},MergeMapSubscriber.prototype.notifyNext=function(outerValue,innerValue,outerIndex,innerIndex,innerSub){this.destination.next(innerValue)},MergeMapSubscriber.prototype.notifyComplete=function(innerSub){var buffer=this.buffer;this.remove(innerSub),this.active--,buffer.length>0?this._next(buffer.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},MergeMapSubscriber}(OuterSubscriber.a),identity=__webpack_require__(135);function mergeAll(concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),function mergeMap(project,resultSelector,concurrent){return void 0===concurrent&&(concurrent=Number.POSITIVE_INFINITY),"function"==typeof resultSelector?function(source){return source.pipe(mergeMap(function(a,i){return Object(from.a)(project(a,i)).pipe(Object(map.a)(function(b,ii){return resultSelector(a,b,i,ii)}))},concurrent))}:("number"==typeof resultSelector&&(concurrent=resultSelector),function(source){return source.lift(new MergeMapOperator(project,concurrent))})}(identity.a,concurrent)}var fromArray=__webpack_require__(65);function merge(){for(var observables=[],_i=0;_i<arguments.length;_i++)observables[_i]=arguments[_i];var concurrent=Number.POSITIVE_INFINITY,scheduler=null,last=observables[observables.length-1];return Object(isScheduler.a)(last)?(scheduler=observables.pop(),observables.length>1&&"number"==typeof observables[observables.length-1]&&(concurrent=observables.pop())):"number"==typeof last&&(concurrent=observables.pop()),null===scheduler&&1===observables.length&&observables[0]instanceof Observable.a?observables[0]:mergeAll(concurrent)(Object(fromArray.a)(observables,scheduler))}__webpack_require__.d(__webpack_exports__,"a",function(){return merge})}]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW5ndWxhci9jb3JlL2Zlc201L2NvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvbXBpbGVyL2Zlc201L2NvbXBpbGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9leHBvcnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL3RvU3Vic2NyaWJlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL2NhblJlcG9ydEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL1N1YnNjcmliZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZhaWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvdXRpbC9VbnN1YnNjcmlwdGlvbkVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL1N1YnNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RlZmluZS1wcm9wZXJ0aWVzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvY29uZmlnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaGlkZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19yb290LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvbm9vcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NsYXNzb2YtcmF3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYS1mdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvaG9zdFJlcG9ydEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmlzLWFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL09iamVjdFVuc3Vic2NyaWJlZEVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvR2V0SW50cmluc2ljLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvdXRpbC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL1N1YmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvc3ltYm9sL3J4U3Vic2NyaWJlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21BcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hbmd1bGFyL2Rpc3QvY2xpZW50L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9oYXMvc3JjL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2xpZW50LWxvZ2dlci9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NvcmUtZXZlbnRzL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL09ic2VydmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGVtby5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzMjAxNy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2RzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9iaW5kLWNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS50by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9ucy9kaXN0L3B1YmxpY19hcGkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svcm91dGVyL3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvZXEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pcy1jYWxsYWJsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdWlkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2QtaGFzLXNwZWNpZXMtc3VwcG9ydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1zeW1ib2xzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9yZWdleHAtZXhlYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlQ3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzU3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL2lzT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL1N1YmplY3RTdWJzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL3N1YnNjcmliZVRvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvc3Vic2NyaWJlVG9PYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvdXRpbC9zdWJzY3JpYmVUb0FycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvaXNQcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvc3Vic2NyaWJlVG9Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvc3Vic2NyaWJlVG9JdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL0lubmVyU3Vic2NyaWJlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL3N1YnNjcmliZVRvUmVzdWx0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL091dGVyU3Vic2NyaWJlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL2lkZW50aXR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXMyMDE1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lcy1hYnN0cmFjdC9lczIwMTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb21pc2UucHJvdG90eXBlLmZpbmFsbHkvcmVxdWlyZVByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9taXNlLmFsbHNldHRsZWQvcmVxdWlyZVByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZG9jdW1lbnQtY3JlYXRlLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudW0tYnVnLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC52YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbWVtb2l6ZXJpZmljL21lbW9pemVyaWZpYy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19NYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VBc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQnVmZmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNUeXBlZEFycmF5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb2xsZWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mcmVlemluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlci1hZ2VudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1hY3Rpb25zL2Rpc3QvcHJldmlldy9hY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYWRkb24tYWN0aW9ucy9kaXN0L3ByZXZpZXcvY29uZmlndXJlQWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1hY3Rpb25zL2Rpc3QvcHJldmlldy9hY3Rpb25zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbnMtaGF2ZS1uYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtdG8tcHJpbWl0aXZlL2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzLXN5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9hc3NlcnRSZWNvcmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNOYU4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNGaW5pdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvaGVscGVycy9tb2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2VzNS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvZm9yRWFjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbi9oZWxwZXJzL2dldEluZmVycmVkTmFtZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXMyMDE4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLm1hdGNoYWxsL3JlZ2V4cC1tYXRjaGFsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZXhwLnByb3RvdHlwZS5mbGFncy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9uYXRpdmUtc3ltYm9sLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vd24ta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9oYXJtb255LW1vZHVsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pdGVyYXRvcnMtY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NsaWVudC1hcGkvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC10by1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVnZXhwLWZsYWdzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2hhbm5lbHMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1yZWdleHAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svcm91dGVyL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svcm91dGVyL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TdGFjay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3RvU291cmNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnbk1lcmdlVmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNMZW5ndGguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2FmZUdldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUxpa2VLZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEFycmF5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2dldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL2Rpc3Qvc3Vic2NyaXB0aW9uc19zdG9yZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaW5oZXJpdC1pZi1yZXF1aXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9nZXQtYnVpbHQtaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmRleC1vZi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NsaWVudC1hcGkvbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2xpZW50LWFwaS9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2xpZW50LWFwaS9kaXN0L3BhdGhUb0lkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NsaWVudC1hcGkvZGlzdC9xdWVyeXBhcmFtcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZnVuY3Rpb24tYmluZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYWRkb24tYWN0aW9ucy9kaXN0L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1hY3Rpb25zL2Rpc3QvcHJldmlldy93aXRoQWN0aW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1saW5rcy9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9uLWxpbmtzL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvVGVtcGxhdGVUYWcvVGVtcGxhdGVUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL3RyaW1SZXN1bHRUcmFuc2Zvcm1lci90cmltUmVzdWx0VHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL3N0cmlwSW5kZW50VHJhbnNmb3JtZXIvc3RyaXBJbmRlbnRUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyL3JlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvcmVwbGFjZVN0cmluZ1RyYW5zZm9ybWVyL3JlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvaW5saW5lQXJyYXlUcmFuc2Zvcm1lci9pbmxpbmVBcnJheVRyYW5zZm9ybWVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb21tb24tdGFncy9lcy9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIvcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvY29tbWFMaXN0cy9jb21tYUxpc3RzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb21tb24tdGFncy9lcy9jb21tYUxpc3RzQW5kL2NvbW1hTGlzdHNBbmQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL2NvbW1hTGlzdHNPci9jb21tYUxpc3RzT3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL2h0bWwvaHRtbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvc2FmZUh0bWwvc2FmZUh0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL29uZUxpbmUvb25lTGluZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvb25lTGluZVRyaW0vb25lTGluZVRyaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL29uZUxpbmVDb21tYUxpc3RzL29uZUxpbmVDb21tYUxpc3RzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb21tb24tdGFncy9lcy9vbmVMaW5lQ29tbWFMaXN0c09yL29uZUxpbmVDb21tYUxpc3RzT3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL29uZUxpbmVDb21tYUxpc3RzQW5kL29uZUxpbmVDb21tYUxpc3RzQW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb21tb24tdGFncy9lcy9pbmxpbmVMaXN0cy9pbmxpbmVMaXN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvb25lTGluZUlubGluZUxpc3RzL29uZUxpbmVJbmxpbmVMaXN0cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29tbW9uLXRhZ3MvZXMvc3RyaXBJbmRlbnQvc3RyaXBJbmRlbnQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL3N0cmlwSW5kZW50cy9zdHJpcEluZGVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvbW1vbi10YWdzL2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9uLWFjdGlvbnMvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1saW5rcy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29ic2VydmFibGUvZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tT2JzZXJ2YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb21JdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jb3JlL2Rpc3Qvc2VydmVyL2NvbW1vbi9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY29yZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9haXJibmItanMtc2hpbXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FpcmJuYi1qcy1zaGltcy90YXJnZXQvZXM1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lczUtc2hpbS9lczUtc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXM1LXNoaW0vZXM1LXNoYW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FpcmJuYi1qcy1zaGltcy90YXJnZXQvZXMyMDE1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lczYtc2hpbS9lczYtc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24ucHJvdG90eXBlLm5hbWUvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYWlyYm5iLWpzLXNoaW1zL3RhcmdldC9lczIwMTYuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FycmF5LWluY2x1ZGVzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FycmF5LWluY2x1ZGVzL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hcnJheS1pbmNsdWRlcy9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZXMtYWJzdHJhY3QvZXM2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXM2LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lcy10by1wcmltaXRpdmUvZXMyMDE1LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9pcy1kYXRlLW9iamVjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLWFic3RyYWN0L2hlbHBlcnMvaXNQcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2VzLXRvLXByaW1pdGl2ZS9lczUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FpcmJuYi1qcy1zaGltcy90YXJnZXQvZXMyMDE3LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QudmFsdWVzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC52YWx1ZXMvcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC52YWx1ZXMvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC5lbnRyaWVzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC5lbnRyaWVzL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QuZW50cmllcy9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS5wYWRzdGFydC9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0L3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0L2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnBhZGVuZC9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLnBhZGVuZC9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS5wYWRlbmQvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QuZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9ycy9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYWlyYm5iLWpzLXNoaW1zL3RhcmdldC9lczIwMTguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb21pc2UucHJvdG90eXBlLmZpbmFsbHkvYXV0by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvbWlzZS5wcm90b3R5cGUuZmluYWxseS9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5L3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5L2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9haXJibmItanMtc2hpbXMvdGFyZ2V0L2VzMjAxOS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXQvYXV0by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXQvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXQvcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2FycmF5LnByb3RvdHlwZS5mbGF0L2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hcnJheS5wcm90b3R5cGUuZmxhdG1hcC9hdXRvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hcnJheS5wcm90b3R5cGUuZmxhdG1hcC9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9hcnJheS5wcm90b3R5cGUuZmxhdG1hcC9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXJyYXkucHJvdG90eXBlLmZsYXRtYXAvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb24vYXV0by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbi9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uL3BvbHlmaWxsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uL2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9vYmplY3QuZnJvbWVudHJpZXMvYXV0by5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LmZyb21lbnRyaWVzL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL29iamVjdC5mcm9tZW50cmllcy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LmZyb21lbnRyaWVzL2ltcGxlbWVudGF0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9haXJibmItanMtc2hpbXMvdGFyZ2V0L2VzMjAyMC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS5tYXRjaGFsbC9hdXRvLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLm1hdGNoYWxsL3NoaW0uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmluZy5wcm90b3R5cGUubWF0Y2hhbGwvcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0cmluZy5wcm90b3R5cGUubWF0Y2hhbGwvaW1wbGVtZW50YXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlZ2V4cC5wcm90b3R5cGUuZmxhZ3Mvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3RyaW5nLnByb3RvdHlwZS5tYXRjaGFsbC9oZWxwZXJzL1JlZ0V4cFN0cmluZ0l0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHJpbmcucHJvdG90eXBlLm1hdGNoYWxsL2hlbHBlcnMvaGlkZGVuLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9nbG9iYWx0aGlzL2F1dG8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2dsb2JhbHRoaXMvc2hpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2xvYmFsdGhpcy9wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2xvYmFsdGhpcy9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvbWlzZS5hbGxzZXR0bGVkL2F1dG8uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb21pc2UuYWxsc2V0dGxlZC9zaGltLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9wcm9taXNlLmFsbHNldHRsZWQvcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb21pc2UuYWxsc2V0dGxlZC9pbXBsZW1lbnRhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9mZWF0dXJlcy9zeW1ib2wvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3ltYm9sL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmhhcy1pbnN0YW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNlYXJjaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnRvLXByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubWF0aC50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuanNvbi50by1zdHJpbmctdGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5kaXNwb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5wYXR0ZXJuLW1hdGNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NvcmUvZGlzdC9zZXJ2ZXIvcHJldmlldy9nbG9iYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYW5ndWxhci9kaXN0L2NsaWVudC9wcmV2aWV3L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NvcmUvY2xpZW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NvcmUvZGlzdC9jbGllbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY29yZS9kaXN0L2NsaWVudC9wcmV2aWV3L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL2Rpc3QvY2xpZW50X2FwaS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktcmVkdWNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtYXNzaWduLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9ucy9kaXN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9ucy9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9ucy9kaXN0L21ha2UtZGVjb3JhdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9ucy9kaXN0L3N0b3J5Ym9vay1jaGFubmVsLW1vY2suanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL3JvdXRlci9kaXN0L3V0aWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zYW1lLXZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svcm91dGVyL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svcm91dGVyL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL3JvdXRlci9ub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVyZ2VXaXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VNZXJnZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc3RhY2tDbGVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0RlbGV0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0dldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja0hhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zdGFja1NldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlSXNOYXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX29iamVjdFRvU3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzTWFza2VkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0VmFsdWUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoRGVsZXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hHZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoU2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUdldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2NyZWF0ZUJhc2VGb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZU1lcmdlRGVlcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jbG9uZVR5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fY2xvbmVBcnJheUJ1ZmZlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5QXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9faW5pdENsb25lT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVVuYXJ5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25vZGVVdGlsLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9QbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jb3B5T2JqZWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc2lnblZhbHVlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUaW1lcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlS2V5c0luLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUtleXNJbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVBc3NpZ25lci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlUmVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyUmVzdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcHBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9jb25zdGFudC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19zaG9ydE91dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2lzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzRXF1YWxEZWVwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2FycmF5U29tZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9BcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19lcXVhbE9iamVjdHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fbmF0aXZlS2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fRGF0YVZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Nhc3RQYXRoLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmluZ1RvUGF0aC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvbWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvU3RyaW5nLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL190b0tleS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL2Rpc3Qvc3Rvcnlfc3RvcmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2xpZW50LWFwaS9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9kZWJvdW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL25vdy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL3RvTnVtYmVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NsaWVudC1hcGkvZGlzdC9jb25maWdfYXBpLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2NvcmUvZGlzdC9jbGllbnQvcHJldmlldy9zdGFydC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jaGFubmVsLXBvc3RtZXNzYWdlL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zdHJpbmctdHJpbS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvd2hpdGVzcGFjZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtaW50ZWdlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGVsZWpzb24vZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaXMtZnVuY3Rpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzb2JqZWN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGlzdC9jbGllbnQvcHJldmlldy9nbG9iYWxzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGlzdC9jbGllbnQvcHJldmlldy9hbmd1bGFyLXBvbHlmaWxscy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9lcy9yZWZsZWN0L2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5hcHBseS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuY29uc3RydWN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuZ2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0Lmhhcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3QuaXMtZXh0ZW5zaWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Qub3duLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL3Byb3Bvc2Fscy9yZWZsZWN0LW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMud2Vhay1tYXAuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NvbGxlY3Rpb24td2Vhay5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lc25leHQucmVmbGVjdC5tZXRhZGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvem9uZS5qcy9kaXN0L3pvbmUuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYW5ndWxhci9kaXN0L2NsaWVudC9wcmV2aWV3L3JlbmRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hbmd1bGFyL2Rpc3QvY2xpZW50L3ByZXZpZXcvYW5ndWxhci9kZWNvcmF0b3JzLnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FkZG9uLWFjdGlvbnMvZGlzdC9tb2RlbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYWRkb24tYWN0aW9ucy9kaXN0L3ByZXZpZXcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvdjEuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3V1aWQvbGliL3JuZy1icm93c2VyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy91dWlkL2xpYi9ieXRlc1RvVXVpZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1hY3Rpb25zL2Rpc3QvcHJldmlldy9kZWNvcmF0ZUFjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1saW5rcy9kaXN0L3ByZXZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYWRkb24tbGlua3Mvbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1saW5rcy9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hZGRvbi1saW5rcy9ub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGlzdC9kZW1vL3dlbGNvbWUuY29tcG9uZW50LnRzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGlzdC9kZW1vL2J1dHRvbi5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvbGliL3VybHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2NvbW1vbi9mZXNtNS9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXIvZmVzbTUvcGxhdGZvcm0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2VtcHR5LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0Bhbmd1bGFyL2Zvcm1zL2Zlc201L2Zvcm1zLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMvZmVzbTUvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL05vdGlmaWNhdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVBY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jQWN0aW9uLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3NjaGVkdWxlci9BY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvU2NoZWR1bGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL3NjaGVkdWxlci9xdWV1ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvUXVldWVTY2hlZHVsZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FzeW5jU2NoZWR1bGVyLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9zY2FsYXIuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aHJvd0Vycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy9vYnNlcnZlT24uanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvUmVwbGF5U3ViamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL0VtcHR5RXJyb3IuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpbHRlci5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC91dGlsL0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWZhdWx0SWZFbXB0eS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvdGFwLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy90aHJvd0lmRW1wdHkuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9Ac3Rvcnlib29rL2FuZ3VsYXIvZGlzdC9jbGllbnQvcHJldmlldy9hbmd1bGFyL2FwcC50b2tlbi50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9hbmd1bGFyL2Rpc3QvY2xpZW50L3ByZXZpZXcvYW5ndWxhci9jb21wb25lbnRzL2FwcC5jb21wb25lbnQudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svYW5ndWxhci9kaXN0L2NsaWVudC9wcmV2aWV3L2FuZ3VsYXIvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHN0b3J5Ym9vay9jbGllbnQtYXBpL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmplY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzdG9yeWJvb2svY2xpZW50LWFwaS9ub2RlX21vZHVsZXMvaXNvYmplY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3JlZkNvdW50LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29ic2VydmFibGUvQ29ubmVjdGFibGVPYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy9tdWx0aWNhc3QuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3NoYXJlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yeGpzL19lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZU1hcC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcnhqcy9fZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VBbGwuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3J4anMvX2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9tZXJnZS5qcyJdLCJuYW1lcyI6WyJleHRlbmRTdGF0aWNzIiwiZCIsImIiLCJPYmplY3QiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIkFycmF5IiwicCIsImhhc093blByb3BlcnR5IiwiX19leHRlbmRzIiwiX18iLCJ0aGlzIiwiY29uc3RydWN0b3IiLCJwcm90b3R5cGUiLCJjcmVhdGUiLCJfX2Fzc2lnbiIsImFzc2lnbiIsInQiLCJzIiwiaSIsIm4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJjYWxsIiwiYXBwbHkiLCJfX2RlY29yYXRlIiwiZGVjb3JhdG9ycyIsInRhcmdldCIsImtleSIsImRlc2MiLCJjIiwiciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIlJlZmxlY3QiLCJkZWNvcmF0ZSIsImRlZmluZVByb3BlcnR5IiwiX19wYXJhbSIsInBhcmFtSW5kZXgiLCJkZWNvcmF0b3IiLCJfX21ldGFkYXRhIiwibWV0YWRhdGFLZXkiLCJtZXRhZGF0YVZhbHVlIiwibWV0YWRhdGEiLCJfX3ZhbHVlcyIsIm8iLCJtIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJuZXh0IiwidmFsdWUiLCJkb25lIiwiX19yZWFkIiwiZSIsImFyIiwicHVzaCIsImVycm9yIiwiX19zcHJlYWQiLCJjb25jYXQiLCJBTk5PVEFUSU9OUyIsIlBBUkFNRVRFUlMiLCJQUk9QX01FVEFEQVRBIiwibWFrZURlY29yYXRvciIsIm5hbWUiLCJwcm9wcyIsInBhcmVudENsYXNzIiwiYWRkaXRpb25hbFByb2Nlc3NpbmciLCJ0eXBlRm4iLCJtZXRhQ3RvciIsIm1ha2VNZXRhZGF0YUN0b3IiLCJEZWNvcmF0b3JGYWN0b3J5IiwiX2EiLCJhcmdzIiwiX2kiLCJhbm5vdGF0aW9uSW5zdGFuY2UiLCJiaW5kIiwiVHlwZURlY29yYXRvciIsImNscyIsIm5nTWV0YWRhdGFOYW1lIiwiYW5ub3RhdGlvbkNscyIsImN0b3IiLCJ2YWx1ZXMiLCJwcm9wTmFtZSIsIm1ha2VQYXJhbURlY29yYXRvciIsIlBhcmFtRGVjb3JhdG9yRmFjdG9yeSIsIlBhcmFtRGVjb3JhdG9yIiwiYW5ub3RhdGlvbiIsInVudXNlZEtleSIsImluZGV4IiwicGFyYW1ldGVycyIsIm1ha2VQcm9wRGVjb3JhdG9yIiwiUHJvcERlY29yYXRvckZhY3RvcnkiLCJkZWNvcmF0b3JJbnN0YW5jZSIsIlByb3BEZWNvcmF0b3IiLCJtZXRhIiwidW5zaGlmdCIsIkluamVjdEZsYWdzIiwiSW5qZWN0IiwidG9rZW4iLCJPcHRpb25hbCIsIlNlbGYiLCJTa2lwU2VsZiIsIkhvc3QiLCJBdHRyaWJ1dGUiLCJhdHRyaWJ1dGVOYW1lIiwiZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSIsIm9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCIsIkVycm9yIiwiybXJtWRlZmluZUluamVjdGFibGUiLCJvcHRzIiwicHJvdmlkZWRJbiIsImZhY3RvcnkiLCJ1bmRlZmluZWQiLCLJtcm1ZGVmaW5lSW5qZWN0b3IiLCJvcHRpb25zIiwicHJvdmlkZXJzIiwiaW1wb3J0cyIsImdldEluamVjdGFibGVEZWYiLCJ0eXBlIiwiTkdfSU5KRUNUQUJMRV9ERUYiLCJnZXRJbmplY3RvckRlZiIsIk5HX0lOSkVDVE9SX0RFRiIsIm5nSW5qZWN0YWJsZURlZiIsIm5nSW5qZWN0b3JEZWYiLCJzdHJpbmdpZnkiLCJtYXAiLCJqb2luIiwib3ZlcnJpZGRlbk5hbWUiLCJyZXMiLCJ0b1N0cmluZyIsIm5ld0xpbmVJbmRleCIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJfX2ZvcndhcmRfcmVmX18iLCJmb3J3YXJkUmVmIiwiZm9yd2FyZFJlZkZuIiwicmVzb2x2ZUZvcndhcmRSZWYiLCJmbiIsIlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSIsIl9nbG9iYWwiLCJnZXRHbG9iYWwiLCJfX2dsb2JhbFRoaXMiLCJnbG9iYWxUaGlzIiwiX193aW5kb3ciLCJ3aW5kb3ciLCJfX3NlbGYiLCJzZWxmIiwiV29ya2VyR2xvYmFsU2NvcGUiLCJnbG9iYWwiLCJfaW5qZWN0SW1wbGVtZW50YXRpb24iLCJfY3VycmVudEluamVjdG9yIiwic2V0Q3VycmVudEluamVjdG9yIiwiaW5qZWN0b3IiLCJmb3JtZXIiLCJzZXRJbmplY3RJbXBsZW1lbnRhdGlvbiIsImltcGwiLCJwcmV2aW91cyIsIsm1ybVpbmplY3QiLCJmbGFncyIsIkRlZmF1bHQiLCJpbmplY3RJbmplY3Rvck9ubHkiLCJpbmplY3RSb290TGltcE1vZGUiLCJnZXQiLCJub3RGb3VuZFZhbHVlIiwiaW5qZWN0YWJsZURlZiIsImluamVjdEFyZ3MiLCJ0eXBlcyIsImFyZyIsImlzQXJyYXkiLCJqIiwiVHlwZSIsIkZ1bmN0aW9uIiwiaXNUeXBlIiwidiIsIkRFTEVHQVRFX0NUT1IiLCJJTkhFUklURURfQ0xBU1MiLCJJTkhFUklURURfQ0xBU1NfV0lUSF9DVE9SIiwiSU5IRVJJVEVEX0NMQVNTX1dJVEhfREVMRUdBVEVfQ1RPUiIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMiLCJyZWZsZWN0IiwiX3JlZmxlY3QiLCJpc1JlZmxlY3Rpb25FbmFibGVkIiwiX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMiLCJwYXJhbVR5cGVzIiwicGFyYW1Bbm5vdGF0aW9ucyIsInJlc3VsdCIsIl9vd25QYXJhbWV0ZXJzIiwicGFyZW50Q3RvciIsInR5cGVTdHIiLCJleGVjIiwidHNpY2tsZUN0b3JQYXJhbXMiLCJjdG9yUGFyYW1ldGVycyIsInBhcmFtVHlwZXNfMSIsImN0b3JQYXJhbSIsInBhcmFtQW5ub3RhdGlvbnNfMSIsImNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhIiwiZ2V0T3duTWV0YWRhdGEiLCJmaWxsIiwiZ2V0UGFyZW50Q3RvciIsIl9vd25Bbm5vdGF0aW9ucyIsInR5cGVPckZ1bmMiLCJhbm5vdGF0aW9ucyIsIm93bkFubm90YXRpb25zIiwiX293blByb3BNZXRhZGF0YSIsInByb3BNZXRhZGF0YSIsInByb3BEZWNvcmF0b3JzIiwicHJvcERlY29yYXRvcnNfMSIsInByb3BNZXRhZGF0YV8xIiwia2V5cyIsImZvckVhY2giLCJwcm9wIiwicGFyZW50UHJvcE1ldGFkYXRhXzEiLCJvd25Qcm9wTWV0YWRhdGEiLCJoYXNMaWZlY3ljbGVIb29rIiwibGNQcm9wZXJ0eSIsImd1YXJkcyIsImdldHRlciIsInNldHRlciIsIm1ldGhvZCIsImltcG9ydFVyaSIsInJlc291cmNlVXJpIiwicmVzb2x2ZUlkZW50aWZpZXIiLCJtb2R1bGVVcmwiLCJtZW1iZXJzIiwicnVudGltZSIsInJlc29sdmVFbnVtIiwiZW51bUlkZW50aWZpZXIiLCJkZWNvcmF0b3JJbnZvY2F0aW9ucyIsImRlY29yYXRvckludm9jYXRpb24iLCJhbm5vdGF0aW9uQXJncyIsInBhcmVudFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJwcm92aWRlIiwiU3RyaW5nIiwidXNlVmFsdWUiLCJVU0VfVkFMVUUkMSIsIkVNUFRZX0FSUkFZIiwiY29udmVydEluamVjdGFibGVQcm92aWRlclRvRmFjdG9yeSIsInByb3ZpZGVyIiwiZGVwc18xIiwicmVmbGVjdGlvbkNhcGFiaWxpdGllcyIsInZhbHVlUHJvdmlkZXJfMSIsInVzZUV4aXN0aW5nIiwiZXhpc3RpbmdQcm92aWRlcl8xIiwidXNlRmFjdG9yeSIsImZhY3RvcnlQcm92aWRlcl8xIiwiZGVwcyIsInVzZUNsYXNzIiwiY2xhc3NQcm92aWRlcl8xIiwiZGVwc18yIiwiZGVwc18zIiwiSW5qZWN0YWJsZSIsIlNXSVRDSF9DT01QSUxFX0lOSkVDVEFCTEUiLCJyZW5kZXIyQ29tcGlsZUluamVjdGFibGUiLCJpbmplY3RhYmxlVHlwZSIsIkluamVjdGlvblRva2VuIiwiX2Rlc2MiLCJfX05HX0VMRU1FTlRfSURfXyIsIlNPVVJDRSIsIl9USFJPV19JRl9OT1RfRk9VTkQiLCJUSFJPV19JRl9OT1RfRk9VTkQiLCJJTkpFQ1RPUiIsIk51bGxJbmplY3RvciIsIkluamVjdG9yIiwicGFyZW50IiwiU3RhdGljSW5qZWN0b3IiLCJOVUxMIiwiSURFTlQiLCJFTVBUWSIsIkNJUkNVTEFSIiwiTVVMVElfUFJPVklERVJfRk4iLCJzbGljZSIsIlVTRV9WQUxVRSQyIiwiTkdfVE9LRU5fUEFUSCIsIk5HX1RFTVBfVE9LRU5fUEFUSCIsIk5FV19MSU5FIiwiTk9fTkVXX0xJTkUiLCJzb3VyY2UiLCJyZWNvcmRzIiwiX3JlY29yZHMiLCJNYXAiLCJzZXQiLCJ1c2VOZXciLCJyZWN1cnNpdmVseVByb2Nlc3NQcm92aWRlcnMiLCJzdGF0aWNFcnJvciIsInJlc29sdmVkUHJvdmlkZXIiLCJyZXNvbHZlUHJvdmlkZXIiLCJjb21wdXRlRGVwcyIsInByb3ZpZGVyRGVwcyIsIm11bHRpIiwibXVsdGlQcm92aWRlciIsIm11bHRpUHJvdmlkZXJNaXhFcnJvciIsInJlY29yZCIsInRyeVJlc29sdmVUb2tlbiIsImNhdGNoSW5qZWN0b3JFcnJvciIsInRva2VucyIsInJlc29sdmVUb2tlbiIsImRlcFJlY29yZHMiLCJkZXBSZWNvcmQiLCJjaGlsZFJlY29yZCIsImluamVjdG9yRXJyb3JOYW1lIiwidG9rZW5QYXRoIiwibWVzc2FnZSIsImZvcm1hdEVycm9yIiwidGV4dCIsIm9iaiIsImNoYXJBdCIsInN1YnN0ciIsImNvbnRleHQiLCJwYXJ0cyIsIkpTT04iLCJyZXBsYWNlIiwiRVJST1JfREVCVUdfQ09OVEVYVCIsIkVSUk9SX09SSUdJTkFMX0VSUk9SIiwiRVJST1JfTE9HR0VSIiwiY29uc3RydWN0UmVzb2x2aW5nUGF0aCIsImZpbmRGaXJzdENsb3NlZEN5Y2xlIiwicmV2ZXJzZSIsImsiLCJpbmplY3Rpb25FcnJvciIsImNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UiLCJvcmlnaW5hbEVycm9yIiwiZXJyTXNnIiwid3JhcHBlZEVycm9yIiwibXNnIiwiYWRkS2V5IiwiaW5qZWN0b3JzIiwibm9Bbm5vdGF0aW9uRXJyb3IiLCJwYXJhbXMiLCJzaWduYXR1cmUiLCJpaSIsInBhcmFtZXRlciIsIlJlZmxlY3RpdmVLZXkiLCJpZCIsImRpc3BsYXlOYW1lIiwiX2dsb2JhbEtleVJlZ2lzdHJ5IiwibnVtYmVyT2ZLZXlzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIktleVJlZ2lzdHJ5IiwiX2FsbEtleXMiLCJoYXMiLCJuZXdLZXkiLCJzaXplIiwicmVmbGVjdG9yIiwiUmVmbGVjdG9yIiwidXBkYXRlQ2FwYWJpbGl0aWVzIiwiY2FwcyIsImlkZW50aWZpZXIiLCJSZWZsZWN0aXZlRGVwZW5kZW5jeSIsIm9wdGlvbmFsIiwidmlzaWJpbGl0eSIsImZyb21LZXkiLCJfRU1QVFlfTElTVCIsIlJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyXyIsInJlc29sdmVkRmFjdG9yaWVzIiwicmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeSIsImRlcGVuZGVuY2llcyIsInJlc29sdmVSZWZsZWN0aXZlRmFjdG9yeSIsImZhY3RvcnlGbiIsInJlc29sdmVkRGVwcyIsIl9kZXBlbmRlbmNpZXNGb3IiLCJhbGlhc0luc3RhbmNlIiwiY29uc3RydWN0RGVwZW5kZW5jaWVzIiwicGFyYW1zXzEiLCJfZXh0cmFjdFRva2VuIiwicmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlciIsInJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXJzIiwicmVzb2x2ZWRQcm92aWRlck1hcCIsIm1lcmdlUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzIiwibm9ybWFsaXplZFByb3ZpZGVyc01hcCIsImV4aXN0aW5nIiwiX25vcm1hbGl6ZVByb3ZpZGVycyIsImludmFsaWRQcm92aWRlckVycm9yIiwiZnJvbSIsInNvbWUiLCJfY3JlYXRlRGVwZW5kZW5jeSIsInBhcmFtTWV0YWRhdGEiLCJVTkRFRklORUQiLCJSZWZsZWN0aXZlSW5qZWN0b3IiLCJyZXNvbHZlIiwicmVzb2x2ZUFuZENyZWF0ZSIsIlJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyIsImZyb21SZXNvbHZlZFByb3ZpZGVycyIsIlJlZmxlY3RpdmVJbmplY3Rvcl8iLCJfcHJvdmlkZXJzIiwiX3BhcmVudCIsIl9jb25zdHJ1Y3Rpb25Db3VudGVyIiwibGVuIiwia2V5SWRzIiwib2JqcyIsIl9nZXRCeUtleSIsInJlc29sdmVBbmRDcmVhdGVDaGlsZCIsImNyZWF0ZUNoaWxkRnJvbVJlc29sdmVkIiwiaW5qIiwicmVzb2x2ZUFuZEluc3RhbnRpYXRlIiwiaW5zdGFudGlhdGVSZXNvbHZlZCIsIl9pbnN0YW50aWF0ZVByb3ZpZGVyIiwiZ2V0UHJvdmlkZXJBdEluZGV4Iiwib3V0T2ZCb3VuZHNFcnJvciIsIl9uZXciLCJfZ2V0TWF4TnVtYmVyT2ZPYmplY3RzIiwiY3ljbGljRGVwZW5kZW5jeUVycm9yIiwiX2luc3RhbnRpYXRlIiwiX3RoaXMiLCJkZXAiLCJfZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeSIsImluc3RhbnRpYXRpb25FcnJvciIsIm9yaWdpbmFsRXhjZXB0aW9uIiwib3JpZ2luYWxTdGFjayIsImZpcnN0Iiwic3RhY2siLCJJTkpFQ1RPUl9LRVkiLCJfZ2V0QnlLZXlTZWxmIiwiX2dldEJ5S2V5RGVmYXVsdCIsIl9nZXRPYmpCeUtleUlkIiwia2V5SWQiLCJfdGhyb3dPck51bGwiLCJub1Byb3ZpZGVyRXJyb3IiLCJpbmpfIiwiX21hcFByb3ZpZGVycyIsIkNoYW5nZURldGVjdGlvblN0cmF0ZWd5IiwiQ2hhbmdlRGV0ZWN0b3JTdGF0dXMiLCJBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTIiwiUXVlcnkiLCJWaWV3Q2hpbGQiLCJzZWxlY3RvciIsImRhdGEiLCJpc1ZpZXdRdWVyeSIsImRlc2NlbmRhbnRzIiwiVmlld0VuY2Fwc3VsYXRpb24iLCJTZXQiLCJub1NpZGVFZmZlY3RzIiwibmdEZXZNb2RlIiwibmdEZXZNb2RlUmVzZXRQZXJmQ291bnRlcnMiLCJuZXdDb3VudGVycyIsImZpcnN0VGVtcGxhdGVQYXNzIiwidE5vZGUiLCJ0VmlldyIsInJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUiLCJyZW5kZXJlclNldFRleHQiLCJyZW5kZXJlckNyZWF0ZUVsZW1lbnQiLCJyZW5kZXJlckFkZEV2ZW50TGlzdGVuZXIiLCJyZW5kZXJlclNldEF0dHJpYnV0ZSIsInJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlIiwicmVuZGVyZXJTZXRQcm9wZXJ0eSIsInJlbmRlcmVyU2V0Q2xhc3NOYW1lIiwicmVuZGVyZXJBZGRDbGFzcyIsInJlbmRlcmVyUmVtb3ZlQ2xhc3MiLCJyZW5kZXJlclNldFN0eWxlIiwicmVuZGVyZXJSZW1vdmVTdHlsZSIsInJlbmRlcmVyRGVzdHJveSIsInJlbmRlcmVyRGVzdHJveU5vZGUiLCJyZW5kZXJlck1vdmVOb2RlIiwicmVuZGVyZXJSZW1vdmVOb2RlIiwicmVuZGVyZXJDcmVhdGVDb21tZW50Iiwic3R5bGluZ01hcCIsInN0eWxpbmdNYXBDYWNoZU1pc3MiLCJzdHlsaW5nUHJvcCIsInN0eWxpbmdQcm9wQ2FjaGVNaXNzIiwic3R5bGluZ0FwcGx5Iiwic3R5bGluZ0FwcGx5Q2FjaGVNaXNzIiwiRU1QVFlfT0JKIiwiRU1QVFlfQVJSQVkkMSIsImZyZWV6ZSIsIk5HX0NPTVBPTkVOVF9ERUYiLCJuZ0NvbXBvbmVudERlZiIsIk5HX0RJUkVDVElWRV9ERUYiLCJuZ0RpcmVjdGl2ZURlZiIsIk5HX1BJUEVfREVGIiwibmdQaXBlRGVmIiwiTkdfTU9EVUxFX0RFRiIsIm5nTW9kdWxlRGVmIiwiTkdfRUxFTUVOVF9JRCIsIm5nQmFzZURlZiIsIl9yZW5kZXJDb21wQ291bnQiLCLJtcm1ZGVmaW5lQ29tcG9uZW50IiwiY29tcG9uZW50RGVmaW5pdGlvbiIsInR5cGVQcm90b3R5cGUiLCJkZWNsYXJlZElucHV0cyIsImRlZiIsInByb3ZpZGVyc1Jlc29sdmVyIiwiY29uc3RzIiwidmFycyIsInRlbXBsYXRlIiwibmdDb250ZW50U2VsZWN0b3JzIiwiaG9zdEJpbmRpbmdzIiwiY29udGVudFF1ZXJpZXMiLCJpbnB1dHMiLCJvdXRwdXRzIiwiZXhwb3J0QXMiLCJvbkNoYW5nZXMiLCJvbkluaXQiLCJuZ09uSW5pdCIsImRvQ2hlY2siLCJuZ0RvQ2hlY2siLCJhZnRlckNvbnRlbnRJbml0IiwibmdBZnRlckNvbnRlbnRJbml0IiwiYWZ0ZXJDb250ZW50Q2hlY2tlZCIsIm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCIsImFmdGVyVmlld0luaXQiLCJuZ0FmdGVyVmlld0luaXQiLCJhZnRlclZpZXdDaGVja2VkIiwibmdBZnRlclZpZXdDaGVja2VkIiwib25EZXN0cm95IiwibmdPbkRlc3Ryb3kiLCJvblB1c2giLCJjaGFuZ2VEZXRlY3Rpb24iLCJPblB1c2giLCJkaXJlY3RpdmVEZWZzIiwicGlwZURlZnMiLCJzZWxlY3RvcnMiLCJ2aWV3UXVlcnkiLCJmZWF0dXJlcyIsImVuY2Fwc3VsYXRpb24iLCJFbXVsYXRlZCIsInN0eWxlcyIsIl8iLCJzZXRJbnB1dCIsInNjaGVtYXMiLCJkaXJlY3RpdmVUeXBlcyIsImRpcmVjdGl2ZXMiLCJmZWF0dXJlIiwicGlwZVR5cGVzIiwicGlwZXMiLCJpbnZlcnRPYmplY3QiLCJleHRyYWN0RGlyZWN0aXZlRGVmIiwiZXh0cmFjdFBpcGVEZWYiLCJnZXRDb21wb25lbnREZWYiLCJnZXREaXJlY3RpdmVEZWYiLCJnZXRQaXBlRGVmIiwic2Vjb25kYXJ5IiwibmV3TG9va3VwIiwibWluaWZpZWRLZXkiLCJwdWJsaWNOYW1lIiwiZGVjbGFyZWROYW1lIiwiybXJtWRlZmluZURpcmVjdGl2ZSIsImdldE5nTW9kdWxlRGVmIiwidGhyb3dOb3RGb3VuZCIsInJlbmRlclN0cmluZ2lmeSIsInN0cmluZ2lmeUZvckVycm9yIiwiZGVmYXVsdFNjaGVkdWxlciIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNldFRpbWVvdXQiLCJJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiIsImlzUHJvcE1ldGFkYXRhU3RyaW5nIiwic3RyIiwibWF5YmVVbndyYXBGbiIsImFzc2VydEVxdWFsIiwiYWN0dWFsIiwiZXhwZWN0ZWQiLCJ0aHJvd0Vycm9yIiwiYXNzZXJ0Tm90RXF1YWwiLCJhc3NlcnRMZXNzVGhhbiIsImFzc2VydEdyZWF0ZXJUaGFuIiwiYXNzZXJ0RGVmaW5lZCIsImFzc2VydERvbU5vZGUiLCJub2RlIiwiTm9kZSIsImFzc2VydERhdGFJblJhbmdlIiwiYXJyIiwiSE9TVCIsIlRWSUVXIiwiRkxBR1MiLCJQQVJFTlQiLCJORVhUIiwiUVVFUklFUyIsIlRfSE9TVCIsIkJJTkRJTkdfSU5ERVgiLCJDTEVBTlVQIiwiQ09OVEVYVCIsIklOSkVDVE9SJDEiLCJSRU5ERVJFUl9GQUNUT1JZIiwiUkVOREVSRVIiLCJTQU5JVElaRVIiLCJDSElMRF9IRUFEIiwiQ0hJTERfVEFJTCIsIkNPTlRFTlRfUVVFUklFUyIsIkRFQ0xBUkFUSU9OX1ZJRVciLCJQUkVPUkRFUl9IT09LX0ZMQUdTIiwiSEVBREVSX09GRlNFVCIsIlRZUEUiLCJBQ1RJVkVfSU5ERVgiLCJOQVRJVkUiLCJWSUVXUyIsIk1PTktFWV9QQVRDSF9LRVlfTkFNRSIsInVud3JhcFJOb2RlIiwiaXNMVmlldyIsImlzTENvbnRhaW5lciIsImdldE5hdGl2ZUJ5VE5vZGUiLCJob3N0VmlldyIsImdldFROb2RlIiwidmlldyIsImdldENvbXBvbmVudFZpZXdCeUluZGV4Iiwibm9kZUluZGV4Iiwic2xvdFZhbHVlIiwiaXNDb21wb25lbnQiLCJpc0NvbXBvbmVudERlZiIsImlzUm9vdFZpZXciLCJyZWFkUGF0Y2hlZERhdGEiLCJyZWFkUGF0Y2hlZExWaWV3IiwibFZpZXciLCJ2aWV3QXR0YWNoZWRUb0NvbnRhaW5lciIsInJlc2V0UHJlT3JkZXJIb29rRmxhZ3MiLCJhc3NlcnRDb21wb25lbnRUeXBlIiwiYXNzZXJ0UHJldmlvdXNJc1BhcmVudCIsImlzUGFyZW50IiwiYXNzZXJ0TENvbnRhaW5lciIsImFzc2VydExWaWV3T3JVbmRlZmluZWQiLCJhc3NlcnRMVmlldyIsIlROT0RFIiwiUEFSRU5UX0lOSkVDVE9SIiwiSU5KRUNUT1JfQkxPT01fUEFSRU5UX1NJWkUiLCJOT19QQVJFTlRfSU5KRUNUT1IiLCJOb2RlSW5qZWN0b3JGYWN0b3J5IiwiaXNWaWV3UHJvdmlkZXIiLCJpbmplY3RJbXBsZW1lbnRhdGlvbiIsInJlc29sdmluZyIsImNhblNlZVZpZXdQcm92aWRlcnMiLCJpbmplY3RJbXBsIiwiYXNzZXJ0Tm9kZVR5cGUiLCJ0eXBlTmFtZSIsImFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXMiLCJyZWdpc3RlclByZU9yZGVySG9va3MiLCJkaXJlY3RpdmVJbmRleCIsImRpcmVjdGl2ZURlZiIsImluaXRpYWxQcmVPcmRlckhvb2tzTGVuZ3RoIiwiaW5pdGlhbFByZU9yZGVyQ2hlY2tIb29rc0xlbmd0aCIsInByZU9yZGVySG9va3MiLCJwcmVPcmRlckNoZWNrSG9va3MiLCJyZWdpc3RlclBvc3RPcmRlckhvb2tzIiwiZGlyZWN0aXZlU3RhcnQiLCJlbmQiLCJkaXJlY3RpdmVFbmQiLCJjb250ZW50SG9va3MiLCJjb250ZW50Q2hlY2tIb29rcyIsInZpZXdIb29rcyIsInZpZXdDaGVja0hvb2tzIiwiZGVzdHJveUhvb2tzIiwiZXhlY3V0ZVByZU9yZGVySG9va3MiLCJjdXJyZW50VmlldyIsImNoZWNrTm9DaGFuZ2VzTW9kZSIsImN1cnJlbnROb2RlSW5kZXgiLCJleGVjdXRlSG9va3MiLCJmaXJzdFBhc3NIb29rcyIsImNoZWNrSG9va3MiLCJpbml0UGhhc2VTdGF0ZSIsImhvb2tzVG9DYWxsIiwiY2FsbEhvb2tzIiwiaW5pdFBoYXNlIiwic3RhcnRJbmRleCIsIm5vZGVJbmRleExpbWl0IiwibGFzdE5vZGVJbmRleEZvdW5kIiwiY2FsbEhvb2siLCJpc0luaXRIb29rIiwiaG9vayIsImRpcmVjdGl2ZSIsInN0eWxpbmdDb250ZXh0Iiwic2V0Q2FjaGVkU3R5bGluZ0NvbnRleHQiLCJzZXRDdXJyZW50RGlyZWN0aXZlRGVmIiwiZ2V0TFZpZXciLCJwcmV2aW91c09yUGFyZW50VE5vZGUiLCJNSU5fRElSRUNUSVZFX0lEIiwiYWN0aXZlRGlyZWN0aXZlSWQiLCJhY3RpdmVEaXJlY3RpdmVTdXBlckNsYXNzRGVwdGhQb3NpdGlvbiIsImFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NIZWlnaHQiLCJzZXRBY3RpdmVIb3N0RWxlbWVudCIsImVsZW1lbnRJbmRleCIsIl9zZWxlY3RlZEluZGV4Iiwic2V0U2VsZWN0ZWRJbmRleCIsImluY3JlbWVudEFjdGl2ZURpcmVjdGl2ZUlkIiwiZ2V0UHJldmlvdXNPclBhcmVudFROb2RlIiwic2V0UHJldmlvdXNPclBhcmVudFROb2RlIiwic2V0VE5vZGVBbmRWaWV3RGF0YSIsImdldElzUGFyZW50Iiwic2V0SXNQYXJlbnQiLCJpc0NyZWF0aW9uTW9kZSIsImdldENoZWNrTm9DaGFuZ2VzTW9kZSIsInNldENoZWNrTm9DaGFuZ2VzTW9kZSIsIm1vZGUiLCJzZXRCaW5kaW5nUm9vdCIsInNldEN1cnJlbnRRdWVyeUluZGV4IiwiZW50ZXJWaWV3IiwibmV3VmlldyIsImhvc3RUTm9kZSIsIm9sZFZpZXciLCJiaW5kaW5nU3RhcnRJbmRleCIsImxlYXZlVmlldyIsImdldFNlbGVjdGVkSW5kZXgiLCJSZW5kZXJlclN0eWxlRmxhZ3MzIiwiX2N1cnJlbnROYW1lc3BhY2UiLCLJtcm1bmFtZXNwYWNlSFRNTCIsImlzUHJvY2VkdXJhbFJlbmRlcmVyIiwicmVuZGVyZXIiLCJkb21SZW5kZXJlckZhY3RvcnkzIiwiY3JlYXRlUmVuZGVyZXIiLCJob3N0RWxlbWVudCIsInJlbmRlcmVyVHlwZSIsImRvY3VtZW50IiwiZ2V0TENvbnRleHQiLCJtcFZhbHVlIiwiY29tcG9uZW50IiwiaXNDb21wb25lbnRJbnN0YW5jZSIsImluc3RhbmNlIiwiZmluZFZpYUNvbXBvbmVudCIsImlzRGlyZWN0aXZlSW5zdGFuY2UiLCJmaW5kVmlhRGlyZWN0aXZlIiwiZGlyZWN0aXZlSW5zdGFuY2UiLCJmaXJzdENoaWxkIiwiZGlyZWN0aXZlSW5kZXhTdGFydCIsImRpcmVjdGl2ZUluZGV4RW5kIiwidHJhdmVyc2VOZXh0RWxlbWVudCIsImdldERpcmVjdGl2ZXNBdE5vZGVJbmRleCIsImZpbmRWaWFOYXRpdmVFbGVtZW50IiwiZXhpc3RpbmdDdHgiLCJuYXRpdmUiLCJjcmVhdGVMQ29udGV4dCIsImF0dGFjaFBhdGNoRGF0YSIsInJFbGVtZW50IiwicGFyZW50XzEiLCJwYXJlbnROb2RlIiwicGFyZW50Q29udGV4dCIsImxvY2FsUmVmcyIsImNoaWxkIiwiY29tcG9uZW50SW5zdGFuY2UiLCJjb21wb25lbnRJbmRpY2VzIiwiY29tcG9uZW50cyIsImVsZW1lbnRDb21wb25lbnRJbmRleCIsImluY2x1ZGVDb21wb25lbnRzIiwiZGlyZWN0aXZlU3RhcnRJbmRleCIsImRpcmVjdGl2ZUVuZEluZGV4IiwiQ29yZVBsYXllckhhbmRsZXIiLCJfcGxheWVycyIsImZsdXNoUGxheWVycyIsInBsYXllciIsInN0YXRlIiwicGxheSIsInF1ZXVlUGxheWVyIiwiREVGQVVMVF9URU1QTEFURV9ESVJFQ1RJVkVfSU5ERVgiLCJjcmVhdGVFbXB0eVN0eWxpbmdDb250ZXh0Iiwid3JhcHBlZEVsZW1lbnQiLCJzYW5pdGl6ZXIiLCJpbml0aWFsU3R5bGVzIiwiaW5pdGlhbENsYXNzZXMiLCJhbGxvY2F0ZU9yVXBkYXRlRGlyZWN0aXZlSW50b0NvbnRleHQiLCJzaW5nbGVQcm9wVmFsdWVzSW5kZXgiLCJzdHlsZVNhbml0aXplciIsImRpcmVjdGl2ZVJlZ2lzdHJ5IiwibGltaXQiLCJwcm9wVmFsdWVzU3RhcnRQb3NpdGlvbiIsImdldFN0eWxpbmdDb250ZXh0RnJvbUxWaWV3Iiwidmlld0RhdGEiLCJzdG9yYWdlSW5kZXgiLCJ3cmFwcGVyIiwiaXNTdHlsaW5nQ29udGV4dCIsInN0eWxpbmdUZW1wbGF0ZSIsImFsbG9jU3R5bGluZ0NvbnRleHQiLCJlbGVtZW50IiwidGVtcGxhdGVTdHlsZUNvbnRleHQiLCJhZGRQbGF5ZXJJbnRlcm5hbCIsInBsYXllckNvbnRleHQiLCJyb290Q29udGV4dCIsInBsYXllckNvbnRleHRJbmRleCIsInJlZiIsImFkZEV2ZW50TGlzdGVuZXIiLCJub25GYWN0b3J5UGxheWVySW5kZXgiLCJzcGxpY2UiLCJkZXN0cm95IiwicGxheWVySGFuZGxlciIsImdldFBsYXllckNvbnRleHQiLCJhbGxvY1BsYXllckNvbnRleHQiLCJoYXNQYXJlbnRJbmplY3RvciIsInBhcmVudExvY2F0aW9uIiwiZ2V0UGFyZW50SW5qZWN0b3JJbmRleCIsImdldFBhcmVudEluamVjdG9yVmlld09mZnNldCIsImdldFBhcmVudEluamVjdG9yVmlldyIsImxvY2F0aW9uIiwic3RhcnRWaWV3Iiwidmlld09mZnNldCIsInBhcmVudFZpZXciLCJnZXRMVmlld1BhcmVudCIsImZpbmRDb21wb25lbnRWaWV3Iiwicm9vdFROb2RlIiwiZ2V0Um9vdENvbnRleHQiLCJ2aWV3T3JDb21wb25lbnQiLCJyb290VmlldyIsImdldFJvb3RWaWV3IiwiY29tcG9uZW50T3JMVmlldyIsImluY2x1ZGVWaWV3UHJvdmlkZXJzIiwic2V0SW5jbHVkZVZpZXdQcm92aWRlcnMiLCJvbGRWYWx1ZSIsIkJMT09NX01BU0siLCJCTE9PTV9TSVpFIiwibmV4dE5nRWxlbWVudElkIiwiZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlIiwiZXhpc3RpbmdJbmplY3RvckluZGV4IiwiZ2V0SW5qZWN0b3JJbmRleCIsImluamVjdG9ySW5kZXgiLCJpbnNlcnRCbG9vbSIsImJsdWVwcmludCIsInBhcmVudExvYyIsImdldFBhcmVudEluamVjdG9yTG9jYXRpb24iLCJwYXJlbnRJbmRleCIsInBhcmVudExWaWV3IiwicGFyZW50RGF0YSIsImZvb3RlciIsImRpUHVibGljSW5JbmplY3RvciIsImJsb29tQWRkIiwiY2hhckNvZGVBdCIsImJsb29tQml0IiwibWFzayIsImI3IiwiYjYiLCJiNSIsInREYXRhIiwiZ2V0T3JDcmVhdGVJbmplY3RhYmxlIiwiYmxvb21IYXNoIiwiYmxvb21IYXNoQml0T3JGYWN0b3J5IiwidG9rZW5JZCIsInNhdmVQcmV2aW91c09yUGFyZW50VE5vZGUiLCJzYXZlTFZpZXciLCJOb2RlSW5qZWN0b3IiLCJwcmV2aW91c1RWaWV3IiwiaG9zdFRFbGVtZW50Tm9kZSIsInNob3VsZFNlYXJjaFBhcmVudCIsImJsb29tSGFzVG9rZW4iLCJzZWFyY2hUb2tlbnNPbkluamVjdG9yIiwiTk9UX0ZPVU5EIiwibW9kdWxlSW5qZWN0b3IiLCJwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uIiwiY3VycmVudFRWaWV3IiwiaW5qZWN0YWJsZUlkeCIsImxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIiLCJnZXROb2RlSW5qZWN0YWJsZSIsImNhbkFjY2Vzc1ZpZXdQcm92aWRlcnMiLCJpc0hvc3RTcGVjaWFsQ2FzZSIsIm5vZGVQcm92aWRlckluZGV4ZXMiLCJwcm92aWRlckluZGV4ZXMiLCJ0SW5qZWN0YWJsZXMiLCJpbmplY3RhYmxlc1N0YXJ0IiwiZGlyZWN0aXZlc1N0YXJ0IiwiY3B0Vmlld1Byb3ZpZGVyc0NvdW50IiwiZW5kSW5kZXgiLCJwcm92aWRlclRva2VuT3JEZWYiLCJkaXJEZWYiLCJsRGF0YSIsImlzRmFjdG9yeSIsInByZXZpb3VzSW5jbHVkZVZpZXdQcm92aWRlcnMiLCJpbmplY3RvclZpZXciLCJpc0ZpcnN0SG9zdFROb2RlIiwiX3ROb2RlIiwiX2xWaWV3IiwiZ2V0RGVidWdDb250ZXh0IiwiZ2V0T3JpZ2luYWxFcnJvciIsImRlZmF1bHRFcnJvckxvZ2dlciIsImNvbnNvbGUiLCJFcnJvckhhbmRsZXIiLCJfY29uc29sZSIsImhhbmRsZUVycm9yIiwiX2ZpbmRPcmlnaW5hbEVycm9yIiwiX2ZpbmRDb250ZXh0IiwiZXJyb3JMb2dnZXIiLCJnZXRFcnJvckxvZ2dlciIsIl9kZXZNb2RlIiwiX3J1bk1vZGVMb2NrZWQiLCJpc0Rldk1vZGUiLCJlbmFibGVQcm9kTW9kZSIsIkluZXJ0Qm9keUhlbHBlciIsImRlZmF1bHREb2MiLCJpbmVydERvY3VtZW50IiwiaW1wbGVtZW50YXRpb24iLCJjcmVhdGVIVE1MRG9jdW1lbnQiLCJpbmVydEJvZHlFbGVtZW50IiwiYm9keSIsImluZXJ0SHRtbCIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsImlubmVySFRNTCIsInF1ZXJ5U2VsZWN0b3IiLCJpc0RPTVBhcnNlckF2YWlsYWJsZSIsIkRPTVBhcnNlciIsImdldEluZXJ0Qm9keUVsZW1lbnQiLCJnZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlciIsImdldEluZXJ0Qm9keUVsZW1lbnRfSW5lcnREb2N1bWVudCIsImdldEluZXJ0Qm9keUVsZW1lbnRfWEhSIiwiaHRtbCIsImVuY29kZVVSSSIsInhociIsIlhNTEh0dHBSZXF1ZXN0IiwicmVzcG9uc2VUeXBlIiwib3BlbiIsInNlbmQiLCJyZXNwb25zZSIsInJlbW92ZUNoaWxkIiwicGFyc2VGcm9tU3RyaW5nIiwidGVtcGxhdGVFbCIsImRvY3VtZW50TW9kZSIsInN0cmlwQ3VzdG9tTnNBdHRycyIsImVsIiwiZWxBdHRycyIsImF0dHJpYnV0ZXMiLCJhdHRyTmFtZSIsIml0ZW0iLCJyZW1vdmVBdHRyaWJ1dGUiLCJjaGlsZE5vZGUiLCJub2RlVHlwZSIsIkVMRU1FTlRfTk9ERSIsIm5leHRTaWJsaW5nIiwiU0FGRV9VUkxfUEFUVEVSTiIsIkRBVEFfVVJMX1BBVFRFUk4iLCJfc2FuaXRpemVVcmwiLCJ1cmwiLCJtYXRjaCIsIndhcm4iLCJzYW5pdGl6ZVNyY3NldCIsInNyY3NldCIsInNwbGl0IiwidHJpbSIsInRhZ1NldCIsInRhZ3MiLCJlXzEiLCJfYiIsIl9jIiwiZV8xXzEiLCJyZXR1cm4iLCJtZXJnZSIsImVfMiIsInNldHMiLCJzZXRzXzEiLCJzZXRzXzFfMSIsImVfMl8xIiwiaW5lcnRCb2R5SGVscGVyIiwiU2VjdXJpdHlDb250ZXh0IiwiVk9JRF9FTEVNRU5UUyIsIk9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMiLCJPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyIsIk9QVElPTkFMX0VORF9UQUdfRUxFTUVOVFMiLCJCTE9DS19FTEVNRU5UUyIsIklOTElORV9FTEVNRU5UUyIsIlZBTElEX0VMRU1FTlRTIiwiVVJJX0FUVFJTIiwiU1JDU0VUX0FUVFJTIiwiSFRNTF9BVFRSUyIsIkFSSUFfQVRUUlMiLCJWQUxJRF9BVFRSUyIsIlNLSVBfVFJBVkVSU0lOR19DT05URU5UX0lGX0lOVkFMSURfRUxFTUVOVFMiLCJTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIiLCJzYW5pdGl6ZWRTb21ldGhpbmciLCJidWYiLCJzYW5pdGl6ZUNoaWxkcmVuIiwiY3VycmVudCIsInRyYXZlcnNlQ29udGVudCIsInN0YXJ0RWxlbWVudCIsIlRFWFRfTk9ERSIsImNoYXJzIiwibm9kZVZhbHVlIiwiZW5kRWxlbWVudCIsImNoZWNrQ2xvYmJlcmVkRWxlbWVudCIsInRhZ05hbWUiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwiZWxBdHRyIiwibG93ZXIiLCJlbmNvZGVFbnRpdGllcyIsIm5leHROb2RlIiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkiLCJvdXRlckhUTUwiLCJTVVJST0dBVEVfUEFJUl9SRUdFWFAiLCJOT05fQUxQSEFOVU1FUklDX1JFR0VYUCIsIl9zYW5pdGl6ZUh0bWwiLCJ1bnNhZmVIdG1sSW5wdXQiLCJ1bnNhZmVIdG1sIiwibVhTU0F0dGVtcHRzIiwicGFyc2VkSHRtbCIsInNhZmVIdG1sIiwiZ2V0VGVtcGxhdGVDb250ZW50IiwiaXNUZW1wbGF0ZUVsZW1lbnQiLCJjb250ZW50IiwiU2FuaXRpemVyIiwiU0FGRV9TVFlMRV9WQUxVRSIsIlJlZ0V4cCIsIlVSTF9SRSIsIl9zYW5pdGl6ZVN0eWxlIiwidXJsTWF0Y2giLCJoYXNCYWxhbmNlZFF1b3RlcyIsIm91dHNpZGVTaW5nbGUiLCJvdXRzaWRlRG91YmxlIiwibm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZSIsImNhbWVsQ2FzZVRvRGFzaENhc2UiLCJpbnB1dCIsIkNBTUVMX0NBU0VfUkVHRVhQIiwibm9ybWFsaXplRGVidWdCaW5kaW5nVmFsdWUiLCJFTEVNRU5UX01BUktFUiIsIm1hcmtlciIsIkNPTU1FTlRfTUFSS0VSIiwiYXR0YWNoRGVidWdPYmplY3QiLCJkZWJ1ZyIsInRvRGVidWciLCJ0b0h0bWwiLCJpbmNsdWRlQ2hpbGRyZW4iLCJpc1RleHROb2RlIiwidGV4dENvbnRlbnQiLCJMVmlld0RlYnVnIiwiX3Jhd19sVmlldyIsIl9fcmF3X19mbGFnc19fIiwiY3JlYXRpb25Nb2RlIiwiZmlyc3RWaWV3UGFzcyIsImNoZWNrQWx3YXlzIiwiZGlydHkiLCJhdHRhY2hlZCIsImRlc3Ryb3llZCIsImlzUm9vdCIsImluZGV4V2l0aGluSW5pdFBoYXNlIiwidG9EZWJ1Z05vZGVzIiwiZGVidWdOb2RlcyIsInROb2RlQ3Vyc29yIiwicmF3VmFsdWUiLCJjb21wb25lbnRMVmlld0RlYnVnIiwicmVhZExWaWV3VmFsdWUiLCJub2RlcyIsImNsZWFudXAiLCJyZW5kZXJlckZhY3RvcnkiLCJjaGlsZEhlYWQiLCJjaGlsZFRhaWwiLCJkZWNsYXJhdGlvblZpZXciLCJxdWVyaWVzIiwidEhvc3QiLCJiaW5kaW5nSW5kZXgiLCJjaGlsZFZpZXdzIiwiX19vdGhlcl9fIiwiTENvbnRhaW5lckRlYnVnIiwiX3Jhd19sQ29udGFpbmVyIiwiSTE4TkRlYnVnSXRlbSIsIl9fcmF3X29wQ29kZSIsIkkxOG5NdXRhdGVPcENvZGVzRGVidWciLCJfX3Jhd19vcENvZGVzIiwiX19sVmlldyIsInJlc3VsdHMiLCJvcENvZGUiLCJjb21tZW50VmFsdWUiLCJjb2RlIiwiSTE4blVwZGF0ZU9wQ29kZXNEZWJ1ZyIsImljdXMiLCJjaGVja0JpdCIsInNraXBDb2RlcyIsInRJY3VJbmRleCIsInRJY3UiLCJzYW5pdGl6ZUZuIiwiYXR0clZhbHVlIiwiTk9fQ0hBTkdFIiwiZW5xdWV1ZUhvc3RJbnN0cnVjdGlvbiIsInByaW9yaXR5IiwiaW5zdHJ1Y3Rpb25GbiIsImluc3RydWN0aW9uRm5BcmdzIiwiYnVmZmVyIiwiZmluZE5leHRJbnNlcnRpb25JbmRleCIsIkJvdW5kUGxheWVyRmFjdG9yeSIsInJlbmRlckluaXRpYWxDbGFzc2VzIiwic2V0Q2xhc3MiLCJyZW5kZXJJbml0aWFsU3R5bGVzIiwic2V0U3R5bGUiLCJ1cGRhdGVDb250ZXh0V2l0aEJpbmRpbmdzIiwiY2xhc3NCaW5kaW5nTmFtZXMiLCJzdHlsZUJpbmRpbmdOYW1lcyIsImZpbmRPclBhdGNoRGlyZWN0aXZlSW50b1JlZ2lzdHJ5Iiwic3RhdGljTW9kZU9ubHkiLCJzaW5nbGVQcm9wU3RhcnRQb3NpdGlvbiIsInNpbmdsZVByb3BzU3RhcnRJbmRleCIsImh5cGhlbmF0ZUVudHJpZXMiLCJlbnRyaWVzIiwibmV3RW50cmllcyIsImh5cGhlbmF0ZSIsInNpbmdsZVByb3BPZmZzZXRWYWx1ZXMiLCJ0b3RhbEN1cnJlbnRDbGFzc0JpbmRpbmdzIiwidG90YWxDdXJyZW50U3R5bGVCaW5kaW5ncyIsImNhY2hlZENsYXNzTWFwVmFsdWVzIiwiY2FjaGVkU3R5bGVNYXBWYWx1ZXMiLCJzdHlsZXNPZmZzZXQiLCJzaW5nbGVDbGFzc2VzU3RhcnRJbmRleCIsIm11bHRpU3R5bGVzU3RhcnRJbmRleCIsIm11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXgiLCJjdXJyZW50U2luZ2xlUHJvcHNMZW5ndGgiLCJpbnNlcnRpb25PZmZzZXQiLCJmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzIiwiaV8xIiwibmFtZV8xIiwic2luZ2xlUHJvcEluZGV4IiwiZ2V0TWF0Y2hpbmdCaW5kaW5nSW5kZXgiLCJmaWx0ZXJlZENsYXNzQmluZGluZ05hbWVzIiwiaV8yIiwibmFtZV8yIiwidG90YWxTdHlsZXMiLCJ0b3RhbENsYXNzZXMiLCJzdGFydCIsInRvdGFsTmV3RW50cmllcyIsImlfMyIsImlzTXVsdGlCYXNlZCIsImlzQ2xhc3NCYXNlZCIsImZsYWciLCJnZXRQb2ludGVycyIsInN0YXRpY0luZGV4IiwiZ2V0SW5pdGlhbEluZGV4Iiwic2luZ2xlT3JNdWx0aUluZGV4IiwiZ2V0TXVsdGlPclNpbmdsZUluZGV4Iiwic2V0RmxhZyIsInBvaW50ZXJzIiwiaV80IiwiaV81IiwiaV82IiwiZW50cnlJc0NsYXNzQmFzZWQiLCJhZGp1c3RlZEluZGV4IiwibXVsdGlJbmRleCIsInNpbmdsZUluZGV4IiwiaW5pdGlhbFZhbHVlc1RvTG9va3VwIiwiaW5kZXhGb3JJbml0aWFsIiwiZ2V0SW5pdGlhbFN0eWxpbmdWYWx1ZXNJbmRleE9mIiwiYWRkT3JVcGRhdGVTdGF0aWNTdHlsZSIsImluaXRpYWxGbGFnIiwicHJlcGFyZUluaXRpYWxGbGFnIiwic2V0UHJvcCIsInNldFZhbHVlIiwic2V0UGxheWVyQnVpbGRlckluZGV4IiwibmV3U3R5bGVzU3BhY2VBbGxvY2F0aW9uU2l6ZSIsIm5ld0NsYXNzZXNTcGFjZUFsbG9jYXRpb25TaXplIiwiZGlyZWN0aXZlTXVsdGlTdHlsZXNTdGFydEluZGV4IiwiY2FjaGVkU3R5bGVNYXBJbmRleCIsInJlZ2lzdGVyTXVsdGlNYXBFbnRyeSIsImlfNyIsImRpcmVjdGl2ZU11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXgiLCJjYWNoZWRDbGFzc01hcEluZGV4IiwiaV84IiwiYmluZGluZ05hbWUiLCJnZXRQcm9wIiwidXBkYXRlU3R5bGluZ01hcCIsImNsYXNzZXNJbnB1dCIsInN0eWxlc0lucHV0IiwiYXNzZXJ0VmFsaWREaXJlY3RpdmVJbmRleCIsImlnbm9yZUFsbENsYXNzVXBkYXRlcyIsImlzTXVsdGlWYWx1ZUNhY2hlSGl0IiwiaWdub3JlQWxsU3R5bGVVcGRhdGVzIiwicmVhZENhY2hlZE1hcFZhbHVlIiwiY2xhc3Nlc1BsYXllckJ1aWxkZXIiLCJDbGFzc0FuZFN0eWxlUGxheWVyQnVpbGRlciIsInN0eWxlc1BsYXllckJ1aWxkZXIiLCJjbGFzc2VzVmFsdWUiLCJzdHlsZXNWYWx1ZSIsImNsYXNzTmFtZXMiLCJhcHBseUFsbENsYXNzZXMiLCJwbGF5ZXJCdWlsZGVyc0FyZURpcnR5IiwiY2xhc3Nlc1BsYXllckJ1aWxkZXJJbmRleCIsImhhc1BsYXllckJ1aWxkZXJDaGFuZ2VkIiwic2V0UGxheWVyQnVpbGRlciIsInN0eWxlc1BsYXllckJ1aWxkZXJJbmRleCIsImdldE11bHRpU3R5bGVzU3RhcnRJbmRleCIsImdldE11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXgiLCJtdWx0aUNsYXNzZXNFbmRJbmRleCIsInBhdGNoU3R5bGluZ01hcEludG9Db250ZXh0Iiwic2V0Q29udGV4dFBsYXllcnNEaXJ0eSIsInBsYXllckJ1aWxkZXJJbmRleCIsImN0eFN0YXJ0IiwiY3R4RW5kIiwiY2FjaGVWYWx1ZSIsImNhY2hlSW5kZXgiLCJjYWNoZWRWYWx1ZXMiLCJvd25lcnNoaXBWYWx1ZXNTdGFydEluZGV4IiwiZXhpc3RpbmdDYWNoZWRWYWx1ZSIsImV4aXN0aW5nQ2FjaGVkVmFsdWVDb3VudCIsInZhbHVlc0VudHJ5U2hhcGVDaGFuZ2UiLCJ0b3RhbFVuaXF1ZVZhbHVlcyIsInRvdGFsTmV3QWxsb2NhdGVkU2xvdHMiLCJhcHBseUFsbFByb3BzIiwiY3R4SW5kZXgiLCJ0b3RhbFJlbWFpbmluZ1Byb3BlcnRpZXMiLCJjdXJyZW50UHJvcCIsIm5vcm1hbGl6ZWRQcm9wIiwibWFwUHJvcCIsImN1cnJlbnRWYWx1ZSIsImdldFZhbHVlIiwiY3VycmVudERpcmVjdGl2ZUluZGV4IiwiZ2V0RGlyZWN0aXZlSW5kZXhGcm9tRW50cnkiLCJjdXJyZW50RmxhZyIsImhhc1ZhbHVlQ2hhbmdlZCIsImFsbG93VmFsdWVDaGFuZ2UiLCJoYXNJbml0aWFsVmFsdWVDaGFuZ2VkIiwic2V0RGlydHkiLCJnZXRTdHlsZVNhbml0aXplciIsInByb3BlcnRpZXNMb29wIiwiaXNJbnNpZGVPd25lcnNoaXBBcmVhIiwiZGlzdGFudEN0eERpcmVjdGl2ZUluZGV4IiwiZGlzdGFudEN0eFBsYXllckJ1aWxkZXJJbmRleCIsImdldFBsYXllckJ1aWxkZXJJbmRleCIsImRpc3RhbnRDdHhWYWx1ZSIsImRpc3RhbnRDdHhGbGFnIiwic3dhcE11bHRpQ29udGV4dEVudHJpZXMiLCJpbnNlcnROZXdNdWx0aVByb3BlcnR5IiwiY3R4VmFsdWUiLCJjdHhGbGFnIiwidXBkYXRlQ2FjaGVkTWFwVmFsdWUiLCJzdGFydFBvc2l0aW9uIiwiZW5kUG9zaXRpb24iLCJ0b3RhbFZhbHVlcyIsImRpcnR5RnV0dXJlVmFsdWVzIiwibmV4dFN0YXJ0UG9zaXRpb24iLCJ0b3RhbFN0eWxpbmdFbnRyaWVzIiwiY2xhc3NDYWNoZSIsImNsYXNzZXNTdGFydFBvc2l0aW9uIiwiZGlmZkluU3RhcnRQb3NpdGlvbiIsInNldENvbnRleHREaXJ0eSIsInJlbmRlclN0eWxpbmciLCJyb290T3JWaWV3IiwiaXNGaXJzdFJlbmRlciIsImNsYXNzZXNTdG9yZSIsInN0eWxlc1N0b3JlIiwidG90YWxQbGF5ZXJzUXVldWVkIiwiYWxsb3dGbHVzaCIsImZsdXNoUXVldWUiLCJpc0NvbnRleHREaXJ0eSIsImlzRGlydHkiLCJmbHVzaFBsYXllckJ1aWxkZXJzIiwibXVsdGlTdGFydEluZGV4IiwiZGlyZWN0aXZlSW5kZXhfMSIsInBsYXllckJ1aWxkZXIiLCJnZXRQbGF5ZXJCdWlsZGVyIiwidmFsdWVUb0FwcGx5IiwidmFsdWVFeGlzdHMiLCJnZXRJbml0aWFsVmFsdWUiLCJwbGF5ZXJzU3RhcnRJbmRleCIsImJ1aWxkZXIiLCJwbGF5ZXJJbnNlcnRpb25JbmRleCIsIm9sZFBsYXllciIsImJ1aWxkUGxheWVyIiwic3RvcmUiLCJEYXNoQ2FzZSIsInN0eWxlIiwic2V0UHJvcGVydHkiLCJyZW1vdmVTdHlsZSIsInJlbW92ZVByb3BlcnR5IiwiY2xhc3NOYW1lIiwiYWRkIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInJlbW92ZSIsImlzRGlydHlZZXMiLCJpc0NsYXNzQmFzZWRWYWx1ZSIsImlzU2FuaXRpemFibGUiLCJjb25maWdGbGFnIiwiZHluYW1pY0luZGV4IiwiaW5zZXJ0aW9uSW5kZXgiLCJkaXJlY3RpdmVPd25lclBvaW50ZXJzIiwicGxheWVySW5kZXgiLCJpbmRleEEiLCJpbmRleEIiLCJ0bXBWYWx1ZSIsInRtcFByb3AiLCJ0bXBGbGFnIiwidG1wUGxheWVyQnVpbGRlckluZGV4IiwidG1wRGlyZWN0aXZlSW5kZXgiLCJmbGFnQSIsImZsYWdCIiwic2luZ2xlSW5kZXhBIiwiX2ZsYWciLCJzaW5nbGVJbmRleEIiLCJjbGFzc0Jhc2VkIiwiZG9TaGlmdCIsInVwZGF0ZVNpbmdsZVBvaW50ZXJWYWx1ZXMiLCJpbmRleFN0YXJ0UG9zaXRpb24iLCJpbml0aWFsSW5kZXhGb3JTaW5nbGUiLCJpbml0aWFsSW5kZXgiLCJuZXdWYWx1ZSIsImluaXRpYWxWYWx1ZSIsImEiLCJfZWxlbWVudCIsIl90eXBlIiwiX3ZhbHVlcyIsIl9kaXJ0eSIsIl9mYWN0b3J5IiwiY3VycmVudFBsYXllciIsImtleVZhbHVlcyIsImRpcnMiLCJjdXJyZW50RGlyZWN0aXZlT3duZXIiLCJuZXdEaXJlY3RpdmVPd25lciIsImNvdW50Iiwic3RhdGljU3R5bGVzIiwiZGlyZWN0aXZlT3duZXJJbmRleCIsIl9DTEVBTl9QUk9NSVNFIiwiUHJvbWlzZSIsInJlZnJlc2hEZXNjZW5kYW50Vmlld3MiLCJyZWZyZXNoRHluYW1pY0VtYmVkZGVkVmlld3MiLCJjb250YWluZXIiLCJkeW5hbWljVmlld0RhdGEiLCJyZW5kZXJFbWJlZGRlZFRlbXBsYXRlIiwicmVmcmVzaENvbnRlbnRRdWVyaWVzIiwic2V0SG9zdEJpbmRpbmdzIiwic2VsZWN0ZWRJbmRleCIsImV4cGFuZG9JbnN0cnVjdGlvbnMiLCJiaW5kaW5nUm9vdEluZGV4IiwiZXhwYW5kb1N0YXJ0SW5kZXgiLCJjdXJyZW50RWxlbWVudEluZGV4IiwiaW5zdHJ1Y3Rpb24iLCJwcm92aWRlckNvdW50IiwiaG9zdEN0eCIsInN0YXRpY0NvbnRlbnRRdWVyaWVzIiwicmVmcmVzaENoaWxkQ29tcG9uZW50cyIsImNvbXBvbmVudFJlZnJlc2giLCJkaXJlY3RpdmVEZWZJZHgiLCJlbGVtZW50Q3JlYXRlIiwib3ZlcnJpZGRlblJlbmRlcmVyIiwicmVuZGVyZXJUb1VzZSIsIm5hbWVzcGFjZSIsImdldE5hbWVzcGFjZSIsImNyZWF0ZUVsZW1lbnROUyIsImNyZWF0ZUxWaWV3IiwiaG9zdCIsInRIb3N0Tm9kZSIsImF0dGFjaExWaWV3RGVidWciLCJjcmVhdGVOb2RlQXRJbmRleCIsImF0dHJzIiwidFBhcmVudE5vZGUiLCJjcmVhdGVUTm9kZSIsImFzc2lnblRWaWV3Tm9kZVRvTFZpZXciLCJ2aWV3VG9SZW5kZXIiLCJfaXNQYXJlbnQiLCJfcHJldmlvdXNPclBhcmVudFROb2RlIiwidGlja1Jvb3RDb250ZXh0IiwiZXhlY3V0ZVRlbXBsYXRlIiwiZ2V0UmVuZGVyRmxhZ3MiLCJyZW5kZXJDb21wb25lbnRPclRlbXBsYXRlIiwidGVtcGxhdGVGbiIsIm5vcm1hbEV4ZWN1dGlvblBhdGgiLCJjcmVhdGlvbk1vZGVJc0FjdGl2ZSIsImJlZ2luIiwicmYiLCJwcmV2U2VsZWN0ZWRJbmRleCIsImdldE9yQ3JlYXRlVFZpZXciLCJuZ1ByaXZhdGVEYXRhIiwiY3JlYXRlVFZpZXciLCJ2aWV3SW5kZXgiLCJpbml0aWFsVmlld0xlbmd0aCIsImNyZWF0ZVZpZXdCbHVlcHJpbnQiLCJ2aWV3UXVlcnlTdGFydEluZGV4Iiwic3RhdGljVmlld1F1ZXJpZXMiLCJwaXBlUmVnaXN0cnkiLCJjcmVhdGVFcnJvciIsImxvY2F0ZUhvc3RFbGVtZW50IiwiZWxlbWVudE9yU2VsZWN0b3IiLCJkZWZhdWx0UmVuZGVyZXIiLCJyTm9kZSIsInNlbGVjdFJvb3RFbGVtZW50IiwidFBhcmVudCIsInByb3BlcnR5TWV0YWRhdGFTdGFydEluZGV4IiwicHJvcGVydHlNZXRhZGF0YUVuZEluZGV4IiwibG9jYWxOYW1lcyIsImluaXRpYWxJbnB1dHMiLCJ0Vmlld3MiLCJwcm9qZWN0aW9uTmV4dCIsInByb2plY3Rpb24iLCJvbkVsZW1lbnRDcmVhdGlvbkZucyIsImludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlIiwiZXhwYW5kbyIsInByZXZpb3VzRXhwYW5kb0xlbmd0aCIsImdlbmVyYXRlRXhwYW5kb0luc3RydWN0aW9uQmxvY2siLCJkaXJlY3RpdmVDb3VudCIsInByb3ZpZGVyU3RhcnRJbmRleCIsInBvc3RQcm9jZXNzQmFzZURpcmVjdGl2ZSIsInF1ZXVlQ29tcG9uZW50SW5kZXhGb3JDaGVjayIsImluaXROb2RlRmxhZ3MiLCJudW1iZXJPZkRpcmVjdGl2ZXMiLCJiYXNlUmVzb2x2ZURpcmVjdGl2ZSIsImRpcmVjdGl2ZUZhY3RvcnkiLCJub2RlSW5qZWN0b3JGYWN0b3J5IiwiYWRqdXN0ZWRFbGVtZW50SW5kZXgiLCJ2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yIiwic3luY1ZpZXdXaXRoQmx1ZXByaW50IiwiY29tcG9uZW50VmlldyIsImNvbXBvbmVudFRWaWV3IiwiY2hlY2tWaWV3IiwiYWRkVG9WaWV3VHJlZSIsImxWaWV3T3JMQ29udGFpbmVyIiwibWFya1ZpZXdEaXJ0eSIsInBhcmVudF8yIiwic2NoZWR1bGVUaWNrIiwicmVzXzEiLCJub3RoaW5nU2NoZWR1bGVkIiwiY2xlYW4iLCJzY2hlZHVsZXIiLCJyb290Q29tcG9uZW50IiwiZGV0ZWN0Q2hhbmdlc0ludGVybmFsIiwiZGV0ZWN0Q2hhbmdlc0luUm9vdFZpZXciLCJob3N0VFZpZXciLCJleGVjdXRlVmlld1F1ZXJ5Rm4iLCJDTEVBTl9QUk9NSVNFIiwiZ2V0Q2xlYW51cCIsImdldFRWaWV3Q2xlYW51cCIsImVycm9ySGFuZGxlciIsImFwcGx5T25DcmVhdGVJbnN0cnVjdGlvbnMiLCJmbnMiLCJnZXRMQ29udGFpbmVyIiwiZW1iZWRkZWRWaWV3IiwicHJvamVjdGlvbk5vZGVTdGFjayIsIndhbGtUTm9kZVRyZWUiLCJ2aWV3VG9XYWxrIiwiYWN0aW9uIiwicmVuZGVyUGFyZW50IiwiYmVmb3JlTm9kZSIsInByb2plY3Rpb25Ob2RlSW5kZXgiLCJuZXh0VE5vZGUiLCJleGVjdXRlTm9kZUFjdGlvbiIsIm5vZGVPckNvbnRhaW5lciIsImxDb250YWluZXIiLCJoZWFkIiwiaGVhZF8xIiwiaGVhZF8xXzEiLCJuYXRpdmVJbnNlcnRCZWZvcmUiLCJuYXRpdmVSZW1vdmVOb2RlIiwiZGVzdHJveU5vZGUiLCJpbnNlcnRWaWV3Iiwidmlld3MiLCJkZXN0cm95TFZpZXciLCJkZXN0cm95Vmlld1RyZWUiLCJjbGVhblVwVmlldyIsImdldFBhcmVudFN0YXRlIiwiZXhlY3V0ZU9uRGVzdHJveXMiLCJyZW1vdmVMaXN0ZW5lcnMiLCJ0Q2xlYW51cCIsImxDbGVhbnVwIiwiaWR4T3JUYXJnZXRHZXR0ZXIiLCJsaXN0ZW5lciIsInVzZUNhcHR1cmVPclN1YklkeCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ1bnN1YnNjcmliZSIsInJlbW92ZVZpZXciLCJpbnNlcnRCZWZvcmUiLCJuYXRpdmVQYXJlbnROb2RlIiwiaXNIb3N0RWxlbWVudCIsIm5hdGl2ZVBhcmVudCIsIm5hdGl2ZVJlbW92ZUNoaWxkIiwiybXJtWVsZW1lbnRIb3N0U3R5bGluZyIsImRpcmVjdGl2ZVN0eWxpbmdJbmRleCIsImdldEFjdGl2ZURpcmVjdGl2ZVN0eWxpbmdJbmRleCIsImluaXRFbGVtZW50U3R5bGluZyIsInJlZ2lzdGVySG9zdERpcmVjdGl2ZSIsIsm1ybVlbGVtZW50SG9zdFN0eWxpbmdNYXAiLCJjbGFzc2VzIiwiZ2V0U3R5bGluZ0NvbnRleHQiLCLJtcm1ZWxlbWVudEhvc3RTdHlsaW5nQXBwbHkiLCJlbGVtZW50U3R5bGluZ0FwcGx5SW50ZXJuYWwiLCJnZXRBY3RpdmVEaXJlY3RpdmVJZCIsImdldEFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aCIsImdldENhY2hlZFN0eWxpbmdDb250ZXh0IiwiaXNQcm9taXNlIiwidGhlbiIsImlzT2JzZXJ2YWJsZSIsInN1YnNjcmliZSIsIl9zeW1ib2xJdGVyYXRvciIsImdldFN5bWJvbEl0ZXJhdG9yIiwiU3ltYm9sXzEiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwibG9vc2VJZGVudGljYWwiLCJpc05hTiIsImRldk1vZGVFcXVhbCIsImlzTGlzdExpa2VJdGVyYWJsZUEiLCJpc0xpc3RMaWtlSXRlcmFibGUiLCJpc0xpc3RMaWtlSXRlcmFibGVCIiwiYXJlSXRlcmFibGVzRXF1YWwiLCJjb21wYXJhdG9yIiwiaXRlcmF0b3IxIiwiaXRlcmF0b3IyIiwiaXRlbTEiLCJpdGVtMiIsIldyYXBwZWRWYWx1ZSIsIndyYXBwZWQiLCJ3cmFwIiwidW53cmFwIiwiaXNXcmFwcGVkIiwiaXNKc09iamVjdCIsImdldENvbXBvbmVudCIsImxvYWRMQ29udGV4dEZyb21Ob2RlIiwiZ2V0Q29tcG9uZW50QXROb2RlSW5kZXgiLCJnZXRDb250ZXh0IiwiZ2V0Vmlld0NvbXBvbmVudCIsImxvYWRMQ29udGV4dCIsImdldEluamVjdG9yIiwidGhyb3dPbk5vdEZvdW5kIiwiZ2V0TG9jYWxSZWZzIiwiZGlzY292ZXJMb2NhbFJlZnMiLCJsb2NhbEluZGV4IiwiaXNCcm93c2VyRXZlbnRzIiwidXNlQ2FwdHVyZSIsImdldExpc3RlbmVycyIsImxpc3RlbmVycyIsImZpcnN0UGFyYW0iLCJzZWNvbmRQYXJhbSIsImxpc3RlbmVyRWxlbWVudCIsImNhbGxiYWNrIiwidXNlQ2FwdHVyZU9ySW5keCIsInNvcnQiLCJzb3J0TGlzdGVuZXJzIiwiY3JlYXRlUm9vdENvbXBvbmVudFZpZXciLCJyZXNldENvbXBvbmVudFN0YXRlIiwiY3JlYXRlUm9vdENvbXBvbmVudCIsImNvbXBvbmVudERlZiIsImhvc3RGZWF0dXJlcyIsImluc3RhbnRpYXRlUm9vdENvbXBvbmVudCIsImNyZWF0ZVJvb3RDb250ZXh0IiwiTGlmZWN5Y2xlSG9va3NGZWF0dXJlIiwicm9vdFRWaWV3IiwiZGlySW5kZXgiLCJTaW1wbGVDaGFuZ2UiLCJwcmV2aW91c1ZhbHVlIiwiZmlyc3RDaGFuZ2UiLCJpc0ZpcnN0Q2hhbmdlIiwiQVBQX1JPT1QiLCJOT1RfWUVUIiwiQ0lSQ1VMQVIkMSIsIkVNUFRZX0FSUkFZJDIiLCJOVUxMX0lOSkVDVE9SIiwiZ2V0TnVsbEluamVjdG9yIiwiUjNJbmplY3RvciIsImFkZGl0aW9uYWxQcm92aWRlcnMiLCJpbmplY3RvckRlZlR5cGVzIiwiX2Rlc3Ryb3llZCIsImRlZHVwU3RhY2siLCJkZWVwRm9yRWFjaCIsImluamVjdG9yRGVmIiwicHJvY2Vzc0luamVjdG9yVHlwZSIsInByb2Nlc3NQcm92aWRlciIsIm1ha2VSZWNvcmQiLCJpc1Jvb3RJbmplY3RvciIsImRlZlR5cGUiLCJhc3NlcnROb3REZXN0cm95ZWQiLCJzZXJ2aWNlIiwiY2xlYXIiLCJwcmV2aW91c0luamVjdG9yIiwiY291bGRCZUluamVjdGFibGVUeXBlIiwiaW5qZWN0YWJsZURlZkluU2NvcGUiLCJpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkiLCJoeWRyYXRlIiwiZGVmT3JXcmFwcGVkRGVmIiwicGFyZW50cyIsIm5nTW9kdWxlIiwiZGVmTmFtZSIsImlzRHVwbGljYXRlIiwiaW1wb3J0ZWQiLCJwb3AiLCJkZWZQcm92aWRlcnMiLCJpbmplY3RvclR5cGVfMSIsIm5nTW9kdWxlVHlwZSIsImlzVHlwZVByb3ZpZGVyIiwicHJvdmlkZXJUb1JlY29yZCIsInByb3ZpZGVyVG9GYWN0b3J5IiwiaXNWYWx1ZVByb3ZpZGVyIiwibXVsdGlSZWNvcmRfMSIsImhhc09uRGVzdHJveSIsInBhcmFtTGVuZ3RoIiwiaXNFeGlzdGluZ1Byb3ZpZGVyIiwiaXNGYWN0b3J5UHJvdmlkZXIiLCJjbGFzc1JlZl8xIiwibmdNb2R1bGVEZXRhaWwiLCJoYXNEZXBzIiwiQ29tcG9uZW50UmVmIiwiQ29tcG9uZW50RmFjdG9yeSIsIm5vQ29tcG9uZW50RmFjdG9yeUVycm9yIiwiRVJST1JfQ09NUE9ORU5UIiwiUjNFbGVtZW50UmVmIiwiUjNUZW1wbGF0ZVJlZiIsIl9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIiwicmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkiLCJDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIiLCJDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIiwiZmFjdG9yaWVzIiwiX25nTW9kdWxlIiwiX2ZhY3RvcmllcyIsImNvbXBvbmVudFR5cGUiLCJDb21wb25lbnRGYWN0b3J5Qm91bmRUb01vZHVsZSIsIl9zdXBlciIsInByb2plY3RhYmxlTm9kZXMiLCJyb290U2VsZWN0b3JPck5vZGUiLCJOZ01vZHVsZVJlZiIsIk5nTW9kdWxlRmFjdG9yeSIsIlZpZXdSZWYiLCJfY29udGV4dCIsIl9jb21wb25lbnRJbmRleCIsIl9hcHBSZWYiLCJfdmlld0NvbnRhaW5lclJlZiIsIl90Vmlld05vZGUiLCJjb2xsZWN0TmF0aXZlTm9kZXMiLCJwYXJlbnRUTm9kZSIsInROb2RlQ2hpbGQiLCJuYXRpdmVOb2RlIiwiY29tcG9uZW50SG9zdCIsImN1cnJlbnRQcm9qZWN0ZWROb2RlIiwiX2xvb2tVcENvbnRleHQiLCJkZXRhY2hWaWV3IiwiZGV0YWNoIiwic3RvcmVDbGVhbnVwRm4iLCJjbGVhbnVwRm4iLCJtYXJrRm9yQ2hlY2siLCJyZWF0dGFjaCIsImRldGVjdENoYW5nZXMiLCJjaGVja05vQ2hhbmdlcyIsImNoZWNrTm9DaGFuZ2VzSW50ZXJuYWwiLCJhdHRhY2hUb1ZpZXdDb250YWluZXJSZWYiLCJ2Y1JlZiIsImRldGFjaEZyb21BcHBSZWYiLCJyZW5kZXJEZXRhY2hWaWV3IiwiYXR0YWNoVG9BcHBSZWYiLCJhcHBSZWYiLCJSb290Vmlld1JlZiIsIl92aWV3IiwiY2hlY2tOb0NoYW5nZXNJblJvb3RWaWV3IiwiY3JlYXRlRWxlbWVudFJlZiIsIkVsZW1lbnRSZWZUb2tlbiIsIkVsZW1lbnRSZWZfIiwiY3JlYXRlVGVtcGxhdGVSZWYiLCJUZW1wbGF0ZVJlZlRva2VuIiwiVGVtcGxhdGVSZWZfIiwiX2RlY2xhcmF0aW9uUGFyZW50VmlldyIsImVsZW1lbnRSZWYiLCJfdFZpZXciLCJfaG9zdExDb250YWluZXIiLCJfaW5qZWN0b3JJbmRleCIsImNyZWF0ZUVtYmVkZGVkVmlldyIsImN1cnJlbnRRdWVyaWVzIiwiY3JlYXRlRW1iZWRkZWRWaWV3QW5kTm9kZSIsImNyZWF0ZVZpZXciLCJ2aWV3UmVmIiwiaG9zdENvbnRhaW5lciIsIm5vb3AiLCJSZW5kZXJlclN0eWxlRmxhZ3MyIiwiRWxlbWVudFJlZiIsIm5hdGl2ZUVsZW1lbnQiLCJTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWSIsIlJlbmRlcmVyIiwiUmVuZGVyZXJGYWN0b3J5MiIsIlJlbmRlcmVyMiIsIlNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWSIsIlZlcnNpb24iLCJmdWxsIiwibWFqb3IiLCJtaW5vciIsInBhdGNoIiwiVkVSU0lPTiIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkiLCJzdXBwb3J0cyIsInRyYWNrQnlGbiIsIkRlZmF1bHRJdGVyYWJsZURpZmZlciIsInRyYWNrQnlJZGVudGl0eSIsIl9saW5rZWRSZWNvcmRzIiwiX3VubGlua2VkUmVjb3JkcyIsIl9wcmV2aW91c0l0SGVhZCIsIl9pdEhlYWQiLCJfaXRUYWlsIiwiX2FkZGl0aW9uc0hlYWQiLCJfYWRkaXRpb25zVGFpbCIsIl9tb3Zlc0hlYWQiLCJfbW92ZXNUYWlsIiwiX3JlbW92YWxzSGVhZCIsIl9yZW1vdmFsc1RhaWwiLCJfaWRlbnRpdHlDaGFuZ2VzSGVhZCIsIl9pZGVudGl0eUNoYW5nZXNUYWlsIiwiX3RyYWNrQnlGbiIsImZvckVhY2hJdGVtIiwiX25leHQiLCJmb3JFYWNoT3BlcmF0aW9uIiwibmV4dEl0IiwibmV4dFJlbW92ZSIsImFkZFJlbW92ZU9mZnNldCIsIm1vdmVPZmZzZXRzIiwiY3VycmVudEluZGV4IiwiZ2V0UHJldmlvdXNJbmRleCIsImFkalByZXZpb3VzSW5kZXgiLCJfbmV4dFJlbW92ZWQiLCJwcmV2aW91c0luZGV4IiwibG9jYWxNb3ZlUHJldmlvdXNJbmRleCIsImxvY2FsQ3VycmVudEluZGV4Iiwib2Zmc2V0IiwiZm9yRWFjaFByZXZpb3VzSXRlbSIsIl9uZXh0UHJldmlvdXMiLCJmb3JFYWNoQWRkZWRJdGVtIiwiX25leHRBZGRlZCIsImZvckVhY2hNb3ZlZEl0ZW0iLCJfbmV4dE1vdmVkIiwiZm9yRWFjaFJlbW92ZWRJdGVtIiwiZm9yRWFjaElkZW50aXR5Q2hhbmdlIiwiX25leHRJZGVudGl0eUNoYW5nZSIsImRpZmYiLCJjb2xsZWN0aW9uIiwiY2hlY2siLCJfcmVzZXQiLCJpdGVtVHJhY2tCeSIsIm1heUJlRGlydHkiLCJpbmRleF8xIiwidHJhY2tCeUlkIiwiX3ZlcmlmeVJlaW5zZXJ0aW9uIiwiX2FkZElkZW50aXR5Q2hhbmdlIiwiX21pc21hdGNoIiwiaXRlcmF0ZUxpc3RMaWtlIiwiX3RydW5jYXRlIiwibmV4dFJlY29yZCIsInByZXZpb3VzUmVjb3JkIiwiX3ByZXYiLCJfcmVtb3ZlIiwiX21vdmVBZnRlciIsIl9yZWluc2VydEFmdGVyIiwiX2FkZEFmdGVyIiwiSXRlcmFibGVDaGFuZ2VSZWNvcmRfIiwicmVpbnNlcnRSZWNvcmQiLCJfYWRkVG9Nb3ZlcyIsIl9hZGRUb1JlbW92YWxzIiwiX3VubGluayIsInByZXZSZWNvcmQiLCJwcmV2IiwiX3ByZXZSZW1vdmVkIiwiX2luc2VydEFmdGVyIiwiX0R1cGxpY2F0ZU1hcCIsInB1dCIsInRvSW5kZXgiLCJfcHJldkR1cCIsIl9uZXh0RHVwIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IiwiX2hlYWQiLCJfdGFpbCIsImF0T3JBZnRlckluZGV4IiwiZHVwbGljYXRlcyIsInJlY29yZExpc3QiLCJkZWxldGUiLCJtb3ZlT2Zmc2V0IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlciIsIl9tYXBIZWFkIiwiX2FwcGVuZEFmdGVyIiwiX3ByZXZpb3VzTWFwSGVhZCIsIl9jaGFuZ2VzSGVhZCIsIl9jaGFuZ2VzVGFpbCIsImZvckVhY2hDaGFuZ2VkSXRlbSIsIl9uZXh0Q2hhbmdlZCIsIl9mb3JFYWNoIiwiX21heWJlQWRkVG9DaGFuZ2VzIiwiX2dldE9yQ3JlYXRlUmVjb3JkRm9yS2V5IiwiX2luc2VydEJlZm9yZU9yQXBwZW5kIiwiYmVmb3JlIiwicmVjb3JkXzEiLCJLZXlWYWx1ZUNoYW5nZVJlY29yZF8iLCJfYWRkVG9BZGRpdGlvbnMiLCJfYWRkVG9DaGFuZ2VzIiwiSXRlcmFibGVEaWZmZXJzIiwiY29waWVkIiwiZXh0ZW5kIiwiZmluZCIsIml0ZXJhYmxlIiwiZiIsImdldFR5cGVOYW1lRm9yRGVidWdnaW5nIiwiS2V5VmFsdWVEaWZmZXJzIiwia3YiLCJDaGFuZ2VEZXRlY3RvclJlZiIsIlNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUlkiLCJrZXlWYWxEaWZmIiwiaXRlcmFibGVEaWZmIiwiZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyIsImRlZmF1bHRLZXlWYWx1ZURpZmZlcnMiLCJUZW1wbGF0ZVJlZiIsIlNXSVRDSF9URU1QTEFURV9SRUZfRkFDVE9SWSIsIlZpZXdDb250YWluZXJSZWYiLCJTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUlkiLCJleHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yIiwiY3VyclZhbHVlIiwiaXNGaXJzdENoZWNrIiwidmlld0RlYnVnRXJyb3IiLCJlcnIiLCJfYWRkRGVidWdDb250ZXh0IiwibG9nRXJyb3IiLCJ2aWV3RGVzdHJveWVkRXJyb3IiLCJzaGlmdEluaXRTdGF0ZSIsInByaW9ySW5pdFN0YXRlIiwibmV3SW5pdFN0YXRlIiwiaW5pdFN0YXRlIiwiaW5pdEluZGV4Iiwic2hvdWxkQ2FsbExpZmVjeWNsZUluaXRIb29rIiwiYXNUZXh0RGF0YSIsImFzRWxlbWVudERhdGEiLCJhc1Byb3ZpZGVyRGF0YSIsImFzUHVyZUV4cHJlc3Npb25EYXRhIiwiYXNRdWVyeUxpc3QiLCJTZXJ2aWNlcyIsInNldEN1cnJlbnROb2RlIiwiY3JlYXRlUm9vdFZpZXciLCJjcmVhdGVDb21wb25lbnRWaWV3IiwiY3JlYXRlTmdNb2R1bGVSZWYiLCJvdmVycmlkZVByb3ZpZGVyIiwib3ZlcnJpZGVDb21wb25lbnRWaWV3IiwiY2xlYXJPdmVycmlkZXMiLCJjaGVja0FuZFVwZGF0ZVZpZXciLCJjaGVja05vQ2hhbmdlc1ZpZXciLCJkZXN0cm95VmlldyIsInJlc29sdmVEZXAiLCJjcmVhdGVEZWJ1Z0NvbnRleHQiLCJoYW5kbGVFdmVudCIsInVwZGF0ZURpcmVjdGl2ZXMiLCJ1cGRhdGVSZW5kZXJlciIsImRpcnR5UGFyZW50UXVlcmllcyIsIk5PT1AiLCJfdG9rZW5LZXlDYWNoZSIsInRva2VuS2V5IiwidW53cmFwVmFsdWUiLCJub2RlSWR4IiwiYmluZGluZ0lkeCIsImdsb2JhbEJpbmRpbmdJZHgiLCJvbGRWYWx1ZXMiLCJVTkRFRklORURfUkVOREVSRVJfVFlQRV9JRCIsIkVNUFRZX1JFTkRFUkVSX1RZUEVfSUQiLCJjcmVhdGVSZW5kZXJlclR5cGUyIiwiX3JlbmRlckNvbXBDb3VudCQxIiwiY2hlY2tCaW5kaW5nIiwiY2hlY2tBbmRVcGRhdGVCaW5kaW5nIiwiY2hlY2tCaW5kaW5nTm9DaGFuZ2VzIiwiYmluZGluZ3MiLCJtYXJrUGFyZW50Vmlld3NGb3JDaGVjayIsImN1cnJWaWV3Iiwidmlld0NvbnRhaW5lclBhcmVudCIsIm1hcmtQYXJlbnRWaWV3c0ZvckNoZWNrUHJvamVjdGVkVmlld3MiLCJlbmRWaWV3IiwiZGlzcGF0Y2hFdmVudCIsImV2ZW50TmFtZSIsImV2ZW50Iiwicm9vdCIsImRlY2xhcmVkVmlld0NvbnRhaW5lciIsInBhcmVudE5vZGVEZWYiLCJ2aWV3UGFyZW50RWwiLCJyZW5kZXJOb2RlIiwicmVuZGVyRWxlbWVudCIsInJlbmRlclRleHQiLCJpc0NvbXBvbmVudFZpZXciLCJpc0VtYmVkZGVkVmlldyIsImZpbHRlclF1ZXJ5SWQiLCJxdWVyeUlkIiwic3BsaXRNYXRjaGVkUXVlcmllc0RzbCIsIm1hdGNoZWRRdWVyaWVzRHNsIiwibWF0Y2hlZFF1ZXJpZXMiLCJtYXRjaGVkUXVlcnlJZHMiLCJyZWZlcmVuY2VzIiwidmFsdWVUeXBlIiwic3BsaXREZXBzRHNsIiwic291cmNlTmFtZSIsImdldFBhcmVudFJlbmRlckVsZW1lbnQiLCJyZW5kZXJIb3N0IiwiY29tcG9uZW50UmVuZGVyZXJUeXBlIiwiTmF0aXZlIiwiREVGSU5JVElPTl9DQUNIRSIsIldlYWtNYXAiLCJyZXNvbHZlRGVmaW5pdGlvbiIsInZpc2l0Um9vdFJlbmRlck5vZGVzIiwibGFzdFJlbmRlclJvb3ROb2RlIiwidmlzaXRTaWJsaW5nUmVuZGVyTm9kZXMiLCJub2RlRGVmIiwidmlzaXRSZW5kZXJOb2RlIiwiY2hpbGRDb3VudCIsInZpc2l0UHJvamVjdGVkUmVuZGVyTm9kZXMiLCJuZ0NvbnRlbnRJbmRleCIsImNvbXBWaWV3IiwiaG9zdEVsRGVmIiwicHJvamVjdGVkTm9kZXMiLCJleGVjUmVuZGVyTm9kZUFjdGlvbiIsIm5nQ29udGVudCIsInJuIiwiYmluZGluZ0ZsYWdzIiwiZW1iZWRkZWRWaWV3cyIsInZpZXdDb250YWluZXIiLCJfZW1iZWRkZWRWaWV3cyIsIk5TX1BSRUZJWF9SRSIsInNwbGl0TmFtZXNwYWNlIiwiY2FsY0JpbmRpbmdGbGFncyIsImludGVycG9sYXRlIiwidmFsdWVDb3VudCIsImNvbnN0QW5kSW50ZXJwIiwiX3RvU3RyaW5nV2l0aE51bGwiLCJpbmxpbmVJbnRlcnBvbGF0ZSIsImMwIiwiYTEiLCJjMSIsImEyIiwiYzIiLCJhMyIsImMzIiwiYTQiLCJjNCIsImE1IiwiYzUiLCJhNiIsImM2IiwiYTciLCJjNyIsImE4IiwiYzgiLCJhOSIsImM5IiwiRU1QVFlfQVJSQVkkMyIsIkVNUFRZX01BUCIsIlVOREVGSU5FRF9WQUxVRSIsIkluamVjdG9yUmVmVG9rZW5LZXkiLCJJTkpFQ1RPUlJlZlRva2VuS2V5IiwiTmdNb2R1bGVSZWZUb2tlbktleSIsIm1vZHVsZVByb3ZpZGVEZWYiLCJtb2R1bGVEZWYiLCJwcm92aWRlcnNCeUtleSIsIm1vZHVsZXMiLCJyZXNvbHZlTmdNb2R1bGVEZXAiLCJkZXBEZWYiLCJ0b2tlbktleV8xIiwicHJvdmlkZXJEZWYiLCJfZGVmIiwicHJvdmlkZXJJbnN0YW5jZSIsIl9jcmVhdGVQcm92aWRlckluc3RhbmNlIiwidGFyZ2V0c01vZHVsZSIsIm1vZHVsZVRyYW5zaXRpdmVseVByZXNlbnQiLCJzY29wZSIsImluamVjdGFibGUiLCJfY3JlYXRlQ2xhc3MiLCJkZXBWYWx1ZXMiLCJfY2FsbEZhY3RvcnkiLCJhdHRhY2hFbWJlZGRlZFZpZXciLCJlbGVtZW50RGF0YSIsImFkZFRvQXJyYXkiLCJhdHRhY2hQcm9qZWN0ZWRWaWV3IiwidmNFbGVtZW50RGF0YSIsImR2Y0VsZW1lbnREYXRhIiwicHJvamVjdGVkVmlld3MiLCJfcHJvamVjdGVkVmlld3MiLCJtYXJrTm9kZUFzUHJvamVjdGVkVGVtcGxhdGUiLCJ2aWV3RGVmIiwibm9kZUZsYWdzIiwiY2hpbGRGbGFncyIsInJlbmRlckF0dGFjaEVtYmVkZGVkVmlldyIsImRldGFjaEVtYmVkZGVkVmlldyIsInJlbW92ZUZyb21BcnJheSIsInJlbmRlckRldGFjaFZpZXckMSIsInByZXZWaWV3IiwicHJldlJlbmRlck5vZGUiLCJFTVBUWV9DT05URVhUIiwiY3JlYXRlQ29tcG9uZW50RmFjdG9yeSIsInZpZXdEZWZGYWN0b3J5IiwiQ29tcG9uZW50RmFjdG9yeV8iLCJfaW5wdXRzIiwiX291dHB1dHMiLCJpbnB1dHNBcnIiLCJ0ZW1wbGF0ZU5hbWUiLCJvdXRwdXRzQXJyIiwiY29tcG9uZW50Tm9kZUluZGV4IiwiY29tcG9uZW50UHJvdmlkZXIiLCJzZXRBdHRyaWJ1dGUiLCJDb21wb25lbnRSZWZfIiwiVmlld1JlZl8iLCJfdmlld1JlZiIsIl9jb21wb25lbnQiLCJfZWxEZWYiLCJjaGFuZ2VEZXRlY3RvclJlZiIsIkluamVjdG9yXyIsImNyZWF0ZVZpZXdDb250YWluZXJEYXRhIiwiZWxEZWYiLCJlbERhdGEiLCJWaWV3Q29udGFpbmVyUmVmXyIsIl9kYXRhIiwidGVtcGxhdGVSZWYiLCJpbnNlcnQiLCJjcmVhdGVDb21wb25lbnQiLCJjb21wb25lbnRGYWN0b3J5IiwibmdNb2R1bGVSZWYiLCJjb250ZXh0SW5qZWN0b3IiLCJwYXJlbnRJbmplY3RvciIsImNvbXBvbmVudFJlZiIsInZpZXdSZWZfIiwibW92ZSIsIm1vdmVFbWJlZGRlZFZpZXciLCJvbGRWaWV3SW5kZXgiLCJuZXdWaWV3SW5kZXgiLCJjcmVhdGVDaGFuZ2VEZXRlY3RvclJlZiIsInJvb3RSZW5kZXJOb2RlcyIsInJlbmRlck5vZGVzIiwiZnMiLCJkaXNwb3NhYmxlcyIsImNyZWF0ZVRlbXBsYXRlRGF0YSIsIl9wYXJlbnRWaWV3IiwiY3JlYXRlSW5qZWN0b3IkMSIsImFsbG93UHJpdmF0ZVNlcnZpY2VzIiwiY3JlYXRlUmVuZGVyZXJWMSIsIlJlbmRlcmVyQWRhcHRlciIsImRlbGVnYXRlIiwic2VsZWN0b3JPck5vZGUiLCJuYW1lc3BhY2VBbmROYW1lIiwibnMiLCJjcmVhdGVWaWV3Um9vdCIsImNyZWF0ZVRlbXBsYXRlQW5jaG9yIiwicGFyZW50RWxlbWVudCIsImNvbW1lbnQiLCJjcmVhdGVDb21tZW50IiwiY3JlYXRlVGV4dCIsInByb2plY3ROb2RlcyIsImF0dGFjaFZpZXdBZnRlciIsInZpZXdSb290Tm9kZXMiLCJ2aWV3QWxsTm9kZXMiLCJsaXN0ZW4iLCJsaXN0ZW5HbG9iYWwiLCJzZXRFbGVtZW50UHJvcGVydHkiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVZhbHVlIiwic2V0RWxlbWVudEF0dHJpYnV0ZSIsImF0dHJpYnV0ZVZhbHVlIiwic2V0QmluZGluZ0RlYnVnSW5mbyIsInNldEVsZW1lbnRDbGFzcyIsImlzQWRkIiwic2V0RWxlbWVudFN0eWxlIiwic3R5bGVOYW1lIiwic3R5bGVWYWx1ZSIsImludm9rZUVsZW1lbnRNZXRob2QiLCJtZXRob2ROYW1lIiwic2V0VGV4dCIsImFuaW1hdGUiLCJtb2R1bGVUeXBlIiwiYm9vdHN0cmFwQ29tcG9uZW50cyIsIk5nTW9kdWxlUmVmXyIsIl9tb2R1bGVUeXBlIiwiX2Jvb3RzdHJhcENvbXBvbmVudHMiLCJfZGVzdHJveUxpc3RlbmVycyIsImluaXROZ01vZHVsZSIsInByb3ZEZWYiLCJpbmplY3RGbGFncyIsImNhbGxOZ01vZHVsZUxpZmVjeWNsZSIsImxpZmVjeWNsZXMiLCJSZW5kZXJlclYxVG9rZW5LZXkiLCJSZW5kZXJlcjJUb2tlbktleSIsIkVsZW1lbnRSZWZUb2tlbktleSIsIlZpZXdDb250YWluZXJSZWZUb2tlbktleSIsIlRlbXBsYXRlUmVmVG9rZW5LZXkiLCJDaGFuZ2VEZXRlY3RvclJlZlRva2VuS2V5IiwiSW5qZWN0b3JSZWZUb2tlbktleSQxIiwiSU5KRUNUT1JSZWZUb2tlbktleSQxIiwiY2hlY2tJbmRleCIsIm5vbk1pbmlmaWVkTmFtZSIsInNlY3VyaXR5Q29udGV4dCIsInN1ZmZpeCIsIm91dHB1dERlZnMiLCJwaXBlRGVmIiwiZGVwRGVmcyIsIm91dHB1dEluZGV4IiwiZGlyZWN0Q2hpbGRGbGFncyIsImNoaWxkTWF0Y2hlZFF1ZXJpZXMiLCJxdWVyeSIsImNyZWF0ZVByb3ZpZGVySW5zdGFuY2UiLCJfY3JlYXRlUHJvdmlkZXJJbnN0YW5jZSQxIiwiY3JlYXRlUGlwZUluc3RhbmNlIiwiY3JlYXRlQ2xhc3MiLCJjcmVhdGVEaXJlY3RpdmVJbnN0YW5jZSIsIm91dHB1dCIsIm91dHB1dE9ic2VydmFibGUiLCJzdWJzY3JpcHRpb24iLCJldmVudEhhbmRsZXJDbG9zdXJlIiwiY2FsbEZhY3RvcnkiLCJOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SIiwic2VhcmNoVmlldyIsImZpbmRDb21wVmlldyIsInByb3ZpZGVyRGVmXzEiLCJhbGxQcm92aWRlcnMiLCJwdWJsaWNQcm92aWRlcnMiLCJwcm92aWRlckRhdGEiLCJ1cGRhdGVQcm9wIiwiY2hhbmdlcyIsImNhbGxMaWZlY3ljbGVIb29rc0NoaWxkcmVuRmlyc3QiLCJjYWxsUHJvdmlkZXJMaWZlY3ljbGVzIiwiY2FsbEVsZW1lbnRQcm92aWRlcnNMaWZlY3ljbGVzIiwiQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJDEiLCJDb21wb25lbnRGYWN0b3J5JDEiLCJ0b1JlZkFycmF5IiwiYXJyYXkiLCJub25NaW5pZmllZCIsIm1pbmlmaWVkIiwiUk9PVF9DT05URVhUIiwiU0NIRURVTEVSIiwiaXNCb3VuZFRvTW9kdWxlIiwiaXNJbnRlcm5hbFJvb3RWaWV3Iiwicm9vdFZpZXdJbmplY3RvciIsImNyZWF0ZUNoYWluZWRJbmplY3RvciIsImhvc3RSTm9kZSIsInJvb3RGbGFncyIsImlzSXNvbGF0ZWQiLCJ0ZXN0IiwidEVsZW1lbnROb2RlIiwicm9vdExWaWV3Iiwib2xkTFZpZXciLCJub2Rlc2ZvclNsb3QiLCJDb21wb25lbnRSZWYkMSIsIl9yb290TFZpZXciLCJkZXN0cm95Q2JzIiwiZmxhdHRlbiIsImxpc3QiLCJkc3QiLCJuZ0kxOG5DbG9zdXJlTW9kZSIsImdvb2ciLCJnZXRNc2ciLCJQbHVyYWwiLCJDT01QT05FTlRfRkFDVE9SWV9SRVNPTFZFUiIsIk5nTW9kdWxlUmVmJDEiLCJib290c3RyYXAiLCJfcjNJbmplY3RvciIsImNyZWF0ZUluamVjdG9yIiwiRXZlbnRFbWl0dGVyIiwiaXNBc3luYyIsIl9faXNBc3luYyIsImVtaXQiLCJnZW5lcmF0b3JPck5leHQiLCJjb21wbGV0ZSIsInNjaGVkdWxlckZuIiwiZXJyb3JGbiIsImNvbXBsZXRlRm4iLCJzaW5rIiwiUXVlcnlMaXN0IiwiX3Jlc3VsdHMiLCJmaWx0ZXIiLCJyZWR1Y2UiLCJpbml0IiwidG9BcnJheSIsInJlc2V0IiwicmVzdWx0c1RyZWUiLCJsYXN0Iiwibm90aWZ5T25DaGFuZ2VzIiwiTFF1ZXJpZXNfIiwic2hhbGxvdyIsImRlZXAiLCJ0cmFjayIsInF1ZXJ5TGlzdCIsInByZWRpY2F0ZSIsImRlc2NlbmQiLCJyZWFkIiwiY3JlYXRlUXVlcnkiLCJjbG9uZSIsInNoYWxsb3dSZXN1bHRzIiwiY29weVF1ZXJpZXNUb0NvbnRhaW5lciIsImRlZXBSZXN1bHRzIiwiY29weVF1ZXJpZXNUb1ZpZXciLCJpbnNlcnRWaWV3JDEiLCJhZGROb2RlIiwiaW5zZXJ0Tm9kZUJlZm9yZVZpZXdzIiwicmVtb3ZlVmlldyQxIiwiY29udGFpbmVyVmFsdWVzIiwiYXNzZXJ0Vmlld1F1ZXJ5aGFzUG9pbnRlclRvRGVjbGFyYXRpb25Db250YWluZXIiLCJ2aWV3VmFsdWVzSWR4IiwicmVtb3ZlZCIsImdldElkeE9mTWF0Y2hpbmdTZWxlY3RvciIsInF1ZXJ5QnlSZWFkVG9rZW4iLCJtYXRjaGluZ0lkeCIsInF1ZXJ5QnlUZW1wbGF0ZVJlZiIsInRlbXBsYXRlUmVmVG9rZW4iLCJ0ZW1wbGF0ZVJlZlJlc3VsdCIsInF1ZXJ5UmVhZCIsInF1ZXJ5QnlUTm9kZVR5cGUiLCJpbnNlcnRCZWZvcmVDb250YWluZXIiLCJhZGRNYXRjaCIsIm1hdGNoaW5nVmFsdWUiLCJpbnNlcnRCZWZvcmVWaWV3TWF0Y2hlcyIsImNyZWF0ZVByZWRpY2F0ZSIsIl92YWx1ZXNUcmVlIiwicmVnaXN0ZXJNb2R1bGVGYWN0b3J5IiwiYXNzZXJ0U2FtZU9yTm90RXhpc3RpbmciLCJpbmNvbWluZyIsIkRpcmVjdGl2ZSIsImRpciIsIlNXSVRDSF9DT01QSUxFX0RJUkVDVElWRSIsIkNvbXBvbmVudCIsIlNXSVRDSF9DT01QSUxFX0NPTVBPTkVOVCIsIlBpcGUiLCJwdXJlIiwiU1dJVENIX0NPTVBJTEVfUElQRSIsIklucHV0IiwiYmluZGluZ1Byb3BlcnR5TmFtZSIsIk91dHB1dCIsImhvc3RQcm9wZXJ0eU5hbWUiLCJOZ01vZHVsZSIsIlNXSVRDSF9DT01QSUxFX05HTU9EVUxFIiwicHJlUjNOZ01vZHVsZUNvbXBpbGUiLCJleHBvcnRzIiwiQVBQX0lOSVRJQUxJWkVSIiwiQXBwbGljYXRpb25Jbml0U3RhdHVzIiwiYXBwSW5pdHMiLCJpbml0aWFsaXplZCIsImRvbmVQcm9taXNlIiwicmVqIiwicmVqZWN0IiwicnVuSW5pdGlhbGl6ZXJzIiwiYXN5bmNJbml0UHJvbWlzZXMiLCJpbml0UmVzdWx0IiwiYWxsIiwiY2F0Y2giLCJBUFBfSUQiLCJBUFBfSURfUkFORE9NX1BST1ZJREVSIiwiX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5IiwiX3JhbmRvbUNoYXIiLCJmcm9tQ2hhckNvZGUiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJQTEFURk9STV9JTklUSUFMSVpFUiIsIlBMQVRGT1JNX0lEIiwiQVBQX0JPT1RTVFJBUF9MSVNURU5FUiIsIlBBQ0tBR0VfUk9PVF9VUkwiLCJDb25zb2xlIiwibG9nIiwiX3Rocm93RXJyb3IiLCJ0cmFjZSIsImV2ZW50cyIsIkNvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jIiwiQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jIiwiQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jIiwiQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyIsIkNvbXBpbGVyIiwiY29tcGlsZU1vZHVsZVN5bmMiLCJjb21waWxlTW9kdWxlQXN5bmMiLCJjb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMiLCJjb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jIiwiY2xlYXJDYWNoZSIsImNsZWFyQ2FjaGVGb3IiLCJnZXRNb2R1bGVJZCIsIkNPTVBJTEVSX09QVElPTlMiLCJDb21waWxlckZhY3RvcnkiLCJ3dGZFbmFibGVkIiwiZGV0ZWN0V1RGIiwid3RmIiwibm9vcFNjb3BlIiwiYXJnMCIsImFyZzEiLCJ3dGZDcmVhdGVTY29wZSIsImNyZWF0ZVNjb3BlIiwid3RmTGVhdmUiLCJsZWF2ZSIsInJldHVyblZhbHVlIiwibGVhdmVTY29wZSIsInByb21pc2UiLCJzY2hlZHVsZU1pY3JvVGFzayIsIlpvbmUiLCJOZ1pvbmUiLCJlbmFibGVMb25nU3RhY2tUcmFjZSIsImhhc1BlbmRpbmdNaWNyb3Rhc2tzIiwiaGFzUGVuZGluZ01hY3JvdGFza3MiLCJpc1N0YWJsZSIsIm9uVW5zdGFibGUiLCJvbk1pY3JvdGFza0VtcHR5Iiwib25TdGFibGUiLCJvbkVycm9yIiwiYXNzZXJ0Wm9uZVBhdGNoZWQiLCJfbmVzdGluZyIsIl9vdXRlciIsIl9pbm5lciIsImZvcmsiLCJmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvciIsInpvbmUiLCJwcm9wZXJ0aWVzIiwib25JbnZva2VUYXNrIiwidGFzayIsImFwcGx5VGhpcyIsImFwcGx5QXJncyIsIm9uRW50ZXIiLCJpbnZva2VUYXNrIiwib25MZWF2ZSIsIm9uSW52b2tlIiwiaW52b2tlIiwib25IYXNUYXNrIiwiaGFzVGFza1N0YXRlIiwiaGFzVGFzayIsImNoYW5nZSIsIm1pY3JvVGFzayIsImNoZWNrU3RhYmxlIiwibWFjcm9UYXNrIiwib25IYW5kbGVFcnJvciIsInJ1bk91dHNpZGVBbmd1bGFyIiwiaXNJbkFuZ3VsYXJab25lIiwiYXNzZXJ0SW5Bbmd1bGFyWm9uZSIsImFzc2VydE5vdEluQW5ndWxhclpvbmUiLCJydW4iLCJydW5UYXNrIiwic2NoZWR1bGVFdmVudFRhc2siLCJFTVBUWV9QQVlMT0FEIiwibm9vcCQxIiwiY2FuY2VsVGFzayIsInJ1bkd1YXJkZWQiLCJOb29wTmdab25lIiwiVGVzdGFiaWxpdHkiLCJfbmdab25lIiwiX3BlbmRpbmdDb3VudCIsIl9pc1pvbmVTdGFibGUiLCJfZGlkV29yayIsIl9jYWxsYmFja3MiLCJ0YXNrVHJhY2tpbmdab25lIiwiX3dhdGNoQW5ndWxhckV2ZW50cyIsIl9ydW5DYWxsYmFja3NJZlJlYWR5IiwiaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiY2IiLCJjbGVhclRpbWVvdXQiLCJ0aW1lb3V0SWQiLCJkb25lQ2IiLCJwZW5kaW5nXzEiLCJnZXRQZW5kaW5nVGFza3MiLCJ1cGRhdGVDYiIsIm1hY3JvVGFza3MiLCJjcmVhdGlvbkxvY2F0aW9uIiwiYWRkQ2FsbGJhY2siLCJ0aW1lb3V0Iiwid2hlblN0YWJsZSIsImdldFBlbmRpbmdSZXF1ZXN0Q291bnQiLCJmaW5kUHJvdmlkZXJzIiwidXNpbmciLCJleGFjdE1hdGNoIiwiVGVzdGFiaWxpdHlSZWdpc3RyeSIsIl9hcHBsaWNhdGlvbnMiLCJfdGVzdGFiaWxpdHlHZXR0ZXIiLCJhZGRUb1dpbmRvdyIsInJlZ2lzdGVyQXBwbGljYXRpb24iLCJ0ZXN0YWJpbGl0eSIsInVucmVnaXN0ZXJBcHBsaWNhdGlvbiIsInVucmVnaXN0ZXJBbGxBcHBsaWNhdGlvbnMiLCJnZXRUZXN0YWJpbGl0eSIsImVsZW0iLCJnZXRBbGxUZXN0YWJpbGl0aWVzIiwiZ2V0QWxsUm9vdEVsZW1lbnRzIiwiZmluZFRlc3RhYmlsaXR5SW5UcmVlIiwiZmluZEluQW5jZXN0b3JzIiwic2V0VGVzdGFiaWxpdHlHZXR0ZXIiLCJfcGxhdGZvcm0iLCJfTm9vcEdldFRlc3RhYmlsaXR5IiwicmVnaXN0cnkiLCJjb21waWxlTmdNb2R1bGVGYWN0b3J5IiwiY29tcGlsZU5nTW9kdWxlRmFjdG9yeV9fUFJFX1IzX18iLCJjcmVhdGVDb21waWxlciIsImlzQm91bmRUb01vZHVsZV9fUFJFX1IzX18iLCJjZiIsIkFMTE9XX01VTFRJUExFX1BMQVRGT1JNUyIsIk5nUHJvYmVUb2tlbiIsImNyZWF0ZVBsYXRmb3JtRmFjdG9yeSIsInBhcmVudFBsYXRmb3JtRmFjdG9yeSIsImV4dHJhUHJvdmlkZXJzIiwicGxhdGZvcm0iLCJnZXRQbGF0Zm9ybSIsImluamVjdGVkUHJvdmlkZXJzIiwiY3JlYXRlUGxhdGZvcm0iLCJQbGF0Zm9ybVJlZiIsImluaXRzIiwiYXNzZXJ0UGxhdGZvcm0iLCJyZXF1aXJlZFRva2VuIiwiX2luamVjdG9yIiwiX21vZHVsZXMiLCJib290c3RyYXBNb2R1bGVGYWN0b3J5IiwibW9kdWxlRmFjdG9yeSIsIm5nWm9uZSIsImdldE5nWm9uZSIsIm5nWm9uZU9wdGlvbiIsIm5nWm9uZUluamVjdG9yIiwibW9kdWxlUmVmIiwiZXhjZXB0aW9uSGFuZGxlciIsIl9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIiLCJpbml0U3RhdHVzIiwiX21vZHVsZURvQm9vdHN0cmFwIiwiYm9vdHN0cmFwTW9kdWxlIiwiY29tcGlsZXJPcHRpb25zIiwib3B0aW9uc1JlZHVjZXIiLCJBcHBsaWNhdGlvblJlZiIsIm5nRG9Cb290c3RyYXAiLCJtb2R1bGUiLCJfem9uZSIsIl9leGNlcHRpb25IYW5kbGVyIiwiX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciIsIl9pbml0U3RhdHVzIiwiX2Jvb3RzdHJhcExpc3RlbmVycyIsIl92aWV3cyIsIl9ydW5uaW5nVGljayIsIl9lbmZvcmNlTm9OZXdDaGFuZ2VzIiwiX3N0YWJsZSIsImNvbXBvbmVudFR5cGVzIiwidGljayIsImlzQ3VycmVudGx5U3RhYmxlIiwib2JzZXJ2ZXIiLCJzdGFibGVTdWIiLCJ1bnN0YWJsZVN1YiIsInBpcGUiLCJBcHBsaWNhdGlvblJlZl8xIiwiY29tcG9uZW50T3JGYWN0b3J5IiwiY29tcFJlZiIsIl91bmxvYWRDb21wb25lbnQiLCJfbG9hZENvbXBvbmVudCIsIl90aWNrU2NvcGUiLCJfZCIsIl9lIiwiX2YiLCJhdHRhY2hWaWV3IiwiU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZyIsIkRFRkFVTFRfQ09ORklHIiwiZmFjdG9yeVBhdGhQcmVmaXgiLCJmYWN0b3J5UGF0aFN1ZmZpeCIsIlN5c3RlbUpzTmdNb2R1bGVMb2FkZXIiLCJfY29tcGlsZXIiLCJjb25maWciLCJfY29uZmlnIiwibG9hZCIsInBhdGgiLCJsb2FkRmFjdG9yeSIsImxvYWRBbmRDb21waWxlIiwiZXhwb3J0TmFtZSIsImNoZWNrTm90RW1wdHkiLCJmYWN0b3J5Q2xhc3NTdWZmaXgiLCJtb2R1bGVQYXRoIiwiRW1iZWRkZWRWaWV3UmVmIiwiRGVidWdFdmVudExpc3RlbmVyIiwiRGVidWdOb2RlX19QUkVfUjNfXyIsIl9kZWJ1Z0NvbnRleHQiLCJEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fIiwiYWRkQ2hpbGQiLCJwcm92aWRlclRva2VucyIsImNoaWxkTm9kZXMiLCJjaGlsZEluZGV4IiwiaW5zZXJ0Q2hpbGRyZW5BZnRlciIsIm5ld0NoaWxkcmVuIiwic2libGluZ0luZGV4IiwicmVmQ2hpbGQiLCJuZXdDaGlsZCIsInJlZkluZGV4IiwicXVlcnlBbGwiLCJtYXRjaGVzIiwiX3F1ZXJ5RWxlbWVudENoaWxkcmVuIiwicXVlcnlBbGxOb2RlcyIsIl9xdWVyeU5vZGVDaGlsZHJlbiIsInRyaWdnZXJFdmVudEhhbmRsZXIiLCJldmVudE9iaiIsIkRlYnVnTm9kZV9fUE9TVF9SM19fIiwiRGVidWdFbGVtZW50X19QT1NUX1IzX18iLCJnZXRJbmplY3Rpb25Ub2tlbnMiLCJjb2xsZWN0UHJvcGVydHlCaW5kaW5ncyIsImdldEZpcnN0QmluZGluZ0luZGV4IiwibWV0YWRhdGFJbmRleCIsImN1cnJlbnRCaW5kaW5nSW5kZXgiLCJtZXRhZGF0YVBhcnRzIiwiaG9zdFByb3BlcnRpZXMiLCJjb2xsZWN0SG9zdFByb3BlcnR5QmluZGluZ3MiLCJob3N0UHJvcEluZGV4IiwiY29sbGVjdENsYXNzTmFtZXMiLCJkZWJ1Z0VsZW1lbnQiLCJlQXR0cnMiLCJhdHRyIiwibENvbnRleHQiLCJlQ2xhc3NlcyIsImNsYXNzTGlzdCIsImVTdHlsZXMiLCJnZXRQcm9wZXJ0eVZhbHVlIiwiY2hpbGRyZW4iLCJnZXREZWJ1Z05vZGVfX1BPU1RfUjNfXyIsIl9xdWVyeUFsbFIzIiwiZWxlbWVudHNPbmx5IiwiX3F1ZXJ5Tm9kZUNoaWxkcmVuUjMiLCJyb290TmF0aXZlTm9kZSIsIl9hZGRRdWVyeU1hdGNoUjMiLCJfcXVlcnlOb2RlQ2hpbGRyZW5JbkNvbnRhaW5lclIzIiwibmV4dExWaWV3IiwiY2hpbGRWaWV3IiwiZGVidWdOb2RlIiwiZ2V0RGVidWdOb2RlIiwiX25hdGl2ZU5vZGVUb0RlYnVnTm9kZSIsImdldERlYnVnTm9kZV9fUFJFX1IzX18iLCJpbmRleERlYnVnTm9kZSIsIk1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5IiwicGxhdGZvcm1Db3JlIiwiTE9DQUxFX0lEIiwiVFJBTlNMQVRJT05TJDEiLCJUUkFOU0xBVElPTlNfRk9STUFUIiwiQVBQTElDQVRJT05fTU9EVUxFX1BST1ZJREVSUyIsInpvbmVTY2hlZHVsZXJGYWN0b3J5IiwicXVldWUiLCJfaXRlcmFibGVEaWZmZXJzRmFjdG9yeSIsIl9rZXlWYWx1ZURpZmZlcnNGYWN0b3J5IiwiX2xvY2FsZUZhY3RvcnkiLCJsb2NhbGUiLCJWaWV3QWN0aW9uIiwiQXBwbGljYXRpb25Nb2R1bGUiLCJhbmNob3JEZWYiLCJ0ZW1wbGF0ZUZhY3RvcnkiLCJlbGVtZW50RGVmIiwiZml4ZWRBdHRycyIsImJpbmRpbmdEZWZzIiwibmFtZXNwYWNlQW5kTmFtZV8xIiwic3VmZml4T3JTZWN1cml0eUNvbnRleHQiLCJuc18xIiwicmVzb2x2ZVJlbmRlcmVyVHlwZTIiLCJpc0ZpbGxlZCIsIk5vbmUiLCJwYXJlbnRFbCIsInByZXNlcnZlQ29udGVudCIsIlNoYWRvd0RvbSIsImxpc3RlblRvRWxlbWVudE91dHB1dHMiLCJoYW5kbGVFdmVudENsb3N1cmUiLCJyZW5kZXJFdmVudEhhbmRsZXJDbG9zdXJlIiwibGlzdGVuVGFyZ2V0IiwibGlzdGVuZXJWaWV3IiwiZGlzcG9zYWJsZSIsImNoZWNrQW5kVXBkYXRlRWxlbWVudFZhbHVlIiwiYmluZGluZyIsInJlbmRlclZhbHVlIiwic2FuaXRpemUiLCJTVFlMRSIsInVuaXQiLCJxdWVyeURlZiIsImJpbmRpbmdUeXBlIiwiZmlsdGVySWQiLCJxdWVyeUlkcyIsIm5vZGVNYXRjaGVkUXVlcmllcyIsInRwbERlZiIsImNoZWNrQW5kVXBkYXRlUXVlcnkiLCJuZXdWYWx1ZXMiLCJjYWxjUXVlcnlWYWx1ZXMiLCJub3RpZnkiLCJib3VuZFZhbHVlIiwiZ2V0UXVlcnlWYWx1ZSIsImR2YyIsInByb2plY3RlZFZpZXciLCJxdWVyeVZhbHVlVHlwZSIsIm5nQ29udGVudERlZiIsImFwcGVuZE5nQ29udGVudCIsInB1cmVQaXBlRGVmIiwiYXJnQ291bnQiLCJfcHVyZUV4cHJlc3Npb25EZWYiLCJwdXJlQXJyYXlEZWYiLCJwdXJlT2JqZWN0RGVmIiwicHJvcFRvSW5kZXgiLCJuYktleXMiLCJwcm9wZXJ0eU5hbWVzIiwidGV4dERlZiIsInN0YXRpY1RleHQiLCJwcmVmaXgiLCJfYWRkSW50ZXJwb2xhdGlvblBhcnQiLCJ2aWV3QmluZGluZ0NvdW50Iiwidmlld0Rpc3Bvc2FibGVDb3VudCIsInZpZXdOb2RlRmxhZ3MiLCJ2aWV3Um9vdE5vZGVGbGFncyIsInZpZXdNYXRjaGVkUXVlcmllcyIsImN1cnJlbnRQYXJlbnQiLCJjdXJyZW50UmVuZGVyUGFyZW50IiwiY3VycmVudEVsZW1lbnRIYXNQdWJsaWNQcm92aWRlcnMiLCJjdXJyZW50RWxlbWVudEhhc1ByaXZhdGVQcm92aWRlcnMiLCJ2YWxpZGF0ZU5vZGUiLCJpc1ByaXZhdGVTZXJ2aWNlIiwiaXNOZ0NvbnRhaW5lciIsIm5ld1BhcmVudCIsInJvb3ROb2RlRmxhZ3MiLCJiaW5kaW5nQ291bnQiLCJvdXRwdXRDb3VudCIsIm5vZGVDb3VudCIsInBhcmVudEVuZCIsImluaXRWaWV3IiwiY3JlYXRlVmlld05vZGVzIiwiY29tcFJlbmRlcmVyIiwiaG9zdERlZiIsIm5vZGVEYXRhIiwiY29tcFZpZXdEZWYiLCJleGVjQ29tcG9uZW50Vmlld3NBY3Rpb24iLCJDcmVhdGVWaWV3Tm9kZXMiLCJleGVjUXVlcmllc0FjdGlvbiIsIm1hcmtQcm9qZWN0ZWRWaWV3c0ZvckNoZWNrIiwiZXhlY0VtYmVkZGVkVmlld3NBY3Rpb24iLCJDaGVja05vQ2hhbmdlcyIsIkNoZWNrQW5kVXBkYXRlIiwiY2FsbEluaXQiLCJjaGVja0FuZFVwZGF0ZU5vZGUiLCJhcmdTdHlsZSIsInYwIiwidjEiLCJ2MiIsInYzIiwidjQiLCJ2NSIsInY2IiwidjciLCJ2OCIsInY5IiwiY2hlY2tBbmRVcGRhdGVOb2RlSW5saW5lIiwiY2hlY2tBbmRVcGRhdGVFbGVtZW50SW5saW5lIiwiYmluZExlbiIsImNoYW5nZWQiLCJjaGVja0FuZFVwZGF0ZVRleHRJbmxpbmUiLCJjaGVja0FuZFVwZGF0ZURpcmVjdGl2ZUlubGluZSIsIm5nT25DaGFuZ2VzIiwiY2hlY2tBbmRVcGRhdGVQdXJlRXhwcmVzc2lvbklubGluZSIsInRyYW5zZm9ybSIsImNoZWNrQW5kVXBkYXRlTm9kZUR5bmFtaWMiLCJjaGVja0FuZFVwZGF0ZUVsZW1lbnREeW5hbWljIiwiY2hlY2tBbmRVcGRhdGVUZXh0RHluYW1pYyIsImNoZWNrQW5kVXBkYXRlRGlyZWN0aXZlRHluYW1pYyIsImNoZWNrQW5kVXBkYXRlUHVyZUV4cHJlc3Npb25EeW5hbWljIiwiY2hlY2tOb0NoYW5nZXNOb2RlIiwiY2hlY2tOb0NoYW5nZXNOb2RlSW5saW5lIiwiY2hlY2tOb0NoYW5nZXNOb2RlRHluYW1pYyIsImNoZWNrTm9DaGFuZ2VzUXVlcnkiLCJEZXN0cm95IiwiZGV0YWNoUHJvamVjdGVkVmlldyIsImRlc3Ryb3lWaWV3Tm9kZXMiLCJjYWxsVmlld0FjdGlvbiIsInZpZXdTdGF0ZSIsImV4ZWNQcm9qZWN0ZWRWaWV3c0FjdGlvbiIsIkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3MiLCJDaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzIiwicXVlcnlGbGFncyIsInN0YXRpY0R5bmFtaWNRdWVyeUZsYWciLCJjaGVja1R5cGUiLCJpbml0U2VydmljZXNJZk5lZWRlZCIsInNlcnZpY2VzIiwiY3JlYXRlRGVidWdTZXJ2aWNlcyIsImRlYnVnU2V0Q3VycmVudE5vZGUiLCJkZWJ1Z0NyZWF0ZVJvb3RWaWV3IiwiZGVidWdDcmVhdGVFbWJlZGRlZFZpZXciLCJkZWJ1Z0NyZWF0ZUNvbXBvbmVudFZpZXciLCJkZWJ1Z0NyZWF0ZU5nTW9kdWxlUmVmIiwiZGVidWdPdmVycmlkZVByb3ZpZGVyIiwiZGVidWdPdmVycmlkZUNvbXBvbmVudFZpZXciLCJkZWJ1Z0NsZWFyT3ZlcnJpZGVzIiwiZGVidWdDaGVja0FuZFVwZGF0ZVZpZXciLCJkZWJ1Z0NoZWNrTm9DaGFuZ2VzVmlldyIsImRlYnVnRGVzdHJveVZpZXciLCJEZWJ1Z0NvbnRleHRfIiwiZGVidWdIYW5kbGVFdmVudCIsImRlYnVnVXBkYXRlRGlyZWN0aXZlcyIsImRlYnVnVXBkYXRlUmVuZGVyZXIiLCJjcmVhdGVQcm9kU2VydmljZXMiLCJjcmVhdGVQcm9kUm9vdFZpZXciLCJwcm9kQ2hlY2tBbmRVcGRhdGVOb2RlIiwicHJvZENoZWNrTm9DaGFuZ2VzTm9kZSIsImVsSW5qZWN0b3IiLCJjcmVhdGVSb290RGF0YSIsIkRlYnVnUmVuZGVyZXJGYWN0b3J5MiIsImRlZldpdGhPdmVycmlkZSIsImFwcGx5UHJvdmlkZXJPdmVycmlkZXNUb1ZpZXciLCJjYWxsV2l0aERlYnVnQ29udGV4dCIsIkRlYnVnQWN0aW9uIiwidmlld0RlZk92ZXJyaWRlcyIsImFwcGx5UHJvdmlkZXJPdmVycmlkZXNUb05nTW9kdWxlIiwiY2FsY0hhc092ZXJyaWRlcyIsImhhc092ZXJyaWRlcyIsImhhc0RlcHJlY2F0ZWRPdmVycmlkZXMiLCJwcm92aWRlck92ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZGVwcmVjYXRlZEJlaGF2aW9yIiwicHJvdmlkZXJPdmVycmlkZXNXaXRoU2NvcGUiLCJhcHBseVByb3ZpZGVyT3ZlcnJpZGVzIiwibW9kdWxlU2V0XzEiLCJfY3VycmVudEFjdGlvbiIsIl9jdXJyZW50VmlldyIsIl9jdXJyZW50Tm9kZUluZGV4IiwiY29tcCIsImNvbXBGYWN0b3J5IiwiaG9zdFZpZXdEZWYiLCJnZXRDb21wb25lbnRWaWV3RGVmaW5pdGlvbkZhY3RvcnkiLCJlbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycyIsImZpbmRFbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycyIsImVsSW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycyIsImxhc3RFbGVtZW50RGVmIiwiYXBwbHlQcm92aWRlck92ZXJyaWRlc1RvRWxlbWVudCIsImVsSW5kZXgiLCJuZXh0RGlyZWN0aXZlV2l0aEJpbmRpbmciLCJkZWJ1Z0NoZWNrRGlyZWN0aXZlc0ZuIiwiZGVidWdDaGVja0FuZFVwZGF0ZU5vZGUiLCJkZWJ1Z0NoZWNrTm9DaGFuZ2VzTm9kZSIsIm5leHRSZW5kZXJOb2RlV2l0aEJpbmRpbmciLCJkZWJ1Z0NoZWNrUmVuZGVyTm9kZUZuIiwiZ2l2ZW5WYWx1ZXMiLCJiaW5kaW5nVmFsdWVzIiwiZWxWaWV3IiwiZWxPckNvbXBWaWV3IiwiY2hpbGREZWYiLCJjb2xsZWN0UmVmZXJlbmNlcyIsImZpbmRIb3N0RWxlbWVudCIsImxvZ1ZpZXdEZWYiLCJsb2dOb2RlSW5kZXgiLCJyZW5kZXJOb2RlSW5kZXgiLCJnZXRSZW5kZXJOb2RlSW5kZXgiLCJjdXJyUmVuZGVyTm9kZUluZGV4Iiwibm9kZUxvZ2dlciIsInJlZk5hbWUiLCJvbGRBY3Rpb24iLCJvbGROb2RlSW5kZXgiLCJpc1ZpZXdEZWJ1Z0Vycm9yIiwidmlld1dyYXBwZWREZWJ1Z0Vycm9yIiwiZ2V0Q3VycmVudERlYnVnQ29udGV4dCIsInJlbmRlckRhdGEiLCJEZWJ1Z1JlbmRlcmVyMiIsIndoZW5SZW5kZXJpbmdEb25lIiwiZGVidWdDb250ZXh0RmFjdG9yeSIsInJlbW92ZURlYnVnTm9kZUZyb21JbmRleCIsImRlYnVnQ3R4IiwiZGVidWdFbCIsImRlYnVnQ2hpbGRFbCIsImRlYnVnUmVmRWwiLCJvbGRDaGlsZCIsImZ1bGxOYW1lIiwiY3JlYXRlTmdNb2R1bGVGYWN0b3J5IiwiZGVmRmFjdG9yeSIsIk5nTW9kdWxlRmFjdG9yeV8iLCJfbmdNb2R1bGVEZWZGYWN0b3J5IiwiY2xvbmVOZ01vZHVsZURlZmluaXRpb24iLCJUYWdDb250ZW50VHlwZSIsInNwbGl0TnNOYW1lIiwiZWxlbWVudE5hbWUiLCJjb2xvbkluZGV4IiwiaXNOZ0NvbnRlbnQiLCJpc05nVGVtcGxhdGUiLCJnZXROc1ByZWZpeCIsIm1lcmdlTnNBbmROYW1lIiwibG9jYWxOYW1lIiwiTkFNRURfRU5USVRJRVMiLCJOR1NQX1VOSUNPREUiLCJfREVGQVVMVF9UQUdfREVGSU5JVElPTiIsIlRBR19ERUZJTklUSU9OUyIsIkh0bWxUYWdEZWZpbml0aW9uIiwiY2xvc2VkQnlDaGlsZHJlbiIsImltcGxpY2l0TmFtZXNwYWNlUHJlZml4IiwiY29udGVudFR5cGUiLCJQQVJTQUJMRV9EQVRBIiwiY2xvc2VkQnlQYXJlbnQiLCJpc1ZvaWQiLCJpZ25vcmVGaXJzdExmIiwiY2FuU2VsZkNsb3NlIiwiaXNDbG9zZWRCeUNoaWxkIiwiZ2V0SHRtbFRhZ0RlZmluaXRpb24iLCJSQVdfVEVYVCIsIkVTQ0FQQUJMRV9SQVdfVEVYVCIsIl9TRUxFQ1RPUl9SRUdFWFAiLCJDc3NTZWxlY3RvciIsIm5vdFNlbGVjdG9ycyIsInBhcnNlIiwiX2FkZFJlc3VsdCIsImNzc1NlbCIsImNzc1NlbGVjdG9yIiwiaW5Ob3QiLCJsYXN0SW5kZXgiLCJzZXRFbGVtZW50IiwiYWRkQ2xhc3NOYW1lIiwiYWRkQXR0cmlidXRlIiwiaXNFbGVtZW50U2VsZWN0b3IiLCJoYXNFbGVtZW50U2VsZWN0b3IiLCJnZXRNYXRjaGluZ0VsZW1lbnRUZW1wbGF0ZSIsImNsYXNzQXR0ciIsImdldEF0dHJzIiwia2xhc3MiLCJub3RTZWxlY3RvciIsIlNlbGVjdG9yTWF0Y2hlciIsIl9lbGVtZW50TWFwIiwiX2VsZW1lbnRQYXJ0aWFsTWFwIiwiX2NsYXNzTWFwIiwiX2NsYXNzUGFydGlhbE1hcCIsIl9hdHRyVmFsdWVNYXAiLCJfYXR0clZhbHVlUGFydGlhbE1hcCIsIl9saXN0Q29udGV4dHMiLCJjcmVhdGVOb3RNYXRjaGVyIiwibm90TWF0Y2hlciIsImFkZFNlbGVjdGFibGVzIiwiY3NzU2VsZWN0b3JzIiwiY2FsbGJhY2tDdHh0IiwibGlzdENvbnRleHQiLCJTZWxlY3Rvckxpc3RDb250ZXh0IiwiX2FkZFNlbGVjdGFibGUiLCJtYXRjaGVyIiwic2VsZWN0YWJsZSIsIlNlbGVjdG9yQ29udGV4dCIsImlzVGVybWluYWwiLCJfYWRkVGVybWluYWwiLCJfYWRkUGFydGlhbCIsInRlcm1pbmFsTWFwIiwidGVybWluYWxWYWx1ZXNNYXAiLCJwYXJ0aWFsTWFwIiwicGFydGlhbFZhbHVlc01hcCIsInRlcm1pbmFsTGlzdCIsIm1hdGNoZWRDYWxsYmFjayIsImFscmVhZHlNYXRjaGVkIiwiX21hdGNoVGVybWluYWwiLCJfbWF0Y2hQYXJ0aWFsIiwibmFtZV8zIiwic2VsZWN0YWJsZXMiLCJzdGFyU2VsZWN0YWJsZXMiLCJmaW5hbGl6ZSIsIm5lc3RlZFNlbGVjdG9yIiwiY2JDb250ZXh0IiwiY3JlYXRlSW5qZWN0IiwibWFrZU1ldGFkYXRhRmFjdG9yeSIsImNyZWF0ZUluamVjdGlvblRva2VuIiwiY3JlYXRlQXR0cmlidXRlIiwiY3JlYXRlQ29udGVudENoaWxkcmVuIiwiY3JlYXRlQ29udGVudENoaWxkIiwiY3JlYXRlVmlld0NoaWxkcmVuIiwiY3JlYXRlVmlld0NoaWxkIiwiY3JlYXRlRGlyZWN0aXZlIiwiY3JlYXRlUGlwZSIsImNyZWF0ZUlucHV0IiwiY3JlYXRlT3V0cHV0IiwiY3JlYXRlSG9zdEJpbmRpbmciLCJjcmVhdGVIb3N0TGlzdGVuZXIiLCJjcmVhdGVOZ01vZHVsZSIsImNyZWF0ZUluamVjdGFibGUiLCJDVVNUT01fRUxFTUVOVFNfU0NIRU1BIiwiTk9fRVJST1JTX1NDSEVNQSIsImNyZWF0ZU9wdGlvbmFsIiwiY3JlYXRlU2VsZiIsImNyZWF0ZVNraXBTZWxmIiwiY3JlYXRlSG9zdCIsImlzVHlwZU9mIiwicGFyc2VyU2VsZWN0b3JUb1IzU2VsZWN0b3IiLCJwb3NpdGl2ZSIsInBhcnNlclNlbGVjdG9yVG9TaW1wbGVTZWxlY3RvciIsIm5lZ2F0aXZlIiwicGFyc2VyU2VsZWN0b3JUb05lZ2F0aXZlU2VsZWN0b3IiLCJwYXJzZVNlbGVjdG9yVG9SM1NlbGVjdG9yIiwiVHlwZU1vZGlmaWVyIiwiQnVpbHRpblR5cGVOYW1lIiwiVHlwZSQxIiwibW9kaWZpZXJzIiwiaGFzTW9kaWZpZXIiLCJtb2RpZmllciIsIkJpbmFyeU9wZXJhdG9yIiwiQnVpbHRpblR5cGUiLCJ2aXNpdFR5cGUiLCJ2aXNpdG9yIiwidmlzaXRCdWlsdGluVHlwZSIsIkV4cHJlc3Npb25UeXBlIiwidHlwZVBhcmFtcyIsInZpc2l0RXhwcmVzc2lvblR5cGUiLCJBcnJheVR5cGUiLCJvZiIsInZpc2l0QXJyYXlUeXBlIiwiTWFwVHlwZSIsInZpc2l0TWFwVHlwZSIsIkRZTkFNSUNfVFlQRSIsIkR5bmFtaWMiLCJJTkZFUlJFRF9UWVBFIiwiSW5mZXJyZWQiLCJCT09MX1RZUEUiLCJCb29sIiwiTlVNQkVSX1RZUEUiLCJJbnQiLCJOdW1iZXIiLCJOT05FX1RZUEUiLCJudWxsU2FmZUlzRXF1aXZhbGVudCIsImJhc2UiLCJvdGhlciIsImlzRXF1aXZhbGVudCIsImFyZUFsbEVxdWl2YWxlbnQiLCJCdWlsdGluVmFyIiwiRXhwcmVzc2lvbiIsInNvdXJjZVNwYW4iLCJSZWFkUHJvcEV4cHIiLCJSZWFkS2V5RXhwciIsImNhbGxNZXRob2QiLCJJbnZva2VNZXRob2RFeHByIiwiY2FsbEZuIiwiSW52b2tlRnVuY3Rpb25FeHByIiwiaW5zdGFudGlhdGUiLCJJbnN0YW50aWF0ZUV4cHIiLCJjb25kaXRpb25hbCIsInRydWVDYXNlIiwiZmFsc2VDYXNlIiwiQ29uZGl0aW9uYWxFeHByIiwiZXF1YWxzIiwicmhzIiwiQmluYXJ5T3BlcmF0b3JFeHByIiwiRXF1YWxzIiwibm90RXF1YWxzIiwiTm90RXF1YWxzIiwiaWRlbnRpY2FsIiwiSWRlbnRpY2FsIiwibm90SWRlbnRpY2FsIiwiTm90SWRlbnRpY2FsIiwibWludXMiLCJNaW51cyIsInBsdXMiLCJQbHVzIiwiZGl2aWRlIiwiRGl2aWRlIiwibXVsdGlwbHkiLCJNdWx0aXBseSIsIm1vZHVsbyIsIk1vZHVsbyIsImFuZCIsIkFuZCIsImJpdHdpc2VBbmQiLCJwYXJlbnMiLCJCaXR3aXNlQW5kIiwib3IiLCJPciIsIkxvd2VyIiwibG93ZXJFcXVhbHMiLCJMb3dlckVxdWFscyIsImJpZ2dlciIsIkJpZ2dlciIsImJpZ2dlckVxdWFscyIsIkJpZ2dlckVxdWFscyIsImlzQmxhbmsiLCJUWVBFRF9OVUxMX0VYUFIiLCJjYXN0IiwiQ2FzdEV4cHIiLCJ0b1N0bXQiLCJFeHByZXNzaW9uU3RhdGVtZW50IiwiQnVpbHRpbk1ldGhvZCIsIlJlYWRWYXJFeHByIiwiYnVpbHRpbiIsImlzQ29uc3RhbnQiLCJ2aXNpdEV4cHJlc3Npb24iLCJ2aXNpdFJlYWRWYXJFeHByIiwiV3JpdGVWYXJFeHByIiwiVHlwZW9mRXhwciIsImV4cHIiLCJ2aXNpdFR5cGVvZkV4cHIiLCJXcmFwcGVkTm9kZUV4cHIiLCJ2aXNpdFdyYXBwZWROb2RlRXhwciIsInZpc2l0V3JpdGVWYXJFeHByIiwidG9EZWNsU3RtdCIsIkRlY2xhcmVWYXJTdG10IiwidG9Db25zdERlY2wiLCJTdG10TW9kaWZpZXIiLCJGaW5hbCIsIldyaXRlS2V5RXhwciIsInJlY2VpdmVyIiwidmlzaXRXcml0ZUtleUV4cHIiLCJXcml0ZVByb3BFeHByIiwidmlzaXRXcml0ZVByb3BFeHByIiwidmlzaXRJbnZva2VNZXRob2RFeHByIiwidmlzaXRJbnZva2VGdW5jdGlvbkV4cHIiLCJjbGFzc0V4cHIiLCJ2aXNpdEluc3RhbnRpYXRlRXhwciIsIkxpdGVyYWxFeHByIiwidmlzaXRMaXRlcmFsRXhwciIsIkV4dGVybmFsRXhwciIsIm1vZHVsZU5hbWUiLCJ2aXNpdEV4dGVybmFsRXhwciIsIkV4dGVybmFsUmVmZXJlbmNlIiwiY29uZGl0aW9uIiwidmlzaXRDb25kaXRpb25hbEV4cHIiLCJOb3RFeHByIiwidmlzaXROb3RFeHByIiwiQXNzZXJ0Tm90TnVsbCIsInZpc2l0QXNzZXJ0Tm90TnVsbEV4cHIiLCJ2aXNpdENhc3RFeHByIiwiRm5QYXJhbSIsInBhcmFtIiwiRnVuY3Rpb25FeHByIiwic3RhdGVtZW50cyIsInZpc2l0RnVuY3Rpb25FeHByIiwiRGVjbGFyZUZ1bmN0aW9uU3RtdCIsIm9wZXJhdG9yIiwibGhzIiwidmlzaXRCaW5hcnlPcGVyYXRvckV4cHIiLCJ2aXNpdFJlYWRQcm9wRXhwciIsInZpc2l0UmVhZEtleUV4cHIiLCJMaXRlcmFsQXJyYXlFeHByIiwiZXZlcnkiLCJ2aXNpdExpdGVyYWxBcnJheUV4cHIiLCJMaXRlcmFsTWFwRW50cnkiLCJxdW90ZWQiLCJMaXRlcmFsTWFwRXhwciIsInZpc2l0TGl0ZXJhbE1hcEV4cHIiLCJDb21tYUV4cHIiLCJ2aXNpdENvbW1hRXhwciIsIk5VTExfRVhQUiIsIlRoaXMiLCJTdXBlciIsIkNhdGNoRXJyb3IiLCJDYXRjaFN0YWNrIiwiU3RhdGVtZW50Iiwic3RtdCIsInZpc2l0U3RhdGVtZW50IiwidmlzaXREZWNsYXJlVmFyU3RtdCIsInZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCIsInZpc2l0RXhwcmVzc2lvblN0bXQiLCJSZXR1cm5TdGF0ZW1lbnQiLCJ2aXNpdFJldHVyblN0bXQiLCJBYnN0cmFjdENsYXNzUGFydCIsIkNsYXNzRmllbGQiLCJpbml0aWFsaXplciIsIkNsYXNzTWV0aG9kIiwiQ2xhc3NHZXR0ZXIiLCJDbGFzc1N0bXQiLCJmaWVsZHMiLCJnZXR0ZXJzIiwiY29uc3RydWN0b3JNZXRob2QiLCJtZXRob2RzIiwidmlzaXREZWNsYXJlQ2xhc3NTdG10IiwiSWZTdG10IiwidmlzaXRJZlN0bXQiLCJKU0RvY0NvbW1lbnRTdG10IiwiQ29tbWVudFN0bXQiLCJtdWx0aWxpbmUiLCJ2aXNpdENvbW1lbnRTdG10IiwidmlzaXRKU0RvY0NvbW1lbnRTdG10Iiwic2VyaWFsaXplVGFncyIsIm91dCIsInRhZ3NfMSIsInRhZ3NfMV8xIiwidGFnIiwidGFnVG9TdHJpbmciLCJUcnlDYXRjaFN0bXQiLCJib2R5U3RtdHMiLCJjYXRjaFN0bXRzIiwidmlzaXRUcnlDYXRjaFN0bXQiLCJUaHJvd1N0bXQiLCJ2aXNpdFRocm93U3RtdCIsIkFzdFRyYW5zZm9ybWVyIiwidHJhbnNmb3JtRXhwciIsInRyYW5zZm9ybVN0bXQiLCJhc3QiLCJ2aXNpdEFsbEV4cHJlc3Npb25zIiwidmlzaXRBbGxTdGF0ZW1lbnRzIiwiZW50cnkiLCJtYXBUeXBlIiwiZXhwcnMiLCJjdG9yTWV0aG9kIiwic3RtdHMiLCJSZWN1cnNpdmVBc3RWaXNpdG9yIiwiZmluZFJlYWRWYXJOYW1lcyIsIl9SZWFkVmFyVmlzaXRvciIsInZhck5hbWVzIiwiX0ZpbmRFeHRlcm5hbFJlZmVyZW5jZXNWaXNpdG9yIiwiZXh0ZXJuYWxSZWZlcmVuY2VzIiwiYXBwbHlTb3VyY2VTcGFuVG9TdGF0ZW1lbnRJZk5lZWRlZCIsInRyYW5zZm9ybWVyIiwiX0FwcGx5U291cmNlU3BhblRyYW5zZm9ybWVyIiwiYXBwbHlTb3VyY2VTcGFuVG9FeHByZXNzaW9uSWZOZWVkZWQiLCJfY2xvbmUiLCJ2YXJpYWJsZSIsImltcG9ydEV4cHIiLCJpbXBvcnRUeXBlIiwidHlwZU1vZGlmaWVycyIsImV4cHJlc3Npb25UeXBlIiwibGl0ZXJhbEFyciIsImxpdGVyYWxNYXAiLCJpZlN0bXQiLCJ0aGVuQ2xhdXNlIiwiZWxzZUNsYXVzZSIsImxpdGVyYWwiLCJEQVNIX0NBU0VfUkVHRVhQIiwic3BsaXRBdENvbG9uIiwiZGVmYXVsdFZhbHVlcyIsIl9zcGxpdEF0IiwiY2hhcmFjdGVyIiwiY2hhcmFjdGVySW5kZXgiLCJ2aXNpdFZhbHVlIiwidmlzaXRBcnJheSIsImlzU3RyaWN0U3RyaW5nTWFwIiwiU1RSSU5HX01BUF9QUk9UTyIsInZpc2l0U3RyaW5nTWFwIiwidmlzaXRQcmltaXRpdmUiLCJ2aXNpdE90aGVyIiwiaXNEZWZpbmVkIiwidmFsIiwibm9VbmRlZmluZWQiLCJWYWx1ZVRyYW5zZm9ybWVyIiwiU3luY0FzeW5jIiwic3luY0FzeW5jVmFsdWVzIiwic3ludGF4RXJyb3IiLCJwYXJzZUVycm9ycyIsIkVSUk9SX1NZTlRBWF9FUlJPUiIsIkVSUk9SX1BBUlNFX0VSUk9SUyIsImVzY2FwZVJlZ0V4cCIsInV0ZjhFbmNvZGUiLCJlbmNvZGVkIiwiY29kZVBvaW50IiwibG93Iiwic3BsaXRzIiwiS0VZX0NPTlRFWFQiLCJGaXh1cEV4cHJlc3Npb24iLCJyZXNvbHZlZCIsIm9yaWdpbmFsIiwiZml4dXAiLCJleHByZXNzaW9uIiwic2hhcmVkIiwiQ29uc3RhbnRQb29sIiwibGl0ZXJhbHMiLCJsaXRlcmFsRmFjdG9yaWVzIiwiaW5qZWN0b3JEZWZpbml0aW9ucyIsImRpcmVjdGl2ZURlZmluaXRpb25zIiwiY29tcG9uZW50RGVmaW5pdGlvbnMiLCJwaXBlRGVmaW5pdGlvbnMiLCJuZXh0TmFtZUluZGV4IiwiZ2V0Q29uc3RMaXRlcmFsIiwiZm9yY2VTaGFyZWQiLCJrZXlPZiIsImZyZXNoTmFtZSIsImdldERlZmluaXRpb24iLCJraW5kIiwiY3R4IiwiZGVmaW5pdGlvbnMiLCJkZWZpbml0aW9uc09mIiwicHJvcGVydHkiLCJwcm9wZXJ0eU5hbWVPZiIsImdldExpdGVyYWxGYWN0b3J5IiwibGl0ZXJhbCQxIiwiYXJndW1lbnRzRm9yS2V5IiwiX2dldExpdGVyYWxGYWN0b3J5IiwiZXhwcmVzc2lvbkZvcktleSIsInJlc3VsdE1hcCIsImxpdGVyYWxGYWN0b3J5IiwibGl0ZXJhbEZhY3RvcnlBcmd1bWVudHMiLCJyZXN1bHRFeHByZXNzaW9ucyIsInB1cmVGdW5jdGlvbkRlY2xhcmF0aW9uIiwiaXNWYXJpYWJsZSIsInVuaXF1ZU5hbWUiLCJLZXlWaXNpdG9yIiwiaW52YWxpZCIsInF1b3RlIiwibWFwS2V5IiwiQ09SRSIsIklkZW50aWZpZXJzIiwiY3JlYXRlTW9kdWxlRmFjdG9yeSIsIm1vZHVsZVByb3ZpZGVyRGVmIiwiUmVnaXN0ZXJNb2R1bGVGYWN0b3J5Rm4iLCJpbmplY3QiLCJJbmplY3RhYmxlRGVmIiwiUmVuZGVyZXJUeXBlMiIsIlZpZXdEZWZpbml0aW9uIiwic2V0Q2xhc3NNZXRhZGF0YSIsImNyZWF0ZVRva2VuRm9yUmVmZXJlbmNlIiwicmVmZXJlbmNlIiwiY3JlYXRlVG9rZW5Gb3JFeHRlcm5hbFJlZmVyZW5jZSIsInJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZSIsIlN0YXRpY1N5bWJvbCIsImZpbGVQYXRoIiwiYXNzZXJ0Tm9NZW1iZXJzIiwiU3RhdGljU3ltYm9sQ2FjaGUiLCJjYWNoZSIsImRlY2xhcmF0aW9uRmlsZSIsIkhPU1RfUkVHX0VYUCIsInNhbml0aXplSWRlbnRpZmllciIsIkNvbXBpbGVTdW1tYXJ5S2luZCIsIl9hbm9ueW1vdXNUeXBlSW5kZXgiLCJpZGVudGlmaWVyTmFtZSIsImNvbXBpbGVJZGVudGlmaWVyIiwiaWRlbnRpZmllck1vZHVsZVVybCIsInZpZXdDbGFzc05hbWUiLCJjb21wVHlwZSIsImVtYmVkZGVkVGVtcGxhdGVJbmRleCIsInJlbmRlcmVyVHlwZU5hbWUiLCJjb21wb25lbnRGYWN0b3J5TmFtZSIsInRva2VuTmFtZSIsInRva2VuUmVmZXJlbmNlIiwiQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSIsInN0eWxlVXJscyIsIl9ub3JtYWxpemVBcnJheSIsIkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhIiwidGVtcGxhdGVVcmwiLCJodG1sQXN0IiwiZXh0ZXJuYWxTdHlsZXNoZWV0cyIsImFuaW1hdGlvbnMiLCJpbnRlcnBvbGF0aW9uIiwiaXNJbmxpbmUiLCJwcmVzZXJ2ZVdoaXRlc3BhY2VzIiwidG9TdW1tYXJ5IiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIiwiaXNIb3N0IiwiaG9zdExpc3RlbmVycyIsImhvc3RBdHRyaWJ1dGVzIiwidmlld1Byb3ZpZGVycyIsInZpZXdRdWVyaWVzIiwiZW50cnlDb21wb25lbnRzIiwiY29tcG9uZW50Vmlld1R5cGUiLCJpbnB1dHNNYXAiLCJiaW5kQ29uZmlnIiwib3V0cHV0c01hcCIsInN1bW1hcnlLaW5kIiwiQ29tcGlsZVBpcGVNZXRhZGF0YSIsIkNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhIiwiZGVjbGFyZWREaXJlY3RpdmVzIiwiZXhwb3J0ZWREaXJlY3RpdmVzIiwiZGVjbGFyZWRQaXBlcyIsImV4cG9ydGVkUGlwZXMiLCJpbXBvcnRlZE1vZHVsZXMiLCJleHBvcnRlZE1vZHVsZXMiLCJ0cmFuc2l0aXZlTW9kdWxlIiwiVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhIiwiZGlyZWN0aXZlc1NldCIsImV4cG9ydGVkRGlyZWN0aXZlc1NldCIsInBpcGVzU2V0IiwiZXhwb3J0ZWRQaXBlc1NldCIsIm1vZHVsZXNTZXQiLCJlbnRyeUNvbXBvbmVudHNTZXQiLCJhZGRQcm92aWRlciIsImFkZERpcmVjdGl2ZSIsImFkZEV4cG9ydGVkRGlyZWN0aXZlIiwiYWRkUGlwZSIsImFkZEV4cG9ydGVkUGlwZSIsImFkZE1vZHVsZSIsImFkZEVudHJ5Q29tcG9uZW50IiwiZWMiLCJQcm92aWRlck1ldGEiLCJmbGF0IiwiZmxhdEl0ZW0iLCJqaXRTb3VyY2VVcmwiLCJ0ZW1wbGF0ZVNvdXJjZVVybCIsImNvbXBNZXRhIiwidGVtcGxhdGVNZXRhIiwiQ09SRSQxIiwiSWRlbnRpZmllcnMkMSIsIk5FV19NRVRIT0QiLCJUUkFOU0ZPUk1fTUVUSE9EIiwiUEFUQ0hfREVQUyIsIm5hbWVzcGFjZUhUTUwiLCJuYW1lc3BhY2VNYXRoTUwiLCJuYW1lc3BhY2VTVkciLCJlbGVtZW50U3RhcnQiLCJlbGVtZW50RW5kIiwiZWxlbWVudFByb3BlcnR5Iiwic2VsZWN0IiwiY29tcG9uZW50SG9zdFN5bnRoZXRpY1Byb3BlcnR5IiwiY29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyIiwiZWxlbWVudEF0dHJpYnV0ZSIsImVsZW1lbnRDbGFzc1Byb3AiLCJlbGVtZW50Q29udGFpbmVyU3RhcnQiLCJlbGVtZW50Q29udGFpbmVyRW5kIiwiZWxlbWVudFN0eWxpbmciLCJlbGVtZW50U3R5bGluZ01hcCIsImVsZW1lbnRTdHlsZVByb3AiLCJlbGVtZW50U3R5bGluZ0FwcGx5IiwiZWxlbWVudEhvc3RBdHRycyIsImVsZW1lbnRIb3N0U3R5bGluZyIsImVsZW1lbnRIb3N0U3R5bGluZ01hcCIsImVsZW1lbnRIb3N0U3R5bGVQcm9wIiwiZWxlbWVudEhvc3RDbGFzc1Byb3AiLCJlbGVtZW50SG9zdFN0eWxpbmdBcHBseSIsImNvbnRhaW5lckNyZWF0ZSIsIm5leHRDb250ZXh0IiwidGVtcGxhdGVDcmVhdGUiLCJ0ZXh0QmluZGluZyIsImVuYWJsZUJpbmRpbmdzIiwiZGlzYWJsZUJpbmRpbmdzIiwiYWxsb2NIb3N0VmFycyIsImdldEN1cnJlbnRWaWV3IiwicmVzdG9yZVZpZXciLCJpbnRlcnBvbGF0aW9uMSIsImludGVycG9sYXRpb24yIiwiaW50ZXJwb2xhdGlvbjMiLCJpbnRlcnBvbGF0aW9uNCIsImludGVycG9sYXRpb241IiwiaW50ZXJwb2xhdGlvbjYiLCJpbnRlcnBvbGF0aW9uNyIsImludGVycG9sYXRpb244IiwiaW50ZXJwb2xhdGlvblYiLCJwdXJlRnVuY3Rpb24wIiwicHVyZUZ1bmN0aW9uMSIsInB1cmVGdW5jdGlvbjIiLCJwdXJlRnVuY3Rpb24zIiwicHVyZUZ1bmN0aW9uNCIsInB1cmVGdW5jdGlvbjUiLCJwdXJlRnVuY3Rpb242IiwicHVyZUZ1bmN0aW9uNyIsInB1cmVGdW5jdGlvbjgiLCJwdXJlRnVuY3Rpb25WIiwicGlwZUJpbmQxIiwicGlwZUJpbmQyIiwicGlwZUJpbmQzIiwicGlwZUJpbmQ0IiwicGlwZUJpbmRWIiwicHJvcGVydHlJbnRlcnBvbGF0ZSIsInByb3BlcnR5SW50ZXJwb2xhdGUxIiwicHJvcGVydHlJbnRlcnBvbGF0ZTIiLCJwcm9wZXJ0eUludGVycG9sYXRlMyIsInByb3BlcnR5SW50ZXJwb2xhdGU0IiwicHJvcGVydHlJbnRlcnBvbGF0ZTUiLCJwcm9wZXJ0eUludGVycG9sYXRlNiIsInByb3BlcnR5SW50ZXJwb2xhdGU3IiwicHJvcGVydHlJbnRlcnBvbGF0ZTgiLCJwcm9wZXJ0eUludGVycG9sYXRlViIsImkxOG4iLCJpMThuQXR0cmlidXRlcyIsImkxOG5FeHAiLCJpMThuU3RhcnQiLCJpMThuRW5kIiwiaTE4bkFwcGx5IiwiaTE4blBvc3Rwcm9jZXNzIiwiaTE4bkxvY2FsaXplIiwicHJvamVjdGlvbkRlZiIsImluamVjdEF0dHJpYnV0ZSIsImRpcmVjdGl2ZUluamVjdCIsInRlbXBsYXRlUmVmRXh0cmFjdG9yIiwicmVzb2x2ZVdpbmRvdyIsInJlc29sdmVEb2N1bWVudCIsInJlc29sdmVCb2R5IiwiZGVmaW5lQmFzZSIsIkJhc2VEZWYiLCJkZWZpbmVDb21wb25lbnQiLCJzZXRDb21wb25lbnRTY29wZSIsIkNvbXBvbmVudERlZldpdGhNZXRhIiwiZGVmaW5lRGlyZWN0aXZlIiwiRGlyZWN0aXZlRGVmV2l0aE1ldGEiLCJJbmplY3RvckRlZiIsImRlZmluZUluamVjdG9yIiwiTmdNb2R1bGVEZWZXaXRoTWV0YSIsImRlZmluZU5nTW9kdWxlIiwic2V0TmdNb2R1bGVTY29wZSIsIlBpcGVEZWZXaXRoTWV0YSIsImRlZmluZVBpcGUiLCJxdWVyeVJlZnJlc2giLCJzdGF0aWNWaWV3UXVlcnkiLCJzdGF0aWNDb250ZW50UXVlcnkiLCJsb2FkVmlld1F1ZXJ5IiwiY29udGVudFF1ZXJ5IiwibG9hZENvbnRlbnRRdWVyeSIsIk5nT25DaGFuZ2VzRmVhdHVyZSIsIkluaGVyaXREZWZpbml0aW9uRmVhdHVyZSIsIlByb3ZpZGVyc0ZlYXR1cmUiLCJnZXRGYWN0b3J5T2YiLCJnZXRJbmhlcml0ZWRGYWN0b3J5IiwicmVnaXN0ZXJOZ01vZHVsZVR5cGUiLCJzYW5pdGl6ZUh0bWwiLCJzYW5pdGl6ZVN0eWxlIiwiZGVmYXVsdFN0eWxlU2FuaXRpemVyIiwic2FuaXRpemVSZXNvdXJjZVVybCIsInNhbml0aXplU2NyaXB0Iiwic2FuaXRpemVVcmwiLCJzYW5pdGl6ZVVybE9yUmVzb3VyY2VVcmwiLCJUZXh0IiwidmlzaXQiLCJ2aXNpdFRleHQiLCJCb3VuZFRleHQiLCJ2aXNpdEJvdW5kVGV4dCIsIlRleHRBdHRyaWJ1dGUiLCJ2YWx1ZVNwYW4iLCJ2aXNpdFRleHRBdHRyaWJ1dGUiLCJCb3VuZEF0dHJpYnV0ZSIsImZyb21Cb3VuZEVsZW1lbnRQcm9wZXJ0eSIsInZpc2l0Qm91bmRBdHRyaWJ1dGUiLCJCb3VuZEV2ZW50IiwiaGFuZGxlciIsInBoYXNlIiwiaGFuZGxlclNwYW4iLCJmcm9tUGFyc2VkRXZlbnQiLCJ0YXJnZXRPclBoYXNlIiwidmlzaXRCb3VuZEV2ZW50IiwiRWxlbWVudCIsInN0YXJ0U291cmNlU3BhbiIsImVuZFNvdXJjZVNwYW4iLCJ2aXNpdEVsZW1lbnQiLCJUZW1wbGF0ZSIsInRlbXBsYXRlQXR0cnMiLCJ2YXJpYWJsZXMiLCJ2aXNpdFRlbXBsYXRlIiwiQ29udGVudCIsInZpc2l0Q29udGVudCIsIlZhcmlhYmxlIiwidmlzaXRWYXJpYWJsZSIsIlJlZmVyZW5jZSIsInZpc2l0UmVmZXJlbmNlIiwiSWN1IiwicGxhY2Vob2xkZXJzIiwidmlzaXRJY3UiLCJ2aXNpdEFsbCIsIm5vZGVzXzEiLCJub2Rlc18xXzEiLCJuZXdOb2RlIiwibm9kZXNfMiIsIm5vZGVzXzJfMSIsIk1lc3NhZ2UiLCJwbGFjZWhvbGRlclRvTWVzc2FnZSIsIm1lYW5pbmciLCJkZXNjcmlwdGlvbiIsInNvdXJjZXMiLCJmaWxlIiwic3RhcnRMaW5lIiwibGluZSIsInN0YXJ0Q29sIiwiY29sIiwiZW5kTGluZSIsImVuZENvbCIsIlRleHQkMSIsIkNvbnRhaW5lciIsInZpc2l0Q29udGFpbmVyIiwiSWN1JDEiLCJjYXNlcyIsIlRhZ1BsYWNlaG9sZGVyIiwic3RhcnROYW1lIiwiY2xvc2VOYW1lIiwidmlzaXRUYWdQbGFjZWhvbGRlciIsIlBsYWNlaG9sZGVyIiwidmlzaXRQbGFjZWhvbGRlciIsIkljdVBsYWNlaG9sZGVyIiwidmlzaXRJY3VQbGFjZWhvbGRlciIsIkNsb25lVmlzaXRvciIsImljdSIsImV4cHJlc3Npb25QbGFjZWhvbGRlciIsInBoIiwiUmVjdXJzZVZpc2l0b3IiLCJkaWdlc3QiLCJzaGExIiwidXRmOCIsIndvcmRzMzIiLCJzdHJpbmdUb1dvcmRzMzIiLCJlbmRpYW4iLCJ3b3JkQXQiLCJFbmRpYW4iLCJCaWciLCJ3IiwiaDAiLCJoMSIsImgyIiwiaDMiLCJoNCIsInJvbDMyIiwiZmsiLCJ0ZW1wIiwiYWRkMzIiLCJieXRlU3RyaW5nVG9IZXhTdHJpbmciLCJoZXgiLCJieXRlQXQiLCJ3b3JkczMyVG9CeXRlU3RyaW5nIiwic2VyaWFsaXplTm9kZXMiLCJzZXJpYWxpemVyVmlzaXRvciIsImRlY2ltYWxEaWdlc3QiLCJfU2VyaWFsaXplcklnbm9yZUljdUV4cFZpc2l0b3IiLCJjb21wdXRlTXNnSWQiLCJmaW5nZXJwcmludCIsImhpIiwibG8iLCJoaW0iLCJsb20iLCJhZGQ2NCIsImFoIiwiYWwiLCJiaCIsImJsIiwiYWRkMzJ0bzY0IiwiY2FycnkiLCJsIiwicm9sNjQiLCJieXRlU3RyaW5nVG9EZWNTdHJpbmciLCJkZWNpbWFsIiwidG9UaGVQb3dlciIsImFkZEJpZ0ludCIsIm51bWJlclRpbWVzQmlnSW50IiwiX1NlcmlhbGl6ZXJWaXNpdG9yIiwic3RyQ2FzZXMiLCJoYXNoMzIiLCJMaXR0bGUiLCJtaXgiLCJzdWIzMiIsImhpZ2giLCJ3b3JkIiwid29yZDMyVG9CeXRlU3RyaW5nIiwieCIsInkiLCJzdW0iLCJtYXgiLCJ0bXBTdW0iLCJudW0iLCJwcm9kdWN0IiwiYlRvVGhlUG93ZXIiLCJTZXJpYWxpemVyIiwiY3JlYXRlTmFtZU1hcHBlciIsIlNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyIiwibWFwTmFtZSIsImludGVybmFsVG9QdWJsaWMiLCJwdWJsaWNUb05leHRJZCIsInB1YmxpY1RvSW50ZXJuYWwiLCJ0b1B1YmxpY05hbWUiLCJpbnRlcm5hbE5hbWUiLCJ0b0ludGVybmFsTmFtZSIsInZpc2l0UGxhY2Vob2xkZXJOYW1lIiwibmV4dElkIiwiX3Zpc2l0b3IiLCJfVmlzaXRvciIsInZpc2l0VGFnIiwic3RyQXR0cnMiLCJfc2VyaWFsaXplQXR0cmlidXRlcyIsInN0ckNoaWxkcmVuIiwidmlzaXREZWNsYXJhdGlvbiIsImRlY2wiLCJ2aXNpdERvY3R5cGUiLCJkb2N0eXBlIiwicm9vdFRhZyIsImR0ZCIsInNlcmlhbGl6ZSIsIkRlY2xhcmF0aW9uIiwidW5lc2NhcGVkQXR0cnMiLCJlc2NhcGVYbWwiLCJEb2N0eXBlIiwiVGFnIiwiVGV4dCQyIiwidW5lc2NhcGVkVmFsdWUiLCJDUiIsIndzIiwiX0VTQ0FQRURfQ0hBUlMiLCJYbWIiLCJ3cml0ZSIsIm1lc3NhZ2VzIiwiZXhhbXBsZVZpc2l0b3IiLCJFeGFtcGxlVmlzaXRvciIsIl9WaXNpdG9yJDEiLCJyb290Tm9kZSIsInNvdXJjZVRhZ3MiLCJ2ZXJzaW9uIiwiZW5jb2RpbmciLCJhZGREZWZhdWx0RXhhbXBsZXMiLCJkaWdlc3QkMSIsInN0YXJ0VGFnQXNUZXh0Iiwic3RhcnRFeCIsInN0YXJ0VGFnUGgiLCJjbG9zZVRhZ0FzVGV4dCIsImNsb3NlRXgiLCJjbG9zZVRhZ1BoIiwiaW50ZXJwb2xhdGlvbkFzVGV4dCIsImV4VGFnIiwiaWN1RXhwcmVzc2lvbiIsImljdVR5cGUiLCJpY3VDYXNlcyIsImljdUFzVGV4dCIsImV4VGV4dCIsInRvVXBwZXJDYXNlIiwibWFwTGl0ZXJhbCIsIkNMT1NVUkVfVFJBTlNMQVRJT05fUFJFRklYIiwiR09PR19HRVRfTVNHIiwiTkdfSTE4Tl9DTE9TVVJFX01PREUiLCJJMThOX01FQU5JTkdfU0VQQVJBVE9SIiwiSTE4Tl9JRF9TRVBBUkFUT1IiLCJJMThOX0FUVFIiLCJJMThOX0FUVFJfUFJFRklYIiwiSTE4Tl9QTEFDRUhPTERFUl9TWU1CT0wiLCJpMThuVHJhbnNsYXRpb25Ub0RlY2xTdG10IiwidmFyaWFibGUkMSIsImNsb3N1cmVWYXIiLCJkb2NTdGF0ZW1lbnRzIiwiaTE4bk1ldGFUb0RvY1N0bXQiLCJ0aGVuU3RhdGVtZW50cyIsImdvb2dGbkNhbGwiLCJsb2NhbGl6ZUZuQ2FsbCIsImVsc2VTdGF0ZW1lbnRzIiwiaXNJMThuQXR0cmlidXRlIiwic3RhcnRzV2l0aCIsImlzSTE4blJvb3ROb2RlIiwiaXNTaW5nbGVJMThuSWN1IiwibWV0YUZyb21JMThuTWVzc2FnZSIsImljdUZyb21JMThuTWVzc2FnZSIsIndyYXBJMThuUGxhY2Vob2xkZXIiLCJjb250ZXh0SWQiLCJnZXRTZXFOdW1iZXJHZW5lcmF0b3IiLCJzdGFydHNBdCIsInBsYWNlaG9sZGVyc1RvUGFyYW1zIiwidXBkYXRlUGxhY2Vob2xkZXJNYXAiLCJhc3NlbWJsZUJvdW5kVGV4dFBsYWNlaG9sZGVycyIsInN0YXJ0SWR4IiwiaWR4IiwiZm9ybWF0STE4blBsYWNlaG9sZGVyTmFtZSIsInBvc3RmaXgiLCJjaHVua3MiLCJyYXciLCJzaGlmdCIsImdldFRyYW5zbGF0aW9uQ29uc3RQcmVmaXgiLCJleHRyYSIsIlVOU0FGRV9PQkpFQ1RfS0VZX05BTUVfUkVHRVhQIiwiVEVNUE9SQVJZX05BTUUiLCJDT05URVhUX05BTUUiLCJSRU5ERVJfRkxBR1MiLCJ0ZW1wb3JhcnlBbGxvY2F0b3IiLCJ1bnN1cHBvcnRlZCIsImludmFsaWQkMSIsImFzTGl0ZXJhbCIsImNvbmRpdGlvbmFsbHlDcmVhdGVNYXBPYmplY3RMaXRlcmFsIiwia2VlcERlY2xhcmVkIiwibWFwVG9FeHByZXNzaW9uIiwibWluaWZpZWROYW1lIiwidHJpbVRyYWlsaW5nTnVsbHMiLCJleHAiLCJnZXRRdWVyeVByZWRpY2F0ZSIsImNvbnN0YW50UG9vbCIsInByZWRpY2F0ZV8xIiwiUjNGYWN0b3J5RGVsZWdhdGVUeXBlIiwiRGVmaW5pdGlvbk1hcCIsInRvTGl0ZXJhbE1hcCIsImdldEF0dHJzRm9yRGlyZWN0aXZlTWF0Y2hpbmciLCJlbE9yVHBsIiwiYXR0cmlidXRlc01hcCIsImNvbXBpbGVGYWN0b3J5RnVuY3Rpb24iLCJ0eXBlRm9yQ3RvciIsImlzRGVsZWdhdGVkTWV0YWRhdGEiLCJjdG9yRXhwciIsImluamVjdERlcGVuZGVuY2llcyIsImluamVjdEZuIiwiYmFzZUZhY3RvcnkiLCJiYXNlRmFjdG9yeVN0bXQiLCJFeHBvcnRlZCIsImN0b3JFeHByRmluYWwiLCJyZXRFeHByIiwibWFrZUNvbmRpdGlvbmFsRmFjdG9yeSIsIm5vbkN0b3JFeHByIiwiY3RvclN0bXQiLCJtYWtlRXJyb3JTdG10IiwiZGVsZWdhdGVUeXBlIiwiRmFjdG9yeSIsImRlbGVnYXRlRmFjdG9yeSIsImRlbGVnYXRlRmFjdG9yeVN0bXQiLCJkZWxlZ2F0ZUFyZ3MiLCJkZWxlZ2F0ZURlcHMiLCJDbGFzcyIsImlzRXhwcmVzc2lvbkZhY3RvcnlNZXRhZGF0YSIsImNvbXBpbGVJbmplY3REZXBlbmRlbmN5IiwiVG9rZW4iLCJza2lwU2VsZiIsImRlcGVuZGVuY2llc0Zyb21HbG9iYWxNZXRhZGF0YSIsIm91dHB1dEN0eCIsImRpRGVwcyIsImRlcGVuZGVuY3kiLCJ0b2tlblJlZiIsImlzQXR0cmlidXRlIiwiaXNPcHRpb25hbCIsImlzU2VsZiIsImlzU2tpcFNlbGYiLCJtYXBUb01hcEV4cHJlc3Npb24iLCJjb252ZXJ0TWV0YVRvT3V0cHV0IiwidHlwZVdpdGhQYXJhbWV0ZXJzIiwibnVtUGFyYW1zIiwiQU5JTUFURV9TWU1CT0xfUFJFRklYIiwicHJlcGFyZVN5bnRoZXRpY1Byb3BlcnR5TmFtZSIsInByZXBhcmVTeW50aGV0aWNMaXN0ZW5lckZ1bmN0aW9uTmFtZSIsImFzc2VydEFycmF5T2ZTdHJpbmdzIiwiVU5VU0FCTEVfSU5URVJQT0xBVElPTl9SRUdFWFBTIiwiYXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHMiLCJzdGFydF8xIiwiZW5kXzEiLCJyZWdleHAiLCJJbnRlcnBvbGF0aW9uQ29uZmlnIiwiZnJvbUFycmF5IiwibWFya2VycyIsIkRFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUciLCJTb3VyY2VNYXBHZW5lcmF0b3IiLCJzb3VyY2VzQ29udGVudCIsImxpbmVzIiwibGFzdENvbDAiLCJoYXNNYXBwaW5ncyIsImFkZFNvdXJjZSIsImFkZExpbmUiLCJhZGRNYXBwaW5nIiwiY29sMCIsInNvdXJjZVVybCIsInNvdXJjZUxpbmUwIiwic291cmNlQ29sMCIsImN1cnJlbnRMaW5lIiwidG9KU09OIiwic291cmNlc0luZGV4IiwibWFwcGluZ3MiLCJsYXN0U291cmNlSW5kZXgiLCJsYXN0U291cmNlTGluZTAiLCJsYXN0U291cmNlQ29sMCIsInNlZ21lbnRzIiwic2VnbWVudCIsInNlZ0FzU3RyIiwidG9CYXNlNjRWTFEiLCJ0b0pzQ29tbWVudCIsInRvQmFzZTY0U3RyaW5nIiwiYjY0IiwiaTEiLCJpMiIsImkzIiwidG9CYXNlNjREaWdpdCIsImRpZ2l0IiwiQjY0X0RJR0lUUyIsIl9TSU5HTEVfUVVPVEVfRVNDQVBFX1NUUklOR19SRSIsIl9MRUdBTF9JREVOVElGSUVSX1JFIiwiX0lOREVOVF9XSVRIIiwiQ0FUQ0hfRVJST1JfVkFSJDEiLCJDQVRDSF9TVEFDS19WQVIkMSIsIl9FbWl0dGVkTGluZSIsImluZGVudCIsInBhcnRzTGVuZ3RoIiwic3JjU3BhbnMiLCJFbWl0dGVyVmlzaXRvckNvbnRleHQiLCJfaW5kZW50IiwiX2NsYXNzZXMiLCJfcHJlYW1ibGVMaW5lQ291bnQiLCJfbGluZXMiLCJjcmVhdGVSb290IiwicHJpbnRsbiIsImxhc3RQYXJ0IiwicHJpbnQiLCJsaW5lSXNFbXB0eSIsIl9jdXJyZW50TGluZSIsImxpbmVMZW5ndGgiLCJwYXJ0IiwibmV3TGluZSIsInJlbW92ZUVtcHR5TGFzdExpbmUiLCJpbmNJbmRlbnQiLCJkZWNJbmRlbnQiLCJwdXNoQ2xhc3MiLCJjbGF6eiIsInBvcENsYXNzIiwidG9Tb3VyY2UiLCJzb3VyY2VMaW5lcyIsIl9jcmVhdGVJbmRlbnQiLCJ0b1NvdXJjZU1hcEdlbmVyYXRvciIsImdlbkZpbGVQYXRoIiwic3RhcnRzQXRMaW5lIiwiZmlyc3RPZmZzZXRNYXBwZWQiLCJtYXBGaXJzdE9mZnNldElmTmVlZGVkIiwibGluZUlkeCIsInNwYW5zIiwic3BhbklkeCIsInNwYW4iLCJzb3VyY2VMaW5lIiwic291cmNlQ29sIiwic2V0UHJlYW1ibGVMaW5lQ291bnQiLCJzcGFuT2YiLCJjb2x1bW4iLCJlbWl0dGVkTGluZSIsImNvbHVtbnNMZWZ0IiwicGFydEluZGV4IiwiQWJzdHJhY3RFbWl0dGVyVmlzaXRvciIsIl9lc2NhcGVEb2xsYXJJblN0cmluZ3MiLCJoYXNFbHNlQ2FzZSIsImxpbmVXYXNFbXB0eSIsImdldEJ1aWx0aW5NZXRob2ROYW1lIiwidmFyTmFtZSIsImVzY2FwZUlkZW50aWZpZXIiLCJvcFN0ciIsInZpc2l0QWxsT2JqZWN0cyIsImV4cHJlc3Npb25zIiwic2VwYXJhdG9yIiwiaW5jcmVtZW50ZWRJbmRlbnQiLCJlc2NhcGVEb2xsYXIiLCJhbHdheXNRdW90ZSIsIkFic3RyYWN0SnNFbWl0dGVyVmlzaXRvciIsIl92aXNpdENsYXNzQ29uc3RydWN0b3IiLCJfdmlzaXRDbGFzc0dldHRlciIsIl92aXNpdENsYXNzTWV0aG9kIiwiX3Zpc2l0UGFyYW1zIiwiZm5FeHByIiwiY3VycmVudENsYXNzIiwiQ29uY2F0QXJyYXkiLCJTdWJzY3JpYmVPYnNlcnZhYmxlIiwiQmluZCIsIkppdEV2YWx1YXRvciIsImV2YWx1YXRlU3RhdGVtZW50cyIsImNyZWF0ZVNvdXJjZU1hcHMiLCJjb252ZXJ0ZXIiLCJKaXRFbWl0dGVyVmlzaXRvciIsImlzVXNlU3RyaWN0U3RhdGVtZW50Iiwic3RhdGVtZW50IiwiY3JlYXRlUmV0dXJuU3RtdCIsImV2YWx1YXRlQ29kZSIsImdldEFyZ3MiLCJjcmVhdGVTb3VyY2VNYXAiLCJmbkJvZHkiLCJmbkFyZ05hbWVzIiwiZm5BcmdWYWx1ZXMiLCJhcmdOYW1lIiwiZW1wdHlGbiIsImhlYWRlckxpbmVzIiwiZXhlY3V0ZUZ1bmN0aW9uIiwiX2V2YWxBcmdOYW1lcyIsIl9ldmFsQXJnVmFsdWVzIiwiX2V2YWxFeHBvcnRlZFZhcnMiLCJyZXN1bHRWYXIiLCJfZW1pdFJlZmVyZW5jZVRvRXh0ZXJuYWwiLCIkRU9GIiwiJFRBQiIsIiRMRiIsIiRWVEFCIiwiJEZGIiwiJENSIiwiJFNQQUNFIiwiJERRIiwiJCQiLCIkU1EiLCIkUExVUyIsIiRNSU5VUyIsIiRTTEFTSCIsIiRTRU1JQ09MT04iLCIkRVEiLCIkR1QiLCIkMCIsIiQ3IiwiJDkiLCIkQSIsIiRFIiwiJEYiLCIkWiIsIiRfIiwiJGEiLCIkZSIsIiRmIiwiJG4iLCIkciIsIiR0IiwiJHYiLCIkeiIsIiROQlNQIiwiJEJUIiwiaXNXaGl0ZXNwYWNlIiwiaXNEaWdpdCIsImlzQXNjaWlMZXR0ZXIiLCJpc05ld0xpbmUiLCJpc09jdGFsRGlnaXQiLCJQYXJzZUVycm9yTGV2ZWwiLCJQYXJzZUxvY2F0aW9uIiwibW92ZUJ5IiwiZGVsdGEiLCJjaCIsInByaW9yTGluZSIsImxhc3RJbmRleE9mIiwibWF4Q2hhcnMiLCJtYXhMaW5lcyIsInN0YXJ0T2Zmc2V0IiwiZW5kT2Zmc2V0IiwiY3R4Q2hhcnMiLCJjdHhMaW5lcyIsImFmdGVyIiwiUGFyc2VTb3VyY2VGaWxlIiwiUGFyc2VTb3VyY2VTcGFuIiwiZGV0YWlscyIsIlBhcnNlRXJyb3IiLCJsZXZlbCIsIkVSUk9SIiwiY29udGV4dHVhbE1lc3NhZ2UiLCJSM0ppdFJlZmxlY3RvciIsInNoYWxsb3dBbm5vdGF0aW9ucyIsInRyeUFubm90YXRpb25zIiwiY29tcG9uZW50TW9kdWxlVXJsIiwiY21wTWV0YWRhdGEiLCJjb21waWxlTmdNb2R1bGUiLCJkZWNsYXJhdGlvbnMiLCJjb250YWluc0ZvcndhcmREZWNscyIsImVtaXRJbmxpbmUiLCJhZGRpdGlvbmFsU3RhdGVtZW50cyIsImRlZmluaXRpb25NYXAiLCJyZWZzVG9BcnJheSIsInNldE5nTW9kdWxlU2NvcGVDYWxsIiwiZ2VuZXJhdGVTZXROZ01vZHVsZVNjb3BlQ2FsbCIsInNjb3BlTWFwIiwidHVwbGVUeXBlT2YiLCJ0eXBlb2ZFeHByIiwicmVmcyIsInNob3VsZEZvcndhcmREZWNsYXJlIiwiY29tcGlsZVBpcGVGcm9tTWV0YWRhdGEiLCJkZWZpbml0aW9uTWFwVmFsdWVzIiwicGlwZU5hbWUiLCJ0eXBlQXJndW1lbnRDb3VudCIsIlBhcnNlckVycm9yIiwiZXJyTG9jYXRpb24iLCJjdHhMb2NhdGlvbiIsIlBhcnNlU3BhbiIsIkFTVCIsIlF1b3RlIiwidW5pbnRlcnByZXRlZEV4cHJlc3Npb24iLCJ2aXNpdFF1b3RlIiwiRW1wdHlFeHByIiwiSW1wbGljaXRSZWNlaXZlciIsInZpc2l0SW1wbGljaXRSZWNlaXZlciIsIkNoYWluIiwidmlzaXRDaGFpbiIsIkNvbmRpdGlvbmFsIiwidHJ1ZUV4cCIsImZhbHNlRXhwIiwidmlzaXRDb25kaXRpb25hbCIsIlByb3BlcnR5UmVhZCIsInZpc2l0UHJvcGVydHlSZWFkIiwiUHJvcGVydHlXcml0ZSIsInZpc2l0UHJvcGVydHlXcml0ZSIsIlNhZmVQcm9wZXJ0eVJlYWQiLCJ2aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJLZXllZFJlYWQiLCJ2aXNpdEtleWVkUmVhZCIsIktleWVkV3JpdGUiLCJ2aXNpdEtleWVkV3JpdGUiLCJCaW5kaW5nUGlwZSIsInZpc2l0UGlwZSIsIkxpdGVyYWxQcmltaXRpdmUiLCJ2aXNpdExpdGVyYWxQcmltaXRpdmUiLCJMaXRlcmFsQXJyYXkiLCJ2aXNpdExpdGVyYWxBcnJheSIsIkxpdGVyYWxNYXAiLCJ2aXNpdExpdGVyYWxNYXAiLCJJbnRlcnBvbGF0aW9uIiwic3RyaW5ncyIsInZpc2l0SW50ZXJwb2xhdGlvbiIsIkJpbmFyeSIsIm9wZXJhdGlvbiIsImxlZnQiLCJyaWdodCIsInZpc2l0QmluYXJ5IiwiUHJlZml4Tm90IiwidmlzaXRQcmVmaXhOb3QiLCJOb25OdWxsQXNzZXJ0IiwidmlzaXROb25OdWxsQXNzZXJ0IiwiTWV0aG9kQ2FsbCIsInZpc2l0TWV0aG9kQ2FsbCIsIlNhZmVNZXRob2RDYWxsIiwidmlzaXRTYWZlTWV0aG9kQ2FsbCIsIkZ1bmN0aW9uQ2FsbCIsInZpc2l0RnVuY3Rpb25DYWxsIiwiQVNUV2l0aFNvdXJjZSIsImVycm9ycyIsIlRlbXBsYXRlQmluZGluZyIsImtleUlzVmFyIiwiUmVjdXJzaXZlQXN0VmlzaXRvciQxIiwiTnVsbEFzdFZpc2l0b3IiLCJhc3RzIiwiQXN0VHJhbnNmb3JtZXIkMSIsIkFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyIiwibW9kaWZpZWQiLCJQYXJzZWRQcm9wZXJ0eVR5cGUiLCJQYXJzZWRQcm9wZXJ0eSIsImlzTGl0ZXJhbCIsIkxJVEVSQUxfQVRUUiIsImlzQW5pbWF0aW9uIiwiQU5JTUFUSU9OIiwiUGFyc2VkRXZlbnQiLCJQYXJzZWRWYXJpYWJsZSIsIkJvdW5kRWxlbWVudFByb3BlcnR5IiwiRXZlbnRIYW5kbGVyVmFycyIsIkNvbnZlcnRBY3Rpb25CaW5kaW5nUmVzdWx0IiwiYWxsb3dEZWZhdWx0IiwicmVuZGVyM1N0bXRzIiwiY29udmVydEFjdGlvbkJpbmRpbmciLCJsb2NhbFJlc29sdmVyIiwiaW1wbGljaXRSZWNlaXZlciIsImJpbmRpbmdJZCIsImludGVycG9sYXRpb25GdW5jdGlvbiIsImJhc2VTb3VyY2VTcGFuIiwiRGVmYXVsdExvY2FsUmVzb2x2ZXIiLCJhY3Rpb25XaXRob3V0QnVpbHRpbnMiLCJjb252ZXJ0UHJvcGVydHlCaW5kaW5nQnVpbHRpbnMiLCJjcmVhdGVMaXRlcmFsQXJyYXlDb252ZXJ0ZXIiLCJjcmVhdGVMaXRlcmFsTWFwQ29udmVydGVyIiwiY3JlYXRlUGlwZUNvbnZlcnRlciIsIl9Bc3RUb0lyVmlzaXRvciIsImFjdGlvblN0bXRzIiwiZmxhdHRlblN0YXRlbWVudHMiLCJfTW9kZSIsInByZXBlbmRUZW1wb3JhcnlEZWNscyIsInRlbXBvcmFyeUNvdW50IiwidGVtcG9yYXJ5RGVjbGFyYXRpb24iLCJ1c2VzSW1wbGljaXRSZWNlaXZlciIsIm5vdGlmeUltcGxpY2l0UmVjZWl2ZXJVc2UiLCJwcmV2ZW50RGVmYXVsdFZhciIsInJldHVybkV4cHIiLCJjb252ZXJ0U3RtdEludG9FeHByZXNzaW9uIiwiY3JlYXRlUHJldmVudERlZmF1bHRWYXIiLCJjb252ZXJ0ZXJGYWN0b3J5IiwiY29udmVydEJ1aWx0aW5zIiwiX0J1aWx0aW5Bc3RDb252ZXJ0ZXIiLCJCaW5kaW5nRm9ybSIsIkNvbnZlcnRQcm9wZXJ0eUJpbmRpbmdSZXN1bHQiLCJjdXJyVmFsRXhwciIsImNvbnZlcnRQcm9wZXJ0eUJpbmRpbmciLCJleHByZXNzaW9uV2l0aG91dEJ1aWx0aW5zIiwiZm9ybSIsImNyZWF0ZUN1cnJWYWx1ZUV4cHIiLCJvdXRwdXRFeHByIiwiZ2V0U3RhdGVtZW50c0Zyb21WaXNpdG9yIiwiVHJ5U2ltcGxlIiwidGVtcG9yYXJ5TmFtZSIsInRlbXBvcmFyeU51bWJlciIsImVuc3VyZUV4cHJlc3Npb25Nb2RlIiwiY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQiLCJfY29udmVydGVyRmFjdG9yeSIsIkJ1aWx0aW5GdW5jdGlvbkNhbGwiLCJfbG9jYWxSZXNvbHZlciIsIl9pbXBsaWNpdFJlY2VpdmVyIiwiX25vZGVNYXAiLCJfcmVzdWx0TWFwIiwiX2N1cnJlbnRUZW1wb3JhcnkiLCJvcCIsIl92aXNpdCIsImNvbnZlcnRTb3VyY2VTcGFuIiwiZW5zdXJlU3RhdGVtZW50TW9kZSIsImNvbnZlcnRlZEFyZ3MiLCJsZWZ0TW9zdFNhZmUiLCJsZWZ0TW9zdFNhZmVOb2RlIiwiY29udmVydFNhZmVBY2Nlc3MiLCJfZ2V0TG9jYWwiLCJnZXRMb2NhbCIsInByZXZVc2VzSW1wbGljaXRSZWNlaXZlciIsInZhckV4cHIiLCJub3QiLCJhc3NlcnROb3ROdWxsIiwibG9jYWxFeHByIiwiZ3VhcmRlZEV4cHJlc3Npb24iLCJ0ZW1wb3JhcnkiLCJuZWVkc1RlbXBvcmFyeSIsImFsbG9jYXRlVGVtcG9yYXJ5IiwiYWNjZXNzIiwicmVsZWFzZVRlbXBvcmFyeSIsInZpc2l0U29tZSIsInRlbXBOdW1iZXIiLCJTaGFkb3dDc3MiLCJzdHJpY3RTdHlsaW5nIiwic2hpbUNzc1RleHQiLCJjc3NUZXh0IiwiaG9zdFNlbGVjdG9yIiwiY29tbWVudHNXaXRoSGFzaCIsImV4dHJhY3RDb21tZW50c1dpdGhIYXNoIiwiX2NvbW1lbnRXaXRoSGFzaFJlIiwic3RyaXBDb21tZW50cyIsIl9jb21tZW50UmUiLCJfaW5zZXJ0RGlyZWN0aXZlcyIsInNjb3BlZENzc1RleHQiLCJfc2NvcGVDc3NUZXh0IiwiX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dCIsIl9pbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0IiwiX2Nzc0NvbnRlbnROZXh0U2VsZWN0b3JSZSIsIl9jc3NDb250ZW50UnVsZVJlIiwicnVsZSIsInNjb3BlU2VsZWN0b3IiLCJ1bnNjb3BlZFJ1bGVzIiwiX2V4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQiLCJfaW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0IiwiX2NvbnZlcnRDb2xvbkhvc3QiLCJfY29udmVydENvbG9uSG9zdENvbnRleHQiLCJfY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyIsIl9zY29wZVNlbGVjdG9ycyIsIl9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUiLCJfY29udmVydENvbG9uUnVsZSIsIl9jc3NDb2xvbkhvc3RSZSIsIl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIiLCJfY3NzQ29sb25Ib3N0Q29udGV4dFJlIiwiX2NvbG9uSG9zdENvbnRleHRQYXJ0UmVwbGFjZXIiLCJyZWdFeHAiLCJwYXJ0UmVwbGFjZXIiLCJfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yIiwiX3BvbHlmaWxsSG9zdCIsIl9zaGFkb3dET01TZWxlY3RvcnNSZSIsInBhdHRlcm4iLCJwcm9jZXNzUnVsZXMiLCJydWxlQ2FsbGJhY2siLCJpbnB1dFdpdGhFc2NhcGVkQmxvY2tzIiwiZXNjYXBlQmxvY2tzIiwiaW5wdXRQYXJ0cyIsIl9jdXJseVJlIiwicmVzdWx0UGFydHMiLCJlc2NhcGVkQmxvY2tzIiwiYnJhY2tldENvdW50IiwiY3VycmVudEJsb2NrUGFydHMiLCJDTE9TRV9DVVJMWSIsIkJMT0NLX1BMQUNFSE9MREVSIiwiT1BFTl9DVVJMWSIsIlN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzIiwibmV4dEJsb2NrSW5kZXgiLCJlc2NhcGVkU3RyaW5nIiwiX3J1bGVSZSIsImNvbnRlbnRQcmVmaXgiLCJibG9ja3MiLCJDc3NSdWxlIiwiX3Njb3BlU2VsZWN0b3IiLCJzdHJpY3QiLCJfc2hhZG93RGVlcFNlbGVjdG9ycyIsImRlZXBQYXJ0cyIsInNoYWxsb3dQYXJ0Iiwib3RoZXJQYXJ0cyIsIl9zZWxlY3Rvck5lZWRzU2NvcGluZyIsIl9hcHBseVN0cmljdFNlbGVjdG9yU2NvcGUiLCJfYXBwbHlTZWxlY3RvclNjb3BlIiwiYXBwbHlTY29wZSIsIl9tYWtlU2NvcGVNYXRjaGVyIiwiX3NlbGVjdG9yUmVTdWZmaXgiLCJfYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlIiwiX3BvbHlmaWxsSG9zdFJlIiwicmVwbGFjZUJ5XzEiLCJfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yUmUiLCJobmMiLCJjb2xvbiIsIl9zY29wZVNlbGVjdG9yUGFydCIsInNjb3BlZFAiLCJzYWZlQ29udGVudCIsIlNhZmVTZWxlY3RvciIsInNjb3BlZFNlbGVjdG9yIiwic2VwIiwic2hvdWxkU2NvcGUiLCJwYXJ0XzEiLCJyZXN0b3JlIiwiX2NvbG9uSG9zdENvbnRleHRSZSIsIl9wb2x5ZmlsbEhvc3RDb250ZXh0IiwiX2NvbG9uSG9zdFJlIiwia2VlcCIsInJlcGxhY2VCeSIsIl9jb250ZW50IiwicHNldWRvIiwiX3BhcmVuU3VmZml4IiwiSE9TVF9BVFRSIiwiQ09OVEVOVF9BVFRSIiwiU3R5bGVzQ29tcGlsZURlcGVuZGVuY3kiLCJDb21waWxlZFN0eWxlc2hlZXQiLCJzdHlsZXNWYXIiLCJpc1NoaW1tZWQiLCJTdHlsZUNvbXBpbGVyIiwiX3VybFJlc29sdmVyIiwiX3NoYWRvd0NzcyIsImNvbXBpbGVDb21wb25lbnQiLCJfY29tcGlsZVN0eWxlcyIsIm5lZWRzU3R5bGVTaGltIiwiY29tcGlsZVN0eWxlcyIsInN0eWxlc2hlZXQiLCJzaGltIiwiaXNDb21wb25lbnRTdHlsZXNoZWV0Iiwic3R5bGVFeHByZXNzaW9ucyIsInBsYWluU3R5bGUiLCJfc2hpbUlmTmVlZGVkIiwic3R5bGVVcmwiLCJleHBySW5kZXgiLCJnZXRTdHlsZXNWYXJOYW1lIiwiQ29uc3QiLCJBc3RQYXRoIiwicG9zaXRpb24iLCJwYXJlbnRPZiIsImNoaWxkT2YiLCJUZXh0JDMiLCJFeHBhbnNpb24iLCJzd2l0Y2hWYWx1ZSIsInN3aXRjaFZhbHVlU291cmNlU3BhbiIsInZpc2l0RXhwYW5zaW9uIiwiRXhwYW5zaW9uQ2FzZSIsInZhbHVlU291cmNlU3BhbiIsImV4cFNvdXJjZVNwYW4iLCJ2aXNpdEV4cGFuc2lvbkNhc2UiLCJ2aXNpdEF0dHJpYnV0ZSIsIkVsZW1lbnQkMSIsIkNvbW1lbnQiLCJ2aXNpdENvbW1lbnQiLCJ2aXNpdEFsbCQxIiwiYXN0UmVzdWx0IiwiVG9rZW5UeXBlIiwiUmVjdXJzaXZlVmlzaXRvciIsInZpc2l0Q2hpbGRyZW4iLCJUb2tlbkVycm9yIiwiZXJyb3JNc2ciLCJ0b2tlblR5cGUiLCJUb2tlbml6ZVJlc3VsdCIsIl9DUl9PUl9DUkxGX1JFR0VYUCIsIl91bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2ciLCJjaGFyQ29kZSIsIl91bmtub3duRW50aXR5RXJyb3JNc2ciLCJlbnRpdHlTcmMiLCJfQ29udHJvbEZsb3dFcnJvciIsIl9Ub2tlbml6ZXIiLCJfZmlsZSIsIl9nZXRUYWdEZWZpbml0aW9uIiwiX2N1cnJlbnRUb2tlblN0YXJ0IiwiX2N1cnJlbnRUb2tlblR5cGUiLCJfZXhwYW5zaW9uQ2FzZVN0YWNrIiwiX2luSW50ZXJwb2xhdGlvbiIsIl90b2tlbml6ZUljdSIsInRva2VuaXplRXhwYW5zaW9uRm9ybXMiLCJfaW50ZXJwb2xhdGlvbkNvbmZpZyIsImludGVycG9sYXRpb25Db25maWciLCJfbGVhZGluZ1RyaXZpYUNvZGVQb2ludHMiLCJsZWFkaW5nVHJpdmlhQ2hhcnMiLCJjb2RlUG9pbnRBdCIsInJhbmdlIiwiZW5kUG9zIiwic3RhcnRQb3MiLCJfY3Vyc29yIiwiRXNjYXBlZENoYXJhY3RlckN1cnNvciIsIlBsYWluQ2hhcmFjdGVyQ3Vyc29yIiwiX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMiLCJ0b2tlbml6ZSIsInBlZWsiLCJfYXR0ZW1wdENoYXJDb2RlIiwiX2NvbnN1bWVDZGF0YSIsIl9jb25zdW1lQ29tbWVudCIsIl9jb25zdW1lRG9jVHlwZSIsIl9jb25zdW1lVGFnQ2xvc2UiLCJfY29uc3VtZVRhZ09wZW4iLCJfdG9rZW5pemVFeHBhbnNpb25Gb3JtIiwiX2NvbnN1bWVUZXh0IiwiX2JlZ2luVG9rZW4iLCJFT0YiLCJfZW5kVG9rZW4iLCJtZXJnZVRleHRUb2tlbnMiLCJzcmNUb2tlbnMiLCJkc3RUb2tlbnMiLCJsYXN0RHN0VG9rZW4iLCJURVhUIiwiaXNFeHBhbnNpb25Gb3JtU3RhcnQiLCJfY29uc3VtZUV4cGFuc2lvbkZvcm1TdGFydCIsImlzRXhwYW5zaW9uQ2FzZVN0YXJ0IiwiX2lzSW5FeHBhbnNpb25Gb3JtIiwiX2NvbnN1bWVFeHBhbnNpb25DYXNlU3RhcnQiLCJfaXNJbkV4cGFuc2lvbkNhc2UiLCJfY29uc3VtZUV4cGFuc2lvbkNhc2VFbmQiLCJfY29uc3VtZUV4cGFuc2lvbkZvcm1FbmQiLCJnZXRTcGFuIiwiX2NyZWF0ZUVycm9yIiwiQ3Vyc29yRXJyb3IiLCJjdXJzb3IiLCJhZHZhbmNlIiwiX2F0dGVtcHRDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZSIsImNvbXBhcmVDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZSIsImNvZGUxIiwiY29kZTIiLCJ0b1VwcGVyQ2FzZUNoYXJDb2RlIiwiX3JlcXVpcmVDaGFyQ29kZSIsIl9hdHRlbXB0U3RyIiwiY2hhcnNMZWZ0IiwiaW5pdGlhbFBvc2l0aW9uIiwiX2F0dGVtcHRTdHJDYXNlSW5zZW5zaXRpdmUiLCJfcmVxdWlyZVN0ciIsIl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuIiwiX3JlcXVpcmVDaGFyQ29kZVVudGlsRm4iLCJfYXR0ZW1wdFVudGlsQ2hhciIsImNoYXIiLCJfcmVhZENoYXIiLCJkZWNvZGVFbnRpdGllcyIsIl9kZWNvZGVFbnRpdHkiLCJmcm9tQ29kZVBvaW50IiwibmFtZVN0YXJ0IiwiaXNOYW1lZEVudGl0eUVuZCIsImdldENoYXJzIiwiaXNIZXgiLCJjb2RlU3RhcnQiLCJpc0RpZ2l0RW50aXR5RW5kIiwic3RyTnVtIiwicGFyc2VJbnQiLCJfY29uc3VtZVJhd1RleHQiLCJlbmRNYXJrZXJQcmVkaWNhdGUiLCJ0YWdDbG9zZVN0YXJ0IiwiZm91bmRFbmRNYXJrZXIiLCJDT01NRU5UX1NUQVJUIiwiQ09NTUVOVF9FTkQiLCJDREFUQV9TVEFSVCIsIkNEQVRBX0VORCIsIkRPQ19UWVBFIiwiY29udGVudFN0YXJ0IiwiX2NvbnN1bWVQcmVmaXhBbmROYW1lIiwibmFtZU9yUHJlZml4U3RhcnQiLCJpc05hbWVFbmQiLCJvcGVuVGFnVG9rZW4iLCJ0b2tlbnNCZWZvcmVUYWdPcGVuIiwiaW5uZXJTdGFydCIsIl9jb25zdW1lVGFnT3BlblN0YXJ0IiwiaXNOb3RXaGl0ZXNwYWNlIiwiX2NvbnN1bWVBdHRyaWJ1dGVOYW1lIiwiX2NvbnN1bWVBdHRyaWJ1dGVWYWx1ZSIsIl9jb25zdW1lVGFnT3BlbkVuZCIsImNvbnRlbnRUb2tlblR5cGUiLCJfY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UiLCJUQUdfQ0xPU0UiLCJUQUdfT1BFTl9TVEFSVCIsImF0dHJOYW1lU3RhcnQiLCJBVFRSX05BTUUiLCJwcmVmaXhBbmROYW1lIiwiQVRUUl9RVU9URSIsInF1b3RlQ2hhciIsIkFUVFJfVkFMVUUiLCJ2YWx1ZVN0YXJ0IiwiVEFHX09QRU5fRU5EX1ZPSUQiLCJUQUdfT1BFTl9FTkQiLCJFWFBBTlNJT05fRk9STV9TVEFSVCIsIl9yZWFkVW50aWwiLCJFWFBBTlNJT05fQ0FTRV9WQUxVRSIsIkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVCIsIkVYUEFOU0lPTl9DQVNFX0VYUF9FTkQiLCJFWFBBTlNJT05fRk9STV9FTkQiLCJfaXNUZXh0RW5kIiwiaXNJbnRlcnBvbGF0aW9uIiwiaXNBc2NpaUhleERpZ2l0IiwiZmlsZU9yQ3Vyc29yIiwiYWR2YW5jZVN0YXRlIiwidXBkYXRlUGVlayIsImxlYWRpbmdUcml2aWFDb2RlUG9pbnRzIiwicG9zIiwiY3VycmVudENoYXIiLCJpbnRlcm5hbFN0YXRlIiwicHJvY2Vzc0VzY2FwZVNlcXVlbmNlIiwiZGlnaXRTdGFydCIsImxlbmd0aF8xIiwiZGVjb2RlSGV4RGlnaXRzIiwib2N0YWwiLCJsZW5ndGhfMiIsIlRyZWVFcnJvciIsIlBhcnNlVHJlZVJlc3VsdCIsInJvb3ROb2RlcyIsIlBhcnNlciIsImdldFRhZ0RlZmluaXRpb24iLCJ0b2tlbnNBbmRFcnJvcnMiLCJ0cmVlQW5kRXJyb3JzIiwiX1RyZWVCdWlsZGVyIiwiYnVpbGQiLCJfaW5kZXgiLCJfcm9vdE5vZGVzIiwiX2Vycm9ycyIsIl9lbGVtZW50U3RhY2siLCJfYWR2YW5jZSIsIl9wZWVrIiwiX2NvbnN1bWVTdGFydFRhZyIsIl9jb25zdW1lRW5kVGFnIiwiX2Nsb3NlVm9pZEVsZW1lbnQiLCJfY29uc3VtZUV4cGFuc2lvbiIsIl9hZHZhbmNlSWYiLCJzdGFydFRva2VuIiwiX2FkZFRvUGFyZW50IiwiZXhwQ2FzZSIsIl9wYXJzZUV4cGFuc2lvbkNhc2UiLCJfY29sbGVjdEV4cGFuc2lvbkV4cFRva2VucyIsInBhcnNlZEV4cCIsImV4cGFuc2lvbkZvcm1TdGFjayIsImxhc3RPblN0YWNrIiwiX2dldFBhcmVudEVsZW1lbnQiLCJzdGFydFRhZ1Rva2VuIiwiX2NvbnN1bWVBdHRyIiwiX2dldEVsZW1lbnRGdWxsTmFtZSIsInNlbGZDbG9zaW5nIiwidGFnRGVmIiwiX3B1c2hFbGVtZW50IiwiX3BvcEVsZW1lbnQiLCJlbmRUYWdUb2tlbiIsInN0YWNrSW5kZXgiLCJ2YWx1ZVRva2VuIiwiX2dldFBhcmVudEVsZW1lbnRTa2lwcGluZ0NvbnRhaW5lcnMiLCJfaW5zZXJ0QmVmb3JlQ29udGFpbmVyIiwiSHRtbFBhcnNlciIsIlBSRVNFUlZFX1dTX0FUVFJfTkFNRSIsIlNLSVBfV1NfVFJJTV9UQUdTIiwiV1NfQ0hBUlMiLCJOT19XU19SRUdFWFAiLCJXU19SRVBMQUNFX1JFR0VYUCIsInJlcGxhY2VOZ3NwIiwiV2hpdGVzcGFjZVZpc2l0b3IiLCJoYXNQcmVzZXJ2ZVdoaXRlc3BhY2VzQXR0ciIsImF0dHJpYnV0ZSIsImV4cGFuc2lvbiIsImV4cGFuc2lvbkNhc2UiLCJyZW1vdmVXaGl0ZXNwYWNlcyIsImh0bWxBc3RXaXRoRXJyb3JzIiwiUExVUkFMX0NBU0VTIiwiZXhwYW5kTm9kZXMiLCJleHBhbmRlciIsIl9FeHBhbmRlciIsIkV4cGFuc2lvblJlc3VsdCIsImlzRXhwYW5kZWQiLCJleHBhbmRlZCIsIkV4cGFuc2lvbkVycm9yIiwiX2V4cGFuZFBsdXJhbEZvcm0iLCJleHBhbnNpb25SZXN1bHQiLCJzd2l0Y2hBdHRyIiwiX2V4cGFuZERlZmF1bHRGb3JtIiwiaWN1Q2FzZSIsIlByb3ZpZGVyQXN0VHlwZSIsIlRleHRBc3QiLCJCb3VuZFRleHRBc3QiLCJBdHRyQXN0IiwidmlzaXRBdHRyIiwiQm91bmRQcm9wZXJ0eU1hcHBpbmciLCJCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCIsImZyb21Cb3VuZFByb3BlcnR5IiwidmlzaXRFbGVtZW50UHJvcGVydHkiLCJCb3VuZEV2ZW50QXN0IiwiY2FsY0Z1bGxOYW1lIiwidmlzaXRFdmVudCIsIlJlZmVyZW5jZUFzdCIsIm9yaWdpbmFsVmFsdWUiLCJWYXJpYWJsZUFzdCIsImZyb21QYXJzZWRWYXJpYWJsZSIsIkVsZW1lbnRBc3QiLCJoYXNWaWV3Q29udGFpbmVyIiwicXVlcnlNYXRjaGVzIiwiRW1iZWRkZWRUZW1wbGF0ZUFzdCIsInZpc2l0RW1iZWRkZWRUZW1wbGF0ZSIsIkJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QiLCJkaXJlY3RpdmVOYW1lIiwidmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsIkRpcmVjdGl2ZUFzdCIsImhvc3RFdmVudHMiLCJjb250ZW50UXVlcnlTdGFydElkIiwidmlzaXREaXJlY3RpdmUiLCJQcm92aWRlckFzdCIsImVhZ2VyIiwicHJvdmlkZXJUeXBlIiwibGlmZWN5Y2xlSG9va3MiLCJpc01vZHVsZSIsIk5nQ29udGVudEFzdCIsInZpc2l0TmdDb250ZW50IiwiUmVjdXJzaXZlVGVtcGxhdGVBc3RWaXNpdG9yIiwidGVtcGxhdGVWaXNpdEFsbCIsIk51bGxUZW1wbGF0ZVZpc2l0b3IiLCJQcm92aWRlckVycm9yIiwiUHJvdmlkZXJWaWV3Q29udGV4dCIsIl9nZXRWaWV3UXVlcmllcyIsInZpZXdRdWVyeUlkIiwiX2FkZFF1ZXJ5VG9Ub2tlbk1hcCIsIlByb3ZpZGVyRWxlbWVudENvbnRleHQiLCJ2aWV3Q29udGV4dCIsIl9pc1ZpZXdSb290IiwiX2RpcmVjdGl2ZUFzdHMiLCJpc1RlbXBsYXRlIiwiX3NvdXJjZVNwYW4iLCJfdHJhbnNmb3JtZWRQcm92aWRlcnMiLCJfc2VlblByb3ZpZGVycyIsIl9xdWVyaWVkVG9rZW5zIiwidHJhbnNmb3JtZWRIYXNWaWV3Q29udGFpbmVyIiwiX2F0dHJzIiwiYXR0ckFzdCIsImRpcmVjdGl2ZXNNZXRhIiwiZGlyZWN0aXZlQXN0IiwiX2FsbFByb3ZpZGVycyIsIl9yZXNvbHZlUHJvdmlkZXJzRnJvbURpcmVjdGl2ZXMiLCJ0YXJnZXRFcnJvcnMiLCJwcm92aWRlcnNCeVRva2VuIiwiX3Jlc29sdmVQcm92aWRlcnMiLCJQdWJsaWNTZXJ2aWNlIiwiUHJpdmF0ZVNlcnZpY2UiLCJfY29udGVudFF1ZXJpZXMiLCJfZ2V0Q29udGVudFF1ZXJpZXMiLCJjb250ZW50UXVlcnlJZCIsIl9hZGRRdWVyeVJlYWRzVG8iLCJ0ZW1wbGF0ZVJlZklkIiwicmVmQXN0IiwiZGVmYXVsdFF1ZXJ5VmFsdWUiLCJfZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyIiwiYWZ0ZXJFbGVtZW50IiwibGF6eVByb3ZpZGVycyIsImVhZ2VyUHJvdmlkZXJzIiwic29ydGVkUHJvdmlkZXJUeXBlcyIsInRyYW5zZm9ybVByb3ZpZGVycyIsInNvcnRlZERpcmVjdGl2ZXMiLCJkaXIxIiwiZGlyMiIsImFsbE1hdGNoZXMiLCJkZWZhdWx0VmFsdWUiLCJxdWVyeVJlYWRUb2tlbnMiLCJfZ2V0UXVlcmllc0ZvciIsInF1ZXJ5VmFsdWUiLCJjdXJyZW50RWwiLCJkaXN0YW5jZSIsInJlcXVlc3RpbmdQcm92aWRlclR5cGUiLCJCdWlsdGluIiwidHJhbnNmb3JtZWRQcm92aWRlckFzdCIsInRyYW5zZm9ybWVkUHJvdmlkZXJzIiwidHJhbnNmb3JtZWRVc2VWYWx1ZSIsInRyYW5zZm9ybWVkVXNlRXhpc3RpbmciLCJ0cmFuc2Zvcm1lZERlcHMiLCJleGlzdGluZ0RpRGVwIiwiX2dldERlcGVuZGVuY3kiLCJfdHJhbnNmb3JtUHJvdmlkZXIiLCJfdHJhbnNmb3JtUHJvdmlkZXJBc3QiLCJfZ2V0TG9jYWxEZXBlbmRlbmN5IiwiaXNWYWx1ZSIsImN1cnJFbGVtZW50IiwiY3VyckVhZ2VyIiwicHJldkVsZW1lbnQiLCJOZ01vZHVsZVByb3ZpZGVyQW5hbHl6ZXIiLCJlcnJvclN0cmluZyIsInJlcXVlc3RvclNvdXJjZVNwYW4iLCJ0YXJnZXRQcm92aWRlcnNCeVRva2VuIiwiaXNVc2VWYWx1ZSIsIlN0eWxlV2l0aEltcG9ydHMiLCJpc1N0eWxlVXJsUmVzb2x2YWJsZSIsInNjaGVtZU1hdGNoIiwiVVJMX1dJVEhfU0NIRU1BX1JFR0VYUCIsIkNTU19JTVBPUlRfUkVHRVhQIiwiQ1NTX1NUUklQUEFCTEVfQ09NTUVOVF9SRUdFWFAiLCJCaW5kaW5nUGFyc2VyIiwiX2V4cHJQYXJzZXIiLCJfc2NoZW1hUmVnaXN0cnkiLCJwaXBlc0J5TmFtZSIsIl91c2VkUGlwZXMiLCJwaXBlc0J5TmFtZV8xIiwiZ2V0VXNlZFBpcGVzIiwiY3JlYXRlQm91bmRIb3N0UHJvcGVydGllcyIsImRpck1ldGEiLCJib3VuZFByb3BzXzEiLCJwYXJzZVByb3BlcnR5QmluZGluZyIsIl9yZXBvcnRFcnJvciIsImNyZWF0ZURpcmVjdGl2ZUhvc3RQcm9wZXJ0eUFzdHMiLCJlbGVtZW50U2VsZWN0b3IiLCJib3VuZFByb3BzIiwiY3JlYXRlQm91bmRFbGVtZW50UHJvcGVydHkiLCJjcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzIiwidGFyZ2V0RXZlbnRzXzEiLCJwYXJzZUV2ZW50IiwicGFyc2VJbnRlcnBvbGF0aW9uIiwic291cmNlSW5mbyIsIl9yZXBvcnRFeHByZXNzaW9uUGFyc2VyRXJyb3JzIiwiX2NoZWNrUGlwZXMiLCJ3cmFwTGl0ZXJhbFByaW1pdGl2ZSIsInBhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nIiwidHBsS2V5IiwidHBsVmFsdWUiLCJ0YXJnZXRNYXRjaGFibGVBdHRycyIsInRhcmdldFByb3BzIiwidGFyZ2V0VmFycyIsIl9wYXJzZVRlbXBsYXRlQmluZGluZ3MiLCJfcGFyc2VQcm9wZXJ0eUFzdCIsInBhcnNlTGl0ZXJhbEF0dHIiLCJiaW5kaW5nc1Jlc3VsdCIsInBhcnNlVGVtcGxhdGVCaW5kaW5ncyIsInRlbXBsYXRlQmluZGluZ3MiLCJ3YXJuaW5ncyIsIndhcm5pbmciLCJXQVJOSU5HIiwiaXNBbmltYXRpb25MYWJlbCIsIl9wYXJzZUFuaW1hdGlvbiIsImlzQW5pbWF0aW9uUHJvcCIsIl9wYXJzZUJpbmRpbmciLCJwYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiIsIkRFRkFVTFQiLCJpc0hvc3RCaW5kaW5nIiwicGFyc2VTaW1wbGVCaW5kaW5nIiwicGFyc2VCaW5kaW5nIiwiYm91bmRQcm9wIiwic2tpcFZhbGlkYXRpb24iLCJtYXBQcm9wZXJ0eU5hbWUiLCJOT05FIiwiYm91bmRQcm9wZXJ0eU5hbWUiLCJzZWN1cml0eUNvbnRleHRzIiwiX3ZhbGlkYXRlUHJvcGVydHlPckF0dHJpYnV0ZU5hbWUiLCJjYWxjUG9zc2libGVTZWN1cml0eUNvbnRleHRzIiwibnNTZXBhcmF0b3JJZHgiLCJtYXBwZWRQcm9wTmFtZSIsImdldE1hcHBlZFByb3BOYW1lIiwidGFyZ2V0RXZlbnRzIiwiX3BhcnNlQW5pbWF0aW9uRXZlbnQiLCJfcGFyc2VSZWd1bGFyRXZlbnQiLCJzcGxpdEF0UGVyaW9kIiwiX3BhcnNlQWN0aW9uIiwicGFyc2VBY3Rpb24iLCJlcnJvcnNfMSIsImVycm9yc18xXzEiLCJjb2xsZWN0b3IiLCJQaXBlQ29sbGVjdG9yIiwicGlwZU1ldGEiLCJpc0F0dHIiLCJyZXBvcnQiLCJ2YWxpZGF0ZUF0dHJpYnV0ZSIsInZhbGlkYXRlUHJvcGVydHkiLCJjdHhzIiwiZWxlbWVudE5hbWVzIiwiYWxsS25vd25FbGVtZW50TmFtZXMiLCJub3RFbGVtZW50TmFtZXMiLCJwb3NzaWJsZUVsZW1lbnROYW1lcyIsIlByZXBhcnNlZEVsZW1lbnRUeXBlIiwiTkdfQ09OVEVOVF9TRUxFQ1RfQVRUUiIsIkxJTktfRUxFTUVOVCIsIkxJTktfU1RZTEVfUkVMX0FUVFIiLCJMSU5LX1NUWUxFX0hSRUZfQVRUUiIsIkxJTktfU1RZTEVfUkVMX1ZBTFVFIiwiU1RZTEVfRUxFTUVOVCIsIlNDUklQVF9FTEVNRU5UIiwiTkdfTk9OX0JJTkRBQkxFX0FUVFIiLCJOR19QUk9KRUNUX0FTIiwicHJlcGFyc2VFbGVtZW50Iiwic2VsZWN0QXR0ciIsImhyZWZBdHRyIiwicmVsQXR0ciIsIm5vbkJpbmRhYmxlIiwicHJvamVjdEFzIiwibGNBdHRyTmFtZSIsIm5vcm1hbGl6ZU5nQ29udGVudFNlbGVjdCIsIk9USEVSIiwiTkdfQ09OVEVOVCIsIlNDUklQVCIsIlNUWUxFU0hFRVQiLCJQcmVwYXJzZWRFbGVtZW50IiwiX1RFWFRfQ1NTX1NFTEVDVE9SIiwiQklORF9OQU1FX1JFR0VYUCIsIkNMQVNTX0FUVFIiLCJURVhUX0NTU19TRUxFQ1RPUiIsIlRlbXBsYXRlUGFyc2VFcnJvciIsIlRlbXBsYXRlUGFyc2VSZXN1bHQiLCJ0ZW1wbGF0ZUFzdCIsInVzZWRQaXBlcyIsIlRlbXBsYXRlUGFyc2VyIiwiX3JlZmxlY3RvciIsIl9odG1sUGFyc2VyIiwidHJhbnNmb3JtcyIsInRyeVBhcnNlIiwiaHRtbFBhcnNlUmVzdWx0IiwiZ2V0SW50ZXJwb2xhdGlvbkNvbmZpZyIsInRyeVBhcnNlSHRtbCIsImV4cGFuZEh0bWwiLCJ1bmlxRGlyZWN0aXZlcyIsInJlbW92ZVN1bW1hcnlEdXBsaWNhdGVzIiwidW5pcVBpcGVzIiwicHJvdmlkZXJWaWV3Q29udGV4dCIsImJpbmRpbmdQYXJzZXIiLCJwYXJzZVZpc2l0b3IiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvciIsIkVNUFRZX0VMRU1FTlRfQ09OVEVYVCIsIl9hc3NlcnROb1JlZmVyZW5jZUR1cGxpY2F0aW9uT25UZW1wbGF0ZSIsImZvcmNlZCIsImV4cGFuZGVkSHRtbEFzdCIsImV4aXN0aW5nUmVmZXJlbmNlcyIsIl9iaW5kaW5nUGFyc2VyIiwiX3NjaGVtYXMiLCJfdGFyZ2V0RXJyb3JzIiwic2VsZWN0b3JNYXRjaGVyIiwiZGlyZWN0aXZlc0luZGV4IiwibmdDb250ZW50Q291bnQiLCJmaW5kTmdDb250ZW50SW5kZXgiLCJ2YWx1ZU5vTmdzcCIsInF1ZXJ5U3RhcnRJbmRleCIsImVsTmFtZSIsInByZXBhcnNlZEVsZW1lbnQiLCJtYXRjaGFibGVBdHRycyIsImVsZW1lbnRPckRpcmVjdGl2ZVByb3BzIiwiZWxlbWVudE9yRGlyZWN0aXZlUmVmcyIsImVsZW1lbnRWYXJzIiwidGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcyIsInRlbXBsYXRlTWF0Y2hhYmxlQXR0cnMiLCJ0ZW1wbGF0ZUVsZW1lbnRWYXJzIiwiaGFzSW5saW5lVGVtcGxhdGVzIiwidGVtcGxhdGVWYWx1ZSIsInRlbXBsYXRlS2V5IiwiaGFzQmluZGluZyIsIl9wYXJzZUF0dHIiLCJub3JtYWxpemVkTmFtZSIsIl9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lIiwiaGFzVGVtcGxhdGVCaW5kaW5nIiwicGFyc2VkVmFyaWFibGVzXzEiLCJlbGVtZW50Q3NzU2VsZWN0b3IiLCJjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IiLCJfcGFyc2VEaXJlY3RpdmVzIiwiZGlyZWN0aXZlTWV0YXMiLCJtYXRjaEVsZW1lbnQiLCJib3VuZERpcmVjdGl2ZVByb3BOYW1lcyIsImRpcmVjdGl2ZUFzdHMiLCJfY3JlYXRlRGlyZWN0aXZlQXN0cyIsImVsZW1lbnRQcm9wcyIsIl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzIiwiaXNWaWV3Um9vdCIsInByb3ZpZGVyQ29udGV4dCIsIk5PTl9CSU5EQUJMRV9WSVNJVE9SIiwiRWxlbWVudENvbnRleHQiLCJwYXJzZWRFbGVtZW50IiwicHJvamVjdGlvblNlbGVjdG9yIiwiX2lzRW1wdHlUZXh0Tm9kZSIsIl9hc3NlcnRBbGxFdmVudHNQdWJsaXNoZWRCeURpcmVjdGl2ZXMiLCJfYXNzZXJ0Tm9Db21wb25lbnRzTm9yRWxlbWVudEJpbmRpbmdzT25UZW1wbGF0ZSIsInRyYW5zZm9ybWVkRGlyZWN0aXZlQXN0cyIsIl9hc3NlcnRFbGVtZW50RXhpc3RzIiwiX2Fzc2VydE9ubHlPbmVDb21wb25lbnQiLCJuZ0NvbnRlbnRJbmRleF8xIiwidGVtcGxhdGVRdWVyeVN0YXJ0SW5kZXgiLCJ0ZW1wbGF0ZVNlbGVjdG9yIiwidGVtcGxhdGVCb3VuZERpcmVjdGl2ZVByb3BOYW1lcyIsInRlbXBsYXRlRGlyZWN0aXZlQXN0cyIsInRlbXBsYXRlRWxlbWVudFByb3BzIiwidGVtcGxhdGVQcm92aWRlckNvbnRleHQiLCJ0YXJnZXRSZWZzIiwic3JjU3BhbiIsImJvdW5kRXZlbnRzIiwiYmluZFBhcnRzIiwiX3BhcnNlVmFyaWFibGUiLCJfcGFyc2VSZWZlcmVuY2UiLCJfcGFyc2VBc3NpZ25tZW50RXZlbnQiLCJFbGVtZW50T3JEaXJlY3RpdmVSZWYiLCJlbGVtZW50U291cmNlU3BhbiIsInRhcmdldFJlZmVyZW5jZXMiLCJ0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BOYW1lcyIsIm1hdGNoZWRSZWZlcmVuY2VzIiwiZGlyZWN0aXZlUHJvcGVydGllcyIsIl9jaGVja1Byb3BlcnRpZXNJblNjaGVtYSIsInBhcnNlZEV2ZW50cyIsIl9jcmVhdGVEaXJlY3RpdmVQcm9wZXJ0eUFzdHMiLCJlbE9yRGlyUmVmIiwiaXNSZWZlcmVuY2VUb0RpcmVjdGl2ZSIsInJlZlRva2VuIiwidGFyZ2V0Qm91bmREaXJlY3RpdmVQcm9wcyIsImJvdW5kUHJvcHNCeU5hbWVfMSIsInByZXZWYWx1ZSIsImRpclByb3AiLCJlbFByb3AiLCJpc0VtcHR5RXhwcmVzc2lvbiIsImJvdW5kRWxlbWVudFByb3BzIiwiX2ZpbmRDb21wb25lbnREaXJlY3RpdmVzIiwiX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyIsImNvbXBvbmVudFR5cGVOYW1lcyIsImhhc0VsZW1lbnQiLCJhbGxEaXJlY3RpdmVFdmVudHMiLCJoYXNQcm9wZXJ0eSIsIk5vbkJpbmRhYmxlVmlzaXRvciIsImF0dHJOYW1lQW5kVmFsdWVzIiwic3BsaXRFeHBvcnRBcyIsIl9uZ0NvbnRlbnRJbmRleE1hdGNoZXIiLCJfd2lsZGNhcmROZ0NvbnRlbnRJbmRleCIsIndpbGRjYXJkTmdDb250ZW50SW5kZXgiLCJuZ0NvbnRlbnRJbmRpY2VzIiwiZWxOYW1lTm9OcyIsImF0dHJOYW1lTm9OcyIsIml0ZW1zIiwic3RyaXBVbm5lY2Vzc2FyeVF1b3RlcyIsInFTIiwidGVtcFZhbHVlIiwiVG9rZW5UeXBlJDEiLCJJTVBPUlRBTlRfRkxBRyIsIlN0eWxpbmdCdWlsZGVyIiwiX2VsZW1lbnRJbmRleEV4cHIiLCJfZGlyZWN0aXZlRXhwciIsIl9oYXNJbml0aWFsVmFsdWVzIiwiaGFzQmluZGluZ3MiLCJfY2xhc3NNYXBJbnB1dCIsIl9zdHlsZU1hcElucHV0IiwiX3NpbmdsZVN0eWxlSW5wdXRzIiwiX3NpbmdsZUNsYXNzSW5wdXRzIiwiX2xhc3RTdHlsaW5nSW5wdXQiLCJfc3R5bGVzSW5kZXgiLCJfY2xhc3Nlc0luZGV4IiwiX2luaXRpYWxTdHlsZVZhbHVlcyIsIl9pbml0aWFsQ2xhc3NWYWx1ZXMiLCJfdXNlRGVmYXVsdFNhbml0aXplciIsInJlZ2lzdGVyQm91bmRJbnB1dCIsInJlZ2lzdGVySW5wdXRCYXNlZE9uTmFtZSIsInJlZ2lzdGVyU3R5bGVJbnB1dCIsInJlZ2lzdGVyQ2xhc3NJbnB1dCIsIm5hbWVUb01hdGNoIiwiaXNTdHlsZSIsImlzTWFwQmFzZWQiLCJwYXJzZVByb3BlcnR5IiwiaGFzT3ZlcnJpZGVGbGFnIiwiYmluZGluZ1VuaXQiLCJpc1N0eWxlU2FuaXRpemFibGUiLCJyZWdpc3RlckludG9NYXAiLCJyZWdpc3RlclN0eWxlQXR0ciIsInBhcmVuRGVwdGgiLCJwcm9wU3RhcnQiLCJ2YWx1ZUhhc1F1b3RlcyIsInN0eWxlVmFsIiwicmVnaXN0ZXJDbGFzc0F0dHIiLCJwb3B1bGF0ZUluaXRpYWxTdHlsaW5nQXR0cnMiLCJidWlsZEhvc3RBdHRyc0luc3RydWN0aW9uIiwiYWxsb2NhdGVCaW5kaW5nU2xvdHMiLCJidWlsZFBhcmFtcyIsImdldENvbnN0YW50TGl0ZXJhbEZyb21BcnJheSIsImJ1aWxkRWxlbWVudFN0eWxpbmdJbnN0cnVjdGlvbiIsInN0eWxlQmluZGluZ1Byb3BzIiwiZXhwZWN0ZWROdW1iZXJPZkFyZ3MiLCJhZGRQYXJhbSIsImJ1aWxkRWxlbWVudFN0eWxpbmdNYXBJbnN0cnVjdGlvbiIsInZhbHVlQ29udmVydGVyIiwic3R5bGluZ0lucHV0IiwidG90YWxCaW5kaW5nU2xvdHNSZXF1aXJlZCIsIm1hcEJhc2VkQ2xhc3NWYWx1ZV8xIiwibWFwQmFzZWRTdHlsZVZhbHVlXzEiLCJpc0hvc3RCaW5kaW5nXzEiLCJjb252ZXJ0Rm4iLCJfYnVpbGRTaW5nbGVJbnB1dHMiLCJtYXBJbmRleCIsImFsbG93VW5pdHMiLCJfYnVpbGRDbGFzc0lucHV0cyIsIl9idWlsZFN0eWxlSW5wdXRzIiwiX2J1aWxkQXBwbHlGbiIsImJ1aWxkVXBkYXRlTGV2ZWxJbnN0cnVjdGlvbnMiLCJpbnN0cnVjdGlvbnMiLCJtYXBJbnN0cnVjdGlvbiIsImFyZ051bWJlciIsInRvdGFsRXhwZWN0ZWRBcmdzIiwib3ZlcnJpZGVJbmRleCIsInVuaXRJbmRleCIsIktFWVdPUkRTIiwiTGV4ZXIiLCJzY2FubmVyIiwiX1NjYW5uZXIiLCJzY2FuVG9rZW4iLCJUb2tlbiQxIiwibnVtVmFsdWUiLCJzdHJWYWx1ZSIsImlzQ2hhcmFjdGVyIiwiQ2hhcmFjdGVyIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsImlzT3BlcmF0b3IiLCJPcGVyYXRvciIsImlzSWRlbnRpZmllciIsIklkZW50aWZpZXIiLCJpc0tleXdvcmQiLCJLZXl3b3JkIiwiaXNLZXl3b3JkTGV0IiwiaXNLZXl3b3JkQXMiLCJpc0tleXdvcmROdWxsIiwiaXNLZXl3b3JkVW5kZWZpbmVkIiwiaXNLZXl3b3JkVHJ1ZSIsImlzS2V5d29yZEZhbHNlIiwiaXNLZXl3b3JkVGhpcyIsImlzRXJyb3IiLCJ0b051bWJlciIsIm5ld0NoYXJhY3RlclRva2VuIiwibmV3T3BlcmF0b3JUb2tlbiIsImlzSWRlbnRpZmllclN0YXJ0Iiwic2NhbklkZW50aWZpZXIiLCJzY2FuTnVtYmVyIiwic2NhbkNoYXJhY3RlciIsInNjYW5TdHJpbmciLCJzY2FuT3BlcmF0b3IiLCJzY2FuQ29tcGxleE9wZXJhdG9yIiwib25lIiwidHdvQ29kZSIsInR3byIsInRocmVlQ29kZSIsInRocmVlIiwiaXNJZGVudGlmaWVyUGFydCIsIm5ld0tleXdvcmRUb2tlbiIsIm5ld0lkZW50aWZpZXJUb2tlbiIsInNpbXBsZSIsImlzRXhwb25lbnRTaWduIiwibmV3TnVtYmVyVG9rZW4iLCJwYXJzZUludEF1dG9SYWRpeCIsInBhcnNlRmxvYXQiLCJ1bmVzY2FwZWRDb2RlIiwidW5lc2NhcGUiLCJuZXdTdHJpbmdUb2tlbiIsIm5ld0Vycm9yVG9rZW4iLCJTcGxpdEludGVycG9sYXRpb24iLCJvZmZzZXRzIiwiVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQiLCJfY3JlYXRlSW50ZXJwb2xhdGVSZWdFeHAiLCJfU0VDVVJJVFlfU0NIRU1BIiwiUGFyc2VyJDEiLCJfbGV4ZXIiLCJfY2hlY2tOb0ludGVycG9sYXRpb24iLCJzb3VyY2VUb0xleCIsIl9zdHJpcENvbW1lbnRzIiwiX1BhcnNlQVNUIiwicGFyc2VDaGFpbiIsIl9wYXJzZUJpbmRpbmdBc3QiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciIsIl9wYXJzZVF1b3RlIiwicHJlZml4U2VwYXJhdG9ySW5kZXgiLCJzcGxpdEludGVycG9sYXRpb24iLCJleHByZXNzaW9uVGV4dCIsIl9maW5kSW50ZXJwb2xhdGlvbkVycm9yQ29sdW1uIiwiX2NvbW1lbnRTdGFydCIsIm91dGVyUXVvdGUiLCJuZXh0Q2hhciIsInBhcnRJbkVycklkeCIsImlucHV0TGVuZ3RoIiwicnBhcmVuc0V4cGVjdGVkIiwicmJyYWNrZXRzRXhwZWN0ZWQiLCJyYnJhY2VzRXhwZWN0ZWQiLCJpbnB1dEluZGV4Iiwib3B0aW9uYWxDaGFyYWN0ZXIiLCJwZWVrS2V5d29yZExldCIsInBlZWtLZXl3b3JkQXMiLCJleHBlY3RDaGFyYWN0ZXIiLCJvcHRpb25hbE9wZXJhdG9yIiwiZXhwZWN0T3BlcmF0b3IiLCJleHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkIiwiZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZE9yU3RyaW5nIiwicGFyc2VQaXBlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VDb25kaXRpb25hbCIsInBhcnNlTG9naWNhbE9yIiwieWVzIiwibm8iLCJwYXJzZUxvZ2ljYWxBbmQiLCJwYXJzZUVxdWFsaXR5IiwicGFyc2VSZWxhdGlvbmFsIiwicGFyc2VBZGRpdGl2ZSIsInBhcnNlTXVsdGlwbGljYXRpdmUiLCJwYXJzZVByZWZpeCIsInBhcnNlQ2FsbENoYWluIiwicGFyc2VQcmltYXJ5IiwicGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwiLCJwYXJzZUNhbGxBcmd1bWVudHMiLCJlbGVtZW50cyIsInBhcnNlRXhwcmVzc2lvbkxpc3QiLCJwYXJzZUxpdGVyYWxNYXAiLCJsaXRlcmFsVmFsdWUiLCJ0ZXJtaW5hdG9yIiwiaXNTYWZlIiwicG9zaXRpb25hbHMiLCJleHBlY3RUZW1wbGF0ZUJpbmRpbmdLZXkiLCJvcGVyYXRvckZvdW5kIiwiZmlyc3RCaW5kaW5nIiwicmF3S2V5IiwiaXNWYXIiLCJsZXRTdGFydCIsImxldE5hbWUiLCJsb2NhdGlvblRleHQiLCJza2lwIiwiU0VDVVJJVFlfU0NIRU1BIiwicmVnaXN0ZXJDb250ZXh0IiwiSFRNTCIsIlVSTCIsIlJFU09VUkNFX1VSTCIsInNwZWNzIiwic3BlY3NfMSIsInNwZWNzXzFfMSIsInNwZWMiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkiLCJCT09MRUFOIiwiTlVNQkVSIiwiU1RSSU5HIiwiT0JKRUNUIiwiU0NIRU1BIiwiX0FUVFJfVE9fUFJPUCIsIkRvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSIsIl9zY2hlbWEiLCJlbmNvZGVkVHlwZSIsInN0clR5cGUiLCJ0eXBlTmFtZXMiLCJzdXBlck5hbWUiLCJzdXBlclR5cGUiLCJzY2hlbWFNZXRhcyIsInNjaGVtYSIsImdldERlZmF1bHRDb21wb25lbnRFbGVtZW50TmFtZSIsIm5vcm1hbGl6ZUFuaW1hdGlvblN0eWxlUHJvcGVydHkiLCJkYXNoQ2FzZVRvQ2FtZWxDYXNlIiwibm9ybWFsaXplQW5pbWF0aW9uU3R5bGVWYWx1ZSIsImNhbWVsQ2FzZVByb3AiLCJ1c2VyUHJvdmlkZWRQcm9wIiwic3RyVmFsIiwiX2lzUGl4ZWxEaW1lbnNpb25TdHlsZSIsInZhbEFuZFN1ZmZpeE1hdGNoIiwiQklORF9OQU1FX1JFR0VYUCQxIiwiaHRtbEFzdFRvUmVuZGVyM0FzdCIsImh0bWxOb2RlcyIsIkh0bWxBc3RUb0l2eUFzdCIsIml2eU5vZGVzIiwiYWxsRXJyb3JzIiwiVGFnVHlwZSIsImNvbnRlbnRzIiwidGV4dENvbnRlbnRzIiwicGFyc2VkUHJvcGVydGllcyIsImkxOG5BdHRyc01ldGEiLCJ0ZW1wbGF0ZVBhcnNlZFByb3BlcnRpZXMiLCJ0ZW1wbGF0ZVZhcmlhYmxlcyIsImVsZW1lbnRIYXNJbmxpbmVUZW1wbGF0ZSIsIm5vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUiLCJpc1RlbXBsYXRlQmluZGluZyIsInJlcG9ydEVycm9yIiwicGFyc2VkVmFyaWFibGVzIiwicGFyc2VBdHRyaWJ1dGUiLCJOT05fQklOREFCTEVfVklTSVRPUiQxIiwiaXNFbXB0eVRleHROb2RlIiwiaXNDb21tZW50Tm9kZSIsImV4dHJhY3RBdHRyaWJ1dGVzIiwiYm91bmQiLCJ0ZW1wbGF0ZUF0dHJzXzEiLCJob2lzdGVkQXR0cnMiLCJfdmlzaXRUZXh0V2l0aEludGVycG9sYXRpb24iLCJpMThuUHJvcHNNZXRhIiwiYmVwIiwibWF0Y2hhYmxlQXR0cmlidXRlcyIsInBhcnNlVmFyaWFibGUiLCJwYXJzZVJlZmVyZW5jZSIsImFkZEV2ZW50cyIsInBhcnNlQXNzaWdubWVudEV2ZW50IiwiSTE4bkNvbnRleHQiLCJ0ZW1wbGF0ZUluZGV4IiwiaXNFbWl0dGVkIiwiX3VucmVzb2x2ZWRDdHhDb3VudCIsIl9yZWdpc3RyeSIsInNldHVwUmVnaXN0cnkiLCJnZXRVbmlxdWVJZCIsImFwcGVuZFRhZyIsImNsb3NlZCIsImdldFNlcmlhbGl6ZWRQbGFjZWhvbGRlcnMiLCJzZXJpYWxpemVQbGFjZWhvbGRlclZhbHVlIiwiYXBwZW5kQmluZGluZyIsImFwcGVuZEljdSIsImFwcGVuZEJvdW5kVGV4dCIsImFwcGVuZFRlbXBsYXRlIiwiVEVNUExBVEUiLCJhcHBlbmRFbGVtZW50IiwiRUxFTUVOVCIsImZvcmtDaGlsZENvbnRleHQiLCJyZWNvbmNpbGVDaGlsZENvbnRleHQiLCJmaW5kVGVtcGxhdGVGbiIsInBocyIsInRtcGxJZHgiLCJmaW5kSW5kZXgiLCJpc0Nsb3NlVGFnIiwiZW5kc1dpdGgiLCJ0bXBsIiwic3ltYm9sIiwid3JhcFRhZyIsIlRBR19UT19QTEFDRUhPTERFUl9OQU1FUyIsIlBsYWNlaG9sZGVyUmVnaXN0cnkiLCJfcGxhY2VIb2xkZXJOYW1lQ291bnRzIiwiX3NpZ25hdHVyZVRvTmFtZSIsImdldFN0YXJ0VGFnUGxhY2Vob2xkZXJOYW1lIiwiX2hhc2hUYWciLCJ1cHBlclRhZyIsImJhc2VOYW1lIiwiX2dlbmVyYXRlVW5pcXVlTmFtZSIsImdldENsb3NlVGFnUGxhY2Vob2xkZXJOYW1lIiwiX2hhc2hDbG9zaW5nVGFnIiwiZ2V0UGxhY2Vob2xkZXJOYW1lIiwidXBwZXJOYW1lIiwiZ2V0VW5pcXVlUGxhY2Vob2xkZXIiLCJfZXhwUGFyc2VyIiwiY3JlYXRlSTE4bk1lc3NhZ2VGYWN0b3J5IiwiX0kxOG5WaXNpdG9yIiwidmlzaXROb2RlRm4iLCJ0b0kxOG5NZXNzYWdlIiwiX2V4cHJlc3Npb25QYXJzZXIiLCJfaXNJY3UiLCJfaWN1RGVwdGgiLCJfcGxhY2Vob2xkZXJSZWdpc3RyeSIsIl9wbGFjZWhvbGRlclRvQ29udGVudCIsIl9wbGFjZWhvbGRlclRvTWVzc2FnZSIsIl92aXNpdE5vZGVGbiIsImkxOG5vZGVzIiwiX3Zpc2l0Tm9kZSIsInN0YXJ0UGhOYW1lIiwiY2xvc2VQaE5hbWUiLCJpMThuSWN1Q2FzZXMiLCJpMThuSWN1IiwiY2F6ZSIsImV4cFBoIiwicGhOYW1lIiwic0RlbGltaXRlciIsImVEZWxpbWl0ZXIiLCJfQ1VTVE9NX1BIX0VYUCIsImxhc3RTdHJpbmdJZHgiLCJzZXRJMThuUmVmcyIsIkkxOG5NZXRhVmlzaXRvciIsImtlZXBJMThuQXR0cnMiLCJfY3JlYXRlSTE4bk1lc3NhZ2UiLCJfZ2VuZXJhdGVJMThuTWVzc2FnZSIsInBhcnNlZCIsInBhcnNlSTE4bk1ldGEiLCJpZEluZGV4IiwiZGVzY0luZGV4IiwibWVhbmluZ0FuZERlc2MiLCJoYXNJMThuQXR0cnMiLCJhdHRyc01ldGEiLCJpMThuXzEiLCJhdHRyc18xIiwiYXR0cnNfMV8xIiwiZm9ybWF0UGgiLCJzZXJpYWxpemVyVmlzaXRvciQxIiwiU2VyaWFsaXplclZpc2l0b3IiLCJHTE9CQUxfVEFSR0VUX1JFU09MVkVSUyIsIkxFQURJTkdfVFJJVklBX0NIQVJTIiwicmVuZGVyRmxhZ0NoZWNrSWZTdG10IiwicHJlcGFyZUV2ZW50TGlzdGVuZXJQYXJhbWV0ZXJzIiwiZXZlbnRBc3QiLCJoYW5kbGVyTmFtZSIsImltcGxpY2l0UmVjZWl2ZXJFeHByIiwiYmluZGluZ0xldmVsIiwiZ2V0T3JDcmVhdGVTaGFyZWRDb250ZXh0VmFyIiwiYmluZGluZ0V4cHIiLCJyZXN0b3JlVmlld1N0YXRlbWVudCIsInZhcmlhYmxlRGVjbGFyYXRpb25zIiwicHJlcGFyZVN5bnRoZXRpY0xpc3RlbmVyTmFtZSIsImZuTmFtZSIsImhhbmRsZXJGbiIsIlRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIiLCJwYXJlbnRCaW5kaW5nU2NvcGUiLCJjb250ZXh0TmFtZSIsImkxOG5Db250ZXh0IiwiZGlyZWN0aXZlTWF0Y2hlciIsInBpcGVUeXBlQnlOYW1lIiwiX25hbWVzcGFjZSIsInJlbGF0aXZlQ29udGV4dEZpbGVQYXRoIiwiaTE4blVzZUV4dGVybmFsSWRzIiwiX2RhdGFJbmRleCIsIl9iaW5kaW5nQ29udGV4dCIsIl9wcmVmaXhDb2RlIiwiX2NyZWF0aW9uQ29kZUZucyIsIl91cGRhdGVDb2RlRm5zIiwiX2xhc3ROb2RlSW5kZXhXaXRoRmx1c2giLCJfdGVtcFZhcmlhYmxlcyIsIl9uZXN0ZWRUZW1wbGF0ZUZucyIsIl91bnN1cHBvcnRlZCIsIl9wdXJlRnVuY3Rpb25TbG90cyIsIl9iaW5kaW5nU2xvdHMiLCJfbmdDb250ZW50UmVzZXJ2ZWRTbG90cyIsIl9uZ0NvbnRlbnRTZWxlY3RvcnNPZmZzZXQiLCJfaW1wbGljaXRSZWNlaXZlckV4cHIiLCJfYmluZGluZ1Njb3BlIiwibmVzdGVkU2NvcGUiLCJmaWxlQmFzZWRJMThuU3VmZml4IiwiX3ZhbHVlQ29udmVydGVyIiwiVmFsdWVDb252ZXJ0ZXIiLCJhbGxvY2F0ZURhdGFTbG90IiwibnVtU2xvdHMiLCJhbGxvY2F0ZVB1cmVGdW5jdGlvblNsb3RzIiwic2xvdCIsInBpcGVUeXBlIiwiY3JlYXRpb25JbnN0cnVjdGlvbiIsInJlZ2lzdGVyQ29udGV4dFZhcmlhYmxlcyIsInNjb3BlZE5hbWUiLCJmcmVzaFJlZmVyZW5jZU5hbWUiLCJyZXRyaWV2YWxMZXZlbCIsInJlbGF0aXZlTGV2ZWwiLCJzaGFyZWRDdHhWYXIiLCJnZXRTaGFyZWRDb250ZXh0TmFtZSIsImdlbmVyYXRlTmV4dENvbnRleHRFeHByIiwiYnVpbGRUZW1wbGF0ZUZ1bmN0aW9uIiwibmdDb250ZW50U2VsZWN0b3JzT2Zmc2V0IiwiaW5pdEkxOG5Db250ZXh0IiwiaXNTaW5nbGVFbGVtZW50VGVtcGxhdGUiLCJzZWxmQ2xvc2luZ0kxOG5JbnN0cnVjdGlvbiIsImhhc1RleHRDaGlsZHJlbk9ubHkiLCJ1cGRhdGVQaXBlU2xvdE9mZnNldHMiLCJidWlsZFRlbXBsYXRlRm4iLCJyM1Jlc2VydmVkU2xvdHMiLCJjcmVhdGlvblN0YXRlbWVudHMiLCJ1cGRhdGVTdGF0ZW1lbnRzIiwiY3JlYXRpb25WYXJpYWJsZXMiLCJ2aWV3U25hcHNob3RTdGF0ZW1lbnRzIiwidXBkYXRlVmFyaWFibGVzIiwiY3JlYXRpb25CbG9jayIsInVwZGF0ZUJsb2NrIiwiaTE4blRyYW5zbGF0ZSIsInRyYW5zZm9ybUZuIiwiX3JlZiIsImkxOG5HZW5lcmF0ZUNsb3N1cmVWYXIiLCJfcGFyYW1zIiwiZ2V0VHJhbnNsYXRpb25EZWNsU3RtdHMiLCJnZXRTZXJpYWxpemVkSTE4bkNvbnRlbnQiLCJpMThuQXBwZW5kQmluZGluZ3MiLCJpMThuQmluZFByb3BzIiwibGFiZWwiLCJhc3NlbWJsZUkxOG5Cb3VuZFN0cmluZyIsImFjYyIsImxhc3RJZHgiLCJtZXNzYWdlSWQiLCJ1bmlxdWVTdWZmaXgiLCJpMThuVXBkYXRlUmVmIiwiaXNSZXNvbHZlZCIsImljdU1hcHBpbmdfMSIsInBsYWNlaG9sZGVyIiwicmVmXzEiLCJ1cGRhdGVJbnN0cnVjdGlvbiIsInByb2plY3Rpb25TbG90SWR4IiwiZ2V0TmdQcm9qZWN0QXNMaXRlcmFsIiwiZ2V0TmFtZXNwYWNlSW5zdHJ1Y3Rpb24iLCJuYW1lc3BhY2VLZXkiLCJhZGROYW1lc3BhY2VJbnN0cnVjdGlvbiIsIm5zSW5zdHJ1Y3Rpb24iLCJzdHlsaW5nQnVpbGRlciIsImlzTm9uQmluZGFibGVNb2RlIiwiaXNJMThuUm9vdEVsZW1lbnQiLCJpMThuQXR0cnMiLCJvdXRwdXRBdHRycyIsImlzTmdDb250YWluZXIkMSIsIm1hdGNoRGlyZWN0aXZlcyIsImFsbE90aGVySW5wdXRzIiwiZ2V0QXR0cmlidXRlTmFtZUxpdGVyYWxzIiwicHJlcGFyZU5vblJlbmRlckF0dHJzIiwidG9BdHRyc1BhcmFtIiwicHJlcGFyZVJlZnNQYXJhbWV0ZXIiLCJ3YXNJbk5hbWVzcGFjZSIsImN1cnJlbnROYW1lc3BhY2UiLCJjcmVhdGVTZWxmQ2xvc2luZ0luc3RydWN0aW9uIiwiY3JlYXRlU2VsZkNsb3NpbmdJMThuSW5zdHJ1Y3Rpb24iLCJoYXNCaW5kaW5nc18xIiwiaTE4bkF0dHJBcmdzXzEiLCJjb252ZXJ0ZWQiLCJjb252ZXJ0RXhwcmVzc2lvbkJpbmRpbmciLCJwcm9jZXNzU3R5bGluZ0luc3RydWN0aW9uIiwib3V0cHV0QXN0IiwicHJlcGFyZUxpc3RlbmVyUGFyYW1ldGVyIiwiZW1wdHlWYWx1ZUJpbmRJbnN0cnVjdGlvbiIsImlucHV0VHlwZSIsInZhbHVlXzEiLCJoYXNWYWx1ZV8xIiwiYmluZGluZ05hbWVfMSIsInZhbHVlXzIiLCJpbnN0cnVjdGlvbl8xIiwicGFyYW1zXzIiLCJhdHRyTmFtZXNwYWNlIiwiYXR0ck5hbWVfMSIsImlzQXR0cmlidXRlQmluZGluZyIsInNhbml0aXphdGlvblJlZiIsInJlc29sdmVTYW5pdGl6YXRpb25GbiIsIm5hbWVzcGFjZUxpdGVyYWwiLCJnZXRQcm9wZXJ0eUludGVycG9sYXRpb25FeHByZXNzaW9uIiwiZ2V0SW50ZXJwb2xhdGlvbkFyZ3NMZW5ndGgiLCJnZXRVcGRhdGVJbnN0cnVjdGlvbkFyZ3VtZW50cyIsImF0dHJzRXhwcnMiLCJ0ZW1wbGF0ZVZpc2l0b3IiLCJ0ZW1wbGF0ZUZ1bmN0aW9uRXhwciIsImdldENvbnN0Q291bnQiLCJnZXRWYXJDb3VudCIsInRlbXBsYXRlUHJvcGVydHlCaW5kaW5ncyIsInZhbHVlXzMiLCJpbml0V2FzSW52b2tlZCIsImdldE5nQ29udGVudFNlbGVjdG9ycyIsImJpbmRpbmdDb250ZXh0IiwidmFsdWVfNCIsInBhcmFtc09yRm4iLCJwcmVwZW5kIiwiY3JlYXRlTW9kZSIsInBhcmFtc0ZuIiwib3JpZ2luYWxTbG90cyIsImdldEltcGxpY2l0UmVjZWl2ZXJFeHByIiwidmFsRXhwciIsInNraXBCaW5kRm4iLCJpbnRlcnBvbGF0aW9uRm4iLCJjb252ZXJ0ZWRQcm9wZXJ0eUJpbmRpbmciLCJjb252ZXJ0VXBkYXRlQXJndW1lbnRzIiwiY29udGV4dFZhcmlhYmxlRXhwcmVzc2lvbiIsImV4cHJlc3Npb25XaXRoQXJndW1lbnRzVG9FeHRyYWN0IiwiY3JlYXRlQ3NzU2VsZWN0b3IiLCJzdGF0aWNUeXBlIiwiYWxyZWFkeVNlZW4iLCJhdHRyRXhwcnMiLCJhZGRBdHRyRXhwciIsImF0dHJzU3RhcnRJbmRleCIsInJlZnNQYXJhbSIsInZhcmlhYmxlTmFtZSIsIm5leHRDb250ZXh0U3RtdCIsInJlZkV4cHIiLCJiaW5kaW5nRm5OYW1lIiwiYWxsb2NhdGVTbG90IiwiX3BpcGVCaW5kRXhwcnMiLCJzbG90UHNldWRvTG9jYWwiLCJwdXJlRnVuY3Rpb25TbG90IiwicGlwZUJpbmRpbmdDYWxsSW5mbyIsInBpcGVCaW5kaW5nSWRlbnRpZmllcnMiLCJpc1Zhckxlbmd0aCIsInBpcGVCaW5kRXhwciIsImJpbmRpbmdTbG90cyIsInB1cmVGdW5jdGlvbklkZW50aWZpZXJzIiwicmVsYXRpdmVMZXZlbERpZmYiLCJhbGxvY2F0ZVNsb3RzIiwic3RhcnRTbG90IiwicHVyZUZ1bmN0aW9uQ2FsbEluZm8iLCJhdHRyaWJ1dGVOYW1lc3BhY2UiLCJuYW1lTGl0ZXJhbCIsIkJpbmRpbmdTY29wZSIsInJlZmVyZW5jZU5hbWVJbmRleCIsInJlc3RvcmVWaWV3VmFyaWFibGUiLCJfUk9PVF9TQ09QRSIsImRlY2xhcmVMb2NhbENhbGxiYWNrIiwiZGVjbGFyZSIsImxvY2FsUmVmIiwibWF5YmVHZW5lcmF0ZVNoYXJlZENvbnRleHRWYXIiLCJtYXliZVJlc3RvcmVWaWV3IiwiZ2V0Q29tcG9uZW50UHJvcGVydHkiLCJTSEFSRURfQ09OVEVYVF9LRVkiLCJuZXdTY29wZSIsImdlbmVyYXRlU2hhcmVkQ29udGV4dFZhciIsImJpbmRpbmdLZXkiLCJzaGFyZWRDdHhPYmoiLCJjb21wb25lbnRWYWx1ZSIsImxvY2FsUmVmTG9va3VwIiwiaXNMaXN0ZW5lclNjb3BlIiwiZ2V0Q3VycmVudFZpZXdJbnN0cnVjdGlvbiIsImN1cnJlbnRDb250ZXh0TGV2ZWwiLCJsZXZlbERpZmYiLCJjdXJyU3RtdHMiLCJwYXJzZWRSM1NlbGVjdG9yIiwibWFrZUJpbmRpbmdQYXJzZXIiLCJBVFRSX1JFR0VYIiwiYmFzZURpcmVjdGl2ZUZpZWxkcyIsImNyZWF0ZURpcmVjdGl2ZVNlbGVjdG9yIiwiY3JlYXRlQ29udGVudFF1ZXJpZXNGdW5jdGlvbiIsImNyZWF0ZVZpZXdRdWVyaWVzRnVuY3Rpb24iLCJob3N0VmFyc0NvdW50IiwiZ2V0U3R5bGluZ1ByZWZpeCIsImVsVmFyRXhwIiwiY29udGV4dFZhckV4cCIsInN0eWxlQnVpbGRlciIsInNwZWNpYWxBdHRyaWJ1dGVzIiwic3R5bGVBdHRyIiwiY3JlYXRlSG9zdEJpbmRpbmdzRnVuY3Rpb24iLCJzdGF0aWNBdHRyaWJ1dGVzQW5kVmFsdWVzIiwiY3JlYXRlU3RhdGVtZW50cyIsInRvdGFsSG9zdFZhcnNDb3VudCIsImhvc3RCaW5kaW5nU291cmNlU3BhbiIsInR5cGVTb3VyY2VTcGFuIiwiZGlyZWN0aXZlU3VtbWFyeSIsIm1ldGFkYXRhQXNTdW1tYXJ5IiwiZ2V0VmFsdWVDb252ZXJ0ZXIiLCJvcmlnaW5hbFZhcnNDb3VudCIsImV2ZW50QmluZGluZ3MiLCJjcmVhdGVIb3N0TGlzdGVuZXJzIiwiYmluZGluZ0ZuIiwiZ2V0QmluZGluZ05hbWVBbmRJbnN0cnVjdGlvbiIsImF0dHJNYXRjaGVzIiwic2FuaXRpemVyRm4iLCJpbnN0cnVjdGlvblBhcmFtcyIsImhvc3RBdHRycyIsImNvbnZlcnRBdHRyaWJ1dGVzVG9FeHByZXNzaW9ucyIsImhvc3RJbnN0cnVjdGlvbiIsImNyZWF0ZVN0eWxpbmdTdG10IiwiZWxlbWVudFN0eWxpbmdJbnN0cnVjdGlvbiIsImhvc3RCaW5kaW5nc0ZuTmFtZSIsImFkZEZlYXR1cmVzIiwidXNlc0luaGVyaXRhbmNlIiwibGlmZWN5Y2xlIiwidXNlc09uQ2hhbmdlcyIsImNvbXBpbGVEaXJlY3RpdmVGcm9tTWV0YWRhdGEiLCJjcmVhdGVUeXBlRm9yRGVmIiwiY29tcGlsZUNvbXBvbmVudEZyb21NZXRhZGF0YSIsImZpcnN0U2VsZWN0b3IiLCJzZWxlY3RvckF0dHJpYnV0ZXMiLCJzZWxlY3Rvcl8xIiwiZXhwcmVzc2lvbl8xIiwidGVtcGxhdGVUeXBlTmFtZSIsImRpcmVjdGl2ZXNVc2VkIiwicGlwZXNVc2VkIiwidGVtcGxhdGVCdWlsZGVyIiwiUk9PVF9TQ09QRSIsInRlbXBsYXRlRnVuY3Rpb25FeHByZXNzaW9uIiwiZGlyZWN0aXZlc0V4cHIiLCJ3cmFwRGlyZWN0aXZlc0FuZFBpcGVzSW5DbG9zdXJlIiwicGlwZXNFeHByIiwic2hhZG93Q3NzIiwiZGlyZWN0aXZlTWV0YWRhdGFGcm9tR2xvYmFsTWV0YWRhdGEiLCJxdWVyaWVzRnJvbUdsb2JhbE1ldGFkYXRhIiwic2VsZWN0b3JzRnJvbUdsb2JhbE1ldGFkYXRhIiwic3RhdGljIiwic2VsZWN0b3JTdHJpbmdzIiwicHJlcGFyZVF1ZXJ5UGFyYW1zIiwiZV8zIiwidGVtcEFsbG9jYXRvciIsInF1ZXJpZXNfMSIsInF1ZXJpZXNfMV8xIiwicXVlcnlJbnN0cnVjdGlvbiIsImdldFF1ZXJ5TGlzdCIsInJlZnJlc2giLCJ1cGRhdGVEaXJlY3RpdmUiLCJlXzNfMSIsImNvbnRlbnRRdWVyaWVzRm5OYW1lIiwic3RyaW5nTWFwQXNUeXBlIiwic3RyaW5nQXJyYXlBc1R5cGUiLCJ0eXBlQmFzZSIsInNlbGVjdG9yRm9yVHlwZSIsInEiLCJxdWVyeURlZmluaXRpb24iLCJ2aWV3UXVlcnlGbk5hbWUiLCJpbXBsaWNpdCIsInR5cGVNYXBUb0V4cHJlc3Npb25NYXAiLCJIT1NUX1JFR19FWFAkMSIsIlJlc291cmNlTG9hZGVyIiwiQ29tcGlsZXJGYWNhZGVJbXBsIiwiaml0RXZhbHVhdG9yIiwiZWxlbWVudFNjaGVtYVJlZ2lzdHJ5IiwiY29tcGlsZVBpcGUiLCJhbmd1bGFyQ29yZUVudiIsInNvdXJjZU1hcFVybCIsImZhY2FkZSIsImNvbnZlcnRSM0RlcGVuZGVuY3lNZXRhZGF0YUFycmF5Iiwiaml0RXhwcmVzc2lvbiIsImNvbXBpbGVJbmplY3RhYmxlIiwiZmFjdG9yeU1ldGEiLCJjdG9yRGVwcyIsInVzZUNsYXNzT25TZWxmIiwidXNlckRlcHMiLCJjb21wdXRlUHJvdmlkZWRJbiIsIndyYXBFeHByZXNzaW9uIiwiVVNFX0NMQVNTIiwiVVNFX0ZBQ1RPUlkiLCJVU0VfVkFMVUUiLCJVU0VfRVhJU1RJTkciLCJjb21waWxlSW5qZWN0b3IiLCJ3cmFwUmVmZXJlbmNlIiwiY29tcGlsZURpcmVjdGl2ZSIsImNvbnZlcnREaXJlY3RpdmVGYWNhZGVUb01ldGFkYXRhIiwicHJlU3RhdGVtZW50cyIsInBhcnNlVGVtcGxhdGUiLCJwYXJzZVJlc3VsdCIsImNvbXBpbGVCYXNlIiwiY29tcGlsZUJhc2VEZWZGcm9tTWV0YWRhdGEiLCJpbnB1dHNfMSIsInZ4Iiwib3V0cHV0c18xIiwiY29udmVydFRvUjNRdWVyeU1ldGFkYXRhIiwiY3JlYXRlUGFyc2VTb3VyY2VTcGFuIiwicjNKaXRUeXBlU291cmNlU3BhbiIsInNvdXJjZUZpbGUiLCJpbnB1dHNGcm9tTWV0YWRhdGEiLCJwYXJzZUlucHV0T3V0cHV0cyIsIm91dHB1dHNGcm9tTWV0YWRhdGEiLCJpbnB1dHNGcm9tVHlwZSIsIm91dHB1dHNGcm9tVHlwZSIsIl9sb29wXzEiLCJmaWVsZCIsImFubiIsImlzSW5wdXQiLCJpc091dHB1dCIsImV4dHJhY3RIb3N0QmluZGluZ3MiLCJjb252ZXJ0UjNEZXBlbmRlbmN5TWV0YWRhdGEiLCJmYWNhZGVzIiwicGFyc2VIb3N0QmluZGluZ3MiLCJlXzQiLCJlXzRfMSIsInZlcmlmeUhvc3RCaW5kaW5ncyIsInN1bW1hcnkiLCJfbG9vcF8yIiwiaXNIb3N0TGlzdGVuZXIiLCJwaWVjZSIsIkNvbXBpbGVyQ29uZmlnIiwiZGVmYXVsdEVuY2Fwc3VsYXRpb24iLCJ1c2VKaXQiLCJqaXREZXZNb2RlIiwibWlzc2luZ1RyYW5zbGF0aW9uIiwic3RyaWN0SW5qZWN0aW9uUGFyYW1ldGVycyIsInByZXNlcnZlV2hpdGVzcGFjZXNEZWZhdWx0IiwicHJlc2VydmVXaGl0ZXNwYWNlc09wdGlvbiIsImRlZmF1bHRTZXR0aW5nIiwiRGlyZWN0aXZlTm9ybWFsaXplciIsIl9yZXNvdXJjZUxvYWRlciIsIl9yZXNvdXJjZUxvYWRlckNhY2hlIiwibm9ybWFsaXplZERpcmVjdGl2ZSIsIl9mZXRjaCIsIm5vcm1hbGl6ZVRlbXBsYXRlIiwicHJlbm9ybURhdGEiLCJfcHJlUGFyc2VUZW1wbGF0ZSIsInByZXBhcnNlZFRlbXBsYXRlIiwiX25vcm1hbGl6ZVRlbXBsYXRlTWV0YWRhdGEiLCJwcmVub21EYXRhIiwiX3ByZXBhcnNlTG9hZGVkVGVtcGxhdGUiLCJ0ZW1wbGF0ZUFic1VybCIsInJvb3ROb2Rlc0FuZEVycm9ycyIsInRlbXBsYXRlTWV0YWRhdGFTdHlsZXMiLCJfbm9ybWFsaXplU3R5bGVzaGVldCIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yIiwidGVtcGxhdGVTdHlsZXMiLCJpbmxpbmVTdHlsZVVybHMiLCJfbG9hZE1pc3NpbmdFeHRlcm5hbFN0eWxlc2hlZXRzIiwiX25vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlTWV0YWRhdGEiLCJzdHlsZXNoZWV0cyIsIl9pbmxpbmVTdHlsZXMiLCJ0YXJnZXRTdHlsZXMiLCJsb2FkZWRTdHlsZXNoZWV0cyIsImxvYWRlZFN0eWxlIiwiYWxsU3R5bGVVcmxzIiwiYWxsU3R5bGVzIiwic3R5bGVXaXRoSW1wb3J0cyIsImV4dHJhY3RTdHlsZVVybHMiLCJyZXNvbHZlciIsImJhc2VVcmwiLCJmb3VuZFVybHMiLCJtb2RpZmllZENzc1RleHQiLCJuZ05vbkJpbmRhYmxlU3RhY2tDb3VudCIsInRleHRDb250ZW50XzEiLCJRVUVSWV9NRVRBREFUQV9JREVOVElGSUVSUyIsIkRpcmVjdGl2ZVJlc29sdmVyIiwiaXNEaXJlY3RpdmUiLCJ0eXBlTWV0YWRhdGEiLCJpc0RpcmVjdGl2ZU1ldGFkYXRhIiwidGhyb3dJZk5vdEZvdW5kIiwiZmluZExhc3QiLCJwcm9wZXJ0eU1ldGFkYXRhIiwiX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEiLCJkbSIsImRpcmVjdGl2ZVR5cGUiLCJob3N0QmluZGluZyIsInN0YXJ0V2l0aCIsImhvc3RMaXN0ZW5lciIsIl9tZXJnZSIsIl9leHRyYWN0UHVibGljTmFtZSIsIl9kZWR1cGVCaW5kaW5ncyIsIm5hbWVzIiwicHVibGljTmFtZXMiLCJyZXZlcnNlZFJlc3VsdCIsIm1lcmdlZElucHV0cyIsIm1lcmdlZE91dHB1dHMiLCJtZXJnZWRIb3N0IiwibWVyZ2VkUXVlcmllcyIsIm1vZHVsZUlkIiwiSTE4bkVycm9yIiwiX0kxOE5fQVRUUiIsIl9JMThOX0NPTU1FTlRfUFJFRklYX1JFR0VYUCIsIk1FQU5JTkdfU0VQQVJBVE9SIiwiSURfU0VQQVJBVE9SIiwiaTE4bkNvbW1lbnRzV2FybmVkIiwiX1Zpc2l0b3JNb2RlIiwiRXh0cmFjdGlvblJlc3VsdCIsIl9WaXNpdG9yJDIiLCJfaW1wbGljaXRUYWdzIiwiX2ltcGxpY2l0QXR0cnMiLCJleHRyYWN0IiwiX2luaXQiLCJFeHRyYWN0IiwiX2luSTE4bkJsb2NrIiwiX21lc3NhZ2VzIiwidHJhbnNsYXRpb25zIiwiTWVyZ2UiLCJfdHJhbnNsYXRpb25zIiwidHJhbnNsYXRlZE5vZGUiLCJfbW9kZSIsIl9tYXlCZUFkZEJsb2NrQ2hpbGRyZW4iLCJ3YXNJbkljdSIsIl9pbkljdSIsIl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvbiIsIl9hZGRNZXNzYWdlIiwiaXNPcGVuaW5nIiwiX2lzT3BlbmluZ0NvbW1lbnQiLCJpc0Nsb3NpbmciLCJfaXNDbG9zaW5nQ29tbWVudCIsIl9pbkkxOG5Ob2RlIiwiX2RlcHRoIiwiX2Jsb2NrU3RhcnREZXB0aCIsIl9jbG9zZVRyYW5zbGF0YWJsZVNlY3Rpb24iLCJfYmxvY2tDaGlsZHJlbiIsIl9ibG9ja01lYW5pbmdBbmREZXNjIiwiX3RyYW5zbGF0ZU1lc3NhZ2UiLCJfb3BlblRyYW5zbGF0YWJsZVNlY3Rpb24iLCJ3YXNJbkkxOG5Ob2RlIiwid2FzSW5JbXBsaWNpdE5vZGUiLCJfaW5JbXBsaWNpdE5vZGUiLCJ0cmFuc2xhdGVkQ2hpbGROb2RlcyIsImkxOG5BdHRyIiwiX2dldEkxOG5BdHRyIiwiaTE4bk1ldGEiLCJpc0ltcGxpY2l0IiwiaXNUb3BMZXZlbEltcGxpY2l0IiwiaXNUcmFuc2xhdGFibGUiLCJ2aXNpdGVkIiwiX3Zpc2l0QXR0cmlidXRlc09mIiwidHJhbnNsYXRlZEF0dHJzIiwiX3RyYW5zbGF0ZUF0dHJpYnV0ZXMiLCJfbXNnQ291bnRBdFNlY3Rpb25TdGFydCIsImV4cGxpY2l0QXR0ck5hbWVUb1ZhbHVlIiwiaW1wbGljaXRBdHRyTmFtZXMiLCJtc2dNZXRhIiwiX3BhcnNlTWVzc2FnZU1ldGEiLCJpMThuUGFyc2VkTWVzc2FnZU1ldGEiLCJ0cmFuc2xhdGVkQXR0cmlidXRlcyIsImRpcmVjdENoaWxkcmVuIiwiX1RBR19ERUZJTklUSU9OIiwiWG1sVGFnRGVmaW5pdGlvbiIsInJlcXVpcmVFeHRyYVBhcmVudCIsImdldFhtbFRhZ0RlZmluaXRpb24iLCJYbWxQYXJzZXIiLCJYbGlmZiIsIl9Xcml0ZVZpc2l0b3IiLCJ0cmFuc1VuaXRzIiwiY29udGV4dFRhZ3MiLCJjb250ZXh0R3JvdXBUYWciLCJwdXJwb3NlIiwidHJhbnNVbml0IiwiZGF0YXR5cGUiLCJ4bGlmZiIsInhtbG5zIiwiWGxpZmZQYXJzZXIiLCJtc2dJZFRvSHRtbCIsImkxOG5Ob2Rlc0J5TXNnSWQiLCJYbWxUb0kxOG4iLCJtc2dJZCIsImNvbnZlcnQiLCJpMThuTm9kZXMiLCJjdHlwZSIsImdldEN0eXBlRm9yVGFnIiwiZXF1aXZUZXh0IiwiX2xvY2FsZSIsIl91bml0TWxTdHJpbmciLCJfbXNnSWRUb0h0bWwiLCJ4bWwiLCJpZEF0dHIiLCJfYWRkRXJyb3IiLCJpbm5lclRleHRTdGFydCIsImlubmVyVGV4dEVuZCIsImlubmVyVGV4dCIsImxvY2FsZUF0dHIiLCJ4bWxJY3UiLCJuYW1lQXR0ciIsImNhc2VNYXAiLCJYbGlmZjIiLCJfV3JpdGVWaXNpdG9yJDEiLCJ1bml0cyIsIm5vdGVzIiwiY2F0ZWdvcnkiLCJzcmNMYW5nIiwiWGxpZmYyUGFyc2VyIiwiWG1sVG9JMThuJDEiLCJnZXRUeXBlRm9yVGFnIiwiX25leHRQbGFjZWhvbGRlcklkIiwiZXF1aXYiLCJkaXNwIiwidGFnUGMiLCJlcXVpdlN0YXJ0IiwiZXF1aXZFbmQiLCJkaXNwU3RhcnQiLCJkaXNwRW5kIiwiaWRTdHIiLCJ2ZXJzaW9uQXR0ciIsInN0YXJ0QXR0ciIsImVuZEF0dHIiLCJzdGFydElkIiwiZW5kSWQiLCJYdGIiLCJYdGJQYXJzZXIiLCJYbWxUb0kxOG4kMiIsImNyZWF0ZUxhenlQcm9wZXJ0eSIsInZhbHVlRm4iLCJ4dGIiLCJfYnVuZGxlRGVwdGgiLCJsYW5nQXR0ciIsIlRyYW5zbGF0aW9uQnVuZGxlIiwiX2kxOG5Ob2Rlc0J5TXNnSWQiLCJtYXBwZXJGYWN0b3J5IiwibWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kiLCJXYXJuaW5nIiwiX2kxOG5Ub0h0bWwiLCJJMThuVG9IdG1sVmlzaXRvciIsInNlcmlhbGl6ZXIiLCJzcmNNc2ciLCJfZGlnZXN0IiwiX21hcHBlckZhY3RvcnkiLCJfbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kiLCJfY29udGV4dFN0YWNrIiwiX2NvbnZlcnRUb1RleHQiLCJfc3JjTXNnIiwiX21hcHBlciIsIm1hcHBlciIsIkkxOE5IdG1sUGFyc2VyIiwidHJhbnNsYXRpb25zRm9ybWF0IiwiY3JlYXRlU2VyaWFsaXplciIsImZvcm1hdCIsIl90cmFuc2xhdGlvbkJ1bmRsZSIsIm1lcmdlVHJhbnNsYXRpb25zIiwiaW1wbGljaXRUYWdzIiwiaW1wbGljaXRBdHRycyIsImNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0IiwiX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIiLCJxdW90ZWRTZXQiLCJtYXBFbnRyeSIsIkluamVjdGFibGVDb21waWxlciIsImFsd2F5c0dlbmVyYXRlRGVmIiwidG9rZW5JbmplY3RvciIsImRlcHNBcnJheSIsInRva2VuRXhwciIsImZhY3RvcnlGb3IiLCJyZXRWYWx1ZSIsImRlcEFyZ3MiLCJjb21waWxlIiwiU3RhdGljIiwiU1RSSVBfU1JDX0ZJTEVfU1VGRklYRVMiLCJHRU5FUkFURURfRklMRSIsIkpJVF9TVU1NQVJZX0ZJTEUiLCJKSVRfU1VNTUFSWV9OQU1FIiwibmdmYWN0b3J5RmlsZVBhdGgiLCJmb3JjZVNvdXJjZUZpbGUiLCJ1cmxXaXRoU3VmZml4Iiwic3BsaXRUeXBlc2NyaXB0U3VmZml4Iiwibm9ybWFsaXplR2VuRmlsZVN1ZmZpeCIsInN0cmlwR2VuZXJhdGVkRmlsZVN1ZmZpeCIsImxhc3REb3QiLCJzcmNGaWxlU3VmZml4Iiwic3VtbWFyeUZpbGVOYW1lIiwiZmlsZU5hbWUiLCJzdW1tYXJ5Rm9ySml0RmlsZU5hbWUiLCJzdW1tYXJ5Rm9ySml0TmFtZSIsInN5bWJvbE5hbWUiLCJMaWZlY3ljbGVIb29rcyIsIkxPV0VSRURfU1lNQk9MIiwiTElGRUNZQ0xFX0hPT0tTX1ZBTFVFUyIsIk9uSW5pdCIsIk9uRGVzdHJveSIsIkRvQ2hlY2siLCJPbkNoYW5nZXMiLCJBZnRlckNvbnRlbnRJbml0IiwiQWZ0ZXJDb250ZW50Q2hlY2tlZCIsIkFmdGVyVmlld0luaXQiLCJBZnRlclZpZXdDaGVja2VkIiwiZ2V0SG9va05hbWUiLCJFUlJPUl9DT01QT05FTlRfVFlQRSIsIkNvbXBpbGVNZXRhZGF0YVJlc29sdmVyIiwiX25nTW9kdWxlUmVzb2x2ZXIiLCJfZGlyZWN0aXZlUmVzb2x2ZXIiLCJfcGlwZVJlc29sdmVyIiwiX3N1bW1hcnlSZXNvbHZlciIsIl9kaXJlY3RpdmVOb3JtYWxpemVyIiwiX3N0YXRpY1N5bWJvbENhY2hlIiwiX2Vycm9yQ29sbGVjdG9yIiwiX25vbk5vcm1hbGl6ZWREaXJlY3RpdmVDYWNoZSIsIl9kaXJlY3RpdmVDYWNoZSIsIl9zdW1tYXJ5Q2FjaGUiLCJfcGlwZUNhY2hlIiwiX25nTW9kdWxlQ2FjaGUiLCJfbmdNb2R1bGVPZlR5cGVzIiwiX3NoYWxsb3dNb2R1bGVDYWNoZSIsImdldFJlZmxlY3RvciIsIl9jcmVhdGVQcm94eUNsYXNzIiwiYmFzZVR5cGUiLCJwcm94eUNsYXNzIiwic2V0RGVsZWdhdGUiLCJnZXRHZW5lcmF0ZWRDbGFzcyIsImRpclR5cGUiLCJnZXRDb21wb25lbnRWaWV3Q2xhc3MiLCJnZXRIb3N0Q29tcG9uZW50Vmlld0NsYXNzIiwiaG9zdFZpZXdDbGFzc05hbWUiLCJnZXRIb3N0Q29tcG9uZW50VHlwZSIsImdldFJlbmRlcmVyVHlwZSIsImdldENvbXBvbmVudEZhY3RvcnkiLCJpbml0Q29tcG9uZW50RmFjdG9yeSIsIl9sb2FkU3VtbWFyeSIsInR5cGVTdW1tYXJ5IiwicmVzb2x2ZVN1bW1hcnkiLCJnZXRIb3N0Q29tcG9uZW50TWV0YWRhdGEiLCJob3N0Vmlld1R5cGUiLCJob3N0VHlwZSIsImxvYWREaXJlY3RpdmVNZXRhZGF0YSIsImlzU3luYyIsImdldE5vbk5vcm1hbGl6ZWREaXJlY3RpdmVNZXRhZGF0YSIsImNyZWF0ZURpcmVjdGl2ZU1ldGFkYXRhIiwidGVtcGxhdGVNZXRhZGF0YSIsIm5vcm1hbGl6ZWREaXJNZXRhIiwiY29tcG9uZW50U3RpbGxMb2FkaW5nRXJyb3IiLCJjYWNoZUVudHJ5Iiwibm9uTm9ybWFsaXplZFRlbXBsYXRlTWV0YWRhdGEiLCJjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSIsImVudHJ5Q29tcG9uZW50TWV0YWRhdGEiLCJfZ2V0UHJvdmlkZXJzTWV0YWRhdGEiLCJzdHJpbmdpZnlUeXBlIiwiZmxhdHRlbkFuZERlZHVwZUFycmF5IiwiX2dldEVudHJ5Q29tcG9uZW50TWV0YWRhdGEiLCJfZ2V0UXVlcmllc01ldGFkYXRhIiwiX2dldFR5cGVNZXRhZGF0YSIsImdldERpcmVjdGl2ZU1ldGFkYXRhIiwiZ2V0RGlyZWN0aXZlU3VtbWFyeSIsImRpclN1bW1hcnkiLCJpc1BpcGUiLCJpc05nTW9kdWxlIiwiZ2V0TmdNb2R1bGVTdW1tYXJ5IiwiYWxyZWFkeUNvbGxlY3RpbmciLCJtb2R1bGVTdW1tYXJ5IiwibW9kdWxlTWV0YSIsImdldE5nTW9kdWxlTWV0YWRhdGEiLCJsb2FkTmdNb2R1bGVEaXJlY3RpdmVBbmRQaXBlTWV0YWRhdGEiLCJsb2FkaW5nIiwiX2xvYWRQaXBlTWV0YWRhdGEiLCJnZXRTaGFsbG93TW9kdWxlTWV0YWRhdGEiLCJjb21waWxlTWV0YSIsIm5nTW9kdWxlTWV0YSIsInJhd0V4cG9ydHMiLCJyYXdJbXBvcnRzIiwicmF3UHJvdmlkZXJzIiwiZXhwb3J0ZWROb25Nb2R1bGVJZGVudGlmaWVycyIsImltcG9ydGVkVHlwZSIsImltcG9ydGVkTW9kdWxlVHlwZSIsImlzVmFsaWRUeXBlIiwibW9kdWxlV2l0aFByb3ZpZGVycyIsIl9jaGVja1NlbGZJbXBvcnQiLCJfZ2V0VHlwZURlc2NyaXB0b3IiLCJpbXBvcnRlZE1vZHVsZVN1bW1hcnkiLCJleHBvcnRlZFR5cGUiLCJleHBvcnRlZE1vZHVsZVN1bW1hcnkiLCJfZ2V0SWRlbnRpZmllck1ldGFkYXRhIiwiX2dldFRyYW5zaXRpdmVOZ01vZHVsZU1ldGFkYXRhIiwiZGVjbGFyZWRUeXBlIiwiZGVjbGFyZWRJZGVudGlmaWVyIiwiX2FkZFR5cGVUb01vZHVsZSIsImV4cG9ydGVkSWQiLCJvbGRNb2R1bGUiLCJtb2R1bGVzQnlUb2tlbiIsIm1vZFN1bW1hcnkiLCJtb2QiLCJhZGRlZFRva2VucyIsInByZXZNb2R1bGVzIiwiaXNJbmplY3RhYmxlIiwiZ2V0SW5qZWN0YWJsZVN1bW1hcnkiLCJnZXRJbmplY3RhYmxlTWV0YWRhdGEiLCJ0aHJvd09uVW5rbm93bkRlcHMiLCJfZ2V0RGVwZW5kZW5jaWVzTWV0YWRhdGEiLCJfZ2V0RmFjdG9yeU1ldGFkYXRhIiwiZ2V0UGlwZU1ldGFkYXRhIiwiZ2V0UGlwZVN1bW1hcnkiLCJwaXBlU3VtbWFyeSIsImdldE9yTG9hZFBpcGVNZXRhZGF0YSIsInBpcGVBbm5vdGF0aW9uIiwiaGFzVW5rbm93bkRlcHMiLCJkZXBlbmRlbmNpZXNNZXRhZGF0YSIsInBhcmFtRW50cnkiLCJfZ2V0VG9rZW5NZXRhZGF0YSIsImRlcHNUb2tlbnMiLCJ0YXJnZXRFbnRyeUNvbXBvbmVudHMiLCJkZWJ1Z0luZm8iLCJjb21waWxlUHJvdmlkZXJzIiwicHJvdmlkZXJJZHgiLCJwcm92aWRlck1ldGEiLCJfdmFsaWRhdGVQcm92aWRlciIsInByb3ZpZGVyc0luZm8iLCJzb0ZhciIsInNlZW5Qcm92aWRlciIsInNlZW5Qcm92aWRlcklkeCIsIl9nZXRFbnRyeUNvbXBvbmVudHNGcm9tUHJvdmlkZXIiLCJnZXRQcm92aWRlck1ldGFkYXRhIiwiY29sbGVjdGVkSWRlbnRpZmllcnMiLCJleHRyYWN0SWRlbnRpZmllcnMiLCJ0YXJnZXRJZGVudGlmaWVycyIsIl9Db21waWxlVmFsdWVDb252ZXJ0ZXIiLCJfZ2V0SW5qZWN0YWJsZVR5cGVNZXRhZGF0YSIsImNvbXBpbGVEZXBzIiwiY29tcGlsZVR5cGVNZXRhZGF0YSIsImNvbXBpbGVGYWN0b3J5TWV0YWRhdGEiLCJfZ2V0UXVlcnlNZXRhZGF0YSIsIl9xdWVyeVZhckJpbmRpbmdzIiwib3RoZXJUeXBlIiwidHJlZSIsImRlZHVwZUFycmF5IiwiZmxhdHRlbkFycmF5IiwicHJvdmlkZXJBc3QiLCJsaWZlY3ljbGVIb29rIiwibGlmZWN5Y2xlSG9va1RvTm9kZUZsYWciLCJtdWx0aVByb3ZpZGVyRGVmIiwiYWxsRGVwRGVmcyIsImFsbFBhcmFtcyIsInByb3ZpZGVySW5kZXgiLCJkZXBFeHBycyIsImNvbnZlcnREZXBzIiwicHJvdmlkZXJFeHByIiwiZGVwc0V4cHIiLCJkZXBJbmRleCIsInBhcmFtTmFtZSIsInNpbmdsZVByb3ZpZGVyRGVmIiwidG9rZW5NZXRhIiwibm9kZUZsYWciLCJjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJQcm92aWRlckRlZiIsImVudHJ5Q29tcG9uZW50RmFjdG9yaWVzIiwiZW50cnlDb21wb25lbnQiLCJjbGFzc01ldGEiLCJOZ01vZHVsZUNvbXBpbGVSZXN1bHQiLCJuZ01vZHVsZUZhY3RvcnlWYXIiLCJMT0dfVkFSIiwiTmdNb2R1bGVDb21waWxlciIsInNvdXJjZUZpbGVOYW1lIiwicHJvdmlkZXJQYXJzZXIiLCJwcm92aWRlckRlZnMiLCJuZ01vZHVsZURlZkZhY3RvcnkiLCJfY3JlYXRlTmdNb2R1bGVGYWN0b3J5IiwicmVnaXN0ZXJGYWN0b3J5U3RtdCIsImNyZWF0ZVN0dWIiLCJuZ01vZHVsZVJlZmVyZW5jZSIsIm5nTW9kdWxlRmFjdG9yeVN0bXQiLCJOZ01vZHVsZVJlc29sdmVyIiwiVHlwZVNjcmlwdEVtaXR0ZXIiLCJlbWl0U3RhdGVtZW50c0FuZENvbnRleHQiLCJwcmVhbWJsZSIsImVtaXRTb3VyY2VNYXBzIiwicmVmZXJlbmNlRmlsdGVyIiwiaW1wb3J0RmlsdGVyIiwiX1RzRW1pdHRlclZpc2l0b3IiLCJwcmVhbWJsZUxpbmVzIiwicmVleHBvcnRzIiwiZXhwb3J0ZWRNb2R1bGVOYW1lIiwicmVleHBvcnRzQ29kZSIsInJlZXhwb3J0IiwiYXMiLCJpbXBvcnRzV2l0aFByZWZpeGVzIiwiaW1wb3J0ZWRNb2R1bGVOYW1lIiwic20iLCJzb3VyY2VUZXh0IiwiZW1pdFN0YXRlbWVudHMiLCJ0eXBlRXhwcmVzc2lvbiIsImRlZmF1bHRUeXBlIiwiX3Zpc2l0SWRlbnRpZmllciIsIl9wcmludENvbG9uVHlwZSIsIl92aXNpdENsYXNzRmllbGQiLCJQcml2YXRlIiwiUGlwZVJlc29sdmVyIiwibWV0YXMiLCJkZWZhdWx0UmVzb2x2ZXIiLCJUeXBlQ2hlY2tDb21waWxlciIsImNvbXBvbmVudElkIiwiZXh0ZXJuYWxSZWZlcmVuY2VWYXJzIiwiZW1iZWRkZWRWaWV3Q291bnQiLCJ2aWV3QnVpbGRlckZhY3RvcnkiLCJlbWJlZGRlZFZpZXdJbmRleCIsIlZpZXdCdWlsZGVyIiwiVHlwZUNoZWNrTG9jYWxSZXNvbHZlciIsImlzSG9zdENvbXBvbmVudCIsInJlZk91dHB1dFZhcnMiLCJ1cGRhdGVzIiwiYWN0aW9ucyIsImdldE91dHB1dFZhciIsImdldFR5cGVHdWFyZEV4cHJlc3Npb25zIiwiZ3VhcmQiLCJ1c2VJZiIsImFzdE5vZGVzIiwidGFyZ2V0U3RhdGVtZW50cyIsInZpZXdTdG10cyIsInByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uIiwiR2VuZXJhbCIsImd1YXJkRXhwcmVzc2lvbiIsImd1YXJkQ2xhdXNlIiwidmlld05hbWUiLCJ2aWV3RmFjdG9yeSIsInZpc2l0RWxlbWVudE9yVGVtcGxhdGUiLCJmdWxsVGVtcGxhdGVUeXBlQ2hlY2siLCJjaGlsZFZpc2l0b3IiLCJpbnB1dEFzdCIsImRpckFzdCIsIm91dHB1dFZhclR5cGUiLCJob3N0RXZlbnRBc3QiLCJjdXJyQnVpbGRlciIsInZhckFzdCIsInBpcGVPdXRwdXRWYXIiLCJDTEFTU19BVFRSJDEiLCJTVFlMRV9BVFRSIiwiVmlld0NvbXBpbGVSZXN1bHQiLCJ2aWV3Q2xhc3NWYXIiLCJyZW5kZXJlclR5cGVWYXIiLCJWaWV3Q29tcGlsZXIiLCJzdGF0aWNRdWVyeUlkcyIsImZpbmRTdGF0aWNRdWVyeUlkcyIsImR5bmFtaWNRdWVyeUlkcyIsImNoaWxkRGF0YSIsInJlbmRlckNvbXBvbmVudFZhck5hbWUiLCJ0ZW1wbGF0ZV8xIiwiY3VzdG9tUmVuZGVyRGF0YSIsInJlbmRlckNvbXBvbmVudFZhciIsIlZpZXdCdWlsZGVyJDEiLCJMT0dfVkFSJDEiLCJWSUVXX1ZBUiIsIkNIRUNLX1ZBUiIsIkNPTVBfVkFSIiwiRVZFTlRfTkFNRV9WQVIiLCJBTExPV19ERUZBVUxUX1ZBUiIsInB1cmVQaXBlTm9kZUluZGljZXMiLCJyZWZOb2RlSW5kaWNlcyIsIl9jcmVhdGVQaXBlIiwicXVlcnlJZHNfMSIsInN0YXRpY1ZpZXdRdWVyeUlkcyIsIm5vZGVTdGF0aWNRdWVyeUlkcyIsInF1ZXJ5SW5kZXgiLCJjYWxjU3RhdGljRHluYW1pY1F1ZXJ5RmxhZ3MiLCJuZWVkc0FkZGl0aW9uYWxSb290Tm9kZSIsImxhc3RBc3ROb2RlIiwiX2NyZWF0ZU5vZGVFeHByZXNzaW9ucyIsInVwZGF0ZVJlbmRlcmVyU3RtdHMiLCJ1cGRhdGVEaXJlY3RpdmVzU3RtdHMiLCJub2RlRGVmRXhwcnMiLCJ1cGRhdGVSZW5kZXJlckZuIiwiX2NyZWF0ZVVwZGF0ZUZuIiwidXBkYXRlRGlyZWN0aXZlc0ZuIiwidmlld0ZsYWdzIiwidXBkYXRlU3RtdHMiLCJ1cGRhdGVGbiIsInByZVN0bXRzIiwiaW50ZXIiLCJ1cGRhdGVSZW5kZXJlckV4cHJlc3Npb25zIiwiX3ByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uIiwiX3Zpc2l0RWxlbWVudE9yVGVtcGxhdGUiLCJxdWVyeU1hdGNoZXNFeHByIiwiX2NyZWF0ZUVsZW1lbnRIYW5kbGVFdmVudEZuIiwidXNlZEV2ZW50cyIsImRpckhvc3RCaW5kaW5ncyIsImlucHV0RGVmcyIsImVsZW1lbnRCaW5kaW5nRGVmIiwiY29tcEFzdCIsImNvbXBSZW5kZXJlclR5cGUiLCJmaXhlZEF0dHJzRGVmIiwiZWxlbWVudEV2ZW50TmFtZUFuZFRhcmdldCIsImVsZW1lbnRFdmVudEZ1bGxOYW1lIiwiX3Zpc2l0Q29tcG9uZW50RmFjdG9yeVJlc29sdmVyUHJvdmlkZXIiLCJsb2NhbERpckFzdCIsIl92aXNpdERpcmVjdGl2ZSIsImRpckhvc3RFdmVudHMiLCJfdmlzaXRQcm92aWRlciIsInF1ZXJ5TWF0Y2hFeHBycyIsImVsZW1lbnROb2RlSW5kZXgiLCJfdmlzaXRQcm92aWRlck9yRGlyZWN0aXZlIiwibWFwVmFsdWUiLCJ1cGRhdGVEaXJlY3RpdmVFeHByZXNzaW9ucyIsImRpckNvbnRleHRFeHByIiwiX2FkZFByb3ZpZGVyTm9kZSIsImNvbXBvbmVudERpck1ldGEiLCJwcm92aWRlckZsYWdzIiwiY3VyclZpZXdFeHByIiwicmVmTm9kZUluZGV4IiwidmFyVmFsdWUiLCJfY3JlYXRlTGl0ZXJhbEFycmF5Q29udmVydGVyIiwidmFsdWVFeHByXzEiLCJjYWxsQ2hlY2tTdG10IiwiX2NyZWF0ZUxpdGVyYWxNYXBDb252ZXJ0ZXIiLCJ2YWx1ZUV4cHJfMiIsIl9jcmVhdGVQaXBlQ29udmVydGVyIiwiY2hlY2tJbmRleF8xIiwiY29tcFZpZXdFeHByIiwiY29tcEJ1aWxkZXIiLCJwaXBlTm9kZUluZGV4IiwicGlwZVZhbHVlRXhwcl8xIiwiY2FsbFVud3JhcFZhbHVlIiwibm9kZVZhbHVlRXhwcl8xIiwiZGlEZXAiLCJ1cGRhdGVCaW5kaW5nQ291bnQiLCJjcmVhdGVVcGRhdGVTdGF0ZW1lbnRzIiwiYWxsb3dFbXB0eUV4cHJzIiwiaGFuZGxlcnMiLCJoYW5kbGVFdmVudEZuIiwiaGFuZGxlRXZlbnRTdG10cyIsImhhbmRsZUV2ZW50QmluZGluZ0NvdW50IiwidHJ1ZVN0bXRzIiwiZnVsbEV2ZW50TmFtZSIsImVsZW1lbnRBc3QiLCJtYXBSZXN1bHQiLCJtZXJnZUF0dHJpYnV0ZVZhbHVlIiwiYXR0clZhbHVlMSIsImF0dHJWYWx1ZTIiLCJzaG91bGRSZXNvbHZlQXNTdGF0aWNRdWVyeSIsIk1lc3NhZ2VCdW5kbGUiLCJ1cGRhdGVGcm9tVGVtcGxhdGUiLCJodG1sUGFyc2VyUmVzdWx0IiwiaTE4blBhcnNlclJlc3VsdCIsImV4dHJhY3RNZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZmlsdGVyU291cmNlcyIsIm1hcHBlclZpc2l0b3IiLCJNYXBQbGFjZWhvbGRlck5hbWVzIiwibXNnTGlzdCIsInNyYyIsInRyYW5zZm9ybWVkTWVzc2FnZSIsIkdlbmVyYXRlZEZpbGUiLCJzcmNGaWxlVXJsIiwiZ2VuRmlsZVVybCIsInNvdXJjZU9yU3RtdHMiLCJsaXN0TGF6eVJvdXRlcyIsImFsbExhenlSb3V0ZXMiLCJST1VURVMiLCJsb2FkQ2hpbGRyZW4iLCJfY29sbGVjdExvYWRDaGlsZHJlbiIsImxvYWRDaGlsZHJlbl8xIiwibG9hZENoaWxkcmVuXzFfMSIsInJvdXRlIiwicGFyc2VMYXp5Um91dGUiLCJyb3V0ZXMiLCJyb3V0ZXNfMSIsInJvdXRlc18xXzEiLCJyb3V0ZVBhdGgiLCJyb3V0ZU5hbWUiLCJyZWZlcmVuY2VkTW9kdWxlIiwiVFMiLCJSZXNvbHZlZFN0YXRpY1N5bWJvbCIsIlN0YXRpY1N5bWJvbFJlc29sdmVyIiwic3RhdGljU3ltYm9sQ2FjaGUiLCJzdW1tYXJ5UmVzb2x2ZXIiLCJlcnJvclJlY29yZGVyIiwibWV0YWRhdGFDYWNoZSIsInJlc29sdmVkU3ltYm9scyIsInJlc29sdmVkRmlsZVBhdGhzIiwiaW1wb3J0QXMiLCJzeW1ib2xSZXNvdXJjZVBhdGhzIiwic3ltYm9sRnJvbUZpbGUiLCJrbm93bkZpbGVOYW1lVG9Nb2R1bGVOYW1lcyIsInJlc29sdmVTeW1ib2wiLCJzdGF0aWNTeW1ib2wiLCJfcmVzb2x2ZVN5bWJvbE1lbWJlcnMiLCJyZXN1bHRGcm9tU3VtbWFyeSIsIl9yZXNvbHZlU3ltYm9sRnJvbVN1bW1hcnkiLCJyZXN1bHRGcm9tQ2FjaGUiLCJfY3JlYXRlU3ltYm9sc09mIiwiZ2V0SW1wb3J0QXMiLCJ1c2VTdW1tYXJpZXMiLCJiYXNlU3ltYm9sIiwiZ2V0U3RhdGljU3ltYm9sIiwiYmFzZUltcG9ydEFzIiwic3VtbWFyaXplZEZpbGVOYW1lIiwic3RyaXBTdW1tYXJ5Rm9ySml0RmlsZVN1ZmZpeCIsInN1bW1hcml6ZWROYW1lIiwic3RyaXBTdW1tYXJ5Rm9ySml0TmFtZVN1ZmZpeCIsImdldFJlc291cmNlUGF0aCIsImdldFR5cGVBcml0eSIsImlzR2VuZXJhdGVkRmlsZSIsInJlc29sdmVkU3ltYm9sIiwidW53cmFwUmVzb2x2ZWRNZXRhZGF0YSIsImFyaXR5IiwiZ2V0S25vd25Nb2R1bGVOYW1lIiwicmVjb3JkSW1wb3J0QXMiLCJzb3VyY2VTeW1ib2wiLCJ0YXJnZXRTeW1ib2wiLCJyZWNvcmRNb2R1bGVOYW1lRm9yRmlsZU5hbWUiLCJpbnZhbGlkYXRlRmlsZSIsInN5bWJvbHMiLCJzeW1ib2xzXzEiLCJzeW1ib2xzXzFfMSIsImlnbm9yZUVycm9yc0ZvciIsInJlY29yZGVyIiwiYmFzZVJlc29sdmVkU3ltYm9sIiwiYmFzZU1ldGFkYXRhIiwiX19zeW1ib2xpYyIsInN0YXRpY3MiLCJoYXNEZWNvcmF0b3JzIiwiZ2V0TW9kdWxlTWV0YWRhdGEiLCJnZXRTeW1ib2xzT2YiLCJzdW1tYXJ5U3ltYm9scyIsIm1ldGFkYXRhU3ltYm9scyIsIm1vZHVsZUV4cG9ydCIsImV4cG9ydCIsImV4cG9ydFN5bWJvbCIsInN5bU5hbWUiLCJ1bmVzY2FwZUlkZW50aWZpZXIiLCJyZXNvbHZlZE1vZHVsZSIsInJlc29sdmVNb2R1bGUiLCJjcmVhdGVFeHBvcnQiLCJ0aGlzXzEiLCJ0b3BMZXZlbFN5bWJvbE5hbWVzXzEiLCJvcmlnaW5zXzEiLCJzeW1ib2xNZXRhIiwib3JpZ2luIiwib3JpZ2luRmlsZVBhdGgiLCJnZXRPdXRwdXROYW1lIiwiY3JlYXRlUmVzb2x2ZWRTeW1ib2wiLCJ0b3BMZXZlbFBhdGgiLCJ0b3BMZXZlbFN5bWJvbE5hbWVzIiwiX29yaWdpbmFsRmlsZU1lbW8iLCJpc1RzRmlsZSIsImlzTGlicmFyeUZpbGUiLCJ0cmFuc2Zvcm1lZE1ldGFfMSIsImdldE9yaWdpbmFsTmFtZSIsInRyYW5zZm9ybWVkTWV0YSIsIlJlZmVyZW5jZVRyYW5zZm9ybWVyIiwiZnVuY3Rpb25QYXJhbXMiLCJzeW1ib2xpYyIsIm9sZExlbiIsImdldE1ldGFkYXRhRm9yIiwidW53cmFwcGVkVHJhbnNmb3JtZWRNZXRhIiwibW9kdWxlTWV0YWRhdGEiLCJtb2R1bGVNZXRhZGF0YXMiLCJtYXhWZXJzaW9uXzEiLCJtZCIsImVycm9yTWVzc2FnZSIsImdldFN5bWJvbEJ5TW9kdWxlIiwiY29udGFpbmluZ0ZpbGUiLCJtb2R1bGVOYW1lVG9GaWxlTmFtZSIsImNyZWF0ZVN1bW1hcnlGb3JKaXRGdW5jdGlvbiIsIlRvSnNvblNlcmlhbGl6ZXIiLCJzeW1ib2xSZXNvbHZlciIsInNyY0ZpbGVOYW1lIiwiaW5kZXhCeVN5bWJvbCIsInJlZXhwb3J0ZWRCeSIsInByb2Nlc3NlZFN1bW1hcnlCeVN5bWJvbCIsInByb2Nlc3NlZFN1bW1hcmllcyIsInVucHJvY2Vzc2VkU3ltYm9sU3VtbWFyaWVzQnlTeW1ib2wiLCJhZGRTdW1tYXJ5IiwidW5wcm9jZXNzZWRTdW1tYXJ5IiwicHJvY2Vzc2VkU3VtbWFyeSIsInByb2Nlc3NWYWx1ZSIsIm1ldGFkYXRhXzEiLCJjbG9uZV8xIiwiaXNDYWxsIiwiaXNGdW5jdGlvbkNhbGwiLCJpc01ldGhvZENhbGxPblZhcmlhYmxlIiwiZGVjbGFyYXRpb25TeW1ib2wiLCJpc0xvd2VyZWRTeW1ib2wiLCJuZ01vZHVsZVN1bW1hcnkiLCJzdW1tYXJ5XzEiLCJjcmVhdGVFeHRlcm5hbFN5bWJvbFJlZXhwb3J0cyIsImpzb24iLCJzdW1tYXJpZXMiLCJyZWV4cG9ydFN5bWJvbCIsIl9fc3ltYm9sIiwidG9TdW1tYXJ5RmlsZU5hbWUiLCJ2aXNpdFN0YXRpY1N5bWJvbCIsImxvYWRTdW1tYXJ5IiwiRm9ySml0U2VyaWFsaXplciIsImFkZFNvdXJjZVR5cGUiLCJpc0xpYnJhcnkiLCJhZGRMaWJUeXBlIiwiZXhwb3J0QXNBcnIiLCJleHBvcnRBc0J5U3ltYm9sIiwiZXhwb3J0QXNBcnJfMSIsImV4cG9ydEFzQXJyXzFfMSIsIm5nTW9kdWxlU3ltYm9scyIsIl9nIiwiX2giLCJfaiIsInNlcmlhbGl6ZVN1bW1hcnlXaXRoRGVwcyIsIm5nTW9kdWxlU3ltYm9sIiwiaml0RXhwb3J0QXNOYW1lIiwic2VyaWFsaXplU3VtbWFyeVJlZiIsInNlcmlhbGl6ZVN1bW1hcnkiLCJ0eXBlU3ltYm9sIiwiaml0SW1wb3J0ZWRTeW1ib2wiLCJUcmFuc2Zvcm1lciIsIkZyb21Kc29uRGVzZXJpYWxpemVyIiwic3ltYm9sQ2FjaGUiLCJkZXNlcmlhbGl6ZSIsImxpYnJhcnlGaWxlTmFtZSIsImFsbEltcG9ydEFzIiwic2VyaWFsaXplZFN5bWJvbCIsImZyb21TdW1tYXJ5RmlsZU5hbWUiLCJBb3RDb21waWxlciIsIl9vcHRpb25zIiwiX2hvc3QiLCJfbWV0YWRhdGFSZXNvbHZlciIsIl90ZW1wbGF0ZVBhcnNlciIsIl9zdHlsZUNvbXBpbGVyIiwiX3ZpZXdDb21waWxlciIsIl90eXBlQ2hlY2tDb21waWxlciIsIl9uZ01vZHVsZUNvbXBpbGVyIiwiX2luamVjdGFibGVDb21waWxlciIsIl9vdXRwdXRFbWl0dGVyIiwiX3N5bWJvbFJlc29sdmVyIiwiX3RlbXBsYXRlQXN0Q2FjaGUiLCJfYW5hbHl6ZWRGaWxlcyIsIl9hbmFseXplZEZpbGVzRm9ySW5qZWN0YWJsZXMiLCJhbmFseXplTW9kdWxlc1N5bmMiLCJyb290RmlsZXMiLCJhbmFseXplUmVzdWx0IiwiYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzIiwibmdNb2R1bGVzIiwiYW5hbHl6ZU1vZHVsZXNBc3luYyIsIl9hbmFseXplRmlsZSIsImFuYWx5emVkRmlsZSIsImFuYWx5emVGaWxlIiwiX2FuYWx5emVGaWxlRm9ySW5qZWN0YWJsZXMiLCJhbmFseXplRmlsZUZvckluamVjdGFibGVzIiwic3RhdGljU3ltYm9sUmVzb2x2ZXIiLCJtZXRhZGF0YVJlc29sdmVyIiwiaW5qZWN0YWJsZXMiLCJzaGFsbG93TW9kdWxlcyIsImZpbmRHZW5lcmF0ZWRGaWxlTmFtZXMiLCJnZW5GaWxlTmFtZXMiLCJhbGxvd0VtcHR5Q29kZWdlbkZpbGVzIiwiZXhwb3J0c05vblNvdXJjZUZpbGVzIiwiZW5hYmxlU3VtbWFyaWVzRm9ySml0IiwiZmlsZVN1ZmZpeCIsImRpclN5bWJvbCIsIm5vcm1hbGl6ZWRVcmwiLCJyZXNvdXJjZU5hbWVUb0ZpbGVOYW1lIiwibmVlZHNTaGltIiwiX3N0eWxlc01vZHVsZVVybCIsImVtaXRCYXNpY1N0dWIiLCJnZW5GaWxlTmFtZSIsIm9yaWdpbmFsRmlsZU5hbWUiLCJfY3JlYXRlT3V0cHV0Q29udGV4dCIsIm9yaWdpbmFsRmlsZSIsIl9jcmVhdGVOZ0ZhY3RvcnlTdHViIiwiX2NyZWF0ZUVtcHR5U3R1YiIsImNyZWF0ZUZvckppdFN0dWIiLCJfY29kZWdlblNvdXJjZU1vZHVsZSIsImVtaXRUeXBlQ2hlY2tTdHViIiwibG9hZEZpbGVzQXN5bmMiLCJmaWxlTmFtZXMiLCJ0c0ZpbGVzIiwiZmlsZXMiLCJsb2FkaW5nUHJvbWlzZXMiLCJhbmFseXplZEluamVjdGFibGVzIiwidHNGaWxlIiwiYW5hbHl6ZWRNb2R1bGVzIiwibWVyZ2VBbmRWYWxpZGF0ZU5nRmlsZXMiLCJsb2FkRmlsZXNTeW5jIiwiZW1pdEZsYWdzIiwibmdNb2R1bGVJbmRleCIsIl9leHRlcm5hbElkZW50aWZpZXJSZWZlcmVuY2VzIiwidHlwZUluZGV4IiwiZGlySWQiLCJfY3JlYXRlVHlwZUNoZWNrQmxvY2siLCJyZWZlcmVuY2VzXzEiLCJyZWZlcmVuY2VzXzFfMSIsIl9wYXJzZVRlbXBsYXRlIiwicGFyc2VkVGVtcGxhdGUiLCJlbWl0TWVzc2FnZUJ1bmRsZSIsImh0bWxQYXJzZXIiLCJtZXNzYWdlQnVuZGxlIiwiY29tcE1ldGFzIiwiZW1pdEFsbFBhcnRpYWxNb2R1bGVzIiwicjNGaWxlcyIsIm5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUiLCJjb250ZXh0TWFwIiwiX2NvbXBpbGVQYXJ0aWFsTW9kdWxlIiwiX2NvbXBpbGVTaGFsbG93TW9kdWxlcyIsImNvbXBpbGVOZ01vZHVsZUZyb21SZW5kZXIyIiwiaW5qZWN0YWJsZUNvbXBpbGVyIiwiaW5qZWN0b3JEZWZBcmciLCJzY2hlbWFSZWdpc3RyeSIsImhvc3RCaW5kaW5nUGFyc2VyIiwiZXhwcmVzc2lvblBhcnNlciIsImRpcmVjdGl2ZU1ldGFkYXRhIiwicmVuZGVyM0FzdCIsImRpcmVjdGl2ZVR5cGVCeVNlbF8xIiwicGlwZVR5cGVCeU5hbWVfMSIsImNvbXBpbGVDb21wb25lbnRGcm9tUmVuZGVyMiIsImRpcmVjdGl2ZVR5cGVCeVNlbCIsImRlZmluaXRpb25GaWVsZCIsImNvbXBpbGVEaXJlY3RpdmVGcm9tUmVuZGVyMiIsInBpcGVNZXRhZGF0YSIsImNvbXBpbGVQaXBlRnJvbVJlbmRlcjIiLCJlbWl0QWxsUGFydGlhbE1vZHVsZXMyIiwiX2VtaXRQYXJ0aWFsTW9kdWxlMiIsImVtaXRBbGxJbXBscyIsIl9jb21waWxlSW1wbEZpbGUiLCJnZW5lcmF0ZWRGaWxlcyIsIl9jcmVhdGVTdW1tYXJ5IiwiX2NvbXBpbGVNb2R1bGUiLCJjb21wb25lbnRTdHlsZXNoZWV0Iiwic3R5bGVzaGVldE1ldGEiLCJfY29kZWdlblN0eWxlcyIsIl9jb21waWxlQ29tcG9uZW50IiwiX2NvbXBpbGVDb21wb25lbnRGYWN0b3J5Iiwic3JjTW9kdWxlIiwibmdGYWN0b3J5Q3R4Iiwic3ltYm9sU3VtbWFyaWVzIiwidHlwZURhdGEiLCJmb3JKaXRPdXRwdXRDdHgiLCJzZXJpYWxpemVTdW1tYXJpZXMiLCJmb3JKaXRDdHgiLCJ0b0pzb25TZXJpYWxpemVyIiwiZm9ySml0U2VyaWFsaXplcl8xIiwiY3JlYXRlRXh0ZXJuYWxTeW1ib2xGYWN0b3J5UmVleHBvcnRzIiwibm9ybWFsaXplZExvY2FsZSIsImkxOG5Gb3JtYXQiLCJob3N0TWV0YSIsImhvc3RWaWV3RmFjdG9yeVZhciIsImNvbXBGYWN0b3J5VmFyIiwiaW5wdXRzRXhwcnMiLCJvdXRwdXRzRXhwcnMiLCJkaXJlY3RpdmVJZGVudGlmaWVycyIsImNvbXBvbmVudFN0eWxlcyIsInN0eWxlc0V4cHIiLCJ2aWV3UmVzdWx0IiwiX3Jlc29sdmVTdHlsZVN0YXRlbWVudHMiLCJpbXBvcnRNb2R1bGUiLCJfZmlsZU5hbWVUb01vZHVsZU5hbWUiLCJzdXBwbGllZFR5cGVQYXJhbXMiLCJtaXNzaW5nVHlwZVBhcmFtc0NvdW50IiwiYWxsVHlwZVBhcmFtcyIsIm1lbWJlck5hbWUiLCJpbXBvcnRlZEZpbGVQYXRoIiwiY29udGFpbmluZ0ZpbGVQYXRoIiwiZmlsZU5hbWVUb01vZHVsZU5hbWUiLCJzdHlsZXNoZWV0TWV0YWRhdGEiLCJjb21waWxlZFN0eWxlc2hlZXQiLCJlbnRyeVJvdXRlIiwidmlzaXRMYXp5Um91dGUiLCJzZWVuUm91dGVzIiwibGF6eVJvdXRlcyIsImxhenlSb3V0ZXNfMiIsImxhenlSb3V0ZXNfMl8xIiwibGF6eVJvdXRlIiwibGF6eVJvdXRlc18xIiwibGF6eVJvdXRlc18xXzEiLCJjb21waWxlUmVzdWx0Iiwic3R5bGVzaGVldFVybCIsImFuYWx5emVOZ01vZHVsZXMiLCJtZXJnZUFuYWx5emVkRmlsZXMiLCJfYW5hbHl6ZUZpbGVzSW5jbHVkaW5nTm9uUHJvZ3JhbUZpbGVzIiwic2VlbkZpbGVzIiwidmlzaXRGaWxlIiwiaXNTb3VyY2VGaWxlIiwibW9kTWV0YSIsInZhbGlkYXRlQW5hbHl6ZWRNb2R1bGVzIiwic3ltYm9sc01pc3NpbmdNb2R1bGUiLCJpc05nU3ltYm9sIiwiaXNWYWx1ZUV4cG9ydGluZ05vblNvdXJjZUZpbGUiLCJWaXNpdG9yIiwiYW5hbHl6ZWRGaWxlcyIsImFsbE5nTW9kdWxlcyIsImFsbFBpcGVzQW5kRGlyZWN0aXZlcyIsImFmIiwiRk9STUFUVEVEX01FU1NBR0UiLCJmb3JtYXRDaGFpbiIsImNoYWluIiwiaW5kZW50U3RyIiwiaGFsZiIsIkFOR1VMQVJfQ09SRSIsIkhJRERFTl9LRVkiLCJJR05PUkUiLCJQUk9WSURFIiwiUkVGRVJFTkNFX1NFVCIsInNob3VsZElnbm9yZSIsIlN0YXRpY1JlZmxlY3RvciIsImtub3duTWV0YWRhdGFDbGFzc2VzIiwia25vd25NZXRhZGF0YUZ1bmN0aW9ucyIsImFubm90YXRpb25DYWNoZSIsInNoYWxsb3dBbm5vdGF0aW9uQ2FjaGUiLCJwcm9wZXJ0eUNhY2hlIiwicGFyYW1ldGVyQ2FjaGUiLCJtZXRob2RDYWNoZSIsInN0YXRpY0NhY2hlIiwiY29udmVyc2lvbk1hcCIsInJlc29sdmVkRXh0ZXJuYWxSZWZlcmVuY2VzIiwiYW5ub3RhdGlvbkZvclBhcmVudENsYXNzV2l0aFN1bW1hcnlLaW5kIiwiaW5pdGlhbGl6ZUNvbnZlcnNpb25NYXAiLCJrYyIsIl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IiLCJrZiIsIl9yZWdpc3RlckZ1bmN0aW9uIiwiZmluZFN5bWJvbERlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25TeW1ib2xfMSIsInJlZlN5bWJvbCIsImZpbmREZWNsYXJhdGlvbiIsInRyeUZpbmREZWNsYXJhdGlvbiIsInJlc29sdmVkTWV0YWRhdGEiLCJvcmlnaW5hbFJlY29yZGVyIiwiX2Fubm90YXRpb25zIiwic2ltcGxpZnkiLCJjbGFzc01ldGFkYXRhIiwiZ2V0VHlwZU1ldGFkYXRhIiwicGFyZW50VHlwZSIsImZpbmRQYXJlbnRUeXBlIiwicGFyZW50QW5ub3RhdGlvbnMiLCJvd25Bbm5vdGF0aW9uc18xIiwicmVxdWlyZWRBbm5vdGF0aW9uVHlwZXMiLCJyZXF1aXJlZFR5cGUiLCJmb3JtYXRNZXRhZGF0YUVycm9yIiwibWV0YWRhdGFFcnJvciIsInBhcmVudFByb3AiLCJtZW1iZXJzXzEiLCJwYXJhbWV0ZXJzXzEiLCJjdG9yRGF0YSIsInJhd1BhcmFtZXRlclR5cGVzIiwicGFyYW1ldGVyRGVjb3JhdG9yc18xIiwicmF3UGFyYW1UeXBlIiwibmVzdGVkUmVzdWx0IiwicGFyYW1UeXBlIiwidHJ5U2ltcGxpZnkiLCJfbWV0aG9kTmFtZXMiLCJtZXRob2ROYW1lcyIsInBhcmVudE1ldGhvZE5hbWVzXzEiLCJtZW1iZXJzXzIiLCJpc01ldGhvZCIsIl9zdGF0aWNNZW1iZXJzIiwic3RhdGljTWVtYmVycyIsInN0YXRpY01lbWJlckRhdGEiLCJzdGF0aWNNZW1iZXJzXzEiLCJzdGF0aWNNZW1iZXJzXzFfMSIsImluamVjdGlvblRva2VuIiwib3BhcXVlVG9rZW4iLCJsYXp5IiwiQmluZGluZ1Njb3BlJDEiLCJlbXB0eSIsImNhbGxpbmciLCJzaW1wbGlmeUluQ29udGV4dCIsImRlcHRoIiwicmVzb2x2ZVJlZmVyZW5jZVZhbHVlIiwic2ltcGxpZnlFYWdlcmx5Iiwic2ltcGxpZnlOZXN0ZWQiLCJuZXN0ZWRDb250ZXh0IiwiaXNNZXRhZGF0YUVycm9yIiwic3VtbWFyeU1zZyIsImVycm9yU3VtbWFyeSIsIlJFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTUyIsIlZBUklBQkxFX05PVF9JTklUSUFMSVpFRCIsIkRFU1RSVUNUVVJFX05PVF9TVVBQT1JURUQiLCJDT1VMRF9OT1RfUkVTT0xWRV9UWVBFIiwiRlVOQ1RJT05fQ0FMTF9OT1RfU1VQUE9SVEVEIiwiUkVGRVJFTkNFX1RPX0xPQ0FMX1NZTUJPTCIsImFkdmlzZSIsImlzUHJpbWl0aXZlIiwicmVzdWx0XzIiLCJzcHJlYWRBcnJheSIsInNwcmVhZEFycmF5XzEiLCJzcHJlYWRBcnJheV8xXzEiLCJzcHJlYWRJdGVtIiwiZGVjbGFyYXRpb25WYWx1ZSIsIm9wZXJhbmQiLCJpbmRleFRhcmdldCIsIm1lbWJlciIsInNlbGVjdENvbnRleHQiLCJzZWxlY3RUYXJnZXQiLCJsb2NhbFZhbHVlIiwibWlzc2luZyIsImFyZ0V4cHJlc3Npb25zIiwic2ltcGxpZnlDYWxsIiwiZnVuY3Rpb25TeW1ib2wiLCJ0YXJnZXRGdW5jdGlvbiIsInRhcmdldEV4cHJlc3Npb24iLCJkZWZhdWx0cyIsImZ1bmN0aW9uU2NvcGUiLCJkZWZpbmUiLCJyZXN1bHRfMSIsIm9sZFNjb3BlIiwibWFwU3RyaW5nTWFwIiwic2ltcGxpZnlMYXppbHkiLCJyZXBvcnRpbmdDb250ZXh0IiwiTUVUQURBVEFfRVJST1IiLCJMQU1CREFfTk9UX1NVUFBPUlRFRCIsIlBvcHVsYXRlZFNjb3BlIiwiZm9ybWF0TWV0YWRhdGFNZXNzYWdlQ2hhaW4iLCJleHBhbmRlZE1lc3NhZ2UiLCJmb3JtYXR0ZWRFcnJvciIsIm1lc3NhZ2VBZHZpc2UiLCJBb3RTdW1tYXJ5UmVzb2x2ZXIiLCJzdW1tYXJ5Q2FjaGUiLCJsb2FkZWRGaWxlUGF0aHMiLCJyZWZlcnJpbmdTcmNGaWxlTmFtZSIsInJlZmVycmluZ0xpYkZpbGVOYW1lIiwicm9vdFN5bWJvbCIsIl9sb2FkU3VtbWFyeUZpbGUiLCJoYXNTdW1tYXJ5Iiwic3VtbWFyeUZpbGVQYXRoIiwiZGVzZXJpYWxpemVTdW1tYXJpZXMiLCJjcmVhdGVBb3RVcmxSZXNvbHZlciIsImJhc2VQYXRoIiwiU3VtbWFyeVJlc29sdmVyIiwiSml0U3VtbWFyeVJlc29sdmVyIiwiX3N1bW1hcmllcyIsIl9leGVjdXRlRnVuY3Rpb25TdGF0ZW1lbnRzIiwidmFyVmFsdWVzIiwiY2hpbGRDdHgiLCJjcmVhdGVDaGlsZFdpaHRMb2NhbFZhcnMiLCJfRXhlY3V0aW9uQ29udGV4dCIsIlJldHVyblZhbHVlIiwiU3RhdGVtZW50SW50ZXJwcmV0ZXIiLCJkZWJ1Z0FzdCIsImRlYnVnT3V0cHV0QXN0QXNUeXBlU2NyaXB0IiwiY3VyckN0eCIsIkNBVENIX0VSUk9SX1ZBUiQyIiwiQ0FUQ0hfU1RBQ0tfVkFSJDIiLCJjcmVhdGVEeW5hbWljQ2xhc3MiLCJfY2xhc3NTdG10IiwiX2N0eCIsInByb3BlcnR5RGVzY3JpcHRvcnMiLCJpbnN0YW5jZUN0eCIsInBhcmFtTmFtZXMiLCJ3cml0YWJsZSIsImN0b3JQYXJhbU5hbWVzIiwic3VwZXJDbGFzcyIsIl9kZWNsYXJlRm4iLCJKaXRDb21waWxlciIsIl9qaXRFdmFsdWF0b3IiLCJfY29tcGlsZXJDb25maWciLCJnZXRFeHRyYU5nTW9kdWxlUHJvdmlkZXJzIiwiX2NvbXBpbGVkVGVtcGxhdGVDYWNoZSIsIl9jb21waWxlZEhvc3RUZW1wbGF0ZUNhY2hlIiwiX2NvbXBpbGVkRGlyZWN0aXZlV3JhcHBlckNhY2hlIiwiX2NvbXBpbGVkTmdNb2R1bGVDYWNoZSIsIl9zaGFyZWRTdHlsZXNoZWV0Q291bnQiLCJfYWRkZWRBb3RTdW1tYXJpZXMiLCJfY29tcGlsZU1vZHVsZUFuZENvbXBvbmVudHMiLCJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHMiLCJsb2FkQW90U3VtbWFyaWVzIiwiX2FkZEFvdFN1bW1hcmllcyIsImhhc0FvdFN1bW1hcnkiLCJfZmlsdGVySml0SWRlbnRpZmllcnMiLCJpZHMiLCJfbG9hZE1vZHVsZXMiLCJfY29tcGlsZUNvbXBvbmVudHMiLCJjb21wb25lbnRGYWN0b3JpZXMiLCJuZ01vZHVsZUZhY3RvcnkiLCJtYWluTW9kdWxlIiwibWFpbk5nTW9kdWxlIiwibmVzdGVkTmdNb2R1bGUiLCJjcmVhdGVPdXRwdXRDb250ZXh0IiwiX2ludGVycHJldE9ySml0IiwibmdNb2R1bGVKaXRVcmwiLCJhbGxDb21wb25lbnRGYWN0b3JpZXMiLCJtb2R1bGVCeUppdERpcmVjdGl2ZSIsInRlbXBsYXRlcyIsInRyYW5zSml0TW9kdWxlcyIsImxvY2FsTW9kIiwibG9jYWxNb2R1bGVNZXRhIiwiZGlyUmVmIiwiX2NyZWF0ZUNvbXBpbGVkVGVtcGxhdGUiLCJfY3JlYXRlQ29tcGlsZWRIb3N0VGVtcGxhdGUiLCJlbnRyeUNvbXBvbmVudFR5cGUiLCJfY29tcGlsZVRlbXBsYXRlIiwiY29tcGlsZWRUZW1wbGF0ZSIsImFzc2VydENvbXBvbmVudCIsIkNvbXBpbGVkVGVtcGxhdGUiLCJpc0NvbXBpbGVkIiwiZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsIiwib3V0cHV0Q29udGV4dCIsIl9yZXNvbHZlU3R5bGVzQ29tcGlsZVJlc3VsdCIsImV2YWxSZXN1bHQiLCJ0ZW1wbGF0ZUppdFVybCIsInZpZXdDbGFzcyIsImNvbXBpbGVkIiwibmVzdGVkQ29tcGlsZVJlc3VsdCIsIm5lc3RlZFN0eWxlc0FyciIsIl9yZXNvbHZlQW5kRXZhbFN0eWxlc0NvbXBpbGVSZXN1bHQiLCJzaGFyZWRTdHlsZXNoZWV0Sml0VXJsIiwicGF0aFBhcnRzIiwiaW50ZXJwcmV0U3RhdGVtZW50cyIsIl92aWV3Q2xhc3MiLCJDb21waWxlUmVmbGVjdG9yIiwiVXJsUmVzb2x2ZXIiLCJVcmxSZXNvbHZlckltcGwiLCJfcGFja2FnZVByZWZpeCIsInJlc29sdmVkVXJsIiwiX3Jlc29sdmVVcmwiLCJfc3BsaXQiLCJiYXNlUGFydHMiLCJfQ29tcG9uZW50SW5kZXgiLCJTY2hlbWUiLCJfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgiLCJQb3J0IiwiUGF0aCIsInJlc29sdmVkUGFydHMiLCJnZXRVcmxTY2hlbWUiLCJfc3BsaXRSZSIsInVyaSIsIl9yZW1vdmVEb3RTZWdtZW50cyIsImxlYWRpbmdTbGFzaCIsInRyYWlsaW5nU2xhc2giLCJ1cCIsIl9idWlsZEZyb21FbmNvZGVkUGFydHMiLCJvcHRfc2NoZW1lIiwib3B0X3VzZXJJbmZvIiwib3B0X2RvbWFpbiIsIm9wdF9wb3J0Iiwib3B0X3BhdGgiLCJvcHRfcXVlcnlEYXRhIiwib3B0X2ZyYWdtZW50IiwiVXNlckluZm8iLCJEb21haW4iLCJRdWVyeURhdGEiLCJGcmFnbWVudCIsIkV4dHJhY3RvciIsInVybFJlc29sdmVyIiwic3RhdGljUmVmbGVjdG9yIiwibm9ybWFsaXplciIsImxvYWRSZXNvdXJjZSIsImV4dHJhY3RvciIsIlIzVGFyZ2V0QmluZGVyIiwiU2NvcGUiLCJEaXJlY3RpdmVCaW5kZXIiLCJUZW1wbGF0ZUJpbmRlciIsIm5lc3RpbmdMZXZlbCIsIlIzQm91bmRUYXJnZXQiLCJwYXJlbnRTY29wZSIsIm5hbWVkRW50aXRpZXMiLCJjaGlsZFNjb3BlcyIsImluZ2VzdCIsIm1heWJlRGVjbGFyZSIsInRoaW5nIiwibG9va3VwIiwiZ2V0Q2hpbGRTY29wZSIsImRpclRhcmdldCIsInByb2Nlc3NBdHRyaWJ1dGUiLCJ2aXNpdEJvdW5kQXR0cmlidXRlT3JFdmVudCIsInZpc2l0Tm9kZSIsImNoaWxkU2NvcGUiLCJtYXliZU1hcCIsImV4cHJUYXJnZXRzIiwiZ2V0RGlyZWN0aXZlc09mTm9kZSIsImdldFJlZmVyZW5jZVRhcmdldCIsImdldENvbnN1bWVyT2ZCaW5kaW5nIiwiZ2V0RXhwcmVzc2lvblRhcmdldCIsImdldFRlbXBsYXRlT2ZTeW1ib2wiLCJnZXROZXN0aW5nTGV2ZWwiLCJnZXRVc2VkRGlyZWN0aXZlcyIsInB1Ymxpc2hGYWNhZGUiLCJuZyIsIsm1Y29tcGlsZXJGYWNhZGUiLCJoaWRlIiwicmVkZWZpbmUiLCJzZXRHbG9iYWwiLCJjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzIiwiaXNGb3JjZWQiLCJ0YXJnZXRQcm9wZXJ0eSIsInNvdXJjZVByb3BlcnR5IiwiZGVzY3JpcHRvciIsIlRBUkdFVCIsIkdMT0JBTCIsIlNUQVRJQyIsInN0YXQiLCJub1RhcmdldEdldCIsInNoYW0iLCJpc09iamVjdCIsIml0IiwiVHlwZUVycm9yIiwicGlwZUZyb21BcnJheSIsInBpcGVkIiwiT2JzZXJ2YWJsZSIsIl9pc1NjYWxhciIsIl9zdWJzY3JpYmUiLCJsaWZ0Iiwib2JzZXJ2YWJsZSIsIm9ic2VydmVyT3JOZXh0IiwidG9TdWJzY3JpYmVyIiwibmV4dE9yT2JzZXJ2ZXIiLCJTdWJzY3JpYmVyIiwicnhTdWJzY3JpYmVyIiwidXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyIsInN5bmNFcnJvclRocm93YWJsZSIsIl90cnlTdWJzY3JpYmUiLCJzeW5jRXJyb3JUaHJvd24iLCJzeW5jRXJyb3JWYWx1ZSIsImNhblJlcG9ydEVycm9yIiwiY2xvc2VkXzEiLCJkZXN0aW5hdGlvbiIsImlzU3RvcHBlZCIsInByb21pc2VDdG9yIiwiZ2V0UHJvbWlzZUN0b3IiLCJzdWJzY3JpYmVyIiwib3BlcmF0aW9ucyIsInRvUHJvbWlzZSIsIkRFU0NSSVBUT1JTIiwiZGVzdGluYXRpb25Pck5leHQiLCJTYWZlU3Vic2NyaWJlciIsIl9lcnJvciIsIl9jb21wbGV0ZSIsIl91bnN1YnNjcmliZUFuZFJlY3ljbGUiLCJfcGFyZW50cyIsIl9wYXJlbnRTdWJzY3JpYmVyIiwiX190cnlPclNldEVycm9yIiwiX190cnlPclVuc3ViIiwid3JhcHBlZENvbXBsZXRlIiwiX3Vuc3Vic2NyaWJlIiwiVW5zdWJzY3JpcHRpb25FcnJvckltcGwiLCJVbnN1YnNjcmlwdGlvbkVycm9yIiwiU3Vic2NyaXB0aW9uIiwiX3N1YnNjcmlwdGlvbnMiLCJoYXNFcnJvcnMiLCJpc0Z1bmN0aW9uIiwiZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzIiwic3ViIiwidGVhcmRvd24iLCJ0bXAiLCJfYWRkUGFyZW50Iiwic3Vic2NyaXB0aW9ucyIsInN1YnNjcmlwdGlvbkluZGV4IiwiZXJycyIsInVpZCIsIk5BVElWRV9TWU1CT0wiLCJoYXNTeW1ib2xzIiwidG9TdHIiLCJvcmlnRGVmaW5lUHJvcGVydHkiLCJzdXBwb3J0c0Rlc2NyaXB0b3JzIiwiYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCIsIm9iamVjdCIsImRlZmluZVByb3BlcnRpZXMiLCJwcmVkaWNhdGVzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiSUU4X0RPTV9ERUZJTkUiLCJhbk9iamVjdCIsInRvUHJpbWl0aXZlIiwibmF0aXZlRGVmaW5lUHJvcGVydHkiLCJPIiwiUCIsIkF0dHJpYnV0ZXMiLCJ3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlIiwiTkFNRSIsImciLCJET01JdGVyYWJsZXMiLCJDT0xMRUNUSU9OX05BTUUiLCJDb2xsZWN0aW9uIiwiQ29sbGVjdGlvblByb3RvdHlwZSIsIndpbiIsIl9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5ncyIsInByb3RvIiwidG9JbnRlZ2VyIiwibWluIiwiYXJndW1lbnQiLCJkZWZpbmVQcm9wZXJ0eU1vZHVsZSIsImNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdFByb3RvdHlwZSIsInVuc2FmZSIsInRvSW5kZXhlZE9iamVjdCIsImFkZFRvVW5zY29wYWJsZXMiLCJJdGVyYXRvcnMiLCJJbnRlcm5hbFN0YXRlTW9kdWxlIiwiZGVmaW5lSXRlcmF0b3IiLCJzZXRJbnRlcm5hbFN0YXRlIiwiZ2V0SW50ZXJuYWxTdGF0ZSIsImdldHRlckZvciIsIml0ZXJhdGVkIiwiQXJndW1lbnRzIiwiZnJlZUdsb2JhbCIsImZyZWVTZWxmIiwicmVxdWlyZU9iamVjdENvZXJjaWJsZSIsInByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlIiwibmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwibmF0aXZlRnVuY3Rpb25Ub1N0cmluZyIsImVuZm9yY2VJbnRlcm5hbFN0YXRlIiwiZW5mb3JjZSIsIklTX1BVUkUiLCIkZXhwb3J0IiwiaGlkZGVuS2V5cyIsImZhaWxzIiwic2V0VG9TdHJpbmdUYWciLCJ3ZWxsS25vd25TeW1ib2wiLCJkZWZpbmVXZWxsS25vd25TeW1ib2wiLCJlbnVtS2V5cyIsIm5hdGl2ZU9iamVjdENyZWF0ZSIsImdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSIsIm9iamVjdEtleXMiLCJISURERU4iLCJuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzIiwiJFN5bWJvbCIsIm5hdGl2ZUpTT05TdHJpbmdpZnkiLCJUT19QUklNSVRJVkUiLCJuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSIsIlN5bWJvbFJlZ2lzdHJ5IiwiQWxsU3ltYm9scyIsIk9iamVjdFByb3RvdHlwZVN5bWJvbHMiLCJXZWxsS25vd25TeW1ib2xzU3RvcmUiLCJRT2JqZWN0IiwiVVNFX1NFVFRFUiIsImZpbmRDaGlsZCIsInNldFN5bWJvbERlc2NyaXB0b3IiLCJEIiwiT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvciIsImlzU3ltYm9sIiwiJGRlZmluZVByb3BlcnR5IiwiJGRlZmluZVByb3BlcnRpZXMiLCIkcHJvcGVydHlJc0VudW1lcmFibGUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIkUiLCIkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiJGdldE93blByb3BlcnR5TmFtZXMiLCIkZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiSVNfT1AiLCJ3ZWxsS25vd25TeW1ib2xzIiwia2V5Rm9yIiwic3ltIiwidXNlU2V0dGVyIiwidXNlU2ltcGxlIiwicmVwbGFjZXIiLCIkcmVwbGFjZXIiLCJ2YWx1ZU9mIiwiTmF0aXZlU3ltYm9sIiwiRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlIiwiU3ltYm9sV3JhcHBlciIsInN5bWJvbFByb3RvdHlwZSIsInN5bWJvbFRvU3RyaW5nIiwic3RyaW5nIiwiQXJyYXlJdGVyYXRvck1ldGhvZHMiLCJJVEVSQVRPUiIsIlRPX1NUUklOR19UQUciLCJBcnJheVZhbHVlcyIsIk1FVEhPRF9OQU1FIiwidG9PYmplY3QiLCJ0b0xlbmd0aCIsImNyZWF0ZVByb3BlcnR5IiwiYXJyYXlTcGVjaWVzQ3JlYXRlIiwiSVNfQ09OQ0FUX1NQUkVBREFCTEUiLCJJU19DT05DQVRfU1BSRUFEQUJMRV9TVVBQT1JUIiwiU1BFQ0lFU19TVVBQT1JUIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwic3ByZWFkYWJsZSIsIkZPUkNFRCIsIkEiLCJJbmRleGVkT2JqZWN0IiwiSUVfUFJPVE8iLCJDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIiLCJuYXRpdmVLZXlzIiwiRkFJTFNfT05fUFJJTUlUSVZFUyIsInBvaW50IiwiZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcCIsInRhcmdldEtleSIsInRhcmdldE1ldGFkYXRhIiwia2V5TWV0YWRhdGEiLCJnZXRNYXAiLCJNZXRhZGF0YUtleSIsIm1ldGFkYXRhTWFwIiwiTWV0YWRhdGFWYWx1ZSIsInRvS2V5IiwiaG9zdFJlcG9ydEVycm9yIiwiTkFUSVZFX1dFQUtfTUFQIiwib2JqZWN0SGFzIiwic2hhcmVkS2V5Iiwid21nZXQiLCJ3bWhhcyIsIndtc2V0IiwiU1RBVEUiLCJPYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGwiLCJPYmplY3RVbnN1YnNjcmliZWRFcnJvciIsIm9yaWdTeW1ib2wiLCJoYXNTeW1ib2xTaGFtIiwiaGFzTmF0aXZlU3ltYm9scyIsIlRocm93VHlwZUVycm9yIiwiZ2V0UHJvdG8iLCJhc3luY0dlbkl0ZXJhdG9yIiwiVHlwZWRBcnJheSIsIlVpbnQ4QXJyYXkiLCJJTlRSSU5TSUNTIiwiQXJyYXlCdWZmZXIiLCJhc3luY0l0ZXJhdG9yIiwiQXRvbWljcyIsIkJvb2xlYW4iLCJEYXRhVmlldyIsIkRhdGUiLCJkZWNvZGVVUkkiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUklDb21wb25lbnQiLCJldmFsIiwiRXZhbEVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJpc0Zpbml0ZSIsIlByb3h5IiwiUmFuZ2VFcnJvciIsIlJlZmVyZW5jZUVycm9yIiwiU2hhcmVkQXJyYXlCdWZmZXIiLCJTeW50YXhFcnJvciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIlVSSUVycm9yIiwiV2Vha1NldCIsIkdldEludHJpbnNpYyIsImFsbG93TWlzc2luZyIsIlRBRyIsImVudW1CdWdLZXlzIiwiZG9jdW1lbnRDcmVhdGVFbGVtZW50IiwiRW1wdHkiLCJjcmVhdGVEaWN0IiwiaWZyYW1lRG9jdW1lbnQiLCJpZnJhbWUiLCJkaXNwbGF5IiwiY29udGVudFdpbmRvdyIsImx0IiwiY2xvc2UiLCJGIiwiUHJvcGVydGllcyIsIndlYnBhY2tQb2x5ZmlsbCIsImRlcHJlY2F0ZSIsInBhdGhzIiwiYmFzZUlzTmF0aXZlIiwiZ2V0TmF0aXZlIiwiaXNPYmplY3RMaWtlIiwiU3ViamVjdFN1YnNjcmliZXIiLCJTdWJqZWN0Iiwib2JzZXJ2ZXJzIiwiaGFzRXJyb3IiLCJ0aHJvd25FcnJvciIsInN1YmplY3QiLCJBbm9ueW1vdXNTdWJqZWN0IiwiY29weSIsImFzT2JzZXJ2YWJsZSIsInNjaGVkdWxlIiwiX3ByZXZpZXciLCJzdG9yaWVzT2YiLCJzZXRBZGRvbiIsImFkZERlY29yYXRvciIsImFkZFBhcmFtZXRlcnMiLCJjb25maWd1cmUiLCJnZXRTdG9yeWJvb2siLCJmb3JjZVJlUmVuZGVyIiwiX2RlY29yYXRvcnMiLCJob3QiLCJkZWNsaW5lIiwiUyIsImJpdG1hcCIsImNvcHlyaWdodCIsImludGVybmFsT2JqZWN0S2V5cyIsImxvZ2dlciIsIl9sZW4iLCJyZXN0IiwiX2tleSIsIl9sZW4yIiwiX2tleTIiLCJpbmZvIiwiX2xlbjMiLCJfa2V5MyIsIl9sZW40IiwiX2tleTQiLCJfbGVuNSIsIl9rZXk1IiwiU1RPUllfVEhSRVdfRVhDRVBUSU9OIiwiU1RPUllfQ0hBTkdFRCIsIlNUT1JZX0VSUk9SRUQiLCJTVE9SWV9NSVNTSU5HIiwiU1RPUllfUkVOREVSRUQiLCJTVE9SWV9SRU5ERVIiLCJTVE9SWV9BRERFRCIsIlNUT1JZX0lOSVQiLCJSRUdJU1RFUl9TVUJTQ1JJUFRJT04iLCJGT1JDRV9SRV9SRU5ERVIiLCJQUkVWSUVXX0tFWURPV04iLCJTRUxFQ1RfU1RPUlkiLCJTVE9SSUVTX0NPTkZJR1VSRUQiLCJTRVRfU1RPUklFUyIsIkdFVF9TVE9SSUVTIiwiU0VUX0NVUlJFTlRfU1RPUlkiLCJHRVRfQ1VSUkVOVF9TVE9SWSIsIkNIQU5ORUxfQ1JFQVRFRCIsIl9kZWZhdWx0IiwicmVnZXhwRXhlYyIsImdldFJhd1RhZyIsIm9iamVjdFRvU3RyaW5nIiwibnVsbFRhZyIsInVuZGVmaW5lZFRhZyIsInN5bVRvU3RyaW5nVGFnIiwidG9TdHJpbmdUYWciLCJiYXNlR2V0VGFnIiwiV2VsY29tZSIsImRlZmF1bHQiLCJCdXR0b24iLCIkYXNzaWduIiwiRVMyMDE2IiwiJFR5cGVFcnJvciIsIiRpc0VudW1lcmFibGUiLCIkcHVzaEFwcGx5IiwiRVMyMDE3IiwiVG9JbmRleCIsImludGVnZXJJbmRleCIsIlRvSW50ZWdlciIsIlRvTGVuZ3RoIiwiU2FtZVZhbHVlWmVybyIsIkVudW1lcmFibGVPd25Qcm9wZXJ0aWVzIiwiRW51bWVyYWJsZU93bk5hbWVzIiwiY2xhc3NvZiIsIk5BU0hPUk5fQlVHIiwiMSIsIlYiLCJzcGVjaWZpY0NyZWF0ZSIsIklTX01BUCIsIklTX0ZJTFRFUiIsIklTX1NPTUUiLCJJU19FVkVSWSIsIklTX0ZJTkRfSU5ERVgiLCJOT19IT0xFUyIsIiR0aGlzIiwiY2FsbGJhY2tmbiIsInRoYXQiLCJib3VuZEZ1bmN0aW9uIiwiYUZ1bmN0aW9uIiwiSU5DT1JSRUNUX0lURVJBVElPTiIsIkRhdGVQcm90b3R5cGUiLCJuYXRpdmVEYXRlVG9TdHJpbmciLCJnZXRUaW1lIiwiTmFOIiwibmF0aXZlVG9TdHJpbmciLCJOT1RfR0VORVJJQyIsIklOQ09SUkVDVF9OQU1FIiwiUiIsIl9leHBvcnROYW1lcyIsIl9tYWtlRGVjb3JhdG9yIiwiX3N0b3J5Ym9va0NoYW5uZWxNb2NrIiwiYWRkb25zIiwiZXEiLCJNRVRBREFUQSIsIkZSRUVaSU5HIiwiaXNFeHRlbnNpYmxlIiwic2V0TWV0YWRhdGEiLCJvYmplY3RJRCIsIndlYWtEYXRhIiwiUkVRVUlSRUQiLCJmYXN0S2V5IiwiZ2V0V2Vha0RhdGEiLCJvbkZyZWV6ZSIsImlzQXJyYXlJdGVyYXRvck1ldGhvZCIsImdldEl0ZXJhdG9yTWV0aG9kIiwiY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyIsIkJSRUFLIiwiRU5UUklFUyIsIml0ZXJGbiIsInN0ZXAiLCJmblRvU3RyIiwiY29uc3RydWN0b3JSZWdleCIsImlzRVM2Q2xhc3NGbiIsImlzRVM2Q2xhc3NGdW5jdGlvbiIsImZuU3RyIiwiaGFzVG9TdHJpbmdUYWciLCJpc0NhbGxhYmxlIiwidHJ5RnVuY3Rpb25Ub1N0ciIsInRyeUZ1bmN0aW9uT2JqZWN0Iiwic3RyQ2xhc3MiLCJjZWlsIiwiU1BFQ0lFUyIsImZvbyIsInJlcGxhY2VtZW50IiwiZGV0ZWN0aW9uIiwibm9ybWFsaXplIiwiUE9MWUZJTEwiLCJ2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzIiwiY29ycmVjdFNldHRlciIsInJlMSIsInJlMiIsInJlZ2V4cEZsYWdzIiwibmF0aXZlRXhlYyIsIm5hdGl2ZVJlcGxhY2UiLCJwYXRjaGVkRXhlYyIsIlVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyIsIk5QQ0dfSU5DTFVERUQiLCJyZUNvcHkiLCJyZSIsIlJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTIiwiZ3JvdXBzIiwiU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDIiwib3JpZ2luYWxFeGVjIiwiS0VZIiwiU1lNQk9MIiwiREVMRUdBVEVTX1RPX1NZTUJPTCIsIkRFTEVHQVRFU19UT19FWEVDIiwiZXhlY0NhbGxlZCIsIm5hdGl2ZVJlZ0V4cE1ldGhvZCIsIm5hdGl2ZU1ldGhvZCIsImFyZzIiLCJmb3JjZVN0cmluZ01ldGhvZCIsInN0cmluZ01ldGhvZCIsInJlZ2V4TWV0aG9kIiwibGlzdENhY2hlQ2xlYXIiLCJsaXN0Q2FjaGVEZWxldGUiLCJsaXN0Q2FjaGVHZXQiLCJsaXN0Q2FjaGVIYXMiLCJsaXN0Q2FjaGVTZXQiLCJMaXN0Q2FjaGUiLCJhc3NvY0luZGV4T2YiLCJuYXRpdmVDcmVhdGUiLCJpc0tleWFibGUiLCJnZXRNYXBEYXRhIiwiX19kYXRhX18iLCJpc0xlbmd0aCIsImlzQXJyYXlMaWtlIiwic3ltYm9sVGFnIiwiQ29uc3RydWN0b3IiLCJTdWJqZWN0U3Vic2NyaXB0aW9uIiwic3Vic2NyaWJlckluZGV4IiwiaXNTY2hlZHVsZXIiLCJzdWJzY3JpYmVUbyIsInN1YnNjcmliZVRvT2JzZXJ2YWJsZSIsIm9icyIsInN1YnNjcmliZVRvQXJyYXkiLCJzdWJzY3JpYmVUb1Byb21pc2UiLCJzdWJzY3JpYmVUb0l0ZXJhYmxlIiwicHJvamVjdCIsInRoaXNBcmciLCJtYXBPcGVyYXRpb24iLCJNYXBPcGVyYXRvciIsIk1hcFN1YnNjcmliZXIiLCJJbm5lclN1YnNjcmliZXIiLCJvdXRlclZhbHVlIiwib3V0ZXJJbmRleCIsIm5vdGlmeU5leHQiLCJub3RpZnlFcnJvciIsIm5vdGlmeUNvbXBsZXRlIiwic3Vic2NyaWJlVG9SZXN1bHQiLCJvdXRlclN1YnNjcmliZXIiLCJPdXRlclN1YnNjcmliZXIiLCJpbm5lclZhbHVlIiwiaW5uZXJJbmRleCIsImlubmVyU3ViIiwiaWRlbnRpdHkiLCJpc0FyZ3MiLCJvcmlnS2V5cyIsImtleXNTaGltIiwib3JpZ2luYWxLZXlzIiwic2hpbU9iamVjdEtleXMiLCIkU3ludGF4RXJyb3IiLCIkQXJyYXkiLCIkU3RyaW5nIiwiJE9iamVjdCIsIiROdW1iZXIiLCIkUmVnRXhwIiwiYXNzZXJ0UmVjb3JkIiwiJGlzTmFOIiwiJGlzRmluaXRlIiwiTUFYX1NBRkVfSU5URUdFUiIsInBvdyIsInNpZ24iLCJwYXJzZUludGVnZXIiLCJhcnJheVNsaWNlIiwic3RyU2xpY2UiLCJpc0JpbmFyeSIsImlzT2N0YWwiLCJyZWdleEV4ZWMiLCJub25XU3JlZ2V4IiwiaGFzTm9uV1MiLCJpc0ludmFsaWRIZXhMaXRlcmFsIiwiJGNoYXJDb2RlQXQiLCIkTnVtYmVyVmFsdWVPZiIsIiRCb29sZWFuVmFsdWVPZiIsIiRTdHJpbmdWYWx1ZU9mIiwiJERhdGVWYWx1ZU9mIiwiJGZsb29yIiwiJGFicyIsImFicyIsIiRPYmplY3RDcmVhdGUiLCIkZ09QRCIsIiRpc0V4dGVuc2libGUiLCJ0cmltUmVnZXgiLCJFUzUiLCJoYXNSZWdFeHBNYXRjaGVyIiwiRVM2IiwiQ2FsbCIsIklzQ2FsbGFibGUiLCJUb1ByaW1pdGl2ZSIsIlRvTnVtYmVyIiwidHJpbW1lZCIsIlRvSW50MTYiLCJpbnQxNmJpdCIsIlRvVWludDE2IiwiVG9JbnQ4IiwiaW50OGJpdCIsIlRvVWludDgiLCJudW1iZXIiLCJwb3NJbnQiLCJUb1VpbnQ4Q2xhbXAiLCJUb1N0cmluZyIsIlRvT2JqZWN0IiwiUmVxdWlyZU9iamVjdENvZXJjaWJsZSIsIlRvUHJvcGVydHlLZXkiLCJDYW5vbmljYWxOdW1lcmljSW5kZXhTdHJpbmciLCJTYW1lVmFsdWUiLCJDaGVja09iamVjdENvZXJjaWJsZSIsIklzQXJyYXkiLCJJc0NvbnN0cnVjdG9yIiwiSXNFeHRlbnNpYmxlIiwicHJldmVudEV4dGVuc2lvbnMiLCJJc0ludGVnZXIiLCJJc1Byb3BlcnR5S2V5IiwiSXNSZWdFeHAiLCJpc1JlZ0V4cCIsIlRvQm9vbGVhbiIsIkdldFYiLCJHZXRNZXRob2QiLCJmdW5jIiwiR2V0IiwiU3BlY2llc0NvbnN0cnVjdG9yIiwiZGVmYXVsdENvbnN0cnVjdG9yIiwiQyIsInNwZWNpZXMiLCJDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvciIsIkRlc2MiLCJJc0dlbmVyaWNEZXNjcmlwdG9yIiwiSXNEYXRhRGVzY3JpcHRvciIsIlRocm93IiwiSGFzT3duUHJvcGVydHkiLCJIYXNQcm9wZXJ0eSIsIklzQ29uY2F0U3ByZWFkYWJsZSIsIkludm9rZSIsImFyZ3VtZW50c0xpc3QiLCJHZXRJdGVyYXRvciIsImFjdHVhbE1ldGhvZCIsIkl0ZXJhdG9yTmV4dCIsIkl0ZXJhdG9yQ29tcGxldGUiLCJpdGVyUmVzdWx0IiwiSXRlcmF0b3JWYWx1ZSIsIkl0ZXJhdG9yU3RlcCIsIkl0ZXJhdG9yQ2xvc2UiLCJjb21wbGV0aW9uIiwiY29tcGxldGlvblJlY29yZCIsImNvbXBsZXRpb25UaHVuayIsIml0ZXJhdG9yUmV0dXJuIiwiaW5uZXJSZXN1bHQiLCJDcmVhdGVJdGVyUmVzdWx0T2JqZWN0IiwiUmVnRXhwRXhlYyIsIkFycmF5U3BlY2llc0NyZWF0ZSIsIm9yaWdpbmFsQXJyYXkiLCJDcmVhdGVEYXRhUHJvcGVydHkiLCJvbGREZXNjIiwiZXh0ZW5zaWJsZSIsIkNyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3ciLCJzdWNjZXNzIiwiT2JqZWN0Q3JlYXRlIiwiaW50ZXJuYWxTbG90c0xpc3QiLCJzbG90cyIsIkFkdmFuY2VTdHJpbmdJbmRleCIsInVuaWNvZGUiLCJzZWNvbmQiLCJDcmVhdGVNZXRob2RQcm9wZXJ0eSIsIkRlZmluZVByb3BlcnR5T3JUaHJvdyIsIkRlbGV0ZVByb3BlcnR5T3JUaHJvdyIsInRoaXNOdW1iZXJWYWx1ZSIsInRoaXNCb29sZWFuVmFsdWUiLCJ0aGlzU3RyaW5nVmFsdWUiLCJ0aGlzVGltZVZhbHVlIiwiRVMyMDE1IiwiU2FtZVZhbHVlTm9uTnVtYmVyIiwicmVxdWlyZVByb21pc2UiLCJFUyIsIkVTNyIsIkVTMjAxOCIsInByb3BlcnR5S2V5IiwiZXhpc3QiLCJjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yIiwiSXRlcmF0b3JzQ29yZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiQlVHR1lfU0FGQVJJX0lURVJBVE9SUyIsInJldHVyblRoaXMiLCJJdGVyYWJsZSIsIkl0ZXJhdG9yQ29uc3RydWN0b3IiLCJJU19TRVQiLCJDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUiLCJnZXRJdGVyYXRpb25NZXRob2QiLCJLSU5EIiwiZGVmYXVsdEl0ZXJhdG9yIiwiSXRlcmFibGVQcm90b3R5cGUiLCJJTkNPUlJFQ1RfVkFMVUVTX05BTUUiLCJuYXRpdmVJdGVyYXRvciIsImFueU5hdGl2ZUl0ZXJhdG9yIiwiU0FGRV9DTE9TSU5HIiwiY2FsbGVkIiwiaXRlcmF0b3JXaXRoUmV0dXJuIiwiU0tJUF9DTE9TSU5HIiwiSVRFUkFUSU9OX1NVUFBPUlQiLCJpbnRlcm5hbE1hcCIsImludGVybmFsUmVkdWNlIiwiU0xPUFBZX01FVEhPRCIsIm9iamVjdFRvQXJyYXkiLCJGdW5jdGlvblByb3RvdHlwZSIsIkZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmciLCJuYW1lUkUiLCJpbnRlcm5hbEZpbHRlciIsInRvQWJzb2x1dGVJbmRleCIsIm5hdGl2ZVNsaWNlIiwiZmluIiwiZGVmZXIiLCJjaGFubmVsIiwicG9ydCIsInNldEltbWVkaWF0ZSIsImNsZWFySW1tZWRpYXRlIiwicHJvY2VzcyIsIk1lc3NhZ2VDaGFubmVsIiwiRGlzcGF0Y2giLCJjb3VudGVyIiwibmV4dFRpY2siLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwicG9zdE1lc3NhZ2UiLCJpbXBvcnRTY3JpcHRzIiwiYWR2YW5jZVN0cmluZ0luZGV4IiwicmVnRXhwRXhlYyIsIk1BVENIIiwibmF0aXZlTWF0Y2giLCJtYXliZUNhbGxOYXRpdmUiLCJyeCIsImZ1bGxVbmljb2RlIiwibWF0Y2hTdHIiLCJzYW1lVmFsdWUiLCJTRUFSQ0giLCJuYXRpdmVTZWFyY2giLCJzZWFyY2giLCJzZWFyY2hlciIsInByZXZpb3VzTGFzdEluZGV4IiwidSIsInJlcXVpcmUiLCJfZGVyZXFfIiwiZm9yY2VTaW1pbGFyIiwiMiIsIlNpbWlsYXIiLCJsYXN0SXRlbSIsImlzRXF1YWwiLCJ2YWwxIiwidmFsMiIsIjMiLCJNYXBPclNpbWlsYXIiLCJtb3ZlVG9Nb3N0UmVjZW50THJ1IiwibHJ1IiwibHJ1UGF0aCIsImlzTWF0Y2giLCJscnVMZW4iLCJscnVQYXRoTGVuIiwicmVtb3ZlQ2FjaGVkUmVzdWx0IiwicmVtb3ZlZExydSIsInJlbW92ZWRMcnVMZW4iLCJjdXJyZW50THJ1IiwiY2FjaGVJdGVtIiwibWVtb2l6ZXJpZmljIiwibmV3TWFwIiwiZm5SZXN1bHQiLCJjdXJyZW50Q2FjaGUiLCJhcmdzTGVuZ3RoTWludXNPbmUiLCJpc01lbW9pemVkIiwibnVtQXJncyIsIndhc01lbW9pemVkIiwiYXN5bmNUYWciLCJmdW5jVGFnIiwiZ2VuVGFnIiwicHJveHlUYWciLCJtYXBDYWNoZUNsZWFyIiwibWFwQ2FjaGVEZWxldGUiLCJtYXBDYWNoZUdldCIsIm1hcENhY2hlSGFzIiwibWFwQ2FjaGVTZXQiLCJNYXBDYWNoZSIsImJhc2VBc3NpZ25WYWx1ZSIsIm9iamVjdFByb3RvIiwiaXNQcm90b3R5cGUiLCJDdG9yIiwic3R1YkZhbHNlIiwiZnJlZUV4cG9ydHMiLCJmcmVlTW9kdWxlIiwiQnVmZmVyIiwiaXNCdWZmZXIiLCJiYXNlSXNUeXBlZEFycmF5IiwiYmFzZVVuYXJ5Iiwibm9kZVV0aWwiLCJub2RlSXNUeXBlZEFycmF5IiwiaXNUeXBlZEFycmF5IiwiSW50ZXJuYWxNZXRhZGF0YU1vZHVsZSIsIml0ZXJhdGUiLCJhbkluc3RhbmNlIiwiY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uIiwiaW5oZXJpdElmUmVxdWlyZWQiLCJDT05TVFJVQ1RPUl9OQU1FIiwiY29tbW9uIiwiSVNfV0VBSyIsIk5hdGl2ZUNvbnN0cnVjdG9yIiwiTmF0aXZlUHJvdG90eXBlIiwiQURERVIiLCJleHBvcnRlZCIsImZpeE1ldGhvZCIsImdldENvbnN0cnVjdG9yIiwiSEFTTlRfQ0hBSU5JTkciLCJUSFJPV1NfT05fUFJJTUlUSVZFUyIsIkFDQ0VQVF9JVEVSQUJMRVMiLCJCVUdHWV9aRVJPIiwiJGluc3RhbmNlIiwic2V0U3Ryb25nIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiYWN0aW9uT3B0aW9ucyIsIl9jb25maWd1cmVBY3Rpb25zIiwiYWN0aW9uSGFuZGxlciIsIl9hZGRvbnMiLCJnZXRDaGFubmVsIiwiX3YiLCJtaW5EZXB0aCIsImFjdGlvbkRpc3BsYXlUb0VtaXQiLCJhbGxvd0Z1bmN0aW9uIiwiX2NvbnN0YW50cyIsIkVWRU5UX0lEIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJjb25maWd1cmVBY3Rpb25zIiwiY2xlYXJPblN0b3J5Q2hhbmdlIiwibmFtZXNPYmplY3QiLCJhY3Rpb25zT2JqZWN0IiwiX2FjdGlvbiIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjdXJyZW50UXVldWUiLCJkcmFpbmluZyIsInF1ZXVlSW5kZXgiLCJjbGVhblVwTmV4dFRpY2siLCJkcmFpblF1ZXVlIiwicnVuQ2xlYXJUaW1lb3V0IiwiSXRlbSIsInRpdGxlIiwiYnJvd3NlciIsImVudiIsImFyZ3YiLCJ2ZXJzaW9ucyIsIm9uIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwib2ZmIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJwcmVwZW5kTGlzdGVuZXIiLCJwcmVwZW5kT25jZUxpc3RlbmVyIiwiY3dkIiwiY2hkaXIiLCJ1bWFzayIsImlzQXJndW1lbnRzIiwiY2FsbGVlIiwiZnVuY3Rpb25zSGF2ZU5hbWVzIiwiZ09QRCIsImZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcyIsInN5bVRvU3RyIiwic3ltU3RyaW5nUmVnZXgiLCJpc1JlYWxTeW1ib2xPYmplY3QiLCJpc1N5bWJvbE9iamVjdCIsImlzUHJvcGVydHlEZXNjcmlwdG9yIiwiYWxsb3dlZCIsImlzRGF0YSIsIklzQWNjZXNzb3IiLCJyZWNvcmRUeXBlIiwiYXJndW1lbnROYW1lIiwiSW5maW5pdHkiLCJyZW1haW4iLCJUb0ludDMyIiwiVG9VaW50MzIiLCJvcHRNZXNzYWdlIiwiSXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJJc0FjY2Vzc29yRGVzY3JpcHRvciIsIkZyb21Qcm9wZXJ0eURlc2NyaXB0b3IiLCJUb1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iaiIsImlzUmVnZXgiLCJ0cnlSZWdleEV4ZWMiLCJ0cnlSZWdleEV4ZWNDYWxsIiwiZ2V0SW5mZXJyZWROYW1lIiwiJFN5bWJvbFByb3RvIiwiJFN5bWJvbFZhbHVlT2YiLCIkU3RyaW5nUHJvdG8iLCIkY2hhckF0IiwiJFByb21pc2VSZXNvbHZlT3JpZyIsIiRQcm9taXNlUmVzb2x2ZSIsIiRnT1BTIiwiRW51bWVyYWJsZU93blByb3BlcnR5TmFtZXMiLCJ0aGlzU3ltYm9sVmFsdWUiLCJJc1N0cmluZ1ByZWZpeCIsInBMZW5ndGgiLCJOdW1iZXJUb1N0cmluZyIsIkNvcHlEYXRhUHJvcGVydGllcyIsImV4Y2x1ZGVkSXRlbXMiLCJmcm9tT2JqIiwic291cmNlS2V5cyIsIk93blByb3BlcnR5S2V5cyIsIm93bktleXMiLCJuZXh0S2V5IiwiZXhjbHVkZWQiLCJwcm9wVmFsdWUiLCJQcm9taXNlUmVzb2x2ZSIsImZsYWdzR2V0dGVyIiwiUmVnRXhwU3RyaW5nSXRlcmF0b3IiLCJPcmlnUmVnRXhwIiwicmVnZXhNYXRjaEFsbCIsIlN5bWJvbE1hdGNoQWxsIiwiY29uc3RydWN0UmVnZXgiLCJjb25zdHJ1Y3RSZWdleFdpdGhGbGFncyIsIkNyZWF0ZVJlZ0V4cFN0cmluZ0l0ZXJhdG9yIiwiZGVmaW5lUCIsIlR5cGVFcnIiLCJpZ25vcmVDYXNlIiwiZG90QWxsIiwic3RpY2t5IiwiZ2V0UG9seWZpbGwiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlIiwiYXJyYXlJbmRleE9mIiwiSVNfSU5DTFVERVMiLCJmcm9tSW5kZXgiLCJpbnRlZ2VyIiwiY2xhc3NvZlJhdyIsIkNPUlJFQ1RfQVJHVU1FTlRTIiwidHJ5R2V0IiwiZG9jdW1lbnRFbGVtZW50Iiwib3JpZ2luYWxNb2R1bGUiLCJVTlNDT1BBQkxFUyIsIkFycmF5UHJvdG90eXBlIiwiUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlIiwiYXJyYXlJdGVyYXRvciIsIkNTU1J1bGVMaXN0IiwiQ1NTU3R5bGVEZWNsYXJhdGlvbiIsIkNTU1ZhbHVlTGlzdCIsIkNsaWVudFJlY3RMaXN0IiwiRE9NUmVjdExpc3QiLCJET01TdHJpbmdMaXN0IiwiRE9NVG9rZW5MaXN0IiwiRGF0YVRyYW5zZmVySXRlbUxpc3QiLCJGaWxlTGlzdCIsIkhUTUxBbGxDb2xsZWN0aW9uIiwiSFRNTENvbGxlY3Rpb24iLCJIVE1MRm9ybUVsZW1lbnQiLCJIVE1MU2VsZWN0RWxlbWVudCIsIk1lZGlhTGlzdCIsIk1pbWVUeXBlQXJyYXkiLCJOYW1lZE5vZGVNYXAiLCJOb2RlTGlzdCIsIlBhaW50UmVxdWVzdExpc3QiLCJQbHVnaW4iLCJQbHVnaW5BcnJheSIsIlNWR0xlbmd0aExpc3QiLCJTVkdOdW1iZXJMaXN0IiwiU1ZHUGF0aFNlZ0xpc3QiLCJTVkdQb2ludExpc3QiLCJTVkdTdHJpbmdMaXN0IiwiU1ZHVHJhbnNmb3JtTGlzdCIsIlNvdXJjZUJ1ZmZlckxpc3QiLCJTdHlsZVNoZWV0TGlzdCIsIlRleHRUcmFja0N1ZUxpc3QiLCJUZXh0VHJhY2tMaXN0IiwiVG91Y2hMaXN0IiwibmF0aXZlRm9yRWFjaCIsImludGVybmFsRm9yRWFjaCIsIl9jbGllbnRfYXBpIiwiZGVmYXVsdERlY29yYXRlU3RvcnkiLCJfc3Rvcnlfc3RvcmUiLCJfY29uZmlnX2FwaSIsIl9zdWJzY3JpcHRpb25zX3N0b3JlIiwiX3BhdGhUb0lkIiwiX3F1ZXJ5cGFyYW1zIiwiZ2V0UXVlcnlQYXJhbXMiLCJnZXRRdWVyeVBhcmFtIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJuZXdPYmoiLCJpbnRlcm5hbEZpbmQiLCJTS0lQU19IT0xFUyIsInJldHVybk1ldGhvZCIsIlRPX0VOVFJJRVMiLCJDT05WRVJUX1RPX1NUUklORyIsImxvY2FsU3RvcmFnZSIsIndhcm5lZCIsImRlcHJlY2F0ZWQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJfYXJyYXlXaXRob3V0SG9sZXMiLCJhcnIyIiwiX2l0ZXJhYmxlVG9BcnJheSIsIml0ZXIiLCJfbm9uSXRlcmFibGVTcHJlYWQiLCJfZGVmaW5lUHJvcGVydGllcyIsIkNoYW5uZWwiLCJnZW5lcmF0ZVJhbmRvbUlkIiwidHJhbnNwb3J0IiwiX3JlZiRhc3luYyIsImFzeW5jIiwiX2NsYXNzQ2FsbENoZWNrIiwic2VuZGVyIiwic2V0SGFuZGxlciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImFkZFBlZXJMaXN0ZW5lciIsInBlZXJMaXN0ZW5lciIsImlnbm9yZVBlZXIiLCJfdGhpczIiLCJldmVudE5hbWVzIiwibGlzdGVuZXJDb3VudCIsIm9uY2VMaXN0ZW5lciIsImlzUGVlciIsIl90aGlzMyIsIlNVQlNUSVRVVElPTl9TWU1CT0xTIiwiU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQiLCJSRVBMQUNFIiwic2VhcmNoVmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJmdW5jdGlvbmFsUmVwbGFjZSIsImFjY3VtdWxhdGVkUmVzdWx0IiwibmV4dFNvdXJjZVBvc2l0aW9uIiwibWF0Y2hlZCIsImNhcHR1cmVzIiwibmFtZWRDYXB0dXJlcyIsInJlcGxhY2VyQXJncyIsImdldFN1YnN0aXR1dGlvbiIsInRhaWxQb3MiLCJjYXB0dXJlIiwiaGV4VGFibGUiLCJhcnJheVRvT2JqZWN0IiwicGxhaW5PYmplY3RzIiwiYXNzaWduU2luZ2xlU291cmNlIiwiY29tYmluZSIsImNvbXBhY3QiLCJjb21wYWN0UXVldWUiLCJjb21wYWN0ZWQiLCJkZWNvZGUiLCJkZWNvZGVyIiwiY2hhcnNldCIsInN0cldpdGhvdXRQbHVzIiwiZW5jb2RlIiwiZGVmYXVsdEVuY29kZXIiLCJlc2NhcGUiLCJhbGxvd1Byb3RvdHlwZXMiLCJtZXJnZVRhcmdldCIsInRhcmdldEl0ZW0iLCJwZXJjZW50VHdlbnRpZXMiLCJmb3JtYXR0ZXJzIiwiUkZDMTczOCIsIlJGQzM5ODYiLCJzdGFja0NsZWFyIiwic3RhY2tEZWxldGUiLCJzdGFja0dldCIsInN0YWNrSGFzIiwic3RhY2tTZXQiLCJTdGFjayIsImZ1bmNUb1N0cmluZyIsImFzc2lnbk1lcmdlVmFsdWUiLCJnZXRQcm90b3R5cGUiLCJvdmVyQXJnIiwiYmFzZUlzQXJndW1lbnRzIiwic2FmZUdldCIsImFycmF5TGlrZUtleXMiLCJiYXNlS2V5c0luIiwia2V5c0luIiwiYmFzZVRpbWVzIiwiaXNJbmRleCIsImluaGVyaXRlZCIsImlzQXJyIiwiaXNBcmciLCJpc0J1ZmYiLCJza2lwSW5kZXhlcyIsInJlSXNVaW50IiwiU2V0Q2FjaGUiLCJhcnJheVNvbWUiLCJjYWNoZUhhcyIsIkNPTVBBUkVfUEFSVElBTF9GTEFHIiwiQ09NUEFSRV9VTk9SREVSRURfRkxBRyIsImVxdWFsQXJyYXlzIiwiYml0bWFzayIsImN1c3RvbWl6ZXIiLCJlcXVhbEZ1bmMiLCJpc1BhcnRpYWwiLCJhcnJMZW5ndGgiLCJvdGhMZW5ndGgiLCJzdGFja2VkIiwic2VlbiIsImFyclZhbHVlIiwib3RoVmFsdWUiLCJjb21wYXJlZCIsIm90aEluZGV4IiwiYmFzZUdldCIsImNyZWF0ZVN1YnNjcmlwdGlvbnNTdG9yZSIsInN1YnNjcmlwaW9ucyIsInJlZ2lzdGVyIiwidXNlZCIsIm1hcmtBbGxBc1VudXNlZCIsImNsZWFyVW51c2VkIiwic3Vic2NyaXBpb24iLCJyZWRlZmluZUFsbCIsInNldFNwZWNpZXMiLCJpbnRlcm5hbFN0YXRlR2V0dGVyRm9yIiwiZ2V0RW50cnkiLCJJVEVSQVRPUl9OQU1FIiwiZ2V0SW50ZXJuYWxDb2xsZWN0aW9uU3RhdGUiLCJnZXRJbnRlcm5hbEl0ZXJhdG9yU3RhdGUiLCJnZXRCdWlsdEluIiwiaW50ZXJuYWxJbmRleE9mIiwibmF0aXZlSW5kZXhPZiIsIk5FR0FUSVZFX1pFUk8iLCJzZWFyY2hFbGVtZW50IiwibmF0aXZlRnJlZXplIiwiTVNJRSIsInRpbWUiLCJib3VuZEFyZ3MiLCJzZXRJbnRlcnZhbCIsImZvcm1hdHMiLCJwYXRoVG9JZCIsIl9xcyIsImlnbm9yZVF1ZXJ5UHJlZml4IiwiY29uc3RydWN0IiwiYXJnc0xlbmd0aCIsInBhcnRBcmdzIiwiSW50ZXJuYWwiLCJPd25Qcm9taXNlQ2FwYWJpbGl0eSIsIlByb21pc2VXcmFwcGVyIiwiUFJPTUlTRSIsInNwZWNpZXNDb25zdHJ1Y3RvciIsIm1pY3JvdGFzayIsInByb21pc2VSZXNvbHZlIiwiaG9zdFJlcG9ydEVycm9ycyIsIm5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlIiwicGVyZm9ybSIsImdldEludGVybmFsUHJvbWlzZVN0YXRlIiwiUHJvbWlzZUNvbnN0cnVjdG9yIiwiJGZldGNoIiwiZmV0Y2giLCJuZXdQcm9taXNlQ2FwYWJpbGl0eSIsIm5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSIsIklTX05PREUiLCJESVNQQVRDSF9FVkVOVCIsImNyZWF0ZUV2ZW50IiwiRmFrZVByb21pc2UiLCJQcm9taXNlUmVqZWN0aW9uRXZlbnQiLCJpc1RoZW5hYmxlIiwiaXNSZWplY3QiLCJub3RpZmllZCIsInJlYWN0aW9ucyIsIm9rIiwicmVhY3Rpb24iLCJleGl0ZWQiLCJmYWlsIiwiZG9tYWluIiwicmVqZWN0aW9uIiwib25IYW5kbGVVbmhhbmRsZWQiLCJlbnRlciIsImV4aXQiLCJvblVuaGFuZGxlZCIsInJlYXNvbiIsImluaXRFdmVudCIsImlzVW5oYW5kbGVkIiwiaW50ZXJuYWxSZWplY3QiLCJpbnRlcm5hbFJlc29sdmUiLCJleGVjdXRvciIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsImNhcGFiaWxpdHkiLCJyZW1haW5pbmciLCJhbHJlYWR5Q2FsbGVkIiwicmFjZSIsIlByb21pc2VDYXBhYmlsaXR5IiwiJCRyZXNvbHZlIiwiJCRyZWplY3QiLCJDWUNMSUNfS0VZIiwiUEFORUxfSUQiLCJBRERPTl9JRCIsIndpdGhBY3Rpb25zIiwiY3JlYXRlRGVjb3JhdG9yIiwibGFzdFN1YnNjcmlwdGlvbiIsImxhc3RBcmdzIiwiX2xvZGFzaCIsIl9jb3JlRXZlbnRzIiwiX2FjdGlvbnMiLCJfc2xpY2VkVG9BcnJheSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9hcnIiLCJfbiIsIl9zIiwiX25vbkl0ZXJhYmxlUmVzdCIsImRlbGVnYXRlRXZlbnRTcGxpdHRlciIsIm1hdGNoZXNNZXRob2QiLCJnZXRFbGVtZW50QnlJZCIsImhhc01hdGNoSW5BbmNlc3RyeSIsImNyZWF0ZUhhbmRsZXJzIiwiYWN0aW9uc0ZuIiwiX3JlZjIiLCJfa2V5JG1hdGNoMiIsImFjdGlvbnNTdWJzY3JpcHRpb24iLCJfcmVmMyIsIl9yZWY0Iiwic3RvcnlGbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwiLCJUZW1wbGF0ZVRhZyIsInRyYW5zZm9ybWVycyIsImludGVyaW1UYWciLCJ0cmFuc2Zvcm1FbmRSZXN1bHQiLCJ0cmFuc2Zvcm1TdHJpbmciLCJwcm9jZXNzU3Vic3RpdHV0aW9ucyIsInByZXZpb3VzVGFnIiwic3Vic3RpdHV0aW9ucyIsInJlc3VsdFNvRmFyIiwicmVtYWluaW5nUGFydCIsInN1YnN0aXR1dGlvbiIsInRyYW5zZm9ybVN1YnN0aXR1dGlvbiIsIm9uU3RyaW5nIiwib25TdWJzdGl0dXRpb24iLCJlbmRSZXN1bHQiLCJvbkVuZFJlc3VsdCIsInRyaW1SZXN1bHRUcmFuc2Zvcm1lciIsInNpZGUiLCJzdHJpcEluZGVudFRyYW5zZm9ybWVyIiwicmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIiwicmVwbGFjZVdoYXQiLCJyZXBsYWNlV2l0aCIsInJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciIsInJlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lciIsImNvbmp1bmN0aW9uIiwic2VyaWFsIiwiaW5saW5lQXJyYXlUcmFuc2Zvcm1lciIsImFycmF5TGVuZ3RoIiwic2VwYXJhdG9ySW5kZXgiLCJzcGxpdFN0cmluZ1RyYW5zZm9ybWVyIiwic3BsaXRCeSIsImluY2x1ZGVzIiwiaXNWYWxpZFZhbHVlIiwicmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciIsIl9tb2RlbHMiLCJMaW5rVG8iLCJoYXNXYXJuZWQiLCJfY29tbW9uVGFncyIsInN0cmlwSW5kZW50cyIsImxpbmtUbyIsImhyZWZUbyIsIndpdGhMaW5rcyIsImlzSW50ZXJvcE9ic2VydmFibGUiLCJmcm9tT2JzZXJ2YWJsZSIsImZyb21Qcm9taXNlIiwiaXNJdGVyYWJsZSIsImZyb21JdGVyYWJsZSIsIk9wIiwiaGFzT3duIiwiaXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJpbk1vZHVsZSIsInJlZ2VuZXJhdG9yUnVudGltZSIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwiR2VuU3RhdGVFeGVjdXRpbmciLCJHZW5TdGF0ZUNvbXBsZXRlZCIsIkNvbnRpbnVlU2VudGluZWwiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsIkdwIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJHZW5lcmF0b3IiLCJHZW5lcmF0b3JGdW5jdGlvbiIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJtYXJrIiwiYXdyYXAiLCJfX2F3YWl0IiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiQXN5bmNJdGVyYXRvciIsImlubmVyRm4iLCJvdXRlckZuIiwidHJ5TG9jc0xpc3QiLCJDb250ZXh0Iiwic2tpcFRlbXBSZXNldCIsInNlbnQiLCJfc2VudCIsInRyeUVudHJpZXMiLCJyZXNldFRyeUVudHJ5Iiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJ0cnlMb2MiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhYnJ1cHQiLCJmaW5hbGx5RW50cnkiLCJhZnRlckxvYyIsImZpbmlzaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJyZXN1bHROYW1lIiwibmV4dExvYyIsInByb3RvR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiX2ludm9rZSIsIm1ha2VJbnZva2VNZXRob2QiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwidHJ5Q2F0Y2giLCJwcmV2aW91c1Byb21pc2UiLCJlbnF1ZXVlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJ1bndyYXBwZWQiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiaXRlcmF0b3JNZXRob2QiLCIkRnVuY3Rpb24iLCJTdHJpbmdQcm90b3R5cGUiLCJOdW1iZXJQcm90b3R5cGUiLCJhcnJheV9zbGljZSIsImFycmF5X3NwbGljZSIsImFycmF5X3B1c2giLCJhcnJheV91bnNoaWZ0IiwiYXJyYXlfY29uY2F0IiwiYXJyYXlfam9pbiIsInRvX3N0cmluZyIsInNwYWNlU3RyaXBwZWQiLCJmbkNsYXNzIiwiZ2VuQ2xhc3MiLCJyZWdleENsYXNzIiwidHJ5U3RyaW5nT2JqZWN0Iiwic3RyaW5nQ2xhc3MiLCJmb3JjZUFzc2lnbiIsImlzQWN0dWFsTmFOIiwiYmluZGVyIiwiYm91bmRMZW5ndGgiLCJvd25zIiwiYXJyYXlTbGljZUFwcGx5Iiwib3JpZ0FycmF5U2xpY2UiLCJvcmlnQXJyYXlTbGljZUFwcGx5IiwiYXJyYXlTbGljZUlFIiwiYXJyYXlTbGljZUFwcGx5SUUiLCJzdHJTcGxpdCIsInN0ckluZGV4T2YiLCJwdXNoQ2FsbCIsImlzRW51bSIsImFycmF5U29ydCIsImhhc1Vuc2hpZnRSZXR1cm5WYWx1ZUJ1ZyIsImJveGVkU3RyaW5nIiwic3BsaXRTdHJpbmciLCJwcm9wZXJseUJveGVzQ29udGV4dCIsInByb3Blcmx5Qm94ZWQiLCJwcm9wZXJseUJveGVzTm9uU3RyaWN0IiwicHJvcGVybHlCb3hlc1N0cmljdCIsInRocmV3RXhjZXB0aW9uIiwiVCIsInJlZHVjZUNvZXJjZXNUb09iamVjdCIsIl9fXyIsInJlZHVjZVJpZ2h0Q29lcmNlc1RvT2JqZWN0IiwicmVkdWNlUmlnaHQiLCJoYXNGaXJlZm94MkluZGV4T2ZCdWciLCJoYXNGaXJlZm94Mkxhc3RJbmRleE9mQnVnIiwic3BsaWNlTm9vcFJldHVybnNFbXB0eUFycmF5IiwiZGVsZXRlQ291bnQiLCJzcGxpY2VXb3Jrc1dpdGhFbXB0eU9iamVjdCIsInNwbGljZVdvcmtzV2l0aExhcmdlU3BhcnNlQXJyYXlzIiwic3BsaWNlV29ya3NXaXRoU21hbGxTcGFyc2VBcnJheXMiLCJyZWxhdGl2ZVN0YXJ0IiwiYWN0dWFsU3RhcnQiLCJhY3R1YWxEZWxldGVDb3VudCIsInRvIiwiaXRlbUNvdW50IiwibWF4SyIsIm1pbksiLCJoYXNTdHJpbmdKb2luQnVnIiwib3JpZ2luYWxKb2luIiwiaGFzSm9pblVuZGVmaW5lZEJ1ZyIsInB1c2hTaGltIiwicHVzaElzTm90R2VuZXJpYyIsInB1c2hVbmRlZmluZWRJc1dlaXJkIiwic29ydElnbm9yZXNOb25GdW5jdGlvbnMiLCJlMiIsInNvcnRUaHJvd3NPblJlZ2V4Iiwic29ydElnbm9yZXNVbmRlZmluZWQiLCJjb21wYXJlRm4iLCJoYXNEb250RW51bUJ1ZyIsImhhc1Byb3RvRW51bUJ1ZyIsImhhc1N0cmluZ0VudW1CdWciLCJlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSIsImV4Y2x1ZGVkS2V5cyIsIiRhcHBsaWNhdGlvbkNhY2hlIiwiJGNvbnNvbGUiLCIkZXh0ZXJuYWwiLCIkZnJhbWUiLCIkZnJhbWVFbGVtZW50IiwiJGZyYW1lcyIsIiRpbm5lckhlaWdodCIsIiRpbm5lcldpZHRoIiwiJG9ubW96ZnVsbHNjcmVlbmNoYW5nZSIsIiRvbm1vemZ1bGxzY3JlZW5lcnJvciIsIiRvdXRlckhlaWdodCIsIiRvdXRlcldpZHRoIiwiJHBhZ2VYT2Zmc2V0IiwiJHBhZ2VZT2Zmc2V0IiwiJHBhcmVudCIsIiRzY3JvbGxMZWZ0IiwiJHNjcm9sbFRvcCIsIiRzY3JvbGxYIiwiJHNjcm9sbFkiLCIkc2VsZiIsIiR3ZWJraXRJbmRleGVkREIiLCIkd2Via2l0U3RvcmFnZUluZm8iLCIkd2luZG93IiwiJHdpZHRoIiwiJGhlaWdodCIsIiR0b3AiLCIkbG9jYWxTdG9yYWdlIiwiaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnIiwiZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5IiwiZG9udEVudW1zIiwiZG9udEVudW1zTGVuZ3RoIiwiaXNTdGFuZGFyZEFyZ3VtZW50cyIsImlzTGVnYWN5QXJndW1lbnRzIiwiaXNGbiIsImlzU3RyIiwidGhlS2V5cyIsInNraXBQcm90byIsInNraXBDb25zdHJ1Y3RvciIsImRvbnRFbnVtIiwia2V5c1dvcmtzV2l0aEFyZ3VtZW50cyIsImtleXNIYXNBcmd1bWVudHNMZW5ndGhCdWciLCJhcmdLZXlzIiwiaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnIiwiaGFzVG9TdHJpbmdGb3JtYXRCdWciLCJoYXNOZWdhdGl2ZU1vbnRoWWVhckJ1ZyIsImdldFVUQ01vbnRoIiwiYU5lZ2F0aXZlVGVzdERhdGUiLCJhUG9zaXRpdmVUZXN0RGF0ZSIsImhhc1RvVVRDU3RyaW5nRm9ybWF0QnVnIiwidG9VVENTdHJpbmciLCJ0aW1lWm9uZU9mZnNldCIsImdldFRpbWV6b25lT2Zmc2V0IiwidG9EYXRlU3RyaW5nIiwib3JpZ2luYWxHZXRGdWxsWWVhciIsImdldEZ1bGxZZWFyIiwib3JpZ2luYWxHZXRNb250aCIsImdldE1vbnRoIiwib3JpZ2luYWxHZXREYXRlIiwiZ2V0RGF0ZSIsIm9yaWdpbmFsR2V0VVRDRnVsbFllYXIiLCJnZXRVVENGdWxsWWVhciIsIm9yaWdpbmFsR2V0VVRDTW9udGgiLCJvcmlnaW5hbEdldFVUQ0RhdGUiLCJnZXRVVENEYXRlIiwib3JpZ2luYWxHZXRVVENEYXkiLCJnZXRVVENEYXkiLCJvcmlnaW5hbEdldFVUQ0hvdXJzIiwiZ2V0VVRDSG91cnMiLCJvcmlnaW5hbEdldFVUQ01pbnV0ZXMiLCJnZXRVVENNaW51dGVzIiwib3JpZ2luYWxHZXRVVENTZWNvbmRzIiwiZ2V0VVRDU2Vjb25kcyIsIm9yaWdpbmFsR2V0VVRDTWlsbGlzZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiZGF5TmFtZSIsIm1vbnRoTmFtZSIsImRheXNJbk1vbnRoIiwibW9udGgiLCJ5ZWFyIiwiZGF0ZSIsImRheSIsImhvdXIiLCJtaW51dGUiLCJnZXREYXkiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwidGltZXpvbmVPZmZzZXQiLCJob3Vyc09mZnNldCIsIm1pbnV0ZXNPZmZzZXQiLCJuZWdhdGl2ZURhdGUiLCJuZWdhdGl2ZVllYXJTdHJpbmciLCJoYXNOZWdhdGl2ZURhdGVCdWciLCJ0b0lTT1N0cmluZyIsImhhc1NhZmFyaTUxRGF0ZUJ1ZyIsImRhdGVUb0pTT05Jc1N1cHBvcnRlZCIsInR2IiwidG9JU08iLCJzdXBwb3J0c0V4dGVuZGVkWWVhcnMiLCJhY2NlcHRzSW52YWxpZERhdGVzIiwiZG9lc05vdFBhcnNlWTJLTmV3WWVhciIsIm1heFNhZmVVbnNpZ25lZDMyQml0IiwiaGFzU2FmYXJpU2lnbmVkSW50QnVnIiwiTmF0aXZlRGF0ZSIsIkRhdGVTaGltIiwiWSIsIk0iLCJoIiwibXMiLCJzZWNvbmRzIiwibWlsbGlzIiwibXNUb1NoaWZ0Iiwic1RvU2hpZnQiLCJpc29EYXRlRXhwcmVzc2lvbiIsIm1vbnRocyIsImRheUZyb21Nb250aCIsInRvVVRDIiwiVVRDIiwibWlsbGlzZWNvbmQiLCJpc0xvY2FsVGltZSIsInNpZ25PZmZzZXQiLCJob3VyT2Zmc2V0IiwibWludXRlT2Zmc2V0IiwiaGFzTWludXRlc09yU2Vjb25kc09yTWlsbGlzZWNvbmRzIiwiaGFzVG9GaXhlZEJ1Z3MiLCJ0b0ZpeGVkIiwidG9GaXhlZEhlbHBlcnMiLCJudW1Ub1N0cmluZyIsIngyIiwidG9GaXhlZFNoaW0iLCJmcmFjdGlvbkRpZ2l0cyIsInoiLCJoYXNUb1ByZWNpc2lvblVuZGVmaW5lZEJ1ZyIsInRvUHJlY2lzaW9uIiwib3JpZ2luYWxUb1ByZWNpc2lvbiIsInByZWNpc2lvbiIsImNvbXBsaWFudEV4ZWNOcGNnIiwibWF4U2FmZTMyQml0SW50Iiwic2VwYXJhdG9yMiIsImxhc3RMZW5ndGgiLCJsYXN0TGFzdEluZGV4Iiwic2VwYXJhdG9yQ29weSIsInNwbGl0TGltaXQiLCJzdHJfcmVwbGFjZSIsInJlcGxhY2VSZXBvcnRzR3JvdXBzQ29ycmVjdGx5IiwiZ3JvdXAiLCJoYXNDYXB0dXJpbmdHcm91cHMiLCJvcmlnaW5hbExhc3RJbmRleCIsInN0cmluZ19zdWJzdHIiLCJoYXNOZWdhdGl2ZVN1YnN0ckJ1ZyIsIm5vcm1hbGl6ZWRTdGFydCIsInplcm9XaWR0aCIsIndzUmVnZXhDaGFycyIsInRyaW1CZWdpblJlZ2V4cCIsInRyaW1FbmRSZWdleHAiLCJoYXNUcmltV2hpdGVzcGFjZUJ1ZyIsImhhc0xhc3RJbmRleEJ1ZyIsInNlYXJjaFN0cmluZyIsInNlYXJjaFN0ciIsIm51bVBvcyIsInNlYXJjaExlbiIsIm9yaWdpbmFsTGFzdEluZGV4T2YiLCJvcmlnUGFyc2VJbnQiLCJoZXhSZWdleCIsInJhZGl4IiwiZGVmYXVsdGVkUmFkaXgiLCJvcmlnUGFyc2VGbG9hdCIsImlucHV0U3RyaW5nIiwiZXJyb3JUb1N0cmluZ1NoaW0iLCJlbnN1cmVOb25FbnVtZXJhYmxlIiwicmVnZXhUb1N0cmluZyIsImRlZmluZUdldHRlciIsImRlZmluZVNldHRlciIsImxvb2t1cEdldHRlciIsImxvb2t1cFNldHRlciIsInByb3RvdHlwZU9mT2JqZWN0IiwiaXNFbnVtZXJhYmxlIiwic3VwcG9ydHNBY2Nlc3NvcnMiLCJfX2RlZmluZUdldHRlcl9fIiwiX19kZWZpbmVTZXR0ZXJfXyIsIl9fbG9va3VwR2V0dGVyX18iLCJfX2xvb2t1cFNldHRlcl9fIiwiZG9lc0dldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmsiLCJzZW50aW5lbCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmtzT25PYmplY3QiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JGYWxsYmFjayIsIm5vdFByb3RvdHlwZU9mT2JqZWN0IiwiY3JlYXRlRW1wdHkiLCJzdXBwb3J0c1Byb3RvIiwic2hvdWxkVXNlQWN0aXZlWCIsIkFjdGl2ZVhPYmplY3QiLCJnZXRFbXB0eVZpYUFjdGl2ZVgiLCJ4RG9jIiwicGFyZW50V2luZG93IiwiZ2V0RW1wdHlWaWFJRnJhbWUiLCJpc1Byb3RvdHlwZU9mIiwidG9Mb2NhbGVTdHJpbmciLCJkb2VzRGVmaW5lUHJvcGVydHlXb3JrIiwiZGVmaW5lUHJvcGVydHlXb3Jrc09uT2JqZWN0IiwiZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tIiwiZGVmaW5lUHJvcGVydHlGYWxsYmFjayIsImRlZmluZVByb3BlcnRpZXNGYWxsYmFjayIsImhhc0dldHRlciIsImhhc1NldHRlciIsInNlYWwiLCJmcmVlemVPYmplY3QiLCJpc1NlYWxlZCIsImlzRnJvemVuIiwiQXJyYXlJdGVyYXRvciIsIl9hcHBseSIsIl9jYWxsIiwibm90VGh1bmtlciIsIm5vdFRodW5rIiwidGhyb3dzRXJyb3IiLCJ2YWx1ZU9yRmFsc2VJZlRocm93cyIsImlzQ2FsbGFibGVXaXRob3V0TmV3IiwiX3JlZHVjZSIsIl9maWx0ZXIiLCJfc29tZSIsImZvcmNlIiwiZm9yY2VPdmVycmlkZSIsIl90b1N0cmluZyIsIklzQ2FsbGFibGVGYXN0IiwiVmFsdWUiLCJwcm94eSIsIm9yaWdpbmFsT2JqZWN0IiwidGFyZ2V0T2JqZWN0Iiwib3JpZ2luYWxEZXNjcmlwdG9yIiwiZ2V0S2V5Iiwic2V0S2V5IiwiZGVmaW5lQnlEZXNjcmlwdG9yIiwicHJlc2VydmVUb1N0cmluZyIsIlByb3RvdHlwZSIsInN1cHBvcnRzU3ViY2xhc3NpbmciLCJTdWIiLCJTdWJjbGFzcyIsImdsb2JhbHMiLCJnbG9iYWxJc0Zpbml0ZSIsIl9pbmRleE9mIiwiX2FycmF5SW5kZXhPZkFwcGx5IiwiX2NvbmNhdCIsIl9zdHJTbGljZSIsIl9wdXNoIiwiX3B1c2hBcHBseSIsIl9zaGlmdCIsIl9tYXgiLCJfbWluIiwiX2Zsb29yIiwiX2FicyIsIl9leHAiLCJfbG9nIiwiX3NxcnQiLCJzcXJ0IiwiX2hhc093blByb3BlcnR5IiwiT3JpZ01hcCIsIm9yaWdNYXBEZWxldGUiLCJvcmlnTWFwR2V0Iiwib3JpZ01hcEhhcyIsIm9yaWdNYXBTZXQiLCJzeW1ib2xTcGVjaWVzIiwibnVtYmVySXNOYU4iLCJudW1iZXJJc0Zpbml0ZSIsIl9zaWduIiwiX2xvZzFwIiwibG9nMXAiLCJwcmltaXRpdmUiLCJyZWdleCIsIm92ZXJyaWRlTmF0aXZlIiwiJGl0ZXJhdG9yJCIsImRvbUFsbCIsImlzTnVsbE9yVW5kZWZpbmVkIiwiaXNOdWxsT3JVbmRlZmluZWRBbmROb3REb2N1bWVudEFsbCIsIlR5cGVJc09iamVjdCIsIklzSXRlcmFibGUiLCJpdEZuIiwiY29tcGxldGlvbklzVGhyb3ciLCJpbm5lckV4Y2VwdGlvbiIsIkNvbnN0cnVjdCIsIm5ld1RhcmdldCIsImlzRVM2aW50ZXJuYWwiLCJDcmVhdGVIVE1MIiwicDEiLCJzeW1ib2xTZWFyY2giLCJvcmlnaW5hbFNlYXJjaCIsInNlYXJjaFNoaW0iLCJzeW1ib2xSZXBsYWNlIiwib3JpZ2luYWxSZXBsYWNlIiwicmVwbGFjZVNoaW0iLCJzeW1ib2xTcGxpdCIsIm9yaWdpbmFsU3BsaXQiLCJzcGxpdFNoaW0iLCJzcGxpdHRlciIsInN5bWJvbE1hdGNoRXhpc3RzIiwic3RyaW5nTWF0Y2hJZ25vcmVzU3ltYm9sTWF0Y2giLCJzeW1ib2xNYXRjaCIsIm9yaWdpbmFsTWF0Y2giLCJtYXRjaFNoaW0iLCJ3cmFwQ29uc3RydWN0b3IiLCJrZXlzVG9Ta2lwIiwiZGVmYXVsdFNwZWNpZXNHZXR0ZXIiLCJhZGREZWZhdWx0U3BlY2llcyIsImFkZEl0ZXJhdG9yIiwiY3JlYXRlRGF0YVByb3BlcnR5IiwiY3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyIsImVtdWxhdGVFUzZjb25zdHJ1Y3QiLCJkZWZhdWx0TmV3VGFyZ2V0IiwiZGVmYXVsdFByb3RvIiwib3JpZ2luYWxGcm9tQ29kZVBvaW50IiwiY29kZVBvaW50cyIsIlN0cmluZ1NoaW1zIiwiY2FsbFNpdGUiLCJjb29rZWQiLCJyYXdTdHJpbmciLCJsaXRlcmFsc2VnbWVudHMiLCJuZXh0U2VnIiwibmV4dFN1YiIsInN0cmluZ0VsZW1lbnRzIiwibmV4dEluZGV4IiwiMCIsInN0cmluZ1JlcGVhdCIsInJlcGVhdCIsInRpbWVzIiwic3RyaW5nTWF4TGVuZ3RoIiwiU3RyaW5nUHJvdG90eXBlU2hpbXMiLCJ0aGlzU3RyIiwibnVtVGltZXMiLCJzdGFydHNXaXRoUmVqZWN0c1JlZ2V4Iiwic3RhcnRzV2l0aEhhbmRsZXNJbmZpbml0eSIsInN0YXJ0c1dpdGhTdXBwb3J0c1N5bWJvbE1hdGNoIiwiZW5kc1dpdGhTdXBwb3J0c1N5bWJvbE1hdGNoIiwiaW5jbHVkZXNTdXBwb3J0c1N5bWJvbE1hdGNoIiwidHJpbVJlZ2V4cCIsInRyaW1TaGltIiwibm9uV1MiLCJpc0JhZEhleFJlZ2V4IiwiaGFzU3RyaW5nVHJpbUJ1ZyIsIml0ZXJhdG9yUmVzdWx0IiwiU3RyaW5nSXRlcmF0b3IiLCJBcnJheVNoaW1zIiwibWFwRm4iLCJtYXBwaW5nIiwidXNpbmdJdGVyYXRvciIsIm5leHRWYWx1ZSIsImFycmF5TGlrZSIsInJldHZhbCIsImFycmF5T2ZTdXBwb3J0c1N1YmNsYXNzaW5nIiwiRm9vIiwiZm9vQXJyIiwiQXJyYXlQcm90b3R5cGVTaGltcyIsImNvcHlXaXRoaW4iLCJyZWxhdGl2ZVRhcmdldCIsInJlbGF0aXZlRW5kIiwiZmluYWxJdGVtIiwiZGlyZWN0aW9uIiwidW5zY29wYWJsZXMiLCJvcmlnaW5hbEFycmF5UHJvdG90eXBlVmFsdWVzIiwiYXJyYXlGcm9tU3dhbGxvd3NOZWdhdGl2ZUxlbmd0aHMiLCJhcnJheUZyb21IYW5kbGVzSXRlcmFibGVzIiwiYXJyYXlGcm9tSGFuZGxlc1VuZGVmaW5lZE1hcEZ1bmN0aW9uIiwib3JpZ0FycmF5RnJvbSIsImludDMyc0FzT25lIiwidG9MZW5ndGhzQ29ycmVjdGx5IiwicmV2ZXJzZWQiLCJvcmlnaW5hbEZvckVhY2giLCJjYWxsYmFja0ZuIiwib3JpZ2luYWxNYXAiLCJvcmlnaW5hbEZpbHRlciIsIm9yaWdpbmFsU29tZSIsIm9yaWdpbmFsRXZlcnkiLCJvcmlnaW5hbFJlZHVjZSIsIm9yaWdpbmFsUmVkdWNlUmlnaHQiLCJsYWNrc09jdGFsU3VwcG9ydCIsImxhY2tzQmluYXJ5U3VwcG9ydCIsInRyaW1zTm9uV2hpdGVzcGFjZSIsIk9yaWdOdW1iZXIiLCJiaW5hcnlSZWdleCIsIm9jdGFsUmVnZXgiLCJpc0JhZEhleCIsIk51bWJlclNoaW0iLCJwcmltVmFsdWUiLCJ2YWx1ZU9mU3VjY2VlZHMiLCJNQVhfVkFMVUUiLCJNSU5fVkFMVUUiLCJORUdBVElWRV9JTkZJTklUWSIsIlBPU0lUSVZFX0lORklOSVRZIiwibWF4U2FmZUludGVnZXIiLCJNSU5fU0FGRV9JTlRFR0VSIiwiRVBTSUxPTiIsImlzSW50ZWdlciIsImlzU2FmZUludGVnZXIiLCJGQUtFTlVMTCIsImdwbyIsInNwbyIsImlzRW51bWVyYWJsZU9uIiwiZW5zdXJlRW51bWVyYWJsZSIsInNsaWNlQXJncyIsImluaXRpYWwiLCJkZXNpcmVkQXJnQ291bnQiLCJhc3NpZ25UbyIsImFzc2lnblRvU291cmNlIiwiYXNzaWduUmVkdWNlciIsIk9iamVjdFNoaW1zIiwiaXMiLCJhc3NpZ25IYXNQZW5kaW5nRXhjZXB0aW9ucyIsInRocm93ZXIiLCJFUzVPYmplY3RTaGltcyIsIm1hZ2ljIiwiY2hlY2tBcmdzIiwicG9seWZpbGwiLCJvYmplY3RLZXlzQWNjZXB0c1ByaW1pdGl2ZXMiLCJvcmlnaW5hbE9iamVjdEtleXMiLCJvYmplY3RLZXlzUmVqZWN0c1JlZ2V4IiwicmVnZXhSZWplY3RpbmdPYmplY3RLZXlzIiwicmVnZXhLZXlzIiwib2JqZWN0R09QTkFjY2VwdHNQcmltaXRpdmVzIiwiY2FjaGVkV2luZG93TmFtZXMiLCJvcmlnaW5hbE9iamVjdEdldE93blByb3BlcnR5TmFtZXMiLCJvYmplY3RHT1BEQWNjZXB0c1ByaW1pdGl2ZXMiLCJvcmlnaW5hbE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm9iamVjdFNlYWxBY2NlcHRzUHJpbWl0aXZlcyIsIm9yaWdpbmFsT2JqZWN0U2VhbCIsIm9iamVjdElzU2VhbGVkQWNjZXB0c1ByaW1pdGl2ZXMiLCJvcmlnaW5hbE9iamVjdElzU2VhbGVkIiwib2JqZWN0RnJlZXplQWNjZXB0c1ByaW1pdGl2ZXMiLCJvcmlnaW5hbE9iamVjdEZyZWV6ZSIsIm9iamVjdElzRnJvemVuQWNjZXB0c1ByaW1pdGl2ZXMiLCJvcmlnaW5hbE9iamVjdElzRnJvemVuIiwib2JqZWN0UHJldmVudEV4dGVuc2lvbnNBY2NlcHRzUHJpbWl0aXZlcyIsIm9yaWdpbmFsT2JqZWN0UHJldmVudEV4dGVuc2lvbnMiLCJvYmplY3RJc0V4dGVuc2libGVBY2NlcHRzUHJpbWl0aXZlcyIsIm9yaWdpbmFsT2JqZWN0SXNFeHRlbnNpYmxlIiwib2JqZWN0R2V0UHJvdG9BY2NlcHRzUHJpbWl0aXZlcyIsIm9yaWdpbmFsR2V0UHJvdG8iLCJoYXNGbGFncyIsInJlZ0V4cEZsYWdzR2V0dGVyIiwicmVnRXhwU3VwcG9ydHNGbGFnc1dpdGhSZWdleCIsInJlZ0V4cE5lZWRzVG9TdXBwb3J0U3ltYm9sTWF0Y2giLCJyZWdleFRvU3RyaW5nSXNHZW5lcmljIiwicmVnZXhUb1N0cmluZ1N1cHBvcnRzR2VuZXJpY0ZsYWdzIiwib3JpZ1JlZ0V4cFRvU3RyaW5nIiwic291cmNlRGVzYyIsImxlZ2FjeVNvdXJjZUdldHRlciIsInNvdXJjZUdldHRlciIsIlJlZ0V4cFNoaW0iLCJwYXR0ZXJuSXNSZWdFeHAiLCIkaW5wdXQiLCJyZWdleEdsb2JhbHMiLCJsYXN0TWF0Y2giLCJsYXN0UGFyZW4iLCJsZWZ0Q29udGV4dCIsInJpZ2h0Q29udGV4dCIsImludmVyc2VFcHNpbG9uIiwicm91bmRUaWVzVG9FdmVuIiwiQklOQVJZXzMyX0VQU0lMT04iLCJCSU5BUllfMzJfTUFYX1ZBTFVFIiwiQklOQVJZXzMyX01JTl9WQUxVRSIsIkxPRzJFIiwiTE9HMTBFIiwibnVtYmVyQ0xaIiwiY2x6IiwiTWF0aFNoaW1zIiwiYWNvc2giLCJ4SW52U3F1YXJlZCIsImhhbGZYIiwiYXNpbmgiLCJhU3F1YXJlZCIsImF0YW5oIiwiY2JydCIsIm5lZ2F0ZSIsImNsejMyIiwiY29zaCIsImV4cG0xIiwiaHlwb3QiLCJsYXJnZXN0IiwibG9nMiIsImxvZzEwIiwic2luaCIsInRhbmgiLCJ0cnVuYyIsImltdWwiLCJmcm91bmQiLCJ3aXRoaW5VTFBEaXN0YW5jZSIsImV4cG0xT2ZUZW4iLCJvcmlnTWF0aFJvdW5kIiwicm91bmQiLCJyb3VuZEhhbmRsZXNCb3VuZGFyeUNvbmRpdGlvbnMiLCJzbWFsbGVzdFBvc2l0aXZlTnVtYmVyV2hlcmVSb3VuZEJyZWFrcyIsImxhcmdlc3RQb3NpdGl2ZU51bWJlcldoZXJlUm91bmRCcmVha3MiLCJyb3VuZERvZXNOb3RJbmNyZWFzZUludGVnZXJzIiwib3JpZ0ltdWwiLCJ0aGVuYWJsZSIsIlByb21pc2VTaGltIiwiSXNQcm9taXNlIiwiX3Byb21pc2UiLCJtYWtlWmVyb1RpbWVvdXQiLCJ0aW1lb3V0cyIsInN0b3BQcm9wYWdhdGlvbiIsInByIiwiUHJvbWlzZSRwcm90b3R5cGUiLCJQcm9taXNlJHByb3RvdHlwZSR0aGVuIiwiUFJPTUlTRV9JREVOVElUWSIsIlBST01JU0VfVEhST1dFUiIsIlBST01JU0VfRkFLRV9DQVBBQklMSVRZIiwiZW5xdWV1ZVByb21pc2VSZWFjdGlvbkpvYiIsInByb21pc2VSZWFjdGlvbkpvYiIsInByb21pc2VDYXBhYmlsaXR5IiwiaGFuZGxlclJlc3VsdCIsImZ1bGZpbGxQcm9taXNlIiwicmVhY3Rpb25MZW5ndGgiLCJmdWxmaWxsUmVhY3Rpb25IYW5kbGVyMCIsInJlYWN0aW9uQ2FwYWJpbGl0eTAiLCJyZWplY3RSZWFjdGlvbnMwIiwicmVqZWN0UHJvbWlzZSIsInJlamVjdFJlYWN0aW9uSGFuZGxlcjAiLCJjcmVhdGVSZXNvbHZpbmdGdW5jdGlvbnMiLCJhbHJlYWR5UmVzb2x2ZWQiLCJyZXNvbHV0aW9uIiwicHJvbWlzZVJlc29sdmVUaGVuYWJsZUpvYiIsIm9wdGltaXplZFRoZW4iLCJyZXNvbHZpbmdGdW5jdGlvbnMiLCJfcHJvbWlzZUFsbFJlc29sdmVyIiwiaXRlcmF0b3JSZWNvcmQiLCJyZXN1bHRDYXBhYmlsaXR5IiwibmV4dFByb21pc2UiLCJyZXNvbHZlRWxlbWVudCIsInBlcmZvcm1Qcm9taXNlQWxsIiwiZWUiLCJwZXJmb3JtUHJvbWlzZVJhY2UiLCJyZWplY3RGdW5jIiwicmVzb2x2ZUZ1bmMiLCJyZXR1cm5WYWx1ZUlzSWdub3JlZCIsImZ1bGZpbGxSZWFjdGlvbkhhbmRsZXIiLCJyZWplY3RSZWFjdGlvbkhhbmRsZXIiLCJhY2NlcHQiLCJwcm9taXNlU3VwcG9ydHNTdWJjbGFzc2luZyIsInByb21pc2VJZ25vcmVzTm9uRnVuY3Rpb25UaGVuQ2FsbGJhY2tzIiwicHJvbWlzZVJlcXVpcmVzT2JqZWN0Q29udGV4dCIsInByb21pc2VSZXNvbHZlQnJva2VuIiwicDIiLCJnZXRzVGhlblN5bmNocm9ub3VzbHkiLCJCYWRSZXNvbHZlclByb21pc2UiLCJoYXNCYWRSZXNvbHZlclByb21pc2UiLCJvcmlnQWxsIiwib3JpZ1JhY2UiLCJvcmlnUmVzb2x2ZSIsIm9yaWdSZWplY3QiLCJ0ZXN0T3JkZXIiLCJwcmVzZXJ2ZXNJbnNlcnRpb25PcmRlciIsInByZXNlcnZlc051bWVyaWNJbnNlcnRpb25PcmRlciIsImZhc3RrZXkiLCJza2lwSW5zZXJ0aW9uT3JkZXJDaGVjayIsImVtcHR5T2JqZWN0IiwiYWRkSXRlcmFibGVUb01hcCIsIk1hcENvbnN0cnVjdG9yIiwiYWRkZXIiLCJuZXh0SXRlbSIsImFkZEl0ZXJhYmxlVG9TZXQiLCJTZXRDb25zdHJ1Y3RvciIsImNvbGxlY3Rpb25TaGltcyIsIk1hcEVudHJ5IiwiaXNSZW1vdmVkIiwiTWFwJHByb3RvdHlwZSIsInJlcXVpcmVNYXBTbG90IiwiaXNNYXAiLCJfZXM2bWFwIiwiTWFwSXRlcmF0b3IiLCJpc01hcEl0ZXJhdG9yIiwiTWFwU2hpbSIsIl9tYXAiLCJfc2l6ZSIsIl9zdG9yYWdlIiwiZmtleSIsIlNldCRwcm90b3R5cGUiLCJyZXF1aXJlU2V0U2xvdCIsImlzU2V0IiwiX2VzNnNldCIsIlNldFNoaW0iLCJlbnN1cmVNYXAiLCJkZWNvZGVLZXkiLCJoYXNGS2V5IiwiU2V0SXRlcmF0b3IiLCJlbnRpcmVTZXQiLCJpc1NldEl0ZXJhdG9yIiwiaXNHb29nbGVUcmFuc2xhdGUiLCJtYXBBY2NlcHRzQXJndW1lbnRzIiwidGVzdE1hcCIsIm1hcFVzZXNTYW1lVmFsdWVaZXJvIiwibWFwU3VwcG9ydHNDaGFpbmluZyIsInRlc3RTZXQiLCJzZXRVc2VzU2FtZVZhbHVlWmVybyIsInNldFN1cHBvcnRzQ2hhaW5pbmciLCJvcmlnU2V0QWRkIiwib3JpZ1NldEhhcyIsIm9yaWdTZXREZWwiLCJTZXREZWxldGUiLCJtYXBTdXBwb3J0c1N1YmNsYXNzaW5nIiwibWFwRmFpbHNUb1N1cHBvcnRTdWJjbGFzc2luZyIsIm1hcFJlcXVpcmVzTmV3Iiwic2V0U3VwcG9ydHNTdWJjbGFzc2luZyIsInNldEZhaWxzVG9TdXBwb3J0U3ViY2xhc3NpbmciLCJzZXRSZXF1aXJlc05ldyIsIk9yaWdTZXQiLCJtYXBJdGVyYXRpb25UaHJvd3NTdG9wSXRlcmF0b3IiLCJhbm9ueW1vdXNTZXRIYXMiLCJ0aHJvd1VubGVzc1RhcmdldElzT2JqZWN0IiwiUmVmbGVjdFNoaW1zIiwiZGVsZXRlUHJvcGVydHkiLCJjYWxsQW5kQ2F0Y2hFeGNlcHRpb24iLCJDb252ZXJ0RXhjZXB0aW9uVG9Cb29sZWFuIiwiaW50ZXJuYWxHZXQiLCJpbnRlcm5hbFNldCIsIm9iamVjdERvdEdldFByb3RvdHlwZU9mIiwid2lsbENyZWF0ZUNpcmN1bGFyUHJvdG90eXBlIiwibGFzdFByb3RvIiwiZGVmaW5lT3JPdmVycmlkZVJlZmxlY3RQcm9wZXJ0eSIsIm9yaWdpbmFsUmVmbGVjdEdldFByb3RvIiwiYmFzaWMiLCJkYXRlVG9TdHJpbmciLCJzaGltbWVkRGF0ZVRvU3RyaW5nIiwic3RyaW5nSFRNTHNoaW1zIiwiYW5jaG9yIiwiYmlnIiwiYmxpbmsiLCJib2xkIiwiZml4ZWQiLCJmb250Y29sb3IiLCJjb2xvciIsImZvbnRzaXplIiwiaXRhbGljcyIsImxpbmsiLCJzbWFsbCIsInN0cmlrZSIsInN1cCIsInNob3VsZE92ZXJ3cml0ZSIsInF1b3Rlc0NvdW50IiwiSlNPTnN0cmluZ2lmaWVzU3ltYm9scyIsIkpTT05zdHJpbmdpZnlBY2NlcHRzT2JqZWN0U3ltYm9sIiwib3JpZ1N0cmluZ2lmeSIsInJlcGxhY2VGbiIsIndyYXBwZWRSZXBsYWNlciIsInBhcnNlZFZhbHVlIiwic2hpbU5hbWUiLCJmdW5jdGlvblByb3RvIiwiZnVuY3Rpb25Ub1N0cmluZyIsInN0cmluZ01hdGNoIiwiY2xhc3NSZWdleCIsImdldE5hbWUiLCJpc0NsYXNzQ29uc3RydWN0b3IiLCJpc0NsYXNzIiwiRVJST1JfTUVTU0FHRSIsInNoaW1BcnJheVByb3RvdHlwZUluY2x1ZGVzIiwiaXNEYXRlIiwib3JkaW5hcnlUb1ByaW1pdGl2ZSIsIk9yZGluYXJ5VG9QcmltaXRpdmUiLCJoaW50IiwiZXhvdGljVG9QcmltIiwiaXNEYXRlT2JqZWN0IiwidHJ5RGF0ZU9iamVjdCIsInN5bU9iaiIsInN5bXMiLCJFUzVpbnRlcm5hbFNsb3RzIiwiYWN0dWFsSGludCIsInNoaW1WYWx1ZXMiLCJ0ZXN0VmFsdWVzIiwidmFscyIsInNoaW1FbnRyaWVzIiwidGVzdEVudHJpZXMiLCJlbnRyeXMiLCJzaGltUGFkU3RhcnQiLCJwYWRTdGFydCIsIm1heExlbmd0aCIsImZpbGxTdHJpbmciLCJzdHJpbmdMZW5ndGgiLCJmaWxsZXIiLCJpbnRNYXhMZW5ndGgiLCJmaWxsTGVuIiwiZkxlbiIsInJlbWFpbmluZ0NvZGVVbml0cyIsInRydW5jYXRlZFN0cmluZ0ZpbGxlciIsInNoaW1QYWRFbmQiLCJwYWRFbmQiLCJzaGltR2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJnZXREZXNjcmlwdG9yIiwiZ2V0T3duTmFtZXMiLCJnZXRTeW1ib2xzIiwiZ2V0QWxsIiwiaXNFUzUiLCJzYWZlUHV0Iiwic2hpbVByb21pc2VGaW5hbGx5IiwidGVzdEZpbmFsbHkiLCJPcmlnaW5hbFByb21pc2UiLCJwcm9taXNlRmluYWxseSIsImZpbmFsbHlfIiwib25GaW5hbGx5IiwidGhlbkZpbmFsbHkiLCJjYXRjaEZpbmFsbHkiLCJDcmVhdGVUaGVuRmluYWxseSIsImNyZWF0ZVRoZW5GaW5hbGx5IiwiQ3JlYXRlQ2F0Y2hGaW5hbGx5IiwiY3JlYXRlQ2F0Y2hGaW5hbGx5Iiwic2hpbUZsYXQiLCJGbGF0dGVuSW50b0FycmF5Iiwic291cmNlTGVuIiwidGFyZ2V0SW5kZXgiLCJzb3VyY2VJbmRleCIsInNob3VsZEZsYXR0ZW4iLCJkZXB0aE51bSIsInNoaW1GbGF0TWFwIiwiZmxhdE1hcCIsIm1hcHBlckZ1bmN0aW9uIiwiZXhpc3RzIiwiZWxlbWVudExlbiIsImRQIiwic2V0UHJvdG8iLCJzaGltU3ltYm9sRGVzY3JpcHRpb24iLCJpc01pc3NpbmciLCJpc0Jyb2tlbiIsInNoaW1HbG9iYWxTeW1ib2wiLCJvcmlnU3ltIiwiZW1wdHlTdHJpbmdzIiwiU3ltTmV3IiwiYm91bmRHZXR0ZXIiLCJ3cmFwcGVkR2V0dGVyIiwic3ltYm9sRGVzY3JpcHRpb24iLCJzaGltR2xvYmFsIiwiZGVzY3JpcHRpb25Qb2x5ZmlsbCIsImZyb21FbnRyaWVzIiwiVGhyb3dDb21wbGV0aW9uIiwibGVnYWN5QXNzaWduIiwic2hpbU1hdGNoQWxsIiwibWF0Y2hBbGwiLCJmbGFnc0JvdW5kIiwic2hpbUZsYWdzIiwiaGlkZGVuIiwidGhpc0luZGV4IiwiU3ltYm9sSXRlcmF0b3IiLCJnZXRIaWRkZW5LZXlNYW5hZ2VyIiwibWFrZUtleSIsInNoaW1BbGxTZXR0bGVkIiwiYWxsU2V0dGxlZCIsInRlc3RBbGxTZXR0bGVkIiwiZ2V0SW50cmluc2ljIiwiaXRlbVByb21pc2UiLCJzdGF0dXMiLCJ3aW5kb3dOYW1lcyIsImdldFdpbmRvd05hbWVzIiwiU1RPUllCT09LX1JFQUNUX0NMQVNTRVMiLCJjbGVhckRlY29yYXRvcnMiLCJfY2xpZW50IiwiX3JlbmRlciIsIl9zdGFydCIsImNsaWVudEFwaSIsImNvbmZpZ0FwaSIsIl9jbGllbnRBcGkiLCJfdXRpbHMiLCJ0b0lkIiwiQ2xpZW50QXBpIiwiQ29uZmlnQXBpIiwiU3RvcnlTdG9yZSIsIl9pc1BsYWluT2JqZWN0IiwiX2NsaWVudExvZ2dlciIsIl9tZXJnZVdpdGgiLCJfaXNFcXVhbCIsIl9nZXQiLCJvYmpWYWx1ZSIsInNyY1ZhbHVlIiwiZGVjb3JhdGVkIiwibWV0YVN1YnNjcmlwdGlvbiIsIndpdGhTdWJzY3JpcHRpb25UcmFja2luZyIsImhhc0NoYW5uZWwiLCJzdG9yeVN0b3JlIiwiX3JlZiRkZWNvcmF0ZVN0b3J5IiwiZGVjb3JhdGVTdG9yeSIsImFkZG9uIiwiZ2V0U2VwYXJhdG9ycyIsImhpZXJhcmNoeVJvb3RTZXBhcmF0b3IiLCJoaWVyYXJjaHlTZXBhcmF0b3IiLCJfZ2xvYmFsUGFyYW1ldGVycyIsIl9nbG9iYWxEZWNvcmF0b3JzIiwiZGlzcG9zZSIsIl9zdG9yeVN0b3JlIiwicmVtb3ZlU3RvcnlLaW5kIiwiaW5jcmVtZW50UmV2aXNpb24iLCJsb2NhbERlY29yYXRvcnMiLCJsb2NhbFBhcmFtZXRlcnMiLCJoYXNBZGRlZCIsImFwaSIsInN0b3J5TmFtZSIsIl90aGlzJGdldFNlcGFyYXRvcnMiLCJhbGxQYXJhbSIsImV4aXN0aW5nVmFsdWUiLCJhZGRTdG9yeSIsImFwcGx5RGVjb3JhdG9ycyIsIl9kZWNvcmF0ZVN0b3J5IiwiZ2V0RGVjb3JhdG9ycyIsImdldFN0b3J5S2luZHMiLCJnZXRTdG9yeUZpbGVOYW1lIiwic3RvcmllcyIsImdldFN0b3JpZXMiLCJyZW5kZXIiLCJnZXRTdG9yeVdpdGhDb250ZXh0IiwiYXJndW1lbnRzTGVuZ3RoIiwibWFwZm4iLCJtZW1vIiwiaXNSaWdodCIsIm5hdGl2ZUFzc2lnbiIsIkIiLCJjaHIiLCJfdHlwZXMiLCJUeXBlcyIsImlzU3VwcG9ydGVkVHlwZSIsIkFkZG9uU3RvcmUiLCJsb2FkZXJzIiwic2V0Q2hhbm5lbCIsImdldEVsZW1lbnRzIiwiYWRkUGFuZWwiLCJQQU5FTCIsInJlZ2lzdGVyQ2FsbGJhY2siLCJsb2FkQWRkb25zIiwiZ2V0QWRkb25zU3RvcmUiLCJ0eXBlVmFsIiwiX3V0aWxEZXByZWNhdGUiLCJwYXJhbWV0ZXJOYW1lIiwiX3JlZiRza2lwSWZOb1BhcmFtZXRlIiwic2tpcElmTm9QYXJhbWV0ZXJzT3JPcHRpb25zIiwiX3JlZiRhbGxvd0RlcHJlY2F0ZWRVIiwiYWxsb3dEZXByZWNhdGVkVXNhZ2UiLCJnZXRTdG9yeSIsImRpc2FibGUiLCJpbm5lckFyZ3MiLCJtb2NrQ2hhbm5lbCIsIl9jaGFubmVscyIsIlRpbWVvdXQiLCJjbGVhckZuIiwiX2lkIiwiX2NsZWFyRm4iLCJjbGVhckludGVydmFsIiwidW5yZWYiLCJlbnJvbGwiLCJtc2VjcyIsIl9pZGxlVGltZW91dElkIiwiX2lkbGVUaW1lb3V0IiwidW5lbnJvbGwiLCJfdW5yZWZBY3RpdmUiLCJhY3RpdmUiLCJvblRpbWVvdXQiLCJfb25UaW1lb3V0IiwicmVnaXN0ZXJJbW1lZGlhdGUiLCJuZXh0SGFuZGxlIiwidGFza3NCeUhhbmRsZSIsImN1cnJlbnRseVJ1bm5pbmdBVGFzayIsImRvYyIsImF0dGFjaFRvIiwiaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24iLCJydW5JZlByZXNlbnQiLCJjYW5Vc2VQb3N0TWVzc2FnZSIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbiIsImluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24iLCJzY3JpcHQiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uIiwiaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24iLCJtZXNzYWdlUHJlZml4Iiwib25HbG9iYWxNZXNzYWdlIiwiYXR0YWNoRXZlbnQiLCJwYXJzZUtpbmQiLCJnZXRNYXRjaCIsInN0cmluZ2lmeVF1ZXJ5IiwicXVlcnlGcm9tTG9jYXRpb24iLCJxdWVyeUZyb21TdHJpbmciLCJwYXJzZVBhdGgiLCJrbm93bk5vblZpZXdNb2Rlc1JlZ2V4IiwiX21lbW9pemVyaWZpYyIsInNwbGl0UGF0aFJlZ2V4Iiwic2FuaXRpemVTYWZlIiwic2FuaXRpemVkIiwidmlld01vZGUiLCJzdG9yeUlkIiwiYWRkUXVlcnlQcmVmaXgiLCJzdGFydHNXaXRoVGFyZ2V0IiwiY3VycmVudElzVGFyZ2V0IiwibWF0Y2hUYXJnZXQiLCJyb290U2VwYXJhdG9yIiwiZ3JvdXBTZXBhcmF0b3IiLCJfa2luZCRzcGxpdDIiLCJyZW1haW5kZXIiLCJjYWxsUmVnRXhwRXhlYyIsImFycmF5UHVzaCIsIlNVUFBPUlRTX1kiLCJTUExJVCIsIm5hdGl2ZVNwbGl0IiwiaW50ZXJuYWxTcGxpdCIsImxpbSIsInVuaWNvZGVNYXRjaGluZyIsInZhbGlkYXRlQXJndW1lbnRzIiwiQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMiLCJuYXRpdmVTdGFydHNXaXRoIiwidXRpbHMiLCJhcnJheVByZWZpeEdlbmVyYXRvcnMiLCJicmFja2V0cyIsImNvbW1hIiwiaW5kaWNlcyIsInB1c2hUb0FycmF5IiwidmFsdWVPckFycmF5IiwiYWxsb3dEb3RzIiwiY2hhcnNldFNlbnRpbmVsIiwiZGVsaW1pdGVyIiwiZW5jb2RlciIsImVuY29kZVZhbHVlc09ubHkiLCJmb3JtYXR0ZXIiLCJzZXJpYWxpemVEYXRlIiwic2tpcE51bGxzIiwic3RyaWN0TnVsbEhhbmRsaW5nIiwiZ2VuZXJhdGVBcnJheVByZWZpeCIsIm9iaktleXMiLCJub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zIiwiYXJyYXlGb3JtYXQiLCJqb2luZWQiLCJhcnJheUxpbWl0IiwiaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIiwicGFyYW1ldGVyTGltaXQiLCJwYXJzZUFycmF5cyIsIm51bWJlclN0ciIsInBhcnNlS2V5cyIsInBhcnNlUXVlcnlTdHJpbmdLZXlzIiwiZ2l2ZW5LZXkiLCJsZWFmIiwiY2xlYW5Sb290IiwicGFyc2VPYmplY3QiLCJub3JtYWxpemVQYXJzZU9wdGlvbnMiLCJ0ZW1wT2JqIiwicGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyIsImNsZWFuU3RyIiwic2tpcEluZGV4IiwiYnJhY2tldEVxdWFsc1BvcyIsInBhcnNlVmFsdWVzIiwiYmFzZU1lcmdlIiwibWVyZ2VXaXRoIiwiY3JlYXRlQXNzaWduZXIiLCJzcmNJbmRleCIsImJhc2VGb3IiLCJiYXNlTWVyZ2VEZWVwIiwiTEFSR0VfQVJSQVlfU0laRSIsInBhaXJzIiwiaXNNYXNrZWQiLCJyZUlzSG9zdEN0b3IiLCJmdW5jUHJvdG8iLCJyZUlzTmF0aXZlIiwibmF0aXZlT2JqZWN0VG9TdHJpbmciLCJpc093biIsInVubWFza2VkIiwiY29yZUpzRGF0YSIsIm1hc2tTcmNLZXkiLCJIYXNoIiwiaGFzaENsZWFyIiwiaGFzaERlbGV0ZSIsImhhc2hHZXQiLCJoYXNoSGFzIiwiaGFzaFNldCIsIkhBU0hfVU5ERUZJTkVEIiwiY3JlYXRlQmFzZUZvciIsImZyb21SaWdodCIsIml0ZXJhdGVlIiwia2V5c0Z1bmMiLCJjbG9uZUJ1ZmZlciIsImNsb25lVHlwZWRBcnJheSIsImNvcHlBcnJheSIsImluaXRDbG9uZU9iamVjdCIsImlzQXJyYXlMaWtlT2JqZWN0IiwiaXNQbGFpbk9iamVjdCIsInRvUGxhaW5PYmplY3QiLCJtZXJnZUZ1bmMiLCJpc0NvbW1vbiIsImlzVHlwZWQiLCJhbGxvY1Vuc2FmZSIsImlzRGVlcCIsImNsb25lQXJyYXlCdWZmZXIiLCJ0eXBlZEFycmF5IiwiYnl0ZU9mZnNldCIsImFycmF5QnVmZmVyIiwiYnl0ZUxlbmd0aCIsImJhc2VDcmVhdGUiLCJvYmplY3RDcmVhdGUiLCJhcmdzVGFnIiwib2JqZWN0VGFnIiwib2JqZWN0Q3RvclN0cmluZyIsInR5cGVkQXJyYXlUYWdzIiwiZnJlZVByb2Nlc3MiLCJjb3B5T2JqZWN0IiwiYXNzaWduVmFsdWUiLCJpc05ldyIsIm5hdGl2ZUtleXNJbiIsImlzUHJvdG8iLCJiYXNlUmVzdCIsImlzSXRlcmF0ZWVDYWxsIiwiYXNzaWduZXIiLCJvdmVyUmVzdCIsInNldFRvU3RyaW5nIiwibmF0aXZlTWF4Iiwib3RoZXJBcmdzIiwiYmFzZVNldFRvU3RyaW5nIiwic2hvcnRPdXQiLCJjb25zdGFudCIsIkhPVF9DT1VOVCIsIkhPVF9TUEFOIiwibmF0aXZlTm93IiwibGFzdENhbGxlZCIsInN0YW1wIiwiYmFzZUlzRXF1YWwiLCJiYXNlSXNFcXVhbERlZXAiLCJlcXVhbEJ5VGFnIiwiZXF1YWxPYmplY3RzIiwiZ2V0VGFnIiwiYXJyYXlUYWciLCJvYmpJc0FyciIsIm90aElzQXJyIiwib2JqVGFnIiwib3RoVGFnIiwib2JqSXNPYmoiLCJvdGhJc09iaiIsImlzU2FtZVRhZyIsIm9iaklzV3JhcHBlZCIsIm90aElzV3JhcHBlZCIsIm9ialVud3JhcHBlZCIsIm90aFVud3JhcHBlZCIsInNldENhY2hlQWRkIiwic2V0Q2FjaGVIYXMiLCJtYXBUb0FycmF5Iiwic2V0VG9BcnJheSIsImJvb2xUYWciLCJkYXRlVGFnIiwiZXJyb3JUYWciLCJtYXBUYWciLCJudW1iZXJUYWciLCJyZWdleHBUYWciLCJzZXRUYWciLCJzdHJpbmdUYWciLCJhcnJheUJ1ZmZlclRhZyIsImRhdGFWaWV3VGFnIiwic3ltYm9sUHJvdG8iLCJzeW1ib2xWYWx1ZU9mIiwiZ2V0QWxsS2V5cyIsIm9ialByb3BzIiwib2JqTGVuZ3RoIiwic2tpcEN0b3IiLCJvYmpDdG9yIiwib3RoQ3RvciIsImJhc2VHZXRBbGxLZXlzIiwic3ltYm9sc0Z1bmMiLCJhcnJheUZpbHRlciIsInN0dWJBcnJheSIsIm5hdGl2ZUdldFN5bWJvbHMiLCJyZXNJbmRleCIsImJhc2VLZXlzIiwiZGF0YVZpZXdDdG9yU3RyaW5nIiwibWFwQ3RvclN0cmluZyIsInByb21pc2VDdG9yU3RyaW5nIiwic2V0Q3RvclN0cmluZyIsIndlYWtNYXBDdG9yU3RyaW5nIiwiY3RvclN0cmluZyIsImNhc3RQYXRoIiwiaXNLZXkiLCJzdHJpbmdUb1BhdGgiLCJyZUlzRGVlcFByb3AiLCJyZUlzUGxhaW5Qcm9wIiwibWVtb2l6ZUNhcHBlZCIsInJlUHJvcE5hbWUiLCJyZUVzY2FwZUNoYXIiLCJzdWJTdHJpbmciLCJtZW1vaXplIiwiTUFYX01FTU9JWkVfU0laRSIsIkZVTkNfRVJST1JfVEVYVCIsIm1lbW9pemVkIiwiQ2FjaGUiLCJiYXNlVG9TdHJpbmciLCJhcnJheU1hcCIsIklORklOSVRZIiwiX2V2ZW50ZW1pdHRlciIsIl9kZWJvdW5jZSIsIl90eXBlb2YiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsInNvdXJjZVN5bWJvbEtleXMiLCJfZ2V0UHJvdG90eXBlT2YiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiX3NldFByb3RvdHlwZU9mIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0SWQiLCJnZXRJZEZyb21MZWdhY3lRdWVyeSIsInNlbGVjdGVkS2luZCIsInNlbGVjdGVkU3RvcnkiLCJfRXZlbnRFbWl0dGVyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfY2hhbm5lbCIsImdldElkT25QYXRoIiwic2V0UGF0aCIsInBhdGhuYW1lIiwiaGlzdG9yeSIsInJlcGxhY2VTdGF0ZSIsImZyb21JZCIsImdldERlY29yYXRlZCIsInNldFNlbGVjdGlvbiIsIl9zZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJzdG9yeSIsImtpbmREYXRhIiwiX2xlZ2FjeWRhdGEiLCJwdXNoVG9NYW5hZ2VyIiwiX3JldmlzaW9uIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzZXRTZXBhcmF0b3JzIiwic2VwYXJhdG9ycyIsIl9yZWY1IiwiX3JlZjYiLCJ0b0V4dHJhY3RlZCIsIl9yZWY3IiwiX3JlZjgiLCJfcmVmNyRwYXJhbWV0ZXJzIiwiaWRlbnRpZmljYXRpb24iLCJnZXRPcmlnaW5hbCIsInRvQ2hpbGQiLCJhZGRMZWdhY3lTdG9yeSIsImdldFJldmlzaW9uIiwiX3JlZjkiLCJfcmVmOSRwYXJhbWV0ZXJzIiwiaW5mbzEiLCJpbmZvMiIsInN0b3JpZXNLaW5kIiwiZ2V0U3RvcnlBbmRQYXJhbWV0ZXJzIiwic3RvcnlJbmZvIiwiaGFzU3RvcnlLaW5kIiwiX3JlZjEwIiwiX3JlZjExIiwiaGFzU3RvcnkiLCJkdW1wU3RvcnlCb29rIiwiX3RoaXM0IiwiX3RoaXM1IiwibmF0aXZlU29ydCIsIkZBSUxTX09OX1VOREVGSU5FRCIsIkZBSUxTX09OX05VTEwiLCJjb21wYXJlZm4iLCJuYXRpdmVHZXRQcm90b3R5cGVPZiIsIkV2ZW50cyIsIkVFIiwiZW1pdHRlciIsImV2dCIsIl9ldmVudHMiLCJfZXZlbnRzQ291bnQiLCJjbGVhckV2ZW50IiwicHJlZml4ZWQiLCJuYXRpdmVNaW4iLCJkZWJvdW5jZSIsIndhaXQiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJpbnZva2VGdW5jIiwic2hvdWxkSW52b2tlIiwidGltZVNpbmNlTGFzdENhbGwiLCJ0aW1lckV4cGlyZWQiLCJ0cmFpbGluZ0VkZ2UiLCJyZW1haW5pbmdXYWl0IiwidGltZVdhaXRpbmciLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwibGVhZGluZ0VkZ2UiLCJjYW5jZWwiLCJmbHVzaCIsIk5BTiIsInJlVHJpbSIsInJlSXNCYWRIZXgiLCJyZUlzQmluYXJ5IiwicmVJc09jdGFsIiwiZnJlZVBhcnNlSW50IiwiX3JlbmRlck1haW4iLCJyZWxvYWQiLCJfcmVuZGVyRXJyb3IiLCJfY2xlYXJEZWNvcmF0b3JzIiwicHJldmlvdXNLaW5kIiwicHJldmlvdXNTdG9yeSIsInByZXZpb3VzUmV2aXNpb24iLCJyZW5kZXJNYWluIiwiZm9yY2VSZW5kZXIiLCJyZXZpc2lvbiIsInNlbGVjdGlvbiIsIlNUT1JZX1VOQ0hBTkdFRCIsInNob3dOb3ByZXZpZXciLCJNQUlOIiwiTk9QUkVWSUVXIiwic2Nyb2xsVG9wIiwicmVuZGVyVUkiLCJpc0Jyb3dzZXIiLCJleCIsInNob3dFeGNlcHRpb24iLCJkZXByZWNhdGVkVG9JZCIsImlucHV0U3RvcnlJZCIsIm9ua2V5ZG93biIsImZvY3VzSW5JbnB1dCIsImdldEF0dHJpYnV0ZSIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5Iiwic2hpZnRLZXkiLCJrZXlDb2RlIiwiX19TVE9SWUJPT0tfQ0xJRU5UX0FQSV9fIiwiX19TVE9SWUJPT0tfQURET05TX0NIQU5ORUxfXyIsIl9jaGFubmVsUG9zdG1lc3NhZ2UiLCJfY2xpZW50QXBpMiIsInNob3dNYWluIiwic2hvd0Vycm9yRGlzcGxheSIsInNob3dFcnJvciIsInBhZ2UiLCJjcmVhdGVDaGFubmVsIiwiUG9zdG1zZ1RyYW5zcG9ydCIsIl90ZWxlanNvbiIsImNvbm5lY3RlZCIsImdldFdpbmRvdyIsImlmcmFtZVdpbmRvdyIsIm1heERlcHRoIiwicmF3RXZlbnQiLCJpc0pTT04iLCJpbnRlcm5hbFN0cmluZ1RyaW0iLCJOYXRpdmVOdW1iZXIiLCJCUk9LRU5fQ0xBU1NPRiIsIk5BVElWRV9UUklNIiwidGhpcmQiLCJtYXhDb2RlIiwiZGlnaXRzIiwiTnVtYmVyV3JhcHBlciIsIndoaXRlc3BhY2UiLCJsdHJpbSIsInJ0cmltIiwidG9nZ2xlIiwibWFjcm90YXNrIiwiTXV0YXRpb25PYnNlcnZlciIsIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiLCJxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IiLCJxdWV1ZU1pY3JvdGFzayIsImNyZWF0ZVRleHROb2RlIiwib2JzZXJ2ZSIsImNoYXJhY3RlckRhdGEiLCJyZXZpdmVyIiwiX2lzUmVnZXgiLCJfaXNGdW5jdGlvbiIsIl9pc1N5bWJvbCIsIl9pc29iamVjdCIsInJlbW92ZUNvZGVDb21tZW50cyIsImluUXVvdGVDaGFyIiwiaW5CbG9ja0NvbW1lbnQiLCJpbkxpbmVDb21tZW50IiwiaW5SZWdleExpdGVyYWwiLCJuZXdDb2RlIiwiY2xlYW5Db2RlIiwiZGF0ZUZvcm1hdCIsIm9iamVjdHMiLCJhbGxvd1JlZ0V4cCIsInN0cmluZ2lmaWVkIiwiYWxsb3dTeW1ib2wiLCJhbGxvd0RhdGUiLCJhbGxvd1VuZGVmaW5lZCIsImZvdW5kIiwiYWxsb3dDbGFzcyIsInJldml2ZSIsIkZuIiwiX3ZhbHVlJG1hdGNoIiwiX3ZhbHVlJG1hdGNoMiIsIl9uYW1lIiwiX3ZhbHVlJG1hdGNoMyIsIl92YWx1ZSRtYXRjaDQiLCJfc291cmNlIiwiZGVmYXVsdE9wdGlvbnMiLCJzcGFjZSIsIm1lcmdlZE9wdGlvbnMiLCJhbGVydCIsImNvbmZpcm0iLCJwcm9tcHQiLCJTVE9SWUJPT0tfRU5WIiwibmF0aXZlQXBwbHkiLCJmdW5jdGlvbkFwcGx5IiwiT1BUSU9OQUxfQVJHVU1FTlRTX0xJU1QiLCJ0aGlzQXJndW1lbnQiLCJuYXRpdmVDb25zdHJ1Y3QiLCJORVdfVEFSR0VUX0JVRyIsIkFSR1NfQlVHIiwiVGFyZ2V0IiwiJGFyZ3MiLCJFUlJPUl9JTlNURUFEX09GX0ZBTFNFIiwib2JqZWN0R2V0UHJvdG90eXBlT2YiLCJvYmplY3RJc0V4dGVuc2libGUiLCJvYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyIsImV4aXN0aW5nRGVzY3JpcHRvciIsIm93bkRlc2NyaXB0b3IiLCJvYmplY3RTZXRQcm90b3R5cGVPZiIsIlJlZmxlY3RNZXRhZGF0YU1vZHVsZSIsInRvTWV0YWRhdGFLZXkiLCJvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwiZGVmaW5lTWV0YWRhdGEiLCJJbnRlcm5hbFdlYWtNYXAiLCJ3ZWFrIiwiZW5mb3JjZUl0ZXJuYWxTdGF0ZSIsIklTX0lFMTEiLCIkV2Vha01hcCIsIldlYWtNYXBQcm90b3R5cGUiLCJuYXRpdmVEZWxldGUiLCJuYXRpdmVIYXMiLCJuYXRpdmVHZXQiLCJuYXRpdmVTZXQiLCJmcm96ZW4iLCJjcmVhdGVBcnJheU1ldGhvZCIsIiRoYXMiLCJhcnJheUZpbmQiLCJhcnJheUZpbmRJbmRleCIsInVuY2F1Z2h0RnJvemVuU3RvcmUiLCJVbmNhdWdodEZyb3plblN0b3JlIiwiZmluZFVuY2F1Z2h0RnJvemVuIiwiZGVsZXRlTWV0YWRhdGEiLCJvcmRpbmFyeUhhc093bk1ldGFkYXRhIiwib3JkaW5hcnlHZXRPd25NZXRhZGF0YSIsIm9yZGluYXJ5R2V0TWV0YWRhdGEiLCJnZXRNZXRhZGF0YSIsIm9yZGluYXJ5T3duTWV0YWRhdGFLZXlzIiwib3JkaW5hcnlNZXRhZGF0YUtleXMiLCJvS2V5cyIsInBLZXlzIiwiZ2V0TWV0YWRhdGFLZXlzIiwiZ2V0T3duTWV0YWRhdGFLZXlzIiwib3JkaW5hcnlIYXNNZXRhZGF0YSIsImhhc01ldGFkYXRhIiwiaGFzT3duTWV0YWRhdGEiLCJwZXJmb3JtYW5jZSIsInBlcmZvcm1hbmNlTWVhc3VyZSIsImNoZWNrRHVwbGljYXRlIiwiX19zeW1ib2xfXyIsIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsInpvbmVTcGVjIiwiX3Byb3BlcnRpZXMiLCJfem9uZURlbGVnYXRlIiwiWm9uZURlbGVnYXRlIiwicGF0Y2hlcyIsIl9jdXJyZW50Wm9uZUZyYW1lIiwiX2N1cnJlbnRUYXNrIiwiX19sb2FkX3BhdGNoIiwicGVyZk5hbWUiLCJfYXBpIiwiZ2V0Wm9uZVdpdGgiLCJfY2FsbGJhY2siLCJpbnRlcmNlcHQiLCJOT19aT05FIiwibm90U2NoZWR1bGVkIiwiZXZlbnRUYXNrIiwicmVFbnRyeUd1YXJkIiwicnVubmluZyIsIl90cmFuc2l0aW9uVG8iLCJzY2hlZHVsZWQiLCJydW5Db3VudCIsInByZXZpb3VzVGFzayIsImlzUGVyaW9kaWMiLCJjYW5jZWxGbiIsInVua25vd24iLCJfdXBkYXRlVGFza0NvdW50Iiwic2NoZWR1bGVUYXNrIiwibmV3Wm9uZSIsInNjaGVkdWxpbmciLCJ6b25lRGVsZWdhdGVzIiwiX3pvbmVEZWxlZ2F0ZXMiLCJjdXN0b21TY2hlZHVsZSIsIlpvbmVUYXNrIiwic2NoZWR1bGVNYWNyb1Rhc2siLCJjdXN0b21DYW5jZWwiLCJjYW5jZWxpbmciLCJERUxFR0FURV9aUyIsIm9uU2NoZWR1bGVUYXNrIiwib25DYW5jZWxUYXNrIiwicGFyZW50RGVsZWdhdGUiLCJfdGFza0NvdW50cyIsIl9wYXJlbnREZWxlZ2F0ZSIsIl9mb3JrWlMiLCJvbkZvcmsiLCJfZm9ya0RsZ3QiLCJfZm9ya0N1cnJab25lIiwiX2ludGVyY2VwdFpTIiwib25JbnRlcmNlcHQiLCJfaW50ZXJjZXB0RGxndCIsIl9pbnRlcmNlcHRDdXJyWm9uZSIsIl9pbnZva2VaUyIsIl9pbnZva2VEbGd0IiwiX2ludm9rZUN1cnJab25lIiwiX2hhbmRsZUVycm9yWlMiLCJfaGFuZGxlRXJyb3JEbGd0IiwiX2hhbmRsZUVycm9yQ3VyclpvbmUiLCJfc2NoZWR1bGVUYXNrWlMiLCJfc2NoZWR1bGVUYXNrRGxndCIsIl9zY2hlZHVsZVRhc2tDdXJyWm9uZSIsIl9pbnZva2VUYXNrWlMiLCJfaW52b2tlVGFza0RsZ3QiLCJfaW52b2tlVGFza0N1cnJab25lIiwiX2NhbmNlbFRhc2taUyIsIl9jYW5jZWxUYXNrRGxndCIsIl9jYW5jZWxUYXNrQ3VyclpvbmUiLCJfaGFzVGFza1pTIiwiX2hhc1Rhc2tEbGd0IiwiX2hhc1Rhc2tEbGd0T3duZXIiLCJfaGFzVGFza0N1cnJab25lIiwiem9uZVNwZWNIYXNUYXNrIiwicGFyZW50SGFzVGFzayIsInRhcmdldFpvbmUiLCJyZXR1cm5UYXNrIiwic2NoZWR1bGVGbiIsImlzRW1wdHkiLCJjb3VudHMiLCJfc3RhdGUiLCJ1c2VHIiwiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsImRyYWluTWljcm9UYXNrUXVldWUiLCJjYW5jZWxTY2hlZHVsZVJlcXVlc3QiLCJ0b1N0YXRlIiwiZnJvbVN0YXRlMSIsImZyb21TdGF0ZTIiLCJoYW5kbGVJZCIsInN5bWJvbFNldFRpbWVvdXQiLCJzeW1ib2xQcm9taXNlIiwic3ltYm9sVGhlbiIsIl9taWNyb1Rhc2tRdWV1ZSIsIl9pc0RyYWluaW5nTWljcm90YXNrUXVldWUiLCJuYXRpdmVUaGVuIiwib25VbmhhbmRsZWRFcnJvciIsIm1pY3JvdGFza0RyYWluRG9uZSIsImN1cnJlbnRab25lRnJhbWUiLCJzaG93VW5jYXVnaHRFcnJvciIsInBhdGNoRXZlbnRUYXJnZXQiLCJwYXRjaE9uUHJvcGVydGllcyIsInBhdGNoTWV0aG9kIiwiYmluZEFyZ3VtZW50cyIsInBhdGNoVGhlbiIsInBhdGNoTWFjcm9UYXNrIiwic2V0TmF0aXZlUHJvbWlzZSIsIk5hdGl2ZVByb21pc2UiLCJwYXRjaEV2ZW50UHJvdG90eXBlIiwiaXNJRU9yRWRnZSIsImdldEdsb2JhbE9iamVjdHMiLCJPYmplY3REZWZpbmVQcm9wZXJ0eSIsIk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIkFycmF5U2xpY2UiLCJwYXRjaENsYXNzIiwid3JhcFdpdGhDdXJyZW50Wm9uZSIsImZpbHRlclByb3BlcnRpZXMiLCJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCJfcmVkZWZpbmVQcm9wZXJ0eSIsInBhdGNoQ2FsbGJhY2tzIiwiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsImNyZWF0aW9uVHJhY2UiLCJ1bmNhdWdodFByb21pc2VFcnJvciIsImhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbiIsIlVOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTCIsImZvcndhcmRSZXNvbHV0aW9uIiwiZm9yd2FyZFJlamVjdGlvbiIsIlpvbmVBd2FyZVByb21pc2UiLCJzeW1ib2xTdGF0ZSIsInN5bWJvbFZhbHVlIiwic3ltYm9sRmluYWxseSIsInN5bWJvbFBhcmVudFByb21pc2VWYWx1ZSIsInN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSIsIlVOUkVTT0xWRUQiLCJSRVNPTFZFRCIsIlJFSkVDVEVEIiwiUkVKRUNURURfTk9fQ0FUQ0giLCJtYWtlUmVzb2x2ZXIiLCJyZXNvbHZlUHJvbWlzZSIsIndhc0NhbGxlZCIsIndyYXBwZWRGdW5jdGlvbiIsIlRZUEVfRVJST1IiLCJDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MIiwib25jZVdyYXBwZXIiLCJjbGVhclJlamVjdGVkTm9DYXRjaCIsImN1cnJlbnRUYXNrIiwic2NoZWR1bGVSZXNvbHZlT3JSZWplY3QiLCJyZWFkYWJsZU9iamVjdFRvU3RyaW5nIiwiZXJyb3JfMSIsIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCJjaGFpblByb21pc2UiLCJwcm9taXNlU3RhdGUiLCJwYXJlbnRQcm9taXNlVmFsdWUiLCJpc0ZpbmFsbHlQcm9taXNlIiwib25SZXNvbHZlIiwib25SZWplY3QiLCJ2YWx1ZXNfMSIsInZhbHVlc18xXzEiLCJ1bnJlc29sdmVkQ291bnQiLCJ2YWx1ZUluZGV4IiwicmVzb2x2ZWRWYWx1ZXMiLCJjdXJWYWx1ZUluZGV4IiwidmFsdWVzXzIiLCJ2YWx1ZXNfMl8xIiwiZmluYWxseSIsIlpPTkVfQVdBUkVfUFJPTUlTRSIsIk5ld05hdGl2ZVByb21pc2UiLCJzeW1ib2xUaGVuUGF0Y2hlZCIsIm9yaWdpbmFsVGhlbiIsImZldGNoXzEiLCJ6b25laWZ5IiwicmVzdWx0UHJvbWlzZSIsIk9iamVjdEdldFByb3RvdHlwZU9mIiwiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsIlJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIiLCJaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVIiLCJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCJUUlVFX1NUUiIsIkZBTFNFX1NUUiIsIlpPTkVfU1lNQk9MX1BSRUZJWCIsInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwiem9uZVN5bWJvbCIsImlzV2luZG93RXhpc3RzIiwiaW50ZXJuYWxXaW5kb3ciLCJSRU1PVkVfQVRUUklCVVRFIiwiTlVMTF9PTl9QUk9QX1ZBTFVFIiwiaXNQcm9wZXJ0eVdyaXRhYmxlIiwicHJvcGVydHlEZXNjIiwiaXNXZWJXb3JrZXIiLCJpc05vZGUiLCJpc01peCIsInpvbmVTeW1ib2xFdmVudE5hbWVzIiwid3JhcEZuIiwiZXZlbnROYW1lU3ltYm9sIiwiZXJyb3JFdmVudCIsImZpbGVuYW1lIiwibGluZW5vIiwiY29sbm8iLCJwcmV2ZW50RGVmYXVsdCIsInBhdGNoUHJvcGVydHkiLCJvblByb3BQYXRjaGVkU3ltYm9sIiwib3JpZ2luYWxEZXNjR2V0Iiwib3JpZ2luYWxEZXNjU2V0Iiwib25Qcm9wZXJ0aWVzIiwib3JpZ2luYWxJbnN0YW5jZUtleSIsIk9yaWdpbmFsQ2xhc3MiLCJzaG91bGRDb3B5U3ltYm9sUHJvcGVydGllcyIsInBhdGNoRm4iLCJkZWxlZ2F0ZU5hbWUiLCJwYXRjaERlbGVnYXRlXzEiLCJjb3B5U3ltYm9sUHJvcGVydGllcyIsImRlc3QiLCJmdW5jTmFtZSIsIm1ldGFDcmVhdG9yIiwic2V0TmF0aXZlIiwiY2JJZHgiLCJwYXRjaGVkIiwiaXNEZXRlY3RlZElFT3JFZGdlIiwiaWVPckVkZ2UiLCJpc0lFIiwidWEiLCJvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmciLCJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCJQUk9NSVNFX1NZTUJPTCIsIkVSUk9SX1NZTUJPTCIsIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCJvcmlnaW5hbERlbGVnYXRlIiwibmF0aXZlUHJvbWlzZSIsIm5hdGl2ZUVycm9yIiwib3JpZ2luYWxPYmplY3RUb1N0cmluZyIsInBhc3NpdmVTdXBwb3J0ZWQiLCJPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEiLCJ6b25lU3ltYm9sRXZlbnROYW1lcyQxIiwiZ2xvYmFsU291cmNlcyIsIkVWRU5UX05BTUVfU1lNQk9MX1JFR1giLCJJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MIiwiYXBpcyIsInBhdGNoT3B0aW9ucyIsIkFERF9FVkVOVF9MSVNURU5FUiIsIlJFTU9WRV9FVkVOVF9MSVNURU5FUiIsInJtIiwiTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSIiwiUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVIiLCJybUFsbCIsInpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyIiwiQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSIsIlBSRVBFTkRfRVZFTlRfTElTVEVORVIiLCJQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSIsImRlbGVnYXRlXzEiLCJnbG9iYWxab25lQXdhcmVDYWxsYmFjayIsInRhc2tzIiwiY29weVRhc2tzIiwiZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIiwicGF0Y2hFdmVudFRhcmdldE1ldGhvZHMiLCJ1c2VHbG9iYWxDYWxsYmFjayIsInZhbGlkYXRlSGFuZGxlciIsInZoIiwiY2hrRHVwIiwicmV0dXJuVGFyZ2V0IiwicnQiLCJuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciIsImV2ZW50TmFtZVRvU3RyaW5nIiwidGFza0RhdGEiLCJuYXRpdmVBZGRFdmVudExpc3RlbmVyIiwibmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm5hdGl2ZUxpc3RlbmVycyIsIm5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyIsImNoZWNrSXNQYXNzaXZlIiwiaXNFeGlzdGluZyIsInN5bWJvbEV2ZW50TmFtZXMiLCJzeW1ib2xFdmVudE5hbWUiLCJleGlzdGluZ1Rhc2tzIiwiYWxsUmVtb3ZlZCIsImNvbXBhcmUiLCJ0eXBlT2ZEZWxlZ2F0ZSIsImJsYWNrTGlzdGVkRXZlbnRzIiwibWFrZUFkZExpc3RlbmVyIiwibmF0aXZlTGlzdGVuZXIiLCJjdXN0b21TY2hlZHVsZUZuIiwiY3VzdG9tQ2FuY2VsRm4iLCJpc0hhbmRsZUV2ZW50IiwiZmFsc2VFdmVudE5hbWUiLCJ0cnVlRXZlbnROYW1lIiwic3ltYm9sQ2FwdHVyZSIsImNvbnN0cnVjdG9yTmFtZSIsInRhcmdldFNvdXJjZSIsImV4aXN0aW5nVGFzayIsImZpbmRFdmVudFRhc2tzIiwic3ltYm9sQ2FwdHVyZUV2ZW50TmFtZSIsImNhcHR1cmVUYXNrcyIsInJlbW92ZVRhc2tzIiwiZXZ0TmFtZSIsImZvdW5kVGFza3MiLCJFdmVudCIsInRhcmdldE5hbWUiLCJjYWxsYmFja3MiLCJuYXRpdmVEZWxlZ2F0ZSIsInpvbmVTeW1ib2wkMSIsIl9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJfY3JlYXRlIiwidW5jb25maWd1cmFibGVzS2V5Iiwib3JpZ2luYWxDb25maWd1cmFibGVGbGFnIiwiX3RyeURlZmluZVByb3BlcnR5IiwicmV3cml0ZURlc2NyaXB0b3IiLCJpc1VuY29uZmlndXJhYmxlIiwiZGVzY0pzb24iLCJ3aW5kb3dFdmVudE5hbWVzIiwibWVkaWFFbGVtZW50RXZlbnROYW1lcyIsImZyYW1lRXZlbnROYW1lcyIsImZyYW1lU2V0RXZlbnROYW1lcyIsIm1hcnF1ZWVFdmVudE5hbWVzIiwiWE1MSHR0cFJlcXVlc3RFdmVudE5hbWVzIiwiSURCSW5kZXhFdmVudE5hbWVzIiwid2Vic29ja2V0RXZlbnROYW1lcyIsIndvcmtlckV2ZW50TmFtZXMiLCJpZ25vcmVQcm9wZXJ0aWVzIiwidGlwIiwiaXAiLCJ0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzIiwicGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMiLCJwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaCIsInN1cHBvcnRzV2ViU29ja2V0IiwiV2ViU29ja2V0IiwiaWdub3JlRXJyb3JQcm9wZXJ0aWVzIiwiRG9jdW1lbnQiLCJIVE1MRWxlbWVudCIsIkhUTUxNZWRpYUVsZW1lbnQiLCJIVE1MRnJhbWVTZXRFbGVtZW50IiwiSFRNTEJvZHlFbGVtZW50IiwiSFRNTEZyYW1lRWxlbWVudCIsIkhUTUxJRnJhbWVFbGVtZW50IiwiSFRNTE1hcnF1ZWVFbGVtZW50XzEiLCJXb3JrZXJfMSIsIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQiLCJJREJJbmRleCIsIklEQlJlcXVlc3QiLCJJREJPcGVuREJSZXF1ZXN0IiwiSURCRGF0YWJhc2UiLCJJREJUcmFuc2FjdGlvbiIsIklEQkN1cnNvciIsImV2ZW50VGFyZ2V0TGVnYWN5UGF0Y2giLCJXVEZfSVNTVUVfNTU1IiwiTk9fRVZFTlRfVEFSR0VUIiwiaXNXdGYiLCJXVEZfSVNTVUVfNTU1X0FSUkFZIiwiaXNEaXNhYmxlSUVDaGVjayIsImlzRW5hYmxlQ3Jvc3NDb250ZXh0Q2hlY2siLCJCUk9XU0VSX1RPT0xTIiwidGFyZ2V0cyIsImFwaVR5cGVzIiwidGVzdFN0cmluZyIsInByb3BlcnR5RGVzY3JpcHRvckxlZ2FjeVBhdGNoIiwiY2FuUGF0Y2hWaWFQcm9wZXJ0eURlc2NyaXB0b3IiLCJvbmNsaWNrIiwiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCJ4aHJEZXNjIiwicmVxIiwiU1lNQk9MX0ZBS0VfT05SRUFEWVNUQVRFQ0hBTkdFXzEiLCJkZXRlY3RGdW5jIiwicGF0Y2hWaWFDYXB0dXJpbmdBbGxUaGVFdmVudHMiLCJ1bmJvdW5kS2V5Iiwib25wcm9wZXJ0eSIsImVsdCIsIldTIiwiRXZlbnRUYXJnZXQiLCJwcm94eVNvY2tldCIsInByb3h5U29ja2V0UHJvdG8iLCJzb2NrZXQiLCJvbm1lc3NhZ2VEZXNjIiwicHJvcGVydHlTeW1ib2wiLCJnbG9iYWxXZWJTb2NrZXQiLCJTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyIsIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwicmVnaXN0ZXJFbGVtZW50UGF0Y2giLCJ0YXNrU3ltYm9sIiwicGF0Y2hUaW1lciIsInNldE5hbWUiLCJjYW5jZWxOYW1lIiwibmFtZVN1ZmZpeCIsImNsZWFyTmF0aXZlIiwidGFza3NCeUhhbmRsZUlkIiwidGltZXIiLCJjbGVhclRhc2siLCJkZWxheSIsImV2ZW50VGFyZ2V0UGF0Y2giLCJFVkVOVF9UQVJHRVQiLCJsZWdhY3lQYXRjaCIsImJsb2NraW5nTWV0aG9kcyIsInBhdGNoRXZlbnQkMSIsInByb3BlcnR5UGF0Y2giLCJwYXRjaEN1c3RvbUVsZW1lbnRzIiwiY3VzdG9tRWxlbWVudHMiLCJwYXRjaFhIUiIsIm9yaUFkZExpc3RlbmVyIiwib3JpUmVtb3ZlTGlzdGVuZXIiLCJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0XzEiLCJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlIiwiUkVBRFlfU1RBVEVfQ0hBTkdFIiwiU0NIRURVTEVEIiwib3Blbk5hdGl2ZSIsIlhIUl9TWU5DIiwiWEhSX1VSTCIsImZldGNoVGFza0Fib3J0aW5nIiwiZmV0Y2hUYXNrU2NoZWR1bGluZyIsInNlbmROYXRpdmUiLCJhYm9ydGVkIiwicGxhY2Vob2xkZXJDYWxsYmFjayIsIlhIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEIiwiYWJvcnROYXRpdmUiLCJmaW5kUGVuZGluZ1Rhc2siLCJYSFJfVEFTSyIsIlhIUl9TQ0hFRFVMRUQiLCJYSFJfTElTVEVORVIiLCJuZXdMaXN0ZW5lciIsInJlYWR5U3RhdGUiLCJET05FIiwibG9hZFRhc2tzIiwib3JpSW52b2tlXzEiLCJnZW9sb2NhdGlvbiIsInBhdGNoUHJvdG90eXBlIiwiZm5OYW1lcyIsImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsIl9oZWxwZXJzIiwicmVuZGVyTmdBcHAiLCJzdG9yeU1ldGFkYXRhIiwiX0FjdGlvbkRpc3BsYXkiLCJfQWN0aW9uT3B0aW9ucyIsIl9BY3Rpb25zTWFwIiwiX0RlY29yYXRvckZ1bmN0aW9uIiwiX0hhbmRsZXJGdW5jdGlvbiIsIl9kZWNvcmF0ZUFjdGlvbiIsIl93aXRoQWN0aW9ucyIsIl9ub2RlSWQiLCJfY2xvY2tzZXEiLCJybmciLCJieXRlc1RvVXVpZCIsIl9sYXN0TVNlY3MiLCJfbGFzdE5TZWNzIiwiY2xvY2tzZXEiLCJzZWVkQnl0ZXMiLCJuc2VjcyIsImR0IiwidGwiLCJ0bWgiLCJnZXRSYW5kb21WYWx1ZXMiLCJjcnlwdG8iLCJtc0NyeXB0byIsInJuZHM4Iiwid2hhdHdnUk5HIiwicm5kcyIsIm1hdGhSTkciLCJieXRlVG9IZXgiLCJidGgiLCJkZWNvcmF0ZUFjdGlvbiIsImFjdGlvbkNhbGxiYWNrIiwiX2FyZ3MiLCJjYWxsQWN0aW9uIiwiZGVjb3JhdGVkQWN0aW9ucyIsInJhd0FjdGlvbnMiLCJDT1JFX0VSUk9SX1RFWFQiLCJQTEFDRUhPTERFUiIsIkNMT05FX0RFRVBfRkxBRyIsIkNMT05FX0ZMQVRfRkxBRyIsIkNMT05FX1NZTUJPTFNfRkxBRyIsIldSQVBfQklORF9GTEFHIiwiV1JBUF9CSU5EX0tFWV9GTEFHIiwiV1JBUF9DVVJSWV9CT1VORF9GTEFHIiwiV1JBUF9DVVJSWV9GTEFHIiwiV1JBUF9DVVJSWV9SSUdIVF9GTEFHIiwiV1JBUF9QQVJUSUFMX0ZMQUciLCJXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyIsIldSQVBfQVJZX0ZMQUciLCJXUkFQX1JFQVJHX0ZMQUciLCJXUkFQX0ZMSVBfRkxBRyIsIkRFRkFVTFRfVFJVTkNfTEVOR1RIIiwiREVGQVVMVF9UUlVOQ19PTUlTU0lPTiIsIkxBWllfRklMVEVSX0ZMQUciLCJMQVpZX01BUF9GTEFHIiwiTUFYX0lOVEVHRVIiLCJNQVhfQVJSQVlfTEVOR1RIIiwiTUFYX0FSUkFZX0lOREVYIiwiSEFMRl9NQVhfQVJSQVlfTEVOR1RIIiwid3JhcEZsYWdzIiwiZG9tRXhjVGFnIiwid2Vha01hcFRhZyIsIndlYWtTZXRUYWciLCJmbG9hdDMyVGFnIiwiZmxvYXQ2NFRhZyIsImludDhUYWciLCJpbnQxNlRhZyIsImludDMyVGFnIiwidWludDhUYWciLCJ1aW50OENsYW1wZWRUYWciLCJ1aW50MTZUYWciLCJ1aW50MzJUYWciLCJyZUVtcHR5U3RyaW5nTGVhZGluZyIsInJlRW1wdHlTdHJpbmdNaWRkbGUiLCJyZUVtcHR5U3RyaW5nVHJhaWxpbmciLCJyZUVzY2FwZWRIdG1sIiwicmVVbmVzY2FwZWRIdG1sIiwicmVIYXNFc2NhcGVkSHRtbCIsInJlSGFzVW5lc2NhcGVkSHRtbCIsInJlRXNjYXBlIiwicmVFdmFsdWF0ZSIsInJlSW50ZXJwb2xhdGUiLCJyZVJlZ0V4cENoYXIiLCJyZUhhc1JlZ0V4cENoYXIiLCJyZVRyaW1TdGFydCIsInJlVHJpbUVuZCIsInJlV3JhcENvbW1lbnQiLCJyZVdyYXBEZXRhaWxzIiwicmVTcGxpdERldGFpbHMiLCJyZUFzY2lpV29yZCIsInJlRXNUZW1wbGF0ZSIsInJlRmxhZ3MiLCJyZUxhdGluIiwicmVOb01hdGNoIiwicmVVbmVzY2FwZWRTdHJpbmciLCJyc0NvbWJvUmFuZ2UiLCJyc0NvbWJvTWFya3NSYW5nZSIsInJzQnJlYWtSYW5nZSIsInJzTWF0aE9wUmFuZ2UiLCJyc0FzdHJhbCIsInJzQnJlYWsiLCJyc0NvbWJvIiwicnNEaWdpdHMiLCJyc0RpbmdiYXQiLCJyc0xvd2VyIiwicnNNaXNjIiwicnNGaXR6IiwicnNOb25Bc3RyYWwiLCJyc1JlZ2lvbmFsIiwicnNTdXJyUGFpciIsInJzVXBwZXIiLCJyc01pc2NMb3dlciIsInJzTWlzY1VwcGVyIiwicmVPcHRNb2QiLCJyc1NlcSIsInJzRW1vamkiLCJyc1N5bWJvbCIsInJlQXBvcyIsInJlQ29tYm9NYXJrIiwicmVVbmljb2RlIiwicmVVbmljb2RlV29yZCIsInJlSGFzVW5pY29kZSIsInJlSGFzVW5pY29kZVdvcmQiLCJjb250ZXh0UHJvcHMiLCJ0ZW1wbGF0ZUNvdW50ZXIiLCJjbG9uZWFibGVUYWdzIiwic3RyaW5nRXNjYXBlcyIsImZyZWVQYXJzZUZsb2F0IiwibW9kdWxlRXhwb3J0cyIsIm5vZGVJc0FycmF5QnVmZmVyIiwiaXNBcnJheUJ1ZmZlciIsIm5vZGVJc0RhdGUiLCJub2RlSXNNYXAiLCJub2RlSXNSZWdFeHAiLCJub2RlSXNTZXQiLCJhcnJheUFnZ3JlZ2F0b3IiLCJhY2N1bXVsYXRvciIsImFycmF5RWFjaCIsImFycmF5RWFjaFJpZ2h0IiwiYXJyYXlFdmVyeSIsImFycmF5SW5jbHVkZXMiLCJiYXNlSW5kZXhPZiIsImFycmF5SW5jbHVkZXNXaXRoIiwiYXJyYXlSZWR1Y2UiLCJpbml0QWNjdW0iLCJhcnJheVJlZHVjZVJpZ2h0IiwiYXNjaWlTaXplIiwiYmFzZVByb3BlcnR5IiwiYmFzZUZpbmRLZXkiLCJlYWNoRnVuYyIsImJhc2VGaW5kSW5kZXgiLCJzdHJpY3RJbmRleE9mIiwiYmFzZUlzTmFOIiwiYmFzZUluZGV4T2ZXaXRoIiwiYmFzZU1lYW4iLCJiYXNlU3VtIiwiYmFzZVByb3BlcnR5T2YiLCJiYXNlUmVkdWNlIiwiYmFzZVZhbHVlcyIsImNoYXJzU3RhcnRJbmRleCIsInN0clN5bWJvbHMiLCJjaHJTeW1ib2xzIiwiY2hhcnNFbmRJbmRleCIsImRlYnVyckxldHRlciIsImVzY2FwZUh0bWxDaGFyIiwiZXNjYXBlU3RyaW5nQ2hhciIsImhhc1VuaWNvZGUiLCJyZXBsYWNlSG9sZGVycyIsInNldFRvUGFpcnMiLCJzdHJpbmdTaXplIiwidW5pY29kZVNpemUiLCJzdHJpbmdUb0FycmF5IiwidW5pY29kZVRvQXJyYXkiLCJhc2NpaVRvQXJyYXkiLCJ1bmVzY2FwZUh0bWxDaGFyIiwicnVuSW5Db250ZXh0IiwicGljayIsImFycmF5UHJvdG8iLCJpZENvdW50ZXIiLCJvbGREYXNoIiwic3ByZWFkYWJsZVN5bWJvbCIsInN5bUl0ZXJhdG9yIiwiY3R4Q2xlYXJUaW1lb3V0IiwiY3R4Tm93IiwiY3R4U2V0VGltZW91dCIsIm5hdGl2ZUNlaWwiLCJuYXRpdmVGbG9vciIsIm5hdGl2ZUlzQnVmZmVyIiwibmF0aXZlSXNGaW5pdGUiLCJuYXRpdmVKb2luIiwibmF0aXZlUGFyc2VJbnQiLCJuYXRpdmVSYW5kb20iLCJuYXRpdmVSZXZlcnNlIiwibWV0YU1hcCIsInJlYWxOYW1lcyIsImxvZGFzaCIsIkxhenlXcmFwcGVyIiwiTG9kYXNoV3JhcHBlciIsIndyYXBwZXJDbG9uZSIsImJhc2VMb2Rhc2giLCJjaGFpbkFsbCIsIl9fd3JhcHBlZF9fIiwiX19hY3Rpb25zX18iLCJfX2NoYWluX18iLCJfX2luZGV4X18iLCJfX3ZhbHVlc19fIiwiX19kaXJfXyIsIl9fZmlsdGVyZWRfXyIsIl9faXRlcmF0ZWVzX18iLCJfX3Rha2VDb3VudF9fIiwiX192aWV3c19fIiwiYXJyYXlTYW1wbGUiLCJiYXNlUmFuZG9tIiwiYXJyYXlTYW1wbGVTaXplIiwic2h1ZmZsZVNlbGYiLCJiYXNlQ2xhbXAiLCJhcnJheVNodWZmbGUiLCJiYXNlQWdncmVnYXRvciIsImJhc2VFYWNoIiwiYmFzZUFzc2lnbiIsImJhc2VBdCIsInVwcGVyIiwiYmFzZUNsb25lIiwiaXNGbGF0IiwiaXNGdWxsIiwiaW5pdENsb25lQXJyYXkiLCJpc0Z1bmMiLCJjb3B5U3ltYm9sc0luIiwiZ2V0U3ltYm9sc0luIiwiYmFzZUFzc2lnbkluIiwiY29weVN5bWJvbHMiLCJpbml0Q2xvbmVCeVRhZyIsImNsb25lRGF0YVZpZXciLCJkYXRhVmlldyIsImNsb25lUmVnRXhwIiwiY2xvbmVTeW1ib2wiLCJzdWJWYWx1ZSIsImdldEFsbEtleXNJbiIsImJhc2VDb25mb3Jtc1RvIiwiYmFzZURlbGF5IiwiYmFzZURpZmZlcmVuY2UiLCJ2YWx1ZXNMZW5ndGgiLCJvdXRlciIsImNvbXB1dGVkIiwidmFsdWVzSW5kZXgiLCJ0ZW1wbGF0ZVNldHRpbmdzIiwiY3JlYXRlQmFzZUVhY2giLCJiYXNlRm9yT3duIiwiYmFzZUVhY2hSaWdodCIsImJhc2VGb3JPd25SaWdodCIsImJhc2VFdmVyeSIsImJhc2VFeHRyZW11bSIsImJhc2VGaWx0ZXIiLCJiYXNlRmxhdHRlbiIsImlzU3RyaWN0IiwiaXNGbGF0dGVuYWJsZSIsImJhc2VGb3JSaWdodCIsImJhc2VGdW5jdGlvbnMiLCJiYXNlR3QiLCJiYXNlSGFzIiwiYmFzZUhhc0luIiwiYmFzZUludGVyc2VjdGlvbiIsImFycmF5cyIsImNhY2hlcyIsImJhc2VJbnZva2UiLCJiYXNlSXNNYXRjaCIsIm1hdGNoRGF0YSIsIm5vQ3VzdG9taXplciIsImJhc2VJdGVyYXRlZSIsImJhc2VNYXRjaGVzUHJvcGVydHkiLCJiYXNlTWF0Y2hlcyIsImJhc2VMdCIsImJhc2VNYXAiLCJnZXRNYXRjaERhdGEiLCJtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSIsImlzU3RyaWN0Q29tcGFyYWJsZSIsImhhc0luIiwiYmFzZU50aCIsImJhc2VPcmRlckJ5IiwiaXRlcmF0ZWVzIiwib3JkZXJzIiwiZ2V0SXRlcmF0ZWUiLCJiYXNlU29ydEJ5IiwiY29tcGFyZXIiLCJjb21wYXJlTXVsdGlwbGUiLCJvYmpDcml0ZXJpYSIsImNyaXRlcmlhIiwib3RoQ3JpdGVyaWEiLCJvcmRlcnNMZW5ndGgiLCJjb21wYXJlQXNjZW5kaW5nIiwib3JkZXIiLCJiYXNlUGlja0J5IiwiYmFzZVNldCIsImJhc2VQdWxsQWxsIiwiYmFzZVB1bGxBdCIsImluZGV4ZXMiLCJiYXNlVW5zZXQiLCJiYXNlUmVwZWF0IiwiYmFzZVNhbXBsZSIsImJhc2VTYW1wbGVTaXplIiwibmVzdGVkIiwiYmFzZVNldERhdGEiLCJiYXNlU2h1ZmZsZSIsImJhc2VTbGljZSIsImJhc2VTb21lIiwiYmFzZVNvcnRlZEluZGV4IiwicmV0SGlnaGVzdCIsIm1pZCIsImJhc2VTb3J0ZWRJbmRleEJ5IiwidmFsSXNOYU4iLCJ2YWxJc051bGwiLCJ2YWxJc1N5bWJvbCIsInZhbElzVW5kZWZpbmVkIiwib3RoSXNEZWZpbmVkIiwib3RoSXNOdWxsIiwib3RoSXNSZWZsZXhpdmUiLCJvdGhJc1N5bWJvbCIsInNldExvdyIsImJhc2VTb3J0ZWRVbmlxIiwiYmFzZVRvTnVtYmVyIiwiYmFzZVVuaXEiLCJjcmVhdGVTZXQiLCJzZWVuSW5kZXgiLCJiYXNlVXBkYXRlIiwidXBkYXRlciIsImJhc2VXaGlsZSIsImlzRHJvcCIsImJhc2VXcmFwcGVyVmFsdWUiLCJiYXNlWG9yIiwiYmFzZVppcE9iamVjdCIsImFzc2lnbkZ1bmMiLCJ2YWxzTGVuZ3RoIiwiY2FzdEFycmF5TGlrZU9iamVjdCIsImNhc3RGdW5jdGlvbiIsImNhc3RSZXN0IiwiY2FzdFNsaWNlIiwidmFsSXNEZWZpbmVkIiwidmFsSXNSZWZsZXhpdmUiLCJjb21wb3NlQXJncyIsInBhcnRpYWxzIiwiaG9sZGVycyIsImlzQ3VycmllZCIsImFyZ3NJbmRleCIsImhvbGRlcnNMZW5ndGgiLCJsZWZ0SW5kZXgiLCJsZWZ0TGVuZ3RoIiwicmFuZ2VMZW5ndGgiLCJpc1VuY3VycmllZCIsImNvbXBvc2VBcmdzUmlnaHQiLCJob2xkZXJzSW5kZXgiLCJyaWdodEluZGV4IiwicmlnaHRMZW5ndGgiLCJjcmVhdGVBZ2dyZWdhdG9yIiwiY3JlYXRlQ2FzZUZpcnN0IiwiY3JlYXRlQ29tcG91bmRlciIsIndvcmRzIiwiZGVidXJyIiwiY3JlYXRlQ3RvciIsInRoaXNCaW5kaW5nIiwiY3JlYXRlRmluZCIsImZpbmRJbmRleEZ1bmMiLCJjcmVhdGVGbG93IiwiZmxhdFJlc3QiLCJmdW5jcyIsInByZXJlcSIsInRocnUiLCJnZXRGdW5jTmFtZSIsImdldERhdGEiLCJpc0xhemlhYmxlIiwicGxhbnQiLCJjcmVhdGVIeWJyaWQiLCJwYXJ0aWFsc1JpZ2h0IiwiaG9sZGVyc1JpZ2h0IiwiYXJnUG9zIiwiYXJ5IiwiaXNBcnkiLCJpc0JpbmQiLCJpc0JpbmRLZXkiLCJpc0ZsaXAiLCJnZXRIb2xkZXIiLCJob2xkZXJzQ291bnQiLCJjb3VudEhvbGRlcnMiLCJuZXdIb2xkZXJzIiwiY3JlYXRlUmVjdXJyeSIsInJlb3JkZXIiLCJvbGRBcnJheSIsImNyZWF0ZUludmVydGVyIiwidG9JdGVyYXRlZSIsImJhc2VJbnZlcnRlciIsImNyZWF0ZU1hdGhPcGVyYXRpb24iLCJjcmVhdGVPdmVyIiwiYXJyYXlGdW5jIiwiY3JlYXRlUGFkZGluZyIsImNoYXJzTGVuZ3RoIiwiY3JlYXRlUmFuZ2UiLCJ0b0Zpbml0ZSIsImJhc2VSYW5nZSIsImNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24iLCJ3cmFwRnVuYyIsImlzQ3VycnkiLCJuZXdEYXRhIiwic2V0RGF0YSIsInNldFdyYXBUb1N0cmluZyIsImNyZWF0ZVJvdW5kIiwicGFpciIsImNyZWF0ZVRvUGFpcnMiLCJiYXNlVG9QYWlycyIsImNyZWF0ZVdyYXAiLCJtZXJnZURhdGEiLCJzcmNCaXRtYXNrIiwibmV3Qml0bWFzayIsImlzQ29tYm8iLCJjcmVhdGVDdXJyeSIsImNyZWF0ZVBhcnRpYWwiLCJjcmVhdGVCaW5kIiwiY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJjdXN0b21PbWl0Q2xvbmUiLCJvdGhlckZ1bmMiLCJoYXNQYXRoIiwiaGFzRnVuYyIsImlzTWFza2FibGUiLCJpbnNlcnRXcmFwRGV0YWlscyIsInVwZGF0ZVdyYXBEZXRhaWxzIiwiZ2V0V3JhcERldGFpbHMiLCJyYW5kIiwiZGlmZmVyZW5jZSIsImRpZmZlcmVuY2VCeSIsImRpZmZlcmVuY2VXaXRoIiwiZmluZExhc3RJbmRleCIsImludGVyc2VjdGlvbiIsIm1hcHBlZCIsImludGVyc2VjdGlvbkJ5IiwiaW50ZXJzZWN0aW9uV2l0aCIsInB1bGwiLCJwdWxsQWxsIiwicHVsbEF0IiwidW5pb24iLCJ1bmlvbkJ5IiwidW5pb25XaXRoIiwidW56aXAiLCJ1bnppcFdpdGgiLCJ3aXRob3V0IiwieG9yIiwieG9yQnkiLCJ4b3JXaXRoIiwiemlwIiwiemlwV2l0aCIsImludGVyY2VwdG9yIiwid3JhcHBlckF0IiwiY291bnRCeSIsImZvckVhY2hSaWdodCIsImdyb3VwQnkiLCJpbnZva2VNYXAiLCJrZXlCeSIsInBhcnRpdGlvbiIsInNvcnRCeSIsImJpbmRLZXkiLCJvdmVyQXJncyIsImZ1bmNzTGVuZ3RoIiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInJlYXJnIiwiZ3QiLCJndGUiLCJiYXNlSXNBcnJheUJ1ZmZlciIsImJhc2VJc0RhdGUiLCJiYXNlSXNNYXAiLCJiYXNlSXNSZWdFeHAiLCJiYXNlSXNTZXQiLCJsdGUiLCJpdGVyYXRvclRvQXJyYXkiLCJhc3NpZ25JbiIsImFzc2lnbkluV2l0aCIsImFzc2lnbldpdGgiLCJhdCIsInByb3BzSW5kZXgiLCJwcm9wc0xlbmd0aCIsImRlZmF1bHRzRGVlcCIsImludmVydCIsImludmVydEJ5Iiwib21pdCIsImJhc2VQaWNrIiwicGlja0J5IiwidG9QYWlycyIsInRvUGFpcnNJbiIsImNhbWVsQ2FzZSIsImNhcGl0YWxpemUiLCJ1cHBlckZpcnN0Iiwia2ViYWJDYXNlIiwibG93ZXJDYXNlIiwibG93ZXJGaXJzdCIsInNuYWtlQ2FzZSIsInN0YXJ0Q2FzZSIsInVwcGVyQ2FzZSIsImhhc1VuaWNvZGVXb3JkIiwidW5pY29kZVdvcmRzIiwiYXNjaWlXb3JkcyIsImF0dGVtcHQiLCJiaW5kQWxsIiwiZmxvdyIsImZsb3dSaWdodCIsIm1ldGhvZE9mIiwibWl4aW4iLCJvdmVyIiwib3ZlckV2ZXJ5Iiwib3ZlclNvbWUiLCJiYXNlUHJvcGVydHlEZWVwIiwicmFuZ2VSaWdodCIsImF1Z2VuZCIsImFkZGVuZCIsImRpdmlkZW5kIiwiZGl2aXNvciIsIm11bHRpcGxpZXIiLCJtdWx0aXBsaWNhbmQiLCJzdWJ0cmFjdCIsIm1pbnVlbmQiLCJzdWJ0cmFoZW5kIiwiY2FzdEFycmF5IiwiY2h1bmsiLCJjb25kIiwiY29uZm9ybXMiLCJiYXNlQ29uZm9ybXMiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJkcm9wIiwiZHJvcFJpZ2h0IiwiZHJvcFJpZ2h0V2hpbGUiLCJkcm9wV2hpbGUiLCJiYXNlRmlsbCIsImZsYXRNYXBEZWVwIiwiZmxhdE1hcERlcHRoIiwiZmxhdHRlbkRlZXAiLCJmbGF0dGVuRGVwdGgiLCJmbGlwIiwiZnJvbVBhaXJzIiwiZnVuY3Rpb25zIiwiZnVuY3Rpb25zSW4iLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWF0Y2hlc1Byb3BlcnR5IiwibnRoQXJnIiwib21pdEJ5Iiwib3JkZXJCeSIsInByb3BlcnR5T2YiLCJwdWxsQWxsQnkiLCJwdWxsQWxsV2l0aCIsInNhbXBsZVNpemUiLCJzZXRXaXRoIiwic2h1ZmZsZSIsInNvcnRlZFVuaXEiLCJzb3J0ZWRVbmlxQnkiLCJzcHJlYWQiLCJ0YWlsIiwidGFrZSIsInRha2VSaWdodCIsInRha2VSaWdodFdoaWxlIiwidGFrZVdoaWxlIiwidGFwIiwidGhyb3R0bGUiLCJ0b1BhdGgiLCJpc0Fyckxpa2UiLCJ1bmFyeSIsInVuaXEiLCJ1bmlxQnkiLCJ1bmlxV2l0aCIsInVuc2V0IiwidXBkYXRlIiwidXBkYXRlV2l0aCIsInZhbHVlc0luIiwiemlwT2JqZWN0IiwiemlwT2JqZWN0RGVlcCIsImVudHJpZXNJbiIsImV4dGVuZFdpdGgiLCJjbGFtcCIsImNsb25lRGVlcCIsImNsb25lRGVlcFdpdGgiLCJjbG9uZVdpdGgiLCJjb25mb3Jtc1RvIiwiZGVmYXVsdFRvIiwiZmluZEtleSIsImZpbmRMYXN0S2V5IiwiZm9ySW4iLCJmb3JJblJpZ2h0IiwiZm9yT3duIiwiZm9yT3duUmlnaHQiLCJpblJhbmdlIiwiYmFzZUluUmFuZ2UiLCJpc0Jvb2xlYW4iLCJpc0VsZW1lbnQiLCJpc0VxdWFsV2l0aCIsImlzTWF0Y2hXaXRoIiwiaXNOYXRpdmUiLCJpc05pbCIsImlzTnVsbCIsImlzVW5kZWZpbmVkIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0Iiwic3RyaWN0TGFzdEluZGV4T2YiLCJtYXhCeSIsIm1lYW4iLCJtZWFuQnkiLCJtaW5CeSIsInN0dWJPYmplY3QiLCJzdHViU3RyaW5nIiwic3R1YlRydWUiLCJudGgiLCJub0NvbmZsaWN0IiwicGFkIiwic3RyTGVuZ3RoIiwiZmxvYXRpbmciLCJzYW1wbGUiLCJzb3J0ZWRJbmRleCIsInNvcnRlZEluZGV4QnkiLCJzb3J0ZWRJbmRleE9mIiwic29ydGVkTGFzdEluZGV4Iiwic29ydGVkTGFzdEluZGV4QnkiLCJzb3J0ZWRMYXN0SW5kZXhPZiIsInN1bUJ5Iiwic2V0dGluZ3MiLCJpc0VzY2FwaW5nIiwiaXNFdmFsdWF0aW5nIiwiaW1wb3J0c0tleXMiLCJpbXBvcnRzVmFsdWVzIiwicmVEZWxpbWl0ZXJzIiwiZXZhbHVhdGUiLCJzb3VyY2VVUkwiLCJlc2NhcGVWYWx1ZSIsImludGVycG9sYXRlVmFsdWUiLCJlc1RlbXBsYXRlVmFsdWUiLCJldmFsdWF0ZVZhbHVlIiwidG9Mb3dlciIsInRvU2FmZUludGVnZXIiLCJ0b1VwcGVyIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJuZXdFbmQiLCJ1bmlxdWVJZCIsImVhY2giLCJlYWNoUmlnaHQiLCJpc0ZpbHRlciIsInRha2VOYW1lIiwiZHJvcE5hbWUiLCJjaGVja0l0ZXJhdGVlIiwiaXNUYWtlciIsImxvZGFzaEZ1bmMiLCJyZXRVbndyYXBwZWQiLCJpc0xhenkiLCJ1c2VMYXp5IiwiaXNIeWJyaWQiLCJpc1Vud3JhcHBlZCIsIm9ubHlMYXp5IiwiY2hhaW5OYW1lIiwibGF6eUNsb25lIiwibGF6eVJldmVyc2UiLCJsYXp5VmFsdWUiLCJnZXRWaWV3IiwiaXRlckxlbmd0aCIsInRha2VDb3VudCIsIml0ZXJJbmRleCIsIndyYXBwZXJDaGFpbiIsImNvbW1pdCIsIndyYXBwZXJDb21taXQiLCJ3cmFwcGVyTmV4dCIsIndyYXBwZXJQbGFudCIsIndyYXBwZXJSZXZlcnNlIiwid3JhcHBlclZhbHVlIiwid3JhcHBlclRvSXRlcmF0b3IiLCJuYXZpZ2F0ZSIsInZhbHVlT3JDYWxsIiwiZ2VuZXJhdGVVcmwiLCJsaW5rc0xpc3RlbmVyIiwiX2VsZW1lbnQkZGF0YXNldCIsImRhdGFzZXQiLCJzYktpbmQiLCJzYlN0b3J5IiwiaGFzTGlzdGVuZXIiLCJXZWxjb21lQ29tcG9uZW50Iiwic2hvd0FwcCIsIkJ1dHRvbkNvbXBvbmVudCIsIm9uQ2xpY2siLCJzdHlsZXNJbkRvbSIsImlzT2xkSUUiLCJhdG9iIiwiZ2V0RWxlbWVudCIsInN0eWxlVGFyZ2V0IiwiY29udGVudERvY3VtZW50Iiwic2luZ2xldG9uIiwic2luZ2xldG9uQ291bnRlciIsInN0eWxlc0luc2VydGVkQXRUb3AiLCJmaXhVcmxzIiwiYWRkU3R5bGVzVG9Eb20iLCJkb21TdHlsZSIsImFkZFN0eWxlIiwibGlzdFRvU3R5bGVzIiwibmV3U3R5bGVzIiwiY3NzIiwibWVkaWEiLCJzb3VyY2VNYXAiLCJpbnNlcnRTdHlsZUVsZW1lbnQiLCJpbnNlcnRJbnRvIiwibGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AiLCJpbnNlcnRBdCIsInJlbW92ZVN0eWxlRWxlbWVudCIsImNyZWF0ZVN0eWxlRWxlbWVudCIsIm5vbmNlIiwiZ2V0Tm9uY2UiLCJhZGRBdHRycyIsInN0eWxlSW5kZXgiLCJhcHBseVRvU2luZ2xldG9uVGFnIiwiY3JlYXRlT2JqZWN0VVJMIiwicmV2b2tlT2JqZWN0VVJMIiwiQmxvYiIsImJ0b2EiLCJjcmVhdGVMaW5rRWxlbWVudCIsInJlbCIsInVwZGF0ZUxpbmsiLCJhdXRvRml4VXJscyIsImNvbnZlcnRUb0Fic29sdXRlVXJscyIsImJsb2IiLCJvbGRTcmMiLCJocmVmIiwiYXBwbHlUb1RhZyIsInN0eWxlU2hlZXQiLCJ1cGRhdGVTdHlsZSIsIkRFQlVHIiwibmV3TGlzdCIsIm1heVJlbW92ZSIsInRleHRTdG9yZSIsInJlcGxhY2VUZXh0IiwiY3NzTm9kZSIsInByb3RvY29sIiwiY3VycmVudERpciIsImZ1bGxNYXRjaCIsIm9yaWdVcmwiLCJuZXdVcmwiLCJ1bnF1b3RlZE9yaWdVcmwiLCIkMSIsIlBsYXRmb3JtTG9jYXRpb24iLCJMb2NhdGlvblN0cmF0ZWd5IiwiQVBQX0JBU0VfSFJFRiIsIkxvY2F0aW9uIiwicGxhdGZvcm1TdHJhdGVneSIsInBsYXRmb3JtTG9jYXRpb24iLCJfc3ViamVjdCIsIl91cmxDaGFuZ2VMaXN0ZW5lcnMiLCJfcGxhdGZvcm1TdHJhdGVneSIsImJyb3dzZXJCYXNlSHJlZiIsImdldEJhc2VIcmVmIiwiX3BsYXRmb3JtTG9jYXRpb24iLCJfYmFzZUhyZWYiLCJMb2NhdGlvbl8xIiwic3RyaXBUcmFpbGluZ1NsYXNoIiwiX3N0cmlwSW5kZXhIdG1sIiwib25Qb3BTdGF0ZSIsImV2IiwiaW5jbHVkZUhhc2giLCJnZXRTdGF0ZSIsImlzQ3VycmVudFBhdGhFcXVhbFRvIiwibm9ybWFsaXplUXVlcnlQYXJhbXMiLCJfc3RyaXBCYXNlSHJlZiIsImJhc2VIcmVmIiwicHJlcGFyZUV4dGVybmFsVXJsIiwiZ28iLCJwdXNoU3RhdGUiLCJfbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzIiwiZm9yd2FyZCIsImJhY2siLCJvblVybENoYW5nZSIsIm9uTmV4dCIsIm9uVGhyb3ciLCJvblJldHVybiIsImpvaW5XaXRoU2xhc2giLCJzbGFzaGVzIiwicGF0aEVuZElkeCIsImRyb3BwZWRTbGFzaElkeCIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5Iiwib25IYXNoQ2hhbmdlIiwiaGFzaCIsImludGVybmFsIiwicXVlcnlQYXJhbXMiLCJQYXRoTG9jYXRpb25TdHJhdGVneSIsImdldEJhc2VIcmVmRnJvbURPTSIsImV4dGVybmFsVXJsIiwibG9jYWxlRW4iLCJwbHVyYWwiLCJMT0NBTEVfREFUQSIsIk51bWJlckZvcm1hdFN0eWxlIiwiRm9ybVN0eWxlIiwiVHJhbnNsYXRpb25XaWR0aCIsIkZvcm1hdFdpZHRoIiwiTnVtYmVyU3ltYm9sIiwiV2Vla0RheSIsIkNVUlJFTkNJRVNfRU4iLCJnZXRMb2NhbGVEYXRlRm9ybWF0Iiwid2lkdGgiLCJnZXRMYXN0RGVmaW5lZFZhbHVlIiwiZmluZExvY2FsZURhdGEiLCJnZXRMb2NhbGVUaW1lRm9ybWF0IiwiZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQiLCJnZXRMb2NhbGVOdW1iZXJTeW1ib2wiLCJDdXJyZW5jeURlY2ltYWwiLCJEZWNpbWFsIiwiQ3VycmVuY3lHcm91cCIsIkdyb3VwIiwiZ2V0TG9jYWxlTnVtYmVyRm9ybWF0IiwiY2hlY2tGdWxsRGF0YSIsImV4dHJhY3RUaW1lIiwiaG91cnMiLCJtaW51dGVzIiwicGFyZW50TG9jYWxlIiwiZ2V0Q3VycmVuY3lTeW1ib2wiLCJjdXJyZW5jeSIsImdldExvY2FsZUN1cnJlbmNpZXMiLCJzeW1ib2xOYXJyb3ciLCJERUZBVUxUX05CX09GX0NVUlJFTkNZX0RJR0lUUyIsIlpvbmVXaWR0aCIsIkRhdGVUeXBlIiwiVHJhbnNsYXRpb25UeXBlIiwiSVNPODYwMV9EQVRFX1JFR0VYIiwiTkFNRURfRk9STUFUUyIsIkRBVEVfRk9STUFUU19TUExJVCIsImZvcm1hdERhdGUiLCJ0aW1lem9uZSIsInRvRGF0ZSIsInBhcnNlZE5iIiwiaXNvU3RyaW5nVG9EYXRlIiwiZ2V0TmFtZWRGb3JtYXQiLCJsb2NhbGVJZCIsImdldExvY2FsZUlkIiwiZm9ybWF0VmFsdWUiLCJTaG9ydCIsIk1lZGl1bSIsIkxvbmciLCJGdWxsIiwic2hvcnRUaW1lIiwic2hvcnREYXRlIiwiZm9ybWF0RGF0ZVRpbWUiLCJtZWRpdW1UaW1lIiwibWVkaXVtRGF0ZSIsImxvbmdUaW1lIiwibG9uZ0RhdGUiLCJmdWxsVGltZSIsImZ1bGxEYXRlIiwiZGF0ZVRpbWV6b25lT2Zmc2V0IiwidGltZXpvbmVUb09mZnNldCIsImNvbnZlcnRUaW1lem9uZVRvTG9jYWwiLCJyZXZlcnNlVmFsdWUiLCJhZGREYXRlTWludXRlcyIsInNldE1pbnV0ZXMiLCJkYXRlRm9ybWF0dGVyIiwiZ2V0RGF0ZUZvcm1hdHRlciIsIkRBVEVfRk9STUFUUyIsImRhdGVTdHJHZXR0ZXIiLCJFcmFzIiwiQWJicmV2aWF0ZWQiLCJXaWRlIiwiTmFycm93IiwiZGF0ZUdldHRlciIsIkZ1bGxZZWFyIiwiTW9udGgiLCJNb250aHMiLCJTdGFuZGFsb25lIiwid2Vla0dldHRlciIsIkRheXMiLCJEYXlQZXJpb2RzIiwiRm9ybWF0IiwiSG91cnMiLCJNaW51dGVzIiwiU2Vjb25kcyIsIkZyYWN0aW9uYWxTZWNvbmRzIiwidGltZVpvbmVHZXR0ZXIiLCJFeHRlbmRlZCIsIlNob3J0R01UIiwib3B0X3ZhbHVlcyIsInBhZE51bWJlciIsIm1pbnVzU2lnbiIsIm5lZ1dyYXAiLCJuZWciLCJnZXREYXRlUGFydCIsImdldE1pbGxpc2Vjb25kcyIsIkRheSIsImZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzIiwibWlsbGlzZWNvbmRzIiwibG9jYWxlTWludXMiLCJNaW51c1NpZ24iLCJleHRlbmRlZCIsImdldERhdGVUcmFuc2xhdGlvbiIsImdldExvY2FsZU1vbnRoTmFtZXMiLCJmb3JtU3R5bGUiLCJnZXRMb2NhbGVEYXlOYW1lcyIsImRheXMiLCJjdXJyZW50SG91cnNfMSIsImN1cnJlbnRNaW51dGVzXzEiLCJydWxlcyIsImdldExvY2FsZUV4dHJhRGF5UGVyaW9kUnVsZXMiLCJkYXlQZXJpb2RzXzEiLCJnZXRMb2NhbGVFeHRyYURheVBlcmlvZHMiLCJkYXlQZXJpb2RzIiwiaG91cnNGcm9tIiwibWludXRlc0Zyb20iLCJob3Vyc1RvIiwibWludXRlc1RvIiwiZ2V0TG9jYWxlRGF5UGVyaW9kcyIsImFtUG0iLCJnZXRMb2NhbGVFcmFOYW1lcyIsIkpBTlVBUlkiLCJUSFVSU0RBWSIsIm1vbnRoQmFzZWQiLCJuYkRheXNCZWZvcmUxc3REYXlPZk1vbnRoIiwidG9kYXkiLCJmaXJzdFRodXJzIiwiZ2V0Rmlyc3RUaHVyc2RheU9mWWVhciIsImZpcnN0RGF5T2ZZZWFyIiwiZ2V0VGh1cnNkYXlUaGlzV2VlayIsImRhdGV0aW1lIiwiZmFsbGJhY2siLCJyZXF1ZXN0ZWRUaW1lem9uZU9mZnNldCIsInR6SG91ciIsInR6TWluIiwiZGF0ZVNldHRlciIsInNldFVUQ0Z1bGxZZWFyIiwic2V0RnVsbFllYXIiLCJ0aW1lU2V0dGVyIiwic2V0VVRDSG91cnMiLCJzZXRIb3VycyIsIk5VTUJFUl9GT1JNQVRfUkVHRVhQIiwiTUFYX0RJR0lUUyIsIkRFQ0lNQUxfU0VQIiwiWkVST19DSEFSIiwiUEFUVEVSTl9TRVAiLCJHUk9VUF9TRVAiLCJESUdJVF9DSEFSIiwiQ1VSUkVOQ1lfQ0hBUiIsIlBFUkNFTlRfQ0hBUiIsImZvcm1hdE51bWJlclRvTG9jYWxlU3RyaW5nIiwiZ3JvdXBTeW1ib2wiLCJkZWNpbWFsU3ltYm9sIiwiZGlnaXRzSW5mbyIsImlzUGVyY2VudCIsImZvcm1hdHRlZFRleHQiLCJpc1plcm8iLCJwYXJzZWROdW1iZXIiLCJwYXJzZU51bWJlciIsImludGVnZXJMZW4iLCJ6ZXJvcyIsIm51bVN0ciIsImV4cG9uZW50IiwidG9QZXJjZW50IiwiZnJhY3Rpb25MZW4iLCJtaW5JbnQiLCJtaW5GcmFjdGlvbiIsIm1pbkZyYWMiLCJtYXhGcmFjdGlvbiIsIm1heEZyYWMiLCJtaW5JbnRQYXJ0IiwibWluRnJhY3Rpb25QYXJ0IiwibWF4RnJhY3Rpb25QYXJ0Iiwicm91bmROdW1iZXIiLCJmcmFjdGlvblNpemUiLCJyb3VuZEF0IiwiZHJvcFRyYWlsaW5nWmVyb3MiLCJtaW5MZW4iLCJkZWNpbWFscyIsImxnU2l6ZSIsImdTaXplIiwiRXhwb25lbnRpYWwiLCJuZWdQcmUiLCJuZWdTdWYiLCJwb3NQcmUiLCJwb3NTdWYiLCJmb3JtYXRDdXJyZW5jeSIsImN1cnJlbmN5Q29kZSIsInBhcnNlTnVtYmVyRm9ybWF0IiwiQ3VycmVuY3kiLCJnZXROdW1iZXJPZkN1cnJlbmN5RGlnaXRzIiwicGF0dGVyblBhcnRzIiwicG9zaXRpdmVQYXJ0cyIsImZyYWN0aW9uIiwidHJ1bmtMZW4iLCJERVBSRUNBVEVEX1BMVVJBTF9GTiIsIk5nTG9jYWxpemF0aW9uIiwiZ2V0UGx1cmFsQ2F0ZWdvcnkiLCJuZ0xvY2FsaXphdGlvbiIsIk5nTG9jYWxlTG9jYWxpemF0aW9uIiwiZGVwcmVjYXRlZFBsdXJhbEZuIiwiZ2V0TG9jYWxlUGx1cmFsQ2FzZSIsIlplcm8iLCJPbmUiLCJUd28iLCJGZXciLCJNYW55IiwiU3R5bGluZ0RpZmZlciIsIl9sYXN0U2V0VmFsdWUiLCJfbGFzdFNldFZhbHVlVHlwZSIsIl9sYXN0U2V0VmFsdWVJZGVudGl0eUNoYW5nZSIsInZhbHVlSGFzQ2hhbmdlZCIsImZpbmFsVmFsdWUiLCJ0cmltVmFsdWVzIiwicGFyc2VPdXRVbml0cyIsImFsbG93U3ViS2V5cyIsIm1hcEhhc0NoYW5nZWQiLCJvbGRLZXlzIiwibmV3S2V5cyIsImFycmF5RXF1YWxzQXJyYXkiLCJidWxpZE1hcEZyb21WYWx1ZXMiLCJlcnJvclByZWZpeCIsInNldE1hcFZhbHVlcyIsImFzc2VydFZhbGlkVmFsdWUiLCJpbm5lcktleXMiLCJzZXRJbmRpdmlkdWFsTWFwVmFsdWUiLCJub3JtYWxpemVTdHlsZUtleUFuZFZhbHVlIiwiTmdDbGFzc0ltcGwiLCJOZ0NsYXNzUjJJbXBsIiwiX2l0ZXJhYmxlRGlmZmVycyIsIl9rZXlWYWx1ZURpZmZlcnMiLCJfbmdFbCIsIl9yZW5kZXJlciIsIl9pbml0aWFsQ2xhc3NlcyIsIl9yZW1vdmVDbGFzc2VzIiwiX2FwcGx5Q2xhc3NlcyIsIl9yYXdDbGFzcyIsInNldE5nQ2xhc3MiLCJfaXRlcmFibGVEaWZmZXIiLCJfa2V5VmFsdWVEaWZmZXIiLCJhcHBseUNoYW5nZXMiLCJpdGVyYWJsZUNoYW5nZXMiLCJfYXBwbHlJdGVyYWJsZUNoYW5nZXMiLCJrZXlWYWx1ZUNoYW5nZXMiLCJfYXBwbHlLZXlWYWx1ZUNoYW5nZXMiLCJfdG9nZ2xlQ2xhc3MiLCJyYXdDbGFzc1ZhbCIsImVuYWJsZWQiLCJOZ0NsYXNzSW1wbFByb3ZpZGVyIiwiTmdDbGFzc1IzSW1wbCIsIl92YWx1ZSIsIl9uZ0NsYXNzRGlmZmVyIiwiX2NsYXNzU3RyaW5nRGlmZmVyIiwiY2xhc3NDaGFuZ2VkIiwibmdDbGFzc0NoYW5nZWQiLCJjbGFzc1ZhbHVlIiwiTmdDbGFzcyIsIl9kZWxlZ2F0ZSIsIk5nQ2xhc3NCYXNlIiwiTmdDb21wb25lbnRPdXRsZXQiLCJfY29tcG9uZW50UmVmIiwiX21vZHVsZVJlZiIsIm5nQ29tcG9uZW50T3V0bGV0IiwibmdDb21wb25lbnRPdXRsZXRJbmplY3RvciIsIm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5IiwicGFyZW50TW9kdWxlIiwiY29tcG9uZW50RmFjdG9yeVJlc29sdmVyIiwibmdDb21wb25lbnRPdXRsZXRDb250ZW50IiwiTmdGb3JPZkNvbnRleHQiLCIkaW1wbGljaXQiLCJuZ0Zvck9mIiwiZXZlbiIsIk5nRm9yT2YiLCJfdmlld0NvbnRhaW5lciIsIl90ZW1wbGF0ZSIsIl9kaWZmZXJzIiwiX25nRm9yT2ZEaXJ0eSIsIl9kaWZmZXIiLCJfbmdGb3JPZiIsIm5nRm9yVHJhY2tCeSIsImdldFR5cGVOYW1lIiwiX2FwcGx5Q2hhbmdlcyIsImluc2VydFR1cGxlcyIsImFkanVzdGVkUHJldmlvdXNJbmRleCIsInR1cGxlIiwiUmVjb3JkVmlld1R1cGxlIiwiX3BlclZpZXdDaGFuZ2UiLCJpbGVuIiwibmdUZW1wbGF0ZUNvbnRleHRHdWFyZCIsIk5nSWYiLCJOZ0lmQ29udGV4dCIsIl90aGVuVGVtcGxhdGVSZWYiLCJfZWxzZVRlbXBsYXRlUmVmIiwiX3RoZW5WaWV3UmVmIiwiX2Vsc2VWaWV3UmVmIiwibmdJZiIsIl91cGRhdGVWaWV3IiwiYXNzZXJ0VGVtcGxhdGUiLCJuZ1RlbXBsYXRlR3VhcmRfbmdJZiIsIlN3aXRjaFZpZXciLCJfdGVtcGxhdGVSZWYiLCJfY3JlYXRlZCIsImVuZm9yY2VTdGF0ZSIsImNyZWF0ZWQiLCJOZ1N3aXRjaCIsIl9kZWZhdWx0VXNlZCIsIl9jYXNlQ291bnQiLCJfbGFzdENhc2VDaGVja0luZGV4IiwiX2xhc3RDYXNlc01hdGNoZWQiLCJfbmdTd2l0Y2giLCJfdXBkYXRlRGVmYXVsdENhc2VzIiwiX2FkZENhc2UiLCJfYWRkRGVmYXVsdCIsIl9kZWZhdWx0Vmlld3MiLCJfbWF0Y2hDYXNlIiwidXNlRGVmYXVsdCIsIk5nU3dpdGNoQ2FzZSIsIm5nU3dpdGNoIiwibmdTd2l0Y2hDYXNlIiwiTmdTd2l0Y2hEZWZhdWx0IiwiTmdQbHVyYWwiLCJfbG9jYWxpemF0aW9uIiwiX2Nhc2VWaWV3cyIsIl9zd2l0Y2hWYWx1ZSIsImFkZENhc2UiLCJzd2l0Y2hWaWV3IiwiX2NsZWFyVmlld3MiLCJfYWN0aXZhdGVWaWV3IiwiX2FjdGl2ZVZpZXciLCJOZ1BsdXJhbENhc2UiLCJuZ1BsdXJhbCIsImlzQU51bWJlciIsIk5nU3R5bGVJbXBsIiwiTmdTdHlsZVIySW1wbCIsInNldE5nU3R5bGUiLCJfbmdTdHlsZSIsIl9zZXRTdHlsZSIsIm5hbWVBbmRVbml0IiwiTmdTdHlsZUltcGxQcm92aWRlciIsIk5nU3R5bGVSM0ltcGwiLCJOZ1N0eWxlIiwiTmdTdHlsZUJhc2UiLCJDT01NT05fRElSRUNUSVZFUyIsIk5nVGVtcGxhdGVPdXRsZXQiLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCIsIm5nVGVtcGxhdGVPdXRsZXQiLCJfc2hvdWxkUmVjcmVhdGVWaWV3IiwiX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCIsImN0eENoYW5nZSIsIl9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkIiwicHJldkN0eEtleXMiLCJjdXJyQ3R4S2V5cyIsImN1cnJDdHhLZXlzXzEiLCJjdXJyQ3R4S2V5c18xXzEiLCJpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IiLCJOdW1iZXJGb3JtYXR0ZXIiLCJtaW5pbXVtSW50ZWdlckRpZ2l0cyIsIm1pbmltdW1GcmFjdGlvbkRpZ2l0cyIsIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsImN1cnJlbmN5QXNTeW1ib2wiLCJjdXJyZW5jeURpc3BsYXkiLCJJbnRsIiwiTnVtYmVyRm9ybWF0IiwiREFURV9GT1JNQVRTX1NQTElUJDEiLCJQQVRURVJOX0FMSUFTRVMiLCJkYXRlUGFydEdldHRlckZhY3RvcnkiLCJkaWdpdENvbmRpdGlvbiIsIm5hbWVDb25kaXRpb24iLCJEQVRFX0ZPUk1BVFMkMSIsImRpZ2l0TW9kaWZpZXIiLCJob3VyRXh0cmFjdG9yIiwiaG91cjEyTW9kaWZ5IiwiaG91ckNsb2NrRXh0cmFjdG9yIiwiaW5uZXIiLCJ0aW1lWm9uZUdldHRlciQxIiwiaW50bERhdGVGb3JtYXQiLCJEYXRlVGltZUZvcm1hdCIsImhvdXIxMiIsInRpbWVab25lTmFtZSIsIm1lcmdlZCIsIm9wdCIsInJldCIsIkRBVEVfRk9STUFUVEVSX0NBQ0hFIiwiRGF0ZUZvcm1hdHRlciIsImNhY2hlS2V5IiwiX2Zvcm1hdCIsInBhcnRUb1RpbWUiLCJEZXByZWNhdGVkRGF0ZVBpcGUiLCJEZXByZWNhdGVkRGF0ZVBpcGVfMSIsImlzRGF0ZSQxIiwiX0FMSUFTRVMiLCJmb3JtYXROdW1iZXIkMSIsIkNPTU1PTl9ERVBSRUNBVEVEX0kxOE5fUElQRVMiLCJEZXByZWNhdGVkRGVjaW1hbFBpcGUiLCJEZXByZWNhdGVkRGVjaW1hbFBpcGVfMSIsIkRlcHJlY2F0ZWRQZXJjZW50UGlwZSIsIkRlcHJlY2F0ZWRQZXJjZW50UGlwZV8xIiwiUGVyY2VudCIsIkRlcHJlY2F0ZWRDdXJyZW5jeVBpcGUiLCJEZXByZWNhdGVkQ3VycmVuY3lQaXBlXzEiLCJzeW1ib2xEaXNwbGF5IiwiT2JzZXJ2YWJsZVN0cmF0ZWd5IiwiY3JlYXRlU3Vic2NyaXB0aW9uIiwidXBkYXRlTGF0ZXN0VmFsdWUiLCJfcHJvbWlzZVN0cmF0ZWd5IiwiUHJvbWlzZVN0cmF0ZWd5IiwiX29ic2VydmFibGVTdHJhdGVneSIsIkFzeW5jUGlwZSIsIl9sYXRlc3RWYWx1ZSIsIl9sYXRlc3RSZXR1cm5lZFZhbHVlIiwiX3N1YnNjcmlwdGlvbiIsIl9vYmoiLCJfc3RyYXRlZ3kiLCJBc3luY1BpcGVfMSIsIl9kaXNwb3NlIiwiX3NlbGVjdFN0cmF0ZWd5IiwiX3VwZGF0ZUxhdGVzdFZhbHVlIiwiTG93ZXJDYXNlUGlwZSIsIkxvd2VyQ2FzZVBpcGVfMSIsInVuaWNvZGVXb3JkTWF0Y2giLCJUaXRsZUNhc2VQaXBlIiwiVGl0bGVDYXNlUGlwZV8xIiwidHh0IiwiVXBwZXJDYXNlUGlwZSIsIlVwcGVyQ2FzZVBpcGVfMSIsIkRhdGVQaXBlIiwiRGF0ZVBpcGVfMSIsIl9JTlRFUlBPTEFUSU9OX1JFR0VYUCIsIkkxOG5QbHVyYWxQaXBlIiwiSTE4blBsdXJhbFBpcGVfMSIsInBsdXJhbE1hcCIsIkkxOG5TZWxlY3RQaXBlIiwiSTE4blNlbGVjdFBpcGVfMSIsIkpzb25QaXBlIiwiS2V5VmFsdWVQaXBlIiwiZGlmZmVycyIsImRlZmF1bHRDb21wYXJhdG9yIiwiZGlmZmVyIiwiZGlmZmVyQ2hhbmdlcyIsIm1ha2VLZXlWYWx1ZVBhaXIiLCJrZXlWYWx1ZUEiLCJrZXlWYWx1ZUIiLCJhU3RyaW5nIiwiYlN0cmluZyIsIkRlY2ltYWxQaXBlIiwiRGVjaW1hbFBpcGVfMSIsImZvcm1hdE51bWJlciIsInN0clRvTnVtYmVyIiwiUGVyY2VudFBpcGUiLCJQZXJjZW50UGlwZV8xIiwiZm9ybWF0UGVyY2VudCIsIlBlcmNlbnRTaWduIiwiQ3VycmVuY3lQaXBlIiwiQ3VycmVuY3lQaXBlXzEiLCJDT01NT05fUElQRVMiLCJTbGljZVBpcGUiLCJTbGljZVBpcGVfMSIsIkNvbW1vbk1vZHVsZSIsIsm1MCQyIiwiZ2V0UGx1cmFsQ2FzZSIsIm5MaWtlIiwibkRlY2ltYWwiLCJPdGhlciIsIkRPQ1VNRU5UIiwiRGVwcmVjYXRlZEkxOE5QaXBlc01vZHVsZSIsIlBMQVRGT1JNX0JST1dTRVJfSUQiLCJQTEFURk9STV9TRVJWRVJfSUQiLCJWaWV3cG9ydFNjcm9sbGVyIiwiQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIiLCJzZXRPZmZzZXQiLCJnZXRTY3JvbGxQb3NpdGlvbiIsInN1cHBvcnRTY3JvbGxSZXN0b3JhdGlvbiIsInNjcm9sbFgiLCJzY3JvbGxZIiwic2Nyb2xsVG9Qb3NpdGlvbiIsInNjcm9sbFRvIiwic2Nyb2xsVG9BbmNob3IiLCJDU1MiLCJlbFNlbGVjdGVkQnlJZCIsInNjcm9sbFRvRWxlbWVudCIsImVsU2VsZWN0ZWRCeU5hbWUiLCJzZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24iLCJzY3JvbGxSZXN0b3JhdGlvbiIsImhpc3RvcnlfMSIsInJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJwYWdlWE9mZnNldCIsInRvcCIsInBhZ2VZT2Zmc2V0IiwiX0RPTSIsIk51bGxWaWV3cG9ydFNjcm9sbGVyIiwiZ2V0RE9NIiwidXJsUGFyc2luZ05vZGUiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIiLCJfYW5pbWF0aW9uUHJlZml4IiwiX3RyYW5zaXRpb25FbmQiLCJlbGVtZW50XzEiLCJnZXRTdHlsZSIsImRvbVByZWZpeGVzIiwidHJhbnNFbmRFdmVudE5hbWVzXzEiLCJXZWJraXRUcmFuc2l0aW9uIiwiTW96VHJhbnNpdGlvbiIsIk9UcmFuc2l0aW9uIiwidHJhbnNpdGlvbiIsImdldERpc3RyaWJ1dGVkTm9kZXMiLCJyZXNvbHZlQW5kU2V0SHJlZiIsInN1cHBvcnRzRE9NRXZlbnRzIiwic3VwcG9ydHNOYXRpdmVTaGFkb3dET00iLCJjcmVhdGVTaGFkb3dSb290IiwiZ2V0QW5pbWF0aW9uUHJlZml4IiwiZ2V0VHJhbnNpdGlvbkVuZCIsInN1cHBvcnRzQW5pbWF0aW9uIiwiRG9tQWRhcHRlciIsInJlc291cmNlTG9hZGVyVHlwZSIsIl9hdHRyVG9Qcm9wTWFwIiwiX2tleU1hcCIsIl9jaHJvbWVOdW1LZXlQYWRNYXAiLCJub2RlQ29udGFpbnMiLCJjb250YWlucyIsIkJyb3dzZXJEb21BZGFwdGVyIiwidGVtcGxhdGVIdG1sIiwibWFrZUN1cnJlbnQiLCJzZXRSb290RG9tQWRhcHRlciIsImFkYXB0ZXIiLCJnZXRQcm9wZXJ0eSIsImxvZ0dyb3VwIiwibG9nR3JvdXBFbmQiLCJncm91cEVuZCIsIm5vZGVBIiwibm9kZUIiLCJxdWVyeVNlbGVjdG9yQWxsIiwib25BbmRDYW5jZWwiLCJjcmVhdGVNb3VzZUV2ZW50IiwiZXZlbnRUeXBlIiwiZ2V0RGVmYXVsdERvY3VtZW50IiwiaXNQcmV2ZW50ZWQiLCJkZWZhdWx0UHJldmVudGVkIiwiZ2V0SW5uZXJIVE1MIiwiZ2V0T3V0ZXJIVE1MIiwiY2hpbGROb2Rlc0FzTGlzdCIsImNsZWFyTm9kZXMiLCJyZXBsYWNlQ2hpbGQiLCJpbnNlcnRBbGxCZWZvcmUiLCJpbnNlcnRBZnRlciIsInNldElubmVySFRNTCIsImdldFRleHQiLCJnZXRDaGVja2VkIiwiY2hlY2tlZCIsInNldENoZWNrZWQiLCJjcmVhdGVUZW1wbGF0ZSIsImNyZWF0ZVNjcmlwdFRhZyIsImdldFNoYWRvd1Jvb3QiLCJzaGFkb3dSb290IiwiZ2V0SG9zdCIsImNsb25lTm9kZSIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImhhc0NsYXNzIiwic3R5bGVuYW1lIiwiaGFzU3R5bGUiLCJhdHRyaWJ1dGVNYXAiLCJhdHRyaWIiLCJoYXNBdHRyaWJ1dGUiLCJoYXNBdHRyaWJ1dGVOUyIsImdldEF0dHJpYnV0ZU5TIiwic2V0QXR0cmlidXRlTlMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsInRlbXBsYXRlQXdhcmVSb290IiwiY3JlYXRlSHRtbERvY3VtZW50IiwiYm90dG9tIiwiaGVpZ2h0IiwiZ2V0VGl0bGUiLCJzZXRUaXRsZSIsIm5ld1RpdGxlIiwiZWxlbWVudE1hdGNoZXMiLCJpc0VsZW1lbnROb2RlIiwibXNNYXRjaGVzU2VsZWN0b3IiLCJ3ZWJraXRNYXRjaGVzU2VsZWN0b3IiLCJDT01NRU5UX05PREUiLCJoYXNTaGFkb3dSb290IiwiaXNTaGFkb3dSb290IiwiRG9jdW1lbnRGcmFnbWVudCIsImltcG9ydEludG9Eb2MiLCJpbXBvcnROb2RlIiwiYWRvcHROb2RlIiwiZ2V0SHJlZiIsImdldEV2ZW50S2V5Iiwia2V5SWRlbnRpZmllciIsImdldEdsb2JhbEV2ZW50VGFyZ2V0IiwiZ2V0SGlzdG9yeSIsImdldExvY2F0aW9uIiwiZ2V0QmFzZUVsZW1lbnRIcmVmIiwiYmFzZUVsZW1lbnQiLCJyZWxhdGl2ZVBhdGgiLCJyZXNldEJhc2VFbGVtZW50IiwiZ2V0VXNlckFnZW50IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInN1cHBvcnRzV2ViQW5pbWF0aW9uIiwicGVyZm9ybWFuY2VOb3ciLCJzdXBwb3J0c0Nvb2tpZXMiLCJnZXRDb29raWUiLCJwYXJzZUNvb2tpZVZhbHVlIiwiY29va2llU3RyIiwiY29va2llIiwiZXFJbmRleCIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZSIsInNldENvb2tpZSIsInN1cHBvcnRzU3RhdGUiLCJCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiIsIl9kb2MiLCJfaGlzdG9yeSIsImhvc3RuYW1lIiwibmV3UGF0aCIsIlRSQU5TSVRJT05fSUQiLCJTRVJWRVJfVFJBTlNJVElPTl9QUk9WSURFUlMiLCJhcHBJbml0aWFsaXplckZhY3RvcnkiLCJ0cmFuc2l0aW9uSWQiLCJkb20iLCJCcm93c2VyR2V0VGVzdGFiaWxpdHkiLCJ0ZXN0YWJpbGl0aWVzIiwiZGlkV29yayIsImRlY3JlbWVudCIsImRpZFdvcmtfIiwiZXhwb3J0TmdWYXIiLCJDT01QSUxFRCIsIkNPUkVfVE9LRU5TIiwiSU5TUEVDVF9HTE9CQUxfTkFNRSIsIkNPUkVfVE9LRU5TX0dMT0JBTF9OQU1FIiwiaW5zcGVjdE5hdGl2ZUVsZW1lbnQiLCJFTEVNRU5UX1BST0JFX1BST1ZJREVSUyIsIl9jcmVhdGVOZ1Byb2JlIiwiY29yZVRva2VucyIsIl9uZ1Byb2JlVG9rZW5zVG9NYXAiLCJFVkVOVF9NQU5BR0VSX1BMVUdJTlMiLCJFdmVudE1hbmFnZXIiLCJwbHVnaW5zIiwiX2V2ZW50TmFtZVRvUGx1Z2luIiwibWFuYWdlciIsIl9wbHVnaW5zIiwiX2ZpbmRQbHVnaW5Gb3IiLCJhZGRHbG9iYWxFdmVudExpc3RlbmVyIiwiZ2V0Wm9uZSIsInBsdWdpbiIsInBsdWdpbl8xIiwiRXZlbnRNYW5hZ2VyUGx1Z2luIiwiU2hhcmVkU3R5bGVzSG9zdCIsIl9zdHlsZXNTZXQiLCJhZGRTdHlsZXMiLCJhZGRpdGlvbnMiLCJvblN0eWxlc0FkZGVkIiwiZ2V0QWxsU3R5bGVzIiwiRG9tU2hhcmVkU3R5bGVzSG9zdCIsIl9ob3N0Tm9kZXMiLCJfc3R5bGVOb2RlcyIsIl9hZGRTdHlsZXNUb0hvc3QiLCJzdHlsZUVsIiwiYWRkSG9zdCIsImhvc3ROb2RlIiwicmVtb3ZlSG9zdCIsInN0eWxlTm9kZSIsIk5BTUVTUEFDRV9VUklTIiwiQ09NUE9ORU5UX1JFR0VYIiwiZmxhdHRlblN0eWxlcyIsImNvbXBJZCIsImRlY29yYXRlUHJldmVudERlZmF1bHQiLCJldmVudEhhbmRsZXIiLCJEb21SZW5kZXJlckZhY3RvcnkyIiwiZXZlbnRNYW5hZ2VyIiwic2hhcmVkU3R5bGVzSG9zdCIsImFwcElkIiwicmVuZGVyZXJCeUNvbXBJZCIsImFwcGx5VG9Ib3N0IiwiRGVmYXVsdERvbVJlbmRlcmVyMiIsIm5hbWVzcGFjZVVyaSIsIkltcG9ydGFudCIsImNoZWNrTm9TeW50aGV0aWNQcm9wIiwiQVRfQ0hBUkNPREUiLCJuYW1lS2luZCIsIkVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMiIsImNvbnRlbnRBdHRyIiwic2hpbUNvbnRlbnRBdHRyaWJ1dGUiLCJjb21wb25lbnRTaG9ydElkIiwiaG9zdEF0dHIiLCJzaGltSG9zdEF0dHJpYnV0ZSIsIlNoYWRvd0RvbVJlbmRlcmVyIiwiaG9zdEVsIiwiYXR0YWNoU2hhZG93Iiwibm9kZU9yU2hhZG93Um9vdCIsInN5bWJvbE5hbWVzIiwic3RvcFN5bWJvbCIsImJsYWNrTGlzdGVkTWFwIiwiaXNCbGFja0xpc3RlZEV2ZW50IiwiZ2xvYmFsTGlzdGVuZXIiLCJ0YXNrRGF0YXMiLCJjb3BpZWRUYXNrcyIsIkRvbUV2ZW50c1BsdWdpbiIsInBsYXRmb3JtSWQiLCJpc1BsYXRmb3JtU2VydmVyIiwicGF0Y2hFdmVudCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInpvbmVKc0xvYWRlZCIsImdsb2JhbExpc3RlbmVyUmVnaXN0ZXJlZCIsImNhbGxiYWNrUmVnaXN0ZXJlZCIsInVuZGVybHlpbmdSZW1vdmUiLCJFVkVOVF9OQU1FUyIsIkhBTU1FUl9HRVNUVVJFX0NPTkZJRyIsIkhBTU1FUl9MT0FERVIiLCJIYW1tZXJHZXN0dXJlQ29uZmlnIiwib3ZlcnJpZGVzIiwiYnVpbGRIYW1tZXIiLCJtYyIsIkhhbW1lciIsImVuYWJsZSIsIkhhbW1lckdlc3R1cmVzUGx1Z2luIiwibG9hZGVyIiwiaXNDdXN0b21FdmVudCIsImNhbmNlbFJlZ2lzdHJhdGlvbl8xIiwiZGVyZWdpc3Rlcl8xIiwiTU9ESUZJRVJfS0VZUyIsIk1PRElGSUVSX0tFWV9HRVRURVJTIiwiS2V5RXZlbnRzUGx1Z2luIiwiS2V5RXZlbnRzUGx1Z2luXzEiLCJwYXJzZUV2ZW50TmFtZSIsInBhcnNlZEV2ZW50Iiwib3V0c2lkZUhhbmRsZXIiLCJldmVudENhbGxiYWNrIiwiZG9tRXZlbnROYW1lIiwiX25vcm1hbGl6ZUtleSIsImZ1bGxLZXkiLCJtb2RpZmllck5hbWUiLCJnZXRFdmVudEZ1bGxLZXkiLCJtb2RpZmllckdldHRlciIsImtleU5hbWUiLCJEb21TYW5pdGl6ZXIiLCJEb21TYW5pdGl6ZXJJbXBsIiwiY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSIsImNoZWNrTm90U2FmZVZhbHVlIiwiZXhwZWN0ZWRUeXBlIiwiU2FmZVZhbHVlSW1wbCIsImJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sIiwiYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlIiwiYnlwYXNzU2VjdXJpdHlUcnVzdFNjcmlwdCIsImJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwiLCJieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwiLCJTYWZlSHRtbEltcGwiLCJTYWZlU3R5bGVJbXBsIiwiU2FmZVNjcmlwdEltcGwiLCJTYWZlVXJsSW1wbCIsIlNhZmVSZXNvdXJjZVVybEltcGwiLCLJtTAkNSIsIklOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTIiwiaW5pdERvbUFkYXB0ZXIiLCJfZG9jdW1lbnQiLCJCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlMiLCJCUk9XU0VSX01PRFVMRV9QUk9WSURFUlMiLCJCcm93c2VyTW9kdWxlIiwiQnJvd3Nlck1vZHVsZV8xIiwid2l0aFNlcnZlclRyYW5zaXRpb24iLCJjcmVhdGVNZXRhIiwiTWV0YSIsIl9kb20iLCJhZGRUYWciLCJmb3JjZUNyZWF0aW9uIiwiX2dldE9yQ3JlYXRlRWxlbWVudCIsImFkZFRhZ3MiLCJhdHRyU2VsZWN0b3IiLCJnZXRUYWdzIiwidXBkYXRlVGFnIiwiX3BhcnNlU2VsZWN0b3IiLCJfc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzIiwicmVtb3ZlVGFnIiwicmVtb3ZlVGFnRWxlbWVudCIsIl9jb250YWluc0F0dHJpYnV0ZXMiLCJjcmVhdGVUaXRsZSIsIlRpdGxlIiwiQ2hhbmdlRGV0ZWN0aW9uUGVyZlJlY29yZCIsIm1zUGVyVGljayIsIm51bVRpY2tzIiwiQW5ndWxhclByb2ZpbGVyIiwidGltZUNoYW5nZURldGVjdGlvbiIsImlzUHJvZmlsZXJBdmFpbGFibGUiLCJwcm9maWxlIiwicHJvZmlsZUVuZCIsIlRyYW5zZmVyU3RhdGUiLCJvblNlcmlhbGl6ZUNhbGxiYWNrcyIsIlRyYW5zZmVyU3RhdGVfMSIsInRyYW5zZmVyU3RhdGUiLCJoYXNLZXkiLCJvblNlcmlhbGl6ZSIsInRvSnNvbiIsImluaXRUcmFuc2ZlclN0YXRlIiwiaW5pdGlhbFN0YXRlIiwidW5lc2NhcGVIdG1sIiwidW5lc2NhcGVkVGV4dCIsIkJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlIiwiQnkiLCJlbXB0eVNjaGVkdWxlZCIsIkZvcmtKb2luU3Vic2NyaWJlciIsImNvbXBsZXRlZCIsImhhdmVWYWx1ZXMiLCJpbm5lclN1YnNjcmlwdGlvbiIsIl9oYXNWYWx1ZSIsIk5HX1ZBTFVFX0FDQ0VTU09SIiwiQ0hFQ0tCT1hfVkFMVUVfQUNDRVNTT1IiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yIiwiX2VsZW1lbnRSZWYiLCJvbkNoYW5nZSIsIm9uVG91Y2hlZCIsIndyaXRlVmFsdWUiLCJyZWdpc3Rlck9uQ2hhbmdlIiwicmVnaXN0ZXJPblRvdWNoZWQiLCJzZXREaXNhYmxlZFN0YXRlIiwiaXNEaXNhYmxlZCIsIkRFRkFVTFRfVkFMVUVfQUNDRVNTT1IiLCJDT01QT1NJVElPTl9CVUZGRVJfTU9ERSIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yIiwiX2NvbXBvc2l0aW9uTW9kZSIsIl9jb21wb3NpbmciLCJfaXNBbmRyb2lkIiwibm9ybWFsaXplZFZhbHVlIiwiX2hhbmRsZUlucHV0IiwiX2NvbXBvc2l0aW9uU3RhcnQiLCJfY29tcG9zaXRpb25FbmQiLCJBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUiLCJjb250cm9sIiwidmFsaWQiLCJwZW5kaW5nIiwiZGlzYWJsZWQiLCJwcmlzdGluZSIsInRvdWNoZWQiLCJ1bnRvdWNoZWQiLCJzdGF0dXNDaGFuZ2VzIiwidmFsdWVDaGFuZ2VzIiwiZXJyb3JDb2RlIiwiZ2V0RXJyb3IiLCJDb250cm9sQ29udGFpbmVyIiwidW5pbXBsZW1lbnRlZCIsIk5nQ29udHJvbCIsInZhbHVlQWNjZXNzb3IiLCJfcmF3VmFsaWRhdG9ycyIsIl9yYXdBc3luY1ZhbGlkYXRvcnMiLCJBYnN0cmFjdENvbnRyb2xTdGF0dXMiLCJjZCIsIl9jZCIsIm5nQ29udHJvbFN0YXR1c0hvc3QiLCJOZ0NvbnRyb2xTdGF0dXMiLCJOZ0NvbnRyb2xTdGF0dXNHcm91cCIsImlzRW1wdHlJbnB1dFZhbHVlIiwiTkdfVkFMSURBVE9SUyIsIk5HX0FTWU5DX1ZBTElEQVRPUlMiLCJFTUFJTF9SRUdFWFAiLCJWYWxpZGF0b3JzIiwicmVxdWlyZWQiLCJyZXF1aXJlZFRydWUiLCJlbWFpbCIsIm1pbkxlbmd0aCIsInJlZ2V4U3RyIiwibnVsbFZhbGlkYXRvciIsImNvbXBvc2UiLCJ2YWxpZGF0b3JzIiwicHJlc2VudFZhbGlkYXRvcnMiLCJpc1ByZXNlbnQiLCJfbWVyZ2VFcnJvcnMiLCJfZXhlY3V0ZVZhbGlkYXRvcnMiLCJjb21wb3NlQXN5bmMiLCJmb3JrSm9pbiIsInJlc3VsdFNlbGVjdG9yIiwiX2V4ZWN1dGVBc3luY1ZhbGlkYXRvcnMiLCJ0b09ic2VydmFibGUiLCJhcnJheU9mRXJyb3JzIiwibm9ybWFsaXplVmFsaWRhdG9yIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJub3JtYWxpemVBc3luY1ZhbGlkYXRvciIsIk5VTUJFUl9WQUxVRV9BQ0NFU1NPUiIsIk51bWJlclZhbHVlQWNjZXNzb3IiLCJSQURJT19WQUxVRV9BQ0NFU1NPUiIsIlJhZGlvQ29udHJvbFJlZ2lzdHJ5IiwiX2FjY2Vzc29ycyIsImFjY2Vzc29yIiwiX2lzU2FtZUdyb3VwIiwiZmlyZVVuY2hlY2siLCJjb250cm9sUGFpciIsIl9jb250cm9sIiwiUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvciIsIl9jaGVja05hbWUiLCJfZm4iLCJmb3JtQ29udHJvbE5hbWUiLCJfdGhyb3dOYW1lRXJyb3IiLCJSQU5HRV9WQUxVRV9BQ0NFU1NPUiIsIlJhbmdlVmFsdWVBY2Nlc3NvciIsIkZvcm1FcnJvckV4YW1wbGVzIiwiUmVhY3RpdmVFcnJvcnMiLCJjb250cm9sUGFyZW50RXhjZXB0aW9uIiwibmdNb2RlbEdyb3VwRXhjZXB0aW9uIiwibWlzc2luZ0Zvcm1FeGNlcHRpb24iLCJncm91cFBhcmVudEV4Y2VwdGlvbiIsImFycmF5UGFyZW50RXhjZXB0aW9uIiwiZGlzYWJsZWRBdHRyV2FybmluZyIsIm5nTW9kZWxXYXJuaW5nIiwiU0VMRUNUX1ZBTFVFX0FDQ0VTU09SIiwiX2J1aWxkVmFsdWVTdHJpbmciLCJTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciIsIl9vcHRpb25NYXAiLCJfaWRDb3VudGVyIiwiX2NvbXBhcmVXaXRoIiwiX2dldE9wdGlvbklkIiwidmFsdWVTdHJpbmciLCJfZ2V0T3B0aW9uVmFsdWUiLCJfcmVnaXN0ZXJPcHRpb24iLCJfZXh0cmFjdElkIiwiTmdTZWxlY3RPcHRpb24iLCJfc2VsZWN0IiwiX3NldEVsZW1lbnRWYWx1ZSIsIlNFTEVDVF9NVUxUSVBMRV9WQUxVRV9BQ0NFU1NPUiIsIl9idWlsZFZhbHVlU3RyaW5nJDEiLCJTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yIiwib3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlciIsImlkc18xIiwiX3NldFNlbGVjdGVkIiwic2VsZWN0ZWQiLCJzZWxlY3RlZE9wdGlvbnMiLCJfZXh0cmFjdElkJDEiLCLJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24iLCJjb250cm9sUGF0aCIsInNldFVwQ29udHJvbCIsImFzeW5jVmFsaWRhdG9yIiwic2V0VXBWaWV3Q2hhbmdlUGlwZWxpbmUiLCJfcGVuZGluZ1ZhbHVlIiwiX3BlbmRpbmdDaGFuZ2UiLCJfcGVuZGluZ0RpcnR5IiwidXBkYXRlT24iLCJ1cGRhdGVDb250cm9sIiwic2V0VXBNb2RlbENoYW5nZVBpcGVsaW5lIiwiZW1pdE1vZGVsRXZlbnQiLCJ2aWV3VG9Nb2RlbFVwZGF0ZSIsInNldFVwQmx1clBpcGVsaW5lIiwiX3BlbmRpbmdUb3VjaGVkIiwibWFya0FzVG91Y2hlZCIsInJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSIsInJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UiLCJ1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IiwibWFya0FzRGlydHkiLCJlbWl0TW9kZWxUb1ZpZXdDaGFuZ2UiLCJzZXRVcEZvcm1Db250YWluZXIiLCJfbm9Db250cm9sRXJyb3IiLCJtZXNzYWdlRW5kIiwiY29tcG9zZVZhbGlkYXRvcnMiLCJjb21wb3NlQXN5bmNWYWxpZGF0b3JzIiwiaXNQcm9wZXJ0eVVwZGF0ZWQiLCJ2aWV3TW9kZWwiLCJCVUlMVElOX0FDQ0VTU09SUyIsInN5bmNQZW5kaW5nQ29udHJvbHMiLCJfc3luY1BlbmRpbmdDb250cm9scyIsInNlbGVjdFZhbHVlQWNjZXNzb3IiLCJ2YWx1ZUFjY2Vzc29ycyIsImRlZmF1bHRBY2Nlc3NvciIsImJ1aWx0aW5BY2Nlc3NvciIsImN1c3RvbUFjY2Vzc29yIiwiaXNCdWlsdEluQWNjZXNzb3IiLCJyZW1vdmVEaXIiLCJfbmdNb2RlbFdhcm5pbmciLCJ3YXJuaW5nQ29uZmlnIiwiX25nTW9kZWxXYXJuaW5nU2VudE9uY2UiLCJfbmdNb2RlbFdhcm5pbmdTZW50IiwiY29lcmNlVG9WYWxpZGF0b3IiLCJ2YWxpZGF0b3JPck9wdHMiLCJpc09wdGlvbnNPYmoiLCJjb2VyY2VUb0FzeW5jVmFsaWRhdG9yIiwib3JpZ0FzeW5jVmFsaWRhdG9yIiwiYXN5bmNWYWxpZGF0b3JzIiwiQWJzdHJhY3RDb250cm9sIiwiX29uQ29sbGVjdGlvbkNoYW5nZSIsIl9vbkRpc2FibGVkQ2hhbmdlIiwiX3VwZGF0ZU9uIiwic2V0VmFsaWRhdG9ycyIsIm5ld1ZhbGlkYXRvciIsInNldEFzeW5jVmFsaWRhdG9ycyIsImNsZWFyVmFsaWRhdG9ycyIsImNsZWFyQXN5bmNWYWxpZGF0b3JzIiwib25seVNlbGYiLCJtYXJrQWxsQXNUb3VjaGVkIiwiX2ZvckVhY2hDaGlsZCIsIm1hcmtBc1VudG91Y2hlZCIsIl91cGRhdGVUb3VjaGVkIiwibWFya0FzUHJpc3RpbmUiLCJfdXBkYXRlUHJpc3RpbmUiLCJtYXJrQXNQZW5kaW5nIiwiZW1pdEV2ZW50Iiwic2tpcFByaXN0aW5lQ2hlY2siLCJfcGFyZW50TWFya2VkRGlydHkiLCJfdXBkYXRlVmFsdWUiLCJfdXBkYXRlQW5jZXN0b3JzIiwiY2hhbmdlRm4iLCJzZXRQYXJlbnQiLCJfc2V0SW5pdGlhbFN0YXR1cyIsIl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbiIsIl9ydW5WYWxpZGF0b3IiLCJfY2FsY3VsYXRlU3RhdHVzIiwiX3J1bkFzeW5jVmFsaWRhdG9yIiwiX3VwZGF0ZVRyZWVWYWxpZGl0eSIsImN0cmwiLCJfYWxsQ29udHJvbHNEaXNhYmxlZCIsIl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24iLCJzZXRFcnJvcnMiLCJfdXBkYXRlQ29udHJvbHNFcnJvcnMiLCJfZmluZCIsImNvbnRyb2xzIiwiX2luaXRPYnNlcnZhYmxlcyIsIl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJfYW55Q29udHJvbHMiLCJfYW55Q29udHJvbHNEaXJ0eSIsIl9hbnlDb250cm9sc1RvdWNoZWQiLCJfaXNCb3hlZFZhbHVlIiwiZm9ybVN0YXRlIiwiX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlIiwiX3NldFVwZGF0ZVN0cmF0ZWd5IiwicGFyZW50RGlydHkiLCJGb3JtQ29udHJvbCIsIl9vbkNoYW5nZSIsIl9hcHBseUZvcm1TdGF0ZSIsImVtaXRWaWV3VG9Nb2RlbENoYW5nZSIsInBhdGNoVmFsdWUiLCJfY2xlYXJDaGFuZ2VGbnMiLCJGb3JtR3JvdXAiLCJfc2V0VXBDb250cm9scyIsInJlZ2lzdGVyQ29udHJvbCIsImFkZENvbnRyb2wiLCJyZW1vdmVDb250cm9sIiwic2V0Q29udHJvbCIsImNvbnRyb2xOYW1lIiwiX2NoZWNrQWxsVmFsdWVzUHJlc2VudCIsIl90aHJvd0lmQ29udHJvbE1pc3NpbmciLCJnZXRSYXdWYWx1ZSIsIl9yZWR1Y2VDaGlsZHJlbiIsInN1YnRyZWVVcGRhdGVkIiwidXBkYXRlZCIsIl9yZWR1Y2VWYWx1ZSIsImluaXRWYWx1ZSIsIkZvcm1BcnJheSIsIl9yZWdpc3RlckNvbnRyb2wiLCJyZW1vdmVBdCIsImZvcm1EaXJlY3RpdmVQcm92aWRlciIsInJlc29sdmVkUHJvbWlzZSIsIk5nRm9ybSIsInN1Ym1pdHRlZCIsIl9kaXJlY3RpdmVzIiwibmdTdWJtaXQiLCJfZmluZENvbnRhaW5lciIsImdldENvbnRyb2wiLCJhZGRGb3JtR3JvdXAiLCJyZW1vdmVGb3JtR3JvdXAiLCJnZXRGb3JtR3JvdXAiLCJ1cGRhdGVNb2RlbCIsIm9uU3VibWl0IiwiJGV2ZW50Iiwib25SZXNldCIsInJlc2V0Rm9ybSIsIlRlbXBsYXRlRHJpdmVuRXJyb3JzIiwibW9kZWxQYXJlbnRFeGNlcHRpb24iLCJmb3JtR3JvdXBOYW1lRXhjZXB0aW9uIiwibWlzc2luZ05hbWVFeGNlcHRpb24iLCJtb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uIiwibmdGb3JtV2FybmluZyIsIk5HX0ZPUk1fU0VMRUNUT1JfV0FSTklORyIsIk5nRm9ybVNlbGVjdG9yV2FybmluZyIsIk5nRm9ybVNlbGVjdG9yV2FybmluZ18xIiwiX25nRm9ybVdhcm5pbmciLCJBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSIsIl9jaGVja1BhcmVudFR5cGUiLCJmb3JtRGlyZWN0aXZlIiwiX3ZhbGlkYXRvcnMiLCJfYXN5bmNWYWxpZGF0b3JzIiwibW9kZWxHcm91cFByb3ZpZGVyIiwiTmdNb2RlbEdyb3VwIiwiTmdNb2RlbEdyb3VwXzEiLCJmb3JtQ29udHJvbEJpbmRpbmciLCJyZXNvbHZlZFByb21pc2UkMSIsIk5nTW9kZWwiLCJfcmVnaXN0ZXJlZCIsIl9jaGVja0ZvckVycm9ycyIsIl9zZXRVcENvbnRyb2wiLCJfdXBkYXRlRGlzYWJsZWQiLCJtb2RlbCIsIl9pc1N0YW5kYWxvbmUiLCJfc2V0VXBTdGFuZGFsb25lIiwic3RhbmRhbG9uZSIsImRpc2FibGVkVmFsdWUiLCLJtU5nTm9WYWxpZGF0ZSIsIk5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkciLCJmb3JtQ29udHJvbEJpbmRpbmckMSIsIkZvcm1Db250cm9sRGlyZWN0aXZlIiwiX25nTW9kZWxXYXJuaW5nQ29uZmlnIiwiRm9ybUNvbnRyb2xEaXJlY3RpdmVfMSIsIl9pc0NvbnRyb2xDaGFuZ2VkIiwiZm9ybURpcmVjdGl2ZVByb3ZpZGVyJDEiLCJGb3JtR3JvdXBEaXJlY3RpdmUiLCJfY2hlY2tGb3JtUHJlc2VudCIsIl91cGRhdGVWYWxpZGF0b3JzIiwiX3VwZGF0ZURvbVZhbHVlIiwiX3VwZGF0ZVJlZ2lzdHJhdGlvbnMiLCJhZGRGb3JtQXJyYXkiLCJyZW1vdmVGb3JtQXJyYXkiLCJnZXRGb3JtQXJyYXkiLCJuZXdDdHJsIiwiY2xlYW5VcENvbnRyb2wiLCJfb2xkRm9ybSIsInN5bmMiLCJmb3JtR3JvdXBOYW1lUHJvdmlkZXIiLCJGb3JtR3JvdXBOYW1lIiwiX2hhc0ludmFsaWRQYXJlbnQiLCJmb3JtQXJyYXlOYW1lUHJvdmlkZXIiLCJGb3JtQXJyYXlOYW1lIiwiY29udHJvbE5hbWVCaW5kaW5nIiwiRm9ybUNvbnRyb2xOYW1lIiwiX2FkZGVkIiwiRm9ybUNvbnRyb2xOYW1lXzEiLCJSRVFVSVJFRF9WQUxJREFUT1IiLCJDSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1IiLCJSZXF1aXJlZFZhbGlkYXRvciIsIl9yZXF1aXJlZCIsIkNoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IiLCJFTUFJTF9WQUxJREFUT1IiLCJFbWFpbFZhbGlkYXRvciIsIl9lbmFibGVkIiwiTUlOX0xFTkdUSF9WQUxJREFUT1IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJfY3JlYXRlVmFsaWRhdG9yIiwibWlubGVuZ3RoIiwiX3ZhbGlkYXRvciIsIk1BWF9MRU5HVEhfVkFMSURBVE9SIiwiTWF4TGVuZ3RoVmFsaWRhdG9yIiwibWF4bGVuZ3RoIiwiUEFUVEVSTl9WQUxJREFUT1IiLCJQYXR0ZXJuVmFsaWRhdG9yIiwiU0hBUkVEX0ZPUk1fRElSRUNUSVZFUyIsIlRFTVBMQVRFX0RSSVZFTl9ESVJFQ1RJVkVTIiwiUkVBQ1RJVkVfRFJJVkVOX0RJUkVDVElWRVMiLCLJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUiLCJGb3JtQnVpbGRlciIsImNvbnRyb2xzQ29uZmlnIiwiX3JlZHVjZUNvbnRyb2xzIiwiaXNBYnN0cmFjdENvbnRyb2xPcHRpb25zIiwiX2NyZWF0ZUNvbnRyb2wiLCJjb250cm9sQ29uZmlnIiwiRm9ybXNNb2R1bGUiLCJGb3Jtc01vZHVsZV8xIiwid2l0aENvbmZpZyIsIndhcm5PbkRlcHJlY2F0ZWROZ0Zvcm1TZWxlY3RvciIsIlJlYWN0aXZlRm9ybXNNb2R1bGUiLCJSZWFjdGl2ZUZvcm1zTW9kdWxlXzEiLCJ3YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sIiwiYnVpbHRpbkV4dGVybmFsUmVmZXJlbmNlcyIsImNyZWF0ZUJ1aWx0aW5FeHRlcm5hbFJlZmVyZW5jZXNNYXAiLCJKaXRSZWZsZWN0b3IiLCJFUlJPUl9DT0xMRUNUT1JfVE9LRU4iLCJERUZBVUxUX1BBQ0tBR0VfVVJMX1BST1ZJREVSIiwiX05PX1JFU09VUkNFX0xPQURFUiIsImJhc2VIdG1sUGFyc2VyIiwiQ29tcGlsZXJJbXBsIiwidGVtcGxhdGVQYXJzZXIiLCJzdHlsZUNvbXBpbGVyIiwidmlld0NvbXBpbGVyIiwibmdNb2R1bGVDb21waWxlciIsImNvbXBpbGVSZWZsZWN0b3IiLCJjb21waWxlckNvbmZpZyIsIkNPTVBJTEVSX1BST1ZJREVSUyIsInBhcnNlciIsIklnbm9yZSIsIkppdENvbXBpbGVyRmFjdG9yeSIsIl9kZWZhdWx0T3B0aW9ucyIsIl9tZXJnZU9wdGlvbnMiLCJvcHRpb25zQXJyIiwiX2xhc3REZWZpbmVkIiwiX21lcmdlQXJyYXlzIiwiTm90aWZpY2F0aW9uS2luZCIsInBsYXRmb3JtQ29yZUR5bmFtaWMiLCJSZXNvdXJjZUxvYWRlckltcGwiLCJvbmxvYWQiLCJyZXNwb25zZVRleHQiLCJvbmVycm9yIiwiSU5URVJOQUxfQlJPV1NFUl9EWU5BTUlDX1BMQVRGT1JNX1BST1ZJREVSUyIsIkNhY2hlZFJlc291cmNlTG9hZGVyIiwiX2NhY2hlIiwiJHRlbXBsYXRlQ2FjaGUiLCJwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIiwiUXVldWVBY3Rpb24iLCJ3b3JrIiwiZXhlY3V0ZSIsIl9leGVjdXRlIiwicmVxdWVzdEFzeW5jSWQiLCJBc3luY0FjdGlvbiIsInJlY3ljbGVBc3luY0lkIiwiZXJyb3JlZCIsImVycm9yVmFsdWUiLCJBY3Rpb24iLCJTY2hlZHVsZXIiLCJTY2hlZHVsZXJBY3Rpb24iLCJRdWV1ZVNjaGVkdWxlciIsIkFzeW5jU2NoZWR1bGVyIiwic2NhbGFyIiwiZGlzcGF0Y2giLCJOb3RpZmljYXRpb24iLCJoYXNWYWx1ZSIsImRvIiwiY3JlYXRlTmV4dCIsInVuZGVmaW5lZFZhbHVlTm90aWZpY2F0aW9uIiwiY3JlYXRlQ29tcGxldGUiLCJjb21wbGV0ZU5vdGlmaWNhdGlvbiIsIk9ic2VydmVPblN1YnNjcmliZXIiLCJub3RpZmljYXRpb24iLCJzY2hlZHVsZU1lc3NhZ2UiLCJPYnNlcnZlT25NZXNzYWdlIiwiUmVwbGF5U3ViamVjdCIsImJ1ZmZlclNpemUiLCJ3aW5kb3dUaW1lIiwiX2luZmluaXRlVGltZVdpbmRvdyIsIl9idWZmZXJTaXplIiwiX3dpbmRvd1RpbWUiLCJuZXh0SW5maW5pdGVUaW1lV2luZG93IiwibmV4dFRpbWVXaW5kb3ciLCJSZXBsYXlFdmVudCIsIl9nZXROb3ciLCJfdHJpbUJ1ZmZlclRoZW5HZXRFdmVudHMiLCJldmVudHNDb3VudCIsInNwbGljZUNvdW50IiwiRW1wdHlFcnJvckltcGwiLCJFbXB0eUVycm9yIiwiRmlsdGVyT3BlcmF0b3IiLCJGaWx0ZXJTdWJzY3JpYmVyIiwiQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsIiwiQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IiLCJUYWtlT3BlcmF0b3IiLCJ0b3RhbCIsIlRha2VTdWJzY3JpYmVyIiwiRGVmYXVsdElmRW1wdHlPcGVyYXRvciIsIkRlZmF1bHRJZkVtcHR5U3Vic2NyaWJlciIsIkRvT3BlcmF0b3IiLCJUYXBTdWJzY3JpYmVyIiwiX3RhcE5leHQiLCJfdGFwRXJyb3IiLCJfdGFwQ29tcGxldGUiLCJ0aHJvd0lmRW1wdHkiLCJlcnJvckZhY3RvcnkiLCJkZWZhdWx0RXJyb3JGYWN0b3J5IiwidGFwT3BlcmF0b3JGdW5jdGlvbiIsImhhc0RlZmF1bHRWYWx1ZSIsImZpbHRlck9wZXJhdG9yRnVuY3Rpb24iLCJkZWZhdWx0SWZFbXB0eSIsIlNUT1JZIiwiQXBwQ29tcG9uZW50IiwiY2ZyIiwiY2hpbGRDaGFuZ2VEZXRlY3RvclJlZiIsInNldFByb3BzIiwiaGFzTmdPbkNoYW5nZXNIb29rIiwiaW5zdGFuY2VQcm9wZXJ0eSIsImNhbGxOZ09uQ2hhbmdlc0hvb2siLCJzZXROZ01vZGVsIiwibmdNb2RlbCIsIm5nTW9kZWxDaGFuZ2UiLCJwcm9taXNlcyIsInN0b3J5RGF0YSIsImdldEV4aXN0ZW5jZU9mQ29tcG9uZW50SW5Nb2R1bGVzIiwiZGVjbGFyYXRpb24iLCJpbXBvcnRJdGVtIiwiZXh0cmFjdGVkTmdNb2R1bGVNZXRhZGF0YSIsIm5nTW9kdWxlRGVjb3JhdG9yIiwiZXh0cmFjdE5nTW9kdWxlTWV0YWRhdGEiLCJpbml0TW9kdWxlIiwic3RvcnlPYmoiLCJpc0NyZWF0aW5nQ29tcG9uZW50RnJvbVRlbXBsYXRlIiwiQW5ub3RhdGVkQ29tcG9uZW50IiwiRHluYW1pY0NvbXBvbmVudCIsImNyZWF0ZUNvbXBvbmVudEZyb21UZW1wbGF0ZSIsIkR5bmFtaWNNb2R1bGUiLCJnZXRNb2R1bGUiLCJzdGF0aWNSb290IiwiaW5zZXJ0RHluYW1pY1Jvb3QiLCJhcHAiLCJuZXdNb2R1bGUiLCJkcmF3IiwiaXNPYmplY3RPYmplY3QiLCJwcm90IiwicmVmQ291bnQiLCJyZWZDb3VudE9wZXJhdG9yRnVuY3Rpb24iLCJSZWZDb3VudE9wZXJhdG9yIiwiY29ubmVjdGFibGUiLCJfcmVmQ291bnQiLCJyZWZDb3VudGVyIiwiY29ubmVjdGlvbiIsImNvbm5lY3QiLCJSZWZDb3VudFN1YnNjcmliZXIiLCJzaGFyZWRDb25uZWN0aW9uIiwiX2Nvbm5lY3Rpb24iLCJjb25uZWN0YWJsZVByb3RvIiwiQ29ubmVjdGFibGVPYnNlcnZhYmxlIiwic3ViamVjdEZhY3RvcnkiLCJfaXNDb21wbGV0ZSIsImdldFN1YmplY3QiLCJjb25uZWN0YWJsZU9ic2VydmFibGVEZXNjcmlwdG9yIiwiQ29ubmVjdGFibGVTdWJzY3JpYmVyIiwiTXVsdGljYXN0T3BlcmF0b3IiLCJzaGFyZVN1YmplY3RGYWN0b3J5Iiwic2hhcmUiLCJtdWx0aWNhc3QiLCJzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeSIsIm11bHRpY2FzdE9wZXJhdG9yRnVuY3Rpb24iLCJNZXJnZU1hcE9wZXJhdG9yIiwiY29uY3VycmVudCIsIk1lcmdlTWFwU3Vic2NyaWJlciIsImhhc0NvbXBsZXRlZCIsIl90cnlOZXh0IiwiX2lubmVyU3ViIiwiaXNoIiwiaW5uZXJTdWJzY3JpYmVyIiwibWVyZ2VBbGwiLCJtZXJnZU1hcCIsIm9ic2VydmFibGVzIl0sIm1hcHBpbmdzIjoiK0hBQUE7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxJQUFJQSxjQUFnQixTQUFTQyxFQUFHQyxHQUk1QixPQUhBRixjQUFnQkcsT0FBT0MsZ0JBQ2xCLENBQUVDLFVBQVcsY0FBZ0JDLE9BQVMsU0FBVUwsRUFBR0MsR0FBS0QsRUFBRUksVUFBWUgsSUFDdkUsU0FBVUQsRUFBR0MsR0FBSyxJQUFLLElBQUlLLEtBQUtMLEVBQU9BLEVBQUVNLGVBQWVELEtBQUlOLEVBQUVNLEdBQUtMLEVBQUVLLE1BQ3BETixFQUFHQyxJQUdyQixTQUFTTyxVQUFVUixFQUFHQyxHQUV6QixTQUFTUSxLQUFPQyxLQUFLQyxZQUFjWCxFQURuQ0QsY0FBY0MsRUFBR0MsR0FFakJELEVBQUVZLFVBQWtCLE9BQU5YLEVBQWFDLE9BQU9XLE9BQU9aLElBQU1RLEdBQUdHLFVBQVlYLEVBQUVXLFVBQVcsSUFBSUgsSUFHNUUsSUFBSUssU0FBVyxXQVFsQixPQVBBQSxTQUFXWixPQUFPYSxRQUFVLFNBQVNELFNBQVNFLEdBQzFDLElBQUssSUFBSUMsRUFBR0MsRUFBSSxFQUFHQyxFQUFJQyxVQUFVQyxPQUFRSCxFQUFJQyxFQUFHRCxJQUU1QyxJQUFLLElBQUlaLEtBRFRXLEVBQUlHLFVBQVVGLEdBQ09oQixPQUFPVSxVQUFVTCxlQUFlZSxLQUFLTCxFQUFHWCxLQUFJVSxFQUFFVixHQUFL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TUFBUyxJQUNULEtBQVEsSUFDUixPQUFVLElBQ1YsT0FBVSxJQUNWLE9BQVUsSUFDVixPQUFVLElBQ1YsTUFBUyxJQUNULE1BQVMsSUFDVCxNQUFTLElBQ1QsR0FBTSxJQUNOLEdBQU0sSUFDTixLQUFRLElBQ1IsS0FBUSxJQUNSLE9BQVUsSUFDVixPQUFVLElBQ1YsT0FBVSxJQUNWLE9BQVUsSUFDVixNQUFTLElBQ1QsTUFBUyxJQUNULE1BQVMsSUFDVCxPQUFVLElBQ1YsT0FBVSxJQUNWLE1BQVMsSUFDVCxNQUFTLElBQ1QsSUFBTyxJQUNQLEtBQVEsSUFDUixLQUFRLElBQ1IsT0FBVSxJQUNWLEtBQVEsSUFDUixLQUFRLElBQ1IsS0FBUSxJQUNSLE1BQVMsSUFDVCxNQUFTLElBQ1QsT0FBVSxJQUNWLE9BQVUsSUFDVixLQUFRLElBQ1IsTUFBUyxJQUNULEtBQVEsSUFDUixLQUFRLElBQ1IsTUFBUyxJQUNULE1BQVMsSUFDVCxHQUFNLElBQ04sT0FBVSxJQUNWLE9BQVUsSUFDVixJQUFPLElBQ1AsSUFBTyxJQUNQLE9BQVUsSUFDVixNQUFTLElBQ1QsR0FBTSxJQUNOLEtBQVEsSUFDUixNQUFTLElBQ1QsTUFBUyxJQUNULE9BQVUsSUFDVixNQUFTLElBQ1QsR0FBTSxJQUNOLEdBQU0sSUFDTixNQUFTLElBQ1QsS0FBUSxJQUNSLE1BQVMsSUFDVCxHQUFNLElBQ04sR0FBTSxJQUNOLElBQU8sSUFDUCxNQUFTLElBQ1QsS0FBUSxJQUNSLE9BQVUsSUFDVixPQUFVLElBQ1YsR0FBTSxJQUNOLEdBQU0sSUFDTixPQUFVLElBQ1YsT0FBVSxJQUNWLE1BQVMsSUFDVCxNQUFTLElBQ1QsTUFBUyxJQUNULE1BQVMsSUFDVCxPQUFVLElBQ1YsT0FBVSxJQUNWLE1BQVMsSUFDVCxNQUFTLElBQ1QsTUFBUyxJQUNULFFBQVcsSUFDWCxRQUFXLElBQ1gsTUFBUyxJQUNULEdBQU0sSUFDTixLQUFRLElBQ1IsS0FBUSxJQUNSLE9BQVUsSUFDVixPQUFVLElBQ1YsT0FBVSxJQUNWLE9BQVUsSUFDVixPQUFVLElBQ1YsS0FBUSxJQUNSLEtBQVEsSUFDUixLQUFRLElBQ1IsT0FBVSxJQUNWLEtBQVEsSUFDUixJQUFPLElBQ1AsSUFBTyxJQUNQLEdBQU0sSUFDTixHQUFNLElBQ04sSUFBTyxJQUNQLE9BQVUsSUFDVixNQUFTLElBQ1QsTUFBUyxJQUNULE1BQVMsSUFDVCxLQUFRLElBQ1IsS0FBUSxJQUNSLElBQU8sSUFDUCxJQUFPLElBQ1AsS0FBUSxJQUNSLE1BQVMsSUFDVCxLQUFRLElBQ1IsTUFBUyxJQUNULEtBQVEsSUFDUixLQUFRLElBQ1IsTUFBUyxJQUNULE1BQVMsSUFDVCxLQUFRLElBQ1IsSUFBTyxJQUNQLE9BQVUsSUFDVixJQUFPLElBQ1AsSUFBTyxJQUNQLElBQU8sSUFDUCxPQUFVLElBQ1YsTUFBUyxJQUNULE1BQVMsSUFDVCxPQUFVLElBQ1YsT0FBVSxJQUNWLEtBQVEsSUFDUixLQUFRLElBQ1IsSUFBTyxJQUNQLE1BQVMsSUFDVCxNQUFTLElBQ1QsT0FBVSxJQUNWLElBQU8sSUFDUCxPQUFVLElBQ1YsSUFBTyxJQUNQLEtBQVEsSUFDUixJQUFPLElBQ1AsSUFBTyxJQUNQLEtBQVEsSUFDUixLQUFRLElBQ1IsS0FBUSxJQUNSLEtBQVEsSUFDUixNQUFTLElBQ1QsSUFBTyxJQUNQLElBQU8sSUFDUCxPQUFVLElBQ1YsTUFBUyxJQUNULE1BQVMsSUFDVCxTQUFZLElBQ1osT0FBVSxJQUNWLE1BQVMsSUFDVCxNQUFTLElBQ1QsTUFBUyxJQUNULE1BQVMsSUFDVCxNQUFTLElBQ1QsT0FBVSxJQUNWLE9BQVUsSUFDVixLQUFRLElBQ1IsS0FBUSxJQUNSLE1BQVMsSUFDVCxNQUFTLElBQ1QsT0FBVSxJQUNWLE9BQVUsSUFDVixJQUFPLElBQ1AsTUFBUyxJQUNULFFBQVcsSUFDWCxRQUFXLElBQ1gsS0FBUSxJQUNSLEtBQVEsSUFDUixPQUFVLElBQ1YsR0FBTSxJQUNOLEdBQU0sSUFDTixPQUFVLElBQ1YsT0FBVSxJQUNWLElBQU8sSUFDUCxLQUFRLElBQ1IsS0FBUSxJQUNSLEtBQVEsSUFDUixLQUFRLElBQ1Is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QVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUNoRCxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQ3RCLElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUMxRSxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUFLLElBQVEsSUFDMUUsSUFBUSxJQUFNLElBQVEsSUFBSyxJQUFRLElBQUssSUFBUSxJQUNoRCxJQUFRLElBQU0sSUFBUSxJQUFLLElBQVEsSUFBSyxJQUFRLElBQ2hELElBQVEsSUFBTSxJQUFRLElBQUssSUFBUSxJQUNuQyxJQUFRLEtBQU0sSUFBUSxLQUN0QixJQUFRLEtBQU0sSUFBUSxLQUN0QixJQUFRLEtBRVIsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0s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QVUsT0FBT0EsT0FBT3dqRSxLQUFLbXVTLFNBQVMsU0FBVXh6VSxFQUFHcHVDLEdBQUssT0FBTyxPQUFBbVcsS0FBQSxHQUFLcWpOLFFBQVFwckwsRUFBR3B1QyxJQUFJeXpFLEtBQUssT0FBQWh0RSxJQUFBLEdBQUksU0FBVTFILEVBQUd1VSxJQUFNLE9BQU9veVYsZUFBZXQzVCxFQUFHcnZDLEVBQUdpQixFQUFHc1QsUUFBYTh0VyxlQUU3SSxpQkFBbkIxYixpQkFDWjBiLFdBQWExYixnQkFFVixTQUFVejFWLFFBQVUsT0FBT0EsT0FBT3l0TSxLQUFLLElBQUl5akssaUJBQWlCM25KLFFBQVM0bkosZUNWckVRLENBQVNubkosU0FBQSxFQUFVMm1KLFksc0NDRnZCLFNBQVMxb1YsUUFFWixJQURBLElBQUltcFYsWUFBYyxHQUNUeCtXLEdBQUssRUFBR0EsR0FBS25ELFVBQVVDLE9BQVFrRCxLQUNwQ3crVyxZQUFZeCtXLElBQU1uRCxVQUFVbUQsSUFFaEMsSUFBSSs5VyxXQUFhanhSLE9BQU9nNEssa0JBQ3BCN3lOLFVBQVksS0FDWml1QixLQUFPcytTLFlBQVlBLFlBQVkxaFgsT0FBUyxHQVU1QyxPQVRJLE9BQUE4NE4sWUFBQSxHQUFZMTFKLE9BQ1pqdUIsVUFBWXVzVSxZQUFZeGlVLE1BQ3BCd2lVLFlBQVkxaFgsT0FBUyxHQUFvRCxpQkFBeEMwaFgsWUFBWUEsWUFBWTFoWCxPQUFTLEtBQ2xFaWhYLFdBQWFTLFlBQVl4aVUsUUFHUixpQkFBVGtrQixPQUNaNjlTLFdBQWFTLFlBQVl4aVUsT0FFWCxPQUFkL0osV0FBNkMsSUFBdkJ1c1UsWUFBWTFoWCxRQUFnQjBoWCxZQUFZLGFBQWN0a0ssV0FBQSxFQUNyRXNrSyxZQUFZLEdBRWhCRixTQUFTUCxXQUFUTyxDQUFxQixPQUFBdmdRLFVBQUEsR0FBVXlnUSxZQUFhdnNVLFlBekJ2RCIsImZpbGUiOiJ2ZW5kb3Jzfm1haW4uZTUwNjU0M2MyNGM2NWNkNWRlODMuYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgIHJlc3VsdC5kZWZhdWx0ID0gbW9kO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuIiwiLyoqXG4gKiBAbGljZW5zZSBBbmd1bGFyIHY4LjAuM1xuICogKGMpIDIwMTAtMjAxOSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuXG5pbXBvcnQgeyBfX3NwcmVhZCwgX19hc3NpZ24sIF9fdmFsdWVzLCBfX2V4dGVuZHMsIF9fcmVhZCwgX19kZWNvcmF0ZSwgX19wYXJhbSwgX19tZXRhZGF0YSB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgU3ViamVjdCwgT2JzZXJ2YWJsZSwgbWVyZ2UgYXMgbWVyZ2UkMSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBBTk5PVEFUSU9OUyA9ICdfX2Fubm90YXRpb25zX18nO1xudmFyIFBBUkFNRVRFUlMgPSAnX19wYXJhbWV0ZXJzX18nO1xudmFyIFBST1BfTUVUQURBVEEgPSAnX19wcm9wX19tZXRhZGF0YV9fJztcbi8qKlxuICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuICovXG5mdW5jdGlvbiBtYWtlRGVjb3JhdG9yKG5hbWUsIHByb3BzLCBwYXJlbnRDbGFzcywgYWRkaXRpb25hbFByb2Nlc3NpbmcsIHR5cGVGbikge1xuICAgIHZhciBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpO1xuICAgIGZ1bmN0aW9uIERlY29yYXRvckZhY3RvcnkoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERlY29yYXRvckZhY3RvcnkpIHtcbiAgICAgICAgICAgIG1ldGFDdG9yLmNhbGwuYXBwbHkobWV0YUN0b3IsIF9fc3ByZWFkKFt0aGlzXSwgYXJncykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFubm90YXRpb25JbnN0YW5jZSA9IG5ldyAoKF9hID0gRGVjb3JhdG9yRmFjdG9yeSkuYmluZC5hcHBseShfYSwgX19zcHJlYWQoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVEZWNvcmF0b3IoY2xzKSB7XG4gICAgICAgICAgICBpZiAodHlwZUZuKVxuICAgICAgICAgICAgICAgIHR5cGVGbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkKFtjbHNdLCBhcmdzKSk7XG4gICAgICAgICAgICAvLyBVc2Ugb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIGltcG9ydGFudCBzaW5jZSBpdCBjcmVhdGVzIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHdoaWNoXG4gICAgICAgICAgICAvLyBwcmV2ZW50cyB0aGUgcHJvcGVydHkgaXMgY29waWVkIGR1cmluZyBzdWJjbGFzc2luZy5cbiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9ucyA9IGNscy5oYXNPd25Qcm9wZXJ0eShBTk5PVEFUSU9OUykgP1xuICAgICAgICAgICAgICAgIGNsc1tBTk5PVEFUSU9OU10gOlxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIEFOTk9UQVRJT05TLCB7IHZhbHVlOiBbXSB9KVtBTk5PVEFUSU9OU107XG4gICAgICAgICAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoYWRkaXRpb25hbFByb2Nlc3NpbmcpXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb2Nlc3NpbmcoY2xzKTtcbiAgICAgICAgICAgIHJldHVybiBjbHM7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChwYXJlbnRDbGFzcykge1xuICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTtcbiAgICB9XG4gICAgRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWUgPSBuYW1lO1xuICAgIERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IERlY29yYXRvckZhY3Rvcnk7XG4gICAgcmV0dXJuIERlY29yYXRvckZhY3Rvcnk7XG59XG5mdW5jdGlvbiBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGN0b3IoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVzID0gcHJvcHMuYXBwbHkodm9pZCAwLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IHZhbHVlc1twcm9wTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gbWFrZVBhcmFtRGVjb3JhdG9yKG5hbWUsIHByb3BzLCBwYXJlbnRDbGFzcykge1xuICAgIHZhciBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpO1xuICAgIGZ1bmN0aW9uIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUGFyYW1EZWNvcmF0b3JGYWN0b3J5KSB7XG4gICAgICAgICAgICBtZXRhQ3Rvci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgKChfYSA9IFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkuYmluZC5hcHBseShfYSwgX19zcHJlYWQoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICAgICAgUGFyYW1EZWNvcmF0b3IuYW5ub3RhdGlvbiA9IGFubm90YXRpb25JbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIFBhcmFtRGVjb3JhdG9yO1xuICAgICAgICBmdW5jdGlvbiBQYXJhbURlY29yYXRvcihjbHMsIHVudXNlZEtleSwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFVzZSBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgaW1wb3J0YW50IHNpbmNlIGl0IGNyZWF0ZXMgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2hpY2hcbiAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLlxuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBjbHMuaGFzT3duUHJvcGVydHkoUEFSQU1FVEVSUykgP1xuICAgICAgICAgICAgICAgIGNsc1tQQVJBTUVURVJTXSA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNscywgUEFSQU1FVEVSUywgeyB2YWx1ZTogW10gfSlbUEFSQU1FVEVSU107XG4gICAgICAgICAgICAvLyB0aGVyZSBtaWdodCBiZSBnYXBzIGlmIHNvbWUgaW4gYmV0d2VlbiBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIGFubm90YXRpb25zLlxuICAgICAgICAgICAgLy8gd2UgcGFkIHdpdGggbnVsbHMuXG4gICAgICAgICAgICB3aGlsZSAocGFyYW1ldGVycy5sZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAocGFyYW1ldGVyc1tpbmRleF0gPSBwYXJhbWV0ZXJzW2luZGV4XSB8fCBbXSkucHVzaChhbm5vdGF0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIGNscztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGFyZW50Q2xhc3MpIHtcbiAgICAgICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTtcbiAgICB9XG4gICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7XG4gICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LmFubm90YXRpb25DbHMgPSBQYXJhbURlY29yYXRvckZhY3Rvcnk7XG4gICAgcmV0dXJuIFBhcmFtRGVjb3JhdG9yRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIG1ha2VQcm9wRGVjb3JhdG9yKG5hbWUsIHByb3BzLCBwYXJlbnRDbGFzcywgYWRkaXRpb25hbFByb2Nlc3NpbmcpIHtcbiAgICB2YXIgbWV0YUN0b3IgPSBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKTtcbiAgICBmdW5jdGlvbiBQcm9wRGVjb3JhdG9yRmFjdG9yeSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvcERlY29yYXRvckZhY3RvcnkpIHtcbiAgICAgICAgICAgIG1ldGFDdG9yLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlY29yYXRvckluc3RhbmNlID0gbmV3ICgoX2EgPSBQcm9wRGVjb3JhdG9yRmFjdG9yeSkuYmluZC5hcHBseShfYSwgX19zcHJlYWQoW3ZvaWQgMF0sIGFyZ3MpKSkoKTtcbiAgICAgICAgZnVuY3Rpb24gUHJvcERlY29yYXRvcih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIC8vIFVzZSBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgaW1wb3J0YW50IHNpbmNlIGl0IGNyZWF0ZXMgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2hpY2hcbiAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLlxuICAgICAgICAgICAgdmFyIG1ldGEgPSBjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShQUk9QX01FVEFEQVRBKSA/XG4gICAgICAgICAgICAgICAgY29uc3RydWN0b3JbUFJPUF9NRVRBREFUQV0gOlxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgUFJPUF9NRVRBREFUQSwgeyB2YWx1ZToge30gfSlbUFJPUF9NRVRBREFUQV07XG4gICAgICAgICAgICBtZXRhW25hbWVdID0gbWV0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBtZXRhW25hbWVdIHx8IFtdO1xuICAgICAgICAgICAgbWV0YVtuYW1lXS51bnNoaWZ0KGRlY29yYXRvckluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsUHJvY2Vzc2luZylcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvY2Vzc2luZy5hcHBseSh2b2lkIDAsIF9fc3ByZWFkKFt0YXJnZXQsIG5hbWVdLCBhcmdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb3BEZWNvcmF0b3I7XG4gICAgfVxuICAgIGlmIChwYXJlbnRDbGFzcykge1xuICAgICAgICBQcm9wRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIFByb3BEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7XG4gICAgUHJvcERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IFByb3BEZWNvcmF0b3JGYWN0b3J5O1xuICAgIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIMm1MCA9IGZ1bmN0aW9uICh0b2tlbikgeyByZXR1cm4gKHsgdG9rZW46IHRva2VuIH0pOyB9O1xuLyoqXG4gKiBJbmplY3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgSW5qZWN0ID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdJbmplY3QnLCDJtTApO1xuLyoqXG4gKiBPcHRpb25hbCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBBbm5vdGF0aW9uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBPcHRpb25hbCA9IG1ha2VQYXJhbURlY29yYXRvcignT3B0aW9uYWwnKTtcbi8qKlxuICogU2VsZiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBBbm5vdGF0aW9uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBTZWxmID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdTZWxmJyk7XG4vKipcbiAqIFNraXBTZWxmIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFNraXBTZWxmID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdTa2lwU2VsZicpO1xuLyoqXG4gKiBIb3N0IGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEhvc3QgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ0hvc3QnKTtcbnZhciDJtTEgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkgeyByZXR1cm4gKHsgYXR0cmlidXRlTmFtZTogYXR0cmlidXRlTmFtZSB9KTsgfTtcbi8qKlxuICogQXR0cmlidXRlIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuXG4gKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEF0dHJpYnV0ZSA9IG1ha2VQYXJhbURlY29yYXRvcignQXR0cmlidXRlJywgybUxKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBJbmplY3Rpb24gZmxhZ3MgZm9yIERJLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEluamVjdEZsYWdzO1xuKGZ1bmN0aW9uIChJbmplY3RGbGFncykge1xuICAgIC8vIFRPRE8oYWx4aHViKTogbWFrZSB0aGlzICdjb25zdCcgd2hlbiBuZ2Mgbm8gbG9uZ2VyIHdyaXRlcyBleHBvcnRzIG9mIGl0IGludG8gbmdmYWN0b3J5IGZpbGVzLlxuICAgIC8qKiBDaGVjayBzZWxmIGFuZCBjaGVjayBwYXJlbnQgaW5qZWN0b3IgaWYgbmVlZGVkICovXG4gICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbXCJEZWZhdWx0XCJdID0gMF0gPSBcIkRlZmF1bHRcIjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhhdCBhbiBpbmplY3RvciBzaG91bGQgcmV0cmlldmUgYSBkZXBlbmRlbmN5IGZyb20gYW55IGluamVjdG9yIHVudGlsIHJlYWNoaW5nIHRoZVxuICAgICAqIGhvc3QgZWxlbWVudCBvZiB0aGUgY3VycmVudCBjb21wb25lbnQuIChPbmx5IHVzZWQgd2l0aCBFbGVtZW50IEluamVjdG9yKVxuICAgICAqL1xuICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzW1wiSG9zdFwiXSA9IDFdID0gXCJIb3N0XCI7XG4gICAgLyoqIERvbid0IGFzY2VuZCB0byBhbmNlc3RvcnMgb2YgdGhlIG5vZGUgcmVxdWVzdGluZyBpbmplY3Rpb24uICovXG4gICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbXCJTZWxmXCJdID0gMl0gPSBcIlNlbGZcIjtcbiAgICAvKiogU2tpcCB0aGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgaW5qZWN0aW9uLiAqL1xuICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzW1wiU2tpcFNlbGZcIl0gPSA0XSA9IFwiU2tpcFNlbGZcIjtcbiAgICAvKiogSW5qZWN0IGBkZWZhdWx0VmFsdWVgIGluc3RlYWQgaWYgdG9rZW4gbm90IGZvdW5kLiAqL1xuICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzW1wiT3B0aW9uYWxcIl0gPSA4XSA9IFwiT3B0aW9uYWxcIjtcbn0pKEluamVjdEZsYWdzIHx8IChJbmplY3RGbGFncyA9IHt9KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGdldENsb3N1cmVTYWZlUHJvcGVydHkob2JqV2l0aFByb3BlcnR5VG9FeHRyYWN0KSB7XG4gICAgZm9yICh2YXIga2V5IGluIG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkge1xuICAgICAgICBpZiAob2JqV2l0aFByb3BlcnR5VG9FeHRyYWN0W2tleV0gPT09IGdldENsb3N1cmVTYWZlUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJlbmFtZWQgcHJvcGVydHkgb24gdGFyZ2V0IG9iamVjdC4nKTtcbn1cbi8qKlxuICogU2V0cyBwcm9wZXJ0aWVzIG9uIGEgdGFyZ2V0IG9iamVjdCBmcm9tIGEgc291cmNlIG9iamVjdCwgYnV0IG9ubHkgaWZcbiAqIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gc2V0IHByb3BlcnRpZXMgb25cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcHJvcGVydHkga2V5cyBhbmQgdmFsdWVzIHRvIHNldFxuICovXG5mdW5jdGlvbiBmaWxsUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF0YXJnZXQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBDb25zdHJ1Y3QgYW4gYEluamVjdGFibGVEZWZgIHdoaWNoIGRlZmluZXMgaG93IGEgdG9rZW4gd2lsbCBiZSBjb25zdHJ1Y3RlZCBieSB0aGUgREkgc3lzdGVtLCBhbmRcbiAqIGluIHdoaWNoIGluamVjdG9ycyAoaWYgYW55KSBpdCB3aWxsIGJlIGF2YWlsYWJsZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBhc3NpZ25lZCB0byBhIHN0YXRpYyBgbmdJbmplY3RhYmxlRGVmYCBmaWVsZCBvbiBhIHR5cGUsIHdoaWNoIHdpbGwgdGhlbiBiZSBhblxuICogYEluamVjdGFibGVUeXBlYC5cbiAqXG4gKiBPcHRpb25zOlxuICogKiBgcHJvdmlkZWRJbmAgZGV0ZXJtaW5lcyB3aGljaCBpbmplY3RvcnMgd2lsbCBpbmNsdWRlIHRoZSBpbmplY3RhYmxlLCBieSBlaXRoZXIgYXNzb2NpYXRpbmcgaXRcbiAqICAgd2l0aCBhbiBgQE5nTW9kdWxlYCBvciBvdGhlciBgSW5qZWN0b3JUeXBlYCwgb3IgYnkgc3BlY2lmeWluZyB0aGF0IHRoaXMgaW5qZWN0YWJsZSBzaG91bGQgYmVcbiAqICAgcHJvdmlkZWQgaW4gdGhlIGAncm9vdCdgIGluamVjdG9yLCB3aGljaCB3aWxsIGJlIHRoZSBhcHBsaWNhdGlvbi1sZXZlbCBpbmplY3RvciBpbiBtb3N0IGFwcHMuXG4gKiAqIGBmYWN0b3J5YCBnaXZlcyB0aGUgemVybyBhcmd1bWVudCBmdW5jdGlvbiB3aGljaCB3aWxsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgaW5qZWN0YWJsZS5cbiAqICAgVGhlIGZhY3RvcnkgY2FuIGNhbGwgYGluamVjdGAgdG8gYWNjZXNzIHRoZSBgSW5qZWN0b3JgIGFuZCByZXF1ZXN0IGluamVjdGlvbiBvZiBkZXBlbmRlbmNpZXMuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWRlZmluZUluamVjdGFibGUob3B0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByb3ZpZGVkSW46IG9wdHMucHJvdmlkZWRJbiB8fCBudWxsLCBmYWN0b3J5OiBvcHRzLmZhY3RvcnksIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgfTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW4gdjgsIGRlbGV0ZSBhZnRlciB2MTAuIFRoaXMgQVBJIHNob3VsZCBiZSB1c2VkIG9ubHkgYmUgZ2VuZXJhdGVkIGNvZGUsIGFuZCB0aGF0XG4gKiBjb2RlIHNob3VsZCBub3cgdXNlIMm1ybVkZWZpbmVJbmplY3RhYmxlIGluc3RlYWQuXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBkZWZpbmVJbmplY3RhYmxlID0gybXJtWRlZmluZUluamVjdGFibGU7XG4vKipcbiAqIENvbnN0cnVjdCBhbiBgSW5qZWN0b3JEZWZgIHdoaWNoIGNvbmZpZ3VyZXMgYW4gaW5qZWN0b3IuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgYXNzaWduZWQgdG8gYSBzdGF0aWMgYG5nSW5qZWN0b3JEZWZgIGZpZWxkIG9uIGEgdHlwZSwgd2hpY2ggd2lsbCB0aGVuIGJlIGFuXG4gKiBgSW5qZWN0b3JUeXBlYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICogYGZhY3RvcnlgOiBhbiBgSW5qZWN0b3JUeXBlYCBpcyBhbiBpbnN0YW50aWFibGUgdHlwZSwgc28gYSB6ZXJvIGFyZ3VtZW50IGBmYWN0b3J5YCBmdW5jdGlvbiB0b1xuICogICBjcmVhdGUgdGhlIHR5cGUgbXVzdCBiZSBwcm92aWRlZC4gSWYgdGhhdCBmYWN0b3J5IGZ1bmN0aW9uIG5lZWRzIHRvIGluamVjdCBhcmd1bWVudHMsIGl0IGNhblxuICogICB1c2UgdGhlIGBpbmplY3RgIGZ1bmN0aW9uLlxuICogKiBgcHJvdmlkZXJzYDogYW4gb3B0aW9uYWwgYXJyYXkgb2YgcHJvdmlkZXJzIHRvIGFkZCB0byB0aGUgaW5qZWN0b3IuIEVhY2ggcHJvdmlkZXIgbXVzdFxuICogICBlaXRoZXIgaGF2ZSBhIGZhY3Rvcnkgb3IgcG9pbnQgdG8gYSB0eXBlIHdoaWNoIGhhcyBhbiBgbmdJbmplY3RhYmxlRGVmYCBzdGF0aWMgcHJvcGVydHkgKHRoZVxuICogICB0eXBlIG11c3QgYmUgYW4gYEluamVjdGFibGVUeXBlYCkuXG4gKiAqIGBpbXBvcnRzYDogYW4gb3B0aW9uYWwgYXJyYXkgb2YgaW1wb3J0cyBvZiBvdGhlciBgSW5qZWN0b3JUeXBlYHMgb3IgYEluamVjdG9yVHlwZVdpdGhNb2R1bGVgc1xuICogICB3aG9zZSBwcm92aWRlcnMgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBpbmplY3Rvci4gTG9jYWxseSBwcm92aWRlZCB0eXBlcyB3aWxsIG92ZXJyaWRlXG4gKiAgIHByb3ZpZGVycyBmcm9tIGltcG9ydHMuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiDJtcm1ZGVmaW5lSW5qZWN0b3Iob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZhY3Rvcnk6IG9wdGlvbnMuZmFjdG9yeSwgcHJvdmlkZXJzOiBvcHRpb25zLnByb3ZpZGVycyB8fCBbXSwgaW1wb3J0czogb3B0aW9ucy5pbXBvcnRzIHx8IFtdLFxuICAgIH07XG59XG4vKipcbiAqIFJlYWQgdGhlIGBuZ0luamVjdGFibGVEZWZgIHR5cGUgaW4gYSB3YXkgd2hpY2ggaXMgaW1tdW5lIHRvIGFjY2lkZW50YWxseSByZWFkaW5nIGluaGVyaXRlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdHlwZSB0eXBlIHdoaWNoIG1heSBoYXZlIGBuZ0luamVjdGFibGVEZWZgXG4gKi9cbmZ1bmN0aW9uIGdldEluamVjdGFibGVEZWYodHlwZSkge1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUuaGFzT3duUHJvcGVydHkoTkdfSU5KRUNUQUJMRV9ERUYpID8gdHlwZVtOR19JTkpFQ1RBQkxFX0RFRl0gOiBudWxsO1xufVxuLyoqXG4gKiBSZWFkIHRoZSBgbmdJbmplY3RvckRlZmAgdHlwZSBpbiBhIHdheSB3aGljaCBpcyBpbW11bmUgdG8gYWNjaWRlbnRhbGx5IHJlYWRpbmcgaW5oZXJpdGVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB0eXBlIHR5cGUgd2hpY2ggbWF5IGhhdmUgYG5nSW5qZWN0b3JEZWZgXG4gKi9cbmZ1bmN0aW9uIGdldEluamVjdG9yRGVmKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlLmhhc093blByb3BlcnR5KE5HX0lOSkVDVE9SX0RFRikgPyB0eXBlW05HX0lOSkVDVE9SX0RFRl0gOiBudWxsO1xufVxudmFyIE5HX0lOSkVDVEFCTEVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0YWJsZURlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcbnZhciBOR19JTkpFQ1RPUl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgbmdJbmplY3RvckRlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5KHRva2VuKSB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH1cbiAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4gJ1snICsgdG9rZW4ubWFwKHN0cmluZ2lmeSkuam9pbignLCAnKSArICddJztcbiAgICB9XG4gICAgaWYgKHRva2VuID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdG9rZW47XG4gICAgfVxuICAgIGlmICh0b2tlbi5vdmVycmlkZGVuTmFtZSkge1xuICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm92ZXJyaWRkZW5OYW1lO1xuICAgIH1cbiAgICBpZiAodG9rZW4ubmFtZSkge1xuICAgICAgICByZXR1cm4gXCJcIiArIHRva2VuLm5hbWU7XG4gICAgfVxuICAgIHZhciByZXMgPSB0b2tlbi50b1N0cmluZygpO1xuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJycgKyByZXM7XG4gICAgfVxuICAgIHZhciBuZXdMaW5lSW5kZXggPSByZXMuaW5kZXhPZignXFxuJyk7XG4gICAgcmV0dXJuIG5ld0xpbmVJbmRleCA9PT0gLTEgPyByZXMgOiByZXMuc3Vic3RyaW5nKDAsIG5ld0xpbmVJbmRleCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfX2ZvcndhcmRfcmVmX18gPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgX19mb3J3YXJkX3JlZl9fOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pO1xuLyoqXG4gKiBBbGxvd3MgdG8gcmVmZXIgdG8gcmVmZXJlbmNlcyB3aGljaCBhcmUgbm90IHlldCBkZWZpbmVkLlxuICpcbiAqIEZvciBpbnN0YW5jZSwgYGZvcndhcmRSZWZgIGlzIHVzZWQgd2hlbiB0aGUgYHRva2VuYCB3aGljaCB3ZSBuZWVkIHRvIHJlZmVyIHRvIGZvciB0aGUgcHVycG9zZXMgb2ZcbiAqIERJIGlzIGRlY2xhcmVkLCBidXQgbm90IHlldCBkZWZpbmVkLiBJdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGUgYHRva2VuYCB3aGljaCB3ZSB1c2Ugd2hlbiBjcmVhdGluZ1xuICogYSBxdWVyeSBpcyBub3QgeWV0IGRlZmluZWQuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKiB7QGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZl9zcGVjLnRzIHJlZ2lvbj0nZm9yd2FyZF9yZWYnfVxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBmb3J3YXJkUmVmKGZvcndhcmRSZWZGbikge1xuICAgIGZvcndhcmRSZWZGbi5fX2ZvcndhcmRfcmVmX18gPSBmb3J3YXJkUmVmO1xuICAgIGZvcndhcmRSZWZGbi50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ2lmeSh0aGlzKCkpOyB9O1xuICAgIHJldHVybiBmb3J3YXJkUmVmRm47XG59XG4vKipcbiAqIExhemlseSByZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBmcm9tIGEgZm9yd2FyZFJlZi5cbiAqXG4gKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL2RpL3RzL2ZvcndhcmRfcmVmL2ZvcndhcmRfcmVmX3NwZWMudHMgcmVnaW9uPSdyZXNvbHZlX2ZvcndhcmRfcmVmJ31cbiAqXG4gKiBAc2VlIGBmb3J3YXJkUmVmYFxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZih0eXBlKSB7XG4gICAgdmFyIGZuID0gdHlwZTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nICYmIGZuLmhhc093blByb3BlcnR5KF9fZm9yd2FyZF9yZWZfXykgJiZcbiAgICAgICAgZm4uX19mb3J3YXJkX3JlZl9fID09PSBmb3J3YXJkUmVmKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWwoKSB7XG4gICAgdmFyIF9fZ2xvYmFsVGhpcyA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzO1xuICAgIHZhciBfX3dpbmRvdyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdztcbiAgICB2YXIgX19zZWxmID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmIHNlbGY7XG4gICAgdmFyIF9fZ2xvYmFsID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsO1xuICAgIC8vIEFsd2F5cyB1c2UgX19nbG9iYWxUaGlzIGlmIGF2YWlsYWJsZSwgd2hpY2ggaXMgdGhlIHNwZWMtZGVmaW5lZCBnbG9iYWwgdmFyaWFibGUgYWNyb3NzIGFsbFxuICAgIC8vIGVudmlyb25tZW50cywgdGhlbiBmYWxsYmFjayB0byBfX2dsb2JhbCBmaXJzdCwgYmVjYXVzZSBpbiBOb2RlIHRlc3RzIGJvdGggX19nbG9iYWwgYW5kXG4gICAgLy8gX193aW5kb3cgbWF5IGJlIGRlZmluZWQgYW5kIF9nbG9iYWwgc2hvdWxkIGJlIF9fZ2xvYmFsIGluIHRoYXQgY2FzZS5cbiAgICByZXR1cm4gX19nbG9iYWxUaGlzIHx8IF9fZ2xvYmFsIHx8IF9fd2luZG93IHx8IF9fc2VsZjtcbn1cbnZhciBfZ2xvYmFsID0gZ2V0R2xvYmFsKCk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGU7XG4oZnVuY3Rpb24gKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSkge1xuICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbXCJUb2tlblwiXSA9IDBdID0gXCJUb2tlblwiO1xuICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbXCJBdHRyaWJ1dGVcIl0gPSAxXSA9IFwiQXR0cmlidXRlXCI7XG59KShSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUgfHwgKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSA9IHt9KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGdldENvbXBpbGVyRmFjYWRlKCkge1xuICAgIHZhciBnbG9iYWxOZyA9IF9nbG9iYWxbJ25nJ107XG4gICAgaWYgKCFnbG9iYWxOZyB8fCAhZ2xvYmFsTmcuybVjb21waWxlckZhY2FkZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbmd1bGFyIEpJVCBjb21waWxhdGlvbiBmYWlsZWQ6ICdAYW5ndWxhci9jb21waWxlcicgbm90IGxvYWRlZCFcXG5cIiArXG4gICAgICAgICAgICBcIiAgLSBKSVQgY29tcGlsYXRpb24gaXMgZGlzY291cmFnZWQgZm9yIHByb2R1Y3Rpb24gdXNlLWNhc2VzISBDb25zaWRlciBBT1QgbW9kZSBpbnN0ZWFkLlxcblwiICtcbiAgICAgICAgICAgIFwiICAtIERpZCB5b3UgYm9vdHN0cmFwIHVzaW5nICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnIG9yICdAYW5ndWxhci9wbGF0Zm9ybS1zZXJ2ZXInP1xcblwiICtcbiAgICAgICAgICAgIFwiICAtIEFsdGVybmF0aXZlbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0IFxcXCJAYW5ndWxhci9jb21waWxlclxcXCI7JyBiZWZvcmUgYm9vdHN0cmFwcGluZy5cIik7XG4gICAgfVxuICAgIHJldHVybiBnbG9iYWxOZy7JtWNvbXBpbGVyRmFjYWRlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEN1cnJlbnQgaW5qZWN0b3IgdmFsdWUgdXNlZCBieSBgaW5qZWN0YC5cbiAqIC0gYHVuZGVmaW5lZGA6IGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYGluamVjdGBcbiAqIC0gYG51bGxgOiBgaW5qZWN0YCBjYW4gYmUgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbmplY3RvciAobGltcC1tb2RlKS5cbiAqIC0gSW5qZWN0b3IgaW5zdGFuY2U6IFVzZSB0aGUgaW5qZWN0b3IgZm9yIHJlc29sdXRpb24uXG4gKi9cbnZhciBfY3VycmVudEluamVjdG9yID0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gc2V0Q3VycmVudEluamVjdG9yKGluamVjdG9yKSB7XG4gICAgdmFyIGZvcm1lciA9IF9jdXJyZW50SW5qZWN0b3I7XG4gICAgX2N1cnJlbnRJbmplY3RvciA9IGluamVjdG9yO1xuICAgIHJldHVybiBmb3JtZXI7XG59XG4vKipcbiAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0LlxuICpcbiAqIEJ5IGRlZmF1bHQsIGl0IGlzIGBpbmplY3RJbmplY3Rvck9ubHlgLCB3aGljaCBtYWtlcyBpdCBgSW5qZWN0b3JgLW9ubHkgYXdhcmUuIEl0IGNhbiBiZSBjaGFuZ2VkXG4gKiB0byBgZGlyZWN0aXZlSW5qZWN0YCwgd2hpY2ggYnJpbmdzIGluIHRoZSBgTm9kZUluamVjdG9yYCBzeXN0ZW0gb2YgaXZ5LiBJdCBpcyBkZXNpZ25lZCB0aGlzXG4gKiB3YXkgZm9yIHR3byByZWFzb25zOlxuICogIDEuIGBJbmplY3RvcmAgc2hvdWxkIG5vdCBkZXBlbmQgb24gaXZ5IGxvZ2ljLlxuICogIDIuIFRvIG1haW50YWluIHRyZWUgc2hha2UtYWJpbGl0eSB3ZSBkb24ndCB3YW50IHRvIGJyaW5nIGluIHVubmVjZXNzYXJ5IGNvZGUuXG4gKi9cbnZhciBfaW5qZWN0SW1wbGVtZW50YXRpb247XG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgaW5qZWN0IGltcGxlbWVudGF0aW9uLlxuICovXG5mdW5jdGlvbiBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihpbXBsKSB7XG4gICAgdmFyIHByZXZpb3VzID0gX2luamVjdEltcGxlbWVudGF0aW9uO1xuICAgIF9pbmplY3RJbXBsZW1lbnRhdGlvbiA9IGltcGw7XG4gICAgcmV0dXJuIHByZXZpb3VzO1xufVxuZnVuY3Rpb24gaW5qZWN0SW5qZWN0b3JPbmx5KHRva2VuLCBmbGFncykge1xuICAgIGlmIChmbGFncyA9PT0gdm9pZCAwKSB7IGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdDsgfVxuICAgIGlmIChfY3VycmVudEluamVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5qZWN0KCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBhbiBpbmplY3Rpb24gY29udGV4dFwiKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoX2N1cnJlbnRJbmplY3RvciA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCB1bmRlZmluZWQsIGZsYWdzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBfY3VycmVudEluamVjdG9yLmdldCh0b2tlbiwgZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCA/IG51bGwgOiB1bmRlZmluZWQsIGZsYWdzKTtcbiAgICB9XG59XG5mdW5jdGlvbiDJtcm1aW5qZWN0KHRva2VuLCBmbGFncykge1xuICAgIGlmIChmbGFncyA9PT0gdm9pZCAwKSB7IGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdDsgfVxuICAgIHJldHVybiAoX2luamVjdEltcGxlbWVudGF0aW9uIHx8IGluamVjdEluamVjdG9yT25seSkodG9rZW4sIGZsYWdzKTtcbn1cbi8qKlxuICogSW5qZWN0cyBhIHRva2VuIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5qZWN0b3IuXG4gKlxuICogTXVzdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGEgZmFjdG9yeSBmdW5jdGlvbiBzdWNoIGFzIG9uZSBkZWZpbmVkIGZvciBhblxuICogYEluamVjdGlvblRva2VuYC4gVGhyb3dzIGFuIGVycm9yIGlmIG5vdCBjYWxsZWQgZnJvbSBzdWNoIGEgY29udGV4dC5cbiAqXG4gKiBXaXRoaW4gc3VjaCBhIGZhY3RvcnkgZnVuY3Rpb24sIHVzaW5nIHRoaXMgZnVuY3Rpb24gdG8gcmVxdWVzdCBpbmplY3Rpb24gb2YgYSBkZXBlbmRlbmN5XG4gKiBpcyBmYXN0ZXIgYW5kIG1vcmUgdHlwZS1zYWZlIHRoYW4gcHJvdmlkaW5nIGFuIGFkZGl0aW9uYWwgYXJyYXkgb2YgZGVwZW5kZW5jaWVzXG4gKiAoYXMgaGFzIGJlZW4gY29tbW9uIHdpdGggYHVzZUZhY3RvcnlgIHByb3ZpZGVycykuXG4gKlxuICogQHBhcmFtIHRva2VuIFRoZSBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSBkZXBlbmRlbmN5IHRvIGJlIGluamVjdGVkLlxuICogQHBhcmFtIGZsYWdzIE9wdGlvbmFsIGZsYWdzIHRoYXQgY29udHJvbCBob3cgaW5qZWN0aW9uIGlzIGV4ZWN1dGVkLlxuICogVGhlIGZsYWdzIGNvcnJlc3BvbmQgdG8gaW5qZWN0aW9uIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHdpdGhcbiAqIHBhcmFtZXRlciBkZWNvcmF0b3JzIGBASG9zdGAsIGBAU2VsZmAsIGBAU2tpcFNlZmAsIGFuZCBgQE9wdGlvbmFsYC5cbiAqIEByZXR1cm5zIFRydWUgaWYgaW5qZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIG51bGwgb3RoZXJ3aXNlLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0nU2hha2FibGVJbmplY3Rpb25Ub2tlbid9XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgaW5qZWN0ID0gybXJtWluamVjdDtcbi8qKlxuICogSW5qZWN0cyBgcm9vdGAgdG9rZW5zIGluIGxpbXAgbW9kZS5cbiAqXG4gKiBJZiBubyBpbmplY3RvciBleGlzdHMsIHdlIGNhbiBzdGlsbCBpbmplY3QgdHJlZS1zaGFrYWJsZSBwcm92aWRlcnMgd2hpY2ggaGF2ZSBgcHJvdmlkZWRJbmAgc2V0IHRvXG4gKiBgXCJyb290XCJgLiBUaGlzIGlzIGtub3duIGFzIHRoZSBsaW1wIG1vZGUgaW5qZWN0aW9uLiBJbiBzdWNoIGNhc2UgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGVcbiAqIGBJbmplY3RhYmxlRGVmYC5cbiAqL1xuZnVuY3Rpb24gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncykge1xuICAgIHZhciBpbmplY3RhYmxlRGVmID0gZ2V0SW5qZWN0YWJsZURlZih0b2tlbik7XG4gICAgaWYgKGluamVjdGFibGVEZWYgJiYgaW5qZWN0YWJsZURlZi5wcm92aWRlZEluID09ICdyb290Jykge1xuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZURlZi52YWx1ZSA9PT0gdW5kZWZpbmVkID8gaW5qZWN0YWJsZURlZi52YWx1ZSA9IGluamVjdGFibGVEZWYuZmFjdG9yeSgpIDpcbiAgICAgICAgICAgIGluamVjdGFibGVEZWYudmFsdWU7XG4gICAgfVxuICAgIGlmIChmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAobm90Rm91bmRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmplY3RvcjogTk9UX0ZPVU5EIFtcIiArIHN0cmluZ2lmeSh0b2tlbikgKyBcIl1cIik7XG59XG5mdW5jdGlvbiBpbmplY3RBcmdzKHR5cGVzKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhcmcgPSB0eXBlc1tpXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50cyBhcnJheSBtdXN0IGhhdmUgYXJndW1lbnRzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0O1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhcmcubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IGFyZ1tqXTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YSBpbnN0YW5jZW9mIE9wdGlvbmFsIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdPcHRpb25hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSW5qZWN0RmxhZ3MuT3B0aW9uYWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBTa2lwU2VsZiB8fCBtZXRhLm5nTWV0YWRhdGFOYW1lID09PSAnU2tpcFNlbGYnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEluamVjdEZsYWdzLlNraXBTZWxmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhIGluc3RhbmNlb2YgU2VsZiB8fCBtZXRhLm5nTWV0YWRhdGFOYW1lID09PSAnU2VsZicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSW5qZWN0RmxhZ3MuU2VsZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YSBpbnN0YW5jZW9mIEluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gbWV0YS50b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBtZXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZ3MucHVzaCjJtcm1aW5qZWN0KHR5cGUsIGZsYWdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goybXJtWluamVjdChhcmcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIG1hcHBpbmcgb2YgdGhlIEBhbmd1bGFyL2NvcmUgQVBJIHN1cmZhY2UgdXNlZCBpbiBnZW5lcmF0ZWQgZXhwcmVzc2lvbnMgdG8gdGhlIGFjdHVhbCBzeW1ib2xzLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGtlcHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBwdWJsaWMgZXhwb3J0cyBvZiBAYW5ndWxhci9jb3JlLlxuICovXG52YXIgYW5ndWxhckNvcmVEaUVudiA9IHtcbiAgICAnybXJtWRlZmluZUluamVjdGFibGUnOiDJtcm1ZGVmaW5lSW5qZWN0YWJsZSxcbiAgICAnybXJtWRlZmluZUluamVjdG9yJzogybXJtWRlZmluZUluamVjdG9yLFxuICAgICfJtcm1aW5qZWN0JzogybXJtWluamVjdCxcbiAgICAnybXJtWdldEZhY3RvcnlPZic6IGdldEZhY3RvcnlPZixcbn07XG5mdW5jdGlvbiBnZXRGYWN0b3J5T2YodHlwZSkge1xuICAgIHZhciB0eXBlQW55ID0gdHlwZTtcbiAgICB2YXIgZGVmID0gZ2V0SW5qZWN0YWJsZURlZih0eXBlQW55KSB8fCBnZXRJbmplY3RvckRlZih0eXBlQW55KTtcbiAgICBpZiAoIWRlZiB8fCBkZWYuZmFjdG9yeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZGVmLmZhY3Rvcnk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogUmVwcmVzZW50cyBhIHR5cGUgdGhhdCBhIENvbXBvbmVudCBvciBvdGhlciBvYmplY3QgaXMgaW5zdGFuY2VzIG9mLlxuICpcbiAqIEFuIGV4YW1wbGUgb2YgYSBgVHlwZWAgaXMgYE15Q3VzdG9tQ29tcG9uZW50YCBjbGFzcywgd2hpY2ggaW4gSmF2YVNjcmlwdCBpcyBiZSByZXByZXNlbnRlZCBieVxuICogdGhlIGBNeUN1c3RvbUNvbXBvbmVudGAgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVHlwZSA9IEZ1bmN0aW9uO1xuZnVuY3Rpb24gaXNUeXBlKHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQXR0ZW50aW9uOiBUaGVzZSByZWdleCBoYXMgdG8gaG9sZCBldmVuIGlmIHRoZSBjb2RlIGlzIG1pbmlmaWVkIVxuICovXG52YXIgREVMRUdBVEVfQ1RPUiA9IC9eZnVuY3Rpb25cXHMrXFxTK1xcKFxcKVxccyp7W1xcc1xcU10rXFwuYXBwbHlcXCh0aGlzLFxccyphcmd1bWVudHNcXCkvO1xudmFyIElOSEVSSVRFRF9DTEFTUyA9IC9eY2xhc3NcXHMrW0EtWmEtelxcZCRfXSpcXHMqZXh0ZW5kc1xccytbXntdK3svO1xudmFyIElOSEVSSVRFRF9DTEFTU19XSVRIX0NUT1IgPSAvXmNsYXNzXFxzK1tBLVphLXpcXGQkX10qXFxzKmV4dGVuZHNcXHMrW157XSt7W1xcc1xcU10qY29uc3RydWN0b3JcXHMqXFwoLztcbnZhciBJTkhFUklURURfQ0xBU1NfV0lUSF9ERUxFR0FURV9DVE9SID0gL15jbGFzc1xccytbQS1aYS16XFxkJF9dKlxccypleHRlbmRzXFxzK1tee10re1tcXHNcXFNdKmNvbnN0cnVjdG9yXFxzKlxcKFxcKVxccyp7XFxzK3N1cGVyXFwoXFwuXFwuXFwuYXJndW1lbnRzXFwpLztcbnZhciBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMocmVmbGVjdCkge1xuICAgICAgICB0aGlzLl9yZWZsZWN0ID0gcmVmbGVjdCB8fCBfZ2xvYmFsWydSZWZsZWN0J107XG4gICAgfVxuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmlzUmVmbGVjdGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmZhY3RvcnkgPSBmdW5jdGlvbiAodCkgeyByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgKHQuYmluZC5hcHBseSh0LCBfX3NwcmVhZChbdm9pZCAwXSwgYXJncykpKSgpO1xuICAgIH07IH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLl96aXBUeXBlc0FuZEFubm90YXRpb25zID0gZnVuY3Rpb24gKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheShwYXJhbVR5cGVzLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIFRTIG91dHB1dHMgT2JqZWN0IGZvciBwYXJhbWV0ZXJzIHdpdGhvdXQgdHlwZXMsIHdoaWxlIFRyYWNldXIgb21pdHNcbiAgICAgICAgICAgIC8vIHRoZSBhbm5vdGF0aW9ucy4gRm9yIG5vdyB3ZSBwcmVzZXJ2ZSB0aGUgVHJhY2V1ciBiZWhhdmlvciB0byBhaWRcbiAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiwgYnV0IHRoaXMgY2FuIGJlIHJldmlzaXRlZC5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1UeXBlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZXNbaV0gIT0gT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyYW1Bbm5vdGF0aW9ucyAmJiBwYXJhbUFubm90YXRpb25zW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5fb3duUGFyYW1ldGVycyA9IGZ1bmN0aW9uICh0eXBlLCBwYXJlbnRDdG9yKSB7XG4gICAgICAgIHZhciB0eXBlU3RyID0gdHlwZS50b1N0cmluZygpO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRlY29yYXRvcnMsIHdlIG9ubHkgaGF2ZSBmdW5jdGlvbi5sZW5ndGggYXMgbWV0YWRhdGEuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgdG8gZGV0ZWN0IHdoZXRoZXIgYSBjaGlsZCBjbGFzcyBkZWNsYXJlZCBhbiBvd24gY29uc3RydWN0b3Igb3Igbm90LFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGxvb2sgaW5zaWRlIG9mIHRoYXQgY29uc3RydWN0b3IgdG8gY2hlY2sgd2hldGhlciBpdCBpc1xuICAgICAgICAvLyBqdXN0IGNhbGxpbmcgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gVGhpcyBhbHNvIGhlbHBzIHRvIHdvcmsgYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzEyNDM5XG4gICAgICAgIC8vIHRoYXQgc2V0cyAnZGVzaWduOnBhcmFtdHlwZXMnIHRvIFtdXG4gICAgICAgIC8vIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzIGJ1dCBoYXMgbm8gY3RvciBkZWNsYXJlZCBpdHNlbGYuXG4gICAgICAgIGlmIChERUxFR0FURV9DVE9SLmV4ZWModHlwZVN0cikgfHwgSU5IRVJJVEVEX0NMQVNTX1dJVEhfREVMRUdBVEVfQ1RPUi5leGVjKHR5cGVTdHIpIHx8XG4gICAgICAgICAgICAoSU5IRVJJVEVEX0NMQVNTLmV4ZWModHlwZVN0cikgJiYgIUlOSEVSSVRFRF9DTEFTU19XSVRIX0NUT1IuZXhlYyh0eXBlU3RyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS5cbiAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVycyAmJiB0eXBlLnBhcmFtZXRlcnMgIT09IHBhcmVudEN0b3IucGFyYW1ldGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGUucGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy5cbiAgICAgICAgdmFyIHRzaWNrbGVDdG9yUGFyYW1zID0gdHlwZS5jdG9yUGFyYW1ldGVycztcbiAgICAgICAgaWYgKHRzaWNrbGVDdG9yUGFyYW1zICYmIHRzaWNrbGVDdG9yUGFyYW1zICE9PSBwYXJlbnRDdG9yLmN0b3JQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAvLyBOZXdlciB0c2lja2xlIHVzZXMgYSBmdW5jdGlvbiBjbG9zdXJlXG4gICAgICAgICAgICAvLyBSZXRhaW4gdGhlIG5vbi1mdW5jdGlvbiBjYXNlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdHNpY2tsZVxuICAgICAgICAgICAgdmFyIGN0b3JQYXJhbWV0ZXJzID0gdHlwZW9mIHRzaWNrbGVDdG9yUGFyYW1zID09PSAnZnVuY3Rpb24nID8gdHNpY2tsZUN0b3JQYXJhbXMoKSA6IHRzaWNrbGVDdG9yUGFyYW1zO1xuICAgICAgICAgICAgdmFyIHBhcmFtVHlwZXNfMSA9IGN0b3JQYXJhbWV0ZXJzLm1hcChmdW5jdGlvbiAoY3RvclBhcmFtKSB7IHJldHVybiBjdG9yUGFyYW0gJiYgY3RvclBhcmFtLnR5cGU7IH0pO1xuICAgICAgICAgICAgdmFyIHBhcmFtQW5ub3RhdGlvbnNfMSA9IGN0b3JQYXJhbWV0ZXJzLm1hcChmdW5jdGlvbiAoY3RvclBhcmFtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0b3JQYXJhbSAmJiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YShjdG9yUGFyYW0uZGVjb3JhdG9ycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKHBhcmFtVHlwZXNfMSwgcGFyYW1Bbm5vdGF0aW9uc18xKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuXG4gICAgICAgIHZhciBwYXJhbUFubm90YXRpb25zID0gdHlwZS5oYXNPd25Qcm9wZXJ0eShQQVJBTUVURVJTKSAmJiB0eXBlW1BBUkFNRVRFUlNdO1xuICAgICAgICB2YXIgcGFyYW1UeXBlcyA9IHRoaXMuX3JlZmxlY3QgJiYgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSAmJlxuICAgICAgICAgICAgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0eXBlKTtcbiAgICAgICAgaWYgKHBhcmFtVHlwZXMgfHwgcGFyYW1Bbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMocGFyYW1UeXBlcywgcGFyYW1Bbm5vdGF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYSBjbGFzcyBoYXMgbm8gZGVjb3JhdG9ycywgYXQgbGVhc3QgY3JlYXRlIG1ldGFkYXRhXG4gICAgICAgIC8vIGJhc2VkIG9uIGZ1bmN0aW9uLmxlbmd0aC5cbiAgICAgICAgLy8gTm90ZTogV2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIGNvbnN0cnVjdG9yIGFzIHdlIGNoZWNrZWRcbiAgICAgICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnN0cnVjdG9yIGFib3ZlLlxuICAgICAgICByZXR1cm4gbmV3IEFycmF5KHR5cGUubGVuZ3RoKS5maWxsKHVuZGVmaW5lZCk7XG4gICAgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgLy8gTm90ZTogb25seSByZXBvcnQgbWV0YWRhdGEgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2xhc3MgZGVjb3JhdG9yXG4gICAgICAgIC8vIHRvIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBzdGF0aWMgcmVmbGVjdG9yLlxuICAgICAgICBpZiAoIWlzVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRDdG9yID0gZ2V0UGFyZW50Q3Rvcih0eXBlKTtcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLl9vd25QYXJhbWV0ZXJzKHR5cGUsIHBhcmVudEN0b3IpO1xuICAgICAgICBpZiAoIXBhcmFtZXRlcnMgJiYgcGFyZW50Q3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzKHBhcmVudEN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzIHx8IFtdO1xuICAgIH07XG4gICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUuX293bkFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpIHtcbiAgICAgICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLlxuICAgICAgICBpZiAodHlwZU9yRnVuYy5hbm5vdGF0aW9ucyAmJiB0eXBlT3JGdW5jLmFubm90YXRpb25zICE9PSBwYXJlbnRDdG9yLmFubm90YXRpb25zKSB7XG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0eXBlT3JGdW5jLmFubm90YXRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhbm5vdGF0aW9ucyA9PT0gJ2Z1bmN0aW9uJyAmJiBhbm5vdGF0aW9ucy5hbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQVBJIG9mIHRzaWNrbGUgZm9yIGxvd2VyaW5nIGRlY29yYXRvcnMgdG8gcHJvcGVydGllcyBvbiB0aGUgY2xhc3MuXG4gICAgICAgIGlmICh0eXBlT3JGdW5jLmRlY29yYXRvcnMgJiYgdHlwZU9yRnVuYy5kZWNvcmF0b3JzICE9PSBwYXJlbnRDdG9yLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YSh0eXBlT3JGdW5jLmRlY29yYXRvcnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy5cbiAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoQU5OT1RBVElPTlMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZU9yRnVuY1tBTk5PVEFUSU9OU107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5hbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgIGlmICghaXNUeXBlKHR5cGVPckZ1bmMpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudEN0b3IgPSBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpO1xuICAgICAgICB2YXIgb3duQW5ub3RhdGlvbnMgPSB0aGlzLl9vd25Bbm5vdGF0aW9ucyh0eXBlT3JGdW5jLCBwYXJlbnRDdG9yKSB8fCBbXTtcbiAgICAgICAgdmFyIHBhcmVudEFubm90YXRpb25zID0gcGFyZW50Q3RvciAhPT0gT2JqZWN0ID8gdGhpcy5hbm5vdGF0aW9ucyhwYXJlbnRDdG9yKSA6IFtdO1xuICAgICAgICByZXR1cm4gcGFyZW50QW5ub3RhdGlvbnMuY29uY2F0KG93bkFubm90YXRpb25zKTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLl9vd25Qcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYywgcGFyZW50Q3Rvcikge1xuICAgICAgICAvLyBQcmVmZXIgdGhlIGRpcmVjdCBBUEkuXG4gICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAmJlxuICAgICAgICAgICAgdHlwZU9yRnVuYy5wcm9wTWV0YWRhdGEgIT09IHBhcmVudEN0b3IucHJvcE1ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgcHJvcE1ldGFkYXRhID0gdHlwZU9yRnVuYy5wcm9wTWV0YWRhdGE7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BNZXRhZGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgcHJvcE1ldGFkYXRhID0gcHJvcE1ldGFkYXRhLnByb3BNZXRhZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQVBJIG9mIHRzaWNrbGUgZm9yIGxvd2VyaW5nIGRlY29yYXRvcnMgdG8gcHJvcGVydGllcyBvbiB0aGUgY2xhc3MuXG4gICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzICYmXG4gICAgICAgICAgICB0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzICE9PSBwYXJlbnRDdG9yLnByb3BEZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICB2YXIgcHJvcERlY29yYXRvcnNfMSA9IHR5cGVPckZ1bmMucHJvcERlY29yYXRvcnM7XG4gICAgICAgICAgICB2YXIgcHJvcE1ldGFkYXRhXzEgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BEZWNvcmF0b3JzXzEpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFfMVtwcm9wXSA9IGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKHByb3BEZWNvcmF0b3JzXzFbcHJvcF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhXzE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQVBJIGZvciBtZXRhZGF0YSBjcmVhdGVkIGJ5IGludm9raW5nIHRoZSBkZWNvcmF0b3JzLlxuICAgICAgICBpZiAodHlwZU9yRnVuYy5oYXNPd25Qcm9wZXJ0eShQUk9QX01FVEFEQVRBKSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVPckZ1bmNbUFJPUF9NRVRBREFUQV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICBpZiAoIWlzVHlwZSh0eXBlT3JGdW5jKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRDdG9yID0gZ2V0UGFyZW50Q3Rvcih0eXBlT3JGdW5jKTtcbiAgICAgICAgdmFyIHByb3BNZXRhZGF0YSA9IHt9O1xuICAgICAgICBpZiAocGFyZW50Q3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50UHJvcE1ldGFkYXRhXzEgPSB0aGlzLnByb3BNZXRhZGF0YShwYXJlbnRDdG9yKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmVudFByb3BNZXRhZGF0YV8xKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBwYXJlbnRQcm9wTWV0YWRhdGFfMVtwcm9wTmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3duUHJvcE1ldGFkYXRhID0gdGhpcy5fb3duUHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpO1xuICAgICAgICBpZiAob3duUHJvcE1ldGFkYXRhKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvd25Qcm9wTWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcE1ldGFkYXRhLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2guYXBwbHkoZGVjb3JhdG9ycywgX19zcHJlYWQocHJvcE1ldGFkYXRhW3Byb3BOYW1lXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2guYXBwbHkoZGVjb3JhdG9ycywgX19zcHJlYWQob3duUHJvcE1ldGFkYXRhW3Byb3BOYW1lXSkpO1xuICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBkZWNvcmF0b3JzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BNZXRhZGF0YTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLm93blByb3BNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgIGlmICghaXNUeXBlKHR5cGVPckZ1bmMpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpKSB8fCB7fTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmhhc0xpZmVjeWNsZUhvb2sgPSBmdW5jdGlvbiAodHlwZSwgbGNQcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGUgJiYgbGNQcm9wZXJ0eSBpbiB0eXBlLnByb3RvdHlwZTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmd1YXJkcyA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB7fTsgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5nZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ3JldHVybiBvLicgKyBuYW1lICsgJzsnKTsgfTtcbiAgICBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3RvdHlwZS5zZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ3YnLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnID0gdjsnKTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLm1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciBmdW5jdGlvbkJvZHkgPSBcImlmICghby5cIiArIG5hbWUgKyBcIikgdGhyb3cgbmV3IEVycm9yKCdcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGlzIHVuZGVmaW5lZCcpO1xcbiAgICAgICAgcmV0dXJuIG8uXCIgKyBuYW1lICsgXCIuYXBwbHkobywgYXJncyk7XCI7XG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ28nLCAnYXJncycsIGZ1bmN0aW9uQm9keSk7XG4gICAgfTtcbiAgICAvLyBUaGVyZSBpcyBub3QgYSBjb25jZXB0IG9mIGltcG9ydCB1cmkgaW4gSnMsIGJ1dCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXZlbG9waW5nIERhcnQgYXBwbGljYXRpb25zLlxuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLmltcG9ydFVyaSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIC8vIFN0YXRpY1N5bWJvbFxuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGVbJ2ZpbGVQYXRoJ10pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlWydmaWxlUGF0aCddO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJ1bnRpbWUgdHlwZVxuICAgICAgICByZXR1cm4gXCIuL1wiICsgc3RyaW5naWZ5KHR5cGUpO1xuICAgIH07XG4gICAgUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm90b3R5cGUucmVzb3VyY2VVcmkgPSBmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gXCIuL1wiICsgc3RyaW5naWZ5KHR5cGUpOyB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnJlc29sdmVJZGVudGlmaWVyID0gZnVuY3Rpb24gKG5hbWUsIG1vZHVsZVVybCwgbWVtYmVycywgcnVudGltZSkge1xuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9O1xuICAgIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvdG90eXBlLnJlc29sdmVFbnVtID0gZnVuY3Rpb24gKGVudW1JZGVudGlmaWVyLCBuYW1lKSB7IHJldHVybiBlbnVtSWRlbnRpZmllcltuYW1lXTsgfTtcbiAgICByZXR1cm4gUmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbn0oKSk7XG5mdW5jdGlvbiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YShkZWNvcmF0b3JJbnZvY2F0aW9ucykge1xuICAgIGlmICghZGVjb3JhdG9ySW52b2NhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb3JhdG9ySW52b2NhdGlvbnMubWFwKGZ1bmN0aW9uIChkZWNvcmF0b3JJbnZvY2F0aW9uKSB7XG4gICAgICAgIHZhciBkZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9ySW52b2NhdGlvbi50eXBlO1xuICAgICAgICB2YXIgYW5ub3RhdGlvbkNscyA9IGRlY29yYXRvclR5cGUuYW5ub3RhdGlvbkNscztcbiAgICAgICAgdmFyIGFubm90YXRpb25BcmdzID0gZGVjb3JhdG9ySW52b2NhdGlvbi5hcmdzID8gZGVjb3JhdG9ySW52b2NhdGlvbi5hcmdzIDogW107XG4gICAgICAgIHJldHVybiBuZXcgKGFubm90YXRpb25DbHMuYmluZC5hcHBseShhbm5vdGF0aW9uQ2xzLCBfX3NwcmVhZChbdm9pZCAwXSwgYW5ub3RhdGlvbkFyZ3MpKSkoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldFBhcmVudEN0b3IoY3Rvcikge1xuICAgIHZhciBwYXJlbnRQcm90byA9IGN0b3IucHJvdG90eXBlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IucHJvdG90eXBlKSA6IG51bGw7XG4gICAgdmFyIHBhcmVudEN0b3IgPSBwYXJlbnRQcm90byA/IHBhcmVudFByb3RvLmNvbnN0cnVjdG9yIDogbnVsbDtcbiAgICAvLyBOb3RlOiBXZSBhbHdheXMgdXNlIGBPYmplY3RgIGFzIHRoZSBudWxsIHZhbHVlXG4gICAgLy8gdG8gc2ltcGxpZnkgY2hlY2tpbmcgbGF0ZXIgb24uXG4gICAgcmV0dXJuIHBhcmVudEN0b3IgfHwgT2JqZWN0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX3JlZmxlY3QgPSBudWxsO1xuZnVuY3Rpb24gZ2V0UmVmbGVjdCgpIHtcbiAgICByZXR1cm4gKF9yZWZsZWN0ID0gX3JlZmxlY3QgfHwgbmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKSk7XG59XG5mdW5jdGlvbiByZWZsZWN0RGVwZW5kZW5jaWVzKHR5cGUpIHtcbiAgICByZXR1cm4gY29udmVydERlcGVuZGVuY2llcyhnZXRSZWZsZWN0KCkucGFyYW1ldGVycyh0eXBlKSk7XG59XG5mdW5jdGlvbiBjb252ZXJ0RGVwZW5kZW5jaWVzKGRlcHMpIHtcbiAgICB2YXIgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpO1xuICAgIHJldHVybiBkZXBzLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKTsgfSk7XG59XG5mdW5jdGlvbiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSB7XG4gICAgdmFyIG1ldGEgPSB7XG4gICAgICAgIHRva2VuOiBudWxsLFxuICAgICAgICBob3N0OiBmYWxzZSxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICByZXNvbHZlZDogY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLlRva2VuLFxuICAgICAgICBzZWxmOiBmYWxzZSxcbiAgICAgICAgc2tpcFNlbGY6IGZhbHNlLFxuICAgIH07XG4gICAgZnVuY3Rpb24gc2V0VG9rZW5BbmRSZXNvbHZlZFR5cGUodG9rZW4pIHtcbiAgICAgICAgbWV0YS5yZXNvbHZlZCA9IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5Ub2tlbjtcbiAgICAgICAgbWV0YS50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXApKSB7XG4gICAgICAgIGlmIChkZXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcGVuZGVuY3kgYXJyYXkgbXVzdCBoYXZlIGFyZ3VtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRlcC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gZGVwW2pdO1xuICAgICAgICAgICAgaWYgKHBhcmFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBwYXJhbSBtYXkgYmUgdW5kZWZpbmVkIGlmIHR5cGUgb2YgZGVwIGlzIG5vdCBzZXQgYnkgbmd0c2NcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgcGFyYW0uX19wcm90b19fLm5nTWV0YWRhdGFOYW1lID09PSAnT3B0aW9uYWwnKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IHBhcmFtLl9fcHJvdG9fXy5uZ01ldGFkYXRhTmFtZSA9PT0gJ1NraXBTZWxmJykge1xuICAgICAgICAgICAgICAgIG1ldGEuc2tpcFNlbGYgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBTZWxmIHx8IHBhcmFtLl9fcHJvdG9fXy5uZ01ldGFkYXRhTmFtZSA9PT0gJ1NlbGYnKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5zZWxmID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgSG9zdCB8fCBwYXJhbS5fX3Byb3RvX18ubmdNZXRhZGF0YU5hbWUgPT09ICdIb3N0Jykge1xuICAgICAgICAgICAgICAgIG1ldGEuaG9zdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEluamVjdCkge1xuICAgICAgICAgICAgICAgIG1ldGEudG9rZW4gPSBwYXJhbS50b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtLmF0dHJpYnV0ZU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXRhLnRva2VuID0gcGFyYW0uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgICAgICAgICBtZXRhLnJlc29sdmVkID0gY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLkF0dHJpYnV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc2V0VG9rZW5BbmRSZXNvbHZlZFR5cGUoZGVwKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGE7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQ29tcGlsZSBhbiBBbmd1bGFyIGluamVjdGFibGUgYWNjb3JkaW5nIHRvIGl0cyBgSW5qZWN0YWJsZWAgbWV0YWRhdGEsIGFuZCBwYXRjaCB0aGUgcmVzdWx0aW5nXG4gKiBgbmdJbmplY3RhYmxlRGVmYCBvbnRvIHRoZSBpbmplY3RhYmxlIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVJbmplY3RhYmxlKHR5cGUsIHNyY01ldGEpIHtcbiAgICB2YXIgZGVmID0gbnVsbDtcbiAgICAvLyBpZiBOR19JTkpFQ1RBQkxFX0RFRiBpcyBhbHJlYWR5IGRlZmluZWQgb24gdGhpcyBjbGFzcyB0aGVuIGRvbid0IG92ZXJ3cml0ZSBpdFxuICAgIGlmICh0eXBlLmhhc093blByb3BlcnR5KE5HX0lOSkVDVEFCTEVfREVGKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19JTkpFQ1RBQkxFX0RFRiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChkZWYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgY29tcGlsYXRpb24gb2YgYSBjbGFzcyB3aXRoIGEgYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciB3aXRob3V0IHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHNyY01ldGEgfHwgeyBwcm92aWRlZEluOiBudWxsIH07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0FQcm92aWRlciA9IGlzVXNlQ2xhc3NQcm92aWRlcihtZXRhKSB8fCBpc1VzZUZhY3RvcnlQcm92aWRlcihtZXRhKSB8fFxuICAgICAgICAgICAgICAgICAgICBpc1VzZVZhbHVlUHJvdmlkZXIobWV0YSkgfHwgaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpO1xuICAgICAgICAgICAgICAgIHZhciBjb21waWxlck1ldGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkSW46IG1ldGEucHJvdmlkZWRJbixcbiAgICAgICAgICAgICAgICAgICAgY3RvckRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksXG4gICAgICAgICAgICAgICAgICAgIHVzZXJEZXBzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoKGlzVXNlQ2xhc3NQcm92aWRlcihtZXRhKSB8fCBpc1VzZUZhY3RvcnlQcm92aWRlcihtZXRhKSkgJiYgbWV0YS5kZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJNZXRhLnVzZXJEZXBzID0gY29udmVydERlcGVuZGVuY2llcyhtZXRhLmRlcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWhhc0FQcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGUgdXNlciBzcGVjaWZpZXMgYSB0eXBlIHByb3ZpZGVyLCB0cmVhdCBpdCBhcyB7cHJvdmlkZTogWCwgdXNlQ2xhc3M6IFh9LlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVwcyB3aWxsIGhhdmUgYmVlbiByZWZsZWN0ZWQgYWJvdmUsIGNhdXNpbmcgdGhlIGZhY3RvcnkgdG8gY3JlYXRlIHRoZSBjbGFzcyBieVxuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjb25zdHJ1Y3RvciB3aXRoIGluamVjdGVkIGRlcHMuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyTWV0YS51c2VDbGFzcyA9IHR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVXNlQ2xhc3NQcm92aWRlcihtZXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VDbGFzcywgYW5kIG1heSBvciBtYXkgbm90IGhhdmUgcHJvdmlkZWQgZGVwcy5cbiAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJNZXRhLnVzZUNsYXNzID0gbWV0YS51c2VDbGFzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNVc2VWYWx1ZVByb3ZpZGVyKG1ldGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHVzZVZhbHVlLlxuICAgICAgICAgICAgICAgICAgICBjb21waWxlck1ldGEudXNlVmFsdWUgPSBtZXRhLnVzZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1VzZUZhY3RvcnlQcm92aWRlcihtZXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VGYWN0b3J5LlxuICAgICAgICAgICAgICAgICAgICBjb21waWxlck1ldGEudXNlRmFjdG9yeSA9IG1ldGEudXNlRmFjdG9yeTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHVzZUV4aXN0aW5nLlxuICAgICAgICAgICAgICAgICAgICBjb21waWxlck1ldGEudXNlRXhpc3RpbmcgPSBtZXRhLnVzZUV4aXN0aW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgaGFwcGVuIC0gZWl0aGVyIGhhc0FQcm92aWRlciB3aWxsIGJlIGZhbHNlLCBvciBvbmUgb2YgdGhlIHByb3ZpZGVycyB3aWxsIGJlIHNldC5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWFjaGFibGUgc3RhdGUuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWYgPSBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVJbmplY3RhYmxlKGFuZ3VsYXJDb3JlRGlFbnYsIFwibmc6Ly8vXCIgKyB0eXBlLm5hbWUgKyBcIi9uZ0luamVjdGFibGVEZWYuanNcIiwgY29tcGlsZXJNZXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWY7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG52YXIgybUwJDEgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5O1xudmFyIFVTRV9WQUxVRSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkMSB9KTtcbmZ1bmN0aW9uIGlzVXNlQ2xhc3NQcm92aWRlcihtZXRhKSB7XG4gICAgcmV0dXJuIG1ldGEudXNlQ2xhc3MgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGlzVXNlVmFsdWVQcm92aWRlcihtZXRhKSB7XG4gICAgcmV0dXJuIFVTRV9WQUxVRSBpbiBtZXRhO1xufVxuZnVuY3Rpb24gaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkge1xuICAgIHJldHVybiBtZXRhLnVzZUZhY3RvcnkgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGlzVXNlRXhpc3RpbmdQcm92aWRlcihtZXRhKSB7XG4gICAgcmV0dXJuIG1ldGEudXNlRXhpc3RpbmcgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIMm1MCQyID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eTtcbnZhciBVU0VfVkFMVUUkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkMiB9KTtcbnZhciBFTVBUWV9BUlJBWSA9IFtdO1xuZnVuY3Rpb24gY29udmVydEluamVjdGFibGVQcm92aWRlclRvRmFjdG9yeSh0eXBlLCBwcm92aWRlcikge1xuICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBuZXcgUmVmbGVjdGlvbkNhcGFiaWxpdGllcygpO1xuICAgICAgICB2YXIgZGVwc18xID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGUpO1xuICAgICAgICAvLyBUT0RPIC0gY29udmVydCB0byBmbGFncy5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyAodHlwZS5iaW5kLmFwcGx5KHR5cGUsIF9fc3ByZWFkKFt2b2lkIDBdLCBpbmplY3RBcmdzKGRlcHNfMSkpKSkoKTsgfTtcbiAgICB9XG4gICAgaWYgKFVTRV9WQUxVRSQxIGluIHByb3ZpZGVyKSB7XG4gICAgICAgIHZhciB2YWx1ZVByb3ZpZGVyXzEgPSBwcm92aWRlcjtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlUHJvdmlkZXJfMS51c2VWYWx1ZTsgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXJfMSA9IHByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gybXJtWluamVjdChleGlzdGluZ1Byb3ZpZGVyXzEudXNlRXhpc3RpbmcpOyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgIHZhciBmYWN0b3J5UHJvdmlkZXJfMSA9IHByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFjdG9yeVByb3ZpZGVyXzEudXNlRmFjdG9yeS5hcHBseShmYWN0b3J5UHJvdmlkZXJfMSwgX19zcHJlYWQoaW5qZWN0QXJncyhmYWN0b3J5UHJvdmlkZXJfMS5kZXBzIHx8IEVNUFRZX0FSUkFZKSkpOyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChwcm92aWRlci51c2VDbGFzcykge1xuICAgICAgICB2YXIgY2xhc3NQcm92aWRlcl8xID0gcHJvdmlkZXI7XG4gICAgICAgIHZhciBkZXBzXzIgPSBwcm92aWRlci5kZXBzO1xuICAgICAgICBpZiAoIWRlcHNfMikge1xuICAgICAgICAgICAgdmFyIHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBuZXcgUmVmbGVjdGlvbkNhcGFiaWxpdGllcygpO1xuICAgICAgICAgICAgZGVwc18yID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gbmV3ICgoX2EgPSBjbGFzc1Byb3ZpZGVyXzEudXNlQ2xhc3MpLmJpbmQuYXBwbHkoX2EsIF9fc3ByZWFkKFt2b2lkIDBdLCBpbmplY3RBcmdzKGRlcHNfMikpKSkoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBkZXBzXzMgPSBwcm92aWRlci5kZXBzO1xuICAgICAgICBpZiAoIWRlcHNfMykge1xuICAgICAgICAgICAgdmFyIHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBuZXcgUmVmbGVjdGlvbkNhcGFiaWxpdGllcygpO1xuICAgICAgICAgICAgZGVwc18zID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgKHR5cGUuYmluZC5hcHBseSh0eXBlLCBfX3NwcmVhZChbdm9pZCAwXSwgaW5qZWN0QXJncyhkZXBzXzMpKSkpKCk7IH07XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgybUwJDMgPSBmdW5jdGlvbiAodHlwZSwgbWV0YSkgeyByZXR1cm4gU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRSh0eXBlLCBtZXRhKTsgfTtcbi8qKlxuICogSW5qZWN0YWJsZSBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBBbm5vdGF0aW9uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBJbmplY3RhYmxlID0gbWFrZURlY29yYXRvcignSW5qZWN0YWJsZScsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIMm1MCQzKTtcbi8qKlxuICogU3VwcG9ydHMgQEluamVjdGFibGUoKSBpbiBKSVQgbW9kZSBmb3IgUmVuZGVyMi5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyMkNvbXBpbGVJbmplY3RhYmxlKGluamVjdGFibGVUeXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm92aWRlZEluICE9PSB1bmRlZmluZWQgJiYgIWdldEluamVjdGFibGVEZWYoaW5qZWN0YWJsZVR5cGUpKSB7XG4gICAgICAgIGluamVjdGFibGVUeXBlLm5nSW5qZWN0YWJsZURlZiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHtcbiAgICAgICAgICAgIHByb3ZpZGVkSW46IG9wdGlvbnMucHJvdmlkZWRJbixcbiAgICAgICAgICAgIGZhY3Rvcnk6IGNvbnZlcnRJbmplY3RhYmxlUHJvdmlkZXJUb0ZhY3RvcnkoaW5qZWN0YWJsZVR5cGUsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG52YXIgU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUE9TVF9SM19fID0gY29tcGlsZUluamVjdGFibGU7XG52YXIgU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUFJFX1IzX18gPSByZW5kZXIyQ29tcGlsZUluamVjdGFibGU7XG52YXIgU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRSA9IFNXSVRDSF9DT01QSUxFX0lOSkVDVEFCTEVfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENyZWF0ZXMgYSB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIGluIGEgREkgUHJvdmlkZXIuXG4gKlxuICogVXNlIGFuIGBJbmplY3Rpb25Ub2tlbmAgd2hlbmV2ZXIgdGhlIHR5cGUgeW91IGFyZSBpbmplY3RpbmcgaXMgbm90IHJlaWZpZWQgKGRvZXMgbm90IGhhdmUgYVxuICogcnVudGltZSByZXByZXNlbnRhdGlvbikgc3VjaCBhcyB3aGVuIGluamVjdGluZyBhbiBpbnRlcmZhY2UsIGNhbGxhYmxlIHR5cGUsIGFycmF5IG9yXG4gKiBwYXJhbWV0ZXJpemVkIHR5cGUuXG4gKlxuICogYEluamVjdGlvblRva2VuYCBpcyBwYXJhbWV0ZXJpemVkIG9uIGBUYCB3aGljaCBpcyB0aGUgdHlwZSBvZiBvYmplY3Qgd2hpY2ggd2lsbCBiZSByZXR1cm5lZCBieVxuICogdGhlIGBJbmplY3RvcmAuIFRoaXMgcHJvdmlkZXMgYWRkaXRpb25hbCBsZXZlbCBvZiB0eXBlIHNhZmV0eS5cbiAqXG4gKiBgYGBcbiAqIGludGVyZmFjZSBNeUludGVyZmFjZSB7Li4ufVxuICogdmFyIG15SW50ZXJmYWNlID0gaW5qZWN0b3IuZ2V0KG5ldyBJbmplY3Rpb25Ub2tlbjxNeUludGVyZmFjZT4oJ1NvbWVUb2tlbicpKTtcbiAqIC8vIG15SW50ZXJmYWNlIGlzIGluZmVycmVkIHRvIGJlIE15SW50ZXJmYWNlLlxuICogYGBgXG4gKlxuICogV2hlbiBjcmVhdGluZyBhbiBgSW5qZWN0aW9uVG9rZW5gLCB5b3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggcmV0dXJuc1xuICogKHBvc3NpYmx5IGJ5IGNyZWF0aW5nKSBhIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBgVGAuIFRoaXMgc2V0cyB1cCB0aGVcbiAqIGBJbmplY3Rpb25Ub2tlbmAgdXNpbmcgdGhpcyBmYWN0b3J5IGFzIGEgcHJvdmlkZXIgYXMgaWYgaXQgd2FzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGVcbiAqIGFwcGxpY2F0aW9uJ3Mgcm9vdCBpbmplY3Rvci4gSWYgdGhlIGZhY3RvcnkgZnVuY3Rpb24sIHdoaWNoIHRha2VzIHplcm8gYXJndW1lbnRzLCBuZWVkcyB0byBpbmplY3RcbiAqIGRlcGVuZGVuY2llcywgaXQgY2FuIGRvIHNvIHVzaW5nIHRoZSBgaW5qZWN0YCBmdW5jdGlvbi4gU2VlIGJlbG93IGZvciBhbiBleGFtcGxlLlxuICpcbiAqIEFkZGl0aW9uYWxseSwgaWYgYSBgZmFjdG9yeWAgaXMgc3BlY2lmaWVkIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBgcHJvdmlkZWRJbmAgb3B0aW9uLCB3aGljaFxuICogb3ZlcnJpZGVzIHRoZSBhYm92ZSBiZWhhdmlvciBhbmQgbWFya3MgdGhlIHRva2VuIGFzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIgYEBOZ01vZHVsZWAuIEFzXG4gKiBtZW50aW9uZWQgYWJvdmUsIGAncm9vdCdgIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBgcHJvdmlkZWRJbmAuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBCYXNpYyBFeGFtcGxlXG4gKlxuICogIyMjIFBsYWluIEluamVjdGlvblRva2VuXG4gKlxuICoge0BleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J0luamVjdGlvblRva2VuJ31cbiAqXG4gKiAjIyMgVHJlZS1zaGFrYWJsZSBJbmplY3Rpb25Ub2tlblxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdTaGFrYWJsZUluamVjdGlvblRva2VuJ31cbiAqXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgSW5qZWN0aW9uVG9rZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5qZWN0aW9uVG9rZW4oX2Rlc2MsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fZGVzYyA9IF9kZXNjO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMubmdNZXRhZGF0YU5hbWUgPSAnSW5qZWN0aW9uVG9rZW4nO1xuICAgICAgICB0aGlzLm5nSW5qZWN0YWJsZURlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBoYWNrIHRvIGFzc2lnbiBfX05HX0VMRU1FTlRfSURfXyB0byB0aGlzIGluc3RhbmNlLlxuICAgICAgICAgICAgLy8gX19OR19FTEVNRU5UX0lEX18gaXMgVXNlZCBieSBJdnkgdG8gZGV0ZXJtaW5lIGJsb29tIGZpbHRlciBpZC5cbiAgICAgICAgICAgIC8vIFdlIGFyZSB1c2luZyBpdCB0byBhc3NpZ24gYC0xYCB3aGljaCBpcyB1c2VkIHRvIGlkZW50aWZ5IGBJbmplY3RvcmAuXG4gICAgICAgICAgICB0aGlzLl9fTkdfRUxFTUVOVF9JRF9fID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmdJbmplY3RhYmxlRGVmID0gybXJtWRlZmluZUluamVjdGFibGUoe1xuICAgICAgICAgICAgICAgIHByb3ZpZGVkSW46IG9wdGlvbnMucHJvdmlkZWRJbiB8fCAncm9vdCcsXG4gICAgICAgICAgICAgICAgZmFjdG9yeTogb3B0aW9ucy5mYWN0b3J5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgSW5qZWN0aW9uVG9rZW4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJJbmplY3Rpb25Ub2tlbiBcIiArIHRoaXMuX2Rlc2M7IH07XG4gICAgcmV0dXJuIEluamVjdGlvblRva2VuO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFNPVVJDRSA9ICdfX3NvdXJjZSc7XG52YXIgX1RIUk9XX0lGX05PVF9GT1VORCA9IG5ldyBPYmplY3QoKTtcbnZhciBUSFJPV19JRl9OT1RfRk9VTkQgPSBfVEhST1dfSUZfTk9UX0ZPVU5EO1xuLyoqXG4gKiBBbiBJbmplY3Rpb25Ub2tlbiB0aGF0IGdldHMgdGhlIGN1cnJlbnQgYEluamVjdG9yYCBmb3IgYGNyZWF0ZUluamVjdG9yKClgLXN0eWxlIGluamVjdG9ycy5cbiAqXG4gKiBSZXF1ZXN0aW5nIHRoaXMgdG9rZW4gaW5zdGVhZCBvZiBgSW5qZWN0b3JgIGFsbG93cyBgU3RhdGljSW5qZWN0b3JgIHRvIGJlIHRyZWUtc2hha2VuIGZyb20gYVxuICogcHJvamVjdC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBJTkpFQ1RPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignSU5KRUNUT1InLCAtMSAvLyBgLTFgIGlzIHVzZWQgYnkgSXZ5IERJIHN5c3RlbSBhcyBzcGVjaWFsIHZhbHVlIHRvIHJlY29nbml6ZSBpdCBhcyBgSW5qZWN0b3JgLlxuKTtcbnZhciBOdWxsSW5qZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTnVsbEluamVjdG9yKCkge1xuICAgIH1cbiAgICBOdWxsSW5qZWN0b3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0b2tlbiwgbm90Rm91bmRWYWx1ZSkge1xuICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSA9PT0gdm9pZCAwKSB7IG5vdEZvdW5kVmFsdWUgPSBfVEhST1dfSUZfTk9UX0ZPVU5EOyB9XG4gICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSBfVEhST1dfSUZfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgYmVoaW5kOiBXaXRoIGRldiB0b29scyBvcGVuIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaGVyZS4gVGhlcmUgaXMgbm9cbiAgICAgICAgICAgIC8vIHJlYXNvbiB3aHkgY29ycmVjdGx5IHdyaXR0ZW4gYXBwbGljYXRpb24gc2hvdWxkIGNhdXNlIHRoaXMgZXhjZXB0aW9uLlxuICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IHVuY29tbWVudCB0aGUgbmV4dCBsaW5lIG9uY2UgYG5nRGV2TW9kZWAgd29ya3Mgd2l0aCBjbG9zdXJlLlxuICAgICAgICAgICAgLy8gaWYobmdEZXZNb2RlKSBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcIk51bGxJbmplY3RvckVycm9yOiBObyBwcm92aWRlciBmb3IgXCIgKyBzdHJpbmdpZnkodG9rZW4pICsgXCIhXCIpO1xuICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdOdWxsSW5qZWN0b3JFcnJvcic7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBOdWxsSW5qZWN0b3I7XG59KCkpO1xuLyoqXG4gKiBDb25jcmV0ZSBpbmplY3RvcnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICpcbiAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW1wiRGVwZW5kZW5jeSBJbmplY3Rpb24gR3VpZGVcIl0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24pLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdJbmplY3Rvcid9XG4gKlxuICogYEluamVjdG9yYCByZXR1cm5zIGl0c2VsZiB3aGVuIGdpdmVuIGBJbmplY3RvcmAgYXMgYSB0b2tlbjpcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0naW5qZWN0SW5qZWN0b3InfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEluamVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluamVjdG9yKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSW5qZWN0b3Igd2hpY2ggaXMgY29uZmlndXJlIHVzaW5nIGBTdGF0aWNQcm92aWRlcmBzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICoge0BleGFtcGxlIGNvcmUvZGkvdHMvcHJvdmlkZXJfc3BlYy50cyByZWdpb249J0NvbnN0cnVjdG9yUHJvdmlkZXInfVxuICAgICAqL1xuICAgIEluamVjdG9yLmNyZWF0ZSA9IGZ1bmN0aW9uIChvcHRpb25zLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGljSW5qZWN0b3Iob3B0aW9ucywgcGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGljSW5qZWN0b3Iob3B0aW9ucy5wcm92aWRlcnMsIG9wdGlvbnMucGFyZW50LCBvcHRpb25zLm5hbWUgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORCA9IF9USFJPV19JRl9OT1RfRk9VTkQ7XG4gICAgSW5qZWN0b3IuTlVMTCA9IG5ldyBOdWxsSW5qZWN0b3IoKTtcbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBJbmplY3Rvci5uZ0luamVjdGFibGVEZWYgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7XG4gICAgICAgIHByb3ZpZGVkSW46ICdhbnknLFxuICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbiAoKSB7IHJldHVybiDJtcm1aW5qZWN0KElOSkVDVE9SKTsgfSxcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIEluamVjdG9yLl9fTkdfRUxFTUVOVF9JRF9fID0gLTE7XG4gICAgcmV0dXJuIEluamVjdG9yO1xufSgpKTtcbnZhciBJREVOVCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgRU1QVFkgPSBbXTtcbnZhciBDSVJDVUxBUiA9IElERU5UO1xudmFyIE1VTFRJX1BST1ZJREVSX0ZOID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xufTtcbnZhciDJtTIgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5O1xudmFyIFVTRV9WQUxVRSQyID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IHByb3ZpZGU6IFN0cmluZywgdXNlVmFsdWU6IMm1MiB9KTtcbnZhciBOR19UT0tFTl9QQVRIID0gJ25nVG9rZW5QYXRoJztcbnZhciBOR19URU1QX1RPS0VOX1BBVEggPSAnbmdUZW1wVG9rZW5QYXRoJztcbnZhciBORVdfTElORSA9IC9cXG4vZ207XG52YXIgTk9fTkVXX0xJTkUgPSAnybUnO1xudmFyIFN0YXRpY0luamVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0YXRpY0luamVjdG9yKHByb3ZpZGVycywgcGFyZW50LCBzb3VyY2UpIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gdm9pZCAwKSB7IHBhcmVudCA9IEluamVjdG9yLk5VTEw7IH1cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdm9pZCAwKSB7IHNvdXJjZSA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICB2YXIgcmVjb3JkcyA9IHRoaXMuX3JlY29yZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJlY29yZHMuc2V0KEluamVjdG9yLCB7IHRva2VuOiBJbmplY3RvciwgZm46IElERU5ULCBkZXBzOiBFTVBUWSwgdmFsdWU6IHRoaXMsIHVzZU5ldzogZmFsc2UgfSk7XG4gICAgICAgIHJlY29yZHMuc2V0KElOSkVDVE9SLCB7IHRva2VuOiBJTkpFQ1RPUiwgZm46IElERU5ULCBkZXBzOiBFTVBUWSwgdmFsdWU6IHRoaXMsIHVzZU5ldzogZmFsc2UgfSk7XG4gICAgICAgIHJlY3Vyc2l2ZWx5UHJvY2Vzc1Byb3ZpZGVycyhyZWNvcmRzLCBwcm92aWRlcnMpO1xuICAgIH1cbiAgICBTdGF0aWNJbmplY3Rvci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncykge1xuICAgICAgICBpZiAoZmxhZ3MgPT09IHZvaWQgMCkgeyBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7IH1cbiAgICAgICAgdmFyIHJlY29yZCA9IHRoaXMuX3JlY29yZHMuZ2V0KHRva2VuKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0cnlSZXNvbHZlVG9rZW4odG9rZW4sIHJlY29yZCwgdGhpcy5fcmVjb3JkcywgdGhpcy5wYXJlbnQsIG5vdEZvdW5kVmFsdWUsIGZsYWdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhdGNoSW5qZWN0b3JFcnJvcihlLCB0b2tlbiwgJ1N0YXRpY0luamVjdG9yRXJyb3InLCB0aGlzLnNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YXRpY0luamVjdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRva2VucyA9IFtdLCByZWNvcmRzID0gdGhpcy5fcmVjb3JkcztcbiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh2LCB0b2tlbikgeyByZXR1cm4gdG9rZW5zLnB1c2goc3RyaW5naWZ5KHRva2VuKSk7IH0pO1xuICAgICAgICByZXR1cm4gXCJTdGF0aWNJbmplY3RvcltcIiArIHRva2Vucy5qb2luKCcsICcpICsgXCJdXCI7XG4gICAgfTtcbiAgICByZXR1cm4gU3RhdGljSW5qZWN0b3I7XG59KCkpO1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgdmFyIGRlcHMgPSBjb21wdXRlRGVwcyhwcm92aWRlcik7XG4gICAgdmFyIGZuID0gSURFTlQ7XG4gICAgdmFyIHZhbHVlID0gRU1QVFk7XG4gICAgdmFyIHVzZU5ldyA9IGZhbHNlO1xuICAgIHZhciBwcm92aWRlID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7XG4gICAgaWYgKFVTRV9WQUxVRSQyIGluIHByb3ZpZGVyKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIFVTRV9WQUxVRSBpbiBwcm92aWRlciBzaW5jZSBwcm92aWRlci51c2VWYWx1ZSBjb3VsZCBiZSBkZWZpbmVkIGFzIHVuZGVmaW5lZC5cbiAgICAgICAgdmFsdWUgPSBwcm92aWRlci51c2VWYWx1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSkge1xuICAgICAgICBmbiA9IHByb3ZpZGVyLnVzZUZhY3Rvcnk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSA7XG4gICAgZWxzZSBpZiAocHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgdXNlTmV3ID0gdHJ1ZTtcbiAgICAgICAgZm4gPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VDbGFzcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwcm92aWRlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdXNlTmV3ID0gdHJ1ZTtcbiAgICAgICAgZm4gPSBwcm92aWRlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgc3RhdGljRXJyb3IoJ1N0YXRpY1Byb3ZpZGVyIGRvZXMgbm90IGhhdmUgW3VzZVZhbHVlfHVzZUZhY3Rvcnl8dXNlRXhpc3Rpbmd8dXNlQ2xhc3NdIG9yIFtwcm92aWRlXSBpcyBub3QgbmV3YWJsZScsIHByb3ZpZGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZGVwczogZGVwcywgZm46IGZuLCB1c2VOZXc6IHVzZU5ldywgdmFsdWU6IHZhbHVlIH07XG59XG5mdW5jdGlvbiBtdWx0aVByb3ZpZGVyTWl4RXJyb3IodG9rZW4pIHtcbiAgICByZXR1cm4gc3RhdGljRXJyb3IoJ0Nhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycycsIHRva2VuKTtcbn1cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UHJvY2Vzc1Byb3ZpZGVycyhyZWNvcmRzLCBwcm92aWRlcikge1xuICAgIGlmIChwcm92aWRlcikge1xuICAgICAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTtcbiAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gYXJyYXkgcmVjdXJzZSBpbnRvIHRoZSBhcnJheVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5UHJvY2Vzc1Byb3ZpZGVycyhyZWNvcmRzLCBwcm92aWRlcltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBGdW5jdGlvbnMgd2VyZSBzdXBwb3J0ZWQgaW4gUmVmbGVjdGl2ZUluamVjdG9yLCBidXQgYXJlIG5vdCBoZXJlLiBGb3Igc2FmZXR5IGdpdmUgdXNlZnVsXG4gICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlc1xuICAgICAgICAgICAgdGhyb3cgc3RhdGljRXJyb3IoJ0Z1bmN0aW9uL0NsYXNzIG5vdCBzdXBwb3J0ZWQnLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIgJiYgdHlwZW9mIHByb3ZpZGVyID09PSAnb2JqZWN0JyAmJiBwcm92aWRlci5wcm92aWRlKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgd2hhdCBsb29rcyBsaWtlIGEgcHJvdmlkZXI6IHtwcm92aWRlOiA/LCAuLi4ufVxuICAgICAgICAgICAgdmFyIHRva2VuID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7XG4gICAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbXVsdGkgcHJvdmlkZXIuXG4gICAgICAgICAgICAgICAgdmFyIG11bHRpUHJvdmlkZXIgPSByZWNvcmRzLmdldCh0b2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKG11bHRpUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpUHJvdmlkZXIuZm4gIT09IE1VTFRJX1BST1ZJREVSX0ZOKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtdWx0aVByb3ZpZGVyTWl4RXJyb3IodG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBwbGFjZWhvbGRlciBmYWN0b3J5IHdoaWNoIHdpbGwgbG9vayB1cCB0aGUgY29uc3RpdHVlbnRzIG9mIHRoZSBtdWx0aSBwcm92aWRlci5cbiAgICAgICAgICAgICAgICAgICAgcmVjb3Jkcy5zZXQodG9rZW4sIG11bHRpUHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcHJvdmlkZXIucHJvdmlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlTmV3OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBNVUxUSV9QUk9WSURFUl9GTixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBFTVBUWVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVHJlYXQgdGhlIHByb3ZpZGVyIGFzIHRoZSB0b2tlbi5cbiAgICAgICAgICAgICAgICB0b2tlbiA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIG11bHRpUHJvdmlkZXIuZGVwcy5wdXNoKHsgdG9rZW46IHRva2VuLCBvcHRpb25zOiA2IC8qIERlZmF1bHQgKi8gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVjb3JkID0gcmVjb3Jkcy5nZXQodG9rZW4pO1xuICAgICAgICAgICAgaWYgKHJlY29yZCAmJiByZWNvcmQuZm4gPT0gTVVMVElfUFJPVklERVJfRk4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBtdWx0aVByb3ZpZGVyTWl4RXJyb3IodG9rZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3Jkcy5zZXQodG9rZW4sIHJlc29sdmVkUHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgc3RhdGljRXJyb3IoJ1VuZXhwZWN0ZWQgcHJvdmlkZXInLCBwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB0cnlSZXNvbHZlVG9rZW4odG9rZW4sIHJlY29yZCwgcmVjb3JkcywgcGFyZW50LCBub3RGb3VuZFZhbHVlLCBmbGFncykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVG9rZW4odG9rZW4sIHJlY29yZCwgcmVjb3JkcywgcGFyZW50LCBub3RGb3VuZFZhbHVlLCBmbGFncyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVuc3VyZSB0aGF0ICdlJyBpcyBvZiB0eXBlIEVycm9yLlxuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICBlID0gbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gZVtOR19URU1QX1RPS0VOX1BBVEhdID0gZVtOR19URU1QX1RPS0VOX1BBVEhdIHx8IFtdO1xuICAgICAgICBwYXRoLnVuc2hpZnQodG9rZW4pO1xuICAgICAgICBpZiAocmVjb3JkICYmIHJlY29yZC52YWx1ZSA9PSBDSVJDVUxBUikge1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIENpcmN1bGFyIGZsYWcuXG4gICAgICAgICAgICByZWNvcmQudmFsdWUgPSBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVUb2tlbih0b2tlbiwgcmVjb3JkLCByZWNvcmRzLCBwYXJlbnQsIG5vdEZvdW5kVmFsdWUsIGZsYWdzKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAocmVjb3JkICYmICEoZmxhZ3MgJiBJbmplY3RGbGFncy5Ta2lwU2VsZikpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlY29yZCwgdGhpcyBpbXBsaWVzIHRoYXQgd2UgZG9uJ3Qgb3duIHRoZSBwcm92aWRlciBoZW5jZSBkb24ndCBrbm93IGhvd1xuICAgICAgICAvLyB0byByZXNvbHZlIGl0LlxuICAgICAgICB2YWx1ZSA9IHJlY29yZC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09IENJUkNVTEFSKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihOT19ORVdfTElORSArICdDaXJjdWxhciBkZXBlbmRlbmN5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IEVNUFRZKSB7XG4gICAgICAgICAgICByZWNvcmQudmFsdWUgPSBDSVJDVUxBUjtcbiAgICAgICAgICAgIHZhciBvYmogPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgdXNlTmV3ID0gcmVjb3JkLnVzZU5ldztcbiAgICAgICAgICAgIHZhciBmbiA9IHJlY29yZC5mbjtcbiAgICAgICAgICAgIHZhciBkZXBSZWNvcmRzID0gcmVjb3JkLmRlcHM7XG4gICAgICAgICAgICB2YXIgZGVwcyA9IEVNUFRZO1xuICAgICAgICAgICAgaWYgKGRlcFJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGVwcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwUmVjb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVwUmVjb3JkID0gZGVwUmVjb3Jkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBkZXBSZWNvcmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkUmVjb3JkID0gb3B0aW9ucyAmIDIgLyogQ2hlY2tTZWxmICovID8gcmVjb3Jkcy5nZXQoZGVwUmVjb3JkLnRva2VuKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgZGVwcy5wdXNoKHRyeVJlc29sdmVUb2tlbihcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBUb2tlbiB0byByZXNvbHZlXG4gICAgICAgICAgICAgICAgICAgIGRlcFJlY29yZC50b2tlbiwgXG4gICAgICAgICAgICAgICAgICAgIC8vIEEgcmVjb3JkIHdoaWNoIGRlc2NyaWJlcyBob3cgdG8gcmVzb2x2ZSB0aGUgdG9rZW4uXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCwgdGhpcyBtZWFucyB3ZSBkb24ndCBoYXZlIHN1Y2ggYSByZWNvcmRcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRSZWNvcmQsIFxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciByZWNvcmRzIHdlIGtub3cgYWJvdXQuXG4gICAgICAgICAgICAgICAgICAgIHJlY29yZHMsIFxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZXNvbHZlIGRlcGVuZGVuY3kgYW5kIHdlIHNob3VsZCBub3QgY2hlY2sgcGFyZW50IGZvciBpdCxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBwYXNzIGluIE51bGwgaW5qZWN0b3IuXG4gICAgICAgICAgICAgICAgICAgICFjaGlsZFJlY29yZCAmJiAhKG9wdGlvbnMgJiA0IC8qIENoZWNrUGFyZW50ICovKSA/IEluamVjdG9yLk5VTEwgOiBwYXJlbnQsIG9wdGlvbnMgJiAxIC8qIE9wdGlvbmFsICovID8gbnVsbCA6IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORCwgSW5qZWN0RmxhZ3MuRGVmYXVsdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZC52YWx1ZSA9IHZhbHVlID0gdXNlTmV3ID8gbmV3ICgoX2EgPSBmbikuYmluZC5hcHBseShfYSwgX19zcHJlYWQoW3ZvaWQgMF0sIGRlcHMpKSkoKSA6IGZuLmFwcGx5KG9iaiwgZGVwcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoIShmbGFncyAmIEluamVjdEZsYWdzLlNlbGYpKSB7XG4gICAgICAgIHZhbHVlID0gcGFyZW50LmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgSW5qZWN0RmxhZ3MuRGVmYXVsdCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVEZXBzKHByb3ZpZGVyKSB7XG4gICAgdmFyIGRlcHMgPSBFTVBUWTtcbiAgICB2YXIgcHJvdmlkZXJEZXBzID0gcHJvdmlkZXIuZGVwcztcbiAgICBpZiAocHJvdmlkZXJEZXBzICYmIHByb3ZpZGVyRGVwcy5sZW5ndGgpIHtcbiAgICAgICAgZGVwcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVyRGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSA2IC8qIERlZmF1bHQgKi87XG4gICAgICAgICAgICB2YXIgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlckRlcHNbaV0pO1xuICAgICAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgYW5ub3RhdGlvbnMgPSB0b2tlbjsgaiA8IGFubm90YXRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgYW5ub3RhdGlvbiA9PSBPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfCAxIC8qIE9wdGlvbmFsICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBTa2lwU2VsZiB8fCBhbm5vdGF0aW9uID09IFNraXBTZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyAmIH4yIC8qIENoZWNrU2VsZiAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgU2VsZiB8fCBhbm5vdGF0aW9uID09IFNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zICYgfjQgLyogQ2hlY2tQYXJlbnQgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEluamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBhbm5vdGF0aW9uLnRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZihhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcHMucHVzaCh7IHRva2VuOiB0b2tlbiwgb3B0aW9uczogb3B0aW9ucyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChwcm92aWRlci51c2VFeGlzdGluZykge1xuICAgICAgICB2YXIgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VFeGlzdGluZyk7XG4gICAgICAgIGRlcHMgPSBbeyB0b2tlbjogdG9rZW4sIG9wdGlvbnM6IDYgLyogRGVmYXVsdCAqLyB9XTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXByb3ZpZGVyRGVwcyAmJiAhKFVTRV9WQUxVRSQyIGluIHByb3ZpZGVyKSkge1xuICAgICAgICAvLyB1c2VWYWx1ZSAmIHVzZUV4aXN0aW5nIGFyZSB0aGUgb25seSBvbmVzIHdoaWNoIGFyZSBleGVtcHQgZnJvbSBkZXBzIGFsbCBvdGhlcnMgbmVlZCBpdC5cbiAgICAgICAgdGhyb3cgc3RhdGljRXJyb3IoJ1xcJ2RlcHNcXCcgcmVxdWlyZWQnLCBwcm92aWRlcik7XG4gICAgfVxuICAgIHJldHVybiBkZXBzO1xufVxuZnVuY3Rpb24gY2F0Y2hJbmplY3RvckVycm9yKGUsIHRva2VuLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKSB7XG4gICAgdmFyIHRva2VuUGF0aCA9IGVbTkdfVEVNUF9UT0tFTl9QQVRIXTtcbiAgICBpZiAodG9rZW5bU09VUkNFXSkge1xuICAgICAgICB0b2tlblBhdGgudW5zaGlmdCh0b2tlbltTT1VSQ0VdKTtcbiAgICB9XG4gICAgZS5tZXNzYWdlID0gZm9ybWF0RXJyb3IoJ1xcbicgKyBlLm1lc3NhZ2UsIHRva2VuUGF0aCwgaW5qZWN0b3JFcnJvck5hbWUsIHNvdXJjZSk7XG4gICAgZVtOR19UT0tFTl9QQVRIXSA9IHRva2VuUGF0aDtcbiAgICBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBudWxsO1xuICAgIHRocm93IGU7XG59XG5mdW5jdGlvbiBmb3JtYXRFcnJvcih0ZXh0LCBvYmosIGluamVjdG9yRXJyb3JOYW1lLCBzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlID09PSB2b2lkIDApIHsgc291cmNlID0gbnVsbDsgfVxuICAgIHRleHQgPSB0ZXh0ICYmIHRleHQuY2hhckF0KDApID09PSAnXFxuJyAmJiB0ZXh0LmNoYXJBdCgxKSA9PSBOT19ORVdfTElORSA/IHRleHQuc3Vic3RyKDIpIDogdGV4dDtcbiAgICB2YXIgY29udGV4dCA9IHN0cmluZ2lmeShvYmopO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBjb250ZXh0ID0gb2JqLm1hcChzdHJpbmdpZnkpLmpvaW4oJyAtPiAnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goa2V5ICsgJzonICsgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBzdHJpbmdpZnkodmFsdWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dCA9IFwie1wiICsgcGFydHMuam9pbignLCAnKSArIFwifVwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIGluamVjdG9yRXJyb3JOYW1lICsgKHNvdXJjZSA/ICcoJyArIHNvdXJjZSArICcpJyA6ICcnKSArIFwiW1wiICsgY29udGV4dCArIFwiXTogXCIgKyB0ZXh0LnJlcGxhY2UoTkVXX0xJTkUsICdcXG4gICcpO1xufVxuZnVuY3Rpb24gc3RhdGljRXJyb3IodGV4dCwgb2JqKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihmb3JtYXRFcnJvcih0ZXh0LCBvYmosICdTdGF0aWNJbmplY3RvckVycm9yJykpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRVJST1JfREVCVUdfQ09OVEVYVCA9ICduZ0RlYnVnQ29udGV4dCc7XG52YXIgRVJST1JfT1JJR0lOQUxfRVJST1IgPSAnbmdPcmlnaW5hbEVycm9yJztcbnZhciBFUlJPUl9MT0dHRVIgPSAnbmdFcnJvckxvZ2dlcic7XG5mdW5jdGlvbiB3cmFwcGVkRXJyb3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikge1xuICAgIHZhciBtc2cgPSBtZXNzYWdlICsgXCIgY2F1c2VkIGJ5OiBcIiArIChvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBvcmlnaW5hbEVycm9yLm1lc3NhZ2UgOiBvcmlnaW5hbEVycm9yKTtcbiAgICB2YXIgZXJyb3IgPSBFcnJvcihtc2cpO1xuICAgIGVycm9yW0VSUk9SX09SSUdJTkFMX0VSUk9SXSA9IG9yaWdpbmFsRXJyb3I7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBmaW5kRmlyc3RDbG9zZWRDeWNsZShrZXlzKSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAocmVzLmluZGV4T2Yoa2V5c1tpXSkgPiAtMSkge1xuICAgICAgICAgICAgcmVzLnB1c2goa2V5c1tpXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5wdXNoKGtleXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKSB7XG4gICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgcmV2ZXJzZWQgPSBmaW5kRmlyc3RDbG9zZWRDeWNsZShrZXlzLnNsaWNlKCkucmV2ZXJzZSgpKTtcbiAgICAgICAgdmFyIHRva2VuU3RycyA9IHJldmVyc2VkLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gc3RyaW5naWZ5KGsudG9rZW4pOyB9KTtcbiAgICAgICAgcmV0dXJuICcgKCcgKyB0b2tlblN0cnMuam9pbignIC0+ICcpICsgJyknO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5mdW5jdGlvbiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgdmFyIGtleXMgPSBba2V5XTtcbiAgICB2YXIgZXJyTXNnID0gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZShrZXlzKTtcbiAgICB2YXIgZXJyb3IgPSAob3JpZ2luYWxFcnJvciA/IHdyYXBwZWRFcnJvcihlcnJNc2csIG9yaWdpbmFsRXJyb3IpIDogRXJyb3IoZXJyTXNnKSk7XG4gICAgZXJyb3IuYWRkS2V5ID0gYWRkS2V5O1xuICAgIGVycm9yLmtleXMgPSBrZXlzO1xuICAgIGVycm9yLmluamVjdG9ycyA9IFtpbmplY3Rvcl07XG4gICAgZXJyb3IuY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSA9IGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U7XG4gICAgZXJyb3JbRVJST1JfT1JJR0lOQUxfRVJST1JdID0gb3JpZ2luYWxFcnJvcjtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiBhZGRLZXkoaW5qZWN0b3IsIGtleSkge1xuICAgIHRoaXMuaW5qZWN0b3JzLnB1c2goaW5qZWN0b3IpO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gICAgLy8gTm90ZTogVGhpcyB1cGRhdGVkIG1lc3NhZ2Ugd29uJ3QgYmUgcmVmbGVjdGVkIGluIHRoZSBgLnN0YWNrYCBwcm9wZXJ0eVxuICAgIHRoaXMubWVzc2FnZSA9IHRoaXMuY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSh0aGlzLmtleXMpO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0cnlpbmcgdG8gcmV0cmlldmUgYSBkZXBlbmRlbmN5IGJ5IGtleSBmcm9tIHtAbGluayBJbmplY3Rvcn0sIGJ1dCB0aGVcbiAqIHtAbGluayBJbmplY3Rvcn0gZG9lcyBub3QgaGF2ZSBhIHtAbGluayBQcm92aWRlcn0gZm9yIHRoZSBnaXZlbiBrZXkuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKGI6Qikge31cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBub1Byb3ZpZGVyRXJyb3IoaW5qZWN0b3IsIGtleSkge1xuICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBmdW5jdGlvbiAoa2V5cykge1xuICAgICAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoa2V5c1swXS50b2tlbik7XG4gICAgICAgIHJldHVybiBcIk5vIHByb3ZpZGVyIGZvciBcIiArIGZpcnN0ICsgXCIhXCIgKyBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBkZXBlbmRlbmNpZXMgZm9ybSBhIGN5Y2xlLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICB7cHJvdmlkZTogXCJvbmVcIiwgdXNlRmFjdG9yeTogKHR3bykgPT4gXCJ0d29cIiwgZGVwczogW1tuZXcgSW5qZWN0KFwidHdvXCIpXV19LFxuICogICB7cHJvdmlkZTogXCJ0d29cIiwgdXNlRmFjdG9yeTogKG9uZSkgPT4gXCJvbmVcIiwgZGVwczogW1tuZXcgSW5qZWN0KFwib25lXCIpXV19XG4gKiBdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KFwib25lXCIpKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICpcbiAqIFJldHJpZXZpbmcgYEFgIG9yIGBCYCB0aHJvd3MgYSBgQ3ljbGljRGVwZW5kZW5jeUVycm9yYCBhcyB0aGUgZ3JhcGggYWJvdmUgY2Fubm90IGJlIGNvbnN0cnVjdGVkLlxuICovXG5mdW5jdGlvbiBjeWNsaWNEZXBlbmRlbmN5RXJyb3IoaW5qZWN0b3IsIGtleSkge1xuICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBmdW5jdGlvbiAoa2V5cykge1xuICAgICAgICByZXR1cm4gXCJDYW5ub3QgaW5zdGFudGlhdGUgY3ljbGljIGRlcGVuZGVuY3khXCIgKyBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNvbnN0cnVjdGluZyB0eXBlIHJldHVybnMgd2l0aCBhbiBFcnJvci5cbiAqXG4gKiBUaGUgYEluc3RhbnRpYXRpb25FcnJvcmAgY2xhc3MgY29udGFpbnMgdGhlIG9yaWdpbmFsIGVycm9yIHBsdXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggd2hpY2ggY2F1c2VkXG4gKiB0aGlzIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZScpO1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pO1xuXG4gKiB0cnkge1xuICogICBpbmplY3Rvci5nZXQoQSk7XG4gKiB9IGNhdGNoIChlKSB7XG4gKiAgIGV4cGVjdChlIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvbkVycm9yKS50b0JlKHRydWUpO1xuICogICBleHBlY3QoZS5vcmlnaW5hbEV4Y2VwdGlvbi5tZXNzYWdlKS50b0VxdWFsKFwibWVzc2FnZVwiKTtcbiAqICAgZXhwZWN0KGUub3JpZ2luYWxTdGFjaykudG9CZURlZmluZWQoKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpbnN0YW50aWF0aW9uRXJyb3IoaW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXkpIHtcbiAgICByZXR1cm4gaW5qZWN0aW9uRXJyb3IoaW5qZWN0b3IsIGtleSwgZnVuY3Rpb24gKGtleXMpIHtcbiAgICAgICAgdmFyIGZpcnN0ID0gc3RyaW5naWZ5KGtleXNbMF0udG9rZW4pO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxFeGNlcHRpb24ubWVzc2FnZSArIFwiOiBFcnJvciBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiBcIiArIGZpcnN0ICsgXCIhXCIgKyBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpICsgXCIuXCI7XG4gICAgfSwgb3JpZ2luYWxFeGNlcHRpb24pO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBhbiBvYmplY3Qgb3RoZXIgdGhlbiB7QGxpbmsgUHJvdmlkZXJ9IChvciBgVHlwZWApIGlzIHBhc3NlZCB0byB7QGxpbmsgSW5qZWN0b3J9XG4gKiBjcmVhdGlvbi5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXCJub3QgYSB0eXBlXCJdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gaW52YWxpZFByb3ZpZGVyRXJyb3IocHJvdmlkZXIpIHtcbiAgICByZXR1cm4gRXJyb3IoXCJJbnZhbGlkIHByb3ZpZGVyIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogXCIgKyBwcm92aWRlcik7XG59XG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBjbGFzcyBoYXMgbm8gYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBMYWNrIG9mIGFubm90YXRpb24gaW5mb3JtYXRpb24gcHJldmVudHMgdGhlIHtAbGluayBJbmplY3Rvcn0gZnJvbSBkZXRlcm1pbmluZyB3aGljaCBkZXBlbmRlbmNpZXNcbiAqIG5lZWQgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgY29uc3RydWN0b3IuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKGIpIHt9XG4gKiB9XG4gKlxuICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGVycm9yIGlzIGFsc28gdGhyb3duIHdoZW4gdGhlIGNsYXNzIG5vdCBtYXJrZWQgd2l0aCB7QGxpbmsgSW5qZWN0YWJsZX0gaGFzIHBhcmFtZXRlciB0eXBlcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBCIHt9XG4gKlxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKGI6Qikge30gLy8gbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBBIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICogfVxuICpcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBLEJdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqXG4gKi9cbmZ1bmN0aW9uIG5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcykge1xuICAgIHZhciBzaWduYXR1cmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXJhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgcGFyYW1ldGVyID0gcGFyYW1zW2ldO1xuICAgICAgICBpZiAoIXBhcmFtZXRlciB8fCBwYXJhbWV0ZXIubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHNpZ25hdHVyZS5wdXNoKCc/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzaWduYXR1cmUucHVzaChwYXJhbWV0ZXIubWFwKHN0cmluZ2lmeSkuam9pbignICcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gRXJyb3IoJ0Nhbm5vdCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciBcXCcnICsgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1xcJygnICtcbiAgICAgICAgc2lnbmF0dXJlLmpvaW4oJywgJykgKyAnKS4gJyArXG4gICAgICAgICdNYWtlIHN1cmUgdGhhdCBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIGRlY29yYXRlZCB3aXRoIEluamVjdCBvciBoYXZlIHZhbGlkIHR5cGUgYW5ub3RhdGlvbnMgYW5kIHRoYXQgXFwnJyArXG4gICAgICAgIHN0cmluZ2lmeSh0eXBlT3JGdW5jKSArICdcXCcgaXMgZGVjb3JhdGVkIHdpdGggSW5qZWN0YWJsZS4nKTtcbn1cbi8qKlxuICogVGhyb3duIHdoZW4gZ2V0dGluZyBhbiBvYmplY3QgYnkgaW5kZXguXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7fVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0QXQoMTAwKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqXG4gKi9cbmZ1bmN0aW9uIG91dE9mQm91bmRzRXJyb3IoaW5kZXgpIHtcbiAgICByZXR1cm4gRXJyb3IoXCJJbmRleCBcIiArIGluZGV4ICsgXCIgaXMgb3V0LW9mLWJvdW5kcy5cIik7XG59XG4vLyBUT0RPOiBhZGQgYSB3b3JraW5nIGV4YW1wbGUgYWZ0ZXIgYWxwaGEzOCBpcyByZWxlYXNlZFxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIG11bHRpIHByb3ZpZGVyIGFuZCBhIHJlZ3VsYXIgcHJvdmlkZXIgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIHRva2VuLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgeyBwcm92aWRlOiBcIlN0cmluZ3NcIiwgdXNlVmFsdWU6IFwic3RyaW5nMVwiLCBtdWx0aTogdHJ1ZX0sXG4gKiAgIHsgcHJvdmlkZTogXCJTdHJpbmdzXCIsIHVzZVZhbHVlOiBcInN0cmluZzJcIiwgbXVsdGk6IGZhbHNlfVxuICogXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihwcm92aWRlcjEsIHByb3ZpZGVyMikge1xuICAgIHJldHVybiBFcnJvcihcIkNhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiBcIiArIHByb3ZpZGVyMSArIFwiIFwiICsgcHJvdmlkZXIyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIHVuaXF1ZSBvYmplY3QgdXNlZCBmb3IgcmV0cmlldmluZyBpdGVtcyBmcm9tIHRoZSB7QGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yfS5cbiAqXG4gKiBLZXlzIGhhdmU6XG4gKiAtIGEgc3lzdGVtLXdpZGUgdW5pcXVlIGBpZGAuXG4gKiAtIGEgYHRva2VuYC5cbiAqXG4gKiBgS2V5YCBpcyB1c2VkIGludGVybmFsbHkgYnkge0BsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0gYmVjYXVzZSBpdHMgc3lzdGVtLXdpZGUgdW5pcXVlIGBpZGAgYWxsb3dzXG4gKiB0aGVcbiAqIGluamVjdG9yIHRvIHN0b3JlIGNyZWF0ZWQgb2JqZWN0cyBpbiBhIG1vcmUgZWZmaWNpZW50IHdheS5cbiAqXG4gKiBgS2V5YCBzaG91bGQgbm90IGJlIGNyZWF0ZWQgZGlyZWN0bHkuIHtAbGluayBSZWZsZWN0aXZlSW5qZWN0b3J9IGNyZWF0ZXMga2V5cyBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHJlc29sdmluZ1xuICogcHJvdmlkZXJzLlxuICpcbiAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50XG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBSZWZsZWN0aXZlS2V5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIFByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSZWZsZWN0aXZlS2V5KHRva2VuLCBpZCkge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBtdXN0IGJlIGRlZmluZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHN0cmluZ2lmeSh0aGlzLnRva2VuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGEgYEtleWAgZm9yIGEgdG9rZW4uXG4gICAgICovXG4gICAgUmVmbGVjdGl2ZUtleS5nZXQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIF9nbG9iYWxLZXlSZWdpc3RyeS5nZXQocmVzb2x2ZUZvcndhcmRSZWYodG9rZW4pKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0aXZlS2V5LCBcIm51bWJlck9mS2V5c1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgcmVnaXN0ZXJlZCBpbiB0aGUgc3lzdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfZ2xvYmFsS2V5UmVnaXN0cnkubnVtYmVyT2ZLZXlzOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gUmVmbGVjdGl2ZUtleTtcbn0oKSk7XG52YXIgS2V5UmVnaXN0cnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2V5UmVnaXN0cnkoKSB7XG4gICAgICAgIHRoaXMuX2FsbEtleXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIEtleVJlZ2lzdHJ5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4pIHtcbiAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgUmVmbGVjdGl2ZUtleSlcbiAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FsbEtleXMuZ2V0KHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmV3S2V5ID0gbmV3IFJlZmxlY3RpdmVLZXkodG9rZW4sIFJlZmxlY3RpdmVLZXkubnVtYmVyT2ZLZXlzKTtcbiAgICAgICAgdGhpcy5fYWxsS2V5cy5zZXQodG9rZW4sIG5ld0tleSk7XG4gICAgICAgIHJldHVybiBuZXdLZXk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoS2V5UmVnaXN0cnkucHJvdG90eXBlLCBcIm51bWJlck9mS2V5c1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fYWxsS2V5cy5zaXplOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gS2V5UmVnaXN0cnk7XG59KCkpO1xudmFyIF9nbG9iYWxLZXlSZWdpc3RyeSA9IG5ldyBLZXlSZWdpc3RyeSgpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scy4gVXNlZCBpbnRlcm5hbGx5IGJ5IEFuZ3VsYXJcbiAqIHRvIHBvd2VyIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBjb21waWxhdGlvbi5cbiAqL1xudmFyIFJlZmxlY3RvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWZsZWN0b3IocmVmbGVjdGlvbkNhcGFiaWxpdGllcykge1xuICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSByZWZsZWN0aW9uQ2FwYWJpbGl0aWVzO1xuICAgIH1cbiAgICBSZWZsZWN0b3IucHJvdG90eXBlLnVwZGF0ZUNhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIChjYXBzKSB7IHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcyA9IGNhcHM7IH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5mYWN0b3J5ID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5mYWN0b3J5KHR5cGUpOyB9O1xuICAgIFJlZmxlY3Rvci5wcm90b3R5cGUucGFyYW1ldGVycyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucGFyYW1ldGVycyh0eXBlT3JGdW5jKTtcbiAgICB9O1xuICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuYW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zKHR5cGVPckZ1bmMpO1xuICAgIH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3BNZXRhZGF0YSh0eXBlT3JGdW5jKTtcbiAgICB9O1xuICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBsY1Byb3BlcnR5KTtcbiAgICB9O1xuICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuZ2V0dGVyID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5nZXR0ZXIobmFtZSk7IH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5zZXR0ZXIgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnNldHRlcihuYW1lKTsgfTtcbiAgICBSZWZsZWN0b3IucHJvdG90eXBlLm1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKG5hbWUpOyB9O1xuICAgIFJlZmxlY3Rvci5wcm90b3R5cGUuaW1wb3J0VXJpID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5pbXBvcnRVcmkodHlwZSk7IH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvdXJjZVVyaSA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb3VyY2VVcmkodHlwZSk7IH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvbHZlSWRlbnRpZmllciA9IGZ1bmN0aW9uIChuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5yZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpO1xuICAgIH07XG4gICAgUmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvbHZlRW51bSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmbGVjdG9yO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGUge0BsaW5rIFJlZmxlY3Rvcn0gdXNlZCBpbnRlcm5hbGx5IGluIEFuZ3VsYXIgdG8gYWNjZXNzIG1ldGFkYXRhXG4gKiBhYm91dCBzeW1ib2xzLlxuICovXG52YXIgcmVmbGVjdG9yID0gbmV3IFJlZmxlY3RvcihuZXcgUmVmbGVjdGlvbkNhcGFiaWxpdGllcygpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBgRGVwZW5kZW5jeWAgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGV4dGVuZCBESS5cbiAqIFRoaXMgaXMgaW50ZXJuYWwgdG8gQW5ndWxhciBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LlxuICovXG52YXIgUmVmbGVjdGl2ZURlcGVuZGVuY3kgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVmbGVjdGl2ZURlcGVuZGVuY3koa2V5LCBvcHRpb25hbCwgdmlzaWJpbGl0eSkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsO1xuICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5O1xuICAgIH1cbiAgICBSZWZsZWN0aXZlRGVwZW5kZW5jeS5mcm9tS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KGtleSwgZmFsc2UsIG51bGwpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlZmxlY3RpdmVEZXBlbmRlbmN5O1xufSgpKTtcbnZhciBfRU1QVFlfTElTVCA9IFtdO1xudmFyIFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyXyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8oa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlQcm92aWRlcikge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5yZXNvbHZlZEZhY3RvcmllcyA9IHJlc29sdmVkRmFjdG9yaWVzO1xuICAgICAgICB0aGlzLm11bHRpUHJvdmlkZXIgPSBtdWx0aVByb3ZpZGVyO1xuICAgICAgICB0aGlzLnJlc29sdmVkRmFjdG9yeSA9IHRoaXMucmVzb2x2ZWRGYWN0b3JpZXNbMF07XG4gICAgfVxuICAgIHJldHVybiBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl87XG59KCkpO1xuLyoqXG4gKiBBbiBpbnRlcm5hbCByZXNvbHZlZCByZXByZXNlbnRhdGlvbiBvZiBhIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlZCBieSByZXNvbHZpbmcgYFByb3ZpZGVyYC5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeShcbiAgICAvKipcbiAgICAgKiBGYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGNhbiByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gb2JqZWN0IHJlcHJlc2VudGVkIGJ5IGEga2V5LlxuICAgICAqL1xuICAgIGZhY3RvcnksIFxuICAgIC8qKlxuICAgICAqIEFyZ3VtZW50cyAoZGVwZW5kZW5jaWVzKSB0byB0aGUgYGZhY3RvcnlgIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcykge1xuICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5O1xuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICB9XG4gICAgcmV0dXJuIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3Rvcnk7XG59KCkpO1xuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIHByb3ZpZGVyLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpIHtcbiAgICB2YXIgZmFjdG9yeUZuO1xuICAgIHZhciByZXNvbHZlZERlcHM7XG4gICAgaWYgKHByb3ZpZGVyLnVzZUNsYXNzKSB7XG4gICAgICAgIHZhciB1c2VDbGFzcyA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZUNsYXNzKTtcbiAgICAgICAgZmFjdG9yeUZuID0gcmVmbGVjdG9yLmZhY3RvcnkodXNlQ2xhc3MpO1xuICAgICAgICByZXNvbHZlZERlcHMgPSBfZGVwZW5kZW5jaWVzRm9yKHVzZUNsYXNzKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgZmFjdG9yeUZuID0gZnVuY3Rpb24gKGFsaWFzSW5zdGFuY2UpIHsgcmV0dXJuIGFsaWFzSW5zdGFuY2U7IH07XG4gICAgICAgIHJlc29sdmVkRGVwcyA9IFtSZWZsZWN0aXZlRGVwZW5kZW5jeS5mcm9tS2V5KFJlZmxlY3RpdmVLZXkuZ2V0KHByb3ZpZGVyLnVzZUV4aXN0aW5nKSldO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgIGZhY3RvcnlGbiA9IHByb3ZpZGVyLnVzZUZhY3Rvcnk7XG4gICAgICAgIHJlc29sdmVkRGVwcyA9IGNvbnN0cnVjdERlcGVuZGVuY2llcyhwcm92aWRlci51c2VGYWN0b3J5LCBwcm92aWRlci5kZXBzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZhY3RvcnlGbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3ZpZGVyLnVzZVZhbHVlOyB9O1xuICAgICAgICByZXNvbHZlZERlcHMgPSBfRU1QVFlfTElTVDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnlGbiwgcmVzb2x2ZWREZXBzKTtcbn1cbi8qKlxuICogQ29udmVydHMgdGhlIGBQcm92aWRlcmAgaW50byBgUmVzb2x2ZWRQcm92aWRlcmAuXG4gKlxuICogYEluamVjdG9yYCBpbnRlcm5hbGx5IG9ubHkgdXNlcyBgUmVzb2x2ZWRQcm92aWRlcmAsIGBQcm92aWRlcmAgY29udGFpbnMgY29udmVuaWVuY2UgcHJvdmlkZXJcbiAqIHN5bnRheC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcihwcm92aWRlcikge1xuICAgIHJldHVybiBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKFJlZmxlY3RpdmVLZXkuZ2V0KHByb3ZpZGVyLnByb3ZpZGUpLCBbcmVzb2x2ZVJlZmxlY3RpdmVGYWN0b3J5KHByb3ZpZGVyKV0sIHByb3ZpZGVyLm11bHRpIHx8IGZhbHNlKTtcbn1cbi8qKlxuICogUmVzb2x2ZSBhIGxpc3Qgb2YgUHJvdmlkZXJzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCBbXSk7XG4gICAgdmFyIHJlc29sdmVkID0gbm9ybWFsaXplZC5tYXAocmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcik7XG4gICAgdmFyIHJlc29sdmVkUHJvdmlkZXJNYXAgPSBtZXJnZVJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyhyZXNvbHZlZCwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShyZXNvbHZlZFByb3ZpZGVyTWFwLnZhbHVlcygpKTtcbn1cbi8qKlxuICogTWVyZ2VzIGEgbGlzdCBvZiBSZXNvbHZlZFByb3ZpZGVycyBpbnRvIGEgbGlzdCB3aGVyZSBlYWNoIGtleSBpcyBjb250YWluZWQgZXhhY3RseSBvbmNlIGFuZFxuICogbXVsdGkgcHJvdmlkZXJzIGhhdmUgYmVlbiBtZXJnZWQuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycywgbm9ybWFsaXplZFByb3ZpZGVyc01hcCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm92aWRlciA9IHByb3ZpZGVyc1tpXTtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gbm9ybWFsaXplZFByb3ZpZGVyc01hcC5nZXQocHJvdmlkZXIua2V5LmlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlciAhPT0gZXhpc3RpbmcubXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHRocm93IG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZywgcHJvdmlkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlc29sdmVkRmFjdG9yaWVzLnB1c2gocHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm92aWRlcnNNYXAuc2V0KHByb3ZpZGVyLmtleS5pZCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlc29sdmVkUHJvdmlkZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKHByb3ZpZGVyLmtleSwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMuc2xpY2UoKSwgcHJvdmlkZXIubXVsdGlQcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJzTWFwLnNldChwcm92aWRlci5rZXkuaWQsIHJlc29sdmVkUHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkUHJvdmlkZXJzTWFwO1xufVxuZnVuY3Rpb24gX25vcm1hbGl6ZVByb3ZpZGVycyhwcm92aWRlcnMsIHJlcykge1xuICAgIHByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7XG4gICAgICAgIGlmIChiIGluc3RhbmNlb2YgVHlwZSkge1xuICAgICAgICAgICAgcmVzLnB1c2goeyBwcm92aWRlOiBiLCB1c2VDbGFzczogYiB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiICYmIHR5cGVvZiBiID09ICdvYmplY3QnICYmIGIucHJvdmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXMucHVzaChiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIF9ub3JtYWxpemVQcm92aWRlcnMoYiwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGludmFsaWRQcm92aWRlckVycm9yKGIpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNvbnN0cnVjdERlcGVuZGVuY2llcyh0eXBlT3JGdW5jLCBkZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgICAgICByZXR1cm4gX2RlcGVuZGVuY2llc0Zvcih0eXBlT3JGdW5jKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBwYXJhbXNfMSA9IGRlcGVuZGVuY2llcy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIFt0XTsgfSk7XG4gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXMubWFwKGZ1bmN0aW9uICh0KSB7IHJldHVybiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHQsIHBhcmFtc18xKTsgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2RlcGVuZGVuY2llc0Zvcih0eXBlT3JGdW5jKSB7XG4gICAgdmFyIHBhcmFtcyA9IHJlZmxlY3Rvci5wYXJhbWV0ZXJzKHR5cGVPckZ1bmMpO1xuICAgIGlmICghcGFyYW1zKVxuICAgICAgICByZXR1cm4gW107XG4gICAgaWYgKHBhcmFtcy5zb21lKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwID09IG51bGw7IH0pKSB7XG4gICAgICAgIHRocm93IG5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXMubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcyk7IH0pO1xufVxuZnVuY3Rpb24gX2V4dHJhY3RUb2tlbih0eXBlT3JGdW5jLCBtZXRhZGF0YSwgcGFyYW1zKSB7XG4gICAgdmFyIHRva2VuID0gbnVsbDtcbiAgICB2YXIgb3B0aW9uYWwgPSBmYWxzZTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEpKSB7XG4gICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVEZXBlbmRlbmN5KG1ldGFkYXRhLnRva2VuLCBvcHRpb25hbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kobWV0YWRhdGEsIG9wdGlvbmFsLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgdmlzaWJpbGl0eSA9IG51bGw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcGFyYW1NZXRhZGF0YSA9IG1ldGFkYXRhW2ldO1xuICAgICAgICBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgICAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgSW5qZWN0KSB7XG4gICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGEudG9rZW47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIE9wdGlvbmFsKSB7XG4gICAgICAgICAgICBvcHRpb25hbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFNlbGYgfHwgcGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFNraXBTZWxmKSB7XG4gICAgICAgICAgICB2aXNpYmlsaXR5ID0gcGFyYW1NZXRhZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b2tlbiA9IHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKTtcbiAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCB2aXNpYmlsaXR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCB2aXNpYmlsaXR5KSB7XG4gICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlRGVwZW5kZW5jeShSZWZsZWN0aXZlS2V5LmdldCh0b2tlbiksIG9wdGlvbmFsLCB2aXNpYmlsaXR5KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gVGhyZXNob2xkIGZvciB0aGUgZHluYW1pYyB2ZXJzaW9uXG52YXIgVU5ERUZJTkVEID0gbmV3IE9iamVjdCgpO1xuLyoqXG4gKiBBIFJlZmxlY3RpdmVEZXBlbmRlbmN5IGluamVjdGlvbiBjb250YWluZXIgdXNlZCBmb3IgaW5zdGFudGlhdGluZyBvYmplY3RzIGFuZCByZXNvbHZpbmdcbiAqIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBBbiBgSW5qZWN0b3JgIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGEgYG5ld2Agb3BlcmF0b3IsIHdoaWNoIGNhbiBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlXG4gKiBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMuXG4gKlxuICogSW4gdHlwaWNhbCB1c2UsIGFwcGxpY2F0aW9uIGNvZGUgYXNrcyBmb3IgdGhlIGRlcGVuZGVuY2llcyBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHRoZXkgYXJlXG4gKiByZXNvbHZlZCBieSB0aGUgYEluamVjdG9yYC5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhbiBgSW5qZWN0b3JgIGNvbmZpZ3VyZWQgdG8gY3JlYXRlIGBFbmdpbmVgIGFuZCBgQ2FyYC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBFbmdpbmUge1xuICogfVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIENhciB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICogdmFyIGNhciA9IGluamVjdG9yLmdldChDYXIpO1xuICogZXhwZWN0KGNhciBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAqIGV4cGVjdChjYXIuZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKS50b0JlKHRydWUpO1xuICogYGBgXG4gKlxuICogTm90aWNlLCB3ZSBkb24ndCB1c2UgdGhlIGBuZXdgIG9wZXJhdG9yIGJlY2F1c2Ugd2UgZXhwbGljaXRseSB3YW50IHRvIGhhdmUgdGhlIGBJbmplY3RvcmBcbiAqIHJlc29sdmUgYWxsIG9mIHRoZSBvYmplY3QncyBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBmcm9tIHY1IC0gc2xvdyBhbmQgYnJpbmdzIGluIGEgbG90IG9mIGNvZGUsIFVzZSBgSW5qZWN0b3IuY3JlYXRlYCBpbnN0ZWFkLlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgUmVmbGVjdGl2ZUluamVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZmxlY3RpdmVJbmplY3RvcigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHVybnMgYW4gYXJyYXkgb2YgcHJvdmlkZXIgZGVmaW5pdGlvbnMgaW50byBhbiBhcnJheSBvZiByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAgICpcbiAgICAgKiBBIHJlc29sdXRpb24gaXMgYSBwcm9jZXNzIG9mIGZsYXR0ZW5pbmcgbXVsdGlwbGUgbmVzdGVkIGFycmF5cyBhbmQgY29udmVydGluZyBpbmRpdmlkdWFsXG4gICAgICogcHJvdmlkZXJzIGludG8gYW4gYXJyYXkgb2YgYFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyYHMuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQEluamVjdGFibGUoKVxuICAgICAqIGNsYXNzIEVuZ2luZSB7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQEluamVjdGFibGUoKVxuICAgICAqIGNsYXNzIENhciB7XG4gICAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgcHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUoW0NhciwgW1tFbmdpbmVdXV0pO1xuICAgICAqXG4gICAgICogZXhwZWN0KHByb3ZpZGVycy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICpcbiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAgICogZXhwZWN0KHByb3ZpZGVyc1swXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoXCJDYXJcIik7XG4gICAgICogZXhwZWN0KHByb3ZpZGVyc1swXS5kZXBlbmRlbmNpZXMubGVuZ3RoKS50b0VxdWFsKDEpO1xuICAgICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZmFjdG9yeSkudG9CZURlZmluZWQoKTtcbiAgICAgKlxuICAgICAqIGV4cGVjdChwcm92aWRlcnNbMV0ua2V5LmRpc3BsYXlOYW1lKS50b0JlKFwiRW5naW5lXCIpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICovXG4gICAgUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUgPSBmdW5jdGlvbiAocHJvdmlkZXJzKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYW4gYXJyYXkgb2YgcHJvdmlkZXJzIGFuZCBjcmVhdGVzIGFuIGluamVjdG9yIGZyb20gdGhvc2UgcHJvdmlkZXJzLlxuICAgICAqXG4gICAgICogVGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgY2FuIGJlIGFuIGFycmF5IG9mIGBUeXBlYCwgYFByb3ZpZGVyYCxcbiAgICAgKiBvciBhIHJlY3Vyc2l2ZSBhcnJheSBvZiBtb3JlIHByb3ZpZGVycy5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBASW5qZWN0YWJsZSgpXG4gICAgICogY2xhc3MgRW5naW5lIHtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBASW5qZWN0YWJsZSgpXG4gICAgICogY2xhc3MgQ2FyIHtcbiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICAgICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZSA9IGZ1bmN0aW9uIChwcm92aWRlcnMsIHBhcmVudCkge1xuICAgICAgICB2YXIgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RpdmVJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMoUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzLCBwYXJlbnQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLlxuICAgICAqXG4gICAgICogVGhpcyBBUEkgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBjb25zdHJ1Y3QgaW5qZWN0b3JzIGluIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBwYXJ0cy5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBASW5qZWN0YWJsZSgpXG4gICAgICogY2xhc3MgRW5naW5lIHtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBASW5qZWN0YWJsZSgpXG4gICAgICogY2xhc3MgQ2FyIHtcbiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBwcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbQ2FyLCBFbmdpbmVdKTtcbiAgICAgKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVycyk7XG4gICAgICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMgPSBmdW5jdGlvbiAocHJvdmlkZXJzLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JfKHByb3ZpZGVycywgcGFyZW50KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWZsZWN0aXZlSW5qZWN0b3I7XG59KCkpO1xudmFyIFJlZmxlY3RpdmVJbmplY3Rvcl8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogUHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFJlZmxlY3RpdmVJbmplY3Rvcl8oX3Byb3ZpZGVycywgX3BhcmVudCkge1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9wcm92aWRlcnMgPSBfcHJvdmlkZXJzO1xuICAgICAgICB0aGlzLnBhcmVudCA9IF9wYXJlbnQgfHwgbnVsbDtcbiAgICAgICAgdmFyIGxlbiA9IF9wcm92aWRlcnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmtleUlkcyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICB0aGlzLm9ianMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdGhpcy5rZXlJZHNbaV0gPSBfcHJvdmlkZXJzW2ldLmtleS5pZDtcbiAgICAgICAgICAgIHRoaXMub2Jqc1tpXSA9IFVOREVGSU5FRDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgPT09IHZvaWQgMCkgeyBub3RGb3VuZFZhbHVlID0gVEhST1dfSUZfTk9UX0ZPVU5EOyB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShSZWZsZWN0aXZlS2V5LmdldCh0b2tlbiksIG51bGwsIG5vdEZvdW5kVmFsdWUpO1xuICAgIH07XG4gICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUucmVzb2x2ZUFuZENyZWF0ZUNoaWxkID0gZnVuY3Rpb24gKHByb3ZpZGVycykge1xuICAgICAgICB2YXIgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQoUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzKTtcbiAgICB9O1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLmNyZWF0ZUNoaWxkRnJvbVJlc29sdmVkID0gZnVuY3Rpb24gKHByb3ZpZGVycykge1xuICAgICAgICB2YXIgaW5qID0gbmV3IFJlZmxlY3RpdmVJbmplY3Rvcl8ocHJvdmlkZXJzKTtcbiAgICAgICAgaW5qLnBhcmVudCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBpbmo7XG4gICAgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5yZXNvbHZlQW5kSW5zdGFudGlhdGUgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFudGlhdGVSZXNvbHZlZChSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbcHJvdmlkZXJdKVswXSk7XG4gICAgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5pbnN0YW50aWF0ZVJlc29sdmVkID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICB9O1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLmdldFByb3ZpZGVyQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX3Byb3ZpZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm92aWRlcnNbaW5kZXhdO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9uZXcgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIrKyA+IHRoaXMuX2dldE1heE51bWJlck9mT2JqZWN0cygpKSB7XG4gICAgICAgICAgICB0aHJvdyBjeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFudGlhdGVQcm92aWRlcihwcm92aWRlcik7XG4gICAgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5fZ2V0TWF4TnVtYmVyT2ZPYmplY3RzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5vYmpzLmxlbmd0aDsgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5faW5zdGFudGlhdGVQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlcikge1xuICAgICAgICAgICAgdmFyIHJlcyA9IG5ldyBBcnJheShwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc1tpXSA9IHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1swXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9pbnN0YW50aWF0ZSA9IGZ1bmN0aW9uIChwcm92aWRlciwgUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZmFjdG9yeSA9IFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkuZmFjdG9yeTtcbiAgICAgICAgdmFyIGRlcHM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZXBzID1cbiAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5LmRlcGVuZGVuY2llcy5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gX3RoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3koZGVwKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmFkZEtleSkge1xuICAgICAgICAgICAgICAgIGUuYWRkS2V5KHRoaXMsIHByb3ZpZGVyLmtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmo7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvYmogPSBmYWN0b3J5LmFwcGx5KHZvaWQgMCwgX19zcHJlYWQoZGVwcykpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnN0YW50aWF0aW9uRXJyb3IodGhpcywgZSwgZS5zdGFjaywgcHJvdmlkZXIua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3kgPSBmdW5jdGlvbiAoZGVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShkZXAua2V5LCBkZXAudmlzaWJpbGl0eSwgZGVwLm9wdGlvbmFsID8gbnVsbCA6IFRIUk9XX0lGX05PVF9GT1VORCk7XG4gICAgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5fZ2V0QnlLZXkgPSBmdW5jdGlvbiAoa2V5LCB2aXNpYmlsaXR5LCBub3RGb3VuZFZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFJlZmxlY3RpdmVJbmplY3Rvcl8uSU5KRUNUT1JfS0VZKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJpbGl0eSBpbnN0YW5jZW9mIFNlbGYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleVNlbGYoa2V5LCBub3RGb3VuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleURlZmF1bHQoa2V5LCBub3RGb3VuZFZhbHVlLCB2aXNpYmlsaXR5KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUuX2dldE9iakJ5S2V5SWQgPSBmdW5jdGlvbiAoa2V5SWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmtleUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMua2V5SWRzW2ldID09PSBrZXlJZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9ianNbaV0gPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9ianNbaV0gPSB0aGlzLl9uZXcodGhpcy5fcHJvdmlkZXJzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2Jqc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVU5ERUZJTkVEO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl90aHJvd09yTnVsbCA9IGZ1bmN0aW9uIChrZXksIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgIT09IFRIUk9XX0lGX05PVF9GT1VORCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBub1Byb3ZpZGVyRXJyb3IodGhpcywga2V5KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLl9nZXRCeUtleVNlbGYgPSBmdW5jdGlvbiAoa2V5LCBub3RGb3VuZFZhbHVlKSB7XG4gICAgICAgIHZhciBvYmogPSB0aGlzLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7XG4gICAgICAgIHJldHVybiAob2JqICE9PSBVTkRFRklORUQpID8gb2JqIDogdGhpcy5fdGhyb3dPck51bGwoa2V5LCBub3RGb3VuZFZhbHVlKTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLnByb3RvdHlwZS5fZ2V0QnlLZXlEZWZhdWx0ID0gZnVuY3Rpb24gKGtleSwgbm90Rm91bmRWYWx1ZSwgdmlzaWJpbGl0eSkge1xuICAgICAgICB2YXIgaW5qO1xuICAgICAgICBpZiAodmlzaWJpbGl0eSBpbnN0YW5jZW9mIFNraXBTZWxmKSB7XG4gICAgICAgICAgICBpbmogPSB0aGlzLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGluaiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluaiBpbnN0YW5jZW9mIFJlZmxlY3RpdmVJbmplY3Rvcl8pIHtcbiAgICAgICAgICAgIHZhciBpbmpfID0gaW5qO1xuICAgICAgICAgICAgdmFyIG9iaiA9IGlual8uX2dldE9iakJ5S2V5SWQoa2V5LmlkKTtcbiAgICAgICAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRClcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgaW5qID0gaW5qXy5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGluai5nZXQoa2V5LnRva2VuLCBub3RGb3VuZFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVmbGVjdGl2ZUluamVjdG9yXy5wcm90b3R5cGUsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlcnMgPSBfbWFwUHJvdmlkZXJzKHRoaXMsIGZ1bmN0aW9uIChiKSB7IHJldHVybiAnIFwiJyArIGIua2V5LmRpc3BsYXlOYW1lICsgJ1wiICc7IH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgICByZXR1cm4gXCJSZWZsZWN0aXZlSW5qZWN0b3IocHJvdmlkZXJzOiBbXCIgKyBwcm92aWRlcnMgKyBcIl0pXCI7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsgfTtcbiAgICBSZWZsZWN0aXZlSW5qZWN0b3JfLklOSkVDVE9SX0tFWSA9IFJlZmxlY3RpdmVLZXkuZ2V0KEluamVjdG9yKTtcbiAgICByZXR1cm4gUmVmbGVjdGl2ZUluamVjdG9yXztcbn0oKSk7XG5mdW5jdGlvbiBfbWFwUHJvdmlkZXJzKGluamVjdG9yLCBmbikge1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXkoaW5qZWN0b3IuX3Byb3ZpZGVycy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3ZpZGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXNbaV0gPSBmbihpbmplY3Rvci5nZXRQcm92aWRlckF0SW5kZXgoaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIERJIHRva2VuIHRoYXQgeW91IGNhbiB1c2UgdG8gY3JlYXRlIGEgdmlydHVhbCBbcHJvdmlkZXJdKGd1aWRlL2dsb3NzYXJ5I3Byb3ZpZGVyKVxuICogdGhhdCB3aWxsIHBvcHVsYXRlIHRoZSBgZW50cnlDb21wb25lbnRzYCBmaWVsZCBvZiBjb21wb25lbnRzIGFuZCBOZ01vZHVsZXNcbiAqIGJhc2VkIG9uIGl0cyBgdXNlVmFsdWVgIHByb3BlcnR5IHZhbHVlLlxuICogQWxsIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgYHVzZVZhbHVlYCB2YWx1ZSAoZWl0aGVyIGRpcmVjdGx5XG4gKiBvciBpbiBhIG5lc3RlZCBhcnJheSBvciBtYXApIGFyZSBhZGRlZCB0byB0aGUgYGVudHJ5Q29tcG9uZW50c2AgcHJvcGVydHkuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRoZSByb3V0ZXIgY2FuIHBvcHVsYXRlIHRoZSBgZW50cnlDb21wb25lbnRzYFxuICogZmllbGQgb2YgYW4gTmdNb2R1bGUgYmFzZWQgb24gYSByb3V0ZXIgY29uZmlndXJhdGlvbiB0aGF0IHJlZmVyc1xuICogdG8gY29tcG9uZW50cy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBoZWxwZXIgZnVuY3Rpb24gaW5zaWRlIHRoZSByb3V0ZXJcbiAqIGZ1bmN0aW9uIHByb3ZpZGVSb3V0ZXMocm91dGVzKSB7XG4gKiAgIHJldHVybiBbXG4gKiAgICAge3Byb3ZpZGU6IFJPVVRFUywgdXNlVmFsdWU6IHJvdXRlc30sXG4gKiAgICAge3Byb3ZpZGU6IEFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMsIHVzZVZhbHVlOiByb3V0ZXMsIG11bHRpOiB0cnVlfVxuICogICBdO1xuICogfVxuICpcbiAqIC8vIHVzZXIgY29kZVxuICogbGV0IHJvdXRlcyA9IFtcbiAqICAge3BhdGg6ICcvcm9vdCcsIGNvbXBvbmVudDogUm9vdENvbXB9LFxuICogICB7cGF0aDogJy90ZWFtcycsIGNvbXBvbmVudDogVGVhbXNDb21wfVxuICogXTtcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtwcm92aWRlUm91dGVzKHJvdXRlcyldXG4gKiB9KVxuICogY2xhc3MgTW9kdWxlV2l0aFJvdXRlcyB7fVxuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQW5hbHl6ZUZvckVudHJ5Q29tcG9uZW50cycpO1xuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBxdWVyeSBtZXRhZGF0YS5cbiAqXG4gKiBAc2VlIGBDb250ZW50Q2hpbGRyZW5gLlxuICogQHNlZSBgQ29udGVudENoaWxkYC5cbiAqIEBzZWUgYFZpZXdDaGlsZHJlbmAuXG4gKiBAc2VlIGBWaWV3Q2hpbGRgLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFF1ZXJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFF1ZXJ5KCkge1xuICAgIH1cbiAgICByZXR1cm4gUXVlcnk7XG59KCkpO1xudmFyIMm1MCQ0ID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkgeyBkYXRhID0ge307IH1cbiAgICByZXR1cm4gKF9fYXNzaWduKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBmaXJzdDogZmFsc2UsIGlzVmlld1F1ZXJ5OiBmYWxzZSwgZGVzY2VuZGFudHM6IGZhbHNlIH0sIGRhdGEpKTtcbn07XG4vKipcbiAqIENvbnRlbnRDaGlsZHJlbiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICpcbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ29udGVudENoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ0NvbnRlbnRDaGlsZHJlbicsIMm1MCQ0LCBRdWVyeSk7XG52YXIgybUxJDEgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7IGRhdGEgPSB7fTsgfVxuICAgIHJldHVybiAoX19hc3NpZ24oeyBzZWxlY3Rvcjogc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogZmFsc2UsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTtcbn07XG4vKipcbiAqIENvbnRlbnRDaGlsZCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLlxuICpcbiAqXG4gKiBAQW5ub3RhdGlvblxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENvbnRlbnRDaGlsZCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdDb250ZW50Q2hpbGQnLCDJtTEkMSwgUXVlcnkpO1xudmFyIMm1MiQxID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkgeyBkYXRhID0ge307IH1cbiAgICByZXR1cm4gKF9fYXNzaWduKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBmaXJzdDogZmFsc2UsIGlzVmlld1F1ZXJ5OiB0cnVlLCBkZXNjZW5kYW50czogdHJ1ZSB9LCBkYXRhKSk7XG59O1xuLyoqXG4gKiBWaWV3Q2hpbGRyZW4gZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVmlld0NoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ1ZpZXdDaGlsZHJlbicsIMm1MiQxLCBRdWVyeSk7XG52YXIgybUzID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBkYXRhKSB7XG4gICAgcmV0dXJuIChfX2Fzc2lnbih7IHNlbGVjdG9yOiBzZWxlY3RvciwgZmlyc3Q6IHRydWUsIGlzVmlld1F1ZXJ5OiB0cnVlLCBkZXNjZW5kYW50czogdHJ1ZSB9LCBkYXRhKSk7XG59O1xuLyoqXG4gKiBWaWV3Q2hpbGQgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVmlld0NoaWxkID0gbWFrZVByb3BEZWNvcmF0b3IoJ1ZpZXdDaGlsZCcsIMm1MywgUXVlcnkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFRoZSBzdHJhdGVneSB0aGF0IHRoZSBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciB1c2VzIHRvIGRldGVjdCBjaGFuZ2VzLlxuICogV2hlbiBzZXQsIHRha2VzIGVmZmVjdCB0aGUgbmV4dCB0aW1lIGNoYW5nZSBkZXRlY3Rpb24gaXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENoYW5nZURldGVjdGlvblN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSkge1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYENoZWNrT25jZWAgc3RyYXRlZ3ksIG1lYW5pbmcgdGhhdCBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiBpcyBkZWFjdGl2YXRlZFxuICAgICAqIHVudGlsIHJlYWN0aXZhdGVkIGJ5IHNldHRpbmcgdGhlIHN0cmF0ZWd5IHRvIGBEZWZhdWx0YCAoYENoZWNrQWx3YXlzYCkuXG4gICAgICogQ2hhbmdlIGRldGVjdGlvbiBjYW4gc3RpbGwgYmUgZXhwbGljaXRseSBpbnZva2VkLlxuICAgICAqIFRoaXMgc3RyYXRlZ3kgYXBwbGllcyB0byBhbGwgY2hpbGQgZGlyZWN0aXZlcyBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4uXG4gICAgICovXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbXCJPblB1c2hcIl0gPSAwXSA9IFwiT25QdXNoXCI7XG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBkZWZhdWx0IGBDaGVja0Fsd2F5c2Agc3RyYXRlZ3ksIGluIHdoaWNoIGNoYW5nZSBkZXRlY3Rpb24gaXMgYXV0b21hdGljIHVudGlsXG4gICAgICogZXhwbGljaXRseSBkZWFjdGl2YXRlZC5cbiAgICAgKi9cbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtcIkRlZmF1bHRcIl0gPSAxXSA9IFwiRGVmYXVsdFwiO1xufSkoQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfHwgKENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB0aGUgcG9zc2libGUgc3RhdGVzIG9mIHRoZSBkZWZhdWx0IGNoYW5nZSBkZXRlY3Rvci5cbiAqIEBzZWUgYENoYW5nZURldGVjdG9yUmVmYFxuICovXG52YXIgQ2hhbmdlRGV0ZWN0b3JTdGF0dXM7XG4oZnVuY3Rpb24gKENoYW5nZURldGVjdG9yU3RhdHVzKSB7XG4gICAgLyoqXG4gICAgICogQSBzdGF0ZSBpbiB3aGljaCwgYWZ0ZXIgY2FsbGluZyBgZGV0ZWN0Q2hhbmdlcygpYCwgdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgICAqIHN0YXRlIGJlY29tZXMgYENoZWNrZWRgLCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGludm9rZWQgb3IgcmVhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbXCJDaGVja09uY2VcIl0gPSAwXSA9IFwiQ2hlY2tPbmNlXCI7XG4gICAgLyoqXG4gICAgICogQSBzdGF0ZSBpbiB3aGljaCBjaGFuZ2UgZGV0ZWN0aW9uIGlzIHNraXBwZWQgdW50aWwgdGhlIGNoYW5nZSBkZXRlY3RvciBtb2RlXG4gICAgICogYmVjb21lcyBgQ2hlY2tPbmNlYC5cbiAgICAgKi9cbiAgICBDaGFuZ2VEZXRlY3RvclN0YXR1c1tDaGFuZ2VEZXRlY3RvclN0YXR1c1tcIkNoZWNrZWRcIl0gPSAxXSA9IFwiQ2hlY2tlZFwiO1xuICAgIC8qKlxuICAgICAqIEEgc3RhdGUgaW4gd2hpY2ggY2hhbmdlIGRldGVjdGlvbiBjb250aW51ZXMgYXV0b21hdGljYWxseSB1bnRpbCBleHBsaWNpdGx5XG4gICAgICogZGVhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbXCJDaGVja0Fsd2F5c1wiXSA9IDJdID0gXCJDaGVja0Fsd2F5c1wiO1xuICAgIC8qKlxuICAgICAqIEEgc3RhdGUgaW4gd2hpY2ggYSBjaGFuZ2UgZGV0ZWN0b3Igc3ViIHRyZWUgaXMgbm90IGEgcGFydCBvZiB0aGUgbWFpbiB0cmVlIGFuZFxuICAgICAqIHNob3VsZCBiZSBza2lwcGVkLlxuICAgICAqL1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzW1wiRGV0YWNoZWRcIl0gPSAzXSA9IFwiRGV0YWNoZWRcIjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIGVuY291bnRlcmVkIGFuIGVycm9yIGNoZWNraW5nIGEgYmluZGluZ1xuICAgICAqIG9yIGNhbGxpbmcgYSBkaXJlY3RpdmUgbGlmZWN5Y2xlIG1ldGhvZCBhbmQgaXMgbm93IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gQ2hhbmdlXG4gICAgICogZGV0ZWN0b3JzIGluIHRoaXMgc3RhdGUgZG8gbm90IGRldGVjdCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENoYW5nZURldGVjdG9yU3RhdHVzW0NoYW5nZURldGVjdG9yU3RhdHVzW1wiRXJyb3JlZFwiXSA9IDRdID0gXCJFcnJvcmVkXCI7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNoYW5nZSBkZXRlY3RvciBoYXMgYmVlbiBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbQ2hhbmdlRGV0ZWN0b3JTdGF0dXNbXCJEZXN0cm95ZWRcIl0gPSA1XSA9IFwiRGVzdHJveWVkXCI7XG59KShDaGFuZ2VEZXRlY3RvclN0YXR1cyB8fCAoQ2hhbmdlRGV0ZWN0b3JTdGF0dXMgPSB7fSkpO1xuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYSBnaXZlbiBzdHJhdGVneSBpcyBjdXJyZW50bHkgdGhlIGRlZmF1bHQgZm9yIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBAcGFyYW0gY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgVGhlIHN0cmF0ZWd5IHRvIGNoZWNrLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyYXRlZ3kgaXMgdGhlIGN1cnJlbnQgZGVmYXVsdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQHNlZSBgQ2hhbmdlRGV0ZWN0b3JTdGF0dXNgXG4gKiBAc2VlIGBDaGFuZ2VEZXRlY3RvclJlZmBcbiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3koY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpIHtcbiAgICByZXR1cm4gY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPT0gbnVsbCB8fFxuICAgICAgICBjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgcmVzb3VyY2UgVVJMcyBvbiBgQENvbXBvbmVudGAgd2hlbiB1c2VkIHdpdGggSklUIGNvbXBpbGF0aW9uLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNvbXAnLFxuICogICB0ZW1wbGF0ZVVybDogJ215LWNvbXAuaHRtbCcsIC8vIFRoaXMgcmVxdWlyZXMgYXN5bmNocm9ub3VzIHJlc29sdXRpb25cbiAqIH0pXG4gKiBjbGFzcyBNeUNvbXBvbmVudHtcbiAqIH1cbiAqXG4gKiAvLyBDYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIHdpbGwgZmFpbCBiZWNhdXNlIGByZW5kZXJDb21wb25lbnRgIGlzIGEgc3luY2hyb25vdXMgcHJvY2Vzc1xuICogLy8gYW5kIGBNeUNvbXBvbmVudGAncyBgQENvbXBvbmVudC50ZW1wbGF0ZVVybGAgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYXN5bmNocm9ub3VzbHkuXG4gKlxuICogLy8gQ2FsbGluZyBgcmVzb2x2ZUNvbXBvbmVudFJlc291cmNlcygpYCB3aWxsIHJlc29sdmUgYEBDb21wb25lbnQudGVtcGxhdGVVcmxgIGludG9cbiAqIC8vIGBAQ29tcG9uZW50LnRlbXBsYXRlYCwgd2hpY2ggYWxsb3dzIGByZW5kZXJDb21wb25lbnRgIHRvIHByb2NlZWQgaW4gYSBzeW5jaHJvbm91cyBtYW5uZXIuXG4gKlxuICogLy8gVXNlIGJyb3dzZXIncyBgZmV0Y2goKWAgZnVuY3Rpb24gYXMgdGhlIGRlZmF1bHQgcmVzb3VyY2UgcmVzb2x1dGlvbiBzdHJhdGVneS5cbiAqIHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMoZmV0Y2gpLnRoZW4oKCkgPT4ge1xuICogICAvLyBBZnRlciByZXNvbHV0aW9uIGFsbCBVUkxzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW50byBgdGVtcGxhdGVgIHN0cmluZ3MuXG4gKiAgIHJlbmRlckNvbXBvbmVudChNeUNvbXBvbmVudCk7XG4gKiB9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKiBOT1RFOiBJbiBBT1QgdGhlIHJlc29sdXRpb24gaGFwcGVucyBkdXJpbmcgY29tcGlsYXRpb24sIGFuZCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZFxuICogdG8gY2FsbCB0aGlzIG1ldGhvZCBvdXRzaWRlIEpJVCBtb2RlLlxuICpcbiAqIEBwYXJhbSByZXNvdXJjZVJlc29sdmVyIGEgZnVuY3Rpb24gd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyBhIGBQcm9taXNlYCB0byB0aGVcbiAqIGNvbnRlbnRzIG9mIHRoZSByZXNvbHZlZCBVUkwuIEJyb3dzZXIncyBgZmV0Y2goKWAgbWV0aG9kIGlzIGEgZ29vZCBkZWZhdWx0IGltcGxlbWVudGF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKHJlc291cmNlUmVzb2x2ZXIpIHtcbiAgICAvLyBTdG9yZSBhbGwgcHJvbWlzZXMgd2hpY2ggYXJlIGZldGNoaW5nIHRoZSByZXNvdXJjZXMuXG4gICAgdmFyIGNvbXBvbmVudFJlc29sdmVkID0gW107XG4gICAgLy8gQ2FjaGUgc28gdGhhdCB3ZSBkb24ndCBmZXRjaCB0aGUgc2FtZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZS5cbiAgICB2YXIgdXJsTWFwID0gbmV3IE1hcCgpO1xuICAgIGZ1bmN0aW9uIGNhY2hlZFJlc291cmNlUmVzb2x2ZSh1cmwpIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSB1cmxNYXAuZ2V0KHVybCk7XG4gICAgICAgIGlmICghcHJvbWlzZSkge1xuICAgICAgICAgICAgdmFyIHJlc3AgPSByZXNvdXJjZVJlc29sdmVyKHVybCk7XG4gICAgICAgICAgICB1cmxNYXAuc2V0KHVybCwgcHJvbWlzZSA9IHJlc3AudGhlbih1bndyYXBSZXNwb25zZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIHR5cGUpIHtcbiAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgIGlmIChjb21wb25lbnQudGVtcGxhdGVVcmwpIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goY2FjaGVkUmVzb3VyY2VSZXNvbHZlKGNvbXBvbmVudC50ZW1wbGF0ZVVybCkudGhlbihmdW5jdGlvbiAodGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3R5bGVVcmxzID0gY29tcG9uZW50LnN0eWxlVXJscztcbiAgICAgICAgdmFyIHN0eWxlcyA9IGNvbXBvbmVudC5zdHlsZXMgfHwgKGNvbXBvbmVudC5zdHlsZXMgPSBbXSk7XG4gICAgICAgIHZhciBzdHlsZU9mZnNldCA9IGNvbXBvbmVudC5zdHlsZXMubGVuZ3RoO1xuICAgICAgICBzdHlsZVVybHMgJiYgc3R5bGVVcmxzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlVXJsLCBpbmRleCkge1xuICAgICAgICAgICAgc3R5bGVzLnB1c2goJycpOyAvLyBwcmUtYWxsb2NhdGUgYXJyYXkuXG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlZFJlc291cmNlUmVzb2x2ZShzdHlsZVVybCkudGhlbihmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNbc3R5bGVPZmZzZXQgKyBpbmRleF0gPSBzdHlsZTtcbiAgICAgICAgICAgICAgICBzdHlsZVVybHMuc3BsaWNlKHN0eWxlVXJscy5pbmRleE9mKHN0eWxlVXJsKSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlVXJscy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc3R5bGVVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBmdWxseVJlc29sdmVkID0gUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tcG9uZW50RGVmUmVzb2x2ZWQodHlwZSk7IH0pO1xuICAgICAgICBjb21wb25lbnRSZXNvbHZlZC5wdXNoKGZ1bGx5UmVzb2x2ZWQpO1xuICAgIH0pO1xuICAgIGNsZWFyUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzUXVldWUoKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50UmVzb2x2ZWQpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9KTtcbn1cbnZhciBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZSA9IG5ldyBNYXAoKTtcbi8vIFRyYWNrIHdoZW4gZXhpc3RpbmcgbmdDb21wb25lbnREZWYgZm9yIGEgVHlwZSBpcyB3YWl0aW5nIG9uIHJlc291cmNlcy5cbnZhciBjb21wb25lbnREZWZQZW5kaW5nUmVzb2x1dGlvbiA9IG5ldyBTZXQoKTtcbmZ1bmN0aW9uIG1heWJlUXVldWVSZXNvbHV0aW9uT2ZDb21wb25lbnRSZXNvdXJjZXModHlwZSwgbWV0YWRhdGEpIHtcbiAgICBpZiAoY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKG1ldGFkYXRhKSkge1xuICAgICAgICBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZS5zZXQodHlwZSwgbWV0YWRhdGEpO1xuICAgICAgICBjb21wb25lbnREZWZQZW5kaW5nUmVzb2x1dGlvbi5hZGQodHlwZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKGNvbXBvbmVudCkge1xuICAgIHJldHVybiAhISgoY29tcG9uZW50LnRlbXBsYXRlVXJsICYmICFjb21wb25lbnQudGVtcGxhdGUpIHx8XG4gICAgICAgIGNvbXBvbmVudC5zdHlsZVVybHMgJiYgY29tcG9uZW50LnN0eWxlVXJscy5sZW5ndGgpO1xufVxuZnVuY3Rpb24gY2xlYXJSZXNvbHV0aW9uT2ZDb21wb25lbnRSZXNvdXJjZXNRdWV1ZSgpIHtcbiAgICB2YXIgb2xkID0gY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWU7XG4gICAgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIG9sZDtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWVFbXB0eSgpIHtcbiAgICByZXR1cm4gY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUuc2l6ZSA9PT0gMDtcbn1cbmZ1bmN0aW9uIHVud3JhcFJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNwb25zZSA9PSAnc3RyaW5nJyA/IHJlc3BvbnNlIDogcmVzcG9uc2UudGV4dCgpO1xufVxuZnVuY3Rpb24gY29tcG9uZW50RGVmUmVzb2x2ZWQodHlwZSkge1xuICAgIGNvbXBvbmVudERlZlBlbmRpbmdSZXNvbHV0aW9uLmRlbGV0ZSh0eXBlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBEZWZpbmVzIHRlbXBsYXRlIGFuZCBzdHlsZSBlbmNhcHN1bGF0aW9uIG9wdGlvbnMgYXZhaWxhYmxlIGZvciBDb21wb25lbnQncyB7QGxpbmsgQ29tcG9uZW50fS5cbiAqXG4gKiBTZWUge0BsaW5rIENvbXBvbmVudCNlbmNhcHN1bGF0aW9uIGVuY2Fwc3VsYXRpb259LlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL2VuY2Fwc3VsYXRpb24udHMgcmVnaW9uPSdsb25nZm9ybSd9XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVmlld0VuY2Fwc3VsYXRpb247XG4oZnVuY3Rpb24gKFZpZXdFbmNhcHN1bGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogRW11bGF0ZSBgTmF0aXZlYCBzY29waW5nIG9mIHN0eWxlcyBieSBhZGRpbmcgYW4gYXR0cmlidXRlIGNvbnRhaW5pbmcgc3Vycm9nYXRlIGlkIHRvIHRoZSBIb3N0XG4gICAgICogRWxlbWVudCBhbmQgcHJlLXByb2Nlc3NpbmcgdGhlIHN0eWxlIHJ1bGVzIHByb3ZpZGVkIHZpYSB7QGxpbmsgQ29tcG9uZW50I3N0eWxlcyBzdHlsZXN9IG9yXG4gICAgICoge0BsaW5rIENvbXBvbmVudCNzdHlsZVVybHMgc3R5bGVVcmxzfSwgYW5kIGFkZGluZyB0aGUgbmV3IEhvc3QgRWxlbWVudCBhdHRyaWJ1dGUgdG8gYWxsXG4gICAgICogc2VsZWN0b3JzLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBvcHRpb24uXG4gICAgICovXG4gICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bXCJFbXVsYXRlZFwiXSA9IDBdID0gXCJFbXVsYXRlZFwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHY2LjEuMCAtIHVzZSB7Vmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tfSBpbnN0ZWFkLlxuICAgICAqIFVzZSB0aGUgbmF0aXZlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtIG9mIHRoZSByZW5kZXJlci5cbiAgICAgKlxuICAgICAqIEZvciB0aGUgRE9NIHRoaXMgbWVhbnMgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgW1NoYWRvdyBET01cbiAgICAgKiB2MF0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9zaGFkb3cvKSBhbmRcbiAgICAgKiBjcmVhdGluZyBhIFNoYWRvd1Jvb3QgZm9yIENvbXBvbmVudCdzIEhvc3QgRWxlbWVudC5cbiAgICAgKi9cbiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvbltcIk5hdGl2ZVwiXSA9IDFdID0gXCJOYXRpdmVcIjtcbiAgICAvKipcbiAgICAgKiBEb24ndCBwcm92aWRlIGFueSB0ZW1wbGF0ZSBvciBzdHlsZSBlbmNhcHN1bGF0aW9uLlxuICAgICAqL1xuICAgIFZpZXdFbmNhcHN1bGF0aW9uW1ZpZXdFbmNhcHN1bGF0aW9uW1wiTm9uZVwiXSA9IDJdID0gXCJOb25lXCI7XG4gICAgLyoqXG4gICAgICogVXNlIFNoYWRvdyBET00gdG8gZW5jYXBzdWxhdGUgc3R5bGVzLlxuICAgICAqXG4gICAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyBtb2Rlcm4gW1NoYWRvd1xuICAgICAqIERPTV0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9zaGFkb3cvKSBhbmRcbiAgICAgKiBjcmVhdGluZyBhIFNoYWRvd1Jvb3QgZm9yIENvbXBvbmVudCdzIEhvc3QgRWxlbWVudC5cbiAgICAgKi9cbiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvbltcIlNoYWRvd0RvbVwiXSA9IDNdID0gXCJTaGFkb3dEb21cIjtcbn0pKFZpZXdFbmNhcHN1bGF0aW9uIHx8IChWaWV3RW5jYXBzdWxhdGlvbiA9IHt9KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIG5nRGV2TW9kZVJlc2V0UGVyZkNvdW50ZXJzKCkge1xuICAgIHZhciBuZXdDb3VudGVycyA9IHtcbiAgICAgICAgZmlyc3RUZW1wbGF0ZVBhc3M6IDAsXG4gICAgICAgIHROb2RlOiAwLFxuICAgICAgICB0VmlldzogMCxcbiAgICAgICAgcmVuZGVyZXJDcmVhdGVUZXh0Tm9kZTogMCxcbiAgICAgICAgcmVuZGVyZXJTZXRUZXh0OiAwLFxuICAgICAgICByZW5kZXJlckNyZWF0ZUVsZW1lbnQ6IDAsXG4gICAgICAgIHJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcjogMCxcbiAgICAgICAgcmVuZGVyZXJTZXRBdHRyaWJ1dGU6IDAsXG4gICAgICAgIHJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlOiAwLFxuICAgICAgICByZW5kZXJlclNldFByb3BlcnR5OiAwLFxuICAgICAgICByZW5kZXJlclNldENsYXNzTmFtZTogMCxcbiAgICAgICAgcmVuZGVyZXJBZGRDbGFzczogMCxcbiAgICAgICAgcmVuZGVyZXJSZW1vdmVDbGFzczogMCxcbiAgICAgICAgcmVuZGVyZXJTZXRTdHlsZTogMCxcbiAgICAgICAgcmVuZGVyZXJSZW1vdmVTdHlsZTogMCxcbiAgICAgICAgcmVuZGVyZXJEZXN0cm95OiAwLFxuICAgICAgICByZW5kZXJlckRlc3Ryb3lOb2RlOiAwLFxuICAgICAgICByZW5kZXJlck1vdmVOb2RlOiAwLFxuICAgICAgICByZW5kZXJlclJlbW92ZU5vZGU6IDAsXG4gICAgICAgIHJlbmRlcmVyQ3JlYXRlQ29tbWVudDogMCxcbiAgICAgICAgc3R5bGluZ01hcDogMCxcbiAgICAgICAgc3R5bGluZ01hcENhY2hlTWlzczogMCxcbiAgICAgICAgc3R5bGluZ1Byb3A6IDAsXG4gICAgICAgIHN0eWxpbmdQcm9wQ2FjaGVNaXNzOiAwLFxuICAgICAgICBzdHlsaW5nQXBwbHk6IDAsXG4gICAgICAgIHN0eWxpbmdBcHBseUNhY2hlTWlzczogMCxcbiAgICB9O1xuICAgIC8vIE1ha2Ugc3VyZSB0byByZWZlciB0byBuZ0Rldk1vZGUgYXMgWyduZ0Rldk1vZGUnXSBmb3IgY2xvc3VyZS5cbiAgICBfZ2xvYmFsWyduZ0Rldk1vZGUnXSA9IG5ld0NvdW50ZXJzO1xuICAgIHJldHVybiBuZXdDb3VudGVycztcbn1cbi8qKlxuICogVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSBgbmdEZXZNb2RlYCBoYXMgYmVlbiBzZXQuIElmIHllcyxcbiAqIHRoZW4gd2UgaG9ub3IgaXQsIG90aGVyd2lzZSB3ZSBkZWZhdWx0IHRvIGRldiBtb2RlIHdpdGggYWRkaXRpb25hbCBjaGVja3MuXG4gKlxuICogVGhlIGlkZWEgaXMgdGhhdCB1bmxlc3Mgd2UgYXJlIGRvaW5nIHByb2R1Y3Rpb24gYnVpbGQgd2hlcmUgd2UgZXhwbGljaXRseVxuICogc2V0IGBuZ0Rldk1vZGUgPT0gZmFsc2VgIHdlIHNob3VsZCBiZSBoZWxwaW5nIHRoZSBkZXZlbG9wZXIgYnkgcHJvdmlkaW5nXG4gKiBhcyBtdWNoIGVhcmx5IHdhcm5pbmcgYW5kIGVycm9ycyBhcyBwb3NzaWJsZS5cbiAqXG4gKiBOT1RFOiBjaGFuZ2VzIHRvIHRoZSBgbmdEZXZNb2RlYCBuYW1lIG11c3QgYmUgc3luY2VkIHdpdGggYGNvbXBpbGVyLWNsaS9zcmMvdG9vbGluZy50c2AuXG4gKi9cbmlmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpIHtcbiAgICBuZ0Rldk1vZGVSZXNldFBlcmZDb3VudGVycygpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENvbnZpbmNlIGNsb3N1cmUgY29tcGlsZXIgdGhhdCB0aGUgd3JhcHBlZCBmdW5jdGlvbiBoYXMgbm8gc2lkZS1lZmZlY3RzLlxuICpcbiAqIENsb3N1cmUgY29tcGlsZXIgYWx3YXlzIGFzc3VtZXMgdGhhdCBgdG9TdHJpbmdgIGhhcyBubyBzaWRlLWVmZmVjdHMuIFdlIHVzZSB0aGlzIHF1aXJrIHRvXG4gKiBhbGxvdyB1cyB0byBleGVjdXRlIGEgZnVuY3Rpb24gYnV0IGhhdmUgY2xvc3VyZSBjb21waWxlciBtYXJrIHRoZSBjYWxsIGFzIG5vLXNpZGUtZWZmZWN0cy5cbiAqIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBgbm9TaWRlRWZmZWN0c2AgZnVuY3Rpb24gYmUgYXNzaWduZWRcbiAqIHRvIHNvbWV0aGluZyB3aGljaCBpcyByZXRhaW5lZCBvdGhlcndpc2UgdGhlIGNhbGwgdG8gYG5vU2lkZUVmZmVjdHNgIHdpbGwgYmUgcmVtb3ZlZCBieSBjbG9zdXJlXG4gKiBjb21waWxlci5cbiAqL1xuZnVuY3Rpb24gbm9TaWRlRWZmZWN0cyhmbikge1xuICAgIHJldHVybiAnJyArIHsgdG9TdHJpbmc6IGZuIH07XG59XG5cbi8qKlxuKiBAbGljZW5zZVxuKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbipcbiogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuKi9cbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIHJldXNlYWJsZSBcImVtcHR5XCIgc3ltYm9scyB0aGF0IGNhbiBiZSB1c2VkIGFzIGRlZmF1bHQgcmV0dXJuIHZhbHVlc1xuICogaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSByZW5kZXJpbmcgY29kZS4gQmVjYXVzZSB0aGUgc2FtZSBzeW1ib2xzIGFyZSByZXR1cm5lZCwgdGhpc1xuICogYWxsb3dzIGZvciBpZGVudGl0eSBjaGVja3MgYWdhaW5zdCB0aGVzZSB2YWx1ZXMgdG8gYmUgY29uc2lzdGVudGx5IHVzZWQgYnkgdGhlIGZyYW1ld29ya1xuICogY29kZS5cbiAqL1xudmFyIEVNUFRZX09CSiA9IHt9O1xudmFyIEVNUFRZX0FSUkFZJDEgPSBbXTtcbi8vIGZyZWV6aW5nIHRoZSB2YWx1ZXMgcHJldmVudHMgYW55IGNvZGUgZnJvbSBhY2NpZGVudGFsbHkgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMgaW5cbmlmICh0eXBlb2YgbmdEZXZNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBuZ0Rldk1vZGUpIHtcbiAgICAvLyBUaGVzZSBwcm9wZXJ0eSBhY2Nlc3NlcyBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIG5nRGV2TW9kZSB3aWxsIGJlIHNldCB0byBmYWxzZVxuICAgIC8vIHdoZW4gb3B0aW1pemluZyBjb2RlIGFuZCB0aGUgd2hvbGUgaWYgc3RhdGVtZW50IHdpbGwgYmUgZHJvcHBlZC5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzXG4gICAgT2JqZWN0LmZyZWV6ZShFTVBUWV9PQkopO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3NcbiAgICBPYmplY3QuZnJlZXplKEVNUFRZX0FSUkFZJDEpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgTkdfQ09NUE9ORU5UX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBuZ0NvbXBvbmVudERlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcbnZhciBOR19ESVJFQ1RJVkVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nRGlyZWN0aXZlRGVmOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pO1xudmFyIE5HX1BJUEVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nUGlwZURlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcbnZhciBOR19NT0RVTEVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nTW9kdWxlRGVmOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pO1xudmFyIE5HX0JBU0VfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nQmFzZURlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcbi8qKlxuICogSWYgYSBkaXJlY3RpdmUgaXMgZGlQdWJsaWMsIGJsb29tQWRkIHNldHMgYSBwcm9wZXJ0eSBvbiB0aGUgdHlwZSB3aXRoIHRoaXMgY29uc3RhbnQgYXNcbiAqIHRoZSBrZXkgYW5kIHRoZSBkaXJlY3RpdmUncyB1bmlxdWUgSUQgYXMgdGhlIHZhbHVlLiBUaGlzIGFsbG93cyB1cyB0byBtYXAgZGlyZWN0aXZlcyB0byB0aGVpclxuICogYmxvb20gZmlsdGVyIGJpdCBmb3IgREkuXG4gKi9cbi8vIFRPRE8obWlza28pOiBUaGlzIGlzIHdyb25nLiBUaGUgTkdfRUxFTUVOVF9JRCBzaG91bGQgbmV2ZXIgYmUgbWluaWZpZWQuXG52YXIgTkdfRUxFTUVOVF9JRCA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBfX05HX0VMRU1FTlRfSURfXzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIF9yZW5kZXJDb21wQ291bnQgPSAwO1xuLyoqXG4gKiBDcmVhdGUgYSBjb21wb25lbnQgZGVmaW5pdGlvbiBvYmplY3QuXG4gKlxuICpcbiAqICMgRXhhbXBsZVxuICogYGBgXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyXG4gKiAgIC8vIFtTeW1ib2xdIHN5bnRheCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYnkgVHlwZVNjcmlwdCB1bnRpbCB2Mi43XG4gKiAgIHN0YXRpYyBuZ0NvbXBvbmVudERlZiA9IGRlZmluZUNvbXBvbmVudCh7XG4gKiAgICAgLi4uXG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZGVmaW5lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICB2YXIgdHlwZSA9IGNvbXBvbmVudERlZmluaXRpb24udHlwZTtcbiAgICB2YXIgdHlwZVByb3RvdHlwZSA9IHR5cGUucHJvdG90eXBlO1xuICAgIHZhciBkZWNsYXJlZElucHV0cyA9IHt9O1xuICAgIHZhciBkZWYgPSB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHByb3ZpZGVyc1Jlc29sdmVyOiBudWxsLFxuICAgICAgICBjb25zdHM6IGNvbXBvbmVudERlZmluaXRpb24uY29uc3RzLFxuICAgICAgICB2YXJzOiBjb21wb25lbnREZWZpbml0aW9uLnZhcnMsXG4gICAgICAgIGZhY3Rvcnk6IGNvbXBvbmVudERlZmluaXRpb24uZmFjdG9yeSxcbiAgICAgICAgdGVtcGxhdGU6IGNvbXBvbmVudERlZmluaXRpb24udGVtcGxhdGUgfHwgbnVsbCxcbiAgICAgICAgbmdDb250ZW50U2VsZWN0b3JzOiBjb21wb25lbnREZWZpbml0aW9uLm5nQ29udGVudFNlbGVjdG9ycyxcbiAgICAgICAgaG9zdEJpbmRpbmdzOiBjb21wb25lbnREZWZpbml0aW9uLmhvc3RCaW5kaW5ncyB8fCBudWxsLFxuICAgICAgICBjb250ZW50UXVlcmllczogY29tcG9uZW50RGVmaW5pdGlvbi5jb250ZW50UXVlcmllcyB8fCBudWxsLFxuICAgICAgICBkZWNsYXJlZElucHV0czogZGVjbGFyZWRJbnB1dHMsXG4gICAgICAgIGlucHV0czogbnVsbCxcbiAgICAgICAgb3V0cHV0czogbnVsbCxcbiAgICAgICAgZXhwb3J0QXM6IGNvbXBvbmVudERlZmluaXRpb24uZXhwb3J0QXMgfHwgbnVsbCxcbiAgICAgICAgb25DaGFuZ2VzOiBudWxsLFxuICAgICAgICBvbkluaXQ6IHR5cGVQcm90b3R5cGUubmdPbkluaXQgfHwgbnVsbCxcbiAgICAgICAgZG9DaGVjazogdHlwZVByb3RvdHlwZS5uZ0RvQ2hlY2sgfHwgbnVsbCxcbiAgICAgICAgYWZ0ZXJDb250ZW50SW5pdDogdHlwZVByb3RvdHlwZS5uZ0FmdGVyQ29udGVudEluaXQgfHwgbnVsbCxcbiAgICAgICAgYWZ0ZXJDb250ZW50Q2hlY2tlZDogdHlwZVByb3RvdHlwZS5uZ0FmdGVyQ29udGVudENoZWNrZWQgfHwgbnVsbCxcbiAgICAgICAgYWZ0ZXJWaWV3SW5pdDogdHlwZVByb3RvdHlwZS5uZ0FmdGVyVmlld0luaXQgfHwgbnVsbCxcbiAgICAgICAgYWZ0ZXJWaWV3Q2hlY2tlZDogdHlwZVByb3RvdHlwZS5uZ0FmdGVyVmlld0NoZWNrZWQgfHwgbnVsbCxcbiAgICAgICAgb25EZXN0cm95OiB0eXBlUHJvdG90eXBlLm5nT25EZXN0cm95IHx8IG51bGwsXG4gICAgICAgIG9uUHVzaDogY29tcG9uZW50RGVmaW5pdGlvbi5jaGFuZ2VEZXRlY3Rpb24gPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICAgICAgZGlyZWN0aXZlRGVmczogbnVsbCxcbiAgICAgICAgcGlwZURlZnM6IG51bGwsXG4gICAgICAgIHNlbGVjdG9yczogY29tcG9uZW50RGVmaW5pdGlvbi5zZWxlY3RvcnMsXG4gICAgICAgIHZpZXdRdWVyeTogY29tcG9uZW50RGVmaW5pdGlvbi52aWV3UXVlcnkgfHwgbnVsbCxcbiAgICAgICAgZmVhdHVyZXM6IGNvbXBvbmVudERlZmluaXRpb24uZmVhdHVyZXMgfHwgbnVsbCxcbiAgICAgICAgZGF0YTogY29tcG9uZW50RGVmaW5pdGlvbi5kYXRhIHx8IHt9LFxuICAgICAgICAvLyBUT0RPKG1pc2tvKTogY29udmVydCBWaWV3RW5jYXBzdWxhdGlvbiBpbnRvIGNvbnN0IGVudW0gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbiB0aGVcbiAgICAgICAgLy8gbmV4dCBsaW5lLiBBbHNvIGBOb25lYCBzaG91bGQgYmUgMCBub3QgMi5cbiAgICAgICAgZW5jYXBzdWxhdGlvbjogY29tcG9uZW50RGVmaW5pdGlvbi5lbmNhcHN1bGF0aW9uIHx8IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxuICAgICAgICBpZDogJ2MnLFxuICAgICAgICBzdHlsZXM6IGNvbXBvbmVudERlZmluaXRpb24uc3R5bGVzIHx8IEVNUFRZX0FSUkFZJDEsXG4gICAgICAgIF86IG51bGwsXG4gICAgICAgIHNldElucHV0OiBudWxsLFxuICAgICAgICBzY2hlbWFzOiBjb21wb25lbnREZWZpbml0aW9uLnNjaGVtYXMgfHwgbnVsbCxcbiAgICB9O1xuICAgIGRlZi5fID0gbm9TaWRlRWZmZWN0cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmVUeXBlcyA9IGNvbXBvbmVudERlZmluaXRpb24uZGlyZWN0aXZlcztcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb21wb25lbnREZWZpbml0aW9uLmZlYXR1cmVzO1xuICAgICAgICB2YXIgcGlwZVR5cGVzID0gY29tcG9uZW50RGVmaW5pdGlvbi5waXBlcztcbiAgICAgICAgZGVmLmlkICs9IF9yZW5kZXJDb21wQ291bnQrKztcbiAgICAgICAgZGVmLmlucHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLmlucHV0cywgZGVjbGFyZWRJbnB1dHMpLFxuICAgICAgICAgICAgZGVmLm91dHB1dHMgPSBpbnZlcnRPYmplY3QoY29tcG9uZW50RGVmaW5pdGlvbi5vdXRwdXRzKSxcbiAgICAgICAgICAgIGZlYXR1cmUgJiYgZmVhdHVyZS5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oZGVmKTsgfSk7XG4gICAgICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gZGlyZWN0aXZlVHlwZXMgP1xuICAgICAgICAgICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gKHR5cGVvZiBkaXJlY3RpdmVUeXBlcyA9PT0gJ2Z1bmN0aW9uJyA/IGRpcmVjdGl2ZVR5cGVzKCkgOiBkaXJlY3RpdmVUeXBlcylcbiAgICAgICAgICAgICAgICAubWFwKGV4dHJhY3REaXJlY3RpdmVEZWYpOyB9IDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIGRlZi5waXBlRGVmcyA9IHBpcGVUeXBlcyA/XG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHJldHVybiAodHlwZW9mIHBpcGVUeXBlcyA9PT0gJ2Z1bmN0aW9uJyA/IHBpcGVUeXBlcygpIDogcGlwZVR5cGVzKS5tYXAoZXh0cmFjdFBpcGVEZWYpOyB9IDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIC8vIEFkZCBuZ0luamVjdGFibGVEZWYgc28gY29tcG9uZW50cyBhcmUgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1vZHVsZSBpbmplY3RvciBieSBkZWZhdWx0XG4gICAgICAgIC8vICh1bmxlc3MgaXQgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIEBJbmplY3RhYmxlIGRlY29yYXRvcikuIFRoaXMgaXMgbW9zdGx5IHRvXG4gICAgICAgIC8vIHN1cHBvcnQgaW5qZWN0aW5nIGNvbXBvbmVudHMgaW4gdGVzdHMuIEluIHJlYWwgYXBwbGljYXRpb24gY29kZSwgY29tcG9uZW50cyBzaG91bGRcbiAgICAgICAgLy8gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIG5vZGUgaW5qZWN0b3IsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLlxuICAgICAgICBpZiAoIXR5cGUuaGFzT3duUHJvcGVydHkoTkdfSU5KRUNUQUJMRV9ERUYpKSB7XG4gICAgICAgICAgICB0eXBlW05HX0lOSkVDVEFCTEVfREVGXSA9XG4gICAgICAgICAgICAgICAgybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjb21wb25lbnREZWZpbml0aW9uLmZhY3RvcnkgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZGVmO1xufVxuLyoqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1c2V0Q29tcG9uZW50U2NvcGUodHlwZSwgZGlyZWN0aXZlcywgcGlwZXMpIHtcbiAgICB2YXIgZGVmID0gdHlwZS5uZ0NvbXBvbmVudERlZjtcbiAgICBkZWYuZGlyZWN0aXZlRGVmcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKGV4dHJhY3REaXJlY3RpdmVEZWYpOyB9O1xuICAgIGRlZi5waXBlRGVmcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBpcGVzLm1hcChleHRyYWN0UGlwZURlZik7IH07XG59XG5mdW5jdGlvbiBleHRyYWN0RGlyZWN0aXZlRGVmKHR5cGUpIHtcbiAgICB2YXIgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlKTtcbiAgICBpZiAobmdEZXZNb2RlICYmICFkZWYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ1wiICsgdHlwZS5uYW1lICsgXCInIGlzIG5laXRoZXIgJ0NvbXBvbmVudFR5cGUnIG9yICdEaXJlY3RpdmVUeXBlJy5cIik7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG59XG5mdW5jdGlvbiBleHRyYWN0UGlwZURlZih0eXBlKSB7XG4gICAgdmFyIGRlZiA9IGdldFBpcGVEZWYodHlwZSk7XG4gICAgaWYgKG5nRGV2TW9kZSAmJiAhZGVmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIidcIiArIHR5cGUubmFtZSArIFwiJyBpcyBub3QgYSAnUGlwZVR5cGUnLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbn1cbi8qKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWRlZmluZU5nTW9kdWxlKGRlZikge1xuICAgIHZhciByZXMgPSB7XG4gICAgICAgIHR5cGU6IGRlZi50eXBlLFxuICAgICAgICBib290c3RyYXA6IGRlZi5ib290c3RyYXAgfHwgRU1QVFlfQVJSQVkkMSxcbiAgICAgICAgZGVjbGFyYXRpb25zOiBkZWYuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZJDEsXG4gICAgICAgIGltcG9ydHM6IGRlZi5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDEsXG4gICAgICAgIGV4cG9ydHM6IGRlZi5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDEsXG4gICAgICAgIHRyYW5zaXRpdmVDb21waWxlU2NvcGVzOiBudWxsLFxuICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLFxuICAgIH07XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQWRkcyB0aGUgbW9kdWxlIG1ldGFkYXRhIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgdGhlIG1vZHVsZSdzIHRyYW5zaXRpdmUgc2NvcGUgdG8gYW5cbiAqIGV4aXN0aW5nIG1vZHVsZSBkZWZpbml0aW9uLlxuICpcbiAqIFNjb3BlIG1ldGFkYXRhIG9mIG1vZHVsZXMgaXMgbm90IHVzZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMsIHNvIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlXG4gKiBtYXJrZWQgcHVyZSB0byB0cmVlLXNoYWtlIGl0IGZyb20gdGhlIGJ1bmRsZSwgYWxsb3dpbmcgZm9yIGFsbCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uc1xuICogdG8gYmVjb21lIGVsaWdpYmxlIGZvciB0cmVlLXNoYWtpbmcgYXMgd2VsbC5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1c2V0TmdNb2R1bGVTY29wZSh0eXBlLCBzY29wZSkge1xuICAgIHJldHVybiBub1NpZGVFZmZlY3RzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYodHlwZSwgdHJ1ZSk7XG4gICAgICAgIG5nTW9kdWxlRGVmLmRlY2xhcmF0aW9ucyA9IHNjb3BlLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSQxO1xuICAgICAgICBuZ01vZHVsZURlZi5pbXBvcnRzID0gc2NvcGUuaW1wb3J0cyB8fCBFTVBUWV9BUlJBWSQxO1xuICAgICAgICBuZ01vZHVsZURlZi5leHBvcnRzID0gc2NvcGUuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWSQxO1xuICAgIH0pO1xufVxuLyoqXG4gKiBJbnZlcnRzIGFuIGlucHV0cyBvciBvdXRwdXRzIGxvb2t1cCBzdWNoIHRoYXQgdGhlIGtleXMsIHdoaWNoIHdlcmUgdGhlXG4gKiBtaW5pZmllZCBrZXlzLCBhcmUgcGFydCBvZiB0aGUgdmFsdWVzLCBhbmQgdGhlIHZhbHVlcyBhcmUgcGFyc2VkIHNvIHRoYXRcbiAqIHRoZSBwdWJsaWNOYW1lIG9mIHRoZSBwcm9wZXJ0eSBpcyB0aGUgbmV3IGtleVxuICpcbiAqIGUuZy4gZm9yXG4gKlxuICogYGBgXG4gKiBjbGFzcyBDb21wIHtcbiAqICAgQElucHV0KClcbiAqICAgcHJvcE5hbWUxOiBzdHJpbmc7XG4gKlxuICogICBASW5wdXQoJ3B1YmxpY05hbWUyJylcbiAqICAgZGVjbGFyZWRQcm9wTmFtZTI6IG51bWJlcjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIHdpbGwgYmUgc2VyaWFsaXplZCBhc1xuICpcbiAqIGBgYFxuICoge1xuICogICBwcm9wTmFtZTE6ICdwcm9wTmFtZTEnLFxuICogICBkZWNsYXJlZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLFxuICogfVxuICogYGBgXG4gKlxuICogd2hpY2ggaXMgdGhhbiB0cmFuc2xhdGVkIGJ5IHRoZSBtaW5pZmllciBhczpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgbWluaWZpZWRQcm9wTmFtZTE6ICdwcm9wTmFtZTEnLFxuICogICBtaW5pZmllZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLFxuICogfVxuICogYGBgXG4gKlxuICogYmVjb21lczogKHB1YmxpYyBuYW1lID0+IG1pbmlmaWVkTmFtZSlcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAncHJvcE5hbWUxJzogJ21pbmlmaWVkUHJvcE5hbWUxJyxcbiAqICAncHVibGljTmFtZTInOiAnbWluaWZpZWRQcm9wTmFtZTInLFxuICogfVxuICogYGBgXG4gKlxuICogT3B0aW9uYWxseSB0aGUgZnVuY3Rpb24gY2FuIHRha2UgYHNlY29uZGFyeWAgd2hpY2ggd2lsbCByZXN1bHQgaW46IChwdWJsaWMgbmFtZSA9PiBkZWNsYXJlZCBuYW1lKVxuICpcbiAqIGBgYFxuICoge1xuICogICdwcm9wTmFtZTEnOiAncHJvcE5hbWUxJyxcbiAqICAncHVibGljTmFtZTInOiAnZGVjbGFyZWRQcm9wTmFtZTInLFxuICogfVxuICogYGBgXG4gKlxuXG4gKi9cbmZ1bmN0aW9uIGludmVydE9iamVjdChvYmosIHNlY29uZGFyeSkge1xuICAgIGlmIChvYmogPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB2YXIgbmV3TG9va3VwID0ge307XG4gICAgZm9yICh2YXIgbWluaWZpZWRLZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobWluaWZpZWRLZXkpKSB7XG4gICAgICAgICAgICB2YXIgcHVibGljTmFtZSA9IG9ialttaW5pZmllZEtleV07XG4gICAgICAgICAgICB2YXIgZGVjbGFyZWROYW1lID0gcHVibGljTmFtZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHB1YmxpY05hbWUpKSB7XG4gICAgICAgICAgICAgICAgZGVjbGFyZWROYW1lID0gcHVibGljTmFtZVsxXTtcbiAgICAgICAgICAgICAgICBwdWJsaWNOYW1lID0gcHVibGljTmFtZVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0xvb2t1cFtwdWJsaWNOYW1lXSA9IG1pbmlmaWVkS2V5O1xuICAgICAgICAgICAgaWYgKHNlY29uZGFyeSkge1xuICAgICAgICAgICAgICAgIChzZWNvbmRhcnlbcHVibGljTmFtZV0gPSBkZWNsYXJlZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdMb29rdXA7XG59XG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZGVmaW5pdGlvblxuICpcbiAqICMgRXhhbXBsZVxuICogYGBgdHNcbiAqIGNsYXNzIFNob3VsZEJlSW5oZXJpdGVkIHtcbiAqICAgc3RhdGljIG5nQmFzZURlZiA9IMm1ybVkZWZpbmVCYXNlKHtcbiAqICAgICAgLi4uXG4gKiAgIH0pXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYmFzZURlZmluaXRpb24gVGhlIGJhc2UgZGVmaW5pdGlvbiBwYXJhbWV0ZXJzXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWRlZmluZUJhc2UoYmFzZURlZmluaXRpb24pIHtcbiAgICB2YXIgZGVjbGFyZWRJbnB1dHMgPSB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnB1dHM6IGludmVydE9iamVjdChiYXNlRGVmaW5pdGlvbi5pbnB1dHMsIGRlY2xhcmVkSW5wdXRzKSxcbiAgICAgICAgZGVjbGFyZWRJbnB1dHM6IGRlY2xhcmVkSW5wdXRzLFxuICAgICAgICBvdXRwdXRzOiBpbnZlcnRPYmplY3QoYmFzZURlZmluaXRpb24ub3V0cHV0cyksXG4gICAgICAgIHZpZXdRdWVyeTogYmFzZURlZmluaXRpb24udmlld1F1ZXJ5IHx8IG51bGwsXG4gICAgICAgIGNvbnRlbnRRdWVyaWVzOiBiYXNlRGVmaW5pdGlvbi5jb250ZW50UXVlcmllcyB8fCBudWxsLFxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZSBhIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdC5cbiAqXG4gKiAjIEV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyXG4gKiAgIC8vIFtTeW1ib2xdIHN5bnRheCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYnkgVHlwZVNjcmlwdCB1bnRpbCB2Mi43XG4gKiAgIHN0YXRpYyBuZ0RpcmVjdGl2ZURlZiA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoe1xuICogICAgIC4uLlxuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbnZhciDJtcm1ZGVmaW5lRGlyZWN0aXZlID0gybXJtWRlZmluZUNvbXBvbmVudDtcbi8qKlxuICogQ3JlYXRlIGEgcGlwZSBkZWZpbml0aW9uIG9iamVjdC5cbiAqXG4gKiAjIEV4YW1wbGVcbiAqIGBgYFxuICogY2xhc3MgTXlQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyXG4gKiAgIHN0YXRpYyBuZ1BpcGVEZWYgPSBkZWZpbmVQaXBlKHtcbiAqICAgICAuLi5cbiAqICAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqIEBwYXJhbSBwaXBlRGVmIFBpcGUgZGVmaW5pdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWRlZmluZVBpcGUocGlwZURlZikge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHBpcGVEZWYubmFtZSxcbiAgICAgICAgZmFjdG9yeTogcGlwZURlZi5mYWN0b3J5LFxuICAgICAgICBwdXJlOiBwaXBlRGVmLnB1cmUgIT09IGZhbHNlLFxuICAgICAgICBvbkRlc3Ryb3k6IHBpcGVEZWYudHlwZS5wcm90b3R5cGUubmdPbkRlc3Ryb3kgfHwgbnVsbFxuICAgIH07XG59XG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZ2V0dGVyIG1ldGhvZHMgcmV0cmlldmUgdGhlIGRlZmluaXRpb24gZm9ybSB0aGUgdHlwZS4gQ3VycmVudGx5IHRoZSByZXRyaWV2YWxcbiAqIGhvbm9ycyBpbmhlcml0YW5jZSwgYnV0IGluIHRoZSBmdXR1cmUgd2UgbWF5IGNoYW5nZSB0aGUgcnVsZSB0byByZXF1aXJlIHRoYXQgZGVmaW5pdGlvbnMgYXJlXG4gKiBleHBsaWNpdC4gVGhpcyB3b3VsZCByZXF1aXJlIHNvbWUgc29ydCBvZiBtaWdyYXRpb24gc3RyYXRlZ3kuXG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudERlZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGVbTkdfQ09NUE9ORU5UX0RFRl0gfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERpcmVjdGl2ZURlZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGVbTkdfRElSRUNUSVZFX0RFRl0gfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFBpcGVEZWYodHlwZSkge1xuICAgIHJldHVybiB0eXBlW05HX1BJUEVfREVGXSB8fCBudWxsO1xufVxuZnVuY3Rpb24gZ2V0QmFzZURlZih0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGVbTkdfQkFTRV9ERUZdIHx8IG51bGw7XG59XG5mdW5jdGlvbiBnZXROZ01vZHVsZURlZih0eXBlLCB0aHJvd05vdEZvdW5kKSB7XG4gICAgdmFyIG5nTW9kdWxlRGVmID0gdHlwZVtOR19NT0RVTEVfREVGXSB8fCBudWxsO1xuICAgIGlmICghbmdNb2R1bGVEZWYgJiYgdGhyb3dOb3RGb3VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUeXBlIFwiICsgc3RyaW5naWZ5KHR5cGUpICsgXCIgZG9lcyBub3QgaGF2ZSAnbmdNb2R1bGVEZWYnIHByb3BlcnR5LlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5nTW9kdWxlRGVmO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBhIGNoYW5nZSBkZXRlY3Rpb24gc3RhbmQgcG9pbnQuXG4gKlxuICogQ29uc3RyYWludHMgYXJlIHJlbGF4ZWQgaW4gY2hlY2tOb0NoYW5nZXMgbW9kZS4gU2VlIGBkZXZNb2RlRXF1YWxgIGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBpc0RpZmZlcmVudChhLCBiKSB7XG4gICAgLy8gTmFOIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZiBzbyB0aGUgZmlyc3RcbiAgICAvLyB0ZXN0IGNoZWNrcyBpZiBib3RoIGEgYW5kIGIgYXJlIG5vdCBOYU5cbiAgICByZXR1cm4gIShhICE9PSBhICYmIGIgIT09IGIpICYmIGEgIT09IGI7XG59XG4vKipcbiAqIFVzZWQgZm9yIHN0cmluZ2lmeSByZW5kZXIgb3V0cHV0IGluIEl2eS5cbiAqIEltcG9ydGFudCEgVGhpcyBmdW5jdGlvbiBpcyB2ZXJ5IHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBhbmQgd2Ugc2hvdWxkXG4gKiBiZSBleHRyYSBjYXJlZnVsIG5vdCB0byBpbnRyb2R1Y2UgbWVnYW1vcnBoaWMgcmVhZHMgaW4gaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB2YWx1ZS5uYW1lIHx8IHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIHJldHVybiAnJztcbiAgICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbi8qKlxuICogVXNlZCB0byBzdHJpbmdpZnkgYSB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3IgbWVzc2FnZS5cbiAqIEltcG9ydGFudCEgVGhpcyBmdW5jdGlvbiBjb250YWlucyBhIG1lZ2Ftb3JwaGljIHJlYWQgYW5kIHNob3VsZCBvbmx5IGJlXG4gKiB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqL1xuZnVuY3Rpb24gc3RyaW5naWZ5Rm9yRXJyb3IodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZS50eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50eXBlLm5hbWUgfHwgdmFsdWUudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlclN0cmluZ2lmeSh2YWx1ZSk7XG59XG52YXIgybUwJDUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJyAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgLy8gYnJvd3NlciBvbmx5XG4gICAgICAgIHNldFRpbWVvdXQgLy8gZXZlcnl0aGluZyBlbHNlXG4gICAgKS5iaW5kKF9nbG9iYWwpO1xufTtcbnZhciBkZWZhdWx0U2NoZWR1bGVyID0gKMm1MCQ1KSgpO1xuLyoqXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXJlc29sdmVXaW5kb3coZWxlbWVudCkge1xuICAgIHJldHVybiB7IG5hbWU6ICd3aW5kb3cnLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB9O1xufVxuLyoqXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXJlc29sdmVEb2N1bWVudChlbGVtZW50KSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2RvY3VtZW50JywgdGFyZ2V0OiBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfTtcbn1cbi8qKlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVyZXNvbHZlQm9keShlbGVtZW50KSB7XG4gICAgcmV0dXJuIHsgbmFtZTogJ2JvZHknLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5IH07XG59XG4vKipcbiAqIFRoZSBzcGVjaWFsIGRlbGltaXRlciB3ZSB1c2UgdG8gc2VwYXJhdGUgcHJvcGVydHkgbmFtZXMsIHByZWZpeGVzLCBhbmQgc3VmZml4ZXNcbiAqIGluIHByb3BlcnR5IGJpbmRpbmcgbWV0YWRhdGEuIFNlZSBzdG9yZUJpbmRpbmdNZXRhZGF0YSgpLlxuICpcbiAqIFdlIGludGVudGlvbmFsbHkgdXNlIHRoZSBVbmljb2RlIFwiUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXCIgKFUrRkZGRCkgYXMgYSBkZWxpbWl0ZXJcbiAqIGJlY2F1c2UgaXQgaXMgYSB2ZXJ5IHVuY29tbW9uIGNoYXJhY3RlciB0aGF0IGlzIHVubGlrZWx5IHRvIGJlIHBhcnQgb2YgYSB1c2VyJ3NcbiAqIHByb3BlcnR5IG5hbWVzIG9yIGludGVycG9sYXRpb24gc3RyaW5ncy4gSWYgaXQgaXMgaW4gZmFjdCB1c2VkIGluIGEgcHJvcGVydHlcbiAqIGJpbmRpbmcsIERlYnVnRWxlbWVudC5wcm9wZXJ0aWVzIHdpbGwgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhhdFxuICogYmluZGluZy4gSG93ZXZlciwgdGhlcmUgc2hvdWxkIGJlIG5vIHJ1bnRpbWUgZWZmZWN0IGZvciByZWFsIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBUaGlzIGNoYXJhY3RlciBpcyB0eXBpY2FsbHkgcmVuZGVyZWQgYXMgYSBxdWVzdGlvbiBtYXJrIGluc2lkZSBvZiBhIGRpYW1vbmQuXG4gKiBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BlY2lhbHNfKFVuaWNvZGVfYmxvY2spXG4gKlxuICovXG52YXIgSU5URVJQT0xBVElPTl9ERUxJTUlURVIgPSBcIlxcdUZGRkRcIjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcHJvcGVydHkgbWV0YWRhdGEgc3RyaW5nLlxuICogU2VlIHN0b3JlQmluZGluZ01ldGFkYXRhKCkuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvcE1ldGFkYXRhU3RyaW5nKHN0cikge1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihJTlRFUlBPTEFUSU9OX0RFTElNSVRFUikgPj0gMDtcbn1cbi8qKlxuICogVW53cmFwIGEgdmFsdWUgd2hpY2ggbWlnaHQgYmUgYmVoaW5kIGEgY2xvc3VyZSAoZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gcmVhc29ucykuXG4gKi9cbmZ1bmN0aW9uIG1heWJlVW53cmFwRm4odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICByZXR1cm4gdmFsdWUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydE5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7XG4gICAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydExlc3NUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIGlmIChhY3R1YWwgPj0gZXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydEdyZWF0ZXJUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIGlmIChhY3R1YWwgPD0gZXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydERlZmluZWQoYWN0dWFsLCBtc2cpIHtcbiAgICBpZiAoYWN0dWFsID09IG51bGwpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRocm93RXJyb3IobXNnKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgZGVidWdnZXI7IC8vIExlZnQgaW50ZW50aW9uYWxseSBmb3IgYmV0dGVyIGRlYnVnZ2VyIGV4cGVyaWVuY2UuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQVNTRVJUSU9OIEVSUk9SOiBcIiArIG1zZyk7XG59XG5mdW5jdGlvbiBhc3NlcnREb21Ob2RlKG5vZGUpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBhIHdvcmtlciwgYE5vZGVgIHdpbGwgbm90IGJlIGRlZmluZWQuXG4gICAgYXNzZXJ0RXF1YWwoKHR5cGVvZiBOb2RlICE9PSAndW5kZWZpbmVkJyAmJiBub2RlIGluc3RhbmNlb2YgTm9kZSkgfHxcbiAgICAgICAgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdXZWJXb3JrZXJSZW5kZXJOb2RlJyksIHRydWUsICdUaGUgcHJvdmlkZWQgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIERPTSBOb2RlJyk7XG59XG5mdW5jdGlvbiBhc3NlcnREYXRhSW5SYW5nZShhcnIsIGluZGV4KSB7XG4gICAgYXNzZXJ0TGVzc1RoYW4oaW5kZXgsIGFyciA/IGFyci5sZW5ndGggOiAwLCAnaW5kZXggZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBkYXRhIGluZGV4Jyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExWaWV3IGluZGljZXMgdG8gaGVscCB1cyBsb29rIHVwIExWaWV3IG1lbWJlcnNcbi8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlbWVtYmVyIHRoZSBzcGVjaWZpYyBpbmRpY2VzLlxuLy8gVWdsaWZ5IHdpbGwgaW5saW5lIHRoZXNlIHdoZW4gbWluaWZ5aW5nIHNvIHRoZXJlIHNob3VsZG4ndCBiZSBhIGNvc3QuXG52YXIgSE9TVCA9IDA7XG52YXIgVFZJRVcgPSAxO1xudmFyIEZMQUdTID0gMjtcbnZhciBQQVJFTlQgPSAzO1xudmFyIE5FWFQgPSA0O1xudmFyIFFVRVJJRVMgPSA1O1xudmFyIFRfSE9TVCA9IDY7XG52YXIgQklORElOR19JTkRFWCA9IDc7XG52YXIgQ0xFQU5VUCA9IDg7XG52YXIgQ09OVEVYVCA9IDk7XG52YXIgSU5KRUNUT1IkMSA9IDEwO1xudmFyIFJFTkRFUkVSX0ZBQ1RPUlkgPSAxMTtcbnZhciBSRU5ERVJFUiA9IDEyO1xudmFyIFNBTklUSVpFUiA9IDEzO1xudmFyIENISUxEX0hFQUQgPSAxNDtcbnZhciBDSElMRF9UQUlMID0gMTU7XG52YXIgQ09OVEVOVF9RVUVSSUVTID0gMTY7XG52YXIgREVDTEFSQVRJT05fVklFVyA9IDE3O1xudmFyIFBSRU9SREVSX0hPT0tfRkxBR1MgPSAxODtcbi8qKiBTaXplIG9mIExWaWV3J3MgaGVhZGVyLiBOZWNlc3NhcnkgdG8gYWRqdXN0IGZvciBpdCB3aGVuIHNldHRpbmcgc2xvdHMuICAqL1xudmFyIEhFQURFUl9PRkZTRVQgPSAyMDtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBTcGVjaWFsIGxvY2F0aW9uIHdoaWNoIGFsbG93cyBlYXN5IGlkZW50aWZpY2F0aW9uIG9mIHR5cGUuIElmIHdlIGhhdmUgYW4gYXJyYXkgd2hpY2ggd2FzXG4gKiByZXRyaWV2ZWQgZnJvbSB0aGUgYExWaWV3YCBhbmQgdGhhdCBhcnJheSBoYXMgYHRydWVgIGF0IGBUWVBFYCBsb2NhdGlvbiwgd2Uga25vdyBpdCBpc1xuICogYExDb250YWluZXJgLlxuICovXG52YXIgVFlQRSA9IDE7XG4vKipcbiAqIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExDb250YWluZXIgaW5kaWNlcyB0byBoZWxwIHVzIGxvb2sgdXAgTENvbnRhaW5lciBtZW1iZXJzXG4gKiB3aXRob3V0IGhhdmluZyB0byByZW1lbWJlciB0aGUgc3BlY2lmaWMgaW5kaWNlcy5cbiAqIFVnbGlmeSB3aWxsIGlubGluZSB0aGVzZSB3aGVuIG1pbmlmeWluZyBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYSBjb3N0LlxuICovXG52YXIgQUNUSVZFX0lOREVYID0gMjtcbi8vIFBBUkVOVCwgTkVYVCwgUVVFUklFUyBhbmQgVF9IT1NUIGFyZSBpbmRpY2VzIDMsIDQsIDUgYW5kIDYuXG4vLyBBcyB3ZSBhbHJlYWR5IGhhdmUgdGhlc2UgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSB0aGVtLlxudmFyIE5BVElWRSA9IDc7XG52YXIgVklFV1MgPSA4O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFRoaXMgcHJvcGVydHkgd2lsbCBiZSBtb25rZXktcGF0Y2hlZCBvbiBlbGVtZW50cywgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlc1xuICovXG52YXIgTU9OS0VZX1BBVENIX0tFWV9OQU1FID0gJ19fbmdDb250ZXh0X18nO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEZvciBlZmZpY2llbmN5IHJlYXNvbnMgd2Ugb2Z0ZW4gcHV0IHNldmVyYWwgZGlmZmVyZW50IGRhdGEgdHlwZXMgKGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCxcbiAqIGBTdHlsaW5nQ29udGV4dGApIGluIHNhbWUgbG9jYXRpb24gaW4gYExWaWV3YC4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcHJlLWFsbG9jYXRlXG4gKiBzcGFjZSBmb3IgaXQgYmVjYXVzZSB0aGUgc3RvcmFnZSBpcyBzcGFyc2UuIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXRpZXMgZm9yIGRlYWxpbmcgd2l0aCBzdWNoXG4gKiBkYXRhIHR5cGVzLlxuICpcbiAqIEhvdyBkbyB3ZSBrbm93IHdoYXQgaXMgc3RvcmVkIGF0IGEgZ2l2ZW4gbG9jYXRpb24gaW4gYExWaWV3YC5cbiAqIC0gYEFycmF5LmlzQXJyYXkodmFsdWUpID09PSBmYWxzZWAgPT4gYFJOb2RlYCAoVGhlIG5vcm1hbCBzdG9yYWdlIHZhbHVlKVxuICogLSBgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPT09IHRydWVgID0+IHRoZW4gdGhlIGB2YWx1ZVswXWAgcmVwcmVzZW50cyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAqICAgLSBgdHlwZW9mIHZhbHVlW1RZUEVdID09PSAnb2JqZWN0J2AgPT4gYExWaWV3YFxuICogICAgICAtIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYSBjb21wb25lbnQgYXQgYSBnaXZlbiBsb2NhdGlvblxuICogICAtIGB0eXBlb2YgdmFsdWVbVFlQRV0gPT09ICdudW1iZXInYCA9PiBgU3R5bGluZ0NvbnRleHRgXG4gKiAgICAgIC0gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBzdHlsZS9jbGFzcyBiaW5kaW5nIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gdHJ1ZWAgPT4gYExDb250YWluZXJgXG4gKiAgICAgIC0gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBgTENvbnRhaW5lcmAgYmluZGluZyBhdCBhIGdpdmVuIGxvY2F0aW9uLlxuICpcbiAqXG4gKiBOT1RFOiBpdCBpcyBhc3N1bWVkIHRoYXQgYEFycmF5LmlzQXJyYXlgIGFuZCBgdHlwZW9mYCBvcGVyYXRpb25zIGFyZSB2ZXJ5IGVmZmljaWVudC5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGBSTm9kZWAuXG4gKiBAcGFyYW0gdmFsdWUgd3JhcHBlZCB2YWx1ZSBvZiBgUk5vZGVgLCBgTFZpZXdgLCBgTENvbnRhaW5lcmAsIGBTdHlsaW5nQ29udGV4dGBcbiAqL1xuZnVuY3Rpb24gdW53cmFwUk5vZGUodmFsdWUpIHtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZVtIT1NUXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBUcnVlIGlmIGB2YWx1ZWAgaXMgYExWaWV3YC5cbiAqIEBwYXJhbSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCwgYFN0eWxpbmdDb250ZXh0YFxuICovXG5mdW5jdGlvbiBpc0xWaWV3KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRydWUgaWYgYHZhbHVlYCBpcyBgTENvbnRhaW5lcmAuXG4gKiBAcGFyYW0gdmFsdWUgd3JhcHBlZCB2YWx1ZSBvZiBgUk5vZGVgLCBgTFZpZXdgLCBgTENvbnRhaW5lcmAsIGBTdHlsaW5nQ29udGV4dGBcbiAqL1xuZnVuY3Rpb24gaXNMQ29udGFpbmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlW1RZUEVdID09PSB0cnVlO1xufVxuLyoqXG4gKiBUcnVlIGlmIGB2YWx1ZWAgaXMgYFN0eWxpbmdDb250ZXh0YC5cbiAqIEBwYXJhbSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCwgYFN0eWxpbmdDb250ZXh0YFxuICovXG5mdW5jdGlvbiBpc1N0eWxpbmdDb250ZXh0KHZhbHVlKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ251bWJlcic7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhbiBlbGVtZW50IHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGB2aWV3RGF0YWAsIGJ5IHVud3JhcHBpbmdcbiAqIGZyb20gYW55IGNvbnRhaW5lcnMsIGNvbXBvbmVudCB2aWV3cywgb3Igc3R5bGUgY29udGV4dHMuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJ5SW5kZXgoaW5kZXgsIGxWaWV3KSB7XG4gICAgcmV0dXJuIHVud3JhcFJOb2RlKGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF0pO1xufVxuZnVuY3Rpb24gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgaG9zdFZpZXcpIHtcbiAgICByZXR1cm4gdW53cmFwUk5vZGUoaG9zdFZpZXdbdE5vZGUuaW5kZXhdKTtcbn1cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB0cnVlYCBpZiBhIGdpdmVuIGBUTm9kZWAgaGFzIGFueSBtYXRjaGluZyBkaXJlY3RpdmVzLlxuICovXG5mdW5jdGlvbiBoYXNEaXJlY3RpdmVzKHROb2RlKSB7XG4gICAgcmV0dXJuIHROb2RlLmRpcmVjdGl2ZUVuZCA+IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xufVxuZnVuY3Rpb24gZ2V0VE5vZGUoaW5kZXgsIHZpZXcpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0R3JlYXRlclRoYW4oaW5kZXgsIC0xLCAnd3JvbmcgaW5kZXggZm9yIFROb2RlJyk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExlc3NUaGFuKGluZGV4LCB2aWV3W1RWSUVXXS5kYXRhLmxlbmd0aCwgJ3dyb25nIGluZGV4IGZvciBUTm9kZScpO1xuICAgIHJldHVybiB2aWV3W1RWSUVXXS5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF07XG59XG4vKiogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhbnkgYExWaWV3YCBvciBgVERhdGFgLiAqL1xuZnVuY3Rpb24gbG9hZEludGVybmFsKHZpZXcsIGluZGV4KSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKHZpZXcsIGluZGV4ICsgSEVBREVSX09GRlNFVCk7XG4gICAgcmV0dXJuIHZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFZpZXdCeUluZGV4KG5vZGVJbmRleCwgaG9zdFZpZXcpIHtcbiAgICAvLyBDb3VsZCBiZSBhbiBMVmlldyBvciBhbiBMQ29udGFpbmVyLiBJZiBMQ29udGFpbmVyLCB1bndyYXAgdG8gZmluZCBMVmlldy5cbiAgICB2YXIgc2xvdFZhbHVlID0gaG9zdFZpZXdbbm9kZUluZGV4XTtcbiAgICB2YXIgbFZpZXcgPSBpc0xWaWV3KHNsb3RWYWx1ZSkgPyBzbG90VmFsdWUgOiBzbG90VmFsdWVbSE9TVF07XG4gICAgcmV0dXJuIGxWaWV3O1xufVxuZnVuY3Rpb24gaXNDb250ZW50UXVlcnlIb3N0KHROb2RlKSB7XG4gICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDQgLyogaGFzQ29udGVudFF1ZXJ5ICovKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50KHROb2RlKSB7XG4gICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDEgLyogaXNDb21wb25lbnQgKi8pID09PSAxIC8qIGlzQ29tcG9uZW50ICovO1xufVxuZnVuY3Rpb24gaXNDb21wb25lbnREZWYoZGVmKSB7XG4gICAgcmV0dXJuIGRlZi50ZW1wbGF0ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzUm9vdFZpZXcodGFyZ2V0KSB7XG4gICAgcmV0dXJuICh0YXJnZXRbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLykgIT09IDA7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1vbmtleS1wYXRjaCB2YWx1ZSBkYXRhIHByZXNlbnQgb24gdGhlIHRhcmdldCAod2hpY2ggY291bGQgYmVcbiAqIGEgY29tcG9uZW50LCBkaXJlY3RpdmUgb3IgYSBET00gbm9kZSkuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQYXRjaGVkRGF0YSh0YXJnZXQpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0YXJnZXQsICdUYXJnZXQgZXhwZWN0ZWQnKTtcbiAgICByZXR1cm4gdGFyZ2V0W01PTktFWV9QQVRDSF9LRVlfTkFNRV07XG59XG5mdW5jdGlvbiByZWFkUGF0Y2hlZExWaWV3KHRhcmdldCkge1xuICAgIHZhciB2YWx1ZSA9IHJlYWRQYXRjaGVkRGF0YSh0YXJnZXQpO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLmxWaWV3O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS5cbiAqXG4gKiBOb3RlOiBUaGlzIGRldGVybWluZXMgd2hldGhlciBhIHZpZXcgc2hvdWxkIGJlIGNoZWNrZWQsIG5vdCB3aGV0aGVyIGl0J3MgaW5zZXJ0ZWRcbiAqIGludG8gYSBjb250YWluZXIuIEZvciB0aGF0LCB5b3UnbGwgd2FudCBgdmlld0F0dGFjaGVkVG9Db250YWluZXJgIGJlbG93LlxuICovXG5mdW5jdGlvbiB2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKHZpZXcpIHtcbiAgICByZXR1cm4gKHZpZXdbRkxBR1NdICYgMTI4IC8qIEF0dGFjaGVkICovKSA9PT0gMTI4IC8qIEF0dGFjaGVkICovO1xufVxuLyoqIFJldHVybnMgYSBib29sZWFuIGZvciB3aGV0aGVyIHRoZSB2aWV3IGlzIGF0dGFjaGVkIHRvIGEgY29udGFpbmVyLiAqL1xuZnVuY3Rpb24gdmlld0F0dGFjaGVkVG9Db250YWluZXIodmlldykge1xuICAgIHJldHVybiBpc0xDb250YWluZXIodmlld1tQQVJFTlRdKTtcbn1cbi8qKlxuICogUmVzZXRzIHRoZSBwcmUtb3JkZXIgaG9vayBmbGFncyBvZiB0aGUgdmlldy5cbiAqIEBwYXJhbSBsVmlldyB0aGUgTFZpZXcgb24gd2hpY2ggdGhlIGZsYWdzIGFyZSByZXNldFxuICovXG5mdW5jdGlvbiByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KSB7XG4gICAgbFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gPSAwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBhc3NlcnRDb21wb25lbnRUeXBlKGFjdHVhbCwgbXNnKSB7XG4gICAgaWYgKG1zZyA9PT0gdm9pZCAwKSB7IG1zZyA9ICdUeXBlIHBhc3NlZCBpbiBpcyBub3QgQ29tcG9uZW50VHlwZSwgaXQgZG9lcyBub3QgaGF2ZSBcXCduZ0NvbXBvbmVudERlZlxcJyBwcm9wZXJ0eS4nOyB9XG4gICAgaWYgKCFnZXRDb21wb25lbnREZWYoYWN0dWFsKSkge1xuICAgICAgICB0aHJvd0Vycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0TmdNb2R1bGVUeXBlKGFjdHVhbCwgbXNnKSB7XG4gICAgaWYgKG1zZyA9PT0gdm9pZCAwKSB7IG1zZyA9ICdUeXBlIHBhc3NlZCBpbiBpcyBub3QgTmdNb2R1bGVUeXBlLCBpdCBkb2VzIG5vdCBoYXZlIFxcJ25nTW9kdWxlRGVmXFwnIHByb3BlcnR5Lic7IH1cbiAgICBpZiAoIWdldE5nTW9kdWxlRGVmKGFjdHVhbCkpIHtcbiAgICAgICAgdGhyb3dFcnJvcihtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFzc2VydFByZXZpb3VzSXNQYXJlbnQoaXNQYXJlbnQpIHtcbiAgICBhc3NlcnRFcXVhbChpc1BhcmVudCwgdHJ1ZSwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgYmUgYSBwYXJlbnQnKTtcbn1cbmZ1bmN0aW9uIGFzc2VydEhhc1BhcmVudCh0Tm9kZSkge1xuICAgIGFzc2VydERlZmluZWQodE5vZGUucGFyZW50LCAncHJldmlvdXNPclBhcmVudFROb2RlIHNob3VsZCBoYXZlIGEgcGFyZW50Jyk7XG59XG5mdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyT3JVbmRlZmluZWQodmFsdWUpIHtcbiAgICB2YWx1ZSAmJiBhc3NlcnRFcXVhbChpc0xDb250YWluZXIodmFsdWUpLCB0cnVlLCAnRXhwZWN0aW5nIExDb250YWluZXIgb3IgdW5kZWZpbmVkIG9yIG51bGwnKTtcbn1cbmZ1bmN0aW9uIGFzc2VydExDb250YWluZXIodmFsdWUpIHtcbiAgICBhc3NlcnREZWZpbmVkKHZhbHVlLCAnTENvbnRhaW5lciBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICBhc3NlcnRFcXVhbChpc0xDb250YWluZXIodmFsdWUpLCB0cnVlLCAnRXhwZWN0aW5nIExDb250YWluZXInKTtcbn1cbmZ1bmN0aW9uIGFzc2VydExWaWV3T3JVbmRlZmluZWQodmFsdWUpIHtcbiAgICB2YWx1ZSAmJiBhc3NlcnRFcXVhbChpc0xWaWV3KHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMVmlldyBvciB1bmRlZmluZWQgb3IgbnVsbCcpO1xufVxuZnVuY3Rpb24gYXNzZXJ0TFZpZXcodmFsdWUpIHtcbiAgICBhc3NlcnREZWZpbmVkKHZhbHVlLCAnTFZpZXcgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgYXNzZXJ0RXF1YWwoaXNMVmlldyh2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTFZpZXcnKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFROT0RFID0gODtcbnZhciBQQVJFTlRfSU5KRUNUT1IgPSA4O1xudmFyIElOSkVDVE9SX0JMT09NX1BBUkVOVF9TSVpFID0gOTtcbnZhciBOT19QQVJFTlRfSU5KRUNUT1IgPSAtMTtcbi8qKlxuICogRWFjaCBpbmplY3RvciBpcyBzYXZlZCBpbiA5IGNvbnRpZ3VvdXMgc2xvdHMgaW4gYExWaWV3YCBhbmQgOSBjb250aWd1b3VzIHNsb3RzIGluXG4gKiBgVFZpZXcuZGF0YWAuIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IG5vZGUncyB0b2tlbnMgKHdoaWNoXG4gKiBjYW4gYmUgc2hhcmVkIGluIGBUVmlld2ApIGFzIHdlbGwgYXMgdGhlIHRva2VucyBvZiBpdHMgYW5jZXN0b3Igbm9kZXMgKHdoaWNoIGNhbm5vdCBiZVxuICogc2hhcmVkLCBzbyB0aGV5IGxpdmUgaW4gYExWaWV3YCkuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBzbG90cyAoYXNpZGUgZnJvbSB0aGUgbGFzdCBzbG90KSBjb250YWlucyBhIGJsb29tIGZpbHRlci4gVGhpcyBibG9vbSBmaWx0ZXJcbiAqIGRldGVybWluZXMgd2hldGhlciBhIGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUgb24gdGhlIGFzc29jaWF0ZWQgbm9kZSBvciBub3QuIFRoaXMgcHJldmVudHMgdXNcbiAqIGZyb20gc2VhcmNoaW5nIHRoZSBkaXJlY3RpdmVzIGFycmF5IGF0IHRoaXMgbGV2ZWwgdW5sZXNzIGl0J3MgcHJvYmFibGUgdGhlIGRpcmVjdGl2ZSBpcyBpbiBpdC5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jsb29tX2ZpbHRlciBmb3IgbW9yZSBhYm91dCBibG9vbSBmaWx0ZXJzLlxuICpcbiAqIEJlY2F1c2UgYWxsIGluamVjdG9ycyBoYXZlIGJlZW4gZmxhdHRlbmVkIGludG8gYExWaWV3YCBhbmQgYFRWaWV3RGF0YWAsIHRoZXkgY2Fubm90IHR5cGVkXG4gKiB1c2luZyBpbnRlcmZhY2VzIGFzIHRoZXkgd2VyZSBwcmV2aW91c2x5LiBUaGUgc3RhcnQgaW5kZXggb2YgZWFjaCBgTEluamVjdG9yYCBhbmQgYFRJbmplY3RvcmBcbiAqIHdpbGwgZGlmZmVyIGJhc2VkIG9uIHdoZXJlIGl0IGlzIGZsYXR0ZW5lZCBpbnRvIHRoZSBtYWluIGFycmF5LCBzbyBpdCdzIG5vdCBwb3NzaWJsZSB0byBrbm93XG4gKiB0aGUgaW5kaWNlcyBhaGVhZCBvZiB0aW1lIGFuZCBzYXZlIHRoZWlyIHR5cGVzIGhlcmUuIFRoZSBpbnRlcmZhY2VzIGFyZSBzdGlsbCBpbmNsdWRlZCBoZXJlXG4gKiBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy5cbiAqXG4gKiBleHBvcnQgaW50ZXJmYWNlIExJbmplY3RvciBleHRlbmRzIEFycmF5PGFueT4ge1xuICpcbiAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMC0zMSAgKElEcyBhcmUgJSBCTE9PTV9TSVpFKVxuICogICAgWzBdOiBudW1iZXI7XG4gKlxuICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAzMi02M1xuICogICAgWzFdOiBudW1iZXI7XG4gKlxuICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyA2NC05NVxuICogICAgWzJdOiBudW1iZXI7XG4gKlxuICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyA5Ni0xMjdcbiAqICAgIFszXTogbnVtYmVyO1xuICpcbiAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTI4LTE1OVxuICogICAgWzRdOiBudW1iZXI7XG4gKlxuICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxNjAgLSAxOTFcbiAqICAgIFs1XTogbnVtYmVyO1xuICpcbiAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTkyIC0gMjIzXG4gKiAgICBbNl06IG51bWJlcjtcbiAqXG4gKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDIyNCAtIDI1NVxuICogICAgWzddOiBudW1iZXI7XG4gKlxuICogICAgLy8gV2UgbmVlZCB0byBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgaW5qZWN0b3IncyBwYXJlbnQgc28gREkgY2FuIGtlZXAgbG9va2luZyB1cFxuICogICAgLy8gdGhlIGluamVjdG9yIHRyZWUgdW50aWwgaXQgZmluZHMgdGhlIGRlcGVuZGVuY3kgaXQncyBsb29raW5nIGZvci5cbiAqICAgIFtQQVJFTlRfSU5KRUNUT1JdOiBudW1iZXI7XG4gKiB9XG4gKlxuICogZXhwb3J0IGludGVyZmFjZSBUSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHtcbiAqXG4gKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAwLTMxICAoSURzIGFyZSAlIEJMT09NX1NJWkUpXG4gKiAgICBbMF06IG51bWJlcjtcbiAqXG4gKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAzMi02M1xuICogICAgWzFdOiBudW1iZXI7XG4gKlxuICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgNjQtOTVcbiAqICAgIFsyXTogbnVtYmVyO1xuICpcbiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDk2LTEyN1xuICogICAgWzNdOiBudW1iZXI7XG4gKlxuICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTI4LTE1OVxuICogICAgWzRdOiBudW1iZXI7XG4gKlxuICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTYwIC0gMTkxXG4gKiAgICBbNV06IG51bWJlcjtcbiAqXG4gKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxOTIgLSAyMjNcbiAqICAgIFs2XTogbnVtYmVyO1xuICpcbiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDIyNCAtIDI1NVxuICogICAgWzddOiBudW1iZXI7XG4gKlxuICogICAgLy8gTmVjZXNzYXJ5IHRvIGZpbmQgZGlyZWN0aXZlIGluZGljZXMgZm9yIGEgcGFydGljdWxhciBub2RlLlxuICogICAgW1ROT0RFXTogVEVsZW1lbnROb2RlfFRFbGVtZW50Q29udGFpbmVyTm9kZXxUQ29udGFpbmVyTm9kZTtcbiAqICB9XG4gKi9cbi8qKlxuKiBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgaW5qZWN0b3JzIGluIHRoZSBOb2RlSW5qZWN0b3IuXG4qXG4qIFRoaXMgZmFjdG9yeSBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGNhbiByZXNvbHZlIGBtdWx0aWAgZmFjdG9yaWVzIGFzIHdlbGwuXG4qXG4qIE5PVEU6IFNvbWUgb2YgdGhlIGZpZWxkcyBhcmUgb3B0aW9uYWwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIGNsYXNzIGhhcyB0d28gaGlkZGVuIGNsYXNzZXMuXG4qIC0gT25lIHdpdGhvdXQgYG11bHRpYCBzdXBwb3J0IChtb3N0IGNvbW1vbilcbiogLSBPbmUgd2l0aCBgbXVsdGlgIHZhbHVlcywgKHJhcmUpLlxuKlxuKiBTaW5jZSBWTXMgY2FuIGNhY2hlIHVwIHRvIDQgaW5saW5lIGhpZGRlbiBjbGFzc2VzIHRoaXMgaXMgT0suXG4qXG4qIC0gU2luZ2xlIGZhY3Rvcnk6IE9ubHkgYHJlc29sdmluZ2AgYW5kIGBmYWN0b3J5YCBpcyBkZWZpbmVkLlxuKiAtIGBwcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXggPSAtMWAuXG4qIC0gYHZpZXdQcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXhgIHBvaW50cyB0byBgcHJvdmlkZXJzYC5cbiovXG52YXIgTm9kZUluamVjdG9yRmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb2RlSW5qZWN0b3JGYWN0b3J5KFxuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgdG8gaW52b2tlIGluIG9yZGVyIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmYWN0b3J5LCBcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIGlmIHRoZSB0b2tlbiBpcyBkZWNsYXJlZCBpbiBgdmlld1Byb3ZpZGVyc2AgKG9yIGlmIGl0IGlzIGNvbXBvbmVudCkuXG4gICAgICovXG4gICAgaXNWaWV3UHJvdmlkZXIsIGluamVjdEltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXJrZXIgc2V0IHRvIHRydWUgZHVyaW5nIGZhY3RvcnkgaW52b2NhdGlvbiB0byBzZWUgaWYgd2UgZ2V0IGludG8gcmVjdXJzaXZlIGxvb3AuXG4gICAgICAgICAqIFJlY3Vyc2l2ZSBsb29wIGNhdXNlcyBhbiBlcnJvciB0byBiZSBkaXNwbGF5ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlc29sdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhblNlZVZpZXdQcm92aWRlcnMgPSBpc1ZpZXdQcm92aWRlcjtcbiAgICAgICAgdGhpcy5pbmplY3RJbXBsID0gaW5qZWN0SW1wbGVtZW50YXRpb247XG4gICAgfVxuICAgIHJldHVybiBOb2RlSW5qZWN0b3JGYWN0b3J5O1xufSgpKTtcbmZ1bmN0aW9uIGlzRmFjdG9yeShvYmopIHtcbiAgICAvLyBTZWU6IGh0dHBzOi8vanNwZXJmLmNvbS9pbnN0YW5jZW9mLXZzLWdldHByb3RvdHlwZW9mXG4gICAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09IE5vZGVJbmplY3RvckZhY3RvcnkucHJvdG90eXBlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBhc3NlcnROb2RlVHlwZSh0Tm9kZSwgdHlwZSkge1xuICAgIGFzc2VydERlZmluZWQodE5vZGUsICdzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBUTm9kZScpO1xuICAgIGFzc2VydEVxdWFsKHROb2RlLnR5cGUsIHR5cGUsIFwic2hvdWxkIGJlIGEgXCIgKyB0eXBlTmFtZSh0eXBlKSk7XG59XG5mdW5jdGlvbiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlKSB7XG4gICAgdmFyIHR5cGVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdHlwZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIGFzc2VydERlZmluZWQodE5vZGUsICdzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBUTm9kZScpO1xuICAgIHZhciBmb3VuZCA9IHR5cGVzLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHROb2RlLnR5cGUgPT09IHR5cGU7IH0pO1xuICAgIGFzc2VydEVxdWFsKGZvdW5kLCB0cnVlLCBcIlNob3VsZCBiZSBvbmUgb2YgXCIgKyB0eXBlcy5tYXAodHlwZU5hbWUpLmpvaW4oJywgJykgKyBcIiBidXQgZ290IFwiICsgdHlwZU5hbWUodE5vZGUudHlwZSkpO1xufVxuZnVuY3Rpb24gdHlwZU5hbWUodHlwZSkge1xuICAgIGlmICh0eXBlID09IDEgLyogUHJvamVjdGlvbiAqLylcbiAgICAgICAgcmV0dXJuICdQcm9qZWN0aW9uJztcbiAgICBpZiAodHlwZSA9PSAwIC8qIENvbnRhaW5lciAqLylcbiAgICAgICAgcmV0dXJuICdDb250YWluZXInO1xuICAgIGlmICh0eXBlID09IDIgLyogVmlldyAqLylcbiAgICAgICAgcmV0dXJuICdWaWV3JztcbiAgICBpZiAodHlwZSA9PSAzIC8qIEVsZW1lbnQgKi8pXG4gICAgICAgIHJldHVybiAnRWxlbWVudCc7XG4gICAgaWYgKHR5cGUgPT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKVxuICAgICAgICByZXR1cm4gJ0VsZW1lbnRDb250YWluZXInO1xuICAgIHJldHVybiAnPHVua25vd24+Jztcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBZGRzIGFsbCBkaXJlY3RpdmUgbGlmZWN5Y2xlIGhvb2tzIGZyb20gdGhlIGdpdmVuIGBEaXJlY3RpdmVEZWZgIHRvIHRoZSBnaXZlbiBgVFZpZXdgLlxuICpcbiAqIE11c3QgYmUgcnVuICpvbmx5KiBvbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcy5cbiAqXG4gKiBTZXRzIHVwIHRoZSBwcmUtb3JkZXIgaG9va3Mgb24gdGhlIHByb3ZpZGVkIGB0Vmlld2AsXG4gKiBzZWUge0BsaW5rIEhvb2tEYXRhfSBmb3IgZGV0YWlscyBhYm91dCB0aGUgZGF0YSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIGRpcmVjdGl2ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGlyZWN0aXZlIGluIExWaWV3XG4gKiBAcGFyYW0gZGlyZWN0aXZlRGVmIFRoZSBkZWZpbml0aW9uIGNvbnRhaW5pbmcgdGhlIGhvb2tzIHRvIHNldHVwIGluIHRWaWV3XG4gKiBAcGFyYW0gdFZpZXcgVGhlIGN1cnJlbnQgVFZpZXdcbiAqIEBwYXJhbSBub2RlSW5kZXggVGhlIGluZGV4IG9mIHRoZSBub2RlIHRvIHdoaWNoIHRoZSBkaXJlY3RpdmUgaXMgYXR0YWNoZWRcbiAqIEBwYXJhbSBpbml0aWFsUHJlT3JkZXJIb29rc0xlbmd0aCB0aGUgbnVtYmVyIG9mIHByZS1vcmRlciBob29rcyBhbHJlYWR5IHJlZ2lzdGVyZWQgYmVmb3JlIHRoZVxuICogY3VycmVudCBwcm9jZXNzLCB1c2VkIHRvIGtub3cgaWYgdGhlIG5vZGUgaW5kZXggaGFzIHRvIGJlIGFkZGVkIHRvIHRoZSBhcnJheS4gSWYgaXQgaXMgLTEsXG4gKiB0aGUgbm9kZSBpbmRleCBpcyBuZXZlciBhZGRlZC5cbiAqIEBwYXJhbSBpbml0aWFsUHJlT3JkZXJDaGVja0hvb2tzTGVuZ3RoIHNhbWUgYXMgcHJldmlvdXMgZm9yIHByZS1vcmRlciBjaGVjayBob29rc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclByZU9yZGVySG9va3MoZGlyZWN0aXZlSW5kZXgsIGRpcmVjdGl2ZURlZiwgdFZpZXcsIG5vZGVJbmRleCwgaW5pdGlhbFByZU9yZGVySG9va3NMZW5ndGgsIGluaXRpYWxQcmVPcmRlckNoZWNrSG9va3NMZW5ndGgpIHtcbiAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MsIHRydWUsICdTaG91bGQgb25seSBiZSBjYWxsZWQgb24gZmlyc3QgdGVtcGxhdGUgcGFzcycpO1xuICAgIHZhciBvbkNoYW5nZXMgPSBkaXJlY3RpdmVEZWYub25DaGFuZ2VzLCBvbkluaXQgPSBkaXJlY3RpdmVEZWYub25Jbml0LCBkb0NoZWNrID0gZGlyZWN0aXZlRGVmLmRvQ2hlY2s7XG4gICAgaWYgKGluaXRpYWxQcmVPcmRlckhvb2tzTGVuZ3RoID49IDAgJiZcbiAgICAgICAgKCF0Vmlldy5wcmVPcmRlckhvb2tzIHx8IGluaXRpYWxQcmVPcmRlckhvb2tzTGVuZ3RoID09PSB0Vmlldy5wcmVPcmRlckhvb2tzLmxlbmd0aCkgJiZcbiAgICAgICAgKG9uQ2hhbmdlcyB8fCBvbkluaXQgfHwgZG9DaGVjaykpIHtcbiAgICAgICAgKHRWaWV3LnByZU9yZGVySG9va3MgfHwgKHRWaWV3LnByZU9yZGVySG9va3MgPSBbXSkpLnB1c2gobm9kZUluZGV4KTtcbiAgICB9XG4gICAgaWYgKGluaXRpYWxQcmVPcmRlckNoZWNrSG9va3NMZW5ndGggPj0gMCAmJlxuICAgICAgICAoIXRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyB8fFxuICAgICAgICAgICAgaW5pdGlhbFByZU9yZGVyQ2hlY2tIb29rc0xlbmd0aCA9PT0gdFZpZXcucHJlT3JkZXJDaGVja0hvb2tzLmxlbmd0aCkgJiZcbiAgICAgICAgKG9uQ2hhbmdlcyB8fCBkb0NoZWNrKSkge1xuICAgICAgICAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgPSBbXSkpLnB1c2gobm9kZUluZGV4KTtcbiAgICB9XG4gICAgaWYgKG9uQ2hhbmdlcykge1xuICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaChkaXJlY3RpdmVJbmRleCwgb25DaGFuZ2VzKTtcbiAgICAgICAgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyB8fCAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBvbkNoYW5nZXMpO1xuICAgIH1cbiAgICBpZiAob25Jbml0KSB7XG4gICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKC1kaXJlY3RpdmVJbmRleCwgb25Jbml0KTtcbiAgICB9XG4gICAgaWYgKGRvQ2hlY2spIHtcbiAgICAgICAgKHRWaWV3LnByZU9yZGVySG9va3MgfHwgKHRWaWV3LnByZU9yZGVySG9va3MgPSBbXSkpLnB1c2goZGlyZWN0aXZlSW5kZXgsIGRvQ2hlY2spO1xuICAgICAgICAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgPSBbXSkpLnB1c2goZGlyZWN0aXZlSW5kZXgsIGRvQ2hlY2spO1xuICAgIH1cbn1cbi8qKlxuICpcbiAqIExvb3BzIHRocm91Z2ggdGhlIGRpcmVjdGl2ZXMgb24gdGhlIHByb3ZpZGVkIGB0Tm9kZWAgYW5kIHF1ZXVlcyBob29rcyB0byBiZVxuICogcnVuIHRoYXQgYXJlIG5vdCBpbml0aWFsaXphdGlvbiBob29rcy5cbiAqXG4gKiBTaG91bGQgYmUgZXhlY3V0ZWQgZHVyaW5nIGBlbGVtZW50RW5kKClgIGFuZCBzaW1pbGFyIHRvXG4gKiBwcmVzZXJ2ZSBob29rIGV4ZWN1dGlvbiBvcmRlci4gQ29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kgaG9va3MgZm9yIHByb2plY3RlZFxuICogY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB0aGVpciBob3N0cy5cbiAqXG4gKiBTZXRzIHVwIHRoZSBjb250ZW50LCB2aWV3LCBhbmQgZGVzdHJveSBob29rcyBvbiB0aGUgcHJvdmlkZWQgYHRWaWV3YCxcbiAqIHNlZSB7QGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS5cbiAqXG4gKiBOT1RFOiBUaGlzIGRvZXMgbm90IHNldCB1cCBgb25DaGFuZ2VzYCwgYG9uSW5pdGAgb3IgYGRvQ2hlY2tgLCB0aG9zZSBhcmUgc2V0IHVwXG4gKiBzZXBhcmF0ZWx5IGF0IGBlbGVtZW50U3RhcnRgLlxuICpcbiAqIEBwYXJhbSB0VmlldyBUaGUgY3VycmVudCBUVmlld1xuICogQHBhcmFtIHROb2RlIFRoZSBUTm9kZSB3aG9zZSBkaXJlY3RpdmVzIGFyZSB0byBiZSBzZWFyY2hlZCBmb3IgaG9va3MgdG8gcXVldWVcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgdE5vZGUpIHtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gbG9vcCB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIGF0IGVsZW1lbnRFbmQoKSAocmF0aGVyIHRoYW4gcHJvY2Vzc2luZyBpblxuICAgICAgICAvLyBkaXJlY3RpdmVDcmVhdGUpIHNvIHdlIGNhbiBwcmVzZXJ2ZSB0aGUgY3VycmVudCBob29rIG9yZGVyLiBDb250ZW50LCB2aWV3LCBhbmQgZGVzdHJveVxuICAgICAgICAvLyBob29rcyBmb3IgcHJvamVjdGVkIGNvbXBvbmVudHMgYW5kIGRpcmVjdGl2ZXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlaXIgaG9zdHMuXG4gICAgICAgIGZvciAodmFyIGkgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydCwgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3RpdmVEZWYgPSB0Vmlldy5kYXRhW2ldO1xuICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5hZnRlckNvbnRlbnRJbml0KSB7XG4gICAgICAgICAgICAgICAgKHRWaWV3LmNvbnRlbnRIb29rcyB8fCAodFZpZXcuY29udGVudEhvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50SW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAodFZpZXcuY29udGVudEhvb2tzIHx8ICh0Vmlldy5jb250ZW50SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpO1xuICAgICAgICAgICAgICAgICh0Vmlldy5jb250ZW50Q2hlY2tIb29rcyB8fCAodFZpZXcuY29udGVudENoZWNrSG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5hZnRlclZpZXdJbml0KSB7XG4gICAgICAgICAgICAgICAgKHRWaWV3LnZpZXdIb29rcyB8fCAodFZpZXcudmlld0hvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3SW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAodFZpZXcudmlld0hvb2tzIHx8ICh0Vmlldy52aWV3SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpO1xuICAgICAgICAgICAgICAgICh0Vmlldy52aWV3Q2hlY2tIb29rcyB8fCAodFZpZXcudmlld0NoZWNrSG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5vbkRlc3Ryb3kgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICh0Vmlldy5kZXN0cm95SG9va3MgfHwgKHRWaWV3LmRlc3Ryb3lIb29rcyA9IFtdKSkucHVzaChpLCBkaXJlY3RpdmVEZWYub25EZXN0cm95KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogRXhlY3V0aW5nIGhvb2tzIHJlcXVpcmVzIGNvbXBsZXggbG9naWMgYXMgd2UgbmVlZCB0byBkZWFsIHdpdGggMiBjb25zdHJhaW50cy5cbiAqXG4gKiAxLiBJbml0IGhvb2tzIChuZ09uSW5pdCwgbmdBZnRlckNvbnRlbnRJbml0LCBuZ0FmdGVyVmlld0luaXQpIG11c3QgYWxsIGJlIGV4ZWN1dGVkIG9uY2UgYW5kIG9ubHlcbiAqIG9uY2UsIGFjcm9zcyBtYW55IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLiBUaGlzIG11c3QgYmUgdHJ1ZSBldmVuIGlmIHNvbWUgaG9va3MgdGhyb3csIG9yIGlmXG4gKiBzb21lIHJlY3Vyc2l2ZWx5IHRyaWdnZXIgYSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLlxuICogVG8gc29sdmUgdGhhdCwgaXQgaXMgcmVxdWlyZWQgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5pdCBob29rcy5cbiAqIFRoaXMgaXMgZG9uZSBieSBzdG9yaW5nIGFuZCBtYWludGFpbmluZyBmbGFncyBpbiB0aGUgdmlldzogdGhlIHtAbGluayBJbml0UGhhc2VTdGF0ZX0sXG4gKiBhbmQgdGhlIGluZGV4IHdpdGhpbiB0aGF0IHBoYXNlLiBUaGV5IGNhbiBiZSBzZWVuIGFzIGEgY3Vyc29yIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICogW1tvbkluaXQxLCBvbkluaXQyXSwgW2FmdGVyQ29udGVudEluaXQxXSwgW2FmdGVyVmlld0luaXQxLCBhZnRlclZpZXdJbml0MiwgYWZ0ZXJWaWV3SW5pdDNdXVxuICogVGhleSBhcmUgYXJlIHN0b3JlZCBhcyBmbGFncyBpbiBMVmlld1tGTEFHU10uXG4gKlxuICogMi4gUHJlLW9yZGVyIGhvb2tzIGNhbiBiZSBleGVjdXRlZCBpbiBiYXRjaGVzLCBiZWNhdXNlIG9mIHRoZSBzZWxlY3QgaW5zdHJ1Y3Rpb24uXG4gKiBUbyBiZSBhYmxlIHRvIHBhdXNlIGFuZCByZXN1bWUgdGhlaXIgZXhlY3V0aW9uLCB3ZSBhbHNvIG5lZWQgc29tZSBzdGF0ZSBhYm91dCB0aGUgaG9vaydzIGFycmF5XG4gKiB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZDpcbiAqIC0gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhvb2sgdG8gYmUgZXhlY3V0ZWRcbiAqIC0gdGhlIG51bWJlciBvZiBpbml0IGhvb2tzIGFscmVhZHkgZm91bmQgaW4gdGhlIHByb2Nlc3NlZCBwYXJ0IG9mIHRoZSAgYXJyYXlcbiAqIFRoZXkgYXJlIGFyZSBzdG9yZWQgYXMgZmxhZ3MgaW4gTFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10uXG4gKi9cbi8qKlxuICogRXhlY3V0ZXMgbmVjZXNzYXJ5IGhvb2tzIGF0IHRoZSBzdGFydCBvZiBleGVjdXRpbmcgYSB0ZW1wbGF0ZS5cbiAqXG4gKiBFeGVjdXRlcyBob29rcyB0aGF0IGFyZSB0byBiZSBydW4gZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiBhIGRpcmVjdGl2ZSBzdWNoXG4gKiBhcyBgb25DaGFuZ2VzYCwgYG9uSW5pdGAsIGFuZCBgZG9DaGVja2AuXG4gKlxuICogQHBhcmFtIGxWaWV3IFRoZSBjdXJyZW50IHZpZXdcbiAqIEBwYXJhbSB0VmlldyBTdGF0aWMgZGF0YSBmb3IgdGhlIHZpZXcgY29udGFpbmluZyB0aGUgaG9va3MgdG8gYmUgZXhlY3V0ZWRcbiAqIEBwYXJhbSBjaGVja05vQ2hhbmdlc01vZGUgV2hldGhlciBvciBub3Qgd2UncmUgaW4gY2hlY2tOb0NoYW5nZXMgbW9kZS5cbiAqIEBwYXJhbSBAcGFyYW0gY3VycmVudE5vZGVJbmRleCAyIGNhc2VzIGRlcGVuZGluZyB0aGUgdGhlIHZhbHVlOlxuICogLSB1bmRlZmluZWQ6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheSAocHJlLW9yZGVyIGNhc2UsXG4gKiB3aGVuIGZsdXNoaW5nIHRoZSByZW1haW5pbmcgaG9va3MpXG4gKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlclxuICogY2FzZSwgd2hlbiBleGVjdXRpbmcgc2VsZWN0KG51bWJlcikpXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVQcmVPcmRlckhvb2tzKGN1cnJlbnRWaWV3LCB0VmlldywgY2hlY2tOb0NoYW5nZXNNb2RlLCBjdXJyZW50Tm9kZUluZGV4KSB7XG4gICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHtcbiAgICAgICAgZXhlY3V0ZUhvb2tzKGN1cnJlbnRWaWV3LCB0Vmlldy5wcmVPcmRlckhvb2tzLCB0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MsIGNoZWNrTm9DaGFuZ2VzTW9kZSwgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8sIGN1cnJlbnROb2RlSW5kZXggIT09IHVuZGVmaW5lZCA/IGN1cnJlbnROb2RlSW5kZXggOiBudWxsKTtcbiAgICB9XG59XG4vKipcbiAqIEV4ZWN1dGVzIGhvb2tzIGFnYWluc3QgdGhlIGdpdmVuIGBMVmlld2AgYmFzZWQgb2ZmIG9mIHdoZXRoZXIgb3Igbm90XG4gKiBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzLlxuICpcbiAqIEBwYXJhbSBjdXJyZW50VmlldyBUaGUgdmlldyBpbnN0YW5jZSBkYXRhIHRvIHJ1biB0aGUgaG9va3MgYWdhaW5zdFxuICogQHBhcmFtIGZpcnN0UGFzc0hvb2tzIEFuIGFycmF5IG9mIGhvb2tzIHRvIHJ1biBpZiB3ZSdyZSBpbiB0aGUgZmlyc3QgdmlldyBwYXNzXG4gKiBAcGFyYW0gY2hlY2tIb29rcyBBbiBBcnJheSBvZiBob29rcyB0byBydW4gaWYgd2UncmUgbm90IGluIHRoZSBmaXJzdCB2aWV3IHBhc3MuXG4gKiBAcGFyYW0gY2hlY2tOb0NoYW5nZXNNb2RlIFdoZXRoZXIgb3Igbm90IHdlJ3JlIGluIG5vIGNoYW5nZXMgbW9kZS5cbiAqIEBwYXJhbSBpbml0UGhhc2VTdGF0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5pdCBwaGFzZVxuICogQHBhcmFtIGN1cnJlbnROb2RlSW5kZXggMyBjYXNlcyBkZXBlbmRpbmcgdGhlIHRoZSB2YWx1ZTpcbiAqIC0gdW5kZWZpbmVkOiBhbGwgaG9va3MgZnJvbSB0aGUgYXJyYXkgc2hvdWxkIGJlIGV4ZWN1dGVkIChwb3N0LW9yZGVyIGNhc2UpXG4gKiAtIG51bGw6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheSAocHJlLW9yZGVyIGNhc2UsIHdoZW5cbiAqIGZsdXNoaW5nIHRoZSByZW1haW5pbmcgaG9va3MpXG4gKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlclxuICogY2FzZSwgd2hlbiBleGVjdXRpbmcgc2VsZWN0KG51bWJlcikpXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVIb29rcyhjdXJyZW50VmlldywgZmlyc3RQYXNzSG9va3MsIGNoZWNrSG9va3MsIGNoZWNrTm9DaGFuZ2VzTW9kZSwgaW5pdFBoYXNlU3RhdGUsIGN1cnJlbnROb2RlSW5kZXgpIHtcbiAgICBpZiAoY2hlY2tOb0NoYW5nZXNNb2RlKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGhvb2tzVG9DYWxsID0gKGN1cnJlbnRWaWV3W0ZMQUdTXSAmIDMgLyogSW5pdFBoYXNlU3RhdGVNYXNrICovKSA9PT0gaW5pdFBoYXNlU3RhdGUgP1xuICAgICAgICBmaXJzdFBhc3NIb29rcyA6XG4gICAgICAgIGNoZWNrSG9va3M7XG4gICAgaWYgKGhvb2tzVG9DYWxsKSB7XG4gICAgICAgIGNhbGxIb29rcyhjdXJyZW50VmlldywgaG9va3NUb0NhbGwsIGluaXRQaGFzZVN0YXRlLCBjdXJyZW50Tm9kZUluZGV4KTtcbiAgICB9XG4gICAgLy8gVGhlIGluaXQgcGhhc2Ugc3RhdGUgbXVzdCBiZSBhbHdheXMgY2hlY2tlZCBoZXJlIGFzIGl0IG1heSBoYXZlIGJlZW4gcmVjdXJzaXZlbHkgdXBkYXRlZFxuICAgIGlmIChjdXJyZW50Tm9kZUluZGV4ID09IG51bGwgJiZcbiAgICAgICAgKGN1cnJlbnRWaWV3W0ZMQUdTXSAmIDMgLyogSW5pdFBoYXNlU3RhdGVNYXNrICovKSA9PT0gaW5pdFBoYXNlU3RhdGUgJiZcbiAgICAgICAgaW5pdFBoYXNlU3RhdGUgIT09IDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovKSB7XG4gICAgICAgIGN1cnJlbnRWaWV3W0ZMQUdTXSAmPSAxMDIzIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlUmVzZXQgKi87XG4gICAgICAgIGN1cnJlbnRWaWV3W0ZMQUdTXSArPSAxIC8qIEluaXRQaGFzZVN0YXRlSW5jcmVtZW50ZXIgKi87XG4gICAgfVxufVxuLyoqXG4gKiBDYWxscyBsaWZlY3ljbGUgaG9va3Mgd2l0aCB0aGVpciBjb250ZXh0cywgc2tpcHBpbmcgaW5pdCBob29rcyBpZiBpdCdzIG5vdFxuICogdGhlIGZpcnN0IExWaWV3IHBhc3NcbiAqXG4gKiBAcGFyYW0gY3VycmVudFZpZXcgVGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgaW4gd2hpY2ggdGhlIGhvb2tzIGFyZSBmb3VuZFxuICogQHBhcmFtIGluaXRQaGFzZVN0YXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbml0IHBoYXNlXG4gKiBAcGFyYW0gY3VycmVudE5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyB0aGUgdGhlIHZhbHVlOlxuICogLSB1bmRlZmluZWQ6IGFsbCBob29rcyBmcm9tIHRoZSBhcnJheSBzaG91bGQgYmUgZXhlY3V0ZWQgKHBvc3Qtb3JkZXIgY2FzZSlcbiAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlblxuICogZmx1c2hpbmcgdGhlIHJlbWFpbmluZyBob29rcylcbiAqIC0gbnVtYmVyOiBleGVjdXRlIGhvb2tzIG9ubHkgZnJvbSB0aGUgc2F2ZWQgaW5kZXggdW50aWwgdGhhdCBub2RlIGluZGV4IGV4Y2x1c2l2ZSAocHJlLW9yZGVyXG4gKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSlcbiAqL1xuZnVuY3Rpb24gY2FsbEhvb2tzKGN1cnJlbnRWaWV3LCBhcnIsIGluaXRQaGFzZSwgY3VycmVudE5vZGVJbmRleCkge1xuICAgIHZhciBzdGFydEluZGV4ID0gY3VycmVudE5vZGVJbmRleCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgKGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdICYgNjU1MzUgLyogSW5kZXhPZlRoZU5leHRQcmVPcmRlckhvb2tNYXNrTWFzayAqLykgOlxuICAgICAgICAwO1xuICAgIHZhciBub2RlSW5kZXhMaW1pdCA9IGN1cnJlbnROb2RlSW5kZXggIT0gbnVsbCA/IGN1cnJlbnROb2RlSW5kZXggOiAtMTtcbiAgICB2YXIgbGFzdE5vZGVJbmRleEZvdW5kID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaG9vayA9IGFycltpICsgMV07XG4gICAgICAgIGlmICh0eXBlb2YgaG9vayA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGxhc3ROb2RlSW5kZXhGb3VuZCA9IGFycltpXTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZUluZGV4ICE9IG51bGwgJiYgbGFzdE5vZGVJbmRleEZvdW5kID49IGN1cnJlbnROb2RlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBpc0luaXRIb29rID0gYXJyW2ldIDwgMDtcbiAgICAgICAgICAgIGlmIChpc0luaXRIb29rKVxuICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdICs9IDY1NTM2IC8qIE51bWJlck9mSW5pdEhvb2tzQ2FsbGVkSW5jcmVtZW50ZXIgKi87XG4gICAgICAgICAgICBpZiAobGFzdE5vZGVJbmRleEZvdW5kIDwgbm9kZUluZGV4TGltaXQgfHwgbm9kZUluZGV4TGltaXQgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdID1cbiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdICYgNDI5NDkwMTc2MCAvKiBOdW1iZXJPZkluaXRIb29rc0NhbGxlZE1hc2sgKi8pICsgaSArXG4gICAgICAgICAgICAgICAgICAgICAgICAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBFeGVjdXRlIG9uZSBob29rIGFnYWluc3QgdGhlIGN1cnJlbnQgYExWaWV3YC5cbiAqXG4gKiBAcGFyYW0gY3VycmVudFZpZXcgVGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIGluaXRQaGFzZVN0YXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbml0IHBoYXNlXG4gKiBAcGFyYW0gYXJyIFRoZSBhcnJheSBpbiB3aGljaCB0aGUgaG9va3MgYXJlIGZvdW5kXG4gKiBAcGFyYW0gaSBUaGUgY3VycmVudCBpbmRleCB3aXRoaW4gdGhlIGhvb2sgZGF0YSBhcnJheVxuICovXG5mdW5jdGlvbiBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpIHtcbiAgICB2YXIgaXNJbml0SG9vayA9IGFycltpXSA8IDA7XG4gICAgdmFyIGhvb2sgPSBhcnJbaSArIDFdO1xuICAgIHZhciBkaXJlY3RpdmVJbmRleCA9IGlzSW5pdEhvb2sgPyAtYXJyW2ldIDogYXJyW2ldO1xuICAgIHZhciBkaXJlY3RpdmUgPSBjdXJyZW50Vmlld1tkaXJlY3RpdmVJbmRleF07XG4gICAgaWYgKGlzSW5pdEhvb2spIHtcbiAgICAgICAgdmFyIGluZGV4V2l0aGludEluaXRQaGFzZSA9IGN1cnJlbnRWaWV3W0ZMQUdTXSA+PiAxMCAvKiBJbmRleFdpdGhpbkluaXRQaGFzZVNoaWZ0ICovO1xuICAgICAgICAvLyBUaGUgaW5pdCBwaGFzZSBzdGF0ZSBtdXN0IGJlIGFsd2F5cyBjaGVja2VkIGhlcmUgYXMgaXQgbWF5IGhhdmUgYmVlbiByZWN1cnNpdmVseVxuICAgICAgICAvLyB1cGRhdGVkXG4gICAgICAgIGlmIChpbmRleFdpdGhpbnRJbml0UGhhc2UgPFxuICAgICAgICAgICAgKGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdID4+IDE2IC8qIE51bWJlck9mSW5pdEhvb2tzQ2FsbGVkU2hpZnQgKi8pICYmXG4gICAgICAgICAgICAoY3VycmVudFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHtcbiAgICAgICAgICAgIGN1cnJlbnRWaWV3W0ZMQUdTXSArPSAxMDI0IC8qIEluZGV4V2l0aGluSW5pdFBoYXNlSW5jcmVtZW50ZXIgKi87XG4gICAgICAgICAgICBob29rLmNhbGwoZGlyZWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7XG4gICAgfVxufVxuXG52YXIgc3R5bGluZ0NvbnRleHQgPSBudWxsO1xuLyoqXG4gKiBHZXRzIHRoZSBtb3N0IHJlY2VudCBzdHlsaW5nIGNvbnRleHQgdmFsdWUuXG4gKlxuICogTm90ZSB0aGF0IG9ubHkgb25lIHN0eWxpbmcgY29udGV4dCBpcyBzdG9yZWQgYXQgYSBnaXZlbiB0aW1lLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZWRTdHlsaW5nQ29udGV4dCgpIHtcbiAgICByZXR1cm4gc3R5bGluZ0NvbnRleHQ7XG59XG4vKipcbiAqIFNldHMgdGhlIG1vc3QgcmVjZW50IHN0eWxpbmcgY29udGV4dCB2YWx1ZS5cbiAqXG4gKiBOb3RlIHRoYXQgb25seSBvbmUgc3R5bGluZyBjb250ZXh0IGlzIHN0b3JlZCBhdCBhIGdpdmVuIHRpbWUuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgVGhlIHN0eWxpbmcgY29udGV4dCB2YWx1ZSB0aGF0IHdpbGwgYmUgc3RvcmVkXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlZFN0eWxpbmdDb250ZXh0KGNvbnRleHQpIHtcbiAgICBzdHlsaW5nQ29udGV4dCA9IGNvbnRleHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogU3RvcmUgdGhlIGVsZW1lbnQgZGVwdGggY291bnQuIFRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgcm9vdCBlbGVtZW50cyBvZiB0aGUgdGVtcGxhdGVcbiAqIHNvIHRoYXQgd2UgY2FuIHRoYW4gYXR0YWNoIGBMVmlld2AgdG8gb25seSB0aG9zZSBlbGVtZW50cy5cbiAqL1xudmFyIGVsZW1lbnREZXB0aENvdW50O1xuZnVuY3Rpb24gZ2V0RWxlbWVudERlcHRoQ291bnQoKSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiBlbGVtZW50RGVwdGhDb3VudDtcbn1cbmZ1bmN0aW9uIGluY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKSB7XG4gICAgZWxlbWVudERlcHRoQ291bnQrKztcbn1cbmZ1bmN0aW9uIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKSB7XG4gICAgZWxlbWVudERlcHRoQ291bnQtLTtcbn1cbnZhciBjdXJyZW50RGlyZWN0aXZlRGVmID0gbnVsbDtcbmZ1bmN0aW9uIGdldEN1cnJlbnREaXJlY3RpdmVEZWYoKSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiBjdXJyZW50RGlyZWN0aXZlRGVmO1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudERpcmVjdGl2ZURlZihkZWYpIHtcbiAgICBjdXJyZW50RGlyZWN0aXZlRGVmID0gZGVmO1xufVxuLyoqXG4gKiBTdG9yZXMgd2hldGhlciBkaXJlY3RpdmVzIHNob3VsZCBiZSBtYXRjaGVkIHRvIGVsZW1lbnRzLlxuICpcbiAqIFdoZW4gdGVtcGxhdGUgY29udGFpbnMgYG5nTm9uQmluZGFibGVgIHRoYW4gd2UgbmVlZCB0byBwcmV2ZW50IHRoZSBydW50aW1lIGZvcm0gbWF0Y2hpbmdcbiAqIGRpcmVjdGl2ZXMgb24gY2hpbGRyZW4gb2YgdGhhdCBlbGVtZW50LlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT5cbiAqICAgU2hvdWxkIG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZS5cbiAqIDwvbXktY29tcD5cbiAqIDxkaXYgbmdOb25CaW5kYWJsZT5cbiAqICAgPG15LWNvbXAgbXktZGlyZWN0aXZlPlxuICogICAgIFNob3VsZCBub3QgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlIGJlY2F1c2Ugd2UgYXJlIGluIG5nTm9uQmluZGFibGUuXG4gKiAgIDwvbXktY29tcD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbnZhciBiaW5kaW5nc0VuYWJsZWQ7XG5mdW5jdGlvbiBnZXRCaW5kaW5nc0VuYWJsZWQoKSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiBiaW5kaW5nc0VuYWJsZWQ7XG59XG4vKipcbiAqIEVuYWJsZXMgZGlyZWN0aXZlIG1hdGNoaW5nIG9uIGVsZW1lbnRzLlxuICpcbiAqICAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT5cbiAqICAgU2hvdWxkIG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZS5cbiAqIDwvbXktY29tcD5cbiAqIDxkaXYgbmdOb25CaW5kYWJsZT5cbiAqICAgPCEtLSDJtcm1ZGlzYWJsZUJpbmRpbmdzKCkgLS0+XG4gKiAgIDxteS1jb21wIG15LWRpcmVjdGl2ZT5cbiAqICAgICBTaG91bGQgbm90IG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZSBiZWNhdXNlIHdlIGFyZSBpbiBuZ05vbkJpbmRhYmxlLlxuICogICA8L215LWNvbXA+XG4gKiAgIDwhLS0gybXJtWVuYWJsZUJpbmRpbmdzKCkgLS0+XG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVlbmFibGVCaW5kaW5ncygpIHtcbiAgICBiaW5kaW5nc0VuYWJsZWQgPSB0cnVlO1xufVxuLyoqXG4gKiBEaXNhYmxlcyBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gZWxlbWVudC5cbiAqXG4gKiAgKiBFeGFtcGxlOlxuICogYGBgXG4gKiA8bXktY29tcCBteS1kaXJlY3RpdmU+XG4gKiAgIFNob3VsZCBtYXRjaCBjb21wb25lbnQgLyBkaXJlY3RpdmUuXG4gKiA8L215LWNvbXA+XG4gKiA8ZGl2IG5nTm9uQmluZGFibGU+XG4gKiAgIDwhLS0gybXJtWRpc2FibGVCaW5kaW5ncygpIC0tPlxuICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+XG4gKiAgICAgU2hvdWxkIG5vdCBtYXRjaCBjb21wb25lbnQgLyBkaXJlY3RpdmUgYmVjYXVzZSB3ZSBhcmUgaW4gbmdOb25CaW5kYWJsZS5cbiAqICAgPC9teS1jb21wPlxuICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZGlzYWJsZUJpbmRpbmdzKCkge1xuICAgIGJpbmRpbmdzRW5hYmxlZCA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0TFZpZXcoKSB7XG4gICAgcmV0dXJuIGxWaWV3O1xufVxuLyoqXG4gKiBVc2VkIGFzIHRoZSBzdGFydGluZyBkaXJlY3RpdmUgaWQgdmFsdWUuXG4gKlxuICogQWxsIHN1YnNlcXVlbnQgZGlyZWN0aXZlcyBhcmUgaW5jcmVtZW50ZWQgZnJvbSB0aGlzIHZhbHVlIG9ud2FyZHMuXG4gKiBUaGUgcmVhc29uIHdoeSB0aGlzIHZhbHVlIGlzIGAxYCBpbnN0ZWFkIG9mIGAwYCBpcyBiZWNhdXNlIHRoZSBgMGBcbiAqIHZhbHVlIGlzIHJlc2VydmVkIGZvciB0aGUgdGVtcGxhdGUuXG4gKi9cbnZhciBNSU5fRElSRUNUSVZFX0lEID0gMTtcbnZhciBhY3RpdmVEaXJlY3RpdmVJZCA9IE1JTl9ESVJFQ1RJVkVfSUQ7XG4vKipcbiAqIFBvc2l0aW9uIGRlcHRoICh3aXRoIHJlc3BlY3QgZnJvbSBsZWFmIHRvIHJvb3QpIGluIGEgZGlyZWN0aXZlIHN1Yi1jbGFzcyBpbmhlcml0YW5jZSBjaGFpbi5cbiAqL1xudmFyIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uID0gMDtcbi8qKlxuICogVG90YWwgY291bnQgb2YgaG93IG1hbnkgZGlyZWN0aXZlcyBhcmUgYSBwYXJ0IG9mIGFuIGluaGVyaXRhbmNlIGNoYWluLlxuICpcbiAqIFdoZW4gZGlyZWN0aXZlcyBhcmUgc3ViLWNsYXNzZWQgKGV4dGVuZGVkKSBmcm9tIG9uZSB0byBhbm90aGVyLCBBbmd1bGFyXG4gKiBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIGV4YWN0bHkgaG93IG1hbnkgd2VyZSBlbmNvdW50ZXJlZCBzbyBpdCBjYW4gYWNjdXJhdGVseVxuICogZ2VuZXJhdGUgdGhlIG5leHQgZGlyZWN0aXZlIGlkIChvbmNlIHRoZSBuZXh0IGRpcmVjdGl2ZSBpZCBpcyB2aXNpdGVkKS5cbiAqIE5vcm1hbGx5IHRoZSBuZXh0IGRpcmVjdGl2ZSBpZCBqdXN0IGEgc2luZ2xlIGluY3JlbWVudGVkIHZhbHVlIGZyb20gdGhlXG4gKiBwcmV2aW91cyBvbmUsIGhvd2V2ZXIsIGlmIHRoZSBwcmV2aW91cyBkaXJlY3RpdmUgaXMgYSBwYXJ0IG9mIGFuIGluaGVyaXRhbmNlXG4gKiBjaGFpbiAoYSBzZXJpZXMgb2Ygc3ViLWNsYXNzZWQgZGlyZWN0aXZlcykgdGhlbiB0aGUgaW5jcmVtZW50ZWQgdmFsdWUgbXVzdFxuICogYWxzbyB0YWtlIGludG8gYWNjb3VudCB0aGUgdG90YWwgYW1vdW50IG9mIHN1Yi1jbGFzc2VkIHZhbHVlcy5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSByZXNldHMgYmFjayB0byB6ZXJvIG9uY2UgdGhlIG5leHQgZGlyZWN0aXZlIGlzXG4gKiB2aXNpdGVkICh3aGVuIGBpbmNyZW1lbnRBY3RpdmVEaXJlY3RpdmVJZGAgb3IgYHNldEFjdGl2ZUhvc3RFbGVtZW50YFxuICogaXMgY2FsbGVkKS5cbiAqL1xudmFyIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NIZWlnaHQgPSAwO1xuLyoqXG4gKiBTZXRzIHRoZSBhY3RpdmUgZGlyZWN0aXZlIGhvc3QgZWxlbWVudCBhbmQgcmVzZXRzIHRoZSBkaXJlY3RpdmUgaWQgdmFsdWVcbiAqICh3aGVuIHRoZSBwcm92aWRlZCBlbGVtZW50SW5kZXggdmFsdWUgaGFzIGNoYW5nZWQpLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50SW5kZXggdGhlIGVsZW1lbnQgaW5kZXggdmFsdWUgZm9yIHRoZSBob3N0IGVsZW1lbnQgd2hlcmVcbiAqICAgICAgICAgICAgICAgICAgICAgdGhlIGRpcmVjdGl2ZS9jb21wb25lbnQgaW5zdGFuY2UgbGl2ZXNcbiAqL1xuZnVuY3Rpb24gc2V0QWN0aXZlSG9zdEVsZW1lbnQoZWxlbWVudEluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRJbmRleCA9PT0gdm9pZCAwKSB7IGVsZW1lbnRJbmRleCA9IG51bGw7IH1cbiAgICBpZiAoX3NlbGVjdGVkSW5kZXggIT09IGVsZW1lbnRJbmRleCkge1xuICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGVsZW1lbnRJbmRleCA9PSBudWxsID8gLTEgOiBlbGVtZW50SW5kZXgpO1xuICAgICAgICBhY3RpdmVEaXJlY3RpdmVJZCA9IE1JTl9ESVJFQ1RJVkVfSUQ7XG4gICAgICAgIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uID0gMDtcbiAgICAgICAgYWN0aXZlRGlyZWN0aXZlU3VwZXJDbGFzc0hlaWdodCA9IDA7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGlkIHZhbHVlIG9mIHRoZSBjdXJyZW50IGRpcmVjdGl2ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSB3ZSBoYXZlIGFuIGVsZW1lbnQgdGhhdCBoYXMgdHdvIGRpcmVjdGl2ZXMgb24gaXQ6XG4gKiA8ZGl2IGRpci1vbmUgZGlyLXR3bz48L2Rpdj5cbiAqXG4gKiBkaXJPbmUtPmhvc3RCaW5kaW5ncygpIChpZCA9PSAxKVxuICogZGlyVHdvLT5ob3N0QmluZGluZ3MoKSAoaWQgPT0gMilcbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFjdGl2ZSB3aGVuIGBob3N0QmluZGluZ2AgZnVuY3Rpb25zIGFyZSBiZWluZyBwcm9jZXNzZWQuXG4gKlxuICogTm90ZSB0aGF0IGRpcmVjdGl2ZSBpZCB2YWx1ZXMgYXJlIHNwZWNpZmljIHRvIGFuIGVsZW1lbnQgKHRoaXMgbWVhbnMgdGhhdFxuICogdGhlIHNhbWUgaWQgdmFsdWUgY291bGQgYmUgcHJlc2VudCBvbiBhbm90aGVyIGVsZW1lbnQgd2l0aCBhIGNvbXBsZXRlbHlcbiAqIGRpZmZlcmVudCBzZXQgb2YgZGlyZWN0aXZlcykuXG4gKi9cbmZ1bmN0aW9uIGdldEFjdGl2ZURpcmVjdGl2ZUlkKCkge1xuICAgIHJldHVybiBhY3RpdmVEaXJlY3RpdmVJZDtcbn1cbi8qKlxuICogSW5jcmVtZW50cyB0aGUgY3VycmVudCBkaXJlY3RpdmUgaWQgdmFsdWUuXG4gKlxuICogRm9yIGV4YW1wbGUgd2UgaGF2ZSBhbiBlbGVtZW50IHRoYXQgaGFzIHR3byBkaXJlY3RpdmVzIG9uIGl0OlxuICogPGRpdiBkaXItb25lIGRpci10d28+PC9kaXY+XG4gKlxuICogZGlyT25lLT5ob3N0QmluZGluZ3MoKSAoaW5kZXggPSAxKVxuICogLy8gaW5jcmVtZW50XG4gKiBkaXJUd28tPmhvc3RCaW5kaW5ncygpIChpbmRleCA9IDIpXG4gKlxuICogRGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IGEgcHJldmlvdXMgZGlyZWN0aXZlIGhhZCBhbnkgaW5oZXJpdGVkXG4gKiBkaXJlY3RpdmVzIHByZXNlbnQsIHRoYXQgdmFsdWUgd2lsbCBiZSBpbmNyZW1lbnRlZCBpbiBhZGRpdGlvblxuICogdG8gdGhlIGlkIGp1bXBpbmcgdXAgYnkgb25lLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYWN0aXZlIHdoZW4gYGhvc3RCaW5kaW5nYCBmdW5jdGlvbnMgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqXG4gKiBOb3RlIHRoYXQgZGlyZWN0aXZlIGlkIHZhbHVlcyBhcmUgc3BlY2lmaWMgdG8gYW4gZWxlbWVudCAodGhpcyBtZWFucyB0aGF0XG4gKiB0aGUgc2FtZSBpZCB2YWx1ZSBjb3VsZCBiZSBwcmVzZW50IG9uIGFub3RoZXIgZWxlbWVudCB3aXRoIGEgY29tcGxldGVseVxuICogZGlmZmVyZW50IHNldCBvZiBkaXJlY3RpdmVzKS5cbiAqL1xuZnVuY3Rpb24gaW5jcmVtZW50QWN0aXZlRGlyZWN0aXZlSWQoKSB7XG4gICAgYWN0aXZlRGlyZWN0aXZlSWQgKz0gMSArIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NIZWlnaHQ7XG4gICAgLy8gYmVjYXVzZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgbmV3IGRpcmVjdGl2ZSB0aGlzXG4gICAgLy8gbWVhbnMgd2UgaGF2ZSBleGl0ZWQgb3V0IG9mIHRoZSBpbmhlcml0YW5jZSBjaGFpblxuICAgIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uID0gMDtcbiAgICBhY3RpdmVEaXJlY3RpdmVTdXBlckNsYXNzSGVpZ2h0ID0gMDtcbn1cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHN1cGVyIGNsYXNzIChyZXZlcnNlIGluaGVyaXRhbmNlKSBwb3NpdGlvbiBkZXB0aCBmb3IgYSBkaXJlY3RpdmUuXG4gKlxuICogRm9yIGV4YW1wbGUgd2UgaGF2ZSB0d28gZGlyZWN0aXZlczogQ2hpbGQgYW5kIE90aGVyIChidXQgQ2hpbGQgaXMgYSBzdWItY2xhc3Mgb2YgUGFyZW50KVxuICogPGRpdiBjaGlsZC1kaXIgb3RoZXItZGlyPjwvZGl2PlxuICpcbiAqIC8vIGluY3JlbWVudFxuICogcGFyZW50SW5zdGFuY2UtPmhvc3RCaW5kaW5ncygpIChkZXB0aCA9IDEpXG4gKiAvLyBkZWNyZW1lbnRcbiAqIGNoaWxkSW5zdGFuY2UtPmhvc3RCaW5kaW5ncygpIChkZXB0aCA9IDApXG4gKiBvdGhlckluc3RhbmNlLT5ob3N0QmluZGluZ3MoKSAoZGVwdGggPSAwIGIvYyBpdCdzIGEgZGlmZmVyZW50IGRpcmVjdGl2ZSlcbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGFjdGl2ZSB3aGVuIGBob3N0QmluZGluZ2AgZnVuY3Rpb25zIGFyZSBiZWluZyBwcm9jZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIGFkanVzdEFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uKGRlbHRhKSB7XG4gICAgYWN0aXZlRGlyZWN0aXZlU3VwZXJDbGFzc0RlcHRoUG9zaXRpb24gKz0gZGVsdGE7XG4gICAgLy8gd2Uga2VlcCB0cmFjayBvZiB0aGUgaGVpZ2h0IHZhbHVlIHNvIHRoYXQgd2hlbiB0aGUgbmV4dCBkaXJlY3RpdmUgaXMgdmlzaXRlZFxuICAgIC8vIHRoZW4gQW5ndWxhciBrbm93cyB0byBnZW5lcmF0ZSBhIG5ldyBkaXJlY3RpdmUgaWQgdmFsdWUgd2hpY2ggaGFzIHRha2VuIGludG9cbiAgICAvLyBhY2NvdW50IGhvdyBtYW55IHN1Yi1jbGFzcyBkaXJlY3RpdmVzIHdlcmUgYSBwYXJ0IG9mIHRoZSBwcmV2aW91cyBkaXJlY3RpdmUuXG4gICAgYWN0aXZlRGlyZWN0aXZlU3VwZXJDbGFzc0hlaWdodCA9XG4gICAgICAgIE1hdGgubWF4KGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NIZWlnaHQsIGFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBzdXBlciBjbGFzcyAocmV2ZXJzZSBpbmhlcml0YW5jZSkgZGVwdGggZm9yIGEgZGlyZWN0aXZlLlxuICpcbiAqIFRoaXMgaXMgZGVzaWduZWQgdG8gaGVscCBpbnN0cnVjdGlvbiBjb2RlIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBob3N0QmluZGluZ3NcbiAqIGNhbGxzIGZyb20gZWFjaCBvdGhlciB3aGVuIGEgZGlyZWN0aXZlIGhhcyBleHRlbmRlZCBmcm9tIGFub3RoZXIgZGlyZWN0aXZlLlxuICogTm9ybWFsbHkgdXNpbmcgdGhlIGRpcmVjdGl2ZSBpZCB2YWx1ZSBpcyBlbm91Z2gsIGJ1dCB3aXRoIHRoZSBjYXNlXG4gKiBvZiBwYXJlbnQvc3ViLWNsYXNzIGRpcmVjdGl2ZSBpbmhlcml0YW5jZSBtb3JlIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYWN0aXZlIHdoZW4gYGhvc3RCaW5kaW5nYCBmdW5jdGlvbnMgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlRGlyZWN0aXZlU3VwZXJDbGFzc0RlcHRoKCkge1xuICAgIHJldHVybiBhY3RpdmVEaXJlY3RpdmVTdXBlckNsYXNzRGVwdGhQb3NpdGlvbjtcbn1cbi8qKlxuICogUmVzdG9yZXMgYGNvbnRleHRWaWV3RGF0YWAgdG8gdGhlIGdpdmVuIE9wYXF1ZVZpZXdTdGF0ZSBpbnN0YW5jZS5cbiAqXG4gKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGdldEN1cnJlbnRWaWV3KCkgaW5zdHJ1Y3Rpb24gdG8gc2F2ZSBhIHNuYXBzaG90XG4gKiBvZiB0aGUgY3VycmVudCB2aWV3IGFuZCByZXN0b3JlIGl0IHdoZW4gbGlzdGVuZXJzIGFyZSBpbnZva2VkLiBUaGlzIGFsbG93c1xuICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy5cbiAqXG4gKiBAcGFyYW0gdmlld1RvUmVzdG9yZSBUaGUgT3BhcXVlVmlld1N0YXRlIGluc3RhbmNlIHRvIHJlc3RvcmUuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXJlc3RvcmVWaWV3KHZpZXdUb1Jlc3RvcmUpIHtcbiAgICBjb250ZXh0TFZpZXcgPSB2aWV3VG9SZXN0b3JlO1xufVxuLyoqIFVzZWQgdG8gc2V0IHRoZSBwYXJlbnQgcHJvcGVydHkgd2hlbiBub2RlcyBhcmUgY3JlYXRlZCBhbmQgdHJhY2sgcXVlcnkgcmVzdWx0cy4gKi9cbnZhciBwcmV2aW91c09yUGFyZW50VE5vZGU7XG5mdW5jdGlvbiBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiBwcmV2aW91c09yUGFyZW50VE5vZGU7XG59XG5mdW5jdGlvbiBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUpIHtcbiAgICBwcmV2aW91c09yUGFyZW50VE5vZGUgPSB0Tm9kZTtcbn1cbmZ1bmN0aW9uIHNldFROb2RlQW5kVmlld0RhdGEodE5vZGUsIHZpZXcpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXdPclVuZGVmaW5lZCh2aWV3KTtcbiAgICBwcmV2aW91c09yUGFyZW50VE5vZGUgPSB0Tm9kZTtcbiAgICBsVmlldyA9IHZpZXc7XG59XG4vKipcbiAqIElmIGBpc1BhcmVudGAgaXM6XG4gKiAgLSBgdHJ1ZWA6IHRoZW4gYHByZXZpb3VzT3JQYXJlbnRUTm9kZWAgcG9pbnRzIHRvIGEgcGFyZW50IG5vZGUuXG4gKiAgLSBgZmFsc2VgOiB0aGVuIGBwcmV2aW91c09yUGFyZW50VE5vZGVgIHBvaW50cyB0byBwcmV2aW91cyBub2RlIChzaWJsaW5nKS5cbiAqL1xudmFyIGlzUGFyZW50O1xuZnVuY3Rpb24gZ2V0SXNQYXJlbnQoKSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiBpc1BhcmVudDtcbn1cbmZ1bmN0aW9uIHNldElzUGFyZW50KHZhbHVlKSB7XG4gICAgaXNQYXJlbnQgPSB2YWx1ZTtcbn1cbi8qKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIHZpZXcgaXMgaW4gY3JlYXRpb24gbW9kZSAqL1xuZnVuY3Rpb24gaXNDcmVhdGlvbk1vZGUodmlldykge1xuICAgIGlmICh2aWV3ID09PSB2b2lkIDApIHsgdmlldyA9IGxWaWV3OyB9XG4gICAgcmV0dXJuICh2aWV3W0ZMQUdTXSAmIDQgLyogQ3JlYXRpb25Nb2RlICovKSA9PT0gNCAvKiBDcmVhdGlvbk1vZGUgKi87XG59XG4vKipcbiAqIFN0YXRlIG9mIHRoZSBjdXJyZW50IHZpZXcgYmVpbmcgcHJvY2Vzc2VkLlxuICpcbiAqIEFuIGFycmF5IG9mIG5vZGVzICh0ZXh0LCBlbGVtZW50LCBjb250YWluZXIsIGV0YyksIHBpcGVzLCB0aGVpciBiaW5kaW5ncywgYW5kXG4gKiBhbnkgbG9jYWwgdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBzdG9yZWQgYmV0d2VlbiBpbnZvY2F0aW9ucy5cbiAqL1xudmFyIGxWaWV3O1xuLyoqXG4gKiBUaGUgbGFzdCB2aWV3RGF0YSByZXRyaWV2ZWQgYnkgbmV4dENvbnRleHQoKS5cbiAqIEFsbG93cyBidWlsZGluZyBuZXh0Q29udGV4dCgpIGFuZCByZWZlcmVuY2UoKSBjYWxscy5cbiAqXG4gKiBlLmcuIGNvbnN0IGlubmVyID0geCgpLiRpbXBsaWNpdDsgY29uc3Qgb3V0ZXIgPSB4KCkuJGltcGxpY2l0O1xuICovXG52YXIgY29udGV4dExWaWV3ID0gbnVsbDtcbmZ1bmN0aW9uIGdldENvbnRleHRMVmlldygpIHtcbiAgICAvLyB0b3AgbGV2ZWwgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKFBFUkZfTk9URVMubWQpXG4gICAgcmV0dXJuIGNvbnRleHRMVmlldztcbn1cbi8qKlxuICogSW4gdGhpcyBtb2RlLCBhbnkgY2hhbmdlcyBpbiBiaW5kaW5ncyB3aWxsIHRocm93IGFuIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJDaGVja2VkIGVycm9yLlxuICpcbiAqIE5lY2Vzc2FyeSB0byBzdXBwb3J0IENoYW5nZURldGVjdG9yUmVmLmNoZWNrTm9DaGFuZ2VzKCkuXG4gKi9cbnZhciBjaGVja05vQ2hhbmdlc01vZGUgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpIHtcbiAgICAvLyB0b3AgbGV2ZWwgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKFBFUkZfTk9URVMubWQpXG4gICAgcmV0dXJuIGNoZWNrTm9DaGFuZ2VzTW9kZTtcbn1cbmZ1bmN0aW9uIHNldENoZWNrTm9DaGFuZ2VzTW9kZShtb2RlKSB7XG4gICAgY2hlY2tOb0NoYW5nZXNNb2RlID0gbW9kZTtcbn1cbi8qKlxuICogVGhlIHJvb3QgaW5kZXggZnJvbSB3aGljaCBwdXJlIGZ1bmN0aW9uIGluc3RydWN0aW9ucyBzaG91bGQgY2FsY3VsYXRlIHRoZWlyIGJpbmRpbmdcbiAqIGluZGljZXMuIEluIGNvbXBvbmVudCB2aWV3cywgdGhpcyBpcyBUVmlldy5iaW5kaW5nU3RhcnRJbmRleC4gSW4gYSBob3N0IGJpbmRpbmdcbiAqIGNvbnRleHQsIHRoaXMgaXMgdGhlIFRWaWV3LmV4cGFuZG9TdGFydEluZGV4ICsgYW55IGRpcnMvaG9zdFZhcnMgYmVmb3JlIHRoZSBnaXZlbiBkaXIuXG4gKi9cbnZhciBiaW5kaW5nUm9vdEluZGV4ID0gLTE7XG4vLyB0b3AgbGV2ZWwgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKFBFUkZfTk9URVMubWQpXG5mdW5jdGlvbiBnZXRCaW5kaW5nUm9vdCgpIHtcbiAgICByZXR1cm4gYmluZGluZ1Jvb3RJbmRleDtcbn1cbmZ1bmN0aW9uIHNldEJpbmRpbmdSb290KHZhbHVlKSB7XG4gICAgYmluZGluZ1Jvb3RJbmRleCA9IHZhbHVlO1xufVxuLyoqXG4gKiBDdXJyZW50IGluZGV4IG9mIGEgVmlldyBvciBDb250ZW50IFF1ZXJ5IHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBuZXh0LlxuICogV2UgaXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIFF1ZXJpZXMgYW5kIGluY3JlbWVudCBjdXJyZW50IHF1ZXJ5IGluZGV4IGF0IGV2ZXJ5IHN0ZXAuXG4gKi9cbnZhciBjdXJyZW50UXVlcnlJbmRleCA9IDA7XG5mdW5jdGlvbiBnZXRDdXJyZW50UXVlcnlJbmRleCgpIHtcbiAgICAvLyB0b3AgbGV2ZWwgdmFyaWFibGVzIHNob3VsZCBub3QgYmUgZXhwb3J0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKFBFUkZfTk9URVMubWQpXG4gICAgcmV0dXJuIGN1cnJlbnRRdWVyeUluZGV4O1xufVxuZnVuY3Rpb24gc2V0Q3VycmVudFF1ZXJ5SW5kZXgodmFsdWUpIHtcbiAgICBjdXJyZW50UXVlcnlJbmRleCA9IHZhbHVlO1xufVxuLyoqXG4gKiBTd2FwIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggYSBuZXcgc3RhdGUuXG4gKlxuICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugc3RvcmUgdGhlIHN0YXRlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZHVsZS5cbiAqIFRoaXMgd2F5IHdlIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcHJvcGVydGllcyB0byByZWFkLiBXaGVuZXZlciBhIG5ldyB2aWV3XG4gKiBpcyBlbnRlcmVkIHdlIGhhdmUgdG8gc3RvcmUgdGhlIHN0YXRlIGZvciBsYXRlciwgYW5kIHdoZW4gdGhlIHZpZXcgaXNcbiAqIGV4aXRlZCB0aGUgc3RhdGUgaGFzIHRvIGJlIHJlc3RvcmVkXG4gKlxuICogQHBhcmFtIG5ld1ZpZXcgTmV3IHN0YXRlIHRvIGJlY29tZSBhY3RpdmVcbiAqIEBwYXJhbSBob3N0IEVsZW1lbnQgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYSBjaGlsZCBvZlxuICogQHJldHVybnMgdGhlIHByZXZpb3VzIHN0YXRlO1xuICovXG5mdW5jdGlvbiBlbnRlclZpZXcobmV3VmlldywgaG9zdFROb2RlKSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3T3JVbmRlZmluZWQobmV3Vmlldyk7XG4gICAgdmFyIG9sZFZpZXcgPSBsVmlldztcbiAgICBpZiAobmV3Vmlldykge1xuICAgICAgICB2YXIgdFZpZXcgPSBuZXdWaWV3W1RWSUVXXTtcbiAgICAgICAgYmluZGluZ1Jvb3RJbmRleCA9IHRWaWV3LmJpbmRpbmdTdGFydEluZGV4O1xuICAgIH1cbiAgICBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBob3N0VE5vZGU7XG4gICAgaXNQYXJlbnQgPSB0cnVlO1xuICAgIGxWaWV3ID0gY29udGV4dExWaWV3ID0gbmV3VmlldztcbiAgICByZXR1cm4gb2xkVmlldztcbn1cbmZ1bmN0aW9uIG5leHRDb250ZXh0SW1wbChsZXZlbCkge1xuICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gMTsgfVxuICAgIGNvbnRleHRMVmlldyA9IHdhbGtVcFZpZXdzKGxldmVsLCBjb250ZXh0TFZpZXcpO1xuICAgIHJldHVybiBjb250ZXh0TFZpZXdbQ09OVEVYVF07XG59XG5mdW5jdGlvbiB3YWxrVXBWaWV3cyhuZXN0aW5nTGV2ZWwsIGN1cnJlbnRWaWV3KSB7XG4gICAgd2hpbGUgKG5lc3RpbmdMZXZlbCA+IDApIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10sICdEZWNsYXJhdGlvbiB2aWV3IHNob3VsZCBiZSBkZWZpbmVkIGlmIG5lc3RpbmcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIDAuJyk7XG4gICAgICAgIGN1cnJlbnRWaWV3ID0gY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV107XG4gICAgICAgIG5lc3RpbmdMZXZlbC0tO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFZpZXc7XG59XG4vKipcbiAqIFJlc2V0cyB0aGUgYXBwbGljYXRpb24gc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0Q29tcG9uZW50U3RhdGUoKSB7XG4gICAgaXNQYXJlbnQgPSBmYWxzZTtcbiAgICBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBudWxsO1xuICAgIGVsZW1lbnREZXB0aENvdW50ID0gMDtcbiAgICBiaW5kaW5nc0VuYWJsZWQgPSB0cnVlO1xufVxuLyoqXG4gKiBVc2VkIGluIGxpZXUgb2YgZW50ZXJWaWV3IHRvIG1ha2UgaXQgY2xlYXIgd2hlbiB3ZSBhcmUgZXhpdGluZyBhIGNoaWxkIHZpZXcuIFRoaXMgbWFrZXNcbiAqIHRoZSBkaXJlY3Rpb24gb2YgdHJhdmVyc2FsICh1cCBvciBkb3duIHRoZSB2aWV3IHRyZWUpIGEgYml0IGNsZWFyZXIuXG4gKlxuICogQHBhcmFtIG5ld1ZpZXcgTmV3IHN0YXRlIHRvIGJlY29tZSBhY3RpdmVcbiAqL1xuZnVuY3Rpb24gbGVhdmVWaWV3KG5ld1ZpZXcpIHtcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgaWYgKGlzQ3JlYXRpb25Nb2RlKGxWaWV3KSkge1xuICAgICAgICBsVmlld1tGTEFHU10gJj0gfjQgLyogQ3JlYXRpb25Nb2RlICovO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3MobFZpZXcpO1xuICAgICAgICAgICAgZXhlY3V0ZUhvb2tzKGxWaWV3LCB0Vmlldy52aWV3SG9va3MsIHRWaWV3LnZpZXdDaGVja0hvb2tzLCBjaGVja05vQ2hhbmdlc01vZGUsIDIgLyogQWZ0ZXJWaWV3SW5pdEhvb2tzVG9CZVJ1biAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIC8vIFZpZXdzIGFyZSBjbGVhbiBhbmQgaW4gdXBkYXRlIG1vZGUgYWZ0ZXIgYmVpbmcgY2hlY2tlZCwgc28gdGhlc2UgYml0cyBhcmUgY2xlYXJlZFxuICAgICAgICAgICAgbFZpZXdbRkxBR1NdICY9IH4oNjQgLyogRGlydHkgKi8gfCA4IC8qIEZpcnN0TFZpZXdQYXNzICovKTtcbiAgICAgICAgICAgIGxWaWV3W0JJTkRJTkdfSU5ERVhdID0gdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0Q2FjaGVkU3R5bGluZ0NvbnRleHQobnVsbCk7XG4gICAgZW50ZXJWaWV3KG5ld1ZpZXcsIG51bGwpO1xufVxudmFyIF9zZWxlY3RlZEluZGV4ID0gLTE7XG4vKipcbiAqIEdldHMgdGhlIG1vc3QgcmVjZW50IGluZGV4IHBhc3NlZCB0byB7QGxpbmsgc2VsZWN0fVxuICpcbiAqIFVzZWQgd2l0aCB7QGxpbmsgcHJvcGVydHl9IGluc3RydWN0aW9uIChhbmQgbW9yZSBpbiB0aGUgZnV0dXJlKSB0byBpZGVudGlmeSB0aGUgaW5kZXggaW4gdGhlXG4gKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLlxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3RlZEluZGV4KCkge1xuICAgIHJldHVybiBfc2VsZWN0ZWRJbmRleDtcbn1cbi8qKlxuICogU2V0cyB0aGUgbW9zdCByZWNlbnQgaW5kZXggcGFzc2VkIHRvIHtAbGluayBzZWxlY3R9XG4gKlxuICogVXNlZCB3aXRoIHtAbGluayBwcm9wZXJ0eX0gaW5zdHJ1Y3Rpb24gKGFuZCBtb3JlIGluIHRoZSBmdXR1cmUpIHRvIGlkZW50aWZ5IHRoZSBpbmRleCBpbiB0aGVcbiAqIGN1cnJlbnQgYExWaWV3YCB0byBhY3Qgb24uXG4gKi9cbmZ1bmN0aW9uIHNldFNlbGVjdGVkSW5kZXgoaW5kZXgpIHtcbiAgICBfc2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgIC8vIHJlbW92ZSB0aGUgc3R5bGluZyBjb250ZXh0IGZyb20gdGhlIGNhY2hlXG4gICAgLy8gYmVjYXVzZSB3ZSBhcmUgbm93IG9uIGEgZGlmZmVyZW50IGVsZW1lbnRcbiAgICBzZXRDYWNoZWRTdHlsaW5nQ29udGV4dChudWxsKTtcbn1cbnZhciBfY3VycmVudE5hbWVzcGFjZSA9IG51bGw7XG4vKipcbiAqIFNldHMgdGhlIG5hbWVzcGFjZSB1c2VkIHRvIGNyZWF0ZSBlbGVtZW50cyB0byBgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ2AgaW4gZ2xvYmFsIHN0YXRlLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVuYW1lc3BhY2VTVkcoKSB7XG4gICAgX2N1cnJlbnROYW1lc3BhY2UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYCdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nYCBpbiBnbG9iYWwgc3RhdGUuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtW5hbWVzcGFjZU1hdGhNTCgpIHtcbiAgICBfY3VycmVudE5hbWVzcGFjZSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgbm8gYG51bGxgLCB3aGljaCBmb3JjZXMgZWxlbWVudCBjcmVhdGlvbiB0byB1c2VcbiAqIGBjcmVhdGVFbGVtZW50YCByYXRoZXIgdGhhbiBgY3JlYXRlRWxlbWVudE5TYC5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1bmFtZXNwYWNlSFRNTCgpIHtcbiAgICBfY3VycmVudE5hbWVzcGFjZSA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXROYW1lc3BhY2UoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50TmFtZXNwYWNlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUT0RPOiBjbGVhbnVwIG9uY2UgdGhlIGNvZGUgaXMgbWVyZ2VkIGluIGFuZ3VsYXIvYW5ndWxhclxudmFyIFJlbmRlcmVyU3R5bGVGbGFnczM7XG4oZnVuY3Rpb24gKFJlbmRlcmVyU3R5bGVGbGFnczMpIHtcbiAgICBSZW5kZXJlclN0eWxlRmxhZ3MzW1JlbmRlcmVyU3R5bGVGbGFnczNbXCJJbXBvcnRhbnRcIl0gPSAxXSA9IFwiSW1wb3J0YW50XCI7XG4gICAgUmVuZGVyZXJTdHlsZUZsYWdzM1tSZW5kZXJlclN0eWxlRmxhZ3MzW1wiRGFzaENhc2VcIl0gPSAyXSA9IFwiRGFzaENhc2VcIjtcbn0pKFJlbmRlcmVyU3R5bGVGbGFnczMgfHwgKFJlbmRlcmVyU3R5bGVGbGFnczMgPSB7fSkpO1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgYHJlbmRlcmVyYCBpcyBhIGBQcm9jZWR1cmFsUmVuZGVyZXIzYCAqL1xuZnVuY3Rpb24gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpIHtcbiAgICByZXR1cm4gISEocmVuZGVyZXIubGlzdGVuKTtcbn1cbnZhciDJtTAkNiA9IGZ1bmN0aW9uIChob3N0RWxlbWVudCwgcmVuZGVyZXJUeXBlKSB7IHJldHVybiBkb2N1bWVudDsgfTtcbnZhciBkb21SZW5kZXJlckZhY3RvcnkzID0ge1xuICAgIGNyZWF0ZVJlbmRlcmVyOiDJtTAkNlxufTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqIFJldHVybnMgdGhlIG1hdGNoaW5nIGBMQ29udGV4dGAgZGF0YSBmb3IgYSBnaXZlbiBET00gbm9kZSwgZGlyZWN0aXZlIG9yIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZXhhbWluZSB0aGUgcHJvdmlkZWQgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCwgb3IgZGlyZWN0aXZlIGluc3RhbmNlXFwnc1xuICogbW9ua2V5LXBhdGNoZWQgcHJvcGVydHkgdG8gZGVyaXZlIHRoZSBgTENvbnRleHRgIGRhdGEuIE9uY2UgY2FsbGVkIHRoZW4gdGhlIG1vbmtleS1wYXRjaGVkXG4gKiB2YWx1ZSB3aWxsIGJlIHRoYXQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgYExDb250ZXh0YC5cbiAqXG4gKiBJZiB0aGUgbW9ua2V5LXBhdGNoZWQgdmFsdWUgaXMgdGhlIGBMVmlld2AgaW5zdGFuY2UgdGhlbiB0aGUgY29udGV4dCB2YWx1ZSBmb3IgdGhhdFxuICogdGFyZ2V0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIG1vbmtleS1wYXRjaCByZWZlcmVuY2Ugd2lsbCBiZSB1cGRhdGVkLiBUaGVyZWZvcmUgd2hlbiB0aGlzXG4gKiBmdW5jdGlvbiBpcyBjYWxsZWQgaXQgbWF5IG11dGF0ZSB0aGUgcHJvdmlkZWQgZWxlbWVudFxcJ3MsIGNvbXBvbmVudFxcJ3Mgb3IgYW55IG9mIHRoZSBhc3NvY2lhdGVkXG4gKiBkaXJlY3RpdmVcXCdzIG1vbmtleS1wYXRjaCB2YWx1ZXMuXG4gKlxuICogSWYgdGhlIG1vbmtleS1wYXRjaCB2YWx1ZSBpcyBub3QgZGV0ZWN0ZWQgdGhlbiB0aGUgY29kZSB3aWxsIHdhbGsgdXAgdGhlIERPTSB1bnRpbCBhbiBlbGVtZW50XG4gKiBpcyBmb3VuZCB3aGljaCBjb250YWlucyBhIG1vbmtleS1wYXRjaCByZWZlcmVuY2UuIFdoZW4gdGhhdCBvY2N1cnMgdGhlbiB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICogd2lsbCBiZSB1cGRhdGVkIHdpdGggYSBuZXcgY29udGV4dCAod2hpY2ggaXMgdGhlbiByZXR1cm5lZCkuIElmIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgaXMgbm90XG4gKiBkZXRlY3RlZCBmb3IgYSBjb21wb25lbnQvZGlyZWN0aXZlIGluc3RhbmNlIHRoZW4gaXQgd2lsbCB0aHJvdyBhbiBlcnJvciAoYWxsIGNvbXBvbmVudHMgYW5kXG4gKiBkaXJlY3RpdmVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IG1vbmtleS1wYXRjaGVkIGJ5IGl2eSkuXG4gKlxuICogQHBhcmFtIHRhcmdldCBDb21wb25lbnQsIERpcmVjdGl2ZSBvciBET00gTm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TENvbnRleHQodGFyZ2V0KSB7XG4gICAgdmFyIG1wVmFsdWUgPSByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KTtcbiAgICBpZiAobXBWYWx1ZSkge1xuICAgICAgICAvLyBvbmx5IHdoZW4gaXQncyBhbiBhcnJheSBpcyBpdCBjb25zaWRlcmVkIGFuIExWaWV3IGluc3RhbmNlXG4gICAgICAgIC8vIC4uLiBvdGhlcndpc2UgaXQncyBhbiBhbHJlYWR5IGNvbnN0cnVjdGVkIExDb250ZXh0IGluc3RhbmNlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1wVmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgbFZpZXcgPSBtcFZhbHVlO1xuICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudEluc3RhbmNlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHRhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGlyZWN0aXZlSW5zdGFuY2UodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIG5vZGVJbmRleCA9IGZpbmRWaWFEaXJlY3RpdmUobFZpZXcsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBkaXJlY3RpdmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYXBwbGljYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZXNBdE5vZGVJbmRleChub2RlSW5kZXgsIGxWaWV3LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoZSBnb2FsIGlzIG5vdCB0byBmaWxsIHRoZSBlbnRpcmUgY29udGV4dCBmdWxsIG9mIGRhdGEgYmVjYXVzZSB0aGUgbG9va3Vwc1xuICAgICAgICAgICAgLy8gYXJlIGV4cGVuc2l2ZS4gSW5zdGVhZCwgb25seSB0aGUgdGFyZ2V0IGRhdGEgKHRoZSBlbGVtZW50LCBjb21wb25lbnQsIGNvbnRhaW5lciwgSUNVXG4gICAgICAgICAgICAvLyBleHByZXNzaW9uIG9yIGRpcmVjdGl2ZSBkZXRhaWxzKSBhcmUgZmlsbGVkIGludG8gdGhlIGNvbnRleHQuIElmIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xuICAgICAgICAgICAgLy8gd2l0aCBkaWZmZXJlbnQgdGFyZ2V0IHZhbHVlcyB0aGVuIHRoZSBtaXNzaW5nIHRhcmdldCBkYXRhIHdpbGwgYmUgZmlsbGVkIGluLlxuICAgICAgICAgICAgdmFyIG5hdGl2ZSA9IHVud3JhcFJOb2RlKGxWaWV3W25vZGVJbmRleF0pO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nQ3R4ID0gcmVhZFBhdGNoZWREYXRhKG5hdGl2ZSk7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IChleGlzdGluZ0N0eCAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZ0N0eCkpID9cbiAgICAgICAgICAgICAgICBleGlzdGluZ0N0eCA6XG4gICAgICAgICAgICAgICAgY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgbmF0aXZlKTtcbiAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGRpc2NvdmVyZWQgdGhlbiB1cGRhdGUgdGhlIG1vbmtleS1wYXRjaFxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBjb250ZXh0LmNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGNvbnRleHQuY29tcG9uZW50LCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoXG4gICAgICAgICAgICBpZiAoZGlyZWN0aXZlcyAmJiBjb250ZXh0LmRpcmVjdGl2ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmVzW2ldLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29udGV4dC5uYXRpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgbXBWYWx1ZSA9IGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciByRWxlbWVudCA9IHRhcmdldDtcbiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERvbU5vZGUockVsZW1lbnQpO1xuICAgICAgICAvLyBpZiB0aGUgY29udGV4dCBpcyBub3QgZm91bmQgdGhlbiB3ZSBuZWVkIHRvIHRyYXZlcnNlIHVwd2FyZHMgdXAgdGhlIERPTVxuICAgICAgICAvLyB0byBmaW5kIHRoZSBuZWFyZXN0IGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIG1vbmtleSBwYXRjaGVkIHdpdGggZGF0YVxuICAgICAgICB2YXIgcGFyZW50XzEgPSByRWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHBhcmVudF8xID0gcGFyZW50XzEucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSByZWFkUGF0Y2hlZERhdGEocGFyZW50XzEpO1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgbFZpZXcgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbFZpZXcgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbFZpZXcgPSBwYXJlbnRDb250ZXh0LmxWaWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSBvZiB0aGUgYXBwIHdhcyBhbHNvIHJlYWNoZWQgaGVyZSB0aHJvdWdoIGFub3RoZXIgbWVhbnNcbiAgICAgICAgICAgICAgICAvLyAobWF5YmUgYmVjYXVzZSB0aGUgRE9NIHdhcyBjaGFuZ2VkIG1hbnVhbGx5KS5cbiAgICAgICAgICAgICAgICBpZiAoIWxWaWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmUgPSB1bndyYXBSTm9kZShsVmlld1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGNyZWF0ZUxDb250ZXh0KGxWaWV3LCBpbmRleCwgbmF0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIG1wVmFsdWUgPSBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1wVmFsdWUgfHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiBhIGBMQ29udGV4dGAgY29udGV4dFxuICovXG5mdW5jdGlvbiBjcmVhdGVMQ29udGV4dChsVmlldywgbm9kZUluZGV4LCBuYXRpdmUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsVmlldzogbFZpZXcsXG4gICAgICAgIG5vZGVJbmRleDogbm9kZUluZGV4LFxuICAgICAgICBuYXRpdmU6IG5hdGl2ZSxcbiAgICAgICAgY29tcG9uZW50OiB1bmRlZmluZWQsXG4gICAgICAgIGRpcmVjdGl2ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgbG9jYWxSZWZzOiB1bmRlZmluZWQsXG4gICAgfTtcbn1cbi8qKlxuICogVGFrZXMgYSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHJldHVybnMgdGhlIHZpZXcgZm9yIHRoYXQgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRJbnN0YW5jZVxuICogQHJldHVybnMgVGhlIGNvbXBvbmVudCdzIHZpZXdcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICB2YXIgbFZpZXcgPSByZWFkUGF0Y2hlZERhdGEoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgIHZhciB2aWV3O1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxWaWV3KSkge1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gZmluZFZpYUNvbXBvbmVudChsVmlldywgY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5kZXgobm9kZUluZGV4LCBsVmlldyk7XG4gICAgICAgIHZhciBjb250ZXh0ID0gY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgdmlld1tIT1NUXSk7XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21wb25lbnRJbnN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb250ZXh0Lm5hdGl2ZSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgY29udGV4dCA9IGxWaWV3O1xuICAgICAgICB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5kZXgoY29udGV4dC5ub2RlSW5kZXgsIGNvbnRleHQubFZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbn1cbi8qKlxuICogQXNzaWducyB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZ2l2ZW4gdGFyZ2V0ICh3aGljaCBjb3VsZCBiZSBhIGNvbXBvbmVudCxcbiAqIGRpcmVjdGl2ZSBvciBET00gbm9kZSBpbnN0YW5jZSkgdXNpbmcgbW9ua2V5LXBhdGNoaW5nLlxuICovXG5mdW5jdGlvbiBhdHRhY2hQYXRjaERhdGEodGFyZ2V0LCBkYXRhKSB7XG4gICAgdGFyZ2V0W01PTktFWV9QQVRDSF9LRVlfTkFNRV0gPSBkYXRhO1xufVxuZnVuY3Rpb24gaXNDb21wb25lbnRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5jb25zdHJ1Y3RvciAmJiBpbnN0YW5jZS5jb25zdHJ1Y3Rvci5uZ0NvbXBvbmVudERlZjtcbn1cbmZ1bmN0aW9uIGlzRGlyZWN0aXZlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IubmdEaXJlY3RpdmVEZWY7XG59XG4vKipcbiAqIExvY2F0ZXMgdGhlIGVsZW1lbnQgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXhcbiAqL1xuZnVuY3Rpb24gZmluZFZpYU5hdGl2ZUVsZW1lbnQobFZpZXcsIHRhcmdldCkge1xuICAgIHZhciB0Tm9kZSA9IGxWaWV3W1RWSUVXXS5maXJzdENoaWxkO1xuICAgIHdoaWxlICh0Tm9kZSkge1xuICAgICAgICB2YXIgbmF0aXZlID0gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpO1xuICAgICAgICBpZiAobmF0aXZlID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5pbmRleDtcbiAgICAgICAgfVxuICAgICAgICB0Tm9kZSA9IHRyYXZlcnNlTmV4dEVsZW1lbnQodE5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vKipcbiAqIExvY2F0ZXMgdGhlIG5leHQgdE5vZGUgKGNoaWxkLCBzaWJsaW5nIG9yIHBhcmVudCkuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlTmV4dEVsZW1lbnQodE5vZGUpIHtcbiAgICBpZiAodE5vZGUuY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHROb2RlLmNoaWxkO1xuICAgIH1cbiAgICBlbHNlIGlmICh0Tm9kZS5uZXh0KSB7XG4gICAgICAgIHJldHVybiB0Tm9kZS5uZXh0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gTGV0J3MgdGFrZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiA8ZGl2PjxzcGFuPnRleHQ8L3NwYW4+PC9kaXY+PGNvbXBvbmVudC8+XG4gICAgICAgIC8vIEFmdGVyIGNoZWNraW5nIHRoZSB0ZXh0IG5vZGUsIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBwYXJlbnQgdGhhdCBoYXMgYSBcIm5leHRcIiBUTm9kZSxcbiAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHRoZSBwYXJlbnQgYGRpdmAsIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgd2hpbGUgKHROb2RlLnBhcmVudCAmJiAhdE5vZGUucGFyZW50Lm5leHQpIHtcbiAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Tm9kZS5wYXJlbnQgJiYgdE5vZGUucGFyZW50Lm5leHQ7XG4gICAgfVxufVxuLyoqXG4gKiBMb2NhdGVzIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXhcbiAqL1xuZnVuY3Rpb24gZmluZFZpYUNvbXBvbmVudChsVmlldywgY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICB2YXIgY29tcG9uZW50SW5kaWNlcyA9IGxWaWV3W1RWSUVXXS5jb21wb25lbnRzO1xuICAgIGlmIChjb21wb25lbnRJbmRpY2VzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50SW5kaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRDb21wb25lbnRJbmRleCA9IGNvbXBvbmVudEluZGljZXNbaV07XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudFZpZXdCeUluZGV4KGVsZW1lbnRDb21wb25lbnRJbmRleCwgbFZpZXcpO1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudFZpZXdbQ09OVEVYVF0gPT09IGNvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb21wb25lbnRJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHJvb3RDb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5kZXgoSEVBREVSX09GRlNFVCwgbFZpZXcpO1xuICAgICAgICB2YXIgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnRWaWV3W0NPTlRFWFRdO1xuICAgICAgICBpZiAocm9vdENvbXBvbmVudCA9PT0gY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIHJvb3QgZWxlbWVudCBoZXJlIHRoZXJlZm9yZSB3ZSBrbm93IHRoYXQgdGhlXG4gICAgICAgICAgICAvLyBlbGVtZW50IGlzIHRoZSB2ZXJ5IGZpcnN0IGVsZW1lbnQgYWZ0ZXIgdGhlIEhFQURFUiBkYXRhIGluIHRoZSBsVmlld1xuICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9PRkZTRVQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqXG4gKiBMb2NhdGVzIHRoZSBkaXJlY3RpdmUgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXhcbiAqL1xuZnVuY3Rpb24gZmluZFZpYURpcmVjdGl2ZShsVmlldywgZGlyZWN0aXZlSW5zdGFuY2UpIHtcbiAgICAvLyBpZiBhIGRpcmVjdGl2ZSBpcyBtb25rZXkgcGF0Y2hlZCB0aGVuIGl0IHdpbGwgKGJ5IGRlZmF1bHQpXG4gICAgLy8gaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgTFZpZXcgb2YgdGhlIGN1cnJlbnQgdmlldy4gVGhlXG4gICAgLy8gZWxlbWVudCBib3VuZCB0byB0aGUgZGlyZWN0aXZlIGJlaW5nIHNlYXJjaCBsaXZlcyBzb21ld2hlcmVcbiAgICAvLyBpbiB0aGUgdmlldyBkYXRhLiBXZSBsb29wIHRocm91Z2ggdGhlIG5vZGVzIGFuZCBjaGVjayB0aGVpclxuICAgIC8vIGxpc3Qgb2YgZGlyZWN0aXZlcyBmb3IgdGhlIGluc3RhbmNlLlxuICAgIHZhciB0Tm9kZSA9IGxWaWV3W1RWSUVXXS5maXJzdENoaWxkO1xuICAgIHdoaWxlICh0Tm9kZSkge1xuICAgICAgICB2YXIgZGlyZWN0aXZlSW5kZXhTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgICAgICB2YXIgZGlyZWN0aXZlSW5kZXhFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7XG4gICAgICAgIGZvciAodmFyIGkgPSBkaXJlY3RpdmVJbmRleFN0YXJ0OyBpIDwgZGlyZWN0aXZlSW5kZXhFbmQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxWaWV3W2ldID09PSBkaXJlY3RpdmVJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0Tm9kZS5pbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0Tm9kZSA9IHRyYXZlcnNlTmV4dEVsZW1lbnQodE5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIGRpcmVjdGl2ZXMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIHZpZXcgYmFzZWQgb24gdGhlXG4gKiBwcm92aWRlZCBsaXN0IG9mIGRpcmVjdGl2ZSBpbmRleCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIG5vZGVJbmRleCBUaGUgbm9kZSBpbmRleFxuICogQHBhcmFtIGxWaWV3IFRoZSB0YXJnZXQgdmlldyBkYXRhXG4gKiBAcGFyYW0gaW5jbHVkZUNvbXBvbmVudHMgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBjb21wb25lbnRzIGluIHJldHVybmVkIGRpcmVjdGl2ZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0aXZlc0F0Tm9kZUluZGV4KG5vZGVJbmRleCwgbFZpZXcsIGluY2x1ZGVDb21wb25lbnRzKSB7XG4gICAgdmFyIHROb2RlID0gbFZpZXdbVFZJRVddLmRhdGFbbm9kZUluZGV4XTtcbiAgICB2YXIgZGlyZWN0aXZlU3RhcnRJbmRleCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgIGlmIChkaXJlY3RpdmVTdGFydEluZGV4ID09IDApXG4gICAgICAgIHJldHVybiBFTVBUWV9BUlJBWSQxO1xuICAgIHZhciBkaXJlY3RpdmVFbmRJbmRleCA9IHROb2RlLmRpcmVjdGl2ZUVuZDtcbiAgICBpZiAoIWluY2x1ZGVDb21wb25lbnRzICYmIHROb2RlLmZsYWdzICYgMSAvKiBpc0NvbXBvbmVudCAqLylcbiAgICAgICAgZGlyZWN0aXZlU3RhcnRJbmRleCsrO1xuICAgIHJldHVybiBsVmlldy5zbGljZShkaXJlY3RpdmVTdGFydEluZGV4LCBkaXJlY3RpdmVFbmRJbmRleCk7XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRBdE5vZGVJbmRleChub2RlSW5kZXgsIGxWaWV3KSB7XG4gICAgdmFyIHROb2RlID0gbFZpZXdbVFZJRVddLmRhdGFbbm9kZUluZGV4XTtcbiAgICB2YXIgZGlyZWN0aXZlU3RhcnRJbmRleCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgIHJldHVybiB0Tm9kZS5mbGFncyAmIDEgLyogaXNDb21wb25lbnQgKi8gPyBsVmlld1tkaXJlY3RpdmVTdGFydEluZGV4XSA6IG51bGw7XG59XG4vKipcbiAqIFJldHVybnMgYSBtYXAgb2YgbG9jYWwgcmVmZXJlbmNlcyAobG9jYWwgcmVmZXJlbmNlIG5hbWUgPT4gZWxlbWVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UpIHRoYXRcbiAqIGV4aXN0IG9uIGEgZ2l2ZW4gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZGlzY292ZXJMb2NhbFJlZnMobFZpZXcsIG5vZGVJbmRleCkge1xuICAgIHZhciB0Tm9kZSA9IGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF07XG4gICAgaWYgKHROb2RlICYmIHROb2RlLmxvY2FsTmFtZXMpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICB2YXIgbG9jYWxJbmRleCA9IHROb2RlLmluZGV4ICsgMTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Tm9kZS5sb2NhbE5hbWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICByZXN1bHRbdE5vZGUubG9jYWxOYW1lc1tpXV0gPSBsVmlld1tsb2NhbEluZGV4XTtcbiAgICAgICAgICAgIGxvY2FsSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxudmFyIENvcmVQbGF5ZXJIYW5kbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvcmVQbGF5ZXJIYW5kbGVyKCkge1xuICAgICAgICB0aGlzLl9wbGF5ZXJzID0gW107XG4gICAgfVxuICAgIENvcmVQbGF5ZXJIYW5kbGVyLnByb3RvdHlwZS5mbHVzaFBsYXllcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBsYXllciA9IHRoaXMuX3BsYXllcnNbaV07XG4gICAgICAgICAgICBpZiAoIXBsYXllci5wYXJlbnQgJiYgcGxheWVyLnN0YXRlID09PSAwIC8qIFBlbmRpbmcgKi8pIHtcbiAgICAgICAgICAgICAgICBwbGF5ZXIucGxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BsYXllcnMubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIENvcmVQbGF5ZXJIYW5kbGVyLnByb3RvdHlwZS5xdWV1ZVBsYXllciA9IGZ1bmN0aW9uIChwbGF5ZXIpIHsgdGhpcy5fcGxheWVycy5wdXNoKHBsYXllcik7IH07XG4gICAgcmV0dXJuIENvcmVQbGF5ZXJIYW5kbGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGUgZGVmYXVsdCBkaXJlY3RpdmUgc3R5bGluZyBpbmRleCB2YWx1ZSBmb3IgdGVtcGxhdGUtYmFzZWQgYmluZGluZ3MuXG4gKlxuICogQWxsIGhvc3QtbGV2ZWwgYmluZGluZ3MgKGUuZy4gYGhvc3RTdHlsZVByb3BgIGFuZCBgaG9zdFN0eWxpbmdNYXBgKSBhcmVcbiAqIGFzc2lnbmVkIGEgZGlyZWN0aXZlIHN0eWxpbmcgaW5kZXggdmFsdWUgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGlyZWN0aXZlXG4gKiB1bmlxdWVJZCBhbmQgdGhlIGRpcmVjdGl2ZSBzdXBlci1jbGFzcyBpbmhlcml0YW5jZSBkZXB0aC4gQnV0IGZvciB0ZW1wbGF0ZVxuICogYmluZGluZ3MgdGhleSBhbHdheXMgaGF2ZSB0aGUgc2FtZSBkaXJlY3RpdmUgc3R5bGluZyBpbmRleCB2YWx1ZS5cbiAqL1xudmFyIERFRkFVTFRfVEVNUExBVEVfRElSRUNUSVZFX0lOREVYID0gMDtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEFOSU1BVElPTl9QUk9QX1BSRUZJWCA9ICdAJztcbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5U3R5bGluZ0NvbnRleHQod3JhcHBlZEVsZW1lbnQsIHNhbml0aXplciwgaW5pdGlhbFN0eWxlcywgaW5pdGlhbENsYXNzZXMpIHtcbiAgICB2YXIgY29udGV4dCA9IFtcbiAgICAgICAgd3JhcHBlZEVsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgMCxcbiAgICAgICAgW10sXG4gICAgICAgIGluaXRpYWxTdHlsZXMgfHwgW251bGwsIG51bGxdLFxuICAgICAgICBpbml0aWFsQ2xhc3NlcyB8fCBbbnVsbCwgbnVsbF0sXG4gICAgICAgIFswLCAwXSxcbiAgICAgICAgWzBdLFxuICAgICAgICBbMF0sXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgXTtcbiAgICAvLyB3aGVuZXZlciBhIGNvbnRleHQgaXMgY3JlYXRlZCB0aGVyZSBpcyBhbHdheXMgYSBgbnVsbGAgZGlyZWN0aXZlXG4gICAgLy8gdGhhdCBpcyByZWdpc3RlcmVkICh3aGljaCBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgXCJ0ZW1wbGF0ZVwiKS5cbiAgICBhbGxvY2F0ZU9yVXBkYXRlRGlyZWN0aXZlSW50b0NvbnRleHQoY29udGV4dCwgREVGQVVMVF9URU1QTEFURV9ESVJFQ1RJVkVfSU5ERVgpO1xuICAgIHJldHVybiBjb250ZXh0O1xufVxuLyoqXG4gKiBBbGxvY2F0ZXMgKHJlZ2lzdGVycykgYSBkaXJlY3RpdmUgaW50byB0aGUgZGlyZWN0aXZlIHJlZ2lzdHJ5IHdpdGhpbiB0aGUgcHJvdmlkZWQgc3R5bGluZ1xuICogY29udGV4dC5cbiAqXG4gKiBGb3IgZWFjaCBhbmQgZXZlcnkgYFtzdHlsZV1gLCBgW3N0eWxlLnByb3BdYCwgYFtjbGFzc11gLCBgW2NsYXNzLm5hbWVdYCBiaW5kaW5nXG4gKiAoYXMgd2VsbCBhcyBzdGF0aWMgc3R5bGUgYW5kIGNsYXNzIGF0dHJpYnV0ZXMpIGEgZGlyZWN0aXZlLCBjb21wb25lbnQgb3IgdGVtcGxhdGVcbiAqIGlzIG1hcmtlZCBhcyB0aGUgb3duZXIuIFdoZW4gYW4gb3duZXIgaXMgZGV0ZXJtaW5lZCAodGhpcyBoYXBwZW5zIHdoZW4gdGhlIHRlbXBsYXRlXG4gKiBpcyBmaXJzdCBwYXNzZWQgb3ZlcikgdGhlIGRpcmVjdGl2ZSBvd25lciBpcyBhbGxvY2F0ZWQgaW50byB0aGUgc3R5bGluZyBjb250ZXh0LiBXaGVuXG4gKiB0aGlzIGhhcHBlbnMsIGVhY2ggb3duZXIgZ2V0cyBpdHMgb3duIGluZGV4IHZhbHVlLiBUaGlzIHRoZW4gZW5zdXJlcyB0aGF0IG9uY2UgYW55XG4gKiBzdHlsZSBhbmQvb3IgY2xhc3MgYmluZGluZyBhcmUgYXNzaWduZWQgaW50byB0aGUgY29udGV4dCB0aGVuIHRoZXkgYXJlIG1hcmtlZCB0b1xuICogdGhhdCBkaXJlY3RpdmUncyBpbmRleCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgdGFyZ2V0IFN0eWxpbmdDb250ZXh0XG4gKiBAcGFyYW0gZGlyZWN0aXZlUmVmIHRoZSBkaXJlY3RpdmUgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBpbnRvIHRoZSBjb250ZXh0XG4gKiBAcmV0dXJucyB0aGUgaW5kZXggd2hlcmUgdGhlIGRpcmVjdGl2ZSB3YXMgaW5zZXJ0ZWQgaW50b1xuICovXG5mdW5jdGlvbiBhbGxvY2F0ZU9yVXBkYXRlRGlyZWN0aXZlSW50b0NvbnRleHQoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgsIHNpbmdsZVByb3BWYWx1ZXNJbmRleCwgc3R5bGVTYW5pdGl6ZXIpIHtcbiAgICBpZiAoc2luZ2xlUHJvcFZhbHVlc0luZGV4ID09PSB2b2lkIDApIHsgc2luZ2xlUHJvcFZhbHVlc0luZGV4ID0gLTE7IH1cbiAgICB2YXIgZGlyZWN0aXZlUmVnaXN0cnkgPSBjb250ZXh0WzIgLyogRGlyZWN0aXZlUmVnaXN0cnlQb3NpdGlvbiAqL107XG4gICAgdmFyIGluZGV4ID0gZGlyZWN0aXZlSW5kZXggKiAyIC8qIFNpemUgKi87XG4gICAgLy8gd2UgcHJlZW1wdGl2ZWx5IG1ha2Ugc3BhY2UgaW50byB0aGUgZGlyZWN0aXZlcyBhcnJheSBhbmQgdGhlblxuICAgIC8vIGFzc2lnbiB2YWx1ZXMgc2xvdC1ieS1zbG90IHRvIGVuc3VyZSB0aGF0IGlmIHRoZSBkaXJlY3RpdmUgb3JkZXJpbmdcbiAgICAvLyBjaGFuZ2VzIHRoZW4gaXQgd2lsbCBzdGlsbCBmdW5jdGlvblxuICAgIHZhciBsaW1pdCA9IGluZGV4ICsgMiAvKiBTaXplICovO1xuICAgIGZvciAodmFyIGkgPSBkaXJlY3RpdmVSZWdpc3RyeS5sZW5ndGg7IGkgPCBsaW1pdDsgaSArPSAyIC8qIFNpemUgKi8pIHtcbiAgICAgICAgLy8gLTEgaXMgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgZGlyZWN0aXZlIGhhcyBiZWVuIGFsbG9jYXRlZCwgYnV0XG4gICAgICAgIC8vIG5vIGFjdHVhbCBzdHlsZSBvciBjbGFzcyBiaW5kaW5ncyBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB5ZXQuLi5cbiAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnkucHVzaCgtMSwgbnVsbCk7XG4gICAgfVxuICAgIHZhciBwcm9wVmFsdWVzU3RhcnRQb3NpdGlvbiA9IGluZGV4ICsgMCAvKiBTaW5nbGVQcm9wVmFsdWVzSW5kZXhPZmZzZXQgKi87XG4gICAgaWYgKHNpbmdsZVByb3BWYWx1ZXNJbmRleCA+PSAwICYmIGRpcmVjdGl2ZVJlZ2lzdHJ5W3Byb3BWYWx1ZXNTdGFydFBvc2l0aW9uXSA9PT0gLTEpIHtcbiAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnlbcHJvcFZhbHVlc1N0YXJ0UG9zaXRpb25dID0gc2luZ2xlUHJvcFZhbHVlc0luZGV4O1xuICAgICAgICBkaXJlY3RpdmVSZWdpc3RyeVtpbmRleCArIDEgLyogU3R5bGVTYW5pdGl6ZXJPZmZzZXQgKi9dID1cbiAgICAgICAgICAgIHN0eWxlU2FuaXRpemVyIHx8IG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBVc2VkIGNsb25lIGEgY29weSBvZiBhIHByZS1jb21wdXRlZCB0ZW1wbGF0ZSBvZiBhIHN0eWxpbmcgY29udGV4dC5cbiAqXG4gKiBBIHByZS1jb21wdXRlZCB0ZW1wbGF0ZSBpcyBkZXNpZ25lZCB0byBiZSBjb21wdXRlZCBvbmNlIGZvciBhIGdpdmVuIGVsZW1lbnRcbiAqIChpbnN0cnVjdGlvbnMudHMgaGFzIGxvZ2ljIGZvciBjYWNoaW5nIHRoaXMpLlxuICovXG5mdW5jdGlvbiBhbGxvY1N0eWxpbmdDb250ZXh0KGVsZW1lbnQsIHRlbXBsYXRlU3R5bGVDb250ZXh0KSB7XG4gICAgLy8gZWFjaCBpbnN0YW5jZSBnZXRzIGEgY29weVxuICAgIHZhciBjb250ZXh0ID0gdGVtcGxhdGVTdHlsZUNvbnRleHQuc2xpY2UoKTtcbiAgICAvLyB0aGUgSEVBREVSIHZhbHVlcyBjb250YWluIGFycmF5cyB3aGljaCBhbHNvIG5lZWRcbiAgICAvLyB0byBiZSBjb3BpZWQgb3ZlciBpbnRvIHRoZSBuZXcgY29udGV4dFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAgLyogU2luZ2xlU3R5bGVzU3RhcnRQb3NpdGlvbiAqLzsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRlbXBsYXRlU3R5bGVDb250ZXh0W2ldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHRbaV0gPSB2YWx1ZS5zbGljZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRleHRbMCAvKiBFbGVtZW50UG9zaXRpb24gKi9dID0gZWxlbWVudDtcbiAgICAvLyB0aGlzIHdpbGwgcHJldmVudCBhbnkgb3RoZXIgZGlyZWN0aXZlcyBmcm9tIGV4dGVuZGluZyB0aGUgY29udGV4dFxuICAgIGNvbnRleHRbMSAvKiBNYXN0ZXJGbGFnUG9zaXRpb24gKi9dIHw9IDE2IC8qIEJpbmRpbmdBbGxvY2F0aW9uTG9ja2VkICovO1xuICAgIHJldHVybiBjb250ZXh0O1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYFN0eWxpbmdDb250ZXh0YCBhdCBhIGdpdmVuIGluZGV4LlxuICpcbiAqIFRoaXMgbWV0aG9kIGxhemlseSBjcmVhdGVzIHRoZSBgU3R5bGluZ0NvbnRleHRgLiBUaGlzIGlzIGJlY2F1c2UgaW4gbW9zdCBjYXNlc1xuICogd2UgaGF2ZSBzdHlsaW5nIHdpdGhvdXQgYW55IGJpbmRpbmdzLiBDcmVhdGluZyBgU3R5bGluZ0NvbnRleHRgIGVhZ2VybHkgd291bGQgbWVhbiB0aGF0XG4gKiBldmVyeSBzdHlsZSBkZWNsYXJhdGlvbiBzdWNoIGFzIGA8ZGl2IHN0eWxlPVwiY29sb3I6IHJlZFwiPmAgd291bGQgcmVzdWx0IGBTdHlsZUNvbnRleHRgXG4gKiB3aGljaCB3b3VsZCBjcmVhdGUgdW5uZWNlc3NhcnkgbWVtb3J5IHByZXNzdXJlLlxuICpcbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgc3R5bGUgYWxsb2NhdGlvbi4gU2VlOiBgZWxlbWVudFN0eWxpbmdgLlxuICogQHBhcmFtIHZpZXdEYXRhIFRoZSB2aWV3IHRvIHNlYXJjaCBmb3IgdGhlIHN0eWxpbmcgY29udGV4dFxuICovXG5mdW5jdGlvbiBnZXRTdHlsaW5nQ29udGV4dEZyb21MVmlldyhpbmRleCwgdmlld0RhdGEpIHtcbiAgICB2YXIgc3RvcmFnZUluZGV4ID0gaW5kZXg7XG4gICAgdmFyIHNsb3RWYWx1ZSA9IHZpZXdEYXRhW3N0b3JhZ2VJbmRleF07XG4gICAgdmFyIHdyYXBwZXIgPSB2aWV3RGF0YTtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheShzbG90VmFsdWUpKSB7XG4gICAgICAgIHdyYXBwZXIgPSBzbG90VmFsdWU7XG4gICAgICAgIHNsb3RWYWx1ZSA9IHNsb3RWYWx1ZVtIT1NUXTtcbiAgICB9XG4gICAgaWYgKGlzU3R5bGluZ0NvbnRleHQod3JhcHBlcikpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIExWaWV3IG9yIGFuIExDb250YWluZXJcbiAgICAgICAgdmFyIHN0eWxpbmdUZW1wbGF0ZSA9IGdldFROb2RlKGluZGV4IC0gSEVBREVSX09GRlNFVCwgdmlld0RhdGEpLnN0eWxpbmdUZW1wbGF0ZTtcbiAgICAgICAgaWYgKHdyYXBwZXIgIT09IHZpZXdEYXRhKSB7XG4gICAgICAgICAgICBzdG9yYWdlSW5kZXggPSBIT1NUO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwcGVyW3N0b3JhZ2VJbmRleF0gPSBzdHlsaW5nVGVtcGxhdGUgP1xuICAgICAgICAgICAgYWxsb2NTdHlsaW5nQ29udGV4dChzbG90VmFsdWUsIHN0eWxpbmdUZW1wbGF0ZSkgOlxuICAgICAgICAgICAgY3JlYXRlRW1wdHlTdHlsaW5nQ29udGV4dChzbG90VmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzQW5pbWF0aW9uUHJvcChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVbMF0gPT09IEFOSU1BVElPTl9QUk9QX1BSRUZJWDtcbn1cbmZ1bmN0aW9uIGhhc0NsYXNzSW5wdXQodE5vZGUpIHtcbiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgOCAvKiBoYXNDbGFzc0lucHV0ICovKSAhPT0gMDtcbn1cbmZ1bmN0aW9uIGhhc1N0eWxlSW5wdXQodE5vZGUpIHtcbiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMTYgLyogaGFzU3R5bGVJbnB1dCAqLykgIT09IDA7XG59XG5mdW5jdGlvbiBmb3JjZUNsYXNzZXNBc1N0cmluZyhjbGFzc2VzKSB7XG4gICAgaWYgKGNsYXNzZXMgJiYgdHlwZW9mIGNsYXNzZXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNsYXNzZXMgPSBPYmplY3Qua2V5cyhjbGFzc2VzKS5qb2luKCcgJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzIHx8ICcnO1xufVxuZnVuY3Rpb24gZm9yY2VTdHlsZXNBc1N0cmluZyhzdHlsZXMpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgICB2YXIgcHJvcHMgPSBPYmplY3Qua2V5cyhzdHlsZXMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICAgICAgc3RyICs9IChpID8gJzsnIDogJycpICsgKHByb3AgKyBcIjpcIiArIHN0eWxlc1twcm9wXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFkZFBsYXllckludGVybmFsKHBsYXllckNvbnRleHQsIHJvb3RDb250ZXh0LCBlbGVtZW50LCBwbGF5ZXIsIHBsYXllckNvbnRleHRJbmRleCwgcmVmKSB7XG4gICAgcmVmID0gcmVmIHx8IGVsZW1lbnQ7XG4gICAgaWYgKHBsYXllckNvbnRleHRJbmRleCkge1xuICAgICAgICBwbGF5ZXJDb250ZXh0W3BsYXllckNvbnRleHRJbmRleF0gPSBwbGF5ZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwbGF5ZXJDb250ZXh0LnB1c2gocGxheWVyKTtcbiAgICB9XG4gICAgaWYgKHBsYXllcikge1xuICAgICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigyMDAgLyogRGVzdHJveWVkICovLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwbGF5ZXJDb250ZXh0LmluZGV4T2YocGxheWVyKTtcbiAgICAgICAgICAgIHZhciBub25GYWN0b3J5UGxheWVySW5kZXggPSBwbGF5ZXJDb250ZXh0WzAgLyogTm9uQnVpbGRlclBsYXllcnNTdGFydCAqL107XG4gICAgICAgICAgICAvLyBpZiB0aGUgcGxheWVyIGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZmFjdG9yeSBzaWRlIG9mIHRoZSBjb250ZXh0XG4gICAgICAgICAgICAvLyAod2hpY2ggaXMgd2hlcmUgdGhlIFtzdHlsZV0gYW5kIFtjbGFzc10gYmluZGluZ3MgZG8gdGhlaXIgdGhpbmcpIHRoZW5cbiAgICAgICAgICAgIC8vIHRoYXQgc2lkZSBvZiB0aGUgYXJyYXkgY2Fubm90IGJlIHJlc2l6ZWQgc2luY2UgdGhlIHJlc3BlY3RpdmUgYmluZGluZ3NcbiAgICAgICAgICAgIC8vIGhhdmUgcG9pbnRlciBpbmRleCB2YWx1ZXMgdGhhdCBwb2ludCB0byB0aGUgYXNzb2NpYXRlZCBmYWN0b3J5IGluc3RhbmNlXG4gICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBub25GYWN0b3J5UGxheWVySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyQ29udGV4dFtpbmRleF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyQ29udGV4dC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBsYXllci5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcGxheWVySGFuZGxlciA9IHJvb3RDb250ZXh0LnBsYXllckhhbmRsZXIgfHwgKHJvb3RDb250ZXh0LnBsYXllckhhbmRsZXIgPSBuZXcgQ29yZVBsYXllckhhbmRsZXIoKSk7XG4gICAgICAgIHBsYXllckhhbmRsZXIucXVldWVQbGF5ZXIocGxheWVyLCByZWYpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UGxheWVyc0ludGVybmFsKHBsYXllckNvbnRleHQpIHtcbiAgICB2YXIgcGxheWVycyA9IFtdO1xuICAgIHZhciBub25GYWN0b3J5UGxheWVyc1N0YXJ0ID0gcGxheWVyQ29udGV4dFswIC8qIE5vbkJ1aWxkZXJQbGF5ZXJzU3RhcnQgKi9dO1xuICAgIC8vIGFkZCBhbGwgZmFjdG9yeS1iYXNlZCBwbGF5ZXJzICh3aGljaCBhcmUgYXBhcnQgb2YgW3N0eWxlXSBhbmQgW2NsYXNzXSBiaW5kaW5ncylcbiAgICBmb3IgKHZhciBpID0gMSAvKiBQbGF5ZXJCdWlsZGVyc1N0YXJ0UG9zaXRpb24gKi8gKyAxIC8qIFBsYXllck9mZnNldFBvc2l0aW9uICovOyBpIDwgbm9uRmFjdG9yeVBsYXllcnNTdGFydDsgaSArPSAyIC8qIFBsYXllckFuZFBsYXllckJ1aWxkZXJzVHVwbGVTaXplICovKSB7XG4gICAgICAgIHZhciBwbGF5ZXIgPSBwbGF5ZXJDb250ZXh0W2ldO1xuICAgICAgICBpZiAocGxheWVyKSB7XG4gICAgICAgICAgICBwbGF5ZXJzLnB1c2gocGxheWVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgYWxsIGN1c3RvbSBwbGF5ZXJzIChub3QgYXBhcnQgb2YgW3N0eWxlXSBhbmQgW2NsYXNzXSBiaW5kaW5ncylcbiAgICBmb3IgKHZhciBpID0gbm9uRmFjdG9yeVBsYXllcnNTdGFydDsgaSA8IHBsYXllckNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcGxheWVycy5wdXNoKHBsYXllckNvbnRleHRbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcGxheWVycztcbn1cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlUGxheWVyQ29udGV4dCh0YXJnZXQsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gY29udGV4dCB8fCBnZXRMQ29udGV4dCh0YXJnZXQpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgdGhyb3dJbnZhbGlkUmVmRXJyb3IoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBsVmlldyA9IGNvbnRleHQubFZpZXcsIG5vZGVJbmRleCA9IGNvbnRleHQubm9kZUluZGV4O1xuICAgIHZhciBzdHlsaW5nQ29udGV4dCA9IGdldFN0eWxpbmdDb250ZXh0RnJvbUxWaWV3KG5vZGVJbmRleCwgbFZpZXcpO1xuICAgIHJldHVybiBnZXRQbGF5ZXJDb250ZXh0KHN0eWxpbmdDb250ZXh0KSB8fCBhbGxvY1BsYXllckNvbnRleHQoc3R5bGluZ0NvbnRleHQpO1xufVxuZnVuY3Rpb24gZ2V0UGxheWVyQ29udGV4dChzdHlsaW5nQ29udGV4dCkge1xuICAgIHJldHVybiBzdHlsaW5nQ29udGV4dFs5IC8qIFBsYXllckNvbnRleHQgKi9dO1xufVxuZnVuY3Rpb24gYWxsb2NQbGF5ZXJDb250ZXh0KGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YVs5IC8qIFBsYXllckNvbnRleHQgKi9dID1cbiAgICAgICAgWzUgLyogU2luZ2xlUGxheWVyQnVpbGRlcnNTdGFydFBvc2l0aW9uICovLCBudWxsLCBudWxsLCBudWxsLCBudWxsXTtcbn1cbmZ1bmN0aW9uIHRocm93SW52YWxpZFJlZkVycm9yKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignT25seSBlbGVtZW50cyB0aGF0IGV4aXN0IGluIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIGJlIHVzZWQgZm9yIGFuaW1hdGlvbnMnKTtcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIHRvIHRoZSBwcm92aWRlZCBlbGVtZW50IHZpYSB0aGUgaW5mZXJyZWQgcmVuZGVyZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHR3byBmb3JtcyBvZiBhdHRyaWJ1dGUgZW50cmllczpcbiAqXG4gKiBkZWZhdWx0OiAoa2V5LCB2YWx1ZSk6XG4gKiAgYXR0cnMgPSBba2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTJdXG4gKlxuICogbmFtZXNwYWNlZDogKE5BTUVTUEFDRV9NQVJLRVIsIHVyaSwgbmFtZSwgdmFsdWUpXG4gKiAgYXR0cnMgPSBbTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZSwgTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZV1cbiAqXG4gKiBUaGUgYGF0dHJzYCBhcnJheSBjYW4gY29udGFpbiBhIG1peCBvZiBib3RoIHRoZSBkZWZhdWx0IGFuZCBuYW1lc3BhY2VkIGVudHJpZXMuXG4gKiBUaGUgXCJkZWZhdWx0XCIgdmFsdWVzIGFyZSBzZXQgd2l0aG91dCBhIG1hcmtlciwgYnV0IGlmIHRoZSBmdW5jdGlvbiBjb21lcyBhY3Jvc3NcbiAqIGEgbWFya2VyIHZhbHVlIHRoZW4gaXQgd2lsbCBhdHRlbXB0IHRvIHNldCBhIG5hbWVzcGFjZWQgdmFsdWUuIElmIHRoZSBtYXJrZXIgaXNcbiAqIG5vdCBvZiBhIG5hbWVzcGFjZWQgdmFsdWUgdGhlbiB0aGUgZnVuY3Rpb24gd2lsbCBxdWl0IGFuZCByZXR1cm4gdGhlIGluZGV4IHZhbHVlXG4gKiB3aGVyZSBpdCBzdG9wcGVkIGR1cmluZyB0aGUgaXRlcmF0aW9uIG9mIHRoZSBhdHRycyBhcnJheS5cbiAqXG4gKiBTZWUgW0F0dHJpYnV0ZU1hcmtlcl0gdG8gdW5kZXJzdGFuZCB3aGF0IHRoZSBuYW1lc3BhY2UgbWFya2VyIHZhbHVlIGlzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXNzaWduaW5nIHN0eWxlIGFuZCBjbGFzcyB2YWx1ZXMgdG9cbiAqIGFuIGVsZW1lbnQuIFNlZSBgZWxlbWVudFN0YXJ0YCBhbmQgYGVsZW1lbnRIb3N0QXR0cnNgIHRvIGxlYXJuIGhvdyBzdHlsaW5nIHZhbHVlc1xuICogYXJlIGFwcGxpZWQgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gbmF0aXZlIFRoZSBlbGVtZW50IHRoYXQgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBhc3NpZ25lZCB0b1xuICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGUgYXJyYXkgb2YgdmFsdWVzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgZWxlbWVudFxuICogQHJldHVybnMgdGhlIGluZGV4IHZhbHVlIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQgaW4gdGhlIGF0dHJpYnV0ZXMgYXJyYXlcbiAqL1xuZnVuY3Rpb24gc2V0VXBBdHRyaWJ1dGVzKG5hdGl2ZSwgYXR0cnMpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSBnZXRMVmlldygpW1JFTkRFUkVSXTtcbiAgICB2YXIgaXNQcm9jID0gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhdHRyc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgbmFtZXNwYWNlcyBhcmUgc3VwcG9ydGVkLiBPdGhlciB2YWx1ZSB0eXBlcyAoc3VjaCBhcyBzdHlsZS9jbGFzc1xuICAgICAgICAgICAgLy8gZW50cmllcykgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBmdW5jdGlvbi5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGp1c3QgbGFuZGVkIG9uIHRoZSBtYXJrZXIgdmFsdWUgLi4uIHRoZXJlZm9yZVxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHNraXAgdG8gdGhlIG5leHQgZW50cnlcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIHZhciBuYW1lc3BhY2VVUkkgPSBhdHRyc1tpKytdO1xuICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0cnNbaSsrXTtcbiAgICAgICAgICAgIHZhciBhdHRyVmFsID0gYXR0cnNbaSsrXTtcbiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKztcbiAgICAgICAgICAgIGlzUHJvYyA/XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsIGF0dHJWYWwsIG5hbWVzcGFjZVVSSSkgOlxuICAgICAgICAgICAgICAgIG5hdGl2ZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGF0dHJOYW1lLCBhdHRyVmFsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGF0dHJOYW1lIGlzIHN0cmluZztcbiAgICAgICAgICAgIHZhciBhdHRyTmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgdmFyIGF0dHJWYWwgPSBhdHRyc1srK2ldO1xuICAgICAgICAgICAgLy8gU3RhbmRhcmQgYXR0cmlidXRlc1xuICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldEF0dHJpYnV0ZSsrO1xuICAgICAgICAgICAgaWYgKGlzQW5pbWF0aW9uUHJvcChhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KG5hdGl2ZSwgYXR0ck5hbWUsIGF0dHJWYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlzUHJvYyA/XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsIGF0dHJWYWwpIDpcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYW5vdGhlciBwaWVjZSBvZiBjb2RlIG1heSBpdGVyYXRlIG92ZXIgdGhlIHNhbWUgYXR0cmlidXRlcyBhcnJheS4gVGhlcmVmb3JlXG4gICAgLy8gaXQgbWF5IGJlIGhlbHBmdWwgdG8gcmV0dXJuIHRoZSBleGFjdCBzcG90IHdoZXJlIHRoZSBhdHRyaWJ1dGVzIGFycmF5IGV4aXRlZFxuICAgIC8vIHdoZXRoZXIgYnkgcnVubmluZyBpbnRvIGFuIHVuc3VwcG9ydGVkIG1hcmtlciBvciBpZiBhbGwgdGhlIHN0YXRpYyB2YWx1ZXMgd2VyZVxuICAgIC8vIGl0ZXJhdGVkIG92ZXIuXG4gICAgcmV0dXJuIGk7XG59XG5mdW5jdGlvbiBhdHRyc1N0eWxpbmdJbmRleE9mKGF0dHJzLCBzdGFydEluZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsID0gYXR0cnNbaV07XG4gICAgICAgIGlmICh2YWwgPT09IDEgLyogQ2xhc3NlcyAqLyB8fCB2YWwgPT09IDIgLyogU3R5bGVzICovKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBtYXJrZXIgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nXG4gKiBhdHRyaWJ1dGUgdmFsdWVzIGluIGEgYFRBdHRyaWJ1dGVzYCBhcnJheSBhcmUgb25seSB0aGUgbmFtZXMgb2YgYXR0cmlidXRlcyxcbiAqIGFuZCBub3QgbmFtZS12YWx1ZSBwYWlycy5cbiAqIEBwYXJhbSBtYXJrZXIgVGhlIGF0dHJpYnV0ZSBtYXJrZXIgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG1hcmtlciBpcyBhIFwibmFtZS1vbmx5XCIgbWFya2VyIChlLmcuIGBCaW5kaW5nc2Agb3IgYFRlbXBsYXRlYCkuXG4gKi9cbmZ1bmN0aW9uIGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobWFya2VyKSB7XG4gICAgcmV0dXJuIG1hcmtlciA9PT0gMyAvKiBCaW5kaW5ncyAqLyB8fCBtYXJrZXIgPT09IDQgLyogVGVtcGxhdGUgKi87XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vLyBQYXJlbnQgSW5qZWN0b3IgVXRpbHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2NhdGlvbikge1xuICAgIHJldHVybiBwYXJlbnRMb2NhdGlvbiAhPT0gTk9fUEFSRU5UX0lOSkVDVE9SO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbikge1xuICAgIHJldHVybiBwYXJlbnRMb2NhdGlvbiAmIDMyNzY3IC8qIEluamVjdG9ySW5kZXhNYXNrICovO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JWaWV3T2Zmc2V0KHBhcmVudExvY2F0aW9uKSB7XG4gICAgcmV0dXJuIHBhcmVudExvY2F0aW9uID4+IDE2IC8qIFZpZXdPZmZzZXRTaGlmdCAqLztcbn1cbi8qKlxuICogVW53cmFwcyBhIHBhcmVudCBpbmplY3RvciBsb2NhdGlvbiBudW1iZXIgdG8gZmluZCB0aGUgdmlldyBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBpbmplY3RvcixcbiAqIHRoZW4gd2Fsa3MgdXAgdGhlIGRlY2xhcmF0aW9uIHZpZXcgdHJlZSB1bnRpbCB0aGUgdmlldyBpcyBmb3VuZCB0aGF0IGNvbnRhaW5zIHRoZSBwYXJlbnRcbiAqIGluamVjdG9yLlxuICpcbiAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBpbmplY3Rvciwgd2hpY2ggY29udGFpbnMgdGhlIHZpZXcgb2Zmc2V0XG4gKiBAcGFyYW0gc3RhcnRWaWV3IFRoZSBMVmlldyBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHdhbGtpbmcgdXAgdGhlIHZpZXcgdHJlZVxuICogQHJldHVybnMgVGhlIExWaWV3IGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhcmVudCBpbmplY3RvclxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvclZpZXcobG9jYXRpb24sIHN0YXJ0Vmlldykge1xuICAgIHZhciB2aWV3T2Zmc2V0ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3T2Zmc2V0KGxvY2F0aW9uKTtcbiAgICB2YXIgcGFyZW50VmlldyA9IHN0YXJ0VmlldztcbiAgICAvLyBGb3IgbW9zdCBjYXNlcywgdGhlIHBhcmVudCBpbmplY3RvciBjYW4gYmUgZm91bmQgb24gdGhlIGhvc3Qgbm9kZSAoZS5nLiBmb3IgY29tcG9uZW50XG4gICAgLy8gb3IgY29udGFpbmVyKSwgYnV0IHdlIG11c3Qga2VlcCB0aGUgbG9vcCBoZXJlIHRvIHN1cHBvcnQgdGhlIHJhcmVyIGNhc2Ugb2YgZGVlcGx5IG5lc3RlZFxuICAgIC8vIDxuZy10ZW1wbGF0ZT4gdGFncyBvciBpbmxpbmUgdmlld3MsIHdoZXJlIHRoZSBwYXJlbnQgaW5qZWN0b3IgbWlnaHQgbGl2ZSBtYW55IHZpZXdzXG4gICAgLy8gYWJvdmUgdGhlIGNoaWxkIGluamVjdG9yLlxuICAgIHdoaWxlICh2aWV3T2Zmc2V0ID4gMCkge1xuICAgICAgICBwYXJlbnRWaWV3ID0gcGFyZW50Vmlld1tERUNMQVJBVElPTl9WSUVXXTtcbiAgICAgICAgdmlld09mZnNldC0tO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50Vmlldztcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgTFZpZXcgb2YgdGhlIHBhc3NlZCBMVmlldywgaWYgdGhlIFBBUkVOVCBpcyBhbiBMQ29udGFpbmVyLCB3aWxsIGdldCB0aGUgcGFyZW50IG9mXG4gKiB0aGF0IExDb250YWluZXIsIHdoaWNoIGlzIGFuIExWaWV3XG4gKiBAcGFyYW0gbFZpZXcgdGhlIGxWaWV3IHdob3NlIHBhcmVudCB0byBnZXRcbiAqL1xuZnVuY3Rpb24gZ2V0TFZpZXdQYXJlbnQobFZpZXcpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpO1xuICAgIHZhciBwYXJlbnQgPSBsVmlld1tQQVJFTlRdO1xuICAgIHJldHVybiBpc0xDb250YWluZXIocGFyZW50KSA/IHBhcmVudFtQQVJFTlRdIDogcGFyZW50O1xufVxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcm9vdCB2aWV3IGZyb20gYW55IGNvbXBvbmVudCBvciBgTFZpZXdgIGJ5IHdhbGtpbmcgdGhlIHBhcmVudCBgTFZpZXdgIHVudGlsXG4gKiByZWFjaGluZyB0aGUgcm9vdCBgTFZpZXdgLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnRPckxWaWV3IGFueSBjb21wb25lbnQgb3IgYExWaWV3YFxuICovXG5mdW5jdGlvbiBnZXRSb290Vmlldyhjb21wb25lbnRPckxWaWV3KSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY29tcG9uZW50T3JMVmlldywgJ2NvbXBvbmVudCcpO1xuICAgIHZhciBsVmlldyA9IGlzTFZpZXcoY29tcG9uZW50T3JMVmlldykgPyBjb21wb25lbnRPckxWaWV3IDogcmVhZFBhdGNoZWRMVmlldyhjb21wb25lbnRPckxWaWV3KTtcbiAgICB3aGlsZSAobFZpZXcgJiYgIShsVmlld1tGTEFHU10gJiA1MTIgLyogSXNSb290ICovKSkge1xuICAgICAgICBsVmlldyA9IGdldExWaWV3UGFyZW50KGxWaWV3KTtcbiAgICB9XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGxWaWV3KTtcbiAgICByZXR1cm4gbFZpZXc7XG59XG4vKipcbiAqIEdpdmVuIGEgY3VycmVudCB2aWV3LCBmaW5kcyB0aGUgbmVhcmVzdCBjb21wb25lbnQncyBob3N0IChMRWxlbWVudCkuXG4gKlxuICogQHBhcmFtIGxWaWV3IExWaWV3IGZvciB3aGljaCB3ZSB3YW50IGEgaG9zdCBlbGVtZW50IG5vZGVcbiAqIEByZXR1cm5zIFRoZSBob3N0IG5vZGVcbiAqL1xuZnVuY3Rpb24gZmluZENvbXBvbmVudFZpZXcobFZpZXcpIHtcbiAgICB2YXIgcm9vdFROb2RlID0gbFZpZXdbVF9IT1NUXTtcbiAgICB3aGlsZSAocm9vdFROb2RlICYmIHJvb3RUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobFZpZXdbREVDTEFSQVRJT05fVklFV10sICdsVmlld1tERUNMQVJBVElPTl9WSUVXXScpO1xuICAgICAgICBsVmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddO1xuICAgICAgICByb290VE5vZGUgPSBsVmlld1tUX0hPU1RdO1xuICAgIH1cbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpO1xuICAgIHJldHVybiBsVmlldztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYFJvb3RDb250ZXh0YCBpbnN0YW5jZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aFxuICogdGhlIGFwcGxpY2F0aW9uIHdoZXJlIHRoZSB0YXJnZXQgaXMgc2l0dWF0ZWQuIEl0IGRvZXMgdGhpcyBieSB3YWxraW5nIHRoZSBwYXJlbnQgdmlld3MgdW50aWwgaXRcbiAqIGdldHMgdG8gdGhlIHJvb3QgdmlldywgdGhlbiBnZXR0aW5nIHRoZSBjb250ZXh0IG9mZiBvZiB0aGF0LlxuICpcbiAqIEBwYXJhbSB2aWV3T3JDb21wb25lbnQgdGhlIGBMVmlld2Agb3IgY29tcG9uZW50IHRvIGdldCB0aGUgcm9vdCBjb250ZXh0IGZvci5cbiAqL1xuZnVuY3Rpb24gZ2V0Um9vdENvbnRleHQodmlld09yQ29tcG9uZW50KSB7XG4gICAgdmFyIHJvb3RWaWV3ID0gZ2V0Um9vdFZpZXcodmlld09yQ29tcG9uZW50KTtcbiAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgYXNzZXJ0RGVmaW5lZChyb290Vmlld1tDT05URVhUXSwgJ1Jvb3RWaWV3IGhhcyBubyBjb250ZXh0LiBQZXJoYXBzIGl0IGlzIGRpc2Nvbm5lY3RlZD8nKTtcbiAgICByZXR1cm4gcm9vdFZpZXdbQ09OVEVYVF07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogRGVmaW5lcyBpZiB0aGUgY2FsbCB0byBgaW5qZWN0YCBzaG91bGQgaW5jbHVkZSBgdmlld1Byb3ZpZGVyc2AgaW4gaXRzIHJlc29sdXRpb24uXG4gKlxuICogVGhpcyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHdlIHRyeSB0byBpbnN0YW50aWF0ZSBhIGNvbXBvbmVudC4gVGhpcyB2YWx1ZSBpcyByZXNldCBpblxuICogYGdldE5vZGVJbmplY3RhYmxlYCB0byBhIHZhbHVlIHdoaWNoIG1hdGNoZXMgdGhlIGRlY2xhcmF0aW9uIGxvY2F0aW9uIG9mIHRoZSB0b2tlbiBhYm91dCB0byBiZVxuICogaW5zdGFudGlhdGVkLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBpZiB3ZSBhcmUgaW5qZWN0aW5nIGEgdG9rZW4gd2hpY2ggd2FzIGRlY2xhcmVkIG91dHNpZGUgb2ZcbiAqIGB2aWV3UHJvdmlkZXJzYCB3ZSBkb24ndCBhY2NpZGVudGFsbHkgcHVsbCBgdmlld1Byb3ZpZGVyc2AgaW4uXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogU3RyaW5nKSB7fVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBNeVNlcnZpY2UsXG4gKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICdwcm92aWRlcnMnIH1cbiAqICAgXVxuICogICB2aWV3UHJvdmlkZXJzOiBbXG4gKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICd2aWV3UHJvdmlkZXJzJ31cbiAqICAgXVxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IobXlTZXJ2aWNlOiBNeVNlcnZpY2UsIHZhbHVlOiBTdHJpbmcpIHtcbiAqICAgICAvLyBXZSBleHBlY3QgdGhhdCBDb21wb25lbnQgY2FuIHNlZSBpbnRvIGB2aWV3UHJvdmlkZXJzYC5cbiAqICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ3ZpZXdQcm92aWRlcnMnKTtcbiAqICAgICAvLyBgTXlTZXJ2aWNlYCB3YXMgbm90IGRlY2xhcmVkIGluIGB2aWV3UHJvdmlkZXJzYCBoZW5jZSBpdCBjYW4ndCBzZWUgaXQuXG4gKiAgICAgZXhwZWN0KG15U2VydmljZS52YWx1ZSkudG9FcXVhbCgncHJvdmlkZXJzJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBgYGBcbiAqL1xudmFyIGluY2x1ZGVWaWV3UHJvdmlkZXJzID0gdHJ1ZTtcbmZ1bmN0aW9uIHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKHYpIHtcbiAgICB2YXIgb2xkVmFsdWUgPSBpbmNsdWRlVmlld1Byb3ZpZGVycztcbiAgICBpbmNsdWRlVmlld1Byb3ZpZGVycyA9IHY7XG4gICAgcmV0dXJuIG9sZFZhbHVlO1xufVxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIGVhY2ggYmxvb20gZmlsdGVyICh1c2VkIGJ5IERJKS4gVGhlIGxhcmdlciB0aGlzIG51bWJlciwgdGhlIGZld2VyXG4gKiBkaXJlY3RpdmVzIHRoYXQgd2lsbCBzaGFyZSBzbG90cywgYW5kIHRodXMsIHRoZSBmZXdlciBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBjaGVja2luZyBmb3JcbiAqIHRoZSBleGlzdGVuY2Ugb2YgYSBkaXJlY3RpdmUuXG4gKi9cbnZhciBCTE9PTV9TSVpFID0gMjU2O1xudmFyIEJMT09NX01BU0sgPSBCTE9PTV9TSVpFIC0gMTtcbi8qKiBDb3VudGVyIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcyBmb3IgZGlyZWN0aXZlcy4gKi9cbnZhciBuZXh0TmdFbGVtZW50SWQgPSAwO1xuLyoqXG4gKiBSZWdpc3RlcnMgdGhpcyBkaXJlY3RpdmUgYXMgcHJlc2VudCBpbiBpdHMgbm9kZSdzIGluamVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBkaXJlY3RpdmUnc1xuICogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGluamVjdG9yJ3MgYmxvb20gZmlsdGVyLlxuICpcbiAqIEBwYXJhbSBpbmplY3RvckluZGV4IFRoZSBpbmRleCBvZiB0aGUgbm9kZSBpbmplY3RvciB3aGVyZSB0aGlzIHRva2VuIHNob3VsZCBiZSByZWdpc3RlcmVkXG4gKiBAcGFyYW0gdFZpZXcgVGhlIFRWaWV3IGZvciB0aGUgaW5qZWN0b3IncyBibG9vbSBmaWx0ZXJzXG4gKiBAcGFyYW0gdHlwZSBUaGUgZGlyZWN0aXZlIHRva2VuIHRvIHJlZ2lzdGVyXG4gKi9cbmZ1bmN0aW9uIGJsb29tQWRkKGluamVjdG9ySW5kZXgsIHRWaWV3LCB0eXBlKSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzLCB0cnVlLCAnZXhwZWN0ZWQgZmlyc3RUZW1wbGF0ZVBhc3MgdG8gYmUgdHJ1ZScpO1xuICAgIHZhciBpZCA9IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyA/IHR5cGVbTkdfRUxFTUVOVF9JRF0gOiB0eXBlLmNoYXJDb2RlQXQoMCkgfHwgMDtcbiAgICAvLyBTZXQgYSB1bmlxdWUgSUQgb24gdGhlIGRpcmVjdGl2ZSB0eXBlLCBzbyBpZiBzb21ldGhpbmcgdHJpZXMgdG8gaW5qZWN0IHRoZSBkaXJlY3RpdmUsXG4gICAgLy8gd2UgY2FuIGVhc2lseSByZXRyaWV2ZSB0aGUgSUQgYW5kIGhhc2ggaXQgaW50byB0aGUgYmxvb20gYml0IHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuXG4gICAgaWYgKGlkID09IG51bGwpIHtcbiAgICAgICAgaWQgPSB0eXBlW05HX0VMRU1FTlRfSURdID0gbmV4dE5nRWxlbWVudElkKys7XG4gICAgfVxuICAgIC8vIFdlIG9ubHkgaGF2ZSBCTE9PTV9TSVpFICgyNTYpIHNsb3RzIGluIG91ciBibG9vbSBmaWx0ZXIgKDggYnVja2V0cyAqIDMyIGJpdHMgZWFjaCksXG4gICAgLy8gc28gYWxsIHVuaXF1ZSBJRHMgbXVzdCBiZSBtb2R1bG8tZWQgaW50byBhIG51bWJlciBmcm9tIDAgLSAyNTUgdG8gZml0IGludG8gdGhlIGZpbHRlci5cbiAgICB2YXIgYmxvb21CaXQgPSBpZCAmIEJMT09NX01BU0s7XG4gICAgLy8gQ3JlYXRlIGEgbWFzayB0aGF0IHRhcmdldHMgdGhlIHNwZWNpZmljIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZS5cbiAgICAvLyBKUyBiaXQgb3BlcmF0aW9ucyBhcmUgMzIgYml0cywgc28gdGhpcyB3aWxsIGJlIGEgbnVtYmVyIGJldHdlZW4gMl4wIGFuZCAyXjMxLCBjb3JyZXNwb25kaW5nXG4gICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci5cbiAgICB2YXIgbWFzayA9IDEgPDwgYmxvb21CaXQ7XG4gICAgLy8gVXNlIHRoZSByYXcgYmxvb21CaXQgbnVtYmVyIHRvIGRldGVybWluZSB3aGljaCBibG9vbSBmaWx0ZXIgYnVja2V0IHdlIHNob3VsZCBjaGVja1xuICAgIC8vIGUuZzogYmYwID0gWzAgLSAzMV0sIGJmMSA9IFszMiAtIDYzXSwgYmYyID0gWzY0IC0gOTVdLCBiZjMgPSBbOTYgLSAxMjddLCBldGNcbiAgICB2YXIgYjcgPSBibG9vbUJpdCAmIDB4ODA7XG4gICAgdmFyIGI2ID0gYmxvb21CaXQgJiAweDQwO1xuICAgIHZhciBiNSA9IGJsb29tQml0ICYgMHgyMDtcbiAgICB2YXIgdERhdGEgPSB0Vmlldy5kYXRhO1xuICAgIGlmIChiNykge1xuICAgICAgICBiNiA/IChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgN10gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleCArIDZdIHw9IG1hc2spKSA6XG4gICAgICAgICAgICAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDVdIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA0XSB8PSBtYXNrKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBiNiA/IChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgM10gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleCArIDJdIHw9IG1hc2spKSA6XG4gICAgICAgICAgICAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDFdIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXhdIHw9IG1hc2spKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgKG9yIGdldHMgYW4gZXhpc3RpbmcpIGluamVjdG9yIGZvciBhIGdpdmVuIGVsZW1lbnQgb3IgY29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSB0Tm9kZSBmb3Igd2hpY2ggYW4gaW5qZWN0b3Igc2hvdWxkIGJlIHJldHJpZXZlZCAvIGNyZWF0ZWQuXG4gKiBAcGFyYW0gaG9zdFZpZXcgVmlldyB3aGVyZSB0aGUgbm9kZSBpcyBzdG9yZWRcbiAqIEByZXR1cm5zIE5vZGUgaW5qZWN0b3JcbiAqL1xuZnVuY3Rpb24gZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCBob3N0Vmlldykge1xuICAgIHZhciBleGlzdGluZ0luamVjdG9ySW5kZXggPSBnZXRJbmplY3RvckluZGV4KHROb2RlLCBob3N0Vmlldyk7XG4gICAgaWYgKGV4aXN0aW5nSW5qZWN0b3JJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5qZWN0b3JJbmRleDtcbiAgICB9XG4gICAgdmFyIHRWaWV3ID0gaG9zdFZpZXdbVFZJRVddO1xuICAgIGlmICh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICB0Tm9kZS5pbmplY3RvckluZGV4ID0gaG9zdFZpZXcubGVuZ3RoO1xuICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5kYXRhLCB0Tm9kZSk7IC8vIGZvdW5kYXRpb24gZm9yIG5vZGUgYmxvb21cbiAgICAgICAgaW5zZXJ0Qmxvb20oaG9zdFZpZXcsIG51bGwpOyAvLyBmb3VuZGF0aW9uIGZvciBjdW11bGF0aXZlIGJsb29tXG4gICAgICAgIGluc2VydEJsb29tKHRWaWV3LmJsdWVwcmludCwgbnVsbCk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh0Tm9kZS5mbGFncyA9PT0gMCB8fCB0Tm9kZS5mbGFncyA9PT0gMSAvKiBpc0NvbXBvbmVudCAqLywgdHJ1ZSwgJ2V4cGVjdGVkIHROb2RlLmZsYWdzIHRvIG5vdCBiZSBpbml0aWFsaXplZCcpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50TG9jID0gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgaG9zdFZpZXcpO1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jKTtcbiAgICB2YXIgcGFyZW50TFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jLCBob3N0Vmlldyk7XG4gICAgdmFyIGluamVjdG9ySW5kZXggPSB0Tm9kZS5pbmplY3RvckluZGV4O1xuICAgIC8vIElmIGEgcGFyZW50IGluamVjdG9yIGNhbid0IGJlIGZvdW5kLCBpdHMgbG9jYXRpb24gaXMgc2V0IHRvIC0xLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgYSBjdW11bGF0aXZlIGJsb29tXG4gICAgaWYgKGhhc1BhcmVudEluamVjdG9yKHBhcmVudExvYykpIHtcbiAgICAgICAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRMVmlld1tUVklFV10uZGF0YTtcbiAgICAgICAgLy8gQ3JlYXRlcyBhIGN1bXVsYXRpdmUgYmxvb20gZmlsdGVyIHRoYXQgbWVyZ2VzIHRoZSBwYXJlbnQncyBibG9vbSBmaWx0ZXJcbiAgICAgICAgLy8gYW5kIGl0cyBvd24gY3VtdWxhdGl2ZSBibG9vbSAod2hpY2ggY29udGFpbnMgdG9rZW5zIGZvciBhbGwgYW5jZXN0b3JzKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgaG9zdFZpZXdbaW5qZWN0b3JJbmRleCArIGldID0gcGFyZW50TFZpZXdbcGFyZW50SW5kZXggKyBpXSB8IHBhcmVudERhdGFbcGFyZW50SW5kZXggKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBob3N0Vmlld1tpbmplY3RvckluZGV4ICsgUEFSRU5UX0lOSkVDVE9SXSA9IHBhcmVudExvYztcbiAgICByZXR1cm4gaW5qZWN0b3JJbmRleDtcbn1cbmZ1bmN0aW9uIGluc2VydEJsb29tKGFyciwgZm9vdGVyKSB7XG4gICAgYXJyLnB1c2goMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZm9vdGVyKTtcbn1cbmZ1bmN0aW9uIGdldEluamVjdG9ySW5kZXgodE5vZGUsIGhvc3RWaWV3KSB7XG4gICAgaWYgKHROb2RlLmluamVjdG9ySW5kZXggPT09IC0xIHx8XG4gICAgICAgIC8vIElmIHRoZSBpbmplY3RvciBpbmRleCBpcyB0aGUgc2FtZSBhcyBpdHMgcGFyZW50J3MgaW5qZWN0b3IgaW5kZXgsIHRoZW4gdGhlIGluZGV4IGhhcyBiZWVuXG4gICAgICAgIC8vIGNvcGllZCBkb3duIGZyb20gdGhlIHBhcmVudCBub2RlLiBObyBpbmplY3RvciBoYXMgYmVlbiBjcmVhdGVkIHlldCBvbiB0aGlzIG5vZGUuXG4gICAgICAgICh0Tm9kZS5wYXJlbnQgJiYgdE5vZGUucGFyZW50LmluamVjdG9ySW5kZXggPT09IHROb2RlLmluamVjdG9ySW5kZXgpIHx8XG4gICAgICAgIC8vIEFmdGVyIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzLCB0aGUgaW5qZWN0b3IgaW5kZXggbWlnaHQgZXhpc3QgYnV0IHRoZSBwYXJlbnQgdmFsdWVzXG4gICAgICAgIC8vIG1pZ2h0IG5vdCBoYXZlIGJlZW4gY2FsY3VsYXRlZCB5ZXQgZm9yIHRoaXMgaW5zdGFuY2VcbiAgICAgICAgaG9zdFZpZXdbdE5vZGUuaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl0gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdE5vZGUuaW5qZWN0b3JJbmRleDtcbiAgICB9XG59XG4vKipcbiAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgcGFyZW50IGluamVjdG9yLCB3aXRoIGEgdmlldyBvZmZzZXQgaWYgYXBwbGljYWJsZS4gVXNlZCB0byBzZXQgdGhlXG4gKiBwYXJlbnQgaW5qZWN0b3IgaW5pdGlhbGx5LlxuICpcbiAqIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBudW1iZXIgb2YgYFZpZXdEYXRhYCB3ZSBoYXZlIHRvIGdvIHVwIGFuZCBpbmRleCBpbiB0aGF0IGBWaWV3ZGF0YWBcbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgdmlldykge1xuICAgIGlmICh0Tm9kZS5wYXJlbnQgJiYgdE5vZGUucGFyZW50LmluamVjdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgIHJldHVybiB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleDsgLy8gVmlld09mZnNldCBpcyAwXG4gICAgfVxuICAgIC8vIEZvciBtb3N0IGNhc2VzLCB0aGUgcGFyZW50IGluamVjdG9yIGluZGV4IGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9zdCBub2RlIChlLmcuIGZvciBjb21wb25lbnRcbiAgICAvLyBvciBjb250YWluZXIpLCBzbyB0aGlzIGxvb3Agd2lsbCBiZSBza2lwcGVkLCBidXQgd2UgbXVzdCBrZWVwIHRoZSBsb29wIGhlcmUgdG8gc3VwcG9ydFxuICAgIC8vIHRoZSByYXJlciBjYXNlIG9mIGRlZXBseSBuZXN0ZWQgPG5nLXRlbXBsYXRlPiB0YWdzIG9yIGlubGluZSB2aWV3cy5cbiAgICB2YXIgaG9zdFROb2RlID0gdmlld1tUX0hPU1RdO1xuICAgIHZhciB2aWV3T2Zmc2V0ID0gMTtcbiAgICB3aGlsZSAoaG9zdFROb2RlICYmIGhvc3RUTm9kZS5pbmplY3RvckluZGV4ID09PSAtMSkge1xuICAgICAgICB2aWV3ID0gdmlld1tERUNMQVJBVElPTl9WSUVXXTtcbiAgICAgICAgaG9zdFROb2RlID0gdmlldyA/IHZpZXdbVF9IT1NUXSA6IG51bGw7XG4gICAgICAgIHZpZXdPZmZzZXQrKztcbiAgICB9XG4gICAgcmV0dXJuIGhvc3RUTm9kZSA/XG4gICAgICAgIGhvc3RUTm9kZS5pbmplY3RvckluZGV4IHwgKHZpZXdPZmZzZXQgPDwgMTYgLyogVmlld09mZnNldFNoaWZ0ICovKSA6XG4gICAgICAgIC0xO1xufVxuLyoqXG4gKiBNYWtlcyBhIHR5cGUgb3IgYW4gaW5qZWN0aW9uIHRva2VuIHB1YmxpYyB0byB0aGUgREkgc3lzdGVtIGJ5IGFkZGluZyBpdCB0byBhblxuICogaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuXG4gKlxuICogQHBhcmFtIGRpIFRoZSBub2RlIGluamVjdG9yIGluIHdoaWNoIGEgZGlyZWN0aXZlIHdpbGwgYmUgYWRkZWRcbiAqIEBwYXJhbSB0b2tlbiBUaGUgdHlwZSBvciB0aGUgaW5qZWN0aW9uIHRva2VuIHRvIGJlIG1hZGUgcHVibGljXG4gKi9cbmZ1bmN0aW9uIGRpUHVibGljSW5JbmplY3RvcihpbmplY3RvckluZGV4LCB2aWV3LCB0b2tlbikge1xuICAgIGJsb29tQWRkKGluamVjdG9ySW5kZXgsIHZpZXdbVFZJRVddLCB0b2tlbik7XG59XG4vKipcbiAqIEluamVjdCBzdGF0aWMgYXR0cmlidXRlIHZhbHVlIGludG8gZGlyZWN0aXZlIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2l0aCBgZmFjdG9yeWAgZnVuY3Rpb25zIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZlxuICogYGRlZmluZURpcmVjdGl2ZWAgb3IgYGRlZmluZUNvbXBvbmVudGAuIFRoZSBtZXRob2QgcmV0cmlldmVzIHRoZSBzdGF0aWMgdmFsdWVcbiAqIG9mIGFuIGF0dHJpYnV0ZS4gKER5bmFtaWMgYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZCBzaW5jZSB0aGV5IGFyZSBub3QgcmVzb2x2ZWRcbiAqICBhdCB0aGUgdGltZSBvZiBpbmplY3Rpb24gYW5kIGNhbiBjaGFuZ2Ugb3ZlciB0aW1lLilcbiAqXG4gKiAjIEV4YW1wbGVcbiAqIEdpdmVuOlxuICogYGBgXG4gKiBAQ29tcG9uZW50KC4uLilcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoQEF0dHJpYnV0ZSgndGl0bGUnKSB0aXRsZTogc3RyaW5nKSB7IC4uLiB9XG4gKiB9XG4gKiBgYGBcbiAqIFdoZW4gaW5zdGFudGlhdGVkIHdpdGhcbiAqIGBgYFxuICogPG15LWNvbXBvbmVudCB0aXRsZT1cIkhlbGxvXCI+PC9teS1jb21wb25lbnQ+XG4gKiBgYGBcbiAqXG4gKiBUaGVuIGZhY3RvcnkgbWV0aG9kIGdlbmVyYXRlZCBpczpcbiAqIGBgYFxuICogTXlDb21wb25lbnQubmdDb21wb25lbnREZWYgPSBkZWZpbmVDb21wb25lbnQoe1xuICogICBmYWN0b3J5OiAoKSA9PiBuZXcgTXlDb21wb25lbnQoaW5qZWN0QXR0cmlidXRlKCd0aXRsZScpKVxuICogICAuLi5cbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGluamVjdEF0dHJpYnV0ZUltcGwodE5vZGUsIGF0dHJOYW1lVG9JbmplY3QpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMCAvKiBDb250YWluZXIgKi8sIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ2V4cGVjdGluZyB0Tm9kZScpO1xuICAgIHZhciBhdHRycyA9IHROb2RlLmF0dHJzO1xuICAgIGlmIChhdHRycykge1xuICAgICAgICB2YXIgYXR0cnNMZW5ndGggPSBhdHRycy5sZW5ndGg7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCBhdHRyc0xlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gYXR0cnNbaV07XG4gICAgICAgICAgICAvLyBJZiB3ZSBoaXQgYSBgQmluZGluZ3NgIG9yIGBUZW1wbGF0ZWAgbWFya2VyIHRoZW4gd2UgYXJlIGRvbmUuXG4gICAgICAgICAgICBpZiAoaXNOYW1lT25seUF0dHJpYnV0ZU1hcmtlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBTa2lwIG5hbWVzcGFjZWQgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykge1xuICAgICAgICAgICAgICAgIC8vIHdlIHNraXAgdGhlIG5leHQgdHdvIHZhbHVlc1xuICAgICAgICAgICAgICAgIC8vIGFzIG5hbWVzcGFjZWQgYXR0cmlidXRlcyBsb29rcyBsaWtlXG4gICAgICAgICAgICAgICAgLy8gWy4uLiwgQXR0cmlidXRlTWFya2VyLk5hbWVzcGFjZVVSSSwgJ2h0dHA6Ly9zb21ldXJpLmNvbS90ZXN0JywgJ3Rlc3Q6ZXhpc3QnLFxuICAgICAgICAgICAgICAgIC8vICdleGlzdFZhbHVlJywgLi4uXVxuICAgICAgICAgICAgICAgIGkgPSBpICsgMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIHRvIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbWFya2VkIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAxIC8qIENsYXNzZXMgKi8gJiYgYXR0ck5hbWVUb0luamVjdCA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWNjdW11bGF0ZWRDbGFzc2VzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgYXR0cnNMZW5ndGggJiYgdHlwZW9mIGF0dHJzW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRDbGFzc2VzICs9ICcgJyArIGF0dHJzW2krK107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkQ2xhc3Nlcy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAyIC8qIFN0eWxlcyAqLyAmJiBhdHRyTmFtZVRvSW5qZWN0ID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhY2N1bXVsYXRlZFN0eWxlcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoICYmIHR5cGVvZiBhdHRyc1tpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkU3R5bGVzICs9IGF0dHJzW2krK10gKyBcIjogXCIgKyBhdHRyc1tpKytdICsgXCI7IFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZFN0eWxlcy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoICYmIHR5cGVvZiBhdHRyc1tpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSBhdHRyTmFtZVRvSW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzW2kgKyAxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgPSBpICsgMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdG9rZW4gZnJvbSB0aGUgTm9kZUluamVjdG9ycyA9PiBNb2R1bGVJbmplY3Rvci5cbiAqXG4gKiBMb29rIGZvciB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSB0b2tlbiBieSB3YWxraW5nIHVwIHRoZSBub2RlIGluamVjdG9yIHRyZWUgYW5kIHRoZW5cbiAqIHRoZSBtb2R1bGUgaW5qZWN0b3IgdHJlZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBhdGNoZXMgYHRva2VuYCB3aXRoIGBfX05HX0VMRU1FTlRfSURfX2Agd2hpY2ggY29udGFpbnMgdGhlIGlkIGZvciB0aGUgYmxvb21cbiAqIGZpbHRlci4gTmVnYXRpdmUgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBvYmplY3RzLlxuICogICAtIGAtMWAgaXMgcmVzZXJ2ZWQgZm9yIGluamVjdGluZyBgSW5qZWN0b3JgIChpbXBsZW1lbnRlZCBieSBgTm9kZUluamVjdG9yYClcbiAqXG4gKiBAcGFyYW0gdE5vZGUgVGhlIE5vZGUgd2hlcmUgdGhlIHNlYXJjaCBmb3IgdGhlIGluamVjdG9yIHNob3VsZCBzdGFydFxuICogQHBhcmFtIGxWaWV3IFRoZSBgTFZpZXdgIHRoYXQgY29udGFpbnMgdGhlIGB0Tm9kZWBcbiAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gbG9vayBmb3JcbiAqIEBwYXJhbSBmbGFncyBJbmplY3Rpb24gZmxhZ3NcbiAqIEBwYXJhbSBub3RGb3VuZFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gd2hlbiB0aGUgaW5qZWN0aW9uIGZsYWdzIGlzIGBJbmplY3RGbGFncy5PcHRpb25hbGBcbiAqIEByZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbmplY3RvciwgYG51bGxgIHdoZW4gbm90IGZvdW5kLCBvciBgbm90Rm91bmRWYWx1ZWAgaWYgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHROb2RlLCBsVmlldywgdG9rZW4sIGZsYWdzLCBub3RGb3VuZFZhbHVlKSB7XG4gICAgaWYgKGZsYWdzID09PSB2b2lkIDApIHsgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0OyB9XG4gICAgaWYgKHROb2RlKSB7XG4gICAgICAgIHZhciBibG9vbUhhc2ggPSBibG9vbUhhc2hCaXRPckZhY3RvcnkodG9rZW4pO1xuICAgICAgICAvLyBJZiB0aGUgSUQgc3RvcmVkIGhlcmUgaXMgYSBmdW5jdGlvbiwgdGhpcyBpcyBhIHNwZWNpYWwgb2JqZWN0IGxpa2UgRWxlbWVudFJlZiBvciBUZW1wbGF0ZVJlZlxuICAgICAgICAvLyBzbyBqdXN0IGNhbGwgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGl0LlxuICAgICAgICBpZiAodHlwZW9mIGJsb29tSGFzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIHNhdmVQcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICAgICAgICAgIHZhciBzYXZlTFZpZXcgPSBnZXRMVmlldygpO1xuICAgICAgICAgICAgc2V0VE5vZGVBbmRWaWV3RGF0YSh0Tm9kZSwgbFZpZXcpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBibG9vbUhhc2goKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHByb3ZpZGVyIGZvciBcIiArIHN0cmluZ2lmeUZvckVycm9yKHRva2VuKSArIFwiIVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRUTm9kZUFuZFZpZXdEYXRhKHNhdmVQcmV2aW91c09yUGFyZW50VE5vZGUsIHNhdmVMVmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGJsb29tSGFzaCA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKGJsb29tSGFzaCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBgLTFgIGlzIGEgc3BlY2lhbCB2YWx1ZSB1c2VkIHRvIGlkZW50aWZ5IGBJbmplY3RvcmAgdHlwZXMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGxWaWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZSB0b2tlbiBoYXMgYSBibG9vbSBoYXNoLCB0aGVuIGl0IGlzIGEgdG9rZW4gd2hpY2ggY291bGQgYmUgaW4gTm9kZUluamVjdG9yLlxuICAgICAgICAgICAgLy8gQSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIGluamVjdG9yIFRWaWV3IHRoYXQgd2FzIGZvdW5kIHdoaWxlIGNsaW1iaW5nIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAvLyBpbmplY3RvciB0cmVlLiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB2aWV3UHJvdmlkZXJzIGNhbiBiZSBhY2Nlc3NlZCBvbiB0aGUgY3VycmVudFxuICAgICAgICAgICAgLy8gaW5qZWN0b3IuXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNUVmlldyA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaW5qZWN0b3JJbmRleCA9IGdldEluamVjdG9ySW5kZXgodE5vZGUsIGxWaWV3KTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRMb2NhdGlvbiA9IE5PX1BBUkVOVF9JTkpFQ1RPUjtcbiAgICAgICAgICAgIHZhciBob3N0VEVsZW1lbnROb2RlID0gZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ID8gZmluZENvbXBvbmVudFZpZXcobFZpZXcpW1RfSE9TVF0gOiBudWxsO1xuICAgICAgICAgICAgLy8gSWYgd2Ugc2hvdWxkIHNraXAgdGhpcyBpbmplY3Rvciwgb3IgaWYgdGhlcmUgaXMgbm8gaW5qZWN0b3Igb24gdGhpcyBub2RlLCBzdGFydCBieVxuICAgICAgICAgICAgLy8gc2VhcmNoaW5nXG4gICAgICAgICAgICAvLyB0aGUgcGFyZW50IGluamVjdG9yLlxuICAgICAgICAgICAgaWYgKGluamVjdG9ySW5kZXggPT09IC0xIHx8IGZsYWdzICYgSW5qZWN0RmxhZ3MuU2tpcFNlbGYpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRMb2NhdGlvbiA9IGluamVjdG9ySW5kZXggPT09IC0xID8gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgbFZpZXcpIDpcbiAgICAgICAgICAgICAgICAgICAgbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTZWFyY2hQYXJlbnQoZmxhZ3MsIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1RWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGxWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCBsVmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIGluamVjdG9yIHRyZWUgdW50aWwgd2UgZmluZCBhIHBvdGVudGlhbCBtYXRjaCBvciB1bnRpbCB3ZSBrbm93IHRoZXJlXG4gICAgICAgICAgICAvLyAqaXNuJ3QqIGEgbWF0Y2guXG4gICAgICAgICAgICB3aGlsZSAoaW5qZWN0b3JJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRMb2NhdGlvbiA9IGxWaWV3W2luamVjdG9ySW5kZXggKyBQQVJFTlRfSU5KRUNUT1JdO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IGluamVjdG9yLiBJZiBpdCBtYXRjaGVzLCBzZWUgaWYgaXQgY29udGFpbnMgdG9rZW4uXG4gICAgICAgICAgICAgICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgICAgICAgICAgICAgIGlmIChibG9vbUhhc1Rva2VuKGJsb29tSGFzaCwgaW5qZWN0b3JJbmRleCwgdFZpZXcuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbiBpbmplY3RvciB3aGljaCAqbWF5KiBjb250YWluIHRoZSB0b2tlbiwgc28gd2Ugc3RlcCB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm92aWRlcnMgYW5kIGRpcmVjdGl2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbmplY3RvcidzIGNvcnJlc3BvbmRpbmcgbm9kZSB0byBnZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluc3RhbmNlLlxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBzZWFyY2hUb2tlbnNPbkluamVjdG9yKGluamVjdG9ySW5kZXgsIGxWaWV3LCB0b2tlbiwgcHJldmlvdXNUVmlldywgZmxhZ3MsIGhvc3RURWxlbWVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IE5PVF9GT1VORCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTZWFyY2hQYXJlbnQoZmxhZ3MsIGxWaWV3W1RWSUVXXS5kYXRhW2luamVjdG9ySW5kZXggKyBUTk9ERV0gPT09IGhvc3RURWxlbWVudE5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgIGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCBsVmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZiB3YXNuJ3QgZm91bmQgYW55d2hlcmUgb24gdGhpcyBub2RlLCBzbyBpdCB3YXMgYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIHRyZWUgYW5kIGNvbnRpbnVlIHNlYXJjaGluZy5cbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IHRWaWV3O1xuICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGxWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCBsVmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzaG91bGQgbm90IHNlYXJjaCBwYXJlbnQgT1IgSWYgdGhlIGFuY2VzdG9yIGJsb29tIGZpbHRlciB2YWx1ZSBkb2VzIG5vdCBoYXZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlIHdlIGNhbiBnaXZlIHVwIG9uIHRyYXZlcnNpbmcgdXAgdG8gZmluZCB0aGUgc3BlY2lmaWNcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5qZWN0b3IuXG4gICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwgJiYgbm90Rm91bmRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgb3IgdGhlIE51bGxJbmplY3RvciB3aWxsIHRocm93IGZvciBvcHRpb25hbCBkZXBzXG4gICAgICAgIG5vdEZvdW5kVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoKGZsYWdzICYgKEluamVjdEZsYWdzLlNlbGYgfCBJbmplY3RGbGFncy5Ib3N0KSkgPT09IDApIHtcbiAgICAgICAgdmFyIG1vZHVsZUluamVjdG9yID0gbFZpZXdbSU5KRUNUT1IkMV07XG4gICAgICAgIC8vIHN3aXRjaCB0byBgaW5qZWN0SW5qZWN0b3JPbmx5YCBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kdWxlIGluamVjdG9yLCBzaW5jZSBtb2R1bGUgaW5qZWN0b3JcbiAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXZlIGFjY2VzcyB0byBDb21wb25lbnQvRGlyZWN0aXZlIERJIHNjb3BlICh0aGF0IG1heSBoYXBwZW4gdGhyb3VnaFxuICAgICAgICAvLyBgZGlyZWN0aXZlSW5qZWN0YCBpbXBsZW1lbnRhdGlvbilcbiAgICAgICAgdmFyIHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbih1bmRlZmluZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG1vZHVsZUluamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldEluamVjdEltcGxlbWVudGF0aW9uKHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZUluamVjdG9yOiBOT1RfRk9VTkQgW1wiICsgc3RyaW5naWZ5Rm9yRXJyb3IodG9rZW4pICsgXCJdXCIpO1xuICAgIH1cbn1cbnZhciBOT1RfRk9VTkQgPSB7fTtcbmZ1bmN0aW9uIHNlYXJjaFRva2Vuc09uSW5qZWN0b3IoaW5qZWN0b3JJbmRleCwgbFZpZXcsIHRva2VuLCBwcmV2aW91c1RWaWV3LCBmbGFncywgaG9zdFRFbGVtZW50Tm9kZSkge1xuICAgIHZhciBjdXJyZW50VFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgdmFyIHROb2RlID0gY3VycmVudFRWaWV3LmRhdGFbaW5qZWN0b3JJbmRleCArIFROT0RFXTtcbiAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdmlldyBwcm92aWRlcnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBzdGFydGluZyBlbGVtZW50LlxuICAgIC8vIFRoZXJlIGFyZSB0d28gcG9zc2liaXRpZXNcbiAgICB2YXIgY2FuQWNjZXNzVmlld1Byb3ZpZGVycyA9IHByZXZpb3VzVFZpZXcgPT0gbnVsbCA/XG4gICAgICAgIC8vIDEpIFRoaXMgaXMgdGhlIGZpcnN0IGludm9jYXRpb24gYHByZXZpb3VzVFZpZXcgPT0gbnVsbGAgd2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUgYXQgdGhlXG4gICAgICAgIC8vIGBUTm9kZWAgb2Ygd2hlcmUgaW5qZWN0b3IgaXMgc3RhcnRpbmcgdG8gbG9vay4gSW4gc3VjaCBhIGNhc2UgdGhlIG9ubHkgdGltZSB3ZSBhcmUgYWxsb3dlZFxuICAgICAgICAvLyB0byBsb29rIGludG8gdGhlIFZpZXdQcm92aWRlcnMgaXMgaWY6XG4gICAgICAgIC8vIC0gd2UgYXJlIG9uIGEgY29tcG9uZW50XG4gICAgICAgIC8vIC0gQU5EIHRoZSBpbmplY3RvciBzZXQgYGluY2x1ZGVWaWV3UHJvdmlkZXJzYCB0byB0cnVlIChpbXBseWluZyB0aGF0IHRoZSB0b2tlbiBjYW4gc2VlXG4gICAgICAgIC8vIFZpZXdQcm92aWRlcnMgYmVjYXVzZSBpdCBpcyB0aGUgQ29tcG9uZW50IG9yIGEgU2VydmljZSB3aGljaCBpdHNlbGYgd2FzIGRlY2xhcmVkIGluXG4gICAgICAgIC8vIFZpZXdQcm92aWRlcnMpXG4gICAgICAgIChpc0NvbXBvbmVudCh0Tm9kZSkgJiYgaW5jbHVkZVZpZXdQcm92aWRlcnMpIDpcbiAgICAgICAgLy8gMikgYHByZXZpb3VzVFZpZXcgIT0gbnVsbGAgd2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUgbm93IHdhbGtpbmcgYWNyb3NzIHRoZSBwYXJlbnQgbm9kZXMuXG4gICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIHdlIGFyZSBvbmx5IGFsbG93ZWQgdG8gbG9vayBpbnRvIHRoZSBWaWV3UHJvdmlkZXJzIGlmOlxuICAgICAgICAvLyAtIFdlIGp1c3QgY3Jvc3NlZCBmcm9tIGNoaWxkIFZpZXcgdG8gUGFyZW50IFZpZXcgYHByZXZpb3VzVFZpZXcgIT0gY3VycmVudFRWaWV3YFxuICAgICAgICAvLyAtIEFORCB0aGUgcGFyZW50IFROb2RlIGlzIGFuIEVsZW1lbnQuXG4gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBqdXN0IGNhbWUgZnJvbSB0aGUgQ29tcG9uZW50J3MgVmlldyBhbmQgdGhlcmVmb3JlIGFyZSBhbGxvd2VkIHRvIHNlZVxuICAgICAgICAvLyBpbnRvIHRoZSBWaWV3UHJvdmlkZXJzLlxuICAgICAgICAocHJldmlvdXNUVmlldyAhPSBjdXJyZW50VFZpZXcgJiYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykpO1xuICAgIC8vIFRoaXMgc3BlY2lhbCBjYXNlIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhIEBob3N0IG9uIHRoZSBpbmplY3QgYW5kIHdoZW4gd2UgYXJlIHNlYXJjaGluZ1xuICAgIC8vIG9uIHRoZSBob3N0IGVsZW1lbnQgbm9kZS5cbiAgICB2YXIgaXNIb3N0U3BlY2lhbENhc2UgPSAoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0KSAmJiBob3N0VEVsZW1lbnROb2RlID09PSB0Tm9kZTtcbiAgICB2YXIgaW5qZWN0YWJsZUlkeCA9IGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIGxWaWV3LCB0b2tlbiwgY2FuQWNjZXNzVmlld1Byb3ZpZGVycywgaXNIb3N0U3BlY2lhbENhc2UpO1xuICAgIGlmIChpbmplY3RhYmxlSWR4ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXROb2RlSW5qZWN0YWJsZShjdXJyZW50VFZpZXcuZGF0YSwgbFZpZXcsIGluamVjdGFibGVJZHgsIHROb2RlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBOT1RfRk9VTkQ7XG4gICAgfVxufVxuLyoqXG4gKiBTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIHRva2VuIGFtb25nIHRoZSBub2RlJ3MgZGlyZWN0aXZlcyBhbmQgcHJvdmlkZXJzLlxuICpcbiAqIEBwYXJhbSB0Tm9kZSBUTm9kZSBvbiB3aGljaCBkaXJlY3RpdmVzIGFyZSBwcmVzZW50LlxuICogQHBhcmFtIGxWaWV3IFRoZSB2aWV3IHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZ1xuICogQHBhcmFtIHRva2VuIFByb3ZpZGVyIHRva2VuIG9yIHR5cGUgb2YgYSBkaXJlY3RpdmUgdG8gbG9vayBmb3IuXG4gKiBAcGFyYW0gY2FuQWNjZXNzVmlld1Byb3ZpZGVycyBXaGV0aGVyIHZpZXcgcHJvdmlkZXJzIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIGlzSG9zdFNwZWNpYWxDYXNlIFdoZXRoZXIgdGhlIGhvc3Qgc3BlY2lhbCBjYXNlIGFwcGxpZXMuXG4gKiBAcmV0dXJucyBJbmRleCBvZiBhIGZvdW5kIGRpcmVjdGl2ZSBvciBwcm92aWRlciwgb3IgbnVsbCB3aGVuIG5vbmUgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIGxWaWV3LCB0b2tlbiwgY2FuQWNjZXNzVmlld1Byb3ZpZGVycywgaXNIb3N0U3BlY2lhbENhc2UpIHtcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgdmFyIG5vZGVQcm92aWRlckluZGV4ZXMgPSB0Tm9kZS5wcm92aWRlckluZGV4ZXM7XG4gICAgdmFyIHRJbmplY3RhYmxlcyA9IHRWaWV3LmRhdGE7XG4gICAgdmFyIGluamVjdGFibGVzU3RhcnQgPSBub2RlUHJvdmlkZXJJbmRleGVzICYgNjU1MzUgLyogUHJvdmlkZXJzU3RhcnRJbmRleE1hc2sgKi87XG4gICAgdmFyIGRpcmVjdGl2ZXNTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgIHZhciBkaXJlY3RpdmVFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7XG4gICAgdmFyIGNwdFZpZXdQcm92aWRlcnNDb3VudCA9IG5vZGVQcm92aWRlckluZGV4ZXMgPj4gMTYgLyogQ3B0Vmlld1Byb3ZpZGVyc0NvdW50U2hpZnQgKi87XG4gICAgdmFyIHN0YXJ0aW5nSW5kZXggPSBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzID8gaW5qZWN0YWJsZXNTdGFydCA6IGluamVjdGFibGVzU3RhcnQgKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQ7XG4gICAgLy8gV2hlbiB0aGUgaG9zdCBzcGVjaWFsIGNhc2UgYXBwbGllcywgb25seSB0aGUgdmlld1Byb3ZpZGVycyBhbmQgdGhlIGNvbXBvbmVudCBhcmUgdmlzaWJsZVxuICAgIHZhciBlbmRJbmRleCA9IGlzSG9zdFNwZWNpYWxDYXNlID8gaW5qZWN0YWJsZXNTdGFydCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCA6IGRpcmVjdGl2ZUVuZDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRpbmdJbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIHByb3ZpZGVyVG9rZW5PckRlZiA9IHRJbmplY3RhYmxlc1tpXTtcbiAgICAgICAgaWYgKGkgPCBkaXJlY3RpdmVzU3RhcnQgJiYgdG9rZW4gPT09IHByb3ZpZGVyVG9rZW5PckRlZiB8fFxuICAgICAgICAgICAgaSA+PSBkaXJlY3RpdmVzU3RhcnQgJiYgcHJvdmlkZXJUb2tlbk9yRGVmLnR5cGUgPT09IHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNIb3N0U3BlY2lhbENhc2UpIHtcbiAgICAgICAgdmFyIGRpckRlZiA9IHRJbmplY3RhYmxlc1tkaXJlY3RpdmVzU3RhcnRdO1xuICAgICAgICBpZiAoZGlyRGVmICYmIGlzQ29tcG9uZW50RGVmKGRpckRlZikgJiYgZGlyRGVmLnR5cGUgPT09IHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlc1N0YXJ0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4qIFJldHJpZXZlIG9yIGluc3RhbnRpYXRlIHRoZSBpbmplY3RhYmxlIGZyb20gdGhlIGBsRGF0YWAgYXQgcGFydGljdWxhciBgaW5kZXhgLlxuKlxuKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gaW5zdGFudGlhdGVkIGFuZCBpZiBzbyByZXR1cm5zIHRoZVxuKiBjYWNoZWQgYGluamVjdGFibGVgLiBPdGhlcndpc2UgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSB2YWx1ZSBpcyBzdGlsbCBhIGZhY3RvcnkgaXRcbiogaW5zdGFudGlhdGVzIHRoZSBgaW5qZWN0YWJsZWAgYW5kIGNhY2hlcyB0aGUgdmFsdWUuXG4qL1xuZnVuY3Rpb24gZ2V0Tm9kZUluamVjdGFibGUodERhdGEsIGxEYXRhLCBpbmRleCwgdE5vZGUpIHtcbiAgICB2YXIgdmFsdWUgPSBsRGF0YVtpbmRleF07XG4gICAgaWYgKGlzRmFjdG9yeSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGZhY3RvcnkgPSB2YWx1ZTtcbiAgICAgICAgaWYgKGZhY3RvcnkucmVzb2x2aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWxhciBkZXAgZm9yIFwiICsgc3RyaW5naWZ5Rm9yRXJyb3IodERhdGFbaW5kZXhdKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZpb3VzSW5jbHVkZVZpZXdQcm92aWRlcnMgPSBzZXRJbmNsdWRlVmlld1Byb3ZpZGVycyhmYWN0b3J5LmNhblNlZVZpZXdQcm92aWRlcnMpO1xuICAgICAgICBmYWN0b3J5LnJlc29sdmluZyA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uID0gdm9pZCAwO1xuICAgICAgICBpZiAoZmFjdG9yeS5pbmplY3RJbXBsKSB7XG4gICAgICAgICAgICBwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uID0gc2V0SW5qZWN0SW1wbGVtZW50YXRpb24oZmFjdG9yeS5pbmplY3RJbXBsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2F2ZVByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgICAgICB2YXIgc2F2ZUxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICAgICAgc2V0VE5vZGVBbmRWaWV3RGF0YSh0Tm9kZSwgbERhdGEpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBsRGF0YVtpbmRleF0gPSBmYWN0b3J5LmZhY3RvcnkobnVsbCwgdERhdGEsIGxEYXRhLCB0Tm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZmFjdG9yeS5pbmplY3RJbXBsKVxuICAgICAgICAgICAgICAgIHNldEluamVjdEltcGxlbWVudGF0aW9uKHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24pO1xuICAgICAgICAgICAgc2V0SW5jbHVkZVZpZXdQcm92aWRlcnMocHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyk7XG4gICAgICAgICAgICBmYWN0b3J5LnJlc29sdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgc2V0VE5vZGVBbmRWaWV3RGF0YShzYXZlUHJldmlvdXNPclBhcmVudFROb2RlLCBzYXZlTFZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgYml0IGluIGFuIGluamVjdG9yJ3MgYmxvb20gZmlsdGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gKiB0aGUgZGlyZWN0aXZlIG1pZ2h0IGJlIHByb3ZpZGVkIGJ5IHRoZSBpbmplY3Rvci5cbiAqXG4gKiBXaGVuIGEgZGlyZWN0aXZlIGlzIHB1YmxpYywgaXQgaXMgYWRkZWQgdG8gdGhlIGJsb29tIGZpbHRlciBhbmQgZ2l2ZW4gYSB1bmlxdWUgSUQgdGhhdCBjYW4gYmVcbiAqIHJldHJpZXZlZCBvbiB0aGUgVHlwZS4gV2hlbiB0aGUgZGlyZWN0aXZlIGlzbid0IHB1YmxpYyBvciB0aGUgdG9rZW4gaXMgbm90IGEgZGlyZWN0aXZlIGBudWxsYFxuICogaXMgcmV0dXJuZWQgYXMgdGhlIG5vZGUgaW5qZWN0b3IgY2FuIG5vdCBwb3NzaWJseSBwcm92aWRlIHRoYXQgdG9rZW4uXG4gKlxuICogQHBhcmFtIHRva2VuIHRoZSBpbmplY3Rpb24gdG9rZW5cbiAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBiaXQgdG8gY2hlY2sgaW4gdGhlIGJsb29tIGZpbHRlciBvciBgbnVsbGAgaWYgdGhlIHRva2VuIGlzIG5vdCBrbm93bi5cbiAqICAgV2hlbiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgbmVnYXRpdmUgdGhlbiBpdCByZXByZXNlbnRzIHNwZWNpYWwgdmFsdWVzIHN1Y2ggYXMgYEluamVjdG9yYC5cbiAqL1xuZnVuY3Rpb24gYmxvb21IYXNoQml0T3JGYWN0b3J5KHRva2VuKSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodG9rZW4sICd0b2tlbiBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdG9rZW4uY2hhckNvZGVBdCgwKSB8fCAwO1xuICAgIH1cbiAgICB2YXIgdG9rZW5JZCA9IHRva2VuW05HX0VMRU1FTlRfSURdO1xuICAgIC8vIE5lZ2F0aXZlIHRva2VuIElEcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBvYmplY3RzIHN1Y2ggYXMgYEluamVjdG9yYFxuICAgIHJldHVybiAodHlwZW9mIHRva2VuSWQgPT09ICdudW1iZXInICYmIHRva2VuSWQgPiAwKSA/IHRva2VuSWQgJiBCTE9PTV9NQVNLIDogdG9rZW5JZDtcbn1cbmZ1bmN0aW9uIGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCBpbmplY3RvclZpZXcpIHtcbiAgICAvLyBDcmVhdGUgYSBtYXNrIHRoYXQgdGFyZ2V0cyB0aGUgc3BlY2lmaWMgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgIC8vIEpTIGJpdCBvcGVyYXRpb25zIGFyZSAzMiBiaXRzLCBzbyB0aGlzIHdpbGwgYmUgYSBudW1iZXIgYmV0d2VlbiAyXjAgYW5kIDJeMzEsIGNvcnJlc3BvbmRpbmdcbiAgICAvLyB0byBiaXQgcG9zaXRpb25zIDAgLSAzMSBpbiBhIDMyIGJpdCBpbnRlZ2VyLlxuICAgIHZhciBtYXNrID0gMSA8PCBibG9vbUhhc2g7XG4gICAgdmFyIGI3ID0gYmxvb21IYXNoICYgMHg4MDtcbiAgICB2YXIgYjYgPSBibG9vbUhhc2ggJiAweDQwO1xuICAgIHZhciBiNSA9IGJsb29tSGFzaCAmIDB4MjA7XG4gICAgLy8gT3VyIGJsb29tIGZpbHRlciBzaXplIGlzIDI1NiBiaXRzLCB3aGljaCBpcyBlaWdodCAzMi1iaXQgYmxvb20gZmlsdGVyIGJ1Y2tldHM6XG4gICAgLy8gYmYwID0gWzAgLSAzMV0sIGJmMSA9IFszMiAtIDYzXSwgYmYyID0gWzY0IC0gOTVdLCBiZjMgPSBbOTYgLSAxMjddLCBldGMuXG4gICAgLy8gR2V0IHRoZSBibG9vbSBmaWx0ZXIgdmFsdWUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgYnVja2V0IGJhc2VkIG9uIHRoZSBkaXJlY3RpdmUncyBibG9vbUJpdC5cbiAgICB2YXIgdmFsdWU7XG4gICAgaWYgKGI3KSB7XG4gICAgICAgIHZhbHVlID0gYjYgPyAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDddIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyA2XSkgOlxuICAgICAgICAgICAgKGI1ID8gaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyA1XSA6IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgNF0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBiNiA/IChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgM10gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDJdKSA6XG4gICAgICAgICAgICAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDFdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXhdKTtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGJsb29tIGZpbHRlciB2YWx1ZSBoYXMgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaXJlY3RpdmUncyBibG9vbUJpdCBmbGlwcGVkIG9uLFxuICAgIC8vIHRoaXMgaW5qZWN0b3IgaXMgYSBwb3RlbnRpYWwgbWF0Y2guXG4gICAgcmV0dXJuICEhKHZhbHVlICYgbWFzayk7XG59XG4vKiogUmV0dXJucyB0cnVlIGlmIGZsYWdzIHByZXZlbnQgcGFyZW50IGluamVjdG9yIGZyb20gYmVpbmcgc2VhcmNoZWQgZm9yIHRva2VucyAqL1xuZnVuY3Rpb24gc2hvdWxkU2VhcmNoUGFyZW50KGZsYWdzLCBpc0ZpcnN0SG9zdFROb2RlKSB7XG4gICAgcmV0dXJuICEoZmxhZ3MgJiBJbmplY3RGbGFncy5TZWxmKSAmJiAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuSG9zdCAmJiBpc0ZpcnN0SG9zdFROb2RlKTtcbn1cbnZhciBOb2RlSW5qZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9kZUluamVjdG9yKF90Tm9kZSwgX2xWaWV3KSB7XG4gICAgICAgIHRoaXMuX3ROb2RlID0gX3ROb2RlO1xuICAgICAgICB0aGlzLl9sVmlldyA9IF9sVmlldztcbiAgICB9XG4gICAgTm9kZUluamVjdG9yLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGdldE9yQ3JlYXRlSW5qZWN0YWJsZSh0aGlzLl90Tm9kZSwgdGhpcy5fbFZpZXcsIHRva2VuLCB1bmRlZmluZWQsIG5vdEZvdW5kVmFsdWUpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vZGVJbmplY3Rvcjtcbn0oKSk7XG4vKipcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVnZXRGYWN0b3J5T2YodHlwZSkge1xuICAgIHZhciB0eXBlQW55ID0gdHlwZTtcbiAgICB2YXIgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGVBbnkpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlQW55KSB8fFxuICAgICAgICBnZXRQaXBlRGVmKHR5cGVBbnkpIHx8IGdldEluamVjdGFibGVEZWYodHlwZUFueSkgfHwgZ2V0SW5qZWN0b3JEZWYodHlwZUFueSk7XG4gICAgaWYgKCFkZWYgfHwgZGVmLmZhY3RvcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGRlZi5mYWN0b3J5O1xufVxuLyoqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeSh0eXBlKSB7XG4gICAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHR5cGUucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgZmFjdG9yeSA9IMm1ybVnZXRGYWN0b3J5T2YocHJvdG8pO1xuICAgIGlmIChmYWN0b3J5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gZmFjdG9yeSBkZWZpbmVkLiBFaXRoZXIgdGhpcyB3YXMgaW1wcm9wZXIgdXNhZ2Ugb2YgaW5oZXJpdGFuY2VcbiAgICAgICAgLy8gKG5vIEFuZ3VsYXIgZGVjb3JhdG9yIG9uIHRoZSBzdXBlcmNsYXNzKSBvciB0aGVyZSBpcyBubyBjb25zdHJ1Y3RvciBhdCBhbGxcbiAgICAgICAgLy8gaW4gdGhlIGluaGVyaXRhbmNlIGNoYWluLiBTaW5jZSB0aGUgdHdvIGNhc2VzIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkLCB0aGVcbiAgICAgICAgLy8gbGF0dGVyIGhhcyB0byBiZSBhc3N1bWVkLlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsgcmV0dXJuIG5ldyB0KCk7IH07XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBnZXREZWJ1Z0NvbnRleHQoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3JbRVJST1JfREVCVUdfQ09OVEVYVF07XG59XG5mdW5jdGlvbiBnZXRPcmlnaW5hbEVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yW0VSUk9SX09SSUdJTkFMX0VSUk9SXTtcbn1cbmZ1bmN0aW9uIGdldEVycm9yTG9nZ2VyKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yW0VSUk9SX0xPR0dFUl0gfHwgZGVmYXVsdEVycm9yTG9nZ2VyO1xufVxuZnVuY3Rpb24gZGVmYXVsdEVycm9yTG9nZ2VyKGNvbnNvbGUpIHtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgdmFsdWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIF9fc3ByZWFkKHZhbHVlcykpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByb3ZpZGVzIGEgaG9vayBmb3IgY2VudHJhbGl6ZWQgZXhjZXB0aW9uIGhhbmRsaW5nLlxuICpcbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBFcnJvckhhbmRsZXJgIHByaW50cyBlcnJvciBtZXNzYWdlcyB0byB0aGUgYGNvbnNvbGVgLiBUb1xuICogaW50ZXJjZXB0IGVycm9yIGhhbmRsaW5nLCB3cml0ZSBhIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlciB0aGF0IHJlcGxhY2VzIHRoaXMgZGVmYXVsdCBhc1xuICogYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogY2xhc3MgTXlFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIge1xuICogICBoYW5kbGVFcnJvcihlcnJvcikge1xuICogICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBleGNlcHRpb25cbiAqICAgfVxuICogfVxuICpcbiAqIEBOZ01vZHVsZSh7XG4gKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBFcnJvckhhbmRsZXIsIHVzZUNsYXNzOiBNeUVycm9ySGFuZGxlcn1dXG4gKiB9KVxuICogY2xhc3MgTXlNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEVycm9ySGFuZGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFcnJvckhhbmRsZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2NvbnNvbGUgPSBjb25zb2xlO1xuICAgIH1cbiAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbEVycm9yID0gdGhpcy5fZmluZE9yaWdpbmFsRXJyb3IoZXJyb3IpO1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX2ZpbmRDb250ZXh0KGVycm9yKTtcbiAgICAgICAgLy8gTm90ZTogQnJvd3NlciBjb25zb2xlcyBzaG93IHRoZSBwbGFjZSBmcm9tIHdoZXJlIGNvbnNvbGUuZXJyb3Igd2FzIGNhbGxlZC5cbiAgICAgICAgLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGdpdmUgdXNlcnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuXG4gICAgICAgIHZhciBlcnJvckxvZ2dlciA9IGdldEVycm9yTG9nZ2VyKGVycm9yKTtcbiAgICAgICAgZXJyb3JMb2dnZXIodGhpcy5fY29uc29sZSwgXCJFUlJPUlwiLCBlcnJvcik7XG4gICAgICAgIGlmIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICBlcnJvckxvZ2dlcih0aGlzLl9jb25zb2xlLCBcIk9SSUdJTkFMIEVSUk9SXCIsIG9yaWdpbmFsRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICBlcnJvckxvZ2dlcih0aGlzLl9jb25zb2xlLCAnRVJST1IgQ09OVEVYVCcsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5fZmluZENvbnRleHQgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RGVidWdDb250ZXh0KGVycm9yKSA/IGdldERlYnVnQ29udGV4dChlcnJvcikgOlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRDb250ZXh0KGdldE9yaWdpbmFsRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLl9maW5kT3JpZ2luYWxFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICB2YXIgZSA9IGdldE9yaWdpbmFsRXJyb3IoZXJyb3IpO1xuICAgICAgICB3aGlsZSAoZSAmJiBnZXRPcmlnaW5hbEVycm9yKGUpKSB7XG4gICAgICAgICAgICBlID0gZ2V0T3JpZ2luYWxFcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICB9O1xuICAgIHJldHVybiBFcnJvckhhbmRsZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIERlZmluZXMgYSBzY2hlbWEgdGhhdCBhbGxvd3MgYW4gTmdNb2R1bGUgdG8gY29udGFpbiB0aGUgZm9sbG93aW5nOlxuICogLSBOb24tQW5ndWxhciBlbGVtZW50cyBuYW1lZCB3aXRoIGRhc2ggY2FzZSAoYC1gKS5cbiAqIC0gRWxlbWVudCBwcm9wZXJ0aWVzIG5hbWVkIHdpdGggZGFzaCBjYXNlIChgLWApLlxuICogRGFzaCBjYXNlIGlzIHRoZSBuYW1pbmcgY29udmVudGlvbiBmb3IgY3VzdG9tIGVsZW1lbnRzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgPSB7XG4gICAgbmFtZTogJ2N1c3RvbS1lbGVtZW50cydcbn07XG4vKipcbiAqIERlZmluZXMgYSBzY2hlbWEgdGhhdCBhbGxvd3MgYW55IHByb3BlcnR5IG9uIGFueSBlbGVtZW50LlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5PX0VSUk9SU19TQ0hFTUEgPSB7XG4gICAgbmFtZTogJ25vLWVycm9ycy1zY2hlbWEnXG59O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQlJBTkQgPSAnX19TQU5JVElaRVJfVFJVU1RFRF9CUkFORF9fJztcbmZ1bmN0aW9uIGFsbG93U2FuaXRpemF0aW9uQnlwYXNzKHZhbHVlLCB0eXBlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiB2YWx1ZVtCUkFORF0gPT09IHR5cGUpO1xufVxuLyoqXG4gKiBNYXJrIGBodG1sYCBzdHJpbmcgYXMgdHJ1c3RlZC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0XG4gKiByZWNvZ25pemFibGUgdG8ge0BsaW5rIGh0bWxTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS5cbiAqXG4gKiBAcGFyYW0gdHJ1c3RlZEh0bWwgYGh0bWxgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuXG4gKiBAcmV0dXJucyBhIGBodG1sYCBgU3RyaW5nYCB3aGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC5cbiAqL1xuZnVuY3Rpb24gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sKHRydXN0ZWRIdG1sKSB7XG4gICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U3RyaW5nKHRydXN0ZWRIdG1sLCBcIkh0bWxcIiAvKiBIdG1sICovKTtcbn1cbi8qKlxuICogTWFyayBgc3R5bGVgIHN0cmluZyBhcyB0cnVzdGVkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXRcbiAqIHJlY29nbml6YWJsZSB0byB7QGxpbmsgc3R5bGVTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS5cbiAqXG4gKiBAcGFyYW0gdHJ1c3RlZFN0eWxlIGBzdHlsZWAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC5cbiAqIEByZXR1cm5zIGEgYHN0eWxlYCBgU3RyaW5nYCB3aGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC5cbiAqL1xuZnVuY3Rpb24gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSh0cnVzdGVkU3R5bGUpIHtcbiAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHJpbmcodHJ1c3RlZFN0eWxlLCBcIlN0eWxlXCIgLyogU3R5bGUgKi8pO1xufVxuLyoqXG4gKiBNYXJrIGBzY3JpcHRgIHN0cmluZyBhcyB0cnVzdGVkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXRcbiAqIHJlY29nbml6YWJsZSB0byB7QGxpbmsgc2NyaXB0U2FuaXRpemVyfSB0byBiZSB0cnVzdGVkIGltcGxpY2l0bHkuXG4gKlxuICogQHBhcmFtIHRydXN0ZWRTY3JpcHQgYHNjcmlwdGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC5cbiAqIEByZXR1cm5zIGEgYHNjcmlwdGAgYFN0cmluZ2Agd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0KHRydXN0ZWRTY3JpcHQpIHtcbiAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHJpbmcodHJ1c3RlZFNjcmlwdCwgXCJTY3JpcHRcIiAvKiBTY3JpcHQgKi8pO1xufVxuLyoqXG4gKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXRcbiAqIHJlY29nbml6YWJsZSB0byB7QGxpbmsgdXJsU2FuaXRpemVyfSB0byBiZSB0cnVzdGVkIGltcGxpY2l0bHkuXG4gKlxuICogQHBhcmFtIHRydXN0ZWRVcmwgYHVybGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC5cbiAqIEByZXR1cm5zIGEgYHVybGAgYFN0cmluZ2Agd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0VXJsKHRydXN0ZWRVcmwpIHtcbiAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHJpbmcodHJ1c3RlZFVybCwgXCJVcmxcIiAvKiBVcmwgKi8pO1xufVxuLyoqXG4gKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXRcbiAqIHJlY29nbml6YWJsZSB0byB7QGxpbmsgcmVzb3VyY2VVcmxTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS5cbiAqXG4gKiBAcGFyYW0gdHJ1c3RlZFJlc291cmNlVXJsIGB1cmxgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuXG4gKiBAcmV0dXJucyBhIGB1cmxgIGBTdHJpbmdgIHdoaWNoIGhhcyBiZWVuIGJyYW5kZWQgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLlxuICovXG5mdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFJlc291cmNlVXJsKHRydXN0ZWRSZXNvdXJjZVVybCkge1xuICAgIHJldHVybiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFN0cmluZyh0cnVzdGVkUmVzb3VyY2VVcmwsIFwiUmVzb3VyY2VVcmxcIiAvKiBSZXNvdXJjZVVybCAqLyk7XG59XG5mdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFN0cmluZyh0cnVzdGVkU3RyaW5nLCBtb2RlKSB7XG4gICAgdmFyIHRydXN0ZWQgPSBuZXcgU3RyaW5nKHRydXN0ZWRTdHJpbmcpO1xuICAgIHRydXN0ZWRbQlJBTkRdID0gbW9kZTtcbiAgICByZXR1cm4gdHJ1c3RlZDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBjb250cm9sIGlmIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBwaXBlbGluZSBzaG91bGQgYmUgYFZpZXdFbmdpbmVgIG9yIGBJdnlgLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gYW5kIGRlYnVnIHRlc3RzIHdpdGggZWl0aGVyIEl2eSBvciBWaWV3IEVuZ2luZSAobGVnYWN5KSxcbiAqIHBsZWFzZSBzZWUgW0JBWkVMLm1kXSguL2RvY3MvQkFaRUwubWQpLlxuICovXG52YXIgX2Rldk1vZGUgPSB0cnVlO1xudmFyIF9ydW5Nb2RlTG9ja2VkID0gZmFsc2U7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBBbmd1bGFyIGlzIGluIGRldmVsb3BtZW50IG1vZGUuIEFmdGVyIGNhbGxlZCBvbmNlLFxuICogdGhlIHZhbHVlIGlzIGxvY2tlZCBhbmQgd29uJ3QgY2hhbmdlIGFueSBtb3JlLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdHJ1ZSwgdW5sZXNzIGEgdXNlciBjYWxscyBgZW5hYmxlUHJvZE1vZGVgIGJlZm9yZSBjYWxsaW5nIHRoaXMuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBpc0Rldk1vZGUoKSB7XG4gICAgX3J1bk1vZGVMb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiBfZGV2TW9kZTtcbn1cbi8qKlxuICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyXG4gKiBjaGVja3Mgd2l0aGluIHRoZSBmcmFtZXdvcmsuXG4gKlxuICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzXG4gKiBkb2VzIG5vdCByZXN1bHQgaW4gYWRkaXRpb25hbCBjaGFuZ2VzIHRvIGFueSBiaW5kaW5ncyAoYWxzbyBrbm93biBhc1xuICogdW5pZGlyZWN0aW9uYWwgZGF0YSBmbG93KS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkge1xuICAgIGlmIChfcnVuTW9kZUxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBlbmFibGUgcHJvZCBtb2RlIGFmdGVyIHBsYXRmb3JtIHNldHVwLicpO1xuICAgIH1cbiAgICBfZGV2TW9kZSA9IGZhbHNlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IGhvbGQgb2YgYW4gaW5lcnQgdHJlZSBvZiBET00gZWxlbWVudHMgY29udGFpbmluZyBkaXJ0eSBIVE1MXG4gKiB0aGF0IG5lZWRzIHNhbml0aXppbmcuXG4gKiBEZXBlbmRpbmcgdXBvbiBicm93c2VyIHN1cHBvcnQgd2UgbXVzdCB1c2Ugb25lIG9mIHRocmVlIHN0cmF0ZWdpZXMgZm9yIGRvaW5nIHRoaXMuXG4gKiBTdXBwb3J0OiBTYWZhcmkgMTAueCAtPiBYSFIgc3RyYXRlZ3lcbiAqIFN1cHBvcnQ6IEZpcmVmb3ggLT4gRG9tUGFyc2VyIHN0cmF0ZWd5XG4gKiBEZWZhdWx0OiBJbmVydERvY3VtZW50IHN0cmF0ZWd5XG4gKi9cbnZhciBJbmVydEJvZHlIZWxwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5lcnRCb2R5SGVscGVyKGRlZmF1bHREb2MpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0RG9jID0gZGVmYXVsdERvYztcbiAgICAgICAgdGhpcy5pbmVydERvY3VtZW50ID0gdGhpcy5kZWZhdWx0RG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnc2FuaXRpemF0aW9uLWluZXJ0Jyk7XG4gICAgICAgIHRoaXMuaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5ib2R5O1xuICAgICAgICBpZiAodGhpcy5pbmVydEJvZHlFbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHVzdWFsbHkgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGJvZHkgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQsIGJ1dCBJRSBkb2Vzbid0IGhhdmUgYW55LCBzb1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgb25lLlxuICAgICAgICAgICAgdmFyIGluZXJ0SHRtbCA9IHRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdodG1sJyk7XG4gICAgICAgICAgICB0aGlzLmluZXJ0RG9jdW1lbnQuYXBwZW5kQ2hpbGQoaW5lcnRIdG1sKTtcbiAgICAgICAgICAgIHRoaXMuaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgICAgICAgICBpbmVydEh0bWwuYXBwZW5kQ2hpbGQodGhpcy5pbmVydEJvZHlFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZXJ0Qm9keUVsZW1lbnQuaW5uZXJIVE1MID0gJzxzdmc+PGcgb25sb2FkPVwidGhpcy5wYXJlbnROb2RlLnJlbW92ZSgpXCI+PC9nPjwvc3ZnPic7XG4gICAgICAgIGlmICh0aGlzLmluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiAhdGhpcy5pbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpKSB7XG4gICAgICAgICAgICAvLyBXZSBqdXN0IGhpdCB0aGUgU2FmYXJpIDEwLjEgYnVnIC0gd2hpY2ggYWxsb3dzIEpTIHRvIHJ1biBpbnNpZGUgdGhlIFNWRyBHIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIHNvIHVzZSB0aGUgWEhSIHN0cmF0ZWd5LlxuICAgICAgICAgICAgdGhpcy5nZXRJbmVydEJvZHlFbGVtZW50ID0gdGhpcy5nZXRJbmVydEJvZHlFbGVtZW50X1hIUjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZXJ0Qm9keUVsZW1lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8c3ZnPjxwPjxzdHlsZT48aW1nIHNyYz1cIjwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpLy9cIj4nO1xuICAgICAgICBpZiAodGhpcy5pbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IgJiYgdGhpcy5pbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZyBpbWcnKSkge1xuICAgICAgICAgICAgLy8gV2UganVzdCBoaXQgdGhlIEZpcmVmb3ggYnVnIC0gd2hpY2ggcHJldmVudHMgdGhlIGlubmVyIGltZyBKUyBmcm9tIGJlaW5nIHNhbml0aXplZFxuICAgICAgICAgICAgLy8gc28gdXNlIHRoZSBET01QYXJzZXIgc3RyYXRlZ3ksIGlmIGl0IGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIC8vIElmIHRoZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHdlIGFyZSBub3QgaW4gRmlyZWZveCAoU2VydmVyL1dlYldvcmtlcj8pIHNvIHdlXG4gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgc3RyYXRlZ3kgYmVsb3cuXG4gICAgICAgICAgICBpZiAoaXNET01QYXJzZXJBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9ET01QYXJzZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vbmUgb2YgdGhlIGJ1Z3Mgd2VyZSBoaXQgc28gaXQgaXMgc2FmZSBmb3IgdXMgdG8gdXNlIHRoZSBkZWZhdWx0IEluZXJ0RG9jdW1lbnQgc3RyYXRlZ3lcbiAgICAgICAgdGhpcy5nZXRJbmVydEJvZHlFbGVtZW50ID0gdGhpcy5nZXRJbmVydEJvZHlFbGVtZW50X0luZXJ0RG9jdW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVzZSBYSFIgdG8gY3JlYXRlIGFuZCBmaWxsIGFuIGluZXJ0IGJvZHkgZWxlbWVudCAob24gU2FmYXJpIDEwLjEpXG4gICAgICogU2VlXG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL2N1cmU1My9ET01QdXJpZnkvYmxvYi9hOTkyZDNhNzUwMzFjYjhiYjAzMmU1ZWE4Mzk5YmE5NzJiZGY5YTY1L3NyYy9wdXJpZnkuanMjTDQzOS1MNDQ5XG4gICAgICovXG4gICAgSW5lcnRCb2R5SGVscGVyLnByb3RvdHlwZS5nZXRJbmVydEJvZHlFbGVtZW50X1hIUiA9IGZ1bmN0aW9uIChodG1sKSB7XG4gICAgICAgIC8vIFdlIGFkZCB0aGVzZSBleHRyYSBlbGVtZW50cyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29udGVudCBpcyBwYXJzZWQgYXMgZXhwZWN0ZWRcbiAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGVcbiAgICAgICAgLy8gYDxoZWFkPmAgdGFnLlxuICAgICAgICBodG1sID0gJzxib2R5PjxyZW1vdmU+PC9yZW1vdmU+JyArIGh0bWwgKyAnPC9ib2R5Pic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBodG1sID0gZW5jb2RlVVJJKGh0bWwpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsICdkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04LCcgKyBodG1sLCBmYWxzZSk7XG4gICAgICAgIHhoci5zZW5kKHVuZGVmaW5lZCk7XG4gICAgICAgIHZhciBib2R5ID0geGhyLnJlc3BvbnNlLmJvZHk7XG4gICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYm9keS5maXJzdENoaWxkKTtcbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVc2UgRE9NUGFyc2VyIHRvIGNyZWF0ZSBhbmQgZmlsbCBhbiBpbmVydCBib2R5IGVsZW1lbnQgKG9uIEZpcmVmb3gpXG4gICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L3JlbGVhc2VzL3RhZy8wLjYuN1xuICAgICAqXG4gICAgICovXG4gICAgSW5lcnRCb2R5SGVscGVyLnByb3RvdHlwZS5nZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlciA9IGZ1bmN0aW9uIChodG1sKSB7XG4gICAgICAgIC8vIFdlIGFkZCB0aGVzZSBleHRyYSBlbGVtZW50cyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29udGVudCBpcyBwYXJzZWQgYXMgZXhwZWN0ZWRcbiAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGVcbiAgICAgICAgLy8gYDxoZWFkPmAgdGFnLlxuICAgICAgICBodG1sID0gJzxib2R5PjxyZW1vdmU+PC9yZW1vdmU+JyArIGh0bWwgKyAnPC9ib2R5Pic7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYm9keSA9IG5ldyB3aW5kb3dcbiAgICAgICAgICAgICAgICAuRE9NUGFyc2VyKClcbiAgICAgICAgICAgICAgICAucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKVxuICAgICAgICAgICAgICAgIC5ib2R5O1xuICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZChib2R5LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogVXNlIGFuIEhUTUw1IGB0ZW1wbGF0ZWAgZWxlbWVudCwgaWYgc3VwcG9ydGVkLCBvciBhbiBpbmVydCBib2R5IGVsZW1lbnQgY3JlYXRlZCB2aWFcbiAgICAgKiBgY3JlYXRlSHRtbERvY3VtZW50YCB0byBjcmVhdGUgYW5kIGZpbGwgYW4gaW5lcnQgRE9NIGVsZW1lbnQuXG4gICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzYW5lIHN0cmF0ZWd5IHRvIHVzZSBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCByZXF1aXJlIG9uZSBvZiB0aGUgc3BlY2lhbGlzZWRcbiAgICAgKiBzdHJhdGVnaWVzIGFib3ZlLlxuICAgICAqL1xuICAgIEluZXJ0Qm9keUhlbHBlci5wcm90b3R5cGUuZ2V0SW5lcnRCb2R5RWxlbWVudF9JbmVydERvY3VtZW50ID0gZnVuY3Rpb24gKGh0bWwpIHtcbiAgICAgICAgLy8gUHJlZmVyIHVzaW5nIDx0ZW1wbGF0ZT4gZWxlbWVudCBpZiBzdXBwb3J0ZWQuXG4gICAgICAgIHZhciB0ZW1wbGF0ZUVsID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgIGlmICgnY29udGVudCcgaW4gdGVtcGxhdGVFbCkge1xuICAgICAgICAgICAgdGVtcGxhdGVFbC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRWw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmVydEJvZHlFbGVtZW50LmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seVxuICAgICAgICAvLyBzdHJpcCBjdXN0b20tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIG9uIElFPD0xMVxuICAgICAgICBpZiAodGhpcy5kZWZhdWx0RG9jLmRvY3VtZW50TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnModGhpcy5pbmVydEJvZHlFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbmVydEJvZHlFbGVtZW50O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV2hlbiBJRTktMTEgY29tZXMgYWNyb3NzIGFuIHVua25vd24gbmFtZXNwYWNlZCBhdHRyaWJ1dGUgZS5nLiAneGxpbms6Zm9vJyBpdCBhZGRzICd4bWxuczpuczEnXG4gICAgICogYXR0cmlidXRlIHRvIGRlY2xhcmUgbnMxIG5hbWVzcGFjZSBhbmQgcHJlZml4ZXMgdGhlIGF0dHJpYnV0ZSB3aXRoICduczEnIChlLmcuXG4gICAgICogJ25zMTp4bGluazpmb28nKS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdW5kZXNpcmFibGUgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyBhbnkgb2YgdGhlc2UgY3VzdG9tIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kXG4gICAgICogc3RyaXBzIHRoZW0gYWxsLlxuICAgICAqL1xuICAgIEluZXJ0Qm9keUhlbHBlci5wcm90b3R5cGUuc3RyaXBDdXN0b21Oc0F0dHJzID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciBlbEF0dHJzID0gZWwuYXR0cmlidXRlcztcbiAgICAgICAgLy8gbG9vcCBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCByZW1vdmFscy5cbiAgICAgICAgZm9yICh2YXIgaSA9IGVsQXR0cnMubGVuZ3RoIC0gMTsgMCA8IGk7IGktLSkge1xuICAgICAgICAgICAgdmFyIGF0dHJpYiA9IGVsQXR0cnMuaXRlbShpKTtcbiAgICAgICAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJpYi5uYW1lO1xuICAgICAgICAgICAgaWYgKGF0dHJOYW1lID09PSAneG1sbnM6bnMxJyB8fCBhdHRyTmFtZS5pbmRleE9mKCduczE6JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSlcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmlwQ3VzdG9tTnNBdHRycyhjaGlsZE5vZGUpO1xuICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSW5lcnRCb2R5SGVscGVyO1xufSgpKTtcbi8qKlxuICogV2UgbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgRE9NUGFyc2VyIGV4aXN0cyBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG4gKiBUaGUgdHJ5LWNhdGNoIGlzIGJlY2F1c2UsIG9uIHNvbWUgYnJvd3NlcnMsIHRyeWluZyB0byBhY2Nlc3MgdGhpcyBwcm9wZXJ0eVxuICogb24gd2luZG93IGNhbiBhY3R1YWxseSB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAc3VwcHJlc3Mge3VzZWxlc3NDb2RlfVxuICovXG5mdW5jdGlvbiBpc0RPTVBhcnNlckF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gISF3aW5kb3cuRE9NUGFyc2VyO1xuICAgIH1cbiAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIGEgY29tbW9ubHkgdXNlZnVsIHN1YnNldCBvZiBVUkxzIHRoYXQgYXJlIHNhZmUuXG4gKlxuICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBhIHN1YnNldCBvZiBVUkxzIHRoYXQgd2lsbCBub3QgY2F1c2Ugc2NyaXB0XG4gKiBleGVjdXRpb24gaWYgdXNlZCBpbiBVUkwgY29udGV4dCB3aXRoaW4gYSBIVE1MIGRvY3VtZW50LiBTcGVjaWZpY2FsbHksIHRoaXNcbiAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGlmIChjb21tZW50IGZyb20gaGVyZSBvbiBhbmQgcmVnZXggY29waWVkIGZyb21cbiAqIFNveSdzIEVzY2FwaW5nQ29udmVudGlvbnMpOlxuICogKDEpIEVpdGhlciBhbiBhbGxvd2VkIHByb3RvY29sIChodHRwLCBodHRwcywgbWFpbHRvIG9yIGZ0cCkuXG4gKiAoMikgb3Igbm8gcHJvdG9jb2wuICBBIHByb3RvY29sIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjb2xvbi4gVGhlIGJlbG93XG4gKiAgICAgYWxsb3dzIHRoYXQgYnkgYWxsb3dpbmcgY29sb25zIG9ubHkgYWZ0ZXIgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIFsvPyNdLlxuICogICAgIEEgY29sb24gYWZ0ZXIgYSBoYXNoICgjKSBtdXN0IGJlIGluIHRoZSBmcmFnbWVudC5cbiAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSAoPykgbXVzdCBiZSBpbiBhIHF1ZXJ5LlxuICogICAgIE90aGVyd2lzZSwgYSBjb2xvbiBhZnRlciBhIHNpbmdsZSBzb2xpZHVzICgvKSBtdXN0IGJlIGluIGEgcGF0aC5cbiAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSBkb3VibGUgc29saWR1cyAoLy8pIG11c3QgYmUgaW4gdGhlIGF1dGhvcml0eVxuICogICAgIChiZWZvcmUgcG9ydCkuXG4gKlxuICogVGhlIHBhdHRlcm4gZGlzYWxsb3dzICYsIHVzZWQgaW4gSFRNTCBlbnRpdHkgZGVjbGFyYXRpb25zIGJlZm9yZVxuICogb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIFsvPyNdLiBUaGlzIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIHVzZWQgaW4gdGhlXG4gKiBwcm90b2NvbCBuYW1lLCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBlLmcuIFwiaCYjMTE2O3RwXCIgZm9yIFwiaHR0cFwiLlxuICogSXQgYWxzbyBkaXNhbGxvd3MgSFRNTCBlbnRpdGllcyBpbiB0aGUgZmlyc3QgcGF0aCBwYXJ0IG9mIGEgcmVsYXRpdmUgcGF0aCxcbiAqIGUuZy4gXCJmb28mbHQ7YmFyL2JhelwiLiAgT3VyIGV4aXN0aW5nIGVzY2FwaW5nIGZ1bmN0aW9ucyBzaG91bGQgbm90IHByb2R1Y2VcbiAqIHRoYXQuIE1vcmUgaW1wb3J0YW50bHksIGl0IGRpc2FsbG93cyBtYXNraW5nIG9mIGEgY29sb24sXG4gKiBlLmcuIFwiamF2YXNjcmlwdCYjNTg7Li4uXCIuXG4gKlxuICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuXG4gKi9cbnZhciBTQUZFX1VSTF9QQVRURVJOID0gL14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteJjovPyNdKig/OlsvPyNdfCQpKS9naTtcbi8qKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy4gKi9cbnZhciBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXFwvKD86Ym1wfGdpZnxqcGVnfGpwZ3xwbmd8dGlmZnx3ZWJwKXx2aWRlb1xcLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1xcLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcXC9dKz0qJC9pO1xuZnVuY3Rpb24gX3Nhbml0aXplVXJsKHVybCkge1xuICAgIHVybCA9IFN0cmluZyh1cmwpO1xuICAgIGlmICh1cmwubWF0Y2goU0FGRV9VUkxfUEFUVEVSTikgfHwgdXJsLm1hdGNoKERBVEFfVVJMX1BBVFRFUk4pKVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBVUkwgdmFsdWUgXCIgKyB1cmwgKyBcIiAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylcIik7XG4gICAgfVxuICAgIHJldHVybiAndW5zYWZlOicgKyB1cmw7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVNyY3NldChzcmNzZXQpIHtcbiAgICBzcmNzZXQgPSBTdHJpbmcoc3Jjc2V0KTtcbiAgICByZXR1cm4gc3Jjc2V0LnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChzcmNzZXQpIHsgcmV0dXJuIF9zYW5pdGl6ZVVybChzcmNzZXQudHJpbSgpKTsgfSkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gdGFnU2V0KHRhZ3MpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICB2YXIgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0YWdzLnNwbGl0KCcsJykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgdCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgcmVzW3RdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIG1lcmdlKCkge1xuICAgIHZhciBlXzIsIF9hO1xuICAgIHZhciBzZXRzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgc2V0c1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgcmVzID0ge307XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgc2V0c18xID0gX192YWx1ZXMoc2V0cyksIHNldHNfMV8xID0gc2V0c18xLm5leHQoKTsgIXNldHNfMV8xLmRvbmU7IHNldHNfMV8xID0gc2V0c18xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIHMgPSBzZXRzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIHYgaW4gcykge1xuICAgICAgICAgICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KHYpKVxuICAgICAgICAgICAgICAgICAgICByZXNbdl0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2V0c18xXzEgJiYgIXNldHNfMV8xLmRvbmUgJiYgKF9hID0gc2V0c18xLnJldHVybikpIF9hLmNhbGwoc2V0c18xKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzXG4vLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjc2VtYW50aWNzXG4vLyBodHRwOi8vc2ltb24uaHRtbDUub3JnL2h0bWwtZWxlbWVudHNcbi8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1XG4vLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjdm9pZC1lbGVtZW50c1xudmFyIFZPSURfRUxFTUVOVFMgPSB0YWdTZXQoJ2FyZWEsYnIsY29sLGhyLGltZyx3YnInKTtcbi8vIEVsZW1lbnRzIHRoYXQgeW91IGNhbiwgaW50ZW50aW9uYWxseSwgbGVhdmUgb3BlbiAoYW5kIHdoaWNoIGNsb3NlIHRoZW1zZWx2ZXMpXG4vLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjb3B0aW9uYWwtdGFnc1xudmFyIE9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMgPSB0YWdTZXQoJ2NvbGdyb3VwLGRkLGR0LGxpLHAsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHInKTtcbnZhciBPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyA9IHRhZ1NldCgncnAscnQnKTtcbnZhciBPUFRJT05BTF9FTkRfVEFHX0VMRU1FTlRTID0gbWVyZ2UoT1BUSU9OQUxfRU5EX1RBR19JTkxJTkVfRUxFTUVOVFMsIE9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMpO1xuLy8gU2FmZSBCbG9jayBFbGVtZW50cyAtIEhUTUw1XG52YXIgQkxPQ0tfRUxFTUVOVFMgPSBtZXJnZShPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTLCB0YWdTZXQoJ2FkZHJlc3MsYXJ0aWNsZSwnICtcbiAgICAnYXNpZGUsYmxvY2txdW90ZSxjYXB0aW9uLGNlbnRlcixkZWwsZGV0YWlscyxkaWFsb2csZGlyLGRpdixkbCxmaWd1cmUsZmlnY2FwdGlvbixmb290ZXIsaDEsaDIsaDMsaDQsaDUsJyArXG4gICAgJ2g2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1haW4sbWFwLG1lbnUsbmF2LG9sLHByZSxzZWN0aW9uLHN1bW1hcnksdGFibGUsdWwnKSk7XG4vLyBJbmxpbmUgRWxlbWVudHMgLSBIVE1MNVxudmFyIElOTElORV9FTEVNRU5UUyA9IG1lcmdlKE9QVElPTkFMX0VORF9UQUdfSU5MSU5FX0VMRU1FTlRTLCB0YWdTZXQoJ2EsYWJicixhY3JvbnltLGF1ZGlvLGIsJyArXG4gICAgJ2JkaSxiZG8sYmlnLGJyLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpbWcsaW5zLGtiZCxsYWJlbCxtYXAsbWFyayxwaWN0dXJlLHEscnVieSxycCxydCxzLCcgK1xuICAgICdzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvJykpO1xudmFyIFZBTElEX0VMRU1FTlRTID0gbWVyZ2UoVk9JRF9FTEVNRU5UUywgQkxPQ0tfRUxFTUVOVFMsIElOTElORV9FTEVNRU5UUywgT1BUSU9OQUxfRU5EX1RBR19FTEVNRU5UUyk7XG4vLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBocmVmIGFuZCBoZW5jZSBuZWVkIHRvIGJlIHNhbml0aXplZFxudmFyIFVSSV9BVFRSUyA9IHRhZ1NldCgnYmFja2dyb3VuZCxjaXRlLGhyZWYsaXRlbXR5cGUsbG9uZ2Rlc2MscG9zdGVyLHNyYyx4bGluazpocmVmJyk7XG4vLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBzcGVjaWFsIGhyZWYgc2V0IGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkXG52YXIgU1JDU0VUX0FUVFJTID0gdGFnU2V0KCdzcmNzZXQnKTtcbnZhciBIVE1MX0FUVFJTID0gdGFnU2V0KCdhYmJyLGFjY2Vzc2tleSxhbGlnbixhbHQsYXV0b3BsYXksYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sJyArXG4gICAgJ2NvbXBhY3QsY29udHJvbHMsY29vcmRzLGRhdGV0aW1lLGRlZmF1bHQsZGlyLGRvd25sb2FkLGZhY2UsaGVhZGVycyxoZWlnaHQsaGlkZGVuLGhyZWZsYW5nLGhzcGFjZSwnICtcbiAgICAnaXNtYXAsaXRlbXNjb3BlLGl0ZW1wcm9wLGtpbmQsbGFiZWwsbGFuZyxsYW5ndWFnZSxsb29wLG1lZGlhLG11dGVkLG5vaHJlZixub3dyYXAsb3BlbixwcmVsb2FkLHJlbCxyZXYscm9sZSxyb3dzLHJvd3NwYW4scnVsZXMsJyArXG4gICAgJ3Njb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNpemVzLHNwYW4sc3JjbGFuZyxzdGFydCxzdW1tYXJ5LHRhYmluZGV4LHRhcmdldCx0aXRsZSx0cmFuc2xhdGUsdHlwZSx1c2VtYXAsJyArXG4gICAgJ3ZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgnKTtcbi8vIEFjY2Vzc2liaWxpdHkgYXR0cmlidXRlcyBhcyBwZXIgV0FJLUFSSUEgMS4xIChXM0MgV29ya2luZyBEcmFmdCAxNCBEZWNlbWJlciAyMDE4KVxudmFyIEFSSUFfQVRUUlMgPSB0YWdTZXQoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCxhcmlhLWF0b21pYyxhcmlhLWF1dG9jb21wbGV0ZSxhcmlhLWJ1c3ksYXJpYS1jaGVja2VkLGFyaWEtY29sY291bnQsYXJpYS1jb2xpbmRleCwnICtcbiAgICAnYXJpYS1jb2xzcGFuLGFyaWEtY29udHJvbHMsYXJpYS1jdXJyZW50LGFyaWEtZGVzY3JpYmVkYnksYXJpYS1kZXRhaWxzLGFyaWEtZGlzYWJsZWQsYXJpYS1kcm9wZWZmZWN0LCcgK1xuICAgICdhcmlhLWVycm9ybWVzc2FnZSxhcmlhLWV4cGFuZGVkLGFyaWEtZmxvd3RvLGFyaWEtZ3JhYmJlZCxhcmlhLWhhc3BvcHVwLGFyaWEtaGlkZGVuLGFyaWEtaW52YWxpZCwnICtcbiAgICAnYXJpYS1rZXlzaG9ydGN1dHMsYXJpYS1sYWJlbCxhcmlhLWxhYmVsbGVkYnksYXJpYS1sZXZlbCxhcmlhLWxpdmUsYXJpYS1tb2RhbCxhcmlhLW11bHRpbGluZSwnICtcbiAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUsYXJpYS1vcmllbnRhdGlvbixhcmlhLW93bnMsYXJpYS1wbGFjZWhvbGRlcixhcmlhLXBvc2luc2V0LGFyaWEtcHJlc3NlZCxhcmlhLXJlYWRvbmx5LCcgK1xuICAgICdhcmlhLXJlbGV2YW50LGFyaWEtcmVxdWlyZWQsYXJpYS1yb2xlZGVzY3JpcHRpb24sYXJpYS1yb3djb3VudCxhcmlhLXJvd2luZGV4LGFyaWEtcm93c3BhbixhcmlhLXNlbGVjdGVkLCcgK1xuICAgICdhcmlhLXNldHNpemUsYXJpYS1zb3J0LGFyaWEtdmFsdWVtYXgsYXJpYS12YWx1ZW1pbixhcmlhLXZhbHVlbm93LGFyaWEtdmFsdWV0ZXh0Jyk7XG4vLyBOQjogVGhpcyBjdXJyZW50bHkgY29uc2Npb3VzbHkgZG9lc24ndCBzdXBwb3J0IFNWRy4gU1ZHIHNhbml0aXphdGlvbiBoYXMgaGFkIHNldmVyYWwgc2VjdXJpdHlcbi8vIGlzc3VlcyBpbiB0aGUgcGFzdCwgc28gaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUgaXQgb3V0IGlmIHBvc3NpYmxlLiBJZiBzdXBwb3J0IGZvciBiaW5kaW5nIFNWRyB2aWFcbi8vIGlubmVySFRNTCBpcyByZXF1aXJlZCwgU1ZHIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGFkZGVkIGhlcmUuXG4vLyBOQjogU2FuaXRpemF0aW9uIGRvZXMgbm90IGFsbG93IDxmb3JtPiBlbGVtZW50cyBvciBvdGhlciBhY3RpdmUgZWxlbWVudHMgKDxidXR0b24+IGV0YykuIFRob3NlXG4vLyBjYW4gYmUgc2FuaXRpemVkLCBidXQgdGhleSBpbmNyZWFzZSBzZWN1cml0eSBzdXJmYWNlIGFyZWEgd2l0aG91dCBhIGxlZ2l0aW1hdGUgdXNlIGNhc2UsIHNvIHRoZXlcbi8vIGFyZSBsZWZ0IG91dCBoZXJlLlxudmFyIFZBTElEX0FUVFJTID0gbWVyZ2UoVVJJX0FUVFJTLCBTUkNTRVRfQVRUUlMsIEhUTUxfQVRUUlMsIEFSSUFfQVRUUlMpO1xuLy8gRWxlbWVudHMgd2hvc2UgY29udGVudCBzaG91bGQgbm90IGJlIHRyYXZlcnNlZC9wcmVzZXJ2ZWQsIGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBpbnZhbGlkLlxuLy9cbi8vIFR5cGljYWxseSwgYDxpbnZhbGlkPlNvbWUgY29udGVudDwvaW52YWxpZD5gIHdvdWxkIHRyYXZlcnNlIChhbmQgaW4gdGhpcyBjYXNlIHByZXNlcnZlKVxuLy8gYFNvbWUgY29udGVudGAsIGJ1dCBzdHJpcCBgaW52YWxpZC1lbGVtZW50YCBvcGVuaW5nL2Nsb3NpbmcgdGFncy4gRm9yIHNvbWUgZWxlbWVudHMsIHRob3VnaCwgd2Vcbi8vIGRvbid0IHdhbnQgdG8gcHJlc2VydmUgdGhlIGNvbnRlbnQsIGlmIHRoZSBlbGVtZW50cyB0aGVtc2VsdmVzIGFyZSBnb2luZyB0byBiZSByZW1vdmVkLlxudmFyIFNLSVBfVFJBVkVSU0lOR19DT05URU5UX0lGX0lOVkFMSURfRUxFTUVOVFMgPSB0YWdTZXQoJ3NjcmlwdCxzdHlsZSx0ZW1wbGF0ZScpO1xuLyoqXG4gKiBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcyBhIERPTSBmcmFnbWVudCwgc3RyaXBwaW5nIG91dCBhbnkgdW5zYWZlIGVsZW1lbnRzIGFuZCB1bnNhZmVcbiAqIGF0dHJpYnV0ZXMuXG4gKi9cbnZhciBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyKCkge1xuICAgICAgICAvLyBFeHBsaWNpdGx5IHRyYWNrIGlmIHNvbWV0aGluZyB3YXMgc3RyaXBwZWQsIHRvIGF2b2lkIGFjY2lkZW50YWxseSB3YXJuaW5nIG9mIHNhbml0aXphdGlvbiBqdXN0XG4gICAgICAgIC8vIGJlY2F1c2UgY2hhcmFjdGVycyB3ZXJlIHJlLWVuY29kZWQuXG4gICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgfVxuICAgIFNhbml0aXppbmdIdG1sU2VyaWFsaXplci5wcm90b3R5cGUuc2FuaXRpemVDaGlsZHJlbiA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAvLyBUaGlzIGNhbm5vdCB1c2UgYSBUcmVlV2Fsa2VyLCBhcyBpdCBoYXMgdG8gcnVuIG9uIEFuZ3VsYXIncyB2YXJpb3VzIERPTSBhZGFwdGVycy5cbiAgICAgICAgLy8gSG93ZXZlciB0aGlzIGNvZGUgbmV2ZXIgYWNjZXNzZXMgcHJvcGVydGllcyBvZmYgb2YgYGRvY3VtZW50YCBiZWZvcmUgZGVsZXRpbmcgaXRzIGNvbnRlbnRzXG4gICAgICAgIC8vIGFnYWluLCBzbyBpdCBzaG91bGRuJ3QgYmUgdnVsbmVyYWJsZSB0byBET00gY2xvYmJlcmluZy5cbiAgICAgICAgdmFyIGN1cnJlbnQgPSBlbC5maXJzdENoaWxkO1xuICAgICAgICB2YXIgdHJhdmVyc2VDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIHRyYXZlcnNlQ29udGVudCA9IHRoaXMuc3RhcnRFbGVtZW50KGN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudC5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYXJzKGN1cnJlbnQubm9kZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwIG5vbi1lbGVtZW50LCBub24tdGV4dCBub2Rlcy5cbiAgICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHJhdmVyc2VDb250ZW50ICYmIGN1cnJlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIExlYXZpbmcgdGhlIGVsZW1lbnQuIFdhbGsgdXAgYW5kIHRvIHRoZSByaWdodCwgY2xvc2luZyB0YWdzIGFzIHdlIGdvLlxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZEVsZW1lbnQoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy5jaGVja0Nsb2JiZXJlZEVsZW1lbnQoY3VycmVudCwgY3VycmVudC5uZXh0U2libGluZyk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpcy5jaGVja0Nsb2JiZXJlZEVsZW1lbnQoY3VycmVudCwgY3VycmVudC5wYXJlbnROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWYuam9pbignJyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYW5pdGl6ZXMgYW4gb3BlbmluZyBlbGVtZW50IHRhZyAoaWYgdmFsaWQpIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQncyBjb250ZW50cyBzaG91bGRcbiAgICAgKiBiZSB0cmF2ZXJzZWQuIEVsZW1lbnQgY29udGVudCBtdXN0IGFsd2F5cyBiZSB0cmF2ZXJzZWQgKGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIG5vdFxuICAgICAqIHZhbGlkL3NhZmUpLCB1bmxlc3MgdGhlIGVsZW1lbnQgaXMgb25lIG9mIGBTS0lQX1RSQVZFUlNJTkdfQ09OVEVOVF9JRl9JTlZBTElEX0VMRU1FTlRTYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHNhbml0aXplLlxuICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZWxlbWVudCdzIGNvbnRlbnRzIHNob3VsZCBiZSB0cmF2ZXJzZWQuXG4gICAgICovXG4gICAgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyLnByb3RvdHlwZS5zdGFydEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgdGFnTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuICFTS0lQX1RSQVZFUlNJTkdfQ09OVEVOVF9JRl9JTlZBTElEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmLnB1c2goJzwnKTtcbiAgICAgICAgdGhpcy5idWYucHVzaCh0YWdOYW1lKTtcbiAgICAgICAgdmFyIGVsQXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVsQXR0ciA9IGVsQXR0cnMuaXRlbShpKTtcbiAgICAgICAgICAgIHZhciBhdHRyTmFtZSA9IGVsQXR0ci5uYW1lO1xuICAgICAgICAgICAgdmFyIGxvd2VyID0gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICghVkFMSURfQVRUUlMuaGFzT3duUHJvcGVydHkobG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gZWxBdHRyLnZhbHVlO1xuICAgICAgICAgICAgLy8gVE9ETyhtYXJ0aW5wcm9ic3QpOiBTcGVjaWFsIGNhc2UgaW1hZ2UgVVJJcyBmb3IgZGF0YTppbWFnZS8uLi5cbiAgICAgICAgICAgIGlmIChVUklfQVRUUlNbbG93ZXJdKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Nhbml0aXplVXJsKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChTUkNTRVRfQVRUUlNbbG93ZXJdKVxuICAgICAgICAgICAgICAgIHZhbHVlID0gc2FuaXRpemVTcmNzZXQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnICcsIGF0dHJOYW1lLCAnPVwiJywgZW5jb2RlRW50aXRpZXModmFsdWUpLCAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Zi5wdXNoKCc+Jyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyLnByb3RvdHlwZS5lbmRFbGVtZW50ID0gZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgdmFyIHRhZ05hbWUgPSBjdXJyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSAmJiAhVk9JRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnPC8nKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2godGFnTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCc+Jyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNhbml0aXppbmdIdG1sU2VyaWFsaXplci5wcm90b3R5cGUuY2hhcnMgPSBmdW5jdGlvbiAoY2hhcnMpIHsgdGhpcy5idWYucHVzaChlbmNvZGVFbnRpdGllcyhjaGFycykpOyB9O1xuICAgIFNhbml0aXppbmdIdG1sU2VyaWFsaXplci5wcm90b3R5cGUuY2hlY2tDbG9iYmVyZWRFbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIG5leHROb2RlKSB7XG4gICAgICAgIGlmIChuZXh0Tm9kZSAmJlxuICAgICAgICAgICAgKG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dE5vZGUpICZcbiAgICAgICAgICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogXCIgKyBub2RlLm91dGVySFRNTCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHROb2RlO1xuICAgIH07XG4gICAgcmV0dXJuIFNhbml0aXppbmdIdG1sU2VyaWFsaXplcjtcbn0oKSk7XG4vLyBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBwYXJzaW5nIHRhZ3MgYW5kIGF0dHJpYnV0ZXNcbnZhciBTVVJST0dBVEVfUEFJUl9SRUdFWFAgPSAvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nO1xuLy8gISB0byB+IGlzIHRoZSBBU0NJSSByYW5nZS5cbnZhciBOT05fQUxQSEFOVU1FUklDX1JFR0VYUCA9IC8oW15cXCMtfiB8IV0pL2c7XG4vKipcbiAqIEVzY2FwZXMgYWxsIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzLCBzbyB0aGF0IHRoZVxuICogcmVzdWx0aW5nIHN0cmluZyBjYW4gYmUgc2FmZWx5IGluc2VydGVkIGludG8gYXR0cmlidXRlIG9yXG4gKiBlbGVtZW50IHRleHQuXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZnVuY3Rpb24gZW5jb2RlRW50aXRpZXModmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgICAucmVwbGFjZShTVVJST0dBVEVfUEFJUl9SRUdFWFAsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICB2YXIgaGkgPSBtYXRjaC5jaGFyQ29kZUF0KDApO1xuICAgICAgICB2YXIgbG93ID0gbWF0Y2guY2hhckNvZGVBdCgxKTtcbiAgICAgICAgcmV0dXJuICcmIycgKyAoKChoaSAtIDB4RDgwMCkgKiAweDQwMCkgKyAobG93IC0gMHhEQzAwKSArIDB4MTAwMDApICsgJzsnO1xuICAgIH0pXG4gICAgICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQLCBmdW5jdGlvbiAobWF0Y2gpIHsgcmV0dXJuICcmIycgKyBtYXRjaC5jaGFyQ29kZUF0KDApICsgJzsnOyB9KVxuICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG59XG52YXIgaW5lcnRCb2R5SGVscGVyO1xuLyoqXG4gKiBTYW5pdGl6ZXMgdGhlIGdpdmVuIHVuc2FmZSwgdW50cnVzdGVkIEhUTUwgZnJhZ21lbnQsIGFuZCByZXR1cm5zIEhUTUwgdGV4dCB0aGF0IGlzIHNhZmUgdG8gYWRkIHRvXG4gKiB0aGUgRE9NIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZnVuY3Rpb24gX3Nhbml0aXplSHRtbChkZWZhdWx0RG9jLCB1bnNhZmVIdG1sSW5wdXQpIHtcbiAgICB2YXIgaW5lcnRCb2R5RWxlbWVudCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgICAgaW5lcnRCb2R5SGVscGVyID0gaW5lcnRCb2R5SGVscGVyIHx8IG5ldyBJbmVydEJvZHlIZWxwZXIoZGVmYXVsdERvYyk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB1bnNhZmVIdG1sIGlzIGFjdHVhbGx5IGEgc3RyaW5nIChUeXBlU2NyaXB0IHR5cGVzIGFyZSBub3QgZW5mb3JjZWQgYXQgcnVudGltZSkuXG4gICAgICAgIHZhciB1bnNhZmVIdG1sID0gdW5zYWZlSHRtbElucHV0ID8gU3RyaW5nKHVuc2FmZUh0bWxJbnB1dCkgOiAnJztcbiAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpO1xuICAgICAgICAvLyBtWFNTIHByb3RlY3Rpb24uIFJlcGVhdGVkbHkgcGFyc2UgdGhlIGRvY3VtZW50IHRvIG1ha2Ugc3VyZSBpdCBzdGFiaWxpemVzLCBzbyB0aGF0IGEgYnJvd3NlclxuICAgICAgICAvLyB0cnlpbmcgdG8gYXV0by1jb3JyZWN0IGluY29ycmVjdCBIVE1MIGNhbm5vdCBjYXVzZSBmb3JtZXJseSBpbmVydCBIVE1MIHRvIGJlY29tZSBkYW5nZXJvdXMuXG4gICAgICAgIHZhciBtWFNTQXR0ZW1wdHMgPSA1O1xuICAgICAgICB2YXIgcGFyc2VkSHRtbCA9IHVuc2FmZUh0bWw7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChtWFNTQXR0ZW1wdHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzYW5pdGl6ZSBodG1sIGJlY2F1c2UgdGhlIGlucHV0IGlzIHVuc3RhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtWFNTQXR0ZW1wdHMtLTtcbiAgICAgICAgICAgIHVuc2FmZUh0bWwgPSBwYXJzZWRIdG1sO1xuICAgICAgICAgICAgcGFyc2VkSHRtbCA9IGluZXJ0Qm9keUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpO1xuICAgICAgICB9IHdoaWxlICh1bnNhZmVIdG1sICE9PSBwYXJzZWRIdG1sKTtcbiAgICAgICAgdmFyIHNhbml0aXplciA9IG5ldyBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIoKTtcbiAgICAgICAgdmFyIHNhZmVIdG1sID0gc2FuaXRpemVyLnNhbml0aXplQ2hpbGRyZW4oZ2V0VGVtcGxhdGVDb250ZW50KGluZXJ0Qm9keUVsZW1lbnQpIHx8IGluZXJ0Qm9keUVsZW1lbnQpO1xuICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgc2FuaXRpemVyLnNhbml0aXplZFNvbWV0aGluZykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhZmVIdG1sO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgLy8gSW4gY2FzZSBhbnl0aGluZyBnb2VzIHdyb25nLCBjbGVhciBvdXQgaW5lcnRFbGVtZW50IHRvIHJlc2V0IHRoZSBlbnRpcmUgRE9NIHN0cnVjdHVyZS5cbiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IGdldFRlbXBsYXRlQ29udGVudChpbmVydEJvZHlFbGVtZW50KSB8fCBpbmVydEJvZHlFbGVtZW50O1xuICAgICAgICAgICAgd2hpbGUgKHBhcmVudF8xLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRfMS5yZW1vdmVDaGlsZChwYXJlbnRfMS5maXJzdENoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFRlbXBsYXRlQ29udGVudChlbCkge1xuICAgIHJldHVybiAnY29udGVudCcgaW4gZWwgLyoqIE1pY3Jvc29mdC9UeXBlU2NyaXB0IzIxNTE3ICovICYmIGlzVGVtcGxhdGVFbGVtZW50KGVsKSA/XG4gICAgICAgIGVsLmNvbnRlbnQgOlxuICAgICAgICBudWxsO1xufVxuZnVuY3Rpb24gaXNUZW1wbGF0ZUVsZW1lbnQoZWwpIHtcbiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLm5vZGVOYW1lID09PSAnVEVNUExBVEUnO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEEgU2VjdXJpdHlDb250ZXh0IG1hcmtzIGEgbG9jYXRpb24gdGhhdCBoYXMgZGFuZ2Vyb3VzIHNlY3VyaXR5IGltcGxpY2F0aW9ucywgZS5nLiBhIERPTSBwcm9wZXJ0eVxuICogbGlrZSBgaW5uZXJIVE1MYCB0aGF0IGNvdWxkIGNhdXNlIENyb3NzIFNpdGUgU2NyaXB0aW5nIChYU1MpIHNlY3VyaXR5IGJ1Z3Mgd2hlbiBpbXByb3Blcmx5XG4gKiBoYW5kbGVkLlxuICpcbiAqIFNlZSBEb21TYW5pdGl6ZXIgZm9yIG1vcmUgZGV0YWlscyBvbiBzZWN1cml0eSBpbiBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBTZWN1cml0eUNvbnRleHQ7XG4oZnVuY3Rpb24gKFNlY3VyaXR5Q29udGV4dCkge1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHRbXCJOT05FXCJdID0gMF0gPSBcIk5PTkVcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0W1wiSFRNTFwiXSA9IDFdID0gXCJIVE1MXCI7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dFtcIlNUWUxFXCJdID0gMl0gPSBcIlNUWUxFXCI7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dFtcIlNDUklQVFwiXSA9IDNdID0gXCJTQ1JJUFRcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0W1wiVVJMXCJdID0gNF0gPSBcIlVSTFwiO1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHRbXCJSRVNPVVJDRV9VUkxcIl0gPSA1XSA9IFwiUkVTT1VSQ0VfVVJMXCI7XG59KShTZWN1cml0eUNvbnRleHQgfHwgKFNlY3VyaXR5Q29udGV4dCA9IHt9KSk7XG4vKipcbiAqIFNhbml0aXplciBpcyB1c2VkIGJ5IHRoZSB2aWV3cyB0byBzYW5pdGl6ZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdmFsdWVzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFNhbml0aXplciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTYW5pdGl6ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBTYW5pdGl6ZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2FmZSBzdHlsZSB2YWx1ZXMuXG4gKlxuICogUXVvdGVzIChcIiBhbmQgJykgYXJlIGFsbG93ZWQsIGJ1dCBhIGNoZWNrIG11c3QgYmUgZG9uZSBlbHNld2hlcmUgdG8gZW5zdXJlIHRoZXkncmUgYmFsYW5jZWQuXG4gKlxuICogJywnIGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcHJvcGVydHkgKGUuZy4gYmFja2dyb3VuZC1hdHRhY2htZW50IG9yXG4gKiBmb250LWZhbWlseSkgYW5kIGhlbmNlIGNvdWxkIGFsbG93IG11bHRpcGxlIHZhbHVlcyB0byBnZXQgaW5qZWN0ZWQsIGJ1dCB0aGF0IHNob3VsZCBwb3NlIG5vIHJpc2tcbiAqIG9mIFhTUy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBjaGVja3Mgb25seSBmb3IgWFNTIHNhZmV0eSwgbm90IGZvciBDU1MgdmFsaWRpdHkuXG4gKlxuICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnksIGFuZCBhdWdtZW50ZWQgZm9yXG4gKiB0cmFuc2Zvcm1hdGlvbiB2YWx1ZXMuXG4gKi9cbnZhciBWQUxVRVMgPSAnWy0sLlwiXFwnJV8hIyBhLXpBLVowLTldKyc7XG52YXIgVFJBTlNGT1JNQVRJT05fRk5TID0gJyg/Om1hdHJpeHx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXd8cGVyc3BlY3RpdmUpKD86WHxZfDNkKT8nO1xudmFyIENPTE9SX0ZOUyA9ICcoPzpyZ2J8aHNsKWE/JztcbnZhciBHUkFESUVOVFMgPSAnKD86cmVwZWF0aW5nLSk/KD86bGluZWFyfHJhZGlhbCktZ3JhZGllbnQnO1xudmFyIENTUzNfRk5TID0gJyg/OmNhbGN8YXR0ciknO1xudmFyIEZOX0FSR1MgPSAnXFxcXChbLTAtOS4lLCAjYS16QS1aXStcXFxcKSc7XG52YXIgU0FGRV9TVFlMRV9WQUxVRSA9IG5ldyBSZWdFeHAoXCJeKFwiICsgVkFMVUVTICsgXCJ8XCIgK1xuICAgIChcIig/OlwiICsgVFJBTlNGT1JNQVRJT05fRk5TICsgXCJ8XCIgKyBDT0xPUl9GTlMgKyBcInxcIiArIEdSQURJRU5UUyArIFwifFwiICsgQ1NTM19GTlMgKyBcIilcIikgK1xuICAgIChGTl9BUkdTICsgXCIpJFwiKSwgJ2cnKTtcbi8qKlxuICogTWF0Y2hlcyBhIGB1cmwoLi4uKWAgdmFsdWUgd2l0aCBhbiBhcmJpdHJhcnkgYXJndW1lbnQgYXMgbG9uZyBhcyBpdCBkb2VzXG4gKiBub3QgY29udGFpbiBwYXJlbnRoZXNlcy5cbiAqXG4gKiBUaGUgVVJMIHZhbHVlIHN0aWxsIG5lZWRzIHRvIGJlIHNhbml0aXplZCBzZXBhcmF0ZWx5LlxuICpcbiAqIGB1cmwoLi4uKWAgdmFsdWVzIGFyZSBhIHZlcnkgY29tbW9uIHVzZSBjYXNlLCBlLmcuIGZvciBgYmFja2dyb3VuZC1pbWFnZWAuIFdpdGggY2FyZWZ1bGx5IGNyYWZ0ZWRcbiAqIENTUyBzdHlsZSBydWxlcywgaXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IGFuIGluZm9ybWF0aW9uIGxlYWsgd2l0aCBgdXJsYCB2YWx1ZXMgaW4gQ1NTLCBlLmcuXG4gKiBieSBvYnNlcnZpbmcgd2hldGhlciBzY3JvbGwgYmFycyBhcmUgZGlzcGxheWVkLCBvciBjaGFyYWN0ZXIgcmFuZ2VzIHVzZWQgYnkgYSBmb250IGZhY2VcbiAqIGRlZmluaXRpb24uXG4gKlxuICogQW5ndWxhciBvbmx5IGFsbG93cyBiaW5kaW5nIENTUyB2YWx1ZXMgKGFzIG9wcG9zZWQgdG8gZW50aXJlIENTUyBydWxlcyksIHNvIGl0IGlzIHVubGlrZWx5IHRoYXRcbiAqIGJpbmRpbmcgYSBVUkwgdmFsdWUgd2l0aG91dCBmdXJ0aGVyIGNvb3BlcmF0aW9uIGZyb20gdGhlIHBhZ2Ugd2lsbCBjYXVzZSBhbiBpbmZvcm1hdGlvbiBsZWFrLCBhbmRcbiAqIGlmIHNvLCBpdCBpcyBqdXN0IGEgbGVhaywgbm90IGEgZnVsbCBibG93biBYU1MgdnVsbmVyYWJpbGl0eS5cbiAqXG4gKiBHaXZlbiB0aGUgY29tbW9uIHVzZSBjYXNlLCBsb3cgbGlrZWxpaG9vZCBvZiBhdHRhY2sgdmVjdG9yLCBhbmQgbG93IGltcGFjdCBvZiBhbiBhdHRhY2ssIHRoaXNcbiAqIGNvZGUgaXMgcGVybWlzc2l2ZSBhbmQgYWxsb3dzIFVSTHMgdGhhdCBzYW5pdGl6ZSBvdGhlcndpc2UuXG4gKi9cbnZhciBVUkxfUkUgPSAvXnVybFxcKChbXildKylcXCkkLztcbi8qKlxuICogQ2hlY2tzIHRoYXQgcXVvdGVzIChcIiBhbmQgJykgYXJlIHByb3Blcmx5IGJhbGFuY2VkIGluc2lkZSBhIHN0cmluZy4gQXNzdW1lc1xuICogdGhhdCBuZWl0aGVyIGVzY2FwZSAoXFwpIG5vciBhbnkgb3RoZXIgY2hhcmFjdGVyIHRoYXQgY291bGQgcmVzdWx0IGluXG4gKiBicmVha2luZyBvdXQgb2YgYSBzdHJpbmcgcGFyc2luZyBjb250ZXh0IGFyZSBhbGxvd2VkO1xuICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNzdHJpbmctdG9rZW4tZGlhZ3JhbS5cbiAqXG4gKiBUaGlzIGNvZGUgd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuXG4gKi9cbmZ1bmN0aW9uIGhhc0JhbGFuY2VkUXVvdGVzKHZhbHVlKSB7XG4gICAgdmFyIG91dHNpZGVTaW5nbGUgPSB0cnVlO1xuICAgIHZhciBvdXRzaWRlRG91YmxlID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjID0gdmFsdWUuY2hhckF0KGkpO1xuICAgICAgICBpZiAoYyA9PT0gJ1xcJycgJiYgb3V0c2lkZURvdWJsZSkge1xuICAgICAgICAgICAgb3V0c2lkZVNpbmdsZSA9ICFvdXRzaWRlU2luZ2xlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPT09ICdcIicgJiYgb3V0c2lkZVNpbmdsZSkge1xuICAgICAgICAgICAgb3V0c2lkZURvdWJsZSA9ICFvdXRzaWRlRG91YmxlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRzaWRlU2luZ2xlICYmIG91dHNpZGVEb3VibGU7XG59XG4vKipcbiAqIFNhbml0aXplcyB0aGUgZ2l2ZW4gdW50cnVzdGVkIENTUyBzdHlsZSBwcm9wZXJ0eSB2YWx1ZSAoaS5lLiBub3QgYW4gZW50aXJlIG9iamVjdCwganVzdCBhIHNpbmdsZVxuICogdmFsdWUpIGFuZCByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBzYWZlIHRvIHVzZSBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIF9zYW5pdGl6ZVN0eWxlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcuXG4gICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIC8vIFNpbmdsZSB1cmwoLi4uKSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG9ubHkgZm9yIFVSTHMgdGhhdCBzYW5pdGl6ZSBjbGVhbmx5LiBTZWUgYWJvdmUgZm9yXG4gICAgLy8gcmVhc29uaW5nIGJlaGluZCB0aGlzLlxuICAgIHZhciB1cmxNYXRjaCA9IHZhbHVlLm1hdGNoKFVSTF9SRSk7XG4gICAgaWYgKCh1cmxNYXRjaCAmJiBfc2FuaXRpemVVcmwodXJsTWF0Y2hbMV0pID09PSB1cmxNYXRjaFsxXSkgfHxcbiAgICAgICAgdmFsdWUubWF0Y2goU0FGRV9TVFlMRV9WQUxVRSkgJiYgaGFzQmFsYW5jZWRRdW90ZXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTsgLy8gU2FmZSBzdHlsZSB2YWx1ZXMuXG4gICAgfVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBzdHlsZSB2YWx1ZSBcIiArIHZhbHVlICsgXCIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuICd1bnNhZmUnO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFuIGBodG1sYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGBodG1sYCAqKnN0cmluZyoqIGludG8gdHJ1c3RlZCBzdHJpbmcgYnkgcmVtb3ZpbmdcbiAqIGRhbmdlcm91cyBjb250ZW50LlxuICpcbiAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgYGh0bWxgIGFuZCBsb2NhdGVzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjb250ZW50IChzdWNoIGFzIHVybHMgYW5kXG4gKiBqYXZhc2NyaXB0KSBhbmQgcmVtb3ZlcyBpdC5cbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBtYXJrIGEgc3RyaW5nIGFzIHRydXN0ZWQgYnkgY2FsbGluZyB7QGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sfS5cbiAqXG4gKiBAcGFyYW0gdW5zYWZlSHRtbCB1bnRydXN0ZWQgYGh0bWxgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci5cbiAqIEByZXR1cm5zIGBodG1sYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBkaXNwbGF5IHRvIHVzZXIsIGJlY2F1c2UgYWxsIG9mIHRoZSBkYW5nZXJvdXMgamF2YXNjcmlwdFxuICogYW5kIHVybHMgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiDJtcm1c2FuaXRpemVIdG1sKHVuc2FmZUh0bWwpIHtcbiAgICB2YXIgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7XG4gICAgaWYgKHNhbml0aXplcikge1xuICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCB1bnNhZmVIdG1sKSB8fCAnJztcbiAgICB9XG4gICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzKHVuc2FmZUh0bWwsIFwiSHRtbFwiIC8qIEh0bWwgKi8pKSB7XG4gICAgICAgIHJldHVybiB1bnNhZmVIdG1sLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBfc2FuaXRpemVIdG1sKGRvY3VtZW50LCByZW5kZXJTdHJpbmdpZnkodW5zYWZlSHRtbCkpO1xufVxuLyoqXG4gKiBBIGBzdHlsZWAgc2FuaXRpemVyIHdoaWNoIGNvbnZlcnRzIHVudHJ1c3RlZCBgc3R5bGVgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZ1xuICogZGFuZ2Vyb3VzIGNvbnRlbnQuXG4gKlxuICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgc3R5bGVgIGFuZCBsb2NhdGVzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjb250ZW50IChzdWNoIGFzIHVybHMgYW5kXG4gKiBqYXZhc2NyaXB0KSBhbmQgcmVtb3ZlcyBpdC5cbiAqXG4gKiBJdCBpcyBwb3NzaWJsZSB0byBtYXJrIGEgc3RyaW5nIGFzIHRydXN0ZWQgYnkgY2FsbGluZyB7QGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZX0uXG4gKlxuICogQHBhcmFtIHVuc2FmZVN0eWxlIHVudHJ1c3RlZCBgc3R5bGVgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci5cbiAqIEByZXR1cm5zIGBzdHlsZWAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gYmluZCB0byB0aGUgYHN0eWxlYCBwcm9wZXJ0aWVzLCBiZWNhdXNlIGFsbCBvZiB0aGVcbiAqIGRhbmdlcm91cyBqYXZhc2NyaXB0IGFuZCB1cmxzIGhhdmUgYmVlbiByZW1vdmVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gybXJtXNhbml0aXplU3R5bGUodW5zYWZlU3R5bGUpIHtcbiAgICB2YXIgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7XG4gICAgaWYgKHNhbml0aXplcikge1xuICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5TVFlMRSwgdW5zYWZlU3R5bGUpIHx8ICcnO1xuICAgIH1cbiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3ModW5zYWZlU3R5bGUsIFwiU3R5bGVcIiAvKiBTdHlsZSAqLykpIHtcbiAgICAgICAgcmV0dXJuIHVuc2FmZVN0eWxlLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBfc2FuaXRpemVTdHlsZShyZW5kZXJTdHJpbmdpZnkodW5zYWZlU3R5bGUpKTtcbn1cbi8qKlxuICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGB1cmxgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZ1xuICogZGFuZ2Vyb3VzXG4gKiBjb250ZW50LlxuICpcbiAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgYHVybGAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgamF2YXNjcmlwdCkgYW5kXG4gKiByZW1vdmVzIGl0LlxuICpcbiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybH0uXG4gKlxuICogQHBhcmFtIHVuc2FmZVVybCB1bnRydXN0ZWQgYHVybGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLlxuICogQHJldHVybnMgYHVybGAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gYmluZCB0byB0aGUgYHNyY2AgcHJvcGVydGllcyBzdWNoIGFzIGA8aW1nIHNyYz5gLCBiZWNhdXNlXG4gKiBhbGwgb2YgdGhlIGRhbmdlcm91cyBqYXZhc2NyaXB0IGhhcyBiZWVuIHJlbW92ZWQuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiDJtcm1c2FuaXRpemVVcmwodW5zYWZlVXJsKSB7XG4gICAgdmFyIHNhbml0aXplciA9IGdldFNhbml0aXplcigpO1xuICAgIGlmIChzYW5pdGl6ZXIpIHtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuVVJMLCB1bnNhZmVVcmwpIHx8ICcnO1xuICAgIH1cbiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3ModW5zYWZlVXJsLCBcIlVybFwiIC8qIFVybCAqLykpIHtcbiAgICAgICAgcmV0dXJuIHVuc2FmZVVybC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gX3Nhbml0aXplVXJsKHJlbmRlclN0cmluZ2lmeSh1bnNhZmVVcmwpKTtcbn1cbi8qKlxuICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggb25seSBsZXRzIHRydXN0ZWQgYHVybGBzIHRocm91Z2guXG4gKlxuICogVGhpcyBwYXNzZXMgb25seSBgdXJsYHMgbWFya2VkIHRydXN0ZWQgYnkgY2FsbGluZyB7QGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RSZXNvdXJjZVVybH0uXG4gKlxuICogQHBhcmFtIHVuc2FmZVJlc291cmNlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuXG4gKiBAcmV0dXJucyBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgc3JjYCBwcm9wZXJ0aWVzIHN1Y2ggYXMgYDxpbWcgc3JjPmAsIGJlY2F1c2VcbiAqIG9ubHkgdHJ1c3RlZCBgdXJsYHMgaGF2ZSBiZWVuIGFsbG93ZWQgdG8gcGFzcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsKHVuc2FmZVJlc291cmNlVXJsKSB7XG4gICAgdmFyIHNhbml0aXplciA9IGdldFNhbml0aXplcigpO1xuICAgIGlmIChzYW5pdGl6ZXIpIHtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCB1bnNhZmVSZXNvdXJjZVVybCkgfHwgJyc7XG4gICAgfVxuICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzcyh1bnNhZmVSZXNvdXJjZVVybCwgXCJSZXNvdXJjZVVybFwiIC8qIFJlc291cmNlVXJsICovKSkge1xuICAgICAgICByZXR1cm4gdW5zYWZlUmVzb3VyY2VVcmwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKScpO1xufVxuLyoqXG4gKiBBIGBzY3JpcHRgIHNhbml0aXplciB3aGljaCBvbmx5IGxldHMgdHJ1c3RlZCBqYXZhc2NyaXB0IHRocm91Z2guXG4gKlxuICogVGhpcyBwYXNzZXMgb25seSBgc2NyaXB0YHMgbWFya2VkIHRydXN0ZWQgYnkgY2FsbGluZyB7QGxpbmtcbiAqIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0fS5cbiAqXG4gKiBAcGFyYW0gdW5zYWZlU2NyaXB0IHVudHJ1c3RlZCBgc2NyaXB0YCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuXG4gKiBAcmV0dXJucyBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgPHNjcmlwdD5gIGVsZW1lbnQgc3VjaCBhcyBgPGltZyBzcmM+YCxcbiAqIGJlY2F1c2Ugb25seSB0cnVzdGVkIGBzY3JpcHRzYCBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gybXJtXNhbml0aXplU2NyaXB0KHVuc2FmZVNjcmlwdCkge1xuICAgIHZhciBzYW5pdGl6ZXIgPSBnZXRTYW5pdGl6ZXIoKTtcbiAgICBpZiAoc2FuaXRpemVyKSB7XG4gICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlNDUklQVCwgdW5zYWZlU2NyaXB0KSB8fCAnJztcbiAgICB9XG4gICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzKHVuc2FmZVNjcmlwdCwgXCJTY3JpcHRcIiAvKiBTY3JpcHQgKi8pKSB7XG4gICAgICAgIHJldHVybiB1bnNhZmVTY3JpcHQudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Jyk7XG59XG4vKipcbiAqIERldGVjdHMgd2hpY2ggc2FuaXRpemVyIHRvIHVzZSBmb3IgVVJMIHByb3BlcnR5LCBiYXNlZCBvbiB0YWcgbmFtZSBhbmQgcHJvcCBuYW1lLlxuICpcbiAqIFRoZSBydWxlcyBhcmUgYmFzZWQgb24gdGhlIFJFU09VUkNFX1VSTCBjb250ZXh0IGNvbmZpZyBmcm9tXG4gKiBgcGFja2FnZXMvY29tcGlsZXIvc3JjL3NjaGVtYS9kb21fc2VjdXJpdHlfc2NoZW1hLnRzYC5cbiAqIElmIHRhZyBhbmQgcHJvcCBuYW1lcyBkb24ndCBtYXRjaCBSZXNvdXJjZSBVUkwgc2NoZW1hLCB1c2UgVVJMIHNhbml0aXplci5cbiAqL1xuZnVuY3Rpb24gZ2V0VXJsU2FuaXRpemVyKHRhZywgcHJvcCkge1xuICAgIGlmICgocHJvcCA9PT0gJ3NyYycgJiYgKHRhZyA9PT0gJ2VtYmVkJyB8fCB0YWcgPT09ICdmcmFtZScgfHwgdGFnID09PSAnaWZyYW1lJyB8fFxuICAgICAgICB0YWcgPT09ICdtZWRpYScgfHwgdGFnID09PSAnc2NyaXB0JykpIHx8XG4gICAgICAgIChwcm9wID09PSAnaHJlZicgJiYgKHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2xpbmsnKSkpIHtcbiAgICAgICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsO1xuICAgIH1cbiAgICByZXR1cm4gybXJtXNhbml0aXplVXJsO1xufVxuLyoqXG4gKiBTYW5pdGl6ZXMgVVJMLCBzZWxlY3Rpbmcgc2FuaXRpemVyIGZ1bmN0aW9uIGJhc2VkIG9uIHRhZyBhbmQgcHJvcGVydHkgbmFtZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGNhc2Ugd2UgY2FuJ3QgZGVmaW5lIHNlY3VyaXR5IGNvbnRleHQgYXQgY29tcGlsZSB0aW1lLCB3aGVuIG9ubHkgcHJvcFxuICogbmFtZSBpcyBhdmFpbGFibGUuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGdlbmVyYXRlIGhvc3QgYmluZGluZ3MgZm9yIERpcmVjdGl2ZXMvQ29tcG9uZW50cy4gVGhlXG4gKiBob3N0IGVsZW1lbnQgaXMgdW5rbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIGRlZmVyIGNhbGN1bGF0aW9uIG9mIHNwZWNpZmljIHNhbml0aXplciB0b1xuICogcnVudGltZS5cbiAqXG4gKiBAcGFyYW0gdW5zYWZlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuXG4gKiBAcGFyYW0gdGFnIHRhcmdldCBlbGVtZW50IHRhZyBuYW1lLlxuICogQHBhcmFtIHByb3AgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUuXG4gKiBAcmV0dXJucyBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCh1bnNhZmVVcmwsIHRhZywgcHJvcCkge1xuICAgIHJldHVybiBnZXRVcmxTYW5pdGl6ZXIodGFnLCBwcm9wKSh1bnNhZmVVcmwpO1xufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBzdHlsZSBzYW5pdGl6ZXIgd2lsbCBoYW5kbGUgc2FuaXRpemF0aW9uIGZvciBzdHlsZSBwcm9wZXJ0aWVzIGJ5XG4gKiBzYW5pdGl6aW5nIGFueSBDU1MgcHJvcGVydHkgdGhhdCBjYW4gaW5jbHVkZSBhIGB1cmxgIHZhbHVlICh1c3VhbGx5IGltYWdlLWJhc2VkIHByb3BlcnRpZXMpXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgybXJtWRlZmF1bHRTdHlsZVNhbml0aXplciA9IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwcm9wID09PSAnYmFja2dyb3VuZC1pbWFnZScgfHwgcHJvcCA9PT0gJ2JhY2tncm91bmQnIHx8IHByb3AgPT09ICdib3JkZXItaW1hZ2UnIHx8XG4gICAgICAgICAgICBwcm9wID09PSAnZmlsdGVyJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZScgfHwgcHJvcCA9PT0gJ2xpc3Qtc3R5bGUtaW1hZ2UnO1xuICAgIH1cbiAgICByZXR1cm4gybXJtXNhbml0aXplU3R5bGUodmFsdWUpO1xufTtcbmZ1bmN0aW9uIHZhbGlkYXRlQWdhaW5zdEV2ZW50UHJvcGVydGllcyhuYW1lKSB7XG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgIHZhciBtc2cgPSBcIkJpbmRpbmcgdG8gZXZlbnQgcHJvcGVydHkgJ1wiICsgbmFtZSArIFwiJyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBcIiArXG4gICAgICAgICAgICAoXCJwbGVhc2UgdXNlIChcIiArIG5hbWUuc2xpY2UoMikgKyBcIik9Li4uXCIpICtcbiAgICAgICAgICAgIChcIlxcbklmICdcIiArIG5hbWUgKyBcIicgaXMgYSBkaXJlY3RpdmUgaW5wdXQsIG1ha2Ugc3VyZSB0aGUgZGlyZWN0aXZlIGlzIGltcG9ydGVkIGJ5IHRoZVwiKSArXG4gICAgICAgICAgICBcIiBjdXJyZW50IG1vZHVsZS5cIjtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVBZ2FpbnN0RXZlbnRBdHRyaWJ1dGVzKG5hbWUpIHtcbiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ29uJykpIHtcbiAgICAgICAgdmFyIG1zZyA9IFwiQmluZGluZyB0byBldmVudCBhdHRyaWJ1dGUgJ1wiICsgbmFtZSArIFwiJyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBcIiArXG4gICAgICAgICAgICAoXCJwbGVhc2UgdXNlIChcIiArIG5hbWUuc2xpY2UoMikgKyBcIik9Li4uXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTYW5pdGl6ZXIoKSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICByZXR1cm4gbFZpZXcgJiYgbFZpZXdbU0FOSVRJWkVSXTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShuYW1lKSB7XG4gICAgLy8gQXR0cmlidXRlIG5hbWVzIHdpdGggYCRgIChlZyBgeC15JGApIGFyZSB2YWxpZCBwZXIgc3BlYywgYnV0IHVuc3VwcG9ydGVkIGJ5IHNvbWUgYnJvd3NlcnNcbiAgICBuYW1lID0gY2FtZWxDYXNlVG9EYXNoQ2FzZShuYW1lLnJlcGxhY2UoL1skQF0vZywgJ18nKSk7XG4gICAgcmV0dXJuIFwibmctcmVmbGVjdC1cIiArIG5hbWU7XG59XG52YXIgQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvKFtBLVpdKS9nO1xuZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKENBTUVMX0NBU0VfUkVHRVhQLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBtW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICctJyArIG1bMV0udG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlYnVnQmluZGluZ1ZhbHVlKHZhbHVlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTGltaXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGFzIG90aGVyd2lzZSB0aGUgRE9NIGp1c3QgZ2V0cyBwb2xsdXRlZC5cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpLnNsaWNlKDAsIDMwKSA6IHZhbHVlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gJ1tFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlJztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogTWFya3MgdGhhdCB0aGUgbmV4dCBzdHJpbmcgaXMgZm9yIGVsZW1lbnQuXG4gKlxuICogU2VlIGBJMThuTXV0YXRlT3BDb2Rlc2AgZG9jdW1lbnRhdGlvbi5cbiAqL1xudmFyIEVMRU1FTlRfTUFSS0VSID0ge1xuICAgIG1hcmtlcjogJ2VsZW1lbnQnXG59O1xuLyoqXG4gKiBNYXJrcyB0aGF0IHRoZSBuZXh0IHN0cmluZyBpcyBmb3IgY29tbWVudC5cbiAqXG4gKiBTZWUgYEkxOG5NdXRhdGVPcENvZGVzYCBkb2N1bWVudGF0aW9uLlxuICovXG52YXIgQ09NTUVOVF9NQVJLRVIgPSB7XG4gICAgbWFya2VyOiAnY29tbWVudCdcbn07XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaERlYnVnT2JqZWN0KG9iaiwgZGVidWcpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnZGVidWcnLCB7IHZhbHVlOiBkZWJ1ZywgZW51bWVyYWJsZTogZmFsc2UgfSk7XG59XG4vKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbmRpdGlvbmFsbHkgYXR0YWNoZWQgY2xhc3NlcyB3aGljaCBwcm92aWRlIGh1bWFuIHJlYWRhYmxlIChkZWJ1ZykgbGV2ZWxcbiAqIGluZm9ybWF0aW9uIGZvciBgTFZpZXdgLCBgTENvbnRhaW5lcmAgYW5kIG90aGVyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4gVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzXG4gKiBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgYXJyYXkgd2hpY2ggbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgZHVyaW5nIGRlYnVnZ2luZyB0byByZWFzb24gYWJvdXQgdGhlXG4gKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0uXG4gKlxuICogUGF0Y2hpbmcgdGhlIGFycmF5IHdpdGggZXh0cmEgcHJvcGVydHkgZG9lcyBjaGFuZ2UgdGhlIGFycmF5J3MgaGlkZGVuIGNsYXNzJyBidXQgaXQgZG9lcyBub3RcbiAqIGNoYW5nZSB0aGUgY29zdCBvZiBhY2Nlc3MsIHRoZXJlZm9yZSB0aGlzIHBhdGNoaW5nIHNob3VsZCBub3QgaGF2ZSBzaWduaWZpY2FudCBpZiBhbnkgaW1wYWN0IGluXG4gKiBgbmdEZXZNb2RlYCBtb2RlLiAoc2VlOiBodHRwczovL2pzcGVyZi5jb20vYXJyYXktdnMtbW9ua2V5LXBhdGNoLWFycmF5KVxuICpcbiAqIFNvIGluc3RlYWQgb2Ygc2VlaW5nOlxuICogYGBgXG4gKiBBcnJheSgzMCkgW09iamVjdCwgNjU5LCBudWxsLCDigKZdXG4gKiBgYGBcbiAqXG4gKiBZb3UgZ2V0IHRvIHNlZTpcbiAqIGBgYFxuICogTFZpZXdEZWJ1ZyB7XG4gKiAgIHZpZXdzOiBbLi4uXSxcbiAqICAgZmxhZ3M6IHthdHRhY2hlZDogdHJ1ZSwgLi4ufVxuICogICBub2RlczogW1xuICogICAgIHtodG1sOiAnPGRpdiBpZD1cIjEyM1wiPicsIC4uLiwgbm9kZXM6IFtcbiAqICAgICAgIHtodG1sOiAnPHNwYW4+JywgLi4uLCBub2RlczogbnVsbH1cbiAqICAgICBdfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gYXR0YWNoTFZpZXdEZWJ1ZyhsVmlldykge1xuICAgIGF0dGFjaERlYnVnT2JqZWN0KGxWaWV3LCBuZXcgTFZpZXdEZWJ1ZyhsVmlldykpO1xufVxuZnVuY3Rpb24gYXR0YWNoTENvbnRhaW5lckRlYnVnKGxDb250YWluZXIpIHtcbiAgICBhdHRhY2hEZWJ1Z09iamVjdChsQ29udGFpbmVyLCBuZXcgTENvbnRhaW5lckRlYnVnKGxDb250YWluZXIpKTtcbn1cbmZ1bmN0aW9uIHRvRGVidWcob2JqKSB7XG4gICAgaWYgKG9iaikge1xuICAgICAgICB2YXIgZGVidWcgPSBvYmouZGVidWc7XG4gICAgICAgIGFzc2VydERlZmluZWQoZGVidWcsICdPYmplY3QgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIHJlcHJlc2VudGF0aW9uLicpO1xuICAgICAgICByZXR1cm4gZGVidWc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cbn1cbi8qKlxuICogVXNlIHRoaXMgbWV0aG9kIHRvIHVud3JhcCBhIG5hdGl2ZSBlbGVtZW50IGluIGBMVmlld2AgYW5kIGNvbnZlcnQgaXQgaW50byBIVE1MIGZvciBlYXNpZXJcbiAqIHJlYWRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIHBvc3NpYmx5IHdyYXBwZWQgbmF0aXZlIERPTSBub2RlLlxuICogQHBhcmFtIGluY2x1ZGVDaGlsZHJlbiBJZiBgdHJ1ZWAgdGhlbiB0aGUgc2VyaWFsaXplZCBIVE1MIGZvcm0gd2lsbCBpbmNsdWRlIGNoaWxkIGVsZW1lbnRzIChzYW1lXG4gKiBhcyBgb3V0ZXJIVE1MYCkuIElmIGBmYWxzZWAgdGhlbiB0aGUgc2VyaWFsaXplZCBIVE1MIGZvcm0gd2lsbCBvbmx5IGNvbnRhaW4gdGhlIGVsZW1lbnQgaXRzZWxmXG4gKiAod2lsbCBub3Qgc2VyaWFsaXplIGNoaWxkIGVsZW1lbnRzKS5cbiAqL1xuZnVuY3Rpb24gdG9IdG1sKHZhbHVlLCBpbmNsdWRlQ2hpbGRyZW4pIHtcbiAgICBpZiAoaW5jbHVkZUNoaWxkcmVuID09PSB2b2lkIDApIHsgaW5jbHVkZUNoaWxkcmVuID0gZmFsc2U7IH1cbiAgICB2YXIgbm9kZSA9IHVud3JhcFJOb2RlKHZhbHVlKTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgICB2YXIgaXNUZXh0Tm9kZSA9IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFO1xuICAgICAgICB2YXIgb3V0ZXJIVE1MID0gKGlzVGV4dE5vZGUgPyBub2RlLnRleHRDb250ZW50IDogbm9kZS5vdXRlckhUTUwpIHx8ICcnO1xuICAgICAgICBpZiAoaW5jbHVkZUNoaWxkcmVuIHx8IGlzVGV4dE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRlckhUTUw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgaW5uZXJIVE1MID0gbm9kZS5pbm5lckhUTUw7XG4gICAgICAgICAgICByZXR1cm4gb3V0ZXJIVE1MLnNwbGl0KGlubmVySFRNTClbMF0gfHwgbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxudmFyIExWaWV3RGVidWcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTFZpZXdEZWJ1ZyhfcmF3X2xWaWV3KSB7XG4gICAgICAgIHRoaXMuX3Jhd19sVmlldyA9IF9yYXdfbFZpZXc7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMVmlld0RlYnVnLnByb3RvdHlwZSwgXCJmbGFnc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGBMVmlld2AgdW5wYWNrZWQgaW50byBhIG1vcmUgcmVhZGFibGUgc3RhdGUuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IHRoaXMuX3Jhd19sVmlld1tGTEFHU107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF9fcmF3X19mbGFnc19fOiBmbGFncyxcbiAgICAgICAgICAgICAgICBpbml0UGhhc2VTdGF0ZTogZmxhZ3MgJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLyxcbiAgICAgICAgICAgICAgICBjcmVhdGlvbk1vZGU6ICEhKGZsYWdzICYgNCAvKiBDcmVhdGlvbk1vZGUgKi8pLFxuICAgICAgICAgICAgICAgIGZpcnN0Vmlld1Bhc3M6ICEhKGZsYWdzICYgOCAvKiBGaXJzdExWaWV3UGFzcyAqLyksXG4gICAgICAgICAgICAgICAgY2hlY2tBbHdheXM6ICEhKGZsYWdzICYgMTYgLyogQ2hlY2tBbHdheXMgKi8pLFxuICAgICAgICAgICAgICAgIGRpcnR5OiAhIShmbGFncyAmIDY0IC8qIERpcnR5ICovKSxcbiAgICAgICAgICAgICAgICBhdHRhY2hlZDogISEoZmxhZ3MgJiAxMjggLyogQXR0YWNoZWQgKi8pLFxuICAgICAgICAgICAgICAgIGRlc3Ryb3llZDogISEoZmxhZ3MgJiAyNTYgLyogRGVzdHJveWVkICovKSxcbiAgICAgICAgICAgICAgICBpc1Jvb3Q6ICEhKGZsYWdzICYgNTEyIC8qIElzUm9vdCAqLyksXG4gICAgICAgICAgICAgICAgaW5kZXhXaXRoaW5Jbml0UGhhc2U6IGZsYWdzID4+IDEwIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlU2hpZnQgKi8sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTFZpZXdEZWJ1Zy5wcm90b3R5cGUsIFwicGFyZW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sVmlld1tQQVJFTlRdKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExWaWV3RGVidWcucHJvdG90eXBlLCBcImhvc3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRvSHRtbCh0aGlzLl9yYXdfbFZpZXdbSE9TVF0sIHRydWUpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTFZpZXdEZWJ1Zy5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W0NPTlRFWFRdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTFZpZXdEZWJ1Zy5wcm90b3R5cGUsIFwibm9kZXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyZWUgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGBMVmlld2AuIFRoZSBub2RlcyBoYXZlIGJlZW4gbm9ybWFsaXplZCBpbnRvIGFcbiAgICAgICAgICogdHJlZSBzdHJ1Y3R1cmUgd2l0aCByZWxldmFudCBkZXRhaWxzIHB1bGxlZCBvdXQgZm9yIHJlYWRhYmlsaXR5LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbFZpZXcgPSB0aGlzLl9yYXdfbFZpZXc7XG4gICAgICAgICAgICB2YXIgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHJldHVybiB0b0RlYnVnTm9kZXModE5vZGUsIGxWaWV3KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExWaWV3RGVidWcucHJvdG90eXBlLCBcIl9fb3RoZXJfX1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIGlzIGhpZGRlbiBiZWhpbmQgYSBwcm9wZXJ0eS4gVGhlIGV4dHJhIGxldmVsIG9mIGluZGlyZWN0aW9uIGlzXG4gICAgICAgICAqIGRvbmUgc28gdGhhdCB0aGUgZGVidWcgdmlldyB3b3VsZCBub3QgYmUgY2x1dHRlcmVkIHdpdGggcHJvcGVydGllcyB3aGljaCBhcmUgb25seSByYXJlbHlcbiAgICAgICAgICogcmVsZXZhbnQgdG8gdGhlIGRldmVsb3Blci5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0VmlldzogdGhpcy5fcmF3X2xWaWV3W1RWSUVXXSxcbiAgICAgICAgICAgICAgICBjbGVhbnVwOiB0aGlzLl9yYXdfbFZpZXdbQ0xFQU5VUF0sXG4gICAgICAgICAgICAgICAgaW5qZWN0b3I6IHRoaXMuX3Jhd19sVmlld1tJTkpFQ1RPUiQxXSxcbiAgICAgICAgICAgICAgICByZW5kZXJlckZhY3Rvcnk6IHRoaXMuX3Jhd19sVmlld1tSRU5ERVJFUl9GQUNUT1JZXSxcbiAgICAgICAgICAgICAgICByZW5kZXJlcjogdGhpcy5fcmF3X2xWaWV3W1JFTkRFUkVSXSxcbiAgICAgICAgICAgICAgICBzYW5pdGl6ZXI6IHRoaXMuX3Jhd19sVmlld1tTQU5JVElaRVJdLFxuICAgICAgICAgICAgICAgIGNoaWxkSGVhZDogdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbQ0hJTERfSEVBRF0pLFxuICAgICAgICAgICAgICAgIG5leHQ6IHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W05FWFRdKSxcbiAgICAgICAgICAgICAgICBjaGlsZFRhaWw6IHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W0NISUxEX1RBSUxdKSxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvblZpZXc6IHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSxcbiAgICAgICAgICAgICAgICBjb250ZW50UXVlcmllczogdGhpcy5fcmF3X2xWaWV3W0NPTlRFTlRfUVVFUklFU10sXG4gICAgICAgICAgICAgICAgcXVlcmllczogdGhpcy5fcmF3X2xWaWV3W1FVRVJJRVNdLFxuICAgICAgICAgICAgICAgIHRIb3N0OiB0aGlzLl9yYXdfbFZpZXdbVF9IT1NUXSxcbiAgICAgICAgICAgICAgICBiaW5kaW5nSW5kZXg6IHRoaXMuX3Jhd19sVmlld1tCSU5ESU5HX0lOREVYXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMVmlld0RlYnVnLnByb3RvdHlwZSwgXCJjaGlsZFZpZXdzXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vcm1hbGl6ZWQgdmlldyBvZiBjaGlsZCB2aWV3cyAoYW5kIGNvbnRhaW5lcnMpIGF0dGFjaGVkIGF0IHRoaXMgbG9jYXRpb24uXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZFZpZXdzID0gW107XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLl9fb3RoZXJfXy5jaGlsZEhlYWQ7XG4gICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFZpZXdzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuX19vdGhlcl9fLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRWaWV3cztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIExWaWV3RGVidWc7XG59KCkpO1xuLyoqXG4gKiBUdXJucyBhIGZsYXQgbGlzdCBvZiBub2RlcyBpbnRvIGEgdHJlZSBieSB3YWxraW5nIHRoZSBhc3NvY2lhdGVkIGBUTm9kZWAgdHJlZS5cbiAqXG4gKiBAcGFyYW0gdE5vZGVcbiAqIEBwYXJhbSBsVmlld1xuICovXG5mdW5jdGlvbiB0b0RlYnVnTm9kZXModE5vZGUsIGxWaWV3KSB7XG4gICAgaWYgKHROb2RlKSB7XG4gICAgICAgIHZhciBkZWJ1Z05vZGVzID0gW107XG4gICAgICAgIHZhciB0Tm9kZUN1cnNvciA9IHROb2RlO1xuICAgICAgICB3aGlsZSAodE5vZGVDdXJzb3IpIHtcbiAgICAgICAgICAgIHZhciByYXdWYWx1ZSA9IGxWaWV3W3ROb2RlLmluZGV4XTtcbiAgICAgICAgICAgIHZhciBuYXRpdmUgPSB1bndyYXBSTm9kZShyYXdWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50TFZpZXdEZWJ1ZyA9IHRvRGVidWcocmVhZExWaWV3VmFsdWUocmF3VmFsdWUpKTtcbiAgICAgICAgICAgIGRlYnVnTm9kZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaHRtbDogdG9IdG1sKG5hdGl2ZSksXG4gICAgICAgICAgICAgICAgbmF0aXZlOiBuYXRpdmUsXG4gICAgICAgICAgICAgICAgbm9kZXM6IHRvRGVidWdOb2Rlcyh0Tm9kZS5jaGlsZCwgbFZpZXcpLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50TFZpZXdEZWJ1Z1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0Tm9kZUN1cnNvciA9IHROb2RlQ3Vyc29yLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlYnVnTm9kZXM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG52YXIgTENvbnRhaW5lckRlYnVnID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExDb250YWluZXJEZWJ1ZyhfcmF3X2xDb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fcmF3X2xDb250YWluZXIgPSBfcmF3X2xDb250YWluZXI7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMQ29udGFpbmVyRGVidWcucHJvdG90eXBlLCBcImFjdGl2ZUluZGV4XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTENvbnRhaW5lckRlYnVnLnByb3RvdHlwZSwgXCJ2aWV3c1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW1ZJRVdTXS5tYXAodG9EZWJ1Zyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMQ29udGFpbmVyRGVidWcucHJvdG90eXBlLCBcInBhcmVudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbENvbnRhaW5lcltQQVJFTlRdKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExDb250YWluZXJEZWJ1Zy5wcm90b3R5cGUsIFwicXVlcmllc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbUVVFUklFU107IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMQ29udGFpbmVyRGVidWcucHJvdG90eXBlLCBcImhvc3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW0hPU1RdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTENvbnRhaW5lckRlYnVnLnByb3RvdHlwZSwgXCJuYXRpdmVcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW05BVElWRV07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShMQ29udGFpbmVyRGVidWcucHJvdG90eXBlLCBcIl9fb3RoZXJfX1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuZXh0OiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW05FWFRdKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBMQ29udGFpbmVyRGVidWc7XG59KCkpO1xuLyoqXG4gKiBSZXR1cm4gYW4gYExWaWV3YCB2YWx1ZSBpZiBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgYExWaWV3YCBpZiBhbnlcbiAqL1xuZnVuY3Rpb24gcmVhZExWaWV3VmFsdWUodmFsdWUpIHtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBub3QgcXVpdGUgcmlnaHQsIGFzIGl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IGBTdHlsaW5nQ29udGV4dGBcbiAgICAgICAgLy8gVGhpcyBpcyB3aHkgaXQgaXMgaW4gZGVidWcsIG5vdCBpbiB1dGlsLnRzXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gSEVBREVSX09GRlNFVCAtIDEpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIHZhbHVlID0gdmFsdWVbSE9TVF07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxudmFyIEkxOE5EZWJ1Z0l0ZW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSTE4TkRlYnVnSXRlbShfX3Jhd19vcENvZGUsIF9sVmlldywgbm9kZUluZGV4LCB0eXBlKSB7XG4gICAgICAgIHRoaXMuX19yYXdfb3BDb2RlID0gX19yYXdfb3BDb2RlO1xuICAgICAgICB0aGlzLl9sVmlldyA9IF9sVmlldztcbiAgICAgICAgdGhpcy5ub2RlSW5kZXggPSBub2RlSW5kZXg7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJMThORGVidWdJdGVtLnByb3RvdHlwZSwgXCJ0Tm9kZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0VE5vZGUodGhpcy5ub2RlSW5kZXgsIHRoaXMuX2xWaWV3KTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIEkxOE5EZWJ1Z0l0ZW07XG59KCkpO1xuLyoqXG4gKiBUdXJucyBhIGxpc3Qgb2YgXCJDcmVhdGVcIiAmIFwiVXBkYXRlXCIgT3BDb2RlcyBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGlzdCBvZiBvcGVyYXRpb25zIGZvclxuICogZGVidWdnaW5nIHB1cnBvc2VzLlxuICogQHBhcmFtIG11dGF0ZU9wQ29kZXMgbXV0YXRpb24gb3BDb2RlcyB0byByZWFkXG4gKiBAcGFyYW0gdXBkYXRlT3BDb2RlcyB1cGRhdGUgb3BDb2RlcyB0byByZWFkXG4gKiBAcGFyYW0gaWN1cyBsaXN0IG9mIElDVSBleHByZXNzaW9uc1xuICogQHBhcmFtIGxWaWV3IFRoZSB2aWV3IHRoZSBvcENvZGVzIGFyZSBhY3Rpbmcgb25cbiAqL1xuZnVuY3Rpb24gYXR0YWNoSTE4bk9wQ29kZXNEZWJ1ZyhtdXRhdGVPcENvZGVzLCB1cGRhdGVPcENvZGVzLCBpY3VzLCBsVmlldykge1xuICAgIGF0dGFjaERlYnVnT2JqZWN0KG11dGF0ZU9wQ29kZXMsIG5ldyBJMThuTXV0YXRlT3BDb2Rlc0RlYnVnKG11dGF0ZU9wQ29kZXMsIGxWaWV3KSk7XG4gICAgYXR0YWNoRGVidWdPYmplY3QodXBkYXRlT3BDb2RlcywgbmV3IEkxOG5VcGRhdGVPcENvZGVzRGVidWcodXBkYXRlT3BDb2RlcywgaWN1cywgbFZpZXcpKTtcbiAgICBpZiAoaWN1cykge1xuICAgICAgICBpY3VzLmZvckVhY2goZnVuY3Rpb24gKGljdSkge1xuICAgICAgICAgICAgaWN1LmNyZWF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChpY3VDYXNlKSB7IGF0dGFjaERlYnVnT2JqZWN0KGljdUNhc2UsIG5ldyBJMThuTXV0YXRlT3BDb2Rlc0RlYnVnKGljdUNhc2UsIGxWaWV3KSk7IH0pO1xuICAgICAgICAgICAgaWN1LnVwZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChpY3VDYXNlKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNoRGVidWdPYmplY3QoaWN1Q2FzZSwgbmV3IEkxOG5VcGRhdGVPcENvZGVzRGVidWcoaWN1Q2FzZSwgaWN1cywgbFZpZXcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG52YXIgSTE4bk11dGF0ZU9wQ29kZXNEZWJ1ZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJMThuTXV0YXRlT3BDb2Rlc0RlYnVnKF9fcmF3X29wQ29kZXMsIF9fbFZpZXcpIHtcbiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGVzID0gX19yYXdfb3BDb2RlcztcbiAgICAgICAgdGhpcy5fX2xWaWV3ID0gX19sVmlldztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEkxOG5NdXRhdGVPcENvZGVzRGVidWcucHJvdG90eXBlLCBcIm9wZXJhdGlvbnNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIE9wQ29kZXMgd2lsbCBhY3Qgb24gdGhlIHZpZXcuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMsIF9fbFZpZXcgPSBfYS5fX2xWaWV3LCBfX3Jhd19vcENvZGVzID0gX2EuX19yYXdfb3BDb2RlcztcbiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9fcmF3X29wQ29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgb3BDb2RlID0gX19yYXdfb3BDb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BDb2RlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDcmVhdGUgVGV4dCBOb2RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogX19yYXdfb3BDb2Rlc1srK2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogb3BDb2RlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wQ29kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiA3IC8qIE1BU0tfT1BDT0RFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlc3RpbmF0aW9uTm9kZUluZGV4ID0gb3BDb2RlID4+PiAxNyAvKiBTSElGVF9QQVJFTlQgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBkZXN0aW5hdGlvbk5vZGVJbmRleCwgJ0FwcGVuZENoaWxkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogU2VsZWN0ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnU2VsZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUgLyogRWxlbWVudEVuZCAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudEluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSTE4TkRlYnVnSXRlbShvcENvZGUsIF9fbFZpZXcsIGVsZW1lbnRJbmRleCwgJ0VsZW1lbnRFbmQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBBdHRyICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmRleCA9IG9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBlbGVtZW50SW5kZXgsICdBdHRyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydhdHRyTmFtZSddID0gX19yYXdfb3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnYXR0clZhbHVlJ10gPSBfX3Jhd19vcENvZGVzWysraV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9NQVJLRVI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NPTU1FTlRfTUFSS0VSJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudFZhbHVlOiBfX3Jhd19vcENvZGVzWysraV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogX19yYXdfb3BDb2Rlc1srK2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVMRU1FTlRfTUFSS0VSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFTEVNRU5UX01BUktFUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVbmtub3duIE9wIENvZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogb3BDb2RlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gSTE4bk11dGF0ZU9wQ29kZXNEZWJ1Zztcbn0oKSk7XG52YXIgSTE4blVwZGF0ZU9wQ29kZXNEZWJ1ZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJMThuVXBkYXRlT3BDb2Rlc0RlYnVnKF9fcmF3X29wQ29kZXMsIGljdXMsIF9fbFZpZXcpIHtcbiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGVzID0gX19yYXdfb3BDb2RlcztcbiAgICAgICAgdGhpcy5pY3VzID0gaWN1cztcbiAgICAgICAgdGhpcy5fX2xWaWV3ID0gX19sVmlldztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEkxOG5VcGRhdGVPcENvZGVzRGVidWcucHJvdG90eXBlLCBcIm9wZXJhdGlvbnNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIE9wQ29kZXMgd2lsbCBhY3Qgb24gdGhlIHZpZXcuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMsIF9fbFZpZXcgPSBfYS5fX2xWaWV3LCBfX3Jhd19vcENvZGVzID0gX2EuX19yYXdfb3BDb2RlcywgaWN1cyA9IF9hLmljdXM7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfX3Jhd19vcENvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gYml0IGNvZGUgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGFwcGx5IHRoZSBuZXh0IHVwZGF0ZVxuICAgICAgICAgICAgICAgIHZhciBjaGVja0JpdCA9IF9fcmF3X29wQ29kZXNbaV07XG4gICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXNcbiAgICAgICAgICAgICAgICB2YXIgc2tpcENvZGVzID0gX19yYXdfb3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBpICsgMTsgaiA8PSAoaSArIHNraXBDb2Rlcyk7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3BDb2RlID0gX19yYXdfb3BDb2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBvcENvZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wQ29kZSA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wQ29kZSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgYmluZGluZyBpbmRleCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBrbm93IHRoZSB2YWx1ZSBvZiB0aGUgYmluZGluZyBzbyB3ZSBvbmx5IHNob3cgdGhlIGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gXCJcXHVGRkZEXCIgKyAoLW9wQ29kZSAtIDEpICsgXCJcXHVGRkZEXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ID0gb3BDb2RlID4+PiAyIC8qIFNISUZUX1JFRiAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdEljdUluZGV4ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0SWN1ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BDb2RlICYgMyAvKiBNQVNLX09QQ09ERSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXR0ciAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyTmFtZSA9IF9fcmF3X29wQ29kZXNbKytqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYW5pdGl6ZUZuID0gX19yYXdfb3BDb2Rlc1srK2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdDogY2hlY2tCaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0F0dHInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZTogdmFsdWUsIGF0dHJOYW1lOiBhdHRyTmFtZSwgc2FuaXRpemVGbjogc2FuaXRpemVGbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBUZXh0ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdDogY2hlY2tCaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLCBub2RlSW5kZXg6IG5vZGVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBJY3VTd2l0Y2ggKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSBfX3Jhd19vcENvZGVzWysral07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gaWN1c1t0SWN1SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1U3dpdGNoJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3VJbmRleCddID0gdEljdUluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydjaGVja0JpdCddID0gY2hlY2tCaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ21haW5CaW5kaW5nJ10gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndEljdSddID0gdEljdTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBJY3VVcGRhdGUgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSBfX3Jhd19vcENvZGVzWysral07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gaWN1c1t0SWN1SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBub2RlSW5kZXgsICdJY3VVcGRhdGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndEljdUluZGV4J10gPSB0SWN1SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndEljdSddID0gdEljdTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gc2tpcENvZGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBJMThuVXBkYXRlT3BDb2Rlc0RlYnVnO1xufSgpKTtcblxuLyoqIENhbGxlZCB3aGVuIGRpcmVjdGl2ZXMgaW5qZWN0IGVhY2ggb3RoZXIgKGNyZWF0aW5nIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSkgKi9cbi8qKiBDYWxsZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY29tcG9uZW50IHNlbGVjdG9ycyB0aGF0IG1hdGNoIGEgZ2l2ZW4gbm9kZSAqL1xuZnVuY3Rpb24gdGhyb3dNdWx0aXBsZUNvbXBvbmVudEVycm9yKHROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTXVsdGlwbGUgY29tcG9uZW50cyBtYXRjaCBub2RlIHdpdGggdGFnbmFtZSBcIiArIHROb2RlLnRhZ05hbWUpO1xufVxuLyoqIFRocm93cyBhbiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVyQ2hlY2tlZCBlcnJvciBpZiBjaGVja05vQ2hhbmdlcyBtb2RlIGlzIG9uLiAqL1xuZnVuY3Rpb24gdGhyb3dFcnJvcklmTm9DaGFuZ2VzTW9kZShjcmVhdGlvbk1vZGUsIG9sZFZhbHVlLCBjdXJyVmFsdWUpIHtcbiAgICB2YXIgbXNnID0gXCJFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yOiBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLiBQcmV2aW91cyB2YWx1ZTogJ1wiICsgb2xkVmFsdWUgKyBcIicuIEN1cnJlbnQgdmFsdWU6ICdcIiArIGN1cnJWYWx1ZSArIFwiJy5cIjtcbiAgICBpZiAoY3JlYXRpb25Nb2RlKSB7XG4gICAgICAgIG1zZyArPVxuICAgICAgICAgICAgXCIgSXQgc2VlbXMgbGlrZSB0aGUgdmlldyBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGl0cyBwYXJlbnQgYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gZGlydHkgY2hlY2tlZC5cIiArXG4gICAgICAgICAgICAgICAgXCIgSGFzIGl0IGJlZW4gY3JlYXRlZCBpbiBhIGNoYW5nZSBkZXRlY3Rpb24gaG9vayA/XCI7XG4gICAgfVxuICAgIC8vIFRPRE86IGluY2x1ZGUgZGVidWcgY29udGV4dFxuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqIEEgc3BlY2lhbCB2YWx1ZSB3aGljaCBkZXNpZ25hdGVzIHRoYXQgYSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQuICovXG52YXIgTk9fQ0hBTkdFID0ge307XG5cbi8qXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGxvZ2ljIHRvIGRlZmVyIGFsbCBob3N0QmluZGluZ3MtcmVsYXRlZCBzdHlsaW5nIGNvZGUgdG8gcnVuXG4gKiBhdCBhIGxhdGVyIHBvaW50LCBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IChhcyBpcyB0aGUgY2FzZSB3aXRoIGhvdyB0ZW1wbGF0ZS1sZXZlbFxuICogc3R5bGluZyBpbnN0cnVjdGlvbnMgYXJlIHJ1bikuXG4gKlxuICogQ2VydGFpbiBzdHlsaW5nIGluc3RydWN0aW9ucywgcHJlc2VudCB3aXRoaW4gZGlyZWN0aXZlcywgY29tcG9uZW50cyBhbmQgc3ViLWNsYXNzZWRcbiAqIGRpcmVjdGl2ZXMsIGFyZSBldmFsdWF0ZWQgYXQgZGlmZmVyZW50IHBvaW50cyAoZGVwZW5kaW5nIG9uIHByaW9yaXR5KSBhbmQgd2lsbCB0aGVyZWZvcmVcbiAqIG5vdCBiZSBhcHBsaWVkIHRvIHRoZSBzdHlsaW5nIGNvbnRleHQgb2YgYW4gZWxlbWVudCBpbW1lZGlhdGVseS4gVGhleSBhcmUgaW5zdGVhZFxuICogZGVzaWduZWQgdG8gYmUgYXBwbGllZCBqdXN0IGJlZm9yZSBzdHlsaW5nIGlzIGFwcGxpZWQgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiAoVGhlIHByaW9yaXR5IGZvciB3aGVuIGNlcnRhaW4gaG9zdC1yZWxhdGVkIHN0eWxpbmcgb3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaXMgZGlzY3Vzc2VkXG4gKiBtb3JlIHdpdGhpbiBgaW50ZXJmYWNlcy9zdHlsaW5nLnRzYC4pXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVySG9zdERpcmVjdGl2ZShjb250ZXh0LCBkaXJlY3RpdmVJbmRleCkge1xuICAgIHZhciBidWZmZXIgPSBjb250ZXh0WzggLyogSG9zdEluc3RydWN0aW9uc1F1ZXVlICovXTtcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICBidWZmZXIgPSBjb250ZXh0WzggLyogSG9zdEluc3RydWN0aW9uc1F1ZXVlICovXSA9IFtERUZBVUxUX1RFTVBMQVRFX0RJUkVDVElWRV9JTkRFWF07XG4gICAgfVxuICAgIGJ1ZmZlclswIC8qIExhc3RSZWdpc3RlcmVkRGlyZWN0aXZlSW5kZXhQb3NpdGlvbiAqL10gPSBkaXJlY3RpdmVJbmRleDtcbn1cbi8qKlxuICogUXVldWVzIGEgc3R5bGluZyBpbnN0cnVjdGlvbiB0byBiZSBydW4ganVzdCBiZWZvcmUgYHJlbmRlclN0eWxpbmcoKWAgaXMgZXhlY3V0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWVIb3N0SW5zdHJ1Y3Rpb24oY29udGV4dCwgcHJpb3JpdHksIGluc3RydWN0aW9uRm4sIGluc3RydWN0aW9uRm5BcmdzKSB7XG4gICAgdmFyIGJ1ZmZlciA9IGNvbnRleHRbOCAvKiBIb3N0SW5zdHJ1Y3Rpb25zUXVldWUgKi9dO1xuICAgIHZhciBpbmRleCA9IGZpbmROZXh0SW5zZXJ0aW9uSW5kZXgoYnVmZmVyLCBwcmlvcml0eSk7XG4gICAgYnVmZmVyLnNwbGljZShpbmRleCwgMCwgcHJpb3JpdHksIGluc3RydWN0aW9uRm4sIGluc3RydWN0aW9uRm5BcmdzKTtcbn1cbi8qKlxuICogRmlndXJlcyBvdXQgd2hlcmUgZXhhY3RseSB0byB0byBpbnNlcnQgdGhlIG5leHQgaG9zdCBpbnN0cnVjdGlvbiBxdWV1ZSBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gZmluZE5leHRJbnNlcnRpb25JbmRleChidWZmZXIsIHByaW9yaXR5KSB7XG4gICAgZm9yICh2YXIgaSA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLzsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMyAvKiBTaXplICovKSB7XG4gICAgICAgIHZhciBwID0gYnVmZmVyW2kgKyAwIC8qIERpcmVjdGl2ZUluZGV4T2Zmc2V0ICovXTtcbiAgICAgICAgaWYgKHAgPiBwcmlvcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7XG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGhvc3QgaW5zdHJ1Y3Rpb25zIHF1ZXVlIChpZiBwcmVzZW50IHdpdGhpbiB0aGUgcHJvdmlkZWRcbiAqIGNvbnRleHQpIGFuZCBleGVjdXRlcyBlYWNoIHF1ZXVlZCBpbnN0cnVjdGlvbiBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hRdWV1ZShjb250ZXh0KSB7XG4gICAgdmFyIGJ1ZmZlciA9IGNvbnRleHRbOCAvKiBIb3N0SW5zdHJ1Y3Rpb25zUXVldWUgKi9dO1xuICAgIGlmIChidWZmZXIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLzsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMyAvKiBTaXplICovKSB7XG4gICAgICAgICAgICB2YXIgZm4gPSBidWZmZXJbaSArIDEgLyogSW5zdHJ1Y3Rpb25Gbk9mZnNldCAqL107XG4gICAgICAgICAgICB2YXIgYXJncyA9IGJ1ZmZlcltpICsgMiAvKiBQYXJhbXNPZmZzZXQgKi9dO1xuICAgICAgICAgICAgZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLmxlbmd0aCA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLztcbiAgICB9XG59XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gYWxsb3cgdGhlIGhvc3QgaW5zdHJ1Y3Rpb25zIHF1ZXVlIHRvIGJlIGZsdXNoZWQgb3Igbm90LlxuICpcbiAqIEJlY2F1c2UgdGhlIGhvc3RCaW5kaW5ncyBmdW5jdGlvbiBjb2RlIGlzIHVuYXdhcmUgb2YgdGhlIHByZXNlbmNlIG9mIG90aGVyIGhvc3QgYmluZGluZ3NcbiAqIChhcyB3ZWxsIGFzIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbikgdGhlbiBzdHlsaW5nIGlzIGV2YWx1YXRlZCBtdWx0aXBsZSB0aW1lcyBwZXIgZWxlbWVudC5cbiAqIFRvIHByZXZlbnQgc3R5bGUgYW5kIGNsYXNzIHZhbHVlcyBmcm9tIGJlaW5nIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgbXVsdGlwbGUgdGltZXMsIGFcbiAqIGZsdXNoIGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSBsYXN0IGRpcmVjdGl2ZSAodGhlIGRpcmVjdGl2ZSB0aGF0IHdhcyByZWdpc3RlcmVkIGludG9cbiAqIHRoZSBzdHlsaW5nIGNvbnRleHQpIGF0dGVtcHRzIHRvIHJlbmRlciBpdHMgc3R5bGluZy5cbiAqL1xuZnVuY3Rpb24gYWxsb3dGbHVzaChjb250ZXh0LCBkaXJlY3RpdmVJbmRleCkge1xuICAgIHZhciBidWZmZXIgPSBjb250ZXh0WzggLyogSG9zdEluc3RydWN0aW9uc1F1ZXVlICovXTtcbiAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBidWZmZXJbMCAvKiBMYXN0UmVnaXN0ZXJlZERpcmVjdGl2ZUluZGV4UG9zaXRpb24gKi9dID09PVxuICAgICAgICAgICAgZGlyZWN0aXZlSW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbWJpbmVzIHRoZSBiaW5kaW5nIHZhbHVlIGFuZCBhIGZhY3RvcnkgZm9yIGFuIGFuaW1hdGlvbiBwbGF5ZXIuXG4gKlxuICogVXNlZCB0byBiaW5kIGEgcGxheWVyIHRvIGFuIGVsZW1lbnQgdGVtcGxhdGUgYmluZGluZyAoY3VycmVudGx5IG9ubHlcbiAqIGBbc3R5bGVdYCwgYFtzdHlsZS5wcm9wXWAsIGBbY2xhc3NdYCBhbmQgYFtjbGFzcy5uYW1lXWAgYmluZGluZ3NcbiAqIHN1cHBvcnRlZCkuIFRoZSBwcm92aWRlZCBgZmFjdG9yeUZuYCBmdW5jdGlvbiB3aWxsIGJlIHJ1biBvbmNlIGFsbFxuICogdGhlIGFzc29jaWF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIGV2YWx1YXRlZCBvbiB0aGUgZWxlbWVudCBhbmQgaXNcbiAqIGRlc2lnbmVkIHRvIHJldHVybiBhIHBsYXllciB3aGljaCB3aWxsIHRoZW4gYmUgcGxhY2VkIG9uIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5Rm4gVGhlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgYSBwbGF5ZXJcbiAqICAgb25jZSBhbGwgdGhlIHJlbmRlcmluZy1yZWxhdGVkIChzdHlsaW5nIHZhbHVlcykgaGF2ZSBiZWVuXG4gKiAgIHByb2Nlc3NlZCBmb3IgdGhlIGVsZW1lbnQgYmluZGluZy5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgcmF3IHZhbHVlIHRoYXQgd2lsbCBiZSBleHBvc2VkIHRvIHRoZSBiaW5kaW5nXG4gKiAgIHNvIHRoYXQgdGhlIGJpbmRpbmcgY2FuIHVwZGF0ZSBpdHMgaW50ZXJuYWwgdmFsdWVzIHdoZW5cbiAqICAgYW55IGNoYW5nZXMgYXJlIGV2YWx1YXRlZC5cbiAqL1xuZnVuY3Rpb24gYmluZFBsYXllckZhY3RvcnkoZmFjdG9yeUZuLCB2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgQm91bmRQbGF5ZXJGYWN0b3J5KGZhY3RvcnlGbiwgdmFsdWUpO1xufVxudmFyIEJvdW5kUGxheWVyRmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCb3VuZFBsYXllckZhY3RvcnkoZm4sIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gQm91bmRQbGF5ZXJGYWN0b3J5O1xufSgpKTtcblxuLyoqXG4gKiBUaGlzIGZpbGUgaW5jbHVkZXMgdGhlIGNvZGUgdG8gcG93ZXIgYWxsIHN0eWxpbmctYmluZGluZyBvcGVyYXRpb25zIGluIEFuZ3VsYXIuXG4gKlxuICogVGhlc2UgaW5jbHVkZTpcbiAqIFtzdHlsZV09XCJteVN0eWxlT2JqXCJcbiAqIFtjbGFzc109XCJteUNsYXNzT2JqXCJcbiAqIFtzdHlsZS5wcm9wXT1cIm15UHJvcFZhbHVlXCJcbiAqIFtjbGFzcy5uYW1lXT1cIm15Q2xhc3NWYWx1ZVwiXG4gKlxuICogSXQgYWxzbyBpbmNsdWRlcyBjb2RlIHRoYXQgd2lsbCBhbGxvdyBzdHlsZSBiaW5kaW5nIGNvZGUgdG8gb3BlcmF0ZSB3aXRoaW4gaG9zdFxuICogYmluZGluZ3MgZm9yIGNvbXBvbmVudHMvZGlyZWN0aXZlcy5cbiAqXG4gKiBUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgd2F5cyBpbiB3aGljaCB0aGVzZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZC4gUGxlYXNlIHNlZVxuICogYHJlbmRlcjMvaW50ZXJmYWNlcy9zdHlsaW5nLnRzYCB0byBnZXQgYSBiZXR0ZXIgaWRlYSBvZiBob3cgdGhlIHN0eWxpbmcgYWxnb3JpdGhtIHdvcmtzLlxuICovXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU3R5bGluZ0NvbnRleHQgYW4gZmlsbHMgaXQgd2l0aCB0aGUgcHJvdmlkZWQgc3RhdGljIHN0eWxpbmcgYXR0cmlidXRlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZVN0YXRpY0NvbnRleHQoYXR0cnMsIHN0eWxpbmdTdGFydEluZGV4LCBkaXJlY3RpdmVJbmRleCkge1xuICAgIGlmIChkaXJlY3RpdmVJbmRleCA9PT0gdm9pZCAwKSB7IGRpcmVjdGl2ZUluZGV4ID0gMDsgfVxuICAgIHZhciBjb250ZXh0ID0gY3JlYXRlRW1wdHlTdHlsaW5nQ29udGV4dCgpO1xuICAgIHBhdGNoQ29udGV4dFdpdGhTdGF0aWNBdHRycyhjb250ZXh0LCBhdHRycywgc3R5bGluZ1N0YXJ0SW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8qKlxuICogRGVzaWduZWQgdG8gdXBkYXRlIGFuIGV4aXN0aW5nIHN0eWxpbmcgY29udGV4dCB3aXRoIG5ldyBzdGF0aWMgc3R5bGluZ1xuICogZGF0YSAoY2xhc3NlcyBhbmQgc3R5bGVzKS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgZXhpc3Rpbmcgc3R5bGluZyBjb250ZXh0XG4gKiBAcGFyYW0gYXR0cnMgYW4gYXJyYXkgb2YgbmV3IHN0YXRpYyBzdHlsaW5nIGF0dHJpYnV0ZXMgdGhhdCB3aWxsIGJlXG4gKiAgICAgICAgICAgICAgYXNzaWduZWQgdG8gdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBhdHRyc1N0eWxpbmdTdGFydEluZGV4IHdoYXQgaW5kZXggdG8gc3RhcnQgaXRlcmF0aW5nIHdpdGhpbiB0aGVcbiAqICAgICAgICAgICAgICBwcm92aWRlZCBgYXR0cnNgIGFycmF5IHRvIHN0YXJ0IHJlYWRpbmcgc3R5bGUgYW5kIGNsYXNzIHZhbHVlc1xuICovXG5mdW5jdGlvbiBwYXRjaENvbnRleHRXaXRoU3RhdGljQXR0cnMoY29udGV4dCwgYXR0cnMsIGF0dHJzU3R5bGluZ1N0YXJ0SW5kZXgsIGRpcmVjdGl2ZUluZGV4KSB7XG4gICAgLy8gdGhpcyBtZWFucyB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIHNldCBhbmQgaW5zdGFudGlhdGVkXG4gICAgaWYgKGNvbnRleHRbMSAvKiBNYXN0ZXJGbGFnUG9zaXRpb24gKi9dICYgMTYgLyogQmluZGluZ0FsbG9jYXRpb25Mb2NrZWQgKi8pXG4gICAgICAgIHJldHVybjtcbiAgICBhbGxvY2F0ZU9yVXBkYXRlRGlyZWN0aXZlSW50b0NvbnRleHQoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgpO1xuICAgIHZhciBpbml0aWFsQ2xhc3NlcyA9IG51bGw7XG4gICAgdmFyIGluaXRpYWxTdHlsZXMgPSBudWxsO1xuICAgIHZhciBtb2RlID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IGF0dHJzU3R5bGluZ1N0YXJ0SW5kZXg7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYXR0ciA9IGF0dHJzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGF0dHIgPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG1vZGUgPSBhdHRyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMSAvKiBDbGFzc2VzICovKSB7XG4gICAgICAgICAgICBpbml0aWFsQ2xhc3NlcyA9IGluaXRpYWxDbGFzc2VzIHx8IGNvbnRleHRbNCAvKiBJbml0aWFsQ2xhc3NWYWx1ZXNQb3NpdGlvbiAqL107XG4gICAgICAgICAgICBwYXRjaEluaXRpYWxTdHlsaW5nVmFsdWUoaW5pdGlhbENsYXNzZXMsIGF0dHIsIHRydWUsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RlID09IDIgLyogU3R5bGVzICovKSB7XG4gICAgICAgICAgICBpbml0aWFsU3R5bGVzID0gaW5pdGlhbFN0eWxlcyB8fCBjb250ZXh0WzMgLyogSW5pdGlhbFN0eWxlVmFsdWVzUG9zaXRpb24gKi9dO1xuICAgICAgICAgICAgcGF0Y2hJbml0aWFsU3R5bGluZ1ZhbHVlKGluaXRpYWxTdHlsZXMsIGF0dHIsIGF0dHJzWysraV0sIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogRGVzaWduZWQgdG8gYWRkIGEgc3R5bGUgb3IgY2xhc3MgdmFsdWUgaW50byB0aGUgZXhpc3Rpbmcgc2V0IG9mIGluaXRpYWwgc3R5bGVzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiB3aWxsIHNlYXJjaCBhbmQgZmlndXJlIG91dCBpZiBhIHN0eWxlL2NsYXNzIHZhbHVlIGlzIGFscmVhZHkgcHJlc2VudFxuICogd2l0aGluIHRoZSBwcm92aWRlZCBpbml0aWFsIHN0eWxpbmcgYXJyYXkuIElmIGFuZCB3aGVuIGEgc3R5bGUvY2xhc3MgdmFsdWUgaXNcbiAqIHByZXNlbnQgKGFsbG9jYXRlZCkgdGhlbiB0aGUgY29kZSBiZWxvdyB3aWxsIHNldCB0aGUgbmV3IHZhbHVlIGRlcGVuZGluZyBvbiB0aGVcbiAqIGZvbGxvd2luZyBjYXNlczpcbiAqXG4gKiAgMSkgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIGZhbHN5ICh0aGlzIGhhcHBlbnMgYmVjYXVzZSBhIGBbY2xhc3MucHJvcF1gIG9yXG4gKiAgICAgYFtzdHlsZS5wcm9wXWAgYmluZGluZyB3YXMgc2V0LCBidXQgdGhlcmUgd2Fzbid0IGEgbWF0Y2hpbmcgc3RhdGljIHN0eWxlXG4gKiAgICAgb3IgY2xhc3MgcHJlc2VudCBvbiB0aGUgY29udGV4dClcbiAqICAyKSBpZiB0aGUgdmFsdWUgd2FzIHNldCBhbHJlYWR5IGJ5IHRoZSB0ZW1wbGF0ZSwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSwgYnV0IHRoZVxuICogICAgIG5ldyB2YWx1ZSBpcyBzZXQgb24gYSBoaWdoZXIgbGV2ZWwgKGkuZS4gYSBzdWIgY29tcG9uZW50IHdoaWNoIGV4dGVuZHMgYSBwYXJlbnRcbiAqICAgICBjb21wb25lbnQgc2V0cyBpdHMgdmFsdWUgYWZ0ZXIgdGhlIHBhcmVudCBoYXMgYWxyZWFkeSBzZXQgdGhlIHNhbWUgb25lKVxuICogIDMpIGlmIHRoZSBzYW1lIGRpcmVjdGl2ZSBwcm92aWRlcyBhIG5ldyBzZXQgb2Ygc3R5bGluZyB2YWx1ZXMgdG8gc2V0XG4gKlxuICogQHBhcmFtIGluaXRpYWxTdHlsaW5nIHRoZSBpbml0aWFsIHN0eWxpbmcgYXJyYXkgd2hlcmUgdGhlIG5ldyBzdHlsaW5nIGVudHJ5IHdpbGwgYmUgYWRkZWQgdG9cbiAqIEBwYXJhbSBwcm9wIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiB0aGUgbmV3IGVudHJ5IChlLmcuIGB3aWR0aGAgKHN0eWxlcykgb3IgYGZvb2AgKGNsYXNzZXMpKVxuICogQHBhcmFtIHZhbHVlIHRoZSBzdHlsaW5nIHZhbHVlIG9mIHRoZSBuZXcgZW50cnkgKGUuZy4gYGFic29sdXRlYCAoc3R5bGVzKSBvciBgdHJ1ZWAgKGNsYXNzZXMpKVxuICogQHBhcmFtIGRpcmVjdGl2ZU93bmVySW5kZXggdGhlIGRpcmVjdGl2ZSBvd25lciBpbmRleCB2YWx1ZSBvZiB0aGUgc3R5bGluZyBzb3VyY2UgcmVzcG9uc2libGVcbiAqICAgICAgICBmb3IgdGhlc2Ugc3R5bGVzIChzZWUgYGludGVyZmFjZXMvc3R5bGluZy50cyNkaXJlY3RpdmVzYCBmb3IgbW9yZSBpbmZvKVxuICovXG5mdW5jdGlvbiBwYXRjaEluaXRpYWxTdHlsaW5nVmFsdWUoaW5pdGlhbFN0eWxpbmcsIHByb3AsIHZhbHVlLCBkaXJlY3RpdmVPd25lckluZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IDIgLyogS2V5VmFsdWVTdGFydFBvc2l0aW9uICovOyBpIDwgaW5pdGlhbFN0eWxpbmcubGVuZ3RoOyBpICs9IDMgLyogU2l6ZSAqLykge1xuICAgICAgICB2YXIga2V5ID0gaW5pdGlhbFN0eWxpbmdbaSArIDAgLyogUHJvcE9mZnNldCAqL107XG4gICAgICAgIGlmIChrZXkgPT09IHByb3ApIHtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ1ZhbHVlID0gaW5pdGlhbFN0eWxpbmdbaSArIDEgLyogVmFsdWVPZmZzZXQgKi9dO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nT3duZXIgPSBpbml0aWFsU3R5bGluZ1tpICsgMiAvKiBEaXJlY3RpdmVPd25lck9mZnNldCAqL107XG4gICAgICAgICAgICBpZiAoYWxsb3dWYWx1ZUNoYW5nZShleGlzdGluZ1ZhbHVlLCB2YWx1ZSwgZXhpc3RpbmdPd25lciwgZGlyZWN0aXZlT3duZXJJbmRleCkpIHtcbiAgICAgICAgICAgICAgICBhZGRPclVwZGF0ZVN0YXRpY1N0eWxlKGksIGluaXRpYWxTdHlsaW5nLCBwcm9wLCB2YWx1ZSwgZGlyZWN0aXZlT3duZXJJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgZGlkIG5vdCBmaW5kIGV4aXN0aW5nIGtleSwgYWRkIGEgbmV3IG9uZS5cbiAgICBhZGRPclVwZGF0ZVN0YXRpY1N0eWxlKG51bGwsIGluaXRpYWxTdHlsaW5nLCBwcm9wLCB2YWx1ZSwgZGlyZWN0aXZlT3duZXJJbmRleCk7XG59XG4vKipcbiAqIFJ1bnMgdGhyb3VnaCB0aGUgaW5pdGlhbCBjbGFzcyB2YWx1ZXMgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWRcbiAqIGNvbnRleHQgYW5kIHJlbmRlcnMgdGhlbSB2aWEgdGhlIHByb3ZpZGVkIHJlbmRlcmVyIG9uIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRoZSBzdHlsaW5nIHdpbGwgYmUgYXBwbGllZCB0b1xuICogQHBhcmFtIGNvbnRleHQgdGhlIHNvdXJjZSBzdHlsaW5nIGNvbnRleHQgd2hpY2ggY29udGFpbnMgdGhlIGluaXRpYWwgY2xhc3MgdmFsdWVzXG4gKiBAcGFyYW0gcmVuZGVyZXIgdGhlIHJlbmRlcmVyIGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFwcGx5IHRoZSBjbGFzc1xuICogQHJldHVybnMgdGhlIGluZGV4IHRoYXQgdGhlIGNsYXNzZXMgd2VyZSBhcHBsaWVkIHVwIHVudGlsXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckluaXRpYWxDbGFzc2VzKGVsZW1lbnQsIGNvbnRleHQsIHJlbmRlcmVyLCBzdGFydEluZGV4KSB7XG4gICAgdmFyIGluaXRpYWxDbGFzc2VzID0gY29udGV4dFs0IC8qIEluaXRpYWxDbGFzc1ZhbHVlc1Bvc2l0aW9uICovXTtcbiAgICB2YXIgaSA9IHN0YXJ0SW5kZXggfHwgMiAvKiBLZXlWYWx1ZVN0YXJ0UG9zaXRpb24gKi87XG4gICAgd2hpbGUgKGkgPCBpbml0aWFsQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaW5pdGlhbENsYXNzZXNbaSArIDEgLyogVmFsdWVPZmZzZXQgKi9dO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldENsYXNzKGVsZW1lbnQsIGluaXRpYWxDbGFzc2VzW2kgKyAwIC8qIFByb3BPZmZzZXQgKi9dLCB0cnVlLCByZW5kZXJlciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaSArPSAzIC8qIFNpemUgKi87XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuLyoqXG4gKiBSdW5zIHRocm91Z2ggdGhlIGluaXRpYWwgc3R5bGVzIHZhbHVlcyBwcmVzZW50IGluIHRoZSBwcm92aWRlZFxuICogY29udGV4dCBhbmQgcmVuZGVycyB0aGVtIHZpYSB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgb24gdGhlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdGhlIHN0eWxpbmcgd2lsbCBiZSBhcHBsaWVkIHRvXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgc291cmNlIHN0eWxpbmcgY29udGV4dCB3aGljaCBjb250YWlucyB0aGUgaW5pdGlhbCBjbGFzcyB2YWx1ZXNcbiAqIEBwYXJhbSByZW5kZXJlciB0aGUgcmVuZGVyZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYXBwbHkgdGhlIGNsYXNzXG4gKiBAcmV0dXJucyB0aGUgaW5kZXggdGhhdCB0aGUgc3R5bGVzIHdlcmUgYXBwbGllZCB1cCB1bnRpbFxuICovXG5mdW5jdGlvbiByZW5kZXJJbml0aWFsU3R5bGVzKGVsZW1lbnQsIGNvbnRleHQsIHJlbmRlcmVyLCBzdGFydEluZGV4KSB7XG4gICAgdmFyIGluaXRpYWxTdHlsZXMgPSBjb250ZXh0WzMgLyogSW5pdGlhbFN0eWxlVmFsdWVzUG9zaXRpb24gKi9dO1xuICAgIHZhciBpID0gc3RhcnRJbmRleCB8fCAyIC8qIEtleVZhbHVlU3RhcnRQb3NpdGlvbiAqLztcbiAgICB3aGlsZSAoaSA8IGluaXRpYWxTdHlsZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluaXRpYWxTdHlsZXNbaSArIDEgLyogVmFsdWVPZmZzZXQgKi9dO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldFN0eWxlKGVsZW1lbnQsIGluaXRpYWxTdHlsZXNbaSArIDAgLyogUHJvcE9mZnNldCAqL10sIHZhbHVlLCByZW5kZXJlciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaSArPSAzIC8qIFNpemUgKi87XG4gICAgfVxuICAgIHJldHVybiBpO1xufVxuLyoqXG4gKiBBZGRzIGluIG5ldyBiaW5kaW5nIHZhbHVlcyB0byBhIHN0eWxpbmcgY29udGV4dC5cbiAqXG4gKiBJZiBhIGRpcmVjdGl2ZSB2YWx1ZSBpcyBwcm92aWRlZCB0aGVuIGFsbCBwcm92aWRlZCBjbGFzcy9zdHlsZSBiaW5kaW5nIG5hbWVzIHdpbGxcbiAqIHJlZmVyZW5jZSB0aGUgcHJvdmlkZWQgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IHRoZSBleGlzdGluZyBzdHlsaW5nIGNvbnRleHRcbiAqIEBwYXJhbSBjbGFzc0JpbmRpbmdOYW1lcyBhbiBhcnJheSBvZiBjbGFzcyBiaW5kaW5nIG5hbWVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udGV4dFxuICogQHBhcmFtIHN0eWxlQmluZGluZ05hbWVzIGFuIGFycmF5IG9mIHN0eWxlIGJpbmRpbmcgbmFtZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0gc3R5bGVTYW5pdGl6ZXIgYW4gb3B0aW9uYWwgc2FuaXRpemVyIHRoYXQgaGFuZGxlIGFsbCBzYW5pdGl6YXRpb24gb24gZm9yIGVhY2ggb2ZcbiAqICAgIHRoZSBiaW5kaW5ncyBhZGRlZCB0byB0aGUgY29udGV4dC4gTm90ZSB0aGF0IGlmIGEgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHRoZW4gdGhlIHNhbml0aXplclxuICogICAgaW5zdGFuY2Ugd2lsbCBvbmx5IGJlIGFjdGl2ZSBpZiBhbmQgd2hlbiB0aGUgZGlyZWN0aXZlIHVwZGF0ZXMgdGhlIGJpbmRpbmdzIHRoYXQgaXQgb3ducy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ29udGV4dFdpdGhCaW5kaW5ncyhjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgY2xhc3NCaW5kaW5nTmFtZXMsIHN0eWxlQmluZGluZ05hbWVzLCBzdHlsZVNhbml0aXplcikge1xuICAgIGlmIChjb250ZXh0WzEgLyogTWFzdGVyRmxhZ1Bvc2l0aW9uICovXSAmIDE2IC8qIEJpbmRpbmdBbGxvY2F0aW9uTG9ja2VkICovKVxuICAgICAgICByZXR1cm47XG4gICAgLy8gdGhpcyBtZWFucyB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgd2l0aCB0aGUgZGlyZWN0aXZlJ3MgYmluZGluZ3NcbiAgICB2YXIgaXNOZXdEaXJlY3RpdmUgPSBmaW5kT3JQYXRjaERpcmVjdGl2ZUludG9SZWdpc3RyeShjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgZmFsc2UsIHN0eWxlU2FuaXRpemVyKTtcbiAgICBpZiAoIWlzTmV3RGlyZWN0aXZlKSB7XG4gICAgICAgIC8vIHRoaXMgbWVhbnMgdGhlIGRpcmVjdGl2ZSBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgaW4gLi4uIE5vIHBvaW50IGluIGRvaW5nIGFueXRoaW5nXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0eWxlQmluZGluZ05hbWVzKSB7XG4gICAgICAgIHN0eWxlQmluZGluZ05hbWVzID0gaHlwaGVuYXRlRW50cmllcyhzdHlsZUJpbmRpbmdOYW1lcyk7XG4gICAgfVxuICAgIC8vIHRoZXJlIGFyZSBhbG90IG9mIHZhcmlhYmxlcyBiZWluZyB1c2VkIGJlbG93IHRvIHRyYWNrIHdoZXJlIGluIHRoZSBjb250ZXh0IHRoZSBuZXdcbiAgICAvLyBiaW5kaW5nIHZhbHVlcyB3aWxsIGJlIHBsYWNlZC4gQmVjYXVzZSB0aGUgY29udGV4dCBjb25zaXN0cyBvZiBtdWx0aXBsZSB0eXBlcyBvZlxuICAgIC8vIGVudHJpZXMgKHNpbmdsZSBjbGFzc2VzL3N0eWxlcyBhbmQgbXVsdGkgY2xhc3Nlcy9zdHlsZXMpIGFsb3Qgb2YgdGhlIGluZGV4IHBvc2l0aW9uc1xuICAgIC8vIG5lZWQgdG8gYmUgY29tcHV0ZWQgYWhlYWQgb2YgdGltZSBhbmQgdGhlIGNvbnRleHQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgYmVmb3JlIHRoZSB2YWx1ZXNcbiAgICAvLyBhcmUgaW5zZXJ0ZWQgaW4uXG4gICAgdmFyIHNpbmdsZVByb3BPZmZzZXRWYWx1ZXMgPSBjb250ZXh0WzUgLyogU2luZ2xlUHJvcE9mZnNldFBvc2l0aW9ucyAqL107XG4gICAgdmFyIHRvdGFsQ3VycmVudENsYXNzQmluZGluZ3MgPSBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzWzEgLyogQ2xhc3Nlc0NvdW50UG9zaXRpb24gKi9dO1xuICAgIHZhciB0b3RhbEN1cnJlbnRTdHlsZUJpbmRpbmdzID0gc2luZ2xlUHJvcE9mZnNldFZhbHVlc1swIC8qIFN0eWxlc0NvdW50UG9zaXRpb24gKi9dO1xuICAgIHZhciBjYWNoZWRDbGFzc01hcFZhbHVlcyA9IGNvbnRleHRbNiAvKiBDYWNoZWRNdWx0aUNsYXNzZXMgKi9dO1xuICAgIHZhciBjYWNoZWRTdHlsZU1hcFZhbHVlcyA9IGNvbnRleHRbNyAvKiBDYWNoZWRNdWx0aVN0eWxlcyAqL107XG4gICAgdmFyIGNsYXNzZXNPZmZzZXQgPSB0b3RhbEN1cnJlbnRDbGFzc0JpbmRpbmdzICogNCAvKiBTaXplICovO1xuICAgIHZhciBzdHlsZXNPZmZzZXQgPSB0b3RhbEN1cnJlbnRTdHlsZUJpbmRpbmdzICogNCAvKiBTaXplICovO1xuICAgIHZhciBzaW5nbGVTdHlsZXNTdGFydEluZGV4ID0gMTAgLyogU2luZ2xlU3R5bGVzU3RhcnRQb3NpdGlvbiAqLztcbiAgICB2YXIgc2luZ2xlQ2xhc3Nlc1N0YXJ0SW5kZXggPSBzaW5nbGVTdHlsZXNTdGFydEluZGV4ICsgc3R5bGVzT2Zmc2V0O1xuICAgIHZhciBtdWx0aVN0eWxlc1N0YXJ0SW5kZXggPSBzaW5nbGVDbGFzc2VzU3RhcnRJbmRleCArIGNsYXNzZXNPZmZzZXQ7XG4gICAgdmFyIG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggPSBtdWx0aVN0eWxlc1N0YXJ0SW5kZXggKyBzdHlsZXNPZmZzZXQ7XG4gICAgLy8gYmVjYXVzZSB3ZSdyZSBpbnNlcnRpbmcgbW9yZSBiaW5kaW5ncyBpbnRvIHRoZSBjb250ZXh0LCB0aGlzIG1lYW5zIHRoYXQgdGhlXG4gICAgLy8gYmluZGluZyB2YWx1ZXMgbmVlZCB0byBiZSByZWZlcmVuY2VkIHRoZSBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzIGFycmF5IHNvIHRoYXRcbiAgICAvLyB0aGUgdGVtcGxhdGUvZGlyZWN0aXZlIGNhbiBlYXNpbHkgZmluZCB0aGVtIGluc2lkZSBvZiB0aGUgYGVsZW1lbnRTdHlsZVByb3BgXG4gICAgLy8gYW5kIHRoZSBgZWxlbWVudENsYXNzUHJvcGAgZnVuY3Rpb25zIHdpdGhvdXQgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVudGlyZSBjb250ZXh0LlxuICAgIC8vIFRoZSBmaXJzdCBzdGVwIHRvIHNldHRpbmcgdXAgdGhlc2UgcmVmZXJlbmNlIHBvaW50cyBpcyB0byBtYXJrIGhvdyBtYW55IGJpbmRpbmdzXG4gICAgLy8gYXJlIGJlaW5nIGFkZGVkLiBFdmVuIGlmIHRoZXNlIGJpbmRpbmdzIGFscmVhZHkgZXhpc3QgaW4gdGhlIGNvbnRleHQsIHRoZSBkaXJlY3RpdmVcbiAgICAvLyBvciB0ZW1wbGF0ZSBjb2RlIHdpbGwgc3RpbGwgY2FsbCB0aGVtIHVua25vd2luZ2x5LiBUaGVyZWZvcmUgdGhlIHRvdGFsIHZhbHVlcyBuZWVkXG4gICAgLy8gdG8gYmUgcmVnaXN0ZXJlZCBzbyB0aGF0IHdlIGtub3cgaG93IG1hbnkgYmluZGluZ3MgYXJlIGFzc2lnbmVkIHRvIGVhY2ggZGlyZWN0aXZlLlxuICAgIHZhciBjdXJyZW50U2luZ2xlUHJvcHNMZW5ndGggPSBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzLmxlbmd0aDtcbiAgICBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzLnB1c2goc3R5bGVCaW5kaW5nTmFtZXMgPyBzdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGggOiAwLCBjbGFzc0JpbmRpbmdOYW1lcyA/IGNsYXNzQmluZGluZ05hbWVzLmxlbmd0aCA6IDApO1xuICAgIC8vIHRoZSBjb2RlIGJlbG93IHdpbGwgY2hlY2sgdG8gc2VlIGlmIGEgbmV3IHN0eWxlIGJpbmRpbmcgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNvbnRleHRcbiAgICAvLyBpZiBzbyB0aGVuIHRoZXJlIGlzIG5vIHBvaW50IGluIGluc2VydGluZyBpdCBpbnRvIHRoZSBjb250ZXh0IGFnYWluLiBXaGV0aGVyIG9yIG5vdCBpdFxuICAgIC8vIGV4aXN0cyB0aGUgc3R5bGluZyBvZmZzZXQgY29kZSB3aWxsIG5vdyBrbm93IGV4YWN0bHkgd2hlcmUgaXQgaXNcbiAgICB2YXIgaW5zZXJ0aW9uT2Zmc2V0ID0gMDtcbiAgICB2YXIgZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcyA9IFtdO1xuICAgIGlmIChzdHlsZUJpbmRpbmdOYW1lcyAmJiBzdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgZm9yICh2YXIgaV8xID0gMDsgaV8xIDwgc3R5bGVCaW5kaW5nTmFtZXMubGVuZ3RoOyBpXzErKykge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHN0eWxlQmluZGluZ05hbWVzW2lfMV07XG4gICAgICAgICAgICB2YXIgc2luZ2xlUHJvcEluZGV4ID0gZ2V0TWF0Y2hpbmdCaW5kaW5nSW5kZXgoY29udGV4dCwgbmFtZV8xLCBzaW5nbGVTdHlsZXNTdGFydEluZGV4LCBzaW5nbGVDbGFzc2VzU3RhcnRJbmRleCk7XG4gICAgICAgICAgICBpZiAoc2luZ2xlUHJvcEluZGV4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgc2luZ2xlUHJvcEluZGV4ID0gc2luZ2xlQ2xhc3Nlc1N0YXJ0SW5kZXggKyBpbnNlcnRpb25PZmZzZXQ7XG4gICAgICAgICAgICAgICAgaW5zZXJ0aW9uT2Zmc2V0ICs9IDQgLyogU2l6ZSAqLztcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzLnB1c2gobmFtZV8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpbmdsZVByb3BPZmZzZXRWYWx1ZXMucHVzaChzaW5nbGVQcm9wSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGp1c3QgbGlrZSB3aXRoIHRoZSBzdHlsZSBiaW5kaW5nIGxvb3AgYWJvdmUsIHRoZSBuZXcgY2xhc3MgYmluZGluZ3MgZ2V0IHRoZSBzYW1lIHRyZWF0bWVudC4uLlxuICAgIHZhciBmaWx0ZXJlZENsYXNzQmluZGluZ05hbWVzID0gW107XG4gICAgaWYgKGNsYXNzQmluZGluZ05hbWVzICYmIGNsYXNzQmluZGluZ05hbWVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKHZhciBpXzIgPSAwOyBpXzIgPCBjbGFzc0JpbmRpbmdOYW1lcy5sZW5ndGg7IGlfMisrKSB7XG4gICAgICAgICAgICB2YXIgbmFtZV8yID0gY2xhc3NCaW5kaW5nTmFtZXNbaV8yXTtcbiAgICAgICAgICAgIHZhciBzaW5nbGVQcm9wSW5kZXggPSBnZXRNYXRjaGluZ0JpbmRpbmdJbmRleChjb250ZXh0LCBuYW1lXzIsIHNpbmdsZUNsYXNzZXNTdGFydEluZGV4LCBtdWx0aVN0eWxlc1N0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgaWYgKHNpbmdsZVByb3BJbmRleCA9PSAtMSkge1xuICAgICAgICAgICAgICAgIHNpbmdsZVByb3BJbmRleCA9IG11bHRpU3R5bGVzU3RhcnRJbmRleCArIGluc2VydGlvbk9mZnNldDtcbiAgICAgICAgICAgICAgICBpbnNlcnRpb25PZmZzZXQgKz0gNCAvKiBTaXplICovO1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkQ2xhc3NCaW5kaW5nTmFtZXMucHVzaChuYW1lXzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2luZ2xlUHJvcEluZGV4ICs9IGZpbHRlcmVkU3R5bGVCaW5kaW5nTmFtZXMubGVuZ3RoICogNCAvKiBTaXplICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2luZ2xlUHJvcE9mZnNldFZhbHVlcy5wdXNoKHNpbmdsZVByb3BJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYmVjYXVzZSBuZXcgc3R5bGVzIGFyZSBiZWluZyBpbnNlcnRlZCwgdGhpcyBtZWFucyB0aGUgZXhpc3RpbmcgY29sbGVjdGlvbiBvZiBzdHlsZSBvZmZzZXRcbiAgICAvLyBpbmRleCB2YWx1ZXMgYXJlIGluY29ycmVjdCAodGhleSBwb2ludCB0byB0aGUgd3JvbmcgdmFsdWVzKS4gVGhlIGNvZGUgYmVsb3cgd2lsbCBydW4gdGhyb3VnaFxuICAgIC8vIHRoZSBlbnRpcmUgb2Zmc2V0IGFycmF5IGFuZCB1cGRhdGUgdGhlIGV4aXN0aW5nIHNldCBvZiBpbmRleCB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlaXIgbmV3XG4gICAgLy8gbG9jYXRpb25zIHdoaWxlIHRha2luZyB0aGUgbmV3IGJpbmRpbmcgdmFsdWVzIGludG8gY29uc2lkZXJhdGlvbi5cbiAgICB2YXIgaSA9IDIgLyogVmFsdWVTdGFydFBvc2l0aW9uICovO1xuICAgIGlmIChmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzLmxlbmd0aCkge1xuICAgICAgICB3aGlsZSAoaSA8IGN1cnJlbnRTaW5nbGVQcm9wc0xlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHRvdGFsU3R5bGVzID0gc2luZ2xlUHJvcE9mZnNldFZhbHVlc1tpICsgMCAvKiBTdHlsZXNDb3VudFBvc2l0aW9uICovXTtcbiAgICAgICAgICAgIHZhciB0b3RhbENsYXNzZXMgPSBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzW2kgKyAxIC8qIENsYXNzZXNDb3VudFBvc2l0aW9uICovXTtcbiAgICAgICAgICAgIGlmICh0b3RhbENsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBpICsgMiAvKiBWYWx1ZVN0YXJ0UG9zaXRpb24gKi8gKyB0b3RhbFN0eWxlcztcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBzdGFydCArIHRvdGFsQ2xhc3NlczsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbmdsZVByb3BPZmZzZXRWYWx1ZXNbal0gKz0gZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGggKiA0IC8qIFNpemUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRvdGFsID0gdG90YWxTdHlsZXMgKyB0b3RhbENsYXNzZXM7XG4gICAgICAgICAgICBpICs9IDIgLyogVmFsdWVTdGFydFBvc2l0aW9uICovICsgdG90YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHRvdGFsTmV3RW50cmllcyA9IGZpbHRlcmVkQ2xhc3NCaW5kaW5nTmFtZXMubGVuZ3RoICsgZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGg7XG4gICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlcmUgYXJlIG5ldyBzdHlsZSB2YWx1ZXMgYmVpbmcgaW5zZXJ0ZWQsIGFsbCBleGlzdGluZyBjbGFzcyBhbmQgc3R5bGVcbiAgICAvLyBiaW5kaW5ncyBuZWVkIHRvIGhhdmUgdGhlaXIgcG9pbnRlciB2YWx1ZXMgb2Zmc2V0dGVkIHdpdGggdGhlIG5ldyBhbW91bnQgb2Ygc3BhY2UgdGhhdCBpc1xuICAgIC8vIHVzZWQgZm9yIHRoZSBuZXcgc3R5bGUvY2xhc3MgYmluZGluZ3MuXG4gICAgZm9yICh2YXIgaV8zID0gc2luZ2xlU3R5bGVzU3RhcnRJbmRleDsgaV8zIDwgY29udGV4dC5sZW5ndGg7IGlfMyArPSA0IC8qIFNpemUgKi8pIHtcbiAgICAgICAgdmFyIGlzTXVsdGlCYXNlZCA9IGlfMyA+PSBtdWx0aVN0eWxlc1N0YXJ0SW5kZXg7XG4gICAgICAgIHZhciBpc0NsYXNzQmFzZWQgPSBpXzMgPj0gKGlzTXVsdGlCYXNlZCA/IG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggOiBzaW5nbGVDbGFzc2VzU3RhcnRJbmRleCk7XG4gICAgICAgIHZhciBmbGFnID0gZ2V0UG9pbnRlcnMoY29udGV4dCwgaV8zKTtcbiAgICAgICAgdmFyIHN0YXRpY0luZGV4ID0gZ2V0SW5pdGlhbEluZGV4KGZsYWcpO1xuICAgICAgICB2YXIgc2luZ2xlT3JNdWx0aUluZGV4ID0gZ2V0TXVsdGlPclNpbmdsZUluZGV4KGZsYWcpO1xuICAgICAgICBpZiAoaXNNdWx0aUJhc2VkKSB7XG4gICAgICAgICAgICBzaW5nbGVPck11bHRpSW5kZXggKz1cbiAgICAgICAgICAgICAgICBpc0NsYXNzQmFzZWQgPyAoZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGggKiA0IC8qIFNpemUgKi8pIDogMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNpbmdsZU9yTXVsdGlJbmRleCArPSAodG90YWxOZXdFbnRyaWVzICogNCAvKiBTaXplICovKSArXG4gICAgICAgICAgICAgICAgKChpc0NsYXNzQmFzZWQgPyBmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzLmxlbmd0aCA6IDApICogNCAvKiBTaXplICovKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRGbGFnKGNvbnRleHQsIGlfMywgcG9pbnRlcnMoZmxhZywgc3RhdGljSW5kZXgsIHNpbmdsZU9yTXVsdGlJbmRleCkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHdoZXJlIHdlIG1ha2Ugc3BhY2UgaW4gdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgc3R5bGUgYmluZGluZ3NcbiAgICBmb3IgKHZhciBpXzQgPSAwOyBpXzQgPCBmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzLmxlbmd0aCAqIDQgLyogU2l6ZSAqLzsgaV80KyspIHtcbiAgICAgICAgY29udGV4dC5zcGxpY2UobXVsdGlDbGFzc2VzU3RhcnRJbmRleCwgMCwgbnVsbCk7XG4gICAgICAgIGNvbnRleHQuc3BsaWNlKHNpbmdsZUNsYXNzZXNTdGFydEluZGV4LCAwLCBudWxsKTtcbiAgICAgICAgc2luZ2xlQ2xhc3Nlc1N0YXJ0SW5kZXgrKztcbiAgICAgICAgbXVsdGlTdHlsZXNTdGFydEluZGV4Kys7XG4gICAgICAgIG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggKz0gMjsgLy8gYm90aCBzaW5nbGUgKyBtdWx0aSBzbG90cyB3ZXJlIGluc2VydGVkXG4gICAgfVxuICAgIC8vIHRoaXMgaXMgd2hlcmUgd2UgbWFrZSBzcGFjZSBpbiB0aGUgY29udGV4dCBmb3IgdGhlIG5ldyBjbGFzcyBiaW5kaW5nc1xuICAgIGZvciAodmFyIGlfNSA9IDA7IGlfNSA8IGZpbHRlcmVkQ2xhc3NCaW5kaW5nTmFtZXMubGVuZ3RoICogNCAvKiBTaXplICovOyBpXzUrKykge1xuICAgICAgICBjb250ZXh0LnNwbGljZShtdWx0aVN0eWxlc1N0YXJ0SW5kZXgsIDAsIG51bGwpO1xuICAgICAgICBjb250ZXh0LnB1c2gobnVsbCk7XG4gICAgICAgIG11bHRpU3R5bGVzU3RhcnRJbmRleCsrO1xuICAgICAgICBtdWx0aUNsYXNzZXNTdGFydEluZGV4Kys7XG4gICAgfVxuICAgIHZhciBpbml0aWFsQ2xhc3NlcyA9IGNvbnRleHRbNCAvKiBJbml0aWFsQ2xhc3NWYWx1ZXNQb3NpdGlvbiAqL107XG4gICAgdmFyIGluaXRpYWxTdHlsZXMgPSBjb250ZXh0WzMgLyogSW5pdGlhbFN0eWxlVmFsdWVzUG9zaXRpb24gKi9dO1xuICAgIC8vIHRoZSBjb2RlIGJlbG93IHdpbGwgaW5zZXJ0IGVhY2ggbmV3IGVudHJ5IGludG8gdGhlIGNvbnRleHQgYW5kIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGVcbiAgICAvLyBmbGFncyBhbmQgaW5kZXggdmFsdWVzIHRvIHRoZW0uIEl0J3MgaW1wb3J0YW50IHRoaXMgcnVucyBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb25cbiAgICAvLyBiZWNhdXNlIHRoZSBjb250ZXh0LCBwcm9wZXJ0eSBvZmZzZXQgYW5kIGluZGV4IHZhbHVlcyBoYXZlIGFsbCBiZWVuIGNvbXB1dGVkIGp1c3QgYmVmb3JlLlxuICAgIGZvciAodmFyIGlfNiA9IDA7IGlfNiA8IHRvdGFsTmV3RW50cmllczsgaV82KyspIHtcbiAgICAgICAgdmFyIGVudHJ5SXNDbGFzc0Jhc2VkID0gaV82ID49IGZpbHRlcmVkU3R5bGVCaW5kaW5nTmFtZXMubGVuZ3RoO1xuICAgICAgICB2YXIgYWRqdXN0ZWRJbmRleCA9IGVudHJ5SXNDbGFzc0Jhc2VkID8gKGlfNiAtIGZpbHRlcmVkU3R5bGVCaW5kaW5nTmFtZXMubGVuZ3RoKSA6IGlfNjtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gZW50cnlJc0NsYXNzQmFzZWQgPyBmaWx0ZXJlZENsYXNzQmluZGluZ05hbWVzW2FkanVzdGVkSW5kZXhdIDpcbiAgICAgICAgICAgIGZpbHRlcmVkU3R5bGVCaW5kaW5nTmFtZXNbYWRqdXN0ZWRJbmRleF07XG4gICAgICAgIHZhciBtdWx0aUluZGV4ID0gdm9pZCAwLCBzaW5nbGVJbmRleCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGVudHJ5SXNDbGFzc0Jhc2VkKSB7XG4gICAgICAgICAgICBtdWx0aUluZGV4ID0gbXVsdGlDbGFzc2VzU3RhcnRJbmRleCArXG4gICAgICAgICAgICAgICAgKCh0b3RhbEN1cnJlbnRDbGFzc0JpbmRpbmdzICsgYWRqdXN0ZWRJbmRleCkgKiA0IC8qIFNpemUgKi8pO1xuICAgICAgICAgICAgc2luZ2xlSW5kZXggPSBzaW5nbGVDbGFzc2VzU3RhcnRJbmRleCArXG4gICAgICAgICAgICAgICAgKCh0b3RhbEN1cnJlbnRDbGFzc0JpbmRpbmdzICsgYWRqdXN0ZWRJbmRleCkgKiA0IC8qIFNpemUgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbXVsdGlJbmRleCA9XG4gICAgICAgICAgICAgICAgbXVsdGlTdHlsZXNTdGFydEluZGV4ICsgKCh0b3RhbEN1cnJlbnRTdHlsZUJpbmRpbmdzICsgYWRqdXN0ZWRJbmRleCkgKiA0IC8qIFNpemUgKi8pO1xuICAgICAgICAgICAgc2luZ2xlSW5kZXggPSBzaW5nbGVTdHlsZXNTdGFydEluZGV4ICtcbiAgICAgICAgICAgICAgICAoKHRvdGFsQ3VycmVudFN0eWxlQmluZGluZ3MgKyBhZGp1c3RlZEluZGV4KSAqIDQgLyogU2l6ZSAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYSBwcm9wZXJ0eSBpcyBub3QgZm91bmQgaW4gdGhlIGluaXRpYWwgc3R5bGUgdmFsdWVzIGxpc3QgdGhlbiBpdFxuICAgICAgICAvLyBpcyBBTFdBWVMgYWRkZWQgaW4gY2FzZSBhIGZvbGxvdy11cCBkaXJlY3RpdmUgaW50cm9kdWNlcyB0aGUgc2FtZSBpbml0aWFsXG4gICAgICAgIC8vIHN0eWxlL2NsYXNzIHZhbHVlIGxhdGVyIG9uLlxuICAgICAgICB2YXIgaW5pdGlhbFZhbHVlc1RvTG9va3VwID0gZW50cnlJc0NsYXNzQmFzZWQgPyBpbml0aWFsQ2xhc3NlcyA6IGluaXRpYWxTdHlsZXM7XG4gICAgICAgIHZhciBpbmRleEZvckluaXRpYWwgPSBnZXRJbml0aWFsU3R5bGluZ1ZhbHVlc0luZGV4T2YoaW5pdGlhbFZhbHVlc1RvTG9va3VwLCBwcm9wTmFtZSk7XG4gICAgICAgIGlmIChpbmRleEZvckluaXRpYWwgPT09IC0xKSB7XG4gICAgICAgICAgICBpbmRleEZvckluaXRpYWwgPSBhZGRPclVwZGF0ZVN0YXRpY1N0eWxlKG51bGwsIGluaXRpYWxWYWx1ZXNUb0xvb2t1cCwgcHJvcE5hbWUsIGVudHJ5SXNDbGFzc0Jhc2VkID8gZmFsc2UgOiBudWxsLCBkaXJlY3RpdmVJbmRleCkgK1xuICAgICAgICAgICAgICAgIDEgLyogVmFsdWVPZmZzZXQgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmRleEZvckluaXRpYWwgKz0gMSAvKiBWYWx1ZU9mZnNldCAqLztcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5pdGlhbEZsYWcgPSBwcmVwYXJlSW5pdGlhbEZsYWcoY29udGV4dCwgcHJvcE5hbWUsIGVudHJ5SXNDbGFzc0Jhc2VkLCBzdHlsZVNhbml0aXplciB8fCBudWxsKTtcbiAgICAgICAgc2V0RmxhZyhjb250ZXh0LCBzaW5nbGVJbmRleCwgcG9pbnRlcnMoaW5pdGlhbEZsYWcsIGluZGV4Rm9ySW5pdGlhbCwgbXVsdGlJbmRleCkpO1xuICAgICAgICBzZXRQcm9wKGNvbnRleHQsIHNpbmdsZUluZGV4LCBwcm9wTmFtZSk7XG4gICAgICAgIHNldFZhbHVlKGNvbnRleHQsIHNpbmdsZUluZGV4LCBudWxsKTtcbiAgICAgICAgc2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIHNpbmdsZUluZGV4LCAwLCBkaXJlY3RpdmVJbmRleCk7XG4gICAgICAgIHNldEZsYWcoY29udGV4dCwgbXVsdGlJbmRleCwgcG9pbnRlcnMoaW5pdGlhbEZsYWcsIGluZGV4Rm9ySW5pdGlhbCwgc2luZ2xlSW5kZXgpKTtcbiAgICAgICAgc2V0UHJvcChjb250ZXh0LCBtdWx0aUluZGV4LCBwcm9wTmFtZSk7XG4gICAgICAgIHNldFZhbHVlKGNvbnRleHQsIG11bHRpSW5kZXgsIG51bGwpO1xuICAgICAgICBzZXRQbGF5ZXJCdWlsZGVySW5kZXgoY29udGV4dCwgbXVsdGlJbmRleCwgMCwgZGlyZWN0aXZlSW5kZXgpO1xuICAgIH1cbiAgICAvLyB0aGUgdG90YWwgY2xhc3Nlcy9zdHlsZSB2YWx1ZXMgYXJlIHVwZGF0ZWQgc28gdGhlIG5leHQgdGltZSB0aGUgY29udGV4dCBpcyBwYXRjaGVkXG4gICAgLy8gYWRkaXRpb25hbCBzdHlsZS9jbGFzcyBiaW5kaW5ncyBmcm9tIGFub3RoZXIgZGlyZWN0aXZlIHRoZW4gaXQga25vd3MgZXhhY3RseSB3aGVyZVxuICAgIC8vIHRvIGluc2VydCB0aGVtIGluIHRoZSBjb250ZXh0XG4gICAgc2luZ2xlUHJvcE9mZnNldFZhbHVlc1sxIC8qIENsYXNzZXNDb3VudFBvc2l0aW9uICovXSA9XG4gICAgICAgIHRvdGFsQ3VycmVudENsYXNzQmluZGluZ3MgKyBmaWx0ZXJlZENsYXNzQmluZGluZ05hbWVzLmxlbmd0aDtcbiAgICBzaW5nbGVQcm9wT2Zmc2V0VmFsdWVzWzAgLyogU3R5bGVzQ291bnRQb3NpdGlvbiAqL10gPVxuICAgICAgICB0b3RhbEN1cnJlbnRTdHlsZUJpbmRpbmdzICsgZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGg7XG4gICAgLy8gdGhlIG1hcC1iYXNlZCB2YWx1ZXMgYWxzbyBuZWVkIHRvIGtub3cgaG93IG1hbnkgZW50cmllcyBnb3QgaW5zZXJ0ZWRcbiAgICBjYWNoZWRDbGFzc01hcFZhbHVlc1swIC8qIEVudHJpZXNDb3VudFBvc2l0aW9uICovXSArPVxuICAgICAgICBmaWx0ZXJlZENsYXNzQmluZGluZ05hbWVzLmxlbmd0aDtcbiAgICBjYWNoZWRTdHlsZU1hcFZhbHVlc1swIC8qIEVudHJpZXNDb3VudFBvc2l0aW9uICovXSArPVxuICAgICAgICBmaWx0ZXJlZFN0eWxlQmluZGluZ05hbWVzLmxlbmd0aDtcbiAgICB2YXIgbmV3U3R5bGVzU3BhY2VBbGxvY2F0aW9uU2l6ZSA9IGZpbHRlcmVkU3R5bGVCaW5kaW5nTmFtZXMubGVuZ3RoICogNCAvKiBTaXplICovO1xuICAgIHZhciBuZXdDbGFzc2VzU3BhY2VBbGxvY2F0aW9uU2l6ZSA9IGZpbHRlcmVkQ2xhc3NCaW5kaW5nTmFtZXMubGVuZ3RoICogNCAvKiBTaXplICovO1xuICAgIC8vIHVwZGF0ZSB0aGUgbXVsdGkgc3R5bGVzIGNhY2hlIHdpdGggYSByZWZlcmVuY2UgZm9yIHRoZSBkaXJlY3RpdmUgdGhhdCB3YXMganVzdCBpbnNlcnRlZFxuICAgIHZhciBkaXJlY3RpdmVNdWx0aVN0eWxlc1N0YXJ0SW5kZXggPSBtdWx0aVN0eWxlc1N0YXJ0SW5kZXggKyB0b3RhbEN1cnJlbnRTdHlsZUJpbmRpbmdzICogNCAvKiBTaXplICovO1xuICAgIHZhciBjYWNoZWRTdHlsZU1hcEluZGV4ID0gY2FjaGVkU3R5bGVNYXBWYWx1ZXMubGVuZ3RoO1xuICAgIHJlZ2lzdGVyTXVsdGlNYXBFbnRyeShjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgZmFsc2UsIGRpcmVjdGl2ZU11bHRpU3R5bGVzU3RhcnRJbmRleCwgZmlsdGVyZWRTdHlsZUJpbmRpbmdOYW1lcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlfNyA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLzsgaV83IDwgY2FjaGVkU3R5bGVNYXBJbmRleDsgaV83ICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICAvLyBtdWx0aSB2YWx1ZXMgc3RhcnQgYWZ0ZXIgYWxsIHRoZSBzaW5nbGUgdmFsdWVzICh3aGljaCBpcyBhbHNvIHdoZXJlIGNsYXNzZXMgYXJlKSBpbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCB0aGVyZWZvcmUgdGhlIG5ldyBjbGFzcyBhbGxvY2F0aW9uIHNpemUgc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudFxuICAgICAgICBjYWNoZWRTdHlsZU1hcFZhbHVlc1tpXzcgKyAxIC8qIFBvc2l0aW9uU3RhcnRPZmZzZXQgKi9dICs9XG4gICAgICAgICAgICBuZXdDbGFzc2VzU3BhY2VBbGxvY2F0aW9uU2l6ZSArIG5ld1N0eWxlc1NwYWNlQWxsb2NhdGlvblNpemU7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSB0aGUgbXVsdGkgY2xhc3NlcyBjYWNoZSB3aXRoIGEgcmVmZXJlbmNlIGZvciB0aGUgZGlyZWN0aXZlIHRoYXQgd2FzIGp1c3QgaW5zZXJ0ZWRcbiAgICB2YXIgZGlyZWN0aXZlTXVsdGlDbGFzc2VzU3RhcnRJbmRleCA9IG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggKyB0b3RhbEN1cnJlbnRDbGFzc0JpbmRpbmdzICogNCAvKiBTaXplICovO1xuICAgIHZhciBjYWNoZWRDbGFzc01hcEluZGV4ID0gY2FjaGVkQ2xhc3NNYXBWYWx1ZXMubGVuZ3RoO1xuICAgIHJlZ2lzdGVyTXVsdGlNYXBFbnRyeShjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgdHJ1ZSwgZGlyZWN0aXZlTXVsdGlDbGFzc2VzU3RhcnRJbmRleCwgZmlsdGVyZWRDbGFzc0JpbmRpbmdOYW1lcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGlfOCA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLzsgaV84IDwgY2FjaGVkQ2xhc3NNYXBJbmRleDsgaV84ICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICAvLyB0aGUgcmVhc29uIHdoeSBib3RoIHRoZSBzdHlsZXMgKyBjbGFzc2VzIHNwYWNlIGlzIGFsbG9jYXRlZCB0byB0aGUgZXhpc3Rpbmcgb2Zmc2V0cyBpc1xuICAgICAgICAvLyBiZWNhdXNlIHRoZSBzdHlsZXMgc2hvdyB1cCBiZWZvcmUgdGhlIGNsYXNzZXMgaW4gdGhlIGNvbnRleHQgYW5kIGFueSBuZXcgaW5zZXJ0ZWRcbiAgICAgICAgLy8gc3R5bGVzIHdpbGwgb2Zmc2V0IGFueSBleGlzdGluZyBjbGFzcyBlbnRyaWVzIGluIHRoZSBjb250ZXh0IChldmVuIGlmIHRoZXJlIGFyZSBub1xuICAgICAgICAvLyBuZXcgY2xhc3MgZW50cmllcyBhZGRlZCkgYWxzbyB0aGUgcmVhc29uIHdoeSBpdCdzICoyIGlzIGJlY2F1c2UgYm90aCBzaW5nbGUgKyBtdWx0aVxuICAgICAgICAvLyBlbnRyaWVzIGZvciBlYWNoIG5ldyBzdHlsZSBoYXZlIGJlZW4gYWRkZWQgaW4gdGhlIGNvbnRleHQgYmVmb3JlIHRoZSBtdWx0aSBjbGFzcyB2YWx1ZXNcbiAgICAgICAgLy8gYWN0dWFsbHkgc3RhcnRcbiAgICAgICAgY2FjaGVkQ2xhc3NNYXBWYWx1ZXNbaV84ICsgMSAvKiBQb3NpdGlvblN0YXJ0T2Zmc2V0ICovXSArPVxuICAgICAgICAgICAgKG5ld1N0eWxlc1NwYWNlQWxsb2NhdGlvblNpemUgKiAyKSArIG5ld0NsYXNzZXNTcGFjZUFsbG9jYXRpb25TaXplO1xuICAgIH1cbiAgICAvLyB0aGVyZSBpcyBubyBpbml0aWFsIHZhbHVlIGZsYWcgZm9yIHRoZSBtYXN0ZXIgaW5kZXggc2luY2UgaXQgZG9lc24ndFxuICAgIC8vIHJlZmVyZW5jZSBhbiBpbml0aWFsIHN0eWxlIHZhbHVlXG4gICAgdmFyIG1hc3RlckZsYWcgPSBwb2ludGVycygwLCAwLCBtdWx0aVN0eWxlc1N0YXJ0SW5kZXgpO1xuICAgIHNldEZsYWcoY29udGV4dCwgMSAvKiBNYXN0ZXJGbGFnUG9zaXRpb24gKi8sIG1hc3RlckZsYWcpO1xufVxuLyoqXG4gKiBTZWFyY2hlcyB0aHJvdWdoIHRoZSBleGlzdGluZyByZWdpc3RyeSBvZiBkaXJlY3RpdmVzXG4gKi9cbmZ1bmN0aW9uIGZpbmRPclBhdGNoRGlyZWN0aXZlSW50b1JlZ2lzdHJ5KGNvbnRleHQsIGRpcmVjdGl2ZUluZGV4LCBzdGF0aWNNb2RlT25seSwgc3R5bGVTYW5pdGl6ZXIpIHtcbiAgICB2YXIgZGlyZWN0aXZlUmVnaXN0cnkgPSBjb250ZXh0WzIgLyogRGlyZWN0aXZlUmVnaXN0cnlQb3NpdGlvbiAqL107XG4gICAgdmFyIGluZGV4ID0gZGlyZWN0aXZlSW5kZXggKiAyIC8qIFNpemUgKi87XG4gICAgdmFyIHNpbmdsZVByb3BTdGFydFBvc2l0aW9uID0gaW5kZXggKyAwIC8qIFNpbmdsZVByb3BWYWx1ZXNJbmRleE9mZnNldCAqLztcbiAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGRpcmVjdGl2ZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW50byB0aGUgcmVnaXN0cnlcbiAgICBpZiAoaW5kZXggPCBkaXJlY3RpdmVSZWdpc3RyeS5sZW5ndGggJiZcbiAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnlbc2luZ2xlUHJvcFN0YXJ0UG9zaXRpb25dID49IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc2luZ2xlUHJvcHNTdGFydEluZGV4ID0gc3RhdGljTW9kZU9ubHkgPyAtMSA6IGNvbnRleHRbNSAvKiBTaW5nbGVQcm9wT2Zmc2V0UG9zaXRpb25zICovXS5sZW5ndGg7XG4gICAgYWxsb2NhdGVPclVwZGF0ZURpcmVjdGl2ZUludG9Db250ZXh0KGNvbnRleHQsIGRpcmVjdGl2ZUluZGV4LCBzaW5nbGVQcm9wc1N0YXJ0SW5kZXgsIHN0eWxlU2FuaXRpemVyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGdldE1hdGNoaW5nQmluZGluZ0luZGV4KGNvbnRleHQsIGJpbmRpbmdOYW1lLCBzdGFydCwgZW5kKSB7XG4gICAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDwgZW5kOyBqICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICBpZiAoZ2V0UHJvcChjb250ZXh0LCBqKSA9PT0gYmluZGluZ05hbWUpXG4gICAgICAgICAgICByZXR1cm4gajtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHByb3ZpZGVkIG11bHRpIHN0eWxpbmcgKGBbc3R5bGVdYCBhbmQgYFtjbGFzc11gKSB2YWx1ZXMgdG8gdGhlIGNvbnRleHQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGl0ZXJhdGUgb3ZlciB0aGUgcHJvdmlkZWQgYGNsYXNzZXNJbnB1dGAgYW5kIGBzdHlsZXNJbnB1dGAgbWFwXG4gKiB2YWx1ZXMgYW5kIGluc2VydC91cGRhdGUgb3IgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY29udGV4dCBhdCBleGFjdGx5IHRoZSByaWdodFxuICogc3BvdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsc28gdGFrZXMgaW4gYSBkaXJlY3RpdmUgd2hpY2ggaW1wbGllcyB0aGF0IHRoZSBzdHlsaW5nIHZhbHVlcyB3aWxsXG4gKiBiZSBldmFsdWF0ZWQgZm9yIHRoYXQgZGlyZWN0aXZlIHdpdGggcmVzcGVjdCB0byBhbnkgb3RoZXIgc3R5bGluZyB0aGF0IGFscmVhZHkgZXhpc3RzXG4gKiBvbiB0aGUgY29udGV4dC4gV2hlbiB0aGVyZSBhcmUgc3R5bGVzIHRoYXQgY29uZmxpY3QgKGUuZy4gc2F5IGBuZ1N0eWxlYCBhbmQgYFtzdHlsZV1gXG4gKiBib3RoIHVwZGF0ZSB0aGUgYHdpZHRoYCBwcm9wZXJ0eSBhdCB0aGUgc2FtZSB0aW1lKSB0aGVuIHRoZSBzdHlsaW5nIGFsZ29yaXRobSBjb2RlIGJlbG93XG4gKiB3aWxsIGRlY2lkZSB3aGljaCBvbmUgd2lucyBiYXNlZCBvbiB0aGUgZGlyZWN0aXZlIHN0eWxpbmcgcHJpb3JpdGl6YXRpb24gbWVjaGFuaXNtLiBUaGlzXG4gKiBtZWNoYW5pc20gaXMgYmV0dGVyIGV4cGxhaW5lZCBpbiByZW5kZXIzL2ludGVyZmFjZXMvc3R5bGluZy50cyNkaXJlY3RpdmVzKS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IHJlbmRlciBhbnkgc3R5bGluZyB2YWx1ZXMgb24gc2NyZWVuLCBidXQgaXMgcmF0aGVyIGRlc2lnbmVkIHRvXG4gKiBwcmVwYXJlIHRoZSBjb250ZXh0IGZvciB0aGF0LiBgcmVuZGVyU3R5bGluZ2AgbXVzdCBiZSBjYWxsZWQgYWZ0ZXJ3YXJkcyB0byByZW5kZXIgYW55XG4gKiBzdHlsaW5nIGRhdGEgdGhhdCB3YXMgc2V0IGluIHRoaXMgZnVuY3Rpb24gKG5vdGUgdGhhdCBgdXBkYXRlQ2xhc3NQcm9wYCBhbmRcbiAqIGB1cGRhdGVTdHlsZVByb3BgIGFyZSBkZXNpZ25lZCB0byBiZSBydW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBydW4pLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBzdHlsaW5nIGNvbnRleHQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGVcbiAqICAgIG5ld2x5IHByb3ZpZGVkIHN0eWxlIHZhbHVlcy5cbiAqIEBwYXJhbSBjbGFzc2VzSW5wdXQgVGhlIGtleS92YWx1ZSBtYXAgb2YgQ1NTIGNsYXNzIG5hbWVzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdXBkYXRlLlxuICogQHBhcmFtIHN0eWxlc0lucHV0IFRoZSBrZXkvdmFsdWUgbWFwIG9mIENTUyBzdHlsZXMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB1cGRhdGUuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVN0eWxpbmdNYXAoY29udGV4dCwgY2xhc3Nlc0lucHV0LCBzdHlsZXNJbnB1dCwgZGlyZWN0aXZlSW5kZXgpIHtcbiAgICBpZiAoZGlyZWN0aXZlSW5kZXggPT09IHZvaWQgMCkgeyBkaXJlY3RpdmVJbmRleCA9IDA7IH1cbiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnN0eWxpbmdNYXArKztcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0VmFsaWREaXJlY3RpdmVJbmRleChjb250ZXh0LCBkaXJlY3RpdmVJbmRleCk7XG4gICAgY2xhc3Nlc0lucHV0ID0gY2xhc3Nlc0lucHV0IHx8IG51bGw7XG4gICAgc3R5bGVzSW5wdXQgPSBzdHlsZXNJbnB1dCB8fCBudWxsO1xuICAgIHZhciBpZ25vcmVBbGxDbGFzc1VwZGF0ZXMgPSBpc011bHRpVmFsdWVDYWNoZUhpdChjb250ZXh0LCB0cnVlLCBkaXJlY3RpdmVJbmRleCwgY2xhc3Nlc0lucHV0KTtcbiAgICB2YXIgaWdub3JlQWxsU3R5bGVVcGRhdGVzID0gaXNNdWx0aVZhbHVlQ2FjaGVIaXQoY29udGV4dCwgZmFsc2UsIGRpcmVjdGl2ZUluZGV4LCBzdHlsZXNJbnB1dCk7XG4gICAgLy8gZWFybHkgZXhpdCAodGhpcyBpcyB3aGF0J3MgZG9uZSB0byBhdm9pZCB1c2luZyBjdHguYmluZCgpIHRvIGNhY2hlIHRoZSB2YWx1ZSlcbiAgICBpZiAoaWdub3JlQWxsQ2xhc3NVcGRhdGVzICYmIGlnbm9yZUFsbFN0eWxlVXBkYXRlcylcbiAgICAgICAgcmV0dXJuO1xuICAgIGNsYXNzZXNJbnB1dCA9XG4gICAgICAgIGNsYXNzZXNJbnB1dCA9PT0gTk9fQ0hBTkdFID8gcmVhZENhY2hlZE1hcFZhbHVlKGNvbnRleHQsIHRydWUsIGRpcmVjdGl2ZUluZGV4KSA6IGNsYXNzZXNJbnB1dDtcbiAgICBzdHlsZXNJbnB1dCA9XG4gICAgICAgIHN0eWxlc0lucHV0ID09PSBOT19DSEFOR0UgPyByZWFkQ2FjaGVkTWFwVmFsdWUoY29udGV4dCwgZmFsc2UsIGRpcmVjdGl2ZUluZGV4KSA6IHN0eWxlc0lucHV0O1xuICAgIHZhciBlbGVtZW50ID0gY29udGV4dFswIC8qIEVsZW1lbnRQb3NpdGlvbiAqL107XG4gICAgdmFyIGNsYXNzZXNQbGF5ZXJCdWlsZGVyID0gY2xhc3Nlc0lucHV0IGluc3RhbmNlb2YgQm91bmRQbGF5ZXJGYWN0b3J5ID9cbiAgICAgICAgbmV3IENsYXNzQW5kU3R5bGVQbGF5ZXJCdWlsZGVyKGNsYXNzZXNJbnB1dCwgZWxlbWVudCwgMSAvKiBDbGFzcyAqLykgOlxuICAgICAgICBudWxsO1xuICAgIHZhciBzdHlsZXNQbGF5ZXJCdWlsZGVyID0gc3R5bGVzSW5wdXQgaW5zdGFuY2VvZiBCb3VuZFBsYXllckZhY3RvcnkgP1xuICAgICAgICBuZXcgQ2xhc3NBbmRTdHlsZVBsYXllckJ1aWxkZXIoc3R5bGVzSW5wdXQsIGVsZW1lbnQsIDIgLyogU3R5bGUgKi8pIDpcbiAgICAgICAgbnVsbDtcbiAgICB2YXIgY2xhc3Nlc1ZhbHVlID0gY2xhc3Nlc1BsYXllckJ1aWxkZXIgP1xuICAgICAgICBjbGFzc2VzSW5wdXQudmFsdWUgOlxuICAgICAgICBjbGFzc2VzSW5wdXQ7XG4gICAgdmFyIHN0eWxlc1ZhbHVlID0gc3R5bGVzUGxheWVyQnVpbGRlciA/IHN0eWxlc0lucHV0Wyd2YWx1ZSddIDogc3R5bGVzSW5wdXQ7XG4gICAgdmFyIGNsYXNzTmFtZXMgPSBFTVBUWV9BUlJBWSQxO1xuICAgIHZhciBhcHBseUFsbENsYXNzZXMgPSBmYWxzZTtcbiAgICB2YXIgcGxheWVyQnVpbGRlcnNBcmVEaXJ0eSA9IGZhbHNlO1xuICAgIHZhciBjbGFzc2VzUGxheWVyQnVpbGRlckluZGV4ID0gY2xhc3Nlc1BsYXllckJ1aWxkZXIgPyAxIC8qIENsYXNzTWFwUGxheWVyQnVpbGRlclBvc2l0aW9uICovIDogMDtcbiAgICBpZiAoaGFzUGxheWVyQnVpbGRlckNoYW5nZWQoY29udGV4dCwgY2xhc3Nlc1BsYXllckJ1aWxkZXIsIDEgLyogQ2xhc3NNYXBQbGF5ZXJCdWlsZGVyUG9zaXRpb24gKi8pKSB7XG4gICAgICAgIHNldFBsYXllckJ1aWxkZXIoY29udGV4dCwgY2xhc3Nlc1BsYXllckJ1aWxkZXIsIDEgLyogQ2xhc3NNYXBQbGF5ZXJCdWlsZGVyUG9zaXRpb24gKi8pO1xuICAgICAgICBwbGF5ZXJCdWlsZGVyc0FyZURpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHN0eWxlc1BsYXllckJ1aWxkZXJJbmRleCA9IHN0eWxlc1BsYXllckJ1aWxkZXIgPyAzIC8qIFN0eWxlTWFwUGxheWVyQnVpbGRlclBvc2l0aW9uICovIDogMDtcbiAgICBpZiAoaGFzUGxheWVyQnVpbGRlckNoYW5nZWQoY29udGV4dCwgc3R5bGVzUGxheWVyQnVpbGRlciwgMyAvKiBTdHlsZU1hcFBsYXllckJ1aWxkZXJQb3NpdGlvbiAqLykpIHtcbiAgICAgICAgc2V0UGxheWVyQnVpbGRlcihjb250ZXh0LCBzdHlsZXNQbGF5ZXJCdWlsZGVyLCAzIC8qIFN0eWxlTWFwUGxheWVyQnVpbGRlclBvc2l0aW9uICovKTtcbiAgICAgICAgcGxheWVyQnVpbGRlcnNBcmVEaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIC8vIGVhY2ggdGltZSBhIHN0cmluZy1iYXNlZCB2YWx1ZSBwb3BzIHVwIHRoZW4gaXQgc2hvdWxkbid0IHJlcXVpcmUgYSBkZWVwXG4gICAgLy8gY2hlY2sgb2Ygd2hhdCdzIGNoYW5nZWQuXG4gICAgaWYgKCFpZ25vcmVBbGxDbGFzc1VwZGF0ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc2VzVmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMgPSBjbGFzc2VzVmFsdWUuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIC8vIHRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyB0byBjcmVhdGUgYSBrZXkvdmFsdWUgbWFwIG9mIGB0cnVlYCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIHNpbmNlIGEgY2xhc3NuYW1lIHN0cmluZyBpbXBsaWVzIHRoYXQgYWxsIHRob3NlIGNsYXNzZXMgYXJlIGFkZGVkXG4gICAgICAgICAgICBhcHBseUFsbENsYXNzZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NOYW1lcyA9IGNsYXNzZXNWYWx1ZSA/IE9iamVjdC5rZXlzKGNsYXNzZXNWYWx1ZSkgOiBFTVBUWV9BUlJBWSQxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBtdWx0aVN0eWxlc1N0YXJ0SW5kZXggPSBnZXRNdWx0aVN0eWxlc1N0YXJ0SW5kZXgoY29udGV4dCk7XG4gICAgdmFyIG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggPSBnZXRNdWx0aUNsYXNzZXNTdGFydEluZGV4KGNvbnRleHQpO1xuICAgIHZhciBtdWx0aUNsYXNzZXNFbmRJbmRleCA9IGNvbnRleHQubGVuZ3RoO1xuICAgIGlmICghaWdub3JlQWxsU3R5bGVVcGRhdGVzKSB7XG4gICAgICAgIHZhciBzdHlsZVByb3BzID0gc3R5bGVzVmFsdWUgPyBPYmplY3Qua2V5cyhzdHlsZXNWYWx1ZSkgOiBFTVBUWV9BUlJBWSQxO1xuICAgICAgICB2YXIgc3R5bGVzID0gc3R5bGVzVmFsdWUgfHwgRU1QVFlfT0JKO1xuICAgICAgICB2YXIgdG90YWxOZXdFbnRyaWVzID0gcGF0Y2hTdHlsaW5nTWFwSW50b0NvbnRleHQoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgsIHN0eWxlc1BsYXllckJ1aWxkZXJJbmRleCwgbXVsdGlTdHlsZXNTdGFydEluZGV4LCBtdWx0aUNsYXNzZXNTdGFydEluZGV4LCBzdHlsZVByb3BzLCBzdHlsZXMsIHN0eWxlc0lucHV0LCBmYWxzZSk7XG4gICAgICAgIGlmICh0b3RhbE5ld0VudHJpZXMpIHtcbiAgICAgICAgICAgIG11bHRpQ2xhc3Nlc1N0YXJ0SW5kZXggKz0gdG90YWxOZXdFbnRyaWVzICogNCAvKiBTaXplICovO1xuICAgICAgICAgICAgbXVsdGlDbGFzc2VzRW5kSW5kZXggKz0gdG90YWxOZXdFbnRyaWVzICogNCAvKiBTaXplICovO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaWdub3JlQWxsQ2xhc3NVcGRhdGVzKSB7XG4gICAgICAgIHZhciBjbGFzc2VzID0gKGNsYXNzZXNWYWx1ZSB8fCBFTVBUWV9PQkopO1xuICAgICAgICBwYXRjaFN0eWxpbmdNYXBJbnRvQ29udGV4dChjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgY2xhc3Nlc1BsYXllckJ1aWxkZXJJbmRleCwgbXVsdGlDbGFzc2VzU3RhcnRJbmRleCwgbXVsdGlDbGFzc2VzRW5kSW5kZXgsIGNsYXNzTmFtZXMsIGFwcGx5QWxsQ2xhc3NlcyB8fCBjbGFzc2VzLCBjbGFzc2VzSW5wdXQsIHRydWUpO1xuICAgIH1cbiAgICBpZiAocGxheWVyQnVpbGRlcnNBcmVEaXJ0eSkge1xuICAgICAgICBzZXRDb250ZXh0UGxheWVyc0RpcnR5KGNvbnRleHQsIHRydWUpO1xuICAgIH1cbiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnN0eWxpbmdNYXBDYWNoZU1pc3MrKztcbn1cbi8qKlxuICogQXBwbGllcyB0aGUgZ2l2ZW4gbXVsdGkgc3R5bGluZyAoc3R5bGVzIG9yIGNsYXNzZXMpIHZhbHVlcyB0byB0aGUgY29udGV4dC5cbiAqXG4gKiBUaGUgc3R5bGluZyBhbGdvcml0aG0gY29kZSB0aGF0IGFwcGxpZXMgbXVsdGktbGV2ZWwgc3R5bGluZyAodGhpbmdzIGxpa2UgYFtzdHlsZV1gIGFuZCBgW2NsYXNzXWBcbiAqIHZhbHVlcykgcmVzaWRlcyBoZXJlLlxuICpcbiAqIEJlY2F1c2UgdGhpcyBmdW5jdGlvbiB1bmRlcnN0YW5kcyB0aGF0IG11bHRpcGxlIGRpcmVjdGl2ZXMgbWF5IGFsbCB3cml0ZSB0byB0aGUgYFtzdHlsZV1gIGFuZFxuICogYFtjbGFzc11gIGJpbmRpbmdzICh0aHJvdWdoIGhvc3QgYmluZGluZ3MpLCBpdCByZWxpZXMgb2YgZWFjaCBkaXJlY3RpdmUgYXBwbHlpbmcgaXRzIGJpbmRpbmdcbiAqIHZhbHVlIGluIG9yZGVyLiBUaGlzIG1lYW5zIHRoYXQgYSBkaXJlY3RpdmUgbGlrZSBgY2xhc3NBRGlyZWN0aXZlYCB3aWxsIGFsd2F5cyBmaXJlIGJlZm9yZVxuICogYGNsYXNzQkRpcmVjdGl2ZWAgYW5kIHRoZXJlZm9yZSBpdHMgc3R5bGluZyB2YWx1ZXMgKGNsYXNzZXMgYW5kIHN0eWxlcykgd2lsbCBhbHdheXMgYmUgZXZhbHVhdGVkXG4gKiBpbiB0aGUgc2FtZSBvcmRlci4gQmVjYXVzZSBvZiB0aGlzIGNvbnNpc3RlbnQgb3JkZXJpbmcsIHRoZSBmaXJzdCBkaXJlY3RpdmUgaGFzIGEgaGlnaGVyIHByaW9yaXR5XG4gKiB0aGFuIHRoZSBzZWNvbmQgb25lLiBJdCBpcyB3aXRoIHRoaXMgcHJpb3JpdHphdGlvbiBtZWNoYW5pc20gdGhhdCB0aGUgc3R5bGluZyBhbGdvcml0aG0ga25vd3MgaG93XG4gKiB0byBtZXJnZSBhbmQgYXBwbHkgcmVkdWRhbnQgc3R5bGluZyBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBmdW5jdGlvbiBpdHNlbGYgYXBwbGllcyB0aGUga2V5L3ZhbHVlIGVudHJpZXMgKG9yIGFuIGFycmF5IG9mIGtleXMpIHRvXG4gKiB0aGUgY29udGV4dCBpbiB0aGUgZm9sbG93aW5nIHN0ZXBzLlxuICpcbiAqIFNURVAgMTpcbiAqICAgIEZpcnN0IGNoZWNrIHRvIHNlZSB3aGF0IHByb3BlcnRpZXMgYXJlIGFscmVhZHkgc2V0IGFuZCBpbiB1c2UgYnkgYW5vdGhlciBkaXJlY3RpdmUgaW4gdGhlXG4gKiAgICBjb250ZXh0IChlLmcuIGBuZ0NsYXNzYCBzZXQgdGhlIGB3aWR0aGAgdmFsdWUgYW5kIGBbc3R5bGUud2lkdGhdPVwid1wiYCBpbiBhIGRpcmVjdGl2ZSBpc1xuICogICAgYXR0ZW1wdGluZyB0byBzZXQgaXQgYXMgd2VsbCkuXG4gKlxuICogU1RFUCAyOlxuICogICAgQWxsIHJlbWFpbmluZyBwcm9wZXJ0aWVzICh0aGF0IHdlcmUgbm90IHNldCBwcmlvciB0byB0aGlzIGRpcmVjdGl2ZSkgYXJlIG5vdyB1cGRhdGVkIGluXG4gKiAgICB0aGUgY29udGV4dC4gQW55IG5ldyBwcm9wZXJ0aWVzIGFyZSBpbnNlcnRlZCBleGFjdGx5IGF0IHRoZWlyIHNwb3QgaW4gdGhlIGNvbnRleHQgYW5kIGFueVxuICogICAgcHJldmlvdXNseSBzZXQgcHJvcGVydGllcyBhcmUgc2hpZnRlZCB0byBleGFjdGx5IHdoZXJlIHRoZSBjdXJzb3Igc2l0cyB3aGlsZSBpdGVyYXRpbmcgb3ZlclxuICogICAgdGhlIGNvbnRleHQuIFRoZSBlbmQgcmVzdWx0IGlzIGEgYmFsYW5jZWQgY29udGV4dCB0aGF0IGluY2x1ZGVzIHRoZSBleGFjdCBvcmRlcmluZyBvZiB0aGVcbiAqICAgIHN0eWxpbmcgcHJvcGVydGllcy92YWx1ZXMgZm9yIHRoZSBwcm92aWRlZCBpbnB1dCBmcm9tIHRoZSBkaXJlY3RpdmUuXG4gKlxuICogU1RFUCAzOlxuICogICAgQW55IHVubWF0Y2hlZCBwcm9wZXJ0aWVzIGluIHRoZSBjb250ZXh0IHRoYXQgYmVsb25nIHRvIHRoZSBkaXJlY3RpdmUgYXJlIHNldCB0byBudWxsXG4gKlxuICogT25jZSB0aGUgdXBkYXRpbmcgcGhhc2UgaXMgZG9uZSwgdGhlbiB0aGUgYWxnb3JpdGhtIHdpbGwgZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGZsYWcgdGhlXG4gKiBmb2xsb3ctdXAgZGlyZWN0aXZlcyAodGhlIGRpcmVjdGl2ZXMgdGhhdCB3aWxsIHBhc3MgaW4gdGhlaXIgc3R5bGluZyB2YWx1ZXMpIGRlcGVuZGluZyBvbiBpZlxuICogdGhlIFwic2hhcGVcIiBvZiB0aGUgbXVsdGktdmFsdWUgbWFwIGhhcyBjaGFuZ2VkIChlaXRoZXIgaWYgYW55IGtleXMgYXJlIHJlbW92ZWQgb3IgYWRkZWQgb3JcbiAqIGlmIHRoZXJlIGFyZSBhbnkgbmV3IGBudWxsYCB2YWx1ZXMpLiBJZiBhbnkgZm9sbG93LXVwIGRpcmVjdGl2ZXMgYXJlIGZsYWdnZWQgYXMgZGlydHkgdGhlbiB0aGVcbiAqIGFsZ29yaXRobSB3aWxsIHJ1biBhZ2FpbiBmb3IgdGhlbS4gT3RoZXJ3aXNlIGlmIHRoZSBzaGFwZSBkaWQgbm90IGNoYW5nZSB0aGVuIGFueSBmb2xsb3ctdXBcbiAqIGRpcmVjdGl2ZXMgd2lsbCBub3QgcnVuIChzbyBsb25nIGFzIHRoZWlyIGJpbmRpbmcgdmFsdWVzIHN0YXkgdGhlIHNhbWUpLlxuICpcbiAqIEByZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgb2YgbmV3IHNsb3RzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgaW50byB0aGUgY29udGV4dCBkdWUgdG8gbmV3IHN0eWxpbmdcbiAqICAgICAgICAgIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBwYXRjaFN0eWxpbmdNYXBJbnRvQ29udGV4dChjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgcGxheWVyQnVpbGRlckluZGV4LCBjdHhTdGFydCwgY3R4RW5kLCBwcm9wcywgdmFsdWVzLCBjYWNoZVZhbHVlLCBlbnRyeUlzQ2xhc3NCYXNlZCkge1xuICAgIHZhciBkaXJ0eSA9IGZhbHNlO1xuICAgIHZhciBjYWNoZUluZGV4ID0gMSAvKiBWYWx1ZXNTdGFydFBvc2l0aW9uICovICtcbiAgICAgICAgZGlyZWN0aXZlSW5kZXggKiA0IC8qIFNpemUgKi87XG4gICAgLy8gdGhlIGNhY2hlZFZhbHVlcyBhcnJheSBpcyB0aGUgcmVnaXN0cnkgb2YgYWxsIG11bHRpIHN0eWxlIHZhbHVlcyAobWFwIHZhbHVlcykuIEVhY2hcbiAgICAvLyB2YWx1ZSBpcyBzdG9yZWQgKGNhY2hlZCkgZWFjaCB0aW1lIGlzIHVwZGF0ZWQuXG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IGNvbnRleHRbZW50cnlJc0NsYXNzQmFzZWQgPyA2IC8qIENhY2hlZE11bHRpQ2xhc3NlcyAqLyA6IDcgLyogQ2FjaGVkTXVsdGlTdHlsZXMgKi9dO1xuICAgIC8vIHRoaXMgaXMgdGhlIGluZGV4IGluIHdoaWNoIHRoaXMgZGlyZWN0aXZlIGhhcyBvd25lcnNoaXAgYWNjZXNzIHRvIHdyaXRlIHRvIHRoaXNcbiAgICAvLyB2YWx1ZSAoYW55dGhpbmcgYmVmb3JlIGlzIG93bmVkIGJ5IGEgcHJldmlvdXMgZGlyZWN0aXZlIHRoYXQgaXMgbW9yZSBpbXBvcnRhbnQpXG4gICAgdmFyIG93bmVyc2hpcFZhbHVlc1N0YXJ0SW5kZXggPSBjYWNoZWRWYWx1ZXNbY2FjaGVJbmRleCArIDEgLyogUG9zaXRpb25TdGFydE9mZnNldCAqL107XG4gICAgdmFyIGV4aXN0aW5nQ2FjaGVkVmFsdWUgPSBjYWNoZWRWYWx1ZXNbY2FjaGVJbmRleCArIDIgLyogVmFsdWVPZmZzZXQgKi9dO1xuICAgIHZhciBleGlzdGluZ0NhY2hlZFZhbHVlQ291bnQgPSBjYWNoZWRWYWx1ZXNbY2FjaGVJbmRleCArIDMgLyogVmFsdWVDb3VudE9mZnNldCAqL107XG4gICAgdmFyIGV4aXN0aW5nQ2FjaGVkVmFsdWVJc0RpcnR5ID0gY2FjaGVkVmFsdWVzW2NhY2hlSW5kZXggKyAwIC8qIERpcnR5RmxhZ09mZnNldCAqL10gPT09IDE7XG4gICAgLy8gQSBzaGFwZSBjaGFuZ2UgbWVhbnMgdGhlIHByb3ZpZGVkIG1hcCB2YWx1ZSBoYXMgZWl0aGVyIHJlbW92ZWQgb3IgYWRkZWQgbmV3IHByb3BlcnRpZXNcbiAgICAvLyBjb21wYXJlZCB0byB3aGF0IHdlcmUgaW4gdGhlIGxhc3QgdGltZS4gSWYgYSBzaGFwZSBjaGFuZ2Ugb2NjdXJzIHRoZW4gaXQgbWVhbnMgdGhhdCBhbGxcbiAgICAvLyBmb2xsb3ctdXAgbXVsdGktc3R5bGluZyBlbnRyaWVzIGFyZSBvYnNvbGV0ZSBhbmQgd2lsbCBiZSBleGFtaW5lZCBhZ2FpbiB3aGVuIENEIHJ1bnNcbiAgICAvLyB0aGVtLiBJZiBhIHNoYXBlIGNoYW5nZSBoYXMgbm90IG9jY3VycmVkIHRoZW4gdGhlcmUgaXMgbm8gcmVhc29uIHRvIGNoZWNrIGFueSBvdGhlclxuICAgIC8vIGRpcmVjdGl2ZSB2YWx1ZXMgaWYgdGhlaXIgaWRlbnRpdHkgaGFzIG5vdCBjaGFuZ2VkLiBJZiBhIHByZXZpb3VzIGRpcmVjdGl2ZSBzZXQgdGhpc1xuICAgIC8vIHZhbHVlIGFzIGRpcnR5IChiZWNhdXNlIGl0cyBvd24gc2hhcGUgY2hhbmdlZCkgdGhlbiB0aGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCBoYXMgYmVlblxuICAgIC8vIG9mZnNldCB0byBhIGRpZmZlcmVudCBhcmVhIGluIHRoZSBjb250ZXh0LiBCZWNhdXNlIGl0cyB2YWx1ZSBoYXMgYmVlbiBvZmZzZXQgdGhlbiBpdFxuICAgIC8vIGNhbid0IHdyaXRlIHRvIGEgcmVnaW9uIHRoYXQgaXQgd3JvdGUgdG8gYmVmb3JlICh3aGljaCBtYXkgaGF2ZSBiZWVuIGFwYXJ0IG9mIGFub3RoZXJcbiAgICAvLyBkaXJlY3RpdmUpIGFuZCB0aGVyZWZvcmUgaXRzIHNoYXBlIGNoYW5nZXMgdG9vLlxuICAgIHZhciB2YWx1ZXNFbnRyeVNoYXBlQ2hhbmdlID0gZXhpc3RpbmdDYWNoZWRWYWx1ZUlzRGlydHkgfHwgKCghZXhpc3RpbmdDYWNoZWRWYWx1ZSAmJiBjYWNoZVZhbHVlKSA/IHRydWUgOiBmYWxzZSk7XG4gICAgdmFyIHRvdGFsVW5pcXVlVmFsdWVzID0gMDtcbiAgICB2YXIgdG90YWxOZXdBbGxvY2F0ZWRTbG90cyA9IDA7XG4gICAgLy8gdGhpcyBpcyBhIHRyaWNrIHRvIGF2b2lkIGJ1aWxkaW5nIHtrZXk6dmFsdWV9IG1hcCB3aGVyZSBhbGwgdGhlIHZhbHVlc1xuICAgIC8vIGFyZSBgdHJ1ZWAgKHRoaXMgaGFwcGVucyB3aGVuIGEgY2xhc3NOYW1lIHN0cmluZyBpcyBwcm92aWRlZCBpbnN0ZWFkIG9mIGFcbiAgICAvLyBtYXAgYXMgYW4gaW5wdXQgdmFsdWUgdG8gdGhpcyBzdHlsaW5nIGFsZ29yaXRobSlcbiAgICB2YXIgYXBwbHlBbGxQcm9wcyA9IHZhbHVlcyA9PT0gdHJ1ZTtcbiAgICAvLyBTVEVQIDE6XG4gICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBlYXJsaWVyIGRpcmVjdGl2ZXMgYW5kIGZpZ3VyZSBvdXQgaWYgYW55IHByb3BlcnRpZXMgaGVyZSB3aWxsIGJlIHBsYWNlZFxuICAgIC8vIGluIHRoZWlyIGFyZWEgKHRoaXMgaGFwcGVucyB3aGVuIHRoZSB2YWx1ZSBpcyBudWxsIGJlY2F1c2UgdGhlIGVhcmxpZXIgZGlyZWN0aXZlIGVyYXNlZCBpdCkuXG4gICAgdmFyIGN0eEluZGV4ID0gY3R4U3RhcnQ7XG4gICAgdmFyIHRvdGFsUmVtYWluaW5nUHJvcGVydGllcyA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoY3R4SW5kZXggPCBvd25lcnNoaXBWYWx1ZXNTdGFydEluZGV4KSB7XG4gICAgICAgIHZhciBjdXJyZW50UHJvcCA9IGdldFByb3AoY29udGV4dCwgY3R4SW5kZXgpO1xuICAgICAgICBpZiAodG90YWxSZW1haW5pbmdQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hcFByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFByb3AgPSBtYXBQcm9wID8gKGVudHJ5SXNDbGFzc0Jhc2VkID8gbWFwUHJvcCA6IGh5cGhlbmF0ZShtYXBQcm9wKSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCAmJiBjdXJyZW50UHJvcCA9PT0gbm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGdldFZhbHVlKGNvbnRleHQsIGN0eEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGdldERpcmVjdGl2ZUluZGV4RnJvbUVudHJ5KGNvbnRleHQsIGN0eEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYXBwbHlBbGxQcm9wcyA/IHRydWUgOiB2YWx1ZXNbbm9ybWFsaXplZFByb3BdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudEZsYWcgPSBnZXRQb2ludGVycyhjb250ZXh0LCBjdHhJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNWYWx1ZUNoYW5nZWQoY3VycmVudEZsYWcsIGN1cnJlbnRWYWx1ZSwgdmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd1ZhbHVlQ2hhbmdlKGN1cnJlbnRWYWx1ZSwgdmFsdWUsIGN1cnJlbnREaXJlY3RpdmVJbmRleCwgZGlyZWN0aXZlSW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShjb250ZXh0LCBjdHhJbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIGN0eEluZGV4LCBwbGF5ZXJCdWlsZGVySW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbml0aWFsVmFsdWVDaGFuZ2VkKGNvbnRleHQsIGN1cnJlbnRGbGFnLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXJ0eShjb250ZXh0LCBjdHhJbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3BzW2ldID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSZW1haW5pbmdQcm9wZXJ0aWVzLS07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdHhJbmRleCArPSA0IC8qIFNpemUgKi87XG4gICAgfVxuICAgIC8vIFNURVAgMjpcbiAgICAvLyBhcHBseSB0aGUgbGVmdCBvdmVyIHByb3BlcnRpZXMgdG8gdGhlIGNvbnRleHQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuXG4gICAgaWYgKHRvdGFsUmVtYWluaW5nUHJvcGVydGllcykge1xuICAgICAgICB2YXIgc2FuaXRpemVyID0gZW50cnlJc0NsYXNzQmFzZWQgPyBudWxsIDogZ2V0U3R5bGVTYW5pdGl6ZXIoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgpO1xuICAgICAgICBwcm9wZXJ0aWVzTG9vcDogZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG1hcFByb3AgPSBwcm9wc1tpXTtcbiAgICAgICAgICAgIGlmICghbWFwUHJvcCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gZWFybHkgZXhpdCBpbiBjYXNlIGEgdmFsdWUgd2FzIGFscmVhZHkgZW5jb3VudGVyZWQgYWJvdmUgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbG9vcCAod2hpY2ggbWVhbnMgdGhhdCB0aGUgcHJvcGVydHkgd2FzIGFwcGxpZWQgb3IgcmVqZWN0ZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBhcHBseUFsbFByb3BzID8gdHJ1ZSA6IHZhbHVlc1ttYXBQcm9wXTtcbiAgICAgICAgICAgIHZhciBub3JtYWxpemVkUHJvcCA9IGVudHJ5SXNDbGFzc0Jhc2VkID8gbWFwUHJvcCA6IGh5cGhlbmF0ZShtYXBQcm9wKTtcbiAgICAgICAgICAgIHZhciBpc0luc2lkZU93bmVyc2hpcEFyZWEgPSBjdHhJbmRleCA+PSBvd25lcnNoaXBWYWx1ZXNTdGFydEluZGV4O1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IGN0eEluZGV4OyBqIDwgY3R4RW5kOyBqICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICAgICAgICAgIHZhciBkaXN0YW50Q3R4UHJvcCA9IGdldFByb3AoY29udGV4dCwgaik7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3RhbnRDdHhQcm9wID09PSBub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGFudEN0eERpcmVjdGl2ZUluZGV4ID0gZ2V0RGlyZWN0aXZlSW5kZXhGcm9tRW50cnkoY29udGV4dCwgaik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW50Q3R4UGxheWVyQnVpbGRlckluZGV4ID0gZ2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIGopO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlzdGFudEN0eFZhbHVlID0gZ2V0VmFsdWUoY29udGV4dCwgaik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW50Q3R4RmxhZyA9IGdldFBvaW50ZXJzKGNvbnRleHQsIGopO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dWYWx1ZUNoYW5nZShkaXN0YW50Q3R4VmFsdWUsIHZhbHVlLCBkaXN0YW50Q3R4RGlyZWN0aXZlSW5kZXgsIGRpcmVjdGl2ZUluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGUgZW50cnkgaXNuJ3QgdXBkYXRlZCAoYnkgdmFsdWUgb3IgZGlyZWN0aXZlSW5kZXgpIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBzdGlsbCBiZSBtb3ZlZCBvdmVyIHRvIHRoZSBjb3JyZWN0IHNwb3QgaW4gdGhlIGFycmF5IHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaXRlcmF0aW9uIGxvb3AgaXMgdGlnaHRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luc2lkZU93bmVyc2hpcEFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwTXVsdGlDb250ZXh0RW50cmllcyhjb250ZXh0LCBjdHhJbmRleCwgaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxVbmlxdWVWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNWYWx1ZUNoYW5nZWQoZGlzdGFudEN0eEZsYWcsIGRpc3RhbnRDdHhWYWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGRpc3RhbnRDdHhWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNFbnRyeVNoYXBlQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoY29udGV4dCwgY3R4SW5kZXgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTS0lQIElGIElOSVRJQUwgQ0hFQ0tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9ybWVyIGB2YWx1ZWAgaXMgYG51bGxgIHRoZW4gaXQgbWVhbnMgdGhhdCBhbiBpbml0aWFsIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgYmUgYmVpbmcgcmVuZGVyZWQgb24gc2NyZWVuLiBJZiB0aGF0IGlzIHRoZSBjYXNlIHRoZW4gdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwb2ludCBpbiB1cGRhdGluZyB0aGUgdmFsdWUgaW4gY2FzZSBpdCBtYXRjaGVzLiBJbiBvdGhlciB3b3JkcyBpZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgdmFsdWUgaXMgdGhlIGV4YWN0IHNhbWUgYXMgdGhlIHByZXZpb3VzbHkgcmVuZGVyZWQgdmFsdWUgKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwcGVucyB0byBiZSB0aGUgaW5pdGlhbCB2YWx1ZSkgdGhlbiBkbyBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW50Q3R4VmFsdWUgIT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW5pdGlhbFZhbHVlQ2hhbmdlZChjb250ZXh0LCBkaXN0YW50Q3R4RmxhZywgdmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpcnR5KGNvbnRleHQsIGN0eEluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW50Q3R4RGlyZWN0aXZlSW5kZXggIT09IGRpcmVjdGl2ZUluZGV4IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyQnVpbGRlckluZGV4ICE9PSBkaXN0YW50Q3R4UGxheWVyQnVpbGRlckluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIGN0eEluZGV4LCBwbGF5ZXJCdWlsZGVySW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdHhJbmRleCArPSA0IC8qIFNpemUgKi87XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHByb3BlcnRpZXNMb29wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIGNhc2UgLi4uIHZhbHVlIG5vdCBmb3VuZCBhdCBhbGwgaW4gdGhlIGNvbnRleHRcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzRW50cnlTaGFwZUNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdG90YWxVbmlxdWVWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICB2YXIgZmxhZyA9IHByZXBhcmVJbml0aWFsRmxhZyhjb250ZXh0LCBub3JtYWxpemVkUHJvcCwgZW50cnlJc0NsYXNzQmFzZWQsIHNhbml0aXplcikgfFxuICAgICAgICAgICAgICAgICAgICAxIC8qIERpcnR5ICovO1xuICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25JbmRleCA9IGlzSW5zaWRlT3duZXJzaGlwQXJlYSA/XG4gICAgICAgICAgICAgICAgICAgIGN0eEluZGV4IDpcbiAgICAgICAgICAgICAgICAgICAgKG93bmVyc2hpcFZhbHVlc1N0YXJ0SW5kZXggKyB0b3RhbE5ld0FsbG9jYXRlZFNsb3RzICogNCAvKiBTaXplICovKTtcbiAgICAgICAgICAgICAgICBpbnNlcnROZXdNdWx0aVByb3BlcnR5KGNvbnRleHQsIGluc2VydGlvbkluZGV4LCBlbnRyeUlzQ2xhc3NCYXNlZCwgbm9ybWFsaXplZFByb3AsIGZsYWcsIHZhbHVlLCBkaXJlY3RpdmVJbmRleCwgcGxheWVyQnVpbGRlckluZGV4KTtcbiAgICAgICAgICAgICAgICB0b3RhbE5ld0FsbG9jYXRlZFNsb3RzKys7XG4gICAgICAgICAgICAgICAgY3R4RW5kICs9IDQgLyogU2l6ZSAqLztcbiAgICAgICAgICAgICAgICBjdHhJbmRleCArPSA0IC8qIFNpemUgKi87XG4gICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNURVAgMzpcbiAgICAvLyBSZW1vdmUgKG51bGxpZnkpIGFueSBleGlzdGluZyBlbnRyaWVzIGluIHRoZSBjb250ZXh0IHRoYXQgd2VyZSBub3QgYXBhcnQgb2YgdGhlXG4gICAgLy8gbWFwIGlucHV0IHZhbHVlIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoaXMgYWxnb3JpdGhtIGZvciB0aGlzIGRpcmVjdGl2ZS5cbiAgICB3aGlsZSAoY3R4SW5kZXggPCBjdHhFbmQpIHtcbiAgICAgICAgdmFsdWVzRW50cnlTaGFwZUNoYW5nZSA9IHRydWU7IC8vIHNvbWUgdmFsdWVzIGFyZSBtaXNzaW5nXG4gICAgICAgIHZhciBjdHhWYWx1ZSA9IGdldFZhbHVlKGNvbnRleHQsIGN0eEluZGV4KTtcbiAgICAgICAgdmFyIGN0eEZsYWcgPSBnZXRQb2ludGVycyhjb250ZXh0LCBjdHhJbmRleCk7XG4gICAgICAgIHZhciBjdHhEaXJlY3RpdmUgPSBnZXREaXJlY3RpdmVJbmRleEZyb21FbnRyeShjb250ZXh0LCBjdHhJbmRleCk7XG4gICAgICAgIGlmIChjdHhWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNFbnRyeVNoYXBlQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzVmFsdWVDaGFuZ2VkKGN0eEZsYWcsIGN0eFZhbHVlLCBudWxsKSkge1xuICAgICAgICAgICAgc2V0VmFsdWUoY29udGV4dCwgY3R4SW5kZXgsIG51bGwpO1xuICAgICAgICAgICAgLy8gb25seSBpZiB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBmYWxzeSB0aGVuXG4gICAgICAgICAgICBpZiAoaGFzSW5pdGlhbFZhbHVlQ2hhbmdlZChjb250ZXh0LCBjdHhGbGFnLCBjdHhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZXREaXJ0eShjb250ZXh0LCBjdHhJbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIGN0eEluZGV4LCBwbGF5ZXJCdWlsZGVySW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjdHhJbmRleCArPSA0IC8qIFNpemUgKi87XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgdGhlIG9iamVjdCBzaGFwZSBoYXMgY2hhbmdlZCwgdGhpcyBtZWFucyB0aGF0IGFsbCBmb2xsb3ctdXAgZGlyZWN0aXZlcyB3aWxsIG5lZWQgdG9cbiAgICAvLyByZWFwcGx5IHRoZWlyIHZhbHVlcyBpbnRvIHRoZSBvYmplY3QuIEZvciB0aGlzIHRvIGhhcHBlbiwgdGhlIGNhY2hlZCBhcnJheSBuZWVkcyB0byBiZSB1cGRhdGVkXG4gICAgLy8gd2l0aCBkaXJ0eSBmbGFncyBzbyB0aGF0IGZvbGxvdy11cCBjYWxscyB0byBgdXBkYXRlU3R5bGluZ01hcGAgd2lsbCByZWFwcGx5IHRoZWlyIHN0eWxpbmcgY29kZS5cbiAgICAvLyB0aGUgcmVhcHBsaWNhdGlvbiBvZiBzdHlsaW5nIGNvZGUgd2l0aGluIHRoZSBjb250ZXh0IHdpbGwgcmVzaGFwZSBpdCBhbmQgdXBkYXRlIHRoZSBvZmZzZXRcbiAgICAvLyB2YWx1ZXMgKGFsc28gZm9sbG93LXVwIGRpcmVjdGl2ZXMgY2FuIHdyaXRlIG5ldyB2YWx1ZXMgaW4gY2FzZSBlYXJsaWVyIGRpcmVjdGl2ZXMgc2V0IGFueXRoaW5nXG4gICAgLy8gdG8gbnVsbCBkdWUgdG8gcmVtb3ZhbHMgb3IgZmFsc3kgdmFsdWVzKS5cbiAgICB2YWx1ZXNFbnRyeVNoYXBlQ2hhbmdlID0gdmFsdWVzRW50cnlTaGFwZUNoYW5nZSB8fCBleGlzdGluZ0NhY2hlZFZhbHVlQ291bnQgIT09IHRvdGFsVW5pcXVlVmFsdWVzO1xuICAgIHVwZGF0ZUNhY2hlZE1hcFZhbHVlKGNvbnRleHQsIGRpcmVjdGl2ZUluZGV4LCBlbnRyeUlzQ2xhc3NCYXNlZCwgY2FjaGVWYWx1ZSwgb3duZXJzaGlwVmFsdWVzU3RhcnRJbmRleCwgY3R4RW5kLCB0b3RhbFVuaXF1ZVZhbHVlcywgdmFsdWVzRW50cnlTaGFwZUNoYW5nZSk7XG4gICAgaWYgKGRpcnR5KSB7XG4gICAgICAgIHNldENvbnRleHREaXJ0eShjb250ZXh0LCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsTmV3QWxsb2NhdGVkU2xvdHM7XG59XG4vKipcbiAqIFNldHMgYW5kIHJlc29sdmVzIGEgc2luZ2xlIGNsYXNzIHZhbHVlIG9uIHRoZSBwcm92aWRlZCBgU3R5bGluZ0NvbnRleHRgIHNvXG4gKiB0aGF0IHRoZXkgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgb25jZSBgcmVuZGVyU3R5bGluZ2AgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBzdHlsaW5nIGNvbnRleHQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGVcbiAqICAgIG5ld2x5IHByb3ZpZGVkIGNsYXNzIHZhbHVlLlxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhlIENTUyBjbGFzcyB3aGljaCBpcyBiZWluZyB1cGRhdGVkLlxuICogQHBhcmFtIGFkZE9yUmVtb3ZlIFdoZXRoZXIgb3Igbm90IHRvIGFkZCBvciByZW1vdmUgdGhlIENTUyBjbGFzc1xuICogQHBhcmFtIGZvcmNlT3ZlcnJpZGUgd2hldGhlciBvciBub3QgdG8gc2tpcCBhbGwgZGlyZWN0aXZlIHByaW9yaXRpemF0aW9uXG4gKiAgICBhbmQganVzdCBhcHBseSB0aGUgdmFsdWUgcmVnYXJkbGVzcy5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ2xhc3NQcm9wKGNvbnRleHQsIG9mZnNldCwgaW5wdXQsIGRpcmVjdGl2ZUluZGV4LCBmb3JjZU92ZXJyaWRlKSB7XG4gICAgaWYgKGRpcmVjdGl2ZUluZGV4ID09PSB2b2lkIDApIHsgZGlyZWN0aXZlSW5kZXggPSAwOyB9XG4gICAgdXBkYXRlU2luZ2xlU3R5bGluZ1ZhbHVlKGNvbnRleHQsIG9mZnNldCwgaW5wdXQsIHRydWUsIGRpcmVjdGl2ZUluZGV4LCBmb3JjZU92ZXJyaWRlKTtcbn1cbi8qKlxuICogU2V0cyBhbmQgcmVzb2x2ZXMgYSBzaW5nbGUgc3R5bGUgdmFsdWUgb24gdGhlIHByb3ZpZGVkIGBTdHlsaW5nQ29udGV4dGAgc29cbiAqIHRoYXQgdGhleSBjYW4gYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCBvbmNlIGByZW5kZXJTdHlsaW5nYCBpcyBjYWxsZWQuXG4gKlxuICogTm90ZSB0aGF0IHByb3AtbGV2ZWwgc3R5bGluZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgaGlnaGVyIHByaW9yaXR5IHRoYW4gYW55IHN0eWxpbmcgdGhhdFxuICogaGFzIGJlZW4gYXBwbGllZCB1c2luZyBgdXBkYXRlU3R5bGluZ01hcGAsIHRoZXJlZm9yZSwgd2hlbiBzdHlsaW5nIHZhbHVlcyBhcmUgcmVuZGVyZWRcbiAqIHRoZW4gYW55IHN0eWxlcy9jbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGFwcGxpZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNvbnNpZGVyZWQgZmlyc3RcbiAqICh0aGVuIG11bHRpIHZhbHVlcyBzZWNvbmQgYW5kIHRoZW4gaW5pdGlhbCB2YWx1ZXMgYXMgYSBiYWNrdXApLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBzdHlsaW5nIGNvbnRleHQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGVcbiAqICAgIG5ld2x5IHByb3ZpZGVkIHN0eWxlIHZhbHVlLlxuICogQHBhcmFtIG9mZnNldCBUaGUgaW5kZXggb2YgdGhlIHByb3BlcnR5IHdoaWNoIGlzIGJlaW5nIHVwZGF0ZWQuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIENTUyBzdHlsZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWRcbiAqIEBwYXJhbSBmb3JjZU92ZXJyaWRlIHdoZXRoZXIgb3Igbm90IHRvIHNraXAgYWxsIGRpcmVjdGl2ZSBwcmlvcml0aXphdGlvblxuICogICAgYW5kIGp1c3QgYXBwbHkgdGhlIHZhbHVlIHJlZ2FyZGxlc3MuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVN0eWxlUHJvcChjb250ZXh0LCBvZmZzZXQsIGlucHV0LCBkaXJlY3RpdmVJbmRleCwgZm9yY2VPdmVycmlkZSkge1xuICAgIGlmIChkaXJlY3RpdmVJbmRleCA9PT0gdm9pZCAwKSB7IGRpcmVjdGl2ZUluZGV4ID0gMDsgfVxuICAgIHVwZGF0ZVNpbmdsZVN0eWxpbmdWYWx1ZShjb250ZXh0LCBvZmZzZXQsIGlucHV0LCBmYWxzZSwgZGlyZWN0aXZlSW5kZXgsIGZvcmNlT3ZlcnJpZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlU2luZ2xlU3R5bGluZ1ZhbHVlKGNvbnRleHQsIG9mZnNldCwgaW5wdXQsIGlzQ2xhc3NCYXNlZCwgZGlyZWN0aXZlSW5kZXgsIGZvcmNlT3ZlcnJpZGUpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0VmFsaWREaXJlY3RpdmVJbmRleChjb250ZXh0LCBkaXJlY3RpdmVJbmRleCk7XG4gICAgdmFyIHNpbmdsZUluZGV4ID0gZ2V0U2luZ2xlUHJvcEluZGV4VmFsdWUoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgsIG9mZnNldCwgaXNDbGFzc0Jhc2VkKTtcbiAgICB2YXIgY3VyclZhbHVlID0gZ2V0VmFsdWUoY29udGV4dCwgc2luZ2xlSW5kZXgpO1xuICAgIHZhciBjdXJyRmxhZyA9IGdldFBvaW50ZXJzKGNvbnRleHQsIHNpbmdsZUluZGV4KTtcbiAgICB2YXIgY3VyckRpcmVjdGl2ZSA9IGdldERpcmVjdGl2ZUluZGV4RnJvbUVudHJ5KGNvbnRleHQsIHNpbmdsZUluZGV4KTtcbiAgICB2YXIgdmFsdWUgPSAoaW5wdXQgaW5zdGFuY2VvZiBCb3VuZFBsYXllckZhY3RvcnkpID8gaW5wdXQudmFsdWUgOiBpbnB1dDtcbiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnN0eWxpbmdQcm9wKys7XG4gICAgaWYgKGhhc1ZhbHVlQ2hhbmdlZChjdXJyRmxhZywgY3VyclZhbHVlLCB2YWx1ZSkgJiZcbiAgICAgICAgKGZvcmNlT3ZlcnJpZGUgfHwgYWxsb3dWYWx1ZUNoYW5nZShjdXJyVmFsdWUsIHZhbHVlLCBjdXJyRGlyZWN0aXZlLCBkaXJlY3RpdmVJbmRleCkpKSB7XG4gICAgICAgIHZhciBpc0NsYXNzQmFzZWRfMSA9IChjdXJyRmxhZyAmIDIgLyogQ2xhc3MgKi8pID09PSAyIC8qIENsYXNzICovO1xuICAgICAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRbMCAvKiBFbGVtZW50UG9zaXRpb24gKi9dO1xuICAgICAgICB2YXIgcGxheWVyQnVpbGRlciA9IGlucHV0IGluc3RhbmNlb2YgQm91bmRQbGF5ZXJGYWN0b3J5ID9cbiAgICAgICAgICAgIG5ldyBDbGFzc0FuZFN0eWxlUGxheWVyQnVpbGRlcihpbnB1dCwgZWxlbWVudCwgaXNDbGFzc0Jhc2VkXzEgPyAxIC8qIENsYXNzICovIDogMiAvKiBTdHlsZSAqLykgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgdmFyIHZhbHVlXzEgPSAocGxheWVyQnVpbGRlciA/IGlucHV0LnZhbHVlIDogaW5wdXQpO1xuICAgICAgICB2YXIgY3VyclBsYXllckluZGV4ID0gZ2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIHNpbmdsZUluZGV4KTtcbiAgICAgICAgdmFyIHBsYXllckJ1aWxkZXJzQXJlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdmFyIHBsYXllckJ1aWxkZXJJbmRleCA9IHBsYXllckJ1aWxkZXIgPyBjdXJyUGxheWVySW5kZXggOiAwO1xuICAgICAgICBpZiAoaGFzUGxheWVyQnVpbGRlckNoYW5nZWQoY29udGV4dCwgcGxheWVyQnVpbGRlciwgY3VyclBsYXllckluZGV4KSkge1xuICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gc2V0UGxheWVyQnVpbGRlcihjb250ZXh0LCBwbGF5ZXJCdWlsZGVyLCBjdXJyUGxheWVySW5kZXgpO1xuICAgICAgICAgICAgcGxheWVyQnVpbGRlckluZGV4ID0gcGxheWVyQnVpbGRlciA/IG5ld0luZGV4IDogMDtcbiAgICAgICAgICAgIHBsYXllckJ1aWxkZXJzQXJlRGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwbGF5ZXJCdWlsZGVyc0FyZURpcnR5IHx8IGN1cnJEaXJlY3RpdmUgIT09IGRpcmVjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJCdWlsZGVySW5kZXgoY29udGV4dCwgc2luZ2xlSW5kZXgsIHBsYXllckJ1aWxkZXJJbmRleCwgZGlyZWN0aXZlSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyRGlyZWN0aXZlICE9PSBkaXJlY3RpdmVJbmRleCkge1xuICAgICAgICAgICAgdmFyIHByb3AgPSBnZXRQcm9wKGNvbnRleHQsIHNpbmdsZUluZGV4KTtcbiAgICAgICAgICAgIHZhciBzYW5pdGl6ZXIgPSBnZXRTdHlsZVNhbml0aXplcihjb250ZXh0LCBkaXJlY3RpdmVJbmRleCk7XG4gICAgICAgICAgICBzZXRTYW5pdGl6ZUZsYWcoY29udGV4dCwgc2luZ2xlSW5kZXgsIChzYW5pdGl6ZXIgJiYgc2FuaXRpemVyKHByb3ApKSA/IHRydWUgOiBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIHZhbHVlIHdpbGwgYWx3YXlzIGdldCB1cGRhdGVkIChldmVuIGlmIHRoZSBkaXJ0eSBmbGFnIGlzIHNraXBwZWQpXG4gICAgICAgIHNldFZhbHVlKGNvbnRleHQsIHNpbmdsZUluZGV4LCB2YWx1ZV8xKTtcbiAgICAgICAgdmFyIGluZGV4Rm9yTXVsdGkgPSBnZXRNdWx0aU9yU2luZ2xlSW5kZXgoY3VyckZsYWcpO1xuICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUgaW4gdGhlIG11bHRpLWFyZWEgdGhlbiB0aGVyZSdzIG5vIHBvaW50IGluIHJlLWFzc2VtYmxpbmdcbiAgICAgICAgdmFyIHZhbHVlRm9yTXVsdGkgPSBnZXRWYWx1ZShjb250ZXh0LCBpbmRleEZvck11bHRpKTtcbiAgICAgICAgaWYgKCF2YWx1ZUZvck11bHRpIHx8IGhhc1ZhbHVlQ2hhbmdlZChjdXJyRmxhZywgdmFsdWVGb3JNdWx0aSwgdmFsdWVfMSkpIHtcbiAgICAgICAgICAgIHZhciBtdWx0aURpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgc2luZ2xlRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgLy8gb25seSB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gYG51bGxgIHNob3VsZCB0aGUgbXVsdGktdmFsdWUgZ2V0IGZsYWdnZWRcbiAgICAgICAgICAgIGlmICghdmFsdWVFeGlzdHModmFsdWVfMSwgaXNDbGFzc0Jhc2VkXzEpICYmIHZhbHVlRXhpc3RzKHZhbHVlRm9yTXVsdGksIGlzQ2xhc3NCYXNlZF8xKSkge1xuICAgICAgICAgICAgICAgIG11bHRpRGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNpbmdsZURpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXREaXJ0eShjb250ZXh0LCBpbmRleEZvck11bHRpLCBtdWx0aURpcnR5KTtcbiAgICAgICAgICAgIHNldERpcnR5KGNvbnRleHQsIHNpbmdsZUluZGV4LCBzaW5nbGVEaXJ0eSk7XG4gICAgICAgICAgICBzZXRDb250ZXh0RGlydHkoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYXllckJ1aWxkZXJzQXJlRGlydHkpIHtcbiAgICAgICAgICAgIHNldENvbnRleHRQbGF5ZXJzRGlydHkoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5zdHlsaW5nUHJvcENhY2hlTWlzcysrO1xuICAgIH1cbn1cbi8qKlxuICogUmVuZGVycyBhbGwgcXVldWVkIHN0eWxpbmcgdXNpbmcgYSByZW5kZXJlciBvbnRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd29ya3MgYnkgcmVuZGVyaW5nIGFueSBzdHlsZXMgKHRoYXQgaGF2ZSBiZWVuIGFwcGxpZWRcbiAqIHVzaW5nIGB1cGRhdGVTdHlsaW5nTWFwYCkgYW5kIGFueSBjbGFzc2VzICh0aGF0IGhhdmUgYmVlbiBhcHBsaWVkIHVzaW5nXG4gKiBgdXBkYXRlU3R5bGVQcm9wYCkgb250byB0aGUgcHJvdmlkZWQgZWxlbWVudCB1c2luZyB0aGUgcHJvdmlkZWQgcmVuZGVyZXIuXG4gKiBKdXN0IGJlZm9yZSB0aGUgc3R5bGVzL2NsYXNzZXMgYXJlIHJlbmRlcmVkIGEgZmluYWwga2V5L3ZhbHVlIHN0eWxlIG1hcFxuICogd2lsbCBiZSBhc3NlbWJsZWQgKGlmIGBzdHlsZVN0b3JlYCBvciBgY2xhc3NTdG9yZWAgYXJlIHByb3ZpZGVkKS5cbiAqXG4gKiBAcGFyYW0gbEVsZW1lbnQgdGhlIGVsZW1lbnQgdGhhdCB0aGUgc3R5bGVzIHdpbGwgYmUgcmVuZGVyZWQgb25cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBzdHlsaW5nIGNvbnRleHQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lXG4gKiAgICAgIHdoYXQgc3R5bGVzIHdpbGwgYmUgcmVuZGVyZWRcbiAqIEBwYXJhbSByZW5kZXJlciB0aGUgcmVuZGVyZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYXBwbHkgdGhlIHN0eWxpbmdcbiAqIEBwYXJhbSBjbGFzc2VzU3RvcmUgaWYgcHJvdmlkZWQsIHRoZSB1cGRhdGVkIGNsYXNzIHZhbHVlcyB3aWxsIGJlIGFwcGxpZWRcbiAqICAgIHRvIHRoaXMga2V5L3ZhbHVlIG1hcCBpbnN0ZWFkIG9mIGJlaW5nIHJlbmRlcmVyZWQgdmlhIHRoZSByZW5kZXJlci5cbiAqIEBwYXJhbSBzdHlsZXNTdG9yZSBpZiBwcm92aWRlZCwgdGhlIHVwZGF0ZWQgc3R5bGUgdmFsdWVzIHdpbGwgYmUgYXBwbGllZFxuICogICAgdG8gdGhpcyBrZXkvdmFsdWUgbWFwIGluc3RlYWQgb2YgYmVpbmcgcmVuZGVyZXJlZCB2aWEgdGhlIHJlbmRlcmVyLlxuICogQHJldHVybnMgbnVtYmVyIHRoZSB0b3RhbCBhbW91bnQgb2YgcGxheWVycyB0aGF0IGdvdCBxdWV1ZWQgZm9yIGFuaW1hdGlvbiAoaWYgYW55KVxuICovXG5mdW5jdGlvbiByZW5kZXJTdHlsaW5nKGNvbnRleHQsIHJlbmRlcmVyLCByb290T3JWaWV3LCBpc0ZpcnN0UmVuZGVyLCBjbGFzc2VzU3RvcmUsIHN0eWxlc1N0b3JlLCBkaXJlY3RpdmVJbmRleCkge1xuICAgIGlmIChkaXJlY3RpdmVJbmRleCA9PT0gdm9pZCAwKSB7IGRpcmVjdGl2ZUluZGV4ID0gMDsgfVxuICAgIHZhciB0b3RhbFBsYXllcnNRdWV1ZWQgPSAwO1xuICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUuc3R5bGluZ0FwcGx5Kys7XG4gICAgLy8gdGhpcyBwcmV2ZW50cyBtdWx0aXBsZSBhdHRlbXB0cyB0byByZW5kZXIgc3R5bGUvY2xhc3MgdmFsdWVzIG9uXG4gICAgLy8gdGhlIHNhbWUgZWxlbWVudC4uLlxuICAgIGlmIChhbGxvd0ZsdXNoKGNvbnRleHQsIGRpcmVjdGl2ZUluZGV4KSkge1xuICAgICAgICAvLyBhbGwgc3R5bGluZyBpbnN0cnVjdGlvbnMgcHJlc2VudCB3aXRoaW4gYW55IGhvc3RCaW5kaW5ncyBmdW5jdGlvbnNcbiAgICAgICAgLy8gZG8gbm90IHVwZGF0ZSB0aGUgY29udGV4dCBpbW1lZGlhdGVseSB3aGVuIGNhbGxlZC4gVGhleSBhcmUgaW5zdGVhZFxuICAgICAgICAvLyBxdWV1ZWQgdXAgYW5kIGFwcGxpZWQgdG8gdGhlIGNvbnRleHQgcmlnaHQgYXQgdGhpcyBwb2ludC4gV2h5PyBUaGlzXG4gICAgICAgIC8vIGlzIGJlY2F1c2UgQW5ndWxhciBldmFsdWF0ZXMgY29tcG9uZW50L2RpcmVjdGl2ZSBhbmQgZGlyZWN0aXZlXG4gICAgICAgIC8vIHN1Yi1jbGFzcyBjb2RlIGF0IGRpZmZlcmVudCBwb2ludHMgYW5kIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlXG4gICAgICAgIC8vIHN0eWxpbmcgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIHRoZSBjb250ZXh0IGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICAvLyAoc2VlIGBpbnRlcmZhY2VzL3N0eWxpbmcudHNgIGZvciBtb3JlIGluZm9ybWF0aW9uKS5cbiAgICAgICAgZmx1c2hRdWV1ZShjb250ZXh0KTtcbiAgICAgICAgaWYgKGlzQ29udGV4dERpcnR5KGNvbnRleHQpKSB7XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnN0eWxpbmdBcHBseUNhY2hlTWlzcysrO1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBoZXJlIHRvIHByZXZlbnQgdGhpbmdzIGxpa2UgPG5nLWNvbnRhaW5lciBbc3R5bGVdIFtjbGFzc10+Li4uPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAvLyBvciBpZiB0aGVyZSBhcmUgYW55IGhvc3Qgc3R5bGUgb3IgY2xhc3MgYmluZGluZ3MgcHJlc2VudCBpbiBhIGRpcmVjdGl2ZSBzZXQgb25cbiAgICAgICAgICAgIC8vIGEgY29udGFpbmVyIG5vZGVcbiAgICAgICAgICAgIHZhciBuYXRpdmUgPSBjb250ZXh0WzAgLyogRWxlbWVudFBvc2l0aW9uICovXTtcbiAgICAgICAgICAgIHZhciBmbHVzaFBsYXllckJ1aWxkZXJzID0gY29udGV4dFsxIC8qIE1hc3RlckZsYWdQb3NpdGlvbiAqL10gJiA4IC8qIFBsYXllckJ1aWxkZXJzRGlydHkgKi87XG4gICAgICAgICAgICB2YXIgbXVsdGlTdGFydEluZGV4ID0gZ2V0TXVsdGlTdHlsZXNTdGFydEluZGV4KGNvbnRleHQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDEwIC8qIFNpbmdsZVN0eWxlc1N0YXJ0UG9zaXRpb24gKi87IGkgPCBjb250ZXh0Lmxlbmd0aDsgaSArPSA0IC8qIFNpemUgKi8pIHtcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBwb2ludCBpbiByZW5kZXJpbmcgc3R5bGVzIHRoYXQgaGF2ZSBub3QgY2hhbmdlZCBvbiBzY3JlZW5cbiAgICAgICAgICAgICAgICBpZiAoaXNEaXJ0eShjb250ZXh0LCBpKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmxhZyA9IGdldFBvaW50ZXJzKGNvbnRleHQsIGkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aXZlSW5kZXhfMSA9IGdldERpcmVjdGl2ZUluZGV4RnJvbUVudHJ5KGNvbnRleHQsIGkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IGdldFByb3AoY29udGV4dCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKGNvbnRleHQsIGkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVTYW5pdGl6ZXIgPSAoZmxhZyAmIDQgLyogU2FuaXRpemUgKi8pID8gZ2V0U3R5bGVTYW5pdGl6ZXIoY29udGV4dCwgZGlyZWN0aXZlSW5kZXhfMSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGxheWVyQnVpbGRlciA9IGdldFBsYXllckJ1aWxkZXIoY29udGV4dCwgaSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NsYXNzQmFzZWQgPSBmbGFnICYgMiAvKiBDbGFzcyAqLyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW5TaW5nbGVSZWdpb24gPSBpIDwgbXVsdGlTdGFydEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVUb0FwcGx5ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZBTFVFIERFRkVSIENBU0UgMTogVXNlIGEgbXVsdGkgdmFsdWUgaW5zdGVhZCBvZiBhIG51bGwgc2luZ2xlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaW1wbGllcyB0aGF0IGEgc2luZ2xlIHZhbHVlIHdhcyByZW1vdmVkIGFuZCB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm93IGRlZmVyIHRvIGEgbXVsdGkgdmFsdWUgYW5kIHVzZSB0aGF0IChpZiBzZXQpLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNJblNpbmdsZVJlZ2lvbiAmJiAhdmFsdWVFeGlzdHModmFsdWVUb0FwcGx5LCBpc0NsYXNzQmFzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgdmFsdWVzIEFMV0FZUyBoYXZlIGEgcmVmZXJlbmNlIHRvIGEgbXVsdGkgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aUluZGV4ID0gZ2V0TXVsdGlPclNpbmdsZUluZGV4KGZsYWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0FwcGx5ID0gZ2V0VmFsdWUoY29udGV4dCwgbXVsdGlJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gVkFMVUUgREVGRVIgQ0FTRSAyOiBVc2UgdGhlIGluaXRpYWwgdmFsdWUgaWYgYWxsIGVsc2UgZmFpbHMgKGlzIGZhbHN5KVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBhIHN0cmluZyBvciBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgd2UgY2FuIHNhZmVseSBhZG9wdCBpdCBpbiBjYXNlIHRoZXJlJ3Mgbm90aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB0aGlzIHNob3VsZCBhbHdheXMgYmUgYSBmYWxzeSBjaGVjayBzaW5jZSBgZmFsc2VgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJvdGggY2xhc3MgYW5kIHN0eWxlIGNvbXBhcmlzb25zIChzdHlsZXMgY2FuJ3QgYmUgZmFsc2UgYW5kIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzZXMgYXJlIHR1cm5lZCBvZmYgYW5kIHNob3VsZCB0aGVyZWZvcmUgZGVmZXIgdG8gdGhlaXIgaW5pdGlhbCB2YWx1ZXMpXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBpZ25vcmUgY2xhc3MtYmFzZWQgZGVmZXJhbHMgYmVjYXVzZSBvdGhlcndpc2UgYSBjbGFzcyBjYW4gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gYmUgcmVtb3ZlZCBpbiB0aGUgY2FzZSB0aGF0IGl0IGV4aXN0cyBhcyB0cnVlIGluIHRoZSBpbml0aWFsIGNsYXNzZXMgbGlzdC4uLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlRXhpc3RzKHZhbHVlVG9BcHBseSwgaXNDbGFzc0Jhc2VkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0FwcGx5ID0gZ2V0SW5pdGlhbFZhbHVlKGNvbnRleHQsIGZsYWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCByZW5kZXIgaXMgdHJ1ZSB0aGVuIHdlIGRvIG5vdCB3YW50IHRvIHN0YXJ0IGFwcGx5aW5nIGZhbHN5XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyB0byB0aGUgRE9NIGVsZW1lbnQncyBzdHlsaW5nLiBPdGhlcndpc2UgdGhlbiB3ZSBrbm93IHRoZXJlIGhhc1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGEgY2hhbmdlIGFuZCBldmVuIGlmIGl0J3MgZmFsc3kgdGhlbiBpdCdzIHJlbW92aW5nIHNvbWV0aGluZyB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHdhcyB0cnV0aHkgYmVmb3JlLlxuICAgICAgICAgICAgICAgICAgICB2YXIgZG9BcHBseVZhbHVlID0gcmVuZGVyZXIgJiYgKGlzRmlyc3RSZW5kZXIgPyB2YWx1ZVRvQXBwbHkgOiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvQXBwbHlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xhc3NCYXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENsYXNzKG5hdGl2ZSwgcHJvcCwgdmFsdWVUb0FwcGx5ID8gdHJ1ZSA6IGZhbHNlLCByZW5kZXJlciwgY2xhc3Nlc1N0b3JlLCBwbGF5ZXJCdWlsZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlKG5hdGl2ZSwgcHJvcCwgdmFsdWVUb0FwcGx5LCByZW5kZXJlciwgc3R5bGVTYW5pdGl6ZXIsIHN0eWxlc1N0b3JlLCBwbGF5ZXJCdWlsZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXREaXJ0eShjb250ZXh0LCBpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZsdXNoUGxheWVyQnVpbGRlcnMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcm9vdENvbnRleHQgPSBBcnJheS5pc0FycmF5KHJvb3RPclZpZXcpID8gZ2V0Um9vdENvbnRleHQocm9vdE9yVmlldykgOiByb290T3JWaWV3O1xuICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJDb250ZXh0ID0gZ2V0UGxheWVyQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB2YXIgcGxheWVyc1N0YXJ0SW5kZXggPSBwbGF5ZXJDb250ZXh0WzAgLyogTm9uQnVpbGRlclBsYXllcnNTdGFydCAqL107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDEgLyogUGxheWVyQnVpbGRlcnNTdGFydFBvc2l0aW9uICovOyBpIDwgcGxheWVyc1N0YXJ0SW5kZXg7IGkgKz0gMiAvKiBQbGF5ZXJBbmRQbGF5ZXJCdWlsZGVyc1R1cGxlU2l6ZSAqLykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IHBsYXllckNvbnRleHRbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBwbGF5ZXJJbnNlcnRpb25JbmRleCA9IGkgKyAxIC8qIFBsYXllck9mZnNldFBvc2l0aW9uICovO1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkUGxheWVyID0gcGxheWVyQ29udGV4dFtwbGF5ZXJJbnNlcnRpb25JbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxheWVyID0gYnVpbGRlci5idWlsZFBsYXllcihvbGRQbGF5ZXIsIGlzRmlyc3RSZW5kZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3YXNRdWV1ZWQgPSBhZGRQbGF5ZXJJbnRlcm5hbChwbGF5ZXJDb250ZXh0LCByb290Q29udGV4dCwgbmF0aXZlLCBwbGF5ZXIsIHBsYXllckluc2VydGlvbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzUXVldWVkICYmIHRvdGFsUGxheWVyc1F1ZXVlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBsYXllci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9sZFBsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBsYXllciBidWlsZGVyIGhhcyBiZWVuIHJlbW92ZWQgLi4uIHRoZXJlZm9yZSB3ZSBzaG91bGQgZGVsZXRlIHRoZSBhc3NvY2lhdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF5ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBsYXllci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0Q29udGV4dFBsYXllcnNEaXJ0eShjb250ZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRDb250ZXh0RGlydHkoY29udGV4dCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0b3RhbFBsYXllcnNRdWV1ZWQ7XG59XG4vKipcbiAqIEFzc2lnbnMgYSBzdHlsZSB2YWx1ZSB0byBhIHN0eWxlIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbmRlcnMgYSBnaXZlbiBDU1MgcHJvcC92YWx1ZSBlbnRyeSB1c2luZyB0aGVcbiAqIHByb3ZpZGVkIHJlbmRlcmVyLiBJZiBhIGBzdG9yZWAgdmFsdWUgaXMgcHJvdmlkZWQgdGhlblxuICogdGhhdCB3aWxsIGJlIHVzZWQgYSByZW5kZXIgY29udGV4dCBpbnN0ZWFkIG9mIHRoZSBwcm92aWRlZFxuICogcmVuZGVyZXIuXG4gKlxuICogQHBhcmFtIG5hdGl2ZSB0aGUgRE9NIEVsZW1lbnRcbiAqIEBwYXJhbSBwcm9wIHRoZSBDU1Mgc3R5bGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIHJlbmRlcmVkXG4gKiBAcGFyYW0gdmFsdWUgdGhlIENTUyBzdHlsZSB2YWx1ZSB0aGF0IHdpbGwgYmUgcmVuZGVyZWRcbiAqIEBwYXJhbSByZW5kZXJlclxuICogQHBhcmFtIHN0b3JlIGFuIG9wdGlvbmFsIGtleS92YWx1ZSBtYXAgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYSBjb250ZXh0IHRvIHJlbmRlciBzdHlsZXMgb25cbiAqL1xuZnVuY3Rpb24gc2V0U3R5bGUobmF0aXZlLCBwcm9wLCB2YWx1ZSwgcmVuZGVyZXIsIHNhbml0aXplciwgc3RvcmUsIHBsYXllckJ1aWxkZXIpIHtcbiAgICB2YWx1ZSA9IHNhbml0aXplciAmJiB2YWx1ZSA/IHNhbml0aXplcihwcm9wLCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICBpZiAoc3RvcmUgfHwgcGxheWVyQnVpbGRlcikge1xuICAgICAgICBpZiAoc3RvcmUpIHtcbiAgICAgICAgICAgIHN0b3JlLnNldFZhbHVlKHByb3AsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxheWVyQnVpbGRlcikge1xuICAgICAgICAgICAgcGxheWVyQnVpbGRlci5zZXRWYWx1ZShwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOyAvLyBvcGFjaXR5LCB6LWluZGV4IGFuZCBmbGV4Ym94IGFsbCBoYXZlIG51bWJlciB2YWx1ZXMgd2hpY2ggbWF5IG5vdFxuICAgICAgICAvLyBhc3NpZ24gYXMgbnVtYmVyc1xuICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0U3R5bGUrKztcbiAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID9cbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZSwgcHJvcCwgdmFsdWUsIFJlbmRlcmVyU3R5bGVGbGFnczMuRGFzaENhc2UpIDpcbiAgICAgICAgICAgIG5hdGl2ZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlU3R5bGUrKztcbiAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID9cbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKG5hdGl2ZSwgcHJvcCwgUmVuZGVyZXJTdHlsZUZsYWdzMy5EYXNoQ2FzZSkgOlxuICAgICAgICAgICAgbmF0aXZlLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xuICAgIH1cbn1cbi8qKlxuICogQWRkcy9yZW1vdmVzIHRoZSBwcm92aWRlZCBjbGFzc05hbWUgdmFsdWUgdG8gdGhlIHByb3ZpZGVkIGVsZW1lbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZW5kZXJzIGEgZ2l2ZW4gQ1NTIGNsYXNzIHZhbHVlIHVzaW5nIHRoZSBwcm92aWRlZFxuICogcmVuZGVyZXIgKGJ5IGFkZGluZyBvciByZW1vdmluZyBpdCBmcm9tIHRoZSBwcm92aWRlZCBlbGVtZW50KS5cbiAqIElmIGEgYHN0b3JlYCB2YWx1ZSBpcyBwcm92aWRlZCB0aGVuIHRoYXQgd2lsbCBiZSB1c2VkIGEgcmVuZGVyXG4gKiBjb250ZXh0IGluc3RlYWQgb2YgdGhlIHByb3ZpZGVkIHJlbmRlcmVyLlxuICpcbiAqIEBwYXJhbSBuYXRpdmUgdGhlIERPTSBFbGVtZW50XG4gKiBAcGFyYW0gcHJvcCB0aGUgQ1NTIHN0eWxlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSByZW5kZXJlZFxuICogQHBhcmFtIHZhbHVlIHRoZSBDU1Mgc3R5bGUgdmFsdWUgdGhhdCB3aWxsIGJlIHJlbmRlcmVkXG4gKiBAcGFyYW0gcmVuZGVyZXJcbiAqIEBwYXJhbSBzdG9yZSBhbiBvcHRpb25hbCBrZXkvdmFsdWUgbWFwIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgY29udGV4dCB0byByZW5kZXIgc3R5bGVzIG9uXG4gKi9cbmZ1bmN0aW9uIHNldENsYXNzKG5hdGl2ZSwgY2xhc3NOYW1lLCBhZGQsIHJlbmRlcmVyLCBzdG9yZSwgcGxheWVyQnVpbGRlcikge1xuICAgIGlmIChzdG9yZSB8fCBwbGF5ZXJCdWlsZGVyKSB7XG4gICAgICAgIGlmIChzdG9yZSkge1xuICAgICAgICAgICAgc3RvcmUuc2V0VmFsdWUoY2xhc3NOYW1lLCBhZGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwbGF5ZXJCdWlsZGVyKSB7XG4gICAgICAgICAgICBwbGF5ZXJCdWlsZGVyLnNldFZhbHVlKGNsYXNzTmFtZSwgYWRkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBET01Ub2tlbkxpc3Qgd2lsbCB0aHJvdyBpZiB3ZSB0cnkgdG8gYWRkIG9yIHJlbW92ZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgfVxuICAgIGVsc2UgaWYgKGNsYXNzTmFtZSAhPT0gJycpIHtcbiAgICAgICAgaWYgKGFkZCkge1xuICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZENsYXNzKys7XG4gICAgICAgICAgICBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5hZGRDbGFzcyhuYXRpdmUsIGNsYXNzTmFtZSkgOlxuICAgICAgICAgICAgICAgIG5hdGl2ZVsnY2xhc3NMaXN0J10uYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlQ2xhc3MrKztcbiAgICAgICAgICAgIGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/IHJlbmRlcmVyLnJlbW92ZUNsYXNzKG5hdGl2ZSwgY2xhc3NOYW1lKSA6XG4gICAgICAgICAgICAgICAgbmF0aXZlWydjbGFzc0xpc3QnXS5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHNldFNhbml0aXplRmxhZyhjb250ZXh0LCBpbmRleCwgc2FuaXRpemVZZXMpIHtcbiAgICBpZiAoc2FuaXRpemVZZXMpIHtcbiAgICAgICAgY29udGV4dFtpbmRleF0gfD0gNCAvKiBTYW5pdGl6ZSAqLztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnRleHRbaW5kZXhdICY9IH40IC8qIFNhbml0aXplICovO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldERpcnR5KGNvbnRleHQsIGluZGV4LCBpc0RpcnR5WWVzKSB7XG4gICAgdmFyIGFkanVzdGVkSW5kZXggPSBpbmRleCA+PSAxMCAvKiBTaW5nbGVTdHlsZXNTdGFydFBvc2l0aW9uICovID8gKGluZGV4ICsgMCAvKiBGbGFnc09mZnNldCAqLykgOiBpbmRleDtcbiAgICBpZiAoaXNEaXJ0eVllcykge1xuICAgICAgICBjb250ZXh0W2FkanVzdGVkSW5kZXhdIHw9IDEgLyogRGlydHkgKi87XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb250ZXh0W2FkanVzdGVkSW5kZXhdICY9IH4xIC8qIERpcnR5ICovO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzRGlydHkoY29udGV4dCwgaW5kZXgpIHtcbiAgICB2YXIgYWRqdXN0ZWRJbmRleCA9IGluZGV4ID49IDEwIC8qIFNpbmdsZVN0eWxlc1N0YXJ0UG9zaXRpb24gKi8gPyAoaW5kZXggKyAwIC8qIEZsYWdzT2Zmc2V0ICovKSA6IGluZGV4O1xuICAgIHJldHVybiAoY29udGV4dFthZGp1c3RlZEluZGV4XSAmIDEgLyogRGlydHkgKi8pID09IDEgLyogRGlydHkgKi87XG59XG5mdW5jdGlvbiBpc0NsYXNzQmFzZWRWYWx1ZShjb250ZXh0LCBpbmRleCkge1xuICAgIHZhciBhZGp1c3RlZEluZGV4ID0gaW5kZXggPj0gMTAgLyogU2luZ2xlU3R5bGVzU3RhcnRQb3NpdGlvbiAqLyA/IChpbmRleCArIDAgLyogRmxhZ3NPZmZzZXQgKi8pIDogaW5kZXg7XG4gICAgcmV0dXJuIChjb250ZXh0W2FkanVzdGVkSW5kZXhdICYgMiAvKiBDbGFzcyAqLykgPT0gMiAvKiBDbGFzcyAqLztcbn1cbmZ1bmN0aW9uIGlzU2FuaXRpemFibGUoY29udGV4dCwgaW5kZXgpIHtcbiAgICB2YXIgYWRqdXN0ZWRJbmRleCA9IGluZGV4ID49IDEwIC8qIFNpbmdsZVN0eWxlc1N0YXJ0UG9zaXRpb24gKi8gPyAoaW5kZXggKyAwIC8qIEZsYWdzT2Zmc2V0ICovKSA6IGluZGV4O1xuICAgIHJldHVybiAoY29udGV4dFthZGp1c3RlZEluZGV4XSAmIDQgLyogU2FuaXRpemUgKi8pID09IDQgLyogU2FuaXRpemUgKi87XG59XG5mdW5jdGlvbiBwb2ludGVycyhjb25maWdGbGFnLCBzdGF0aWNJbmRleCwgZHluYW1pY0luZGV4KSB7XG4gICAgcmV0dXJuIChjb25maWdGbGFnICYgMzEgLyogQml0TWFzayAqLykgfCAoc3RhdGljSW5kZXggPDwgNSAvKiBCaXRDb3VudFNpemUgKi8pIHxcbiAgICAgICAgKGR5bmFtaWNJbmRleCA8PCAoMTQgLyogQml0Q291bnRTaXplICovICsgNSAvKiBCaXRDb3VudFNpemUgKi8pKTtcbn1cbmZ1bmN0aW9uIGdldEluaXRpYWxWYWx1ZShjb250ZXh0LCBmbGFnKSB7XG4gICAgdmFyIGluZGV4ID0gZ2V0SW5pdGlhbEluZGV4KGZsYWcpO1xuICAgIHZhciBlbnRyeUlzQ2xhc3NCYXNlZCA9IGZsYWcgJiAyIC8qIENsYXNzICovO1xuICAgIHZhciBpbml0aWFsVmFsdWVzID0gZW50cnlJc0NsYXNzQmFzZWQgPyBjb250ZXh0WzQgLyogSW5pdGlhbENsYXNzVmFsdWVzUG9zaXRpb24gKi9dIDpcbiAgICAgICAgY29udGV4dFszIC8qIEluaXRpYWxTdHlsZVZhbHVlc1Bvc2l0aW9uICovXTtcbiAgICByZXR1cm4gaW5pdGlhbFZhbHVlc1tpbmRleF07XG59XG5mdW5jdGlvbiBnZXRJbml0aWFsSW5kZXgoZmxhZykge1xuICAgIHJldHVybiAoZmxhZyA+PiA1IC8qIEJpdENvdW50U2l6ZSAqLykgJiAxNjM4MyAvKiBCaXRNYXNrICovO1xufVxuZnVuY3Rpb24gZ2V0TXVsdGlPclNpbmdsZUluZGV4KGZsYWcpIHtcbiAgICB2YXIgaW5kZXggPSAoZmxhZyA+PiAoMTQgLyogQml0Q291bnRTaXplICovICsgNSAvKiBCaXRDb3VudFNpemUgKi8pKSAmIDE2MzgzIC8qIEJpdE1hc2sgKi87XG4gICAgcmV0dXJuIGluZGV4ID49IDEwIC8qIFNpbmdsZVN0eWxlc1N0YXJ0UG9zaXRpb24gKi8gPyBpbmRleCA6IC0xO1xufVxuZnVuY3Rpb24gZ2V0TXVsdGlDbGFzc2VzU3RhcnRJbmRleChjb250ZXh0KSB7XG4gICAgdmFyIGNsYXNzQ2FjaGUgPSBjb250ZXh0WzYgLyogQ2FjaGVkTXVsdGlDbGFzc2VzICovXTtcbiAgICByZXR1cm4gY2xhc3NDYWNoZVsxIC8qIFZhbHVlc1N0YXJ0UG9zaXRpb24gKi8gK1xuICAgICAgICAxIC8qIFBvc2l0aW9uU3RhcnRPZmZzZXQgKi9dO1xufVxuZnVuY3Rpb24gZ2V0TXVsdGlTdHlsZXNTdGFydEluZGV4KGNvbnRleHQpIHtcbiAgICB2YXIgc3R5bGVzQ2FjaGUgPSBjb250ZXh0WzcgLyogQ2FjaGVkTXVsdGlTdHlsZXMgKi9dO1xuICAgIHJldHVybiBzdHlsZXNDYWNoZVsxIC8qIFZhbHVlc1N0YXJ0UG9zaXRpb24gKi8gK1xuICAgICAgICAxIC8qIFBvc2l0aW9uU3RhcnRPZmZzZXQgKi9dO1xufVxuZnVuY3Rpb24gc2V0UHJvcChjb250ZXh0LCBpbmRleCwgcHJvcCkge1xuICAgIGNvbnRleHRbaW5kZXggKyAxIC8qIFByb3BlcnR5T2Zmc2V0ICovXSA9IHByb3A7XG59XG5mdW5jdGlvbiBzZXRWYWx1ZShjb250ZXh0LCBpbmRleCwgdmFsdWUpIHtcbiAgICBjb250ZXh0W2luZGV4ICsgMiAvKiBWYWx1ZU9mZnNldCAqL10gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGhhc1BsYXllckJ1aWxkZXJDaGFuZ2VkKGNvbnRleHQsIGJ1aWxkZXIsIGluZGV4KSB7XG4gICAgdmFyIHBsYXllckNvbnRleHQgPSBjb250ZXh0WzkgLyogUGxheWVyQ29udGV4dCAqL107XG4gICAgaWYgKGJ1aWxkZXIpIHtcbiAgICAgICAgaWYgKCFwbGF5ZXJDb250ZXh0IHx8IGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghcGxheWVyQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBwbGF5ZXJDb250ZXh0W2luZGV4XSAhPT0gYnVpbGRlcjtcbn1cbmZ1bmN0aW9uIHNldFBsYXllckJ1aWxkZXIoY29udGV4dCwgYnVpbGRlciwgaW5zZXJ0aW9uSW5kZXgpIHtcbiAgICB2YXIgcGxheWVyQ29udGV4dCA9IGNvbnRleHRbOSAvKiBQbGF5ZXJDb250ZXh0ICovXSB8fCBhbGxvY1BsYXllckNvbnRleHQoY29udGV4dCk7XG4gICAgaWYgKGluc2VydGlvbkluZGV4ID4gMCkge1xuICAgICAgICBwbGF5ZXJDb250ZXh0W2luc2VydGlvbkluZGV4XSA9IGJ1aWxkZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbnNlcnRpb25JbmRleCA9IHBsYXllckNvbnRleHRbMCAvKiBOb25CdWlsZGVyUGxheWVyc1N0YXJ0ICovXTtcbiAgICAgICAgcGxheWVyQ29udGV4dC5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIGJ1aWxkZXIsIG51bGwpO1xuICAgICAgICBwbGF5ZXJDb250ZXh0WzAgLyogTm9uQnVpbGRlclBsYXllcnNTdGFydCAqL10gKz1cbiAgICAgICAgICAgIDIgLyogUGxheWVyQW5kUGxheWVyQnVpbGRlcnNUdXBsZVNpemUgKi87XG4gICAgfVxuICAgIHJldHVybiBpbnNlcnRpb25JbmRleDtcbn1cbmZ1bmN0aW9uIGRpcmVjdGl2ZU93bmVyUG9pbnRlcnMoZGlyZWN0aXZlSW5kZXgsIHBsYXllckluZGV4KSB7XG4gICAgcmV0dXJuIChwbGF5ZXJJbmRleCA8PCAxNiAvKiBCaXRDb3VudFNpemUgKi8pIHwgZGlyZWN0aXZlSW5kZXg7XG59XG5mdW5jdGlvbiBzZXRQbGF5ZXJCdWlsZGVySW5kZXgoY29udGV4dCwgaW5kZXgsIHBsYXllckJ1aWxkZXJJbmRleCwgZGlyZWN0aXZlSW5kZXgpIHtcbiAgICB2YXIgdmFsdWUgPSBkaXJlY3RpdmVPd25lclBvaW50ZXJzKGRpcmVjdGl2ZUluZGV4LCBwbGF5ZXJCdWlsZGVySW5kZXgpO1xuICAgIGNvbnRleHRbaW5kZXggKyAzIC8qIFBsYXllckJ1aWxkZXJJbmRleE9mZnNldCAqL10gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFBsYXllckJ1aWxkZXJJbmRleChjb250ZXh0LCBpbmRleCkge1xuICAgIHZhciBmbGFnID0gY29udGV4dFtpbmRleCArIDMgLyogUGxheWVyQnVpbGRlckluZGV4T2Zmc2V0ICovXTtcbiAgICB2YXIgcGxheWVyQnVpbGRlckluZGV4ID0gKGZsYWcgPj4gMTYgLyogQml0Q291bnRTaXplICovKSAmXG4gICAgICAgIDY1NTM1IC8qIEJpdE1hc2sgKi87XG4gICAgcmV0dXJuIHBsYXllckJ1aWxkZXJJbmRleDtcbn1cbmZ1bmN0aW9uIGdldFBsYXllckJ1aWxkZXIoY29udGV4dCwgaW5kZXgpIHtcbiAgICB2YXIgcGxheWVyQnVpbGRlckluZGV4ID0gZ2V0UGxheWVyQnVpbGRlckluZGV4KGNvbnRleHQsIGluZGV4KTtcbiAgICBpZiAocGxheWVyQnVpbGRlckluZGV4KSB7XG4gICAgICAgIHZhciBwbGF5ZXJDb250ZXh0ID0gY29udGV4dFs5IC8qIFBsYXllckNvbnRleHQgKi9dO1xuICAgICAgICBpZiAocGxheWVyQ29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHBsYXllckNvbnRleHRbcGxheWVyQnVpbGRlckluZGV4XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHNldEZsYWcoY29udGV4dCwgaW5kZXgsIGZsYWcpIHtcbiAgICB2YXIgYWRqdXN0ZWRJbmRleCA9IGluZGV4ID09PSAxIC8qIE1hc3RlckZsYWdQb3NpdGlvbiAqLyA/IGluZGV4IDogKGluZGV4ICsgMCAvKiBGbGFnc09mZnNldCAqLyk7XG4gICAgY29udGV4dFthZGp1c3RlZEluZGV4XSA9IGZsYWc7XG59XG5mdW5jdGlvbiBnZXRQb2ludGVycyhjb250ZXh0LCBpbmRleCkge1xuICAgIHZhciBhZGp1c3RlZEluZGV4ID0gaW5kZXggPT09IDEgLyogTWFzdGVyRmxhZ1Bvc2l0aW9uICovID8gaW5kZXggOiAoaW5kZXggKyAwIC8qIEZsYWdzT2Zmc2V0ICovKTtcbiAgICByZXR1cm4gY29udGV4dFthZGp1c3RlZEluZGV4XTtcbn1cbmZ1bmN0aW9uIGdldFZhbHVlKGNvbnRleHQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGNvbnRleHRbaW5kZXggKyAyIC8qIFZhbHVlT2Zmc2V0ICovXTtcbn1cbmZ1bmN0aW9uIGdldFByb3AoY29udGV4dCwgaW5kZXgpIHtcbiAgICByZXR1cm4gY29udGV4dFtpbmRleCArIDEgLyogUHJvcGVydHlPZmZzZXQgKi9dO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0RGlydHkoY29udGV4dCkge1xuICAgIHJldHVybiBpc0RpcnR5KGNvbnRleHQsIDEgLyogTWFzdGVyRmxhZ1Bvc2l0aW9uICovKTtcbn1cbmZ1bmN0aW9uIHNldENvbnRleHREaXJ0eShjb250ZXh0LCBpc0RpcnR5WWVzKSB7XG4gICAgc2V0RGlydHkoY29udGV4dCwgMSAvKiBNYXN0ZXJGbGFnUG9zaXRpb24gKi8sIGlzRGlydHlZZXMpO1xufVxuZnVuY3Rpb24gc2V0Q29udGV4dFBsYXllcnNEaXJ0eShjb250ZXh0LCBpc0RpcnR5WWVzKSB7XG4gICAgaWYgKGlzRGlydHlZZXMpIHtcbiAgICAgICAgY29udGV4dFsxIC8qIE1hc3RlckZsYWdQb3NpdGlvbiAqL10gfD0gOCAvKiBQbGF5ZXJCdWlsZGVyc0RpcnR5ICovO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29udGV4dFsxIC8qIE1hc3RlckZsYWdQb3NpdGlvbiAqL10gJj0gfjggLyogUGxheWVyQnVpbGRlcnNEaXJ0eSAqLztcbiAgICB9XG59XG5mdW5jdGlvbiBzd2FwTXVsdGlDb250ZXh0RW50cmllcyhjb250ZXh0LCBpbmRleEEsIGluZGV4Qikge1xuICAgIGlmIChpbmRleEEgPT09IGluZGV4QilcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciB0bXBWYWx1ZSA9IGdldFZhbHVlKGNvbnRleHQsIGluZGV4QSk7XG4gICAgdmFyIHRtcFByb3AgPSBnZXRQcm9wKGNvbnRleHQsIGluZGV4QSk7XG4gICAgdmFyIHRtcEZsYWcgPSBnZXRQb2ludGVycyhjb250ZXh0LCBpbmRleEEpO1xuICAgIHZhciB0bXBQbGF5ZXJCdWlsZGVySW5kZXggPSBnZXRQbGF5ZXJCdWlsZGVySW5kZXgoY29udGV4dCwgaW5kZXhBKTtcbiAgICB2YXIgdG1wRGlyZWN0aXZlSW5kZXggPSBnZXREaXJlY3RpdmVJbmRleEZyb21FbnRyeShjb250ZXh0LCBpbmRleEEpO1xuICAgIHZhciBmbGFnQSA9IHRtcEZsYWc7XG4gICAgdmFyIGZsYWdCID0gZ2V0UG9pbnRlcnMoY29udGV4dCwgaW5kZXhCKTtcbiAgICB2YXIgc2luZ2xlSW5kZXhBID0gZ2V0TXVsdGlPclNpbmdsZUluZGV4KGZsYWdBKTtcbiAgICBpZiAoc2luZ2xlSW5kZXhBID49IDApIHtcbiAgICAgICAgdmFyIF9mbGFnID0gZ2V0UG9pbnRlcnMoY29udGV4dCwgc2luZ2xlSW5kZXhBKTtcbiAgICAgICAgdmFyIF9pbml0aWFsID0gZ2V0SW5pdGlhbEluZGV4KF9mbGFnKTtcbiAgICAgICAgc2V0RmxhZyhjb250ZXh0LCBzaW5nbGVJbmRleEEsIHBvaW50ZXJzKF9mbGFnLCBfaW5pdGlhbCwgaW5kZXhCKSk7XG4gICAgfVxuICAgIHZhciBzaW5nbGVJbmRleEIgPSBnZXRNdWx0aU9yU2luZ2xlSW5kZXgoZmxhZ0IpO1xuICAgIGlmIChzaW5nbGVJbmRleEIgPj0gMCkge1xuICAgICAgICB2YXIgX2ZsYWcgPSBnZXRQb2ludGVycyhjb250ZXh0LCBzaW5nbGVJbmRleEIpO1xuICAgICAgICB2YXIgX2luaXRpYWwgPSBnZXRJbml0aWFsSW5kZXgoX2ZsYWcpO1xuICAgICAgICBzZXRGbGFnKGNvbnRleHQsIHNpbmdsZUluZGV4QiwgcG9pbnRlcnMoX2ZsYWcsIF9pbml0aWFsLCBpbmRleEEpKTtcbiAgICB9XG4gICAgc2V0VmFsdWUoY29udGV4dCwgaW5kZXhBLCBnZXRWYWx1ZShjb250ZXh0LCBpbmRleEIpKTtcbiAgICBzZXRQcm9wKGNvbnRleHQsIGluZGV4QSwgZ2V0UHJvcChjb250ZXh0LCBpbmRleEIpKTtcbiAgICBzZXRGbGFnKGNvbnRleHQsIGluZGV4QSwgZ2V0UG9pbnRlcnMoY29udGV4dCwgaW5kZXhCKSk7XG4gICAgdmFyIHBsYXllckluZGV4QSA9IGdldFBsYXllckJ1aWxkZXJJbmRleChjb250ZXh0LCBpbmRleEIpO1xuICAgIHZhciBkaXJlY3RpdmVJbmRleEEgPSBnZXREaXJlY3RpdmVJbmRleEZyb21FbnRyeShjb250ZXh0LCBpbmRleEIpO1xuICAgIHNldFBsYXllckJ1aWxkZXJJbmRleChjb250ZXh0LCBpbmRleEEsIHBsYXllckluZGV4QSwgZGlyZWN0aXZlSW5kZXhBKTtcbiAgICBzZXRWYWx1ZShjb250ZXh0LCBpbmRleEIsIHRtcFZhbHVlKTtcbiAgICBzZXRQcm9wKGNvbnRleHQsIGluZGV4QiwgdG1wUHJvcCk7XG4gICAgc2V0RmxhZyhjb250ZXh0LCBpbmRleEIsIHRtcEZsYWcpO1xuICAgIHNldFBsYXllckJ1aWxkZXJJbmRleChjb250ZXh0LCBpbmRleEIsIHRtcFBsYXllckJ1aWxkZXJJbmRleCwgdG1wRGlyZWN0aXZlSW5kZXgpO1xufVxuZnVuY3Rpb24gdXBkYXRlU2luZ2xlUG9pbnRlclZhbHVlcyhjb250ZXh0LCBpbmRleFN0YXJ0UG9zaXRpb24pIHtcbiAgICBmb3IgKHZhciBpID0gaW5kZXhTdGFydFBvc2l0aW9uOyBpIDwgY29udGV4dC5sZW5ndGg7IGkgKz0gNCAvKiBTaXplICovKSB7XG4gICAgICAgIHZhciBtdWx0aUZsYWcgPSBnZXRQb2ludGVycyhjb250ZXh0LCBpKTtcbiAgICAgICAgdmFyIHNpbmdsZUluZGV4ID0gZ2V0TXVsdGlPclNpbmdsZUluZGV4KG11bHRpRmxhZyk7XG4gICAgICAgIGlmIChzaW5nbGVJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHZhciBzaW5nbGVGbGFnID0gZ2V0UG9pbnRlcnMoY29udGV4dCwgc2luZ2xlSW5kZXgpO1xuICAgICAgICAgICAgdmFyIGluaXRpYWxJbmRleEZvclNpbmdsZSA9IGdldEluaXRpYWxJbmRleChzaW5nbGVGbGFnKTtcbiAgICAgICAgICAgIHZhciBmbGFnVmFsdWUgPSAoaXNEaXJ0eShjb250ZXh0LCBzaW5nbGVJbmRleCkgPyAxIC8qIERpcnR5ICovIDogMCAvKiBOb25lICovKSB8XG4gICAgICAgICAgICAgICAgKGlzQ2xhc3NCYXNlZFZhbHVlKGNvbnRleHQsIHNpbmdsZUluZGV4KSA/IDIgLyogQ2xhc3MgKi8gOiAwIC8qIE5vbmUgKi8pIHxcbiAgICAgICAgICAgICAgICAoaXNTYW5pdGl6YWJsZShjb250ZXh0LCBzaW5nbGVJbmRleCkgPyA0IC8qIFNhbml0aXplICovIDogMCAvKiBOb25lICovKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGVkRmxhZyA9IHBvaW50ZXJzKGZsYWdWYWx1ZSwgaW5pdGlhbEluZGV4Rm9yU2luZ2xlLCBpKTtcbiAgICAgICAgICAgIHNldEZsYWcoY29udGV4dCwgc2luZ2xlSW5kZXgsIHVwZGF0ZWRGbGFnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGluc2VydE5ld011bHRpUHJvcGVydHkoY29udGV4dCwgaW5kZXgsIGNsYXNzQmFzZWQsIG5hbWUsIGZsYWcsIHZhbHVlLCBkaXJlY3RpdmVJbmRleCwgcGxheWVySW5kZXgpIHtcbiAgICB2YXIgZG9TaGlmdCA9IGluZGV4IDwgY29udGV4dC5sZW5ndGg7XG4gICAgLy8gcHJvcCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlzdCwgYWRkIGl0IGluXG4gICAgY29udGV4dC5zcGxpY2UoaW5kZXgsIDAsIGZsYWcgfCAxIC8qIERpcnR5ICovIHwgKGNsYXNzQmFzZWQgPyAyIC8qIENsYXNzICovIDogMCAvKiBOb25lICovKSwgbmFtZSwgdmFsdWUsIDApO1xuICAgIHNldFBsYXllckJ1aWxkZXJJbmRleChjb250ZXh0LCBpbmRleCwgcGxheWVySW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICBpZiAoZG9TaGlmdCkge1xuICAgICAgICAvLyBiZWNhdXNlIHRoZSB2YWx1ZSB3YXMgaW5zZXJ0ZWQgbWlkd2F5IGludG8gdGhlIGFycmF5IHRoZW4gd2VcbiAgICAgICAgLy8gbmVlZCB0byB1cGRhdGUgYWxsIHRoZSBzaGlmdGVkIG11bHRpIHZhbHVlcycgc2luZ2xlIHZhbHVlXG4gICAgICAgIC8vIHBvaW50ZXJzIHRvIHBvaW50IHRvIHRoZSBuZXdseSBzaGlmdGVkIGxvY2F0aW9uXG4gICAgICAgIHVwZGF0ZVNpbmdsZVBvaW50ZXJWYWx1ZXMoY29udGV4dCwgaW5kZXggKyA0IC8qIFNpemUgKi8pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHZhbHVlRXhpc3RzKHZhbHVlLCBpc0NsYXNzQmFzZWQpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGw7XG59XG5mdW5jdGlvbiBwcmVwYXJlSW5pdGlhbEZsYWcoY29udGV4dCwgcHJvcCwgZW50cnlJc0NsYXNzQmFzZWQsIHNhbml0aXplcikge1xuICAgIHZhciBmbGFnID0gKHNhbml0aXplciAmJiBzYW5pdGl6ZXIocHJvcCkpID8gNCAvKiBTYW5pdGl6ZSAqLyA6IDAgLyogTm9uZSAqLztcbiAgICB2YXIgaW5pdGlhbEluZGV4O1xuICAgIGlmIChlbnRyeUlzQ2xhc3NCYXNlZCkge1xuICAgICAgICBmbGFnIHw9IDIgLyogQ2xhc3MgKi87XG4gICAgICAgIGluaXRpYWxJbmRleCA9XG4gICAgICAgICAgICBnZXRJbml0aWFsU3R5bGluZ1ZhbHVlc0luZGV4T2YoY29udGV4dFs0IC8qIEluaXRpYWxDbGFzc1ZhbHVlc1Bvc2l0aW9uICovXSwgcHJvcCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpbml0aWFsSW5kZXggPVxuICAgICAgICAgICAgZ2V0SW5pdGlhbFN0eWxpbmdWYWx1ZXNJbmRleE9mKGNvbnRleHRbMyAvKiBJbml0aWFsU3R5bGVWYWx1ZXNQb3NpdGlvbiAqL10sIHByb3ApO1xuICAgIH1cbiAgICBpbml0aWFsSW5kZXggPSBpbml0aWFsSW5kZXggPiAwID8gKGluaXRpYWxJbmRleCArIDEgLyogVmFsdWVPZmZzZXQgKi8pIDogMDtcbiAgICByZXR1cm4gcG9pbnRlcnMoZmxhZywgaW5pdGlhbEluZGV4LCAwKTtcbn1cbmZ1bmN0aW9uIGhhc0luaXRpYWxWYWx1ZUNoYW5nZWQoY29udGV4dCwgZmxhZywgbmV3VmFsdWUpIHtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gZ2V0SW5pdGlhbFZhbHVlKGNvbnRleHQsIGZsYWcpO1xuICAgIHJldHVybiAhaW5pdGlhbFZhbHVlIHx8IGhhc1ZhbHVlQ2hhbmdlZChmbGFnLCBpbml0aWFsVmFsdWUsIG5ld1ZhbHVlKTtcbn1cbmZ1bmN0aW9uIGhhc1ZhbHVlQ2hhbmdlZChmbGFnLCBhLCBiKSB7XG4gICAgdmFyIGlzQ2xhc3NCYXNlZCA9IGZsYWcgJiAyIC8qIENsYXNzICovO1xuICAgIHZhciBoYXNWYWx1ZXMgPSBhICYmIGI7XG4gICAgdmFyIHVzZXNTYW5pdGl6ZXIgPSBmbGFnICYgNCAvKiBTYW5pdGl6ZSAqLztcbiAgICAvLyB0aGUgdG9TdHJpbmcoKSBjb21wYXJpc29uIGVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIGNoZWNrZWRcbiAgICAvLyAuLi4gb3RoZXJ3aXNlIChkdXJpbmcgc2FuaXRpemF0aW9uIGJ5cGFzc2luZykgdGhlID09PSBjb21wYXJzaW9uXG4gICAgLy8gd291bGQgZmFpbCBzaW5jZSBhIG5ldyBTdHJpbmcoKSBpbnN0YW5jZSBpcyBjcmVhdGVkXG4gICAgaWYgKCFpc0NsYXNzQmFzZWQgJiYgaGFzVmFsdWVzICYmIHVzZXNTYW5pdGl6ZXIpIHtcbiAgICAgICAgLy8gd2Uga25vdyBmb3Igc3VyZSB3ZSdyZSBkZWFsaW5nIHdpdGggc3RyaW5ncyBhdCB0aGlzIHBvaW50XG4gICAgICAgIHJldHVybiBhLnRvU3RyaW5nKCkgIT09IGIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIHNhZmUgdG8gY2hlY2sgd2l0aCBhIG5vcm1hbCBlcXVhbGl0eSBjaGVja1xuICAgIHJldHVybiBhICE9PSBiO1xufVxudmFyIENsYXNzQW5kU3R5bGVQbGF5ZXJCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsYXNzQW5kU3R5bGVQbGF5ZXJCdWlsZGVyKGZhY3RvcnksIF9lbGVtZW50LCBfdHlwZSkge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3R5cGUgPSBfdHlwZTtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0ge307XG4gICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIH1cbiAgICBDbGFzc0FuZFN0eWxlUGxheWVyQnVpbGRlci5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAocHJvcCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlc1twcm9wXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1twcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDbGFzc0FuZFN0eWxlUGxheWVyQnVpbGRlci5wcm90b3R5cGUuYnVpbGRQbGF5ZXIgPSBmdW5jdGlvbiAoY3VycmVudFBsYXllciwgaXNGaXJzdFJlbmRlcikge1xuICAgICAgICAvLyBpZiBubyB2YWx1ZXMgaGF2ZSBiZWVuIHNldCBoZXJlIHRoZW4gdGhpcyBtZWFucyB0aGUgYmluZGluZyBkaWRuJ3RcbiAgICAgICAgLy8gY2hhbmdlIGFuZCB0aGVyZWZvcmUgdGhlIGJpbmRpbmcgdmFsdWVzIHdlcmUgbm90IHVwZGF0ZWQgdGhyb3VnaFxuICAgICAgICAvLyBgc2V0VmFsdWVgIHdoaWNoIG1lYW5zIG5vIG5ldyBwbGF5ZXIgd2lsbCBiZSBwcm92aWRlZC5cbiAgICAgICAgaWYgKHRoaXMuX2RpcnR5KSB7XG4gICAgICAgICAgICB2YXIgcGxheWVyID0gdGhpcy5fZmFjdG9yeS5mbih0aGlzLl9lbGVtZW50LCB0aGlzLl90eXBlLCB0aGlzLl92YWx1ZXMsIGlzRmlyc3RSZW5kZXIsIGN1cnJlbnRQbGF5ZXIgfHwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xhc3NBbmRTdHlsZVBsYXllckJ1aWxkZXI7XG59KCkpO1xuZnVuY3Rpb24gZ2V0RGlyZWN0aXZlSW5kZXhGcm9tRW50cnkoY29udGV4dCwgaW5kZXgpIHtcbiAgICB2YXIgdmFsdWUgPSBjb250ZXh0W2luZGV4ICsgMyAvKiBQbGF5ZXJCdWlsZGVySW5kZXhPZmZzZXQgKi9dO1xuICAgIHJldHVybiB2YWx1ZSAmIDY1NTM1IC8qIEJpdE1hc2sgKi87XG59XG5mdW5jdGlvbiBnZXRJbml0aWFsU3R5bGluZ1ZhbHVlc0luZGV4T2Yoa2V5VmFsdWVzLCBrZXkpIHtcbiAgICBmb3IgKHZhciBpID0gMiAvKiBLZXlWYWx1ZVN0YXJ0UG9zaXRpb24gKi87IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpICs9IDMgLyogU2l6ZSAqLykge1xuICAgICAgICBpZiAoa2V5VmFsdWVzW2ldID09PSBrZXkpXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gZ2V0U2luZ2xlUHJvcEluZGV4VmFsdWUoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgsIG9mZnNldCwgaXNDbGFzc0Jhc2VkKSB7XG4gICAgdmFyIHNpbmdsZVByb3BPZmZzZXRSZWdpc3RyeUluZGV4ID0gY29udGV4dFsyIC8qIERpcmVjdGl2ZVJlZ2lzdHJ5UG9zaXRpb24gKi9dWyhkaXJlY3RpdmVJbmRleCAqIDIgLyogU2l6ZSAqLykgK1xuICAgICAgICAwIC8qIFNpbmdsZVByb3BWYWx1ZXNJbmRleE9mZnNldCAqL107XG4gICAgdmFyIG9mZnNldHMgPSBjb250ZXh0WzUgLyogU2luZ2xlUHJvcE9mZnNldFBvc2l0aW9ucyAqL107XG4gICAgdmFyIGluZGV4Rm9yT2Zmc2V0ID0gc2luZ2xlUHJvcE9mZnNldFJlZ2lzdHJ5SW5kZXggK1xuICAgICAgICAyIC8qIFZhbHVlU3RhcnRQb3NpdGlvbiAqLyArXG4gICAgICAgIChpc0NsYXNzQmFzZWQgP1xuICAgICAgICAgICAgb2Zmc2V0c1tzaW5nbGVQcm9wT2Zmc2V0UmVnaXN0cnlJbmRleCArIDAgLyogU3R5bGVzQ291bnRQb3NpdGlvbiAqL10gOlxuICAgICAgICAgICAgMCkgK1xuICAgICAgICBvZmZzZXQ7XG4gICAgcmV0dXJuIG9mZnNldHNbaW5kZXhGb3JPZmZzZXRdO1xufVxuZnVuY3Rpb24gZ2V0U3R5bGVTYW5pdGl6ZXIoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgpIHtcbiAgICB2YXIgZGlycyA9IGNvbnRleHRbMiAvKiBEaXJlY3RpdmVSZWdpc3RyeVBvc2l0aW9uICovXTtcbiAgICB2YXIgdmFsdWUgPSBkaXJzW2RpcmVjdGl2ZUluZGV4ICogMiAvKiBTaXplICovICtcbiAgICAgICAgMSAvKiBTdHlsZVNhbml0aXplck9mZnNldCAqL10gfHxcbiAgICAgICAgZGlyc1sxIC8qIFN0eWxlU2FuaXRpemVyT2Zmc2V0ICovXSB8fCBudWxsO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGFsbG93VmFsdWVDaGFuZ2UoY3VycmVudFZhbHVlLCBuZXdWYWx1ZSwgY3VycmVudERpcmVjdGl2ZU93bmVyLCBuZXdEaXJlY3RpdmVPd25lcikge1xuICAgIC8vIHRoZSBjb2RlIGJlbG93IHJlbGllcyB0aGUgaW1wb3J0YW5jZSBvZiBkaXJlY3RpdmUncyBiZWluZyB0aWVkIHRvIHRoZWlyXG4gICAgLy8gaW5kZXggdmFsdWUuIFRoZSBpbmRleCB2YWx1ZXMgZm9yIGVhY2ggZGlyZWN0aXZlIGFyZSBkZXJpdmVkIGZyb20gYmVpbmdcbiAgICAvLyByZWdpc3RlcmVkIGludG8gdGhlIHN0eWxpbmcgY29udGV4dCBkaXJlY3RpdmUgcmVnaXN0cnkuIFRoZSBtb3N0IGltcG9ydGFudFxuICAgIC8vIGRpcmVjdGl2ZSBpcyB0aGUgcGFyZW50IGNvbXBvbmVudCBkaXJlY3RpdmUgKHRoZSB0ZW1wbGF0ZSkgYW5kIGVhY2ggZGlyZWN0aXZlXG4gICAgLy8gdGhhdCBpcyBhZGRlZCBhZnRlciBpcyBjb25zaWRlcmVkIGxlc3MgaW1wb3J0YW50IHRoYW4gdGhlIHByZXZpb3VzIGVudHJ5LiBUaGlzXG4gICAgLy8gcHJpb3JpdGl6YXRpb24gb2YgZGlyZWN0aXZlcyBlbmFibGVzIHRoZSBzdHlsaW5nIGFsZ29yaXRobSB0byBkZWNpZGUgaWYgYSBzdHlsZVxuICAgIC8vIG9yIGNsYXNzIHNob3VsZCBiZSBhbGxvd2VkIHRvIGJlIHVwZGF0ZWQvcmVwbGFjZWQgaW4gY2FzZSBhbiBlYXJsaWVyIGRpcmVjdGl2ZVxuICAgIC8vIGFscmVhZHkgd3JvdGUgdG8gdGhlIGV4YWN0IHNhbWUgc3R5bGUtcHJvcGVydHkgb3IgY2xhc3NOYW1lIHZhbHVlLiBJbiBvdGhlciB3b3Jkc1xuICAgIC8vIHRoaXMgZGVjaWRlcyB3aGF0IHRvIGRvIGlmIGFuZCB3aGVuIHRoZXJlIGlzIGEgY29sbGlzaW9uLlxuICAgIGlmIChjdXJyZW50VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gaWYgYSBkaXJlY3RpdmUgaW5kZXggaXMgbG93ZXIgdGhhbiBpdCBhbHdheXMgaGFzIHByaW9yaXR5IG92ZXIgdGhlXG4gICAgICAgICAgICAvLyBwcmV2aW91cyBkaXJlY3RpdmUncyB2YWx1ZS4uLlxuICAgICAgICAgICAgcmV0dXJuIG5ld0RpcmVjdGl2ZU93bmVyIDw9IGN1cnJlbnREaXJlY3RpdmVPd25lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9ubHkgd3JpdGUgYSBudWxsIHZhbHVlIGluIGNhc2UgaXQncyB0aGUgc2FtZSBvd25lciB3cml0aW5nIGl0LlxuICAgICAgICAgICAgLy8gdGhpcyBhdm9pZHMgaGF2aW5nIGEgaGlnaGVyLXByaW9yaXR5IGRpcmVjdGl2ZSB3cml0ZSB0byBudWxsXG4gICAgICAgICAgICAvLyBvbmx5IHRvIGhhdmUgYSBsZXNzZXItcHJpb3JpdHkgZGlyZWN0aXZlIGNoYW5nZSByaWdodCB0byBhXG4gICAgICAgICAgICAvLyBub24tbnVsbCB2YWx1ZSBpbW1lZGlhdGVseSBhZnRlcndhcmRzLlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREaXJlY3RpdmVPd25lciA9PT0gbmV3RGlyZWN0aXZlT3duZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGNsYXNzTmFtZSBzdHJpbmcgb2YgYWxsIHRoZSBpbml0aWFsIGNsYXNzZXMgZm9yIHRoZSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gcG9wdWxhdGUgYW5kIGNhY2hlIGFsbCB0aGUgc3RhdGljIGNsYXNzXG4gKiB2YWx1ZXMgaW50byBhIGNsYXNzTmFtZSBzdHJpbmcuIFRoZSBjYWNoaW5nIG1lY2hhbmlzbSB3b3JrcyBieSBwbGFjaW5nXG4gKiB0aGUgY29tcGxldGVkIGNsYXNzTmFtZSBzdHJpbmcgaW50byB0aGUgaW5pdGlhbCB2YWx1ZXMgYXJyYXkgaW50byBhXG4gKiBkZWRpY2F0ZWQgc2xvdC4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIGZ1bmN0aW9uIGZyb20gaGF2aW5nIHRvIHBvcHVsYXRlXG4gKiB0aGUgc3RyaW5nIGVhY2ggdGltZSBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgb3IgbWF0Y2hlZC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgY2xhc3NOYW1lIHN0cmluZyAoZS5nLiBgb24gYWN0aXZlIHJlZGApXG4gKi9cbmZ1bmN0aW9uIGdldEluaXRpYWxDbGFzc05hbWVWYWx1ZShjb250ZXh0KSB7XG4gICAgdmFyIGluaXRpYWxDbGFzc1ZhbHVlcyA9IGNvbnRleHRbNCAvKiBJbml0aWFsQ2xhc3NWYWx1ZXNQb3NpdGlvbiAqL107XG4gICAgdmFyIGNsYXNzTmFtZSA9IGluaXRpYWxDbGFzc1ZhbHVlc1sxIC8qIENhY2hlZFN0cmluZ1ZhbHVlUG9zaXRpb24gKi9dO1xuICAgIGlmIChjbGFzc05hbWUgPT09IG51bGwpIHtcbiAgICAgICAgY2xhc3NOYW1lID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAyIC8qIEtleVZhbHVlU3RhcnRQb3NpdGlvbiAqLzsgaSA8IGluaXRpYWxDbGFzc1ZhbHVlcy5sZW5ndGg7IGkgKz0gMyAvKiBTaXplICovKSB7XG4gICAgICAgICAgICB2YXIgaXNQcmVzZW50ID0gaW5pdGlhbENsYXNzVmFsdWVzW2kgKyAxXTtcbiAgICAgICAgICAgIGlmIChpc1ByZXNlbnQpIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWUgKz0gKGNsYXNzTmFtZS5sZW5ndGggPyAnICcgOiAnJykgKyBpbml0aWFsQ2xhc3NWYWx1ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbENsYXNzVmFsdWVzWzEgLyogQ2FjaGVkU3RyaW5nVmFsdWVQb3NpdGlvbiAqL10gPSBjbGFzc05hbWU7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHN0eWxlIHN0cmluZyBvZiBhbGwgdGhlIGluaXRpYWwgc3R5bGVzIGZvciB0aGUgZWxlbWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHBvcHVsYXRlIGFuZCBjYWNoZSBhbGwgdGhlIHN0YXRpYyBzdHlsZVxuICogdmFsdWVzIGludG8gYSBzdHlsZSBzdHJpbmcuIFRoZSBjYWNoaW5nIG1lY2hhbmlzbSB3b3JrcyBieSBwbGFjaW5nXG4gKiB0aGUgY29tcGxldGVkIHN0eWxlIHN0cmluZyBpbnRvIHRoZSBpbml0aWFsIHZhbHVlcyBhcnJheSBpbnRvIGFcbiAqIGRlZGljYXRlZCBzbG90LiBUaGlzIHdpbGwgcHJldmVudCB0aGUgZnVuY3Rpb24gZnJvbSBoYXZpbmcgdG8gcG9wdWxhdGVcbiAqIHRoZSBzdHJpbmcgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgY3JlYXRlZCBvciBtYXRjaGVkLlxuICpcbiAqIEByZXR1cm5zIHRoZSBzdHlsZSBzdHJpbmcgKGUuZy4gYHdpZHRoOjEwMHB4O2hlaWdodDoyMDBweGApXG4gKi9cbmZ1bmN0aW9uIGdldEluaXRpYWxTdHlsZVN0cmluZ1ZhbHVlKGNvbnRleHQpIHtcbiAgICB2YXIgaW5pdGlhbFN0eWxlVmFsdWVzID0gY29udGV4dFszIC8qIEluaXRpYWxTdHlsZVZhbHVlc1Bvc2l0aW9uICovXTtcbiAgICB2YXIgc3R5bGVTdHJpbmcgPSBpbml0aWFsU3R5bGVWYWx1ZXNbMSAvKiBDYWNoZWRTdHJpbmdWYWx1ZVBvc2l0aW9uICovXTtcbiAgICBpZiAoc3R5bGVTdHJpbmcgPT09IG51bGwpIHtcbiAgICAgICAgc3R5bGVTdHJpbmcgPSAnJztcbiAgICAgICAgZm9yICh2YXIgaSA9IDIgLyogS2V5VmFsdWVTdGFydFBvc2l0aW9uICovOyBpIDwgaW5pdGlhbFN0eWxlVmFsdWVzLmxlbmd0aDsgaSArPSAzIC8qIFNpemUgKi8pIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGluaXRpYWxTdHlsZVZhbHVlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzdHlsZVN0cmluZyArPSAoc3R5bGVTdHJpbmcubGVuZ3RoID8gJzsnIDogJycpICsgKGluaXRpYWxTdHlsZVZhbHVlc1tpXSArIFwiOlwiICsgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxTdHlsZVZhbHVlc1sxIC8qIENhY2hlZFN0cmluZ1ZhbHVlUG9zaXRpb24gKi9dID0gc3R5bGVTdHJpbmc7XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVN0cmluZztcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBjYWNoZWQgbXVsdGktdmFsdWUgZm9yIGEgZ2l2ZW4gZGlyZWN0aXZlSW5kZXggd2l0aGluIHRoZSBwcm92aWRlZCBjb250ZXh0LlxuICovXG5mdW5jdGlvbiByZWFkQ2FjaGVkTWFwVmFsdWUoY29udGV4dCwgZW50cnlJc0NsYXNzQmFzZWQsIGRpcmVjdGl2ZUluZGV4KSB7XG4gICAgdmFyIHZhbHVlcyA9IGNvbnRleHRbZW50cnlJc0NsYXNzQmFzZWQgPyA2IC8qIENhY2hlZE11bHRpQ2xhc3NlcyAqLyA6IDcgLyogQ2FjaGVkTXVsdGlTdHlsZXMgKi9dO1xuICAgIHZhciBpbmRleCA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLyArXG4gICAgICAgIGRpcmVjdGl2ZUluZGV4ICogNCAvKiBTaXplICovO1xuICAgIHJldHVybiB2YWx1ZXNbaW5kZXggKyAyIC8qIFZhbHVlT2Zmc2V0ICovXSB8fCBudWxsO1xufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIG11bHRpIHN0eWxpbmcgdmFsdWUgc2hvdWxkIGJlIHVwZGF0ZWQgb3Igbm90LlxuICpcbiAqIEJlY2F1c2UgYFtzdHlsZV1gIGFuZCBgW2NsYXNzXWAgYmluZGluZ3MgcmVseSBvbiBhbiBpZGVudGl0eSBjaGFuZ2UgdG8gb2NjdXIgYmVmb3JlXG4gKiBhcHBseWluZyBuZXcgdmFsdWVzLCB0aGUgc3R5bGluZyBhbGdvcml0aG0gbWF5IG5vdCB1cGRhdGUgYW4gZXhpc3RpbmcgZW50cnkgaW50b1xuICogdGhlIGNvbnRleHQgaWYgYSBwcmV2aW91cyBkaXJlY3RpdmUncyBlbnRyeSBjaGFuZ2VkIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkZWNpZGUgd2hldGhlciBvciBub3QgYSB2YWx1ZSBzaG91bGQgYmUgYXBwbGllZCAoaWYgdGhlcmUgaXMgYVxuICogY2FjaGUgbWlzcykgdG8gdGhlIGNvbnRleHQgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBydWxlczpcbiAqXG4gKiAtIElmIHRoZXJlIGlzIGFuIGlkZW50aXR5IGNoYW5nZSBiZXR3ZWVuIHRoZSBleGlzdGluZyB2YWx1ZSBhbmQgbmV3IHZhbHVlXG4gKiAtIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIHZhbHVlIGNhY2hlZCAoZmlyc3Qgd3JpdGUpXG4gKiAtIElmIGEgcHJldmlvdXMgZGlyZWN0aXZlIGZsYWdnZWQgdGhlIGV4aXN0aW5nIGNhY2hlZCB2YWx1ZSBhcyBkaXJ0eVxuICovXG5mdW5jdGlvbiBpc011bHRpVmFsdWVDYWNoZUhpdChjb250ZXh0LCBlbnRyeUlzQ2xhc3NCYXNlZCwgZGlyZWN0aXZlSW5kZXgsIG5ld1ZhbHVlKSB7XG4gICAgdmFyIGluZGV4T2ZDYWNoZWRWYWx1ZXMgPSBlbnRyeUlzQ2xhc3NCYXNlZCA/IDYgLyogQ2FjaGVkTXVsdGlDbGFzc2VzICovIDogNyAvKiBDYWNoZWRNdWx0aVN0eWxlcyAqLztcbiAgICB2YXIgY2FjaGVkVmFsdWVzID0gY29udGV4dFtpbmRleE9mQ2FjaGVkVmFsdWVzXTtcbiAgICB2YXIgaW5kZXggPSAxIC8qIFZhbHVlc1N0YXJ0UG9zaXRpb24gKi8gK1xuICAgICAgICBkaXJlY3RpdmVJbmRleCAqIDQgLyogU2l6ZSAqLztcbiAgICBpZiAoY2FjaGVkVmFsdWVzW2luZGV4ICsgMCAvKiBEaXJ0eUZsYWdPZmZzZXQgKi9dKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG5ld1ZhbHVlID09PSBOT19DSEFOR0UgfHxcbiAgICAgICAgcmVhZENhY2hlZE1hcFZhbHVlKGNvbnRleHQsIGVudHJ5SXNDbGFzc0Jhc2VkLCBkaXJlY3RpdmVJbmRleCkgPT09IG5ld1ZhbHVlO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSBjYWNoZWQgc3RhdHVzIG9mIGEgbXVsdGktc3R5bGluZyB2YWx1ZSBpbiB0aGUgY29udGV4dC5cbiAqXG4gKiBUaGUgY2FjaGVkIG1hcCBhcnJheSAod2hpY2ggZXhpc3RzIGluIHRoZSBjb250ZXh0KSBjb250YWlucyBhIG1hbmlmZXN0IG9mXG4gKiBlYWNoIG11bHRpLXN0eWxpbmcgZW50cnkgKGBbc3R5bGVdYCBhbmQgYFtjbGFzc11gIGVudHJpZXMpIGZvciB0aGUgdGVtcGxhdGVcbiAqIGFzIHdlbGwgYXMgYWxsIGRpcmVjdGl2ZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSB0aGUgY2FjaGVkIHN0YXR1cyBvZiB0aGUgcHJvdmlkZWQgbXVsdGktc3R5bGVcbiAqIGVudHJ5IHdpdGhpbiB0aGUgY2FjaGUuXG4gKlxuICogV2hlbiBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjpcbiAqIC0gVGhlIGFjdHVhbCBjYWNoZWQgdmFsdWUgKHRoZSByYXcgdmFsdWUgdGhhdCB3YXMgcGFzc2VkIGludG8gYFtzdHlsZV1gIG9yIGBbY2xhc3NdYClcbiAqIC0gVGhlIHRvdGFsIGFtb3VudCBvZiB1bmlxdWUgc3R5bGluZyBlbnRyaWVzIHRoYXQgdGhpcyB2YWx1ZSBoYXMgd3JpdHRlbiBpbnRvIHRoZSBjb250ZXh0XG4gKiAtIFRoZSBleGFjdCBwb3NpdGlvbiBvZiB3aGVyZSB0aGUgbXVsdGkgc3R5bGluZyBlbnRyaWVzIHN0YXJ0IGluIHRoZSBjb250ZXh0IGZvciB0aGlzIGJpbmRpbmdcbiAqIC0gVGhlIGRpcnR5IGZsYWcgd2lsbCBiZSBzZXQgdG8gdHJ1ZVxuICpcbiAqIElmIHRoZSBgZGlydHlGdXR1cmVWYWx1ZXNgIHBhcmFtIGlzIHByb3ZpZGVkIHRoZW4gaXQgd2lsbCB1cGRhdGUgYWxsIGZ1dHVyZSBlbnRyaWVzIChiaW5kaW5nXG4gKiBlbnRyaWVzIHRoYXQgZXhpc3QgYXMgYXBhcnQgb2Ygb3RoZXIgZGlyZWN0aXZlcykgdG8gYmUgZGlydHkgYXMgd2VsbC4gVGhpcyB3aWxsIGZvcmNlIHRoZVxuICogc3R5bGluZyBhbGdvcml0aG0gdG8gcmVhcHBseSB0aG9zZSB2YWx1ZXMgb25jZSBjaGFuZ2UgZGV0ZWN0aW9uIGNoZWNrcyB0aGVtICh3aGljaCB3aWxsIGluXG4gKiB0dXJuIGNhdXNlIHRoZSBzdHlsaW5nIGNvbnRleHQgdG8gdXBkYXRlIGl0c2VsZiBhbmQgdGhlIGNvcnJlY3Qgc3R5bGluZyB2YWx1ZXMgd2lsbCBiZVxuICogcmVuZGVyZWQgb24gc2NyZWVuKS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlQ2FjaGVkTWFwVmFsdWUoY29udGV4dCwgZGlyZWN0aXZlSW5kZXgsIGVudHJ5SXNDbGFzc0Jhc2VkLCBjYWNoZVZhbHVlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgdG90YWxWYWx1ZXMsIGRpcnR5RnV0dXJlVmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlcyA9IGNvbnRleHRbZW50cnlJc0NsYXNzQmFzZWQgPyA2IC8qIENhY2hlZE11bHRpQ2xhc3NlcyAqLyA6IDcgLyogQ2FjaGVkTXVsdGlTdHlsZXMgKi9dO1xuICAgIHZhciBpbmRleCA9IDEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLyArXG4gICAgICAgIGRpcmVjdGl2ZUluZGV4ICogNCAvKiBTaXplICovO1xuICAgIC8vIGluIHRoZSBldmVudCB0aGF0IHRoaXMgaXMgdHJ1ZSB3ZSBhc3N1bWUgdGhhdCBmdXR1cmUgdmFsdWVzIGFyZSBkaXJ0eSBhbmQgdGhlcmVmb3JlXG4gICAgLy8gd2lsbCBiZSBjaGVja2VkIGFnYWluIGluIHRoZSBuZXh0IENEIGN5Y2xlXG4gICAgaWYgKGRpcnR5RnV0dXJlVmFsdWVzKSB7XG4gICAgICAgIHZhciBuZXh0U3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb24gKyB0b3RhbFZhbHVlcyAqIDQgLyogU2l6ZSAqLztcbiAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgNCAvKiBTaXplICovOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSA0IC8qIFNpemUgKi8pIHtcbiAgICAgICAgICAgIHZhbHVlc1tpICsgMSAvKiBQb3NpdGlvblN0YXJ0T2Zmc2V0ICovXSA9IG5leHRTdGFydFBvc2l0aW9uO1xuICAgICAgICAgICAgdmFsdWVzW2kgKyAwIC8qIERpcnR5RmxhZ09mZnNldCAqL10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbHVlc1tpbmRleCArIDAgLyogRGlydHlGbGFnT2Zmc2V0ICovXSA9IDA7XG4gICAgdmFsdWVzW2luZGV4ICsgMSAvKiBQb3NpdGlvblN0YXJ0T2Zmc2V0ICovXSA9IHN0YXJ0UG9zaXRpb247XG4gICAgdmFsdWVzW2luZGV4ICsgMiAvKiBWYWx1ZU9mZnNldCAqL10gPSBjYWNoZVZhbHVlO1xuICAgIHZhbHVlc1tpbmRleCArIDMgLyogVmFsdWVDb3VudE9mZnNldCAqL10gPSB0b3RhbFZhbHVlcztcbiAgICAvLyB0aGUgY29kZSBiZWxvdyBjb3VudHMgdGhlIHRvdGFsIGFtb3VudCBvZiBzdHlsaW5nIHZhbHVlcyB0aGF0IGV4aXN0IGluXG4gICAgLy8gdGhlIGNvbnRleHQgdXAgdW50aWwgdGhpcyBkaXJlY3RpdmUuIFRoaXMgdmFsdWUgd2lsbCBiZSBsYXRlciB1c2VkIHRvXG4gICAgLy8gdXBkYXRlIHRoZSBjYWNoZWQgdmFsdWUgbWFwJ3MgdG90YWwgY291bnRlciB2YWx1ZS5cbiAgICB2YXIgdG90YWxTdHlsaW5nRW50cmllcyA9IHRvdGFsVmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAxIC8qIFZhbHVlc1N0YXJ0UG9zaXRpb24gKi87IGkgPCBpbmRleDsgaSArPSA0IC8qIFNpemUgKi8pIHtcbiAgICAgICAgdG90YWxTdHlsaW5nRW50cmllcyArPSB2YWx1ZXNbaSArIDMgLyogVmFsdWVDb3VudE9mZnNldCAqL107XG4gICAgfVxuICAgIC8vIGJlY2F1c2Ugc3R5bGUgdmFsdWVzIGNvbWUgYmVmb3JlIGNsYXNzIHZhbHVlcyBpbiB0aGUgY29udGV4dCB0aGlzIG1lYW5zXG4gICAgLy8gdGhhdCBpZiBhbnkgbmV3IHZhbHVlcyB3ZXJlIGluc2VydGVkIHRoZW4gdGhlIGNhY2hlIHZhbHVlcyBhcnJheSBmb3JcbiAgICAvLyBjbGFzc2VzIGlzIG91dCBvZiBzeW5jLiBUaGUgY29kZSBiZWxvdyB3aWxsIHVwZGF0ZSB0aGUgb2Zmc2V0cyB0byBwb2ludFxuICAgIC8vIHRvIHRoZWlyIG5ldyB2YWx1ZXMuXG4gICAgaWYgKCFlbnRyeUlzQ2xhc3NCYXNlZCkge1xuICAgICAgICB2YXIgY2xhc3NDYWNoZSA9IGNvbnRleHRbNiAvKiBDYWNoZWRNdWx0aUNsYXNzZXMgKi9dO1xuICAgICAgICB2YXIgY2xhc3Nlc1N0YXJ0UG9zaXRpb24gPSBjbGFzc0NhY2hlWzEgLyogVmFsdWVzU3RhcnRQb3NpdGlvbiAqLyArXG4gICAgICAgICAgICAxIC8qIFBvc2l0aW9uU3RhcnRPZmZzZXQgKi9dO1xuICAgICAgICB2YXIgZGlmZkluU3RhcnRQb3NpdGlvbiA9IGVuZFBvc2l0aW9uIC0gY2xhc3Nlc1N0YXJ0UG9zaXRpb247XG4gICAgICAgIGZvciAodmFyIGkgPSAxIC8qIFZhbHVlc1N0YXJ0UG9zaXRpb24gKi87IGkgPCBjbGFzc0NhY2hlLmxlbmd0aDsgaSArPSA0IC8qIFNpemUgKi8pIHtcbiAgICAgICAgICAgIGNsYXNzQ2FjaGVbaSArIDEgLyogUG9zaXRpb25TdGFydE9mZnNldCAqL10gKz0gZGlmZkluU3RhcnRQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZXNbMCAvKiBFbnRyaWVzQ291bnRQb3NpdGlvbiAqL10gPSB0b3RhbFN0eWxpbmdFbnRyaWVzO1xufVxuZnVuY3Rpb24gaHlwaGVuYXRlRW50cmllcyhlbnRyaWVzKSB7XG4gICAgdmFyIG5ld0VudHJpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKGh5cGhlbmF0ZShlbnRyaWVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdFbnRyaWVzO1xufVxuZnVuY3Rpb24gaHlwaGVuYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1thLXpdW0EtWl0vZywgZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBtYXRjaC5jaGFyQXQoMCkgKyBcIi1cIiArIG1hdGNoLmNoYXJBdCgxKS50b0xvd2VyQ2FzZSgpOyB9KTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyTXVsdGlNYXBFbnRyeShjb250ZXh0LCBkaXJlY3RpdmVJbmRleCwgZW50cnlJc0NsYXNzQmFzZWQsIHN0YXJ0UG9zaXRpb24sIGNvdW50KSB7XG4gICAgaWYgKGNvdW50ID09PSB2b2lkIDApIHsgY291bnQgPSAwOyB9XG4gICAgdmFyIGNhY2hlZFZhbHVlcyA9IGNvbnRleHRbZW50cnlJc0NsYXNzQmFzZWQgPyA2IC8qIENhY2hlZE11bHRpQ2xhc3NlcyAqLyA6IDcgLyogQ2FjaGVkTXVsdGlTdHlsZXMgKi9dO1xuICAgIGlmIChkaXJlY3RpdmVJbmRleCA+IDApIHtcbiAgICAgICAgdmFyIGxpbWl0ID0gMSAvKiBWYWx1ZXNTdGFydFBvc2l0aW9uICovICtcbiAgICAgICAgICAgIChkaXJlY3RpdmVJbmRleCAqIDQgLyogU2l6ZSAqLyk7XG4gICAgICAgIHdoaWxlIChjYWNoZWRWYWx1ZXMubGVuZ3RoIDwgbGltaXQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBPTkxZIGRpcmVjdGl2ZSBjbGFzcyBzdHlsaW5nIChsaWtlIG5nQ2xhc3MpIHdhcyB1c2VkXG4gICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIHJvb3QgZGlyZWN0aXZlIHdpbGwgc3RpbGwgbmVlZCB0byBiZSBmaWxsZWQgaW4gYXMgd2VsbFxuICAgICAgICAgICAgLy8gYXMgYW55IG90aGVyIGRpcmVjdGl2ZSBzcGFjZXMgaW4gY2FzZSB0aGV5IG9ubHkgdXNlZCBzdGF0aWMgdmFsdWVzXG4gICAgICAgICAgICBjYWNoZWRWYWx1ZXMucHVzaCgwLCBzdGFydFBvc2l0aW9uLCBudWxsLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYWNoZWRWYWx1ZXMucHVzaCgwLCBzdGFydFBvc2l0aW9uLCBudWxsLCBjb3VudCk7XG59XG4vKipcbiAqIEluc2VydHMgb3IgdXBkYXRlcyBhbiBleGlzdGluZyBlbnRyeSBpbiB0aGUgcHJvdmlkZWQgYHN0YXRpY1N0eWxlc2AgY29sbGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHJlcHJlc2VudGluZyBhbiBleGlzdGluZyBzdHlsaW5nIGVudHJ5IGluIHRoZSBjb2xsZWN0aW9uOlxuICogIGlmIHByb3ZpZGVkIChudW1lcmljKTogdGhlbiBpdCB3aWxsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkgYXQgdGhlIGdpdmVuIHBvc2l0aW9uXG4gKiAgaWYgbnVsbDogdGhlbiBpdCB3aWxsIGluc2VydCBhIG5ldyBlbnRyeSB3aXRoaW4gdGhlIGNvbGxlY3Rpb25cbiAqIEBwYXJhbSBzdGF0aWNTdHlsZXMgYSBjb2xsZWN0aW9uIG9mIHN0eWxlIG9yIGNsYXNzIGVudHJpZXMgd2hlcmUgdGhlIHZhbHVlIHdpbGxcbiAqICBiZSBpbnNlcnRlZCBvciBwYXRjaGVkXG4gKiBAcGFyYW0gcHJvcCB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhlIGVudHJ5IChlLmcuIGB3aWR0aGAgKHN0eWxlcykgb3IgYGZvb2AgKGNsYXNzZXMpKVxuICogQHBhcmFtIHZhbHVlIHRoZSBzdHlsaW5nIHZhbHVlIG9mIHRoZSBlbnRyeSAoZS5nLiBgYWJzb2x1dGVgIChzdHlsZXMpIG9yIGB0cnVlYCAoY2xhc3NlcykpXG4gKiBAcGFyYW0gZGlyZWN0aXZlT3duZXJJbmRleCB0aGUgZGlyZWN0aXZlIG93bmVyIGluZGV4IHZhbHVlIG9mIHRoZSBzdHlsaW5nIHNvdXJjZSByZXNwb25zaWJsZVxuICogICAgICAgIGZvciB0aGVzZSBzdHlsZXMgKHNlZSBgaW50ZXJmYWNlcy9zdHlsaW5nLnRzI2RpcmVjdGl2ZXNgIGZvciBtb3JlIGluZm8pXG4gKiBAcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHVwZGF0ZWQgb3IgbmV3IGVudHJ5IHdpdGhpbiB0aGUgY29sbGVjdGlvblxuICovXG5mdW5jdGlvbiBhZGRPclVwZGF0ZVN0YXRpY1N0eWxlKGluZGV4LCBzdGF0aWNTdHlsZXMsIHByb3AsIHZhbHVlLCBkaXJlY3RpdmVPd25lckluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSB7XG4gICAgICAgIGluZGV4ID0gc3RhdGljU3R5bGVzLmxlbmd0aDtcbiAgICAgICAgc3RhdGljU3R5bGVzLnB1c2gobnVsbCwgbnVsbCwgbnVsbCk7XG4gICAgICAgIHN0YXRpY1N0eWxlc1tpbmRleCArIDAgLyogUHJvcE9mZnNldCAqL10gPSBwcm9wO1xuICAgIH1cbiAgICBzdGF0aWNTdHlsZXNbaW5kZXggKyAxIC8qIFZhbHVlT2Zmc2V0ICovXSA9IHZhbHVlO1xuICAgIHN0YXRpY1N0eWxlc1tpbmRleCArIDIgLyogRGlyZWN0aXZlT3duZXJPZmZzZXQgKi9dID0gZGlyZWN0aXZlT3duZXJJbmRleDtcbiAgICByZXR1cm4gaW5kZXg7XG59XG5mdW5jdGlvbiBhc3NlcnRWYWxpZERpcmVjdGl2ZUluZGV4KGNvbnRleHQsIGRpcmVjdGl2ZUluZGV4KSB7XG4gICAgdmFyIGRpcnMgPSBjb250ZXh0WzIgLyogRGlyZWN0aXZlUmVnaXN0cnlQb3NpdGlvbiAqL107XG4gICAgdmFyIGluZGV4ID0gZGlyZWN0aXZlSW5kZXggKiAyIC8qIFNpemUgKi87XG4gICAgaWYgKGluZGV4ID49IGRpcnMubGVuZ3RoIHx8XG4gICAgICAgIGRpcnNbaW5kZXggKyAwIC8qIFNpbmdsZVByb3BWYWx1ZXNJbmRleE9mZnNldCAqL10gPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGRpcmVjdGl2ZSBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdHlsaW5nIGNvbnRleHQnKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBOR19URU1QTEFURV9TRUxFQ1RPUiA9ICduZy10ZW1wbGF0ZSc7XG5mdW5jdGlvbiBpc0Nzc0NsYXNzTWF0Y2hpbmcobm9kZUNsYXNzQXR0clZhbCwgY3NzQ2xhc3NUb01hdGNoKSB7XG4gICAgdmFyIG5vZGVDbGFzc2VzTGVuID0gbm9kZUNsYXNzQXR0clZhbC5sZW5ndGg7XG4gICAgdmFyIG1hdGNoSW5kZXggPSBub2RlQ2xhc3NBdHRyVmFsLmluZGV4T2YoY3NzQ2xhc3NUb01hdGNoKTtcbiAgICB2YXIgbWF0Y2hFbmRJZHggPSBtYXRjaEluZGV4ICsgY3NzQ2xhc3NUb01hdGNoLmxlbmd0aDtcbiAgICBpZiAobWF0Y2hJbmRleCA9PT0gLTEgLy8gbm8gbWF0Y2hcbiAgICAgICAgfHwgKG1hdGNoSW5kZXggPiAwICYmIG5vZGVDbGFzc0F0dHJWYWxbbWF0Y2hJbmRleCAtIDFdICE9PSAnICcpIC8vIG5vIHNwYWNlIGJlZm9yZVxuICAgICAgICB8fFxuICAgICAgICAgICAgKG1hdGNoRW5kSWR4IDwgbm9kZUNsYXNzZXNMZW4gJiYgbm9kZUNsYXNzQXR0clZhbFttYXRjaEVuZElkeF0gIT09ICcgJykpIC8vIG5vIHNwYWNlIGFmdGVyXG4gICAgIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogRnVuY3Rpb24gdGhhdCBjaGVja3Mgd2hldGhlciBhIGdpdmVuIHROb2RlIG1hdGNoZXMgdGFnLWJhc2VkIHNlbGVjdG9yIGFuZCBoYXMgYSB2YWxpZCB0eXBlLlxuICpcbiAqIE1hdGNoaW5nIGNhbiBiZSBwZXJmb3JtZWQgaW4gMiBtb2RlczogcHJvamVjdGlvbiBtb2RlICh3aGVuIHdlIHByb2plY3Qgbm9kZXMpIGFuZCByZWd1bGFyXG4gKiBkaXJlY3RpdmUgbWF0Y2hpbmcgbW9kZTpcbiAqIC0gaW4gdGhlIFwiZGlyZWN0aXZlIG1hdGNoaW5nXCIgbW9kZSB3ZSBkbyBfbm90XyB0YWtlIFRDb250YWluZXIncyB0YWdOYW1lIGludG8gYWNjb3VudCBpZiBpdCBpc1xuICogZGlmZmVyZW50IGZyb20gTkdfVEVNUExBVEVfU0VMRUNUT1IgKHZhbHVlIGRpZmZlcmVudCBmcm9tIE5HX1RFTVBMQVRFX1NFTEVDVE9SIGluZGljYXRlcyB0aGF0IGFcbiAqIHRhZyBuYW1lIHdhcyBleHRyYWN0ZWQgZnJvbSAqIHN5bnRheCBzbyB3ZSB3b3VsZCBtYXRjaCB0aGUgc2FtZSBkaXJlY3RpdmUgdHdpY2UpO1xuICogLSBpbiB0aGUgXCJwcm9qZWN0aW9uXCIgbW9kZSwgd2UgdXNlIGEgdGFnIG5hbWUgcG90ZW50aWFsbHkgZXh0cmFjdGVkIGZyb20gdGhlICogc3ludGF4IHByb2Nlc3NpbmdcbiAqIChhcHBsaWNhYmxlIHRvIFROb2RlVHlwZS5Db250YWluZXIgb25seSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1RhZ0FuZFR5cGVNYXRjaCh0Tm9kZSwgY3VycmVudFNlbGVjdG9yLCBpc1Byb2plY3Rpb25Nb2RlKSB7XG4gICAgdmFyIHRhZ05hbWVUb0NvbXBhcmUgPSB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyAmJiAhaXNQcm9qZWN0aW9uTW9kZSA/XG4gICAgICAgIE5HX1RFTVBMQVRFX1NFTEVDVE9SIDpcbiAgICAgICAgdE5vZGUudGFnTmFtZTtcbiAgICByZXR1cm4gY3VycmVudFNlbGVjdG9yID09PSB0YWdOYW1lVG9Db21wYXJlO1xufVxuLyoqXG4gKiBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gbWF0Y2ggYW4gSXZ5IG5vZGUgc3RhdGljIGRhdGEgYWdhaW5zdCBhIHNpbXBsZSBDU1Mgc2VsZWN0b3JcbiAqXG4gKiBAcGFyYW0gbm9kZSBzdGF0aWMgZGF0YSBvZiB0aGUgbm9kZSB0byBtYXRjaFxuICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byB0cnkgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgbm9kZS5cbiAqIEBwYXJhbSBpc1Byb2plY3Rpb25Nb2RlIGlmIGB0cnVlYCB3ZSBhcmUgbWF0Y2hpbmcgZm9yIGNvbnRlbnQgcHJvamVjdGlvbiwgb3RoZXJ3aXNlIHdlIGFyZSBkb2luZ1xuICogZGlyZWN0aXZlIG1hdGNoaW5nLlxuICogQHJldHVybnMgdHJ1ZSBpZiBub2RlIG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBzZWxlY3RvciwgaXNQcm9qZWN0aW9uTW9kZSkge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHNlbGVjdG9yWzBdLCAnU2VsZWN0b3Igc2hvdWxkIGhhdmUgYSB0YWcgbmFtZScpO1xuICAgIHZhciBtb2RlID0gNCAvKiBFTEVNRU5UICovO1xuICAgIHZhciBub2RlQXR0cnMgPSB0Tm9kZS5hdHRycyB8fCBbXTtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiBmaXJzdCBhdHRyaWJ1dGUgdGhhdCBoYXMgbm8gdmFsdWUsIG9ubHkgYSBuYW1lLlxuICAgIHZhciBuYW1lT25seU1hcmtlcklkeCA9IGdldE5hbWVPbmx5TWFya2VySW5kZXgobm9kZUF0dHJzKTtcbiAgICAvLyBXaGVuIHByb2Nlc3NpbmcgXCI6bm90XCIgc2VsZWN0b3JzLCB3ZSBza2lwIHRvIHRoZSBuZXh0IFwiOm5vdFwiIGlmIHRoZVxuICAgIC8vIGN1cnJlbnQgb25lIGRvZXNuJ3QgbWF0Y2hcbiAgICB2YXIgc2tpcFRvTmV4dFNlbGVjdG9yID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Rvci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudCA9IHNlbGVjdG9yW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBhIDpub3Qgc2VsZWN0b3IgYW5kIGl0IGhhc24ndCBmYWlsZWQsIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgaWYgKCFza2lwVG9OZXh0U2VsZWN0b3IgJiYgIWlzUG9zaXRpdmUobW9kZSkgJiYgIWlzUG9zaXRpdmUoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcgdG8gdGhlIG5leHQgOm5vdCgpIGFuZCB0aGlzIG1vZGUgZmxhZyBpcyBwb3NpdGl2ZSxcbiAgICAgICAgICAgIC8vIGl0J3MgYSBwYXJ0IG9mIHRoZSBjdXJyZW50IDpub3QoKSBzZWxlY3RvciwgYW5kIHdlIHNob3VsZCBrZWVwIHNraXBwaW5nXG4gICAgICAgICAgICBpZiAoc2tpcFRvTmV4dFNlbGVjdG9yICYmIGlzUG9zaXRpdmUoY3VycmVudCkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGUgPSBjdXJyZW50IHwgKG1vZGUgJiAxIC8qIE5PVCAqLyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2tpcFRvTmV4dFNlbGVjdG9yKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChtb2RlICYgNCAvKiBFTEVNRU5UICovKSB7XG4gICAgICAgICAgICBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi8gfCBtb2RlICYgMSAvKiBOT1QgKi87XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gJycgJiYgIWhhc1RhZ0FuZFR5cGVNYXRjaCh0Tm9kZSwgY3VycmVudCwgaXNQcm9qZWN0aW9uTW9kZSkgfHxcbiAgICAgICAgICAgICAgICBjdXJyZW50ID09PSAnJyAmJiBzZWxlY3Rvci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNQb3NpdGl2ZShtb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JBdHRyVmFsdWUgPSBtb2RlICYgOCAvKiBDTEFTUyAqLyA/IGN1cnJlbnQgOiBzZWxlY3RvclsrK2ldO1xuICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtYXRjaGluZyBhZ2FpbnN0IGNsYXNzZXMgd2hlbiBhIHROb2RlIGhhcyBiZWVuIGluc3RhbnRpYXRlZCB3aXRoXG4gICAgICAgICAgICAvLyBjbGFzcyBhbmQgc3R5bGUgdmFsdWVzIGFzIHNlcGFyYXRlIGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4gWyd0aXRsZScsIENMQVNTLCAnZm9vJ10pXG4gICAgICAgICAgICBpZiAoKG1vZGUgJiA4IC8qIENMQVNTICovKSAmJiB0Tm9kZS5zdHlsaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ3NzQ2xhc3NNYXRjaGluZyhyZWFkQ2xhc3NWYWx1ZUZyb21UTm9kZSh0Tm9kZSksIHNlbGVjdG9yQXR0clZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQb3NpdGl2ZShtb2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaXNJbmxpbmVUZW1wbGF0ZSA9IHROb2RlLnR5cGUgPT0gMCAvKiBDb250YWluZXIgKi8gJiYgdE5vZGUudGFnTmFtZSAhPT0gTkdfVEVNUExBVEVfU0VMRUNUT1I7XG4gICAgICAgICAgICB2YXIgYXR0ck5hbWUgPSAobW9kZSAmIDggLyogQ0xBU1MgKi8pID8gJ2NsYXNzJyA6IGN1cnJlbnQ7XG4gICAgICAgICAgICB2YXIgYXR0ckluZGV4SW5Ob2RlID0gZmluZEF0dHJJbmRleEluTm9kZShhdHRyTmFtZSwgbm9kZUF0dHJzLCBpc0lubGluZVRlbXBsYXRlLCBpc1Byb2plY3Rpb25Nb2RlKTtcbiAgICAgICAgICAgIGlmIChhdHRySW5kZXhJbk5vZGUgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmUobW9kZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdG9yQXR0clZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHZhciBub2RlQXR0clZhbHVlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmIChhdHRySW5kZXhJbk5vZGUgPiBuYW1lT25seU1hcmtlcklkeCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlQXR0clZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90RXF1YWwobm9kZUF0dHJzW2F0dHJJbmRleEluTm9kZV0sIDAgLyogTmFtZXNwYWNlVVJJICovLCAnV2UgZG8gbm90IG1hdGNoIGRpcmVjdGl2ZXMgb24gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzJyk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSBub2RlQXR0cnNbYXR0ckluZGV4SW5Ob2RlICsgMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjb21wYXJlQWdhaW5zdENsYXNzTmFtZSA9IG1vZGUgJiA4IC8qIENMQVNTICovID8gbm9kZUF0dHJWYWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICFpc0Nzc0NsYXNzTWF0Y2hpbmcoY29tcGFyZUFnYWluc3RDbGFzc05hbWUsIHNlbGVjdG9yQXR0clZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICBtb2RlICYgMiAvKiBBVFRSSUJVVEUgKi8gJiYgc2VsZWN0b3JBdHRyVmFsdWUgIT09IG5vZGVBdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmUobW9kZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc1Bvc2l0aXZlKG1vZGUpIHx8IHNraXBUb05leHRTZWxlY3Rvcjtcbn1cbmZ1bmN0aW9uIGlzUG9zaXRpdmUobW9kZSkge1xuICAgIHJldHVybiAobW9kZSAmIDEgLyogTk9UICovKSA9PT0gMDtcbn1cbmZ1bmN0aW9uIHJlYWRDbGFzc1ZhbHVlRnJvbVROb2RlKHROb2RlKSB7XG4gICAgLy8gY29tcGFyaW5nIGFnYWluc3QgQ1NTIGNsYXNzIHZhbHVlcyBpcyBjb21wbGV4IGJlY2F1c2UgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgcGxhY2UgdGhlbSBhc1xuICAgIC8vIHJlZ3VsYXIgYXR0cmlidXRlcyB3aGVuIGFuIGVsZW1lbnQgaXMgY3JlYXRlZC4gSW5zdGVhZCwgdGhlIGNsYXNzZXMgKGFuZCBzdHlsZXMgZm9yXG4gICAgLy8gdGhhdCBtYXR0ZXIpIGFyZSBwbGFjZWQgaW4gYSBzcGVjaWFsIHN0eWxpbmcgY29udGV4dCB0aGF0IGlzIHVzZWQgZm9yIHJlc29sdmluZyBhbGxcbiAgICAvLyBjbGFzcy9zdHlsZSB2YWx1ZXMgYWNyb3NzIHN0YXRpYyBhdHRyaWJ1dGVzLCBbc3R5bGVdL1tjbGFzc10gYW5kIFtzdHlsZS5wcm9wXS9bY2xhc3MubmFtZV1cbiAgICAvLyBiaW5kaW5ncy4gVGhlcmVmb3JlIGlmIGFuZCB3aGVuIHRoZSBzdHlsaW5nIGNvbnRleHQgZXhpc3RzIHRoZW4gdGhlIGNsYXNzIHZhbHVlcyBhcmUgdG8gYmVcbiAgICAvLyBleHRyYWN0ZWQgYnkgdGhlIGNvbnRleHQgaGVscGVyIGNvZGUgYmVsb3cuLi5cbiAgICByZXR1cm4gdE5vZGUuc3R5bGluZ1RlbXBsYXRlID8gZ2V0SW5pdGlhbENsYXNzTmFtZVZhbHVlKHROb2RlLnN0eWxpbmdUZW1wbGF0ZSkgOiAnJztcbn1cbi8qKlxuICogRXhhbWluZXMgdGhlIGF0dHJpYnV0ZSdzIGRlZmluaXRpb24gYXJyYXkgZm9yIGEgbm9kZSB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGVcbiAqIGF0dHJpYnV0ZSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IG1hdGNoIG5hbWVzcGFjZWQgYXR0cmlidXRlcy5cbiAqXG4gKiBBdHRyaWJ1dGUgbWF0Y2hpbmcgZGVwZW5kcyB1cG9uIGBpc0lubGluZVRlbXBsYXRlYCBhbmQgYGlzUHJvamVjdGlvbk1vZGVgLlxuICogVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHdoaWNoIHR5cGVzIG9mIGF0dHJpYnV0ZXMgd2UgYXR0ZW1wdCB0byBtYXRjaDpcbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTW9kZXMgICAgICAgICAgICAgICAgICAgfCBOb3JtYWwgQXR0cmlidXRlcyB8IEJpbmRpbmdzIEF0dHJpYnV0ZXMgfCBUZW1wbGF0ZSBBdHRyaWJ1dGVzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogSW5saW5lICsgUHJvamVjdGlvbiAgICAgfCBZRVMgICAgICAgICAgICAgICB8IFlFUyAgICAgICAgICAgICAgICAgfCBOT1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIElubGluZSArIERpcmVjdGl2ZSAgICAgIHwgTk8gICAgICAgICAgICAgICAgfCBOTyAgICAgICAgICAgICAgICAgIHwgWUVTXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTm9uLWlubGluZSArIFByb2plY3Rpb24gfCBZRVMgICAgICAgICAgICAgICB8IFlFUyAgICAgICAgICAgICAgICAgfCBOT1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIE5vbi1pbmxpbmUgKyBEaXJlY3RpdmUgIHwgWUVTICAgICAgICAgICAgICAgfCBZRVMgICAgICAgICAgICAgICAgIHwgTk9cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBmaW5kXG4gKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZSBhcnJheSB0byBleGFtaW5lXG4gKiBAcGFyYW0gaXNJbmxpbmVUZW1wbGF0ZSB0cnVlIGlmIHRoZSBub2RlIGJlaW5nIG1hdGNoZWQgaXMgYW4gaW5saW5lIHRlbXBsYXRlIChlLmcuIGAqbmdGb3JgKVxuICogcmF0aGVyIHRoYW4gYSBtYW51YWxseSBleHBhbmRlZCB0ZW1wbGF0ZSBub2RlIChlLmcgYDxuZy10ZW1wbGF0ZT5gKS5cbiAqIEBwYXJhbSBpc1Byb2plY3Rpb25Nb2RlIHRydWUgaWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgY29udGVudCBwcm9qZWN0aW9uIG90aGVyd2lzZSB3ZSBhcmVcbiAqIG1hdGNoaW5nIGFnYWluc3QgZGlyZWN0aXZlcy5cbiAqL1xuZnVuY3Rpb24gZmluZEF0dHJJbmRleEluTm9kZShuYW1lLCBhdHRycywgaXNJbmxpbmVUZW1wbGF0ZSwgaXNQcm9qZWN0aW9uTW9kZSkge1xuICAgIGlmIChhdHRycyA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIHZhciBpID0gMDtcbiAgICBpZiAoaXNQcm9qZWN0aW9uTW9kZSB8fCAhaXNJbmxpbmVUZW1wbGF0ZSkge1xuICAgICAgICB2YXIgYmluZGluZ3NNb2RlID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbWF5YmVBdHRyTmFtZSA9IGF0dHJzW2ldO1xuICAgICAgICAgICAgaWYgKG1heWJlQXR0ck5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDMgLyogQmluZGluZ3MgKi8pIHtcbiAgICAgICAgICAgICAgICBiaW5kaW5nc01vZGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gMSAvKiBDbGFzc2VzICovKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYXR0cnNbKytpXTtcbiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgc2tpcCBjbGFzc2VzIGhlcmUgYmVjYXVzZSB3ZSBoYXZlIGEgc2VwYXJhdGUgbWVjaGFuaXNtIGZvclxuICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIGNsYXNzZXMgaW4gcHJvamVjdGlvbiBtb2RlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbKytpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXliZUF0dHJOYW1lID09PSA0IC8qIFRlbXBsYXRlICovKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGNhcmUgYWJvdXQgVGVtcGxhdGUgYXR0cmlidXRlcyBpbiB0aGlzIHNjZW5hcmlvLlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSB3aG9sZSBuYW1lc3BhY2VkIGF0dHJpYnV0ZSBhbmQgdmFsdWUuIFRoaXMgaXMgYnkgZGVzaWduLlxuICAgICAgICAgICAgICAgIGkgKz0gNDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluIGJpbmRpbmcgbW9kZSB0aGVyZSBhcmUgb25seSBuYW1lcywgcmF0aGVyIHRoYW4gbmFtZS12YWx1ZSBwYWlycy5cbiAgICAgICAgICAgIGkgKz0gYmluZGluZ3NNb2RlID8gMSA6IDI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZGlkIG5vdCBtYXRjaCB0aGUgYXR0cmlidXRlXG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBtYXRjaFRlbXBsYXRlQXR0cmlidXRlKGF0dHJzLCBuYW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yTGlzdCh0Tm9kZSwgc2VsZWN0b3IsIGlzUHJvamVjdGlvbk1vZGUpIHtcbiAgICBpZiAoaXNQcm9qZWN0aW9uTW9kZSA9PT0gdm9pZCAwKSB7IGlzUHJvamVjdGlvbk1vZGUgPSBmYWxzZTsgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzTm9kZU1hdGNoaW5nU2VsZWN0b3IodE5vZGUsIHNlbGVjdG9yW2ldLCBpc1Byb2plY3Rpb25Nb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvamVjdEFzQXR0clZhbHVlKHROb2RlKSB7XG4gICAgdmFyIG5vZGVBdHRycyA9IHROb2RlLmF0dHJzO1xuICAgIGlmIChub2RlQXR0cnMgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbmdQcm9qZWN0QXNBdHRySWR4ID0gbm9kZUF0dHJzLmluZGV4T2YoNSAvKiBQcm9qZWN0QXMgKi8pO1xuICAgICAgICAvLyBvbmx5IGNoZWNrIGZvciBuZ1Byb2plY3RBcyBpbiBhdHRyaWJ1dGUgbmFtZXMsIGRvbid0IGFjY2lkZW50YWxseSBtYXRjaCBhdHRyaWJ1dGUncyB2YWx1ZVxuICAgICAgICAvLyAoYXR0cmlidXRlIG5hbWVzIGFyZSBzdG9yZWQgYXQgZXZlbiBpbmRleGVzKVxuICAgICAgICBpZiAoKG5nUHJvamVjdEFzQXR0cklkeCAmIDEpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZUF0dHJzW25nUHJvamVjdEFzQXR0cklkeCArIDFdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0TmFtZU9ubHlNYXJrZXJJbmRleChub2RlQXR0cnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZUF0dHIgPSBub2RlQXR0cnNbaV07XG4gICAgICAgIGlmIChpc05hbWVPbmx5QXR0cmlidXRlTWFya2VyKG5vZGVBdHRyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVBdHRycy5sZW5ndGg7XG59XG5mdW5jdGlvbiBtYXRjaFRlbXBsYXRlQXR0cmlidXRlKGF0dHJzLCBuYW1lKSB7XG4gICAgdmFyIGkgPSBhdHRycy5pbmRleE9mKDQgLyogVGVtcGxhdGUgKi8pO1xuICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGF0dHJzW2ldID09PSBuYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBzZWxlY3RvciBpcyBpbnNpZGUgYSBDc3NTZWxlY3Rvckxpc3RcbiAqIEBwYXJhbSBzZWxlY3RvciBTZWxlY3RvciB0byBiZSBjaGVja2VkLlxuICogQHBhcmFtIGxpc3QgTGlzdCBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIGlzU2VsZWN0b3JJblNlbGVjdG9yTGlzdChzZWxlY3RvciwgbGlzdCkge1xuICAgIHNlbGVjdG9yTGlzdExvb3A6IGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VycmVudFNlbGVjdG9ySW5MaXN0ID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCAhPT0gY3VycmVudFNlbGVjdG9ySW5MaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxlY3Rvci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHNlbGVjdG9yW2pdICE9PSBjdXJyZW50U2VsZWN0b3JJbkxpc3Rbal0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZSBzZWxlY3Rvckxpc3RMb29wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciDJtTAkNyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsgfTtcbi8qKlxuICogQSBwZXJtYW5lbnQgbWFya2VyIHByb21pc2Ugd2hpY2ggc2lnbmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgQ0QgdHJlZSBpc1xuICogY2xlYW4uXG4gKi9cbnZhciBfQ0xFQU5fUFJPTUlTRSA9ICjJtTAkNykoKTtcbi8qKlxuICogUmVmcmVzaGVzIHRoZSB2aWV3LCBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBzdGVwcyBpbiB0aGF0IG9yZGVyOlxuICogdHJpZ2dlcnMgaW5pdCBob29rcywgcmVmcmVzaGVzIGR5bmFtaWMgZW1iZWRkZWQgdmlld3MsIHRyaWdnZXJzIGNvbnRlbnQgaG9va3MsIHNldHMgaG9zdFxuICogYmluZGluZ3MsIHJlZnJlc2hlcyBjaGlsZCBjb21wb25lbnRzLlxuICogTm90ZTogdmlldyBob29rcyBhcmUgdHJpZ2dlcmVkIGxhdGVyIHdoZW4gbGVhdmluZyB0aGUgdmlldy5cbiAqL1xuZnVuY3Rpb24gcmVmcmVzaERlc2NlbmRhbnRWaWV3cyhsVmlldykge1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICB2YXIgY3JlYXRpb25Nb2RlID0gaXNDcmVhdGlvbk1vZGUobFZpZXcpO1xuICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBjaGlsZHJlbiBhcmUgcHJvY2Vzc2VkIHRvIHN1cHBvcnQgcmVjdXJzaXZlIGNvbXBvbmVudHNcbiAgICB0Vmlldy5maXJzdFRlbXBsYXRlUGFzcyA9IGZhbHNlO1xuICAgIC8vIFJlc2V0dGluZyB0aGUgYmluZGluZ0luZGV4IG9mIHRoZSBjdXJyZW50IExWaWV3IGFzIHRoZSBuZXh0IHN0ZXBzIG1heSB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbFZpZXdbQklORElOR19JTkRFWF0gPSB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleDtcbiAgICAvLyBJZiB0aGlzIGlzIGEgY3JlYXRpb24gcGFzcywgd2Ugc2hvdWxkIG5vdCBjYWxsIGxpZmVjeWNsZSBob29rcyBvciBldmFsdWF0ZSBiaW5kaW5ncy5cbiAgICAvLyBUaGlzIHdpbGwgYmUgZG9uZSBpbiB0aGUgdXBkYXRlIHBhc3MuXG4gICAgaWYgKCFjcmVhdGlvbk1vZGUpIHtcbiAgICAgICAgdmFyIGNoZWNrTm9DaGFuZ2VzTW9kZSA9IGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpO1xuICAgICAgICBleGVjdXRlUHJlT3JkZXJIb29rcyhsVmlldywgdFZpZXcsIGNoZWNrTm9DaGFuZ2VzTW9kZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgcmVmcmVzaER5bmFtaWNFbWJlZGRlZFZpZXdzKGxWaWV3KTtcbiAgICAgICAgLy8gQ29udGVudCBxdWVyeSByZXN1bHRzIG11c3QgYmUgcmVmcmVzaGVkIGJlZm9yZSBjb250ZW50IGhvb2tzIGFyZSBjYWxsZWQuXG4gICAgICAgIHJlZnJlc2hDb250ZW50UXVlcmllcyh0VmlldywgbFZpZXcpO1xuICAgICAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTtcbiAgICAgICAgZXhlY3V0ZUhvb2tzKGxWaWV3LCB0Vmlldy5jb250ZW50SG9va3MsIHRWaWV3LmNvbnRlbnRDaGVja0hvb2tzLCBjaGVja05vQ2hhbmdlc01vZGUsIDEgLyogQWZ0ZXJDb250ZW50SW5pdEhvb2tzVG9CZVJ1biAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgc2V0SG9zdEJpbmRpbmdzKHRWaWV3LCBsVmlldyk7XG4gICAgfVxuICAgIC8vIFdlIHJlc29sdmUgY29udGVudCBxdWVyaWVzIHNwZWNpZmljYWxseSBtYXJrZWQgYXMgYHN0YXRpY2AgaW4gY3JlYXRpb24gbW9kZS4gRHluYW1pY1xuICAgIC8vIGNvbnRlbnQgcXVlcmllcyBhcmUgcmVzb2x2ZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gKGkuZS4gdXBkYXRlIG1vZGUpLCBhZnRlciBlbWJlZGRlZFxuICAgIC8vIHZpZXdzIGFyZSByZWZyZXNoZWQgKHNlZSBibG9jayBhYm92ZSkuXG4gICAgaWYgKGNyZWF0aW9uTW9kZSAmJiB0Vmlldy5zdGF0aWNDb250ZW50UXVlcmllcykge1xuICAgICAgICByZWZyZXNoQ29udGVudFF1ZXJpZXModFZpZXcsIGxWaWV3KTtcbiAgICB9XG4gICAgcmVmcmVzaENoaWxkQ29tcG9uZW50cyh0Vmlldy5jb21wb25lbnRzKTtcbn1cbi8qKiBTZXRzIHRoZSBob3N0IGJpbmRpbmdzIGZvciB0aGUgY3VycmVudCB2aWV3LiAqL1xuZnVuY3Rpb24gc2V0SG9zdEJpbmRpbmdzKHRWaWV3LCB2aWV3RGF0YSkge1xuICAgIHZhciBzZWxlY3RlZEluZGV4ID0gZ2V0U2VsZWN0ZWRJbmRleCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZ1Jvb3RJbmRleCA9IHZpZXdEYXRhW0JJTkRJTkdfSU5ERVhdID0gdFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXg7XG4gICAgICAgICAgICBzZXRCaW5kaW5nUm9vdChiaW5kaW5nUm9vdEluZGV4KTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RGlyZWN0aXZlSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50RWxlbWVudEluZGV4ID0gLTE7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb24gPSB0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvbiA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIG1lYW4gdGhhdCB3ZSBhcmUgc3RhcnRpbmcgbmV3IEVYUEFORE8gYmxvY2sgYW5kIG5lZWQgdG8gdXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBkaXJlY3RpdmUgaW5kZXguXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudEluZGV4ID0gLWluc3RydWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlSG9zdEVsZW1lbnQoY3VycmVudEVsZW1lbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3RvciBibG9jayBhbmQgcHJvdmlkZXJzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJDb3VudCA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnNbKytpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdSb290SW5kZXggKz0gSU5KRUNUT1JfQkxPT01fUEFSRU5UX1NJWkUgKyBwcm92aWRlckNvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZUluZGV4ID0gYmluZGluZ1Jvb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZWl0aGVyIHRoZSBpbmplY3RvciBzaXplIChzbyB0aGUgYmluZGluZyByb290IGNhbiBza2lwIG92ZXIgZGlyZWN0aXZlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGdldCB0byB0aGUgZmlyc3Qgc2V0IG9mIGhvc3QgYmluZGluZ3Mgb24gdGhpcyBub2RlKSBvciB0aGUgaG9zdCB2YXIgY291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0byBnZXQgdG8gdGhlIG5leHQgc2V0IG9mIGhvc3QgYmluZGluZ3Mgb24gdGhpcyBub2RlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdSb290SW5kZXggKz0gaW5zdHJ1Y3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0QmluZGluZ1Jvb3QoYmluZGluZ1Jvb3RJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIG51bWJlciwgaXQncyBhIGhvc3QgYmluZGluZyBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEYXRhW0JJTkRJTkdfSU5ERVhdID0gYmluZGluZ1Jvb3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob3N0Q3R4ID0gdW53cmFwUk5vZGUodmlld0RhdGFbY3VycmVudERpcmVjdGl2ZUluZGV4XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbigyIC8qIFVwZGF0ZSAqLywgaG9zdEN0eCwgY3VycmVudEVsZW1lbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFYWNoIGRpcmVjdGl2ZSBnZXRzIGEgdW5pcXVlSWQgdmFsdWUgdGhhdCBpcyB0aGUgc2FtZSBmb3IgYm90aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCB1cGRhdGUgY2FsbHMgd2hlbiB0aGUgaG9zdEJpbmRpbmdzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RpdmUgdW5pcXVlSWQgaXMgbm90IHNldCBhbnl3aGVyZS0taXQgaXMganVzdCBpbmNyZW1lbnRlZCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIGhvc3RCaW5kaW5ncyBjYWxsIGFuZCBpcyB1c2VmdWwgZm9yIGhlbHBpbmcgaW5zdHJ1Y3Rpb24gY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlbHkgZGV0ZXJtaW5lIHdoaWNoIGRpcmVjdGl2ZSBpcyBjdXJyZW50bHkgYWN0aXZlIHdoZW4gZXhlY3V0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRBY3RpdmVEaXJlY3RpdmVJZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgc2V0QWN0aXZlSG9zdEVsZW1lbnQoc2VsZWN0ZWRJbmRleCk7XG4gICAgfVxufVxuLyoqIFJlZnJlc2hlcyBjb250ZW50IHF1ZXJpZXMgZm9yIGFsbCBkaXJlY3RpdmVzIGluIHRoZSBnaXZlbiB2aWV3LiAqL1xuZnVuY3Rpb24gcmVmcmVzaENvbnRlbnRRdWVyaWVzKHRWaWV3LCBsVmlldykge1xuICAgIGlmICh0Vmlldy5jb250ZW50UXVlcmllcyAhPSBudWxsKSB7XG4gICAgICAgIHNldEN1cnJlbnRRdWVyeUluZGV4KDApO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRWaWV3LmNvbnRlbnRRdWVyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlRGVmSWR4ID0gdFZpZXcuY29udGVudFF1ZXJpZXNbaV07XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlRGVmID0gdFZpZXcuZGF0YVtkaXJlY3RpdmVEZWZJZHhdO1xuICAgICAgICAgICAgbmdEZXZNb2RlICYmXG4gICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChkaXJlY3RpdmVEZWYuY29udGVudFF1ZXJpZXMsICdjb250ZW50UXVlcmllcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCcpO1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVmLmNvbnRlbnRRdWVyaWVzKDIgLyogVXBkYXRlICovLCBsVmlld1tkaXJlY3RpdmVEZWZJZHhdLCBkaXJlY3RpdmVEZWZJZHgpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqIFJlZnJlc2hlcyBjaGlsZCBjb21wb25lbnRzIGluIHRoZSBjdXJyZW50IHZpZXcuICovXG5mdW5jdGlvbiByZWZyZXNoQ2hpbGRDb21wb25lbnRzKGNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50cyAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmcmVzaChjb21wb25lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5hdGl2ZSBlbGVtZW50IGZyb20gYSB0YWcgbmFtZSwgdXNpbmcgYSByZW5kZXJlci5cbiAqIEBwYXJhbSBuYW1lIHRoZSB0YWcgbmFtZVxuICogQHBhcmFtIG92ZXJyaWRkZW5SZW5kZXJlciBPcHRpb25hbCBBIHJlbmRlcmVyIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZVxuICogQHJldHVybnMgdGhlIGVsZW1lbnQgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBlbGVtZW50Q3JlYXRlKG5hbWUsIG92ZXJyaWRkZW5SZW5kZXJlcikge1xuICAgIHZhciBuYXRpdmU7XG4gICAgdmFyIHJlbmRlcmVyVG9Vc2UgPSBvdmVycmlkZGVuUmVuZGVyZXIgfHwgZ2V0TFZpZXcoKVtSRU5ERVJFUl07XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZSgpO1xuICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlclRvVXNlKSkge1xuICAgICAgICBuYXRpdmUgPSByZW5kZXJlclRvVXNlLmNyZWF0ZUVsZW1lbnQobmFtZSwgbmFtZXNwYWNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG5hdGl2ZSA9IHJlbmRlcmVyVG9Vc2UuY3JlYXRlRWxlbWVudChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZSA9IHJlbmRlcmVyVG9Vc2UuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5hdGl2ZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxWaWV3KHBhcmVudExWaWV3LCB0VmlldywgY29udGV4dCwgZmxhZ3MsIGhvc3QsIHRIb3N0Tm9kZSwgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlciwgc2FuaXRpemVyLCBpbmplY3Rvcikge1xuICAgIHZhciBsVmlldyA9IHRWaWV3LmJsdWVwcmludC5zbGljZSgpO1xuICAgIGxWaWV3W0hPU1RdID0gaG9zdDtcbiAgICBsVmlld1tGTEFHU10gPSBmbGFncyB8IDQgLyogQ3JlYXRpb25Nb2RlICovIHwgMTI4IC8qIEF0dGFjaGVkICovIHwgOCAvKiBGaXJzdExWaWV3UGFzcyAqLztcbiAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTtcbiAgICBsVmlld1tQQVJFTlRdID0gbFZpZXdbREVDTEFSQVRJT05fVklFV10gPSBwYXJlbnRMVmlldztcbiAgICBsVmlld1tDT05URVhUXSA9IGNvbnRleHQ7XG4gICAgbFZpZXdbUkVOREVSRVJfRkFDVE9SWV0gPSAocmVuZGVyZXJGYWN0b3J5IHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChsVmlld1tSRU5ERVJFUl9GQUNUT1JZXSwgJ1JlbmRlcmVyRmFjdG9yeSBpcyByZXF1aXJlZCcpO1xuICAgIGxWaWV3W1JFTkRFUkVSXSA9IChyZW5kZXJlciB8fCBwYXJlbnRMVmlldyAmJiBwYXJlbnRMVmlld1tSRU5ERVJFUl0pO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxWaWV3W1JFTkRFUkVSXSwgJ1JlbmRlcmVyIGlzIHJlcXVpcmVkJyk7XG4gICAgbFZpZXdbU0FOSVRJWkVSXSA9IHNhbml0aXplciB8fCBwYXJlbnRMVmlldyAmJiBwYXJlbnRMVmlld1tTQU5JVElaRVJdIHx8IG51bGw7XG4gICAgbFZpZXdbSU5KRUNUT1IkMV0gPSBpbmplY3RvciB8fCBwYXJlbnRMVmlldyAmJiBwYXJlbnRMVmlld1tJTkpFQ1RPUiQxXSB8fCBudWxsO1xuICAgIGxWaWV3W1RfSE9TVF0gPSB0SG9zdE5vZGU7XG4gICAgbmdEZXZNb2RlICYmIGF0dGFjaExWaWV3RGVidWcobFZpZXcpO1xuICAgIHJldHVybiBsVmlldztcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGVBdEluZGV4KGluZGV4LCB0eXBlLCBuYXRpdmUsIG5hbWUsIGF0dHJzKSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgdmFyIGFkanVzdGVkSW5kZXggPSBpbmRleCArIEhFQURFUl9PRkZTRVQ7XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydExlc3NUaGFuKGFkanVzdGVkSW5kZXgsIGxWaWV3Lmxlbmd0aCwgXCJTbG90IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBudWxsXCIpO1xuICAgIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gbmF0aXZlO1xuICAgIHZhciBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICB2YXIgaXNQYXJlbnQgPSBnZXRJc1BhcmVudCgpO1xuICAgIHZhciB0Tm9kZSA9IHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF07XG4gICAgaWYgKHROb2RlID09IG51bGwpIHtcbiAgICAgICAgdmFyIHBhcmVudF8xID0gaXNQYXJlbnQgPyBwcmV2aW91c09yUGFyZW50VE5vZGUgOiBwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDtcbiAgICAgICAgLy8gUGFyZW50cyBjYW5ub3QgY3Jvc3MgY29tcG9uZW50IGJvdW5kYXJpZXMgYmVjYXVzZSBjb21wb25lbnRzIHdpbGwgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMsXG4gICAgICAgIC8vIHNvIGl0J3Mgb25seSBzZXQgaWYgdGhlIHZpZXcgaXMgdGhlIHNhbWUuXG4gICAgICAgIHZhciBwYXJlbnRJblNhbWVWaWV3ID0gcGFyZW50XzEgJiYgcGFyZW50XzEgIT09IGxWaWV3W1RfSE9TVF07XG4gICAgICAgIHZhciB0UGFyZW50Tm9kZSA9IHBhcmVudEluU2FtZVZpZXcgPyBwYXJlbnRfMSA6IG51bGw7XG4gICAgICAgIHROb2RlID0gdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IGNyZWF0ZVROb2RlKHRQYXJlbnROb2RlLCB0eXBlLCBhZGp1c3RlZEluZGV4LCBuYW1lLCBhdHRycyk7XG4gICAgfVxuICAgIC8vIE5vdyBsaW5rIG91cnNlbHZlcyBpbnRvIHRoZSB0cmVlLlxuICAgIC8vIFdlIG5lZWQgdGhpcyBldmVuIGlmIHROb2RlIGV4aXN0cywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBwb2ludGluZyB0byB1bmV4aXN0aW5nIHROb2RlcyB3aGVuXG4gICAgLy8gd2UgdXNlIGkxOG4gKGVzcGVjaWFsbHkgd2l0aCBJQ1UgZXhwcmVzc2lvbnMgdGhhdCB1cGRhdGUgdGhlIERPTSBkdXJpbmcgdGhlIHVwZGF0ZSBwaGFzZSkuXG4gICAgaWYgKHByZXZpb3VzT3JQYXJlbnRUTm9kZSkge1xuICAgICAgICBpZiAoaXNQYXJlbnQgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLmNoaWxkID09IG51bGwgJiZcbiAgICAgICAgICAgICh0Tm9kZS5wYXJlbnQgIT09IG51bGwgfHwgcHJldmlvdXNPclBhcmVudFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykpIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgc2FtZSB2aWV3LCB3aGljaCBtZWFucyB3ZSBhcmUgYWRkaW5nIGNvbnRlbnQgbm9kZSB0byB0aGUgcGFyZW50IHZpZXcuXG4gICAgICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUuY2hpbGQgPSB0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNQYXJlbnQpIHtcbiAgICAgICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5uZXh0ID0gdE5vZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRWaWV3LmZpcnN0Q2hpbGQgPT0gbnVsbCkge1xuICAgICAgICB0Vmlldy5maXJzdENoaWxkID0gdE5vZGU7XG4gICAgfVxuICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSk7XG4gICAgc2V0SXNQYXJlbnQodHJ1ZSk7XG4gICAgcmV0dXJuIHROb2RlO1xufVxuZnVuY3Rpb24gYXNzaWduVFZpZXdOb2RlVG9MVmlldyh0VmlldywgdFBhcmVudE5vZGUsIGluZGV4LCBsVmlldykge1xuICAgIC8vIFZpZXcgbm9kZXMgYXJlIG5vdCBzdG9yZWQgaW4gZGF0YSBiZWNhdXNlIHRoZXkgY2FuIGJlIGFkZGVkIC8gcmVtb3ZlZCBhdCBydW50aW1lICh3aGljaFxuICAgIC8vIHdvdWxkIGNhdXNlIGluZGljZXMgdG8gY2hhbmdlKS4gVGhlaXIgVE5vZGVzIGFyZSBpbnN0ZWFkIHN0b3JlZCBpbiB0Vmlldy5ub2RlLlxuICAgIHZhciB0Tm9kZSA9IHRWaWV3Lm5vZGU7XG4gICAgaWYgKHROb2RlID09IG51bGwpIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIHRQYXJlbnROb2RlICYmXG4gICAgICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHRQYXJlbnROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovKTtcbiAgICAgICAgdFZpZXcubm9kZSA9IHROb2RlID0gY3JlYXRlVE5vZGUodFBhcmVudE5vZGUsIC8vXG4gICAgICAgIDIgLyogVmlldyAqLywgaW5kZXgsIG51bGwsIG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gbFZpZXdbVF9IT1NUXSA9IHROb2RlO1xufVxuLyoqXG4gKiBXaGVuIGVsZW1lbnRzIGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5IGFmdGVyIGEgdmlldyBibHVlcHJpbnQgaXMgY3JlYXRlZCAoZS5nLiB0aHJvdWdoXG4gKiBpMThuQXBwbHkoKSBvciBDb21wb25lbnRGYWN0b3J5LmNyZWF0ZSksIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBibHVlcHJpbnQgZm9yIGZ1dHVyZVxuICogdGVtcGxhdGUgcGFzc2VzLlxuICovXG5mdW5jdGlvbiBhbGxvY0V4cGFuZG8odmlldywgbnVtU2xvdHNUb0FsbG9jKSB7XG4gICAgdmFyIHRWaWV3ID0gdmlld1tUVklFV107XG4gICAgaWYgKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtU2xvdHNUb0FsbG9jOyBpKyspIHtcbiAgICAgICAgICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgdFZpZXcuZGF0YS5wdXNoKG51bGwpO1xuICAgICAgICAgICAgdmlldy5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGluY3JlbWVudCB0aGUgZXhwYW5kbyBzdGFydCBpbmRleCBpZiB0aGVyZSBhcmVuJ3QgYWxyZWFkeSBkaXJlY3RpdmVzXG4gICAgICAgIC8vIGFuZCBpbmplY3RvcnMgc2F2ZWQgaW4gdGhlIFwiZXhwYW5kb1wiIHNlY3Rpb25cbiAgICAgICAgaWYgKCF0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICAgICAgICB0Vmlldy5leHBhbmRvU3RhcnRJbmRleCArPSBudW1TbG90c1RvQWxsb2M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB3ZSdyZSBhZGRpbmcgdGhlIGR5bmFtaWMgbm9kZXMgaW50byB0aGUgZXhwYW5kbyBzZWN0aW9uLCB3ZSBuZWVkIHRvIGxldCB0aGUgaG9zdFxuICAgICAgICAgICAgLy8gYmluZGluZ3Mga25vdyB0aGF0IHRoZXkgc2hvdWxkIHNraXAgeCBzbG90c1xuICAgICAgICAgICAgdFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucy5wdXNoKG51bVNsb3RzVG9BbGxvYyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFVzZWQgZm9yIGNyZWF0aW5nIHRoZSBMVmlld05vZGUgb2YgYSBkeW5hbWljIGVtYmVkZGVkIHZpZXcsXG4gKiBlaXRoZXIgdGhyb3VnaCBWaWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldygpIG9yIFRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldygpLlxuICogU3VjaCBsVmlld05vZGUgd2lsbCB0aGVuIGJlIHJlbmRlcmVyIHdpdGggcmVuZGVyRW1iZWRkZWRUZW1wbGF0ZSgpIChzZWUgYmVsb3cpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFbWJlZGRlZFZpZXdBbmROb2RlKHRWaWV3LCBjb250ZXh0LCBkZWNsYXJhdGlvblZpZXcsIHF1ZXJpZXMsIGluamVjdG9ySW5kZXgpIHtcbiAgICB2YXIgX2lzUGFyZW50ID0gZ2V0SXNQYXJlbnQoKTtcbiAgICB2YXIgX3ByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIHNldElzUGFyZW50KHRydWUpO1xuICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShudWxsKTtcbiAgICB2YXIgbFZpZXcgPSBjcmVhdGVMVmlldyhkZWNsYXJhdGlvblZpZXcsIHRWaWV3LCBjb250ZXh0LCAxNiAvKiBDaGVja0Fsd2F5cyAqLywgbnVsbCwgbnVsbCk7XG4gICAgbFZpZXdbREVDTEFSQVRJT05fVklFV10gPSBkZWNsYXJhdGlvblZpZXc7XG4gICAgaWYgKHF1ZXJpZXMpIHtcbiAgICAgICAgbFZpZXdbUVVFUklFU10gPSBxdWVyaWVzLmNyZWF0ZVZpZXcoKTtcbiAgICB9XG4gICAgYXNzaWduVFZpZXdOb2RlVG9MVmlldyh0VmlldywgbnVsbCwgLTEsIGxWaWV3KTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgdFZpZXcubm9kZS5pbmplY3RvckluZGV4ID0gaW5qZWN0b3JJbmRleDtcbiAgICB9XG4gICAgc2V0SXNQYXJlbnQoX2lzUGFyZW50KTtcbiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUoX3ByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgcmV0dXJuIGxWaWV3O1xufVxuLyoqXG4gKiBVc2VkIGZvciByZW5kZXJpbmcgZW1iZWRkZWQgdmlld3MgKGUuZy4gZHluYW1pY2FsbHkgY3JlYXRlZCB2aWV3cylcbiAqXG4gKiBEeW5hbWljYWxseSBjcmVhdGVkIHZpZXdzIG11c3Qgc3RvcmUvcmV0cmlldmUgdGhlaXIgVFZpZXdzIGRpZmZlcmVudGx5IGZyb20gY29tcG9uZW50IHZpZXdzXG4gKiBiZWNhdXNlIHRoZWlyIHRlbXBsYXRlIGZ1bmN0aW9ucyBhcmUgbmVzdGVkIGluIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbnMgb2YgdGhlaXIgaG9zdHMsIGNyZWF0aW5nXG4gKiBjbG9zdXJlcy4gSWYgdGhlaXIgaG9zdCB0ZW1wbGF0ZSBoYXBwZW5zIHRvIGJlIGFuIGVtYmVkZGVkIHRlbXBsYXRlIGluIGEgbG9vcCAoZS5nLiBuZ0ZvciBpbnNpZGVcbiAqIGFuIG5nRm9yKSwgdGhlIG5lc3Rpbmcgd291bGQgbWVhbiB3ZSdkIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiwgc28gd2VcbiAqIGNhbid0IHN0b3JlIFRWaWV3cyBpbiB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gaXRzZWxmIChhcyB3ZSBkbyBmb3IgY29tcHMpLiBJbnN0ZWFkLCB3ZSBzdG9yZSB0aGVcbiAqIFRWaWV3IGZvciBkeW5hbWljYWxseSBjcmVhdGVkIHZpZXdzIG9uIHRoZWlyIGhvc3QgVE5vZGUsIHdoaWNoIG9ubHkgaGFzIG9uZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRW1iZWRkZWRUZW1wbGF0ZSh2aWV3VG9SZW5kZXIsIHRWaWV3LCBjb250ZXh0KSB7XG4gICAgdmFyIF9pc1BhcmVudCA9IGdldElzUGFyZW50KCk7XG4gICAgdmFyIF9wcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICB2YXIgb2xkVmlldztcbiAgICBpZiAodmlld1RvUmVuZGVyW0ZMQUdTXSAmIDUxMiAvKiBJc1Jvb3QgKi8pIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHJvb3QgdmlldyBpbnNpZGUgdGhlIHZpZXcgdHJlZVxuICAgICAgICB0aWNrUm9vdENvbnRleHQoZ2V0Um9vdENvbnRleHQodmlld1RvUmVuZGVyKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0SXNQYXJlbnQodHJ1ZSk7XG4gICAgICAgICAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUobnVsbCk7XG4gICAgICAgICAgICBvbGRWaWV3ID0gZW50ZXJWaWV3KHZpZXdUb1JlbmRlciwgdmlld1RvUmVuZGVyW1RfSE9TVF0pO1xuICAgICAgICAgICAgcmVzZXRQcmVPcmRlckhvb2tGbGFncyh2aWV3VG9SZW5kZXIpO1xuICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlKHRWaWV3LnRlbXBsYXRlLCBnZXRSZW5kZXJGbGFncyh2aWV3VG9SZW5kZXIpLCBjb250ZXh0KTtcbiAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgdG8gZmFsc2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpcnN0IGNyZWF0aW9uIHJ1biBiZWNhdXNlIGluIGFuXG4gICAgICAgICAgICAvLyBuZ0ZvciBsb29wLCBhbGwgdGhlIHZpZXdzIHdpbGwgYmUgY3JlYXRlZCB0b2dldGhlciBiZWZvcmUgdXBkYXRlIG1vZGUgcnVucyBhbmQgdHVybnNcbiAgICAgICAgICAgIC8vIG9mZiBmaXJzdFRlbXBsYXRlUGFzcy4gSWYgd2UgZG9uJ3Qgc2V0IGl0IGhlcmUsIGluc3RhbmNlcyB3aWxsIHBlcmZvcm0gZGlyZWN0aXZlXG4gICAgICAgICAgICAvLyBtYXRjaGluZywgZXRjIGFnYWluIGFuZCBhZ2Fpbi5cbiAgICAgICAgICAgIHZpZXdUb1JlbmRlcltUVklFV10uZmlyc3RUZW1wbGF0ZVBhc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3Modmlld1RvUmVuZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGxlYXZlVmlldyhvbGRWaWV3KTtcbiAgICAgICAgICAgIHNldElzUGFyZW50KF9pc1BhcmVudCk7XG4gICAgICAgICAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUoX3ByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnRPclRlbXBsYXRlKGhvc3RWaWV3LCBjb250ZXh0LCB0ZW1wbGF0ZUZuKSB7XG4gICAgdmFyIHJlbmRlcmVyRmFjdG9yeSA9IGhvc3RWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldO1xuICAgIHZhciBvbGRWaWV3ID0gZW50ZXJWaWV3KGhvc3RWaWV3LCBob3N0Vmlld1tUX0hPU1RdKTtcbiAgICB2YXIgbm9ybWFsRXhlY3V0aW9uUGF0aCA9ICFnZXRDaGVja05vQ2hhbmdlc01vZGUoKTtcbiAgICB2YXIgY3JlYXRpb25Nb2RlSXNBY3RpdmUgPSBpc0NyZWF0aW9uTW9kZShob3N0Vmlldyk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKG5vcm1hbEV4ZWN1dGlvblBhdGggJiYgIWNyZWF0aW9uTW9kZUlzQWN0aXZlICYmIHJlbmRlcmVyRmFjdG9yeS5iZWdpbikge1xuICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmJlZ2luKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNyZWF0aW9uTW9kZUlzQWN0aXZlKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGlvbiBtb2RlIHBhc3NcbiAgICAgICAgICAgIHRlbXBsYXRlRm4gJiYgZXhlY3V0ZVRlbXBsYXRlKHRlbXBsYXRlRm4sIDEgLyogQ3JlYXRlICovLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3MoaG9zdFZpZXcpO1xuICAgICAgICAgICAgaG9zdFZpZXdbRkxBR1NdICY9IH40IC8qIENyZWF0aW9uTW9kZSAqLztcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgbW9kZSBwYXNzXG4gICAgICAgIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3MoaG9zdFZpZXcpO1xuICAgICAgICB0ZW1wbGF0ZUZuICYmIGV4ZWN1dGVUZW1wbGF0ZSh0ZW1wbGF0ZUZuLCAyIC8qIFVwZGF0ZSAqLywgY29udGV4dCk7XG4gICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3MoaG9zdFZpZXcpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgaWYgKG5vcm1hbEV4ZWN1dGlvblBhdGggJiYgIWNyZWF0aW9uTW9kZUlzQWN0aXZlICYmIHJlbmRlcmVyRmFjdG9yeS5lbmQpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZWF2ZVZpZXcob2xkVmlldyk7XG4gICAgfVxufVxuZnVuY3Rpb24gZXhlY3V0ZVRlbXBsYXRlKHRlbXBsYXRlRm4sIHJmLCBjb250ZXh0KSB7XG4gICAgybXJtW5hbWVzcGFjZUhUTUwoKTtcbiAgICB2YXIgcHJldlNlbGVjdGVkSW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0QWN0aXZlSG9zdEVsZW1lbnQobnVsbCk7XG4gICAgICAgIHRlbXBsYXRlRm4ocmYsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChwcmV2U2VsZWN0ZWRJbmRleCk7XG4gICAgfVxufVxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiByZW5kZXJpbmcgZmxhZ3MgZGVwZW5kaW5nIG9uIHdoZW4gdGhlXG4gKiB0ZW1wbGF0ZSBpcyBpbiBjcmVhdGlvbiBtb2RlIG9yIHVwZGF0ZSBtb2RlLiBVcGRhdGUgYmxvY2sgYW5kIGNyZWF0ZSBibG9jayBhcmVcbiAqIGFsd2F5cyBydW4gc2VwYXJhdGVseS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVuZGVyRmxhZ3Modmlldykge1xuICAgIHJldHVybiBpc0NyZWF0aW9uTW9kZSh2aWV3KSA/IDEgLyogQ3JlYXRlICovIDogMiAvKiBVcGRhdGUgKi87XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLyBFbGVtZW50XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyoqXG4gKiBBcHByb3ByaWF0ZWx5IHNldHMgYHN0eWxpbmdUZW1wbGF0ZWAgb24gYSBUTm9kZVxuICpcbiAqIERvZXMgbm90IGFwcGx5IHN0eWxlcyB0byBET00gbm9kZXNcbiAqXG4gKiBAcGFyYW0gdE5vZGUgVGhlIG5vZGUgd2hvc2UgYHN0eWxpbmdUZW1wbGF0ZWAgdG8gc2V0XG4gKiBAcGFyYW0gYXR0cnMgVGhlIGF0dHJpYnV0ZSBhcnJheSBzb3VyY2UgdG8gc2V0IHRoZSBhdHRyaWJ1dGVzIGZyb21cbiAqIEBwYXJhbSBhdHRyc1N0YXJ0SW5kZXggT3B0aW9uYWwgc3RhcnQgaW5kZXggdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgYGF0dHJzYCBmcm9tXG4gKi9cbmZ1bmN0aW9uIHNldE5vZGVTdHlsaW5nVGVtcGxhdGUodFZpZXcsIHROb2RlLCBhdHRycywgYXR0cnNTdGFydEluZGV4KSB7XG4gICAgaWYgKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzICYmICF0Tm9kZS5zdHlsaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgdmFyIHN0eWxpbmdBdHRyc1N0YXJ0SW5kZXggPSBhdHRyc1N0eWxpbmdJbmRleE9mKGF0dHJzLCBhdHRyc1N0YXJ0SW5kZXgpO1xuICAgICAgICBpZiAoc3R5bGluZ0F0dHJzU3RhcnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0Tm9kZS5zdHlsaW5nVGVtcGxhdGUgPSBpbml0aWFsaXplU3RhdGljQ29udGV4dChhdHRycywgc3R5bGluZ0F0dHJzU3RhcnRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBleGVjdXRlQ29udGVudFF1ZXJpZXModFZpZXcsIHROb2RlLCBsVmlldykge1xuICAgIGlmIChpc0NvbnRlbnRRdWVyeUhvc3QodE5vZGUpKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgICAgICB2YXIgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kO1xuICAgICAgICBmb3IgKHZhciBkaXJlY3RpdmVJbmRleCA9IHN0YXJ0OyBkaXJlY3RpdmVJbmRleCA8IGVuZDsgZGlyZWN0aXZlSW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IHRWaWV3LmRhdGFbZGlyZWN0aXZlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKGRlZi5jb250ZW50UXVlcmllcykge1xuICAgICAgICAgICAgICAgIGRlZi5jb250ZW50UXVlcmllcygxIC8qIENyZWF0ZSAqLywgbFZpZXdbZGlyZWN0aXZlSW5kZXhdLCBkaXJlY3RpdmVJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgZGlyZWN0aXZlIGluc3RhbmNlcyBhbmQgcG9wdWxhdGVzIGxvY2FsIHJlZnMuXG4gKlxuICogQHBhcmFtIGxvY2FsUmVmcyBMb2NhbCByZWZzIG9mIHRoZSBub2RlIGluIHF1ZXN0aW9uXG4gKiBAcGFyYW0gbG9jYWxSZWZFeHRyYWN0b3IgbWFwcGluZyBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIGxvY2FsIHJlZiB2YWx1ZSBmcm9tIFROb2RlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZXNBbmRMb2NhbHModFZpZXcsIGxWaWV3LCBsb2NhbFJlZnMsIGxvY2FsUmVmRXh0cmFjdG9yKSB7XG4gICAgaWYgKGxvY2FsUmVmRXh0cmFjdG9yID09PSB2b2lkIDApIHsgbG9jYWxSZWZFeHRyYWN0b3IgPSBnZXROYXRpdmVCeVROb2RlOyB9XG4gICAgaWYgKCFnZXRCaW5kaW5nc0VuYWJsZWQoKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5maXJzdFRlbXBsYXRlUGFzcysrO1xuICAgICAgICByZXNvbHZlRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIGZpbmREaXJlY3RpdmVNYXRjaGVzKHRWaWV3LCBsVmlldywgcHJldmlvdXNPclBhcmVudFROb2RlKSwgcHJldmlvdXNPclBhcmVudFROb2RlLCBsb2NhbFJlZnMgfHwgbnVsbCk7XG4gICAgfVxuICAgIGluc3RhbnRpYXRlQWxsRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0VmlldywgbFZpZXcsIHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKGxWaWV3LCBwcmV2aW91c09yUGFyZW50VE5vZGUsIGxvY2FsUmVmRXh0cmFjdG9yKTtcbn1cbi8qKlxuICogVGFrZXMgYSBsaXN0IG9mIGxvY2FsIG5hbWVzIGFuZCBpbmRpY2VzIGFuZCBwdXNoZXMgdGhlIHJlc29sdmVkIGxvY2FsIHZhcmlhYmxlIHZhbHVlc1xuICogdG8gTFZpZXcgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgbG9hZGVkIGluIHRoZSB0ZW1wbGF0ZSB3aXRoIGxvYWQoKS5cbiAqL1xuZnVuY3Rpb24gc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKHZpZXdEYXRhLCB0Tm9kZSwgbG9jYWxSZWZFeHRyYWN0b3IpIHtcbiAgICB2YXIgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXM7XG4gICAgaWYgKGxvY2FsTmFtZXMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5kZXggPSB0Tm9kZS5pbmRleCArIDE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxOYW1lcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gbG9jYWxOYW1lc1tpICsgMV07XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA9PT0gLTEgP1xuICAgICAgICAgICAgICAgIGxvY2FsUmVmRXh0cmFjdG9yKHROb2RlLCB2aWV3RGF0YSkgOlxuICAgICAgICAgICAgICAgIHZpZXdEYXRhW2luZGV4XTtcbiAgICAgICAgICAgIHZpZXdEYXRhW2xvY2FsSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogR2V0cyBUVmlldyBmcm9tIGEgdGVtcGxhdGUgZnVuY3Rpb24gb3IgY3JlYXRlcyBhIG5ldyBUVmlld1xuICogaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIEBwYXJhbSB0ZW1wbGF0ZUZuIFRoZSB0ZW1wbGF0ZSBmcm9tIHdoaWNoIHRvIGdldCBzdGF0aWMgZGF0YVxuICogQHBhcmFtIGNvbnN0cyBUaGUgbnVtYmVyIG9mIG5vZGVzLCBsb2NhbCByZWZzLCBhbmQgcGlwZXMgaW4gdGhpcyB2aWV3XG4gKiBAcGFyYW0gdmFycyBUaGUgbnVtYmVyIG9mIGJpbmRpbmdzIGFuZCBwdXJlIGZ1bmN0aW9uIGJpbmRpbmdzIGluIHRoaXMgdmlld1xuICogQHBhcmFtIGRpcmVjdGl2ZXMgRGlyZWN0aXZlIGRlZnMgdGhhdCBzaG91bGQgYmUgc2F2ZWQgb24gVFZpZXdcbiAqIEBwYXJhbSBwaXBlcyBQaXBlIGRlZnMgdGhhdCBzaG91bGQgYmUgc2F2ZWQgb24gVFZpZXdcbiAqIEBwYXJhbSB2aWV3UXVlcnkgVmlldyBxdWVyeSB0aGF0IHNob3VsZCBiZSBzYXZlZCBvbiBUVmlld1xuICogQHBhcmFtIHNjaGVtYXMgU2NoZW1hcyB0aGF0IHNob3VsZCBiZSBzYXZlZCBvbiBUVmlld1xuICogQHJldHVybnMgVFZpZXdcbiAqL1xuZnVuY3Rpb24gZ2V0T3JDcmVhdGVUVmlldyh0ZW1wbGF0ZUZuLCBjb25zdHMsIHZhcnMsIGRpcmVjdGl2ZXMsIHBpcGVzLCB2aWV3UXVlcnksIHNjaGVtYXMpIHtcbiAgICAvLyBUT0RPKG1pc2tvKTogcmVhZGluZyBgbmdQcml2YXRlRGF0YWAgaGVyZSBpcyBwcm9ibGVtYXRpYyBmb3IgdHdvIHJlYXNvbnNcbiAgICAvLyAxLiBJdCBpcyBhIG1lZ2Ftb3JwaGljIGNhbGwgb24gZWFjaCBpbnZvY2F0aW9uLlxuICAgIC8vIDIuIEZvciBuZXN0ZWQgZW1iZWRkZWQgdmlld3MgKG5nRm9yIGluc2lkZSBuZ0ZvcikgdGhlIHRlbXBsYXRlIGluc3RhbmNlIGlzIHBlclxuICAgIC8vICAgIG91dGVyIHRlbXBsYXRlIGludm9jYXRpb24sIHdoaWNoIG1lYW5zIHRoYXQgbm8gc3VjaCBwcm9wZXJ0eSB3aWxsIGV4aXN0XG4gICAgLy8gQ29ycmVjdCBzb2x1dGlvbiBpcyB0byBvbmx5IHB1dCBgbmdQcml2YXRlRGF0YWAgb24gdGhlIENvbXBvbmVudCB0ZW1wbGF0ZVxuICAgIC8vIGFuZCBub3Qgb24gZW1iZWRkZWQgdGVtcGxhdGVzLlxuICAgIHJldHVybiB0ZW1wbGF0ZUZuLm5nUHJpdmF0ZURhdGEgfHxcbiAgICAgICAgKHRlbXBsYXRlRm4ubmdQcml2YXRlRGF0YSA9IGNyZWF0ZVRWaWV3KC0xLCB0ZW1wbGF0ZUZuLCBjb25zdHMsIHZhcnMsIGRpcmVjdGl2ZXMsIHBpcGVzLCB2aWV3UXVlcnksIHNjaGVtYXMpKTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIFRWaWV3IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHZpZXdJbmRleCBUaGUgdmlld0Jsb2NrSWQgZm9yIGlubGluZSB2aWV3cywgb3IgLTEgaWYgaXQncyBhIGNvbXBvbmVudC9keW5hbWljXG4gKiBAcGFyYW0gdGVtcGxhdGVGbiBUZW1wbGF0ZSBmdW5jdGlvblxuICogQHBhcmFtIGNvbnN0cyBUaGUgbnVtYmVyIG9mIG5vZGVzLCBsb2NhbCByZWZzLCBhbmQgcGlwZXMgaW4gdGhpcyB0ZW1wbGF0ZVxuICogQHBhcmFtIGRpcmVjdGl2ZXMgUmVnaXN0cnkgb2YgZGlyZWN0aXZlcyBmb3IgdGhpcyB2aWV3XG4gKiBAcGFyYW0gcGlwZXMgUmVnaXN0cnkgb2YgcGlwZXMgZm9yIHRoaXMgdmlld1xuICogQHBhcmFtIHZpZXdRdWVyeSBWaWV3IHF1ZXJpZXMgZm9yIHRoaXMgdmlld1xuICogQHBhcmFtIHNjaGVtYXMgU2NoZW1hcyBmb3IgdGhpcyB2aWV3XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRWaWV3KHZpZXdJbmRleCwgdGVtcGxhdGVGbiwgY29uc3RzLCB2YXJzLCBkaXJlY3RpdmVzLCBwaXBlcywgdmlld1F1ZXJ5LCBzY2hlbWFzKSB7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS50VmlldysrO1xuICAgIHZhciBiaW5kaW5nU3RhcnRJbmRleCA9IEhFQURFUl9PRkZTRVQgKyBjb25zdHM7XG4gICAgLy8gVGhpcyBsZW5ndGggZG9lcyBub3QgeWV0IGNvbnRhaW4gaG9zdCBiaW5kaW5ncyBmcm9tIGNoaWxkIGRpcmVjdGl2ZXMgYmVjYXVzZSBhdCB0aGlzIHBvaW50LFxuICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggZGlyZWN0aXZlcyBhcmUgYWN0aXZlIG9uIHRoaXMgdGVtcGxhdGUuIEFzIHNvb24gYXMgYSBkaXJlY3RpdmUgaXMgbWF0Y2hlZFxuICAgIC8vIHRoYXQgaGFzIGEgaG9zdCBiaW5kaW5nLCB3ZSB3aWxsIHVwZGF0ZSB0aGUgYmx1ZXByaW50IHdpdGggdGhhdCBkZWYncyBob3N0VmFycyBjb3VudC5cbiAgICB2YXIgaW5pdGlhbFZpZXdMZW5ndGggPSBiaW5kaW5nU3RhcnRJbmRleCArIHZhcnM7XG4gICAgdmFyIGJsdWVwcmludCA9IGNyZWF0ZVZpZXdCbHVlcHJpbnQoYmluZGluZ1N0YXJ0SW5kZXgsIGluaXRpYWxWaWV3TGVuZ3RoKTtcbiAgICByZXR1cm4gYmx1ZXByaW50W1RWSUVXXSA9IHtcbiAgICAgICAgaWQ6IHZpZXdJbmRleCxcbiAgICAgICAgYmx1ZXByaW50OiBibHVlcHJpbnQsXG4gICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUZuLFxuICAgICAgICB2aWV3UXVlcnk6IHZpZXdRdWVyeSxcbiAgICAgICAgbm9kZTogbnVsbCxcbiAgICAgICAgZGF0YTogYmx1ZXByaW50LnNsaWNlKCkuZmlsbChudWxsLCBiaW5kaW5nU3RhcnRJbmRleCksXG4gICAgICAgIGJpbmRpbmdTdGFydEluZGV4OiBiaW5kaW5nU3RhcnRJbmRleCxcbiAgICAgICAgdmlld1F1ZXJ5U3RhcnRJbmRleDogaW5pdGlhbFZpZXdMZW5ndGgsXG4gICAgICAgIGV4cGFuZG9TdGFydEluZGV4OiBpbml0aWFsVmlld0xlbmd0aCxcbiAgICAgICAgZXhwYW5kb0luc3RydWN0aW9uczogbnVsbCxcbiAgICAgICAgZmlyc3RUZW1wbGF0ZVBhc3M6IHRydWUsXG4gICAgICAgIHN0YXRpY1ZpZXdRdWVyaWVzOiBmYWxzZSxcbiAgICAgICAgc3RhdGljQ29udGVudFF1ZXJpZXM6IGZhbHNlLFxuICAgICAgICBwcmVPcmRlckhvb2tzOiBudWxsLFxuICAgICAgICBwcmVPcmRlckNoZWNrSG9va3M6IG51bGwsXG4gICAgICAgIGNvbnRlbnRIb29rczogbnVsbCxcbiAgICAgICAgY29udGVudENoZWNrSG9va3M6IG51bGwsXG4gICAgICAgIHZpZXdIb29rczogbnVsbCxcbiAgICAgICAgdmlld0NoZWNrSG9va3M6IG51bGwsXG4gICAgICAgIGRlc3Ryb3lIb29rczogbnVsbCxcbiAgICAgICAgY2xlYW51cDogbnVsbCxcbiAgICAgICAgY29udGVudFF1ZXJpZXM6IG51bGwsXG4gICAgICAgIGNvbXBvbmVudHM6IG51bGwsXG4gICAgICAgIGRpcmVjdGl2ZVJlZ2lzdHJ5OiB0eXBlb2YgZGlyZWN0aXZlcyA9PT0gJ2Z1bmN0aW9uJyA/IGRpcmVjdGl2ZXMoKSA6IGRpcmVjdGl2ZXMsXG4gICAgICAgIHBpcGVSZWdpc3RyeTogdHlwZW9mIHBpcGVzID09PSAnZnVuY3Rpb24nID8gcGlwZXMoKSA6IHBpcGVzLFxuICAgICAgICBmaXJzdENoaWxkOiBudWxsLFxuICAgICAgICBzY2hlbWFzOiBzY2hlbWFzLFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVWaWV3Qmx1ZXByaW50KGJpbmRpbmdTdGFydEluZGV4LCBpbml0aWFsVmlld0xlbmd0aCkge1xuICAgIHZhciBibHVlcHJpbnQgPSBuZXcgQXJyYXkoaW5pdGlhbFZpZXdMZW5ndGgpXG4gICAgICAgIC5maWxsKG51bGwsIDAsIGJpbmRpbmdTdGFydEluZGV4KVxuICAgICAgICAuZmlsbChOT19DSEFOR0UsIGJpbmRpbmdTdGFydEluZGV4KTtcbiAgICBibHVlcHJpbnRbQklORElOR19JTkRFWF0gPSBiaW5kaW5nU3RhcnRJbmRleDtcbiAgICByZXR1cm4gYmx1ZXByaW50O1xufVxuZnVuY3Rpb24gY3JlYXRlRXJyb3IodGV4dCwgdG9rZW4pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiUmVuZGVyZXI6IFwiICsgdGV4dCArIFwiIFtcIiArIHN0cmluZ2lmeUZvckVycm9yKHRva2VuKSArIFwiXVwiKTtcbn1cbi8qKlxuICogTG9jYXRlcyB0aGUgaG9zdCBuYXRpdmUgZWxlbWVudCwgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyBleGlzdGluZyBub2RlcyBpbnRvIHJlbmRlcmluZyBwaXBlbGluZS5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudE9yU2VsZWN0b3IgUmVuZGVyIGVsZW1lbnQgb3IgQ1NTIHNlbGVjdG9yIHRvIGxvY2F0ZSB0aGUgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gbG9jYXRlSG9zdEVsZW1lbnQoZmFjdG9yeSwgZWxlbWVudE9yU2VsZWN0b3IpIHtcbiAgICB2YXIgZGVmYXVsdFJlbmRlcmVyID0gZmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB2YXIgck5vZGUgPSB0eXBlb2YgZWxlbWVudE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnID9cbiAgICAgICAgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKGRlZmF1bHRSZW5kZXJlcikgP1xuICAgICAgICAgICAgZGVmYXVsdFJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KGVsZW1lbnRPclNlbGVjdG9yKSA6XG4gICAgICAgICAgICBkZWZhdWx0UmVuZGVyZXIucXVlcnlTZWxlY3RvcihlbGVtZW50T3JTZWxlY3RvcikpIDpcbiAgICAgICAgZWxlbWVudE9yU2VsZWN0b3I7XG4gICAgaWYgKG5nRGV2TW9kZSAmJiAhck5vZGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKCdIb3N0IG5vZGUgd2l0aCBzZWxlY3RvciBub3QgZm91bmQ6JywgZWxlbWVudE9yU2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoJ0hvc3Qgbm9kZSBpcyByZXF1aXJlZDonLCBlbGVtZW50T3JTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJOb2RlO1xufVxuLyoqXG4gKiBTYXZlcyBjb250ZXh0IGZvciB0aGlzIGNsZWFudXAgZnVuY3Rpb24gaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy5cbiAqXG4gKiBPbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcywgc2F2ZXMgaW4gVFZpZXc6XG4gKiAtIENsZWFudXAgZnVuY3Rpb25cbiAqIC0gSW5kZXggb2YgY29udGV4dCB3ZSBqdXN0IHNhdmVkIGluIExWaWV3LmNsZWFudXBJbnN0YW5jZXNcbiAqL1xuZnVuY3Rpb24gc3RvcmVDbGVhbnVwV2l0aENvbnRleHQobFZpZXcsIGNvbnRleHQsIGNsZWFudXBGbikge1xuICAgIHZhciBsQ2xlYW51cCA9IGdldENsZWFudXAobFZpZXcpO1xuICAgIGxDbGVhbnVwLnB1c2goY29udGV4dCk7XG4gICAgaWYgKGxWaWV3W1RWSUVXXS5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICBnZXRUVmlld0NsZWFudXAobFZpZXcpLnB1c2goY2xlYW51cEZuLCBsQ2xlYW51cC5sZW5ndGggLSAxKTtcbiAgICB9XG59XG4vKipcbiAqIFNhdmVzIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIGl0c2VsZiBpbiBMVmlldy5jbGVhbnVwSW5zdGFuY2VzLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgd3JhcHBlZCB3aXRoIHRoZWlyIGNvbnRleHRzLCBsaWtlIGluIHJlbmRlcmVyMlxuICogbGlzdGVuZXJzLlxuICpcbiAqIE9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzLCB0aGUgaW5kZXggb2YgdGhlIGNsZWFudXAgZnVuY3Rpb24gaXMgc2F2ZWQgaW4gVFZpZXcuXG4gKi9cbmZ1bmN0aW9uIHN0b3JlQ2xlYW51cEZuKHZpZXcsIGNsZWFudXBGbikge1xuICAgIGdldENsZWFudXAodmlldykucHVzaChjbGVhbnVwRm4pO1xuICAgIGlmICh2aWV3W1RWSUVXXS5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICBnZXRUVmlld0NsZWFudXAodmlldykucHVzaCh2aWV3W0NMRUFOVVBdLmxlbmd0aCAtIDEsIG51bGwpO1xuICAgIH1cbn1cbi8qKlxuICogQ29uc3RydWN0cyBhIFROb2RlIG9iamVjdCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqIEBwYXJhbSBhZGp1c3RlZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgVE5vZGUgaW4gVFZpZXcuZGF0YSwgYWRqdXN0ZWQgZm9yIEhFQURFUl9PRkZTRVRcbiAqIEBwYXJhbSB0YWdOYW1lIFRoZSB0YWcgbmFtZSBvZiB0aGUgbm9kZVxuICogQHBhcmFtIGF0dHJzIFRoZSBhdHRyaWJ1dGVzIGRlZmluZWQgb24gdGhpcyBub2RlXG4gKiBAcGFyYW0gdFZpZXdzIEFueSBUVmlld3MgYXR0YWNoZWQgdG8gdGhpcyBub2RlXG4gKiBAcmV0dXJucyB0aGUgVE5vZGUgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVROb2RlKHRQYXJlbnQsIHR5cGUsIGFkanVzdGVkSW5kZXgsIHRhZ05hbWUsIGF0dHJzKSB7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS50Tm9kZSsrO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGluZGV4OiBhZGp1c3RlZEluZGV4LFxuICAgICAgICBpbmplY3RvckluZGV4OiB0UGFyZW50ID8gdFBhcmVudC5pbmplY3RvckluZGV4IDogLTEsXG4gICAgICAgIGRpcmVjdGl2ZVN0YXJ0OiAtMSxcbiAgICAgICAgZGlyZWN0aXZlRW5kOiAtMSxcbiAgICAgICAgcHJvcGVydHlNZXRhZGF0YVN0YXJ0SW5kZXg6IC0xLFxuICAgICAgICBwcm9wZXJ0eU1ldGFkYXRhRW5kSW5kZXg6IC0xLFxuICAgICAgICBmbGFnczogMCxcbiAgICAgICAgcHJvdmlkZXJJbmRleGVzOiAwLFxuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxuICAgICAgICBhdHRyczogYXR0cnMsXG4gICAgICAgIGxvY2FsTmFtZXM6IG51bGwsXG4gICAgICAgIGluaXRpYWxJbnB1dHM6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5wdXRzOiB1bmRlZmluZWQsXG4gICAgICAgIG91dHB1dHM6IHVuZGVmaW5lZCxcbiAgICAgICAgdFZpZXdzOiBudWxsLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICBwcm9qZWN0aW9uTmV4dDogbnVsbCxcbiAgICAgICAgY2hpbGQ6IG51bGwsXG4gICAgICAgIHBhcmVudDogdFBhcmVudCxcbiAgICAgICAgc3R5bGluZ1RlbXBsYXRlOiBudWxsLFxuICAgICAgICBwcm9qZWN0aW9uOiBudWxsLFxuICAgICAgICBvbkVsZW1lbnRDcmVhdGlvbkZuczogbnVsbCxcbiAgICB9O1xufVxuLyoqXG4gKiBDb25zb2xpZGF0ZXMgYWxsIGlucHV0cyBvciBvdXRwdXRzIG9mIGFsbCBkaXJlY3RpdmVzIG9uIHRoaXMgbG9naWNhbCBub2RlLlxuICpcbiAqIEBwYXJhbSB0Tm9kZVxuICogQHBhcmFtIGRpcmVjdGlvbiB3aGV0aGVyIHRvIGNvbnNpZGVyIGlucHV0cyBvciBvdXRwdXRzXG4gKiBAcmV0dXJucyBQcm9wZXJ0eUFsaWFzZXN8bnVsbCBhZ2dyZWdhdGUgb2YgYWxsIHByb3BlcnRpZXMgaWYgYW55LCBgbnVsbGAgb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUHJvcGVydHlBbGlhc2VzKHROb2RlLCBkaXJlY3Rpb24pIHtcbiAgICB2YXIgdFZpZXcgPSBnZXRMVmlldygpW1RWSUVXXTtcbiAgICB2YXIgcHJvcFN0b3JlID0gbnVsbDtcbiAgICB2YXIgc3RhcnQgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDtcbiAgICB2YXIgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kO1xuICAgIGlmIChlbmQgPiBzdGFydCkge1xuICAgICAgICB2YXIgaXNJbnB1dCA9IGRpcmVjdGlvbiA9PT0gMCAvKiBJbnB1dCAqLztcbiAgICAgICAgdmFyIGRlZnMgPSB0Vmlldy5kYXRhO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZURlZiA9IGRlZnNbaV07XG4gICAgICAgICAgICB2YXIgcHJvcGVydHlBbGlhc01hcCA9IGlzSW5wdXQgPyBkaXJlY3RpdmVEZWYuaW5wdXRzIDogZGlyZWN0aXZlRGVmLm91dHB1dHM7XG4gICAgICAgICAgICBmb3IgKHZhciBwdWJsaWNOYW1lIGluIHByb3BlcnR5QWxpYXNNYXApIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlBbGlhc01hcC5oYXNPd25Qcm9wZXJ0eShwdWJsaWNOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wU3RvcmUgPSBwcm9wU3RvcmUgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcm5hbE5hbWUgPSBwcm9wZXJ0eUFsaWFzTWFwW3B1YmxpY05hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzUHJvcGVydHkgPSBwcm9wU3RvcmUuaGFzT3duUHJvcGVydHkocHVibGljTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGhhc1Byb3BlcnR5ID8gcHJvcFN0b3JlW3B1YmxpY05hbWVdLnB1c2goaSwgcHVibGljTmFtZSwgaW50ZXJuYWxOYW1lKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAocHJvcFN0b3JlW3B1YmxpY05hbWVdID0gW2ksIHB1YmxpY05hbWUsIGludGVybmFsTmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFN0b3JlO1xufVxuLyoqXG4qIE1hcHBpbmcgYmV0d2VlbiBhdHRyaWJ1dGVzIG5hbWVzIHRoYXQgZG9uJ3QgY29ycmVzcG9uZCB0byB0aGVpciBlbGVtZW50IHByb3BlcnR5IG5hbWVzLlxuKi9cbnZhciBBVFRSX1RPX1BST1AgPSB7XG4gICAgJ2NsYXNzJzogJ2NsYXNzTmFtZScsXG4gICAgJ2Zvcic6ICdodG1sRm9yJyxcbiAgICAnZm9ybWFjdGlvbic6ICdmb3JtQWN0aW9uJyxcbiAgICAnaW5uZXJIdG1sJzogJ2lubmVySFRNTCcsXG4gICAgJ3JlYWRvbmx5JzogJ3JlYWRPbmx5JyxcbiAgICAndGFiaW5kZXgnOiAndGFiSW5kZXgnLFxufTtcbmZ1bmN0aW9uIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKGluZGV4LCBwcm9wTmFtZSwgdmFsdWUsIHNhbml0aXplciwgbmF0aXZlT25seSwgbG9hZFJlbmRlcmVyRm4pIHtcbiAgICBpZiAodmFsdWUgPT09IE5PX0NIQU5HRSlcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGVsZW1lbnQgPSBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldyk7XG4gICAgdmFyIHROb2RlID0gZ2V0VE5vZGUoaW5kZXgsIGxWaWV3KTtcbiAgICB2YXIgaW5wdXREYXRhO1xuICAgIHZhciBkYXRhVmFsdWU7XG4gICAgaWYgKCFuYXRpdmVPbmx5ICYmIChpbnB1dERhdGEgPSBpbml0aWFsaXplVE5vZGVJbnB1dHModE5vZGUpKSAmJlxuICAgICAgICAoZGF0YVZhbHVlID0gaW5wdXREYXRhW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgc2V0SW5wdXRzRm9yUHJvcGVydHkobFZpZXcsIGRhdGFWYWx1ZSwgdmFsdWUpO1xuICAgICAgICBpZiAoaXNDb21wb25lbnQodE5vZGUpKVxuICAgICAgICAgICAgbWFya0RpcnR5SWZPblB1c2gobFZpZXcsIGluZGV4ICsgSEVBREVSX09GRlNFVCk7XG4gICAgICAgIGlmIChuZ0Rldk1vZGUpIHtcbiAgICAgICAgICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gfHwgdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBkYXRhVmFsdWUgaXMgYW4gYXJyYXkgY29udGFpbmluZyBydW50aW1lIGlucHV0IG9yIG91dHB1dCBuYW1lcyBmb3IgdGhlIGRpcmVjdGl2ZXM6XG4gICAgICAgICAgICAgICAgICogaSswOiBkaXJlY3RpdmUgaW5zdGFuY2UgaW5kZXhcbiAgICAgICAgICAgICAgICAgKiBpKzE6IHB1YmxpY05hbWVcbiAgICAgICAgICAgICAgICAgKiBpKzI6IHByaXZhdGVOYW1lXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgKiBlLmcuIFswLCAnY2hhbmdlJywgJ2NoYW5nZS1taW5pZmllZCddXG4gICAgICAgICAgICAgICAgICogd2Ugd2FudCB0byBzZXQgdGhlIHJlZmxlY3RlZCBwcm9wZXJ0eSB3aXRoIHRoZSBwcml2YXRlTmFtZTogZGF0YVZhbHVlW2krMl1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFWYWx1ZS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXROZ1JlZmxlY3RQcm9wZXJ0eShsVmlldywgZWxlbWVudCwgdE5vZGUudHlwZSwgZGF0YVZhbHVlW2kgKyAyXSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHtcbiAgICAgICAgcHJvcE5hbWUgPSBBVFRSX1RPX1BST1BbcHJvcE5hbWVdIHx8IHByb3BOYW1lO1xuICAgICAgICBpZiAobmdEZXZNb2RlKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUFnYWluc3RFdmVudFByb3BlcnRpZXMocHJvcE5hbWUpO1xuICAgICAgICAgICAgdmFsaWRhdGVBZ2FpbnN0VW5rbm93blByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSk7XG4gICAgICAgICAgICBuZ0Rldk1vZGUucmVuZGVyZXJTZXRQcm9wZXJ0eSsrO1xuICAgICAgICB9XG4gICAgICAgIHNhdmVQcm9wZXJ0eURlYnVnRGF0YSh0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBsVmlld1tUVklFV10uZGF0YSwgbmF0aXZlT25seSk7XG4gICAgICAgIHZhciByZW5kZXJlciA9IGxvYWRSZW5kZXJlckZuID8gbG9hZFJlbmRlcmVyRm4odE5vZGUsIGxWaWV3KSA6IGxWaWV3W1JFTkRFUkVSXTtcbiAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBzYW5pdGl6ZXIgaXMgb25seSBhZGRlZCB3aGVuIHRoZSBjb21waWxlciBkZXRlcm1pbmVzIHRoYXQgdGhlIHByb3BlcnR5XG4gICAgICAgIC8vIGlzIHJpc2t5LCBzbyBzYW5pdGl6YXRpb24gY2FuIGJlIGRvbmUgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy5cbiAgICAgICAgdmFsdWUgPSBzYW5pdGl6ZXIgIT0gbnVsbCA/IHNhbml0aXplcih2YWx1ZSwgdE5vZGUudGFnTmFtZSB8fCAnJywgcHJvcE5hbWUpIDogdmFsdWU7XG4gICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnQsIHByb3BOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc2V0UHJvcGVydHkgPyBlbGVtZW50LnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSkgOlxuICAgICAgICAgICAgICAgIGVsZW1lbnRbcHJvcE5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHtcbiAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgYSBjb250YWluZXIgYW5kIHRoZSBwcm9wZXJ0eSBkaWRuJ3RcbiAgICAgICAgLy8gbWF0Y2ggYW55IG9mIHRoZSBpbnB1dHMgb3Igc2NoZW1hcyB3ZSBzaG91bGQgdGhyb3cuXG4gICAgICAgIGlmIChuZ0Rldk1vZGUgJiYgIW1hdGNoaW5nU2NoZW1hcyhsVmlldywgdE5vZGUudGFnTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IGNyZWF0ZVVua25vd25Qcm9wZXJ0eUVycm9yKHByb3BOYW1lLCB0Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKiogSWYgbm9kZSBpcyBhbiBPblB1c2ggY29tcG9uZW50LCBtYXJrcyBpdHMgTFZpZXcgZGlydHkuICovXG5mdW5jdGlvbiBtYXJrRGlydHlJZk9uUHVzaChsVmlldywgdmlld0luZGV4KSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGxWaWV3KTtcbiAgICB2YXIgY2hpbGRDb21wb25lbnRMVmlldyA9IGdldENvbXBvbmVudFZpZXdCeUluZGV4KHZpZXdJbmRleCwgbFZpZXcpO1xuICAgIGlmICghKGNoaWxkQ29tcG9uZW50TFZpZXdbRkxBR1NdICYgMTYgLyogQ2hlY2tBbHdheXMgKi8pKSB7XG4gICAgICAgIGNoaWxkQ29tcG9uZW50TFZpZXdbRkxBR1NdIHw9IDY0IC8qIERpcnR5ICovO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCBhdHRyTmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgIGF0dHJOYW1lID0gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShhdHRyTmFtZSk7XG4gICAgdmFyIGRlYnVnVmFsdWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKHR5cGUgPT09IDMgLyogRWxlbWVudCAqLykge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIGF0dHJOYW1lKSA6XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID9cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0ck5hbWUsIGRlYnVnVmFsdWUpIDpcbiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgZGVidWdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciB0ZXh0Q29udGVudCA9IFwiYmluZGluZ3M9XCIgKyBKU09OLnN0cmluZ2lmeSgoX2EgPSB7fSwgX2FbYXR0ck5hbWVdID0gZGVidWdWYWx1ZSwgX2EpLCBudWxsLCAyKTtcbiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0VmFsdWUoZWxlbWVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVBZ2FpbnN0VW5rbm93blByb3BlcnRpZXMoaG9zdFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSkge1xuICAgIC8vIElmIHRoZSB0YWcgbWF0Y2hlcyBhbnkgb2YgdGhlIHNjaGVtYXMgd2Ugc2hvdWxkbid0IHRocm93LlxuICAgIGlmIChtYXRjaGluZ1NjaGVtYXMoaG9zdFZpZXcsIHROb2RlLnRhZ05hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWYgcHJvcCBpcyBub3QgYSBrbm93biBwcm9wZXJ0eSBvZiB0aGUgSFRNTCBlbGVtZW50Li4uXG4gICAgaWYgKCEocHJvcE5hbWUgaW4gZWxlbWVudCkgJiZcbiAgICAgICAgLy8gYW5kIHdlIGFyZSBpbiBhIGJyb3dzZXIgY29udGV4dC4uLiAod2ViIHdvcmtlciBub2RlcyBzaG91bGQgYmUgc2tpcHBlZClcbiAgICAgICAgdHlwZW9mIE5vZGUgPT09ICdmdW5jdGlvbicgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUgJiZcbiAgICAgICAgLy8gYW5kIGlzbid0IGEgc3ludGhldGljIGFuaW1hdGlvbiBwcm9wZXJ0eS4uLlxuICAgICAgICBwcm9wTmFtZVswXSAhPT0gQU5JTUFUSU9OX1BST1BfUFJFRklYKSB7XG4gICAgICAgIC8vIC4uLiBpdCBpcyBwcm9iYWJseSBhIHVzZXIgZXJyb3IgYW5kIHdlIHNob3VsZCB0aHJvdy5cbiAgICAgICAgdGhyb3cgY3JlYXRlVW5rbm93blByb3BlcnR5RXJyb3IocHJvcE5hbWUsIHROb2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXRjaGluZ1NjaGVtYXMoaG9zdFZpZXcsIHRhZ05hbWUpIHtcbiAgICB2YXIgc2NoZW1hcyA9IGhvc3RWaWV3W1RWSUVXXS5zY2hlbWFzO1xuICAgIGlmIChzY2hlbWFzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHNjaGVtYSA9IHNjaGVtYXNbaV07XG4gICAgICAgICAgICBpZiAoc2NoZW1hID09PSBOT19FUlJPUlNfU0NIRU1BIHx8XG4gICAgICAgICAgICAgICAgc2NoZW1hID09PSBDVVNUT01fRUxFTUVOVFNfU0NIRU1BICYmIHRhZ05hbWUgJiYgdGFnTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuKiBTdG9yZXMgZGVidWdnaW5nIGRhdGEgZm9yIHRoaXMgcHJvcGVydHkgYmluZGluZyBvbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzLlxuKiBUaGlzIGVuYWJsZXMgZmVhdHVyZXMgbGlrZSBEZWJ1Z0VsZW1lbnQucHJvcGVydGllcy5cbiovXG5mdW5jdGlvbiBzYXZlUHJvcGVydHlEZWJ1Z0RhdGEodE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdERhdGEsIG5hdGl2ZU9ubHkpIHtcbiAgICB2YXIgbGFzdEJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdIC0gMTtcbiAgICAvLyBCaW5kL2ludGVycG9sYXRpb24gZnVuY3Rpb25zIHNhdmUgYmluZGluZyBtZXRhZGF0YSBpbiB0aGUgbGFzdCBiaW5kaW5nIGluZGV4LFxuICAgIC8vIGJ1dCBsZWF2ZSB0aGUgcHJvcGVydHkgbmFtZSBibGFuay4gSWYgdGhlIGludGVycG9sYXRpb24gZGVsaW1pdGVyIGlzIGF0IHRoZSAwXG4gICAgLy8gaW5kZXgsIHdlIGtub3cgdGhhdCB0aGlzIGlzIG91ciBmaXJzdCBwYXNzIGFuZCB0aGUgcHJvcGVydHkgbmFtZSBzdGlsbCBuZWVkcyB0b1xuICAgIC8vIGJlIHNldC5cbiAgICB2YXIgYmluZGluZ01ldGFkYXRhID0gdERhdGFbbGFzdEJpbmRpbmdJbmRleF07XG4gICAgaWYgKGJpbmRpbmdNZXRhZGF0YVswXSA9PSBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUikge1xuICAgICAgICB0RGF0YVtsYXN0QmluZGluZ0luZGV4XSA9IHByb3BOYW1lICsgYmluZGluZ01ldGFkYXRhO1xuICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3JlIGluZGljZXMgZm9yIGhvc3QgYmluZGluZ3MgYmVjYXVzZSB0aGV5IGFyZSBzdG9yZWQgaW4gYVxuICAgICAgICAvLyBkaWZmZXJlbnQgcGFydCBvZiBMVmlldyAodGhlIGV4cGFuZG8gc2VjdGlvbikuXG4gICAgICAgIGlmICghbmF0aXZlT25seSkge1xuICAgICAgICAgICAgaWYgKHROb2RlLnByb3BlcnR5TWV0YWRhdGFTdGFydEluZGV4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgdE5vZGUucHJvcGVydHlNZXRhZGF0YVN0YXJ0SW5kZXggPSBsYXN0QmluZGluZ0luZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdE5vZGUucHJvcGVydHlNZXRhZGF0YUVuZEluZGV4ID0gbGFzdEJpbmRpbmdJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiogQ3JlYXRlcyBhbiBlcnJvciB0aGF0IHNob3VsZCBiZSB0aHJvd24gd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5rbm93biBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50LlxuKiBAcGFyYW0gcHJvcE5hbWUgTmFtZSBvZiB0aGUgaW52YWxpZCBwcm9wZXJ0eS5cbiogQHBhcmFtIHROb2RlIE5vZGUgb24gd2hpY2ggd2UgZW5jb3VudGVyZWQgdGhlIGVycm9yLlxuKi9cbmZ1bmN0aW9uIGNyZWF0ZVVua25vd25Qcm9wZXJ0eUVycm9yKHByb3BOYW1lLCB0Tm9kZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoXCJUZW1wbGF0ZSBlcnJvcjogQ2FuJ3QgYmluZCB0byAnXCIgKyBwcm9wTmFtZSArIFwiJyBzaW5jZSBpdCBpc24ndCBhIGtub3duIHByb3BlcnR5IG9mICdcIiArIHROb2RlLnRhZ05hbWUgKyBcIicuXCIpO1xufVxuLyoqXG4gKiBJbnN0YW50aWF0ZSBhIHJvb3QgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZVJvb3RDb21wb25lbnQodFZpZXcsIHZpZXdEYXRhLCBkZWYpIHtcbiAgICB2YXIgcm9vdFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7XG4gICAgaWYgKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgICAgIGlmIChkZWYucHJvdmlkZXJzUmVzb2x2ZXIpXG4gICAgICAgICAgICBkZWYucHJvdmlkZXJzUmVzb2x2ZXIoZGVmKTtcbiAgICAgICAgZ2VuZXJhdGVFeHBhbmRvSW5zdHJ1Y3Rpb25CbG9jayh0Vmlldywgcm9vdFROb2RlLCAxKTtcbiAgICAgICAgYmFzZVJlc29sdmVEaXJlY3RpdmUodFZpZXcsIHZpZXdEYXRhLCBkZWYsIGRlZi5mYWN0b3J5KTtcbiAgICB9XG4gICAgdmFyIGRpcmVjdGl2ZSA9IGdldE5vZGVJbmplY3RhYmxlKHRWaWV3LmRhdGEsIHZpZXdEYXRhLCB2aWV3RGF0YS5sZW5ndGggLSAxLCByb290VE5vZGUpO1xuICAgIHBvc3RQcm9jZXNzQmFzZURpcmVjdGl2ZSh2aWV3RGF0YSwgcm9vdFROb2RlLCBkaXJlY3RpdmUpO1xuICAgIHJldHVybiBkaXJlY3RpdmU7XG59XG4vKipcbiAqIFJlc29sdmUgdGhlIG1hdGNoZWQgZGlyZWN0aXZlcyBvbiBhIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCB2aWV3RGF0YSwgZGlyZWN0aXZlcywgdE5vZGUsIGxvY2FsUmVmcykge1xuICAgIC8vIFBsZWFzZSBtYWtlIHN1cmUgdG8gaGF2ZSBleHBsaWNpdCB0eXBlIGZvciBgZXhwb3J0c01hcGAuIEluZmVycmVkIHR5cGUgdHJpZ2dlcnMgYnVnIGluIHRzaWNrbGUuXG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzLCB0cnVlLCAnc2hvdWxkIHJ1biBvbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTtcbiAgICB2YXIgZXhwb3J0c01hcCA9IGxvY2FsUmVmcyA/IHsgJyc6IC0xIH0gOiBudWxsO1xuICAgIGlmIChkaXJlY3RpdmVzKSB7XG4gICAgICAgIGluaXROb2RlRmxhZ3ModE5vZGUsIHRWaWV3LmRhdGEubGVuZ3RoLCBkaXJlY3RpdmVzLmxlbmd0aCk7XG4gICAgICAgIC8vIFdoZW4gdGhlIHNhbWUgdG9rZW4gaXMgcHJvdmlkZWQgYnkgc2V2ZXJhbCBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lIG5vZGUsIHNvbWUgcnVsZXMgYXBwbHkgaW5cbiAgICAgICAgLy8gdGhlIHZpZXdFbmdpbmU6XG4gICAgICAgIC8vIC0gdmlld1Byb3ZpZGVycyBoYXZlIHByaW9yaXR5IG92ZXIgcHJvdmlkZXJzXG4gICAgICAgIC8vIC0gdGhlIGxhc3QgZGlyZWN0aXZlIGluIE5nTW9kdWxlLmRlY2xhcmF0aW9ucyBoYXMgcHJpb3JpdHkgb3ZlciB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIC8vIFNvIHRvIG1hdGNoIHRoZXNlIHJ1bGVzLCB0aGUgb3JkZXIgaW4gd2hpY2ggcHJvdmlkZXJzIGFyZSBhZGRlZCBpbiB0aGUgYXJyYXlzIGlzIHZlcnlcbiAgICAgICAgLy8gaW1wb3J0YW50LlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkZWYgPSBkaXJlY3RpdmVzW2ldO1xuICAgICAgICAgICAgaWYgKGRlZi5wcm92aWRlcnNSZXNvbHZlcilcbiAgICAgICAgICAgICAgICBkZWYucHJvdmlkZXJzUmVzb2x2ZXIoZGVmKTtcbiAgICAgICAgfVxuICAgICAgICBnZW5lcmF0ZUV4cGFuZG9JbnN0cnVjdGlvbkJsb2NrKHRWaWV3LCB0Tm9kZSwgZGlyZWN0aXZlcy5sZW5ndGgpO1xuICAgICAgICB2YXIgaW5pdGlhbFByZU9yZGVySG9va3NMZW5ndGggPSAodFZpZXcucHJlT3JkZXJIb29rcyAmJiB0Vmlldy5wcmVPcmRlckhvb2tzLmxlbmd0aCkgfHwgMDtcbiAgICAgICAgdmFyIGluaXRpYWxQcmVPcmRlckNoZWNrSG9va3NMZW5ndGggPSAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzICYmIHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcy5sZW5ndGgpIHx8IDA7XG4gICAgICAgIHZhciBub2RlSW5kZXggPSB0Tm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IGRpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlRGVmSWR4ID0gdFZpZXcuZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0Vmlldywgdmlld0RhdGEsIGRlZiwgZGVmLmZhY3RvcnkpO1xuICAgICAgICAgICAgc2F2ZU5hbWVUb0V4cG9ydE1hcCh0Vmlldy5kYXRhLmxlbmd0aCAtIDEsIGRlZiwgZXhwb3J0c01hcCk7XG4gICAgICAgICAgICAvLyBJbml0IGhvb2tzIGFyZSBxdWV1ZWQgbm93IHNvIG5nT25Jbml0IGlzIGNhbGxlZCBpbiBob3N0IGNvbXBvbmVudHMgYmVmb3JlXG4gICAgICAgICAgICAvLyBhbnkgcHJvamVjdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgICByZWdpc3RlclByZU9yZGVySG9va3MoZGlyZWN0aXZlRGVmSWR4LCBkZWYsIHRWaWV3LCBub2RlSW5kZXgsIGluaXRpYWxQcmVPcmRlckhvb2tzTGVuZ3RoLCBpbml0aWFsUHJlT3JkZXJDaGVja0hvb2tzTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXhwb3J0c01hcClcbiAgICAgICAgY2FjaGVNYXRjaGluZ0xvY2FsTmFtZXModE5vZGUsIGxvY2FsUmVmcywgZXhwb3J0c01hcCk7XG59XG4vKipcbiAqIEluc3RhbnRpYXRlIGFsbCB0aGUgZGlyZWN0aXZlcyB0aGF0IHdlcmUgcHJldmlvdXNseSByZXNvbHZlZCBvbiB0aGUgY3VycmVudCBub2RlLlxuICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZUFsbERpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSkge1xuICAgIHZhciBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0O1xuICAgIHZhciBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7XG4gICAgaWYgKCF0Vmlldy5maXJzdFRlbXBsYXRlUGFzcyAmJiBzdGFydCA8IGVuZCkge1xuICAgICAgICBnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUodE5vZGUsIGxWaWV3KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgdmFyIGRlZiA9IHRWaWV3LmRhdGFbaV07XG4gICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWYpKSB7XG4gICAgICAgICAgICBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgdE5vZGUsIGRlZik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IGdldE5vZGVJbmplY3RhYmxlKHRWaWV3LmRhdGEsIGxWaWV3LCBpLCB0Tm9kZSk7XG4gICAgICAgIHBvc3RQcm9jZXNzRGlyZWN0aXZlKGxWaWV3LCBkaXJlY3RpdmUsIGRlZiwgaSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0Vmlldywgdmlld0RhdGEsIHROb2RlKSB7XG4gICAgdmFyIHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7XG4gICAgdmFyIGVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDtcbiAgICB2YXIgZXhwYW5kbyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7XG4gICAgdmFyIGZpcnN0VGVtcGxhdGVQYXNzID0gdFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3M7XG4gICAgdmFyIGVsZW1lbnRJbmRleCA9IHROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDtcbiAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICB0cnkge1xuICAgICAgICBzZXRBY3RpdmVIb3N0RWxlbWVudChlbGVtZW50SW5kZXgpO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IHRWaWV3LmRhdGFbaV07XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlID0gdmlld0RhdGFbaV07XG4gICAgICAgICAgICBpZiAoZGVmLmhvc3RCaW5kaW5ncykge1xuICAgICAgICAgICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGRlZiwgZXhwYW5kbywgZGlyZWN0aXZlLCB0Tm9kZSwgZmlyc3RUZW1wbGF0ZVBhc3MpO1xuICAgICAgICAgICAgICAgIC8vIEVhY2ggZGlyZWN0aXZlIGdldHMgYSB1bmlxdWVJZCB2YWx1ZSB0aGF0IGlzIHRoZSBzYW1lIGZvciBib3RoXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCB1cGRhdGUgY2FsbHMgd2hlbiB0aGUgaG9zdEJpbmRpbmdzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhlXG4gICAgICAgICAgICAgICAgLy8gZGlyZWN0aXZlIHVuaXF1ZUlkIGlzIG5vdCBzZXQgYW55d2hlcmUtLWl0IGlzIGp1c3QgaW5jcmVtZW50ZWQgYmV0d2VlblxuICAgICAgICAgICAgICAgIC8vIGVhY2ggaG9zdEJpbmRpbmdzIGNhbGwgYW5kIGlzIHVzZWZ1bCBmb3IgaGVscGluZyBpbnN0cnVjdGlvbiBjb2RlXG4gICAgICAgICAgICAgICAgLy8gdW5pcXVlbHkgZGV0ZXJtaW5lIHdoaWNoIGRpcmVjdGl2ZSBpcyBjdXJyZW50bHkgYWN0aXZlIHdoZW4gZXhlY3V0ZWQuXG4gICAgICAgICAgICAgICAgaW5jcmVtZW50QWN0aXZlRGlyZWN0aXZlSWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgICAgICAgICAgICAgZXhwYW5kby5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBzZXRBY3RpdmVIb3N0RWxlbWVudChzZWxlY3RlZEluZGV4KTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnZva2VIb3N0QmluZGluZ3NJbkNyZWF0aW9uTW9kZShkZWYsIGV4cGFuZG8sIGRpcmVjdGl2ZSwgdE5vZGUsIGZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgdmFyIHByZXZpb3VzRXhwYW5kb0xlbmd0aCA9IGV4cGFuZG8ubGVuZ3RoO1xuICAgIHNldEN1cnJlbnREaXJlY3RpdmVEZWYoZGVmKTtcbiAgICB2YXIgZWxlbWVudEluZGV4ID0gdE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICAgIGRlZi5ob3N0QmluZGluZ3MoMSAvKiBDcmVhdGUgKi8sIGRpcmVjdGl2ZSwgZWxlbWVudEluZGV4KTtcbiAgICBzZXRDdXJyZW50RGlyZWN0aXZlRGVmKG51bGwpO1xuICAgIC8vIGBob3N0QmluZGluZ3NgIGZ1bmN0aW9uIG1heSBvciBtYXkgbm90IGNvbnRhaW4gYGFsbG9jSG9zdFZhcnNgIGNhbGxcbiAgICAvLyAoZS5nLiBpdCBtYXkgbm90IGlmIGl0IG9ubHkgY29udGFpbnMgaG9zdCBsaXN0ZW5lcnMpLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXJcbiAgICAvLyBgZXhwYW5kb0luc3RydWN0aW9uc2AgaGFzIGNoYW5nZWQgYW5kIGlmIG5vdCAtIHdlIHN0aWxsIHB1c2ggYGhvc3RCaW5kaW5nc2AgdG9cbiAgICAvLyBleHBhbmRvIGJsb2NrLCB0byBtYWtlIHN1cmUgd2UgZXhlY3V0ZSBpdCBmb3IgREkgY3ljbGVcbiAgICBpZiAocHJldmlvdXNFeHBhbmRvTGVuZ3RoID09PSBleHBhbmRvLmxlbmd0aCAmJiBmaXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICBleHBhbmRvLnB1c2goZGVmLmhvc3RCaW5kaW5ncyk7XG4gICAgfVxufVxuLyoqXG4qIEdlbmVyYXRlcyBhIG5ldyBibG9jayBpbiBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zIGZvciB0aGlzIG5vZGUuXG4qXG4qIEVhY2ggZXhwYW5kbyBibG9jayBzdGFydHMgd2l0aCB0aGUgZWxlbWVudCBpbmRleCAodHVybmVkIG5lZ2F0aXZlIHNvIHdlIGNhbiBkaXN0aW5ndWlzaFxuKiBpdCBmcm9tIHRoZSBob3N0VmFyIGNvdW50KSBhbmQgdGhlIGRpcmVjdGl2ZSBjb3VudC4gU2VlIG1vcmUgaW4gVklFV19EQVRBLm1kLlxuKi9cbmZ1bmN0aW9uIGdlbmVyYXRlRXhwYW5kb0luc3RydWN0aW9uQmxvY2sodFZpZXcsIHROb2RlLCBkaXJlY3RpdmVDb3VudCkge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcywgdHJ1ZSwgJ0V4cGFuZG8gYmxvY2sgc2hvdWxkIG9ubHkgYmUgZ2VuZXJhdGVkIG9uIGZpcnN0IHRlbXBsYXRlIHBhc3MuJyk7XG4gICAgdmFyIGVsZW1lbnRJbmRleCA9IC0odE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTtcbiAgICB2YXIgcHJvdmlkZXJTdGFydEluZGV4ID0gdE5vZGUucHJvdmlkZXJJbmRleGVzICYgNjU1MzUgLyogUHJvdmlkZXJzU3RhcnRJbmRleE1hc2sgKi87XG4gICAgdmFyIHByb3ZpZGVyQ291bnQgPSB0Vmlldy5kYXRhLmxlbmd0aCAtIHByb3ZpZGVyU3RhcnRJbmRleDtcbiAgICAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyB8fCAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyA9IFtdKSkucHVzaChlbGVtZW50SW5kZXgsIHByb3ZpZGVyQ291bnQsIGRpcmVjdGl2ZUNvdW50KTtcbn1cbi8qKlxuICogUHJvY2VzcyBhIGRpcmVjdGl2ZSBvbiB0aGUgY3VycmVudCBub2RlIGFmdGVyIGl0cyBjcmVhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcG9zdFByb2Nlc3NEaXJlY3RpdmUodmlld0RhdGEsIGRpcmVjdGl2ZSwgZGVmLCBkaXJlY3RpdmVEZWZJZHgpIHtcbiAgICB2YXIgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7XG4gICAgcG9zdFByb2Nlc3NCYXNlRGlyZWN0aXZlKHZpZXdEYXRhLCBwcmV2aW91c09yUGFyZW50VE5vZGUsIGRpcmVjdGl2ZSk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocHJldmlvdXNPclBhcmVudFROb2RlLCAncHJldmlvdXNPclBhcmVudFROb2RlJyk7XG4gICAgaWYgKHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUuYXR0cnMpIHtcbiAgICAgICAgc2V0SW5wdXRzRnJvbUF0dHJzKGRpcmVjdGl2ZURlZklkeCwgZGlyZWN0aXZlLCBkZWYsIHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgfVxuICAgIGlmICh2aWV3RGF0YVtUVklFV10uZmlyc3RUZW1wbGF0ZVBhc3MgJiYgZGVmLmNvbnRlbnRRdWVyaWVzKSB7XG4gICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5mbGFncyB8PSA0IC8qIGhhc0NvbnRlbnRRdWVyeSAqLztcbiAgICB9XG4gICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRWaWV3QnlJbmRleChwcmV2aW91c09yUGFyZW50VE5vZGUuaW5kZXgsIHZpZXdEYXRhKTtcbiAgICAgICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGRpcmVjdGl2ZTtcbiAgICB9XG59XG4vKipcbiAqIEEgbGlnaHRlciB2ZXJzaW9uIG9mIHBvc3RQcm9jZXNzRGlyZWN0aXZlKCkgdGhhdCBpcyB1c2VkIGZvciB0aGUgcm9vdCBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIHBvc3RQcm9jZXNzQmFzZURpcmVjdGl2ZShsVmlldywgcHJldmlvdXNPclBhcmVudFROb2RlLCBkaXJlY3RpdmUpIHtcbiAgICB2YXIgbmF0aXZlID0gZ2V0TmF0aXZlQnlUTm9kZShwcmV2aW91c09yUGFyZW50VE5vZGUsIGxWaWV3KTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwobFZpZXdbQklORElOR19JTkRFWF0sIGxWaWV3W1RWSUVXXS5iaW5kaW5nU3RhcnRJbmRleCwgJ2RpcmVjdGl2ZXMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRQcmV2aW91c0lzUGFyZW50KGdldElzUGFyZW50KCkpO1xuICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmUsIGxWaWV3KTtcbiAgICBpZiAobmF0aXZlKSB7XG4gICAgICAgIGF0dGFjaFBhdGNoRGF0YShuYXRpdmUsIGxWaWV3KTtcbiAgICB9XG59XG4vKipcbiogTWF0Y2hlcyB0aGUgY3VycmVudCBub2RlIGFnYWluc3QgYWxsIGF2YWlsYWJsZSBzZWxlY3RvcnMuXG4qIElmIGEgY29tcG9uZW50IGlzIG1hdGNoZWQgKGF0IG1vc3Qgb25lKSwgaXQgaXMgcmV0dXJuZWQgaW4gZmlyc3QgcG9zaXRpb24gaW4gdGhlIGFycmF5LlxuKi9cbmZ1bmN0aW9uIGZpbmREaXJlY3RpdmVNYXRjaGVzKHRWaWV3LCB2aWV3RGF0YSwgdE5vZGUpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MsIHRydWUsICdzaG91bGQgcnVuIG9uIGZpcnN0IHRlbXBsYXRlIHBhc3Mgb25seScpO1xuICAgIHZhciByZWdpc3RyeSA9IHRWaWV3LmRpcmVjdGl2ZVJlZ2lzdHJ5O1xuICAgIHZhciBtYXRjaGVzID0gbnVsbDtcbiAgICBpZiAocmVnaXN0cnkpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGRlZiA9IHJlZ2lzdHJ5W2ldO1xuICAgICAgICAgICAgaWYgKGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JMaXN0KHROb2RlLCBkZWYuc2VsZWN0b3JzLCAvKiBpc1Byb2plY3Rpb25Nb2RlICovIGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMgfHwgKG1hdGNoZXMgPSBbXSk7XG4gICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZShnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgdmlld0RhdGEpLCB2aWV3RGF0YSwgZGVmLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0Tm9kZS5mbGFncyAmIDEgLyogaXNDb21wb25lbnQgKi8pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd011bHRpcGxlQ29tcG9uZW50RXJyb3IodE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0Tm9kZS5mbGFncyA9IDEgLyogaXNDb21wb25lbnQgKi87XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgYWx3YXlzIHN0b3JlZCBmaXJzdCB3aXRoIGRpcmVjdGl2ZXMgYWZ0ZXIuXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMudW5zaGlmdChkZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGRlZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xufVxuLyoqIFN0b3JlcyBpbmRleCBvZiBjb21wb25lbnQncyBob3N0IGVsZW1lbnQgc28gaXQgd2lsbCBiZSBxdWV1ZWQgZm9yIHZpZXcgcmVmcmVzaCBkdXJpbmcgQ0QuICovXG5mdW5jdGlvbiBxdWV1ZUNvbXBvbmVudEluZGV4Rm9yQ2hlY2socHJldmlvdXNPclBhcmVudFROb2RlKSB7XG4gICAgdmFyIHRWaWV3ID0gZ2V0TFZpZXcoKVtUVklFV107XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzLCB0cnVlLCAnU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGZpcnN0IHRlbXBsYXRlIHBhc3MuJyk7XG4gICAgKHRWaWV3LmNvbXBvbmVudHMgfHwgKHRWaWV3LmNvbXBvbmVudHMgPSBbXSkpLnB1c2gocHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4KTtcbn1cbi8qKiBDYWNoZXMgbG9jYWwgbmFtZXMgYW5kIHRoZWlyIG1hdGNoaW5nIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBxdWVyeSBhbmQgdGVtcGxhdGUgbG9va3Vwcy4gKi9cbmZ1bmN0aW9uIGNhY2hlTWF0Y2hpbmdMb2NhbE5hbWVzKHROb2RlLCBsb2NhbFJlZnMsIGV4cG9ydHNNYXApIHtcbiAgICBpZiAobG9jYWxSZWZzKSB7XG4gICAgICAgIHZhciBsb2NhbE5hbWVzID0gdE5vZGUubG9jYWxOYW1lcyA9IFtdO1xuICAgICAgICAvLyBMb2NhbCBuYW1lcyBtdXN0IGJlIHN0b3JlZCBpbiB0Tm9kZSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IGxvY2FsUmVmcyBhcmUgZGVmaW5lZFxuICAgICAgICAvLyBpbiB0aGUgdGVtcGxhdGUgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGxvYWRlZCBpbiB0aGUgc2FtZSBzbG90cyBhcyB0aGVpciByZWZzXG4gICAgICAgIC8vIGluIHRoZSB0ZW1wbGF0ZSAoZm9yIHRlbXBsYXRlIHF1ZXJpZXMpLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY2FsUmVmcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gZXhwb3J0c01hcFtsb2NhbFJlZnNbaSArIDFdXTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cG9ydCBvZiBuYW1lICdcIiArIGxvY2FsUmVmc1tpICsgMV0gKyBcIicgbm90IGZvdW5kIVwiKTtcbiAgICAgICAgICAgIGxvY2FsTmFtZXMucHVzaChsb2NhbFJlZnNbaV0sIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuKiBCdWlsZHMgdXAgYW4gZXhwb3J0IG1hcCBhcyBkaXJlY3RpdmVzIGFyZSBjcmVhdGVkLCBzbyBsb2NhbCByZWZzIGNhbiBiZSBxdWlja2x5IG1hcHBlZFxuKiB0byB0aGVpciBkaXJlY3RpdmUgaW5zdGFuY2VzLlxuKi9cbmZ1bmN0aW9uIHNhdmVOYW1lVG9FeHBvcnRNYXAoaW5kZXgsIGRlZiwgZXhwb3J0c01hcCkge1xuICAgIGlmIChleHBvcnRzTWFwKSB7XG4gICAgICAgIGlmIChkZWYuZXhwb3J0QXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmLmV4cG9ydEFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0c01hcFtkZWYuZXhwb3J0QXNbaV1dID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi50ZW1wbGF0ZSlcbiAgICAgICAgICAgIGV4cG9ydHNNYXBbJyddID0gaW5kZXg7XG4gICAgfVxufVxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgZmxhZ3Mgb24gdGhlIGN1cnJlbnQgbm9kZSwgc2V0dGluZyBhbGwgaW5kaWNlcyB0byB0aGUgaW5pdGlhbCBpbmRleCxcbiAqIHRoZSBkaXJlY3RpdmUgY291bnQgdG8gMCwgYW5kIGFkZGluZyB0aGUgaXNDb21wb25lbnQgZmxhZy5cbiAqIEBwYXJhbSBpbmRleCB0aGUgaW5pdGlhbCBpbmRleFxuICovXG5mdW5jdGlvbiBpbml0Tm9kZUZsYWdzKHROb2RlLCBpbmRleCwgbnVtYmVyT2ZEaXJlY3RpdmVzKSB7XG4gICAgdmFyIGZsYWdzID0gdE5vZGUuZmxhZ3M7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGZsYWdzID09PSAwIHx8IGZsYWdzID09PSAxIC8qIGlzQ29tcG9uZW50ICovLCB0cnVlLCAnZXhwZWN0ZWQgbm9kZSBmbGFncyB0byBub3QgYmUgaW5pdGlhbGl6ZWQnKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90RXF1YWwobnVtYmVyT2ZEaXJlY3RpdmVzLCB0Tm9kZS5kaXJlY3RpdmVFbmQgLSB0Tm9kZS5kaXJlY3RpdmVTdGFydCwgJ1JlYWNoZWQgdGhlIG1heCBudW1iZXIgb2YgZGlyZWN0aXZlcycpO1xuICAgIC8vIFdoZW4gdGhlIGZpcnN0IGRpcmVjdGl2ZSBpcyBjcmVhdGVkIG9uIGEgbm9kZSwgc2F2ZSB0aGUgaW5kZXhcbiAgICB0Tm9kZS5mbGFncyA9IGZsYWdzICYgMSAvKiBpc0NvbXBvbmVudCAqLztcbiAgICB0Tm9kZS5kaXJlY3RpdmVTdGFydCA9IGluZGV4O1xuICAgIHROb2RlLmRpcmVjdGl2ZUVuZCA9IGluZGV4ICsgbnVtYmVyT2ZEaXJlY3RpdmVzO1xuICAgIHROb2RlLnByb3ZpZGVySW5kZXhlcyA9IGluZGV4O1xufVxuZnVuY3Rpb24gYmFzZVJlc29sdmVEaXJlY3RpdmUodFZpZXcsIHZpZXdEYXRhLCBkZWYsIGRpcmVjdGl2ZUZhY3RvcnkpIHtcbiAgICB0Vmlldy5kYXRhLnB1c2goZGVmKTtcbiAgICB2YXIgbm9kZUluamVjdG9yRmFjdG9yeSA9IG5ldyBOb2RlSW5qZWN0b3JGYWN0b3J5KGRpcmVjdGl2ZUZhY3RvcnksIGlzQ29tcG9uZW50RGVmKGRlZiksIG51bGwpO1xuICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKG5vZGVJbmplY3RvckZhY3RvcnkpO1xuICAgIHZpZXdEYXRhLnB1c2gobm9kZUluamVjdG9yRmFjdG9yeSk7XG59XG5mdW5jdGlvbiBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgcHJldmlvdXNPclBhcmVudFROb2RlLCBkZWYpIHtcbiAgICB2YXIgbmF0aXZlID0gZ2V0TmF0aXZlQnlUTm9kZShwcmV2aW91c09yUGFyZW50VE5vZGUsIGxWaWV3KTtcbiAgICB2YXIgdFZpZXcgPSBnZXRPckNyZWF0ZVRWaWV3KGRlZi50ZW1wbGF0ZSwgZGVmLmNvbnN0cywgZGVmLnZhcnMsIGRlZi5kaXJlY3RpdmVEZWZzLCBkZWYucGlwZURlZnMsIGRlZi52aWV3UXVlcnksIGRlZi5zY2hlbWFzKTtcbiAgICAvLyBPbmx5IGNvbXBvbmVudCB2aWV3cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHZpZXcgdHJlZSBkaXJlY3RseS4gRW1iZWRkZWQgdmlld3MgYXJlXG4gICAgLy8gYWNjZXNzZWQgdGhyb3VnaCB0aGVpciBjb250YWluZXJzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmVtb3ZlZCAvIHJlLWFkZGVkIGxhdGVyLlxuICAgIHZhciByZW5kZXJlckZhY3RvcnkgPSBsVmlld1tSRU5ERVJFUl9GQUNUT1JZXTtcbiAgICB2YXIgY29tcG9uZW50VmlldyA9IGFkZFRvVmlld1RyZWUobFZpZXcsIGNyZWF0ZUxWaWV3KGxWaWV3LCB0VmlldywgbnVsbCwgZGVmLm9uUHVzaCA/IDY0IC8qIERpcnR5ICovIDogMTYgLyogQ2hlY2tBbHdheXMgKi8sIGxWaWV3W3ByZXZpb3VzT3JQYXJlbnRUTm9kZS5pbmRleF0sIHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgcmVuZGVyZXJGYWN0b3J5LCBsVmlld1tSRU5ERVJFUl9GQUNUT1JZXS5jcmVhdGVSZW5kZXJlcihuYXRpdmUsIGRlZikpKTtcbiAgICBjb21wb25lbnRWaWV3W1RfSE9TVF0gPSBwcmV2aW91c09yUGFyZW50VE5vZGU7XG4gICAgLy8gQ29tcG9uZW50IHZpZXcgd2lsbCBhbHdheXMgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGluamVjdGVkIExDb250YWluZXJzLFxuICAgIC8vIHNvIHRoaXMgaXMgYSByZWd1bGFyIGVsZW1lbnQsIHdyYXAgaXQgd2l0aCB0aGUgY29tcG9uZW50IHZpZXdcbiAgICBsVmlld1twcmV2aW91c09yUGFyZW50VE5vZGUuaW5kZXhdID0gY29tcG9uZW50VmlldztcbiAgICBpZiAobFZpZXdbVFZJRVddLmZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgICAgIHF1ZXVlQ29tcG9uZW50SW5kZXhGb3JDaGVjayhwcmV2aW91c09yUGFyZW50VE5vZGUpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0cyBpbml0aWFsIGlucHV0IHByb3BlcnRpZXMgb24gZGlyZWN0aXZlIGluc3RhbmNlcyBmcm9tIGF0dHJpYnV0ZSBkYXRhXG4gKlxuICogQHBhcmFtIGRpcmVjdGl2ZUluZGV4IEluZGV4IG9mIHRoZSBkaXJlY3RpdmUgaW4gZGlyZWN0aXZlcyBhcnJheVxuICogQHBhcmFtIGluc3RhbmNlIEluc3RhbmNlIG9mIHRoZSBkaXJlY3RpdmUgb24gd2hpY2ggdG8gc2V0IHRoZSBpbml0aWFsIGlucHV0c1xuICogQHBhcmFtIGRlZiBUaGUgZGlyZWN0aXZlIGRlZiB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGlucHV0c1xuICogQHBhcmFtIHROb2RlIFRoZSBzdGF0aWMgZGF0YSBmb3IgdGhpcyBub2RlXG4gKi9cbmZ1bmN0aW9uIHNldElucHV0c0Zyb21BdHRycyhkaXJlY3RpdmVJbmRleCwgaW5zdGFuY2UsIGRlZiwgdE5vZGUpIHtcbiAgICB2YXIgaW5pdGlhbElucHV0RGF0YSA9IHROb2RlLmluaXRpYWxJbnB1dHM7XG4gICAgaWYgKGluaXRpYWxJbnB1dERhdGEgPT09IHVuZGVmaW5lZCB8fCBkaXJlY3RpdmVJbmRleCA+PSBpbml0aWFsSW5wdXREYXRhLmxlbmd0aCkge1xuICAgICAgICBpbml0aWFsSW5wdXREYXRhID0gZ2VuZXJhdGVJbml0aWFsSW5wdXRzKGRpcmVjdGl2ZUluZGV4LCBkZWYuaW5wdXRzLCB0Tm9kZSk7XG4gICAgfVxuICAgIHZhciBpbml0aWFsSW5wdXRzID0gaW5pdGlhbElucHV0RGF0YVtkaXJlY3RpdmVJbmRleF07XG4gICAgaWYgKGluaXRpYWxJbnB1dHMpIHtcbiAgICAgICAgdmFyIHNldElucHV0ID0gZGVmLnNldElucHV0O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxJbnB1dHMubGVuZ3RoOykge1xuICAgICAgICAgICAgdmFyIHB1YmxpY05hbWUgPSBpbml0aWFsSW5wdXRzW2krK107XG4gICAgICAgICAgICB2YXIgcHJpdmF0ZU5hbWUgPSBpbml0aWFsSW5wdXRzW2krK107XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBpbml0aWFsSW5wdXRzW2krK107XG4gICAgICAgICAgICBpZiAoc2V0SW5wdXQpIHtcbiAgICAgICAgICAgICAgICBkZWYuc2V0SW5wdXQoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtwcml2YXRlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgICAgICAgICAgICAgIHZhciBuYXRpdmVFbGVtZW50ID0gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpO1xuICAgICAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBuYXRpdmVFbGVtZW50LCB0Tm9kZS50eXBlLCBwcml2YXRlTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZW5lcmF0ZXMgaW5pdGlhbElucHV0RGF0YSBmb3IgYSBub2RlIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHRlbXBsYXRlJ3Mgc3RhdGljIHN0b3JhZ2VcbiAqIHNvIHN1YnNlcXVlbnQgdGVtcGxhdGUgaW52b2NhdGlvbnMgZG9uJ3QgaGF2ZSB0byByZWNhbGN1bGF0ZSBpdC5cbiAqXG4gKiBpbml0aWFsSW5wdXREYXRhIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBzZXQgYXMgaW5wdXQgcHJvcGVydGllc1xuICogZm9yIGRpcmVjdGl2ZXMgb24gdGhpcyBub2RlLCBidXQgb25seSBvbmNlIG9uIGNyZWF0aW9uLiBXZSBuZWVkIHRoaXMgYXJyYXkgdG8gc3VwcG9ydFxuICogdGhlIGNhc2Ugd2hlcmUgeW91IHNldCBhbiBASW5wdXQgcHJvcGVydHkgb2YgYSBkaXJlY3RpdmUgdXNpbmcgYXR0cmlidXRlLWxpa2Ugc3ludGF4LlxuICogZS5nLiBpZiB5b3UgaGF2ZSBhIGBuYW1lYCBASW5wdXQsIHlvdSBjYW4gc2V0IGl0IG9uY2UgbGlrZSB0aGlzOlxuICpcbiAqIDxteS1jb21wb25lbnQgbmFtZT1cIkJlc3NcIj48L215LWNvbXBvbmVudD5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0aXZlSW5kZXggSW5kZXggdG8gc3RvcmUgdGhlIGluaXRpYWwgaW5wdXQgZGF0YVxuICogQHBhcmFtIGlucHV0cyBUaGUgbGlzdCBvZiBpbnB1dHMgZnJvbSB0aGUgZGlyZWN0aXZlIGRlZlxuICogQHBhcmFtIHROb2RlIFRoZSBzdGF0aWMgZGF0YSBvbiB0aGlzIG5vZGVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbml0aWFsSW5wdXRzKGRpcmVjdGl2ZUluZGV4LCBpbnB1dHMsIHROb2RlKSB7XG4gICAgdmFyIGluaXRpYWxJbnB1dERhdGEgPSB0Tm9kZS5pbml0aWFsSW5wdXRzIHx8ICh0Tm9kZS5pbml0aWFsSW5wdXRzID0gW10pO1xuICAgIGluaXRpYWxJbnB1dERhdGFbZGlyZWN0aXZlSW5kZXhdID0gbnVsbDtcbiAgICB2YXIgYXR0cnMgPSB0Tm9kZS5hdHRycztcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGF0dHJOYW1lID0gYXR0cnNbaV07XG4gICAgICAgIGlmIChhdHRyTmFtZSA9PT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHtcbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBpbnB1dHMgb24gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLlxuICAgICAgICAgICAgaSArPSA0O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXR0ck5hbWUgPT09IDUgLyogUHJvamVjdEFzICovKSB7XG4gICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGBuZ1Byb2plY3RBc2AgdmFsdWUuXG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBoaXQgYW55IG90aGVyIGF0dHJpYnV0ZSBtYXJrZXJzLCB3ZSdyZSBkb25lIGFueXdheS4gTm9uZSBvZiB0aG9zZSBhcmUgdmFsaWQgaW5wdXRzLlxuICAgICAgICBpZiAodHlwZW9mIGF0dHJOYW1lID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB2YXIgbWluaWZpZWRJbnB1dE5hbWUgPSBpbnB1dHNbYXR0ck5hbWVdO1xuICAgICAgICB2YXIgYXR0clZhbHVlID0gYXR0cnNbaSArIDFdO1xuICAgICAgICBpZiAobWluaWZpZWRJbnB1dE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGlucHV0c1RvU3RvcmUgPSBpbml0aWFsSW5wdXREYXRhW2RpcmVjdGl2ZUluZGV4XSB8fCAoaW5pdGlhbElucHV0RGF0YVtkaXJlY3RpdmVJbmRleF0gPSBbXSk7XG4gICAgICAgICAgICBpbnB1dHNUb1N0b3JlLnB1c2goYXR0ck5hbWUsIG1pbmlmaWVkSW5wdXROYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGkgKz0gMjtcbiAgICB9XG4gICAgcmV0dXJuIGluaXRpYWxJbnB1dERhdGE7XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLyBWaWV3Q29udGFpbmVyICYgVmlld1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogQ3JlYXRlcyBhIExDb250YWluZXIsIGVpdGhlciBmcm9tIGEgY29udGFpbmVyIGluc3RydWN0aW9uLCBvciBmb3IgYSBWaWV3Q29udGFpbmVyUmVmLlxuICpcbiAqIEBwYXJhbSBob3N0TmF0aXZlIFRoZSBob3N0IGVsZW1lbnQgZm9yIHRoZSBMQ29udGFpbmVyXG4gKiBAcGFyYW0gaG9zdFROb2RlIFRoZSBob3N0IFROb2RlIGZvciB0aGUgTENvbnRhaW5lclxuICogQHBhcmFtIGN1cnJlbnRWaWV3IFRoZSBwYXJlbnQgdmlldyBvZiB0aGUgTENvbnRhaW5lclxuICogQHBhcmFtIG5hdGl2ZSBUaGUgbmF0aXZlIGNvbW1lbnQgZWxlbWVudFxuICogQHBhcmFtIGlzRm9yVmlld0NvbnRhaW5lclJlZiBPcHRpb25hbCBhIGZsYWcgaW5kaWNhdGluZyB0aGUgVmlld0NvbnRhaW5lclJlZiBjYXNlXG4gKiBAcmV0dXJucyBMQ29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxDb250YWluZXIoaG9zdE5hdGl2ZSwgY3VycmVudFZpZXcsIG5hdGl2ZSwgdE5vZGUsIGlzRm9yVmlld0NvbnRhaW5lclJlZikge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREb21Ob2RlKG5hdGl2ZSk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGN1cnJlbnRWaWV3KTtcbiAgICB2YXIgbENvbnRhaW5lciA9IFtcbiAgICAgICAgaG9zdE5hdGl2ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgaXNGb3JWaWV3Q29udGFpbmVyUmVmID8gLTEgOiAwLFxuICAgICAgICBjdXJyZW50VmlldyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdE5vZGUsXG4gICAgICAgIG5hdGl2ZSxcbiAgICAgICAgW10sXG4gICAgXTtcbiAgICBuZ0Rldk1vZGUgJiYgYXR0YWNoTENvbnRhaW5lckRlYnVnKGxDb250YWluZXIpO1xuICAgIHJldHVybiBsQ29udGFpbmVyO1xufVxuLyoqXG4gKiBHb2VzIG92ZXIgZHluYW1pYyBlbWJlZGRlZCB2aWV3cyAob25lcyBjcmVhdGVkIHRocm91Z2ggVmlld0NvbnRhaW5lclJlZiBBUElzKSBhbmQgcmVmcmVzaGVzIHRoZW1cbiAqIGJ5IGV4ZWN1dGluZyBhbiBhc3NvY2lhdGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiByZWZyZXNoRHluYW1pY0VtYmVkZGVkVmlld3MobFZpZXcpIHtcbiAgICBmb3IgKHZhciBjdXJyZW50ID0gbFZpZXdbQ0hJTERfSEVBRF07IGN1cnJlbnQgIT09IG51bGw7IGN1cnJlbnQgPSBjdXJyZW50W05FWFRdKSB7XG4gICAgICAgIC8vIE5vdGU6IGN1cnJlbnQgY2FuIGJlIGFuIExWaWV3IG9yIGFuIExDb250YWluZXIgaW5zdGFuY2UsIGJ1dCBoZXJlIHdlIGFyZSBvbmx5IGludGVyZXN0ZWRcbiAgICAgICAgLy8gaW4gTENvbnRhaW5lci4gV2UgY2FuIHRlbGwgaXQncyBhbiBMQ29udGFpbmVyIGJlY2F1c2UgaXRzIGxlbmd0aCBpcyBsZXNzIHRoYW4gdGhlIExWaWV3XG4gICAgICAgIC8vIGhlYWRlci5cbiAgICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoIDwgSEVBREVSX09GRlNFVCAmJiBjdXJyZW50W0FDVElWRV9JTkRFWF0gPT09IC0xKSB7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gY3VycmVudDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGFpbmVyW1ZJRVdTXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkeW5hbWljVmlld0RhdGEgPSBjb250YWluZXJbVklFV1NdW2ldO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhcmUgbm90IG5lZWRlZCBoZXJlIGFzIGFuIGV4aXN0aW5nIHZpZXcgaXMgb25seSBiZWluZyByZWZyZXNoZWQuXG4gICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoZHluYW1pY1ZpZXdEYXRhW1RWSUVXXSwgJ1RWaWV3IG11c3QgYmUgYWxsb2NhdGVkJyk7XG4gICAgICAgICAgICAgICAgcmVuZGVyRW1iZWRkZWRUZW1wbGF0ZShkeW5hbWljVmlld0RhdGEsIGR5bmFtaWNWaWV3RGF0YVtUVklFV10sIGR5bmFtaWNWaWV3RGF0YVtDT05URVhUXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLy8vLy8vLy8vLy8vXG4vKipcbiAqIFJlZnJlc2hlcyBjb21wb25lbnRzIGJ5IGVudGVyaW5nIHRoZSBjb21wb25lbnQgdmlldyBhbmQgcHJvY2Vzc2luZyBpdHMgYmluZGluZ3MsIHF1ZXJpZXMsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gYWRqdXN0ZWRFbGVtZW50SW5kZXggIEVsZW1lbnQgaW5kZXggaW4gTFZpZXdbXSAoYWRqdXN0ZWQgZm9yIEhFQURFUl9PRkZTRVQpXG4gKi9cbmZ1bmN0aW9uIGNvbXBvbmVudFJlZnJlc2goYWRqdXN0ZWRFbGVtZW50SW5kZXgpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgYWRqdXN0ZWRFbGVtZW50SW5kZXgpO1xuICAgIHZhciBob3N0VmlldyA9IGdldENvbXBvbmVudFZpZXdCeUluZGV4KGFkanVzdGVkRWxlbWVudEluZGV4LCBsVmlldyk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKGxWaWV3W1RWSUVXXS5kYXRhW2FkanVzdGVkRWxlbWVudEluZGV4XSwgMyAvKiBFbGVtZW50ICovKTtcbiAgICAvLyBPbmx5IGNvbXBvbmVudHMgaW4gY3JlYXRpb24gbW9kZSwgYXR0YWNoZWQgQ2hlY2tBbHdheXNcbiAgICAvLyBjb21wb25lbnRzIG9yIGF0dGFjaGVkLCBkaXJ0eSBPblB1c2ggY29tcG9uZW50cyBzaG91bGQgYmUgY2hlY2tlZFxuICAgIGlmICgodmlld0F0dGFjaGVkVG9DaGFuZ2VEZXRlY3Rvcihob3N0VmlldykgfHwgaXNDcmVhdGlvbk1vZGUobFZpZXcpKSAmJlxuICAgICAgICBob3N0Vmlld1tGTEFHU10gJiAoMTYgLyogQ2hlY2tBbHdheXMgKi8gfCA2NCAvKiBEaXJ0eSAqLykpIHtcbiAgICAgICAgc3luY1ZpZXdXaXRoQmx1ZXByaW50KGhvc3RWaWV3KTtcbiAgICAgICAgY2hlY2tWaWV3KGhvc3RWaWV3LCBob3N0Vmlld1tDT05URVhUXSk7XG4gICAgfVxufVxuLyoqXG4gKiBTeW5jcyBhbiBMVmlldyBpbnN0YW5jZSB3aXRoIGl0cyBibHVlcHJpbnQgaWYgdGhleSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYy5cbiAqXG4gKiBUeXBpY2FsbHksIGJsdWVwcmludHMgYW5kIHRoZWlyIHZpZXcgaW5zdGFuY2VzIHNob3VsZCBhbHdheXMgYmUgaW4gc3luYywgc28gdGhlIGxvb3AgaGVyZVxuICogd2lsbCBiZSBza2lwcGVkLiBIb3dldmVyLCBjb25zaWRlciB0aGlzIGNhc2Ugb2YgdHdvIGNvbXBvbmVudHMgc2lkZS1ieS1zaWRlOlxuICpcbiAqIEFwcCB0ZW1wbGF0ZTpcbiAqIGBgYFxuICogPGNvbXA+PC9jb21wPlxuICogPGNvbXA+PC9jb21wPlxuICogYGBgXG4gKlxuICogVGhlIGZvbGxvd2luZyB3aWxsIGhhcHBlbjpcbiAqIDEuIEFwcCB0ZW1wbGF0ZSBiZWdpbnMgcHJvY2Vzc2luZy5cbiAqIDIuIEZpcnN0IDxjb21wPiBpcyBtYXRjaGVkIGFzIGEgY29tcG9uZW50IGFuZCBpdHMgTFZpZXcgaXMgY3JlYXRlZC5cbiAqIDMuIFNlY29uZCA8Y29tcD4gaXMgbWF0Y2hlZCBhcyBhIGNvbXBvbmVudCBhbmQgaXRzIExWaWV3IGlzIGNyZWF0ZWQuXG4gKiA0LiBBcHAgdGVtcGxhdGUgY29tcGxldGVzIHByb2Nlc3NpbmcsIHNvIGl0J3MgdGltZSB0byBjaGVjayBjaGlsZCB0ZW1wbGF0ZXMuXG4gKiA1LiBGaXJzdCA8Y29tcD4gdGVtcGxhdGUgaXMgY2hlY2tlZC4gSXQgaGFzIGEgZGlyZWN0aXZlLCBzbyBpdHMgZGVmIGlzIHB1c2hlZCB0byBibHVlcHJpbnQuXG4gKiA2LiBTZWNvbmQgPGNvbXA+IHRlbXBsYXRlIGlzIGNoZWNrZWQuIEl0cyBibHVlcHJpbnQgaGFzIGJlZW4gdXBkYXRlZCBieSB0aGUgZmlyc3RcbiAqIDxjb21wPiB0ZW1wbGF0ZSwgYnV0IGl0cyBMVmlldyB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyB1cGRhdGUsIHNvIGl0IGlzIG91dCBvZiBzeW5jLlxuICpcbiAqIE5vdGUgdGhhdCBlbWJlZGRlZCB2aWV3cyBpbnNpZGUgbmdGb3IgbG9vcHMgd2lsbCBuZXZlciBiZSBvdXQgb2Ygc3luYyBiZWNhdXNlIHRoZXNlIHZpZXdzXG4gKiBhcmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhleSBhcmUgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50VmlldyBUaGUgdmlldyB0byBzeW5jXG4gKi9cbmZ1bmN0aW9uIHN5bmNWaWV3V2l0aEJsdWVwcmludChjb21wb25lbnRWaWV3KSB7XG4gICAgdmFyIGNvbXBvbmVudFRWaWV3ID0gY29tcG9uZW50Vmlld1tUVklFV107XG4gICAgZm9yICh2YXIgaSA9IGNvbXBvbmVudFZpZXcubGVuZ3RoOyBpIDwgY29tcG9uZW50VFZpZXcuYmx1ZXByaW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbXBvbmVudFZpZXdbaV0gPSBjb21wb25lbnRUVmlldy5ibHVlcHJpbnRbaV07XG4gICAgfVxufVxuLyoqXG4gKiBBZGRzIExWaWV3IG9yIExDb250YWluZXIgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB2aWV3IHRyZWUuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgd2lsbCBiZSB1c2VkIHRvIHRyYXZlcnNlIHRocm91Z2ggbmVzdGVkIHZpZXdzIHRvIHJlbW92ZSBsaXN0ZW5lcnNcbiAqIGFuZCBjYWxsIG9uRGVzdHJveSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIGxWaWV3IFRoZSB2aWV3IHdoZXJlIExWaWV3IG9yIExDb250YWluZXIgc2hvdWxkIGJlIGFkZGVkXG4gKiBAcGFyYW0gYWRqdXN0ZWRIb3N0SW5kZXggSW5kZXggb2YgdGhlIHZpZXcncyBob3N0IG5vZGUgaW4gTFZpZXdbXSwgYWRqdXN0ZWQgZm9yIGhlYWRlclxuICogQHBhcmFtIGxWaWV3T3JMQ29udGFpbmVyIFRoZSBMVmlldyBvciBMQ29udGFpbmVyIHRvIGFkZCB0byB0aGUgdmlldyB0cmVlXG4gKiBAcmV0dXJucyBUaGUgc3RhdGUgcGFzc2VkIGluXG4gKi9cbmZ1bmN0aW9uIGFkZFRvVmlld1RyZWUobFZpZXcsIGxWaWV3T3JMQ29udGFpbmVyKSB7XG4gICAgLy8gVE9ETyhiZW5sZXNoL21pc2tvKTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvcnJlY3QsIGJlY2F1c2UgaXQgYWx3YXlzIGFkZHMgdGhlIExDb250YWluZXIgdG9cbiAgICAvLyB0aGUgZW5kIG9mIHRoZSBxdWV1ZSwgd2hpY2ggbWVhbnMgaWYgdGhlIGRldmVsb3BlciByZXRyaWV2ZXMgdGhlIExDb250YWluZXJzIGZyb20gUk5vZGVzIG91dCBvZlxuICAgIC8vIG9yZGVyLCB0aGUgY2hhbmdlIGRldGVjdGlvbiB3aWxsIHJ1biBvdXQgb2Ygb3JkZXIsIGFzIHRoZSBhY3Qgb2YgcmV0cmlldmluZyB0aGUgdGhlIExDb250YWluZXJcbiAgICAvLyBmcm9tIHRoZSBSTm9kZSBpcyB3aGF0IGFkZHMgaXQgdG8gdGhlIHF1ZXVlLlxuICAgIGlmIChsVmlld1tDSElMRF9IRUFEXSkge1xuICAgICAgICBsVmlld1tDSElMRF9UQUlMXVtORVhUXSA9IGxWaWV3T3JMQ29udGFpbmVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbFZpZXdbQ0hJTERfSEVBRF0gPSBsVmlld09yTENvbnRhaW5lcjtcbiAgICB9XG4gICAgbFZpZXdbQ0hJTERfVEFJTF0gPSBsVmlld09yTENvbnRhaW5lcjtcbiAgICByZXR1cm4gbFZpZXdPckxDb250YWluZXI7XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vIENoYW5nZSBkZXRlY3Rpb25cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogTWFya3MgY3VycmVudCB2aWV3IGFuZCBhbGwgYW5jZXN0b3JzIGRpcnR5LlxuICpcbiAqIFJldHVybnMgdGhlIHJvb3QgdmlldyBiZWNhdXNlIGl0IGlzIGZvdW5kIGFzIGEgYnlwcm9kdWN0IG9mIG1hcmtpbmcgdGhlIHZpZXcgdHJlZVxuICogZGlydHksIGFuZCBjYW4gYmUgdXNlZCBieSBtZXRob2RzIHRoYXQgY29uc3VtZSBtYXJrVmlld0RpcnR5KCkgdG8gZWFzaWx5IHNjaGVkdWxlXG4gKiBjaGFuZ2UgZGV0ZWN0aW9uLiBPdGhlcndpc2UsIHN1Y2ggbWV0aG9kcyB3b3VsZCBuZWVkIHRvIHRyYXZlcnNlIHVwIHRoZSB2aWV3IHRyZWVcbiAqIGFuIGFkZGl0aW9uYWwgdGltZSB0byBnZXQgdGhlIHJvb3QgdmlldyBhbmQgc2NoZWR1bGUgYSB0aWNrIG9uIGl0LlxuICpcbiAqIEBwYXJhbSBsVmlldyBUaGUgc3RhcnRpbmcgTFZpZXcgdG8gbWFyayBkaXJ0eVxuICogQHJldHVybnMgdGhlIHJvb3QgTFZpZXdcbiAqL1xuZnVuY3Rpb24gbWFya1ZpZXdEaXJ0eShsVmlldykge1xuICAgIHdoaWxlIChsVmlldykge1xuICAgICAgICBsVmlld1tGTEFHU10gfD0gNjQgLyogRGlydHkgKi87XG4gICAgICAgIHZhciBwYXJlbnRfMiA9IGdldExWaWV3UGFyZW50KGxWaWV3KTtcbiAgICAgICAgLy8gU3RvcCB0cmF2ZXJzaW5nIHVwIGFzIHNvb24gYXMgeW91IGZpbmQgYSByb290IHZpZXcgdGhhdCB3YXNuJ3QgYXR0YWNoZWQgdG8gYW55IGNvbnRhaW5lclxuICAgICAgICBpZiAoaXNSb290VmlldyhsVmlldykgJiYgIXBhcmVudF8yKSB7XG4gICAgICAgICAgICByZXR1cm4gbFZpZXc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29udGludWUgb3RoZXJ3aXNlXG4gICAgICAgIGxWaWV3ID0gcGFyZW50XzI7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIHNjaGVkdWxlIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIHdob2xlIGFwcGxpY2F0aW9uLlxuICpcbiAqIFVubGlrZSBgdGlja2AsIGBzY2hlZHVsZVRpY2tgIGNvYWxlc2NlcyBtdWx0aXBsZSBjYWxscyBpbnRvIG9uZSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi5cbiAqIEl0IGlzIHVzdWFsbHkgY2FsbGVkIGluZGlyZWN0bHkgYnkgY2FsbGluZyBgbWFya0RpcnR5YCB3aGVuIHRoZSB2aWV3IG5lZWRzIHRvIGJlXG4gKiByZS1yZW5kZXJlZC5cbiAqXG4gKiBUeXBpY2FsbHkgYHNjaGVkdWxlVGlja2AgdXNlcyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0byBjb2FsZXNjZSBtdWx0aXBsZVxuICogYHNjaGVkdWxlVGlja2AgcmVxdWVzdHMuIFRoZSBzY2hlZHVsaW5nIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluXG4gKiBgcmVuZGVyQ29tcG9uZW50YCdzIGBzY2hlZHVsZXJgIG9wdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2NoZWR1bGVUaWNrKHJvb3RDb250ZXh0LCBmbGFncykge1xuICAgIHZhciBub3RoaW5nU2NoZWR1bGVkID0gcm9vdENvbnRleHQuZmxhZ3MgPT09IDAgLyogRW1wdHkgKi87XG4gICAgcm9vdENvbnRleHQuZmxhZ3MgfD0gZmxhZ3M7XG4gICAgaWYgKG5vdGhpbmdTY2hlZHVsZWQgJiYgcm9vdENvbnRleHQuY2xlYW4gPT0gX0NMRUFOX1BST01JU0UpIHtcbiAgICAgICAgdmFyIHJlc18xO1xuICAgICAgICByb290Q29udGV4dC5jbGVhbiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyKSB7IHJldHVybiByZXNfMSA9IHI7IH0pO1xuICAgICAgICByb290Q29udGV4dC5zY2hlZHVsZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmZsYWdzICYgMSAvKiBEZXRlY3RDaGFuZ2VzICovKSB7XG4gICAgICAgICAgICAgICAgcm9vdENvbnRleHQuZmxhZ3MgJj0gfjEgLyogRGV0ZWN0Q2hhbmdlcyAqLztcbiAgICAgICAgICAgICAgICB0aWNrUm9vdENvbnRleHQocm9vdENvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmZsYWdzICYgMiAvKiBGbHVzaFBsYXllcnMgKi8pIHtcbiAgICAgICAgICAgICAgICByb290Q29udGV4dC5mbGFncyAmPSB+MiAvKiBGbHVzaFBsYXllcnMgKi87XG4gICAgICAgICAgICAgICAgdmFyIHBsYXllckhhbmRsZXIgPSByb290Q29udGV4dC5wbGF5ZXJIYW5kbGVyO1xuICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXllckhhbmRsZXIuZmx1c2hQbGF5ZXJzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm9vdENvbnRleHQuY2xlYW4gPSBfQ0xFQU5fUFJPTUlTRTtcbiAgICAgICAgICAgIHJlc18xKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiB0aWNrUm9vdENvbnRleHQocm9vdENvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RDb250ZXh0LmNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvb3RDb21wb25lbnQgPSByb290Q29udGV4dC5jb21wb25lbnRzW2ldO1xuICAgICAgICByZW5kZXJDb21wb25lbnRPclRlbXBsYXRlKHJlYWRQYXRjaGVkTFZpZXcocm9vdENvbXBvbmVudCksIHJvb3RDb21wb25lbnQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRldGVjdENoYW5nZXNJbnRlcm5hbCh2aWV3LCBjb250ZXh0KSB7XG4gICAgdmFyIHJlbmRlcmVyRmFjdG9yeSA9IHZpZXdbUkVOREVSRVJfRkFDVE9SWV07XG4gICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5iZWdpbilcbiAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmJlZ2luKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGlzQ3JlYXRpb25Nb2RlKHZpZXcpKSB7XG4gICAgICAgICAgICBjaGVja1ZpZXcodmlldywgY29udGV4dCk7IC8vIGNyZWF0aW9uIG1vZGUgcGFzc1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrVmlldyh2aWV3LCBjb250ZXh0KTsgLy8gdXBkYXRlIG1vZGUgcGFzc1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IodmlldywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGlmIChyZW5kZXJlckZhY3RvcnkuZW5kKVxuICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmVuZCgpO1xuICAgIH1cbn1cbi8qKlxuICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSByb290IHZpZXcgYW5kIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBsVmlldyBUaGUgdmlldyB3aGljaCB0aGUgY2hhbmdlIGRldGVjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9uLlxuICovXG5mdW5jdGlvbiBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldykge1xuICAgIHRpY2tSb290Q29udGV4dChsVmlld1tDT05URVhUXSk7XG59XG5mdW5jdGlvbiBjaGVja05vQ2hhbmdlc0ludGVybmFsKHZpZXcsIGNvbnRleHQpIHtcbiAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgZGV0ZWN0Q2hhbmdlc0ludGVybmFsKHZpZXcsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgc2V0Q2hlY2tOb0NoYW5nZXNNb2RlKGZhbHNlKTtcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIG9uIGEgcm9vdCB2aWV3IGFuZCBpdHMgY29tcG9uZW50cywgYW5kIHRocm93cyBpZiBhbnkgY2hhbmdlcyBhcmVcbiAqIGRldGVjdGVkLlxuICpcbiAqIFRoaXMgaXMgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlIHRvIHZlcmlmeSB0aGF0IHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0XG4gKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gbFZpZXcgVGhlIHZpZXcgd2hpY2ggdGhlIGNoYW5nZSBkZXRlY3Rpb24gc2hvdWxkIGJlIGNoZWNrZWQgb24uXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTm9DaGFuZ2VzSW5Sb290VmlldyhsVmlldykge1xuICAgIHNldENoZWNrTm9DaGFuZ2VzTW9kZSh0cnVlKTtcbiAgICB0cnkge1xuICAgICAgICBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldyk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpO1xuICAgIH1cbn1cbi8qKiBDaGVja3MgdGhlIHZpZXcgb2YgdGhlIGNvbXBvbmVudCBwcm92aWRlZC4gRG9lcyBub3QgZ2F0ZSBvbiBkaXJ0eSBjaGVja3Mgb3IgZXhlY3V0ZSBkb0NoZWNrLiAqL1xuZnVuY3Rpb24gY2hlY2tWaWV3KGhvc3RWaWV3LCBjb21wb25lbnQpIHtcbiAgICB2YXIgaG9zdFRWaWV3ID0gaG9zdFZpZXdbVFZJRVddO1xuICAgIHZhciBvbGRWaWV3ID0gZW50ZXJWaWV3KGhvc3RWaWV3LCBob3N0Vmlld1tUX0hPU1RdKTtcbiAgICB2YXIgdGVtcGxhdGVGbiA9IGhvc3RUVmlldy50ZW1wbGF0ZTtcbiAgICB2YXIgY3JlYXRpb25Nb2RlID0gaXNDcmVhdGlvbk1vZGUoaG9zdFZpZXcpO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3MoaG9zdFZpZXcpO1xuICAgICAgICBjcmVhdGlvbk1vZGUgJiYgZXhlY3V0ZVZpZXdRdWVyeUZuKDEgLyogQ3JlYXRlICovLCBob3N0VFZpZXcsIGNvbXBvbmVudCk7XG4gICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSh0ZW1wbGF0ZUZuLCBnZXRSZW5kZXJGbGFncyhob3N0VmlldyksIGNvbXBvbmVudCk7XG4gICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3MoaG9zdFZpZXcpO1xuICAgICAgICAvLyBPbmx5IGNoZWNrIHZpZXcgcXVlcmllcyBhZ2FpbiBpbiBjcmVhdGlvbiBtb2RlIGlmIHRoZXJlIGFyZSBzdGF0aWMgdmlldyBxdWVyaWVzXG4gICAgICAgIGlmICghY3JlYXRpb25Nb2RlIHx8IGhvc3RUVmlldy5zdGF0aWNWaWV3UXVlcmllcykge1xuICAgICAgICAgICAgZXhlY3V0ZVZpZXdRdWVyeUZuKDIgLyogVXBkYXRlICovLCBob3N0VFZpZXcsIGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIGxlYXZlVmlldyhvbGRWaWV3KTtcbiAgICB9XG59XG5mdW5jdGlvbiBleGVjdXRlVmlld1F1ZXJ5Rm4oZmxhZ3MsIHRWaWV3LCBjb21wb25lbnQpIHtcbiAgICB2YXIgdmlld1F1ZXJ5ID0gdFZpZXcudmlld1F1ZXJ5O1xuICAgIGlmICh2aWV3UXVlcnkpIHtcbiAgICAgICAgc2V0Q3VycmVudFF1ZXJ5SW5kZXgodFZpZXcudmlld1F1ZXJ5U3RhcnRJbmRleCk7XG4gICAgICAgIHZpZXdRdWVyeShmbGFncywgY29tcG9uZW50KTtcbiAgICB9XG59XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vIEJpbmRpbmdzICYgaW50ZXJwb2xhdGlvbnNcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qKlxuICogQ3JlYXRlcyBiaW5kaW5nIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgYmluZGluZyBhbmQgc3RvcmVzIGl0IGluXG4gKiBUVmlldy5kYXRhLiBUaGVzZSBhcmUgZ2VuZXJhdGVkIGluIG9yZGVyIHRvIHN1cHBvcnQgRGVidWdFbGVtZW50LnByb3BlcnRpZXMuXG4gKlxuICogRWFjaCBiaW5kaW5nIC8gaW50ZXJwb2xhdGlvbiB3aWxsIGhhdmUgb25lIChpbmNsdWRpbmcgYXR0cmlidXRlIGJpbmRpbmdzKVxuICogYmVjYXVzZSBhdCB0aGUgdGltZSBvZiBiaW5kaW5nLCB3ZSBkb24ndCBrbm93IHRvIHdoaWNoIGluc3RydWN0aW9uIHRoZSBiaW5kaW5nXG4gKiBiZWxvbmdzLiBJdCBpcyBhbHdheXMgc3RvcmVkIGluIFRWaWV3LmRhdGEgYXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGJpbmRpbmdcbiAqIHZhbHVlIGluIExWaWV3IChlLmcuIGZvciBpbnRlcnBvbGF0aW9uOCwgaXQgd291bGQgYmUgc3RvcmVkIGF0IHRoZSBpbmRleCBvZlxuICogdGhlIDh0aCB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIGxWaWV3IFRoZSBMVmlldyB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGJpbmRpbmcgaW5kZXguXG4gKiBAcGFyYW0gcHJlZml4IFRoZSBzdGF0aWMgcHJlZml4IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeCBUaGUgc3RhdGljIHN1ZmZpeCBzdHJpbmdcbiAqXG4gKiBAcmV0dXJucyBOZXdseSBjcmVhdGVkIGJpbmRpbmcgbWV0YWRhdGEgc3RyaW5nIGZvciB0aGlzIGJpbmRpbmcgb3IgbnVsbFxuICovXG5mdW5jdGlvbiBzdG9yZUJpbmRpbmdNZXRhZGF0YShsVmlldywgcHJlZml4LCBzdWZmaXgpIHtcbiAgICBpZiAocHJlZml4ID09PSB2b2lkIDApIHsgcHJlZml4ID0gJyc7IH1cbiAgICBpZiAoc3VmZml4ID09PSB2b2lkIDApIHsgc3VmZml4ID0gJyc7IH1cbiAgICB2YXIgdERhdGEgPSBsVmlld1tUVklFV10uZGF0YTtcbiAgICB2YXIgbGFzdEJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdIC0gMTtcbiAgICB2YXIgdmFsdWUgPSBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiArIHByZWZpeCArIElOVEVSUE9MQVRJT05fREVMSU1JVEVSICsgc3VmZml4O1xuICAgIHJldHVybiB0RGF0YVtsYXN0QmluZGluZ0luZGV4XSA9PSBudWxsID8gKHREYXRhW2xhc3RCaW5kaW5nSW5kZXhdID0gdmFsdWUpIDogbnVsbDtcbn1cbnZhciBDTEVBTl9QUk9NSVNFID0gX0NMRUFOX1BST01JU0U7XG5mdW5jdGlvbiBpbml0aWFsaXplVE5vZGVJbnB1dHModE5vZGUpIHtcbiAgICAvLyBJZiB0Tm9kZS5pbnB1dHMgaXMgdW5kZWZpbmVkLCBhIGxpc3RlbmVyIGhhcyBjcmVhdGVkIG91dHB1dHMsIGJ1dCBpbnB1dHMgaGF2ZW4ndFxuICAgIC8vIHlldCBiZWVuIGNoZWNrZWQuXG4gICAgaWYgKHROb2RlKSB7XG4gICAgICAgIGlmICh0Tm9kZS5pbnB1dHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gbWFyayBpbnB1dHMgYXMgY2hlY2tlZFxuICAgICAgICAgICAgdE5vZGUuaW5wdXRzID0gZ2VuZXJhdGVQcm9wZXJ0eUFsaWFzZXModE5vZGUsIDAgLyogSW5wdXQgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0Tm9kZS5pbnB1dHM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0Q2xlYW51cCh2aWV3KSB7XG4gICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKVxuICAgIHJldHVybiB2aWV3W0NMRUFOVVBdIHx8ICh2aWV3W0NMRUFOVVBdID0gW10pO1xufVxuZnVuY3Rpb24gZ2V0VFZpZXdDbGVhbnVwKHZpZXcpIHtcbiAgICByZXR1cm4gdmlld1tUVklFV10uY2xlYW51cCB8fCAodmlld1tUVklFV10uY2xlYW51cCA9IFtdKTtcbn1cbi8qKlxuICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBzdWIgY29tcG9uZW50J3MgcmVuZGVyZXIgbmVlZHMgdG8gYmUgaW5jbHVkZWRcbiAqIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyZXIgKHNlZSB0aGUgY29tcG9uZW50U3ludGhldGljSG9zdCogaW5zdHJ1Y3Rpb25zKS5cbiAqL1xuZnVuY3Rpb24gbG9hZENvbXBvbmVudFJlbmRlcmVyKHROb2RlLCBsVmlldykge1xuICAgIHZhciBjb21wb25lbnRMVmlldyA9IGxWaWV3W3ROb2RlLmluZGV4XTtcbiAgICByZXR1cm4gY29tcG9uZW50TFZpZXdbUkVOREVSRVJdO1xufVxuLyoqIEhhbmRsZXMgYW4gZXJyb3IgdGhyb3duIGluIGFuIExWaWV3LiAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3IobFZpZXcsIGVycm9yKSB7XG4gICAgdmFyIGluamVjdG9yID0gbFZpZXdbSU5KRUNUT1IkMV07XG4gICAgdmFyIGVycm9ySGFuZGxlciA9IGluamVjdG9yID8gaW5qZWN0b3IuZ2V0KEVycm9ySGFuZGxlciwgbnVsbCkgOiBudWxsO1xuICAgIGVycm9ySGFuZGxlciAmJiBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xufVxuLyoqXG4gKiBTZXQgdGhlIGlucHV0cyBvZiBkaXJlY3RpdmVzIGF0IHRoZSBjdXJyZW50IG5vZGUgdG8gY29ycmVzcG9uZGluZyB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gbFZpZXcgdGhlIGBMVmlld2Agd2hpY2ggY29udGFpbnMgdGhlIGRpcmVjdGl2ZXMuXG4gKiBAcGFyYW0gaW5wdXRzIG1hcHBpbmcgYmV0d2VlbiB0aGUgcHVibGljIFwiaW5wdXRcIiBuYW1lIGFuZCBwcml2YXRlbHkta25vd24sXG4gKiBwb3NzaWJseSBtaW5pZmllZCwgcHJvcGVydHkgbmFtZXMgdG8gd3JpdGUgdG8uXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0LlxuICovXG5mdW5jdGlvbiBzZXRJbnB1dHNGb3JQcm9wZXJ0eShsVmlldywgaW5wdXRzLCB2YWx1ZSkge1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBpbmRleCA9IGlucHV0c1tpKytdO1xuICAgICAgICB2YXIgcHVibGljTmFtZSA9IGlucHV0c1tpKytdO1xuICAgICAgICB2YXIgcHJpdmF0ZU5hbWUgPSBpbnB1dHNbaSsrXTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gbFZpZXdbaW5kZXhdO1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4KTtcbiAgICAgICAgdmFyIGRlZiA9IHRWaWV3LmRhdGFbaW5kZXhdO1xuICAgICAgICB2YXIgc2V0SW5wdXQgPSBkZWYuc2V0SW5wdXQ7XG4gICAgICAgIGlmIChzZXRJbnB1dCkge1xuICAgICAgICAgICAgZGVmLnNldElucHV0KGluc3RhbmNlLCB2YWx1ZSwgcHVibGljTmFtZSwgcHJpdmF0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2VbcHJpdmF0ZU5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5T25DcmVhdGVJbnN0cnVjdGlvbnModE5vZGUpIHtcbiAgICAvLyB0aGVyZSBtYXkgYmUgc29tZSBpbnN0cnVjdGlvbnMgdGhhdCBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljXG4gICAgLy8gb3JkZXIgYmVjYXVzZSB0aGUgQ1JFQVRFIGJsb2NrIGluIGEgZGlyZWN0aXZlIHJ1bnMgYmVmb3JlIHRoZVxuICAgIC8vIENSRUFURSBibG9jayBpbiBhIHRlbXBsYXRlLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGluc3RydWN0aW9uc1xuICAgIC8vIGNhbiBnZXQgYWNjZXNzIHRvIHRoZSBmdW5jdGlvbiBhcnJheSBiZWxvdyBhbmQgZGVmZXIgYW55IGNvZGVcbiAgICAvLyB0byBydW4gYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZC5cbiAgICB2YXIgZm5zO1xuICAgIGlmIChmbnMgPSB0Tm9kZS5vbkVsZW1lbnRDcmVhdGlvbkZucykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm5zW2ldKCk7XG4gICAgICAgIH1cbiAgICAgICAgdE5vZGUub25FbGVtZW50Q3JlYXRpb25GbnMgPSBudWxsO1xuICAgIH1cbn1cbi8qKlxuICogVW53cmFwcyBhIHBhcmVudCBpbmplY3RvciBsb2NhdGlvbiBudW1iZXIgdG8gZmluZCB0aGUgdmlldyBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBpbmplY3RvcixcbiAqIHRoZW4gd2Fsa3MgdXAgdGhlIGRlY2xhcmF0aW9uIHZpZXcgdHJlZSB1bnRpbCB0aGUgVE5vZGUgb2YgdGhlIHBhcmVudCBpbmplY3RvciBpcyBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IsIHdoaWNoIGNvbnRhaW5zIHRoZSB2aWV3IG9mZnNldFxuICogQHBhcmFtIHN0YXJ0VmlldyBUaGUgTFZpZXcgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBzdGFydCB3YWxraW5nIHVwIHRoZSB2aWV3IHRyZWVcbiAqIEBwYXJhbSBzdGFydFROb2RlIFRoZSBUTm9kZSBpbnN0YW5jZSBvZiB0aGUgc3RhcnRpbmcgZWxlbWVudFxuICogQHJldHVybnMgVGhlIFROb2RlIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3JcbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JUTm9kZShsb2NhdGlvbiwgc3RhcnRWaWV3LCBzdGFydFROb2RlKSB7XG4gICAgaWYgKHN0YXJ0VE5vZGUucGFyZW50ICYmIHN0YXJ0VE5vZGUucGFyZW50LmluamVjdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgIC8vIHZpZXcgb2Zmc2V0IGlzIDBcbiAgICAgICAgdmFyIGluamVjdG9ySW5kZXggPSBzdGFydFROb2RlLnBhcmVudC5pbmplY3RvckluZGV4O1xuICAgICAgICB2YXIgcGFyZW50VE5vZGVfMSA9IHN0YXJ0VE5vZGUucGFyZW50O1xuICAgICAgICB3aGlsZSAocGFyZW50VE5vZGVfMS5wYXJlbnQgIT0gbnVsbCAmJiBpbmplY3RvckluZGV4ID09IHBhcmVudFROb2RlXzEuaW5qZWN0b3JJbmRleCkge1xuICAgICAgICAgICAgcGFyZW50VE5vZGVfMSA9IHBhcmVudFROb2RlXzEucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnRUTm9kZV8xO1xuICAgIH1cbiAgICB2YXIgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7XG4gICAgLy8gdmlldyBvZmZzZXQgaXMgMVxuICAgIHZhciBwYXJlbnRWaWV3ID0gc3RhcnRWaWV3O1xuICAgIHZhciBwYXJlbnRUTm9kZSA9IHN0YXJ0Vmlld1tUX0hPU1RdO1xuICAgIC8vIHZpZXcgb2Zmc2V0IGlzIHN1cGVyaW9yIHRvIDFcbiAgICB3aGlsZSAodmlld09mZnNldCA+IDEpIHtcbiAgICAgICAgcGFyZW50VmlldyA9IHBhcmVudFZpZXdbREVDTEFSQVRJT05fVklFV107XG4gICAgICAgIHBhcmVudFROb2RlID0gcGFyZW50Vmlld1tUX0hPU1RdO1xuICAgICAgICB2aWV3T2Zmc2V0LS07XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRUTm9kZTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBbGxvY2F0ZXMgdGhlIG5lY2Vzc2FyeSBhbW91bnQgb2Ygc2xvdHMgZm9yIGhvc3QgdmFycy5cbiAqXG4gKiBAcGFyYW0gY291bnQgQW1vdW50IG9mIHZhcnMgdG8gYmUgYWxsb2NhdGVkXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWFsbG9jSG9zdFZhcnMoY291bnQpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICBpZiAoIXRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzKVxuICAgICAgICByZXR1cm47XG4gICAgcXVldWVIb3N0QmluZGluZ0ZvckNoZWNrKHRWaWV3LCBnZXRDdXJyZW50RGlyZWN0aXZlRGVmKCksIGNvdW50KTtcbiAgICBwcmVmaWxsSG9zdFZhcnModFZpZXcsIGxWaWV3LCBjb3VudCk7XG59XG4vKipcbiAqIFN0b3JlcyBob3N0IGJpbmRpbmcgZm4gYW5kIG51bWJlciBvZiBob3N0IHZhcnMgc28gaXQgd2lsbCBiZSBxdWV1ZWQgZm9yIGJpbmRpbmcgcmVmcmVzaCBkdXJpbmdcbiAqIENELlxuICovXG5mdW5jdGlvbiBxdWV1ZUhvc3RCaW5kaW5nRm9yQ2hlY2sodFZpZXcsIGRlZiwgaG9zdFZhcnMpIHtcbiAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MsIHRydWUsICdTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdGVtcGxhdGUgcGFzcy4nKTtcbiAgICB2YXIgZXhwYW5kbyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7XG4gICAgdmFyIGxlbmd0aCA9IGV4cGFuZG8ubGVuZ3RoO1xuICAgIC8vIENoZWNrIHdoZXRoZXIgYSBnaXZlbiBgaG9zdEJpbmRpbmdzYCBmdW5jdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiBleHBhbmRvSW5zdHJ1Y3Rpb25zLFxuICAgIC8vIHdoaWNoIGNhbiBoYXBwZW4gaW4gY2FzZSBkaXJlY3RpdmUgZGVmaW5pdGlvbiB3YXMgZXh0ZW5kZWQgZnJvbSBiYXNlIGRlZmluaXRpb24gKGFzIGEgcGFydCBvZlxuICAgIC8vIHRoZSBgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlYCBsb2dpYykuIElmIHdlIGZvdW5kIHRoZSBzYW1lIGBob3N0QmluZGluZ3NgIGZ1bmN0aW9uIGluIHRoZVxuICAgIC8vIGxpc3QsIHdlIGp1c3QgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBob3N0IHZhcnMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnVuY3Rpb24sIGJ1dCBkbyBub3QgYWRkIGl0XG4gICAgLy8gaW50byB0aGUgbGlzdCBhZ2Fpbi5cbiAgICBpZiAobGVuZ3RoID49IDIgJiYgZXhwYW5kb1tsZW5ndGggLSAyXSA9PT0gZGVmLmhvc3RCaW5kaW5ncykge1xuICAgICAgICBleHBhbmRvW2xlbmd0aCAtIDFdID0gZXhwYW5kb1tsZW5ndGggLSAxXSArIGhvc3RWYXJzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MsIGhvc3RWYXJzKTtcbiAgICB9XG59XG4vKipcbiAqIE9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzLCB3ZSBuZWVkIHRvIHJlc2VydmUgc3BhY2UgZm9yIGhvc3QgYmluZGluZyB2YWx1ZXNcbiAqIGFmdGVyIGRpcmVjdGl2ZXMgYXJlIG1hdGNoZWQgKHNvIGFsbCBkaXJlY3RpdmVzIGFyZSBzYXZlZCwgdGhlbiBiaW5kaW5ncykuXG4gKiBCZWNhdXNlIHdlIGFyZSB1cGRhdGluZyB0aGUgYmx1ZXByaW50LCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBvbmNlLlxuICovXG5mdW5jdGlvbiBwcmVmaWxsSG9zdFZhcnModFZpZXcsIGxWaWV3LCB0b3RhbEhvc3RWYXJzKSB7XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzLCB0cnVlLCAnU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGZpcnN0IHRlbXBsYXRlIHBhc3MuJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbEhvc3RWYXJzOyBpKyspIHtcbiAgICAgICAgbFZpZXcucHVzaChOT19DSEFOR0UpO1xuICAgICAgICB0Vmlldy5ibHVlcHJpbnQucHVzaChOT19DSEFOR0UpO1xuICAgICAgICB0Vmlldy5kYXRhLnB1c2gobnVsbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgcGVyZm9ybSBjaGFuZ2UgZGV0ZWN0aW9uIG9uIGEgY29tcG9uZW50IChhbmQgcG9zc2libHkgaXRzIHN1Yi1jb21wb25lbnRzKS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gaW4gYSBzeW5jaHJvbm91cyB3YXkgb24gYSBjb21wb25lbnQuIFRoZXJlIHNob3VsZFxuICogYmUgdmVyeSBsaXR0bGUgcmVhc29uIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSBzaW5jZSBhIHByZWZlcnJlZCB3YXkgdG8gZG8gY2hhbmdlXG4gKiBkZXRlY3Rpb24gaXMgdG8ge0BsaW5rIG1hcmtEaXJ0eX0gdGhlIGNvbXBvbmVudCBhbmQgd2FpdCBmb3IgdGhlIHNjaGVkdWxlciB0byBjYWxsIHRoaXMgbWV0aG9kXG4gKiBhdCBzb21lIGZ1dHVyZSBwb2ludCBpbiB0aW1lLiBUaGlzIGlzIGJlY2F1c2UgYSBzaW5nbGUgdXNlciBhY3Rpb24gb2Z0ZW4gcmVzdWx0cyBpbiBtYW55XG4gKiBjb21wb25lbnRzIGJlaW5nIGludmFsaWRhdGVkIGFuZCBjYWxsaW5nIGNoYW5nZSBkZXRlY3Rpb24gb24gZWFjaCBjb21wb25lbnQgc3luY2hyb25vdXNseVxuICogd291bGQgYmUgaW5lZmZpY2llbnQuIEl0IGlzIGJldHRlciB0byB3YWl0IHVudGlsIGFsbCBjb21wb25lbnRzIGFyZSBtYXJrZWQgYXMgZGlydHkgYW5kXG4gKiB0aGVuIHBlcmZvcm0gc2luZ2xlIGNoYW5nZSBkZXRlY3Rpb24gYWNyb3NzIGFsbCBvZiB0aGUgY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB3aGljaCB0aGUgY2hhbmdlIGRldGVjdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9uLlxuICovXG5mdW5jdGlvbiBkZXRlY3RDaGFuZ2VzKGNvbXBvbmVudCkge1xuICAgIHZhciB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50KTtcbiAgICBkZXRlY3RDaGFuZ2VzSW50ZXJuYWwodmlldywgY29tcG9uZW50KTtcbn1cbi8qKlxuICogTWFyayB0aGUgY29tcG9uZW50IGFzIGRpcnR5IChuZWVkaW5nIGNoYW5nZSBkZXRlY3Rpb24pLlxuICpcbiAqIE1hcmtpbmcgYSBjb21wb25lbnQgZGlydHkgd2lsbCBzY2hlZHVsZSBhIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhpc1xuICogY29tcG9uZW50IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4gTWFya2luZyBhbiBhbHJlYWR5IGRpcnR5XG4gKiBjb21wb25lbnQgYXMgZGlydHkgaXMgYSBub29wLiBPbmx5IG9uZSBvdXRzdGFuZGluZyBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBjYW4gYmUgc2NoZWR1bGVkIHBlciBjb21wb25lbnQgdHJlZS4gKFR3byBjb21wb25lbnRzIGJvb3RzdHJhcHBlZCB3aXRoXG4gKiBzZXBhcmF0ZSBgcmVuZGVyQ29tcG9uZW50YCB3aWxsIGhhdmUgc2VwYXJhdGUgc2NoZWR1bGVycylcbiAqXG4gKiBXaGVuIHRoZSByb290IGNvbXBvbmVudCBpcyBib290c3RyYXBwZWQgd2l0aCBgcmVuZGVyQ29tcG9uZW50YCwgYSBzY2hlZHVsZXJcbiAqIGNhbiBiZSBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCB0byBtYXJrIGFzIGRpcnR5LlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gbWFya0RpcnR5KGNvbXBvbmVudCkge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGNvbXBvbmVudCwgJ2NvbXBvbmVudCcpO1xuICAgIHZhciByb290VmlldyA9IG1hcmtWaWV3RGlydHkoZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50KSk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocm9vdFZpZXdbQ09OVEVYVF0sICdyb290Q29udGV4dCBzaG91bGQgYmUgZGVmaW5lZCcpO1xuICAgIHNjaGVkdWxlVGljayhyb290Vmlld1tDT05URVhUXSwgMSAvKiBEZXRlY3RDaGFuZ2VzICovKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gZ2V0TENvbnRhaW5lcih0Tm9kZSwgZW1iZWRkZWRWaWV3KSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGVtYmVkZGVkVmlldyk7XG4gICAgdmFyIGNvbnRhaW5lciA9IGVtYmVkZGVkVmlld1tQQVJFTlRdO1xuICAgIGlmICh0Tm9kZS5pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmlldyBpbnNpZGUgYSBkeW5hbWljIGNvbnRhaW5lci5cbiAgICAgICAgLy8gVGhlIHBhcmVudCBpc24ndCBhbiBMQ29udGFpbmVyIGlmIHRoZSBlbWJlZGRlZCB2aWV3IGhhc24ndCBiZWVuIGF0dGFjaGVkIHlldC5cbiAgICAgICAgcmV0dXJuIGlzTENvbnRhaW5lcihjb250YWluZXIpID8gY29udGFpbmVyIDogbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBpbmxpbmUgdmlldyBub2RlIChlLmcuIGVtYmVkZGVkVmlld1N0YXJ0KVxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH1cbn1cbi8qKlxuICogUmV0cmlldmVzIHJlbmRlciBwYXJlbnQgZm9yIGEgZ2l2ZW4gdmlldy5cbiAqIE1pZ2h0IGJlIG51bGwgaWYgYSB2aWV3IGlzIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYW55IGNvbnRhaW5lci5cbiAqL1xuZnVuY3Rpb24gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KHRWaWV3Tm9kZSwgdmlldykge1xuICAgIHZhciBjb250YWluZXIgPSBnZXRMQ29udGFpbmVyKHRWaWV3Tm9kZSwgdmlldyk7XG4gICAgcmV0dXJuIGNvbnRhaW5lciA/IG5hdGl2ZVBhcmVudE5vZGUodmlld1tSRU5ERVJFUl0sIGNvbnRhaW5lcltOQVRJVkVdKSA6IG51bGw7XG59XG4vKipcbiAqIFN0YWNrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBwcm9qZWN0aW9uIG5vZGVzIGluIHdhbGtUTm9kZVRyZWUuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgY3JlYXRlZCBvdXRzaWRlIG9mIHdhbGtUTm9kZVRyZWUgdG8gYXZvaWQgYWxsb2NhdGluZ1xuICogYSBuZXcgYXJyYXkgZWFjaCB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIEluc3RlYWQgdGhlIGFycmF5IHdpbGwgYmVcbiAqIHJlLXVzZWQgYnkgZWFjaCBpbnZvY2F0aW9uLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzIG5vdCByZWVudHJhbnQuXG4gKi9cbnZhciBwcm9qZWN0aW9uTm9kZVN0YWNrID0gW107XG4vKipcbiAqIFdhbGtzIGEgdHJlZSBvZiBUTm9kZXMsIGFwcGx5aW5nIGEgdHJhbnNmb3JtYXRpb24gb24gdGhlIGVsZW1lbnQgbm9kZXMsIGVpdGhlciBvbmx5IG9uIHRoZSBmaXJzdFxuICogb25lIGZvdW5kLCBvciBvbiBhbGwgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gdmlld1RvV2FsayB0aGUgdmlldyB0byB3YWxrXG4gKiBAcGFyYW0gYWN0aW9uIGlkZW50aWZpZXMgdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gdGhlIGVsZW1lbnRzXG4gKiBAcGFyYW0gcmVuZGVyZXIgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG4gKiBAcGFyYW0gcmVuZGVyUGFyZW50IE9wdGlvbmFsIHRoZSByZW5kZXIgcGFyZW50IG5vZGUgdG8gYmUgc2V0IGluIGFsbCBMQ29udGFpbmVycyBmb3VuZCxcbiAqIHJlcXVpcmVkIGZvciBhY3Rpb24gbW9kZXMgSW5zZXJ0IGFuZCBEZXN0cm95LlxuICogQHBhcmFtIGJlZm9yZU5vZGUgT3B0aW9uYWwgdGhlIG5vZGUgYmVmb3JlIHdoaWNoIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZCwgcmVxdWlyZWQgZm9yIGFjdGlvblxuICogSW5zZXJ0LlxuICovXG5mdW5jdGlvbiB3YWxrVE5vZGVUcmVlKHZpZXdUb1dhbGssIGFjdGlvbiwgcmVuZGVyZXIsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSkge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciByb290VE5vZGUgPSB2aWV3VG9XYWxrW1RWSUVXXS5ub2RlO1xuICAgIHZhciBwcm9qZWN0aW9uTm9kZUluZGV4ID0gLTE7XG4gICAgdmFyIGN1cnJlbnRWaWV3ID0gdmlld1RvV2FsaztcbiAgICB2YXIgdE5vZGUgPSByb290VE5vZGUuY2hpbGQ7XG4gICAgd2hpbGUgKHROb2RlKSB7XG4gICAgICAgIHZhciBuZXh0VE5vZGUgPSBudWxsO1xuICAgICAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovIHx8IHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykge1xuICAgICAgICAgICAgZXhlY3V0ZU5vZGVBY3Rpb24oYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBjdXJyZW50VmlldyksIHROb2RlLCBiZWZvcmVOb2RlKTtcbiAgICAgICAgICAgIHZhciBub2RlT3JDb250YWluZXIgPSBjdXJyZW50Vmlld1t0Tm9kZS5pbmRleF07XG4gICAgICAgICAgICBpZiAoaXNMQ29udGFpbmVyKG5vZGVPckNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaGFzIGFuIExDb250YWluZXIsIGFuZCBpdHMgY29tbWVudCBuZWVkcyB0byBiZSBoYW5kbGVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZU5vZGVBY3Rpb24oYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCBub2RlT3JDb250YWluZXJbTkFUSVZFXSwgdE5vZGUsIGJlZm9yZU5vZGUpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlT3JDb250YWluZXJbVklFV1NdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmlldyA9IG5vZGVPckNvbnRhaW5lcltWSUVXU11bMF07XG4gICAgICAgICAgICAgICAgICAgIG5leHRUTm9kZSA9IGN1cnJlbnRWaWV3W1RWSUVXXS5ub2RlO1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB3YWxrZXIgZW50ZXJzIGEgY29udGFpbmVyLCB0aGVuIHRoZSBiZWZvcmVOb2RlIGhhcyB0byBiZWNvbWUgdGhlIGxvY2FsIG5hdGl2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50IG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUgPSBub2RlT3JDb250YWluZXJbTkFUSVZFXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHtcbiAgICAgICAgICAgIHZhciBsQ29udGFpbmVyID0gY3VycmVudFZpZXdbdE5vZGUuaW5kZXhdO1xuICAgICAgICAgICAgZXhlY3V0ZU5vZGVBY3Rpb24oYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCBsQ29udGFpbmVyW05BVElWRV0sIHROb2RlLCBiZWZvcmVOb2RlKTtcbiAgICAgICAgICAgIGlmIChsQ29udGFpbmVyW1ZJRVdTXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50VmlldyA9IGxDb250YWluZXJbVklFV1NdWzBdO1xuICAgICAgICAgICAgICAgIG5leHRUTm9kZSA9IGN1cnJlbnRWaWV3W1RWSUVXXS5ub2RlO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHdhbGtlciBlbnRlcnMgYSBjb250YWluZXIsIHRoZW4gdGhlIGJlZm9yZU5vZGUgaGFzIHRvIGJlY29tZSB0aGUgbG9jYWwgbmF0aXZlXG4gICAgICAgICAgICAgICAgLy8gY29tbWVudCBub2RlLlxuICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUgPSBsQ29udGFpbmVyW05BVElWRV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodE5vZGUudHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IGZpbmRDb21wb25lbnRWaWV3KGN1cnJlbnRWaWV3KTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRIb3N0ID0gY29tcG9uZW50Vmlld1tUX0hPU1RdO1xuICAgICAgICAgICAgdmFyIGhlYWQgPSBjb21wb25lbnRIb3N0LnByb2plY3Rpb25bdE5vZGUucHJvamVjdGlvbl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGhlYWRfMSA9IF9fdmFsdWVzKGhlYWQpLCBoZWFkXzFfMSA9IGhlYWRfMS5uZXh0KCk7ICFoZWFkXzFfMS5kb25lOyBoZWFkXzFfMSA9IGhlYWRfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVOb2RlID0gaGVhZF8xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTm9kZUFjdGlvbihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIG5hdGl2ZU5vZGUsIHROb2RlLCBiZWZvcmVOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRfMV8xICYmICFoZWFkXzFfMS5kb25lICYmIChfYSA9IGhlYWRfMS5yZXR1cm4pKSBfYS5jYWxsKGhlYWRfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE11c3Qgc3RvcmUgYm90aCB0aGUgVE5vZGUgYW5kIHRoZSB2aWV3IGJlY2F1c2UgdGhpcyBwcm9qZWN0aW9uIG5vZGUgY291bGQgYmUgbmVzdGVkXG4gICAgICAgICAgICAgICAgLy8gZGVlcGx5IGluc2lkZSBlbWJlZGRlZCB2aWV3cywgYW5kIHdlIG5lZWQgdG8gZ2V0IGJhY2sgZG93biB0byB0aGlzIHBhcnRpY3VsYXIgbmVzdGVkXG4gICAgICAgICAgICAgICAgLy8gdmlldy5cbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uTm9kZVN0YWNrWysrcHJvamVjdGlvbk5vZGVJbmRleF0gPSB0Tm9kZTtcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uTm9kZVN0YWNrWysrcHJvamVjdGlvbk5vZGVJbmRleF0gPSBjdXJyZW50VmlldztcbiAgICAgICAgICAgICAgICBpZiAoaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmlldyA9IGNvbXBvbmVudFZpZXdbUEFSRU5UXTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dFROb2RlID0gY3VycmVudFZpZXdbVFZJRVddLmRhdGFbaGVhZC5pbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgVmlld1xuICAgICAgICAgICAgbmV4dFROb2RlID0gdE5vZGUuY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRUTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBsYXN0IG5vZGUgd2FzIHByb2plY3RlZCwgd2UgbmVlZCB0byBnZXQgYmFjayBkb3duIHRvIGl0cyBwcm9qZWN0aW9uIG5vZGVcbiAgICAgICAgICAgIGlmICh0Tm9kZS5wcm9qZWN0aW9uTmV4dCA9PT0gbnVsbCAmJiAodE5vZGUuZmxhZ3MgJiAyIC8qIGlzUHJvamVjdGVkICovKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID0gcHJvamVjdGlvbk5vZGVTdGFja1twcm9qZWN0aW9uTm9kZUluZGV4LS1dO1xuICAgICAgICAgICAgICAgIHROb2RlID0gcHJvamVjdGlvbk5vZGVTdGFja1twcm9qZWN0aW9uTm9kZUluZGV4LS1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHROb2RlLmZsYWdzICYgMiAvKiBpc1Byb2plY3RlZCAqLykge1xuICAgICAgICAgICAgICAgIG5leHRUTm9kZSA9IHROb2RlLnByb2plY3Rpb25OZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7XG4gICAgICAgICAgICAgICAgbmV4dFROb2RlID0gdE5vZGUuY2hpbGQgfHwgdE5vZGUubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRUTm9kZSA9IHROb2RlLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpbmQgdGhlIG5leHQgbm9kZSBpbiB0aGUgVE5vZGUgdHJlZSwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgcGxhY2Ugd2hlcmUgYSBub2RlIGlzXG4gICAgICAgICAgICAgKiBwcm9qZWN0ZWQgKGluIHRoZSBzaGFkb3cgRE9NKSByYXRoZXIgdGhhbiB3aGVyZSBpdCBjb21lcyBmcm9tIChpbiB0aGUgbGlnaHQgRE9NKS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBubyBzaWJsaW5nIG5vZGUsIHRoZW4gaXQgZ29lcyB0byB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBwYXJlbnQgbm9kZS4uLlxuICAgICAgICAgICAgICogdW50aWwgaXQgcmVhY2hlcyByb290Tm9kZSAoYXQgd2hpY2ggcG9pbnQgbnVsbCBpcyByZXR1cm5lZCkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHdoaWxlICghbmV4dFROb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcGFyZW50IGlzIG51bGwsIHdlJ3JlIGNyb3NzaW5nIHRoZSB2aWV3IGJvdW5kYXJ5LCBzbyB3ZSBzaG91bGQgZ2V0IHRoZSBob3N0IFROb2RlLlxuICAgICAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50IHx8IGN1cnJlbnRWaWV3W1RfSE9TVF07XG4gICAgICAgICAgICAgICAgaWYgKHROb2RlID09PSBudWxsIHx8IHROb2RlID09PSByb290VE5vZGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGV4aXRpbmcgYSBjb250YWluZXIsIHRoZSBiZWZvcmVOb2RlIG11c3QgYmUgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID0gZ2V0TFZpZXdQYXJlbnQoY3VycmVudFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gY3VycmVudFZpZXdbdE5vZGUuaW5kZXhdW05BVElWRV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0Tm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIElmIGN1cnJlbnQgbFZpZXcgZG9lc24ndCBoYXZlIG5leHQgcG9pbnRlciwgd2UgdHJ5IHRvIGZpbmQgaXQgYnkgZ29pbmcgdXAgcGFyZW50c1xuICAgICAgICAgICAgICAgICAgICAgKiBjaGFpbiB1bnRpbDpcbiAgICAgICAgICAgICAgICAgICAgICogLSB3ZSBmaW5kIGFuIGxWaWV3IHdpdGggYSBuZXh0IHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICogLSBvciBmaW5kIGEgdE5vZGUgd2l0aCBhIHBhcmVudCB0aGF0IGhhcyBhIG5leHQgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgKiAtIG9yIGZpbmQgYSBsQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAqIC0gb3IgcmVhY2ggcm9vdCBUTm9kZSAoaW4gd2hpY2ggY2FzZSB3ZSBleGl0LCBzaW5jZSB3ZSB0cmF2ZXJzZWQgYWxsIG5vZGVzKVxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFjdXJyZW50Vmlld1tORVhUXSAmJiBjdXJyZW50Vmlld1tQQVJFTlRdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKHROb2RlLnBhcmVudCAmJiB0Tm9kZS5wYXJlbnQubmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Tm9kZSA9PT0gcm9vdFROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID0gY3VycmVudFZpZXdbUEFSRU5UXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xDb250YWluZXIoY3VycmVudFZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdE5vZGUgPSBjdXJyZW50Vmlld1tUX0hPU1RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3ID0gY3VycmVudFZpZXdbUEFSRU5UXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gY3VycmVudFZpZXdbdE5vZGUuaW5kZXhdW05BVElWRV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0Tm9kZSA9IGN1cnJlbnRWaWV3W1RfSE9TVF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWV3W05FWFRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmlldyA9IGN1cnJlbnRWaWV3W05FWFRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFROb2RlID0gY3VycmVudFZpZXdbVF9IT1NUXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUTm9kZSA9IHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyAmJiB0Tm9kZS5jaGlsZCB8fCB0Tm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0VE5vZGUgPSB0Tm9kZS5uZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0Tm9kZSA9IG5leHRUTm9kZTtcbiAgICB9XG59XG4vKipcbiAqIE5PVEU6IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgcG9zc2libGUgYWN0aW9ucyBhcmUgaW5saW5lZCB3aXRoaW4gdGhlIGZ1bmN0aW9uIGluc3RlYWQgb2ZcbiAqIGJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudC5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZU5vZGVBY3Rpb24oYWN0aW9uLCByZW5kZXJlciwgcGFyZW50LCBub2RlLCB0Tm9kZSwgYmVmb3JlTm9kZSkge1xuICAgIGlmIChhY3Rpb24gPT09IDAgLyogSW5zZXJ0ICovKSB7XG4gICAgICAgIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBub2RlLCBiZWZvcmVOb2RlIHx8IG51bGwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhY3Rpb24gPT09IDEgLyogRGV0YWNoICovKSB7XG4gICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIG5vZGUsIGlzQ29tcG9uZW50KHROb2RlKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gMiAvKiBEZXN0cm95ICovKSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95Tm9kZSsrO1xuICAgICAgICByZW5kZXJlci5kZXN0cm95Tm9kZShub2RlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh2YWx1ZSwgcmVuZGVyZXIpIHtcbiAgICByZXR1cm4gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIuY3JlYXRlVGV4dChyZW5kZXJTdHJpbmdpZnkodmFsdWUpKSA6XG4gICAgICAgIHJlbmRlcmVyLmNyZWF0ZVRleHROb2RlKHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuZnVuY3Rpb24gYWRkUmVtb3ZlVmlld0Zyb21Db250YWluZXIodmlld1RvV2FsaywgaW5zZXJ0TW9kZSwgYmVmb3JlTm9kZSkge1xuICAgIHZhciByZW5kZXJQYXJlbnQgPSBnZXRDb250YWluZXJSZW5kZXJQYXJlbnQodmlld1RvV2Fsa1tUVklFV10ubm9kZSwgdmlld1RvV2Fsayk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHZpZXdUb1dhbGtbVFZJRVddLm5vZGUsIDIgLyogVmlldyAqLyk7XG4gICAgaWYgKHJlbmRlclBhcmVudCkge1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSB2aWV3VG9XYWxrW1JFTkRFUkVSXTtcbiAgICAgICAgd2Fsa1ROb2RlVHJlZSh2aWV3VG9XYWxrLCBpbnNlcnRNb2RlID8gMCAvKiBJbnNlcnQgKi8gOiAxIC8qIERldGFjaCAqLywgcmVuZGVyZXIsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSk7XG4gICAgfVxufVxuLyoqXG4gKiBEZXRhY2ggYSBgTFZpZXdgIGZyb20gdGhlIERPTSBieSBkZXRhY2hpbmcgaXRzIG5vZGVzLlxuICpcbiAqIEBwYXJhbSBsVmlldyB0aGUgYExWaWV3YCB0byBiZSBkZXRhY2hlZC5cbiAqL1xuZnVuY3Rpb24gcmVuZGVyRGV0YWNoVmlldyhsVmlldykge1xuICAgIHdhbGtUTm9kZVRyZWUobFZpZXcsIDEgLyogRGV0YWNoICovLCBsVmlld1tSRU5ERVJFUl0sIG51bGwpO1xufVxuLyoqXG4gKiBUcmF2ZXJzZXMgZG93biBhbmQgdXAgdGhlIHRyZWUgb2Ygdmlld3MgYW5kIGNvbnRhaW5lcnMgdG8gcmVtb3ZlIGxpc3RlbmVycyBhbmRcbiAqIGNhbGwgb25EZXN0cm95IGNhbGxiYWNrcy5cbiAqXG4gKiBOb3RlczpcbiAqICAtIEJlY2F1c2UgaXQncyB1c2VkIGZvciBvbkRlc3Ryb3kgY2FsbHMsIGl0IG5lZWRzIHRvIGJlIGJvdHRvbS11cC5cbiAqICAtIE11c3QgcHJvY2VzcyBjb250YWluZXJzIGluc3RlYWQgb2YgdGhlaXIgdmlld3MgdG8gYXZvaWQgc3BsaWNpbmdcbiAqICB3aGVuIHZpZXdzIGFyZSBkZXN0cm95ZWQgYW5kIHJlLWFkZGVkLlxuICogIC0gVXNpbmcgYSB3aGlsZSBsb29wIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiByZWN1cnNpb25cbiAqICAtIERlc3Ryb3kgb25seSBjYWxsZWQgb24gbW92ZW1lbnQgdG8gc2libGluZyBvciBtb3ZlbWVudCB0byBwYXJlbnQgKGxhdGVyYWxseSBvciB1cClcbiAqXG4gKiAgQHBhcmFtIHJvb3RWaWV3IFRoZSB2aWV3IHRvIGRlc3Ryb3lcbiAqL1xuZnVuY3Rpb24gZGVzdHJveVZpZXdUcmVlKHJvb3RWaWV3KSB7XG4gICAgLy8gSWYgdGhlIHZpZXcgaGFzIG5vIGNoaWxkcmVuLCB3ZSBjYW4gY2xlYW4gaXQgdXAgYW5kIHJldHVybiBlYXJseS5cbiAgICB2YXIgbFZpZXdPckxDb250YWluZXIgPSByb290Vmlld1tDSElMRF9IRUFEXTtcbiAgICBpZiAoIWxWaWV3T3JMQ29udGFpbmVyKSB7XG4gICAgICAgIHJldHVybiBjbGVhblVwVmlldyhyb290Vmlldyk7XG4gICAgfVxuICAgIHdoaWxlIChsVmlld09yTENvbnRhaW5lcikge1xuICAgICAgICB2YXIgbmV4dCA9IG51bGw7XG4gICAgICAgIGlmIChpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSkge1xuICAgICAgICAgICAgLy8gSWYgTFZpZXcsIHRyYXZlcnNlIGRvd24gdG8gY2hpbGQuXG4gICAgICAgICAgICBuZXh0ID0gbFZpZXdPckxDb250YWluZXJbQ0hJTERfSEVBRF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihsVmlld09yTENvbnRhaW5lcik7XG4gICAgICAgICAgICAvLyBJZiBjb250YWluZXIsIHRyYXZlcnNlIGRvd24gdG8gaXRzIGZpcnN0IExWaWV3LlxuICAgICAgICAgICAgdmFyIHZpZXdzID0gbFZpZXdPckxDb250YWluZXJbVklFV1NdO1xuICAgICAgICAgICAgaWYgKHZpZXdzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgbmV4dCA9IHZpZXdzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV4dCkge1xuICAgICAgICAgICAgLy8gT25seSBjbGVhbiB1cCB2aWV3IHdoZW4gbW92aW5nIHRvIHRoZSBzaWRlIG9yIHVwLCBhcyBkZXN0cm95IGhvb2tzXG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyIGZyb20gdGhlIGJvdHRvbSB1cC5cbiAgICAgICAgICAgIHdoaWxlIChsVmlld09yTENvbnRhaW5lciAmJiAhbFZpZXdPckxDb250YWluZXJbTkVYVF0gJiYgbFZpZXdPckxDb250YWluZXIgIT09IHJvb3RWaWV3KSB7XG4gICAgICAgICAgICAgICAgY2xlYW5VcFZpZXcobFZpZXdPckxDb250YWluZXIpO1xuICAgICAgICAgICAgICAgIGxWaWV3T3JMQ29udGFpbmVyID0gZ2V0UGFyZW50U3RhdGUobFZpZXdPckxDb250YWluZXIsIHJvb3RWaWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFuVXBWaWV3KGxWaWV3T3JMQ29udGFpbmVyIHx8IHJvb3RWaWV3KTtcbiAgICAgICAgICAgIG5leHQgPSBsVmlld09yTENvbnRhaW5lciAmJiBsVmlld09yTENvbnRhaW5lcltORVhUXTtcbiAgICAgICAgfVxuICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IG5leHQ7XG4gICAgfVxufVxuLyoqXG4gKiBJbnNlcnRzIGEgdmlldyBpbnRvIGEgY29udGFpbmVyLlxuICpcbiAqIFRoaXMgYWRkcyB0aGUgdmlldyB0byB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzIGluIHRoZSBjb3JyZWN0XG4gKiBwb3NpdGlvbi4gSXQgYWxzbyBhZGRzIHRoZSB2aWV3J3MgZWxlbWVudHMgdG8gdGhlIERPTSBpZiB0aGUgY29udGFpbmVyIGlzbid0IGFcbiAqIHJvb3Qgbm9kZSBvZiBhbm90aGVyIHZpZXcgKGluIHRoYXQgY2FzZSwgdGhlIHZpZXcncyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHdoZW5cbiAqIHRoZSBjb250YWluZXIncyBwYXJlbnQgdmlldyBpcyBhZGRlZCBsYXRlcikuXG4gKlxuICogQHBhcmFtIGxWaWV3IFRoZSB2aWV3IHRvIGluc2VydFxuICogQHBhcmFtIGxDb250YWluZXIgVGhlIGNvbnRhaW5lciBpbnRvIHdoaWNoIHRoZSB2aWV3IHNob3VsZCBiZSBpbnNlcnRlZFxuICogQHBhcmFtIGluZGV4IFdoaWNoIGluZGV4IGluIHRoZSBjb250YWluZXIgdG8gaW5zZXJ0IHRoZSBjaGlsZCB2aWV3IGludG9cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0VmlldyhsVmlldywgbENvbnRhaW5lciwgaW5kZXgpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGxDb250YWluZXIpO1xuICAgIHZhciB2aWV3cyA9IGxDb250YWluZXJbVklFV1NdO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHZpZXdzLCAnQ29udGFpbmVyIG11c3QgaGF2ZSB2aWV3cycpO1xuICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyB2aWV3LCB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgY2hpbGRyZW4uXG4gICAgICAgIHZpZXdzW2luZGV4IC0gMV1bTkVYVF0gPSBsVmlldztcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgdmlld3MubGVuZ3RoKSB7XG4gICAgICAgIGxWaWV3W05FWFRdID0gdmlld3NbaW5kZXhdO1xuICAgICAgICB2aWV3cy5zcGxpY2UoaW5kZXgsIDAsIGxWaWV3KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXdzLnB1c2gobFZpZXcpO1xuICAgICAgICBsVmlld1tORVhUXSA9IG51bGw7XG4gICAgfVxuICAgIGxWaWV3W1BBUkVOVF0gPSBsQ29udGFpbmVyO1xuICAgIC8vIE5vdGlmeSBxdWVyeSB0aGF0IGEgbmV3IHZpZXcgaGFzIGJlZW4gYWRkZWRcbiAgICBpZiAobFZpZXdbUVVFUklFU10pIHtcbiAgICAgICAgbFZpZXdbUVVFUklFU10uaW5zZXJ0VmlldyhpbmRleCk7XG4gICAgfVxuICAgIC8vIFNldHMgdGhlIGF0dGFjaGVkIGZsYWdcbiAgICBsVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovO1xufVxuLyoqXG4gKiBEZXRhY2hlcyBhIHZpZXcgZnJvbSBhIGNvbnRhaW5lci5cbiAqXG4gKiBUaGlzIG1ldGhvZCBzcGxpY2VzIHRoZSB2aWV3IGZyb20gdGhlIGNvbnRhaW5lcidzIGFycmF5IG9mIGFjdGl2ZSB2aWV3cy4gSXQgYWxzb1xuICogcmVtb3ZlcyB0aGUgdmlldydzIGVsZW1lbnRzIGZyb20gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0gbENvbnRhaW5lciBUaGUgY29udGFpbmVyIGZyb20gd2hpY2ggdG8gZGV0YWNoIGEgdmlld1xuICogQHBhcmFtIHJlbW92ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmlldyB0byBkZXRhY2hcbiAqIEByZXR1cm5zIERldGFjaGVkIExWaWV3IGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KSB7XG4gICAgdmFyIHZpZXdzID0gbENvbnRhaW5lcltWSUVXU107XG4gICAgdmFyIHZpZXdUb0RldGFjaCA9IHZpZXdzW3JlbW92ZUluZGV4XTtcbiAgICBpZiAodmlld1RvRGV0YWNoKSB7XG4gICAgICAgIGlmIChyZW1vdmVJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHZpZXdzW3JlbW92ZUluZGV4IC0gMV1bTkVYVF0gPSB2aWV3VG9EZXRhY2hbTkVYVF07XG4gICAgICAgIH1cbiAgICAgICAgdmlld3Muc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICAgICAgYWRkUmVtb3ZlVmlld0Zyb21Db250YWluZXIodmlld1RvRGV0YWNoLCBmYWxzZSk7XG4gICAgICAgIGlmICgodmlld1RvRGV0YWNoW0ZMQUdTXSAmIDEyOCAvKiBBdHRhY2hlZCAqLykgJiZcbiAgICAgICAgICAgICEodmlld1RvRGV0YWNoW0ZMQUdTXSAmIDI1NiAvKiBEZXN0cm95ZWQgKi8pICYmIHZpZXdUb0RldGFjaFtRVUVSSUVTXSkge1xuICAgICAgICAgICAgdmlld1RvRGV0YWNoW1FVRVJJRVNdLnJlbW92ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICB2aWV3VG9EZXRhY2hbUEFSRU5UXSA9IG51bGw7XG4gICAgICAgIHZpZXdUb0RldGFjaFtORVhUXSA9IG51bGw7XG4gICAgICAgIC8vIFVuc2V0cyB0aGUgYXR0YWNoZWQgZmxhZ1xuICAgICAgICB2aWV3VG9EZXRhY2hbRkxBR1NdICY9IH4xMjggLyogQXR0YWNoZWQgKi87XG4gICAgfVxuICAgIHJldHVybiB2aWV3VG9EZXRhY2g7XG59XG4vKipcbiAqIFJlbW92ZXMgYSB2aWV3IGZyb20gYSBjb250YWluZXIsIGkuZS4gZGV0YWNoZXMgaXQgYW5kIHRoZW4gZGVzdHJveXMgdGhlIHVuZGVybHlpbmcgTFZpZXcuXG4gKlxuICogQHBhcmFtIGxDb250YWluZXIgVGhlIGNvbnRhaW5lciBmcm9tIHdoaWNoIHRvIHJlbW92ZSBhIHZpZXdcbiAqIEBwYXJhbSByZW1vdmVJbmRleCBUaGUgaW5kZXggb2YgdGhlIHZpZXcgdG8gcmVtb3ZlXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVZpZXcobENvbnRhaW5lciwgcmVtb3ZlSW5kZXgpIHtcbiAgICB2YXIgdmlldyA9IGxDb250YWluZXJbVklFV1NdW3JlbW92ZUluZGV4XTtcbiAgICBpZiAodmlldykge1xuICAgICAgICBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KTtcbiAgICAgICAgZGVzdHJveUxWaWV3KHZpZXcpO1xuICAgIH1cbn1cbi8qKlxuICogQSBzdGFuZGFsb25lIGZ1bmN0aW9uIHdoaWNoIGRlc3Ryb3lzIGFuIExWaWV3LFxuICogY29uZHVjdGluZyBjbGVhbnVwIChlLmcuIHJlbW92aW5nIGxpc3RlbmVycywgY2FsbGluZyBvbkRlc3Ryb3lzKS5cbiAqXG4gKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0byBiZSBkZXN0cm95ZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3lMVmlldyh2aWV3KSB7XG4gICAgaWYgKCEodmlld1tGTEFHU10gJiAyNTYgLyogRGVzdHJveWVkICovKSkge1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSB2aWV3W1JFTkRFUkVSXTtcbiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSAmJiByZW5kZXJlci5kZXN0cm95Tm9kZSkge1xuICAgICAgICAgICAgd2Fsa1ROb2RlVHJlZSh2aWV3LCAyIC8qIERlc3Ryb3kgKi8sIHJlbmRlcmVyLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0cm95Vmlld1RyZWUodmlldyk7XG4gICAgfVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIExWaWV3T3JMQ29udGFpbmVyIHRvIGp1bXAgdG8gd2hlbiB0cmF2ZXJzaW5nIGJhY2sgdXAgdGhlXG4gKiB0cmVlIGluIGRlc3Ryb3lWaWV3VHJlZS5cbiAqXG4gKiBOb3JtYWxseSwgdGhlIHZpZXcncyBwYXJlbnQgTFZpZXcgc2hvdWxkIGJlIGNoZWNrZWQsIGJ1dCBpbiB0aGUgY2FzZSBvZlxuICogZW1iZWRkZWQgdmlld3MsIHRoZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSB2aWV3IG5vZGUncyBwYXJlbnQsIGJ1dCBub3QgdGhlXG4gKiBMVmlldydzIHBhcmVudCkgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgYSBwb3NzaWJsZSBuZXh0IHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBsVmlld09yTENvbnRhaW5lciBUaGUgTFZpZXdPckxDb250YWluZXIgZm9yIHdoaWNoIHdlIG5lZWQgYSBwYXJlbnQgc3RhdGVcbiAqIEBwYXJhbSByb290VmlldyBUaGUgcm9vdFZpZXcsIHNvIHdlIGRvbid0IHByb3BhZ2F0ZSB0b28gZmFyIHVwIHRoZSB2aWV3IHRyZWVcbiAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IHBhcmVudCBMVmlld09yTENvbnRhaW5lclxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnRTdGF0ZShsVmlld09yTENvbnRhaW5lciwgcm9vdFZpZXcpIHtcbiAgICB2YXIgdE5vZGU7XG4gICAgaWYgKGlzTFZpZXcobFZpZXdPckxDb250YWluZXIpICYmICh0Tm9kZSA9IGxWaWV3T3JMQ29udGFpbmVyW1RfSE9TVF0pICYmXG4gICAgICAgIHROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykge1xuICAgICAgICAvLyBpZiBpdCdzIGFuIGVtYmVkZGVkIHZpZXcsIHRoZSBzdGF0ZSBuZWVkcyB0byBnbyB1cCB0byB0aGUgY29udGFpbmVyLCBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBjb250YWluZXIgaGFzIGEgbmV4dFxuICAgICAgICByZXR1cm4gZ2V0TENvbnRhaW5lcih0Tm9kZSwgbFZpZXdPckxDb250YWluZXIpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlLCB1c2UgcGFyZW50IHZpZXcgZm9yIGNvbnRhaW5lcnMgb3IgY29tcG9uZW50IHZpZXdzXG4gICAgICAgIHJldHVybiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdID09PSByb290VmlldyA/IG51bGwgOiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdO1xuICAgIH1cbn1cbi8qKlxuICogQ2FsbHMgb25EZXN0cm95cyBob29rcyBmb3IgYWxsIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGluIGEgZ2l2ZW4gdmlldyBhbmQgdGhlbiByZW1vdmVzIGFsbFxuICogbGlzdGVuZXJzLiBMaXN0ZW5lcnMgYXJlIHJlbW92ZWQgYXMgdGhlIGxhc3Qgc3RlcCBzbyBldmVudHMgZGVsaXZlcmVkIGluIHRoZSBvbkRlc3Ryb3lzIGhvb2tzXG4gKiBjYW4gYmUgcHJvcGFnYXRlZCB0byBAT3V0cHV0IGxpc3RlbmVycy5cbiAqXG4gKiBAcGFyYW0gdmlldyBUaGUgTFZpZXcgdG8gY2xlYW4gdXBcbiAqL1xuZnVuY3Rpb24gY2xlYW5VcFZpZXcodmlldykge1xuICAgIGlmIChpc0xWaWV3KHZpZXcpICYmICEodmlld1tGTEFHU10gJiAyNTYgLyogRGVzdHJveWVkICovKSkge1xuICAgICAgICAvLyBVc3VhbGx5IHRoZSBBdHRhY2hlZCBmbGFnIGlzIHJlbW92ZWQgd2hlbiB0aGUgdmlldyBpcyBkZXRhY2hlZCBmcm9tIGl0cyBwYXJlbnQsIGhvd2V2ZXJcbiAgICAgICAgLy8gaWYgaXQncyBhIHJvb3QgdmlldywgdGhlIGZsYWcgd29uJ3QgYmUgdW5zZXQgaGVuY2Ugd2h5IHdlJ3JlIGFsc28gcmVtb3Zpbmcgb24gZGVzdHJveS5cbiAgICAgICAgdmlld1tGTEFHU10gJj0gfjEyOCAvKiBBdHRhY2hlZCAqLztcbiAgICAgICAgLy8gTWFyayB0aGUgTFZpZXcgYXMgZGVzdHJveWVkICpiZWZvcmUqIGV4ZWN1dGluZyB0aGUgb25EZXN0cm95IGhvb2tzLiBBbiBvbkRlc3Ryb3kgaG9va1xuICAgICAgICAvLyBydW5zIGFyYml0cmFyeSB1c2VyIGNvZGUsIHdoaWNoIGNvdWxkIGluY2x1ZGUgaXRzIG93biBgdmlld1JlZi5kZXN0cm95KClgIChvciBzaW1pbGFyKS4gSWZcbiAgICAgICAgLy8gV2UgZG9uJ3QgZmxhZyB0aGUgdmlldyBhcyBkZXN0cm95ZWQgYmVmb3JlIHRoZSBob29rcywgdGhpcyBjb3VsZCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuXG4gICAgICAgIC8vIFRoaXMgYWxzbyBhbGlnbnMgd2l0aCB0aGUgVmlld0VuZ2luZSBiZWhhdmlvci4gSXQgYWxzbyBtZWFucyB0aGF0IHRoZSBvbkRlc3Ryb3kgaG9vayBpc1xuICAgICAgICAvLyByZWFsbHkgbW9yZSBvZiBhbiBcImFmdGVyRGVzdHJveVwiIGhvb2sgaWYgeW91IHRoaW5rIGFib3V0IGl0LlxuICAgICAgICB2aWV3W0ZMQUdTXSB8PSAyNTYgLyogRGVzdHJveWVkICovO1xuICAgICAgICBleGVjdXRlT25EZXN0cm95cyh2aWV3KTtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKHZpZXcpO1xuICAgICAgICB2YXIgaG9zdFROb2RlID0gdmlld1tUX0hPU1RdO1xuICAgICAgICAvLyBGb3IgY29tcG9uZW50IHZpZXdzIG9ubHksIHRoZSBsb2NhbCByZW5kZXJlciBpcyBkZXN0cm95ZWQgYXMgY2xlYW4gdXAgdGltZS5cbiAgICAgICAgaWYgKGhvc3RUTm9kZSAmJiBob3N0VE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovICYmIGlzUHJvY2VkdXJhbFJlbmRlcmVyKHZpZXdbUkVOREVSRVJdKSkge1xuICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckRlc3Ryb3krKztcbiAgICAgICAgICAgIHZpZXdbUkVOREVSRVJdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgZW1iZWRkZWQgdmlld3Mgc3RpbGwgYXR0YWNoZWQgdG8gYSBjb250YWluZXI6IHJlbW92ZSBxdWVyeSByZXN1bHQgZnJvbSB0aGlzIHZpZXcuXG4gICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcih2aWV3KSAmJiB2aWV3W1FVRVJJRVNdKSB7XG4gICAgICAgICAgICB2aWV3W1FVRVJJRVNdLnJlbW92ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKiBSZW1vdmVzIGxpc3RlbmVycyBhbmQgdW5zdWJzY3JpYmVzIGZyb20gb3V0cHV0IHN1YnNjcmlwdGlvbnMgKi9cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycyhsVmlldykge1xuICAgIHZhciB0Q2xlYW51cCA9IGxWaWV3W1RWSUVXXS5jbGVhbnVwO1xuICAgIGlmICh0Q2xlYW51cCAhPSBudWxsKSB7XG4gICAgICAgIHZhciBsQ2xlYW51cCA9IGxWaWV3W0NMRUFOVVBdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0Q2xlYW51cFtpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmF0aXZlIERPTSBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIHZhciBpZHhPclRhcmdldEdldHRlciA9IHRDbGVhbnVwW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdHlwZW9mIGlkeE9yVGFyZ2V0R2V0dGVyID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICAgICAgaWR4T3JUYXJnZXRHZXR0ZXIobFZpZXcpIDpcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwUk5vZGUobFZpZXdbaWR4T3JUYXJnZXRHZXR0ZXJdKTtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBsQ2xlYW51cFt0Q2xlYW51cFtpICsgMl1dO1xuICAgICAgICAgICAgICAgIHZhciB1c2VDYXB0dXJlT3JTdWJJZHggPSB0Q2xlYW51cFtpICsgM107XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VDYXB0dXJlT3JTdWJJZHggPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgRE9NIGxpc3RlbmVyIHJlZ2lzdGVyZWQgd2l0aCBSZW5kZXJlcjNcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodENsZWFudXBbaV0sIGxpc3RlbmVyLCB1c2VDYXB0dXJlT3JTdWJJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUNhcHR1cmVPclN1YklkeCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBsQ2xlYW51cFt1c2VDYXB0dXJlT3JTdWJJZHhdKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGxDbGVhbnVwWy11c2VDYXB0dXJlT3JTdWJJZHhdLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNsZWFudXAgZnVuY3Rpb24gdGhhdCBpcyBncm91cGVkIHdpdGggdGhlIGluZGV4IG9mIGl0cyBjb250ZXh0XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBsQ2xlYW51cFt0Q2xlYW51cFtpICsgMV1dO1xuICAgICAgICAgICAgICAgIHRDbGVhbnVwW2ldLmNhbGwoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbFZpZXdbQ0xFQU5VUF0gPSBudWxsO1xuICAgIH1cbn1cbi8qKiBDYWxscyBvbkRlc3Ryb3kgaG9va3MgZm9yIHRoaXMgdmlldyAqL1xuZnVuY3Rpb24gZXhlY3V0ZU9uRGVzdHJveXModmlldykge1xuICAgIHZhciB0VmlldyA9IHZpZXdbVFZJRVddO1xuICAgIHZhciBkZXN0cm95SG9va3M7XG4gICAgaWYgKHRWaWV3ICE9IG51bGwgJiYgKGRlc3Ryb3lIb29rcyA9IHRWaWV3LmRlc3Ryb3lIb29rcykgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlc3Ryb3lIb29rcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB2aWV3W2Rlc3Ryb3lIb29rc1tpXV07XG4gICAgICAgICAgICAvLyBPbmx5IGNhbGwgdGhlIGRlc3Ryb3kgaG9vayBpZiB0aGUgY29udGV4dCBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gICAgICAgICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgTm9kZUluamVjdG9yRmFjdG9yeSkpIHtcbiAgICAgICAgICAgICAgICBkZXN0cm95SG9va3NbaSArIDFdLmNhbGwoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBuYXRpdmUgZWxlbWVudCBpZiBhIG5vZGUgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGdpdmVuIHBhcmVudC5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgd2h5IHdlIG1heSBub3QgYmUgYWJsZSB0byBpbnNlcnQgYSBlbGVtZW50IGltbWVkaWF0ZWx5LlxuICogLSBQcm9qZWN0aW9uOiBXaGVuIGNyZWF0aW5nIGEgY2hpbGQgY29udGVudCBlbGVtZW50IG9mIGEgY29tcG9uZW50LCB3ZSBoYXZlIHRvIHNraXAgdGhlXG4gKiAgIGluc2VydGlvbiBiZWNhdXNlIHRoZSBjb250ZW50IG9mIGEgY29tcG9uZW50IHdpbGwgYmUgcHJvamVjdGVkLlxuICogICBgPGNvbXBvbmVudD48Y29udGVudD5kZWxheWVkIGR1ZSB0byBwcm9qZWN0aW9uPC9jb250ZW50PjwvY29tcG9uZW50PmBcbiAqIC0gUGFyZW50IGNvbnRhaW5lciBpcyBkaXNjb25uZWN0ZWQ6IFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFyZSBpbnNlcnRpbmcgYSB2aWV3IGludG9cbiAqICAgcGFyZW50IGNvbnRhaW5lciwgd2hpY2ggaXRzZWxmIGlzIGRpc2Nvbm5lY3RlZC4gRm9yIGV4YW1wbGUgdGhlIHBhcmVudCBjb250YWluZXIgaXMgcGFydFxuICogICBvZiBhIFZpZXcgd2hpY2ggaGFzIG5vdCBiZSBpbnNlcnRlZCBvciBpcyBtYWRlIGZvciBwcm9qZWN0aW9uIGJ1dCBoYXMgbm90IGJlZW4gaW5zZXJ0ZWRcbiAqICAgaW50byBkZXN0aW5hdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVuZGVyUGFyZW50KHROb2RlLCBjdXJyZW50Vmlldykge1xuICAgIC8vIE5vZGVzIG9mIHRoZSB0b3AtbW9zdCB2aWV3IGNhbiBiZSBpbnNlcnRlZCBlYWdlcmx5LlxuICAgIGlmIChpc1Jvb3RWaWV3KGN1cnJlbnRWaWV3KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlUGFyZW50Tm9kZShjdXJyZW50Vmlld1tSRU5ERVJFUl0sIGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGN1cnJlbnRWaWV3KSk7XG4gICAgfVxuICAgIC8vIFNraXAgb3ZlciBlbGVtZW50IGFuZCBJQ1UgY29udGFpbmVycyBhcyB0aG9zZSBhcmUgcmVwcmVzZW50ZWQgYnkgYSBjb21tZW50IG5vZGUgYW5kXG4gICAgLy8gY2FuJ3QgYmUgdXNlZCBhcyBhIHJlbmRlciBwYXJlbnQuXG4gICAgdmFyIHBhcmVudCA9IGdldEhpZ2hlc3RFbGVtZW50T3JJQ1VDb250YWluZXIodE5vZGUpLnBhcmVudDtcbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzIG51bGwsIHRoZW4gd2UgYXJlIGluc2VydGluZyBhY3Jvc3Mgdmlld3M6IGVpdGhlciBpbnRvIGFuIGVtYmVkZGVkIHZpZXcgb3IgYVxuICAgIC8vIGNvbXBvbmVudCB2aWV3LlxuICAgIGlmIChwYXJlbnQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgaG9zdFROb2RlID0gY3VycmVudFZpZXdbVF9IT1NUXTtcbiAgICAgICAgaWYgKGhvc3RUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHtcbiAgICAgICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgYSByb290IGVsZW1lbnQgb2YgYW4gZW1iZWRkZWQgdmlldyBXZSBtaWdodCBkZWxheSBpbnNlcnRpb24gb2YgY2hpbGRyZW5cbiAgICAgICAgICAgIC8vIGZvciBhIGdpdmVuIHZpZXcgaWYgaXQgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1pZ2h0IGhhcHBlbiBmb3IgMiBtYWluIHJlYXNvbnM6XG4gICAgICAgICAgICAvLyAtIHZpZXcgaXMgbm90IGluc2VydGVkIGludG8gYW55IGNvbnRhaW5lcih2aWV3IHdhcyBjcmVhdGVkIGJ1dCBub3QgaW5zZXJ0ZWQgeWV0KVxuICAgICAgICAgICAgLy8gLSB2aWV3IGlzIGluc2VydGVkIGludG8gYSBjb250YWluZXIgYnV0IHRoZSBjb250YWluZXIgaXRzZWxmIGlzIG5vdCBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICAgICAgICAgIC8vIChjb250YWluZXIgbWlnaHQgYmUgcGFydCBvZiBwcm9qZWN0aW9uIG9yIGNoaWxkIG9mIGEgdmlldyB0aGF0IGlzIG5vdCBpbnNlcnRlZCB5ZXQpLlxuICAgICAgICAgICAgLy8gSW4gb3RoZXIgd29yZHMgd2UgY2FuIGluc2VydCBjaGlsZHJlbiBvZiBhIGdpdmVuIHZpZXcgaWYgdGhpcyB2aWV3IHdhcyBpbnNlcnRlZCBpbnRvIGFcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lciBhbmQgdGhlIGNvbnRhaW5lciBpdHNlbGYgaGFzIGl0cyByZW5kZXIgcGFyZW50IGRldGVybWluZWQuXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KGhvc3RUTm9kZSwgY3VycmVudFZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHJvb3QgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHZpZXcgaW50byB0aGUgY29tcG9uZW50IGhvc3QgZWxlbWVudCBhbmRcbiAgICAgICAgICAgIC8vIGl0IHNob3VsZCBhbHdheXMgYmUgZWFnZXIuXG4gICAgICAgICAgICByZXR1cm4gZ2V0SG9zdE5hdGl2ZShjdXJyZW50Vmlldyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwYXJlbnQsIDMgLyogRWxlbWVudCAqLyk7XG4gICAgICAgIGlmIChwYXJlbnQuZmxhZ3MgJiAxIC8qIGlzQ29tcG9uZW50ICovKSB7XG4gICAgICAgICAgICB2YXIgdERhdGEgPSBjdXJyZW50Vmlld1tUVklFV10uZGF0YTtcbiAgICAgICAgICAgIHZhciB0Tm9kZV8xID0gdERhdGFbcGFyZW50LmluZGV4XTtcbiAgICAgICAgICAgIHZhciBlbmNhcHN1bGF0aW9uID0gdERhdGFbdE5vZGVfMS5kaXJlY3RpdmVTdGFydF0uZW5jYXBzdWxhdGlvbjtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGdvdCBhIHBhcmVudCB3aGljaCBpcyBhbiBlbGVtZW50IGluIHRoZSBjdXJyZW50IHZpZXcuIFdlIGp1c3QgbmVlZCB0byB2ZXJpZnkgaWYgdGhlXG4gICAgICAgICAgICAvLyBwYXJlbnQgZWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQuIENvbXBvbmVudCdzIGNvbnRlbnQgbm9kZXMgYXJlIG5vdCBpbnNlcnRlZCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IHdpbGwgYmUgcHJvamVjdGVkLCBhbmQgc28gZG9pbmcgaW5zZXJ0IGF0IHRoaXMgcG9pbnQgd291bGQgYmUgd2FzdGVmdWwuXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgcHJvamVjdGlvbiB3b3VsZCB0aGVuIG1vdmUgaXQgdG8gaXRzIGZpbmFsIGRlc3RpbmF0aW9uLiBOb3RlIHRoYXQgd2UgY2FuJ3RcbiAgICAgICAgICAgIC8vIG1ha2UgdGhpcyBhc3N1bXB0aW9uIHdoZW4gdXNpbmcgdGhlIFNoYWRvdyBET00sIGJlY2F1c2UgdGhlIG5hdGl2ZSBwcm9qZWN0aW9uIHBsYWNlaG9sZGVyc1xuICAgICAgICAgICAgLy8gKDxjb250ZW50PiBvciA8c2xvdD4pIGhhdmUgdG8gYmUgaW4gcGxhY2UgYXMgZWxlbWVudHMgYXJlIGJlaW5nIGluc2VydGVkLlxuICAgICAgICAgICAgaWYgKGVuY2Fwc3VsYXRpb24gIT09IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSAmJlxuICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24gIT09IFZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXROYXRpdmVCeVROb2RlKHBhcmVudCwgY3VycmVudFZpZXcpO1xuICAgIH1cbn1cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGhvc3QgZWxlbWVudCBmb3IgYSBnaXZlbiB2aWV3LiBXaWxsIHJldHVybiBudWxsIGlmIHRoZSBjdXJyZW50IHZpZXcgZG9lcyBub3QgaGF2ZVxuICogYSBob3N0IGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3ROYXRpdmUoY3VycmVudFZpZXcpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcoY3VycmVudFZpZXcpO1xuICAgIHZhciBob3N0VE5vZGUgPSBjdXJyZW50Vmlld1tUX0hPU1RdO1xuICAgIHJldHVybiBob3N0VE5vZGUgJiYgaG9zdFROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyA/XG4gICAgICAgIGdldE5hdGl2ZUJ5VE5vZGUoaG9zdFROb2RlLCBnZXRMVmlld1BhcmVudChjdXJyZW50VmlldykpIDpcbiAgICAgICAgbnVsbDtcbn1cbi8qKlxuICogSW5zZXJ0cyBhIG5hdGl2ZSBub2RlIGJlZm9yZSBhbm90aGVyIG5hdGl2ZSBub2RlIGZvciBhIGdpdmVuIHBhcmVudCB1c2luZyB7QGxpbmsgUmVuZGVyZXIzfS5cbiAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBuYXRpdmUgbm9kZXMgd2VyZSBkZXRlcm1pbmVkIC0gaXQgYWJzdHJhY3RzIGFuXG4gKiBhY3R1YWwgcmVuZGVyZXIgYmVpbmcgdXNlZC5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKSB7XG4gICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkge1xuICAgICAgICByZW5kZXJlci5pbnNlcnRCZWZvcmUocGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVOb2RlLCB0cnVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBuYXRpdmVBcHBlbmRDaGlsZChyZW5kZXJlciwgcGFyZW50LCBjaGlsZCkge1xuICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHtcbiAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50LCBjaGlsZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG5hdGl2ZUFwcGVuZE9ySW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKSB7XG4gICAgaWYgKGJlZm9yZU5vZGUpIHtcbiAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5hdGl2ZUFwcGVuZENoaWxkKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkKTtcbiAgICB9XG59XG4vKiogUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgRE9NIGdpdmVuIGl0cyBuYXRpdmUgcGFyZW50LiAqL1xuZnVuY3Rpb24gbmF0aXZlUmVtb3ZlQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpIHtcbiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBuYXRpdmUgcGFyZW50IG9mIGEgZ2l2ZW4gbmF0aXZlIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVBhcmVudE5vZGUocmVuZGVyZXIsIG5vZGUpIHtcbiAgICByZXR1cm4gKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/IHJlbmRlcmVyLnBhcmVudE5vZGUobm9kZSkgOiBub2RlLnBhcmVudE5vZGUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgbmF0aXZlIHNpYmxpbmcgb2YgYSBnaXZlbiBuYXRpdmUgbm9kZS5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIG5vZGUpIHtcbiAgICByZXR1cm4gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIubmV4dFNpYmxpbmcobm9kZSkgOiBub2RlLm5leHRTaWJsaW5nO1xufVxuLyoqXG4gKiBGaW5kcyBhIG5hdGl2ZSBcImFuY2hvclwiIG5vZGUgZm9yIGNhc2VzIHdoZXJlIHdlIGNhbid0IGFwcGVuZCBhIG5hdGl2ZSBjaGlsZCBkaXJlY3RseVxuICogKGBhcHBlbmRDaGlsZGApIGFuZCBuZWVkIHRvIHVzZSBhIHJlZmVyZW5jZSAoYW5jaG9yKSBub2RlIGZvciB0aGUgYGluc2VydEJlZm9yZWAgb3BlcmF0aW9uLlxuICogQHBhcmFtIHBhcmVudFROb2RlXG4gKiBAcGFyYW0gbFZpZXdcbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlQW5jaG9yTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpIHtcbiAgICBpZiAocGFyZW50VE5vZGUudHlwZSA9PT0gMiAvKiBWaWV3ICovKSB7XG4gICAgICAgIHZhciBsQ29udGFpbmVyID0gZ2V0TENvbnRhaW5lcihwYXJlbnRUTm9kZSwgbFZpZXcpO1xuICAgICAgICB2YXIgdmlld3MgPSBsQ29udGFpbmVyW1ZJRVdTXTtcbiAgICAgICAgdmFyIGluZGV4ID0gdmlld3MuaW5kZXhPZihsVmlldyk7XG4gICAgICAgIHJldHVybiBnZXRCZWZvcmVOb2RlRm9yVmlldyhpbmRleCwgdmlld3MsIGxDb250YWluZXJbTkFUSVZFXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHBhcmVudFROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fFxuICAgICAgICBwYXJlbnRUTm9kZS50eXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykge1xuICAgICAgICByZXR1cm4gZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQXBwZW5kcyB0aGUgYGNoaWxkYCBuYXRpdmUgbm9kZSAob3IgYSBjb2xsZWN0aW9uIG9mIG5vZGVzKSB0byB0aGUgYHBhcmVudGAuXG4gKlxuICogVGhlIGVsZW1lbnQgaW5zZXJ0aW9uIG1pZ2h0IGJlIGRlbGF5ZWQge0BsaW5rIGNhbkluc2VydE5hdGl2ZU5vZGV9LlxuICpcbiAqIEBwYXJhbSBjaGlsZEVsIFRoZSBuYXRpdmUgY2hpbGQgKG9yIGNoaWxkcmVuKSB0aGF0IHNob3VsZCBiZSBhcHBlbmRlZFxuICogQHBhcmFtIGNoaWxkVE5vZGUgVGhlIFROb2RlIG9mIHRoZSBjaGlsZCBlbGVtZW50XG4gKiBAcGFyYW0gY3VycmVudFZpZXcgVGhlIGN1cnJlbnQgTFZpZXdcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBjaGlsZCB3YXMgYXBwZW5kZWRcbiAqL1xuZnVuY3Rpb24gYXBwZW5kQ2hpbGQoY2hpbGRFbCwgY2hpbGRUTm9kZSwgY3VycmVudFZpZXcpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgcmVuZGVyUGFyZW50ID0gZ2V0UmVuZGVyUGFyZW50KGNoaWxkVE5vZGUsIGN1cnJlbnRWaWV3KTtcbiAgICBpZiAocmVuZGVyUGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gY3VycmVudFZpZXdbUkVOREVSRVJdO1xuICAgICAgICB2YXIgcGFyZW50VE5vZGUgPSBjaGlsZFROb2RlLnBhcmVudCB8fCBjdXJyZW50Vmlld1tUX0hPU1RdO1xuICAgICAgICB2YXIgYW5jaG9yTm9kZSA9IGdldE5hdGl2ZUFuY2hvck5vZGUocGFyZW50VE5vZGUsIGN1cnJlbnRWaWV3KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRFbCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY2hpbGRFbF8xID0gX192YWx1ZXMoY2hpbGRFbCksIGNoaWxkRWxfMV8xID0gY2hpbGRFbF8xLm5leHQoKTsgIWNoaWxkRWxfMV8xLmRvbmU7IGNoaWxkRWxfMV8xID0gY2hpbGRFbF8xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmF0aXZlTm9kZSA9IGNoaWxkRWxfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcmVuZGVyUGFyZW50LCBuYXRpdmVOb2RlLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRWxfMV8xICYmICFjaGlsZEVsXzFfMS5kb25lICYmIChfYSA9IGNoaWxkRWxfMS5yZXR1cm4pKSBfYS5jYWxsKGNoaWxkRWxfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUFwcGVuZE9ySW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIGNoaWxkRWwsIGFuY2hvck5vZGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvciBhbiBJQ1UgY29udGFpbmVyIGlmIHRob3NlIGNvbnRhaW5lcnMgYXJlIG5lc3RlZC5cbiAqXG4gKiBAcGFyYW0gdE5vZGUgVGhlIHN0YXJ0aW5nIFROb2RlIGZvciB3aGljaCB3ZSBzaG91bGQgc2tpcCBlbGVtZW50IGFuZCBJQ1UgY29udGFpbmVyc1xuICogQHJldHVybnMgVGhlIFROb2RlIG9mIHRoZSBoaWdoZXN0IGxldmVsIElDVSBjb250YWluZXIgb3IgZWxlbWVudCBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gZ2V0SGlnaGVzdEVsZW1lbnRPcklDVUNvbnRhaW5lcih0Tm9kZSkge1xuICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgIT0gbnVsbCAmJiAodE5vZGUucGFyZW50LnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fFxuICAgICAgICB0Tm9kZS5wYXJlbnQudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pKSB7XG4gICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdE5vZGU7XG59XG5mdW5jdGlvbiBnZXRCZWZvcmVOb2RlRm9yVmlldyhpbmRleCwgdmlld3MsIGNvbnRhaW5lck5hdGl2ZSkge1xuICAgIGlmIChpbmRleCArIDEgPCB2aWV3cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHZpZXcgPSB2aWV3c1tpbmRleCArIDFdO1xuICAgICAgICB2YXIgdmlld1ROb2RlID0gdmlld1tUX0hPU1RdO1xuICAgICAgICByZXR1cm4gdmlld1ROb2RlLmNoaWxkID8gZ2V0TmF0aXZlQnlUTm9kZSh2aWV3VE5vZGUuY2hpbGQsIHZpZXcpIDogY29udGFpbmVyTmF0aXZlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lck5hdGl2ZTtcbiAgICB9XG59XG4vKipcbiAqIFJlbW92ZXMgYSBuYXRpdmUgbm9kZSBpdHNlbGYgdXNpbmcgYSBnaXZlbiByZW5kZXJlci4gVG8gcmVtb3ZlIHRoZSBub2RlIHdlIGFyZSBsb29raW5nIHVwIGl0c1xuICogcGFyZW50IGZyb20gdGhlIG5hdGl2ZSB0cmVlIGFzIG5vdCBhbGwgcGxhdGZvcm1zIC8gYnJvd3NlcnMgc3VwcG9ydCB0aGUgZXF1aXZhbGVudCBvZlxuICogbm9kZS5yZW1vdmUoKS5cbiAqXG4gKiBAcGFyYW0gcmVuZGVyZXIgQSByZW5kZXJlciB0byBiZSB1c2VkXG4gKiBAcGFyYW0gck5vZGUgVGhlIG5hdGl2ZSBub2RlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSBpc0hvc3RFbGVtZW50IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgbm9kZSB0byBiZSByZW1vdmVkIGlzIGEgaG9zdCBvZiBhIGNvbXBvbmVudC5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlUmVtb3ZlTm9kZShyZW5kZXJlciwgck5vZGUsIGlzSG9zdEVsZW1lbnQpIHtcbiAgICB2YXIgbmF0aXZlUGFyZW50ID0gbmF0aXZlUGFyZW50Tm9kZShyZW5kZXJlciwgck5vZGUpO1xuICAgIGlmIChuYXRpdmVQYXJlbnQpIHtcbiAgICAgICAgbmF0aXZlUmVtb3ZlQ2hpbGQocmVuZGVyZXIsIG5hdGl2ZVBhcmVudCwgck5vZGUsIGlzSG9zdEVsZW1lbnQpO1xuICAgIH1cbn1cbi8qKlxuICogQXBwZW5kcyBub2RlcyB0byBhIHRhcmdldCBwcm9qZWN0aW9uIHBsYWNlLiBOb2RlcyB0byBpbnNlcnQgd2VyZSBwcmV2aW91c2x5IHJlLWRpc3RyaWJ1dGlvbiBhbmRcbiAqIHN0b3JlZCBvbiBhIGNvbXBvbmVudCBob3N0IGxldmVsLlxuICogQHBhcmFtIGxWaWV3IEEgTFZpZXcgd2hlcmUgbm9kZXMgYXJlIGluc2VydGVkICh0YXJnZXQgVkx2aWV3KVxuICogQHBhcmFtIHRQcm9qZWN0aW9uTm9kZSBBIHByb2plY3Rpb24gbm9kZSB3aGVyZSBwcmV2aW91c2x5IHJlLWRpc3RyaWJ1dGlvbiBzaG91bGQgYmUgYXBwZW5kZWRcbiAqICh0YXJnZXQgaW5zZXJ0aW9uIHBsYWNlKVxuICogQHBhcmFtIHNlbGVjdG9ySW5kZXggQSBidWNrZXQgZnJvbSB3aGVyZSBub2RlcyB0byBwcm9qZWN0IHNob3VsZCBiZSB0YWtlblxuICogQHBhcmFtIGNvbXBvbmVudFZpZXcgQSB3aGVyZSBwcm9qZWN0YWJsZSBub2RlcyB3ZXJlIGluaXRpYWxseSBjcmVhdGVkIChzb3VyY2UgdmlldylcbiAqL1xuZnVuY3Rpb24gYXBwZW5kUHJvamVjdGVkTm9kZXMobFZpZXcsIHRQcm9qZWN0aW9uTm9kZSwgc2VsZWN0b3JJbmRleCwgY29tcG9uZW50Vmlldykge1xuICAgIHZhciBwcm9qZWN0ZWRWaWV3ID0gY29tcG9uZW50Vmlld1tQQVJFTlRdO1xuICAgIHZhciBjb21wb25lbnROb2RlID0gY29tcG9uZW50Vmlld1tUX0hPU1RdO1xuICAgIHZhciBub2RlVG9Qcm9qZWN0ID0gY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uW3NlbGVjdG9ySW5kZXhdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVUb1Byb2plY3QpKSB7XG4gICAgICAgIGFwcGVuZENoaWxkKG5vZGVUb1Byb2plY3QsIHRQcm9qZWN0aW9uTm9kZSwgbFZpZXcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5vZGVUb1Byb2plY3QpIHtcbiAgICAgICAgICAgIGlmIChub2RlVG9Qcm9qZWN0LnR5cGUgPT09IDEgLyogUHJvamVjdGlvbiAqLykge1xuICAgICAgICAgICAgICAgIGFwcGVuZFByb2plY3RlZE5vZGVzKGxWaWV3LCB0UHJvamVjdGlvbk5vZGUsIG5vZGVUb1Byb2plY3QucHJvamVjdGlvbiwgZmluZENvbXBvbmVudFZpZXcocHJvamVjdGVkVmlldykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBmbGFnIG11c3QgYmUgc2V0IG5vdyBvciB3ZSB3b24ndCBrbm93IHRoYXQgdGhpcyBub2RlIGlzIHByb2plY3RlZFxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBub2RlcyBhcmUgaW5zZXJ0ZWQgaW50byBhIGNvbnRhaW5lciBsYXRlci5cbiAgICAgICAgICAgICAgICBub2RlVG9Qcm9qZWN0LmZsYWdzIHw9IDIgLyogaXNQcm9qZWN0ZWQgKi87XG4gICAgICAgICAgICAgICAgYXBwZW5kUHJvamVjdGVkTm9kZShub2RlVG9Qcm9qZWN0LCB0UHJvamVjdGlvbk5vZGUsIGxWaWV3LCBwcm9qZWN0ZWRWaWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVUb1Byb2plY3QgPSBub2RlVG9Qcm9qZWN0LnByb2plY3Rpb25OZXh0O1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBcHBlbmRzIGEgcHJvamVjdGVkIG5vZGUgdG8gdGhlIERPTSwgb3IgaW4gdGhlIGNhc2Ugb2YgYSBwcm9qZWN0ZWQgY29udGFpbmVyLFxuICogYXBwZW5kcyB0aGUgbm9kZXMgZnJvbSBhbGwgb2YgdGhlIGNvbnRhaW5lcidzIGFjdGl2ZSB2aWV3cyB0byB0aGUgRE9NLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0ZWRUTm9kZSBUaGUgVE5vZGUgdG8gYmUgcHJvamVjdGVkXG4gKiBAcGFyYW0gdFByb2plY3Rpb25Ob2RlIFRoZSBwcm9qZWN0aW9uIChuZy1jb250ZW50KSBUTm9kZVxuICogQHBhcmFtIGN1cnJlbnRWaWV3IEN1cnJlbnQgTFZpZXdcbiAqIEBwYXJhbSBwcm9qZWN0aW9uVmlldyBQcm9qZWN0aW9uIHZpZXcgKHZpZXcgYWJvdmUgY3VycmVudClcbiAqL1xuZnVuY3Rpb24gYXBwZW5kUHJvamVjdGVkTm9kZShwcm9qZWN0ZWRUTm9kZSwgdFByb2plY3Rpb25Ob2RlLCBjdXJyZW50VmlldywgcHJvamVjdGlvblZpZXcpIHtcbiAgICB2YXIgbmF0aXZlID0gZ2V0TmF0aXZlQnlUTm9kZShwcm9qZWN0ZWRUTm9kZSwgcHJvamVjdGlvblZpZXcpO1xuICAgIGFwcGVuZENoaWxkKG5hdGl2ZSwgdFByb2plY3Rpb25Ob2RlLCBjdXJyZW50Vmlldyk7XG4gICAgLy8gdGhlIHByb2plY3RlZCBjb250ZW50cyBhcmUgcHJvY2Vzc2VkIHdoaWxlIGluIHRoZSBzaGFkb3cgdmlldyAod2hpY2ggaXMgdGhlIGN1cnJlbnRWaWV3KVxuICAgIC8vIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGV4dHJhY3QgdGhlIHZpZXcgd2hlcmUgdGhlIGhvc3QgZWxlbWVudCBsaXZlcyBzaW5jZSBpdCdzIHRoZVxuICAgIC8vIGxvZ2ljYWwgY29udGFpbmVyIG9mIHRoZSBjb250ZW50IHByb2plY3RlZCB2aWV3c1xuICAgIGF0dGFjaFBhdGNoRGF0YShuYXRpdmUsIHByb2plY3Rpb25WaWV3KTtcbiAgICB2YXIgbm9kZU9yQ29udGFpbmVyID0gcHJvamVjdGlvblZpZXdbcHJvamVjdGVkVE5vZGUuaW5kZXhdO1xuICAgIGlmIChwcm9qZWN0ZWRUTm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykge1xuICAgICAgICAvLyBUaGUgbm9kZSB3ZSBhcmUgYWRkaW5nIGlzIGEgY29udGFpbmVyIGFuZCB3ZSBhcmUgYWRkaW5nIGl0IHRvIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgLy8gaXMgbm90IGEgY29tcG9uZW50IChubyBtb3JlIHJlLXByb2plY3Rpb24pLlxuICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5IGEgY29udGFpbmVyIGlzIHByb2plY3RlZCBhdCB0aGUgcm9vdCBvZiBhIGNvbXBvbmVudCdzIHRlbXBsYXRlXG4gICAgICAgIC8vIGFuZCBjYW4ndCBiZSByZS1wcm9qZWN0ZWQgKGFzIG5vdCBjb250ZW50IG9mIGFueSBjb21wb25lbnQpLlxuICAgICAgICAvLyBBc3NpZ24gdGhlIGZpbmFsIHByb2plY3Rpb24gbG9jYXRpb24gaW4gdGhvc2UgY2FzZXMuXG4gICAgICAgIHZhciB2aWV3cyA9IG5vZGVPckNvbnRhaW5lcltWSUVXU107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFkZFJlbW92ZVZpZXdGcm9tQ29udGFpbmVyKHZpZXdzW2ldLCB0cnVlLCBub2RlT3JDb250YWluZXJbTkFUSVZFXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwcm9qZWN0ZWRUTm9kZS50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pIHtcbiAgICAgICAgICAgIHZhciBuZ0NvbnRhaW5lckNoaWxkVE5vZGUgPSBwcm9qZWN0ZWRUTm9kZS5jaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChuZ0NvbnRhaW5lckNoaWxkVE5vZGUpIHtcbiAgICAgICAgICAgICAgICBhcHBlbmRQcm9qZWN0ZWROb2RlKG5nQ29udGFpbmVyQ2hpbGRUTm9kZSwgdFByb2plY3Rpb25Ob2RlLCBjdXJyZW50VmlldywgcHJvamVjdGlvblZpZXcpO1xuICAgICAgICAgICAgICAgIG5nQ29udGFpbmVyQ2hpbGRUTm9kZSA9IG5nQ29udGFpbmVyQ2hpbGRUTm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xDb250YWluZXIobm9kZU9yQ29udGFpbmVyKSkge1xuICAgICAgICAgICAgYXBwZW5kQ2hpbGQobm9kZU9yQ29udGFpbmVyW05BVElWRV0sIHRQcm9qZWN0aW9uTm9kZSwgY3VycmVudFZpZXcpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENyZWF0ZXMgYW4gTENvbnRhaW5lciBmb3IgaW5saW5lIHZpZXdzLCBlLmcuXG4gKlxuICogJSBpZiAoc2hvd2luZykge1xuICogICA8ZGl2PjwvZGl2PlxuICogJSB9XG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29udGFpbmVyIGluIHRoZSBkYXRhIGFycmF5XG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWNvbnRhaW5lcihpbmRleCkge1xuICAgIHZhciB0Tm9kZSA9IGNvbnRhaW5lckludGVybmFsKGluZGV4LCBudWxsLCBudWxsKTtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIGlmIChsVmlld1tUVklFV10uZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgdE5vZGUudFZpZXdzID0gW107XG4gICAgfVxuICAgIGFkZFRDb250YWluZXJUb1F1ZXJpZXMobFZpZXcsIHROb2RlKTtcbiAgICBzZXRJc1BhcmVudChmYWxzZSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gTENvbnRhaW5lciBmb3IgYW4gbmctdGVtcGxhdGUgKGR5bmFtaWNhbGx5LWluc2VydGVkIHZpZXcpLCBlLmcuXG4gKlxuICogPG5nLXRlbXBsYXRlICNmb28+XG4gKiAgICA8ZGl2PjwvZGl2PlxuICogPC9uZy10ZW1wbGF0ZT5cbiAqXG4gKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb250YWluZXIgaW4gdGhlIGRhdGEgYXJyYXlcbiAqIEBwYXJhbSB0ZW1wbGF0ZUZuIElubGluZSB0ZW1wbGF0ZVxuICogQHBhcmFtIGNvbnN0cyBUaGUgbnVtYmVyIG9mIG5vZGVzLCBsb2NhbCByZWZzLCBhbmQgcGlwZXMgZm9yIHRoaXMgdGVtcGxhdGVcbiAqIEBwYXJhbSB2YXJzIFRoZSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIHRoaXMgdGVtcGxhdGVcbiAqIEBwYXJhbSB0YWdOYW1lIFRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgZWxlbWVudCwgaWYgYXBwbGljYWJsZVxuICogQHBhcmFtIGF0dHJzIFRoZSBhdHRycyBhdHRhY2hlZCB0byB0aGUgY29udGFpbmVyLCBpZiBhcHBsaWNhYmxlXG4gKiBAcGFyYW0gbG9jYWxSZWZzIEEgc2V0IG9mIGxvY2FsIHJlZmVyZW5jZSBiaW5kaW5ncyBvbiB0aGUgZWxlbWVudC5cbiAqIEBwYXJhbSBsb2NhbFJlZkV4dHJhY3RvciBBIGZ1bmN0aW9uIHdoaWNoIGV4dHJhY3RzIGxvY2FsLXJlZnMgdmFsdWVzIGZyb20gdGhlIHRlbXBsYXRlLlxuICogICAgICAgIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NhbC1yZWYuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXRlbXBsYXRlKGluZGV4LCB0ZW1wbGF0ZUZuLCBjb25zdHMsIHZhcnMsIHRhZ05hbWUsIGF0dHJzLCBsb2NhbFJlZnMsIGxvY2FsUmVmRXh0cmFjdG9yKSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgLy8gVE9ETzogY29uc2lkZXIgYSBzZXBhcmF0ZSBub2RlIHR5cGUgZm9yIHRlbXBsYXRlc1xuICAgIHZhciB0Q29udGFpbmVyTm9kZSA9IGNvbnRhaW5lckludGVybmFsKGluZGV4LCB0YWdOYW1lIHx8IG51bGwsIGF0dHJzIHx8IG51bGwpO1xuICAgIGlmICh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICB0Q29udGFpbmVyTm9kZS50Vmlld3MgPSBjcmVhdGVUVmlldygtMSwgdGVtcGxhdGVGbiwgY29uc3RzLCB2YXJzLCB0Vmlldy5kaXJlY3RpdmVSZWdpc3RyeSwgdFZpZXcucGlwZVJlZ2lzdHJ5LCBudWxsLCBudWxsKTtcbiAgICB9XG4gICAgY3JlYXRlRGlyZWN0aXZlc0FuZExvY2Fscyh0VmlldywgbFZpZXcsIGxvY2FsUmVmcywgbG9jYWxSZWZFeHRyYWN0b3IpO1xuICAgIGFkZFRDb250YWluZXJUb1F1ZXJpZXMobFZpZXcsIHRDb250YWluZXJOb2RlKTtcbiAgICBhdHRhY2hQYXRjaERhdGEoZ2V0TmF0aXZlQnlUTm9kZSh0Q29udGFpbmVyTm9kZSwgbFZpZXcpLCBsVmlldyk7XG4gICAgcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgdENvbnRhaW5lck5vZGUpO1xuICAgIHNldElzUGFyZW50KGZhbHNlKTtcbn1cbi8qKlxuICogU2V0cyBhIGNvbnRhaW5lciB1cCB0byByZWNlaXZlIHZpZXdzLlxuICpcbiAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciBpbiB0aGUgZGF0YSBhcnJheVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVjb250YWluZXJSZWZyZXNoU3RhcnQoaW5kZXgpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICB2YXIgcHJldmlvdXNPclBhcmVudFROb2RlID0gbG9hZEludGVybmFsKHRWaWV3LmRhdGEsIGluZGV4KTtcbiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUocHJldmlvdXNPclBhcmVudFROb2RlKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUocHJldmlvdXNPclBhcmVudFROb2RlLCAwIC8qIENvbnRhaW5lciAqLyk7XG4gICAgc2V0SXNQYXJlbnQodHJ1ZSk7XG4gICAgbFZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXVtBQ1RJVkVfSU5ERVhdID0gMDtcbiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgaW5pdCBob29rcyBoZXJlIHNvIG5nT25Jbml0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdG9wIGxldmVsIHZpZXdzXG4gICAgLy8gYmVmb3JlIHRoZXkgYXJlIGNhbGxlZCBpbiBlbWJlZGRlZCB2aWV3cyAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS5cbiAgICBleGVjdXRlUHJlT3JkZXJIb29rcyhsVmlldywgdFZpZXcsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpLCB1bmRlZmluZWQpO1xufVxuLyoqXG4gKiBNYXJrcyB0aGUgZW5kIG9mIHRoZSBMQ29udGFpbmVyLlxuICpcbiAqIE1hcmtpbmcgdGhlIGVuZCBvZiBMQ29udGFpbmVyIGlzIHRoZSB0aW1lIHdoZW4gdG8gY2hpbGQgdmlld3MgZ2V0IGluc2VydGVkIG9yIHJlbW92ZWQuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWNvbnRhaW5lclJlZnJlc2hFbmQoKSB7XG4gICAgdmFyIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIGlmIChnZXRJc1BhcmVudCgpKSB7XG4gICAgICAgIHNldElzUGFyZW50KGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwcmV2aW91c09yUGFyZW50VE5vZGUsIDIgLyogVmlldyAqLyk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIYXNQYXJlbnQocHJldmlvdXNPclBhcmVudFROb2RlKTtcbiAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlID0gcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDtcbiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgfVxuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwcmV2aW91c09yUGFyZW50VE5vZGUsIDAgLyogQ29udGFpbmVyICovKTtcbiAgICB2YXIgbENvbnRhaW5lciA9IGdldExWaWV3KClbcHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4XTtcbiAgICB2YXIgbmV4dEluZGV4ID0gbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdO1xuICAgIC8vIHJlbW92ZSBleHRyYSB2aWV3cyBhdCB0aGUgZW5kIG9mIHRoZSBjb250YWluZXJcbiAgICB3aGlsZSAobmV4dEluZGV4IDwgbENvbnRhaW5lcltWSUVXU10ubGVuZ3RoKSB7XG4gICAgICAgIHJlbW92ZVZpZXcobENvbnRhaW5lciwgbmV4dEluZGV4KTtcbiAgICB9XG59XG4vKipcbiogUmVwb3J0aW5nIGEgVENvbnRhaW5lciBub2RlIHF1ZXJpZXMgaXMgYSAyLXN0ZXAgcHJvY2VzcyBhcyB3ZSBuZWVkIHRvOlxuKiAtIGNoZWNrIGlmIHRoZSBjb250YWluZXIgbm9kZSBpdHNlbGYgaXMgbWF0Y2hpbmcgKHF1ZXJ5IG1pZ2h0IG1hdGNoIGEgPG5nLXRlbXBsYXRlPiBub2RlKTtcbiogLSBwcmVwYXJlIHJvb20gZm9yIG5vZGVzIGZyb20gdmlld3MgdGhhdCBtaWdodCBiZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBUZW1wbGF0ZVJlZiBsaW5rZWQgdG8gdGhpc1xuKiBjb250YWluZXIuXG4qXG4qIFRob3NlIDIgb3BlcmF0aW9ucyBuZWVkIHRvIGhhcHBlbiBpbiB0aGUgc3BlY2lmaWMgb3JkZXIgKG1hdGNoIHRoZSBjb250YWluZXIgbm9kZSBpdHNlbGYsIHRoZW5cbiogcHJlcGFyZSBzcGFjZSBmb3Igbm9kZXMgZnJvbSB2aWV3cykuXG4qL1xuZnVuY3Rpb24gYWRkVENvbnRhaW5lclRvUXVlcmllcyhsVmlldywgdENvbnRhaW5lck5vZGUpIHtcbiAgICB2YXIgcXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdO1xuICAgIGlmIChxdWVyaWVzKSB7XG4gICAgICAgIHZhciBsQ29udGFpbmVyID0gbFZpZXdbdENvbnRhaW5lck5vZGUuaW5kZXhdO1xuICAgICAgICBpZiAobENvbnRhaW5lcltRVUVSSUVTXSkge1xuICAgICAgICAgICAgLy8gUXVlcnkgY29udGFpbmVyIHNob3VsZCBvbmx5IGV4aXN0IGlmIGl0IHdhcyBjcmVhdGVkIHRocm91Z2ggYSBkeW5hbWljIHZpZXdcbiAgICAgICAgICAgIC8vIGluIGEgZGlyZWN0aXZlIGNvbnN0cnVjdG9yLiBJbiB0aGlzIGNhc2UsIHdlIG11c3Qgc3BsaWNlIHRoZSB0ZW1wbGF0ZVxuICAgICAgICAgICAgLy8gbWF0Y2hlcyBpbiBiZWZvcmUgdGhlIHZpZXcgbWF0Y2hlcyB0byBlbnN1cmUgcXVlcnkgcmVzdWx0cyBpbiBlbWJlZGRlZCB2aWV3c1xuICAgICAgICAgICAgLy8gZG9uJ3QgY2xvYmJlciBxdWVyeSByZXN1bHRzIG9uIHRoZSB0ZW1wbGF0ZSBub2RlIGl0c2VsZi5cbiAgICAgICAgICAgIHF1ZXJpZXMuaW5zZXJ0Tm9kZUJlZm9yZVZpZXdzKHRDb250YWluZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJpZXMuYWRkTm9kZSh0Q29udGFpbmVyTm9kZSk7XG4gICAgICAgICAgICBsQ29udGFpbmVyW1FVRVJJRVNdID0gcXVlcmllcy5jb250YWluZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnRhaW5lckludGVybmFsKGluZGV4LCB0YWdOYW1lLCBhdHRycykge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGxWaWV3W0JJTkRJTkdfSU5ERVhdLCBsVmlld1tUVklFV10uYmluZGluZ1N0YXJ0SW5kZXgsICdjb250YWluZXIgbm9kZXMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpO1xuICAgIHZhciBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUO1xuICAgIHZhciBjb21tZW50ID0gbFZpZXdbUkVOREVSRVJdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlID8gJ2NvbnRhaW5lcicgOiAnJyk7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUNvbW1lbnQrKztcbiAgICB2YXIgdE5vZGUgPSBjcmVhdGVOb2RlQXRJbmRleChpbmRleCwgMCAvKiBDb250YWluZXIgKi8sIGNvbW1lbnQsIHRhZ05hbWUsIGF0dHJzKTtcbiAgICB2YXIgbENvbnRhaW5lciA9IGxWaWV3W2FkanVzdGVkSW5kZXhdID1cbiAgICAgICAgY3JlYXRlTENvbnRhaW5lcihsVmlld1thZGp1c3RlZEluZGV4XSwgbFZpZXcsIGNvbW1lbnQsIHROb2RlKTtcbiAgICBhcHBlbmRDaGlsZChjb21tZW50LCB0Tm9kZSwgbFZpZXcpO1xuICAgIC8vIENvbnRhaW5lcnMgYXJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHZpZXcgdHJlZSBpbnN0ZWFkIG9mIHRoZWlyIGVtYmVkZGVkIHZpZXdzXG4gICAgLy8gYmVjYXVzZSB2aWV3cyBjYW4gYmUgcmVtb3ZlZCBhbmQgcmUtaW5zZXJ0ZWQuXG4gICAgYWRkVG9WaWV3VHJlZShsVmlldywgbENvbnRhaW5lcik7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCAwIC8qIENvbnRhaW5lciAqLyk7XG4gICAgcmV0dXJuIHROb2RlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKiogU3RvcmUgYSB2YWx1ZSBpbiB0aGUgYGRhdGFgIGF0IGEgZ2l2ZW4gYGluZGV4YC4gKi9cbmZ1bmN0aW9uIHN0b3JlKGluZGV4LCB2YWx1ZSkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIC8vIFdlIGRvbid0IHN0b3JlIGFueSBzdGF0aWMgZGF0YSBmb3IgbG9jYWwgdmFyaWFibGVzLCBzbyB0aGUgZmlyc3QgdGltZVxuICAgIC8vIHdlIHNlZSB0aGUgdGVtcGxhdGUsIHdlIHNob3VsZCBzdG9yZSBhcyBudWxsIHRvIGF2b2lkIGEgc3BhcnNlIGFycmF5XG4gICAgdmFyIGFkanVzdGVkSW5kZXggPSBpbmRleCArIEhFQURFUl9PRkZTRVQ7XG4gICAgaWYgKGFkanVzdGVkSW5kZXggPj0gdFZpZXcuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IG51bGw7XG4gICAgICAgIHRWaWV3LmJsdWVwcmludFthZGp1c3RlZEluZGV4XSA9IG51bGw7XG4gICAgfVxuICAgIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gdmFsdWU7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIGxvY2FsIHJlZmVyZW5jZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHRWaWV3RGF0YS5cbiAqXG4gKiBJZiB0aGUgcmVmZXJlbmNlIHRvIHJldHJpZXZlIGlzIGluIGEgcGFyZW50IHZpZXcsIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdXNlZCBpbiBjb25qdW5jdGlvblxuICogd2l0aCBhIG5leHRDb250ZXh0KCkgY2FsbCwgd2hpY2ggd2Fsa3MgdXAgdGhlIHRyZWUgYW5kIHVwZGF0ZXMgdGhlIGNvbnRleHRWaWV3RGF0YSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBsb2NhbCByZWYgaW4gY29udGV4dFZpZXdEYXRhLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVyZWZlcmVuY2UoaW5kZXgpIHtcbiAgICB2YXIgY29udGV4dExWaWV3ID0gZ2V0Q29udGV4dExWaWV3KCk7XG4gICAgcmV0dXJuIGxvYWRJbnRlcm5hbChjb250ZXh0TFZpZXcsIGluZGV4KTtcbn1cbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBjdXJyZW50IGB2aWV3RGF0YWAuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWxvYWQoaW5kZXgpIHtcbiAgICByZXR1cm4gbG9hZEludGVybmFsKGdldExWaWV3KCksIGluZGV4KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gybXJtWRpcmVjdGl2ZUluamVjdCh0b2tlbiwgZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3MgPT09IHZvaWQgMCkgeyBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7IH1cbiAgICB0b2tlbiA9IHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKTtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIC8vIEZhbGwgYmFjayB0byBpbmplY3QoKSBpZiB2aWV3IGhhc24ndCBiZWVuIGNyZWF0ZWQuIFRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaW4gdGVzdHNcbiAgICAvLyBpZiBpbmplY3QgdXRpbGl0aWVzIGFyZSB1c2VkIGJlZm9yZSBib290c3RyYXBwaW5nLlxuICAgIGlmIChsVmlldyA9PSBudWxsKVxuICAgICAgICByZXR1cm4gybXJtWluamVjdCh0b2tlbiwgZmxhZ3MpO1xuICAgIHJldHVybiBnZXRPckNyZWF0ZUluamVjdGFibGUoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGxWaWV3LCB0b2tlbiwgZmxhZ3MpO1xufVxuLyoqXG4gKiBGYWNhZGUgZm9yIHRoZSBhdHRyaWJ1dGUgaW5qZWN0aW9uIGZyb20gREkuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWluamVjdEF0dHJpYnV0ZShhdHRyTmFtZVRvSW5qZWN0KSB7XG4gICAgcmV0dXJuIGluamVjdEF0dHJpYnV0ZUltcGwoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGF0dHJOYW1lVG9JbmplY3QpO1xufVxuXG4vKlxuICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBpbmNsdWRlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIGFsbCBzdHlsaW5nLXJlbGF0ZWRcbiAqIG9wZXJhdGlvbnMgaW4gQW5ndWxhci5cbiAqXG4gKiBUaGUgaW5zdHJ1Y3Rpb25zIHByZXNlbnQgaW4gdGhpcyBmaWxlIGFyZTpcbiAqXG4gKiBUZW1wbGF0ZSBsZXZlbCBzdHlsaW5nIGluc3RydWN0aW9uczpcbiAqIC0gZWxlbWVudFN0eWxpbmdcbiAqIC0gZWxlbWVudFN0eWxpbmdNYXBcbiAqIC0gZWxlbWVudFN0eWxlUHJvcFxuICogLSBlbGVtZW50Q2xhc3NQcm9wXG4gKiAtIGVsZW1lbnRTdHlsaW5nQXBwbHlcbiAqXG4gKiBIb3N0IGJpbmRpbmdzIGxldmVsIHN0eWxpbmcgaW5zdHJ1Y3Rpb25zOlxuICogLSBlbGVtZW50SG9zdFN0eWxpbmdcbiAqIC0gZWxlbWVudEhvc3RTdHlsaW5nTWFwXG4gKiAtIGVsZW1lbnRIb3N0U3R5bGVQcm9wXG4gKiAtIGVsZW1lbnRIb3N0Q2xhc3NQcm9wXG4gKiAtIGVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5XG4gKi9cbi8qKlxuICogQWxsb2NhdGVzIHN0eWxlIGFuZCBjbGFzcyBiaW5kaW5nIHByb3BlcnRpZXMgb24gdGhlIGVsZW1lbnQgZHVyaW5nIGNyZWF0aW9uIG1vZGUuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgZHVyaW5nIGNyZWF0aW9uIG1vZGUgdG8gcmVnaXN0ZXIgYWxsXG4gKiBkeW5hbWljIHN0eWxlIGFuZCBjbGFzcyBiaW5kaW5ncyBvbiB0aGUgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkXG4gKiBmb3IgYmluZGluZyB2YWx1ZXMgKHNlZSBgZWxlbWVudFN0YXJ0YCB0byBsZWFybiBob3cgdG8gYXNzaWduIHN0YXRpYyBzdHlsaW5nXG4gKiB2YWx1ZXMgdG8gYW4gZWxlbWVudCkuXG4gKlxuICogQHBhcmFtIGNsYXNzQmluZGluZ05hbWVzIEFuIGFycmF5IGNvbnRhaW5pbmcgYmluZGFibGUgY2xhc3MgbmFtZXMuXG4gKiAgICAgICAgVGhlIGBlbGVtZW50Q2xhc3NQcm9wYCBpbnN0cnVjdGlvbiByZWZlcnMgdG8gdGhlIGNsYXNzIG5hbWUgYnkgaW5kZXggaW5cbiAqICAgICAgICB0aGlzIGFycmF5IChpLmUuIGBbJ2ZvbycsICdiYXInXWAgbWVhbnMgYGZvbz0wYCBhbmQgYGJhcj0xYCkuXG4gKiBAcGFyYW0gc3R5bGVCaW5kaW5nTmFtZXMgQW4gYXJyYXkgY29udGFpbmluZyBiaW5kYWJsZSBzdHlsZSBwcm9wZXJ0aWVzLlxuICogICAgICAgIFRoZSBgZWxlbWVudFN0eWxlUHJvcGAgaW5zdHJ1Y3Rpb24gcmVmZXJzIHRvIHRoZSBjbGFzcyBuYW1lIGJ5IGluZGV4IGluXG4gKiAgICAgICAgdGhpcyBhcnJheSAoaS5lLiBgWyd3aWR0aCcsICdoZWlnaHQnXWAgbWVhbnMgYHdpZHRoPTBgIGFuZCBgaGVpZ2h0PTFgKS5cbiAqIEBwYXJhbSBzdHlsZVNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2FuaXRpemUgYW55IENTU1xuICogICAgICAgIHN0eWxlIHZhbHVlcyB0aGF0IGFyZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IChkdXJpbmcgcmVuZGVyaW5nKS5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZWxlbWVudFN0eWxpbmcoY2xhc3NCaW5kaW5nTmFtZXMsIHN0eWxlQmluZGluZ05hbWVzLCBzdHlsZVNhbml0aXplcikge1xuICAgIHZhciB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIGlmICghdE5vZGUuc3R5bGluZ1RlbXBsYXRlKSB7XG4gICAgICAgIHROb2RlLnN0eWxpbmdUZW1wbGF0ZSA9IGNyZWF0ZUVtcHR5U3R5bGluZ0NvbnRleHQoKTtcbiAgICB9XG4gICAgLy8gY2FsbGluZyB0aGUgZnVuY3Rpb24gYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSB0ZW1wbGF0ZSdzIGJpbmRpbmcgdmFsdWVzXG4gICAgLy8gYXJlIGFwcGxpZWQgYXMgdGhlIGZpcnN0IHNldCBvZiBiaW5kaW5ncyBpbnRvIHRoZSBjb250ZXh0LiBJZiBhbnkgb3RoZXJcbiAgICAvLyBzdHlsaW5nIGJpbmRpbmdzIGFyZSBzZXQgb24gdGhlIHNhbWUgZWxlbWVudCAoYnkgZGlyZWN0aXZlcyBhbmQvb3JcbiAgICAvLyBjb21wb25lbnRzKSB0aGVuIHRoZXkgd2lsbCBiZSBhcHBsaWVkIGF0IHRoZSBlbmQgb2YgdGhlIGBlbGVtZW50RW5kYFxuICAgIC8vIGluc3RydWN0aW9uIChiZWNhdXNlIGRpcmVjdGl2ZXMgYXJlIGNyZWF0ZWQgZmlyc3QgYmVmb3JlIHN0eWxpbmcgaXNcbiAgICAvLyBleGVjdXRlZCBmb3IgYSBuZXcgZWxlbWVudCkuXG4gICAgaW5pdEVsZW1lbnRTdHlsaW5nKHROb2RlLCBjbGFzc0JpbmRpbmdOYW1lcywgc3R5bGVCaW5kaW5nTmFtZXMsIHN0eWxlU2FuaXRpemVyLCBERUZBVUxUX1RFTVBMQVRFX0RJUkVDVElWRV9JTkRFWCk7XG59XG4vKipcbiAqIEFsbG9jYXRlcyBzdHlsZSBhbmQgY2xhc3MgYmluZGluZyBwcm9wZXJ0aWVzIG9uIHRoZSBob3N0IGVsZW1lbnQgZHVyaW5nIGNyZWF0aW9uIG1vZGVcbiAqIHdpdGhpbiB0aGUgaG9zdCBiaW5kaW5ncyBmdW5jdGlvbiBvZiBhIGRpcmVjdGl2ZSBvciBjb21wb25lbnQuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBiZSBjYWxsZWQgZHVyaW5nIGNyZWF0aW9uIG1vZGUgdG8gcmVnaXN0ZXIgYWxsXG4gKiBkeW5hbWljIHN0eWxlIGFuZCBjbGFzcyBob3N0IGJpbmRpbmdzIG9uIHRoZSBob3N0IGVsZW1lbnQgb2YgYSBkaXJlY3RpdmUgb3JcbiAqIGNvbXBvbmVudC4gTm90ZSB0aGF0IHRoaXMgaXMgb25seSB1c2VkIGZvciBiaW5kaW5nIHZhbHVlcyAoc2VlIGBlbGVtZW50SG9zdEF0dHJzYFxuICogdG8gbGVhcm4gaG93IHRvIGFzc2lnbiBzdGF0aWMgc3R5bGluZyB2YWx1ZXMgdG8gdGhlIGhvc3QgZWxlbWVudCkuXG4gKlxuICogQHBhcmFtIGNsYXNzQmluZGluZ05hbWVzIEFuIGFycmF5IGNvbnRhaW5pbmcgYmluZGFibGUgY2xhc3MgbmFtZXMuXG4gKiAgICAgICAgVGhlIGBlbGVtZW50SG9zdENsYXNzUHJvcGAgaW5zdHJ1Y3Rpb24gcmVmZXJzIHRvIHRoZSBjbGFzcyBuYW1lIGJ5IGluZGV4IGluXG4gKiAgICAgICAgdGhpcyBhcnJheSAoaS5lLiBgWydmb28nLCAnYmFyJ11gIG1lYW5zIGBmb289MGAgYW5kIGBiYXI9MWApLlxuICogQHBhcmFtIHN0eWxlQmluZGluZ05hbWVzIEFuIGFycmF5IGNvbnRhaW5pbmcgYmluZGFibGUgc3R5bGUgcHJvcGVydGllcy5cbiAqICAgICAgICBUaGUgYGVsZW1lbnRIb3N0U3R5bGVQcm9wYCBpbnN0cnVjdGlvbiByZWZlcnMgdG8gdGhlIGNsYXNzIG5hbWUgYnkgaW5kZXggaW5cbiAqICAgICAgICB0aGlzIGFycmF5IChpLmUuIGBbJ3dpZHRoJywgJ2hlaWdodCddYCBtZWFucyBgd2lkdGg9MGAgYW5kIGBoZWlnaHQ9MWApLlxuICogQHBhcmFtIHN0eWxlU2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBzYW5pdGl6ZSBhbnkgQ1NTXG4gKiAgICAgICAgc3R5bGUgdmFsdWVzIHRoYXQgYXJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgKGR1cmluZyByZW5kZXJpbmcpLlxuICogICAgICAgIE5vdGUgdGhhdCB0aGUgc2FuaXRpemVyIGluc3RhbmNlIGl0c2VsZiBpcyB0aWVkIHRvIHRoZSBwcm92aWRlZCBgZGlyZWN0aXZlYCBhbmRcbiAqICAgICAgICB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoZSBzYW1lIHByb3BlcnR5IGlzIGFzc2lnbmVkIGluIGFub3RoZXIgZGlyZWN0aXZlIG9yXG4gKiAgICAgICAgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRIb3N0U3R5bGluZyhjbGFzc0JpbmRpbmdOYW1lcywgc3R5bGVCaW5kaW5nTmFtZXMsIHN0eWxlU2FuaXRpemVyKSB7XG4gICAgdmFyIHROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7XG4gICAgaWYgKCF0Tm9kZS5zdHlsaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgdE5vZGUuc3R5bGluZ1RlbXBsYXRlID0gY3JlYXRlRW1wdHlTdHlsaW5nQ29udGV4dCgpO1xuICAgIH1cbiAgICB2YXIgZGlyZWN0aXZlU3R5bGluZ0luZGV4ID0gZ2V0QWN0aXZlRGlyZWN0aXZlU3R5bGluZ0luZGV4KCk7XG4gICAgLy8gZGVzcGl0ZSB0aGUgYmluZGluZyBiZWluZyBhcHBsaWVkIGluIGEgcXVldWUgKGJlbG93KSwgdGhlIGFsbG9jYXRpb25cbiAgICAvLyBvZiB0aGUgZGlyZWN0aXZlIGludG8gdGhlIGNvbnRleHQgaGFwcGVucyByaWdodCBhd2F5LiBUaGUgcmVhc29uIGZvclxuICAgIC8vIHRoaXMgaXMgdG8gcmV0YWluIHRoZSBvcmRlcmluZyBvZiB0aGUgZGlyZWN0aXZlcyAod2hpY2ggaXMgaW1wb3J0YW50XG4gICAgLy8gZm9yIHRoZSBwcmlvcml0aXphdGlvbiBvZiBiaW5kaW5ncykuXG4gICAgYWxsb2NhdGVPclVwZGF0ZURpcmVjdGl2ZUludG9Db250ZXh0KHROb2RlLnN0eWxpbmdUZW1wbGF0ZSwgZGlyZWN0aXZlU3R5bGluZ0luZGV4KTtcbiAgICB2YXIgZm5zID0gdE5vZGUub25FbGVtZW50Q3JlYXRpb25GbnMgPSB0Tm9kZS5vbkVsZW1lbnRDcmVhdGlvbkZucyB8fCBbXTtcbiAgICBmbnMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGluaXRFbGVtZW50U3R5bGluZyh0Tm9kZSwgY2xhc3NCaW5kaW5nTmFtZXMsIHN0eWxlQmluZGluZ05hbWVzLCBzdHlsZVNhbml0aXplciwgZGlyZWN0aXZlU3R5bGluZ0luZGV4KTtcbiAgICAgICAgcmVnaXN0ZXJIb3N0RGlyZWN0aXZlKHROb2RlLnN0eWxpbmdUZW1wbGF0ZSwgZGlyZWN0aXZlU3R5bGluZ0luZGV4KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGluaXRFbGVtZW50U3R5bGluZyh0Tm9kZSwgY2xhc3NCaW5kaW5nTmFtZXMsIHN0eWxlQmluZGluZ05hbWVzLCBzdHlsZVNhbml0aXplciwgZGlyZWN0aXZlU3R5bGluZ0luZGV4KSB7XG4gICAgdXBkYXRlQ29udGV4dFdpdGhCaW5kaW5ncyh0Tm9kZS5zdHlsaW5nVGVtcGxhdGUsIGRpcmVjdGl2ZVN0eWxpbmdJbmRleCwgY2xhc3NCaW5kaW5nTmFtZXMsIHN0eWxlQmluZGluZ05hbWVzLCBzdHlsZVNhbml0aXplcik7XG59XG4vKipcbiAqIFVwZGF0ZSBhIHN0eWxlIGJpbmRpbmcgb24gYW4gZWxlbWVudCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAqXG4gKiBJZiB0aGUgc3R5bGUgdmFsdWUgaXMgZmFsc3kgdGhlbiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudFxuICogKG9yIGFzc2lnbmVkIGEgZGlmZmVyZW50IHZhbHVlIGRlcGVuZGluZyBpZiB0aGVyZSBhcmUgYW55IHN0eWxlcyBwbGFjZWRcbiAqIG9uIHRoZSBlbGVtZW50IHdpdGggYGVsZW1lbnRTdHlsaW5nTWFwYCBvciBhbnkgc3RhdGljIHN0eWxlcyB0aGF0IGFyZVxuICogcHJlc2VudCBmcm9tIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGNyZWF0ZWQgd2l0aCBgZWxlbWVudFN0eWxpbmdgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIHN0eWxpbmcgZWxlbWVudCBpcyB1cGRhdGVkIGFzIHBhcnQgb2YgYGVsZW1lbnRTdHlsaW5nQXBwbHlgLlxuICpcbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIHdpdGggd2hpY2ggc3R5bGluZyBpcyBhc3NvY2lhdGVkLlxuICogQHBhcmFtIHN0eWxlSW5kZXggSW5kZXggb2Ygc3R5bGUgdG8gdXBkYXRlLiBUaGlzIGluZGV4IHZhbHVlIHJlZmVycyB0byB0aGVcbiAqICAgICAgICBpbmRleCBvZiB0aGUgc3R5bGUgaW4gdGhlIHN0eWxlIGJpbmRpbmdzIGFycmF5IHRoYXQgd2FzIHBhc3NlZCBpbnRvXG4gKiAgICAgICAgYGVsZW1lbnRTdHlsaW5nYC5cbiAqIEBwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUgKGZhbHN5IHRvIHJlbW92ZSkuIE5vdGUgdGhhdCBpZiBhIGRpcmVjdGl2ZSBhbHNvXG4gKiAgICAgICAgYXR0ZW1wdHMgdG8gd3JpdGUgdG8gdGhlIHNhbWUgYmluZGluZyB2YWx1ZSAodmlhIGBlbGVtZW50SG9zdFN0eWxlUHJvcGApXG4gKiAgICAgICAgdGhlbiBpdCB3aWxsIG9ubHkgYmUgYWJsZSB0byBkbyBzbyBpZiB0aGUgYmluZGluZyB2YWx1ZSBhc3NpZ25lZCB2aWFcbiAqICAgICAgICBgZWxlbWVudFN0eWxlUHJvcGAgaXMgZmFsc3kgKG9yIGRvZXNuJ3QgZXhpc3QgYXQgYWxsKS5cbiAqIEBwYXJhbSBzdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuXG4gKiAgICAgICAgTm90ZSB0aGF0IHdoZW4gYSBzdWZmaXggaXMgcHJvdmlkZWQgdGhlbiB0aGUgdW5kZXJseWluZyBzYW5pdGl6ZXIgd2lsbFxuICogICAgICAgIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0gZm9yY2VPdmVycmlkZSBXaGV0aGVyIG9yIG5vdCB0byB1cGRhdGUgdGhlIHN0eWxpbmcgdmFsdWUgaW1tZWRpYXRlbHlcbiAqICAgICAgICAoZGVzcGl0ZSB0aGUgb3RoZXIgYmluZGluZ3MgcG9zc2libHkgaGF2aW5nIHByaW9yaXR5KVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVlbGVtZW50U3R5bGVQcm9wKGluZGV4LCBzdHlsZUluZGV4LCB2YWx1ZSwgc3VmZml4LCBmb3JjZU92ZXJyaWRlKSB7XG4gICAgdmFyIHZhbHVlVG9BZGQgPSByZXNvbHZlU3R5bGVQcm9wVmFsdWUodmFsdWUsIHN1ZmZpeCk7XG4gICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHQoaW5kZXgsIGdldExWaWV3KCkpO1xuICAgIHVwZGF0ZVN0eWxlUHJvcChzdHlsaW5nQ29udGV4dCwgc3R5bGVJbmRleCwgdmFsdWVUb0FkZCwgREVGQVVMVF9URU1QTEFURV9ESVJFQ1RJVkVfSU5ERVgsIGZvcmNlT3ZlcnJpZGUpO1xufVxuLyoqXG4gKiBVcGRhdGUgYSBob3N0IHN0eWxlIGJpbmRpbmcgdmFsdWUgb24gdGhlIGhvc3QgZWxlbWVudCB3aXRoaW4gYSBjb21wb25lbnQvZGlyZWN0aXZlLlxuICpcbiAqIElmIHRoZSBzdHlsZSB2YWx1ZSBpcyBmYWxzeSB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBob3N0IGVsZW1lbnRcbiAqIChvciBhc3NpZ25lZCBhIGRpZmZlcmVudCB2YWx1ZSBkZXBlbmRpbmcgaWYgdGhlcmUgYXJlIGFueSBzdHlsZXMgcGxhY2VkXG4gKiBvbiB0aGUgc2FtZSBlbGVtZW50IHdpdGggYGVsZW1lbnRIb3N0U3R5bGluZ01hcGAgb3IgYW55IHN0YXRpYyBzdHlsZXMgdGhhdFxuICogYXJlIHByZXNlbnQgZnJvbSB3aGVuIHRoZSBlbGVtZW50IHdhcyBwYXRjaGVkIHdpdGggYGVsZW1lbnRIb3N0U3R5bGluZ2ApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgc3R5bGluZyBhcHBsaWVkIHRvIHRoZSBob3N0IGVsZW1lbnQgb25jZVxuICogYGVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5YCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHN0eWxlSW5kZXggSW5kZXggb2Ygc3R5bGUgdG8gdXBkYXRlLiBUaGlzIGluZGV4IHZhbHVlIHJlZmVycyB0byB0aGVcbiAqICAgICAgICBpbmRleCBvZiB0aGUgc3R5bGUgaW4gdGhlIHN0eWxlIGJpbmRpbmdzIGFycmF5IHRoYXQgd2FzIHBhc3NlZCBpbnRvXG4gKiAgICAgICAgYGVsZW1lbnRIb3N0U3R5bGluZ2AuXG4gKiBAcGFyYW0gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlIChmYWxzeSB0byByZW1vdmUpLiBUaGUgdmFsdWUgbWF5IG9yIG1heSBub3RcbiAqICAgICAgICBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IGRlcGVuZGluZyBvbiB0aGUgdGVtcGxhdGUvY29tcG9uZW50L2RpcmVjdGl2ZVxuICogICAgICAgIHByaW9yaXRpemF0aW9uIChzZWUgYGludGVyZmFjZXMvc3R5bGluZy50c2ApXG4gKiBAcGFyYW0gc3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLlxuICogICAgICAgIE5vdGUgdGhhdCB3aGVuIGEgc3VmZml4IGlzIHByb3ZpZGVkIHRoZW4gdGhlIHVuZGVybHlpbmcgc2FuaXRpemVyIHdpbGxcbiAqICAgICAgICBiZSBpZ25vcmVkLlxuICogQHBhcmFtIGZvcmNlT3ZlcnJpZGUgV2hldGhlciBvciBub3QgdG8gdXBkYXRlIHRoZSBzdHlsaW5nIHZhbHVlIGltbWVkaWF0ZWx5XG4gKiAgICAgICAgKGRlc3BpdGUgdGhlIG90aGVyIGJpbmRpbmdzIHBvc3NpYmx5IGhhdmluZyBwcmlvcml0eSlcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZWxlbWVudEhvc3RTdHlsZVByb3Aoc3R5bGVJbmRleCwgdmFsdWUsIHN1ZmZpeCwgZm9yY2VPdmVycmlkZSkge1xuICAgIHZhciBkaXJlY3RpdmVTdHlsaW5nSW5kZXggPSBnZXRBY3RpdmVEaXJlY3RpdmVTdHlsaW5nSW5kZXgoKTtcbiAgICB2YXIgaG9zdEVsZW1lbnRJbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICB2YXIgc3R5bGluZ0NvbnRleHQgPSBnZXRTdHlsaW5nQ29udGV4dChob3N0RWxlbWVudEluZGV4LCBnZXRMVmlldygpKTtcbiAgICB2YXIgdmFsdWVUb0FkZCA9IHJlc29sdmVTdHlsZVByb3BWYWx1ZSh2YWx1ZSwgc3VmZml4KTtcbiAgICB2YXIgYXJncyA9IFtzdHlsaW5nQ29udGV4dCwgc3R5bGVJbmRleCwgdmFsdWVUb0FkZCwgZGlyZWN0aXZlU3R5bGluZ0luZGV4LCBmb3JjZU92ZXJyaWRlXTtcbiAgICBlbnF1ZXVlSG9zdEluc3RydWN0aW9uKHN0eWxpbmdDb250ZXh0LCBkaXJlY3RpdmVTdHlsaW5nSW5kZXgsIHVwZGF0ZVN0eWxlUHJvcCwgYXJncyk7XG59XG5mdW5jdGlvbiByZXNvbHZlU3R5bGVQcm9wVmFsdWUodmFsdWUsIHN1ZmZpeCkge1xuICAgIHZhciB2YWx1ZVRvQWRkID0gbnVsbDtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN1ZmZpeCkge1xuICAgICAgICAgICAgLy8gd2hlbiBhIHN1ZmZpeCBpcyBhcHBsaWVkIHRoZW4gaXQgd2lsbCBieXBhc3NcbiAgICAgICAgICAgIC8vIHNhbml0aXphdGlvbiBlbnRpcmVseSAoYi9jIGEgbmV3IHN0cmluZyBpcyBjcmVhdGVkKVxuICAgICAgICAgICAgdmFsdWVUb0FkZCA9IHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkgKyBzdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBzYW5pdGl6YXRpb24gaGFwcGVucyBieSBkZWFsaW5nIHdpdGggYSBTdHJpbmcgdmFsdWVcbiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGludG8gdGhlIHN0eWxlIHJlbmRlcmluZyBsYXRlciAod2hpY2ggaXMgd2hlcmUgdGhlIHZhbHVlXG4gICAgICAgICAgICAvLyB3aWxsIGJlIHNhbml0aXplZCBiZWZvcmUgaXQgaXMgYXBwbGllZClcbiAgICAgICAgICAgIHZhbHVlVG9BZGQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVUb0FkZDtcbn1cbi8qKlxuICogVXBkYXRlIGEgY2xhc3MgYmluZGluZyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLlxuICpcbiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gaGFuZGxlIHRoZSBgW2NsYXNzLmZvb109XCJleHBcImAgY2FzZSBhbmQsXG4gKiB0aGVyZWZvcmUsIHRoZSBjbGFzcyBiaW5kaW5nIGl0c2VsZiBtdXN0IGFscmVhZHkgYmUgYWxsb2NhdGVkIHVzaW5nXG4gKiBgZWxlbWVudFN0eWxpbmdgIHdpdGhpbiB0aGUgY3JlYXRpb24gYmxvY2suXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3Mgd2l0aCB3aGljaCBzdHlsaW5nIGlzIGFzc29jaWF0ZWQuXG4gKiBAcGFyYW0gY2xhc3NJbmRleCBJbmRleCBvZiBjbGFzcyB0byB0b2dnbGUuIFRoaXMgaW5kZXggdmFsdWUgcmVmZXJzIHRvIHRoZVxuICogICAgICAgIGluZGV4IG9mIHRoZSBjbGFzcyBpbiB0aGUgY2xhc3MgYmluZGluZ3MgYXJyYXkgdGhhdCB3YXMgcGFzc2VkIGludG9cbiAqICAgICAgICBgZWxlbWVudFN0eWxpbmdgICh3aGljaCBpcyBtZWFudCB0byBiZSBjYWxsZWQgYmVmb3JlIHRoaXNcbiAqICAgICAgICBmdW5jdGlvbiBpcykuXG4gKiBAcGFyYW0gdmFsdWUgQSB0cnVlL2ZhbHNlIHZhbHVlIHdoaWNoIHdpbGwgdHVybiB0aGUgY2xhc3Mgb24gb3Igb2ZmLlxuICogQHBhcmFtIGZvcmNlT3ZlcnJpZGUgV2hldGhlciBvciBub3QgdGhpcyB2YWx1ZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzc1xuICogICAgICAgIG9mIHdoZXJlIGl0IGlzIGJlaW5nIHNldCB3aXRoaW4gdGhlIHN0eWxpbmcgcHJpb3JpdHkgc3RydWN0dXJlLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVlbGVtZW50Q2xhc3NQcm9wKGluZGV4LCBjbGFzc0luZGV4LCB2YWx1ZSwgZm9yY2VPdmVycmlkZSkge1xuICAgIHZhciBpbnB1dCA9ICh2YWx1ZSBpbnN0YW5jZW9mIEJvdW5kUGxheWVyRmFjdG9yeSkgP1xuICAgICAgICB2YWx1ZSA6XG4gICAgICAgIGJvb2xlYW5Pck51bGwodmFsdWUpO1xuICAgIHZhciBzdHlsaW5nQ29udGV4dCA9IGdldFN0eWxpbmdDb250ZXh0KGluZGV4LCBnZXRMVmlldygpKTtcbiAgICB1cGRhdGVDbGFzc1Byb3Aoc3R5bGluZ0NvbnRleHQsIGNsYXNzSW5kZXgsIGlucHV0LCBERUZBVUxUX1RFTVBMQVRFX0RJUkVDVElWRV9JTkRFWCwgZm9yY2VPdmVycmlkZSk7XG59XG4vKipcbiAqIFVwZGF0ZSBhIGNsYXNzIGhvc3QgYmluZGluZyBmb3IgYSBkaXJlY3RpdmUncy9jb21wb25lbnQncyBob3N0IGVsZW1lbnQgd2l0aGluXG4gKiB0aGUgaG9zdCBiaW5kaW5ncyBmdW5jdGlvbi5cbiAqXG4gKiBUaGlzIGluc3RydWN0aW9uIGlzIG1lYW50IHRvIGhhbmRsZSB0aGUgYEBIb3N0QmluZGluZygnY2xhc3MuZm9vJylgIGNhc2UgYW5kLFxuICogdGhlcmVmb3JlLCB0aGUgY2xhc3MgYmluZGluZyBpdHNlbGYgbXVzdCBhbHJlYWR5IGJlIGFsbG9jYXRlZCB1c2luZ1xuICogYGVsZW1lbnRIb3N0U3R5bGluZ2Agd2l0aGluIHRoZSBjcmVhdGlvbiBibG9jay5cbiAqXG4gKiBAcGFyYW0gY2xhc3NJbmRleCBJbmRleCBvZiBjbGFzcyB0byB0b2dnbGUuIFRoaXMgaW5kZXggdmFsdWUgcmVmZXJzIHRvIHRoZVxuICogICAgICAgIGluZGV4IG9mIHRoZSBjbGFzcyBpbiB0aGUgY2xhc3MgYmluZGluZ3MgYXJyYXkgdGhhdCB3YXMgcGFzc2VkIGludG9cbiAqICAgICAgICBgZWxlbWVudEhvc3RTdGx5aW5nYCAod2hpY2ggaXMgbWVhbnQgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGlzXG4gKiAgICAgICAgZnVuY3Rpb24gaXMpLlxuICogQHBhcmFtIHZhbHVlIEEgdHJ1ZS9mYWxzZSB2YWx1ZSB3aGljaCB3aWxsIHR1cm4gdGhlIGNsYXNzIG9uIG9yIG9mZi5cbiAqIEBwYXJhbSBmb3JjZU92ZXJyaWRlIFdoZXRoZXIgb3Igbm90IHRoaXMgdmFsdWUgd2lsbCBiZSBhcHBsaWVkIHJlZ2FyZGxlc3NcbiAqICAgICAgICBvZiB3aGVyZSBpdCBpcyBiZWluZyBzZXQgd2l0aGluIHRoZSBzdHlsaW5ncyBwcmlvcml0eSBzdHJ1Y3R1cmUuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRIb3N0Q2xhc3NQcm9wKGNsYXNzSW5kZXgsIHZhbHVlLCBmb3JjZU92ZXJyaWRlKSB7XG4gICAgdmFyIGRpcmVjdGl2ZVN0eWxpbmdJbmRleCA9IGdldEFjdGl2ZURpcmVjdGl2ZVN0eWxpbmdJbmRleCgpO1xuICAgIHZhciBob3N0RWxlbWVudEluZGV4ID0gZ2V0U2VsZWN0ZWRJbmRleCgpO1xuICAgIHZhciBzdHlsaW5nQ29udGV4dCA9IGdldFN0eWxpbmdDb250ZXh0KGhvc3RFbGVtZW50SW5kZXgsIGdldExWaWV3KCkpO1xuICAgIHZhciBpbnB1dCA9ICh2YWx1ZSBpbnN0YW5jZW9mIEJvdW5kUGxheWVyRmFjdG9yeSkgP1xuICAgICAgICB2YWx1ZSA6XG4gICAgICAgIGJvb2xlYW5Pck51bGwodmFsdWUpO1xuICAgIHZhciBhcmdzID0gW3N0eWxpbmdDb250ZXh0LCBjbGFzc0luZGV4LCBpbnB1dCwgZGlyZWN0aXZlU3R5bGluZ0luZGV4LCBmb3JjZU92ZXJyaWRlXTtcbiAgICBlbnF1ZXVlSG9zdEluc3RydWN0aW9uKHN0eWxpbmdDb250ZXh0LCBkaXJlY3RpdmVTdHlsaW5nSW5kZXgsIHVwZGF0ZUNsYXNzUHJvcCwgYXJncyk7XG59XG5mdW5jdGlvbiBib29sZWFuT3JOdWxsKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlID8gdHJ1ZSA6IG51bGw7XG59XG4vKipcbiAqIFVwZGF0ZSBzdHlsZSBhbmQvb3IgY2xhc3MgYmluZGluZ3MgdXNpbmcgb2JqZWN0IGxpdGVyYWxzIG9uIGFuIGVsZW1lbnQuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBhcHBseSBzdHlsaW5nIHZpYSB0aGUgYFtzdHlsZV09XCJleHBcImAgYW5kIGBbY2xhc3NdPVwiZXhwXCJgIHRlbXBsYXRlXG4gKiBiaW5kaW5ncy4gV2hlbiBzdHlsZXMvY2xhc3NlcyBhcmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCB0aGV5IHdpbGwgdGhlbiBiZSB1cGRhdGVkIHdpdGhcbiAqIHJlc3BlY3QgdG8gYW55IHN0eWxlcy9jbGFzc2VzIHNldCB3aXRoIGBlbGVtZW50U3R5bGVQcm9wYCBvciBgZWxlbWVudENsYXNzUHJvcGAuIElmIGFueVxuICogc3R5bGVzIG9yIGNsYXNzZXMgYXJlIHNldCB0byBmYWxzeSB0aGVuIHRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBzdHlsaW5nIGluc3RydWN0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQgdW50aWwgYGVsZW1lbnRTdHlsaW5nQXBwbHlgIGlzIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIGVsZW1lbnQncyB3aXRoIHdoaWNoIHN0eWxpbmcgaXMgYXNzb2NpYXRlZC5cbiAqIEBwYXJhbSBjbGFzc2VzIEEga2V5L3ZhbHVlIG1hcCBvciBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuICogICAgICAgIGdpdmVuIGVsZW1lbnQuIEFueSBtaXNzaW5nIGNsYXNzZXMgKHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICogICAgICAgIGJlZm9yZWhhbmQpIHdpbGwgYmUgcmVtb3ZlZCAodW5zZXQpIGZyb20gdGhlIGVsZW1lbnQncyBsaXN0IG9mIENTUyBjbGFzc2VzLlxuICogQHBhcmFtIHN0eWxlcyBBIGtleS92YWx1ZSBzdHlsZSBtYXAgb2YgdGhlIHN0eWxlcyB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAqICAgICAgICBBbnkgbWlzc2luZyBzdHlsZXMgKHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCBiZWZvcmVoYW5kKSB3aWxsIGJlXG4gKiAgICAgICAgcmVtb3ZlZCAodW5zZXQpIGZyb20gdGhlIGVsZW1lbnQncyBzdHlsaW5nLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVlbGVtZW50U3R5bGluZ01hcChpbmRleCwgY2xhc3Nlcywgc3R5bGVzKSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgc3R5bGluZ0NvbnRleHQgPSBnZXRTdHlsaW5nQ29udGV4dChpbmRleCwgbFZpZXcpO1xuICAgIHZhciB0Tm9kZSA9IGdldFROb2RlKGluZGV4LCBsVmlldyk7XG4gICAgLy8gaW5wdXRzIGFyZSBvbmx5IGV2YWx1YXRlZCBmcm9tIGEgdGVtcGxhdGUgYmluZGluZyBpbnRvIGEgZGlyZWN0aXZlLCB0aGVyZWZvcmUsXG4gICAgLy8gdGhlcmUgc2hvdWxkIG5vdCBiZSBhIHNpdHVhdGlvbiB3aGVyZSBhIGRpcmVjdGl2ZSBob3N0IGJpbmRpbmdzIGZ1bmN0aW9uXG4gICAgLy8gZXZhbHVhdGVzIHRoZSBpbnB1dHMgKHRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbilcbiAgICBpZiAoaGFzQ2xhc3NJbnB1dCh0Tm9kZSkgJiYgY2xhc3NlcyAhPT0gTk9fQ0hBTkdFKSB7XG4gICAgICAgIHZhciBpbml0aWFsQ2xhc3NlcyA9IGdldEluaXRpYWxDbGFzc05hbWVWYWx1ZShzdHlsaW5nQ29udGV4dCk7XG4gICAgICAgIHZhciBjbGFzc0lucHV0VmFsID0gKGluaXRpYWxDbGFzc2VzLmxlbmd0aCA/IChpbml0aWFsQ2xhc3NlcyArICcgJykgOiAnJykgKyBmb3JjZUNsYXNzZXNBc1N0cmluZyhjbGFzc2VzKTtcbiAgICAgICAgc2V0SW5wdXRzRm9yUHJvcGVydHkobFZpZXcsIHROb2RlLmlucHV0c1snY2xhc3MnXSwgY2xhc3NJbnB1dFZhbCk7XG4gICAgICAgIGNsYXNzZXMgPSBOT19DSEFOR0U7XG4gICAgfVxuICAgIGlmIChoYXNTdHlsZUlucHV0KHROb2RlKSAmJiBzdHlsZXMgIT09IE5PX0NIQU5HRSkge1xuICAgICAgICB2YXIgaW5pdGlhbFN0eWxlcyA9IGdldEluaXRpYWxDbGFzc05hbWVWYWx1ZShzdHlsaW5nQ29udGV4dCk7XG4gICAgICAgIHZhciBzdHlsZUlucHV0VmFsID0gKGluaXRpYWxTdHlsZXMubGVuZ3RoID8gKGluaXRpYWxTdHlsZXMgKyAnICcpIDogJycpICsgZm9yY2VTdHlsZXNBc1N0cmluZyhzdHlsZXMpO1xuICAgICAgICBzZXRJbnB1dHNGb3JQcm9wZXJ0eShsVmlldywgdE5vZGUuaW5wdXRzWydzdHlsZSddLCBzdHlsZUlucHV0VmFsKTtcbiAgICAgICAgc3R5bGVzID0gTk9fQ0hBTkdFO1xuICAgIH1cbiAgICB1cGRhdGVTdHlsaW5nTWFwKHN0eWxpbmdDb250ZXh0LCBjbGFzc2VzLCBzdHlsZXMpO1xufVxuLyoqXG4gKiBVcGRhdGUgc3R5bGUgYW5kL29yIGNsYXNzIGhvc3QgYmluZGluZ3MgdXNpbmcgb2JqZWN0IGxpdGVyYWxzIG9uIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBob3N0XG4gKiBiaW5kaW5ncyBmdW5jdGlvbiBmb3IgYSBkaXJlY3RpdmUvY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gYXBwbHkgc3R5bGluZyB2aWEgdGhlIGBASG9zdEJpbmRpbmcoJ3N0eWxlJylgIGFuZFxuICogYEBIb3N0QmluZGluZygnY2xhc3MnKWAgYmluZGluZ3MgZm9yIGEgY29tcG9uZW50J3Mgb3IgZGlyZWN0aXZlJ3MgaG9zdCBlbGVtZW50LlxuICogV2hlbiBzdHlsZXMvY2xhc3NlcyBhcmUgYXBwbGllZCB0byB0aGUgaG9zdCBlbGVtZW50IHRoZXkgd2lsbCB0aGVuIGJlIHVwZGF0ZWRcbiAqIHdpdGggcmVzcGVjdCB0byBhbnkgc3R5bGVzL2NsYXNzZXMgc2V0IHdpdGggYGVsZW1lbnRIb3N0U3R5bGVQcm9wYCBvclxuICogYGVsZW1lbnRIb3N0Q2xhc3NQcm9wYC4gSWYgYW55IHN0eWxlcyBvciBjbGFzc2VzIGFyZSBzZXQgdG8gZmFsc3kgdGhlbiB0aGV5XG4gKiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gd2lsbCBub3QgYmUgYXBwbGllZCB1bnRpbFxuICogYGVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5YCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIGNsYXNzZXMgQSBrZXkvdmFsdWUgbWFwIG9yIHN0cmluZyBvZiBDU1MgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4gKiAgICAgICAgZ2l2ZW4gZWxlbWVudC4gQW55IG1pc3NpbmcgY2xhc3NlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50XG4gKiAgICAgICAgYmVmb3JlaGFuZCkgd2lsbCBiZSByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIGxpc3Qgb2YgQ1NTIGNsYXNzZXMuXG4gKiBAcGFyYW0gc3R5bGVzIEEga2V5L3ZhbHVlIHN0eWxlIG1hcCBvZiB0aGUgc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICogICAgICAgIEFueSBtaXNzaW5nIHN0eWxlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IGJlZm9yZWhhbmQpIHdpbGwgYmVcbiAqICAgICAgICByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIHN0eWxpbmcuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRIb3N0U3R5bGluZ01hcChjbGFzc2VzLCBzdHlsZXMpIHtcbiAgICB2YXIgZGlyZWN0aXZlU3R5bGluZ0luZGV4ID0gZ2V0QWN0aXZlRGlyZWN0aXZlU3R5bGluZ0luZGV4KCk7XG4gICAgdmFyIGhvc3RFbGVtZW50SW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHQoaG9zdEVsZW1lbnRJbmRleCwgZ2V0TFZpZXcoKSk7XG4gICAgdmFyIGFyZ3MgPSBbc3R5bGluZ0NvbnRleHQsIGNsYXNzZXMsIHN0eWxlcywgZGlyZWN0aXZlU3R5bGluZ0luZGV4XTtcbiAgICBlbnF1ZXVlSG9zdEluc3RydWN0aW9uKHN0eWxpbmdDb250ZXh0LCBkaXJlY3RpdmVTdHlsaW5nSW5kZXgsIHVwZGF0ZVN0eWxpbmdNYXAsIGFyZ3MpO1xufVxuLyoqXG4gKiBBcHBseSBhbGwgc3R5bGUgYW5kIGNsYXNzIGJpbmRpbmcgdmFsdWVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gYmUgcnVuIGFmdGVyIGBlbGVtZW50U3R5bGluZ01hcGAsIGBlbGVtZW50U3R5bGVQcm9wYFxuICogb3IgYGVsZW1lbnRDbGFzc1Byb3BgIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gcnVuIGFuZCB3aWxsIG9ubHkgYXBwbHkgc3R5bGluZyB0b1xuICogdGhlIGVsZW1lbnQgaWYgYW55IHN0eWxpbmcgYmluZGluZ3MgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3Mgd2l0aCB3aGljaCBzdHlsaW5nIGlzIGFzc29jaWF0ZWQuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRTdHlsaW5nQXBwbHkoaW5kZXgpIHtcbiAgICBlbGVtZW50U3R5bGluZ0FwcGx5SW50ZXJuYWwoREVGQVVMVF9URU1QTEFURV9ESVJFQ1RJVkVfSU5ERVgsIGluZGV4KTtcbn1cbi8qKlxuICogQXBwbHkgYWxsIHN0eWxlIGFuZCBjbGFzcyBob3N0IGJpbmRpbmcgdmFsdWVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gYmUgcnVuIGFmdGVyIGBlbGVtZW50SG9zdFN0eWxpbmdNYXBgLFxuICogYGVsZW1lbnRIb3N0U3R5bGVQcm9wYCBvciBgZWxlbWVudEhvc3RDbGFzc1Byb3BgIGluc3RydWN0aW9ucyBoYXZlXG4gKiBiZWVuIHJ1biBhbmQgd2lsbCBvbmx5IGFwcGx5IHN0eWxpbmcgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiBhbnlcbiAqIHN0eWxpbmcgYmluZGluZ3MgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5KCkge1xuICAgIGVsZW1lbnRTdHlsaW5nQXBwbHlJbnRlcm5hbChnZXRBY3RpdmVEaXJlY3RpdmVTdHlsaW5nSW5kZXgoKSwgZ2V0U2VsZWN0ZWRJbmRleCgpKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRTdHlsaW5nQXBwbHlJbnRlcm5hbChkaXJlY3RpdmVTdHlsaW5nSW5kZXgsIGluZGV4KSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgdE5vZGUgPSBnZXRUTm9kZShpbmRleCwgbFZpZXcpO1xuICAgIC8vIGlmIGEgbm9uLWVsZW1lbnQgdmFsdWUgaXMgYmVpbmcgcHJvY2Vzc2VkIHRoZW4gd2UgY2FuJ3QgcmVuZGVyIHZhbHVlc1xuICAgIC8vIG9uIHRoZSBlbGVtZW50IGF0IGFsbCB0aGVyZWZvcmUgYnkgc2V0dGluZyB0aGUgcmVuZGVyZXIgdG8gbnVsbCB0aGVuXG4gICAgLy8gdGhlIHN0eWxpbmcgYXBwbHkgY29kZSBrbm93cyBub3QgdG8gYWN0dWFsbHkgYXBwbHkgdGhlIHZhbHVlcy4uLlxuICAgIHZhciByZW5kZXJlciA9IHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyA/IGxWaWV3W1JFTkRFUkVSXSA6IG51bGw7XG4gICAgdmFyIGlzRmlyc3RSZW5kZXIgPSAobFZpZXdbRkxBR1NdICYgOCAvKiBGaXJzdExWaWV3UGFzcyAqLykgIT09IDA7XG4gICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHQoaW5kZXgsIGxWaWV3KTtcbiAgICB2YXIgdG90YWxQbGF5ZXJzUXVldWVkID0gcmVuZGVyU3R5bGluZyhzdHlsaW5nQ29udGV4dCwgcmVuZGVyZXIsIGxWaWV3LCBpc0ZpcnN0UmVuZGVyLCBudWxsLCBudWxsLCBkaXJlY3RpdmVTdHlsaW5nSW5kZXgpO1xuICAgIGlmICh0b3RhbFBsYXllcnNRdWV1ZWQgPiAwKSB7XG4gICAgICAgIHZhciByb290Q29udGV4dCA9IGdldFJvb3RDb250ZXh0KGxWaWV3KTtcbiAgICAgICAgc2NoZWR1bGVUaWNrKHJvb3RDb250ZXh0LCAyIC8qIEZsdXNoUGxheWVycyAqLyk7XG4gICAgfVxuICAgIC8vIGJlY2F1c2Ugc2VsZWN0KG4pIG1heSBub3QgcnVuIGJldHdlZW4gZXZlcnkgaW5zdHJ1Y3Rpb24sIHRoZSBjYWNoZWQgc3R5bGluZ1xuICAgIC8vIGNvbnRleHQgbWF5IG5vdCBnZXQgY2xlYXJlZCBiZXR3ZWVuIGVsZW1lbnRzLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGJlY2F1c2VcbiAgICAvLyBzdHlsaW5nIGJpbmRpbmdzIChsaWtlIGBbc3R5bGVdYCBhbmQgYFtjbGFzc11gKSBhcmUgbm90IHJlY29nbml6ZWQgYXMgcHJvcGVydHlcbiAgICAvLyBiaW5kaW5ncyBieSBkZWZhdWx0IHNvIGEgc2VsZWN0KG4pIGluc3RydWN0aW9uIGlzIG5vdCBnZW5lcmF0ZWQuIFRvIGVuc3VyZSB0aGVcbiAgICAvLyBjb250ZXh0IGlzIGxvYWRlZCBjb3JyZWN0bHkgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdGhlIGNhY2hlIGJlbG93IGlzIHByZS1lbXB0aXZlbHlcbiAgICAvLyBjbGVhcmVkIGJlY2F1c2UgdGhlcmUgaXMgbm8gY29kZSBpbiBBbmd1bGFyIHRoYXQgYXBwbGllcyBtb3JlIHN0eWxpbmcgY29kZSBhZnRlciBhXG4gICAgLy8gc3R5bGluZyBmbHVzaCBoYXMgb2NjdXJyZWQuIE5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgZml4ZWQgb25jZSBGVy0xMjU0IGxhbmRzLlxuICAgIHNldENhY2hlZFN0eWxpbmdDb250ZXh0KG51bGwpO1xufVxuZnVuY3Rpb24gZ2V0QWN0aXZlRGlyZWN0aXZlU3R5bGluZ0luZGV4KCkge1xuICAgIC8vIHdoZW5ldmVyIGEgZGlyZWN0aXZlJ3MgaG9zdEJpbmRpbmdzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhIHVuaXF1ZUlkIHZhbHVlXG4gICAgLy8gaXMgYXNzaWduZWQuIE5vcm1hbGx5IHRoaXMgaXMgZW5vdWdoIHRvIGhlbHAgZGlzdGluZ3Vpc2ggb25lIGRpcmVjdGl2ZVxuICAgIC8vIGZyb20gYW5vdGhlciBmb3IgdGhlIHN0eWxpbmcgY29udGV4dCwgYnV0IHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIGFcbiAgICAvLyBzdWItY2xhc3MgZGlyZWN0aXZlIGNvdWxkIGluaGVyaXQgYW5kIGFzc2lnbiBzdHlsaW5nIGluIGNvbmNlcnQgd2l0aCBhXG4gICAgLy8gcGFyZW50IGRpcmVjdGl2ZS4gVG8gaGVscCB0aGUgc3R5bGluZyBjb2RlIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBwYXJlbnRcbiAgICAvLyBzdWItY2xhc3NlZCBkaXJlY3RpdmUgdGhlIGluaGVyaXRhbmNlIGRlcHRoIGlzIHRha2VuIGludG8gYWNjb3VudCBhcyB3ZWxsLlxuICAgIHJldHVybiBnZXRBY3RpdmVEaXJlY3RpdmVJZCgpICsgZ2V0QWN0aXZlRGlyZWN0aXZlU3VwZXJDbGFzc0RlcHRoKCk7XG59XG5mdW5jdGlvbiBnZXRTdHlsaW5nQ29udGV4dChpbmRleCwgbFZpZXcpIHtcbiAgICB2YXIgY29udGV4dCA9IGdldENhY2hlZFN0eWxpbmdDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBnZXRTdHlsaW5nQ29udGV4dEZyb21MVmlldyhpbmRleCArIEhFQURFUl9PRkZTRVQsIGxWaWV3KTtcbiAgICAgICAgc2V0Q2FjaGVkU3R5bGluZ0NvbnRleHQoY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5nRGV2TW9kZSkge1xuICAgICAgICB2YXIgYWN0dWFsQ29udGV4dCA9IGdldFN0eWxpbmdDb250ZXh0RnJvbUxWaWV3KGluZGV4ICsgSEVBREVSX09GRlNFVCwgbFZpZXcpO1xuICAgICAgICBhc3NlcnRFcXVhbChjb250ZXh0LCBhY3R1YWxDb250ZXh0LCAnVGhlIGNhY2hlZCBzdHlsaW5nIGNvbnRleHQgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBDcmVhdGUgRE9NIGVsZW1lbnQuIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50RW5kKClgIGNhbGwuXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheVxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgRE9NIE5vZGVcbiAqIEBwYXJhbSBhdHRycyBTdGF0aWNhbGx5IGJvdW5kIHNldCBvZiBhdHRyaWJ1dGVzLCBjbGFzc2VzLCBhbmQgc3R5bGVzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgRE9NXG4gKiAgICAgICAgICAgICAgZWxlbWVudCBvbiBjcmVhdGlvbi4gVXNlIFtBdHRyaWJ1dGVNYXJrZXJdIHRvIGRlbm90ZSB0aGUgbWVhbmluZyBvZiB0aGlzIGFycmF5LlxuICogQHBhcmFtIGxvY2FsUmVmcyBBIHNldCBvZiBsb2NhbCByZWZlcmVuY2UgYmluZGluZ3Mgb24gdGhlIGVsZW1lbnQuXG4gKlxuICogQXR0cmlidXRlcyBhbmQgbG9jYWxSZWZzIGFyZSBwYXNzZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGVyZSBlbGVtZW50cyB3aXRoIGFuIGV2ZW4gaW5kZXhcbiAqIGhvbGQgYW4gYXR0cmlidXRlIG5hbWUgYW5kIGVsZW1lbnRzIHdpdGggYW4gb2RkIGluZGV4IGhvbGQgYW4gYXR0cmlidXRlIHZhbHVlLCBleC46XG4gKiBbJ2lkJywgJ3dhcm5pbmc1JywgJ2NsYXNzJywgJ2FsZXJ0J11cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZWxlbWVudFN0YXJ0KGluZGV4LCBuYW1lLCBhdHRycywgbG9jYWxSZWZzKSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGxWaWV3W0JJTkRJTkdfSU5ERVhdLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2VsZW1lbnRzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MgJyk7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKztcbiAgICB2YXIgbmF0aXZlID0gZWxlbWVudENyZWF0ZShuYW1lKTtcbiAgICB2YXIgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCAtIDEpO1xuICAgIHZhciB0Tm9kZSA9IGNyZWF0ZU5vZGVBdEluZGV4KGluZGV4LCAzIC8qIEVsZW1lbnQgKi8sIG5hdGl2ZSwgbmFtZSwgYXR0cnMgfHwgbnVsbCk7XG4gICAgdmFyIGluaXRpYWxTdHlsZXNJbmRleCA9IDA7XG4gICAgdmFyIGluaXRpYWxDbGFzc2VzSW5kZXggPSAwO1xuICAgIGlmIChhdHRycykge1xuICAgICAgICB2YXIgbGFzdEF0dHJJbmRleCA9IHNldFVwQXR0cmlidXRlcyhuYXRpdmUsIGF0dHJzKTtcbiAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdG8gb25seSBwcmVwYXJlIHN0eWxpbmctcmVsYXRlZCBkYXRhc3RydWN0dXJlcyBvbmNlIGZvciBhIGdpdmVuXG4gICAgICAgIC8vIHROb2RlIGFuZCBub3QgZWFjaCB0aW1lIGFuIGVsZW1lbnQgaXMgY3JlYXRlZC4gQWxzbywgdGhlIHN0eWxpbmcgY29kZSBpcyBkZXNpZ25lZFxuICAgICAgICAvLyB0byBiZSBwYXRjaGVkIGFuZCBjb25zdHJ1Y3RlZCBhdCB2YXJpb3VzIHBvaW50cywgYnV0IG9ubHkgdXAgdW50aWwgdGhlIHN0eWxpbmdcbiAgICAgICAgLy8gdGVtcGxhdGUgaXMgZmlyc3QgYWxsb2NhdGVkICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlIHZlcnkgZmlyc3Qgc3R5bGUvY2xhc3MgYmluZGluZ1xuICAgICAgICAvLyB2YWx1ZSBpcyBldmFsdWF0ZWQpLiBXaGVuIHRoZSB0ZW1wbGF0ZSBpcyBhbGxvY2F0ZWQgKHdoZW4gaXQgdHVybnMgaW50byBhIGNvbnRleHQpXG4gICAgICAgIC8vIHRoZW4gdGhlIHN0eWxpbmcgdGVtcGxhdGUgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZCAoaXQgY2FuIG9ubHkgYmVcbiAgICAgICAgLy8gaW5zdGFudGlhdGVkIGludG8gYSBjb250ZXh0IHBlciBlbGVtZW50KVxuICAgICAgICBzZXROb2RlU3R5bGluZ1RlbXBsYXRlKHRWaWV3LCB0Tm9kZSwgYXR0cnMsIGxhc3RBdHRySW5kZXgpO1xuICAgICAgICBpZiAodE5vZGUuc3R5bGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCBzdHlsZS9jbGFzcyB2YWx1ZXMgYXJlIHJlbmRlcmVkIGltbWVkaWF0ZWx5IGFmdGVyIGhhdmluZyBiZWVuXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplZCBpbnRvIHRoZSBjb250ZXh0IHNvIHRoZSBlbGVtZW50IHN0eWxpbmcgaXMgcmVhZHkgd2hlbiBkaXJlY3RpdmVzXG4gICAgICAgICAgICAvLyBhcmUgaW5pdGlhbGl6ZWQgKHNpbmNlIHRoZXkgbWF5IHJlYWQgc3R5bGUvY2xhc3MgdmFsdWVzIGluIHRoZWlyIGNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgaW5pdGlhbFN0eWxlc0luZGV4ID0gcmVuZGVySW5pdGlhbFN0eWxlcyhuYXRpdmUsIHROb2RlLnN0eWxpbmdUZW1wbGF0ZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaW5pdGlhbENsYXNzZXNJbmRleCA9IHJlbmRlckluaXRpYWxDbGFzc2VzKG5hdGl2ZSwgdE5vZGUuc3R5bGluZ1RlbXBsYXRlLCByZW5kZXJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwZW5kQ2hpbGQobmF0aXZlLCB0Tm9kZSwgbFZpZXcpO1xuICAgIGNyZWF0ZURpcmVjdGl2ZXNBbmRMb2NhbHModFZpZXcsIGxWaWV3LCBsb2NhbFJlZnMpO1xuICAgIC8vIGFueSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBjb21wb25lbnQgb3IgdGVtcGxhdGUgY29udGFpbmVyIG11c3QgYmUgcHJlLWVtcHRpdmVseVxuICAgIC8vIG1vbmtleS1wYXRjaGVkIHdpdGggdGhlIGNvbXBvbmVudCB2aWV3IGRhdGEgc28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUgaW5zcGVjdGVkXG4gICAgLy8gbGF0ZXIgb24gdXNpbmcgYW55IGVsZW1lbnQgZGlzY292ZXJ5IHV0aWxpdHkgbWV0aG9kcyAoc2VlIGBlbGVtZW50X2Rpc2NvdmVyeS50c2ApXG4gICAgaWYgKGdldEVsZW1lbnREZXB0aENvdW50KCkgPT09IDApIHtcbiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpO1xuICAgIH1cbiAgICBpbmNyZWFzZUVsZW1lbnREZXB0aENvdW50KCk7XG4gICAgLy8gaWYgYSBkaXJlY3RpdmUgY29udGFpbnMgYSBob3N0IGJpbmRpbmcgZm9yIFwiY2xhc3NcIiB0aGVuIGFsbCBjbGFzcy1iYXNlZCBkYXRhIHdpbGxcbiAgICAvLyBmbG93IHRocm91Z2ggdGhhdCAoZXhjZXB0IGZvciBgW2NsYXNzLnByb3BdYCBiaW5kaW5ncykuIFRoaXMgYWxzbyBpbmNsdWRlcyBpbml0aWFsXG4gICAgLy8gc3RhdGljIGNsYXNzIHZhbHVlcyBhcyB3ZWxsLiAoTm90ZSB0aGF0IHRoaXMgd2lsbCBiZSBmaXhlZCBvbmNlIG1hcC1iYXNlZCBgW3N0eWxlXWBcbiAgICAvLyBhbmQgYFtjbGFzc11gIGJpbmRpbmdzIHdvcmsgZm9yIG11bHRpcGxlIGRpcmVjdGl2ZXMuKVxuICAgIGlmICh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICB2YXIgaW5wdXREYXRhID0gaW5pdGlhbGl6ZVROb2RlSW5wdXRzKHROb2RlKTtcbiAgICAgICAgaWYgKGlucHV0RGF0YSAmJiBpbnB1dERhdGEuaGFzT3duUHJvcGVydHkoJ2NsYXNzJykpIHtcbiAgICAgICAgICAgIHROb2RlLmZsYWdzIHw9IDggLyogaGFzQ2xhc3NJbnB1dCAqLztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXREYXRhICYmIGlucHV0RGF0YS5oYXNPd25Qcm9wZXJ0eSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gMTYgLyogaGFzU3R5bGVJbnB1dCAqLztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyB3ZSByZW5kZXIgdGhlIHN0eWxpbmcgYWdhaW4gYmVsb3cgaW4gY2FzZSBhbnkgZGlyZWN0aXZlcyBoYXZlIHNldCBhbnkgYHN0eWxlYCBhbmQvb3JcbiAgICAvLyBgY2xhc3NgIGhvc3QgYXR0cmlidXRlIHZhbHVlcy4uLlxuICAgIGlmICh0Tm9kZS5zdHlsaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgcmVuZGVySW5pdGlhbENsYXNzZXMobmF0aXZlLCB0Tm9kZS5zdHlsaW5nVGVtcGxhdGUsIHJlbmRlcmVyLCBpbml0aWFsQ2xhc3Nlc0luZGV4KTtcbiAgICAgICAgcmVuZGVySW5pdGlhbFN0eWxlcyhuYXRpdmUsIHROb2RlLnN0eWxpbmdUZW1wbGF0ZSwgcmVuZGVyZXIsIGluaXRpYWxTdHlsZXNJbmRleCk7XG4gICAgfVxuICAgIHZhciBjdXJyZW50UXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdO1xuICAgIGlmIChjdXJyZW50UXVlcmllcykge1xuICAgICAgICBjdXJyZW50UXVlcmllcy5hZGROb2RlKHROb2RlKTtcbiAgICAgICAgbFZpZXdbUVVFUklFU10gPSBjdXJyZW50UXVlcmllcy5jbG9uZSgpO1xuICAgIH1cbiAgICBleGVjdXRlQ29udGVudFF1ZXJpZXModFZpZXcsIHROb2RlLCBsVmlldyk7XG59XG4vKipcbiAqIE1hcmsgdGhlIGVuZCBvZiB0aGUgZWxlbWVudC5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZWxlbWVudEVuZCgpIHtcbiAgICB2YXIgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7XG4gICAgaWYgKGdldElzUGFyZW50KCkpIHtcbiAgICAgICAgc2V0SXNQYXJlbnQoZmFsc2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEhhc1BhcmVudChnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSk7XG4gICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IHByZXZpb3VzT3JQYXJlbnRUTm9kZS5wYXJlbnQ7XG4gICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShwcmV2aW91c09yUGFyZW50VE5vZGUpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHJlcXVpcmVkIGZvciBhbGwgaG9zdC1sZXZlbCBzdHlsaW5nLXJlbGF0ZWQgaW5zdHJ1Y3Rpb25zIHRvIHJ1blxuICAgIC8vIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgcHJldmlvdXNPclBhcmVudFROb2RlLm9uRWxlbWVudENyZWF0aW9uRm5zICYmIGFwcGx5T25DcmVhdGVJbnN0cnVjdGlvbnMocHJldmlvdXNPclBhcmVudFROb2RlKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUocHJldmlvdXNPclBhcmVudFROb2RlLCAzIC8qIEVsZW1lbnQgKi8pO1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGN1cnJlbnRRdWVyaWVzID0gbFZpZXdbUVVFUklFU107XG4gICAgaWYgKGN1cnJlbnRRdWVyaWVzKSB7XG4gICAgICAgIGxWaWV3W1FVRVJJRVNdID0gY3VycmVudFF1ZXJpZXMucGFyZW50O1xuICAgIH1cbiAgICByZWdpc3RlclBvc3RPcmRlckhvb2tzKGdldExWaWV3KClbVFZJRVddLCBwcmV2aW91c09yUGFyZW50VE5vZGUpO1xuICAgIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKTtcbiAgICAvLyB0aGlzIGlzIGZpcmVkIGF0IHRoZSBlbmQgb2YgZWxlbWVudEVuZCBiZWNhdXNlIEFMTCBvZiB0aGUgc3R5bGluZ0JpbmRpbmdzIGNvZGVcbiAgICAvLyAoZm9yIGRpcmVjdGl2ZXMgYW5kIHRoZSB0ZW1wbGF0ZSkgaGF2ZSBub3cgZXhlY3V0ZWQgd2hpY2ggbWVhbnMgdGhlIHN0eWxpbmdcbiAgICAvLyBjb250ZXh0IGNhbiBiZSBpbnN0YW50aWF0ZWQgcHJvcGVybHkuXG4gICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gbnVsbDtcbiAgICBpZiAoaGFzQ2xhc3NJbnB1dChwcmV2aW91c09yUGFyZW50VE5vZGUpKSB7XG4gICAgICAgIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHRGcm9tTFZpZXcocHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4LCBsVmlldyk7XG4gICAgICAgIHNldElucHV0c0ZvclByb3BlcnR5KGxWaWV3LCBwcmV2aW91c09yUGFyZW50VE5vZGUuaW5wdXRzWydjbGFzcyddLCBnZXRJbml0aWFsQ2xhc3NOYW1lVmFsdWUoc3R5bGluZ0NvbnRleHQpKTtcbiAgICB9XG4gICAgaWYgKGhhc1N0eWxlSW5wdXQocHJldmlvdXNPclBhcmVudFROb2RlKSkge1xuICAgICAgICBzdHlsaW5nQ29udGV4dCA9XG4gICAgICAgICAgICBzdHlsaW5nQ29udGV4dCB8fCBnZXRTdHlsaW5nQ29udGV4dEZyb21MVmlldyhwcmV2aW91c09yUGFyZW50VE5vZGUuaW5kZXgsIGxWaWV3KTtcbiAgICAgICAgc2V0SW5wdXRzRm9yUHJvcGVydHkobFZpZXcsIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5pbnB1dHNbJ3N0eWxlJ10sIGdldEluaXRpYWxTdHlsZVN0cmluZ1ZhbHVlKHN0eWxpbmdDb250ZXh0KSk7XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGVtcHR5IGVsZW1lbnQgdXNpbmcge0BsaW5rIGVsZW1lbnRTdGFydH0gYW5kIHtAbGluayBlbGVtZW50RW5kfVxuICpcbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZGF0YSBhcnJheVxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgRE9NIE5vZGVcbiAqIEBwYXJhbSBhdHRycyBTdGF0aWNhbGx5IGJvdW5kIHNldCBvZiBhdHRyaWJ1dGVzLCBjbGFzc2VzLCBhbmQgc3R5bGVzIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgRE9NXG4gKiAgICAgICAgICAgICAgZWxlbWVudCBvbiBjcmVhdGlvbi4gVXNlIFtBdHRyaWJ1dGVNYXJrZXJdIHRvIGRlbm90ZSB0aGUgbWVhbmluZyBvZiB0aGlzIGFycmF5LlxuICogQHBhcmFtIGxvY2FsUmVmcyBBIHNldCBvZiBsb2NhbCByZWZlcmVuY2UgYmluZGluZ3Mgb24gdGhlIGVsZW1lbnQuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnQoaW5kZXgsIG5hbWUsIGF0dHJzLCBsb2NhbFJlZnMpIHtcbiAgICDJtcm1ZWxlbWVudFN0YXJ0KGluZGV4LCBuYW1lLCBhdHRycywgbG9jYWxSZWZzKTtcbiAgICDJtcm1ZWxlbWVudEVuZCgpO1xufVxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2YWx1ZSBvZiByZW1vdmVzIGFuIGF0dHJpYnV0ZSBvbiBhbiBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSBudW1iZXIgaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkYXRhIGFycmF5XG4gKiBAcGFyYW0gbmFtZSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gdmFsdWUgdmFsdWUgVGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkIHdoZW4gdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICogICAgICAgICAgICAgICAgICBPdGhlcndpc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHN0cmluZ2lmaWVkIHZhbHVlLlxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgT3B0aW9uYWwgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIHNldHRpbmcgdGhlIGF0dHJpYnV0ZS5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZWxlbWVudEF0dHJpYnV0ZShpbmRleCwgbmFtZSwgdmFsdWUsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7XG4gICAgaWYgKHZhbHVlICE9PSBOT19DSEFOR0UpIHtcbiAgICAgICAgbmdEZXZNb2RlICYmIHZhbGlkYXRlQWdhaW5zdEV2ZW50QXR0cmlidXRlcyhuYW1lKTtcbiAgICAgICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgICAgICB2YXIgZWxlbWVudCA9IGdldE5hdGl2ZUJ5SW5kZXgoaW5kZXgsIGxWaWV3KTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVBdHRyaWJ1dGUrKztcbiAgICAgICAgICAgIGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/IHJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCBuYW1lc3BhY2UpIDpcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKztcbiAgICAgICAgICAgIHZhciB0Tm9kZSA9IGdldFROb2RlKGluZGV4LCBsVmlldyk7XG4gICAgICAgICAgICB2YXIgc3RyVmFsdWUgPSBzYW5pdGl6ZXIgPT0gbnVsbCA/IHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkgOiBzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCBuYW1lLCBzdHJWYWx1ZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA/IGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCBzdHJWYWx1ZSkgOlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBzdHJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEFzc2lnbiBzdGF0aWMgYXR0cmlidXRlIHZhbHVlcyB0byBhIGhvc3QgZWxlbWVudC5cbiAqXG4gKiBUaGlzIGluc3RydWN0aW9uIHdpbGwgYXNzaWduIHN0YXRpYyBhdHRyaWJ1dGUgdmFsdWVzIGFzIHdlbGwgYXMgY2xhc3MgYW5kIHN0eWxlXG4gKiB2YWx1ZXMgdG8gYW4gZWxlbWVudCB3aXRoaW4gdGhlIGhvc3QgYmluZGluZ3MgZnVuY3Rpb24uIFNpbmNlIGF0dHJpYnV0ZSB2YWx1ZXNcbiAqIGNhbiBjb25zaXN0IG9mIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXMsIHRoZSBgYXR0cnNgIGFycmF5IG11c3QgaW5jbHVkZSB0aGUgdmFsdWVzIGluXG4gKiB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAqXG4gKiBhdHRycyA9IFtcbiAqICAgLy8gc3RhdGljIGF0dHJpYnV0ZXMgKGxpa2UgYHRpdGxlYCwgYG5hbWVgLCBgaWRgLi4uKVxuICogICBhdHRyMSwgdmFsdWUxLCBhdHRyMiwgdmFsdWUsXG4gKlxuICogICAvLyBhIHNpbmdsZSBuYW1lc3BhY2UgdmFsdWUgKGxpa2UgYHg6aWRgKVxuICogICBOQU1FU1BBQ0VfTUFSS0VSLCBuYW1lc3BhY2VVcmkxLCBuYW1lMSwgdmFsdWUxLFxuICpcbiAqICAgLy8gYW5vdGhlciBzaW5nbGUgbmFtZXNwYWNlIHZhbHVlIChsaWtlIGB4Om5hbWVgKVxuICogICBOQU1FU1BBQ0VfTUFSS0VSLCBuYW1lc3BhY2VVcmkyLCBuYW1lMiwgdmFsdWUyLFxuICpcbiAqICAgLy8gYSBzZXJpZXMgb2YgQ1NTIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgKG5vIHNwYWNlcylcbiAqICAgQ0xBU1NFU19NQVJLRVIsIGNsYXNzMSwgY2xhc3MyLCBjbGFzczMsXG4gKlxuICogICAvLyBhIHNlcmllcyBvZiBDU1Mgc3R5bGVzIChwcm9wZXJ0eSArIHZhbHVlKSB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudFxuICogICBTVFlMRVNfTUFSS0VSLCBwcm9wMSwgdmFsdWUxLCBwcm9wMiwgdmFsdWUyXG4gKiBdXG4gKlxuICogQWxsIG5vbi1jbGFzcyBhbmQgbm9uLXN0eWxlIGF0dHJpYnV0ZXMgbXVzdCBiZSBkZWZpbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdFxuICogZmlyc3QgYmVmb3JlIGFsbCBjbGFzcyBhbmQgc3R5bGUgdmFsdWVzIGFyZSBzZXQuIFdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdmFsdWVcbiAqIHR5cGUgKGxpa2Ugd2hlbiBjbGFzc2VzIGFuZCBzdHlsZXMgYXJlIGludHJvZHVjZWQpIGEgbWFya2VyIG11c3QgYmUgdXNlZCB0byBzZXBhcmF0ZVxuICogdGhlIGVudHJpZXMuIFRoZSBtYXJrZXIgdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIHNldCB2aWEgZW50cmllcyBmb3VuZCBpbiB0aGVcbiAqIFtBdHRyaWJ1dGVNYXJrZXJdIGVudW0uXG4gKlxuICogTk9URTogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byB1c2VkIGZyb20gYGhvc3RCaW5kaW5nc2AgZnVuY3Rpb24gb25seS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0aXZlIEEgZGlyZWN0aXZlIGluc3RhbmNlIHRoZSBzdHlsaW5nIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqIEBwYXJhbSBhdHRycyBBbiBhcnJheSBvZiBzdGF0aWMgdmFsdWVzIChhdHRyaWJ1dGVzLCBjbGFzc2VzIGFuZCBzdHlsZXMpIHdpdGggdGhlIGNvcnJlY3QgbWFya2VyXG4gKiB2YWx1ZXMuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRIb3N0QXR0cnMoYXR0cnMpIHtcbiAgICB2YXIgaG9zdEVsZW1lbnRJbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0Tm9kZSA9IGdldFROb2RlKGhvc3RFbGVtZW50SW5kZXgsIGxWaWV3KTtcbiAgICAvLyBub24tZWxlbWVudCBub2RlcyAoZS5nLiBgPG5nLWNvbnRhaW5lcj5gKSBhcmUgbm90IHJlbmRlcmVkIGFzIGFjdHVhbFxuICAgIC8vIGVsZW1lbnQgbm9kZXMgYW5kIGFkZGluZyBzdHlsZXMvY2xhc3NlcyBvbiB0byB0aGVtIHdpbGwgY2F1c2UgcnVudGltZVxuICAgIC8vIGVycm9ycy4uLlxuICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHtcbiAgICAgICAgdmFyIG5hdGl2ZSA9IGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KTtcbiAgICAgICAgdmFyIGxhc3RBdHRySW5kZXggPSBzZXRVcEF0dHJpYnV0ZXMobmF0aXZlLCBhdHRycyk7XG4gICAgICAgIHZhciBzdHlsaW5nQXR0cnNTdGFydEluZGV4ID0gYXR0cnNTdHlsaW5nSW5kZXhPZihhdHRycywgbGFzdEF0dHJJbmRleCk7XG4gICAgICAgIGlmIChzdHlsaW5nQXR0cnNTdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHZhciBkaXJlY3RpdmVTdHlsaW5nSW5kZXggPSBnZXRBY3RpdmVEaXJlY3RpdmVTdHlsaW5nSW5kZXgoKTtcbiAgICAgICAgICAgIGlmICh0Tm9kZS5zdHlsaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICBwYXRjaENvbnRleHRXaXRoU3RhdGljQXR0cnModE5vZGUuc3R5bGluZ1RlbXBsYXRlLCBhdHRycywgc3R5bGluZ0F0dHJzU3RhcnRJbmRleCwgZGlyZWN0aXZlU3R5bGluZ0luZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHROb2RlLnN0eWxpbmdUZW1wbGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVTdGF0aWNDb250ZXh0KGF0dHJzLCBzdHlsaW5nQXR0cnNTdGFydEluZGV4LCBkaXJlY3RpdmVTdHlsaW5nSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENyZWF0ZXMgYSBsb2dpY2FsIGNvbnRhaW5lciBmb3Igb3RoZXIgbm9kZXMgKDxuZy1jb250YWluZXI+KSBiYWNrZWQgYnkgYSBjb21tZW50IG5vZGUgaW4gdGhlIERPTS5cbiAqIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50Q29udGFpbmVyRW5kKClgIGNhbGwuXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheVxuICogQHBhcmFtIGF0dHJzIFNldCBvZiBhdHRyaWJ1dGVzIHRvIGJlIHVzZWQgd2hlbiBtYXRjaGluZyBkaXJlY3RpdmVzLlxuICogQHBhcmFtIGxvY2FsUmVmcyBBIHNldCBvZiBsb2NhbCByZWZlcmVuY2UgYmluZGluZ3Mgb24gdGhlIGVsZW1lbnQuXG4gKlxuICogRXZlbiBpZiB0aGlzIGluc3RydWN0aW9uIGFjY2VwdHMgYSBzZXQgb2YgYXR0cmlidXRlcyBubyBhY3R1YWwgYXR0cmlidXRlIHZhbHVlcyBhcmUgcHJvcGFnYXRlZCB0b1xuICogdGhlIERPTSAoYXMgYSBjb21tZW50IG5vZGUgY2FuJ3QgaGF2ZSBhdHRyaWJ1dGVzKS4gQXR0cmlidXRlcyBhcmUgaGVyZSBvbmx5IGZvciBkaXJlY3RpdmVcbiAqIG1hdGNoaW5nIHB1cnBvc2VzIGFuZCBzZXR0aW5nIGluaXRpYWwgaW5wdXRzIG9mIGRpcmVjdGl2ZXMuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRDb250YWluZXJTdGFydChpbmRleCwgYXR0cnMsIGxvY2FsUmVmcykge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIHZhciByZW5kZXJlciA9IGxWaWV3W1JFTkRFUkVSXTtcbiAgICB2YXIgdGFnTmFtZSA9ICduZy1jb250YWluZXInO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChsVmlld1tCSU5ESU5HX0lOREVYXSwgdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgsICdlbGVtZW50IGNvbnRhaW5lcnMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpO1xuICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7XG4gICAgdmFyIG5hdGl2ZSA9IHJlbmRlcmVyLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlID8gdGFnTmFtZSA6ICcnKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4IC0gMSk7XG4gICAgdmFyIHROb2RlID0gY3JlYXRlTm9kZUF0SW5kZXgoaW5kZXgsIDQgLyogRWxlbWVudENvbnRhaW5lciAqLywgbmF0aXZlLCB0YWdOYW1lLCBhdHRycyB8fCBudWxsKTtcbiAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgLy8gV2hpbGUgbmctY29udGFpbmVyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBzdHlsaW5nLCB3ZSB1c2UgdGhlIHN0eWxlIGNvbnRleHQgdG8gaWRlbnRpZnlcbiAgICAgICAgLy8gYW5kIGV4ZWN1dGUgZGlyZWN0aXZlcyBvbiB0aGUgbmctY29udGFpbmVyLlxuICAgICAgICBzZXROb2RlU3R5bGluZ1RlbXBsYXRlKHRWaWV3LCB0Tm9kZSwgYXR0cnMsIDApO1xuICAgIH1cbiAgICBhcHBlbmRDaGlsZChuYXRpdmUsIHROb2RlLCBsVmlldyk7XG4gICAgY3JlYXRlRGlyZWN0aXZlc0FuZExvY2Fscyh0VmlldywgbFZpZXcsIGxvY2FsUmVmcyk7XG4gICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpO1xuICAgIHZhciBjdXJyZW50UXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdO1xuICAgIGlmIChjdXJyZW50UXVlcmllcykge1xuICAgICAgICBjdXJyZW50UXVlcmllcy5hZGROb2RlKHROb2RlKTtcbiAgICAgICAgbFZpZXdbUVVFUklFU10gPSBjdXJyZW50UXVlcmllcy5jbG9uZSgpO1xuICAgIH1cbiAgICBleGVjdXRlQ29udGVudFF1ZXJpZXModFZpZXcsIHROb2RlLCBsVmlldyk7XG59XG4vKipcbiAqIE1hcmsgdGhlIGVuZCBvZiB0aGUgPG5nLWNvbnRhaW5lcj4uXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRDb250YWluZXJFbmQoKSB7XG4gICAgdmFyIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIGlmIChnZXRJc1BhcmVudCgpKSB7XG4gICAgICAgIHNldElzUGFyZW50KGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIYXNQYXJlbnQocHJldmlvdXNPclBhcmVudFROb2RlKTtcbiAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlID0gcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDtcbiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7XG4gICAgfVxuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwcmV2aW91c09yUGFyZW50VE5vZGUsIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7XG4gICAgdmFyIGN1cnJlbnRRdWVyaWVzID0gbFZpZXdbUVVFUklFU107XG4gICAgaWYgKGN1cnJlbnRRdWVyaWVzKSB7XG4gICAgICAgIGxWaWV3W1FVRVJJRVNdID0gY3VycmVudFF1ZXJpZXMucGFyZW50O1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHJlcXVpcmVkIGZvciBhbGwgaG9zdC1sZXZlbCBzdHlsaW5nLXJlbGF0ZWQgaW5zdHJ1Y3Rpb25zIHRvIHJ1blxuICAgIC8vIGluIHRoZSBjb3JyZWN0IG9yZGVyXG4gICAgcHJldmlvdXNPclBhcmVudFROb2RlLm9uRWxlbWVudENyZWF0aW9uRm5zICYmIGFwcGx5T25DcmVhdGVJbnN0cnVjdGlvbnMocHJldmlvdXNPclBhcmVudFROb2RlKTtcbiAgICByZWdpc3RlclBvc3RPcmRlckhvb2tzKHRWaWV3LCBwcmV2aW91c09yUGFyZW50VE5vZGUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIE1hcmtzIHRoZSBzdGFydCBvZiBhbiBlbWJlZGRlZCB2aWV3LlxuICpcbiAqIEBwYXJhbSB2aWV3QmxvY2tJZCBUaGUgSUQgb2YgdGhpcyB2aWV3XG4gKiBAcmV0dXJuIGJvb2xlYW4gV2hldGhlciBvciBub3QgdGhpcyB2aWV3IGlzIGluIGNyZWF0aW9uIG1vZGVcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZW1iZWRkZWRWaWV3U3RhcnQodmlld0Jsb2NrSWQsIGNvbnN0cywgdmFycykge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIC8vIFRoZSBwcmV2aW91cyBub2RlIGNhbiBiZSBhIHZpZXcgbm9kZSBpZiB3ZSBhcmUgcHJvY2Vzc2luZyBhbiBpbmxpbmUgZm9yIGxvb3BcbiAgICB2YXIgY29udGFpbmVyVE5vZGUgPSBwcmV2aW91c09yUGFyZW50VE5vZGUudHlwZSA9PT0gMiAvKiBWaWV3ICovID9cbiAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudCA6XG4gICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZTtcbiAgICB2YXIgbENvbnRhaW5lciA9IGxWaWV3W2NvbnRhaW5lclROb2RlLmluZGV4XTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUoY29udGFpbmVyVE5vZGUsIDAgLyogQ29udGFpbmVyICovKTtcbiAgICB2YXIgdmlld1RvUmVuZGVyID0gc2NhbkZvclZpZXcobENvbnRhaW5lciwgbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdLCB2aWV3QmxvY2tJZCk7XG4gICAgaWYgKHZpZXdUb1JlbmRlcikge1xuICAgICAgICBzZXRJc1BhcmVudCh0cnVlKTtcbiAgICAgICAgZW50ZXJWaWV3KHZpZXdUb1JlbmRlciwgdmlld1RvUmVuZGVyW1RWSUVXXS5ub2RlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFdoZW4gd2UgY3JlYXRlIGEgbmV3IExWaWV3LCB3ZSBhbHdheXMgcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBpbnN0cnVjdGlvbnMuXG4gICAgICAgIHZpZXdUb1JlbmRlciA9IGNyZWF0ZUxWaWV3KGxWaWV3LCBnZXRPckNyZWF0ZUVtYmVkZGVkVFZpZXcodmlld0Jsb2NrSWQsIGNvbnN0cywgdmFycywgY29udGFpbmVyVE5vZGUpLCBudWxsLCAxNiAvKiBDaGVja0Fsd2F5cyAqLywgbnVsbCwgbnVsbCk7XG4gICAgICAgIGlmIChsQ29udGFpbmVyW1FVRVJJRVNdKSB7XG4gICAgICAgICAgICB2aWV3VG9SZW5kZXJbUVVFUklFU10gPSBsQ29udGFpbmVyW1FVRVJJRVNdLmNyZWF0ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdFBhcmVudE5vZGUgPSBnZXRJc1BhcmVudCgpID8gcHJldmlvdXNPclBhcmVudFROb2RlIDpcbiAgICAgICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50O1xuICAgICAgICBhc3NpZ25UVmlld05vZGVUb0xWaWV3KHZpZXdUb1JlbmRlcltUVklFV10sIHRQYXJlbnROb2RlLCB2aWV3QmxvY2tJZCwgdmlld1RvUmVuZGVyKTtcbiAgICAgICAgZW50ZXJWaWV3KHZpZXdUb1JlbmRlciwgdmlld1RvUmVuZGVyW1RWSUVXXS5ub2RlKTtcbiAgICB9XG4gICAgaWYgKGxDb250YWluZXIpIHtcbiAgICAgICAgaWYgKGlzQ3JlYXRpb25Nb2RlKHZpZXdUb1JlbmRlcikpIHtcbiAgICAgICAgICAgIC8vIGl0IGlzIGEgbmV3IHZpZXcsIGluc2VydCBpdCBpbnRvIGNvbGxlY3Rpb24gb2Ygdmlld3MgZm9yIGEgZ2l2ZW4gY29udGFpbmVyXG4gICAgICAgICAgICBpbnNlcnRWaWV3KHZpZXdUb1JlbmRlciwgbENvbnRhaW5lciwgbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdKTtcbiAgICAgICAgfVxuICAgICAgICBsQ29udGFpbmVyW0FDVElWRV9JTkRFWF0rKztcbiAgICB9XG4gICAgcmV0dXJuIGlzQ3JlYXRpb25Nb2RlKHZpZXdUb1JlbmRlcikgPyAxIC8qIENyZWF0ZSAqLyB8IDIgLyogVXBkYXRlICovIDpcbiAgICAgICAgMiAvKiBVcGRhdGUgKi87XG59XG4vKipcbiAqIEluaXRpYWxpemUgdGhlIFRWaWV3IChlLmcuIHN0YXRpYyBkYXRhKSBmb3IgdGhlIGFjdGl2ZSBlbWJlZGRlZCB2aWV3LlxuICpcbiAqIEVhY2ggZW1iZWRkZWQgdmlldyBibG9jayBtdXN0IGNyZWF0ZSBvciByZXRyaWV2ZSBpdHMgb3duIFRWaWV3LiBPdGhlcndpc2UsIHRoZSBlbWJlZGRlZCB2aWV3J3NcbiAqIHN0YXRpYyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbm9kZSB3b3VsZCBvdmVyd3JpdGUgdGhlIHN0YXRpYyBkYXRhIGZvciBhIG5vZGUgaW4gdGhlIHZpZXcgYWJvdmVcbiAqIGl0IHdpdGggdGhlIHNhbWUgaW5kZXggKHNpbmNlIGl0J3MgaW4gdGhlIHNhbWUgdGVtcGxhdGUpLlxuICpcbiAqIEBwYXJhbSB2aWV3SW5kZXggVGhlIGluZGV4IG9mIHRoZSBUVmlldyBpbiBUTm9kZS50Vmlld3NcbiAqIEBwYXJhbSBjb25zdHMgVGhlIG51bWJlciBvZiBub2RlcywgbG9jYWwgcmVmcywgYW5kIHBpcGVzIGluIHRoaXMgdGVtcGxhdGVcbiAqIEBwYXJhbSB2YXJzIFRoZSBudW1iZXIgb2YgYmluZGluZ3MgYW5kIHB1cmUgZnVuY3Rpb24gYmluZGluZ3MgaW4gdGhpcyB0ZW1wbGF0ZVxuICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lciBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgdmlldydzIHN0YXRpYyBkYXRhXG4gKiBAcmV0dXJucyBUVmlld1xuICovXG5mdW5jdGlvbiBnZXRPckNyZWF0ZUVtYmVkZGVkVFZpZXcodmlld0luZGV4LCBjb25zdHMsIHZhcnMsIHBhcmVudCkge1xuICAgIHZhciB0VmlldyA9IGdldExWaWV3KClbVFZJRVddO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwYXJlbnQsIDAgLyogQ29udGFpbmVyICovKTtcbiAgICB2YXIgY29udGFpbmVyVFZpZXdzID0gcGFyZW50LnRWaWV3cztcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjb250YWluZXJUVmlld3MsICdUVmlldyBleHBlY3RlZCcpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChBcnJheS5pc0FycmF5KGNvbnRhaW5lclRWaWV3cyksIHRydWUsICdUVmlld3Mgc2hvdWxkIGJlIGluIGFuIGFycmF5Jyk7XG4gICAgaWYgKHZpZXdJbmRleCA+PSBjb250YWluZXJUVmlld3MubGVuZ3RoIHx8IGNvbnRhaW5lclRWaWV3c1t2aWV3SW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgY29udGFpbmVyVFZpZXdzW3ZpZXdJbmRleF0gPSBjcmVhdGVUVmlldyh2aWV3SW5kZXgsIG51bGwsIGNvbnN0cywgdmFycywgdFZpZXcuZGlyZWN0aXZlUmVnaXN0cnksIHRWaWV3LnBpcGVSZWdpc3RyeSwgbnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXJUVmlld3Nbdmlld0luZGV4XTtcbn1cbi8qKlxuICogTG9va3MgZm9yIGEgdmlldyB3aXRoIGEgZ2l2ZW4gdmlldyBibG9jayBpZCBpbnNpZGUgYSBwcm92aWRlZCBMQ29udGFpbmVyLlxuICogUmVtb3ZlcyB2aWV3cyB0aGF0IG5lZWQgdG8gYmUgZGVsZXRlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gbENvbnRhaW5lciB0byBzZWFyY2ggZm9yIHZpZXdzXG4gKiBAcGFyYW0gc3RhcnRJZHggc3RhcnRpbmcgaW5kZXggaW4gdGhlIHZpZXdzIGFycmF5IHRvIHNlYXJjaCBmcm9tXG4gKiBAcGFyYW0gdmlld0Jsb2NrSWQgZXhhY3QgdmlldyBibG9jayBpZCB0byBsb29rIGZvclxuICogQHJldHVybnMgaW5kZXggb2YgYSBmb3VuZCB2aWV3IG9yIC0xIGlmIG5vdCBmb3VuZFxuICovXG5mdW5jdGlvbiBzY2FuRm9yVmlldyhsQ29udGFpbmVyLCBzdGFydElkeCwgdmlld0Jsb2NrSWQpIHtcbiAgICB2YXIgdmlld3MgPSBsQ29udGFpbmVyW1ZJRVdTXTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJZHg7IGkgPCB2aWV3cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmlld0F0UG9zaXRpb25JZCA9IHZpZXdzW2ldW1RWSUVXXS5pZDtcbiAgICAgICAgaWYgKHZpZXdBdFBvc2l0aW9uSWQgPT09IHZpZXdCbG9ja0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlld3NbaV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmlld0F0UG9zaXRpb25JZCA8IHZpZXdCbG9ja0lkKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIHZpZXcgdGhhdCBzaG91bGQgbm90IGJlIGF0IHRoaXMgcG9zaXRpb24gLSByZW1vdmVcbiAgICAgICAgICAgIHJlbW92ZVZpZXcobENvbnRhaW5lciwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIHZpZXcgd2l0aCBpZCBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgdGhhdCByZXF1aXJlZCB2aWV3IGRvZXNuJ3QgZXhpc3QgYW5kIGNhbid0IGJlIGZvdW5kIGF0XG4gICAgICAgICAgICAvLyBsYXRlciBwb3NpdGlvbnMgaW4gdGhlIHZpZXdzIGFycmF5IC0gc3RvcCB0aGUgc2VhcmNoZGVmLmNvbnQgaGVyZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIE1hcmtzIHRoZSBlbmQgb2YgYW4gZW1iZWRkZWQgdmlldy5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1ZW1iZWRkZWRWaWV3RW5kKCkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHZpZXdIb3N0ID0gbFZpZXdbVF9IT1NUXTtcbiAgICBpZiAoaXNDcmVhdGlvbk1vZGUobFZpZXcpKSB7XG4gICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3MobFZpZXcpOyAvLyBjcmVhdGlvbiBtb2RlIHBhc3NcbiAgICAgICAgbFZpZXdbRkxBR1NdICY9IH40IC8qIENyZWF0aW9uTW9kZSAqLztcbiAgICB9XG4gICAgcmVzZXRQcmVPcmRlckhvb2tGbGFncyhsVmlldyk7XG4gICAgcmVmcmVzaERlc2NlbmRhbnRWaWV3cyhsVmlldyk7IC8vIHVwZGF0ZSBtb2RlIHBhc3NcbiAgICB2YXIgbENvbnRhaW5lciA9IGxWaWV3W1BBUkVOVF07XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXJPclVuZGVmaW5lZChsQ29udGFpbmVyKTtcbiAgICBsZWF2ZVZpZXcobENvbnRhaW5lcltQQVJFTlRdKTtcbiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodmlld0hvc3QpO1xuICAgIHNldElzUGFyZW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IE9wYXF1ZVZpZXdTdGF0ZSBpbnN0YW5jZS5cbiAqXG4gKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHJlc3RvcmVWaWV3KCkgaW5zdHJ1Y3Rpb24gdG8gc2F2ZSBhIHNuYXBzaG90XG4gKiBvZiB0aGUgY3VycmVudCB2aWV3IGFuZCByZXN0b3JlIGl0IHdoZW4gbGlzdGVuZXJzIGFyZSBpbnZva2VkLiBUaGlzIGFsbG93c1xuICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1Z2V0Q3VycmVudFZpZXcoKSB7XG4gICAgcmV0dXJuIGdldExWaWV3KCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBzaGFwZWQgbGlrZSBhIFByb21pc2VcbiAqL1xuZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgIC8vIGFsbG93IGFueSBQcm9taXNlL0ErIGNvbXBsaWFudCB0aGVuYWJsZS5cbiAgICAvLyBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgb2JqLnRoZW4gY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIE9ic2VydmFibGVcbiAqL1xuZnVuY3Rpb24gaXNPYnNlcnZhYmxlKG9iaikge1xuICAgIC8vIFRPRE86IHVzZSBpc09ic2VydmFibGUgb25jZSB3ZSB1cGRhdGUgcGFzcyByeGpzIDYuMVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvcnhqcy9ibG9iL21hc3Rlci9DSEFOR0VMT0cubWQjNjEwLTIwMTgtMDUtMDNcbiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIElmIGFuIG91dHB1dCBleGlzdHMgb24gb25lIG9mIHRoZSBub2RlJ3MgZGlyZWN0aXZlcywgaXQgYWxzbyBzdWJzY3JpYmVzIHRvIHRoZSBvdXRwdXRcbiAqIGFuZCBzYXZlcyB0aGUgc3Vic2NyaXB0aW9uIGZvciBsYXRlciBjbGVhbnVwLlxuICpcbiAqIEBwYXJhbSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSBsaXN0ZW5lckZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBldmVudCBlbWl0c1xuICogQHBhcmFtIHVzZUNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gdXNlIGNhcHR1cmUgaW4gZXZlbnQgbGlzdGVuZXJcbiAqIEBwYXJhbSBldmVudFRhcmdldFJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBnbG9iYWwgdGFyZ2V0IGluZm9ybWF0aW9uIGluIGNhc2UgdGhpcyBsaXN0ZW5lclxuICogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGEgZ2xvYmFsIG9iamVjdCBsaWtlIHdpbmRvdywgZG9jdW1lbnQgb3IgYm9keVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVsaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpIHtcbiAgICBpZiAodXNlQ2FwdHVyZSA9PT0gdm9pZCAwKSB7IHVzZUNhcHR1cmUgPSBmYWxzZTsgfVxuICAgIGxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlLCBldmVudFRhcmdldFJlc29sdmVyKTtcbn1cbi8qKlxuKiBSZWdpc3RlcnMgYSBzeW50aGV0aWMgaG9zdCBsaXN0ZW5lciAoZS5nLiBgKEBmb28uc3RhcnQpYCkgb24gYSBjb21wb25lbnQuXG4qXG4qIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMgYW5kIGlzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGFcbiogc3ludGhldGljIGhvc3QgbGlzdGVuZXIgKGUuZy4gYEBIb3N0TGlzdGVuZXIoJ0Bmb28uc3RhcnQnKWApIHByb3Blcmx5IGdldHMgcmVuZGVyZWRcbiogaW4gdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyLiBOb3JtYWxseSBhbGwgaG9zdCBsaXN0ZW5lcnMgYXJlIGV2YWx1YXRlZCB3aXRoIHRoZVxuKiBwYXJlbnQgY29tcG9uZW50J3MgcmVuZGVyZXIsIGJ1dCwgaW4gdGhlIGNhc2Ugb2YgYW5pbWF0aW9uIEB0cmlnZ2VycywgdGhleSBuZWVkXG4qIHRvIGJlIGV2YWx1YXRlZCB3aXRoIHRoZSBzdWIgY29tcG9uZW50J3MgcmVuZGVyZXIgKGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoZVxuKiBhbmltYXRpb24gdHJpZ2dlcnMgYXJlIGRlZmluZWQpLlxuKlxuKiBEbyBub3QgdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gYXMgYSByZXBsYWNlbWVudCBmb3IgYGxpc3RlbmVyYC4gVGhpcyBpbnN0cnVjdGlvblxuKiBvbmx5IGV4aXN0cyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBWaWV3RW5naW5lJ3MgaG9zdCBiaW5kaW5nIGJlaGF2aW9yLlxuKlxuKiBAcGFyYW0gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50XG4qIEBwYXJhbSBsaXN0ZW5lckZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBldmVudCBlbWl0c1xuKiBAcGFyYW0gdXNlQ2FwdHVyZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgY2FwdHVyZSBpbiBldmVudCBsaXN0ZW5lclxuKiBAcGFyYW0gZXZlbnRUYXJnZXRSZXNvbHZlciBGdW5jdGlvbiB0aGF0IHJldHVybnMgZ2xvYmFsIHRhcmdldCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoaXMgbGlzdGVuZXJcbiogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGEgZ2xvYmFsIG9iamVjdCBsaWtlIHdpbmRvdywgZG9jdW1lbnQgb3IgYm9keVxuICpcbiAqIEBjb2RlR2VuQXBpXG4qL1xuZnVuY3Rpb24gybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpIHtcbiAgICBpZiAodXNlQ2FwdHVyZSA9PT0gdm9pZCAwKSB7IHVzZUNhcHR1cmUgPSBmYWxzZTsgfVxuICAgIGxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlLCBldmVudFRhcmdldFJlc29sdmVyLCBsb2FkQ29tcG9uZW50UmVuZGVyZXIpO1xufVxuLyoqXG4gKiBBIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBnaXZlbiBlbGVtZW50IGhhcyBhbHJlYWR5IGFuIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgYW5cbiAqIGV2ZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZS4gVGhlIFRWaWV3LmNsZWFudXAgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBmaW5kIG91dCB3aGljaCBldmVudHNcbiAqIGFyZSByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRFeGlzdGluZ0xpc3RlbmVyKGxWaWV3LCBldmVudE5hbWUsIHROb2RlSWR4KSB7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIHZhciB0Q2xlYW51cCA9IHRWaWV3LmNsZWFudXA7XG4gICAgaWYgKHRDbGVhbnVwICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBjbGVhbnVwRXZlbnROYW1lID0gdENsZWFudXBbaV07XG4gICAgICAgICAgICBpZiAoY2xlYW51cEV2ZW50TmFtZSA9PT0gZXZlbnROYW1lICYmIHRDbGVhbnVwW2kgKyAxXSA9PT0gdE5vZGVJZHgpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2hpbmcgZXZlbnQgbmFtZSBvbiB0aGUgc2FtZSBub2RlIGJ1dCBpdCBtaWdodCBub3QgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZCB5ZXQsIHNvIHdlIG11c3QgZXhwbGljaXRseSB2ZXJpZnkgZW50cmllcyBpbiB0aGUgTFZpZXcgY2xlYW51cCBkYXRhXG4gICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlcy5cbiAgICAgICAgICAgICAgICB2YXIgbENsZWFudXAgPSBsVmlld1tDTEVBTlVQXTtcbiAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXJJZHhJbkxDbGVhbnVwID0gdENsZWFudXBbaSArIDJdO1xuICAgICAgICAgICAgICAgIHJldHVybiBsQ2xlYW51cC5sZW5ndGggPiBsaXN0ZW5lcklkeEluTENsZWFudXAgPyBsQ2xlYW51cFtsaXN0ZW5lcklkeEluTENsZWFudXBdIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRWaWV3LmNsZWFudXAgY2FuIGhhdmUgYSBtaXggb2YgNC1lbGVtZW50cyBlbnRyaWVzIChmb3IgZXZlbnQgaGFuZGxlciBjbGVhbnVwcykgb3JcbiAgICAgICAgICAgIC8vIDItZWxlbWVudCBlbnRyaWVzIChmb3IgZGlyZWN0aXZlIGFuZCBxdWVyaWVzIGRlc3Ryb3kgaG9va3MpLiBBcyBzdWNoIHdlIGNhbiBlbmNvdW50ZXJcbiAgICAgICAgICAgIC8vIGJsb2NrcyBvZiA0IG9yIDIgaXRlbXMgaW4gdGhlIHRWaWV3LmNsZWFudXAgYW5kIHRoaXMgaXMgd2h5IHdlIGl0ZXJhdGUgb3ZlciAyIGVsZW1lbnRzXG4gICAgICAgICAgICAvLyBmaXJzdCBhbmQganVtcCBhbm90aGVyIDIgZWxlbWVudHMgaWYgd2UgZGV0ZWN0IGxpc3RlbmVycyBjbGVhbnVwICg0IGVsZW1lbnRzKS4gQWxzbyBjaGVja1xuICAgICAgICAgICAgLy8gZG9jdW1lbnRhdGlvbiBvZiBUVmlldy5jbGVhbnVwIGZvciBtb3JlIGRldGFpbHMgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZSBsYXlvdXQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNsZWFudXBFdmVudE5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gbGlzdGVuZXJJbnRlcm5hbChldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIsIGxvYWRSZW5kZXJlckZuKSB7XG4gICAgaWYgKHVzZUNhcHR1cmUgPT09IHZvaWQgMCkgeyB1c2VDYXB0dXJlID0gZmFsc2U7IH1cbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICB2YXIgZmlyc3RUZW1wbGF0ZVBhc3MgPSB0Vmlldy5maXJzdFRlbXBsYXRlUGFzcztcbiAgICB2YXIgdENsZWFudXAgPSBmaXJzdFRlbXBsYXRlUGFzcyAmJiAodFZpZXcuY2xlYW51cCB8fCAodFZpZXcuY2xlYW51cCA9IFtdKSk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7XG4gICAgdmFyIHByb2Nlc3NPdXRwdXRzID0gdHJ1ZTtcbiAgICAvLyBhZGQgbmF0aXZlIGV2ZW50IGxpc3RlbmVyIC0gYXBwbGljYWJsZSB0byBlbGVtZW50cyBvbmx5XG4gICAgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykge1xuICAgICAgICB2YXIgbmF0aXZlID0gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpO1xuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBldmVudFRhcmdldFJlc29sdmVyID8gZXZlbnRUYXJnZXRSZXNvbHZlcihuYXRpdmUpIDoge307XG4gICAgICAgIHZhciB0YXJnZXQgPSByZXNvbHZlZC50YXJnZXQgfHwgbmF0aXZlO1xuICAgICAgICB2YXIgcmVuZGVyZXIgPSBsb2FkUmVuZGVyZXJGbiA/IGxvYWRSZW5kZXJlckZuKHROb2RlLCBsVmlldykgOiBsVmlld1tSRU5ERVJFUl07XG4gICAgICAgIHZhciBsQ2xlYW51cCA9IGdldENsZWFudXAobFZpZXcpO1xuICAgICAgICB2YXIgbENsZWFudXBJbmRleCA9IGxDbGVhbnVwLmxlbmd0aDtcbiAgICAgICAgdmFyIGlkeE9yVGFyZ2V0R2V0dGVyID0gZXZlbnRUYXJnZXRSZXNvbHZlciA/XG4gICAgICAgICAgICBmdW5jdGlvbiAoX2xWaWV3KSB7IHJldHVybiBldmVudFRhcmdldFJlc29sdmVyKHVud3JhcFJOb2RlKF9sVmlld1t0Tm9kZS5pbmRleF0pKS50YXJnZXQ7IH0gOlxuICAgICAgICAgICAgdE5vZGUuaW5kZXg7XG4gICAgICAgIC8vIEluIG9yZGVyIHRvIG1hdGNoIGN1cnJlbnQgYmVoYXZpb3IsIG5hdGl2ZSBET00gZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgYWRkZWQgZm9yIGFsbFxuICAgICAgICAvLyBldmVudHMgKGluY2x1ZGluZyBvdXRwdXRzKS5cbiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkge1xuICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgY2FzZXMgd2hlcmUgbXVsdGlwbGUgZGlyZWN0aXZlcyBvbiB0aGUgc2FtZSBlbGVtZW50IHRyeSB0byByZWdpc3RlciBhbiBldmVudFxuICAgICAgICAgICAgLy8gaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIHNhbWUgZXZlbnQuIEluIHRoaXMgc2l0dWF0aW9uIHdlIHdhbnQgdG8gYXZvaWQgcmVnaXN0cmF0aW9uIG9mXG4gICAgICAgICAgICAvLyBzZXZlcmFsIG5hdGl2ZSBsaXN0ZW5lcnMgYXMgZWFjaCByZWdpc3RyYXRpb24gd291bGQgYmUgaW50ZXJjZXB0ZWQgYnkgTmdab25lIGFuZFxuICAgICAgICAgICAgLy8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uLiBUaGlzIHdvdWxkIG1lYW4gdGhhdCBhIHNpbmdsZSB1c2VyIGFjdGlvbiB3b3VsZCByZXN1bHQgaW4gc2V2ZXJhbFxuICAgICAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbnMgYmVpbmcgaW52b2tlZC4gVG8gYXZvaWQgdGhpcyBzaXR1YXRpb24gd2Ugd2FudCB0byBoYXZlIG9ubHkgb25lIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIG5hdGl2ZSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiAoZm9yIHRoZSBzYW1lIGVsZW1lbnQgYW5kIHNhbWUgdHlwZSBvZiBldmVudCkuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gaGF2ZSBqdXN0IG9uZSBuYXRpdmUgZXZlbnQgaGFuZGxlciBpbiBwcmVzZW5jZSBvZiBtdWx0aXBsZSBoYW5kbGVyIGZ1bmN0aW9ucyxcbiAgICAgICAgICAgIC8vIHdlIGp1c3QgcmVnaXN0ZXIgYSBmaXJzdCBoYW5kbGVyIGZ1bmN0aW9uIGFzIGEgbmF0aXZlIGV2ZW50IGxpc3RlbmVyIGFuZCB0aGVuIGNoYWluXG4gICAgICAgICAgICAvLyAoY29hbGVzY2UpIG90aGVyIGhhbmRsZXIgZnVuY3Rpb25zIG9uIHRvcCBvZiB0aGUgZmlyc3QgbmF0aXZlIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgICAgICAvLyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjb2FsZXNjaW5nIGRlc2NyaWJlZCBoZXJlIGRvZXNuJ3QgaGFwcGVuIGZvciBldmVudHMgc3BlY2lmeWluZyBhblxuICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdGFyZ2V0IChleC4gKGRvY3VtZW50OmNsaWNrKSkgLSB0aGlzIGlzIHRvIGtlZXAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gdmlldyBlbmdpbmUuXG4gICAgICAgICAgICAvLyBBbHNvLCB3ZSBkb24ndCBoYXZlIHRvIHNlYXJjaCBmb3IgZXhpc3RpbmcgbGlzdGVuZXJzIGlzIHRoZXJlIGFyZSBubyBkaXJlY3RpdmVzXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBvbiBhIGdpdmVuIG5vZGUgYXMgd2UgY2FuJ3QgcmVnaXN0ZXIgbXVsdGlwbGUgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBzYW1lIGV2ZW50IGluXG4gICAgICAgICAgICAvLyBhIHRlbXBsYXRlICh0aGlzIHdvdWxkIG1lYW4gaGF2aW5nIGR1cGxpY2F0ZSBhdHRyaWJ1dGVzKS5cbiAgICAgICAgICAgIGlmICghZXZlbnRUYXJnZXRSZXNvbHZlciAmJiBoYXNEaXJlY3RpdmVzKHROb2RlKSkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTGlzdGVuZXIgPSBmaW5kRXhpc3RpbmdMaXN0ZW5lcihsVmlldywgZXZlbnROYW1lLCB0Tm9kZS5pbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdMaXN0ZW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5ldyBsaXN0ZW5lciBhdCB0aGUgaGVhZCBvZiB0aGUgY29hbGVzY2VkIGxpc3RlbmVycyBsaXN0LlxuICAgICAgICAgICAgICAgIGxpc3RlbmVyRm4uX19uZ05leHRMaXN0ZW5lckZuX18gPSBleGlzdGluZ0xpc3RlbmVyLl9fbmdOZXh0TGlzdGVuZXJGbl9fO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTGlzdGVuZXIuX19uZ05leHRMaXN0ZW5lckZuX18gPSBsaXN0ZW5lckZuO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NPdXRwdXRzID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgYGxpc3RlbmAgZnVuY3Rpb24gaW4gUHJvY2VkdXJhbCBSZW5kZXJlciBpczpcbiAgICAgICAgICAgICAgICAvLyAtIGVpdGhlciBhIHRhcmdldCBuYW1lIChhcyBhIHN0cmluZykgaW4gY2FzZSBvZiBnbG9iYWwgdGFyZ2V0ICh3aW5kb3csIGRvY3VtZW50LCBib2R5KVxuICAgICAgICAgICAgICAgIC8vIC0gb3IgZWxlbWVudCByZWZlcmVuY2UgKGluIGFsbCBvdGhlciBjYXNlcylcbiAgICAgICAgICAgICAgICBsaXN0ZW5lckZuID0gd3JhcExpc3RlbmVyKHROb2RlLCBsVmlldywgbGlzdGVuZXJGbiwgZmFsc2UgLyoqIHByZXZlbnREZWZhdWx0ICovKTtcbiAgICAgICAgICAgICAgICB2YXIgY2xlYW51cEZuID0gcmVuZGVyZXIubGlzdGVuKHJlc29sdmVkLm5hbWUgfHwgdGFyZ2V0LCBldmVudE5hbWUsIGxpc3RlbmVyRm4pO1xuICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJBZGRFdmVudExpc3RlbmVyKys7XG4gICAgICAgICAgICAgICAgbENsZWFudXAucHVzaChsaXN0ZW5lckZuLCBjbGVhbnVwRm4pO1xuICAgICAgICAgICAgICAgIHRDbGVhbnVwICYmIHRDbGVhbnVwLnB1c2goZXZlbnROYW1lLCBpZHhPclRhcmdldEdldHRlciwgbENsZWFudXBJbmRleCwgbENsZWFudXBJbmRleCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGlzdGVuZXJGbiA9IHdyYXBMaXN0ZW5lcih0Tm9kZSwgbFZpZXcsIGxpc3RlbmVyRm4sIHRydWUgLyoqIHByZXZlbnREZWZhdWx0ICovKTtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSk7XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcisrO1xuICAgICAgICAgICAgbENsZWFudXAucHVzaChsaXN0ZW5lckZuKTtcbiAgICAgICAgICAgIHRDbGVhbnVwICYmIHRDbGVhbnVwLnB1c2goZXZlbnROYW1lLCBpZHhPclRhcmdldEdldHRlciwgbENsZWFudXBJbmRleCwgdXNlQ2FwdHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gc3Vic2NyaWJlIHRvIGRpcmVjdGl2ZSBvdXRwdXRzXG4gICAgaWYgKHROb2RlLm91dHB1dHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZiB3ZSBjcmVhdGUgVE5vZGUgaGVyZSwgaW5wdXRzIG11c3QgYmUgdW5kZWZpbmVkIHNvIHdlIGtub3cgdGhleSBzdGlsbCBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGNoZWNrZWRcbiAgICAgICAgdE5vZGUub3V0cHV0cyA9IGdlbmVyYXRlUHJvcGVydHlBbGlhc2VzKHROb2RlLCAxIC8qIE91dHB1dCAqLyk7XG4gICAgfVxuICAgIHZhciBvdXRwdXRzID0gdE5vZGUub3V0cHV0cztcbiAgICB2YXIgcHJvcHM7XG4gICAgaWYgKHByb2Nlc3NPdXRwdXRzICYmIG91dHB1dHMgJiYgKHByb3BzID0gb3V0cHV0c1tldmVudE5hbWVdKSkge1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICAgIGlmIChwcm9wc0xlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGxDbGVhbnVwID0gZ2V0Q2xlYW51cChsVmlldyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzTGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBwcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB2YXIgbWluaWZpZWROYW1lID0gcHJvcHNbaSArIDJdO1xuICAgICAgICAgICAgICAgIHZhciBkaXJlY3RpdmVJbnN0YW5jZSA9IGxWaWV3W2luZGV4XTtcbiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gZGlyZWN0aXZlSW5zdGFuY2VbbWluaWZpZWROYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmICFpc09ic2VydmFibGUob3V0cHV0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAT3V0cHV0IFwiICsgbWluaWZpZWROYW1lICsgXCIgbm90IGluaXRpYWxpemVkIGluICdcIiArIGRpcmVjdGl2ZUluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgKyBcIicuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gb3V0cHV0LnN1YnNjcmliZShsaXN0ZW5lckZuKTtcbiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gbENsZWFudXAubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxDbGVhbnVwLnB1c2gobGlzdGVuZXJGbiwgc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB0Q2xlYW51cCAmJiB0Q2xlYW51cC5wdXNoKGV2ZW50TmFtZSwgdE5vZGUuaW5kZXgsIGlkeCwgLShpZHggKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbGlzdGVuZXJGbiwgZSkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgZXhwbGljaXRseSByZXR1cm5pbmcgZmFsc2UgZnJvbSBhIGxpc3RlbmVyIHNob3VsZCBwcmV2ZW50RGVmYXVsdFxuICAgICAgICByZXR1cm4gbGlzdGVuZXJGbihlKSAhPT0gZmFsc2U7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBXcmFwcyBhbiBldmVudCBsaXN0ZW5lciB3aXRoIGEgZnVuY3Rpb24gdGhhdCBtYXJrcyBhbmNlc3RvcnMgZGlydHkgYW5kIHByZXZlbnRzIGRlZmF1bHQgYmVoYXZpb3IsXG4gKiBpZiBhcHBsaWNhYmxlLlxuICpcbiAqIEBwYXJhbSB0Tm9kZSBUaGUgVE5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlzdGVuZXJcbiAqIEBwYXJhbSBsVmlldyBUaGUgTFZpZXcgdGhhdCBjb250YWlucyB0aGlzIGxpc3RlbmVyXG4gKiBAcGFyYW0gbGlzdGVuZXJGbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gY2FsbFxuICogQHBhcmFtIHdyYXBXaXRoUHJldmVudERlZmF1bHQgV2hldGhlciBvciBub3QgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9yXG4gKiAodGhlIHByb2NlZHVyYWwgcmVuZGVyZXIgZG9lcyB0aGlzIGFscmVhZHksIHNvIGluIHRob3NlIGNhc2VzLCB3ZSBzaG91bGQgc2tpcClcbiAqL1xuZnVuY3Rpb24gd3JhcExpc3RlbmVyKHROb2RlLCBsVmlldywgbGlzdGVuZXJGbiwgd3JhcFdpdGhQcmV2ZW50RGVmYXVsdCkge1xuICAgIC8vIE5vdGU6IHdlIGFyZSBwZXJmb3JtaW5nIG1vc3Qgb2YgdGhlIHdvcmsgaW4gdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIGl0c2VsZlxuICAgIC8vIHRvIG9wdGltaXplIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbi5cbiAgICByZXR1cm4gZnVuY3Rpb24gd3JhcExpc3RlbmVySW5fbWFya0RpcnR5QW5kUHJldmVudERlZmF1bHQoZSkge1xuICAgICAgICAvLyBJbiBvcmRlciB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFZpZXcgRW5naW5lLCBldmVudHMgb24gY29tcG9uZW50IGhvc3Qgbm9kZXNcbiAgICAgICAgLy8gbXVzdCBhbHNvIG1hcmsgdGhlIGNvbXBvbmVudCB2aWV3IGl0c2VsZiBkaXJ0eSAoaS5lLiB0aGUgdmlldyB0aGF0IGl0IG93bnMpLlxuICAgICAgICB2YXIgc3RhcnRWaWV3ID0gdE5vZGUuZmxhZ3MgJiAxIC8qIGlzQ29tcG9uZW50ICovID8gZ2V0Q29tcG9uZW50Vmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KSA6IGxWaWV3O1xuICAgICAgICAvLyBTZWUgaW50ZXJmYWNlcy92aWV3LnRzIGZvciBtb3JlIG9uIExWaWV3RmxhZ3MuTWFudWFsT25QdXNoXG4gICAgICAgIGlmICgobFZpZXdbRkxBR1NdICYgMzIgLyogTWFudWFsT25QdXNoICovKSA9PT0gMCkge1xuICAgICAgICAgICAgbWFya1ZpZXdEaXJ0eShzdGFydFZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbGlzdGVuZXJGbiwgZSk7XG4gICAgICAgIC8vIEEganVzdC1pbnZva2VkIGxpc3RlbmVyIGZ1bmN0aW9uIG1pZ2h0IGhhdmUgY29hbGVzY2VkIGxpc3RlbmVycyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvclxuICAgICAgICAvLyB0aGVpciBwcmVzZW5jZSBhbmQgaW52b2tlIGFzIG5lZWRlZC5cbiAgICAgICAgdmFyIG5leHRMaXN0ZW5lckZuID0gd3JhcExpc3RlbmVySW5fbWFya0RpcnR5QW5kUHJldmVudERlZmF1bHQuX19uZ05leHRMaXN0ZW5lckZuX187XG4gICAgICAgIHdoaWxlIChuZXh0TGlzdGVuZXJGbikge1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgZGVmYXVsdCBpZiBhbnkgb2YgdGhlIGxpc3RlbmVycyBleHBsaWNpdGx5IHJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZUxpc3RlbmVyV2l0aEVycm9ySGFuZGxpbmcobFZpZXcsIG5leHRMaXN0ZW5lckZuLCBlKSAmJiByZXN1bHQ7XG4gICAgICAgICAgICBuZXh0TGlzdGVuZXJGbiA9IG5leHRMaXN0ZW5lckZuLl9fbmdOZXh0TGlzdGVuZXJGbl9fO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwV2l0aFByZXZlbnREZWZhdWx0ICYmIHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIE5lY2Vzc2FyeSBmb3IgbGVnYWN5IGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcmV2ZW50RGVmYXVsdCAoZS5nLiBJRSlcbiAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXRyaWV2ZXMgYSBjb250ZXh0IGF0IHRoZSBsZXZlbCBzcGVjaWZpZWQgYW5kIHNhdmVzIGl0IGFzIHRoZSBnbG9iYWwsIGNvbnRleHRWaWV3RGF0YS5cbiAqIFdpbGwgZ2V0IHRoZSBuZXh0IGxldmVsIHVwIGlmIGxldmVsIGlzIG5vdCBzcGVjaWZpZWQuXG4gKlxuICogVGhpcyBpcyB1c2VkIHRvIHNhdmUgY29udGV4dHMgb2YgcGFyZW50IHZpZXdzIHNvIHRoZXkgY2FuIGJlIGJvdW5kIGluIGVtYmVkZGVkIHZpZXdzLCBvclxuICogaW4gY29uanVuY3Rpb24gd2l0aCByZWZlcmVuY2UoKSB0byBiaW5kIGEgcmVmIGZyb20gYSBwYXJlbnQgdmlldy5cbiAqXG4gKiBAcGFyYW0gbGV2ZWwgVGhlIHJlbGF0aXZlIGxldmVsIG9mIHRoZSB2aWV3IGZyb20gd2hpY2ggdG8gZ3JhYiBjb250ZXh0IGNvbXBhcmVkIHRvIGNvbnRleHRWZXdEYXRhXG4gKiBAcmV0dXJucyBjb250ZXh0XG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtW5leHRDb250ZXh0KGxldmVsKSB7XG4gICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSAxOyB9XG4gICAgcmV0dXJuIG5leHRDb250ZXh0SW1wbChsZXZlbCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgZ2l2ZW4gbm9kZSBhZ2FpbnN0IG1hdGNoaW5nIHByb2plY3Rpb24gc2xvdHMgYW5kIHJldHVybnMgdGhlXG4gKiBkZXRlcm1pbmVkIHNsb3QgaW5kZXguIFJldHVybnMgXCJudWxsXCIgaWYgbm8gc2xvdCBtYXRjaGVkIHRoZSBnaXZlbiBub2RlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW50byBhY2NvdW50IHRoZSBwYXJzZWQgbmdQcm9qZWN0QXMgc2VsZWN0b3IgZnJvbSB0aGVcbiAqIG5vZGUncyBhdHRyaWJ1dGVzLiBJZiBwcmVzZW50LCBpdCB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIG5nUHJvamVjdEFzIHNlbGVjdG9yXG4gKiBtYXRjaGVzIGFueSBvZiB0aGUgcHJvamVjdGlvbiBzbG90IHNlbGVjdG9ycy5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hpbmdQcm9qZWN0aW9uU2xvdEluZGV4KHROb2RlLCBwcm9qZWN0aW9uU2xvdHMpIHtcbiAgICB2YXIgd2lsZGNhcmROZ0NvbnRlbnRJbmRleCA9IG51bGw7XG4gICAgdmFyIG5nUHJvamVjdEFzQXR0clZhbCA9IGdldFByb2plY3RBc0F0dHJWYWx1ZSh0Tm9kZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9qZWN0aW9uU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNsb3RWYWx1ZSA9IHByb2plY3Rpb25TbG90c1tpXTtcbiAgICAgICAgLy8gVGhlIGxhc3Qgd2lsZGNhcmQgcHJvamVjdGlvbiBzbG90IHNob3VsZCBtYXRjaCBhbGwgbm9kZXMgd2hpY2ggYXJlbid0IG1hdGNoaW5nXG4gICAgICAgIC8vIGFueSBzZWxlY3Rvci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB2aWV3IGVuZ2luZS5cbiAgICAgICAgaWYgKHNsb3RWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgICB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gaTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIHJhbiBpbnRvIGFuIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlLCB3ZSBzaG91bGQgbWF0Y2ggaXRzIHBhcnNlZCBzZWxlY3RvclxuICAgICAgICAvLyB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMsIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgdG8gbWF0Y2hpbmcgYWdhaW5zdCB0aGUgbm9kZS5cbiAgICAgICAgaWYgKG5nUHJvamVjdEFzQXR0clZhbCA9PT0gbnVsbCA/XG4gICAgICAgICAgICBpc05vZGVNYXRjaGluZ1NlbGVjdG9yTGlzdCh0Tm9kZSwgc2xvdFZhbHVlLCAvKiBpc1Byb2plY3Rpb25Nb2RlICovIHRydWUpIDpcbiAgICAgICAgICAgIGlzU2VsZWN0b3JJblNlbGVjdG9yTGlzdChuZ1Byb2plY3RBc0F0dHJWYWwsIHNsb3RWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpOyAvLyBmaXJzdCBtYXRjaGluZyBzZWxlY3RvciBcImNhcHR1cmVzXCIgYSBnaXZlbiBub2RlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdpbGRjYXJkTmdDb250ZW50SW5kZXg7XG59XG4vKipcbiAqIEluc3RydWN0aW9uIHRvIGRpc3RyaWJ1dGUgcHJvamVjdGFibGUgbm9kZXMgYW1vbmcgPG5nLWNvbnRlbnQ+IG9jY3VycmVuY2VzIGluIGEgZ2l2ZW4gdGVtcGxhdGUuXG4gKiBJdCB0YWtlcyBhbGwgdGhlIHNlbGVjdG9ycyBmcm9tIHRoZSBlbnRpcmUgY29tcG9uZW50J3MgdGVtcGxhdGUgYW5kIGRlY2lkZXMgd2hlcmVcbiAqIGVhY2ggcHJvamVjdGVkIG5vZGUgYmVsb25ncyAoaXQgcmUtZGlzdHJpYnV0ZXMgbm9kZXMgYW1vbmcgXCJidWNrZXRzXCIgd2hlcmUgZWFjaCBcImJ1Y2tldFwiIGlzXG4gKiBiYWNrZWQgYnkgYSBzZWxlY3RvcikuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBDU1Mgc2VsZWN0b3JzIHRvIGJlIHByb3ZpZGVkIGluIDIgZm9ybXM6IHBhcnNlZCAoYnkgYSBjb21waWxlcikgYW5kIHRleHQsXG4gKiB1bi1wYXJzZWQgZm9ybS5cbiAqXG4gKiBUaGUgcGFyc2VkIGZvcm0gaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgbWF0Y2hpbmcgb2YgYSBub2RlIGFnYWluc3QgYSBnaXZlbiBDU1Mgc2VsZWN0b3IuXG4gKiBUaGUgdW4tcGFyc2VkLCB0ZXh0dWFsIGZvcm0gaXMgbmVlZGVkIGZvciBzdXBwb3J0IG9mIHRoZSBuZ1Byb2plY3RBcyBhdHRyaWJ1dGUuXG4gKlxuICogSGF2aW5nIGEgQ1NTIHNlbGVjdG9yIGluIDIgZGlmZmVyZW50IGZvcm1hdHMgaXMgbm90IGlkZWFsLCBidXQgYWx0ZXJuYXRpdmVzIGhhdmUgZXZlbiBtb3JlXG4gKiBkcmF3YmFja3M6XG4gKiAtIGhhdmluZyBvbmx5IGEgdGV4dHVhbCBmb3JtIHdvdWxkIHJlcXVpcmUgcnVudGltZSBwYXJzaW5nIG9mIENTUyBzZWxlY3RvcnM7XG4gKiAtIHdlIGNhbid0IGhhdmUgb25seSBhIHBhcnNlZCBhcyB3ZSBjYW4ndCByZS1jb25zdHJ1Y3QgdGV4dHVhbCBmb3JtIGZyb20gaXQgKGFzIGVudGVyZWQgYnkgYVxuICogdGVtcGxhdGUgYXV0aG9yKS5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdGlvblNsb3RzPyBBIGNvbGxlY3Rpb24gb2YgcHJvamVjdGlvbiBzbG90cy4gQSBwcm9qZWN0aW9uIHNsb3QgY2FuIGJlIGJhc2VkXG4gKiAgICAgICAgb24gYSBwYXJzZWQgQ1NTIHNlbGVjdG9ycyBvciBzZXQgdG8gdGhlIHdpbGRjYXJkIHNlbGVjdG9yIChcIipcIikgaW4gb3JkZXIgdG8gbWF0Y2hcbiAqICAgICAgICBhbGwgbm9kZXMgd2hpY2ggZG8gbm90IG1hdGNoIGFueSBzZWxlY3Rvci4gSWYgbm90IHNwZWNpZmllZCwgYSBzaW5nbGUgd2lsZGNhcmRcbiAqICAgICAgICBzZWxlY3RvciBwcm9qZWN0aW9uIHNsb3Qgd2lsbCBiZSBkZWZpbmVkLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9qZWN0aW9uRGVmKHByb2plY3Rpb25TbG90cykge1xuICAgIHZhciBjb21wb25lbnROb2RlID0gZmluZENvbXBvbmVudFZpZXcoZ2V0TFZpZXcoKSlbVF9IT1NUXTtcbiAgICBpZiAoIWNvbXBvbmVudE5vZGUucHJvamVjdGlvbikge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBwcm9qZWN0aW9uIHNsb3RzIGFyZSBkZWZpbmVkLCBmYWxsIGJhY2sgdG8gYSBzaW5nbGVcbiAgICAgICAgLy8gcHJvamVjdGlvbiBzbG90IHdpdGggdGhlIHdpbGRjYXJkIHNlbGVjdG9yLlxuICAgICAgICB2YXIgbnVtUHJvamVjdGlvblNsb3RzID0gcHJvamVjdGlvblNsb3RzID8gcHJvamVjdGlvblNsb3RzLmxlbmd0aCA6IDE7XG4gICAgICAgIHZhciBwcm9qZWN0aW9uSGVhZHMgPSBjb21wb25lbnROb2RlLnByb2plY3Rpb24gPVxuICAgICAgICAgICAgbmV3IEFycmF5KG51bVByb2plY3Rpb25TbG90cykuZmlsbChudWxsKTtcbiAgICAgICAgdmFyIHRhaWxzID0gcHJvamVjdGlvbkhlYWRzLnNsaWNlKCk7XG4gICAgICAgIHZhciBjb21wb25lbnRDaGlsZCA9IGNvbXBvbmVudE5vZGUuY2hpbGQ7XG4gICAgICAgIHdoaWxlIChjb21wb25lbnRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHNsb3RJbmRleCA9IHByb2plY3Rpb25TbG90cyA/IG1hdGNoaW5nUHJvamVjdGlvblNsb3RJbmRleChjb21wb25lbnRDaGlsZCwgcHJvamVjdGlvblNsb3RzKSA6IDA7XG4gICAgICAgICAgICBpZiAoc2xvdEluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhaWxzW3Nsb3RJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGFpbHNbc2xvdEluZGV4XS5wcm9qZWN0aW9uTmV4dCA9IGNvbXBvbmVudENoaWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbkhlYWRzW3Nsb3RJbmRleF0gPSBjb21wb25lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFpbHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50Q2hpbGQgPSBjb21wb25lbnRDaGlsZC5uZXh0O1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBJbnNlcnRzIHByZXZpb3VzbHkgcmUtZGlzdHJpYnV0ZWQgcHJvamVjdGVkIG5vZGVzLiBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBjYWxsXG4gKiB0byB0aGUgcHJvamVjdGlvbkRlZiBpbnN0cnVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZUluZGV4XG4gKiBAcGFyYW0gc2VsZWN0b3JJbmRleDpcbiAqICAgICAgICAtIDAgd2hlbiB0aGUgc2VsZWN0b3IgaXMgYCpgIChvciB1bnNwZWNpZmllZCBhcyB0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlKSxcbiAqICAgICAgICAtIDEgYmFzZWQgaW5kZXggb2YgdGhlIHNlbGVjdG9yIGZyb20gdGhlIHtAbGluayBwcm9qZWN0aW9uRGVmfVxuICpcbiAqIEBjb2RlR2VuQXBpXG4qL1xuZnVuY3Rpb24gybXJtXByb2plY3Rpb24obm9kZUluZGV4LCBzZWxlY3RvckluZGV4LCBhdHRycykge1xuICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB2b2lkIDApIHsgc2VsZWN0b3JJbmRleCA9IDA7IH1cbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0UHJvamVjdGlvbk5vZGUgPSBjcmVhdGVOb2RlQXRJbmRleChub2RlSW5kZXgsIDEgLyogUHJvamVjdGlvbiAqLywgbnVsbCwgbnVsbCwgYXR0cnMgfHwgbnVsbCk7XG4gICAgLy8gV2UgY2FuJ3QgdXNlIHZpZXdEYXRhW0hPU1RfTk9ERV0gYmVjYXVzZSBwcm9qZWN0aW9uIG5vZGVzIGNhbiBiZSBuZXN0ZWQgaW4gZW1iZWRkZWQgdmlld3MuXG4gICAgaWYgKHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID09PSBudWxsKVxuICAgICAgICB0UHJvamVjdGlvbk5vZGUucHJvamVjdGlvbiA9IHNlbGVjdG9ySW5kZXg7XG4gICAgLy8gYDxuZy1jb250ZW50PmAgaGFzIG5vIGNvbnRlbnRcbiAgICBzZXRJc1BhcmVudChmYWxzZSk7XG4gICAgLy8gcmUtZGlzdHJpYnV0aW9uIG9mIHByb2plY3RhYmxlIG5vZGVzIGlzIHN0b3JlZCBvbiBhIGNvbXBvbmVudCdzIHZpZXcgbGV2ZWxcbiAgICBhcHBlbmRQcm9qZWN0ZWROb2RlcyhsVmlldywgdFByb2plY3Rpb25Ob2RlLCBzZWxlY3RvckluZGV4LCBmaW5kQ29tcG9uZW50VmlldyhsVmlldykpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX3N5bWJvbEl0ZXJhdG9yID0gbnVsbDtcbmZ1bmN0aW9uIGdldFN5bWJvbEl0ZXJhdG9yKCkge1xuICAgIGlmICghX3N5bWJvbEl0ZXJhdG9yKSB7XG4gICAgICAgIHZhciBTeW1ib2xfMSA9IF9nbG9iYWxbJ1N5bWJvbCddO1xuICAgICAgICBpZiAoU3ltYm9sXzEgJiYgU3ltYm9sXzEuaXRlcmF0b3IpIHtcbiAgICAgICAgICAgIF9zeW1ib2xJdGVyYXRvciA9IFN5bWJvbF8xLml0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZXM2LXNoaW0gc3BlY2lmaWMgbG9naWNcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSAnZW50cmllcycgJiYga2V5ICE9PSAnc2l6ZScgJiZcbiAgICAgICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtrZXldID09PSBNYXAucHJvdG90eXBlWydlbnRyaWVzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgX3N5bWJvbEl0ZXJhdG9yID0ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gX3N5bWJvbEl0ZXJhdG9yO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIEpTIGhhcyBOYU4gIT09IE5hTlxuZnVuY3Rpb24gbG9vc2VJZGVudGljYWwoYSwgYikge1xuICAgIHJldHVybiBhID09PSBiIHx8IHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYiA9PT0gJ251bWJlcicgJiYgaXNOYU4oYSkgJiYgaXNOYU4oYik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGRldk1vZGVFcXVhbChhLCBiKSB7XG4gICAgdmFyIGlzTGlzdExpa2VJdGVyYWJsZUEgPSBpc0xpc3RMaWtlSXRlcmFibGUoYSk7XG4gICAgdmFyIGlzTGlzdExpa2VJdGVyYWJsZUIgPSBpc0xpc3RMaWtlSXRlcmFibGUoYik7XG4gICAgaWYgKGlzTGlzdExpa2VJdGVyYWJsZUEgJiYgaXNMaXN0TGlrZUl0ZXJhYmxlQikge1xuICAgICAgICByZXR1cm4gYXJlSXRlcmFibGVzRXF1YWwoYSwgYiwgZGV2TW9kZUVxdWFsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBpc0FPYmplY3QgPSBhICYmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGEgPT09ICdmdW5jdGlvbicpO1xuICAgICAgICB2YXIgaXNCT2JqZWN0ID0gYiAmJiAodHlwZW9mIGIgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnZnVuY3Rpb24nKTtcbiAgICAgICAgaWYgKCFpc0xpc3RMaWtlSXRlcmFibGVBICYmIGlzQU9iamVjdCAmJiAhaXNMaXN0TGlrZUl0ZXJhYmxlQiAmJiBpc0JPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvb3NlSWRlbnRpY2FsKGEsIGIpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0IG9mIGEge0BsaW5rIFBpcGV9IHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkIGV2ZW4gdGhvdWdoIHRoZVxuICogcmVmZXJlbmNlIGhhcyBub3QgY2hhbmdlZC5cbiAqXG4gKiBXcmFwcGVkIHZhbHVlcyBhcmUgdW53cmFwcGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLCBhbmQgdGhlIHVud3JhcHBlZCB2YWx1ZVxuICogaXMgc3RvcmVkLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHtcbiAqICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICogIH0gZWxzZSB7XG4gKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gKiAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOyAvLyB0aGlzIHdpbGwgZm9yY2UgdXBkYXRlXG4gKiAgfVxuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgV3JhcHBlZFZhbHVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFdyYXBwZWRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLndyYXBwZWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZXMgYSB3cmFwcGVkIHZhbHVlLiAqL1xuICAgIFdyYXBwZWRWYWx1ZS53cmFwID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBuZXcgV3JhcHBlZFZhbHVlKHZhbHVlKTsgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHZhbHVlIG9mIGEgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBgdmFsdWVgIHdoZW4gaXQgaXMgbm90IHdyYXBwZWQuXG4gICAgICoqL1xuICAgIFdyYXBwZWRWYWx1ZS51bndyYXAgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIFdyYXBwZWRWYWx1ZS5pc1dyYXBwZWQodmFsdWUpID8gdmFsdWUud3JhcHBlZCA6IHZhbHVlOyB9O1xuICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhIHdyYXBwZWQgdmFsdWUuICovXG4gICAgV3JhcHBlZFZhbHVlLmlzV3JhcHBlZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkVmFsdWU7IH07XG4gICAgcmV0dXJuIFdyYXBwZWRWYWx1ZTtcbn0oKSk7XG5mdW5jdGlvbiBpc0xpc3RMaWtlSXRlcmFibGUob2JqKSB7XG4gICAgaWYgKCFpc0pzT2JqZWN0KG9iaikpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgICAgICghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgLy8gSlMgTWFwIGFyZSBpdGVyYWJsZXMgYnV0IHJldHVybiBlbnRyaWVzIGFzIFtrLCB2XVxuICAgICAgICAgICAgZ2V0U3ltYm9sSXRlcmF0b3IoKSBpbiBvYmopOyAvLyBKUyBJdGVyYWJsZSBoYXZlIGEgU3ltYm9sLml0ZXJhdG9yIHByb3Bcbn1cbmZ1bmN0aW9uIGFyZUl0ZXJhYmxlc0VxdWFsKGEsIGIsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaXRlcmF0b3IxID0gYVtnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgIHZhciBpdGVyYXRvcjIgPSBiW2dldFN5bWJvbEl0ZXJhdG9yKCldKCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGl0ZW0xID0gaXRlcmF0b3IxLm5leHQoKTtcbiAgICAgICAgdmFyIGl0ZW0yID0gaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgaWYgKGl0ZW0xLmRvbmUgJiYgaXRlbTIuZG9uZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoaXRlbTEuZG9uZSB8fCBpdGVtMi5kb25lKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWNvbXBhcmF0b3IoaXRlbTEudmFsdWUsIGl0ZW0yLnZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpdGVyYXRlTGlzdExpa2Uob2JqLCBmbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZuKG9ialtpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IG9ialtnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgICAgICB2YXIgaXRlbSA9IHZvaWQgMDtcbiAgICAgICAgd2hpbGUgKCEoKGl0ZW0gPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpKSB7XG4gICAgICAgICAgICBmbihpdGVtLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGlzSnNPYmplY3Qobykge1xuICAgIHJldHVybiBvICE9PSBudWxsICYmICh0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbyA9PT0gJ29iamVjdCcpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUT0RPKG1pc2tvKTogY29uc2lkZXIgaW5saW5pbmdcbi8qKiBVcGRhdGVzIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHZhbHVlLiAqL1xuZnVuY3Rpb24gdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkge1xuICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7XG59XG4vKiogR2V0cyB0aGUgY3VycmVudCBiaW5kaW5nIHZhbHVlLiAqL1xuZnVuY3Rpb24gZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4KSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBiaW5kaW5nSW5kZXgpO1xuICAgIG5nRGV2TW9kZSAmJlxuICAgICAgICBhc3NlcnROb3RTYW1lKGxWaWV3W2JpbmRpbmdJbmRleF0sIE5PX0NIQU5HRSwgJ1N0b3JlZCB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpO1xuICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdO1xufVxuLyoqIFVwZGF0ZXMgYmluZGluZyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBpdCB3YXMgdXBkYXRlZC4gKi9cbmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdFNhbWUodmFsdWUsIE5PX0NIQU5HRSwgJ0luY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuJyk7XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydExlc3NUaGFuKGJpbmRpbmdJbmRleCwgbFZpZXcubGVuZ3RoLCBcIlNsb3Qgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB0byBOT19DSEFOR0VcIik7XG4gICAgdmFyIG9sZFZhbHVlID0gbFZpZXdbYmluZGluZ0luZGV4XTtcbiAgICBpZiAoaXNEaWZmZXJlbnQob2xkVmFsdWUsIHZhbHVlKSkge1xuICAgICAgICBpZiAobmdEZXZNb2RlICYmIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKSB7XG4gICAgICAgICAgICAvLyBWaWV3IGVuZ2luZSBkaWRuJ3QgcmVwb3J0IHVuZGVmaW5lZCB2YWx1ZXMgYXMgY2hhbmdlZCBvbiB0aGUgZmlyc3QgY2hlY2tOb0NoYW5nZXMgcGFzc1xuICAgICAgICAgICAgLy8gKGJlZm9yZSB0aGUgY2hhbmdlIGRldGVjdGlvbiB3YXMgcnVuKS5cbiAgICAgICAgICAgIHZhciBvbGRWYWx1ZVRvQ29tcGFyZSA9IG9sZFZhbHVlICE9PSBOT19DSEFOR0UgPyBvbGRWYWx1ZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghZGV2TW9kZUVxdWFsKG9sZFZhbHVlVG9Db21wYXJlLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9ySWZOb0NoYW5nZXNNb2RlKG9sZFZhbHVlID09PSBOT19DSEFOR0UsIG9sZFZhbHVlVG9Db21wYXJlLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbFZpZXdbYmluZGluZ0luZGV4XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqIFVwZGF0ZXMgMiBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBlaXRoZXIgd2FzIHVwZGF0ZWQuICovXG5mdW5jdGlvbiBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMikge1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCBleHAxKTtcbiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDEsIGV4cDIpIHx8IGRpZmZlcmVudDtcbn1cbi8qKiBVcGRhdGVzIDMgYmluZGluZ3MgaWYgY2hhbmdlZCwgdGhlbiByZXR1cm5zIHdoZXRoZXIgYW55IHdhcyB1cGRhdGVkLiAqL1xuZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMpIHtcbiAgICB2YXIgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4ICsgMiwgZXhwMykgfHwgZGlmZmVyZW50O1xufVxuLyoqIFVwZGF0ZXMgNCBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBhbnkgd2FzIHVwZGF0ZWQuICovXG5mdW5jdGlvbiBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkge1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMik7XG4gICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkMihsVmlldywgYmluZGluZ0luZGV4ICsgMiwgZXhwMywgZXhwNCkgfHwgZGlmZmVyZW50O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgc2VsZWN0ZWQgZWxlbWVudC5cbiAqXG4gKiBPcGVyYXRlcyBvbiB0aGUgZWxlbWVudCBzZWxlY3RlZCBieSBpbmRleCB2aWEgdGhlIHtAbGluayBzZWxlY3R9IGluc3RydWN0aW9uLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsXG4gKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdFxuICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWRcbiAqXG4gKiBAcGFyYW0gcHJvcE5hbWUgTmFtZSBvZiBwcm9wZXJ0eS4gQmVjYXVzZSBpdCBpcyBnb2luZyB0byBET00sIHRoaXMgaXMgbm90IHN1YmplY3QgdG9cbiAqICAgICAgICByZW5hbWluZyBhcyBwYXJ0IG9mIG1pbmlmaWNhdGlvbi5cbiAqIEBwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUuXG4gKiBAcGFyYW0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG8gc2FuaXRpemUgdGhlIHZhbHVlLlxuICogQHBhcmFtIG5hdGl2ZU9ubHkgV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIG9ubHkgc2V0IG5hdGl2ZSBwcm9wZXJ0aWVzIGFuZCBza2lwIGlucHV0IGNoZWNrXG4gKiAodGhpcyBpcyBuZWNlc3NhcnkgZm9yIGhvc3QgcHJvcGVydHkgYmluZGluZ3MpXG4gKiBAcmV0dXJucyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgaXRzZWxmIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWRcbiAqIChlLmcuIGBwcm9wZXJ0eSgnbmFtZScsIGN0eC5uYW1lKSgndGl0bGUnLCBjdHgudGl0bGUpYClcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hdGl2ZU9ubHkpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdEVxdWFsKGluZGV4LCAtMSwgJ3NlbGVjdGVkIGluZGV4IGNhbm5vdCBiZSAtMScpO1xuICAgIHZhciBiaW5kUmVjb25jaWxlZFZhbHVlID0gybXJtWJpbmQodmFsdWUpO1xuICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKGluZGV4LCBwcm9wTmFtZSwgYmluZFJlY29uY2lsZWRWYWx1ZSwgc2FuaXRpemVyLCBuYXRpdmVPbmx5KTtcbiAgICByZXR1cm4gybXJtXByb3BlcnR5O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHZhbHVlIGJpbmRpbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGRpZmZcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1YmluZCh2YWx1ZSkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdKys7XG4gICAgc3RvcmVCaW5kaW5nTWV0YWRhdGEobFZpZXcpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkgPyB2YWx1ZSA6IE5PX0NIQU5HRTtcbn1cbi8qKlxuKiAqKlRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIGFmdGVyIGBwcm9wZXJ0eWAgaXMgaW4gdXNlKipcbiogVXBkYXRlIGEgcHJvcGVydHkgb24gYW4gZWxlbWVudC5cbipcbiogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcyxcbiogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3RcbiogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgQElucHV0cyBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLlxuKlxuKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHVwZGF0ZSBpbiB0aGUgZGF0YSBhcnJheVxuKiBAcGFyYW0gcHJvcE5hbWUgTmFtZSBvZiBwcm9wZXJ0eS4gQmVjYXVzZSBpdCBpcyBnb2luZyB0byBET00sIHRoaXMgaXMgbm90IHN1YmplY3QgdG9cbiogICAgICAgIHJlbmFtaW5nIGFzIHBhcnQgb2YgbWluaWZpY2F0aW9uLlxuKiBAcGFyYW0gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlLlxuKiBAcGFyYW0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHVzZWQgdG8gc2FuaXRpemUgdGhlIHZhbHVlLlxuKiBAcGFyYW0gbmF0aXZlT25seSBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgb25seSBzZXQgbmF0aXZlIHByb3BlcnRpZXMgYW5kIHNraXAgaW5wdXQgY2hlY2tcbiogKHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBob3N0IHByb3BlcnR5IGJpbmRpbmdzKVxuICpcbiAqIEBjb2RlR2VuQXBpXG4qL1xuZnVuY3Rpb24gybXJtWVsZW1lbnRQcm9wZXJ0eShpbmRleCwgcHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hdGl2ZU9ubHkpIHtcbiAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbChpbmRleCwgcHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hdGl2ZU9ubHkpO1xufVxuLyoqXG4gKiBVcGRhdGVzIGEgc3ludGhldGljIGhvc3QgYmluZGluZyAoZS5nLiBgW0Bmb29dYCkgb24gYSBjb21wb25lbnQuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBpcyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlcyBhbmQgaXMgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgYVxuICogc3ludGhldGljIGhvc3QgYmluZGluZyAoZS5nLiBgQEhvc3RCaW5kaW5nKCdAZm9vJylgKSBwcm9wZXJseSBnZXRzIHJlbmRlcmVkIGluXG4gKiB0aGUgY29tcG9uZW50J3MgcmVuZGVyZXIuIE5vcm1hbGx5IGFsbCBob3N0IGJpbmRpbmdzIGFyZSBldmFsdWF0ZWQgd2l0aCB0aGUgcGFyZW50XG4gKiBjb21wb25lbnQncyByZW5kZXJlciwgYnV0LCBpbiB0aGUgY2FzZSBvZiBhbmltYXRpb24gQHRyaWdnZXJzLCB0aGV5IG5lZWQgdG8gYmVcbiAqIGV2YWx1YXRlZCB3aXRoIHRoZSBzdWIgY29tcG9uZW50J3MgcmVuZGVyZXIgKGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoZSBhbmltYXRpb25cbiAqIHRyaWdnZXJzIGFyZSBkZWZpbmVkKS5cbiAqXG4gKiBEbyBub3QgdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gYXMgYSByZXBsYWNlbWVudCBmb3IgYGVsZW1lbnRQcm9wZXJ0eWAuIFRoaXMgaW5zdHJ1Y3Rpb25cbiAqIG9ubHkgZXhpc3RzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFZpZXdFbmdpbmUncyBob3N0IGJpbmRpbmcgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byB1cGRhdGUgaW4gdGhlIGRhdGEgYXJyYXlcbiAqIEBwYXJhbSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0b1xuICogICAgICAgIHJlbmFtaW5nIGFzIHBhcnQgb2YgbWluaWZpY2F0aW9uLlxuICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSB0byB3cml0ZS5cbiAqIEBwYXJhbSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gbmF0aXZlT25seSBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgb25seSBzZXQgbmF0aXZlIHByb3BlcnRpZXMgYW5kIHNraXAgaW5wdXQgY2hlY2tcbiAqICh0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgaG9zdCBwcm9wZXJ0eSBiaW5kaW5ncylcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY1Byb3BlcnR5KGluZGV4LCBwcm9wTmFtZSwgdmFsdWUsIHNhbml0aXplciwgbmF0aXZlT25seSkge1xuICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKGluZGV4LCBwcm9wTmFtZSwgdmFsdWUsIHNhbml0aXplciwgbmF0aXZlT25seSwgbG9hZENvbXBvbmVudFJlbmRlcmVyKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBDcmVhdGUgaW50ZXJwb2xhdGlvbiBiaW5kaW5ncyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zLlxuICpcbiAqIElmIHRoZXJlIGFyZSAxIHRvIDggZXhwcmVzc2lvbnMgYGludGVycG9sYXRpb24xKClgIHRvIGBpbnRlcnBvbGF0aW9uOCgpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICogVGhvc2UgYXJlIGZhc3RlciBiZWNhdXNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGFuIGFycmF5IG9mIGV4cHJlc3Npb25zIGFuZCBpdGVyYXRlIG92ZXIgaXQuXG4gKlxuICogYHZhbHVlc2A6XG4gKiAtIGhhcyBzdGF0aWMgdGV4dCBhdCBldmVuIGluZGV4ZXMsXG4gKiAtIGhhcyBldmFsdWF0ZWQgZXhwcmVzc2lvbnMgYXQgb2RkIGluZGV4ZXMuXG4gKlxuICogUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyB3aGVuIGFueSBvZiB0aGUgYXJndW1lbnRzIGNoYW5nZXMsIGBOT19DSEFOR0VgIG90aGVyd2lzZS5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1aW50ZXJwb2xhdGlvblYodmFsdWVzKSB7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydExlc3NUaGFuKDIsIHZhbHVlcy5sZW5ndGgsICdzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHZhbHVlcycpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh2YWx1ZXMubGVuZ3RoICUgMiwgMSwgJ3Nob3VsZCBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdmFsdWVzJyk7XG4gICAgdmFyIGRpZmZlcmVudCA9IGZhbHNlO1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHREYXRhID0gbFZpZXdbVFZJRVddLmRhdGE7XG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdO1xuICAgIGlmICh0RGF0YVtiaW5kaW5nSW5kZXhdID09IG51bGwpIHtcbiAgICAgICAgLy8gMiBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0YXRpYyBpbnRlcnN0aXRpYWwgdmFsdWUgKGllLiBub3QgcHJlZml4KVxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgdERhdGFbYmluZGluZ0luZGV4KytdID0gdmFsdWVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAvLyBDaGVjayBpZiBiaW5kaW5ncyAob2RkIGluZGV4ZXMpIGhhdmUgY2hhbmdlZFxuICAgICAgICBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4KyssIHZhbHVlc1tpXSkgJiYgKGRpZmZlcmVudCA9IHRydWUpO1xuICAgIH1cbiAgICBsVmlld1tCSU5ESU5HX0lOREVYXSA9IGJpbmRpbmdJbmRleDtcbiAgICBzdG9yZUJpbmRpbmdNZXRhZGF0YShsVmlldywgdmFsdWVzWzBdLCB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdKTtcbiAgICBpZiAoIWRpZmZlcmVudCkge1xuICAgICAgICByZXR1cm4gTk9fQ0hBTkdFO1xuICAgIH1cbiAgICAvLyBCdWlsZCB0aGUgdXBkYXRlZCBjb250ZW50XG4gICAgdmFyIGNvbnRlbnQgPSB2YWx1ZXNbMF07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgY29udGVudCArPSByZW5kZXJTdHJpbmdpZnkodmFsdWVzW2ldKSArIHZhbHVlc1tpICsgMV07XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDEgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IHN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjAgdmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIHN1ZmZpeCBzdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpbnRlcnBvbGF0aW9uMShwcmVmaXgsIHYwLCBzdWZmaXgpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZChsVmlldywgbFZpZXdbQklORElOR19JTkRFWF0rKywgdjApO1xuICAgIHN0b3JlQmluZGluZ01ldGFkYXRhKGxWaWV3LCBwcmVmaXgsIHN1ZmZpeCk7XG4gICAgcmV0dXJuIGRpZmZlcmVudCA/IHByZWZpeCArIHJlbmRlclN0cmluZ2lmeSh2MCkgKyBzdWZmaXggOiBOT19DSEFOR0U7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggMiBleHByZXNzaW9ucy5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1aW50ZXJwb2xhdGlvbjIocHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBsVmlld1tCSU5ESU5HX0lOREVYXTtcbiAgICB2YXIgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSk7XG4gICAgbFZpZXdbQklORElOR19JTkRFWF0gKz0gMjtcbiAgICAvLyBPbmx5IHNldCBzdGF0aWMgc3RyaW5ncyB0aGUgZmlyc3QgdGltZSAoZGF0YSB3aWxsIGJlIG51bGwgc3Vic2VxdWVudCBydW5zKS5cbiAgICB2YXIgZGF0YSA9IHN0b3JlQmluZGluZ01ldGFkYXRhKGxWaWV3LCBwcmVmaXgsIHN1ZmZpeCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbFZpZXdbVFZJRVddLmRhdGFbYmluZGluZ0luZGV4XSA9IGkwO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAzIGV4cHJlc3Npb25zLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpbnRlcnBvbGF0aW9uMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gbFZpZXdbQklORElOR19JTkRFWF07XG4gICAgdmFyIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkMyhsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyKTtcbiAgICBsVmlld1tCSU5ESU5HX0lOREVYXSArPSAzO1xuICAgIC8vIE9ubHkgc2V0IHN0YXRpYyBzdHJpbmdzIHRoZSBmaXJzdCB0aW1lIChkYXRhIHdpbGwgYmUgbnVsbCBzdWJzZXF1ZW50IHJ1bnMpLlxuICAgIHZhciBkYXRhID0gc3RvcmVCaW5kaW5nTWV0YWRhdGEobFZpZXcsIHByZWZpeCwgc3VmZml4KTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICB2YXIgdERhdGEgPSBsVmlld1tUVklFV10uZGF0YTtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4XSA9IGkwO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSA9IGkxO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW50ID9cbiAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIHN1ZmZpeCA6XG4gICAgICAgIE5PX0NIQU5HRTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDQgZXhwcmVzc2lvbnMuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWludGVycG9sYXRpb240KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdO1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIGxWaWV3W0JJTkRJTkdfSU5ERVhdICs9IDQ7XG4gICAgLy8gT25seSBzZXQgc3RhdGljIHN0cmluZ3MgdGhlIGZpcnN0IHRpbWUgKGRhdGEgd2lsbCBiZSBudWxsIHN1YnNlcXVlbnQgcnVucykuXG4gICAgdmFyIGRhdGEgPSBzdG9yZUJpbmRpbmdNZXRhZGF0YShsVmlldywgcHJlZml4LCBzdWZmaXgpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHZhciB0RGF0YSA9IGxWaWV3W1RWSUVXXS5kYXRhO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXhdID0gaTA7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleCArIDFdID0gaTE7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleCArIDJdID0gaTI7XG4gICAgfVxuICAgIHJldHVybiBkaWZmZXJlbnQgP1xuICAgICAgICBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKyByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgK1xuICAgICAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHYzKSArIHN1ZmZpeCA6XG4gICAgICAgIE5PX0NIQU5HRTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCA1IGV4cHJlc3Npb25zLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpbnRlcnBvbGF0aW9uNShwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdO1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCkgfHwgZGlmZmVyZW50O1xuICAgIGxWaWV3W0JJTkRJTkdfSU5ERVhdICs9IDU7XG4gICAgLy8gT25seSBzZXQgc3RhdGljIHN0cmluZ3MgdGhlIGZpcnN0IHRpbWUgKGRhdGEgd2lsbCBiZSBudWxsIHN1YnNlcXVlbnQgcnVucykuXG4gICAgdmFyIGRhdGEgPSBzdG9yZUJpbmRpbmdNZXRhZGF0YShsVmlldywgcHJlZml4LCBzdWZmaXgpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHZhciB0RGF0YSA9IGxWaWV3W1RWSUVXXS5kYXRhO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXhdID0gaTA7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleCArIDFdID0gaTE7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleCArIDJdID0gaTI7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleCArIDNdID0gaTM7XG4gICAgfVxuICAgIHJldHVybiBkaWZmZXJlbnQgP1xuICAgICAgICBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKyByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgK1xuICAgICAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHYzKSArIGkzICsgcmVuZGVyU3RyaW5naWZ5KHY0KSArIHN1ZmZpeCA6XG4gICAgICAgIE5PX0NIQU5HRTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCA2IGV4cHJlc3Npb25zLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpbnRlcnBvbGF0aW9uNihwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gbFZpZXdbQklORElOR19JTkRFWF07XG4gICAgdmFyIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUpIHx8IGRpZmZlcmVudDtcbiAgICBsVmlld1tCSU5ESU5HX0lOREVYXSArPSA2O1xuICAgIC8vIE9ubHkgc2V0IHN0YXRpYyBzdHJpbmdzIHRoZSBmaXJzdCB0aW1lIChkYXRhIHdpbGwgYmUgbnVsbCBzdWJzZXF1ZW50IHJ1bnMpLlxuICAgIHZhciBkYXRhID0gc3RvcmVCaW5kaW5nTWV0YWRhdGEobFZpZXcsIHByZWZpeCwgc3VmZml4KTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICB2YXIgdERhdGEgPSBsVmlld1tUVklFV10uZGF0YTtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4XSA9IGkwO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSA9IGkxO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAyXSA9IGkyO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAzXSA9IGkzO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyA0XSA9IGk0O1xuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW50ID9cbiAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIGkyICtcbiAgICAgICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArIHJlbmRlclN0cmluZ2lmeSh2NSkgKyBzdWZmaXggOlxuICAgICAgICBOT19DSEFOR0U7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNyBleHByZXNzaW9ucy5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1aW50ZXJwb2xhdGlvbjcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gbFZpZXdbQklORElOR19JTkRFWF07XG4gICAgdmFyIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUsIHY2KSB8fCBkaWZmZXJlbnQ7XG4gICAgbFZpZXdbQklORElOR19JTkRFWF0gKz0gNztcbiAgICAvLyBPbmx5IHNldCBzdGF0aWMgc3RyaW5ncyB0aGUgZmlyc3QgdGltZSAoZGF0YSB3aWxsIGJlIG51bGwgc3Vic2VxdWVudCBydW5zKS5cbiAgICB2YXIgZGF0YSA9IHN0b3JlQmluZGluZ01ldGFkYXRhKGxWaWV3LCBwcmVmaXgsIHN1ZmZpeCk7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgICAgdmFyIHREYXRhID0gbFZpZXdbVFZJRVddLmRhdGE7XG4gICAgICAgIHREYXRhW2JpbmRpbmdJbmRleF0gPSBpMDtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4ICsgMV0gPSBpMTtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4ICsgMl0gPSBpMjtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4ICsgM10gPSBpMztcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4ICsgNF0gPSBpNDtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4ICsgNV0gPSBpNTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZlcmVudCA/XG4gICAgICAgIHByZWZpeCArIHJlbmRlclN0cmluZ2lmeSh2MCkgKyBpMCArIHJlbmRlclN0cmluZ2lmeSh2MSkgKyBpMSArIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArXG4gICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjMpICsgaTMgKyByZW5kZXJTdHJpbmdpZnkodjQpICsgaTQgKyByZW5kZXJTdHJpbmdpZnkodjUpICsgaTUgK1xuICAgICAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY2KSArIHN1ZmZpeCA6XG4gICAgICAgIE5PX0NIQU5HRTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCA4IGV4cHJlc3Npb25zLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpbnRlcnBvbGF0aW9uOChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGxWaWV3W0JJTkRJTkdfSU5ERVhdO1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4ICsgNCwgdjQsIHY1LCB2NiwgdjcpIHx8IGRpZmZlcmVudDtcbiAgICBsVmlld1tCSU5ESU5HX0lOREVYXSArPSA4O1xuICAgIC8vIE9ubHkgc2V0IHN0YXRpYyBzdHJpbmdzIHRoZSBmaXJzdCB0aW1lIChkYXRhIHdpbGwgYmUgbnVsbCBzdWJzZXF1ZW50IHJ1bnMpLlxuICAgIHZhciBkYXRhID0gc3RvcmVCaW5kaW5nTWV0YWRhdGEobFZpZXcsIHByZWZpeCwgc3VmZml4KTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICB2YXIgdERhdGEgPSBsVmlld1tUVklFV10uZGF0YTtcbiAgICAgICAgdERhdGFbYmluZGluZ0luZGV4XSA9IGkwO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSA9IGkxO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAyXSA9IGkyO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyAzXSA9IGkzO1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyA0XSA9IGk0O1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyA1XSA9IGk1O1xuICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXggKyA2XSA9IGk2O1xuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW50ID9cbiAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIGkyICtcbiAgICAgICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArIHJlbmRlclN0cmluZ2lmeSh2NSkgKyBpNSArXG4gICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjYpICsgaTYgKyByZW5kZXJTdHJpbmdpZnkodjcpICsgc3VmZml4IDpcbiAgICAgICAgTk9fQ0hBTkdFO1xufVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8gTkVXIElOU1RSVUNUSU9OU1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKipcbiAqXG4gKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBhIGxvbmUgYm91bmQgdmFsdWVcbiAqXG4gKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdCwgYW4gbm8gYWRkaXRpb25hbCB0ZXh0XG4gKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiB0aXRsZT1cInt7djB9fVwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoJ3RpdGxlJywgdjApO1xuICogYGBgXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcyxcbiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0XG4gKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC5cbiAqXG4gKiBAcGFyYW0gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZVxuICogQHBhcmFtIHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZShwcm9wTmFtZSwgdjAsIHNhbml0aXplcikge1xuICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMShwcm9wTmFtZSwgJycsIHYwLCAnJywgc2FuaXRpemVyKTtcbiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU7XG59XG4vKipcbiAqXG4gKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LlxuICpcbiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgdGl0bGU9XCJwcmVmaXh7e3YwfX1zdWZmaXhcIj48L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6XG4gKlxuICogYGBgdHNcbiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMSgndGl0bGUnLCAncHJlZml4JywgdjAsICdzdWZmaXgnKTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsXG4gKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdFxuICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuXG4gKlxuICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGVcbiAqIEBwYXJhbSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvblxuICogQHJldHVybnMgaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBzdWZmaXgsIHNhbml0aXplcikge1xuICAgIHZhciBpbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbChpbmRleCwgcHJvcE5hbWUsIMm1ybVpbnRlcnBvbGF0aW9uMShwcmVmaXgsIHYwLCBzdWZmaXgpLCBzYW5pdGl6ZXIpO1xuICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTE7XG59XG4vKipcbiAqXG4gKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCAyIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuXG4gKlxuICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgdGl0bGU9XCJwcmVmaXh7e3YwfX0te3t2MX19c3VmZml4XCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OlxuICpcbiAqIGBgYHRzXG4gKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTIoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnc3VmZml4Jyk7XG4gKiBgYGBcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLFxuICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3RcbiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLlxuICpcbiAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlXG4gKiBAcGFyYW0gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC5cbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMihwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgsIHNhbml0aXplcikge1xuICAgIHZhciBpbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbChpbmRleCwgcHJvcE5hbWUsIMm1ybVpbnRlcnBvbGF0aW9uMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCksIHNhbml0aXplcik7XG4gICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMjtcbn1cbi8qKlxuICpcbiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC5cbiAqXG4gKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiB0aXRsZT1cInByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4XCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OlxuICpcbiAqIGBgYHRzXG4gKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMoXG4gKiAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICdzdWZmaXgnKTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsXG4gKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdFxuICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuXG4gKlxuICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGVcbiAqIEBwYXJhbSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvblxuICogQHJldHVybnMgaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUzKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4LCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvbjMocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCksIHNhbml0aXplcik7XG4gICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMztcbn1cbi8qKlxuICpcbiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC5cbiAqXG4gKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiB0aXRsZT1cInByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0KFxuICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnc3VmZml4Jyk7XG4gKiBgYGBcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLFxuICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3RcbiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLlxuICpcbiAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlXG4gKiBAcGFyYW0gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC5cbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNChwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4LCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvbjQocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KSwgc2FuaXRpemVyKTtcbiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0O1xufVxuLyoqXG4gKlxuICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LlxuICpcbiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IHRpdGxlPVwicHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fXN1ZmZpeFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1KFxuICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnc3VmZml4Jyk7XG4gKiBgYGBcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLFxuICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3RcbiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLlxuICpcbiAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlXG4gKiBAcGFyYW0gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC5cbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNShwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgsIHNhbml0aXplcikge1xuICAgIHZhciBpbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbChpbmRleCwgcHJvcE5hbWUsIMm1ybVpbnRlcnBvbGF0aW9uNShwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCksIHNhbml0aXplcik7XG4gICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNTtcbn1cbi8qKlxuICpcbiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC5cbiAqXG4gKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA2IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiB0aXRsZT1cInByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4XCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OlxuICpcbiAqIGBgYHRzXG4gKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYoXG4gKiAgICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICdzdWZmaXgnKTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsXG4gKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdFxuICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuXG4gKlxuICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGVcbiAqIEBwYXJhbSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuXG4gKiBAcGFyYW0gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvblxuICogQHJldHVybnMgaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU2KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4LCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvbjYocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCksIHNhbml0aXplcik7XG4gICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNjtcbn1cbi8qKlxuICpcbiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDcgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC5cbiAqXG4gKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiB0aXRsZT1cInByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3KFxuICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7XG4gKiBgYGBcbiAqXG4gKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLFxuICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3RcbiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLlxuICpcbiAqIEBwYXJhbSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlXG4gKiBAcGFyYW0gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuXG4gKiBAcGFyYW0gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLlxuICogQHBhcmFtIHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC5cbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNyhwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4LCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvbjcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSwgc2FuaXRpemVyKTtcbiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3O1xufVxuLyoqXG4gKlxuICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LlxuICpcbiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IHRpdGxlPVwicHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fXN1ZmZpeFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4KFxuICogICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJ3N1ZmZpeCcpO1xuICogYGBgXG4gKlxuICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcyxcbiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0XG4gKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC5cbiAqXG4gKiBAcGFyYW0gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZVxuICogQHBhcmFtIHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHY2IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBpNiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LlxuICogQHBhcmFtIHY3IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS5cbiAqIEBwYXJhbSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS5cbiAqIEBwYXJhbSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTgocHJvcE5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4LCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvbjgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpLCBzYW5pdGl6ZXIpO1xuICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTg7XG59XG4vKipcbiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDggb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LlxuICpcbiAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA3LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxkaXZcbiAqICB0aXRsZT1cInByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeFwiPjwvZGl2PlxuICogYGBgXG4gKlxuICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjpcbiAqXG4gKiBgYGB0c1xuICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGVWKFxuICogICd0aXRsZScsIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksXG4gKiAgJ3N1ZmZpeCddKTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsXG4gKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdFxuICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuXG4gKlxuICogQHBhcmFtIHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbmJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aCBhXG4gKiBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguXG4gKiAoZS5nLiBgWydwcmVmaXgnLCB2YWx1ZTAsICctJywgdmFsdWUxLCAnLScsIHZhbHVlMiwgLi4uLCB2YWx1ZTk5LCAnc3VmZml4J11gKVxuICogQHBhcmFtIHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb25cbiAqIEByZXR1cm5zIGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC5cbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlVihwcm9wTmFtZSwgdmFsdWVzLCBzYW5pdGl6ZXIpIHtcbiAgICB2YXIgaW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7XG4gICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwoaW5kZXgsIHByb3BOYW1lLCDJtcm1aW50ZXJwb2xhdGlvblYodmFsdWVzKSwgc2FuaXRpemVyKTtcbiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGVWO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFNlbGVjdHMgYW4gZWxlbWVudCBmb3IgbGF0ZXIgYmluZGluZyBpbnN0cnVjdGlvbnMuXG4gKlxuICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGluc3RydWN0aW9ucyBsaWtlIHtAbGluayBwcm9wZXJ0eX0gdG8gYWN0IG9uIGVsZW1lbnRzIHdpdGggc3BlY2lmaWVkXG4gKiBpbmRpY2VzLCBmb3IgZXhhbXBsZSB0aG9zZSBjcmVhdGVkIHdpdGgge0BsaW5rIGVsZW1lbnR9IG9yIHtAbGluayBlbGVtZW50U3RhcnR9LlxuICpcbiAqIGBgYHRzXG4gKiAocmY6IFJlbmRlckZsYWdzLCBjdHg6IGFueSkgPT4ge1xuICogICBpZiAocmYgJiAxKSB7XG4gKiAgICAgZWxlbWVudCgwLCAnZGl2Jyk7XG4gKiAgIH1cbiAqICAgaWYgKHJmICYgMikge1xuICogICAgIHNlbGVjdCgwKTsgLy8gU2VsZWN0IHRoZSA8ZGl2Lz4gY3JlYXRlZCBhYm92ZS5cbiAqICAgICBwcm9wZXJ0eSgndGl0bGUnLCAndGVzdCcpO1xuICogICB9XG4gKiAgfVxuICogYGBgXG4gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGFjdCBvbiB3aXRoIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXNlbGVjdChpbmRleCkge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsICdJbnZhbGlkIGluZGV4Jyk7XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydExlc3NUaGFuKGluZGV4LCBnZXRMVmlldygpLmxlbmd0aCAtIEhFQURFUl9PRkZTRVQsICdTaG91bGQgYmUgd2l0aGluIHJhbmdlIGZvciB0aGUgdmlldyBkYXRhJyk7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICAvLyBGbHVzaCB0aGUgaW5pdGlhbCBob29rcyBmb3IgZWxlbWVudHMgaW4gdGhlIHZpZXcgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdXAgdG8gdGhpcyBwb2ludC5cbiAgICBleGVjdXRlUHJlT3JkZXJIb29rcyhsVmlldywgbFZpZXdbVFZJRVddLCBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSwgaW5kZXgpO1xuICAgIC8vIFdlIG11c3Qgc2V0IHRoZSBzZWxlY3RlZCBpbmRleCAqYWZ0ZXIqIHJ1bm5pbmcgdGhlIGhvb2tzLCBiZWNhdXNlIGhvb2tzIG1heSBoYXZlIHNpZGUtZWZmZWN0c1xuICAgIC8vIHRoYXQgY2F1c2Ugb3RoZXIgdGVtcGxhdGUgZnVuY3Rpb25zIHRvIHJ1biwgdGh1cyB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgaW5kZXgsIHdoaWNoIGlzIGdsb2JhbFxuICAgIC8vIHN0YXRlLiBJZiB3ZSBydW4gYHNldFNlbGVjdGVkSW5kZXhgICpiZWZvcmUqIHdlIHJ1biB0aGUgaG9va3MsIGluIHNvbWUgY2FzZXMgdGhlIHNlbGVjdGVkIGluZGV4XG4gICAgLy8gd2lsbCBiZSBhbHRlcmVkIGJ5IHRoZSB0aW1lIHdlIGxlYXZlIHRoZSBgybXJtXNlbGVjdGAgaW5zdHJ1Y3Rpb24uXG4gICAgc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQ3JlYXRlIHN0YXRpYyB0ZXh0IG5vZGVcbiAqXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIG5vZGUgaW4gdGhlIGRhdGEgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB3cml0ZS4gVGhpcyB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybV0ZXh0KGluZGV4LCB2YWx1ZSkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGxWaWV3W0JJTkRJTkdfSU5ERVhdLCBsVmlld1tUVklFV10uYmluZGluZ1N0YXJ0SW5kZXgsICd0ZXh0IG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MnKTtcbiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUrKztcbiAgICB2YXIgdGV4dE5hdGl2ZSA9IGNyZWF0ZVRleHROb2RlKHZhbHVlLCBsVmlld1tSRU5ERVJFUl0pO1xuICAgIHZhciB0Tm9kZSA9IGNyZWF0ZU5vZGVBdEluZGV4KGluZGV4LCAzIC8qIEVsZW1lbnQgKi8sIHRleHROYXRpdmUsIG51bGwsIG51bGwpO1xuICAgIC8vIFRleHQgbm9kZXMgYXJlIHNlbGYgY2xvc2luZy5cbiAgICBzZXRJc1BhcmVudChmYWxzZSk7XG4gICAgYXBwZW5kQ2hpbGQodGV4dE5hdGl2ZSwgdE5vZGUsIGxWaWV3KTtcbn1cbi8qKlxuICogQ3JlYXRlIHRleHQgbm9kZSB3aXRoIGJpbmRpbmdcbiAqIEJpbmRpbmdzIHNob3VsZCBiZSBoYW5kbGVkIGV4dGVybmFsbHkgd2l0aCB0aGUgcHJvcGVyIGludGVycG9sYXRpb24oMS04KSBtZXRob2RcbiAqXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgdGhlIG5vZGUgaW4gdGhlIGRhdGEgYXJyYXkuXG4gKiBAcGFyYW0gdmFsdWUgU3RyaW5naWZpZWQgdmFsdWUgdG8gd3JpdGUuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXRleHRCaW5kaW5nKGluZGV4LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gTk9fQ0hBTkdFKSB7XG4gICAgICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldyk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGVsZW1lbnQsICduYXRpdmUgZWxlbWVudCBzaG91bGQgZXhpc3QnKTtcbiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKztcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdO1xuICAgICAgICBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5zZXRWYWx1ZShlbGVtZW50LCByZW5kZXJTdHJpbmdpZnkodmFsdWUpKSA6XG4gICAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gcmVuZGVyU3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBZGRzIGEgcGxheWVyIHRvIGFuIGVsZW1lbnQsIGRpcmVjdGl2ZSBvciBjb21wb25lbnQgaW5zdGFuY2UgdGhhdCB3aWxsIGxhdGVyIGJlXG4gKiBhbmltYXRlZCBvbmNlIGNoYW5nZSBkZXRlY3Rpb24gaGFzIHBhc3NlZC5cbiAqXG4gKiBXaGVuIGEgcGxheWVyIGlzIGFkZGVkIHRvIGEgcmVmZXJlbmNlIGl0IHdpbGwgc3RheSBhY3RpdmUgdW50aWwgYHBsYXllci5kZXN0cm95KClgXG4gKiBpcyBjYWxsZWQuIE9uY2UgY2FsbGVkIHRoZW4gdGhlIHBsYXllciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgYWN0aXZlIHBsYXllcnNcbiAqIHByZXNlbnQgb24gdGhlIGFzc29jaWF0ZWQgcmVmIGluc3RhbmNlLlxuICpcbiAqIFRvIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBhY3RpdmUgcGxheWVycyBvbiBhbiBlbGVtZW50IHNlZSBbZ2V0UGxheWVyc10uXG4gKlxuICogQHBhcmFtIHJlZiBUaGUgZWxlbWVudCwgZGlyZWN0aXZlIG9yIGNvbXBvbmVudCB0aGF0IHRoZSBwbGF5ZXIgd2lsbCBiZSBwbGFjZWQgb24uXG4gKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB0byBwbGF5IG9uY2UgY2hhbmdlIGRldGVjdGlvbiBoYXMgcnVuLlxuICovXG5mdW5jdGlvbiBhZGRQbGF5ZXIocmVmLCBwbGF5ZXIpIHtcbiAgICB2YXIgY29udGV4dCA9IGdldExDb250ZXh0KHJlZik7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiB0aHJvd0ludmFsaWRSZWZFcnJvcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gY29udGV4dC5uYXRpdmU7XG4gICAgdmFyIGxWaWV3ID0gY29udGV4dC5sVmlldztcbiAgICB2YXIgcGxheWVyQ29udGV4dCA9IGdldE9yQ3JlYXRlUGxheWVyQ29udGV4dChlbGVtZW50LCBjb250ZXh0KTtcbiAgICB2YXIgcm9vdENvbnRleHQgPSBnZXRSb290Q29udGV4dChsVmlldyk7XG4gICAgYWRkUGxheWVySW50ZXJuYWwocGxheWVyQ29udGV4dCwgcm9vdENvbnRleHQsIGVsZW1lbnQsIHBsYXllciwgMCwgcmVmKTtcbiAgICBzY2hlZHVsZVRpY2socm9vdENvbnRleHQsIDIgLyogRmx1c2hQbGF5ZXJzICovKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBhY3RpdmUgcGxheWVycyBwcmVzZW50IG9uIHRoZSBwcm92aWRlZCByZWYgaW5zdGFuY2UgKHdoaWNoIGNhblxuICogYmUgYW4gaW5zdGFuY2Ugb2YgYSBkaXJlY3RpdmUsIGNvbXBvbmVudCBvciBlbGVtZW50KS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSByZXR1cm4gcGxheWVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgcmVmIGluc3RhbmNlIHVzaW5nXG4gKiBgYWRkUGxheWVyYCBvciBhbnkgcGxheWVycyB0aGF0IGFyZSBhY3RpdmUgdGhyb3VnaCBhbnkgdGVtcGxhdGUgc3R5bGluZyBiaW5kaW5nc1xuICogKGBbc3R5bGVdYCwgYFtzdHlsZS5wcm9wXWAsIGBbY2xhc3NdYCBhbmQgYFtjbGFzcy5uYW1lXWApLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0UGxheWVycyhyZWYpIHtcbiAgICB2YXIgY29udGV4dCA9IGdldExDb250ZXh0KHJlZik7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiB0aHJvd0ludmFsaWRSZWZFcnJvcigpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBzdHlsaW5nQ29udGV4dCA9IGdldFN0eWxpbmdDb250ZXh0RnJvbUxWaWV3KGNvbnRleHQubm9kZUluZGV4LCBjb250ZXh0LmxWaWV3KTtcbiAgICB2YXIgcGxheWVyQ29udGV4dCA9IHN0eWxpbmdDb250ZXh0ID8gZ2V0UGxheWVyQ29udGV4dChzdHlsaW5nQ29udGV4dCkgOiBudWxsO1xuICAgIHJldHVybiBwbGF5ZXJDb250ZXh0ID8gZ2V0UGxheWVyc0ludGVybmFsKHBsYXllckNvbnRleHQpIDogW107XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogUmV0dXJucyB0aGUgY29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIERPTSBob3N0IGVsZW1lbnQuXG4gKiBFbGVtZW50cyB3aGljaCBkb24ndCByZXByZXNlbnQgY29tcG9uZW50cyByZXR1cm4gYG51bGxgLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IEhvc3QgRE9NIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKlxuICogYGBgXG4gKiA8bXktYXBwPlxuICogICAjVklFV1xuICogICAgIDxkaXY+XG4gKiAgICAgICA8Y2hpbGQtY29tcD48L2NoaWxkLWNvbXA+XG4gKiAgICAgPC9kaXY+XG4gKiA8L21wLWFwcD5cbiAqXG4gKiBleHBlY3QoZ2V0Q29tcG9uZW50KDxjaGlsZC1jb21wPikgaW5zdGFuY2VvZiBDaGlsZENvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICogZXhwZWN0KGdldENvbXBvbmVudCg8bXktYXBwPikgaW5zdGFuY2VvZiBNeUFwcCkudG9CZVRydXRoeSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnQoZWxlbWVudCkge1xuICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0RnJvbU5vZGUoZWxlbWVudCk7XG4gICAgaWYgKGNvbnRleHQuY29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBnZXRDb21wb25lbnRBdE5vZGVJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0LmNvbXBvbmVudDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIERPTSBob3N0IGVsZW1lbnQuXG4gKiBFbGVtZW50cyB3aGljaCBkb24ndCByZXByZXNlbnQgY29tcG9uZW50cyByZXR1cm4gYG51bGxgLlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IEhvc3QgRE9NIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKlxuICogYGBgXG4gKiA8bXktYXBwPlxuICogICAjVklFV1xuICogICAgIDxkaXY+XG4gKiAgICAgICA8Y2hpbGQtY29tcD48L2NoaWxkLWNvbXA+XG4gKiAgICAgPC9kaXY+XG4gKiA8L21wLWFwcD5cbiAqXG4gKiBleHBlY3QoZ2V0Q29tcG9uZW50KDxjaGlsZC1jb21wPikgaW5zdGFuY2VvZiBDaGlsZENvbXBvbmVudCkudG9CZVRydXRoeSgpO1xuICogZXhwZWN0KGdldENvbXBvbmVudCg8bXktYXBwPikgaW5zdGFuY2VvZiBNeUFwcCkudG9CZVRydXRoeSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRDb250ZXh0KGVsZW1lbnQpIHtcbiAgICB2YXIgY29udGV4dCA9IGxvYWRMQ29udGV4dEZyb21Ob2RlKGVsZW1lbnQpO1xuICAgIHJldHVybiBjb250ZXh0LmxWaWV3W0NPTlRFWFRdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHZpZXcgd2hpY2ggb3ducyB0aGUgRE9NIGVsZW1lbnQgKGBudWxsYFxuICogb3RoZXJ3aXNlKS5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCB3aGljaCBpcyBvd25lZCBieSBhbiBleGlzdGluZyBjb21wb25lbnQncyB2aWV3LlxuICpcbiAqIGBgYFxuICogPG15LWFwcD5cbiAqICAgI1ZJRVdcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGNoaWxkLWNvbXA+PC9jaGlsZC1jb21wPlxuICogICAgIDwvZGl2PlxuICogPC9tcC1hcHA+XG4gKlxuICogZXhwZWN0KGdldFZpZXdDb21wb25lbnQoPGNoaWxkLWNvbXA+KSBpbnN0YW5jZW9mIE15QXBwKS50b0JlVHJ1dGh5KCk7XG4gKiBleHBlY3QoZ2V0Vmlld0NvbXBvbmVudCg8bXktYXBwPikpLnRvRXF1YWwobnVsbCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldFZpZXdDb21wb25lbnQoZWxlbWVudCkge1xuICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnQpO1xuICAgIHZhciBsVmlldyA9IGNvbnRleHQubFZpZXc7XG4gICAgdmFyIHBhcmVudDtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpO1xuICAgIHdoaWxlIChsVmlld1tIT1NUXSA9PT0gbnVsbCAmJiAocGFyZW50ID0gZ2V0TFZpZXdQYXJlbnQobFZpZXcpKSkge1xuICAgICAgICAvLyBBcyBsb25nIGFzIGxWaWV3W0hPU1RdIGlzIG51bGwgd2Uga25vdyB3ZSBhcmUgcGFydCBvZiBzdWItdGVtcGxhdGUgc3VjaCBhcyBgKm5nSWZgXG4gICAgICAgIGxWaWV3ID0gcGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gbFZpZXdbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLyA/IG51bGwgOiBsVmlld1tDT05URVhUXTtcbn1cbi8qKlxuICogUmV0cmlldmUgYWxsIHJvb3QgY29tcG9uZW50cy5cbiAqXG4gKiBSb290IGNvbXBvbmVudHMgYXJlIHRob3NlIHdoaWNoIGhhdmUgYmVlbiBib290c3RyYXBwZWQgYnkgQW5ndWxhci5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEEgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRSb290Q29tcG9uZW50cyh0YXJnZXQpIHtcbiAgICByZXR1cm4gX19zcHJlYWQoZ2V0Um9vdENvbnRleHQodGFyZ2V0KS5jb21wb25lbnRzKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIGFuIGBJbmplY3RvcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgQSBET00gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldEluamVjdG9yKHRhcmdldCkge1xuICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0KHRhcmdldCk7XG4gICAgdmFyIHROb2RlID0gY29udGV4dC5sVmlld1tUVklFV10uZGF0YVtjb250ZXh0Lm5vZGVJbmRleF07XG4gICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGNvbnRleHQubFZpZXcpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZSBhIHNldCBvZiBpbmplY3Rpb24gdG9rZW5zIGF0IGEgZ2l2ZW4gRE9NIG5vZGUuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgRWxlbWVudCBmb3Igd2hpY2ggdGhlIGluamVjdGlvbiB0b2tlbnMgc2hvdWxkIGJlIHJldHJpZXZlZC5cbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0SW5qZWN0aW9uVG9rZW5zKGVsZW1lbnQpIHtcbiAgICB2YXIgY29udGV4dCA9IGxvYWRMQ29udGV4dChlbGVtZW50LCBmYWxzZSk7XG4gICAgaWYgKCFjb250ZXh0KVxuICAgICAgICByZXR1cm4gW107XG4gICAgdmFyIGxWaWV3ID0gY29udGV4dC5sVmlldztcbiAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgdmFyIHROb2RlID0gdFZpZXcuZGF0YVtjb250ZXh0Lm5vZGVJbmRleF07XG4gICAgdmFyIHByb3ZpZGVyVG9rZW5zID0gW107XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLztcbiAgICB2YXIgZW5kSW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRWaWV3LmRhdGFbaV07XG4gICAgICAgIGlmIChpc0RpcmVjdGl2ZURlZkhhY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmFjdCB0aGF0IHdlIHNvbWV0aW1lcyBzdG9yZSBUeXBlIGFuZCBzb21ldGltZXMgRGlyZWN0aXZlRGVmIGluIHRoaXMgbG9jYXRpb24gaXMgYVxuICAgICAgICAgICAgLy8gZGVzaWduIGZsYXcuICBXZSBzaG91bGQgYWx3YXlzIHN0b3JlIHNhbWUgdHlwZSBzbyB0aGF0IHdlIGNhbiBiZSBtb25vbW9ycGhpYy4gVGhlIGlzc3VlXG4gICAgICAgICAgICAvLyBpcyB0aGF0IGZvciBDb21wb25lbnRzL0RpcmVjdGl2ZXMgd2Ugc3RvcmUgdGhlIGRlZiBpbnN0ZWFkIHRoZSB0eXBlLiBUaGUgY29ycmVjdCBiZWhhdmlvclxuICAgICAgICAgICAgLy8gaXMgdGhhdCB3ZSBzaG91bGQgYWx3YXlzIGJlIHN0b3JpbmcgaW5qZWN0YWJsZSB0eXBlIGluIHRoaXMgbG9jYXRpb24uXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcHJvdmlkZXJUb2tlbnMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwcm92aWRlclRva2Vucztcbn1cbi8qKlxuICogUmV0cmlldmVzIGRpcmVjdGl2ZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRE9NIGhvc3QgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEEgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXREaXJlY3RpdmVzKHRhcmdldCkge1xuICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0KHRhcmdldCk7XG4gICAgaWYgKGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZXNBdE5vZGVJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldywgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dC5kaXJlY3RpdmVzIHx8IFtdO1xufVxuZnVuY3Rpb24gbG9hZExDb250ZXh0KHRhcmdldCwgdGhyb3dPbk5vdEZvdW5kKSB7XG4gICAgaWYgKHRocm93T25Ob3RGb3VuZCA9PT0gdm9pZCAwKSB7IHRocm93T25Ob3RGb3VuZCA9IHRydWU7IH1cbiAgICB2YXIgY29udGV4dCA9IGdldExDb250ZXh0KHRhcmdldCk7XG4gICAgaWYgKCFjb250ZXh0ICYmIHRocm93T25Ob3RGb3VuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobmdEZXZNb2RlID8gXCJVbmFibGUgdG8gZmluZCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCBcIiArIHN0cmluZ2lmeUZvckVycm9yKHRhcmdldCkgOlxuICAgICAgICAgICAgJ0ludmFsaWQgbmcgdGFyZ2V0Jyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xufVxuLyoqXG4gKiBSZXRyaWV2ZSBtYXAgb2YgbG9jYWwgcmVmZXJlbmNlcy5cbiAqXG4gKiBUaGUgcmVmZXJlbmNlcyBhcmUgcmV0cmlldmVkIGFzIGEgbWFwIG9mIGxvY2FsIHJlZmVyZW5jZSBuYW1lIHRvIGVsZW1lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgQSBET00gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsUmVmcyh0YXJnZXQpIHtcbiAgICB2YXIgY29udGV4dCA9IGxvYWRMQ29udGV4dCh0YXJnZXQpO1xuICAgIGlmIChjb250ZXh0LmxvY2FsUmVmcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQubG9jYWxSZWZzID0gZGlzY292ZXJMb2NhbFJlZnMoY29udGV4dC5sVmlldywgY29udGV4dC5ub2RlSW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dC5sb2NhbFJlZnMgfHwge307XG59XG4vKipcbiAqIFJldHJpZXZlIHRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgaG9zdCBlbGVtZW50IG9mIHRoZSBjb21wb25lbnQuIFRoZSBob3N0XG4gKiBlbGVtZW50IGlzIHRoZSBlbGVtZW50IHdoaWNoIHRoZSBjb21wb25lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEBwYXJhbSBkaXJlY3RpdmUgQ29tcG9uZW50IG9yIERpcmVjdGl2ZSBmb3Igd2hpY2ggdGhlIGhvc3QgZWxlbWVudCBzaG91bGQgYmUgcmV0cmlldmVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0SG9zdEVsZW1lbnQoZGlyZWN0aXZlKSB7XG4gICAgcmV0dXJuIGdldExDb250ZXh0KGRpcmVjdGl2ZSkubmF0aXZlO1xufVxuZnVuY3Rpb24gbG9hZExDb250ZXh0RnJvbU5vZGUobm9kZSkge1xuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgaW5zdGFuY2Ugb2YgRE9NIE5vZGUnKTtcbiAgICByZXR1cm4gbG9hZExDb250ZXh0KG5vZGUpO1xufVxuZnVuY3Rpb24gaXNCcm93c2VyRXZlbnRzKGxpc3RlbmVyKSB7XG4gICAgLy8gQnJvd3NlciBldmVudHMgYXJlIHRob3NlIHdoaWNoIGRvbid0IGhhdmUgYHVzZUNhcHR1cmVgIGFzIGJvb2xlYW4uXG4gICAgcmV0dXJuIHR5cGVvZiBsaXN0ZW5lci51c2VDYXB0dXJlID09PSAnYm9vbGVhbic7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgRE9NIGxpc3RlbmVycy5cbiAqXG4gKiBgYGBcbiAqIDxteS1hcHA+XG4gKiAgICNWSUVXXG4gKiAgICAgPGRpdiAoY2xpY2spPVwiZG9Tb21ldGhpbmcoKVwiPlxuICogICAgIDwvZGl2PlxuICogPC9tcC1hcHA+XG4gKlxuICogZXhwZWN0KGdldExpc3RlbmVycyg8ZGl2PikpLnRvRXF1YWwoe1xuICogICBuYW1lOiAnY2xpY2snLFxuICogICBlbGVtZW50OiA8ZGl2PixcbiAqICAgY2FsbGJhY2s6ICgpID0+IGRvU29tZXRoaW5nKCksXG4gKiAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgZm9yIHdoaWNoIHRoZSBET00gbGlzdGVuZXJzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExpc3RlbmVycyhlbGVtZW50KSB7XG4gICAgdmFyIGxDb250ZXh0ID0gbG9hZExDb250ZXh0RnJvbU5vZGUoZWxlbWVudCk7XG4gICAgdmFyIGxWaWV3ID0gbENvbnRleHQubFZpZXc7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIHZhciBsQ2xlYW51cCA9IGxWaWV3W0NMRUFOVVBdO1xuICAgIHZhciB0Q2xlYW51cCA9IHRWaWV3LmNsZWFudXA7XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIGlmICh0Q2xlYW51cCAmJiBsQ2xlYW51cCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aDspIHtcbiAgICAgICAgICAgIHZhciBmaXJzdFBhcmFtID0gdENsZWFudXBbaSsrXTtcbiAgICAgICAgICAgIHZhciBzZWNvbmRQYXJhbSA9IHRDbGVhbnVwW2krK107XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpcnN0UGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVfMSA9IGZpcnN0UGFyYW07XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyRWxlbWVudCA9IHVud3JhcFJOb2RlKGxWaWV3W3NlY29uZFBhcmFtXSk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gbENsZWFudXBbdENsZWFudXBbaSsrXV07XG4gICAgICAgICAgICAgICAgdmFyIHVzZUNhcHR1cmVPckluZHggPSB0Q2xlYW51cFtpKytdO1xuICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy5cbiAgICAgICAgICAgICAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIHBvc2l0aXZlIG51bWJlciB0aGVuIGl0IGluIHVuc3Vic2NyaWJlIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgbmVnYXRpdmUgbnVtYmVyIHRoZW4gaXQgaXMgYSBTdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgICB2YXIgdXNlQ2FwdHVyZSA9IHR5cGVvZiB1c2VDYXB0dXJlT3JJbmR4ID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgICAgICAgICB1c2VDYXB0dXJlT3JJbmR4IDpcbiAgICAgICAgICAgICAgICAgICAgKHVzZUNhcHR1cmVPckluZHggPj0gMCA/IGZhbHNlIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbGlzdGVuZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKHsgZWxlbWVudDogZWxlbWVudCwgbmFtZTogbmFtZV8xLCBjYWxsYmFjazogY2FsbGJhY2ssIHVzZUNhcHR1cmU6IHVzZUNhcHR1cmUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxpc3RlbmVycy5zb3J0KHNvcnRMaXN0ZW5lcnMpO1xuICAgIHJldHVybiBsaXN0ZW5lcnM7XG59XG5mdW5jdGlvbiBzb3J0TGlzdGVuZXJzKGEsIGIpIHtcbiAgICBpZiAoYS5uYW1lID09IGIubmFtZSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGEubmFtZSA8IGIubmFtZSA/IC0xIDogMTtcbn1cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGV4aXN0IGJlY2F1c2UgaXQgaXMgbWVnYW1vcnBoaWMgYW5kIG9ubHkgbW9zdGx5IGNvcnJlY3QuXG4gKlxuICogU2VlIGNhbGwgc2l0ZSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBpc0RpcmVjdGl2ZURlZkhhY2sob2JqKSB7XG4gICAgcmV0dXJuIG9iai50eXBlICE9PSB1bmRlZmluZWQgJiYgb2JqLnRlbXBsYXRlICE9PSB1bmRlZmluZWQgJiYgb2JqLmRlY2xhcmVkSW5wdXRzICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGlzIGZpbGUgaW50cm9kdWNlcyBzZXJpZXMgb2YgZ2xvYmFsbHkgYWNjZXNzaWJsZSBkZWJ1ZyB0b29sc1xuICogdG8gYWxsb3cgZm9yIHRoZSBBbmd1bGFyIGRlYnVnZ2luZyBzdG9yeSB0byBmdW5jdGlvbi5cbiAqXG4gKiBUbyBzZWUgdGhpcyBpbiBhY3Rpb24gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDpcbiAqXG4gKiAgIGJhemVsIHJ1biAtLWRlZmluZT1jb21waWxlPWFvdFxuICogICAvL3BhY2thZ2VzL2NvcmUvdGVzdC9idW5kbGluZy90b2RvOmRldnNlcnZlclxuICpcbiAqICBUaGVuIGxvYWQgYGxvY2FsaG9zdDo1NDMyYCBhbmQgc3RhcnQgdXNpbmcgdGhlIGNvbnNvbGUgdG9vbHMuXG4gKi9cbi8qKlxuICogVGhpcyB2YWx1ZSByZWZsZWN0cyB0aGUgcHJvcGVydHkgb24gdGhlIHdpbmRvdyB3aGVyZSB0aGUgZGV2XG4gKiB0b29scyBhcmUgcGF0Y2hlZCAod2luZG93Lm5nKS5cbiAqICovXG52YXIgR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVkgPSAnbmcnO1xudmFyIF9wdWJsaXNoZWQgPSBmYWxzZTtcbi8qKlxuICogUHVibGlzaGVzIGEgY29sbGVjdGlvbiBvZiBkZWZhdWx0IGRlYnVnIHRvb2xzIG9udG9gd2luZG93Lm5nYC5cbiAqXG4gKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSB3aGVuIEFuZ3VsYXIgaXMgaW4gZGV2ZWxvcG1lbnRcbiAqIG1vZGUgYW5kIGFyZSBhdXRvbWF0aWNhbGx5IHN0cmlwcGVkIGF3YXkgZnJvbSBwcm9kIG1vZGUgaXMgb24uXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMoKSB7XG4gICAgaWYgKCFfcHVibGlzaGVkKSB7XG4gICAgICAgIF9wdWJsaXNoZWQgPSB0cnVlO1xuICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29tcG9uZW50JywgZ2V0Q29tcG9uZW50KTtcbiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldENvbnRleHQnLCBnZXRDb250ZXh0KTtcbiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldExpc3RlbmVycycsIGdldExpc3RlbmVycyk7XG4gICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRWaWV3Q29tcG9uZW50JywgZ2V0Vmlld0NvbXBvbmVudCk7XG4gICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRIb3N0RWxlbWVudCcsIGdldEhvc3RFbGVtZW50KTtcbiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldEluamVjdG9yJywgZ2V0SW5qZWN0b3IpO1xuICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Um9vdENvbXBvbmVudHMnLCBnZXRSb290Q29tcG9uZW50cyk7XG4gICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXREaXJlY3RpdmVzJywgZ2V0RGlyZWN0aXZlcyk7XG4gICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRQbGF5ZXJzJywgZ2V0UGxheWVycyk7XG4gICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdtYXJrRGlydHknLCBtYXJrRGlydHkpO1xuICAgIH1cbn1cbi8qKlxuICogUHVibGlzaGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBgd2luZG93Lm5nYCBzbyB0aGF0IGl0IGNhbiBiZVxuICogdXNlZCBmcm9tIHRoZSBicm93c2VyIGNvbnNvbGUgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBub3QgaW4gcHJvZHVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gcHVibGlzaEdsb2JhbFV0aWwobmFtZSwgZm4pIHtcbiAgICB2YXIgdyA9IF9nbG9iYWw7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoZm4sICdmdW5jdGlvbiBub3QgZGVmaW5lZCcpO1xuICAgIGlmICh3KSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSB3W0dMT0JBTF9QVUJMSVNIX0VYUEFORE9fS0VZXTtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHdbR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyW25hbWVdID0gZm47XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEJvb3RzdHJhcHMgYSBDb21wb25lbnQgaW50byBhbiBleGlzdGluZyBob3N0IGVsZW1lbnQgYW5kIHJldHVybnMgYW4gaW5zdGFuY2VcbiAqIG9mIHRoZSBjb21wb25lbnQuXG4gKlxuICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gYm9vdHN0cmFwIGEgY29tcG9uZW50IGludG8gdGhlIERPTSB0cmVlLiBFYWNoIGludm9jYXRpb25cbiAqIG9mIHRoaXMgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBzZXBhcmF0ZSB0cmVlIG9mIGNvbXBvbmVudHMsIGluamVjdG9ycyBhbmRcbiAqIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzIGFuZCBsaWZldGltZXMuIFRvIGR5bmFtaWNhbGx5IGluc2VydCBhIG5ldyBjb21wb25lbnRcbiAqIGludG8gYW4gZXhpc3RpbmcgdHJlZSBzdWNoIHRoYXQgaXQgc2hhcmVzIHRoZSBzYW1lIGluamVjdGlvbiwgY2hhbmdlIGRldGVjdGlvblxuICogYW5kIG9iamVjdCBsaWZldGltZSwgdXNlIHtAbGluayBWaWV3Q29udGFpbmVyI2NyZWF0ZUNvbXBvbmVudH0uXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudFR5cGUgQ29tcG9uZW50IHRvIGJvb3RzdHJhcFxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgcGFyYW1ldGVycyB3aGljaCBjb250cm9sIGJvb3RzdHJhcHBpbmdcbiAqL1xuZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudFR5cGUgLyogVHlwZSBhcyB3b3JrYXJvdW5kIGZvcjogTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQ4ODEgKi8sIG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgIG5nRGV2TW9kZSAmJiBwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzKCk7XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydENvbXBvbmVudFR5cGUoY29tcG9uZW50VHlwZSk7XG4gICAgdmFyIHJlbmRlcmVyRmFjdG9yeSA9IG9wdHMucmVuZGVyZXJGYWN0b3J5IHx8IGRvbVJlbmRlcmVyRmFjdG9yeTM7XG4gICAgdmFyIHNhbml0aXplciA9IG9wdHMuc2FuaXRpemVyIHx8IG51bGw7XG4gICAgdmFyIGNvbXBvbmVudERlZiA9IGdldENvbXBvbmVudERlZihjb21wb25lbnRUeXBlKTtcbiAgICBpZiAoY29tcG9uZW50RGVmLnR5cGUgIT0gY29tcG9uZW50VHlwZSlcbiAgICAgICAgY29tcG9uZW50RGVmLnR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgIC8vIFRoZSBmaXJzdCBpbmRleCBvZiB0aGUgZmlyc3Qgc2VsZWN0b3IgaXMgdGhlIHRhZyBuYW1lLlxuICAgIHZhciBjb21wb25lbnRUYWcgPSBjb21wb25lbnREZWYuc2VsZWN0b3JzWzBdWzBdO1xuICAgIHZhciBob3N0Uk5vZGUgPSBsb2NhdGVIb3N0RWxlbWVudChyZW5kZXJlckZhY3RvcnksIG9wdHMuaG9zdCB8fCBjb21wb25lbnRUYWcpO1xuICAgIHZhciByb290RmxhZ3MgPSBjb21wb25lbnREZWYub25QdXNoID8gNjQgLyogRGlydHkgKi8gfCA1MTIgLyogSXNSb290ICovIDpcbiAgICAgICAgMTYgLyogQ2hlY2tBbHdheXMgKi8gfCA1MTIgLyogSXNSb290ICovO1xuICAgIHZhciByb290Q29udGV4dCA9IGNyZWF0ZVJvb3RDb250ZXh0KG9wdHMuc2NoZWR1bGVyLCBvcHRzLnBsYXllckhhbmRsZXIpO1xuICAgIHZhciByZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihob3N0Uk5vZGUsIGNvbXBvbmVudERlZik7XG4gICAgdmFyIHJvb3RWaWV3ID0gY3JlYXRlTFZpZXcobnVsbCwgY3JlYXRlVFZpZXcoLTEsIG51bGwsIDEsIDAsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLCByb290Q29udGV4dCwgcm9vdEZsYWdzLCBudWxsLCBudWxsLCByZW5kZXJlckZhY3RvcnksIHJlbmRlcmVyLCB1bmRlZmluZWQsIG9wdHMuaW5qZWN0b3IgfHwgbnVsbCk7XG4gICAgdmFyIG9sZFZpZXcgPSBlbnRlclZpZXcocm9vdFZpZXcsIG51bGwpO1xuICAgIHZhciBjb21wb25lbnQ7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5iZWdpbilcbiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5iZWdpbigpO1xuICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IGNyZWF0ZVJvb3RDb21wb25lbnRWaWV3KGhvc3RSTm9kZSwgY29tcG9uZW50RGVmLCByb290VmlldywgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlciwgc2FuaXRpemVyKTtcbiAgICAgICAgY29tcG9uZW50ID0gY3JlYXRlUm9vdENvbXBvbmVudChjb21wb25lbnRWaWV3LCBjb21wb25lbnREZWYsIHJvb3RWaWV3LCByb290Q29udGV4dCwgb3B0cy5ob3N0RmVhdHVyZXMgfHwgbnVsbCk7XG4gICAgICAgIGFkZFRvVmlld1RyZWUocm9vdFZpZXcsIGNvbXBvbmVudFZpZXcpO1xuICAgICAgICByZWZyZXNoRGVzY2VuZGFudFZpZXdzKHJvb3RWaWV3KTsgLy8gY3JlYXRpb24gbW9kZSBwYXNzXG4gICAgICAgIHJvb3RWaWV3W0ZMQUdTXSAmPSB+NCAvKiBDcmVhdGlvbk1vZGUgKi87XG4gICAgICAgIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3Mocm9vdFZpZXcpO1xuICAgICAgICByZWZyZXNoRGVzY2VuZGFudFZpZXdzKHJvb3RWaWV3KTsgLy8gdXBkYXRlIG1vZGUgcGFzc1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgbGVhdmVWaWV3KG9sZFZpZXcpO1xuICAgICAgICBpZiAocmVuZGVyZXJGYWN0b3J5LmVuZClcbiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbi8qKlxuICogQ3JlYXRlcyB0aGUgcm9vdCBjb21wb25lbnQgdmlldyBhbmQgdGhlIHJvb3QgY29tcG9uZW50IG5vZGUuXG4gKlxuICogQHBhcmFtIHJOb2RlIFJlbmRlciBob3N0IGVsZW1lbnQuXG4gKiBAcGFyYW0gZGVmIENvbXBvbmVudERlZlxuICogQHBhcmFtIHJvb3RWaWV3IFRoZSBwYXJlbnQgdmlldyB3aGVyZSB0aGUgaG9zdCBub2RlIGlzIHN0b3JlZFxuICogQHBhcmFtIHJlbmRlcmVyIFRoZSBjdXJyZW50IHJlbmRlcmVyXG4gKiBAcGFyYW0gc2FuaXRpemVyIFRoZSBzYW5pdGl6ZXIsIGlmIHByb3ZpZGVkXG4gKlxuICogQHJldHVybnMgQ29tcG9uZW50IHZpZXcgY3JlYXRlZFxuICovXG5mdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50VmlldyhyTm9kZSwgZGVmLCByb290VmlldywgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlciwgc2FuaXRpemVyKSB7XG4gICAgcmVzZXRDb21wb25lbnRTdGF0ZSgpO1xuICAgIHZhciB0VmlldyA9IHJvb3RWaWV3W1RWSUVXXTtcbiAgICB2YXIgdE5vZGUgPSBjcmVhdGVOb2RlQXRJbmRleCgwLCAzIC8qIEVsZW1lbnQgKi8sIHJOb2RlLCBudWxsLCBudWxsKTtcbiAgICB2YXIgY29tcG9uZW50VmlldyA9IGNyZWF0ZUxWaWV3KHJvb3RWaWV3LCBnZXRPckNyZWF0ZVRWaWV3KGRlZi50ZW1wbGF0ZSwgZGVmLmNvbnN0cywgZGVmLnZhcnMsIGRlZi5kaXJlY3RpdmVEZWZzLCBkZWYucGlwZURlZnMsIGRlZi52aWV3UXVlcnksIGRlZi5zY2hlbWFzKSwgbnVsbCwgZGVmLm9uUHVzaCA/IDY0IC8qIERpcnR5ICovIDogMTYgLyogQ2hlY2tBbHdheXMgKi8sIHJvb3RWaWV3W0hFQURFUl9PRkZTRVRdLCB0Tm9kZSwgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlciwgc2FuaXRpemVyKTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgcm9vdFZpZXcpLCByb290VmlldywgZGVmLnR5cGUpO1xuICAgICAgICB0Tm9kZS5mbGFncyA9IDEgLyogaXNDb21wb25lbnQgKi87XG4gICAgICAgIGluaXROb2RlRmxhZ3ModE5vZGUsIHJvb3RWaWV3Lmxlbmd0aCwgMSk7XG4gICAgICAgIHF1ZXVlQ29tcG9uZW50SW5kZXhGb3JDaGVjayh0Tm9kZSk7XG4gICAgfVxuICAgIC8vIFN0b3JlIGNvbXBvbmVudCB2aWV3IGF0IG5vZGUgaW5kZXgsIHdpdGggbm9kZSBhcyB0aGUgSE9TVFxuICAgIHJldHVybiByb290Vmlld1tIRUFERVJfT0ZGU0VUXSA9IGNvbXBvbmVudFZpZXc7XG59XG4vKipcbiAqIENyZWF0ZXMgYSByb290IGNvbXBvbmVudCBhbmQgc2V0cyBpdCB1cCB3aXRoIGZlYXR1cmVzIGFuZCBob3N0IGJpbmRpbmdzLiBTaGFyZWQgYnlcbiAqIHJlbmRlckNvbXBvbmVudCgpIGFuZCBWaWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudCgpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50KGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudERlZiwgcm9vdFZpZXcsIHJvb3RDb250ZXh0LCBob3N0RmVhdHVyZXMpIHtcbiAgICB2YXIgdFZpZXcgPSByb290Vmlld1tUVklFV107XG4gICAgLy8gQ3JlYXRlIGRpcmVjdGl2ZSBpbnN0YW5jZSB3aXRoIGZhY3RvcnkoKSBhbmQgc3RvcmUgYXQgbmV4dCBpbmRleCBpbiB2aWV3RGF0YVxuICAgIHZhciBjb21wb25lbnQgPSBpbnN0YW50aWF0ZVJvb3RDb21wb25lbnQodFZpZXcsIHJvb3RWaWV3LCBjb21wb25lbnREZWYpO1xuICAgIHJvb3RDb250ZXh0LmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICAgIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0gPSBjb21wb25lbnQ7XG4gICAgaG9zdEZlYXR1cmVzICYmIGhvc3RGZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChmZWF0dXJlKSB7IHJldHVybiBmZWF0dXJlKGNvbXBvbmVudCwgY29tcG9uZW50RGVmKTsgfSk7XG4gICAgLy8gV2Ugd2FudCB0byBnZW5lcmF0ZSBhbiBlbXB0eSBRdWVyeUxpc3QgZm9yIHJvb3QgY29udGVudCBxdWVyaWVzIGZvciBiYWNrd2FyZHNcbiAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggVmlld0VuZ2luZS5cbiAgICBpZiAoY29tcG9uZW50RGVmLmNvbnRlbnRRdWVyaWVzKSB7XG4gICAgICAgIGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcygxIC8qIENyZWF0ZSAqLywgY29tcG9uZW50LCByb290Vmlldy5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgdmFyIHJvb3RUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIGlmICh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcyAmJiBjb21wb25lbnREZWYuaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBlbGVtZW50SW5kZXggPSByb290VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICAgICAgICBzZXRBY3RpdmVIb3N0RWxlbWVudChlbGVtZW50SW5kZXgpO1xuICAgICAgICB2YXIgZXhwYW5kbyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7XG4gICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGNvbXBvbmVudERlZiwgZXhwYW5kbywgY29tcG9uZW50LCByb290VE5vZGUsIHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzKTtcbiAgICAgICAgcm9vdFROb2RlLm9uRWxlbWVudENyZWF0aW9uRm5zICYmIGFwcGx5T25DcmVhdGVJbnN0cnVjdGlvbnMocm9vdFROb2RlKTtcbiAgICAgICAgc2V0QWN0aXZlSG9zdEVsZW1lbnQobnVsbCk7XG4gICAgfVxuICAgIGlmIChyb290VE5vZGUuc3R5bGluZ1RlbXBsYXRlKSB7XG4gICAgICAgIHZhciBuYXRpdmUgPSBjb21wb25lbnRWaWV3W0hPU1RdO1xuICAgICAgICByZW5kZXJJbml0aWFsQ2xhc3NlcyhuYXRpdmUsIHJvb3RUTm9kZS5zdHlsaW5nVGVtcGxhdGUsIGNvbXBvbmVudFZpZXdbUkVOREVSRVJdKTtcbiAgICAgICAgcmVuZGVySW5pdGlhbFN0eWxlcyhuYXRpdmUsIHJvb3RUTm9kZS5zdHlsaW5nVGVtcGxhdGUsIGNvbXBvbmVudFZpZXdbUkVOREVSRVJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RDb250ZXh0KHNjaGVkdWxlciwgcGxheWVySGFuZGxlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICBzY2hlZHVsZXI6IHNjaGVkdWxlciB8fCBkZWZhdWx0U2NoZWR1bGVyLFxuICAgICAgICBjbGVhbjogQ0xFQU5fUFJPTUlTRSxcbiAgICAgICAgcGxheWVySGFuZGxlcjogcGxheWVySGFuZGxlciB8fCBudWxsLFxuICAgICAgICBmbGFnczogMCAvKiBFbXB0eSAqL1xuICAgIH07XG59XG4vKipcbiAqIFVzZWQgdG8gZW5hYmxlIGxpZmVjeWNsZSBob29rcyBvbiB0aGUgcm9vdCBjb21wb25lbnQuXG4gKlxuICogSW5jbHVkZSB0aGlzIGZlYXR1cmUgd2hlbiBjYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIGlmIHRoZSByb290IGNvbXBvbmVudFxuICogeW91IGFyZSByZW5kZXJpbmcgaGFzIGxpZmVjeWNsZSBob29rcyBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBob29rcyB3b24ndFxuICogYmUgY2FsbGVkIHByb3Blcmx5LlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiByZW5kZXJDb21wb25lbnQoQXBwQ29tcG9uZW50LCB7ZmVhdHVyZXM6IFtSb290TGlmZWN5Y2xlSG9va3NdfSk7XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gTGlmZWN5Y2xlSG9va3NGZWF0dXJlKGNvbXBvbmVudCwgZGVmKSB7XG4gICAgdmFyIHJvb3RUVmlldyA9IHJlYWRQYXRjaGVkTFZpZXcoY29tcG9uZW50KVtUVklFV107XG4gICAgdmFyIGRpckluZGV4ID0gcm9vdFRWaWV3LmRhdGEubGVuZ3RoIC0gMTtcbiAgICByZWdpc3RlclByZU9yZGVySG9va3MoZGlySW5kZXgsIGRlZiwgcm9vdFRWaWV3LCAtMSwgLTEsIC0xKTtcbiAgICAvLyBUT0RPKG1pc2tvKTogcmVwbGFjZSBgYXMgVE5vZGVgIHdpdGggY3JlYXRlVE5vZGUgY2FsbC4gKG5lZWRzIHJlZmFjdG9yaW5nIHRvIGxvc2UgZGVwIG9uXG4gICAgLy8gTE5vZGUpLlxuICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3Mocm9vdFRWaWV3LCB7IGRpcmVjdGl2ZVN0YXJ0OiBkaXJJbmRleCwgZGlyZWN0aXZlRW5kOiBkaXJJbmRleCArIDEgfSk7XG59XG4vKipcbiAqIFdhaXQgb24gY29tcG9uZW50IHVudGlsIGl0IGlzIHJlbmRlcmVkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGBQcm9taXNlYCB3aGljaCBpcyByZXNvbHZlZCB3aGVuIHRoZSBjb21wb25lbnQnc1xuICogY2hhbmdlIGRldGVjdGlvbiBpcyBleGVjdXRlZC4gVGhpcyBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgdGhlIHNjaGVkdWxlclxuICogYXNzb2NpYXRlZCB3aXRoIHRoZSBgY29tcG9uZW50YCdzIHJlbmRlciB0cmVlIGFuZCB3YWl0aW5nIHVudGlsIHRoZSBzY2hlZHVsZXJcbiAqIGZsdXNoZXMuIElmIG5vdGhpbmcgaXMgc2NoZWR1bGVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHJlc29sdmVkIHByb21pc2UuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYFxuICogYXdhaXQgd2hlblJlbmRlcmVkKG15Q29tcG9uZW50KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHdhaXQgdXBvblxuICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgcmVuZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHdoZW5SZW5kZXJlZChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gZ2V0Um9vdENvbnRleHQoY29tcG9uZW50KS5jbGVhbjtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGEgYmFzaWMgY2hhbmdlIGZyb20gYSBwcmV2aW91cyB0byBhIG5ldyB2YWx1ZSBmb3IgYSBzaW5nbGVcbiAqIHByb3BlcnR5IG9uIGEgZGlyZWN0aXZlIGluc3RhbmNlLiBQYXNzZWQgYXMgYSB2YWx1ZSBpbiBhXG4gKiB7QGxpbmsgU2ltcGxlQ2hhbmdlc30gb2JqZWN0IHRvIHRoZSBgbmdPbkNoYW5nZXNgIGhvb2suXG4gKlxuICogQHNlZSBgT25DaGFuZ2VzYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFNpbXBsZUNoYW5nZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVDaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlLCBmaXJzdENoYW5nZSkge1xuICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5maXJzdENoYW5nZSA9IGZpcnN0Q2hhbmdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBuZXcgdmFsdWUgaXMgdGhlIGZpcnN0IHZhbHVlIGFzc2lnbmVkLlxuICAgICAqL1xuICAgIFNpbXBsZUNoYW5nZS5wcm90b3R5cGUuaXNGaXJzdENoYW5nZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZmlyc3RDaGFuZ2U7IH07XG4gICAgcmV0dXJuIFNpbXBsZUNoYW5nZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVGhlIE5nT25DaGFuZ2VzRmVhdHVyZSBkZWNvcmF0ZXMgYSBjb21wb25lbnQgd2l0aCBzdXBwb3J0IGZvciB0aGUgbmdPbkNoYW5nZXNcbiAqIGxpZmVjeWNsZSBob29rLCBzbyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW55IGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHNcbiAqIHRoYXQgaG9vay5cbiAqXG4gKiBJZiB0aGUgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSB1c2VzIGluaGVyaXRhbmNlLCB0aGUgTmdPbkNoYW5nZXNGZWF0dXJlIE1VU1RcbiAqIGJlIGluY2x1ZGVkIGFzIGEgZmVhdHVyZSBBRlRFUiB7QGxpbmsgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlfSwgb3RoZXJ3aXNlXG4gKiBpbmhlcml0ZWQgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBuZ09uQ2hhbmdlcyBsaWZlY3ljbGVcbiAqIGhvb2suXG4gKlxuICogRXhhbXBsZSB1c2FnZTpcbiAqXG4gKiBgYGBcbiAqIHN0YXRpYyBuZ0NvbXBvbmVudERlZiA9IGRlZmluZUNvbXBvbmVudCh7XG4gKiAgIC4uLlxuICogICBpbnB1dHM6IHtuYW1lOiAncHVibGljTmFtZSd9LFxuICogICBmZWF0dXJlczogW05nT25DaGFuZ2VzRmVhdHVyZSgpXVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlKCkge1xuICAgIC8vIFRoaXMgb3B0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbmdPbkNoYW5nZXMgbGlmZWN5Y2xlIGhvb2sgd2lsbCBiZSBpbmhlcml0ZWRcbiAgICAvLyBmcm9tIHN1cGVyY2xhc3NlcyAoaW4gSW5oZXJpdERlZmluaXRpb25GZWF0dXJlKS5cbiAgICBOZ09uQ2hhbmdlc0ZlYXR1cmVJbXBsLm5nSW5oZXJpdCA9IHRydWU7XG4gICAgcmV0dXJuIE5nT25DaGFuZ2VzRmVhdHVyZUltcGw7XG59XG5mdW5jdGlvbiBOZ09uQ2hhbmdlc0ZlYXR1cmVJbXBsKGRlZmluaXRpb24pIHtcbiAgICBpZiAoZGVmaW5pdGlvbi50eXBlLnByb3RvdHlwZS5uZ09uQ2hhbmdlcykge1xuICAgICAgICBkZWZpbml0aW9uLnNldElucHV0ID0gbmdPbkNoYW5nZXNTZXRJbnB1dDtcbiAgICAgICAgZGVmaW5pdGlvbi5vbkNoYW5nZXMgPSB3cmFwT25DaGFuZ2VzKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcE9uQ2hhbmdlcygpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gd3JhcE9uQ2hhbmdlc0hvb2tfaW5QcmV2aW91c0NoYW5nZXNTdG9yYWdlKCkge1xuICAgICAgICB2YXIgc2ltcGxlQ2hhbmdlc1N0b3JlID0gZ2V0U2ltcGxlQ2hhbmdlc1N0b3JlKHRoaXMpO1xuICAgICAgICB2YXIgY3VycmVudCA9IHNpbXBsZUNoYW5nZXNTdG9yZSAmJiBzaW1wbGVDaGFuZ2VzU3RvcmUuY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHNpbXBsZUNoYW5nZXNTdG9yZS5wcmV2aW91cztcbiAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PT0gRU1QVFlfT0JKKSB7XG4gICAgICAgICAgICAgICAgc2ltcGxlQ2hhbmdlc1N0b3JlLnByZXZpb3VzID0gY3VycmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBjaGFuZ2VzIGFyZSBjb3BpZWQgdG8gdGhlIHByZXZpb3VzIHN0b3JlLCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgaGlzdG9yeSBmb3IgaW5wdXRzXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggd2VyZSBub3QgY2hhbmdlZCB0aGlzIHRpbWVcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1trZXldID0gY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpbXBsZUNoYW5nZXNTdG9yZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubmdPbkNoYW5nZXMoY3VycmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuZnVuY3Rpb24gbmdPbkNoYW5nZXNTZXRJbnB1dChpbnN0YW5jZSwgdmFsdWUsIHB1YmxpY05hbWUsIHByaXZhdGVOYW1lKSB7XG4gICAgdmFyIHNpbXBsZUNoYW5nZXNTdG9yZSA9IGdldFNpbXBsZUNoYW5nZXNTdG9yZShpbnN0YW5jZSkgfHxcbiAgICAgICAgc2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlLCB7IHByZXZpb3VzOiBFTVBUWV9PQkosIGN1cnJlbnQ6IG51bGwgfSk7XG4gICAgdmFyIGN1cnJlbnQgPSBzaW1wbGVDaGFuZ2VzU3RvcmUuY3VycmVudCB8fCAoc2ltcGxlQ2hhbmdlc1N0b3JlLmN1cnJlbnQgPSB7fSk7XG4gICAgdmFyIHByZXZpb3VzID0gc2ltcGxlQ2hhbmdlc1N0b3JlLnByZXZpb3VzO1xuICAgIHZhciBkZWNsYXJlZE5hbWUgPSB0aGlzLmRlY2xhcmVkSW5wdXRzW3B1YmxpY05hbWVdO1xuICAgIHZhciBwcmV2aW91c0NoYW5nZSA9IHByZXZpb3VzW2RlY2xhcmVkTmFtZV07XG4gICAgY3VycmVudFtkZWNsYXJlZE5hbWVdID0gbmV3IFNpbXBsZUNoYW5nZShwcmV2aW91c0NoYW5nZSAmJiBwcmV2aW91c0NoYW5nZS5jdXJyZW50VmFsdWUsIHZhbHVlLCBwcmV2aW91cyA9PT0gRU1QVFlfT0JKKTtcbiAgICBpbnN0YW5jZVtwcml2YXRlTmFtZV0gPSB2YWx1ZTtcbn1cbnZhciBTSU1QTEVfQ0hBTkdFU19TVE9SRSA9ICdfX25nU2ltcGxlQ2hhbmdlc19fJztcbmZ1bmN0aW9uIGdldFNpbXBsZUNoYW5nZXNTdG9yZShpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZVtTSU1QTEVfQ0hBTkdFU19TVE9SRV0gfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIHNldFNpbXBsZUNoYW5nZXNTdG9yZShpbnN0YW5jZSwgc3RvcmUpIHtcbiAgICByZXR1cm4gaW5zdGFuY2VbU0lNUExFX0NIQU5HRVNfU1RPUkVdID0gc3RvcmU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGdldFN1cGVyVHlwZSh0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkuY29uc3RydWN0b3I7XG59XG4vKipcbiAqIE1lcmdlcyB0aGUgZGVmaW5pdGlvbiBmcm9tIGEgc3VwZXIgY2xhc3MgdG8gYSBzdWIgY2xhc3MuXG4gKiBAcGFyYW0gZGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbiB0aGF0IGlzIGEgU3ViQ2xhc3Mgb2YgYW5vdGhlciBkaXJlY3RpdmUgb2YgY29tcG9uZW50XG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZShkZWZpbml0aW9uKSB7XG4gICAgdmFyIHN1cGVyVHlwZSA9IGdldFN1cGVyVHlwZShkZWZpbml0aW9uLnR5cGUpO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdmFyIHN1cGVyRGVmID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXNDb21wb25lbnREZWYoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSBnZXRDb21wb25lbnREZWYvZ2V0RGlyZWN0aXZlRGVmLiBUaGlzIGxvZ2ljIHJlbGllcyBvbiBpbmhlcml0YW5jZS5cbiAgICAgICAgICAgIHN1cGVyRGVmID0gc3VwZXJUeXBlLm5nQ29tcG9uZW50RGVmIHx8IHN1cGVyVHlwZS5uZ0RpcmVjdGl2ZURlZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdXBlclR5cGUubmdDb21wb25lbnREZWYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpcmVjdGl2ZXMgY2Fubm90IGluaGVyaXQgQ29tcG9uZW50cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLlxuICAgICAgICAgICAgc3VwZXJEZWYgPSBzdXBlclR5cGUubmdEaXJlY3RpdmVEZWY7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJhc2VEZWYgPSBzdXBlclR5cGUubmdCYXNlRGVmO1xuICAgICAgICAvLyBTb21lIGZpZWxkcyBpbiB0aGUgZGVmaW5pdGlvbiBtYXkgYmUgZW1wdHksIGlmIHRoZXJlIHdlcmUgbm8gdmFsdWVzIHRvIHB1dCBpbiB0aGVtIHRoYXRcbiAgICAgICAgLy8gd291bGQndmUganVzdGlmaWVkIG9iamVjdCBjcmVhdGlvbi4gVW53cmFwIHRoZW0gaWYgbmVjZXNzYXJ5LlxuICAgICAgICBpZiAoYmFzZURlZiB8fCBzdXBlckRlZikge1xuICAgICAgICAgICAgdmFyIHdyaXRlYWJsZURlZiA9IGRlZmluaXRpb247XG4gICAgICAgICAgICB3cml0ZWFibGVEZWYuaW5wdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLmlucHV0cyk7XG4gICAgICAgICAgICB3cml0ZWFibGVEZWYuZGVjbGFyZWRJbnB1dHMgPSBtYXliZVVud3JhcEVtcHR5KGRlZmluaXRpb24uZGVjbGFyZWRJbnB1dHMpO1xuICAgICAgICAgICAgd3JpdGVhYmxlRGVmLm91dHB1dHMgPSBtYXliZVVud3JhcEVtcHR5KGRlZmluaXRpb24ub3V0cHV0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhc2VEZWYpIHtcbiAgICAgICAgICAgIHZhciBiYXNlVmlld1F1ZXJ5ID0gYmFzZURlZi52aWV3UXVlcnk7XG4gICAgICAgICAgICB2YXIgYmFzZUNvbnRlbnRRdWVyaWVzID0gYmFzZURlZi5jb250ZW50UXVlcmllcztcbiAgICAgICAgICAgIGJhc2VWaWV3UXVlcnkgJiYgaW5oZXJpdFZpZXdRdWVyeShkZWZpbml0aW9uLCBiYXNlVmlld1F1ZXJ5KTtcbiAgICAgICAgICAgIGJhc2VDb250ZW50UXVlcmllcyAmJiBpbmhlcml0Q29udGVudFF1ZXJpZXMoZGVmaW5pdGlvbiwgYmFzZUNvbnRlbnRRdWVyaWVzKTtcbiAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24uaW5wdXRzLCBiYXNlRGVmLmlucHV0cyk7XG4gICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLmRlY2xhcmVkSW5wdXRzLCBiYXNlRGVmLmRlY2xhcmVkSW5wdXRzKTtcbiAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24ub3V0cHV0cywgYmFzZURlZi5vdXRwdXRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwZXJEZWYpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIGhvc3RCaW5kaW5nc1xuICAgICAgICAgICAgdmFyIHByZXZIb3N0QmluZGluZ3NfMSA9IGRlZmluaXRpb24uaG9zdEJpbmRpbmdzO1xuICAgICAgICAgICAgdmFyIHN1cGVySG9zdEJpbmRpbmdzXzEgPSBzdXBlckRlZi5ob3N0QmluZGluZ3M7XG4gICAgICAgICAgICBpZiAoc3VwZXJIb3N0QmluZGluZ3NfMSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SG9zdEJpbmRpbmdzXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpbmhlcml0YW5jZSBpcyB1bmtub3duIGR1cmluZyBjb21waWxlIHRpbWUsIHRoZSBydW50aW1lIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgaW5mb3JtZWQgb2YgdGhlIHN1cGVyLWNsYXNzIGRlcHRoIHNvIHRoYXQgaW5zdHJ1Y3Rpb24gY29kZVxuICAgICAgICAgICAgICAgICAgICAvLyBjYW4gZGlzdGluZ3Vpc2ggb25lIGhvc3QgYmluZGluZ3MgZnVuY3Rpb24gZnJvbSBhbm90aGVyLiBUaGUgcmVhc29uIHdoeVxuICAgICAgICAgICAgICAgICAgICAvLyByZWx5aW5nIG9uIHRoZSBkaXJlY3RpdmUgdW5pcXVlSWQgZXhjbHVzaXZlbHkgaXMgbm90IGVub3VnaCBpcyBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWVJZCB2YWx1ZSBhbmQgdGhlIGRpcmVjdGl2ZSBpbnN0YW5jZSBzdGF5IHRoZSBzYW1lIGJldHdlZW4gaG9zdEJpbmRpbmdzXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRocm91Z2hvdXQgdGhlIGRpcmVjdGl2ZSBpbmhlcml0YW5jZSBjaGFpbi4gVGhpcyBtZWFucyB0aGF0IHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzdXBlci1jbGFzcyBkZXB0aCB2YWx1ZSwgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgd2hldGhlciBhIHBhcmVudCBvclxuICAgICAgICAgICAgICAgICAgICAvLyBzdWItY2xhc3MgaG9zdCBiaW5kaW5ncyBmdW5jdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQuXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24uaG9zdEJpbmRpbmdzID0gZnVuY3Rpb24gKHJmLCBjdHgsIGVsZW1lbnRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlYXNvbiB3aHkgd2UgaW5jcmVtZW50IGZpcnN0IGFuZCB0aGVuIGRlY3JlbWVudCBpcyBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9zdEJpbmRpbmdzIGNhbGxzIGhhdmUgYSBoaWdoZXIgaWQgdmFsdWUgY29tcGFyZWQgdG8gc3ViLWNsYXNzIGhvc3RCaW5kaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgKHRoaXMgd2F5IHRoZSBsZWFmIGRpcmVjdGl2ZSBpcyBhbHdheXMgYXQgYSBzdXBlci1jbGFzcyBkZXB0aCBvZiAwKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdEFjdGl2ZURpcmVjdGl2ZVN1cGVyQ2xhc3NEZXB0aFBvc2l0aW9uKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlckhvc3RCaW5kaW5nc18xKHJmLCBjdHgsIGVsZW1lbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RBY3RpdmVEaXJlY3RpdmVTdXBlckNsYXNzRGVwdGhQb3NpdGlvbigtMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2SG9zdEJpbmRpbmdzXzEocmYsIGN0eCwgZWxlbWVudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24uaG9zdEJpbmRpbmdzID0gc3VwZXJIb3N0QmluZGluZ3NfMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNZXJnZSBxdWVyaWVzXG4gICAgICAgICAgICB2YXIgc3VwZXJWaWV3UXVlcnkgPSBzdXBlckRlZi52aWV3UXVlcnk7XG4gICAgICAgICAgICB2YXIgc3VwZXJDb250ZW50UXVlcmllcyA9IHN1cGVyRGVmLmNvbnRlbnRRdWVyaWVzO1xuICAgICAgICAgICAgc3VwZXJWaWV3UXVlcnkgJiYgaW5oZXJpdFZpZXdRdWVyeShkZWZpbml0aW9uLCBzdXBlclZpZXdRdWVyeSk7XG4gICAgICAgICAgICBzdXBlckNvbnRlbnRRdWVyaWVzICYmIGluaGVyaXRDb250ZW50UXVlcmllcyhkZWZpbml0aW9uLCBzdXBlckNvbnRlbnRRdWVyaWVzKTtcbiAgICAgICAgICAgIC8vIE1lcmdlIGlucHV0cyBhbmQgb3V0cHV0c1xuICAgICAgICAgICAgZmlsbFByb3BlcnRpZXMoZGVmaW5pdGlvbi5pbnB1dHMsIHN1cGVyRGVmLmlucHV0cyk7XG4gICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLmRlY2xhcmVkSW5wdXRzLCBzdXBlckRlZi5kZWNsYXJlZElucHV0cyk7XG4gICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLm91dHB1dHMsIHN1cGVyRGVmLm91dHB1dHMpO1xuICAgICAgICAgICAgLy8gSW5oZXJpdCBob29rc1xuICAgICAgICAgICAgLy8gQXNzdW1lIHN1cGVyIGNsYXNzIGluaGVyaXRhbmNlIGZlYXR1cmUgaGFzIGFscmVhZHkgcnVuLlxuICAgICAgICAgICAgZGVmaW5pdGlvbi5hZnRlckNvbnRlbnRDaGVja2VkID1cbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmFmdGVyQ29udGVudENoZWNrZWQgfHwgc3VwZXJEZWYuYWZ0ZXJDb250ZW50Q2hlY2tlZDtcbiAgICAgICAgICAgIGRlZmluaXRpb24uYWZ0ZXJDb250ZW50SW5pdCA9IGRlZmluaXRpb24uYWZ0ZXJDb250ZW50SW5pdCB8fCBzdXBlckRlZi5hZnRlckNvbnRlbnRJbml0O1xuICAgICAgICAgICAgZGVmaW5pdGlvbi5hZnRlclZpZXdDaGVja2VkID0gZGVmaW5pdGlvbi5hZnRlclZpZXdDaGVja2VkIHx8IHN1cGVyRGVmLmFmdGVyVmlld0NoZWNrZWQ7XG4gICAgICAgICAgICBkZWZpbml0aW9uLmFmdGVyVmlld0luaXQgPSBkZWZpbml0aW9uLmFmdGVyVmlld0luaXQgfHwgc3VwZXJEZWYuYWZ0ZXJWaWV3SW5pdDtcbiAgICAgICAgICAgIGRlZmluaXRpb24uZG9DaGVjayA9IGRlZmluaXRpb24uZG9DaGVjayB8fCBzdXBlckRlZi5kb0NoZWNrO1xuICAgICAgICAgICAgZGVmaW5pdGlvbi5vbkRlc3Ryb3kgPSBkZWZpbml0aW9uLm9uRGVzdHJveSB8fCBzdXBlckRlZi5vbkRlc3Ryb3k7XG4gICAgICAgICAgICBkZWZpbml0aW9uLm9uSW5pdCA9IGRlZmluaXRpb24ub25Jbml0IHx8IHN1cGVyRGVmLm9uSW5pdDtcbiAgICAgICAgICAgIC8vIFJ1biBwYXJlbnQgZmVhdHVyZXNcbiAgICAgICAgICAgIHZhciBmZWF0dXJlcyA9IHN1cGVyRGVmLmZlYXR1cmVzO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZmVhdHVyZXNfMSA9IF9fdmFsdWVzKGZlYXR1cmVzKSwgZmVhdHVyZXNfMV8xID0gZmVhdHVyZXNfMS5uZXh0KCk7ICFmZWF0dXJlc18xXzEuZG9uZTsgZmVhdHVyZXNfMV8xID0gZmVhdHVyZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUgJiYgZmVhdHVyZS5uZ0luaGVyaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlKGRlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZXNfMV8xICYmICFmZWF0dXJlc18xXzEuZG9uZSAmJiAoX2EgPSBmZWF0dXJlc18xLnJldHVybikpIF9hLmNhbGwoZmVhdHVyZXNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSBhIGRlZmluaXRpb24sIGNoZWNrIHRoZSB0eXBlIGZvciB0aGUgaG9va3MgYW5kIHVzZSB0aG9zZSBpZiBuZWVkIGJlXG4gICAgICAgICAgICB2YXIgc3VwZXJQcm90b3R5cGUgPSBzdXBlclR5cGUucHJvdG90eXBlO1xuICAgICAgICAgICAgaWYgKHN1cGVyUHJvdG90eXBlKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5hZnRlckNvbnRlbnRDaGVja2VkID1cbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5hZnRlckNvbnRlbnRDaGVja2VkIHx8IHN1cGVyUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZDtcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmFmdGVyQ29udGVudEluaXQgPVxuICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmFmdGVyQ29udGVudEluaXQgfHwgc3VwZXJQcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0O1xuICAgICAgICAgICAgICAgIGRlZmluaXRpb24uYWZ0ZXJWaWV3Q2hlY2tlZCA9XG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24uYWZ0ZXJWaWV3Q2hlY2tlZCB8fCBzdXBlclByb3RvdHlwZS5uZ0FmdGVyVmlld0NoZWNrZWQ7XG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5hZnRlclZpZXdJbml0ID0gZGVmaW5pdGlvbi5hZnRlclZpZXdJbml0IHx8IHN1cGVyUHJvdG90eXBlLm5nQWZ0ZXJWaWV3SW5pdDtcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmRvQ2hlY2sgPSBkZWZpbml0aW9uLmRvQ2hlY2sgfHwgc3VwZXJQcm90b3R5cGUubmdEb0NoZWNrO1xuICAgICAgICAgICAgICAgIGRlZmluaXRpb24ub25EZXN0cm95ID0gZGVmaW5pdGlvbi5vbkRlc3Ryb3kgfHwgc3VwZXJQcm90b3R5cGUubmdPbkRlc3Ryb3k7XG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5vbkluaXQgPSBkZWZpbml0aW9uLm9uSW5pdCB8fCBzdXBlclByb3RvdHlwZS5uZ09uSW5pdDtcbiAgICAgICAgICAgICAgICBpZiAoc3VwZXJQcm90b3R5cGUubmdPbkNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgybXJtU5nT25DaGFuZ2VzRmVhdHVyZSgpKGRlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdXBlclR5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3VwZXJUeXBlKTtcbiAgICB9O1xuICAgIHdoaWxlIChzdXBlclR5cGUpIHtcbiAgICAgICAgX2xvb3BfMSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1heWJlVW53cmFwRW1wdHkodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IEVNUFRZX09CSikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlID09PSBFTVBUWV9BUlJBWSQxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KSB7XG4gICAgdmFyIHByZXZWaWV3UXVlcnkgPSBkZWZpbml0aW9uLnZpZXdRdWVyeTtcbiAgICBpZiAocHJldlZpZXdRdWVyeSkge1xuICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9IGZ1bmN0aW9uIChyZiwgY3R4KSB7XG4gICAgICAgICAgICBzdXBlclZpZXdRdWVyeShyZiwgY3R4KTtcbiAgICAgICAgICAgIHByZXZWaWV3UXVlcnkocmYsIGN0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9IHN1cGVyVmlld1F1ZXJ5O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGluaGVyaXRDb250ZW50UXVlcmllcyhkZWZpbml0aW9uLCBzdXBlckNvbnRlbnRRdWVyaWVzKSB7XG4gICAgdmFyIHByZXZDb250ZW50UXVlcmllcyA9IGRlZmluaXRpb24uY29udGVudFF1ZXJpZXM7XG4gICAgaWYgKHByZXZDb250ZW50UXVlcmllcykge1xuICAgICAgICBkZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzID0gZnVuY3Rpb24gKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgICBzdXBlckNvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgICAgICAgICAgIHByZXZDb250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJlY3RpdmVJbmRleCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzID0gc3VwZXJDb250ZW50UXVlcmllcztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQW4gaW50ZXJuYWwgdG9rZW4gd2hvc2UgcHJlc2VuY2UgaW4gYW4gaW5qZWN0b3IgaW5kaWNhdGVzIHRoYXQgdGhlIGluamVjdG9yIHNob3VsZCB0cmVhdCBpdHNlbGZcbiAqIGFzIGEgcm9vdCBzY29wZWQgaW5qZWN0b3Igd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzIGZvciB1bmtub3duIHRva2VucyB3aGljaCBtYXkgaW5kaWNhdGVcbiAqIHRoZXkgYXJlIHByb3ZpZGVkIGluIHRoZSByb290IHNjb3BlLlxuICovXG52YXIgQVBQX1JPT1QgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RoZSBwcmVzZW5jZSBvZiB0aGlzIHRva2VuIG1hcmtzIGFuIGluamVjdG9yIGFzIGJlaW5nIHRoZSByb290IGluamVjdG9yLicpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIE1hcmtlciB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIHZhbHVlIGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLlxuICovXG52YXIgTk9UX1lFVCA9IHt9O1xuLyoqXG4gKiBNYXJrZXIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGEgdG9rZW4gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2FsbGVkLlxuICpcbiAqIElmIHRoZSBpbmplY3RvciBpcyBhc2tlZCB0byBpbmplY3QgYSB0b2tlbiB3aXRoIGl0cyB2YWx1ZSBzZXQgdG8gQ0lSQ1VMQVIsIHRoYXQgaW5kaWNhdGVzXG4gKiBpbmplY3Rpb24gb2YgYSBkZXBlbmRlbmN5IGhhcyByZWN1cnNpdmVseSBhdHRlbXB0ZWQgdG8gaW5qZWN0IHRoZSBvcmlnaW5hbCB0b2tlbiwgYW5kIHRoZXJlIGlzXG4gKiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW1vbmcgdGhlIHByb3ZpZGVycy5cbiAqL1xudmFyIENJUkNVTEFSJDEgPSB7fTtcbnZhciBFTVBUWV9BUlJBWSQyID0gW107XG4vKipcbiAqIEEgbGF6aWx5IGluaXRpYWxpemVkIE51bGxJbmplY3Rvci5cbiAqL1xudmFyIE5VTExfSU5KRUNUT1IgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXROdWxsSW5qZWN0b3IoKSB7XG4gICAgaWYgKE5VTExfSU5KRUNUT1IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBOVUxMX0lOSkVDVE9SID0gbmV3IE51bGxJbmplY3RvcigpO1xuICAgIH1cbiAgICByZXR1cm4gTlVMTF9JTkpFQ1RPUjtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGBJbmplY3RvcmAgd2hpY2ggaXMgY29uZmlndXJlZCB1c2luZyBhIGBkZWZUeXBlYCBvZiBgSW5qZWN0b3JUeXBlPGFueT5gcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluamVjdG9yKGRlZlR5cGUsIHBhcmVudCwgYWRkaXRpb25hbFByb3ZpZGVycywgbmFtZSkge1xuICAgIGlmIChwYXJlbnQgPT09IHZvaWQgMCkgeyBwYXJlbnQgPSBudWxsOyB9XG4gICAgaWYgKGFkZGl0aW9uYWxQcm92aWRlcnMgPT09IHZvaWQgMCkgeyBhZGRpdGlvbmFsUHJvdmlkZXJzID0gbnVsbDsgfVxuICAgIHBhcmVudCA9IHBhcmVudCB8fCBnZXROdWxsSW5qZWN0b3IoKTtcbiAgICByZXR1cm4gbmV3IFIzSW5qZWN0b3IoZGVmVHlwZSwgYWRkaXRpb25hbFByb3ZpZGVycywgcGFyZW50LCBuYW1lKTtcbn1cbnZhciBSM0luamVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFIzSW5qZWN0b3IoZGVmLCBhZGRpdGlvbmFsUHJvdmlkZXJzLCBwYXJlbnQsIHNvdXJjZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoc291cmNlID09PSB2b2lkIDApIHsgc291cmNlID0gbnVsbDsgfVxuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1hcCBvZiB0b2tlbnMgdG8gcmVjb3JkcyB3aGljaCBjb250YWluIHRoZSBpbnN0YW5jZXMgb2YgdGhvc2UgdG9rZW5zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWNvcmRzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRyYW5zaXRpdmUgc2V0IG9mIGBJbmplY3RvclR5cGVgcyB3aGljaCBkZWZpbmUgdGhpcyBpbmplY3Rvci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBvZiB2YWx1ZXMgaW5zdGFudGlhdGVkIGJ5IHRoaXMgaW5qZWN0b3Igd2hpY2ggY29udGFpbiBgbmdPbkRlc3Ryb3lgIGxpZmVjeWNsZSBob29rcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25EZXN0cm95ID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gU3RhcnQgb2ZmIGJ5IGNyZWF0aW5nIFJlY29yZHMgZm9yIGV2ZXJ5IHByb3ZpZGVyIGRlY2xhcmVkIGluIGV2ZXJ5IEluamVjdG9yVHlwZVxuICAgICAgICAvLyBpbmNsdWRlZCB0cmFuc2l0aXZlbHkgaW4gYGRlZmAuXG4gICAgICAgIHZhciBkZWR1cFN0YWNrID0gW107XG4gICAgICAgIGRlZXBGb3JFYWNoKFtkZWZdLCBmdW5jdGlvbiAoaW5qZWN0b3JEZWYpIHsgcmV0dXJuIF90aGlzLnByb2Nlc3NJbmplY3RvclR5cGUoaW5qZWN0b3JEZWYsIFtdLCBkZWR1cFN0YWNrKTsgfSk7XG4gICAgICAgIGFkZGl0aW9uYWxQcm92aWRlcnMgJiYgZGVlcEZvckVhY2goYWRkaXRpb25hbFByb3ZpZGVycywgZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiBfdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIGRlZiwgYWRkaXRpb25hbFByb3ZpZGVycyk7IH0pO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIElOSkVDVE9SIHRva2VuIHByb3ZpZGVzIHRoaXMgaW5qZWN0b3IuXG4gICAgICAgIHRoaXMucmVjb3Jkcy5zZXQoSU5KRUNUT1IsIG1ha2VSZWNvcmQodW5kZWZpbmVkLCB0aGlzKSk7XG4gICAgICAgIC8vIERldGVjdCB3aGV0aGVyIHRoaXMgaW5qZWN0b3IgaGFzIHRoZSBBUFBfUk9PVF9TQ09QRSB0b2tlbiBhbmQgdGh1cyBzaG91bGQgcHJvdmlkZVxuICAgICAgICAvLyBhbnkgaW5qZWN0YWJsZSBzY29wZWQgdG8gQVBQX1JPT1RfU0NPUEUuXG4gICAgICAgIHRoaXMuaXNSb290SW5qZWN0b3IgPSB0aGlzLnJlY29yZHMuaGFzKEFQUF9ST09UKTtcbiAgICAgICAgLy8gRWFnZXJseSBpbnN0YW50aWF0ZSB0aGUgSW5qZWN0b3JUeXBlIGNsYXNzZXMgdGhlbXNlbHZlcy5cbiAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmZvckVhY2goZnVuY3Rpb24gKGRlZlR5cGUpIHsgcmV0dXJuIF90aGlzLmdldChkZWZUeXBlKTsgfSk7XG4gICAgICAgIC8vIFNvdXJjZSBuYW1lLCB1c2VkIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2UgfHwgKGRlZiBpbnN0YW5jZW9mIEFycmF5ID8gbnVsbCA6IHN0cmluZ2lmeShkZWYpKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFIzSW5qZWN0b3IucHJvdG90eXBlLCBcImRlc3Ryb3llZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGluamVjdG9yIHdhcyBwcmV2aW91c2x5IGRlc3Ryb3llZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVzdHJveWVkOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBpbmplY3RvciBhbmQgcmVsZWFzZSByZWZlcmVuY2VzIHRvIGV2ZXJ5IGluc3RhbmNlIG9yIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICAgKlxuICAgICAqIEFsc28gY2FsbHMgdGhlIGBPbkRlc3Ryb3lgIGxpZmVjeWNsZSBob29rcyBvZiBldmVyeSBpbnN0YW5jZSB0aGF0IHdhcyBjcmVhdGVkIGZvciB3aGljaCBhXG4gICAgICogaG9vayB3YXMgZm91bmQuXG4gICAgICovXG4gICAgUjNJbmplY3Rvci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICAgICAgLy8gU2V0IGRlc3Ryb3llZCA9IHRydWUgZmlyc3QsIGluIGNhc2UgbGlmZWN5Y2xlIGhvb2tzIHJlLWVudGVyIGRlc3Ryb3koKS5cbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIENhbGwgYWxsIHRoZSBsaWZlY3ljbGUgaG9va3MuXG4gICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5mb3JFYWNoKGZ1bmN0aW9uIChzZXJ2aWNlKSB7IHJldHVybiBzZXJ2aWNlLm5nT25EZXN0cm95KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSBhbGwgcmVmZXJlbmNlcy5cbiAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5vbkRlc3Ryb3kuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSM0luamVjdG9yLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKSB7XG4gICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICBpZiAoZmxhZ3MgPT09IHZvaWQgMCkgeyBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7IH1cbiAgICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICAgICAgLy8gU2V0IHRoZSBpbmplY3Rpb24gY29udGV4dC5cbiAgICAgICAgdmFyIHByZXZpb3VzSW5qZWN0b3IgPSBzZXRDdXJyZW50SW5qZWN0b3IodGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFNraXBTZWxmIGZsYWcuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEluamVjdEZsYWdzLlNraXBTZWxmKSkge1xuICAgICAgICAgICAgICAgIC8vIFNraXBTZWxmIGlzbid0IHNldCwgY2hlY2sgaWYgdGhlIHJlY29yZCBiZWxvbmdzIHRvIHRoaXMgaW5qZWN0b3IuXG4gICAgICAgICAgICAgICAgdmFyIHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyByZWNvcmQsIGJ1dCBtYXliZSB0aGUgdG9rZW4gaXMgc2NvcGVkIHRvIHRoaXMgaW5qZWN0b3IuIExvb2sgZm9yIGFuIG5nSW5qZWN0YWJsZURlZlxuICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgc2NvcGUgbWF0Y2hpbmcgdGhpcyBpbmplY3Rvci5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZiA9IGNvdWxkQmVJbmplY3RhYmxlVHlwZSh0b2tlbikgJiYgZ2V0SW5qZWN0YWJsZURlZih0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWYgJiYgdGhpcy5pbmplY3RhYmxlRGVmSW5TY29wZShkZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBhbiBuZ0luamVjdGFibGVEZWYgYW5kIGl0J3Mgc2NvcGVkIHRvIHRoaXMgaW5qZWN0b3IuIFByZXRlbmQgYXMgaWYgaXQgd2FzIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBhbG9uZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IG1ha2VSZWNvcmQoaW5qZWN0YWJsZURlZk9ySW5qZWN0b3JEZWZGYWN0b3J5KHRva2VuKSwgTk9UX1lFVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMuc2V0KHRva2VuLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIGEgcmVjb3JkIHdhcyBmb3VuZCwgZ2V0IHRoZSBpbnN0YW5jZSBmb3IgaXQgYW5kIHJldHVybiBpdC5cbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh0b2tlbiwgcmVjb3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZWxlY3QgdGhlIG5leHQgaW5qZWN0b3IgYmFzZWQgb24gdGhlIFNlbGYgZmxhZyAtIGlmIHNlbGYgaXMgc2V0LCB0aGUgbmV4dCBpbmplY3RvciBpc1xuICAgICAgICAgICAgLy8gdGhlIE51bGxJbmplY3Rvciwgb3RoZXJ3aXNlIGl0J3MgdGhlIHBhcmVudC5cbiAgICAgICAgICAgIHZhciBuZXh0SW5qZWN0b3IgPSAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuU2VsZikgPyB0aGlzLnBhcmVudCA6IGdldE51bGxJbmplY3RvcigpO1xuICAgICAgICAgICAgcmV0dXJuIG5leHRJbmplY3Rvci5nZXQodG9rZW4sIGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwgPyBudWxsIDogbm90Rm91bmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdOdWxsSW5qZWN0b3JFcnJvcicpIHtcbiAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGVbTkdfVEVNUF9UT0tFTl9QQVRIXSA9IGVbTkdfVEVNUF9UT0tFTl9QQVRIXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoc3RyaW5naWZ5KHRva2VuKSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzSW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSBhIHBhcmVudCBpbmplY3Rvciwga2VlcCB0aHJvd2luZ1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0ICYgdGhyb3cgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB3ZSBkb24ndCBoYXZlIGFueSBwcmV2aW91cyBpbmplY3RvclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2F0Y2hJbmplY3RvckVycm9yKGUsIHRva2VuLCAnUjNJbmplY3RvckVycm9yJywgdGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAvLyBMYXN0bHksIGNsZWFuIHVwIHRoZSBzdGF0ZSBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGluamVjdG9yLlxuICAgICAgICAgICAgc2V0Q3VycmVudEluamVjdG9yKHByZXZpb3VzSW5qZWN0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSM0luamVjdG9yLnByb3RvdHlwZS5hc3NlcnROb3REZXN0cm95ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhbiBgSW5qZWN0b3JUeXBlYCBvciBgSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVyc2AgYW5kIGFsbCBvZiBpdHMgdHJhbnNpdGl2ZSBwcm92aWRlcnNcbiAgICAgKiB0byB0aGlzIGluamVjdG9yLlxuICAgICAqL1xuICAgIFIzSW5qZWN0b3IucHJvdG90eXBlLnByb2Nlc3NJbmplY3RvclR5cGUgPSBmdW5jdGlvbiAoZGVmT3JXcmFwcGVkRGVmLCBwYXJlbnRzLCBkZWR1cFN0YWNrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGRlZk9yV3JhcHBlZERlZiA9IHJlc29sdmVGb3J3YXJkUmVmKGRlZk9yV3JhcHBlZERlZik7XG4gICAgICAgIGlmICghZGVmT3JXcmFwcGVkRGVmKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBFaXRoZXIgdGhlIGRlZk9yV3JhcHBlZERlZiBpcyBhbiBJbmplY3RvclR5cGUgKHdpdGggbmdJbmplY3RvckRlZikgb3IgYW5cbiAgICAgICAgLy8gSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycyAoYWthIE1vZHVsZVdpdGhQcm92aWRlcnMpLiBEZXRlY3RpbmcgZWl0aGVyIGlzIGEgbWVnYW1vcnBoaWNcbiAgICAgICAgLy8gcmVhZCwgc28gY2FyZSBpcyB0YWtlbiB0byBvbmx5IGRvIHRoZSByZWFkIG9uY2UuXG4gICAgICAgIC8vIEZpcnN0IGF0dGVtcHQgdG8gcmVhZCB0aGUgbmdJbmplY3RvckRlZi5cbiAgICAgICAgdmFyIGRlZiA9IGdldEluamVjdG9yRGVmKGRlZk9yV3JhcHBlZERlZik7XG4gICAgICAgIC8vIElmIHRoYXQncyBub3QgcHJlc2VudCwgdGhlbiBhdHRlbXB0IHRvIHJlYWQgbmdNb2R1bGUgZnJvbSB0aGUgSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycy5cbiAgICAgICAgdmFyIG5nTW9kdWxlID0gKGRlZiA9PSBudWxsKSAmJiBkZWZPcldyYXBwZWREZWYubmdNb2R1bGUgfHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIEluamVjdG9yVHlwZS4gSW4gdGhlIGNhc2Ugd2hlcmUgYGRlZk9yV3JhcHBlZERlZmAgaXMgYW4gYEluamVjdG9yVHlwZWAsXG4gICAgICAgIC8vIHRoZW4gdGhpcyBpcyBlYXN5LiBJbiB0aGUgY2FzZSBvZiBhbiBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzLCB0aGVuIHRoZSBkZWZpbml0aW9uIHR5cGVcbiAgICAgICAgLy8gaXMgdGhlIGBuZ01vZHVsZWAuXG4gICAgICAgIHZhciBkZWZUeXBlID0gKG5nTW9kdWxlID09PSB1bmRlZmluZWQpID8gZGVmT3JXcmFwcGVkRGVmIDogbmdNb2R1bGU7XG4gICAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgICAgIGlmIChuZ0Rldk1vZGUgJiYgcGFyZW50cy5pbmRleE9mKGRlZlR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgdmFyIGRlZk5hbWUgPSBzdHJpbmdpZnkoZGVmVHlwZSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDaXJjdWxhciBkZXBlbmRlbmN5IGluIERJIGRldGVjdGVkIGZvciB0eXBlIFwiICsgZGVmTmFtZSArIFwiLiBEZXBlbmRlbmN5IHBhdGg6IFwiICsgcGFyZW50cy5tYXAoZnVuY3Rpb24gKGRlZlR5cGUpIHsgcmV0dXJuIHN0cmluZ2lmeShkZWZUeXBlKTsgfSkuam9pbignID4gJykgKyBcIiA+IFwiICsgZGVmTmFtZSArIFwiLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgbXVsdGlwbGUgaW1wb3J0cyBvZiB0aGUgc2FtZSBtb2R1bGVcbiAgICAgICAgdmFyIGlzRHVwbGljYXRlID0gZGVkdXBTdGFjay5pbmRleE9mKGRlZlR5cGUpICE9PSAtMTtcbiAgICAgICAgLy8gSWYgZGVmT3JXcmFwcGVkVHlwZSB3YXMgYW4gSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycywgdGhlbiAucHJvdmlkZXJzIG1heSBob2xkIHNvbWVcbiAgICAgICAgLy8gZXh0cmEgcHJvdmlkZXJzLlxuICAgICAgICB2YXIgcHJvdmlkZXJzID0gKG5nTW9kdWxlICE9PSB1bmRlZmluZWQpICYmIGRlZk9yV3JhcHBlZERlZi5wcm92aWRlcnMgfHxcbiAgICAgICAgICAgIEVNUFRZX0FSUkFZJDI7XG4gICAgICAgIC8vIEZpbmFsbHksIGlmIGRlZk9yV3JhcHBlZFR5cGUgd2FzIGFuIGBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzYCwgdGhlbiB0aGUgYWN0dWFsXG4gICAgICAgIC8vIGBJbmplY3RvckRlZmAgaXMgb24gaXRzIGBuZ01vZHVsZWAuXG4gICAgICAgIGlmIChuZ01vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWYgPSBnZXRJbmplY3RvckRlZihuZ01vZHVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gZGVmaW5pdGlvbiB3YXMgZm91bmQsIGl0IG1pZ2h0IGJlIGZyb20gZXhwb3J0cy4gUmVtb3ZlIGl0LlxuICAgICAgICBpZiAoZGVmID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFjayB0aGUgSW5qZWN0b3JUeXBlIGFuZCBhZGQgYSBwcm92aWRlciBmb3IgaXQuXG4gICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5hZGQoZGVmVHlwZSk7XG4gICAgICAgIHRoaXMucmVjb3Jkcy5zZXQoZGVmVHlwZSwgbWFrZVJlY29yZChkZWYuZmFjdG9yeSwgTk9UX1lFVCkpO1xuICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGluIHRoZSBzYW1lIHdheSB0aGF0IEBOZ01vZHVsZSByZXNvbHV0aW9uIGRpZDpcbiAgICAgICAgLy8gRmlyc3QsIGluY2x1ZGUgcHJvdmlkZXJzIGZyb20gYW55IGltcG9ydHMuXG4gICAgICAgIGlmIChkZWYuaW1wb3J0cyAhPSBudWxsICYmICFpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgLy8gQmVmb3JlIHByb2Nlc3NpbmcgZGVmVHlwZSdzIGltcG9ydHMsIGFkZCBpdCB0byB0aGUgc2V0IG9mIHBhcmVudHMuIFRoaXMgd2F5LCBpZiBpdCBlbmRzXG4gICAgICAgICAgICAvLyB1cCBkZWVwbHkgaW1wb3J0aW5nIGl0c2VsZiwgdGhpcyBjYW4gYmUgZGV0ZWN0ZWQuXG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgcGFyZW50cy5wdXNoKGRlZlR5cGUpO1xuICAgICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBzZXQgb2YgZGVkdXBzLiBUaGlzIHdheSB3ZSBjYW4gZGV0ZWN0IG11bHRpcGxlIGltcG9ydHMgb2YgdGhlIHNhbWUgbW9kdWxlXG4gICAgICAgICAgICBkZWR1cFN0YWNrLnB1c2goZGVmVHlwZSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRlZXBGb3JFYWNoKGRlZi5pbXBvcnRzLCBmdW5jdGlvbiAoaW1wb3J0ZWQpIHsgcmV0dXJuIF90aGlzLnByb2Nlc3NJbmplY3RvclR5cGUoaW1wb3J0ZWQsIHBhcmVudHMsIGRlZHVwU3RhY2spOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBwYXJlbnRzIHNldCB3aGVuIGZpbmlzaGVkLlxuICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBwYXJlbnRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5leHQsIGluY2x1ZGUgcHJvdmlkZXJzIGxpc3RlZCBvbiB0aGUgZGVmaW5pdGlvbiBpdHNlbGYuXG4gICAgICAgIHZhciBkZWZQcm92aWRlcnMgPSBkZWYucHJvdmlkZXJzO1xuICAgICAgICBpZiAoZGVmUHJvdmlkZXJzICE9IG51bGwgJiYgIWlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICB2YXIgaW5qZWN0b3JUeXBlXzEgPSBkZWZPcldyYXBwZWREZWY7XG4gICAgICAgICAgICBkZWVwRm9yRWFjaChkZWZQcm92aWRlcnMsIGZ1bmN0aW9uIChwcm92aWRlcikgeyByZXR1cm4gX3RoaXMucHJvY2Vzc1Byb3ZpZGVyKHByb3ZpZGVyLCBpbmplY3RvclR5cGVfMSwgZGVmUHJvdmlkZXJzKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluYWxseSwgaW5jbHVkZSBwcm92aWRlcnMgZnJvbSBhbiBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzIGlmIHRoZXJlIHdhcyBvbmUuXG4gICAgICAgIHZhciBuZ01vZHVsZVR5cGUgPSBkZWZPcldyYXBwZWREZWYubmdNb2R1bGU7XG4gICAgICAgIGRlZXBGb3JFYWNoKHByb3ZpZGVycywgZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiBfdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgYFNpbmdsZVByb3ZpZGVyYCBhbmQgYWRkIGl0LlxuICAgICAqL1xuICAgIFIzSW5qZWN0b3IucHJvdG90eXBlLnByb2Nlc3NQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b2tlbiBmcm9tIHRoZSBwcm92aWRlci4gRWl0aGVyIGl0J3MgaXRzIG93biB0b2tlbiwgb3IgaGFzIGEge3Byb3ZpZGU6IC4uLn1cbiAgICAgICAgLy8gcHJvcGVydHkuXG4gICAgICAgIHByb3ZpZGVyID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIpO1xuICAgICAgICB2YXIgdG9rZW4gPSBpc1R5cGVQcm92aWRlcihwcm92aWRlcikgPyBwcm92aWRlciA6IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyICYmIHByb3ZpZGVyLnByb3ZpZGUpO1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBgUmVjb3JkYCBmb3IgdGhlIHByb3ZpZGVyLlxuICAgICAgICB2YXIgcmVjb3JkID0gcHJvdmlkZXJUb1JlY29yZChwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpO1xuICAgICAgICBpZiAoIWlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSAmJiBwcm92aWRlci5tdWx0aSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHByb3ZpZGVyIGluZGljYXRlcyB0aGF0IGl0J3MgYSBtdWx0aS1wcm92aWRlciwgcHJvY2VzcyBpdCBzcGVjaWFsbHkuXG4gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIGl0J3MgYmVlbiBkZWZpbmVkIGFscmVhZHkuXG4gICAgICAgICAgICB2YXIgbXVsdGlSZWNvcmRfMSA9IHRoaXMucmVjb3Jkcy5nZXQodG9rZW4pO1xuICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkXzEpIHtcbiAgICAgICAgICAgICAgICAvLyBJdCBoYXMuIFRocm93IGEgbmljZSBlcnJvciBpZlxuICAgICAgICAgICAgICAgIGlmIChtdWx0aVJlY29yZF8xLm11bHRpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWl4ZWQgbXVsdGktcHJvdmlkZXIgZm9yIFwiICsgdG9rZW4gKyBcIi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbXVsdGlSZWNvcmRfMSA9IG1ha2VSZWNvcmQodW5kZWZpbmVkLCBOT1RfWUVULCB0cnVlKTtcbiAgICAgICAgICAgICAgICBtdWx0aVJlY29yZF8xLmZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpbmplY3RBcmdzKG11bHRpUmVjb3JkXzEubXVsdGkpOyB9O1xuICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQodG9rZW4sIG11bHRpUmVjb3JkXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW4gPSBwcm92aWRlcjtcbiAgICAgICAgICAgIG11bHRpUmVjb3JkXzEubXVsdGkucHVzaChwcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5tdWx0aSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWl4ZWQgbXVsdGktcHJvdmlkZXIgZm9yIFwiICsgc3RyaW5naWZ5KHRva2VuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvcmRzLnNldCh0b2tlbiwgcmVjb3JkKTtcbiAgICB9O1xuICAgIFIzSW5qZWN0b3IucHJvdG90eXBlLmh5ZHJhdGUgPSBmdW5jdGlvbiAodG9rZW4sIHJlY29yZCkge1xuICAgICAgICBpZiAocmVjb3JkLnZhbHVlID09PSBDSVJDVUxBUiQxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgaW5zdGFudGlhdGUgY3ljbGljIGRlcGVuZGVuY3khIFwiICsgc3RyaW5naWZ5KHRva2VuKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjb3JkLnZhbHVlID09PSBOT1RfWUVUKSB7XG4gICAgICAgICAgICByZWNvcmQudmFsdWUgPSBDSVJDVUxBUiQxO1xuICAgICAgICAgICAgcmVjb3JkLnZhbHVlID0gcmVjb3JkLmZhY3RvcnkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY29yZC52YWx1ZSA9PT0gJ29iamVjdCcgJiYgcmVjb3JkLnZhbHVlICYmIGhhc09uRGVzdHJveShyZWNvcmQudmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5hZGQocmVjb3JkLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkLnZhbHVlO1xuICAgIH07XG4gICAgUjNJbmplY3Rvci5wcm90b3R5cGUuaW5qZWN0YWJsZURlZkluU2NvcGUgPSBmdW5jdGlvbiAoZGVmKSB7XG4gICAgICAgIGlmICghZGVmLnByb3ZpZGVkSW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmLnByb3ZpZGVkSW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLnByb3ZpZGVkSW4gPT09ICdhbnknIHx8IChkZWYucHJvdmlkZWRJbiA9PT0gJ3Jvb3QnICYmIHRoaXMuaXNSb290SW5qZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5oYXMoZGVmLnByb3ZpZGVkSW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUjNJbmplY3Rvcjtcbn0oKSk7XG5mdW5jdGlvbiBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodG9rZW4pIHtcbiAgICB2YXIgaW5qZWN0YWJsZURlZiA9IGdldEluamVjdGFibGVEZWYodG9rZW4pO1xuICAgIGlmIChpbmplY3RhYmxlRGVmID09PSBudWxsKSB7XG4gICAgICAgIHZhciBpbmplY3RvckRlZiA9IGdldEluamVjdG9yRGVmKHRva2VuKTtcbiAgICAgICAgaWYgKGluamVjdG9yRGVmICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5qZWN0b3JEZWYuZmFjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0b2tlbiBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb2tlbiBcIiArIHN0cmluZ2lmeSh0b2tlbikgKyBcIiBpcyBtaXNzaW5nIGFuIG5nSW5qZWN0YWJsZURlZiBkZWZpbml0aW9uLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0b2tlbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1MZW5ndGggPSB0b2tlbi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocGFyYW1MZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkocGFyYW1MZW5ndGgpLmZpbGwoJz8nKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciBcIiArIHN0cmluZ2lmeSh0b2tlbikgKyBcIjogKFwiICsgYXJncy5qb2luKCcsICcpICsgXCIpLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgdG9rZW4oKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VucmVhY2hhYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlRGVmLmZhY3Rvcnk7XG59XG5mdW5jdGlvbiBwcm92aWRlclRvUmVjb3JkKHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycykge1xuICAgIHZhciBmYWN0b3J5ID0gcHJvdmlkZXJUb0ZhY3RvcnkocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKTtcbiAgICBpZiAoaXNWYWx1ZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICByZXR1cm4gbWFrZVJlY29yZCh1bmRlZmluZWQsIHByb3ZpZGVyLnVzZVZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVjb3JkKGZhY3RvcnksIE5PVF9ZRVQpO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgYSBgU2luZ2xlUHJvdmlkZXJgIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm92aWRlciBwcm92aWRlciB0byBjb252ZXJ0IHRvIGZhY3RvcnlcbiAqL1xuZnVuY3Rpb24gcHJvdmlkZXJUb0ZhY3RvcnkocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7XG4gICAgdmFyIGZhY3RvcnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICByZXR1cm4gaW5qZWN0YWJsZURlZk9ySW5qZWN0b3JEZWZGYWN0b3J5KHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoaXNWYWx1ZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZVZhbHVlKTsgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0V4aXN0aW5nUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gybXJtWluamVjdChyZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VFeGlzdGluZykpOyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRmFjdG9yeVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgZmFjdG9yeSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3ZpZGVyLnVzZUZhY3RvcnkuYXBwbHkocHJvdmlkZXIsIF9fc3ByZWFkKGluamVjdEFyZ3MocHJvdmlkZXIuZGVwcyB8fCBbXSkpKTsgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjbGFzc1JlZl8xID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIgJiZcbiAgICAgICAgICAgICAgICAocHJvdmlkZXIudXNlQ2xhc3MgfHwgcHJvdmlkZXIucHJvdmlkZSkpO1xuICAgICAgICAgICAgaWYgKCFjbGFzc1JlZl8xKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5nTW9kdWxlRGV0YWlsID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kdWxlVHlwZSAmJiBwcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyRGV0YWlsID0gcHJvdmlkZXJzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdiA9PSBwcm92aWRlciA/ICc/JyArIHByb3ZpZGVyICsgJz8nIDogJy4uLic7IH0pO1xuICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZURldGFpbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIiAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6IFtcIiArIHByb3ZpZGVyRGV0YWlsLmpvaW4oJywgJykgKyBcIl1cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwcm92aWRlciBmb3IgdGhlIE5nTW9kdWxlICdcIiArIHN0cmluZ2lmeShuZ01vZHVsZVR5cGUpICsgXCInXCIgKyBuZ01vZHVsZURldGFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzRGVwcyhwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3ICgoY2xhc3NSZWZfMSkuYmluZC5hcHBseSgoY2xhc3NSZWZfMSksIF9fc3ByZWFkKFt2b2lkIDBdLCBpbmplY3RBcmdzKHByb3ZpZGVyLmRlcHMpKSkpKCk7IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5qZWN0YWJsZURlZk9ySW5qZWN0b3JEZWZGYWN0b3J5KGNsYXNzUmVmXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWN0b3J5O1xufVxuZnVuY3Rpb24gbWFrZVJlY29yZChmYWN0b3J5LCB2YWx1ZSwgbXVsdGkpIHtcbiAgICBpZiAobXVsdGkgPT09IHZvaWQgMCkgeyBtdWx0aSA9IGZhbHNlOyB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFjdG9yeTogZmFjdG9yeSxcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBtdWx0aTogbXVsdGkgPyBbXSA6IHVuZGVmaW5lZCxcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVlcEZvckVhY2goaW5wdXQsIGZuKSB7XG4gICAgaW5wdXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gZGVlcEZvckVhY2godmFsdWUsIGZuKSA6IGZuKHZhbHVlKTsgfSk7XG59XG5mdW5jdGlvbiBpc1ZhbHVlUHJvdmlkZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIFVTRV9WQUxVRSQyIGluIHZhbHVlO1xufVxuZnVuY3Rpb24gaXNFeGlzdGluZ1Byb3ZpZGVyKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLnVzZUV4aXN0aW5nKTtcbn1cbmZ1bmN0aW9uIGlzRmFjdG9yeVByb3ZpZGVyKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLnVzZUZhY3RvcnkpO1xufVxuZnVuY3Rpb24gaXNUeXBlUHJvdmlkZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNDbGFzc1Byb3ZpZGVyKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhdmFsdWUudXNlQ2xhc3M7XG59XG5mdW5jdGlvbiBoYXNEZXBzKHZhbHVlKSB7XG4gICAgcmV0dXJuICEhdmFsdWUuZGVwcztcbn1cbmZ1bmN0aW9uIGhhc09uRGVzdHJveSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZS5uZ09uRGVzdHJveSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGNvdWxkQmVJbmplY3RhYmxlVHlwZSh2YWx1ZSkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcHJvdmlkZXJzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBEaXJlY3RpdmVEZWYuXG4gKlxuICogV2hlbiBpbnNlcnRpbmcgdGhlIHRva2VucyBhbmQgdGhlIGZhY3RvcmllcyBpbiB0aGVpciByZXNwZWN0aXZlIGFycmF5cywgd2UgY2FuIGFzc3VtZSB0aGF0XG4gKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZmlyc3QgZm9yIHRoZSBjb21wb25lbnQgKGlmIGFueSksIGFuZCB0aGVuIGZvciBvdGhlciBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lXG4gKiBub2RlLlxuICogQXMgYSBjb25zZXF1ZW5jZSx0aGUgcHJvdmlkZXJzIGFyZSBhbHdheXMgcHJvY2Vzc2VkIGluIHRoYXQgb3JkZXI6XG4gKiAxKSBUaGUgdmlldyBwcm92aWRlcnMgb2YgdGhlIGNvbXBvbmVudFxuICogMikgVGhlIHByb3ZpZGVycyBvZiB0aGUgY29tcG9uZW50XG4gKiAzKSBUaGUgcHJvdmlkZXJzIG9mIHRoZSBvdGhlciBkaXJlY3RpdmVzXG4gKiBUaGlzIG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5qZWN0YWJsZXMgYXJyYXlzIG9mIGEgdmlldyAoZm9yIGVhY2ggbm9kZSkuXG4gKiBTbyB0aGUgdG9rZW5zIGFuZCB0aGUgZmFjdG9yaWVzIGNhbiBiZSBwdXNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXlzLCBleGNlcHRcbiAqIGluIG9uZSBjYXNlIGZvciBtdWx0aSBwcm92aWRlcnMuXG4gKlxuICogQHBhcmFtIGRlZiB0aGUgZGlyZWN0aXZlIGRlZmluaXRpb25cbiAqIEBwYXJhbSBwcm92aWRlcnM6IEFycmF5IG9mIGBwcm92aWRlcnNgLlxuICogQHBhcmFtIHZpZXdQcm92aWRlcnM6IEFycmF5IG9mIGB2aWV3UHJvdmlkZXJzYC5cbiAqL1xuZnVuY3Rpb24gcHJvdmlkZXJzUmVzb2x2ZXIoZGVmLCBwcm92aWRlcnMsIHZpZXdQcm92aWRlcnMpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgdmFyIGlzQ29tcG9uZW50ID0gaXNDb21wb25lbnREZWYoZGVmKTtcbiAgICAgICAgLy8gVGhlIGxpc3Qgb2YgdmlldyBwcm92aWRlcnMgaXMgcHJvY2Vzc2VkIGZpcnN0LCBhbmQgdGhlIGZsYWdzIGFyZSB1cGRhdGVkXG4gICAgICAgIHJlc29sdmVQcm92aWRlciQxKHZpZXdQcm92aWRlcnMsIHRWaWV3LmRhdGEsIHRWaWV3LmJsdWVwcmludCwgaXNDb21wb25lbnQsIHRydWUpO1xuICAgICAgICAvLyBUaGVuLCB0aGUgbGlzdCBvZiBwcm92aWRlcnMgaXMgcHJvY2Vzc2VkLCBhbmQgdGhlIGZsYWdzIGFyZSB1cGRhdGVkXG4gICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cbn1cbi8qKlxuICogUmVzb2x2ZXMgYSBwcm92aWRlciBhbmQgcHVibGlzaGVzIGl0IHRvIHRoZSBESSBzeXN0ZW0uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKSB7XG4gICAgcHJvdmlkZXIgPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlcik7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvdmlkZXIpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgYHJlc29sdmVQcm92aWRlcmBcbiAgICAgICAgLy8gUmVjdXJzaW9uIGlzIE9LIGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoaXMgY29kZSB3aWxsIG5vdCBiZSBpbiBob3QtcGF0aCBvbmNlIHdlIGltcGxlbWVudFxuICAgICAgICAvLyBjbG9uaW5nIG9mIHRoZSBpbml0aWFsIHN0YXRlLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXNvbHZlUHJvdmlkZXIkMShwcm92aWRlcltpXSwgdEluamVjdGFibGVzLCBsSW5qZWN0YWJsZXNCbHVlcHJpbnQsIGlzQ29tcG9uZW50LCBpc1ZpZXdQcm92aWRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgICAgIHZhciB0b2tlbiA9IGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSA/IHByb3ZpZGVyIDogcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7XG4gICAgICAgIHZhciBwcm92aWRlckZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlcik7XG4gICAgICAgIHZhciB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgICAgICB2YXIgYmVnaW5JbmRleCA9IHROb2RlLnByb3ZpZGVySW5kZXhlcyAmIDY1NTM1IC8qIFByb3ZpZGVyc1N0YXJ0SW5kZXhNYXNrICovO1xuICAgICAgICB2YXIgZW5kSW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDtcbiAgICAgICAgdmFyIGNwdFZpZXdQcm92aWRlcnNDb3VudCA9IHROb2RlLnByb3ZpZGVySW5kZXhlcyA+PiAxNiAvKiBDcHRWaWV3UHJvdmlkZXJzQ291bnRTaGlmdCAqLztcbiAgICAgICAgaWYgKGlzQ2xhc3NQcm92aWRlcihwcm92aWRlcikgfHwgaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gKHByb3ZpZGVyLnVzZUNsYXNzIHx8IHByb3ZpZGVyKS5wcm90b3R5cGU7XG4gICAgICAgICAgICB2YXIgbmdPbkRlc3Ryb3kgPSBwcm90b3R5cGUubmdPbkRlc3Ryb3k7XG4gICAgICAgICAgICBpZiAobmdPbkRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgICAgICAgICAgICAgKHRWaWV3LmRlc3Ryb3lIb29rcyB8fCAodFZpZXcuZGVzdHJveUhvb2tzID0gW10pKS5wdXNoKHRJbmplY3RhYmxlcy5sZW5ndGgsIG5nT25EZXN0cm95KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpIHx8ICFwcm92aWRlci5tdWx0aSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHByb3ZpZGVyIGNhc2U6IHRoZSBmYWN0b3J5IGlzIGNyZWF0ZWQgYW5kIHB1c2hlZCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShwcm92aWRlckZhY3RvcnksIGlzVmlld1Byb3ZpZGVyLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KTtcbiAgICAgICAgICAgIHZhciBleGlzdGluZ0ZhY3RvcnlJbmRleCA9IGluZGV4T2YodG9rZW4sIHRJbmplY3RhYmxlcywgaXNWaWV3UHJvdmlkZXIgPyBiZWdpbkluZGV4IDogYmVnaW5JbmRleCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCwgZW5kSW5kZXgpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nRmFjdG9yeUluZGV4ID09IC0xKSB7XG4gICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgbFZpZXcpLCBsVmlldywgdG9rZW4pO1xuICAgICAgICAgICAgICAgIHRJbmplY3RhYmxlcy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB0Tm9kZS5kaXJlY3RpdmVTdGFydCsrO1xuICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZUVuZCsrO1xuICAgICAgICAgICAgICAgIGlmIChpc1ZpZXdQcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0Tm9kZS5wcm92aWRlckluZGV4ZXMgKz0gNjU1MzYgLyogQ3B0Vmlld1Byb3ZpZGVyc0NvdW50U2hpZnRlciAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbEluamVjdGFibGVzQmx1ZXByaW50LnB1c2goZmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgbFZpZXcucHVzaChmYWN0b3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxJbmplY3RhYmxlc0JsdWVwcmludFtleGlzdGluZ0ZhY3RvcnlJbmRleF0gPSBmYWN0b3J5O1xuICAgICAgICAgICAgICAgIGxWaWV3W2V4aXN0aW5nRmFjdG9yeUluZGV4XSA9IGZhY3Rvcnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBNdWx0aSBwcm92aWRlciBjYXNlOlxuICAgICAgICAgICAgLy8gV2UgY3JlYXRlIGEgbXVsdGkgZmFjdG9yeSB3aGljaCBpcyBnb2luZyB0byBhZ2dyZWdhdGUgYWxsIHRoZSB2YWx1ZXMuXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgb3V0cHV0IG9mIHN1Y2ggYSBmYWN0b3J5IGRlcGVuZHMgb24gY29udGVudCBvciB2aWV3IGluamVjdGlvbixcbiAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSB0d28gb2YgdGhlbSwgd2hpY2ggYXJlIGxpbmtlZCB0b2dldGhlci5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgZmlyc3Qgb25lIChmb3IgdmlldyBwcm92aWRlcnMpIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGluamVjdGFibGVzIGFycmF5LFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBzZWNvbmQgb25lIChmb3IgcHJvdmlkZXJzKSBpcyBhbHdheXMgaW4gdGhlIHNlY29uZCBibG9jay5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdmlldyBwcm92aWRlcnMgaGF2ZSBoaWdoZXIgcHJpb3JpdHkuIFdoZW4gYSBtdWx0aSB0b2tlblxuICAgICAgICAgICAgLy8gaXMgYmVpbmcgbG9va2VkIHVwLCB0aGUgdmlldyBwcm92aWRlcnMgc2hvdWxkIGJlIGZvdW5kIGZpcnN0LlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIGEgbXVsdGkgZmFjdG9yeSBpbiB0aGUgdGhpcmQgYmxvY2sgKGRpcmVjdGl2ZSBibG9jaykuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIGFsZ29yaXRobSB0byBwcm9jZXNzIG11bHRpIHByb3ZpZGVycyBpcyBhcyBmb2xsb3dzOlxuICAgICAgICAgICAgLy8gMSkgSWYgdGhlIG11bHRpIHByb3ZpZGVyIGNvbWVzIGZyb20gdGhlIGB2aWV3UHJvdmlkZXJzYCBvZiB0aGUgY29tcG9uZW50OlxuICAgICAgICAgICAgLy8gICBhKSBJZiB0aGUgc3BlY2lhbCB2aWV3IHByb3ZpZGVycyBmYWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgYW5kIHB1c2hlZC5cbiAgICAgICAgICAgIC8vICAgYikgRWxzZSwgdGhlIG11bHRpIHByb3ZpZGVyIGlzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBtdWx0aSBmYWN0b3J5LlxuICAgICAgICAgICAgLy8gMikgSWYgdGhlIG11bHRpIHByb3ZpZGVyIGNvbWVzIGZyb20gdGhlIGBwcm92aWRlcnNgIG9mIHRoZSBjb21wb25lbnQgb3Igb2YgYW5vdGhlclxuICAgICAgICAgICAgLy8gZGlyZWN0aXZlOlxuICAgICAgICAgICAgLy8gICBhKSBJZiB0aGUgbXVsdGkgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwcm92aWRlciBwdXNoZWQgaW50byBpdC5cbiAgICAgICAgICAgIC8vICAgICAgSXQgaXMgYWxzbyBsaW5rZWQgdG8gdGhlIG11bHRpIGZhY3RvcnkgZm9yIHZpZXcgcHJvdmlkZXJzLCBpZiBpdCBleGlzdHMuXG4gICAgICAgICAgICAvLyAgIGIpIEVsc2UsIHRoZSBtdWx0aSBwcm92aWRlciBpcyBhZGRlZCB0byB0aGUgZXhpc3RpbmcgbXVsdGkgZmFjdG9yeS5cbiAgICAgICAgICAgIHZhciBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA9IGluZGV4T2YodG9rZW4sIHRJbmplY3RhYmxlcywgYmVnaW5JbmRleCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCwgZW5kSW5kZXgpO1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nVmlld1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA9IGluZGV4T2YodG9rZW4sIHRJbmplY3RhYmxlcywgYmVnaW5JbmRleCwgYmVnaW5JbmRleCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCk7XG4gICAgICAgICAgICB2YXIgZG9lc1Byb3ZpZGVyc0ZhY3RvcnlFeGlzdCA9IGV4aXN0aW5nUHJvdmlkZXJzRmFjdG9yeUluZGV4ID49IDAgJiZcbiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXhdO1xuICAgICAgICAgICAgdmFyIGRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0ID0gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4ID49IDAgJiZcbiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XTtcbiAgICAgICAgICAgIGlmIChpc1ZpZXdQcm92aWRlciAmJiAhZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QgfHxcbiAgICAgICAgICAgICAgICAhaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBDYXNlcyAxLmEgYW5kIDIuYVxuICAgICAgICAgICAgICAgIGRpUHVibGljSW5JbmplY3RvcihnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUodE5vZGUsIGxWaWV3KSwgbFZpZXcsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG11bHRpRmFjdG9yeShpc1ZpZXdQcm92aWRlciA/IG11bHRpVmlld1Byb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlciA6IG11bHRpUHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyLCBsSW5qZWN0YWJsZXNCbHVlcHJpbnQubGVuZ3RoLCBpc1ZpZXdQcm92aWRlciwgaXNDb21wb25lbnQsIHByb3ZpZGVyRmFjdG9yeSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZpZXdQcm92aWRlciAmJiBkb2VzVmlld1Byb3ZpZGVyc0ZhY3RvcnlFeGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5wcm92aWRlckZhY3RvcnkgPSBmYWN0b3J5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0SW5qZWN0YWJsZXMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKztcbiAgICAgICAgICAgICAgICB0Tm9kZS5kaXJlY3RpdmVFbmQrKztcbiAgICAgICAgICAgICAgICBpZiAoaXNWaWV3UHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxJbmplY3RhYmxlc0JsdWVwcmludC5wdXNoKGZhY3RvcnkpO1xuICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBDYXNlcyAxLmIgYW5kIDIuYlxuICAgICAgICAgICAgICAgIG11bHRpRmFjdG9yeUFkZChsSW5qZWN0YWJsZXNCbHVlcHJpbnRbaXNWaWV3UHJvdmlkZXIgPyBleGlzdGluZ1ZpZXdQcm92aWRlcnNGYWN0b3J5SW5kZXggOiBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleF0sIHByb3ZpZGVyRmFjdG9yeSwgIWlzVmlld1Byb3ZpZGVyICYmIGlzQ29tcG9uZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNWaWV3UHJvdmlkZXIgJiYgaXNDb21wb25lbnQgJiYgZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHtcbiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5jb21wb25lbnRQcm92aWRlcnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQWRkIGEgZmFjdG9yeSBpbiBhIG11bHRpIGZhY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIG11bHRpRmFjdG9yeUFkZChtdWx0aUZhY3RvcnksIGZhY3RvcnksIGlzQ29tcG9uZW50UHJvdmlkZXIpIHtcbiAgICBtdWx0aUZhY3RvcnkubXVsdGkucHVzaChmYWN0b3J5KTtcbiAgICBpZiAoaXNDb21wb25lbnRQcm92aWRlcikge1xuICAgICAgICBtdWx0aUZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzKys7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBpdGVtIGluIHRoZSBhcnJheSwgYnV0IG9ubHkgaW4gdGhlIGJlZ2luIHRvIGVuZCByYW5nZS5cbiAqL1xuZnVuY3Rpb24gaW5kZXhPZihpdGVtLCBhcnIsIGJlZ2luLCBlbmQpIHtcbiAgICBmb3IgKHZhciBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICBpZiAoYXJyW2ldID09PSBpdGVtKVxuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cbi8qKlxuICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGBwcm92aWRlcnNgLlxuICovXG5mdW5jdGlvbiBtdWx0aVByb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlcihfLCB0RGF0YSwgbERhdGEsIHROb2RlKSB7XG4gICAgcmV0dXJuIG11bHRpUmVzb2x2ZSh0aGlzLm11bHRpLCBbXSk7XG59XG4vKipcbiAqIFVzZSB0aGlzIHdpdGggYG11bHRpYCBgdmlld1Byb3ZpZGVyc2AuXG4gKlxuICogVGhpcyBmYWN0b3J5IGtub3dzIGhvdyB0byBjb25jYXRlbmF0ZSBpdHNlbGYgd2l0aCB0aGUgZXhpc3RpbmcgYG11bHRpYCBgcHJvdmlkZXJzYC5cbiAqL1xuZnVuY3Rpb24gbXVsdGlWaWV3UHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyKF8sIHREYXRhLCBsRGF0YSwgdE5vZGUpIHtcbiAgICB2YXIgZmFjdG9yaWVzID0gdGhpcy5tdWx0aTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmICh0aGlzLnByb3ZpZGVyRmFjdG9yeSkge1xuICAgICAgICB2YXIgY29tcG9uZW50Q291bnQgPSB0aGlzLnByb3ZpZGVyRmFjdG9yeS5jb21wb25lbnRQcm92aWRlcnM7XG4gICAgICAgIHZhciBtdWx0aVByb3ZpZGVycyA9IGdldE5vZGVJbmplY3RhYmxlKHREYXRhLCBsRGF0YSwgdGhpcy5wcm92aWRlckZhY3RvcnkuaW5kZXgsIHROb2RlKTtcbiAgICAgICAgLy8gQ29weSB0aGUgc2VjdGlvbiBvZiB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgYG11bHRpYCBgcHJvdmlkZXJzYCBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgICAgcmVzdWx0ID0gbXVsdGlQcm92aWRlcnMuc2xpY2UoMCwgY29tcG9uZW50Q291bnQpO1xuICAgICAgICAvLyBJbnNlcnQgdGhlIGB2aWV3UHJvdmlkZXJgIGluc3RhbmNlcy5cbiAgICAgICAgbXVsdGlSZXNvbHZlKGZhY3RvcmllcywgcmVzdWx0KTtcbiAgICAgICAgLy8gQ29weSB0aGUgc2VjdGlvbiBvZiB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgYG11bHRpYCBgcHJvdmlkZXJzYCBmcm9tIG90aGVyIGRpcmVjdGl2ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IGNvbXBvbmVudENvdW50OyBpIDwgbXVsdGlQcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpUHJvdmlkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIC8vIEluc2VydCB0aGUgYHZpZXdQcm92aWRlcmAgaW5zdGFuY2VzLlxuICAgICAgICBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBNYXBzIGFuIGFycmF5IG9mIGZhY3RvcmllcyBpbnRvIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbXVsdGlSZXNvbHZlKGZhY3RvcmllcywgcmVzdWx0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmYWN0b3JpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3JpZXNbaV07XG4gICAgICAgIHJlc3VsdC5wdXNoKGZhY3RvcnkoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtdWx0aSBmYWN0b3J5LlxuICovXG5mdW5jdGlvbiBtdWx0aUZhY3RvcnkoZmFjdG9yeUZuLCBpbmRleCwgaXNWaWV3UHJvdmlkZXIsIGlzQ29tcG9uZW50LCBmKSB7XG4gICAgdmFyIGZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShmYWN0b3J5Rm4sIGlzVmlld1Byb3ZpZGVyLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KTtcbiAgICBmYWN0b3J5Lm11bHRpID0gW107XG4gICAgZmFjdG9yeS5pbmRleCA9IGluZGV4O1xuICAgIGZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzID0gMDtcbiAgICBtdWx0aUZhY3RvcnlBZGQoZmFjdG9yeSwgZiwgaXNDb21wb25lbnQgJiYgIWlzVmlld1Byb3ZpZGVyKTtcbiAgICByZXR1cm4gZmFjdG9yeTtcbn1cblxuLyoqXG4gKiBUaGlzIGZlYXR1cmUgcmVzb2x2ZXMgdGhlIHByb3ZpZGVycyBvZiBhIGRpcmVjdGl2ZSAob3IgY29tcG9uZW50KSxcbiAqIGFuZCBwdWJsaXNoIHRoZW0gaW50byB0aGUgREkgc3lzdGVtLCBtYWtpbmcgaXQgdmlzaWJsZSB0byBvdGhlcnMgZm9yIGluamVjdGlvbi5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqIGNsYXNzIENvbXBvbmVudFdpdGhQcm92aWRlcnMge1xuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyZWV0ZXI6IEdyZWV0ZXJERSkge31cbiAqXG4gKiAgIHN0YXRpYyBuZ0NvbXBvbmVudERlZiA9IGRlZmluZUNvbXBvbmVudCh7XG4gKiAgICAgdHlwZTogQ29tcG9uZW50V2l0aFByb3ZpZGVycyxcbiAqICAgICBzZWxlY3RvcnM6IFtbJ2NvbXBvbmVudC13aXRoLXByb3ZpZGVycyddXSxcbiAqICAgIGZhY3Rvcnk6ICgpID0+IG5ldyBDb21wb25lbnRXaXRoUHJvdmlkZXJzKGRpcmVjdGl2ZUluamVjdChHcmVldGVyREUgYXMgYW55KSksXG4gKiAgICBjb25zdHM6IDEsXG4gKiAgICB2YXJzOiAxLFxuICogICAgdGVtcGxhdGU6IGZ1bmN0aW9uKGZzOiBSZW5kZXJGbGFncywgY3R4OiBDb21wb25lbnRXaXRoUHJvdmlkZXJzKSB7XG4gKiAgICAgIGlmIChmcyAmIFJlbmRlckZsYWdzLkNyZWF0ZSkge1xuICogICAgICAgIHRleHQoMCk7XG4gKiAgICAgIH1cbiAqICAgICAgaWYgKGZzICYgUmVuZGVyRmxhZ3MuVXBkYXRlKSB7XG4gKiAgICAgICAgdGV4dEJpbmRpbmcoMCwgYmluZChjdHguZ3JlZXRlci5ncmVldCgpKSk7XG4gKiAgICAgIH1cbiAqICAgIH0sXG4gKiAgICBmZWF0dXJlczogW1Byb3ZpZGVyc0ZlYXR1cmUoW0dyZWV0ZXJERV0pXVxuICogIH0pO1xuICogfVxuICpcbiAqIEBwYXJhbSBkZWZpbml0aW9uXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtVByb3ZpZGVyc0ZlYXR1cmUocHJvdmlkZXJzLCB2aWV3UHJvdmlkZXJzKSB7XG4gICAgaWYgKHZpZXdQcm92aWRlcnMgPT09IHZvaWQgMCkgeyB2aWV3UHJvdmlkZXJzID0gW107IH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcbiAgICAgICAgZGVmaW5pdGlvbi5wcm92aWRlcnNSZXNvbHZlciA9XG4gICAgICAgICAgICBmdW5jdGlvbiAoZGVmLCBwcm9jZXNzUHJvdmlkZXJzRm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzUmVzb2x2ZXIoZGVmLCAvL1xuICAgICAgICAgICAgICAgIHByb2Nlc3NQcm92aWRlcnNGbiA/IHByb2Nlc3NQcm92aWRlcnNGbihwcm92aWRlcnMpIDogcHJvdmlkZXJzLCAvL1xuICAgICAgICAgICAgICAgIHZpZXdQcm92aWRlcnMpO1xuICAgICAgICAgICAgfTtcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgY3JlYXRlZCBieSBhIGBDb21wb25lbnRGYWN0b3J5YC5cbiAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIGFuZCByZWxhdGVkIG9iamVjdHMsXG4gKiBhbmQgcHJvdmlkZXMgdGhlIG1lYW5zIG9mIGRlc3Ryb3lpbmcgdGhlIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENvbXBvbmVudFJlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21wb25lbnRSZWYoKSB7XG4gICAgfVxuICAgIHJldHVybiBDb21wb25lbnRSZWY7XG59KCkpO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBDb21wb25lbnRGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3RvcnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IoXCJObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgXCIgKyBzdHJpbmdpZnkoY29tcG9uZW50KSArIFwiLiBEaWQgeW91IGFkZCBpdCB0byBATmdNb2R1bGUuZW50cnlDb21wb25lbnRzP1wiKTtcbiAgICBlcnJvcltFUlJPUl9DT01QT05FTlRdID0gY29tcG9uZW50O1xuICAgIHJldHVybiBlcnJvcjtcbn1cbnZhciBFUlJPUl9DT01QT05FTlQgPSAnbmdDb21wb25lbnQnO1xudmFyIF9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIF9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKCkge1xuICAgIH1cbiAgICBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIHRocm93IG5vQ29tcG9uZW50RmFjdG9yeUVycm9yKGNvbXBvbmVudCk7XG4gICAgfTtcbiAgICByZXR1cm4gX051bGxDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG59KCkpO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKCkge1xuICAgIH1cbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIuTlVMTCA9IG5ldyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpO1xuICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG59KCkpO1xudmFyIENvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcihmYWN0b3JpZXMsIF9wYXJlbnQsIF9uZ01vZHVsZSkge1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICB0aGlzLl9uZ01vZHVsZSA9IF9uZ01vZHVsZTtcbiAgICAgICAgdGhpcy5fZmFjdG9yaWVzID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZhY3Rvcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBmYWN0b3JpZXNbaV07XG4gICAgICAgICAgICB0aGlzLl9mYWN0b3JpZXMuc2V0KGZhY3RvcnkuY29tcG9uZW50VHlwZSwgZmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIHZhciBmYWN0b3J5ID0gdGhpcy5fZmFjdG9yaWVzLmdldChjb21wb25lbnQpO1xuICAgICAgICBpZiAoIWZhY3RvcnkgJiYgdGhpcy5fcGFyZW50KSB7XG4gICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5fcGFyZW50LnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyBub0NvbXBvbmVudEZhY3RvcnlFcnJvcihjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50RmFjdG9yeUJvdW5kVG9Nb2R1bGUoZmFjdG9yeSwgdGhpcy5fbmdNb2R1bGUpO1xuICAgIH07XG4gICAgcmV0dXJuIENvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG59KCkpO1xudmFyIENvbXBvbmVudEZhY3RvcnlCb3VuZFRvTW9kdWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb21wb25lbnRGYWN0b3J5Qm91bmRUb01vZHVsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb21wb25lbnRGYWN0b3J5Qm91bmRUb01vZHVsZShmYWN0b3J5LCBuZ01vZHVsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgX3RoaXMubmdNb2R1bGUgPSBuZ01vZHVsZTtcbiAgICAgICAgX3RoaXMuc2VsZWN0b3IgPSBmYWN0b3J5LnNlbGVjdG9yO1xuICAgICAgICBfdGhpcy5jb21wb25lbnRUeXBlID0gZmFjdG9yeS5jb21wb25lbnRUeXBlO1xuICAgICAgICBfdGhpcy5uZ0NvbnRlbnRTZWxlY3RvcnMgPSBmYWN0b3J5Lm5nQ29udGVudFNlbGVjdG9ycztcbiAgICAgICAgX3RoaXMuaW5wdXRzID0gZmFjdG9yeS5pbnB1dHM7XG4gICAgICAgIF90aGlzLm91dHB1dHMgPSBmYWN0b3J5Lm91dHB1dHM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29tcG9uZW50RmFjdG9yeUJvdW5kVG9Nb2R1bGUucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChpbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBuZ01vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBuZ01vZHVsZSB8fCB0aGlzLm5nTW9kdWxlKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5Qm91bmRUb01vZHVsZTtcbn0oQ29tcG9uZW50RmFjdG9yeSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYW4gTmdNb2R1bGUgY3JlYXRlZCB2aWEgYSB7QGxpbmsgTmdNb2R1bGVGYWN0b3J5fS5cbiAqXG4gKiBgTmdNb2R1bGVSZWZgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmdNb2R1bGUgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpc1xuICogTmdNb2R1bGUgSW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdNb2R1bGVSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdNb2R1bGVSZWYoKSB7XG4gICAgfVxuICAgIHJldHVybiBOZ01vZHVsZVJlZjtcbn0oKSk7XG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nTW9kdWxlRmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ01vZHVsZUZhY3RvcnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBOZ01vZHVsZUZhY3Rvcnk7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVmlld1JlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWaWV3UmVmKF9sVmlldywgX2NvbnRleHQsIF9jb21wb25lbnRJbmRleCkge1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gX2NvbnRleHQ7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEluZGV4ID0gX2NvbXBvbmVudEluZGV4O1xuICAgICAgICB0aGlzLl9hcHBSZWYgPSBudWxsO1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fdFZpZXdOb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbFZpZXcgPSBfbFZpZXc7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3UmVmLnByb3RvdHlwZSwgXCJyb290Tm9kZXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sVmlld1tIT1NUXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRWaWV3ID0gdGhpcy5fbFZpZXdbVF9IT1NUXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdE5hdGl2ZU5vZGVzKHRoaXMuX2xWaWV3LCB0VmlldywgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld1JlZi5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY29udGV4dCA/IHRoaXMuX2NvbnRleHQgOiB0aGlzLl9sb29rVXBDb250ZXh0KCk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3UmVmLnByb3RvdHlwZSwgXCJkZXN0cm95ZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5fbFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykgPT09IDI1NiAvKiBEZXN0cm95ZWQgKi87XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFZpZXdSZWYucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hcHBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcFJlZi5kZXRhY2hWaWV3KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3ZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGVzdHJveUxWaWV3KHRoaXMuX2xWaWV3KTtcbiAgICB9O1xuICAgIFZpZXdSZWYucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyBzdG9yZUNsZWFudXBGbih0aGlzLl9sVmlldywgY2FsbGJhY2spOyB9O1xuICAgIC8qKlxuICAgICAqIE1hcmtzIGEgdmlldyBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgZGlydHkuXG4gICAgICpcbiAgICAgKiBJdCBhbHNvIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gYnkgY2FsbGluZyBgc2NoZWR1bGVUaWNrYCBpbnRlcm5hbGx5LCB3aGljaCBjb2FsZXNjZXNcbiAgICAgKiBtdWx0aXBsZSBgbWFya0ZvckNoZWNrYCBjYWxscyB0byBpbnRvIG9uZSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5zdXJlIGFuIHtAbGluayBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSNPblB1c2ggT25QdXNofSBjb21wb25lbnQgaXNcbiAgICAgKiBjaGVja2VkIHdoZW4gaXQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQgYnV0IHRoZSB0d28gbm9ybWFsIHRyaWdnZXJzIGhhdmVuJ3QgbWFya2VkIGl0XG4gICAgICogZGlydHkgKGkuZS4gaW5wdXRzIGhhdmVuJ3QgY2hhbmdlZCBhbmQgZXZlbnRzIGhhdmVuJ3QgZmlyZWQgaW4gdGhlIHZpZXcpLlxuICAgICAqXG4gICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAQ29tcG9uZW50KHtcbiAgICAgKiAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAgICAgKiAgIHRlbXBsYXRlOiBgTnVtYmVyIG9mIHRpY2tzOiB7e251bWJlck9mVGlja3N9fWBcbiAgICAgKiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgICAqIH0pXG4gICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHtcbiAgICAgKiAgIG51bWJlck9mVGlja3MgPSAwO1xuICAgICAqXG4gICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAqICAgICAgIHRoaXMubnVtYmVyT2ZUaWNrcysrO1xuICAgICAqICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQsIG90aGVyd2lzZSB0aGUgdmlldyB3aWxsIG5vdCBiZSB1cGRhdGVkXG4gICAgICogICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICogICAgIH0sIDEwMDApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBWaWV3UmVmLnByb3RvdHlwZS5tYXJrRm9yQ2hlY2sgPSBmdW5jdGlvbiAoKSB7IG1hcmtWaWV3RGlydHkodGhpcy5fbFZpZXcpOyB9O1xuICAgIC8qKlxuICAgICAqIERldGFjaGVzIHRoZSB2aWV3IGZyb20gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS5cbiAgICAgKlxuICAgICAqIERldGFjaGVkIHZpZXdzIHdpbGwgbm90IGJlIGNoZWNrZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gcnVucyB1bnRpbCB0aGV5IGFyZVxuICAgICAqIHJlLWF0dGFjaGVkLCBldmVuIGlmIHRoZXkgYXJlIGRpcnR5LiBgZGV0YWNoYCBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoXG4gICAgICoge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGVjdENoYW5nZXMgZGV0ZWN0Q2hhbmdlc30gdG8gaW1wbGVtZW50IGxvY2FsIGNoYW5nZVxuICAgICAqIGRldGVjdGlvbiBjaGVja3MuXG4gICAgICpcbiAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+XG4gICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+XG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkb25seSBkYXRhLlxuICAgICAqIEltYWdpbmUgdGhlIGRhdGEgY2hhbmdlcyBjb25zdGFudGx5LCBtYW55IHRpbWVzIHBlciBzZWNvbmQuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLFxuICAgICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZ1xuICAgICAqIHRoZSBjb21wb25lbnQncyBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGRvaW5nIGEgbG9jYWwgY2hlY2sgZXZlcnkgZml2ZSBzZWNvbmRzLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNsYXNzIERhdGFQcm92aWRlciB7XG4gICAgICogICAvLyBpbiBhIHJlYWwgYXBwbGljYXRpb24gdGhlIHJldHVybmVkIGRhdGEgd2lsbCBiZSBkaWZmZXJlbnQgZXZlcnkgdGltZVxuICAgICAqICAgZ2V0IGRhdGEoKSB7XG4gICAgICogICAgIHJldHVybiBbMSwyLDMsNCw1XTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBAQ29tcG9uZW50KHtcbiAgICAgKiAgIHNlbGVjdG9yOiAnZ2lhbnQtbGlzdCcsXG4gICAgICogICB0ZW1wbGF0ZTogYFxuICAgICAqICAgICA8bGkgKm5nRm9yPVwibGV0IGQgb2YgZGF0YVByb3ZpZGVyLmRhdGFcIj5EYXRhIHt7ZH19PC9saT5cbiAgICAgKiAgIGAsXG4gICAgICogfSlcbiAgICAgKiBjbGFzcyBHaWFudExpc3Qge1xuICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyKSB7XG4gICAgICogICAgIHJlZi5kZXRhY2goKTtcbiAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAqICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgKiAgICAgfSwgNTAwMCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogQENvbXBvbmVudCh7XG4gICAgICogICBzZWxlY3RvcjogJ2FwcCcsXG4gICAgICogICBwcm92aWRlcnM6IFtEYXRhUHJvdmlkZXJdLFxuICAgICAqICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgPGdpYW50LWxpc3Q+PGdpYW50LWxpc3Q+XG4gICAgICogICBgLFxuICAgICAqIH0pXG4gICAgICogY2xhc3MgQXBwIHtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgVmlld1JlZi5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9sVmlld1tGTEFHU10gJj0gfjEyOCAvKiBBdHRhY2hlZCAqLzsgfTtcbiAgICAvKipcbiAgICAgKiBSZS1hdHRhY2hlcyBhIHZpZXcgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmUtYXR0YWNoIHZpZXdzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGRldGFjaGVkIGZyb20gdGhlIHRyZWVcbiAgICAgKiB1c2luZyB7QGxpbmsgQ2hhbmdlRGV0ZWN0b3JSZWYjZGV0YWNoIGRldGFjaH0uIFZpZXdzIGFyZSBhdHRhY2hlZCB0byB0aGUgdHJlZSBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBjb21wb25lbnQgZGlzcGxheWluZyBgbGl2ZWAgZGF0YS4gVGhlIGNvbXBvbmVudCB3aWxsIGRldGFjaFxuICAgICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5XG4gICAgICogaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNsYXNzIERhdGFQcm92aWRlciB7XG4gICAgICogICBkYXRhID0gMTtcbiAgICAgKlxuICAgICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAgICogICAgIHNldEludGVydmFsKCgpID0+IHtcbiAgICAgKiAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgKiAyO1xuICAgICAqICAgICB9LCA1MDApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEBDb21wb25lbnQoe1xuICAgICAqICAgc2VsZWN0b3I6ICdsaXZlLWRhdGEnLFxuICAgICAqICAgaW5wdXRzOiBbJ2xpdmUnXSxcbiAgICAgKiAgIHRlbXBsYXRlOiAnRGF0YToge3tkYXRhUHJvdmlkZXIuZGF0YX19J1xuICAgICAqIH0pXG4gICAgICogY2xhc3MgTGl2ZURhdGEge1xuICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyKSB7fVxuICAgICAqXG4gICAgICogICBzZXQgbGl2ZSh2YWx1ZSkge1xuICAgICAqICAgICBpZiAodmFsdWUpIHtcbiAgICAgKiAgICAgICB0aGlzLnJlZi5yZWF0dGFjaCgpO1xuICAgICAqICAgICB9IGVsc2Uge1xuICAgICAqICAgICAgIHRoaXMucmVmLmRldGFjaCgpO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogQENvbXBvbmVudCh7XG4gICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAgICogICBwcm92aWRlcnM6IFtEYXRhUHJvdmlkZXJdLFxuICAgICAqICAgdGVtcGxhdGU6IGBcbiAgICAgKiAgICAgTGl2ZSBVcGRhdGU6IDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImxpdmVcIj5cbiAgICAgKiAgICAgPGxpdmUtZGF0YSBbbGl2ZV09XCJsaXZlXCI+PGxpdmUtZGF0YT5cbiAgICAgKiAgIGAsXG4gICAgICogfSlcbiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQge1xuICAgICAqICAgbGl2ZSA9IHRydWU7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFZpZXdSZWYucHJvdG90eXBlLnJlYXR0YWNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9sVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovOyB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGUgdmlldyBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9IHRvIGltcGxlbWVudFxuICAgICAqIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb24gY2hlY2tzLlxuICAgICAqXG4gICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPlxuICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGl2ZSBkZW1vIG9uY2UgcmVmLmRldGVjdENoYW5nZXMgaXMgbWVyZ2VkIGludG8gbWFzdGVyIC0tPlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjb21wb25lbnQgd2l0aCBhIGxhcmdlIGxpc3Qgb2YgcmVhZG9ubHkgZGF0YS5cbiAgICAgKiBJbWFnaW5lLCB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gICAgICogd2Ugd2FudCB0byBjaGVjayBhbmQgdXBkYXRlIHRoZSBsaXN0IGV2ZXJ5IGZpdmUgc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgKiBjaGVjayBldmVyeSBmaXZlIHNlY29uZHMuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIFZpZXdSZWYucHJvdG90eXBlLmRldGVjdENoYW5nZXMgPSBmdW5jdGlvbiAoKSB7IGRldGVjdENoYW5nZXNJbnRlcm5hbCh0aGlzLl9sVmlldywgdGhpcy5jb250ZXh0KTsgfTtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhlIGNoYW5nZSBkZXRlY3RvciBhbmQgaXRzIGNoaWxkcmVuLCBhbmQgdGhyb3dzIGlmIGFueSBjaGFuZ2VzIGFyZSBkZXRlY3RlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlIHRvIHZlcmlmeSB0aGF0IHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0XG4gICAgICogaW50cm9kdWNlIG90aGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgVmlld1JlZi5wcm90b3R5cGUuY2hlY2tOb0NoYW5nZXMgPSBmdW5jdGlvbiAoKSB7IGNoZWNrTm9DaGFuZ2VzSW50ZXJuYWwodGhpcy5fbFZpZXcsIHRoaXMuY29udGV4dCk7IH07XG4gICAgVmlld1JlZi5wcm90b3R5cGUuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmID0gZnVuY3Rpb24gKHZjUmVmKSB7XG4gICAgICAgIGlmICh0aGlzLl9hcHBSZWYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIEFwcGxpY2F0aW9uUmVmIScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSB2Y1JlZjtcbiAgICB9O1xuICAgIFZpZXdSZWYucHJvdG90eXBlLmRldGFjaEZyb21BcHBSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2FwcFJlZiA9IG51bGw7XG4gICAgICAgIHJlbmRlckRldGFjaFZpZXcodGhpcy5fbFZpZXcpO1xuICAgIH07XG4gICAgVmlld1JlZi5wcm90b3R5cGUuYXR0YWNoVG9BcHBSZWYgPSBmdW5jdGlvbiAoYXBwUmVmKSB7XG4gICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgVmlld0NvbnRhaW5lciEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBSZWYgPSBhcHBSZWY7XG4gICAgfTtcbiAgICBWaWV3UmVmLnByb3RvdHlwZS5fbG9va1VwQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQgPSBnZXRMVmlld1BhcmVudCh0aGlzLl9sVmlldylbdGhpcy5fY29tcG9uZW50SW5kZXhdO1xuICAgIH07XG4gICAgcmV0dXJuIFZpZXdSZWY7XG59KCkpO1xuLyoqIEBpbnRlcm5hbCAqL1xudmFyIFJvb3RWaWV3UmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSb290Vmlld1JlZiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSb290Vmlld1JlZihfdmlldykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBfdmlldywgbnVsbCwgLTEpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl92aWV3ID0gX3ZpZXc7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUm9vdFZpZXdSZWYucHJvdG90eXBlLmRldGVjdENoYW5nZXMgPSBmdW5jdGlvbiAoKSB7IGRldGVjdENoYW5nZXNJblJvb3RWaWV3KHRoaXMuX3ZpZXcpOyB9O1xuICAgIFJvb3RWaWV3UmVmLnByb3RvdHlwZS5jaGVja05vQ2hhbmdlcyA9IGZ1bmN0aW9uICgpIHsgY2hlY2tOb0NoYW5nZXNJblJvb3RWaWV3KHRoaXMuX3ZpZXcpOyB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSb290Vmlld1JlZi5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIFJvb3RWaWV3UmVmO1xufShWaWV3UmVmKSk7XG5mdW5jdGlvbiBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXcsIHBhcmVudFROb2RlLCByZXN1bHQpIHtcbiAgICB2YXIgdE5vZGVDaGlsZCA9IHBhcmVudFROb2RlLmNoaWxkO1xuICAgIHdoaWxlICh0Tm9kZUNoaWxkKSB7XG4gICAgICAgIHZhciBuYXRpdmVOb2RlID0gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZUNoaWxkLCBsVmlldyk7XG4gICAgICAgIG5hdGl2ZU5vZGUgJiYgcmVzdWx0LnB1c2gobmF0aXZlTm9kZSk7XG4gICAgICAgIGlmICh0Tm9kZUNoaWxkLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykge1xuICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKGxWaWV3LCB0Tm9kZUNoaWxkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHROb2RlQ2hpbGQudHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IGZpbmRDb21wb25lbnRWaWV3KGxWaWV3KTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRIb3N0ID0gY29tcG9uZW50Vmlld1tUX0hPU1RdO1xuICAgICAgICAgICAgdmFyIHBhcmVudFZpZXcgPSBnZXRMVmlld1BhcmVudChjb21wb25lbnRWaWV3KTtcbiAgICAgICAgICAgIHZhciBjdXJyZW50UHJvamVjdGVkTm9kZSA9IGNvbXBvbmVudEhvc3QucHJvamVjdGlvblt0Tm9kZUNoaWxkLnByb2plY3Rpb25dO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRQcm9qZWN0ZWROb2RlICYmIHBhcmVudFZpZXcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZXROYXRpdmVCeVROb2RlKGN1cnJlbnRQcm9qZWN0ZWROb2RlLCBwYXJlbnRWaWV3KSk7XG4gICAgICAgICAgICAgICAgY3VycmVudFByb2plY3RlZE5vZGUgPSBjdXJyZW50UHJvamVjdGVkTm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHROb2RlQ2hpbGQgPSB0Tm9kZUNoaWxkLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQ3JlYXRlcyBhbiBFbGVtZW50UmVmIGZyb20gdGhlIG1vc3QgcmVjZW50IG5vZGUuXG4gKlxuICogQHJldHVybnMgVGhlIEVsZW1lbnRSZWYgaW5zdGFuY2UgdG8gdXNlXG4gKi9cbmZ1bmN0aW9uIGluamVjdEVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuLCBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgZ2V0TFZpZXcoKSk7XG59XG52YXIgUjNFbGVtZW50UmVmO1xuLyoqXG4gKiBDcmVhdGVzIGFuIEVsZW1lbnRSZWYgZ2l2ZW4gYSBub2RlLlxuICpcbiAqIEBwYXJhbSBFbGVtZW50UmVmVG9rZW4gVGhlIEVsZW1lbnRSZWYgdHlwZVxuICogQHBhcmFtIHROb2RlIFRoZSBub2RlIGZvciB3aGljaCB5b3UnZCBsaWtlIGFuIEVsZW1lbnRSZWZcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRvIHdoaWNoIHRoZSBub2RlIGJlbG9uZ3NcbiAqIEByZXR1cm5zIFRoZSBFbGVtZW50UmVmIGluc3RhbmNlIHRvIHVzZVxuICovXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50UmVmKEVsZW1lbnRSZWZUb2tlbiwgdE5vZGUsIHZpZXcpIHtcbiAgICBpZiAoIVIzRWxlbWVudFJlZikge1xuICAgICAgICAvLyBUT0RPOiBGaXggY2xhc3MgbmFtZSwgc2hvdWxkIGJlIEVsZW1lbnRSZWYsIGJ1dCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgcm9sbHVwIGJ1Z1xuICAgICAgICBSM0VsZW1lbnRSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgICAgICBfX2V4dGVuZHMoRWxlbWVudFJlZl8sIF9zdXBlcik7XG4gICAgICAgICAgICBmdW5jdGlvbiBFbGVtZW50UmVmXygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRWxlbWVudFJlZl87XG4gICAgICAgIH0oRWxlbWVudFJlZlRva2VuKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUjNFbGVtZW50UmVmKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIHZpZXcpKTtcbn1cbnZhciBSM1RlbXBsYXRlUmVmO1xuLyoqXG4gKiBDcmVhdGVzIGEgVGVtcGxhdGVSZWYgZ2l2ZW4gYSBub2RlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBUZW1wbGF0ZVJlZiBpbnN0YW5jZSB0byB1c2VcbiAqL1xuZnVuY3Rpb24gaW5qZWN0VGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGdldExWaWV3KCkpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgVGVtcGxhdGVSZWYgYW5kIHN0b3JlcyBpdCBvbiB0aGUgaW5qZWN0b3IuXG4gKlxuICogQHBhcmFtIFRlbXBsYXRlUmVmVG9rZW4gVGhlIFRlbXBsYXRlUmVmIHR5cGVcbiAqIEBwYXJhbSBFbGVtZW50UmVmVG9rZW4gVGhlIEVsZW1lbnRSZWYgdHlwZVxuICogQHBhcmFtIGhvc3RUTm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBUZW1wbGF0ZVJlZlxuICogQHBhcmFtIGhvc3RWaWV3IFRoZSB2aWV3IHRvIHdoaWNoIHRoZSBub2RlIGJlbG9uZ3NcbiAqIEByZXR1cm5zIFRoZSBUZW1wbGF0ZVJlZiBpbnN0YW5jZSB0byB1c2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuLCBob3N0VE5vZGUsIGhvc3RWaWV3KSB7XG4gICAgaWYgKCFSM1RlbXBsYXRlUmVmKSB7XG4gICAgICAgIC8vIFRPRE86IEZpeCBjbGFzcyBuYW1lLCBzaG91bGQgYmUgVGVtcGxhdGVSZWYsIGJ1dCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgcm9sbHVwIGJ1Z1xuICAgICAgICBSM1RlbXBsYXRlUmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICAgICAgX19leHRlbmRzKFRlbXBsYXRlUmVmXywgX3N1cGVyKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIFRlbXBsYXRlUmVmXyhfZGVjbGFyYXRpb25QYXJlbnRWaWV3LCBlbGVtZW50UmVmLCBfdFZpZXcsIF9ob3N0TENvbnRhaW5lciwgX2luamVjdG9ySW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICAgICAgICAgIF90aGlzLl9kZWNsYXJhdGlvblBhcmVudFZpZXcgPSBfZGVjbGFyYXRpb25QYXJlbnRWaWV3O1xuICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgICAgICAgICAgICAgIF90aGlzLl90VmlldyA9IF90VmlldztcbiAgICAgICAgICAgICAgICBfdGhpcy5faG9zdExDb250YWluZXIgPSBfaG9zdExDb250YWluZXI7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2luamVjdG9ySW5kZXggPSBfaW5qZWN0b3JJbmRleDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUZW1wbGF0ZVJlZl8ucHJvdG90eXBlLmNyZWF0ZUVtYmVkZGVkVmlldyA9IGZ1bmN0aW9uIChjb250ZXh0LCBjb250YWluZXIsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRRdWVyaWVzID0gdGhpcy5fZGVjbGFyYXRpb25QYXJlbnRWaWV3W1FVRVJJRVNdO1xuICAgICAgICAgICAgICAgIC8vIFF1ZXJ5IGNvbnRhaW5lciBtYXkgYmUgbWlzc2luZyBpZiB0aGlzIHZpZXcgd2FzIGNyZWF0ZWQgaW4gYSBkaXJlY3RpdmVcbiAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3Rvci4gQ3JlYXRlIGl0IG5vdyB0byBhdm9pZCBsb3NpbmcgcmVzdWx0cyBpbiBlbWJlZGRlZCB2aWV3cy5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFF1ZXJpZXMgJiYgdGhpcy5faG9zdExDb250YWluZXJbUVVFUklFU10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob3N0TENvbnRhaW5lcltRVUVSSUVTXSA9IGN1cnJlbnRRdWVyaWVzLmNvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbFZpZXcgPSBjcmVhdGVFbWJlZGRlZFZpZXdBbmROb2RlKHRoaXMuX3RWaWV3LCBjb250ZXh0LCB0aGlzLl9kZWNsYXJhdGlvblBhcmVudFZpZXcsIHRoaXMuX2hvc3RMQ29udGFpbmVyW1FVRVJJRVNdLCB0aGlzLl9pbmplY3RvckluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGluc2VydFZpZXcobFZpZXcsIGNvbnRhaW5lciwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZW5kZXJFbWJlZGRlZFRlbXBsYXRlKGxWaWV3LCB0aGlzLl90VmlldywgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXdSZWYgPSBuZXcgVmlld1JlZihsVmlldywgY29udGV4dCwgLTEpO1xuICAgICAgICAgICAgICAgIHZpZXdSZWYuX3RWaWV3Tm9kZSA9IGxWaWV3W1RfSE9TVF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWY7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUmVmXztcbiAgICAgICAgfShUZW1wbGF0ZVJlZlRva2VuKSk7XG4gICAgfVxuICAgIGlmIChob3N0VE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHtcbiAgICAgICAgdmFyIGhvc3RDb250YWluZXIgPSBob3N0Vmlld1tob3N0VE5vZGUuaW5kZXhdO1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChob3N0VE5vZGUudFZpZXdzLCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSM1RlbXBsYXRlUmVmKGhvc3RWaWV3LCBjcmVhdGVFbGVtZW50UmVmKEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0VmlldyksIGhvc3RUTm9kZS50Vmlld3MsIGhvc3RDb250YWluZXIsIGhvc3RUTm9kZS5pbmplY3RvckluZGV4KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbnZhciBSM1ZpZXdDb250YWluZXJSZWY7XG4vKipcbiAqIENyZWF0ZXMgYSBWaWV3Q29udGFpbmVyUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLiBPciwgaWYgdGhlIFZpZXdDb250YWluZXJSZWZcbiAqIGFscmVhZHkgZXhpc3RzLCByZXRyaWV2ZXMgdGhlIGV4aXN0aW5nIFZpZXdDb250YWluZXJSZWYuXG4gKlxuICogQHJldHVybnMgVGhlIFZpZXdDb250YWluZXJSZWYgaW5zdGFuY2UgdG8gdXNlXG4gKi9cbmZ1bmN0aW9uIGluamVjdFZpZXdDb250YWluZXJSZWYoVmlld0NvbnRhaW5lclJlZlRva2VuLCBFbGVtZW50UmVmVG9rZW4pIHtcbiAgICB2YXIgcHJldmlvdXNUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIHJldHVybiBjcmVhdGVDb250YWluZXJSZWYoVmlld0NvbnRhaW5lclJlZlRva2VuLCBFbGVtZW50UmVmVG9rZW4sIHByZXZpb3VzVE5vZGUsIGdldExWaWV3KCkpO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgVmlld0NvbnRhaW5lclJlZiBhbmQgc3RvcmVzIGl0IG9uIHRoZSBpbmplY3Rvci5cbiAqXG4gKiBAcGFyYW0gVmlld0NvbnRhaW5lclJlZlRva2VuIFRoZSBWaWV3Q29udGFpbmVyUmVmIHR5cGVcbiAqIEBwYXJhbSBFbGVtZW50UmVmVG9rZW4gVGhlIEVsZW1lbnRSZWYgdHlwZVxuICogQHBhcmFtIGhvc3RUTm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBWaWV3Q29udGFpbmVyUmVmXG4gKiBAcGFyYW0gaG9zdFZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25nc1xuICogQHJldHVybnMgVGhlIFZpZXdDb250YWluZXJSZWYgaW5zdGFuY2UgdG8gdXNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0Vmlldykge1xuICAgIGlmICghUjNWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgIC8vIFRPRE86IEZpeCBjbGFzcyBuYW1lLCBzaG91bGQgYmUgVmlld0NvbnRhaW5lclJlZiwgYnV0IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSByb2xsdXAgYnVnXG4gICAgICAgIFIzVmlld0NvbnRhaW5lclJlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgICAgIF9fZXh0ZW5kcyhWaWV3Q29udGFpbmVyUmVmXywgX3N1cGVyKTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIFZpZXdDb250YWluZXJSZWZfKF9sQ29udGFpbmVyLCBfaG9zdFROb2RlLCBfaG9zdFZpZXcpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICAgICAgICAgIF90aGlzLl9sQ29udGFpbmVyID0gX2xDb250YWluZXI7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2hvc3RUTm9kZSA9IF9ob3N0VE5vZGU7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2hvc3RWaWV3ID0gX2hvc3RWaWV3O1xuICAgICAgICAgICAgICAgIF90aGlzLl92aWV3UmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUsIFwiZWxlbWVudFwiLCB7XG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50UmVmKEVsZW1lbnRSZWZUb2tlbiwgdGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7IH0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZSwgXCJwYXJlbnRJbmplY3RvclwiLCB7XG4gICAgICAgICAgICAgICAgLyoqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50ICovXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRMb2NhdGlvbiA9IGdldFBhcmVudEluamVjdG9yTG9jYXRpb24odGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCB0aGlzLl9ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRUTm9kZSA9IGdldFBhcmVudEluamVjdG9yVE5vZGUocGFyZW50TG9jYXRpb24sIHRoaXMuX2hvc3RWaWV3LCB0aGlzLl9ob3N0VE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWhhc1BhcmVudEluamVjdG9yKHBhcmVudExvY2F0aW9uKSB8fCBwYXJlbnRUTm9kZSA9PSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlSW5qZWN0b3IobnVsbCwgdGhpcy5faG9zdFZpZXcpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlSW5qZWN0b3IocGFyZW50VE5vZGUsIHBhcmVudFZpZXcpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdTXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHsgcmV0dXJuIHRoaXMuX3ZpZXdSZWZzW2luZGV4XSB8fCBudWxsOyB9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbENvbnRhaW5lcltWSUVXU10ubGVuZ3RoOyB9LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZFZpZXcgPSBmdW5jdGlvbiAodGVtcGxhdGVSZWYsIGNvbnRleHQsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkSWR4ID0gdGhpcy5fYWRqdXN0SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHZhciB2aWV3UmVmID0gdGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUVtYmVkZGVkVmlldyhjb250ZXh0IHx8IHt9LCB0aGlzLl9sQ29udGFpbmVyLCBhZGp1c3RlZElkeCk7XG4gICAgICAgICAgICAgICAgdmlld1JlZi5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWYodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld1JlZnMuc3BsaWNlKGFkanVzdGVkSWR4LCAwLCB2aWV3UmVmKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudEZhY3RvcnksIGluZGV4LCBpbmplY3RvciwgcHJvamVjdGFibGVOb2RlcywgbmdNb2R1bGVSZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dEluamVjdG9yID0gaW5qZWN0b3IgfHwgdGhpcy5wYXJlbnRJbmplY3RvcjtcbiAgICAgICAgICAgICAgICBpZiAoIW5nTW9kdWxlUmVmICYmIGNvbXBvbmVudEZhY3RvcnkubmdNb2R1bGUgPT0gbnVsbCAmJiBjb250ZXh0SW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVSZWYgPSBjb250ZXh0SW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGNvbnRleHRJbmplY3RvciwgcHJvamVjdGFibGVOb2RlcywgdW5kZWZpbmVkLCBuZ01vZHVsZVJlZik7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHZpZXdSZWYsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXdSZWYuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGluc2VydCBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxWaWV3ID0gdmlld1JlZi5fbFZpZXc7XG4gICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkSWR4ID0gdGhpcy5fYWRqdXN0SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcihsVmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkLCBmYWxsIGJhY2sgdG8gbW92ZSgpIHNvIHdlIGNsZWFuIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZXMgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZSh2aWV3UmVmLCBhZGp1c3RlZElkeCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluc2VydFZpZXcobFZpZXcsIHRoaXMuX2xDb250YWluZXIsIGFkanVzdGVkSWR4KTtcbiAgICAgICAgICAgICAgICB2YXIgYmVmb3JlTm9kZSA9IGdldEJlZm9yZU5vZGVGb3JWaWV3KGFkanVzdGVkSWR4LCB0aGlzLl9sQ29udGFpbmVyW1ZJRVdTXSwgdGhpcy5fbENvbnRhaW5lcltOQVRJVkVdKTtcbiAgICAgICAgICAgICAgICBhZGRSZW1vdmVWaWV3RnJvbUNvbnRhaW5lcihsVmlldywgdHJ1ZSwgYmVmb3JlTm9kZSk7XG4gICAgICAgICAgICAgICAgdmlld1JlZi5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWYodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld1JlZnMuc3BsaWNlKGFkanVzdGVkSWR4LCAwLCB2aWV3UmVmKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICh2aWV3UmVmLCBuZXdJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3UmVmLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBtb3ZlIGEgZGVzdHJveWVkIFZpZXcgaW4gYSBWaWV3Q29udGFpbmVyIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2Yodmlld1JlZik7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2goaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHZpZXdSZWYsIG5ld0luZGV4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uICh2aWV3UmVmKSB7IHJldHVybiB0aGlzLl92aWV3UmVmcy5pbmRleE9mKHZpZXdSZWYpOyB9O1xuICAgICAgICAgICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgIHZhciBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4LCAtMSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlVmlldyh0aGlzLl9sQ29udGFpbmVyLCBhZGp1c3RlZElkeCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld1JlZnMuc3BsaWNlKGFkanVzdGVkSWR4LCAxKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGFkanVzdGVkSWR4ID0gdGhpcy5fYWRqdXN0SW5kZXgoaW5kZXgsIC0xKTtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IGRldGFjaFZpZXcodGhpcy5fbENvbnRhaW5lciwgYWRqdXN0ZWRJZHgpO1xuICAgICAgICAgICAgICAgIHZhciB3YXNEZXRhY2hlZCA9IHZpZXcgJiYgdGhpcy5fdmlld1JlZnMuc3BsaWNlKGFkanVzdGVkSWR4LCAxKVswXSAhPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiB3YXNEZXRhY2hlZCA/IG5ldyBWaWV3UmVmKHZpZXcsIHZpZXdbQ09OVEVYVF0sIC0xKSA6IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLl9hZGp1c3RJbmRleCA9IGZ1bmN0aW9uIChpbmRleCwgc2hpZnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT09IHZvaWQgMCkgeyBzaGlmdCA9IDA7IH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lcltWSUVXU10ubGVuZ3RoICsgc2hpZnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0R3JlYXRlclRoYW4oaW5kZXgsIC0xLCAnaW5kZXggbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICAvLyArMSBiZWNhdXNlIGl0J3MgbGVnYWwgdG8gaW5zZXJ0IGF0IHRoZSBlbmQuXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydExlc3NUaGFuKGluZGV4LCB0aGlzLl9sQ29udGFpbmVyW1ZJRVdTXS5sZW5ndGggKyAxICsgc2hpZnQsICdpbmRleCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIFZpZXdDb250YWluZXJSZWZfO1xuICAgICAgICB9KFZpZXdDb250YWluZXJSZWZUb2tlbikpO1xuICAgIH1cbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyhob3N0VE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7XG4gICAgdmFyIGxDb250YWluZXI7XG4gICAgdmFyIHNsb3RWYWx1ZSA9IGhvc3RWaWV3W2hvc3RUTm9kZS5pbmRleF07XG4gICAgaWYgKGlzTENvbnRhaW5lcihzbG90VmFsdWUpKSB7XG4gICAgICAgIC8vIElmIHRoZSBob3N0IGlzIGEgY29udGFpbmVyLCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBMQ29udGFpbmVyXG4gICAgICAgIGxDb250YWluZXIgPSBzbG90VmFsdWU7XG4gICAgICAgIGxDb250YWluZXJbQUNUSVZFX0lOREVYXSA9IC0xO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNvbW1lbnROb2RlID0gaG9zdFZpZXdbUkVOREVSRVJdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlID8gJ2NvbnRhaW5lcicgOiAnJyk7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7XG4gICAgICAgIC8vIEEgY29udGFpbmVyIGNhbiBiZSBjcmVhdGVkIG9uIHRoZSByb290ICh0b3Btb3N0IC8gYm9vdHN0cmFwcGVkKSBjb21wb25lbnQgYW5kIGluIHRoaXMgY2FzZSB3ZVxuICAgICAgICAvLyBjYW4ndCB1c2UgTFRyZWUgdG8gaW5zZXJ0IGNvbnRhaW5lcidzIG1hcmtlciBub2RlIChib3RoIHBhcmVudCBvZiBhIGNvbW1lbnQgbm9kZSBhbmQgdGhlXG4gICAgICAgIC8vIGNvbW1lbmQgbm9kZSBpdHNlbGYgaXMgbG9jYXRlZCBvdXRzaWRlIG9mIGVsZW1lbnRzIGhvbGQgYnkgTFRyZWUpLiBJbiB0aGlzIHNwZWNpZmljIGNhc2Ugd2VcbiAgICAgICAgLy8gdXNlIGxvdy1sZXZlbCBET00gbWFuaXB1bGF0aW9uIHRvIGluc2VydCBjb250YWluZXIncyBtYXJrZXIgKGNvbW1lbnQpIG5vZGUuXG4gICAgICAgIGlmIChpc1Jvb3RWaWV3KGhvc3RWaWV3KSkge1xuICAgICAgICAgICAgdmFyIHJlbmRlcmVyID0gaG9zdFZpZXdbUkVOREVSRVJdO1xuICAgICAgICAgICAgdmFyIGhvc3ROYXRpdmUgPSBnZXROYXRpdmVCeVROb2RlKGhvc3RUTm9kZSwgaG9zdFZpZXcpO1xuICAgICAgICAgICAgdmFyIHBhcmVudE9mSG9zdE5hdGl2ZSA9IG5hdGl2ZVBhcmVudE5vZGUocmVuZGVyZXIsIGhvc3ROYXRpdmUpO1xuICAgICAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnRPZkhvc3ROYXRpdmUsIGNvbW1lbnROb2RlLCBuYXRpdmVOZXh0U2libGluZyhyZW5kZXJlciwgaG9zdE5hdGl2ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXBwZW5kQ2hpbGQoY29tbWVudE5vZGUsIGhvc3RUTm9kZSwgaG9zdFZpZXcpO1xuICAgICAgICB9XG4gICAgICAgIGhvc3RWaWV3W2hvc3RUTm9kZS5pbmRleF0gPSBsQ29udGFpbmVyID1cbiAgICAgICAgICAgIGNyZWF0ZUxDb250YWluZXIoc2xvdFZhbHVlLCBob3N0VmlldywgY29tbWVudE5vZGUsIGhvc3RUTm9kZSwgdHJ1ZSk7XG4gICAgICAgIGFkZFRvVmlld1RyZWUoaG9zdFZpZXcsIGxDb250YWluZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFIzVmlld0NvbnRhaW5lclJlZihsQ29udGFpbmVyLCBob3N0VE5vZGUsIGhvc3RWaWV3KTtcbn1cbi8qKiBSZXR1cm5zIGEgQ2hhbmdlRGV0ZWN0b3JSZWYgKGEuay5hLiBhIFZpZXdSZWYpICovXG5mdW5jdGlvbiBpbmplY3RDaGFuZ2VEZXRlY3RvclJlZigpIHtcbiAgICByZXR1cm4gY3JlYXRlVmlld1JlZihnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgZ2V0TFZpZXcoKSwgbnVsbCk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBWaWV3UmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yIGFzIENoYW5nZURldGVjdG9yUmVmIChwdWJsaWMgYWxpYXMpLlxuICpcbiAqIEBwYXJhbSBob3N0VE5vZGUgVGhlIG5vZGUgdGhhdCBpcyByZXF1ZXN0aW5nIGEgQ2hhbmdlRGV0ZWN0b3JSZWZcbiAqIEBwYXJhbSBob3N0VmlldyBUaGUgdmlldyB0byB3aGljaCB0aGUgbm9kZSBiZWxvbmdzXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhpcyBjaGFuZ2UgZGV0ZWN0b3IgcmVmXG4gKiBAcmV0dXJucyBUaGUgQ2hhbmdlRGV0ZWN0b3JSZWYgdG8gdXNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVZpZXdSZWYoaG9zdFROb2RlLCBob3N0VmlldywgY29udGV4dCkge1xuICAgIGlmIChpc0NvbXBvbmVudChob3N0VE5vZGUpKSB7XG4gICAgICAgIHZhciBjb21wb25lbnRJbmRleCA9IGhvc3RUTm9kZS5kaXJlY3RpdmVTdGFydDtcbiAgICAgICAgdmFyIGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRWaWV3QnlJbmRleChob3N0VE5vZGUuaW5kZXgsIGhvc3RWaWV3KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaWV3UmVmKGNvbXBvbmVudFZpZXcsIGNvbnRleHQsIGNvbXBvbmVudEluZGV4KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaG9zdFROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCBob3N0VE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8gfHxcbiAgICAgICAgaG9zdFROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykge1xuICAgICAgICB2YXIgaG9zdENvbXBvbmVudFZpZXcgPSBmaW5kQ29tcG9uZW50Vmlldyhob3N0Vmlldyk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld1JlZihob3N0Q29tcG9uZW50VmlldywgaG9zdENvbXBvbmVudFZpZXdbQ09OVEVYVF0sIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRPckNyZWF0ZVJlbmRlcmVyMih2aWV3KSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdmlld1tSRU5ERVJFUl07XG4gICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkge1xuICAgICAgICByZXR1cm4gcmVuZGVyZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmplY3QgUmVuZGVyZXIyIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHVzZXMgUmVuZGVyZXIzIScpO1xuICAgIH1cbn1cbi8qKiBSZXR1cm5zIGEgUmVuZGVyZXIyIChvciB0aHJvd3Mgd2hlbiBhcHBsaWNhdGlvbiB3YXMgYm9vdHN0cmFwcGVkIHdpdGggUmVuZGVyZXIzKSAqL1xuZnVuY3Rpb24gaW5qZWN0UmVuZGVyZXIyKCkge1xuICAgIHJldHVybiBnZXRPckNyZWF0ZVJlbmRlcmVyMihnZXRMVmlldygpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgLy8gRG8gbm90aGluZy5cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIGEgbmF0aXZlIGVsZW1lbnQgaW5zaWRlIG9mIGEgVmlldy5cbiAqXG4gKiBBbiBgRWxlbWVudFJlZmAgaXMgYmFja2VkIGJ5IGEgcmVuZGVyLXNwZWNpZmljIGVsZW1lbnQuIEluIHRoZSBicm93c2VyLCB0aGlzIGlzIHVzdWFsbHkgYSBET01cbiAqIGVsZW1lbnQuXG4gKlxuICogQHNlY3VyaXR5IFBlcm1pdHRpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUgRE9NIGNhbiBtYWtlIHlvdXIgYXBwbGljYXRpb24gbW9yZSB2dWxuZXJhYmxlIHRvXG4gKiBYU1MgYXR0YWNrcy4gQ2FyZWZ1bGx5IHJldmlldyBhbnkgdXNlIG9mIGBFbGVtZW50UmVmYCBpbiB5b3VyIGNvZGUuIEZvciBtb3JlIGRldGFpbCwgc2VlIHRoZVxuICogW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG4vLyBOb3RlOiBXZSBkb24ndCBleHBvc2UgdGhpbmdzIGxpa2UgYEluamVjdG9yYCwgYFZpZXdDb250YWluZXJgLCAuLi4gaGVyZSxcbi8vIGkuZS4gdXNlcnMgaGF2ZSB0byBhc2sgZm9yIHdoYXQgdGhleSBuZWVkLiBXaXRoIHRoYXQsIHdlIGNhbiBidWlsZCBiZXR0ZXIgYW5hbHlzaXMgdG9vbHNcbi8vIGFuZCBjb3VsZCBkbyBiZXR0ZXIgY29kZWdlbiBpbiB0aGUgZnV0dXJlLlxudmFyIEVsZW1lbnRSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRWxlbWVudFJlZihuYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IG5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgRWxlbWVudFJlZi5fX05HX0VMRU1FTlRfSURfXyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZKEVsZW1lbnRSZWYpOyB9O1xuICAgIHJldHVybiBFbGVtZW50UmVmO1xufSgpKTtcbnZhciBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0RWxlbWVudFJlZjtcbnZhciBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUFJFX1IzX18gPSBub29wO1xudmFyIFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZID0gU1dJVENIX0VMRU1FTlRfUkVGX0ZBQ1RPUllfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgUmVuZGVyZXJUeXBlMmAgKGFuZCBgUmVuZGVyZXIyYCkgaW5zdGVhZC5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFJlbmRlckNvbXBvbmVudFR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVuZGVyQ29tcG9uZW50VHlwZShpZCwgdGVtcGxhdGVVcmwsIHNsb3RDb3VudCwgZW5jYXBzdWxhdGlvbiwgc3R5bGVzLCBhbmltYXRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVVybCA9IHRlbXBsYXRlVXJsO1xuICAgICAgICB0aGlzLnNsb3RDb3VudCA9IHNsb3RDb3VudDtcbiAgICAgICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gZW5jYXBzdWxhdGlvbjtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9ucyA9IGFuaW1hdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBSZW5kZXJDb21wb25lbnRUeXBlO1xufSgpKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgRGVidWcgaW5mbyBpcyBoYW5kbGVkIGludGVybmFsbHkgaW4gdGhlIHZpZXcgZW5naW5lIG5vdy5cbiAqL1xudmFyIFJlbmRlckRlYnVnSW5mbyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZW5kZXJEZWJ1Z0luZm8oKSB7XG4gICAgfVxuICAgIHJldHVybiBSZW5kZXJEZWJ1Z0luZm87XG59KCkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBSZW5kZXJlcjJgIGluc3RlYWQuXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBSZW5kZXJlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZW5kZXJlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIFJlbmRlcmVyO1xufSgpKTtcbnZhciBSZW5kZXJlcjJJbnRlcmNlcHRvciA9IG5ldyBJbmplY3Rpb25Ub2tlbignUmVuZGVyZXIySW50ZXJjZXB0b3InKTtcbi8qKlxuICogSW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIGZvciBtb2RpZnlpbmcgdGhlIFVJLlxuICpcbiAqIFVzZSB0aGlzIHNlcnZpY2UgdG8gYnlwYXNzIEFuZ3VsYXIncyB0ZW1wbGF0aW5nIGFuZCBtYWtlIGN1c3RvbSBVSSBjaGFuZ2VzIHRoYXQgY2FuJ3QgYmVcbiAqIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xuICogbm90IHN0YXRpY2FsbHkga25vd24sIHVzZSB7QGxpbmsgUmVuZGVyZXIjc2V0RWxlbWVudFByb3BlcnR5IHNldEVsZW1lbnRQcm9wZXJ0eX0gb3JcbiAqIHtAbGluayBSZW5kZXJlciNzZXRFbGVtZW50QXR0cmlidXRlIHNldEVsZW1lbnRBdHRyaWJ1dGV9IHJlc3BlY3RpdmVseS5cbiAqXG4gKiBJZiB5b3UgYXJlIGltcGxlbWVudGluZyBhIGN1c3RvbSByZW5kZXJlciwgeW91IG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICpcbiAqIFRoZSBkZWZhdWx0IFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGlzIGBEb21SZW5kZXJlcmAuIEFsc28gYXZhaWxhYmxlIGlzIGBXZWJXb3JrZXJSZW5kZXJlcmAuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBSZW5kZXJlckZhY3RvcnkyYCBpbnN0ZWFkLlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgUm9vdFJlbmRlcmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJvb3RSZW5kZXJlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIFJvb3RSZW5kZXJlcjtcbn0oKSk7XG4vKipcbiAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgY3VzdG9tIHJlbmRlcmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYFJlbmRlcmVyMmAgYmFzZSBjbGFzcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBSZW5kZXJlckZhY3RvcnkyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlbmRlcmVyRmFjdG9yeTIoKSB7XG4gICAgfVxuICAgIHJldHVybiBSZW5kZXJlckZhY3RvcnkyO1xufSgpKTtcbi8qKlxuICogRmxhZ3MgZm9yIHJlbmRlcmVyLXNwZWNpZmljIHN0eWxlIG1vZGlmaWVycy5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFJlbmRlcmVyU3R5bGVGbGFnczI7XG4oZnVuY3Rpb24gKFJlbmRlcmVyU3R5bGVGbGFnczIpIHtcbiAgICAvKipcbiAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIGltcG9ydGFudC5cbiAgICAgKi9cbiAgICBSZW5kZXJlclN0eWxlRmxhZ3MyW1JlbmRlcmVyU3R5bGVGbGFnczJbXCJJbXBvcnRhbnRcIl0gPSAxXSA9IFwiSW1wb3J0YW50XCI7XG4gICAgLyoqXG4gICAgICogTWFya3MgYSBzdHlsZSBhcyB1c2luZyBkYXNoIGNhc2UgbmFtaW5nICh0aGlzLWlzLWRhc2gtY2FzZSkuXG4gICAgICovXG4gICAgUmVuZGVyZXJTdHlsZUZsYWdzMltSZW5kZXJlclN0eWxlRmxhZ3MyW1wiRGFzaENhc2VcIl0gPSAyXSA9IFwiRGFzaENhc2VcIjtcbn0pKFJlbmRlcmVyU3R5bGVGbGFnczIgfHwgKFJlbmRlcmVyU3R5bGVGbGFnczIgPSB7fSkpO1xuLyoqXG4gKiBFeHRlbmQgdGhpcyBiYXNlIGNsYXNzIHRvIGltcGxlbWVudCBjdXN0b20gcmVuZGVyaW5nLiBCeSBkZWZhdWx0LCBBbmd1bGFyXG4gKiByZW5kZXJzIGEgdGVtcGxhdGUgaW50byBET00uIFlvdSBjYW4gdXNlIGN1c3RvbSByZW5kZXJpbmcgdG8gaW50ZXJjZXB0XG4gKiByZW5kZXJpbmcgY2FsbHMsIG9yIHRvIHJlbmRlciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBET00uXG4gKlxuICogQ3JlYXRlIHlvdXIgY3VzdG9tIHJlbmRlcmVyIHVzaW5nIGBSZW5kZXJlckZhY3RvcnkyYC5cbiAqXG4gKiBVc2UgYSBjdXN0b20gcmVuZGVyZXIgdG8gYnlwYXNzIEFuZ3VsYXIncyB0ZW1wbGF0aW5nIGFuZFxuICogbWFrZSBjdXN0b20gVUkgY2hhbmdlcyB0aGF0IGNhbid0IGJlIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LlxuICogRm9yIGV4YW1wbGUgaWYgeW91IG5lZWQgdG8gc2V0IGEgcHJvcGVydHkgb3IgYW4gYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbiAqIG5vdCBzdGF0aWNhbGx5IGtub3duLCB1c2UgdGhlIGBzZXRQcm9wZXJ0eSgpYCBvclxuICogYHNldEF0dHJpYnV0ZSgpYCBtZXRob2QuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgUmVuZGVyZXIyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlbmRlcmVyMigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICogQG5vY29sbGFwc2VcbiAgICAgKi9cbiAgICBSZW5kZXJlcjIuX19OR19FTEVNRU5UX0lEX18gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUlkoKTsgfTtcbiAgICByZXR1cm4gUmVuZGVyZXIyO1xufSgpKTtcbnZhciBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUllfX1BPU1RfUjNfXyA9IGluamVjdFJlbmRlcmVyMjtcbnZhciBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUllfX1BSRV9SM19fID0gbm9vcDtcbnZhciBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUlkgPSBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUllfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG9mIEFuZ3VsYXJcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWZXJzaW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZlcnNpb24oZnVsbCkge1xuICAgICAgICB0aGlzLmZ1bGwgPSBmdWxsO1xuICAgICAgICB0aGlzLm1ham9yID0gZnVsbC5zcGxpdCgnLicpWzBdO1xuICAgICAgICB0aGlzLm1pbm9yID0gZnVsbC5zcGxpdCgnLicpWzFdO1xuICAgICAgICB0aGlzLnBhdGNoID0gZnVsbC5zcGxpdCgnLicpLnNsaWNlKDIpLmpvaW4oJy4nKTtcbiAgICB9XG4gICAgcmV0dXJuIFZlcnNpb247XG59KCkpO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzguMC4zJyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkoKSB7XG4gICAgfVxuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iaik7IH07XG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKHRyYWNrQnlGbikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRJdGVyYWJsZURpZmZlcih0cmFja0J5Rm4pO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3Rvcnk7XG59KCkpO1xudmFyIHRyYWNrQnlJZGVudGl0eSA9IGZ1bmN0aW9uIChpbmRleCwgaXRlbSkgeyByZXR1cm4gaXRlbTsgfTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdjQuMC4wIC0gU2hvdWxkIG5vdCBiZSBwYXJ0IG9mIHB1YmxpYyBBUEkuXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBEZWZhdWx0SXRlcmFibGVEaWZmZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmYXVsdEl0ZXJhYmxlRGlmZmVyKHRyYWNrQnlGbikge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB1c2VkIHJlY29yZHMgYXQgYW55IHBvaW50IGluIHRpbWUgKGR1cmluZyAmIGFjcm9zcyBgX2NoZWNrKClgIGNhbGxzKVxuICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbnVsbDtcbiAgICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHJlbW92ZWQgcmVjb3JkcyBhdCBhbnkgcG9pbnQgaW4gdGltZSBkdXJpbmcgYF9jaGVjaygpYCBjYWxscy5cbiAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNJdEhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pdEhlYWQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pdFRhaWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX21vdmVzSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX21vdmVzVGFpbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG4gICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHJlY29yZHMgd2hlcmUgY3VzdG9tIHRyYWNrIGJ5IGlzIHRoZSBzYW1lLCBidXQgaXRlbSBpZGVudGl0eSBoYXMgY2hhbmdlZFxuICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IHRyYWNrQnlGbiB8fCB0cmFja0J5SWRlbnRpdHk7XG4gICAgfVxuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJlY29yZDtcbiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hPcGVyYXRpb24gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIG5leHRJdCA9IHRoaXMuX2l0SGVhZDtcbiAgICAgICAgdmFyIG5leHRSZW1vdmUgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7XG4gICAgICAgIHZhciBhZGRSZW1vdmVPZmZzZXQgPSAwO1xuICAgICAgICB2YXIgbW92ZU9mZnNldHMgPSBudWxsO1xuICAgICAgICB3aGlsZSAobmV4dEl0IHx8IG5leHRSZW1vdmUpIHtcbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hpY2ggaXMgdGhlIG5leHQgcmVjb3JkIHRvIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIE9yZGVyOiByZW1vdmUsIGFkZCwgbW92ZVxuICAgICAgICAgICAgdmFyIHJlY29yZCA9ICFuZXh0UmVtb3ZlIHx8XG4gICAgICAgICAgICAgICAgbmV4dEl0ICYmXG4gICAgICAgICAgICAgICAgICAgIG5leHRJdC5jdXJyZW50SW5kZXggPFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJldmlvdXNJbmRleChuZXh0UmVtb3ZlLCBhZGRSZW1vdmVPZmZzZXQsIG1vdmVPZmZzZXRzKSA/XG4gICAgICAgICAgICAgICAgbmV4dEl0IDpcbiAgICAgICAgICAgICAgICBuZXh0UmVtb3ZlO1xuICAgICAgICAgICAgdmFyIGFkalByZXZpb3VzSW5kZXggPSBnZXRQcmV2aW91c0luZGV4KHJlY29yZCwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cyk7XG4gICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gcmVjb3JkLmN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGl0ZW0sIGFuZCBhZGp1c3QgdGhlIGFkZFJlbW92ZU9mZnNldCBhbmQgdXBkYXRlIG1vdmVEaXN0YW5jZSBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG5leHRSZW1vdmUpIHtcbiAgICAgICAgICAgICAgICBhZGRSZW1vdmVPZmZzZXQtLTtcbiAgICAgICAgICAgICAgICBuZXh0UmVtb3ZlID0gbmV4dFJlbW92ZS5fbmV4dFJlbW92ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0SXQgPSBuZXh0SXQuX25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3ZlT2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJTlZBUklBTlQ6ICBjdXJyZW50SW5kZXggPCBwcmV2aW91c0luZGV4XG4gICAgICAgICAgICAgICAgICAgIGlmICghbW92ZU9mZnNldHMpXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYWxNb3ZlUHJldmlvdXNJbmRleCA9IGFkalByZXZpb3VzSW5kZXggLSBhZGRSZW1vdmVPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbEN1cnJlbnRJbmRleCA9IGN1cnJlbnRJbmRleCAtIGFkZFJlbW92ZU9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTW92ZVByZXZpb3VzSW5kZXggIT0gbG9jYWxDdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxNb3ZlUHJldmlvdXNJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGkgPCBtb3ZlT2Zmc2V0cy5sZW5ndGggPyBtb3ZlT2Zmc2V0c1tpXSA6IChtb3ZlT2Zmc2V0c1tpXSA9IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG9mZnNldCArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQ3VycmVudEluZGV4IDw9IGluZGV4ICYmIGluZGV4IDwgbG9jYWxNb3ZlUHJldmlvdXNJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0c1tpXSA9IG9mZnNldCArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzSW5kZXggPSByZWNvcmQucHJldmlvdXNJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdID0gbG9jYWxDdXJyZW50SW5kZXggLSBsb2NhbE1vdmVQcmV2aW91c0luZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFkalByZXZpb3VzSW5kZXggIT09IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgICAgIGZuKHJlY29yZCwgYWRqUHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoUHJldmlvdXNJdGVtID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciByZWNvcmQ7XG4gICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHtcbiAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaEFkZGVkSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB2YXIgcmVjb3JkO1xuICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaE1vdmVkSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB2YXIgcmVjb3JkO1xuICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkge1xuICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoUmVtb3ZlZEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJlY29yZDtcbiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJlY29yZDtcbiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dElkZW50aXR5Q2hhbmdlKSB7XG4gICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiAoY29sbGVjdGlvbikge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKVxuICAgICAgICAgICAgY29sbGVjdGlvbiA9IFtdO1xuICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJ1wiICsgc3RyaW5naWZ5KGNvbGxlY3Rpb24pICsgXCInLiBPbmx5IGFycmF5cyBhbmQgaXRlcmFibGVzIGFyZSBhbGxvd2VkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgICAgdmFyIHJlY29yZCA9IHRoaXMuX2l0SGVhZDtcbiAgICAgICAgdmFyIG1heUJlRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZGV4O1xuICAgICAgICB2YXIgaXRlbTtcbiAgICAgICAgdmFyIGl0ZW1UcmFja0J5O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4XzEgPSAwOyBpbmRleF8xIDwgdGhpcy5sZW5ndGg7IGluZGV4XzErKykge1xuICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2xsZWN0aW9uW2luZGV4XzFdO1xuICAgICAgICAgICAgICAgIGl0ZW1UcmFja0J5ID0gdGhpcy5fdHJhY2tCeUZuKGluZGV4XzEsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwgfHwgIWxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIGl0ZW1UcmFja0J5KSkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleF8xKTtcbiAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNhbiB3ZSBsaW1pdCB0aGlzIHRvIGR1cGxpY2F0ZXMgb25seT9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4XzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICAgICAgaXRlcmF0ZUxpc3RMaWtlKGNvbGxlY3Rpb24sIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbVRyYWNrQnkgPSBfdGhpcy5fdHJhY2tCeUZuKGluZGV4LCBpdGVtKTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09PSBudWxsIHx8ICFsb29zZUlkZW50aWNhbChyZWNvcmQudHJhY2tCeUlkLCBpdGVtVHJhY2tCeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkID0gX3RoaXMuX21pc21hdGNoKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNhbiB3ZSBsaW1pdCB0aGlzIHRvIGR1cGxpY2F0ZXMgb25seT9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IF90aGlzLl92ZXJpZnlSZWluc2VydGlvbihyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdHJ1bmNhdGUocmVjb3JkKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLCBcImlzRGlydHlcIiwge1xuICAgICAgICAvKiBDb2xsZWN0aW9uQ2hhbmdlcyBpcyBjb25zaWRlcmVkIGRpcnR5IGlmIGl0IGhhcyBhbnkgYWRkaXRpb25zLCBtb3ZlcywgcmVtb3ZhbHMsIG9yIGlkZW50aXR5XG4gICAgICAgICAqIGNoYW5nZXMuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX21vdmVzSGVhZCAhPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbCB8fCB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkICE9PSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGNoYW5nZSBvYmplY3RzIHRvIHNob3cgbm8gY2hhbmdlcy4gVGhpcyBtZWFucyBzZXQgcHJldmlvdXNLZXkgdG9cbiAgICAgKiBjdXJyZW50S2V5LCBhbmQgY2xlYXIgYWxsIG9mIHRoZSBxdWV1ZXMgKGFkZGl0aW9ucywgbW92ZXMsIHJlbW92YWxzKS5cbiAgICAgKiBTZXQgdGhlIHByZXZpb3VzSW5kZXhlcyBvZiBtb3ZlZCBhbmQgYWRkZWQgaXRlbXMgdG8gdGhlaXIgY3VycmVudEluZGV4ZXNcbiAgICAgKiBSZXNldCB0aGUgbGlzdCBvZiBhZGRpdGlvbnMsIG1vdmVzIGFuZCByZW1vdmFsc1xuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIHZhciByZWNvcmQgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgbmV4dFJlY29yZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzSW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG5leHRSZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21vdmVzSGVhZCA9IHRoaXMuX21vdmVzVGFpbCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsO1xuICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTogd2hlbiBhc3NlcnQgZ2V0cyBzdXBwb3J0ZWRcbiAgICAgICAgICAgIC8vIGFzc2VydCghdGhpcy5pc0RpcnR5KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgY29yZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29sbGVjdGlvbnMuXG4gICAgICpcbiAgICAgKiAtIGByZWNvcmRgIGlzIHRoZSByZWNvcmQgd2hpY2ggd2Ugc2F3IGF0IHRoaXMgcG9zaXRpb24gbGFzdCB0aW1lLiBJZiBudWxsIHRoZW4gaXQgaXMgYSBuZXdcbiAgICAgKiAgIGl0ZW0uXG4gICAgICogLSBgaXRlbWAgaXMgdGhlIGN1cnJlbnQgaXRlbSBpbiB0aGUgY29sbGVjdGlvblxuICAgICAqIC0gYGluZGV4YCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX21pc21hdGNoID0gZnVuY3Rpb24gKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KSB7XG4gICAgICAgIC8vIFRoZSBwcmV2aW91cyByZWNvcmQgYWZ0ZXIgd2hpY2ggd2Ugd2lsbCBhcHBlbmQgdGhlIGN1cnJlbnQgb25lLlxuICAgICAgICB2YXIgcHJldmlvdXNSZWNvcmQ7XG4gICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHByZXZpb3VzUmVjb3JkID0gdGhpcy5faXRUYWlsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNSZWNvcmQgPSByZWNvcmQuX3ByZXY7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHNpbmNlIHdlIGtub3cgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGl0ZW0uXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdHRlbXB0IHRvIHNlZSBpZiB3ZSBoYXZlIHNlZW4gdGhlIGl0ZW0gYmVmb3JlLlxuICAgICAgICByZWNvcmQgPSB0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX2xpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBpbmRleCk7XG4gICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgc2VlbiB0aGlzIGJlZm9yZSwgd2UgbmVlZCB0byBtb3ZlIGl0IGZvcndhcmQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSlcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pO1xuICAgICAgICAgICAgdGhpcy5fbW92ZUFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5ldmVyIHNlZW4gaXQsIGNoZWNrIGV2aWN0ZWQgbGlzdC5cbiAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBudWxsKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhbiBpdGVtIHdoaWNoIHdlIGhhdmUgZXZpY3RlZCBlYXJsaWVyOiByZWluc2VydCBpdCBiYWNrIGludG8gdGhlIGxpc3QuXG4gICAgICAgICAgICAgICAgLy8gQnV0IGZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgaWRlbnRpdHkgY2hhbmdlZCwgc28gd2UgY2FuIHVwZGF0ZSBpbiB2aWV3IGlmIG5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBuZXcgaXRlbTogYWRkIGl0LlxuICAgICAgICAgICAgICAgIHJlY29yZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEFmdGVyKG5ldyBJdGVyYWJsZUNoYW5nZVJlY29yZF8oaXRlbSwgaXRlbVRyYWNrQnkpLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGNoZWNrIGlzIG9ubHkgbmVlZGVkIGlmIGFuIGFycmF5IGNvbnRhaW5zIGR1cGxpY2F0ZXMuIChTaG9ydCBjaXJjdWl0IG9mIG5vdGhpbmcgZGlydHkpXG4gICAgICpcbiAgICAgKiBVc2UgY2FzZTogYFthLCBhXWAgPT4gYFtiLCBhLCBhXWBcbiAgICAgKlxuICAgICAqIElmIHdlIGRpZCBub3QgaGF2ZSB0aGlzIGNoZWNrIHRoZW4gdGhlIGluc2VydGlvbiBvZiBgYmAgd291bGQ6XG4gICAgICogICAxKSBldmljdCBmaXJzdCBgYWBcbiAgICAgKiAgIDIpIGluc2VydCBgYmAgYXQgYDBgIGluZGV4LlxuICAgICAqICAgMykgbGVhdmUgYGFgIGF0IGluZGV4IGAxYCBhcyBpcy4gPC0tIHRoaXMgaXMgd3JvbmchXG4gICAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMi4gPC0tIHRoaXMgaXMgd3JvbmchXG4gICAgICpcbiAgICAgKiBUaGUgY29ycmVjdCBiZWhhdmlvciBpczpcbiAgICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYFxuICAgICAqICAgMikgaW5zZXJ0IGBiYCBhdCBgMGAgaW5kZXguXG4gICAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMS5cbiAgICAgKiAgIDMpIG1vdmUgYGFgIGF0IGZyb20gYDFgIHRvIGAyYC5cbiAgICAgKlxuICAgICAqXG4gICAgICogRG91YmxlIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZXZpY3RlZCBhIGR1cGxpY2F0ZSBpdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpdGVtIHR5cGUgbWF5XG4gICAgICogaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZDpcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9mIGIgd2lsbCBldmljdCB0aGUgZmlyc3QgJ2EnLiBJZiB3ZSBkb24ndCByZWluc2VydCBpdCBub3cgaXQgd2lsbCBiZSByZWluc2VydGVkXG4gICAgICogYXQgdGhlIGVuZC4gV2hpY2ggd2lsbCBzaG93IHVwIGFzIHRoZSB0d28gJ2EncyBzd2l0Y2hpbmcgcG9zaXRpb24uIFRoaXMgaXMgaW5jb3JyZWN0LCBzaW5jZSBhXG4gICAgICogYmV0dGVyIHdheSB0byB0aGluayBvZiBpdCBpcyBhcyBpbnNlcnQgb2YgJ2InIHJhdGhlciB0aGVuIHN3aXRjaCAnYScgd2l0aCAnYicgYW5kIHRoZW4gYWRkICdhJ1xuICAgICAqIGF0IHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl92ZXJpZnlSZWluc2VydGlvbiA9IGZ1bmN0aW9uIChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCkge1xuICAgICAgICB2YXIgcmVpbnNlcnRSZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtVHJhY2tCeSwgbnVsbCk7XG4gICAgICAgIGlmIChyZWluc2VydFJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVjb3JkID0gdGhpcy5fcmVpbnNlcnRBZnRlcihyZWluc2VydFJlY29yZCwgcmVjb3JkLl9wcmV2LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVjb3JkLmN1cnJlbnRJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHJpZCBvZiBhbnkgZXhjZXNzIHtAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99cyBmcm9tIHRoZSBwcmV2aW91cyBjb2xsZWN0aW9uXG4gICAgICpcbiAgICAgKiAtIGByZWNvcmRgIFRoZSBmaXJzdCBleGNlc3Mge0BsaW5rIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkX30uXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl90cnVuY2F0ZSA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgLy8gQW55dGhpbmcgYWZ0ZXIgdGhhdCBuZWVkcyB0byBiZSByZW1vdmVkO1xuICAgICAgICB3aGlsZSAocmVjb3JkICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgbmV4dFJlY29yZCA9IHJlY29yZC5fbmV4dDtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpO1xuICAgICAgICAgICAgcmVjb3JkID0gbmV4dFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdW5saW5rZWRSZWNvcmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2l0VGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faXRUYWlsLl9uZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmVtb3ZhbHNUYWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX3JlaW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5fdW5saW5rZWRSZWNvcmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucmVtb3ZlKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXYgPSByZWNvcmQuX3ByZXZSZW1vdmVkO1xuICAgICAgICB2YXIgbmV4dCA9IHJlY29yZC5fbmV4dFJlbW92ZWQ7XG4gICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldi5fbmV4dFJlbW92ZWQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV4dC5fcHJldlJlbW92ZWQgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpO1xuICAgICAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX21vdmVBZnRlciA9IGZ1bmN0aW9uIChyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuX3VubGluayhyZWNvcmQpO1xuICAgICAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBEZWZhdWx0SXRlcmFibGVEaWZmZXIucHJvdG90eXBlLl9hZGRBZnRlciA9IGZ1bmN0aW9uIChyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7XG4gICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTpcbiAgICAgICAgICAgIC8vIGFzc2VydCh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSB0aGlzLl9hZGRpdGlvbnNIZWFkID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTpcbiAgICAgICAgICAgIC8vIGFzc2VydChfYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID09PSBudWxsKTtcbiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5faW5zZXJ0QWZ0ZXIgPSBmdW5jdGlvbiAocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkge1xuICAgICAgICAvLyBUT0RPKHZpY2IpOlxuICAgICAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpO1xuICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09PSBudWxsKTtcbiAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fcHJldiA9PT0gbnVsbCk7XG4gICAgICAgIHZhciBuZXh0ID0gcHJldlJlY29yZCA9PT0gbnVsbCA/IHRoaXMuX2l0SGVhZCA6IHByZXZSZWNvcmQuX25leHQ7XG4gICAgICAgIC8vIFRPRE8odmljYik6XG4gICAgICAgIC8vIGFzc2VydChuZXh0ICE9IHJlY29yZCk7XG4gICAgICAgIC8vIGFzc2VydChwcmV2UmVjb3JkICE9IHJlY29yZCk7XG4gICAgICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7XG4gICAgICAgIHJlY29yZC5fcHJldiA9IHByZXZSZWNvcmQ7XG4gICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2UmVjb3JkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzLnB1dChyZWNvcmQpO1xuICAgICAgICByZWNvcmQuY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fcmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkVG9SZW1vdmFscyh0aGlzLl91bmxpbmsocmVjb3JkKSk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fdW5saW5rID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldjtcbiAgICAgICAgdmFyIG5leHQgPSByZWNvcmQuX25leHQ7XG4gICAgICAgIC8vIFRPRE8odmljYik6XG4gICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9wcmV2ID0gbnVsbCkgPT09IG51bGwpO1xuICAgICAgICAvLyBhc3NlcnQoKHJlY29yZC5fbmV4dCA9IG51bGwpID09PSBudWxsKTtcbiAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2l0SGVhZCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gcHJldjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5leHQuX3ByZXYgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9Nb3ZlcyA9IGZ1bmN0aW9uIChyZWNvcmQsIHRvSW5kZXgpIHtcbiAgICAgICAgLy8gVE9ETyh2aWNiKTpcbiAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dE1vdmVkID09PSBudWxsKTtcbiAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSB0b0luZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tb3Zlc1RhaWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRPRE8odmljYik6XG4gICAgICAgICAgICAvLyBhc3NlcnQoX21vdmVzSGVhZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc0hlYWQgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPKHZpY2IpOlxuICAgICAgICAgICAgLy8gYXNzZXJ0KF9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG4gICAgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9SZW1vdmFscyA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7XG4gICAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBudWxsO1xuICAgICAgICByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTpcbiAgICAgICAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNIZWFkID09PSBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDtcbiAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTpcbiAgICAgICAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7XG4gICAgICAgICAgICByZWNvcmQuX3ByZXZSZW1vdmVkID0gdGhpcy5fcmVtb3ZhbHNUYWlsO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsID0gdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRJdGVyYWJsZURpZmZlci5wcm90b3R5cGUuX2FkZElkZW50aXR5Q2hhbmdlID0gZnVuY3Rpb24gKHJlY29yZCwgaXRlbSkge1xuICAgICAgICByZWNvcmQuaXRlbSA9IGl0ZW07XG4gICAgICAgIGlmICh0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9O1xuICAgIHJldHVybiBEZWZhdWx0SXRlcmFibGVEaWZmZXI7XG59KCkpO1xudmFyIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJdGVyYWJsZUNoYW5nZVJlY29yZF8oaXRlbSwgdHJhY2tCeUlkKSB7XG4gICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgICAgIHRoaXMudHJhY2tCeUlkID0gdHJhY2tCeUlkO1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMucHJldmlvdXNJbmRleCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dFByZXZpb3VzID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9wcmV2RHVwID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9uZXh0RHVwID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9wcmV2UmVtb3ZlZCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX25leHRBZGRlZCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dE1vdmVkID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gSXRlcmFibGVDaGFuZ2VSZWNvcmRfO1xufSgpKTtcbi8vIEEgbGlua2VkIGxpc3Qgb2YgQ29sbGVjdGlvbkNoYW5nZVJlY29yZHMgd2l0aCB0aGUgc2FtZSBJdGVyYWJsZUNoYW5nZVJlY29yZF8uaXRlbVxudmFyIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QoKSB7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5faGVhZCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fdGFpbCA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFwcGVuZCB0aGUgcmVjb3JkIHRvIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBieSBkZXNpZ24gYWxsIHJlY29yZHMgaW4gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBob2xkIHRoZSBzYW1lIHZhbHVlIGluIHJlY29yZC5pdGVtLlxuICAgICAqL1xuICAgIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICBpZiAodGhpcy5faGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7XG4gICAgICAgICAgICByZWNvcmQuX25leHREdXAgPSBudWxsO1xuICAgICAgICAgICAgcmVjb3JkLl9wcmV2RHVwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRPRE8odmljYik6XG4gICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLml0ZW0gPT0gIF9oZWFkLml0ZW0gfHxcbiAgICAgICAgICAgIC8vICAgICAgIHJlY29yZC5pdGVtIGlzIG51bSAmJiByZWNvcmQuaXRlbS5pc05hTiAmJiBfaGVhZC5pdGVtIGlzIG51bSAmJiBfaGVhZC5pdGVtLmlzTmFOKTtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwuX25leHREdXAgPSByZWNvcmQ7XG4gICAgICAgICAgICByZWNvcmQuX3ByZXZEdXAgPSB0aGlzLl90YWlsO1xuICAgICAgICAgICAgcmVjb3JkLl9uZXh0RHVwID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIFJldHVybnMgYSBJdGVyYWJsZUNoYW5nZVJlY29yZF8gaGF2aW5nIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy50cmFja0J5SWQgPT0gdHJhY2tCeUlkIGFuZFxuICAgIC8vIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy5jdXJyZW50SW5kZXggPj0gYXRPckFmdGVySW5kZXhcbiAgICBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0cmFja0J5SWQsIGF0T3JBZnRlckluZGV4KSB7XG4gICAgICAgIHZhciByZWNvcmQ7XG4gICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5faGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHREdXApIHtcbiAgICAgICAgICAgIGlmICgoYXRPckFmdGVySW5kZXggPT09IG51bGwgfHwgYXRPckFmdGVySW5kZXggPD0gcmVjb3JkLmN1cnJlbnRJbmRleCkgJiZcbiAgICAgICAgICAgICAgICBsb29zZUlkZW50aWNhbChyZWNvcmQudHJhY2tCeUlkLCB0cmFja0J5SWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBvbmUge0BsaW5rIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkX30gZnJvbSB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaXMgZW1wdHkuXG4gICAgICovXG4gICAgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgIC8vIFRPRE8odmljYik6XG4gICAgICAgIC8vIGFzc2VydCgoKSB7XG4gICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuXG4gICAgICAgIC8vICBmb3IgKEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBjdXJzb3IgPSBfaGVhZDsgY3Vyc29yICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5fbmV4dER1cCkge1xuICAgICAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vICB9XG4gICAgICAgIC8vICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vfSk7XG4gICAgICAgIHZhciBwcmV2ID0gcmVjb3JkLl9wcmV2RHVwO1xuICAgICAgICB2YXIgbmV4dCA9IHJlY29yZC5fbmV4dER1cDtcbiAgICAgICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldi5fbmV4dER1cCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmV4dC5fcHJldkR1cCA9IHByZXY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQgPT09IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0O1xufSgpKTtcbnZhciBfRHVwbGljYXRlTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIF9EdXBsaWNhdGVNYXAoKSB7XG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBfRHVwbGljYXRlTWFwLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XG4gICAgICAgIHZhciBrZXkgPSByZWNvcmQudHJhY2tCeUlkO1xuICAgICAgICB2YXIgZHVwbGljYXRlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWR1cGxpY2F0ZXMpIHtcbiAgICAgICAgICAgIGR1cGxpY2F0ZXMgPSBuZXcgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0KCk7XG4gICAgICAgICAgICB0aGlzLm1hcC5zZXQoa2V5LCBkdXBsaWNhdGVzKTtcbiAgICAgICAgfVxuICAgICAgICBkdXBsaWNhdGVzLmFkZChyZWNvcmQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgdGhlIGB2YWx1ZWAgdXNpbmcga2V5LiBCZWNhdXNlIHRoZSBJdGVyYWJsZUNoYW5nZVJlY29yZF8gdmFsdWUgbWF5IGJlIG9uZSB3aGljaCB3ZVxuICAgICAqIGhhdmUgYWxyZWFkeSBpdGVyYXRlZCBvdmVyLCB3ZSB1c2UgdGhlIGBhdE9yQWZ0ZXJJbmRleGAgdG8gcHJldGVuZCBpdCBpcyBub3QgdGhlcmUuXG4gICAgICpcbiAgICAgKiBVc2UgY2FzZTogYFthLCBiLCBjLCBhLCBhXWAgaWYgd2UgYXJlIGF0IGluZGV4IGAzYCB3aGljaCBpcyB0aGUgc2Vjb25kIGBhYCB0aGVuIGFza2luZyBpZiB3ZVxuICAgICAqIGhhdmUgYW55IG1vcmUgYGFgcyBuZWVkcyB0byByZXR1cm4gdGhlIHNlY29uZCBgYWAuXG4gICAgICovXG4gICAgX0R1cGxpY2F0ZU1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRyYWNrQnlJZDtcbiAgICAgICAgdmFyIHJlY29yZExpc3QgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHJlY29yZExpc3QgPyByZWNvcmRMaXN0LmdldCh0cmFja0J5SWQsIGF0T3JBZnRlckluZGV4KSA6IG51bGw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEge0BsaW5rIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkX30gZnJvbSB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLlxuICAgICAqXG4gICAgICogVGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBhbHNvIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGlmIGl0IGdldHMgZW1wdHkuXG4gICAgICovXG4gICAgX0R1cGxpY2F0ZU1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICB2YXIga2V5ID0gcmVjb3JkLnRyYWNrQnlJZDtcbiAgICAgICAgdmFyIHJlY29yZExpc3QgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgd2hlbiBpdCBnZXRzIGVtcHR5XG4gICAgICAgIGlmIChyZWNvcmRMaXN0LnJlbW92ZShyZWNvcmQpKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF9EdXBsaWNhdGVNYXAucHJvdG90eXBlLCBcImlzRW1wdHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubWFwLnNpemUgPT09IDA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIF9EdXBsaWNhdGVNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLm1hcC5jbGVhcigpOyB9O1xuICAgIHJldHVybiBfRHVwbGljYXRlTWFwO1xufSgpKTtcbmZ1bmN0aW9uIGdldFByZXZpb3VzSW5kZXgoaXRlbSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykge1xuICAgIHZhciBwcmV2aW91c0luZGV4ID0gaXRlbS5wcmV2aW91c0luZGV4O1xuICAgIGlmIChwcmV2aW91c0luZGV4ID09PSBudWxsKVxuICAgICAgICByZXR1cm4gcHJldmlvdXNJbmRleDtcbiAgICB2YXIgbW92ZU9mZnNldCA9IDA7XG4gICAgaWYgKG1vdmVPZmZzZXRzICYmIHByZXZpb3VzSW5kZXggPCBtb3ZlT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgbW92ZU9mZnNldCA9IG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gcHJldmlvdXNJbmRleCArIGFkZFJlbW92ZU9mZnNldCArIG1vdmVPZmZzZXQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKSB7XG4gICAgfVxuICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3Qob2JqKTsgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyKCk7IH07XG4gICAgcmV0dXJuIERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3Rvcnk7XG59KCkpO1xudmFyIERlZmF1bHRLZXlWYWx1ZURpZmZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWZhdWx0S2V5VmFsdWVEaWZmZXIoKSB7XG4gICAgICAgIHRoaXMuX3JlY29yZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX21hcEhlYWQgPSBudWxsO1xuICAgICAgICAvLyBfYXBwZW5kQWZ0ZXIgaXMgdXNlZCBpbiB0aGUgY2hlY2sgbG9vcFxuICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzTWFwSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY2hhbmdlc1RhaWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLCBcImlzRGlydHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2NoYW5nZXNIZWFkICE9PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkICE9PSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hJdGVtID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHZhciByZWNvcmQ7XG4gICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgICAgICAgIGZuKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuZm9yRWFjaFByZXZpb3VzSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB2YXIgcmVjb3JkO1xuICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzTWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgICAgICAgZm4ocmVjb3JkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5mb3JFYWNoQ2hhbmdlZEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJlY29yZDtcbiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7XG4gICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hBZGRlZEl0ZW0gPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIHJlY29yZDtcbiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmZvckVhY2hSZW1vdmVkSXRlbSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB2YXIgcmVjb3JkO1xuICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICAgICAgICBmbihyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiAobWFwKSB7XG4gICAgICAgIGlmICghbWFwKSB7XG4gICAgICAgICAgICBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdChtYXApKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJ1wiICsgc3RyaW5naWZ5KG1hcCkgKyBcIicuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jaGVjayhtYXApID8gdGhpcyA6IG51bGw7XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFwIHZzIHRoZSBwcmV2aW91cy5cbiAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIG9wdGltaXNlZCBmb3Igd2hlbiB0aGUga2V5cyBkbyBubyBjaGFuZ2UuXG4gICAgICovXG4gICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uIChtYXApIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgICAgdmFyIGluc2VydEJlZm9yZSA9IHRoaXMuX21hcEhlYWQ7XG4gICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZm9yRWFjaChtYXAsIGZ1bmN0aW9uICh2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICYmIGluc2VydEJlZm9yZS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhpbnNlcnRCZWZvcmUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fYXBwZW5kQWZ0ZXIgPSBpbnNlcnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlLl9uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlY29yZCA9IF90aGlzLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleShrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSBfdGhpcy5faW5zZXJ0QmVmb3JlT3JBcHBlbmQoaW5zZXJ0QmVmb3JlLCByZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXRlbXMgcmVtYWluaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgaGF2ZSBiZWVuIGRlbGV0ZWRcbiAgICAgICAgaWYgKGluc2VydEJlZm9yZSkge1xuICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5fcHJldikge1xuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5fcHJldi5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSBpbnNlcnRCZWZvcmU7XG4gICAgICAgICAgICBmb3IgKHZhciByZWNvcmQgPSBpbnNlcnRCZWZvcmU7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IHRoaXMuX21hcEhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwSGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZHMuZGVsZXRlKHJlY29yZC5rZXkpO1xuICAgICAgICAgICAgICAgIHJlY29yZC5fbmV4dFJlbW92ZWQgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIHJlY29yZC5jdXJyZW50VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldiA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgdGFpbHMgaGF2ZSBubyBuZXh0IHJlY29yZHMgZnJvbSBwcmV2aW91cyBydW5zXG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VzVGFpbClcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsKVxuICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSByZWNvcmQgYmVmb3JlIGBiZWZvcmVgIG9yIGFwcGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHdoZW4gYGJlZm9yZWAgaXMgbnVsbC5cbiAgICAgKlxuICAgICAqIE5vdGVzOlxuICAgICAqIC0gVGhpcyBtZXRob2QgYXBwZW5kcyBhdCBgdGhpcy5fYXBwZW5kQWZ0ZXJgLFxuICAgICAqIC0gVGhpcyBtZXRob2QgdXBkYXRlcyBgdGhpcy5fYXBwZW5kQWZ0ZXJgLFxuICAgICAqIC0gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50ZXIuXG4gICAgICovXG4gICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5faW5zZXJ0QmVmb3JlT3JBcHBlbmQgPSBmdW5jdGlvbiAoYmVmb3JlLCByZWNvcmQpIHtcbiAgICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICAgICAgdmFyIHByZXYgPSBiZWZvcmUuX3ByZXY7XG4gICAgICAgICAgICByZWNvcmQuX25leHQgPSBiZWZvcmU7XG4gICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBwcmV2O1xuICAgICAgICAgICAgYmVmb3JlLl9wcmV2ID0gcmVjb3JkO1xuICAgICAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0ID0gcmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJlZm9yZSA9PT0gdGhpcy5fbWFwSGVhZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSByZWNvcmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IGJlZm9yZTtcbiAgICAgICAgICAgIHJldHVybiBiZWZvcmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2FwcGVuZEFmdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9hcHBlbmRBZnRlci5fbmV4dCA9IHJlY29yZDtcbiAgICAgICAgICAgIHJlY29yZC5fcHJldiA9IHRoaXMuX2FwcGVuZEFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFwSGVhZCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IHJlY29yZDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZWNvcmRzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB2YXIgcmVjb3JkXzEgPSB0aGlzLl9yZWNvcmRzLmdldChrZXkpO1xuICAgICAgICAgICAgdGhpcy5fbWF5YmVBZGRUb0NoYW5nZXMocmVjb3JkXzEsIHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBwcmV2ID0gcmVjb3JkXzEuX3ByZXY7XG4gICAgICAgICAgICB2YXIgbmV4dCA9IHJlY29yZF8xLl9uZXh0O1xuICAgICAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgICAgbmV4dC5fcHJldiA9IHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmRfMS5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgICByZWNvcmRfMS5fcHJldiA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkXzE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlY29yZCA9IG5ldyBLZXlWYWx1ZUNoYW5nZVJlY29yZF8oa2V5KTtcbiAgICAgICAgdGhpcy5fcmVjb3Jkcy5zZXQoa2V5LCByZWNvcmQpO1xuICAgICAgICByZWNvcmQuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2FkZFRvQWRkaXRpb25zKHJlY29yZCk7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5fcmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgIHZhciByZWNvcmQgPSB2b2lkIDA7XG4gICAgICAgICAgICAvLyBsZXQgYF9wcmV2aW91c01hcEhlYWRgIGNvbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSBtYXAgYmVmb3JlIHRoZSBjaGFuZ2VzXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c01hcEhlYWQgPSB0aGlzLl9tYXBIZWFkO1xuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVcGRhdGUgYHJlY29yZC5wcmV2aW91c1ZhbHVlYCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBiZWZvcmUgdGhlIGNoYW5nZXNcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIGFsbCBjaGFuZ2VkIGl0ZW1zICh0aGF0J3MgdGhvc2Ugd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIGFuZCBjaGFuZ2VkKVxuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IHRoaXMuX2NoYW5nZXNUYWlsID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIEFkZCB0aGUgcmVjb3JkIG9yIGEgZ2l2ZW4ga2V5IHRvIHRoZSBsaXN0IG9mIGNoYW5nZXMgb25seSB3aGVuIHRoZSB2YWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZFxuICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuX21heWJlQWRkVG9DaGFuZ2VzID0gZnVuY3Rpb24gKHJlY29yZCwgbmV3VmFsdWUpIHtcbiAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChuZXdWYWx1ZSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIHJlY29yZC5jdXJyZW50VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvQ2hhbmdlcyhyZWNvcmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWZhdWx0S2V5VmFsdWVEaWZmZXIucHJvdG90eXBlLl9hZGRUb0FkZGl0aW9ucyA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkZGl0aW9uc0hlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gcmVjb3JkO1xuICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdEtleVZhbHVlRGlmZmVyLnByb3RvdHlwZS5fYWRkVG9DaGFuZ2VzID0gZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlc0hlYWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gdGhpcy5fY2hhbmdlc1RhaWwgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQgPSByZWNvcmQ7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRLZXlWYWx1ZURpZmZlci5wcm90b3R5cGUuX2ZvckVhY2ggPSBmdW5jdGlvbiAob2JqLCBmbikge1xuICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBvYmouZm9yRWFjaChmbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGspIHsgcmV0dXJuIGZuKG9ialtrXSwgayk7IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRGVmYXVsdEtleVZhbHVlRGlmZmVyO1xufSgpKTtcbnZhciBLZXlWYWx1ZUNoYW5nZVJlY29yZF8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2V5VmFsdWVDaGFuZ2VSZWNvcmRfKGtleSkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBudWxsO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX25leHRQcmV2aW91cyA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9uZXh0UmVtb3ZlZCA9IG51bGw7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fbmV4dENoYW5nZWQgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gS2V5VmFsdWVDaGFuZ2VSZWNvcmRfO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IGl0ZXJhYmxlIGRpZmZpbmcgc3RyYXRlZ2llcyB1c2VkIGJ5IE5nRm9yLCBOZ0NsYXNzLCBhbmQgb3RoZXJzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEl0ZXJhYmxlRGlmZmVycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJdGVyYWJsZURpZmZlcnMoZmFjdG9yaWVzKSB7XG4gICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzO1xuICAgIH1cbiAgICBJdGVyYWJsZURpZmZlcnMuY3JlYXRlID0gZnVuY3Rpb24gKGZhY3RvcmllcywgcGFyZW50KSB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTtcbiAgICAgICAgICAgIGZhY3RvcmllcyA9IGZhY3Rvcmllcy5jb25jYXQoY29waWVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGFrZXMgYW4gYXJyYXkgb2Yge0BsaW5rIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGVcbiAgICAgKiBpbmhlcml0ZWQge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXdcbiAgICAgKiB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGxpc3Qgb2YgZmFjdG9yaWVzLFxuICAgICAqIHdoaWNoIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHRoZSBpbmplY3RvciBmb3IgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtAbGluayBJdGVyYWJsZURpZmZlcn0gYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogQENvbXBvbmVudCh7XG4gICAgICogICB2aWV3UHJvdmlkZXJzOiBbXG4gICAgICogICAgIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVMaXN0RGlmZmVyKCldKVxuICAgICAqICAgXVxuICAgICAqIH0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgSXRlcmFibGVEaWZmZXJzLmV4dGVuZCA9IGZ1bmN0aW9uIChmYWN0b3JpZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEl0ZXJhYmxlRGlmZmVycyxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUeXBpY2FsbHkgd291bGQgb2NjdXIgd2hlbiBjYWxsaW5nIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQgaW5zaWRlIG9mIGRlcGVuZGVuY2llcyBwYXNzZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXh0ZW5kIEl0ZXJhYmxlRGlmZmVycyB3aXRob3V0IGEgcGFyZW50IGluamVjdG9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgICAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGYoKSwgbmV3IE9wdGlvbmFsKCldXVxuICAgICAgICB9O1xuICAgIH07XG4gICAgSXRlcmFibGVEaWZmZXJzLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gICAgICAgIHZhciBmYWN0b3J5ID0gdGhpcy5mYWN0b3JpZXMuZmluZChmdW5jdGlvbiAoZikgeyByZXR1cm4gZi5zdXBwb3J0cyhpdGVyYWJsZSk7IH0pO1xuICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICdcIiArIGl0ZXJhYmxlICsgXCInIG9mIHR5cGUgJ1wiICsgZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcoaXRlcmFibGUpICsgXCInXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBJdGVyYWJsZURpZmZlcnMubmdJbmplY3RhYmxlRGVmID0gybXJtWRlZmluZUluamVjdGFibGUoe1xuICAgICAgICBwcm92aWRlZEluOiAncm9vdCcsXG4gICAgICAgIGZhY3Rvcnk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYWJsZURpZmZlcnMoW25ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCldKTsgfVxuICAgIH0pO1xuICAgIHJldHVybiBJdGVyYWJsZURpZmZlcnM7XG59KCkpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcodHlwZSkge1xuICAgIHJldHVybiB0eXBlWyduYW1lJ10gfHwgdHlwZW9mIHR5cGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSByZXBvc2l0b3J5IG9mIGRpZmZlcmVudCBNYXAgZGlmZmluZyBzdHJhdGVnaWVzIHVzZWQgYnkgTmdDbGFzcywgTmdTdHlsZSwgYW5kIG90aGVycy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBLZXlWYWx1ZURpZmZlcnMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2V5VmFsdWVEaWZmZXJzKGZhY3Rvcmllcykge1xuICAgICAgICB0aGlzLmZhY3RvcmllcyA9IGZhY3RvcmllcztcbiAgICB9XG4gICAgS2V5VmFsdWVEaWZmZXJzLmNyZWF0ZSA9IGZ1bmN0aW9uIChmYWN0b3JpZXMsIHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgY29waWVkID0gcGFyZW50LmZhY3Rvcmllcy5zbGljZSgpO1xuICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgS2V5VmFsdWVEaWZmZXJzKGZhY3Rvcmllcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7QGxpbmsgS2V5VmFsdWVEaWZmZXJGYWN0b3J5fSBhbmQgcmV0dXJucyBhIHByb3ZpZGVyIHVzZWQgdG8gZXh0ZW5kIHRoZVxuICAgICAqIGluaGVyaXRlZCB7QGxpbmsgS2V5VmFsdWVEaWZmZXJzfSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmYWN0b3JpZXMgYW5kIHJldHVybiBhIG5ld1xuICAgICAqIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsXG4gICAgICogd2hpY2ggd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIGluamVjdG9yIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge0BsaW5rIEtleVZhbHVlRGlmZmVyfSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBAQ29tcG9uZW50KHtcbiAgICAgKiAgIHZpZXdQcm92aWRlcnM6IFtcbiAgICAgKiAgICAgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZChbbmV3IEltbXV0YWJsZU1hcERpZmZlcigpXSlcbiAgICAgKiAgIF1cbiAgICAgKiB9KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEtleVZhbHVlRGlmZmVycy5leHRlbmQgPSBmdW5jdGlvbiAoZmFjdG9yaWVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGJvb3RzdHJhcCgpLCB3aGljaCB3b3VsZCBvdmVycmlkZSBkZWZhdWx0IHBpcGVzIGluc3RlYWQgb2YgZXh0ZW5kaW5nIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4dGVuZCBLZXlWYWx1ZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gS2V5VmFsdWVEaWZmZXJzLmNyZWF0ZShmYWN0b3JpZXMsIHBhcmVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gRGVwZW5kZW5jeSB0ZWNobmljYWxseSBpc24ndCBvcHRpb25hbCwgYnV0IHdlIGNhbiBwcm92aWRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhpcyB3YXkuXG4gICAgICAgICAgICBkZXBzOiBbW0tleVZhbHVlRGlmZmVycywgbmV3IFNraXBTZWxmKCksIG5ldyBPcHRpb25hbCgpXV1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEtleVZhbHVlRGlmZmVycy5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChrdikge1xuICAgICAgICB2YXIgZmFjdG9yeSA9IHRoaXMuZmFjdG9yaWVzLmZpbmQoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGYuc3VwcG9ydHMoa3YpOyB9KTtcbiAgICAgICAgaWYgKGZhY3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICdcIiArIGt2ICsgXCInXCIpO1xuICAgIH07XG4gICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgS2V5VmFsdWVEaWZmZXJzLm5nSW5qZWN0YWJsZURlZiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHtcbiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgS2V5VmFsdWVEaWZmZXJzKFtuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSgpXSk7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gS2V5VmFsdWVEaWZmZXJzO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBBbmd1bGFyIFZpZXdzLCBwcm92aWRlcyBjaGFuZ2UgZGV0ZWN0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gKiBBIGNoYW5nZS1kZXRlY3Rpb24gdHJlZSBjb2xsZWN0cyBhbGwgdmlld3MgdGhhdCBhcmUgdG8gYmUgY2hlY2tlZCBmb3IgY2hhbmdlcy5cbiAqIFVzZSB0aGUgbWV0aG9kcyB0byBhZGQgYW5kIHJlbW92ZSB2aWV3cyBmcm9tIHRoZSB0cmVlLCBpbml0aWF0ZSBjaGFuZ2UtZGV0ZWN0aW9uLFxuICogYW5kIGV4cGxpY2l0bHkgbWFyayB2aWV3cyBhcyBfZGlydHlfLCBtZWFuaW5nIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYW5kIG5lZWQgdG8gYmUgcmVyZW5kZXJlZC5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRvIG1vZGlmeSBkZWZhdWx0IGNoYW5nZS1kZXRlY3Rpb24gYmVoYXZpb3JcbiAqIHRvIHBlcmZvcm0gZXhwbGljaXQgZGV0ZWN0aW9uIHdoZW4gbmVlZGVkLlxuICpcbiAqICMjIyBVc2UgYG1hcmtGb3JDaGVjaygpYCB3aXRoIGBDaGVja09uY2VgIHN0cmF0ZWd5XG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgdGhlIGBPblB1c2hgIGNoYW5nZS1kZXRlY3Rpb24gc3RyYXRlZ3kgZm9yIGEgY29tcG9uZW50XG4gKiAoYENoZWNrT25jZWAsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGBDaGVja0Fsd2F5c2ApLCB0aGVuIGZvcmNlcyBhIHNlY29uZCBjaGVja1xuICogYWZ0ZXIgYW4gaW50ZXJ2YWwuIFNlZSBbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HQzUxMmI/cD1wcmV2aWV3KS5cbiAqXG4gKiA8Y29kZS1leGFtcGxlIHBhdGg9XCJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50c1wiXG4gKiByZWdpb249XCJtYXJrLWZvci1jaGVja1wiPjwvY29kZS1leGFtcGxlPlxuICpcbiAqICMjIyBEZXRhY2ggY2hhbmdlIGRldGVjdG9yIHRvIGxpbWl0IGhvdyBvZnRlbiBjaGVjayBvY2N1cnNcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkLW9ubHkgZGF0YVxuICogdGhhdCBpcyBleHBlY3RlZCB0byBjaGFuZ2UgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLlxuICogVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgd2Ugd2FudCB0byBjaGVjayBhbmQgdXBkYXRlIHRoZSBsaXN0XG4gKiBsZXNzIG9mdGVuIHRoYW4gdGhlIGNoYW5nZXMgYWN0dWFsbHkgb2NjdXIuIFRvIGRvIHRoYXQsIHdlIGRldGFjaFxuICogdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciBhbmQgcGVyZm9ybSBhbiBleHBsaWNpdCBsb2NhbCBjaGVjayBldmVyeSBmaXZlIHNlY29uZHMuXG4gKlxuICogPGNvZGUtZXhhbXBsZSBwYXRoPVwiY29yZS90cy9jaGFuZ2VfZGV0ZWN0L2NoYW5nZS1kZXRlY3Rpb24udHNcIiByZWdpb249XCJkZXRhY2hcIj48L2NvZGUtZXhhbXBsZT5cbiAqXG4gKlxuICogIyMjIFJlYXR0YWNoaW5nIGEgZGV0YWNoZWQgY29tcG9uZW50XG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBjb21wb25lbnQgZGlzcGxheWluZyBsaXZlIGRhdGEuXG4gKiBUaGUgY29tcG9uZW50IGRldGFjaGVzIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZVxuICogd2hlbiB0aGUgYGxpdmVgIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSwgYW5kIHJlYXR0YWNoZXMgaXQgd2hlbiB0aGUgcHJvcGVydHlcbiAqIGJlY29tZXMgdHJ1ZS5cbiAqXG4gKiA8Y29kZS1leGFtcGxlIHBhdGg9XCJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50c1wiIHJlZ2lvbj1cInJlYXR0YWNoXCI+PC9jb2RlLWV4YW1wbGU+XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ2hhbmdlRGV0ZWN0b3JSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2hhbmdlRGV0ZWN0b3JSZWYoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYuX19OR19FTEVNRU5UX0lEX18gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZKCk7IH07XG4gICAgcmV0dXJuIENoYW5nZURldGVjdG9yUmVmO1xufSgpKTtcbnZhciBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RDaGFuZ2VEZXRlY3RvclJlZjtcbnZhciBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZX19QUkVfUjNfXyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG59O1xudmFyIFNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZX19QUkVfUjNfXztcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBPYmplY3RgcyBhbmQgYE1hcGBzLlxuICovXG52YXIga2V5VmFsRGlmZiA9IFtuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSgpXTtcbi8qKlxuICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgSXRlcmFibGVgIHR5cGVzIHN1Y2ggYXMgYEFycmF5YHMuXG4gKi9cbnZhciBpdGVyYWJsZURpZmYgPSBbbmV3IERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkoKV07XG52YXIgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyA9IG5ldyBJdGVyYWJsZURpZmZlcnMoaXRlcmFibGVEaWZmKTtcbnZhciBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzID0gbmV3IEtleVZhbHVlRGlmZmVycyhrZXlWYWxEaWZmKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGVtYmVkZGVkIHRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZW1iZWRkZWQgdmlld3MuXG4gKiBUbyBpbnN0YW50aWF0ZSBlbWJlZGRlZCB2aWV3cyBiYXNlZCBvbiBhIHRlbXBsYXRlLCB1c2UgdGhlIGBWaWV3Q29udGFpbmVyUmVmYFxuICogbWV0aG9kIGBjcmVhdGVFbWJlZGRlZFZpZXcoKWAuXG4gKlxuICogQWNjZXNzIGEgYFRlbXBsYXRlUmVmYCBpbnN0YW5jZSBieSBwbGFjaW5nIGEgZGlyZWN0aXZlIG9uIGFuIGA8bmctdGVtcGxhdGU+YFxuICogZWxlbWVudCAob3IgZGlyZWN0aXZlIHByZWZpeGVkIHdpdGggYCpgKS4gVGhlIGBUZW1wbGF0ZVJlZmAgZm9yIHRoZSBlbWJlZGRlZCB2aWV3XG4gKiBpcyBpbmplY3RlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGlyZWN0aXZlLFxuICogdXNpbmcgdGhlIGBUZW1wbGF0ZVJlZmAgdG9rZW4uXG4gKlxuICogWW91IGNhbiBhbHNvIHVzZSBhIGBRdWVyeWAgdG8gZmluZCBhIGBUZW1wbGF0ZVJlZmAgYXNzb2NpYXRlZCB3aXRoXG4gKiBhIGNvbXBvbmVudCBvciBhIGRpcmVjdGl2ZS5cbiAqXG4gKiBAc2VlIGBWaWV3Q29udGFpbmVyUmVmYFxuICogQHNlZSBbTmF2aWdhdGUgdGhlIENvbXBvbmVudCBUcmVlIHdpdGggREldKGd1aWRlL2RlcGVuZGVuY3ktaW5qZWN0aW9uLW5hdnRyZWUpXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVGVtcGxhdGVSZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGVtcGxhdGVSZWYoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBub2NvbGxhcHNlXG4gICAgICovXG4gICAgVGVtcGxhdGVSZWYuX19OR19FTEVNRU5UX0lEX18gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkoVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYpOyB9O1xuICAgIHJldHVybiBUZW1wbGF0ZVJlZjtcbn0oKSk7XG52YXIgU1dJVENIX1RFTVBMQVRFX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RUZW1wbGF0ZVJlZjtcbnZhciBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BSRV9SM19fID0gbm9vcDtcbnZhciBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb250YWluZXIgd2hlcmUgb25lIG9yIG1vcmUgdmlld3MgY2FuIGJlIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LlxuICpcbiAqIENhbiBjb250YWluICpob3N0IHZpZXdzKiAoY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGFcbiAqIGNvbXBvbmVudCB3aXRoIHRoZSBgY3JlYXRlQ29tcG9uZW50KClgIG1ldGhvZCksIGFuZCAqZW1iZWRkZWQgdmlld3MqXG4gKiAoY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGEgYFRlbXBsYXRlUmVmYCB3aXRoIHRoZSBgY3JlYXRlRW1iZWRkZWRWaWV3KClgIG1ldGhvZCkuXG4gKlxuICogQSB2aWV3IGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gY29udGFpbiBvdGhlciB2aWV3IGNvbnRhaW5lcnMsXG4gKiBjcmVhdGluZyBhIFt2aWV3IGhpZXJhcmNoeV0oZ3VpZGUvZ2xvc3Nhcnkjdmlldy10cmVlKS5cbiAqXG4gKiBAc2VlIGBDb21wb25lbnRSZWZgXG4gKiBAc2VlIGBFbWJlZGRlZFZpZXdSZWZgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVmlld0NvbnRhaW5lclJlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWaWV3Q29udGFpbmVyUmVmKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKiBAbm9jb2xsYXBzZVxuICAgICAqL1xuICAgIFZpZXdDb250YWluZXJSZWYuX19OR19FTEVNRU5UX0lEX18gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUlkoVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZik7IH07XG4gICAgcmV0dXJuIFZpZXdDb250YWluZXJSZWY7XG59KCkpO1xudmFyIFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0Vmlld0NvbnRhaW5lclJlZjtcbnZhciBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUllfX1BSRV9SM19fID0gbm9vcDtcbnZhciBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUllfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBleHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yKGNvbnRleHQsIG9sZFZhbHVlLCBjdXJyVmFsdWUsIGlzRmlyc3RDaGVjaykge1xuICAgIHZhciBtc2cgPSBcIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6IEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIFByZXZpb3VzIHZhbHVlOiAnXCIgKyBvbGRWYWx1ZSArIFwiJy4gQ3VycmVudCB2YWx1ZTogJ1wiICsgY3VyclZhbHVlICsgXCInLlwiO1xuICAgIGlmIChpc0ZpcnN0Q2hlY2spIHtcbiAgICAgICAgbXNnICs9XG4gICAgICAgICAgICBcIiBJdCBzZWVtcyBsaWtlIHRoZSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgaXRzIHBhcmVudCBhbmQgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXJ0eSBjaGVja2VkLlwiICtcbiAgICAgICAgICAgICAgICBcIiBIYXMgaXQgYmVlbiBjcmVhdGVkIGluIGEgY2hhbmdlIGRldGVjdGlvbiBob29rID9cIjtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdEZWJ1Z0Vycm9yKG1zZywgY29udGV4dCk7XG59XG5mdW5jdGlvbiB2aWV3V3JhcHBlZERlYnVnRXJyb3IoZXJyLCBjb250ZXh0KSB7XG4gICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgIC8vIGVycm9ycyB0aGF0IGFyZSBub3QgRXJyb3IgaW5zdGFuY2VzIGRvbid0IGhhdmUgYSBzdGFjayxcbiAgICAgICAgLy8gc28gaXQgaXMgb2sgdG8gd3JhcCB0aGVtIGludG8gYSBuZXcgRXJyb3Igb2JqZWN0Li4uXG4gICAgICAgIGVyciA9IG5ldyBFcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIF9hZGREZWJ1Z0NvbnRleHQoZXJyLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZXJyO1xufVxuZnVuY3Rpb24gdmlld0RlYnVnRXJyb3IobXNnLCBjb250ZXh0KSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpO1xuICAgIF9hZGREZWJ1Z0NvbnRleHQoZXJyLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZXJyO1xufVxuZnVuY3Rpb24gX2FkZERlYnVnQ29udGV4dChlcnIsIGNvbnRleHQpIHtcbiAgICBlcnJbRVJST1JfREVCVUdfQ09OVEVYVF0gPSBjb250ZXh0O1xuICAgIGVycltFUlJPUl9MT0dHRVJdID0gY29udGV4dC5sb2dFcnJvci5iaW5kKGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNWaWV3RGVidWdFcnJvcihlcnIpIHtcbiAgICByZXR1cm4gISFnZXREZWJ1Z0NvbnRleHQoZXJyKTtcbn1cbmZ1bmN0aW9uIHZpZXdEZXN0cm95ZWRFcnJvcihhY3Rpb24pIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFwiVmlld0Rlc3Ryb3llZEVycm9yOiBBdHRlbXB0IHRvIHVzZSBhIGRlc3Ryb3llZCB2aWV3OiBcIiArIGFjdGlvbik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIENhbGxlZCBiZWZvcmUgZWFjaCBjeWNsZSBvZiBhIHZpZXcncyBjaGVjayB0byBkZXRlY3Qgd2hldGhlciB0aGlzIGlzIGluIHRoZVxuLy8gaW5pdFN0YXRlIGZvciB3aGljaCB3ZSBuZWVkIHRvIGNhbGwgbmdPbkluaXQsIG5nQWZ0ZXJDb250ZW50SW5pdCBvciBuZ0FmdGVyVmlld0luaXRcbi8vIGxpZmVjeWNsZSBtZXRob2RzLiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjaGVjayBjeWNsZSBzaG91bGQgY2FsbCBsaWZlY3ljbGVcbi8vIG1ldGhvZHMuXG5mdW5jdGlvbiBzaGlmdEluaXRTdGF0ZSh2aWV3LCBwcmlvckluaXRTdGF0ZSwgbmV3SW5pdFN0YXRlKSB7XG4gICAgLy8gT25seSB1cGRhdGUgdGhlIEluaXRTdGF0ZSBpZiB3ZSBhcmUgY3VycmVudGx5IGluIHRoZSBwcmlvciBzdGF0ZS5cbiAgICAvLyBGb3IgZXhhbXBsZSwgb25seSBtb3ZlIGludG8gQ2FsbGluZ0luaXQgaWYgd2UgYXJlIGluIEJlZm9yZUluaXQuIE9ubHlcbiAgICAvLyBtb3ZlIGludG8gQ2FsbGluZ0NvbnRlbnRJbml0IGlmIHdlIGFyZSBpbiBDYWxsaW5nSW5pdC4gTm9ybWFsbHkgdGhpcyB3aWxsXG4gICAgLy8gYWx3YXlzIGJlIHRydWUgYmVjYXVzZSBvZiBob3cgY2hlY2tDeWNsZSBpcyBjYWxsZWQgaW4gY2hlY2tBbmRVcGRhdGVWaWV3LlxuICAgIC8vIEhvd2V2ZXIsIGlmIGNoZWNrQW5kVXBkYXRlVmlldyBpcyBjYWxsZWQgcmVjdXJzaXZlbHkgb3IgaWYgYW4gZXhjZXB0aW9uIGlzXG4gICAgLy8gdGhyb3duIHdoaWxlIGNoZWNrQW5kVXBkYXRlVmlldyBpcyBydW5uaW5nLCBjaGVja0FuZFVwZGF0ZVZpZXcgc3RhcnRzIG92ZXJcbiAgICAvLyBmcm9tIHRoZSBiZWdpbm5pbmcuIFRoaXMgZW5zdXJlcyB0aGUgc3RhdGUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLFxuICAgIC8vIHRlcm1pbmF0aW5nIGluIHRoZSBBZnRlckluaXQgc3RhdGUsIHdoaWNoIGVuc3VyZXMgdGhlIEluaXQgbWV0aG9kcyBhcmUgY2FsbGVkXG4gICAgLy8gYXQgbGVhc3Qgb25jZSBhbmQgb25seSBvbmNlLlxuICAgIHZhciBzdGF0ZSA9IHZpZXcuc3RhdGU7XG4gICAgdmFyIGluaXRTdGF0ZSA9IHN0YXRlICYgMTc5MiAvKiBJbml0U3RhdGVfTWFzayAqLztcbiAgICBpZiAoaW5pdFN0YXRlID09PSBwcmlvckluaXRTdGF0ZSkge1xuICAgICAgICB2aWV3LnN0YXRlID0gKHN0YXRlICYgfjE3OTIgLyogSW5pdFN0YXRlX01hc2sgKi8pIHwgbmV3SW5pdFN0YXRlO1xuICAgICAgICB2aWV3LmluaXRJbmRleCA9IC0xO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGluaXRTdGF0ZSA9PT0gbmV3SW5pdFN0YXRlO1xufVxuLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBsaWZlY3ljbGUgaW5pdCBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmb3IgdGhlIG5vZGUgd2l0aFxuLy8gdGhlIGdpdmVuIGluaXQgaW5kZXguXG5mdW5jdGlvbiBzaG91bGRDYWxsTGlmZWN5Y2xlSW5pdEhvb2sodmlldywgaW5pdFN0YXRlLCBpbmRleCkge1xuICAgIGlmICgodmlldy5zdGF0ZSAmIDE3OTIgLyogSW5pdFN0YXRlX01hc2sgKi8pID09PSBpbml0U3RhdGUgJiYgdmlldy5pbml0SW5kZXggPD0gaW5kZXgpIHtcbiAgICAgICAgdmlldy5pbml0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEFjY2Vzc29yIGZvciB2aWV3Lm5vZGVzLCBlbmZvcmNpbmcgdGhhdCBldmVyeSB1c2FnZSBzaXRlIHN0YXlzIG1vbm9tb3JwaGljLlxuICovXG5mdW5jdGlvbiBhc1RleHREYXRhKHZpZXcsIGluZGV4KSB7XG4gICAgcmV0dXJuIHZpZXcubm9kZXNbaW5kZXhdO1xufVxuLyoqXG4gKiBBY2Nlc3NvciBmb3Igdmlldy5ub2RlcywgZW5mb3JjaW5nIHRoYXQgZXZlcnkgdXNhZ2Ugc2l0ZSBzdGF5cyBtb25vbW9ycGhpYy5cbiAqL1xuZnVuY3Rpb24gYXNFbGVtZW50RGF0YSh2aWV3LCBpbmRleCkge1xuICAgIHJldHVybiB2aWV3Lm5vZGVzW2luZGV4XTtcbn1cbi8qKlxuICogQWNjZXNzb3IgZm9yIHZpZXcubm9kZXMsIGVuZm9yY2luZyB0aGF0IGV2ZXJ5IHVzYWdlIHNpdGUgc3RheXMgbW9ub21vcnBoaWMuXG4gKi9cbmZ1bmN0aW9uIGFzUHJvdmlkZXJEYXRhKHZpZXcsIGluZGV4KSB7XG4gICAgcmV0dXJuIHZpZXcubm9kZXNbaW5kZXhdO1xufVxuLyoqXG4gKiBBY2Nlc3NvciBmb3Igdmlldy5ub2RlcywgZW5mb3JjaW5nIHRoYXQgZXZlcnkgdXNhZ2Ugc2l0ZSBzdGF5cyBtb25vbW9ycGhpYy5cbiAqL1xuZnVuY3Rpb24gYXNQdXJlRXhwcmVzc2lvbkRhdGEodmlldywgaW5kZXgpIHtcbiAgICByZXR1cm4gdmlldy5ub2Rlc1tpbmRleF07XG59XG4vKipcbiAqIEFjY2Vzc29yIGZvciB2aWV3Lm5vZGVzLCBlbmZvcmNpbmcgdGhhdCBldmVyeSB1c2FnZSBzaXRlIHN0YXlzIG1vbm9tb3JwaGljLlxuICovXG5mdW5jdGlvbiBhc1F1ZXJ5TGlzdCh2aWV3LCBpbmRleCkge1xuICAgIHJldHVybiB2aWV3Lm5vZGVzW2luZGV4XTtcbn1cbnZhciBEZWJ1Z0NvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVidWdDb250ZXh0KCkge1xuICAgIH1cbiAgICByZXR1cm4gRGVidWdDb250ZXh0O1xufSgpKTtcbi8qKlxuICogVGhpcyBvYmplY3QgaXMgdXNlZCB0byBwcmV2ZW50IGN5Y2xlcyBpbiB0aGUgc291cmNlIGZpbGVzIGFuZCB0byBoYXZlIGEgcGxhY2Ugd2hlcmVcbiAqIGRlYnVnIG1vZGUgY2FuIGhvb2sgaXQuIEl0IGlzIGxhemlseSBmaWxsZWQgd2hlbiBgaXNEZXZNb2RlYCBpcyBrbm93bi5cbiAqL1xudmFyIFNlcnZpY2VzID0ge1xuICAgIHNldEN1cnJlbnROb2RlOiB1bmRlZmluZWQsXG4gICAgY3JlYXRlUm9vdFZpZXc6IHVuZGVmaW5lZCxcbiAgICBjcmVhdGVFbWJlZGRlZFZpZXc6IHVuZGVmaW5lZCxcbiAgICBjcmVhdGVDb21wb25lbnRWaWV3OiB1bmRlZmluZWQsXG4gICAgY3JlYXRlTmdNb2R1bGVSZWY6IHVuZGVmaW5lZCxcbiAgICBvdmVycmlkZVByb3ZpZGVyOiB1bmRlZmluZWQsXG4gICAgb3ZlcnJpZGVDb21wb25lbnRWaWV3OiB1bmRlZmluZWQsXG4gICAgY2xlYXJPdmVycmlkZXM6IHVuZGVmaW5lZCxcbiAgICBjaGVja0FuZFVwZGF0ZVZpZXc6IHVuZGVmaW5lZCxcbiAgICBjaGVja05vQ2hhbmdlc1ZpZXc6IHVuZGVmaW5lZCxcbiAgICBkZXN0cm95VmlldzogdW5kZWZpbmVkLFxuICAgIHJlc29sdmVEZXA6IHVuZGVmaW5lZCxcbiAgICBjcmVhdGVEZWJ1Z0NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICBoYW5kbGVFdmVudDogdW5kZWZpbmVkLFxuICAgIHVwZGF0ZURpcmVjdGl2ZXM6IHVuZGVmaW5lZCxcbiAgICB1cGRhdGVSZW5kZXJlcjogdW5kZWZpbmVkLFxuICAgIGRpcnR5UGFyZW50UXVlcmllczogdW5kZWZpbmVkLFxufTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIE5PT1AgPSBmdW5jdGlvbiAoKSB7IH07XG52YXIgX3Rva2VuS2V5Q2FjaGUgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiB0b2tlbktleSh0b2tlbikge1xuICAgIHZhciBrZXkgPSBfdG9rZW5LZXlDYWNoZS5nZXQodG9rZW4pO1xuICAgIGlmICgha2V5KSB7XG4gICAgICAgIGtleSA9IHN0cmluZ2lmeSh0b2tlbikgKyAnXycgKyBfdG9rZW5LZXlDYWNoZS5zaXplO1xuICAgICAgICBfdG9rZW5LZXlDYWNoZS5zZXQodG9rZW4sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiB1bndyYXBWYWx1ZSh2aWV3LCBub2RlSWR4LCBiaW5kaW5nSWR4LCB2YWx1ZSkge1xuICAgIGlmIChXcmFwcGVkVmFsdWUuaXNXcmFwcGVkKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IFdyYXBwZWRWYWx1ZS51bndyYXAodmFsdWUpO1xuICAgICAgICB2YXIgZ2xvYmFsQmluZGluZ0lkeCA9IHZpZXcuZGVmLm5vZGVzW25vZGVJZHhdLmJpbmRpbmdJbmRleCArIGJpbmRpbmdJZHg7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IFdyYXBwZWRWYWx1ZS51bndyYXAodmlldy5vbGRWYWx1ZXNbZ2xvYmFsQmluZGluZ0lkeF0pO1xuICAgICAgICB2aWV3Lm9sZFZhbHVlc1tnbG9iYWxCaW5kaW5nSWR4XSA9IG5ldyBXcmFwcGVkVmFsdWUob2xkVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG52YXIgVU5ERUZJTkVEX1JFTkRFUkVSX1RZUEVfSUQgPSAnJCR1bmRlZmluZWQnO1xudmFyIEVNUFRZX1JFTkRFUkVSX1RZUEVfSUQgPSAnJCRlbXB0eSc7XG4vLyBBdHRlbnRpb246IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHRvcCBsZXZlbCBmdW5jdGlvbi5cbi8vIFB1dHRpbmcgYW55IGxvZ2ljIGluIGhlcmUgd2lsbCBkZXN0cm95IGNsb3N1cmUgdHJlZSBzaGFraW5nIVxuZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXJUeXBlMih2YWx1ZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogVU5ERUZJTkVEX1JFTkRFUkVSX1RZUEVfSUQsXG4gICAgICAgIHN0eWxlczogdmFsdWVzLnN0eWxlcyxcbiAgICAgICAgZW5jYXBzdWxhdGlvbjogdmFsdWVzLmVuY2Fwc3VsYXRpb24sXG4gICAgICAgIGRhdGE6IHZhbHVlcy5kYXRhXG4gICAgfTtcbn1cbnZhciBfcmVuZGVyQ29tcENvdW50JDEgPSAwO1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlcmVyVHlwZTIodHlwZSkge1xuICAgIGlmICh0eXBlICYmIHR5cGUuaWQgPT09IFVOREVGSU5FRF9SRU5ERVJFUl9UWVBFX0lEKSB7XG4gICAgICAgIC8vIGZpcnN0IHRpbWUgd2Ugc2VlIHRoaXMgUmVuZGVyZXJUeXBlMi4gSW5pdGlhbGl6ZSBpdC4uLlxuICAgICAgICB2YXIgaXNGaWxsZWQgPSAoKHR5cGUuZW5jYXBzdWxhdGlvbiAhPSBudWxsICYmIHR5cGUuZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24uTm9uZSkgfHxcbiAgICAgICAgICAgIHR5cGUuc3R5bGVzLmxlbmd0aCB8fCBPYmplY3Qua2V5cyh0eXBlLmRhdGEpLmxlbmd0aCk7XG4gICAgICAgIGlmIChpc0ZpbGxlZCkge1xuICAgICAgICAgICAgdHlwZS5pZCA9IFwiY1wiICsgX3JlbmRlckNvbXBDb3VudCQxKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0eXBlLmlkID0gRU1QVFlfUkVOREVSRVJfVFlQRV9JRDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZSAmJiB0eXBlLmlkID09PSBFTVBUWV9SRU5ERVJFUl9UWVBFX0lEKSB7XG4gICAgICAgIHR5cGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZSB8fCBudWxsO1xufVxuZnVuY3Rpb24gY2hlY2tCaW5kaW5nKHZpZXcsIGRlZiwgYmluZGluZ0lkeCwgdmFsdWUpIHtcbiAgICB2YXIgb2xkVmFsdWVzID0gdmlldy5vbGRWYWx1ZXM7XG4gICAgaWYgKCh2aWV3LnN0YXRlICYgMiAvKiBGaXJzdENoZWNrICovKSB8fFxuICAgICAgICAhbG9vc2VJZGVudGljYWwob2xkVmFsdWVzW2RlZi5iaW5kaW5nSW5kZXggKyBiaW5kaW5nSWR4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCBiaW5kaW5nSWR4LCB2YWx1ZSkge1xuICAgIGlmIChjaGVja0JpbmRpbmcodmlldywgZGVmLCBiaW5kaW5nSWR4LCB2YWx1ZSkpIHtcbiAgICAgICAgdmlldy5vbGRWYWx1ZXNbZGVmLmJpbmRpbmdJbmRleCArIGJpbmRpbmdJZHhdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0JpbmRpbmdOb0NoYW5nZXModmlldywgZGVmLCBiaW5kaW5nSWR4LCB2YWx1ZSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHZpZXcub2xkVmFsdWVzW2RlZi5iaW5kaW5nSW5kZXggKyBiaW5kaW5nSWR4XTtcbiAgICBpZiAoKHZpZXcuc3RhdGUgJiAxIC8qIEJlZm9yZUZpcnN0Q2hlY2sgKi8pIHx8ICFkZXZNb2RlRXF1YWwob2xkVmFsdWUsIHZhbHVlKSkge1xuICAgICAgICB2YXIgYmluZGluZ05hbWUgPSBkZWYuYmluZGluZ3NbYmluZGluZ0lkeF0ubmFtZTtcbiAgICAgICAgdGhyb3cgZXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcihTZXJ2aWNlcy5jcmVhdGVEZWJ1Z0NvbnRleHQodmlldywgZGVmLm5vZGVJbmRleCksIGJpbmRpbmdOYW1lICsgXCI6IFwiICsgb2xkVmFsdWUsIGJpbmRpbmdOYW1lICsgXCI6IFwiICsgdmFsdWUsICh2aWV3LnN0YXRlICYgMSAvKiBCZWZvcmVGaXJzdENoZWNrICovKSAhPT0gMCk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFya1BhcmVudFZpZXdzRm9yQ2hlY2sodmlldykge1xuICAgIHZhciBjdXJyVmlldyA9IHZpZXc7XG4gICAgd2hpbGUgKGN1cnJWaWV3KSB7XG4gICAgICAgIGlmIChjdXJyVmlldy5kZWYuZmxhZ3MgJiAyIC8qIE9uUHVzaCAqLykge1xuICAgICAgICAgICAgY3VyclZpZXcuc3RhdGUgfD0gOCAvKiBDaGVja3NFbmFibGVkICovO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJWaWV3ID0gY3VyclZpZXcudmlld0NvbnRhaW5lclBhcmVudCB8fCBjdXJyVmlldy5wYXJlbnQ7XG4gICAgfVxufVxuZnVuY3Rpb24gbWFya1BhcmVudFZpZXdzRm9yQ2hlY2tQcm9qZWN0ZWRWaWV3cyh2aWV3LCBlbmRWaWV3KSB7XG4gICAgdmFyIGN1cnJWaWV3ID0gdmlldztcbiAgICB3aGlsZSAoY3VyclZpZXcgJiYgY3VyclZpZXcgIT09IGVuZFZpZXcpIHtcbiAgICAgICAgY3VyclZpZXcuc3RhdGUgfD0gNjQgLyogQ2hlY2tQcm9qZWN0ZWRWaWV3cyAqLztcbiAgICAgICAgY3VyclZpZXcgPSBjdXJyVmlldy52aWV3Q29udGFpbmVyUGFyZW50IHx8IGN1cnJWaWV3LnBhcmVudDtcbiAgICB9XG59XG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KHZpZXcsIG5vZGVJbmRleCwgZXZlbnROYW1lLCBldmVudCkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbbm9kZUluZGV4XTtcbiAgICAgICAgdmFyIHN0YXJ0VmlldyA9IG5vZGVEZWYuZmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovID9cbiAgICAgICAgICAgIGFzRWxlbWVudERhdGEodmlldywgbm9kZUluZGV4KS5jb21wb25lbnRWaWV3IDpcbiAgICAgICAgICAgIHZpZXc7XG4gICAgICAgIG1hcmtQYXJlbnRWaWV3c0ZvckNoZWNrKHN0YXJ0Vmlldyk7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlcy5oYW5kbGVFdmVudCh2aWV3LCBub2RlSW5kZXgsIGV2ZW50TmFtZSwgZXZlbnQpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICAvLyBBdHRlbnRpb246IERvbid0IHJldGhyb3csIGFzIGl0IHdvdWxkIGNhbmNlbCBPYnNlcnZhYmxlIHN1YnNjcmlwdGlvbnMhXG4gICAgICAgIHZpZXcucm9vdC5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gZGVjbGFyZWRWaWV3Q29udGFpbmVyKHZpZXcpIHtcbiAgICBpZiAodmlldy5wYXJlbnQpIHtcbiAgICAgICAgdmFyIHBhcmVudFZpZXcgPSB2aWV3LnBhcmVudDtcbiAgICAgICAgcmV0dXJuIGFzRWxlbWVudERhdGEocGFyZW50Vmlldywgdmlldy5wYXJlbnROb2RlRGVmLm5vZGVJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBmb3IgY29tcG9uZW50IHZpZXdzLCB0aGlzIGlzIHRoZSBob3N0IGVsZW1lbnQuXG4gKiBmb3IgZW1iZWRkZWQgdmlld3MsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgbm9kZVxuICogdGhhdCBjb250YWlucyB0aGUgdmlldyBjb250YWluZXIuXG4gKi9cbmZ1bmN0aW9uIHZpZXdQYXJlbnRFbCh2aWV3KSB7XG4gICAgdmFyIHBhcmVudFZpZXcgPSB2aWV3LnBhcmVudDtcbiAgICBpZiAocGFyZW50Vmlldykge1xuICAgICAgICByZXR1cm4gdmlldy5wYXJlbnROb2RlRGVmLnBhcmVudDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlck5vZGUodmlldywgZGVmKSB7XG4gICAgc3dpdGNoIChkZWYuZmxhZ3MgJiAyMDEzNDcwNjcgLyogVHlwZXMgKi8pIHtcbiAgICAgICAgY2FzZSAxIC8qIFR5cGVFbGVtZW50ICovOlxuICAgICAgICAgICAgcmV0dXJuIGFzRWxlbWVudERhdGEodmlldywgZGVmLm5vZGVJbmRleCkucmVuZGVyRWxlbWVudDtcbiAgICAgICAgY2FzZSAyIC8qIFR5cGVUZXh0ICovOlxuICAgICAgICAgICAgcmV0dXJuIGFzVGV4dERhdGEodmlldywgZGVmLm5vZGVJbmRleCkucmVuZGVyVGV4dDtcbiAgICB9XG59XG5mdW5jdGlvbiBlbGVtZW50RXZlbnRGdWxsTmFtZSh0YXJnZXQsIG5hbWUpIHtcbiAgICByZXR1cm4gdGFyZ2V0ID8gdGFyZ2V0ICsgXCI6XCIgKyBuYW1lIDogbmFtZTtcbn1cbmZ1bmN0aW9uIGlzQ29tcG9uZW50Vmlldyh2aWV3KSB7XG4gICAgcmV0dXJuICEhdmlldy5wYXJlbnQgJiYgISEodmlldy5wYXJlbnROb2RlRGVmLmZsYWdzICYgMzI3NjggLyogQ29tcG9uZW50ICovKTtcbn1cbmZ1bmN0aW9uIGlzRW1iZWRkZWRWaWV3KHZpZXcpIHtcbiAgICByZXR1cm4gISF2aWV3LnBhcmVudCAmJiAhKHZpZXcucGFyZW50Tm9kZURlZi5mbGFncyAmIDMyNzY4IC8qIENvbXBvbmVudCAqLyk7XG59XG5mdW5jdGlvbiBmaWx0ZXJRdWVyeUlkKHF1ZXJ5SWQpIHtcbiAgICByZXR1cm4gMSA8PCAocXVlcnlJZCAlIDMyKTtcbn1cbmZ1bmN0aW9uIHNwbGl0TWF0Y2hlZFF1ZXJpZXNEc2wobWF0Y2hlZFF1ZXJpZXNEc2wpIHtcbiAgICB2YXIgbWF0Y2hlZFF1ZXJpZXMgPSB7fTtcbiAgICB2YXIgbWF0Y2hlZFF1ZXJ5SWRzID0gMDtcbiAgICB2YXIgcmVmZXJlbmNlcyA9IHt9O1xuICAgIGlmIChtYXRjaGVkUXVlcmllc0RzbCkge1xuICAgICAgICBtYXRjaGVkUXVlcmllc0RzbC5mb3JFYWNoKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgcXVlcnlJZCA9IF9iWzBdLCB2YWx1ZVR5cGUgPSBfYlsxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnlJZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBtYXRjaGVkUXVlcmllc1txdWVyeUlkXSA9IHZhbHVlVHlwZTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkUXVlcnlJZHMgfD0gZmlsdGVyUXVlcnlJZChxdWVyeUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXNbcXVlcnlJZF0gPSB2YWx1ZVR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4geyBtYXRjaGVkUXVlcmllczogbWF0Y2hlZFF1ZXJpZXMsIHJlZmVyZW5jZXM6IHJlZmVyZW5jZXMsIG1hdGNoZWRRdWVyeUlkczogbWF0Y2hlZFF1ZXJ5SWRzIH07XG59XG5mdW5jdGlvbiBzcGxpdERlcHNEc2woZGVwcywgc291cmNlTmFtZSkge1xuICAgIHJldHVybiBkZXBzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdG9rZW47XG4gICAgICAgIHZhciBmbGFncztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBfYSA9IF9fcmVhZCh2YWx1ZSwgMiksIGZsYWdzID0gX2FbMF0sIHRva2VuID0gX2FbMV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmbGFncyA9IDAgLyogTm9uZSAqLztcbiAgICAgICAgICAgIHRva2VuID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICYmICh0eXBlb2YgdG9rZW4gPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHRva2VuID09PSAnb2JqZWN0JykgJiYgc291cmNlTmFtZSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRva2VuLCBTT1VSQ0UsIHsgdmFsdWU6IHNvdXJjZU5hbWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmbGFnczogZmxhZ3MsIHRva2VuOiB0b2tlbiwgdG9rZW5LZXk6IHRva2VuS2V5KHRva2VuKSB9O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50UmVuZGVyRWxlbWVudCh2aWV3LCByZW5kZXJIb3N0LCBkZWYpIHtcbiAgICB2YXIgcmVuZGVyUGFyZW50ID0gZGVmLnJlbmRlclBhcmVudDtcbiAgICBpZiAocmVuZGVyUGFyZW50KSB7XG4gICAgICAgIGlmICgocmVuZGVyUGFyZW50LmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLykgPT09IDAgfHxcbiAgICAgICAgICAgIChyZW5kZXJQYXJlbnQuZmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovKSA9PT0gMCB8fFxuICAgICAgICAgICAgKHJlbmRlclBhcmVudC5lbGVtZW50LmNvbXBvbmVudFJlbmRlcmVyVHlwZSAmJlxuICAgICAgICAgICAgICAgIHJlbmRlclBhcmVudC5lbGVtZW50LmNvbXBvbmVudFJlbmRlcmVyVHlwZS5lbmNhcHN1bGF0aW9uID09PVxuICAgICAgICAgICAgICAgICAgICBWaWV3RW5jYXBzdWxhdGlvbi5OYXRpdmUpKSB7XG4gICAgICAgICAgICAvLyBvbmx5IGNoaWxkcmVuIG9mIG5vbiBjb21wb25lbnRzLCBvciBjaGlsZHJlbiBvZiBjb21wb25lbnRzIHdpdGggbmF0aXZlIGVuY2Fwc3VsYXRpb24gc2hvdWxkXG4gICAgICAgICAgICAvLyBiZSBhdHRhY2hlZC5cbiAgICAgICAgICAgIHJldHVybiBhc0VsZW1lbnREYXRhKHZpZXcsIGRlZi5yZW5kZXJQYXJlbnQubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVuZGVySG9zdDtcbiAgICB9XG59XG52YXIgREVGSU5JVElPTl9DQUNIRSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbihmYWN0b3J5KSB7XG4gICAgdmFyIHZhbHVlID0gREVGSU5JVElPTl9DQUNIRS5nZXQoZmFjdG9yeSk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IGZhY3RvcnkoZnVuY3Rpb24gKCkgeyByZXR1cm4gTk9PUDsgfSk7XG4gICAgICAgIHZhbHVlLmZhY3RvcnkgPSBmYWN0b3J5O1xuICAgICAgICBERUZJTklUSU9OX0NBQ0hFLnNldChmYWN0b3J5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHJvb3RSZW5kZXJOb2Rlcyh2aWV3KSB7XG4gICAgdmFyIHJlbmRlck5vZGVzID0gW107XG4gICAgdmlzaXRSb290UmVuZGVyTm9kZXModmlldywgMCAvKiBDb2xsZWN0ICovLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVuZGVyTm9kZXMpO1xuICAgIHJldHVybiByZW5kZXJOb2Rlcztcbn1cbmZ1bmN0aW9uIHZpc2l0Um9vdFJlbmRlck5vZGVzKHZpZXcsIGFjdGlvbiwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCkge1xuICAgIC8vIFdlIG5lZWQgdG8gcmUtY29tcHV0ZSB0aGUgcGFyZW50IG5vZGUgaW4gY2FzZSB0aGUgbm9kZXMgaGF2ZSBiZWVuIG1vdmVkIGFyb3VuZCBtYW51YWxseVxuICAgIGlmIChhY3Rpb24gPT09IDMgLyogUmVtb3ZlQ2hpbGQgKi8pIHtcbiAgICAgICAgcGFyZW50Tm9kZSA9IHZpZXcucmVuZGVyZXIucGFyZW50Tm9kZShyZW5kZXJOb2RlKHZpZXcsIHZpZXcuZGVmLmxhc3RSZW5kZXJSb290Tm9kZSkpO1xuICAgIH1cbiAgICB2aXNpdFNpYmxpbmdSZW5kZXJOb2Rlcyh2aWV3LCBhY3Rpb24sIDAsIHZpZXcuZGVmLm5vZGVzLmxlbmd0aCAtIDEsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gdmlzaXRTaWJsaW5nUmVuZGVyTm9kZXModmlldywgYWN0aW9uLCBzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGVEZWYgPSB2aWV3LmRlZi5ub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGVEZWYuZmxhZ3MgJiAoMSAvKiBUeXBlRWxlbWVudCAqLyB8IDIgLyogVHlwZVRleHQgKi8gfCA4IC8qIFR5cGVOZ0NvbnRlbnQgKi8pKSB7XG4gICAgICAgICAgICB2aXNpdFJlbmRlck5vZGUodmlldywgbm9kZURlZiwgYWN0aW9uLCBwYXJlbnROb2RlLCBuZXh0U2libGluZywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBqdW1wIHRvIG5leHQgc2libGluZ1xuICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICB9XG59XG5mdW5jdGlvbiB2aXNpdFByb2plY3RlZFJlbmRlck5vZGVzKHZpZXcsIG5nQ29udGVudEluZGV4LCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpIHtcbiAgICB2YXIgY29tcFZpZXcgPSB2aWV3O1xuICAgIHdoaWxlIChjb21wVmlldyAmJiAhaXNDb21wb25lbnRWaWV3KGNvbXBWaWV3KSkge1xuICAgICAgICBjb21wVmlldyA9IGNvbXBWaWV3LnBhcmVudDtcbiAgICB9XG4gICAgdmFyIGhvc3RWaWV3ID0gY29tcFZpZXcucGFyZW50O1xuICAgIHZhciBob3N0RWxEZWYgPSB2aWV3UGFyZW50RWwoY29tcFZpZXcpO1xuICAgIHZhciBzdGFydEluZGV4ID0gaG9zdEVsRGVmLm5vZGVJbmRleCArIDE7XG4gICAgdmFyIGVuZEluZGV4ID0gaG9zdEVsRGVmLm5vZGVJbmRleCArIGhvc3RFbERlZi5jaGlsZENvdW50O1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGVEZWYgPSBob3N0Vmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlRGVmLm5nQ29udGVudEluZGV4ID09PSBuZ0NvbnRlbnRJbmRleCkge1xuICAgICAgICAgICAgdmlzaXRSZW5kZXJOb2RlKGhvc3RWaWV3LCBub2RlRGVmLCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGp1bXAgdG8gbmV4dCBzaWJsaW5nXG4gICAgICAgIGkgKz0gbm9kZURlZi5jaGlsZENvdW50O1xuICAgIH1cbiAgICBpZiAoIWhvc3RWaWV3LnBhcmVudCkge1xuICAgICAgICAvLyBhIHJvb3Qgdmlld1xuICAgICAgICB2YXIgcHJvamVjdGVkTm9kZXMgPSB2aWV3LnJvb3QucHJvamVjdGFibGVOb2Rlc1tuZ0NvbnRlbnRJbmRleF07XG4gICAgICAgIGlmIChwcm9qZWN0ZWROb2Rlcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9qZWN0ZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4ZWNSZW5kZXJOb2RlQWN0aW9uKHZpZXcsIHByb2plY3RlZE5vZGVzW2ldLCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gdmlzaXRSZW5kZXJOb2RlKHZpZXcsIG5vZGVEZWYsIGFjdGlvbiwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCkge1xuICAgIGlmIChub2RlRGVmLmZsYWdzICYgOCAvKiBUeXBlTmdDb250ZW50ICovKSB7XG4gICAgICAgIHZpc2l0UHJvamVjdGVkUmVuZGVyTm9kZXModmlldywgbm9kZURlZi5uZ0NvbnRlbnQuaW5kZXgsIGFjdGlvbiwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcm4gPSByZW5kZXJOb2RlKHZpZXcsIG5vZGVEZWYpO1xuICAgICAgICBpZiAoYWN0aW9uID09PSAzIC8qIFJlbW92ZUNoaWxkICovICYmIChub2RlRGVmLmZsYWdzICYgMzM1NTQ0MzIgLyogQ29tcG9uZW50VmlldyAqLykgJiZcbiAgICAgICAgICAgIChub2RlRGVmLmJpbmRpbmdGbGFncyAmIDQ4IC8qIENhdFN5bnRoZXRpY1Byb3BlcnR5ICovKSkge1xuICAgICAgICAgICAgLy8gTm90ZTogd2UgbWlnaHQgbmVlZCB0byBkbyBib3RoIGFjdGlvbnMuXG4gICAgICAgICAgICBpZiAobm9kZURlZi5iaW5kaW5nRmxhZ3MgJiAoMTYgLyogU3ludGhldGljUHJvcGVydHkgKi8pKSB7XG4gICAgICAgICAgICAgICAgZXhlY1JlbmRlck5vZGVBY3Rpb24odmlldywgcm4sIGFjdGlvbiwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZURlZi5iaW5kaW5nRmxhZ3MgJiAoMzIgLyogU3ludGhldGljSG9zdFByb3BlcnR5ICovKSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21wVmlldyA9IGFzRWxlbWVudERhdGEodmlldywgbm9kZURlZi5ub2RlSW5kZXgpLmNvbXBvbmVudFZpZXc7XG4gICAgICAgICAgICAgICAgZXhlY1JlbmRlck5vZGVBY3Rpb24oY29tcFZpZXcsIHJuLCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXhlY1JlbmRlck5vZGVBY3Rpb24odmlldywgcm4sIGFjdGlvbiwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVEZWYuZmxhZ3MgJiAxNjc3NzIxNiAvKiBFbWJlZGRlZFZpZXdzICovKSB7XG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRWaWV3cyA9IGFzRWxlbWVudERhdGEodmlldywgbm9kZURlZi5ub2RlSW5kZXgpLnZpZXdDb250YWluZXIuX2VtYmVkZGVkVmlld3M7XG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGVtYmVkZGVkVmlld3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2aXNpdFJvb3RSZW5kZXJOb2RlcyhlbWJlZGRlZFZpZXdzW2tdLCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLyAmJiAhbm9kZURlZi5lbGVtZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIHZpc2l0U2libGluZ1JlbmRlck5vZGVzKHZpZXcsIGFjdGlvbiwgbm9kZURlZi5ub2RlSW5kZXggKyAxLCBub2RlRGVmLm5vZGVJbmRleCArIG5vZGVEZWYuY2hpbGRDb3VudCwgcGFyZW50Tm9kZSwgbmV4dFNpYmxpbmcsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBleGVjUmVuZGVyTm9kZUFjdGlvbih2aWV3LCByZW5kZXJOb2RlLCBhY3Rpb24sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB0YXJnZXQpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSB2aWV3LnJlbmRlcmVyO1xuICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgMSAvKiBBcHBlbmRDaGlsZCAqLzpcbiAgICAgICAgICAgIHJlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudE5vZGUsIHJlbmRlck5vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMiAvKiBJbnNlcnRCZWZvcmUgKi86XG4gICAgICAgICAgICByZW5kZXJlci5pbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgcmVuZGVyTm9kZSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMyAvKiBSZW1vdmVDaGlsZCAqLzpcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIHJlbmRlck5vZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMCAvKiBDb2xsZWN0ICovOlxuICAgICAgICAgICAgdGFyZ2V0LnB1c2gocmVuZGVyTm9kZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59XG52YXIgTlNfUFJFRklYX1JFID0gL146KFteOl0rKTooLispJC87XG5mdW5jdGlvbiBzcGxpdE5hbWVzcGFjZShuYW1lKSB7XG4gICAgaWYgKG5hbWVbMF0gPT09ICc6Jykge1xuICAgICAgICB2YXIgbWF0Y2ggPSBuYW1lLm1hdGNoKE5TX1BSRUZJWF9SRSk7XG4gICAgICAgIHJldHVybiBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcbiAgICB9XG4gICAgcmV0dXJuIFsnJywgbmFtZV07XG59XG5mdW5jdGlvbiBjYWxjQmluZGluZ0ZsYWdzKGJpbmRpbmdzKSB7XG4gICAgdmFyIGZsYWdzID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZsYWdzIHw9IGJpbmRpbmdzW2ldLmZsYWdzO1xuICAgIH1cbiAgICByZXR1cm4gZmxhZ3M7XG59XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh2YWx1ZUNvdW50LCBjb25zdEFuZEludGVycCkge1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlQ291bnQgKiAyOyBpID0gaSArIDIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgY29uc3RBbmRJbnRlcnBbaV0gKyBfdG9TdHJpbmdXaXRoTnVsbChjb25zdEFuZEludGVycFtpICsgMV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgY29uc3RBbmRJbnRlcnBbdmFsdWVDb3VudCAqIDJdO1xufVxuZnVuY3Rpb24gaW5saW5lSW50ZXJwb2xhdGUodmFsdWVDb3VudCwgYzAsIGExLCBjMSwgYTIsIGMyLCBhMywgYzMsIGE0LCBjNCwgYTUsIGM1LCBhNiwgYzYsIGE3LCBjNywgYTgsIGM4LCBhOSwgYzkpIHtcbiAgICBzd2l0Y2ggKHZhbHVlQ291bnQpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIGMwICsgX3RvU3RyaW5nV2l0aE51bGwoYTEpICsgYzE7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzI7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgIGMzO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0O1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0ICsgX3RvU3RyaW5nV2l0aE51bGwoYTUpICsgYzU7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgIGMzICsgX3RvU3RyaW5nV2l0aE51bGwoYTQpICsgYzQgKyBfdG9TdHJpbmdXaXRoTnVsbChhNSkgKyBjNSArIF90b1N0cmluZ1dpdGhOdWxsKGE2KSArIGM2O1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0ICsgX3RvU3RyaW5nV2l0aE51bGwoYTUpICsgYzUgKyBfdG9TdHJpbmdXaXRoTnVsbChhNikgK1xuICAgICAgICAgICAgICAgIGM2ICsgX3RvU3RyaW5nV2l0aE51bGwoYTcpICsgYzc7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiBjMCArIF90b1N0cmluZ1dpdGhOdWxsKGExKSArIGMxICsgX3RvU3RyaW5nV2l0aE51bGwoYTIpICsgYzIgKyBfdG9TdHJpbmdXaXRoTnVsbChhMykgK1xuICAgICAgICAgICAgICAgIGMzICsgX3RvU3RyaW5nV2l0aE51bGwoYTQpICsgYzQgKyBfdG9TdHJpbmdXaXRoTnVsbChhNSkgKyBjNSArIF90b1N0cmluZ1dpdGhOdWxsKGE2KSArXG4gICAgICAgICAgICAgICAgYzYgKyBfdG9TdHJpbmdXaXRoTnVsbChhNykgKyBjNyArIF90b1N0cmluZ1dpdGhOdWxsKGE4KSArIGM4O1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gYzAgKyBfdG9TdHJpbmdXaXRoTnVsbChhMSkgKyBjMSArIF90b1N0cmluZ1dpdGhOdWxsKGEyKSArIGMyICsgX3RvU3RyaW5nV2l0aE51bGwoYTMpICtcbiAgICAgICAgICAgICAgICBjMyArIF90b1N0cmluZ1dpdGhOdWxsKGE0KSArIGM0ICsgX3RvU3RyaW5nV2l0aE51bGwoYTUpICsgYzUgKyBfdG9TdHJpbmdXaXRoTnVsbChhNikgK1xuICAgICAgICAgICAgICAgIGM2ICsgX3RvU3RyaW5nV2l0aE51bGwoYTcpICsgYzcgKyBfdG9TdHJpbmdXaXRoTnVsbChhOCkgKyBjOCArIF90b1N0cmluZ1dpdGhOdWxsKGE5KSArIGM5O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gOSBleHByZXNzaW9uc1wiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBfdG9TdHJpbmdXaXRoTnVsbCh2KSB7XG4gICAgcmV0dXJuIHYgIT0gbnVsbCA/IHYudG9TdHJpbmcoKSA6ICcnO1xufVxudmFyIEVNUFRZX0FSUkFZJDMgPSBbXTtcbnZhciBFTVBUWV9NQVAgPSB7fTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFVOREVGSU5FRF9WQUxVRSA9IG5ldyBPYmplY3QoKTtcbnZhciBJbmplY3RvclJlZlRva2VuS2V5ID0gdG9rZW5LZXkoSW5qZWN0b3IpO1xudmFyIElOSkVDVE9SUmVmVG9rZW5LZXkgPSB0b2tlbktleShJTkpFQ1RPUik7XG52YXIgTmdNb2R1bGVSZWZUb2tlbktleSA9IHRva2VuS2V5KE5nTW9kdWxlUmVmKTtcbmZ1bmN0aW9uIG1vZHVsZVByb3ZpZGVEZWYoZmxhZ3MsIHRva2VuLCB2YWx1ZSwgZGVwcykge1xuICAgIC8vIE5lZWQgdG8gcmVzb2x2ZSBmb3J3YXJkUmVmcyBhcyBlLmcuIGZvciBgdXNlVmFsdWVgIHdlXG4gICAgLy8gbG93ZXJlZCB0aGUgZXhwcmVzc2lvbiBhbmQgdGhlbiBzdG9wcGVkIGV2YWx1YXRpbmcgaXQsXG4gICAgLy8gaS5lLiBhbHNvIGRpZG4ndCB1bndyYXAgaXQuXG4gICAgdmFsdWUgPSByZXNvbHZlRm9yd2FyZFJlZih2YWx1ZSk7XG4gICAgdmFyIGRlcERlZnMgPSBzcGxpdERlcHNEc2woZGVwcywgc3RyaW5naWZ5KHRva2VuKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gd2lsbCBiZXQgc2V0IGJ5IHRoZSBtb2R1bGUgZGVmaW5pdGlvblxuICAgICAgICBpbmRleDogLTEsXG4gICAgICAgIGRlcHM6IGRlcERlZnMsIGZsYWdzOiBmbGFncywgdG9rZW46IHRva2VuLCB2YWx1ZTogdmFsdWVcbiAgICB9O1xufVxuZnVuY3Rpb24gbW9kdWxlRGVmKHByb3ZpZGVycykge1xuICAgIHZhciBwcm92aWRlcnNCeUtleSA9IHt9O1xuICAgIHZhciBtb2R1bGVzID0gW107XG4gICAgdmFyIGlzUm9vdCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm92aWRlciA9IHByb3ZpZGVyc1tpXTtcbiAgICAgICAgaWYgKHByb3ZpZGVyLnRva2VuID09PSBBUFBfUk9PVCAmJiBwcm92aWRlci52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaXNSb290ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdmlkZXIuZmxhZ3MgJiAxMDczNzQxODI0IC8qIFR5cGVOZ01vZHVsZSAqLykge1xuICAgICAgICAgICAgbW9kdWxlcy5wdXNoKHByb3ZpZGVyLnRva2VuKTtcbiAgICAgICAgfVxuICAgICAgICBwcm92aWRlci5pbmRleCA9IGk7XG4gICAgICAgIHByb3ZpZGVyc0J5S2V5W3Rva2VuS2V5KHByb3ZpZGVyLnRva2VuKV0gPSBwcm92aWRlcjtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gV2lsbCBiZSBmaWxsZWQgbGF0ZXIuLi5cbiAgICAgICAgZmFjdG9yeTogbnVsbCxcbiAgICAgICAgcHJvdmlkZXJzQnlLZXk6IHByb3ZpZGVyc0J5S2V5LFxuICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyxcbiAgICAgICAgbW9kdWxlczogbW9kdWxlcyxcbiAgICAgICAgaXNSb290OiBpc1Jvb3QsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGluaXROZ01vZHVsZShkYXRhKSB7XG4gICAgdmFyIGRlZiA9IGRhdGEuX2RlZjtcbiAgICB2YXIgcHJvdmlkZXJzID0gZGF0YS5fcHJvdmlkZXJzID0gbmV3IEFycmF5KGRlZi5wcm92aWRlcnMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZi5wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3ZEZWYgPSBkZWYucHJvdmlkZXJzW2ldO1xuICAgICAgICBpZiAoIShwcm92RGVmLmZsYWdzICYgNDA5NiAvKiBMYXp5UHJvdmlkZXIgKi8pKSB7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3ZpZGVyIGhhcyBub3QgYmVlbiBhbHJlYWR5IGluaXRpYWxpemVkIG91dHNpZGUgdGhpcyBsb29wLlxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldID0gX2NyZWF0ZVByb3ZpZGVySW5zdGFuY2UoZGF0YSwgcHJvdkRlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlTmdNb2R1bGVEZXAoZGF0YSwgZGVwRGVmLCBub3RGb3VuZFZhbHVlKSB7XG4gICAgaWYgKG5vdEZvdW5kVmFsdWUgPT09IHZvaWQgMCkgeyBub3RGb3VuZFZhbHVlID0gSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5EOyB9XG4gICAgdmFyIGZvcm1lciA9IHNldEN1cnJlbnRJbmplY3RvcihkYXRhKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZGVwRGVmLmZsYWdzICYgOCAvKiBWYWx1ZSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIGRlcERlZi50b2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVwRGVmLmZsYWdzICYgMiAvKiBPcHRpb25hbCAqLykge1xuICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlcERlZi5mbGFncyAmIDEgLyogU2tpcFNlbGYgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLl9wYXJlbnQuZ2V0KGRlcERlZi50b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRva2VuS2V5XzEgPSBkZXBEZWYudG9rZW5LZXk7XG4gICAgICAgIHN3aXRjaCAodG9rZW5LZXlfMSkge1xuICAgICAgICAgICAgY2FzZSBJbmplY3RvclJlZlRva2VuS2V5OlxuICAgICAgICAgICAgY2FzZSBJTkpFQ1RPUlJlZlRva2VuS2V5OlxuICAgICAgICAgICAgY2FzZSBOZ01vZHVsZVJlZlRva2VuS2V5OlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm92aWRlckRlZiA9IGRhdGEuX2RlZi5wcm92aWRlcnNCeUtleVt0b2tlbktleV8xXTtcbiAgICAgICAgdmFyIGluamVjdGFibGVEZWYgPSB2b2lkIDA7XG4gICAgICAgIGlmIChwcm92aWRlckRlZikge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVySW5zdGFuY2UgPSBkYXRhLl9wcm92aWRlcnNbcHJvdmlkZXJEZWYuaW5kZXhdO1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5zdGFuY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2UgPSBkYXRhLl9wcm92aWRlcnNbcHJvdmlkZXJEZWYuaW5kZXhdID1cbiAgICAgICAgICAgICAgICAgICAgX2NyZWF0ZVByb3ZpZGVySW5zdGFuY2UoZGF0YSwgcHJvdmlkZXJEZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVySW5zdGFuY2UgPT09IFVOREVGSU5FRF9WQUxVRSA/IHVuZGVmaW5lZCA6IHByb3ZpZGVySW5zdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGluamVjdGFibGVEZWYgPSBnZXRJbmplY3RhYmxlRGVmKGRlcERlZi50b2tlbikpICYmIHRhcmdldHNNb2R1bGUoZGF0YSwgaW5qZWN0YWJsZURlZikpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGRhdGEuX3Byb3ZpZGVycy5sZW5ndGg7XG4gICAgICAgICAgICBkYXRhLl9kZWYucHJvdmlkZXJzW2luZGV4XSA9IGRhdGEuX2RlZi5wcm92aWRlcnNCeUtleVtkZXBEZWYudG9rZW5LZXldID0ge1xuICAgICAgICAgICAgICAgIGZsYWdzOiAxMDI0IC8qIFR5cGVGYWN0b3J5UHJvdmlkZXIgKi8gfCA0MDk2IC8qIExhenlQcm92aWRlciAqLyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogaW5qZWN0YWJsZURlZi5mYWN0b3J5LFxuICAgICAgICAgICAgICAgIGRlcHM6IFtdLCBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdG9rZW46IGRlcERlZi50b2tlbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkYXRhLl9wcm92aWRlcnNbaW5kZXhdID0gVU5ERUZJTkVEX1ZBTFVFO1xuICAgICAgICAgICAgcmV0dXJuIChkYXRhLl9wcm92aWRlcnNbaW5kZXhdID1cbiAgICAgICAgICAgICAgICBfY3JlYXRlUHJvdmlkZXJJbnN0YW5jZShkYXRhLCBkYXRhLl9kZWYucHJvdmlkZXJzQnlLZXlbZGVwRGVmLnRva2VuS2V5XSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRlcERlZi5mbGFncyAmIDQgLyogU2VsZiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGEuX3BhcmVudC5nZXQoZGVwRGVmLnRva2VuLCBub3RGb3VuZFZhbHVlKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHNldEN1cnJlbnRJbmplY3Rvcihmb3JtZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1vZHVsZVRyYW5zaXRpdmVseVByZXNlbnQobmdNb2R1bGUsIHNjb3BlKSB7XG4gICAgcmV0dXJuIG5nTW9kdWxlLl9kZWYubW9kdWxlcy5pbmRleE9mKHNjb3BlKSA+IC0xO1xufVxuZnVuY3Rpb24gdGFyZ2V0c01vZHVsZShuZ01vZHVsZSwgZGVmKSB7XG4gICAgcmV0dXJuIGRlZi5wcm92aWRlZEluICE9IG51bGwgJiYgKG1vZHVsZVRyYW5zaXRpdmVseVByZXNlbnQobmdNb2R1bGUsIGRlZi5wcm92aWRlZEluKSB8fFxuICAgICAgICBkZWYucHJvdmlkZWRJbiA9PT0gJ3Jvb3QnICYmIG5nTW9kdWxlLl9kZWYuaXNSb290KTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVQcm92aWRlckluc3RhbmNlKG5nTW9kdWxlLCBwcm92aWRlckRlZikge1xuICAgIHZhciBpbmplY3RhYmxlO1xuICAgIHN3aXRjaCAocHJvdmlkZXJEZWYuZmxhZ3MgJiAyMDEzNDcwNjcgLyogVHlwZXMgKi8pIHtcbiAgICAgICAgY2FzZSA1MTIgLyogVHlwZUNsYXNzUHJvdmlkZXIgKi86XG4gICAgICAgICAgICBpbmplY3RhYmxlID0gX2NyZWF0ZUNsYXNzKG5nTW9kdWxlLCBwcm92aWRlckRlZi52YWx1ZSwgcHJvdmlkZXJEZWYuZGVwcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDI0IC8qIFR5cGVGYWN0b3J5UHJvdmlkZXIgKi86XG4gICAgICAgICAgICBpbmplY3RhYmxlID0gX2NhbGxGYWN0b3J5KG5nTW9kdWxlLCBwcm92aWRlckRlZi52YWx1ZSwgcHJvdmlkZXJEZWYuZGVwcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDQ4IC8qIFR5cGVVc2VFeGlzdGluZ1Byb3ZpZGVyICovOlxuICAgICAgICAgICAgaW5qZWN0YWJsZSA9IHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgcHJvdmlkZXJEZWYuZGVwc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTYgLyogVHlwZVZhbHVlUHJvdmlkZXIgKi86XG4gICAgICAgICAgICBpbmplY3RhYmxlID0gcHJvdmlkZXJEZWYudmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gVGhlIHJlYWQgb2YgYG5nT25EZXN0cm95YCBoZXJlIGlzIHNsaWdodGx5IGV4cGVuc2l2ZSBhcyBpdCdzIG1lZ2Ftb3JwaGljLCBzbyBpdCBzaG91bGQgYmVcbiAgICAvLyBhdm9pZGVkIGlmIHBvc3NpYmxlLiBUaGUgc2VxdWVuY2Ugb2YgY2hlY2tzIGhlcmUgZGV0ZXJtaW5lcyB3aGV0aGVyIG5nT25EZXN0cm95IG5lZWRzIHRvIGJlXG4gICAgLy8gY2hlY2tlZC4gSXQgbWlnaHQgbm90IGlmIHRoZSBgaW5qZWN0YWJsZWAgaXNuJ3QgYW4gb2JqZWN0IG9yIGlmIE5vZGVGbGFncy5PbkRlc3Ryb3kgaXMgYWxyZWFkeVxuICAgIC8vIHNldCAobmdPbkRlc3Ryb3kgd2FzIGRldGVjdGVkIHN0YXRpY2FsbHkpLlxuICAgIGlmIChpbmplY3RhYmxlICE9PSBVTkRFRklORURfVkFMVUUgJiYgaW5qZWN0YWJsZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0YWJsZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIShwcm92aWRlckRlZi5mbGFncyAmIDEzMTA3MiAvKiBPbkRlc3Ryb3kgKi8pICYmIHR5cGVvZiBpbmplY3RhYmxlLm5nT25EZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3ZpZGVyRGVmLmZsYWdzIHw9IDEzMTA3MiAvKiBPbkRlc3Ryb3kgKi87XG4gICAgfVxuICAgIHJldHVybiBpbmplY3RhYmxlID09PSB1bmRlZmluZWQgPyBVTkRFRklORURfVkFMVUUgOiBpbmplY3RhYmxlO1xufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKG5nTW9kdWxlLCBjdG9yLCBkZXBzKSB7XG4gICAgdmFyIGxlbiA9IGRlcHMubGVuZ3RoO1xuICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIHJldHVybiBuZXcgY3RvcigpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IocmVzb2x2ZU5nTW9kdWxlRGVwKG5nTW9kdWxlLCBkZXBzWzBdKSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgY3RvcihyZXNvbHZlTmdNb2R1bGVEZXAobmdNb2R1bGUsIGRlcHNbMF0pLCByZXNvbHZlTmdNb2R1bGVEZXAobmdNb2R1bGUsIGRlcHNbMV0pKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBjdG9yKHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1swXSksIHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1sxXSksIHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1syXSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyIGRlcFZhbHVlcyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGRlcFZhbHVlc1tpXSA9IHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IChjdG9yLmJpbmQuYXBwbHkoY3RvciwgX19zcHJlYWQoW3ZvaWQgMF0sIGRlcFZhbHVlcykpKSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIF9jYWxsRmFjdG9yeShuZ01vZHVsZSwgZmFjdG9yeSwgZGVwcykge1xuICAgIHZhciBsZW4gPSBkZXBzLmxlbmd0aDtcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeSgpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeShyZXNvbHZlTmdNb2R1bGVEZXAobmdNb2R1bGUsIGRlcHNbMF0pKTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkocmVzb2x2ZU5nTW9kdWxlRGVwKG5nTW9kdWxlLCBkZXBzWzBdKSwgcmVzb2x2ZU5nTW9kdWxlRGVwKG5nTW9kdWxlLCBkZXBzWzFdKSk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1swXSksIHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1sxXSksIHJlc29sdmVOZ01vZHVsZURlcChuZ01vZHVsZSwgZGVwc1syXSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyIGRlcFZhbHVlcyA9IEFycmF5KGxlbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZGVwVmFsdWVzW2ldID0gcmVzb2x2ZU5nTW9kdWxlRGVwKG5nTW9kdWxlLCBkZXBzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmFwcGx5KHZvaWQgMCwgX19zcHJlYWQoZGVwVmFsdWVzKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2FsbE5nTW9kdWxlTGlmZWN5Y2xlKG5nTW9kdWxlLCBsaWZlY3ljbGVzKSB7XG4gICAgdmFyIGRlZiA9IG5nTW9kdWxlLl9kZWY7XG4gICAgdmFyIGRlc3Ryb3llZCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZi5wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHByb3ZEZWYgPSBkZWYucHJvdmlkZXJzW2ldO1xuICAgICAgICBpZiAocHJvdkRlZi5mbGFncyAmIDEzMTA3MiAvKiBPbkRlc3Ryb3kgKi8pIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5nTW9kdWxlLl9wcm92aWRlcnNbaV07XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UgIT09IFVOREVGSU5FRF9WQUxVRSkge1xuICAgICAgICAgICAgICAgIHZhciBvbkRlc3Ryb3kgPSBpbnN0YW5jZS5uZ09uRGVzdHJveTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uRGVzdHJveSA9PT0gJ2Z1bmN0aW9uJyAmJiAhZGVzdHJveWVkLmhhcyhpbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb25EZXN0cm95LmFwcGx5KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveWVkLmFkZChpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBhdHRhY2hFbWJlZGRlZFZpZXcocGFyZW50VmlldywgZWxlbWVudERhdGEsIHZpZXdJbmRleCwgdmlldykge1xuICAgIHZhciBlbWJlZGRlZFZpZXdzID0gZWxlbWVudERhdGEudmlld0NvbnRhaW5lci5fZW1iZWRkZWRWaWV3cztcbiAgICBpZiAodmlld0luZGV4ID09PSBudWxsIHx8IHZpZXdJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZpZXdJbmRleCA9IGVtYmVkZGVkVmlld3MubGVuZ3RoO1xuICAgIH1cbiAgICB2aWV3LnZpZXdDb250YWluZXJQYXJlbnQgPSBwYXJlbnRWaWV3O1xuICAgIGFkZFRvQXJyYXkoZW1iZWRkZWRWaWV3cywgdmlld0luZGV4LCB2aWV3KTtcbiAgICBhdHRhY2hQcm9qZWN0ZWRWaWV3KGVsZW1lbnREYXRhLCB2aWV3KTtcbiAgICBTZXJ2aWNlcy5kaXJ0eVBhcmVudFF1ZXJpZXModmlldyk7XG4gICAgdmFyIHByZXZWaWV3ID0gdmlld0luZGV4ID4gMCA/IGVtYmVkZGVkVmlld3Nbdmlld0luZGV4IC0gMV0gOiBudWxsO1xuICAgIHJlbmRlckF0dGFjaEVtYmVkZGVkVmlldyhlbGVtZW50RGF0YSwgcHJldlZpZXcsIHZpZXcpO1xufVxuZnVuY3Rpb24gYXR0YWNoUHJvamVjdGVkVmlldyh2Y0VsZW1lbnREYXRhLCB2aWV3KSB7XG4gICAgdmFyIGR2Y0VsZW1lbnREYXRhID0gZGVjbGFyZWRWaWV3Q29udGFpbmVyKHZpZXcpO1xuICAgIGlmICghZHZjRWxlbWVudERhdGEgfHwgZHZjRWxlbWVudERhdGEgPT09IHZjRWxlbWVudERhdGEgfHxcbiAgICAgICAgdmlldy5zdGF0ZSAmIDE2IC8qIElzUHJvamVjdGVkVmlldyAqLykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdGU6IEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB3ZVxuICAgIC8vIC0gYWRkIGEgdmlldyB0byB0ZW1wbGF0ZS5fcHJvamVjdGVkVmlld3Mgb25seSAxeCB0aHJvdWdob3V0IGl0cyBsaWZldGltZSxcbiAgICAvLyAgIGFuZCByZW1vdmUgaXQgbm90IHVudGlsIHRoZSB2aWV3IGlzIGRlc3Ryb3llZC5cbiAgICAvLyAgIChoYXJkLCBhcyB3aGVuIGEgcGFyZW50IHZpZXcgaXMgYXR0YWNoZWQvZGV0YWNoZWQgd2Ugd291bGQgbmVlZCB0byBhdHRhY2gvZGV0YWNoIGFsbFxuICAgIC8vICAgIG5lc3RlZCBwcm9qZWN0ZWQgdmlld3MgYXMgd2VsbCwgZXZlbiBhY3Jvc3MgY29tcG9uZW50IGJvdW5kYXJpZXMpLlxuICAgIC8vIC0gZG9uJ3QgdHJhY2sgdGhlIGluc2VydGlvbiBvcmRlciBvZiB2aWV3cyBpbiB0aGUgcHJvamVjdGVkIHZpZXdzIGFycmF5XG4gICAgLy8gICAoaGFyZCwgYXMgd2hlbiB0aGUgdmlld3Mgb2YgdGhlIHNhbWUgdGVtcGxhdGUgYXJlIGluc2VydGVkIGRpZmZlcmVudCB2aWV3IGNvbnRhaW5lcnMpXG4gICAgdmlldy5zdGF0ZSB8PSAxNiAvKiBJc1Byb2plY3RlZFZpZXcgKi87XG4gICAgdmFyIHByb2plY3RlZFZpZXdzID0gZHZjRWxlbWVudERhdGEudGVtcGxhdGUuX3Byb2plY3RlZFZpZXdzO1xuICAgIGlmICghcHJvamVjdGVkVmlld3MpIHtcbiAgICAgICAgcHJvamVjdGVkVmlld3MgPSBkdmNFbGVtZW50RGF0YS50ZW1wbGF0ZS5fcHJvamVjdGVkVmlld3MgPSBbXTtcbiAgICB9XG4gICAgcHJvamVjdGVkVmlld3MucHVzaCh2aWV3KTtcbiAgICAvLyBOb3RlOiB3ZSBhcmUgY2hhbmdpbmcgdGhlIE5vZGVEZWYgaGVyZSBhcyB3ZSBjYW5ub3QgY2FsY3VsYXRlXG4gICAgLy8gdGhlIGZhY3Qgd2hldGhlciBhIHRlbXBsYXRlIGlzIHVzZWQgZm9yIHByb2plY3Rpb24gZHVyaW5nIGNvbXBpbGF0aW9uLlxuICAgIG1hcmtOb2RlQXNQcm9qZWN0ZWRUZW1wbGF0ZSh2aWV3LnBhcmVudC5kZWYsIHZpZXcucGFyZW50Tm9kZURlZik7XG59XG5mdW5jdGlvbiBtYXJrTm9kZUFzUHJvamVjdGVkVGVtcGxhdGUodmlld0RlZiwgbm9kZURlZikge1xuICAgIGlmIChub2RlRGVmLmZsYWdzICYgNCAvKiBQcm9qZWN0ZWRUZW1wbGF0ZSAqLykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZpZXdEZWYubm9kZUZsYWdzIHw9IDQgLyogUHJvamVjdGVkVGVtcGxhdGUgKi87XG4gICAgbm9kZURlZi5mbGFncyB8PSA0IC8qIFByb2plY3RlZFRlbXBsYXRlICovO1xuICAgIHZhciBwYXJlbnROb2RlRGVmID0gbm9kZURlZi5wYXJlbnQ7XG4gICAgd2hpbGUgKHBhcmVudE5vZGVEZWYpIHtcbiAgICAgICAgcGFyZW50Tm9kZURlZi5jaGlsZEZsYWdzIHw9IDQgLyogUHJvamVjdGVkVGVtcGxhdGUgKi87XG4gICAgICAgIHBhcmVudE5vZGVEZWYgPSBwYXJlbnROb2RlRGVmLnBhcmVudDtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXRhY2hFbWJlZGRlZFZpZXcoZWxlbWVudERhdGEsIHZpZXdJbmRleCkge1xuICAgIHZhciBlbWJlZGRlZFZpZXdzID0gZWxlbWVudERhdGEudmlld0NvbnRhaW5lci5fZW1iZWRkZWRWaWV3cztcbiAgICBpZiAodmlld0luZGV4ID09IG51bGwgfHwgdmlld0luZGV4ID49IGVtYmVkZGVkVmlld3MubGVuZ3RoKSB7XG4gICAgICAgIHZpZXdJbmRleCA9IGVtYmVkZGVkVmlld3MubGVuZ3RoIC0gMTtcbiAgICB9XG4gICAgaWYgKHZpZXdJbmRleCA8IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciB2aWV3ID0gZW1iZWRkZWRWaWV3c1t2aWV3SW5kZXhdO1xuICAgIHZpZXcudmlld0NvbnRhaW5lclBhcmVudCA9IG51bGw7XG4gICAgcmVtb3ZlRnJvbUFycmF5KGVtYmVkZGVkVmlld3MsIHZpZXdJbmRleCk7XG4gICAgLy8gU2VlIGF0dGFjaFByb2plY3RlZFZpZXcgZm9yIHdoeSB3ZSBkb24ndCB1cGRhdGUgcHJvamVjdGVkVmlld3MgaGVyZS5cbiAgICBTZXJ2aWNlcy5kaXJ0eVBhcmVudFF1ZXJpZXModmlldyk7XG4gICAgcmVuZGVyRGV0YWNoVmlldyQxKHZpZXcpO1xuICAgIHJldHVybiB2aWV3O1xufVxuZnVuY3Rpb24gZGV0YWNoUHJvamVjdGVkVmlldyh2aWV3KSB7XG4gICAgaWYgKCEodmlldy5zdGF0ZSAmIDE2IC8qIElzUHJvamVjdGVkVmlldyAqLykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZHZjRWxlbWVudERhdGEgPSBkZWNsYXJlZFZpZXdDb250YWluZXIodmlldyk7XG4gICAgaWYgKGR2Y0VsZW1lbnREYXRhKSB7XG4gICAgICAgIHZhciBwcm9qZWN0ZWRWaWV3cyA9IGR2Y0VsZW1lbnREYXRhLnRlbXBsYXRlLl9wcm9qZWN0ZWRWaWV3cztcbiAgICAgICAgaWYgKHByb2plY3RlZFZpZXdzKSB7XG4gICAgICAgICAgICByZW1vdmVGcm9tQXJyYXkocHJvamVjdGVkVmlld3MsIHByb2plY3RlZFZpZXdzLmluZGV4T2YodmlldykpO1xuICAgICAgICAgICAgU2VydmljZXMuZGlydHlQYXJlbnRRdWVyaWVzKHZpZXcpO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gbW92ZUVtYmVkZGVkVmlldyhlbGVtZW50RGF0YSwgb2xkVmlld0luZGV4LCBuZXdWaWV3SW5kZXgpIHtcbiAgICB2YXIgZW1iZWRkZWRWaWV3cyA9IGVsZW1lbnREYXRhLnZpZXdDb250YWluZXIuX2VtYmVkZGVkVmlld3M7XG4gICAgdmFyIHZpZXcgPSBlbWJlZGRlZFZpZXdzW29sZFZpZXdJbmRleF07XG4gICAgcmVtb3ZlRnJvbUFycmF5KGVtYmVkZGVkVmlld3MsIG9sZFZpZXdJbmRleCk7XG4gICAgaWYgKG5ld1ZpZXdJbmRleCA9PSBudWxsKSB7XG4gICAgICAgIG5ld1ZpZXdJbmRleCA9IGVtYmVkZGVkVmlld3MubGVuZ3RoO1xuICAgIH1cbiAgICBhZGRUb0FycmF5KGVtYmVkZGVkVmlld3MsIG5ld1ZpZXdJbmRleCwgdmlldyk7XG4gICAgLy8gTm90ZTogRG9uJ3QgbmVlZCB0byBjaGFuZ2UgcHJvamVjdGVkVmlld3MgYXMgdGhlIG9yZGVyIGluIHRoZXJlXG4gICAgLy8gYXMgYWx3YXlzIGludmFsaWQuLi5cbiAgICBTZXJ2aWNlcy5kaXJ0eVBhcmVudFF1ZXJpZXModmlldyk7XG4gICAgcmVuZGVyRGV0YWNoVmlldyQxKHZpZXcpO1xuICAgIHZhciBwcmV2VmlldyA9IG5ld1ZpZXdJbmRleCA+IDAgPyBlbWJlZGRlZFZpZXdzW25ld1ZpZXdJbmRleCAtIDFdIDogbnVsbDtcbiAgICByZW5kZXJBdHRhY2hFbWJlZGRlZFZpZXcoZWxlbWVudERhdGEsIHByZXZWaWV3LCB2aWV3KTtcbiAgICByZXR1cm4gdmlldztcbn1cbmZ1bmN0aW9uIHJlbmRlckF0dGFjaEVtYmVkZGVkVmlldyhlbGVtZW50RGF0YSwgcHJldlZpZXcsIHZpZXcpIHtcbiAgICB2YXIgcHJldlJlbmRlck5vZGUgPSBwcmV2VmlldyA/IHJlbmRlck5vZGUocHJldlZpZXcsIHByZXZWaWV3LmRlZi5sYXN0UmVuZGVyUm9vdE5vZGUpIDpcbiAgICAgICAgZWxlbWVudERhdGEucmVuZGVyRWxlbWVudDtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IHZpZXcucmVuZGVyZXIucGFyZW50Tm9kZShwcmV2UmVuZGVyTm9kZSk7XG4gICAgdmFyIG5leHRTaWJsaW5nID0gdmlldy5yZW5kZXJlci5uZXh0U2libGluZyhwcmV2UmVuZGVyTm9kZSk7XG4gICAgLy8gTm90ZTogV2UgY2FuJ3QgY2hlY2sgaWYgYG5leHRTaWJsaW5nYCBpcyBwcmVzZW50LCBhcyBvbiBXZWJXb3JrZXJzIGl0IHdpbGwgYWx3YXlzIGJlIVxuICAgIC8vIEhvd2V2ZXIsIGJyb3dzZXJzIGF1dG9tYXRpY2FsbHkgZG8gYGFwcGVuZENoaWxkYCB3aGVuIHRoZXJlIGlzIG5vIGBuZXh0U2libGluZ2AuXG4gICAgdmlzaXRSb290UmVuZGVyTm9kZXModmlldywgMiAvKiBJbnNlcnRCZWZvcmUgKi8sIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nLCB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gcmVuZGVyRGV0YWNoVmlldyQxKHZpZXcpIHtcbiAgICB2aXNpdFJvb3RSZW5kZXJOb2Rlcyh2aWV3LCAzIC8qIFJlbW92ZUNoaWxkICovLCBudWxsLCBudWxsLCB1bmRlZmluZWQpO1xufVxuZnVuY3Rpb24gYWRkVG9BcnJheShhcnIsIGluZGV4LCB2YWx1ZSkge1xuICAgIC8vIHBlcmY6IGFycmF5LnB1c2ggaXMgZmFzdGVyIHRoYW4gYXJyYXkuc3BsaWNlIVxuICAgIGlmIChpbmRleCA+PSBhcnIubGVuZ3RoKSB7XG4gICAgICAgIGFyci5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIHZhbHVlKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBpbmRleCkge1xuICAgIC8vIHBlcmY6IGFycmF5LnBvcCBpcyBmYXN0ZXIgdGhhbiBhcnJheS5zcGxpY2UhXG4gICAgaWYgKGluZGV4ID49IGFyci5sZW5ndGggLSAxKSB7XG4gICAgICAgIGFyci5wb3AoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEVNUFRZX0NPTlRFWFQgPSBuZXcgT2JqZWN0KCk7XG4vLyBBdHRlbnRpb246IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHRvcCBsZXZlbCBmdW5jdGlvbi5cbi8vIFB1dHRpbmcgYW55IGxvZ2ljIGluIGhlcmUgd2lsbCBkZXN0cm95IGNsb3N1cmUgdHJlZSBzaGFraW5nIVxuZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50RmFjdG9yeShzZWxlY3RvciwgY29tcG9uZW50VHlwZSwgdmlld0RlZkZhY3RvcnksIGlucHV0cywgb3V0cHV0cywgbmdDb250ZW50U2VsZWN0b3JzKSB7XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnRGYWN0b3J5XyhzZWxlY3RvciwgY29tcG9uZW50VHlwZSwgdmlld0RlZkZhY3RvcnksIGlucHV0cywgb3V0cHV0cywgbmdDb250ZW50U2VsZWN0b3JzKTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFZpZXdEZWZpbml0aW9uRmFjdG9yeShjb21wb25lbnRGYWN0b3J5KSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudEZhY3Rvcnkudmlld0RlZkZhY3Rvcnk7XG59XG52YXIgQ29tcG9uZW50RmFjdG9yeV8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbXBvbmVudEZhY3RvcnlfLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3RvcnlfKHNlbGVjdG9yLCBjb21wb25lbnRUeXBlLCB2aWV3RGVmRmFjdG9yeSwgX2lucHV0cywgX291dHB1dHMsIG5nQ29udGVudFNlbGVjdG9ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBcbiAgICAgICAgLy8gQXR0ZW50aW9uOiB0aGlzIGN0b3IgaXMgY2FsbGVkIGFzIHRvcCBsZXZlbCBmdW5jdGlvbi5cbiAgICAgICAgLy8gUHV0dGluZyBhbnkgbG9naWMgaW4gaGVyZSB3aWxsIGRlc3Ryb3kgY2xvc3VyZSB0cmVlIHNoYWtpbmchXG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgIF90aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICBfdGhpcy5faW5wdXRzID0gX2lucHV0cztcbiAgICAgICAgX3RoaXMuX291dHB1dHMgPSBfb3V0cHV0cztcbiAgICAgICAgX3RoaXMubmdDb250ZW50U2VsZWN0b3JzID0gbmdDb250ZW50U2VsZWN0b3JzO1xuICAgICAgICBfdGhpcy52aWV3RGVmRmFjdG9yeSA9IHZpZXdEZWZGYWN0b3J5O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnRGYWN0b3J5Xy5wcm90b3R5cGUsIFwiaW5wdXRzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXRzQXJyID0gW107XG4gICAgICAgICAgICB2YXIgaW5wdXRzID0gdGhpcy5faW5wdXRzO1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IGlucHV0c1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgaW5wdXRzQXJyLnB1c2goeyBwcm9wTmFtZTogcHJvcE5hbWUsIHRlbXBsYXRlTmFtZTogdGVtcGxhdGVOYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlucHV0c0FycjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudEZhY3RvcnlfLnByb3RvdHlwZSwgXCJvdXRwdXRzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0c0FyciA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdGhpcy5fb3V0cHV0cykge1xuICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSB0aGlzLl9vdXRwdXRzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRzQXJyLnB1c2goeyBwcm9wTmFtZTogcHJvcE5hbWUsIHRlbXBsYXRlTmFtZTogdGVtcGxhdGVOYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNBcnI7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIENvbXBvbmVudEZhY3RvcnlfLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoaW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHJvb3RTZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpIHtcbiAgICAgICAgaWYgKCFuZ01vZHVsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZ01vZHVsZSBzaG91bGQgYmUgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmlld0RlZiA9IHJlc29sdmVEZWZpbml0aW9uKHRoaXMudmlld0RlZkZhY3RvcnkpO1xuICAgICAgICB2YXIgY29tcG9uZW50Tm9kZUluZGV4ID0gdmlld0RlZi5ub2Rlc1swXS5lbGVtZW50LmNvbXBvbmVudFByb3ZpZGVyLm5vZGVJbmRleDtcbiAgICAgICAgdmFyIHZpZXcgPSBTZXJ2aWNlcy5jcmVhdGVSb290VmlldyhpbmplY3RvciwgcHJvamVjdGFibGVOb2RlcyB8fCBbXSwgcm9vdFNlbGVjdG9yT3JOb2RlLCB2aWV3RGVmLCBuZ01vZHVsZSwgRU1QVFlfQ09OVEVYVCk7XG4gICAgICAgIHZhciBjb21wb25lbnQgPSBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBjb21wb25lbnROb2RlSW5kZXgpLmluc3RhbmNlO1xuICAgICAgICBpZiAocm9vdFNlbGVjdG9yT3JOb2RlKSB7XG4gICAgICAgICAgICB2aWV3LnJlbmRlcmVyLnNldEF0dHJpYnV0ZShhc0VsZW1lbnREYXRhKHZpZXcsIDApLnJlbmRlckVsZW1lbnQsICduZy12ZXJzaW9uJywgVkVSU0lPTi5mdWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFJlZl8odmlldywgbmV3IFZpZXdSZWZfKHZpZXcpLCBjb21wb25lbnQpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbXBvbmVudEZhY3RvcnlfO1xufShDb21wb25lbnRGYWN0b3J5KSk7XG52YXIgQ29tcG9uZW50UmVmXyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29tcG9uZW50UmVmXywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb21wb25lbnRSZWZfKF92aWV3LCBfdmlld1JlZiwgX2NvbXBvbmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fdmlldyA9IF92aWV3O1xuICAgICAgICBfdGhpcy5fdmlld1JlZiA9IF92aWV3UmVmO1xuICAgICAgICBfdGhpcy5fY29tcG9uZW50ID0gX2NvbXBvbmVudDtcbiAgICAgICAgX3RoaXMuX2VsRGVmID0gX3RoaXMuX3ZpZXcuZGVmLm5vZGVzWzBdO1xuICAgICAgICBfdGhpcy5ob3N0VmlldyA9IF92aWV3UmVmO1xuICAgICAgICBfdGhpcy5jaGFuZ2VEZXRlY3RvclJlZiA9IF92aWV3UmVmO1xuICAgICAgICBfdGhpcy5pbnN0YW5jZSA9IF9jb21wb25lbnQ7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudFJlZl8ucHJvdG90eXBlLCBcImxvY2F0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRSZWYoYXNFbGVtZW50RGF0YSh0aGlzLl92aWV3LCB0aGlzLl9lbERlZi5ub2RlSW5kZXgpLnJlbmRlckVsZW1lbnQpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50UmVmXy5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJbmplY3Rvcl8odGhpcy5fdmlldywgdGhpcy5fZWxEZWYpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50UmVmXy5wcm90b3R5cGUsIFwiY29tcG9uZW50VHlwZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50LmNvbnN0cnVjdG9yOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBDb21wb25lbnRSZWZfLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3UmVmLmRlc3Ryb3koKTsgfTtcbiAgICBDb21wb25lbnRSZWZfLnByb3RvdHlwZS5vbkRlc3Ryb3kgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsgdGhpcy5fdmlld1JlZi5vbkRlc3Ryb3koY2FsbGJhY2spOyB9O1xuICAgIHJldHVybiBDb21wb25lbnRSZWZfO1xufShDb21wb25lbnRSZWYpKTtcbmZ1bmN0aW9uIGNyZWF0ZVZpZXdDb250YWluZXJEYXRhKHZpZXcsIGVsRGVmLCBlbERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFZpZXdDb250YWluZXJSZWZfKHZpZXcsIGVsRGVmLCBlbERhdGEpO1xufVxudmFyIFZpZXdDb250YWluZXJSZWZfID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdDb250YWluZXJSZWZfKF92aWV3LCBfZWxEZWYsIF9kYXRhKSB7XG4gICAgICAgIHRoaXMuX3ZpZXcgPSBfdmlldztcbiAgICAgICAgdGhpcy5fZWxEZWYgPSBfZWxEZWY7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBfZGF0YTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZW1iZWRkZWRWaWV3cyA9IFtdO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLCBcImVsZW1lbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBFbGVtZW50UmVmKHRoaXMuX2RhdGEucmVuZGVyRWxlbWVudCk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJbmplY3Rvcl8odGhpcy5fdmlldywgdGhpcy5fZWxEZWYpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLCBcInBhcmVudEluamVjdG9yXCIsIHtcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50ICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSB0aGlzLl92aWV3O1xuICAgICAgICAgICAgdmFyIGVsRGVmID0gdGhpcy5fZWxEZWYucGFyZW50O1xuICAgICAgICAgICAgd2hpbGUgKCFlbERlZiAmJiB2aWV3KSB7XG4gICAgICAgICAgICAgICAgZWxEZWYgPSB2aWV3UGFyZW50RWwodmlldyk7XG4gICAgICAgICAgICAgICAgdmlldyA9IHZpZXcucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZpZXcgPyBuZXcgSW5qZWN0b3JfKHZpZXcsIGVsRGVmKSA6IG5ldyBJbmplY3Rvcl8odGhpcy5fdmlldywgbnVsbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMuX2VtYmVkZGVkVmlld3MubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0gZGV0YWNoRW1iZWRkZWRWaWV3KHRoaXMuX2RhdGEsIGkpO1xuICAgICAgICAgICAgU2VydmljZXMuZGVzdHJveVZpZXcodmlldyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLl9lbWJlZGRlZFZpZXdzW2luZGV4XTtcbiAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgIHZhciByZWYgPSBuZXcgVmlld1JlZl8odmlldyk7XG4gICAgICAgICAgICByZWYuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9lbWJlZGRlZFZpZXdzLmxlbmd0aDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLmNyZWF0ZUVtYmVkZGVkVmlldyA9IGZ1bmN0aW9uICh0ZW1wbGF0ZVJlZiwgY29udGV4dCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIHZpZXdSZWYgPSB0ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCB8fCB7fSk7XG4gICAgICAgIHRoaXMuaW5zZXJ0KHZpZXdSZWYsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHZpZXdSZWY7XG4gICAgfTtcbiAgICBWaWV3Q29udGFpbmVyUmVmXy5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudEZhY3RvcnksIGluZGV4LCBpbmplY3RvciwgcHJvamVjdGFibGVOb2RlcywgbmdNb2R1bGVSZWYpIHtcbiAgICAgICAgdmFyIGNvbnRleHRJbmplY3RvciA9IGluamVjdG9yIHx8IHRoaXMucGFyZW50SW5qZWN0b3I7XG4gICAgICAgIGlmICghbmdNb2R1bGVSZWYgJiYgIShjb21wb25lbnRGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9uZW50RmFjdG9yeUJvdW5kVG9Nb2R1bGUpKSB7XG4gICAgICAgICAgICBuZ01vZHVsZVJlZiA9IGNvbnRleHRJbmplY3Rvci5nZXQoTmdNb2R1bGVSZWYpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShjb250ZXh0SW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHVuZGVmaW5lZCwgbmdNb2R1bGVSZWYpO1xuICAgICAgICB0aGlzLmluc2VydChjb21wb25lbnRSZWYuaG9zdFZpZXcsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcbiAgICB9O1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAodmlld1JlZiwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHZpZXdSZWYuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbnNlcnQgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZpZXdSZWZfID0gdmlld1JlZjtcbiAgICAgICAgdmFyIHZpZXdEYXRhID0gdmlld1JlZl8uX3ZpZXc7XG4gICAgICAgIGF0dGFjaEVtYmVkZGVkVmlldyh0aGlzLl92aWV3LCB0aGlzLl9kYXRhLCBpbmRleCwgdmlld0RhdGEpO1xuICAgICAgICB2aWV3UmVmXy5hdHRhY2hUb1ZpZXdDb250YWluZXJSZWYodGhpcyk7XG4gICAgICAgIHJldHVybiB2aWV3UmVmO1xuICAgIH07XG4gICAgVmlld0NvbnRhaW5lclJlZl8ucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAodmlld1JlZiwgY3VycmVudEluZGV4KSB7XG4gICAgICAgIGlmICh2aWV3UmVmLmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbW92ZSBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXNJbmRleCA9IHRoaXMuX2VtYmVkZGVkVmlld3MuaW5kZXhPZih2aWV3UmVmLl92aWV3KTtcbiAgICAgICAgbW92ZUVtYmVkZGVkVmlldyh0aGlzLl9kYXRhLCBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpO1xuICAgICAgICByZXR1cm4gdmlld1JlZjtcbiAgICB9O1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gKHZpZXdSZWYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtYmVkZGVkVmlld3MuaW5kZXhPZih2aWV3UmVmLl92aWV3KTtcbiAgICB9O1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHZpZXdEYXRhID0gZGV0YWNoRW1iZWRkZWRWaWV3KHRoaXMuX2RhdGEsIGluZGV4KTtcbiAgICAgICAgaWYgKHZpZXdEYXRhKSB7XG4gICAgICAgICAgICBTZXJ2aWNlcy5kZXN0cm95Vmlldyh2aWV3RGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFZpZXdDb250YWluZXJSZWZfLnByb3RvdHlwZS5kZXRhY2ggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHZpZXcgPSBkZXRhY2hFbWJlZGRlZFZpZXcodGhpcy5fZGF0YSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gdmlldyA/IG5ldyBWaWV3UmVmXyh2aWV3KSA6IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld0NvbnRhaW5lclJlZl87XG59KCkpO1xuZnVuY3Rpb24gY3JlYXRlQ2hhbmdlRGV0ZWN0b3JSZWYodmlldykge1xuICAgIHJldHVybiBuZXcgVmlld1JlZl8odmlldyk7XG59XG52YXIgVmlld1JlZl8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmlld1JlZl8oX3ZpZXcpIHtcbiAgICAgICAgdGhpcy5fdmlldyA9IF92aWV3O1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdSZWZfLnByb3RvdHlwZSwgXCJyb290Tm9kZXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJvb3RSZW5kZXJOb2Rlcyh0aGlzLl92aWV3KTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZpZXdSZWZfLnByb3RvdHlwZSwgXCJjb250ZXh0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92aWV3LmNvbnRleHQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWaWV3UmVmXy5wcm90b3R5cGUsIFwiZGVzdHJveWVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5fdmlldy5zdGF0ZSAmIDEyOCAvKiBEZXN0cm95ZWQgKi8pICE9PSAwOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBWaWV3UmVmXy5wcm90b3R5cGUubWFya0ZvckNoZWNrID0gZnVuY3Rpb24gKCkgeyBtYXJrUGFyZW50Vmlld3NGb3JDaGVjayh0aGlzLl92aWV3KTsgfTtcbiAgICBWaWV3UmVmXy5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3LnN0YXRlICY9IH40IC8qIEF0dGFjaGVkICovOyB9O1xuICAgIFZpZXdSZWZfLnByb3RvdHlwZS5kZXRlY3RDaGFuZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZnMgPSB0aGlzLl92aWV3LnJvb3QucmVuZGVyZXJGYWN0b3J5O1xuICAgICAgICBpZiAoZnMuYmVnaW4pIHtcbiAgICAgICAgICAgIGZzLmJlZ2luKCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFNlcnZpY2VzLmNoZWNrQW5kVXBkYXRlVmlldyh0aGlzLl92aWV3KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChmcy5lbmQpIHtcbiAgICAgICAgICAgICAgICBmcy5lbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgVmlld1JlZl8ucHJvdG90eXBlLmNoZWNrTm9DaGFuZ2VzID0gZnVuY3Rpb24gKCkgeyBTZXJ2aWNlcy5jaGVja05vQ2hhbmdlc1ZpZXcodGhpcy5fdmlldyk7IH07XG4gICAgVmlld1JlZl8ucHJvdG90eXBlLnJlYXR0YWNoID0gZnVuY3Rpb24gKCkgeyB0aGlzLl92aWV3LnN0YXRlIHw9IDQgLyogQXR0YWNoZWQgKi87IH07XG4gICAgVmlld1JlZl8ucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuX3ZpZXcuZGlzcG9zYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXcuZGlzcG9zYWJsZXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92aWV3LmRpc3Bvc2FibGVzLnB1c2goY2FsbGJhY2spO1xuICAgIH07XG4gICAgVmlld1JlZl8ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hcHBSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcFJlZi5kZXRhY2hWaWV3KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3ZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgU2VydmljZXMuZGVzdHJveVZpZXcodGhpcy5fdmlldyk7XG4gICAgfTtcbiAgICBWaWV3UmVmXy5wcm90b3R5cGUuZGV0YWNoRnJvbUFwcFJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDtcbiAgICAgICAgcmVuZGVyRGV0YWNoVmlldyQxKHRoaXMuX3ZpZXcpO1xuICAgICAgICBTZXJ2aWNlcy5kaXJ0eVBhcmVudFF1ZXJpZXModGhpcy5fdmlldyk7XG4gICAgfTtcbiAgICBWaWV3UmVmXy5wcm90b3R5cGUuYXR0YWNoVG9BcHBSZWYgPSBmdW5jdGlvbiAoYXBwUmVmKSB7XG4gICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgVmlld0NvbnRhaW5lciEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBSZWYgPSBhcHBSZWY7XG4gICAgfTtcbiAgICBWaWV3UmVmXy5wcm90b3R5cGUuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmID0gZnVuY3Rpb24gKHZjUmVmKSB7XG4gICAgICAgIGlmICh0aGlzLl9hcHBSZWYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIEFwcGxpY2F0aW9uUmVmIScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSB2Y1JlZjtcbiAgICB9O1xuICAgIHJldHVybiBWaWV3UmVmXztcbn0oKSk7XG5mdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZURhdGEodmlldywgZGVmKSB7XG4gICAgcmV0dXJuIG5ldyBUZW1wbGF0ZVJlZl8odmlldywgZGVmKTtcbn1cbnZhciBUZW1wbGF0ZVJlZl8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRlbXBsYXRlUmVmXywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUZW1wbGF0ZVJlZl8oX3BhcmVudFZpZXcsIF9kZWYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX3BhcmVudFZpZXcgPSBfcGFyZW50VmlldztcbiAgICAgICAgX3RoaXMuX2RlZiA9IF9kZWY7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGVtcGxhdGVSZWZfLnByb3RvdHlwZS5jcmVhdGVFbWJlZGRlZFZpZXcgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFZpZXdSZWZfKFNlcnZpY2VzLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9wYXJlbnRWaWV3LCB0aGlzLl9kZWYsIHRoaXMuX2RlZi5lbGVtZW50LnRlbXBsYXRlLCBjb250ZXh0KSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVGVtcGxhdGVSZWZfLnByb3RvdHlwZSwgXCJlbGVtZW50UmVmXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRSZWYoYXNFbGVtZW50RGF0YSh0aGlzLl9wYXJlbnRWaWV3LCB0aGlzLl9kZWYubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIFRlbXBsYXRlUmVmXztcbn0oVGVtcGxhdGVSZWYpKTtcbmZ1bmN0aW9uIGNyZWF0ZUluamVjdG9yJDEodmlldywgZWxEZWYpIHtcbiAgICByZXR1cm4gbmV3IEluamVjdG9yXyh2aWV3LCBlbERlZik7XG59XG52YXIgSW5qZWN0b3JfID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluamVjdG9yXyh2aWV3LCBlbERlZikge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLmVsRGVmID0gZWxEZWY7XG4gICAgfVxuICAgIEluamVjdG9yXy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRva2VuLCBub3RGb3VuZFZhbHVlKSB7XG4gICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICB2YXIgYWxsb3dQcml2YXRlU2VydmljZXMgPSB0aGlzLmVsRGVmID8gKHRoaXMuZWxEZWYuZmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovKSAhPT0gMCA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gU2VydmljZXMucmVzb2x2ZURlcCh0aGlzLnZpZXcsIHRoaXMuZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCB7IGZsYWdzOiAwIC8qIE5vbmUgKi8sIHRva2VuOiB0b2tlbiwgdG9rZW5LZXk6IHRva2VuS2V5KHRva2VuKSB9LCBub3RGb3VuZFZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBJbmplY3Rvcl87XG59KCkpO1xuZnVuY3Rpb24gbm9kZVZhbHVlKHZpZXcsIGluZGV4KSB7XG4gICAgdmFyIGRlZiA9IHZpZXcuZGVmLm5vZGVzW2luZGV4XTtcbiAgICBpZiAoZGVmLmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLykge1xuICAgICAgICB2YXIgZWxEYXRhID0gYXNFbGVtZW50RGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICAgICAgcmV0dXJuIGRlZi5lbGVtZW50LnRlbXBsYXRlID8gZWxEYXRhLnRlbXBsYXRlIDogZWxEYXRhLnJlbmRlckVsZW1lbnQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRlZi5mbGFncyAmIDIgLyogVHlwZVRleHQgKi8pIHtcbiAgICAgICAgcmV0dXJuIGFzVGV4dERhdGEodmlldywgZGVmLm5vZGVJbmRleCkucmVuZGVyVGV4dDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGVmLmZsYWdzICYgKDIwMjI0IC8qIENhdFByb3ZpZGVyICovIHwgMTYgLyogVHlwZVBpcGUgKi8pKSB7XG4gICAgICAgIHJldHVybiBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KS5pbnN0YW5jZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogcmVhZCBub2RlVmFsdWUgZm9yIG5vZGUgaW5kZXggXCIgKyBpbmRleCk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlclYxKHZpZXcpIHtcbiAgICByZXR1cm4gbmV3IFJlbmRlcmVyQWRhcHRlcih2aWV3LnJlbmRlcmVyKTtcbn1cbnZhciBSZW5kZXJlckFkYXB0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVuZGVyZXJBZGFwdGVyKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgUmVuZGVyZXJBZGFwdGVyLnByb3RvdHlwZS5zZWxlY3RSb290RWxlbWVudCA9IGZ1bmN0aW9uIChzZWxlY3Rvck9yTm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudChzZWxlY3Rvck9yTm9kZSk7XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAocGFyZW50LCBuYW1lc3BhY2VBbmROYW1lKSB7XG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChzcGxpdE5hbWVzcGFjZShuYW1lc3BhY2VBbmROYW1lKSwgMiksIG5zID0gX2FbMF0sIG5hbWUgPSBfYVsxXTtcbiAgICAgICAgdmFyIGVsID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVFbGVtZW50KG5hbWUsIG5zKTtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZChwYXJlbnQsIGVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVZpZXdSb290ID0gZnVuY3Rpb24gKGhvc3RFbGVtZW50KSB7IHJldHVybiBob3N0RWxlbWVudDsgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVRlbXBsYXRlQW5jaG9yID0gZnVuY3Rpb24gKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBjb21tZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlVGV4dCA9IGZ1bmN0aW9uIChwYXJlbnRFbGVtZW50LCB2YWx1ZSkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGVsZWdhdGUuY3JlYXRlVGV4dCh2YWx1ZSk7XG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHBhcmVudEVsZW1lbnQsIG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gICAgUmVuZGVyZXJBZGFwdGVyLnByb3RvdHlwZS5wcm9qZWN0Tm9kZXMgPSBmdW5jdGlvbiAocGFyZW50RWxlbWVudCwgbm9kZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBub2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuYXR0YWNoVmlld0FmdGVyID0gZnVuY3Rpb24gKG5vZGUsIHZpZXdSb290Tm9kZXMpIHtcbiAgICAgICAgdmFyIHBhcmVudEVsZW1lbnQgPSB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHZhciBuZXh0U2libGluZyA9IHRoaXMuZGVsZWdhdGUubmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld1Jvb3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5pbnNlcnRCZWZvcmUocGFyZW50RWxlbWVudCwgdmlld1Jvb3ROb2Rlc1tpXSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLmRldGFjaFZpZXcgPSBmdW5jdGlvbiAodmlld1Jvb3ROb2Rlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXdSb290Tm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gdmlld1Jvb3ROb2Rlc1tpXTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gdGhpcy5kZWxlZ2F0ZS5wYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZW1vdmVDaGlsZChwYXJlbnRFbGVtZW50LCBub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVuZGVyZXJBZGFwdGVyLnByb3RvdHlwZS5kZXN0cm95VmlldyA9IGZ1bmN0aW9uIChob3N0RWxlbWVudCwgdmlld0FsbE5vZGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld0FsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlKHZpZXdBbGxOb2Rlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUubGlzdGVuID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3RlbihyZW5kZXJFbGVtZW50LCBuYW1lLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLmxpc3Rlbkdsb2JhbCA9IGZ1bmN0aW9uICh0YXJnZXQsIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0YXJnZXQsIG5hbWUsIGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuc2V0RWxlbWVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSkge1xuICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KHJlbmRlckVsZW1lbnQsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLnNldEVsZW1lbnRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAocmVuZGVyRWxlbWVudCwgbmFtZXNwYWNlQW5kTmFtZSwgYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgICAgdmFyIF9hID0gX19yZWFkKHNwbGl0TmFtZXNwYWNlKG5hbWVzcGFjZUFuZE5hbWUpLCAyKSwgbnMgPSBfYVswXSwgbmFtZSA9IF9hWzFdO1xuICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUocmVuZGVyRWxlbWVudCwgbmFtZSwgYXR0cmlidXRlVmFsdWUsIG5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlKHJlbmRlckVsZW1lbnQsIG5hbWUsIG5zKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVuZGVyZXJBZGFwdGVyLnByb3RvdHlwZS5zZXRCaW5kaW5nRGVidWdJbmZvID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSkgeyB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIGNsYXNzTmFtZSwgaXNBZGQpIHtcbiAgICAgICAgaWYgKGlzQWRkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmFkZENsYXNzKHJlbmRlckVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZUNsYXNzKHJlbmRlckVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuc2V0RWxlbWVudFN0eWxlID0gZnVuY3Rpb24gKHJlbmRlckVsZW1lbnQsIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICAgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFN0eWxlKHJlbmRlckVsZW1lbnQsIHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZVN0eWxlKHJlbmRlckVsZW1lbnQsIHN0eWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuaW52b2tlRWxlbWVudE1ldGhvZCA9IGZ1bmN0aW9uIChyZW5kZXJFbGVtZW50LCBtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgICAgIHJlbmRlckVsZW1lbnRbbWV0aG9kTmFtZV0uYXBwbHkocmVuZGVyRWxlbWVudCwgYXJncyk7XG4gICAgfTtcbiAgICBSZW5kZXJlckFkYXB0ZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAocmVuZGVyTm9kZSwgdGV4dCkgeyB0aGlzLmRlbGVnYXRlLnNldFZhbHVlKHJlbmRlck5vZGUsIHRleHQpOyB9O1xuICAgIFJlbmRlcmVyQWRhcHRlci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlci5hbmltYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQhJyk7IH07XG4gICAgcmV0dXJuIFJlbmRlcmVyQWRhcHRlcjtcbn0oKSk7XG5mdW5jdGlvbiBjcmVhdGVOZ01vZHVsZVJlZihtb2R1bGVUeXBlLCBwYXJlbnQsIGJvb3RzdHJhcENvbXBvbmVudHMsIGRlZikge1xuICAgIHJldHVybiBuZXcgTmdNb2R1bGVSZWZfKG1vZHVsZVR5cGUsIHBhcmVudCwgYm9vdHN0cmFwQ29tcG9uZW50cywgZGVmKTtcbn1cbnZhciBOZ01vZHVsZVJlZl8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdNb2R1bGVSZWZfKF9tb2R1bGVUeXBlLCBfcGFyZW50LCBfYm9vdHN0cmFwQ29tcG9uZW50cywgX2RlZikge1xuICAgICAgICB0aGlzLl9tb2R1bGVUeXBlID0gX21vZHVsZVR5cGU7XG4gICAgICAgIHRoaXMuX3BhcmVudCA9IF9wYXJlbnQ7XG4gICAgICAgIHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMgPSBfYm9vdHN0cmFwQ29tcG9uZW50cztcbiAgICAgICAgdGhpcy5fZGVmID0gX2RlZjtcbiAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbmplY3RvciA9IHRoaXM7XG4gICAgICAgIGluaXROZ01vZHVsZSh0aGlzKTtcbiAgICB9XG4gICAgTmdNb2R1bGVSZWZfLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGluamVjdEZsYWdzKSB7XG4gICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICBpZiAoaW5qZWN0RmxhZ3MgPT09IHZvaWQgMCkgeyBpbmplY3RGbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7IH1cbiAgICAgICAgdmFyIGZsYWdzID0gMCAvKiBOb25lICovO1xuICAgICAgICBpZiAoaW5qZWN0RmxhZ3MgJiBJbmplY3RGbGFncy5Ta2lwU2VsZikge1xuICAgICAgICAgICAgZmxhZ3MgfD0gMSAvKiBTa2lwU2VsZiAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmplY3RGbGFncyAmIEluamVjdEZsYWdzLlNlbGYpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDQgLyogU2VsZiAqLztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZU5nTW9kdWxlRGVwKHRoaXMsIHsgdG9rZW46IHRva2VuLCB0b2tlbktleTogdG9rZW5LZXkodG9rZW4pLCBmbGFnczogZmxhZ3MgfSwgbm90Rm91bmRWYWx1ZSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdNb2R1bGVSZWZfLnByb3RvdHlwZSwgXCJpbnN0YW5jZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5nZXQodGhpcy5fbW9kdWxlVHlwZSk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ01vZHVsZVJlZl8ucHJvdG90eXBlLCBcImNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5nZXQoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgTmdNb2R1bGVSZWZfLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbmcgbW9kdWxlIFwiICsgc3RyaW5naWZ5KHRoaXMuaW5zdGFuY2UuY29uc3RydWN0b3IpICsgXCIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGNhbGxOZ01vZHVsZUxpZmVjeWNsZSh0aGlzLCAxMzEwNzIgLyogT25EZXN0cm95ICovKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gbGlzdGVuZXIoKTsgfSk7XG4gICAgfTtcbiAgICBOZ01vZHVsZVJlZl8ucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgeyB0aGlzLl9kZXN0cm95TGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOyB9O1xuICAgIHJldHVybiBOZ01vZHVsZVJlZl87XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUmVuZGVyZXJWMVRva2VuS2V5ID0gdG9rZW5LZXkoUmVuZGVyZXIpO1xudmFyIFJlbmRlcmVyMlRva2VuS2V5ID0gdG9rZW5LZXkoUmVuZGVyZXIyKTtcbnZhciBFbGVtZW50UmVmVG9rZW5LZXkgPSB0b2tlbktleShFbGVtZW50UmVmKTtcbnZhciBWaWV3Q29udGFpbmVyUmVmVG9rZW5LZXkgPSB0b2tlbktleShWaWV3Q29udGFpbmVyUmVmKTtcbnZhciBUZW1wbGF0ZVJlZlRva2VuS2V5ID0gdG9rZW5LZXkoVGVtcGxhdGVSZWYpO1xudmFyIENoYW5nZURldGVjdG9yUmVmVG9rZW5LZXkgPSB0b2tlbktleShDaGFuZ2VEZXRlY3RvclJlZik7XG52YXIgSW5qZWN0b3JSZWZUb2tlbktleSQxID0gdG9rZW5LZXkoSW5qZWN0b3IpO1xudmFyIElOSkVDVE9SUmVmVG9rZW5LZXkkMSA9IHRva2VuS2V5KElOSkVDVE9SKTtcbmZ1bmN0aW9uIGRpcmVjdGl2ZURlZihjaGVja0luZGV4LCBmbGFncywgbWF0Y2hlZFF1ZXJpZXMsIGNoaWxkQ291bnQsIGN0b3IsIGRlcHMsIHByb3BzLCBvdXRwdXRzKSB7XG4gICAgdmFyIGJpbmRpbmdzID0gW107XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZChwcm9wc1twcm9wXSwgMiksIGJpbmRpbmdJbmRleCA9IF9hWzBdLCBub25NaW5pZmllZE5hbWUgPSBfYVsxXTtcbiAgICAgICAgICAgIGJpbmRpbmdzW2JpbmRpbmdJbmRleF0gPSB7XG4gICAgICAgICAgICAgICAgZmxhZ3M6IDggLyogVHlwZVByb3BlcnR5ICovLFxuICAgICAgICAgICAgICAgIG5hbWU6IHByb3AsIG5vbk1pbmlmaWVkTmFtZTogbm9uTWluaWZpZWROYW1lLFxuICAgICAgICAgICAgICAgIG5zOiBudWxsLFxuICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICBzdWZmaXg6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG91dHB1dERlZnMgPSBbXTtcbiAgICBpZiAob3V0cHV0cykge1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBvdXRwdXRzKSB7XG4gICAgICAgICAgICBvdXRwdXREZWZzLnB1c2goeyB0eXBlOiAxIC8qIERpcmVjdGl2ZU91dHB1dCAqLywgcHJvcE5hbWU6IHByb3BOYW1lLCB0YXJnZXQ6IG51bGwsIGV2ZW50TmFtZTogb3V0cHV0c1twcm9wTmFtZV0gfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmxhZ3MgfD0gMTYzODQgLyogVHlwZURpcmVjdGl2ZSAqLztcbiAgICByZXR1cm4gX2RlZihjaGVja0luZGV4LCBmbGFncywgbWF0Y2hlZFF1ZXJpZXMsIGNoaWxkQ291bnQsIGN0b3IsIGN0b3IsIGRlcHMsIGJpbmRpbmdzLCBvdXRwdXREZWZzKTtcbn1cbmZ1bmN0aW9uIHBpcGVEZWYoZmxhZ3MsIGN0b3IsIGRlcHMpIHtcbiAgICBmbGFncyB8PSAxNiAvKiBUeXBlUGlwZSAqLztcbiAgICByZXR1cm4gX2RlZigtMSwgZmxhZ3MsIG51bGwsIDAsIGN0b3IsIGN0b3IsIGRlcHMpO1xufVxuZnVuY3Rpb24gcHJvdmlkZXJEZWYoZmxhZ3MsIG1hdGNoZWRRdWVyaWVzLCB0b2tlbiwgdmFsdWUsIGRlcHMpIHtcbiAgICByZXR1cm4gX2RlZigtMSwgZmxhZ3MsIG1hdGNoZWRRdWVyaWVzLCAwLCB0b2tlbiwgdmFsdWUsIGRlcHMpO1xufVxuZnVuY3Rpb24gX2RlZihjaGVja0luZGV4LCBmbGFncywgbWF0Y2hlZFF1ZXJpZXNEc2wsIGNoaWxkQ291bnQsIHRva2VuLCB2YWx1ZSwgZGVwcywgYmluZGluZ3MsIG91dHB1dHMpIHtcbiAgICB2YXIgX2EgPSBzcGxpdE1hdGNoZWRRdWVyaWVzRHNsKG1hdGNoZWRRdWVyaWVzRHNsKSwgbWF0Y2hlZFF1ZXJpZXMgPSBfYS5tYXRjaGVkUXVlcmllcywgcmVmZXJlbmNlcyA9IF9hLnJlZmVyZW5jZXMsIG1hdGNoZWRRdWVyeUlkcyA9IF9hLm1hdGNoZWRRdWVyeUlkcztcbiAgICBpZiAoIW91dHB1dHMpIHtcbiAgICAgICAgb3V0cHV0cyA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmdzID0gW107XG4gICAgfVxuICAgIC8vIE5lZWQgdG8gcmVzb2x2ZSBmb3J3YXJkUmVmcyBhcyBlLmcuIGZvciBgdXNlVmFsdWVgIHdlXG4gICAgLy8gbG93ZXJlZCB0aGUgZXhwcmVzc2lvbiBhbmQgdGhlbiBzdG9wcGVkIGV2YWx1YXRpbmcgaXQsXG4gICAgLy8gaS5lLiBhbHNvIGRpZG4ndCB1bndyYXAgaXQuXG4gICAgdmFsdWUgPSByZXNvbHZlRm9yd2FyZFJlZih2YWx1ZSk7XG4gICAgdmFyIGRlcERlZnMgPSBzcGxpdERlcHNEc2woZGVwcywgc3RyaW5naWZ5KHRva2VuKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gd2lsbCBiZXQgc2V0IGJ5IHRoZSB2aWV3IGRlZmluaXRpb25cbiAgICAgICAgbm9kZUluZGV4OiAtMSxcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICByZW5kZXJQYXJlbnQ6IG51bGwsXG4gICAgICAgIGJpbmRpbmdJbmRleDogLTEsXG4gICAgICAgIG91dHB1dEluZGV4OiAtMSxcbiAgICAgICAgLy8gcmVndWxhciB2YWx1ZXNcbiAgICAgICAgY2hlY2tJbmRleDogY2hlY2tJbmRleCxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICBjaGlsZEZsYWdzOiAwLFxuICAgICAgICBkaXJlY3RDaGlsZEZsYWdzOiAwLFxuICAgICAgICBjaGlsZE1hdGNoZWRRdWVyaWVzOiAwLCBtYXRjaGVkUXVlcmllczogbWF0Y2hlZFF1ZXJpZXMsIG1hdGNoZWRRdWVyeUlkczogbWF0Y2hlZFF1ZXJ5SWRzLCByZWZlcmVuY2VzOiByZWZlcmVuY2VzLFxuICAgICAgICBuZ0NvbnRlbnRJbmRleDogLTEsIGNoaWxkQ291bnQ6IGNoaWxkQ291bnQsIGJpbmRpbmdzOiBiaW5kaW5ncyxcbiAgICAgICAgYmluZGluZ0ZsYWdzOiBjYWxjQmluZGluZ0ZsYWdzKGJpbmRpbmdzKSwgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXI6IHsgdG9rZW46IHRva2VuLCB2YWx1ZTogdmFsdWUsIGRlcHM6IGRlcERlZnMgfSxcbiAgICAgICAgdGV4dDogbnVsbCxcbiAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgIG5nQ29udGVudDogbnVsbFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVQcm92aWRlckluc3RhbmNlKHZpZXcsIGRlZikge1xuICAgIHJldHVybiBfY3JlYXRlUHJvdmlkZXJJbnN0YW5jZSQxKHZpZXcsIGRlZik7XG59XG5mdW5jdGlvbiBjcmVhdGVQaXBlSW5zdGFuY2UodmlldywgZGVmKSB7XG4gICAgLy8gZGVwcyBhcmUgbG9va2VkIHVwIGZyb20gY29tcG9uZW50LlxuICAgIHZhciBjb21wVmlldyA9IHZpZXc7XG4gICAgd2hpbGUgKGNvbXBWaWV3LnBhcmVudCAmJiAhaXNDb21wb25lbnRWaWV3KGNvbXBWaWV3KSkge1xuICAgICAgICBjb21wVmlldyA9IGNvbXBWaWV3LnBhcmVudDtcbiAgICB9XG4gICAgLy8gcGlwZXMgY2FuIHNlZSB0aGUgcHJpdmF0ZSBzZXJ2aWNlcyBvZiB0aGUgY29tcG9uZW50XG4gICAgdmFyIGFsbG93UHJpdmF0ZVNlcnZpY2VzID0gdHJ1ZTtcbiAgICAvLyBwaXBlcyBhcmUgYWx3YXlzIGVhZ2VyIGFuZCBjbGFzc2VzIVxuICAgIHJldHVybiBjcmVhdGVDbGFzcyhjb21wVmlldy5wYXJlbnQsIHZpZXdQYXJlbnRFbChjb21wVmlldyksIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZWYucHJvdmlkZXIudmFsdWUsIGRlZi5wcm92aWRlci5kZXBzKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZUluc3RhbmNlKHZpZXcsIGRlZikge1xuICAgIC8vIGNvbXBvbmVudHMgY2FuIHNlZSBvdGhlciBwcml2YXRlIHNlcnZpY2VzLCBvdGhlciBkaXJlY3RpdmVzIGNhbid0LlxuICAgIHZhciBhbGxvd1ByaXZhdGVTZXJ2aWNlcyA9IChkZWYuZmxhZ3MgJiAzMjc2OCAvKiBDb21wb25lbnQgKi8pID4gMDtcbiAgICAvLyBkaXJlY3RpdmVzIGFyZSBhbHdheXMgZWFnZXIgYW5kIGNsYXNzZXMhXG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlQ2xhc3ModmlldywgZGVmLnBhcmVudCwgYWxsb3dQcml2YXRlU2VydmljZXMsIGRlZi5wcm92aWRlci52YWx1ZSwgZGVmLnByb3ZpZGVyLmRlcHMpO1xuICAgIGlmIChkZWYub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWYub3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IGRlZi5vdXRwdXRzW2ldO1xuICAgICAgICAgICAgdmFyIG91dHB1dE9ic2VydmFibGUgPSBpbnN0YW5jZVtvdXRwdXQucHJvcE5hbWVdO1xuICAgICAgICAgICAgaWYgKGlzT2JzZXJ2YWJsZShvdXRwdXRPYnNlcnZhYmxlKSkge1xuICAgICAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBvdXRwdXRPYnNlcnZhYmxlLnN1YnNjcmliZShldmVudEhhbmRsZXJDbG9zdXJlKHZpZXcsIGRlZi5wYXJlbnQubm9kZUluZGV4LCBvdXRwdXQuZXZlbnROYW1lKSk7XG4gICAgICAgICAgICAgICAgdmlldy5kaXNwb3NhYmxlc1tkZWYub3V0cHV0SW5kZXggKyBpXSA9IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZS5iaW5kKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJAT3V0cHV0IFwiICsgb3V0cHV0LnByb3BOYW1lICsgXCIgbm90IGluaXRpYWxpemVkIGluICdcIiArIGluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgKyBcIicuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGV2ZW50SGFuZGxlckNsb3N1cmUodmlldywgaW5kZXgsIGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIGRpc3BhdGNoRXZlbnQodmlldywgaW5kZXgsIGV2ZW50TmFtZSwgZXZlbnQpOyB9O1xufVxuZnVuY3Rpb24gY2hlY2tBbmRVcGRhdGVEaXJlY3RpdmVJbmxpbmUodmlldywgZGVmLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSkge1xuICAgIHZhciBwcm92aWRlckRhdGEgPSBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICB2YXIgZGlyZWN0aXZlID0gcHJvdmlkZXJEYXRhLmluc3RhbmNlO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIGNoYW5nZXMgPSB1bmRlZmluZWQ7XG4gICAgdmFyIGJpbmRMZW4gPSBkZWYuYmluZGluZ3MubGVuZ3RoO1xuICAgIGlmIChiaW5kTGVuID4gMCAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCAwLCB2MCkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCAwLCB2MCwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gMSAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCAxLCB2MSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCAxLCB2MSwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gMiAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCAyLCB2MikpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCAyLCB2MiwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gMyAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCAzLCB2MykpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCAzLCB2MywgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gNCAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA0LCB2NCkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA0LCB2NCwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gNSAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA1LCB2NSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA1LCB2NSwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gNiAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA2LCB2NikpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA2LCB2NiwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gNyAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA3LCB2NykpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA3LCB2NywgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gOCAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA4LCB2OCkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA4LCB2OCwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChiaW5kTGVuID4gOSAmJiBjaGVja0JpbmRpbmcodmlldywgZGVmLCA5LCB2OSkpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNoYW5nZXMgPSB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCA5LCB2OSwgY2hhbmdlcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICAgIGRpcmVjdGl2ZS5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB9XG4gICAgaWYgKChkZWYuZmxhZ3MgJiA2NTUzNiAvKiBPbkluaXQgKi8pICYmXG4gICAgICAgIHNob3VsZENhbGxMaWZlY3ljbGVJbml0SG9vayh2aWV3LCAyNTYgLyogSW5pdFN0YXRlX0NhbGxpbmdPbkluaXQgKi8sIGRlZi5ub2RlSW5kZXgpKSB7XG4gICAgICAgIGRpcmVjdGl2ZS5uZ09uSW5pdCgpO1xuICAgIH1cbiAgICBpZiAoZGVmLmZsYWdzICYgMjYyMTQ0IC8qIERvQ2hlY2sgKi8pIHtcbiAgICAgICAgZGlyZWN0aXZlLm5nRG9DaGVjaygpO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlRGlyZWN0aXZlRHluYW1pYyh2aWV3LCBkZWYsIHZhbHVlcykge1xuICAgIHZhciBwcm92aWRlckRhdGEgPSBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICB2YXIgZGlyZWN0aXZlID0gcHJvdmlkZXJEYXRhLmluc3RhbmNlO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIGNoYW5nZXMgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNoZWNrQmluZGluZyh2aWV3LCBkZWYsIGksIHZhbHVlc1tpXSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZVByb3AodmlldywgcHJvdmlkZXJEYXRhLCBkZWYsIGksIHZhbHVlc1tpXSwgY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgZGlyZWN0aXZlLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH1cbiAgICBpZiAoKGRlZi5mbGFncyAmIDY1NTM2IC8qIE9uSW5pdCAqLykgJiZcbiAgICAgICAgc2hvdWxkQ2FsbExpZmVjeWNsZUluaXRIb29rKHZpZXcsIDI1NiAvKiBJbml0U3RhdGVfQ2FsbGluZ09uSW5pdCAqLywgZGVmLm5vZGVJbmRleCkpIHtcbiAgICAgICAgZGlyZWN0aXZlLm5nT25Jbml0KCk7XG4gICAgfVxuICAgIGlmIChkZWYuZmxhZ3MgJiAyNjIxNDQgLyogRG9DaGVjayAqLykge1xuICAgICAgICBkaXJlY3RpdmUubmdEb0NoZWNrKCk7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xufVxuZnVuY3Rpb24gX2NyZWF0ZVByb3ZpZGVySW5zdGFuY2UkMSh2aWV3LCBkZWYpIHtcbiAgICAvLyBwcml2YXRlIHNlcnZpY2VzIGNhbiBzZWUgb3RoZXIgcHJpdmF0ZSBzZXJ2aWNlc1xuICAgIHZhciBhbGxvd1ByaXZhdGVTZXJ2aWNlcyA9IChkZWYuZmxhZ3MgJiA4MTkyIC8qIFByaXZhdGVQcm92aWRlciAqLykgPiAwO1xuICAgIHZhciBwcm92aWRlckRlZiA9IGRlZi5wcm92aWRlcjtcbiAgICBzd2l0Y2ggKGRlZi5mbGFncyAmIDIwMTM0NzA2NyAvKiBUeXBlcyAqLykge1xuICAgICAgICBjYXNlIDUxMiAvKiBUeXBlQ2xhc3NQcm92aWRlciAqLzpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDbGFzcyh2aWV3LCBkZWYucGFyZW50LCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgcHJvdmlkZXJEZWYudmFsdWUsIHByb3ZpZGVyRGVmLmRlcHMpO1xuICAgICAgICBjYXNlIDEwMjQgLyogVHlwZUZhY3RvcnlQcm92aWRlciAqLzpcbiAgICAgICAgICAgIHJldHVybiBjYWxsRmFjdG9yeSh2aWV3LCBkZWYucGFyZW50LCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgcHJvdmlkZXJEZWYudmFsdWUsIHByb3ZpZGVyRGVmLmRlcHMpO1xuICAgICAgICBjYXNlIDIwNDggLyogVHlwZVVzZUV4aXN0aW5nUHJvdmlkZXIgKi86XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZURlcCh2aWV3LCBkZWYucGFyZW50LCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgcHJvdmlkZXJEZWYuZGVwc1swXSk7XG4gICAgICAgIGNhc2UgMjU2IC8qIFR5cGVWYWx1ZVByb3ZpZGVyICovOlxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyRGVmLnZhbHVlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUNsYXNzKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgY3RvciwgZGVwcykge1xuICAgIHZhciBsZW4gPSBkZXBzLmxlbmd0aDtcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gbmV3IGN0b3IoKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBjdG9yKHJlc29sdmVEZXAodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZXBzWzBdKSk7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgY3RvcihyZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1swXSksIHJlc29sdmVEZXAodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZXBzWzFdKSk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgY3RvcihyZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1swXSksIHJlc29sdmVEZXAodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZXBzWzFdKSwgcmVzb2x2ZURlcCh2aWV3LCBlbERlZiwgYWxsb3dQcml2YXRlU2VydmljZXMsIGRlcHNbMl0pKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciBkZXBWYWx1ZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBkZXBWYWx1ZXNbaV0gPSByZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IChjdG9yLmJpbmQuYXBwbHkoY3RvciwgX19zcHJlYWQoW3ZvaWQgMF0sIGRlcFZhbHVlcykpKSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNhbGxGYWN0b3J5KHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZmFjdG9yeSwgZGVwcykge1xuICAgIHZhciBsZW4gPSBkZXBzLmxlbmd0aDtcbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeSgpO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeShyZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1swXSkpO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeShyZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1swXSksIHJlc29sdmVEZXAodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZXBzWzFdKSk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5KHJlc29sdmVEZXAodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzLCBkZXBzWzBdKSwgcmVzb2x2ZURlcCh2aWV3LCBlbERlZiwgYWxsb3dQcml2YXRlU2VydmljZXMsIGRlcHNbMV0pLCByZXNvbHZlRGVwKHZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcywgZGVwc1syXSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyIGRlcFZhbHVlcyA9IEFycmF5KGxlbik7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZGVwVmFsdWVzW2ldID0gcmVzb2x2ZURlcCh2aWV3LCBlbERlZiwgYWxsb3dQcml2YXRlU2VydmljZXMsIGRlcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuYXBwbHkodm9pZCAwLCBfX3NwcmVhZChkZXBWYWx1ZXMpKTtcbiAgICB9XG59XG4vLyBUaGlzIGRlZmF1bHQgdmFsdWUgaXMgd2hlbiBjaGVja2luZyB0aGUgaGllcmFyY2h5IGZvciBhIHRva2VuLlxuLy9cbi8vIEl0IG1lYW5zIGJvdGg6XG4vLyAtIHRoZSB0b2tlbiBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgaW5qZWN0b3IsXG4vLyAtIG9ubHkgdGhlIGVsZW1lbnQgaW5qZWN0b3JzIHNob3VsZCBiZSBjaGVja2VkIChpZSBkbyBub3QgY2hlY2sgbW9kdWxlIGluamVjdG9yc1xuLy9cbi8vICAgICAgICAgIG1vZDFcbi8vICAgICAgICAgL1xuLy8gICAgICAgZWwxICAgbW9kMlxuLy8gICAgICAgICBcXCAgL1xuLy8gICAgICAgICBlbDJcbi8vXG4vLyBXaGVuIHJlcXVlc3RpbmcgZWwyLmluamVjdG9yLmdldCh0b2tlbiksIHdlIHNob3VsZCBjaGVjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGFuZCByZXR1cm4gdGhlXG4vLyBmaXJzdCBmb3VuZCB2YWx1ZTpcbi8vIC0gZWwyLmluamVjdG9yLmdldCh0b2tlbiwgZGVmYXVsdClcbi8vIC0gZWwxLmluamVjdG9yLmdldCh0b2tlbiwgTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikgLT4gZG8gbm90IGNoZWNrIHRoZSBtb2R1bGVcbi8vIC0gbW9kMi5pbmplY3Rvci5nZXQodG9rZW4sIGRlZmF1bHQpXG52YXIgTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiA9IHt9O1xuZnVuY3Rpb24gcmVzb2x2ZURlcCh2aWV3LCBlbERlZiwgYWxsb3dQcml2YXRlU2VydmljZXMsIGRlcERlZiwgbm90Rm91bmRWYWx1ZSkge1xuICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgIGlmIChkZXBEZWYuZmxhZ3MgJiA4IC8qIFZhbHVlICovKSB7XG4gICAgICAgIHJldHVybiBkZXBEZWYudG9rZW47XG4gICAgfVxuICAgIHZhciBzdGFydFZpZXcgPSB2aWV3O1xuICAgIGlmIChkZXBEZWYuZmxhZ3MgJiAyIC8qIE9wdGlvbmFsICovKSB7XG4gICAgICAgIG5vdEZvdW5kVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB2YXIgdG9rZW5LZXkgPSBkZXBEZWYudG9rZW5LZXk7XG4gICAgaWYgKHRva2VuS2V5ID09PSBDaGFuZ2VEZXRlY3RvclJlZlRva2VuS2V5KSB7XG4gICAgICAgIC8vIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgZWxlbWVudCBhcyBhIGNvbXBvbmVudCBzaG91bGQgYmUgYWJsZSB0byBjb250cm9sIHRoZSBjaGFuZ2UgZGV0ZWN0b3JcbiAgICAgICAgLy8gb2YgdGhhdCBjb21wb25lbnQgYXMgd2VsbC5cbiAgICAgICAgYWxsb3dQcml2YXRlU2VydmljZXMgPSAhIShlbERlZiAmJiBlbERlZi5lbGVtZW50LmNvbXBvbmVudFZpZXcpO1xuICAgIH1cbiAgICBpZiAoZWxEZWYgJiYgKGRlcERlZi5mbGFncyAmIDEgLyogU2tpcFNlbGYgKi8pKSB7XG4gICAgICAgIGFsbG93UHJpdmF0ZVNlcnZpY2VzID0gZmFsc2U7XG4gICAgICAgIGVsRGVmID0gZWxEZWYucGFyZW50O1xuICAgIH1cbiAgICB2YXIgc2VhcmNoVmlldyA9IHZpZXc7XG4gICAgd2hpbGUgKHNlYXJjaFZpZXcpIHtcbiAgICAgICAgaWYgKGVsRGVmKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRva2VuS2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBSZW5kZXJlclYxVG9rZW5LZXk6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBWaWV3ID0gZmluZENvbXBWaWV3KHNlYXJjaFZpZXcsIGVsRGVmLCBhbGxvd1ByaXZhdGVTZXJ2aWNlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZW5kZXJlclYxKGNvbXBWaWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBSZW5kZXJlcjJUb2tlbktleToge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcFZpZXcgPSBmaW5kQ29tcFZpZXcoc2VhcmNoVmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBWaWV3LnJlbmRlcmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIEVsZW1lbnRSZWZUb2tlbktleTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50UmVmKGFzRWxlbWVudERhdGEoc2VhcmNoVmlldywgZWxEZWYubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjYXNlIFZpZXdDb250YWluZXJSZWZUb2tlbktleTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzRWxlbWVudERhdGEoc2VhcmNoVmlldywgZWxEZWYubm9kZUluZGV4KS52aWV3Q29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVSZWZUb2tlbktleToge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxEZWYuZWxlbWVudC50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFzRWxlbWVudERhdGEoc2VhcmNoVmlldywgZWxEZWYubm9kZUluZGV4KS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBDaGFuZ2VEZXRlY3RvclJlZlRva2VuS2V5OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjZFZpZXcgPSBmaW5kQ29tcFZpZXcoc2VhcmNoVmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoYW5nZURldGVjdG9yUmVmKGNkVmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgSW5qZWN0b3JSZWZUb2tlbktleSQxOlxuICAgICAgICAgICAgICAgIGNhc2UgSU5KRUNUT1JSZWZUb2tlbktleSQxOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW5qZWN0b3IkMShzZWFyY2hWaWV3LCBlbERlZik7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyRGVmXzEgPSAoYWxsb3dQcml2YXRlU2VydmljZXMgPyBlbERlZi5lbGVtZW50LmFsbFByb3ZpZGVycyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBlbERlZi5lbGVtZW50LnB1YmxpY1Byb3ZpZGVycylbdG9rZW5LZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZWZfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyRGF0YSA9IGFzUHJvdmlkZXJEYXRhKHNlYXJjaFZpZXcsIHByb3ZpZGVyRGVmXzEubm9kZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvdmlkZXJEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEYXRhID0geyBpbnN0YW5jZTogX2NyZWF0ZVByb3ZpZGVySW5zdGFuY2UkMShzZWFyY2hWaWV3LCBwcm92aWRlckRlZl8xKSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZpZXcubm9kZXNbcHJvdmlkZXJEZWZfMS5ub2RlSW5kZXhdID0gcHJvdmlkZXJEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyRGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFsbG93UHJpdmF0ZVNlcnZpY2VzID0gaXNDb21wb25lbnRWaWV3KHNlYXJjaFZpZXcpO1xuICAgICAgICBlbERlZiA9IHZpZXdQYXJlbnRFbChzZWFyY2hWaWV3KTtcbiAgICAgICAgc2VhcmNoVmlldyA9IHNlYXJjaFZpZXcucGFyZW50O1xuICAgICAgICBpZiAoZGVwRGVmLmZsYWdzICYgNCAvKiBTZWxmICovKSB7XG4gICAgICAgICAgICBzZWFyY2hWaWV3ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgdmFsdWUgPSBzdGFydFZpZXcucm9vdC5pbmplY3Rvci5nZXQoZGVwRGVmLnRva2VuLCBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKTtcbiAgICBpZiAodmFsdWUgIT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IgfHxcbiAgICAgICAgbm90Rm91bmRWYWx1ZSA9PT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGZyb20gdGhlIHJvb3QgZWxlbWVudCBpbmplY3RvciB3aGVuXG4gICAgICAgIC8vIC0gaXQgcHJvdmlkZXMgaXRcbiAgICAgICAgLy8gICAodmFsdWUgIT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpXG4gICAgICAgIC8vIC0gdGhlIG1vZHVsZSBpbmplY3RvciBzaG91bGQgbm90IGJlIGNoZWNrZWRcbiAgICAgICAgLy8gICAobm90Rm91bmRWYWx1ZSA9PT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUilcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRWaWV3LnJvb3QubmdNb2R1bGUuaW5qZWN0b3IuZ2V0KGRlcERlZi50b2tlbiwgbm90Rm91bmRWYWx1ZSk7XG59XG5mdW5jdGlvbiBmaW5kQ29tcFZpZXcodmlldywgZWxEZWYsIGFsbG93UHJpdmF0ZVNlcnZpY2VzKSB7XG4gICAgdmFyIGNvbXBWaWV3O1xuICAgIGlmIChhbGxvd1ByaXZhdGVTZXJ2aWNlcykge1xuICAgICAgICBjb21wVmlldyA9IGFzRWxlbWVudERhdGEodmlldywgZWxEZWYubm9kZUluZGV4KS5jb21wb25lbnRWaWV3O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29tcFZpZXcgPSB2aWV3O1xuICAgICAgICB3aGlsZSAoY29tcFZpZXcucGFyZW50ICYmICFpc0NvbXBvbmVudFZpZXcoY29tcFZpZXcpKSB7XG4gICAgICAgICAgICBjb21wVmlldyA9IGNvbXBWaWV3LnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcFZpZXc7XG59XG5mdW5jdGlvbiB1cGRhdGVQcm9wKHZpZXcsIHByb3ZpZGVyRGF0YSwgZGVmLCBiaW5kaW5nSWR4LCB2YWx1ZSwgY2hhbmdlcykge1xuICAgIGlmIChkZWYuZmxhZ3MgJiAzMjc2OCAvKiBDb21wb25lbnQgKi8pIHtcbiAgICAgICAgdmFyIGNvbXBWaWV3ID0gYXNFbGVtZW50RGF0YSh2aWV3LCBkZWYucGFyZW50Lm5vZGVJbmRleCkuY29tcG9uZW50VmlldztcbiAgICAgICAgaWYgKGNvbXBWaWV3LmRlZi5mbGFncyAmIDIgLyogT25QdXNoICovKSB7XG4gICAgICAgICAgICBjb21wVmlldy5zdGF0ZSB8PSA4IC8qIENoZWNrc0VuYWJsZWQgKi87XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJpbmRpbmcgPSBkZWYuYmluZGluZ3NbYmluZGluZ0lkeF07XG4gICAgdmFyIHByb3BOYW1lID0gYmluZGluZy5uYW1lO1xuICAgIC8vIE5vdGU6IFRoaXMgaXMgc3RpbGwgc2FmZSB3aXRoIENsb3N1cmUgQ29tcGlsZXIgYXNcbiAgICAvLyB0aGUgdXNlciBwYXNzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgYXMgYW4gb2JqZWN0IGhhcyB0byBgcHJvdmlkZXJEZWZgLFxuICAgIC8vIHNvIENsb3N1cmUgQ29tcGlsZXIgd2lsbCBoYXZlIHJlbmFtZWQgdGhlIHByb3BlcnR5IGNvcnJlY3RseSBhbHJlYWR5LlxuICAgIHByb3ZpZGVyRGF0YS5pbnN0YW5jZVtwcm9wTmFtZV0gPSB2YWx1ZTtcbiAgICBpZiAoZGVmLmZsYWdzICYgNTI0Mjg4IC8qIE9uQ2hhbmdlcyAqLykge1xuICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcyB8fCB7fTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gV3JhcHBlZFZhbHVlLnVud3JhcCh2aWV3Lm9sZFZhbHVlc1tkZWYuYmluZGluZ0luZGV4ICsgYmluZGluZ0lkeF0pO1xuICAgICAgICB2YXIgYmluZGluZ18xID0gZGVmLmJpbmRpbmdzW2JpbmRpbmdJZHhdO1xuICAgICAgICBjaGFuZ2VzW2JpbmRpbmdfMS5ub25NaW5pZmllZE5hbWVdID1cbiAgICAgICAgICAgIG5ldyBTaW1wbGVDaGFuZ2Uob2xkVmFsdWUsIHZhbHVlLCAodmlldy5zdGF0ZSAmIDIgLyogRmlyc3RDaGVjayAqLykgIT09IDApO1xuICAgIH1cbiAgICB2aWV3Lm9sZFZhbHVlc1tkZWYuYmluZGluZ0luZGV4ICsgYmluZGluZ0lkeF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gY2hhbmdlcztcbn1cbi8vIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIG5nQWZ0ZXJDb250ZW50Q2hlY2ssIG5nQWZ0ZXJDb250ZW50SW5pdCxcbi8vIG5nQWZ0ZXJWaWV3Q2hlY2ssIGFuZCBuZ0FmdGVyVmlld0luaXQgbGlmZWN5Y2xlIGhvb2tzIChkZXBlbmRpbmcgb24gdGhlIG5vZGVcbi8vIGZsYWdzIGluIGxpZmVjeWNsZSkuIFVubGlrZSBuZ0RvQ2hlY2ssIG5nT25DaGFuZ2VzIGFuZCBuZ09uSW5pdCwgd2hpY2ggYXJlXG4vLyBjYWxsZWQgZHVyaW5nIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdmlldyB0cmVlICh0aGF0IGlzIGNhbGxpbmcgdGhlXG4vLyBwYXJlbnQgaG9va3MgYmVmb3JlIHRoZSBjaGlsZCBob29rcykgdGhlc2UgZXZlbnRzIGFyZSBzZW50IGluIHVzaW5nIGFcbi8vIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSB0cmVlIChjaGlsZHJlbiBiZWZvcmUgcGFyZW50cykuIFRoaXMgY2hhbmdlcyB0aGVcbi8vIG1lYW5pbmcgb2YgaW5pdEluZGV4IGluIHRoZSB2aWV3IHN0YXRlLiBGb3IgbmdPbkluaXQsIGluaXRJbmRleCB0cmFja3MgdGhlXG4vLyBleHBlY3RlZCBub2RlSW5kZXggd2hpY2ggYSBuZ09uSW5pdCBzaG91bGQgYmUgY2FsbGVkLiBXaGVuIHNlbmRpbmdcbi8vIG5nQWZ0ZXJDb250ZW50SW5pdCBhbmQgbmdBZnRlclZpZXdJbml0IGl0IGlzIHRoZSBleHBlY3RlZCBjb3VudCBvZlxuLy8gbmdBZnRlckNvbnRlbnRJbml0IG9yIG5nQWZ0ZXJWaWV3SW5pdCBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIGNhbGxlZC4gVGhpc1xuLy8gZW5zdXJlIHRoYXQgZGVzcGl0ZSBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHkgb3IgYWZ0ZXIgcGlja2luZyB1cCBhZnRlciBhblxuLy8gZXhjZXB0aW9uLCB0aGUgbmdBZnRlckNvbnRlbnRJbml0IG9yIG5nQWZ0ZXJWaWV3SW5pdCB3aWxsIGJlIGNhbGxlZCBvbiB0aGVcbi8vIGNvcnJlY3Qgbm9kZXMuIENvbnNpZGVyIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nICh3aGVyZSBFIGlzIGFuIGVsZW1lbnRcbi8vIGFuZCBEIGlzIGEgZGlyZWN0aXZlKVxuLy8gIFRyZWU6ICAgICAgIHByZS1vcmRlciBpbmRleCAgcG9zdC1vcmRlciBpbmRleFxuLy8gICAgRTEgICAgICAgIDAgICAgICAgICAgICAgICAgNlxuLy8gICAgICBFMiAgICAgIDEgICAgICAgICAgICAgICAgMVxuLy8gICAgICAgRDMgICAgIDIgICAgICAgICAgICAgICAgMFxuLy8gICAgICBFNCAgICAgIDMgICAgICAgICAgICAgICAgNVxuLy8gICAgICAgRTUgICAgIDQgICAgICAgICAgICAgICAgNFxuLy8gICAgICAgIEU2ICAgIDUgICAgICAgICAgICAgICAgMlxuLy8gICAgICAgIEU3ICAgIDYgICAgICAgICAgICAgICAgM1xuLy8gQXMgY2FuIGJlIHNlZW4sIHRoZSBwb3N0LW9yZGVyIGluZGV4IGhhcyBhbiB1bmNsZWFyIHJlbGF0aW9uc2hpcCB0byB0aGVcbi8vIHByZS1vcmRlciBpbmRleCAocG9zdE9yZGVySW5kZXggPT09IHByZU9yZGVySW5kZXggLSBwYXJlbnRDb3VudCArXG4vLyBjaGlsZENvdW50KS4gU2luY2UgbnVtYmVyIG9mIGNhbGxzIHRvIG5nQWZ0ZXJDb250ZW50SW5pdCBhbmQgbmdBZnRlclZpZXdJbml0XG4vLyBhcmUgc3RhYmxlICh3aWxsIGJlIHRoZSBzYW1lIGZvciB0aGUgc2FtZSB2aWV3IHJlZ2FyZGxlc3Mgb2YgZXhjZXB0aW9ucyBvclxuLy8gcmVjdXJzaW9uKSB3ZSBqdXN0IG5lZWQgdG8gY291bnQgdGhlbSB3aGljaCB3aWxsIHJvdWdobHkgY29ycmVzcG9uZCB0byB0aGVcbi8vIHBvc3Qtb3JkZXIgaW5kZXggKGl0IHNraXBzIGVsZW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgZG8gbm90IGhhdmVcbi8vIGxpZmVjeWNsZSBob29rcykuXG4vL1xuLy8gRm9yIGV4YW1wbGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gdGhlIEU2Lm9uQWZ0ZXJWaWV3SW5pdCgpIHRoZVxuLy8gaW5pdEluZGV4IGlzIGxlZnQgYXQgMyAoYnkgc2hvdWxkQ2FsbExpZmVjeWNsZUluaXRIb29rKCkgd2hpY2ggc2V0IGl0IHRvXG4vLyBpbml0SW5kZXggKyAxKS4gV2hlbiBjaGVja0FuZFVwZGF0ZVZpZXcoKSBpcyBjYWxsZWQgYWdhaW4gRDMsIEUyIGFuZCBFNiB3aWxsXG4vLyBub3QgaGF2ZSB0aGVpciBuZ0FmdGVyVmlld0luaXQoKSBjYWxsZWQgYnV0LCBzdGFydGluZyB3aXRoIEU3LCB0aGUgcmVzdCBvZlxuLy8gdGhlIHZpZXcgd2lsbCBiZWdpbiBnZXR0aW5nIG5nQWZ0ZXJWaWV3SW5pdCgpIGNhbGxlZCB1bnRpbCBhIGNoZWNrIGFuZFxuLy8gcGFzcyBpcyBjb21wbGV0ZS5cbi8vXG4vLyBUaGlzIGFsZ29ydGhpbSBhbHNvIGhhbmRsZXMgcmVjdXJzaW9uLiBDb25zaWRlciBpZiBFNCdzIG5nQWZ0ZXJWaWV3SW5pdCgpXG4vLyBpbmRpcmVjdGx5IGNhbGxzIEUxJ3MgQ2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpLiBUaGUgZXhwZWN0ZWRcbi8vIGluaXRJbmRleCBpcyBzZXQgdG8gNiwgdGhlIHJlY3VzaXZlIGNoZWNrQW5kVXBkYXRlVmlldygpIHN0YXJ0cyB3YWxrIGFnYWluLlxuLy8gRDMsIEUyLCBFNiwgRTcsIEU1IGFuZCBFNCBhcmUgc2tpcHBlZCwgbmdBZnRlclZpZXdJbml0KCkgaXMgY2FsbGVkIG9uIEUxLlxuLy8gV2hlbiB0aGUgcmVjdXJzaW9uIHJldHVybnMgdGhlIGluaXRJbmRleCB3aWxsIGJlIDcgc28gRTEgaXMgc2tpcHBlZCBhcyBpdFxuLy8gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhlIHJlY3Vyc2l2ZWx5IGNhbGxlZCBjaGVja0FuVXBkYXRlVmlldygpLlxuZnVuY3Rpb24gY2FsbExpZmVjeWNsZUhvb2tzQ2hpbGRyZW5GaXJzdCh2aWV3LCBsaWZlY3ljbGVzKSB7XG4gICAgaWYgKCEodmlldy5kZWYubm9kZUZsYWdzICYgbGlmZWN5Y2xlcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbm9kZXMgPSB2aWV3LmRlZi5ub2RlcztcbiAgICB2YXIgaW5pdEluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gbm9kZXNbaV07XG4gICAgICAgIHZhciBwYXJlbnRfMSA9IG5vZGVEZWYucGFyZW50O1xuICAgICAgICBpZiAoIXBhcmVudF8xICYmIG5vZGVEZWYuZmxhZ3MgJiBsaWZlY3ljbGVzKSB7XG4gICAgICAgICAgICAvLyBtYXRjaGluZyByb290IG5vZGUgKGUuZy4gYSBwaXBlKVxuICAgICAgICAgICAgY2FsbFByb3ZpZGVyTGlmZWN5Y2xlcyh2aWV3LCBpLCBub2RlRGVmLmZsYWdzICYgbGlmZWN5Y2xlcywgaW5pdEluZGV4KyspO1xuICAgICAgICB9XG4gICAgICAgIGlmICgobm9kZURlZi5jaGlsZEZsYWdzICYgbGlmZWN5Y2xlcykgPT09IDApIHtcbiAgICAgICAgICAgIC8vIG5vIGNoaWxkIG1hdGNoZXMgb25lIG9mIHRoZSBsaWZlY3ljbGVzXG4gICAgICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocGFyZW50XzEgJiYgKHBhcmVudF8xLmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLykgJiZcbiAgICAgICAgICAgIGkgPT09IHBhcmVudF8xLm5vZGVJbmRleCArIHBhcmVudF8xLmNoaWxkQ291bnQpIHtcbiAgICAgICAgICAgIC8vIGxhc3QgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICAgICAgaWYgKHBhcmVudF8xLmRpcmVjdENoaWxkRmxhZ3MgJiBsaWZlY3ljbGVzKSB7XG4gICAgICAgICAgICAgICAgaW5pdEluZGV4ID0gY2FsbEVsZW1lbnRQcm92aWRlcnNMaWZlY3ljbGVzKHZpZXcsIHBhcmVudF8xLCBsaWZlY3ljbGVzLCBpbml0SW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50XzEgPSBwYXJlbnRfMS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjYWxsRWxlbWVudFByb3ZpZGVyc0xpZmVjeWNsZXModmlldywgZWxEZWYsIGxpZmVjeWNsZXMsIGluaXRJbmRleCkge1xuICAgIGZvciAodmFyIGkgPSBlbERlZi5ub2RlSW5kZXggKyAxOyBpIDw9IGVsRGVmLm5vZGVJbmRleCArIGVsRGVmLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICB2YXIgbm9kZURlZiA9IHZpZXcuZGVmLm5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIGxpZmVjeWNsZXMpIHtcbiAgICAgICAgICAgIGNhbGxQcm92aWRlckxpZmVjeWNsZXModmlldywgaSwgbm9kZURlZi5mbGFncyAmIGxpZmVjeWNsZXMsIGluaXRJbmRleCsrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvbmx5IHZpc2l0IGRpcmVjdCBjaGlsZHJlblxuICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICB9XG4gICAgcmV0dXJuIGluaXRJbmRleDtcbn1cbmZ1bmN0aW9uIGNhbGxQcm92aWRlckxpZmVjeWNsZXModmlldywgaW5kZXgsIGxpZmVjeWNsZXMsIGluaXRJbmRleCkge1xuICAgIHZhciBwcm92aWRlckRhdGEgPSBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBpbmRleCk7XG4gICAgaWYgKCFwcm92aWRlckRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcHJvdmlkZXIgPSBwcm92aWRlckRhdGEuaW5zdGFuY2U7XG4gICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIFNlcnZpY2VzLnNldEN1cnJlbnROb2RlKHZpZXcsIGluZGV4KTtcbiAgICBpZiAobGlmZWN5Y2xlcyAmIDEwNDg1NzYgLyogQWZ0ZXJDb250ZW50SW5pdCAqLyAmJlxuICAgICAgICBzaG91bGRDYWxsTGlmZWN5Y2xlSW5pdEhvb2sodmlldywgNTEyIC8qIEluaXRTdGF0ZV9DYWxsaW5nQWZ0ZXJDb250ZW50SW5pdCAqLywgaW5pdEluZGV4KSkge1xuICAgICAgICBwcm92aWRlci5uZ0FmdGVyQ29udGVudEluaXQoKTtcbiAgICB9XG4gICAgaWYgKGxpZmVjeWNsZXMgJiAyMDk3MTUyIC8qIEFmdGVyQ29udGVudENoZWNrZWQgKi8pIHtcbiAgICAgICAgcHJvdmlkZXIubmdBZnRlckNvbnRlbnRDaGVja2VkKCk7XG4gICAgfVxuICAgIGlmIChsaWZlY3ljbGVzICYgNDE5NDMwNCAvKiBBZnRlclZpZXdJbml0ICovICYmXG4gICAgICAgIHNob3VsZENhbGxMaWZlY3ljbGVJbml0SG9vayh2aWV3LCA3NjggLyogSW5pdFN0YXRlX0NhbGxpbmdBZnRlclZpZXdJbml0ICovLCBpbml0SW5kZXgpKSB7XG4gICAgICAgIHByb3ZpZGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIH1cbiAgICBpZiAobGlmZWN5Y2xlcyAmIDgzODg2MDggLyogQWZ0ZXJWaWV3Q2hlY2tlZCAqLykge1xuICAgICAgICBwcm92aWRlci5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgICB9XG4gICAgaWYgKGxpZmVjeWNsZXMgJiAxMzEwNzIgLyogT25EZXN0cm95ICovKSB7XG4gICAgICAgIHByb3ZpZGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX3N1cGVyKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbmdNb2R1bGUgVGhlIE5nTW9kdWxlUmVmIHRvIHdoaWNoIGFsbCByZXNvbHZlZCBmYWN0b3JpZXMgYXJlIGJvdW5kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcihuZ01vZHVsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uZ01vZHVsZSA9IG5nTW9kdWxlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRDb21wb25lbnRUeXBlKGNvbXBvbmVudCk7XG4gICAgICAgIHZhciBjb21wb25lbnREZWYgPSBnZXRDb21wb25lbnREZWYoY29tcG9uZW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRGYWN0b3J5JDEoY29tcG9uZW50RGVmLCB0aGlzLm5nTW9kdWxlKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG59KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikpO1xuZnVuY3Rpb24gdG9SZWZBcnJheShtYXApIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBub25NaW5pZmllZCBpbiBtYXApIHtcbiAgICAgICAgaWYgKG1hcC5oYXNPd25Qcm9wZXJ0eShub25NaW5pZmllZCkpIHtcbiAgICAgICAgICAgIHZhciBtaW5pZmllZCA9IG1hcFtub25NaW5pZmllZF07XG4gICAgICAgICAgICBhcnJheS5wdXNoKHsgcHJvcE5hbWU6IG1pbmlmaWVkLCB0ZW1wbGF0ZU5hbWU6IG5vbk1pbmlmaWVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cbi8qKlxuICogRGVmYXVsdCB7QGxpbmsgUm9vdENvbnRleHR9IGZvciBhbGwgY29tcG9uZW50cyByZW5kZXJlZCB3aXRoIHtAbGluayByZW5kZXJDb21wb25lbnR9LlxuICovXG52YXIgUk9PVF9DT05URVhUID0gbmV3IEluamVjdGlvblRva2VuKCdST09UX0NPTlRFWFRfVE9LRU4nLCB7IHByb3ZpZGVkSW46ICdyb290JywgZmFjdG9yeTogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlUm9vdENvbnRleHQoybXJtWluamVjdChTQ0hFRFVMRVIpKTsgfSB9KTtcbi8qKlxuICogQSBjaGFuZ2UgZGV0ZWN0aW9uIHNjaGVkdWxlciB0b2tlbiBmb3Ige0BsaW5rIFJvb3RDb250ZXh0fS4gVGhpcyB0b2tlbiBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkXG4gKiBmb3IgdGhlIGRlZmF1bHQgYFJvb3RDb250ZXh0YCBmb3VuZCBpbiB0aGUge0BsaW5rIFJPT1RfQ09OVEVYVH0gdG9rZW4uXG4gKi9cbnZhciBTQ0hFRFVMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1NDSEVEVUxFUl9UT0tFTicsIHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG4gICAgZmFjdG9yeTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVmYXVsdFNjaGVkdWxlcjsgfSxcbn0pO1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEluamVjdG9yKHJvb3RWaWV3SW5qZWN0b3IsIG1vZHVsZUluamVjdG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSByb290Vmlld0luamVjdG9yLmdldCh0b2tlbiwgTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiwgZmxhZ3MpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SIHx8XG4gICAgICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9PT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikge1xuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgZnJvbSB0aGUgcm9vdCBlbGVtZW50IGluamVjdG9yIHdoZW5cbiAgICAgICAgICAgICAgICAvLyAtIGl0IHByb3ZpZGVzIGl0XG4gICAgICAgICAgICAgICAgLy8gICAodmFsdWUgIT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpXG4gICAgICAgICAgICAgICAgLy8gLSB0aGUgbW9kdWxlIGluamVjdG9yIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuICAgICAgICAgICAgICAgIC8vICAgKG5vdEZvdW5kVmFsdWUgPT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbi8qKlxuICogUmVuZGVyMyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgdmlld0VuZ2luZV9Db21wb25lbnRGYWN0b3J5fS5cbiAqL1xudmFyIENvbXBvbmVudEZhY3RvcnkkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29tcG9uZW50RmFjdG9yeSwgX3N1cGVyKTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50RGVmIFRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gbmdNb2R1bGUgVGhlIE5nTW9kdWxlUmVmIHRvIHdoaWNoIHRoZSBmYWN0b3J5IGlzIGJvdW5kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmLCBuZ01vZHVsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21wb25lbnREZWYgPSBjb21wb25lbnREZWY7XG4gICAgICAgIF90aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7XG4gICAgICAgIF90aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnREZWYudHlwZTtcbiAgICAgICAgX3RoaXMuc2VsZWN0b3IgPSBjb21wb25lbnREZWYuc2VsZWN0b3JzWzBdWzBdO1xuICAgICAgICBfdGhpcy5uZ0NvbnRlbnRTZWxlY3RvcnMgPVxuICAgICAgICAgICAgY29tcG9uZW50RGVmLm5nQ29udGVudFNlbGVjdG9ycyA/IGNvbXBvbmVudERlZi5uZ0NvbnRlbnRTZWxlY3RvcnMgOiBbXTtcbiAgICAgICAgX3RoaXMuaXNCb3VuZFRvTW9kdWxlID0gISFuZ01vZHVsZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50RmFjdG9yeS5wcm90b3R5cGUsIFwiaW5wdXRzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9SZWZBcnJheSh0aGlzLmNvbXBvbmVudERlZi5pbnB1dHMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50RmFjdG9yeS5wcm90b3R5cGUsIFwib3V0cHV0c1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRvUmVmQXJyYXkodGhpcy5jb21wb25lbnREZWYub3V0cHV0cyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENvbXBvbmVudEZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChpbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBuZ01vZHVsZSkge1xuICAgICAgICB2YXIgaXNJbnRlcm5hbFJvb3RWaWV3ID0gcm9vdFNlbGVjdG9yT3JOb2RlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIG5nTW9kdWxlID0gbmdNb2R1bGUgfHwgdGhpcy5uZ01vZHVsZTtcbiAgICAgICAgdmFyIHJvb3RWaWV3SW5qZWN0b3IgPSBuZ01vZHVsZSA/IGNyZWF0ZUNoYWluZWRJbmplY3RvcihpbmplY3RvciwgbmdNb2R1bGUuaW5qZWN0b3IpIDogaW5qZWN0b3I7XG4gICAgICAgIHZhciByZW5kZXJlckZhY3RvcnkgPSByb290Vmlld0luamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyLCBkb21SZW5kZXJlckZhY3RvcnkzKTtcbiAgICAgICAgdmFyIHNhbml0aXplciA9IHJvb3RWaWV3SW5qZWN0b3IuZ2V0KFNhbml0aXplciwgbnVsbCk7XG4gICAgICAgIHZhciBob3N0Uk5vZGUgPSBpc0ludGVybmFsUm9vdFZpZXcgP1xuICAgICAgICAgICAgZWxlbWVudENyZWF0ZSh0aGlzLnNlbGVjdG9yLCByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpKSA6XG4gICAgICAgICAgICBsb2NhdGVIb3N0RWxlbWVudChyZW5kZXJlckZhY3RvcnksIHJvb3RTZWxlY3Rvck9yTm9kZSk7XG4gICAgICAgIHZhciByb290RmxhZ3MgPSB0aGlzLmNvbXBvbmVudERlZi5vblB1c2ggPyA2NCAvKiBEaXJ0eSAqLyB8IDUxMiAvKiBJc1Jvb3QgKi8gOlxuICAgICAgICAgICAgMTYgLyogQ2hlY2tBbHdheXMgKi8gfCA1MTIgLyogSXNSb290ICovO1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoaXMgQ29tcG9uZW50IG5lZWRzIHRvIGJlIGlzb2xhdGVkIGZyb20gb3RoZXIgY29tcG9uZW50cywgaS5lLiB3aGV0aGVyIGl0XG4gICAgICAgIC8vIHNob3VsZCBiZSBwbGFjZWQgaW50byBpdHMgb3duIChlbXB0eSkgcm9vdCBjb250ZXh0IG9yIGV4aXN0aW5nIHJvb3QgY29udGV4dCBzaG91bGQgYmUgdXNlZC5cbiAgICAgICAgLy8gTm90ZTogdGhpcyBpcyBpbnRlcm5hbC1vbmx5IGNvbnZlbnRpb24gYW5kIG1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBzbyBpdCBzaG91bGQgbm90IGJlXG4gICAgICAgIC8vIHJlbGllZCB1cG9uIGV4dGVybmFsbHkuXG4gICAgICAgIHZhciBpc0lzb2xhdGVkID0gdHlwZW9mIHJvb3RTZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIC9eI3Jvb3QtbmctaW50ZXJuYWwtaXNvbGF0ZWQtXFxkKy8udGVzdChyb290U2VsZWN0b3JPck5vZGUpO1xuICAgICAgICB2YXIgcm9vdENvbnRleHQgPSAoaXNJbnRlcm5hbFJvb3RWaWV3IHx8IGlzSXNvbGF0ZWQpID9cbiAgICAgICAgICAgIGNyZWF0ZVJvb3RDb250ZXh0KCkgOlxuICAgICAgICAgICAgcm9vdFZpZXdJbmplY3Rvci5nZXQoUk9PVF9DT05URVhUKTtcbiAgICAgICAgdmFyIHJlbmRlcmVyID0gcmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKGhvc3RSTm9kZSwgdGhpcy5jb21wb25lbnREZWYpO1xuICAgICAgICBpZiAocm9vdFNlbGVjdG9yT3JOb2RlICYmIGhvc3RSTm9kZSkge1xuICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldEF0dHJpYnV0ZSsrO1xuICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID9cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUoaG9zdFJOb2RlLCAnbmctdmVyc2lvbicsIFZFUlNJT04uZnVsbCkgOlxuICAgICAgICAgICAgICAgIGhvc3RSTm9kZS5zZXRBdHRyaWJ1dGUoJ25nLXZlcnNpb24nLCBWRVJTSU9OLmZ1bGwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcm9vdCB2aWV3LiBVc2VzIGVtcHR5IFRWaWV3IGFuZCBDb250ZW50VGVtcGxhdGUuXG4gICAgICAgIHZhciByb290TFZpZXcgPSBjcmVhdGVMVmlldyhudWxsLCBjcmVhdGVUVmlldygtMSwgbnVsbCwgMSwgMCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCksIHJvb3RDb250ZXh0LCByb290RmxhZ3MsIG51bGwsIG51bGwsIHJlbmRlcmVyRmFjdG9yeSwgcmVuZGVyZXIsIHNhbml0aXplciwgcm9vdFZpZXdJbmplY3Rvcik7XG4gICAgICAgIC8vIHJvb3RWaWV3IGlzIHRoZSBwYXJlbnQgd2hlbiBib290c3RyYXBwaW5nXG4gICAgICAgIHZhciBvbGRMVmlldyA9IGVudGVyVmlldyhyb290TFZpZXcsIG51bGwpO1xuICAgICAgICB2YXIgY29tcG9uZW50O1xuICAgICAgICB2YXIgdEVsZW1lbnROb2RlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudFZpZXcgPSBjcmVhdGVSb290Q29tcG9uZW50Vmlldyhob3N0Uk5vZGUsIHRoaXMuY29tcG9uZW50RGVmLCByb290TFZpZXcsIHJlbmRlcmVyRmFjdG9yeSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgdEVsZW1lbnROb2RlID0gZ2V0VE5vZGUoMCwgcm9vdExWaWV3KTtcbiAgICAgICAgICAgIGlmIChwcm9qZWN0YWJsZU5vZGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJvamVjdGFibGUgbm9kZXMgY2FuIGJlIHBhc3NlZCBhcyBhcnJheSBvZiBhcnJheXMgb3IgYW4gYXJyYXkgb2YgaXRlcmFibGVzIChuZ1VwZ3JhZGVcbiAgICAgICAgICAgICAgICAvLyBjYXNlKS4gSGVyZSB3ZSBkbyBub3JtYWxpemUgcGFzc2VkIGRhdGEgc3RydWN0dXJlIHRvIGJlIGFuIGFycmF5IG9mIGFycmF5cyB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIGNvbXBsZXggY2hlY2tzIGRvd24gdGhlIGxpbmUuXG4gICAgICAgICAgICAgICAgdEVsZW1lbnROb2RlLnByb2plY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0YWJsZU5vZGVzLm1hcChmdW5jdGlvbiAobm9kZXNmb3JTbG90KSB7IHJldHVybiBBcnJheS5mcm9tKG5vZGVzZm9yU2xvdCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIExpZmVjeWNsZUhvb2tzRmVhdHVyZSBhbmQgb3RoZXIgaG9zdCBmZWF0dXJlcyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZWQgaGVyZT9cbiAgICAgICAgICAgIC8vIEFuZ3VsYXIgNSByZWZlcmVuY2U6IGh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9saWZlY3ljbGUtaG9va3MtdmNyZWZcbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVJvb3RDb21wb25lbnQoY29tcG9uZW50VmlldywgdGhpcy5jb21wb25lbnREZWYsIHJvb3RMVmlldywgcm9vdENvbnRleHQsIFtMaWZlY3ljbGVIb29rc0ZlYXR1cmVdKTtcbiAgICAgICAgICAgIGFkZFRvVmlld1RyZWUocm9vdExWaWV3LCBjb21wb25lbnRWaWV3KTtcbiAgICAgICAgICAgIHJlZnJlc2hEZXNjZW5kYW50Vmlld3Mocm9vdExWaWV3KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGxlYXZlVmlldyhvbGRMVmlldyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXBvbmVudFJlZiA9IG5ldyBDb21wb25lbnRSZWYkMSh0aGlzLmNvbXBvbmVudFR5cGUsIGNvbXBvbmVudCwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0RWxlbWVudE5vZGUsIHJvb3RMVmlldyksIHJvb3RMVmlldywgdEVsZW1lbnROb2RlKTtcbiAgICAgICAgaWYgKGlzSW50ZXJuYWxSb290Vmlldykge1xuICAgICAgICAgICAgLy8gVGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgaW50ZXJuYWwgcm9vdCB2aWV3IGlzIGF0dGFjaGVkIHRvIHRoZSBjb21wb25lbnQncyBob3N0IHZpZXcgbm9kZVxuICAgICAgICAgICAgY29tcG9uZW50UmVmLmhvc3RWaWV3Ll90Vmlld05vZGUuY2hpbGQgPSB0RWxlbWVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb25lbnRGYWN0b3J5O1xufShDb21wb25lbnRGYWN0b3J5KSk7XG52YXIgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gbmV3IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciQxKCk7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYSBDb21wb25lbnQgY3JlYXRlZCB2aWEgYSB7QGxpbmsgQ29tcG9uZW50RmFjdG9yeX0uXG4gKlxuICogYENvbXBvbmVudFJlZmAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBDb21wb25lbnQgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpc1xuICogQ29tcG9uZW50IEluc3RhbmNlIGFuZCBhbGxvd3MgeW91IHRvIGRlc3Ryb3kgdGhlIENvbXBvbmVudCBJbnN0YW5jZSB2aWEgdGhlIHtAbGluayAjZGVzdHJveX1cbiAqIG1ldGhvZC5cbiAqXG4gKi9cbnZhciBDb21wb25lbnRSZWYkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29tcG9uZW50UmVmLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENvbXBvbmVudFJlZihjb21wb25lbnRUeXBlLCBpbnN0YW5jZSwgbG9jYXRpb24sIF9yb290TFZpZXcsIF90Tm9kZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICBfdGhpcy5fcm9vdExWaWV3ID0gX3Jvb3RMVmlldztcbiAgICAgICAgX3RoaXMuX3ROb2RlID0gX3ROb2RlO1xuICAgICAgICBfdGhpcy5kZXN0cm95Q2JzID0gW107XG4gICAgICAgIF90aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIF90aGlzLmhvc3RWaWV3ID0gX3RoaXMuY2hhbmdlRGV0ZWN0b3JSZWYgPSBuZXcgUm9vdFZpZXdSZWYoX3Jvb3RMVmlldyk7XG4gICAgICAgIF90aGlzLmhvc3RWaWV3Ll90Vmlld05vZGUgPSBhc3NpZ25UVmlld05vZGVUb0xWaWV3KF9yb290TFZpZXdbVFZJRVddLCBudWxsLCAtMSwgX3Jvb3RMVmlldyk7XG4gICAgICAgIF90aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnRSZWYucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTm9kZUluamVjdG9yKHRoaXMuX3ROb2RlLCB0aGlzLl9yb290TFZpZXcpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBDb21wb25lbnRSZWYucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7XG4gICAgICAgIHRoaXMuZGVzdHJveUNicy5mb3JFYWNoKGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfSk7XG4gICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7XG4gICAgICAgICF0aGlzLmhvc3RWaWV3LmRlc3Ryb3llZCAmJiB0aGlzLmhvc3RWaWV3LmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIENvbXBvbmVudFJlZi5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7XG4gICAgICAgIHRoaXMuZGVzdHJveUNicy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb25lbnRSZWY7XG59KENvbXBvbmVudFJlZikpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIE5PVEU6IGNoYW5nZXMgdG8gdGhlIGBuZ0kxOG5DbG9zdXJlTW9kZWAgbmFtZSBtdXN0IGJlIHN5bmNlZCB3aXRoIGBjb21waWxlci1jbGkvc3JjL3Rvb2xpbmcudHNgLlxuICovXG5pZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIFRoZXNlIHByb3BlcnR5IGFjY2Vzc2VzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2UgbmdJMThuQ2xvc3VyZU1vZGUgd2lsbCBiZSBzZXQgdG8gZmFsc2VcbiAgICAvLyB3aGVuIG9wdGltaXppbmcgY29kZSBhbmQgdGhlIHdob2xlIGlmIHN0YXRlbWVudCB3aWxsIGJlIGRyb3BwZWQuXG4gICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nSTE4bkNsb3N1cmVNb2RlIGFzIFsnbmdJMThuQ2xvc3VyZU1vZGUnXSBmb3IgY2xvc3VyZS5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzXG4gICAgX2dsb2JhbFsnbmdJMThuQ2xvc3VyZU1vZGUnXSA9XG4gICAgICAgIC8vIFRPRE8oRlctMTI1MCk6IHZhbGlkYXRlIHRoYXQgdGhpcyBhY3R1YWxseSwgeW91IGtub3csIHdvcmtzLlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzXG4gICAgICAgIHR5cGVvZiBnb29nICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ29vZy5nZXRNc2cgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuKiBFcXVpdmFsZW50IHRvIEVTNiBzcHJlYWQsIGFkZCBlYWNoIGl0ZW0gdG8gYW4gYXJyYXkuXG4qXG4qIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgdG8gYWRkXG4qIEBwYXJhbSBhcnIgVGhlIGFycmF5IHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCB0aGUgaXRlbXNcbiovXG5mdW5jdGlvbiBhZGRBbGxUb0FycmF5KGl0ZW1zLCBhcnIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyci5wdXNoKGl0ZW1zW2ldKTtcbiAgICB9XG59XG4vKipcbiAqIEZsYXR0ZW5zIGFuIGFycmF5LlxuICovXG5mdW5jdGlvbiBmbGF0dGVuKGxpc3QsIGRzdCkge1xuICAgIGlmIChkc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgZHN0ID0gbGlzdDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbmxpbmUgaXQuXG4gICAgICAgICAgICBpZiAoZHN0ID09PSBsaXN0KSB7XG4gICAgICAgICAgICAgICAgLy8gT3VyIGFzc3VtcHRpb24gdGhhdCB0aGUgbGlzdCB3YXMgYWxyZWFkeSBmbGF0IHdhcyB3cm9uZyBhbmRcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsb25lIGZsYXQgc2luY2Ugd2UgbmVlZCB0byB3cml0ZSB0byBpdC5cbiAgICAgICAgICAgICAgICBkc3QgPSBsaXN0LnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhdHRlbihpdGVtLCBkc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRzdCAhPT0gbGlzdCkge1xuICAgICAgICAgICAgZHN0LnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRzdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIE1BUktFUiA9IFwiXFx1RkZGRFwiO1xudmFyIElDVV9CTE9DS19SRUdFWFAgPSAvXlxccyoo77+9XFxkKzo/XFxkKu+/vSlcXHMqLFxccyooc2VsZWN0fHBsdXJhbClcXHMqLC87XG52YXIgU1VCVEVNUExBVEVfUkVHRVhQID0gL++/vVxcLz9cXCooXFxkKzpcXGQrKe+/vS9naTtcbnZhciBQSF9SRUdFWFAgPSAv77+9KFxcLz9bIypdXFxkKyk6P1xcZCrvv70vZ2k7XG52YXIgQklORElOR19SRUdFWFAgPSAv77+9KFxcZCspOj9cXGQq77+9L2dpO1xudmFyIElDVV9SRUdFWFAgPSAvKHtcXHMq77+9XFxkKzo/XFxkKu+/vVxccyosXFxzKlxcU3s2fVxccyosW1xcc1xcU10qfSkvZ2k7XG4vLyBpMThuUG9zdHByb2Nlc3MgY29uc3RzXG52YXIgUk9PVF9URU1QTEFURV9JRCA9IDA7XG52YXIgUFBfTVVMVElfVkFMVUVfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC9cXFso77+9Lis/77+9PylcXF0vO1xudmFyIFBQX1BMQUNFSE9MREVSU19SRUdFWFAgPSAvXFxbKO+/vS4rP++/vT8pXFxdfCjvv71cXC8/XFwqXFxkKzpcXGQr77+9KS9nO1xudmFyIFBQX0lDVV9WQVJTX1JFR0VYUCA9IC8oe1xccyopKFZBUl8oUExVUkFMfFNFTEVDVCkoX1xcZCspPykoXFxzKiwpL2c7XG52YXIgUFBfSUNVU19SRUdFWFAgPSAv77+9STE4Tl9FWFBfKElDVShfXFxkKyk/Ke+/vS9nO1xudmFyIFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUCA9IC9cXC9cXCovO1xudmFyIFBQX1RFTVBMQVRFX0lEX1JFR0VYUCA9IC9cXGQrXFw6KFxcZCspLztcbi8qKlxuICogQnJlYWtzIHBhdHRlcm4gaW50byBzdHJpbmdzIGFuZCB0b3AgbGV2ZWwgey4uLn0gYmxvY2tzLlxuICogQ2FuIGJlIHVzZWQgdG8gYnJlYWsgYSBtZXNzYWdlIGludG8gdGV4dCBhbmQgSUNVIGV4cHJlc3Npb25zLCBvciB0byBicmVhayBhbiBJQ1UgZXhwcmVzc2lvbiBpbnRvXG4gKiBrZXlzIGFuZCBjYXNlcy5cbiAqIE9yaWdpbmFsIGNvZGUgZnJvbSBjbG9zdXJlIGxpYnJhcnksIG1vZGlmaWVkIGZvciBBbmd1bGFyLlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJuIChzdWIpUGF0dGVybiB0byBiZSBicm9rZW4uXG4gKlxuICovXG5mdW5jdGlvbiBleHRyYWN0UGFydHMocGF0dGVybikge1xuICAgIGlmICghcGF0dGVybikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHZhciBwcmV2UG9zID0gMDtcbiAgICB2YXIgYnJhY2VTdGFjayA9IFtdO1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIGJyYWNlcyA9IC9be31dL2c7XG4gICAgLy8gbGFzdEluZGV4IGRvZXNuJ3QgZ2V0IHNldCB0byAwIHNvIHdlIGhhdmUgdG8uXG4gICAgYnJhY2VzLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG1hdGNoO1xuICAgIHdoaWxlIChtYXRjaCA9IGJyYWNlcy5leGVjKHBhdHRlcm4pKSB7XG4gICAgICAgIHZhciBwb3MgPSBtYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKG1hdGNoWzBdID09ICd9Jykge1xuICAgICAgICAgICAgYnJhY2VTdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGlmIChicmFjZVN0YWNrLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRW5kIG9mIHRoZSBibG9jay5cbiAgICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBwYXR0ZXJuLnN1YnN0cmluZyhwcmV2UG9zLCBwb3MpO1xuICAgICAgICAgICAgICAgIGlmIChJQ1VfQkxPQ0tfUkVHRVhQLnRlc3QoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJzZUlDVUJsb2NrKGJsb2NrKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrKSB7IC8vIERvbid0IHB1c2ggZW1wdHkgc3RyaW5nc1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goYmxvY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcmV2UG9zID0gcG9zICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChicmFjZVN0YWNrLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1YnN0cmluZ18xID0gcGF0dGVybi5zdWJzdHJpbmcocHJldlBvcywgcG9zKTtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goc3Vic3RyaW5nXzEpO1xuICAgICAgICAgICAgICAgIHByZXZQb3MgPSBwb3MgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJhY2VTdGFjay5wdXNoKCd7Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN1YnN0cmluZyA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MpO1xuICAgIGlmIChzdWJzdHJpbmcgIT0gJycpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHN1YnN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xufVxuLyoqXG4gKiBQYXJzZXMgdGV4dCBjb250YWluaW5nIGFuIElDVSBleHByZXNzaW9uIGFuZCBwcm9kdWNlcyBhIEpTT04gb2JqZWN0IGZvciBpdC5cbiAqIE9yaWdpbmFsIGNvZGUgZnJvbSBjbG9zdXJlIGxpYnJhcnksIG1vZGlmaWVkIGZvciBBbmd1bGFyLlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJuIFRleHQgY29udGFpbmluZyBhbiBJQ1UgZXhwcmVzc2lvbiB0aGF0IG5lZWRzIHRvIGJlIHBhcnNlZC5cbiAqXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSUNVQmxvY2socGF0dGVybikge1xuICAgIHZhciBjYXNlcyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB2YXIgaWN1VHlwZSA9IDEgLyogcGx1cmFsICovO1xuICAgIHZhciBtYWluQmluZGluZyA9IDA7XG4gICAgcGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZShJQ1VfQkxPQ0tfUkVHRVhQLCBmdW5jdGlvbiAoc3RyLCBiaW5kaW5nLCB0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgaWN1VHlwZSA9IDAgLyogc2VsZWN0ICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWN1VHlwZSA9IDEgLyogcGx1cmFsICovO1xuICAgICAgICB9XG4gICAgICAgIG1haW5CaW5kaW5nID0gcGFyc2VJbnQoYmluZGluZy5zdWJzdHIoMSksIDEwKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuICAgIHZhciBwYXJ0cyA9IGV4dHJhY3RQYXJ0cyhwYXR0ZXJuKTtcbiAgICAvLyBMb29raW5nIGZvciAoa2V5IGJsb2NrKSsgc2VxdWVuY2UuIE9uZSBvZiB0aGUga2V5cyBoYXMgdG8gYmUgXCJvdGhlclwiLlxuICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHBhcnRzLmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcnRzW3BvcysrXS50cmltKCk7XG4gICAgICAgIGlmIChpY3VUeXBlID09PSAxIC8qIHBsdXJhbCAqLykge1xuICAgICAgICAgICAgLy8gS2V5IGNhbiBiZSBcIj14XCIsIHdlIGp1c3Qgd2FudCBcInhcIlxuICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xccyooPzo9KT8oXFx3KylcXHMqLywgJyQxJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmxvY2tzID0gZXh0cmFjdFBhcnRzKHBhcnRzW3BvcysrXSk7XG4gICAgICAgIGlmIChibG9ja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChibG9ja3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2VydEdyZWF0ZXJUaGFuKGNhc2VzLmluZGV4T2YoJ290aGVyJyksIC0xLCAnTWlzc2luZyBrZXkgXCJvdGhlclwiIGluIElDVSBzdGF0ZW1lbnQuJyk7XG4gICAgLy8gVE9ETyhvY29tYmUpOiBzdXBwb3J0IElDVSBleHByZXNzaW9ucyBpbiBhdHRyaWJ1dGVzLCBzZWUgIzIxNjE1XG4gICAgcmV0dXJuIHsgdHlwZTogaWN1VHlwZSwgbWFpbkJpbmRpbmc6IG1haW5CaW5kaW5nLCBjYXNlczogY2FzZXMsIHZhbHVlczogdmFsdWVzIH07XG59XG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBpbnNpZGUgdGhlIHN1Yi10ZW1wbGF0ZXMgb2YgYSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiByZW1vdmVJbm5lclRlbXBsYXRlVHJhbnNsYXRpb24obWVzc2FnZSkge1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaW5UZW1wbGF0ZSA9IGZhbHNlO1xuICAgIHZhciB0YWdNYXRjaGVkO1xuICAgIHdoaWxlICgobWF0Y2ggPSBTVUJURU1QTEFURV9SRUdFWFAuZXhlYyhtZXNzYWdlKSkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFpblRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXMgKz0gbWVzc2FnZS5zdWJzdHJpbmcoaW5kZXgsIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgIHRhZ01hdGNoZWQgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGluVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1hdGNoWzBdID09PSBNQVJLRVIgKyBcIi8qXCIgKyB0YWdNYXRjaGVkICsgTUFSS0VSKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICAgICAgICAgICAgICBpblRlbXBsYXRlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmdEZXZNb2RlICYmXG4gICAgICAgIGFzc2VydEVxdWFsKGluVGVtcGxhdGUsIGZhbHNlLCBcIlRhZyBtaXNtYXRjaDogdW5hYmxlIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgc3ViLXRlbXBsYXRlIGluIHRoZSB0cmFuc2xhdGlvbiBcXFwiXCIgKyBtZXNzYWdlICsgXCJcXFwiXCIpO1xuICAgIHJlcyArPSBtZXNzYWdlLnN1YnN0cihpbmRleCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogRXh0cmFjdHMgYSBwYXJ0IG9mIGEgbWVzc2FnZSBhbmQgcmVtb3ZlcyB0aGUgcmVzdC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBleHRyYWN0aW5nIGEgcGFydCBvZiB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggYSB0ZW1wbGF0ZS4gQSB0cmFuc2xhdGVkXG4gKiBtZXNzYWdlIGNhbiBzcGFuIG11bHRpcGxlIHRlbXBsYXRlcy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiA8ZGl2IGkxOG4+VHJhbnNsYXRlIDxzcGFuICpuZ0lmPm1lPC9zcGFuPiE8L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGNyb3BcbiAqIEBwYXJhbSBzdWJUZW1wbGF0ZUluZGV4IEluZGV4IG9mIHRoZSBzdWItdGVtcGxhdGUgdG8gZXh0cmFjdC4gSWYgdW5kZWZpbmVkIGl0IHJldHVybnMgdGhlXG4gKiBleHRlcm5hbCB0ZW1wbGF0ZSBhbmQgcmVtb3ZlcyBhbGwgc3ViLXRlbXBsYXRlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25Gb3JUZW1wbGF0ZShtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBzdWJUZW1wbGF0ZUluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBXZSB3YW50IHRoZSByb290IHRlbXBsYXRlIG1lc3NhZ2UsIGlnbm9yZSBhbGwgc3ViLXRlbXBsYXRlc1xuICAgICAgICByZXR1cm4gcmVtb3ZlSW5uZXJUZW1wbGF0ZVRyYW5zbGF0aW9uKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gV2Ugd2FudCBhIHNwZWNpZmljIHN1Yi10ZW1wbGF0ZVxuICAgICAgICB2YXIgc3RhcnQgPSBtZXNzYWdlLmluZGV4T2YoXCI6XCIgKyBzdWJUZW1wbGF0ZUluZGV4ICsgTUFSS0VSKSArIDIgKyBzdWJUZW1wbGF0ZUluZGV4LnRvU3RyaW5nKCkubGVuZ3RoO1xuICAgICAgICB2YXIgZW5kID0gbWVzc2FnZS5zZWFyY2gobmV3IFJlZ0V4cChNQVJLRVIgKyBcIlxcXFwvXFxcXCpcXFxcZCs6XCIgKyBzdWJUZW1wbGF0ZUluZGV4ICsgTUFSS0VSKSk7XG4gICAgICAgIHJldHVybiByZW1vdmVJbm5lclRlbXBsYXRlVHJhbnNsYXRpb24obWVzc2FnZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpO1xuICAgIH1cbn1cbi8qKlxuICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgdG8gdXBkYXRlIHRoZSBiaW5kaW5ncyBvZiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYmluZGluZ3MuXG4gKiBAcGFyYW0gZGVzdGluYXRpb25Ob2RlIEluZGV4IG9mIHRoZSBkZXN0aW5hdGlvbiBub2RlIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgYmluZGluZy5cbiAqIEBwYXJhbSBhdHRyTmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGlmIHRoZSBzdHJpbmcgYmVsb25ncyB0byBhbiBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0gc2FuaXRpemVGbiBTYW5pdGl6YXRpb24gZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgc3RyaW5nIGFmdGVyIHVwZGF0ZSwgaWYgbmVjZXNzYXJ5LlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHN0ciwgZGVzdGluYXRpb25Ob2RlLCBhdHRyTmFtZSwgc2FuaXRpemVGbikge1xuICAgIGlmIChzYW5pdGl6ZUZuID09PSB2b2lkIDApIHsgc2FuaXRpemVGbiA9IG51bGw7IH1cbiAgICB2YXIgdXBkYXRlT3BDb2RlcyA9IFtudWxsLCBudWxsXTsgLy8gQWxsb2Mgc3BhY2UgZm9yIG1hc2sgYW5kIHNpemVcbiAgICB2YXIgdGV4dFBhcnRzID0gc3RyLnNwbGl0KEJJTkRJTkdfUkVHRVhQKTtcbiAgICB2YXIgbWFzayA9IDA7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB0ZXh0UGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHRleHRWYWx1ZSA9IHRleHRQYXJ0c1tqXTtcbiAgICAgICAgaWYgKGogJiAxKSB7XG4gICAgICAgICAgICAvLyBPZGQgaW5kZXhlcyBhcmUgYmluZGluZ3NcbiAgICAgICAgICAgIHZhciBiaW5kaW5nSW5kZXggPSBwYXJzZUludCh0ZXh0VmFsdWUsIDEwKTtcbiAgICAgICAgICAgIHVwZGF0ZU9wQ29kZXMucHVzaCgtMSAtIGJpbmRpbmdJbmRleCk7XG4gICAgICAgICAgICBtYXNrID0gbWFzayB8IHRvTWFza0JpdChiaW5kaW5nSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRleHRWYWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dFxuICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRleHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlT3BDb2Rlcy5wdXNoKGRlc3RpbmF0aW9uTm9kZSA8PCAyIC8qIFNISUZUX1JFRiAqLyB8XG4gICAgICAgIChhdHRyTmFtZSA/IDEgLyogQXR0ciAqLyA6IDAgLyogVGV4dCAqLykpO1xuICAgIGlmIChhdHRyTmFtZSkge1xuICAgICAgICB1cGRhdGVPcENvZGVzLnB1c2goYXR0ck5hbWUsIHNhbml0aXplRm4pO1xuICAgIH1cbiAgICB1cGRhdGVPcENvZGVzWzBdID0gbWFzaztcbiAgICB1cGRhdGVPcENvZGVzWzFdID0gdXBkYXRlT3BDb2Rlcy5sZW5ndGggLSAyO1xuICAgIHJldHVybiB1cGRhdGVPcENvZGVzO1xufVxuZnVuY3Rpb24gZ2V0QmluZGluZ01hc2soaWN1RXhwcmVzc2lvbiwgbWFzaykge1xuICAgIGlmIChtYXNrID09PSB2b2lkIDApIHsgbWFzayA9IDA7IH1cbiAgICBtYXNrID0gbWFzayB8IHRvTWFza0JpdChpY3VFeHByZXNzaW9uLm1haW5CaW5kaW5nKTtcbiAgICB2YXIgbWF0Y2g7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpY3VFeHByZXNzaW9uLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgdmFsdWVBcnIgPSBpY3VFeHByZXNzaW9uLnZhbHVlc1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWx1ZUFyci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVBcnJbal07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaCA9IEJJTkRJTkdfUkVHRVhQLmV4ZWModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hc2sgPSBtYXNrIHwgdG9NYXNrQml0KHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hc2sgPSBnZXRCaW5kaW5nTWFzayh2YWx1ZSwgbWFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hc2s7XG59XG52YXIgaTE4bkluZGV4U3RhY2sgPSBbXTtcbnZhciBpMThuSW5kZXhTdGFja1BvaW50ZXIgPSAtMTtcbi8qKlxuICogQ29udmVydCBiaW5kaW5nIGluZGV4IHRvIG1hc2sgYml0LlxuICpcbiAqIEVhY2ggaW5kZXggcmVwcmVzZW50cyBhIHNpbmdsZSBiaXQgb24gdGhlIGJpdC1tYXNrLiBCZWNhdXNlIGJpdC1tYXNrIG9ubHkgaGFzIDMyIGJpdHMsIHdlIG1ha2VcbiAqIHRoZSAzMm5kIGJpdCBzaGFyZSBhbGwgbWFza3MgZm9yIGFsbCBiaW5kaW5ncyBoaWdoZXIgdGhhbiAzMi4gU2luY2UgaXQgaXMgZXh0cmVtZWx5IHJhcmUgdG8gaGF2ZVxuICogbW9yZSB0aGFuIDMyIGJpbmRpbmdzIHRoaXMgd2lsbCBiZSBoaXQgdmVyeSByYXJlbHkuIFRoZSBkb3duc2lkZSBvZiBoaXR0aW5nIHRoaXMgY29ybmVyIGNhc2UgaXNcbiAqIHRoYXQgd2Ugd2lsbCBleGVjdXRlIGJpbmRpbmcgY29kZSBtb3JlIG9mdGVuIHRoYW4gbmVjZXNzYXJ5LiAocGVuYWx0eSBvZiBwZXJmb3JtYW5jZSlcbiAqL1xuZnVuY3Rpb24gdG9NYXNrQml0KGJpbmRpbmdJbmRleCkge1xuICAgIHJldHVybiAxIDw8IE1hdGgubWluKGJpbmRpbmdJbmRleCwgMzEpO1xufVxudmFyIHBhcmVudEluZGV4U3RhY2sgPSBbXTtcbi8qKlxuICogTWFya3MgYSBibG9jayBvZiB0ZXh0IGFzIHRyYW5zbGF0YWJsZS5cbiAqXG4gKiBUaGUgaW5zdHJ1Y3Rpb25zIGBpMThuU3RhcnRgIGFuZCBgaTE4bkVuZGAgbWFyayB0aGUgdHJhbnNsYXRpb24gYmxvY2sgaW4gdGhlIHRlbXBsYXRlLlxuICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heVxuICogY29udGFpbiBwbGFjZWhvbGRlcnMgd2hpY2ggYXNzb2NpYXRlIGlubmVyIGVsZW1lbnRzIGFuZCBzdWItdGVtcGxhdGVzIHdpdGhpbiB0aGUgdHJhbnNsYXRpb24uXG4gKlxuICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOlxuICogLSBg77+9e2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqQmluZGluZyBQbGFjZWhvbGRlcio6IE1hcmtzIGEgbG9jYXRpb24gd2hlcmUgYW4gZXhwcmVzc2lvbiB3aWxsIGJlXG4gKiAgIGludGVycG9sYXRlZCBpbnRvLiBUaGUgcGxhY2Vob2xkZXIgYGluZGV4YCBwb2ludHMgdG8gdGhlIGV4cHJlc3Npb24gYmluZGluZyBpbmRleC4gQW4gb3B0aW9uYWxcbiAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuXG4gKiAtIGDvv70je2luZGV4fSg6e2Jsb2NrfSnvv71gL2Dvv70vI3tpbmRleH0oOntibG9ja30p77+9YDogKkVsZW1lbnQgUGxhY2Vob2xkZXIqOiAgTWFya3MgdGhlIGJlZ2lubmluZ1xuICogICBhbmQgZW5kIG9mIERPTSBlbGVtZW50IHRoYXQgd2VyZSBlbWJlZGRlZCBpbiB0aGUgb3JpZ2luYWwgdHJhbnNsYXRpb24gYmxvY2suIFRoZSBwbGFjZWhvbGRlclxuICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0XG4gKiAgIG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuXG4gKiAtIGDvv70qe2luZGV4fTp7YmxvY2t977+9YC9g77+9Lyp7aW5kZXh9OntibG9ja33vv71gOiAqU3ViLXRlbXBsYXRlIFBsYWNlaG9sZGVyKjogU3ViLXRlbXBsYXRlcyBtdXN0IGJlXG4gKiAgIHNwbGl0IHVwIGFuZCB0cmFuc2xhdGVkIHNlcGFyYXRlbHkgaW4gZWFjaCBhbmd1bGFyIHRlbXBsYXRlIGZ1bmN0aW9uLiBUaGUgYGluZGV4YCBwb2ludHMgdG8gdGhlXG4gKiAgIGB0ZW1wbGF0ZWAgaW5zdHJ1Y3Rpb24gaW5kZXguIEEgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuXG4gKlxuICogQHBhcmFtIGluZGV4IEEgdW5pcXVlIGluZGV4IG9mIHRoZSB0cmFuc2xhdGlvbiBpbiB0aGUgc3RhdGljIGJsb2NrLlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIHRyYW5zbGF0aW9uIG1lc3NhZ2UuXG4gKiBAcGFyYW0gc3ViVGVtcGxhdGVJbmRleCBPcHRpb25hbCBzdWItdGVtcGxhdGUgaW5kZXggaW4gdGhlIGBtZXNzYWdlYC5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1aTE4blN0YXJ0KGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7XG4gICAgdmFyIHRWaWV3ID0gZ2V0TFZpZXcoKVtUVklFV107XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIFwidFZpZXcgc2hvdWxkIGJlIGRlZmluZWRcIik7XG4gICAgaTE4bkluZGV4U3RhY2tbKytpMThuSW5kZXhTdGFja1BvaW50ZXJdID0gaW5kZXg7XG4gICAgaWYgKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzICYmIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9PT0gbnVsbCkge1xuICAgICAgICBpMThuU3RhcnRGaXJzdFBhc3ModFZpZXcsIGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTtcbiAgICB9XG59XG4vLyBDb3VudCBmb3IgdGhlIG51bWJlciBvZiB2YXJzIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggaTE4biBibG9jay5cbi8vIEl0IGlzIGdsb2JhbCBiZWNhdXNlIHRoaXMgaXMgdXNlZCBpbiBtdWx0aXBsZSBmdW5jdGlvbnMgdGhhdCBpbmNsdWRlIGxvb3BzIGFuZCByZWN1cnNpdmUgY2FsbHMuXG4vLyBUaGlzIGlzIHJlc2V0IHRvIDAgd2hlbiBgaTE4blN0YXJ0Rmlyc3RQYXNzYCBpcyBjYWxsZWQuXG52YXIgaTE4blZhcnNDb3VudDtcbi8qKlxuICogU2VlIGBpMThuU3RhcnRgIGFib3ZlLlxuICovXG5mdW5jdGlvbiBpMThuU3RhcnRGaXJzdFBhc3ModFZpZXcsIGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7XG4gICAgdmFyIHZpZXdEYXRhID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRWaWV3LmJsdWVwcmludC5sZW5ndGggLSBIRUFERVJfT0ZGU0VUO1xuICAgIGkxOG5WYXJzQ291bnQgPSAwO1xuICAgIHZhciBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICB2YXIgcGFyZW50VE5vZGUgPSBnZXRJc1BhcmVudCgpID8gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCkgOlxuICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBwYXJlbnRUTm9kZSAmJiBwYXJlbnRUTm9kZSAhPT0gdmlld0RhdGFbVF9IT1NUXSA/IHBhcmVudFROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCA6IGluZGV4O1xuICAgIHZhciBwYXJlbnRJbmRleFBvaW50ZXIgPSAwO1xuICAgIHBhcmVudEluZGV4U3RhY2tbcGFyZW50SW5kZXhQb2ludGVyXSA9IHBhcmVudEluZGV4O1xuICAgIHZhciBjcmVhdGVPcENvZGVzID0gW107XG4gICAgLy8gSWYgdGhlIHByZXZpb3VzIG5vZGUgd2Fzbid0IHRoZSBkaXJlY3QgcGFyZW50IHRoZW4gd2UgaGF2ZSBhIHRyYW5zbGF0aW9uIHdpdGhvdXQgdG9wIGxldmVsXG4gICAgLy8gZWxlbWVudCBhbmQgd2UgbmVlZCB0byBrZWVwIGEgcmVmZXJlbmNlIG9mIHRoZSBwcmV2aW91cyBlbGVtZW50IGlmIHRoZXJlIGlzIG9uZVxuICAgIGlmIChpbmRleCA+IDAgJiYgcHJldmlvdXNPclBhcmVudFROb2RlICE9PSBwYXJlbnRUTm9kZSkge1xuICAgICAgICAvLyBDcmVhdGUgYW4gT3BDb2RlIHRvIHNlbGVjdCB0aGUgcHJldmlvdXMgVE5vZGVcbiAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKHByZXZpb3VzT3JQYXJlbnRUTm9kZS5pbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDAgLyogU2VsZWN0ICovKTtcbiAgICB9XG4gICAgdmFyIHVwZGF0ZU9wQ29kZXMgPSBbXTtcbiAgICB2YXIgaWN1RXhwcmVzc2lvbnMgPSBbXTtcbiAgICB2YXIgdGVtcGxhdGVUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uRm9yVGVtcGxhdGUobWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCk7XG4gICAgdmFyIG1zZ1BhcnRzID0gdGVtcGxhdGVUcmFuc2xhdGlvbi5zcGxpdChQSF9SRUdFWFApO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHZhbHVlID0gbXNnUGFydHNbaV07XG4gICAgICAgIGlmIChpICYgMSkge1xuICAgICAgICAgICAgLy8gT2RkIGluZGV4ZXMgYXJlIHBsYWNlaG9sZGVycyAoZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMpXG4gICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGNsb3NpbmcgdGFnXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgxKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwaEluZGV4ID0gcGFyc2VJbnQodmFsdWUuc3Vic3RyKDIpLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4ID0gcGFyZW50SW5kZXhTdGFja1stLXBhcmVudEluZGV4UG9pbnRlcl07XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wQ29kZXMucHVzaChwaEluZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNSAvKiBFbGVtZW50RW5kICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcGhJbmRleCA9IHBhcnNlSW50KHZhbHVlLnN1YnN0cigxKSwgMTApO1xuICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSByZXByZXNlbnRzIGEgcGxhY2Vob2xkZXIgdGhhdCB3ZSBtb3ZlIHRvIHRoZSBkZXNpZ25hdGVkIGluZGV4XG4gICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKHBoSW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAwIC8qIFNlbGVjdCAqLywgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4U3RhY2tbKytwYXJlbnRJbmRleFBvaW50ZXJdID0gcGFyZW50SW5kZXggPSBwaEluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzICYgSUNVIGV4cHJlc3Npb25zKVxuICAgICAgICAgICAgdmFyIHBhcnRzID0gZXh0cmFjdFBhcnRzKHZhbHVlKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaiAmIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT2RkIGluZGV4ZXMgYXJlIElDVSBleHByZXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbW1lbnQgbm9kZSB0aGF0IHdpbGwgYW5jaG9yIHRoZSBJQ1UgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICB2YXIgaWN1Tm9kZUluZGV4ID0gc3RhcnRJbmRleCArIGkxOG5WYXJzQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKENPTU1FTlRfTUFSS0VSLCBuZ0Rldk1vZGUgPyBcIklDVSBcIiArIGljdU5vZGVJbmRleCA6ICcnLCBpY3VOb2RlSW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29kZXMgZm9yIHRoZSBJQ1UgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICB2YXIgaWN1RXhwcmVzc2lvbiA9IHBhcnRzW2pdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWFzayA9IGdldEJpbmRpbmdNYXNrKGljdUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICBpY3VTdGFydChpY3VFeHByZXNzaW9ucywgaWN1RXhwcmVzc2lvbiwgaWN1Tm9kZUluZGV4LCBpY3VOb2RlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHJlY3Vyc2l2ZSwgdGhlIGxhc3QgVEljdSB0aGF0IHdhcyBwdXNoZWQgaXMgdGhlIG9uZSB3ZSB3YW50XG4gICAgICAgICAgICAgICAgICAgIHZhciB0SWN1SW5kZXggPSBpY3VFeHByZXNzaW9ucy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcENvZGVzLnB1c2godG9NYXNrQml0KGljdUV4cHJlc3Npb24ubWFpbkJpbmRpbmcpLCAvLyBtYXNrIG9mIHRoZSBtYWluIGJpbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLTEgLSBpY3VFeHByZXNzaW9uLm1haW5CaW5kaW5nLCBpY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAyIC8qIEljdVN3aXRjaCAqLywgdEljdUluZGV4LCBtYXNrLCAvLyBtYXNrIG9mIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhpcyBJQ1UgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAyLCAvLyBza2lwIDIgb3BDb2RlcyBpZiBub3QgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICBpY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgdEljdUluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFydHNbal0gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gcGFydHNbal07XG4gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzKVxuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzQmluZGluZyA9IHRleHQubWF0Y2goQklORElOR19SRUdFWFApO1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGV4dCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dE5vZGVJbmRleCA9IHN0YXJ0SW5kZXggKyBpMThuVmFyc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wQ29kZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBiaW5kaW5nLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgZHVyaW5nIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICBoYXNCaW5kaW5nID8gJycgOiB0ZXh0LCB0ZXh0Tm9kZUluZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2Rlcyh0ZXh0LCB0ZXh0Tm9kZUluZGV4KSwgdXBkYXRlT3BDb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWxsb2NFeHBhbmRvKHZpZXdEYXRhLCBpMThuVmFyc0NvdW50KTtcbiAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgYXR0YWNoSTE4bk9wQ29kZXNEZWJ1ZyhjcmVhdGVPcENvZGVzLCB1cGRhdGVPcENvZGVzLCBpY3VFeHByZXNzaW9ucy5sZW5ndGggPyBpY3VFeHByZXNzaW9ucyA6IG51bGwsIHZpZXdEYXRhKTtcbiAgICAvLyBOT1RFOiBsb2NhbCB2YXIgbmVlZGVkIHRvIHByb3Blcmx5IGFzc2VydCB0aGUgdHlwZSBvZiBgVEkxOG5gLlxuICAgIHZhciB0STE4biA9IHtcbiAgICAgICAgdmFyczogaTE4blZhcnNDb3VudCxcbiAgICAgICAgY3JlYXRlOiBjcmVhdGVPcENvZGVzLFxuICAgICAgICB1cGRhdGU6IHVwZGF0ZU9wQ29kZXMsXG4gICAgICAgIGljdXM6IGljdUV4cHJlc3Npb25zLmxlbmd0aCA/IGljdUV4cHJlc3Npb25zIDogbnVsbCxcbiAgICB9O1xuICAgIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9IHRJMThuO1xufVxuZnVuY3Rpb24gYXBwZW5kSTE4bk5vZGUodE5vZGUsIHBhcmVudFROb2RlLCBwcmV2aW91c1ROb2RlKSB7XG4gICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlck1vdmVOb2RlKys7XG4gICAgdmFyIG5leHROb2RlID0gdE5vZGUubmV4dDtcbiAgICB2YXIgdmlld0RhdGEgPSBnZXRMVmlldygpO1xuICAgIGlmICghcHJldmlvdXNUTm9kZSkge1xuICAgICAgICBwcmV2aW91c1ROb2RlID0gcGFyZW50VE5vZGU7XG4gICAgfVxuICAgIC8vIFJlLW9yZ2FuaXplIG5vZGUgdHJlZSB0byBwdXQgdGhpcyBub2RlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLlxuICAgIGlmIChwcmV2aW91c1ROb2RlID09PSBwYXJlbnRUTm9kZSAmJiB0Tm9kZSAhPT0gcGFyZW50VE5vZGUuY2hpbGQpIHtcbiAgICAgICAgdE5vZGUubmV4dCA9IHBhcmVudFROb2RlLmNoaWxkO1xuICAgICAgICBwYXJlbnRUTm9kZS5jaGlsZCA9IHROb2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChwcmV2aW91c1ROb2RlICE9PSBwYXJlbnRUTm9kZSAmJiB0Tm9kZSAhPT0gcHJldmlvdXNUTm9kZS5uZXh0KSB7XG4gICAgICAgIHROb2RlLm5leHQgPSBwcmV2aW91c1ROb2RlLm5leHQ7XG4gICAgICAgIHByZXZpb3VzVE5vZGUubmV4dCA9IHROb2RlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdE5vZGUubmV4dCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwYXJlbnRUTm9kZSAhPT0gdmlld0RhdGFbVF9IT1NUXSkge1xuICAgICAgICB0Tm9kZS5wYXJlbnQgPSBwYXJlbnRUTm9kZTtcbiAgICB9XG4gICAgLy8gSWYgdE5vZGUgd2FzIG1vdmVkIGFyb3VuZCwgd2UgbWlnaHQgbmVlZCB0byBmaXggYSBicm9rZW4gbGluay5cbiAgICB2YXIgY3Vyc29yID0gdE5vZGUubmV4dDtcbiAgICB3aGlsZSAoY3Vyc29yKSB7XG4gICAgICAgIGlmIChjdXJzb3IubmV4dCA9PT0gdE5vZGUpIHtcbiAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gbmV4dE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7XG4gICAgfVxuICAgIGFwcGVuZENoaWxkKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIHZpZXdEYXRhKSwgdE5vZGUsIHZpZXdEYXRhKTtcbiAgICB2YXIgc2xvdFZhbHVlID0gdmlld0RhdGFbdE5vZGUuaW5kZXhdO1xuICAgIGlmICh0Tm9kZS50eXBlICE9PSAwIC8qIENvbnRhaW5lciAqLyAmJiBpc0xDb250YWluZXIoc2xvdFZhbHVlKSkge1xuICAgICAgICAvLyBOb2RlcyB0aGF0IGluamVjdCBWaWV3Q29udGFpbmVyUmVmIGFsc28gaGF2ZSBhIGNvbW1lbnQgbm9kZSB0aGF0IHNob3VsZCBiZSBtb3ZlZFxuICAgICAgICBhcHBlbmRDaGlsZChzbG90VmFsdWVbTkFUSVZFXSwgdE5vZGUsIHZpZXdEYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHROb2RlO1xufVxuLyoqXG4gKiBIYW5kbGVzIG1lc3NhZ2Ugc3RyaW5nIHBvc3QtcHJvY2Vzc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uXG4gKlxuICogSGFuZGxlcyBtZXNzYWdlIHN0cmluZyBwb3N0LXByb2Nlc3NpbmcgYnkgdHJhbnNmb3JtaW5nIGl0IGZyb20gaW50ZXJtZWRpYXRlXG4gKiBmb3JtYXQgKHRoYXQgbWlnaHQgY29udGFpbiBzb21lIG1hcmtlcnMgdGhhdCB3ZSBuZWVkIHRvIHJlcGxhY2UpIHRvIHRoZSBmaW5hbFxuICogZm9ybSwgY29uc3VtYWJsZSBieSBpMThuU3RhcnQgaW5zdHJ1Y3Rpb24uIFBvc3QgcHJvY2Vzc2luZyBzdGVwcyBpbmNsdWRlOlxuICpcbiAqIDEuIFJlc29sdmUgYWxsIG11bHRpLXZhbHVlIGNhc2VzIChsaWtlIFvvv70qMTox77+977+9IzI6Me+/vXzvv70jNDox77+9fO+/vTXvv71dKVxuICogMi4gUmVwbGFjZSBhbGwgSUNVIHZhcnMgKGxpa2UgXCJWQVJfUExVUkFMXCIpXG4gKiAzLiBSZXBsYWNlIGFsbCBJQ1UgcmVmZXJlbmNlcyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzIChsaWtlIO+/vUlDVV9FWFBfSUNVXzHvv70pXG4gKiAgICBpbiBjYXNlIG11bHRpcGxlIElDVXMgaGF2ZSB0aGUgc2FtZSBwbGFjZWhvbGRlciBuYW1lXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgUmF3IHRyYW5zbGF0aW9uIHN0cmluZyBmb3IgcG9zdCBwcm9jZXNzaW5nXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnRzIFNldCBvZiByZXBsYWNlbWVudHMgdGhhdCBzaG91bGQgYmUgYXBwbGllZFxuICpcbiAqIEByZXR1cm5zIFRyYW5zZm9ybWVkIHN0cmluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBpMThuU3RhcnQgaW5zdHJ1Y3Rpb25cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1aTE4blBvc3Rwcm9jZXNzKG1lc3NhZ2UsIHJlcGxhY2VtZW50cykge1xuICAgIGlmIChyZXBsYWNlbWVudHMgPT09IHZvaWQgMCkgeyByZXBsYWNlbWVudHMgPSB7fTsgfVxuICAgIC8qKlxuICAgICAqIFN0ZXAgMTogcmVzb2x2ZSBhbGwgbXVsdGktdmFsdWUgcGxhY2Vob2xkZXJzIGxpa2UgW++/vSM177+9fO+/vSoxOjHvv73vv70jMjox77+9fO+/vSM0OjHvv71dXG4gICAgICpcbiAgICAgKiBOb3RlOiBkdWUgdG8gdGhlIHdheSB3ZSBwcm9jZXNzIG5lc3RlZCB0ZW1wbGF0ZXMgKEJGUyksIG11bHRpLXZhbHVlIHBsYWNlaG9sZGVycyBhcmUgdHlwaWNhbGx5XG4gICAgICogZ3JvdXBlZCBieSB0ZW1wbGF0ZXMsIGZvciBleGFtcGxlOiBb77+9IzXvv71877+9Izbvv71877+9IzE6Me+/vXzvv70jMzoy77+9XSB3aGVyZSDvv70jNe+/vSBhbmQg77+9Izbvv70gYmVsb25nIHRvIHJvb3RcbiAgICAgKiB0ZW1wbGF0ZSwg77+9IzE6Me+/vSBiZWxvbmcgdG8gbmVzdGVkIHRlbXBsYXRlIHdpdGggaW5kZXggMSBhbmQg77+9IzE6Mu+/vSAtIG5lc3RlZCB0ZW1wbGF0ZSB3aXRoIGluZGV4XG4gICAgICogMy4gSG93ZXZlciBpbiByZWFsIHRlbXBsYXRlcyB0aGUgb3JkZXIgbWlnaHQgYmUgZGlmZmVyZW50OiBpLmUuIO+/vSMxOjHvv70gYW5kL29yIO+/vSMzOjLvv70gbWF5IGdvIGluXG4gICAgICogZnJvbnQgb2Yg77+9Izbvv70uIFRoZSBwb3N0IHByb2Nlc3Npbmcgc3RlcCByZXN0b3JlcyB0aGUgcmlnaHQgb3JkZXIgYnkga2VlcGluZyB0cmFjayBvZiB0aGVcbiAgICAgKiB0ZW1wbGF0ZSBpZCBzdGFjayBhbmQgbG9va3MgZm9yIHBsYWNlaG9sZGVycyB0aGF0IGJlbG9uZyB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICB2YXIgcmVzdWx0ID0gbWVzc2FnZTtcbiAgICBpZiAoUFBfTVVMVElfVkFMVUVfUExBQ0VIT0xERVJTX1JFR0VYUC50ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgIHZhciBtYXRjaGVzXzEgPSB7fTtcbiAgICAgICAgdmFyIHRlbXBsYXRlSWRzU3RhY2tfMSA9IFtST09UX1RFTVBMQVRFX0lEXTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoUFBfUExBQ0VIT0xERVJTX1JFR0VYUCwgZnVuY3Rpb24gKG0sIHBocywgdG1wbCkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBwaHMgfHwgdG1wbDtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlc18xW2NvbnRlbnRdKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyc18xID0gW107XG4gICAgICAgICAgICAgICAgY29udGVudC5zcGxpdCgnfCcpLmZvckVhY2goZnVuY3Rpb24gKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHBsYWNlaG9sZGVyLm1hdGNoKFBQX1RFTVBMQVRFX0lEX1JFR0VYUCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUlkID0gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogUk9PVF9URU1QTEFURV9JRDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ2xvc2VUZW1wbGF0ZVRhZyA9IFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUC50ZXN0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzXzEucHVzaChbdGVtcGxhdGVJZCwgaXNDbG9zZVRlbXBsYXRlVGFnLCBwbGFjZWhvbGRlcl0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1hdGNoZXNfMVtjb250ZW50XSA9IHBsYWNlaG9sZGVyc18xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtYXRjaGVzXzFbY29udGVudF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIHBsYWNlaG9sZGVyIC0gXCIgKyBjb250ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBjdXJyZW50VGVtcGxhdGVJZCA9IHRlbXBsYXRlSWRzU3RhY2tfMVt0ZW1wbGF0ZUlkc1N0YWNrXzEubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXJzID0gbWF0Y2hlc18xW2NvbnRlbnRdO1xuICAgICAgICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICAgICAgICAvLyBmaW5kIHBsYWNlaG9sZGVyIGluZGV4IHRoYXQgbWF0Y2hlcyBjdXJyZW50IHRlbXBsYXRlIGlkXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlcnNbaV1bMF0gPT09IGN1cnJlbnRUZW1wbGF0ZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0ZW1wbGF0ZSBpZCBzdGFjayBiYXNlZCBvbiB0aGUgY3VycmVudCB0YWcgZXh0cmFjdGVkXG4gICAgICAgICAgICB2YXIgX2EgPSBfX3JlYWQocGxhY2Vob2xkZXJzW2lkeF0sIDMpLCB0ZW1wbGF0ZUlkID0gX2FbMF0sIGlzQ2xvc2VUZW1wbGF0ZVRhZyA9IF9hWzFdLCBwbGFjZWhvbGRlciA9IF9hWzJdO1xuICAgICAgICAgICAgaWYgKGlzQ2xvc2VUZW1wbGF0ZVRhZykge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlSWRzU3RhY2tfMS5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRUZW1wbGF0ZUlkICE9PSB0ZW1wbGF0ZUlkKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVJZHNTdGFja18xLnB1c2godGVtcGxhdGVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZW1vdmUgcHJvY2Vzc2VkIHRhZyBmcm9tIHRoZSBsaXN0XG4gICAgICAgICAgICBwbGFjZWhvbGRlcnMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBpbmplY3RlZCBhbGwgdmFsdWVzXG4gICAgICAgIHZhciBoYXNVbm1hdGNoZWRWYWx1ZXMgPSBPYmplY3Qua2V5cyhtYXRjaGVzXzEpLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gISFtYXRjaGVzXzFba2V5XS5sZW5ndGg7IH0pO1xuICAgICAgICBpZiAoaGFzVW5tYXRjaGVkVmFsdWVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpMThuIHBvc3Rwcm9jZXNzOiB1bm1hdGNoZWQgdmFsdWVzIC0gXCIgKyBKU09OLnN0cmluZ2lmeShtYXRjaGVzXzEpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gY3VycmVudCByZXN1bHQgaWYgbm8gcmVwbGFjZW1lbnRzIHNwZWNpZmllZFxuICAgIGlmICghT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RlcCAyOiByZXBsYWNlIGFsbCBJQ1UgdmFycyAobGlrZSBcIlZBUl9QTFVSQUxcIilcbiAgICAgKi9cbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VfVkFSU19SRUdFWFAsIGZ1bmN0aW9uIChtYXRjaCwgc3RhcnQsIGtleSwgX3R5cGUsIF9pZHgsIGVuZCkge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnRzLmhhc093blByb3BlcnR5KGtleSkgPyBcIlwiICsgc3RhcnQgKyByZXBsYWNlbWVudHNba2V5XSArIGVuZCA6IG1hdGNoO1xuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIFN0ZXAgMzogcmVwbGFjZSBhbGwgSUNVIHJlZmVyZW5jZXMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyAobGlrZSDvv71JQ1VfRVhQX0lDVV8x77+9KSBpbiBjYXNlXG4gICAgICogbXVsdGlwbGUgSUNVcyBoYXZlIHRoZSBzYW1lIHBsYWNlaG9sZGVyIG5hbWVcbiAgICAgKi9cbiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VTX1JFR0VYUCwgZnVuY3Rpb24gKG1hdGNoLCBrZXkpIHtcbiAgICAgICAgaWYgKHJlcGxhY2VtZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICB2YXIgbGlzdCA9IHJlcGxhY2VtZW50c1trZXldO1xuICAgICAgICAgICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImkxOG4gcG9zdHByb2Nlc3M6IHVubWF0Y2hlZCBJQ1UgLSBcIiArIG1hdGNoICsgXCIgd2l0aCBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0LnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSB0cmFuc2xhdGlvbiBibG9jayBtYXJrZWQgYnkgYGkxOG5TdGFydGAgYW5kIGBpMThuRW5kYC4gSXQgaW5zZXJ0cyB0aGUgdGV4dC9JQ1Ugbm9kZXNcbiAqIGludG8gdGhlIHJlbmRlciB0cmVlLCBtb3ZlcyB0aGUgcGxhY2Vob2xkZXIgbm9kZXMgYW5kIHJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZXMuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWkxOG5FbmQoKSB7XG4gICAgdmFyIHRWaWV3ID0gZ2V0TFZpZXcoKVtUVklFV107XG4gICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIFwidFZpZXcgc2hvdWxkIGJlIGRlZmluZWRcIik7XG4gICAgaTE4bkVuZEZpcnN0UGFzcyh0Vmlldyk7XG59XG4vKipcbiAqIFNlZSBgaTE4bkVuZGAgYWJvdmUuXG4gKi9cbmZ1bmN0aW9uIGkxOG5FbmRGaXJzdFBhc3ModFZpZXcpIHtcbiAgICB2YXIgdmlld0RhdGEgPSBnZXRMVmlldygpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh2aWV3RGF0YVtCSU5ESU5HX0lOREVYXSwgdmlld0RhdGFbVFZJRVddLmJpbmRpbmdTdGFydEluZGV4LCAnaTE4bkVuZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgYmluZGluZycpO1xuICAgIHZhciByb290SW5kZXggPSBpMThuSW5kZXhTdGFja1tpMThuSW5kZXhTdGFja1BvaW50ZXItLV07XG4gICAgdmFyIHRJMThuID0gdFZpZXcuZGF0YVtyb290SW5kZXggKyBIRUFERVJfT0ZGU0VUXTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0STE4biwgXCJZb3Ugc2hvdWxkIGNhbGwgaTE4blN0YXJ0IGJlZm9yZSBpMThuRW5kXCIpO1xuICAgIC8vIEZpbmQgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhZGRlZCBiZWZvcmUgYGkxOG5FbmRgXG4gICAgdmFyIGxhc3RDcmVhdGVkTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpO1xuICAgIC8vIFJlYWQgdGhlIGluc3RydWN0aW9ucyB0byBpbnNlcnQvbW92ZS9yZW1vdmUgRE9NIGVsZW1lbnRzXG4gICAgdmFyIHZpc2l0ZWROb2RlcyA9IHJlYWRDcmVhdGVPcENvZGVzKHJvb3RJbmRleCwgdEkxOG4uY3JlYXRlLCB0STE4bi5pY3VzLCB2aWV3RGF0YSk7XG4gICAgLy8gUmVtb3ZlIGRlbGV0ZWQgbm9kZXNcbiAgICBmb3IgKHZhciBpID0gcm9vdEluZGV4ICsgMTsgaSA8PSBsYXN0Q3JlYXRlZE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOyBpKyspIHtcbiAgICAgICAgaWYgKHZpc2l0ZWROb2Rlcy5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShpLCB2aWV3RGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW5kIHN0b3JlcyB0aGUgZHluYW1pYyBUTm9kZSwgYW5kIHVuaG9va3MgaXQgZnJvbSB0aGUgdHJlZSBmb3Igbm93LlxuICovXG5mdW5jdGlvbiBjcmVhdGVEeW5hbWljTm9kZUF0SW5kZXgoaW5kZXgsIHR5cGUsIG5hdGl2ZSwgbmFtZSkge1xuICAgIHZhciBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICB2YXIgdE5vZGUgPSBjcmVhdGVOb2RlQXRJbmRleChpbmRleCwgdHlwZSwgbmF0aXZlLCBuYW1lLCBudWxsKTtcbiAgICAvLyBXZSBhcmUgY3JlYXRpbmcgYSBkeW5hbWljIG5vZGUsIHRoZSBwcmV2aW91cyB0Tm9kZSBtaWdodCBub3QgYmUgcG9pbnRpbmcgYXQgdGhpcyBub2RlLlxuICAgIC8vIFdlIHdpbGwgbGluayBvdXJzZWx2ZXMgaW50byB0aGUgdHJlZSBsYXRlciB3aXRoIGBhcHBlbmRJMThuTm9kZWAuXG4gICAgaWYgKHByZXZpb3VzT3JQYXJlbnRUTm9kZS5uZXh0ID09PSB0Tm9kZSkge1xuICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0Tm9kZTtcbn1cbmZ1bmN0aW9uIHJlYWRDcmVhdGVPcENvZGVzKGluZGV4LCBjcmVhdGVPcENvZGVzLCBpY3VzLCB2aWV3RGF0YSkge1xuICAgIHZhciByZW5kZXJlciA9IGdldExWaWV3KClbUkVOREVSRVJdO1xuICAgIHZhciBjdXJyZW50VE5vZGUgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ROb2RlID0gbnVsbDtcbiAgICB2YXIgdmlzaXRlZE5vZGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjcmVhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBvcENvZGUgPSBjcmVhdGVPcENvZGVzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIG9wQ29kZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHRleHRSTm9kZSA9IGNyZWF0ZVRleHROb2RlKG9wQ29kZSwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgdmFyIHRleHROb2RlSW5kZXggPSBjcmVhdGVPcENvZGVzWysraV07XG4gICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUrKztcbiAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7XG4gICAgICAgICAgICBjdXJyZW50VE5vZGUgPSBjcmVhdGVEeW5hbWljTm9kZUF0SW5kZXgodGV4dE5vZGVJbmRleCwgMyAvKiBFbGVtZW50ICovLCB0ZXh0Uk5vZGUsIG51bGwpO1xuICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2godGV4dE5vZGVJbmRleCk7XG4gICAgICAgICAgICBzZXRJc1BhcmVudChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wQ29kZSA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiA3IC8qIE1BU0tfT1BDT0RFICovKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIEFwcGVuZENoaWxkICovOlxuICAgICAgICAgICAgICAgICAgICB2YXIgZGVzdGluYXRpb25Ob2RlSW5kZXggPSBvcENvZGUgPj4+IDE3IC8qIFNISUZUX1BBUkVOVCAqLztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc3RpbmF0aW9uVE5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbk5vZGVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIGBpMThuU3RhcnRgLCB3ZSBkb24ndCBoYXZlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvcC1sZXZlbCBub2RlIGFuZCB3ZSBzaG91bGQgdXNlIHRoZSBob3N0IG5vZGUgaW5zdGVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25UTm9kZSA9IHZpZXdEYXRhW1RfSE9TVF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblROb2RlID0gZ2V0VE5vZGUoZGVzdGluYXRpb25Ob2RlSW5kZXgsIHZpZXdEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoY3VycmVudFROb2RlLCBcIllvdSBuZWVkIHRvIGNyZWF0ZSBvciBzZWxlY3QgYSBub2RlIGJlZm9yZSB5b3UgY2FuIGluc2VydCBpdCBpbnRvIHRoZSBET01cIik7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBhcHBlbmRJMThuTm9kZShjdXJyZW50VE5vZGUsIGRlc3RpbmF0aW9uVE5vZGUsIHByZXZpb3VzVE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogU2VsZWN0ICovOlxuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZUluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLztcbiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2gobm9kZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFROb2RlID0gZ2V0VE5vZGUobm9kZUluZGV4LCB2aWV3RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShjdXJyZW50VE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUTm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1BhcmVudCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogRWxlbWVudEVuZCAqLzpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRJbmRleCA9IG9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGUgPSBnZXRUTm9kZShlbGVtZW50SW5kZXgsIHZpZXdEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKGN1cnJlbnRUTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldElzUGFyZW50KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIEF0dHIgKi86XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50Tm9kZUluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gY3JlYXRlT3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0clZhbHVlID0gY3JlYXRlT3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgICAgICDJtcm1ZWxlbWVudEF0dHJpYnV0ZShlbGVtZW50Tm9kZUluZGV4LCBhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBtdXRhdGUgb3BlcmF0aW9uIGZvciBcXFwiXCIgKyBvcENvZGUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9NQVJLRVI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50VmFsdWUgPSBjcmVhdGVPcENvZGVzWysraV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50Tm9kZUluZGV4ID0gY3JlYXRlT3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwodHlwZW9mIGNvbW1lbnRWYWx1ZSwgJ3N0cmluZycsIFwiRXhwZWN0ZWQgXFxcIlwiICsgY29tbWVudFZhbHVlICsgXCJcXFwiIHRvIGJlIGEgY29tbWVudCBub2RlIHZhbHVlXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudFJOb2RlID0gcmVuZGVyZXIuY3JlYXRlQ29tbWVudChjb21tZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VE5vZGUgPSBjcmVhdGVEeW5hbWljTm9kZUF0SW5kZXgoY29tbWVudE5vZGVJbmRleCwgNSAvKiBJY3VDb250YWluZXIgKi8sIGNvbW1lbnRSTm9kZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKGNvbW1lbnROb2RlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29tbWVudFJOb2RlLCB2aWV3RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUTm9kZS5hY3RpdmVDYXNlSW5kZXggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGFkZCB0aGUgY2FzZSBub2RlcyBsYXRlciwgZHVyaW5nIHRoZSB1cGRhdGUgcGhhc2VcbiAgICAgICAgICAgICAgICAgICAgc2V0SXNQYXJlbnQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEVMRU1FTlRfTUFSS0VSOlxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFnTmFtZVZhbHVlID0gY3JlYXRlT3BDb2Rlc1srK2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudE5vZGVJbmRleCA9IGNyZWF0ZU9wQ29kZXNbKytpXTtcbiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHR5cGVvZiB0YWdOYW1lVmFsdWUsICdzdHJpbmcnLCBcIkV4cGVjdGVkIFxcXCJcIiArIHRhZ05hbWVWYWx1ZSArIFwiXFxcIiB0byBiZSBhbiBlbGVtZW50IG5vZGUgdGFnIG5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50Uk5vZGUgPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KHRhZ05hbWVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVFbGVtZW50Kys7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUTm9kZSA9IGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleChlbGVtZW50Tm9kZUluZGV4LCAzIC8qIEVsZW1lbnQgKi8sIGVsZW1lbnRSTm9kZSwgdGFnTmFtZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2goZWxlbWVudE5vZGVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgXFxcIlwiICsgb3BDb2RlICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldElzUGFyZW50KGZhbHNlKTtcbiAgICByZXR1cm4gdmlzaXRlZE5vZGVzO1xufVxuZnVuY3Rpb24gcmVhZFVwZGF0ZU9wQ29kZXModXBkYXRlT3BDb2RlcywgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB2aWV3RGF0YSwgYnlwYXNzQ2hlY2tCaXQpIHtcbiAgICBpZiAoYnlwYXNzQ2hlY2tCaXQgPT09IHZvaWQgMCkgeyBieXBhc3NDaGVja0JpdCA9IGZhbHNlOyB9XG4gICAgdmFyIGNhc2VDcmVhdGVkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIGJpdCBjb2RlIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBhcHBseSB0aGUgbmV4dCB1cGRhdGVcbiAgICAgICAgdmFyIGNoZWNrQml0ID0gdXBkYXRlT3BDb2Rlc1tpXTtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXNcbiAgICAgICAgdmFyIHNraXBDb2RlcyA9IHVwZGF0ZU9wQ29kZXNbKytpXTtcbiAgICAgICAgaWYgKGJ5cGFzc0NoZWNrQml0IHx8IChjaGVja0JpdCAmIGNoYW5nZU1hc2spKSB7XG4gICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0IGNoZWNrZWRcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyBqIDw9IChpICsgc2tpcENvZGVzKTsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wQ29kZSA9IHVwZGF0ZU9wQ29kZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gb3BDb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3BDb2RlID09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcENvZGUgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgYmluZGluZyBpbmRleCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gcmVuZGVyU3RyaW5naWZ5KHZpZXdEYXRhW2JpbmRpbmdzU3RhcnRJbmRleCAtIG9wQ29kZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVJbmRleCA9IG9wQ29kZSA+Pj4gMiAvKiBTSElGVF9SRUYgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdEljdUluZGV4ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRJY3UgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWN1VE5vZGUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDMgLyogTUFTS19PUENPREUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXR0ciAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gdXBkYXRlT3BDb2Rlc1srK2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2FuaXRpemVGbiA9IHVwZGF0ZU9wQ29kZXNbKytqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgybXJtWVsZW1lbnRBdHRyaWJ1dGUobm9kZUluZGV4LCBhdHRyTmFtZSwgdmFsdWUsIHNhbml0aXplRm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogVGV4dCAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgybXJtXRleHRCaW5kaW5nKG5vZGVJbmRleCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogSWN1U3dpdGNoICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSB1cGRhdGVPcENvZGVzWysral07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3UgPSBpY3VzW3RJY3VJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gZ2V0VE5vZGUobm9kZUluZGV4LCB2aWV3RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjYXNlLCBkZWxldGUgdGhlIG9sZCBub2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlQ29kZXMgPSB0SWN1LnJlbW92ZVtpY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCByZW1vdmVDb2Rlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVPcENvZGUgPSByZW1vdmVDb2Rlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlbW92ZU9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzIC8qIFJlbW92ZSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSW5kZXhfMSA9IHJlbW92ZU9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKG5vZGVJbmRleF8xLCB2aWV3RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2IC8qIFJlbW92ZU5lc3RlZEljdSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRJY3VOb2RlSW5kZXggPSByZW1vdmVDb2Rlc1trICsgMV0gPj4+IDMgLyogU0hJRlRfUkVGICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5lc3RlZEljdVROb2RlID0gZ2V0VE5vZGUobmVzdGVkSWN1Tm9kZUluZGV4LCB2aWV3RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSBuZXN0ZWRJY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmVzdGVkSWN1VEluZGV4ID0gcmVtb3ZlT3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmVzdGVkVEljdSA9IGljdXNbbmVzdGVkSWN1VEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KG5lc3RlZFRJY3UucmVtb3ZlW2FjdGl2ZUluZGV4XSwgcmVtb3ZlQ29kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIGNhc2VJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FzZUluZGV4ID0gZ2V0Q2FzZUluZGV4KHRJY3UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4ID0gY2FzZUluZGV4ICE9PSAtMSA/IGNhc2VJbmRleCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZXMgZm9yIHRoZSBuZXcgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ3JlYXRlT3BDb2RlcygtMSwgdEljdS5jcmVhdGVbY2FzZUluZGV4XSwgaWN1cywgdmlld0RhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlQ3JlYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBJY3VVcGRhdGUgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9IHVwZGF0ZU9wQ29kZXNbKytqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljdSA9IGljdXNbdEljdUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN1VE5vZGUgPSBnZXRUTm9kZShub2RlSW5kZXgsIHZpZXdEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVwZGF0ZU9wQ29kZXModEljdS51cGRhdGVbaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4XSwgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB2aWV3RGF0YSwgY2FzZUNyZWF0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpICs9IHNraXBDb2RlcztcbiAgICB9XG59XG5mdW5jdGlvbiByZW1vdmVOb2RlKGluZGV4LCB2aWV3RGF0YSkge1xuICAgIHZhciByZW1vdmVkUGhUTm9kZSA9IGdldFROb2RlKGluZGV4LCB2aWV3RGF0YSk7XG4gICAgdmFyIHJlbW92ZWRQaFJOb2RlID0gZ2V0TmF0aXZlQnlJbmRleChpbmRleCwgdmlld0RhdGEpO1xuICAgIGlmIChyZW1vdmVkUGhSTm9kZSkge1xuICAgICAgICBuYXRpdmVSZW1vdmVOb2RlKHZpZXdEYXRhW1JFTkRFUkVSXSwgcmVtb3ZlZFBoUk5vZGUpO1xuICAgIH1cbiAgICB2YXIgc2xvdFZhbHVlID0gybXJtWxvYWQoaW5kZXgpO1xuICAgIGlmIChpc0xDb250YWluZXIoc2xvdFZhbHVlKSkge1xuICAgICAgICB2YXIgbENvbnRhaW5lciA9IHNsb3RWYWx1ZTtcbiAgICAgICAgaWYgKHJlbW92ZWRQaFROb2RlLnR5cGUgIT09IDAgLyogQ29udGFpbmVyICovKSB7XG4gICAgICAgICAgICBuYXRpdmVSZW1vdmVOb2RlKHZpZXdEYXRhW1JFTkRFUkVSXSwgbENvbnRhaW5lcltOQVRJVkVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlTm9kZSsrO1xufVxuLyoqXG4gKlxuICogVXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gYmxvY2sgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IHBsYWNlaG9sZGVyLlxuICogSXQgY2FsbHMgYm90aCB7QGxpbmsgaTE4blN0YXJ0fSBhbmQge0BsaW5rIGkxOG5FbmR9IGluIG9uZSBpbnN0cnVjdGlvbi5cbiAqXG4gKiBUaGUgdHJhbnNsYXRpb24gYG1lc3NhZ2VgIGlzIHRoZSB2YWx1ZSB3aGljaCBpcyBsb2NhbGUgc3BlY2lmaWMuIFRoZSB0cmFuc2xhdGlvbiBzdHJpbmcgbWF5XG4gKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi5cbiAqXG4gKiBUaGUgdHJhbnNsYXRpb24gYG1lc3NhZ2VgIHBsYWNlaG9sZGVycyBhcmU6XG4gKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmVcbiAqICAgaW50ZXJwb2xhdGVkIGludG8uIFRoZSBwbGFjZWhvbGRlciBgaW5kZXhgIHBvaW50cyB0byB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGluZGV4LiBBbiBvcHRpb25hbFxuICogICBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC5cbiAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nXG4gKiAgIGFuZCBlbmQgb2YgRE9NIGVsZW1lbnQgdGhhdCB3ZXJlIGVtYmVkZGVkIGluIHRoZSBvcmlnaW5hbCB0cmFuc2xhdGlvbiBibG9jay4gVGhlIHBsYWNlaG9sZGVyXG4gKiAgIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBlbGVtZW50IGluZGV4IGluIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgc2V0LiBBbiBvcHRpb25hbCBgYmxvY2tgIHRoYXRcbiAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC5cbiAqIC0gYO+/vSp7aW5kZXh9OntibG9ja33vv71gL2Dvv70vKntpbmRleH06e2Jsb2Nrfe+/vWA6ICpTdWItdGVtcGxhdGUgUGxhY2Vob2xkZXIqOiBTdWItdGVtcGxhdGVzIG11c3QgYmVcbiAqICAgc3BsaXQgdXAgYW5kIHRyYW5zbGF0ZWQgc2VwYXJhdGVseSBpbiBlYWNoIGFuZ3VsYXIgdGVtcGxhdGUgZnVuY3Rpb24uIFRoZSBgaW5kZXhgIHBvaW50cyB0byB0aGVcbiAqICAgYHRlbXBsYXRlYCBpbnN0cnVjdGlvbiBpbmRleC4gQSBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC5cbiAqXG4gKiBAcGFyYW0gaW5kZXggQSB1bmlxdWUgaW5kZXggb2YgdGhlIHRyYW5zbGF0aW9uIGluIHRoZSBzdGF0aWMgYmxvY2suXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgdHJhbnNsYXRpb24gbWVzc2FnZS5cbiAqIEBwYXJhbSBzdWJUZW1wbGF0ZUluZGV4IE9wdGlvbmFsIHN1Yi10ZW1wbGF0ZSBpbmRleCBpbiB0aGUgYG1lc3NhZ2VgLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpMThuKGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7XG4gICAgybXJtWkxOG5TdGFydChpbmRleCwgbWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCk7XG4gICAgybXJtWkxOG5FbmQoKTtcbn1cbi8qKlxuICogTWFya3MgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYXMgdHJhbnNsYXRhYmxlLlxuICpcbiAqIEBwYXJhbSBpbmRleCBBIHVuaXF1ZSBpbmRleCBpbiB0aGUgc3RhdGljIGJsb2NrXG4gKiBAcGFyYW0gdmFsdWVzXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWkxOG5BdHRyaWJ1dGVzKGluZGV4LCB2YWx1ZXMpIHtcbiAgICB2YXIgdFZpZXcgPSBnZXRMVmlldygpW1RWSUVXXTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0VmlldywgXCJ0VmlldyBzaG91bGQgYmUgZGVmaW5lZFwiKTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MgJiYgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID09PSBudWxsKSB7XG4gICAgICAgIGkxOG5BdHRyaWJ1dGVzRmlyc3RQYXNzKHRWaWV3LCBpbmRleCwgdmFsdWVzKTtcbiAgICB9XG59XG4vKipcbiAqIFNlZSBgaTE4bkF0dHJpYnV0ZXNgIGFib3ZlLlxuICovXG5mdW5jdGlvbiBpMThuQXR0cmlidXRlc0ZpcnN0UGFzcyh0VmlldywgaW5kZXgsIHZhbHVlcykge1xuICAgIHZhciBwcmV2aW91c0VsZW1lbnQgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTtcbiAgICB2YXIgcHJldmlvdXNFbGVtZW50SW5kZXggPSBwcmV2aW91c0VsZW1lbnQuaW5kZXggLSBIRUFERVJfT0ZGU0VUO1xuICAgIHZhciB1cGRhdGVPcENvZGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIGF0dHJOYW1lID0gdmFsdWVzW2ldO1xuICAgICAgICB2YXIgbWVzc2FnZSA9IHZhbHVlc1tpICsgMV07XG4gICAgICAgIHZhciBwYXJ0cyA9IG1lc3NhZ2Uuc3BsaXQoSUNVX1JFR0VYUCk7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzW2pdO1xuICAgICAgICAgICAgaWYgKGogJiAxKSA7XG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAvLyBFdmVuIGluZGV4ZXMgYXJlIHRleHQgKGluY2x1ZGluZyBiaW5kaW5ncylcbiAgICAgICAgICAgICAgICB2YXIgaGFzQmluZGluZyA9ICEhdmFsdWUubWF0Y2goQklORElOR19SRUdFWFApO1xuICAgICAgICAgICAgICAgIGlmIChoYXNCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2Rlcyh2YWx1ZSwgcHJldmlvdXNFbGVtZW50SW5kZXgsIGF0dHJOYW1lKSwgdXBkYXRlT3BDb2Rlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICDJtcm1ZWxlbWVudEF0dHJpYnV0ZShwcmV2aW91c0VsZW1lbnRJbmRleCwgYXR0ck5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID0gdXBkYXRlT3BDb2Rlcztcbn1cbnZhciBjaGFuZ2VNYXNrID0gMDtcbnZhciBzaGlmdHNDb3VudGVyID0gMDtcbi8qKlxuICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGJpbmRpbmdzIGR1cmluZyBlYWNoIHVwZGF0ZSBjeWNsZSBpbiBvcmRlciB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCB0b1xuICogdXBkYXRlIHRoZSB0cmFuc2xhdGVkIG5vZGVzLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBiaW5kaW5nJ3MgbmV3IHZhbHVlIG9yIE5PX0NIQU5HRVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpMThuRXhwKGV4cHJlc3Npb24pIHtcbiAgICBpZiAoZXhwcmVzc2lvbiAhPT0gTk9fQ0hBTkdFKSB7XG4gICAgICAgIGNoYW5nZU1hc2sgPSBjaGFuZ2VNYXNrIHwgKDEgPDwgc2hpZnRzQ291bnRlcik7XG4gICAgfVxuICAgIHNoaWZ0c0NvdW50ZXIrKztcbn1cbi8qKlxuICogVXBkYXRlcyBhIHRyYW5zbGF0aW9uIGJsb2NrIG9yIGFuIGkxOG4gYXR0cmlidXRlIHdoZW4gdGhlIGJpbmRpbmdzIGhhdmUgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gaW5kZXggSW5kZXggb2YgZWl0aGVyIHtAbGluayBpMThuU3RhcnR9ICh0cmFuc2xhdGlvbiBibG9jaykgb3Ige0BsaW5rIGkxOG5BdHRyaWJ1dGVzfVxuICogKGkxOG4gYXR0cmlidXRlKSBvbiB3aGljaCBpdCBzaG91bGQgdXBkYXRlIHRoZSBjb250ZW50LlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVpMThuQXBwbHkoaW5kZXgpIHtcbiAgICBpZiAoc2hpZnRzQ291bnRlcikge1xuICAgICAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgICAgICB2YXIgdFZpZXcgPSBsVmlld1tUVklFV107XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LCBcInRWaWV3IHNob3VsZCBiZSBkZWZpbmVkXCIpO1xuICAgICAgICB2YXIgdEkxOG4gPSB0Vmlldy5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF07XG4gICAgICAgIHZhciB1cGRhdGVPcENvZGVzID0gdm9pZCAwO1xuICAgICAgICB2YXIgaWN1cyA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRJMThuKSkge1xuICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9IHRJMThuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9IHRJMThuLnVwZGF0ZTtcbiAgICAgICAgICAgIGljdXMgPSB0STE4bi5pY3VzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaW5kaW5nc1N0YXJ0SW5kZXggPSBsVmlld1tCSU5ESU5HX0lOREVYXSAtIHNoaWZ0c0NvdW50ZXIgLSAxO1xuICAgICAgICByZWFkVXBkYXRlT3BDb2Rlcyh1cGRhdGVPcENvZGVzLCBpY3VzLCBiaW5kaW5nc1N0YXJ0SW5kZXgsIGNoYW5nZU1hc2ssIGxWaWV3KTtcbiAgICAgICAgLy8gUmVzZXQgY2hhbmdlTWFzayAmIG1hc2tCaXQgdG8gZGVmYXVsdCBmb3IgdGhlIG5leHQgdXBkYXRlIGN5Y2xlXG4gICAgICAgIGNoYW5nZU1hc2sgPSAwO1xuICAgICAgICBzaGlmdHNDb3VudGVyID0gMDtcbiAgICB9XG59XG52YXIgUGx1cmFsO1xuKGZ1bmN0aW9uIChQbHVyYWwpIHtcbiAgICBQbHVyYWxbUGx1cmFsW1wiWmVyb1wiXSA9IDBdID0gXCJaZXJvXCI7XG4gICAgUGx1cmFsW1BsdXJhbFtcIk9uZVwiXSA9IDFdID0gXCJPbmVcIjtcbiAgICBQbHVyYWxbUGx1cmFsW1wiVHdvXCJdID0gMl0gPSBcIlR3b1wiO1xuICAgIFBsdXJhbFtQbHVyYWxbXCJGZXdcIl0gPSAzXSA9IFwiRmV3XCI7XG4gICAgUGx1cmFsW1BsdXJhbFtcIk1hbnlcIl0gPSA0XSA9IFwiTWFueVwiO1xuICAgIFBsdXJhbFtQbHVyYWxbXCJPdGhlclwiXSA9IDVdID0gXCJPdGhlclwiO1xufSkoUGx1cmFsIHx8IChQbHVyYWwgPSB7fSkpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlLlxuICogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGRlcHJlY2F0ZWQgZnVuY3Rpb24gdGhhdCB3ZSB1c2VkIGluIEFuZ3VsYXIgdjQuXG4gKiAvLyBUT0RPKG9jb21iZSk6IHJlbW92ZSB0aGlzIG9uY2Ugd2UgY2FuIHRoZSByZWFsIGdldFBsdXJhbENhc2UgZnVuY3Rpb25cbiAqXG4gKiBAZGVwcmVjYXRlZCBmcm9tIHY1IHRoZSBwbHVyYWwgY2FzZSBmdW5jdGlvbiBpcyBpbiBsb2NhbGUgZGF0YSBmaWxlcyBjb21tb24vbG9jYWxlcy8qLnRzXG4gKi9cbmZ1bmN0aW9uIGdldFBsdXJhbENhc2UobG9jYWxlLCBuTGlrZSkge1xuICAgIGlmICh0eXBlb2Ygbkxpa2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5MaWtlID0gcGFyc2VJbnQobkxpa2UsIDEwKTtcbiAgICB9XG4gICAgdmFyIG4gPSBuTGlrZTtcbiAgICB2YXIgbkRlY2ltYWwgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKTtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xuICAgIHZhciB2ID0gbkRlY2ltYWwubGVuZ3RoO1xuICAgIHZhciBmID0gcGFyc2VJbnQobkRlY2ltYWwsIDEwKTtcbiAgICB2YXIgdCA9IHBhcnNlSW50KG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcXC4/fDArJC9nLCAnJyksIDEwKSB8fCAwO1xuICAgIHZhciBsYW5nID0gbG9jYWxlLnNwbGl0KCctJylbMF0udG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKGxhbmcpIHtcbiAgICAgICAgY2FzZSAnYWYnOlxuICAgICAgICBjYXNlICdhc2EnOlxuICAgICAgICBjYXNlICdheic6XG4gICAgICAgIGNhc2UgJ2JlbSc6XG4gICAgICAgIGNhc2UgJ2Jleic6XG4gICAgICAgIGNhc2UgJ2JnJzpcbiAgICAgICAgY2FzZSAnYnJ4JzpcbiAgICAgICAgY2FzZSAnY2UnOlxuICAgICAgICBjYXNlICdjZ2cnOlxuICAgICAgICBjYXNlICdjaHInOlxuICAgICAgICBjYXNlICdja2InOlxuICAgICAgICBjYXNlICdlZSc6XG4gICAgICAgIGNhc2UgJ2VsJzpcbiAgICAgICAgY2FzZSAnZW8nOlxuICAgICAgICBjYXNlICdlcyc6XG4gICAgICAgIGNhc2UgJ2V1JzpcbiAgICAgICAgY2FzZSAnZm8nOlxuICAgICAgICBjYXNlICdmdXInOlxuICAgICAgICBjYXNlICdnc3cnOlxuICAgICAgICBjYXNlICdoYSc6XG4gICAgICAgIGNhc2UgJ2hhdyc6XG4gICAgICAgIGNhc2UgJ2h1JzpcbiAgICAgICAgY2FzZSAnamdvJzpcbiAgICAgICAgY2FzZSAnam1jJzpcbiAgICAgICAgY2FzZSAna2EnOlxuICAgICAgICBjYXNlICdrayc6XG4gICAgICAgIGNhc2UgJ2traic6XG4gICAgICAgIGNhc2UgJ2tsJzpcbiAgICAgICAgY2FzZSAna3MnOlxuICAgICAgICBjYXNlICdrc2InOlxuICAgICAgICBjYXNlICdreSc6XG4gICAgICAgIGNhc2UgJ2xiJzpcbiAgICAgICAgY2FzZSAnbGcnOlxuICAgICAgICBjYXNlICdtYXMnOlxuICAgICAgICBjYXNlICdtZ28nOlxuICAgICAgICBjYXNlICdtbCc6XG4gICAgICAgIGNhc2UgJ21uJzpcbiAgICAgICAgY2FzZSAnbmInOlxuICAgICAgICBjYXNlICduZCc6XG4gICAgICAgIGNhc2UgJ25lJzpcbiAgICAgICAgY2FzZSAnbm4nOlxuICAgICAgICBjYXNlICdubmgnOlxuICAgICAgICBjYXNlICdueW4nOlxuICAgICAgICBjYXNlICdvbSc6XG4gICAgICAgIGNhc2UgJ29yJzpcbiAgICAgICAgY2FzZSAnb3MnOlxuICAgICAgICBjYXNlICdwcyc6XG4gICAgICAgIGNhc2UgJ3JtJzpcbiAgICAgICAgY2FzZSAncm9mJzpcbiAgICAgICAgY2FzZSAncndrJzpcbiAgICAgICAgY2FzZSAnc2FxJzpcbiAgICAgICAgY2FzZSAnc2VoJzpcbiAgICAgICAgY2FzZSAnc24nOlxuICAgICAgICBjYXNlICdzbyc6XG4gICAgICAgIGNhc2UgJ3NxJzpcbiAgICAgICAgY2FzZSAndGEnOlxuICAgICAgICBjYXNlICd0ZSc6XG4gICAgICAgIGNhc2UgJ3Rlbyc6XG4gICAgICAgIGNhc2UgJ3RrJzpcbiAgICAgICAgY2FzZSAndHInOlxuICAgICAgICBjYXNlICd1Zyc6XG4gICAgICAgIGNhc2UgJ3V6JzpcbiAgICAgICAgY2FzZSAndm8nOlxuICAgICAgICBjYXNlICd2dW4nOlxuICAgICAgICBjYXNlICd3YWUnOlxuICAgICAgICBjYXNlICd4b2cnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdhayc6XG4gICAgICAgIGNhc2UgJ2xuJzpcbiAgICAgICAgY2FzZSAnbWcnOlxuICAgICAgICBjYXNlICdwYSc6XG4gICAgICAgIGNhc2UgJ3RpJzpcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMCAmJiBuIDw9IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdhbSc6XG4gICAgICAgIGNhc2UgJ2FzJzpcbiAgICAgICAgY2FzZSAnYm4nOlxuICAgICAgICBjYXNlICdmYSc6XG4gICAgICAgIGNhc2UgJ2d1JzpcbiAgICAgICAgY2FzZSAnaGknOlxuICAgICAgICBjYXNlICdrbic6XG4gICAgICAgIGNhc2UgJ21yJzpcbiAgICAgICAgY2FzZSAnenUnOlxuICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgbiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2FyJzpcbiAgICAgICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gPT09IDIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAobiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDMgJiYgbiAlIDEwMCA8PSAxMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmIChuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSA5OSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdhc3QnOlxuICAgICAgICBjYXNlICdjYSc6XG4gICAgICAgIGNhc2UgJ2RlJzpcbiAgICAgICAgY2FzZSAnZW4nOlxuICAgICAgICBjYXNlICdldCc6XG4gICAgICAgIGNhc2UgJ2ZpJzpcbiAgICAgICAgY2FzZSAnZnknOlxuICAgICAgICBjYXNlICdnbCc6XG4gICAgICAgIGNhc2UgJ2l0JzpcbiAgICAgICAgY2FzZSAnbmwnOlxuICAgICAgICBjYXNlICdzdic6XG4gICAgICAgIGNhc2UgJ3N3JzpcbiAgICAgICAgY2FzZSAndXInOlxuICAgICAgICBjYXNlICd5aSc6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYmUnOlxuICAgICAgICAgICAgaWYgKG4gJSAxMCA9PT0gMSAmJiAhKG4gJSAxMDAgPT09IDExKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICEobiAlIDEwMCA+PSAxMiAmJiBuICUgMTAwIDw9IDE0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDAgfHwgbiAlIDEwID09PSBNYXRoLmZsb29yKG4gJSAxMCkgJiYgbiAlIDEwID49IDUgJiYgbiAlIDEwIDw9IDkgfHxcbiAgICAgICAgICAgICAgICBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxNClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdicic6XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA9PT0gMTEgfHwgbiAlIDEwMCA9PT0gNzEgfHwgbiAlIDEwMCA9PT0gOTEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gJSAxMCA9PT0gMiAmJiAhKG4gJSAxMDAgPT09IDEyIHx8IG4gJSAxMDAgPT09IDcyIHx8IG4gJSAxMDAgPT09IDkyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiAobiAlIDEwID49IDMgJiYgbiAlIDEwIDw9IDQgfHwgbiAlIDEwID09PSA5KSAmJlxuICAgICAgICAgICAgICAgICEobiAlIDEwMCA+PSAxMCAmJiBuICUgMTAwIDw9IDE5IHx8IG4gJSAxMDAgPj0gNzAgJiYgbiAlIDEwMCA8PSA3OSB8fFxuICAgICAgICAgICAgICAgICAgICBuICUgMTAwID49IDkwICYmIG4gJSAxMDAgPD0gOTkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKCEobiA9PT0gMCkgJiYgbiAlIDFlNiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdicyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnc3InOlxuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSAxICYmICEoaSAlIDEwMCA9PT0gMTEpIHx8IGYgJSAxMCA9PT0gMSAmJiAhKGYgJSAxMDAgPT09IDExKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAyICYmIGkgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpIHx8XG4gICAgICAgICAgICAgICAgZiAlIDEwID09PSBNYXRoLmZsb29yKGYgJSAxMCkgJiYgZiAlIDEwID49IDIgJiYgZiAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAgICAgIShmICUgMTAwID49IDEyICYmIGYgJSAxMDAgPD0gMTQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnY3MnOlxuICAgICAgICBjYXNlICdzayc6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKGkgPT09IE1hdGguZmxvb3IoaSkgJiYgaSA+PSAyICYmIGkgPD0gNCAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKCEodiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnY3knOlxuICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5aZXJvO1xuICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAobiA9PT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgIGlmIChuID09PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKG4gPT09IDYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnZGEnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDEgfHwgISh0ID09PSAwKSAmJiAoaSA9PT0gMCB8fCBpID09PSAxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2RzYic6XG4gICAgICAgIGNhc2UgJ2hzYic6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSAxIHx8IGYgJSAxMDAgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSAyIHx8IGYgJSAxMDAgPT09IDIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMyAmJiBpICUgMTAwIDw9IDQgfHxcbiAgICAgICAgICAgICAgICBmICUgMTAwID09PSBNYXRoLmZsb29yKGYgJSAxMDApICYmIGYgJSAxMDAgPj0gMyAmJiBmICUgMTAwIDw9IDQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdmZic6XG4gICAgICAgIGNhc2UgJ2ZyJzpcbiAgICAgICAgY2FzZSAnaHknOlxuICAgICAgICBjYXNlICdrYWInOlxuICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgaSA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2ZpbCc6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiAoaSA9PT0gMSB8fCBpID09PSAyIHx8IGkgPT09IDMpIHx8XG4gICAgICAgICAgICAgICAgdiA9PT0gMCAmJiAhKGkgJSAxMCA9PT0gNCB8fCBpICUgMTAgPT09IDYgfHwgaSAlIDEwID09PSA5KSB8fFxuICAgICAgICAgICAgICAgICEodiA9PT0gMCkgJiYgIShmICUgMTAgPT09IDQgfHwgZiAlIDEwID09PSA2IHx8IGYgJSAxMCA9PT0gOSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdnYSc6XG4gICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+PSAzICYmIG4gPD0gNilcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gNyAmJiBuIDw9IDEwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2dkJzpcbiAgICAgICAgICAgIGlmIChuID09PSAxIHx8IG4gPT09IDExKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gPT09IDIgfHwgbiA9PT0gMTIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiAobiA+PSAzICYmIG4gPD0gMTAgfHwgbiA+PSAxMyAmJiBuIDw9IDE5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2d2JzpcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGkgJSAxMDAgPT09IDAgfHwgaSAlIDEwMCA9PT0gMjAgfHwgaSAlIDEwMCA9PT0gNDAgfHwgaSAlIDEwMCA9PT0gNjAgfHwgaSAlIDEwMCA9PT0gODApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKCEodiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnaGUnOlxuICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChpID09PSAyICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiAhKG4gPj0gMCAmJiBuIDw9IDEwKSAmJiBuICUgMTAgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnaXMnOlxuICAgICAgICAgICAgaWYgKHQgPT09IDAgJiYgaSAlIDEwID09PSAxICYmICEoaSAlIDEwMCA9PT0gMTEpIHx8ICEodCA9PT0gMCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdrc2gnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5aZXJvO1xuICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdrdyc6XG4gICAgICAgIGNhc2UgJ25hcSc6XG4gICAgICAgIGNhc2UgJ3NlJzpcbiAgICAgICAgY2FzZSAnc21uJzpcbiAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gPT09IDIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdsYWcnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5aZXJvO1xuICAgICAgICAgICAgaWYgKChpID09PSAwIHx8IGkgPT09IDEpICYmICEobiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdsdCc6XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IE1hdGguZmxvb3IobiAlIDEwKSAmJiBuICUgMTAgPj0gMiAmJiBuICUgMTAgPD0gOSAmJlxuICAgICAgICAgICAgICAgICEobiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICghKGYgPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2x2JzpcbiAgICAgICAgY2FzZSAncHJnJzpcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDAgfHwgbiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gMTkgfHxcbiAgICAgICAgICAgICAgICB2ID09PSAyICYmIGYgJSAxMDAgPT09IE1hdGguZmxvb3IoZiAlIDEwMCkgJiYgZiAlIDEwMCA+PSAxMSAmJiBmICUgMTAwIDw9IDE5KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDEgJiYgIShuICUgMTAwID09PSAxMSkgfHwgdiA9PT0gMiAmJiBmICUgMTAgPT09IDEgJiYgIShmICUgMTAwID09PSAxMSkgfHxcbiAgICAgICAgICAgICAgICAhKHYgPT09IDIpICYmIGYgJSAxMCA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ21rJzpcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSB8fCBmICUgMTAgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdtdCc6XG4gICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSAwIHx8IG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAyICYmIG4gJSAxMDAgPD0gMTApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAobiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gMTkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAncGwnOlxuICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSAyICYmIGkgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgIShpICUgMTAwID49IDEyICYmIGkgJSAxMDAgPD0gMTQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgIShpID09PSAxKSAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMCAmJiBpICUgMTAgPD0gMSB8fFxuICAgICAgICAgICAgICAgIHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDUgJiYgaSAlIDEwIDw9IDkgfHxcbiAgICAgICAgICAgICAgICB2ID09PSAwICYmIGkgJSAxMDAgPT09IE1hdGguZmxvb3IoaSAlIDEwMCkgJiYgaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3B0JzpcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMCAmJiBuIDw9IDIgJiYgIShuID09PSAyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3JvJzpcbiAgICAgICAgICAgIGlmIChpID09PSAxICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAoISh2ID09PSAwKSB8fCBuID09PSAwIHx8XG4gICAgICAgICAgICAgICAgIShuID09PSAxKSAmJiBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMSAmJiBuICUgMTAwIDw9IDE5KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAncnUnOlxuICAgICAgICBjYXNlICd1ayc6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEgJiYgIShpICUgMTAwID09PSAxMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMiAmJiBpICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICEoaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDUgJiYgaSAlIDEwIDw9IDkgfHxcbiAgICAgICAgICAgICAgICB2ID09PSAwICYmIGkgJSAxMDAgPT09IE1hdGguZmxvb3IoaSAlIDEwMCkgJiYgaSAlIDEwMCA+PSAxMSAmJiBpICUgMTAwIDw9IDE0KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3NoaSc6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCB8fCBuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+PSAyICYmIG4gPD0gMTApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdzaSc6XG4gICAgICAgICAgICBpZiAobiA9PT0gMCB8fCBuID09PSAxIHx8IGkgPT09IDAgJiYgZiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3NsJzpcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMDAgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gTWF0aC5mbG9vcihpICUgMTAwKSAmJiBpICUgMTAwID49IDMgJiYgaSAlIDEwMCA8PSA0IHx8ICEodiA9PT0gMCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICd0em0nOlxuICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+PSAwICYmIG4gPD0gMSB8fCBuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMTEgJiYgbiA8PSA5OSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gc3BlY2lmaWNhdGlvbiwgdGhlIGRlZmF1bHQgaXMgYWx3YXlzIFwib3RoZXJcIlxuICAgICAgICAvLyBTcGVjOiBodHRwOi8vY2xkci51bmljb2RlLm9yZy9pbmRleC9jbGRyLXNwZWMvcGx1cmFsLXJ1bGVzXG4gICAgICAgIC8vID4gb3RoZXIgKHJlcXVpcmVk4oCUZ2VuZXJhbCBwbHVyYWwgZm9ybSDigJQgYWxzbyB1c2VkIGlmIHRoZSBsYW5ndWFnZSBvbmx5IGhhcyBhIHNpbmdsZSBmb3JtKVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgbG9jYWxlKSB7XG4gICAgdmFyIHBsdXJhbCA9IGdldFBsdXJhbENhc2UobG9jYWxlLCB2YWx1ZSk7XG4gICAgc3dpdGNoIChwbHVyYWwpIHtcbiAgICAgICAgY2FzZSBQbHVyYWwuWmVybzpcbiAgICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgIGNhc2UgUGx1cmFsLk9uZTpcbiAgICAgICAgICAgIHJldHVybiAnb25lJztcbiAgICAgICAgY2FzZSBQbHVyYWwuVHdvOlxuICAgICAgICAgICAgcmV0dXJuICd0d28nO1xuICAgICAgICBjYXNlIFBsdXJhbC5GZXc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGNhc2UgUGx1cmFsLk1hbnk6XG4gICAgICAgICAgICByZXR1cm4gJ21hbnknO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjYXNlIG9mIGFuIElDVSBleHByZXNzaW9uIGRlcGVuZGluZyBvbiB0aGUgbWFpbiBiaW5kaW5nIHZhbHVlXG4gKlxuICogQHBhcmFtIGljdUV4cHJlc3Npb25cbiAqIEBwYXJhbSBiaW5kaW5nVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBtYWluIGJpbmRpbmcgdXNlZCBieSB0aGlzIElDVSBleHByZXNzaW9uXG4gKi9cbmZ1bmN0aW9uIGdldENhc2VJbmRleChpY3VFeHByZXNzaW9uLCBiaW5kaW5nVmFsdWUpIHtcbiAgICB2YXIgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YoYmluZGluZ1ZhbHVlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgIHN3aXRjaCAoaWN1RXhwcmVzc2lvbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogcGx1cmFsICovOiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhvY29tYmUpOiByZXBsYWNlIHRoaXMgaGFyZC1jb2RlZCB2YWx1ZSBieSB0aGUgcmVhbCBMT0NBTEVfSUQgdmFsdWVcbiAgICAgICAgICAgICAgICB2YXIgbG9jYWxlID0gJ2VuLVVTJztcbiAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRDYXNlID0gZ2V0UGx1cmFsQ2F0ZWdvcnkoYmluZGluZ1ZhbHVlLCBsb2NhbGUpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKHJlc29sdmVkQ2FzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSAmJiByZXNvbHZlZENhc2UgIT09ICdvdGhlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YoJ290aGVyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAwIC8qIHNlbGVjdCAqLzoge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKCdvdGhlcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbn1cbi8qKlxuICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgZm9yIElDVSBleHByZXNzaW9ucy5cbiAqXG4gKiBAcGFyYW0gdEljdXNcbiAqIEBwYXJhbSBpY3VFeHByZXNzaW9uXG4gKiBAcGFyYW0gc3RhcnRJbmRleFxuICogQHBhcmFtIGV4cGFuZG9TdGFydEluZGV4XG4gKi9cbmZ1bmN0aW9uIGljdVN0YXJ0KHRJY3VzLCBpY3VFeHByZXNzaW9uLCBzdGFydEluZGV4LCBleHBhbmRvU3RhcnRJbmRleCkge1xuICAgIHZhciBjcmVhdGVDb2RlcyA9IFtdO1xuICAgIHZhciByZW1vdmVDb2RlcyA9IFtdO1xuICAgIHZhciB1cGRhdGVDb2RlcyA9IFtdO1xuICAgIHZhciB2YXJzID0gW107XG4gICAgdmFyIGNoaWxkSWN1cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWN1RXhwcmVzc2lvbi52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRWFjaCB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzICYgb3RoZXIgSUNVIGV4cHJlc3Npb25zXG4gICAgICAgIHZhciB2YWx1ZUFyciA9IGljdUV4cHJlc3Npb24udmFsdWVzW2ldO1xuICAgICAgICB2YXIgbmVzdGVkSWN1cyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbHVlQXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFycltqXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgYW4gbmVzdGVkIElDVSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgdmFyIGljdUluZGV4ID0gbmVzdGVkSWN1cy5wdXNoKHZhbHVlKSAtIDE7XG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBuZXN0ZWQgSUNVIGV4cHJlc3Npb24gYnkgYSBjb21tZW50IG5vZGVcbiAgICAgICAgICAgICAgICB2YWx1ZUFycltqXSA9IFwiPCEtLVxcdUZGRkRcIiArIGljdUluZGV4ICsgXCJcXHVGRkZELS0+XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGljdUNhc2UgPSBwYXJzZUljdUNhc2UodmFsdWVBcnIuam9pbignJyksIHN0YXJ0SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCk7XG4gICAgICAgIGNyZWF0ZUNvZGVzLnB1c2goaWN1Q2FzZS5jcmVhdGUpO1xuICAgICAgICByZW1vdmVDb2Rlcy5wdXNoKGljdUNhc2UucmVtb3ZlKTtcbiAgICAgICAgdXBkYXRlQ29kZXMucHVzaChpY3VDYXNlLnVwZGF0ZSk7XG4gICAgICAgIHZhcnMucHVzaChpY3VDYXNlLnZhcnMpO1xuICAgICAgICBjaGlsZEljdXMucHVzaChpY3VDYXNlLmNoaWxkSWN1cyk7XG4gICAgfVxuICAgIHZhciB0SWN1ID0ge1xuICAgICAgICB0eXBlOiBpY3VFeHByZXNzaW9uLnR5cGUsXG4gICAgICAgIHZhcnM6IHZhcnMsXG4gICAgICAgIGNoaWxkSWN1czogY2hpbGRJY3VzLFxuICAgICAgICBjYXNlczogaWN1RXhwcmVzc2lvbi5jYXNlcyxcbiAgICAgICAgY3JlYXRlOiBjcmVhdGVDb2RlcyxcbiAgICAgICAgcmVtb3ZlOiByZW1vdmVDb2RlcyxcbiAgICAgICAgdXBkYXRlOiB1cGRhdGVDb2Rlc1xuICAgIH07XG4gICAgdEljdXMucHVzaCh0SWN1KTtcbiAgICAvLyBBZGRpbmcgdGhlIG1heGltdW0gcG9zc2libGUgb2YgdmFycyBuZWVkZWQgKGJhc2VkIG9uIHRoZSBjYXNlcyB3aXRoIHRoZSBtb3N0IHZhcnMpXG4gICAgaTE4blZhcnNDb3VudCArPSBNYXRoLm1heC5hcHBseShNYXRoLCBfX3NwcmVhZCh2YXJzKSk7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgdGVtcGxhdGUgaW50byBhbiBIVE1MIHRlbXBsYXRlIGFuZCBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgdG8gdXBkYXRlXG4gKiBhdHRyaWJ1dGVzIG9yIG5vZGVzIHRoYXQgY29udGFpbiBiaW5kaW5ncy5cbiAqXG4gKiBAcGFyYW0gdW5zYWZlSHRtbCBUaGUgc3RyaW5nIHRvIHBhcnNlXG4gKiBAcGFyYW0gcGFyZW50SW5kZXhcbiAqIEBwYXJhbSBuZXN0ZWRJY3VzXG4gKiBAcGFyYW0gdEljdXNcbiAqIEBwYXJhbSBleHBhbmRvU3RhcnRJbmRleFxuICovXG5mdW5jdGlvbiBwYXJzZUljdUNhc2UodW5zYWZlSHRtbCwgcGFyZW50SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCkge1xuICAgIHZhciBpbmVydEJvZHlIZWxwZXIgPSBuZXcgSW5lcnRCb2R5SGVscGVyKGRvY3VtZW50KTtcbiAgICB2YXIgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpO1xuICAgIGlmICghaW5lcnRCb2R5RWxlbWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZW5lcmF0ZSBpbmVydCBib2R5IGVsZW1lbnQnKTtcbiAgICB9XG4gICAgdmFyIHdyYXBwZXIgPSBnZXRUZW1wbGF0ZUNvbnRlbnQoaW5lcnRCb2R5RWxlbWVudCkgfHwgaW5lcnRCb2R5RWxlbWVudDtcbiAgICB2YXIgb3BDb2RlcyA9IHsgdmFyczogMCwgY2hpbGRJY3VzOiBbXSwgY3JlYXRlOiBbXSwgcmVtb3ZlOiBbXSwgdXBkYXRlOiBbXSB9O1xuICAgIHBhcnNlTm9kZXMod3JhcHBlci5maXJzdENoaWxkLCBvcENvZGVzLCBwYXJlbnRJbmRleCwgbmVzdGVkSWN1cywgdEljdXMsIGV4cGFuZG9TdGFydEluZGV4KTtcbiAgICByZXR1cm4gb3BDb2Rlcztcbn1cbnZhciBORVNURURfSUNVID0gL++/vShcXGQrKe+/vS87XG4vKipcbiAqIFBhcnNlcyBhIG5vZGUsIGl0cyBjaGlsZHJlbiBhbmQgaXRzIHNpYmxpbmdzLCBhbmQgZ2VuZXJhdGVzIHRoZSBtdXRhdGUgJiB1cGRhdGUgT3BDb2Rlcy5cbiAqXG4gKiBAcGFyYW0gY3VycmVudE5vZGUgVGhlIGZpcnN0IG5vZGUgdG8gcGFyc2VcbiAqIEBwYXJhbSBpY3VDYXNlIFRoZSBkYXRhIGZvciB0aGUgSUNVIGV4cHJlc3Npb24gY2FzZSB0aGF0IGNvbnRhaW5zIHRob3NlIG5vZGVzXG4gKiBAcGFyYW0gcGFyZW50SW5kZXggSW5kZXggb2YgdGhlIGN1cnJlbnQgbm9kZSdzIHBhcmVudFxuICogQHBhcmFtIG5lc3RlZEljdXMgRGF0YSBmb3IgdGhlIG5lc3RlZCBJQ1UgZXhwcmVzc2lvbnMgdGhhdCB0aGlzIGNhc2UgY29udGFpbnNcbiAqIEBwYXJhbSB0SWN1cyBEYXRhIGZvciBhbGwgSUNVIGV4cHJlc3Npb25zIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2VcbiAqIEBwYXJhbSBleHBhbmRvU3RhcnRJbmRleCBFeHBhbmRvIHN0YXJ0IGluZGV4IGZvciB0aGUgY3VycmVudCBJQ1UgZXhwcmVzc2lvblxuICovXG5mdW5jdGlvbiBwYXJzZU5vZGVzKGN1cnJlbnROb2RlLCBpY3VDYXNlLCBwYXJlbnRJbmRleCwgbmVzdGVkSWN1cywgdEljdXMsIGV4cGFuZG9TdGFydEluZGV4KSB7XG4gICAgaWYgKGN1cnJlbnROb2RlKSB7XG4gICAgICAgIHZhciBuZXN0ZWRJY3VzVG9DcmVhdGUgPSBbXTtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgbmV4dE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciBuZXdJbmRleCA9IGV4cGFuZG9TdGFydEluZGV4ICsgKytpY3VDYXNlLnZhcnM7XG4gICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnROb2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjdXJyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBhIHZhbGlkIGVsZW1lbnQsIHdlIHdvbid0IGNyZWF0ZSBhbiBlbGVtZW50IGZvciBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS52YXJzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLmNyZWF0ZS5wdXNoKEVMRU1FTlRfTUFSS0VSLCB0YWdOYW1lLCBuZXdJbmRleCwgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxBdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gZWxBdHRycy5pdGVtKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb3dlckF0dHJOYW1lID0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0JpbmRpbmdfMSA9ICEhYXR0ci52YWx1ZS5tYXRjaChCSU5ESU5HX1JFR0VYUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBpbnB1dCBzdHJpbmcgaXMgc2FmZSwgdW5sZXNzIGl0J3MgdXNpbmcgYSBiaW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmdfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkFMSURfQVRUUlMuaGFzT3duUHJvcGVydHkobG93ZXJBdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVUklfQVRUUlNbbG93ZXJBdHRyTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXMoYXR0ci52YWx1ZSwgbmV3SW5kZXgsIGF0dHIubmFtZSwgX3Nhbml0aXplVXJsKSwgaWN1Q2FzZS51cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoU1JDU0VUX0FUVFJTW2xvd2VyQXR0ck5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUsIHNhbml0aXplU3Jjc2V0KSwgaWN1Q2FzZS51cGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUpLCBpY3VDYXNlLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXQVJOSU5HOiBpZ25vcmluZyB1bnNhZmUgYXR0cmlidXRlIHZhbHVlIFwiICsgbG93ZXJBdHRyTmFtZSArIFwiIG9uIGVsZW1lbnQgXCIgKyB0YWdOYW1lICsgXCIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLmNyZWF0ZS5wdXNoKG5ld0luZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNCAvKiBBdHRyICovLCBhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKGlmIGFueSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTm9kZXMoY3VycmVudE5vZGUuZmlyc3RDaGlsZCwgaWN1Q2FzZSwgbmV3SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCBub2RlIGFmdGVyIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5yZW1vdmUucHVzaChuZXdJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDMgLyogUmVtb3ZlICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOlxuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjdXJyZW50Tm9kZS50ZXh0Q29udGVudCB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc0JpbmRpbmcgPSB2YWx1ZS5tYXRjaChCSU5ESU5HX1JFR0VYUCk7XG4gICAgICAgICAgICAgICAgICAgIGljdUNhc2UuY3JlYXRlLnB1c2goaGFzQmluZGluZyA/ICcnIDogdmFsdWUsIG5ld0luZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5yZW1vdmUucHVzaChuZXdJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDMgLyogUmVtb3ZlICovKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2Rlcyh2YWx1ZSwgbmV3SW5kZXgpLCBpY3VDYXNlLnVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbW1lbnQgbm9kZSBpcyBhIHBsYWNlaG9sZGVyIGZvciBhIG5lc3RlZCBJQ1VcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gTkVTVEVEX0lDVS5leGVjKGN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmVzdGVkSWN1SW5kZXggPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0xvY2FsID0gbmdEZXZNb2RlID8gXCJuZXN0ZWQgSUNVIFwiICsgbmVzdGVkSWN1SW5kZXggOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbWVudCBub2RlIHRoYXQgd2lsbCBhbmNob3IgdGhlIElDVSBleHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLmNyZWF0ZS5wdXNoKENPTU1FTlRfTUFSS0VSLCBuZXdMb2NhbCwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5lc3RlZEljdSA9IG5lc3RlZEljdXNbbmVzdGVkSWN1SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkSWN1c1RvQ3JlYXRlLnB1c2goW25lc3RlZEljdSwgbmV3SW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS52YXJzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhbmRsZSBhbnkgb3RoZXIgdHlwZSBvZiBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5lc3RlZEljdXNUb0NyZWF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5lc3RlZEljdSA9IG5lc3RlZEljdXNUb0NyZWF0ZVtpXVswXTtcbiAgICAgICAgICAgIHZhciBuZXN0ZWRJY3VOb2RlSW5kZXggPSBuZXN0ZWRJY3VzVG9DcmVhdGVbaV1bMV07XG4gICAgICAgICAgICBpY3VTdGFydCh0SWN1cywgbmVzdGVkSWN1LCBuZXN0ZWRJY3VOb2RlSW5kZXgsIGV4cGFuZG9TdGFydEluZGV4ICsgaWN1Q2FzZS52YXJzKTtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgcmVjdXJzaXZlLCB0aGUgbGFzdCBUSWN1IHRoYXQgd2FzIHB1c2hlZCBpcyB0aGUgb25lIHdlIHdhbnRcbiAgICAgICAgICAgIHZhciBuZXN0VEljdUluZGV4ID0gdEljdXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGljdUNhc2UudmFycyArPSBNYXRoLm1heC5hcHBseShNYXRoLCBfX3NwcmVhZCh0SWN1c1tuZXN0VEljdUluZGV4XS52YXJzKSk7XG4gICAgICAgICAgICBpY3VDYXNlLmNoaWxkSWN1cy5wdXNoKG5lc3RUSWN1SW5kZXgpO1xuICAgICAgICAgICAgdmFyIG1hc2sgPSBnZXRCaW5kaW5nTWFzayhuZXN0ZWRJY3UpO1xuICAgICAgICAgICAgaWN1Q2FzZS51cGRhdGUucHVzaCh0b01hc2tCaXQobmVzdGVkSWN1Lm1haW5CaW5kaW5nKSwgLy8gbWFzayBvZiB0aGUgbWFpbiBiaW5kaW5nXG4gICAgICAgICAgICAzLCAvLyBza2lwIDMgb3BDb2RlcyBpZiBub3QgY2hhbmdlZFxuICAgICAgICAgICAgLTEgLSBuZXN0ZWRJY3UubWFpbkJpbmRpbmcsIG5lc3RlZEljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDIgLyogSWN1U3dpdGNoICovLCBuZXN0VEljdUluZGV4LCBtYXNrLCAvLyBtYXNrIG9mIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhpcyBJQ1UgZXhwcmVzc2lvblxuICAgICAgICAgICAgMiwgLy8gc2tpcCAyIG9wQ29kZXMgaWYgbm90IGNoYW5nZWRcbiAgICAgICAgICAgIG5lc3RlZEljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDMgLyogSWN1VXBkYXRlICovLCBuZXN0VEljdUluZGV4KTtcbiAgICAgICAgICAgIGljdUNhc2UucmVtb3ZlLnB1c2gobmVzdFRJY3VJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDYgLyogUmVtb3ZlTmVzdGVkSWN1ICovLCBuZXN0ZWRJY3VOb2RlSW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIFJlbW92ZSAqLyk7XG4gICAgICAgIH1cbiAgICB9XG59XG52YXIgVFJBTlNMQVRJT05TID0ge307XG4vKipcbiAqIFNldCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYGkxOG5Mb2NhbGl6ZWAuXG4gKlxuICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgdGVtcG9yYXJ5ICYgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uXG4gKi9cbmZ1bmN0aW9uIGkxOG5Db25maWd1cmVMb2NhbGl6ZShvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge1xuICAgICAgICB0cmFuc2xhdGlvbnM6IHt9XG4gICAgfTsgfVxuICAgIFRSQU5TTEFUSU9OUyA9IG9wdGlvbnMudHJhbnNsYXRpb25zO1xufVxudmFyIExPQ0FMSVpFX1BIX1JFR0VYUCA9IC9cXHtcXCQoLio/KVxcfS9nO1xuLyoqXG4gKiBBIGdvb2cuZ2V0TXNnLWxpa2UgZnVuY3Rpb24gZm9yIHVzZXJzIHRoYXQgZG8gbm90IHVzZSBDbG9zdXJlLlxuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGFzIGEgKnRlbXBvcmFyeSogbWVhc3VyZSB0byBwcmV2ZW50IGkxOG4gdGVzdHMgZnJvbSBiZWluZyBibG9ja2VkIHdoaWxlXG4gKiBydW5uaW5nIG91dHNpZGUgb2YgQ2xvc3VyZSBDb21waWxlci4gVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgbmVlZGVkIG9uY2UgcnVudGltZSB0cmFuc2xhdGlvblxuICogc2VydmljZSBzdXBwb3J0IGlzIGludHJvZHVjZWQuXG4gKlxuICogQHB1YmxpY0FwaVxuICogQGRlcHJlY2F0ZWQgdGhpcyBtZXRob2QgaXMgdGVtcG9yYXJ5ICYgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uXG4gKi9cbmZ1bmN0aW9uIMm1ybVpMThuTG9jYWxpemUoaW5wdXQsIHBsYWNlaG9sZGVycykge1xuICAgIGlmIChwbGFjZWhvbGRlcnMgPT09IHZvaWQgMCkgeyBwbGFjZWhvbGRlcnMgPSB7fTsgfVxuICAgIGlmICh0eXBlb2YgVFJBTlNMQVRJT05TW2lucHV0XSAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gdG8gYWNjb3VudCBmb3IgZW1wdHkgc3RyaW5nXG4gICAgICAgIGlucHV0ID0gVFJBTlNMQVRJT05TW2lucHV0XTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBsYWNlaG9sZGVycykubGVuZ3RoID9cbiAgICAgICAgaW5wdXQucmVwbGFjZShMT0NBTElaRV9QSF9SRUdFWFAsIGZ1bmN0aW9uIChtYXRjaCwga2V5KSB7IHJldHVybiBwbGFjZWhvbGRlcnNba2V5XSB8fCAnJzsgfSkgOlxuICAgICAgICBpbnB1dDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIENPTVBPTkVOVF9GQUNUT1JZX1JFU09MVkVSID0ge1xuICAgIHByb3ZpZGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICB1c2VDbGFzczogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJDEsXG4gICAgZGVwczogW05nTW9kdWxlUmVmXSxcbn07XG52YXIgTmdNb2R1bGVSZWYkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdNb2R1bGVSZWYkMSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZ01vZHVsZVJlZiQxKG5nTW9kdWxlVHlwZSwgX3BhcmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcGFyZW50ID0gX3BhcmVudDtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlXG4gICAgICAgIF90aGlzLl9ib290c3RyYXBDb21wb25lbnRzID0gW107XG4gICAgICAgIF90aGlzLmluamVjdG9yID0gX3RoaXM7XG4gICAgICAgIF90aGlzLmRlc3Ryb3lDYnMgPSBbXTtcbiAgICAgICAgdmFyIG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYobmdNb2R1bGVUeXBlKTtcbiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobmdNb2R1bGVEZWYsIFwiTmdNb2R1bGUgJ1wiICsgc3RyaW5naWZ5KG5nTW9kdWxlVHlwZSkgKyBcIicgaXMgbm90IGEgc3VidHlwZSBvZiAnTmdNb2R1bGVUeXBlJy5cIik7XG4gICAgICAgIF90aGlzLl9ib290c3RyYXBDb21wb25lbnRzID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5ib290c3RyYXApO1xuICAgICAgICB2YXIgYWRkaXRpb25hbFByb3ZpZGVycyA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlOiBOZ01vZHVsZVJlZixcbiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogX3RoaXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgQ09NUE9ORU5UX0ZBQ1RPUllfUkVTT0xWRVJcbiAgICAgICAgXTtcbiAgICAgICAgX3RoaXMuX3IzSW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcihuZ01vZHVsZVR5cGUsIF9wYXJlbnQsIGFkZGl0aW9uYWxQcm92aWRlcnMsIHN0cmluZ2lmeShuZ01vZHVsZVR5cGUpKTtcbiAgICAgICAgX3RoaXMuaW5zdGFuY2UgPSBfdGhpcy5nZXQobmdNb2R1bGVUeXBlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOZ01vZHVsZVJlZiQxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGluamVjdEZsYWdzKSB7XG4gICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSB2b2lkIDApIHsgbm90Rm91bmRWYWx1ZSA9IEluamVjdG9yLlRIUk9XX0lGX05PVF9GT1VORDsgfVxuICAgICAgICBpZiAoaW5qZWN0RmxhZ3MgPT09IHZvaWQgMCkgeyBpbmplY3RGbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7IH1cbiAgICAgICAgaWYgKHRva2VuID09PSBJbmplY3RvciB8fCB0b2tlbiA9PT0gTmdNb2R1bGVSZWYgfHwgdG9rZW4gPT09IElOSkVDVE9SKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcjNJbmplY3Rvci5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGluamVjdEZsYWdzKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ01vZHVsZVJlZiQxLnByb3RvdHlwZSwgXCJjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBOZ01vZHVsZVJlZiQxLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0aGlzLmRlc3Ryb3lDYnMsICdOZ01vZHVsZSBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICB2YXIgaW5qZWN0b3IgPSB0aGlzLl9yM0luamVjdG9yO1xuICAgICAgICAhaW5qZWN0b3IuZGVzdHJveWVkICYmIGluamVjdG9yLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95Q2JzLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9KTtcbiAgICAgICAgdGhpcy5kZXN0cm95Q2JzID0gbnVsbDtcbiAgICB9O1xuICAgIE5nTW9kdWxlUmVmJDEucHJvdG90eXBlLm9uRGVzdHJveSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0aGlzLmRlc3Ryb3lDYnMsICdOZ01vZHVsZSBhbHJlYWR5IGRlc3Ryb3llZCcpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lDYnMucHVzaChjYWxsYmFjayk7XG4gICAgfTtcbiAgICByZXR1cm4gTmdNb2R1bGVSZWYkMTtcbn0oTmdNb2R1bGVSZWYpKTtcbnZhciBOZ01vZHVsZUZhY3RvcnkkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdNb2R1bGVGYWN0b3J5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5nTW9kdWxlRmFjdG9yeShtb2R1bGVUeXBlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE5nTW9kdWxlRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKHBhcmVudEluamVjdG9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgTmdNb2R1bGVSZWYkMSh0aGlzLm1vZHVsZVR5cGUsIHBhcmVudEluamVjdG9yKTtcbiAgICB9O1xuICAgIHJldHVybiBOZ01vZHVsZUZhY3Rvcnk7XG59KE5nTW9kdWxlRmFjdG9yeSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFkZHMgZGVjb3JhdG9yLCBjb25zdHJ1Y3RvciwgYW5kIHByb3BlcnR5IG1ldGFkYXRhIHRvIGEgZ2l2ZW4gdHlwZSB2aWEgc3RhdGljIG1ldGFkYXRhIGZpZWxkc1xuICogb24gdGhlIHR5cGUuXG4gKlxuICogVGhlc2UgbWV0YWRhdGEgZmllbGRzIGNhbiBsYXRlciBiZSByZWFkIHdpdGggQW5ndWxhcidzIGBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzYCBBUEkuXG4gKlxuICogQ2FsbHMgdG8gYHNldENsYXNzTWV0YWRhdGFgIGNhbiBiZSBtYXJrZWQgYXMgcHVyZSwgcmVzdWx0aW5nIGluIHRoZSBtZXRhZGF0YSBhc3NpZ25tZW50cyBiZWluZ1xuICogdHJlZS1zaGFrZW4gYXdheSBkdXJpbmcgcHJvZHVjdGlvbiBidWlsZHMuXG4gKi9cbmZ1bmN0aW9uIHNldENsYXNzTWV0YWRhdGEodHlwZSwgZGVjb3JhdG9ycywgY3RvclBhcmFtZXRlcnMsIHByb3BEZWNvcmF0b3JzKSB7XG4gICAgcmV0dXJuIG5vU2lkZUVmZmVjdHMoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjbGF6eiA9IHR5cGU7XG4gICAgICAgIC8vIFdlIGRldGVybWluZSB3aGV0aGVyIGEgY2xhc3MgaGFzIGl0cyBvd24gbWV0YWRhdGEgYnkgdGFraW5nIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBwYXJlbnRcbiAgICAgICAgLy8gY29uc3RydWN0b3IgYW5kIGNoZWNraW5nIHdoZXRoZXIgaXQncyB0aGUgc2FtZSBhcyB0aGUgc3ViY2xhc3MgbWV0YWRhdGEgYmVsb3cuIFdlIGNhbid0IHVzZVxuICAgICAgICAvLyBgaGFzT3duUHJvcGVydHlgIGhlcmUgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IGluIElFMTAgZm9yIHN0YXRpYyBmaWVsZHMgdGhhdCBhcmVcbiAgICAgICAgLy8gZGVmaW5lZCBieSBUUy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC8yODQzOSNpc3N1ZWNvbW1lbnQtNDU5MzQ5MjE4LlxuICAgICAgICB2YXIgcGFyZW50UHJvdG90eXBlID0gY2xhenoucHJvdG90eXBlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkgOiBudWxsO1xuICAgICAgICB2YXIgcGFyZW50Q29uc3RydWN0b3IgPSBwYXJlbnRQcm90b3R5cGUgJiYgcGFyZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoZGVjb3JhdG9ycyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNsYXp6LmRlY29yYXRvcnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICghcGFyZW50Q29uc3RydWN0b3IgfHwgcGFyZW50Q29uc3RydWN0b3IuZGVjb3JhdG9ycyAhPT0gY2xhenouZGVjb3JhdG9ycykpIHtcbiAgICAgICAgICAgICAgICAoX2EgPSBjbGF6ei5kZWNvcmF0b3JzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZChkZWNvcmF0b3JzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGF6ei5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3RvclBhcmFtZXRlcnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJhdGhlciB0aGFuIG1lcmdpbmcsIGNsb2JiZXIgdGhlIGV4aXN0aW5nIHBhcmFtZXRlcnMuIElmIG90aGVyIHByb2plY3RzIGV4aXN0IHdoaWNoIHVzZVxuICAgICAgICAgICAgLy8gdHNpY2tsZS1zdHlsZSBhbm5vdGF0aW9ucyBhbmQgcmVmbGVjdCBvdmVyIHRoZW0gaW4gdGhlIHNhbWUgd2F5LCB0aGlzIGNvdWxkIGNhdXNlIGlzc3VlcyxcbiAgICAgICAgICAgIC8vIGJ1dCB0aGF0IGlzIHZhbmlzaGluZ2x5IHVubGlrZWx5LlxuICAgICAgICAgICAgY2xhenouY3RvclBhcmFtZXRlcnMgPSBjdG9yUGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcERlY29yYXRvcnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBkZWNvcmF0b3Igb2JqZWN0cyBhcmUgbWVyZ2VkIGFzIGl0IGlzIHBvc3NpYmxlIGRpZmZlcmVudCBmaWVsZHMgaGF2ZSBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIGRlY29yYXRvciB0eXBlcy4gRGVjb3JhdG9ycyBvbiBpbmRpdmlkdWFsIGZpZWxkcyBhcmUgbm90IG1lcmdlZCwgYXMgaXQncyBhbHNvIGluY3JlZGlibHlcbiAgICAgICAgICAgIC8vIHVubGlrZWx5IHRoYXQgYSBmaWVsZCB3aWxsIGJlIGRlY29yYXRlZCBib3RoIHdpdGggYW4gQW5ndWxhciBkZWNvcmF0b3IgYW5kIGEgbm9uLUFuZ3VsYXJcbiAgICAgICAgICAgIC8vIGRlY29yYXRvciB0aGF0J3MgYWxzbyBiZWVuIGRvd25sZXZlbGVkLlxuICAgICAgICAgICAgaWYgKGNsYXp6LnByb3BEZWNvcmF0b3JzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAoIXBhcmVudENvbnN0cnVjdG9yIHx8IHBhcmVudENvbnN0cnVjdG9yLnByb3BEZWNvcmF0b3JzICE9PSBjbGF6ei5wcm9wRGVjb3JhdG9ycykpIHtcbiAgICAgICAgICAgICAgICBjbGF6ei5wcm9wRGVjb3JhdG9ycyA9IF9fYXNzaWduKHt9LCBjbGF6ei5wcm9wRGVjb3JhdG9ycywgcHJvcERlY29yYXRvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xhenoucHJvcERlY29yYXRvcnMgPSBwcm9wRGVjb3JhdG9ycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEJpbmRpbmdzIGZvciBwdXJlIGZ1bmN0aW9ucyBhcmUgc3RvcmVkIGFmdGVyIHJlZ3VsYXIgYmluZGluZ3MuXG4gKlxuICogfC0tLS0tLWNvbnN0cy0tLS0tLXwtLS0tLS0tLS12YXJzLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgfC0tLS0tIGhvc3RWYXJzIChkaXIxKSAtLS0tLS18XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIHwgbm9kZXMvcmVmcy9waXBlcyB8IGJpbmRpbmdzIHwgZm4gc2xvdHMgIHwgaW5qZWN0b3IgfCBkaXIxIHwgaG9zdCBiaW5kaW5ncyB8IGhvc3Qgc2xvdHMgfFxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeXG4gKiAgICAgIFRWaWV3LmJpbmRpbmdTdGFydEluZGV4ICAgICAgVFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXhcbiAqXG4gKiBQdXJlIGZ1bmN0aW9uIGluc3RydWN0aW9ucyBhcmUgZ2l2ZW4gYW4gb2Zmc2V0IGZyb20gdGhlIGJpbmRpbmcgcm9vdC4gQWRkaW5nIHRoZSBvZmZzZXQgdG8gdGhlXG4gKiBiaW5kaW5nIHJvb3QgZ2l2ZXMgdGhlIGZpcnN0IGluZGV4IHdoZXJlIHRoZSBiaW5kaW5ncyBhcmUgc3RvcmVkLiBJbiBjb21wb25lbnQgdmlld3MsIHRoZSBiaW5kaW5nXG4gKiByb290IGlzIHRoZSBiaW5kaW5nU3RhcnRJbmRleC4gSW4gaG9zdCBiaW5kaW5ncywgdGhlIGJpbmRpbmcgcm9vdCBpcyB0aGUgZXhwYW5kb1N0YXJ0SW5kZXggK1xuICogYW55IGRpcmVjdGl2ZSBpbnN0YW5jZXMgKyBhbnkgaG9zdFZhcnMgaW4gZGlyZWN0aXZlcyBldmFsdWF0ZWQgYmVmb3JlIGl0LlxuICpcbiAqIFNlZSBWSUVXX0RBVEEubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG9zdCBiaW5kaW5nIHJlc29sdXRpb24uXG4gKi9cbi8qKlxuICogSWYgdGhlIHZhbHVlIGhhc24ndCBiZWVuIHNhdmVkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byBzdG9yZSBhbmQgcmV0dXJuIHRoZVxuICogdmFsdWUuIElmIGl0IGhhcyBiZWVuIHNhdmVkLCByZXR1cm5zIHRoZSBzYXZlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90XG4gKiBAcGFyYW0gcHVyZUZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlXG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuXG4gKiBAcmV0dXJucyB2YWx1ZVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb24wKHNsb3RPZmZzZXQsIHB1cmVGbiwgdGhpc0FyZykge1xuICAgIC8vIFRPRE8oa2FyYSk6IHVzZSBiaW5kaW5nUm9vdCBpbnN0ZWFkIG9mIGJpbmRpbmdTdGFydEluZGV4IHdoZW4gaW1wbGVtZW50aW5nIGhvc3QgYmluZGluZ3NcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICByZXR1cm4gaXNDcmVhdGlvbk1vZGUoKSA/XG4gICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcpIDogcHVyZUZuKCkpIDpcbiAgICAgICAgZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4KTtcbn1cbi8qKlxuICogSWYgdGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVyblxuICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgdGhlIHZhbHVlIGhhcyBub3QgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdFxuICogQHBhcmFtIHB1cmVGbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gdXBkYXRlZCB2YWx1ZVxuICogQHBhcmFtIGV4cCBVcGRhdGVkIGV4cHJlc3Npb24gdmFsdWVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjEoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpIHtcbiAgICAvLyBUT0RPKGthcmEpOiB1c2UgYmluZGluZ1Jvb3QgaW5zdGVhZCBvZiBiaW5kaW5nU3RhcnRJbmRleCB3aGVuIGltcGxlbWVudGluZyBob3N0IGJpbmRpbmdzXG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7XG4gICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cCkgP1xuICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAxLCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwKSA6IHB1cmVGbihleHApKSA6XG4gICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDEpO1xufVxuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuXG4gKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90XG4gKiBAcGFyYW0gcHVyZUZuXG4gKiBAcGFyYW0gZXhwMVxuICogQHBhcmFtIGV4cDJcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjIoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCB0aGlzQXJnKSB7XG4gICAgLy8gVE9ETyhrYXJhKTogdXNlIGJpbmRpbmdSb290IGluc3RlYWQgb2YgYmluZGluZ1N0YXJ0SW5kZXggd2hlbiBpbXBsZW1lbnRpbmcgaG9zdCBiaW5kaW5nc1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMikgP1xuICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAyLCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMikgOiBwdXJlRm4oZXhwMSwgZXhwMikpIDpcbiAgICAgICAgZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMik7XG59XG4vKipcbiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm5cbiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3RcbiAqIEBwYXJhbSBwdXJlRm5cbiAqIEBwYXJhbSBleHAxXG4gKiBAcGFyYW0gZXhwMlxuICogQHBhcmFtIGV4cDNcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjMoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKSB7XG4gICAgLy8gVE9ETyhrYXJhKTogdXNlIGJpbmRpbmdSb290IGluc3RlYWQgb2YgYmluZGluZ1N0YXJ0SW5kZXggd2hlbiBpbXBsZW1lbnRpbmcgaG9zdCBiaW5kaW5nc1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDMobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMykgP1xuICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAzLCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMykgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMykpIDpcbiAgICAgICAgZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMyk7XG59XG4vKipcbiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm5cbiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3RcbiAqIEBwYXJhbSBwdXJlRm5cbiAqIEBwYXJhbSBleHAxXG4gKiBAcGFyYW0gZXhwMlxuICogQHBhcmFtIGV4cDNcbiAqIEBwYXJhbSBleHA0XG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuXG4gKiBAcmV0dXJucyBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb240KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgdGhpc0FyZykge1xuICAgIC8vIFRPRE8oa2FyYSk6IHVzZSBiaW5kaW5nUm9vdCBpbnN0ZWFkIG9mIGJpbmRpbmdTdGFydEluZGV4IHdoZW4gaW1wbGVtZW50aW5nIGhvc3QgYmluZGluZ3NcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpID9cbiAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgNCwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpIDogcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpKSA6XG4gICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDQpO1xufVxuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuXG4gKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90XG4gKiBAcGFyYW0gcHVyZUZuXG4gKiBAcGFyYW0gZXhwMVxuICogQHBhcmFtIGV4cDJcbiAqIEBwYXJhbSBleHAzXG4gKiBAcGFyYW0gZXhwNFxuICogQHBhcmFtIGV4cDVcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjUoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCB0aGlzQXJnKSB7XG4gICAgLy8gVE9ETyhrYXJhKTogdXNlIGJpbmRpbmdSb290IGluc3RlYWQgb2YgYmluZGluZ1N0YXJ0SW5kZXggd2hlbiBpbXBsZW1lbnRpbmcgaG9zdCBiaW5kaW5nc1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7XG4gICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1KSB8fCBkaWZmZXJlbnQgP1xuICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA1LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSkgOlxuICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpKSA6XG4gICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDUpO1xufVxuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuXG4gKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90XG4gKiBAcGFyYW0gcHVyZUZuXG4gKiBAcGFyYW0gZXhwMVxuICogQHBhcmFtIGV4cDJcbiAqIEBwYXJhbSBleHAzXG4gKiBAcGFyYW0gZXhwNFxuICogQHBhcmFtIGV4cDVcbiAqIEBwYXJhbSBleHA2XG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuXG4gKiBAcmV0dXJucyBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb242KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgdGhpc0FyZykge1xuICAgIC8vIFRPRE8oa2FyYSk6IHVzZSBiaW5kaW5nUm9vdCBpbnN0ZWFkIG9mIGJpbmRpbmdTdGFydEluZGV4IHdoZW4gaW1wbGVtZW50aW5nIGhvc3QgYmluZGluZ3NcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIGV4cDUsIGV4cDYpIHx8IGRpZmZlcmVudCA/XG4gICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYsIHRoaXNBcmcgP1xuICAgICAgICAgICAgcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNikgOlxuICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYpKSA6XG4gICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYpO1xufVxuLyoqXG4gKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuXG4gKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90XG4gKiBAcGFyYW0gcHVyZUZuXG4gKiBAcGFyYW0gZXhwMVxuICogQHBhcmFtIGV4cDJcbiAqIEBwYXJhbSBleHAzXG4gKiBAcGFyYW0gZXhwNFxuICogQHBhcmFtIGV4cDVcbiAqIEBwYXJhbSBleHA2XG4gKiBAcGFyYW0gZXhwN1xuICogQHBhcmFtIHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGblxuICogQHJldHVybnMgVXBkYXRlZCBvciBjYWNoZWQgdmFsdWVcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uNyhzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcsIHRoaXNBcmcpIHtcbiAgICAvLyBUT0RPKGthcmEpOiB1c2UgYmluZGluZ1Jvb3QgaW5zdGVhZCBvZiBiaW5kaW5nU3RhcnRJbmRleCB3aGVuIGltcGxlbWVudGluZyBob3N0IGJpbmRpbmdzXG4gICAgdmFyIGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdSb290KCkgKyBzbG90T2Zmc2V0O1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzLCBleHA0KTtcbiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3KSB8fCBkaWZmZXJlbnQgP1xuICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA3LCB0aGlzQXJnID9cbiAgICAgICAgICAgIHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcpIDpcbiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3KSkgOlxuICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA3KTtcbn1cbi8qKlxuICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVyblxuICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdFxuICogQHBhcmFtIHB1cmVGblxuICogQHBhcmFtIGV4cDFcbiAqIEBwYXJhbSBleHAyXG4gKiBAcGFyYW0gZXhwM1xuICogQHBhcmFtIGV4cDRcbiAqIEBwYXJhbSBleHA1XG4gKiBAcGFyYW0gZXhwNlxuICogQHBhcmFtIGV4cDdcbiAqIEBwYXJhbSBleHA4XG4gKiBAcGFyYW0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuXG4gKiBAcmV0dXJucyBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZVxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb244KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCwgdGhpc0FyZykge1xuICAgIC8vIFRPRE8oa2FyYSk6IHVzZSBiaW5kaW5nUm9vdCBpbnN0ZWFkIG9mIGJpbmRpbmdTdGFydEluZGV4IHdoZW4gaW1wbGVtZW50aW5nIGhvc3QgYmluZGluZ3NcbiAgICB2YXIgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICB2YXIgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpO1xuICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIGV4cDUsIGV4cDYsIGV4cDcsIGV4cDgpIHx8IGRpZmZlcmVudCA/XG4gICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgsIHRoaXNBcmcgP1xuICAgICAgICAgICAgcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCkgOlxuICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcsIGV4cDgpKSA6XG4gICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgpO1xufVxuLyoqXG4gKiBwdXJlRnVuY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gc3VwcG9ydCBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzLlxuICpcbiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm5cbiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3RcbiAqIEBwYXJhbSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXlcbiAqIGNvbnRhaW5pbmcgdGhvc2UgdmFsdWVzLlxuICogQHBhcmFtIGV4cHMgQW4gYXJyYXkgb2YgYmluZGluZyB2YWx1ZXNcbiAqIEBwYXJhbSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm5cbiAqIEByZXR1cm5zIFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvblYoc2xvdE9mZnNldCwgcHVyZUZuLCBleHBzLCB0aGlzQXJnKSB7XG4gICAgLy8gVE9ETyhrYXJhKTogdXNlIGJpbmRpbmdSb290IGluc3RlYWQgb2YgYmluZGluZ1N0YXJ0SW5kZXggd2hlbiBpbXBsZW1lbnRpbmcgaG9zdCBiaW5kaW5nc1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDtcbiAgICB2YXIgZGlmZmVyZW50ID0gZmFsc2U7XG4gICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCsrLCBleHBzW2ldKSAmJiAoZGlmZmVyZW50ID0gdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBkaWZmZXJlbnQgPyB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHB1cmVGbi5hcHBseSh0aGlzQXJnLCBleHBzKSkgOlxuICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXgpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENyZWF0ZSBhIHBpcGUuXG4gKlxuICogQHBhcmFtIGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2lsbCBiZSBzdG9yZWQuXG4gKiBAcGFyYW0gcGlwZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHBpcGVcbiAqIEByZXR1cm5zIFQgdGhlIGluc3RhbmNlIG9mIHRoZSBwaXBlLlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwaXBlKGluZGV4LCBwaXBlTmFtZSkge1xuICAgIHZhciB0VmlldyA9IGdldExWaWV3KClbVFZJRVddO1xuICAgIHZhciBwaXBlRGVmO1xuICAgIHZhciBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUO1xuICAgIGlmICh0Vmlldy5maXJzdFRlbXBsYXRlUGFzcykge1xuICAgICAgICBwaXBlRGVmID0gZ2V0UGlwZURlZiQxKHBpcGVOYW1lLCB0Vmlldy5waXBlUmVnaXN0cnkpO1xuICAgICAgICB0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdID0gcGlwZURlZjtcbiAgICAgICAgaWYgKHBpcGVEZWYub25EZXN0cm95KSB7XG4gICAgICAgICAgICAodFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSkpLnB1c2goYWRqdXN0ZWRJbmRleCwgcGlwZURlZi5vbkRlc3Ryb3kpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwaXBlRGVmID0gdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XTtcbiAgICB9XG4gICAgdmFyIHBpcGVJbnN0YW5jZSA9IHBpcGVEZWYuZmFjdG9yeShudWxsKTtcbiAgICBzdG9yZShpbmRleCwgcGlwZUluc3RhbmNlKTtcbiAgICByZXR1cm4gcGlwZUluc3RhbmNlO1xufVxuLyoqXG4gKiBTZWFyY2hlcyB0aGUgcGlwZSByZWdpc3RyeSBmb3IgYSBwaXBlIHdpdGggdGhlIGdpdmVuIG5hbWUuIElmIG9uZSBpcyBmb3VuZCxcbiAqIHJldHVybnMgdGhlIHBpcGUuIE90aGVyd2lzZSwgYW4gZXJyb3IgaXMgdGhyb3duIGJlY2F1c2UgdGhlIHBpcGUgY2Fubm90IGJlIHJlc29sdmVkLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgcGlwZSB0byByZXNvbHZlXG4gKiBAcGFyYW0gcmVnaXN0cnkgRnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBwaXBlc1xuICogQHJldHVybnMgTWF0Y2hpbmcgUGlwZURlZlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0UGlwZURlZiQxKG5hbWUsIHJlZ2lzdHJ5KSB7XG4gICAgaWYgKHJlZ2lzdHJ5KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSByZWdpc3RyeS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIHBpcGVEZWYgPSByZWdpc3RyeVtpXTtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBwaXBlRGVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGlwZURlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGlwZSAnXCIgKyBuYW1lICsgXCInIGNvdWxkIG5vdCBiZSBmb3VuZCFcIik7XG59XG4vKipcbiAqIEludm9rZXMgYSBwaXBlIHdpdGggMSBhcmd1bWVudHMuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZ1xuICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi5cbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2VcbiAqIEBwYXJhbSB2MSAxc3QgYXJndW1lbnQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cGlwZUJpbmQxKGluZGV4LCBzbG90T2Zmc2V0LCB2MSkge1xuICAgIHZhciBwaXBlSW5zdGFuY2UgPSDJtcm1bG9hZChpbmRleCk7XG4gICAgcmV0dXJuIHVud3JhcFZhbHVlJDEoaXNQdXJlKGluZGV4KSA/IMm1ybVwdXJlRnVuY3Rpb24xKHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCBwaXBlSW5zdGFuY2UpIDpcbiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSkpO1xufVxuLyoqXG4gKiBJbnZva2VzIGEgcGlwZSB3aXRoIDIgYXJndW1lbnRzLlxuICpcbiAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gaW52b2tpbmdcbiAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uXG4gKiBAcGFyYW0gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlXG4gKiBAcGFyYW0gdjEgMXN0IGFyZ3VtZW50IHRvIHtAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uXG4gKiBAcGFyYW0gdjIgMm5kIGFyZ3VtZW50IHRvIHtAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXBpcGVCaW5kMihpbmRleCwgc2xvdE9mZnNldCwgdjEsIHYyKSB7XG4gICAgdmFyIHBpcGVJbnN0YW5jZSA9IMm1ybVsb2FkKGluZGV4KTtcbiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShpc1B1cmUoaW5kZXgpID8gybXJtXB1cmVGdW5jdGlvbjIoc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdjEsIHYyLCBwaXBlSW5zdGFuY2UpIDpcbiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSwgdjIpKTtcbn1cbi8qKlxuICogSW52b2tlcyBhIHBpcGUgd2l0aCAzIGFyZ3VtZW50cy5cbiAqXG4gKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7QGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nXG4gKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLlxuICogQHBhcmFtIHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZVxuICogQHBhcmFtIHYxIDFzdCBhcmd1bWVudCB0byB7QGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LlxuICogQHBhcmFtIHYyIDJuZCBhcmd1bWVudCB0byB7QGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LlxuICogQHBhcmFtIHYzIDRyZCBhcmd1bWVudCB0byB7QGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybVwaXBlQmluZDMoaW5kZXgsIHNsb3RPZmZzZXQsIHYxLCB2MiwgdjMpIHtcbiAgICB2YXIgcGlwZUluc3RhbmNlID0gybXJtWxvYWQoaW5kZXgpO1xuICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGlzUHVyZShpbmRleCkgP1xuICAgICAgICDJtcm1cHVyZUZ1bmN0aW9uMyhzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgdjIsIHYzLCBwaXBlSW5zdGFuY2UpIDpcbiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSwgdjIsIHYzKSk7XG59XG4vKipcbiAqIEludm9rZXMgYSBwaXBlIHdpdGggNCBhcmd1bWVudHMuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZ1xuICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi5cbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2VcbiAqIEBwYXJhbSB2MSAxc3QgYXJndW1lbnQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS5cbiAqIEBwYXJhbSB2MiAybmQgYXJndW1lbnQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS5cbiAqIEBwYXJhbSB2MyAzcmQgYXJndW1lbnQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS5cbiAqIEBwYXJhbSB2NCA0dGggYXJndW1lbnQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1cGlwZUJpbmQ0KGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIsIHYzLCB2NCkge1xuICAgIHZhciBwaXBlSW5zdGFuY2UgPSDJtcm1bG9hZChpbmRleCk7XG4gICAgcmV0dXJuIHVud3JhcFZhbHVlJDEoaXNQdXJlKGluZGV4KSA/XG4gICAgICAgIMm1ybVwdXJlRnVuY3Rpb240KHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCB2MiwgdjMsIHY0LCBwaXBlSW5zdGFuY2UpIDpcbiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSwgdjIsIHYzLCB2NCkpO1xufVxuLyoqXG4gKiBJbnZva2VzIGEgcGlwZSB3aXRoIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuXG4gKlxuICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZ1xuICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi5cbiAqIEBwYXJhbSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2VcbiAqIEBwYXJhbSB2YWx1ZXMgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8ge0BsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBtZXRob2QuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXBpcGVCaW5kVihpbmRleCwgc2xvdE9mZnNldCwgdmFsdWVzKSB7XG4gICAgdmFyIHBpcGVJbnN0YW5jZSA9IMm1ybVsb2FkKGluZGV4KTtcbiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShpc1B1cmUoaW5kZXgpID8gybXJtXB1cmVGdW5jdGlvblYoc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdmFsdWVzLCBwaXBlSW5zdGFuY2UpIDpcbiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybS5hcHBseShwaXBlSW5zdGFuY2UsIHZhbHVlcykpO1xufVxuZnVuY3Rpb24gaXNQdXJlKGluZGV4KSB7XG4gICAgcmV0dXJuIGdldExWaWV3KClbVFZJRVddLmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXS5wdXJlO1xufVxuLyoqXG4gKiBVbndyYXAgdGhlIG91dHB1dCBvZiBhIHBpcGUgdHJhbnNmb3JtYXRpb24uXG4gKiBJbiBvcmRlciB0byB0cmljayBjaGFuZ2UgZGV0ZWN0aW9uIGludG8gY29uc2lkZXJpbmcgdGhhdCB0aGUgbmV3IHZhbHVlIGlzIGFsd2F5cyBkaWZmZXJlbnQgZnJvbVxuICogdGhlIG9sZCBvbmUsIHRoZSBvbGQgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gYnkgTk9fQ0hBTkdFLlxuICpcbiAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgcGlwZSB0cmFuc2Zvcm1hdGlvbiBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHVud3JhcFZhbHVlJDEobmV3VmFsdWUpIHtcbiAgICBpZiAoV3JhcHBlZFZhbHVlLmlzV3JhcHBlZChuZXdWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBXcmFwcGVkVmFsdWUudW53cmFwKG5ld1ZhbHVlKTtcbiAgICAgICAgdmFyIGxWaWV3ID0gZ2V0TFZpZXcoKTtcbiAgICAgICAgLy8gVGhlIE5PX0NIQU5HRSB2YWx1ZSBuZWVkcyB0byBiZSB3cml0dGVuIGF0IHRoZSBpbmRleCB3aGVyZSB0aGUgaW1wYWN0ZWQgYmluZGluZyB2YWx1ZSBpc1xuICAgICAgICAvLyBzdG9yZWRcbiAgICAgICAgdmFyIGJpbmRpbmdUb0ludmFsaWRhdGVJZHggPSBsVmlld1tCSU5ESU5HX0lOREVYXTtcbiAgICAgICAgbFZpZXdbYmluZGluZ1RvSW52YWxpZGF0ZUlkeF0gPSBOT19DSEFOR0U7XG4gICAgfVxuICAgIHJldHVybiBuZXdWYWx1ZTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBVc2UgaW4gZGlyZWN0aXZlcyBhbmQgY29tcG9uZW50cyB0byBlbWl0IGN1c3RvbSBldmVudHMgc3luY2hyb25vdXNseVxuICogb3IgYXN5bmNocm9ub3VzbHksIGFuZCByZWdpc3RlciBoYW5kbGVycyBmb3IgdGhvc2UgZXZlbnRzIGJ5IHN1YnNjcmliaW5nXG4gKiB0byBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYSBjb21wb25lbnQgZGVmaW5lcyB0d28gb3V0cHV0IHByb3BlcnRpZXNcbiAqIHRoYXQgY3JlYXRlIGV2ZW50IGVtaXR0ZXJzLiBXaGVuIHRoZSB0aXRsZSBpcyBjbGlja2VkLCB0aGUgZW1pdHRlclxuICogZW1pdHMgYW4gb3BlbiBvciBjbG9zZSBldmVudCB0byB0b2dnbGUgdGhlIGN1cnJlbnQgdmlzaWJpbGl0eSBzdGF0ZS5cbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3ppcHB5JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgPGRpdiBjbGFzcz1cInppcHB5XCI+XG4gKiAgICAgPGRpdiAoY2xpY2spPVwidG9nZ2xlKClcIj5Ub2dnbGU8L2Rpdj5cbiAqICAgICA8ZGl2IFtoaWRkZW5dPVwiIXZpc2libGVcIj5cbiAqICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAqICAgICA8L2Rpdj5cbiAqICA8L2Rpdj5gfSlcbiAqIGV4cG9ydCBjbGFzcyBaaXBweSB7XG4gKiAgIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICogICBAT3V0cHV0KCkgb3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gKiAgIEBPdXRwdXQoKSBjbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gKlxuICogICB0b2dnbGUoKSB7XG4gKiAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMudmlzaWJsZTtcbiAqICAgICBpZiAodGhpcy52aXNpYmxlKSB7XG4gKiAgICAgICB0aGlzLm9wZW4uZW1pdChudWxsKTtcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgdGhpcy5jbG9zZS5lbWl0KG51bGwpO1xuICogICAgIH1cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQWNjZXNzIHRoZSBldmVudCBvYmplY3Qgd2l0aCB0aGUgYCRldmVudGAgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBvdXRwdXQgZXZlbnRcbiAqIGhhbmRsZXI6XG4gKlxuICogYGBgXG4gKiA8emlwcHkgKG9wZW4pPVwib25PcGVuKCRldmVudClcIiAoY2xvc2UpPVwib25DbG9zZSgkZXZlbnQpXCI+PC96aXBweT5cbiAqIGBgYFxuICpcbiAqICMjIyBOb3Rlc1xuICpcbiAqIFVzZXMgUnguT2JzZXJ2YWJsZSBidXQgcHJvdmlkZXMgYW4gYWRhcHRlciB0byBtYWtlIGl0IHdvcmsgYXMgc3BlY2lmaWVkIGhlcmU6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vamh1c2Fpbi9vYnNlcnZhYmxlLXNwZWNcbiAqXG4gKiBPbmNlIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzcGVjIGlzIGF2YWlsYWJsZSwgc3dpdGNoIHRvIGl0LlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEV2ZW50RW1pdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRXZlbnRFbWl0dGVyLCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0aGF0IGNhblxuICAgICAqIGRlbGl2ZXIgZXZlbnRzIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNBc3luYyBXaGVuIHRydWUsIGRlbGl2ZXIgZXZlbnRzIGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKGlzQXN5bmMpIHtcbiAgICAgICAgaWYgKGlzQXN5bmMgPT09IHZvaWQgMCkgeyBpc0FzeW5jID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX19pc0FzeW5jID0gaXNBc3luYztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCBjb250YWluaW5nIGEgZ2l2ZW4gdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBlbWl0LlxuICAgICAqL1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7IH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGhhbmRsZXJzIGZvciBldmVudHMgZW1pdHRlZCBieSB0aGlzIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBnZW5lcmF0b3JPck5leHQgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgZW1pdHRlZCBldmVudHMuXG4gICAgICogQHBhcmFtIGVycm9yIFdoZW4gc3VwcGxpZWQsIGEgY3VzdG9tIGhhbmRsZXIgZm9yIGFuIGVycm9yIG5vdGlmaWNhdGlvblxuICAgICAqIGZyb20gdGhpcyBlbWl0dGVyLlxuICAgICAqIEBwYXJhbSBjb21wbGV0ZSBXaGVuIHN1cHBsaWVkLCBhIGN1c3RvbSBoYW5kbGVyIGZvciBhIGNvbXBsZXRpb25cbiAgICAgKiBub3RpZmljYXRpb24gZnJvbSB0aGlzIGVtaXR0ZXIuXG4gICAgICovXG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoZ2VuZXJhdG9yT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlckZuO1xuICAgICAgICB2YXIgZXJyb3JGbiA9IGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgICAgIHZhciBjb21wbGV0ZUZuID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dCAmJiB0eXBlb2YgZ2VuZXJhdG9yT3JOZXh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpOyB9KTtcbiAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodmFsdWUpIHsgZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpOyB9O1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uIChlcnIpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBnZW5lcmF0b3JPck5leHQuZXJyb3IoZXJyKTsgfSk7IH0gOlxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7IGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpOyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlRm4gPSB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBnZW5lcmF0b3JPck5leHQuY29tcGxldGUoKTsgfSk7IH0gOlxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7IGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICh2YWx1ZSkgeyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdlbmVyYXRvck9yTmV4dCh2YWx1ZSk7IH0pOyB9IDpcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHsgZ2VuZXJhdG9yT3JOZXh0KHZhbHVlKTsgfTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yRm4gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uIChlcnIpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBlcnJvcihlcnIpOyB9KTsgfSA6IGZ1bmN0aW9uIChlcnIpIHsgZXJyb3IoZXJyKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlRm4gPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9faXNBc3luYyA/IGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjb21wbGV0ZSgpOyB9KTsgfSA6IGZ1bmN0aW9uICgpIHsgY29tcGxldGUoKTsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc2luayA9IF9zdXBlci5wcm90b3R5cGUuc3Vic2NyaWJlLmNhbGwodGhpcywgc2NoZWR1bGVyRm4sIGVycm9yRm4sIGNvbXBsZXRlRm4pO1xuICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBnZW5lcmF0b3JPck5leHQuYWRkKHNpbmspO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW5rO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlcjtcbn0oU3ViamVjdCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZW1zIHRoYXQgQW5ndWxhciBrZWVwcyB1cCB0byBkYXRlIHdoZW4gdGhlIHN0YXRlXG4gKiBvZiB0aGUgYXBwbGljYXRpb24gY2hhbmdlcy5cbiAqXG4gKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCB7QGxpbmsgVmlld0NoaWxkcmVufSwge0BsaW5rIENvbnRlbnRDaGlsZHJlbn0sIGFuZCB7QGxpbmsgUXVlcnlMaXN0fVxuICogcHJvdmlkZS5cbiAqXG4gKiBJbXBsZW1lbnRzIGFuIGl0ZXJhYmxlIGludGVyZmFjZSwgdGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIGluIGJvdGggRVM2XG4gKiBqYXZhc2NyaXB0IGBmb3IgKHZhciBpIG9mIGl0ZW1zKWAgbG9vcHMgYXMgd2VsbCBhcyBpbiBBbmd1bGFyIHRlbXBsYXRlcyB3aXRoXG4gKiBgKm5nRm9yPVwibGV0IGkgb2YgbXlMaXN0XCJgLlxuICpcbiAqIENoYW5nZXMgY2FuIGJlIG9ic2VydmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBjaGFuZ2VzIGBPYnNlcnZhYmxlYC5cbiAqXG4gKiBOT1RFOiBJbiB0aGUgZnV0dXJlIHRoaXMgY2xhc3Mgd2lsbCBpbXBsZW1lbnQgYW4gYE9ic2VydmFibGVgIGludGVyZmFjZS5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBjbGFzcyBDb250YWluZXIge1xuICogICBAVmlld0NoaWxkcmVuKEl0ZW0pIGl0ZW1zOlF1ZXJ5TGlzdDxJdGVtPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFF1ZXJ5TGlzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBRdWVyeUxpc3QoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWVcbiAgICAgKiBbQXJyYXkubWFwXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXApXG4gICAgICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHMubWFwKGZuKTsgfTtcbiAgICAvKipcbiAgICAgKiBTZWVcbiAgICAgKiBbQXJyYXkuZmlsdGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maWx0ZXIpXG4gICAgICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmlsdGVyKGZuKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlZVxuICAgICAqIFtBcnJheS5maW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kKVxuICAgICAqL1xuICAgIFF1ZXJ5TGlzdC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5maW5kKGZuKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlZVxuICAgICAqIFtBcnJheS5yZWR1Y2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZSlcbiAgICAgKi9cbiAgICBRdWVyeUxpc3QucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIChmbiwgaW5pdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5yZWR1Y2UoZm4sIGluaXQpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2VlXG4gICAgICogW0FycmF5LmZvckVhY2hdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gpXG4gICAgICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMuX3Jlc3VsdHMuZm9yRWFjaChmbik7IH07XG4gICAgLyoqXG4gICAgICogU2VlXG4gICAgICogW0FycmF5LnNvbWVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvbWUpXG4gICAgICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5zb21lID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLnNvbWUoZm4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHJlc3VsdHMgbGlzdCBhcyBhbiBBcnJheS5cbiAgICAgKi9cbiAgICBRdWVyeUxpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLnNsaWNlKCk7IH07XG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZVtnZXRTeW1ib2xJdGVyYXRvcigpXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHNbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTsgfTtcbiAgICBRdWVyeUxpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy50b1N0cmluZygpOyB9O1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN0b3JlZCBkYXRhIG9mIHRoZSBxdWVyeSBsaXN0LCBhbmQgcmVzZXRzIHRoZSBgZGlydHlgIGZsYWcgdG8gYGZhbHNlYCwgc28gdGhhdFxuICAgICAqIG9uIGNoYW5nZSBkZXRlY3Rpb24sIGl0IHdpbGwgbm90IG5vdGlmeSBvZiBjaGFuZ2VzIHRvIHRoZSBxdWVyaWVzLCB1bmxlc3MgYSBuZXcgY2hhbmdlXG4gICAgICogb2NjdXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdHNUcmVlIFRoZSByZXN1bHRzIHRyZWUgdG8gc3RvcmVcbiAgICAgKi9cbiAgICBRdWVyeUxpc3QucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKHJlc3VsdHNUcmVlKSB7XG4gICAgICAgIHRoaXMuX3Jlc3VsdHMgPSBmbGF0dGVuKHJlc3VsdHNUcmVlKTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX3Jlc3VsdHMubGVuZ3RoO1xuICAgICAgICB0aGlzLmxhc3QgPSB0aGlzLl9yZXN1bHRzW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMuZmlyc3QgPSB0aGlzLl9yZXN1bHRzWzBdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcnMgYSBjaGFuZ2UgZXZlbnQgYnkgZW1pdHRpbmcgb24gdGhlIGBjaGFuZ2VzYCB7QGxpbmsgRXZlbnRFbWl0dGVyfS5cbiAgICAgKi9cbiAgICBRdWVyeUxpc3QucHJvdG90eXBlLm5vdGlmeU9uQ2hhbmdlcyA9IGZ1bmN0aW9uICgpIHsgdGhpcy5jaGFuZ2VzLmVtaXQodGhpcyk7IH07XG4gICAgLyoqIGludGVybmFsICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5zZXREaXJ0eSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5kaXJ0eSA9IHRydWU7IH07XG4gICAgLyoqIGludGVybmFsICovXG4gICAgUXVlcnlMaXN0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNoYW5nZXMuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gUXVlcnlMaXN0O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBMUXVlcmllc18gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTFF1ZXJpZXNfKHBhcmVudCwgc2hhbGxvdywgZGVlcCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5zaGFsbG93ID0gc2hhbGxvdztcbiAgICAgICAgdGhpcy5kZWVwID0gZGVlcDtcbiAgICB9XG4gICAgTFF1ZXJpZXNfLnByb3RvdHlwZS50cmFjayA9IGZ1bmN0aW9uIChxdWVyeUxpc3QsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkge1xuICAgICAgICBpZiAoZGVzY2VuZCkge1xuICAgICAgICAgICAgdGhpcy5kZWVwID0gY3JlYXRlUXVlcnkodGhpcy5kZWVwLCBxdWVyeUxpc3QsIHByZWRpY2F0ZSwgcmVhZCAhPSBudWxsID8gcmVhZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaGFsbG93ID0gY3JlYXRlUXVlcnkodGhpcy5zaGFsbG93LCBxdWVyeUxpc3QsIHByZWRpY2F0ZSwgcmVhZCAhPSBudWxsID8gcmVhZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBMUXVlcmllc18ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IExRdWVyaWVzXyh0aGlzLCBudWxsLCB0aGlzLmRlZXApOyB9O1xuICAgIExRdWVyaWVzXy5wcm90b3R5cGUuY29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2hhbGxvd1Jlc3VsdHMgPSBjb3B5UXVlcmllc1RvQ29udGFpbmVyKHRoaXMuc2hhbGxvdyk7XG4gICAgICAgIHZhciBkZWVwUmVzdWx0cyA9IGNvcHlRdWVyaWVzVG9Db250YWluZXIodGhpcy5kZWVwKTtcbiAgICAgICAgcmV0dXJuIHNoYWxsb3dSZXN1bHRzIHx8IGRlZXBSZXN1bHRzID8gbmV3IExRdWVyaWVzXyh0aGlzLCBzaGFsbG93UmVzdWx0cywgZGVlcFJlc3VsdHMpIDogbnVsbDtcbiAgICB9O1xuICAgIExRdWVyaWVzXy5wcm90b3R5cGUuY3JlYXRlVmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNoYWxsb3dSZXN1bHRzID0gY29weVF1ZXJpZXNUb1ZpZXcodGhpcy5zaGFsbG93KTtcbiAgICAgICAgdmFyIGRlZXBSZXN1bHRzID0gY29weVF1ZXJpZXNUb1ZpZXcodGhpcy5kZWVwKTtcbiAgICAgICAgcmV0dXJuIHNoYWxsb3dSZXN1bHRzIHx8IGRlZXBSZXN1bHRzID8gbmV3IExRdWVyaWVzXyh0aGlzLCBzaGFsbG93UmVzdWx0cywgZGVlcFJlc3VsdHMpIDogbnVsbDtcbiAgICB9O1xuICAgIExRdWVyaWVzXy5wcm90b3R5cGUuaW5zZXJ0VmlldyA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpbnNlcnRWaWV3JDEoaW5kZXgsIHRoaXMuc2hhbGxvdyk7XG4gICAgICAgIGluc2VydFZpZXckMShpbmRleCwgdGhpcy5kZWVwKTtcbiAgICB9O1xuICAgIExRdWVyaWVzXy5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uICh0Tm9kZSkge1xuICAgICAgICBhZGQodGhpcy5kZWVwLCB0Tm9kZSwgZmFsc2UpO1xuICAgICAgICBhZGQodGhpcy5zaGFsbG93LCB0Tm9kZSwgZmFsc2UpO1xuICAgIH07XG4gICAgTFF1ZXJpZXNfLnByb3RvdHlwZS5pbnNlcnROb2RlQmVmb3JlVmlld3MgPSBmdW5jdGlvbiAodE5vZGUpIHtcbiAgICAgICAgYWRkKHRoaXMuZGVlcCwgdE5vZGUsIHRydWUpO1xuICAgICAgICBhZGQodGhpcy5zaGFsbG93LCB0Tm9kZSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBMUXVlcmllc18ucHJvdG90eXBlLnJlbW92ZVZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlbW92ZVZpZXckMSh0aGlzLnNoYWxsb3cpO1xuICAgICAgICByZW1vdmVWaWV3JDEodGhpcy5kZWVwKTtcbiAgICB9O1xuICAgIHJldHVybiBMUXVlcmllc187XG59KCkpO1xuZnVuY3Rpb24gY29weVF1ZXJpZXNUb0NvbnRhaW5lcihxdWVyeSkge1xuICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgIHdoaWxlIChxdWVyeSkge1xuICAgICAgICB2YXIgY29udGFpbmVyVmFsdWVzID0gW107IC8vIHByZXBhcmUgcm9vbSBmb3Igdmlld3NcbiAgICAgICAgcXVlcnkudmFsdWVzLnB1c2goY29udGFpbmVyVmFsdWVzKTtcbiAgICAgICAgdmFyIGNsb25lZFF1ZXJ5ID0ge1xuICAgICAgICAgICAgbmV4dDogcmVzdWx0LFxuICAgICAgICAgICAgbGlzdDogcXVlcnkubGlzdCxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogcXVlcnkucHJlZGljYXRlLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250YWluZXJWYWx1ZXMsXG4gICAgICAgICAgICBjb250YWluZXJWYWx1ZXM6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0ID0gY2xvbmVkUXVlcnk7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkubmV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNvcHlRdWVyaWVzVG9WaWV3KHF1ZXJ5KSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgd2hpbGUgKHF1ZXJ5KSB7XG4gICAgICAgIHZhciBjbG9uZWRRdWVyeSA9IHtcbiAgICAgICAgICAgIG5leHQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGxpc3Q6IHF1ZXJ5Lmxpc3QsXG4gICAgICAgICAgICBwcmVkaWNhdGU6IHF1ZXJ5LnByZWRpY2F0ZSxcbiAgICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgICBjb250YWluZXJWYWx1ZXM6IHF1ZXJ5LnZhbHVlc1xuICAgICAgICB9O1xuICAgICAgICByZXN1bHQgPSBjbG9uZWRRdWVyeTtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5uZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaW5zZXJ0VmlldyQxKGluZGV4LCBxdWVyeSkge1xuICAgIHdoaWxlIChxdWVyeSkge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Vmlld1F1ZXJ5aGFzUG9pbnRlclRvRGVjbGFyYXRpb25Db250YWluZXIocXVlcnkpO1xuICAgICAgICBxdWVyeS5jb250YWluZXJWYWx1ZXMuc3BsaWNlKGluZGV4LCAwLCBxdWVyeS52YWx1ZXMpO1xuICAgICAgICAvLyBtYXJrIGEgcXVlcnkgYXMgZGlydHkgb25seSB3aGVuIGluc2VydGVkIHZpZXcgaGFkIG1hdGNoaW5nIG1vZGVzXG4gICAgICAgIGlmIChxdWVyeS52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBxdWVyeS5saXN0LnNldERpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgPSBxdWVyeS5uZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVZpZXckMShxdWVyeSkge1xuICAgIHdoaWxlIChxdWVyeSkge1xuICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Vmlld1F1ZXJ5aGFzUG9pbnRlclRvRGVjbGFyYXRpb25Db250YWluZXIocXVlcnkpO1xuICAgICAgICB2YXIgY29udGFpbmVyVmFsdWVzID0gcXVlcnkuY29udGFpbmVyVmFsdWVzO1xuICAgICAgICB2YXIgdmlld1ZhbHVlc0lkeCA9IGNvbnRhaW5lclZhbHVlcy5pbmRleE9mKHF1ZXJ5LnZhbHVlcyk7XG4gICAgICAgIHZhciByZW1vdmVkID0gY29udGFpbmVyVmFsdWVzLnNwbGljZSh2aWV3VmFsdWVzSWR4LCAxKTtcbiAgICAgICAgLy8gbWFyayBhIHF1ZXJ5IGFzIGRpcnR5IG9ubHkgd2hlbiByZW1vdmVkIHZpZXcgaGFkIG1hdGNoaW5nIG1vZGVzXG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChyZW1vdmVkLmxlbmd0aCwgMSwgJ3JlbW92ZWQubGVuZ3RoJyk7XG4gICAgICAgIGlmIChyZW1vdmVkWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgcXVlcnkubGlzdC5zZXREaXJ0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkubmV4dDtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnRWaWV3UXVlcnloYXNQb2ludGVyVG9EZWNsYXJhdGlvbkNvbnRhaW5lcihxdWVyeSkge1xuICAgIGFzc2VydERlZmluZWQocXVlcnkuY29udGFpbmVyVmFsdWVzLCAnVmlldyBxdWVyaWVzIG5lZWQgdG8gaGF2ZSBhIHBvaW50ZXIgdG8gY29udGFpbmVyIHZhbHVlcy4nKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBsb2NhbCBuYW1lcyBmb3IgYSBnaXZlbiBub2RlIGFuZCByZXR1cm5zIGRpcmVjdGl2ZSBpbmRleFxuICogKG9yIC0xIGlmIGEgbG9jYWwgbmFtZSBwb2ludHMgdG8gYW4gZWxlbWVudCkuXG4gKlxuICogQHBhcmFtIHROb2RlIHN0YXRpYyBkYXRhIG9mIGEgbm9kZSB0byBjaGVja1xuICogQHBhcmFtIHNlbGVjdG9yIHNlbGVjdG9yIHRvIG1hdGNoXG4gKiBAcmV0dXJucyBkaXJlY3RpdmUgaW5kZXgsIC0xIG9yIG51bGwgaWYgYSBzZWxlY3RvciBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBsb2NhbCBuYW1lc1xuICovXG5mdW5jdGlvbiBnZXRJZHhPZk1hdGNoaW5nU2VsZWN0b3IodE5vZGUsIHNlbGVjdG9yKSB7XG4gICAgdmFyIGxvY2FsTmFtZXMgPSB0Tm9kZS5sb2NhbE5hbWVzO1xuICAgIGlmIChsb2NhbE5hbWVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jYWxOYW1lcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaWYgKGxvY2FsTmFtZXNbaV0gPT09IHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZXNbaSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8gVE9ETzogXCJyZWFkXCIgc2hvdWxkIGJlIGFuIEFic3RyYWN0VHlwZSAoRlctNDg2KVxuZnVuY3Rpb24gcXVlcnlCeVJlYWRUb2tlbihyZWFkLCB0Tm9kZSwgY3VycmVudFZpZXcpIHtcbiAgICB2YXIgZmFjdG9yeUZuID0gcmVhZFtOR19FTEVNRU5UX0lEXTtcbiAgICBpZiAodHlwZW9mIGZhY3RvcnlGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFjdG9yeUZuKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbWF0Y2hpbmdJZHggPSBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCBjdXJyZW50VmlldywgcmVhZCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nSWR4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZUluamVjdGFibGUoY3VycmVudFZpZXdbVFZJRVddLmRhdGEsIGN1cnJlbnRWaWV3LCBtYXRjaGluZ0lkeCwgdE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcXVlcnlCeVROb2RlVHlwZSh0Tm9kZSwgY3VycmVudFZpZXcpIHtcbiAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovIHx8IHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykge1xuICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0Tm9kZSwgY3VycmVudFZpZXcpO1xuICAgIH1cbiAgICBpZiAodE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmLCB0Tm9kZSwgY3VycmVudFZpZXcpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHF1ZXJ5QnlUZW1wbGF0ZVJlZih0ZW1wbGF0ZVJlZlRva2VuLCB0Tm9kZSwgY3VycmVudFZpZXcsIHJlYWQpIHtcbiAgICB2YXIgdGVtcGxhdGVSZWZSZXN1bHQgPSB0ZW1wbGF0ZVJlZlRva2VuW05HX0VMRU1FTlRfSURdKCk7XG4gICAgaWYgKHJlYWQpIHtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlUmVmUmVzdWx0ID8gcXVlcnlCeVJlYWRUb2tlbihyZWFkLCB0Tm9kZSwgY3VycmVudFZpZXcpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlUmVmUmVzdWx0O1xufVxuZnVuY3Rpb24gcXVlcnlSZWFkKHROb2RlLCBjdXJyZW50VmlldywgcmVhZCwgbWF0Y2hpbmdJZHgpIHtcbiAgICBpZiAocmVhZCkge1xuICAgICAgICByZXR1cm4gcXVlcnlCeVJlYWRUb2tlbihyZWFkLCB0Tm9kZSwgY3VycmVudFZpZXcpO1xuICAgIH1cbiAgICBpZiAobWF0Y2hpbmdJZHggPiAtMSkge1xuICAgICAgICByZXR1cm4gZ2V0Tm9kZUluamVjdGFibGUoY3VycmVudFZpZXdbVFZJRVddLmRhdGEsIGN1cnJlbnRWaWV3LCBtYXRjaGluZ0lkeCwgdE5vZGUpO1xuICAgIH1cbiAgICAvLyBpZiByZWFkIHRva2VuIGFuZCAvIG9yIHN0cmF0ZWd5IGlzIG5vdCBzcGVjaWZpZWQsXG4gICAgLy8gZGV0ZWN0IGl0IHVzaW5nIGFwcHJvcHJpYXRlIHROb2RlIHR5cGVcbiAgICByZXR1cm4gcXVlcnlCeVROb2RlVHlwZSh0Tm9kZSwgY3VycmVudFZpZXcpO1xufVxuLyoqXG4gKiBBZGQgcXVlcnkgbWF0Y2hlcyBmb3IgYSBnaXZlbiBub2RlLlxuICpcbiAqIEBwYXJhbSBxdWVyeSBUaGUgZmlyc3QgcXVlcnkgaW4gdGhlIGxpbmtlZCBsaXN0XG4gKiBAcGFyYW0gdE5vZGUgVGhlIFROb2RlIHRvIG1hdGNoIGFnYWluc3QgcXVlcmllc1xuICogQHBhcmFtIGluc2VydEJlZm9yZUNvbnRhaW5lciBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIG1hdGNoZXMgYmVmb3JlIHRoZSBsYXN0XG4gKiBjb250YWluZXIgYXJyYXkuIFRoaXMgbW9kZSBpcyBuZWNlc3NhcnkgaWYgdGhlIHF1ZXJ5IGNvbnRhaW5lciBoYWQgdG8gYmUgY3JlYXRlZFxuICogb3V0IG9mIG9yZGVyIChlLmcuIGEgdmlldyB3YXMgY3JlYXRlZCBpbiBhIGNvbnN0cnVjdG9yKVxuICovXG5mdW5jdGlvbiBhZGQocXVlcnksIHROb2RlLCBpbnNlcnRCZWZvcmVDb250YWluZXIpIHtcbiAgICB2YXIgY3VycmVudFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHdoaWxlIChxdWVyeSkge1xuICAgICAgICB2YXIgcHJlZGljYXRlID0gcXVlcnkucHJlZGljYXRlO1xuICAgICAgICB2YXIgdHlwZSA9IHByZWRpY2F0ZS50eXBlO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBxdWVyeUJ5VGVtcGxhdGVSZWYodHlwZSwgdE5vZGUsIGN1cnJlbnRWaWV3LCBwcmVkaWNhdGUucmVhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmdJZHggPSBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCBjdXJyZW50VmlldywgdHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdJZHggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcXVlcnlSZWFkKHROb2RlLCBjdXJyZW50VmlldywgcHJlZGljYXRlLnJlYWQsIG1hdGNoaW5nSWR4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYWRkTWF0Y2gocXVlcnksIHJlc3VsdCwgaW5zZXJ0QmVmb3JlQ29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHByZWRpY2F0ZS5zZWxlY3RvcjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0b3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hpbmdJZHggPSBnZXRJZHhPZk1hdGNoaW5nU2VsZWN0b3IodE5vZGUsIHNlbGVjdG9yW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdJZHggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHF1ZXJ5UmVhZCh0Tm9kZSwgY3VycmVudFZpZXcsIHByZWRpY2F0ZS5yZWFkLCBtYXRjaGluZ0lkeCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoKHF1ZXJ5LCByZXN1bHQsIGluc2VydEJlZm9yZUNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgPSBxdWVyeS5uZXh0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZE1hdGNoKHF1ZXJ5LCBtYXRjaGluZ1ZhbHVlLCBpbnNlcnRCZWZvcmVWaWV3TWF0Y2hlcykge1xuICAgIC8vIFZpZXdzIGNyZWF0ZWQgaW4gY29uc3RydWN0b3JzIG1heSBoYXZlIHRoZWlyIGNvbnRhaW5lciB2YWx1ZXMgY3JlYXRlZCB0b28gZWFybHkuIEluIHRoaXMgY2FzZSxcbiAgICAvLyBlbnN1cmUgdGVtcGxhdGUgbm9kZSByZXN1bHRzIGFyZSBzcGxpY2VkIGJlZm9yZSBjb250YWluZXIgcmVzdWx0cy4gT3RoZXJ3aXNlLCByZXN1bHRzIGluc2lkZVxuICAgIC8vIGVtYmVkZGVkIHZpZXdzIHdpbGwgYXBwZWFyIGJlZm9yZSByZXN1bHRzIG9uIHBhcmVudCB0ZW1wbGF0ZSBub2RlcyB3aGVuIGZsYXR0ZW5lZC5cbiAgICBpbnNlcnRCZWZvcmVWaWV3TWF0Y2hlcyA/IHF1ZXJ5LnZhbHVlcy5zcGxpY2UoLTEsIDAsIG1hdGNoaW5nVmFsdWUpIDpcbiAgICAgICAgcXVlcnkudmFsdWVzLnB1c2gobWF0Y2hpbmdWYWx1ZSk7XG4gICAgcXVlcnkubGlzdC5zZXREaXJ0eSgpO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJlZGljYXRlKHByZWRpY2F0ZSwgcmVhZCkge1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwcmVkaWNhdGUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGlzQXJyYXkgPyBudWxsIDogcHJlZGljYXRlLFxuICAgICAgICBzZWxlY3RvcjogaXNBcnJheSA/IHByZWRpY2F0ZSA6IG51bGwsXG4gICAgICAgIHJlYWQ6IHJlYWRcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUXVlcnkocHJldmlvdXMsIHF1ZXJ5TGlzdCwgcHJlZGljYXRlLCByZWFkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogcHJldmlvdXMsXG4gICAgICAgIGxpc3Q6IHF1ZXJ5TGlzdCxcbiAgICAgICAgcHJlZGljYXRlOiBjcmVhdGVQcmVkaWNhdGUocHJlZGljYXRlLCByZWFkKSxcbiAgICAgICAgdmFsdWVzOiBxdWVyeUxpc3QuX3ZhbHVlc1RyZWUsXG4gICAgICAgIGNvbnRhaW5lclZhbHVlczogbnVsbFxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBRdWVyeUxpc3QuXG4gKlxuICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgdHlwZSBmb3Igd2hpY2ggdGhlIHF1ZXJ5IHdpbGwgc2VhcmNoXG4gKiBAcGFyYW0gZGVzY2VuZCBXaGV0aGVyIG9yIG5vdCB0byBkZXNjZW5kIGludG8gY2hpbGRyZW5cbiAqIEBwYXJhbSByZWFkIFdoYXQgdG8gc2F2ZSBpbiB0aGUgcXVlcnlcbiAqIEByZXR1cm5zIFF1ZXJ5TGlzdDxUPlxuICovXG5mdW5jdGlvbiBxdWVyeShcbi8vIFRPRE86IFwicmVhZFwiIHNob3VsZCBiZSBhbiBBYnN0cmFjdFR5cGUgKEZXLTQ4NilcbnByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkge1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRQcmV2aW91c0lzUGFyZW50KGdldElzUGFyZW50KCkpO1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHF1ZXJ5TGlzdCA9IG5ldyBRdWVyeUxpc3QoKTtcbiAgICB2YXIgcXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdIHx8IChsVmlld1tRVUVSSUVTXSA9IG5ldyBMUXVlcmllc18obnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIHF1ZXJ5TGlzdC5fdmFsdWVzVHJlZSA9IFtdO1xuICAgIHF1ZXJ5TGlzdC5fc3RhdGljID0gZmFsc2U7XG4gICAgcXVlcmllcy50cmFjayhxdWVyeUxpc3QsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCk7XG4gICAgc3RvcmVDbGVhbnVwV2l0aENvbnRleHQobFZpZXcsIHF1ZXJ5TGlzdCwgcXVlcnlMaXN0LmRlc3Ryb3kpO1xuICAgIHJldHVybiBxdWVyeUxpc3Q7XG59XG4vKipcbiAqIFJlZnJlc2hlcyBhIHF1ZXJ5IGJ5IGNvbWJpbmluZyBtYXRjaGVzIGZyb20gYWxsIGFjdGl2ZSB2aWV3cyBhbmQgcmVtb3ZpbmcgbWF0Y2hlcyBmcm9tIGRlbGV0ZWRcbiAqIHZpZXdzLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIHF1ZXJ5IGdvdCBkaXJ0eSBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbiBvciBpZiB0aGlzIGlzIGEgc3RhdGljIHF1ZXJ5XG4gKiByZXNvbHZpbmcgaW4gY3JlYXRpb24gbW9kZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXF1ZXJ5UmVmcmVzaChxdWVyeUxpc3QpIHtcbiAgICB2YXIgcXVlcnlMaXN0SW1wbCA9IHF1ZXJ5TGlzdDtcbiAgICB2YXIgY3JlYXRpb25Nb2RlID0gaXNDcmVhdGlvbk1vZGUoKTtcbiAgICAvLyBpZiBjcmVhdGlvbiBtb2RlIGFuZCBzdGF0aWMgb3IgdXBkYXRlIG1vZGUgYW5kIG5vdCBzdGF0aWNcbiAgICBpZiAocXVlcnlMaXN0LmRpcnR5ICYmIGNyZWF0aW9uTW9kZSA9PT0gcXVlcnlMaXN0SW1wbC5fc3RhdGljKSB7XG4gICAgICAgIHF1ZXJ5TGlzdC5yZXNldChxdWVyeUxpc3RJbXBsLl92YWx1ZXNUcmVlIHx8IFtdKTtcbiAgICAgICAgcXVlcnlMaXN0Lm5vdGlmeU9uQ2hhbmdlcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBDcmVhdGVzIG5ldyBRdWVyeUxpc3QgZm9yIGEgc3RhdGljIHZpZXcgcXVlcnkuXG4gKlxuICogQHBhcmFtIHByZWRpY2F0ZSBUaGUgdHlwZSBmb3Igd2hpY2ggdGhlIHF1ZXJ5IHdpbGwgc2VhcmNoXG4gKiBAcGFyYW0gZGVzY2VuZCBXaGV0aGVyIG9yIG5vdCB0byBkZXNjZW5kIGludG8gY2hpbGRyZW5cbiAqIEBwYXJhbSByZWFkIFdoYXQgdG8gc2F2ZSBpbiB0aGUgcXVlcnlcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1c3RhdGljVmlld1F1ZXJ5KFxuLy8gVE9ETyhGVy00ODYpOiBcInJlYWRcIiBzaG91bGQgYmUgYW4gQWJzdHJhY3RUeXBlXG5wcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHtcbiAgICB2YXIgcXVlcnlMaXN0ID0gybXJtXZpZXdRdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpO1xuICAgIHZhciB0VmlldyA9IGdldExWaWV3KClbVFZJRVddO1xuICAgIHF1ZXJ5TGlzdC5fc3RhdGljID0gdHJ1ZTtcbiAgICBpZiAoIXRWaWV3LnN0YXRpY1ZpZXdRdWVyaWVzKSB7XG4gICAgICAgIHRWaWV3LnN0YXRpY1ZpZXdRdWVyaWVzID0gdHJ1ZTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgbmV3IFF1ZXJ5TGlzdCwgc3RvcmVzIHRoZSByZWZlcmVuY2UgaW4gTFZpZXcgYW5kIHJldHVybnMgUXVlcnlMaXN0LlxuICpcbiAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaFxuICogQHBhcmFtIGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuXG4gKiBAcGFyYW0gcmVhZCBXaGF0IHRvIHNhdmUgaW4gdGhlIHF1ZXJ5XG4gKiBAcmV0dXJucyBRdWVyeUxpc3Q8VD5cbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1dmlld1F1ZXJ5KFxuLy8gVE9ETyhGVy00ODYpOiBcInJlYWRcIiBzaG91bGQgYmUgYW4gQWJzdHJhY3RUeXBlXG5wcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIHZhciB0VmlldyA9IGxWaWV3W1RWSUVXXTtcbiAgICBpZiAodFZpZXcuZmlyc3RUZW1wbGF0ZVBhc3MpIHtcbiAgICAgICAgdFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXgrKztcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gZ2V0Q3VycmVudFF1ZXJ5SW5kZXgoKTtcbiAgICB2YXIgdmlld1F1ZXJ5ID0gcXVlcnkocHJlZGljYXRlLCBkZXNjZW5kLCByZWFkKTtcbiAgICBzdG9yZShpbmRleCAtIEhFQURFUl9PRkZTRVQsIHZpZXdRdWVyeSk7XG4gICAgc2V0Q3VycmVudFF1ZXJ5SW5kZXgoaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdmlld1F1ZXJ5O1xufVxuLyoqXG4gKiBMb2FkcyBjdXJyZW50IFZpZXcgUXVlcnkgYW5kIG1vdmVzIHRoZSBwb2ludGVyL2luZGV4IHRvIHRoZSBuZXh0IFZpZXcgUXVlcnkgaW4gTFZpZXcuXG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWxvYWRWaWV3UXVlcnkoKSB7XG4gICAgdmFyIGluZGV4ID0gZ2V0Q3VycmVudFF1ZXJ5SW5kZXgoKTtcbiAgICBzZXRDdXJyZW50UXVlcnlJbmRleChpbmRleCArIDEpO1xuICAgIHJldHVybiDJtcm1bG9hZChpbmRleCAtIEhFQURFUl9PRkZTRVQpO1xufVxuLyoqXG4gKiBSZWdpc3RlcnMgYSBRdWVyeUxpc3QsIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoIChwYXJ0IG9mIGEgdmlld1xuICogcmVmcmVzaCkuXG4gKlxuICogQHBhcmFtIGRpcmVjdGl2ZUluZGV4IEN1cnJlbnQgZGlyZWN0aXZlIGluZGV4XG4gKiBAcGFyYW0gcHJlZGljYXRlIFRoZSB0eXBlIGZvciB3aGljaCB0aGUgcXVlcnkgd2lsbCBzZWFyY2hcbiAqIEBwYXJhbSBkZXNjZW5kIFdoZXRoZXIgb3Igbm90IHRvIGRlc2NlbmQgaW50byBjaGlsZHJlblxuICogQHBhcmFtIHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeVxuICogQHJldHVybnMgUXVlcnlMaXN0PFQ+XG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtWNvbnRlbnRRdWVyeShkaXJlY3RpdmVJbmRleCwgcHJlZGljYXRlLCBkZXNjZW5kLCBcbi8vIFRPRE8oRlctNDg2KTogXCJyZWFkXCIgc2hvdWxkIGJlIGFuIEFic3RyYWN0VHlwZVxucmVhZCkge1xuICAgIHZhciBsVmlldyA9IGdldExWaWV3KCk7XG4gICAgdmFyIHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICAgIHZhciBjb250ZW50UXVlcnkgPSBxdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpO1xuICAgIChsVmlld1tDT05URU5UX1FVRVJJRVNdIHx8IChsVmlld1tDT05URU5UX1FVRVJJRVNdID0gW10pKS5wdXNoKGNvbnRlbnRRdWVyeSk7XG4gICAgaWYgKHRWaWV3LmZpcnN0VGVtcGxhdGVQYXNzKSB7XG4gICAgICAgIHZhciB0Vmlld0NvbnRlbnRRdWVyaWVzID0gdFZpZXcuY29udGVudFF1ZXJpZXMgfHwgKHRWaWV3LmNvbnRlbnRRdWVyaWVzID0gW10pO1xuICAgICAgICB2YXIgbGFzdFNhdmVkRGlyZWN0aXZlSW5kZXggPSB0Vmlldy5jb250ZW50UXVlcmllcy5sZW5ndGggPyB0Vmlldy5jb250ZW50UXVlcmllc1t0Vmlldy5jb250ZW50UXVlcmllcy5sZW5ndGggLSAxXSA6IC0xO1xuICAgICAgICBpZiAoZGlyZWN0aXZlSW5kZXggIT09IGxhc3RTYXZlZERpcmVjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgICB0Vmlld0NvbnRlbnRRdWVyaWVzLnB1c2goZGlyZWN0aXZlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50UXVlcnk7XG59XG4vKipcbiAqIFJlZ2lzdGVycyBhIFF1ZXJ5TGlzdCwgYXNzb2NpYXRlZCB3aXRoIGEgc3RhdGljIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoXG4gKiAocGFydCBvZiBhIHZpZXcgcmVmcmVzaCkuXG4gKlxuICogQHBhcmFtIGRpcmVjdGl2ZUluZGV4IEN1cnJlbnQgZGlyZWN0aXZlIGluZGV4XG4gKiBAcGFyYW0gcHJlZGljYXRlIFRoZSB0eXBlIGZvciB3aGljaCB0aGUgcXVlcnkgd2lsbCBzZWFyY2hcbiAqIEBwYXJhbSBkZXNjZW5kIFdoZXRoZXIgb3Igbm90IHRvIGRlc2NlbmQgaW50byBjaGlsZHJlblxuICogQHBhcmFtIHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeVxuICogQHJldHVybnMgUXVlcnlMaXN0PFQ+XG4gKlxuICogQGNvZGVHZW5BcGlcbiAqL1xuZnVuY3Rpb24gybXJtXN0YXRpY0NvbnRlbnRRdWVyeShkaXJlY3RpdmVJbmRleCwgcHJlZGljYXRlLCBkZXNjZW5kLCBcbi8vIFRPRE8oRlctNDg2KTogXCJyZWFkXCIgc2hvdWxkIGJlIGFuIEFic3RyYWN0VHlwZVxucmVhZCkge1xuICAgIHZhciBxdWVyeUxpc3QgPSDJtcm1Y29udGVudFF1ZXJ5KGRpcmVjdGl2ZUluZGV4LCBwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpO1xuICAgIHZhciB0VmlldyA9IGdldExWaWV3KClbVFZJRVddO1xuICAgIHF1ZXJ5TGlzdC5fc3RhdGljID0gdHJ1ZTtcbiAgICBpZiAoIXRWaWV3LnN0YXRpY0NvbnRlbnRRdWVyaWVzKSB7XG4gICAgICAgIHRWaWV3LnN0YXRpY0NvbnRlbnRRdWVyaWVzID0gdHJ1ZTtcbiAgICB9XG59XG4vKipcbiAqXG4gKiBAY29kZUdlbkFwaVxuICovXG5mdW5jdGlvbiDJtcm1bG9hZENvbnRlbnRRdWVyeSgpIHtcbiAgICB2YXIgbFZpZXcgPSBnZXRMVmlldygpO1xuICAgIG5nRGV2TW9kZSAmJlxuICAgICAgICBhc3NlcnREZWZpbmVkKGxWaWV3W0NPTlRFTlRfUVVFUklFU10sICdDb250ZW50IFF1ZXJ5TGlzdCBhcnJheSBzaG91bGQgYmUgZGVmaW5lZCBpZiByZWFkaW5nIGEgcXVlcnkuJyk7XG4gICAgdmFyIGluZGV4ID0gZ2V0Q3VycmVudFF1ZXJ5SW5kZXgoKTtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXdbQ09OVEVOVF9RVUVSSUVTXSwgaW5kZXgpO1xuICAgIHNldEN1cnJlbnRRdWVyeUluZGV4KGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIGxWaWV3W0NPTlRFTlRfUVVFUklFU11baW5kZXhdO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFJldHJpZXZlcyBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGZyb20gYEluamVjdG9yYCB3aGVuIGEgbG9jYWwgcmVmZXJlbmNlIGlzIHBsYWNlZCBvbiB0aGVcbiAqIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LlxuICpcbiAqIEBjb2RlR2VuQXBpXG4gKi9cbmZ1bmN0aW9uIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcih0Tm9kZSwgY3VycmVudFZpZXcpIHtcbiAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYsIHROb2RlLCBjdXJyZW50Vmlldyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBVc2VkIHRvIGxvYWQgbmcgbW9kdWxlIGZhY3Rvcmllcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKiBAZGVwcmVjYXRlZCB0aGUgYHN0cmluZ2AgZm9ybSBvZiBgbG9hZENoaWxkcmVuYCBpcyBkZXByZWNhdGVkLCBhbmQgYE5nTW9kdWxlRmFjdG9yeUxvYWRlcmAgaXNcbiAqIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xudmFyIE5nTW9kdWxlRmFjdG9yeUxvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ01vZHVsZUZhY3RvcnlMb2FkZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBOZ01vZHVsZUZhY3RvcnlMb2FkZXI7XG59KCkpO1xuLyoqXG4gKiBNYXAgb2YgbW9kdWxlLWlkIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5nTW9kdWxlLlxuICogLSBJbiBwcmUgSXZ5IHdlIHRyYWNrIE5nTW9kdWxlRmFjdG9yeSxcbiAqIC0gSW4gcG9zdCBJdnkgd2UgdHJhY2sgdGhlIE5nTW9kdWxlVHlwZVxuICovXG52YXIgbW9kdWxlcyA9IG5ldyBNYXAoKTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgbG9hZGVkIG1vZHVsZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gZ2VuZXJhdGVkIE5nTW9kdWxlRmFjdG9yeSBjb2RlLlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiByZWdpc3Rlck1vZHVsZUZhY3RvcnkoaWQsIGZhY3RvcnkpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtb2R1bGVzLmdldChpZCk7XG4gICAgYXNzZXJ0U2FtZU9yTm90RXhpc3RpbmcoaWQsIGV4aXN0aW5nICYmIGV4aXN0aW5nLm1vZHVsZVR5cGUsIGZhY3RvcnkubW9kdWxlVHlwZSk7XG4gICAgbW9kdWxlcy5zZXQoaWQsIGZhY3RvcnkpO1xufVxuZnVuY3Rpb24gYXNzZXJ0U2FtZU9yTm90RXhpc3RpbmcoaWQsIHR5cGUsIGluY29taW5nKSB7XG4gICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gaW5jb21pbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlIG1vZHVsZSByZWdpc3RlcmVkIGZvciBcIiArIGlkICsgXCIgLSBcIiArIHN0cmluZ2lmeSh0eXBlKSArIFwiIHZzIFwiICsgc3RyaW5naWZ5KHR5cGUubmFtZSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyTmdNb2R1bGVUeXBlKGlkLCBuZ01vZHVsZVR5cGUpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtb2R1bGVzLmdldChpZCk7XG4gICAgYXNzZXJ0U2FtZU9yTm90RXhpc3RpbmcoaWQsIGV4aXN0aW5nLCBuZ01vZHVsZVR5cGUpO1xuICAgIG1vZHVsZXMuc2V0KGlkLCBuZ01vZHVsZVR5cGUpO1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlRmFjdG9yeV9fUFJFX1IzX18oaWQpIHtcbiAgICB2YXIgZmFjdG9yeSA9IG1vZHVsZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWZhY3RvcnkpXG4gICAgICAgIHRocm93IG5vTW9kdWxlRXJyb3IoaWQpO1xuICAgIHJldHVybiBmYWN0b3J5O1xufVxuZnVuY3Rpb24gZ2V0TW9kdWxlRmFjdG9yeV9fUE9TVF9SM19fKGlkKSB7XG4gICAgdmFyIHR5cGUgPSBtb2R1bGVzLmdldChpZCk7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICB0aHJvdyBub01vZHVsZUVycm9yKGlkKTtcbiAgICByZXR1cm4gbmV3IE5nTW9kdWxlRmFjdG9yeSQxKHR5cGUpO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBOZ01vZHVsZUZhY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gaWQsIGlmIGl0IGV4aXN0cyBhbmQgaGFzIGJlZW4gbG9hZGVkLlxuICogRmFjdG9yaWVzIGZvciBtb2R1bGVzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW4gYGlkYCBjYW5ub3QgYmUgcmV0cmlldmVkLiBUaHJvd3MgaWYgdGhlIG1vZHVsZVxuICogY2Fubm90IGJlIGZvdW5kLlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgZ2V0TW9kdWxlRmFjdG9yeSA9IGdldE1vZHVsZUZhY3RvcnlfX1BSRV9SM19fO1xuZnVuY3Rpb24gbm9Nb2R1bGVFcnJvcihpZCkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoXCJObyBtb2R1bGUgd2l0aCBJRCBcIiArIGlkICsgXCIgbG9hZGVkXCIpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgybUwJDggPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICfJtcm1ZGVmaW5lQmFzZSc6IMm1ybVkZWZpbmVCYXNlLFxuICAgICfJtcm1ZGVmaW5lQ29tcG9uZW50JzogybXJtWRlZmluZUNvbXBvbmVudCxcbiAgICAnybXJtWRlZmluZURpcmVjdGl2ZSc6IMm1ybVkZWZpbmVEaXJlY3RpdmUsXG4gICAgJ8m1ybVkZWZpbmVJbmplY3RhYmxlJzogybXJtWRlZmluZUluamVjdGFibGUsXG4gICAgJ8m1ybVkZWZpbmVJbmplY3Rvcic6IMm1ybVkZWZpbmVJbmplY3RvcixcbiAgICAnybXJtWRlZmluZU5nTW9kdWxlJzogybXJtWRlZmluZU5nTW9kdWxlLFxuICAgICfJtcm1ZGVmaW5lUGlwZSc6IMm1ybVkZWZpbmVQaXBlLFxuICAgICfJtcm1ZGlyZWN0aXZlSW5qZWN0JzogybXJtWRpcmVjdGl2ZUluamVjdCxcbiAgICAnybXJtWdldEZhY3RvcnlPZic6IMm1ybVnZXRGYWN0b3J5T2YsXG4gICAgJ8m1ybVnZXRJbmhlcml0ZWRGYWN0b3J5JzogybXJtWdldEluaGVyaXRlZEZhY3RvcnksXG4gICAgJ8m1ybVpbmplY3QnOiDJtcm1aW5qZWN0LFxuICAgICfJtcm1aW5qZWN0QXR0cmlidXRlJzogybXJtWluamVjdEF0dHJpYnV0ZSxcbiAgICAnybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yJzogybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yLFxuICAgICfJtcm1TmdPbkNoYW5nZXNGZWF0dXJlJzogybXJtU5nT25DaGFuZ2VzRmVhdHVyZSxcbiAgICAnybXJtVByb3ZpZGVyc0ZlYXR1cmUnOiDJtcm1UHJvdmlkZXJzRmVhdHVyZSxcbiAgICAnybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsXG4gICAgJ8m1ybVlbGVtZW50QXR0cmlidXRlJzogybXJtWVsZW1lbnRBdHRyaWJ1dGUsXG4gICAgJ8m1ybViaW5kJzogybXJtWJpbmQsXG4gICAgJ8m1ybVjb250YWluZXInOiDJtcm1Y29udGFpbmVyLFxuICAgICfJtcm1bmV4dENvbnRleHQnOiDJtcm1bmV4dENvbnRleHQsXG4gICAgJ8m1ybVjb250YWluZXJSZWZyZXNoU3RhcnQnOiDJtcm1Y29udGFpbmVyUmVmcmVzaFN0YXJ0LFxuICAgICfJtcm1Y29udGFpbmVyUmVmcmVzaEVuZCc6IMm1ybVjb250YWluZXJSZWZyZXNoRW5kLFxuICAgICfJtcm1bmFtZXNwYWNlSFRNTCc6IMm1ybVuYW1lc3BhY2VIVE1MLFxuICAgICfJtcm1bmFtZXNwYWNlTWF0aE1MJzogybXJtW5hbWVzcGFjZU1hdGhNTCxcbiAgICAnybXJtW5hbWVzcGFjZVNWRyc6IMm1ybVuYW1lc3BhY2VTVkcsXG4gICAgJ8m1ybVlbmFibGVCaW5kaW5ncyc6IMm1ybVlbmFibGVCaW5kaW5ncyxcbiAgICAnybXJtWRpc2FibGVCaW5kaW5ncyc6IMm1ybVkaXNhYmxlQmluZGluZ3MsXG4gICAgJ8m1ybVhbGxvY0hvc3RWYXJzJzogybXJtWFsbG9jSG9zdFZhcnMsXG4gICAgJ8m1ybVlbGVtZW50U3RhcnQnOiDJtcm1ZWxlbWVudFN0YXJ0LFxuICAgICfJtcm1ZWxlbWVudEVuZCc6IMm1ybVlbGVtZW50RW5kLFxuICAgICfJtcm1ZWxlbWVudCc6IMm1ybVlbGVtZW50LFxuICAgICfJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0JzogybXJtWVsZW1lbnRDb250YWluZXJTdGFydCxcbiAgICAnybXJtWVsZW1lbnRDb250YWluZXJFbmQnOiDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjAnOiDJtcm1cHVyZUZ1bmN0aW9uMCxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjEnOiDJtcm1cHVyZUZ1bmN0aW9uMSxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjInOiDJtcm1cHVyZUZ1bmN0aW9uMixcbiAgICAnybXJtXB1cmVGdW5jdGlvbjMnOiDJtcm1cHVyZUZ1bmN0aW9uMyxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjQnOiDJtcm1cHVyZUZ1bmN0aW9uNCxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjUnOiDJtcm1cHVyZUZ1bmN0aW9uNSxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjYnOiDJtcm1cHVyZUZ1bmN0aW9uNixcbiAgICAnybXJtXB1cmVGdW5jdGlvbjcnOiDJtcm1cHVyZUZ1bmN0aW9uNyxcbiAgICAnybXJtXB1cmVGdW5jdGlvbjgnOiDJtcm1cHVyZUZ1bmN0aW9uOCxcbiAgICAnybXJtXB1cmVGdW5jdGlvblYnOiDJtcm1cHVyZUZ1bmN0aW9uVixcbiAgICAnybXJtWdldEN1cnJlbnRWaWV3JzogybXJtWdldEN1cnJlbnRWaWV3LFxuICAgICfJtcm1cmVzdG9yZVZpZXcnOiDJtcm1cmVzdG9yZVZpZXcsXG4gICAgJ8m1ybVpbnRlcnBvbGF0aW9uMSc6IMm1ybVpbnRlcnBvbGF0aW9uMSxcbiAgICAnybXJtWludGVycG9sYXRpb24yJzogybXJtWludGVycG9sYXRpb24yLFxuICAgICfJtcm1aW50ZXJwb2xhdGlvbjMnOiDJtcm1aW50ZXJwb2xhdGlvbjMsXG4gICAgJ8m1ybVpbnRlcnBvbGF0aW9uNCc6IMm1ybVpbnRlcnBvbGF0aW9uNCxcbiAgICAnybXJtWludGVycG9sYXRpb241JzogybXJtWludGVycG9sYXRpb241LFxuICAgICfJtcm1aW50ZXJwb2xhdGlvbjYnOiDJtcm1aW50ZXJwb2xhdGlvbjYsXG4gICAgJ8m1ybVpbnRlcnBvbGF0aW9uNyc6IMm1ybVpbnRlcnBvbGF0aW9uNyxcbiAgICAnybXJtWludGVycG9sYXRpb244JzogybXJtWludGVycG9sYXRpb244LFxuICAgICfJtcm1aW50ZXJwb2xhdGlvblYnOiDJtcm1aW50ZXJwb2xhdGlvblYsXG4gICAgJ8m1ybVsaXN0ZW5lcic6IMm1ybVsaXN0ZW5lcixcbiAgICAnybXJtWxvYWQnOiDJtcm1bG9hZCxcbiAgICAnybXJtXByb2plY3Rpb24nOiDJtcm1cHJvamVjdGlvbixcbiAgICAnybXJtWVsZW1lbnRQcm9wZXJ0eSc6IMm1ybVlbGVtZW50UHJvcGVydHksXG4gICAgJ8m1ybVjb21wb25lbnRIb3N0U3ludGhldGljUHJvcGVydHknOiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY1Byb3BlcnR5LFxuICAgICfJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyJzogybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lcixcbiAgICAnybXJtXBpcGVCaW5kMSc6IMm1ybVwaXBlQmluZDEsXG4gICAgJ8m1ybVwaXBlQmluZDInOiDJtcm1cGlwZUJpbmQyLFxuICAgICfJtcm1cGlwZUJpbmQzJzogybXJtXBpcGVCaW5kMyxcbiAgICAnybXJtXBpcGVCaW5kNCc6IMm1ybVwaXBlQmluZDQsXG4gICAgJ8m1ybVwaXBlQmluZFYnOiDJtcm1cGlwZUJpbmRWLFxuICAgICfJtcm1cHJvamVjdGlvbkRlZic6IMm1ybVwcm9qZWN0aW9uRGVmLFxuICAgICfJtcm1cHJvcGVydHknOiDJtcm1cHJvcGVydHksXG4gICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUsXG4gICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlMSc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMSxcbiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyLFxuICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMsXG4gICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNCc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCxcbiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1LFxuICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYsXG4gICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNyc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNyxcbiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4LFxuICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYsXG4gICAgJ8m1ybVwaXBlJzogybXJtXBpcGUsXG4gICAgJ8m1ybVxdWVyeVJlZnJlc2gnOiDJtcm1cXVlcnlSZWZyZXNoLFxuICAgICfJtcm1dmlld1F1ZXJ5JzogybXJtXZpZXdRdWVyeSxcbiAgICAnybXJtXN0YXRpY1ZpZXdRdWVyeSc6IMm1ybVzdGF0aWNWaWV3UXVlcnksXG4gICAgJ8m1ybVzdGF0aWNDb250ZW50UXVlcnknOiDJtcm1c3RhdGljQ29udGVudFF1ZXJ5LFxuICAgICfJtcm1bG9hZFZpZXdRdWVyeSc6IMm1ybVsb2FkVmlld1F1ZXJ5LFxuICAgICfJtcm1Y29udGVudFF1ZXJ5JzogybXJtWNvbnRlbnRRdWVyeSxcbiAgICAnybXJtWxvYWRDb250ZW50UXVlcnknOiDJtcm1bG9hZENvbnRlbnRRdWVyeSxcbiAgICAnybXJtXJlZmVyZW5jZSc6IMm1ybVyZWZlcmVuY2UsXG4gICAgJ8m1ybVlbGVtZW50SG9zdEF0dHJzJzogybXJtWVsZW1lbnRIb3N0QXR0cnMsXG4gICAgJ8m1ybVlbGVtZW50U3R5bGluZyc6IMm1ybVlbGVtZW50U3R5bGluZyxcbiAgICAnybXJtWVsZW1lbnRTdHlsaW5nTWFwJzogybXJtWVsZW1lbnRTdHlsaW5nTWFwLFxuICAgICfJtcm1ZWxlbWVudFN0eWxlUHJvcCc6IMm1ybVlbGVtZW50U3R5bGVQcm9wLFxuICAgICfJtcm1ZWxlbWVudFN0eWxpbmdBcHBseSc6IMm1ybVlbGVtZW50U3R5bGluZ0FwcGx5LFxuICAgICfJtcm1ZWxlbWVudENsYXNzUHJvcCc6IMm1ybVlbGVtZW50Q2xhc3NQcm9wLFxuICAgICfJtcm1ZWxlbWVudEhvc3RTdHlsaW5nJzogybXJtWVsZW1lbnRIb3N0U3R5bGluZyxcbiAgICAnybXJtWVsZW1lbnRIb3N0U3R5bGluZ01hcCc6IMm1ybVlbGVtZW50SG9zdFN0eWxpbmdNYXAsXG4gICAgJ8m1ybVlbGVtZW50SG9zdFN0eWxlUHJvcCc6IMm1ybVlbGVtZW50SG9zdFN0eWxlUHJvcCxcbiAgICAnybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5JzogybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5LFxuICAgICfJtcm1ZWxlbWVudEhvc3RDbGFzc1Byb3AnOiDJtcm1ZWxlbWVudEhvc3RDbGFzc1Byb3AsXG4gICAgJ8m1ybVzZWxlY3QnOiDJtcm1c2VsZWN0LFxuICAgICfJtcm1dGVtcGxhdGUnOiDJtcm1dGVtcGxhdGUsXG4gICAgJ8m1ybV0ZXh0JzogybXJtXRleHQsXG4gICAgJ8m1ybV0ZXh0QmluZGluZyc6IMm1ybV0ZXh0QmluZGluZyxcbiAgICAnybXJtWVtYmVkZGVkVmlld1N0YXJ0JzogybXJtWVtYmVkZGVkVmlld1N0YXJ0LFxuICAgICfJtcm1ZW1iZWRkZWRWaWV3RW5kJzogybXJtWVtYmVkZGVkVmlld0VuZCxcbiAgICAnybXJtWkxOG4nOiDJtcm1aTE4bixcbiAgICAnybXJtWkxOG5BdHRyaWJ1dGVzJzogybXJtWkxOG5BdHRyaWJ1dGVzLFxuICAgICfJtcm1aTE4bkV4cCc6IMm1ybVpMThuRXhwLFxuICAgICfJtcm1aTE4blN0YXJ0JzogybXJtWkxOG5TdGFydCxcbiAgICAnybXJtWkxOG5FbmQnOiDJtcm1aTE4bkVuZCxcbiAgICAnybXJtWkxOG5BcHBseSc6IMm1ybVpMThuQXBwbHksXG4gICAgJ8m1ybVpMThuUG9zdHByb2Nlc3MnOiDJtcm1aTE4blBvc3Rwcm9jZXNzLFxuICAgICfJtcm1aTE4bkxvY2FsaXplJzogybXJtWkxOG5Mb2NhbGl6ZSxcbiAgICAnybXJtXJlc29sdmVXaW5kb3cnOiDJtcm1cmVzb2x2ZVdpbmRvdyxcbiAgICAnybXJtXJlc29sdmVEb2N1bWVudCc6IMm1ybVyZXNvbHZlRG9jdW1lbnQsXG4gICAgJ8m1ybVyZXNvbHZlQm9keSc6IMm1ybVyZXNvbHZlQm9keSxcbiAgICAnybXJtXNldENvbXBvbmVudFNjb3BlJzogybXJtXNldENvbXBvbmVudFNjb3BlLFxuICAgICfJtcm1c2V0TmdNb2R1bGVTY29wZSc6IMm1ybVzZXROZ01vZHVsZVNjb3BlLFxuICAgICfJtcm1c2FuaXRpemVIdG1sJzogybXJtXNhbml0aXplSHRtbCxcbiAgICAnybXJtXNhbml0aXplU3R5bGUnOiDJtcm1c2FuaXRpemVTdHlsZSxcbiAgICAnybXJtWRlZmF1bHRTdHlsZVNhbml0aXplcic6IMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIsXG4gICAgJ8m1ybVzYW5pdGl6ZVJlc291cmNlVXJsJzogybXJtXNhbml0aXplUmVzb3VyY2VVcmwsXG4gICAgJ8m1ybVzYW5pdGl6ZVNjcmlwdCc6IMm1ybVzYW5pdGl6ZVNjcmlwdCxcbiAgICAnybXJtXNhbml0aXplVXJsJzogybXJtXNhbml0aXplVXJsLFxuICAgICfJtcm1c2FuaXRpemVVcmxPclJlc291cmNlVXJsJzogybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCxcbiAgICAnybVyZWdpc3Rlck5nTW9kdWxlVHlwZSc6IHJlZ2lzdGVyTmdNb2R1bGVUeXBlLFxufSk7IH07XG4vKipcbiAqIEEgbWFwcGluZyBvZiB0aGUgQGFuZ3VsYXIvY29yZSBBUEkgc3VyZmFjZSB1c2VkIGluIGdlbmVyYXRlZCBleHByZXNzaW9ucyB0byB0aGUgYWN0dWFsIHN5bWJvbHMuXG4gKlxuICogVGhpcyBzaG91bGQgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggdGhlIHB1YmxpYyBleHBvcnRzIG9mIEBhbmd1bGFyL2NvcmUuXG4gKi9cbnZhciBhbmd1bGFyQ29yZUVudiA9ICjJtTAkOCkoKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEVNUFRZX0FSUkFZJDQgPSBbXTtcbnZhciBtb2R1bGVRdWV1ZSA9IFtdO1xuLyoqXG4gKiBFbnF1ZXVlcyBtb2R1bGVEZWYgdG8gYmUgY2hlY2tlZCBsYXRlciB0byBzZWUgaWYgc2NvcGUgY2FuIGJlIHNldCBvbiBpdHNcbiAqIGNvbXBvbmVudCBkZWNsYXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWVNb2R1bGVGb3JEZWxheWVkU2NvcGluZyhtb2R1bGVUeXBlLCBuZ01vZHVsZSkge1xuICAgIG1vZHVsZVF1ZXVlLnB1c2goeyBtb2R1bGVUeXBlOiBtb2R1bGVUeXBlLCBuZ01vZHVsZTogbmdNb2R1bGUgfSk7XG59XG52YXIgZmx1c2hpbmdNb2R1bGVRdWV1ZSA9IGZhbHNlO1xuLyoqXG4gKiBMb29wcyBvdmVyIHF1ZXVlZCBtb2R1bGUgZGVmaW5pdGlvbnMsIGlmIGEgZ2l2ZW4gbW9kdWxlIGRlZmluaXRpb24gaGFzIGFsbCBvZiBpdHNcbiAqIGRlY2xhcmF0aW9ucyByZXNvbHZlZCwgaXQgZGVxdWV1ZXMgdGhhdCBtb2R1bGUgZGVmaW5pdGlvbiBhbmQgc2V0cyB0aGUgc2NvcGUgb25cbiAqIGl0cyBkZWNsYXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoTW9kdWxlU2NvcGluZ1F1ZXVlQXNNdWNoQXNQb3NzaWJsZSgpIHtcbiAgICBpZiAoIWZsdXNoaW5nTW9kdWxlUXVldWUpIHtcbiAgICAgICAgZmx1c2hpbmdNb2R1bGVRdWV1ZSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbW9kdWxlUXVldWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBtb2R1bGVRdWV1ZVtpXSwgbW9kdWxlVHlwZSA9IF9hLm1vZHVsZVR5cGUsIG5nTW9kdWxlID0gX2EubmdNb2R1bGU7XG4gICAgICAgICAgICAgICAgaWYgKG5nTW9kdWxlLmRlY2xhcmF0aW9ucyAmJiBuZ01vZHVsZS5kZWNsYXJhdGlvbnMuZXZlcnkoaXNSZXNvbHZlZERlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXF1ZXVlXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2NvcGVPbkRlY2xhcmVkQ29tcG9uZW50cyhtb2R1bGVUeXBlLCBuZ01vZHVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZmx1c2hpbmdNb2R1bGVRdWV1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydXRoeSBpZiBhIGRlY2xhcmF0aW9uIGhhcyByZXNvbHZlZC4gSWYgdGhlIGRlY2xhcmF0aW9uIGhhcHBlbnMgdG8gYmVcbiAqIGFuIGFycmF5IG9mIGRlY2xhcmF0aW9ucywgaXQgd2lsbCByZWN1cnNlIHRvIGNoZWNrIGVhY2ggZGVjbGFyYXRpb24gaW4gdGhhdCBhcnJheVxuICogKHdoaWNoIG1heSBhbHNvIGJlIGFycmF5cykuXG4gKi9cbmZ1bmN0aW9uIGlzUmVzb2x2ZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uKSkge1xuICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24uZXZlcnkoaXNSZXNvbHZlZERlY2xhcmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuICEhcmVzb2x2ZUZvcndhcmRSZWYoZGVjbGFyYXRpb24pO1xufVxuLyoqXG4gKiBDb21waWxlcyBhIG1vZHVsZSBpbiBKSVQgbW9kZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgZ2V0cyBjYWxsZWQgd2hlbiBhIGNsYXNzIGhhcyBhIGBATmdNb2R1bGVgIGRlY29yYXRvci5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7XG4gICAgaWYgKG5nTW9kdWxlID09PSB2b2lkIDApIHsgbmdNb2R1bGUgPSB7fTsgfVxuICAgIGNvbXBpbGVOZ01vZHVsZURlZnMobW9kdWxlVHlwZSwgbmdNb2R1bGUpO1xuICAgIC8vIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbGwgZGVjbGFyYXRpb25zIGhhdmUgcmVzb2x2ZWQgeWV0IGF0IHRoZSBtb21lbnQgdGhlXG4gICAgLy8gTmdNb2R1bGUgZGVjb3JhdG9yIGlzIGV4ZWN1dGluZywgd2UncmUgZW5xdWV1ZWluZyB0aGUgc2V0dGluZyBvZiBtb2R1bGUgc2NvcGVcbiAgICAvLyBvbiBpdHMgZGVjbGFyYXRpb25zIHRvIGJlIHJ1biBhdCBhIGxhdGVyIHRpbWUgd2hlbiBhbGwgZGVjbGFyYXRpb25zIGZvciB0aGUgbW9kdWxlLFxuICAgIC8vIGluY2x1ZGluZyBmb3J3YXJkIHJlZnMsIGhhdmUgcmVzb2x2ZWQuXG4gICAgZW5xdWV1ZU1vZHVsZUZvckRlbGF5ZWRTY29waW5nKG1vZHVsZVR5cGUsIG5nTW9kdWxlKTtcbn1cbi8qKlxuICogQ29tcGlsZXMgYW5kIGFkZHMgdGhlIGBuZ01vZHVsZURlZmAgYW5kIGBuZ0luamVjdG9yRGVmYCBwcm9wZXJ0aWVzIHRvIHRoZSBtb2R1bGUgY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZURlZnMobW9kdWxlVHlwZSwgbmdNb2R1bGUpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChtb2R1bGVUeXBlLCAnUmVxdWlyZWQgdmFsdWUgbW9kdWxlVHlwZScpO1xuICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG5nTW9kdWxlLCAnUmVxdWlyZWQgdmFsdWUgbmdNb2R1bGUnKTtcbiAgICB2YXIgZGVjbGFyYXRpb25zID0gZmxhdHRlbihuZ01vZHVsZS5kZWNsYXJhdGlvbnMgfHwgRU1QVFlfQVJSQVkkNCk7XG4gICAgdmFyIG5nTW9kdWxlRGVmID0gbnVsbDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlVHlwZSwgTkdfTU9EVUxFX0RFRiwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG5nTW9kdWxlRGVmID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGVEZWYgPSBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVOZ01vZHVsZShhbmd1bGFyQ29yZUVudiwgXCJuZzovLy9cIiArIG1vZHVsZVR5cGUubmFtZSArIFwiL25nTW9kdWxlRGVmLmpzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbW9kdWxlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwOiBmbGF0dGVuKG5nTW9kdWxlLmJvb3RzdHJhcCB8fCBFTVBUWV9BUlJBWSQ0KS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLFxuICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucy5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBmbGF0dGVuKG5nTW9kdWxlLmltcG9ydHMgfHwgRU1QVFlfQVJSQVkkNClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGV4cGFuZE1vZHVsZVdpdGhQcm92aWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBmbGF0dGVuKG5nTW9kdWxlLmV4cG9ydHMgfHwgRU1QVFlfQVJSQVkkNClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGV4cGFuZE1vZHVsZVdpdGhQcm92aWRlcnMpLFxuICAgICAgICAgICAgICAgICAgICBlbWl0SW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFzOiBuZ01vZHVsZS5zY2hlbWFzID8gZmxhdHRlbihuZ01vZHVsZS5zY2hlbWFzKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmdNb2R1bGVEZWY7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAobmdNb2R1bGUuaWQpIHtcbiAgICAgICAgcmVnaXN0ZXJOZ01vZHVsZVR5cGUobmdNb2R1bGUuaWQsIG1vZHVsZVR5cGUpO1xuICAgIH1cbiAgICB2YXIgbmdJbmplY3RvckRlZiA9IG51bGw7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZVR5cGUsIE5HX0lOSkVDVE9SX0RFRiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChuZ0luamVjdG9yRGVmID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYobW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZVR5cGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbW9kdWxlVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwczogcmVmbGVjdERlcGVuZGVuY2llcyhtb2R1bGVUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBuZ01vZHVsZS5wcm92aWRlcnMgfHwgRU1QVFlfQVJSQVkkNCxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kdWxlLmltcG9ydHMgfHwgRU1QVFlfQVJSQVkkNCkubWFwKHJlc29sdmVGb3J3YXJkUmVmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDQpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBuZ0luamVjdG9yRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlSW5qZWN0b3IoYW5ndWxhckNvcmVFbnYsIFwibmc6Ly8vXCIgKyBtb2R1bGVUeXBlLm5hbWUgKyBcIi9uZ0luamVjdG9yRGVmLmpzXCIsIG1ldGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5nSW5qZWN0b3JEZWY7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsXG4gICAgfSk7XG59XG5mdW5jdGlvbiB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZHVsZVR5cGUpIHtcbiAgICBpZiAodmVyaWZpZWROZ01vZHVsZS5nZXQobW9kdWxlVHlwZSkpXG4gICAgICAgIHJldHVybjtcbiAgICB2ZXJpZmllZE5nTW9kdWxlLnNldChtb2R1bGVUeXBlLCB0cnVlKTtcbiAgICBtb2R1bGVUeXBlID0gcmVzb2x2ZUZvcndhcmRSZWYobW9kdWxlVHlwZSk7XG4gICAgdmFyIG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSwgdHJ1ZSk7XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuICAgIHZhciBkZWNsYXJhdGlvbnMgPSBtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmRlY2xhcmF0aW9ucyk7XG4gICAgdmFyIGltcG9ydHMgPSBtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmltcG9ydHMpO1xuICAgIGZsYXR0ZW4oaW1wb3J0cykubWFwKHVud3JhcE1vZHVsZVdpdGhQcm92aWRlcnNJbXBvcnRzKS5mb3JFYWNoKHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYpO1xuICAgIHZhciBleHBvcnRzID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5leHBvcnRzKTtcbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnMpO1xuICAgIHZhciBjb21iaW5lZERlY2xhcmF0aW9ucyA9IF9fc3ByZWFkKGRlY2xhcmF0aW9ucy5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLCBmbGF0dGVuKGltcG9ydHMubWFwKGNvbXB1dGVDb21iaW5lZEV4cG9ydHMpKS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpKTtcbiAgICBleHBvcnRzLmZvckVhY2godmVyaWZ5RXhwb3J0c0FyZURlY2xhcmVkT3JSZUV4cG9ydGVkKTtcbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlEZWNsYXJhdGlvbklzVW5pcXVlKTtcbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKTtcbiAgICB2YXIgbmdNb2R1bGUgPSBnZXRBbm5vdGF0aW9uKG1vZHVsZVR5cGUsICdOZ01vZHVsZScpO1xuICAgIGlmIChuZ01vZHVsZSkge1xuICAgICAgICBuZ01vZHVsZS5pbXBvcnRzICYmXG4gICAgICAgICAgICBmbGF0dGVuKG5nTW9kdWxlLmltcG9ydHMpXG4gICAgICAgICAgICAgICAgLm1hcCh1bndyYXBNb2R1bGVXaXRoUHJvdmlkZXJzSW1wb3J0cylcbiAgICAgICAgICAgICAgICAuZm9yRWFjaCh2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKTtcbiAgICAgICAgbmdNb2R1bGUuYm9vdHN0cmFwICYmIG5nTW9kdWxlLmJvb3RzdHJhcC5mb3JFYWNoKHZlcmlmeUNvcnJlY3RCb290c3RyYXBUeXBlKTtcbiAgICAgICAgbmdNb2R1bGUuYm9vdHN0cmFwICYmIG5nTW9kdWxlLmJvb3RzdHJhcC5mb3JFYWNoKHZlcmlmeUNvbXBvbmVudElzUGFydE9mTmdNb2R1bGUpO1xuICAgICAgICBuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMgJiYgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzLmZvckVhY2godmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7XG4gICAgfVxuICAgIC8vIFRocm93IEVycm9yIGlmIGFueSBlcnJvcnMgd2VyZSBkZXRlY3RlZC5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgZnVuY3Rpb24gdmVyaWZ5RGVjbGFyYXRpb25zSGF2ZURlZmluaXRpb25zKHR5cGUpIHtcbiAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpO1xuICAgICAgICB2YXIgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlKSB8fCBnZXRQaXBlRGVmKHR5cGUpO1xuICAgICAgICBpZiAoIWRlZikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXCJVbmV4cGVjdGVkIHZhbHVlICdcIiArIHN0cmluZ2lmeUZvckVycm9yKHR5cGUpICsgXCInIGRlY2xhcmVkIGJ5IHRoZSBtb2R1bGUgJ1wiICsgc3RyaW5naWZ5Rm9yRXJyb3IobW9kdWxlVHlwZSkgKyBcIicuIFBsZWFzZSBhZGQgYSBAUGlwZS9ARGlyZWN0aXZlL0BDb21wb25lbnQgYW5ub3RhdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyaWZ5RXhwb3J0c0FyZURlY2xhcmVkT3JSZUV4cG9ydGVkKHR5cGUpIHtcbiAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpO1xuICAgICAgICB2YXIga2luZCA9IGdldENvbXBvbmVudERlZih0eXBlKSAmJiAnY29tcG9uZW50JyB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkgJiYgJ2RpcmVjdGl2ZScgfHxcbiAgICAgICAgICAgIGdldFBpcGVEZWYodHlwZSkgJiYgJ3BpcGUnO1xuICAgICAgICBpZiAoa2luZCkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVja2VkIGlmIHdlIGFyZSBkZWNsYXJlZCBhcyBDb21wb25lbnQsIERpcmVjdGl2ZSwgb3IgUGlwZVxuICAgICAgICAgICAgLy8gTW9kdWxlcyBkb24ndCBuZWVkIHRvIGJlIGRlY2xhcmVkIG9yIGltcG9ydGVkLlxuICAgICAgICAgICAgaWYgKGNvbWJpbmVkRGVjbGFyYXRpb25zLmxhc3RJbmRleE9mKHR5cGUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBvcnRpbmcgc29tZXRoaW5nIHdoaWNoIHdlIGRvbid0IGV4cGxpY2l0bHkgZGVjbGFyZSBvciBpbXBvcnQuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goXCJDYW4ndCBleHBvcnQgXCIgKyBraW5kICsgXCIgXCIgKyBzdHJpbmdpZnlGb3JFcnJvcih0eXBlKSArIFwiIGZyb20gXCIgKyBzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKSArIFwiIGFzIGl0IHdhcyBuZWl0aGVyIGRlY2xhcmVkIG5vciBpbXBvcnRlZCFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyaWZ5RGVjbGFyYXRpb25Jc1VuaXF1ZSh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICAgICAgdmFyIGV4aXN0aW5nTW9kdWxlID0gb3duZXJOZ01vZHVsZS5nZXQodHlwZSk7XG4gICAgICAgIGlmIChleGlzdGluZ01vZHVsZSAmJiBleGlzdGluZ01vZHVsZSAhPT0gbW9kdWxlVHlwZSkge1xuICAgICAgICAgICAgdmFyIG1vZHVsZXMgPSBbZXhpc3RpbmdNb2R1bGUsIG1vZHVsZVR5cGVdLm1hcChzdHJpbmdpZnlGb3JFcnJvcikuc29ydCgpO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXCJUeXBlIFwiICsgc3RyaW5naWZ5Rm9yRXJyb3IodHlwZSkgKyBcIiBpcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbnMgb2YgMiBtb2R1bGVzOiBcIiArIG1vZHVsZXNbMF0gKyBcIiBhbmQgXCIgKyBtb2R1bGVzWzFdICsgXCIhIFwiICtcbiAgICAgICAgICAgICAgICAoXCJQbGVhc2UgY29uc2lkZXIgbW92aW5nIFwiICsgc3RyaW5naWZ5Rm9yRXJyb3IodHlwZSkgKyBcIiB0byBhIGhpZ2hlciBtb2R1bGUgdGhhdCBpbXBvcnRzIFwiICsgbW9kdWxlc1swXSArIFwiIGFuZCBcIiArIG1vZHVsZXNbMV0gKyBcIi4gXCIpICtcbiAgICAgICAgICAgICAgICAoXCJZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgXCIgKyBzdHJpbmdpZnlGb3JFcnJvcih0eXBlKSArIFwiIHRoZW4gaW1wb3J0IHRoYXQgTmdNb2R1bGUgaW4gXCIgKyBtb2R1bGVzWzBdICsgXCIgYW5kIFwiICsgbW9kdWxlc1sxXSArIFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBNYXJrIHR5cGUgYXMgaGF2aW5nIG93bmVyLlxuICAgICAgICAgICAgb3duZXJOZ01vZHVsZS5zZXQodHlwZSwgbW9kdWxlVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICAgICAgdmFyIGV4aXN0aW5nTW9kdWxlID0gb3duZXJOZ01vZHVsZS5nZXQodHlwZSk7XG4gICAgICAgIGlmICghZXhpc3RpbmdNb2R1bGUpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKFwiQ29tcG9uZW50IFwiICsgc3RyaW5naWZ5Rm9yRXJyb3IodHlwZSkgKyBcIiBpcyBub3QgcGFydCBvZiBhbnkgTmdNb2R1bGUgb3IgdGhlIG1vZHVsZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQgaW50byB5b3VyIG1vZHVsZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyaWZ5Q29ycmVjdEJvb3RzdHJhcFR5cGUodHlwZSkge1xuICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7XG4gICAgICAgIGlmICghZ2V0Q29tcG9uZW50RGVmKHR5cGUpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChzdHJpbmdpZnlGb3JFcnJvcih0eXBlKSArIFwiIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGVudHJ5IGNvbXBvbmVudC5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyaWZ5Q29tcG9uZW50RW50cnlDb21wb25lbnRzSXNQYXJ0T2ZOZ01vZHVsZSh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSkge1xuICAgICAgICAgICAgLy8gV2Uga25vdyB3ZSBhcmUgY29tcG9uZW50XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gZ2V0QW5ub3RhdGlvbih0eXBlLCAnQ29tcG9uZW50Jyk7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5lbnRyeUNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuZW50cnlDb21wb25lbnRzLmZvckVhY2godmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1bndyYXBNb2R1bGVXaXRoUHJvdmlkZXJzSW1wb3J0cyh0eXBlT3JXaXRoUHJvdmlkZXJzKSB7XG4gICAgdHlwZU9yV2l0aFByb3ZpZGVycyA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGVPcldpdGhQcm92aWRlcnMpO1xuICAgIHJldHVybiB0eXBlT3JXaXRoUHJvdmlkZXJzLm5nTW9kdWxlIHx8IHR5cGVPcldpdGhQcm92aWRlcnM7XG59XG5mdW5jdGlvbiBnZXRBbm5vdGF0aW9uKHR5cGUsIG5hbWUpIHtcbiAgICB2YXIgYW5ub3RhdGlvbiA9IG51bGw7XG4gICAgY29sbGVjdCh0eXBlLl9fYW5ub3RhdGlvbnNfXyk7XG4gICAgY29sbGVjdCh0eXBlLmRlY29yYXRvcnMpO1xuICAgIHJldHVybiBhbm5vdGF0aW9uO1xuICAgIGZ1bmN0aW9uIGNvbGxlY3QoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKGFubm90YXRpb25zKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKHJlYWRBbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQW5ub3RhdGlvbihkZWNvcmF0b3IpIHtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGVjb3JhdG9yKTtcbiAgICAgICAgICAgIGlmIChwcm90by5uZ01ldGFkYXRhTmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGRlY29yYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRlY29yYXRvci50eXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3RvXzEgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGVjb3JhdG9yLnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChwcm90b18xLm5nTWV0YWRhdGFOYW1lID09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGRlY29yYXRvci5hcmdzWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogS2VlcCB0cmFjayBvZiBjb21waWxlZCBjb21wb25lbnRzLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIHRlc3RzIHdlIG9mdGVuIHdhbnQgdG8gY29tcGlsZSB0aGVcbiAqIHNhbWUgY29tcG9uZW50IHdpdGggbW9yZSB0aGFuIG9uZSBOZ01vZHVsZS4gVGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvciB1bmxlc3Mgd2UgcmVzZXQgd2hpY2hcbiAqIE5nTW9kdWxlIHRoZSBjb21wb25lbnQgYmVsb25ncyB0by4gV2Uga2VlcCB0aGUgbGlzdCBvZiBjb21waWxlZCBjb21wb25lbnRzIGhlcmUgc28gdGhhdCB0aGVcbiAqIFRlc3RCZWQgY2FuIHJlc2V0IGl0IGxhdGVyLlxuICovXG52YXIgb3duZXJOZ01vZHVsZSA9IG5ldyBNYXAoKTtcbnZhciB2ZXJpZmllZE5nTW9kdWxlID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gcmVzZXRDb21waWxlZENvbXBvbmVudHMoKSB7XG4gICAgb3duZXJOZ01vZHVsZSA9IG5ldyBNYXAoKTtcbiAgICB2ZXJpZmllZE5nTW9kdWxlID0gbmV3IE1hcCgpO1xuICAgIG1vZHVsZVF1ZXVlLmxlbmd0aCA9IDA7XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb21iaW5lZCBkZWNsYXJhdGlvbnMgb2YgZXhwbGljaXQgZGVjbGFyYXRpb25zLCBhcyB3ZWxsIGFzIGRlY2xhcmF0aW9ucyBpbmhlcml0ZWQgYnlcbiAqIHRyYXZlcnNpbmcgdGhlIGV4cG9ydHMgb2YgaW1wb3J0ZWQgbW9kdWxlcy5cbiAqIEBwYXJhbSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSkge1xuICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICB2YXIgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZih0eXBlLCB0cnVlKTtcbiAgICByZXR1cm4gX19zcHJlYWQoZmxhdHRlbihtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmV4cG9ydHMpLm1hcChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZih0eXBlKTtcbiAgICAgICAgaWYgKG5nTW9kdWxlRGVmKSB7XG4gICAgICAgICAgICB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgIH0pKSk7XG59XG4vKipcbiAqIFNvbWUgZGVjbGFyZWQgY29tcG9uZW50cyBtYXkgYmUgY29tcGlsZWQgYXN5bmNocm9ub3VzbHksIGFuZCB0aHVzIG1heSBub3QgaGF2ZSB0aGVpclxuICogbmdDb21wb25lbnREZWYgc2V0IHlldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIGlzIHdyaXR0ZW4gaW50b1xuICogdGhlIGBuZ1NlbGVjdG9yU2NvcGVgIHByb3BlcnR5IG9mIHRoZSBkZWNsYXJlZCB0eXBlLlxuICovXG5mdW5jdGlvbiBzZXRTY29wZU9uRGVjbGFyZWRDb21wb25lbnRzKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7XG4gICAgdmFyIGRlY2xhcmF0aW9ucyA9IGZsYXR0ZW4obmdNb2R1bGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZJDQpO1xuICAgIHZhciB0cmFuc2l0aXZlU2NvcGVzID0gdHJhbnNpdGl2ZVNjb3Blc0Zvcihtb2R1bGVUeXBlKTtcbiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZGVjbGFyYXRpb24pIHtcbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmhhc093blByb3BlcnR5KE5HX0NPTVBPTkVOVF9ERUYpKSB7XG4gICAgICAgICAgICAvLyBBbiBgbmdDb21wb25lbnREZWZgIGZpZWxkIGV4aXN0cyAtIGdvIGFoZWFkIGFuZCBwYXRjaCB0aGUgY29tcG9uZW50IGRpcmVjdGx5LlxuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IGRlY2xhcmF0aW9uO1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudERlZiA9IGdldENvbXBvbmVudERlZihjb21wb25lbnQpO1xuICAgICAgICAgICAgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUoY29tcG9uZW50RGVmLCB0cmFuc2l0aXZlU2NvcGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZGVjbGFyYXRpb24uaGFzT3duUHJvcGVydHkoTkdfRElSRUNUSVZFX0RFRikgJiYgIWRlY2xhcmF0aW9uLmhhc093blByb3BlcnR5KE5HX1BJUEVfREVGKSkge1xuICAgICAgICAgICAgLy8gU2V0IGBuZ1NlbGVjdG9yU2NvcGVgIGZvciBmdXR1cmUgcmVmZXJlbmNlIHdoZW4gdGhlIGNvbXBvbmVudCBjb21waWxhdGlvbiBmaW5pc2hlcy5cbiAgICAgICAgICAgIGRlY2xhcmF0aW9uLm5nU2VsZWN0b3JTY29wZSA9IG1vZHVsZVR5cGU7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogUGF0Y2ggdGhlIGRlZmluaXRpb24gb2YgYSBjb21wb25lbnQgd2l0aCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBmcm9tIHRoZSBjb21waWxhdGlvbiBzY29wZSBvZlxuICogYSBnaXZlbiBtb2R1bGUuXG4gKi9cbmZ1bmN0aW9uIHBhdGNoQ29tcG9uZW50RGVmV2l0aFNjb3BlKGNvbXBvbmVudERlZiwgdHJhbnNpdGl2ZVNjb3Blcykge1xuICAgIGNvbXBvbmVudERlZi5kaXJlY3RpdmVEZWZzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0cmFuc2l0aXZlU2NvcGVzLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGRpci5oYXNPd25Qcm9wZXJ0eShOR19DT01QT05FTlRfREVGKSA/IGdldENvbXBvbmVudERlZihkaXIpIDpcbiAgICAgICAgICAgIGdldERpcmVjdGl2ZURlZihkaXIpOyB9KVxuICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZGVmKSB7IHJldHVybiAhIWRlZjsgfSk7XG4gICAgfTtcbiAgICBjb21wb25lbnREZWYucGlwZURlZnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRyYW5zaXRpdmVTY29wZXMuY29tcGlsYXRpb24ucGlwZXMpLm1hcChmdW5jdGlvbiAocGlwZSkgeyByZXR1cm4gZ2V0UGlwZURlZihwaXBlKTsgfSk7XG4gICAgfTtcbiAgICBjb21wb25lbnREZWYuc2NoZW1hcyA9IHRyYW5zaXRpdmVTY29wZXMuc2NoZW1hcztcbiAgICAvLyBTaW5jZSB3ZSBhdm9pZCBDb21wb25lbnRzL0RpcmVjdGl2ZXMvUGlwZXMgcmVjb21waWxpbmcgaW4gY2FzZSB0aGVyZSBhcmUgbm8gb3ZlcnJpZGVzLCB3ZVxuICAgIC8vIG1heSBmYWNlIGEgcHJvYmxlbSB3aGVyZSBwcmV2aW91c2x5IGNvbXBpbGVkIGRlZnMgYXZhaWxhYmxlIHRvIGEgZ2l2ZW4gQ29tcG9uZW50L0RpcmVjdGl2ZVxuICAgIC8vIGFyZSBjYWNoZWQgaW4gVFZpZXcgYW5kIG1heSBiZWNvbWUgc3RhbGUgKGluIGNhc2UgYW55IG9mIHRoZXNlIGRlZnMgZ2V0cyByZWNvbXBpbGVkKS4gSW5cbiAgICAvLyBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGZvcmNlIGZyZXNoIFRWaWV3IHRvIGJlIGNyZWF0ZWQuXG4gICAgY29tcG9uZW50RGVmLnRlbXBsYXRlLm5nUHJpdmF0ZURhdGEgPSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIENvbXB1dGUgdGhlIHBhaXIgb2YgdHJhbnNpdGl2ZSBzY29wZXMgKGNvbXBpbGF0aW9uIHNjb3BlIGFuZCBleHBvcnRlZCBzY29wZSkgZm9yIGEgZ2l2ZW4gbW9kdWxlLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIG1lbW9pemVkIGFuZCB0aGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgbW9kdWxlJ3MgZGVmaW5pdGlvbi4gSXQgY2FuIGJlIGNhbGxlZFxuICogb24gbW9kdWxlcyB3aXRoIGNvbXBvbmVudHMgdGhhdCBoYXZlIG5vdCBmdWxseSBjb21waWxlZCB5ZXQsIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUgdXNlZFxuICogdW50aWwgdGhleSBoYXZlLlxuICovXG5mdW5jdGlvbiB0cmFuc2l0aXZlU2NvcGVzRm9yKG1vZHVsZVR5cGUsIHByb2Nlc3NOZ01vZHVsZUZuKSB7XG4gICAgaWYgKCFpc05nTW9kdWxlKG1vZHVsZVR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtb2R1bGVUeXBlLm5hbWUgKyBcIiBkb2VzIG5vdCBoYXZlIGFuIG5nTW9kdWxlRGVmXCIpO1xuICAgIH1cbiAgICB2YXIgZGVmID0gZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSk7XG4gICAgaWYgKGRlZi50cmFuc2l0aXZlQ29tcGlsZVNjb3BlcyAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGVmLnRyYW5zaXRpdmVDb21waWxlU2NvcGVzO1xuICAgIH1cbiAgICB2YXIgc2NvcGVzID0ge1xuICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLFxuICAgICAgICBjb21waWxhdGlvbjoge1xuICAgICAgICAgICAgZGlyZWN0aXZlczogbmV3IFNldCgpLFxuICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0ZWQ6IHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHBpcGVzOiBuZXcgU2V0KCksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBtYXliZVVud3JhcEZuKGRlZi5kZWNsYXJhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGRlY2xhcmVkKSB7XG4gICAgICAgIHZhciBkZWNsYXJlZFdpdGhEZWZzID0gZGVjbGFyZWQ7XG4gICAgICAgIGlmIChnZXRQaXBlRGVmKGRlY2xhcmVkV2l0aERlZnMpKSB7XG4gICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGRlY2xhcmVkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVpdGhlciBkZWNsYXJlZCBoYXMgYW4gbmdDb21wb25lbnREZWYgb3IgbmdEaXJlY3RpdmVEZWYsIG9yIGl0J3MgYSBjb21wb25lbnQgd2hpY2ggaGFzbid0XG4gICAgICAgICAgICAvLyBoYWQgaXRzIHRlbXBsYXRlIGNvbXBpbGVkIHlldC4gSW4gZWl0aGVyIGNhc2UsIGl0IGdldHMgYWRkZWQgdG8gdGhlIGNvbXBpbGF0aW9uJ3NcbiAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMuXG4gICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZGVjbGFyZWQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbWF5YmVVbndyYXBGbihkZWYuaW1wb3J0cykuZm9yRWFjaChmdW5jdGlvbiAoaW1wb3J0ZWQpIHtcbiAgICAgICAgdmFyIGltcG9ydGVkVHlwZSA9IGltcG9ydGVkO1xuICAgICAgICBpZiAoIWlzTmdNb2R1bGUoaW1wb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW1wb3J0aW5nIFwiICsgaW1wb3J0ZWRUeXBlLm5hbWUgKyBcIiB3aGljaCBkb2VzIG5vdCBoYXZlIGFuIG5nTW9kdWxlRGVmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9jZXNzTmdNb2R1bGVGbikge1xuICAgICAgICAgICAgcHJvY2Vzc05nTW9kdWxlRm4oaW1wb3J0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHRoaXMgbW9kdWxlIGltcG9ydHMgYW5vdGhlciwgdGhlIGltcG9ydGVkIG1vZHVsZSdzIGV4cG9ydGVkIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGFyZVxuICAgICAgICAvLyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24gc2NvcGUgb2YgdGhpcyBtb2R1bGUuXG4gICAgICAgIHZhciBpbXBvcnRlZFNjb3BlID0gdHJhbnNpdGl2ZVNjb3Blc0ZvcihpbXBvcnRlZFR5cGUsIHByb2Nlc3NOZ01vZHVsZUZuKTtcbiAgICAgICAgaW1wb3J0ZWRTY29wZS5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZW50cnkpOyB9KTtcbiAgICAgICAgaW1wb3J0ZWRTY29wZS5leHBvcnRlZC5waXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gc2NvcGVzLmNvbXBpbGF0aW9uLnBpcGVzLmFkZChlbnRyeSk7IH0pO1xuICAgIH0pO1xuICAgIG1heWJlVW53cmFwRm4oZGVmLmV4cG9ydHMpLmZvckVhY2goZnVuY3Rpb24gKGV4cG9ydGVkKSB7XG4gICAgICAgIHZhciBleHBvcnRlZFR5cGUgPSBleHBvcnRlZDtcbiAgICAgICAgLy8gRWl0aGVyIHRoZSB0eXBlIGlzIGEgbW9kdWxlLCBhIHBpcGUsIG9yIGEgY29tcG9uZW50L2RpcmVjdGl2ZSAod2hpY2ggbWF5IG5vdCBoYXZlIGFuXG4gICAgICAgIC8vIG5nQ29tcG9uZW50RGVmIGFzIGl0IG1pZ2h0IGJlIGNvbXBpbGVkIGFzeW5jaHJvbm91c2x5KS5cbiAgICAgICAgaWYgKGlzTmdNb2R1bGUoZXhwb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgLy8gV2hlbiB0aGlzIG1vZHVsZSBleHBvcnRzIGFub3RoZXIsIHRoZSBleHBvcnRlZCBtb2R1bGUncyBleHBvcnRlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhcmVcbiAgICAgICAgICAgIC8vIGFkZGVkIHRvIGJvdGggdGhlIGNvbXBpbGF0aW9uIGFuZCBleHBvcnRlZCBzY29wZXMgb2YgdGhpcyBtb2R1bGUuXG4gICAgICAgICAgICB2YXIgZXhwb3J0ZWRTY29wZSA9IHRyYW5zaXRpdmVTY29wZXNGb3IoZXhwb3J0ZWRUeXBlLCBwcm9jZXNzTmdNb2R1bGVGbik7XG4gICAgICAgICAgICBleHBvcnRlZFNjb3BlLmV4cG9ydGVkLmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZW50cnkpO1xuICAgICAgICAgICAgICAgIHNjb3Blcy5leHBvcnRlZC5kaXJlY3RpdmVzLmFkZChlbnRyeSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4cG9ydGVkU2NvcGUuZXhwb3J0ZWQucGlwZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQucGlwZXMuYWRkKGVudHJ5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdldFBpcGVEZWYoZXhwb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgc2NvcGVzLmV4cG9ydGVkLnBpcGVzLmFkZChleHBvcnRlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NvcGVzLmV4cG9ydGVkLmRpcmVjdGl2ZXMuYWRkKGV4cG9ydGVkVHlwZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBkZWYudHJhbnNpdGl2ZUNvbXBpbGVTY29wZXMgPSBzY29wZXM7XG4gICAgcmV0dXJuIHNjb3Blcztcbn1cbmZ1bmN0aW9uIGV4cGFuZE1vZHVsZVdpdGhQcm92aWRlcnModmFsdWUpIHtcbiAgICBpZiAoaXNNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubmdNb2R1bGU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGlzTW9kdWxlV2l0aFByb3ZpZGVycyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5uZ01vZHVsZSAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gaXNOZ01vZHVsZSh2YWx1ZSkge1xuICAgIHJldHVybiAhIWdldE5nTW9kdWxlRGVmKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBDb21waWxlIGFuIEFuZ3VsYXIgY29tcG9uZW50IGFjY29yZGluZyB0byBpdHMgZGVjb3JhdG9yIG1ldGFkYXRhLCBhbmQgcGF0Y2ggdGhlIHJlc3VsdGluZ1xuICogbmdDb21wb25lbnREZWYgb250byB0aGUgY29tcG9uZW50IHR5cGUuXG4gKlxuICogQ29tcGlsYXRpb24gbWF5IGJlIGFzeW5jaHJvbm91cyAoZHVlIHRvIHRoZSBuZWVkIHRvIHJlc29sdmUgVVJMcyBmb3IgdGhlIGNvbXBvbmVudCB0ZW1wbGF0ZSBvclxuICogb3RoZXIgcmVzb3VyY2VzLCBmb3IgZXhhbXBsZSkuIEluIHRoZSBldmVudCB0aGF0IGNvbXBpbGF0aW9uIGlzIG5vdCBpbW1lZGlhdGUsIGBjb21waWxlQ29tcG9uZW50YFxuICogd2lsbCBlbnF1ZXVlIHJlc291cmNlIHJlc29sdXRpb24gaW50byBhIGdsb2JhbCBxdWV1ZSBhbmQgd2lsbCBmYWlsIHRvIHJldHVybiB0aGUgYG5nQ29tcG9uZW50RGVmYFxuICogdW50aWwgdGhlIGdsb2JhbCBxdWV1ZSBoYXMgYmVlbiByZXNvbHZlZCB3aXRoIGEgY2FsbCB0byBgcmVzb2x2ZUNvbXBvbmVudFJlc291cmNlc2AuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb21wb25lbnQodHlwZSwgbWV0YWRhdGEpIHtcbiAgICB2YXIgbmdDb21wb25lbnREZWYgPSBudWxsO1xuICAgIC8vIE1ldGFkYXRhIG1heSBoYXZlIHJlc291cmNlcyB3aGljaCBuZWVkIHRvIGJlIHJlc29sdmVkLlxuICAgIG1heWJlUXVldWVSZXNvbHV0aW9uT2ZDb21wb25lbnRSZXNvdXJjZXModHlwZSwgbWV0YWRhdGEpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19DT01QT05FTlRfREVGLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTtcbiAgICAgICAgICAgIGlmIChuZ0NvbXBvbmVudERlZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnROZWVkc1Jlc29sdXRpb24obWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IFtcIkNvbXBvbmVudCAnXCIgKyB0eXBlLm5hbWUgKyBcIicgaXMgbm90IHJlc29sdmVkOlwiXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKFwiIC0gdGVtcGxhdGVVcmw6IFwiICsgbWV0YWRhdGEudGVtcGxhdGVVcmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5zdHlsZVVybHMgJiYgbWV0YWRhdGEuc3R5bGVVcmxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChcIiAtIHN0eWxlVXJsczogXCIgKyBKU09OLnN0cmluZ2lmeShtZXRhZGF0YS5zdHlsZVVybHMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKFwiRGlkIHlvdSBydW4gYW5kIHdhaXQgZm9yICdyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCknP1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlVXJsID0gbWV0YWRhdGEudGVtcGxhdGVVcmwgfHwgXCJuZzovLy9cIiArIHR5cGUubmFtZSArIFwiL3RlbXBsYXRlLmh0bWxcIjtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IF9fYXNzaWduKHt9LCBkaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBtZXRhZGF0YSksIHsgdHlwZVNvdXJjZVNwYW46IGNvbXBpbGVyLmNyZWF0ZVBhcnNlU291cmNlU3BhbignQ29tcG9uZW50JywgdHlwZS5uYW1lLCB0ZW1wbGF0ZVVybCksIHRlbXBsYXRlOiBtZXRhZGF0YS50ZW1wbGF0ZSB8fCAnJywgcHJlc2VydmVXaGl0ZXNwYWNlczogbWV0YWRhdGEucHJlc2VydmVXaGl0ZXNwYWNlcyB8fCBmYWxzZSwgc3R5bGVzOiBtZXRhZGF0YS5zdHlsZXMgfHwgRU1QVFlfQVJSQVkkMSwgYW5pbWF0aW9uczogbWV0YWRhdGEuYW5pbWF0aW9ucywgZGlyZWN0aXZlczogW10sIGNoYW5nZURldGVjdGlvbjogbWV0YWRhdGEuY2hhbmdlRGV0ZWN0aW9uLCBwaXBlczogbmV3IE1hcCgpLCBlbmNhcHN1bGF0aW9uOiBtZXRhZGF0YS5lbmNhcHN1bGF0aW9uIHx8IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLCBpbnRlcnBvbGF0aW9uOiBtZXRhZGF0YS5pbnRlcnBvbGF0aW9uLCB2aWV3UHJvdmlkZXJzOiBtZXRhZGF0YS52aWV3UHJvdmlkZXJzIHx8IG51bGwgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGEudXNlc0luaGVyaXRhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEJhc2VEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmdDb21wb25lbnREZWYgPSBjb21waWxlci5jb21waWxlQ29tcG9uZW50KGFuZ3VsYXJDb3JlRW52LCB0ZW1wbGF0ZVVybCwgbWV0YSk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBOZ01vZHVsZSBkZWNvcmF0b3IgZXhlY3V0ZWQsIHdlIGVucXVldWVkIHRoZSBtb2R1bGUgZGVmaW5pdGlvbiBzdWNoIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBvbmx5IGRlcXVldWUgYW5kIGFkZCBpdHNlbGYgYXMgbW9kdWxlIHNjb3BlIHRvIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBvbmx5IGlmICBpZiBhbGwgb2YgaXRzIGRlY2xhcmF0aW9ucyBoYWQgcmVzb2x2ZWQuIFRoaXMgY2FsbCBydW5zIHRoZSBjaGVja1xuICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiBhbnkgbW9kdWxlcyB0aGF0IGFyZSBpbiB0aGUgcXVldWUgY2FuIGJlIGRlcXVldWVkIGFuZCBhZGQgc2NvcGUgdG9cbiAgICAgICAgICAgICAgICAvLyB0aGVpciBkZWNsYXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlKCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgY29tcG9uZW50IGNvbXBpbGF0aW9uIGlzIGFzeW5jLCB0aGVuIHRoZSBATmdNb2R1bGUgYW5ub3RhdGlvbiB3aGljaCBkZWNsYXJlcyB0aGVcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGV4ZWN1dGUgYW5kIHNldCBhbiBuZ1NlbGVjdG9yU2NvcGUgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudCB0eXBlLiBUaGlzXG4gICAgICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb21wb25lbnQgdG8gcGF0Y2ggaXRzZWxmIHdpdGggZGlyZWN0aXZlRGVmcyBmcm9tIHRoZSBtb2R1bGUgYWZ0ZXIgaXRcbiAgICAgICAgICAgICAgICAvLyBmaW5pc2hlcyBjb21waWxpbmcuXG4gICAgICAgICAgICAgICAgaWYgKGhhc1NlbGVjdG9yU2NvcGUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlcyA9IHRyYW5zaXRpdmVTY29wZXNGb3IodHlwZS5uZ1NlbGVjdG9yU2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICBwYXRjaENvbXBvbmVudERlZldpdGhTY29wZShuZ0NvbXBvbmVudERlZiwgc2NvcGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmdDb21wb25lbnREZWY7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsXG4gICAgfSk7XG4gICAgLy8gQWRkIG5nSW5qZWN0YWJsZURlZiBzbyBjb21wb25lbnRzIGFyZSByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW9kdWxlIGluamVjdG9yIGJ5IGRlZmF1bHRcbiAgICAvLyBUaGlzIGlzIG1vc3RseSB0byBzdXBwb3J0IGluamVjdGluZyBjb21wb25lbnRzIGluIHRlc3RzLiBJbiByZWFsIGFwcGxpY2F0aW9uIGNvZGUsXG4gICAgLy8gY29tcG9uZW50cyBzaG91bGQgYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIG5vZGUgaW5qZWN0b3IsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLlxuICAgIGNvbXBpbGVJbmplY3RhYmxlKHR5cGUpO1xufVxuZnVuY3Rpb24gaGFzU2VsZWN0b3JTY29wZShjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50Lm5nU2VsZWN0b3JTY29wZSAhPT0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBDb21waWxlIGFuIEFuZ3VsYXIgZGlyZWN0aXZlIGFjY29yZGluZyB0byBpdHMgZGVjb3JhdG9yIG1ldGFkYXRhLCBhbmQgcGF0Y2ggdGhlIHJlc3VsdGluZ1xuICogbmdEaXJlY3RpdmVEZWYgb250byB0aGUgY29tcG9uZW50IHR5cGUuXG4gKlxuICogSW4gdGhlIGV2ZW50IHRoYXQgY29tcGlsYXRpb24gaXMgbm90IGltbWVkaWF0ZSwgYGNvbXBpbGVEaXJlY3RpdmVgIHdpbGwgcmV0dXJuIGEgYFByb21pc2VgIHdoaWNoXG4gKiB3aWxsIHJlc29sdmUgd2hlbiBjb21waWxhdGlvbiBjb21wbGV0ZXMgYW5kIHRoZSBkaXJlY3RpdmUgYmVjb21lcyB1c2FibGUuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVEaXJlY3RpdmUodHlwZSwgZGlyZWN0aXZlKSB7XG4gICAgdmFyIG5nRGlyZWN0aXZlRGVmID0gbnVsbDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRElSRUNUSVZFX0RFRiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChuZ0RpcmVjdGl2ZURlZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSB0eXBlICYmIHR5cGUubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwVXJsID0gXCJuZzovLy9cIiArIG5hbWVfMSArIFwiL25nRGlyZWN0aXZlRGVmLmpzXCI7XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTtcbiAgICAgICAgICAgICAgICB2YXIgZmFjYWRlID0gZGlyZWN0aXZlTWV0YWRhdGEodHlwZSwgZGlyZWN0aXZlKTtcbiAgICAgICAgICAgICAgICBmYWNhZGUudHlwZVNvdXJjZVNwYW4gPSBjb21waWxlci5jcmVhdGVQYXJzZVNvdXJjZVNwYW4oJ0RpcmVjdGl2ZScsIG5hbWVfMSwgc291cmNlTWFwVXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoZmFjYWRlLnVzZXNJbmhlcml0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRCYXNlRGVmVG9VbmRlY29yYXRlZFBhcmVudHModHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5nRGlyZWN0aXZlRGVmID0gY29tcGlsZXIuY29tcGlsZURpcmVjdGl2ZShhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCBmYWNhZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5nRGlyZWN0aXZlRGVmO1xuICAgICAgICB9LFxuICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0c1xuICAgICAgICBjb25maWd1cmFibGU6ICEhbmdEZXZNb2RlLFxuICAgIH0pO1xuICAgIC8vIEFkZCBuZ0luamVjdGFibGVEZWYgc28gZGlyZWN0aXZlcyBhcmUgcmVhY2hhYmxlIHRocm91Z2ggdGhlIG1vZHVsZSBpbmplY3RvciBieSBkZWZhdWx0XG4gICAgLy8gVGhpcyBpcyBtb3N0bHkgdG8gc3VwcG9ydCBpbmplY3RpbmcgZGlyZWN0aXZlcyBpbiB0ZXN0cy4gSW4gcmVhbCBhcHBsaWNhdGlvbiBjb2RlLFxuICAgIC8vIGRpcmVjdGl2ZXMgc2hvdWxkIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSBub2RlIGluamVjdG9yLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS5cbiAgICBjb21waWxlSW5qZWN0YWJsZSh0eXBlKTtcbn1cbmZ1bmN0aW9uIGV4dGVuZHNEaXJlY3RseUZyb21PYmplY3QodHlwZSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZS5wcm90b3R5cGUpID09PSBPYmplY3QucHJvdG90eXBlO1xufVxuLyoqXG4gKiBFeHRyYWN0IHRoZSBgUjNEaXJlY3RpdmVNZXRhZGF0YWAgZm9yIGEgcGFydGljdWxhciBkaXJlY3RpdmUgKGVpdGhlciBhIGBEaXJlY3RpdmVgIG9yIGFcbiAqIGBDb21wb25lbnRgKS5cbiAqL1xuZnVuY3Rpb24gZGlyZWN0aXZlTWV0YWRhdGEodHlwZSwgbWV0YWRhdGEpIHtcbiAgICAvLyBSZWZsZWN0IGlucHV0cyBhbmQgb3V0cHV0cy5cbiAgICB2YXIgcHJvcE1ldGFkYXRhID0gZ2V0UmVmbGVjdCgpLm93blByb3BNZXRhZGF0YSh0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0eXBlLm5hbWUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLFxuICAgICAgICBzZWxlY3RvcjogbWV0YWRhdGEuc2VsZWN0b3IsXG4gICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksXG4gICAgICAgIGhvc3Q6IG1ldGFkYXRhLmhvc3QgfHwgRU1QVFlfT0JKLFxuICAgICAgICBwcm9wTWV0YWRhdGE6IHByb3BNZXRhZGF0YSxcbiAgICAgICAgaW5wdXRzOiBtZXRhZGF0YS5pbnB1dHMgfHwgRU1QVFlfQVJSQVkkMSxcbiAgICAgICAgb3V0cHV0czogbWV0YWRhdGEub3V0cHV0cyB8fCBFTVBUWV9BUlJBWSQxLFxuICAgICAgICBxdWVyaWVzOiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNDb250ZW50UXVlcnkpLFxuICAgICAgICBsaWZlY3ljbGU6IHsgdXNlc09uQ2hhbmdlczogdHlwZS5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJ25nT25DaGFuZ2VzJykgfSxcbiAgICAgICAgdHlwZVNvdXJjZVNwYW46IG51bGwsXG4gICAgICAgIHVzZXNJbmhlcml0YW5jZTogIWV4dGVuZHNEaXJlY3RseUZyb21PYmplY3QodHlwZSksXG4gICAgICAgIGV4cG9ydEFzOiBleHRyYWN0RXhwb3J0QXMobWV0YWRhdGEuZXhwb3J0QXMpLFxuICAgICAgICBwcm92aWRlcnM6IG1ldGFkYXRhLnByb3ZpZGVycyB8fCBudWxsLFxuICAgICAgICB2aWV3UXVlcmllczogZXh0cmFjdFF1ZXJpZXNNZXRhZGF0YSh0eXBlLCBwcm9wTWV0YWRhdGEsIGlzVmlld1F1ZXJ5KSxcbiAgICB9O1xufVxuLyoqXG4gKiBBZGRzIGFuIGBuZ0Jhc2VEZWZgIHRvIGFsbCBwYXJlbnQgY2xhc3NlcyBvZiBhIHR5cGUgdGhhdCBkb24ndCBoYXZlIGFuIEFuZ3VsYXIgZGVjb3JhdG9yLlxuICovXG5mdW5jdGlvbiBhZGRCYXNlRGVmVG9VbmRlY29yYXRlZFBhcmVudHModHlwZSkge1xuICAgIHZhciBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlO1xuICAgIHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZSk7XG4gICAgLy8gR28gdXAgdGhlIHByb3RvdHlwZSB1bnRpbCB3ZSBoaXQgYE9iamVjdGAuXG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IG9ialByb3RvdHlwZSkge1xuICAgICAgICAvLyBTaW5jZSBpbmhlcml0YW5jZSB3b3JrcyBpZiB0aGUgY2xhc3Mgd2FzIGFubm90YXRlZCBhbHJlYWR5LCB3ZSBvbmx5IG5lZWQgdG8gYWRkXG4gICAgICAgIC8vIHRoZSBiYXNlIGRlZiBpZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgYW5kIHRoZSBiYXNlIGRlZiBoYXNuJ3QgYmVlbiBjcmVhdGVkIGFscmVhZHkuXG4gICAgICAgIGlmICghZ2V0RGlyZWN0aXZlRGVmKHBhcmVudCkgJiYgIWdldENvbXBvbmVudERlZihwYXJlbnQpICYmICFnZXRCYXNlRGVmKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHZhciBmYWNhZGUgPSBleHRyYWN0QmFzZURlZk1ldGFkYXRhKHBhcmVudCk7XG4gICAgICAgICAgICBmYWNhZGUgJiYgY29tcGlsZUJhc2UocGFyZW50LCBmYWNhZGUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJlbnQpO1xuICAgIH1cbn1cbi8qKiBDb21waWxlcyB0aGUgYmFzZSBtZXRhZGF0YSBpbnRvIGEgYmFzZSBkZWZpbml0aW9uLiAqL1xuZnVuY3Rpb24gY29tcGlsZUJhc2UodHlwZSwgZmFjYWRlKSB7XG4gICAgdmFyIG5nQmFzZURlZiA9IG51bGw7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX0JBU0VfREVGLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG5nQmFzZURlZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lXzIgPSB0eXBlICYmIHR5cGUubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlTWFwVXJsID0gXCJuZzovL1wiICsgbmFtZV8yICsgXCIvbmdCYXNlRGVmLmpzXCI7XG4gICAgICAgICAgICAgICAgdmFyIGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTtcbiAgICAgICAgICAgICAgICBuZ0Jhc2VEZWYgPSBjb21waWxlci5jb21waWxlQmFzZShhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCBmYWNhZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5nQmFzZURlZjtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gTWFrZSB0aGUgcHJvcGVydHkgY29uZmlndXJhYmxlIGluIGRldiBtb2RlIHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gdGVzdHNcbiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSxcbiAgICB9KTtcbn1cbi8qKiBFeHRyYWN0cyB0aGUgbWV0YWRhdGEgbmVjZXNzYXJ5IHRvIGNvbnN0cnVjdCBhbiBgbmdCYXNlRGVmYCBmcm9tIGEgY2xhc3MuICovXG5mdW5jdGlvbiBleHRyYWN0QmFzZURlZk1ldGFkYXRhKHR5cGUpIHtcbiAgICB2YXIgcHJvcE1ldGFkYXRhID0gZ2V0UmVmbGVjdCgpLm93blByb3BNZXRhZGF0YSh0eXBlKTtcbiAgICB2YXIgdmlld1F1ZXJpZXMgPSBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNWaWV3UXVlcnkpO1xuICAgIHZhciBxdWVyaWVzID0gZXh0cmFjdFF1ZXJpZXNNZXRhZGF0YSh0eXBlLCBwcm9wTWV0YWRhdGEsIGlzQ29udGVudFF1ZXJ5KTtcbiAgICB2YXIgaW5wdXRzO1xuICAgIHZhciBvdXRwdXRzO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIHByb3BNZXRhZGF0YVtmaWVsZF0uZm9yRWFjaChmdW5jdGlvbiAoYW5uKSB7XG4gICAgICAgICAgICBpZiAoYW5uLm5nTWV0YWRhdGFOYW1lID09PSAnSW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXRzID0gaW5wdXRzIHx8IHt9O1xuICAgICAgICAgICAgICAgIGlucHV0c1tmaWVsZF0gPSBhbm4uYmluZGluZ1Byb3BlcnR5TmFtZSA/IFthbm4uYmluZGluZ1Byb3BlcnR5TmFtZSwgZmllbGRdIDogZmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhbm4ubmdNZXRhZGF0YU5hbWUgPT09ICdPdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0cyA9IG91dHB1dHMgfHwge307XG4gICAgICAgICAgICAgICAgb3V0cHV0c1tmaWVsZF0gPSBhbm4uYmluZGluZ1Byb3BlcnR5TmFtZSB8fCBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBmaWVsZCBpbiBwcm9wTWV0YWRhdGEpIHtcbiAgICAgICAgX2xvb3BfMShmaWVsZCk7XG4gICAgfVxuICAgIC8vIE9ubHkgZ2VuZXJhdGUgdGhlIGJhc2UgZGVmIGlmIHRoZXJlJ3MgYW55IGluZm8gaW5zaWRlIGl0LlxuICAgIGlmIChpbnB1dHMgfHwgb3V0cHV0cyB8fCB2aWV3UXVlcmllcy5sZW5ndGggfHwgcXVlcmllcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5wdXRzOiBpbnB1dHMsIG91dHB1dHM6IG91dHB1dHMsIHZpZXdRdWVyaWVzOiB2aWV3UXVlcmllcywgcXVlcmllczogcXVlcmllcyB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUb1IzUXVlcnlQcmVkaWNhdGUoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAnc3RyaW5nJyA/IHNwbGl0QnlDb21tYShzZWxlY3RvcikgOiByZXNvbHZlRm9yd2FyZFJlZihzZWxlY3Rvcik7XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9SM1F1ZXJ5TWV0YWRhdGEocHJvcGVydHlOYW1lLCBhbm4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgcHJlZGljYXRlOiBjb252ZXJ0VG9SM1F1ZXJ5UHJlZGljYXRlKGFubi5zZWxlY3RvciksXG4gICAgICAgIGRlc2NlbmRhbnRzOiBhbm4uZGVzY2VuZGFudHMsXG4gICAgICAgIGZpcnN0OiBhbm4uZmlyc3QsXG4gICAgICAgIHJlYWQ6IGFubi5yZWFkID8gYW5uLnJlYWQgOiBudWxsLFxuICAgICAgICBzdGF0aWM6ICEhYW5uLnN0YXRpY1xuICAgIH07XG59XG5mdW5jdGlvbiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNRdWVyeUFubikge1xuICAgIHZhciBxdWVyaWVzTWV0YSA9IFtdO1xuICAgIHZhciBfbG9vcF8yID0gZnVuY3Rpb24gKGZpZWxkKSB7XG4gICAgICAgIGlmIChwcm9wTWV0YWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7XG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbnNfMSA9IHByb3BNZXRhZGF0YVtmaWVsZF07XG4gICAgICAgICAgICBhbm5vdGF0aW9uc18xLmZvckVhY2goZnVuY3Rpb24gKGFubikge1xuICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5QW5uKGFubikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbm4uc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNvbnN0cnVjdCBhIHF1ZXJ5IGZvciB0aGUgcHJvcGVydHkgXFxcIlwiICsgZmllbGQgKyBcIlxcXCIgb2YgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlxcXCJcIiArIHN0cmluZ2lmeUZvckVycm9yKHR5cGUpICsgXCJcXFwiIHNpbmNlIHRoZSBxdWVyeSBzZWxlY3RvciB3YXNuJ3QgZGVmaW5lZC5cIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uc18xLnNvbWUoaXNJbnB1dEFubikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21iaW5lIEBJbnB1dCBkZWNvcmF0b3JzIHdpdGggcXVlcnkgZGVjb3JhdG9yc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBxdWVyaWVzTWV0YS5wdXNoKGNvbnZlcnRUb1IzUXVlcnlNZXRhZGF0YShmaWVsZCwgYW5uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZvciAodmFyIGZpZWxkIGluIHByb3BNZXRhZGF0YSkge1xuICAgICAgICBfbG9vcF8yKGZpZWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJpZXNNZXRhO1xufVxuZnVuY3Rpb24gZXh0cmFjdEV4cG9ydEFzKGV4cG9ydEFzKSB7XG4gICAgaWYgKGV4cG9ydEFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBleHBvcnRBcy5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAocGFydCkgeyByZXR1cm4gcGFydC50cmltKCk7IH0pO1xufVxuZnVuY3Rpb24gaXNDb250ZW50UXVlcnkodmFsdWUpIHtcbiAgICB2YXIgbmFtZSA9IHZhbHVlLm5nTWV0YWRhdGFOYW1lO1xuICAgIHJldHVybiBuYW1lID09PSAnQ29udGVudENoaWxkJyB8fCBuYW1lID09PSAnQ29udGVudENoaWxkcmVuJztcbn1cbmZ1bmN0aW9uIGlzVmlld1F1ZXJ5KHZhbHVlKSB7XG4gICAgdmFyIG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ1ZpZXdDaGlsZCcgfHwgbmFtZSA9PT0gJ1ZpZXdDaGlsZHJlbic7XG59XG5mdW5jdGlvbiBpc0lucHV0QW5uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLm5nTWV0YWRhdGFOYW1lID09PSAnSW5wdXQnO1xufVxuZnVuY3Rpb24gc3BsaXRCeUNvbW1hKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChwaWVjZSkgeyByZXR1cm4gcGllY2UudHJpbSgpOyB9KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBpcGUodHlwZSwgbWV0YSkge1xuICAgIHZhciBuZ1BpcGVEZWYgPSBudWxsO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19QSVBFX0RFRiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChuZ1BpcGVEZWYgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZU5hbWUgPSB0eXBlLm5hbWU7XG4gICAgICAgICAgICAgICAgbmdQaXBlRGVmID1cbiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlUGlwZShhbmd1bGFyQ29yZUVudiwgXCJuZzovLy9cIiArIHR5cGVOYW1lICsgXCIvbmdQaXBlRGVmLmpzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRDb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogcmVmbGVjdERlcGVuZGVuY2llcyh0eXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVOYW1lOiBtZXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXJlOiBtZXRhLnB1cmUgIT09IHVuZGVmaW5lZCA/IG1ldGEucHVyZSA6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmdQaXBlRGVmO1xuICAgICAgICB9LFxuICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0c1xuICAgICAgICBjb25maWd1cmFibGU6ICEhbmdEZXZNb2RlLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgybUwJDkgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgaWYgKGRpciA9PT0gdm9pZCAwKSB7IGRpciA9IHt9OyB9XG4gICAgcmV0dXJuIGRpcjtcbn0sIMm1MSQyID0gZnVuY3Rpb24gKHR5cGUsIG1ldGEpIHsgcmV0dXJuIFNXSVRDSF9DT01QSUxFX0RJUkVDVElWRSh0eXBlLCBtZXRhKTsgfTtcbi8qKlxuICogVHlwZSBvZiB0aGUgRGlyZWN0aXZlIG1ldGFkYXRhLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERpcmVjdGl2ZSA9IG1ha2VEZWNvcmF0b3IoJ0RpcmVjdGl2ZScsIMm1MCQ5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgybUxJDIpO1xudmFyIMm1MiQyID0gZnVuY3Rpb24gKGMpIHtcbiAgICBpZiAoYyA9PT0gdm9pZCAwKSB7IGMgPSB7fTsgfVxuICAgIHJldHVybiAoX19hc3NpZ24oeyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQgfSwgYykpO1xufSwgybUzJDEgPSBmdW5jdGlvbiAodHlwZSwgbWV0YSkgeyByZXR1cm4gU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UKHR5cGUsIG1ldGEpOyB9O1xuLyoqXG4gKiBDb21wb25lbnQgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ29tcG9uZW50ID0gbWFrZURlY29yYXRvcignQ29tcG9uZW50JywgybUyJDIsIERpcmVjdGl2ZSwgdW5kZWZpbmVkLCDJtTMkMSk7XG52YXIgybU0ID0gZnVuY3Rpb24gKHApIHsgcmV0dXJuIChfX2Fzc2lnbih7IHB1cmU6IHRydWUgfSwgcCkpOyB9LCDJtTUgPSBmdW5jdGlvbiAodHlwZSwgbWV0YSkgeyByZXR1cm4gU1dJVENIX0NPTVBJTEVfUElQRSh0eXBlLCBtZXRhKTsgfTtcbi8qKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFBpcGUgPSBtYWtlRGVjb3JhdG9yKCdQaXBlJywgybU0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgybU1KTtcbnZhciDJtTYgPSBmdW5jdGlvbiAoYmluZGluZ1Byb3BlcnR5TmFtZSkgeyByZXR1cm4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZTogYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsgfTtcbi8qKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIElucHV0ID0gbWFrZVByb3BEZWNvcmF0b3IoJ0lucHV0JywgybU2KTtcbnZhciDJtTcgPSBmdW5jdGlvbiAoYmluZGluZ1Byb3BlcnR5TmFtZSkgeyByZXR1cm4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZTogYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsgfTtcbi8qKlxuICogQEFubm90YXRpb25cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE91dHB1dCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdPdXRwdXQnLCDJtTcpO1xudmFyIMm1OCA9IGZ1bmN0aW9uIChob3N0UHJvcGVydHlOYW1lKSB7IHJldHVybiAoeyBob3N0UHJvcGVydHlOYW1lOiBob3N0UHJvcGVydHlOYW1lIH0pOyB9O1xuLyoqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgSG9zdEJpbmRpbmcgPSBtYWtlUHJvcERlY29yYXRvcignSG9zdEJpbmRpbmcnLCDJtTgpO1xudmFyIMm1OSA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGFyZ3MpIHsgcmV0dXJuICh7IGV2ZW50TmFtZTogZXZlbnROYW1lLCBhcmdzOiBhcmdzIH0pOyB9O1xuLyoqXG4gKiBCaW5kcyBhIERPTSBldmVudCB0byBhIGhvc3QgbGlzdGVuZXIgYW5kIHN1cHBsaWVzIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuXG4gKiBBbmd1bGFyIGludm9rZXMgdGhlIHN1cHBsaWVkIGhhbmRsZXIgbWV0aG9kIHdoZW4gdGhlIGhvc3QgZWxlbWVudCBlbWl0cyB0aGUgc3BlY2lmaWVkIGV2ZW50LFxuICogYW5kIHVwZGF0ZXMgdGhlIGJvdW5kIGVsZW1lbnQgd2l0aCB0aGUgcmVzdWx0LlxuICogSWYgdGhlIGhhbmRsZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIGFwcGxpZXMgYHByZXZlbnREZWZhdWx0YCBvbiB0aGUgYm91bmQgZWxlbWVudC5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZVxuICogdGhhdCBhdHRhY2hlcyBhIGNsaWNrIGxpc3RlbmVyIHRvIGEgYnV0dG9uIGFuZCBjb3VudHMgY2xpY2tzLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdidXR0b25bY291bnRpbmddJ30pXG4gKiBjbGFzcyBDb3VudENsaWNrcyB7XG4gKiAgIG51bWJlck9mQ2xpY2tzID0gMDtcbiAqXG4gKiAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gKiAgIG9uQ2xpY2soYnRuKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ2J1dHRvbicsIGJ0biwgJ251bWJlciBvZiBjbGlja3M6JywgdGhpcy5udW1iZXJPZkNsaWNrcysrKTtcbiAqICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6ICc8YnV0dG9uIGNvdW50aW5nPkluY3JlbWVudDwvYnV0dG9uPicsXG4gKiB9KVxuICogY2xhc3MgQXBwIHt9XG4gKiBgYGBcbiAqXG4gKiBAQW5ub3RhdGlvblxuICogQHB1YmxpY0FwaVxuICovXG52YXIgSG9zdExpc3RlbmVyID0gbWFrZVByb3BEZWNvcmF0b3IoJ0hvc3RMaXN0ZW5lcicsIMm1OSk7XG52YXIgU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UX19QT1NUX1IzX18gPSBjb21waWxlQ29tcG9uZW50O1xudmFyIFNXSVRDSF9DT01QSUxFX0RJUkVDVElWRV9fUE9TVF9SM19fID0gY29tcGlsZURpcmVjdGl2ZTtcbnZhciBTV0lUQ0hfQ09NUElMRV9QSVBFX19QT1NUX1IzX18gPSBjb21waWxlUGlwZTtcbnZhciBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlRfX1BSRV9SM19fID0gbm9vcDtcbnZhciBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BSRV9SM19fID0gbm9vcDtcbnZhciBTV0lUQ0hfQ09NUElMRV9QSVBFX19QUkVfUjNfXyA9IG5vb3A7XG52YXIgU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UID0gU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UX19QUkVfUjNfXztcbnZhciBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkUgPSBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BSRV9SM19fO1xudmFyIFNXSVRDSF9DT01QSUxFX1BJUEUgPSBTV0lUQ0hfQ09NUElMRV9QSVBFX19QUkVfUjNfXztcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIMm1MCRhID0gZnVuY3Rpb24gKG5nTW9kdWxlKSB7IHJldHVybiBuZ01vZHVsZTsgfSwgybUxJDMgPSBcbi8qKlxuICogRGVjb3JhdG9yIHRoYXQgbWFya3MgdGhlIGZvbGxvd2luZyBjbGFzcyBhcyBhbiBOZ01vZHVsZSwgYW5kIHN1cHBsaWVzXG4gKiBjb25maWd1cmF0aW9uIG1ldGFkYXRhIGZvciBpdC5cbiAqXG4gKiAqIFRoZSBgZGVjbGFyYXRpb25zYCBhbmQgYGVudHJ5Q29tcG9uZW50c2Agb3B0aW9ucyBjb25maWd1cmUgdGhlIGNvbXBpbGVyXG4gKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYmVsb25ncyB0byB0aGUgTmdNb2R1bGUuXG4gKiAqIFRoZSBgcHJvdmlkZXJzYCBvcHRpb25zIGNvbmZpZ3VyZXMgdGhlIE5nTW9kdWxlJ3MgaW5qZWN0b3IgdG8gcHJvdmlkZVxuICogZGVwZW5kZW5jaWVzIHRoZSBOZ01vZHVsZSBtZW1iZXJzLlxuICogKiBUaGUgYGltcG9ydHNgIGFuZCBgZXhwb3J0c2Agb3B0aW9ucyBicmluZyBpbiBtZW1iZXJzIGZyb20gb3RoZXIgbW9kdWxlcywgYW5kIG1ha2VcbiAqIHRoaXMgbW9kdWxlJ3MgbWVtYmVycyBhdmFpbGFibGUgdG8gb3RoZXJzLlxuICovXG5mdW5jdGlvbiAodHlwZSwgbWV0YSkgeyByZXR1cm4gU1dJVENIX0NPTVBJTEVfTkdNT0RVTEUodHlwZSwgbWV0YSk7IH07XG4vKipcbiAqIEBBbm5vdGF0aW9uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ01vZHVsZSA9IG1ha2VEZWNvcmF0b3IoJ05nTW9kdWxlJywgybUwJGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCDJtTEkMyk7XG5mdW5jdGlvbiBwcmVSM05nTW9kdWxlQ29tcGlsZShtb2R1bGVUeXBlLCBtZXRhZGF0YSkge1xuICAgIHZhciBpbXBvcnRzID0gKG1ldGFkYXRhICYmIG1ldGFkYXRhLmltcG9ydHMpIHx8IFtdO1xuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5leHBvcnRzKSB7XG4gICAgICAgIGltcG9ydHMgPSBfX3NwcmVhZChpbXBvcnRzLCBbbWV0YWRhdGEuZXhwb3J0c10pO1xuICAgIH1cbiAgICBtb2R1bGVUeXBlLm5nSW5qZWN0b3JEZWYgPSDJtcm1ZGVmaW5lSW5qZWN0b3Ioe1xuICAgICAgICBmYWN0b3J5OiBjb252ZXJ0SW5qZWN0YWJsZVByb3ZpZGVyVG9GYWN0b3J5KG1vZHVsZVR5cGUsIHsgdXNlQ2xhc3M6IG1vZHVsZVR5cGUgfSksXG4gICAgICAgIHByb3ZpZGVyczogbWV0YWRhdGEgJiYgbWV0YWRhdGEucHJvdmlkZXJzLFxuICAgICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH0pO1xufVxudmFyIFNXSVRDSF9DT01QSUxFX05HTU9EVUxFX19QT1NUX1IzX18gPSBjb21waWxlTmdNb2R1bGU7XG52YXIgU1dJVENIX0NPTVBJTEVfTkdNT0RVTEVfX1BSRV9SM19fID0gcHJlUjNOZ01vZHVsZUNvbXBpbGU7XG52YXIgU1dJVENIX0NPTVBJTEVfTkdNT0RVTEUgPSBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRV9fUFJFX1IzX187XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEFQUF9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignQXBwbGljYXRpb24gSW5pdGlhbGl6ZXInKTtcbi8qKlxuICogQSBjbGFzcyB0aGF0IHJlZmxlY3RzIHRoZSBzdGF0ZSBvZiBydW5uaW5nIHtAbGluayBBUFBfSU5JVElBTElaRVJ9cy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBBcHBsaWNhdGlvbkluaXRTdGF0dXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXBwbGljYXRpb25Jbml0U3RhdHVzKGFwcEluaXRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYXBwSW5pdHMgPSBhcHBJbml0cztcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikge1xuICAgICAgICAgICAgX3RoaXMucmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgIF90aGlzLnJlamVjdCA9IHJlajtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBBcHBsaWNhdGlvbkluaXRTdGF0dXMucHJvdG90eXBlLnJ1bkluaXRpYWxpemVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXN5bmNJbml0UHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICBfdGhpcy5yZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmFwcEluaXRzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXBwSW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5pdFJlc3VsdCA9IHRoaXMuYXBwSW5pdHNbaV0oKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKGluaXRSZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSW5pdFByb21pc2VzLnB1c2goaW5pdFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFByb21pc2UuYWxsKGFzeW5jSW5pdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHsgY29tcGxldGUoKTsgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsgX3RoaXMucmVqZWN0KGUpOyB9KTtcbiAgICAgICAgaWYgKGFzeW5jSW5pdFByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIEFwcGxpY2F0aW9uSW5pdFN0YXR1cyA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIF9fcGFyYW0oMCwgSW5qZWN0KEFQUF9JTklUSUFMSVpFUikpLCBfX3BhcmFtKDAsIE9wdGlvbmFsKCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5XSlcbiAgICBdLCBBcHBsaWNhdGlvbkluaXRTdGF0dXMpO1xuICAgIHJldHVybiBBcHBsaWNhdGlvbkluaXRTdGF0dXM7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEEgREkgVG9rZW4gcmVwcmVzZW50aW5nIGEgdW5pcXVlIHN0cmluZyBpZCBhc3NpZ25lZCB0byB0aGUgYXBwbGljYXRpb24gYnkgQW5ndWxhciBhbmQgdXNlZFxuICogcHJpbWFyaWx5IGZvciBwcmVmaXhpbmcgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhbmQgQ1NTIHN0eWxlcyB3aGVuXG4gKiB7QGxpbmsgVmlld0VuY2Fwc3VsYXRpb24jRW11bGF0ZWQgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWR9IGlzIGJlaW5nIHVzZWQuXG4gKlxuICogSWYgeW91IG5lZWQgdG8gYXZvaWQgcmFuZG9tbHkgZ2VuZXJhdGVkIHZhbHVlIHRvIGJlIHVzZWQgYXMgYW4gYXBwbGljYXRpb24gaWQsIHlvdSBjYW4gcHJvdmlkZVxuICogYSBjdXN0b20gdmFsdWUgdmlhIGEgREkgcHJvdmlkZXIgPCEtLSBUT0RPOiBwcm92aWRlciAtLT4gY29uZmlndXJpbmcgdGhlIHJvb3Qge0BsaW5rIEluamVjdG9yfVxuICogdXNpbmcgdGhpcyB0b2tlbi5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEFQUF9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignQXBwSWQnKTtcbmZ1bmN0aW9uIF9hcHBJZFJhbmRvbVByb3ZpZGVyRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gXCJcIiArIF9yYW5kb21DaGFyKCkgKyBfcmFuZG9tQ2hhcigpICsgX3JhbmRvbUNoYXIoKTtcbn1cbi8qKlxuICogUHJvdmlkZXJzIHRoYXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBBUFBfSURfVE9LRU4uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBBUFBfSURfUkFORE9NX1BST1ZJREVSID0ge1xuICAgIHByb3ZpZGU6IEFQUF9JRCxcbiAgICB1c2VGYWN0b3J5OiBfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnksXG4gICAgZGVwczogW10sXG59O1xuZnVuY3Rpb24gX3JhbmRvbUNoYXIoKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNSkpO1xufVxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgcGxhdGZvcm0gaXMgaW5pdGlhbGl6ZWQuXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBQTEFURk9STV9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignUGxhdGZvcm0gSW5pdGlhbGl6ZXInKTtcbi8qKlxuICogQSB0b2tlbiB0aGF0IGluZGljYXRlcyBhbiBvcGFxdWUgcGxhdGZvcm0gaWQuXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBQTEFURk9STV9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignUGxhdGZvcm0gSUQnKTtcbi8qKlxuICogQWxsIGNhbGxiYWNrcyBwcm92aWRlZCB2aWEgdGhpcyB0b2tlbiB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgY29tcG9uZW50IHRoYXQgaXMgYm9vdHN0cmFwcGVkLlxuICogU2lnbmF0dXJlIG9mIHRoZSBjYWxsYmFjazpcbiAqXG4gKiBgKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmKSA9PiB2b2lkYC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSID0gbmV3IEluamVjdGlvblRva2VuKCdhcHBCb290c3RyYXBMaXN0ZW5lcicpO1xuLyoqXG4gKiBBIHRva2VuIHdoaWNoIGluZGljYXRlcyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBQQUNLQUdFX1JPT1RfVVJMID0gbmV3IEluamVjdGlvblRva2VuKCdBcHBsaWNhdGlvbiBQYWNrYWdlcyBSb290IFVSTCcpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQ29uc29sZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlKCkge1xuICAgIH1cbiAgICBDb25zb2xlLnByb3RvdHlwZS5sb2cgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9O1xuICAgIC8vIE5vdGU6IGZvciByZXBvcnRpbmcgZXJyb3JzIHVzZSBgRE9NLmxvZ0Vycm9yKClgIGFzIGl0IGlzIHBsYXRmb3JtIHNwZWNpZmljXG4gICAgQ29uc29sZS5wcm90b3R5cGUud2FybiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICB9O1xuICAgIENvbnNvbGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpXG4gICAgXSwgQ29uc29sZSk7XG4gICAgcmV0dXJuIENvbnNvbGU7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENvbWJpbmF0aW9uIG9mIE5nTW9kdWxlRmFjdG9yeSBhbmQgQ29tcG9uZW50RmFjdG9yeXMuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTW9kdWxlV2l0aENvbXBvbmVudEZhY3RvcmllcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNb2R1bGVXaXRoQ29tcG9uZW50RmFjdG9yaWVzKG5nTW9kdWxlRmFjdG9yeSwgY29tcG9uZW50RmFjdG9yaWVzKSB7XG4gICAgICAgIHRoaXMubmdNb2R1bGVGYWN0b3J5ID0gbmdNb2R1bGVGYWN0b3J5O1xuICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcmllcyA9IGNvbXBvbmVudEZhY3RvcmllcztcbiAgICB9XG4gICAgcmV0dXJuIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXM7XG59KCkpO1xuZnVuY3Rpb24gX3Rocm93RXJyb3IoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBjb21waWxlciBpcyBub3QgbG9hZGVkXCIpO1xufVxudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QUkVfUjNfXyA9IF90aHJvd0Vycm9yO1xudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18gPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgIHJldHVybiBuZXcgTmdNb2R1bGVGYWN0b3J5JDEobW9kdWxlVHlwZSk7XG59O1xudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZVN5bmNfX1BSRV9SM19fO1xudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBc3luY19fUFJFX1IzX18gPSBfdGhyb3dFcnJvcjtcbnZhciBDb21waWxlcl9jb21waWxlTW9kdWxlQXN5bmNfX1BPU1RfUjNfXyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTtcbn07XG52YXIgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jX19QUkVfUjNfXztcbnZhciBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmNfX1BSRV9SM19fID0gX3Rocm93RXJyb3I7XG52YXIgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QT1NUX1IzX18gPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgIHZhciBuZ01vZHVsZUZhY3RvcnkgPSBDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpO1xuICAgIHZhciBtb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKTtcbiAgICB2YXIgY29tcG9uZW50RmFjdG9yaWVzID0gbWF5YmVVbndyYXBGbihtb2R1bGVEZWYuZGVjbGFyYXRpb25zKVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChmYWN0b3JpZXMsIGRlY2xhcmF0aW9uKSB7XG4gICAgICAgIHZhciBjb21wb25lbnREZWYgPSBnZXRDb21wb25lbnREZWYoZGVjbGFyYXRpb24pO1xuICAgICAgICBjb21wb25lbnREZWYgJiYgZmFjdG9yaWVzLnB1c2gobmV3IENvbXBvbmVudEZhY3RvcnkkMShjb21wb25lbnREZWYpKTtcbiAgICAgICAgcmV0dXJuIGZhY3RvcmllcztcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIG5ldyBNb2R1bGVXaXRoQ29tcG9uZW50RmFjdG9yaWVzKG5nTW9kdWxlRmFjdG9yeSwgY29tcG9uZW50RmFjdG9yaWVzKTtcbn07XG52YXIgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QUkVfUjNfXztcbnZhciBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jX19QUkVfUjNfXyA9IF90aHJvd0Vycm9yO1xudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmNfX1BPU1RfUjNfXyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmNfX1BPU1RfUjNfXyhtb2R1bGVUeXBlKSk7XG59O1xudmFyIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jX19QUkVfUjNfXztcbi8qKlxuICogTG93LWxldmVsIHNlcnZpY2UgZm9yIHJ1bm5pbmcgdGhlIGFuZ3VsYXIgY29tcGlsZXIgZHVyaW5nIHJ1bnRpbWVcbiAqIHRvIGNyZWF0ZSB7QGxpbmsgQ29tcG9uZW50RmFjdG9yeX1zLCB3aGljaFxuICogY2FuIGxhdGVyIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCByZW5kZXIgYSBDb21wb25lbnQgaW5zdGFuY2UuXG4gKlxuICogRWFjaCBgQE5nTW9kdWxlYCBwcm92aWRlcyBhbiBvd24gYENvbXBpbGVyYCB0byBpdHMgaW5qZWN0b3IsXG4gKiB0aGF0IHdpbGwgdXNlIHRoZSBkaXJlY3RpdmVzL3BpcGVzIG9mIHRoZSBuZyBtb2R1bGUgZm9yIGNvbXBpbGF0aW9uXG4gKiBvZiBjb21wb25lbnRzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENvbXBpbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbXBpbGVyKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcGlsZXMgdGhlIGdpdmVuIE5nTW9kdWxlIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuIEFsbCB0ZW1wbGF0ZXMgb2YgdGhlIGNvbXBvbmVudHMgbGlzdGVkXG4gICAgICAgICAqIGluIGBlbnRyeUNvbXBvbmVudHNgIGhhdmUgdG8gYmUgaW5saW5lZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZVN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlU3luYztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiBOZ01vZHVsZSBhbmQgYWxsIG9mIGl0cyBjb21wb25lbnRzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbXBpbGVNb2R1bGVBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBc3luYztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhbWUgYXMge0BsaW5rICNjb21waWxlTW9kdWxlU3luY30gYnV0IGFsc28gY3JlYXRlcyBDb21wb25lbnRGYWN0b3JpZXMgZm9yIGFsbCBjb21wb25lbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmM7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTYW1lIGFzIHtAbGluayAjY29tcGlsZU1vZHVsZUFzeW5jfSBidXQgYWxzbyBjcmVhdGVzIENvbXBvbmVudEZhY3RvcmllcyBmb3IgYWxsIGNvbXBvbmVudHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGNhY2hlcy5cbiAgICAgKi9cbiAgICBDb21waWxlci5wcm90b3R5cGUuY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50L25nTW9kdWxlLlxuICAgICAqL1xuICAgIENvbXBpbGVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKHR5cGUpIHsgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpZCBmb3IgYSBnaXZlbiBOZ01vZHVsZSwgaWYgb25lIGlzIGRlZmluZWQgYW5kIGtub3duIHRvIHRoZSBjb21waWxlci5cbiAgICAgKi9cbiAgICBDb21waWxlci5wcm90b3R5cGUuZ2V0TW9kdWxlSWQgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkgeyByZXR1cm4gdW5kZWZpbmVkOyB9O1xuICAgIENvbXBpbGVyID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKVxuICAgIF0sIENvbXBpbGVyKTtcbiAgICByZXR1cm4gQ29tcGlsZXI7XG59KCkpO1xuLyoqXG4gKiBUb2tlbiB0byBwcm92aWRlIENvbXBpbGVyT3B0aW9ucyBpbiB0aGUgcGxhdGZvcm0gaW5qZWN0b3IuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ09NUElMRVJfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignY29tcGlsZXJPcHRpb25zJyk7XG4vKipcbiAqIEEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgYSBDb21waWxlclxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENvbXBpbGVyRmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlckZhY3RvcnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBDb21waWxlckZhY3Rvcnk7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgdHJhY2U7XG52YXIgZXZlbnRzO1xuZnVuY3Rpb24gZGV0ZWN0V1RGKCkge1xuICAgIHZhciB3dGYgPSBfZ2xvYmFsIC8qKiBUT0RPICM5MTAwICovWyd3dGYnXTtcbiAgICBpZiAod3RmKSB7XG4gICAgICAgIHRyYWNlID0gd3RmWyd0cmFjZSddO1xuICAgICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgICAgIGV2ZW50cyA9IHRyYWNlWydldmVudHMnXTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHNpZ25hdHVyZSwgZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3MgPT09IHZvaWQgMCkgeyBmbGFncyA9IG51bGw7IH1cbiAgICByZXR1cm4gZXZlbnRzLmNyZWF0ZVNjb3BlKHNpZ25hdHVyZSwgZmxhZ3MpO1xufVxuZnVuY3Rpb24gbGVhdmUoc2NvcGUsIHJldHVyblZhbHVlKSB7XG4gICAgdHJhY2UubGVhdmVTY29wZShzY29wZSwgcmV0dXJuVmFsdWUpO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cbmZ1bmN0aW9uIHN0YXJ0VGltZVJhbmdlKHJhbmdlVHlwZSwgYWN0aW9uKSB7XG4gICAgcmV0dXJuIHRyYWNlLmJlZ2luVGltZVJhbmdlKHJhbmdlVHlwZSwgYWN0aW9uKTtcbn1cbmZ1bmN0aW9uIGVuZFRpbWVSYW5nZShyYW5nZSkge1xuICAgIHRyYWNlLmVuZFRpbWVSYW5nZShyYW5nZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVHJ1ZSBpZiBXVEYgaXMgZW5hYmxlZC5cbiAqL1xudmFyIHd0ZkVuYWJsZWQgPSBkZXRlY3RXVEYoKTtcbmZ1bmN0aW9uIG5vb3BTY29wZShhcmcwLCBhcmcxKSB7XG4gICAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIENyZWF0ZSB0cmFjZSBzY29wZS5cbiAqXG4gKiBTY29wZXMgbXVzdCBiZSBzdHJpY3RseSBuZXN0ZWQgYW5kIGFyZSBhbmFsb2dvdXMgdG8gc3RhY2sgZnJhbWVzLCBidXRcbiAqIGRvIG5vdCBoYXZlIHRvIGZvbGxvdyB0aGUgc3RhY2sgZnJhbWVzLiBJbnN0ZWFkIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhleSBmb2xsb3cgbG9naWNhbFxuICogbmVzdGluZy4gWW91IG1heSB3YW50IHRvIHVzZVxuICogW0V2ZW50XG4gKiBTaWduYXR1cmVzXShodHRwOi8vZ29vZ2xlLmdpdGh1Yi5pby90cmFjaW5nLWZyYW1ld29yay9pbnN0cnVtZW50aW5nLWNvZGUuaHRtbCNjdXN0b20tZXZlbnRzKVxuICogYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBXVEYuXG4gKlxuICogVXNlZCB0byBtYXJrIHNjb3BlIGVudHJ5LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgdG8gbGVhdmUgdGhlIHNjb3BlLlxuICpcbiAqICAgICB2YXIgbXlTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdNeUNsYXNzI215TWV0aG9kKGFzY2lpIHNvbWVWYWwpJyk7XG4gKlxuICogICAgIHNvbWVNZXRob2QoKSB7XG4gKiAgICAgICAgdmFyIHMgPSBteVNjb3BlKCdGb28nKTsgLy8gJ0ZvbycgZ2V0cyBzdG9yZWQgaW4gdHJhY2luZyBVSVxuICogICAgICAgIC8vIERPIFNPTUUgV09SSyBIRVJFXG4gKiAgICAgICAgcmV0dXJuIHd0ZkxlYXZlKHMsIDEyMyk7IC8vIFJldHVybiB2YWx1ZSAxMjNcbiAqICAgICB9XG4gKlxuICogTm90ZSwgYWRkaW5nIHRyeS1maW5hbGx5IGJsb2NrIGFyb3VuZCB0aGUgd29yayB0byBlbnN1cmUgdGhhdCBgd3RmTGVhdmVgIGdldHMgY2FsbGVkIGNhblxuICogbmVnYXRpdmVseSBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiB3ZSByZWNvbW1lbmQgdGhhdFxuICogeW91IGRvbid0IGFkZCB0aGVtIHRvIGVuc3VyZSB0aGF0IGB3dGZMZWF2ZWAgZ2V0cyBjYWxsZWQuIEluIHByb2R1Y3Rpb24gYHd0ZkxlYXZlYCBpcyBhIG5vb3AgYW5kXG4gKiBzbyB0cnktZmluYWxseSBibG9jayBoYXMgbm8gdmFsdWUuIFdoZW4gZGVidWdnaW5nIHBlcmYgaXNzdWVzLCBza2lwcGluZyBgd3RmTGVhdmVgLCBkbyB0b1xuICogZXhjZXB0aW9uLCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHRyYWNlLCBidXQgcHJlc2VuY2Ugb2YgZXhjZXB0aW9uIHNpZ25pZmllcyBsb2dpYyBlcnJvciB3aGljaFxuICogbmVlZHMgdG8gYmUgZml4ZWQgYmVmb3JlIHRoZSBhcHAgc2hvdWxkIGJlIHByb2ZpbGVkLiBBZGQgdHJ5LWZpbmFsbHkgb25seSB3aGVuIHlvdSBleHBlY3QgdGhhdFxuICogYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGR1cmluZyBub3JtYWwgZXhlY3V0aW9uIHdoaWxlIHByb2ZpbGluZy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKiBAZGVwcmVjYXRlZCB0aGUgV2ViIFRyYWNpbmcgRnJhbWV3b3JrIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gQW5ndWxhclxuICovXG52YXIgd3RmQ3JlYXRlU2NvcGUgPSB3dGZFbmFibGVkID8gY3JlYXRlU2NvcGUgOiBmdW5jdGlvbiAoc2lnbmF0dXJlLCBmbGFncykgeyByZXR1cm4gbm9vcFNjb3BlOyB9O1xuLyoqXG4gKiBVc2VkIHRvIG1hcmsgZW5kIG9mIFNjb3BlLlxuICpcbiAqIC0gYHNjb3BlYCB0byBlbmQuXG4gKiAtIGByZXR1cm5WYWx1ZWAgKG9wdGlvbmFsKSB0byBiZSBwYXNzZWQgdG8gdGhlIFdURi5cbiAqXG4gKiBSZXR1cm5zIHRoZSBgcmV0dXJuVmFsdWUgZm9yIGVhc3kgY2hhaW5pbmcuXG4gKiBAcHVibGljQXBpXG4gKiBAZGVwcmVjYXRlZCB0aGUgV2ViIFRyYWNpbmcgRnJhbWV3b3JrIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gQW5ndWxhclxuICovXG52YXIgd3RmTGVhdmUgPSB3dGZFbmFibGVkID8gbGVhdmUgOiBmdW5jdGlvbiAocywgcikgeyByZXR1cm4gcjsgfTtcbi8qKlxuICogVXNlZCB0byBtYXJrIEFzeW5jIHN0YXJ0LiBBc3luYyBhcmUgc2ltaWxhciB0byBzY29wZSBidXQgdGhleSBkb24ndCBoYXZlIHRvIGJlIHN0cmljdGx5IG5lc3RlZC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCBpbiB0aGUgY2FsbCB0byBbZW5kQXN5bmNdLiBBc3luYyByYW5nZXMgb25seSB3b3JrIGlmIFdURiBoYXMgYmVlblxuICogZW5hYmxlZC5cbiAqXG4gKiAgICAgc29tZU1ldGhvZCgpIHtcbiAqICAgICAgICB2YXIgcyA9IHd0ZlN0YXJ0VGltZVJhbmdlKCdIVFRQOkdFVCcsICdzb21lLnVybCcpO1xuICogICAgICAgIHZhciBmdXR1cmUgPSBuZXcgRnV0dXJlLmRlbGF5KDUpLnRoZW4oKF8pIHtcbiAqICAgICAgICAgIHd0ZkVuZFRpbWVSYW5nZShzKTtcbiAqICAgICAgICB9KTtcbiAqICAgICB9XG4gKiBAcHVibGljQXBpXG4gKiBAZGVwcmVjYXRlZCB0aGUgV2ViIFRyYWNpbmcgRnJhbWV3b3JrIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gQW5ndWxhclxuICovXG52YXIgd3RmU3RhcnRUaW1lUmFuZ2UgPSB3dGZFbmFibGVkID8gc3RhcnRUaW1lUmFuZ2UgOiBmdW5jdGlvbiAocmFuZ2VUeXBlLCBhY3Rpb24pIHsgcmV0dXJuIG51bGw7IH07XG4vKipcbiAqIEVuZHMgYSBhc3luYyB0aW1lIHJhbmdlIG9wZXJhdGlvbi5cbiAqIFtyYW5nZV0gaXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFt3dGZTdGFydFRpbWVSYW5nZV0gQXN5bmMgcmFuZ2VzIG9ubHkgd29yayBpZiBXVEYgaGFzIGJlZW5cbiAqIGVuYWJsZWQuXG4gKiBAcHVibGljQXBpXG4gKiBAZGVwcmVjYXRlZCB0aGUgV2ViIFRyYWNpbmcgRnJhbWV3b3JrIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gQW5ndWxhclxuICovXG52YXIgd3RmRW5kVGltZVJhbmdlID0gd3RmRW5hYmxlZCA/IGVuZFRpbWVSYW5nZSA6IGZ1bmN0aW9uIChyKSB7IHJldHVybiBudWxsOyB9O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgcHJvbWlzZSA9IChmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7IH0pKCk7XG5mdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayhmbikge1xuICAgIGlmICh0eXBlb2YgWm9uZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gdXNlIHByb21pc2UgdG8gc2NoZWR1bGUgbWljcm9UYXNrIGluc3RlYWQgb2YgdXNlIFpvbmVcbiAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHsgZm4gJiYgZm4uYXBwbHkobnVsbCwgbnVsbCk7IH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgWm9uZS5jdXJyZW50LnNjaGVkdWxlTWljcm9UYXNrKCdzY2hlZHVsZU1pY3JvdGFzaycsIGZuKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIGZvciBleGVjdXRpbmcgd29yayBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLlxuICpcbiAqIFRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgdGhpcyBzZXJ2aWNlIGlzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIHdoZW4gc3RhcnRpbmcgYSB3b3JrIGNvbnNpc3Rpbmcgb2ZcbiAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5XG4gKiBBbmd1bGFyLiBTdWNoIHRhc2tzIGNhbiBiZSBraWNrZWQgb2ZmIHZpYSB7QGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrc1xuICogY2FuIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSB2aWEge0BsaW5rICNydW59LlxuICpcbiAqIDwhLS0gVE9ETzogYWRkL2ZpeCBsaW5rcyB0bzpcbiAqICAgLSBkb2NzIGV4cGxhaW5pbmcgem9uZXMgYW5kIHRoZSB1c2Ugb2Ygem9uZXMgaW4gQW5ndWxhciBhbmQgY2hhbmdlLWRldGVjdGlvblxuICogICAtIGxpbmsgdG8gcnVuT3V0c2lkZUFuZ3VsYXIvcnVuICh0aHJvdWdob3V0IHRoaXMgZmlsZSEpXG4gKiAgIC0tPlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnQsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQge05nSWZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbmctem9uZS1kZW1vJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aDI+RGVtbzogTmdab25lPC9oMj5cbiAqXG4gKiAgICAgPHA+UHJvZ3Jlc3M6IHt7cHJvZ3Jlc3N9fSU8L3A+XG4gKiAgICAgPHAgKm5nSWY9XCJwcm9ncmVzcyA+PSAxMDBcIj5Eb25lIHByb2Nlc3Npbmcge3tsYWJlbH19IG9mIEFuZ3VsYXIgem9uZSE8L3A+XG4gKlxuICogICAgIDxidXR0b24gKGNsaWNrKT1cInByb2Nlc3NXaXRoaW5Bbmd1bGFyWm9uZSgpXCI+UHJvY2VzcyB3aXRoaW4gQW5ndWxhciB6b25lPC9idXR0b24+XG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKClcIj5Qcm9jZXNzIG91dHNpZGUgb2YgQW5ndWxhciB6b25lPC9idXR0b24+XG4gKiAgIGAsXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE5nWm9uZURlbW8ge1xuICogICBwcm9ncmVzczogbnVtYmVyID0gMDtcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxuICpcbiAqICAgLy8gTG9vcCBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZVxuICogICAvLyBzbyB0aGUgVUkgRE9FUyByZWZyZXNoIGFmdGVyIGVhY2ggc2V0VGltZW91dCBjeWNsZVxuICogICBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7XG4gKiAgICAgdGhpcy5sYWJlbCA9ICdpbnNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTtcbiAqICAgfVxuICpcbiAqICAgLy8gTG9vcCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmVcbiAqICAgLy8gc28gdGhlIFVJIERPRVMgTk9UIHJlZnJlc2ggYWZ0ZXIgZWFjaCBzZXRUaW1lb3V0IGN5Y2xlXG4gKiAgIHByb2Nlc3NPdXRzaWRlT2ZBbmd1bGFyWm9uZSgpIHtcbiAqICAgICB0aGlzLmxhYmVsID0gJ291dHNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gKiAgICAgICB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHtcbiAqICAgICAgICAgLy8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkaXNwbGF5IGRvbmVcbiAqICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7IGNvbnNvbGUubG9nKCdPdXRzaWRlIERvbmUhJyk7IH0pO1xuICogICAgICAgfSk7XG4gKiAgICAgfSk7XG4gKiAgIH1cbiAqXG4gKiAgIF9pbmNyZWFzZVByb2dyZXNzKGRvbmVDYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICogICAgIHRoaXMucHJvZ3Jlc3MgKz0gMTtcbiAqICAgICBjb25zb2xlLmxvZyhgQ3VycmVudCBwcm9ncmVzczogJHt0aGlzLnByb2dyZXNzfSVgKTtcbiAqXG4gKiAgICAgaWYgKHRoaXMucHJvZ3Jlc3MgPCAxMDApIHtcbiAqICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrKSwgMTApO1xuICogICAgIH0gZWxzZSB7XG4gKiAgICAgICBkb25lQ2FsbGJhY2soKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nWm9uZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ1pvbmUoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX2EuZW5hYmxlTG9uZ1N0YWNrVHJhY2UsIGVuYWJsZUxvbmdTdGFja1RyYWNlID0gX2IgPT09IHZvaWQgMCA/IGZhbHNlIDogX2I7XG4gICAgICAgIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hldGhlciB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgbWljcm90YXNrcyBvciBtYWNyb3Rhc2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc1N0YWJsZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RpZmllcyB3aGVuIGNvZGUgZW50ZXJzIEFuZ3VsYXIgWm9uZS4gVGhpcyBnZXRzIGZpcmVkIGZpcnN0IG9uIFZNIFR1cm4uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uVW5zdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGlmaWVzIHdoZW4gdGhlcmUgaXMgbm8gbW9yZSBtaWNyb3Rhc2tzIGVucXVldWVkIGluIHRoZSBjdXJyZW50IFZNIFR1cm4uXG4gICAgICAgICAqIFRoaXMgaXMgYSBoaW50IGZvciBBbmd1bGFyIHRvIGRvIGNoYW5nZSBkZXRlY3Rpb24sIHdoaWNoIG1heSBlbnF1ZXVlIG1vcmUgbWljcm90YXNrcy5cbiAgICAgICAgICogRm9yIHRoaXMgcmVhc29uIHRoaXMgZXZlbnQgY2FuIGZpcmUgbXVsdGlwbGUgdGltZXMgcGVyIFZNIFR1cm4uXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uTWljcm90YXNrRW1wdHkgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGlmaWVzIHdoZW4gdGhlIGxhc3QgYG9uTWljcm90YXNrRW1wdHlgIGhhcyBydW4gYW5kIHRoZXJlIGFyZSBubyBtb3JlIG1pY3JvdGFza3MsIHdoaWNoXG4gICAgICAgICAqIGltcGxpZXMgd2UgYXJlIGFib3V0IHRvIHJlbGlucXVpc2ggVk0gdHVybi5cbiAgICAgICAgICogVGhpcyBldmVudCBnZXRzIGNhbGxlZCBqdXN0IG9uY2UuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uU3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RpZmllcyB0aGF0IGFuIGVycm9yIGhhcyBiZWVuIGRlbGl2ZXJlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgICAgICBpZiAodHlwZW9mIFpvbmUgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluIHRoaXMgY29uZmlndXJhdGlvbiBBbmd1bGFyIHJlcXVpcmVzIFpvbmUuanNcIik7XG4gICAgICAgIH1cbiAgICAgICAgWm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNlbGYuX25lc3RpbmcgPSAwO1xuICAgICAgICBzZWxmLl9vdXRlciA9IHNlbGYuX2lubmVyID0gWm9uZS5jdXJyZW50O1xuICAgICAgICBpZiAoWm9uZVsnd3RmWm9uZVNwZWMnXSkge1xuICAgICAgICAgICAgc2VsZi5faW5uZXIgPSBzZWxmLl9pbm5lci5mb3JrKFpvbmVbJ3d0ZlpvbmVTcGVjJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChab25lWydUYXNrVHJhY2tpbmdab25lU3BlYyddKSB7XG4gICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsobmV3IFpvbmVbJ1Rhc2tUcmFja2luZ1pvbmVTcGVjJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmFibGVMb25nU3RhY2tUcmFjZSAmJiBab25lWydsb25nU3RhY2tUcmFjZVpvbmVTcGVjJ10pIHtcbiAgICAgICAgICAgIHNlbGYuX2lubmVyID0gc2VsZi5faW5uZXIuZm9yayhab25lWydsb25nU3RhY2tUcmFjZVpvbmVTcGVjJ10pO1xuICAgICAgICB9XG4gICAgICAgIGZvcmtJbm5lclpvbmVXaXRoQW5ndWxhckJlaGF2aW9yKHNlbGYpO1xuICAgIH1cbiAgICBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gWm9uZS5jdXJyZW50LmdldCgnaXNBbmd1bGFyWm9uZScpID09PSB0cnVlOyB9O1xuICAgIE5nWm9uZS5hc3NlcnRJbkFuZ3VsYXJab25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIG5vdCBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyEnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhbmQgcmV0dXJucyB2YWx1ZSByZXR1cm5lZCBieVxuICAgICAqIHRoZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkXG4gICAgICogb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lICh0eXBpY2FsbHkgc3RhcnRlZCB2aWEge0BsaW5rICNydW5PdXRzaWRlQW5ndWxhcn0pLlxuICAgICAqXG4gICAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb21cbiAgICAgKiB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgKlxuICAgICAqIElmIGEgc3luY2hyb25vdXMgZXJyb3IgaGFwcGVucyBpdCB3aWxsIGJlIHJldGhyb3duIGFuZCBub3QgcmVwb3J0ZWQgdmlhIGBvbkVycm9yYC5cbiAgICAgKi9cbiAgICBOZ1pvbmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyLnJ1bihmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhcyBhIHRhc2sgYW5kIHJldHVybnMgdmFsdWVcbiAgICAgKiByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBSdW5uaW5nIGZ1bmN0aW9ucyB2aWEgYHJ1bmAgYWxsb3dzIHlvdSB0byByZWVudGVyIEFuZ3VsYXIgem9uZSBmcm9tIGEgdGFzayB0aGF0IHdhcyBleGVjdXRlZFxuICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9KS5cbiAgICAgKlxuICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tXG4gICAgICogd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAgICpcbiAgICAgKiBJZiBhIHN5bmNocm9ub3VzIGVycm9yIGhhcHBlbnMgaXQgd2lsbCBiZSByZXRocm93biBhbmQgbm90IHJlcG9ydGVkIHZpYSBgb25FcnJvcmAuXG4gICAgICovXG4gICAgTmdab25lLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncywgbmFtZSkge1xuICAgICAgICB2YXIgem9uZSA9IHRoaXMuX2lubmVyO1xuICAgICAgICB2YXIgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soJ05nWm9uZUV2ZW50OiAnICsgbmFtZSwgZm4sIEVNUFRZX1BBWUxPQUQsIG5vb3AkMSwgbm9vcCQxKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB6b25lLnJ1blRhc2sodGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIGBydW5gLCBleGNlcHQgdGhhdCBzeW5jaHJvbm91cyBlcnJvcnMgYXJlIGNhdWdodCBhbmQgZm9yd2FyZGVkIHZpYSBgb25FcnJvcmAgYW5kIG5vdFxuICAgICAqIHJldGhyb3duLlxuICAgICAqL1xuICAgIE5nWm9uZS5wcm90b3R5cGUucnVuR3VhcmRlZCA9IGZ1bmN0aW9uIChmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyLnJ1bkd1YXJkZWQoZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBgZm5gIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgaW4gQW5ndWxhcidzIHBhcmVudCB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5XG4gICAgICogdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIHtAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9IGFsbG93cyB5b3UgdG8gZXNjYXBlIEFuZ3VsYXIncyB6b25lIGFuZCBkb1xuICAgICAqIHdvcmsgdGhhdFxuICAgICAqIGRvZXNuJ3QgdHJpZ2dlciBBbmd1bGFyIGNoYW5nZS1kZXRlY3Rpb24gb3IgaXMgc3ViamVjdCB0byBBbmd1bGFyJ3MgZXJyb3IgaGFuZGxpbmcuXG4gICAgICpcbiAgICAgKiBBbnkgZnV0dXJlIHRhc2tzIG9yIG1pY3JvdGFza3Mgc2NoZWR1bGVkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24gd2lsbCBjb250aW51ZSBleGVjdXRpbmcgZnJvbVxuICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgKlxuICAgICAqIFVzZSB7QGxpbmsgI3J1bn0gdG8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkbyB3b3JrIHRoYXQgdXBkYXRlcyB0aGUgYXBwbGljYXRpb24gbW9kZWwuXG4gICAgICovXG4gICAgTmdab25lLnByb3RvdHlwZS5ydW5PdXRzaWRlQW5ndWxhciA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3V0ZXIucnVuKGZuKTtcbiAgICB9O1xuICAgIHJldHVybiBOZ1pvbmU7XG59KCkpO1xuZnVuY3Rpb24gbm9vcCQxKCkgeyB9XG52YXIgRU1QVFlfUEFZTE9BRCA9IHt9O1xuZnVuY3Rpb24gY2hlY2tTdGFibGUoem9uZSkge1xuICAgIGlmICh6b25lLl9uZXN0aW5nID09IDAgJiYgIXpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MgJiYgIXpvbmUuaXNTdGFibGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHpvbmUuX25lc3RpbmcrKztcbiAgICAgICAgICAgIHpvbmUub25NaWNyb3Rhc2tFbXB0eS5lbWl0KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgem9uZS5fbmVzdGluZy0tO1xuICAgICAgICAgICAgaWYgKCF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7IHJldHVybiB6b25lLm9uU3RhYmxlLmVtaXQobnVsbCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgem9uZS5pc1N0YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZm9ya0lubmVyWm9uZVdpdGhBbmd1bGFyQmVoYXZpb3Ioem9uZSkge1xuICAgIHpvbmUuX2lubmVyID0gem9uZS5faW5uZXIuZm9yayh7XG4gICAgICAgIG5hbWU6ICdhbmd1bGFyJyxcbiAgICAgICAgcHJvcGVydGllczogeyAnaXNBbmd1bGFyWm9uZSc6IHRydWUgfSxcbiAgICAgICAgb25JbnZva2VUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIGN1cnJlbnQsIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb25FbnRlcih6b25lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaW52b2tlVGFzayh0YXJnZXQsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uSW52b2tlOiBmdW5jdGlvbiAoZGVsZWdhdGUsIGN1cnJlbnQsIHRhcmdldCwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgb25FbnRlcih6b25lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaW52b2tlKHRhcmdldCwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgb25MZWF2ZSh6b25lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25IYXNUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIGN1cnJlbnQsIHRhcmdldCwgaGFzVGFza1N0YXRlKSB7XG4gICAgICAgICAgICBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGhhc1Rhc2sgZXZlbnRzIHdoaWNoIG9yaWdpbmF0ZSBmcm9tIG91ciB6b25lXG4gICAgICAgICAgICAgICAgLy8gKEEgY2hpbGQgaGFzVGFzayBldmVudCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMpXG4gICAgICAgICAgICAgICAgaWYgKGhhc1Rhc2tTdGF0ZS5jaGFuZ2UgPT0gJ21pY3JvVGFzaycpIHtcbiAgICAgICAgICAgICAgICAgICAgem9uZS5oYXNQZW5kaW5nTWljcm90YXNrcyA9IGhhc1Rhc2tTdGF0ZS5taWNyb1Rhc2s7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhYmxlKHpvbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNUYXNrU3RhdGUuY2hhbmdlID09ICdtYWNyb1Rhc2snKSB7XG4gICAgICAgICAgICAgICAgICAgIHpvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MgPSBoYXNUYXNrU3RhdGUubWFjcm9UYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25IYW5kbGVFcnJvcjogZnVuY3Rpb24gKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGVycm9yKSB7XG4gICAgICAgICAgICBkZWxlZ2F0ZS5oYW5kbGVFcnJvcih0YXJnZXQsIGVycm9yKTtcbiAgICAgICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gem9uZS5vbkVycm9yLmVtaXQoZXJyb3IpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gb25FbnRlcih6b25lKSB7XG4gICAgem9uZS5fbmVzdGluZysrO1xuICAgIGlmICh6b25lLmlzU3RhYmxlKSB7XG4gICAgICAgIHpvbmUuaXNTdGFibGUgPSBmYWxzZTtcbiAgICAgICAgem9uZS5vblVuc3RhYmxlLmVtaXQobnVsbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gb25MZWF2ZSh6b25lKSB7XG4gICAgem9uZS5fbmVzdGluZy0tO1xuICAgIGNoZWNrU3RhYmxlKHpvbmUpO1xufVxuLyoqXG4gKiBQcm92aWRlcyBhIG5vb3AgaW1wbGVtZW50YXRpb24gb2YgYE5nWm9uZWAgd2hpY2ggZG9lcyBub3RoaW5nLiBUaGlzIHpvbmUgcmVxdWlyZXMgZXhwbGljaXQgY2FsbHNcbiAqIHRvIGZyYW1ld29yayB0byBwZXJmb3JtIHJlbmRlcmluZy5cbiAqL1xudmFyIE5vb3BOZ1pvbmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcE5nWm9uZSgpIHtcbiAgICAgICAgdGhpcy5oYXNQZW5kaW5nTWljcm90YXNrcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc1BlbmRpbmdNYWNyb3Rhc2tzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNTdGFibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uVW5zdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMub25NaWNyb3Rhc2tFbXB0eSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5vblN0YWJsZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIH1cbiAgICBOb29wTmdab25lLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH07XG4gICAgTm9vcE5nWm9uZS5wcm90b3R5cGUucnVuR3VhcmRlZCA9IGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfTtcbiAgICBOb29wTmdab25lLnByb3RvdHlwZS5ydW5PdXRzaWRlQW5ndWxhciA9IGZ1bmN0aW9uIChmbikgeyByZXR1cm4gZm4oKTsgfTtcbiAgICBOb29wTmdab25lLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9O1xuICAgIHJldHVybiBOb29wTmdab25lO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb21cbiAqIHRoZSBicm93c2VyIGFuZCBieSBzZXJ2aWNlcyBzdWNoIGFzIFByb3RyYWN0b3IuIEVhY2ggYm9vdHN0cmFwcGVkIEFuZ3VsYXJcbiAqIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIHdpbGwgaGF2ZSBhbiBpbnN0YW5jZSBvZiBUZXN0YWJpbGl0eS5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFRlc3RhYmlsaXR5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRlc3RhYmlsaXR5KF9uZ1pvbmUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5faXNab25lU3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZXRoZXIgYW55IHdvcmsgd2FzIGRvbmUgc2luY2UgdGhlIGxhc3QgJ3doZW5TdGFibGUnIGNhbGxiYWNrLiBUaGlzIGlzXG4gICAgICAgICAqIHVzZWZ1bCB0byBkZXRlY3QgaWYgdGhpcyBjb3VsZCBoYXZlIHBvdGVudGlhbGx5IGRlc3RhYmlsaXplZCBhbm90aGVyXG4gICAgICAgICAqIGNvbXBvbmVudCB3aGlsZSBpdCBpcyBzdGFiaWxpemluZy5cbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9kaWRXb3JrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICB0aGlzLnRhc2tUcmFja2luZ1pvbmUgPSBudWxsO1xuICAgICAgICB0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoKTtcbiAgICAgICAgX25nWm9uZS5ydW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMudGFza1RyYWNraW5nWm9uZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIFpvbmUgPT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogWm9uZS5jdXJyZW50LmdldCgnVGFza1RyYWNraW5nWm9uZScpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLl93YXRjaEFuZ3VsYXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX25nWm9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2RpZFdvcmsgPSB0cnVlO1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc1pvbmVTdGFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpO1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5faXNab25lU3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEluY3JlYXNlcyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkIHBlbmRpbmcgcmVxdWVzdHMgYXJlIG5vdyB0cmFja2VkIHdpdGggem9uZXMuXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmluY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0NvdW50ICs9IDE7XG4gICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGVjcmVhc2VzIHRoZSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWQgcGVuZGluZyByZXF1ZXN0cyBhcmUgbm93IHRyYWNrZWQgd2l0aCB6b25lc1xuICAgICAqL1xuICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS5kZWNyZWFzZVBlbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCAtPSAxO1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0NvdW50IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwZW5kaW5nIGFzeW5jIHJlcXVlc3RzIGJlbG93IHplcm8nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGFuIGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaXMgc3RhYmxlXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmlzU3RhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNab25lU3RhYmxlICYmIHRoaXMuX3BlbmRpbmdDb3VudCA9PT0gMCAmJiAhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzO1xuICAgIH07XG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLl9ydW5DYWxsYmFja3NJZlJlYWR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5pc1N0YWJsZSgpKSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZXMgdGhlIGNhbGwgYmFja3MgaW4gYSBuZXcgZnJhbWUgc28gdGhhdCBpdCBpcyBhbHdheXMgYXN5bmMuXG4gICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKF90aGlzLl9jYWxsYmFja3MubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IF90aGlzLl9jYWxsYmFja3MucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYi50aW1lb3V0SWQpO1xuICAgICAgICAgICAgICAgICAgICBjYi5kb25lQ2IoX3RoaXMuX2RpZFdvcmspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfdGhpcy5fZGlkV29yayA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBub3Qgc3RhYmxlLCBzZW5kIHVwZGF0ZXMuXG4gICAgICAgICAgICB2YXIgcGVuZGluZ18xID0gdGhpcy5nZXRQZW5kaW5nVGFza3MoKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNiLnVwZGF0ZUNiICYmIGNiLnVwZGF0ZUNiKHBlbmRpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNiLnRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUZXN0YWJpbGl0eS5wcm90b3R5cGUuZ2V0UGVuZGluZ1Rhc2tzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFza1RyYWNraW5nWm9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvcHkgdGhlIHRhc2tzIGRhdGEgc28gdGhhdCB3ZSBkb24ndCBsZWFrIHRhc2tzLlxuICAgICAgICByZXR1cm4gdGhpcy50YXNrVHJhY2tpbmdab25lLm1hY3JvVGFza3MubWFwKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNvdXJjZTogdC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgLy8gRnJvbSBUYXNrVHJhY2tpbmdab25lOlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvYmxvYi9tYXN0ZXIvbGliL3pvbmUtc3BlYy90YXNrLXRyYWNraW5nLnRzI0w0MFxuICAgICAgICAgICAgICAgIGNyZWF0aW9uTG9jYXRpb246IHQuY3JlYXRpb25Mb2NhdGlvbixcbiAgICAgICAgICAgICAgICBkYXRhOiB0LmRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmFkZENhbGxiYWNrID0gZnVuY3Rpb24gKGNiLCB0aW1lb3V0LCB1cGRhdGVDYikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdGltZW91dElkID0gLTE7XG4gICAgICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fY2FsbGJhY2tzID0gX3RoaXMuX2NhbGxiYWNrcy5maWx0ZXIoZnVuY3Rpb24gKGNiKSB7IHJldHVybiBjYi50aW1lb3V0SWQgIT09IHRpbWVvdXRJZDsgfSk7XG4gICAgICAgICAgICAgICAgY2IoX3RoaXMuX2RpZFdvcmssIF90aGlzLmdldFBlbmRpbmdUYXNrcygpKTtcbiAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKHsgZG9uZUNiOiBjYiwgdGltZW91dElkOiB0aW1lb3V0SWQsIHVwZGF0ZUNiOiB1cGRhdGVDYiB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdhaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBzdGFibGUgd2l0aCBhIHRpbWVvdXQuIElmIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQgYmVmb3JlIHRoYXRcbiAgICAgKiBoYXBwZW5zLCB0aGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSBsaXN0IG9mIHRoZSBtYWNybyB0YXNrcyB0aGF0IHdlcmUgcGVuZGluZywgb3RoZXJ3aXNlIG51bGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZG9uZUNiIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiBBbmd1bGFyIGlzIHN0YWJsZSBvciB0aGUgdGltZW91dCBleHBpcmVzXG4gICAgICogICAgd2hpY2hldmVyIGNvbWVzIGZpcnN0LlxuICAgICAqIEBwYXJhbSB0aW1lb3V0IE9wdGlvbmFsLiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIEFuZ3VsYXIgdG8gYmVjb21lIHN0YWJsZS4gSWYgbm90XG4gICAgICogICAgc3BlY2lmaWVkLCB3aGVuU3RhYmxlKCkgd2lsbCB3YWl0IGZvcmV2ZXIuXG4gICAgICogQHBhcmFtIHVwZGF0ZUNiIE9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZXQgb2ZcbiAgICAgKiAgICBwZW5kaW5nIG1hY3JvdGFza3MgY2hhbmdlcy4gSWYgdGhpcyBjYWxsYmFjayByZXR1cm5zIHRydWUgZG9uZUNiIHdpbGwgbm90IGJlIGludm9rZWRcbiAgICAgKiAgICBhbmQgbm8gZnVydGhlciB1cGRhdGVzIHdpbGwgYmUgaXNzdWVkLlxuICAgICAqL1xuICAgIFRlc3RhYmlsaXR5LnByb3RvdHlwZS53aGVuU3RhYmxlID0gZnVuY3Rpb24gKGRvbmVDYiwgdGltZW91dCwgdXBkYXRlQ2IpIHtcbiAgICAgICAgaWYgKHVwZGF0ZUNiICYmICF0aGlzLnRhc2tUcmFja2luZ1pvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayB0cmFja2luZyB6b25lIGlzIHJlcXVpcmVkIHdoZW4gcGFzc2luZyBhbiB1cGRhdGUgY2FsbGJhY2sgdG8gJyArXG4gICAgICAgICAgICAgICAgJ3doZW5TdGFibGUoKS4gSXMgXCJ6b25lLmpzL2Rpc3QvdGFzay10cmFja2luZy5qc1wiIGxvYWRlZD8nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVzZSBhcmd1bWVudHMgYXJlICdGdW5jdGlvbicgYWJvdmUgdG8ga2VlcCB0aGUgcHVibGljIEFQSSBzaW1wbGUuXG4gICAgICAgIHRoaXMuYWRkQ2FsbGJhY2soZG9uZUNiLCB0aW1lb3V0LCB1cGRhdGVDYik7XG4gICAgICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHNcbiAgICAgKiBAZGVwcmVjYXRlZCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBub3cgdHJhY2tlZCB3aXRoIHpvbmVzXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHkucHJvdG90eXBlLmdldFBlbmRpbmdSZXF1ZXN0Q291bnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7IH07XG4gICAgLyoqXG4gICAgICogRmluZCBwcm92aWRlcnMgYnkgbmFtZVxuICAgICAqIEBwYXJhbSB1c2luZyBUaGUgcm9vdCBlbGVtZW50IHRvIHNlYXJjaCBmcm9tXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBuYW1lIG9mIGJpbmRpbmcgdmFyaWFibGVcbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBXaGV0aGVyIHVzaW5nIGV4YWN0TWF0Y2hcbiAgICAgKi9cbiAgICBUZXN0YWJpbGl0eS5wcm90b3R5cGUuZmluZFByb3ZpZGVycyA9IGZ1bmN0aW9uICh1c2luZywgcHJvdmlkZXIsIGV4YWN0TWF0Y2gpIHtcbiAgICAgICAgLy8gVE9ETyhqdWxpZW1yKTogaW1wbGVtZW50LlxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBUZXN0YWJpbGl0eSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTmdab25lXSlcbiAgICBdLCBUZXN0YWJpbGl0eSk7XG4gICAgcmV0dXJuIFRlc3RhYmlsaXR5O1xufSgpKTtcbi8qKlxuICogQSBnbG9iYWwgcmVnaXN0cnkgb2Yge0BsaW5rIFRlc3RhYmlsaXR5fSBpbnN0YW5jZXMgZm9yIHNwZWNpZmljIGVsZW1lbnRzLlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVGVzdGFiaWxpdHlSZWdpc3RyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXN0YWJpbGl0eVJlZ2lzdHJ5KCkge1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgX3Rlc3RhYmlsaXR5R2V0dGVyLmFkZFRvV2luZG93KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYW4gYXBwbGljYXRpb24gd2l0aCBhIHRlc3RhYmlsaXR5IGhvb2sgc28gdGhhdCBpdCBjYW4gYmUgdHJhY2tlZFxuICAgICAqIEBwYXJhbSB0b2tlbiB0b2tlbiBvZiBhcHBsaWNhdGlvbiwgcm9vdCBlbGVtZW50XG4gICAgICogQHBhcmFtIHRlc3RhYmlsaXR5IFRlc3RhYmlsaXR5IGhvb2tcbiAgICAgKi9cbiAgICBUZXN0YWJpbGl0eVJlZ2lzdHJ5LnByb3RvdHlwZS5yZWdpc3RlckFwcGxpY2F0aW9uID0gZnVuY3Rpb24gKHRva2VuLCB0ZXN0YWJpbGl0eSkge1xuICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbnMuc2V0KHRva2VuLCB0ZXN0YWJpbGl0eSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbiBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gdG9rZW4gdG9rZW4gb2YgYXBwbGljYXRpb24sIHJvb3QgZWxlbWVudFxuICAgICAqL1xuICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkucHJvdG90eXBlLnVucmVnaXN0ZXJBcHBsaWNhdGlvbiA9IGZ1bmN0aW9uICh0b2tlbikgeyB0aGlzLl9hcHBsaWNhdGlvbnMuZGVsZXRlKHRva2VuKTsgfTtcbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgYXBwbGljYXRpb25zXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUudW5yZWdpc3RlckFsbEFwcGxpY2F0aW9ucyA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fYXBwbGljYXRpb25zLmNsZWFyKCk7IH07XG4gICAgLyoqXG4gICAgICogR2V0IGEgdGVzdGFiaWxpdHkgaG9vayBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIGVsZW0gcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUuZ2V0VGVzdGFiaWxpdHkgPSBmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zLmdldChlbGVtKSB8fCBudWxsOyB9O1xuICAgIC8qKlxuICAgICAqIEdldCBhbGwgcmVnaXN0ZXJlZCB0ZXN0YWJpbGl0aWVzXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUuZ2V0QWxsVGVzdGFiaWxpdGllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLnZhbHVlcygpKTsgfTtcbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zKHJvb3QgZWxlbWVudHMpXG4gICAgICovXG4gICAgVGVzdGFiaWxpdHlSZWdpc3RyeS5wcm90b3R5cGUuZ2V0QWxsUm9vdEVsZW1lbnRzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9hcHBsaWNhdGlvbnMua2V5cygpKTsgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kIHRlc3RhYmlsaXR5IG9mIGEgbm9kZSBpbiB0aGUgVHJlZVxuICAgICAqIEBwYXJhbSBlbGVtIG5vZGVcbiAgICAgKiBAcGFyYW0gZmluZEluQW5jZXN0b3JzIHdoZXRoZXIgZmluZGluZyB0ZXN0YWJpbGl0eSBpbiBhbmNlc3RvcnMgaWYgdGVzdGFiaWxpdHkgd2FzIG5vdCBmb3VuZCBpblxuICAgICAqIGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkucHJvdG90eXBlLmZpbmRUZXN0YWJpbGl0eUluVHJlZSA9IGZ1bmN0aW9uIChlbGVtLCBmaW5kSW5BbmNlc3RvcnMpIHtcbiAgICAgICAgaWYgKGZpbmRJbkFuY2VzdG9ycyA9PT0gdm9pZCAwKSB7IGZpbmRJbkFuY2VzdG9ycyA9IHRydWU7IH1cbiAgICAgICAgcmV0dXJuIF90ZXN0YWJpbGl0eUdldHRlci5maW5kVGVzdGFiaWxpdHlJblRyZWUodGhpcywgZWxlbSwgZmluZEluQW5jZXN0b3JzKTtcbiAgICB9O1xuICAgIFRlc3RhYmlsaXR5UmVnaXN0cnkgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW10pXG4gICAgXSwgVGVzdGFiaWxpdHlSZWdpc3RyeSk7XG4gICAgcmV0dXJuIFRlc3RhYmlsaXR5UmVnaXN0cnk7XG59KCkpO1xudmFyIF9Ob29wR2V0VGVzdGFiaWxpdHkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX05vb3BHZXRUZXN0YWJpbGl0eSgpIHtcbiAgICB9XG4gICAgX05vb3BHZXRUZXN0YWJpbGl0eS5wcm90b3R5cGUuYWRkVG9XaW5kb3cgPSBmdW5jdGlvbiAocmVnaXN0cnkpIHsgfTtcbiAgICBfTm9vcEdldFRlc3RhYmlsaXR5LnByb3RvdHlwZS5maW5kVGVzdGFiaWxpdHlJblRyZWUgPSBmdW5jdGlvbiAocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBfTm9vcEdldFRlc3RhYmlsaXR5O1xufSgpKTtcbi8qKlxuICogU2V0IHRoZSB7QGxpbmsgR2V0VGVzdGFiaWxpdHl9IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEFuZ3VsYXIgdGVzdGluZyBmcmFtZXdvcmsuXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIHNldFRlc3RhYmlsaXR5R2V0dGVyKGdldHRlcikge1xuICAgIF90ZXN0YWJpbGl0eUdldHRlciA9IGdldHRlcjtcbn1cbnZhciBfdGVzdGFiaWxpdHlHZXR0ZXIgPSBuZXcgX05vb3BHZXRUZXN0YWJpbGl0eSgpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX3BsYXRmb3JtO1xudmFyIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnkgPSBjb21waWxlTmdNb2R1bGVGYWN0b3J5X19QUkVfUjNfXztcbmZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BSRV9SM19fKGluamVjdG9yLCBvcHRpb25zLCBtb2R1bGVUeXBlKSB7XG4gICAgdmFyIGNvbXBpbGVyRmFjdG9yeSA9IGluamVjdG9yLmdldChDb21waWxlckZhY3RvcnkpO1xuICAgIHZhciBjb21waWxlciA9IGNvbXBpbGVyRmFjdG9yeS5jcmVhdGVDb21waWxlcihbb3B0aW9uc10pO1xuICAgIHJldHVybiBjb21waWxlci5jb21waWxlTW9kdWxlQXN5bmMobW9kdWxlVHlwZSk7XG59XG5mdW5jdGlvbiBjb21waWxlTmdNb2R1bGVGYWN0b3J5X19QT1NUX1IzX18oaW5qZWN0b3IsIG9wdGlvbnMsIG1vZHVsZVR5cGUpIHtcbiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TmdNb2R1bGVUeXBlKG1vZHVsZVR5cGUpO1xuICAgIHZhciBtb2R1bGVGYWN0b3J5ID0gbmV3IE5nTW9kdWxlRmFjdG9yeSQxKG1vZHVsZVR5cGUpO1xuICAgIGlmIChpc0NvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlRW1wdHkoKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vZHVsZUZhY3RvcnkpO1xuICAgIH1cbiAgICB2YXIgY29tcGlsZXJPcHRpb25zID0gaW5qZWN0b3IuZ2V0KENPTVBJTEVSX09QVElPTlMsIFtdKS5jb25jYXQob3B0aW9ucyk7XG4gICAgdmFyIGNvbXBpbGVyUHJvdmlkZXJzID0gX21lcmdlQXJyYXlzKGNvbXBpbGVyT3B0aW9ucy5tYXAoZnVuY3Rpb24gKG8pIHsgcmV0dXJuIG8ucHJvdmlkZXJzOyB9KSk7XG4gICAgLy8gSW4gY2FzZSB0aGVyZSBhcmUgbm8gY29tcGlsZXIgcHJvdmlkZXJzLCB3ZSBqdXN0IHJldHVybiB0aGUgbW9kdWxlIGZhY3RvcnkgYXNcbiAgICAvLyB0aGVyZSB3b24ndCBiZSBhbnkgcmVzb3VyY2UgbG9hZGVyLiBUaGlzIGNhbiBoYXBwZW4gd2l0aCBJdnksIGJlY2F1c2UgQU9UIGNvbXBpbGVkXG4gICAgLy8gbW9kdWxlcyBjYW4gYmUgc3RpbGwgcGFzc2VkIHRocm91Z2ggXCJib290c3RyYXBNb2R1bGVcIi4gSW4gdGhhdCBjYXNlIHdlIHNob3VsZG4ndFxuICAgIC8vIHVubmVjZXNzYXJpbHkgcmVxdWlyZSB0aGUgSklUIGNvbXBpbGVyLlxuICAgIGlmIChjb21waWxlclByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtb2R1bGVGYWN0b3J5KTtcbiAgICB9XG4gICAgdmFyIGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTtcbiAgICB2YXIgY29tcGlsZXJJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7IHByb3ZpZGVyczogY29tcGlsZXJQcm92aWRlcnMgfSk7XG4gICAgdmFyIHJlc291cmNlTG9hZGVyID0gY29tcGlsZXJJbmplY3Rvci5nZXQoY29tcGlsZXIuUmVzb3VyY2VMb2FkZXIpO1xuICAgIC8vIFRoZSByZXNvdXJjZSBsb2FkZXIgY2FuIGFsc28gcmV0dXJuIGEgc3RyaW5nIHdoaWxlIHRoZSBcInJlc29sdmVDb21wb25lbnRSZXNvdXJjZXNcIlxuICAgIC8vIGFsd2F5cyBleHBlY3RzIGEgcHJvbWlzZS4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gd3JhcCB0aGUgcmV0dXJuZWQgdmFsdWUgaW4gYSBwcm9taXNlLlxuICAgIHJldHVybiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKGZ1bmN0aW9uICh1cmwpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNvdXJjZUxvYWRlci5nZXQodXJsKSk7IH0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZHVsZUZhY3Rvcnk7IH0pO1xufVxudmFyIGlzQm91bmRUb01vZHVsZSA9IGlzQm91bmRUb01vZHVsZV9fUFJFX1IzX187XG5mdW5jdGlvbiBpc0JvdW5kVG9Nb2R1bGVfX1BSRV9SM19fKGNmKSB7XG4gICAgcmV0dXJuIGNmIGluc3RhbmNlb2YgQ29tcG9uZW50RmFjdG9yeUJvdW5kVG9Nb2R1bGU7XG59XG5mdW5jdGlvbiBpc0JvdW5kVG9Nb2R1bGVfX1BPU1RfUjNfXyhjZikge1xuICAgIHJldHVybiBjZi5pc0JvdW5kVG9Nb2R1bGU7XG59XG52YXIgQUxMT1dfTVVMVElQTEVfUExBVEZPUk1TID0gbmV3IEluamVjdGlvblRva2VuKCdBbGxvd011bHRpcGxlVG9rZW4nKTtcbi8qKlxuICogQSB0b2tlbiBmb3IgdGhpcmQtcGFydHkgY29tcG9uZW50cyB0aGF0IGNhbiByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggTmdQcm9iZS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ1Byb2JlVG9rZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdQcm9iZVRva2VuKG5hbWUsIHRva2VuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIE5nUHJvYmVUb2tlbjtcbn0oKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBwbGF0Zm9ybS5cbiAqIFBsYXRmb3JtcyBoYXZlIHRvIGJlIGVhZ2VybHkgY3JlYXRlZCB2aWEgdGhpcyBmdW5jdGlvbi5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBsYXRmb3JtKGluamVjdG9yKSB7XG4gICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCAmJlxuICAgICAgICAhX3BsYXRmb3JtLmluamVjdG9yLmdldChBTExPV19NVUxUSVBMRV9QTEFURk9STVMsIGZhbHNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGNhbiBiZSBvbmx5IG9uZSBwbGF0Zm9ybS4gRGVzdHJveSB0aGUgcHJldmlvdXMgb25lIHRvIGNyZWF0ZSBhIG5ldyBvbmUuJyk7XG4gICAgfVxuICAgIF9wbGF0Zm9ybSA9IGluamVjdG9yLmdldChQbGF0Zm9ybVJlZik7XG4gICAgdmFyIGluaXRzID0gaW5qZWN0b3IuZ2V0KFBMQVRGT1JNX0lOSVRJQUxJWkVSLCBudWxsKTtcbiAgICBpZiAoaW5pdHMpXG4gICAgICAgIGluaXRzLmZvckVhY2goZnVuY3Rpb24gKGluaXQpIHsgcmV0dXJuIGluaXQoKTsgfSk7XG4gICAgcmV0dXJuIF9wbGF0Zm9ybTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZm9yIGEgcGxhdGZvcm1cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShwYXJlbnRQbGF0Zm9ybUZhY3RvcnksIG5hbWUsIHByb3ZpZGVycykge1xuICAgIGlmIChwcm92aWRlcnMgPT09IHZvaWQgMCkgeyBwcm92aWRlcnMgPSBbXTsgfVxuICAgIHZhciBkZXNjID0gXCJQbGF0Zm9ybTogXCIgKyBuYW1lO1xuICAgIHZhciBtYXJrZXIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oZGVzYyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChleHRyYVByb3ZpZGVycykge1xuICAgICAgICBpZiAoZXh0cmFQcm92aWRlcnMgPT09IHZvaWQgMCkgeyBleHRyYVByb3ZpZGVycyA9IFtdOyB9XG4gICAgICAgIHZhciBwbGF0Zm9ybSA9IGdldFBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghcGxhdGZvcm0gfHwgcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUywgZmFsc2UpKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50UGxhdGZvcm1GYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgcGFyZW50UGxhdGZvcm1GYWN0b3J5KHByb3ZpZGVycy5jb25jYXQoZXh0cmFQcm92aWRlcnMpLmNvbmNhdCh7IHByb3ZpZGU6IG1hcmtlciwgdXNlVmFsdWU6IHRydWUgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGluamVjdGVkUHJvdmlkZXJzID0gcHJvdmlkZXJzLmNvbmNhdChleHRyYVByb3ZpZGVycykuY29uY2F0KHsgcHJvdmlkZTogbWFya2VyLCB1c2VWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBjcmVhdGVQbGF0Zm9ybShJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IGluamVjdGVkUHJvdmlkZXJzLCBuYW1lOiBkZXNjIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXJ0UGxhdGZvcm0obWFya2VyKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVja3MgdGhhdCB0aGVyZSBjdXJyZW50bHkgaXMgYSBwbGF0Zm9ybSB3aGljaCBjb250YWlucyB0aGUgZ2l2ZW4gdG9rZW4gYXMgYSBwcm92aWRlci5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFBsYXRmb3JtKHJlcXVpcmVkVG9rZW4pIHtcbiAgICB2YXIgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpO1xuICAgIGlmICghcGxhdGZvcm0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwbGF0Zm9ybSBleGlzdHMhJyk7XG4gICAgfVxuICAgIGlmICghcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KHJlcXVpcmVkVG9rZW4sIG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQSBwbGF0Zm9ybSB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4gUGxlYXNlIGRlc3Ryb3kgaXQgZmlyc3QuJyk7XG4gICAgfVxuICAgIHJldHVybiBwbGF0Zm9ybTtcbn1cbi8qKlxuICogRGVzdHJveSB0aGUgZXhpc3RpbmcgcGxhdGZvcm0uXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBkZXN0cm95UGxhdGZvcm0oKSB7XG4gICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCkge1xuICAgICAgICBfcGxhdGZvcm0uZGVzdHJveSgpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldFBsYXRmb3JtKCkge1xuICAgIHJldHVybiBfcGxhdGZvcm0gJiYgIV9wbGF0Zm9ybS5kZXN0cm95ZWQgPyBfcGxhdGZvcm0gOiBudWxsO1xufVxuLyoqXG4gKiBUaGUgQW5ndWxhciBwbGF0Zm9ybSBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIEFuZ3VsYXIgb24gYSB3ZWIgcGFnZS4gRWFjaCBwYWdlXG4gKiBoYXMgZXhhY3RseSBvbmUgcGxhdGZvcm0sIGFuZCBzZXJ2aWNlcyAoc3VjaCBhcyByZWZsZWN0aW9uKSB3aGljaCBhcmUgY29tbW9uXG4gKiB0byBldmVyeSBBbmd1bGFyIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gdGhlIHBhZ2UgYXJlIGJvdW5kIGluIGl0cyBzY29wZS5cbiAqXG4gKiBBIHBhZ2UncyBwbGF0Zm9ybSBpcyBpbml0aWFsaXplZCBpbXBsaWNpdGx5IHdoZW4gYSBwbGF0Zm9ybSBpcyBjcmVhdGVkIHZpYSBhIHBsYXRmb3JtIGZhY3RvcnlcbiAqIChlLmcuIHtAbGluayBwbGF0Zm9ybUJyb3dzZXJ9KSwgb3IgZXhwbGljaXRseSBieSBjYWxsaW5nIHRoZSB7QGxpbmsgY3JlYXRlUGxhdGZvcm19IGZ1bmN0aW9uLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFBsYXRmb3JtUmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBmdW5jdGlvbiBQbGF0Zm9ybVJlZihfaW5qZWN0b3IpIHtcbiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7XG4gICAgICAgIHRoaXMuX21vZHVsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgQE5nTW9kdWxlYCBmb3IgdGhlIGdpdmVuIHBsYXRmb3JtXG4gICAgICogZm9yIG9mZmxpbmUgY29tcGlsYXRpb24uXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBTaW1wbGUgRXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIG15X21vZHVsZS50czpcbiAgICAgKlxuICAgICAqIEBOZ01vZHVsZSh7XG4gICAgICogICBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV1cbiAgICAgKiB9KVxuICAgICAqIGNsYXNzIE15TW9kdWxlIHt9XG4gICAgICpcbiAgICAgKiBtYWluLnRzOlxuICAgICAqIGltcG9ydCB7TXlNb2R1bGVOZ0ZhY3Rvcnl9IGZyb20gJy4vbXlfbW9kdWxlLm5nZmFjdG9yeSc7XG4gICAgICogaW1wb3J0IHtwbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuICAgICAqXG4gICAgICogbGV0IG1vZHVsZVJlZiA9IHBsYXRmb3JtQnJvd3NlcigpLmJvb3RzdHJhcE1vZHVsZUZhY3RvcnkoTXlNb2R1bGVOZ0ZhY3RvcnkpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIFBsYXRmb3JtUmVmLnByb3RvdHlwZS5ib290c3RyYXBNb2R1bGVGYWN0b3J5ID0gZnVuY3Rpb24gKG1vZHVsZUZhY3RvcnksIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBjcmVhdGUgdGhlIE5nWm9uZSBfYmVmb3JlXyB3ZSBpbnN0YW50aWF0ZSB0aGUgbW9kdWxlLFxuICAgICAgICAvLyBhcyBpbnN0YW50aWF0aW5nIHRoZSBtb2R1bGUgY3JlYXRlcyBzb21lIHByb3ZpZGVycyBlYWdlcmx5LlxuICAgICAgICAvLyBTbyB3ZSBjcmVhdGUgYSBtaW5pIHBhcmVudCBpbmplY3RvciB0aGF0IGp1c3QgY29udGFpbnMgdGhlIG5ldyBOZ1pvbmUgYW5kXG4gICAgICAgIC8vIHBhc3MgdGhhdCBhcyBwYXJlbnQgdG8gdGhlIE5nTW9kdWxlRmFjdG9yeS5cbiAgICAgICAgdmFyIG5nWm9uZU9wdGlvbiA9IG9wdGlvbnMgPyBvcHRpb25zLm5nWm9uZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG5nWm9uZSA9IGdldE5nWm9uZShuZ1pvbmVPcHRpb24pO1xuICAgICAgICB2YXIgcHJvdmlkZXJzID0gW3sgcHJvdmlkZTogTmdab25lLCB1c2VWYWx1ZTogbmdab25lIH1dO1xuICAgICAgICAvLyBBdHRlbnRpb246IERvbid0IHVzZSBBcHBsaWNhdGlvblJlZi5ydW4gaGVyZSxcbiAgICAgICAgLy8gYXMgd2Ugd2FudCB0byBiZSBzdXJlIHRoYXQgYWxsIHBvc3NpYmxlIGNvbnN0cnVjdG9yIGNhbGxzIGFyZSBpbnNpZGUgYG5nWm9uZS5ydW5gIVxuICAgICAgICByZXR1cm4gbmdab25lLnJ1bihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmdab25lSW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IHByb3ZpZGVycywgcGFyZW50OiBfdGhpcy5pbmplY3RvciwgbmFtZTogbW9kdWxlRmFjdG9yeS5tb2R1bGVUeXBlLm5hbWUgfSk7XG4gICAgICAgICAgICB2YXIgbW9kdWxlUmVmID0gbW9kdWxlRmFjdG9yeS5jcmVhdGUobmdab25lSW5qZWN0b3IpO1xuICAgICAgICAgICAgdmFyIGV4Y2VwdGlvbkhhbmRsZXIgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEVycm9ySGFuZGxlciwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoIWV4Y2VwdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIEVycm9ySGFuZGxlci4gSXMgcGxhdGZvcm0gbW9kdWxlIChCcm93c2VyTW9kdWxlKSBpbmNsdWRlZD8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZHVsZVJlZi5vbkRlc3Ryb3koZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVtb3ZlKF90aGlzLl9tb2R1bGVzLCBtb2R1bGVSZWYpOyB9KTtcbiAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7IHJldHVybiBuZ1pvbmUub25FcnJvci5zdWJzY3JpYmUoeyBuZXh0OiBmdW5jdGlvbiAoZXJyb3IpIHsgZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7IH0gfSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlciwgbmdab25lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluaXRTdGF0dXMgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEFwcGxpY2F0aW9uSW5pdFN0YXR1cyk7XG4gICAgICAgICAgICAgICAgaW5pdFN0YXR1cy5ydW5Jbml0aWFsaXplcnMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5pdFN0YXR1cy5kb25lUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX21vZHVsZURvQm9vdHN0cmFwKG1vZHVsZVJlZik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVSZWY7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGFuIGBATmdNb2R1bGVgIGZvciBhIGdpdmVuIHBsYXRmb3JtIHVzaW5nIHRoZSBnaXZlbiBydW50aW1lIGNvbXBpbGVyLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBATmdNb2R1bGUoe1xuICAgICAqICAgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGVdXG4gICAgICogfSlcbiAgICAgKiBjbGFzcyBNeU1vZHVsZSB7fVxuICAgICAqXG4gICAgICogbGV0IG1vZHVsZVJlZiA9IHBsYXRmb3JtQnJvd3NlcigpLmJvb3RzdHJhcE1vZHVsZShNeU1vZHVsZSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICBQbGF0Zm9ybVJlZi5wcm90b3R5cGUuYm9vdHN0cmFwTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGNvbXBpbGVyT3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoY29tcGlsZXJPcHRpb25zID09PSB2b2lkIDApIHsgY29tcGlsZXJPcHRpb25zID0gW107IH1cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBvcHRpb25zUmVkdWNlcih7fSwgY29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnkodGhpcy5pbmplY3Rvciwgb3B0aW9ucywgbW9kdWxlVHlwZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChtb2R1bGVGYWN0b3J5KSB7IHJldHVybiBfdGhpcy5ib290c3RyYXBNb2R1bGVGYWN0b3J5KG1vZHVsZUZhY3RvcnksIG9wdGlvbnMpOyB9KTtcbiAgICB9O1xuICAgIFBsYXRmb3JtUmVmLnByb3RvdHlwZS5fbW9kdWxlRG9Cb290c3RyYXAgPSBmdW5jdGlvbiAobW9kdWxlUmVmKSB7XG4gICAgICAgIHZhciBhcHBSZWYgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEFwcGxpY2F0aW9uUmVmKTtcbiAgICAgICAgaWYgKG1vZHVsZVJlZi5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBtb2R1bGVSZWYuX2Jvb3RzdHJhcENvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZikgeyByZXR1cm4gYXBwUmVmLmJvb3RzdHJhcChmKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXApIHtcbiAgICAgICAgICAgIG1vZHVsZVJlZi5pbnN0YW5jZS5uZ0RvQm9vdHN0cmFwKGFwcFJlZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbW9kdWxlIFwiICsgc3RyaW5naWZ5KG1vZHVsZVJlZi5pbnN0YW5jZS5jb25zdHJ1Y3RvcikgKyBcIiB3YXMgYm9vdHN0cmFwcGVkLCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSBcXFwiQE5nTW9kdWxlLmJvb3RzdHJhcFxcXCIgY29tcG9uZW50cyBub3IgYSBcXFwibmdEb0Jvb3RzdHJhcFxcXCIgbWV0aG9kLiBcIiArXG4gICAgICAgICAgICAgICAgXCJQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9kdWxlcy5wdXNoKG1vZHVsZVJlZik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVJlZi5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7IH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsYXRmb3JtUmVmLnByb3RvdHlwZSwgXCJpbmplY3RvclwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ge0BsaW5rIEluamVjdG9yfSwgd2hpY2ggaXMgdGhlIHBhcmVudCBpbmplY3RvciBmb3JcbiAgICAgICAgICogZXZlcnkgQW5ndWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSBhbmQgcHJvdmlkZXMgc2luZ2xldG9uIHByb3ZpZGVycy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gYW5kIGFsbCBBbmd1bGFyIGFwcGxpY2F0aW9ucyBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBQbGF0Zm9ybVJlZi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9kdWxlcy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKG1vZHVsZSkgeyByZXR1cm4gbW9kdWxlLmRlc3Ryb3koKTsgfSk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIGxpc3RlbmVyKCk7IH0pO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFBsYXRmb3JtUmVmLnByb3RvdHlwZSwgXCJkZXN0cm95ZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgUGxhdGZvcm1SZWYgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0luamVjdG9yXSlcbiAgICBdLCBQbGF0Zm9ybVJlZik7XG4gICAgcmV0dXJuIFBsYXRmb3JtUmVmO1xufSgpKTtcbmZ1bmN0aW9uIGdldE5nWm9uZShuZ1pvbmVPcHRpb24pIHtcbiAgICB2YXIgbmdab25lO1xuICAgIGlmIChuZ1pvbmVPcHRpb24gPT09ICdub29wJykge1xuICAgICAgICBuZ1pvbmUgPSBuZXcgTm9vcE5nWm9uZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmdab25lID0gKG5nWm9uZU9wdGlvbiA9PT0gJ3pvbmUuanMnID8gdW5kZWZpbmVkIDogbmdab25lT3B0aW9uKSB8fFxuICAgICAgICAgICAgbmV3IE5nWm9uZSh7IGVuYWJsZUxvbmdTdGFja1RyYWNlOiBpc0Rldk1vZGUoKSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5nWm9uZTtcbn1cbmZ1bmN0aW9uIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyLCBuZ1pvbmUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7IHJldHVybiBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7IH0pO1xuICAgICAgICAgICAgICAgIC8vIHJldGhyb3cgYXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIG1pZ2h0IG5vdCBkbyBpdFxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGUpOyB9KTtcbiAgICAgICAgLy8gcmV0aHJvdyBhcyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgbWlnaHQgbm90IGRvIGl0XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuZnVuY3Rpb24gb3B0aW9uc1JlZHVjZXIoZHN0LCBvYmpzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqcykpIHtcbiAgICAgICAgZHN0ID0gb2Jqcy5yZWR1Y2Uob3B0aW9uc1JlZHVjZXIsIGRzdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkc3QgPSBfX2Fzc2lnbih7fSwgZHN0LCBvYmpzKTtcbiAgICB9XG4gICAgcmV0dXJuIGRzdDtcbn1cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIGEgcGFnZS5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIHtAYSBpcy1zdGFibGUtZXhhbXBsZXN9XG4gKiAjIyMgaXNTdGFibGUgZXhhbXBsZXMgYW5kIGNhdmVhdHNcbiAqXG4gKiBOb3RlIHR3byBpbXBvcnRhbnQgcG9pbnRzIGFib3V0IGBpc1N0YWJsZWAsIGRlbW9uc3RyYXRlZCBpbiB0aGUgZXhhbXBsZXMgYmVsb3c6XG4gKiAtIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlIHN0YWJsZSBpZiB5b3Ugc3RhcnQgYW55IGtpbmRcbiAqIG9mIHJlY3VycmVudCBhc3luY2hyb25vdXMgdGFzayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydHNcbiAqIChmb3IgZXhhbXBsZSBmb3IgYSBwb2xsaW5nIHByb2Nlc3MsIHN0YXJ0ZWQgd2l0aCBhIGBzZXRJbnRlcnZhbGAsIGEgYHNldFRpbWVvdXRgXG4gKiBvciB1c2luZyBSeEpTIG9wZXJhdG9ycyBsaWtlIGBpbnRlcnZhbGApO1xuICogLSB0aGUgYGlzU3RhYmxlYCBPYnNlcnZhYmxlIHJ1bnMgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLlxuICpcbiAqIExldCdzIGltYWdpbmUgdGhhdCB5b3Ugc3RhcnQgYSByZWN1cnJlbnQgdGFza1xuICogKGhlcmUgaW5jcmVtZW50aW5nIGEgY291bnRlciwgdXNpbmcgUnhKUyBgaW50ZXJ2YWxgKSxcbiAqIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHN1YnNjcmliZSB0byBgaXNTdGFibGVgLlxuICpcbiAqIGBgYFxuICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikge1xuICogICBhcHBSZWYuaXNTdGFibGUucGlwZShcbiAqICAgICAgZmlsdGVyKHN0YWJsZSA9PiBzdGFibGUpXG4gKiAgICkuc3Vic2NyaWJlKCgpID0+IGNvbnNvbGUubG9nKCdBcHAgaXMgc3RhYmxlIG5vdycpO1xuICogICBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7XG4gKiB9XG4gKiBgYGBcbiAqIEluIHRoaXMgZXhhbXBsZSwgYGlzU3RhYmxlYCB3aWxsIG5ldmVyIGVtaXQgYHRydWVgLFxuICogYW5kIHRoZSB0cmFjZSBcIkFwcCBpcyBzdGFibGUgbm93XCIgd2lsbCBuZXZlciBnZXQgbG9nZ2VkLlxuICpcbiAqIElmIHlvdSB3YW50IHRvIGV4ZWN1dGUgc29tZXRoaW5nIHdoZW4gdGhlIGFwcCBpcyBzdGFibGUsXG4gKiB5b3UgaGF2ZSB0byB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RhYmxlXG4gKiBiZWZvcmUgc3RhcnRpbmcgeW91ciBwb2xsaW5nIHByb2Nlc3MuXG4gKlxuICogYGBgXG4gKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmKSB7XG4gKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKFxuICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLFxuICogICAgIHRhcChzdGFibGUgPT4gY29uc29sZS5sb2coJ0FwcCBpcyBzdGFibGUgbm93JykpLFxuICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSlcbiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7XG4gKiB9XG4gKiBgYGBcbiAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIHRyYWNlIFwiQXBwIGlzIHN0YWJsZSBub3dcIiB3aWxsIGJlIGxvZ2dlZFxuICogYW5kIHRoZW4gdGhlIGNvdW50ZXIgc3RhcnRzIGluY3JlbWVudGluZyBldmVyeSBzZWNvbmQuXG4gKlxuICogTm90ZSBhbHNvIHRoYXQgdGhpcyBPYnNlcnZhYmxlIHJ1bnMgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLFxuICogd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBpbiB0aGUgc3Vic2NyaXB0aW9uXG4gKiB0byB0aGlzIE9ic2VydmFibGUgd2lsbCBub3QgdHJpZ2dlciB0aGUgY2hhbmdlIGRldGVjdGlvbi5cbiAqXG4gKiBMZXQncyBpbWFnaW5lIHRoYXQgaW5zdGVhZCBvZiBsb2dnaW5nIHRoZSBjb3VudGVyIHZhbHVlLFxuICogeW91IHVwZGF0ZSBhIGZpZWxkIG9mIHlvdXIgY29tcG9uZW50XG4gKiBhbmQgZGlzcGxheSBpdCBpbiBpdHMgdGVtcGxhdGUuXG4gKlxuICogYGBgXG4gKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmKSB7XG4gKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKFxuICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLFxuICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSlcbiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiB0aGlzLnZhbHVlID0gY291bnRlcik7XG4gKiB9XG4gKiBgYGBcbiAqIEFzIHRoZSBgaXNTdGFibGVgIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIHRoZSB6b25lLFxuICogdGhlIGB2YWx1ZWAgZmllbGQgd2lsbCBiZSB1cGRhdGVkIHByb3Blcmx5LFxuICogYnV0IHRoZSB0ZW1wbGF0ZSB3aWxsIG5vdCBiZSByZWZyZXNoZWQhXG4gKlxuICogWW91J2xsIGhhdmUgdG8gbWFudWFsbHkgdHJpZ2dlciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgdGhlIHRlbXBsYXRlLlxuICpcbiAqIGBgYFxuICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKFxuICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLFxuICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSlcbiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiB7XG4gKiAgICAgdGhpcy52YWx1ZSA9IGNvdW50ZXI7XG4gKiAgICAgY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICogICB9KTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIE9yIG1ha2UgdGhlIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBydW4gaW5zaWRlIHRoZSB6b25lLlxuICpcbiAqIGBgYFxuICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgem9uZTogTmdab25lKSB7XG4gKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKFxuICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLFxuICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSlcbiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiB6b25lLnJ1bigoKSA9PiB0aGlzLnZhbHVlID0gY291bnRlcikpO1xuICogfVxuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQXBwbGljYXRpb25SZWYgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGZ1bmN0aW9uIEFwcGxpY2F0aW9uUmVmKF96b25lLCBfY29uc29sZSwgX2luamVjdG9yLCBfZXhjZXB0aW9uSGFuZGxlciwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX2luaXRTdGF0dXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fem9uZSA9IF96b25lO1xuICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7XG4gICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yO1xuICAgICAgICB0aGlzLl9leGNlcHRpb25IYW5kbGVyID0gX2V4Y2VwdGlvbkhhbmRsZXI7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX2luaXRTdGF0dXMgPSBfaW5pdFN0YXR1cztcbiAgICAgICAgdGhpcy5fYm9vdHN0cmFwTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuX3ZpZXdzID0gW107XG4gICAgICAgIHRoaXMuX3J1bm5pbmdUaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIGxpc3Qgb2YgY29tcG9uZW50IHR5cGVzIHJlZ2lzdGVyZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogVGhpcyBsaXN0IGlzIHBvcHVsYXRlZCBldmVuIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIGNyZWF0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCB0byB0aGlzIGFwcGxpY2F0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMgPSBpc0Rldk1vZGUoKTtcbiAgICAgICAgdGhpcy5fem9uZS5vbk1pY3JvdGFza0VtcHR5LnN1YnNjcmliZSh7IG5leHQ6IGZ1bmN0aW9uICgpIHsgX3RoaXMuX3pvbmUucnVuKGZ1bmN0aW9uICgpIHsgX3RoaXMudGljaygpOyB9KTsgfSB9KTtcbiAgICAgICAgdmFyIGlzQ3VycmVudGx5U3RhYmxlID0gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICBfdGhpcy5fc3RhYmxlID0gX3RoaXMuX3pvbmUuaXNTdGFibGUgJiYgIV90aGlzLl96b25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzICYmXG4gICAgICAgICAgICAgICAgIV90aGlzLl96b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzO1xuICAgICAgICAgICAgX3RoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoX3RoaXMuX3N0YWJsZSk7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGlzU3RhYmxlID0gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN1YnNjcmlwdGlvbiB0byBvblN0YWJsZSBvdXRzaWRlIHRoZSBBbmd1bGFyIFpvbmUgc28gdGhhdFxuICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIGlzIHJ1biBvdXRzaWRlIHRoZSBBbmd1bGFyIFpvbmUuXG4gICAgICAgICAgICB2YXIgc3RhYmxlU3ViO1xuICAgICAgICAgICAgX3RoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHN0YWJsZVN1YiA9IF90aGlzLl96b25lLm9uU3RhYmxlLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG5vIHBlbmRpbmcgbWFjcm8vbWljcm8gdGFza3MgaW4gdGhlIG5leHQgdGlja1xuICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBmb3IgTmdab25lIHRvIHVwZGF0ZSB0aGUgc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX3N0YWJsZSAmJiAhX3RoaXMuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhX3RoaXMuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc3RhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHVuc3RhYmxlU3ViID0gX3RoaXMuX3pvbmUub25VbnN0YWJsZS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE5nWm9uZS5hc3NlcnRJbkFuZ3VsYXJab25lKCk7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9zdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3N0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7IG9ic2VydmVyLm5leHQoZmFsc2UpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhYmxlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgdW5zdGFibGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzU3RhYmxlID1cbiAgICAgICAgICAgIG1lcmdlJDEoaXNDdXJyZW50bHlTdGFibGUsIGlzU3RhYmxlLnBpcGUoc2hhcmUoKSkpO1xuICAgIH1cbiAgICBBcHBsaWNhdGlvblJlZl8xID0gQXBwbGljYXRpb25SZWY7XG4gICAgLyoqXG4gICAgICogQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBCb290c3RyYXAgcHJvY2Vzc1xuICAgICAqXG4gICAgICogV2hlbiBib290c3RyYXBwaW5nIGEgbmV3IHJvb3QgY29tcG9uZW50IGludG8gYW4gYXBwbGljYXRpb24sIEFuZ3VsYXIgbW91bnRzIHRoZVxuICAgICAqIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBjb21wb25lbnQgb250byBET00gZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgY29tcG9uZW50VHlwZSdzXG4gICAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbGx5LCBhIGNvbXBvbmVudCBjYW4gYmUgbW91bnRlZCBvbnRvIGEgRE9NIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGVcbiAgICAgKiBjb21wb25lbnRUeXBlJ3Mgc2VsZWN0b3IuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqIHtAZXhhbXBsZSBjb3JlL3RzL3BsYXRmb3JtL3BsYXRmb3JtLnRzIHJlZ2lvbj0nbG9uZ2Zvcm0nfVxuICAgICAqL1xuICAgIEFwcGxpY2F0aW9uUmVmLnByb3RvdHlwZS5ib290c3RyYXAgPSBmdW5jdGlvbiAoY29tcG9uZW50T3JGYWN0b3J5LCByb290U2VsZWN0b3JPck5vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0U3RhdHVzLmRvbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJvb3RzdHJhcCBhcyB0aGVyZSBhcmUgc3RpbGwgYXN5bmNocm9ub3VzIGluaXRpYWxpemVycyBydW5uaW5nLiBCb290c3RyYXAgY29tcG9uZW50cyBpbiB0aGUgYG5nRG9Cb290c3RyYXBgIG1ldGhvZCBvZiB0aGUgcm9vdCBtb2R1bGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXBvbmVudEZhY3Rvcnk7XG4gICAgICAgIGlmIChjb21wb25lbnRPckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb25lbnRGYWN0b3J5KSB7XG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50T3JGYWN0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50RmFjdG9yeSA9XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudE9yRmFjdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlcy5wdXNoKGNvbXBvbmVudEZhY3RvcnkuY29tcG9uZW50VHlwZSk7XG4gICAgICAgIC8vIENyZWF0ZSBhIGZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG1vZHVsZSBpZiBpdCdzIG5vdCBib3VuZCB0byBzb21lIG90aGVyXG4gICAgICAgIHZhciBuZ01vZHVsZSA9IGlzQm91bmRUb01vZHVsZShjb21wb25lbnRGYWN0b3J5KSA/IG51bGwgOiB0aGlzLl9pbmplY3Rvci5nZXQoTmdNb2R1bGVSZWYpO1xuICAgICAgICB2YXIgc2VsZWN0b3JPck5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgfHwgY29tcG9uZW50RmFjdG9yeS5zZWxlY3RvcjtcbiAgICAgICAgdmFyIGNvbXBSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShJbmplY3Rvci5OVUxMLCBbXSwgc2VsZWN0b3JPck5vZGUsIG5nTW9kdWxlKTtcbiAgICAgICAgY29tcFJlZi5vbkRlc3Ryb3koZnVuY3Rpb24gKCkgeyBfdGhpcy5fdW5sb2FkQ29tcG9uZW50KGNvbXBSZWYpOyB9KTtcbiAgICAgICAgdmFyIHRlc3RhYmlsaXR5ID0gY29tcFJlZi5pbmplY3Rvci5nZXQoVGVzdGFiaWxpdHksIG51bGwpO1xuICAgICAgICBpZiAodGVzdGFiaWxpdHkpIHtcbiAgICAgICAgICAgIGNvbXBSZWYuaW5qZWN0b3IuZ2V0KFRlc3RhYmlsaXR5UmVnaXN0cnkpXG4gICAgICAgICAgICAgICAgLnJlZ2lzdGVyQXBwbGljYXRpb24oY29tcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCB0ZXN0YWJpbGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wUmVmKTtcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25zb2xlLmxvZyhcIkFuZ3VsYXIgaXMgcnVubmluZyBpbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSB0aGUgcHJvZHVjdGlvbiBtb2RlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcFJlZjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEludm9rZSB0aGlzIG1ldGhvZCB0byBleHBsaWNpdGx5IHByb2Nlc3MgY2hhbmdlIGRldGVjdGlvbiBhbmQgaXRzIHNpZGUtZWZmZWN0cy5cbiAgICAgKlxuICAgICAqIEluIGRldmVsb3BtZW50IG1vZGUsIGB0aWNrKClgIGFsc28gcGVyZm9ybXMgYSBzZWNvbmQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSB0byBlbnN1cmUgdGhhdCBub1xuICAgICAqIGZ1cnRoZXIgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuIElmIGFkZGl0aW9uYWwgY2hhbmdlcyBhcmUgcGlja2VkIHVwIGR1cmluZyB0aGlzIHNlY29uZCBjeWNsZSxcbiAgICAgKiBiaW5kaW5ncyBpbiB0aGUgYXBwIGhhdmUgc2lkZS1lZmZlY3RzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGluIGEgc2luZ2xlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgKiBwYXNzLlxuICAgICAqIEluIHRoaXMgY2FzZSwgQW5ndWxhciB0aHJvd3MgYW4gZXJyb3IsIHNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIG9ubHkgaGF2ZSBvbmUgY2hhbmdlXG4gICAgICogZGV0ZWN0aW9uIHBhc3MgZHVyaW5nIHdoaWNoIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIG11c3QgY29tcGxldGUuXG4gICAgICovXG4gICAgQXBwbGljYXRpb25SZWYucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwbGljYXRpb25SZWYudGljayBpcyBjYWxsZWQgcmVjdXJzaXZlbHknKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NvcGUgPSBBcHBsaWNhdGlvblJlZl8xLl90aWNrU2NvcGUoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3J1bm5pbmdUaWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyh0aGlzLl92aWV3cyksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfZCAmJiAhX2QuZG9uZSAmJiAoX2EgPSBfYy5yZXR1cm4pKSBfYS5jYWxsKF9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfZSA9IF9fdmFsdWVzKHRoaXMuX3ZpZXdzKSwgX2YgPSBfZS5uZXh0KCk7ICFfZi5kb25lOyBfZiA9IF9lLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY2hlY2tOb0NoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9mICYmICFfZi5kb25lICYmIChfYiA9IF9lLnJldHVybikpIF9iLmNhbGwoX2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgcmV0aHJvdyBhcyBpdCBjb3VsZCBjYW5jZWwgc3Vic2NyaXB0aW9ucyB0byBPYnNlcnZhYmxlcyFcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2V4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZ1RpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHd0ZkxlYXZlKHNjb3BlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgYSB2aWV3IHNvIHRoYXQgaXQgd2lsbCBiZSBkaXJ0eSBjaGVja2VkLlxuICAgICAqIFRoZSB2aWV3IHdpbGwgYmUgYXV0b21hdGljYWxseSBkZXRhY2hlZCB3aGVuIGl0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBUaGlzIHdpbGwgdGhyb3cgaWYgdGhlIHZpZXcgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhIFZpZXdDb250YWluZXIuXG4gICAgICovXG4gICAgQXBwbGljYXRpb25SZWYucHJvdG90eXBlLmF0dGFjaFZpZXcgPSBmdW5jdGlvbiAodmlld1JlZikge1xuICAgICAgICB2YXIgdmlldyA9IHZpZXdSZWY7XG4gICAgICAgIHRoaXMuX3ZpZXdzLnB1c2godmlldyk7XG4gICAgICAgIHZpZXcuYXR0YWNoVG9BcHBSZWYodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyBhIHZpZXcgZnJvbSBkaXJ0eSBjaGVja2luZyBhZ2Fpbi5cbiAgICAgKi9cbiAgICBBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUuZGV0YWNoVmlldyA9IGZ1bmN0aW9uICh2aWV3UmVmKSB7XG4gICAgICAgIHZhciB2aWV3ID0gdmlld1JlZjtcbiAgICAgICAgcmVtb3ZlKHRoaXMuX3ZpZXdzLCB2aWV3KTtcbiAgICAgICAgdmlldy5kZXRhY2hGcm9tQXBwUmVmKCk7XG4gICAgfTtcbiAgICBBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUuX2xvYWRDb21wb25lbnQgPSBmdW5jdGlvbiAoY29tcG9uZW50UmVmKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgICB0aGlzLnRpY2soKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50UmVmKTtcbiAgICAgICAgLy8gR2V0IHRoZSBsaXN0ZW5lcnMgbGF6aWx5IHRvIHByZXZlbnQgREkgY3ljbGVzLlxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5faW5qZWN0b3IuZ2V0KEFQUF9CT09UU1RSQVBfTElTVEVORVIsIFtdKS5jb25jYXQodGhpcy5fYm9vdHN0cmFwTGlzdGVuZXJzKTtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBsaXN0ZW5lcihjb21wb25lbnRSZWYpOyB9KTtcbiAgICB9O1xuICAgIEFwcGxpY2F0aW9uUmVmLnByb3RvdHlwZS5fdW5sb2FkQ29tcG9uZW50ID0gZnVuY3Rpb24gKGNvbXBvbmVudFJlZikge1xuICAgICAgICB0aGlzLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgcmVtb3ZlKHRoaXMuY29tcG9uZW50cywgY29tcG9uZW50UmVmKTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRPRE8oYWx4aHViKTogRGlzcG9zZSBvZiB0aGUgTmdab25lLlxuICAgICAgICB0aGlzLl92aWV3cy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKHZpZXcpIHsgcmV0dXJuIHZpZXcuZGVzdHJveSgpOyB9KTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBsaWNhdGlvblJlZi5wcm90b3R5cGUsIFwidmlld0NvdW50XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdHRhY2hlZCB2aWV3cy5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RoOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICB2YXIgQXBwbGljYXRpb25SZWZfMTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQXBwbGljYXRpb25SZWYuX3RpY2tTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBsaWNhdGlvblJlZiN0aWNrKCknKTtcbiAgICBBcHBsaWNhdGlvblJlZiA9IEFwcGxpY2F0aW9uUmVmXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW05nWm9uZSwgQ29uc29sZSwgSW5qZWN0b3IsXG4gICAgICAgICAgICBFcnJvckhhbmRsZXIsXG4gICAgICAgICAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICBBcHBsaWNhdGlvbkluaXRTdGF0dXNdKVxuICAgIF0sIEFwcGxpY2F0aW9uUmVmKTtcbiAgICByZXR1cm4gQXBwbGljYXRpb25SZWY7XG59KCkpO1xuZnVuY3Rpb24gcmVtb3ZlKGxpc3QsIGVsKSB7XG4gICAgdmFyIGluZGV4ID0gbGlzdC5pbmRleE9mKGVsKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxufVxuZnVuY3Rpb24gX21lcmdlQXJyYXlzKHBhcnRzKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHsgcmV0dXJuIHBhcnQgJiYgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBfX3NwcmVhZChwYXJ0KSk7IH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgU1dJVENIX0lWWV9FTkFCTEVEX19QT1NUX1IzX18gPSB0cnVlO1xudmFyIFNXSVRDSF9JVllfRU5BQkxFRF9fUFJFX1IzX18gPSBmYWxzZTtcbnZhciBpdnlFbmFibGVkID0gU1dJVENIX0lWWV9FTkFCTEVEX19QUkVfUjNfXztcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIF9TRVBBUkFUT1IgPSAnIyc7XG52YXIgRkFDVE9SWV9DTEFTU19TVUZGSVggPSAnTmdGYWN0b3J5Jztcbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgU3lzdGVtSnNOZ01vZHVsZUxvYWRlci5cbiAqIHRva2VuLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBkZXByZWNhdGVkIHRoZSBgc3RyaW5nYCBmb3JtIG9mIGBsb2FkQ2hpbGRyZW5gIGlzIGRlcHJlY2F0ZWQsIGFuZCBgU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZ2BcbiAqIGlzIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xudmFyIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZygpIHtcbiAgICB9XG4gICAgcmV0dXJuIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWc7XG59KCkpO1xudmFyIERFRkFVTFRfQ09ORklHID0ge1xuICAgIGZhY3RvcnlQYXRoUHJlZml4OiAnJyxcbiAgICBmYWN0b3J5UGF0aFN1ZmZpeDogJy5uZ2ZhY3RvcnknLFxufTtcbi8qKlxuICogTmdNb2R1bGVGYWN0b3J5TG9hZGVyIHRoYXQgdXNlcyBTeXN0ZW1KUyB0byBsb2FkIE5nTW9kdWxlRmFjdG9yeVxuICogQHB1YmxpY0FwaVxuICogQGRlcHJlY2F0ZWQgdGhlIGBzdHJpbmdgIGZvcm0gb2YgYGxvYWRDaGlsZHJlbmAgaXMgZGVwcmVjYXRlZCwgYW5kIGBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyYCBpc1xuICogcGFydCBvZiBpdHMgaW1wbGVtZW50YXRpb24uIFNlZSBgTG9hZENoaWxkcmVuYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG52YXIgU3lzdGVtSnNOZ01vZHVsZUxvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyKF9jb21waWxlciwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2NvbXBpbGVyID0gX2NvbXBpbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWcgfHwgREVGQVVMVF9DT05GSUc7XG4gICAgfVxuICAgIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICB2YXIgbGVnYWN5T2ZmbGluZU1vZGUgPSAhaXZ5RW5hYmxlZCAmJiB0aGlzLl9jb21waWxlciBpbnN0YW5jZW9mIENvbXBpbGVyO1xuICAgICAgICByZXR1cm4gbGVnYWN5T2ZmbGluZU1vZGUgPyB0aGlzLmxvYWRGYWN0b3J5KHBhdGgpIDogdGhpcy5sb2FkQW5kQ29tcGlsZShwYXRoKTtcbiAgICB9O1xuICAgIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIucHJvdG90eXBlLmxvYWRBbmRDb21waWxlID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gX19yZWFkKHBhdGguc3BsaXQoX1NFUEFSQVRPUiksIDIpLCBtb2R1bGUgPSBfYVswXSwgZXhwb3J0TmFtZSA9IF9hWzFdO1xuICAgICAgICBpZiAoZXhwb3J0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeXN0ZW0uaW1wb3J0KG1vZHVsZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChtb2R1bGUpIHsgcmV0dXJuIG1vZHVsZVtleHBvcnROYW1lXTsgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiBjaGVja05vdEVtcHR5KHR5cGUsIG1vZHVsZSwgZXhwb3J0TmFtZSk7IH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gX3RoaXMuX2NvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyh0eXBlKTsgfSk7XG4gICAgfTtcbiAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLnByb3RvdHlwZS5sb2FkRmFjdG9yeSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChwYXRoLnNwbGl0KF9TRVBBUkFUT1IpLCAyKSwgbW9kdWxlID0gX2FbMF0sIGV4cG9ydE5hbWUgPSBfYVsxXTtcbiAgICAgICAgdmFyIGZhY3RvcnlDbGFzc1N1ZmZpeCA9IEZBQ1RPUllfQ0xBU1NfU1VGRklYO1xuICAgICAgICBpZiAoZXhwb3J0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgZmFjdG9yeUNsYXNzU3VmZml4ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQodGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoUHJlZml4ICsgbW9kdWxlICsgdGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoU3VmZml4KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1vZHVsZSkgeyByZXR1cm4gbW9kdWxlW2V4cG9ydE5hbWUgKyBmYWN0b3J5Q2xhc3NTdWZmaXhdOyB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZhY3RvcnkpIHsgcmV0dXJuIGNoZWNrTm90RW1wdHkoZmFjdG9yeSwgbW9kdWxlLCBleHBvcnROYW1lKTsgfSk7XG4gICAgfTtcbiAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgX19wYXJhbSgxLCBPcHRpb25hbCgpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb21waWxlciwgU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZ10pXG4gICAgXSwgU3lzdGVtSnNOZ01vZHVsZUxvYWRlcik7XG4gICAgcmV0dXJuIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXI7XG59KCkpO1xuZnVuY3Rpb24gY2hlY2tOb3RFbXB0eSh2YWx1ZSwgbW9kdWxlUGF0aCwgZXhwb3J0TmFtZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgJ1wiICsgZXhwb3J0TmFtZSArIFwiJyBpbiAnXCIgKyBtb2R1bGVQYXRoICsgXCInXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBbmd1bGFyIFt2aWV3XShndWlkZS9nbG9zc2FyeSN2aWV3KSxcbiAqIHNwZWNpZmljYWxseSB0aGUgW2hvc3Qgdmlld10oZ3VpZGUvZ2xvc3Nhcnkjdmlldy10cmVlKSB0aGF0IGlzIGRlZmluZWQgYnkgYSBjb21wb25lbnQuXG4gKiBBbHNvIHNlcnZlcyBhcyB0aGUgYmFzZSBjbGFzc1xuICogdGhhdCBhZGRzIGRlc3Ryb3kgbWV0aG9kcyBmb3IgW2VtYmVkZGVkIHZpZXdzXShndWlkZS9nbG9zc2FyeSN2aWV3LXRyZWUpLlxuICpcbiAqIEBzZWUgYEVtYmVkZGVkVmlld1JlZmBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWaWV3UmVmJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFZpZXdSZWYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVmlld1JlZigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gVmlld1JlZjtcbn0oQ2hhbmdlRGV0ZWN0b3JSZWYpKTtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBBbmd1bGFyIFt2aWV3XShndWlkZS9nbG9zc2FyeSN2aWV3KSBpbiBhIHZpZXcgY29udGFpbmVyLlxuICogQW4gW2VtYmVkZGVkIHZpZXddKGd1aWRlL2dsb3NzYXJ5I3ZpZXctdHJlZSkgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSBhIGNvbXBvbmVudFxuICogb3RoZXIgdGhhbiB0aGUgaG9zdGluZyBjb21wb25lbnQgd2hvc2UgdGVtcGxhdGUgZGVmaW5lcyBpdCwgb3IgaXQgY2FuIGJlIGRlZmluZWRcbiAqIGluZGVwZW5kZW50bHkgYnkgYSBgVGVtcGxhdGVSZWZgLlxuICpcbiAqIFByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gYSB2aWV3IGNhbiBjaGFuZ2UsIGJ1dCB0aGUgc3RydWN0dXJlIChudW1iZXIgYW5kIG9yZGVyKSBvZiBlbGVtZW50cyBpblxuICogYSB2aWV3IGNhbm5vdC4gQ2hhbmdlIHRoZSBzdHJ1Y3R1cmUgb2YgZWxlbWVudHMgYnkgaW5zZXJ0aW5nLCBtb3ZpbmcsIG9yXG4gKiByZW1vdmluZyBuZXN0ZWQgdmlld3MgaW4gYSB2aWV3IGNvbnRhaW5lci5cbiAqXG4gKiBAc2VlIGBWaWV3Q29udGFpbmVyUmVmYFxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogVGhlIGZvbGxvd2luZyB0ZW1wbGF0ZSBicmVha3MgZG93biBpbnRvIHR3byBzZXBhcmF0ZSBgVGVtcGxhdGVSZWZgIGluc3RhbmNlcyxcbiAqIGFuIG91dGVyIG9uZSBhbmQgYW4gaW5uZXIgb25lLlxuICpcbiAqIGBgYFxuICogQ291bnQ6IHt7aXRlbXMubGVuZ3RofX1cbiAqIDx1bD5cbiAqICAgPGxpICpuZ0Zvcj1cImxldCAgaXRlbSBvZiBpdGVtc1wiPnt7aXRlbX19PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGlzIHRoZSBvdXRlciBgVGVtcGxhdGVSZWZgOlxuICpcbiAqIGBgYFxuICogQ291bnQ6IHt7aXRlbXMubGVuZ3RofX1cbiAqIDx1bD5cbiAqICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1pdGVtIFtuZ0Zvck9mXT1cIml0ZW1zXCI+PC9uZy10ZW1wbGF0ZT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGlzIHRoZSBpbm5lciBgVGVtcGxhdGVSZWZgOlxuICpcbiAqIGBgYFxuICogICA8bGk+e3tpdGVtfX08L2xpPlxuICogYGBgXG4gKlxuICogVGhlIG91dGVyIGFuZCBpbm5lciBgVGVtcGxhdGVSZWZgIGluc3RhbmNlcyBhcmUgYXNzZW1ibGVkIGludG8gdmlld3MgYXMgZm9sbG93czpcbiAqXG4gKiBgYGBcbiAqIDwhLS0gVmlld1JlZjogb3V0ZXItMCAtLT5cbiAqIENvdW50OiAyXG4gKiA8dWw+XG4gKiAgIDxuZy10ZW1wbGF0ZSB2aWV3LWNvbnRhaW5lci1yZWY+PC9uZy10ZW1wbGF0ZT5cbiAqICAgPCEtLSBWaWV3UmVmOiBpbm5lci0xIC0tPjxsaT5maXJzdDwvbGk+PCEtLSAvVmlld1JlZjogaW5uZXItMSAtLT5cbiAqICAgPCEtLSBWaWV3UmVmOiBpbm5lci0yIC0tPjxsaT5zZWNvbmQ8L2xpPjwhLS0gL1ZpZXdSZWY6IGlubmVyLTIgLS0+XG4gKiA8L3VsPlxuICogPCEtLSAvVmlld1JlZjogb3V0ZXItMCAtLT5cbiAqIGBgYFxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRW1iZWRkZWRWaWV3UmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbWJlZGRlZFZpZXdSZWYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW1iZWRkZWRWaWV3UmVmKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbWJlZGRlZFZpZXdSZWY7XG59KFZpZXdSZWYkMSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRGVidWdFdmVudExpc3RlbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlYnVnRXZlbnRMaXN0ZW5lcihuYW1lLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIHJldHVybiBEZWJ1Z0V2ZW50TGlzdGVuZXI7XG59KCkpO1xudmFyIERlYnVnTm9kZV9fUFJFX1IzX18gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVidWdOb2RlX19QUkVfUjNfXyhuYXRpdmVOb2RlLCBwYXJlbnQsIF9kZWJ1Z0NvbnRleHQpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9kZWJ1Z0NvbnRleHQgPSBfZGVidWdDb250ZXh0O1xuICAgICAgICB0aGlzLm5hdGl2ZU5vZGUgPSBuYXRpdmVOb2RlO1xuICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudF9fUFJFX1IzX18pIHtcbiAgICAgICAgICAgIHBhcmVudC5hZGRDaGlsZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdOb2RlX19QUkVfUjNfXy5wcm90b3R5cGUsIFwiaW5qZWN0b3JcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RlYnVnQ29udGV4dC5pbmplY3RvcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZV9fUFJFX1IzX18ucHJvdG90eXBlLCBcImNvbXBvbmVudEluc3RhbmNlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQuY29tcG9uZW50OyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdOb2RlX19QUkVfUjNfXy5wcm90b3R5cGUsIFwiY29udGV4dFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVidWdDb250ZXh0LmNvbnRleHQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGVfX1BSRV9SM19fLnByb3RvdHlwZSwgXCJyZWZlcmVuY2VzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQucmVmZXJlbmNlczsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZV9fUFJFX1IzX18ucHJvdG90eXBlLCBcInByb3ZpZGVyVG9rZW5zXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQucHJvdmlkZXJUb2tlbnM7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBEZWJ1Z05vZGVfX1BSRV9SM19fO1xufSgpKTtcbnZhciBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERlYnVnRWxlbWVudF9fUFJFX1IzX18obmF0aXZlTm9kZSwgcGFyZW50LCBfZGVidWdDb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG5hdGl2ZU5vZGUsIHBhcmVudCwgX2RlYnVnQ29udGV4dCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvcGVydGllcyA9IHt9O1xuICAgICAgICBfdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIF90aGlzLmNsYXNzZXMgPSB7fTtcbiAgICAgICAgX3RoaXMuc3R5bGVzID0ge307XG4gICAgICAgIF90aGlzLmNoaWxkTm9kZXMgPSBbXTtcbiAgICAgICAgX3RoaXMubmF0aXZlRWxlbWVudCA9IG5hdGl2ZU5vZGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRGVidWdFbGVtZW50X19QUkVfUjNfXy5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZCk7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICB2YXIgY2hpbGRJbmRleCA9IHRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKGNoaWxkKTtcbiAgICAgICAgaWYgKGNoaWxkSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnNwbGljZShjaGlsZEluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVidWdFbGVtZW50X19QUkVfUjNfXy5wcm90b3R5cGUuaW5zZXJ0Q2hpbGRyZW5BZnRlciA9IGZ1bmN0aW9uIChjaGlsZCwgbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgc2libGluZ0luZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGQpO1xuICAgICAgICBpZiAoc2libGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5jaGlsZE5vZGVzKS5zcGxpY2UuYXBwbHkoX2EsIF9fc3ByZWFkKFtzaWJsaW5nSW5kZXggKyAxLCAwXSwgbmV3Q2hpbGRyZW4pKTtcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5wYXJlbnQucmVtb3ZlQ2hpbGQoYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IF90aGlzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlYnVnRWxlbWVudF9fUFJFX1IzX18ucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChyZWZDaGlsZCwgbmV3Q2hpbGQpIHtcbiAgICAgICAgdmFyIHJlZkluZGV4ID0gdGhpcy5jaGlsZE5vZGVzLmluZGV4T2YocmVmQ2hpbGQpO1xuICAgICAgICBpZiAocmVmSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBuZXdDaGlsZC5wYXJlbnQucmVtb3ZlQ2hpbGQobmV3Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5zcGxpY2UocmVmSW5kZXgsIDAsIG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVidWdFbGVtZW50X19QUkVfUjNfXy5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5xdWVyeUFsbChwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICAgIH07XG4gICAgRGVidWdFbGVtZW50X19QUkVfUjNfXy5wcm90b3R5cGUucXVlcnlBbGwgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIF9xdWVyeUVsZW1lbnRDaGlsZHJlbih0aGlzLCBwcmVkaWNhdGUsIG1hdGNoZXMpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9O1xuICAgIERlYnVnRWxlbWVudF9fUFJFX1IzX18ucHJvdG90eXBlLnF1ZXJ5QWxsTm9kZXMgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlbih0aGlzLCBwcmVkaWNhdGUsIG1hdGNoZXMpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fLnByb3RvdHlwZSwgXCJjaGlsZHJlblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICAgICAgICAuY2hpbGROb2RlcyAvL1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fOyB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRGVidWdFbGVtZW50X19QUkVfUjNfXy5wcm90b3R5cGUudHJpZ2dlckV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50T2JqKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIubmFtZSA9PSBldmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsYmFjayhldmVudE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIERlYnVnRWxlbWVudF9fUFJFX1IzX187XG59KERlYnVnTm9kZV9fUFJFX1IzX18pKTtcbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBhc05hdGl2ZUVsZW1lbnRzKGRlYnVnRWxzKSB7XG4gICAgcmV0dXJuIGRlYnVnRWxzLm1hcChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLm5hdGl2ZUVsZW1lbnQ7IH0pO1xufVxuZnVuY3Rpb24gX3F1ZXJ5RWxlbWVudENoaWxkcmVuKGVsZW1lbnQsIHByZWRpY2F0ZSwgbWF0Y2hlcykge1xuICAgIGVsZW1lbnQuY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRGVidWdFbGVtZW50X19QUkVfUjNfXykge1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9xdWVyeUVsZW1lbnRDaGlsZHJlbihub2RlLCBwcmVkaWNhdGUsIG1hdGNoZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfcXVlcnlOb2RlQ2hpbGRyZW4ocGFyZW50Tm9kZSwgcHJlZGljYXRlLCBtYXRjaGVzKSB7XG4gICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fKSB7XG4gICAgICAgIHBhcmVudE5vZGUuY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fKSB7XG4gICAgICAgICAgICAgICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuKG5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbnZhciBEZWJ1Z05vZGVfX1BPU1RfUjNfXyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWJ1Z05vZGVfX1BPU1RfUjNfXyhuYXRpdmVOb2RlKSB7XG4gICAgICAgIHRoaXMubmF0aXZlTm9kZSA9IG5hdGl2ZU5vZGU7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGVfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwicGFyZW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5uYXRpdmVOb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50ID8gbmV3IERlYnVnRWxlbWVudF9fUE9TVF9SM19fKHBhcmVudCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdOb2RlX19QT1NUX1IzX18ucHJvdG90eXBlLCBcImluamVjdG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRJbmplY3Rvcih0aGlzLm5hdGl2ZU5vZGUpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdOb2RlX19QT1NUX1IzX18ucHJvdG90eXBlLCBcImNvbXBvbmVudEluc3RhbmNlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbmF0aXZlRWxlbWVudCA9IHRoaXMubmF0aXZlTm9kZTtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgKGdldENvbXBvbmVudChuYXRpdmVFbGVtZW50KSB8fCBnZXRWaWV3Q29tcG9uZW50KG5hdGl2ZUVsZW1lbnQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnTm9kZV9fUE9TVF9SM19fLnByb3RvdHlwZSwgXCJjb250ZXh0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRDb250ZXh0KHRoaXMubmF0aXZlTm9kZSk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGVfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwibGlzdGVuZXJzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TGlzdGVuZXJzKHRoaXMubmF0aXZlTm9kZSkuZmlsdGVyKGlzQnJvd3NlckV2ZW50cyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGVfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwicmVmZXJlbmNlc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZ2V0TG9jYWxSZWZzKHRoaXMubmF0aXZlTm9kZSk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z05vZGVfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwicHJvdmlkZXJUb2tlbnNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldEluamVjdGlvblRva2Vucyh0aGlzLm5hdGl2ZU5vZGUpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gRGVidWdOb2RlX19QT1NUX1IzX187XG59KCkpO1xudmFyIERlYnVnRWxlbWVudF9fUE9TVF9SM19fID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXyhuYXRpdmVOb2RlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREb21Ob2RlKG5hdGl2ZU5vZGUpO1xuICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG5hdGl2ZU5vZGUpIHx8IHRoaXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnRWxlbWVudF9fUE9TVF9SM19fLnByb3RvdHlwZSwgXCJuYXRpdmVFbGVtZW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVOb2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFID8gdGhpcy5uYXRpdmVOb2RlIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnRWxlbWVudF9fUE9TVF9SM19fLnByb3RvdHlwZSwgXCJuYW1lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQubm9kZU5hbWU7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwicHJvcGVydGllc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgR2V0cyBhIG1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBwcm9wZXJ0eSB2YWx1ZXMgZm9yIGFuIGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqICBUaGlzIG1hcCBpbmNsdWRlczpcbiAgICAgICAgICogIC0gUmVndWxhciBwcm9wZXJ0eSBiaW5kaW5ncyAoZS5nLiBgW2lkXT1cImlkXCJgKVxuICAgICAgICAgKiAgLSBIb3N0IHByb3BlcnR5IGJpbmRpbmdzIChlLmcuIGBob3N0OiB7ICdbaWRdJzogXCJpZFwiIH1gKVxuICAgICAgICAgKiAgLSBJbnRlcnBvbGF0ZWQgcHJvcGVydHkgYmluZGluZ3MgKGUuZy4gYGlkPVwie3sgdmFsdWUgfX1cIilcbiAgICAgICAgICpcbiAgICAgICAgICogIEl0IGRvZXMgbm90IGluY2x1ZGU6XG4gICAgICAgICAqICAtIGlucHV0IHByb3BlcnR5IGJpbmRpbmdzIChlLmcuIGBbbXlDdXN0b21JbnB1dF09XCJ2YWx1ZVwiYClcbiAgICAgICAgICogIC0gYXR0cmlidXRlIGJpbmRpbmdzIChlLmcuIGBbYXR0ci5yb2xlXT1cIm1lbnVcImApXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0KHRoaXMubmF0aXZlTm9kZSk7XG4gICAgICAgICAgICB2YXIgbFZpZXcgPSBjb250ZXh0LmxWaWV3O1xuICAgICAgICAgICAgdmFyIHREYXRhID0gbFZpZXdbVFZJRVddLmRhdGE7XG4gICAgICAgICAgICB2YXIgdE5vZGUgPSB0RGF0YVtjb250ZXh0Lm5vZGVJbmRleF07XG4gICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IGNvbGxlY3RQcm9wZXJ0eUJpbmRpbmdzKHROb2RlLCBsVmlldywgdERhdGEpO1xuICAgICAgICAgICAgdmFyIGhvc3RQcm9wZXJ0aWVzID0gY29sbGVjdEhvc3RQcm9wZXJ0eUJpbmRpbmdzKHROb2RlLCBsVmlldywgdERhdGEpO1xuICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNvbGxlY3RDbGFzc05hbWVzKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IF9fYXNzaWduKHt9LCBwcm9wZXJ0aWVzLCBob3N0UHJvcGVydGllcyk7XG4gICAgICAgICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0WydjbGFzc05hbWUnXSA9IG91dHB1dFsnY2xhc3NOYW1lJ10gPyBvdXRwdXRbJ2NsYXNzTmFtZSddICsgKFwiIFwiICsgY2xhc3NOYW1lKSA6IGNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwiYXR0cmlidXRlc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZUF0dHJzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gZUF0dHJzW2ldO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2F0dHIubmFtZV0gPSBhdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdFbGVtZW50X19QT1NUX1IzX18ucHJvdG90eXBlLCBcImNsYXNzZXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc2VzID0ge307XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGxDb250ZXh0ID0gbG9hZExDb250ZXh0RnJvbU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHRGcm9tTFZpZXcobENvbnRleHQubm9kZUluZGV4LCBsQ29udGV4dC5sVmlldyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxMCAvKiBTaW5nbGVTdHlsZXNTdGFydFBvc2l0aW9uICovOyBpIDwgc3R5bGluZ0NvbnRleHQubGVuZ3RoOyBpICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xhc3NCYXNlZFZhbHVlKHN0eWxpbmdDb250ZXh0LCBpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBnZXRQcm9wKHN0eWxpbmdDb250ZXh0LCBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShzdHlsaW5nQ29udGV4dCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBpZ25vcmUgYG51bGxgIHNpbmNlIHRob3NlIGRvbid0IG92ZXJ3cml0ZSB0aGUgdmFsdWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzW2NsYXNzTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrLCBqdXN0IHJlYWQgRE9NLlxuICAgICAgICAgICAgICAgICAgICB2YXIgZUNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlQ2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc1tlQ2xhc3Nlc1tpXV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwic3R5bGVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgc3R5bGVzID0ge307XG4gICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGxDb250ZXh0ID0gbG9hZExDb250ZXh0RnJvbU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdmFyIHN0eWxpbmdDb250ZXh0ID0gZ2V0U3R5bGluZ0NvbnRleHRGcm9tTFZpZXcobENvbnRleHQubm9kZUluZGV4LCBsQ29udGV4dC5sVmlldyk7XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxMCAvKiBTaW5nbGVTdHlsZXNTdGFydFBvc2l0aW9uICovOyBpIDwgc3R5bGluZ0NvbnRleHQubGVuZ3RoOyBpICs9IDQgLyogU2l6ZSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NsYXNzQmFzZWRWYWx1ZShzdHlsaW5nQ29udGV4dCwgaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGVOYW1lID0gZ2V0UHJvcChzdHlsaW5nQ29udGV4dCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZ2V0VmFsdWUoc3R5bGluZ0NvbnRleHQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIGlnbm9yZSBgbnVsbGAgc2luY2UgdGhvc2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc1tzdHlsZU5hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjaywganVzdCByZWFkIERPTS5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVTdHlsZXMgPSBlbGVtZW50LnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVTdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSBlU3R5bGVzLml0ZW0oaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNbbmFtZV8xXSA9IGVTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShuYW1lXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlcztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnRWxlbWVudF9fUE9TVF9SM19fLnByb3RvdHlwZSwgXCJjaGlsZE5vZGVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGROb2RlcyA9IHRoaXMubmF0aXZlTm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGNoaWxkTm9kZXNbaV07XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChnZXREZWJ1Z05vZGVfX1BPU1RfUjNfXyhlbGVtZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUsIFwiY2hpbGRyZW5cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuYXRpdmVFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFuYXRpdmVFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIHZhciBjaGlsZE5vZGVzID0gbmF0aXZlRWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZ2V0RGVidWdOb2RlX19QT1NUX1IzX18oZWxlbWVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gdGhpcy5xdWVyeUFsbChwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0c1swXSB8fCBudWxsO1xuICAgIH07XG4gICAgRGVidWdFbGVtZW50X19QT1NUX1IzX18ucHJvdG90eXBlLnF1ZXJ5QWxsID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICBfcXVlcnlBbGxSMyh0aGlzLCBwcmVkaWNhdGUsIG1hdGNoZXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9O1xuICAgIERlYnVnRWxlbWVudF9fUE9TVF9SM19fLnByb3RvdHlwZS5xdWVyeUFsbE5vZGVzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICBfcXVlcnlBbGxSMyh0aGlzLCBwcmVkaWNhdGUsIG1hdGNoZXMsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfTtcbiAgICBEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXy5wcm90b3R5cGUudHJpZ2dlckV2ZW50SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGV2ZW50T2JqKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXIubmFtZSA9PT0gZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soZXZlbnRPYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXztcbn0oRGVidWdOb2RlX19QT1NUX1IzX18pKTtcbi8qKlxuICogV2FsayB0aGUgVE5vZGUgdHJlZSB0byBmaW5kIG1hdGNoZXMgZm9yIHRoZSBwcmVkaWNhdGUuXG4gKlxuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgdGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgd2FsayBpcyBzdGFydGVkXG4gKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBwcmVkaWNhdGUgdG8gbWF0Y2hcbiAqIEBwYXJhbSBtYXRjaGVzIHRoZSBsaXN0IG9mIHBvc2l0aXZlIG1hdGNoZXNcbiAqIEBwYXJhbSBlbGVtZW50c09ubHkgd2hldGhlciBvbmx5IGVsZW1lbnRzIHNob3VsZCBiZSBzZWFyY2hlZFxuICovXG5mdW5jdGlvbiBfcXVlcnlBbGxSMyhwYXJlbnRFbGVtZW50LCBwcmVkaWNhdGUsIG1hdGNoZXMsIGVsZW1lbnRzT25seSkge1xuICAgIHZhciBjb250ZXh0ID0gbG9hZExDb250ZXh0KHBhcmVudEVsZW1lbnQubmF0aXZlTm9kZSk7XG4gICAgdmFyIHBhcmVudFROb2RlID0gY29udGV4dC5sVmlld1tUVklFV10uZGF0YVtjb250ZXh0Lm5vZGVJbmRleF07XG4gICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuUjMocGFyZW50VE5vZGUsIGNvbnRleHQubFZpZXcsIHByZWRpY2F0ZSwgbWF0Y2hlcywgZWxlbWVudHNPbmx5LCBwYXJlbnRFbGVtZW50Lm5hdGl2ZU5vZGUpO1xufVxuLyoqXG4gKiBSZWN1cnNpdmVseSBtYXRjaCB0aGUgY3VycmVudCBUTm9kZSBhZ2FpbnN0IHRoZSBwcmVkaWNhdGUsIGFuZCBnb2VzIG9uIHdpdGggdGhlIG5leHQgb25lcy5cbiAqXG4gKiBAcGFyYW0gdE5vZGUgdGhlIGN1cnJlbnQgVE5vZGVcbiAqIEBwYXJhbSBsVmlldyB0aGUgTFZpZXcgb2YgdGhpcyBUTm9kZVxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgcHJlZGljYXRlIHRvIG1hdGNoXG4gKiBAcGFyYW0gbWF0Y2hlcyB0aGUgbGlzdCBvZiBwb3NpdGl2ZSBtYXRjaGVzXG4gKiBAcGFyYW0gZWxlbWVudHNPbmx5IHdoZXRoZXIgb25seSBlbGVtZW50cyBzaG91bGQgYmUgc2VhcmNoZWRcbiAqIEBwYXJhbSByb290TmF0aXZlTm9kZSB0aGUgcm9vdCBuYXRpdmUgbm9kZSBvbiB3aGljaCBwcmVkaWNjYXRlIHNob3VvbGQgbm90IGJlIG1hdGNoZWRcbiAqL1xuZnVuY3Rpb24gX3F1ZXJ5Tm9kZUNoaWxkcmVuUjModE5vZGUsIGxWaWV3LCBwcmVkaWNhdGUsIG1hdGNoZXMsIGVsZW1lbnRzT25seSwgcm9vdE5hdGl2ZU5vZGUpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICAvLyBGb3IgZWFjaCB0eXBlIG9mIFROb2RlLCBzcGVjaWZpYyBsb2dpYyBpcyBleGVjdXRlZC5cbiAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovIHx8IHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykge1xuICAgICAgICAvLyBDYXNlIDE6IHRoZSBUTm9kZSBpcyBhbiBlbGVtZW50XG4gICAgICAgIC8vIFRoZSBuYXRpdmUgbm9kZSBoYXMgdG8gYmUgY2hlY2tlZC5cbiAgICAgICAgX2FkZFF1ZXJ5TWF0Y2hSMyhnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldyksIHByZWRpY2F0ZSwgbWF0Y2hlcywgZWxlbWVudHNPbmx5LCByb290TmF0aXZlTm9kZSk7XG4gICAgICAgIGlmIChpc0NvbXBvbmVudCh0Tm9kZSkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIHRoZSBob3N0IG9mIGEgY29tcG9uZW50LCB0aGVuIGFsbCBub2RlcyBpbiBpdHMgdmlldyBoYXZlIHRvIGJlIHByb2Nlc3NlZC5cbiAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBjb21wb25lbnQncyBjb250ZW50ICh0Tm9kZS5jaGlsZCkgd2lsbCBiZSBwcm9jZXNzZWQgZnJvbSB0aGUgaW5zZXJ0aW9uIHBvaW50cy5cbiAgICAgICAgICAgIHZhciBjb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRWaWV3ICYmIGNvbXBvbmVudFZpZXdbVFZJRVddLmZpcnN0Q2hpbGQpXG4gICAgICAgICAgICAgICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuUjMoY29tcG9uZW50Vmlld1tUVklFV10uZmlyc3RDaGlsZCwgY29tcG9uZW50VmlldywgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaXRzIGNoaWxkcmVuIGhhdmUgdG8gYmUgcHJvY2Vzc2VkLlxuICAgICAgICAgICAgaWYgKHROb2RlLmNoaWxkKVxuICAgICAgICAgICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlblIzKHROb2RlLmNoaWxkLCBsVmlldywgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbiBhbGwgY2FzZXMsIGlmIGEgZHluYW1pYyBjb250YWluZXIgZXhpc3RzIGZvciB0aGlzIG5vZGUsIGVhY2ggdmlldyBpbnNpZGUgaXQgaGFzIHRvIGJlXG4gICAgICAgIC8vIHByb2Nlc3NlZC5cbiAgICAgICAgdmFyIG5vZGVPckNvbnRhaW5lciA9IGxWaWV3W3ROb2RlLmluZGV4XTtcbiAgICAgICAgaWYgKGlzTENvbnRhaW5lcihub2RlT3JDb250YWluZXIpKSB7XG4gICAgICAgICAgICBfcXVlcnlOb2RlQ2hpbGRyZW5JbkNvbnRhaW5lclIzKG5vZGVPckNvbnRhaW5lciwgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykge1xuICAgICAgICAvLyBDYXNlIDI6IHRoZSBUTm9kZSBpcyBhIGNvbnRhaW5lclxuICAgICAgICAvLyBUaGUgbmF0aXZlIG5vZGUgaGFzIHRvIGJlIGNoZWNrZWQuXG4gICAgICAgIHZhciBsQ29udGFpbmVyID0gbFZpZXdbdE5vZGUuaW5kZXhdO1xuICAgICAgICBfYWRkUXVlcnlNYXRjaFIzKGxDb250YWluZXJbTkFUSVZFXSwgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgLy8gRWFjaCB2aWV3IGluc2lkZSB0aGUgY29udGFpbmVyIGhhcyB0byBiZSBwcm9jZXNzZWQuXG4gICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlbkluQ29udGFpbmVyUjMobENvbnRhaW5lciwgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodE5vZGUudHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7XG4gICAgICAgIC8vIENhc2UgMzogdGhlIFROb2RlIGlzIGEgcHJvamVjdGlvbiBpbnNlcnRpb24gcG9pbnQgKGkuZS4gYSA8bmctY29udGVudD4pLlxuICAgICAgICAvLyBUaGUgbm9kZXMgcHJvamVjdGVkIGF0IHRoaXMgbG9jYXRpb24gYWxsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkLlxuICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IGZpbmRDb21wb25lbnRWaWV3KGxWaWV3KTtcbiAgICAgICAgdmFyIGNvbXBvbmVudEhvc3QgPSBjb21wb25lbnRWaWV3W1RfSE9TVF07XG4gICAgICAgIHZhciBoZWFkID0gY29tcG9uZW50SG9zdC5wcm9qZWN0aW9uW3ROb2RlLnByb2plY3Rpb25dO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBoZWFkXzEgPSBfX3ZhbHVlcyhoZWFkKSwgaGVhZF8xXzEgPSBoZWFkXzEubmV4dCgpOyAhaGVhZF8xXzEuZG9uZTsgaGVhZF8xXzEgPSBoZWFkXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVOb2RlID0gaGVhZF8xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIF9hZGRRdWVyeU1hdGNoUjMobmF0aXZlTm9kZSwgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRfMV8xICYmICFoZWFkXzFfMS5kb25lICYmIChfYSA9IGhlYWRfMS5yZXR1cm4pKSBfYS5jYWxsKGhlYWRfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZWFkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRMVmlldyA9IGNvbXBvbmVudFZpZXdbUEFSRU5UXTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dFROb2RlXzEgPSBuZXh0TFZpZXdbVFZJRVddLmRhdGFbaGVhZC5pbmRleF07XG4gICAgICAgICAgICAgICAgX3F1ZXJ5Tm9kZUNoaWxkcmVuUjMobmV4dFROb2RlXzEsIG5leHRMVmlldywgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gQ2FzZSA0OiB0aGUgVE5vZGUgaXMgYSB2aWV3LlxuICAgICAgICBpZiAodE5vZGUuY2hpbGQpIHtcbiAgICAgICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlblIzKHROb2RlLmNoaWxkLCBsVmlldywgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUbyBkZXRlcm1pbmUgdGhlIG5leHQgbm9kZSB0byBiZSBwcm9jZXNzZWQsIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXh0IG9yIHRoZSBwcm9qZWN0aW9uTmV4dCBsaW5rLFxuICAgIC8vIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IG5vZGUgaGFzIGJlZW4gcHJvamVjdGVkLlxuICAgIHZhciBuZXh0VE5vZGUgPSAodE5vZGUuZmxhZ3MgJiAyIC8qIGlzUHJvamVjdGVkICovKSA/IHROb2RlLnByb2plY3Rpb25OZXh0IDogdE5vZGUubmV4dDtcbiAgICBpZiAobmV4dFROb2RlKSB7XG4gICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlblIzKG5leHRUTm9kZSwgbFZpZXcsIHByZWRpY2F0ZSwgbWF0Y2hlcywgZWxlbWVudHNPbmx5LCByb290TmF0aXZlTm9kZSk7XG4gICAgfVxufVxuLyoqXG4gKiBQcm9jZXNzIGFsbCBUTm9kZXMgaW4gYSBnaXZlbiBjb250YWluZXIuXG4gKlxuICogQHBhcmFtIGxDb250YWluZXIgdGhlIGNvbnRhaW5lciB0byBiZSBwcm9jZXNzZWRcbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHByZWRpY2F0ZSB0byBtYXRjaFxuICogQHBhcmFtIG1hdGNoZXMgdGhlIGxpc3Qgb2YgcG9zaXRpdmUgbWF0Y2hlc1xuICogQHBhcmFtIGVsZW1lbnRzT25seSB3aGV0aGVyIG9ubHkgZWxlbWVudHMgc2hvdWxkIGJlIHNlYXJjaGVkXG4gKiBAcGFyYW0gcm9vdE5hdGl2ZU5vZGUgdGhlIHJvb3QgbmF0aXZlIG5vZGUgb24gd2hpY2ggcHJlZGljY2F0ZSBzaG91b2xkIG5vdCBiZSBtYXRjaGVkXG4gKi9cbmZ1bmN0aW9uIF9xdWVyeU5vZGVDaGlsZHJlbkluQ29udGFpbmVyUjMobENvbnRhaW5lciwgcHJlZGljYXRlLCBtYXRjaGVzLCBlbGVtZW50c09ubHksIHJvb3ROYXRpdmVOb2RlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsQ29udGFpbmVyW1ZJRVdTXS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGRWaWV3ID0gbENvbnRhaW5lcltWSUVXU11baV07XG4gICAgICAgIF9xdWVyeU5vZGVDaGlsZHJlblIzKGNoaWxkVmlld1tUVklFV10ubm9kZSwgY2hpbGRWaWV3LCBwcmVkaWNhdGUsIG1hdGNoZXMsIGVsZW1lbnRzT25seSwgcm9vdE5hdGl2ZU5vZGUpO1xuICAgIH1cbn1cbi8qKlxuICogTWF0Y2ggdGhlIGN1cnJlbnQgbmF0aXZlIG5vZGUgYWdhaW5zdCB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBwYXJhbSBuYXRpdmVOb2RlIHRoZSBjdXJyZW50IG5hdGl2ZSBub2RlXG4gKiBAcGFyYW0gcHJlZGljYXRlIHRoZSBwcmVkaWNhdGUgdG8gbWF0Y2hcbiAqIEBwYXJhbSBtYXRjaGVzIHRoZSBsaXN0IG9mIHBvc2l0aXZlIG1hdGNoZXNcbiAqIEBwYXJhbSBlbGVtZW50c09ubHkgd2hldGhlciBvbmx5IGVsZW1lbnRzIHNob3VsZCBiZSBzZWFyY2hlZFxuICogQHBhcmFtIHJvb3ROYXRpdmVOb2RlIHRoZSByb290IG5hdGl2ZSBub2RlIG9uIHdoaWNoIHByZWRpY2NhdGUgc2hvdW9sZCBub3QgYmUgbWF0Y2hlZFxuICovXG5mdW5jdGlvbiBfYWRkUXVlcnlNYXRjaFIzKG5hdGl2ZU5vZGUsIHByZWRpY2F0ZSwgbWF0Y2hlcywgZWxlbWVudHNPbmx5LCByb290TmF0aXZlTm9kZSkge1xuICAgIGlmIChyb290TmF0aXZlTm9kZSAhPT0gbmF0aXZlTm9kZSkge1xuICAgICAgICB2YXIgZGVidWdOb2RlID0gZ2V0RGVidWdOb2RlKG5hdGl2ZU5vZGUpO1xuICAgICAgICBpZiAoZGVidWdOb2RlICYmIChlbGVtZW50c09ubHkgPyBkZWJ1Z05vZGUgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BPU1RfUjNfXyA6IHRydWUpICYmXG4gICAgICAgICAgICBwcmVkaWNhdGUoZGVidWdOb2RlKSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGRlYnVnTm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIHByb3BlcnR5IGJpbmRpbmdzIGZvciBhIGdpdmVuIG5vZGUgYW5kIGdlbmVyYXRlc1xuICogYSBtYXAgb2YgcHJvcGVydHkgbmFtZXMgdG8gdmFsdWVzLiBUaGlzIG1hcCBvbmx5IGNvbnRhaW5zIHByb3BlcnR5IGJpbmRpbmdzXG4gKiBkZWZpbmVkIGluIHRlbXBsYXRlcywgbm90IGluIGhvc3QgYmluZGluZ3MuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RQcm9wZXJ0eUJpbmRpbmdzKHROb2RlLCBsVmlldywgdERhdGEpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHt9O1xuICAgIHZhciBiaW5kaW5nSW5kZXggPSBnZXRGaXJzdEJpbmRpbmdJbmRleCh0Tm9kZS5wcm9wZXJ0eU1ldGFkYXRhU3RhcnRJbmRleCwgdERhdGEpO1xuICAgIHdoaWxlIChiaW5kaW5nSW5kZXggPCB0Tm9kZS5wcm9wZXJ0eU1ldGFkYXRhRW5kSW5kZXgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgICB2YXIgcHJvcE1ldGFkYXRhID0gdERhdGFbYmluZGluZ0luZGV4XTtcbiAgICAgICAgd2hpbGUgKCFpc1Byb3BNZXRhZGF0YVN0cmluZyhwcm9wTWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB2YWx1ZSBmb3IgYW4gaW50ZXJwb2xhdGlvbi4gV2UgbmVlZCB0byBidWlsZCB1cFxuICAgICAgICAgICAgLy8gdGhlIGZ1bGwgaW50ZXJwb2xhdGlvbiBieSBjb21iaW5pbmcgcnVudGltZSB2YWx1ZXMgaW4gTFZpZXcgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIHN0YXRpYyBpbnRlcnN0aXRpYWwgdmFsdWVzIHN0b3JlZCBpbiBURGF0YS5cbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKSArIHJlbmRlclN0cmluZ2lmeShsVmlld1tiaW5kaW5nSW5kZXhdKSArIHREYXRhW2JpbmRpbmdJbmRleF07XG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEgPSB0RGF0YVsrK2JpbmRpbmdJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbFZpZXdbYmluZGluZ0luZGV4XSA6IHZhbHVlICs9IGxWaWV3W2JpbmRpbmdJbmRleF07XG4gICAgICAgIC8vIFByb3BlcnR5IG1ldGFkYXRhIHN0cmluZyBoYXMgMyBwYXJ0czogcHJvcGVydHkgbmFtZSwgcHJlZml4LCBhbmQgc3VmZml4XG4gICAgICAgIHZhciBtZXRhZGF0YVBhcnRzID0gcHJvcE1ldGFkYXRhLnNwbGl0KElOVEVSUE9MQVRJT05fREVMSU1JVEVSKTtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG1ldGFkYXRhUGFydHNbMF07XG4gICAgICAgIC8vIEF0dHIgYmluZGluZ3MgZG9uJ3QgaGF2ZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc2hvdWxkIGJlIHNraXBwZWRcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgLy8gV3JhcCB2YWx1ZSB3aXRoIHByZWZpeCBhbmQgc3VmZml4ICh3aWxsIGJlICcnIGZvciBub3JtYWwgYmluZGluZ3MpLCBpZiB0aGV5J3JlIGRlZmluZWQuXG4gICAgICAgICAgICAvLyBBdm9pZCB3cmFwcGluZyBmb3Igbm9ybWFsIGJpbmRpbmdzIHNvIHRoYXQgdGhlIHZhbHVlIGRvZXNuJ3QgZ2V0IGNhc3QgdG8gYSBzdHJpbmcuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSAobWV0YWRhdGFQYXJ0c1sxXSAmJiBtZXRhZGF0YVBhcnRzWzJdKSA/XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFQYXJ0c1sxXSArIHZhbHVlICsgbWV0YWRhdGFQYXJ0c1syXSA6XG4gICAgICAgICAgICAgICAgdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYmluZGluZ0luZGV4Kys7XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IGJpbmRpbmcgaW5kZXggdGhhdCBob2xkcyB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHlcbiAqIGJpbmRpbmcuXG4gKlxuICogRm9yIG5vcm1hbCBiaW5kaW5ncyAoZS5nLiBgW2lkXT1cImlkXCJgKSwgdGhlIGJpbmRpbmcgaW5kZXggaXMgdGhlXG4gKiBzYW1lIGFzIHRoZSBtZXRhZGF0YSBpbmRleC4gRm9yIGludGVycG9sYXRpb25zIChlLmcuIGBpZD1cInt7aWR9fS17e25hbWV9fVwiYCksXG4gKiB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgYmluZGluZyB2YWx1ZXMsIHNvIHdlIG1pZ2h0IGhhdmUgdG8gbG9vcCBiYWNrd2FyZHNcbiAqIGZyb20gdGhlIG1ldGFkYXRhIGluZGV4IHVudGlsIHdlIGZpbmQgdGhlIGZpcnN0IG9uZS5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGFJbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHByb3BlcnR5IG1ldGFkYXRhIHN0cmluZyBmb3JcbiAqIHRoaXMgbm9kZS5cbiAqIEBwYXJhbSB0RGF0YSBUaGUgZGF0YSBhcnJheSBmb3IgdGhlIGN1cnJlbnQgVFZpZXdcbiAqIEByZXR1cm5zIFRoZSBmaXJzdCBiaW5kaW5nIGluZGV4IGZvciB0aGlzIGJpbmRpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0Rmlyc3RCaW5kaW5nSW5kZXgobWV0YWRhdGFJbmRleCwgdERhdGEpIHtcbiAgICB2YXIgY3VycmVudEJpbmRpbmdJbmRleCA9IG1ldGFkYXRhSW5kZXggLSAxO1xuICAgIC8vIElmIHRoZSBzbG90IGJlZm9yZSB0aGUgbWV0YWRhdGEgaG9sZHMgYSBzdHJpbmcsIHdlIGtub3cgdGhhdCB0aGlzXG4gICAgLy8gbWV0YWRhdGEgYXBwbGllcyB0byBhbiBpbnRlcnBvbGF0aW9uIHdpdGggYXQgbGVhc3QgMiBiaW5kaW5ncywgYW5kXG4gICAgLy8gd2UgbmVlZCB0byBzZWFyY2ggZnVydGhlciB0byBhY2Nlc3MgdGhlIGZpcnN0IGJpbmRpbmcgdmFsdWUuXG4gICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHREYXRhW2N1cnJlbnRCaW5kaW5nSW5kZXhdO1xuICAgIC8vIFdlIG5lZWQgdG8gaXRlcmF0ZSB1bnRpbCB3ZSBoaXQgZWl0aGVyIGE6XG4gICAgLy8gLSBUTm9kZSAoaXQgaXMgYW4gZWxlbWVudCBzbG90IG1hcmtpbmcgdGhlIGVuZCBvZiBgY29uc3RzYCBzZWN0aW9uKSwgT1IgYVxuICAgIC8vIC0gbWV0YWRhdGEgc3RyaW5nIChzbG90IGlzIGF0dHJpYnV0ZSBtZXRhZGF0YSBvciBhIHByZXZpb3VzIG5vZGUncyBwcm9wZXJ0eSBtZXRhZGF0YSlcbiAgICB3aGlsZSAodHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzUHJvcE1ldGFkYXRhU3RyaW5nKGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY3VycmVudFZhbHVlID0gdERhdGFbLS1jdXJyZW50QmluZGluZ0luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRCaW5kaW5nSW5kZXggKyAxO1xufVxuZnVuY3Rpb24gY29sbGVjdEhvc3RQcm9wZXJ0eUJpbmRpbmdzKHROb2RlLCBsVmlldywgdERhdGEpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHt9O1xuICAgIC8vIEhvc3QgYmluZGluZyB2YWx1ZXMgZm9yIGEgbm9kZSBhcmUgc3RvcmVkIGFmdGVyIGRpcmVjdGl2ZXMgb24gdGhhdCBub2RlXG4gICAgdmFyIGhvc3RQcm9wSW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7XG4gICAgdmFyIHByb3BNZXRhZGF0YSA9IHREYXRhW2hvc3RQcm9wSW5kZXhdO1xuICAgIC8vIFdoZW4gd2UgcmVhY2ggYSB2YWx1ZSBpbiBUVmlldy5kYXRhIHRoYXQgaXMgbm90IGEgc3RyaW5nLCB3ZSBrbm93IHdlJ3ZlXG4gICAgLy8gaGl0IHRoZSBuZXh0IG5vZGUncyBwcm92aWRlcnMgYW5kIGRpcmVjdGl2ZXMgYW5kIHNob3VsZCBzdG9wIGNvcHlpbmcgZGF0YS5cbiAgICB3aGlsZSAodHlwZW9mIHByb3BNZXRhZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BNZXRhZGF0YS5zcGxpdChJTlRFUlBPTEFUSU9OX0RFTElNSVRFUilbMF07XG4gICAgICAgIHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IGxWaWV3W2hvc3RQcm9wSW5kZXhdO1xuICAgICAgICBwcm9wTWV0YWRhdGEgPSB0RGF0YVsrK2hvc3RQcm9wSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydGllcztcbn1cbmZ1bmN0aW9uIGNvbGxlY3RDbGFzc05hbWVzKGRlYnVnRWxlbWVudCkge1xuICAgIHZhciBlXzIsIF9hO1xuICAgIHZhciBjbGFzc2VzID0gZGVidWdFbGVtZW50LmNsYXNzZXM7XG4gICAgdmFyIG91dHB1dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXMoY2xhc3NlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gX2MudmFsdWU7XG4gICAgICAgICAgICBpZiAoY2xhc3Nlc1tjbGFzc05hbWVdKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0ID8gb3V0cHV0ICsgKFwiIFwiICsgY2xhc3NOYW1lKSA6IGNsYXNzTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cbi8vIE5lZWQgdG8ga2VlcCB0aGUgbm9kZXMgaW4gYSBnbG9iYWwgTWFwIHNvIHRoYXQgbXVsdGlwbGUgYW5ndWxhciBhcHBzIGFyZSBzdXBwb3J0ZWQuXG52YXIgX25hdGl2ZU5vZGVUb0RlYnVnTm9kZSA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldERlYnVnTm9kZV9fUFJFX1IzX18obmF0aXZlTm9kZSkge1xuICAgIHJldHVybiBfbmF0aXZlTm9kZVRvRGVidWdOb2RlLmdldChuYXRpdmVOb2RlKSB8fCBudWxsO1xufVxuZnVuY3Rpb24gZ2V0RGVidWdOb2RlX19QT1NUX1IzX18obmF0aXZlTm9kZSkge1xuICAgIGlmIChuYXRpdmVOb2RlIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlTm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSA/XG4gICAgICAgICAgICBuZXcgRGVidWdFbGVtZW50X19QT1NUX1IzX18obmF0aXZlTm9kZSkgOlxuICAgICAgICAgICAgbmV3IERlYnVnTm9kZV9fUE9TVF9SM19fKG5hdGl2ZU5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgZ2V0RGVidWdOb2RlID0gZ2V0RGVidWdOb2RlX19QUkVfUjNfXztcbmZ1bmN0aW9uIGluZGV4RGVidWdOb2RlKG5vZGUpIHtcbiAgICBfbmF0aXZlTm9kZVRvRGVidWdOb2RlLnNldChub2RlLm5hdGl2ZU5vZGUsIG5vZGUpO1xufVxuZnVuY3Rpb24gcmVtb3ZlRGVidWdOb2RlRnJvbUluZGV4KG5vZGUpIHtcbiAgICBfbmF0aXZlTm9kZVRvRGVidWdOb2RlLmRlbGV0ZShub2RlLm5hdGl2ZU5vZGUpO1xufVxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBEZWJ1Z05vZGUgPSBEZWJ1Z05vZGVfX1BSRV9SM19fO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBEZWJ1Z0VsZW1lbnQgPSBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfQ09SRV9QTEFURk9STV9QUk9WSURFUlMgPSBbXG4gICAgLy8gU2V0IGEgZGVmYXVsdCBwbGF0Zm9ybSBuYW1lIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzZXQgaXQgZXhwbGljaXRseS5cbiAgICB7IHByb3ZpZGU6IFBMQVRGT1JNX0lELCB1c2VWYWx1ZTogJ3Vua25vd24nIH0sXG4gICAgeyBwcm92aWRlOiBQbGF0Zm9ybVJlZiwgZGVwczogW0luamVjdG9yXSB9LFxuICAgIHsgcHJvdmlkZTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZGVwczogW10gfSxcbiAgICB7IHByb3ZpZGU6IENvbnNvbGUsIGRlcHM6IFtdIH0sXG5dO1xuLyoqXG4gKiBUaGlzIHBsYXRmb3JtIGhhcyB0byBiZSBpbmNsdWRlZCBpbiBhbnkgb3RoZXIgcGxhdGZvcm1cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBwbGF0Zm9ybUNvcmUgPSBjcmVhdGVQbGF0Zm9ybUZhY3RvcnkobnVsbCwgJ2NvcmUnLCBfQ09SRV9QTEFURk9STV9QUk9WSURFUlMpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBzZXQgdGhlIGxvY2FsZSBvZiB5b3VyIGFwcGxpY2F0aW9uLlxuICogSXQgaXMgdXNlZCBmb3IgaTE4biBleHRyYWN0aW9uLCBieSBpMThuIHBpcGVzIChEYXRlUGlwZSwgSTE4blBsdXJhbFBpcGUsIEN1cnJlbmN5UGlwZSxcbiAqIERlY2ltYWxQaXBlIGFuZCBQZXJjZW50UGlwZSkgYW5kIGJ5IElDVSBleHByZXNzaW9ucy5cbiAqXG4gKiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI3NldHRpbmctdXAtbG9jYWxlKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7XG4gKlxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHtcbiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IExPQ0FMRV9JRCwgdXNlVmFsdWU6ICdlbi1VUycgfV1cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTE9DQUxFX0lEID0gbmV3IEluamVjdGlvblRva2VuKCdMb2NhbGVJZCcpO1xuLyoqXG4gKiBVc2UgdGhpcyB0b2tlbiBhdCBib290c3RyYXAgdG8gcHJvdmlkZSB0aGUgY29udGVudCBvZiB5b3VyIHRyYW5zbGF0aW9uIGZpbGUgKGB4dGJgLFxuICogYHhsZmAgb3IgYHhsZjJgKSB3aGVuIHlvdSB3YW50IHRvIHRyYW5zbGF0ZSB5b3VyIGFwcGxpY2F0aW9uIGluIGFub3RoZXIgbGFuZ3VhZ2UuXG4gKlxuICogU2VlIHRoZSBbaTE4biBndWlkZV0oZ3VpZGUvaTE4biNtZXJnZSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgVFJBTlNMQVRJT05TIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJztcbiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnO1xuICpcbiAqIC8vIGNvbnRlbnQgb2YgeW91ciB0cmFuc2xhdGlvbiBmaWxlXG4gKiBjb25zdCB0cmFuc2xhdGlvbnMgPSAnLi4uLic7XG4gKlxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHtcbiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRSQU5TTEFUSU9OUywgdXNlVmFsdWU6IHRyYW5zbGF0aW9ucyB9XVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBUUkFOU0xBVElPTlMkMSA9IG5ldyBJbmplY3Rpb25Ub2tlbignVHJhbnNsYXRpb25zJyk7XG4vKipcbiAqIFByb3ZpZGUgdGhpcyB0b2tlbiBhdCBib290c3RyYXAgdG8gc2V0IHRoZSBmb3JtYXQgb2YgeW91ciB7QGxpbmsgVFJBTlNMQVRJT05TfTogYHh0YmAsXG4gKiBgeGxmYCBvciBgeGxmMmAuXG4gKlxuICogU2VlIHRoZSBbaTE4biBndWlkZV0oZ3VpZGUvaTE4biNtZXJnZSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgVFJBTlNMQVRJT05TX0ZPUk1BVCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuICogaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tICcuL2FwcC9hcHAubW9kdWxlJztcbiAqXG4gKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwge1xuICogICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVFJBTlNMQVRJT05TX0ZPUk1BVCwgdXNlVmFsdWU6ICd4bGYnIH1dXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFRSQU5TTEFUSU9OU19GT1JNQVQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RyYW5zbGF0aW9uc0Zvcm1hdCcpO1xuLyoqXG4gKiBVc2UgdGhpcyBlbnVtIGF0IGJvb3RzdHJhcCBhcyBhbiBvcHRpb24gb2YgYGJvb3RzdHJhcE1vZHVsZWAgdG8gZGVmaW5lIHRoZSBzdHJhdGVneVxuICogdGhhdCB0aGUgY29tcGlsZXIgc2hvdWxkIHVzZSBpbiBjYXNlIG9mIG1pc3NpbmcgdHJhbnNsYXRpb25zOlxuICogLSBFcnJvcjogdGhyb3cgaWYgeW91IGhhdmUgbWlzc2luZyB0cmFuc2xhdGlvbnMuXG4gKiAtIFdhcm5pbmcgKGRlZmF1bHQpOiBzaG93IGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBhbmQvb3Igc2hlbGwuXG4gKiAtIElnbm9yZTogZG8gbm90aGluZy5cbiAqXG4gKiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI21pc3NpbmctdHJhbnNsYXRpb24pIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7XG4gKlxuICogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHtcbiAqICAgbWlzc2luZ1RyYW5zbGF0aW9uOiBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneS5FcnJvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneTtcbihmdW5jdGlvbiAoTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kpIHtcbiAgICBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtcIkVycm9yXCJdID0gMF0gPSBcIkVycm9yXCI7XG4gICAgTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3lbTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3lbXCJXYXJuaW5nXCJdID0gMV0gPSBcIldhcm5pbmdcIjtcbiAgICBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtcIklnbm9yZVwiXSA9IDJdID0gXCJJZ25vcmVcIjtcbn0pKE1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5IHx8IChNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSA9IHt9KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5KCkge1xuICAgIHJldHVybiBkZWZhdWx0SXRlcmFibGVEaWZmZXJzO1xufVxuZnVuY3Rpb24gX2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRLZXlWYWx1ZURpZmZlcnM7XG59XG5mdW5jdGlvbiBfbG9jYWxlRmFjdG9yeShsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlIHx8ICdlbi1VUyc7XG59XG4vKipcbiAqIEEgYnVpbHQtaW4gW2RlcGVuZGVuY3kgaW5qZWN0aW9uIHRva2VuXShndWlkZS9nbG9zc2FyeSNkaS10b2tlbilcbiAqIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHJvb3QgaW5qZWN0b3IgZm9yIGJvb3RzdHJhcHBpbmcuXG4gKi9cbnZhciBBUFBMSUNBVElPTl9NT0RVTEVfUFJPVklERVJTID0gW1xuICAgIHtcbiAgICAgICAgcHJvdmlkZTogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgZGVwczogW05nWm9uZSwgQ29uc29sZSwgSW5qZWN0b3IsIEVycm9ySGFuZGxlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBBcHBsaWNhdGlvbkluaXRTdGF0dXNdXG4gICAgfSxcbiAgICB7IHByb3ZpZGU6IFNDSEVEVUxFUiwgZGVwczogW05nWm9uZV0sIHVzZUZhY3Rvcnk6IHpvbmVTY2hlZHVsZXJGYWN0b3J5IH0sXG4gICAge1xuICAgICAgICBwcm92aWRlOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsXG4gICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsXG4gICAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIEFQUF9JTklUSUFMSVpFUl1dXG4gICAgfSxcbiAgICB7IHByb3ZpZGU6IENvbXBpbGVyLCB1c2VDbGFzczogQ29tcGlsZXIsIGRlcHM6IFtdIH0sXG4gICAgQVBQX0lEX1JBTkRPTV9QUk9WSURFUixcbiAgICB7IHByb3ZpZGU6IEl0ZXJhYmxlRGlmZmVycywgdXNlRmFjdG9yeTogX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnksIGRlcHM6IFtdIH0sXG4gICAgeyBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9rZXlWYWx1ZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LFxuICAgIHtcbiAgICAgICAgcHJvdmlkZTogTE9DQUxFX0lELFxuICAgICAgICB1c2VGYWN0b3J5OiBfbG9jYWxlRmFjdG9yeSxcbiAgICAgICAgZGVwczogW1tuZXcgSW5qZWN0KExPQ0FMRV9JRCksIG5ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKV1dXG4gICAgfSxcbl07XG4vKipcbiAqIFNjaGVkdWxlIHdvcmsgYXQgbmV4dCBhdmFpbGFibGUgc2xvdC5cbiAqXG4gKiBJbiBJdnkgdGhpcyBpcyBqdXN0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdoZW4gYm9vdHN0cmFwcGVkXG4gKiB1c2luZyBgcGxhdGZvcm1SZWYuYm9vdHN0cmFwYCB3ZSBuZWVkIHRvIHVzZSBgTmdab25lLm9uU3RhYmxlYCBhcyB0aGUgc2NoZWR1bGluZyBtZWNoYW5pc20uXG4gKiBUaGlzIG92ZXJyaWRlcyB0aGUgc2NoZWR1bGluZyBtZWNoYW5pc20gaW4gSXZ5IHRvIGBOZ1pvbmUub25TdGFibGVgLlxuICpcbiAqIEBwYXJhbSBuZ1pvbmUgTmdab25lIHRvIHVzZSBmb3Igc2NoZWR1bGluZy5cbiAqL1xuZnVuY3Rpb24gem9uZVNjaGVkdWxlckZhY3Rvcnkobmdab25lKSB7XG4gICAgdmFyIHF1ZXVlID0gW107XG4gICAgbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHF1ZXVlLnBvcCgpKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7IHF1ZXVlLnB1c2goZm4pOyB9O1xufVxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSByb290IGluamVjdG9yIGZvciBhbiBhcHAgd2l0aFxuICogcHJvdmlkZXJzIG9mIGBAYW5ndWxhci9jb3JlYCBkZXBlbmRlbmNpZXMgdGhhdCBgQXBwbGljYXRpb25SZWZgIG5lZWRzXG4gKiB0byBib290c3RyYXAgY29tcG9uZW50cy5cbiAqXG4gKiBSZS1leHBvcnRlZCBieSBgQnJvd3Nlck1vZHVsZWAsIHdoaWNoIGlzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIHJvb3RcbiAqIGBBcHBNb2R1bGVgIHdoZW4geW91IGNyZWF0ZSBhIG5ldyBhcHAgd2l0aCB0aGUgQ0xJIGBuZXdgIGNvbW1hbmQuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQXBwbGljYXRpb25Nb2R1bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLy8gSW5qZWN0IEFwcGxpY2F0aW9uUmVmIHRvIG1ha2UgaXQgZWFnZXIuLi5cbiAgICBmdW5jdGlvbiBBcHBsaWNhdGlvbk1vZHVsZShhcHBSZWYpIHtcbiAgICB9XG4gICAgQXBwbGljYXRpb25Nb2R1bGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgTmdNb2R1bGUoeyBwcm92aWRlcnM6IEFQUExJQ0FUSU9OX01PRFVMRV9QUk9WSURFUlMgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXBwbGljYXRpb25SZWZdKVxuICAgIF0sIEFwcGxpY2F0aW9uTW9kdWxlKTtcbiAgICByZXR1cm4gQXBwbGljYXRpb25Nb2R1bGU7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBhbmNob3JEZWYoZmxhZ3MsIG1hdGNoZWRRdWVyaWVzRHNsLCBuZ0NvbnRlbnRJbmRleCwgY2hpbGRDb3VudCwgaGFuZGxlRXZlbnQsIHRlbXBsYXRlRmFjdG9yeSkge1xuICAgIGZsYWdzIHw9IDEgLyogVHlwZUVsZW1lbnQgKi87XG4gICAgdmFyIF9hID0gc3BsaXRNYXRjaGVkUXVlcmllc0RzbChtYXRjaGVkUXVlcmllc0RzbCksIG1hdGNoZWRRdWVyaWVzID0gX2EubWF0Y2hlZFF1ZXJpZXMsIHJlZmVyZW5jZXMgPSBfYS5yZWZlcmVuY2VzLCBtYXRjaGVkUXVlcnlJZHMgPSBfYS5tYXRjaGVkUXVlcnlJZHM7XG4gICAgdmFyIHRlbXBsYXRlID0gdGVtcGxhdGVGYWN0b3J5ID8gcmVzb2x2ZURlZmluaXRpb24odGVtcGxhdGVGYWN0b3J5KSA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gd2lsbCBiZXQgc2V0IGJ5IHRoZSB2aWV3IGRlZmluaXRpb25cbiAgICAgICAgbm9kZUluZGV4OiAtMSxcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICByZW5kZXJQYXJlbnQ6IG51bGwsXG4gICAgICAgIGJpbmRpbmdJbmRleDogLTEsXG4gICAgICAgIG91dHB1dEluZGV4OiAtMSxcbiAgICAgICAgLy8gcmVndWxhciB2YWx1ZXNcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICBjaGVja0luZGV4OiAtMSxcbiAgICAgICAgY2hpbGRGbGFnczogMCxcbiAgICAgICAgZGlyZWN0Q2hpbGRGbGFnczogMCxcbiAgICAgICAgY2hpbGRNYXRjaGVkUXVlcmllczogMCwgbWF0Y2hlZFF1ZXJpZXM6IG1hdGNoZWRRdWVyaWVzLCBtYXRjaGVkUXVlcnlJZHM6IG1hdGNoZWRRdWVyeUlkcywgcmVmZXJlbmNlczogcmVmZXJlbmNlcywgbmdDb250ZW50SW5kZXg6IG5nQ29udGVudEluZGV4LCBjaGlsZENvdW50OiBjaGlsZENvdW50LFxuICAgICAgICBiaW5kaW5nczogW10sXG4gICAgICAgIGJpbmRpbmdGbGFnczogMCxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgIG5zOiBudWxsLFxuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIGF0dHJzOiBudWxsLCB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgICAgICBjb21wb25lbnRQcm92aWRlcjogbnVsbCxcbiAgICAgICAgICAgIGNvbXBvbmVudFZpZXc6IG51bGwsXG4gICAgICAgICAgICBjb21wb25lbnRSZW5kZXJlclR5cGU6IG51bGwsXG4gICAgICAgICAgICBwdWJsaWNQcm92aWRlcnM6IG51bGwsXG4gICAgICAgICAgICBhbGxQcm92aWRlcnM6IG51bGwsXG4gICAgICAgICAgICBoYW5kbGVFdmVudDogaGFuZGxlRXZlbnQgfHwgTk9PUFxuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlcjogbnVsbCxcbiAgICAgICAgdGV4dDogbnVsbCxcbiAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgIG5nQ29udGVudDogbnVsbFxuICAgIH07XG59XG5mdW5jdGlvbiBlbGVtZW50RGVmKGNoZWNrSW5kZXgsIGZsYWdzLCBtYXRjaGVkUXVlcmllc0RzbCwgbmdDb250ZW50SW5kZXgsIGNoaWxkQ291bnQsIG5hbWVzcGFjZUFuZE5hbWUsIGZpeGVkQXR0cnMsIGJpbmRpbmdzLCBvdXRwdXRzLCBoYW5kbGVFdmVudCwgY29tcG9uZW50VmlldywgY29tcG9uZW50UmVuZGVyZXJUeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChmaXhlZEF0dHJzID09PSB2b2lkIDApIHsgZml4ZWRBdHRycyA9IFtdOyB9XG4gICAgaWYgKCFoYW5kbGVFdmVudCkge1xuICAgICAgICBoYW5kbGVFdmVudCA9IE5PT1A7XG4gICAgfVxuICAgIHZhciBfYiA9IHNwbGl0TWF0Y2hlZFF1ZXJpZXNEc2wobWF0Y2hlZFF1ZXJpZXNEc2wpLCBtYXRjaGVkUXVlcmllcyA9IF9iLm1hdGNoZWRRdWVyaWVzLCByZWZlcmVuY2VzID0gX2IucmVmZXJlbmNlcywgbWF0Y2hlZFF1ZXJ5SWRzID0gX2IubWF0Y2hlZFF1ZXJ5SWRzO1xuICAgIHZhciBucyA9IG51bGw7XG4gICAgdmFyIG5hbWUgPSBudWxsO1xuICAgIGlmIChuYW1lc3BhY2VBbmROYW1lKSB7XG4gICAgICAgIF9hID0gX19yZWFkKHNwbGl0TmFtZXNwYWNlKG5hbWVzcGFjZUFuZE5hbWUpLCAyKSwgbnMgPSBfYVswXSwgbmFtZSA9IF9hWzFdO1xuICAgIH1cbiAgICBiaW5kaW5ncyA9IGJpbmRpbmdzIHx8IFtdO1xuICAgIHZhciBiaW5kaW5nRGVmcyA9IG5ldyBBcnJheShiaW5kaW5ncy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIF9jID0gX19yZWFkKGJpbmRpbmdzW2ldLCAzKSwgYmluZGluZ0ZsYWdzID0gX2NbMF0sIG5hbWVzcGFjZUFuZE5hbWVfMSA9IF9jWzFdLCBzdWZmaXhPclNlY3VyaXR5Q29udGV4dCA9IF9jWzJdO1xuICAgICAgICB2YXIgX2QgPSBfX3JlYWQoc3BsaXROYW1lc3BhY2UobmFtZXNwYWNlQW5kTmFtZV8xKSwgMiksIG5zXzEgPSBfZFswXSwgbmFtZV8xID0gX2RbMV07XG4gICAgICAgIHZhciBzZWN1cml0eUNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBzdWZmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIHN3aXRjaCAoYmluZGluZ0ZsYWdzICYgMTUgLyogVHlwZXMgKi8pIHtcbiAgICAgICAgICAgIGNhc2UgNCAvKiBUeXBlRWxlbWVudFN0eWxlICovOlxuICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeE9yU2VjdXJpdHlDb250ZXh0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxIC8qIFR5cGVFbGVtZW50QXR0cmlidXRlICovOlxuICAgICAgICAgICAgY2FzZSA4IC8qIFR5cGVQcm9wZXJ0eSAqLzpcbiAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHQgPSBzdWZmaXhPclNlY3VyaXR5Q29udGV4dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBiaW5kaW5nRGVmc1tpXSA9XG4gICAgICAgICAgICB7IGZsYWdzOiBiaW5kaW5nRmxhZ3MsIG5zOiBuc18xLCBuYW1lOiBuYW1lXzEsIG5vbk1pbmlmaWVkTmFtZTogbmFtZV8xLCBzZWN1cml0eUNvbnRleHQ6IHNlY3VyaXR5Q29udGV4dCwgc3VmZml4OiBzdWZmaXggfTtcbiAgICB9XG4gICAgb3V0cHV0cyA9IG91dHB1dHMgfHwgW107XG4gICAgdmFyIG91dHB1dERlZnMgPSBuZXcgQXJyYXkob3V0cHV0cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgX2UgPSBfX3JlYWQob3V0cHV0c1tpXSwgMiksIHRhcmdldCA9IF9lWzBdLCBldmVudE5hbWUgPSBfZVsxXTtcbiAgICAgICAgb3V0cHV0RGVmc1tpXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IDAgLyogRWxlbWVudE91dHB1dCAqLyxcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LCBldmVudE5hbWU6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgIHByb3BOYW1lOiBudWxsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGZpeGVkQXR0cnMgPSBmaXhlZEF0dHJzIHx8IFtdO1xuICAgIHZhciBhdHRycyA9IGZpeGVkQXR0cnMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgX2IgPSBfX3JlYWQoX2EsIDIpLCBuYW1lc3BhY2VBbmROYW1lID0gX2JbMF0sIHZhbHVlID0gX2JbMV07XG4gICAgICAgIHZhciBfYyA9IF9fcmVhZChzcGxpdE5hbWVzcGFjZShuYW1lc3BhY2VBbmROYW1lKSwgMiksIG5zID0gX2NbMF0sIG5hbWUgPSBfY1sxXTtcbiAgICAgICAgcmV0dXJuIFtucywgbmFtZSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIGNvbXBvbmVudFJlbmRlcmVyVHlwZSA9IHJlc29sdmVSZW5kZXJlclR5cGUyKGNvbXBvbmVudFJlbmRlcmVyVHlwZSk7XG4gICAgaWYgKGNvbXBvbmVudFZpZXcpIHtcbiAgICAgICAgZmxhZ3MgfD0gMzM1NTQ0MzIgLyogQ29tcG9uZW50VmlldyAqLztcbiAgICB9XG4gICAgZmxhZ3MgfD0gMSAvKiBUeXBlRWxlbWVudCAqLztcbiAgICByZXR1cm4ge1xuICAgICAgICAvLyB3aWxsIGJldCBzZXQgYnkgdGhlIHZpZXcgZGVmaW5pdGlvblxuICAgICAgICBub2RlSW5kZXg6IC0xLFxuICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgIHJlbmRlclBhcmVudDogbnVsbCxcbiAgICAgICAgYmluZGluZ0luZGV4OiAtMSxcbiAgICAgICAgb3V0cHV0SW5kZXg6IC0xLFxuICAgICAgICAvLyByZWd1bGFyIHZhbHVlc1xuICAgICAgICBjaGVja0luZGV4OiBjaGVja0luZGV4LFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIGNoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGRpcmVjdENoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGNoaWxkTWF0Y2hlZFF1ZXJpZXM6IDAsIG1hdGNoZWRRdWVyaWVzOiBtYXRjaGVkUXVlcmllcywgbWF0Y2hlZFF1ZXJ5SWRzOiBtYXRjaGVkUXVlcnlJZHMsIHJlZmVyZW5jZXM6IHJlZmVyZW5jZXMsIG5nQ29udGVudEluZGV4OiBuZ0NvbnRlbnRJbmRleCwgY2hpbGRDb3VudDogY2hpbGRDb3VudCxcbiAgICAgICAgYmluZGluZ3M6IGJpbmRpbmdEZWZzLFxuICAgICAgICBiaW5kaW5nRmxhZ3M6IGNhbGNCaW5kaW5nRmxhZ3MoYmluZGluZ0RlZnMpLFxuICAgICAgICBvdXRwdXRzOiBvdXRwdXREZWZzLFxuICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICBuczogbnMsXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgYXR0cnM6IGF0dHJzLFxuICAgICAgICAgICAgdGVtcGxhdGU6IG51bGwsXG4gICAgICAgICAgICAvLyB3aWxsIGJldCBzZXQgYnkgdGhlIHZpZXcgZGVmaW5pdGlvblxuICAgICAgICAgICAgY29tcG9uZW50UHJvdmlkZXI6IG51bGwsXG4gICAgICAgICAgICBjb21wb25lbnRWaWV3OiBjb21wb25lbnRWaWV3IHx8IG51bGwsXG4gICAgICAgICAgICBjb21wb25lbnRSZW5kZXJlclR5cGU6IGNvbXBvbmVudFJlbmRlcmVyVHlwZSxcbiAgICAgICAgICAgIHB1YmxpY1Byb3ZpZGVyczogbnVsbCxcbiAgICAgICAgICAgIGFsbFByb3ZpZGVyczogbnVsbCxcbiAgICAgICAgICAgIGhhbmRsZUV2ZW50OiBoYW5kbGVFdmVudCB8fCBOT09QLFxuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlcjogbnVsbCxcbiAgICAgICAgdGV4dDogbnVsbCxcbiAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgIG5nQ29udGVudDogbnVsbFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHZpZXcsIHJlbmRlckhvc3QsIGRlZikge1xuICAgIHZhciBlbERlZiA9IGRlZi5lbGVtZW50O1xuICAgIHZhciByb290U2VsZWN0b3JPck5vZGUgPSB2aWV3LnJvb3Quc2VsZWN0b3JPck5vZGU7XG4gICAgdmFyIHJlbmRlcmVyID0gdmlldy5yZW5kZXJlcjtcbiAgICB2YXIgZWw7XG4gICAgaWYgKHZpZXcucGFyZW50IHx8ICFyb290U2VsZWN0b3JPck5vZGUpIHtcbiAgICAgICAgaWYgKGVsRGVmLm5hbWUpIHtcbiAgICAgICAgICAgIGVsID0gcmVuZGVyZXIuY3JlYXRlRWxlbWVudChlbERlZi5uYW1lLCBlbERlZi5ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbCA9IHJlbmRlcmVyLmNyZWF0ZUNvbW1lbnQoJycpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRFbCA9IGdldFBhcmVudFJlbmRlckVsZW1lbnQodmlldywgcmVuZGVySG9zdCwgZGVmKTtcbiAgICAgICAgaWYgKHBhcmVudEVsKSB7XG4gICAgICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbCwgZWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyB3aGVuIHVzaW5nIG5hdGl2ZSBTaGFkb3cgRE9NLCBkbyBub3QgY2xlYXIgdGhlIHJvb3QgZWxlbWVudCBjb250ZW50cyB0byBhbGxvdyBzbG90IHByb2plY3Rpb25cbiAgICAgICAgdmFyIHByZXNlcnZlQ29udGVudCA9ICghIWVsRGVmLmNvbXBvbmVudFJlbmRlcmVyVHlwZSAmJlxuICAgICAgICAgICAgZWxEZWYuY29tcG9uZW50UmVuZGVyZXJUeXBlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSk7XG4gICAgICAgIGVsID0gcmVuZGVyZXIuc2VsZWN0Um9vdEVsZW1lbnQocm9vdFNlbGVjdG9yT3JOb2RlLCBwcmVzZXJ2ZUNvbnRlbnQpO1xuICAgIH1cbiAgICBpZiAoZWxEZWYuYXR0cnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbERlZi5hdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKGVsRGVmLmF0dHJzW2ldLCAzKSwgbnMgPSBfYVswXSwgbmFtZV8yID0gX2FbMV0sIHZhbHVlID0gX2FbMl07XG4gICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWwsIG5hbWVfMiwgdmFsdWUsIG5zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWw7XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub0VsZW1lbnRPdXRwdXRzKHZpZXcsIGNvbXBWaWV3LCBkZWYsIGVsKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWYub3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gZGVmLm91dHB1dHNbaV07XG4gICAgICAgIHZhciBoYW5kbGVFdmVudENsb3N1cmUgPSByZW5kZXJFdmVudEhhbmRsZXJDbG9zdXJlKHZpZXcsIGRlZi5ub2RlSW5kZXgsIGVsZW1lbnRFdmVudEZ1bGxOYW1lKG91dHB1dC50YXJnZXQsIG91dHB1dC5ldmVudE5hbWUpKTtcbiAgICAgICAgdmFyIGxpc3RlblRhcmdldCA9IG91dHB1dC50YXJnZXQ7XG4gICAgICAgIHZhciBsaXN0ZW5lclZpZXcgPSB2aWV3O1xuICAgICAgICBpZiAob3V0cHV0LnRhcmdldCA9PT0gJ2NvbXBvbmVudCcpIHtcbiAgICAgICAgICAgIGxpc3RlblRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICBsaXN0ZW5lclZpZXcgPSBjb21wVmlldztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlzcG9zYWJsZSA9IGxpc3RlbmVyVmlldy5yZW5kZXJlci5saXN0ZW4obGlzdGVuVGFyZ2V0IHx8IGVsLCBvdXRwdXQuZXZlbnROYW1lLCBoYW5kbGVFdmVudENsb3N1cmUpO1xuICAgICAgICB2aWV3LmRpc3Bvc2FibGVzW2RlZi5vdXRwdXRJbmRleCArIGldID0gZGlzcG9zYWJsZTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJFdmVudEhhbmRsZXJDbG9zdXJlKHZpZXcsIGluZGV4LCBldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBkaXNwYXRjaEV2ZW50KHZpZXcsIGluZGV4LCBldmVudE5hbWUsIGV2ZW50KTsgfTtcbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlRWxlbWVudElubGluZSh2aWV3LCBkZWYsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KSB7XG4gICAgdmFyIGJpbmRMZW4gPSBkZWYuYmluZGluZ3MubGVuZ3RoO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKGJpbmRMZW4gPiAwICYmIGNoZWNrQW5kVXBkYXRlRWxlbWVudFZhbHVlKHZpZXcsIGRlZiwgMCwgdjApKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICBpZiAoYmluZExlbiA+IDEgJiYgY2hlY2tBbmRVcGRhdGVFbGVtZW50VmFsdWUodmlldywgZGVmLCAxLCB2MSkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gMiAmJiBjaGVja0FuZFVwZGF0ZUVsZW1lbnRWYWx1ZSh2aWV3LCBkZWYsIDIsIHYyKSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiAzICYmIGNoZWNrQW5kVXBkYXRlRWxlbWVudFZhbHVlKHZpZXcsIGRlZiwgMywgdjMpKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICBpZiAoYmluZExlbiA+IDQgJiYgY2hlY2tBbmRVcGRhdGVFbGVtZW50VmFsdWUodmlldywgZGVmLCA0LCB2NCkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gNSAmJiBjaGVja0FuZFVwZGF0ZUVsZW1lbnRWYWx1ZSh2aWV3LCBkZWYsIDUsIHY1KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA2ICYmIGNoZWNrQW5kVXBkYXRlRWxlbWVudFZhbHVlKHZpZXcsIGRlZiwgNiwgdjYpKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICBpZiAoYmluZExlbiA+IDcgJiYgY2hlY2tBbmRVcGRhdGVFbGVtZW50VmFsdWUodmlldywgZGVmLCA3LCB2NykpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gOCAmJiBjaGVja0FuZFVwZGF0ZUVsZW1lbnRWYWx1ZSh2aWV3LCBkZWYsIDgsIHY4KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA5ICYmIGNoZWNrQW5kVXBkYXRlRWxlbWVudFZhbHVlKHZpZXcsIGRlZiwgOSwgdjkpKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlRWxlbWVudER5bmFtaWModmlldywgZGVmLCB2YWx1ZXMpIHtcbiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjaGVja0FuZFVwZGF0ZUVsZW1lbnRWYWx1ZSh2aWV3LCBkZWYsIGksIHZhbHVlc1tpXSkpXG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZUVsZW1lbnRWYWx1ZSh2aWV3LCBkZWYsIGJpbmRpbmdJZHgsIHZhbHVlKSB7XG4gICAgaWYgKCFjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCBiaW5kaW5nSWR4LCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgYmluZGluZyA9IGRlZi5iaW5kaW5nc1tiaW5kaW5nSWR4XTtcbiAgICB2YXIgZWxEYXRhID0gYXNFbGVtZW50RGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICB2YXIgcmVuZGVyTm9kZSA9IGVsRGF0YS5yZW5kZXJFbGVtZW50O1xuICAgIHZhciBuYW1lID0gYmluZGluZy5uYW1lO1xuICAgIHN3aXRjaCAoYmluZGluZy5mbGFncyAmIDE1IC8qIFR5cGVzICovKSB7XG4gICAgICAgIGNhc2UgMSAvKiBUeXBlRWxlbWVudEF0dHJpYnV0ZSAqLzpcbiAgICAgICAgICAgIHNldEVsZW1lbnRBdHRyaWJ1dGUodmlldywgYmluZGluZywgcmVuZGVyTm9kZSwgYmluZGluZy5ucywgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMiAvKiBUeXBlRWxlbWVudENsYXNzICovOlxuICAgICAgICAgICAgc2V0RWxlbWVudENsYXNzKHZpZXcsIHJlbmRlck5vZGUsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQgLyogVHlwZUVsZW1lbnRTdHlsZSAqLzpcbiAgICAgICAgICAgIHNldEVsZW1lbnRTdHlsZSh2aWV3LCBiaW5kaW5nLCByZW5kZXJOb2RlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA4IC8qIFR5cGVQcm9wZXJ0eSAqLzpcbiAgICAgICAgICAgIHZhciBiaW5kVmlldyA9IChkZWYuZmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovICYmXG4gICAgICAgICAgICAgICAgYmluZGluZy5mbGFncyAmIDMyIC8qIFN5bnRoZXRpY0hvc3RQcm9wZXJ0eSAqLykgP1xuICAgICAgICAgICAgICAgIGVsRGF0YS5jb21wb25lbnRWaWV3IDpcbiAgICAgICAgICAgICAgICB2aWV3O1xuICAgICAgICAgICAgc2V0RWxlbWVudFByb3BlcnR5KGJpbmRWaWV3LCBiaW5kaW5nLCByZW5kZXJOb2RlLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBzZXRFbGVtZW50QXR0cmlidXRlKHZpZXcsIGJpbmRpbmcsIHJlbmRlck5vZGUsIG5zLCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBzZWN1cml0eUNvbnRleHQgPSBiaW5kaW5nLnNlY3VyaXR5Q29udGV4dDtcbiAgICB2YXIgcmVuZGVyVmFsdWUgPSBzZWN1cml0eUNvbnRleHQgPyB2aWV3LnJvb3Quc2FuaXRpemVyLnNhbml0aXplKHNlY3VyaXR5Q29udGV4dCwgdmFsdWUpIDogdmFsdWU7XG4gICAgcmVuZGVyVmFsdWUgPSByZW5kZXJWYWx1ZSAhPSBudWxsID8gcmVuZGVyVmFsdWUudG9TdHJpbmcoKSA6IG51bGw7XG4gICAgdmFyIHJlbmRlcmVyID0gdmlldy5yZW5kZXJlcjtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUocmVuZGVyTm9kZSwgbmFtZSwgcmVuZGVyVmFsdWUsIG5zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShyZW5kZXJOb2RlLCBuYW1lLCBucyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0RWxlbWVudENsYXNzKHZpZXcsIHJlbmRlck5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gdmlldy5yZW5kZXJlcjtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MocmVuZGVyTm9kZSwgbmFtZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhyZW5kZXJOb2RlLCBuYW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRFbGVtZW50U3R5bGUodmlldywgYmluZGluZywgcmVuZGVyTm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcmVuZGVyVmFsdWUgPSB2aWV3LnJvb3Quc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5TVFlMRSwgdmFsdWUpO1xuICAgIGlmIChyZW5kZXJWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHJlbmRlclZhbHVlID0gcmVuZGVyVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIHVuaXQgPSBiaW5kaW5nLnN1ZmZpeDtcbiAgICAgICAgaWYgKHVuaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVuZGVyVmFsdWUgPSByZW5kZXJWYWx1ZSArIHVuaXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlbmRlclZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdmFyIHJlbmRlcmVyID0gdmlldy5yZW5kZXJlcjtcbiAgICBpZiAocmVuZGVyVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShyZW5kZXJOb2RlLCBuYW1lLCByZW5kZXJWYWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZW5kZXJlci5yZW1vdmVTdHlsZShyZW5kZXJOb2RlLCBuYW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRFbGVtZW50UHJvcGVydHkodmlldywgYmluZGluZywgcmVuZGVyTm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgc2VjdXJpdHlDb250ZXh0ID0gYmluZGluZy5zZWN1cml0eUNvbnRleHQ7XG4gICAgdmFyIHJlbmRlclZhbHVlID0gc2VjdXJpdHlDb250ZXh0ID8gdmlldy5yb290LnNhbml0aXplci5zYW5pdGl6ZShzZWN1cml0eUNvbnRleHQsIHZhbHVlKSA6IHZhbHVlO1xuICAgIHZpZXcucmVuZGVyZXIuc2V0UHJvcGVydHkocmVuZGVyTm9kZSwgbmFtZSwgcmVuZGVyVmFsdWUpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBxdWVyeURlZihmbGFncywgaWQsIGJpbmRpbmdzKSB7XG4gICAgdmFyIGJpbmRpbmdEZWZzID0gW107XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gYmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGJpbmRpbmdUeXBlID0gYmluZGluZ3NbcHJvcE5hbWVdO1xuICAgICAgICBiaW5kaW5nRGVmcy5wdXNoKHsgcHJvcE5hbWU6IHByb3BOYW1lLCBiaW5kaW5nVHlwZTogYmluZGluZ1R5cGUgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIHdpbGwgYmV0IHNldCBieSB0aGUgdmlldyBkZWZpbml0aW9uXG4gICAgICAgIG5vZGVJbmRleDogLTEsXG4gICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgcmVuZGVyUGFyZW50OiBudWxsLFxuICAgICAgICBiaW5kaW5nSW5kZXg6IC0xLFxuICAgICAgICBvdXRwdXRJbmRleDogLTEsXG4gICAgICAgIC8vIHJlZ3VsYXIgdmFsdWVzXG4gICAgICAgIC8vIFRPRE8odmljYik6IGNoZWNrXG4gICAgICAgIGNoZWNrSW5kZXg6IC0xLCBmbGFnczogZmxhZ3MsXG4gICAgICAgIGNoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGRpcmVjdENoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGNoaWxkTWF0Y2hlZFF1ZXJpZXM6IDAsXG4gICAgICAgIG5nQ29udGVudEluZGV4OiAtMSxcbiAgICAgICAgbWF0Y2hlZFF1ZXJpZXM6IHt9LFxuICAgICAgICBtYXRjaGVkUXVlcnlJZHM6IDAsXG4gICAgICAgIHJlZmVyZW5jZXM6IHt9LFxuICAgICAgICBjaGlsZENvdW50OiAwLFxuICAgICAgICBiaW5kaW5nczogW10sXG4gICAgICAgIGJpbmRpbmdGbGFnczogMCxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyOiBudWxsLFxuICAgICAgICB0ZXh0OiBudWxsLFxuICAgICAgICBxdWVyeTogeyBpZDogaWQsIGZpbHRlcklkOiBmaWx0ZXJRdWVyeUlkKGlkKSwgYmluZGluZ3M6IGJpbmRpbmdEZWZzIH0sXG4gICAgICAgIG5nQ29udGVudDogbnVsbFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVRdWVyeSQxKCkge1xuICAgIHJldHVybiBuZXcgUXVlcnlMaXN0KCk7XG59XG5mdW5jdGlvbiBkaXJ0eVBhcmVudFF1ZXJpZXModmlldykge1xuICAgIHZhciBxdWVyeUlkcyA9IHZpZXcuZGVmLm5vZGVNYXRjaGVkUXVlcmllcztcbiAgICB3aGlsZSAodmlldy5wYXJlbnQgJiYgaXNFbWJlZGRlZFZpZXcodmlldykpIHtcbiAgICAgICAgdmFyIHRwbERlZiA9IHZpZXcucGFyZW50Tm9kZURlZjtcbiAgICAgICAgdmlldyA9IHZpZXcucGFyZW50O1xuICAgICAgICAvLyBjb250ZW50IHF1ZXJpZXNcbiAgICAgICAgdmFyIGVuZCA9IHRwbERlZi5ub2RlSW5kZXggKyB0cGxEZWYuY2hpbGRDb3VudDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoKG5vZGVEZWYuZmxhZ3MgJiA2NzEwODg2NCAvKiBUeXBlQ29udGVudFF1ZXJ5ICovKSAmJlxuICAgICAgICAgICAgICAgIChub2RlRGVmLmZsYWdzICYgNTM2ODcwOTEyIC8qIER5bmFtaWNRdWVyeSAqLykgJiZcbiAgICAgICAgICAgICAgICAobm9kZURlZi5xdWVyeS5maWx0ZXJJZCAmIHF1ZXJ5SWRzKSA9PT0gbm9kZURlZi5xdWVyeS5maWx0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGFzUXVlcnlMaXN0KHZpZXcsIGkpLnNldERpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG5vZGVEZWYuZmxhZ3MgJiAxIC8qIFR5cGVFbGVtZW50ICovICYmIGkgKyBub2RlRGVmLmNoaWxkQ291bnQgPCB0cGxEZWYubm9kZUluZGV4KSB8fFxuICAgICAgICAgICAgICAgICEobm9kZURlZi5jaGlsZEZsYWdzICYgNjcxMDg4NjQgLyogVHlwZUNvbnRlbnRRdWVyeSAqLykgfHxcbiAgICAgICAgICAgICAgICAhKG5vZGVEZWYuY2hpbGRGbGFncyAmIDUzNjg3MDkxMiAvKiBEeW5hbWljUXVlcnkgKi8pKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlbGVtZW50cyB0aGF0IGRvbid0IGNvbnRhaW4gdGhlIHRlbXBsYXRlIGVsZW1lbnQgb3Igbm8gcXVlcnkuXG4gICAgICAgICAgICAgICAgaSArPSBub2RlRGVmLmNoaWxkQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gdmlldyBxdWVyaWVzXG4gICAgaWYgKHZpZXcuZGVmLm5vZGVGbGFncyAmIDEzNDIxNzcyOCAvKiBUeXBlVmlld1F1ZXJ5ICovKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5kZWYubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgICAgICBpZiAoKG5vZGVEZWYuZmxhZ3MgJiAxMzQyMTc3MjggLyogVHlwZVZpZXdRdWVyeSAqLykgJiYgKG5vZGVEZWYuZmxhZ3MgJiA1MzY4NzA5MTIgLyogRHluYW1pY1F1ZXJ5ICovKSkge1xuICAgICAgICAgICAgICAgIGFzUXVlcnlMaXN0KHZpZXcsIGkpLnNldERpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBvbmx5IHZpc2l0IHRoZSByb290IG5vZGVzXG4gICAgICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlUXVlcnkodmlldywgbm9kZURlZikge1xuICAgIHZhciBxdWVyeUxpc3QgPSBhc1F1ZXJ5TGlzdCh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCk7XG4gICAgaWYgKCFxdWVyeUxpc3QuZGlydHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZGlyZWN0aXZlSW5zdGFuY2U7XG4gICAgdmFyIG5ld1ZhbHVlcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobm9kZURlZi5mbGFncyAmIDY3MTA4ODY0IC8qIFR5cGVDb250ZW50UXVlcnkgKi8pIHtcbiAgICAgICAgdmFyIGVsZW1lbnREZWYgPSBub2RlRGVmLnBhcmVudC5wYXJlbnQ7XG4gICAgICAgIG5ld1ZhbHVlcyA9IGNhbGNRdWVyeVZhbHVlcyh2aWV3LCBlbGVtZW50RGVmLm5vZGVJbmRleCwgZWxlbWVudERlZi5ub2RlSW5kZXggKyBlbGVtZW50RGVmLmNoaWxkQ291bnQsIG5vZGVEZWYucXVlcnksIFtdKTtcbiAgICAgICAgZGlyZWN0aXZlSW5zdGFuY2UgPSBhc1Byb3ZpZGVyRGF0YSh2aWV3LCBub2RlRGVmLnBhcmVudC5ub2RlSW5kZXgpLmluc3RhbmNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChub2RlRGVmLmZsYWdzICYgMTM0MjE3NzI4IC8qIFR5cGVWaWV3UXVlcnkgKi8pIHtcbiAgICAgICAgbmV3VmFsdWVzID0gY2FsY1F1ZXJ5VmFsdWVzKHZpZXcsIDAsIHZpZXcuZGVmLm5vZGVzLmxlbmd0aCAtIDEsIG5vZGVEZWYucXVlcnksIFtdKTtcbiAgICAgICAgZGlyZWN0aXZlSW5zdGFuY2UgPSB2aWV3LmNvbXBvbmVudDtcbiAgICB9XG4gICAgcXVlcnlMaXN0LnJlc2V0KG5ld1ZhbHVlcyk7XG4gICAgdmFyIGJpbmRpbmdzID0gbm9kZURlZi5xdWVyeS5iaW5kaW5ncztcbiAgICB2YXIgbm90aWZ5ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICB2YXIgYm91bmRWYWx1ZSA9IHZvaWQgMDtcbiAgICAgICAgc3dpdGNoIChiaW5kaW5nLmJpbmRpbmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIDAgLyogRmlyc3QgKi86XG4gICAgICAgICAgICAgICAgYm91bmRWYWx1ZSA9IHF1ZXJ5TGlzdC5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMSAvKiBBbGwgKi86XG4gICAgICAgICAgICAgICAgYm91bmRWYWx1ZSA9IHF1ZXJ5TGlzdDtcbiAgICAgICAgICAgICAgICBub3RpZnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZUluc3RhbmNlW2JpbmRpbmcucHJvcE5hbWVdID0gYm91bmRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vdGlmeSkge1xuICAgICAgICBxdWVyeUxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2FsY1F1ZXJ5VmFsdWVzKHZpZXcsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBxdWVyeURlZiwgdmFsdWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZURlZiA9IHZpZXcuZGVmLm5vZGVzW2ldO1xuICAgICAgICB2YXIgdmFsdWVUeXBlID0gbm9kZURlZi5tYXRjaGVkUXVlcmllc1txdWVyeURlZi5pZF07XG4gICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goZ2V0UXVlcnlWYWx1ZSh2aWV3LCBub2RlRGVmLCB2YWx1ZVR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDEgLyogVHlwZUVsZW1lbnQgKi8gJiYgbm9kZURlZi5lbGVtZW50LnRlbXBsYXRlICYmXG4gICAgICAgICAgICAobm9kZURlZi5lbGVtZW50LnRlbXBsYXRlLm5vZGVNYXRjaGVkUXVlcmllcyAmIHF1ZXJ5RGVmLmZpbHRlcklkKSA9PT1cbiAgICAgICAgICAgICAgICBxdWVyeURlZi5maWx0ZXJJZCkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnREYXRhID0gYXNFbGVtZW50RGF0YSh2aWV3LCBpKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGVtYmVkZGVkIHZpZXdzIHRoYXQgd2VyZSBhdHRhY2hlZCBhdCB0aGUgcGxhY2Ugb2YgdGhlaXIgdGVtcGxhdGUsXG4gICAgICAgICAgICAvLyBidXQgcHJvY2VzcyBjaGlsZCBub2RlcyBmaXJzdCBpZiBzb21lIG1hdGNoIHRoZSBxdWVyeSAoc2VlIGlzc3VlICMxNjU2OClcbiAgICAgICAgICAgIGlmICgobm9kZURlZi5jaGlsZE1hdGNoZWRRdWVyaWVzICYgcXVlcnlEZWYuZmlsdGVySWQpID09PSBxdWVyeURlZi5maWx0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNhbGNRdWVyeVZhbHVlcyh2aWV3LCBpICsgMSwgaSArIG5vZGVEZWYuY2hpbGRDb3VudCwgcXVlcnlEZWYsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgaSArPSBub2RlRGVmLmNoaWxkQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDE2Nzc3MjE2IC8qIEVtYmVkZGVkVmlld3MgKi8pIHtcbiAgICAgICAgICAgICAgICB2YXIgZW1iZWRkZWRWaWV3cyA9IGVsZW1lbnREYXRhLnZpZXdDb250YWluZXIuX2VtYmVkZGVkVmlld3M7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbWJlZGRlZFZpZXdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbWJlZGRlZFZpZXcgPSBlbWJlZGRlZFZpZXdzW2tdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZHZjID0gZGVjbGFyZWRWaWV3Q29udGFpbmVyKGVtYmVkZGVkVmlldyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkdmMgJiYgZHZjID09PSBlbGVtZW50RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsY1F1ZXJ5VmFsdWVzKGVtYmVkZGVkVmlldywgMCwgZW1iZWRkZWRWaWV3LmRlZi5ub2Rlcy5sZW5ndGggLSAxLCBxdWVyeURlZiwgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwcm9qZWN0ZWRWaWV3cyA9IGVsZW1lbnREYXRhLnRlbXBsYXRlLl9wcm9qZWN0ZWRWaWV3cztcbiAgICAgICAgICAgIGlmIChwcm9qZWN0ZWRWaWV3cykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcHJvamVjdGVkVmlld3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2plY3RlZFZpZXcgPSBwcm9qZWN0ZWRWaWV3c1trXTtcbiAgICAgICAgICAgICAgICAgICAgY2FsY1F1ZXJ5VmFsdWVzKHByb2plY3RlZFZpZXcsIDAsIHByb2plY3RlZFZpZXcuZGVmLm5vZGVzLmxlbmd0aCAtIDEsIHF1ZXJ5RGVmLCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoKG5vZGVEZWYuY2hpbGRNYXRjaGVkUXVlcmllcyAmIHF1ZXJ5RGVmLmZpbHRlcklkKSAhPT0gcXVlcnlEZWYuZmlsdGVySWQpIHtcbiAgICAgICAgICAgIC8vIGlmIG5vIGNoaWxkIG1hdGNoZXMgdGhlIHF1ZXJ5LCBza2lwIHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICAgIGkgKz0gbm9kZURlZi5jaGlsZENvdW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59XG5mdW5jdGlvbiBnZXRRdWVyeVZhbHVlKHZpZXcsIG5vZGVEZWYsIHF1ZXJ5VmFsdWVUeXBlKSB7XG4gICAgaWYgKHF1ZXJ5VmFsdWVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgLy8gYSBtYXRjaFxuICAgICAgICBzd2l0Y2ggKHF1ZXJ5VmFsdWVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogUmVuZGVyRWxlbWVudCAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNFbGVtZW50RGF0YSh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCkucmVuZGVyRWxlbWVudDtcbiAgICAgICAgICAgIGNhc2UgMCAvKiBFbGVtZW50UmVmICovOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudFJlZihhc0VsZW1lbnREYXRhKHZpZXcsIG5vZGVEZWYubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50KTtcbiAgICAgICAgICAgIGNhc2UgMiAvKiBUZW1wbGF0ZVJlZiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNFbGVtZW50RGF0YSh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCkudGVtcGxhdGU7XG4gICAgICAgICAgICBjYXNlIDMgLyogVmlld0NvbnRhaW5lclJlZiAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNFbGVtZW50RGF0YSh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCkudmlld0NvbnRhaW5lcjtcbiAgICAgICAgICAgIGNhc2UgNCAvKiBQcm92aWRlciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNQcm92aWRlckRhdGEodmlldywgbm9kZURlZi5ub2RlSW5kZXgpLmluc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBuZ0NvbnRlbnREZWYobmdDb250ZW50SW5kZXgsIGluZGV4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gd2lsbCBiZXQgc2V0IGJ5IHRoZSB2aWV3IGRlZmluaXRpb25cbiAgICAgICAgbm9kZUluZGV4OiAtMSxcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICByZW5kZXJQYXJlbnQ6IG51bGwsXG4gICAgICAgIGJpbmRpbmdJbmRleDogLTEsXG4gICAgICAgIG91dHB1dEluZGV4OiAtMSxcbiAgICAgICAgLy8gcmVndWxhciB2YWx1ZXNcbiAgICAgICAgY2hlY2tJbmRleDogLTEsXG4gICAgICAgIGZsYWdzOiA4IC8qIFR5cGVOZ0NvbnRlbnQgKi8sXG4gICAgICAgIGNoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGRpcmVjdENoaWxkRmxhZ3M6IDAsXG4gICAgICAgIGNoaWxkTWF0Y2hlZFF1ZXJpZXM6IDAsXG4gICAgICAgIG1hdGNoZWRRdWVyaWVzOiB7fSxcbiAgICAgICAgbWF0Y2hlZFF1ZXJ5SWRzOiAwLFxuICAgICAgICByZWZlcmVuY2VzOiB7fSwgbmdDb250ZW50SW5kZXg6IG5nQ29udGVudEluZGV4LFxuICAgICAgICBjaGlsZENvdW50OiAwLFxuICAgICAgICBiaW5kaW5nczogW10sXG4gICAgICAgIGJpbmRpbmdGbGFnczogMCxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgICAgIHByb3ZpZGVyOiBudWxsLFxuICAgICAgICB0ZXh0OiBudWxsLFxuICAgICAgICBxdWVyeTogbnVsbCxcbiAgICAgICAgbmdDb250ZW50OiB7IGluZGV4OiBpbmRleCB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFwcGVuZE5nQ29udGVudCh2aWV3LCByZW5kZXJIb3N0LCBkZWYpIHtcbiAgICB2YXIgcGFyZW50RWwgPSBnZXRQYXJlbnRSZW5kZXJFbGVtZW50KHZpZXcsIHJlbmRlckhvc3QsIGRlZik7XG4gICAgaWYgKCFwYXJlbnRFbCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBlbGVtZW50LlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuZ0NvbnRlbnRJbmRleCA9IGRlZi5uZ0NvbnRlbnQuaW5kZXg7XG4gICAgdmlzaXRQcm9qZWN0ZWRSZW5kZXJOb2Rlcyh2aWV3LCBuZ0NvbnRlbnRJbmRleCwgMSAvKiBBcHBlbmRDaGlsZCAqLywgcGFyZW50RWwsIG51bGwsIHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHB1cmVQaXBlRGVmKGNoZWNrSW5kZXgsIGFyZ0NvdW50KSB7XG4gICAgLy8gYXJnQ291bnQgKyAxIHRvIGluY2x1ZGUgdGhlIHBpcGUgYXMgZmlyc3QgYXJnXG4gICAgcmV0dXJuIF9wdXJlRXhwcmVzc2lvbkRlZigxMjggLyogVHlwZVB1cmVQaXBlICovLCBjaGVja0luZGV4LCBuZXcgQXJyYXkoYXJnQ291bnQgKyAxKSk7XG59XG5mdW5jdGlvbiBwdXJlQXJyYXlEZWYoY2hlY2tJbmRleCwgYXJnQ291bnQpIHtcbiAgICByZXR1cm4gX3B1cmVFeHByZXNzaW9uRGVmKDMyIC8qIFR5cGVQdXJlQXJyYXkgKi8sIGNoZWNrSW5kZXgsIG5ldyBBcnJheShhcmdDb3VudCkpO1xufVxuZnVuY3Rpb24gcHVyZU9iamVjdERlZihjaGVja0luZGV4LCBwcm9wVG9JbmRleCkge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocHJvcFRvSW5kZXgpO1xuICAgIHZhciBuYktleXMgPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheShuYktleXMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmJLZXlzOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBpbmRleCA9IHByb3BUb0luZGV4W2tleV07XG4gICAgICAgIHByb3BlcnR5TmFtZXNbaW5kZXhdID0ga2V5O1xuICAgIH1cbiAgICByZXR1cm4gX3B1cmVFeHByZXNzaW9uRGVmKDY0IC8qIFR5cGVQdXJlT2JqZWN0ICovLCBjaGVja0luZGV4LCBwcm9wZXJ0eU5hbWVzKTtcbn1cbmZ1bmN0aW9uIF9wdXJlRXhwcmVzc2lvbkRlZihmbGFncywgY2hlY2tJbmRleCwgcHJvcGVydHlOYW1lcykge1xuICAgIHZhciBiaW5kaW5ncyA9IG5ldyBBcnJheShwcm9wZXJ0eU5hbWVzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwcm9wID0gcHJvcGVydHlOYW1lc1tpXTtcbiAgICAgICAgYmluZGluZ3NbaV0gPSB7XG4gICAgICAgICAgICBmbGFnczogOCAvKiBUeXBlUHJvcGVydHkgKi8sXG4gICAgICAgICAgICBuYW1lOiBwcm9wLFxuICAgICAgICAgICAgbnM6IG51bGwsXG4gICAgICAgICAgICBub25NaW5pZmllZE5hbWU6IHByb3AsXG4gICAgICAgICAgICBzZWN1cml0eUNvbnRleHQ6IG51bGwsXG4gICAgICAgICAgICBzdWZmaXg6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gd2lsbCBiZXQgc2V0IGJ5IHRoZSB2aWV3IGRlZmluaXRpb25cbiAgICAgICAgbm9kZUluZGV4OiAtMSxcbiAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICByZW5kZXJQYXJlbnQ6IG51bGwsXG4gICAgICAgIGJpbmRpbmdJbmRleDogLTEsXG4gICAgICAgIG91dHB1dEluZGV4OiAtMSxcbiAgICAgICAgLy8gcmVndWxhciB2YWx1ZXNcbiAgICAgICAgY2hlY2tJbmRleDogY2hlY2tJbmRleCxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICBjaGlsZEZsYWdzOiAwLFxuICAgICAgICBkaXJlY3RDaGlsZEZsYWdzOiAwLFxuICAgICAgICBjaGlsZE1hdGNoZWRRdWVyaWVzOiAwLFxuICAgICAgICBtYXRjaGVkUXVlcmllczoge30sXG4gICAgICAgIG1hdGNoZWRRdWVyeUlkczogMCxcbiAgICAgICAgcmVmZXJlbmNlczoge30sXG4gICAgICAgIG5nQ29udGVudEluZGV4OiAtMSxcbiAgICAgICAgY2hpbGRDb3VudDogMCwgYmluZGluZ3M6IGJpbmRpbmdzLFxuICAgICAgICBiaW5kaW5nRmxhZ3M6IGNhbGNCaW5kaW5nRmxhZ3MoYmluZGluZ3MpLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXI6IG51bGwsXG4gICAgICAgIHRleHQ6IG51bGwsXG4gICAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgICBuZ0NvbnRlbnQ6IG51bGxcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUHVyZUV4cHJlc3Npb24odmlldywgZGVmKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xufVxuZnVuY3Rpb24gY2hlY2tBbmRVcGRhdGVQdXJlRXhwcmVzc2lvbklubGluZSh2aWV3LCBkZWYsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KSB7XG4gICAgdmFyIGJpbmRpbmdzID0gZGVmLmJpbmRpbmdzO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIGJpbmRMZW4gPSBiaW5kaW5ncy5sZW5ndGg7XG4gICAgaWYgKGJpbmRMZW4gPiAwICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDAsIHYwKSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiAxICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDEsIHYxKSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiAyICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDIsIHYyKSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiAzICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDMsIHYzKSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA0ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDQsIHY0KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA1ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDUsIHY1KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA2ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDYsIHY2KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA3ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDcsIHY3KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA4ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDgsIHY4KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGJpbmRMZW4gPiA5ICYmIGNoZWNrQW5kVXBkYXRlQmluZGluZyh2aWV3LCBkZWYsIDksIHY5KSlcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhc1B1cmVFeHByZXNzaW9uRGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgICBzd2l0Y2ggKGRlZi5mbGFncyAmIDIwMTM0NzA2NyAvKiBUeXBlcyAqLykge1xuICAgICAgICAgICAgY2FzZSAzMiAvKiBUeXBlUHVyZUFycmF5ICovOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IEFycmF5KGJpbmRpbmdzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiAwKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVswXSA9IHYwO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gMSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbMV0gPSB2MTtcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDIpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlWzJdID0gdjI7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiAzKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVszXSA9IHYzO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gNClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbNF0gPSB2NDtcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDUpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlWzVdID0gdjU7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiA2KVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVs2XSA9IHY2O1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gNylcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbN10gPSB2NztcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDgpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlWzhdID0gdjg7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiA5KVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVs5XSA9IHY5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NCAvKiBUeXBlUHVyZU9iamVjdCAqLzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gMClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbYmluZGluZ3NbMF0ubmFtZV0gPSB2MDtcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDEpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW2JpbmRpbmdzWzFdLm5hbWVdID0gdjE7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiAyKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtiaW5kaW5nc1syXS5uYW1lXSA9IHYyO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gMylcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbYmluZGluZ3NbM10ubmFtZV0gPSB2MztcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDQpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW2JpbmRpbmdzWzRdLm5hbWVdID0gdjQ7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiA1KVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtiaW5kaW5nc1s1XS5uYW1lXSA9IHY1O1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gNilcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbYmluZGluZ3NbNl0ubmFtZV0gPSB2NjtcbiAgICAgICAgICAgICAgICBpZiAoYmluZExlbiA+IDcpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW2JpbmRpbmdzWzddLm5hbWVdID0gdjc7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRMZW4gPiA4KVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtiaW5kaW5nc1s4XS5uYW1lXSA9IHY4O1xuICAgICAgICAgICAgICAgIGlmIChiaW5kTGVuID4gOSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbYmluZGluZ3NbOV0ubmFtZV0gPSB2OTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI4IC8qIFR5cGVQdXJlUGlwZSAqLzpcbiAgICAgICAgICAgICAgICB2YXIgcGlwZSA9IHYwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYmluZExlbikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxLCB2Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwaXBlLnRyYW5zZm9ybSh2MSwgdjIsIHYzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0LCB2NSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwaXBlLnRyYW5zZm9ybSh2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBpcGUudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS50cmFuc2Zvcm0odjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlUHVyZUV4cHJlc3Npb25EeW5hbWljKHZpZXcsIGRlZiwgdmFsdWVzKSB7XG4gICAgdmFyIGJpbmRpbmdzID0gZGVmLmJpbmRpbmdzO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBsb29wIG92ZXIgYWxsIHZhbHVlcywgc28gdGhhdFxuICAgICAgICAvLyB0aGUgb2xkIHZhbHVlcyBhcmUgdXBkYXRlcyBhcyB3ZWxsIVxuICAgICAgICBpZiAoY2hlY2tBbmRVcGRhdGVCaW5kaW5nKHZpZXcsIGRlZiwgaSwgdmFsdWVzW2ldKSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhc1B1cmVFeHByZXNzaW9uRGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KTtcbiAgICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgICBzd2l0Y2ggKGRlZi5mbGFncyAmIDIwMTM0NzA2NyAvKiBUeXBlcyAqLykge1xuICAgICAgICAgICAgY2FzZSAzMiAvKiBUeXBlUHVyZUFycmF5ICovOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NCAvKiBUeXBlUHVyZU9iamVjdCAqLzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW2JpbmRpbmdzW2ldLm5hbWVdID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTI4IC8qIFR5cGVQdXJlUGlwZSAqLzpcbiAgICAgICAgICAgICAgICB2YXIgcGlwZSA9IHZhbHVlc1swXTtcbiAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gdmFsdWVzLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcGlwZS50cmFuc2Zvcm0uYXBwbHkocGlwZSwgX19zcHJlYWQocGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gdGV4dERlZihjaGVja0luZGV4LCBuZ0NvbnRlbnRJbmRleCwgc3RhdGljVGV4dCkge1xuICAgIHZhciBiaW5kaW5ncyA9IG5ldyBBcnJheShzdGF0aWNUZXh0Lmxlbmd0aCAtIDEpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgc3RhdGljVGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBiaW5kaW5nc1tpIC0gMV0gPSB7XG4gICAgICAgICAgICBmbGFnczogOCAvKiBUeXBlUHJvcGVydHkgKi8sXG4gICAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgICAgbnM6IG51bGwsXG4gICAgICAgICAgICBub25NaW5pZmllZE5hbWU6IG51bGwsXG4gICAgICAgICAgICBzZWN1cml0eUNvbnRleHQ6IG51bGwsXG4gICAgICAgICAgICBzdWZmaXg6IHN0YXRpY1RleHRbaV0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIHdpbGwgYmV0IHNldCBieSB0aGUgdmlldyBkZWZpbml0aW9uXG4gICAgICAgIG5vZGVJbmRleDogLTEsXG4gICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgcmVuZGVyUGFyZW50OiBudWxsLFxuICAgICAgICBiaW5kaW5nSW5kZXg6IC0xLFxuICAgICAgICBvdXRwdXRJbmRleDogLTEsXG4gICAgICAgIC8vIHJlZ3VsYXIgdmFsdWVzXG4gICAgICAgIGNoZWNrSW5kZXg6IGNoZWNrSW5kZXgsXG4gICAgICAgIGZsYWdzOiAyIC8qIFR5cGVUZXh0ICovLFxuICAgICAgICBjaGlsZEZsYWdzOiAwLFxuICAgICAgICBkaXJlY3RDaGlsZEZsYWdzOiAwLFxuICAgICAgICBjaGlsZE1hdGNoZWRRdWVyaWVzOiAwLFxuICAgICAgICBtYXRjaGVkUXVlcmllczoge30sXG4gICAgICAgIG1hdGNoZWRRdWVyeUlkczogMCxcbiAgICAgICAgcmVmZXJlbmNlczoge30sIG5nQ29udGVudEluZGV4OiBuZ0NvbnRlbnRJbmRleCxcbiAgICAgICAgY2hpbGRDb3VudDogMCwgYmluZGluZ3M6IGJpbmRpbmdzLFxuICAgICAgICBiaW5kaW5nRmxhZ3M6IDggLyogVHlwZVByb3BlcnR5ICovLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZWxlbWVudDogbnVsbCxcbiAgICAgICAgcHJvdmlkZXI6IG51bGwsXG4gICAgICAgIHRleHQ6IHsgcHJlZml4OiBzdGF0aWNUZXh0WzBdIH0sXG4gICAgICAgIHF1ZXJ5OiBudWxsLFxuICAgICAgICBuZ0NvbnRlbnQ6IG51bGwsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHQodmlldywgcmVuZGVySG9zdCwgZGVmKSB7XG4gICAgdmFyIHJlbmRlck5vZGU7XG4gICAgdmFyIHJlbmRlcmVyID0gdmlldy5yZW5kZXJlcjtcbiAgICByZW5kZXJOb2RlID0gcmVuZGVyZXIuY3JlYXRlVGV4dChkZWYudGV4dC5wcmVmaXgpO1xuICAgIHZhciBwYXJlbnRFbCA9IGdldFBhcmVudFJlbmRlckVsZW1lbnQodmlldywgcmVuZGVySG9zdCwgZGVmKTtcbiAgICBpZiAocGFyZW50RWwpIHtcbiAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50RWwsIHJlbmRlck5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4geyByZW5kZXJUZXh0OiByZW5kZXJOb2RlIH07XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVRleHRJbmxpbmUodmlldywgZGVmLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSkge1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIGJpbmRpbmdzID0gZGVmLmJpbmRpbmdzO1xuICAgIHZhciBiaW5kTGVuID0gYmluZGluZ3MubGVuZ3RoO1xuICAgIGlmIChiaW5kTGVuID4gMCAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCAwLCB2MCkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gMSAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCAxLCB2MSkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gMiAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCAyLCB2MikpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gMyAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCAzLCB2MykpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gNCAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA0LCB2NCkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gNSAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA1LCB2NSkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gNiAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA2LCB2NikpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gNyAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA3LCB2NykpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gOCAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA4LCB2OCkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChiaW5kTGVuID4gOSAmJiBjaGVja0FuZFVwZGF0ZUJpbmRpbmcodmlldywgZGVmLCA5LCB2OSkpXG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGRlZi50ZXh0LnByZWZpeDtcbiAgICAgICAgaWYgKGJpbmRMZW4gPiAwKVxuICAgICAgICAgICAgdmFsdWUgKz0gX2FkZEludGVycG9sYXRpb25QYXJ0KHYwLCBiaW5kaW5nc1swXSk7XG4gICAgICAgIGlmIChiaW5kTGVuID4gMSlcbiAgICAgICAgICAgIHZhbHVlICs9IF9hZGRJbnRlcnBvbGF0aW9uUGFydCh2MSwgYmluZGluZ3NbMV0pO1xuICAgICAgICBpZiAoYmluZExlbiA+IDIpXG4gICAgICAgICAgICB2YWx1ZSArPSBfYWRkSW50ZXJwb2xhdGlvblBhcnQodjIsIGJpbmRpbmdzWzJdKTtcbiAgICAgICAgaWYgKGJpbmRMZW4gPiAzKVxuICAgICAgICAgICAgdmFsdWUgKz0gX2FkZEludGVycG9sYXRpb25QYXJ0KHYzLCBiaW5kaW5nc1szXSk7XG4gICAgICAgIGlmIChiaW5kTGVuID4gNClcbiAgICAgICAgICAgIHZhbHVlICs9IF9hZGRJbnRlcnBvbGF0aW9uUGFydCh2NCwgYmluZGluZ3NbNF0pO1xuICAgICAgICBpZiAoYmluZExlbiA+IDUpXG4gICAgICAgICAgICB2YWx1ZSArPSBfYWRkSW50ZXJwb2xhdGlvblBhcnQodjUsIGJpbmRpbmdzWzVdKTtcbiAgICAgICAgaWYgKGJpbmRMZW4gPiA2KVxuICAgICAgICAgICAgdmFsdWUgKz0gX2FkZEludGVycG9sYXRpb25QYXJ0KHY2LCBiaW5kaW5nc1s2XSk7XG4gICAgICAgIGlmIChiaW5kTGVuID4gNylcbiAgICAgICAgICAgIHZhbHVlICs9IF9hZGRJbnRlcnBvbGF0aW9uUGFydCh2NywgYmluZGluZ3NbN10pO1xuICAgICAgICBpZiAoYmluZExlbiA+IDgpXG4gICAgICAgICAgICB2YWx1ZSArPSBfYWRkSW50ZXJwb2xhdGlvblBhcnQodjgsIGJpbmRpbmdzWzhdKTtcbiAgICAgICAgaWYgKGJpbmRMZW4gPiA5KVxuICAgICAgICAgICAgdmFsdWUgKz0gX2FkZEludGVycG9sYXRpb25QYXJ0KHY5LCBiaW5kaW5nc1s5XSk7XG4gICAgICAgIHZhciByZW5kZXJOb2RlID0gYXNUZXh0RGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KS5yZW5kZXJUZXh0O1xuICAgICAgICB2aWV3LnJlbmRlcmVyLnNldFZhbHVlKHJlbmRlck5vZGUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVRleHREeW5hbWljKHZpZXcsIGRlZiwgdmFsdWVzKSB7XG4gICAgdmFyIGJpbmRpbmdzID0gZGVmLmJpbmRpbmdzO1xuICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBsb29wIG92ZXIgYWxsIHZhbHVlcywgc28gdGhhdFxuICAgICAgICAvLyB0aGUgb2xkIHZhbHVlcyBhcmUgdXBkYXRlcyBhcyB3ZWxsIVxuICAgICAgICBpZiAoY2hlY2tBbmRVcGRhdGVCaW5kaW5nKHZpZXcsIGRlZiwgaSwgdmFsdWVzW2ldKSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgX2FkZEludGVycG9sYXRpb25QYXJ0KHZhbHVlc1tpXSwgYmluZGluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gZGVmLnRleHQucHJlZml4ICsgdmFsdWU7XG4gICAgICAgIHZhciByZW5kZXJOb2RlID0gYXNUZXh0RGF0YSh2aWV3LCBkZWYubm9kZUluZGV4KS5yZW5kZXJUZXh0O1xuICAgICAgICB2aWV3LnJlbmRlcmVyLnNldFZhbHVlKHJlbmRlck5vZGUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG59XG5mdW5jdGlvbiBfYWRkSW50ZXJwb2xhdGlvblBhcnQodmFsdWUsIGJpbmRpbmcpIHtcbiAgICB2YXIgdmFsdWVTdHIgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6ICcnO1xuICAgIHJldHVybiB2YWx1ZVN0ciArIGJpbmRpbmcuc3VmZml4O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiB2aWV3RGVmKGZsYWdzLCBub2RlcywgdXBkYXRlRGlyZWN0aXZlcywgdXBkYXRlUmVuZGVyZXIpIHtcbiAgICAvLyBjbG9uZSBub2RlcyBhbmQgc2V0IGF1dG8gY2FsY3VsYXRlZCB2YWx1ZXNcbiAgICB2YXIgdmlld0JpbmRpbmdDb3VudCA9IDA7XG4gICAgdmFyIHZpZXdEaXNwb3NhYmxlQ291bnQgPSAwO1xuICAgIHZhciB2aWV3Tm9kZUZsYWdzID0gMDtcbiAgICB2YXIgdmlld1Jvb3ROb2RlRmxhZ3MgPSAwO1xuICAgIHZhciB2aWV3TWF0Y2hlZFF1ZXJpZXMgPSAwO1xuICAgIHZhciBjdXJyZW50UGFyZW50ID0gbnVsbDtcbiAgICB2YXIgY3VycmVudFJlbmRlclBhcmVudCA9IG51bGw7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50SGFzUHVibGljUHJvdmlkZXJzID0gZmFsc2U7XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50SGFzUHJpdmF0ZVByb3ZpZGVycyA9IGZhbHNlO1xuICAgIHZhciBsYXN0UmVuZGVyUm9vdE5vZGUgPSBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgbm9kZS5ub2RlSW5kZXggPSBpO1xuICAgICAgICBub2RlLnBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7XG4gICAgICAgIG5vZGUuYmluZGluZ0luZGV4ID0gdmlld0JpbmRpbmdDb3VudDtcbiAgICAgICAgbm9kZS5vdXRwdXRJbmRleCA9IHZpZXdEaXNwb3NhYmxlQ291bnQ7XG4gICAgICAgIG5vZGUucmVuZGVyUGFyZW50ID0gY3VycmVudFJlbmRlclBhcmVudDtcbiAgICAgICAgdmlld05vZGVGbGFncyB8PSBub2RlLmZsYWdzO1xuICAgICAgICB2aWV3TWF0Y2hlZFF1ZXJpZXMgfD0gbm9kZS5tYXRjaGVkUXVlcnlJZHM7XG4gICAgICAgIGlmIChub2RlLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBlbERlZiA9IG5vZGUuZWxlbWVudDtcbiAgICAgICAgICAgIGVsRGVmLnB1YmxpY1Byb3ZpZGVycyA9XG4gICAgICAgICAgICAgICAgY3VycmVudFBhcmVudCA/IGN1cnJlbnRQYXJlbnQuZWxlbWVudC5wdWJsaWNQcm92aWRlcnMgOiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgZWxEZWYuYWxsUHJvdmlkZXJzID0gZWxEZWYucHVibGljUHJvdmlkZXJzO1xuICAgICAgICAgICAgLy8gTm90ZTogV2UgYXNzdW1lIHRoYXQgYWxsIHByb3ZpZGVycyBvZiBhbiBlbGVtZW50IGFyZSBiZWZvcmUgYW55IGNoaWxkIGVsZW1lbnQhXG4gICAgICAgICAgICBjdXJyZW50RWxlbWVudEhhc1B1YmxpY1Byb3ZpZGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgY3VycmVudEVsZW1lbnRIYXNQcml2YXRlUHJvdmlkZXJzID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAobm9kZS5lbGVtZW50LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgdmlld01hdGNoZWRRdWVyaWVzIHw9IG5vZGUuZWxlbWVudC50ZW1wbGF0ZS5ub2RlTWF0Y2hlZFF1ZXJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVOb2RlKGN1cnJlbnRQYXJlbnQsIG5vZGUsIG5vZGVzLmxlbmd0aCk7XG4gICAgICAgIHZpZXdCaW5kaW5nQ291bnQgKz0gbm9kZS5iaW5kaW5ncy5sZW5ndGg7XG4gICAgICAgIHZpZXdEaXNwb3NhYmxlQ291bnQgKz0gbm9kZS5vdXRwdXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKCFjdXJyZW50UmVuZGVyUGFyZW50ICYmIChub2RlLmZsYWdzICYgMyAvKiBDYXRSZW5kZXJOb2RlICovKSkge1xuICAgICAgICAgICAgbGFzdFJlbmRlclJvb3ROb2RlID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mbGFncyAmIDIwMjI0IC8qIENhdFByb3ZpZGVyICovKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50SGFzUHVibGljUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRIYXNQdWJsaWNQcm92aWRlcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIFVzZSBwcm90b3R5cGljYWwgaW5oZXJpdGFuY2UgdG8gbm90IGdldCBPKG5eMikgY29tcGxleGl0eS4uLlxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuZWxlbWVudC5wdWJsaWNQcm92aWRlcnMgPVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuY3JlYXRlKGN1cnJlbnRQYXJlbnQuZWxlbWVudC5wdWJsaWNQcm92aWRlcnMpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuZWxlbWVudC5hbGxQcm92aWRlcnMgPSBjdXJyZW50UGFyZW50LmVsZW1lbnQucHVibGljUHJvdmlkZXJzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzUHJpdmF0ZVNlcnZpY2UgPSAobm9kZS5mbGFncyAmIDgxOTIgLyogUHJpdmF0ZVByb3ZpZGVyICovKSAhPT0gMDtcbiAgICAgICAgICAgIHZhciBpc0NvbXBvbmVudCA9IChub2RlLmZsYWdzICYgMzI3NjggLyogQ29tcG9uZW50ICovKSAhPT0gMDtcbiAgICAgICAgICAgIGlmICghaXNQcml2YXRlU2VydmljZSB8fCBpc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuZWxlbWVudC5wdWJsaWNQcm92aWRlcnNbdG9rZW5LZXkobm9kZS5wcm92aWRlci50b2tlbildID0gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnRIYXNQcml2YXRlUHJvdmlkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50SGFzUHJpdmF0ZVByb3ZpZGVycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBwcm90b3R5cGljYWwgaW5oZXJpdGFuY2UgdG8gbm90IGdldCBPKG5eMikgY29tcGxleGl0eS4uLlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50LmVsZW1lbnQuYWxsUHJvdmlkZXJzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jcmVhdGUoY3VycmVudFBhcmVudC5lbGVtZW50LnB1YmxpY1Byb3ZpZGVycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuZWxlbWVudC5hbGxQcm92aWRlcnNbdG9rZW5LZXkobm9kZS5wcm92aWRlci50b2tlbildID0gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuZWxlbWVudC5jb21wb25lbnRQcm92aWRlciA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRGbGFncyB8PSBub2RlLmZsYWdzO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudC5kaXJlY3RDaGlsZEZsYWdzIHw9IG5vZGUuZmxhZ3M7XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50LmNoaWxkTWF0Y2hlZFF1ZXJpZXMgfD0gbm9kZS5tYXRjaGVkUXVlcnlJZHM7XG4gICAgICAgICAgICBpZiAobm9kZS5lbGVtZW50ICYmIG5vZGUuZWxlbWVudC50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQuY2hpbGRNYXRjaGVkUXVlcmllcyB8PSBub2RlLmVsZW1lbnQudGVtcGxhdGUubm9kZU1hdGNoZWRRdWVyaWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmlld1Jvb3ROb2RlRmxhZ3MgfD0gbm9kZS5mbGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGlsZENvdW50ID4gMCkge1xuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IG5vZGU7XG4gICAgICAgICAgICBpZiAoIWlzTmdDb250YWluZXIobm9kZSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmVuZGVyUGFyZW50ID0gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgbm9kZSBoYXMgbm8gY2hpbGRyZW4sIGNoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQuXG4gICAgICAgICAgICAvLyBXaGVuIGl0IGlzLCBwcm9wYWdhdGUgdGhlIGZsYWdzIHVwLlxuICAgICAgICAgICAgLy8gVGhlIGxvb3AgaXMgcmVxdWlyZWQgYmVjYXVzZSBhbiBlbGVtZW50IGNvdWxkIGJlIHRoZSBsYXN0IHRyYW5zaXRpdmUgY2hpbGRyZW4gb2Ygc2V2ZXJhbFxuICAgICAgICAgICAgLy8gZWxlbWVudHMuIFdlIGxvb3AgdG8gZWl0aGVyIHRoZSByb290IG9yIHRoZSBoaWdoZXN0IG9wZW5lZCBlbGVtZW50ICg9IHdpdGggcmVtYWluaW5nXG4gICAgICAgICAgICAvLyBjaGlsZHJlbilcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50ICYmIGkgPT09IGN1cnJlbnRQYXJlbnQubm9kZUluZGV4ICsgY3VycmVudFBhcmVudC5jaGlsZENvdW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1BhcmVudCA9IGN1cnJlbnRQYXJlbnQucGFyZW50O1xuICAgICAgICAgICAgICAgIGlmIChuZXdQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50LmNoaWxkRmxhZ3MgfD0gY3VycmVudFBhcmVudC5jaGlsZEZsYWdzO1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXJlbnQuY2hpbGRNYXRjaGVkUXVlcmllcyB8PSBjdXJyZW50UGFyZW50LmNoaWxkTWF0Y2hlZFF1ZXJpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBuZXdQYXJlbnQ7XG4gICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgcmVuZGVyIHBhcmVudCAmIGFjY291bnQgZm9yIG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFyZW50ICYmIGlzTmdDb250YWluZXIoY3VycmVudFBhcmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlbmRlclBhcmVudCA9IGN1cnJlbnRQYXJlbnQucmVuZGVyUGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFJlbmRlclBhcmVudCA9IGN1cnJlbnRQYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBoYW5kbGVFdmVudCA9IGZ1bmN0aW9uICh2aWV3LCBub2RlSW5kZXgsIGV2ZW50TmFtZSwgZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVzW25vZGVJbmRleF0uZWxlbWVudC5oYW5kbGVFdmVudCh2aWV3LCBldmVudE5hbWUsIGV2ZW50KTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFdpbGwgYmUgZmlsbGVkIGxhdGVyLi4uXG4gICAgICAgIGZhY3Rvcnk6IG51bGwsXG4gICAgICAgIG5vZGVGbGFnczogdmlld05vZGVGbGFncyxcbiAgICAgICAgcm9vdE5vZGVGbGFnczogdmlld1Jvb3ROb2RlRmxhZ3MsXG4gICAgICAgIG5vZGVNYXRjaGVkUXVlcmllczogdmlld01hdGNoZWRRdWVyaWVzLCBmbGFnczogZmxhZ3MsXG4gICAgICAgIG5vZGVzOiBub2RlcyxcbiAgICAgICAgdXBkYXRlRGlyZWN0aXZlczogdXBkYXRlRGlyZWN0aXZlcyB8fCBOT09QLFxuICAgICAgICB1cGRhdGVSZW5kZXJlcjogdXBkYXRlUmVuZGVyZXIgfHwgTk9PUCwgaGFuZGxlRXZlbnQ6IGhhbmRsZUV2ZW50LFxuICAgICAgICBiaW5kaW5nQ291bnQ6IHZpZXdCaW5kaW5nQ291bnQsXG4gICAgICAgIG91dHB1dENvdW50OiB2aWV3RGlzcG9zYWJsZUNvdW50LCBsYXN0UmVuZGVyUm9vdE5vZGU6IGxhc3RSZW5kZXJSb290Tm9kZVxuICAgIH07XG59XG5mdW5jdGlvbiBpc05nQ29udGFpbmVyKG5vZGUpIHtcbiAgICByZXR1cm4gKG5vZGUuZmxhZ3MgJiAxIC8qIFR5cGVFbGVtZW50ICovKSAhPT0gMCAmJiBub2RlLmVsZW1lbnQubmFtZSA9PT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTm9kZShwYXJlbnQsIG5vZGUsIG5vZGVDb3VudCkge1xuICAgIHZhciB0ZW1wbGF0ZSA9IG5vZGUuZWxlbWVudCAmJiBub2RlLmVsZW1lbnQudGVtcGxhdGU7XG4gICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghdGVtcGxhdGUubGFzdFJlbmRlclJvb3ROb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIFN0YXRlOiBFbWJlZGRlZCB0ZW1wbGF0ZXMgd2l0aG91dCBub2RlcyBhcmUgbm90IGFsbG93ZWQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5sYXN0UmVuZGVyUm9vdE5vZGUgJiZcbiAgICAgICAgICAgIHRlbXBsYXRlLmxhc3RSZW5kZXJSb290Tm9kZS5mbGFncyAmIDE2Nzc3MjE2IC8qIEVtYmVkZGVkVmlld3MgKi8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IExhc3Qgcm9vdCBub2RlIG9mIGEgdGVtcGxhdGUgY2FuJ3QgaGF2ZSBlbWJlZGRlZCB2aWV3cywgYXQgaW5kZXggXCIgKyBub2RlLm5vZGVJbmRleCArIFwiIVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5mbGFncyAmIDIwMjI0IC8qIENhdFByb3ZpZGVyICovKSB7XG4gICAgICAgIHZhciBwYXJlbnRGbGFncyA9IHBhcmVudCA/IHBhcmVudC5mbGFncyA6IDA7XG4gICAgICAgIGlmICgocGFyZW50RmxhZ3MgJiAxIC8qIFR5cGVFbGVtZW50ICovKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBTdGF0ZTogU3RhdGljUHJvdmlkZXIvRGlyZWN0aXZlIG5vZGVzIG5lZWQgdG8gYmUgY2hpbGRyZW4gb2YgZWxlbWVudHMgb3IgYW5jaG9ycywgYXQgaW5kZXggXCIgKyBub2RlLm5vZGVJbmRleCArIFwiIVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5xdWVyeSkge1xuICAgICAgICBpZiAobm9kZS5mbGFncyAmIDY3MTA4ODY0IC8qIFR5cGVDb250ZW50UXVlcnkgKi8gJiZcbiAgICAgICAgICAgICghcGFyZW50IHx8IChwYXJlbnQuZmxhZ3MgJiAxNjM4NCAvKiBUeXBlRGlyZWN0aXZlICovKSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IENvbnRlbnQgUXVlcnkgbm9kZXMgbmVlZCB0byBiZSBjaGlsZHJlbiBvZiBkaXJlY3RpdmVzLCBhdCBpbmRleCBcIiArIG5vZGUubm9kZUluZGV4ICsgXCIhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZsYWdzICYgMTM0MjE3NzI4IC8qIFR5cGVWaWV3UXVlcnkgKi8gJiYgcGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIFN0YXRlOiBWaWV3IFF1ZXJ5IG5vZGVzIGhhdmUgdG8gYmUgdG9wIGxldmVsIG5vZGVzLCBhdCBpbmRleCBcIiArIG5vZGUubm9kZUluZGV4ICsgXCIhXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLmNoaWxkQ291bnQpIHtcbiAgICAgICAgdmFyIHBhcmVudEVuZCA9IHBhcmVudCA/IHBhcmVudC5ub2RlSW5kZXggKyBwYXJlbnQuY2hpbGRDb3VudCA6IG5vZGVDb3VudCAtIDE7XG4gICAgICAgIGlmIChub2RlLm5vZGVJbmRleCA8PSBwYXJlbnRFbmQgJiYgbm9kZS5ub2RlSW5kZXggKyBub2RlLmNoaWxkQ291bnQgPiBwYXJlbnRFbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IGNoaWxkQ291bnQgb2Ygbm9kZSBsZWFkcyBvdXRzaWRlIG9mIHBhcmVudCwgYXQgaW5kZXggXCIgKyBub2RlLm5vZGVJbmRleCArIFwiIVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVtYmVkZGVkVmlldyhwYXJlbnQsIGFuY2hvckRlZiwgdmlld0RlZiwgY29udGV4dCkge1xuICAgIC8vIGVtYmVkZGVkIHZpZXdzIGFyZSBzZWVuIGFzIHNpYmxpbmdzIHRvIHRoZSBhbmNob3IsIHNvIHdlIG5lZWRcbiAgICAvLyB0byBnZXQgdGhlIHBhcmVudCBvZiB0aGUgYW5jaG9yIGFuZCB1c2UgaXQgYXMgcGFyZW50SW5kZXguXG4gICAgdmFyIHZpZXcgPSBjcmVhdGVWaWV3KHBhcmVudC5yb290LCBwYXJlbnQucmVuZGVyZXIsIHBhcmVudCwgYW5jaG9yRGVmLCB2aWV3RGVmKTtcbiAgICBpbml0Vmlldyh2aWV3LCBwYXJlbnQuY29tcG9uZW50LCBjb250ZXh0KTtcbiAgICBjcmVhdGVWaWV3Tm9kZXModmlldyk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5mdW5jdGlvbiBjcmVhdGVSb290Vmlldyhyb290LCBkZWYsIGNvbnRleHQpIHtcbiAgICB2YXIgdmlldyA9IGNyZWF0ZVZpZXcocm9vdCwgcm9vdC5yZW5kZXJlciwgbnVsbCwgbnVsbCwgZGVmKTtcbiAgICBpbml0Vmlldyh2aWV3LCBjb250ZXh0LCBjb250ZXh0KTtcbiAgICBjcmVhdGVWaWV3Tm9kZXModmlldyk7XG4gICAgcmV0dXJuIHZpZXc7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRWaWV3KHBhcmVudFZpZXcsIG5vZGVEZWYsIHZpZXdEZWYsIGhvc3RFbGVtZW50KSB7XG4gICAgdmFyIHJlbmRlcmVyVHlwZSA9IG5vZGVEZWYuZWxlbWVudC5jb21wb25lbnRSZW5kZXJlclR5cGU7XG4gICAgdmFyIGNvbXBSZW5kZXJlcjtcbiAgICBpZiAoIXJlbmRlcmVyVHlwZSkge1xuICAgICAgICBjb21wUmVuZGVyZXIgPSBwYXJlbnRWaWV3LnJvb3QucmVuZGVyZXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb21wUmVuZGVyZXIgPSBwYXJlbnRWaWV3LnJvb3QucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50LCByZW5kZXJlclR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVmlldyhwYXJlbnRWaWV3LnJvb3QsIGNvbXBSZW5kZXJlciwgcGFyZW50Vmlldywgbm9kZURlZi5lbGVtZW50LmNvbXBvbmVudFByb3ZpZGVyLCB2aWV3RGVmKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVZpZXcocm9vdCwgcmVuZGVyZXIsIHBhcmVudCwgcGFyZW50Tm9kZURlZiwgZGVmKSB7XG4gICAgdmFyIG5vZGVzID0gbmV3IEFycmF5KGRlZi5ub2Rlcy5sZW5ndGgpO1xuICAgIHZhciBkaXNwb3NhYmxlcyA9IGRlZi5vdXRwdXRDb3VudCA/IG5ldyBBcnJheShkZWYub3V0cHV0Q291bnQpIDogbnVsbDtcbiAgICB2YXIgdmlldyA9IHtcbiAgICAgICAgZGVmOiBkZWYsXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICB2aWV3Q29udGFpbmVyUGFyZW50OiBudWxsLCBwYXJlbnROb2RlRGVmOiBwYXJlbnROb2RlRGVmLFxuICAgICAgICBjb250ZXh0OiBudWxsLFxuICAgICAgICBjb21wb25lbnQ6IG51bGwsIG5vZGVzOiBub2RlcyxcbiAgICAgICAgc3RhdGU6IDEzIC8qIENhdEluaXQgKi8sIHJvb3Q6IHJvb3QsIHJlbmRlcmVyOiByZW5kZXJlcixcbiAgICAgICAgb2xkVmFsdWVzOiBuZXcgQXJyYXkoZGVmLmJpbmRpbmdDb3VudCksIGRpc3Bvc2FibGVzOiBkaXNwb3NhYmxlcyxcbiAgICAgICAgaW5pdEluZGV4OiAtMVxuICAgIH07XG4gICAgcmV0dXJuIHZpZXc7XG59XG5mdW5jdGlvbiBpbml0Vmlldyh2aWV3LCBjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICB2aWV3LmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB2aWV3LmNvbnRleHQgPSBjb250ZXh0O1xufVxuZnVuY3Rpb24gY3JlYXRlVmlld05vZGVzKHZpZXcpIHtcbiAgICB2YXIgcmVuZGVySG9zdDtcbiAgICBpZiAoaXNDb21wb25lbnRWaWV3KHZpZXcpKSB7XG4gICAgICAgIHZhciBob3N0RGVmID0gdmlldy5wYXJlbnROb2RlRGVmO1xuICAgICAgICByZW5kZXJIb3N0ID0gYXNFbGVtZW50RGF0YSh2aWV3LnBhcmVudCwgaG9zdERlZi5wYXJlbnQubm9kZUluZGV4KS5yZW5kZXJFbGVtZW50O1xuICAgIH1cbiAgICB2YXIgZGVmID0gdmlldy5kZWY7XG4gICAgdmFyIG5vZGVzID0gdmlldy5ub2RlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZi5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZURlZiA9IGRlZi5ub2Rlc1tpXTtcbiAgICAgICAgU2VydmljZXMuc2V0Q3VycmVudE5vZGUodmlldywgaSk7XG4gICAgICAgIHZhciBub2RlRGF0YSA9IHZvaWQgMDtcbiAgICAgICAgc3dpdGNoIChub2RlRGVmLmZsYWdzICYgMjAxMzQ3MDY3IC8qIFR5cGVzICovKSB7XG4gICAgICAgICAgICBjYXNlIDEgLyogVHlwZUVsZW1lbnQgKi86XG4gICAgICAgICAgICAgICAgdmFyIGVsID0gY3JlYXRlRWxlbWVudCh2aWV3LCByZW5kZXJIb3N0LCBub2RlRGVmKTtcbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDMzNTU0NDMyIC8qIENvbXBvbmVudFZpZXcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBWaWV3RGVmID0gcmVzb2x2ZURlZmluaXRpb24obm9kZURlZi5lbGVtZW50LmNvbXBvbmVudFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRWaWV3ID0gU2VydmljZXMuY3JlYXRlQ29tcG9uZW50Vmlldyh2aWV3LCBub2RlRGVmLCBjb21wVmlld0RlZiwgZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaXN0ZW5Ub0VsZW1lbnRPdXRwdXRzKHZpZXcsIGNvbXBvbmVudFZpZXcsIG5vZGVEZWYsIGVsKTtcbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyRWxlbWVudDogZWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFZpZXc6IGNvbXBvbmVudFZpZXcsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBub2RlRGVmLmVsZW1lbnQudGVtcGxhdGUgPyBjcmVhdGVUZW1wbGF0ZURhdGEodmlldywgbm9kZURlZikgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMTY3NzcyMTYgLyogRW1iZWRkZWRWaWV3cyAqLykge1xuICAgICAgICAgICAgICAgICAgICBub2RlRGF0YS52aWV3Q29udGFpbmVyID0gY3JlYXRlVmlld0NvbnRhaW5lckRhdGEodmlldywgbm9kZURlZiwgbm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMiAvKiBUeXBlVGV4dCAqLzpcbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IGNyZWF0ZVRleHQodmlldywgcmVuZGVySG9zdCwgbm9kZURlZik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDUxMiAvKiBUeXBlQ2xhc3NQcm92aWRlciAqLzpcbiAgICAgICAgICAgIGNhc2UgMTAyNCAvKiBUeXBlRmFjdG9yeVByb3ZpZGVyICovOlxuICAgICAgICAgICAgY2FzZSAyMDQ4IC8qIFR5cGVVc2VFeGlzdGluZ1Byb3ZpZGVyICovOlxuICAgICAgICAgICAgY2FzZSAyNTYgLyogVHlwZVZhbHVlUHJvdmlkZXIgKi86IHtcbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IG5vZGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZURhdGEgJiYgIShub2RlRGVmLmZsYWdzICYgNDA5NiAvKiBMYXp5UHJvdmlkZXIgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZVByb3ZpZGVySW5zdGFuY2Uodmlldywgbm9kZURlZik7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVEYXRhID0geyBpbnN0YW5jZTogaW5zdGFuY2UgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIDE2IC8qIFR5cGVQaXBlICovOiB7XG4gICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlUGlwZUluc3RhbmNlKHZpZXcsIG5vZGVEZWYpO1xuICAgICAgICAgICAgICAgIG5vZGVEYXRhID0geyBpbnN0YW5jZTogaW5zdGFuY2UgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgMTYzODQgLyogVHlwZURpcmVjdGl2ZSAqLzoge1xuICAgICAgICAgICAgICAgIG5vZGVEYXRhID0gbm9kZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGVEaXJlY3RpdmVJbnN0YW5jZSh2aWV3LCBub2RlRGVmKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZURhdGEgPSB7IGluc3RhbmNlOiBpbnN0YW5jZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDMyNzY4IC8qIENvbXBvbmVudCAqLykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcFZpZXcgPSBhc0VsZW1lbnREYXRhKHZpZXcsIG5vZGVEZWYucGFyZW50Lm5vZGVJbmRleCkuY29tcG9uZW50VmlldztcbiAgICAgICAgICAgICAgICAgICAgaW5pdFZpZXcoY29tcFZpZXcsIG5vZGVEYXRhLmluc3RhbmNlLCBub2RlRGF0YS5pbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAzMiAvKiBUeXBlUHVyZUFycmF5ICovOlxuICAgICAgICAgICAgY2FzZSA2NCAvKiBUeXBlUHVyZU9iamVjdCAqLzpcbiAgICAgICAgICAgIGNhc2UgMTI4IC8qIFR5cGVQdXJlUGlwZSAqLzpcbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IGNyZWF0ZVB1cmVFeHByZXNzaW9uKHZpZXcsIG5vZGVEZWYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA2NzEwODg2NCAvKiBUeXBlQ29udGVudFF1ZXJ5ICovOlxuICAgICAgICAgICAgY2FzZSAxMzQyMTc3MjggLyogVHlwZVZpZXdRdWVyeSAqLzpcbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IGNyZWF0ZVF1ZXJ5JDEoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgOCAvKiBUeXBlTmdDb250ZW50ICovOlxuICAgICAgICAgICAgICAgIGFwcGVuZE5nQ29udGVudCh2aWV3LCByZW5kZXJIb3N0LCBub2RlRGVmKTtcbiAgICAgICAgICAgICAgICAvLyBubyBydW50aW1lIGRhdGEgbmVlZGVkIGZvciBOZ0NvbnRlbnQuLi5cbiAgICAgICAgICAgICAgICBub2RlRGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2Rlc1tpXSA9IG5vZGVEYXRhO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgdGhlIFZpZXdEYXRhLm5vZGVzIG9mIGNvbXBvbmVudCB2aWV3cyBhZnRlciB3ZSBjcmVhdGVkIGV2ZXJ5dGhpbmcgZWxzZSxcbiAgICAvLyBzbyB0aGF0IGUuZy4gbmctY29udGVudCB3b3Jrc1xuICAgIGV4ZWNDb21wb25lbnRWaWV3c0FjdGlvbih2aWV3LCBWaWV3QWN0aW9uLkNyZWF0ZVZpZXdOb2Rlcyk7XG4gICAgLy8gZmlsbCBzdGF0aWMgY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgZXhlY1F1ZXJpZXNBY3Rpb24odmlldywgNjcxMDg4NjQgLyogVHlwZUNvbnRlbnRRdWVyeSAqLyB8IDEzNDIxNzcyOCAvKiBUeXBlVmlld1F1ZXJ5ICovLCAyNjg0MzU0NTYgLyogU3RhdGljUXVlcnkgKi8sIDAgLyogQ2hlY2tBbmRVcGRhdGUgKi8pO1xufVxuZnVuY3Rpb24gY2hlY2tOb0NoYW5nZXNWaWV3KHZpZXcpIHtcbiAgICBtYXJrUHJvamVjdGVkVmlld3NGb3JDaGVjayh2aWV3KTtcbiAgICBTZXJ2aWNlcy51cGRhdGVEaXJlY3RpdmVzKHZpZXcsIDEgLyogQ2hlY2tOb0NoYW5nZXMgKi8pO1xuICAgIGV4ZWNFbWJlZGRlZFZpZXdzQWN0aW9uKHZpZXcsIFZpZXdBY3Rpb24uQ2hlY2tOb0NoYW5nZXMpO1xuICAgIFNlcnZpY2VzLnVwZGF0ZVJlbmRlcmVyKHZpZXcsIDEgLyogQ2hlY2tOb0NoYW5nZXMgKi8pO1xuICAgIGV4ZWNDb21wb25lbnRWaWV3c0FjdGlvbih2aWV3LCBWaWV3QWN0aW9uLkNoZWNrTm9DaGFuZ2VzKTtcbiAgICAvLyBOb3RlOiBXZSBkb24ndCBjaGVjayBxdWVyaWVzIGZvciBjaGFuZ2VzIGFzIHdlIGRpZG4ndCBkbyB0aGlzIGluIHYyLnguXG4gICAgLy8gVE9ETyh0Ym9zY2gpOiBpbnZlc3RpZ2F0ZSBpZiB3ZSBjYW4gZW5hYmxlIHRoZSBjaGVjayBhZ2FpbiBpbiB2NS54IHdpdGggYSBuaWNlciBlcnJvciBtZXNzYWdlLlxuICAgIHZpZXcuc3RhdGUgJj0gfig2NCAvKiBDaGVja1Byb2plY3RlZFZpZXdzICovIHwgMzIgLyogQ2hlY2tQcm9qZWN0ZWRWaWV3ICovKTtcbn1cbmZ1bmN0aW9uIGNoZWNrQW5kVXBkYXRlVmlldyh2aWV3KSB7XG4gICAgaWYgKHZpZXcuc3RhdGUgJiAxIC8qIEJlZm9yZUZpcnN0Q2hlY2sgKi8pIHtcbiAgICAgICAgdmlldy5zdGF0ZSAmPSB+MSAvKiBCZWZvcmVGaXJzdENoZWNrICovO1xuICAgICAgICB2aWV3LnN0YXRlIHw9IDIgLyogRmlyc3RDaGVjayAqLztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZpZXcuc3RhdGUgJj0gfjIgLyogRmlyc3RDaGVjayAqLztcbiAgICB9XG4gICAgc2hpZnRJbml0U3RhdGUodmlldywgMCAvKiBJbml0U3RhdGVfQmVmb3JlSW5pdCAqLywgMjU2IC8qIEluaXRTdGF0ZV9DYWxsaW5nT25Jbml0ICovKTtcbiAgICBtYXJrUHJvamVjdGVkVmlld3NGb3JDaGVjayh2aWV3KTtcbiAgICBTZXJ2aWNlcy51cGRhdGVEaXJlY3RpdmVzKHZpZXcsIDAgLyogQ2hlY2tBbmRVcGRhdGUgKi8pO1xuICAgIGV4ZWNFbWJlZGRlZFZpZXdzQWN0aW9uKHZpZXcsIFZpZXdBY3Rpb24uQ2hlY2tBbmRVcGRhdGUpO1xuICAgIGV4ZWNRdWVyaWVzQWN0aW9uKHZpZXcsIDY3MTA4ODY0IC8qIFR5cGVDb250ZW50UXVlcnkgKi8sIDUzNjg3MDkxMiAvKiBEeW5hbWljUXVlcnkgKi8sIDAgLyogQ2hlY2tBbmRVcGRhdGUgKi8pO1xuICAgIHZhciBjYWxsSW5pdCA9IHNoaWZ0SW5pdFN0YXRlKHZpZXcsIDI1NiAvKiBJbml0U3RhdGVfQ2FsbGluZ09uSW5pdCAqLywgNTEyIC8qIEluaXRTdGF0ZV9DYWxsaW5nQWZ0ZXJDb250ZW50SW5pdCAqLyk7XG4gICAgY2FsbExpZmVjeWNsZUhvb2tzQ2hpbGRyZW5GaXJzdCh2aWV3LCAyMDk3MTUyIC8qIEFmdGVyQ29udGVudENoZWNrZWQgKi8gfCAoY2FsbEluaXQgPyAxMDQ4NTc2IC8qIEFmdGVyQ29udGVudEluaXQgKi8gOiAwKSk7XG4gICAgU2VydmljZXMudXBkYXRlUmVuZGVyZXIodmlldywgMCAvKiBDaGVja0FuZFVwZGF0ZSAqLyk7XG4gICAgZXhlY0NvbXBvbmVudFZpZXdzQWN0aW9uKHZpZXcsIFZpZXdBY3Rpb24uQ2hlY2tBbmRVcGRhdGUpO1xuICAgIGV4ZWNRdWVyaWVzQWN0aW9uKHZpZXcsIDEzNDIxNzcyOCAvKiBUeXBlVmlld1F1ZXJ5ICovLCA1MzY4NzA5MTIgLyogRHluYW1pY1F1ZXJ5ICovLCAwIC8qIENoZWNrQW5kVXBkYXRlICovKTtcbiAgICBjYWxsSW5pdCA9IHNoaWZ0SW5pdFN0YXRlKHZpZXcsIDUxMiAvKiBJbml0U3RhdGVfQ2FsbGluZ0FmdGVyQ29udGVudEluaXQgKi8sIDc2OCAvKiBJbml0U3RhdGVfQ2FsbGluZ0FmdGVyVmlld0luaXQgKi8pO1xuICAgIGNhbGxMaWZlY3ljbGVIb29rc0NoaWxkcmVuRmlyc3QodmlldywgODM4ODYwOCAvKiBBZnRlclZpZXdDaGVja2VkICovIHwgKGNhbGxJbml0ID8gNDE5NDMwNCAvKiBBZnRlclZpZXdJbml0ICovIDogMCkpO1xuICAgIGlmICh2aWV3LmRlZi5mbGFncyAmIDIgLyogT25QdXNoICovKSB7XG4gICAgICAgIHZpZXcuc3RhdGUgJj0gfjggLyogQ2hlY2tzRW5hYmxlZCAqLztcbiAgICB9XG4gICAgdmlldy5zdGF0ZSAmPSB+KDY0IC8qIENoZWNrUHJvamVjdGVkVmlld3MgKi8gfCAzMiAvKiBDaGVja1Byb2plY3RlZFZpZXcgKi8pO1xuICAgIHNoaWZ0SW5pdFN0YXRlKHZpZXcsIDc2OCAvKiBJbml0U3RhdGVfQ2FsbGluZ0FmdGVyVmlld0luaXQgKi8sIDEwMjQgLyogSW5pdFN0YXRlX0FmdGVySW5pdCAqLyk7XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZU5vZGUodmlldywgbm9kZURlZiwgYXJnU3R5bGUsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KSB7XG4gICAgaWYgKGFyZ1N0eWxlID09PSAwIC8qIElubGluZSAqLykge1xuICAgICAgICByZXR1cm4gY2hlY2tBbmRVcGRhdGVOb2RlSW5saW5lKHZpZXcsIG5vZGVEZWYsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGVja0FuZFVwZGF0ZU5vZGVEeW5hbWljKHZpZXcsIG5vZGVEZWYsIHYwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXJrUHJvamVjdGVkVmlld3NGb3JDaGVjayh2aWV3KSB7XG4gICAgdmFyIGRlZiA9IHZpZXcuZGVmO1xuICAgIGlmICghKGRlZi5ub2RlRmxhZ3MgJiA0IC8qIFByb2plY3RlZFRlbXBsYXRlICovKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gZGVmLm5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDQgLyogUHJvamVjdGVkVGVtcGxhdGUgKi8pIHtcbiAgICAgICAgICAgIHZhciBwcm9qZWN0ZWRWaWV3cyA9IGFzRWxlbWVudERhdGEodmlldywgaSkudGVtcGxhdGUuX3Byb2plY3RlZFZpZXdzO1xuICAgICAgICAgICAgaWYgKHByb2plY3RlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaV8xID0gMDsgaV8xIDwgcHJvamVjdGVkVmlld3MubGVuZ3RoOyBpXzErKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvamVjdGVkVmlldyA9IHByb2plY3RlZFZpZXdzW2lfMV07XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RlZFZpZXcuc3RhdGUgfD0gMzIgLyogQ2hlY2tQcm9qZWN0ZWRWaWV3ICovO1xuICAgICAgICAgICAgICAgICAgICBtYXJrUGFyZW50Vmlld3NGb3JDaGVja1Byb2plY3RlZFZpZXdzKHByb2plY3RlZFZpZXcsIHZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobm9kZURlZi5jaGlsZEZsYWdzICYgNCAvKiBQcm9qZWN0ZWRUZW1wbGF0ZSAqLykgPT09IDApIHtcbiAgICAgICAgICAgIC8vIGEgcGFyZW50IHdpdGggbGVhZnNcbiAgICAgICAgICAgIC8vIG5vIGNoaWxkIGlzIGEgY29tcG9uZW50LFxuICAgICAgICAgICAgLy8gdGhlbiBza2lwIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgaSArPSBub2RlRGVmLmNoaWxkQ291bnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja0FuZFVwZGF0ZU5vZGVJbmxpbmUodmlldywgbm9kZURlZiwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpIHtcbiAgICBzd2l0Y2ggKG5vZGVEZWYuZmxhZ3MgJiAyMDEzNDcwNjcgLyogVHlwZXMgKi8pIHtcbiAgICAgICAgY2FzZSAxIC8qIFR5cGVFbGVtZW50ICovOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQW5kVXBkYXRlRWxlbWVudElubGluZSh2aWV3LCBub2RlRGVmLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7XG4gICAgICAgIGNhc2UgMiAvKiBUeXBlVGV4dCAqLzpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0FuZFVwZGF0ZVRleHRJbmxpbmUodmlldywgbm9kZURlZiwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpO1xuICAgICAgICBjYXNlIDE2Mzg0IC8qIFR5cGVEaXJlY3RpdmUgKi86XG4gICAgICAgICAgICByZXR1cm4gY2hlY2tBbmRVcGRhdGVEaXJlY3RpdmVJbmxpbmUodmlldywgbm9kZURlZiwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpO1xuICAgICAgICBjYXNlIDMyIC8qIFR5cGVQdXJlQXJyYXkgKi86XG4gICAgICAgIGNhc2UgNjQgLyogVHlwZVB1cmVPYmplY3QgKi86XG4gICAgICAgIGNhc2UgMTI4IC8qIFR5cGVQdXJlUGlwZSAqLzpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0FuZFVwZGF0ZVB1cmVFeHByZXNzaW9uSW5saW5lKHZpZXcsIG5vZGVEZWYsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93ICd1bnJlYWNoYWJsZSc7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tBbmRVcGRhdGVOb2RlRHluYW1pYyh2aWV3LCBub2RlRGVmLCB2YWx1ZXMpIHtcbiAgICBzd2l0Y2ggKG5vZGVEZWYuZmxhZ3MgJiAyMDEzNDcwNjcgLyogVHlwZXMgKi8pIHtcbiAgICAgICAgY2FzZSAxIC8qIFR5cGVFbGVtZW50ICovOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQW5kVXBkYXRlRWxlbWVudER5bmFtaWModmlldywgbm9kZURlZiwgdmFsdWVzKTtcbiAgICAgICAgY2FzZSAyIC8qIFR5cGVUZXh0ICovOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQW5kVXBkYXRlVGV4dER5bmFtaWModmlldywgbm9kZURlZiwgdmFsdWVzKTtcbiAgICAgICAgY2FzZSAxNjM4NCAvKiBUeXBlRGlyZWN0aXZlICovOlxuICAgICAgICAgICAgcmV0dXJuIGNoZWNrQW5kVXBkYXRlRGlyZWN0aXZlRHluYW1pYyh2aWV3LCBub2RlRGVmLCB2YWx1ZXMpO1xuICAgICAgICBjYXNlIDMyIC8qIFR5cGVQdXJlQXJyYXkgKi86XG4gICAgICAgIGNhc2UgNjQgLyogVHlwZVB1cmVPYmplY3QgKi86XG4gICAgICAgIGNhc2UgMTI4IC8qIFR5cGVQdXJlUGlwZSAqLzpcbiAgICAgICAgICAgIHJldHVybiBjaGVja0FuZFVwZGF0ZVB1cmVFeHByZXNzaW9uRHluYW1pYyh2aWV3LCBub2RlRGVmLCB2YWx1ZXMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgJ3VucmVhY2hhYmxlJztcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja05vQ2hhbmdlc05vZGUodmlldywgbm9kZURlZiwgYXJnU3R5bGUsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KSB7XG4gICAgaWYgKGFyZ1N0eWxlID09PSAwIC8qIElubGluZSAqLykge1xuICAgICAgICBjaGVja05vQ2hhbmdlc05vZGVJbmxpbmUodmlldywgbm9kZURlZiwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY2hlY2tOb0NoYW5nZXNOb2RlRHluYW1pYyh2aWV3LCBub2RlRGVmLCB2MCk7XG4gICAgfVxuICAgIC8vIFJldHVybmluZyBmYWxzZSBpcyBvayBoZXJlIGFzIHdlIHdvdWxkIGhhdmUgdGhyb3duIGluIGNhc2Ugb2YgYSBjaGFuZ2UuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tOb0NoYW5nZXNOb2RlSW5saW5lKHZpZXcsIG5vZGVEZWYsIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5KSB7XG4gICAgdmFyIGJpbmRMZW4gPSBub2RlRGVmLmJpbmRpbmdzLmxlbmd0aDtcbiAgICBpZiAoYmluZExlbiA+IDApXG4gICAgICAgIGNoZWNrQmluZGluZ05vQ2hhbmdlcyh2aWV3LCBub2RlRGVmLCAwLCB2MCk7XG4gICAgaWYgKGJpbmRMZW4gPiAxKVxuICAgICAgICBjaGVja0JpbmRpbmdOb0NoYW5nZXModmlldywgbm9kZURlZiwgMSwgdjEpO1xuICAgIGlmIChiaW5kTGVuID4gMilcbiAgICAgICAgY2hlY2tCaW5kaW5nTm9DaGFuZ2VzKHZpZXcsIG5vZGVEZWYsIDIsIHYyKTtcbiAgICBpZiAoYmluZExlbiA+IDMpXG4gICAgICAgIGNoZWNrQmluZGluZ05vQ2hhbmdlcyh2aWV3LCBub2RlRGVmLCAzLCB2Myk7XG4gICAgaWYgKGJpbmRMZW4gPiA0KVxuICAgICAgICBjaGVja0JpbmRpbmdOb0NoYW5nZXModmlldywgbm9kZURlZiwgNCwgdjQpO1xuICAgIGlmIChiaW5kTGVuID4gNSlcbiAgICAgICAgY2hlY2tCaW5kaW5nTm9DaGFuZ2VzKHZpZXcsIG5vZGVEZWYsIDUsIHY1KTtcbiAgICBpZiAoYmluZExlbiA+IDYpXG4gICAgICAgIGNoZWNrQmluZGluZ05vQ2hhbmdlcyh2aWV3LCBub2RlRGVmLCA2LCB2Nik7XG4gICAgaWYgKGJpbmRMZW4gPiA3KVxuICAgICAgICBjaGVja0JpbmRpbmdOb0NoYW5nZXModmlldywgbm9kZURlZiwgNywgdjcpO1xuICAgIGlmIChiaW5kTGVuID4gOClcbiAgICAgICAgY2hlY2tCaW5kaW5nTm9DaGFuZ2VzKHZpZXcsIG5vZGVEZWYsIDgsIHY4KTtcbiAgICBpZiAoYmluZExlbiA+IDkpXG4gICAgICAgIGNoZWNrQmluZGluZ05vQ2hhbmdlcyh2aWV3LCBub2RlRGVmLCA5LCB2OSk7XG59XG5mdW5jdGlvbiBjaGVja05vQ2hhbmdlc05vZGVEeW5hbWljKHZpZXcsIG5vZGVEZWYsIHZhbHVlcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoZWNrQmluZGluZ05vQ2hhbmdlcyh2aWV3LCBub2RlRGVmLCBpLCB2YWx1ZXNbaV0pO1xuICAgIH1cbn1cbi8qKlxuICogV29ya2Fyb3VuZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci90c2lja2xlL2lzc3Vlcy80OTdcbiAqIEBzdXBwcmVzcyB7bWlzcGxhY2VkVHlwZUFubm90YXRpb259XG4gKi9cbmZ1bmN0aW9uIGNoZWNrTm9DaGFuZ2VzUXVlcnkodmlldywgbm9kZURlZikge1xuICAgIHZhciBxdWVyeUxpc3QgPSBhc1F1ZXJ5TGlzdCh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCk7XG4gICAgaWYgKHF1ZXJ5TGlzdC5kaXJ0eSkge1xuICAgICAgICB0aHJvdyBleHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yKFNlcnZpY2VzLmNyZWF0ZURlYnVnQ29udGV4dCh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCksIFwiUXVlcnkgXCIgKyBub2RlRGVmLnF1ZXJ5LmlkICsgXCIgbm90IGRpcnR5XCIsIFwiUXVlcnkgXCIgKyBub2RlRGVmLnF1ZXJ5LmlkICsgXCIgZGlydHlcIiwgKHZpZXcuc3RhdGUgJiAxIC8qIEJlZm9yZUZpcnN0Q2hlY2sgKi8pICE9PSAwKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXN0cm95Vmlldyh2aWV3KSB7XG4gICAgaWYgKHZpZXcuc3RhdGUgJiAxMjggLyogRGVzdHJveWVkICovKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXhlY0VtYmVkZGVkVmlld3NBY3Rpb24odmlldywgVmlld0FjdGlvbi5EZXN0cm95KTtcbiAgICBleGVjQ29tcG9uZW50Vmlld3NBY3Rpb24odmlldywgVmlld0FjdGlvbi5EZXN0cm95KTtcbiAgICBjYWxsTGlmZWN5Y2xlSG9va3NDaGlsZHJlbkZpcnN0KHZpZXcsIDEzMTA3MiAvKiBPbkRlc3Ryb3kgKi8pO1xuICAgIGlmICh2aWV3LmRpc3Bvc2FibGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5kaXNwb3NhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmlldy5kaXNwb3NhYmxlc1tpXSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRldGFjaFByb2plY3RlZFZpZXcodmlldyk7XG4gICAgaWYgKHZpZXcucmVuZGVyZXIuZGVzdHJveU5vZGUpIHtcbiAgICAgICAgZGVzdHJveVZpZXdOb2Rlcyh2aWV3KTtcbiAgICB9XG4gICAgaWYgKGlzQ29tcG9uZW50Vmlldyh2aWV3KSkge1xuICAgICAgICB2aWV3LnJlbmRlcmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdmlldy5zdGF0ZSB8PSAxMjggLyogRGVzdHJveWVkICovO1xufVxuZnVuY3Rpb24gZGVzdHJveVZpZXdOb2Rlcyh2aWV3KSB7XG4gICAgdmFyIGxlbiA9IHZpZXcuZGVmLm5vZGVzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHZhciBkZWYgPSB2aWV3LmRlZi5ub2Rlc1tpXTtcbiAgICAgICAgaWYgKGRlZi5mbGFncyAmIDEgLyogVHlwZUVsZW1lbnQgKi8pIHtcbiAgICAgICAgICAgIHZpZXcucmVuZGVyZXIuZGVzdHJveU5vZGUoYXNFbGVtZW50RGF0YSh2aWV3LCBpKS5yZW5kZXJFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZWYuZmxhZ3MgJiAyIC8qIFR5cGVUZXh0ICovKSB7XG4gICAgICAgICAgICB2aWV3LnJlbmRlcmVyLmRlc3Ryb3lOb2RlKGFzVGV4dERhdGEodmlldywgaSkucmVuZGVyVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGVmLmZsYWdzICYgNjcxMDg4NjQgLyogVHlwZUNvbnRlbnRRdWVyeSAqLyB8fCBkZWYuZmxhZ3MgJiAxMzQyMTc3MjggLyogVHlwZVZpZXdRdWVyeSAqLykge1xuICAgICAgICAgICAgYXNRdWVyeUxpc3QodmlldywgaSkuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxudmFyIFZpZXdBY3Rpb247XG4oZnVuY3Rpb24gKFZpZXdBY3Rpb24pIHtcbiAgICBWaWV3QWN0aW9uW1ZpZXdBY3Rpb25bXCJDcmVhdGVWaWV3Tm9kZXNcIl0gPSAwXSA9IFwiQ3JlYXRlVmlld05vZGVzXCI7XG4gICAgVmlld0FjdGlvbltWaWV3QWN0aW9uW1wiQ2hlY2tOb0NoYW5nZXNcIl0gPSAxXSA9IFwiQ2hlY2tOb0NoYW5nZXNcIjtcbiAgICBWaWV3QWN0aW9uW1ZpZXdBY3Rpb25bXCJDaGVja05vQ2hhbmdlc1Byb2plY3RlZFZpZXdzXCJdID0gMl0gPSBcIkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3NcIjtcbiAgICBWaWV3QWN0aW9uW1ZpZXdBY3Rpb25bXCJDaGVja0FuZFVwZGF0ZVwiXSA9IDNdID0gXCJDaGVja0FuZFVwZGF0ZVwiO1xuICAgIFZpZXdBY3Rpb25bVmlld0FjdGlvbltcIkNoZWNrQW5kVXBkYXRlUHJvamVjdGVkVmlld3NcIl0gPSA0XSA9IFwiQ2hlY2tBbmRVcGRhdGVQcm9qZWN0ZWRWaWV3c1wiO1xuICAgIFZpZXdBY3Rpb25bVmlld0FjdGlvbltcIkRlc3Ryb3lcIl0gPSA1XSA9IFwiRGVzdHJveVwiO1xufSkoVmlld0FjdGlvbiB8fCAoVmlld0FjdGlvbiA9IHt9KSk7XG5mdW5jdGlvbiBleGVjQ29tcG9uZW50Vmlld3NBY3Rpb24odmlldywgYWN0aW9uKSB7XG4gICAgdmFyIGRlZiA9IHZpZXcuZGVmO1xuICAgIGlmICghKGRlZi5ub2RlRmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gZGVmLm5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDMzNTU0NDMyIC8qIENvbXBvbmVudFZpZXcgKi8pIHtcbiAgICAgICAgICAgIC8vIGEgbGVhZlxuICAgICAgICAgICAgY2FsbFZpZXdBY3Rpb24oYXNFbGVtZW50RGF0YSh2aWV3LCBpKS5jb21wb25lbnRWaWV3LCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChub2RlRGVmLmNoaWxkRmxhZ3MgJiAzMzU1NDQzMiAvKiBDb21wb25lbnRWaWV3ICovKSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gYSBwYXJlbnQgd2l0aCBsZWFmc1xuICAgICAgICAgICAgLy8gbm8gY2hpbGQgaXMgYSBjb21wb25lbnQsXG4gICAgICAgICAgICAvLyB0aGVuIHNraXAgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGV4ZWNFbWJlZGRlZFZpZXdzQWN0aW9uKHZpZXcsIGFjdGlvbikge1xuICAgIHZhciBkZWYgPSB2aWV3LmRlZjtcbiAgICBpZiAoIShkZWYubm9kZUZsYWdzICYgMTY3NzcyMTYgLyogRW1iZWRkZWRWaWV3cyAqLykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlZi5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbm9kZURlZiA9IGRlZi5ub2Rlc1tpXTtcbiAgICAgICAgaWYgKG5vZGVEZWYuZmxhZ3MgJiAxNjc3NzIxNiAvKiBFbWJlZGRlZFZpZXdzICovKSB7XG4gICAgICAgICAgICAvLyBhIGxlYWZcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZFZpZXdzID0gYXNFbGVtZW50RGF0YSh2aWV3LCBpKS52aWV3Q29udGFpbmVyLl9lbWJlZGRlZFZpZXdzO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlbWJlZGRlZFZpZXdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY2FsbFZpZXdBY3Rpb24oZW1iZWRkZWRWaWV3c1trXSwgYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobm9kZURlZi5jaGlsZEZsYWdzICYgMTY3NzcyMTYgLyogRW1iZWRkZWRWaWV3cyAqLykgPT09IDApIHtcbiAgICAgICAgICAgIC8vIGEgcGFyZW50IHdpdGggbGVhZnNcbiAgICAgICAgICAgIC8vIG5vIGNoaWxkIGlzIGEgY29tcG9uZW50LFxuICAgICAgICAgICAgLy8gdGhlbiBza2lwIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgaSArPSBub2RlRGVmLmNoaWxkQ291bnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjYWxsVmlld0FjdGlvbih2aWV3LCBhY3Rpb24pIHtcbiAgICB2YXIgdmlld1N0YXRlID0gdmlldy5zdGF0ZTtcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQ2hlY2tOb0NoYW5nZXM6XG4gICAgICAgICAgICBpZiAoKHZpZXdTdGF0ZSAmIDEyOCAvKiBEZXN0cm95ZWQgKi8pID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh2aWV3U3RhdGUgJiAxMiAvKiBDYXREZXRlY3RDaGFuZ2VzICovKSA9PT0gMTIgLyogQ2F0RGV0ZWN0Q2hhbmdlcyAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGVja05vQ2hhbmdlc1ZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpZXdTdGF0ZSAmIDY0IC8qIENoZWNrUHJvamVjdGVkVmlld3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgZXhlY1Byb2plY3RlZFZpZXdzQWN0aW9uKHZpZXcsIFZpZXdBY3Rpb24uQ2hlY2tOb0NoYW5nZXNQcm9qZWN0ZWRWaWV3cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmlld0FjdGlvbi5DaGVja05vQ2hhbmdlc1Byb2plY3RlZFZpZXdzOlxuICAgICAgICAgICAgaWYgKCh2aWV3U3RhdGUgJiAxMjggLyogRGVzdHJveWVkICovKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3U3RhdGUgJiAzMiAvKiBDaGVja1Byb2plY3RlZFZpZXcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tOb0NoYW5nZXNWaWV3KHZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2aWV3U3RhdGUgJiA2NCAvKiBDaGVja1Byb2plY3RlZFZpZXdzICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWNQcm9qZWN0ZWRWaWV3c0FjdGlvbih2aWV3LCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQ2hlY2tBbmRVcGRhdGU6XG4gICAgICAgICAgICBpZiAoKHZpZXdTdGF0ZSAmIDEyOCAvKiBEZXN0cm95ZWQgKi8pID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh2aWV3U3RhdGUgJiAxMiAvKiBDYXREZXRlY3RDaGFuZ2VzICovKSA9PT0gMTIgLyogQ2F0RGV0ZWN0Q2hhbmdlcyAqLykge1xuICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFVwZGF0ZVZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpZXdTdGF0ZSAmIDY0IC8qIENoZWNrUHJvamVjdGVkVmlld3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgZXhlY1Byb2plY3RlZFZpZXdzQWN0aW9uKHZpZXcsIFZpZXdBY3Rpb24uQ2hlY2tBbmRVcGRhdGVQcm9qZWN0ZWRWaWV3cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVmlld0FjdGlvbi5DaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzOlxuICAgICAgICAgICAgaWYgKCh2aWV3U3RhdGUgJiAxMjggLyogRGVzdHJveWVkICovKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh2aWV3U3RhdGUgJiAzMiAvKiBDaGVja1Byb2plY3RlZFZpZXcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tBbmRVcGRhdGVWaWV3KHZpZXcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2aWV3U3RhdGUgJiA2NCAvKiBDaGVja1Byb2plY3RlZFZpZXdzICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWNQcm9qZWN0ZWRWaWV3c0FjdGlvbih2aWV3LCBhY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZpZXdBY3Rpb24uRGVzdHJveTpcbiAgICAgICAgICAgIC8vIE5vdGU6IGRlc3Ryb3lWaWV3IHJlY3Vyc2VzIG92ZXIgYWxsIHZpZXdzLFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBzcGVjaWFsIGNhc2UgcHJvamVjdGVkIHZpZXdzIGhlcmUuXG4gICAgICAgICAgICBkZXN0cm95Vmlldyh2aWV3KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZpZXdBY3Rpb24uQ3JlYXRlVmlld05vZGVzOlxuICAgICAgICAgICAgY3JlYXRlVmlld05vZGVzKHZpZXcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufVxuZnVuY3Rpb24gZXhlY1Byb2plY3RlZFZpZXdzQWN0aW9uKHZpZXcsIGFjdGlvbikge1xuICAgIGV4ZWNFbWJlZGRlZFZpZXdzQWN0aW9uKHZpZXcsIGFjdGlvbik7XG4gICAgZXhlY0NvbXBvbmVudFZpZXdzQWN0aW9uKHZpZXcsIGFjdGlvbik7XG59XG5mdW5jdGlvbiBleGVjUXVlcmllc0FjdGlvbih2aWV3LCBxdWVyeUZsYWdzLCBzdGF0aWNEeW5hbWljUXVlcnlGbGFnLCBjaGVja1R5cGUpIHtcbiAgICBpZiAoISh2aWV3LmRlZi5ub2RlRmxhZ3MgJiBxdWVyeUZsYWdzKSB8fCAhKHZpZXcuZGVmLm5vZGVGbGFncyAmIHN0YXRpY0R5bmFtaWNRdWVyeUZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5vZGVDb3VudCA9IHZpZXcuZGVmLm5vZGVzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgIGlmICgobm9kZURlZi5mbGFncyAmIHF1ZXJ5RmxhZ3MpICYmIChub2RlRGVmLmZsYWdzICYgc3RhdGljRHluYW1pY1F1ZXJ5RmxhZykpIHtcbiAgICAgICAgICAgIFNlcnZpY2VzLnNldEN1cnJlbnROb2RlKHZpZXcsIG5vZGVEZWYubm9kZUluZGV4KTtcbiAgICAgICAgICAgIHN3aXRjaCAoY2hlY2tUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwIC8qIENoZWNrQW5kVXBkYXRlICovOlxuICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFVwZGF0ZVF1ZXJ5KHZpZXcsIG5vZGVEZWYpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogQ2hlY2tOb0NoYW5nZXMgKi86XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrTm9DaGFuZ2VzUXVlcnkodmlldywgbm9kZURlZik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghKG5vZGVEZWYuY2hpbGRGbGFncyAmIHF1ZXJ5RmxhZ3MpIHx8ICEobm9kZURlZi5jaGlsZEZsYWdzICYgc3RhdGljRHluYW1pY1F1ZXJ5RmxhZykpIHtcbiAgICAgICAgICAgIC8vIG5vIGNoaWxkIGhhcyBhIG1hdGNoaW5nIHF1ZXJ5XG4gICAgICAgICAgICAvLyB0aGVuIHNraXAgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICBpICs9IG5vZGVEZWYuY2hpbGRDb3VudDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGluaXRpYWxpemVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbml0U2VydmljZXNJZk5lZWRlZCgpIHtcbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbml0aWFsaXplZCA9IHRydWU7XG4gICAgdmFyIHNlcnZpY2VzID0gaXNEZXZNb2RlKCkgPyBjcmVhdGVEZWJ1Z1NlcnZpY2VzKCkgOiBjcmVhdGVQcm9kU2VydmljZXMoKTtcbiAgICBTZXJ2aWNlcy5zZXRDdXJyZW50Tm9kZSA9IHNlcnZpY2VzLnNldEN1cnJlbnROb2RlO1xuICAgIFNlcnZpY2VzLmNyZWF0ZVJvb3RWaWV3ID0gc2VydmljZXMuY3JlYXRlUm9vdFZpZXc7XG4gICAgU2VydmljZXMuY3JlYXRlRW1iZWRkZWRWaWV3ID0gc2VydmljZXMuY3JlYXRlRW1iZWRkZWRWaWV3O1xuICAgIFNlcnZpY2VzLmNyZWF0ZUNvbXBvbmVudFZpZXcgPSBzZXJ2aWNlcy5jcmVhdGVDb21wb25lbnRWaWV3O1xuICAgIFNlcnZpY2VzLmNyZWF0ZU5nTW9kdWxlUmVmID0gc2VydmljZXMuY3JlYXRlTmdNb2R1bGVSZWY7XG4gICAgU2VydmljZXMub3ZlcnJpZGVQcm92aWRlciA9IHNlcnZpY2VzLm92ZXJyaWRlUHJvdmlkZXI7XG4gICAgU2VydmljZXMub3ZlcnJpZGVDb21wb25lbnRWaWV3ID0gc2VydmljZXMub3ZlcnJpZGVDb21wb25lbnRWaWV3O1xuICAgIFNlcnZpY2VzLmNsZWFyT3ZlcnJpZGVzID0gc2VydmljZXMuY2xlYXJPdmVycmlkZXM7XG4gICAgU2VydmljZXMuY2hlY2tBbmRVcGRhdGVWaWV3ID0gc2VydmljZXMuY2hlY2tBbmRVcGRhdGVWaWV3O1xuICAgIFNlcnZpY2VzLmNoZWNrTm9DaGFuZ2VzVmlldyA9IHNlcnZpY2VzLmNoZWNrTm9DaGFuZ2VzVmlldztcbiAgICBTZXJ2aWNlcy5kZXN0cm95VmlldyA9IHNlcnZpY2VzLmRlc3Ryb3lWaWV3O1xuICAgIFNlcnZpY2VzLnJlc29sdmVEZXAgPSByZXNvbHZlRGVwO1xuICAgIFNlcnZpY2VzLmNyZWF0ZURlYnVnQ29udGV4dCA9IHNlcnZpY2VzLmNyZWF0ZURlYnVnQ29udGV4dDtcbiAgICBTZXJ2aWNlcy5oYW5kbGVFdmVudCA9IHNlcnZpY2VzLmhhbmRsZUV2ZW50O1xuICAgIFNlcnZpY2VzLnVwZGF0ZURpcmVjdGl2ZXMgPSBzZXJ2aWNlcy51cGRhdGVEaXJlY3RpdmVzO1xuICAgIFNlcnZpY2VzLnVwZGF0ZVJlbmRlcmVyID0gc2VydmljZXMudXBkYXRlUmVuZGVyZXI7XG4gICAgU2VydmljZXMuZGlydHlQYXJlbnRRdWVyaWVzID0gZGlydHlQYXJlbnRRdWVyaWVzO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvZFNlcnZpY2VzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNldEN1cnJlbnROb2RlOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIGNyZWF0ZVJvb3RWaWV3OiBjcmVhdGVQcm9kUm9vdFZpZXcsXG4gICAgICAgIGNyZWF0ZUVtYmVkZGVkVmlldzogY3JlYXRlRW1iZWRkZWRWaWV3LFxuICAgICAgICBjcmVhdGVDb21wb25lbnRWaWV3OiBjcmVhdGVDb21wb25lbnRWaWV3LFxuICAgICAgICBjcmVhdGVOZ01vZHVsZVJlZjogY3JlYXRlTmdNb2R1bGVSZWYsXG4gICAgICAgIG92ZXJyaWRlUHJvdmlkZXI6IE5PT1AsXG4gICAgICAgIG92ZXJyaWRlQ29tcG9uZW50VmlldzogTk9PUCxcbiAgICAgICAgY2xlYXJPdmVycmlkZXM6IE5PT1AsXG4gICAgICAgIGNoZWNrQW5kVXBkYXRlVmlldzogY2hlY2tBbmRVcGRhdGVWaWV3LFxuICAgICAgICBjaGVja05vQ2hhbmdlc1ZpZXc6IGNoZWNrTm9DaGFuZ2VzVmlldyxcbiAgICAgICAgZGVzdHJveVZpZXc6IGRlc3Ryb3lWaWV3LFxuICAgICAgICBjcmVhdGVEZWJ1Z0NvbnRleHQ6IGZ1bmN0aW9uICh2aWV3LCBub2RlSW5kZXgpIHsgcmV0dXJuIG5ldyBEZWJ1Z0NvbnRleHRfKHZpZXcsIG5vZGVJbmRleCk7IH0sXG4gICAgICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbiAodmlldywgbm9kZUluZGV4LCBldmVudE5hbWUsIGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5kZWYuaGFuZGxlRXZlbnQodmlldywgbm9kZUluZGV4LCBldmVudE5hbWUsIGV2ZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRGlyZWN0aXZlczogZnVuY3Rpb24gKHZpZXcsIGNoZWNrVHlwZSkgeyByZXR1cm4gdmlldy5kZWYudXBkYXRlRGlyZWN0aXZlcyhjaGVja1R5cGUgPT09IDAgLyogQ2hlY2tBbmRVcGRhdGUgKi8gPyBwcm9kQ2hlY2tBbmRVcGRhdGVOb2RlIDpcbiAgICAgICAgICAgIHByb2RDaGVja05vQ2hhbmdlc05vZGUsIHZpZXcpOyB9LFxuICAgICAgICB1cGRhdGVSZW5kZXJlcjogZnVuY3Rpb24gKHZpZXcsIGNoZWNrVHlwZSkgeyByZXR1cm4gdmlldy5kZWYudXBkYXRlUmVuZGVyZXIoY2hlY2tUeXBlID09PSAwIC8qIENoZWNrQW5kVXBkYXRlICovID8gcHJvZENoZWNrQW5kVXBkYXRlTm9kZSA6XG4gICAgICAgICAgICBwcm9kQ2hlY2tOb0NoYW5nZXNOb2RlLCB2aWV3KTsgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlRGVidWdTZXJ2aWNlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXRDdXJyZW50Tm9kZTogZGVidWdTZXRDdXJyZW50Tm9kZSxcbiAgICAgICAgY3JlYXRlUm9vdFZpZXc6IGRlYnVnQ3JlYXRlUm9vdFZpZXcsXG4gICAgICAgIGNyZWF0ZUVtYmVkZGVkVmlldzogZGVidWdDcmVhdGVFbWJlZGRlZFZpZXcsXG4gICAgICAgIGNyZWF0ZUNvbXBvbmVudFZpZXc6IGRlYnVnQ3JlYXRlQ29tcG9uZW50VmlldyxcbiAgICAgICAgY3JlYXRlTmdNb2R1bGVSZWY6IGRlYnVnQ3JlYXRlTmdNb2R1bGVSZWYsXG4gICAgICAgIG92ZXJyaWRlUHJvdmlkZXI6IGRlYnVnT3ZlcnJpZGVQcm92aWRlcixcbiAgICAgICAgb3ZlcnJpZGVDb21wb25lbnRWaWV3OiBkZWJ1Z092ZXJyaWRlQ29tcG9uZW50VmlldyxcbiAgICAgICAgY2xlYXJPdmVycmlkZXM6IGRlYnVnQ2xlYXJPdmVycmlkZXMsXG4gICAgICAgIGNoZWNrQW5kVXBkYXRlVmlldzogZGVidWdDaGVja0FuZFVwZGF0ZVZpZXcsXG4gICAgICAgIGNoZWNrTm9DaGFuZ2VzVmlldzogZGVidWdDaGVja05vQ2hhbmdlc1ZpZXcsXG4gICAgICAgIGRlc3Ryb3lWaWV3OiBkZWJ1Z0Rlc3Ryb3lWaWV3LFxuICAgICAgICBjcmVhdGVEZWJ1Z0NvbnRleHQ6IGZ1bmN0aW9uICh2aWV3LCBub2RlSW5kZXgpIHsgcmV0dXJuIG5ldyBEZWJ1Z0NvbnRleHRfKHZpZXcsIG5vZGVJbmRleCk7IH0sXG4gICAgICAgIGhhbmRsZUV2ZW50OiBkZWJ1Z0hhbmRsZUV2ZW50LFxuICAgICAgICB1cGRhdGVEaXJlY3RpdmVzOiBkZWJ1Z1VwZGF0ZURpcmVjdGl2ZXMsXG4gICAgICAgIHVwZGF0ZVJlbmRlcmVyOiBkZWJ1Z1VwZGF0ZVJlbmRlcmVyLFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVQcm9kUm9vdFZpZXcoZWxJbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBkZWYsIG5nTW9kdWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlbmRlcmVyRmFjdG9yeSA9IG5nTW9kdWxlLmluamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyKTtcbiAgICByZXR1cm4gY3JlYXRlUm9vdFZpZXcoY3JlYXRlUm9vdERhdGEoZWxJbmplY3RvciwgbmdNb2R1bGUsIHJlbmRlcmVyRmFjdG9yeSwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlKSwgZGVmLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGRlYnVnQ3JlYXRlUm9vdFZpZXcoZWxJbmplY3RvciwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlLCBkZWYsIG5nTW9kdWxlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlbmRlcmVyRmFjdG9yeSA9IG5nTW9kdWxlLmluamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyKTtcbiAgICB2YXIgcm9vdCA9IGNyZWF0ZVJvb3REYXRhKGVsSW5qZWN0b3IsIG5nTW9kdWxlLCBuZXcgRGVidWdSZW5kZXJlckZhY3RvcnkyKHJlbmRlcmVyRmFjdG9yeSksIHByb2plY3RhYmxlTm9kZXMsIHJvb3RTZWxlY3Rvck9yTm9kZSk7XG4gICAgdmFyIGRlZldpdGhPdmVycmlkZSA9IGFwcGx5UHJvdmlkZXJPdmVycmlkZXNUb1ZpZXcoZGVmKTtcbiAgICByZXR1cm4gY2FsbFdpdGhEZWJ1Z0NvbnRleHQoRGVidWdBY3Rpb24uY3JlYXRlLCBjcmVhdGVSb290VmlldywgbnVsbCwgW3Jvb3QsIGRlZldpdGhPdmVycmlkZSwgY29udGV4dF0pO1xufVxuZnVuY3Rpb24gY3JlYXRlUm9vdERhdGEoZWxJbmplY3RvciwgbmdNb2R1bGUsIHJlbmRlcmVyRmFjdG9yeSwgcHJvamVjdGFibGVOb2Rlcywgcm9vdFNlbGVjdG9yT3JOb2RlKSB7XG4gICAgdmFyIHNhbml0aXplciA9IG5nTW9kdWxlLmluamVjdG9yLmdldChTYW5pdGl6ZXIpO1xuICAgIHZhciBlcnJvckhhbmRsZXIgPSBuZ01vZHVsZS5pbmplY3Rvci5nZXQoRXJyb3JIYW5kbGVyKTtcbiAgICB2YXIgcmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgbnVsbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmdNb2R1bGU6IG5nTW9kdWxlLFxuICAgICAgICBpbmplY3RvcjogZWxJbmplY3RvciwgcHJvamVjdGFibGVOb2RlczogcHJvamVjdGFibGVOb2RlcyxcbiAgICAgICAgc2VsZWN0b3JPck5vZGU6IHJvb3RTZWxlY3Rvck9yTm9kZSwgc2FuaXRpemVyOiBzYW5pdGl6ZXIsIHJlbmRlcmVyRmFjdG9yeTogcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlcjogcmVuZGVyZXIsIGVycm9ySGFuZGxlcjogZXJyb3JIYW5kbGVyXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGRlYnVnQ3JlYXRlRW1iZWRkZWRWaWV3KHBhcmVudFZpZXcsIGFuY2hvckRlZiwgdmlld0RlZiwgY29udGV4dCkge1xuICAgIHZhciBkZWZXaXRoT3ZlcnJpZGUgPSBhcHBseVByb3ZpZGVyT3ZlcnJpZGVzVG9WaWV3KHZpZXdEZWYpO1xuICAgIHJldHVybiBjYWxsV2l0aERlYnVnQ29udGV4dChEZWJ1Z0FjdGlvbi5jcmVhdGUsIGNyZWF0ZUVtYmVkZGVkVmlldywgbnVsbCwgW3BhcmVudFZpZXcsIGFuY2hvckRlZiwgZGVmV2l0aE92ZXJyaWRlLCBjb250ZXh0XSk7XG59XG5mdW5jdGlvbiBkZWJ1Z0NyZWF0ZUNvbXBvbmVudFZpZXcocGFyZW50Vmlldywgbm9kZURlZiwgdmlld0RlZiwgaG9zdEVsZW1lbnQpIHtcbiAgICB2YXIgb3ZlcnJpZGVDb21wb25lbnRWaWV3ID0gdmlld0RlZk92ZXJyaWRlcy5nZXQobm9kZURlZi5lbGVtZW50LmNvbXBvbmVudFByb3ZpZGVyLnByb3ZpZGVyLnRva2VuKTtcbiAgICBpZiAob3ZlcnJpZGVDb21wb25lbnRWaWV3KSB7XG4gICAgICAgIHZpZXdEZWYgPSBvdmVycmlkZUNvbXBvbmVudFZpZXc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2aWV3RGVmID0gYXBwbHlQcm92aWRlck92ZXJyaWRlc1RvVmlldyh2aWV3RGVmKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbGxXaXRoRGVidWdDb250ZXh0KERlYnVnQWN0aW9uLmNyZWF0ZSwgY3JlYXRlQ29tcG9uZW50VmlldywgbnVsbCwgW3BhcmVudFZpZXcsIG5vZGVEZWYsIHZpZXdEZWYsIGhvc3RFbGVtZW50XSk7XG59XG5mdW5jdGlvbiBkZWJ1Z0NyZWF0ZU5nTW9kdWxlUmVmKG1vZHVsZVR5cGUsIHBhcmVudEluamVjdG9yLCBib290c3RyYXBDb21wb25lbnRzLCBkZWYpIHtcbiAgICB2YXIgZGVmV2l0aE92ZXJyaWRlID0gYXBwbHlQcm92aWRlck92ZXJyaWRlc1RvTmdNb2R1bGUoZGVmKTtcbiAgICByZXR1cm4gY3JlYXRlTmdNb2R1bGVSZWYobW9kdWxlVHlwZSwgcGFyZW50SW5qZWN0b3IsIGJvb3RzdHJhcENvbXBvbmVudHMsIGRlZldpdGhPdmVycmlkZSk7XG59XG52YXIgcHJvdmlkZXJPdmVycmlkZXMgPSBuZXcgTWFwKCk7XG52YXIgcHJvdmlkZXJPdmVycmlkZXNXaXRoU2NvcGUgPSBuZXcgTWFwKCk7XG52YXIgdmlld0RlZk92ZXJyaWRlcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGRlYnVnT3ZlcnJpZGVQcm92aWRlcihvdmVycmlkZSkge1xuICAgIHByb3ZpZGVyT3ZlcnJpZGVzLnNldChvdmVycmlkZS50b2tlbiwgb3ZlcnJpZGUpO1xuICAgIHZhciBpbmplY3RhYmxlRGVmO1xuICAgIGlmICh0eXBlb2Ygb3ZlcnJpZGUudG9rZW4gPT09ICdmdW5jdGlvbicgJiYgKGluamVjdGFibGVEZWYgPSBnZXRJbmplY3RhYmxlRGVmKG92ZXJyaWRlLnRva2VuKSkgJiZcbiAgICAgICAgdHlwZW9mIGluamVjdGFibGVEZWYucHJvdmlkZWRJbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm92aWRlck92ZXJyaWRlc1dpdGhTY29wZS5zZXQob3ZlcnJpZGUudG9rZW4sIG92ZXJyaWRlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZWJ1Z092ZXJyaWRlQ29tcG9uZW50Vmlldyhjb21wLCBjb21wRmFjdG9yeSkge1xuICAgIHZhciBob3N0Vmlld0RlZiA9IHJlc29sdmVEZWZpbml0aW9uKGdldENvbXBvbmVudFZpZXdEZWZpbml0aW9uRmFjdG9yeShjb21wRmFjdG9yeSkpO1xuICAgIHZhciBjb21wVmlld0RlZiA9IHJlc29sdmVEZWZpbml0aW9uKGhvc3RWaWV3RGVmLm5vZGVzWzBdLmVsZW1lbnQuY29tcG9uZW50Vmlldyk7XG4gICAgdmlld0RlZk92ZXJyaWRlcy5zZXQoY29tcCwgY29tcFZpZXdEZWYpO1xufVxuZnVuY3Rpb24gZGVidWdDbGVhck92ZXJyaWRlcygpIHtcbiAgICBwcm92aWRlck92ZXJyaWRlcy5jbGVhcigpO1xuICAgIHByb3ZpZGVyT3ZlcnJpZGVzV2l0aFNjb3BlLmNsZWFyKCk7XG4gICAgdmlld0RlZk92ZXJyaWRlcy5jbGVhcigpO1xufVxuLy8gTm90ZXMgYWJvdXQgdGhlIGFsZ29yaXRobTpcbi8vIDEpIExvY2F0ZSB0aGUgcHJvdmlkZXJzIG9mIGFuIGVsZW1lbnQgYW5kIGNoZWNrIGlmIG9uZSBvZiB0aGVtIHdhcyBvdmVyd3JpdHRlblxuLy8gMikgQ2hhbmdlIHRoZSBwcm92aWRlcnMgb2YgdGhhdCBlbGVtZW50XG4vL1xuLy8gV2Ugb25seSBjcmVhdGUgbmV3IGRhdGFzdHJ1Y3R1cmVzIGlmIHdlIG5lZWQgdG8sIHRvIGtlZXAgcGVyZiBpbXBhY3Rcbi8vIHJlYXNvbmFibGUuXG5mdW5jdGlvbiBhcHBseVByb3ZpZGVyT3ZlcnJpZGVzVG9WaWV3KGRlZikge1xuICAgIGlmIChwcm92aWRlck92ZXJyaWRlcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkZWY7XG4gICAgfVxuICAgIHZhciBlbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycyA9IGZpbmRFbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycyhkZWYpO1xuICAgIGlmIChlbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZjtcbiAgICB9XG4gICAgLy8gY2xvbmUgdGhlIHdob2xlIHZpZXcgZGVmaW5pdGlvbixcbiAgICAvLyBhcyBpdCBtYWludGFpbnMgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBub2RlcyB0aGF0IGFyZSBoYXJkIHRvIHVwZGF0ZS5cbiAgICBkZWYgPSBkZWYuZmFjdG9yeShmdW5jdGlvbiAoKSB7IHJldHVybiBOT09QOyB9KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRJbmRpY2VzV2l0aE92ZXJ3cml0dGVuUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFwcGx5UHJvdmlkZXJPdmVycmlkZXNUb0VsZW1lbnQoZGVmLCBlbGVtZW50SW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVyc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gICAgZnVuY3Rpb24gZmluZEVsZW1lbnRJbmRpY2VzV2l0aE92ZXJ3cml0dGVuUHJvdmlkZXJzKGRlZikge1xuICAgICAgICB2YXIgZWxJbmRpY2VzV2l0aE92ZXJ3cml0dGVuUHJvdmlkZXJzID0gW107XG4gICAgICAgIHZhciBsYXN0RWxlbWVudERlZiA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZURlZiA9IGRlZi5ub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLykge1xuICAgICAgICAgICAgICAgIGxhc3RFbGVtZW50RGVmID0gbm9kZURlZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXN0RWxlbWVudERlZiAmJiBub2RlRGVmLmZsYWdzICYgMzg0MCAvKiBDYXRQcm92aWRlck5vRGlyZWN0aXZlICovICYmXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJPdmVycmlkZXMuaGFzKG5vZGVEZWYucHJvdmlkZXIudG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgZWxJbmRpY2VzV2l0aE92ZXJ3cml0dGVuUHJvdmlkZXJzLnB1c2gobGFzdEVsZW1lbnREZWYubm9kZUluZGV4KTtcbiAgICAgICAgICAgICAgICBsYXN0RWxlbWVudERlZiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsSW5kaWNlc1dpdGhPdmVyd3JpdHRlblByb3ZpZGVycztcbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlQcm92aWRlck92ZXJyaWRlc1RvRWxlbWVudCh2aWV3RGVmLCBlbEluZGV4KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBlbEluZGV4ICsgMTsgaSA8IHZpZXdEZWYubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlRGVmID0gdmlld0RlZi5ub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMSAvKiBUeXBlRWxlbWVudCAqLykge1xuICAgICAgICAgICAgICAgIC8vIHN0b3AgYXQgdGhlIG5leHQgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMzg0MCAvKiBDYXRQcm92aWRlck5vRGlyZWN0aXZlICovKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gbm9kZURlZi5wcm92aWRlcjtcbiAgICAgICAgICAgICAgICB2YXIgb3ZlcnJpZGUgPSBwcm92aWRlck92ZXJyaWRlcy5nZXQocHJvdmlkZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlRGVmLmZsYWdzID0gKG5vZGVEZWYuZmxhZ3MgJiB+Mzg0MCAvKiBDYXRQcm92aWRlck5vRGlyZWN0aXZlICovKSB8IG92ZXJyaWRlLmZsYWdzO1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5kZXBzID0gc3BsaXREZXBzRHNsKG92ZXJyaWRlLmRlcHMpO1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlci52YWx1ZSA9IG92ZXJyaWRlLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIE5vdGVzIGFib3V0IHRoZSBhbGdvcml0aG06XG4vLyBXZSBvbmx5IGNyZWF0ZSBuZXcgZGF0YXN0cnVjdHVyZXMgaWYgd2UgbmVlZCB0bywgdG8ga2VlcCBwZXJmIGltcGFjdFxuLy8gcmVhc29uYWJsZS5cbmZ1bmN0aW9uIGFwcGx5UHJvdmlkZXJPdmVycmlkZXNUb05nTW9kdWxlKGRlZikge1xuICAgIHZhciBfYSA9IGNhbGNIYXNPdmVycmlkZXMoZGVmKSwgaGFzT3ZlcnJpZGVzID0gX2EuaGFzT3ZlcnJpZGVzLCBoYXNEZXByZWNhdGVkT3ZlcnJpZGVzID0gX2EuaGFzRGVwcmVjYXRlZE92ZXJyaWRlcztcbiAgICBpZiAoIWhhc092ZXJyaWRlcykge1xuICAgICAgICByZXR1cm4gZGVmO1xuICAgIH1cbiAgICAvLyBjbG9uZSB0aGUgd2hvbGUgdmlldyBkZWZpbml0aW9uLFxuICAgIC8vIGFzIGl0IG1haW50YWlucyByZWZlcmVuY2VzIGJldHdlZW4gdGhlIG5vZGVzIHRoYXQgYXJlIGhhcmQgdG8gdXBkYXRlLlxuICAgIGRlZiA9IGRlZi5mYWN0b3J5KGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5PT1A7IH0pO1xuICAgIGFwcGx5UHJvdmlkZXJPdmVycmlkZXMoZGVmKTtcbiAgICByZXR1cm4gZGVmO1xuICAgIGZ1bmN0aW9uIGNhbGNIYXNPdmVycmlkZXMoZGVmKSB7XG4gICAgICAgIHZhciBoYXNPdmVycmlkZXMgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0RlcHJlY2F0ZWRPdmVycmlkZXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKHByb3ZpZGVyT3ZlcnJpZGVzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IGhhc092ZXJyaWRlczogaGFzT3ZlcnJpZGVzLCBoYXNEZXByZWNhdGVkT3ZlcnJpZGVzOiBoYXNEZXByZWNhdGVkT3ZlcnJpZGVzIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVmLnByb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICB2YXIgb3ZlcnJpZGUgPSBwcm92aWRlck92ZXJyaWRlcy5nZXQobm9kZS50b2tlbik7XG4gICAgICAgICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAzODQwIC8qIENhdFByb3ZpZGVyTm9EaXJlY3RpdmUgKi8pICYmIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgaGFzT3ZlcnJpZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBoYXNEZXByZWNhdGVkT3ZlcnJpZGVzID0gaGFzRGVwcmVjYXRlZE92ZXJyaWRlcyB8fCBvdmVycmlkZS5kZXByZWNhdGVkQmVoYXZpb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkZWYubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAgICAgICAgIHByb3ZpZGVyT3ZlcnJpZGVzV2l0aFNjb3BlLmZvckVhY2goZnVuY3Rpb24gKG92ZXJyaWRlLCB0b2tlbikge1xuICAgICAgICAgICAgICAgIGlmIChnZXRJbmplY3RhYmxlRGVmKHRva2VuKS5wcm92aWRlZEluID09PSBtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3ZlcnJpZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRGVwcmVjYXRlZE92ZXJyaWRlcyA9IGhhc0RlcHJlY2F0ZWRPdmVycmlkZXMgfHwgb3ZlcnJpZGUuZGVwcmVjYXRlZEJlaGF2aW9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgaGFzT3ZlcnJpZGVzOiBoYXNPdmVycmlkZXMsIGhhc0RlcHJlY2F0ZWRPdmVycmlkZXM6IGhhc0RlcHJlY2F0ZWRPdmVycmlkZXMgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlQcm92aWRlck92ZXJyaWRlcyhkZWYpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWYucHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBkZWYucHJvdmlkZXJzW2ldO1xuICAgICAgICAgICAgaWYgKGhhc0RlcHJlY2F0ZWRPdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYWQgYSBidWcgd2hlcmUgbWUgbWFkZVxuICAgICAgICAgICAgICAgIC8vIGFsbCBwcm92aWRlcnMgbGF6eS4gS2VlcCB0aGlzIGxvZ2ljIGJlaGluZCBhIGZsYWdcbiAgICAgICAgICAgICAgICAvLyBmb3IgbWlncmF0aW5nIGV4aXN0aW5nIHVzZXJzLlxuICAgICAgICAgICAgICAgIHByb3ZpZGVyLmZsYWdzIHw9IDQwOTYgLyogTGF6eVByb3ZpZGVyICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG92ZXJyaWRlID0gcHJvdmlkZXJPdmVycmlkZXMuZ2V0KHByb3ZpZGVyLnRva2VuKTtcbiAgICAgICAgICAgIGlmIChvdmVycmlkZSkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyLmZsYWdzID0gKHByb3ZpZGVyLmZsYWdzICYgfjM4NDAgLyogQ2F0UHJvdmlkZXJOb0RpcmVjdGl2ZSAqLykgfCBvdmVycmlkZS5mbGFncztcbiAgICAgICAgICAgICAgICBwcm92aWRlci5kZXBzID0gc3BsaXREZXBzRHNsKG92ZXJyaWRlLmRlcHMpO1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyLnZhbHVlID0gb3ZlcnJpZGUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3ZpZGVyT3ZlcnJpZGVzV2l0aFNjb3BlLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB2YXIgbW9kdWxlU2V0XzEgPSBuZXcgU2V0KGRlZi5tb2R1bGVzKTtcbiAgICAgICAgICAgIHByb3ZpZGVyT3ZlcnJpZGVzV2l0aFNjb3BlLmZvckVhY2goZnVuY3Rpb24gKG92ZXJyaWRlLCB0b2tlbikge1xuICAgICAgICAgICAgICAgIGlmIChtb2R1bGVTZXRfMS5oYXMoZ2V0SW5qZWN0YWJsZURlZih0b2tlbikucHJvdmlkZWRJbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IHRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IG92ZXJyaWRlLmZsYWdzIHwgKGhhc0RlcHJlY2F0ZWRPdmVycmlkZXMgPyA0MDk2IC8qIExhenlQcm92aWRlciAqLyA6IDAgLyogTm9uZSAqLyksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiBzcGxpdERlcHNEc2wob3ZlcnJpZGUuZGVwcyksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3ZlcnJpZGUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogZGVmLnByb3ZpZGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGRlZi5wcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgIGRlZi5wcm92aWRlcnNCeUtleVt0b2tlbktleSh0b2tlbildID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBwcm9kQ2hlY2tBbmRVcGRhdGVOb2RlKHZpZXcsIGNoZWNrSW5kZXgsIGFyZ1N0eWxlLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSkge1xuICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbY2hlY2tJbmRleF07XG4gICAgY2hlY2tBbmRVcGRhdGVOb2RlKHZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7XG4gICAgcmV0dXJuIChub2RlRGVmLmZsYWdzICYgMjI0IC8qIENhdFB1cmVFeHByZXNzaW9uICovKSA/XG4gICAgICAgIGFzUHVyZUV4cHJlc3Npb25EYXRhKHZpZXcsIGNoZWNrSW5kZXgpLnZhbHVlIDpcbiAgICAgICAgdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcHJvZENoZWNrTm9DaGFuZ2VzTm9kZSh2aWV3LCBjaGVja0luZGV4LCBhcmdTdHlsZSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpIHtcbiAgICB2YXIgbm9kZURlZiA9IHZpZXcuZGVmLm5vZGVzW2NoZWNrSW5kZXhdO1xuICAgIGNoZWNrTm9DaGFuZ2VzTm9kZSh2aWV3LCBub2RlRGVmLCBhcmdTdHlsZSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkpO1xuICAgIHJldHVybiAobm9kZURlZi5mbGFncyAmIDIyNCAvKiBDYXRQdXJlRXhwcmVzc2lvbiAqLykgP1xuICAgICAgICBhc1B1cmVFeHByZXNzaW9uRGF0YSh2aWV3LCBjaGVja0luZGV4KS52YWx1ZSA6XG4gICAgICAgIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGRlYnVnQ2hlY2tBbmRVcGRhdGVWaWV3KHZpZXcpIHtcbiAgICByZXR1cm4gY2FsbFdpdGhEZWJ1Z0NvbnRleHQoRGVidWdBY3Rpb24uZGV0ZWN0Q2hhbmdlcywgY2hlY2tBbmRVcGRhdGVWaWV3LCBudWxsLCBbdmlld10pO1xufVxuZnVuY3Rpb24gZGVidWdDaGVja05vQ2hhbmdlc1ZpZXcodmlldykge1xuICAgIHJldHVybiBjYWxsV2l0aERlYnVnQ29udGV4dChEZWJ1Z0FjdGlvbi5jaGVja05vQ2hhbmdlcywgY2hlY2tOb0NoYW5nZXNWaWV3LCBudWxsLCBbdmlld10pO1xufVxuZnVuY3Rpb24gZGVidWdEZXN0cm95Vmlldyh2aWV3KSB7XG4gICAgcmV0dXJuIGNhbGxXaXRoRGVidWdDb250ZXh0KERlYnVnQWN0aW9uLmRlc3Ryb3ksIGRlc3Ryb3lWaWV3LCBudWxsLCBbdmlld10pO1xufVxudmFyIERlYnVnQWN0aW9uO1xuKGZ1bmN0aW9uIChEZWJ1Z0FjdGlvbikge1xuICAgIERlYnVnQWN0aW9uW0RlYnVnQWN0aW9uW1wiY3JlYXRlXCJdID0gMF0gPSBcImNyZWF0ZVwiO1xuICAgIERlYnVnQWN0aW9uW0RlYnVnQWN0aW9uW1wiZGV0ZWN0Q2hhbmdlc1wiXSA9IDFdID0gXCJkZXRlY3RDaGFuZ2VzXCI7XG4gICAgRGVidWdBY3Rpb25bRGVidWdBY3Rpb25bXCJjaGVja05vQ2hhbmdlc1wiXSA9IDJdID0gXCJjaGVja05vQ2hhbmdlc1wiO1xuICAgIERlYnVnQWN0aW9uW0RlYnVnQWN0aW9uW1wiZGVzdHJveVwiXSA9IDNdID0gXCJkZXN0cm95XCI7XG4gICAgRGVidWdBY3Rpb25bRGVidWdBY3Rpb25bXCJoYW5kbGVFdmVudFwiXSA9IDRdID0gXCJoYW5kbGVFdmVudFwiO1xufSkoRGVidWdBY3Rpb24gfHwgKERlYnVnQWN0aW9uID0ge30pKTtcbnZhciBfY3VycmVudEFjdGlvbjtcbnZhciBfY3VycmVudFZpZXc7XG52YXIgX2N1cnJlbnROb2RlSW5kZXg7XG5mdW5jdGlvbiBkZWJ1Z1NldEN1cnJlbnROb2RlKHZpZXcsIG5vZGVJbmRleCkge1xuICAgIF9jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgX2N1cnJlbnROb2RlSW5kZXggPSBub2RlSW5kZXg7XG59XG5mdW5jdGlvbiBkZWJ1Z0hhbmRsZUV2ZW50KHZpZXcsIG5vZGVJbmRleCwgZXZlbnROYW1lLCBldmVudCkge1xuICAgIGRlYnVnU2V0Q3VycmVudE5vZGUodmlldywgbm9kZUluZGV4KTtcbiAgICByZXR1cm4gY2FsbFdpdGhEZWJ1Z0NvbnRleHQoRGVidWdBY3Rpb24uaGFuZGxlRXZlbnQsIHZpZXcuZGVmLmhhbmRsZUV2ZW50LCBudWxsLCBbdmlldywgbm9kZUluZGV4LCBldmVudE5hbWUsIGV2ZW50XSk7XG59XG5mdW5jdGlvbiBkZWJ1Z1VwZGF0ZURpcmVjdGl2ZXModmlldywgY2hlY2tUeXBlKSB7XG4gICAgaWYgKHZpZXcuc3RhdGUgJiAxMjggLyogRGVzdHJveWVkICovKSB7XG4gICAgICAgIHRocm93IHZpZXdEZXN0cm95ZWRFcnJvcihEZWJ1Z0FjdGlvbltfY3VycmVudEFjdGlvbl0pO1xuICAgIH1cbiAgICBkZWJ1Z1NldEN1cnJlbnROb2RlKHZpZXcsIG5leHREaXJlY3RpdmVXaXRoQmluZGluZyh2aWV3LCAwKSk7XG4gICAgcmV0dXJuIHZpZXcuZGVmLnVwZGF0ZURpcmVjdGl2ZXMoZGVidWdDaGVja0RpcmVjdGl2ZXNGbiwgdmlldyk7XG4gICAgZnVuY3Rpb24gZGVidWdDaGVja0RpcmVjdGl2ZXNGbih2aWV3LCBub2RlSW5kZXgsIGFyZ1N0eWxlKSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHZhbHVlc1tfaSAtIDNdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm9kZURlZiA9IHZpZXcuZGVmLm5vZGVzW25vZGVJbmRleF07XG4gICAgICAgIGlmIChjaGVja1R5cGUgPT09IDAgLyogQ2hlY2tBbmRVcGRhdGUgKi8pIHtcbiAgICAgICAgICAgIGRlYnVnQ2hlY2tBbmRVcGRhdGVOb2RlKHZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWdDaGVja05vQ2hhbmdlc05vZGUodmlldywgbm9kZURlZiwgYXJnU3R5bGUsIHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVEZWYuZmxhZ3MgJiAxNjM4NCAvKiBUeXBlRGlyZWN0aXZlICovKSB7XG4gICAgICAgICAgICBkZWJ1Z1NldEN1cnJlbnROb2RlKHZpZXcsIG5leHREaXJlY3RpdmVXaXRoQmluZGluZyh2aWV3LCBub2RlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5vZGVEZWYuZmxhZ3MgJiAyMjQgLyogQ2F0UHVyZUV4cHJlc3Npb24gKi8pID9cbiAgICAgICAgICAgIGFzUHVyZUV4cHJlc3Npb25EYXRhKHZpZXcsIG5vZGVEZWYubm9kZUluZGV4KS52YWx1ZSA6XG4gICAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgfVxufVxuZnVuY3Rpb24gZGVidWdVcGRhdGVSZW5kZXJlcih2aWV3LCBjaGVja1R5cGUpIHtcbiAgICBpZiAodmlldy5zdGF0ZSAmIDEyOCAvKiBEZXN0cm95ZWQgKi8pIHtcbiAgICAgICAgdGhyb3cgdmlld0Rlc3Ryb3llZEVycm9yKERlYnVnQWN0aW9uW19jdXJyZW50QWN0aW9uXSk7XG4gICAgfVxuICAgIGRlYnVnU2V0Q3VycmVudE5vZGUodmlldywgbmV4dFJlbmRlck5vZGVXaXRoQmluZGluZyh2aWV3LCAwKSk7XG4gICAgcmV0dXJuIHZpZXcuZGVmLnVwZGF0ZVJlbmRlcmVyKGRlYnVnQ2hlY2tSZW5kZXJOb2RlRm4sIHZpZXcpO1xuICAgIGZ1bmN0aW9uIGRlYnVnQ2hlY2tSZW5kZXJOb2RlRm4odmlldywgbm9kZUluZGV4LCBhcmdTdHlsZSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMzsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZXNbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVEZWYgPSB2aWV3LmRlZi5ub2Rlc1tub2RlSW5kZXhdO1xuICAgICAgICBpZiAoY2hlY2tUeXBlID09PSAwIC8qIENoZWNrQW5kVXBkYXRlICovKSB7XG4gICAgICAgICAgICBkZWJ1Z0NoZWNrQW5kVXBkYXRlTm9kZSh2aWV3LCBub2RlRGVmLCBhcmdTdHlsZSwgdmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnQ2hlY2tOb0NoYW5nZXNOb2RlKHZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMyAvKiBDYXRSZW5kZXJOb2RlICovKSB7XG4gICAgICAgICAgICBkZWJ1Z1NldEN1cnJlbnROb2RlKHZpZXcsIG5leHRSZW5kZXJOb2RlV2l0aEJpbmRpbmcodmlldywgbm9kZUluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChub2RlRGVmLmZsYWdzICYgMjI0IC8qIENhdFB1cmVFeHByZXNzaW9uICovKSA/XG4gICAgICAgICAgICBhc1B1cmVFeHByZXNzaW9uRGF0YSh2aWV3LCBub2RlRGVmLm5vZGVJbmRleCkudmFsdWUgOlxuICAgICAgICAgICAgdW5kZWZpbmVkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlYnVnQ2hlY2tBbmRVcGRhdGVOb2RlKHZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlLCBnaXZlblZhbHVlcykge1xuICAgIHZhciBjaGFuZ2VkID0gY2hlY2tBbmRVcGRhdGVOb2RlLmFwcGx5KHZvaWQgMCwgX19zcHJlYWQoW3ZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlXSwgZ2l2ZW5WYWx1ZXMpKTtcbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gYXJnU3R5bGUgPT09IDEgLyogRHluYW1pYyAqLyA/IGdpdmVuVmFsdWVzWzBdIDogZ2l2ZW5WYWx1ZXM7XG4gICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMTYzODQgLyogVHlwZURpcmVjdGl2ZSAqLykge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZURlZi5iaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gbm9kZURlZi5iaW5kaW5nc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuZmxhZ3MgJiA4IC8qIFR5cGVQcm9wZXJ0eSAqLykge1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nVmFsdWVzW25vcm1hbGl6ZURlYnVnQmluZGluZ05hbWUoYmluZGluZy5ub25NaW5pZmllZE5hbWUpXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVEZWJ1Z0JpbmRpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVsRGVmID0gbm9kZURlZi5wYXJlbnQ7XG4gICAgICAgICAgICB2YXIgZWwgPSBhc0VsZW1lbnREYXRhKHZpZXcsIGVsRGVmLm5vZGVJbmRleCkucmVuZGVyRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghZWxEZWYuZWxlbWVudC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBjb21tZW50LlxuICAgICAgICAgICAgICAgIHZpZXcucmVuZGVyZXIuc2V0VmFsdWUoZWwsIFwiYmluZGluZ3M9XCIgKyBKU09OLnN0cmluZ2lmeShiaW5kaW5nVmFsdWVzLCBudWxsLCAyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhIHJlZ3VsYXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRyIGluIGJpbmRpbmdWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYmluZGluZ1ZhbHVlc1thdHRyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCBhdHRyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbCwgYXR0cik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBkZWJ1Z0NoZWNrTm9DaGFuZ2VzTm9kZSh2aWV3LCBub2RlRGVmLCBhcmdTdHlsZSwgdmFsdWVzKSB7XG4gICAgY2hlY2tOb0NoYW5nZXNOb2RlLmFwcGx5KHZvaWQgMCwgX19zcHJlYWQoW3ZpZXcsIG5vZGVEZWYsIGFyZ1N0eWxlXSwgdmFsdWVzKSk7XG59XG5mdW5jdGlvbiBuZXh0RGlyZWN0aXZlV2l0aEJpbmRpbmcodmlldywgbm9kZUluZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IG5vZGVJbmRleDsgaSA8IHZpZXcuZGVmLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlRGVmLmZsYWdzICYgMTYzODQgLyogVHlwZURpcmVjdGl2ZSAqLyAmJiBub2RlRGVmLmJpbmRpbmdzICYmIG5vZGVEZWYuYmluZGluZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG5leHRSZW5kZXJOb2RlV2l0aEJpbmRpbmcodmlldywgbm9kZUluZGV4KSB7XG4gICAgZm9yICh2YXIgaSA9IG5vZGVJbmRleDsgaSA8IHZpZXcuZGVmLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBub2RlRGVmID0gdmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgIGlmICgobm9kZURlZi5mbGFncyAmIDMgLyogQ2F0UmVuZGVyTm9kZSAqLykgJiYgbm9kZURlZi5iaW5kaW5ncyAmJiBub2RlRGVmLmJpbmRpbmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG52YXIgRGVidWdDb250ZXh0XyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWJ1Z0NvbnRleHRfKHZpZXcsIG5vZGVJbmRleCkge1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICAgICAgICB0aGlzLm5vZGVJbmRleCA9IG5vZGVJbmRleDtcbiAgICAgICAgaWYgKG5vZGVJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGVJbmRleCA9IG5vZGVJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlRGVmID0gdmlldy5kZWYubm9kZXNbbm9kZUluZGV4XTtcbiAgICAgICAgdmFyIGVsRGVmID0gdGhpcy5ub2RlRGVmO1xuICAgICAgICB2YXIgZWxWaWV3ID0gdmlldztcbiAgICAgICAgd2hpbGUgKGVsRGVmICYmIChlbERlZi5mbGFncyAmIDEgLyogVHlwZUVsZW1lbnQgKi8pID09PSAwKSB7XG4gICAgICAgICAgICBlbERlZiA9IGVsRGVmLnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVsRGVmKSB7XG4gICAgICAgICAgICB3aGlsZSAoIWVsRGVmICYmIGVsVmlldykge1xuICAgICAgICAgICAgICAgIGVsRGVmID0gdmlld1BhcmVudEVsKGVsVmlldyk7XG4gICAgICAgICAgICAgICAgZWxWaWV3ID0gZWxWaWV3LnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsRGVmID0gZWxEZWY7XG4gICAgICAgIHRoaXMuZWxWaWV3ID0gZWxWaWV3O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0Xy5wcm90b3R5cGUsIFwiZWxPckNvbXBWaWV3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBIYXMgdG8gYmUgZG9uZSBsYXppbHkgYXMgd2UgdXNlIHRoZSBEZWJ1Z0NvbnRleHQgYWxzbyBkdXJpbmcgY3JlYXRpb24gb2YgZWxlbWVudHMuLi5cbiAgICAgICAgICAgIHJldHVybiBhc0VsZW1lbnREYXRhKHRoaXMuZWxWaWV3LCB0aGlzLmVsRGVmLm5vZGVJbmRleCkuY29tcG9uZW50VmlldyB8fCB0aGlzLnZpZXc7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0NvbnRleHRfLnByb3RvdHlwZSwgXCJpbmplY3RvclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlSW5qZWN0b3IkMSh0aGlzLmVsVmlldywgdGhpcy5lbERlZik7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0NvbnRleHRfLnByb3RvdHlwZSwgXCJjb21wb25lbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZWxPckNvbXBWaWV3LmNvbXBvbmVudDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnQ29udGV4dF8ucHJvdG90eXBlLCBcImNvbnRleHRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZWxPckNvbXBWaWV3LmNvbnRleHQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWJ1Z0NvbnRleHRfLnByb3RvdHlwZSwgXCJwcm92aWRlclRva2Vuc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRva2VucyA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxEZWYpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5lbERlZi5ub2RlSW5kZXggKyAxOyBpIDw9IHRoaXMuZWxEZWYubm9kZUluZGV4ICsgdGhpcy5lbERlZi5jaGlsZENvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRGVmID0gdGhpcy5lbFZpZXcuZGVmLm5vZGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREZWYuZmxhZ3MgJiAyMDIyNCAvKiBDYXRQcm92aWRlciAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goY2hpbGREZWYucHJvdmlkZXIudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gY2hpbGREZWYuY2hpbGRDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0Xy5wcm90b3R5cGUsIFwicmVmZXJlbmNlc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZXMgPSB7fTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsRGVmKSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdFJlZmVyZW5jZXModGhpcy5lbFZpZXcsIHRoaXMuZWxEZWYsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmVsRGVmLm5vZGVJbmRleCArIDE7IGkgPD0gdGhpcy5lbERlZi5ub2RlSW5kZXggKyB0aGlzLmVsRGVmLmNoaWxkQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGREZWYgPSB0aGlzLmVsVmlldy5kZWYubm9kZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERlZi5mbGFncyAmIDIwMjI0IC8qIENhdFByb3ZpZGVyICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0UmVmZXJlbmNlcyh0aGlzLmVsVmlldywgY2hpbGREZWYsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gY2hpbGREZWYuY2hpbGRDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERlYnVnQ29udGV4dF8ucHJvdG90eXBlLCBcImNvbXBvbmVudFJlbmRlckVsZW1lbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlbERhdGEgPSBmaW5kSG9zdEVsZW1lbnQodGhpcy5lbE9yQ29tcFZpZXcpO1xuICAgICAgICAgICAgcmV0dXJuIGVsRGF0YSA/IGVsRGF0YS5yZW5kZXJFbGVtZW50IDogdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVidWdDb250ZXh0Xy5wcm90b3R5cGUsIFwicmVuZGVyTm9kZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZURlZi5mbGFncyAmIDIgLyogVHlwZVRleHQgKi8gPyByZW5kZXJOb2RlKHRoaXMudmlldywgdGhpcy5ub2RlRGVmKSA6XG4gICAgICAgICAgICAgICAgcmVuZGVyTm9kZSh0aGlzLmVsVmlldywgdGhpcy5lbERlZik7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERlYnVnQ29udGV4dF8ucHJvdG90eXBlLmxvZ0Vycm9yID0gZnVuY3Rpb24gKGNvbnNvbGUpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgdmFsdWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsb2dWaWV3RGVmO1xuICAgICAgICB2YXIgbG9nTm9kZUluZGV4O1xuICAgICAgICBpZiAodGhpcy5ub2RlRGVmLmZsYWdzICYgMiAvKiBUeXBlVGV4dCAqLykge1xuICAgICAgICAgICAgbG9nVmlld0RlZiA9IHRoaXMudmlldy5kZWY7XG4gICAgICAgICAgICBsb2dOb2RlSW5kZXggPSB0aGlzLm5vZGVEZWYubm9kZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nVmlld0RlZiA9IHRoaXMuZWxWaWV3LmRlZjtcbiAgICAgICAgICAgIGxvZ05vZGVJbmRleCA9IHRoaXMuZWxEZWYubm9kZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IHdlIG9ubHkgZ2VuZXJhdGUgYSBsb2cgZnVuY3Rpb24gZm9yIHRleHQgYW5kIGVsZW1lbnQgbm9kZXNcbiAgICAgICAgLy8gdG8gbWFrZSB0aGUgZ2VuZXJhdGVkIGNvZGUgYXMgc21hbGwgYXMgcG9zc2libGUuXG4gICAgICAgIHZhciByZW5kZXJOb2RlSW5kZXggPSBnZXRSZW5kZXJOb2RlSW5kZXgobG9nVmlld0RlZiwgbG9nTm9kZUluZGV4KTtcbiAgICAgICAgdmFyIGN1cnJSZW5kZXJOb2RlSW5kZXggPSAtMTtcbiAgICAgICAgdmFyIG5vZGVMb2dnZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjdXJyUmVuZGVyTm9kZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoY3VyclJlbmRlck5vZGVJbmRleCA9PT0gcmVuZGVyTm9kZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChfYSA9IGNvbnNvbGUuZXJyb3IpLmJpbmQuYXBwbHkoX2EsIF9fc3ByZWFkKFtjb25zb2xlXSwgdmFsdWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTk9PUDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9nVmlld0RlZi5mYWN0b3J5KG5vZGVMb2dnZXIpO1xuICAgICAgICBpZiAoY3VyclJlbmRlck5vZGVJbmRleCA8IHJlbmRlck5vZGVJbmRleCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSWxsZWdhbCBzdGF0ZTogdGhlIFZpZXdEZWZpbml0aW9uRmFjdG9yeSBkaWQgbm90IGNhbGwgdGhlIGxvZ2dlciEnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgX19zcHJlYWQodmFsdWVzKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBEZWJ1Z0NvbnRleHRfO1xufSgpKTtcbmZ1bmN0aW9uIGdldFJlbmRlck5vZGVJbmRleCh2aWV3RGVmLCBub2RlSW5kZXgpIHtcbiAgICB2YXIgcmVuZGVyTm9kZUluZGV4ID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbm9kZUluZGV4OyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGVEZWYgPSB2aWV3RGVmLm5vZGVzW2ldO1xuICAgICAgICBpZiAobm9kZURlZi5mbGFncyAmIDMgLyogQ2F0UmVuZGVyTm9kZSAqLykge1xuICAgICAgICAgICAgcmVuZGVyTm9kZUluZGV4Kys7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbmRlck5vZGVJbmRleDtcbn1cbmZ1bmN0aW9uIGZpbmRIb3N0RWxlbWVudCh2aWV3KSB7XG4gICAgd2hpbGUgKHZpZXcgJiYgIWlzQ29tcG9uZW50Vmlldyh2aWV3KSkge1xuICAgICAgICB2aWV3ID0gdmlldy5wYXJlbnQ7XG4gICAgfVxuICAgIGlmICh2aWV3LnBhcmVudCkge1xuICAgICAgICByZXR1cm4gYXNFbGVtZW50RGF0YSh2aWV3LnBhcmVudCwgdmlld1BhcmVudEVsKHZpZXcpLm5vZGVJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXModmlldywgbm9kZURlZiwgcmVmZXJlbmNlcykge1xuICAgIGZvciAodmFyIHJlZk5hbWUgaW4gbm9kZURlZi5yZWZlcmVuY2VzKSB7XG4gICAgICAgIHJlZmVyZW5jZXNbcmVmTmFtZV0gPSBnZXRRdWVyeVZhbHVlKHZpZXcsIG5vZGVEZWYsIG5vZGVEZWYucmVmZXJlbmNlc1tyZWZOYW1lXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2FsbFdpdGhEZWJ1Z0NvbnRleHQoYWN0aW9uLCBmbiwgc2VsZiwgYXJncykge1xuICAgIHZhciBvbGRBY3Rpb24gPSBfY3VycmVudEFjdGlvbjtcbiAgICB2YXIgb2xkVmlldyA9IF9jdXJyZW50VmlldztcbiAgICB2YXIgb2xkTm9kZUluZGV4ID0gX2N1cnJlbnROb2RlSW5kZXg7XG4gICAgdHJ5IHtcbiAgICAgICAgX2N1cnJlbnRBY3Rpb24gPSBhY3Rpb247XG4gICAgICAgIHZhciByZXN1bHQgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgX2N1cnJlbnRWaWV3ID0gb2xkVmlldztcbiAgICAgICAgX2N1cnJlbnROb2RlSW5kZXggPSBvbGROb2RlSW5kZXg7XG4gICAgICAgIF9jdXJyZW50QWN0aW9uID0gb2xkQWN0aW9uO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNWaWV3RGVidWdFcnJvcihlKSB8fCAhX2N1cnJlbnRWaWV3KSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHZpZXdXcmFwcGVkRGVidWdFcnJvcihlLCBnZXRDdXJyZW50RGVidWdDb250ZXh0KCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnREZWJ1Z0NvbnRleHQoKSB7XG4gICAgcmV0dXJuIF9jdXJyZW50VmlldyA/IG5ldyBEZWJ1Z0NvbnRleHRfKF9jdXJyZW50VmlldywgX2N1cnJlbnROb2RlSW5kZXgpIDogbnVsbDtcbn1cbnZhciBEZWJ1Z1JlbmRlcmVyRmFjdG9yeTIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVidWdSZW5kZXJlckZhY3RvcnkyKGRlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICB9XG4gICAgRGVidWdSZW5kZXJlckZhY3RvcnkyLnByb3RvdHlwZS5jcmVhdGVSZW5kZXJlciA9IGZ1bmN0aW9uIChlbGVtZW50LCByZW5kZXJEYXRhKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVidWdSZW5kZXJlcjIodGhpcy5kZWxlZ2F0ZS5jcmVhdGVSZW5kZXJlcihlbGVtZW50LCByZW5kZXJEYXRhKSk7XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyRmFjdG9yeTIucHJvdG90eXBlLmJlZ2luID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxlZ2F0ZS5iZWdpbikge1xuICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5iZWdpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyRmFjdG9yeTIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUuZW5kKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmVuZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyRmFjdG9yeTIucHJvdG90eXBlLndoZW5SZW5kZXJpbmdEb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kZWxlZ2F0ZS53aGVuUmVuZGVyaW5nRG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUud2hlblJlbmRlcmluZ0RvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH07XG4gICAgcmV0dXJuIERlYnVnUmVuZGVyZXJGYWN0b3J5Mjtcbn0oKSk7XG52YXIgRGVidWdSZW5kZXJlcjIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVidWdSZW5kZXJlcjIoZGVsZWdhdGUpIHtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICAvKipcbiAgICAgICAgICogRmFjdG9yeSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBhIGBEZWJ1Z0NvbnRleHRgIHdoZW4gYSBub2RlIGlzIGNyZWF0ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBgRGVidWdDb250ZXh0YCBhbGxvd3MgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGVzIHRoYXQgYXJlIHVzZWZ1bCBpbiB0ZXN0cy5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGZhY3RvcnkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgdGhlIGBEZWJ1Z1JlbmRlcmVyMmAgY291bGQgaW5zdGFudGlhdGUgZWl0aGVyIGEgVmlldyBFbmdpbmVcbiAgICAgICAgICogb3IgYSBSZW5kZXIgY29udGV4dC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGVidWdDb250ZXh0RmFjdG9yeSA9IGdldEN1cnJlbnREZWJ1Z0NvbnRleHQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGVsZWdhdGUuZGF0YTtcbiAgICB9XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLmNyZWF0ZURlYnVnQ29udGV4dCA9IGZ1bmN0aW9uIChuYXRpdmVFbGVtZW50KSB7IHJldHVybiB0aGlzLmRlYnVnQ29udGV4dEZhY3RvcnkobmF0aXZlRWxlbWVudCk7IH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLmRlc3Ryb3lOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmVtb3ZlRGVidWdOb2RlRnJvbUluZGV4KGdldERlYnVnTm9kZShub2RlKSk7XG4gICAgICAgIGlmICh0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlKG5vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyMi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5kZWxlZ2F0ZS5kZXN0cm95KCk7IH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAobmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpO1xuICAgICAgICB2YXIgZGVidWdDdHggPSB0aGlzLmNyZWF0ZURlYnVnQ29udGV4dChlbCk7XG4gICAgICAgIGlmIChkZWJ1Z0N0eCkge1xuICAgICAgICAgICAgdmFyIGRlYnVnRWwgPSBuZXcgRGVidWdFbGVtZW50X19QUkVfUjNfXyhlbCwgbnVsbCwgZGVidWdDdHgpO1xuICAgICAgICAgICAgZGVidWdFbC5uYW1lID0gbmFtZTtcbiAgICAgICAgICAgIGluZGV4RGVidWdOb2RlKGRlYnVnRWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuICAgIERlYnVnUmVuZGVyZXIyLnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVDb21tZW50KHZhbHVlKTtcbiAgICAgICAgdmFyIGRlYnVnQ3R4ID0gdGhpcy5jcmVhdGVEZWJ1Z0NvbnRleHQoY29tbWVudCk7XG4gICAgICAgIGlmIChkZWJ1Z0N0eCkge1xuICAgICAgICAgICAgaW5kZXhEZWJ1Z05vZGUobmV3IERlYnVnTm9kZV9fUFJFX1IzX18oY29tbWVudCwgbnVsbCwgZGVidWdDdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9O1xuICAgIERlYnVnUmVuZGVyZXIyLnByb3RvdHlwZS5jcmVhdGVUZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVUZXh0KHZhbHVlKTtcbiAgICAgICAgdmFyIGRlYnVnQ3R4ID0gdGhpcy5jcmVhdGVEZWJ1Z0NvbnRleHQodGV4dCk7XG4gICAgICAgIGlmIChkZWJ1Z0N0eCkge1xuICAgICAgICAgICAgaW5kZXhEZWJ1Z05vZGUobmV3IERlYnVnTm9kZV9fUFJFX1IzX18odGV4dCwgbnVsbCwgZGVidWdDdHgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9O1xuICAgIERlYnVnUmVuZGVyZXIyLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChwYXJlbnQsIG5ld0NoaWxkKSB7XG4gICAgICAgIHZhciBkZWJ1Z0VsID0gZ2V0RGVidWdOb2RlKHBhcmVudCk7XG4gICAgICAgIHZhciBkZWJ1Z0NoaWxkRWwgPSBnZXREZWJ1Z05vZGUobmV3Q2hpbGQpO1xuICAgICAgICBpZiAoZGVidWdFbCAmJiBkZWJ1Z0NoaWxkRWwgJiYgZGVidWdFbCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudF9fUFJFX1IzX18pIHtcbiAgICAgICAgICAgIGRlYnVnRWwuYWRkQ2hpbGQoZGVidWdDaGlsZEVsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChwYXJlbnQsIG5ld0NoaWxkLCByZWZDaGlsZCkge1xuICAgICAgICB2YXIgZGVidWdFbCA9IGdldERlYnVnTm9kZShwYXJlbnQpO1xuICAgICAgICB2YXIgZGVidWdDaGlsZEVsID0gZ2V0RGVidWdOb2RlKG5ld0NoaWxkKTtcbiAgICAgICAgdmFyIGRlYnVnUmVmRWwgPSBnZXREZWJ1Z05vZGUocmVmQ2hpbGQpO1xuICAgICAgICBpZiAoZGVidWdFbCAmJiBkZWJ1Z0NoaWxkRWwgJiYgZGVidWdFbCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudF9fUFJFX1IzX18pIHtcbiAgICAgICAgICAgIGRlYnVnRWwuaW5zZXJ0QmVmb3JlKGRlYnVnUmVmRWwsIGRlYnVnQ2hpbGRFbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWxlZ2F0ZS5pbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKHBhcmVudCwgb2xkQ2hpbGQpIHtcbiAgICAgICAgdmFyIGRlYnVnRWwgPSBnZXREZWJ1Z05vZGUocGFyZW50KTtcbiAgICAgICAgdmFyIGRlYnVnQ2hpbGRFbCA9IGdldERlYnVnTm9kZShvbGRDaGlsZCk7XG4gICAgICAgIGlmIChkZWJ1Z0VsICYmIGRlYnVnQ2hpbGRFbCAmJiBkZWJ1Z0VsIGluc3RhbmNlb2YgRGVidWdFbGVtZW50X19QUkVfUjNfXykge1xuICAgICAgICAgICAgZGVidWdFbC5yZW1vdmVDaGlsZChkZWJ1Z0NoaWxkRWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCk7XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyMi5wcm90b3R5cGUuc2VsZWN0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiAoc2VsZWN0b3JPck5vZGUsIHByZXNlcnZlQ29udGVudCkge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmRlbGVnYXRlLnNlbGVjdFJvb3RFbGVtZW50KHNlbGVjdG9yT3JOb2RlLCBwcmVzZXJ2ZUNvbnRlbnQpO1xuICAgICAgICB2YXIgZGVidWdDdHggPSBnZXRDdXJyZW50RGVidWdDb250ZXh0KCk7XG4gICAgICAgIGlmIChkZWJ1Z0N0eCkge1xuICAgICAgICAgICAgaW5kZXhEZWJ1Z05vZGUobmV3IERlYnVnRWxlbWVudF9fUFJFX1IzX18oZWwsIG51bGwsIGRlYnVnQ3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgZGVidWdFbCA9IGdldERlYnVnTm9kZShlbCk7XG4gICAgICAgIGlmIChkZWJ1Z0VsICYmIGRlYnVnRWwgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fKSB7XG4gICAgICAgICAgICB2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgPyBuYW1lc3BhY2UgKyAnOicgKyBuYW1lIDogbmFtZTtcbiAgICAgICAgICAgIGRlYnVnRWwuYXR0cmlidXRlc1tmdWxsTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGVnYXRlLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyMi5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gKGVsLCBuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIGRlYnVnRWwgPSBnZXREZWJ1Z05vZGUoZWwpO1xuICAgICAgICBpZiAoZGVidWdFbCAmJiBkZWJ1Z0VsIGluc3RhbmNlb2YgRGVidWdFbGVtZW50X19QUkVfUjNfXykge1xuICAgICAgICAgICAgdmFyIGZ1bGxOYW1lID0gbmFtZXNwYWNlID8gbmFtZXNwYWNlICsgJzonICsgbmFtZSA6IG5hbWU7XG4gICAgICAgICAgICBkZWJ1Z0VsLmF0dHJpYnV0ZXNbZnVsbE5hbWVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZUF0dHJpYnV0ZShlbCwgbmFtZSwgbmFtZXNwYWNlKTtcbiAgICB9O1xuICAgIERlYnVnUmVuZGVyZXIyLnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIChlbCwgbmFtZSkge1xuICAgICAgICB2YXIgZGVidWdFbCA9IGdldERlYnVnTm9kZShlbCk7XG4gICAgICAgIGlmIChkZWJ1Z0VsICYmIGRlYnVnRWwgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fKSB7XG4gICAgICAgICAgICBkZWJ1Z0VsLmNsYXNzZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuYWRkQ2xhc3MoZWwsIG5hbWUpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7XG4gICAgICAgIHZhciBkZWJ1Z0VsID0gZ2V0RGVidWdOb2RlKGVsKTtcbiAgICAgICAgaWYgKGRlYnVnRWwgJiYgZGVidWdFbCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudF9fUFJFX1IzX18pIHtcbiAgICAgICAgICAgIGRlYnVnRWwuY2xhc3Nlc1tuYW1lXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MoZWwsIG5hbWUpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnNldFN0eWxlID0gZnVuY3Rpb24gKGVsLCBzdHlsZSwgdmFsdWUsIGZsYWdzKSB7XG4gICAgICAgIHZhciBkZWJ1Z0VsID0gZ2V0RGVidWdOb2RlKGVsKTtcbiAgICAgICAgaWYgKGRlYnVnRWwgJiYgZGVidWdFbCBpbnN0YW5jZW9mIERlYnVnRWxlbWVudF9fUFJFX1IzX18pIHtcbiAgICAgICAgICAgIGRlYnVnRWwuc3R5bGVzW3N0eWxlXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsZWdhdGUuc2V0U3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSwgZmxhZ3MpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnJlbW92ZVN0eWxlID0gZnVuY3Rpb24gKGVsLCBzdHlsZSwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIGRlYnVnRWwgPSBnZXREZWJ1Z05vZGUoZWwpO1xuICAgICAgICBpZiAoZGVidWdFbCAmJiBkZWJ1Z0VsIGluc3RhbmNlb2YgRGVidWdFbGVtZW50X19QUkVfUjNfXykge1xuICAgICAgICAgICAgZGVidWdFbC5zdHlsZXNbc3R5bGVdID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZVN0eWxlKGVsLCBzdHlsZSwgZmxhZ3MpO1xuICAgIH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGVidWdFbCA9IGdldERlYnVnTm9kZShlbCk7XG4gICAgICAgIGlmIChkZWJ1Z0VsICYmIGRlYnVnRWwgaW5zdGFuY2VvZiBEZWJ1Z0VsZW1lbnRfX1BSRV9SM19fKSB7XG4gICAgICAgICAgICBkZWJ1Z0VsLnByb3BlcnRpZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyMi5wcm90b3R5cGUubGlzdGVuID0gZnVuY3Rpb24gKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciBkZWJ1Z0VsID0gZ2V0RGVidWdOb2RlKHRhcmdldCk7XG4gICAgICAgICAgICBpZiAoZGVidWdFbCkge1xuICAgICAgICAgICAgICAgIGRlYnVnRWwubGlzdGVuZXJzLnB1c2gobmV3IERlYnVnRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICBEZWJ1Z1JlbmRlcmVyMi5wcm90b3R5cGUucGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUobm9kZSk7IH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLm5leHRTaWJsaW5nID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHRoaXMuZGVsZWdhdGUubmV4dFNpYmxpbmcobm9kZSk7IH07XG4gICAgRGVidWdSZW5kZXJlcjIucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKG5vZGUsIHZhbHVlKSB7IHJldHVybiB0aGlzLmRlbGVnYXRlLnNldFZhbHVlKG5vZGUsIHZhbHVlKTsgfTtcbiAgICByZXR1cm4gRGVidWdSZW5kZXJlcjI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBvdmVycmlkZVByb3ZpZGVyKG92ZXJyaWRlKSB7XG4gICAgaW5pdFNlcnZpY2VzSWZOZWVkZWQoKTtcbiAgICByZXR1cm4gU2VydmljZXMub3ZlcnJpZGVQcm92aWRlcihvdmVycmlkZSk7XG59XG5mdW5jdGlvbiBvdmVycmlkZUNvbXBvbmVudFZpZXcoY29tcCwgY29tcG9uZW50RmFjdG9yeSkge1xuICAgIGluaXRTZXJ2aWNlc0lmTmVlZGVkKCk7XG4gICAgcmV0dXJuIFNlcnZpY2VzLm92ZXJyaWRlQ29tcG9uZW50Vmlldyhjb21wLCBjb21wb25lbnRGYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIGNsZWFyT3ZlcnJpZGVzKCkge1xuICAgIGluaXRTZXJ2aWNlc0lmTmVlZGVkKCk7XG4gICAgcmV0dXJuIFNlcnZpY2VzLmNsZWFyT3ZlcnJpZGVzKCk7XG59XG4vLyBBdHRlbnRpb246IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFzIHRvcCBsZXZlbCBmdW5jdGlvbi5cbi8vIFB1dHRpbmcgYW55IGxvZ2ljIGluIGhlcmUgd2lsbCBkZXN0cm95IGNsb3N1cmUgdHJlZSBzaGFraW5nIVxuZnVuY3Rpb24gY3JlYXRlTmdNb2R1bGVGYWN0b3J5KG5nTW9kdWxlVHlwZSwgYm9vdHN0cmFwQ29tcG9uZW50cywgZGVmRmFjdG9yeSkge1xuICAgIHJldHVybiBuZXcgTmdNb2R1bGVGYWN0b3J5XyhuZ01vZHVsZVR5cGUsIGJvb3RzdHJhcENvbXBvbmVudHMsIGRlZkZhY3RvcnkpO1xufVxuZnVuY3Rpb24gY2xvbmVOZ01vZHVsZURlZmluaXRpb24oZGVmKSB7XG4gICAgdmFyIHByb3ZpZGVycyA9IEFycmF5LmZyb20oZGVmLnByb3ZpZGVycyk7XG4gICAgdmFyIG1vZHVsZXMgPSBBcnJheS5mcm9tKGRlZi5tb2R1bGVzKTtcbiAgICB2YXIgcHJvdmlkZXJzQnlLZXkgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZGVmLnByb3ZpZGVyc0J5S2V5KSB7XG4gICAgICAgIHByb3ZpZGVyc0J5S2V5W2tleV0gPSBkZWYucHJvdmlkZXJzQnlLZXlba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFjdG9yeTogZGVmLmZhY3RvcnksXG4gICAgICAgIGlzUm9vdDogZGVmLmlzUm9vdCwgcHJvdmlkZXJzOiBwcm92aWRlcnMsIG1vZHVsZXM6IG1vZHVsZXMsIHByb3ZpZGVyc0J5S2V5OiBwcm92aWRlcnNCeUtleSxcbiAgICB9O1xufVxudmFyIE5nTW9kdWxlRmFjdG9yeV8gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5nTW9kdWxlRmFjdG9yeV8sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmdNb2R1bGVGYWN0b3J5Xyhtb2R1bGVUeXBlLCBfYm9vdHN0cmFwQ29tcG9uZW50cywgX25nTW9kdWxlRGVmRmFjdG9yeSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBcbiAgICAgICAgLy8gQXR0ZW50aW9uOiB0aGlzIGN0b3IgaXMgY2FsbGVkIGFzIHRvcCBsZXZlbCBmdW5jdGlvbi5cbiAgICAgICAgLy8gUHV0dGluZyBhbnkgbG9naWMgaW4gaGVyZSB3aWxsIGRlc3Ryb3kgY2xvc3VyZSB0cmVlIHNoYWtpbmchXG4gICAgICAgIF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlO1xuICAgICAgICBfdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cyA9IF9ib290c3RyYXBDb21wb25lbnRzO1xuICAgICAgICBfdGhpcy5fbmdNb2R1bGVEZWZGYWN0b3J5ID0gX25nTW9kdWxlRGVmRmFjdG9yeTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOZ01vZHVsZUZhY3RvcnlfLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocGFyZW50SW5qZWN0b3IpIHtcbiAgICAgICAgaW5pdFNlcnZpY2VzSWZOZWVkZWQoKTtcbiAgICAgICAgLy8gQ2xvbmUgdGhlIE5nTW9kdWxlRGVmaW5pdGlvbiBzbyB0aGF0IGFueSB0cmVlIHNoYWtlYWJsZSBwcm92aWRlciBkZWZpbml0aW9uXG4gICAgICAgIC8vIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIE5nTW9kdWxlUmVmIGRvZXNuJ3QgYWZmZWN0IHRoZSBjYWNoZWQgY29weS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzI1MDE4LlxuICAgICAgICB2YXIgZGVmID0gY2xvbmVOZ01vZHVsZURlZmluaXRpb24ocmVzb2x2ZURlZmluaXRpb24odGhpcy5fbmdNb2R1bGVEZWZGYWN0b3J5KSk7XG4gICAgICAgIHJldHVybiBTZXJ2aWNlcy5jcmVhdGVOZ01vZHVsZVJlZih0aGlzLm1vZHVsZVR5cGUsIHBhcmVudEluamVjdG9yIHx8IEluamVjdG9yLk5VTEwsIHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMsIGRlZik7XG4gICAgfTtcbiAgICByZXR1cm4gTmdNb2R1bGVGYWN0b3J5Xztcbn0oTmdNb2R1bGVGYWN0b3J5KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBjbGFuZy1mb3JtYXQgb25cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIFRoaXMgZmlsZSBvbmx5IHJlZXhwb3J0cyBjb250ZW50IG9mIHRoZSBgc3JjYCBmb2xkZXIuIEtlZXAgaXQgdGhhdCB3YXkuXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgeyBBUFBMSUNBVElPTl9NT0RVTEVfUFJPVklERVJTIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfciwgX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnkgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9vLCBfa2V5VmFsdWVEaWZmZXJzRmFjdG9yeSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX3AsIF9sb2NhbGVGYWN0b3J5IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfcSwgem9uZVNjaGVkdWxlckZhY3RvcnkgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9zLCBfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnkgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9mLCBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfbSwgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX24sIERlYnVnRWxlbWVudF9fUFJFX1IzX18gYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9sLCBEZWJ1Z05vZGVfX1BSRV9SM19fIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfaywgTnVsbEluamVjdG9yIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfYSwgaW5qZWN0SW5qZWN0b3JPbmx5IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfYiwgUmVmbGVjdGl2ZUluamVjdG9yXyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2MsIFJlZmxlY3RpdmVEZXBlbmRlbmN5IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfZCwgcmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcnMgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9lLCBnZXRNb2R1bGVGYWN0b3J5X19QUkVfUjNfXyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2osIHd0ZkVuYWJsZWQgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV90LCBjcmVhdGVTY29wZSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX3YsIGRldGVjdFdURiBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX3UsIGVuZFRpbWVSYW5nZSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX3ksIGxlYXZlIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfdywgc3RhcnRUaW1lUmFuZ2UgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV94LCBTQ0hFRFVMRVIgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9iYiwgaW5qZWN0QXR0cmlidXRlSW1wbCBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JjLCBnZXRMVmlldyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JkLCBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9iZSwgbmV4dENvbnRleHRJbXBsIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfYmYsIEJvdW5kUGxheWVyRmFjdG9yeSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JqLCBnZXRSb290Q29udGV4dCBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JwLCBsb2FkSW50ZXJuYWwgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9ibywgY3JlYXRlRWxlbWVudFJlZiBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2csIGNyZWF0ZVRlbXBsYXRlUmVmIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfaCwgY3JlYXRlVmlld1JlZiBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2ksIGdldFVybFNhbml0aXplciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JoLCBub1NpZGVFZmZlY3RzIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfYm4sIG1ha2VQYXJhbURlY29yYXRvciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JrLCBtYWtlUHJvcERlY29yYXRvciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29yZV9jb3JlX2JsLCBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb3JlX2NvcmVfYnEsIF9kZWYgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV96LCBEZWJ1Z0NvbnRleHQgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvcmVfY29yZV9iYSwgY3JlYXRlUGxhdGZvcm0sIGFzc2VydFBsYXRmb3JtLCBkZXN0cm95UGxhdGZvcm0sIGdldFBsYXRmb3JtLCBQbGF0Zm9ybVJlZiwgQXBwbGljYXRpb25SZWYsIGNyZWF0ZVBsYXRmb3JtRmFjdG9yeSwgTmdQcm9iZVRva2VuLCBlbmFibGVQcm9kTW9kZSwgaXNEZXZNb2RlLCBBUFBfSUQsIFBBQ0tBR0VfUk9PVF9VUkwsIFBMQVRGT1JNX0lOSVRJQUxJWkVSLCBQTEFURk9STV9JRCwgQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgQVBQX0lOSVRJQUxJWkVSLCBBcHBsaWNhdGlvbkluaXRTdGF0dXMsIERlYnVnRWxlbWVudCwgRGVidWdFdmVudExpc3RlbmVyLCBEZWJ1Z05vZGUsIGFzTmF0aXZlRWxlbWVudHMsIGdldERlYnVnTm9kZSwgVGVzdGFiaWxpdHksIFRlc3RhYmlsaXR5UmVnaXN0cnksIHNldFRlc3RhYmlsaXR5R2V0dGVyLCBUUkFOU0xBVElPTlMkMSBhcyBUUkFOU0xBVElPTlMsIFRSQU5TTEFUSU9OU19GT1JNQVQsIExPQ0FMRV9JRCwgTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3ksIEFwcGxpY2F0aW9uTW9kdWxlLCB3dGZDcmVhdGVTY29wZSwgd3RmTGVhdmUsIHd0ZlN0YXJ0VGltZVJhbmdlLCB3dGZFbmRUaW1lUmFuZ2UsIFR5cGUsIEV2ZW50RW1pdHRlciwgRXJyb3JIYW5kbGVyLCBTYW5pdGl6ZXIsIFNlY3VyaXR5Q29udGV4dCwgQXR0cmlidXRlLCBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTLCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnksIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBDb21wb25lbnQsIERpcmVjdGl2ZSwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgUGlwZSwgTmdNb2R1bGUsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5PX0VSUk9SU19TQ0hFTUEsIFZpZXdFbmNhcHN1bGF0aW9uLCBWZXJzaW9uLCBWRVJTSU9OLCBJbmplY3RGbGFncywgybXJtWRlZmluZUluamVjdGFibGUsIGRlZmluZUluamVjdGFibGUsIMm1ybVkZWZpbmVJbmplY3RvciwgZm9yd2FyZFJlZiwgcmVzb2x2ZUZvcndhcmRSZWYsIEluamVjdGFibGUsIElOSkVDVE9SLCBJbmplY3RvciwgybXJtWluamVjdCwgaW5qZWN0LCBSZWZsZWN0aXZlSW5qZWN0b3IsIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnksIFJlZmxlY3RpdmVLZXksIEluamVjdGlvblRva2VuLCBJbmplY3QsIE9wdGlvbmFsLCBTZWxmLCBTa2lwU2VsZiwgSG9zdCwgybUwLCDJtTEsIE5nWm9uZSwgTm9vcE5nWm9uZSBhcyDJtU5vb3BOZ1pvbmUsIFJlbmRlckNvbXBvbmVudFR5cGUsIFJlbmRlcmVyLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIsIFJlbmRlcmVyU3R5bGVGbGFnczIsIFJvb3RSZW5kZXJlciwgQ09NUElMRVJfT1BUSU9OUywgQ29tcGlsZXIsIENvbXBpbGVyRmFjdG9yeSwgTW9kdWxlV2l0aENvbXBvbmVudEZhY3RvcmllcywgQ29tcG9uZW50RmFjdG9yeSwgQ29tcG9uZW50RmFjdG9yeSBhcyDJtUNvbXBvbmVudEZhY3RvcnksIENvbXBvbmVudFJlZiwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBFbGVtZW50UmVmLCBOZ01vZHVsZUZhY3RvcnksIE5nTW9kdWxlUmVmLCBOZ01vZHVsZUZhY3RvcnlMb2FkZXIsIGdldE1vZHVsZUZhY3RvcnksIFF1ZXJ5TGlzdCwgU3lzdGVtSnNOZ01vZHVsZUxvYWRlciwgU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZywgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIEVtYmVkZGVkVmlld1JlZiwgVmlld1JlZiQxIGFzIFZpZXdSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnMsIEtleVZhbHVlRGlmZmVycywgU2ltcGxlQ2hhbmdlLCBXcmFwcGVkVmFsdWUsIHBsYXRmb3JtQ29yZSwgQUxMT1dfTVVMVElQTEVfUExBVEZPUk1TIGFzIMm1QUxMT1dfTVVMVElQTEVfUExBVEZPUk1TLCBBUFBfSURfUkFORE9NX1BST1ZJREVSIGFzIMm1QVBQX0lEX1JBTkRPTV9QUk9WSURFUiwgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyBhcyDJtWRlZmF1bHRJdGVyYWJsZURpZmZlcnMsIGRlZmF1bHRLZXlWYWx1ZURpZmZlcnMgYXMgybVkZWZhdWx0S2V5VmFsdWVEaWZmZXJzLCBkZXZNb2RlRXF1YWwgYXMgybVkZXZNb2RlRXF1YWwsIGlzTGlzdExpa2VJdGVyYWJsZSBhcyDJtWlzTGlzdExpa2VJdGVyYWJsZSwgQ2hhbmdlRGV0ZWN0b3JTdGF0dXMgYXMgybVDaGFuZ2VEZXRlY3RvclN0YXR1cywgaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgYXMgybVpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29uc29sZSBhcyDJtUNvbnNvbGUsIHNldEN1cnJlbnRJbmplY3RvciBhcyDJtXNldEN1cnJlbnRJbmplY3RvciwgZ2V0SW5qZWN0YWJsZURlZiBhcyDJtWdldEluamVjdGFibGVEZWYsIEFQUF9ST09UIGFzIMm1QVBQX1JPT1QsIGl2eUVuYWJsZWQgYXMgybVpdnlFbmFibGVkLCBDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIGFzIMm1Q29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgY2xlYXJSZXNvbHV0aW9uT2ZDb21wb25lbnRSZXNvdXJjZXNRdWV1ZSBhcyDJtWNsZWFyUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzUXVldWUsIHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMgYXMgybVyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzLCBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzIGFzIMm1UmVmbGVjdGlvbkNhcGFiaWxpdGllcywgUmVuZGVyRGVidWdJbmZvIGFzIMm1UmVuZGVyRGVidWdJbmZvLCBfc2FuaXRpemVIdG1sIGFzIMm1X3Nhbml0aXplSHRtbCwgX3Nhbml0aXplU3R5bGUgYXMgybVfc2FuaXRpemVTdHlsZSwgX3Nhbml0aXplVXJsIGFzIMm1X3Nhbml0aXplVXJsLCBfZ2xvYmFsIGFzIMm1Z2xvYmFsLCBsb29zZUlkZW50aWNhbCBhcyDJtWxvb3NlSWRlbnRpY2FsLCBzdHJpbmdpZnkgYXMgybVzdHJpbmdpZnksIG1ha2VEZWNvcmF0b3IgYXMgybVtYWtlRGVjb3JhdG9yLCBpc09ic2VydmFibGUgYXMgybVpc09ic2VydmFibGUsIGlzUHJvbWlzZSBhcyDJtWlzUHJvbWlzZSwgY2xlYXJPdmVycmlkZXMgYXMgybVjbGVhck92ZXJyaWRlcywgaW5pdFNlcnZpY2VzSWZOZWVkZWQgYXMgybVpbml0U2VydmljZXNJZk5lZWRlZCwgb3ZlcnJpZGVDb21wb25lbnRWaWV3IGFzIMm1b3ZlcnJpZGVDb21wb25lbnRWaWV3LCBvdmVycmlkZVByb3ZpZGVyIGFzIMm1b3ZlcnJpZGVQcm92aWRlciwgTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiBhcyDJtU5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IsIMm1ybVkZWZpbmVCYXNlLCDJtcm1ZGVmaW5lQ29tcG9uZW50LCDJtcm1ZGVmaW5lRGlyZWN0aXZlLCDJtcm1ZGVmaW5lUGlwZSwgybXJtWRlZmluZU5nTW9kdWxlLCBkZXRlY3RDaGFuZ2VzIGFzIMm1ZGV0ZWN0Q2hhbmdlcywgcmVuZGVyQ29tcG9uZW50IGFzIMm1cmVuZGVyQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5JDEgYXMgybVSZW5kZXIzQ29tcG9uZW50RmFjdG9yeSwgQ29tcG9uZW50UmVmJDEgYXMgybVSZW5kZXIzQ29tcG9uZW50UmVmLCDJtcm1ZGlyZWN0aXZlSW5qZWN0LCDJtcm1aW5qZWN0QXR0cmlidXRlLCDJtcm1Z2V0RmFjdG9yeU9mLCDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeSwgybXJtXNldENvbXBvbmVudFNjb3BlLCDJtcm1c2V0TmdNb2R1bGVTY29wZSwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yLCDJtcm1UHJvdmlkZXJzRmVhdHVyZSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZSwgTGlmZWN5Y2xlSG9va3NGZWF0dXJlIGFzIMm1TGlmZWN5Y2xlSG9va3NGZWF0dXJlLCBOZ01vZHVsZVJlZiQxIGFzIMm1UmVuZGVyM05nTW9kdWxlUmVmLCBtYXJrRGlydHkgYXMgybVtYXJrRGlydHksIE5nTW9kdWxlRmFjdG9yeSQxIGFzIMm1TmdNb2R1bGVGYWN0b3J5LCBOT19DSEFOR0UgYXMgybVOT19DSEFOR0UsIMm1ybVjb250YWluZXIsIMm1ybVuZXh0Q29udGV4dCwgybXJtWVsZW1lbnRTdGFydCwgybXJtW5hbWVzcGFjZUhUTUwsIMm1ybVuYW1lc3BhY2VNYXRoTUwsIMm1ybVuYW1lc3BhY2VTVkcsIMm1ybVlbGVtZW50LCDJtcm1bGlzdGVuZXIsIMm1ybV0ZXh0LCDJtcm1ZW1iZWRkZWRWaWV3U3RhcnQsIMm1ybVwcm9qZWN0aW9uLCDJtcm1YmluZCwgybXJtWludGVycG9sYXRpb24xLCDJtcm1aW50ZXJwb2xhdGlvbjIsIMm1ybVpbnRlcnBvbGF0aW9uMywgybXJtWludGVycG9sYXRpb240LCDJtcm1aW50ZXJwb2xhdGlvbjUsIMm1ybVpbnRlcnBvbGF0aW9uNiwgybXJtWludGVycG9sYXRpb243LCDJtcm1aW50ZXJwb2xhdGlvbjgsIMm1ybVpbnRlcnBvbGF0aW9uViwgybXJtXBpcGVCaW5kMSwgybXJtXBpcGVCaW5kMiwgybXJtXBpcGVCaW5kMywgybXJtXBpcGVCaW5kNCwgybXJtXBpcGVCaW5kViwgybXJtXB1cmVGdW5jdGlvbjAsIMm1ybVwdXJlRnVuY3Rpb24xLCDJtcm1cHVyZUZ1bmN0aW9uMiwgybXJtXB1cmVGdW5jdGlvbjMsIMm1ybVwdXJlRnVuY3Rpb240LCDJtcm1cHVyZUZ1bmN0aW9uNSwgybXJtXB1cmVGdW5jdGlvbjYsIMm1ybVwdXJlRnVuY3Rpb243LCDJtcm1cHVyZUZ1bmN0aW9uOCwgybXJtXB1cmVGdW5jdGlvblYsIMm1ybVnZXRDdXJyZW50VmlldywgZ2V0RGlyZWN0aXZlcyBhcyDJtWdldERpcmVjdGl2ZXMsIGdldEhvc3RFbGVtZW50IGFzIMm1Z2V0SG9zdEVsZW1lbnQsIMm1ybVyZXN0b3JlVmlldywgybXJtWNvbnRhaW5lclJlZnJlc2hTdGFydCwgybXJtWNvbnRhaW5lclJlZnJlc2hFbmQsIMm1ybVxdWVyeVJlZnJlc2gsIMm1ybV2aWV3UXVlcnksIMm1ybVzdGF0aWNWaWV3UXVlcnksIMm1ybVzdGF0aWNDb250ZW50UXVlcnksIMm1ybVsb2FkVmlld1F1ZXJ5LCDJtcm1Y29udGVudFF1ZXJ5LCDJtcm1bG9hZENvbnRlbnRRdWVyeSwgybXJtWVsZW1lbnRFbmQsIMm1ybVlbGVtZW50UHJvcGVydHksIMm1ybVwcm9wZXJ0eSwgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUsIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMSwgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyLCDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMsIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCwgybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1LCDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYsIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNywgybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4LCDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYsIMm1ybVjb21wb25lbnRIb3N0U3ludGhldGljUHJvcGVydHksIMm1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXIsIMm1ybVwcm9qZWN0aW9uRGVmLCDJtcm1cmVmZXJlbmNlLCDJtcm1ZW5hYmxlQmluZGluZ3MsIMm1ybVkaXNhYmxlQmluZGluZ3MsIMm1ybVhbGxvY0hvc3RWYXJzLCDJtcm1ZWxlbWVudEF0dHJpYnV0ZSwgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCwgybXJtWVsZW1lbnRDb250YWluZXJFbmQsIMm1ybVlbGVtZW50U3R5bGluZywgybXJtWVsZW1lbnRTdHlsaW5nTWFwLCDJtcm1ZWxlbWVudFN0eWxlUHJvcCwgybXJtWVsZW1lbnRTdHlsaW5nQXBwbHksIMm1ybVlbGVtZW50Q2xhc3NQcm9wLCDJtcm1ZWxlbWVudEhvc3RBdHRycywgybXJtWVsZW1lbnRIb3N0U3R5bGluZywgybXJtWVsZW1lbnRIb3N0U3R5bGluZ01hcCwgybXJtWVsZW1lbnRIb3N0U3R5bGVQcm9wLCDJtcm1ZWxlbWVudEhvc3RDbGFzc1Byb3AsIMm1ybVlbGVtZW50SG9zdFN0eWxpbmdBcHBseSwgybXJtXNlbGVjdCwgybXJtXRleHRCaW5kaW5nLCDJtcm1dGVtcGxhdGUsIMm1ybVlbWJlZGRlZFZpZXdFbmQsIHN0b3JlIGFzIMm1c3RvcmUsIMm1ybVsb2FkLCDJtcm1cGlwZSwgd2hlblJlbmRlcmVkIGFzIMm1d2hlblJlbmRlcmVkLCDJtcm1aTE4biwgybXJtWkxOG5BdHRyaWJ1dGVzLCDJtcm1aTE4bkV4cCwgybXJtWkxOG5TdGFydCwgybXJtWkxOG5FbmQsIMm1ybVpMThuQXBwbHksIMm1ybVpMThuUG9zdHByb2Nlc3MsIGkxOG5Db25maWd1cmVMb2NhbGl6ZSBhcyDJtWkxOG5Db25maWd1cmVMb2NhbGl6ZSwgybXJtWkxOG5Mb2NhbGl6ZSwgc2V0Q2xhc3NNZXRhZGF0YSBhcyDJtXNldENsYXNzTWV0YWRhdGEsIMm1ybVyZXNvbHZlV2luZG93LCDJtcm1cmVzb2x2ZURvY3VtZW50LCDJtcm1cmVzb2x2ZUJvZHksIGNvbXBpbGVDb21wb25lbnQgYXMgybVjb21waWxlQ29tcG9uZW50LCBjb21waWxlRGlyZWN0aXZlIGFzIMm1Y29tcGlsZURpcmVjdGl2ZSwgY29tcGlsZU5nTW9kdWxlIGFzIMm1Y29tcGlsZU5nTW9kdWxlLCBjb21waWxlTmdNb2R1bGVEZWZzIGFzIMm1Y29tcGlsZU5nTW9kdWxlRGVmcywgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUgYXMgybVwYXRjaENvbXBvbmVudERlZldpdGhTY29wZSwgcmVzZXRDb21waWxlZENvbXBvbmVudHMgYXMgybVyZXNldENvbXBpbGVkQ29tcG9uZW50cywgZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlIGFzIMm1Zmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlLCB0cmFuc2l0aXZlU2NvcGVzRm9yIGFzIMm1dHJhbnNpdGl2ZVNjb3Blc0ZvciwgY29tcGlsZVBpcGUgYXMgybVjb21waWxlUGlwZSwgybXJtXNhbml0aXplSHRtbCwgybXJtXNhbml0aXplU3R5bGUsIMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIsIMm1ybVzYW5pdGl6ZVNjcmlwdCwgybXJtXNhbml0aXplVXJsLCDJtcm1c2FuaXRpemVSZXNvdXJjZVVybCwgybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCwgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sIGFzIMm1YnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sLCBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFN0eWxlIGFzIMm1YnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSwgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTY3JpcHQgYXMgybVieXBhc3NTYW5pdGl6YXRpb25UcnVzdFNjcmlwdCwgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RVcmwgYXMgybVieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybCwgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RSZXNvdXJjZVVybCBhcyDJtWJ5cGFzc1Nhbml0aXphdGlvblRydXN0UmVzb3VyY2VVcmwsIGdldExDb250ZXh0IGFzIMm1Z2V0TENvbnRleHQsIE5HX0VMRU1FTlRfSUQgYXMgybVOR19FTEVNRU5UX0lELCBOR19DT01QT05FTlRfREVGIGFzIMm1TkdfQ09NUE9ORU5UX0RFRiwgTkdfRElSRUNUSVZFX0RFRiBhcyDJtU5HX0RJUkVDVElWRV9ERUYsIE5HX1BJUEVfREVGIGFzIMm1TkdfUElQRV9ERUYsIE5HX01PRFVMRV9ERUYgYXMgybVOR19NT0RVTEVfREVGLCBOR19CQVNFX0RFRiBhcyDJtU5HX0JBU0VfREVGLCBOR19JTkpFQ1RBQkxFX0RFRiBhcyDJtU5HX0lOSkVDVEFCTEVfREVGLCBOR19JTkpFQ1RPUl9ERUYgYXMgybVOR19JTkpFQ1RPUl9ERUYsIGJpbmRQbGF5ZXJGYWN0b3J5IGFzIMm1YmluZFBsYXllckZhY3RvcnksIGFkZFBsYXllciBhcyDJtWFkZFBsYXllciwgZ2V0UGxheWVycyBhcyDJtWdldFBsYXllcnMsIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BPU1RfUjNfXyBhcyDJtWNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BPU1RfUjNfXywgaXNCb3VuZFRvTW9kdWxlX19QT1NUX1IzX18gYXMgybVpc0JvdW5kVG9Nb2R1bGVfX1BPU1RfUjNfXywgU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UX19QT1NUX1IzX18gYXMgybVTV0lUQ0hfQ09NUElMRV9DT01QT05FTlRfX1BPU1RfUjNfXywgU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFX19QT1NUX1IzX18gYXMgybVTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BPU1RfUjNfXywgU1dJVENIX0NPTVBJTEVfUElQRV9fUE9TVF9SM19fIGFzIMm1U1dJVENIX0NPTVBJTEVfUElQRV9fUE9TVF9SM19fLCBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRV9fUE9TVF9SM19fIGFzIMm1U1dJVENIX0NPTVBJTEVfTkdNT0RVTEVfX1BPU1RfUjNfXywgZ2V0RGVidWdOb2RlX19QT1NUX1IzX18gYXMgybVnZXREZWJ1Z05vZGVfX1BPU1RfUjNfXywgU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUE9TVF9SM19fIGFzIMm1U1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUE9TVF9SM19fLCBTV0lUQ0hfSVZZX0VOQUJMRURfX1BPU1RfUjNfXyBhcyDJtVNXSVRDSF9JVllfRU5BQkxFRF9fUE9TVF9SM19fLCBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gYXMgybVTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZX19QT1NUX1IzX18sIENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18gYXMgybVDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fLCBDb21waWxlcl9jb21waWxlTW9kdWxlQXN5bmNfX1BPU1RfUjNfXyBhcyDJtUNvbXBpbGVyX2NvbXBpbGVNb2R1bGVBc3luY19fUE9TVF9SM19fLCBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmNfX1BPU1RfUjNfXyBhcyDJtUNvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luY19fUE9TVF9SM19fLCBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jX19QT1NUX1IzX18gYXMgybVDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jX19QT1NUX1IzX18sIFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gYXMgybVTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUE9TVF9SM19fLCBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXyBhcyDJtVNXSVRDSF9URU1QTEFURV9SRUZfRkFDVE9SWV9fUE9TVF9SM19fLCBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXyBhcyDJtVNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fLCBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUllfX1BPU1RfUjNfXyBhcyDJtVNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fLCBnZXRNb2R1bGVGYWN0b3J5X19QT1NUX1IzX18gYXMgybVnZXRNb2R1bGVGYWN0b3J5X19QT1NUX1IzX18sIHJlZ2lzdGVyTmdNb2R1bGVUeXBlIGFzIMm1cmVnaXN0ZXJOZ01vZHVsZVR5cGUsIHB1Ymxpc2hHbG9iYWxVdGlsIGFzIMm1cHVibGlzaEdsb2JhbFV0aWwsIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMgYXMgybVwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzLCBjcmVhdGVJbmplY3RvciBhcyDJtWNyZWF0ZUluamVjdG9yLCByZWdpc3Rlck1vZHVsZUZhY3RvcnkgYXMgybVyZWdpc3Rlck1vZHVsZUZhY3RvcnksIEVNUFRZX0FSUkFZJDMgYXMgybVFTVBUWV9BUlJBWSwgRU1QVFlfTUFQIGFzIMm1RU1QVFlfTUFQLCBhbmNob3JEZWYgYXMgybVhbmQsIGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkgYXMgybVjY2YsIGNyZWF0ZU5nTW9kdWxlRmFjdG9yeSBhcyDJtWNtZiwgY3JlYXRlUmVuZGVyZXJUeXBlMiBhcyDJtWNydCwgZGlyZWN0aXZlRGVmIGFzIMm1ZGlkLCBlbGVtZW50RGVmIGFzIMm1ZWxkLCBnZXRDb21wb25lbnRWaWV3RGVmaW5pdGlvbkZhY3RvcnkgYXMgybVnZXRDb21wb25lbnRWaWV3RGVmaW5pdGlvbkZhY3RvcnksIGlubGluZUludGVycG9sYXRlIGFzIMm1aW5saW5lSW50ZXJwb2xhdGUsIGludGVycG9sYXRlIGFzIMm1aW50ZXJwb2xhdGUsIG1vZHVsZURlZiBhcyDJtW1vZCwgbW9kdWxlUHJvdmlkZURlZiBhcyDJtW1wZCwgbmdDb250ZW50RGVmIGFzIMm1bmNkLCBub2RlVmFsdWUgYXMgybVub3YsIHBpcGVEZWYgYXMgybVwaWQsIHByb3ZpZGVyRGVmIGFzIMm1cHJkLCBwdXJlQXJyYXlEZWYgYXMgybVwYWQsIHB1cmVPYmplY3REZWYgYXMgybVwb2QsIHB1cmVQaXBlRGVmIGFzIMm1cHBkLCBxdWVyeURlZiBhcyDJtXF1ZCwgdGV4dERlZiBhcyDJtXRlZCwgdW53cmFwVmFsdWUgYXMgybV1bnYsIHZpZXdEZWYgYXMgybV2aWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwXG4iLCIvKipcbiAqIEBsaWNlbnNlIEFuZ3VsYXIgdjguMC4zXG4gKiAoYykgMjAxMC0yMDE5IEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby9cbiAqIExpY2Vuc2U6IE1JVFxuICovXG5cbmltcG9ydCB7IF9fYXNzaWduLCBfX3NwcmVhZCwgX19leHRlbmRzLCBfX3ZhbHVlcywgX19yZWFkIH0gZnJvbSAndHNsaWInO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVGFnQ29udGVudFR5cGU7XG4oZnVuY3Rpb24gKFRhZ0NvbnRlbnRUeXBlKSB7XG4gICAgVGFnQ29udGVudFR5cGVbVGFnQ29udGVudFR5cGVbXCJSQVdfVEVYVFwiXSA9IDBdID0gXCJSQVdfVEVYVFwiO1xuICAgIFRhZ0NvbnRlbnRUeXBlW1RhZ0NvbnRlbnRUeXBlW1wiRVNDQVBBQkxFX1JBV19URVhUXCJdID0gMV0gPSBcIkVTQ0FQQUJMRV9SQVdfVEVYVFwiO1xuICAgIFRhZ0NvbnRlbnRUeXBlW1RhZ0NvbnRlbnRUeXBlW1wiUEFSU0FCTEVfREFUQVwiXSA9IDJdID0gXCJQQVJTQUJMRV9EQVRBXCI7XG59KShUYWdDb250ZW50VHlwZSB8fCAoVGFnQ29udGVudFR5cGUgPSB7fSkpO1xuZnVuY3Rpb24gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpIHtcbiAgICBpZiAoZWxlbWVudE5hbWVbMF0gIT0gJzonKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgZWxlbWVudE5hbWVdO1xuICAgIH1cbiAgICB2YXIgY29sb25JbmRleCA9IGVsZW1lbnROYW1lLmluZGV4T2YoJzonLCAxKTtcbiAgICBpZiAoY29sb25JbmRleCA9PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBmb3JtYXQgXFxcIlwiICsgZWxlbWVudE5hbWUgKyBcIlxcXCIgZXhwZWN0aW5nIFxcXCI6bmFtZXNwYWNlOm5hbWVcXFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gW2VsZW1lbnROYW1lLnNsaWNlKDEsIGNvbG9uSW5kZXgpLCBlbGVtZW50TmFtZS5zbGljZShjb2xvbkluZGV4ICsgMSldO1xufVxuLy8gYDxuZy1jb250YWluZXI+YCB0YWdzIHdvcmsgdGhlIHNhbWUgcmVnYXJkbGVzcyB0aGUgbmFtZXNwYWNlXG5mdW5jdGlvbiBpc05nQ29udGFpbmVyKHRhZ05hbWUpIHtcbiAgICByZXR1cm4gc3BsaXROc05hbWUodGFnTmFtZSlbMV0gPT09ICduZy1jb250YWluZXInO1xufVxuLy8gYDxuZy1jb250ZW50PmAgdGFncyB3b3JrIHRoZSBzYW1lIHJlZ2FyZGxlc3MgdGhlIG5hbWVzcGFjZVxuZnVuY3Rpb24gaXNOZ0NvbnRlbnQodGFnTmFtZSkge1xuICAgIHJldHVybiBzcGxpdE5zTmFtZSh0YWdOYW1lKVsxXSA9PT0gJ25nLWNvbnRlbnQnO1xufVxuLy8gYDxuZy10ZW1wbGF0ZT5gIHRhZ3Mgd29yayB0aGUgc2FtZSByZWdhcmRsZXNzIHRoZSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGlzTmdUZW1wbGF0ZSh0YWdOYW1lKSB7XG4gICAgcmV0dXJuIHNwbGl0TnNOYW1lKHRhZ05hbWUpWzFdID09PSAnbmctdGVtcGxhdGUnO1xufVxuZnVuY3Rpb24gZ2V0TnNQcmVmaXgoZnVsbE5hbWUpIHtcbiAgICByZXR1cm4gZnVsbE5hbWUgPT09IG51bGwgPyBudWxsIDogc3BsaXROc05hbWUoZnVsbE5hbWUpWzBdO1xufVxuZnVuY3Rpb24gbWVyZ2VOc0FuZE5hbWUocHJlZml4LCBsb2NhbE5hbWUpIHtcbiAgICByZXR1cm4gcHJlZml4ID8gXCI6XCIgKyBwcmVmaXggKyBcIjpcIiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTtcbn1cbi8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXNcbi8vIHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbnRpdGllcy5qc29uXG4vLyBUaGlzIGxpc3QgaXMgbm90IGV4aGF1c3RpdmUgdG8ga2VlcCB0aGUgY29tcGlsZXIgZm9vdHByaW50IGxvdy5cbi8vIFRoZSBgJiMxMjM7YCAvIGAmI3gxYWI7YCBzeW50YXggc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBkb2VzIG5vdFxuLy8gZXhpc3QuXG52YXIgTkFNRURfRU5USVRJRVMgPSB7XG4gICAgJ0FhY3V0ZSc6ICdcXHUwMEMxJyxcbiAgICAnYWFjdXRlJzogJ1xcdTAwRTEnLFxuICAgICdBY2lyYyc6ICdcXHUwMEMyJyxcbiAgICAnYWNpcmMnOiAnXFx1MDBFMicsXG4gICAgJ2FjdXRlJzogJ1xcdTAwQjQnLFxuICAgICdBRWxpZyc6ICdcXHUwMEM2JyxcbiAgICAnYWVsaWcnOiAnXFx1MDBFNicsXG4gICAgJ0FncmF2ZSc6ICdcXHUwMEMwJyxcbiAgICAnYWdyYXZlJzogJ1xcdTAwRTAnLFxuICAgICdhbGVmc3ltJzogJ1xcdTIxMzUnLFxuICAgICdBbHBoYSc6ICdcXHUwMzkxJyxcbiAgICAnYWxwaGEnOiAnXFx1MDNCMScsXG4gICAgJ2FtcCc6ICcmJyxcbiAgICAnYW5kJzogJ1xcdTIyMjcnLFxuICAgICdhbmcnOiAnXFx1MjIyMCcsXG4gICAgJ2Fwb3MnOiAnXFx1MDAyNycsXG4gICAgJ0FyaW5nJzogJ1xcdTAwQzUnLFxuICAgICdhcmluZyc6ICdcXHUwMEU1JyxcbiAgICAnYXN5bXAnOiAnXFx1MjI0OCcsXG4gICAgJ0F0aWxkZSc6ICdcXHUwMEMzJyxcbiAgICAnYXRpbGRlJzogJ1xcdTAwRTMnLFxuICAgICdBdW1sJzogJ1xcdTAwQzQnLFxuICAgICdhdW1sJzogJ1xcdTAwRTQnLFxuICAgICdiZHF1byc6ICdcXHUyMDFFJyxcbiAgICAnQmV0YSc6ICdcXHUwMzkyJyxcbiAgICAnYmV0YSc6ICdcXHUwM0IyJyxcbiAgICAnYnJ2YmFyJzogJ1xcdTAwQTYnLFxuICAgICdidWxsJzogJ1xcdTIwMjInLFxuICAgICdjYXAnOiAnXFx1MjIyOScsXG4gICAgJ0NjZWRpbCc6ICdcXHUwMEM3JyxcbiAgICAnY2NlZGlsJzogJ1xcdTAwRTcnLFxuICAgICdjZWRpbCc6ICdcXHUwMEI4JyxcbiAgICAnY2VudCc6ICdcXHUwMEEyJyxcbiAgICAnQ2hpJzogJ1xcdTAzQTcnLFxuICAgICdjaGknOiAnXFx1MDNDNycsXG4gICAgJ2NpcmMnOiAnXFx1MDJDNicsXG4gICAgJ2NsdWJzJzogJ1xcdTI2NjMnLFxuICAgICdjb25nJzogJ1xcdTIyNDUnLFxuICAgICdjb3B5JzogJ1xcdTAwQTknLFxuICAgICdjcmFycic6ICdcXHUyMUI1JyxcbiAgICAnY3VwJzogJ1xcdTIyMkEnLFxuICAgICdjdXJyZW4nOiAnXFx1MDBBNCcsXG4gICAgJ2RhZ2dlcic6ICdcXHUyMDIwJyxcbiAgICAnRGFnZ2VyJzogJ1xcdTIwMjEnLFxuICAgICdkYXJyJzogJ1xcdTIxOTMnLFxuICAgICdkQXJyJzogJ1xcdTIxRDMnLFxuICAgICdkZWcnOiAnXFx1MDBCMCcsXG4gICAgJ0RlbHRhJzogJ1xcdTAzOTQnLFxuICAgICdkZWx0YSc6ICdcXHUwM0I0JyxcbiAgICAnZGlhbXMnOiAnXFx1MjY2NicsXG4gICAgJ2RpdmlkZSc6ICdcXHUwMEY3JyxcbiAgICAnRWFjdXRlJzogJ1xcdTAwQzknLFxuICAgICdlYWN1dGUnOiAnXFx1MDBFOScsXG4gICAgJ0VjaXJjJzogJ1xcdTAwQ0EnLFxuICAgICdlY2lyYyc6ICdcXHUwMEVBJyxcbiAgICAnRWdyYXZlJzogJ1xcdTAwQzgnLFxuICAgICdlZ3JhdmUnOiAnXFx1MDBFOCcsXG4gICAgJ2VtcHR5JzogJ1xcdTIyMDUnLFxuICAgICdlbXNwJzogJ1xcdTIwMDMnLFxuICAgICdlbnNwJzogJ1xcdTIwMDInLFxuICAgICdFcHNpbG9uJzogJ1xcdTAzOTUnLFxuICAgICdlcHNpbG9uJzogJ1xcdTAzQjUnLFxuICAgICdlcXVpdic6ICdcXHUyMjYxJyxcbiAgICAnRXRhJzogJ1xcdTAzOTcnLFxuICAgICdldGEnOiAnXFx1MDNCNycsXG4gICAgJ0VUSCc6ICdcXHUwMEQwJyxcbiAgICAnZXRoJzogJ1xcdTAwRjAnLFxuICAgICdFdW1sJzogJ1xcdTAwQ0InLFxuICAgICdldW1sJzogJ1xcdTAwRUInLFxuICAgICdldXJvJzogJ1xcdTIwQUMnLFxuICAgICdleGlzdCc6ICdcXHUyMjAzJyxcbiAgICAnZm5vZic6ICdcXHUwMTkyJyxcbiAgICAnZm9yYWxsJzogJ1xcdTIyMDAnLFxuICAgICdmcmFjMTInOiAnXFx1MDBCRCcsXG4gICAgJ2ZyYWMxNCc6ICdcXHUwMEJDJyxcbiAgICAnZnJhYzM0JzogJ1xcdTAwQkUnLFxuICAgICdmcmFzbCc6ICdcXHUyMDQ0JyxcbiAgICAnR2FtbWEnOiAnXFx1MDM5MycsXG4gICAgJ2dhbW1hJzogJ1xcdTAzQjMnLFxuICAgICdnZSc6ICdcXHUyMjY1JyxcbiAgICAnZ3QnOiAnPicsXG4gICAgJ2hhcnInOiAnXFx1MjE5NCcsXG4gICAgJ2hBcnInOiAnXFx1MjFENCcsXG4gICAgJ2hlYXJ0cyc6ICdcXHUyNjY1JyxcbiAgICAnaGVsbGlwJzogJ1xcdTIwMjYnLFxuICAgICdJYWN1dGUnOiAnXFx1MDBDRCcsXG4gICAgJ2lhY3V0ZSc6ICdcXHUwMEVEJyxcbiAgICAnSWNpcmMnOiAnXFx1MDBDRScsXG4gICAgJ2ljaXJjJzogJ1xcdTAwRUUnLFxuICAgICdpZXhjbCc6ICdcXHUwMEExJyxcbiAgICAnSWdyYXZlJzogJ1xcdTAwQ0MnLFxuICAgICdpZ3JhdmUnOiAnXFx1MDBFQycsXG4gICAgJ2ltYWdlJzogJ1xcdTIxMTEnLFxuICAgICdpbmZpbic6ICdcXHUyMjFFJyxcbiAgICAnaW50JzogJ1xcdTIyMkInLFxuICAgICdJb3RhJzogJ1xcdTAzOTknLFxuICAgICdpb3RhJzogJ1xcdTAzQjknLFxuICAgICdpcXVlc3QnOiAnXFx1MDBCRicsXG4gICAgJ2lzaW4nOiAnXFx1MjIwOCcsXG4gICAgJ0l1bWwnOiAnXFx1MDBDRicsXG4gICAgJ2l1bWwnOiAnXFx1MDBFRicsXG4gICAgJ0thcHBhJzogJ1xcdTAzOUEnLFxuICAgICdrYXBwYSc6ICdcXHUwM0JBJyxcbiAgICAnTGFtYmRhJzogJ1xcdTAzOUInLFxuICAgICdsYW1iZGEnOiAnXFx1MDNCQicsXG4gICAgJ2xhbmcnOiAnXFx1MjdFOCcsXG4gICAgJ2xhcXVvJzogJ1xcdTAwQUInLFxuICAgICdsYXJyJzogJ1xcdTIxOTAnLFxuICAgICdsQXJyJzogJ1xcdTIxRDAnLFxuICAgICdsY2VpbCc6ICdcXHUyMzA4JyxcbiAgICAnbGRxdW8nOiAnXFx1MjAxQycsXG4gICAgJ2xlJzogJ1xcdTIyNjQnLFxuICAgICdsZmxvb3InOiAnXFx1MjMwQScsXG4gICAgJ2xvd2FzdCc6ICdcXHUyMjE3JyxcbiAgICAnbG96JzogJ1xcdTI1Q0EnLFxuICAgICdscm0nOiAnXFx1MjAwRScsXG4gICAgJ2xzYXF1byc6ICdcXHUyMDM5JyxcbiAgICAnbHNxdW8nOiAnXFx1MjAxOCcsXG4gICAgJ2x0JzogJzwnLFxuICAgICdtYWNyJzogJ1xcdTAwQUYnLFxuICAgICdtZGFzaCc6ICdcXHUyMDE0JyxcbiAgICAnbWljcm8nOiAnXFx1MDBCNScsXG4gICAgJ21pZGRvdCc6ICdcXHUwMEI3JyxcbiAgICAnbWludXMnOiAnXFx1MjIxMicsXG4gICAgJ011JzogJ1xcdTAzOUMnLFxuICAgICdtdSc6ICdcXHUwM0JDJyxcbiAgICAnbmFibGEnOiAnXFx1MjIwNycsXG4gICAgJ25ic3AnOiAnXFx1MDBBMCcsXG4gICAgJ25kYXNoJzogJ1xcdTIwMTMnLFxuICAgICduZSc6ICdcXHUyMjYwJyxcbiAgICAnbmknOiAnXFx1MjIwQicsXG4gICAgJ25vdCc6ICdcXHUwMEFDJyxcbiAgICAnbm90aW4nOiAnXFx1MjIwOScsXG4gICAgJ25zdWInOiAnXFx1MjI4NCcsXG4gICAgJ050aWxkZSc6ICdcXHUwMEQxJyxcbiAgICAnbnRpbGRlJzogJ1xcdTAwRjEnLFxuICAgICdOdSc6ICdcXHUwMzlEJyxcbiAgICAnbnUnOiAnXFx1MDNCRCcsXG4gICAgJ09hY3V0ZSc6ICdcXHUwMEQzJyxcbiAgICAnb2FjdXRlJzogJ1xcdTAwRjMnLFxuICAgICdPY2lyYyc6ICdcXHUwMEQ0JyxcbiAgICAnb2NpcmMnOiAnXFx1MDBGNCcsXG4gICAgJ09FbGlnJzogJ1xcdTAxNTInLFxuICAgICdvZWxpZyc6ICdcXHUwMTUzJyxcbiAgICAnT2dyYXZlJzogJ1xcdTAwRDInLFxuICAgICdvZ3JhdmUnOiAnXFx1MDBGMicsXG4gICAgJ29saW5lJzogJ1xcdTIwM0UnLFxuICAgICdPbWVnYSc6ICdcXHUwM0E5JyxcbiAgICAnb21lZ2EnOiAnXFx1MDNDOScsXG4gICAgJ09taWNyb24nOiAnXFx1MDM5RicsXG4gICAgJ29taWNyb24nOiAnXFx1MDNCRicsXG4gICAgJ29wbHVzJzogJ1xcdTIyOTUnLFxuICAgICdvcic6ICdcXHUyMjI4JyxcbiAgICAnb3JkZic6ICdcXHUwMEFBJyxcbiAgICAnb3JkbSc6ICdcXHUwMEJBJyxcbiAgICAnT3NsYXNoJzogJ1xcdTAwRDgnLFxuICAgICdvc2xhc2gnOiAnXFx1MDBGOCcsXG4gICAgJ090aWxkZSc6ICdcXHUwMEQ1JyxcbiAgICAnb3RpbGRlJzogJ1xcdTAwRjUnLFxuICAgICdvdGltZXMnOiAnXFx1MjI5NycsXG4gICAgJ091bWwnOiAnXFx1MDBENicsXG4gICAgJ291bWwnOiAnXFx1MDBGNicsXG4gICAgJ3BhcmEnOiAnXFx1MDBCNicsXG4gICAgJ3Blcm1pbCc6ICdcXHUyMDMwJyxcbiAgICAncGVycCc6ICdcXHUyMkE1JyxcbiAgICAnUGhpJzogJ1xcdTAzQTYnLFxuICAgICdwaGknOiAnXFx1MDNDNicsXG4gICAgJ1BpJzogJ1xcdTAzQTAnLFxuICAgICdwaSc6ICdcXHUwM0MwJyxcbiAgICAncGl2JzogJ1xcdTAzRDYnLFxuICAgICdwbHVzbW4nOiAnXFx1MDBCMScsXG4gICAgJ3BvdW5kJzogJ1xcdTAwQTMnLFxuICAgICdwcmltZSc6ICdcXHUyMDMyJyxcbiAgICAnUHJpbWUnOiAnXFx1MjAzMycsXG4gICAgJ3Byb2QnOiAnXFx1MjIwRicsXG4gICAgJ3Byb3AnOiAnXFx1MjIxRCcsXG4gICAgJ1BzaSc6ICdcXHUwM0E4JyxcbiAgICAncHNpJzogJ1xcdTAzQzgnLFxuICAgICdxdW90JzogJ1xcdTAwMjInLFxuICAgICdyYWRpYyc6ICdcXHUyMjFBJyxcbiAgICAncmFuZyc6ICdcXHUyN0U5JyxcbiAgICAncmFxdW8nOiAnXFx1MDBCQicsXG4gICAgJ3JhcnInOiAnXFx1MjE5MicsXG4gICAgJ3JBcnInOiAnXFx1MjFEMicsXG4gICAgJ3JjZWlsJzogJ1xcdTIzMDknLFxuICAgICdyZHF1byc6ICdcXHUyMDFEJyxcbiAgICAncmVhbCc6ICdcXHUyMTFDJyxcbiAgICAncmVnJzogJ1xcdTAwQUUnLFxuICAgICdyZmxvb3InOiAnXFx1MjMwQicsXG4gICAgJ1Jobyc6ICdcXHUwM0ExJyxcbiAgICAncmhvJzogJ1xcdTAzQzEnLFxuICAgICdybG0nOiAnXFx1MjAwRicsXG4gICAgJ3JzYXF1byc6ICdcXHUyMDNBJyxcbiAgICAncnNxdW8nOiAnXFx1MjAxOScsXG4gICAgJ3NicXVvJzogJ1xcdTIwMUEnLFxuICAgICdTY2Fyb24nOiAnXFx1MDE2MCcsXG4gICAgJ3NjYXJvbic6ICdcXHUwMTYxJyxcbiAgICAnc2RvdCc6ICdcXHUyMkM1JyxcbiAgICAnc2VjdCc6ICdcXHUwMEE3JyxcbiAgICAnc2h5JzogJ1xcdTAwQUQnLFxuICAgICdTaWdtYSc6ICdcXHUwM0EzJyxcbiAgICAnc2lnbWEnOiAnXFx1MDNDMycsXG4gICAgJ3NpZ21hZic6ICdcXHUwM0MyJyxcbiAgICAnc2ltJzogJ1xcdTIyM0MnLFxuICAgICdzcGFkZXMnOiAnXFx1MjY2MCcsXG4gICAgJ3N1Yic6ICdcXHUyMjgyJyxcbiAgICAnc3ViZSc6ICdcXHUyMjg2JyxcbiAgICAnc3VtJzogJ1xcdTIyMTEnLFxuICAgICdzdXAnOiAnXFx1MjI4MycsXG4gICAgJ3N1cDEnOiAnXFx1MDBCOScsXG4gICAgJ3N1cDInOiAnXFx1MDBCMicsXG4gICAgJ3N1cDMnOiAnXFx1MDBCMycsXG4gICAgJ3N1cGUnOiAnXFx1MjI4NycsXG4gICAgJ3N6bGlnJzogJ1xcdTAwREYnLFxuICAgICdUYXUnOiAnXFx1MDNBNCcsXG4gICAgJ3RhdSc6ICdcXHUwM0M0JyxcbiAgICAndGhlcmU0JzogJ1xcdTIyMzQnLFxuICAgICdUaGV0YSc6ICdcXHUwMzk4JyxcbiAgICAndGhldGEnOiAnXFx1MDNCOCcsXG4gICAgJ3RoZXRhc3ltJzogJ1xcdTAzRDEnLFxuICAgICd0aGluc3AnOiAnXFx1MjAwOScsXG4gICAgJ1RIT1JOJzogJ1xcdTAwREUnLFxuICAgICd0aG9ybic6ICdcXHUwMEZFJyxcbiAgICAndGlsZGUnOiAnXFx1MDJEQycsXG4gICAgJ3RpbWVzJzogJ1xcdTAwRDcnLFxuICAgICd0cmFkZSc6ICdcXHUyMTIyJyxcbiAgICAnVWFjdXRlJzogJ1xcdTAwREEnLFxuICAgICd1YWN1dGUnOiAnXFx1MDBGQScsXG4gICAgJ3VhcnInOiAnXFx1MjE5MScsXG4gICAgJ3VBcnInOiAnXFx1MjFEMScsXG4gICAgJ1VjaXJjJzogJ1xcdTAwREInLFxuICAgICd1Y2lyYyc6ICdcXHUwMEZCJyxcbiAgICAnVWdyYXZlJzogJ1xcdTAwRDknLFxuICAgICd1Z3JhdmUnOiAnXFx1MDBGOScsXG4gICAgJ3VtbCc6ICdcXHUwMEE4JyxcbiAgICAndXBzaWgnOiAnXFx1MDNEMicsXG4gICAgJ1Vwc2lsb24nOiAnXFx1MDNBNScsXG4gICAgJ3Vwc2lsb24nOiAnXFx1MDNDNScsXG4gICAgJ1V1bWwnOiAnXFx1MDBEQycsXG4gICAgJ3V1bWwnOiAnXFx1MDBGQycsXG4gICAgJ3dlaWVycCc6ICdcXHUyMTE4JyxcbiAgICAnWGknOiAnXFx1MDM5RScsXG4gICAgJ3hpJzogJ1xcdTAzQkUnLFxuICAgICdZYWN1dGUnOiAnXFx1MDBERCcsXG4gICAgJ3lhY3V0ZSc6ICdcXHUwMEZEJyxcbiAgICAneWVuJzogJ1xcdTAwQTUnLFxuICAgICd5dW1sJzogJ1xcdTAwRkYnLFxuICAgICdZdW1sJzogJ1xcdTAxNzgnLFxuICAgICdaZXRhJzogJ1xcdTAzOTYnLFxuICAgICd6ZXRhJzogJ1xcdTAzQjYnLFxuICAgICd6d2onOiAnXFx1MjAwRCcsXG4gICAgJ3p3bmonOiAnXFx1MjAwQycsXG59O1xuLy8gVGhlICZuZ3NwOyBwc2V1ZG8tZW50aXR5IGlzIGRlbm90aW5nIGEgc3BhY2UuIHNlZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvYW5ndWxhci9ibG9iLzBiYjYxMTM4N2QyOWQ2NWI1YWY3ZjlkMjUxNWFiNTcxZmQzZmJlZTQvX3Rlc3RzL3Rlc3QvY29tcGlsZXIvcHJlc2VydmVfd2hpdGVzcGFjZV90ZXN0LmRhcnRcbnZhciBOR1NQX1VOSUNPREUgPSAnXFx1RTUwMCc7XG5OQU1FRF9FTlRJVElFU1snbmdzcCddID0gTkdTUF9VTklDT0RFO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgSHRtbFRhZ0RlZmluaXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSHRtbFRhZ0RlZmluaXRpb24oX2EpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9iID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsIGNsb3NlZEJ5Q2hpbGRyZW4gPSBfYi5jbG9zZWRCeUNoaWxkcmVuLCBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeCA9IF9iLmltcGxpY2l0TmFtZXNwYWNlUHJlZml4LCBfYyA9IF9iLmNvbnRlbnRUeXBlLCBjb250ZW50VHlwZSA9IF9jID09PSB2b2lkIDAgPyBUYWdDb250ZW50VHlwZS5QQVJTQUJMRV9EQVRBIDogX2MsIF9kID0gX2IuY2xvc2VkQnlQYXJlbnQsIGNsb3NlZEJ5UGFyZW50ID0gX2QgPT09IHZvaWQgMCA/IGZhbHNlIDogX2QsIF9lID0gX2IuaXNWb2lkLCBpc1ZvaWQgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZSwgX2YgPSBfYi5pZ25vcmVGaXJzdExmLCBpZ25vcmVGaXJzdExmID0gX2YgPT09IHZvaWQgMCA/IGZhbHNlIDogX2Y7XG4gICAgICAgIHRoaXMuY2xvc2VkQnlDaGlsZHJlbiA9IHt9O1xuICAgICAgICB0aGlzLmNsb3NlZEJ5UGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FuU2VsZkNsb3NlID0gZmFsc2U7XG4gICAgICAgIGlmIChjbG9zZWRCeUNoaWxkcmVuICYmIGNsb3NlZEJ5Q2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2xvc2VkQnlDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uICh0YWdOYW1lKSB7IHJldHVybiBfdGhpcy5jbG9zZWRCeUNoaWxkcmVuW3RhZ05hbWVdID0gdHJ1ZTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1ZvaWQgPSBpc1ZvaWQ7XG4gICAgICAgIHRoaXMuY2xvc2VkQnlQYXJlbnQgPSBjbG9zZWRCeVBhcmVudCB8fCBpc1ZvaWQ7XG4gICAgICAgIHRoaXMuaW1wbGljaXROYW1lc3BhY2VQcmVmaXggPSBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeCB8fCBudWxsO1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7XG4gICAgICAgIHRoaXMuaWdub3JlRmlyc3RMZiA9IGlnbm9yZUZpcnN0TGY7XG4gICAgfVxuICAgIEh0bWxUYWdEZWZpbml0aW9uLnByb3RvdHlwZS5pc0Nsb3NlZEJ5Q2hpbGQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZvaWQgfHwgbmFtZS50b0xvd2VyQ2FzZSgpIGluIHRoaXMuY2xvc2VkQnlDaGlsZHJlbjtcbiAgICB9O1xuICAgIHJldHVybiBIdG1sVGFnRGVmaW5pdGlvbjtcbn0oKSk7XG52YXIgX0RFRkFVTFRfVEFHX0RFRklOSVRJT047XG4vLyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUxL3N5bnRheC5odG1sI29wdGlvbmFsLXRhZ3Ncbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgZnVsbHkgY29uZm9ybSB0byB0aGUgSFRNTDUgc3BlYy5cbnZhciBUQUdfREVGSU5JVElPTlM7XG5mdW5jdGlvbiBnZXRIdG1sVGFnRGVmaW5pdGlvbih0YWdOYW1lKSB7XG4gICAgaWYgKCFUQUdfREVGSU5JVElPTlMpIHtcbiAgICAgICAgX0RFRkFVTFRfVEFHX0RFRklOSVRJT04gPSBuZXcgSHRtbFRhZ0RlZmluaXRpb24oKTtcbiAgICAgICAgVEFHX0RFRklOSVRJT05TID0ge1xuICAgICAgICAgICAgJ2Jhc2UnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAgICAgICAnbWV0YSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdhcmVhJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2VtYmVkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2xpbmsnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAgICAgICAnaW1nJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2lucHV0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ3BhcmFtJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2hyJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2JyJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaXNWb2lkOiB0cnVlIH0pLFxuICAgICAgICAgICAgJ3NvdXJjZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICd0cmFjayc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICd3YnInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpc1ZvaWQ6IHRydWUgfSksXG4gICAgICAgICAgICAncCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7XG4gICAgICAgICAgICAgICAgY2xvc2VkQnlDaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jsb2NrcXVvdGUnLCAnZGl2JywgJ2RsJywgJ2ZpZWxkc2V0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zvb3RlcicsICdmb3JtJywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JyxcbiAgICAgICAgICAgICAgICAgICAgJ2g2JywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnbWFpbicsICduYXYnLCAnb2wnLFxuICAgICAgICAgICAgICAgICAgICAncCcsICdwcmUnLCAnc2VjdGlvbicsICd0YWJsZScsICd1bCdcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGNsb3NlZEJ5UGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICd0aGVhZCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsndGJvZHknLCAndGZvb3QnXSB9KSxcbiAgICAgICAgICAgICd0Ym9keSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsndGJvZHknLCAndGZvb3QnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAndGZvb3QnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5J10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgICAgICAgJ3RyJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWyd0ciddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICd0ZCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsndGQnLCAndGgnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAndGgnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3RkJywgJ3RoJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2NvbCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGlzVm9pZDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdzdmcnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeDogJ3N2ZycgfSksXG4gICAgICAgICAgICAnbWF0aCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGltcGxpY2l0TmFtZXNwYWNlUHJlZml4OiAnbWF0aCcgfSksXG4gICAgICAgICAgICAnbGknOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ2xpJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgICAgICAgJ2R0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydkdCcsICdkZCddIH0pLFxuICAgICAgICAgICAgJ2RkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydkdCcsICdkZCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdyYic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsncmInLCAncnQnLCAncnRjJywgJ3JwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlIH0pLFxuICAgICAgICAgICAgJ3J0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydyYicsICdydCcsICdydGMnLCAncnAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAncnRjJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydyYicsICdydGMnLCAncnAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAncnAnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0JywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdvcHRncm91cCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNsb3NlZEJ5Q2hpbGRyZW46IFsnb3B0Z3JvdXAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAnb3B0aW9uJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY2xvc2VkQnlDaGlsZHJlbjogWydvcHRpb24nLCAnb3B0Z3JvdXAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWUgfSksXG4gICAgICAgICAgICAncHJlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaWdub3JlRmlyc3RMZjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdsaXN0aW5nJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgaWdub3JlRmlyc3RMZjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICdzdHlsZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7IGNvbnRlbnRUeXBlOiBUYWdDb250ZW50VHlwZS5SQVdfVEVYVCB9KSxcbiAgICAgICAgICAgICdzY3JpcHQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjb250ZW50VHlwZTogVGFnQ29udGVudFR5cGUuUkFXX1RFWFQgfSksXG4gICAgICAgICAgICAndGl0bGUnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oeyBjb250ZW50VHlwZTogVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUIH0pLFxuICAgICAgICAgICAgJ3RleHRhcmVhJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHsgY29udGVudFR5cGU6IFRhZ0NvbnRlbnRUeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCwgaWdub3JlRmlyc3RMZjogdHJ1ZSB9KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIFRBR19ERUZJTklUSU9OU1t0YWdOYW1lLnRvTG93ZXJDYXNlKCldIHx8IF9ERUZBVUxUX1RBR19ERUZJTklUSU9OO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX1NFTEVDVE9SX1JFR0VYUCA9IG5ldyBSZWdFeHAoJyhcXFxcOm5vdFxcXFwoKXwnICsgLy9cIjpub3QoXCJcbiAgICAnKFstXFxcXHddKyl8JyArIC8vIFwidGFnXCJcbiAgICAnKD86XFxcXC4oWy1cXFxcd10rKSl8JyArIC8vIFwiLmNsYXNzXCJcbiAgICAvLyBcIi1cIiBzaG91bGQgYXBwZWFyIGZpcnN0IGluIHRoZSByZWdleHAgYmVsb3cgYXMgRkYzMSBwYXJzZXMgXCJbLi1cXHddXCIgYXMgYSByYW5nZVxuICAgICcoPzpcXFxcWyhbLS5cXFxcdypdKykoPzo9KFtcXFwiXFwnXT8pKFteXFxcXF1cXFwiXFwnXSopXFxcXDUpP1xcXFxdKXwnICsgLy8gXCJbbmFtZV1cIiwgXCJbbmFtZT12YWx1ZV1cIixcbiAgICAvLyBcIltuYW1lPVwidmFsdWVcIl1cIixcbiAgICAvLyBcIltuYW1lPSd2YWx1ZSddXCJcbiAgICAnKFxcXFwpKXwnICsgLy8gXCIpXCJcbiAgICAnKFxcXFxzKixcXFxccyopJywgLy8gXCIsXCJcbidnJyk7XG4vKipcbiAqIEEgY3NzIHNlbGVjdG9yIGNvbnRhaW5zIGFuIGVsZW1lbnQgbmFtZSxcbiAqIGNzcyBjbGFzc2VzIGFuZCBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMgd2l0aCB0aGUgcHVycG9zZVxuICogb2Ygc2VsZWN0aW5nIHN1YnNldHMgb3V0IG9mIHRoZW0uXG4gKi9cbnZhciBDc3NTZWxlY3RvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDc3NTZWxlY3RvcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbGFzc05hbWVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2VsZWN0b3JzIGFyZSBlbmNvZGVkIGluIHBhaXJzIHdoZXJlOlxuICAgICAgICAgKiAtIGV2ZW4gbG9jYXRpb25zIGFyZSBhdHRyaWJ1dGUgbmFtZXNcbiAgICAgICAgICogLSBvZGQgbG9jYXRpb25zIGFyZSBhdHRyaWJ1dGUgdmFsdWVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBFeGFtcGxlOlxuICAgICAgICAgKiBTZWxlY3RvcjogYFtrZXkxPXZhbHVlMV1ba2V5Ml1gIHdvdWxkIHBhcnNlIHRvOlxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogWydrZXkxJywgJ3ZhbHVlMScsICdrZXkyJywgJyddXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdHRycyA9IFtdO1xuICAgICAgICB0aGlzLm5vdFNlbGVjdG9ycyA9IFtdO1xuICAgIH1cbiAgICBDc3NTZWxlY3Rvci5wYXJzZSA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICB2YXIgX2FkZFJlc3VsdCA9IGZ1bmN0aW9uIChyZXMsIGNzc1NlbCkge1xuICAgICAgICAgICAgaWYgKGNzc1NlbC5ub3RTZWxlY3RvcnMubGVuZ3RoID4gMCAmJiAhY3NzU2VsLmVsZW1lbnQgJiYgY3NzU2VsLmNsYXNzTmFtZXMubGVuZ3RoID09IDAgJiZcbiAgICAgICAgICAgICAgICBjc3NTZWwuYXR0cnMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBjc3NTZWwuZWxlbWVudCA9ICcqJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5wdXNoKGNzc1NlbCk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjc3NTZWxlY3RvciA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHZhciBjdXJyZW50ID0gY3NzU2VsZWN0b3I7XG4gICAgICAgIHZhciBpbk5vdCA9IGZhbHNlO1xuICAgICAgICBfU0VMRUNUT1JfUkVHRVhQLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IF9TRUxFQ1RPUl9SRUdFWFAuZXhlYyhzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgIGlmIChpbk5vdCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lc3RpbmcgOm5vdCBpcyBub3QgYWxsb3dlZCBpbiBhIHNlbGVjdG9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluTm90ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICAgICAgICAgICAgY3NzU2VsZWN0b3Iubm90U2VsZWN0b3JzLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50LnNldEVsZW1lbnQobWF0Y2hbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5hZGRDbGFzc05hbWUobWF0Y2hbM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5hZGRBdHRyaWJ1dGUobWF0Y2hbNF0sIG1hdGNoWzZdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs3XSkge1xuICAgICAgICAgICAgICAgIGluTm90ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNzc1NlbGVjdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzhdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluTm90KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgc2VsZWN0b3JzIGluIDpub3QgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2FkZFJlc3VsdChyZXN1bHRzLCBjc3NTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY3NzU2VsZWN0b3IgPSBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX2FkZFJlc3VsdChyZXN1bHRzLCBjc3NTZWxlY3Rvcik7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gICAgQ3NzU2VsZWN0b3IucHJvdG90eXBlLmlzRWxlbWVudFNlbGVjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNFbGVtZW50U2VsZWN0b3IoKSAmJiB0aGlzLmNsYXNzTmFtZXMubGVuZ3RoID09IDAgJiYgdGhpcy5hdHRycy5sZW5ndGggPT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5ub3RTZWxlY3RvcnMubGVuZ3RoID09PSAwO1xuICAgIH07XG4gICAgQ3NzU2VsZWN0b3IucHJvdG90eXBlLmhhc0VsZW1lbnRTZWxlY3RvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICEhdGhpcy5lbGVtZW50OyB9O1xuICAgIENzc1NlbGVjdG9yLnByb3RvdHlwZS5zZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHZvaWQgMCkgeyBlbGVtZW50ID0gbnVsbDsgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH07XG4gICAgLyoqIEdldHMgYSB0ZW1wbGF0ZSBzdHJpbmcgZm9yIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gKi9cbiAgICBDc3NTZWxlY3Rvci5wcm90b3R5cGUuZ2V0TWF0Y2hpbmdFbGVtZW50VGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0YWdOYW1lID0gdGhpcy5lbGVtZW50IHx8ICdkaXYnO1xuICAgICAgICB2YXIgY2xhc3NBdHRyID0gdGhpcy5jbGFzc05hbWVzLmxlbmd0aCA+IDAgPyBcIiBjbGFzcz1cXFwiXCIgKyB0aGlzLmNsYXNzTmFtZXMuam9pbignICcpICsgXCJcXFwiXCIgOiAnJztcbiAgICAgICAgdmFyIGF0dHJzID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIGF0dHJOYW1lID0gdGhpcy5hdHRyc1tpXTtcbiAgICAgICAgICAgIHZhciBhdHRyVmFsdWUgPSB0aGlzLmF0dHJzW2kgKyAxXSAhPT0gJycgPyBcIj1cXFwiXCIgKyB0aGlzLmF0dHJzW2kgKyAxXSArIFwiXFxcIlwiIDogJyc7XG4gICAgICAgICAgICBhdHRycyArPSBcIiBcIiArIGF0dHJOYW1lICsgYXR0clZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRIdG1sVGFnRGVmaW5pdGlvbih0YWdOYW1lKS5pc1ZvaWQgPyBcIjxcIiArIHRhZ05hbWUgKyBjbGFzc0F0dHIgKyBhdHRycyArIFwiLz5cIiA6XG4gICAgICAgICAgICBcIjxcIiArIHRhZ05hbWUgKyBjbGFzc0F0dHIgKyBhdHRycyArIFwiPjwvXCIgKyB0YWdOYW1lICsgXCI+XCI7XG4gICAgfTtcbiAgICBDc3NTZWxlY3Rvci5wcm90b3R5cGUuZ2V0QXR0cnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnY2xhc3MnLCB0aGlzLmNsYXNzTmFtZXMuam9pbignICcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdCh0aGlzLmF0dHJzKTtcbiAgICB9O1xuICAgIENzc1NlbGVjdG9yLnByb3RvdHlwZS5hZGRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsgdmFsdWUgPSAnJzsgfVxuICAgICAgICB0aGlzLmF0dHJzLnB1c2gobmFtZSwgdmFsdWUgJiYgdmFsdWUudG9Mb3dlckNhc2UoKSB8fCAnJyk7XG4gICAgfTtcbiAgICBDc3NTZWxlY3Rvci5wcm90b3R5cGUuYWRkQ2xhc3NOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHsgdGhpcy5jbGFzc05hbWVzLnB1c2gobmFtZS50b0xvd2VyQ2FzZSgpKTsgfTtcbiAgICBDc3NTZWxlY3Rvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmVsZW1lbnQgfHwgJyc7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChrbGFzcykgeyByZXR1cm4gcmVzICs9IFwiLlwiICsga2xhc3M7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0dHJzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0cnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gdGhpcy5hdHRyc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmF0dHJzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICByZXMgKz0gXCJbXCIgKyBuYW1lXzEgKyAodmFsdWUgPyAnPScgKyB2YWx1ZSA6ICcnKSArIFwiXVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90U2VsZWN0b3JzLmZvckVhY2goZnVuY3Rpb24gKG5vdFNlbGVjdG9yKSB7IHJldHVybiByZXMgKz0gXCI6bm90KFwiICsgbm90U2VsZWN0b3IgKyBcIilcIjsgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICByZXR1cm4gQ3NzU2VsZWN0b3I7XG59KCkpO1xuLyoqXG4gKiBSZWFkcyBhIGxpc3Qgb2YgQ3NzU2VsZWN0b3JzIGFuZCBhbGxvd3MgdG8gY2FsY3VsYXRlIHdoaWNoIG9uZXNcbiAqIGFyZSBjb250YWluZWQgaW4gYSBnaXZlbiBDc3NTZWxlY3Rvci5cbiAqL1xudmFyIFNlbGVjdG9yTWF0Y2hlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZWxlY3Rvck1hdGNoZXIoKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRQYXJ0aWFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9jbGFzc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY2xhc3NQYXJ0aWFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9hdHRyVmFsdWVNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2F0dHJWYWx1ZVBhcnRpYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2xpc3RDb250ZXh0cyA9IFtdO1xuICAgIH1cbiAgICBTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlciA9IGZ1bmN0aW9uIChub3RTZWxlY3RvcnMpIHtcbiAgICAgICAgdmFyIG5vdE1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgICAgIG5vdE1hdGNoZXIuYWRkU2VsZWN0YWJsZXMobm90U2VsZWN0b3JzLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG5vdE1hdGNoZXI7XG4gICAgfTtcbiAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLmFkZFNlbGVjdGFibGVzID0gZnVuY3Rpb24gKGNzc1NlbGVjdG9ycywgY2FsbGJhY2tDdHh0KSB7XG4gICAgICAgIHZhciBsaXN0Q29udGV4dCA9IG51bGw7XG4gICAgICAgIGlmIChjc3NTZWxlY3RvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGlzdENvbnRleHQgPSBuZXcgU2VsZWN0b3JMaXN0Q29udGV4dChjc3NTZWxlY3RvcnMpO1xuICAgICAgICAgICAgdGhpcy5fbGlzdENvbnRleHRzLnB1c2gobGlzdENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3NzU2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRTZWxlY3RhYmxlKGNzc1NlbGVjdG9yc1tpXSwgY2FsbGJhY2tDdHh0LCBsaXN0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhbiBvYmplY3QgdGhhdCBjYW4gYmUgZm91bmQgbGF0ZXIgb24gYnkgY2FsbGluZyBgbWF0Y2hgLlxuICAgICAqIEBwYXJhbSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgICAqIEBwYXJhbSBjYWxsYmFja0N0eHQgQW4gb3BhcXVlIG9iamVjdCB0aGF0IHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIGNhbGxiYWNrIG9mIHRoZSBgbWF0Y2hgIGZ1bmN0aW9uXG4gICAgICovXG4gICAgU2VsZWN0b3JNYXRjaGVyLnByb3RvdHlwZS5fYWRkU2VsZWN0YWJsZSA9IGZ1bmN0aW9uIChjc3NTZWxlY3RvciwgY2FsbGJhY2tDdHh0LCBsaXN0Q29udGV4dCkge1xuICAgICAgICB2YXIgbWF0Y2hlciA9IHRoaXM7XG4gICAgICAgIHZhciBlbGVtZW50ID0gY3NzU2VsZWN0b3IuZWxlbWVudDtcbiAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBjc3NTZWxlY3Rvci5jbGFzc05hbWVzO1xuICAgICAgICB2YXIgYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcbiAgICAgICAgdmFyIHNlbGVjdGFibGUgPSBuZXcgU2VsZWN0b3JDb250ZXh0KGNzc1NlbGVjdG9yLCBjYWxsYmFja0N0eHQsIGxpc3RDb250ZXh0KTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpc1Rlcm1pbmFsID0gYXR0cnMubGVuZ3RoID09PSAwICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgaWYgKGlzVGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRUZXJtaW5hbChtYXRjaGVyLl9lbGVtZW50TWFwLCBlbGVtZW50LCBzZWxlY3RhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGNoZXIgPSB0aGlzLl9hZGRQYXJ0aWFsKG1hdGNoZXIuX2VsZW1lbnRQYXJ0aWFsTWFwLCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzVGVybWluYWwgPSBhdHRycy5sZW5ndGggPT09IDAgJiYgaSA9PT0gY2xhc3NOYW1lcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc1Rlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKG1hdGNoZXIuX2NsYXNzTWFwLCBjbGFzc05hbWUsIHNlbGVjdGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwobWF0Y2hlci5fY2xhc3NQYXJ0aWFsTWFwLCBjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNUZXJtaW5hbCA9IGkgPT09IGF0dHJzLmxlbmd0aCAtIDI7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVfMiA9IGF0dHJzW2ldO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGF0dHJzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGVybWluYWxNYXAgPSBtYXRjaGVyLl9hdHRyVmFsdWVNYXA7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZXJtaW5hbFZhbHVlc01hcCA9IHRlcm1pbmFsTWFwLmdldChuYW1lXzIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsVmFsdWVzTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbFZhbHVlc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsTWFwLnNldChuYW1lXzIsIHRlcm1pbmFsVmFsdWVzTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRUZXJtaW5hbCh0ZXJtaW5hbFZhbHVlc01hcCwgdmFsdWUsIHNlbGVjdGFibGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRpYWxNYXAgPSBtYXRjaGVyLl9hdHRyVmFsdWVQYXJ0aWFsTWFwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGlhbFZhbHVlc01hcCA9IHBhcnRpYWxNYXAuZ2V0KG5hbWVfMik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFydGlhbFZhbHVlc01hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFZhbHVlc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxNYXAuc2V0KG5hbWVfMiwgcGFydGlhbFZhbHVlc01hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU2VsZWN0b3JNYXRjaGVyLnByb3RvdHlwZS5fYWRkVGVybWluYWwgPSBmdW5jdGlvbiAobWFwLCBuYW1lLCBzZWxlY3RhYmxlKSB7XG4gICAgICAgIHZhciB0ZXJtaW5hbExpc3QgPSBtYXAuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXRlcm1pbmFsTGlzdCkge1xuICAgICAgICAgICAgdGVybWluYWxMaXN0ID0gW107XG4gICAgICAgICAgICBtYXAuc2V0KG5hbWUsIHRlcm1pbmFsTGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGVybWluYWxMaXN0LnB1c2goc2VsZWN0YWJsZSk7XG4gICAgfTtcbiAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLl9hZGRQYXJ0aWFsID0gZnVuY3Rpb24gKG1hcCwgbmFtZSkge1xuICAgICAgICB2YXIgbWF0Y2hlciA9IG1hcC5nZXQobmFtZSk7XG4gICAgICAgIGlmICghbWF0Y2hlcikge1xuICAgICAgICAgICAgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgICAgICAgIG1hcC5zZXQobmFtZSwgbWF0Y2hlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHZpYSBgYWRkU2VsZWN0YWJsZWBcbiAgICAgKiB3aG9zZSBjc3Mgc2VsZWN0b3IgaXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjc3Mgc2VsZWN0b3IuXG4gICAgICogQHBhcmFtIGNzc1NlbGVjdG9yIEEgY3NzIHNlbGVjdG9yXG4gICAgICogQHBhcmFtIG1hdGNoZWRDYWxsYmFjayBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG9iamVjdCBoYW5kZWQgaW50byBgYWRkU2VsZWN0YWJsZWBcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZFxuICAgICovXG4gICAgU2VsZWN0b3JNYXRjaGVyLnByb3RvdHlwZS5tYXRjaCA9IGZ1bmN0aW9uIChjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBjc3NTZWxlY3Rvci5lbGVtZW50O1xuICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IGNzc1NlbGVjdG9yLmNsYXNzTmFtZXM7XG4gICAgICAgIHZhciBhdHRycyA9IGNzc1NlbGVjdG9yLmF0dHJzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RDb250ZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fbGlzdENvbnRleHRzW2ldLmFscmVhZHlNYXRjaGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5fbWF0Y2hUZXJtaW5hbCh0aGlzLl9lbGVtZW50TWFwLCBlbGVtZW50LCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX21hdGNoUGFydGlhbCh0aGlzLl9lbGVtZW50UGFydGlhbE1hcCwgZWxlbWVudCwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHxcbiAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgaWYgKGNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGhpcy5fY2xhc3NNYXAsIGNsYXNzTmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHwgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoUGFydGlhbCh0aGlzLl9jbGFzc1BhcnRpYWxNYXAsIGNsYXNzTmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYXR0cnMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZV8zID0gYXR0cnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gYXR0cnNbaSArIDFdO1xuICAgICAgICAgICAgICAgIHZhciB0ZXJtaW5hbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZU1hcC5nZXQobmFtZV8zKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsICcnLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsIHZhbHVlLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnRpYWxWYWx1ZXNNYXAgPSB0aGlzLl9hdHRyVmFsdWVQYXJ0aWFsTWFwLmdldChuYW1lXzMpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgJycsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF0Y2hQYXJ0aWFsKHBhcnRpYWxWYWx1ZXNNYXAsIHZhbHVlLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBTZWxlY3Rvck1hdGNoZXIucHJvdG90eXBlLl9tYXRjaFRlcm1pbmFsID0gZnVuY3Rpb24gKG1hcCwgbmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykge1xuICAgICAgICBpZiAoIW1hcCB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZWN0YWJsZXMgPSBtYXAuZ2V0KG5hbWUpIHx8IFtdO1xuICAgICAgICB2YXIgc3RhclNlbGVjdGFibGVzID0gbWFwLmdldCgnKicpO1xuICAgICAgICBpZiAoc3RhclNlbGVjdGFibGVzKSB7XG4gICAgICAgICAgICBzZWxlY3RhYmxlcyA9IHNlbGVjdGFibGVzLmNvbmNhdChzdGFyU2VsZWN0YWJsZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZWN0YWJsZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbaV07XG4gICAgICAgICAgICByZXN1bHQgPSBzZWxlY3RhYmxlLmZpbmFsaXplKGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFNlbGVjdG9yTWF0Y2hlci5wcm90b3R5cGUuX21hdGNoUGFydGlhbCA9IGZ1bmN0aW9uIChtYXAsIG5hbWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFtYXAgfHwgdHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5lc3RlZFNlbGVjdG9yID0gbWFwLmdldChuYW1lKTtcbiAgICAgICAgaWYgKCFuZXN0ZWRTZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8ocGVyZik6IGdldCByaWQgb2YgcmVjdXJzaW9uIGFuZCBtZWFzdXJlIGFnYWluXG4gICAgICAgIC8vIFRPRE8ocGVyZik6IGRvbid0IHBhc3MgdGhlIHdob2xlIHNlbGVjdG9yIGludG8gdGhlIHJlY3Vyc2lvbixcbiAgICAgICAgLy8gYnV0IG9ubHkgdGhlIG5vdCBwcm9jZXNzZWQgcGFydHNcbiAgICAgICAgcmV0dXJuIG5lc3RlZFNlbGVjdG9yLm1hdGNoKGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spO1xuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdG9yTWF0Y2hlcjtcbn0oKSk7XG52YXIgU2VsZWN0b3JMaXN0Q29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZWxlY3Rvckxpc3RDb250ZXh0KHNlbGVjdG9ycykge1xuICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9ycztcbiAgICAgICAgdGhpcy5hbHJlYWR5TWF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gU2VsZWN0b3JMaXN0Q29udGV4dDtcbn0oKSk7XG4vLyBTdG9yZSBjb250ZXh0IHRvIHBhc3MgYmFjayBzZWxlY3RvciBhbmQgY29udGV4dCB3aGVuIGEgc2VsZWN0b3IgaXMgbWF0Y2hlZFxudmFyIFNlbGVjdG9yQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZWxlY3RvckNvbnRleHQoc2VsZWN0b3IsIGNiQ29udGV4dCwgbGlzdENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB0aGlzLmNiQ29udGV4dCA9IGNiQ29udGV4dDtcbiAgICAgICAgdGhpcy5saXN0Q29udGV4dCA9IGxpc3RDb250ZXh0O1xuICAgICAgICB0aGlzLm5vdFNlbGVjdG9ycyA9IHNlbGVjdG9yLm5vdFNlbGVjdG9ycztcbiAgICB9XG4gICAgU2VsZWN0b3JDb250ZXh0LnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uIChjc3NTZWxlY3RvciwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm5vdFNlbGVjdG9ycy5sZW5ndGggPiAwICYmICghdGhpcy5saXN0Q29udGV4dCB8fCAhdGhpcy5saXN0Q29udGV4dC5hbHJlYWR5TWF0Y2hlZCkpIHtcbiAgICAgICAgICAgIHZhciBub3RNYXRjaGVyID0gU2VsZWN0b3JNYXRjaGVyLmNyZWF0ZU5vdE1hdGNoZXIodGhpcy5ub3RTZWxlY3RvcnMpO1xuICAgICAgICAgICAgcmVzdWx0ID0gIW5vdE1hdGNoZXIubWF0Y2goY3NzU2VsZWN0b3IsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgJiYgY2FsbGJhY2sgJiYgKCF0aGlzLmxpc3RDb250ZXh0IHx8ICF0aGlzLmxpc3RDb250ZXh0LmFscmVhZHlNYXRjaGVkKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGlzdENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RDb250ZXh0LmFscmVhZHlNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuc2VsZWN0b3IsIHRoaXMuY2JDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFNlbGVjdG9yQ29udGV4dDtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBjcmVhdGVJbmplY3QgPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdJbmplY3QnLCBmdW5jdGlvbiAodG9rZW4pIHsgcmV0dXJuICh7IHRva2VuOiB0b2tlbiB9KTsgfSk7XG52YXIgY3JlYXRlSW5qZWN0aW9uVG9rZW4gPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdJbmplY3Rpb25Ub2tlbicsIGZ1bmN0aW9uIChkZXNjKSB7IHJldHVybiAoeyBfZGVzYzogZGVzYywgbmdJbmplY3RhYmxlRGVmOiB1bmRlZmluZWQgfSk7IH0pO1xudmFyIGNyZWF0ZUF0dHJpYnV0ZSA9IG1ha2VNZXRhZGF0YUZhY3RvcnkoJ0F0dHJpYnV0ZScsIGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7IHJldHVybiAoeyBhdHRyaWJ1dGVOYW1lOiBhdHRyaWJ1dGVOYW1lIH0pOyB9KTtcbnZhciBjcmVhdGVDb250ZW50Q2hpbGRyZW4gPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdDb250ZW50Q2hpbGRyZW4nLCBmdW5jdGlvbiAoc2VsZWN0b3IsIGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7IGRhdGEgPSB7fTsgfVxuICAgIHJldHVybiAoX19hc3NpZ24oeyBzZWxlY3Rvcjogc2VsZWN0b3IsIGZpcnN0OiBmYWxzZSwgaXNWaWV3UXVlcnk6IGZhbHNlLCBkZXNjZW5kYW50czogZmFsc2UgfSwgZGF0YSkpO1xufSk7XG52YXIgY3JlYXRlQ29udGVudENoaWxkID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnQ29udGVudENoaWxkJywgZnVuY3Rpb24gKHNlbGVjdG9yLCBkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkgeyBkYXRhID0ge307IH1cbiAgICByZXR1cm4gKF9fYXNzaWduKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBmaXJzdDogdHJ1ZSwgaXNWaWV3UXVlcnk6IGZhbHNlLCBkZXNjZW5kYW50czogdHJ1ZSB9LCBkYXRhKSk7XG59KTtcbnZhciBjcmVhdGVWaWV3Q2hpbGRyZW4gPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdWaWV3Q2hpbGRyZW4nLCBmdW5jdGlvbiAoc2VsZWN0b3IsIGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7IGRhdGEgPSB7fTsgfVxuICAgIHJldHVybiAoX19hc3NpZ24oeyBzZWxlY3Rvcjogc2VsZWN0b3IsIGZpcnN0OiBmYWxzZSwgaXNWaWV3UXVlcnk6IHRydWUsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTtcbn0pO1xudmFyIGNyZWF0ZVZpZXdDaGlsZCA9IG1ha2VNZXRhZGF0YUZhY3RvcnkoJ1ZpZXdDaGlsZCcsIGZ1bmN0aW9uIChzZWxlY3RvciwgZGF0YSkge1xuICAgIHJldHVybiAoX19hc3NpZ24oeyBzZWxlY3Rvcjogc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogdHJ1ZSwgZGVzY2VuZGFudHM6IHRydWUgfSwgZGF0YSkpO1xufSk7XG52YXIgY3JlYXRlRGlyZWN0aXZlID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnRGlyZWN0aXZlJywgZnVuY3Rpb24gKGRpcikge1xuICAgIGlmIChkaXIgPT09IHZvaWQgMCkgeyBkaXIgPSB7fTsgfVxuICAgIHJldHVybiBkaXI7XG59KTtcbnZhciBWaWV3RW5jYXBzdWxhdGlvbjtcbihmdW5jdGlvbiAoVmlld0VuY2Fwc3VsYXRpb24pIHtcbiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvbltcIkVtdWxhdGVkXCJdID0gMF0gPSBcIkVtdWxhdGVkXCI7XG4gICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bXCJOYXRpdmVcIl0gPSAxXSA9IFwiTmF0aXZlXCI7XG4gICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bXCJOb25lXCJdID0gMl0gPSBcIk5vbmVcIjtcbiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvbltcIlNoYWRvd0RvbVwiXSA9IDNdID0gXCJTaGFkb3dEb21cIjtcbn0pKFZpZXdFbmNhcHN1bGF0aW9uIHx8IChWaWV3RW5jYXBzdWxhdGlvbiA9IHt9KSk7XG52YXIgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbXCJPblB1c2hcIl0gPSAwXSA9IFwiT25QdXNoXCI7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbXCJEZWZhdWx0XCJdID0gMV0gPSBcIkRlZmF1bHRcIjtcbn0pKENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHx8IChDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgY3JlYXRlQ29tcG9uZW50ID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnQ29tcG9uZW50JywgZnVuY3Rpb24gKGMpIHtcbiAgICBpZiAoYyA9PT0gdm9pZCAwKSB7IGMgPSB7fTsgfVxuICAgIHJldHVybiAoX19hc3NpZ24oeyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQgfSwgYykpO1xufSk7XG52YXIgY3JlYXRlUGlwZSA9IG1ha2VNZXRhZGF0YUZhY3RvcnkoJ1BpcGUnLCBmdW5jdGlvbiAocCkgeyByZXR1cm4gKF9fYXNzaWduKHsgcHVyZTogdHJ1ZSB9LCBwKSk7IH0pO1xudmFyIGNyZWF0ZUlucHV0ID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnSW5wdXQnLCBmdW5jdGlvbiAoYmluZGluZ1Byb3BlcnR5TmFtZSkgeyByZXR1cm4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZTogYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsgfSk7XG52YXIgY3JlYXRlT3V0cHV0ID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnT3V0cHV0JywgZnVuY3Rpb24gKGJpbmRpbmdQcm9wZXJ0eU5hbWUpIHsgcmV0dXJuICh7IGJpbmRpbmdQcm9wZXJ0eU5hbWU6IGJpbmRpbmdQcm9wZXJ0eU5hbWUgfSk7IH0pO1xudmFyIGNyZWF0ZUhvc3RCaW5kaW5nID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnSG9zdEJpbmRpbmcnLCBmdW5jdGlvbiAoaG9zdFByb3BlcnR5TmFtZSkgeyByZXR1cm4gKHsgaG9zdFByb3BlcnR5TmFtZTogaG9zdFByb3BlcnR5TmFtZSB9KTsgfSk7XG52YXIgY3JlYXRlSG9zdExpc3RlbmVyID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnSG9zdExpc3RlbmVyJywgZnVuY3Rpb24gKGV2ZW50TmFtZSwgYXJncykgeyByZXR1cm4gKHsgZXZlbnROYW1lOiBldmVudE5hbWUsIGFyZ3M6IGFyZ3MgfSk7IH0pO1xudmFyIGNyZWF0ZU5nTW9kdWxlID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnTmdNb2R1bGUnLCBmdW5jdGlvbiAobmdNb2R1bGUpIHsgcmV0dXJuIG5nTW9kdWxlOyB9KTtcbnZhciBjcmVhdGVJbmplY3RhYmxlID0gbWFrZU1ldGFkYXRhRmFjdG9yeSgnSW5qZWN0YWJsZScsIGZ1bmN0aW9uIChpbmplY3RhYmxlKSB7XG4gICAgaWYgKGluamVjdGFibGUgPT09IHZvaWQgMCkgeyBpbmplY3RhYmxlID0ge307IH1cbiAgICByZXR1cm4gaW5qZWN0YWJsZTtcbn0pO1xudmFyIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgPSB7XG4gICAgbmFtZTogJ2N1c3RvbS1lbGVtZW50cydcbn07XG52YXIgTk9fRVJST1JTX1NDSEVNQSA9IHtcbiAgICBuYW1lOiAnbm8tZXJyb3JzLXNjaGVtYSdcbn07XG52YXIgY3JlYXRlT3B0aW9uYWwgPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdPcHRpb25hbCcpO1xudmFyIGNyZWF0ZVNlbGYgPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdTZWxmJyk7XG52YXIgY3JlYXRlU2tpcFNlbGYgPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdTa2lwU2VsZicpO1xudmFyIGNyZWF0ZUhvc3QgPSBtYWtlTWV0YWRhdGFGYWN0b3J5KCdIb3N0Jyk7XG52YXIgVHlwZSA9IEZ1bmN0aW9uO1xudmFyIFNlY3VyaXR5Q29udGV4dDtcbihmdW5jdGlvbiAoU2VjdXJpdHlDb250ZXh0KSB7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dFtcIk5PTkVcIl0gPSAwXSA9IFwiTk9ORVwiO1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHRbXCJIVE1MXCJdID0gMV0gPSBcIkhUTUxcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0W1wiU1RZTEVcIl0gPSAyXSA9IFwiU1RZTEVcIjtcbiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0W1wiU0NSSVBUXCJdID0gM10gPSBcIlNDUklQVFwiO1xuICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHRbXCJVUkxcIl0gPSA0XSA9IFwiVVJMXCI7XG4gICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dFtcIlJFU09VUkNFX1VSTFwiXSA9IDVdID0gXCJSRVNPVVJDRV9VUkxcIjtcbn0pKFNlY3VyaXR5Q29udGV4dCB8fCAoU2VjdXJpdHlDb250ZXh0ID0ge30pKTtcbnZhciBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneTtcbihmdW5jdGlvbiAoTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kpIHtcbiAgICBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtcIkVycm9yXCJdID0gMF0gPSBcIkVycm9yXCI7XG4gICAgTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3lbTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3lbXCJXYXJuaW5nXCJdID0gMV0gPSBcIldhcm5pbmdcIjtcbiAgICBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneVtcIklnbm9yZVwiXSA9IDJdID0gXCJJZ25vcmVcIjtcbn0pKE1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5IHx8IChNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSA9IHt9KSk7XG5mdW5jdGlvbiBtYWtlTWV0YWRhdGFGYWN0b3J5KG5hbWUsIHByb3BzKSB7XG4gICAgLy8gVGhpcyBtdXN0IGJlIGRlY2xhcmVkIGFzIGEgZnVuY3Rpb24sIG5vdCBhIGZhdCBhcnJvdywgc28gdGhhdCBFUzIwMTUgZGV2bW9kZSBwcm9kdWNlcyBjb2RlXG4gICAgLy8gdGhhdCB3b3JrcyB3aXRoIHRoZSBzdGF0aWNfcmVmbGVjdG9yLnRzIGluIHRoZSBWaWV3RW5naW5lIGNvbXBpbGVyLlxuICAgIC8vIEluIHBhcnRpY3VsYXIsIGBfcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yYCBhc3N1bWVzIHRoYXQgdGhlIHZhbHVlIHJldHVybmVkIGhlcmUgY2FuIGJlXG4gICAgLy8gbmV3J2VkLlxuICAgIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlcyA9IHByb3BzID8gcHJvcHMuYXBwbHkodm9pZCAwLCBfX3NwcmVhZChhcmdzKSkgOiB7fTtcbiAgICAgICAgcmV0dXJuIF9fYXNzaWduKHsgbmdNZXRhZGF0YU5hbWU6IG5hbWUgfSwgdmFsdWVzKTtcbiAgICB9XG4gICAgZmFjdG9yeS5pc1R5cGVPZiA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmoubmdNZXRhZGF0YU5hbWUgPT09IG5hbWU7IH07XG4gICAgZmFjdG9yeS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7XG4gICAgcmV0dXJuIGZhY3Rvcnk7XG59XG5mdW5jdGlvbiBwYXJzZXJTZWxlY3RvclRvU2ltcGxlU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICB2YXIgY2xhc3NlcyA9IHNlbGVjdG9yLmNsYXNzTmFtZXMgJiYgc2VsZWN0b3IuY2xhc3NOYW1lcy5sZW5ndGggPyBfX3NwcmVhZChbOCAvKiBDTEFTUyAqL10sIHNlbGVjdG9yLmNsYXNzTmFtZXMpIDpcbiAgICAgICAgW107XG4gICAgdmFyIGVsZW1lbnROYW1lID0gc2VsZWN0b3IuZWxlbWVudCAmJiBzZWxlY3Rvci5lbGVtZW50ICE9PSAnKicgPyBzZWxlY3Rvci5lbGVtZW50IDogJyc7XG4gICAgcmV0dXJuIF9fc3ByZWFkKFtlbGVtZW50TmFtZV0sIHNlbGVjdG9yLmF0dHJzLCBjbGFzc2VzKTtcbn1cbmZ1bmN0aW9uIHBhcnNlclNlbGVjdG9yVG9OZWdhdGl2ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgdmFyIGNsYXNzZXMgPSBzZWxlY3Rvci5jbGFzc05hbWVzICYmIHNlbGVjdG9yLmNsYXNzTmFtZXMubGVuZ3RoID8gX19zcHJlYWQoWzggLyogQ0xBU1MgKi9dLCBzZWxlY3Rvci5jbGFzc05hbWVzKSA6XG4gICAgICAgIFtdO1xuICAgIGlmIChzZWxlY3Rvci5lbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfX3NwcmVhZChbXG4gICAgICAgICAgICAxIC8qIE5PVCAqLyB8IDQgLyogRUxFTUVOVCAqLywgc2VsZWN0b3IuZWxlbWVudFxuICAgICAgICBdLCBzZWxlY3Rvci5hdHRycywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdG9yLmF0dHJzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gX19zcHJlYWQoWzEgLyogTk9UICovIHwgMiAvKiBBVFRSSUJVVEUgKi9dLCBzZWxlY3Rvci5hdHRycywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VsZWN0b3IuY2xhc3NOYW1lcyAmJiBzZWxlY3Rvci5jbGFzc05hbWVzLmxlbmd0aCA/IF9fc3ByZWFkKFsxIC8qIE5PVCAqLyB8IDggLyogQ0xBU1MgKi9dLCBzZWxlY3Rvci5jbGFzc05hbWVzKSA6XG4gICAgICAgICAgICBbXTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZXJTZWxlY3RvclRvUjNTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHZhciBwb3NpdGl2ZSA9IHBhcnNlclNlbGVjdG9yVG9TaW1wbGVTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgdmFyIG5lZ2F0aXZlID0gc2VsZWN0b3Iubm90U2VsZWN0b3JzICYmIHNlbGVjdG9yLm5vdFNlbGVjdG9ycy5sZW5ndGggP1xuICAgICAgICBzZWxlY3Rvci5ub3RTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChub3RTZWxlY3RvcikgeyByZXR1cm4gcGFyc2VyU2VsZWN0b3JUb05lZ2F0aXZlU2VsZWN0b3Iobm90U2VsZWN0b3IpOyB9KSA6XG4gICAgICAgIFtdO1xuICAgIHJldHVybiBwb3NpdGl2ZS5jb25jYXQuYXBwbHkocG9zaXRpdmUsIF9fc3ByZWFkKG5lZ2F0aXZlKSk7XG59XG5mdW5jdGlvbiBwYXJzZVNlbGVjdG9yVG9SM1NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yID8gQ3NzU2VsZWN0b3IucGFyc2Uoc2VsZWN0b3IpLm1hcChwYXJzZXJTZWxlY3RvclRvUjNTZWxlY3RvcikgOiBbXTtcbn1cblxudmFyIGNvcmUgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgY3JlYXRlSW5qZWN0OiBjcmVhdGVJbmplY3QsXG4gICAgY3JlYXRlSW5qZWN0aW9uVG9rZW46IGNyZWF0ZUluamVjdGlvblRva2VuLFxuICAgIGNyZWF0ZUF0dHJpYnV0ZTogY3JlYXRlQXR0cmlidXRlLFxuICAgIGNyZWF0ZUNvbnRlbnRDaGlsZHJlbjogY3JlYXRlQ29udGVudENoaWxkcmVuLFxuICAgIGNyZWF0ZUNvbnRlbnRDaGlsZDogY3JlYXRlQ29udGVudENoaWxkLFxuICAgIGNyZWF0ZVZpZXdDaGlsZHJlbjogY3JlYXRlVmlld0NoaWxkcmVuLFxuICAgIGNyZWF0ZVZpZXdDaGlsZDogY3JlYXRlVmlld0NoaWxkLFxuICAgIGNyZWF0ZURpcmVjdGl2ZTogY3JlYXRlRGlyZWN0aXZlLFxuICAgIGdldCBWaWV3RW5jYXBzdWxhdGlvbiAoKSB7IHJldHVybiBWaWV3RW5jYXBzdWxhdGlvbjsgfSxcbiAgICBnZXQgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgKCkgeyByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7IH0sXG4gICAgY3JlYXRlQ29tcG9uZW50OiBjcmVhdGVDb21wb25lbnQsXG4gICAgY3JlYXRlUGlwZTogY3JlYXRlUGlwZSxcbiAgICBjcmVhdGVJbnB1dDogY3JlYXRlSW5wdXQsXG4gICAgY3JlYXRlT3V0cHV0OiBjcmVhdGVPdXRwdXQsXG4gICAgY3JlYXRlSG9zdEJpbmRpbmc6IGNyZWF0ZUhvc3RCaW5kaW5nLFxuICAgIGNyZWF0ZUhvc3RMaXN0ZW5lcjogY3JlYXRlSG9zdExpc3RlbmVyLFxuICAgIGNyZWF0ZU5nTW9kdWxlOiBjcmVhdGVOZ01vZHVsZSxcbiAgICBjcmVhdGVJbmplY3RhYmxlOiBjcmVhdGVJbmplY3RhYmxlLFxuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUE6IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgTk9fRVJST1JTX1NDSEVNQTogTk9fRVJST1JTX1NDSEVNQSxcbiAgICBjcmVhdGVPcHRpb25hbDogY3JlYXRlT3B0aW9uYWwsXG4gICAgY3JlYXRlU2VsZjogY3JlYXRlU2VsZixcbiAgICBjcmVhdGVTa2lwU2VsZjogY3JlYXRlU2tpcFNlbGYsXG4gICAgY3JlYXRlSG9zdDogY3JlYXRlSG9zdCxcbiAgICBUeXBlOiBUeXBlLFxuICAgIGdldCBTZWN1cml0eUNvbnRleHQgKCkgeyByZXR1cm4gU2VjdXJpdHlDb250ZXh0OyB9LFxuICAgIGdldCBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSAoKSB7IHJldHVybiBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneTsgfSxcbiAgICBwYXJzZVNlbGVjdG9yVG9SM1NlbGVjdG9yOiBwYXJzZVNlbGVjdG9yVG9SM1NlbGVjdG9yXG59KTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8vLyBUeXBlc1xudmFyIFR5cGVNb2RpZmllcjtcbihmdW5jdGlvbiAoVHlwZU1vZGlmaWVyKSB7XG4gICAgVHlwZU1vZGlmaWVyW1R5cGVNb2RpZmllcltcIkNvbnN0XCJdID0gMF0gPSBcIkNvbnN0XCI7XG59KShUeXBlTW9kaWZpZXIgfHwgKFR5cGVNb2RpZmllciA9IHt9KSk7XG52YXIgVHlwZSQxID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFR5cGUobW9kaWZpZXJzKSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzO1xuICAgICAgICBpZiAoIW1vZGlmaWVycykge1xuICAgICAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUeXBlLnByb3RvdHlwZS5oYXNNb2RpZmllciA9IGZ1bmN0aW9uIChtb2RpZmllcikgeyByZXR1cm4gdGhpcy5tb2RpZmllcnMuaW5kZXhPZihtb2RpZmllcikgIT09IC0xOyB9O1xuICAgIHJldHVybiBUeXBlO1xufSgpKTtcbnZhciBCdWlsdGluVHlwZU5hbWU7XG4oZnVuY3Rpb24gKEJ1aWx0aW5UeXBlTmFtZSkge1xuICAgIEJ1aWx0aW5UeXBlTmFtZVtCdWlsdGluVHlwZU5hbWVbXCJEeW5hbWljXCJdID0gMF0gPSBcIkR5bmFtaWNcIjtcbiAgICBCdWlsdGluVHlwZU5hbWVbQnVpbHRpblR5cGVOYW1lW1wiQm9vbFwiXSA9IDFdID0gXCJCb29sXCI7XG4gICAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZVtcIlN0cmluZ1wiXSA9IDJdID0gXCJTdHJpbmdcIjtcbiAgICBCdWlsdGluVHlwZU5hbWVbQnVpbHRpblR5cGVOYW1lW1wiSW50XCJdID0gM10gPSBcIkludFwiO1xuICAgIEJ1aWx0aW5UeXBlTmFtZVtCdWlsdGluVHlwZU5hbWVbXCJOdW1iZXJcIl0gPSA0XSA9IFwiTnVtYmVyXCI7XG4gICAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZVtcIkZ1bmN0aW9uXCJdID0gNV0gPSBcIkZ1bmN0aW9uXCI7XG4gICAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZVtcIkluZmVycmVkXCJdID0gNl0gPSBcIkluZmVycmVkXCI7XG4gICAgQnVpbHRpblR5cGVOYW1lW0J1aWx0aW5UeXBlTmFtZVtcIk5vbmVcIl0gPSA3XSA9IFwiTm9uZVwiO1xufSkoQnVpbHRpblR5cGVOYW1lIHx8IChCdWlsdGluVHlwZU5hbWUgPSB7fSkpO1xudmFyIEJ1aWx0aW5UeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCdWlsdGluVHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWlsdGluVHlwZShuYW1lLCBtb2RpZmllcnMpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbW9kaWZpZXJzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBCdWlsdGluVHlwZS5wcm90b3R5cGUudmlzaXRUeXBlID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCdWlsdGluVHlwZSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBCdWlsdGluVHlwZTtcbn0oVHlwZSQxKSk7XG52YXIgRXhwcmVzc2lvblR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEV4cHJlc3Npb25UeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEV4cHJlc3Npb25UeXBlKHZhbHVlLCBtb2RpZmllcnMsIHR5cGVQYXJhbXMpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgaWYgKHR5cGVQYXJhbXMgPT09IHZvaWQgMCkgeyB0eXBlUGFyYW1zID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLnR5cGVQYXJhbXMgPSB0eXBlUGFyYW1zO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEV4cHJlc3Npb25UeXBlLnByb3RvdHlwZS52aXNpdFR5cGUgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEV4cHJlc3Npb25UeXBlKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEV4cHJlc3Npb25UeXBlO1xufShUeXBlJDEpKTtcbnZhciBBcnJheVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFycmF5VHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBcnJheVR5cGUob2YsIG1vZGlmaWVycykge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9mID0gb2Y7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQXJyYXlUeXBlLnByb3RvdHlwZS52aXNpdFR5cGUgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFycmF5VHlwZSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBBcnJheVR5cGU7XG59KFR5cGUkMSkpO1xudmFyIE1hcFR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1hcFR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWFwVHlwZSh2YWx1ZVR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE1hcFR5cGUucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TWFwVHlwZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gTWFwVHlwZTtcbn0oVHlwZSQxKSk7XG52YXIgRFlOQU1JQ19UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5EeW5hbWljKTtcbnZhciBJTkZFUlJFRF9UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5JbmZlcnJlZCk7XG52YXIgQk9PTF9UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5Cb29sKTtcbnZhciBJTlRfVFlQRSA9IG5ldyBCdWlsdGluVHlwZShCdWlsdGluVHlwZU5hbWUuSW50KTtcbnZhciBOVU1CRVJfVFlQRSA9IG5ldyBCdWlsdGluVHlwZShCdWlsdGluVHlwZU5hbWUuTnVtYmVyKTtcbnZhciBTVFJJTkdfVFlQRSA9IG5ldyBCdWlsdGluVHlwZShCdWlsdGluVHlwZU5hbWUuU3RyaW5nKTtcbnZhciBGVU5DVElPTl9UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5GdW5jdGlvbik7XG52YXIgTk9ORV9UWVBFID0gbmV3IEJ1aWx0aW5UeXBlKEJ1aWx0aW5UeXBlTmFtZS5Ob25lKTtcbi8vLy8vIEV4cHJlc3Npb25zXG52YXIgQmluYXJ5T3BlcmF0b3I7XG4oZnVuY3Rpb24gKEJpbmFyeU9wZXJhdG9yKSB7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJFcXVhbHNcIl0gPSAwXSA9IFwiRXF1YWxzXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJOb3RFcXVhbHNcIl0gPSAxXSA9IFwiTm90RXF1YWxzXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJJZGVudGljYWxcIl0gPSAyXSA9IFwiSWRlbnRpY2FsXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJOb3RJZGVudGljYWxcIl0gPSAzXSA9IFwiTm90SWRlbnRpY2FsXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJNaW51c1wiXSA9IDRdID0gXCJNaW51c1wiO1xuICAgIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yW1wiUGx1c1wiXSA9IDVdID0gXCJQbHVzXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJEaXZpZGVcIl0gPSA2XSA9IFwiRGl2aWRlXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJNdWx0aXBseVwiXSA9IDddID0gXCJNdWx0aXBseVwiO1xuICAgIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yW1wiTW9kdWxvXCJdID0gOF0gPSBcIk1vZHVsb1wiO1xuICAgIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yW1wiQW5kXCJdID0gOV0gPSBcIkFuZFwiO1xuICAgIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yW1wiT3JcIl0gPSAxMF0gPSBcIk9yXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJCaXR3aXNlQW5kXCJdID0gMTFdID0gXCJCaXR3aXNlQW5kXCI7XG4gICAgQmluYXJ5T3BlcmF0b3JbQmluYXJ5T3BlcmF0b3JbXCJMb3dlclwiXSA9IDEyXSA9IFwiTG93ZXJcIjtcbiAgICBCaW5hcnlPcGVyYXRvcltCaW5hcnlPcGVyYXRvcltcIkxvd2VyRXF1YWxzXCJdID0gMTNdID0gXCJMb3dlckVxdWFsc1wiO1xuICAgIEJpbmFyeU9wZXJhdG9yW0JpbmFyeU9wZXJhdG9yW1wiQmlnZ2VyXCJdID0gMTRdID0gXCJCaWdnZXJcIjtcbiAgICBCaW5hcnlPcGVyYXRvcltCaW5hcnlPcGVyYXRvcltcIkJpZ2dlckVxdWFsc1wiXSA9IDE1XSA9IFwiQmlnZ2VyRXF1YWxzXCI7XG59KShCaW5hcnlPcGVyYXRvciB8fCAoQmluYXJ5T3BlcmF0b3IgPSB7fSkpO1xuZnVuY3Rpb24gbnVsbFNhZmVJc0VxdWl2YWxlbnQoYmFzZSwgb3RoZXIpIHtcbiAgICBpZiAoYmFzZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGJhc2UgPT0gb3RoZXI7XG4gICAgfVxuICAgIHJldHVybiBiYXNlLmlzRXF1aXZhbGVudChvdGhlcik7XG59XG5mdW5jdGlvbiBhcmVBbGxFcXVpdmFsZW50KGJhc2UsIG90aGVyKSB7XG4gICAgdmFyIGxlbiA9IGJhc2UubGVuZ3RoO1xuICAgIGlmIChsZW4gIT09IG90aGVyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKCFiYXNlW2ldLmlzRXF1aXZhbGVudChvdGhlcltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbnZhciBFeHByZXNzaW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4cHJlc3Npb24odHlwZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW4gfHwgbnVsbDtcbiAgICB9XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUucHJvcCA9IGZ1bmN0aW9uIChuYW1lLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVhZFByb3BFeHByKHRoaXMsIG5hbWUsIG51bGwsIHNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUua2V5ID0gZnVuY3Rpb24gKGluZGV4LCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVhZEtleUV4cHIodGhpcywgaW5kZXgsIHR5cGUsIHNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuY2FsbE1ldGhvZCA9IGZ1bmN0aW9uIChuYW1lLCBwYXJhbXMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VNZXRob2RFeHByKHRoaXMsIG5hbWUsIHBhcmFtcywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5jYWxsRm4gPSBmdW5jdGlvbiAocGFyYW1zLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW52b2tlRnVuY3Rpb25FeHByKHRoaXMsIHBhcmFtcywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5pbnN0YW50aWF0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW50aWF0ZUV4cHIodGhpcywgcGFyYW1zLCB0eXBlLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmNvbmRpdGlvbmFsID0gZnVuY3Rpb24gKHRydWVDYXNlLCBmYWxzZUNhc2UsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgaWYgKGZhbHNlQ2FzZSA9PT0gdm9pZCAwKSB7IGZhbHNlQ2FzZSA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbEV4cHIodGhpcywgdHJ1ZUNhc2UsIGZhbHNlQ2FzZSwgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiAocmhzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLkVxdWFscywgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm5vdEVxdWFscyA9IGZ1bmN0aW9uIChyaHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuTm90RXF1YWxzLCB0aGlzLCByaHMsIG51bGwsIHNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuaWRlbnRpY2FsID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5JZGVudGljYWwsIHRoaXMsIHJocywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5ub3RJZGVudGljYWwgPSBmdW5jdGlvbiAocmhzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLk5vdElkZW50aWNhbCwgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm1pbnVzID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5NaW51cywgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLnBsdXMgPSBmdW5jdGlvbiAocmhzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLlBsdXMsIHRoaXMsIHJocywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiAocmhzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLkRpdmlkZSwgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5NdWx0aXBseSwgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIChyaHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuTW9kdWxvLCB0aGlzLCByaHMsIG51bGwsIHNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5BbmQsIHRoaXMsIHJocywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5iaXR3aXNlQW5kID0gZnVuY3Rpb24gKHJocywgc291cmNlU3BhbiwgcGFyZW5zKSB7XG4gICAgICAgIGlmIChwYXJlbnMgPT09IHZvaWQgMCkgeyBwYXJlbnMgPSB0cnVlOyB9XG4gICAgICAgIHJldHVybiBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLkJpdHdpc2VBbmQsIHRoaXMsIHJocywgbnVsbCwgc291cmNlU3BhbiwgcGFyZW5zKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5PciwgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmxvd2VyID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Mb3dlciwgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmxvd2VyRXF1YWxzID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5Mb3dlckVxdWFscywgdGhpcywgcmhzLCBudWxsLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLmJpZ2dlciA9IGZ1bmN0aW9uIChyaHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYXRvckV4cHIoQmluYXJ5T3BlcmF0b3IuQmlnZ2VyLCB0aGlzLCByaHMsIG51bGwsIHNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgRXhwcmVzc2lvbi5wcm90b3R5cGUuYmlnZ2VyRXF1YWxzID0gZnVuY3Rpb24gKHJocywgc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdG9yRXhwcihCaW5hcnlPcGVyYXRvci5CaWdnZXJFcXVhbHMsIHRoaXMsIHJocywgbnVsbCwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5pc0JsYW5rID0gZnVuY3Rpb24gKHNvdXJjZVNwYW4pIHtcbiAgICAgICAgLy8gTm90ZTogV2UgdXNlIGVxdWFscyBieSBwdXJwb3NlIGhlcmUgdG8gY29tcGFyZSB0byBudWxsIGFuZCB1bmRlZmluZWQgaW4gSlMuXG4gICAgICAgIC8vIFdlIHVzZSB0aGUgdHlwZWQgbnVsbCB0byBhbGxvdyBzdHJpY3ROdWxsQ2hlY2tzIHRvIG5hcnJvdyB0eXBlcy5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKFRZUEVEX05VTExfRVhQUiwgc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBFeHByZXNzaW9uLnByb3RvdHlwZS5jYXN0ID0gZnVuY3Rpb24gKHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXN0RXhwcih0aGlzLCB0eXBlLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb24ucHJvdG90eXBlLnRvU3RtdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIG51bGwpOyB9O1xuICAgIHJldHVybiBFeHByZXNzaW9uO1xufSgpKTtcbnZhciBCdWlsdGluVmFyO1xuKGZ1bmN0aW9uIChCdWlsdGluVmFyKSB7XG4gICAgQnVpbHRpblZhcltCdWlsdGluVmFyW1wiVGhpc1wiXSA9IDBdID0gXCJUaGlzXCI7XG4gICAgQnVpbHRpblZhcltCdWlsdGluVmFyW1wiU3VwZXJcIl0gPSAxXSA9IFwiU3VwZXJcIjtcbiAgICBCdWlsdGluVmFyW0J1aWx0aW5WYXJbXCJDYXRjaEVycm9yXCJdID0gMl0gPSBcIkNhdGNoRXJyb3JcIjtcbiAgICBCdWlsdGluVmFyW0J1aWx0aW5WYXJbXCJDYXRjaFN0YWNrXCJdID0gM10gPSBcIkNhdGNoU3RhY2tcIjtcbn0pKEJ1aWx0aW5WYXIgfHwgKEJ1aWx0aW5WYXIgPSB7fSkpO1xudmFyIFJlYWRWYXJFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWFkVmFyRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWFkVmFyRXhwcihuYW1lLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUsIHNvdXJjZVNwYW4pIHx8IHRoaXM7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgX3RoaXMuYnVpbHRpbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5uYW1lID0gbnVsbDtcbiAgICAgICAgICAgIF90aGlzLmJ1aWx0aW4gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVhZFZhckV4cHIucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgUmVhZFZhckV4cHIgJiYgdGhpcy5uYW1lID09PSBlLm5hbWUgJiYgdGhpcy5idWlsdGluID09PSBlLmJ1aWx0aW47XG4gICAgfTtcbiAgICBSZWFkVmFyRXhwci5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgIFJlYWRWYXJFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlYWRWYXJFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVhZFZhckV4cHIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMubmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVpbHQgaW4gdmFyaWFibGUgXCIgKyB0aGlzLmJ1aWx0aW4gKyBcIiBjYW4gbm90IGJlIGFzc2lnbmVkIHRvLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdyaXRlVmFyRXhwcih0aGlzLm5hbWUsIHZhbHVlLCBudWxsLCB0aGlzLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgcmV0dXJuIFJlYWRWYXJFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgVHlwZW9mRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHlwZW9mRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUeXBlb2ZFeHByKGV4cHIsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwciA9IGV4cHI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVHlwZW9mRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUeXBlb2ZFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgVHlwZW9mRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBUeXBlb2ZFeHByICYmIGUuZXhwci5pc0VxdWl2YWxlbnQodGhpcy5leHByKTtcbiAgICB9O1xuICAgIFR5cGVvZkV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmV4cHIuaXNDb25zdGFudCgpOyB9O1xuICAgIHJldHVybiBUeXBlb2ZFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgV3JhcHBlZE5vZGVFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXcmFwcGVkTm9kZUV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV3JhcHBlZE5vZGVFeHByKG5vZGUsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgV3JhcHBlZE5vZGVFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFdyYXBwZWROb2RlRXhwciAmJiB0aGlzLm5vZGUgPT09IGUubm9kZTtcbiAgICB9O1xuICAgIFdyYXBwZWROb2RlRXhwci5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgIFdyYXBwZWROb2RlRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRXcmFwcGVkTm9kZUV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gV3JhcHBlZE5vZGVFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgV3JpdGVWYXJFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXcml0ZVZhckV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV3JpdGVWYXJFeHByKG5hbWUsIHZhbHVlLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUgfHwgdmFsdWUudHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgV3JpdGVWYXJFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFdyaXRlVmFyRXhwciAmJiB0aGlzLm5hbWUgPT09IGUubmFtZSAmJiB0aGlzLnZhbHVlLmlzRXF1aXZhbGVudChlLnZhbHVlKTtcbiAgICB9O1xuICAgIFdyaXRlVmFyRXhwci5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgIFdyaXRlVmFyRXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRXcml0ZVZhckV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICBXcml0ZVZhckV4cHIucHJvdG90eXBlLnRvRGVjbFN0bXQgPSBmdW5jdGlvbiAodHlwZSwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVjbGFyZVZhclN0bXQodGhpcy5uYW1lLCB0aGlzLnZhbHVlLCB0eXBlLCBtb2RpZmllcnMsIHRoaXMuc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBXcml0ZVZhckV4cHIucHJvdG90eXBlLnRvQ29uc3REZWNsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50b0RlY2xTdG10KElORkVSUkVEX1RZUEUsIFtTdG10TW9kaWZpZXIuRmluYWxdKTsgfTtcbiAgICByZXR1cm4gV3JpdGVWYXJFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgV3JpdGVLZXlFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXcml0ZUtleUV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gV3JpdGVLZXlFeHByKHJlY2VpdmVyLCBpbmRleCwgdmFsdWUsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSB8fCB2YWx1ZS50eXBlLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICBfdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFdyaXRlS2V5RXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBXcml0ZUtleUV4cHIgJiYgdGhpcy5yZWNlaXZlci5pc0VxdWl2YWxlbnQoZS5yZWNlaXZlcikgJiZcbiAgICAgICAgICAgIHRoaXMuaW5kZXguaXNFcXVpdmFsZW50KGUuaW5kZXgpICYmIHRoaXMudmFsdWUuaXNFcXVpdmFsZW50KGUudmFsdWUpO1xuICAgIH07XG4gICAgV3JpdGVLZXlFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgV3JpdGVLZXlFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFdyaXRlS2V5RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBXcml0ZUtleUV4cHI7XG59KEV4cHJlc3Npb24pKTtcbnZhciBXcml0ZVByb3BFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhXcml0ZVByb3BFeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFdyaXRlUHJvcEV4cHIocmVjZWl2ZXIsIG5hbWUsIHZhbHVlLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUgfHwgdmFsdWUudHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgV3JpdGVQcm9wRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBXcml0ZVByb3BFeHByICYmIHRoaXMucmVjZWl2ZXIuaXNFcXVpdmFsZW50KGUucmVjZWl2ZXIpICYmXG4gICAgICAgICAgICB0aGlzLm5hbWUgPT09IGUubmFtZSAmJiB0aGlzLnZhbHVlLmlzRXF1aXZhbGVudChlLnZhbHVlKTtcbiAgICB9O1xuICAgIFdyaXRlUHJvcEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBXcml0ZVByb3BFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFdyaXRlUHJvcEV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gV3JpdGVQcm9wRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEJ1aWx0aW5NZXRob2Q7XG4oZnVuY3Rpb24gKEJ1aWx0aW5NZXRob2QpIHtcbiAgICBCdWlsdGluTWV0aG9kW0J1aWx0aW5NZXRob2RbXCJDb25jYXRBcnJheVwiXSA9IDBdID0gXCJDb25jYXRBcnJheVwiO1xuICAgIEJ1aWx0aW5NZXRob2RbQnVpbHRpbk1ldGhvZFtcIlN1YnNjcmliZU9ic2VydmFibGVcIl0gPSAxXSA9IFwiU3Vic2NyaWJlT2JzZXJ2YWJsZVwiO1xuICAgIEJ1aWx0aW5NZXRob2RbQnVpbHRpbk1ldGhvZFtcIkJpbmRcIl0gPSAyXSA9IFwiQmluZFwiO1xufSkoQnVpbHRpbk1ldGhvZCB8fCAoQnVpbHRpbk1ldGhvZCA9IHt9KSk7XG52YXIgSW52b2tlTWV0aG9kRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52b2tlTWV0aG9kRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJbnZva2VNZXRob2RFeHByKHJlY2VpdmVyLCBtZXRob2QsIGFyZ3MsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgX3RoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgX3RoaXMubmFtZSA9IG1ldGhvZDtcbiAgICAgICAgICAgIF90aGlzLmJ1aWx0aW4gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMubmFtZSA9IG51bGw7XG4gICAgICAgICAgICBfdGhpcy5idWlsdGluID0gbWV0aG9kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSW52b2tlTWV0aG9kRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBJbnZva2VNZXRob2RFeHByICYmIHRoaXMucmVjZWl2ZXIuaXNFcXVpdmFsZW50KGUucmVjZWl2ZXIpICYmXG4gICAgICAgICAgICB0aGlzLm5hbWUgPT09IGUubmFtZSAmJiB0aGlzLmJ1aWx0aW4gPT09IGUuYnVpbHRpbiAmJiBhcmVBbGxFcXVpdmFsZW50KHRoaXMuYXJncywgZS5hcmdzKTtcbiAgICB9O1xuICAgIEludm9rZU1ldGhvZEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBJbnZva2VNZXRob2RFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEludm9rZU1ldGhvZEV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gSW52b2tlTWV0aG9kRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEludm9rZUZ1bmN0aW9uRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW52b2tlRnVuY3Rpb25FeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludm9rZUZ1bmN0aW9uRXhwcihmbiwgYXJncywgdHlwZSwgc291cmNlU3BhbiwgcHVyZSkge1xuICAgICAgICBpZiAocHVyZSA9PT0gdm9pZCAwKSB7IHB1cmUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5mbiA9IGZuO1xuICAgICAgICBfdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgX3RoaXMucHVyZSA9IHB1cmU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSW52b2tlRnVuY3Rpb25FeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEludm9rZUZ1bmN0aW9uRXhwciAmJiB0aGlzLmZuLmlzRXF1aXZhbGVudChlLmZuKSAmJlxuICAgICAgICAgICAgYXJlQWxsRXF1aXZhbGVudCh0aGlzLmFyZ3MsIGUuYXJncykgJiYgdGhpcy5wdXJlID09PSBlLnB1cmU7XG4gICAgfTtcbiAgICBJbnZva2VGdW5jdGlvbkV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBJbnZva2VGdW5jdGlvbkV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW52b2tlRnVuY3Rpb25FeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEludm9rZUZ1bmN0aW9uRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEluc3RhbnRpYXRlRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSW5zdGFudGlhdGVFeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEluc3RhbnRpYXRlRXhwcihjbGFzc0V4cHIsIGFyZ3MsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY2xhc3NFeHByID0gY2xhc3NFeHByO1xuICAgICAgICBfdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJbnN0YW50aWF0ZUV4cHIucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgSW5zdGFudGlhdGVFeHByICYmIHRoaXMuY2xhc3NFeHByLmlzRXF1aXZhbGVudChlLmNsYXNzRXhwcikgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5hcmdzLCBlLmFyZ3MpO1xuICAgIH07XG4gICAgSW5zdGFudGlhdGVFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgSW5zdGFudGlhdGVFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEluc3RhbnRpYXRlRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBJbnN0YW50aWF0ZUV4cHI7XG59KEV4cHJlc3Npb24pKTtcbnZhciBMaXRlcmFsRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTGl0ZXJhbEV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGl0ZXJhbEV4cHIodmFsdWUsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBMaXRlcmFsRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBMaXRlcmFsRXhwciAmJiB0aGlzLnZhbHVlID09PSBlLnZhbHVlO1xuICAgIH07XG4gICAgTGl0ZXJhbEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICAgIExpdGVyYWxFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIExpdGVyYWxFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgRXh0ZXJuYWxFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFeHRlcm5hbEV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXh0ZXJuYWxFeHByKHZhbHVlLCB0eXBlLCB0eXBlUGFyYW1zLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIGlmICh0eXBlUGFyYW1zID09PSB2b2lkIDApIHsgdHlwZVBhcmFtcyA9IG51bGw7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgX3RoaXMudHlwZVBhcmFtcyA9IHR5cGVQYXJhbXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRXh0ZXJuYWxFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEV4dGVybmFsRXhwciAmJiB0aGlzLnZhbHVlLm5hbWUgPT09IGUudmFsdWUubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy52YWx1ZS5tb2R1bGVOYW1lID09PSBlLnZhbHVlLm1vZHVsZU5hbWUgJiYgdGhpcy52YWx1ZS5ydW50aW1lID09PSBlLnZhbHVlLnJ1bnRpbWU7XG4gICAgfTtcbiAgICBFeHRlcm5hbEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBFeHRlcm5hbEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXh0ZXJuYWxFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEV4dGVybmFsRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEV4dGVybmFsUmVmZXJlbmNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4dGVybmFsUmVmZXJlbmNlKG1vZHVsZU5hbWUsIG5hbWUsIHJ1bnRpbWUpIHtcbiAgICAgICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5ydW50aW1lID0gcnVudGltZTtcbiAgICB9XG4gICAgcmV0dXJuIEV4dGVybmFsUmVmZXJlbmNlO1xufSgpKTtcbnZhciBDb25kaXRpb25hbEV4cHIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbmRpdGlvbmFsRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25kaXRpb25hbEV4cHIoY29uZGl0aW9uLCB0cnVlQ2FzZSwgZmFsc2VDYXNlLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIGlmIChmYWxzZUNhc2UgPT09IHZvaWQgMCkgeyBmYWxzZUNhc2UgPSBudWxsOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUgfHwgdHJ1ZUNhc2UudHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICBfdGhpcy5mYWxzZUNhc2UgPSBmYWxzZUNhc2U7XG4gICAgICAgIF90aGlzLnRydWVDYXNlID0gdHJ1ZUNhc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29uZGl0aW9uYWxFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIENvbmRpdGlvbmFsRXhwciAmJiB0aGlzLmNvbmRpdGlvbi5pc0VxdWl2YWxlbnQoZS5jb25kaXRpb24pICYmXG4gICAgICAgICAgICB0aGlzLnRydWVDYXNlLmlzRXF1aXZhbGVudChlLnRydWVDYXNlKSAmJiBudWxsU2FmZUlzRXF1aXZhbGVudCh0aGlzLmZhbHNlQ2FzZSwgZS5mYWxzZUNhc2UpO1xuICAgIH07XG4gICAgQ29uZGl0aW9uYWxFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgQ29uZGl0aW9uYWxFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbmRpdGlvbmFsRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBDb25kaXRpb25hbEV4cHI7XG59KEV4cHJlc3Npb24pKTtcbnZhciBOb3RFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb3RFeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vdEV4cHIoY29uZGl0aW9uLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIEJPT0xfVFlQRSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE5vdEV4cHIucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgTm90RXhwciAmJiB0aGlzLmNvbmRpdGlvbi5pc0VxdWl2YWxlbnQoZS5jb25kaXRpb24pO1xuICAgIH07XG4gICAgTm90RXhwci5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgIE5vdEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Tm90RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBOb3RFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgQXNzZXJ0Tm90TnVsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQXNzZXJ0Tm90TnVsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBc3NlcnROb3ROdWxsKGNvbmRpdGlvbiwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb25kaXRpb24udHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzc2VydE5vdE51bGwucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQXNzZXJ0Tm90TnVsbCAmJiB0aGlzLmNvbmRpdGlvbi5pc0VxdWl2YWxlbnQoZS5jb25kaXRpb24pO1xuICAgIH07XG4gICAgQXNzZXJ0Tm90TnVsbC5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9O1xuICAgIEFzc2VydE5vdE51bGwucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXNzZXJ0Tm90TnVsbEV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQXNzZXJ0Tm90TnVsbDtcbn0oRXhwcmVzc2lvbikpO1xudmFyIENhc3RFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDYXN0RXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDYXN0RXhwcih2YWx1ZSwgdHlwZSwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENhc3RFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIENhc3RFeHByICYmIHRoaXMudmFsdWUuaXNFcXVpdmFsZW50KGUudmFsdWUpO1xuICAgIH07XG4gICAgQ2FzdEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBDYXN0RXhwci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDYXN0RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBDYXN0RXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEZuUGFyYW0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRm5QYXJhbShuYW1lLCB0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSB2b2lkIDApIHsgdHlwZSA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG4gICAgRm5QYXJhbS5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHBhcmFtKSB7IHJldHVybiB0aGlzLm5hbWUgPT09IHBhcmFtLm5hbWU7IH07XG4gICAgcmV0dXJuIEZuUGFyYW07XG59KCkpO1xudmFyIEZ1bmN0aW9uRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRnVuY3Rpb25FeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZ1bmN0aW9uRXhwcihwYXJhbXMsIHN0YXRlbWVudHMsIHR5cGUsIHNvdXJjZVNwYW4sIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBfdGhpcy5zdGF0ZW1lbnRzID0gc3RhdGVtZW50cztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRnVuY3Rpb25FeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEZ1bmN0aW9uRXhwciAmJiBhcmVBbGxFcXVpdmFsZW50KHRoaXMucGFyYW1zLCBlLnBhcmFtcykgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5zdGF0ZW1lbnRzLCBlLnN0YXRlbWVudHMpO1xuICAgIH07XG4gICAgRnVuY3Rpb25FeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgRnVuY3Rpb25FeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEZ1bmN0aW9uRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEZ1bmN0aW9uRXhwci5wcm90b3R5cGUudG9EZWNsU3RtdCA9IGZ1bmN0aW9uIChuYW1lLCBtb2RpZmllcnMpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IG1vZGlmaWVycyA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJlRnVuY3Rpb25TdG10KG5hbWUsIHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlbWVudHMsIHRoaXMudHlwZSwgbW9kaWZpZXJzLCB0aGlzLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgcmV0dXJuIEZ1bmN0aW9uRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIEJpbmFyeU9wZXJhdG9yRXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQmluYXJ5T3BlcmF0b3JFeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEJpbmFyeU9wZXJhdG9yRXhwcihvcGVyYXRvciwgbGhzLCByaHMsIHR5cGUsIHNvdXJjZVNwYW4sIHBhcmVucykge1xuICAgICAgICBpZiAocGFyZW5zID09PSB2b2lkIDApIHsgcGFyZW5zID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlIHx8IGxocy50eXBlLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICBfdGhpcy5yaHMgPSByaHM7XG4gICAgICAgIF90aGlzLnBhcmVucyA9IHBhcmVucztcbiAgICAgICAgX3RoaXMubGhzID0gbGhzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJpbmFyeU9wZXJhdG9yRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBCaW5hcnlPcGVyYXRvckV4cHIgJiYgdGhpcy5vcGVyYXRvciA9PT0gZS5vcGVyYXRvciAmJlxuICAgICAgICAgICAgdGhpcy5saHMuaXNFcXVpdmFsZW50KGUubGhzKSAmJiB0aGlzLnJocy5pc0VxdWl2YWxlbnQoZS5yaHMpO1xuICAgIH07XG4gICAgQmluYXJ5T3BlcmF0b3JFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgQmluYXJ5T3BlcmF0b3JFeHByLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEJpbmFyeU9wZXJhdG9yRXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5hcnlPcGVyYXRvckV4cHI7XG59KEV4cHJlc3Npb24pKTtcbnZhciBSZWFkUHJvcEV4cHIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlYWRQcm9wRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWFkUHJvcEV4cHIocmVjZWl2ZXIsIG5hbWUsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVhZFByb3BFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFJlYWRQcm9wRXhwciAmJiB0aGlzLnJlY2VpdmVyLmlzRXF1aXZhbGVudChlLnJlY2VpdmVyKSAmJlxuICAgICAgICAgICAgdGhpcy5uYW1lID09PSBlLm5hbWU7XG4gICAgfTtcbiAgICBSZWFkUHJvcEV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBSZWFkUHJvcEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UmVhZFByb3BFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVhZFByb3BFeHByLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXcml0ZVByb3BFeHByKHRoaXMucmVjZWl2ZXIsIHRoaXMubmFtZSwgdmFsdWUsIG51bGwsIHRoaXMuc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICByZXR1cm4gUmVhZFByb3BFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgUmVhZEtleUV4cHIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlYWRLZXlFeHByLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlYWRLZXlFeHByKHJlY2VpdmVyLCBpbmRleCwgdHlwZSwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICBfdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlYWRLZXlFeHByLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFJlYWRLZXlFeHByICYmIHRoaXMucmVjZWl2ZXIuaXNFcXVpdmFsZW50KGUucmVjZWl2ZXIpICYmXG4gICAgICAgICAgICB0aGlzLmluZGV4LmlzRXF1aXZhbGVudChlLmluZGV4KTtcbiAgICB9O1xuICAgIFJlYWRLZXlFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgUmVhZEtleUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UmVhZEtleUV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWFkS2V5RXhwci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JpdGVLZXlFeHByKHRoaXMucmVjZWl2ZXIsIHRoaXMuaW5kZXgsIHZhbHVlLCBudWxsLCB0aGlzLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgcmV0dXJuIFJlYWRLZXlFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgTGl0ZXJhbEFycmF5RXhwciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTGl0ZXJhbEFycmF5RXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBMaXRlcmFsQXJyYXlFeHByKGVudHJpZXMsIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGl0ZXJhbEFycmF5RXhwci5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcy5ldmVyeShmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5pc0NvbnN0YW50KCk7IH0pOyB9O1xuICAgIExpdGVyYWxBcnJheUV4cHIucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgTGl0ZXJhbEFycmF5RXhwciAmJiBhcmVBbGxFcXVpdmFsZW50KHRoaXMuZW50cmllcywgZS5lbnRyaWVzKTtcbiAgICB9O1xuICAgIExpdGVyYWxBcnJheUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbEFycmF5RXhwcih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBMaXRlcmFsQXJyYXlFeHByO1xufShFeHByZXNzaW9uKSk7XG52YXIgTGl0ZXJhbE1hcEVudHJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExpdGVyYWxNYXBFbnRyeShrZXksIHZhbHVlLCBxdW90ZWQpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5xdW90ZWQgPSBxdW90ZWQ7XG4gICAgfVxuICAgIExpdGVyYWxNYXBFbnRyeS5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5ID09PSBlLmtleSAmJiB0aGlzLnZhbHVlLmlzRXF1aXZhbGVudChlLnZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBMaXRlcmFsTWFwRW50cnk7XG59KCkpO1xudmFyIExpdGVyYWxNYXBFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaXRlcmFsTWFwRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBMaXRlcmFsTWFwRXhwcihlbnRyaWVzLCB0eXBlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUsIHNvdXJjZVNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgICAgICBfdGhpcy52YWx1ZVR5cGUgPSBudWxsO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgX3RoaXMudmFsdWVUeXBlID0gdHlwZS52YWx1ZVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBMaXRlcmFsTWFwRXhwci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBMaXRlcmFsTWFwRXhwciAmJiBhcmVBbGxFcXVpdmFsZW50KHRoaXMuZW50cmllcywgZS5lbnRyaWVzKTtcbiAgICB9O1xuICAgIExpdGVyYWxNYXBFeHByLnByb3RvdHlwZS5pc0NvbnN0YW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnZhbHVlLmlzQ29uc3RhbnQoKTsgfSk7IH07XG4gICAgTGl0ZXJhbE1hcEV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbE1hcEV4cHIodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gTGl0ZXJhbE1hcEV4cHI7XG59KEV4cHJlc3Npb24pKTtcbnZhciBDb21tYUV4cHIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENvbW1hRXhwciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb21tYUV4cHIocGFydHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0udHlwZSwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucGFydHMgPSBwYXJ0cztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDb21tYUV4cHIucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQ29tbWFFeHByICYmIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5wYXJ0cywgZS5wYXJ0cyk7XG4gICAgfTtcbiAgICBDb21tYUV4cHIucHJvdG90eXBlLmlzQ29uc3RhbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBDb21tYUV4cHIucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q29tbWFFeHByKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbW1hRXhwcjtcbn0oRXhwcmVzc2lvbikpO1xudmFyIFRISVNfRVhQUiA9IG5ldyBSZWFkVmFyRXhwcihCdWlsdGluVmFyLlRoaXMsIG51bGwsIG51bGwpO1xudmFyIFNVUEVSX0VYUFIgPSBuZXcgUmVhZFZhckV4cHIoQnVpbHRpblZhci5TdXBlciwgbnVsbCwgbnVsbCk7XG52YXIgQ0FUQ0hfRVJST1JfVkFSID0gbmV3IFJlYWRWYXJFeHByKEJ1aWx0aW5WYXIuQ2F0Y2hFcnJvciwgbnVsbCwgbnVsbCk7XG52YXIgQ0FUQ0hfU1RBQ0tfVkFSID0gbmV3IFJlYWRWYXJFeHByKEJ1aWx0aW5WYXIuQ2F0Y2hTdGFjaywgbnVsbCwgbnVsbCk7XG52YXIgTlVMTF9FWFBSID0gbmV3IExpdGVyYWxFeHByKG51bGwsIG51bGwsIG51bGwpO1xudmFyIFRZUEVEX05VTExfRVhQUiA9IG5ldyBMaXRlcmFsRXhwcihudWxsLCBJTkZFUlJFRF9UWVBFLCBudWxsKTtcbi8vLy8gU3RhdGVtZW50c1xudmFyIFN0bXRNb2RpZmllcjtcbihmdW5jdGlvbiAoU3RtdE1vZGlmaWVyKSB7XG4gICAgU3RtdE1vZGlmaWVyW1N0bXRNb2RpZmllcltcIkZpbmFsXCJdID0gMF0gPSBcIkZpbmFsXCI7XG4gICAgU3RtdE1vZGlmaWVyW1N0bXRNb2RpZmllcltcIlByaXZhdGVcIl0gPSAxXSA9IFwiUHJpdmF0ZVwiO1xuICAgIFN0bXRNb2RpZmllcltTdG10TW9kaWZpZXJbXCJFeHBvcnRlZFwiXSA9IDJdID0gXCJFeHBvcnRlZFwiO1xuICAgIFN0bXRNb2RpZmllcltTdG10TW9kaWZpZXJbXCJTdGF0aWNcIl0gPSAzXSA9IFwiU3RhdGljXCI7XG59KShTdG10TW9kaWZpZXIgfHwgKFN0bXRNb2RpZmllciA9IHt9KSk7XG52YXIgU3RhdGVtZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0YXRlbWVudChtb2RpZmllcnMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnMgfHwgW107XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW4gfHwgbnVsbDtcbiAgICB9XG4gICAgU3RhdGVtZW50LnByb3RvdHlwZS5oYXNNb2RpZmllciA9IGZ1bmN0aW9uIChtb2RpZmllcikgeyByZXR1cm4gdGhpcy5tb2RpZmllcnMuaW5kZXhPZihtb2RpZmllcikgIT09IC0xOyB9O1xuICAgIHJldHVybiBTdGF0ZW1lbnQ7XG59KCkpO1xudmFyIERlY2xhcmVWYXJTdG10ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhEZWNsYXJlVmFyU3RtdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEZWNsYXJlVmFyU3RtdChuYW1lLCB2YWx1ZSwgdHlwZSwgbW9kaWZpZXJzLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1vZGlmaWVycywgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLnR5cGUgPSB0eXBlIHx8ICh2YWx1ZSAmJiB2YWx1ZS50eXBlKSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERlY2xhcmVWYXJTdG10LnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoc3RtdCkge1xuICAgICAgICByZXR1cm4gc3RtdCBpbnN0YW5jZW9mIERlY2xhcmVWYXJTdG10ICYmIHRoaXMubmFtZSA9PT0gc3RtdC5uYW1lICYmXG4gICAgICAgICAgICAodGhpcy52YWx1ZSA/ICEhc3RtdC52YWx1ZSAmJiB0aGlzLnZhbHVlLmlzRXF1aXZhbGVudChzdG10LnZhbHVlKSA6ICFzdG10LnZhbHVlKTtcbiAgICB9O1xuICAgIERlY2xhcmVWYXJTdG10LnByb3RvdHlwZS52aXNpdFN0YXRlbWVudCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGVjbGFyZVZhclN0bXQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVjbGFyZVZhclN0bXQ7XG59KFN0YXRlbWVudCkpO1xudmFyIERlY2xhcmVGdW5jdGlvblN0bXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERlY2xhcmVGdW5jdGlvblN0bXQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRGVjbGFyZUZ1bmN0aW9uU3RtdChuYW1lLCBwYXJhbXMsIHN0YXRlbWVudHMsIHR5cGUsIG1vZGlmaWVycywgc291cmNlU3Bhbikge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMsIHNvdXJjZVNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIF90aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgICAgICBfdGhpcy50eXBlID0gdHlwZSB8fCBudWxsO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERlY2xhcmVGdW5jdGlvblN0bXQucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChzdG10KSB7XG4gICAgICAgIHJldHVybiBzdG10IGluc3RhbmNlb2YgRGVjbGFyZUZ1bmN0aW9uU3RtdCAmJiBhcmVBbGxFcXVpdmFsZW50KHRoaXMucGFyYW1zLCBzdG10LnBhcmFtcykgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5zdGF0ZW1lbnRzLCBzdG10LnN0YXRlbWVudHMpO1xuICAgIH07XG4gICAgRGVjbGFyZUZ1bmN0aW9uU3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdERlY2xhcmVGdW5jdGlvblN0bXQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVjbGFyZUZ1bmN0aW9uU3RtdDtcbn0oU3RhdGVtZW50KSk7XG52YXIgRXhwcmVzc2lvblN0YXRlbWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRXhwcmVzc2lvblN0YXRlbWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHIsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbnVsbCwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwciA9IGV4cHI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRXhwcmVzc2lvblN0YXRlbWVudC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50ICYmIHRoaXMuZXhwci5pc0VxdWl2YWxlbnQoc3RtdC5leHByKTtcbiAgICB9O1xuICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFeHByZXNzaW9uU3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBFeHByZXNzaW9uU3RhdGVtZW50O1xufShTdGF0ZW1lbnQpKTtcbnZhciBSZXR1cm5TdGF0ZW1lbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJldHVyblN0YXRlbWVudCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXR1cm5TdGF0ZW1lbnQodmFsdWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbnVsbCwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZXR1cm5TdGF0ZW1lbnQucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChzdG10KSB7XG4gICAgICAgIHJldHVybiBzdG10IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50ICYmIHRoaXMudmFsdWUuaXNFcXVpdmFsZW50KHN0bXQudmFsdWUpO1xuICAgIH07XG4gICAgUmV0dXJuU3RhdGVtZW50LnByb3RvdHlwZS52aXNpdFN0YXRlbWVudCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UmV0dXJuU3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBSZXR1cm5TdGF0ZW1lbnQ7XG59KFN0YXRlbWVudCkpO1xudmFyIEFic3RyYWN0Q2xhc3NQYXJ0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFic3RyYWN0Q2xhc3NQYXJ0KHR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVycztcbiAgICAgICAgaWYgKCFtb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubW9kaWZpZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBudWxsO1xuICAgIH1cbiAgICBBYnN0cmFjdENsYXNzUGFydC5wcm90b3R5cGUuaGFzTW9kaWZpZXIgPSBmdW5jdGlvbiAobW9kaWZpZXIpIHsgcmV0dXJuIHRoaXMubW9kaWZpZXJzLmluZGV4T2YobW9kaWZpZXIpICE9PSAtMTsgfTtcbiAgICByZXR1cm4gQWJzdHJhY3RDbGFzc1BhcnQ7XG59KCkpO1xudmFyIENsYXNzRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENsYXNzRmllbGQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2xhc3NGaWVsZChuYW1lLCB0eXBlLCBtb2RpZmllcnMsIGluaXRpYWxpemVyKSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMgPT09IHZvaWQgMCkgeyBtb2RpZmllcnMgPSBudWxsOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHR5cGUsIG1vZGlmaWVycykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLmluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ2xhc3NGaWVsZC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKGYpIHsgcmV0dXJuIHRoaXMubmFtZSA9PT0gZi5uYW1lOyB9O1xuICAgIHJldHVybiBDbGFzc0ZpZWxkO1xufShBYnN0cmFjdENsYXNzUGFydCkpO1xudmFyIENsYXNzTWV0aG9kID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDbGFzc01ldGhvZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDbGFzc01ldGhvZChuYW1lLCBwYXJhbXMsIGJvZHksIHR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBtb2RpZmllcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIF90aGlzLmJvZHkgPSBib2R5O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENsYXNzTWV0aG9kLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBtLm5hbWUgJiYgYXJlQWxsRXF1aXZhbGVudCh0aGlzLmJvZHksIG0uYm9keSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xhc3NNZXRob2Q7XG59KEFic3RyYWN0Q2xhc3NQYXJ0KSk7XG52YXIgQ2xhc3NHZXR0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENsYXNzR2V0dGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENsYXNzR2V0dGVyKG5hbWUsIGJvZHksIHR5cGUsIG1vZGlmaWVycykge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBtb2RpZmllcnMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy5ib2R5ID0gYm9keTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDbGFzc0dldHRlci5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gbS5uYW1lICYmIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5ib2R5LCBtLmJvZHkpO1xuICAgIH07XG4gICAgcmV0dXJuIENsYXNzR2V0dGVyO1xufShBYnN0cmFjdENsYXNzUGFydCkpO1xudmFyIENsYXNzU3RtdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2xhc3NTdG10LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENsYXNzU3RtdChuYW1lLCBwYXJlbnQsIGZpZWxkcywgZ2V0dGVycywgY29uc3RydWN0b3JNZXRob2QsIG1ldGhvZHMsIG1vZGlmaWVycywgc291cmNlU3Bhbikge1xuICAgICAgICBpZiAobW9kaWZpZXJzID09PSB2b2lkIDApIHsgbW9kaWZpZXJzID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtb2RpZmllcnMsIHNvdXJjZVNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgX3RoaXMuZ2V0dGVycyA9IGdldHRlcnM7XG4gICAgICAgIF90aGlzLmNvbnN0cnVjdG9yTWV0aG9kID0gY29uc3RydWN0b3JNZXRob2Q7XG4gICAgICAgIF90aGlzLm1ldGhvZHMgPSBtZXRob2RzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENsYXNzU3RtdC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQgaW5zdGFuY2VvZiBDbGFzc1N0bXQgJiYgdGhpcy5uYW1lID09PSBzdG10Lm5hbWUgJiZcbiAgICAgICAgICAgIG51bGxTYWZlSXNFcXVpdmFsZW50KHRoaXMucGFyZW50LCBzdG10LnBhcmVudCkgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5maWVsZHMsIHN0bXQuZmllbGRzKSAmJlxuICAgICAgICAgICAgYXJlQWxsRXF1aXZhbGVudCh0aGlzLmdldHRlcnMsIHN0bXQuZ2V0dGVycykgJiZcbiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3JNZXRob2QuaXNFcXVpdmFsZW50KHN0bXQuY29uc3RydWN0b3JNZXRob2QpICYmXG4gICAgICAgICAgICBhcmVBbGxFcXVpdmFsZW50KHRoaXMubWV0aG9kcywgc3RtdC5tZXRob2RzKTtcbiAgICB9O1xuICAgIENsYXNzU3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdERlY2xhcmVDbGFzc1N0bXQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xhc3NTdG10O1xufShTdGF0ZW1lbnQpKTtcbnZhciBJZlN0bXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKElmU3RtdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBJZlN0bXQoY29uZGl0aW9uLCB0cnVlQ2FzZSwgZmFsc2VDYXNlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIGlmIChmYWxzZUNhc2UgPT09IHZvaWQgMCkgeyBmYWxzZUNhc2UgPSBbXTsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBudWxsLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICAgIF90aGlzLnRydWVDYXNlID0gdHJ1ZUNhc2U7XG4gICAgICAgIF90aGlzLmZhbHNlQ2FzZSA9IGZhbHNlQ2FzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJZlN0bXQucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChzdG10KSB7XG4gICAgICAgIHJldHVybiBzdG10IGluc3RhbmNlb2YgSWZTdG10ICYmIHRoaXMuY29uZGl0aW9uLmlzRXF1aXZhbGVudChzdG10LmNvbmRpdGlvbikgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy50cnVlQ2FzZSwgc3RtdC50cnVlQ2FzZSkgJiZcbiAgICAgICAgICAgIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5mYWxzZUNhc2UsIHN0bXQuZmFsc2VDYXNlKTtcbiAgICB9O1xuICAgIElmU3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdElmU3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBJZlN0bXQ7XG59KFN0YXRlbWVudCkpO1xudmFyIENvbW1lbnRTdG10ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb21tZW50U3RtdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb21tZW50U3RtdChjb21tZW50LCBtdWx0aWxpbmUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgaWYgKG11bHRpbGluZSA9PT0gdm9pZCAwKSB7IG11bHRpbGluZSA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG51bGwsIHNvdXJjZVNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICBfdGhpcy5tdWx0aWxpbmUgPSBtdWx0aWxpbmU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29tbWVudFN0bXQucHJvdG90eXBlLmlzRXF1aXZhbGVudCA9IGZ1bmN0aW9uIChzdG10KSB7IHJldHVybiBzdG10IGluc3RhbmNlb2YgQ29tbWVudFN0bXQ7IH07XG4gICAgQ29tbWVudFN0bXQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRDb21tZW50U3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBDb21tZW50U3RtdDtcbn0oU3RhdGVtZW50KSk7XG52YXIgSlNEb2NDb21tZW50U3RtdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSlNEb2NDb21tZW50U3RtdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBKU0RvY0NvbW1lbnRTdG10KHRhZ3MsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgaWYgKHRhZ3MgPT09IHZvaWQgMCkgeyB0YWdzID0gW107IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbnVsbCwgc291cmNlU3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMudGFncyA9IHRhZ3M7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSlNEb2NDb21tZW50U3RtdC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQgaW5zdGFuY2VvZiBKU0RvY0NvbW1lbnRTdG10ICYmIHRoaXMudG9TdHJpbmcoKSA9PT0gc3RtdC50b1N0cmluZygpO1xuICAgIH07XG4gICAgSlNEb2NDb21tZW50U3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEpTRG9jQ29tbWVudFN0bXQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICBKU0RvY0NvbW1lbnRTdG10LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlcmlhbGl6ZVRhZ3ModGhpcy50YWdzKTsgfTtcbiAgICByZXR1cm4gSlNEb2NDb21tZW50U3RtdDtcbn0oU3RhdGVtZW50KSk7XG52YXIgVHJ5Q2F0Y2hTdG10ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUcnlDYXRjaFN0bXQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVHJ5Q2F0Y2hTdG10KGJvZHlTdG10cywgY2F0Y2hTdG10cywgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBudWxsLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5ib2R5U3RtdHMgPSBib2R5U3RtdHM7XG4gICAgICAgIF90aGlzLmNhdGNoU3RtdHMgPSBjYXRjaFN0bXRzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRyeUNhdGNoU3RtdC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQgaW5zdGFuY2VvZiBUcnlDYXRjaFN0bXQgJiYgYXJlQWxsRXF1aXZhbGVudCh0aGlzLmJvZHlTdG10cywgc3RtdC5ib2R5U3RtdHMpICYmXG4gICAgICAgICAgICBhcmVBbGxFcXVpdmFsZW50KHRoaXMuY2F0Y2hTdG10cywgc3RtdC5jYXRjaFN0bXRzKTtcbiAgICB9O1xuICAgIFRyeUNhdGNoU3RtdC5wcm90b3R5cGUudmlzaXRTdGF0ZW1lbnQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFRyeUNhdGNoU3RtdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBUcnlDYXRjaFN0bXQ7XG59KFN0YXRlbWVudCkpO1xudmFyIFRocm93U3RtdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVGhyb3dTdG10LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRocm93U3RtdChlcnJvciwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBudWxsLCBzb3VyY2VTcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRocm93U3RtdC5wcm90b3R5cGUuaXNFcXVpdmFsZW50ID0gZnVuY3Rpb24gKHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQgaW5zdGFuY2VvZiBUcnlDYXRjaFN0bXQgJiYgdGhpcy5lcnJvci5pc0VxdWl2YWxlbnQoc3RtdC5lcnJvcik7XG4gICAgfTtcbiAgICBUaHJvd1N0bXQucHJvdG90eXBlLnZpc2l0U3RhdGVtZW50ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUaHJvd1N0bXQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gVGhyb3dTdG10O1xufShTdGF0ZW1lbnQpKTtcbnZhciBBc3RUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3RUcmFuc2Zvcm1lcigpIHtcbiAgICB9XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnRyYW5zZm9ybUV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY29udGV4dCkgeyByZXR1cm4gZXhwcjsgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7IHJldHVybiBzdG10OyB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKGFzdCwgY29udGV4dCk7IH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0V3JhcHBlZE5vZGVFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRUeXBlb2ZFeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgVHlwZW9mRXhwcihleHByLmV4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBleHByLnR5cGUsIGV4cHIuc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0V3JpdGVWYXJFeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgV3JpdGVWYXJFeHByKGV4cHIubmFtZSwgZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGV4cHIudHlwZSwgZXhwci5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRXcml0ZUtleUV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBXcml0ZUtleUV4cHIoZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGV4cHIuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgZXhwci50eXBlLCBleHByLnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFdyaXRlUHJvcEV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBXcml0ZVByb3BFeHByKGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBleHByLm5hbWUsIGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBleHByLnR5cGUsIGV4cHIuc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0SW52b2tlTWV0aG9kRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG1ldGhvZCA9IGFzdC5idWlsdGluIHx8IGFzdC5uYW1lO1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBJbnZva2VNZXRob2RFeHByKGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIG1ldGhvZCwgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5hcmdzLCBjb250ZXh0KSwgYXN0LnR5cGUsIGFzdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IEludm9rZUZ1bmN0aW9uRXhwcihhc3QuZm4udmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmFyZ3MsIGNvbnRleHQpLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEluc3RhbnRpYXRlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgSW5zdGFudGlhdGVFeHByKGFzdC5jbGFzc0V4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmFyZ3MsIGNvbnRleHQpLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKGFzdCwgY29udGV4dCk7IH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IENvbmRpdGlvbmFsRXhwcihhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgYXN0LnRydWVDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgYXN0LmZhbHNlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC50eXBlLCBhc3Quc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Tm90RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgTm90RXhwcihhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFzc2VydE5vdE51bGxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBBc3NlcnROb3ROdWxsKGFzdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3Quc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IENhc3RFeHByKGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC50eXBlLCBhc3Quc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBGdW5jdGlvbkV4cHIoYXN0LnBhcmFtcywgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoYXN0LnN0YXRlbWVudHMsIGNvbnRleHQpLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEJpbmFyeU9wZXJhdG9yRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgQmluYXJ5T3BlcmF0b3JFeHByKGFzdC5vcGVyYXRvciwgYXN0Lmxocy52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC5yaHMudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFJlYWRQcm9wRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRXhwcihuZXcgUmVhZFByb3BFeHByKGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCksIGFzdC5uYW1lLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFJlYWRLZXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1FeHByKG5ldyBSZWFkS2V5RXhwcihhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3QuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBhc3QudHlwZSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IExpdGVyYWxBcnJheUV4cHIodGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5lbnRyaWVzLCBjb250ZXh0KSwgYXN0LnR5cGUsIGFzdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVudHJpZXMgPSBhc3QuZW50cmllcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiBuZXcgTGl0ZXJhbE1hcEVudHJ5KGVudHJ5LmtleSwgZW50cnkudmFsdWUudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KSwgZW50cnkucXVvdGVkKTsgfSk7XG4gICAgICAgIHZhciBtYXBUeXBlID0gbmV3IE1hcFR5cGUoYXN0LnZhbHVlVHlwZSwgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IExpdGVyYWxNYXBFeHByKGVudHJpZXMsIG1hcFR5cGUsIGFzdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRDb21tYUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybUV4cHIobmV3IENvbW1hRXhwcih0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LnBhcnRzLCBjb250ZXh0KSwgYXN0LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFsbEV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGV4cHJzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBleHBycy5tYXAoZnVuY3Rpb24gKGV4cHIpIHsgcmV0dXJuIGV4cHIudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXREZWNsYXJlVmFyU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHN0bXQudmFsdWUgJiYgc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVN0bXQobmV3IERlY2xhcmVWYXJTdG10KHN0bXQubmFtZSwgdmFsdWUsIHN0bXQudHlwZSwgc3RtdC5tb2RpZmllcnMsIHN0bXQuc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVN0bXQobmV3IERlY2xhcmVGdW5jdGlvblN0bXQoc3RtdC5uYW1lLCBzdG10LnBhcmFtcywgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5zdGF0ZW1lbnRzLCBjb250ZXh0KSwgc3RtdC50eXBlLCBzdG10Lm1vZGlmaWVycywgc3RtdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVN0bXQobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoc3RtdC5leHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgc3RtdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRSZXR1cm5TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtU3RtdChuZXcgUmV0dXJuU3RhdGVtZW50KHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpLCBzdG10LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdERlY2xhcmVDbGFzc1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcGFyZW50ID0gc3RtdC5wYXJlbnQudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICB2YXIgZ2V0dGVycyA9IHN0bXQuZ2V0dGVycy5tYXAoZnVuY3Rpb24gKGdldHRlcikgeyByZXR1cm4gbmV3IENsYXNzR2V0dGVyKGdldHRlci5uYW1lLCBfdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoZ2V0dGVyLmJvZHksIGNvbnRleHQpLCBnZXR0ZXIudHlwZSwgZ2V0dGVyLm1vZGlmaWVycyk7IH0pO1xuICAgICAgICB2YXIgY3Rvck1ldGhvZCA9IHN0bXQuY29uc3RydWN0b3JNZXRob2QgJiZcbiAgICAgICAgICAgIG5ldyBDbGFzc01ldGhvZChzdG10LmNvbnN0cnVjdG9yTWV0aG9kLm5hbWUsIHN0bXQuY29uc3RydWN0b3JNZXRob2QucGFyYW1zLCB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNvbnN0cnVjdG9yTWV0aG9kLmJvZHksIGNvbnRleHQpLCBzdG10LmNvbnN0cnVjdG9yTWV0aG9kLnR5cGUsIHN0bXQuY29uc3RydWN0b3JNZXRob2QubW9kaWZpZXJzKTtcbiAgICAgICAgdmFyIG1ldGhvZHMgPSBzdG10Lm1ldGhvZHMubWFwKGZ1bmN0aW9uIChtZXRob2QpIHsgcmV0dXJuIG5ldyBDbGFzc01ldGhvZChtZXRob2QubmFtZSwgbWV0aG9kLnBhcmFtcywgX3RoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKG1ldGhvZC5ib2R5LCBjb250ZXh0KSwgbWV0aG9kLnR5cGUsIG1ldGhvZC5tb2RpZmllcnMpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtU3RtdChuZXcgQ2xhc3NTdG10KHN0bXQubmFtZSwgcGFyZW50LCBzdG10LmZpZWxkcywgZ2V0dGVycywgY3Rvck1ldGhvZCwgbWV0aG9kcywgc3RtdC5tb2RpZmllcnMsIHN0bXQuc291cmNlU3BhbiksIGNvbnRleHQpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0SWZTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtU3RtdChuZXcgSWZTdG10KHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY29udGV4dCksIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuZmFsc2VDYXNlLCBjb250ZXh0KSwgc3RtdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRUcnlDYXRjaFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1TdG10KG5ldyBUcnlDYXRjaFN0bXQodGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5ib2R5U3RtdHMsIGNvbnRleHQpLCB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNhdGNoU3RtdHMsIGNvbnRleHQpLCBzdG10LnNvdXJjZVNwYW4pLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFRocm93U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVN0bXQobmV3IFRocm93U3RtdChzdG10LmVycm9yLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KSwgc3RtdC5zb3VyY2VTcGFuKSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRDb21tZW50U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVN0bXQoc3RtdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRKU0RvY0NvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtU3RtdChzdG10LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFsbFN0YXRlbWVudHMgPSBmdW5jdGlvbiAoc3RtdHMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHN0bXRzLm1hcChmdW5jdGlvbiAoc3RtdCkgeyByZXR1cm4gc3RtdC52aXNpdFN0YXRlbWVudChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEFzdFRyYW5zZm9ybWVyO1xufSgpKTtcbnZhciBSZWN1cnNpdmVBc3RWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlY3Vyc2l2ZUFzdFZpc2l0b3IoKSB7XG4gICAgfVxuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIGFzdDsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChhc3QudHlwZSkge1xuICAgICAgICAgICAgYXN0LnR5cGUudmlzaXRUeXBlKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJ1aWx0aW5UeXBlID0gZnVuY3Rpb24gKHR5cGUsIGNvbnRleHQpIHsgcmV0dXJuIHRoaXMudmlzaXRUeXBlKHR5cGUsIGNvbnRleHQpOyB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvblR5cGUgPSBmdW5jdGlvbiAodHlwZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0eXBlLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdHlwZS50eXBlUGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7IHJldHVybiBfdGhpcy52aXNpdFR5cGUocGFyYW0sIGNvbnRleHQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdFR5cGUodHlwZSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFycmF5VHlwZSA9IGZ1bmN0aW9uICh0eXBlLCBjb250ZXh0KSB7IHJldHVybiB0aGlzLnZpc2l0VHlwZSh0eXBlLCBjb250ZXh0KTsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1hcFR5cGUgPSBmdW5jdGlvbiAodHlwZSwgY29udGV4dCkgeyByZXR1cm4gdGhpcy52aXNpdFR5cGUodHlwZSwgY29udGV4dCk7IH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRXcmFwcGVkTm9kZUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBhc3Q7IH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRUeXBlb2ZFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVLZXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBhc3QuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBhc3QudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JpdGVQcm9wRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgYXN0LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludm9rZU1ldGhvZEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5mbi52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnN0YW50aWF0ZUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5jbGFzc0V4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHRlcm5hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChhc3QudHlwZVBhcmFtcykge1xuICAgICAgICAgICAgYXN0LnR5cGVQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZS52aXNpdFR5cGUoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgYXN0LnRydWVDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgYXN0LmZhbHNlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXROb3RFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFzc2VydE5vdE51bGxFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdENhc3RFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhhc3Quc3RhdGVtZW50cywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5saHMudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBhc3QucmhzLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRQcm9wRXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRLZXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICBhc3QuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5lbnRyaWVzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRFeHByZXNzaW9uKGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxNYXBFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBhc3QuZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnkudmFsdWUudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0RXhwcmVzc2lvbihhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tYUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QucGFydHMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEV4cHJlc3Npb24oYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoZXhwcnMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgZXhwcnMuZm9yRWFjaChmdW5jdGlvbiAoZXhwcikgeyByZXR1cm4gZXhwci52aXNpdEV4cHJlc3Npb24oX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICBpZiAoc3RtdC52YWx1ZSkge1xuICAgICAgICAgICAgc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0bXQudHlwZSkge1xuICAgICAgICAgICAgc3RtdC50eXBlLnZpc2l0VHlwZSh0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RtdDtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuc3RhdGVtZW50cywgY29udGV4dCk7XG4gICAgICAgIGlmIChzdG10LnR5cGUpIHtcbiAgICAgICAgICAgIHN0bXQudHlwZS52aXNpdFR5cGUodGhpcywgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHtcbiAgICAgICAgc3RtdC5leHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJldHVyblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICBzdG10LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVDbGFzc1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBzdG10LnBhcmVudC52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgICAgIHN0bXQuZ2V0dGVycy5mb3JFYWNoKGZ1bmN0aW9uIChnZXR0ZXIpIHsgcmV0dXJuIF90aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhnZXR0ZXIuYm9keSwgY29udGV4dCk7IH0pO1xuICAgICAgICBpZiAoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5ib2R5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBzdG10Lm1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7IHJldHVybiBfdGhpcy52aXNpdEFsbFN0YXRlbWVudHMobWV0aG9kLmJvZHksIGNvbnRleHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdElmU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY29udGV4dCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuZmFsc2VDYXNlLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRyeUNhdGNoU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuYm9keVN0bXRzLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5jYXRjaFN0bXRzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRocm93U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIHN0bXQuZXJyb3IudmlzaXRFeHByZXNzaW9uKHRoaXMsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gc3RtdDtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29tbWVudFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkgeyByZXR1cm4gc3RtdDsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEpTRG9jQ29tbWVudFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkgeyByZXR1cm4gc3RtdDsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFsbFN0YXRlbWVudHMgPSBmdW5jdGlvbiAoc3RtdHMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3RtdHMuZm9yRWFjaChmdW5jdGlvbiAoc3RtdCkgeyByZXR1cm4gc3RtdC52aXNpdFN0YXRlbWVudChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFJlY3Vyc2l2ZUFzdFZpc2l0b3I7XG59KCkpO1xuZnVuY3Rpb24gZmluZFJlYWRWYXJOYW1lcyhzdG10cykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9SZWFkVmFyVmlzaXRvcigpO1xuICAgIHZpc2l0b3IudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXRzLCBudWxsKTtcbiAgICByZXR1cm4gdmlzaXRvci52YXJOYW1lcztcbn1cbnZhciBfUmVhZFZhclZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKF9SZWFkVmFyVmlzaXRvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBfUmVhZFZhclZpc2l0b3IoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YXJOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBfUmVhZFZhclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIC8vIERvbid0IGRlc2NlbmQgaW50byBuZXN0ZWQgZnVuY3Rpb25zXG4gICAgICAgIHJldHVybiBzdG10O1xuICAgIH07XG4gICAgX1JlYWRWYXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVDbGFzc1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkge1xuICAgICAgICAvLyBEb24ndCBkZXNjZW5kIGludG8gbmVzdGVkIGNsYXNzZXNcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICBfUmVhZFZhclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChhc3QubmFtZSkge1xuICAgICAgICAgICAgdGhpcy52YXJOYW1lcy5hZGQoYXN0Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIF9SZWFkVmFyVmlzaXRvcjtcbn0oUmVjdXJzaXZlQXN0VmlzaXRvcikpO1xuZnVuY3Rpb24gY29sbGVjdEV4dGVybmFsUmVmZXJlbmNlcyhzdG10cykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9GaW5kRXh0ZXJuYWxSZWZlcmVuY2VzVmlzaXRvcigpO1xuICAgIHZpc2l0b3IudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXRzLCBudWxsKTtcbiAgICByZXR1cm4gdmlzaXRvci5leHRlcm5hbFJlZmVyZW5jZXM7XG59XG52YXIgX0ZpbmRFeHRlcm5hbFJlZmVyZW5jZXNWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhfRmluZEV4dGVybmFsUmVmZXJlbmNlc1Zpc2l0b3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gX0ZpbmRFeHRlcm5hbFJlZmVyZW5jZXNWaXNpdG9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXh0ZXJuYWxSZWZlcmVuY2VzID0gW107XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX0ZpbmRFeHRlcm5hbFJlZmVyZW5jZXNWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4dGVybmFsRXhwciA9IGZ1bmN0aW9uIChlLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxSZWZlcmVuY2VzLnB1c2goZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByLmNhbGwodGhpcywgZSwgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gX0ZpbmRFeHRlcm5hbFJlZmVyZW5jZXNWaXNpdG9yO1xufShSZWN1cnNpdmVBc3RWaXNpdG9yKSk7XG5mdW5jdGlvbiBhcHBseVNvdXJjZVNwYW5Ub1N0YXRlbWVudElmTmVlZGVkKHN0bXQsIHNvdXJjZVNwYW4pIHtcbiAgICBpZiAoIXNvdXJjZVNwYW4pIHtcbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfVxuICAgIHZhciB0cmFuc2Zvcm1lciA9IG5ldyBfQXBwbHlTb3VyY2VTcGFuVHJhbnNmb3JtZXIoc291cmNlU3Bhbik7XG4gICAgcmV0dXJuIHN0bXQudmlzaXRTdGF0ZW1lbnQodHJhbnNmb3JtZXIsIG51bGwpO1xufVxuZnVuY3Rpb24gYXBwbHlTb3VyY2VTcGFuVG9FeHByZXNzaW9uSWZOZWVkZWQoZXhwciwgc291cmNlU3Bhbikge1xuICAgIGlmICghc291cmNlU3Bhbikge1xuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9XG4gICAgdmFyIHRyYW5zZm9ybWVyID0gbmV3IF9BcHBseVNvdXJjZVNwYW5UcmFuc2Zvcm1lcihzb3VyY2VTcGFuKTtcbiAgICByZXR1cm4gZXhwci52aXNpdEV4cHJlc3Npb24odHJhbnNmb3JtZXIsIG51bGwpO1xufVxudmFyIF9BcHBseVNvdXJjZVNwYW5UcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoX0FwcGx5U291cmNlU3BhblRyYW5zZm9ybWVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIF9BcHBseVNvdXJjZVNwYW5UcmFuc2Zvcm1lcihzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIF9BcHBseVNvdXJjZVNwYW5UcmFuc2Zvcm1lci5wcm90b3R5cGUuX2Nsb25lID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgY2xvbmUgPSBPYmplY3QuY3JlYXRlKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgY2xvbmVbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgX0FwcGx5U291cmNlU3BhblRyYW5zZm9ybWVyLnByb3RvdHlwZS50cmFuc2Zvcm1FeHByID0gZnVuY3Rpb24gKGV4cHIsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCFleHByLnNvdXJjZVNwYW4pIHtcbiAgICAgICAgICAgIGV4cHIgPSB0aGlzLl9jbG9uZShleHByKTtcbiAgICAgICAgICAgIGV4cHIuc291cmNlU3BhbiA9IHRoaXMuc291cmNlU3BhbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9O1xuICAgIF9BcHBseVNvdXJjZVNwYW5UcmFuc2Zvcm1lci5wcm90b3R5cGUudHJhbnNmb3JtU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjb250ZXh0KSB7XG4gICAgICAgIGlmICghc3RtdC5zb3VyY2VTcGFuKSB7XG4gICAgICAgICAgICBzdG10ID0gdGhpcy5fY2xvbmUoc3RtdCk7XG4gICAgICAgICAgICBzdG10LnNvdXJjZVNwYW4gPSB0aGlzLnNvdXJjZVNwYW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0bXQ7XG4gICAgfTtcbiAgICByZXR1cm4gX0FwcGx5U291cmNlU3BhblRyYW5zZm9ybWVyO1xufShBc3RUcmFuc2Zvcm1lcikpO1xuZnVuY3Rpb24gdmFyaWFibGUobmFtZSwgdHlwZSwgc291cmNlU3Bhbikge1xuICAgIHJldHVybiBuZXcgUmVhZFZhckV4cHIobmFtZSwgdHlwZSwgc291cmNlU3Bhbik7XG59XG5mdW5jdGlvbiBpbXBvcnRFeHByKGlkLCB0eXBlUGFyYW1zLCBzb3VyY2VTcGFuKSB7XG4gICAgaWYgKHR5cGVQYXJhbXMgPT09IHZvaWQgMCkgeyB0eXBlUGFyYW1zID0gbnVsbDsgfVxuICAgIHJldHVybiBuZXcgRXh0ZXJuYWxFeHByKGlkLCBudWxsLCB0eXBlUGFyYW1zLCBzb3VyY2VTcGFuKTtcbn1cbmZ1bmN0aW9uIGltcG9ydFR5cGUoaWQsIHR5cGVQYXJhbXMsIHR5cGVNb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZVBhcmFtcyA9PT0gdm9pZCAwKSB7IHR5cGVQYXJhbXMgPSBudWxsOyB9XG4gICAgaWYgKHR5cGVNb2RpZmllcnMgPT09IHZvaWQgMCkgeyB0eXBlTW9kaWZpZXJzID0gbnVsbDsgfVxuICAgIHJldHVybiBpZCAhPSBudWxsID8gZXhwcmVzc2lvblR5cGUoaW1wb3J0RXhwcihpZCwgdHlwZVBhcmFtcywgbnVsbCksIHR5cGVNb2RpZmllcnMpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGV4cHJlc3Npb25UeXBlKGV4cHIsIHR5cGVNb2RpZmllcnMsIHR5cGVQYXJhbXMpIHtcbiAgICBpZiAodHlwZU1vZGlmaWVycyA9PT0gdm9pZCAwKSB7IHR5cGVNb2RpZmllcnMgPSBudWxsOyB9XG4gICAgaWYgKHR5cGVQYXJhbXMgPT09IHZvaWQgMCkgeyB0eXBlUGFyYW1zID0gbnVsbDsgfVxuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblR5cGUoZXhwciwgdHlwZU1vZGlmaWVycywgdHlwZVBhcmFtcyk7XG59XG5mdW5jdGlvbiB0eXBlb2ZFeHByKGV4cHIpIHtcbiAgICByZXR1cm4gbmV3IFR5cGVvZkV4cHIoZXhwcik7XG59XG5mdW5jdGlvbiBsaXRlcmFsQXJyKHZhbHVlcywgdHlwZSwgc291cmNlU3Bhbikge1xuICAgIHJldHVybiBuZXcgTGl0ZXJhbEFycmF5RXhwcih2YWx1ZXMsIHR5cGUsIHNvdXJjZVNwYW4pO1xufVxuZnVuY3Rpb24gbGl0ZXJhbE1hcCh2YWx1ZXMsIHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBudWxsOyB9XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwRXhwcih2YWx1ZXMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBuZXcgTGl0ZXJhbE1hcEVudHJ5KGUua2V5LCBlLnZhbHVlLCBlLnF1b3RlZCk7IH0pLCB0eXBlLCBudWxsKTtcbn1cbmZ1bmN0aW9uIG5vdChleHByLCBzb3VyY2VTcGFuKSB7XG4gICAgcmV0dXJuIG5ldyBOb3RFeHByKGV4cHIsIHNvdXJjZVNwYW4pO1xufVxuZnVuY3Rpb24gYXNzZXJ0Tm90TnVsbChleHByLCBzb3VyY2VTcGFuKSB7XG4gICAgcmV0dXJuIG5ldyBBc3NlcnROb3ROdWxsKGV4cHIsIHNvdXJjZVNwYW4pO1xufVxuZnVuY3Rpb24gZm4ocGFyYW1zLCBib2R5LCB0eXBlLCBzb3VyY2VTcGFuLCBuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHIocGFyYW1zLCBib2R5LCB0eXBlLCBzb3VyY2VTcGFuLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIGlmU3RtdChjb25kaXRpb24sIHRoZW5DbGF1c2UsIGVsc2VDbGF1c2UpIHtcbiAgICByZXR1cm4gbmV3IElmU3RtdChjb25kaXRpb24sIHRoZW5DbGF1c2UsIGVsc2VDbGF1c2UpO1xufVxuZnVuY3Rpb24gbGl0ZXJhbCh2YWx1ZSwgdHlwZSwgc291cmNlU3Bhbikge1xuICAgIHJldHVybiBuZXcgTGl0ZXJhbEV4cHIodmFsdWUsIHR5cGUsIHNvdXJjZVNwYW4pO1xufVxuZnVuY3Rpb24gaXNOdWxsKGV4cCkge1xuICAgIHJldHVybiBleHAgaW5zdGFuY2VvZiBMaXRlcmFsRXhwciAmJiBleHAudmFsdWUgPT09IG51bGw7XG59XG4vKlxuICogU2VyaWFsaXplcyBhIGBUYWdgIGludG8gYSBzdHJpbmcuXG4gKiBSZXR1cm5zIGEgc3RyaW5nIGxpa2UgXCIgQGZvbyB7YmFyfSBiYXpcIiAobm90ZSB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIGJlZm9yZSBgQGZvb2ApLlxuICovXG5mdW5jdGlvbiB0YWdUb1N0cmluZyh0YWcpIHtcbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgaWYgKHRhZy50YWdOYW1lKSB7XG4gICAgICAgIG91dCArPSBcIiBAXCIgKyB0YWcudGFnTmFtZTtcbiAgICB9XG4gICAgaWYgKHRhZy50ZXh0KSB7XG4gICAgICAgIGlmICh0YWcudGV4dC5tYXRjaCgvXFwvXFwqfFxcKlxcLy8pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTRG9jIHRleHQgY2Fubm90IGNvbnRhaW4gXCIvKlwiIGFuZCBcIiovXCInKTtcbiAgICAgICAgfVxuICAgICAgICBvdXQgKz0gJyAnICsgdGFnLnRleHQucmVwbGFjZSgvQC9nLCAnXFxcXEAnKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRhZ3ModGFncykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHZhciBvdXQgPSAnKlxcbic7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgdGFnc18xID0gX192YWx1ZXModGFncyksIHRhZ3NfMV8xID0gdGFnc18xLm5leHQoKTsgIXRhZ3NfMV8xLmRvbmU7IHRhZ3NfMV8xID0gdGFnc18xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIHRhZyA9IHRhZ3NfMV8xLnZhbHVlO1xuICAgICAgICAgICAgb3V0ICs9ICcgKic7XG4gICAgICAgICAgICAvLyBJZiB0aGUgdGFnVG9TdHJpbmcgaXMgbXVsdGktbGluZSwgaW5zZXJ0IFwiICogXCIgcHJlZml4ZXMgb24gc3Vic2VxdWVudCBsaW5lcy5cbiAgICAgICAgICAgIG91dCArPSB0YWdUb1N0cmluZyh0YWcpLnJlcGxhY2UoL1xcbi9nLCAnXFxuICogJyk7XG4gICAgICAgICAgICBvdXQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0YWdzXzFfMSAmJiAhdGFnc18xXzEuZG9uZSAmJiAoX2EgPSB0YWdzXzEucmV0dXJuKSkgX2EuY2FsbCh0YWdzXzEpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgb3V0ICs9ICcgJztcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgREFTSF9DQVNFX1JFR0VYUCA9IC8tKyhbYS16MC05XSkvZztcbmZ1bmN0aW9uIGRhc2hDYXNlVG9DYW1lbENhc2UoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShEQVNIX0NBU0VfUkVHRVhQLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBtW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1bMV0udG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNwbGl0QXRDb2xvbihpbnB1dCwgZGVmYXVsdFZhbHVlcykge1xuICAgIHJldHVybiBfc3BsaXRBdChpbnB1dCwgJzonLCBkZWZhdWx0VmFsdWVzKTtcbn1cbmZ1bmN0aW9uIHNwbGl0QXRQZXJpb2QoaW5wdXQsIGRlZmF1bHRWYWx1ZXMpIHtcbiAgICByZXR1cm4gX3NwbGl0QXQoaW5wdXQsICcuJywgZGVmYXVsdFZhbHVlcyk7XG59XG5mdW5jdGlvbiBfc3BsaXRBdChpbnB1dCwgY2hhcmFjdGVyLCBkZWZhdWx0VmFsdWVzKSB7XG4gICAgdmFyIGNoYXJhY3RlckluZGV4ID0gaW5wdXQuaW5kZXhPZihjaGFyYWN0ZXIpO1xuICAgIGlmIChjaGFyYWN0ZXJJbmRleCA9PSAtMSlcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgcmV0dXJuIFtpbnB1dC5zbGljZSgwLCBjaGFyYWN0ZXJJbmRleCkudHJpbSgpLCBpbnB1dC5zbGljZShjaGFyYWN0ZXJJbmRleCArIDEpLnRyaW0oKV07XG59XG5mdW5jdGlvbiB2aXNpdFZhbHVlKHZhbHVlLCB2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QXJyYXkodmFsdWUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNTdHJpY3RTdHJpbmdNYXAodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3RyaW5nTWFwKHZhbHVlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UHJpbWl0aXZlKHZhbHVlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRPdGhlcih2YWx1ZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBpc0RlZmluZWQodmFsKSB7XG4gICAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIG5vVW5kZWZpbmVkKHZhbCkge1xuICAgIHJldHVybiB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWw7XG59XG52YXIgVmFsdWVUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWYWx1ZVRyYW5zZm9ybWVyKCkge1xuICAgIH1cbiAgICBWYWx1ZVRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFycmF5ID0gZnVuY3Rpb24gKGFyciwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gYXJyLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZpc2l0VmFsdWUodmFsdWUsIF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgfTtcbiAgICBWYWx1ZVRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFN0cmluZ01hcCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXN1bHRba2V5XSA9IHZpc2l0VmFsdWUobWFwW2tleV0sIF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBWYWx1ZVRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFByaW1pdGl2ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgY29udGV4dCkgeyByZXR1cm4gdmFsdWU7IH07XG4gICAgVmFsdWVUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRPdGhlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY29udGV4dCkgeyByZXR1cm4gdmFsdWU7IH07XG4gICAgcmV0dXJuIFZhbHVlVHJhbnNmb3JtZXI7XG59KCkpO1xudmFyIFN5bmNBc3luYyA9IHtcbiAgICBhc3NlcnRTeW5jOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgc3RhdGU6IHZhbHVlIGNhbm5vdCBiZSBhIHByb21pc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgdGhlbjogZnVuY3Rpb24gKHZhbHVlLCBjYikgeyByZXR1cm4gaXNQcm9taXNlKHZhbHVlKSA/IHZhbHVlLnRoZW4oY2IpIDogY2IodmFsdWUpOyB9LFxuICAgIGFsbDogZnVuY3Rpb24gKHN5bmNBc3luY1ZhbHVlcykge1xuICAgICAgICByZXR1cm4gc3luY0FzeW5jVmFsdWVzLnNvbWUoaXNQcm9taXNlKSA/IFByb21pc2UuYWxsKHN5bmNBc3luY1ZhbHVlcykgOiBzeW5jQXN5bmNWYWx1ZXM7XG4gICAgfVxufTtcbmZ1bmN0aW9uIGVycm9yKG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludGVybmFsIEVycm9yOiBcIiArIG1zZyk7XG59XG5mdW5jdGlvbiBzeW50YXhFcnJvcihtc2csIHBhcnNlRXJyb3JzKSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IobXNnKTtcbiAgICBlcnJvcltFUlJPUl9TWU5UQVhfRVJST1JdID0gdHJ1ZTtcbiAgICBpZiAocGFyc2VFcnJvcnMpXG4gICAgICAgIGVycm9yW0VSUk9SX1BBUlNFX0VSUk9SU10gPSBwYXJzZUVycm9ycztcbiAgICByZXR1cm4gZXJyb3I7XG59XG52YXIgRVJST1JfU1lOVEFYX0VSUk9SID0gJ25nU3ludGF4RXJyb3InO1xudmFyIEVSUk9SX1BBUlNFX0VSUk9SUyA9ICduZ1BhcnNlRXJyb3JzJztcbmZ1bmN0aW9uIGlzU3ludGF4RXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3JbRVJST1JfU1lOVEFYX0VSUk9SXTtcbn1cbmZ1bmN0aW9uIGdldFBhcnNlRXJyb3JzKGVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yW0VSUk9SX1BBUlNFX0VSUk9SU10gfHwgW107XG59XG4vLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW4gUmVndWxhciBFeHByZXNzaW9uc1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4qKz9ePSE6JHt9KCl8W1xcXVxcL1xcXFxdKS9nLCAnXFxcXCQxJyk7XG59XG52YXIgU1RSSU5HX01BUF9QUk9UTyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSk7XG5mdW5jdGlvbiBpc1N0cmljdFN0cmluZ01hcChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBTVFJJTkdfTUFQX1BST1RPO1xufVxuZnVuY3Rpb24gdXRmOEVuY29kZShzdHIpIHtcbiAgICB2YXIgZW5jb2RlZCA9ICcnO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBjb2RlUG9pbnQgPSBzdHIuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgIC8vIGRlY29kZSBzdXJyb2dhdGVcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICBpZiAoY29kZVBvaW50ID49IDB4ZDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhkYmZmICYmIHN0ci5sZW5ndGggPiAoaW5kZXggKyAxKSkge1xuICAgICAgICAgICAgdmFyIGxvdyA9IHN0ci5jaGFyQ29kZUF0KGluZGV4ICsgMSk7XG4gICAgICAgICAgICBpZiAobG93ID49IDB4ZGMwMCAmJiBsb3cgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICBjb2RlUG9pbnQgPSAoKGNvZGVQb2ludCAtIDB4ZDgwMCkgPDwgMTApICsgbG93IC0gMHhkYzAwICsgMHgxMDAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4N2YpIHtcbiAgICAgICAgICAgIGVuY29kZWQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweDdmZikge1xuICAgICAgICAgICAgZW5jb2RlZCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDYpICYgMHgxRikgfCAweGMwLCAoY29kZVBvaW50ICYgMHgzZikgfCAweDgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgICAgICBlbmNvZGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCA+PiAxMikgfCAweGUwLCAoKGNvZGVQb2ludCA+PiA2KSAmIDB4M2YpIHwgMHg4MCwgKGNvZGVQb2ludCAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZVBvaW50IDw9IDB4MWZmZmZmKSB7XG4gICAgICAgICAgICBlbmNvZGVkICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gMTgpICYgMHgwNykgfCAweGYwLCAoKGNvZGVQb2ludCA+PiAxMikgJiAweDNmKSB8IDB4ODAsICgoY29kZVBvaW50ID4+IDYpICYgMHgzZikgfCAweDgwLCAoY29kZVBvaW50ICYgMHgzZikgfCAweDgwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5jb2RlZDtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh0b2tlbikge1xuICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgaWYgKHRva2VuIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuICdbJyArIHRva2VuLm1hcChzdHJpbmdpZnkpLmpvaW4oJywgJykgKyAnXSc7XG4gICAgfVxuICAgIGlmICh0b2tlbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRva2VuO1xuICAgIH1cbiAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyB0b2tlbi5vdmVycmlkZGVuTmFtZTtcbiAgICB9XG4gICAgaWYgKHRva2VuLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIFwiXCIgKyB0b2tlbi5uYW1lO1xuICAgIH1cbiAgICAvLyBXQVJOSU5HOiBkbyBub3QgdHJ5IHRvIGBKU09OLnN0cmluZ2lmeSh0b2tlbilgIGhlcmVcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjM0NDBcbiAgICB2YXIgcmVzID0gdG9rZW4udG9TdHJpbmcoKTtcbiAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnICsgcmVzO1xuICAgIH1cbiAgICB2YXIgbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoJ1xcbicpO1xuICAgIHJldHVybiBuZXdMaW5lSW5kZXggPT09IC0xID8gcmVzIDogcmVzLnN1YnN0cmluZygwLCBuZXdMaW5lSW5kZXgpO1xufVxuLyoqXG4gKiBMYXppbHkgcmV0cmlldmVzIHRoZSByZWZlcmVuY2UgdmFsdWUgZnJvbSBhIGZvcndhcmRSZWYuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpIHtcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZS5oYXNPd25Qcm9wZXJ0eSgnX19mb3J3YXJkX3JlZl9fJykpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbn1cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBzaGFwZWQgbGlrZSBhIFByb21pc2VcbiAqL1xuZnVuY3Rpb24gaXNQcm9taXNlKG9iaikge1xuICAgIC8vIGFsbG93IGFueSBQcm9taXNlL0ErIGNvbXBsaWFudCB0aGVuYWJsZS5cbiAgICAvLyBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgb2JqLnRoZW4gY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nO1xufVxudmFyIFZlcnNpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmVyc2lvbihmdWxsKSB7XG4gICAgICAgIHRoaXMuZnVsbCA9IGZ1bGw7XG4gICAgICAgIHZhciBzcGxpdHMgPSBmdWxsLnNwbGl0KCcuJyk7XG4gICAgICAgIHRoaXMubWFqb3IgPSBzcGxpdHNbMF07XG4gICAgICAgIHRoaXMubWlub3IgPSBzcGxpdHNbMV07XG4gICAgICAgIHRoaXMucGF0Y2ggPSBzcGxpdHMuc2xpY2UoMikuam9pbignLicpO1xuICAgIH1cbiAgICByZXR1cm4gVmVyc2lvbjtcbn0oKSk7XG52YXIgX193aW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c7XG52YXIgX19zZWxmID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiYgc2VsZjtcbnZhciBfX2dsb2JhbCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbDtcbi8vIENoZWNrIF9fZ2xvYmFsIGZpcnN0LCBiZWNhdXNlIGluIE5vZGUgdGVzdHMgYm90aCBfX2dsb2JhbCBhbmQgX193aW5kb3cgbWF5IGJlIGRlZmluZWQgYW5kIF9nbG9iYWxcbi8vIHNob3VsZCBiZSBfX2dsb2JhbCBpbiB0aGF0IGNhc2UuXG52YXIgX2dsb2JhbCA9IF9fZ2xvYmFsIHx8IF9fd2luZG93IHx8IF9fc2VsZjtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIENPTlNUQU5UX1BSRUZJWCA9ICdfYyc7XG4vKipcbiAqIENvbnRleHQgdG8gdXNlIHdoZW4gcHJvZHVjaW5nIGEga2V5LlxuICpcbiAqIFRoaXMgZW5zdXJlcyB3ZSBzZWUgdGhlIGNvbnN0YW50IG5vdCB0aGUgcmVmZXJlbmNlIHZhcmlhYmxlIHdoZW4gcHJvZHVjaW5nXG4gKiBhIGtleS5cbiAqL1xudmFyIEtFWV9DT05URVhUID0ge307XG4vKipcbiAqIEEgbm9kZSB0aGF0IGlzIGEgcGxhY2UtaG9sZGVyIHRoYXQgYWxsb3dzIHRoZSBub2RlIHRvIGJlIHJlcGxhY2VkIHdoZW4gdGhlIGFjdHVhbFxuICogbm9kZSBpcyBrbm93bi5cbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgY29uc3RhbnQgcG9vbCB0byBjaGFuZ2UgYW4gZXhwcmVzc2lvbiBmcm9tIGEgZGlyZWN0IHJlZmVyZW5jZSB0b1xuICogYSBjb25zdGFudCB0byBhIHNoYXJlZCBjb25zdGFudC4gSXQgcmV0dXJucyBhIGZpeC11cCBub2RlIHRoYXQgaXMgbGF0ZXIgYWxsb3dlZCB0b1xuICogY2hhbmdlIHRoZSByZWZlcmVuY2VkIGV4cHJlc3Npb24uXG4gKi9cbnZhciBGaXh1cEV4cHJlc3Npb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZpeHVwRXhwcmVzc2lvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGaXh1cEV4cHJlc3Npb24ocmVzb2x2ZWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcmVzb2x2ZWQudHlwZSkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVzb2x2ZWQgPSByZXNvbHZlZDtcbiAgICAgICAgX3RoaXMub3JpZ2luYWwgPSByZXNvbHZlZDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBGaXh1cEV4cHJlc3Npb24ucHJvdG90eXBlLnZpc2l0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSBLRVlfQ09OVEVYVCkge1xuICAgICAgICAgICAgLy8gV2hlbiBwcm9kdWNpbmcgYSBrZXkgd2Ugd2FudCB0byB0cmF2ZXJzZSB0aGUgY29uc3RhbnQgbm90IHRoZVxuICAgICAgICAgICAgLy8gdmFyaWFibGUgdXNlZCB0byByZWZlciB0byBpdC5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsLnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVkLnZpc2l0RXhwcmVzc2lvbih2aXNpdG9yLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRml4dXBFeHByZXNzaW9uLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEZpeHVwRXhwcmVzc2lvbiAmJiB0aGlzLnJlc29sdmVkLmlzRXF1aXZhbGVudChlLnJlc29sdmVkKTtcbiAgICB9O1xuICAgIEZpeHVwRXhwcmVzc2lvbi5wcm90b3R5cGUuaXNDb25zdGFudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgRml4dXBFeHByZXNzaW9uLnByb3RvdHlwZS5maXh1cCA9IGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWQgPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnNoYXJlZCA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gRml4dXBFeHByZXNzaW9uO1xufShFeHByZXNzaW9uKSk7XG4vKipcbiAqIEEgY29uc3RhbnQgcG9vbCBhbGxvd3MgYSBjb2RlIGVtaXR0ZXIgdG8gc2hhcmUgY29uc3RhbnQgaW4gYW4gb3V0cHV0IGNvbnRleHQuXG4gKlxuICogVGhlIGNvbnN0YW50IHBvb2wgYWxzbyBzdXBwb3J0cyBzaGFyaW5nIGFjY2VzcyB0byBpdnkgZGVmaW5pdGlvbnMgcmVmZXJlbmNlcy5cbiAqL1xudmFyIENvbnN0YW50UG9vbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zdGFudFBvb2woKSB7XG4gICAgICAgIHRoaXMuc3RhdGVtZW50cyA9IFtdO1xuICAgICAgICB0aGlzLmxpdGVyYWxzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmxpdGVyYWxGYWN0b3JpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuaW5qZWN0b3JEZWZpbml0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVEZWZpbml0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnREZWZpbml0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5waXBlRGVmaW5pdGlvbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMubmV4dE5hbWVJbmRleCA9IDA7XG4gICAgfVxuICAgIENvbnN0YW50UG9vbC5wcm90b3R5cGUuZ2V0Q29uc3RMaXRlcmFsID0gZnVuY3Rpb24gKGxpdGVyYWwsIGZvcmNlU2hhcmVkKSB7XG4gICAgICAgIGlmIChsaXRlcmFsIGluc3RhbmNlb2YgTGl0ZXJhbEV4cHIgfHwgbGl0ZXJhbCBpbnN0YW5jZW9mIEZpeHVwRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgLy8gRG8gbm8gcHV0IHNpbXBsZSBsaXRlcmFscyBpbnRvIHRoZSBjb25zdGFudCBwb29sIG9yIHRyeSB0byBwcm9kdWNlIGEgY29uc3RhbnQgZm9yIGFcbiAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byBhIGNvbnN0YW50LlxuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IHRoaXMua2V5T2YobGl0ZXJhbCk7XG4gICAgICAgIHZhciBmaXh1cCA9IHRoaXMubGl0ZXJhbHMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGZhbHNlO1xuICAgICAgICBpZiAoIWZpeHVwKSB7XG4gICAgICAgICAgICBmaXh1cCA9IG5ldyBGaXh1cEV4cHJlc3Npb24obGl0ZXJhbCk7XG4gICAgICAgICAgICB0aGlzLmxpdGVyYWxzLnNldChrZXksIGZpeHVwKTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCFuZXdWYWx1ZSAmJiAhZml4dXAuc2hhcmVkKSB8fCAobmV3VmFsdWUgJiYgZm9yY2VTaGFyZWQpKSB7XG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBleHByZXNzaW9uIHdpdGggYSB2YXJpYWJsZVxuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHRoaXMuZnJlc2hOYW1lKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlbWVudHMucHVzaCh2YXJpYWJsZShuYW1lXzEpLnNldChsaXRlcmFsKS50b0RlY2xTdG10KElORkVSUkVEX1RZUEUsIFtTdG10TW9kaWZpZXIuRmluYWxdKSk7XG4gICAgICAgICAgICBmaXh1cC5maXh1cCh2YXJpYWJsZShuYW1lXzEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZml4dXA7XG4gICAgfTtcbiAgICBDb25zdGFudFBvb2wucHJvdG90eXBlLmdldERlZmluaXRpb24gPSBmdW5jdGlvbiAodHlwZSwga2luZCwgY3R4LCBmb3JjZVNoYXJlZCkge1xuICAgICAgICBpZiAoZm9yY2VTaGFyZWQgPT09IHZvaWQgMCkgeyBmb3JjZVNoYXJlZCA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBkZWZpbml0aW9ucyA9IHRoaXMuZGVmaW5pdGlvbnNPZihraW5kKTtcbiAgICAgICAgdmFyIGZpeHVwID0gZGVmaW5pdGlvbnMuZ2V0KHR5cGUpO1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFmaXh1cCkge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0eU5hbWVPZihraW5kKTtcbiAgICAgICAgICAgIGZpeHVwID0gbmV3IEZpeHVwRXhwcmVzc2lvbihjdHguaW1wb3J0RXhwcih0eXBlKS5wcm9wKHByb3BlcnR5KSk7XG4gICAgICAgICAgICBkZWZpbml0aW9ucy5zZXQodHlwZSwgZml4dXApO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIW5ld1ZhbHVlICYmICFmaXh1cC5zaGFyZWQpIHx8IChuZXdWYWx1ZSAmJiBmb3JjZVNoYXJlZCkpIHtcbiAgICAgICAgICAgIHZhciBuYW1lXzIgPSB0aGlzLmZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2godmFyaWFibGUobmFtZV8yKS5zZXQoZml4dXAucmVzb2x2ZWQpLnRvRGVjbFN0bXQoSU5GRVJSRURfVFlQRSwgW1N0bXRNb2RpZmllci5GaW5hbF0pKTtcbiAgICAgICAgICAgIGZpeHVwLmZpeHVwKHZhcmlhYmxlKG5hbWVfMikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXh1cDtcbiAgICB9O1xuICAgIENvbnN0YW50UG9vbC5wcm90b3R5cGUuZ2V0TGl0ZXJhbEZhY3RvcnkgPSBmdW5jdGlvbiAobGl0ZXJhbCQxKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHB1cmUgZnVuY3Rpb24gdGhhdCBidWlsZHMgYW4gYXJyYXkgb2YgYSBtaXggb2YgY29uc3RhbnQgIGFuZCB2YXJpYWJsZSBleHByZXNzaW9uc1xuICAgICAgICBpZiAobGl0ZXJhbCQxIGluc3RhbmNlb2YgTGl0ZXJhbEFycmF5RXhwcikge1xuICAgICAgICAgICAgdmFyIGFyZ3VtZW50c0ZvcktleSA9IGxpdGVyYWwkMS5lbnRyaWVzLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5pc0NvbnN0YW50KCkgPyBlIDogbGl0ZXJhbChudWxsKTsgfSk7XG4gICAgICAgICAgICB2YXIga2V5ID0gdGhpcy5rZXlPZihsaXRlcmFsQXJyKGFyZ3VtZW50c0ZvcktleSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldExpdGVyYWxGYWN0b3J5KGtleSwgbGl0ZXJhbCQxLmVudHJpZXMsIGZ1bmN0aW9uIChlbnRyaWVzKSB7IHJldHVybiBsaXRlcmFsQXJyKGVudHJpZXMpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBleHByZXNzaW9uRm9yS2V5ID0gbGl0ZXJhbE1hcChsaXRlcmFsJDEuZW50cmllcy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAga2V5OiBlLmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZS52YWx1ZS5pc0NvbnN0YW50KCkgPyBlLnZhbHVlIDogbGl0ZXJhbChudWxsKSxcbiAgICAgICAgICAgICAgICBxdW90ZWQ6IGUucXVvdGVkXG4gICAgICAgICAgICB9KTsgfSkpO1xuICAgICAgICAgICAgdmFyIGtleSA9IHRoaXMua2V5T2YoZXhwcmVzc2lvbkZvcktleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGl0ZXJhbEZhY3Rvcnkoa2V5LCBsaXRlcmFsJDEuZW50cmllcy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUudmFsdWU7IH0pLCBmdW5jdGlvbiAoZW50cmllcykgeyByZXR1cm4gbGl0ZXJhbE1hcChlbnRyaWVzLm1hcChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgIGtleTogbGl0ZXJhbCQxLmVudHJpZXNbaW5kZXhdLmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgcXVvdGVkOiBsaXRlcmFsJDEuZW50cmllc1tpbmRleF0ucXVvdGVkXG4gICAgICAgICAgICB9KTsgfSkpOyB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29uc3RhbnRQb29sLnByb3RvdHlwZS5fZ2V0TGl0ZXJhbEZhY3RvcnkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZXMsIHJlc3VsdE1hcCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbGl0ZXJhbEZhY3RvcnkgPSB0aGlzLmxpdGVyYWxGYWN0b3JpZXMuZ2V0KGtleSk7XG4gICAgICAgIHZhciBsaXRlcmFsRmFjdG9yeUFyZ3VtZW50cyA9IHZhbHVlcy5maWx0ZXIoKGZ1bmN0aW9uIChlKSB7IHJldHVybiAhZS5pc0NvbnN0YW50KCk7IH0pKTtcbiAgICAgICAgaWYgKCFsaXRlcmFsRmFjdG9yeSkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdEV4cHJlc3Npb25zID0gdmFsdWVzLm1hcChmdW5jdGlvbiAoZSwgaW5kZXgpIHsgcmV0dXJuIGUuaXNDb25zdGFudCgpID8gX3RoaXMuZ2V0Q29uc3RMaXRlcmFsKGUsIHRydWUpIDogdmFyaWFibGUoXCJhXCIgKyBpbmRleCk7IH0pO1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSByZXN1bHRFeHByZXNzaW9ucy5maWx0ZXIoaXNWYXJpYWJsZSkubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBuZXcgRm5QYXJhbShlLm5hbWUsIERZTkFNSUNfVFlQRSk7IH0pO1xuICAgICAgICAgICAgdmFyIHB1cmVGdW5jdGlvbkRlY2xhcmF0aW9uID0gZm4ocGFyYW1ldGVycywgW25ldyBSZXR1cm5TdGF0ZW1lbnQocmVzdWx0TWFwKHJlc3VsdEV4cHJlc3Npb25zKSldLCBJTkZFUlJFRF9UWVBFKTtcbiAgICAgICAgICAgIHZhciBuYW1lXzMgPSB0aGlzLmZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5zdGF0ZW1lbnRzLnB1c2godmFyaWFibGUobmFtZV8zKS5zZXQocHVyZUZ1bmN0aW9uRGVjbGFyYXRpb24pLnRvRGVjbFN0bXQoSU5GRVJSRURfVFlQRSwgW1xuICAgICAgICAgICAgICAgIFN0bXRNb2RpZmllci5GaW5hbFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICAgICAgbGl0ZXJhbEZhY3RvcnkgPSB2YXJpYWJsZShuYW1lXzMpO1xuICAgICAgICAgICAgdGhpcy5saXRlcmFsRmFjdG9yaWVzLnNldChrZXksIGxpdGVyYWxGYWN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaXRlcmFsRmFjdG9yeTogbGl0ZXJhbEZhY3RvcnksIGxpdGVyYWxGYWN0b3J5QXJndW1lbnRzOiBsaXRlcmFsRmFjdG9yeUFyZ3VtZW50cyB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJvZHVjZSBhIHVuaXF1ZSBuYW1lLlxuICAgICAqXG4gICAgICogVGhlIG5hbWUgbWlnaHQgYmUgdW5pcXVlIGFtb25nIGRpZmZlcmVudCBwcmVmaXhlcyBpZiBhbnkgb2YgdGhlIHByZWZpeGVzIGVuZCBpblxuICAgICAqIGEgZGlnaXQgc28gdGhlIHByZWZpeCBzaG91bGQgYmUgYSBjb25zdGFudCBzdHJpbmcgKG5vdCBiYXNlZCBvbiB1c2VyIGlucHV0KSBhbmRcbiAgICAgKiBtdXN0IG5vdCBlbmQgaW4gYSBkaWdpdC5cbiAgICAgKi9cbiAgICBDb25zdGFudFBvb2wucHJvdG90eXBlLnVuaXF1ZU5hbWUgPSBmdW5jdGlvbiAocHJlZml4KSB7IHJldHVybiBcIlwiICsgcHJlZml4ICsgdGhpcy5uZXh0TmFtZUluZGV4Kys7IH07XG4gICAgQ29uc3RhbnRQb29sLnByb3RvdHlwZS5kZWZpbml0aW9uc09mID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIDIgLyogQ29tcG9uZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudERlZmluaXRpb25zO1xuICAgICAgICAgICAgY2FzZSAxIC8qIERpcmVjdGl2ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVEZWZpbml0aW9ucztcbiAgICAgICAgICAgIGNhc2UgMCAvKiBJbmplY3RvciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RvckRlZmluaXRpb25zO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFBpcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGlwZURlZmluaXRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKFwiVW5rbm93biBkZWZpbml0aW9uIGtpbmQgXCIgKyBraW5kKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbnM7XG4gICAgfTtcbiAgICBDb25zdGFudFBvb2wucHJvdG90eXBlLnByb3BlcnR5TmFtZU9mID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIDIgLyogQ29tcG9uZW50ICovOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbmdDb21wb25lbnREZWYnO1xuICAgICAgICAgICAgY2FzZSAxIC8qIERpcmVjdGl2ZSAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25nRGlyZWN0aXZlRGVmJztcbiAgICAgICAgICAgIGNhc2UgMCAvKiBJbmplY3RvciAqLzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25nSW5qZWN0b3JEZWYnO1xuICAgICAgICAgICAgY2FzZSAzIC8qIFBpcGUgKi86XG4gICAgICAgICAgICAgICAgcmV0dXJuICduZ1BpcGVEZWYnO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yKFwiVW5rbm93biBkZWZpbml0aW9uIGtpbmQgXCIgKyBraW5kKTtcbiAgICAgICAgcmV0dXJuICc8dW5rbm93bj4nO1xuICAgIH07XG4gICAgQ29uc3RhbnRQb29sLnByb3RvdHlwZS5mcmVzaE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnVuaXF1ZU5hbWUoQ09OU1RBTlRfUFJFRklYKTsgfTtcbiAgICBDb25zdGFudFBvb2wucHJvdG90eXBlLmtleU9mID0gZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmlzaXRFeHByZXNzaW9uKG5ldyBLZXlWaXNpdG9yKCksIEtFWV9DT05URVhUKTtcbiAgICB9O1xuICAgIHJldHVybiBDb25zdGFudFBvb2w7XG59KCkpO1xuLyoqXG4gKiBWaXNpdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIDIgZXhwcmVzc2lvbnMgYXJlIGVxdWl2YWxlbnQgYW5kIGNhbiBiZSBzaGFyZWQgaW4gdGhlXG4gKiBgQ29uc3RhbnRQb29sYC5cbiAqXG4gKiBXaGVuIHRoZSBpZCAoc3RyaW5nKSBnZW5lcmF0ZWQgYnkgdGhlIHZpc2l0b3IgaXMgZXF1YWwsIGV4cHJlc3Npb25zIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuXG4gKi9cbnZhciBLZXlWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEtleVZpc2l0b3IoKSB7XG4gICAgICAgIHRoaXMudmlzaXRXcmFwcGVkTm9kZUV4cHIgPSBpbnZhbGlkO1xuICAgICAgICB0aGlzLnZpc2l0V3JpdGVWYXJFeHByID0gaW52YWxpZDtcbiAgICAgICAgdGhpcy52aXNpdFdyaXRlS2V5RXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRXcml0ZVByb3BFeHByID0gaW52YWxpZDtcbiAgICAgICAgdGhpcy52aXNpdEludm9rZU1ldGhvZEV4cHIgPSBpbnZhbGlkO1xuICAgICAgICB0aGlzLnZpc2l0SW52b2tlRnVuY3Rpb25FeHByID0gaW52YWxpZDtcbiAgICAgICAgdGhpcy52aXNpdEluc3RhbnRpYXRlRXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRDb25kaXRpb25hbEV4cHIgPSBpbnZhbGlkO1xuICAgICAgICB0aGlzLnZpc2l0Tm90RXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRBc3NlcnROb3ROdWxsRXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRDYXN0RXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRGdW5jdGlvbkV4cHIgPSBpbnZhbGlkO1xuICAgICAgICB0aGlzLnZpc2l0QmluYXJ5T3BlcmF0b3JFeHByID0gaW52YWxpZDtcbiAgICAgICAgdGhpcy52aXNpdFJlYWRQcm9wRXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRSZWFkS2V5RXhwciA9IGludmFsaWQ7XG4gICAgICAgIHRoaXMudmlzaXRDb21tYUV4cHIgPSBpbnZhbGlkO1xuICAgIH1cbiAgICBLZXlWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICByZXR1cm4gXCJcIiArICh0eXBlb2YgYXN0LnZhbHVlID09PSAnc3RyaW5nJyA/ICdcIicgKyBhc3QudmFsdWUgKyAnXCInIDogYXN0LnZhbHVlKTtcbiAgICB9O1xuICAgIEtleVZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFwiW1wiICsgYXN0LmVudHJpZXMubWFwKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnkudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjb250ZXh0KTsgfSkuam9pbignLCcpICsgXCJdXCI7XG4gICAgfTtcbiAgICBLZXlWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxNYXBFeHByID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbWFwS2V5ID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICB2YXIgcXVvdGUgPSBlbnRyeS5xdW90ZWQgPyAnXCInIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gXCJcIiArIHF1b3RlICsgZW50cnkua2V5ICsgcXVvdGU7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBtYXBFbnRyeSA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcEtleShlbnRyeSkgKyBcIjpcIiArIGVudHJ5LnZhbHVlLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY29udGV4dCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBcIntcIiArIGFzdC5lbnRyaWVzLm1hcChtYXBFbnRyeSkuam9pbignLCcpO1xuICAgIH07XG4gICAgS2V5VmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHRlcm5hbEV4cHIgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgIHJldHVybiBhc3QudmFsdWUubW9kdWxlTmFtZSA/IFwiRVg6XCIgKyBhc3QudmFsdWUubW9kdWxlTmFtZSArIFwiOlwiICsgYXN0LnZhbHVlLm5hbWUgOlxuICAgICAgICAgICAgXCJFWDpcIiArIGFzdC52YWx1ZS5ydW50aW1lLm5hbWU7XG4gICAgfTtcbiAgICBLZXlWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIFwiVkFSOlwiICsgbm9kZS5uYW1lOyB9O1xuICAgIEtleVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHlwZW9mRXhwciA9IGZ1bmN0aW9uIChub2RlLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBcIlRZUEVPRjpcIiArIG5vZGUuZXhwci52aXNpdEV4cHJlc3Npb24odGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gS2V5VmlzaXRvcjtcbn0oKSk7XG5mdW5jdGlvbiBpbnZhbGlkKGFyZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RhdGU6IFZpc2l0b3IgXCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBkb2Vzbid0IGhhbmRsZSBcIiArIGFyZy5jb25zdHJ1Y3Rvci5uYW1lKTtcbn1cbmZ1bmN0aW9uIGlzVmFyaWFibGUoZSkge1xuICAgIHJldHVybiBlIGluc3RhbmNlb2YgUmVhZFZhckV4cHI7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBDT1JFID0gJ0Bhbmd1bGFyL2NvcmUnO1xudmFyIElkZW50aWZpZXJzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIElkZW50aWZpZXJzKCkge1xuICAgIH1cbiAgICBJZGVudGlmaWVycy5BTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0ge1xuICAgICAgICBuYW1lOiAnQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUycsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUsXG4gICAgfTtcbiAgICBJZGVudGlmaWVycy5FbGVtZW50UmVmID0geyBuYW1lOiAnRWxlbWVudFJlZicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5OZ01vZHVsZVJlZiA9IHsgbmFtZTogJ05nTW9kdWxlUmVmJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYgPSB7IG5hbWU6ICdWaWV3Q29udGFpbmVyUmVmJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLkNoYW5nZURldGVjdG9yUmVmID0ge1xuICAgICAgICBuYW1lOiAnQ2hhbmdlRGV0ZWN0b3JSZWYnLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuUXVlcnlMaXN0ID0geyBuYW1lOiAnUXVlcnlMaXN0JywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLlRlbXBsYXRlUmVmID0geyBuYW1lOiAnVGVtcGxhdGVSZWYnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMuUmVuZGVyZXIyID0geyBuYW1lOiAnUmVuZGVyZXIyJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLkNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSB7XG4gICAgICAgIG5hbWU6ICfJtUNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXInLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0ge1xuICAgICAgICBuYW1lOiAnQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnkgPSB7IG5hbWU6ICdDb21wb25lbnRGYWN0b3J5JywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLkNvbXBvbmVudFJlZiA9IHsgbmFtZTogJ0NvbXBvbmVudFJlZicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5OZ01vZHVsZUZhY3RvcnkgPSB7IG5hbWU6ICdOZ01vZHVsZUZhY3RvcnknLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMuY3JlYXRlTW9kdWxlRmFjdG9yeSA9IHtcbiAgICAgICAgbmFtZTogJ8m1Y21mJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLm1vZHVsZURlZiA9IHtcbiAgICAgICAgbmFtZTogJ8m1bW9kJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLm1vZHVsZVByb3ZpZGVyRGVmID0ge1xuICAgICAgICBuYW1lOiAnybVtcGQnLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuUmVnaXN0ZXJNb2R1bGVGYWN0b3J5Rm4gPSB7XG4gICAgICAgIG5hbWU6ICfJtXJlZ2lzdGVyTW9kdWxlRmFjdG9yeScsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUsXG4gICAgfTtcbiAgICBJZGVudGlmaWVycy5pbmplY3QgPSB7IG5hbWU6ICfJtcm1aW5qZWN0JywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLklOSkVDVE9SID0geyBuYW1lOiAnSU5KRUNUT1InLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMuSW5qZWN0b3IgPSB7IG5hbWU6ICdJbmplY3RvcicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy7Jtcm1ZGVmaW5lSW5qZWN0YWJsZSA9IHsgbmFtZTogJ8m1ybVkZWZpbmVJbmplY3RhYmxlJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLkluamVjdGFibGVEZWYgPSB7IG5hbWU6ICfJtcm1SW5qZWN0YWJsZURlZicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5WaWV3RW5jYXBzdWxhdGlvbiA9IHtcbiAgICAgICAgbmFtZTogJ1ZpZXdFbmNhcHN1bGF0aW9uJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLkNoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0ge1xuICAgICAgICBuYW1lOiAnQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3knLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuU2VjdXJpdHlDb250ZXh0ID0ge1xuICAgICAgICBuYW1lOiAnU2VjdXJpdHlDb250ZXh0JyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLkxPQ0FMRV9JRCA9IHsgbmFtZTogJ0xPQ0FMRV9JRCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5UUkFOU0xBVElPTlNfRk9STUFUID0ge1xuICAgICAgICBuYW1lOiAnVFJBTlNMQVRJT05TX0ZPUk1BVCcsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUsXG4gICAgfTtcbiAgICBJZGVudGlmaWVycy5pbmxpbmVJbnRlcnBvbGF0ZSA9IHtcbiAgICAgICAgbmFtZTogJ8m1aW5saW5lSW50ZXJwb2xhdGUnLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuaW50ZXJwb2xhdGUgPSB7IG5hbWU6ICfJtWludGVycG9sYXRlJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLkVNUFRZX0FSUkFZID0geyBuYW1lOiAnybVFTVBUWV9BUlJBWScsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5FTVBUWV9NQVAgPSB7IG5hbWU6ICfJtUVNUFRZX01BUCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5SZW5kZXJlciA9IHsgbmFtZTogJ1JlbmRlcmVyJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLnZpZXdEZWYgPSB7IG5hbWU6ICfJtXZpZCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50RGVmID0geyBuYW1lOiAnybVlbGQnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMuYW5jaG9yRGVmID0geyBuYW1lOiAnybVhbmQnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMudGV4dERlZiA9IHsgbmFtZTogJ8m1dGVkJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLmRpcmVjdGl2ZURlZiA9IHsgbmFtZTogJ8m1ZGlkJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIElkZW50aWZpZXJzLnByb3ZpZGVyRGVmID0geyBuYW1lOiAnybVwcmQnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMucXVlcnlEZWYgPSB7IG5hbWU6ICfJtXF1ZCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlQXJyYXlEZWYgPSB7IG5hbWU6ICfJtXBhZCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlT2JqZWN0RGVmID0geyBuYW1lOiAnybVwb2QnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMucHVyZVBpcGVEZWYgPSB7IG5hbWU6ICfJtXBwZCcsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5waXBlRGVmID0geyBuYW1lOiAnybVwaWQnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMubm9kZVZhbHVlID0geyBuYW1lOiAnybVub3YnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMubmdDb250ZW50RGVmID0geyBuYW1lOiAnybVuY2QnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgSWRlbnRpZmllcnMudW53cmFwVmFsdWUgPSB7IG5hbWU6ICfJtXVudicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5jcmVhdGVSZW5kZXJlclR5cGUyID0geyBuYW1lOiAnybVjcnQnLCBtb2R1bGVOYW1lOiBDT1JFIH07XG4gICAgLy8gdHlwZSBvbmx5XG4gICAgSWRlbnRpZmllcnMuUmVuZGVyZXJUeXBlMiA9IHtcbiAgICAgICAgbmFtZTogJ1JlbmRlcmVyVHlwZTInLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFLFxuICAgIH07XG4gICAgLy8gdHlwZSBvbmx5XG4gICAgSWRlbnRpZmllcnMuVmlld0RlZmluaXRpb24gPSB7XG4gICAgICAgIG5hbWU6ICfJtVZpZXdEZWZpbml0aW9uJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLmNyZWF0ZUNvbXBvbmVudEZhY3RvcnkgPSB7IG5hbWU6ICfJtWNjZicsIG1vZHVsZU5hbWU6IENPUkUgfTtcbiAgICBJZGVudGlmaWVycy5zZXRDbGFzc01ldGFkYXRhID0geyBuYW1lOiAnybVzZXRDbGFzc01ldGFkYXRhJywgbW9kdWxlTmFtZTogQ09SRSB9O1xuICAgIHJldHVybiBJZGVudGlmaWVycztcbn0oKSk7XG5mdW5jdGlvbiBjcmVhdGVUb2tlbkZvclJlZmVyZW5jZShyZWZlcmVuY2UpIHtcbiAgICByZXR1cm4geyBpZGVudGlmaWVyOiB7IHJlZmVyZW5jZTogcmVmZXJlbmNlIH0gfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRva2VuRm9yRXh0ZXJuYWxSZWZlcmVuY2UocmVmbGVjdG9yLCByZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gY3JlYXRlVG9rZW5Gb3JSZWZlcmVuY2UocmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShyZWZlcmVuY2UpKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIHRva2VuIHJlcHJlc2VudGluZyB0aGUgYSByZWZlcmVuY2UgdG8gYSBzdGF0aWMgdHlwZS5cbiAqXG4gKiBUaGlzIHRva2VuIGlzIHVuaXF1ZSBmb3IgYSBmaWxlUGF0aCBhbmQgbmFtZSBhbmQgY2FuIGJlIHVzZWQgYXMgYSBoYXNoIHRhYmxlIGtleS5cbiAqL1xudmFyIFN0YXRpY1N5bWJvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdGF0aWNTeW1ib2woZmlsZVBhdGgsIG5hbWUsIG1lbWJlcnMpIHtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzO1xuICAgIH1cbiAgICBTdGF0aWNTeW1ib2wucHJvdG90eXBlLmFzc2VydE5vTWVtYmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubWVtYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgc3RhdGU6IHN5bWJvbCB3aXRob3V0IG1lbWJlcnMgZXhwZWN0ZWQsIGJ1dCBnb3QgXCIgKyBKU09OLnN0cmluZ2lmeSh0aGlzKSArIFwiLlwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFN0YXRpY1N5bWJvbDtcbn0oKSk7XG4vKipcbiAqIEEgY2FjaGUgb2Ygc3RhdGljIHN5bWJvbCB1c2VkIGJ5IHRoZSBTdGF0aWNSZWZsZWN0b3IgdG8gcmV0dXJuIHRoZSBzYW1lIHN5bWJvbCBmb3IgdGhlXG4gKiBzYW1lIHN5bWJvbCB2YWx1ZXMuXG4gKi9cbnZhciBTdGF0aWNTeW1ib2xDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdGF0aWNTeW1ib2xDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgU3RhdGljU3ltYm9sQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChkZWNsYXJhdGlvbkZpbGUsIG5hbWUsIG1lbWJlcnMpIHtcbiAgICAgICAgbWVtYmVycyA9IG1lbWJlcnMgfHwgW107XG4gICAgICAgIHZhciBtZW1iZXJTdWZmaXggPSBtZW1iZXJzLmxlbmd0aCA/IFwiLlwiICsgbWVtYmVycy5qb2luKCcuJykgOiAnJztcbiAgICAgICAgdmFyIGtleSA9IFwiXFxcIlwiICsgZGVjbGFyYXRpb25GaWxlICsgXCJcXFwiLlwiICsgbmFtZSArIG1lbWJlclN1ZmZpeDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RhdGljU3ltYm9sKGRlY2xhcmF0aW9uRmlsZSwgbmFtZSwgbWVtYmVycyk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBTdGF0aWNTeW1ib2xDYWNoZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIGdyb3VwIDA6IFwiW3Byb3BdIG9yIChldmVudCkgb3IgQHRyaWdnZXJcIlxuLy8gZ3JvdXAgMTogXCJwcm9wXCIgZnJvbSBcIltwcm9wXVwiXG4vLyBncm91cCAyOiBcImV2ZW50XCIgZnJvbSBcIihldmVudClcIlxuLy8gZ3JvdXAgMzogXCJAdHJpZ2dlclwiIGZyb20gXCJAdHJpZ2dlclwiXG52YXIgSE9TVF9SRUdfRVhQID0gL14oPzooPzpcXFsoW15cXF1dKylcXF0pfCg/OlxcKChbXlxcKV0rKVxcKSkpfChcXEBbLVxcd10rKSQvO1xuZnVuY3Rpb24gc2FuaXRpemVJZGVudGlmaWVyKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9cXFcvZywgJ18nKTtcbn1cbnZhciBfYW5vbnltb3VzVHlwZUluZGV4ID0gMDtcbmZ1bmN0aW9uIGlkZW50aWZpZXJOYW1lKGNvbXBpbGVJZGVudGlmaWVyKSB7XG4gICAgaWYgKCFjb21waWxlSWRlbnRpZmllciB8fCAhY29tcGlsZUlkZW50aWZpZXIucmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgcmVmID0gY29tcGlsZUlkZW50aWZpZXIucmVmZXJlbmNlO1xuICAgIGlmIChyZWYgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHJlZi5uYW1lO1xuICAgIH1cbiAgICBpZiAocmVmWydfX2Fub255bW91c1R5cGUnXSkge1xuICAgICAgICByZXR1cm4gcmVmWydfX2Fub255bW91c1R5cGUnXTtcbiAgICB9XG4gICAgdmFyIGlkZW50aWZpZXIgPSBzdHJpbmdpZnkocmVmKTtcbiAgICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCcoJykgPj0gMCkge1xuICAgICAgICAvLyBjYXNlOiBhbm9ueW1vdXMgZnVuY3Rpb25zIVxuICAgICAgICBpZGVudGlmaWVyID0gXCJhbm9ueW1vdXNfXCIgKyBfYW5vbnltb3VzVHlwZUluZGV4Kys7XG4gICAgICAgIHJlZlsnX19hbm9ueW1vdXNUeXBlJ10gPSBpZGVudGlmaWVyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWRlbnRpZmllciA9IHNhbml0aXplSWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5mdW5jdGlvbiBpZGVudGlmaWVyTW9kdWxlVXJsKGNvbXBpbGVJZGVudGlmaWVyKSB7XG4gICAgdmFyIHJlZiA9IGNvbXBpbGVJZGVudGlmaWVyLnJlZmVyZW5jZTtcbiAgICBpZiAocmVmIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgIHJldHVybiByZWYuZmlsZVBhdGg7XG4gICAgfVxuICAgIC8vIFJ1bnRpbWUgdHlwZVxuICAgIHJldHVybiBcIi4vXCIgKyBzdHJpbmdpZnkocmVmKTtcbn1cbmZ1bmN0aW9uIHZpZXdDbGFzc05hbWUoY29tcFR5cGUsIGVtYmVkZGVkVGVtcGxhdGVJbmRleCkge1xuICAgIHJldHVybiBcIlZpZXdfXCIgKyBpZGVudGlmaWVyTmFtZSh7IHJlZmVyZW5jZTogY29tcFR5cGUgfSkgKyBcIl9cIiArIGVtYmVkZGVkVGVtcGxhdGVJbmRleDtcbn1cbmZ1bmN0aW9uIHJlbmRlcmVyVHlwZU5hbWUoY29tcFR5cGUpIHtcbiAgICByZXR1cm4gXCJSZW5kZXJUeXBlX1wiICsgaWRlbnRpZmllck5hbWUoeyByZWZlcmVuY2U6IGNvbXBUeXBlIH0pO1xufVxuZnVuY3Rpb24gaG9zdFZpZXdDbGFzc05hbWUoY29tcFR5cGUpIHtcbiAgICByZXR1cm4gXCJIb3N0Vmlld19cIiArIGlkZW50aWZpZXJOYW1lKHsgcmVmZXJlbmNlOiBjb21wVHlwZSB9KTtcbn1cbmZ1bmN0aW9uIGNvbXBvbmVudEZhY3RvcnlOYW1lKGNvbXBUeXBlKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXJOYW1lKHsgcmVmZXJlbmNlOiBjb21wVHlwZSB9KSArIFwiTmdGYWN0b3J5XCI7XG59XG52YXIgQ29tcGlsZVN1bW1hcnlLaW5kO1xuKGZ1bmN0aW9uIChDb21waWxlU3VtbWFyeUtpbmQpIHtcbiAgICBDb21waWxlU3VtbWFyeUtpbmRbQ29tcGlsZVN1bW1hcnlLaW5kW1wiUGlwZVwiXSA9IDBdID0gXCJQaXBlXCI7XG4gICAgQ29tcGlsZVN1bW1hcnlLaW5kW0NvbXBpbGVTdW1tYXJ5S2luZFtcIkRpcmVjdGl2ZVwiXSA9IDFdID0gXCJEaXJlY3RpdmVcIjtcbiAgICBDb21waWxlU3VtbWFyeUtpbmRbQ29tcGlsZVN1bW1hcnlLaW5kW1wiTmdNb2R1bGVcIl0gPSAyXSA9IFwiTmdNb2R1bGVcIjtcbiAgICBDb21waWxlU3VtbWFyeUtpbmRbQ29tcGlsZVN1bW1hcnlLaW5kW1wiSW5qZWN0YWJsZVwiXSA9IDNdID0gXCJJbmplY3RhYmxlXCI7XG59KShDb21waWxlU3VtbWFyeUtpbmQgfHwgKENvbXBpbGVTdW1tYXJ5S2luZCA9IHt9KSk7XG5mdW5jdGlvbiB0b2tlbk5hbWUodG9rZW4pIHtcbiAgICByZXR1cm4gdG9rZW4udmFsdWUgIT0gbnVsbCA/IHNhbml0aXplSWRlbnRpZmllcih0b2tlbi52YWx1ZSkgOiBpZGVudGlmaWVyTmFtZSh0b2tlbi5pZGVudGlmaWVyKTtcbn1cbmZ1bmN0aW9uIHRva2VuUmVmZXJlbmNlKHRva2VuKSB7XG4gICAgaWYgKHRva2VuLmlkZW50aWZpZXIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdG9rZW4uaWRlbnRpZmllci5yZWZlcmVuY2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW4udmFsdWU7XG4gICAgfVxufVxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCBhIHN0eWxlc2hlZXRcbiAqL1xudmFyIENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YShfYSkge1xuICAgICAgICB2YXIgX2IgPSBfYSA9PT0gdm9pZCAwID8ge30gOiBfYSwgbW9kdWxlVXJsID0gX2IubW9kdWxlVXJsLCBzdHlsZXMgPSBfYi5zdHlsZXMsIHN0eWxlVXJscyA9IF9iLnN0eWxlVXJscztcbiAgICAgICAgdGhpcy5tb2R1bGVVcmwgPSBtb2R1bGVVcmwgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZVVybHMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVVcmxzKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGE7XG59KCkpO1xuLyoqXG4gKiBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSB0ZW1wbGF0ZS5cbiAqL1xudmFyIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKF9hKSB7XG4gICAgICAgIHZhciBlbmNhcHN1bGF0aW9uID0gX2EuZW5jYXBzdWxhdGlvbiwgdGVtcGxhdGUgPSBfYS50ZW1wbGF0ZSwgdGVtcGxhdGVVcmwgPSBfYS50ZW1wbGF0ZVVybCwgaHRtbEFzdCA9IF9hLmh0bWxBc3QsIHN0eWxlcyA9IF9hLnN0eWxlcywgc3R5bGVVcmxzID0gX2Euc3R5bGVVcmxzLCBleHRlcm5hbFN0eWxlc2hlZXRzID0gX2EuZXh0ZXJuYWxTdHlsZXNoZWV0cywgYW5pbWF0aW9ucyA9IF9hLmFuaW1hdGlvbnMsIG5nQ29udGVudFNlbGVjdG9ycyA9IF9hLm5nQ29udGVudFNlbGVjdG9ycywgaW50ZXJwb2xhdGlvbiA9IF9hLmludGVycG9sYXRpb24sIGlzSW5saW5lID0gX2EuaXNJbmxpbmUsIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBfYS5wcmVzZXJ2ZVdoaXRlc3BhY2VzO1xuICAgICAgICB0aGlzLmVuY2Fwc3VsYXRpb24gPSBlbmNhcHN1bGF0aW9uO1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMudGVtcGxhdGVVcmwgPSB0ZW1wbGF0ZVVybDtcbiAgICAgICAgdGhpcy5odG1sQXN0ID0gaHRtbEFzdDtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVzKTtcbiAgICAgICAgdGhpcy5zdHlsZVVybHMgPSBfbm9ybWFsaXplQXJyYXkoc3R5bGVVcmxzKTtcbiAgICAgICAgdGhpcy5leHRlcm5hbFN0eWxlc2hlZXRzID0gX25vcm1hbGl6ZUFycmF5KGV4dGVybmFsU3R5bGVzaGVldHMpO1xuICAgICAgICB0aGlzLmFuaW1hdGlvbnMgPSBhbmltYXRpb25zID8gZmxhdHRlbihhbmltYXRpb25zKSA6IFtdO1xuICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9IG5nQ29udGVudFNlbGVjdG9ycyB8fCBbXTtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb24gJiYgaW50ZXJwb2xhdGlvbi5sZW5ndGggIT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2ludGVycG9sYXRpb24nIHNob3VsZCBoYXZlIGEgc3RhcnQgYW5kIGFuIGVuZCBzeW1ib2wuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG4gICAgICAgIHRoaXMuaXNJbmxpbmUgPSBpc0lubGluZTtcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZVdoaXRlc3BhY2VzID0gcHJlc2VydmVXaGl0ZXNwYWNlcztcbiAgICB9XG4gICAgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEucHJvdG90eXBlLnRvU3VtbWFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nQ29udGVudFNlbGVjdG9yczogdGhpcy5uZ0NvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmVuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgICBzdHlsZXM6IHRoaXMuc3R5bGVzLFxuICAgICAgICAgICAgYW5pbWF0aW9uczogdGhpcy5hbmltYXRpb25zXG4gICAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGE7XG59KCkpO1xuLyoqXG4gKiBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSBkaXJlY3RpdmUuXG4gKi9cbnZhciBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKF9hKSB7XG4gICAgICAgIHZhciBpc0hvc3QgPSBfYS5pc0hvc3QsIHR5cGUgPSBfYS50eXBlLCBpc0NvbXBvbmVudCA9IF9hLmlzQ29tcG9uZW50LCBzZWxlY3RvciA9IF9hLnNlbGVjdG9yLCBleHBvcnRBcyA9IF9hLmV4cG9ydEFzLCBjaGFuZ2VEZXRlY3Rpb24gPSBfYS5jaGFuZ2VEZXRlY3Rpb24sIGlucHV0cyA9IF9hLmlucHV0cywgb3V0cHV0cyA9IF9hLm91dHB1dHMsIGhvc3RMaXN0ZW5lcnMgPSBfYS5ob3N0TGlzdGVuZXJzLCBob3N0UHJvcGVydGllcyA9IF9hLmhvc3RQcm9wZXJ0aWVzLCBob3N0QXR0cmlidXRlcyA9IF9hLmhvc3RBdHRyaWJ1dGVzLCBwcm92aWRlcnMgPSBfYS5wcm92aWRlcnMsIHZpZXdQcm92aWRlcnMgPSBfYS52aWV3UHJvdmlkZXJzLCBxdWVyaWVzID0gX2EucXVlcmllcywgZ3VhcmRzID0gX2EuZ3VhcmRzLCB2aWV3UXVlcmllcyA9IF9hLnZpZXdRdWVyaWVzLCBlbnRyeUNvbXBvbmVudHMgPSBfYS5lbnRyeUNvbXBvbmVudHMsIHRlbXBsYXRlID0gX2EudGVtcGxhdGUsIGNvbXBvbmVudFZpZXdUeXBlID0gX2EuY29tcG9uZW50Vmlld1R5cGUsIHJlbmRlcmVyVHlwZSA9IF9hLnJlbmRlcmVyVHlwZSwgY29tcG9uZW50RmFjdG9yeSA9IF9hLmNvbXBvbmVudEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuaXNIb3N0ID0gISFpc0hvc3Q7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaXNDb21wb25lbnQgPSBpc0NvbXBvbmVudDtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICB0aGlzLmV4cG9ydEFzID0gZXhwb3J0QXM7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uID0gY2hhbmdlRGV0ZWN0aW9uO1xuICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgdGhpcy5ob3N0TGlzdGVuZXJzID0gaG9zdExpc3RlbmVycztcbiAgICAgICAgdGhpcy5ob3N0UHJvcGVydGllcyA9IGhvc3RQcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLmhvc3RBdHRyaWJ1dGVzID0gaG9zdEF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gX25vcm1hbGl6ZUFycmF5KHByb3ZpZGVycyk7XG4gICAgICAgIHRoaXMudmlld1Byb3ZpZGVycyA9IF9ub3JtYWxpemVBcnJheSh2aWV3UHJvdmlkZXJzKTtcbiAgICAgICAgdGhpcy5xdWVyaWVzID0gX25vcm1hbGl6ZUFycmF5KHF1ZXJpZXMpO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IGd1YXJkcztcbiAgICAgICAgdGhpcy52aWV3UXVlcmllcyA9IF9ub3JtYWxpemVBcnJheSh2aWV3UXVlcmllcyk7XG4gICAgICAgIHRoaXMuZW50cnlDb21wb25lbnRzID0gX25vcm1hbGl6ZUFycmF5KGVudHJ5Q29tcG9uZW50cyk7XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRWaWV3VHlwZSA9IGNvbXBvbmVudFZpZXdUeXBlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyVHlwZSA9IHJlbmRlcmVyVHlwZTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50RmFjdG9yeTtcbiAgICB9XG4gICAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSA9IGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgaXNIb3N0ID0gX2EuaXNIb3N0LCB0eXBlID0gX2EudHlwZSwgaXNDb21wb25lbnQgPSBfYS5pc0NvbXBvbmVudCwgc2VsZWN0b3IgPSBfYS5zZWxlY3RvciwgZXhwb3J0QXMgPSBfYS5leHBvcnRBcywgY2hhbmdlRGV0ZWN0aW9uID0gX2EuY2hhbmdlRGV0ZWN0aW9uLCBpbnB1dHMgPSBfYS5pbnB1dHMsIG91dHB1dHMgPSBfYS5vdXRwdXRzLCBob3N0ID0gX2EuaG9zdCwgcHJvdmlkZXJzID0gX2EucHJvdmlkZXJzLCB2aWV3UHJvdmlkZXJzID0gX2Eudmlld1Byb3ZpZGVycywgcXVlcmllcyA9IF9hLnF1ZXJpZXMsIGd1YXJkcyA9IF9hLmd1YXJkcywgdmlld1F1ZXJpZXMgPSBfYS52aWV3UXVlcmllcywgZW50cnlDb21wb25lbnRzID0gX2EuZW50cnlDb21wb25lbnRzLCB0ZW1wbGF0ZSA9IF9hLnRlbXBsYXRlLCBjb21wb25lbnRWaWV3VHlwZSA9IF9hLmNvbXBvbmVudFZpZXdUeXBlLCByZW5kZXJlclR5cGUgPSBfYS5yZW5kZXJlclR5cGUsIGNvbXBvbmVudEZhY3RvcnkgPSBfYS5jb21wb25lbnRGYWN0b3J5O1xuICAgICAgICB2YXIgaG9zdExpc3RlbmVycyA9IHt9O1xuICAgICAgICB2YXIgaG9zdFByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgdmFyIGhvc3RBdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGhvc3QpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGhvc3Rba2V5XTtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGtleS5tYXRjaChIT1NUX1JFR19FWFApO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hlc1sxXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzW21hdGNoZXNbMV1dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoZXNbMl0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzW21hdGNoZXNbMl1dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlucHV0c01hcCA9IHt9O1xuICAgICAgICBpZiAoaW5wdXRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IGVsUHJvcGBcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBgOmAsIHVzZSBkaXJQcm9wID0gZWxQcm9wXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gc3BsaXRBdENvbG9uKGJpbmRDb25maWcsIFtiaW5kQ29uZmlnLCBiaW5kQ29uZmlnXSk7XG4gICAgICAgICAgICAgICAgaW5wdXRzTWFwW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dHNNYXAgPSB7fTtcbiAgICAgICAgaWYgKG91dHB1dHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgb3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IGVsUHJvcGBcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBgOmAsIHVzZSBkaXJQcm9wID0gZWxQcm9wXG4gICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gc3BsaXRBdENvbG9uKGJpbmRDb25maWcsIFtiaW5kQ29uZmlnLCBiaW5kQ29uZmlnXSk7XG4gICAgICAgICAgICAgICAgb3V0cHV0c01hcFtwYXJ0c1swXV0gPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgIGlzSG9zdDogaXNIb3N0LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlzQ29tcG9uZW50OiAhIWlzQ29tcG9uZW50LCBzZWxlY3Rvcjogc2VsZWN0b3IsIGV4cG9ydEFzOiBleHBvcnRBcywgY2hhbmdlRGV0ZWN0aW9uOiBjaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgICAgICBpbnB1dHM6IGlucHV0c01hcCxcbiAgICAgICAgICAgIG91dHB1dHM6IG91dHB1dHNNYXAsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgaG9zdFByb3BlcnRpZXM6IGhvc3RQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgaG9zdEF0dHJpYnV0ZXM6IGhvc3RBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBwcm92aWRlcnMsXG4gICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiB2aWV3UHJvdmlkZXJzLFxuICAgICAgICAgICAgcXVlcmllczogcXVlcmllcyxcbiAgICAgICAgICAgIGd1YXJkczogZ3VhcmRzLFxuICAgICAgICAgICAgdmlld1F1ZXJpZXM6IHZpZXdRdWVyaWVzLFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBlbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgICAgICBjb21wb25lbnRWaWV3VHlwZTogY29tcG9uZW50Vmlld1R5cGUsXG4gICAgICAgICAgICByZW5kZXJlclR5cGU6IHJlbmRlcmVyVHlwZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3Rvcnk6IGNvbXBvbmVudEZhY3RvcnksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLnByb3RvdHlwZS50b1N1bW1hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdW1tYXJ5S2luZDogQ29tcGlsZVN1bW1hcnlLaW5kLkRpcmVjdGl2ZSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIGlzQ29tcG9uZW50OiB0aGlzLmlzQ29tcG9uZW50LFxuICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMuc2VsZWN0b3IsXG4gICAgICAgICAgICBleHBvcnRBczogdGhpcy5leHBvcnRBcyxcbiAgICAgICAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiB0aGlzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICBob3N0UHJvcGVydGllczogdGhpcy5ob3N0UHJvcGVydGllcyxcbiAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0aGlzLmhvc3RBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLnByb3ZpZGVycyxcbiAgICAgICAgICAgIHZpZXdQcm92aWRlcnM6IHRoaXMudmlld1Byb3ZpZGVycyxcbiAgICAgICAgICAgIHF1ZXJpZXM6IHRoaXMucXVlcmllcyxcbiAgICAgICAgICAgIGd1YXJkczogdGhpcy5ndWFyZHMsXG4gICAgICAgICAgICB2aWV3UXVlcmllczogdGhpcy52aWV3UXVlcmllcyxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5lbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHRoaXMuY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGUgJiYgdGhpcy50ZW1wbGF0ZS50b1N1bW1hcnkoKSxcbiAgICAgICAgICAgIGNvbXBvbmVudFZpZXdUeXBlOiB0aGlzLmNvbXBvbmVudFZpZXdUeXBlLFxuICAgICAgICAgICAgcmVuZGVyZXJUeXBlOiB0aGlzLnJlbmRlcmVyVHlwZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3Rvcnk6IHRoaXMuY29tcG9uZW50RmFjdG9yeVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YTtcbn0oKSk7XG52YXIgQ29tcGlsZVBpcGVNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlUGlwZU1ldGFkYXRhKF9hKSB7XG4gICAgICAgIHZhciB0eXBlID0gX2EudHlwZSwgbmFtZSA9IF9hLm5hbWUsIHB1cmUgPSBfYS5wdXJlO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnB1cmUgPSAhIXB1cmU7XG4gICAgfVxuICAgIENvbXBpbGVQaXBlTWV0YWRhdGEucHJvdG90eXBlLnRvU3VtbWFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1bW1hcnlLaW5kOiBDb21waWxlU3VtbWFyeUtpbmQuUGlwZSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHB1cmU6IHRoaXMucHVyZVxuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENvbXBpbGVQaXBlTWV0YWRhdGE7XG59KCkpO1xudmFyIENvbXBpbGVTaGFsbG93TW9kdWxlTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZVNoYWxsb3dNb2R1bGVNZXRhZGF0YSgpIHtcbiAgICB9XG4gICAgcmV0dXJuIENvbXBpbGVTaGFsbG93TW9kdWxlTWV0YWRhdGE7XG59KCkpO1xuLyoqXG4gKiBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSBtb2R1bGUuXG4gKi9cbnZhciBDb21waWxlTmdNb2R1bGVNZXRhZGF0YSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlTmdNb2R1bGVNZXRhZGF0YShfYSkge1xuICAgICAgICB2YXIgdHlwZSA9IF9hLnR5cGUsIHByb3ZpZGVycyA9IF9hLnByb3ZpZGVycywgZGVjbGFyZWREaXJlY3RpdmVzID0gX2EuZGVjbGFyZWREaXJlY3RpdmVzLCBleHBvcnRlZERpcmVjdGl2ZXMgPSBfYS5leHBvcnRlZERpcmVjdGl2ZXMsIGRlY2xhcmVkUGlwZXMgPSBfYS5kZWNsYXJlZFBpcGVzLCBleHBvcnRlZFBpcGVzID0gX2EuZXhwb3J0ZWRQaXBlcywgZW50cnlDb21wb25lbnRzID0gX2EuZW50cnlDb21wb25lbnRzLCBib290c3RyYXBDb21wb25lbnRzID0gX2EuYm9vdHN0cmFwQ29tcG9uZW50cywgaW1wb3J0ZWRNb2R1bGVzID0gX2EuaW1wb3J0ZWRNb2R1bGVzLCBleHBvcnRlZE1vZHVsZXMgPSBfYS5leHBvcnRlZE1vZHVsZXMsIHNjaGVtYXMgPSBfYS5zY2hlbWFzLCB0cmFuc2l0aXZlTW9kdWxlID0gX2EudHJhbnNpdGl2ZU1vZHVsZSwgaWQgPSBfYS5pZDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCBudWxsO1xuICAgICAgICB0aGlzLmRlY2xhcmVkRGlyZWN0aXZlcyA9IF9ub3JtYWxpemVBcnJheShkZWNsYXJlZERpcmVjdGl2ZXMpO1xuICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlcyA9IF9ub3JtYWxpemVBcnJheShleHBvcnRlZERpcmVjdGl2ZXMpO1xuICAgICAgICB0aGlzLmRlY2xhcmVkUGlwZXMgPSBfbm9ybWFsaXplQXJyYXkoZGVjbGFyZWRQaXBlcyk7XG4gICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlcyA9IF9ub3JtYWxpemVBcnJheShleHBvcnRlZFBpcGVzKTtcbiAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBfbm9ybWFsaXplQXJyYXkocHJvdmlkZXJzKTtcbiAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHMgPSBfbm9ybWFsaXplQXJyYXkoZW50cnlDb21wb25lbnRzKTtcbiAgICAgICAgdGhpcy5ib290c3RyYXBDb21wb25lbnRzID0gX25vcm1hbGl6ZUFycmF5KGJvb3RzdHJhcENvbXBvbmVudHMpO1xuICAgICAgICB0aGlzLmltcG9ydGVkTW9kdWxlcyA9IF9ub3JtYWxpemVBcnJheShpbXBvcnRlZE1vZHVsZXMpO1xuICAgICAgICB0aGlzLmV4cG9ydGVkTW9kdWxlcyA9IF9ub3JtYWxpemVBcnJheShleHBvcnRlZE1vZHVsZXMpO1xuICAgICAgICB0aGlzLnNjaGVtYXMgPSBfbm9ybWFsaXplQXJyYXkoc2NoZW1hcyk7XG4gICAgICAgIHRoaXMuaWQgPSBpZCB8fCBudWxsO1xuICAgICAgICB0aGlzLnRyYW5zaXRpdmVNb2R1bGUgPSB0cmFuc2l0aXZlTW9kdWxlIHx8IG51bGw7XG4gICAgfVxuICAgIENvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS50b1N1bW1hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSB0aGlzLnRyYW5zaXRpdmVNb2R1bGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdW1tYXJ5S2luZDogQ29tcGlsZVN1bW1hcnlLaW5kLk5nTW9kdWxlLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBtb2R1bGUuZW50cnlDb21wb25lbnRzLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBtb2R1bGUucHJvdmlkZXJzLFxuICAgICAgICAgICAgbW9kdWxlczogbW9kdWxlLm1vZHVsZXMsXG4gICAgICAgICAgICBleHBvcnRlZERpcmVjdGl2ZXM6IG1vZHVsZS5leHBvcnRlZERpcmVjdGl2ZXMsXG4gICAgICAgICAgICBleHBvcnRlZFBpcGVzOiBtb2R1bGUuZXhwb3J0ZWRQaXBlc1xuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIENvbXBpbGVOZ01vZHVsZU1ldGFkYXRhO1xufSgpKTtcbnZhciBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKCkge1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5leHBvcnRlZERpcmVjdGl2ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5waXBlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IFtdO1xuICAgICAgICB0aGlzLmV4cG9ydGVkUGlwZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlcyA9IFtdO1xuICAgICAgICB0aGlzLm1vZHVsZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmVudHJ5Q29tcG9uZW50c1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBbXTtcbiAgICB9XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlciwgbW9kdWxlKSB7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzLnB1c2goeyBwcm92aWRlcjogcHJvdmlkZXIsIG1vZHVsZTogbW9kdWxlIH0pO1xuICAgIH07XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGREaXJlY3RpdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpcmVjdGl2ZXNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRFeHBvcnRlZERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwb3J0ZWREaXJlY3RpdmVzU2V0LmhhcyhpZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICB0aGlzLmV4cG9ydGVkRGlyZWN0aXZlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0ZWREaXJlY3RpdmVzLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEucHJvdG90eXBlLmFkZFBpcGUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBpcGVzU2V0LmhhcyhpZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnBpcGVzU2V0LmFkZChpZC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgdGhpcy5waXBlcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRFeHBvcnRlZFBpcGUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cG9ydGVkUGlwZXNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0ZWRQaXBlcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRNb2R1bGUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vZHVsZXNTZXQuaGFzKGlkLnJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgIHRoaXMubW9kdWxlc1NldC5hZGQoaWQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHRoaXMubW9kdWxlcy5wdXNoKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhLnByb3RvdHlwZS5hZGRFbnRyeUNvbXBvbmVudCA9IGZ1bmN0aW9uIChlYykge1xuICAgICAgICBpZiAoIXRoaXMuZW50cnlDb21wb25lbnRzU2V0LmhhcyhlYy5jb21wb25lbnRUeXBlKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHNTZXQuYWRkKGVjLmNvbXBvbmVudFR5cGUpO1xuICAgICAgICAgICAgdGhpcy5lbnRyeUNvbXBvbmVudHMucHVzaChlYyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUcmFuc2l0aXZlQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGE7XG59KCkpO1xuZnVuY3Rpb24gX25vcm1hbGl6ZUFycmF5KG9iaikge1xuICAgIHJldHVybiBvYmogfHwgW107XG59XG52YXIgUHJvdmlkZXJNZXRhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByb3ZpZGVyTWV0YSh0b2tlbiwgX2EpIHtcbiAgICAgICAgdmFyIHVzZUNsYXNzID0gX2EudXNlQ2xhc3MsIHVzZVZhbHVlID0gX2EudXNlVmFsdWUsIHVzZUV4aXN0aW5nID0gX2EudXNlRXhpc3RpbmcsIHVzZUZhY3RvcnkgPSBfYS51c2VGYWN0b3J5LCBkZXBzID0gX2EuZGVwcywgbXVsdGkgPSBfYS5tdWx0aTtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB0aGlzLnVzZUNsYXNzID0gdXNlQ2xhc3MgfHwgbnVsbDtcbiAgICAgICAgdGhpcy51c2VWYWx1ZSA9IHVzZVZhbHVlO1xuICAgICAgICB0aGlzLnVzZUV4aXN0aW5nID0gdXNlRXhpc3Rpbmc7XG4gICAgICAgIHRoaXMudXNlRmFjdG9yeSA9IHVzZUZhY3RvcnkgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBzIHx8IG51bGw7XG4gICAgICAgIHRoaXMubXVsdGkgPSAhIW11bHRpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvdmlkZXJNZXRhO1xufSgpKTtcbmZ1bmN0aW9uIGZsYXR0ZW4obGlzdCkge1xuICAgIHJldHVybiBsaXN0LnJlZHVjZShmdW5jdGlvbiAoZmxhdCwgaXRlbSkge1xuICAgICAgICB2YXIgZmxhdEl0ZW0gPSBBcnJheS5pc0FycmF5KGl0ZW0pID8gZmxhdHRlbihpdGVtKSA6IGl0ZW07XG4gICAgICAgIHJldHVybiBmbGF0LmNvbmNhdChmbGF0SXRlbSk7XG4gICAgfSwgW10pO1xufVxuZnVuY3Rpb24gaml0U291cmNlVXJsKHVybCkge1xuICAgIC8vIE5vdGU6IFdlIG5lZWQgMyBcIi9cIiBzbyB0aGF0IG5nIHNob3dzIHVwIGFzIGEgc2VwYXJhdGUgZG9tYWluXG4gICAgLy8gaW4gdGhlIGNocm9tZSBkZXYgdG9vbHMuXG4gICAgcmV0dXJuIHVybC5yZXBsYWNlKC8oXFx3KzpcXC9cXC9bXFx3Oi1dKyk/KFxcLyspPy8sICduZzovLy8nKTtcbn1cbmZ1bmN0aW9uIHRlbXBsYXRlU291cmNlVXJsKG5nTW9kdWxlVHlwZSwgY29tcE1ldGEsIHRlbXBsYXRlTWV0YSkge1xuICAgIHZhciB1cmw7XG4gICAgaWYgKHRlbXBsYXRlTWV0YS5pc0lubGluZSkge1xuICAgICAgICBpZiAoY29tcE1ldGEudHlwZS5yZWZlcmVuY2UgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IGEgLnRzIGZpbGUgbWlnaHQgY29udGFpbiBtdWx0aXBsZSBjb21wb25lbnRzIHdpdGggaW5saW5lIHRlbXBsYXRlcyxcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gZ2l2ZSB0aGVtIHVuaXF1ZSB1cmxzLCBhcyB0aGVzZSB3aWxsIGJlIHVzZWQgZm9yIHNvdXJjZW1hcHMuXG4gICAgICAgICAgICB1cmwgPSBjb21wTWV0YS50eXBlLnJlZmVyZW5jZS5maWxlUGF0aCArIFwiLlwiICsgY29tcE1ldGEudHlwZS5yZWZlcmVuY2UubmFtZSArIFwiLmh0bWxcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVybCA9IGlkZW50aWZpZXJOYW1lKG5nTW9kdWxlVHlwZSkgKyBcIi9cIiArIGlkZW50aWZpZXJOYW1lKGNvbXBNZXRhLnR5cGUpICsgXCIuaHRtbFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB1cmwgPSB0ZW1wbGF0ZU1ldGEudGVtcGxhdGVVcmw7XG4gICAgfVxuICAgIHJldHVybiBjb21wTWV0YS50eXBlLnJlZmVyZW5jZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCA/IHVybCA6IGppdFNvdXJjZVVybCh1cmwpO1xufVxuZnVuY3Rpb24gc2hhcmVkU3R5bGVzaGVldEppdFVybChtZXRhLCBpZCkge1xuICAgIHZhciBwYXRoUGFydHMgPSBtZXRhLm1vZHVsZVVybC5zcGxpdCgvXFwvXFxcXC9nKTtcbiAgICB2YXIgYmFzZU5hbWUgPSBwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBqaXRTb3VyY2VVcmwoXCJjc3MvXCIgKyBpZCArIGJhc2VOYW1lICsgXCIubmdzdHlsZS5qc1wiKTtcbn1cbmZ1bmN0aW9uIG5nTW9kdWxlSml0VXJsKG1vZHVsZU1ldGEpIHtcbiAgICByZXR1cm4gaml0U291cmNlVXJsKGlkZW50aWZpZXJOYW1lKG1vZHVsZU1ldGEudHlwZSkgKyBcIi9tb2R1bGUubmdmYWN0b3J5LmpzXCIpO1xufVxuZnVuY3Rpb24gdGVtcGxhdGVKaXRVcmwobmdNb2R1bGVUeXBlLCBjb21wTWV0YSkge1xuICAgIHJldHVybiBqaXRTb3VyY2VVcmwoaWRlbnRpZmllck5hbWUobmdNb2R1bGVUeXBlKSArIFwiL1wiICsgaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkgKyBcIi5uZ2ZhY3RvcnkuanNcIik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBDT1JFJDEgPSAnQGFuZ3VsYXIvY29yZSc7XG52YXIgSWRlbnRpZmllcnMkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJZGVudGlmaWVycygpIHtcbiAgICB9XG4gICAgLyogTWV0aG9kcyAqL1xuICAgIElkZW50aWZpZXJzLk5FV19NRVRIT0QgPSAnZmFjdG9yeSc7XG4gICAgSWRlbnRpZmllcnMuVFJBTlNGT1JNX01FVEhPRCA9ICd0cmFuc2Zvcm0nO1xuICAgIElkZW50aWZpZXJzLlBBVENIX0RFUFMgPSAncGF0Y2hlZERlcHMnO1xuICAgIC8qIEluc3RydWN0aW9ucyAqL1xuICAgIElkZW50aWZpZXJzLm5hbWVzcGFjZUhUTUwgPSB7IG5hbWU6ICfJtcm1bmFtZXNwYWNlSFRNTCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLm5hbWVzcGFjZU1hdGhNTCA9IHsgbmFtZTogJ8m1ybVuYW1lc3BhY2VNYXRoTUwnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5uYW1lc3BhY2VTVkcgPSB7IG5hbWU6ICfJtcm1bmFtZXNwYWNlU1ZHJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZWxlbWVudCA9IHsgbmFtZTogJ8m1ybVlbGVtZW50JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZWxlbWVudFN0YXJ0ID0geyBuYW1lOiAnybXJtWVsZW1lbnRTdGFydCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRFbmQgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudEVuZCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRQcm9wZXJ0eSA9IHsgbmFtZTogJ8m1ybVlbGVtZW50UHJvcGVydHknLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5zZWxlY3QgPSB7IG5hbWU6ICfJtcm1c2VsZWN0JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuY29tcG9uZW50SG9zdFN5bnRoZXRpY1Byb3BlcnR5ID0geyBuYW1lOiAnybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNQcm9wZXJ0eScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lciA9IHsgbmFtZTogJ8m1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXInLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50QXR0cmlidXRlID0geyBuYW1lOiAnybXJtWVsZW1lbnRBdHRyaWJ1dGUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50Q2xhc3NQcm9wID0geyBuYW1lOiAnybXJtWVsZW1lbnRDbGFzc1Byb3AnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50Q29udGFpbmVyU3RhcnQgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZWxlbWVudENvbnRhaW5lckVuZCA9IHsgbmFtZTogJ8m1ybVlbGVtZW50Q29udGFpbmVyRW5kJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZWxlbWVudFN0eWxpbmcgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudFN0eWxpbmcnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50U3R5bGluZ01hcCA9IHsgbmFtZTogJ8m1ybVlbGVtZW50U3R5bGluZ01hcCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRTdHlsZVByb3AgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudFN0eWxlUHJvcCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRTdHlsaW5nQXBwbHkgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudFN0eWxpbmdBcHBseScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRIb3N0QXR0cnMgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudEhvc3RBdHRycycsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRIb3N0U3R5bGluZyA9IHsgbmFtZTogJ8m1ybVlbGVtZW50SG9zdFN0eWxpbmcnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50SG9zdFN0eWxpbmdNYXAgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudEhvc3RTdHlsaW5nTWFwJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZWxlbWVudEhvc3RTdHlsZVByb3AgPSB7IG5hbWU6ICfJtcm1ZWxlbWVudEhvc3RTdHlsZVByb3AnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5lbGVtZW50SG9zdENsYXNzUHJvcCA9IHsgbmFtZTogJ8m1ybVlbGVtZW50SG9zdENsYXNzUHJvcCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5ID0geyBuYW1lOiAnybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuY29udGFpbmVyQ3JlYXRlID0geyBuYW1lOiAnybXJtWNvbnRhaW5lcicsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLm5leHRDb250ZXh0ID0geyBuYW1lOiAnybXJtW5leHRDb250ZXh0JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMudGVtcGxhdGVDcmVhdGUgPSB7IG5hbWU6ICfJtcm1dGVtcGxhdGUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy50ZXh0ID0geyBuYW1lOiAnybXJtXRleHQnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy50ZXh0QmluZGluZyA9IHsgbmFtZTogJ8m1ybV0ZXh0QmluZGluZycsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmJpbmQgPSB7IG5hbWU6ICfJtcm1YmluZCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmVuYWJsZUJpbmRpbmdzID0geyBuYW1lOiAnybXJtWVuYWJsZUJpbmRpbmdzJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZGlzYWJsZUJpbmRpbmdzID0geyBuYW1lOiAnybXJtWRpc2FibGVCaW5kaW5ncycsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmFsbG9jSG9zdFZhcnMgPSB7IG5hbWU6ICfJtcm1YWxsb2NIb3N0VmFycycsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmdldEN1cnJlbnRWaWV3ID0geyBuYW1lOiAnybXJtWdldEN1cnJlbnRWaWV3JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucmVzdG9yZVZpZXcgPSB7IG5hbWU6ICfJtcm1cmVzdG9yZVZpZXcnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pbnRlcnBvbGF0aW9uMSA9IHsgbmFtZTogJ8m1ybVpbnRlcnBvbGF0aW9uMScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmludGVycG9sYXRpb24yID0geyBuYW1lOiAnybXJtWludGVycG9sYXRpb24yJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaW50ZXJwb2xhdGlvbjMgPSB7IG5hbWU6ICfJtcm1aW50ZXJwb2xhdGlvbjMnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pbnRlcnBvbGF0aW9uNCA9IHsgbmFtZTogJ8m1ybVpbnRlcnBvbGF0aW9uNCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmludGVycG9sYXRpb241ID0geyBuYW1lOiAnybXJtWludGVycG9sYXRpb241JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaW50ZXJwb2xhdGlvbjYgPSB7IG5hbWU6ICfJtcm1aW50ZXJwb2xhdGlvbjYnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pbnRlcnBvbGF0aW9uNyA9IHsgbmFtZTogJ8m1ybVpbnRlcnBvbGF0aW9uNycsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmludGVycG9sYXRpb244ID0geyBuYW1lOiAnybXJtWludGVycG9sYXRpb244JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaW50ZXJwb2xhdGlvblYgPSB7IG5hbWU6ICfJtcm1aW50ZXJwb2xhdGlvblYnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb24wID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjAnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb24xID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjEnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb24yID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjInLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb24zID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjMnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb240ID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjQnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb241ID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb242ID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjYnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb243ID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjcnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb244ID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvbjgnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wdXJlRnVuY3Rpb25WID0geyBuYW1lOiAnybXJtXB1cmVGdW5jdGlvblYnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5waXBlQmluZDEgPSB7IG5hbWU6ICfJtcm1cGlwZUJpbmQxJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucGlwZUJpbmQyID0geyBuYW1lOiAnybXJtXBpcGVCaW5kMicsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnBpcGVCaW5kMyA9IHsgbmFtZTogJ8m1ybVwaXBlQmluZDMnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5waXBlQmluZDQgPSB7IG5hbWU6ICfJtcm1cGlwZUJpbmQ0JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucGlwZUJpbmRWID0geyBuYW1lOiAnybXJtXBpcGVCaW5kVicsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnByb3BlcnR5ID0geyBuYW1lOiAnybXJtXByb3BlcnR5JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvcGVydHlJbnRlcnBvbGF0ZSA9IHsgbmFtZTogJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvcGVydHlJbnRlcnBvbGF0ZTEgPSB7IG5hbWU6ICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTEnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wcm9wZXJ0eUludGVycG9sYXRlMiA9IHsgbmFtZTogJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlMicsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnByb3BlcnR5SW50ZXJwb2xhdGUzID0geyBuYW1lOiAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGUzJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvcGVydHlJbnRlcnBvbGF0ZTQgPSB7IG5hbWU6ICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTQnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wcm9wZXJ0eUludGVycG9sYXRlNSA9IHsgbmFtZTogJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnByb3BlcnR5SW50ZXJwb2xhdGU2ID0geyBuYW1lOiAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU2JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvcGVydHlJbnRlcnBvbGF0ZTcgPSB7IG5hbWU6ICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTcnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5wcm9wZXJ0eUludGVycG9sYXRlOCA9IHsgbmFtZTogJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlOCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnByb3BlcnR5SW50ZXJwb2xhdGVWID0geyBuYW1lOiAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGVWJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaTE4biA9IHsgbmFtZTogJ8m1ybVpMThuJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaTE4bkF0dHJpYnV0ZXMgPSB7IG5hbWU6ICfJtcm1aTE4bkF0dHJpYnV0ZXMnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pMThuRXhwID0geyBuYW1lOiAnybXJtWkxOG5FeHAnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pMThuU3RhcnQgPSB7IG5hbWU6ICfJtcm1aTE4blN0YXJ0JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaTE4bkVuZCA9IHsgbmFtZTogJ8m1ybVpMThuRW5kJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuaTE4bkFwcGx5ID0geyBuYW1lOiAnybXJtWkxOG5BcHBseScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmkxOG5Qb3N0cHJvY2VzcyA9IHsgbmFtZTogJ8m1ybVpMThuUG9zdHByb2Nlc3MnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pMThuTG9jYWxpemUgPSB7IG5hbWU6ICfJtcm1aTE4bkxvY2FsaXplJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMubG9hZCA9IHsgbmFtZTogJ8m1ybVsb2FkJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucGlwZSA9IHsgbmFtZTogJ8m1ybVwaXBlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvamVjdGlvbiA9IHsgbmFtZTogJ8m1ybVwcm9qZWN0aW9uJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucHJvamVjdGlvbkRlZiA9IHsgbmFtZTogJ8m1ybVwcm9qZWN0aW9uRGVmJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucmVmZXJlbmNlID0geyBuYW1lOiAnybXJtXJlZmVyZW5jZScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmluamVjdCA9IHsgbmFtZTogJ8m1ybVpbmplY3QnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5pbmplY3RBdHRyaWJ1dGUgPSB7IG5hbWU6ICfJtcm1aW5qZWN0QXR0cmlidXRlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZGlyZWN0aXZlSW5qZWN0ID0geyBuYW1lOiAnybXJtWRpcmVjdGl2ZUluamVjdCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnRlbXBsYXRlUmVmRXh0cmFjdG9yID0geyBuYW1lOiAnybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucmVzb2x2ZVdpbmRvdyA9IHsgbmFtZTogJ8m1ybVyZXNvbHZlV2luZG93JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucmVzb2x2ZURvY3VtZW50ID0geyBuYW1lOiAnybXJtXJlc29sdmVEb2N1bWVudCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnJlc29sdmVCb2R5ID0geyBuYW1lOiAnybXJtXJlc29sdmVCb2R5JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZGVmaW5lQmFzZSA9IHsgbmFtZTogJ8m1ybVkZWZpbmVCYXNlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuQmFzZURlZiA9IHtcbiAgICAgICAgbmFtZTogJ8m1ybVCYXNlRGVmJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSQxLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuZGVmaW5lQ29tcG9uZW50ID0geyBuYW1lOiAnybXJtWRlZmluZUNvbXBvbmVudCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnNldENvbXBvbmVudFNjb3BlID0geyBuYW1lOiAnybXJtXNldENvbXBvbmVudFNjb3BlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuQ29tcG9uZW50RGVmV2l0aE1ldGEgPSB7XG4gICAgICAgIG5hbWU6ICfJtcm1Q29tcG9uZW50RGVmV2l0aE1ldGEnLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFJDEsXG4gICAgfTtcbiAgICBJZGVudGlmaWVycy5kZWZpbmVEaXJlY3RpdmUgPSB7XG4gICAgICAgIG5hbWU6ICfJtcm1ZGVmaW5lRGlyZWN0aXZlJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSQxLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuRGlyZWN0aXZlRGVmV2l0aE1ldGEgPSB7XG4gICAgICAgIG5hbWU6ICfJtcm1RGlyZWN0aXZlRGVmV2l0aE1ldGEnLFxuICAgICAgICBtb2R1bGVOYW1lOiBDT1JFJDEsXG4gICAgfTtcbiAgICBJZGVudGlmaWVycy5JbmplY3RvckRlZiA9IHtcbiAgICAgICAgbmFtZTogJ8m1ybVJbmplY3RvckRlZicsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUkMSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLmRlZmluZUluamVjdG9yID0ge1xuICAgICAgICBuYW1lOiAnybXJtWRlZmluZUluamVjdG9yJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSQxLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuTmdNb2R1bGVEZWZXaXRoTWV0YSA9IHtcbiAgICAgICAgbmFtZTogJ8m1ybVOZ01vZHVsZURlZldpdGhNZXRhJyxcbiAgICAgICAgbW9kdWxlTmFtZTogQ09SRSQxLFxuICAgIH07XG4gICAgSWRlbnRpZmllcnMuZGVmaW5lTmdNb2R1bGUgPSB7IG5hbWU6ICfJtcm1ZGVmaW5lTmdNb2R1bGUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5zZXROZ01vZHVsZVNjb3BlID0geyBuYW1lOiAnybXJtXNldE5nTW9kdWxlU2NvcGUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5QaXBlRGVmV2l0aE1ldGEgPSB7IG5hbWU6ICfJtcm1UGlwZURlZldpdGhNZXRhJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZGVmaW5lUGlwZSA9IHsgbmFtZTogJ8m1ybVkZWZpbmVQaXBlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMucXVlcnlSZWZyZXNoID0geyBuYW1lOiAnybXJtXF1ZXJ5UmVmcmVzaCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnZpZXdRdWVyeSA9IHsgbmFtZTogJ8m1ybV2aWV3UXVlcnknLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5zdGF0aWNWaWV3UXVlcnkgPSB7IG5hbWU6ICfJtcm1c3RhdGljVmlld1F1ZXJ5JywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuc3RhdGljQ29udGVudFF1ZXJ5ID0geyBuYW1lOiAnybXJtXN0YXRpY0NvbnRlbnRRdWVyeScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmxvYWRWaWV3UXVlcnkgPSB7IG5hbWU6ICfJtcm1bG9hZFZpZXdRdWVyeScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmNvbnRlbnRRdWVyeSA9IHsgbmFtZTogJ8m1ybVjb250ZW50UXVlcnknLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5sb2FkQ29udGVudFF1ZXJ5ID0geyBuYW1lOiAnybXJtWxvYWRDb250ZW50UXVlcnknLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5OZ09uQ2hhbmdlc0ZlYXR1cmUgPSB7IG5hbWU6ICfJtcm1TmdPbkNoYW5nZXNGZWF0dXJlJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuSW5oZXJpdERlZmluaXRpb25GZWF0dXJlID0geyBuYW1lOiAnybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLlByb3ZpZGVyc0ZlYXR1cmUgPSB7IG5hbWU6ICfJtcm1UHJvdmlkZXJzRmVhdHVyZScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLmxpc3RlbmVyID0geyBuYW1lOiAnybXJtWxpc3RlbmVyJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuZ2V0RmFjdG9yeU9mID0ge1xuICAgICAgICBuYW1lOiAnybXJtWdldEZhY3RvcnlPZicsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUkMSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLmdldEluaGVyaXRlZEZhY3RvcnkgPSB7XG4gICAgICAgIG5hbWU6ICfJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeScsXG4gICAgICAgIG1vZHVsZU5hbWU6IENPUkUkMSxcbiAgICB9O1xuICAgIElkZW50aWZpZXJzLnJlZ2lzdGVyTmdNb2R1bGVUeXBlID0geyBuYW1lOiAnybVyZWdpc3Rlck5nTW9kdWxlVHlwZScsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIC8vIHNhbml0aXphdGlvbi1yZWxhdGVkIGZ1bmN0aW9uc1xuICAgIElkZW50aWZpZXJzLnNhbml0aXplSHRtbCA9IHsgbmFtZTogJ8m1ybVzYW5pdGl6ZUh0bWwnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5zYW5pdGl6ZVN0eWxlID0geyBuYW1lOiAnybXJtXNhbml0aXplU3R5bGUnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5kZWZhdWx0U3R5bGVTYW5pdGl6ZXIgPSB7IG5hbWU6ICfJtcm1ZGVmYXVsdFN0eWxlU2FuaXRpemVyJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuc2FuaXRpemVSZXNvdXJjZVVybCA9IHsgbmFtZTogJ8m1ybVzYW5pdGl6ZVJlc291cmNlVXJsJywgbW9kdWxlTmFtZTogQ09SRSQxIH07XG4gICAgSWRlbnRpZmllcnMuc2FuaXRpemVTY3JpcHQgPSB7IG5hbWU6ICfJtcm1c2FuaXRpemVTY3JpcHQnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICBJZGVudGlmaWVycy5zYW5pdGl6ZVVybCA9IHsgbmFtZTogJ8m1ybVzYW5pdGl6ZVVybCcsIG1vZHVsZU5hbWU6IENPUkUkMSB9O1xuICAgIElkZW50aWZpZXJzLnNhbml0aXplVXJsT3JSZXNvdXJjZVVybCA9IHsgbmFtZTogJ8m1ybVzYW5pdGl6ZVVybE9yUmVzb3VyY2VVcmwnLCBtb2R1bGVOYW1lOiBDT1JFJDEgfTtcbiAgICByZXR1cm4gSWRlbnRpZmllcnM7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXh0KHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICB9XG4gICAgVGV4dC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcyk7IH07XG4gICAgcmV0dXJuIFRleHQ7XG59KCkpO1xudmFyIEJvdW5kVGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCb3VuZFRleHQodmFsdWUsIHNvdXJjZVNwYW4sIGkxOG4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmkxOG4gPSBpMThuO1xuICAgIH1cbiAgICBCb3VuZFRleHQucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRCb3VuZFRleHQodGhpcyk7IH07XG4gICAgcmV0dXJuIEJvdW5kVGV4dDtcbn0oKSk7XG52YXIgVGV4dEF0dHJpYnV0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXh0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuLCB2YWx1ZVNwYW4sIGkxOG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLnZhbHVlU3BhbiA9IHZhbHVlU3BhbjtcbiAgICAgICAgdGhpcy5pMThuID0gaTE4bjtcbiAgICB9XG4gICAgVGV4dEF0dHJpYnV0ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdFRleHRBdHRyaWJ1dGUodGhpcyk7IH07XG4gICAgcmV0dXJuIFRleHRBdHRyaWJ1dGU7XG59KCkpO1xudmFyIEJvdW5kQXR0cmlidXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvdW5kQXR0cmlidXRlKG5hbWUsIHR5cGUsIHNlY3VyaXR5Q29udGV4dCwgdmFsdWUsIHVuaXQsIHNvdXJjZVNwYW4sIGkxOG4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5zZWN1cml0eUNvbnRleHQgPSBzZWN1cml0eUNvbnRleHQ7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pMThuID0gaTE4bjtcbiAgICB9XG4gICAgQm91bmRBdHRyaWJ1dGUuZnJvbUJvdW5kRWxlbWVudFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3AsIGkxOG4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCb3VuZEF0dHJpYnV0ZShwcm9wLm5hbWUsIHByb3AudHlwZSwgcHJvcC5zZWN1cml0eUNvbnRleHQsIHByb3AudmFsdWUsIHByb3AudW5pdCwgcHJvcC5zb3VyY2VTcGFuLCBpMThuKTtcbiAgICB9O1xuICAgIEJvdW5kQXR0cmlidXRlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0Qm91bmRBdHRyaWJ1dGUodGhpcyk7IH07XG4gICAgcmV0dXJuIEJvdW5kQXR0cmlidXRlO1xufSgpKTtcbnZhciBCb3VuZEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvdW5kRXZlbnQobmFtZSwgdHlwZSwgaGFuZGxlciwgdGFyZ2V0LCBwaGFzZSwgc291cmNlU3BhbiwgaGFuZGxlclNwYW4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucGhhc2UgPSBwaGFzZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5oYW5kbGVyU3BhbiA9IGhhbmRsZXJTcGFuO1xuICAgIH1cbiAgICBCb3VuZEV2ZW50LmZyb21QYXJzZWRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudHlwZSA9PT0gMCAvKiBSZWd1bGFyICovID8gZXZlbnQudGFyZ2V0T3JQaGFzZSA6IG51bGw7XG4gICAgICAgIHZhciBwaGFzZSA9IGV2ZW50LnR5cGUgPT09IDEgLyogQW5pbWF0aW9uICovID8gZXZlbnQudGFyZ2V0T3JQaGFzZSA6IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgQm91bmRFdmVudChldmVudC5uYW1lLCBldmVudC50eXBlLCBldmVudC5oYW5kbGVyLCB0YXJnZXQsIHBoYXNlLCBldmVudC5zb3VyY2VTcGFuLCBldmVudC5oYW5kbGVyU3Bhbik7XG4gICAgfTtcbiAgICBCb3VuZEV2ZW50LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0Qm91bmRFdmVudCh0aGlzKTsgfTtcbiAgICByZXR1cm4gQm91bmRFdmVudDtcbn0oKSk7XG52YXIgRWxlbWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMsIGlucHV0cywgb3V0cHV0cywgY2hpbGRyZW4sIHJlZmVyZW5jZXMsIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3BhbiwgaTE4bikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLnN0YXJ0U291cmNlU3BhbiA9IHN0YXJ0U291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5lbmRTb3VyY2VTcGFuID0gZW5kU291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pMThuID0gaTE4bjtcbiAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgZW1wdHkgdGhlbiB0aGUgc291cmNlIHNwYW4gc2hvdWxkIGluY2x1ZGUgYW55IGNsb3NpbmcgdGFnXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgc3RhcnRTb3VyY2VTcGFuICYmIGVuZFNvdXJjZVNwYW4pIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlU3BhbiA9IF9fYXNzaWduKHt9LCBzb3VyY2VTcGFuLCB7IGVuZDogZW5kU291cmNlU3Bhbi5lbmQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvcikgeyByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnQodGhpcyk7IH07XG4gICAgcmV0dXJuIEVsZW1lbnQ7XG59KCkpO1xudmFyIFRlbXBsYXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRlbXBsYXRlKHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGlucHV0cywgb3V0cHV0cywgdGVtcGxhdGVBdHRycywgY2hpbGRyZW4sIHJlZmVyZW5jZXMsIHZhcmlhYmxlcywgc291cmNlU3Bhbiwgc3RhcnRTb3VyY2VTcGFuLCBlbmRTb3VyY2VTcGFuLCBpMThuKSB7XG4gICAgICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgICAgICB0aGlzLnRlbXBsYXRlQXR0cnMgPSB0ZW1wbGF0ZUF0dHJzO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7XG4gICAgICAgIHRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLnN0YXJ0U291cmNlU3BhbiA9IHN0YXJ0U291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5lbmRTb3VyY2VTcGFuID0gZW5kU291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pMThuID0gaTE4bjtcbiAgICB9XG4gICAgVGVtcGxhdGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRUZW1wbGF0ZSh0aGlzKTsgfTtcbiAgICByZXR1cm4gVGVtcGxhdGU7XG59KCkpO1xudmFyIENvbnRlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29udGVudChzZWxlY3RvciwgYXR0cmlidXRlcywgc291cmNlU3BhbiwgaTE4bikge1xuICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMuaTE4biA9IGkxOG47XG4gICAgfVxuICAgIENvbnRlbnQucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRDb250ZW50KHRoaXMpOyB9O1xuICAgIHJldHVybiBDb250ZW50O1xufSgpKTtcbnZhciBWYXJpYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWYXJpYWJsZShuYW1lLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIFZhcmlhYmxlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcyk7IH07XG4gICAgcmV0dXJuIFZhcmlhYmxlO1xufSgpKTtcbnZhciBSZWZlcmVuY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICB9XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UmVmZXJlbmNlKHRoaXMpOyB9O1xuICAgIHJldHVybiBSZWZlcmVuY2U7XG59KCkpO1xudmFyIEljdSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJY3UodmFycywgcGxhY2Vob2xkZXJzLCBzb3VyY2VTcGFuLCBpMThuKSB7XG4gICAgICAgIHRoaXMudmFycyA9IHZhcnM7XG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXJzID0gcGxhY2Vob2xkZXJzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmkxOG4gPSBpMThuO1xuICAgIH1cbiAgICBJY3UucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRJY3UodGhpcyk7IH07XG4gICAgcmV0dXJuIEljdTtcbn0oKSk7XG5mdW5jdGlvbiB2aXNpdEFsbCh2aXNpdG9yLCBub2Rlcykge1xuICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBpZiAodmlzaXRvci52aXNpdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgbm9kZXNfMSA9IF9fdmFsdWVzKG5vZGVzKSwgbm9kZXNfMV8xID0gbm9kZXNfMS5uZXh0KCk7ICFub2Rlc18xXzEuZG9uZTsgbm9kZXNfMV8xID0gbm9kZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IHZpc2l0b3IudmlzaXQobm9kZSkgfHwgbm9kZS52aXNpdCh2aXNpdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVzXzFfMSAmJiAhbm9kZXNfMV8xLmRvbmUgJiYgKF9hID0gbm9kZXNfMS5yZXR1cm4pKSBfYS5jYWxsKG5vZGVzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgbm9kZXNfMiA9IF9fdmFsdWVzKG5vZGVzKSwgbm9kZXNfMl8xID0gbm9kZXNfMi5uZXh0KCk7ICFub2Rlc18yXzEuZG9uZTsgbm9kZXNfMl8xID0gbm9kZXNfMi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzXzJfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Tm9kZSA9IG5vZGUudmlzaXQodmlzaXRvcik7XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3Tm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXNfMl8xICYmICFub2Rlc18yXzEuZG9uZSAmJiAoX2IgPSBub2Rlc18yLnJldHVybikpIF9iLmNhbGwobm9kZXNfMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIE1lc3NhZ2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5vZGVzIG1lc3NhZ2UgQVNUXG4gICAgICogQHBhcmFtIHBsYWNlaG9sZGVycyBtYXBzIHBsYWNlaG9sZGVyIG5hbWVzIHRvIHN0YXRpYyBjb250ZW50XG4gICAgICogQHBhcmFtIHBsYWNlaG9sZGVyVG9NZXNzYWdlIG1hcHMgcGxhY2Vob2xkZXIgbmFtZXMgdG8gbWVzc2FnZXMgKHVzZWQgZm9yIG5lc3RlZCBJQ1UgbWVzc2FnZXMpXG4gICAgICogQHBhcmFtIG1lYW5pbmdcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb25cbiAgICAgKiBAcGFyYW0gaWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNZXNzYWdlKG5vZGVzLCBwbGFjZWhvbGRlcnMsIHBsYWNlaG9sZGVyVG9NZXNzYWdlLCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgaWQpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVycyA9IHBsYWNlaG9sZGVycztcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlclRvTWVzc2FnZSA9IHBsYWNlaG9sZGVyVG9NZXNzYWdlO1xuICAgICAgICB0aGlzLm1lYW5pbmcgPSBtZWFuaW5nO1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VzID0gW3tcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IG5vZGVzWzBdLnNvdXJjZVNwYW4uc3RhcnQuZmlsZS51cmwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZTogbm9kZXNbMF0uc291cmNlU3Bhbi5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2w6IG5vZGVzWzBdLnNvdXJjZVNwYW4uc3RhcnQuY29sICsgMSxcbiAgICAgICAgICAgICAgICAgICAgZW5kTGluZTogbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV0uc291cmNlU3Bhbi5lbmQubGluZSArIDEsXG4gICAgICAgICAgICAgICAgICAgIGVuZENvbDogbm9kZXNbMF0uc291cmNlU3Bhbi5zdGFydC5jb2wgKyAxXG4gICAgICAgICAgICAgICAgfV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXMgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTWVzc2FnZTtcbn0oKSk7XG52YXIgVGV4dCQxID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRleHQodmFsdWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBUZXh0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gVGV4dDtcbn0oKSk7XG4vLyBUT0RPKHZpY2IpOiBkbyB3ZSByZWFsbHkgbmVlZCB0aGlzIG5vZGUgKHZzIGFuIGFycmF5KSA/XG52YXIgQ29udGFpbmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnRhaW5lcihjaGlsZHJlbiwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIENvbnRhaW5lci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdENvbnRhaW5lcih0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gQ29udGFpbmVyO1xufSgpKTtcbnZhciBJY3UkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJY3UoZXhwcmVzc2lvbiwgdHlwZSwgY2FzZXMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5jYXNlcyA9IGNhc2VzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBJY3UucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRJY3UodGhpcywgY29udGV4dCk7IH07XG4gICAgcmV0dXJuIEljdTtcbn0oKSk7XG52YXIgVGFnUGxhY2Vob2xkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFnUGxhY2Vob2xkZXIodGFnLCBhdHRycywgc3RhcnROYW1lLCBjbG9zZU5hbWUsIGNoaWxkcmVuLCBpc1ZvaWQsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5zdGFydE5hbWUgPSBzdGFydE5hbWU7XG4gICAgICAgIHRoaXMuY2xvc2VOYW1lID0gY2xvc2VOYW1lO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuaXNWb2lkID0gaXNWb2lkO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBUYWdQbGFjZWhvbGRlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdFRhZ1BsYWNlaG9sZGVyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBUYWdQbGFjZWhvbGRlcjtcbn0oKSk7XG52YXIgUGxhY2Vob2xkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGxhY2Vob2xkZXIodmFsdWUsIG5hbWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBQbGFjZWhvbGRlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdFBsYWNlaG9sZGVyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBQbGFjZWhvbGRlcjtcbn0oKSk7XG52YXIgSWN1UGxhY2Vob2xkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSWN1UGxhY2Vob2xkZXIodmFsdWUsIG5hbWUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBJY3VQbGFjZWhvbGRlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEljdVBsYWNlaG9sZGVyKHRoaXMsIGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBJY3VQbGFjZWhvbGRlcjtcbn0oKSk7XG4vLyBDbG9uZSB0aGUgQVNUXG52YXIgQ2xvbmVWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsb25lVmlzaXRvcigpIHtcbiAgICB9XG4gICAgQ2xvbmVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gbmV3IFRleHQkMSh0ZXh0LnZhbHVlLCB0ZXh0LnNvdXJjZVNwYW4pOyB9O1xuICAgIENsb25lVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGNvbnRhaW5lci5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXIoY2hpbGRyZW4sIGNvbnRhaW5lci5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIENsb25lVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjYXNlcyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyhpY3UuY2FzZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gY2FzZXNba2V5XSA9IGljdS5jYXNlc1trZXldLnZpc2l0KF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgIHZhciBtc2cgPSBuZXcgSWN1JDEoaWN1LmV4cHJlc3Npb24sIGljdS50eXBlLCBjYXNlcywgaWN1LnNvdXJjZVNwYW4pO1xuICAgICAgICBtc2cuZXhwcmVzc2lvblBsYWNlaG9sZGVyID0gaWN1LmV4cHJlc3Npb25QbGFjZWhvbGRlcjtcbiAgICAgICAgcmV0dXJuIG1zZztcbiAgICB9O1xuICAgIENsb25lVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBwaC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIG4udmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWdQbGFjZWhvbGRlcihwaC50YWcsIHBoLmF0dHJzLCBwaC5zdGFydE5hbWUsIHBoLmNsb3NlTmFtZSwgY2hpbGRyZW4sIHBoLmlzVm9pZCwgcGguc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBDbG9uZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcihwaC52YWx1ZSwgcGgubmFtZSwgcGguc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBDbG9uZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJY3VQbGFjZWhvbGRlcihwaC52YWx1ZSwgcGgubmFtZSwgcGguc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xvbmVWaXNpdG9yO1xufSgpKTtcbi8vIFZpc2l0IGFsbCB0aGUgbm9kZXMgcmVjdXJzaXZlbHlcbnZhciBSZWN1cnNlVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWN1cnNlVmlzaXRvcigpIHtcbiAgICB9XG4gICAgUmVjdXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IH07XG4gICAgUmVjdXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb250YWluZXIuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLnZpc2l0KF90aGlzKTsgfSk7XG4gICAgfTtcbiAgICBSZWN1cnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGljdS5jYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyBpY3UuY2FzZXNba10udmlzaXQoX3RoaXMpOyB9KTtcbiAgICB9O1xuICAgIFJlY3Vyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZ1BsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHBoLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZC52aXNpdChfdGhpcyk7IH0pO1xuICAgIH07XG4gICAgUmVjdXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHsgfTtcbiAgICBSZWN1cnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3VQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkgeyB9O1xuICAgIHJldHVybiBSZWN1cnNlVmlzaXRvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGRpZ2VzdChtZXNzYWdlKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2UuaWQgfHwgc2hhMShzZXJpYWxpemVOb2RlcyhtZXNzYWdlLm5vZGVzKS5qb2luKCcnKSArIChcIltcIiArIG1lc3NhZ2UubWVhbmluZyArIFwiXVwiKSk7XG59XG5mdW5jdGlvbiBkZWNpbWFsRGlnZXN0KG1lc3NhZ2UpIHtcbiAgICBpZiAobWVzc2FnZS5pZCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5pZDtcbiAgICB9XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgX1NlcmlhbGl6ZXJJZ25vcmVJY3VFeHBWaXNpdG9yKCk7XG4gICAgdmFyIHBhcnRzID0gbWVzc2FnZS5ub2Rlcy5tYXAoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEudmlzaXQodmlzaXRvciwgbnVsbCk7IH0pO1xuICAgIHJldHVybiBjb21wdXRlTXNnSWQocGFydHMuam9pbignJyksIG1lc3NhZ2UubWVhbmluZyk7XG59XG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgaTE4biBhc3QgdG8gc29tZXRoaW5nIHhtbC1saWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIGFuIFVJRC5cbiAqXG4gKiBUaGUgdmlzaXRvciBpcyBhbHNvIHVzZWQgaW4gdGhlIGkxOG4gcGFyc2VyIHRlc3RzXG4gKlxuICogQGludGVybmFsXG4gKi9cbnZhciBfU2VyaWFsaXplclZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX1NlcmlhbGl6ZXJWaXNpdG9yKCkge1xuICAgIH1cbiAgICBfU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiB0ZXh0LnZhbHVlOyB9O1xuICAgIF9TZXJpYWxpemVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBcIltcIiArIGNvbnRhaW5lci5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZC52aXNpdChfdGhpcyk7IH0pLmpvaW4oJywgJykgKyBcIl1cIjtcbiAgICB9O1xuICAgIF9TZXJpYWxpemVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBzdHJDYXNlcyA9IE9iamVjdC5rZXlzKGljdS5jYXNlcykubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBrICsgXCIge1wiICsgaWN1LmNhc2VzW2tdLnZpc2l0KF90aGlzKSArIFwifVwiOyB9KTtcbiAgICAgICAgcmV0dXJuIFwie1wiICsgaWN1LmV4cHJlc3Npb24gKyBcIiwgXCIgKyBpY3UudHlwZSArIFwiLCBcIiArIHN0ckNhc2VzLmpvaW4oJywgJykgKyBcIn1cIjtcbiAgICB9O1xuICAgIF9TZXJpYWxpemVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcGguaXNWb2lkID9cbiAgICAgICAgICAgIFwiPHBoIHRhZyBuYW1lPVxcXCJcIiArIHBoLnN0YXJ0TmFtZSArIFwiXFxcIi8+XCIgOlxuICAgICAgICAgICAgXCI8cGggdGFnIG5hbWU9XFxcIlwiICsgcGguc3RhcnROYW1lICsgXCJcXFwiPlwiICsgcGguY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gY2hpbGQudmlzaXQoX3RoaXMpOyB9KS5qb2luKCcsICcpICsgXCI8L3BoIG5hbWU9XFxcIlwiICsgcGguY2xvc2VOYW1lICsgXCJcXFwiPlwiO1xuICAgIH07XG4gICAgX1NlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBwaC52YWx1ZSA/IFwiPHBoIG5hbWU9XFxcIlwiICsgcGgubmFtZSArIFwiXFxcIj5cIiArIHBoLnZhbHVlICsgXCI8L3BoPlwiIDogXCI8cGggbmFtZT1cXFwiXCIgKyBwaC5uYW1lICsgXCJcXFwiLz5cIjtcbiAgICB9O1xuICAgIF9TZXJpYWxpemVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3VQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gXCI8cGggaWN1IG5hbWU9XFxcIlwiICsgcGgubmFtZSArIFwiXFxcIj5cIiArIHBoLnZhbHVlLnZpc2l0KHRoaXMpICsgXCI8L3BoPlwiO1xuICAgIH07XG4gICAgcmV0dXJuIF9TZXJpYWxpemVyVmlzaXRvcjtcbn0oKSk7XG52YXIgc2VyaWFsaXplclZpc2l0b3IgPSBuZXcgX1NlcmlhbGl6ZXJWaXNpdG9yKCk7XG5mdW5jdGlvbiBzZXJpYWxpemVOb2Rlcyhub2Rlcykge1xuICAgIHJldHVybiBub2Rlcy5tYXAoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGEudmlzaXQoc2VyaWFsaXplclZpc2l0b3IsIG51bGwpOyB9KTtcbn1cbi8qKlxuICogU2VyaWFsaXplIHRoZSBpMThuIGFzdCB0byBzb21ldGhpbmcgeG1sLWxpa2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYW4gVUlELlxuICpcbiAqIElnbm9yZSB0aGUgSUNVIGV4cHJlc3Npb25zIHNvIHRoYXQgbWVzc2FnZSBJRHMgc3RheXMgaWRlbnRpY2FsIGlmIG9ubHkgdGhlIGV4cHJlc3Npb24gY2hhbmdlcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoX1NlcmlhbGl6ZXJJZ25vcmVJY3VFeHBWaXNpdG9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIF9TZXJpYWxpemVySWdub3JlSWN1RXhwVmlzaXRvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBfU2VyaWFsaXplcklnbm9yZUljdUV4cFZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1ID0gZnVuY3Rpb24gKGljdSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyQ2FzZXMgPSBPYmplY3Qua2V5cyhpY3UuY2FzZXMpLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gayArIFwiIHtcIiArIGljdS5jYXNlc1trXS52aXNpdChfdGhpcykgKyBcIn1cIjsgfSk7XG4gICAgICAgIC8vIERvIG5vdCB0YWtlIHRoZSBleHByZXNzaW9uIGludG8gYWNjb3VudFxuICAgICAgICByZXR1cm4gXCJ7XCIgKyBpY3UudHlwZSArIFwiLCBcIiArIHN0ckNhc2VzLmpvaW4oJywgJykgKyBcIn1cIjtcbiAgICB9O1xuICAgIHJldHVybiBfU2VyaWFsaXplcklnbm9yZUljdUV4cFZpc2l0b3I7XG59KF9TZXJpYWxpemVyVmlzaXRvcikpO1xuLyoqXG4gKiBDb21wdXRlIHRoZSBTSEExIG9mIHRoZSBnaXZlbiBzdHJpbmdcbiAqXG4gKiBzZWUgaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC00L2ZpcHMtMTgwLTQucGRmXG4gKlxuICogV0FSTklORzogdGhpcyBmdW5jdGlvbiBoYXMgbm90IGJlZW4gZGVzaWduZWQgbm90IHRlc3RlZCB3aXRoIHNlY3VyaXR5IGluIG1pbmQuXG4gKiAgICAgICAgICBETyBOT1QgVVNFIElUIElOIEEgU0VDVVJJVFkgU0VOU0lUSVZFIENPTlRFWFQuXG4gKi9cbmZ1bmN0aW9uIHNoYTEoc3RyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICB2YXIgdXRmOCA9IHV0ZjhFbmNvZGUoc3RyKTtcbiAgICB2YXIgd29yZHMzMiA9IHN0cmluZ1RvV29yZHMzMih1dGY4LCBFbmRpYW4uQmlnKTtcbiAgICB2YXIgbGVuID0gdXRmOC5sZW5ndGggKiA4O1xuICAgIHZhciB3ID0gbmV3IEFycmF5KDgwKTtcbiAgICB2YXIgX2MgPSBfX3JlYWQoWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdLCA1KSwgYSA9IF9jWzBdLCBiID0gX2NbMV0sIGMgPSBfY1syXSwgZCA9IF9jWzNdLCBlID0gX2NbNF07XG4gICAgd29yZHMzMltsZW4gPj4gNV0gfD0gMHg4MCA8PCAoMjQgLSBsZW4gJSAzMik7XG4gICAgd29yZHMzMlsoKGxlbiArIDY0ID4+IDkpIDw8IDQpICsgMTVdID0gbGVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMzMi5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdmFyIF9kID0gX19yZWFkKFthLCBiLCBjLCBkLCBlXSwgNSksIGgwID0gX2RbMF0sIGgxID0gX2RbMV0sIGgyID0gX2RbMl0sIGgzID0gX2RbM10sIGg0ID0gX2RbNF07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODA7IGorKykge1xuICAgICAgICAgICAgaWYgKGogPCAxNikge1xuICAgICAgICAgICAgICAgIHdbal0gPSB3b3JkczMyW2kgKyBqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdbal0gPSByb2wzMih3W2ogLSAzXSBeIHdbaiAtIDhdIF4gd1tqIC0gMTRdIF4gd1tqIC0gMTZdLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBfZSA9IF9fcmVhZChmayhqLCBiLCBjLCBkKSwgMiksIGYgPSBfZVswXSwgayA9IF9lWzFdO1xuICAgICAgICAgICAgdmFyIHRlbXAgPSBbcm9sMzIoYSwgNSksIGYsIGUsIGssIHdbal1dLnJlZHVjZShhZGQzMik7XG4gICAgICAgICAgICBfYSA9IF9fcmVhZChbZCwgYywgcm9sMzIoYiwgMzApLCBhLCB0ZW1wXSwgNSksIGUgPSBfYVswXSwgZCA9IF9hWzFdLCBjID0gX2FbMl0sIGIgPSBfYVszXSwgYSA9IF9hWzRdO1xuICAgICAgICB9XG4gICAgICAgIF9iID0gX19yZWFkKFthZGQzMihhLCBoMCksIGFkZDMyKGIsIGgxKSwgYWRkMzIoYywgaDIpLCBhZGQzMihkLCBoMyksIGFkZDMyKGUsIGg0KV0sIDUpLCBhID0gX2JbMF0sIGIgPSBfYlsxXSwgYyA9IF9iWzJdLCBkID0gX2JbM10sIGUgPSBfYls0XTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVTdHJpbmdUb0hleFN0cmluZyh3b3JkczMyVG9CeXRlU3RyaW5nKFthLCBiLCBjLCBkLCBlXSkpO1xufVxuZnVuY3Rpb24gZmsoaW5kZXgsIGIsIGMsIGQpIHtcbiAgICBpZiAoaW5kZXggPCAyMCkge1xuICAgICAgICByZXR1cm4gWyhiICYgYykgfCAofmIgJiBkKSwgMHg1YTgyNzk5OV07XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDQwKSB7XG4gICAgICAgIHJldHVybiBbYiBeIGMgXiBkLCAweDZlZDllYmExXTtcbiAgICB9XG4gICAgaWYgKGluZGV4IDwgNjApIHtcbiAgICAgICAgcmV0dXJuIFsoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCksIDB4OGYxYmJjZGNdO1xuICAgIH1cbiAgICByZXR1cm4gW2IgXiBjIF4gZCwgMHhjYTYyYzFkNl07XG59XG4vKipcbiAqIENvbXB1dGUgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBnaXZlbiBzdHJpbmdcbiAqXG4gKiBUaGUgb3V0cHV0IGlzIDY0IGJpdCBudW1iZXIgZW5jb2RlZCBhcyBhIGRlY2ltYWwgc3RyaW5nXG4gKlxuICogYmFzZWQgb246XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvYmxvYi9tYXN0ZXIvc3JjL2NvbS9nb29nbGUvamF2YXNjcmlwdC9qc2NvbXAvR29vZ2xlSnNNZXNzYWdlSWRHZW5lcmF0b3IuamF2YVxuICovXG5mdW5jdGlvbiBmaW5nZXJwcmludChzdHIpIHtcbiAgICB2YXIgdXRmOCA9IHV0ZjhFbmNvZGUoc3RyKTtcbiAgICB2YXIgX2EgPSBfX3JlYWQoW2hhc2gzMih1dGY4LCAwKSwgaGFzaDMyKHV0ZjgsIDEwMjA3MildLCAyKSwgaGkgPSBfYVswXSwgbG8gPSBfYVsxXTtcbiAgICBpZiAoaGkgPT0gMCAmJiAobG8gPT0gMCB8fCBsbyA9PSAxKSkge1xuICAgICAgICBoaSA9IGhpIF4gMHgxMzBmOWJlZjtcbiAgICAgICAgbG8gPSBsbyBeIC0weDZiNWY1NmQ4O1xuICAgIH1cbiAgICByZXR1cm4gW2hpLCBsb107XG59XG5mdW5jdGlvbiBjb21wdXRlTXNnSWQobXNnLCBtZWFuaW5nKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBfYiA9IF9fcmVhZChmaW5nZXJwcmludChtc2cpLCAyKSwgaGkgPSBfYlswXSwgbG8gPSBfYlsxXTtcbiAgICBpZiAobWVhbmluZykge1xuICAgICAgICB2YXIgX2MgPSBfX3JlYWQoZmluZ2VycHJpbnQobWVhbmluZyksIDIpLCBoaW0gPSBfY1swXSwgbG9tID0gX2NbMV07XG4gICAgICAgIF9hID0gX19yZWFkKGFkZDY0KHJvbDY0KFtoaSwgbG9dLCAxKSwgW2hpbSwgbG9tXSksIDIpLCBoaSA9IF9hWzBdLCBsbyA9IF9hWzFdO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZVN0cmluZ1RvRGVjU3RyaW5nKHdvcmRzMzJUb0J5dGVTdHJpbmcoW2hpICYgMHg3ZmZmZmZmZiwgbG9dKSk7XG59XG5mdW5jdGlvbiBoYXNoMzIoc3RyLCBjKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBfYiA9IF9fcmVhZChbMHg5ZTM3NzliOSwgMHg5ZTM3NzliOV0sIDIpLCBhID0gX2JbMF0sIGIgPSBfYlsxXTtcbiAgICB2YXIgaTtcbiAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpICsgMTIgPD0gbGVuOyBpICs9IDEyKSB7XG4gICAgICAgIGEgPSBhZGQzMihhLCB3b3JkQXQoc3RyLCBpLCBFbmRpYW4uTGl0dGxlKSk7XG4gICAgICAgIGIgPSBhZGQzMihiLCB3b3JkQXQoc3RyLCBpICsgNCwgRW5kaWFuLkxpdHRsZSkpO1xuICAgICAgICBjID0gYWRkMzIoYywgd29yZEF0KHN0ciwgaSArIDgsIEVuZGlhbi5MaXR0bGUpKTtcbiAgICAgICAgX2EgPSBfX3JlYWQobWl4KFthLCBiLCBjXSksIDMpLCBhID0gX2FbMF0sIGIgPSBfYVsxXSwgYyA9IF9hWzJdO1xuICAgIH1cbiAgICBhID0gYWRkMzIoYSwgd29yZEF0KHN0ciwgaSwgRW5kaWFuLkxpdHRsZSkpO1xuICAgIGIgPSBhZGQzMihiLCB3b3JkQXQoc3RyLCBpICsgNCwgRW5kaWFuLkxpdHRsZSkpO1xuICAgIC8vIHRoZSBmaXJzdCBieXRlIG9mIGMgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBsZW5ndGhcbiAgICBjID0gYWRkMzIoYywgbGVuKTtcbiAgICBjID0gYWRkMzIoYywgd29yZEF0KHN0ciwgaSArIDgsIEVuZGlhbi5MaXR0bGUpIDw8IDgpO1xuICAgIHJldHVybiBtaXgoW2EsIGIsIGNdKVsyXTtcbn1cbi8vIGNsYW5nLWZvcm1hdCBvZmZcbmZ1bmN0aW9uIG1peChfYSkge1xuICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMyksIGEgPSBfYlswXSwgYiA9IF9iWzFdLCBjID0gX2JbMl07XG4gICAgYSA9IHN1YjMyKGEsIGIpO1xuICAgIGEgPSBzdWIzMihhLCBjKTtcbiAgICBhIF49IGMgPj4+IDEzO1xuICAgIGIgPSBzdWIzMihiLCBjKTtcbiAgICBiID0gc3ViMzIoYiwgYSk7XG4gICAgYiBePSBhIDw8IDg7XG4gICAgYyA9IHN1YjMyKGMsIGEpO1xuICAgIGMgPSBzdWIzMihjLCBiKTtcbiAgICBjIF49IGIgPj4+IDEzO1xuICAgIGEgPSBzdWIzMihhLCBiKTtcbiAgICBhID0gc3ViMzIoYSwgYyk7XG4gICAgYSBePSBjID4+PiAxMjtcbiAgICBiID0gc3ViMzIoYiwgYyk7XG4gICAgYiA9IHN1YjMyKGIsIGEpO1xuICAgIGIgXj0gYSA8PCAxNjtcbiAgICBjID0gc3ViMzIoYywgYSk7XG4gICAgYyA9IHN1YjMyKGMsIGIpO1xuICAgIGMgXj0gYiA+Pj4gNTtcbiAgICBhID0gc3ViMzIoYSwgYik7XG4gICAgYSA9IHN1YjMyKGEsIGMpO1xuICAgIGEgXj0gYyA+Pj4gMztcbiAgICBiID0gc3ViMzIoYiwgYyk7XG4gICAgYiA9IHN1YjMyKGIsIGEpO1xuICAgIGIgXj0gYSA8PCAxMDtcbiAgICBjID0gc3ViMzIoYywgYSk7XG4gICAgYyA9IHN1YjMyKGMsIGIpO1xuICAgIGMgXj0gYiA+Pj4gMTU7XG4gICAgcmV0dXJuIFthLCBiLCBjXTtcbn1cbi8vIGNsYW5nLWZvcm1hdCBvblxuLy8gVXRpbHNcbnZhciBFbmRpYW47XG4oZnVuY3Rpb24gKEVuZGlhbikge1xuICAgIEVuZGlhbltFbmRpYW5bXCJMaXR0bGVcIl0gPSAwXSA9IFwiTGl0dGxlXCI7XG4gICAgRW5kaWFuW0VuZGlhbltcIkJpZ1wiXSA9IDFdID0gXCJCaWdcIjtcbn0pKEVuZGlhbiB8fCAoRW5kaWFuID0ge30pKTtcbmZ1bmN0aW9uIGFkZDMyKGEsIGIpIHtcbiAgICByZXR1cm4gYWRkMzJ0bzY0KGEsIGIpWzFdO1xufVxuZnVuY3Rpb24gYWRkMzJ0bzY0KGEsIGIpIHtcbiAgICB2YXIgbG93ID0gKGEgJiAweGZmZmYpICsgKGIgJiAweGZmZmYpO1xuICAgIHZhciBoaWdoID0gKGEgPj4+IDE2KSArIChiID4+PiAxNikgKyAobG93ID4+PiAxNik7XG4gICAgcmV0dXJuIFtoaWdoID4+PiAxNiwgKGhpZ2ggPDwgMTYpIHwgKGxvdyAmIDB4ZmZmZildO1xufVxuZnVuY3Rpb24gYWRkNjQoX2EsIF9iKSB7XG4gICAgdmFyIF9jID0gX19yZWFkKF9hLCAyKSwgYWggPSBfY1swXSwgYWwgPSBfY1sxXTtcbiAgICB2YXIgX2QgPSBfX3JlYWQoX2IsIDIpLCBiaCA9IF9kWzBdLCBibCA9IF9kWzFdO1xuICAgIHZhciBfZSA9IF9fcmVhZChhZGQzMnRvNjQoYWwsIGJsKSwgMiksIGNhcnJ5ID0gX2VbMF0sIGwgPSBfZVsxXTtcbiAgICB2YXIgaCA9IGFkZDMyKGFkZDMyKGFoLCBiaCksIGNhcnJ5KTtcbiAgICByZXR1cm4gW2gsIGxdO1xufVxuZnVuY3Rpb24gc3ViMzIoYSwgYikge1xuICAgIHZhciBsb3cgPSAoYSAmIDB4ZmZmZikgLSAoYiAmIDB4ZmZmZik7XG4gICAgdmFyIGhpZ2ggPSAoYSA+PiAxNikgLSAoYiA+PiAxNikgKyAobG93ID4+IDE2KTtcbiAgICByZXR1cm4gKGhpZ2ggPDwgMTYpIHwgKGxvdyAmIDB4ZmZmZik7XG59XG4vLyBSb3RhdGUgYSAzMmIgbnVtYmVyIGxlZnQgYGNvdW50YCBwb3NpdGlvblxuZnVuY3Rpb24gcm9sMzIoYSwgY291bnQpIHtcbiAgICByZXR1cm4gKGEgPDwgY291bnQpIHwgKGEgPj4+ICgzMiAtIGNvdW50KSk7XG59XG4vLyBSb3RhdGUgYSA2NGIgbnVtYmVyIGxlZnQgYGNvdW50YCBwb3NpdGlvblxuZnVuY3Rpb24gcm9sNjQoX2EsIGNvdW50KSB7XG4gICAgdmFyIF9iID0gX19yZWFkKF9hLCAyKSwgaGkgPSBfYlswXSwgbG8gPSBfYlsxXTtcbiAgICB2YXIgaCA9IChoaSA8PCBjb3VudCkgfCAobG8gPj4+ICgzMiAtIGNvdW50KSk7XG4gICAgdmFyIGwgPSAobG8gPDwgY291bnQpIHwgKGhpID4+PiAoMzIgLSBjb3VudCkpO1xuICAgIHJldHVybiBbaCwgbF07XG59XG5mdW5jdGlvbiBzdHJpbmdUb1dvcmRzMzIoc3RyLCBlbmRpYW4pIHtcbiAgICB2YXIgd29yZHMzMiA9IEFycmF5KChzdHIubGVuZ3RoICsgMykgPj4+IDIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMzMi5sZW5ndGg7IGkrKykge1xuICAgICAgICB3b3JkczMyW2ldID0gd29yZEF0KHN0ciwgaSAqIDQsIGVuZGlhbik7XG4gICAgfVxuICAgIHJldHVybiB3b3JkczMyO1xufVxuZnVuY3Rpb24gYnl0ZUF0KHN0ciwgaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPj0gc3RyLmxlbmd0aCA/IDAgOiBzdHIuY2hhckNvZGVBdChpbmRleCkgJiAweGZmO1xufVxuZnVuY3Rpb24gd29yZEF0KHN0ciwgaW5kZXgsIGVuZGlhbikge1xuICAgIHZhciB3b3JkID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSBFbmRpYW4uQmlnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB3b3JkICs9IGJ5dGVBdChzdHIsIGluZGV4ICsgaSkgPDwgKDI0IC0gOCAqIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgd29yZCArPSBieXRlQXQoc3RyLCBpbmRleCArIGkpIDw8IDggKiBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3b3JkO1xufVxuZnVuY3Rpb24gd29yZHMzMlRvQnl0ZVN0cmluZyh3b3JkczMyKSB7XG4gICAgcmV0dXJuIHdvcmRzMzIucmVkdWNlKGZ1bmN0aW9uIChzdHIsIHdvcmQpIHsgcmV0dXJuIHN0ciArIHdvcmQzMlRvQnl0ZVN0cmluZyh3b3JkKTsgfSwgJycpO1xufVxuZnVuY3Rpb24gd29yZDMyVG9CeXRlU3RyaW5nKHdvcmQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHdvcmQgPj4+IDggKiAoMyAtIGkpKSAmIDB4ZmYpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gYnl0ZVN0cmluZ1RvSGV4U3RyaW5nKHN0cikge1xuICAgIHZhciBoZXggPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYiA9IGJ5dGVBdChzdHIsIGkpO1xuICAgICAgICBoZXggKz0gKGIgPj4+IDQpLnRvU3RyaW5nKDE2KSArIChiICYgMHgwZikudG9TdHJpbmcoMTYpO1xuICAgIH1cbiAgICByZXR1cm4gaGV4LnRvTG93ZXJDYXNlKCk7XG59XG4vLyBiYXNlZCBvbiBodHRwOi8vd3d3LmRhbnZrLm9yZy9oZXgyZGVjLmh0bWwgKEpTIGNhbiBub3QgaGFuZGxlIG1vcmUgdGhhbiA1NmIpXG5mdW5jdGlvbiBieXRlU3RyaW5nVG9EZWNTdHJpbmcoc3RyKSB7XG4gICAgdmFyIGRlY2ltYWwgPSAnJztcbiAgICB2YXIgdG9UaGVQb3dlciA9ICcxJztcbiAgICBmb3IgKHZhciBpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGRlY2ltYWwgPSBhZGRCaWdJbnQoZGVjaW1hbCwgbnVtYmVyVGltZXNCaWdJbnQoYnl0ZUF0KHN0ciwgaSksIHRvVGhlUG93ZXIpKTtcbiAgICAgICAgdG9UaGVQb3dlciA9IG51bWJlclRpbWVzQmlnSW50KDI1NiwgdG9UaGVQb3dlcik7XG4gICAgfVxuICAgIHJldHVybiBkZWNpbWFsLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7XG59XG4vLyB4IGFuZCB5IGRlY2ltYWwsIGxvd2VzdCBzaWduaWZpY2FudCBkaWdpdCBmaXJzdFxuZnVuY3Rpb24gYWRkQmlnSW50KHgsIHkpIHtcbiAgICB2YXIgc3VtID0gJyc7XG4gICAgdmFyIGxlbiA9IE1hdGgubWF4KHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGNhcnJ5ID0gMDsgaSA8IGxlbiB8fCBjYXJyeTsgaSsrKSB7XG4gICAgICAgIHZhciB0bXBTdW0gPSBjYXJyeSArICsoeFtpXSB8fCAwKSArICsoeVtpXSB8fCAwKTtcbiAgICAgICAgaWYgKHRtcFN1bSA+PSAxMCkge1xuICAgICAgICAgICAgY2FycnkgPSAxO1xuICAgICAgICAgICAgc3VtICs9IHRtcFN1bSAtIDEwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FycnkgPSAwO1xuICAgICAgICAgICAgc3VtICs9IHRtcFN1bTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuZnVuY3Rpb24gbnVtYmVyVGltZXNCaWdJbnQobnVtLCBiKSB7XG4gICAgdmFyIHByb2R1Y3QgPSAnJztcbiAgICB2YXIgYlRvVGhlUG93ZXIgPSBiO1xuICAgIGZvciAoOyBudW0gIT09IDA7IG51bSA9IG51bSA+Pj4gMSkge1xuICAgICAgICBpZiAobnVtICYgMSlcbiAgICAgICAgICAgIHByb2R1Y3QgPSBhZGRCaWdJbnQocHJvZHVjdCwgYlRvVGhlUG93ZXIpO1xuICAgICAgICBiVG9UaGVQb3dlciA9IGFkZEJpZ0ludChiVG9UaGVQb3dlciwgYlRvVGhlUG93ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvZHVjdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFNlcmlhbGl6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VyaWFsaXplcigpIHtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIG5hbWUgbWFwcGVyLCBzZWUgYFBsYWNlaG9sZGVyTWFwcGVyYFxuICAgIC8vIFJldHVybmluZyBgbnVsbGAgbWVhbnMgdGhhdCBubyBuYW1lIG1hcHBpbmcgaXMgdXNlZC5cbiAgICBTZXJpYWxpemVyLnByb3RvdHlwZS5jcmVhdGVOYW1lTWFwcGVyID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXI7XG59KCkpO1xuLyoqXG4gKiBBIHNpbXBsZSBtYXBwZXIgdGhhdCB0YWtlIGEgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIGFuIGludGVybmFsIG5hbWUgdG8gYSBwdWJsaWMgbmFtZVxuICovXG52YXIgU2ltcGxlUGxhY2Vob2xkZXJNYXBwZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyLCBfc3VwZXIpO1xuICAgIC8vIGNyZWF0ZSBhIG1hcHBpbmcgZnJvbSB0aGUgbWVzc2FnZVxuICAgIGZ1bmN0aW9uIFNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyKG1lc3NhZ2UsIG1hcE5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubWFwTmFtZSA9IG1hcE5hbWU7XG4gICAgICAgIF90aGlzLmludGVybmFsVG9QdWJsaWMgPSB7fTtcbiAgICAgICAgX3RoaXMucHVibGljVG9OZXh0SWQgPSB7fTtcbiAgICAgICAgX3RoaXMucHVibGljVG9JbnRlcm5hbCA9IHt9O1xuICAgICAgICBtZXNzYWdlLm5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMpOyB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTaW1wbGVQbGFjZWhvbGRlck1hcHBlci5wcm90b3R5cGUudG9QdWJsaWNOYW1lID0gZnVuY3Rpb24gKGludGVybmFsTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFRvUHVibGljLmhhc093blByb3BlcnR5KGludGVybmFsTmFtZSkgP1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFRvUHVibGljW2ludGVybmFsTmFtZV0gOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9O1xuICAgIFNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyLnByb3RvdHlwZS50b0ludGVybmFsTmFtZSA9IGZ1bmN0aW9uIChwdWJsaWNOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnB1YmxpY1RvSW50ZXJuYWwuaGFzT3duUHJvcGVydHkocHVibGljTmFtZSkgPyB0aGlzLnB1YmxpY1RvSW50ZXJuYWxbcHVibGljTmFtZV0gOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9O1xuICAgIFNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBTaW1wbGVQbGFjZWhvbGRlck1hcHBlci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnZpc2l0UGxhY2Vob2xkZXJOYW1lKHBoLnN0YXJ0TmFtZSk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlci5jYWxsKHRoaXMsIHBoLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy52aXNpdFBsYWNlaG9sZGVyTmFtZShwaC5jbG9zZU5hbWUpO1xuICAgIH07XG4gICAgU2ltcGxlUGxhY2Vob2xkZXJNYXBwZXIucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHsgdGhpcy52aXNpdFBsYWNlaG9sZGVyTmFtZShwaC5uYW1lKTsgfTtcbiAgICBTaW1wbGVQbGFjZWhvbGRlck1hcHBlci5wcm90b3R5cGUudmlzaXRJY3VQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnZpc2l0UGxhY2Vob2xkZXJOYW1lKHBoLm5hbWUpO1xuICAgIH07XG4gICAgLy8gWE1CIHBsYWNlaG9sZGVycyBjb3VsZCBvbmx5IGNvbnRhaW5zIEEtWiwgMC05IGFuZCBfXG4gICAgU2ltcGxlUGxhY2Vob2xkZXJNYXBwZXIucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXJOYW1lID0gZnVuY3Rpb24gKGludGVybmFsTmFtZSkge1xuICAgICAgICBpZiAoIWludGVybmFsTmFtZSB8fCB0aGlzLmludGVybmFsVG9QdWJsaWMuaGFzT3duUHJvcGVydHkoaW50ZXJuYWxOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwdWJsaWNOYW1lID0gdGhpcy5tYXBOYW1lKGludGVybmFsTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnB1YmxpY1RvSW50ZXJuYWwuaGFzT3duUHJvcGVydHkocHVibGljTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBYTUIgd2hlbiBpdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWRcbiAgICAgICAgICAgIHZhciBuZXh0SWQgPSB0aGlzLnB1YmxpY1RvTmV4dElkW3B1YmxpY05hbWVdO1xuICAgICAgICAgICAgdGhpcy5wdWJsaWNUb05leHRJZFtwdWJsaWNOYW1lXSA9IG5leHRJZCArIDE7XG4gICAgICAgICAgICBwdWJsaWNOYW1lID0gcHVibGljTmFtZSArIFwiX1wiICsgbmV4dElkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wdWJsaWNUb05leHRJZFtwdWJsaWNOYW1lXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcm5hbFRvUHVibGljW2ludGVybmFsTmFtZV0gPSBwdWJsaWNOYW1lO1xuICAgICAgICB0aGlzLnB1YmxpY1RvSW50ZXJuYWxbcHVibGljTmFtZV0gPSBpbnRlcm5hbE5hbWU7XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlUGxhY2Vob2xkZXJNYXBwZXI7XG59KFJlY3Vyc2VWaXNpdG9yKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfVmlzaXRvcigpIHtcbiAgICB9XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0VGFnID0gZnVuY3Rpb24gKHRhZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyQXR0cnMgPSB0aGlzLl9zZXJpYWxpemVBdHRyaWJ1dGVzKHRhZy5hdHRycyk7XG4gICAgICAgIGlmICh0YWcuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIjxcIiArIHRhZy5uYW1lICsgc3RyQXR0cnMgKyBcIi8+XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0ckNoaWxkcmVuID0gdGFnLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pO1xuICAgICAgICByZXR1cm4gXCI8XCIgKyB0YWcubmFtZSArIHN0ckF0dHJzICsgXCI+XCIgKyBzdHJDaGlsZHJlbi5qb2luKCcnKSArIFwiPC9cIiArIHRhZy5uYW1lICsgXCI+XCI7XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsgcmV0dXJuIHRleHQudmFsdWU7IH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoZGVjbCkge1xuICAgICAgICByZXR1cm4gXCI8P3htbFwiICsgdGhpcy5fc2VyaWFsaXplQXR0cmlidXRlcyhkZWNsLmF0dHJzKSArIFwiID8+XCI7XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX3NlcmlhbGl6ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cnMpIHtcbiAgICAgICAgdmFyIHN0ckF0dHJzID0gT2JqZWN0LmtleXMoYXR0cnMpLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbmFtZSArIFwiPVxcXCJcIiArIGF0dHJzW25hbWVdICsgXCJcXFwiXCI7IH0pLmpvaW4oJyAnKTtcbiAgICAgICAgcmV0dXJuIHN0ckF0dHJzLmxlbmd0aCA+IDAgPyAnICcgKyBzdHJBdHRycyA6ICcnO1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0RG9jdHlwZSA9IGZ1bmN0aW9uIChkb2N0eXBlKSB7XG4gICAgICAgIHJldHVybiBcIjwhRE9DVFlQRSBcIiArIGRvY3R5cGUucm9vdFRhZyArIFwiIFtcXG5cIiArIGRvY3R5cGUuZHRkICsgXCJcXG5dPlwiO1xuICAgIH07XG4gICAgcmV0dXJuIF9WaXNpdG9yO1xufSgpKTtcbnZhciBfdmlzaXRvciA9IG5ldyBfVmlzaXRvcigpO1xuZnVuY3Rpb24gc2VyaWFsaXplKG5vZGVzKSB7XG4gICAgcmV0dXJuIG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdmlzaXRvcik7IH0pLmpvaW4oJycpO1xufVxudmFyIERlY2xhcmF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlY2xhcmF0aW9uKHVuZXNjYXBlZEF0dHJzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuYXR0cnMgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXModW5lc2NhcGVkQXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIF90aGlzLmF0dHJzW2tdID0gZXNjYXBlWG1sKHVuZXNjYXBlZEF0dHJzW2tdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIERlY2xhcmF0aW9uLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RGVjbGFyYXRpb24odGhpcyk7IH07XG4gICAgcmV0dXJuIERlY2xhcmF0aW9uO1xufSgpKTtcbnZhciBEb2N0eXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERvY3R5cGUocm9vdFRhZywgZHRkKSB7XG4gICAgICAgIHRoaXMucm9vdFRhZyA9IHJvb3RUYWc7XG4gICAgICAgIHRoaXMuZHRkID0gZHRkO1xuICAgIH1cbiAgICBEb2N0eXBlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RG9jdHlwZSh0aGlzKTsgfTtcbiAgICByZXR1cm4gRG9jdHlwZTtcbn0oKSk7XG52YXIgVGFnID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRhZyhuYW1lLCB1bmVzY2FwZWRBdHRycywgY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHVuZXNjYXBlZEF0dHJzID09PSB2b2lkIDApIHsgdW5lc2NhcGVkQXR0cnMgPSB7fTsgfVxuICAgICAgICBpZiAoY2hpbGRyZW4gPT09IHZvaWQgMCkgeyBjaGlsZHJlbiA9IFtdOyB9XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5hdHRycyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyh1bmVzY2FwZWRBdHRycykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgX3RoaXMuYXR0cnNba10gPSBlc2NhcGVYbWwodW5lc2NhcGVkQXR0cnNba10pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgVGFnLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGFnKHRoaXMpOyB9O1xuICAgIHJldHVybiBUYWc7XG59KCkpO1xudmFyIFRleHQkMiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZXh0KHVuZXNjYXBlZFZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBlc2NhcGVYbWwodW5lc2NhcGVkVmFsdWUpO1xuICAgIH1cbiAgICBUZXh0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yKSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzKTsgfTtcbiAgICByZXR1cm4gVGV4dDtcbn0oKSk7XG52YXIgQ1IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENSLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIENSKHdzKSB7XG4gICAgICAgIGlmICh3cyA9PT0gdm9pZCAwKSB7IHdzID0gMDsgfVxuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcXG5cIiArIG5ldyBBcnJheSh3cyArIDEpLmpvaW4oJyAnKSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIENSO1xufShUZXh0JDIpKTtcbnZhciBfRVNDQVBFRF9DSEFSUyA9IFtcbiAgICBbLyYvZywgJyZhbXA7J10sXG4gICAgWy9cIi9nLCAnJnF1b3Q7J10sXG4gICAgWy8nL2csICcmYXBvczsnXSxcbiAgICBbLzwvZywgJyZsdDsnXSxcbiAgICBbLz4vZywgJyZndDsnXSxcbl07XG4vLyBFc2NhcGUgYF9FU0NBUEVEX0NIQVJTYCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiB0ZXh0IHdpdGggZW5jb2RlZCBlbnRpdGllc1xuZnVuY3Rpb24gZXNjYXBlWG1sKHRleHQpIHtcbiAgICByZXR1cm4gX0VTQ0FQRURfQ0hBUlMucmVkdWNlKGZ1bmN0aW9uICh0ZXh0LCBlbnRyeSkgeyByZXR1cm4gdGV4dC5yZXBsYWNlKGVudHJ5WzBdLCBlbnRyeVsxXSk7IH0sIHRleHQpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX01FU1NBR0VTX1RBRyA9ICdtZXNzYWdlYnVuZGxlJztcbnZhciBfTUVTU0FHRV9UQUcgPSAnbXNnJztcbnZhciBfUExBQ0VIT0xERVJfVEFHID0gJ3BoJztcbnZhciBfRVhBTVBMRV9UQUcgPSAnZXgnO1xudmFyIF9TT1VSQ0VfVEFHID0gJ3NvdXJjZSc7XG52YXIgX0RPQ1RZUEUgPSBcIjwhRUxFTUVOVCBtZXNzYWdlYnVuZGxlIChtc2cpKj5cXG48IUFUVExJU1QgbWVzc2FnZWJ1bmRsZSBjbGFzcyBDREFUQSAjSU1QTElFRD5cXG5cXG48IUVMRU1FTlQgbXNnICgjUENEQVRBfHBofHNvdXJjZSkqPlxcbjwhQVRUTElTVCBtc2cgaWQgQ0RBVEEgI0lNUExJRUQ+XFxuPCFBVFRMSVNUIG1zZyBzZXEgQ0RBVEEgI0lNUExJRUQ+XFxuPCFBVFRMSVNUIG1zZyBuYW1lIENEQVRBICNJTVBMSUVEPlxcbjwhQVRUTElTVCBtc2cgZGVzYyBDREFUQSAjSU1QTElFRD5cXG48IUFUVExJU1QgbXNnIG1lYW5pbmcgQ0RBVEEgI0lNUExJRUQ+XFxuPCFBVFRMSVNUIG1zZyBvYnNvbGV0ZSAob2Jzb2xldGUpICNJTVBMSUVEPlxcbjwhQVRUTElTVCBtc2cgeG1sOnNwYWNlIChkZWZhdWx0fHByZXNlcnZlKSBcXFwiZGVmYXVsdFxcXCI+XFxuPCFBVFRMSVNUIG1zZyBpc19oaWRkZW4gQ0RBVEEgI0lNUExJRUQ+XFxuXFxuPCFFTEVNRU5UIHNvdXJjZSAoI1BDREFUQSk+XFxuXFxuPCFFTEVNRU5UIHBoICgjUENEQVRBfGV4KSo+XFxuPCFBVFRMSVNUIHBoIG5hbWUgQ0RBVEEgI1JFUVVJUkVEPlxcblxcbjwhRUxFTUVOVCBleCAoI1BDREFUQSk+XCI7XG52YXIgWG1iID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhYbWIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gWG1iKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFhtYi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAobWVzc2FnZXMsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZXhhbXBsZVZpc2l0b3IgPSBuZXcgRXhhbXBsZVZpc2l0b3IoKTtcbiAgICAgICAgdmFyIHZpc2l0b3IgPSBuZXcgX1Zpc2l0b3IkMSgpO1xuICAgICAgICB2YXIgcm9vdE5vZGUgPSBuZXcgVGFnKF9NRVNTQUdFU19UQUcpO1xuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB2YXIgYXR0cnMgPSB7IGlkOiBtZXNzYWdlLmlkIH07XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGF0dHJzWydkZXNjJ10gPSBtZXNzYWdlLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVhbmluZykge1xuICAgICAgICAgICAgICAgIGF0dHJzWydtZWFuaW5nJ10gPSBtZXNzYWdlLm1lYW5pbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc291cmNlVGFncyA9IFtdO1xuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZVRhZ3MucHVzaChuZXcgVGFnKF9TT1VSQ0VfVEFHLCB7fSwgW1xuICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dCQyKHNvdXJjZS5maWxlUGF0aCArIFwiOlwiICsgc291cmNlLnN0YXJ0TGluZSArIChzb3VyY2UuZW5kTGluZSAhPT0gc291cmNlLnN0YXJ0TGluZSA/ICcsJyArIHNvdXJjZS5lbmRMaW5lIDogJycpKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcm9vdE5vZGUuY2hpbGRyZW4ucHVzaChuZXcgQ1IoMiksIG5ldyBUYWcoX01FU1NBR0VfVEFHLCBhdHRycywgX19zcHJlYWQoc291cmNlVGFncywgdmlzaXRvci5zZXJpYWxpemUobWVzc2FnZS5ub2RlcykpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByb290Tm9kZS5jaGlsZHJlbi5wdXNoKG5ldyBDUigpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZShbXG4gICAgICAgICAgICBuZXcgRGVjbGFyYXRpb24oeyB2ZXJzaW9uOiAnMS4wJywgZW5jb2Rpbmc6ICdVVEYtOCcgfSksXG4gICAgICAgICAgICBuZXcgQ1IoKSxcbiAgICAgICAgICAgIG5ldyBEb2N0eXBlKF9NRVNTQUdFU19UQUcsIF9ET0NUWVBFKSxcbiAgICAgICAgICAgIG5ldyBDUigpLFxuICAgICAgICAgICAgZXhhbXBsZVZpc2l0b3IuYWRkRGVmYXVsdEV4YW1wbGVzKHJvb3ROb2RlKSxcbiAgICAgICAgICAgIG5ldyBDUigpLFxuICAgICAgICBdKTtcbiAgICB9O1xuICAgIFhtYi5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChjb250ZW50LCB1cmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCcpO1xuICAgIH07XG4gICAgWG1iLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiAobWVzc2FnZSkgeyByZXR1cm4gZGlnZXN0JDEobWVzc2FnZSk7IH07XG4gICAgWG1iLnByb3RvdHlwZS5jcmVhdGVOYW1lTWFwcGVyID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVQbGFjZWhvbGRlck1hcHBlcihtZXNzYWdlLCB0b1B1YmxpY05hbWUpO1xuICAgIH07XG4gICAgcmV0dXJuIFhtYjtcbn0oU2VyaWFsaXplcikpO1xudmFyIF9WaXNpdG9yJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX1Zpc2l0b3IoKSB7XG4gICAgfVxuICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gW25ldyBUZXh0JDIodGV4dC52YWx1ZSldOyB9O1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXIsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICAgIGNvbnRhaW5lci5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2Rlcy5wdXNoLmFwcGx5KG5vZGVzLCBfX3NwcmVhZChub2RlLnZpc2l0KF90aGlzKSkpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1ID0gZnVuY3Rpb24gKGljdSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZXMgPSBbbmV3IFRleHQkMihcIntcIiArIGljdS5leHByZXNzaW9uUGxhY2Vob2xkZXIgKyBcIiwgXCIgKyBpY3UudHlwZSArIFwiLCBcIildO1xuICAgICAgICBPYmplY3Qua2V5cyhpY3UuY2FzZXMpLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIF9fc3ByZWFkKFtuZXcgVGV4dCQyKGMgKyBcIiB7XCIpXSwgaWN1LmNhc2VzW2NdLnZpc2l0KF90aGlzKSwgW25ldyBUZXh0JDIoXCJ9IFwiKV0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG5vZGVzLnB1c2gobmV3IFRleHQkMihcIn1cIikpO1xuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgc3RhcnRUYWdBc1RleHQgPSBuZXcgVGV4dCQyKFwiPFwiICsgcGgudGFnICsgXCI+XCIpO1xuICAgICAgICB2YXIgc3RhcnRFeCA9IG5ldyBUYWcoX0VYQU1QTEVfVEFHLCB7fSwgW3N0YXJ0VGFnQXNUZXh0XSk7XG4gICAgICAgIC8vIFRDIHJlcXVpcmVzIFBIIHRvIGhhdmUgYSBub24gZW1wdHkgRVgsIGFuZCB1c2VzIHRoZSB0ZXh0IG5vZGUgdG8gc2hvdyB0aGUgXCJvcmlnaW5hbFwiIHZhbHVlLlxuICAgICAgICB2YXIgc3RhcnRUYWdQaCA9IG5ldyBUYWcoX1BMQUNFSE9MREVSX1RBRywgeyBuYW1lOiBwaC5zdGFydE5hbWUgfSwgW3N0YXJ0RXgsIHN0YXJ0VGFnQXNUZXh0XSk7XG4gICAgICAgIGlmIChwaC5pc1ZvaWQpIHtcbiAgICAgICAgICAgIC8vIHZvaWQgdGFncyBoYXZlIG5vIGNoaWxkcmVuIG5vciBjbG9zaW5nIHRhZ3NcbiAgICAgICAgICAgIHJldHVybiBbc3RhcnRUYWdQaF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNsb3NlVGFnQXNUZXh0ID0gbmV3IFRleHQkMihcIjwvXCIgKyBwaC50YWcgKyBcIj5cIik7XG4gICAgICAgIHZhciBjbG9zZUV4ID0gbmV3IFRhZyhfRVhBTVBMRV9UQUcsIHt9LCBbY2xvc2VUYWdBc1RleHRdKTtcbiAgICAgICAgLy8gVEMgcmVxdWlyZXMgUEggdG8gaGF2ZSBhIG5vbiBlbXB0eSBFWCwgYW5kIHVzZXMgdGhlIHRleHQgbm9kZSB0byBzaG93IHRoZSBcIm9yaWdpbmFsXCIgdmFsdWUuXG4gICAgICAgIHZhciBjbG9zZVRhZ1BoID0gbmV3IFRhZyhfUExBQ0VIT0xERVJfVEFHLCB7IG5hbWU6IHBoLmNsb3NlTmFtZSB9LCBbY2xvc2VFeCwgY2xvc2VUYWdBc1RleHRdKTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkKFtzdGFydFRhZ1BoXSwgdGhpcy5zZXJpYWxpemUocGguY2hpbGRyZW4pLCBbY2xvc2VUYWdQaF0pO1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGludGVycG9sYXRpb25Bc1RleHQgPSBuZXcgVGV4dCQyKFwie3tcIiArIHBoLnZhbHVlICsgXCJ9fVwiKTtcbiAgICAgICAgLy8gRXhhbXBsZSB0YWcgbmVlZHMgdG8gYmUgbm90LWVtcHR5IGZvciBUQy5cbiAgICAgICAgdmFyIGV4VGFnID0gbmV3IFRhZyhfRVhBTVBMRV9UQUcsIHt9LCBbaW50ZXJwb2xhdGlvbkFzVGV4dF0pO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLy8gVEMgcmVxdWlyZXMgUEggdG8gaGF2ZSBhIG5vbiBlbXB0eSBFWCwgYW5kIHVzZXMgdGhlIHRleHQgbm9kZSB0byBzaG93IHRoZSBcIm9yaWdpbmFsXCIgdmFsdWUuXG4gICAgICAgICAgICBuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUcsIHsgbmFtZTogcGgubmFtZSB9LCBbZXhUYWcsIGludGVycG9sYXRpb25Bc1RleHRdKVxuICAgICAgICBdO1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGljdUV4cHJlc3Npb24gPSBwaC52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB2YXIgaWN1VHlwZSA9IHBoLnZhbHVlLnR5cGU7XG4gICAgICAgIHZhciBpY3VDYXNlcyA9IE9iamVjdC5rZXlzKHBoLnZhbHVlLmNhc2VzKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSArICcgey4uLn0nOyB9KS5qb2luKCcgJyk7XG4gICAgICAgIHZhciBpY3VBc1RleHQgPSBuZXcgVGV4dCQyKFwie1wiICsgaWN1RXhwcmVzc2lvbiArIFwiLCBcIiArIGljdVR5cGUgKyBcIiwgXCIgKyBpY3VDYXNlcyArIFwifVwiKTtcbiAgICAgICAgdmFyIGV4VGFnID0gbmV3IFRhZyhfRVhBTVBMRV9UQUcsIHt9LCBbaWN1QXNUZXh0XSk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAvLyBUQyByZXF1aXJlcyBQSCB0byBoYXZlIGEgbm9uIGVtcHR5IEVYLCBhbmQgdXNlcyB0aGUgdGV4dCBub2RlIHRvIHNob3cgdGhlIFwib3JpZ2luYWxcIiB2YWx1ZS5cbiAgICAgICAgICAgIG5ldyBUYWcoX1BMQUNFSE9MREVSX1RBRywgeyBuYW1lOiBwaC5uYW1lIH0sIFtleFRhZywgaWN1QXNUZXh0XSlcbiAgICAgICAgXTtcbiAgICB9O1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgX19zcHJlYWQobm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSkpKTtcbiAgICB9O1xuICAgIHJldHVybiBfVmlzaXRvcjtcbn0oKSk7XG5mdW5jdGlvbiBkaWdlc3QkMShtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGRlY2ltYWxEaWdlc3QobWVzc2FnZSk7XG59XG4vLyBUQyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgbm9uLWVtcHR5IGV4YW1wbGUgb24gcGxhY2Vob2xkZXJzXG52YXIgRXhhbXBsZVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXhhbXBsZVZpc2l0b3IoKSB7XG4gICAgfVxuICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS5hZGREZWZhdWx0RXhhbXBsZXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBub2RlLnZpc2l0KHRoaXMpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZyA9IGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRhZy5uYW1lID09PSBfUExBQ0VIT0xERVJfVEFHKSB7XG4gICAgICAgICAgICBpZiAoIXRhZy5jaGlsZHJlbiB8fCB0YWcuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhUZXh0ID0gbmV3IFRleHQkMih0YWcuYXR0cnNbJ25hbWUnXSB8fCAnLi4uJyk7XG4gICAgICAgICAgICAgICAgdGFnLmNoaWxkcmVuID0gW25ldyBUYWcoX0VYQU1QTEVfVEFHLCB7fSwgW2V4VGV4dF0pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0YWcuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRhZy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCkgeyB9O1xuICAgIEV4YW1wbGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKGRlY2wpIHsgfTtcbiAgICBFeGFtcGxlVmlzaXRvci5wcm90b3R5cGUudmlzaXREb2N0eXBlID0gZnVuY3Rpb24gKGRvY3R5cGUpIHsgfTtcbiAgICByZXR1cm4gRXhhbXBsZVZpc2l0b3I7XG59KCkpO1xuLy8gWE1CL1hUQiBwbGFjZWhvbGRlcnMgY2FuIG9ubHkgY29udGFpbiBBLVosIDAtOSBhbmQgX1xuZnVuY3Rpb24gdG9QdWJsaWNOYW1lKGludGVybmFsTmFtZSkge1xuICAgIHJldHVybiBpbnRlcm5hbE5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9bXkEtWjAtOV9dL2csICdfJyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIG1hcExpdGVyYWwob2JqLCBxdW90ZWQpIHtcbiAgICBpZiAocXVvdGVkID09PSB2b2lkIDApIHsgcXVvdGVkID0gZmFsc2U7IH1cbiAgICByZXR1cm4gbGl0ZXJhbE1hcChPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcXVvdGVkOiBxdW90ZWQsXG4gICAgICAgIHZhbHVlOiBvYmpba2V5XSxcbiAgICB9KTsgfSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKiBDbG9zdXJlIHZhcmlhYmxlcyBob2xkaW5nIG1lc3NhZ2VzIG11c3QgYmUgbmFtZWQgYE1TR19bQS1aMC05XStgICovXG52YXIgQ0xPU1VSRV9UUkFOU0xBVElPTl9QUkVGSVggPSAnTVNHXyc7XG4vKiBQcmVmaXggZm9yIG5vbi1gZ29vZy5nZXRNc2dgIGkxOG4tcmVsYXRlZCB2YXJzICovXG52YXIgVFJBTlNMQVRJT05fUFJFRklYID0gJ0kxOE5fJztcbi8qKiBDbG9zdXJlIHVzZXMgYGdvb2cuZ2V0TXNnKG1lc3NhZ2UpYCB0byBsb29rdXAgdHJhbnNsYXRpb25zICovXG52YXIgR09PR19HRVRfTVNHID0gJ2dvb2cuZ2V0TXNnJztcbi8qKiBOYW1lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB3ZSB1c2UgQ2xvc3VyZSB0cmFuc2xhdGlvbnMgb3Igbm90ICovXG52YXIgTkdfSTE4Tl9DTE9TVVJFX01PREUgPSAnbmdJMThuQ2xvc3VyZU1vZGUnO1xuLyoqIEkxOG4gc2VwYXJhdG9ycyBmb3IgbWV0YWRhdGEgKiovXG52YXIgSTE4Tl9NRUFOSU5HX1NFUEFSQVRPUiA9ICd8JztcbnZhciBJMThOX0lEX1NFUEFSQVRPUiA9ICdAQCc7XG4vKiogTmFtZSBvZiB0aGUgaTE4biBhdHRyaWJ1dGVzICoqL1xudmFyIEkxOE5fQVRUUiA9ICdpMThuJztcbnZhciBJMThOX0FUVFJfUFJFRklYID0gJ2kxOG4tJztcbi8qKiBQcmVmaXggb2YgdmFyIGV4cHJlc3Npb25zIHVzZWQgaW4gSUNVcyAqL1xudmFyIEkxOE5fSUNVX1ZBUl9QUkVGSVggPSAnVkFSXyc7XG4vKiogUHJlZml4IG9mIElDVSBleHByZXNzaW9ucyBmb3IgcG9zdCBwcm9jZXNzaW5nICovXG52YXIgSTE4Tl9JQ1VfTUFQUElOR19QUkVGSVggPSAnSTE4Tl9FWFBfJztcbi8qKiBQbGFjZWhvbGRlciB3cmFwcGVyIGZvciBpMThuIGV4cHJlc3Npb25zICoqL1xudmFyIEkxOE5fUExBQ0VIT0xERVJfU1lNQk9MID0gJ++/vSc7XG5mdW5jdGlvbiBpMThuVHJhbnNsYXRpb25Ub0RlY2xTdG10KHZhcmlhYmxlJDEsIGNsb3N1cmVWYXIsIG1lc3NhZ2UsIG1ldGEsIHBhcmFtcykge1xuICAgIHZhciBzdGF0ZW1lbnRzID0gW107XG4gICAgLy8gdmFyIEkxOE5fWDtcbiAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IERlY2xhcmVWYXJTdG10KHZhcmlhYmxlJDEubmFtZSwgdW5kZWZpbmVkLCBJTkZFUlJFRF9UWVBFLCBudWxsLCB2YXJpYWJsZSQxLnNvdXJjZVNwYW4pKTtcbiAgICB2YXIgYXJncyA9IFtsaXRlcmFsKG1lc3NhZ2UpXTtcbiAgICBpZiAocGFyYW1zICYmIE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAgIGFyZ3MucHVzaChtYXBMaXRlcmFsKHBhcmFtcywgdHJ1ZSkpO1xuICAgIH1cbiAgICAvLyBDbG9zdXJlIEpTRG9jIGNvbW1lbnRzXG4gICAgdmFyIGRvY1N0YXRlbWVudHMgPSBpMThuTWV0YVRvRG9jU3RtdChtZXRhKTtcbiAgICB2YXIgdGhlblN0YXRlbWVudHMgPSBkb2NTdGF0ZW1lbnRzID8gW2RvY1N0YXRlbWVudHNdIDogW107XG4gICAgdmFyIGdvb2dGbkNhbGwgPSB2YXJpYWJsZShHT09HX0dFVF9NU0cpLmNhbGxGbihhcmdzKTtcbiAgICAvLyBjb25zdCBNU0dfLi4uID0gZ29vZy5nZXRNc2coLi4pO1xuICAgIHRoZW5TdGF0ZW1lbnRzLnB1c2goY2xvc3VyZVZhci5zZXQoZ29vZ0ZuQ2FsbCkudG9Db25zdERlY2woKSk7XG4gICAgLy8gSTE4Tl9YID0gTVNHXy4uLjtcbiAgICB0aGVuU3RhdGVtZW50cy5wdXNoKG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KHZhcmlhYmxlJDEuc2V0KGNsb3N1cmVWYXIpKSk7XG4gICAgdmFyIGxvY2FsaXplRm5DYWxsID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmkxOG5Mb2NhbGl6ZSkuY2FsbEZuKGFyZ3MpO1xuICAgIC8vIEkxOE5fWCA9IGkxOG5Mb2NhbGl6ZSguLi4pO1xuICAgIHZhciBlbHNlU3RhdGVtZW50cyA9IFtuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh2YXJpYWJsZSQxLnNldChsb2NhbGl6ZUZuQ2FsbCkpXTtcbiAgICAvLyBpZihuZ0kxOG5DbG9zdXJlTW9kZSkgeyAuLi4gfSBlbHNlIHsgLi4uIH1cbiAgICBzdGF0ZW1lbnRzLnB1c2goaWZTdG10KHZhcmlhYmxlKE5HX0kxOE5fQ0xPU1VSRV9NT0RFKSwgdGhlblN0YXRlbWVudHMsIGVsc2VTdGF0ZW1lbnRzKSk7XG4gICAgcmV0dXJuIHN0YXRlbWVudHM7XG59XG4vLyBDb252ZXJ0cyBpMThuIG1ldGEgaW5mb3JtYXRpb24gZm9yIGEgbWVzc2FnZSAoaWQsIGRlc2NyaXB0aW9uLCBtZWFuaW5nKVxuLy8gdG8gYSBKc0RvYyBzdGF0ZW1lbnQgZm9ybWF0dGVkIGFzIGV4cGVjdGVkIGJ5IHRoZSBDbG9zdXJlIGNvbXBpbGVyLlxuZnVuY3Rpb24gaTE4bk1ldGFUb0RvY1N0bXQobWV0YSkge1xuICAgIHZhciB0YWdzID0gW107XG4gICAgaWYgKG1ldGEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGFncy5wdXNoKHsgdGFnTmFtZTogXCJkZXNjXCIgLyogRGVzYyAqLywgdGV4dDogbWV0YS5kZXNjcmlwdGlvbiB9KTtcbiAgICB9XG4gICAgaWYgKG1ldGEubWVhbmluZykge1xuICAgICAgICB0YWdzLnB1c2goeyB0YWdOYW1lOiBcIm1lYW5pbmdcIiAvKiBNZWFuaW5nICovLCB0ZXh0OiBtZXRhLm1lYW5pbmcgfSk7XG4gICAgfVxuICAgIHJldHVybiB0YWdzLmxlbmd0aCA9PSAwID8gbnVsbCA6IG5ldyBKU0RvY0NvbW1lbnRTdG10KHRhZ3MpO1xufVxuZnVuY3Rpb24gaXNJMThuQXR0cmlidXRlKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZSA9PT0gSTE4Tl9BVFRSIHx8IG5hbWUuc3RhcnRzV2l0aChJMThOX0FUVFJfUFJFRklYKTtcbn1cbmZ1bmN0aW9uIGlzSTE4blJvb3ROb2RlKG1ldGEpIHtcbiAgICByZXR1cm4gbWV0YSBpbnN0YW5jZW9mIE1lc3NhZ2U7XG59XG5mdW5jdGlvbiBpc1NpbmdsZUkxOG5JY3UobWV0YSkge1xuICAgIHJldHVybiBpc0kxOG5Sb290Tm9kZShtZXRhKSAmJiBtZXRhLm5vZGVzLmxlbmd0aCA9PT0gMSAmJiBtZXRhLm5vZGVzWzBdIGluc3RhbmNlb2YgSWN1JDE7XG59XG5mdW5jdGlvbiBoYXNJMThuQXR0cnMoZWxlbWVudCkge1xuICAgIHJldHVybiBlbGVtZW50LmF0dHJzLnNvbWUoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGlzSTE4bkF0dHJpYnV0ZShhdHRyLm5hbWUpOyB9KTtcbn1cbmZ1bmN0aW9uIG1ldGFGcm9tSTE4bk1lc3NhZ2UobWVzc2FnZSwgaWQpIHtcbiAgICBpZiAoaWQgPT09IHZvaWQgMCkgeyBpZCA9IG51bGw7IH1cbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGlkIDogbWVzc2FnZS5pZCB8fCAnJyxcbiAgICAgICAgbWVhbmluZzogbWVzc2FnZS5tZWFuaW5nIHx8ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogbWVzc2FnZS5kZXNjcmlwdGlvbiB8fCAnJ1xuICAgIH07XG59XG5mdW5jdGlvbiBpY3VGcm9tSTE4bk1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlLm5vZGVzWzBdO1xufVxuZnVuY3Rpb24gd3JhcEkxOG5QbGFjZWhvbGRlcihjb250ZW50LCBjb250ZXh0SWQpIHtcbiAgICBpZiAoY29udGV4dElkID09PSB2b2lkIDApIHsgY29udGV4dElkID0gMDsgfVxuICAgIHZhciBibG9ja0lkID0gY29udGV4dElkID4gMCA/IFwiOlwiICsgY29udGV4dElkIDogJyc7XG4gICAgcmV0dXJuIFwiXCIgKyBJMThOX1BMQUNFSE9MREVSX1NZTUJPTCArIGNvbnRlbnQgKyBibG9ja0lkICsgSTE4Tl9QTEFDRUhPTERFUl9TWU1CT0w7XG59XG5mdW5jdGlvbiBhc3NlbWJsZUkxOG5Cb3VuZFN0cmluZyhzdHJpbmdzLCBiaW5kaW5nU3RhcnRJbmRleCwgY29udGV4dElkKSB7XG4gICAgaWYgKGJpbmRpbmdTdGFydEluZGV4ID09PSB2b2lkIDApIHsgYmluZGluZ1N0YXJ0SW5kZXggPSAwOyB9XG4gICAgaWYgKGNvbnRleHRJZCA9PT0gdm9pZCAwKSB7IGNvbnRleHRJZCA9IDA7IH1cbiAgICBpZiAoIXN0cmluZ3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgdmFyIGFjYyA9ICcnO1xuICAgIHZhciBsYXN0SWR4ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkeDsgaSsrKSB7XG4gICAgICAgIGFjYyArPSBcIlwiICsgc3RyaW5nc1tpXSArIHdyYXBJMThuUGxhY2Vob2xkZXIoYmluZGluZ1N0YXJ0SW5kZXggKyBpLCBjb250ZXh0SWQpO1xuICAgIH1cbiAgICBhY2MgKz0gc3RyaW5nc1tsYXN0SWR4XTtcbiAgICByZXR1cm4gYWNjO1xufVxuZnVuY3Rpb24gZ2V0U2VxTnVtYmVyR2VuZXJhdG9yKHN0YXJ0c0F0KSB7XG4gICAgaWYgKHN0YXJ0c0F0ID09PSB2b2lkIDApIHsgc3RhcnRzQXQgPSAwOyB9XG4gICAgdmFyIGN1cnJlbnQgPSBzdGFydHNBdDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gY3VycmVudCsrOyB9O1xufVxuZnVuY3Rpb24gcGxhY2Vob2xkZXJzVG9QYXJhbXMocGxhY2Vob2xkZXJzKSB7XG4gICAgdmFyIHBhcmFtcyA9IHt9O1xuICAgIHBsYWNlaG9sZGVycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZXMsIGtleSkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IGxpdGVyYWwodmFsdWVzLmxlbmd0aCA+IDEgPyBcIltcIiArIHZhbHVlcy5qb2luKCd8JykgKyBcIl1cIiA6IHZhbHVlc1swXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbmZ1bmN0aW9uIHVwZGF0ZVBsYWNlaG9sZGVyTWFwKG1hcCwgbmFtZSkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YWx1ZXNbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBjdXJyZW50ID0gbWFwLmdldChuYW1lKSB8fCBbXTtcbiAgICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgX19zcHJlYWQodmFsdWVzKSk7XG4gICAgbWFwLnNldChuYW1lLCBjdXJyZW50KTtcbn1cbmZ1bmN0aW9uIGFzc2VtYmxlQm91bmRUZXh0UGxhY2Vob2xkZXJzKG1ldGEsIGJpbmRpbmdTdGFydEluZGV4LCBjb250ZXh0SWQpIHtcbiAgICBpZiAoYmluZGluZ1N0YXJ0SW5kZXggPT09IHZvaWQgMCkgeyBiaW5kaW5nU3RhcnRJbmRleCA9IDA7IH1cbiAgICBpZiAoY29udGV4dElkID09PSB2b2lkIDApIHsgY29udGV4dElkID0gMDsgfVxuICAgIHZhciBzdGFydElkeCA9IGJpbmRpbmdTdGFydEluZGV4O1xuICAgIHZhciBwbGFjZWhvbGRlcnMgPSBuZXcgTWFwKCk7XG4gICAgdmFyIG5vZGUgPSBtZXRhIGluc3RhbmNlb2YgTWVzc2FnZSA/IG1ldGEubm9kZXMuZmluZChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIENvbnRhaW5lcjsgfSkgOiBtZXRhO1xuICAgIGlmIChub2RlKSB7XG4gICAgICAgIG5vZGVcbiAgICAgICAgICAgIC5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZCBpbnN0YW5jZW9mIFBsYWNlaG9sZGVyOyB9KVxuICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkLCBpZHgpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gd3JhcEkxOG5QbGFjZWhvbGRlcihzdGFydElkeCArIGlkeCwgY29udGV4dElkKTtcbiAgICAgICAgICAgIHVwZGF0ZVBsYWNlaG9sZGVyTWFwKHBsYWNlaG9sZGVycywgY2hpbGQubmFtZSwgY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGxhY2Vob2xkZXJzO1xufVxuZnVuY3Rpb24gZmluZEluZGV4KGl0ZW1zLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKGl0ZW1zW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuLyoqXG4gKiBQYXJzZXMgaTE4biBtZXRhcyBsaWtlOlxuICogIC0gXCJAQGlkXCIsXG4gKiAgLSBcImRlc2NyaXB0aW9uW0BAaWRdXCIsXG4gKiAgLSBcIm1lYW5pbmd8ZGVzY3JpcHRpb25bQEBpZF1cIlxuICogYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFyc2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gbWV0YSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIGkxOG4gbWV0YVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggaWQsIG1lYW5pbmcgYW5kIGRlc2NyaXB0aW9uIGZpZWxkc1xuICovXG5mdW5jdGlvbiBwYXJzZUkxOG5NZXRhKG1ldGEpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHZhciBpZDtcbiAgICB2YXIgbWVhbmluZztcbiAgICB2YXIgZGVzY3JpcHRpb247XG4gICAgaWYgKG1ldGEpIHtcbiAgICAgICAgdmFyIGlkSW5kZXggPSBtZXRhLmluZGV4T2YoSTE4Tl9JRF9TRVBBUkFUT1IpO1xuICAgICAgICB2YXIgZGVzY0luZGV4ID0gbWV0YS5pbmRleE9mKEkxOE5fTUVBTklOR19TRVBBUkFUT1IpO1xuICAgICAgICB2YXIgbWVhbmluZ0FuZERlc2MgPSB2b2lkIDA7XG4gICAgICAgIF9hID0gX19yZWFkKChpZEluZGV4ID4gLTEpID8gW21ldGEuc2xpY2UoMCwgaWRJbmRleCksIG1ldGEuc2xpY2UoaWRJbmRleCArIDIpXSA6IFttZXRhLCAnJ10sIDIpLCBtZWFuaW5nQW5kRGVzYyA9IF9hWzBdLCBpZCA9IF9hWzFdO1xuICAgICAgICBfYiA9IF9fcmVhZCgoZGVzY0luZGV4ID4gLTEpID9cbiAgICAgICAgICAgIFttZWFuaW5nQW5kRGVzYy5zbGljZSgwLCBkZXNjSW5kZXgpLCBtZWFuaW5nQW5kRGVzYy5zbGljZShkZXNjSW5kZXggKyAxKV0gOlxuICAgICAgICAgICAgWycnLCBtZWFuaW5nQW5kRGVzY10sIDIpLCBtZWFuaW5nID0gX2JbMF0sIGRlc2NyaXB0aW9uID0gX2JbMV07XG4gICAgfVxuICAgIHJldHVybiB7IGlkOiBpZCwgbWVhbmluZzogbWVhbmluZywgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH07XG59XG4vKipcbiAqIENvbnZlcnRzIGludGVybmFsIHBsYWNlaG9sZGVyIG5hbWVzIHRvIHB1YmxpYy1mYWNpbmcgZm9ybWF0XG4gKiAoZm9yIGV4YW1wbGUgdG8gdXNlIGluIGdvb2cuZ2V0TXNnIGNhbGwpLlxuICogRXhhbXBsZTogYFNUQVJUX1RBR19ESVZfMWAgaXMgY29udmVydGVkIHRvIGBzdGFydFRhZ0Rpdl8xYC5cbiAqXG4gKiBAcGFyYW0gbmFtZSBUaGUgcGxhY2Vob2xkZXIgbmFtZSB0aGF0IHNob3VsZCBiZSBmb3JtYXR0ZWRcbiAqIEByZXR1cm5zIEZvcm1hdHRlZCBwbGFjZWhvbGRlciBuYW1lXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEkxOG5QbGFjZWhvbGRlck5hbWUobmFtZSkge1xuICAgIHZhciBjaHVua3MgPSB0b1B1YmxpY05hbWUobmFtZSkuc3BsaXQoJ18nKTtcbiAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBpZiBubyBcIl9cIiBmb3VuZCAtIGp1c3QgbG93ZXJjYXNlIHRoZSB2YWx1ZVxuICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICB2YXIgcG9zdGZpeDtcbiAgICAvLyBlamVjdCBsYXN0IGVsZW1lbnQgaWYgaXQncyBhIG51bWJlclxuICAgIGlmICgvXlxcZCskLy50ZXN0KGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgIHBvc3RmaXggPSBjaHVua3MucG9wKCk7XG4gICAgfVxuICAgIHZhciByYXcgPSBjaHVua3Muc2hpZnQoKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChjaHVua3MubGVuZ3RoKSB7XG4gICAgICAgIHJhdyArPSBjaHVua3MubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgYy5zbGljZSgxKS50b0xvd2VyQ2FzZSgpOyB9KS5qb2luKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvc3RmaXggPyByYXcgKyBcIl9cIiArIHBvc3RmaXggOiByYXc7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIHByZWZpeCBmb3IgdHJhbnNsYXRpb24gY29uc3QgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0cmEgQWRkaXRpb25hbCBsb2NhbCBwcmVmaXggdGhhdCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0cmFuc2xhdGlvbiB2YXIgbmFtZVxuICogQHJldHVybnMgQ29tcGxldGUgdHJhbnNsYXRpb24gY29uc3QgcHJlZml4XG4gKi9cbmZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uQ29uc3RQcmVmaXgoZXh0cmEpIHtcbiAgICByZXR1cm4gKFwiXCIgKyBDTE9TVVJFX1RSQU5TTEFUSU9OX1BSRUZJWCArIGV4dHJhKS50b1VwcGVyQ2FzZSgpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgdHJhbnNsYXRpb24gZGVjbGFyYXRpb24gc3RhdGVtZW50cy5cbiAqXG4gKiBAcGFyYW0gdmFyaWFibGUgVHJhbnNsYXRpb24gdmFsdWUgcmVmZXJlbmNlXG4gKiBAcGFyYW0gY2xvc3VyZVZhciBWYXJpYWJsZSBmb3IgQ2xvc3VyZSBgZ29vZy5nZXRNc2dgIGNhbGxzXG4gKiBAcGFyYW0gbWVzc2FnZSBUZXh0IG1lc3NhZ2UgdG8gYmUgdHJhbnNsYXRlZFxuICogQHBhcmFtIG1ldGEgT2JqZWN0IHRoYXQgY29udGFpbnMgbWV0YSBpbmZvcm1hdGlvbiAoaWQsIG1lYW5pbmcgYW5kIGRlc2NyaXB0aW9uKVxuICogQHBhcmFtIHBhcmFtcyBPYmplY3Qgd2l0aCBwbGFjZWhvbGRlcnMga2V5LXZhbHVlIHBhaXJzXG4gKiBAcGFyYW0gdHJhbnNmb3JtRm4gT3B0aW9uYWwgdHJhbnNmb3JtYXRpb24gKHBvc3QgcHJvY2Vzc2luZykgZnVuY3Rpb24gcmVmZXJlbmNlXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTdGF0ZW1lbnRzIHRoYXQgcmVwcmVzZW50IGEgZ2l2ZW4gdHJhbnNsYXRpb25cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25EZWNsU3RtdHModmFyaWFibGUsIGNsb3N1cmVWYXIsIG1lc3NhZ2UsIG1ldGEsIHBhcmFtcywgdHJhbnNmb3JtRm4pIHtcbiAgICBpZiAocGFyYW1zID09PSB2b2lkIDApIHsgcGFyYW1zID0ge307IH1cbiAgICB2YXIgc3RhdGVtZW50cyA9IFtdO1xuICAgIHN0YXRlbWVudHMucHVzaC5hcHBseShzdGF0ZW1lbnRzLCBfX3NwcmVhZChpMThuVHJhbnNsYXRpb25Ub0RlY2xTdG10KHZhcmlhYmxlLCBjbG9zdXJlVmFyLCBtZXNzYWdlLCBtZXRhLCBwYXJhbXMpKSk7XG4gICAgaWYgKHRyYW5zZm9ybUZuKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaChuZXcgRXhwcmVzc2lvblN0YXRlbWVudCh2YXJpYWJsZS5zZXQodHJhbnNmb3JtRm4odmFyaWFibGUpKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3Qga2V5IGNvbnRhaW5zIHBvdGVudGlhbGx5IHVuc2FmZSBjaGFycywgdGh1cyB0aGUga2V5IHNob3VsZCBiZSB3cmFwcGVkIGluXG4gKiBxdW90ZXMuIE5vdGU6IHdlIGRvIG5vdCB3cmFwIGFsbCBrZXlzIGludG8gcXVvdGVzLCBhcyBpdCBtYXkgaGF2ZSBpbXBhY3Qgb24gbWluaWZpY2F0aW9uIGFuZCBtYXlcbiAqIGJvdCB3b3JrIGluIHNvbWUgY2FzZXMgd2hlbiBvYmplY3Qga2V5cyBhcmUgbWFuZ2xlZCBieSBtaW5pZmllci5cbiAqXG4gKiBUT0RPKEZXLTExMzYpOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uLCB3ZSBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhIGJldHRlciB3YXkgb2Ygd29ya2luZyB3aXRoXG4gKiBpbnB1dHMgdGhhdCBjb250YWluIHBvdGVudGlhbGx5IHVuc2FmZSBjaGFycy5cbiAqL1xudmFyIFVOU0FGRV9PQkpFQ1RfS0VZX05BTUVfUkVHRVhQID0gLy0vO1xuLyoqIE5hbWUgb2YgdGhlIHRlbXBvcmFyeSB0byB1c2UgZHVyaW5nIGRhdGEgYmluZGluZyAqL1xudmFyIFRFTVBPUkFSWV9OQU1FID0gJ190Jztcbi8qKiBOYW1lIG9mIHRoZSBjb250ZXh0IHBhcmFtZXRlciBwYXNzZWQgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uICovXG52YXIgQ09OVEVYVF9OQU1FID0gJ2N0eCc7XG4vKiogTmFtZSBvZiB0aGUgUmVuZGVyRmxhZyBwYXNzZWQgaW50byBhIHRlbXBsYXRlIGZ1bmN0aW9uICovXG52YXIgUkVOREVSX0ZMQUdTID0gJ3JmJztcbi8qKiBUaGUgcHJlZml4IHJlZmVyZW5jZSB2YXJpYWJsZXMgKi9cbnZhciBSRUZFUkVOQ0VfUFJFRklYID0gJ19yJztcbi8qKiBUaGUgbmFtZSBvZiB0aGUgaW1wbGljaXQgY29udGV4dCByZWZlcmVuY2UgKi9cbnZhciBJTVBMSUNJVF9SRUZFUkVOQ0UgPSAnJGltcGxpY2l0Jztcbi8qKiBOb24gYmluZGFibGUgYXR0cmlidXRlIG5hbWUgKiovXG52YXIgTk9OX0JJTkRBQkxFX0FUVFIgPSAnbmdOb25CaW5kYWJsZSc7XG4vKipcbiAqIENyZWF0ZXMgYW4gYWxsb2NhdG9yIGZvciBhIHRlbXBvcmFyeSB2YXJpYWJsZS5cbiAqXG4gKiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGlzIGFkZGVkIHRvIHRoZSBzdGF0ZW1lbnRzIHRoZSBmaXJzdCB0aW1lIHRoZSBhbGxvY2F0b3IgaXMgaW52b2tlZC5cbiAqL1xuZnVuY3Rpb24gdGVtcG9yYXJ5QWxsb2NhdG9yKHN0YXRlbWVudHMsIG5hbWUpIHtcbiAgICB2YXIgdGVtcCA9IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0ZW1wKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2gobmV3IERlY2xhcmVWYXJTdG10KFRFTVBPUkFSWV9OQU1FLCB1bmRlZmluZWQsIERZTkFNSUNfVFlQRSkpO1xuICAgICAgICAgICAgdGVtcCA9IHZhcmlhYmxlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZW1wO1xuICAgIH07XG59XG5mdW5jdGlvbiB1bnN1cHBvcnRlZChmZWF0dXJlKSB7XG4gICAgaWYgKHRoaXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVpbGRlciBcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiIGRvZXNuJ3Qgc3VwcG9ydCBcIiArIGZlYXR1cmUgKyBcIiB5ZXRcIik7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIkZlYXR1cmUgXCIgKyBmZWF0dXJlICsgXCIgaXMgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG59XG5mdW5jdGlvbiBpbnZhbGlkJDEoYXJnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZTogVmlzaXRvciBcIiArIHRoaXMuY29uc3RydWN0b3IubmFtZSArIFwiIGRvZXNuJ3QgaGFuZGxlIFwiICsgYXJnLmNvbnN0cnVjdG9yLm5hbWUpO1xufVxuZnVuY3Rpb24gYXNMaXRlcmFsKHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsQXJyKHZhbHVlLm1hcChhc0xpdGVyYWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpdGVyYWwodmFsdWUsIElORkVSUkVEX1RZUEUpO1xufVxuZnVuY3Rpb24gY29uZGl0aW9uYWxseUNyZWF0ZU1hcE9iamVjdExpdGVyYWwoa2V5cywga2VlcERlY2xhcmVkKSB7XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGtleXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIG1hcFRvRXhwcmVzc2lvbihrZXlzLCBrZWVwRGVjbGFyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIG1hcFRvRXhwcmVzc2lvbihtYXAsIGtlZXBEZWNsYXJlZCkge1xuICAgIHJldHVybiBsaXRlcmFsTWFwKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG1hcCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IHB1YmxpY1Byb3BgXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGA6YCwgdXNlIGRpclByb3AgPSBlbFByb3BcbiAgICAgICAgdmFyIHZhbHVlID0gbWFwW2tleV07XG4gICAgICAgIHZhciBkZWNsYXJlZE5hbWU7XG4gICAgICAgIHZhciBwdWJsaWNOYW1lO1xuICAgICAgICB2YXIgbWluaWZpZWROYW1lO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIF9hID0gX19yZWFkKHZhbHVlLCAyKSwgcHVibGljTmFtZSA9IF9hWzBdLCBkZWNsYXJlZE5hbWUgPSBfYVsxXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9iID0gX19yZWFkKHNwbGl0QXRDb2xvbihrZXksIFtrZXksIHZhbHVlXSksIDIpLCBkZWNsYXJlZE5hbWUgPSBfYlswXSwgcHVibGljTmFtZSA9IF9iWzFdO1xuICAgICAgICB9XG4gICAgICAgIG1pbmlmaWVkTmFtZSA9IGRlY2xhcmVkTmFtZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogbWluaWZpZWROYW1lLFxuICAgICAgICAgICAgLy8gcHV0IHF1b3RlcyBhcm91bmQga2V5cyB0aGF0IGNvbnRhaW4gcG90ZW50aWFsbHkgdW5zYWZlIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIHF1b3RlZDogVU5TQUZFX09CSkVDVF9LRVlfTkFNRV9SRUdFWFAudGVzdChtaW5pZmllZE5hbWUpLFxuICAgICAgICAgICAgdmFsdWU6IChrZWVwRGVjbGFyZWQgJiYgcHVibGljTmFtZSAhPT0gZGVjbGFyZWROYW1lKSA/XG4gICAgICAgICAgICAgICAgbGl0ZXJhbEFycihbYXNMaXRlcmFsKHB1YmxpY05hbWUpLCBhc0xpdGVyYWwoZGVjbGFyZWROYW1lKV0pIDpcbiAgICAgICAgICAgICAgICBhc0xpdGVyYWwocHVibGljTmFtZSlcbiAgICAgICAgfTtcbiAgICB9KSk7XG59XG4vKipcbiAqICBSZW1vdmUgdHJhaWxpbmcgbnVsbCBub2RlcyBhcyB0aGV5IGFyZSBpbXBsaWVkLlxuICovXG5mdW5jdGlvbiB0cmltVHJhaWxpbmdOdWxscyhwYXJhbWV0ZXJzKSB7XG4gICAgd2hpbGUgKGlzTnVsbChwYXJhbWV0ZXJzW3BhcmFtZXRlcnMubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgIHBhcmFtZXRlcnMucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbWV0ZXJzO1xufVxuZnVuY3Rpb24gZ2V0UXVlcnlQcmVkaWNhdGUocXVlcnksIGNvbnN0YW50UG9vbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5LnByZWRpY2F0ZSkpIHtcbiAgICAgICAgdmFyIHByZWRpY2F0ZV8xID0gW107XG4gICAgICAgIHF1ZXJ5LnByZWRpY2F0ZS5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgLy8gRWFjaCBpdGVtIGluIHByZWRpY2F0ZXMgYXJyYXkgbWF5IGNvbnRhaW4gc3RyaW5ncyB3aXRoIGNvbW1hLXNlcGFyYXRlZCByZWZzXG4gICAgICAgICAgICAvLyAoZm9yIGV4LiAncmVmLCByZWYxLCAuLi4sIHJlZk4nKSwgdGh1cyB3ZSBleHRyYWN0IGluZGl2aWR1YWwgcmVmcyBhbmQgc3RvcmUgdGhlbVxuICAgICAgICAgICAgLy8gYXMgc2VwYXJhdGUgYXJyYXkgZW50aXRpZXNcbiAgICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAodG9rZW4pIHsgcmV0dXJuIGxpdGVyYWwodG9rZW4udHJpbSgpKTsgfSk7XG4gICAgICAgICAgICBwcmVkaWNhdGVfMS5wdXNoLmFwcGx5KHByZWRpY2F0ZV8xLCBfX3NwcmVhZChzZWxlY3RvcnMpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb25zdGFudFBvb2wuZ2V0Q29uc3RMaXRlcmFsKGxpdGVyYWxBcnIocHJlZGljYXRlXzEpLCB0cnVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeS5wcmVkaWNhdGU7XG4gICAgfVxufVxudmFyIERlZmluaXRpb25NYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmaW5pdGlvbk1hcCgpIHtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBbXTtcbiAgICB9XG4gICAgRGVmaW5pdGlvbk1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSwgcXVvdGVkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmaW5pdGlvbk1hcC5wcm90b3R5cGUudG9MaXRlcmFsTWFwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbGl0ZXJhbE1hcCh0aGlzLnZhbHVlcyk7IH07XG4gICAgcmV0dXJuIERlZmluaXRpb25NYXA7XG59KCkpO1xuLyoqXG4gKiBFeHRyYWN0IGEgbWFwIG9mIHByb3BlcnRpZXMgdG8gdmFsdWVzIGZvciBhIGdpdmVuIGVsZW1lbnQgb3IgdGVtcGxhdGUgbm9kZSwgd2hpY2ggY2FuIGJlIHVzZWRcbiAqIGJ5IHRoZSBkaXJlY3RpdmUgbWF0Y2hpbmcgbWFjaGluZXJ5LlxuICpcbiAqIEBwYXJhbSBlbE9yVHBsIHRoZSBlbGVtZW50IG9yIHRlbXBsYXRlIGluIHF1ZXN0aW9uXG4gKiBAcmV0dXJuIGFuIG9iamVjdCBzZXQgdXAgZm9yIGRpcmVjdGl2ZSBtYXRjaGluZy4gRm9yIGF0dHJpYnV0ZXMgb24gdGhlIGVsZW1lbnQvdGVtcGxhdGUsIHRoaXNcbiAqIG9iamVjdCBtYXBzIGEgcHJvcGVydHkgbmFtZSB0byBpdHMgKHN0YXRpYykgdmFsdWUuIEZvciBhbnkgYmluZGluZ3MsIHRoaXMgbWFwIHNpbXBseSBtYXBzIHRoZVxuICogcHJvcGVydHkgbmFtZSB0byBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJzRm9yRGlyZWN0aXZlTWF0Y2hpbmcoZWxPclRwbCkge1xuICAgIHZhciBhdHRyaWJ1dGVzTWFwID0ge307XG4gICAgaWYgKGVsT3JUcGwgaW5zdGFuY2VvZiBUZW1wbGF0ZSAmJiBlbE9yVHBsLnRhZ05hbWUgIT09ICduZy10ZW1wbGF0ZScpIHtcbiAgICAgICAgZWxPclRwbC50ZW1wbGF0ZUF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGF0dHJpYnV0ZXNNYXBbYS5uYW1lXSA9ICcnOyB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsT3JUcGwuYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICBpZiAoIWlzSTE4bkF0dHJpYnV0ZShhLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc01hcFthLm5hbWVdID0gYS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsT3JUcGwuaW5wdXRzLmZvckVhY2goZnVuY3Rpb24gKGkpIHsgYXR0cmlidXRlc01hcFtpLm5hbWVdID0gJyc7IH0pO1xuICAgICAgICBlbE9yVHBsLm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAobykgeyBhdHRyaWJ1dGVzTWFwW28ubmFtZV0gPSAnJzsgfSk7XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVzTWFwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUjNGYWN0b3J5RGVsZWdhdGVUeXBlO1xuKGZ1bmN0aW9uIChSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGUpIHtcbiAgICBSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGVbUjNGYWN0b3J5RGVsZWdhdGVUeXBlW1wiQ2xhc3NcIl0gPSAwXSA9IFwiQ2xhc3NcIjtcbiAgICBSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGVbUjNGYWN0b3J5RGVsZWdhdGVUeXBlW1wiRnVuY3Rpb25cIl0gPSAxXSA9IFwiRnVuY3Rpb25cIjtcbiAgICBSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGVbUjNGYWN0b3J5RGVsZWdhdGVUeXBlW1wiRmFjdG9yeVwiXSA9IDJdID0gXCJGYWN0b3J5XCI7XG59KShSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGUgfHwgKFIzRmFjdG9yeURlbGVnYXRlVHlwZSA9IHt9KSk7XG4vKipcbiAqIFJlc29sdmVkIHR5cGUgb2YgYSBkZXBlbmRlbmN5LlxuICpcbiAqIE9jY2FzaW9uYWxseSwgZGVwZW5kZW5jaWVzIHdpbGwgaGF2ZSBzcGVjaWFsIHNpZ25pZmljYW5jZSB3aGljaCBpcyBrbm93biBzdGF0aWNhbGx5LiBJbiB0aGF0XG4gKiBjYXNlIHRoZSBgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlYCBpbmZvcm1zIHRoZSBmYWN0b3J5IGdlbmVyYXRvciB0aGF0IGEgcGFydGljdWxhciBkZXBlbmRlbmN5XG4gKiBzaG91bGQgYmUgZ2VuZXJhdGVkIHNwZWNpYWxseSAodXN1YWxseSBieSBjYWxsaW5nIGEgc3BlY2lhbCBpbmplY3Rpb24gZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGVcbiAqIHN0YW5kYXJkIG9uZSkuXG4gKi9cbnZhciBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGU7XG4oZnVuY3Rpb24gKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSkge1xuICAgIC8qKlxuICAgICAqIEEgbm9ybWFsIHRva2VuIGRlcGVuZGVuY3kuXG4gICAgICovXG4gICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtcIlRva2VuXCJdID0gMF0gPSBcIlRva2VuXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGRlcGVuZGVuY3kgaXMgZm9yIGFuIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIFRoZSB0b2tlbiBleHByZXNzaW9uIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIG5hbWUuXG4gICAgICovXG4gICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtcIkF0dHJpYnV0ZVwiXSA9IDFdID0gXCJBdHRyaWJ1dGVcIjtcbn0pKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSB8fCAoUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlID0ge30pKTtcbi8qKlxuICogQ29uc3RydWN0IGEgZmFjdG9yeSBmdW5jdGlvbiBleHByZXNzaW9uIGZvciB0aGUgZ2l2ZW4gYFIzRmFjdG9yeU1ldGFkYXRhYC5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUZhY3RvcnlGdW5jdGlvbihtZXRhKSB7XG4gICAgdmFyIHQgPSB2YXJpYWJsZSgndCcpO1xuICAgIHZhciBzdGF0ZW1lbnRzID0gW107XG4gICAgLy8gVGhlIHR5cGUgdG8gaW5zdGFudGlhdGUgdmlhIGNvbnN0cnVjdG9yIGludm9jYXRpb24uIElmIHRoZXJlIGlzIG5vIGRlbGVnYXRlZCBmYWN0b3J5LCBtZWFuaW5nXG4gICAgLy8gdGhpcyB0eXBlIGlzIGFsd2F5cyBjcmVhdGVkIGJ5IGNvbnN0cnVjdG9yIGludm9jYXRpb24sIHRoZW4gdGhpcyBpcyB0aGUgdHlwZS10by1jcmVhdGVcbiAgICAvLyBwYXJhbWV0ZXIgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHQpIGlmIHNwZWNpZmllZCwgb3IgdGhlIGN1cnJlbnQgdHlwZSBpZiBub3QuIElmIHRoZXJlIGlzIGFcbiAgICAvLyBkZWxlZ2F0ZWQgZmFjdG9yeSAod2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgdHlwZSkgdGhlbiB0aGlzIGlzIG9ubHkgdGhlIHR5cGUtdG8tXG4gICAgLy8gY3JlYXRlIHBhcmFtZXRlciAodCkuXG4gICAgdmFyIHR5cGVGb3JDdG9yID0gIWlzRGVsZWdhdGVkTWV0YWRhdGEobWV0YSkgPyBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKEJpbmFyeU9wZXJhdG9yLk9yLCB0LCBtZXRhLnR5cGUpIDogdDtcbiAgICB2YXIgY3RvckV4cHIgPSBudWxsO1xuICAgIGlmIChtZXRhLmRlcHMgIT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlcmUgaXMgYSBjb25zdHJ1Y3RvciAoZWl0aGVyIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBkZWZpbmVkKS5cbiAgICAgICAgaWYgKG1ldGEuZGVwcyAhPT0gJ2ludmFsaWQnKSB7XG4gICAgICAgICAgICBjdG9yRXhwciA9IG5ldyBJbnN0YW50aWF0ZUV4cHIodHlwZUZvckN0b3IsIGluamVjdERlcGVuZGVuY2llcyhtZXRhLmRlcHMsIG1ldGEuaW5qZWN0Rm4pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIGJhc2VGYWN0b3J5ID0gdmFyaWFibGUoXCJcXHUwMjc1XCIgKyBtZXRhLm5hbWUgKyBcIl9CYXNlRmFjdG9yeVwiKTtcbiAgICAgICAgdmFyIGdldEluaGVyaXRlZEZhY3RvcnkgPSBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuZ2V0SW5oZXJpdGVkRmFjdG9yeSk7XG4gICAgICAgIHZhciBiYXNlRmFjdG9yeVN0bXQgPSBiYXNlRmFjdG9yeS5zZXQoZ2V0SW5oZXJpdGVkRmFjdG9yeS5jYWxsRm4oW21ldGEudHlwZV0pKS50b0RlY2xTdG10KElORkVSUkVEX1RZUEUsIFtcbiAgICAgICAgICAgIFN0bXRNb2RpZmllci5FeHBvcnRlZCwgU3RtdE1vZGlmaWVyLkZpbmFsXG4gICAgICAgIF0pO1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYmFzZUZhY3RvcnlTdG10KTtcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29uc3RydWN0b3IsIHVzZSB0aGUgYmFzZSBjbGFzcycgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdHlwZUZvckN0b3IuXG4gICAgICAgIGN0b3JFeHByID0gYmFzZUZhY3RvcnkuY2FsbEZuKFt0eXBlRm9yQ3Rvcl0pO1xuICAgIH1cbiAgICB2YXIgY3RvckV4cHJGaW5hbCA9IGN0b3JFeHByO1xuICAgIHZhciBib2R5ID0gW107XG4gICAgdmFyIHJldEV4cHIgPSBudWxsO1xuICAgIGZ1bmN0aW9uIG1ha2VDb25kaXRpb25hbEZhY3Rvcnkobm9uQ3RvckV4cHIpIHtcbiAgICAgICAgdmFyIHIgPSB2YXJpYWJsZSgncicpO1xuICAgICAgICBib2R5LnB1c2goci5zZXQoTlVMTF9FWFBSKS50b0RlY2xTdG10KCkpO1xuICAgICAgICB2YXIgY3RvclN0bXQgPSBudWxsO1xuICAgICAgICBpZiAoY3RvckV4cHJGaW5hbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY3RvclN0bXQgPSByLnNldChjdG9yRXhwckZpbmFsKS50b1N0bXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN0b3JTdG10ID0gbWFrZUVycm9yU3RtdChtZXRhLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGJvZHkucHVzaChpZlN0bXQodCwgW2N0b3JTdG10XSwgW3Iuc2V0KG5vbkN0b3JFeHByKS50b1N0bXQoKV0pKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuICAgIGlmIChpc0RlbGVnYXRlZE1ldGFkYXRhKG1ldGEpICYmIG1ldGEuZGVsZWdhdGVUeXBlID09PSBSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGUuRmFjdG9yeSkge1xuICAgICAgICB2YXIgZGVsZWdhdGVGYWN0b3J5ID0gdmFyaWFibGUoXCJcXHUwMjc1XCIgKyBtZXRhLm5hbWUgKyBcIl9CYXNlRmFjdG9yeVwiKTtcbiAgICAgICAgdmFyIGdldEZhY3RvcnlPZiA9IGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5nZXRGYWN0b3J5T2YpO1xuICAgICAgICBpZiAobWV0YS5kZWxlZ2F0ZS5pc0VxdWl2YWxlbnQobWV0YS50eXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogY29tcGlsaW5nIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gaXRzZWxmXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkZWxlZ2F0ZUZhY3RvcnlTdG10ID0gZGVsZWdhdGVGYWN0b3J5LnNldChnZXRGYWN0b3J5T2YuY2FsbEZuKFttZXRhLmRlbGVnYXRlXSkpLnRvRGVjbFN0bXQoSU5GRVJSRURfVFlQRSwgW1xuICAgICAgICAgICAgU3RtdE1vZGlmaWVyLkV4cG9ydGVkLCBTdG10TW9kaWZpZXIuRmluYWxcbiAgICAgICAgXSk7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaChkZWxlZ2F0ZUZhY3RvcnlTdG10KTtcbiAgICAgICAgcmV0RXhwciA9IG1ha2VDb25kaXRpb25hbEZhY3RvcnkoZGVsZWdhdGVGYWN0b3J5LmNhbGxGbihbXSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RlbGVnYXRlZE1ldGFkYXRhKG1ldGEpKSB7XG4gICAgICAgIC8vIFRoaXMgdHlwZSBpcyBjcmVhdGVkIHdpdGggYSBkZWxlZ2F0ZWQgZmFjdG9yeS4gSWYgYSB0eXBlIHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLCBjYWxsXG4gICAgICAgIC8vIHRoZSBmYWN0b3J5IGluc3RlYWQuXG4gICAgICAgIHZhciBkZWxlZ2F0ZUFyZ3MgPSBpbmplY3REZXBlbmRlbmNpZXMobWV0YS5kZWxlZ2F0ZURlcHMsIG1ldGEuaW5qZWN0Rm4pO1xuICAgICAgICAvLyBFaXRoZXIgY2FsbCBgbmV3IGRlbGVnYXRlKC4uLilgIG9yIGBkZWxlZ2F0ZSguLi4pYCBkZXBlbmRpbmcgb24gbWV0YS51c2VOZXdGb3JEZWxlZ2F0ZS5cbiAgICAgICAgdmFyIGZhY3RvcnlFeHByID0gbmV3IChtZXRhLmRlbGVnYXRlVHlwZSA9PT0gUjNGYWN0b3J5RGVsZWdhdGVUeXBlLkNsYXNzID9cbiAgICAgICAgICAgIEluc3RhbnRpYXRlRXhwciA6XG4gICAgICAgICAgICBJbnZva2VGdW5jdGlvbkV4cHIpKG1ldGEuZGVsZWdhdGUsIGRlbGVnYXRlQXJncyk7XG4gICAgICAgIHJldEV4cHIgPSBtYWtlQ29uZGl0aW9uYWxGYWN0b3J5KGZhY3RvcnlFeHByKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNFeHByZXNzaW9uRmFjdG9yeU1ldGFkYXRhKG1ldGEpKSB7XG4gICAgICAgIC8vIFRPRE8oYWx4aHViKTogZGVjaWRlIHdoZXRoZXIgdG8gbG93ZXIgdGhlIHZhbHVlIGhlcmUgb3IgaW4gdGhlIGNhbGxlclxuICAgICAgICByZXRFeHByID0gbWFrZUNvbmRpdGlvbmFsRmFjdG9yeShtZXRhLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0RXhwciA9IGN0b3JFeHByO1xuICAgIH1cbiAgICBpZiAocmV0RXhwciAhPT0gbnVsbCkge1xuICAgICAgICBib2R5LnB1c2gobmV3IFJldHVyblN0YXRlbWVudChyZXRFeHByKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBib2R5LnB1c2gobWFrZUVycm9yU3RtdChtZXRhLm5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmFjdG9yeTogZm4oW25ldyBGblBhcmFtKCd0JywgRFlOQU1JQ19UWVBFKV0sIGJvZHksIElORkVSUkVEX1RZUEUsIHVuZGVmaW5lZCwgbWV0YS5uYW1lICsgXCJfRmFjdG9yeVwiKSxcbiAgICAgICAgc3RhdGVtZW50czogc3RhdGVtZW50cyxcbiAgICB9O1xufVxuZnVuY3Rpb24gaW5qZWN0RGVwZW5kZW5jaWVzKGRlcHMsIGluamVjdEZuKSB7XG4gICAgcmV0dXJuIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIGNvbXBpbGVJbmplY3REZXBlbmRlbmN5KGRlcCwgaW5qZWN0Rm4pOyB9KTtcbn1cbmZ1bmN0aW9uIGNvbXBpbGVJbmplY3REZXBlbmRlbmN5KGRlcCwgaW5qZWN0Rm4pIHtcbiAgICAvLyBJbnRlcnByZXQgdGhlIGRlcGVuZGVuY3kgYWNjb3JkaW5nIHRvIGl0cyByZXNvbHZlZCB0eXBlLlxuICAgIHN3aXRjaCAoZGVwLnJlc29sdmVkKSB7XG4gICAgICAgIGNhc2UgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLlRva2VuOiB7XG4gICAgICAgICAgICAvLyBCdWlsZCB1cCB0aGUgaW5qZWN0aW9uIGZsYWdzIGFjY29yZGluZyB0byB0aGUgbWV0YWRhdGEuXG4gICAgICAgICAgICB2YXIgZmxhZ3MgPSAwIC8qIERlZmF1bHQgKi8gfCAoZGVwLnNlbGYgPyAyIC8qIFNlbGYgKi8gOiAwKSB8XG4gICAgICAgICAgICAgICAgKGRlcC5za2lwU2VsZiA/IDQgLyogU2tpcFNlbGYgKi8gOiAwKSB8IChkZXAuaG9zdCA/IDEgLyogSG9zdCAqLyA6IDApIHxcbiAgICAgICAgICAgICAgICAoZGVwLm9wdGlvbmFsID8gOCAvKiBPcHRpb25hbCAqLyA6IDApO1xuICAgICAgICAgICAgLy8gQnVpbGQgdXAgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5qZWN0Rm4gY2FsbC5cbiAgICAgICAgICAgIHZhciBpbmplY3RBcmdzID0gW2RlcC50b2tlbl07XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGRlcGVuZGVuY3kgaXMgb3B0aW9uYWwgb3Igb3RoZXJ3aXNlIGhhcyBub24tZGVmYXVsdCBmbGFncywgdGhlbiBhZGRpdGlvbmFsXG4gICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIGRlc2NyaWJpbmcgaG93IHRvIGluamVjdCB0aGUgZGVwZW5kZW5jeSBtdXN0IGJlIHBhc3NlZCB0byB0aGUgaW5qZWN0IGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyB0aGF0J3MgYmVpbmcgdXNlZC5cbiAgICAgICAgICAgIGlmIChmbGFncyAhPT0gMCAvKiBEZWZhdWx0ICovIHx8IGRlcC5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGluamVjdEFyZ3MucHVzaChsaXRlcmFsKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihpbmplY3RGbikuY2FsbEZuKGluamVjdEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLkF0dHJpYnV0ZTpcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGF0dHJpYnV0ZXMsIHRoZSBhdHRyaWJ1dGUgbmFtZSBpbiBxdWVzdGlvbiBpcyBnaXZlbiBhcyB0aGUgdG9rZW4uXG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmluamVjdEF0dHJpYnV0ZSkuY2FsbEZuKFtkZXAudG9rZW5dKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChcIlVua25vd24gUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlOiBcIiArIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtkZXAucmVzb2x2ZWRdKTtcbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHVzZWZ1bCBmb3IgZXh0cmFjdGluZyBgUjNEZXBlbmRlbmN5TWV0YWRhdGFgIGZyb20gYSBSZW5kZXIyXG4gKiBgQ29tcGlsZVR5cGVNZXRhZGF0YWAgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZGVuY2llc0Zyb21HbG9iYWxNZXRhZGF0YSh0eXBlLCBvdXRwdXRDdHgsIHJlZmxlY3Rvcikge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIC8vIFVzZSB0aGUgYENvbXBpbGVSZWZsZWN0b3JgIHRvIGxvb2sgdXAgcmVmZXJlbmNlcyB0byBzb21lIHdlbGwta25vd24gQW5ndWxhciB0eXBlcy4gVGhlc2Ugd2lsbFxuICAgIC8vIGJlIGNvbXBhcmVkIHdpdGggdGhlIHRva2VuIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHRva2VuIGhhcyBzaWduaWZpY2FuY2UgdG9cbiAgICAvLyBBbmd1bGFyLCBhbmQgc2V0IHRoZSBjb3JyZWN0IGBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVgIGFzIGEgcmVzdWx0LlxuICAgIHZhciBpbmplY3RvclJlZiA9IHJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuSW5qZWN0b3IpO1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdHlwZSdzIERJIGRlcGVuZGVuY2llcyBhbmQgcHJvZHVjZSBgUjNEZXBlbmRlbmN5TWV0YWRhdGFgIGZvciBlYWNoIG9mIHRoZW0uXG4gICAgdmFyIGRlcHMgPSBbXTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHR5cGUuZGlEZXBzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LnRva2VuKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRva2VuUmVmID0gdG9rZW5SZWZlcmVuY2UoZGVwZW5kZW5jeS50b2tlbik7XG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gZGVwZW5kZW5jeS5pc0F0dHJpYnV0ZSA/XG4gICAgICAgICAgICAgICAgICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5BdHRyaWJ1dGUgOlxuICAgICAgICAgICAgICAgICAgICBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuVG9rZW47XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgbW9zdCBkZXBlbmRlbmNpZXMsIHRoZSB0b2tlbiB3aWxsIGJlIGEgcmVmZXJlbmNlIHRvIGEgdHlwZS4gU29tZXRpbWVzLFxuICAgICAgICAgICAgICAgIC8vIGhvd2V2ZXIsIGl0IGNhbiBiZSBhIHN0cmluZywgaW4gdGhlIGNhc2Ugb2Ygb2xkZXIgQW5ndWxhciBjb2RlIG9yIEBBdHRyaWJ1dGUgaW5qZWN0aW9uLlxuICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuUmVmIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sID8gb3V0cHV0Q3R4LmltcG9ydEV4cHIodG9rZW5SZWYpIDogbGl0ZXJhbCh0b2tlblJlZik7XG4gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBkZXBlbmRlbmN5LlxuICAgICAgICAgICAgICAgIGRlcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuOiB0b2tlbixcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQ6IHJlc29sdmVkLFxuICAgICAgICAgICAgICAgICAgICBob3N0OiAhIWRlcGVuZGVuY3kuaXNIb3N0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogISFkZXBlbmRlbmN5LmlzT3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgICAgIHNlbGY6ICEhZGVwZW5kZW5jeS5pc1NlbGYsXG4gICAgICAgICAgICAgICAgICAgIHNraXBTZWxmOiAhIWRlcGVuZGVuY3kuaXNTa2lwU2VsZixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuc3VwcG9ydGVkKCdkZXBlbmRlbmN5IHdpdGhvdXQgYSB0b2tlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gZGVwcztcbn1cbmZ1bmN0aW9uIG1ha2VFcnJvclN0bXQobmFtZSkge1xuICAgIHJldHVybiBuZXcgVGhyb3dTdG10KG5ldyBJbnN0YW50aWF0ZUV4cHIobmV3IFJlYWRWYXJFeHByKCdFcnJvcicpLCBbXG4gICAgICAgIGxpdGVyYWwobmFtZSArIFwiIGhhcyBhIGNvbnN0cnVjdG9yIHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRGVwZW5kZW5jeSBJbmplY3Rpb24uIEl0IHNob3VsZCBwcm9iYWJseSBub3QgYmUgQEluamVjdGFibGUoKS5cIilcbiAgICBdKSk7XG59XG5mdW5jdGlvbiBpc0RlbGVnYXRlZE1ldGFkYXRhKG1ldGEpIHtcbiAgICByZXR1cm4gbWV0YS5kZWxlZ2F0ZVR5cGUgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGlzRXhwcmVzc2lvbkZhY3RvcnlNZXRhZGF0YShtZXRhKSB7XG4gICAgcmV0dXJuIG1ldGEuZXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IG1hcCB3aXRoIGBFeHByZXNzaW9uYCB2YWx1ZXMgaW50byBhIGBMaXRlcmFsTWFwRXhwcmAuXG4gKi9cbmZ1bmN0aW9uIG1hcFRvTWFwRXhwcmVzc2lvbihtYXApIHtcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XSwgcXVvdGVkOiBmYWxzZSB9KTsgfSk7XG4gICAgcmV0dXJuIGxpdGVyYWxNYXAocmVzdWx0KTtcbn1cbi8qKlxuICogQ29udmVydCBtZXRhZGF0YSBpbnRvIGFuIGBFeHByZXNzaW9uYCBpbiB0aGUgZ2l2ZW4gYE91dHB1dENvbnRleHRgLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIHdpbGwgaGFuZGxlIGFycmF5cywgcmVmZXJlbmNlcyB0byBzeW1ib2xzLCBvciBsaXRlcmFsIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gY29udmVydE1ldGFUb091dHB1dChtZXRhLCBjdHgpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhKSkge1xuICAgICAgICByZXR1cm4gbGl0ZXJhbEFycihtZXRhLm1hcChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIGNvbnZlcnRNZXRhVG9PdXRwdXQoZW50cnksIGN0eCk7IH0pKTtcbiAgICB9XG4gICAgaWYgKG1ldGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIGN0eC5pbXBvcnRFeHByKG1ldGEpO1xuICAgIH1cbiAgICBpZiAobWV0YSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsKG1ldGEpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBtZXRhZGF0YTogXCIgKyBtZXRhKTtcbn1cbmZ1bmN0aW9uIHR5cGVXaXRoUGFyYW1ldGVycyh0eXBlLCBudW1QYXJhbXMpIHtcbiAgICB2YXIgcGFyYW1zID0gbnVsbDtcbiAgICBpZiAobnVtUGFyYW1zID4gMCkge1xuICAgICAgICBwYXJhbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1QYXJhbXM7IGkrKykge1xuICAgICAgICAgICAgcGFyYW1zLnB1c2goRFlOQU1JQ19UWVBFKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvblR5cGUodHlwZSwgbnVsbCwgcGFyYW1zKTtcbn1cbnZhciBBTklNQVRFX1NZTUJPTF9QUkVGSVggPSAnQCc7XG5mdW5jdGlvbiBwcmVwYXJlU3ludGhldGljUHJvcGVydHlOYW1lKG5hbWUpIHtcbiAgICByZXR1cm4gXCJcIiArIEFOSU1BVEVfU1lNQk9MX1BSRUZJWCArIG5hbWU7XG59XG5mdW5jdGlvbiBwcmVwYXJlU3ludGhldGljTGlzdGVuZXJOYW1lKG5hbWUsIHBoYXNlKSB7XG4gICAgcmV0dXJuIFwiXCIgKyBBTklNQVRFX1NZTUJPTF9QUkVGSVggKyBuYW1lICsgXCIuXCIgKyBwaGFzZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVTeW50aGV0aWNMaXN0ZW5lckZ1bmN0aW9uTmFtZShuYW1lLCBwaGFzZSkge1xuICAgIHJldHVybiBcImFuaW1hdGlvbl9cIiArIG5hbWUgKyBcIl9cIiArIHBoYXNlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBjb21waWxlSW5qZWN0YWJsZShtZXRhKSB7XG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgdmFyIGZhY3RvcnlNZXRhID0ge1xuICAgICAgICBuYW1lOiBtZXRhLm5hbWUsXG4gICAgICAgIHR5cGU6IG1ldGEudHlwZSxcbiAgICAgICAgZGVwczogbWV0YS5jdG9yRGVwcyxcbiAgICAgICAgaW5qZWN0Rm46IElkZW50aWZpZXJzLmluamVjdCxcbiAgICB9O1xuICAgIGlmIChtZXRhLnVzZUNsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbWV0YS51c2VDbGFzcyBoYXMgdHdvIG1vZGVzIG9mIG9wZXJhdGlvbi4gRWl0aGVyIGRlcHMgYXJlIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBgbmV3YCBpc1xuICAgICAgICAvLyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBjbGFzcyB3aXRoIGRlcGVuZGVuY2llcyBpbmplY3RlZCwgb3IgZGVwcyBhcmUgbm90IHNwZWNpZmllZCBhbmRcbiAgICAgICAgLy8gdGhlIGZhY3Rvcnkgb2YgdGhlIGNsYXNzIGlzIHVzZWQgdG8gaW5zdGFudGlhdGUgaXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEEgc3BlY2lhbCBjYXNlIGV4aXN0cyBmb3IgdXNlQ2xhc3M6IFR5cGUgd2hlcmUgVHlwZSBpcyB0aGUgaW5qZWN0YWJsZSB0eXBlIGl0c2VsZiBhbmQgbm9cbiAgICAgICAgLy8gZGVwcyBhcmUgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlICd1c2VDbGFzcycgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAgICAgICAgdmFyIHVzZUNsYXNzT25TZWxmID0gbWV0YS51c2VDbGFzcy5pc0VxdWl2YWxlbnQobWV0YS50eXBlKTtcbiAgICAgICAgdmFyIGRlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChtZXRhLnVzZXJEZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlcHMgPSBtZXRhLnVzZXJEZXBzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGZhY3Rvcnk6ICgpID0+IG5ldyBtZXRhLnVzZUNsYXNzKC4uLmRlcHMpXG4gICAgICAgICAgICByZXN1bHQgPSBjb21waWxlRmFjdG9yeUZ1bmN0aW9uKF9fYXNzaWduKHt9LCBmYWN0b3J5TWV0YSwgeyBkZWxlZ2F0ZTogbWV0YS51c2VDbGFzcywgZGVsZWdhdGVEZXBzOiBkZXBzLCBkZWxlZ2F0ZVR5cGU6IFIzRmFjdG9yeURlbGVnYXRlVHlwZS5DbGFzcyB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXNlQ2xhc3NPblNlbGYpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBpbGVGYWN0b3J5RnVuY3Rpb24oZmFjdG9yeU1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29tcGlsZUZhY3RvcnlGdW5jdGlvbihfX2Fzc2lnbih7fSwgZmFjdG9yeU1ldGEsIHsgZGVsZWdhdGU6IG1ldGEudXNlQ2xhc3MsIGRlbGVnYXRlVHlwZTogUjNGYWN0b3J5RGVsZWdhdGVUeXBlLkZhY3RvcnkgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGEudXNlRmFjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IGNvbXBpbGVGYWN0b3J5RnVuY3Rpb24oX19hc3NpZ24oe30sIGZhY3RvcnlNZXRhLCB7IGRlbGVnYXRlOiBtZXRhLnVzZUZhY3RvcnksIGRlbGVnYXRlRGVwczogbWV0YS51c2VyRGVwcyB8fCBbXSwgZGVsZWdhdGVUeXBlOiBSM0ZhY3RvcnlEZWxlZ2F0ZVR5cGUuRnVuY3Rpb24gfSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZXRhLnVzZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTm90ZTogaXQncyBzYWZlIHRvIHVzZSBgbWV0YS51c2VWYWx1ZWAgaW5zdGVhZCBvZiB0aGUgYFVTRV9WQUxVRSBpbiBtZXRhYCBjaGVjayB1c2VkIGZvclxuICAgICAgICAvLyBjbGllbnQgY29kZSBiZWNhdXNlIG1ldGEudXNlVmFsdWUgaXMgYW4gRXhwcmVzc2lvbiB3aGljaCB3aWxsIGJlIGRlZmluZWQgZXZlbiBpZiB0aGUgYWN0dWFsXG4gICAgICAgIC8vIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgICAgICAgcmVzdWx0ID0gY29tcGlsZUZhY3RvcnlGdW5jdGlvbihfX2Fzc2lnbih7fSwgZmFjdG9yeU1ldGEsIHsgZXhwcmVzc2lvbjogbWV0YS51c2VWYWx1ZSB9KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGEudXNlRXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB1c2VFeGlzdGluZyBpcyBhbiBgaW5qZWN0YCBjYWxsIG9uIHRoZSBleGlzdGluZyB0b2tlbi5cbiAgICAgICAgcmVzdWx0ID0gY29tcGlsZUZhY3RvcnlGdW5jdGlvbihfX2Fzc2lnbih7fSwgZmFjdG9yeU1ldGEsIHsgZXhwcmVzc2lvbjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5pbmplY3QpLmNhbGxGbihbbWV0YS51c2VFeGlzdGluZ10pIH0pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGNvbXBpbGVGYWN0b3J5RnVuY3Rpb24oZmFjdG9yeU1ldGEpO1xuICAgIH1cbiAgICB2YXIgdG9rZW4gPSBtZXRhLnR5cGU7XG4gICAgdmFyIHByb3ZpZGVkSW4gPSBtZXRhLnByb3ZpZGVkSW47XG4gICAgdmFyIGV4cHJlc3Npb24gPSBpbXBvcnRFeHByKElkZW50aWZpZXJzLsm1ybVkZWZpbmVJbmplY3RhYmxlKS5jYWxsRm4oW21hcFRvTWFwRXhwcmVzc2lvbih7IHRva2VuOiB0b2tlbiwgZmFjdG9yeTogcmVzdWx0LmZhY3RvcnksIHByb3ZpZGVkSW46IHByb3ZpZGVkSW4gfSldKTtcbiAgICB2YXIgdHlwZSA9IG5ldyBFeHByZXNzaW9uVHlwZShpbXBvcnRFeHByKElkZW50aWZpZXJzLkluamVjdGFibGVEZWYsIFt0eXBlV2l0aFBhcmFtZXRlcnMobWV0YS50eXBlLCBtZXRhLnR5cGVBcmd1bWVudENvdW50KV0pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBzdGF0ZW1lbnRzOiByZXN1bHQuc3RhdGVtZW50cyxcbiAgICB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBhc3NlcnRBcnJheU9mU3RyaW5ncyhpZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAnXCIgKyBpZGVudGlmaWVyICsgXCInIHRvIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuXCIpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAnXCIgKyBpZGVudGlmaWVyICsgXCInIHRvIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxudmFyIFVOVVNBQkxFX0lOVEVSUE9MQVRJT05fUkVHRVhQUyA9IFtcbiAgICAvXlxccyokLyxcbiAgICAvWzw+XS8sXG4gICAgL15be31dJC8sXG4gICAgLyYoI3xbYS16XSkvaSxcbiAgICAvXlxcL1xcLy8sXG5dO1xuZnVuY3Rpb24gYXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHMoaWRlbnRpZmllciwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PSAyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAnXCIgKyBpZGVudGlmaWVyICsgXCInIHRvIGJlIGFuIGFycmF5LCBbc3RhcnQsIGVuZF0uXCIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBzdGFydF8xID0gdmFsdWVbMF07XG4gICAgICAgIHZhciBlbmRfMSA9IHZhbHVlWzFdO1xuICAgICAgICAvLyBDaGVjayBmb3IgdW51c2FibGUgaW50ZXJwb2xhdGlvbiBzeW1ib2xzXG4gICAgICAgIFVOVVNBQkxFX0lOVEVSUE9MQVRJT05fUkVHRVhQUy5mb3JFYWNoKGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgICAgICAgIGlmIChyZWdleHAudGVzdChzdGFydF8xKSB8fCByZWdleHAudGVzdChlbmRfMSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbJ1wiICsgc3RhcnRfMSArIFwiJywgJ1wiICsgZW5kXzEgKyBcIiddIGNvbnRhaW5zIHVudXNhYmxlIGludGVycG9sYXRpb24gc3ltYm9sLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgSW50ZXJwb2xhdGlvbkNvbmZpZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJbnRlcnBvbGF0aW9uQ29uZmlnKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB9XG4gICAgSW50ZXJwb2xhdGlvbkNvbmZpZy5mcm9tQXJyYXkgPSBmdW5jdGlvbiAobWFya2Vycykge1xuICAgICAgICBpZiAoIW1hcmtlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydEludGVycG9sYXRpb25TeW1ib2xzKCdpbnRlcnBvbGF0aW9uJywgbWFya2Vycyk7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGlvbkNvbmZpZyhtYXJrZXJzWzBdLCBtYXJrZXJzWzFdKTtcbiAgICB9O1xuICAgIHJldHVybiBJbnRlcnBvbGF0aW9uQ29uZmlnO1xufSgpKTtcbnZhciBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHID0gbmV3IEludGVycG9sYXRpb25Db25maWcoJ3t7JywgJ319Jyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdFxudmFyIFZFUlNJT04gPSAzO1xudmFyIEpTX0I2NF9QUkVGSVggPSAnIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsJztcbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGZpbGUpIHtcbiAgICAgICAgaWYgKGZpbGUgPT09IHZvaWQgMCkgeyBmaWxlID0gbnVsbDsgfVxuICAgICAgICB0aGlzLmZpbGUgPSBmaWxlO1xuICAgICAgICB0aGlzLnNvdXJjZXNDb250ZW50ID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmxpbmVzID0gW107XG4gICAgICAgIHRoaXMubGFzdENvbDAgPSAwO1xuICAgICAgICB0aGlzLmhhc01hcHBpbmdzID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRoZSBjb250ZW50IGlzIGBudWxsYCB3aGVuIHRoZSBjb250ZW50IGlzIGV4cGVjdGVkIHRvIGJlIGxvYWRlZCB1c2luZyB0aGUgVVJMXG4gICAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRTb3VyY2UgPSBmdW5jdGlvbiAodXJsLCBjb250ZW50KSB7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB2b2lkIDApIHsgY29udGVudCA9IG51bGw7IH1cbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50Lmhhcyh1cmwpKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZXNDb250ZW50LnNldCh1cmwsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2goW10pO1xuICAgICAgICB0aGlzLmxhc3RDb2wwID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFkZE1hcHBpbmcgPSBmdW5jdGlvbiAoY29sMCwgc291cmNlVXJsLCBzb3VyY2VMaW5lMCwgc291cmNlQ29sMCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudExpbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgbGluZSBtdXN0IGJlIGFkZGVkIGJlZm9yZSBtYXBwaW5ncyBjYW4gYmUgYWRkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVVybCAhPSBudWxsICYmICF0aGlzLnNvdXJjZXNDb250ZW50Lmhhcyhzb3VyY2VVcmwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHNvdXJjZSBmaWxlIFxcXCJcIiArIHNvdXJjZVVybCArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sMCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY29sdW1uIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBtdXN0IGJlIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wwIDwgdGhpcy5sYXN0Q29sMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWFwcGluZyBzaG91bGQgYmUgYWRkZWQgaW4gb3V0cHV0IG9yZGVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VVcmwgJiYgKHNvdXJjZUxpbmUwID09IG51bGwgfHwgc291cmNlQ29sMCA9PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNvdXJjZSBsb2NhdGlvbiBtdXN0IGJlIHByb3ZpZGVkIHdoZW4gYSBzb3VyY2UgdXJsIGlzIHByb3ZpZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzTWFwcGluZ3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RDb2wwID0gY29sMDtcbiAgICAgICAgdGhpcy5jdXJyZW50TGluZS5wdXNoKHsgY29sMDogY29sMCwgc291cmNlVXJsOiBzb3VyY2VVcmwsIHNvdXJjZUxpbmUwOiBzb3VyY2VMaW5lMCwgc291cmNlQ29sMDogc291cmNlQ29sMCB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZSwgXCJjdXJyZW50TGluZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5saW5lcy5zbGljZSgtMSlbMF07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuaGFzTWFwcGluZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzb3VyY2VzSW5kZXggPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgICAgIHZhciBzb3VyY2VzQ29udGVudCA9IFtdO1xuICAgICAgICBBcnJheS5mcm9tKHRoaXMuc291cmNlc0NvbnRlbnQua2V5cygpKS5mb3JFYWNoKGZ1bmN0aW9uICh1cmwsIGkpIHtcbiAgICAgICAgICAgIHNvdXJjZXNJbmRleC5zZXQodXJsLCBpKTtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaCh1cmwpO1xuICAgICAgICAgICAgc291cmNlc0NvbnRlbnQucHVzaChfdGhpcy5zb3VyY2VzQ29udGVudC5nZXQodXJsKSB8fCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBtYXBwaW5ncyA9ICcnO1xuICAgICAgICB2YXIgbGFzdENvbDAgPSAwO1xuICAgICAgICB2YXIgbGFzdFNvdXJjZUluZGV4ID0gMDtcbiAgICAgICAgdmFyIGxhc3RTb3VyY2VMaW5lMCA9IDA7XG4gICAgICAgIHZhciBsYXN0U291cmNlQ29sMCA9IDA7XG4gICAgICAgIHRoaXMubGluZXMuZm9yRWFjaChmdW5jdGlvbiAoc2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxhc3RDb2wwID0gMDtcbiAgICAgICAgICAgIG1hcHBpbmdzICs9IHNlZ21lbnRzXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIHplcm8tYmFzZWQgc3RhcnRpbmcgY29sdW1uIG9mIHRoZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgICAgICAgICAgICAgIHZhciBzZWdBc1N0ciA9IHRvQmFzZTY0VkxRKHNlZ21lbnQuY29sMCAtIGxhc3RDb2wwKTtcbiAgICAgICAgICAgICAgICBsYXN0Q29sMCA9IHNlZ21lbnQuY29sMDtcbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5zb3VyY2VVcmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvLWJhc2VkIGluZGV4IGludG8gdGhlIOKAnHNvdXJjZXPigJ0gbGlzdFxuICAgICAgICAgICAgICAgICAgICBzZWdBc1N0ciArPVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9CYXNlNjRWTFEoc291cmNlc0luZGV4LmdldChzZWdtZW50LnNvdXJjZVVybCkgLSBsYXN0U291cmNlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U291cmNlSW5kZXggPSBzb3VyY2VzSW5kZXguZ2V0KHNlZ21lbnQuc291cmNlVXJsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHplcm8tYmFzZWQgc3RhcnRpbmcgbGluZSBpbiB0aGUgb3JpZ2luYWwgc291cmNlXG4gICAgICAgICAgICAgICAgICAgIHNlZ0FzU3RyICs9IHRvQmFzZTY0VkxRKHNlZ21lbnQuc291cmNlTGluZTAgLSBsYXN0U291cmNlTGluZTApO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U291cmNlTGluZTAgPSBzZWdtZW50LnNvdXJjZUxpbmUwO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgemVyby1iYXNlZCBzdGFydGluZyBjb2x1bW4gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBzZWdBc1N0ciArPSB0b0Jhc2U2NFZMUShzZWdtZW50LnNvdXJjZUNvbDAgLSBsYXN0U291cmNlQ29sMCk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RTb3VyY2VDb2wwID0gc2VnbWVudC5zb3VyY2VDb2wwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnQXNTdHI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgICAgICAgICBtYXBwaW5ncyArPSAnOyc7XG4gICAgICAgIH0pO1xuICAgICAgICBtYXBwaW5ncyA9IG1hcHBpbmdzLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdmaWxlJzogdGhpcy5maWxlIHx8ICcnLFxuICAgICAgICAgICAgJ3ZlcnNpb24nOiBWRVJTSU9OLFxuICAgICAgICAgICAgJ3NvdXJjZVJvb3QnOiAnJyxcbiAgICAgICAgICAgICdzb3VyY2VzJzogc291cmNlcyxcbiAgICAgICAgICAgICdzb3VyY2VzQ29udGVudCc6IHNvdXJjZXNDb250ZW50LFxuICAgICAgICAgICAgJ21hcHBpbmdzJzogbWFwcGluZ3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSnNDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNNYXBwaW5ncyA/ICcvLycgKyBKU19CNjRfUFJFRklYICsgdG9CYXNlNjRTdHJpbmcoSlNPTi5zdHJpbmdpZnkodGhpcywgbnVsbCwgMCkpIDpcbiAgICAgICAgICAgICcnO1xuICAgIH07XG4gICAgcmV0dXJuIFNvdXJjZU1hcEdlbmVyYXRvcjtcbn0oKSk7XG5mdW5jdGlvbiB0b0Jhc2U2NFN0cmluZyh2YWx1ZSkge1xuICAgIHZhciBiNjQgPSAnJztcbiAgICB2YWx1ZSA9IHV0ZjhFbmNvZGUodmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOykge1xuICAgICAgICB2YXIgaTEgPSB2YWx1ZS5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICAgIHZhciBpMiA9IHZhbHVlLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgICAgdmFyIGkzID0gdmFsdWUuY2hhckNvZGVBdChpKyspO1xuICAgICAgICBiNjQgKz0gdG9CYXNlNjREaWdpdChpMSA+PiAyKTtcbiAgICAgICAgYjY0ICs9IHRvQmFzZTY0RGlnaXQoKChpMSAmIDMpIDw8IDQpIHwgKGlzTmFOKGkyKSA/IDAgOiBpMiA+PiA0KSk7XG4gICAgICAgIGI2NCArPSBpc05hTihpMikgPyAnPScgOiB0b0Jhc2U2NERpZ2l0KCgoaTIgJiAxNSkgPDwgMikgfCAoaTMgPj4gNikpO1xuICAgICAgICBiNjQgKz0gaXNOYU4oaTIpIHx8IGlzTmFOKGkzKSA/ICc9JyA6IHRvQmFzZTY0RGlnaXQoaTMgJiA2Myk7XG4gICAgfVxuICAgIHJldHVybiBiNjQ7XG59XG5mdW5jdGlvbiB0b0Jhc2U2NFZMUSh2YWx1ZSkge1xuICAgIHZhbHVlID0gdmFsdWUgPCAwID8gKCgtdmFsdWUpIDw8IDEpICsgMSA6IHZhbHVlIDw8IDE7XG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGRpZ2l0ID0gdmFsdWUgJiAzMTtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA+PiA1O1xuICAgICAgICBpZiAodmFsdWUgPiAwKSB7XG4gICAgICAgICAgICBkaWdpdCA9IGRpZ2l0IHwgMzI7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9IHRvQmFzZTY0RGlnaXQoZGlnaXQpO1xuICAgIH0gd2hpbGUgKHZhbHVlID4gMCk7XG4gICAgcmV0dXJuIG91dDtcbn1cbnZhciBCNjRfRElHSVRTID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuZnVuY3Rpb24gdG9CYXNlNjREaWdpdCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuIG9ubHkgZW5jb2RlIHZhbHVlIGluIHRoZSByYW5nZSBbMCwgNjNdXCIpO1xuICAgIH1cbiAgICByZXR1cm4gQjY0X0RJR0lUU1t2YWx1ZV07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvJ3xcXFxcfFxcbnxcXHJ8XFwkL2c7XG52YXIgX0xFR0FMX0lERU5USUZJRVJfUkUgPSAvXlskQS1aX11bMC05QS1aXyRdKiQvaTtcbnZhciBfSU5ERU5UX1dJVEggPSAnICAnO1xudmFyIENBVENIX0VSUk9SX1ZBUiQxID0gdmFyaWFibGUoJ2Vycm9yJywgbnVsbCwgbnVsbCk7XG52YXIgQ0FUQ0hfU1RBQ0tfVkFSJDEgPSB2YXJpYWJsZSgnc3RhY2snLCBudWxsLCBudWxsKTtcbnZhciBfRW1pdHRlZExpbmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX0VtaXR0ZWRMaW5lKGluZGVudCkge1xuICAgICAgICB0aGlzLmluZGVudCA9IGluZGVudDtcbiAgICAgICAgdGhpcy5wYXJ0c0xlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMucGFydHMgPSBbXTtcbiAgICAgICAgdGhpcy5zcmNTcGFucyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gX0VtaXR0ZWRMaW5lO1xufSgpKTtcbnZhciBFbWl0dGVyVmlzaXRvckNvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRW1pdHRlclZpc2l0b3JDb250ZXh0KF9pbmRlbnQpIHtcbiAgICAgICAgdGhpcy5faW5kZW50ID0gX2luZGVudDtcbiAgICAgICAgdGhpcy5fY2xhc3NlcyA9IFtdO1xuICAgICAgICB0aGlzLl9wcmVhbWJsZUxpbmVDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX2xpbmVzID0gW25ldyBfRW1pdHRlZExpbmUoX2luZGVudCldO1xuICAgIH1cbiAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQuY3JlYXRlUm9vdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBFbWl0dGVyVmlzaXRvckNvbnRleHQoMCk7IH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUsIFwiX2N1cnJlbnRMaW5lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9saW5lc1t0aGlzLl9saW5lcy5sZW5ndGggLSAxXTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5wcmludGxuID0gZnVuY3Rpb24gKGZyb20sIGxhc3RQYXJ0KSB7XG4gICAgICAgIGlmIChsYXN0UGFydCA9PT0gdm9pZCAwKSB7IGxhc3RQYXJ0ID0gJyc7IH1cbiAgICAgICAgdGhpcy5wcmludChmcm9tIHx8IG51bGwsIGxhc3RQYXJ0LCB0cnVlKTtcbiAgICB9O1xuICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUubGluZUlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jdXJyZW50TGluZS5wYXJ0cy5sZW5ndGggPT09IDA7IH07XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5saW5lTGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudExpbmUuaW5kZW50ICogX0lOREVOVF9XSVRILmxlbmd0aCArIHRoaXMuX2N1cnJlbnRMaW5lLnBhcnRzTGVuZ3RoO1xuICAgIH07XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5wcmludCA9IGZ1bmN0aW9uIChmcm9tLCBwYXJ0LCBuZXdMaW5lKSB7XG4gICAgICAgIGlmIChuZXdMaW5lID09PSB2b2lkIDApIHsgbmV3TGluZSA9IGZhbHNlOyB9XG4gICAgICAgIGlmIChwYXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMaW5lLnBhcnRzLnB1c2gocGFydCk7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50TGluZS5wYXJ0c0xlbmd0aCArPSBwYXJ0Lmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMaW5lLnNyY1NwYW5zLnB1c2goZnJvbSAmJiBmcm9tLnNvdXJjZVNwYW4gfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0xpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLnB1c2gobmV3IF9FbWl0dGVkTGluZSh0aGlzLl9pbmRlbnQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5yZW1vdmVFbXB0eUxhc3RMaW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5saW5lSXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9saW5lcy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5pbmNJbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2luZGVudCsrO1xuICAgICAgICBpZiAodGhpcy5saW5lSXNFbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50TGluZS5pbmRlbnQgPSB0aGlzLl9pbmRlbnQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUuZGVjSW5kZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9pbmRlbnQtLTtcbiAgICAgICAgaWYgKHRoaXMubGluZUlzRW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudExpbmUuaW5kZW50ID0gdGhpcy5faW5kZW50O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLnB1c2hDbGFzcyA9IGZ1bmN0aW9uIChjbGF6eikgeyB0aGlzLl9jbGFzc2VzLnB1c2goY2xhenopOyB9O1xuICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUucG9wQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jbGFzc2VzLnBvcCgpOyB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLCBcImN1cnJlbnRDbGFzc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXMubGVuZ3RoID4gMCA/IHRoaXMuX2NsYXNzZXNbdGhpcy5fY2xhc3Nlcy5sZW5ndGggLSAxXSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUxpbmVzXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChsKSB7IHJldHVybiBsLnBhcnRzLmxlbmd0aCA+IDAgPyBfY3JlYXRlSW5kZW50KGwuaW5kZW50KSArIGwucGFydHMuam9pbignJykgOiAnJzsgfSlcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9O1xuICAgIEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5wcm90b3R5cGUudG9Tb3VyY2VNYXBHZW5lcmF0b3IgPSBmdW5jdGlvbiAoZ2VuRmlsZVBhdGgsIHN0YXJ0c0F0TGluZSkge1xuICAgICAgICBpZiAoc3RhcnRzQXRMaW5lID09PSB2b2lkIDApIHsgc3RhcnRzQXRMaW5lID0gMDsgfVxuICAgICAgICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihnZW5GaWxlUGF0aCk7XG4gICAgICAgIHZhciBmaXJzdE9mZnNldE1hcHBlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgbWFwRmlyc3RPZmZzZXRJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghZmlyc3RPZmZzZXRNYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBzaW5nbGUgc3BhY2Ugc28gdGhhdCB0b29scyB3b24ndCB0cnkgdG8gbG9hZCB0aGUgZmlsZSBmcm9tIGRpc2suXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgYXJlIHVzaW5nIHZpcnR1YWwgdXJscyBsaWtlIGBuZzovLy9gLCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgICAgICAgICAgLy8gcHJvdmlkZSBhIGNvbnRlbnQgaGVyZS5cbiAgICAgICAgICAgICAgICBtYXAuYWRkU291cmNlKGdlbkZpbGVQYXRoLCAnICcpLmFkZE1hcHBpbmcoMCwgZ2VuRmlsZVBhdGgsIDAsIDApO1xuICAgICAgICAgICAgICAgIGZpcnN0T2Zmc2V0TWFwcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydHNBdExpbmU7IGkrKykge1xuICAgICAgICAgICAgbWFwLmFkZExpbmUoKTtcbiAgICAgICAgICAgIG1hcEZpcnN0T2Zmc2V0SWZOZWVkZWQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvdXJjZUxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUsIGxpbmVJZHgpIHtcbiAgICAgICAgICAgIG1hcC5hZGRMaW5lKCk7XG4gICAgICAgICAgICB2YXIgc3BhbnMgPSBsaW5lLnNyY1NwYW5zO1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gbGluZS5wYXJ0cztcbiAgICAgICAgICAgIHZhciBjb2wwID0gbGluZS5pbmRlbnQgKiBfSU5ERU5UX1dJVEgubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHNwYW5JZHggPSAwO1xuICAgICAgICAgICAgLy8gc2tpcCBsZWFkaW5nIHBhcnRzIHdpdGhvdXQgc291cmNlIHNwYW5zXG4gICAgICAgICAgICB3aGlsZSAoc3BhbklkeCA8IHNwYW5zLmxlbmd0aCAmJiAhc3BhbnNbc3BhbklkeF0pIHtcbiAgICAgICAgICAgICAgICBjb2wwICs9IHBhcnRzW3NwYW5JZHhdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBzcGFuSWR4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BhbklkeCA8IHNwYW5zLmxlbmd0aCAmJiBsaW5lSWR4ID09PSAwICYmIGNvbDAgPT09IDApIHtcbiAgICAgICAgICAgICAgICBmaXJzdE9mZnNldE1hcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBGaXJzdE9mZnNldElmTmVlZGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoc3BhbklkeCA8IHNwYW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNbc3BhbklkeF07XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHNwYW4uc3RhcnQuZmlsZTtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlTGluZSA9IHNwYW4uc3RhcnQubGluZTtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlQ29sID0gc3Bhbi5zdGFydC5jb2w7XG4gICAgICAgICAgICAgICAgbWFwLmFkZFNvdXJjZShzb3VyY2UudXJsLCBzb3VyY2UuY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoY29sMCwgc291cmNlLnVybCwgc291cmNlTGluZSwgc291cmNlQ29sKTtcbiAgICAgICAgICAgICAgICBjb2wwICs9IHBhcnRzW3NwYW5JZHhdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBzcGFuSWR4Kys7XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIHBhcnRzIHdpdGhvdXQgc3BhbiBvciB0aGUgc2FtZSBzcGFuIHRvIHRoZSBwcmV2aW91cyBzZWdtZW50XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNwYW5JZHggPCBzcGFucy5sZW5ndGggJiYgKHNwYW4gPT09IHNwYW5zW3NwYW5JZHhdIHx8ICFzcGFuc1tzcGFuSWR4XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sMCArPSBwYXJ0c1tzcGFuSWR4XS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHNwYW5JZHgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH07XG4gICAgRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZS5zZXRQcmVhbWJsZUxpbmVDb3VudCA9IGZ1bmN0aW9uIChjb3VudCkgeyByZXR1cm4gdGhpcy5fcHJlYW1ibGVMaW5lQ291bnQgPSBjb3VudDsgfTtcbiAgICBFbWl0dGVyVmlzaXRvckNvbnRleHQucHJvdG90eXBlLnNwYW5PZiA9IGZ1bmN0aW9uIChsaW5lLCBjb2x1bW4pIHtcbiAgICAgICAgdmFyIGVtaXR0ZWRMaW5lID0gdGhpcy5fbGluZXNbbGluZSAtIHRoaXMuX3ByZWFtYmxlTGluZUNvdW50XTtcbiAgICAgICAgaWYgKGVtaXR0ZWRMaW5lKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uc0xlZnQgPSBjb2x1bW4gLSBfY3JlYXRlSW5kZW50KGVtaXR0ZWRMaW5lLmluZGVudCkubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgcGFydEluZGV4ID0gMDsgcGFydEluZGV4IDwgZW1pdHRlZExpbmUucGFydHMubGVuZ3RoOyBwYXJ0SW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gZW1pdHRlZExpbmUucGFydHNbcGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAocGFydC5sZW5ndGggPiBjb2x1bW5zTGVmdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdHRlZExpbmUuc3JjU3BhbnNbcGFydEluZGV4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sdW1uc0xlZnQgLT0gcGFydC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRW1pdHRlclZpc2l0b3JDb250ZXh0LnByb3RvdHlwZSwgXCJzb3VyY2VMaW5lc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVzLmxlbmd0aCAmJiB0aGlzLl9saW5lc1t0aGlzLl9saW5lcy5sZW5ndGggLSAxXS5wYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZXMuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gRW1pdHRlclZpc2l0b3JDb250ZXh0O1xufSgpKTtcbnZhciBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFic3RyYWN0RW1pdHRlclZpc2l0b3IoX2VzY2FwZURvbGxhckluU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9lc2NhcGVEb2xsYXJJblN0cmluZ3MgPSBfZXNjYXBlRG9sbGFySW5TdHJpbmdzO1xuICAgIH1cbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cHJlc3Npb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBzdG10LmV4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsICc7Jyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZXR1cm5TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJyZXR1cm4gXCIpO1xuICAgICAgICBzdG10LnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCAnOycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWZTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJpZiAoXCIpO1xuICAgICAgICBzdG10LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KHN0bXQsIFwiKSB7XCIpO1xuICAgICAgICB2YXIgaGFzRWxzZUNhc2UgPSBzdG10LmZhbHNlQ2FzZSAhPSBudWxsICYmIHN0bXQuZmFsc2VDYXNlLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChzdG10LnRydWVDYXNlLmxlbmd0aCA8PSAxICYmICFoYXNFbHNlQ2FzZSkge1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsIFwiIFwiKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQudHJ1ZUNhc2UsIGN0eCk7XG4gICAgICAgICAgICBjdHgucmVtb3ZlRW1wdHlMYXN0TGluZSgpO1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsIFwiIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN0eC5wcmludGxuKCk7XG4gICAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LnRydWVDYXNlLCBjdHgpO1xuICAgICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgICAgaWYgKGhhc0Vsc2VDYXNlKSB7XG4gICAgICAgICAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9IGVsc2Uge1wiKTtcbiAgICAgICAgICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5mYWxzZUNhc2UsIGN0eCk7XG4gICAgICAgICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRocm93U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KHN0bXQsIFwidGhyb3cgXCIpO1xuICAgICAgICBzdG10LmVycm9yLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIjtcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tZW50U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgaWYgKHN0bXQubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIi8qIFwiICsgc3RtdC5jb21tZW50ICsgXCIgKi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdG10LmNvbW1lbnQuc3BsaXQoJ1xcbicpLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHsgY3R4LnByaW50bG4oc3RtdCwgXCIvLyBcIiArIGxpbmUpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SlNEb2NDb21tZW50U3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCIvKlwiICsgc3RtdC50b1N0cmluZygpICsgXCIqL1wiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyaXRlVmFyRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIGxpbmVXYXNFbXB0eSA9IGN0eC5saW5lSXNFbXB0eSgpO1xuICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgY3R4LnByaW50KGV4cHIsICcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50KGV4cHIsIGV4cHIubmFtZSArIFwiID0gXCIpO1xuICAgICAgICBleHByLnZhbHVlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgY3R4LnByaW50KGV4cHIsICcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyaXRlS2V5RXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIGxpbmVXYXNFbXB0eSA9IGN0eC5saW5lSXNFbXB0eSgpO1xuICAgICAgICBpZiAoIWxpbmVXYXNFbXB0eSkge1xuICAgICAgICAgICAgY3R4LnByaW50KGV4cHIsICcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiW1wiKTtcbiAgICAgICAgZXhwci5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiXSA9IFwiKTtcbiAgICAgICAgZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgaWYgKCFsaW5lV2FzRW1wdHkpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChleHByLCAnKScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRXcml0ZVByb3BFeHByID0gZnVuY3Rpb24gKGV4cHIsIGN0eCkge1xuICAgICAgICB2YXIgbGluZVdhc0VtcHR5ID0gY3R4LmxpbmVJc0VtcHR5KCk7XG4gICAgICAgIGlmICghbGluZVdhc0VtcHR5KSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoZXhwciwgJygnKTtcbiAgICAgICAgfVxuICAgICAgICBleHByLnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnQoZXhwciwgXCIuXCIgKyBleHByLm5hbWUgKyBcIiA9IFwiKTtcbiAgICAgICAgZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgaWYgKCFsaW5lV2FzRW1wdHkpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChleHByLCAnKScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnZva2VNZXRob2RFeHByID0gZnVuY3Rpb24gKGV4cHIsIGN0eCkge1xuICAgICAgICBleHByLnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICB2YXIgbmFtZSA9IGV4cHIubmFtZTtcbiAgICAgICAgaWYgKGV4cHIuYnVpbHRpbiAhPSBudWxsKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5nZXRCdWlsdGluTWV0aG9kTmFtZShleHByLmJ1aWx0aW4pO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIHNvbWUgYnVpbHRpbnMganVzdCBtZWFuIHRvIHNraXAgdGhlIGNhbGwuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiLlwiICsgbmFtZSArIFwiKFwiKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGV4cHIuYXJncywgY3R4LCBcIixcIik7XG4gICAgICAgIGN0eC5wcmludChleHByLCBcIilcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY3R4KSB7XG4gICAgICAgIGV4cHIuZm4udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChleHByLCBcIihcIik7XG4gICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhleHByLmFyZ3MsIGN0eCwgJywnKTtcbiAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyYXBwZWROb2RlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGVtaXR0ZXIgY2Fubm90IHZpc2l0IFdyYXBwZWROb2RlRXhwci4nKTtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHlwZW9mRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KGV4cHIsICd0eXBlb2YgJyk7XG4gICAgICAgIGV4cHIuZXhwci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIHZhck5hbWUgPSBhc3QubmFtZTtcbiAgICAgICAgaWYgKGFzdC5idWlsdGluICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYXN0LmJ1aWx0aW4pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuU3VwZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPSAnc3VwZXInO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuVGhpczpcbiAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9ICd0aGlzJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluVmFyLkNhdGNoRXJyb3I6XG4gICAgICAgICAgICAgICAgICAgIHZhck5hbWUgPSBDQVRDSF9FUlJPUl9WQVIkMS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuQ2F0Y2hTdGFjazpcbiAgICAgICAgICAgICAgICAgICAgdmFyTmFtZSA9IENBVENIX1NUQUNLX1ZBUiQxLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiB2YXJpYWJsZSBcIiArIGFzdC5idWlsdGluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnQoYXN0LCB2YXJOYW1lKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEluc3RhbnRpYXRlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIm5ldyBcIik7XG4gICAgICAgIGFzdC5jbGFzc0V4cHIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKFwiKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5hcmdzLCBjdHgsICcsJyk7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFzdC52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChhc3QsIGVzY2FwZUlkZW50aWZpZXIodmFsdWUsIHRoaXMuX2VzY2FwZURvbGxhckluU3RyaW5ncykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3R4LnByaW50KGFzdCwgXCJcIiArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKFwiKTtcbiAgICAgICAgYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgJz8gJyk7XG4gICAgICAgIGFzdC50cnVlQ2FzZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgJzogJyk7XG4gICAgICAgIGFzdC5mYWxzZUNhc2UudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdE5vdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgJyEnKTtcbiAgICAgICAgYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFzc2VydE5vdE51bGxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGFzdC5jb25kaXRpb24udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIG9wU3RyO1xuICAgICAgICBzd2l0Y2ggKGFzdC5vcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5FcXVhbHM6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnPT0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5JZGVudGljYWw6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnPT09JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTm90RXF1YWxzOlxuICAgICAgICAgICAgICAgIG9wU3RyID0gJyE9JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTm90SWRlbnRpY2FsOlxuICAgICAgICAgICAgICAgIG9wU3RyID0gJyE9PSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkFuZDpcbiAgICAgICAgICAgICAgICBvcFN0ciA9ICcmJic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkJpdHdpc2VBbmQ6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnJic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLk9yOlxuICAgICAgICAgICAgICAgIG9wU3RyID0gJ3x8JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuUGx1czpcbiAgICAgICAgICAgICAgICBvcFN0ciA9ICcrJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTWludXM6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnLSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkRpdmlkZTpcbiAgICAgICAgICAgICAgICBvcFN0ciA9ICcvJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTXVsdGlwbHk6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnKic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLk1vZHVsbzpcbiAgICAgICAgICAgICAgICBvcFN0ciA9ICclJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTG93ZXI6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnPCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkxvd2VyRXF1YWxzOlxuICAgICAgICAgICAgICAgIG9wU3RyID0gJzw9JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuQmlnZ2VyOlxuICAgICAgICAgICAgICAgIG9wU3RyID0gJz4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5CaWdnZXJFcXVhbHM6XG4gICAgICAgICAgICAgICAgb3BTdHIgPSAnPj0nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9wZXJhdG9yIFwiICsgYXN0Lm9wZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXN0LnBhcmVucylcbiAgICAgICAgICAgIGN0eC5wcmludChhc3QsIFwiKFwiKTtcbiAgICAgICAgYXN0Lmxocy52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCIgXCIgKyBvcFN0ciArIFwiIFwiKTtcbiAgICAgICAgYXN0LnJocy52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgaWYgKGFzdC5wYXJlbnMpXG4gICAgICAgICAgICBjdHgucHJpbnQoYXN0LCBcIilcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIi5cIik7XG4gICAgICAgIGN0eC5wcmludChhc3QsIGFzdC5uYW1lKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRLZXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCJbXCIpO1xuICAgICAgICBhc3QuaW5kZXgudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiXVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCJbXCIpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmVudHJpZXMsIGN0eCwgJywnKTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCJdXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbE1hcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCJ7XCIpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsT2JqZWN0cyhmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChhc3QsIGVzY2FwZUlkZW50aWZpZXIoZW50cnkua2V5LCBfdGhpcy5fZXNjYXBlRG9sbGFySW5TdHJpbmdzLCBlbnRyeS5xdW90ZWQpICsgXCI6XCIpO1xuICAgICAgICAgICAgZW50cnkudmFsdWUudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjdHgpO1xuICAgICAgICB9LCBhc3QuZW50cmllcywgY3R4LCAnLCcpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIn1cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tYUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgJygnKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5wYXJ0cywgY3R4LCAnLCcpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCAnKScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbnMsIGN0eCwgc2VwYXJhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMudmlzaXRBbGxPYmplY3RzKGZ1bmN0aW9uIChleHByKSB7IHJldHVybiBleHByLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfSwgZXhwcmVzc2lvbnMsIGN0eCwgc2VwYXJhdG9yKTtcbiAgICB9O1xuICAgIEFic3RyYWN0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsT2JqZWN0cyA9IGZ1bmN0aW9uIChoYW5kbGVyLCBleHByZXNzaW9ucywgY3R4LCBzZXBhcmF0b3IpIHtcbiAgICAgICAgdmFyIGluY3JlbWVudGVkSW5kZW50ID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChjdHgubGluZUxlbmd0aCgpID4gODApIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnByaW50KG51bGwsIHNlcGFyYXRvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5jcmVtZW50ZWRJbmRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBhcmUgbWFya2VkIHdpdGggZG91YmxlIGluZGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LnByaW50KG51bGwsIHNlcGFyYXRvciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhbmRsZXIoZXhwcmVzc2lvbnNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNyZW1lbnRlZEluZGVudCkge1xuICAgICAgICAgICAgLy8gY29udGludWF0aW9uIGFyZSBtYXJrZWQgd2l0aCBkb3VibGUgaW5kZW50LlxuICAgICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFsbFN0YXRlbWVudHMgPSBmdW5jdGlvbiAoc3RhdGVtZW50cywgY3R4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN0YXRlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoc3RtdCkgeyByZXR1cm4gc3RtdC52aXNpdFN0YXRlbWVudChfdGhpcywgY3R4KTsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQWJzdHJhY3RFbWl0dGVyVmlzaXRvcjtcbn0oKSk7XG5mdW5jdGlvbiBlc2NhcGVJZGVudGlmaWVyKGlucHV0LCBlc2NhcGVEb2xsYXIsIGFsd2F5c1F1b3RlKSB7XG4gICAgaWYgKGFsd2F5c1F1b3RlID09PSB2b2lkIDApIHsgYWx3YXlzUXVvdGUgPSB0cnVlOyB9XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBib2R5ID0gaW5wdXQucmVwbGFjZShfU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBtYXRjaFtfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFswXSA9PSAnJCcpIHtcbiAgICAgICAgICAgIHJldHVybiBlc2NhcGVEb2xsYXIgPyAnXFxcXCQnIDogJyQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoWzBdID09ICdcXG4nKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaFswXSA9PSAnXFxyJykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxccic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcXFxcXCIgKyBtYXRjaFswXTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHZhciByZXF1aXJlc1F1b3RlcyA9IGFsd2F5c1F1b3RlIHx8ICFfTEVHQUxfSURFTlRJRklFUl9SRS50ZXN0KGJvZHkpO1xuICAgIHJldHVybiByZXF1aXJlc1F1b3RlcyA/IFwiJ1wiICsgYm9keSArIFwiJ1wiIDogYm9keTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVJbmRlbnQoY291bnQpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHJlcyArPSBfSU5ERU5UX1dJVEg7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBmYWxzZSkgfHwgdGhpcztcbiAgICB9XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVDbGFzc1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGN0eC5wdXNoQ2xhc3Moc3RtdCk7XG4gICAgICAgIHRoaXMuX3Zpc2l0Q2xhc3NDb25zdHJ1Y3RvcihzdG10LCBjdHgpO1xuICAgICAgICBpZiAoc3RtdC5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsIHN0bXQubmFtZSArIFwiLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoXCIpO1xuICAgICAgICAgICAgc3RtdC5wYXJlbnQudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIi5wcm90b3R5cGUpO1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzdG10LmdldHRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZ2V0dGVyKSB7IHJldHVybiBfdGhpcy5fdmlzaXRDbGFzc0dldHRlcihzdG10LCBnZXR0ZXIsIGN0eCk7IH0pO1xuICAgICAgICBzdG10Lm1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7IHJldHVybiBfdGhpcy5fdmlzaXRDbGFzc01ldGhvZChzdG10LCBtZXRob2QsIGN0eCk7IH0pO1xuICAgICAgICBjdHgucG9wQ2xhc3MoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIGN0eC5wcmludChzdG10LCBcImZ1bmN0aW9uIFwiICsgc3RtdC5uYW1lICsgXCIoXCIpO1xuICAgICAgICBpZiAoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhzdG10LmNvbnN0cnVjdG9yTWV0aG9kLnBhcmFtcywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIikge1wiKTtcbiAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICBpZiAoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcInZhciBzZWxmID0gdGhpcztcIik7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5ib2R5LCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9XCIpO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRDbGFzc0dldHRlciA9IGZ1bmN0aW9uIChzdG10LCBnZXR0ZXIsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIk9iamVjdC5kZWZpbmVQcm9wZXJ0eShcIiArIHN0bXQubmFtZSArIFwiLnByb3RvdHlwZSwgJ1wiICsgZ2V0dGVyLm5hbWUgKyBcIicsIHsgZ2V0OiBmdW5jdGlvbigpIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgaWYgKGdldHRlci5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwidmFyIHNlbGYgPSB0aGlzO1wiKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKGdldHRlci5ib2R5LCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9fSk7XCIpO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRDbGFzc01ldGhvZCA9IGZ1bmN0aW9uIChzdG10LCBtZXRob2QsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoc3RtdCwgc3RtdC5uYW1lICsgXCIucHJvdG90eXBlLlwiICsgbWV0aG9kLm5hbWUgKyBcIiA9IGZ1bmN0aW9uKFwiKTtcbiAgICAgICAgdGhpcy5fdmlzaXRQYXJhbXMobWV0aG9kLnBhcmFtcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCIpIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgaWYgKG1ldGhvZC5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwidmFyIHNlbGYgPSB0aGlzO1wiKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKG1ldGhvZC5ib2R5LCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9O1wiKTtcbiAgICB9O1xuICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRXcmFwcGVkTm9kZUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZW1pdCBhIFdyYXBwZWROb2RlRXhwciBpbiBKYXZhc2NyaXB0LicpO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGlmIChhc3QuYnVpbHRpbiA9PT0gQnVpbHRpblZhci5UaGlzKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoYXN0LCAnc2VsZicpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFzdC5idWlsdGluID09PSBCdWlsdGluVmFyLlN1cGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCInc3VwZXInIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXQgYSBwYXJlbnQgYXN0IG5vZGUsIG5vdCBhdCB0aGUgdmFyaWFibGUgbGV2ZWwhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS52aXNpdFJlYWRWYXJFeHByLmNhbGwodGhpcywgYXN0LCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVWYXJTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJ2YXIgXCIgKyBzdG10Lm5hbWUpO1xuICAgICAgICBpZiAoc3RtdC52YWx1ZSkge1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsICcgPSAnKTtcbiAgICAgICAgICAgIHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCI7XCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0SnNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDYXN0RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICBhc3QudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludm9rZUZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIGZuRXhwciA9IGV4cHIuZm47XG4gICAgICAgIGlmIChmbkV4cHIgaW5zdGFuY2VvZiBSZWFkVmFyRXhwciAmJiBmbkV4cHIuYnVpbHRpbiA9PT0gQnVpbHRpblZhci5TdXBlcikge1xuICAgICAgICAgICAgY3R4LmN1cnJlbnRDbGFzcy5wYXJlbnQudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgICBjdHgucHJpbnQoZXhwciwgXCIuY2FsbCh0aGlzXCIpO1xuICAgICAgICAgICAgaWYgKGV4cHIuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiLCBcIik7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGV4cHIuYXJncywgY3R4LCAnLCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LnByaW50KGV4cHIsIFwiKVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUudmlzaXRJbnZva2VGdW5jdGlvbkV4cHIuY2FsbCh0aGlzLCBleHByLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcImZ1bmN0aW9uXCIgKyAoYXN0Lm5hbWUgPyAnICcgKyBhc3QubmFtZSA6ICcnKSArIFwiKFwiKTtcbiAgICAgICAgdGhpcy5fdmlzaXRQYXJhbXMoYXN0LnBhcmFtcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50bG4oYXN0LCBcIikge1wiKTtcbiAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhhc3Quc3RhdGVtZW50cywgY3R4KTtcbiAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIn1cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVGdW5jdGlvblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIGN0eC5wcmludChzdG10LCBcImZ1bmN0aW9uIFwiICsgc3RtdC5uYW1lICsgXCIoXCIpO1xuICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhzdG10LnBhcmFtcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCIpIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5zdGF0ZW1lbnRzLCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHJ5Q2F0Y2hTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcInRyeSB7XCIpO1xuICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKHN0bXQuYm9keVN0bXRzLCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwifSBjYXRjaCAoXCIgKyBDQVRDSF9FUlJPUl9WQVIkMS5uYW1lICsgXCIpIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgdmFyIGNhdGNoU3RtdHMgPSBbQ0FUQ0hfU1RBQ0tfVkFSJDEuc2V0KENBVENIX0VSUk9SX1ZBUiQxLnByb3AoJ3N0YWNrJykpLnRvRGVjbFN0bXQobnVsbCwgW1xuICAgICAgICAgICAgICAgIFN0bXRNb2RpZmllci5GaW5hbFxuICAgICAgICAgICAgXSldLmNvbmNhdChzdG10LmNhdGNoU3RtdHMpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhjYXRjaFN0bXRzLCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdFBhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGN0eCkge1xuICAgICAgICB0aGlzLnZpc2l0QWxsT2JqZWN0cyhmdW5jdGlvbiAocGFyYW0pIHsgcmV0dXJuIGN0eC5wcmludChudWxsLCBwYXJhbS5uYW1lKTsgfSwgcGFyYW1zLCBjdHgsICcsJyk7XG4gICAgfTtcbiAgICBBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLmdldEJ1aWx0aW5NZXRob2ROYW1lID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5Db25jYXRBcnJheTpcbiAgICAgICAgICAgICAgICBuYW1lID0gJ2NvbmNhdCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJ1aWx0aW5NZXRob2QuU3Vic2NyaWJlT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICBuYW1lID0gJ3N1YnNjcmliZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJ1aWx0aW5NZXRob2QuQmluZDpcbiAgICAgICAgICAgICAgICBuYW1lID0gJ2JpbmQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGJ1aWx0aW4gbWV0aG9kOiBcIiArIG1ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcbiAgICByZXR1cm4gQWJzdHJhY3RKc0VtaXR0ZXJWaXNpdG9yO1xufShBYnN0cmFjdEVtaXR0ZXJWaXNpdG9yKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSBoZWxwZXIgY2xhc3MgdG8gbWFuYWdlIHRoZSBldmFsdWF0aW9uIG9mIEpJVCBnZW5lcmF0ZWQgY29kZS5cbiAqL1xudmFyIEppdEV2YWx1YXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBKaXRFdmFsdWF0b3IoKSB7XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVybCBUaGUgVVJMIG9mIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiAgICAgKiBAcGFyYW0gc3RhdGVtZW50cyBBbiBhcnJheSBvZiBBbmd1bGFyIHN0YXRlbWVudCBBU1Qgbm9kZXMgdG8gYmUgZXZhbHVhdGVkLlxuICAgICAqIEBwYXJhbSByZWZsZWN0b3IgQSBoZWxwZXIgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIHN0YXRlbWVudHMgdG8gZXhlY3V0YWJsZSBjb2RlLlxuICAgICAqIEBwYXJhbSBjcmVhdGVTb3VyY2VNYXBzIElmIHRydWUgdGhlbiBjcmVhdGUgYSBzb3VyY2UtbWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUgYW5kIGluY2x1ZGUgaXRcbiAgICAgKiBpbmxpbmUgYXMgYSBzb3VyY2UtbWFwIGNvbW1lbnQuXG4gICAgICogQHJldHVybnMgQSBtYXAgb2YgYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuICAgICAqL1xuICAgIEppdEV2YWx1YXRvci5wcm90b3R5cGUuZXZhbHVhdGVTdGF0ZW1lbnRzID0gZnVuY3Rpb24gKHNvdXJjZVVybCwgc3RhdGVtZW50cywgcmVmbGVjdG9yLCBjcmVhdGVTb3VyY2VNYXBzKSB7XG4gICAgICAgIHZhciBjb252ZXJ0ZXIgPSBuZXcgSml0RW1pdHRlclZpc2l0b3IocmVmbGVjdG9yKTtcbiAgICAgICAgdmFyIGN0eCA9IEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5jcmVhdGVSb290KCk7XG4gICAgICAgIC8vIEVuc3VyZSBnZW5lcmF0ZWQgY29kZSBpcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICBpZiAoc3RhdGVtZW50cy5sZW5ndGggPiAwICYmICFpc1VzZVN0cmljdFN0YXRlbWVudChzdGF0ZW1lbnRzWzBdKSkge1xuICAgICAgICAgICAgc3RhdGVtZW50cyA9IF9fc3ByZWFkKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKCd1c2Ugc3RyaWN0JykudG9TdG10KClcbiAgICAgICAgICAgIF0sIHN0YXRlbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnRlci52aXNpdEFsbFN0YXRlbWVudHMoc3RhdGVtZW50cywgY3R4KTtcbiAgICAgICAgY29udmVydGVyLmNyZWF0ZVJldHVyblN0bXQoY3R4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVDb2RlKHNvdXJjZVVybCwgY3R4LCBjb252ZXJ0ZXIuZ2V0QXJncygpLCBjcmVhdGVTb3VyY2VNYXBzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV2YWx1YXRlIGEgcGllY2Ugb2YgSklUIGdlbmVyYXRlZCBjb2RlLlxuICAgICAqIEBwYXJhbSBzb3VyY2VVcmwgVGhlIFVSTCBvZiB0aGlzIGdlbmVyYXRlZCBjb2RlLlxuICAgICAqIEBwYXJhbSBjdHggQSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFuIEFTVCBvZiB0aGUgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQHBhcmFtIHZhcnMgQSBtYXAgY29udGFpbmluZyB0aGUgbmFtZXMgYW5kIHZhbHVlcyBvZiB2YXJpYWJsZXMgdGhhdCB0aGUgZXZhbHVhdGVkIGNvZGUgbWlnaHRcbiAgICAgKiByZWZlcmVuY2UuXG4gICAgICogQHBhcmFtIGNyZWF0ZVNvdXJjZU1hcCBJZiB0cnVlIHRoZW4gY3JlYXRlIGEgc291cmNlLW1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlIGFuZCBpbmNsdWRlIGl0XG4gICAgICogaW5saW5lIGFzIGEgc291cmNlLW1hcCBjb21tZW50LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgY29kZS5cbiAgICAgKi9cbiAgICBKaXRFdmFsdWF0b3IucHJvdG90eXBlLmV2YWx1YXRlQ29kZSA9IGZ1bmN0aW9uIChzb3VyY2VVcmwsIGN0eCwgdmFycywgY3JlYXRlU291cmNlTWFwKSB7XG4gICAgICAgIHZhciBmbkJvZHkgPSBjdHgudG9Tb3VyY2UoKSArIFwiXFxuLy8jIHNvdXJjZVVSTD1cIiArIHNvdXJjZVVybDtcbiAgICAgICAgdmFyIGZuQXJnTmFtZXMgPSBbXTtcbiAgICAgICAgdmFyIGZuQXJnVmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGFyZ05hbWUgaW4gdmFycykge1xuICAgICAgICAgICAgZm5BcmdWYWx1ZXMucHVzaCh2YXJzW2FyZ05hbWVdKTtcbiAgICAgICAgICAgIGZuQXJnTmFtZXMucHVzaChhcmdOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3JlYXRlU291cmNlTWFwKSB7XG4gICAgICAgICAgICAvLyB1c2luZyBgbmV3IEZ1bmN0aW9uKC4uLilgIGdlbmVyYXRlcyBhIGhlYWRlciwgMSBsaW5lIG9mIG5vIGFyZ3VtZW50cywgMiBsaW5lcyBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIEUuZy4gYGBgXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBhbm9ueW1vdXMoYSxiLGNcbiAgICAgICAgICAgIC8vIC8qKi8pIHsgLi4uIH1gYGBcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaGFyZCBjb2RlIHRoaXMgZmFjdCwgc28gd2UgYXV0byBkZXRlY3QgaXQgdmlhIGFuIGVtcHR5IGZ1bmN0aW9uIGZpcnN0LlxuICAgICAgICAgICAgdmFyIGVtcHR5Rm4gPSBuZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoRnVuY3Rpb24sIF9fc3ByZWFkKFt2b2lkIDBdLCBmbkFyZ05hbWVzLmNvbmNhdCgncmV0dXJuIG51bGw7JykpKSkoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgdmFyIGhlYWRlckxpbmVzID0gZW1wdHlGbi5zbGljZSgwLCBlbXB0eUZuLmluZGV4T2YoJ3JldHVybiBudWxsOycpKS5zcGxpdCgnXFxuJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGZuQm9keSArPSBcIlxcblwiICsgY3R4LnRvU291cmNlTWFwR2VuZXJhdG9yKHNvdXJjZVVybCwgaGVhZGVyTGluZXMpLnRvSnNDb21tZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gbmV3IChGdW5jdGlvbi5iaW5kLmFwcGx5KEZ1bmN0aW9uLCBfX3NwcmVhZChbdm9pZCAwXSwgZm5BcmdOYW1lcy5jb25jYXQoZm5Cb2R5KSkpKSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlRnVuY3Rpb24oZm4sIGZuQXJnVmFsdWVzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBKSVQgZ2VuZXJhdGVkIGZ1bmN0aW9uIGJ5IGNhbGxpbmcgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0ZXN0cyB0byBjYXB0dXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBhcmUgZ2VuZXJhdGVkXG4gICAgICogYnkgdGhpcyBgSml0RXZhbHVhdG9yYCBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiBiZWluZyBleGVjdXRlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBKaXRFdmFsdWF0b3IucHJvdG90eXBlLmV4ZWN1dGVGdW5jdGlvbiA9IGZ1bmN0aW9uIChmbiwgYXJncykgeyByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBfX3NwcmVhZChhcmdzKSk7IH07XG4gICAgcmV0dXJuIEppdEV2YWx1YXRvcjtcbn0oKSk7XG4vKipcbiAqIEFuIEFuZ3VsYXIgQVNUIHZpc2l0b3IgdGhhdCBjb252ZXJ0cyBBU1Qgbm9kZXMgaW50byBleGVjdXRhYmxlIEphdmFTY3JpcHQgY29kZS5cbiAqL1xudmFyIEppdEVtaXR0ZXJWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhKaXRFbWl0dGVyVmlzaXRvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBKaXRFbWl0dGVyVmlzaXRvcihyZWZsZWN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgICAgICBfdGhpcy5fZXZhbEFyZ05hbWVzID0gW107XG4gICAgICAgIF90aGlzLl9ldmFsQXJnVmFsdWVzID0gW107XG4gICAgICAgIF90aGlzLl9ldmFsRXhwb3J0ZWRWYXJzID0gW107XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLmNyZWF0ZVJldHVyblN0bXQgPSBmdW5jdGlvbiAoY3R4KSB7XG4gICAgICAgIHZhciBzdG10ID0gbmV3IFJldHVyblN0YXRlbWVudChuZXcgTGl0ZXJhbE1hcEV4cHIodGhpcy5fZXZhbEV4cG9ydGVkVmFycy5tYXAoZnVuY3Rpb24gKHJlc3VsdFZhcikgeyByZXR1cm4gbmV3IExpdGVyYWxNYXBFbnRyeShyZXN1bHRWYXIsIHZhcmlhYmxlKHJlc3VsdFZhciksIGZhbHNlKTsgfSkpKTtcbiAgICAgICAgc3RtdC52aXNpdFN0YXRlbWVudCh0aGlzLCBjdHgpO1xuICAgIH07XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLmdldEFyZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9ldmFsQXJnTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFt0aGlzLl9ldmFsQXJnTmFtZXNbaV1dID0gdGhpcy5fZXZhbEFyZ1ZhbHVlc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHRoaXMuX2VtaXRSZWZlcmVuY2VUb0V4dGVybmFsKGFzdCwgdGhpcy5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKGFzdC52YWx1ZSksIGN0eCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0V3JhcHBlZE5vZGVFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHRoaXMuX2VtaXRSZWZlcmVuY2VUb0V4dGVybmFsKGFzdCwgYXN0Lm5vZGUsIGN0eCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIGlmIChzdG10Lmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5FeHBvcnRlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2YWxFeHBvcnRlZFZhcnMucHVzaChzdG10Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZVZhclN0bXQuY2FsbCh0aGlzLCBzdG10LCBjdHgpO1xuICAgIH07XG4gICAgSml0RW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgaWYgKHN0bXQuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLkV4cG9ydGVkKSkge1xuICAgICAgICAgICAgdGhpcy5fZXZhbEV4cG9ydGVkVmFycy5wdXNoKHN0bXQubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXREZWNsYXJlRnVuY3Rpb25TdG10LmNhbGwodGhpcywgc3RtdCwgY3R4KTtcbiAgICB9O1xuICAgIEppdEVtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdERlY2xhcmVDbGFzc1N0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIGlmIChzdG10Lmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5FeHBvcnRlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2YWxFeHBvcnRlZFZhcnMucHVzaChzdG10Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdC5jYWxsKHRoaXMsIHN0bXQsIGN0eCk7XG4gICAgfTtcbiAgICBKaXRFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuX2VtaXRSZWZlcmVuY2VUb0V4dGVybmFsID0gZnVuY3Rpb24gKGFzdCwgdmFsdWUsIGN0eCkge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLl9ldmFsQXJnVmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaWQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMuX2V2YWxBcmdWYWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fZXZhbEFyZ1ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBuYW1lXzEgPSBpZGVudGlmaWVyTmFtZSh7IHJlZmVyZW5jZTogdmFsdWUgfSkgfHwgJ3ZhbCc7XG4gICAgICAgICAgICB0aGlzLl9ldmFsQXJnTmFtZXMucHVzaChcImppdF9cIiArIG5hbWVfMSArIFwiX1wiICsgaWQpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChhc3QsIHRoaXMuX2V2YWxBcmdOYW1lc1tpZF0pO1xuICAgIH07XG4gICAgcmV0dXJuIEppdEVtaXR0ZXJWaXNpdG9yO1xufShBYnN0cmFjdEpzRW1pdHRlclZpc2l0b3IpKTtcbmZ1bmN0aW9uIGlzVXNlU3RyaWN0U3RhdGVtZW50KHN0YXRlbWVudCkge1xuICAgIHJldHVybiBzdGF0ZW1lbnQuaXNFcXVpdmFsZW50KGxpdGVyYWwoJ3VzZSBzdHJpY3QnKS50b1N0bXQoKSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciAkRU9GID0gMDtcbnZhciAkQlNQQUNFID0gODtcbnZhciAkVEFCID0gOTtcbnZhciAkTEYgPSAxMDtcbnZhciAkVlRBQiA9IDExO1xudmFyICRGRiA9IDEyO1xudmFyICRDUiA9IDEzO1xudmFyICRTUEFDRSA9IDMyO1xudmFyICRCQU5HID0gMzM7XG52YXIgJERRID0gMzQ7XG52YXIgJEhBU0ggPSAzNTtcbnZhciAkJCA9IDM2O1xudmFyICRQRVJDRU5UID0gMzc7XG52YXIgJEFNUEVSU0FORCA9IDM4O1xudmFyICRTUSA9IDM5O1xudmFyICRMUEFSRU4gPSA0MDtcbnZhciAkUlBBUkVOID0gNDE7XG52YXIgJFNUQVIgPSA0MjtcbnZhciAkUExVUyA9IDQzO1xudmFyICRDT01NQSA9IDQ0O1xudmFyICRNSU5VUyA9IDQ1O1xudmFyICRQRVJJT0QgPSA0NjtcbnZhciAkU0xBU0ggPSA0NztcbnZhciAkQ09MT04gPSA1ODtcbnZhciAkU0VNSUNPTE9OID0gNTk7XG52YXIgJExUID0gNjA7XG52YXIgJEVRID0gNjE7XG52YXIgJEdUID0gNjI7XG52YXIgJFFVRVNUSU9OID0gNjM7XG52YXIgJDAgPSA0ODtcbnZhciAkNyA9IDU1O1xudmFyICQ5ID0gNTc7XG52YXIgJEEgPSA2NTtcbnZhciAkRSA9IDY5O1xudmFyICRGID0gNzA7XG52YXIgJFggPSA4ODtcbnZhciAkWiA9IDkwO1xudmFyICRMQlJBQ0tFVCA9IDkxO1xudmFyICRCQUNLU0xBU0ggPSA5MjtcbnZhciAkUkJSQUNLRVQgPSA5MztcbnZhciAkQ0FSRVQgPSA5NDtcbnZhciAkXyA9IDk1O1xudmFyICRhID0gOTc7XG52YXIgJGIgPSA5ODtcbnZhciAkZSA9IDEwMTtcbnZhciAkZiA9IDEwMjtcbnZhciAkbiA9IDExMDtcbnZhciAkciA9IDExNDtcbnZhciAkdCA9IDExNjtcbnZhciAkdSA9IDExNztcbnZhciAkdiA9IDExODtcbnZhciAkeCA9IDEyMDtcbnZhciAkeiA9IDEyMjtcbnZhciAkTEJSQUNFID0gMTIzO1xudmFyICRCQVIgPSAxMjQ7XG52YXIgJFJCUkFDRSA9IDEyNTtcbnZhciAkTkJTUCA9IDE2MDtcbnZhciAkQlQgPSA5NjtcbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlKSB7XG4gICAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09ICROQlNQKTtcbn1cbmZ1bmN0aW9uIGlzRGlnaXQoY29kZSkge1xuICAgIHJldHVybiAkMCA8PSBjb2RlICYmIGNvZGUgPD0gJDk7XG59XG5mdW5jdGlvbiBpc0FzY2lpTGV0dGVyKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6IHx8IGNvZGUgPj0gJEEgJiYgY29kZSA8PSAkWjtcbn1cbmZ1bmN0aW9uIGlzQXNjaWlIZXhEaWdpdChjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gJGEgJiYgY29kZSA8PSAkZiB8fCBjb2RlID49ICRBICYmIGNvZGUgPD0gJEYgfHwgaXNEaWdpdChjb2RlKTtcbn1cbmZ1bmN0aW9uIGlzTmV3TGluZShjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09ICRMRiB8fCBjb2RlID09PSAkQ1I7XG59XG5mdW5jdGlvbiBpc09jdGFsRGlnaXQoY29kZSkge1xuICAgIHJldHVybiAkMCA8PSBjb2RlICYmIGNvZGUgPD0gJDc7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBQYXJzZUxvY2F0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcnNlTG9jYXRpb24oZmlsZSwgb2Zmc2V0LCBsaW5lLCBjb2wpIHtcbiAgICAgICAgdGhpcy5maWxlID0gZmlsZTtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMubGluZSA9IGxpbmU7XG4gICAgICAgIHRoaXMuY29sID0gY29sO1xuICAgIH1cbiAgICBQYXJzZUxvY2F0aW9uLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ICE9IG51bGwgPyB0aGlzLmZpbGUudXJsICsgXCJAXCIgKyB0aGlzLmxpbmUgKyBcIjpcIiArIHRoaXMuY29sIDogdGhpcy5maWxlLnVybDtcbiAgICB9O1xuICAgIFBhcnNlTG9jYXRpb24ucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChkZWx0YSkge1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5maWxlLmNvbnRlbnQ7XG4gICAgICAgIHZhciBsZW4gPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lO1xuICAgICAgICB2YXIgY29sID0gdGhpcy5jb2w7XG4gICAgICAgIHdoaWxlIChvZmZzZXQgPiAwICYmIGRlbHRhIDwgMCkge1xuICAgICAgICAgICAgb2Zmc2V0LS07XG4gICAgICAgICAgICBkZWx0YSsrO1xuICAgICAgICAgICAgdmFyIGNoID0gc291cmNlLmNoYXJDb2RlQXQob2Zmc2V0KTtcbiAgICAgICAgICAgIGlmIChjaCA9PSAkTEYpIHtcbiAgICAgICAgICAgICAgICBsaW5lLS07XG4gICAgICAgICAgICAgICAgdmFyIHByaW9yTGluZSA9IHNvdXJjZS5zdWJzdHIoMCwgb2Zmc2V0IC0gMSkubGFzdEluZGV4T2YoU3RyaW5nLmZyb21DaGFyQ29kZSgkTEYpKTtcbiAgICAgICAgICAgICAgICBjb2wgPSBwcmlvckxpbmUgPiAwID8gb2Zmc2V0IC0gcHJpb3JMaW5lIDogb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbiAmJiBkZWx0YSA+IDApIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5jaGFyQ29kZUF0KG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgIGRlbHRhLS07XG4gICAgICAgICAgICBpZiAoY2ggPT0gJExGKSB7XG4gICAgICAgICAgICAgICAgbGluZSsrO1xuICAgICAgICAgICAgICAgIGNvbCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2wrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFBhcnNlTG9jYXRpb24odGhpcy5maWxlLCBvZmZzZXQsIGxpbmUsIGNvbCk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm4gdGhlIHNvdXJjZSBhcm91bmQgdGhlIGxvY2F0aW9uXG4gICAgLy8gVXAgdG8gYG1heENoYXJzYCBvciBgbWF4TGluZXNgIG9uIGVhY2ggc2lkZSBvZiB0aGUgbG9jYXRpb25cbiAgICBQYXJzZUxvY2F0aW9uLnByb3RvdHlwZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKG1heENoYXJzLCBtYXhMaW5lcykge1xuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuZmlsZS5jb250ZW50O1xuICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IGNvbnRlbnQubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gY29udGVudC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICAgICAgdmFyIGN0eENoYXJzID0gMDtcbiAgICAgICAgICAgIHZhciBjdHhMaW5lcyA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY3R4Q2hhcnMgPCBtYXhDaGFycyAmJiBzdGFydE9mZnNldCA+IDApIHtcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldC0tO1xuICAgICAgICAgICAgICAgIGN0eENoYXJzKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbc3RhcnRPZmZzZXRdID09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2N0eExpbmVzID09IG1heExpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eENoYXJzID0gMDtcbiAgICAgICAgICAgIGN0eExpbmVzID0gMDtcbiAgICAgICAgICAgIHdoaWxlIChjdHhDaGFycyA8IG1heENoYXJzICYmIGVuZE9mZnNldCA8IGNvbnRlbnQubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGVuZE9mZnNldCsrO1xuICAgICAgICAgICAgICAgIGN0eENoYXJzKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbZW5kT2Zmc2V0XSA9PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKytjdHhMaW5lcyA9PSBtYXhMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJlZm9yZTogY29udGVudC5zdWJzdHJpbmcoc3RhcnRPZmZzZXQsIHRoaXMub2Zmc2V0KSxcbiAgICAgICAgICAgICAgICBhZnRlcjogY29udGVudC5zdWJzdHJpbmcodGhpcy5vZmZzZXQsIGVuZE9mZnNldCArIDEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBQYXJzZUxvY2F0aW9uO1xufSgpKTtcbnZhciBQYXJzZVNvdXJjZUZpbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VTb3VyY2VGaWxlKGNvbnRlbnQsIHVybCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlU291cmNlRmlsZTtcbn0oKSk7XG52YXIgUGFyc2VTb3VyY2VTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcnNlU291cmNlU3BhbihzdGFydCwgZW5kLCBkZXRhaWxzKSB7XG4gICAgICAgIGlmIChkZXRhaWxzID09PSB2b2lkIDApIHsgZGV0YWlscyA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscztcbiAgICB9XG4gICAgUGFyc2VTb3VyY2VTcGFuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQuZmlsZS5jb250ZW50LnN1YnN0cmluZyh0aGlzLnN0YXJ0Lm9mZnNldCwgdGhpcy5lbmQub2Zmc2V0KTtcbiAgICB9O1xuICAgIHJldHVybiBQYXJzZVNvdXJjZVNwYW47XG59KCkpO1xudmFyIFBhcnNlRXJyb3JMZXZlbDtcbihmdW5jdGlvbiAoUGFyc2VFcnJvckxldmVsKSB7XG4gICAgUGFyc2VFcnJvckxldmVsW1BhcnNlRXJyb3JMZXZlbFtcIldBUk5JTkdcIl0gPSAwXSA9IFwiV0FSTklOR1wiO1xuICAgIFBhcnNlRXJyb3JMZXZlbFtQYXJzZUVycm9yTGV2ZWxbXCJFUlJPUlwiXSA9IDFdID0gXCJFUlJPUlwiO1xufSkoUGFyc2VFcnJvckxldmVsIHx8IChQYXJzZUVycm9yTGV2ZWwgPSB7fSkpO1xudmFyIFBhcnNlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VFcnJvcihzcGFuLCBtc2csIGxldmVsKSB7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gUGFyc2VFcnJvckxldmVsLkVSUk9SOyB9XG4gICAgICAgIHRoaXMuc3BhbiA9IHNwYW47XG4gICAgICAgIHRoaXMubXNnID0gbXNnO1xuICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgfVxuICAgIFBhcnNlRXJyb3IucHJvdG90eXBlLmNvbnRleHR1YWxNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3R4ID0gdGhpcy5zcGFuLnN0YXJ0LmdldENvbnRleHQoMTAwLCAzKTtcbiAgICAgICAgcmV0dXJuIGN0eCA/IHRoaXMubXNnICsgXCIgKFxcXCJcIiArIGN0eC5iZWZvcmUgKyBcIltcIiArIFBhcnNlRXJyb3JMZXZlbFt0aGlzLmxldmVsXSArIFwiIC0+XVwiICsgY3R4LmFmdGVyICsgXCJcXFwiKVwiIDpcbiAgICAgICAgICAgIHRoaXMubXNnO1xuICAgIH07XG4gICAgUGFyc2VFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkZXRhaWxzID0gdGhpcy5zcGFuLmRldGFpbHMgPyBcIiwgXCIgKyB0aGlzLnNwYW4uZGV0YWlscyA6ICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0dWFsTWVzc2FnZSgpICsgXCI6IFwiICsgdGhpcy5zcGFuLnN0YXJ0ICsgZGV0YWlscztcbiAgICB9O1xuICAgIHJldHVybiBQYXJzZUVycm9yO1xufSgpKTtcbmZ1bmN0aW9uIHR5cGVTb3VyY2VTcGFuKGtpbmQsIHR5cGUpIHtcbiAgICB2YXIgbW9kdWxlVXJsID0gaWRlbnRpZmllck1vZHVsZVVybCh0eXBlKTtcbiAgICB2YXIgc291cmNlRmlsZU5hbWUgPSBtb2R1bGVVcmwgIT0gbnVsbCA/IFwiaW4gXCIgKyBraW5kICsgXCIgXCIgKyBpZGVudGlmaWVyTmFtZSh0eXBlKSArIFwiIGluIFwiICsgbW9kdWxlVXJsIDpcbiAgICAgICAgXCJpbiBcIiArIGtpbmQgKyBcIiBcIiArIGlkZW50aWZpZXJOYW1lKHR5cGUpO1xuICAgIHZhciBzb3VyY2VGaWxlID0gbmV3IFBhcnNlU291cmNlRmlsZSgnJywgc291cmNlRmlsZU5hbWUpO1xuICAgIHJldHVybiBuZXcgUGFyc2VTb3VyY2VTcGFuKG5ldyBQYXJzZUxvY2F0aW9uKHNvdXJjZUZpbGUsIC0xLCAtMSwgLTEpLCBuZXcgUGFyc2VMb2NhdGlvbihzb3VyY2VGaWxlLCAtMSwgLTEsIC0xKSk7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBTb3VyY2UgU3BhbiBvYmplY3QgZm9yIGEgZ2l2ZW4gUjMgVHlwZSBmb3IgSklUIG1vZGUuXG4gKlxuICogQHBhcmFtIGtpbmQgQ29tcG9uZW50IG9yIERpcmVjdGl2ZS5cbiAqIEBwYXJhbSB0eXBlTmFtZSBuYW1lIG9mIHRoZSBDb21wb25lbnQgb3IgRGlyZWN0aXZlLlxuICogQHBhcmFtIHNvdXJjZVVybCByZWZlcmVuY2UgdG8gQ29tcG9uZW50IG9yIERpcmVjdGl2ZSBzb3VyY2UuXG4gKiBAcmV0dXJucyBpbnN0YW5jZSBvZiBQYXJzZVNvdXJjZVNwYW4gdGhhdCByZXByZXNlbnQgYSBnaXZlbiBDb21wb25lbnQgb3IgRGlyZWN0aXZlLlxuICovXG5mdW5jdGlvbiByM0ppdFR5cGVTb3VyY2VTcGFuKGtpbmQsIHR5cGVOYW1lLCBzb3VyY2VVcmwpIHtcbiAgICB2YXIgc291cmNlRmlsZU5hbWUgPSBcImluIFwiICsga2luZCArIFwiIFwiICsgdHlwZU5hbWUgKyBcIiBpbiBcIiArIHNvdXJjZVVybDtcbiAgICB2YXIgc291cmNlRmlsZSA9IG5ldyBQYXJzZVNvdXJjZUZpbGUoJycsIHNvdXJjZUZpbGVOYW1lKTtcbiAgICByZXR1cm4gbmV3IFBhcnNlU291cmNlU3BhbihuZXcgUGFyc2VMb2NhdGlvbihzb3VyY2VGaWxlLCAtMSwgLTEsIC0xKSwgbmV3IFBhcnNlTG9jYXRpb24oc291cmNlRmlsZSwgLTEsIC0xLCAtMSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGBDb21waWxlUmVmbGVjdG9yYCB3aGljaCByZXNvbHZlcyByZWZlcmVuY2VzIHRvIEBhbmd1bGFyL2NvcmVcbiAqIHN5bWJvbHMgYXQgcnVudGltZSwgYWNjb3JkaW5nIHRvIGEgY29uc3VtZXItcHJvdmlkZWQgbWFwcGluZy5cbiAqXG4gKiBPbmx5IHN1cHBvcnRzIGByZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2VgLCBhbGwgb3RoZXIgbWV0aG9kcyB0aHJvdy5cbiAqL1xudmFyIFIzSml0UmVmbGVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFIzSml0UmVmbGVjdG9yKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG4gICAgUjNKaXRSZWZsZWN0b3IucHJvdG90eXBlLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgLy8gVGhpcyByZWZsZWN0b3Igb25seSBoYW5kbGVzIEBhbmd1bGFyL2NvcmUgaW1wb3J0cy5cbiAgICAgICAgaWYgKHJlZi5tb2R1bGVOYW1lICE9PSAnQGFuZ3VsYXIvY29yZScpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZXNvbHZlIGV4dGVybmFsIHJlZmVyZW5jZSB0byBcIiArIHJlZi5tb2R1bGVOYW1lICsgXCIsIG9ubHkgcmVmZXJlbmNlcyB0byBAYW5ndWxhci9jb3JlIGFyZSBzdXBwb3J0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0Lmhhc093blByb3BlcnR5KHJlZi5uYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gdmFsdWUgcHJvdmlkZWQgZm9yIEBhbmd1bGFyL2NvcmUgc3ltYm9sICdcIiArIHJlZi5uYW1lICsgXCInLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0W3JlZi5uYW1lXTtcbiAgICB9O1xuICAgIFIzSml0UmVmbGVjdG9yLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7IH07XG4gICAgUjNKaXRSZWZsZWN0b3IucHJvdG90eXBlLmFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHsgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7IH07XG4gICAgUjNKaXRSZWZsZWN0b3IucHJvdG90eXBlLnNoYWxsb3dBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7IHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpOyB9O1xuICAgIFIzSml0UmVmbGVjdG9yLnByb3RvdHlwZS50cnlBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7IHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpOyB9O1xuICAgIFIzSml0UmVmbGVjdG9yLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykgeyB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTsgfTtcbiAgICBSM0ppdFJlZmxlY3Rvci5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7IHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpOyB9O1xuICAgIFIzSml0UmVmbGVjdG9yLnByb3RvdHlwZS5ndWFyZHMgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykgeyB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTsgfTtcbiAgICBSM0ppdFJlZmxlY3Rvci5wcm90b3R5cGUuY29tcG9uZW50TW9kdWxlVXJsID0gZnVuY3Rpb24gKHR5cGUsIGNtcE1ldGFkYXRhKSB7IHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpOyB9O1xuICAgIHJldHVybiBSM0ppdFJlZmxlY3Rvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQ29uc3RydWN0IGFuIGBSM05nTW9kdWxlRGVmYCBmb3IgdGhlIGdpdmVuIGBSM05nTW9kdWxlTWV0YWRhdGFgLlxuICovXG5mdW5jdGlvbiBjb21waWxlTmdNb2R1bGUobWV0YSkge1xuICAgIHZhciBtb2R1bGVUeXBlID0gbWV0YS50eXBlLCBib290c3RyYXAgPSBtZXRhLmJvb3RzdHJhcCwgZGVjbGFyYXRpb25zID0gbWV0YS5kZWNsYXJhdGlvbnMsIGltcG9ydHMgPSBtZXRhLmltcG9ydHMsIGV4cG9ydHMgPSBtZXRhLmV4cG9ydHMsIHNjaGVtYXMgPSBtZXRhLnNjaGVtYXMsIGNvbnRhaW5zRm9yd2FyZERlY2xzID0gbWV0YS5jb250YWluc0ZvcndhcmREZWNscywgZW1pdElubGluZSA9IG1ldGEuZW1pdElubGluZTtcbiAgICB2YXIgYWRkaXRpb25hbFN0YXRlbWVudHMgPSBbXTtcbiAgICB2YXIgZGVmaW5pdGlvbk1hcCA9IHtcbiAgICAgICAgdHlwZTogbW9kdWxlVHlwZVxuICAgIH07XG4gICAgLy8gT25seSBnZW5lcmF0ZSB0aGUga2V5cyBpbiB0aGUgbWV0YWRhdGEgaWYgdGhlIGFycmF5cyBoYXZlIHZhbHVlcy5cbiAgICBpZiAoYm9vdHN0cmFwLmxlbmd0aCkge1xuICAgICAgICBkZWZpbml0aW9uTWFwLmJvb3RzdHJhcCA9IHJlZnNUb0FycmF5KGJvb3RzdHJhcCwgY29udGFpbnNGb3J3YXJkRGVjbHMpO1xuICAgIH1cbiAgICAvLyBJZiByZXF1ZXN0ZWQgdG8gZW1pdCBzY29wZSBpbmZvcm1hdGlvbiBpbmxpbmUsIHBhc3MgdGhlIGRlY2xhcmF0aW9ucywgaW1wb3J0cyBhbmQgZXhwb3J0cyB0b1xuICAgIC8vIHRoZSBgybXJtWRlZmluZU5nTW9kdWxlYCBjYWxsLiBUaGUgSklUIGNvbXBpbGF0aW9uIHVzZXMgdGhpcy5cbiAgICBpZiAoZW1pdElubGluZSkge1xuICAgICAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgZGVmaW5pdGlvbk1hcC5kZWNsYXJhdGlvbnMgPSByZWZzVG9BcnJheShkZWNsYXJhdGlvbnMsIGNvbnRhaW5zRm9yd2FyZERlY2xzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW1wb3J0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlZmluaXRpb25NYXAuaW1wb3J0cyA9IHJlZnNUb0FycmF5KGltcG9ydHMsIGNvbnRhaW5zRm9yd2FyZERlY2xzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwb3J0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlZmluaXRpb25NYXAuZXhwb3J0cyA9IHJlZnNUb0FycmF5KGV4cG9ydHMsIGNvbnRhaW5zRm9yd2FyZERlY2xzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBub3QgZW1pdHRpbmcgaW5saW5lLCB0aGUgc2NvcGUgaW5mb3JtYXRpb24gaXMgbm90IHBhc3NlZCBpbnRvIGDJtcm1ZGVmaW5lTmdNb2R1bGVgIGFzIGl0IHdvdWxkXG4gICAgLy8gcHJldmVudCB0cmVlLXNoYWtpbmcgb2YgdGhlIGRlY2xhcmF0aW9ucywgaW1wb3J0cyBhbmQgZXhwb3J0cyByZWZlcmVuY2VzLlxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgc2V0TmdNb2R1bGVTY29wZUNhbGwgPSBnZW5lcmF0ZVNldE5nTW9kdWxlU2NvcGVDYWxsKG1ldGEpO1xuICAgICAgICBpZiAoc2V0TmdNb2R1bGVTY29wZUNhbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxTdGF0ZW1lbnRzLnB1c2goc2V0TmdNb2R1bGVTY29wZUNhbGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzY2hlbWFzICYmIHNjaGVtYXMubGVuZ3RoKSB7XG4gICAgICAgIGRlZmluaXRpb25NYXAuc2NoZW1hcyA9IGxpdGVyYWxBcnIoc2NoZW1hcy5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gcmVmLnZhbHVlOyB9KSk7XG4gICAgfVxuICAgIHZhciBleHByZXNzaW9uID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmRlZmluZU5nTW9kdWxlKS5jYWxsRm4oW21hcFRvTWFwRXhwcmVzc2lvbihkZWZpbml0aW9uTWFwKV0pO1xuICAgIHZhciB0eXBlID0gbmV3IEV4cHJlc3Npb25UeXBlKGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5OZ01vZHVsZURlZldpdGhNZXRhLCBbXG4gICAgICAgIG5ldyBFeHByZXNzaW9uVHlwZShtb2R1bGVUeXBlKSwgdHVwbGVUeXBlT2YoZGVjbGFyYXRpb25zKSwgdHVwbGVUeXBlT2YoaW1wb3J0cyksXG4gICAgICAgIHR1cGxlVHlwZU9mKGV4cG9ydHMpXG4gICAgXSkpO1xuICAgIHJldHVybiB7IGV4cHJlc3Npb246IGV4cHJlc3Npb24sIHR5cGU6IHR5cGUsIGFkZGl0aW9uYWxTdGF0ZW1lbnRzOiBhZGRpdGlvbmFsU3RhdGVtZW50cyB9O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiBjYWxsIHRvIGDJtcm1c2V0TmdNb2R1bGVTY29wZWAgd2l0aCBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlXG4gKiB0cmFuc2l0aXZlIG1vZHVsZSBzY29wZSBjYW4gYmUgY29tcHV0ZWQgZHVyaW5nIHJ1bnRpbWUgaW4gSklUIG1vZGUuIFRoaXMgY2FsbCBpcyBtYXJrZWQgcHVyZVxuICogc3VjaCB0aGF0IHRoZSByZWZlcmVuY2VzIHRvIGRlY2xhcmF0aW9ucywgaW1wb3J0cyBhbmQgZXhwb3J0cyBtYXkgYmUgZWxpZGVkIGNhdXNpbmcgdGhlc2VcbiAqIHN5bWJvbHMgdG8gYmVjb21lIHRyZWUtc2hha2VhYmxlLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVNldE5nTW9kdWxlU2NvcGVDYWxsKG1ldGEpIHtcbiAgICB2YXIgbW9kdWxlVHlwZSA9IG1ldGEudHlwZSwgZGVjbGFyYXRpb25zID0gbWV0YS5kZWNsYXJhdGlvbnMsIGltcG9ydHMgPSBtZXRhLmltcG9ydHMsIGV4cG9ydHMgPSBtZXRhLmV4cG9ydHMsIGNvbnRhaW5zRm9yd2FyZERlY2xzID0gbWV0YS5jb250YWluc0ZvcndhcmREZWNscztcbiAgICB2YXIgc2NvcGVNYXAgPSB7fTtcbiAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCkge1xuICAgICAgICBzY29wZU1hcC5kZWNsYXJhdGlvbnMgPSByZWZzVG9BcnJheShkZWNsYXJhdGlvbnMsIGNvbnRhaW5zRm9yd2FyZERlY2xzKTtcbiAgICB9XG4gICAgaWYgKGltcG9ydHMubGVuZ3RoKSB7XG4gICAgICAgIHNjb3BlTWFwLmltcG9ydHMgPSByZWZzVG9BcnJheShpbXBvcnRzLCBjb250YWluc0ZvcndhcmREZWNscyk7XG4gICAgfVxuICAgIGlmIChleHBvcnRzLmxlbmd0aCkge1xuICAgICAgICBzY29wZU1hcC5leHBvcnRzID0gcmVmc1RvQXJyYXkoZXhwb3J0cywgY29udGFpbnNGb3J3YXJkRGVjbHMpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoc2NvcGVNYXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGZuQ2FsbCA9IG5ldyBJbnZva2VGdW5jdGlvbkV4cHIoXG4gICAgLyogZm4gKi8gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnNldE5nTW9kdWxlU2NvcGUpLCBcbiAgICAvKiBhcmdzICovIFttb2R1bGVUeXBlLCBtYXBUb01hcEV4cHJlc3Npb24oc2NvcGVNYXApXSwgXG4gICAgLyogdHlwZSAqLyB1bmRlZmluZWQsIFxuICAgIC8qIHNvdXJjZVNwYW4gKi8gdW5kZWZpbmVkLCBcbiAgICAvKiBwdXJlICovIHRydWUpO1xuICAgIHJldHVybiBmbkNhbGwudG9TdG10KCk7XG59XG5mdW5jdGlvbiBjb21waWxlSW5qZWN0b3IobWV0YSkge1xuICAgIHZhciByZXN1bHQgPSBjb21waWxlRmFjdG9yeUZ1bmN0aW9uKHtcbiAgICAgICAgbmFtZTogbWV0YS5uYW1lLFxuICAgICAgICB0eXBlOiBtZXRhLnR5cGUsXG4gICAgICAgIGRlcHM6IG1ldGEuZGVwcyxcbiAgICAgICAgaW5qZWN0Rm46IElkZW50aWZpZXJzJDEuaW5qZWN0LFxuICAgIH0pO1xuICAgIHZhciBkZWZpbml0aW9uTWFwID0ge1xuICAgICAgICBmYWN0b3J5OiByZXN1bHQuZmFjdG9yeSxcbiAgICB9O1xuICAgIGlmIChtZXRhLnByb3ZpZGVycyAhPT0gbnVsbCkge1xuICAgICAgICBkZWZpbml0aW9uTWFwLnByb3ZpZGVycyA9IG1ldGEucHJvdmlkZXJzO1xuICAgIH1cbiAgICBpZiAobWV0YS5pbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5pbXBvcnRzID0gbGl0ZXJhbEFycihtZXRhLmltcG9ydHMpO1xuICAgIH1cbiAgICB2YXIgZXhwcmVzc2lvbiA9IGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5kZWZpbmVJbmplY3RvcikuY2FsbEZuKFttYXBUb01hcEV4cHJlc3Npb24oZGVmaW5pdGlvbk1hcCldKTtcbiAgICB2YXIgdHlwZSA9IG5ldyBFeHByZXNzaW9uVHlwZShpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuSW5qZWN0b3JEZWYsIFtuZXcgRXhwcmVzc2lvblR5cGUobWV0YS50eXBlKV0pKTtcbiAgICByZXR1cm4geyBleHByZXNzaW9uOiBleHByZXNzaW9uLCB0eXBlOiB0eXBlLCBzdGF0ZW1lbnRzOiByZXN1bHQuc3RhdGVtZW50cyB9O1xufVxuLy8gVE9ETyhhbHhodWIpOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIGBjb21waWxlTmdNb2R1bGVgLiBDdXJyZW50bHkgdGhlIHR3byBhcmUgc2VwYXJhdGUgb3BlcmF0aW9ucy5cbmZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZUZyb21SZW5kZXIyKGN0eCwgbmdNb2R1bGUsIGluamVjdGFibGVDb21waWxlcikge1xuICAgIHZhciBjbGFzc05hbWUgPSBpZGVudGlmaWVyTmFtZShuZ01vZHVsZS50eXBlKTtcbiAgICB2YXIgcmF3SW1wb3J0cyA9IG5nTW9kdWxlLnJhd0ltcG9ydHMgPyBbbmdNb2R1bGUucmF3SW1wb3J0c10gOiBbXTtcbiAgICB2YXIgcmF3RXhwb3J0cyA9IG5nTW9kdWxlLnJhd0V4cG9ydHMgPyBbbmdNb2R1bGUucmF3RXhwb3J0c10gOiBbXTtcbiAgICB2YXIgaW5qZWN0b3JEZWZBcmcgPSBtYXBMaXRlcmFsKHtcbiAgICAgICAgJ2ZhY3RvcnknOiBpbmplY3RhYmxlQ29tcGlsZXIuZmFjdG9yeUZvcih7IHR5cGU6IG5nTW9kdWxlLnR5cGUsIHN5bWJvbDogbmdNb2R1bGUudHlwZS5yZWZlcmVuY2UgfSwgY3R4KSxcbiAgICAgICAgJ3Byb3ZpZGVycyc6IGNvbnZlcnRNZXRhVG9PdXRwdXQobmdNb2R1bGUucmF3UHJvdmlkZXJzLCBjdHgpLFxuICAgICAgICAnaW1wb3J0cyc6IGNvbnZlcnRNZXRhVG9PdXRwdXQoX19zcHJlYWQocmF3SW1wb3J0cywgcmF3RXhwb3J0cyksIGN0eCksXG4gICAgfSk7XG4gICAgdmFyIGluamVjdG9yRGVmID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmRlZmluZUluamVjdG9yKS5jYWxsRm4oW2luamVjdG9yRGVmQXJnXSk7XG4gICAgY3R4LnN0YXRlbWVudHMucHVzaChuZXcgQ2xhc3NTdG10KFxuICAgIC8qIG5hbWUgKi8gY2xhc3NOYW1lLCBcbiAgICAvKiBwYXJlbnQgKi8gbnVsbCwgXG4gICAgLyogZmllbGRzICovIFtuZXcgQ2xhc3NGaWVsZChcbiAgICAgICAgLyogbmFtZSAqLyAnbmdJbmplY3RvckRlZicsIFxuICAgICAgICAvKiB0eXBlICovIElORkVSUkVEX1RZUEUsIFxuICAgICAgICAvKiBtb2RpZmllcnMgKi8gW1N0bXRNb2RpZmllci5TdGF0aWNdLCBcbiAgICAgICAgLyogaW5pdGlhbGl6ZXIgKi8gaW5qZWN0b3JEZWYpXSwgXG4gICAgLyogZ2V0dGVycyAqLyBbXSwgXG4gICAgLyogY29uc3RydWN0b3JNZXRob2QgKi8gbmV3IENsYXNzTWV0aG9kKG51bGwsIFtdLCBbXSksIFxuICAgIC8qIG1ldGhvZHMgKi8gW10pKTtcbn1cbmZ1bmN0aW9uIHR1cGxlVHlwZU9mKGV4cCkge1xuICAgIHZhciB0eXBlcyA9IGV4cC5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gdHlwZW9mRXhwcihyZWYudHlwZSk7IH0pO1xuICAgIHJldHVybiBleHAubGVuZ3RoID4gMCA/IGV4cHJlc3Npb25UeXBlKGxpdGVyYWxBcnIodHlwZXMpKSA6IE5PTkVfVFlQRTtcbn1cbmZ1bmN0aW9uIHJlZnNUb0FycmF5KHJlZnMsIHNob3VsZEZvcndhcmREZWNsYXJlKSB7XG4gICAgdmFyIHZhbHVlcyA9IGxpdGVyYWxBcnIocmVmcy5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gcmVmLnZhbHVlOyB9KSk7XG4gICAgcmV0dXJuIHNob3VsZEZvcndhcmREZWNsYXJlID8gZm4oW10sIFtuZXcgUmV0dXJuU3RhdGVtZW50KHZhbHVlcyldKSA6IHZhbHVlcztcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVBpcGVGcm9tTWV0YWRhdGEobWV0YWRhdGEpIHtcbiAgICB2YXIgZGVmaW5pdGlvbk1hcFZhbHVlcyA9IFtdO1xuICAgIC8vIGUuZy4gYG5hbWU6ICdteVBpcGUnYFxuICAgIGRlZmluaXRpb25NYXBWYWx1ZXMucHVzaCh7IGtleTogJ25hbWUnLCB2YWx1ZTogbGl0ZXJhbChtZXRhZGF0YS5waXBlTmFtZSksIHF1b3RlZDogZmFsc2UgfSk7XG4gICAgLy8gZS5nLiBgdHlwZTogTXlQaXBlYFxuICAgIGRlZmluaXRpb25NYXBWYWx1ZXMucHVzaCh7IGtleTogJ3R5cGUnLCB2YWx1ZTogbWV0YWRhdGEudHlwZSwgcXVvdGVkOiBmYWxzZSB9KTtcbiAgICB2YXIgdGVtcGxhdGVGYWN0b3J5ID0gY29tcGlsZUZhY3RvcnlGdW5jdGlvbih7XG4gICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHR5cGU6IG1ldGFkYXRhLnR5cGUsXG4gICAgICAgIGRlcHM6IG1ldGFkYXRhLmRlcHMsXG4gICAgICAgIGluamVjdEZuOiBJZGVudGlmaWVycyQxLmRpcmVjdGl2ZUluamVjdCxcbiAgICB9KTtcbiAgICBkZWZpbml0aW9uTWFwVmFsdWVzLnB1c2goeyBrZXk6ICdmYWN0b3J5JywgdmFsdWU6IHRlbXBsYXRlRmFjdG9yeS5mYWN0b3J5LCBxdW90ZWQ6IGZhbHNlIH0pO1xuICAgIC8vIGUuZy4gYHB1cmU6IHRydWVgXG4gICAgZGVmaW5pdGlvbk1hcFZhbHVlcy5wdXNoKHsga2V5OiAncHVyZScsIHZhbHVlOiBsaXRlcmFsKG1ldGFkYXRhLnB1cmUpLCBxdW90ZWQ6IGZhbHNlIH0pO1xuICAgIHZhciBleHByZXNzaW9uID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmRlZmluZVBpcGUpLmNhbGxGbihbbGl0ZXJhbE1hcChkZWZpbml0aW9uTWFwVmFsdWVzKV0pO1xuICAgIHZhciB0eXBlID0gbmV3IEV4cHJlc3Npb25UeXBlKGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5QaXBlRGVmV2l0aE1ldGEsIFtcbiAgICAgICAgdHlwZVdpdGhQYXJhbWV0ZXJzKG1ldGFkYXRhLnR5cGUsIG1ldGFkYXRhLnR5cGVBcmd1bWVudENvdW50KSxcbiAgICAgICAgbmV3IEV4cHJlc3Npb25UeXBlKG5ldyBMaXRlcmFsRXhwcihtZXRhZGF0YS5waXBlTmFtZSkpLFxuICAgIF0pKTtcbiAgICByZXR1cm4geyBleHByZXNzaW9uOiBleHByZXNzaW9uLCB0eXBlOiB0eXBlLCBzdGF0ZW1lbnRzOiB0ZW1wbGF0ZUZhY3Rvcnkuc3RhdGVtZW50cyB9O1xufVxuLyoqXG4gKiBXcml0ZSBhIHBpcGUgZGVmaW5pdGlvbiB0byB0aGUgb3V0cHV0IGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVQaXBlRnJvbVJlbmRlcjIob3V0cHV0Q3R4LCBwaXBlLCByZWZsZWN0b3IpIHtcbiAgICB2YXIgbmFtZSA9IGlkZW50aWZpZXJOYW1lKHBpcGUudHlwZSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihcIkNhbm5vdCByZXNvbHZlIHRoZSBuYW1lIG9mIFwiICsgcGlwZS50eXBlKTtcbiAgICB9XG4gICAgdmFyIG1ldGFkYXRhID0ge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBwaXBlTmFtZTogcGlwZS5uYW1lLFxuICAgICAgICB0eXBlOiBvdXRwdXRDdHguaW1wb3J0RXhwcihwaXBlLnR5cGUucmVmZXJlbmNlKSxcbiAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IDAsXG4gICAgICAgIGRlcHM6IGRlcGVuZGVuY2llc0Zyb21HbG9iYWxNZXRhZGF0YShwaXBlLnR5cGUsIG91dHB1dEN0eCwgcmVmbGVjdG9yKSxcbiAgICAgICAgcHVyZTogcGlwZS5wdXJlLFxuICAgIH07XG4gICAgdmFyIHJlcyA9IGNvbXBpbGVQaXBlRnJvbU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB2YXIgZGVmaW5pdGlvbkZpZWxkID0gb3V0cHV0Q3R4LmNvbnN0YW50UG9vbC5wcm9wZXJ0eU5hbWVPZigzIC8qIFBpcGUgKi8pO1xuICAgIG91dHB1dEN0eC5zdGF0ZW1lbnRzLnB1c2gobmV3IENsYXNzU3RtdChcbiAgICAvKiBuYW1lICovIG5hbWUsIFxuICAgIC8qIHBhcmVudCAqLyBudWxsLCBcbiAgICAvKiBmaWVsZHMgKi8gW25ldyBDbGFzc0ZpZWxkKFxuICAgICAgICAvKiBuYW1lICovIGRlZmluaXRpb25GaWVsZCwgXG4gICAgICAgIC8qIHR5cGUgKi8gSU5GRVJSRURfVFlQRSwgXG4gICAgICAgIC8qIG1vZGlmaWVycyAqLyBbU3RtdE1vZGlmaWVyLlN0YXRpY10sIFxuICAgICAgICAvKiBpbml0aWFsaXplciAqLyByZXMuZXhwcmVzc2lvbildLCBcbiAgICAvKiBnZXR0ZXJzICovIFtdLCBcbiAgICAvKiBjb25zdHJ1Y3Rvck1ldGhvZCAqLyBuZXcgQ2xhc3NNZXRob2QobnVsbCwgW10sIFtdKSwgXG4gICAgLyogbWV0aG9kcyAqLyBbXSkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUGFyc2VyRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VyRXJyb3IobWVzc2FnZSwgaW5wdXQsIGVyckxvY2F0aW9uLCBjdHhMb2NhdGlvbikge1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuZXJyTG9jYXRpb24gPSBlcnJMb2NhdGlvbjtcbiAgICAgICAgdGhpcy5jdHhMb2NhdGlvbiA9IGN0eExvY2F0aW9uO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBcIlBhcnNlciBFcnJvcjogXCIgKyBtZXNzYWdlICsgXCIgXCIgKyBlcnJMb2NhdGlvbiArIFwiIFtcIiArIGlucHV0ICsgXCJdIGluIFwiICsgY3R4TG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiBQYXJzZXJFcnJvcjtcbn0oKSk7XG52YXIgUGFyc2VTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcnNlU3BhbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgfVxuICAgIHJldHVybiBQYXJzZVNwYW47XG59KCkpO1xudmFyIEFTVCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBU1Qoc3Bhbikge1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgIH1cbiAgICBBU1QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEFTVC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnQVNUJzsgfTtcbiAgICByZXR1cm4gQVNUO1xufSgpKTtcbi8qKlxuICogUmVwcmVzZW50cyBhIHF1b3RlZCBleHByZXNzaW9uIG9mIHRoZSBmb3JtOlxuICpcbiAqIHF1b3RlID0gcHJlZml4IGA6YCB1bmludGVycHJldGVkRXhwcmVzc2lvblxuICogcHJlZml4ID0gaWRlbnRpZmllclxuICogdW5pbnRlcnByZXRlZEV4cHJlc3Npb24gPSBhcmJpdHJhcnkgc3RyaW5nXG4gKlxuICogQSBxdW90ZWQgZXhwcmVzc2lvbiBpcyBtZWFudCB0byBiZSBwcmUtcHJvY2Vzc2VkIGJ5IGFuIEFTVCB0cmFuc2Zvcm1lciB0aGF0XG4gKiBjb252ZXJ0cyBpdCBpbnRvIGFub3RoZXIgQVNUIHRoYXQgbm8gbG9uZ2VyIGNvbnRhaW5zIHF1b3RlZCBleHByZXNzaW9ucy5cbiAqIEl0IGlzIG1lYW50IHRvIGFsbG93IHRoaXJkLXBhcnR5IGRldmVsb3BlcnMgdG8gZXh0ZW5kIEFuZ3VsYXIgdGVtcGxhdGVcbiAqIGV4cHJlc3Npb24gbGFuZ3VhZ2UuIFRoZSBgdW5pbnRlcnByZXRlZEV4cHJlc3Npb25gIHBhcnQgb2YgdGhlIHF1b3RlIGlzXG4gKiB0aGVyZWZvcmUgbm90IGludGVycHJldGVkIGJ5IHRoZSBBbmd1bGFyJ3Mgb3duIGV4cHJlc3Npb24gcGFyc2VyLlxuICovXG52YXIgUXVvdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFF1b3RlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1b3RlKHNwYW4sIHByZWZpeCwgdW5pbnRlcnByZXRlZEV4cHJlc3Npb24sIGxvY2F0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgX3RoaXMudW5pbnRlcnByZXRlZEV4cHJlc3Npb24gPSB1bmludGVycHJldGVkRXhwcmVzc2lvbjtcbiAgICAgICAgX3RoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBRdW90ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0UXVvdGUodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICBRdW90ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnUXVvdGUnOyB9O1xuICAgIHJldHVybiBRdW90ZTtcbn0oQVNUKSk7XG52YXIgRW1wdHlFeHByID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbXB0eUV4cHIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRW1wdHlFeHByKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEVtcHR5RXhwci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuICAgIHJldHVybiBFbXB0eUV4cHI7XG59KEFTVCkpO1xudmFyIEltcGxpY2l0UmVjZWl2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEltcGxpY2l0UmVjZWl2ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSW1wbGljaXRSZWNlaXZlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBJbXBsaWNpdFJlY2VpdmVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRJbXBsaWNpdFJlY2VpdmVyKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEltcGxpY2l0UmVjZWl2ZXI7XG59KEFTVCkpO1xuLyoqXG4gKiBNdWx0aXBsZSBleHByZXNzaW9ucyBzZXBhcmF0ZWQgYnkgYSBzZW1pY29sb24uXG4gKi9cbnZhciBDaGFpbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2hhaW4sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2hhaW4oc3BhbiwgZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDaGFpbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0Q2hhaW4odGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ2hhaW47XG59KEFTVCkpO1xudmFyIENvbmRpdGlvbmFsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb25kaXRpb25hbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25kaXRpb25hbChzcGFuLCBjb25kaXRpb24sIHRydWVFeHAsIGZhbHNlRXhwKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjtcbiAgICAgICAgX3RoaXMudHJ1ZUV4cCA9IHRydWVFeHA7XG4gICAgICAgIF90aGlzLmZhbHNlRXhwID0gZmFsc2VFeHA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQ29uZGl0aW9uYWwucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdENvbmRpdGlvbmFsKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIENvbmRpdGlvbmFsO1xufShBU1QpKTtcbnZhciBQcm9wZXJ0eVJlYWQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFByb3BlcnR5UmVhZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcm9wZXJ0eVJlYWQoc3BhbiwgcmVjZWl2ZXIsIG5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUHJvcGVydHlSZWFkLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcm9wZXJ0eVJlYWQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUHJvcGVydHlSZWFkO1xufShBU1QpKTtcbnZhciBQcm9wZXJ0eVdyaXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcm9wZXJ0eVdyaXRlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByb3BlcnR5V3JpdGUoc3BhbiwgcmVjZWl2ZXIsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFByb3BlcnR5V3JpdGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFByb3BlcnR5V3JpdGUodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUHJvcGVydHlXcml0ZTtcbn0oQVNUKSk7XG52YXIgU2FmZVByb3BlcnR5UmVhZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZVByb3BlcnR5UmVhZCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYWZlUHJvcGVydHlSZWFkKHNwYW4sIHJlY2VpdmVyLCBuYW1lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNhZmVQcm9wZXJ0eVJlYWQucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2FmZVByb3BlcnR5UmVhZDtcbn0oQVNUKSk7XG52YXIgS2V5ZWRSZWFkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhLZXllZFJlYWQsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gS2V5ZWRSZWFkKHNwYW4sIG9iaiwga2V5KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9iaiA9IG9iajtcbiAgICAgICAgX3RoaXMua2V5ID0ga2V5O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEtleWVkUmVhZC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRSZWFkKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEtleWVkUmVhZDtcbn0oQVNUKSk7XG52YXIgS2V5ZWRXcml0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoS2V5ZWRXcml0ZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBLZXllZFdyaXRlKHNwYW4sIG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vYmogPSBvYmo7XG4gICAgICAgIF90aGlzLmtleSA9IGtleTtcbiAgICAgICAgX3RoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBLZXllZFdyaXRlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRLZXllZFdyaXRlKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEtleWVkV3JpdGU7XG59KEFTVCkpO1xudmFyIEJpbmRpbmdQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCaW5kaW5nUGlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCaW5kaW5nUGlwZShzcGFuLCBleHAsIG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwID0gZXhwO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgX3RoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQmluZGluZ1BpcGUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFBpcGUodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQmluZGluZ1BpcGU7XG59KEFTVCkpO1xudmFyIExpdGVyYWxQcmltaXRpdmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKExpdGVyYWxQcmltaXRpdmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGl0ZXJhbFByaW1pdGl2ZShzcGFuLCB2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIExpdGVyYWxQcmltaXRpdmUucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxQcmltaXRpdmUodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gTGl0ZXJhbFByaW1pdGl2ZTtcbn0oQVNUKSk7XG52YXIgTGl0ZXJhbEFycmF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaXRlcmFsQXJyYXksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTGl0ZXJhbEFycmF5KHNwYW4sIGV4cHJlc3Npb25zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGl0ZXJhbEFycmF5LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsQXJyYXkodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gTGl0ZXJhbEFycmF5O1xufShBU1QpKTtcbnZhciBMaXRlcmFsTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhMaXRlcmFsTWFwLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIExpdGVyYWxNYXAoc3Bhbiwga2V5cywgdmFsdWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmtleXMgPSBrZXlzO1xuICAgICAgICBfdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTGl0ZXJhbE1hcC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbE1hcCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBMaXRlcmFsTWFwO1xufShBU1QpKTtcbnZhciBJbnRlcnBvbGF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJbnRlcnBvbGF0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEludGVycG9sYXRpb24oc3Bhbiwgc3RyaW5ncywgZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgICAgIF90aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSW50ZXJwb2xhdGlvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0SW50ZXJwb2xhdGlvbih0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBJbnRlcnBvbGF0aW9uO1xufShBU1QpKTtcbnZhciBCaW5hcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJpbmFyeSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCaW5hcnkoc3Bhbiwgb3BlcmF0aW9uLCBsZWZ0LCByaWdodCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gICAgICAgIF90aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICBfdGhpcy5yaWdodCA9IHJpZ2h0O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJpbmFyeS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmFyeTtcbn0oQVNUKSk7XG52YXIgUHJlZml4Tm90ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcmVmaXhOb3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJlZml4Tm90KHNwYW4sIGV4cHJlc3Npb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUHJlZml4Tm90LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRQcmVmaXhOb3QodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gUHJlZml4Tm90O1xufShBU1QpKTtcbnZhciBOb25OdWxsQXNzZXJ0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb25OdWxsQXNzZXJ0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vbk51bGxBc3NlcnQoc3BhbiwgZXhwcmVzc2lvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOb25OdWxsQXNzZXJ0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXROb25OdWxsQXNzZXJ0KHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vbk51bGxBc3NlcnQ7XG59KEFTVCkpO1xudmFyIE1ldGhvZENhbGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE1ldGhvZENhbGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWV0aG9kQ2FsbChzcGFuLCByZWNlaXZlciwgbmFtZSwgYXJncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZWNlaXZlciA9IHJlY2VpdmVyO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgX3RoaXMuYXJncyA9IGFyZ3M7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTWV0aG9kQ2FsbC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TWV0aG9kQ2FsbCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBNZXRob2RDYWxsO1xufShBU1QpKTtcbnZhciBTYWZlTWV0aG9kQ2FsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZU1ldGhvZENhbGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2FmZU1ldGhvZENhbGwoc3BhbiwgcmVjZWl2ZXIsIG5hbWUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc3BhbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucmVjZWl2ZXIgPSByZWNlaXZlcjtcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFNhZmVNZXRob2RDYWxsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHsgY29udGV4dCA9IG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTYWZlTWV0aG9kQ2FsbCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBTYWZlTWV0aG9kQ2FsbDtcbn0oQVNUKSk7XG52YXIgRnVuY3Rpb25DYWxsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGdW5jdGlvbkNhbGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRnVuY3Rpb25DYWxsKHNwYW4sIHRhcmdldCwgYXJncykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIF90aGlzLmFyZ3MgPSBhcmdzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZ1bmN0aW9uQ2FsbC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RnVuY3Rpb25DYWxsKHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEZ1bmN0aW9uQ2FsbDtcbn0oQVNUKSk7XG52YXIgQVNUV2l0aFNvdXJjZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQVNUV2l0aFNvdXJjZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBU1RXaXRoU291cmNlKGFzdCwgc291cmNlLCBsb2NhdGlvbiwgZXJyb3JzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG5ldyBQYXJzZVNwYW4oMCwgc291cmNlID09IG51bGwgPyAwIDogc291cmNlLmxlbmd0aCkpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFzdCA9IGFzdDtcbiAgICAgICAgX3RoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBfdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICBfdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgQVNUV2l0aFNvdXJjZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgICAgIHJldHVybiB0aGlzLmFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIEFTVFdpdGhTb3VyY2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zb3VyY2UgKyBcIiBpbiBcIiArIHRoaXMubG9jYXRpb247IH07XG4gICAgcmV0dXJuIEFTVFdpdGhTb3VyY2U7XG59KEFTVCkpO1xudmFyIFRlbXBsYXRlQmluZGluZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZW1wbGF0ZUJpbmRpbmcoc3Bhbiwga2V5LCBrZXlJc1ZhciwgbmFtZSwgZXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnNwYW4gPSBzcGFuO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy5rZXlJc1ZhciA9IGtleUlzVmFyO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gVGVtcGxhdGVCaW5kaW5nO1xufSgpKTtcbnZhciBOdWxsQXN0VmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOdWxsQXN0VmlzaXRvcigpIHtcbiAgICB9XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0QmluYXJ5ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdENoYWluID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbmRpdGlvbmFsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBOdWxsQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbXBsaWNpdFJlY2VpdmVyID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEtleWVkV3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxNYXAgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBOdWxsQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFBpcGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJlZml4Tm90ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdE5vbk51bGxBc3NlcnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJvcGVydHlSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFByb3BlcnR5V3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UXVvdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZU1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbEFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICByZXR1cm4gTnVsbEFzdFZpc2l0b3I7XG59KCkpO1xudmFyIFJlY3Vyc2l2ZUFzdFZpc2l0b3IkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWN1cnNpdmVBc3RWaXNpdG9yKCkge1xuICAgIH1cbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LmxlZnQudmlzaXQodGhpcyk7XG4gICAgICAgIGFzdC5yaWdodC52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdENoYWluID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMsIGNvbnRleHQpOyB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5jb25kaXRpb24udmlzaXQodGhpcyk7XG4gICAgICAgIGFzdC50cnVlRXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICBhc3QuZmFsc2VFeHAudmlzaXQodGhpcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICBhc3QuZXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LnRhcmdldC52aXNpdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbChhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRJbXBsaWNpdFJlY2VpdmVyID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucywgY29udGV4dCk7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEtleWVkUmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICAgICAgYXN0LmtleS52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdEtleWVkV3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgICAgIGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgICAgIGFzdC52YWx1ZS52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbE1hcCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LnZhbHVlcywgY29udGV4dCk7IH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsUHJpbWl0aXZlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdE1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRQcmVmaXhOb3QgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5leHByZXNzaW9uLnZpc2l0KHRoaXMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Tm9uTnVsbEFzc2VydCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LmV4cHJlc3Npb24udmlzaXQodGhpcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVJlYWQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBSZWN1cnNpdmVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdFByb3BlcnR5V3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZUFzdFZpc2l0b3IucHJvdG90eXBlLnZpc2l0U2FmZU1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIGNvbnRleHQpO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRBbGwgPSBmdW5jdGlvbiAoYXN0cywgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBhc3RzLmZvckVhY2goZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gYXN0LnZpc2l0KF90aGlzLCBjb250ZXh0KTsgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUmVjdXJzaXZlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRRdW90ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgcmV0dXJuIFJlY3Vyc2l2ZUFzdFZpc2l0b3I7XG59KCkpO1xudmFyIEFzdFRyYW5zZm9ybWVyJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN0VHJhbnNmb3JtZXIoKSB7XG4gICAgfVxuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEltcGxpY2l0UmVjZWl2ZXIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBhc3Q7IH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0aW9uKGFzdC5zcGFuLCBhc3Quc3RyaW5ncywgdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZShhc3Quc3BhbiwgYXN0LnZhbHVlKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlYWQoYXN0LnNwYW4sIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UHJvcGVydHlXcml0ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVdyaXRlKGFzdC5zcGFuLCBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lLCBhc3QudmFsdWUudmlzaXQodGhpcykpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlSZWFkKGFzdC5zcGFuLCBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdE1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgTWV0aG9kQ2FsbChhc3Quc3BhbiwgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpLCBhc3QubmFtZSwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U2FmZU1ldGhvZENhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2FmZU1ldGhvZENhbGwoYXN0LnNwYW4sIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkNhbGwoYXN0LnNwYW4sIGFzdC50YXJnZXQudmlzaXQodGhpcyksIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQXJyYXkoYXN0LnNwYW4sIHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zKSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXAoYXN0LnNwYW4sIGFzdC5rZXlzLCB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnkoYXN0LnNwYW4sIGFzdC5vcGVyYXRpb24sIGFzdC5sZWZ0LnZpc2l0KHRoaXMpLCBhc3QucmlnaHQudmlzaXQodGhpcykpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UHJlZml4Tm90ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFByZWZpeE5vdChhc3Quc3BhbiwgYXN0LmV4cHJlc3Npb24udmlzaXQodGhpcykpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Tm9uTnVsbEFzc2VydCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb25OdWxsQXNzZXJ0KGFzdC5zcGFuLCBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbChhc3Quc3BhbiwgYXN0LmNvbmRpdGlvbi52aXNpdCh0aGlzKSwgYXN0LnRydWVFeHAudmlzaXQodGhpcyksIGFzdC5mYWxzZUV4cC52aXNpdCh0aGlzKSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdQaXBlKGFzdC5zcGFuLCBhc3QuZXhwLnZpc2l0KHRoaXMpLCBhc3QubmFtZSwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICAgIH07XG4gICAgQXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEtleWVkUmVhZChhc3Quc3BhbiwgYXN0Lm9iai52aXNpdCh0aGlzKSwgYXN0LmtleS52aXNpdCh0aGlzKSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRLZXllZFdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEtleWVkV3JpdGUoYXN0LnNwYW4sIGFzdC5vYmoudmlzaXQodGhpcyksIGFzdC5rZXkudmlzaXQodGhpcyksIGFzdC52YWx1ZS52aXNpdCh0aGlzKSk7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRBbGwgPSBmdW5jdGlvbiAoYXN0cykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IEFycmF5KGFzdHMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhc3RzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICByZXNbaV0gPSBhc3RzW2ldLnZpc2l0KHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRDaGFpbiA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaGFpbihhc3Quc3BhbiwgdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTtcbiAgICB9O1xuICAgIEFzdFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFF1b3RlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IFF1b3RlKGFzdC5zcGFuLCBhc3QucHJlZml4LCBhc3QudW5pbnRlcnByZXRlZEV4cHJlc3Npb24sIGFzdC5sb2NhdGlvbik7XG4gICAgfTtcbiAgICByZXR1cm4gQXN0VHJhbnNmb3JtZXI7XG59KCkpO1xuLy8gQSB0cmFuc2Zvcm1lciB0aGF0IG9ubHkgY3JlYXRlcyBuZXcgbm9kZXMgaWYgdGhlIHRyYW5zZm9ybWVyIG1ha2VzIGEgY2hhbmdlIG9yXG4vLyBhIGNoYW5nZSBpcyBtYWRlIGEgY2hpbGQgbm9kZS5cbnZhciBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lcigpIHtcbiAgICB9XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0SW1wbGljaXRSZWNlaXZlciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIGFzdDsgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7XG4gICAgICAgIGlmIChleHByZXNzaW9ucyAhPT0gYXN0LmV4cHJlc3Npb25zKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0aW9uKGFzdC5zcGFuLCBhc3Quc3RyaW5ncywgZXhwcmVzc2lvbnMpO1xuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgcmV0dXJuIGFzdDsgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVJlYWQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciByZWNlaXZlciA9IGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICAgICAgaWYgKHJlY2VpdmVyICE9PSBhc3QucmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlSZWFkKGFzdC5zcGFuLCByZWNlaXZlciwgYXN0Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFzdC52YWx1ZS52aXNpdCh0aGlzKTtcbiAgICAgICAgaWYgKHJlY2VpdmVyICE9PSBhc3QucmVjZWl2ZXIgfHwgdmFsdWUgIT09IGFzdC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVdyaXRlKGFzdC5zcGFuLCByZWNlaXZlciwgYXN0Lm5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHJlY2VpdmVyID0gYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgICAgICBpZiAocmVjZWl2ZXIgIT09IGFzdC5yZWNlaXZlcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlSZWFkKGFzdC5zcGFuLCByZWNlaXZlciwgYXN0Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgICAgIGlmIChyZWNlaXZlciAhPT0gYXN0LnJlY2VpdmVyIHx8IGFyZ3MgIT09IGFzdC5hcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1ldGhvZENhbGwoYXN0LnNwYW4sIHJlY2VpdmVyLCBhc3QubmFtZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xuICAgIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFNhZmVNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgICAgIGlmIChyZWNlaXZlciAhPT0gYXN0LnJlY2VpdmVyIHx8IGFyZ3MgIT09IGFzdC5hcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNhZmVNZXRob2RDYWxsKGFzdC5zcGFuLCByZWNlaXZlciwgYXN0Lm5hbWUsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRGdW5jdGlvbkNhbGwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBhc3QudGFyZ2V0ICYmIGFzdC50YXJnZXQudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGFzdC50YXJnZXQgfHwgYXJncyAhPT0gYXN0LmFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25DYWxsKGFzdC5zcGFuLCB0YXJnZXQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBleHByZXNzaW9ucyA9IHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25zICE9PSBhc3QuZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEFycmF5KGFzdC5zcGFuLCBleHByZXNzaW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xuICAgIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdExpdGVyYWxNYXAgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpO1xuICAgICAgICBpZiAodmFsdWVzICE9PSBhc3QudmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXAoYXN0LnNwYW4sIGFzdC5rZXlzLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBsZWZ0ID0gYXN0LmxlZnQudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciByaWdodCA9IGFzdC5yaWdodC52aXNpdCh0aGlzKTtcbiAgICAgICAgaWYgKGxlZnQgIT09IGFzdC5sZWZ0IHx8IHJpZ2h0ICE9PSBhc3QucmlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5KGFzdC5zcGFuLCBhc3Qub3BlcmF0aW9uLCBsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xuICAgIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFByZWZpeE5vdCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gIT09IGFzdC5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByZWZpeE5vdChhc3Quc3BhbiwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xuICAgIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdE5vbk51bGxBc3NlcnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBleHByZXNzaW9uID0gYXN0LmV4cHJlc3Npb24udmlzaXQodGhpcyk7XG4gICAgICAgIGlmIChleHByZXNzaW9uICE9PSBhc3QuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOb25OdWxsQXNzZXJ0KGFzdC5zcGFuLCBleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWwgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBjb25kaXRpb24gPSBhc3QuY29uZGl0aW9uLnZpc2l0KHRoaXMpO1xuICAgICAgICB2YXIgdHJ1ZUV4cCA9IGFzdC50cnVlRXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICB2YXIgZmFsc2VFeHAgPSBhc3QuZmFsc2VFeHAudmlzaXQodGhpcyk7XG4gICAgICAgIGlmIChjb25kaXRpb24gIT09IGFzdC5jb25kaXRpb24gfHwgdHJ1ZUV4cCAhPT0gYXN0LnRydWVFeHAgfHwgZmFsc2VFeHAgIT09IGFzdC5mYWxzZUV4cCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbChhc3Quc3BhbiwgY29uZGl0aW9uLCB0cnVlRXhwLCBmYWxzZUV4cCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFzdDtcbiAgICB9O1xuICAgIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFBpcGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBleHAgPSBhc3QuZXhwLnZpc2l0KHRoaXMpO1xuICAgICAgICB2YXIgYXJncyA9IHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpO1xuICAgICAgICBpZiAoZXhwICE9PSBhc3QuZXhwIHx8IGFyZ3MgIT09IGFzdC5hcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdQaXBlKGFzdC5zcGFuLCBleHAsIGFzdC5uYW1lLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgb2JqID0gYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICAgICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgICAgIGlmIChvYmogIT09IGFzdC5vYmogfHwga2V5ICE9PSBhc3Qua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEtleWVkUmVhZChhc3Quc3Bhbiwgb2JqLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRLZXllZFdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgb2JqID0gYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICAgICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFzdC52YWx1ZS52aXNpdCh0aGlzKTtcbiAgICAgICAgaWYgKG9iaiAhPT0gYXN0Lm9iaiB8fCBrZXkgIT09IGFzdC5rZXkgfHwgdmFsdWUgIT09IGFzdC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXllZFdyaXRlKGFzdC5zcGFuLCBvYmosIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3Q7XG4gICAgfTtcbiAgICBBc3RNZW1vcnlFZmZpY2llbnRUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRBbGwgPSBmdW5jdGlvbiAoYXN0cykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IEFycmF5KGFzdHMubGVuZ3RoKTtcbiAgICAgICAgdmFyIG1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsID0gYXN0c1tpXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG9yaWdpbmFsLnZpc2l0KHRoaXMpO1xuICAgICAgICAgICAgcmVzW2ldID0gdmFsdWU7XG4gICAgICAgICAgICBtb2RpZmllZCA9IG1vZGlmaWVkIHx8IHZhbHVlICE9PSBvcmlnaW5hbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kaWZpZWQgPyByZXMgOiBhc3RzO1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0Q2hhaW4gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBleHByZXNzaW9ucyA9IHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb25zICE9PSBhc3QuZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW4oYXN0LnNwYW4sIGV4cHJlc3Npb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH07XG4gICAgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UXVvdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBhc3Q7IH07XG4gICAgcmV0dXJuIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyO1xufSgpKTtcbmZ1bmN0aW9uIHZpc2l0QXN0Q2hpbGRyZW4oYXN0LCB2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgZnVuY3Rpb24gdmlzaXQoYXN0KSB7XG4gICAgICAgIHZpc2l0b3IudmlzaXQgJiYgdmlzaXRvci52aXNpdChhc3QsIGNvbnRleHQpIHx8IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmlzaXRBbGwoYXN0cykgeyBhc3RzLmZvckVhY2godmlzaXQpOyB9XG4gICAgYXN0LnZpc2l0KHtcbiAgICAgICAgdmlzaXRCaW5hcnk6IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5sZWZ0KTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5yaWdodCk7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2l0Q2hhaW46IGZ1bmN0aW9uIChhc3QpIHsgdmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zKTsgfSxcbiAgICAgICAgdmlzaXRDb25kaXRpb25hbDogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0LmNvbmRpdGlvbik7XG4gICAgICAgICAgICB2aXNpdChhc3QudHJ1ZUV4cCk7XG4gICAgICAgICAgICB2aXNpdChhc3QuZmFsc2VFeHApO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpdEZ1bmN0aW9uQ2FsbDogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgaWYgKGFzdC50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB2aXNpdChhc3QudGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyOiBmdW5jdGlvbiAoYXN0KSB7IH0sXG4gICAgICAgIHZpc2l0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKGFzdCkgeyB2aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpOyB9LFxuICAgICAgICB2aXNpdEtleWVkUmVhZDogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0Lm9iaik7XG4gICAgICAgICAgICB2aXNpdChhc3Qua2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaXRLZXllZFdyaXRlOiBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgICAgICB2aXNpdChhc3Qub2JqKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5rZXkpO1xuICAgICAgICAgICAgdmlzaXQoYXN0Lm9iaik7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2l0TGl0ZXJhbEFycmF5OiBmdW5jdGlvbiAoYXN0KSB7IHZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH0sXG4gICAgICAgIHZpc2l0TGl0ZXJhbE1hcDogZnVuY3Rpb24gKGFzdCkgeyB9LFxuICAgICAgICB2aXNpdExpdGVyYWxQcmltaXRpdmU6IGZ1bmN0aW9uIChhc3QpIHsgfSxcbiAgICAgICAgdmlzaXRNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgICAgICB2aXNpdChhc3QucmVjZWl2ZXIpO1xuICAgICAgICAgICAgdmlzaXRBbGwoYXN0LmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpdFBpcGU6IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5leHApO1xuICAgICAgICAgICAgdmlzaXRBbGwoYXN0LmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgICB2aXNpdFByZWZpeE5vdDogZnVuY3Rpb24gKGFzdCkgeyB2aXNpdChhc3QuZXhwcmVzc2lvbik7IH0sXG4gICAgICAgIHZpc2l0Tm9uTnVsbEFzc2VydDogZnVuY3Rpb24gKGFzdCkgeyB2aXNpdChhc3QuZXhwcmVzc2lvbik7IH0sXG4gICAgICAgIHZpc2l0UHJvcGVydHlSZWFkOiBmdW5jdGlvbiAoYXN0KSB7IHZpc2l0KGFzdC5yZWNlaXZlcik7IH0sXG4gICAgICAgIHZpc2l0UHJvcGVydHlXcml0ZTogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0LnJlY2VpdmVyKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC52YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHZpc2l0UXVvdGU6IGZ1bmN0aW9uIChhc3QpIHsgfSxcbiAgICAgICAgdmlzaXRTYWZlTWV0aG9kQ2FsbDogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0LnJlY2VpdmVyKTtcbiAgICAgICAgICAgIHZpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmlzaXRTYWZlUHJvcGVydHlSZWFkOiBmdW5jdGlvbiAoYXN0KSB7IHZpc2l0KGFzdC5yZWNlaXZlcik7IH0sXG4gICAgfSk7XG59XG4vLyBCaW5kaW5nc1xudmFyIFBhcnNlZFByb3BlcnR5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcnNlZFByb3BlcnR5KG5hbWUsIGV4cHJlc3Npb24sIHR5cGUsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pc0xpdGVyYWwgPSB0aGlzLnR5cGUgPT09IFBhcnNlZFByb3BlcnR5VHlwZS5MSVRFUkFMX0FUVFI7XG4gICAgICAgIHRoaXMuaXNBbmltYXRpb24gPSB0aGlzLnR5cGUgPT09IFBhcnNlZFByb3BlcnR5VHlwZS5BTklNQVRJT047XG4gICAgfVxuICAgIHJldHVybiBQYXJzZWRQcm9wZXJ0eTtcbn0oKSk7XG52YXIgUGFyc2VkUHJvcGVydHlUeXBlO1xuKGZ1bmN0aW9uIChQYXJzZWRQcm9wZXJ0eVR5cGUpIHtcbiAgICBQYXJzZWRQcm9wZXJ0eVR5cGVbUGFyc2VkUHJvcGVydHlUeXBlW1wiREVGQVVMVFwiXSA9IDBdID0gXCJERUZBVUxUXCI7XG4gICAgUGFyc2VkUHJvcGVydHlUeXBlW1BhcnNlZFByb3BlcnR5VHlwZVtcIkxJVEVSQUxfQVRUUlwiXSA9IDFdID0gXCJMSVRFUkFMX0FUVFJcIjtcbiAgICBQYXJzZWRQcm9wZXJ0eVR5cGVbUGFyc2VkUHJvcGVydHlUeXBlW1wiQU5JTUFUSU9OXCJdID0gMl0gPSBcIkFOSU1BVElPTlwiO1xufSkoUGFyc2VkUHJvcGVydHlUeXBlIHx8IChQYXJzZWRQcm9wZXJ0eVR5cGUgPSB7fSkpO1xudmFyIFBhcnNlZEV2ZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8vIFJlZ3VsYXIgZXZlbnRzIGhhdmUgYSB0YXJnZXRcbiAgICAvLyBBbmltYXRpb24gZXZlbnRzIGhhdmUgYSBwaGFzZVxuICAgIGZ1bmN0aW9uIFBhcnNlZEV2ZW50KG5hbWUsIHRhcmdldE9yUGhhc2UsIHR5cGUsIGhhbmRsZXIsIHNvdXJjZVNwYW4sIGhhbmRsZXJTcGFuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudGFyZ2V0T3JQaGFzZSA9IHRhcmdldE9yUGhhc2U7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMuaGFuZGxlclNwYW4gPSBoYW5kbGVyU3BhbjtcbiAgICB9XG4gICAgcmV0dXJuIFBhcnNlZEV2ZW50O1xufSgpKTtcbnZhciBQYXJzZWRWYXJpYWJsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQYXJzZWRWYXJpYWJsZShuYW1lLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIHJldHVybiBQYXJzZWRWYXJpYWJsZTtcbn0oKSk7XG52YXIgQm91bmRFbGVtZW50UHJvcGVydHkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQm91bmRFbGVtZW50UHJvcGVydHkobmFtZSwgdHlwZSwgc2VjdXJpdHlDb250ZXh0LCB2YWx1ZSwgdW5pdCwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnNlY3VyaXR5Q29udGV4dCA9IHNlY3VyaXR5Q29udGV4dDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVuaXQgPSB1bml0O1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICByZXR1cm4gQm91bmRFbGVtZW50UHJvcGVydHk7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRXZlbnRIYW5kbGVyVmFycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEhhbmRsZXJWYXJzKCkge1xuICAgIH1cbiAgICBFdmVudEhhbmRsZXJWYXJzLmV2ZW50ID0gdmFyaWFibGUoJyRldmVudCcpO1xuICAgIHJldHVybiBFdmVudEhhbmRsZXJWYXJzO1xufSgpKTtcbnZhciBDb252ZXJ0QWN0aW9uQmluZGluZ1Jlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb252ZXJ0QWN0aW9uQmluZGluZ1Jlc3VsdChcbiAgICAvKipcbiAgICAgKiBSZW5kZXIyIGNvbXBhdGlibGUgc3RhdGVtZW50cyxcbiAgICAgKi9cbiAgICBzdG10cywgXG4gICAgLyoqXG4gICAgICogVmFyaWFibGUgbmFtZSB1c2VkIHdpdGggcmVuZGVyMiBjb21wYXRpYmxlIHN0YXRlbWVudHMuXG4gICAgICovXG4gICAgYWxsb3dEZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuc3RtdHMgPSBzdG10cztcbiAgICAgICAgdGhpcy5hbGxvd0RlZmF1bHQgPSBhbGxvd0RlZmF1bHQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGlzIGJpdCBvZiBhIGhhY2suIEl0IGNvbnZlcnRzIHN0YXRlbWVudHMgd2hpY2ggcmVuZGVyMiBleHBlY3RzIHRvIHN0YXRlbWVudHMgd2hpY2ggYXJlXG4gICAgICAgICAqIGV4cGVjdGVkIGJ5IHJlbmRlcjMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEV4YW1wbGU6IGA8ZGl2IGNsaWNrPVwiZG9Tb21ldGhpbmcoJGV2ZW50KVwiPmAgd2lsbCBnZW5lcmF0ZTpcbiAgICAgICAgICpcbiAgICAgICAgICogUmVuZGVyMzpcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqIGNvbnN0IHBkX2I6YW55ID0gKCg8YW55PmN0eC5kb1NvbWV0aGluZygkZXZlbnQpKSAhPT0gZmFsc2UpO1xuICAgICAgICAgKiByZXR1cm4gcGRfYjtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIGJ1dCByZW5kZXIyIGV4cGVjdHM6XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiByZXR1cm4gY3R4LmRvU29tZXRoaW5nKCRldmVudCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IHJlbW92ZSB0aGlzIGhhY2sgb25jZSB3ZSBubyBsb25nZXIgc3VwcG9ydCBWaWV3RW5naW5lLlxuICAgICAgICB0aGlzLnJlbmRlcjNTdG10cyA9IHN0bXRzLm1hcChmdW5jdGlvbiAoc3RhdGVtZW50KSB7XG4gICAgICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRGVjbGFyZVZhclN0bXQgJiYgc3RhdGVtZW50Lm5hbWUgPT0gYWxsb3dEZWZhdWx0Lm5hbWUgJiZcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQudmFsdWUgaW5zdGFuY2VvZiBCaW5hcnlPcGVyYXRvckV4cHIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGhzID0gc3RhdGVtZW50LnZhbHVlLmxocztcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJldHVyblN0YXRlbWVudChsaHMudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBDb252ZXJ0QWN0aW9uQmluZGluZ1Jlc3VsdDtcbn0oKSk7XG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBleHByZXNzaW9uIEFTVCBpbnRvIGFuIGV4ZWN1dGFibGUgb3V0cHV0IEFTVCwgYXNzdW1pbmcgdGhlIGV4cHJlc3Npb24gaXNcbiAqIHVzZWQgaW4gYW4gYWN0aW9uIGJpbmRpbmcgKGUuZy4gYW4gZXZlbnQgaGFuZGxlcikuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRBY3Rpb25CaW5kaW5nKGxvY2FsUmVzb2x2ZXIsIGltcGxpY2l0UmVjZWl2ZXIsIGFjdGlvbiwgYmluZGluZ0lkLCBpbnRlcnBvbGF0aW9uRnVuY3Rpb24sIGJhc2VTb3VyY2VTcGFuKSB7XG4gICAgaWYgKCFsb2NhbFJlc29sdmVyKSB7XG4gICAgICAgIGxvY2FsUmVzb2x2ZXIgPSBuZXcgRGVmYXVsdExvY2FsUmVzb2x2ZXIoKTtcbiAgICB9XG4gICAgdmFyIGFjdGlvbldpdGhvdXRCdWlsdGlucyA9IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmdCdWlsdGlucyh7XG4gICAgICAgIGNyZWF0ZUxpdGVyYWxBcnJheUNvbnZlcnRlcjogZnVuY3Rpb24gKGFyZ0NvdW50KSB7XG4gICAgICAgICAgICAvLyBOb3RlOiBubyBjYWNoaW5nIGZvciBsaXRlcmFsIGFycmF5cyBpbiBhY3Rpb25zLlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7IHJldHVybiBsaXRlcmFsQXJyKGFyZ3MpOyB9O1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVMaXRlcmFsTWFwQ29udmVydGVyOiBmdW5jdGlvbiAoa2V5cykge1xuICAgICAgICAgICAgLy8gTm90ZTogbm8gY2FjaGluZyBmb3IgbGl0ZXJhbCBtYXBzIGluIGFjdGlvbnMuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyaWVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGssIGkpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogay5rZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHF1b3RlZDogay5xdW90ZWQsXG4gICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBsaXRlcmFsTWFwKGVudHJpZXMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlUGlwZUNvbnZlcnRlcjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IEFjdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gcGlwZXMuIFBpcGU6IFwiICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9LCBhY3Rpb24pO1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9Bc3RUb0lyVmlzaXRvcihsb2NhbFJlc29sdmVyLCBpbXBsaWNpdFJlY2VpdmVyLCBiaW5kaW5nSWQsIGludGVycG9sYXRpb25GdW5jdGlvbiwgYmFzZVNvdXJjZVNwYW4pO1xuICAgIHZhciBhY3Rpb25TdG10cyA9IFtdO1xuICAgIGZsYXR0ZW5TdGF0ZW1lbnRzKGFjdGlvbldpdGhvdXRCdWlsdGlucy52aXNpdCh2aXNpdG9yLCBfTW9kZS5TdGF0ZW1lbnQpLCBhY3Rpb25TdG10cyk7XG4gICAgcHJlcGVuZFRlbXBvcmFyeURlY2xzKHZpc2l0b3IudGVtcG9yYXJ5Q291bnQsIGJpbmRpbmdJZCwgYWN0aW9uU3RtdHMpO1xuICAgIGlmICh2aXNpdG9yLnVzZXNJbXBsaWNpdFJlY2VpdmVyKSB7XG4gICAgICAgIGxvY2FsUmVzb2x2ZXIubm90aWZ5SW1wbGljaXRSZWNlaXZlclVzZSgpO1xuICAgIH1cbiAgICB2YXIgbGFzdEluZGV4ID0gYWN0aW9uU3RtdHMubGVuZ3RoIC0gMTtcbiAgICB2YXIgcHJldmVudERlZmF1bHRWYXIgPSBudWxsO1xuICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICB2YXIgbGFzdFN0YXRlbWVudCA9IGFjdGlvblN0bXRzW2xhc3RJbmRleF07XG4gICAgICAgIHZhciByZXR1cm5FeHByID0gY29udmVydFN0bXRJbnRvRXhwcmVzc2lvbihsYXN0U3RhdGVtZW50KTtcbiAgICAgICAgaWYgKHJldHVybkV4cHIpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIG5lZWQgdG8gY2FzdCB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbCB0byBkeW5hbWljLFxuICAgICAgICAgICAgLy8gYXMgaXQgbWlnaHQgYmUgYSB2b2lkIG1ldGhvZCFcbiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0VmFyID0gY3JlYXRlUHJldmVudERlZmF1bHRWYXIoYmluZGluZ0lkKTtcbiAgICAgICAgICAgIGFjdGlvblN0bXRzW2xhc3RJbmRleF0gPVxuICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0VmFyLnNldChyZXR1cm5FeHByLmNhc3QoRFlOQU1JQ19UWVBFKS5ub3RJZGVudGljYWwobGl0ZXJhbChmYWxzZSkpKVxuICAgICAgICAgICAgICAgICAgICAudG9EZWNsU3RtdChudWxsLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb252ZXJ0QWN0aW9uQmluZGluZ1Jlc3VsdChhY3Rpb25TdG10cywgcHJldmVudERlZmF1bHRWYXIpO1xufVxuZnVuY3Rpb24gY29udmVydFByb3BlcnR5QmluZGluZ0J1aWx0aW5zKGNvbnZlcnRlckZhY3RvcnksIGFzdCkge1xuICAgIHJldHVybiBjb252ZXJ0QnVpbHRpbnMoY29udmVydGVyRmFjdG9yeSwgYXN0KTtcbn1cbnZhciBDb252ZXJ0UHJvcGVydHlCaW5kaW5nUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnZlcnRQcm9wZXJ0eUJpbmRpbmdSZXN1bHQoc3RtdHMsIGN1cnJWYWxFeHByKSB7XG4gICAgICAgIHRoaXMuc3RtdHMgPSBzdG10cztcbiAgICAgICAgdGhpcy5jdXJyVmFsRXhwciA9IGN1cnJWYWxFeHByO1xuICAgIH1cbiAgICByZXR1cm4gQ29udmVydFByb3BlcnR5QmluZGluZ1Jlc3VsdDtcbn0oKSk7XG52YXIgQmluZGluZ0Zvcm07XG4oZnVuY3Rpb24gKEJpbmRpbmdGb3JtKSB7XG4gICAgLy8gVGhlIGdlbmVyYWwgZm9ybSBvZiBiaW5kaW5nIGV4cHJlc3Npb24sIHN1cHBvcnRzIGFsbCBleHByZXNzaW9ucy5cbiAgICBCaW5kaW5nRm9ybVtCaW5kaW5nRm9ybVtcIkdlbmVyYWxcIl0gPSAwXSA9IFwiR2VuZXJhbFwiO1xuICAgIC8vIFRyeSB0byBnZW5lcmF0ZSBhIHNpbXBsZSBiaW5kaW5nIChubyB0ZW1wb3JhcmllcyBvciBzdGF0ZW1lbnRzKVxuICAgIC8vIG90aGVyd2lzZSBnZW5lcmF0ZSBhIGdlbmVyYWwgYmluZGluZ1xuICAgIEJpbmRpbmdGb3JtW0JpbmRpbmdGb3JtW1wiVHJ5U2ltcGxlXCJdID0gMV0gPSBcIlRyeVNpbXBsZVwiO1xufSkoQmluZGluZ0Zvcm0gfHwgKEJpbmRpbmdGb3JtID0ge30pKTtcbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIGV4cHJlc3Npb24gQVNUIGludG8gYW4gZXhlY3V0YWJsZSBvdXRwdXQgQVNULCBhc3N1bWluZyB0aGUgZXhwcmVzc2lvblxuICogaXMgdXNlZCBpbiBwcm9wZXJ0eSBiaW5kaW5nLiBUaGUgZXhwcmVzc2lvbiBoYXMgdG8gYmUgcHJlcHJvY2Vzc2VkIHZpYVxuICogYGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmdCdWlsdGluc2AuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcobG9jYWxSZXNvbHZlciwgaW1wbGljaXRSZWNlaXZlciwgZXhwcmVzc2lvbldpdGhvdXRCdWlsdGlucywgYmluZGluZ0lkLCBmb3JtLCBpbnRlcnBvbGF0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAoIWxvY2FsUmVzb2x2ZXIpIHtcbiAgICAgICAgbG9jYWxSZXNvbHZlciA9IG5ldyBEZWZhdWx0TG9jYWxSZXNvbHZlcigpO1xuICAgIH1cbiAgICB2YXIgY3VyclZhbEV4cHIgPSBjcmVhdGVDdXJyVmFsdWVFeHByKGJpbmRpbmdJZCk7XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgX0FzdFRvSXJWaXNpdG9yKGxvY2FsUmVzb2x2ZXIsIGltcGxpY2l0UmVjZWl2ZXIsIGJpbmRpbmdJZCwgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uKTtcbiAgICB2YXIgb3V0cHV0RXhwciA9IGV4cHJlc3Npb25XaXRob3V0QnVpbHRpbnMudmlzaXQodmlzaXRvciwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgdmFyIHN0bXRzID0gZ2V0U3RhdGVtZW50c0Zyb21WaXNpdG9yKHZpc2l0b3IsIGJpbmRpbmdJZCk7XG4gICAgaWYgKHZpc2l0b3IudXNlc0ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgbG9jYWxSZXNvbHZlci5ub3RpZnlJbXBsaWNpdFJlY2VpdmVyVXNlKCk7XG4gICAgfVxuICAgIGlmICh2aXNpdG9yLnRlbXBvcmFyeUNvdW50ID09PSAwICYmIGZvcm0gPT0gQmluZGluZ0Zvcm0uVHJ5U2ltcGxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udmVydFByb3BlcnR5QmluZGluZ1Jlc3VsdChbXSwgb3V0cHV0RXhwcik7XG4gICAgfVxuICAgIHN0bXRzLnB1c2goY3VyclZhbEV4cHIuc2V0KG91dHB1dEV4cHIpLnRvRGVjbFN0bXQoRFlOQU1JQ19UWVBFLCBbU3RtdE1vZGlmaWVyLkZpbmFsXSkpO1xuICAgIHJldHVybiBuZXcgQ29udmVydFByb3BlcnR5QmluZGluZ1Jlc3VsdChzdG10cywgY3VyclZhbEV4cHIpO1xufVxuLyoqXG4gKiBHaXZlbiBzb21lIGV4cHJlc3Npb24sIHN1Y2ggYXMgYSBiaW5kaW5nIG9yIGludGVycG9sYXRpb24gZXhwcmVzc2lvbiwgYW5kIGEgY29udGV4dCBleHByZXNzaW9uIHRvXG4gKiBsb29rIHZhbHVlcyB1cCBvbiwgdmlzaXQgZWFjaCBmYWNldCBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiByZXNvbHZpbmcgdmFsdWVzIGZyb20gdGhlIGNvbnRleHRcbiAqIGV4cHJlc3Npb24gc3VjaCB0aGF0IGEgbGlzdCBvZiBhcmd1bWVudHMgY2FuIGJlIGRlcml2ZWQgZnJvbSB0aGUgZm91bmQgdmFsdWVzIHRoYXQgY2FuIGJlIHVzZWQgYXNcbiAqIGFyZ3VtZW50cyB0byBhbiBleHRlcm5hbCB1cGRhdGUgaW5zdHJ1Y3Rpb24uXG4gKlxuICogQHBhcmFtIGxvY2FsUmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIHVzZSB0byBsb29rIHVwIGV4cHJlc3Npb25zIGJ5IG5hbWUgYXBwcm9wcmlhdGVseVxuICogQHBhcmFtIGNvbnRleHRWYXJpYWJsZUV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBjb250ZXh0IHZhcmlhYmxlIHVzZWQgdG8gY3JlYXRlXG4gKiB0aGUgZmluYWwgYXJndW1lbnQgZXhwcmVzc2lvbnNcbiAqIEBwYXJhbSBleHByZXNzaW9uV2l0aEFyZ3VtZW50c1RvRXh0cmFjdCBUaGUgZXhwcmVzc2lvbiB0byB2aXNpdCB0byBmaWd1cmUgb3V0IHdoYXQgdmFsdWVzIG5lZWQgdG9cbiAqIGJlIHJlc29sdmVkIGFuZCB3aGF0IGFyZ3VtZW50cyBsaXN0IHRvIGJ1aWxkLlxuICogQHBhcmFtIGJpbmRpbmdJZCBBIG5hbWUgcHJlZml4IHVzZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZSBuYW1lcyBpZiB0aGV5J3JlIG5lZWRlZCBmb3IgdGhlXG4gKiBhcmd1bWVudHMgZ2VuZXJhdGVkXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBleHByZXNzaW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIGluc3RydWN0aW9uIGV4cHJlc3Npb25zIGxpa2VcbiAqIGBvLmltcG9ydEV4cHIoUjMucHJvcGVydHlJbnRlcnBvbGF0ZSkuY2FsbEZuKHJlc3VsdClgXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRVcGRhdGVBcmd1bWVudHMobG9jYWxSZXNvbHZlciwgY29udGV4dFZhcmlhYmxlRXhwcmVzc2lvbiwgZXhwcmVzc2lvbldpdGhBcmd1bWVudHNUb0V4dHJhY3QsIGJpbmRpbmdJZCkge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9Bc3RUb0lyVmlzaXRvcihsb2NhbFJlc29sdmVyLCBjb250ZXh0VmFyaWFibGVFeHByZXNzaW9uLCBiaW5kaW5nSWQsIHVuZGVmaW5lZCk7XG4gICAgdmFyIG91dHB1dEV4cHIgPSBleHByZXNzaW9uV2l0aEFyZ3VtZW50c1RvRXh0cmFjdC52aXNpdCh2aXNpdG9yLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICBpZiAodmlzaXRvci51c2VzSW1wbGljaXRSZWNlaXZlcikge1xuICAgICAgICBsb2NhbFJlc29sdmVyLm5vdGlmeUltcGxpY2l0UmVjZWl2ZXJVc2UoKTtcbiAgICB9XG4gICAgdmFyIHN0bXRzID0gZ2V0U3RhdGVtZW50c0Zyb21WaXNpdG9yKHZpc2l0b3IsIGJpbmRpbmdJZCk7XG4gICAgLy8gUmVtb3ZpbmcgdGhlIGZpcnN0IGFyZ3VtZW50LCBiZWNhdXNlIGl0IHdhcyBhIGxlbmd0aCBmb3IgVmlld0VuZ2luZSwgbm90IEl2eS5cbiAgICB2YXIgYXJncyA9IG91dHB1dEV4cHIuYXJncy5zbGljZSgxKTtcbiAgICBpZiAoZXhwcmVzc2lvbldpdGhBcmd1bWVudHNUb0V4dHJhY3QgaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBpbnRlcnBvbGF0aW9uIG9mIDEgdmFsdWUgd2l0aCBhbiBlbXB0eSBwcmVmaXggYW5kIHN1ZmZpeCwgcmVkdWNlIHRoZVxuICAgICAgICAvLyBhcmdzIHJldHVybmVkIHRvIGp1c3QgdGhlIHZhbHVlLCBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIHBhc3MgaXQgdG8gYSBzcGVjaWFsIGluc3RydWN0aW9uLlxuICAgICAgICB2YXIgc3RyaW5ncyA9IGV4cHJlc3Npb25XaXRoQXJndW1lbnRzVG9FeHRyYWN0LnN0cmluZ3M7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMyAmJiBzdHJpbmdzWzBdID09PSAnJyAmJiBzdHJpbmdzWzFdID09PSAnJykge1xuICAgICAgICAgICAgLy8gU2luZ2xlIGFyZ3VtZW50IGludGVycG9sYXRlIGluc3RydWN0aW9ucy5cbiAgICAgICAgICAgIGFyZ3MgPSBbYXJnc1sxXV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPj0gMTkpIHtcbiAgICAgICAgICAgIC8vIDE5IG9yIG1vcmUgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBgaW50ZXJwb2xhdGVWYC1zdHlsZSBpbnN0cnVjdGlvbnMsIHdoaWNoIGFjY2VwdFxuICAgICAgICAgICAgLy8gYW4gYXJyYXkgb2YgYXJndW1lbnRzXG4gICAgICAgICAgICBhcmdzID0gW2xpdGVyYWxBcnIoYXJncyldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0bXRzOiBzdG10cywgYXJnczogYXJncyB9O1xufVxuZnVuY3Rpb24gZ2V0U3RhdGVtZW50c0Zyb21WaXNpdG9yKHZpc2l0b3IsIGJpbmRpbmdJZCkge1xuICAgIHZhciBzdG10cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzaXRvci50ZW1wb3JhcnlDb3VudDsgaSsrKSB7XG4gICAgICAgIHN0bXRzLnB1c2godGVtcG9yYXJ5RGVjbGFyYXRpb24oYmluZGluZ0lkLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiBzdG10cztcbn1cbmZ1bmN0aW9uIGNvbnZlcnRCdWlsdGlucyhjb252ZXJ0ZXJGYWN0b3J5LCBhc3QpIHtcbiAgICB2YXIgdmlzaXRvciA9IG5ldyBfQnVpbHRpbkFzdENvbnZlcnRlcihjb252ZXJ0ZXJGYWN0b3J5KTtcbiAgICByZXR1cm4gYXN0LnZpc2l0KHZpc2l0b3IpO1xufVxuZnVuY3Rpb24gdGVtcG9yYXJ5TmFtZShiaW5kaW5nSWQsIHRlbXBvcmFyeU51bWJlcikge1xuICAgIHJldHVybiBcInRtcF9cIiArIGJpbmRpbmdJZCArIFwiX1wiICsgdGVtcG9yYXJ5TnVtYmVyO1xufVxuZnVuY3Rpb24gdGVtcG9yYXJ5RGVjbGFyYXRpb24oYmluZGluZ0lkLCB0ZW1wb3JhcnlOdW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IERlY2xhcmVWYXJTdG10KHRlbXBvcmFyeU5hbWUoYmluZGluZ0lkLCB0ZW1wb3JhcnlOdW1iZXIpLCBOVUxMX0VYUFIpO1xufVxuZnVuY3Rpb24gcHJlcGVuZFRlbXBvcmFyeURlY2xzKHRlbXBvcmFyeUNvdW50LCBiaW5kaW5nSWQsIHN0YXRlbWVudHMpIHtcbiAgICBmb3IgKHZhciBpID0gdGVtcG9yYXJ5Q291bnQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBzdGF0ZW1lbnRzLnVuc2hpZnQodGVtcG9yYXJ5RGVjbGFyYXRpb24oYmluZGluZ0lkLCBpKSk7XG4gICAgfVxufVxudmFyIF9Nb2RlO1xuKGZ1bmN0aW9uIChfTW9kZSkge1xuICAgIF9Nb2RlW19Nb2RlW1wiU3RhdGVtZW50XCJdID0gMF0gPSBcIlN0YXRlbWVudFwiO1xuICAgIF9Nb2RlW19Nb2RlW1wiRXhwcmVzc2lvblwiXSA9IDFdID0gXCJFeHByZXNzaW9uXCI7XG59KShfTW9kZSB8fCAoX01vZGUgPSB7fSkpO1xuZnVuY3Rpb24gZW5zdXJlU3RhdGVtZW50TW9kZShtb2RlLCBhc3QpIHtcbiAgICBpZiAobW9kZSAhPT0gX01vZGUuU3RhdGVtZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIGEgc3RhdGVtZW50LCBidXQgc2F3IFwiICsgYXN0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBlbnN1cmVFeHByZXNzaW9uTW9kZShtb2RlLCBhc3QpIHtcbiAgICBpZiAobW9kZSAhPT0gX01vZGUuRXhwcmVzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBhbiBleHByZXNzaW9uLCBidXQgc2F3IFwiICsgYXN0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCBleHByKSB7XG4gICAgaWYgKG1vZGUgPT09IF9Nb2RlLlN0YXRlbWVudCkge1xuICAgICAgICByZXR1cm4gZXhwci50b1N0bXQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBleHByO1xuICAgIH1cbn1cbnZhciBfQnVpbHRpbkFzdENvbnZlcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoX0J1aWx0aW5Bc3RDb252ZXJ0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gX0J1aWx0aW5Bc3RDb252ZXJ0ZXIoX2NvbnZlcnRlckZhY3RvcnkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2NvbnZlcnRlckZhY3RvcnkgPSBfY29udmVydGVyRmFjdG9yeTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBfQnVpbHRpbkFzdENvbnZlcnRlci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgYXJncyA9IF9fc3ByZWFkKFthc3QuZXhwXSwgYXN0LmFyZ3MpLm1hcChmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBhc3QudmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWlsdGluRnVuY3Rpb25DYWxsKGFzdC5zcGFuLCBhcmdzLCB0aGlzLl9jb252ZXJ0ZXJGYWN0b3J5LmNyZWF0ZVBpcGVDb252ZXJ0ZXIoYXN0Lm5hbWUsIGFyZ3MubGVuZ3RoKSk7XG4gICAgfTtcbiAgICBfQnVpbHRpbkFzdENvbnZlcnRlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhcmdzID0gYXN0LmV4cHJlc3Npb25zLm1hcChmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBhc3QudmlzaXQoX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWlsdGluRnVuY3Rpb25DYWxsKGFzdC5zcGFuLCBhcmdzLCB0aGlzLl9jb252ZXJ0ZXJGYWN0b3J5LmNyZWF0ZUxpdGVyYWxBcnJheUNvbnZlcnRlcihhc3QuZXhwcmVzc2lvbnMubGVuZ3RoKSk7XG4gICAgfTtcbiAgICBfQnVpbHRpbkFzdENvbnZlcnRlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgYXJncyA9IGFzdC52YWx1ZXMubWFwKGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGFzdC52aXNpdChfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICByZXR1cm4gbmV3IEJ1aWx0aW5GdW5jdGlvbkNhbGwoYXN0LnNwYW4sIGFyZ3MsIHRoaXMuX2NvbnZlcnRlckZhY3RvcnkuY3JlYXRlTGl0ZXJhbE1hcENvbnZlcnRlcihhc3Qua2V5cykpO1xuICAgIH07XG4gICAgcmV0dXJuIF9CdWlsdGluQXN0Q29udmVydGVyO1xufShBc3RUcmFuc2Zvcm1lciQxKSk7XG52YXIgX0FzdFRvSXJWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIF9Bc3RUb0lyVmlzaXRvcihfbG9jYWxSZXNvbHZlciwgX2ltcGxpY2l0UmVjZWl2ZXIsIGJpbmRpbmdJZCwgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uLCBiYXNlU291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLl9sb2NhbFJlc29sdmVyID0gX2xvY2FsUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIgPSBfaW1wbGljaXRSZWNlaXZlcjtcbiAgICAgICAgdGhpcy5iaW5kaW5nSWQgPSBiaW5kaW5nSWQ7XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbkZ1bmN0aW9uID0gaW50ZXJwb2xhdGlvbkZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmJhc2VTb3VyY2VTcGFuID0gYmFzZVNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMuX25vZGVNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3Jlc3VsdE1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRlbXBvcmFyeSA9IDA7XG4gICAgICAgIHRoaXMudGVtcG9yYXJ5Q291bnQgPSAwO1xuICAgICAgICB0aGlzLnVzZXNJbXBsaWNpdFJlY2VpdmVyID0gZmFsc2U7XG4gICAgfVxuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRCaW5hcnkgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgIHZhciBvcDtcbiAgICAgICAgc3dpdGNoIChhc3Qub3BlcmF0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLlBsdXM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLk1pbnVzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5NdWx0aXBseTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy8nOlxuICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuRGl2aWRlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5Nb2R1bG87XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5BbmQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5PcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09JzpcbiAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLkVxdWFscztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgICAgICAgICBvcCA9IEJpbmFyeU9wZXJhdG9yLk5vdEVxdWFscztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5JZGVudGljYWw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICchPT0nOlxuICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuTm90SWRlbnRpY2FsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5Mb3dlcjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuQmlnZ2VyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgICAgIG9wID0gQmluYXJ5T3BlcmF0b3IuTG93ZXJFcXVhbHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgb3AgPSBCaW5hcnlPcGVyYXRvci5CaWdnZXJFcXVhbHM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIG9wZXJhdGlvbiBcIiArIGFzdC5vcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCBuZXcgQmluYXJ5T3BlcmF0b3JFeHByKG9wLCB0aGlzLl92aXNpdChhc3QubGVmdCwgX01vZGUuRXhwcmVzc2lvbiksIHRoaXMuX3Zpc2l0KGFzdC5yaWdodCwgX01vZGUuRXhwcmVzc2lvbiksIHVuZGVmaW5lZCwgdGhpcy5jb252ZXJ0U291cmNlU3Bhbihhc3Quc3BhbikpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRDaGFpbiA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgZW5zdXJlU3RhdGVtZW50TW9kZShtb2RlLCBhc3QpO1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMsIG1vZGUpO1xuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbmRpdGlvbmFsID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92aXNpdChhc3QuY29uZGl0aW9uLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIHZhbHVlLmNvbmRpdGlvbmFsKHRoaXMuX3Zpc2l0KGFzdC50cnVlRXhwLCBfTW9kZS5FeHByZXNzaW9uKSwgdGhpcy5fdmlzaXQoYXN0LmZhbHNlRXhwLCBfTW9kZS5FeHByZXNzaW9uKSwgdGhpcy5jb252ZXJ0U291cmNlU3Bhbihhc3Quc3BhbikpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBQaXBlcyBzaG91bGQgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbnRvIGZ1bmN0aW9ucy4gUGlwZTogXCIgKyBhc3QubmFtZSk7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25DYWxsID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICB2YXIgY29udmVydGVkQXJncyA9IHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICB2YXIgZm5SZXN1bHQ7XG4gICAgICAgIGlmIChhc3QgaW5zdGFuY2VvZiBCdWlsdGluRnVuY3Rpb25DYWxsKSB7XG4gICAgICAgICAgICBmblJlc3VsdCA9IGFzdC5jb252ZXJ0ZXIoY29udmVydGVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmblJlc3VsdCA9IHRoaXMuX3Zpc2l0KGFzdC50YXJnZXQsIF9Nb2RlLkV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgLmNhbGxGbihjb252ZXJ0ZWRBcmdzLCB0aGlzLmNvbnZlcnRTb3VyY2VTcGFuKGFzdC5zcGFuKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIGZuUmVzdWx0KTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbXBsaWNpdFJlY2VpdmVyID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICBlbnN1cmVFeHByZXNzaW9uTW9kZShtb2RlLCBhc3QpO1xuICAgICAgICB0aGlzLnVzZXNJbXBsaWNpdFJlY2VpdmVyID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXI7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgZW5zdXJlRXhwcmVzc2lvbk1vZGUobW9kZSwgYXN0KTtcbiAgICAgICAgdmFyIGFyZ3MgPSBbbGl0ZXJhbChhc3QuZXhwcmVzc2lvbnMubGVuZ3RoKV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0LnN0cmluZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2gobGl0ZXJhbChhc3Quc3RyaW5nc1tpXSkpO1xuICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMuX3Zpc2l0KGFzdC5leHByZXNzaW9uc1tpXSwgX01vZGUuRXhwcmVzc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIGFyZ3MucHVzaChsaXRlcmFsKGFzdC5zdHJpbmdzW2FzdC5zdHJpbmdzLmxlbmd0aCAtIDFdKSk7XG4gICAgICAgIGlmICh0aGlzLmludGVycG9sYXRpb25GdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGlvbkZ1bmN0aW9uKGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3QuZXhwcmVzc2lvbnMubGVuZ3RoIDw9IDkgP1xuICAgICAgICAgICAgaW1wb3J0RXhwcihJZGVudGlmaWVycy5pbmxpbmVJbnRlcnBvbGF0ZSkuY2FsbEZuKGFyZ3MpIDpcbiAgICAgICAgICAgIGltcG9ydEV4cHIoSWRlbnRpZmllcnMuaW50ZXJwb2xhdGUpLmNhbGxGbihbXG4gICAgICAgICAgICAgICAgYXJnc1swXSwgbGl0ZXJhbEFycihhcmdzLnNsaWNlKDEpLCB1bmRlZmluZWQsIHRoaXMuY29udmVydFNvdXJjZVNwYW4oYXN0LnNwYW4pKVxuICAgICAgICAgICAgXSk7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0S2V5ZWRSZWFkID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICB2YXIgbGVmdE1vc3RTYWZlID0gdGhpcy5sZWZ0TW9zdFNhZmVOb2RlKGFzdCk7XG4gICAgICAgIGlmIChsZWZ0TW9zdFNhZmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTYWZlQWNjZXNzKGFzdCwgbGVmdE1vc3RTYWZlLCBtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdGF0ZW1lbnRJZk5lZWRlZChtb2RlLCB0aGlzLl92aXNpdChhc3Qub2JqLCBfTW9kZS5FeHByZXNzaW9uKS5rZXkodGhpcy5fdmlzaXQoYXN0LmtleSwgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEtleWVkV3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgIHZhciBvYmogPSB0aGlzLl92aXNpdChhc3Qub2JqLCBfTW9kZS5FeHByZXNzaW9uKTtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuX3Zpc2l0KGFzdC5rZXksIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92aXNpdChhc3QudmFsdWUsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgb2JqLmtleShrZXkpLnNldCh2YWx1ZSkpO1xuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxBcnJheSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBTdGF0ZTogbGl0ZXJhbCBhcnJheXMgc2hvdWxkIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW50byBmdW5jdGlvbnNcIik7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbE1hcCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBTdGF0ZTogbGl0ZXJhbCBtYXBzIHNob3VsZCBoYXZlIGJlZW4gY29udmVydGVkIGludG8gZnVuY3Rpb25zXCIpO1xuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgIC8vIEZvciBsaXRlcmFsIHZhbHVlcyBvZiBudWxsLCB1bmRlZmluZWQsIHRydWUsIG9yIGZhbHNlIGFsbG93IHR5cGUgaW50ZXJmZXJlbmNlXG4gICAgICAgIC8vIHRvIGluZmVyIHRoZSB0eXBlLlxuICAgICAgICB2YXIgdHlwZSA9IGFzdC52YWx1ZSA9PT0gbnVsbCB8fCBhc3QudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhc3QudmFsdWUgPT09IHRydWUgfHwgYXN0LnZhbHVlID09PSB0cnVlID9cbiAgICAgICAgICAgIElORkVSUkVEX1RZUEUgOlxuICAgICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgbGl0ZXJhbChhc3QudmFsdWUsIHR5cGUsIHRoaXMuY29udmVydFNvdXJjZVNwYW4oYXN0LnNwYW4pKSk7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLl9nZXRMb2NhbCA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0aGlzLl9sb2NhbFJlc29sdmVyLmdldExvY2FsKG5hbWUpOyB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICBpZiAoYXN0LnJlY2VpdmVyIGluc3RhbmNlb2YgSW1wbGljaXRSZWNlaXZlciAmJiBhc3QubmFtZSA9PSAnJGFueScpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gdGhpcy52aXNpdEFsbChhc3QuYXJncywgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2FsbCB0byAkYW55LCBleHBlY3RlZCAxIGFyZ3VtZW50IGJ1dCByZWNlaXZlZCBcIiArIChhcmdzLmxlbmd0aCB8fCAnbm9uZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmdzWzBdLmNhc3QoRFlOQU1JQ19UWVBFLCB0aGlzLmNvbnZlcnRTb3VyY2VTcGFuKGFzdC5zcGFuKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlZnRNb3N0U2FmZSA9IHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpO1xuICAgICAgICBpZiAobGVmdE1vc3RTYWZlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2FmZUFjY2Vzcyhhc3QsIGxlZnRNb3N0U2FmZSwgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdmFyIHByZXZVc2VzSW1wbGljaXRSZWNlaXZlciA9IHRoaXMudXNlc0ltcGxpY2l0UmVjZWl2ZXI7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciByZWNlaXZlciA9IHRoaXMuX3Zpc2l0KGFzdC5yZWNlaXZlciwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT09IHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFyRXhwciA9IHRoaXMuX2dldExvY2FsKGFzdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodmFyRXhwcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBcInVzZXNJbXBsaWNpdFJlY2VpdmVyXCIgc3RhdGUgc2luY2UgdGhlIGltcGxpY2l0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSByZXNvbHZlZCBsb2NhbCBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXNJbXBsaWNpdFJlY2VpdmVyID0gcHJldlVzZXNJbXBsaWNpdFJlY2VpdmVyO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YXJFeHByLmNhbGxGbihhcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5jYWxsTWV0aG9kKGFzdC5uYW1lLCBhcmdzLCB0aGlzLmNvbnZlcnRTb3VyY2VTcGFuKGFzdC5zcGFuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFByZWZpeE5vdCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIG5vdCh0aGlzLl92aXNpdChhc3QuZXhwcmVzc2lvbiwgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXROb25OdWxsQXNzZXJ0ID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICByZXR1cm4gY29udmVydFRvU3RhdGVtZW50SWZOZWVkZWQobW9kZSwgYXNzZXJ0Tm90TnVsbCh0aGlzLl92aXNpdChhc3QuZXhwcmVzc2lvbiwgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVJlYWQgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgIHZhciBsZWZ0TW9zdFNhZmUgPSB0aGlzLmxlZnRNb3N0U2FmZU5vZGUoYXN0KTtcbiAgICAgICAgaWYgKGxlZnRNb3N0U2FmZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNhZmVBY2Nlc3MoYXN0LCBsZWZ0TW9zdFNhZmUsIG1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICB2YXIgcHJldlVzZXNJbXBsaWNpdFJlY2VpdmVyID0gdGhpcy51c2VzSW1wbGljaXRSZWNlaXZlcjtcbiAgICAgICAgICAgIHZhciByZWNlaXZlciA9IHRoaXMuX3Zpc2l0KGFzdC5yZWNlaXZlciwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAocmVjZWl2ZXIgPT09IHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLl9nZXRMb2NhbChhc3QubmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBcInVzZXNJbXBsaWNpdFJlY2VpdmVyXCIgc3RhdGUgc2luY2UgdGhlIGltcGxpY2l0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSByZXNvbHZlZCBsb2NhbCBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXNJbXBsaWNpdFJlY2VpdmVyID0gcHJldlVzZXNJbXBsaWNpdFJlY2VpdmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlY2VpdmVyLnByb3AoYXN0Lm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVdyaXRlID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSB0aGlzLl92aXNpdChhc3QucmVjZWl2ZXIsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICB2YXIgcHJldlVzZXNJbXBsaWNpdFJlY2VpdmVyID0gdGhpcy51c2VzSW1wbGljaXRSZWNlaXZlcjtcbiAgICAgICAgdmFyIHZhckV4cHIgPSBudWxsO1xuICAgICAgICBpZiAocmVjZWl2ZXIgPT09IHRoaXMuX2ltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbEV4cHIgPSB0aGlzLl9nZXRMb2NhbChhc3QubmFtZSk7XG4gICAgICAgICAgICBpZiAobG9jYWxFeHByKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsRXhwciBpbnN0YW5jZW9mIFJlYWRQcm9wRXhwcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbG9jYWwgdmFyaWFibGUgaXMgYSBwcm9wZXJ0eSByZWFkIGV4cHJlc3Npb24sIGl0J3MgYSByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYSAnY29udGV4dC5wcm9wZXJ0eScgdmFsdWUgYW5kIHdpbGwgYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICB2YXJFeHByID0gbG9jYWxFeHByO1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyBcInVzZXNJbXBsaWNpdFJlY2VpdmVyXCIgc3RhdGUgc2luY2UgdGhlIGltcGxpY2l0XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY2VpdmVyIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSByZXNvbHZlZCBsb2NhbCBleHByZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXNJbXBsaWNpdFJlY2VpdmVyID0gcHJldlVzZXNJbXBsaWNpdFJlY2VpdmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgYW4gZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFzc2lnbiB0byBhIHJlZmVyZW5jZSBvciB2YXJpYWJsZSEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm8gbG9jYWwgZXhwcmVzc2lvbiBjb3VsZCBiZSBwcm9kdWNlZCwgdXNlIHRoZSBvcmlnaW5hbCByZWNlaXZlcidzXG4gICAgICAgIC8vIHByb3BlcnR5IGFzIHRoZSB0YXJnZXQuXG4gICAgICAgIGlmICh2YXJFeHByID09PSBudWxsKSB7XG4gICAgICAgICAgICB2YXJFeHByID0gcmVjZWl2ZXIucHJvcChhc3QubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIHZhckV4cHIuc2V0KHRoaXMuX3Zpc2l0KGFzdC52YWx1ZSwgX01vZGUuRXhwcmVzc2lvbikpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRTYWZlUHJvcGVydHlSZWFkID0gZnVuY3Rpb24gKGFzdCwgbW9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0U2FmZUFjY2Vzcyhhc3QsIHRoaXMubGVmdE1vc3RTYWZlTm9kZShhc3QpLCBtb2RlKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRTYWZlTWV0aG9kQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFNhZmVBY2Nlc3MoYXN0LCB0aGlzLmxlZnRNb3N0U2FmZU5vZGUoYXN0KSwgbW9kZSk7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLnZpc2l0QWxsID0gZnVuY3Rpb24gKGFzdHMsIG1vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGFzdHMubWFwKGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIF90aGlzLl92aXNpdChhc3QsIG1vZGUpOyB9KTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUudmlzaXRRdW90ZSA9IGZ1bmN0aW9uIChhc3QsIG1vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVvdGVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBldmFsdWF0aW9uIVxcbiAgICAgICAgU3RhdGVtZW50OiBcIiArIGFzdC51bmludGVycHJldGVkRXhwcmVzc2lvbiArIFwiIGxvY2F0ZWQgYXQgXCIgKyBhc3QubG9jYXRpb24pO1xuICAgIH07XG4gICAgX0FzdFRvSXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXQgPSBmdW5jdGlvbiAoYXN0LCBtb2RlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9yZXN1bHRNYXAuZ2V0KGFzdCk7XG4gICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICByZXR1cm4gKHRoaXMuX25vZGVNYXAuZ2V0KGFzdCkgfHwgYXN0KS52aXNpdCh0aGlzLCBtb2RlKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUuY29udmVydFNhZmVBY2Nlc3MgPSBmdW5jdGlvbiAoYXN0LCBsZWZ0TW9zdFNhZmUsIG1vZGUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGV4cHJlc3Npb24gY29udGFpbnMgYSBzYWZlIGFjY2VzcyBub2RlIG9uIHRoZSBsZWZ0IGl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0b1xuICAgICAgICAvLyBhbiBleHByZXNzaW9uIHRoYXQgZ3VhcmRzIHRoZSBhY2Nlc3MgdG8gdGhlIG1lbWJlciBieSBjaGVja2luZyB0aGUgcmVjZWl2ZXIgZm9yIGJsYW5rLiBBc1xuICAgICAgICAvLyBleGVjdXRpb24gcHJvY2VlZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0aGUgbGVmdCBtb3N0IHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gbXVzdCBiZSBndWFyZGVkXG4gICAgICAgIC8vIGZpcnN0IGJ1dCwgYmVjYXVzZSBtZW1iZXIgYWNjZXNzIGlzIGxlZnQgYXNzb2NpYXRpdmUsIHRoZSByaWdodCBzaWRlIG9mIHRoZSBleHByZXNzaW9uIGlzIGF0XG4gICAgICAgIC8vIHRoZSB0b3Agb2YgdGhlIEFTVC4gVGhlIGRlc2lyZWQgcmVzdWx0IHJlcXVpcmVzIGxpZnRpbmcgYSBjb3B5IG9mIHRoZSB0aGUgbGVmdCBwYXJ0IG9mIHRoZVxuICAgICAgICAvLyBleHByZXNzaW9uIHVwIHRvIHRlc3QgaXQgZm9yIGJsYW5rIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSB1bmd1YXJkZWQgdmVyc2lvbi5cbiAgICAgICAgLy8gQ29uc2lkZXIsIGZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbjogYT8uYi5jPy5kLmVcbiAgICAgICAgLy8gVGhpcyByZXN1bHRzIGluIHRoZSBhc3Q6XG4gICAgICAgIC8vICAgICAgICAgLlxuICAgICAgICAvLyAgICAgICAgLyBcXFxuICAgICAgICAvLyAgICAgICA/LiAgIGVcbiAgICAgICAgLy8gICAgICAvICBcXFxuICAgICAgICAvLyAgICAgLiAgICBkXG4gICAgICAgIC8vICAgIC8gXFxcbiAgICAgICAgLy8gICA/LiAgY1xuICAgICAgICAvLyAgLyAgXFxcbiAgICAgICAgLy8gYSAgICBiXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdHJlZSBzaG91bGQgYmUgZ2VuZXJhdGVkOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgLy0tLS0gPyAtLS0tXFxcbiAgICAgICAgLy8gICAgICAgLyAgICAgIHwgICAgICBcXFxuICAgICAgICAvLyAgICAgYSAgIC8tLS0gPyAtLS1cXCAgbnVsbFxuICAgICAgICAvLyAgICAgICAgLyAgICAgfCAgICAgXFxcbiAgICAgICAgLy8gICAgICAgLiAgICAgIC4gICAgIG51bGxcbiAgICAgICAgLy8gICAgICAvIFxcICAgIC8gXFxcbiAgICAgICAgLy8gICAgIC4gIGMgICAuICAgZVxuICAgICAgICAvLyAgICAvIFxcICAgIC8gXFxcbiAgICAgICAgLy8gICBhICAgYiAgLiAgIGRcbiAgICAgICAgLy8gICAgICAgICAvIFxcXG4gICAgICAgIC8vICAgICAgICAuICAgY1xuICAgICAgICAvLyAgICAgICAvIFxcXG4gICAgICAgIC8vICAgICAgYSAgIGJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90aWNlIHRoYXQgdGhlIGZpcnN0IGd1YXJkIGNvbmRpdGlvbiBpcyB0aGUgbGVmdCBoYW5kIG9mIHRoZSBsZWZ0IG1vc3Qgc2FmZSBhY2Nlc3Mgbm9kZVxuICAgICAgICAvLyB3aGljaCBjb21lcyBpbiBhcyBsZWZ0TW9zdFNhZmUgdG8gdGhpcyByb3V0aW5lLlxuICAgICAgICB2YXIgZ3VhcmRlZEV4cHJlc3Npb24gPSB0aGlzLl92aXNpdChsZWZ0TW9zdFNhZmUucmVjZWl2ZXIsIF9Nb2RlLkV4cHJlc3Npb24pO1xuICAgICAgICB2YXIgdGVtcG9yYXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5uZWVkc1RlbXBvcmFyeShsZWZ0TW9zdFNhZmUucmVjZWl2ZXIpKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZXhwcmVzc2lvbiBoYXMgbWV0aG9kIGNhbGxzIG9yIHBpcGVzIHRoZW4gd2UgbmVlZCB0byBzYXZlIHRoZSByZXN1bHQgaW50byBhXG4gICAgICAgICAgICAvLyB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gYXZvaWQgY2FsbGluZyBzdGF0ZWZ1bCBvciBpbXB1cmUgY29kZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgICAgICAgIHRlbXBvcmFyeSA9IHRoaXMuYWxsb2NhdGVUZW1wb3JhcnkoKTtcbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHRoZSByZXN1bHQgaW4gdGhlIHRlbXBvcmFyeSB2YXJpYWJsZVxuICAgICAgICAgICAgZ3VhcmRlZEV4cHJlc3Npb24gPSB0ZW1wb3Jhcnkuc2V0KGd1YXJkZWRFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIC8vIEVuc3VyZSBhbGwgZnVydGhlciByZWZlcmVuY2VzIHRvIHRoZSBndWFyZGVkIGV4cHJlc3Npb24gcmVmZXIgdG8gdGhlIHRlbXBvcmFyeSBpbnN0ZWFkLlxuICAgICAgICAgICAgdGhpcy5fcmVzdWx0TWFwLnNldChsZWZ0TW9zdFNhZmUucmVjZWl2ZXIsIHRlbXBvcmFyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbmRpdGlvbiA9IGd1YXJkZWRFeHByZXNzaW9uLmlzQmxhbmsoKTtcbiAgICAgICAgLy8gQ29udmVydCB0aGUgYXN0IHRvIGFuIHVuZ3VhcmRlZCBhY2Nlc3MgdG8gdGhlIHJlY2VpdmVyJ3MgbWVtYmVyLiBUaGUgbWFwIHdpbGwgc3Vic3RpdHV0ZVxuICAgICAgICAvLyBsZWZ0TW9zdE5vZGUgd2l0aCBpdHMgdW5ndWFyZGVkIHZlcnNpb24gaW4gdGhlIGNhbGwgdG8gYHRoaXMudmlzaXQoKWAuXG4gICAgICAgIGlmIChsZWZ0TW9zdFNhZmUgaW5zdGFuY2VvZiBTYWZlTWV0aG9kQ2FsbCkge1xuICAgICAgICAgICAgdGhpcy5fbm9kZU1hcC5zZXQobGVmdE1vc3RTYWZlLCBuZXcgTWV0aG9kQ2FsbChsZWZ0TW9zdFNhZmUuc3BhbiwgbGVmdE1vc3RTYWZlLnJlY2VpdmVyLCBsZWZ0TW9zdFNhZmUubmFtZSwgbGVmdE1vc3RTYWZlLmFyZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX25vZGVNYXAuc2V0KGxlZnRNb3N0U2FmZSwgbmV3IFByb3BlcnR5UmVhZChsZWZ0TW9zdFNhZmUuc3BhbiwgbGVmdE1vc3RTYWZlLnJlY2VpdmVyLCBsZWZ0TW9zdFNhZmUubmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdGhlIG5vZGUgbm93IHdpdGhvdXQgdGhlIGd1YXJkZWQgbWVtYmVyIGFjY2Vzcy5cbiAgICAgICAgdmFyIGFjY2VzcyA9IHRoaXMuX3Zpc2l0KGFzdCwgX01vZGUuRXhwcmVzc2lvbik7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbWFwcGluZy4gVGhpcyBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgYXMgdGhlIGNvbnZlcnRlciBvbmx5IHRyYXZlcnNlcyBlYWNoIG5vZGVcbiAgICAgICAgLy8gb25jZSBidXQgaXMgc2FmZXIgaWYgdGhlIGNvbnZlcnNpb24gaXMgY2hhbmdlZCB0byB0cmF2ZXJzZSB0aGUgbm9kZXMgbW9yZSB0aGFuIG9uY2UuXG4gICAgICAgIHRoaXMuX25vZGVNYXAuZGVsZXRlKGxlZnRNb3N0U2FmZSk7XG4gICAgICAgIC8vIElmIHdlIGFsbG9jYXRlZCBhIHRlbXBvcmFyeSwgcmVsZWFzZSBpdC5cbiAgICAgICAgaWYgKHRlbXBvcmFyeSkge1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlVGVtcG9yYXJ5KHRlbXBvcmFyeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJvZHVjZSB0aGUgY29uZGl0aW9uYWxcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1N0YXRlbWVudElmTmVlZGVkKG1vZGUsIGNvbmRpdGlvbi5jb25kaXRpb25hbChsaXRlcmFsKG51bGwpLCBhY2Nlc3MpKTtcbiAgICB9O1xuICAgIC8vIEdpdmVuIGEgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBhPy5iLmM/LmQuZSB0aGUgdGhlIGxlZnQgbW9zdCBzYWZlIG5vZGUgaXNcbiAgICAvLyB0aGUgKGE/LmIpLiBUaGUgLiBhbmQgPy4gYXJlIGxlZnQgYXNzb2NpYXRpdmUgdGh1cyBjYW4gYmUgcmV3cml0dGVuIGFzOlxuICAgIC8vICgoKChhPy5jKS5iKS5jKT8uZCkuZS4gVGhpcyByZXR1cm5zIHRoZSBtb3N0IGRlZXBseSBuZXN0ZWQgc2FmZSByZWFkIG9yXG4gICAgLy8gc2FmZSBtZXRob2QgY2FsbCBhcyB0aGlzIG5lZWRzIGJlIHRyYW5zZm9ybSBpbml0aWFsbHkgdG86XG4gICAgLy8gICBhID09IG51bGwgPyBudWxsIDogYS5jLmIuYz8uZC5lXG4gICAgLy8gdGhlbiB0bzpcbiAgICAvLyAgIGEgPT0gbnVsbCA/IG51bGwgOiBhLmIuYyA9PSBudWxsID8gbnVsbCA6IGEuYi5jLmQuZVxuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUubGVmdE1vc3RTYWZlTm9kZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGFzdCkge1xuICAgICAgICAgICAgcmV0dXJuIChfdGhpcy5fbm9kZU1hcC5nZXQoYXN0KSB8fCBhc3QpLnZpc2l0KHZpc2l0b3IpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gYXN0LnZpc2l0KHtcbiAgICAgICAgICAgIHZpc2l0QmluYXJ5OiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgdmlzaXRDaGFpbjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0Q29uZGl0aW9uYWw6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICB2aXNpdEZ1bmN0aW9uQ2FsbDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0SW1wbGljaXRSZWNlaXZlcjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0S2V5ZWRSZWFkOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3Qub2JqKTsgfSxcbiAgICAgICAgICAgIHZpc2l0S2V5ZWRXcml0ZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0TGl0ZXJhbEFycmF5OiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgdmlzaXRMaXRlcmFsTWFwOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgdmlzaXRMaXRlcmFsUHJpbWl0aXZlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgdmlzaXRNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpOyB9LFxuICAgICAgICAgICAgdmlzaXRQaXBlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICAgICAgdmlzaXRQcmVmaXhOb3Q6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICB2aXNpdE5vbk51bGxBc3NlcnQ6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICB2aXNpdFByb3BlcnR5UmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXQodGhpcywgYXN0LnJlY2VpdmVyKTsgfSxcbiAgICAgICAgICAgIHZpc2l0UHJvcGVydHlXcml0ZTogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgICAgIHZpc2l0UXVvdGU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgICAgICB2aXNpdFNhZmVNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpIHx8IGFzdDsgfSxcbiAgICAgICAgICAgIHZpc2l0U2FmZVByb3BlcnR5UmVhZDogZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdCh0aGlzLCBhc3QucmVjZWl2ZXIpIHx8IGFzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBSZXR1cm5zIHRydWUgb2YgdGhlIEFTVCBpbmNsdWRlcyBhIG1ldGhvZCBvciBhIHBpcGUgaW5kaWNhdGluZyB0aGF0LCBpZiB0aGVcbiAgICAvLyBleHByZXNzaW9uIGlzIHVzZWQgYXMgdGhlIHRhcmdldCBvZiBhIHNhZmUgcHJvcGVydHkgb3IgbWV0aG9kIGFjY2VzcyB0aGVuXG4gICAgLy8gdGhlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHN0b3JlZCBpbnRvIGEgdGVtcG9yYXJ5IHZhcmlhYmxlLlxuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUubmVlZHNUZW1wb3JhcnkgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciB2aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3QgJiYgKF90aGlzLl9ub2RlTWFwLmdldChhc3QpIHx8IGFzdCkudmlzaXQodmlzaXRvcik7XG4gICAgICAgIH07XG4gICAgICAgIHZhciB2aXNpdFNvbWUgPSBmdW5jdGlvbiAodmlzaXRvciwgYXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gYXN0LnNvbWUoZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXQodmlzaXRvciwgYXN0KTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBhc3QudmlzaXQoe1xuICAgICAgICAgICAgdmlzaXRCaW5hcnk6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHZpc2l0KHRoaXMsIGFzdC5sZWZ0KSB8fCB2aXNpdCh0aGlzLCBhc3QucmlnaHQpOyB9LFxuICAgICAgICAgICAgdmlzaXRDaGFpbjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICB2aXNpdENvbmRpdGlvbmFsOiBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0KHRoaXMsIGFzdC5jb25kaXRpb24pIHx8IHZpc2l0KHRoaXMsIGFzdC50cnVlRXhwKSB8fFxuICAgICAgICAgICAgICAgICAgICB2aXNpdCh0aGlzLCBhc3QuZmFsc2VFeHApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2l0RnVuY3Rpb25DYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICAgICAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgICAgIHZpc2l0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXRTb21lKHRoaXMsIGFzdC5leHByZXNzaW9ucyk7IH0sXG4gICAgICAgICAgICB2aXNpdEtleWVkUmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgICAgICB2aXNpdEtleWVkV3JpdGU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgdmlzaXRMaXRlcmFsQXJyYXk6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgICAgICB2aXNpdExpdGVyYWxNYXA6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgICAgICB2aXNpdExpdGVyYWxQcmltaXRpdmU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgdmlzaXRNZXRob2RDYWxsOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICAgICAgdmlzaXRQaXBlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICAgICAgdmlzaXRQcmVmaXhOb3Q6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIHZpc2l0KHRoaXMsIGFzdC5leHByZXNzaW9uKTsgfSxcbiAgICAgICAgICAgIHZpc2l0Tm9uTnVsbEFzc2VydDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXQodGhpcywgYXN0LmV4cHJlc3Npb24pOyB9LFxuICAgICAgICAgICAgdmlzaXRQcm9wZXJ0eVJlYWQ6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgdmlzaXRQcm9wZXJ0eVdyaXRlOiBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgICAgIHZpc2l0UXVvdGU6IGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGZhbHNlOyB9LFxuICAgICAgICAgICAgdmlzaXRTYWZlTWV0aG9kQ2FsbDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdHJ1ZTsgfSxcbiAgICAgICAgICAgIHZpc2l0U2FmZVByb3BlcnR5UmVhZDogZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLmFsbG9jYXRlVGVtcG9yYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGVtcE51bWJlciA9IHRoaXMuX2N1cnJlbnRUZW1wb3JhcnkrKztcbiAgICAgICAgdGhpcy50ZW1wb3JhcnlDb3VudCA9IE1hdGgubWF4KHRoaXMuX2N1cnJlbnRUZW1wb3JhcnksIHRoaXMudGVtcG9yYXJ5Q291bnQpO1xuICAgICAgICByZXR1cm4gbmV3IFJlYWRWYXJFeHByKHRlbXBvcmFyeU5hbWUodGhpcy5iaW5kaW5nSWQsIHRlbXBOdW1iZXIpKTtcbiAgICB9O1xuICAgIF9Bc3RUb0lyVmlzaXRvci5wcm90b3R5cGUucmVsZWFzZVRlbXBvcmFyeSA9IGZ1bmN0aW9uICh0ZW1wb3JhcnkpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRlbXBvcmFyeS0tO1xuICAgICAgICBpZiAodGVtcG9yYXJ5Lm5hbWUgIT0gdGVtcG9yYXJ5TmFtZSh0aGlzLmJpbmRpbmdJZCwgdGhpcy5fY3VycmVudFRlbXBvcmFyeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRlbXBvcmFyeSBcIiArIHRlbXBvcmFyeS5uYW1lICsgXCIgcmVsZWFzZWQgb3V0IG9mIG9yZGVyXCIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFic29sdXRlIGBQYXJzZVNvdXJjZVNwYW5gIGZyb20gdGhlIHJlbGF0aXZlIGBQYXJzZVNwYW5gLlxuICAgICAqXG4gICAgICogYFBhcnNlU3BhbmAgb2JqZWN0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZXNlIHRvIGZ1bGwgYFBhcnNlU291cmNlU3BhbmAgb2JqZWN0cyB0aGF0XG4gICAgICogc2hvdyB3aGVyZSB0aGUgc3BhbiBpcyB3aXRoaW4gdGhlIG92ZXJhbGwgc291cmNlIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3BhbiB0aGUgcmVsYXRpdmUgc3BhbiB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIGEgYFBhcnNlU291cmNlU3BhbmAgZm9yIHRoZSB0aGUgZ2l2ZW4gc3BhbiBvciBudWxsIGlmIG5vXG4gICAgICogYGJhc2VTb3VyY2VTcGFuYCB3YXMgcHJvdmlkZWQgdG8gdGhpcyBjbGFzcy5cbiAgICAgKi9cbiAgICBfQXN0VG9JclZpc2l0b3IucHJvdG90eXBlLmNvbnZlcnRTb3VyY2VTcGFuID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVNvdXJjZVNwYW4pIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuYmFzZVNvdXJjZVNwYW4uc3RhcnQubW92ZUJ5KHNwYW4uc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGVuZCA9IHRoaXMuYmFzZVNvdXJjZVNwYW4uc3RhcnQubW92ZUJ5KHNwYW4uZW5kKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfQXN0VG9JclZpc2l0b3I7XG59KCkpO1xuZnVuY3Rpb24gZmxhdHRlblN0YXRlbWVudHMoYXJnLCBvdXRwdXQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgIGFyZy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZmxhdHRlblN0YXRlbWVudHMoZW50cnksIG91dHB1dCk7IH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2goYXJnKTtcbiAgICB9XG59XG52YXIgRGVmYXVsdExvY2FsUmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmYXVsdExvY2FsUmVzb2x2ZXIoKSB7XG4gICAgfVxuICAgIERlZmF1bHRMb2NhbFJlc29sdmVyLnByb3RvdHlwZS5ub3RpZnlJbXBsaWNpdFJlY2VpdmVyVXNlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIERlZmF1bHRMb2NhbFJlc29sdmVyLnByb3RvdHlwZS5nZXRMb2NhbCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmIChuYW1lID09PSBFdmVudEhhbmRsZXJWYXJzLmV2ZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBFdmVudEhhbmRsZXJWYXJzLmV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmF1bHRMb2NhbFJlc29sdmVyO1xufSgpKTtcbmZ1bmN0aW9uIGNyZWF0ZUN1cnJWYWx1ZUV4cHIoYmluZGluZ0lkKSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlKFwiY3VyclZhbF9cIiArIGJpbmRpbmdJZCk7IC8vIGZpeCBzeW50YXggaGlnaGxpZ2h0aW5nOiBgXG59XG5mdW5jdGlvbiBjcmVhdGVQcmV2ZW50RGVmYXVsdFZhcihiaW5kaW5nSWQpIHtcbiAgICByZXR1cm4gdmFyaWFibGUoXCJwZF9cIiArIGJpbmRpbmdJZCk7XG59XG5mdW5jdGlvbiBjb252ZXJ0U3RtdEludG9FeHByZXNzaW9uKHN0bXQpIHtcbiAgICBpZiAoc3RtdCBpbnN0YW5jZW9mIEV4cHJlc3Npb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQuZXhwcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoc3RtdCBpbnN0YW5jZW9mIFJldHVyblN0YXRlbWVudCkge1xuICAgICAgICByZXR1cm4gc3RtdC52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG52YXIgQnVpbHRpbkZ1bmN0aW9uQ2FsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQnVpbHRpbkZ1bmN0aW9uQ2FsbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCdWlsdGluRnVuY3Rpb25DYWxsKHNwYW4sIGFyZ3MsIGNvbnZlcnRlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBudWxsLCBhcmdzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgX3RoaXMuY29udmVydGVyID0gY29udmVydGVyO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBCdWlsdGluRnVuY3Rpb25DYWxsO1xufShGdW5jdGlvbkNhbGwpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGlzIGZpbGUgaXMgYSBwb3J0IG9mIHNoYWRvd0NTUyBmcm9tIHdlYmNvbXBvbmVudHMuanMgdG8gVHlwZVNjcmlwdC5cbiAqXG4gKiBQbGVhc2UgbWFrZSBzdXJlIHRvIGtlZXAgdG8gZWRpdHMgaW4gc3luYyB3aXRoIHRoZSBzb3VyY2UgZmlsZS5cbiAqXG4gKiBTb3VyY2U6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanMvYmxvYi80ZWZlY2Q3ZTBlL3NyYy9TaGFkb3dDU1MvU2hhZG93Q1NTLmpzXG4gKlxuICogVGhlIG9yaWdpbmFsIGZpbGUgbGV2ZWwgY29tbWVudCBpcyByZXByb2R1Y2VkIGJlbG93XG4gKi9cbi8qXG4gIFRoaXMgaXMgYSBsaW1pdGVkIHNoaW0gZm9yIFNoYWRvd0RPTSBjc3Mgc3R5bGluZy5cbiAgaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy93ZWJjb21wb25lbnRzL3Jhdy1maWxlL3RpcC9zcGVjL3NoYWRvdy9pbmRleC5odG1sI3N0eWxlc1xuXG4gIFRoZSBpbnRlbnRpb24gaGVyZSBpcyB0byBzdXBwb3J0IG9ubHkgdGhlIHN0eWxpbmcgZmVhdHVyZXMgd2hpY2ggY2FuIGJlXG4gIHJlbGF0aXZlbHkgc2ltcGx5IGltcGxlbWVudGVkLiBUaGUgZ29hbCBpcyB0byBhbGxvdyB1c2VycyB0byBhdm9pZCB0aGVcbiAgbW9zdCBvYnZpb3VzIHBpdGZhbGxzIGFuZCBkbyBzbyB3aXRob3V0IGNvbXByb21pc2luZyBwZXJmb3JtYW5jZSBzaWduaWZpY2FudGx5LlxuICBGb3IgU2hhZG93RE9NIHN0eWxpbmcgdGhhdCdzIG5vdCBjb3ZlcmVkIGhlcmUsIGEgc2V0IG9mIGJlc3QgcHJhY3RpY2VzXG4gIGNhbiBiZSBwcm92aWRlZCB0aGF0IHNob3VsZCBhbGxvdyB1c2VycyB0byBhY2NvbXBsaXNoIG1vcmUgY29tcGxleCBzdHlsaW5nLlxuXG4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHNwZWNpZmljIFNoYWRvd0RPTSBzdHlsaW5nIGZlYXR1cmVzIGFuZCBhIGJyaWVmXG4gIGRpc2N1c3Npb24gb2YgdGhlIGFwcHJvYWNoIHVzZWQgdG8gc2hpbS5cblxuICBTaGltbWVkIGZlYXR1cmVzOlxuXG4gICogOmhvc3QsIDpob3N0LWNvbnRleHQ6IFNoYWRvd0RPTSBhbGxvd3Mgc3R5bGluZyBvZiB0aGUgc2hhZG93Um9vdCdzIGhvc3RcbiAgZWxlbWVudCB1c2luZyB0aGUgOmhvc3QgcnVsZS4gVG8gc2hpbSB0aGlzIGZlYXR1cmUsIHRoZSA6aG9zdCBzdHlsZXMgYXJlXG4gIHJlZm9ybWF0dGVkIGFuZCBwcmVmaXhlZCB3aXRoIGEgZ2l2ZW4gc2NvcGUgbmFtZSBhbmQgcHJvbW90ZWQgdG8gYVxuICBkb2N1bWVudCBsZXZlbCBzdHlsZXNoZWV0LlxuICBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBzY29wZSBuYW1lIG9mIC5mb28sIGEgcnVsZSBsaWtlIHRoaXM6XG5cbiAgICA6aG9zdCB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgYmVjb21lczpcblxuICAgIC5mb28ge1xuICAgICAgYmFja2dyb3VuZDogcmVkO1xuICAgIH1cblxuICAqIGVuY2Fwc3VsYXRpb246IFN0eWxlcyBkZWZpbmVkIHdpdGhpbiBTaGFkb3dET00sIGFwcGx5IG9ubHkgdG9cbiAgZG9tIGluc2lkZSB0aGUgU2hhZG93RE9NLiBQb2x5bWVyIHVzZXMgb25lIG9mIHR3byB0ZWNobmlxdWVzIHRvIGltcGxlbWVudFxuICB0aGlzIGZlYXR1cmUuXG5cbiAgQnkgZGVmYXVsdCwgcnVsZXMgYXJlIHByZWZpeGVkIHdpdGggdGhlIGhvc3QgZWxlbWVudCB0YWcgbmFtZVxuICBhcyBhIGRlc2NlbmRhbnQgc2VsZWN0b3IuIFRoaXMgZW5zdXJlcyBzdHlsaW5nIGRvZXMgbm90IGxlYWsgb3V0IG9mIHRoZSAndG9wJ1xuICBvZiB0aGUgZWxlbWVudCdzIFNoYWRvd0RPTS4gRm9yIGV4YW1wbGUsXG5cbiAgZGl2IHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIH1cblxuICBiZWNvbWVzOlxuXG4gIHgtZm9vIGRpdiB7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB9XG5cbiAgYmVjb21lczpcblxuXG4gIEFsdGVybmF0aXZlbHksIGlmIFdlYkNvbXBvbmVudHMuU2hhZG93Q1NTLnN0cmljdFN0eWxpbmcgaXMgc2V0IHRvIHRydWUgdGhlblxuICBzZWxlY3RvcnMgYXJlIHNjb3BlZCBieSBhZGRpbmcgYW4gYXR0cmlidXRlIHNlbGVjdG9yIHN1ZmZpeCB0byBlYWNoXG4gIHNpbXBsZSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHRoZSBob3N0IGVsZW1lbnQgdGFnIG5hbWUuIEVhY2ggZWxlbWVudFxuICBpbiB0aGUgZWxlbWVudCdzIFNoYWRvd0RPTSB0ZW1wbGF0ZSBpcyBhbHNvIGdpdmVuIHRoZSBzY29wZSBhdHRyaWJ1dGUuXG4gIFRodXMsIHRoZXNlIHJ1bGVzIG1hdGNoIG9ubHkgZWxlbWVudHMgdGhhdCBoYXZlIHRoZSBzY29wZSBhdHRyaWJ1dGUuXG4gIEZvciBleGFtcGxlLCBnaXZlbiBhIHNjb3BlIG5hbWUgb2YgeC1mb28sIGEgcnVsZSBsaWtlIHRoaXM6XG5cbiAgICBkaXYge1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuXG4gIGJlY29tZXM6XG5cbiAgICBkaXZbeC1mb29dIHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIH1cblxuICBOb3RlIHRoYXQgZWxlbWVudHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgYWRkZWQgdG8gYSBzY29wZSBtdXN0IGhhdmUgdGhlIHNjb3BlXG4gIHNlbGVjdG9yIGFkZGVkIHRvIHRoZW0gbWFudWFsbHkuXG5cbiAgKiB1cHBlci9sb3dlciBib3VuZCBlbmNhcHN1bGF0aW9uOiBTdHlsZXMgd2hpY2ggYXJlIGRlZmluZWQgb3V0c2lkZSBhXG4gIHNoYWRvd1Jvb3Qgc2hvdWxkIG5vdCBjcm9zcyB0aGUgU2hhZG93RE9NIGJvdW5kYXJ5IGFuZCBzaG91bGQgbm90IGFwcGx5XG4gIGluc2lkZSBhIHNoYWRvd1Jvb3QuXG5cbiAgVGhpcyBzdHlsaW5nIGJlaGF2aW9yIGlzIG5vdCBlbXVsYXRlZC4gU29tZSBwb3NzaWJsZSB3YXlzIHRvIGRvIHRoaXMgdGhhdFxuICB3ZXJlIHJlamVjdGVkIGR1ZSB0byBjb21wbGV4aXR5IGFuZC9vciBwZXJmb3JtYW5jZSBjb25jZXJucyBpbmNsdWRlOiAoMSkgcmVzZXRcbiAgZXZlcnkgcG9zc2libGUgcHJvcGVydHkgZm9yIGV2ZXJ5IHBvc3NpYmxlIHNlbGVjdG9yIGZvciBhIGdpdmVuIHNjb3BlIG5hbWU7XG4gICgyKSByZS1pbXBsZW1lbnQgY3NzIGluIGphdmFzY3JpcHQuXG5cbiAgQXMgYW4gYWx0ZXJuYXRpdmUsIHVzZXJzIHNob3VsZCBtYWtlIHN1cmUgdG8gdXNlIHNlbGVjdG9yc1xuICBzcGVjaWZpYyB0byB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgd29ya2luZy5cblxuICAqIDo6ZGlzdHJpYnV0ZWQ6IFRoaXMgYmVoYXZpb3IgaXMgbm90IGVtdWxhdGVkLiBJdCdzIG9mdGVuIG5vdCBuZWNlc3NhcnlcbiAgdG8gc3R5bGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgaW5zZXJ0aW9uIHBvaW50IGFuZCBpbnN0ZWFkLCBkZXNjZW5kYW50c1xuICBvZiB0aGUgaG9zdCBlbGVtZW50IGNhbiBiZSBzdHlsZWQgc2VsZWN0aXZlbHkuIFVzZXJzIGNhbiBhbHNvIGNyZWF0ZSBhblxuICBleHRyYSBub2RlIGFyb3VuZCBhbiBpbnNlcnRpb24gcG9pbnQgYW5kIHN0eWxlIHRoYXQgbm9kZSdzIGNvbnRlbnRzXG4gIHZpYSBkZXNjZW5kZW50IHNlbGVjdG9ycy4gRm9yIGV4YW1wbGUsIHdpdGggYSBzaGFkb3dSb290IGxpa2UgdGhpczpcblxuICAgIDxzdHlsZT5cbiAgICAgIDo6Y29udGVudChkaXYpIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmVkO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gICAgPGNvbnRlbnQ+PC9jb250ZW50PlxuXG4gIGNvdWxkIGJlY29tZTpcblxuICAgIDxzdHlsZT5cbiAgICAgIC8gKkBwb2x5ZmlsbCAuY29udGVudC1jb250YWluZXIgZGl2ICogL1xuICAgICAgOjpjb250ZW50KGRpdikge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jb250YWluZXJcIj5cbiAgICAgIDxjb250ZW50PjwvY29udGVudD5cbiAgICA8L2Rpdj5cblxuICBOb3RlIHRoZSB1c2Ugb2YgQHBvbHlmaWxsIGluIHRoZSBjb21tZW50IGFib3ZlIGEgU2hhZG93RE9NIHNwZWNpZmljIHN0eWxlXG4gIGRlY2xhcmF0aW9uLiBUaGlzIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBzdHlsaW5nIHNoaW0gdG8gdXNlIHRoZSBzZWxlY3RvclxuICBpbiBjb21tZW50cyBpbiBsaWV1IG9mIHRoZSBuZXh0IHNlbGVjdG9yIHdoZW4gcnVubmluZyB1bmRlciBwb2x5ZmlsbC5cbiovXG52YXIgU2hhZG93Q3NzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNoYWRvd0NzcygpIHtcbiAgICAgICAgdGhpcy5zdHJpY3RTdHlsaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLypcbiAgICAqIFNoaW0gc29tZSBjc3NUZXh0IHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yLiBSZXR1cm5zIGNzc1RleHQgdGhhdCBjYW5cbiAgICAqIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudCB2aWEgV2ViQ29tcG9uZW50cy5TaGFkb3dDU1MuYWRkQ3NzVG9Eb2N1bWVudChjc3MpLlxuICAgICpcbiAgICAqIFdoZW4gc3RyaWN0U3R5bGluZyBpcyB0cnVlOlxuICAgICogLSBzZWxlY3RvciBpcyB0aGUgYXR0cmlidXRlIGFkZGVkIHRvIGFsbCBlbGVtZW50cyBpbnNpZGUgdGhlIGhvc3QsXG4gICAgKiAtIGhvc3RTZWxlY3RvciBpcyB0aGUgYXR0cmlidXRlIGFkZGVkIHRvIHRoZSBob3N0IGl0c2VsZi5cbiAgICAqL1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuc2hpbUNzc1RleHQgPSBmdW5jdGlvbiAoY3NzVGV4dCwgc2VsZWN0b3IsIGhvc3RTZWxlY3Rvcikge1xuICAgICAgICBpZiAoaG9zdFNlbGVjdG9yID09PSB2b2lkIDApIHsgaG9zdFNlbGVjdG9yID0gJyc7IH1cbiAgICAgICAgdmFyIGNvbW1lbnRzV2l0aEhhc2ggPSBleHRyYWN0Q29tbWVudHNXaXRoSGFzaChjc3NUZXh0KTtcbiAgICAgICAgY3NzVGV4dCA9IHN0cmlwQ29tbWVudHMoY3NzVGV4dCk7XG4gICAgICAgIGNzc1RleHQgPSB0aGlzLl9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQpO1xuICAgICAgICB2YXIgc2NvcGVkQ3NzVGV4dCA9IHRoaXMuX3Njb3BlQ3NzVGV4dChjc3NUZXh0LCBzZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgICAgcmV0dXJuIF9fc3ByZWFkKFtzY29wZWRDc3NUZXh0XSwgY29tbWVudHNXaXRoSGFzaCkuam9pbignXFxuJyk7XG4gICAgfTtcbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9pbnNlcnREaXJlY3RpdmVzID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgY3NzVGV4dCA9IHRoaXMuX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dChjc3NUZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydFBvbHlmaWxsUnVsZXNJbkNzc1RleHQoY3NzVGV4dCk7XG4gICAgfTtcbiAgICAvKlxuICAgICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGNvbnZlcnQgbmF0aXZlIFNoYWRvd0RPTSBydWxlcyB0aGF0IHdpbGwgdHJpcFxuICAgICAqIHVwIHRoZSBjc3MgcGFyc2VyOyB3ZSByZWx5IG9uIGRlY29yYXRpbmcgdGhlIHN0eWxlc2hlZXQgd2l0aCBpbmVydCBydWxlcy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICAgKlxuICAgICAqIHBvbHlmaWxsLW5leHQtc2VsZWN0b3IgeyBjb250ZW50OiAnOmhvc3QgbWVudS1pdGVtJzsgfVxuICAgICAqIDo6Y29udGVudCBtZW51LWl0ZW0ge1xuICAgICAqXG4gICAgICogdG8gdGhpczpcbiAgICAgKlxuICAgICAqIHNjb3BlTmFtZSBtZW51LWl0ZW0ge1xuICAgICAqXG4gICAgKiovXG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5faW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0ID0gZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgICAgICAgLy8gRGlmZmVyZW5jZSB3aXRoIHdlYmNvbXBvbmVudHMuanM6IGRvZXMgbm90IGhhbmRsZSBjb21tZW50c1xuICAgICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKF9jc3NDb250ZW50TmV4dFNlbGVjdG9yUmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIG1bX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtWzJdICsgJ3snO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUHJvY2VzcyBzdHlsZXMgdG8gYWRkIHJ1bGVzIHdoaWNoIHdpbGwgb25seSBhcHBseSB1bmRlciB0aGUgcG9seWZpbGxcbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICAgKlxuICAgICAqIHBvbHlmaWxsLXJ1bGUge1xuICAgICAqICAgY29udGVudDogJzpob3N0IG1lbnUtaXRlbSc7XG4gICAgICogLi4uXG4gICAgICogfVxuICAgICAqXG4gICAgICogdG8gdGhpczpcbiAgICAgKlxuICAgICAqIHNjb3BlTmFtZSBtZW51LWl0ZW0gey4uLn1cbiAgICAgKlxuICAgICoqL1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2luc2VydFBvbHlmaWxsUnVsZXNJbkNzc1RleHQgPSBmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICAvLyBEaWZmZXJlbmNlIHdpdGggd2ViY29tcG9uZW50cy5qczogZG9lcyBub3QgaGFuZGxlIGNvbW1lbnRzXG4gICAgICAgIHJldHVybiBjc3NUZXh0LnJlcGxhY2UoX2Nzc0NvbnRlbnRSdWxlUmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIG1bX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBydWxlID0gbVswXS5yZXBsYWNlKG1bMV0sICcnKS5yZXBsYWNlKG1bMl0sICcnKTtcbiAgICAgICAgICAgIHJldHVybiBtWzRdICsgcnVsZTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiBFbnN1cmUgc3R5bGVzIGFyZSBzY29wZWQuIFBzZXVkby1zY29waW5nIHRha2VzIGEgcnVsZSBsaWtlOlxuICAgICAqXG4gICAgICogIC5mb28gey4uLiB9XG4gICAgICpcbiAgICAgKiAgYW5kIGNvbnZlcnRzIHRoaXMgdG9cbiAgICAgKlxuICAgICAqICBzY29wZU5hbWUgLmZvbyB7IC4uLiB9XG4gICAgKi9cbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9zY29wZUNzc1RleHQgPSBmdW5jdGlvbiAoY3NzVGV4dCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKSB7XG4gICAgICAgIHZhciB1bnNjb3BlZFJ1bGVzID0gdGhpcy5fZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0KTtcbiAgICAgICAgLy8gcmVwbGFjZSA6aG9zdCBhbmQgOmhvc3QtY29udGV4dCAtc2hhZG93Y3NzaG9zdCBhbmQgLXNoYWRvd2Nzc2hvc3QgcmVzcGVjdGl2ZWx5XG4gICAgICAgIGNzc1RleHQgPSB0aGlzLl9pbnNlcnRQb2x5ZmlsbEhvc3RJbkNzc1RleHQoY3NzVGV4dCk7XG4gICAgICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0KGNzc1RleHQpO1xuICAgICAgICBjc3NUZXh0ID0gdGhpcy5fY29udmVydENvbG9uSG9zdENvbnRleHQoY3NzVGV4dCk7XG4gICAgICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0U2hhZG93RE9NU2VsZWN0b3JzKGNzc1RleHQpO1xuICAgICAgICBpZiAoc2NvcGVTZWxlY3Rvcikge1xuICAgICAgICAgICAgY3NzVGV4dCA9IHRoaXMuX3Njb3BlU2VsZWN0b3JzKGNzc1RleHQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgY3NzVGV4dCA9IGNzc1RleHQgKyAnXFxuJyArIHVuc2NvcGVkUnVsZXM7XG4gICAgICAgIHJldHVybiBjc3NUZXh0LnRyaW0oKTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogUHJvY2VzcyBzdHlsZXMgdG8gYWRkIHJ1bGVzIHdoaWNoIHdpbGwgb25seSBhcHBseSB1bmRlciB0aGUgcG9seWZpbGxcbiAgICAgKiBhbmQgZG8gbm90IHByb2Nlc3MgdmlhIENTU09NLiAoQ1NTT00gaXMgZGVzdHJ1Y3RpdmUgdG8gcnVsZXMgb24gcmFyZVxuICAgICAqIG9jY2FzaW9ucywgZS5nLiAtd2Via2l0LWNhbGMgb24gU2FmYXJpLilcbiAgICAgKiBGb3IgZXhhbXBsZSwgd2UgY29udmVydCB0aGlzIHJ1bGU6XG4gICAgICpcbiAgICAgKiBAcG9seWZpbGwtdW5zY29wZWQtcnVsZSB7XG4gICAgICogICBjb250ZW50OiAnbWVudS1pdGVtJztcbiAgICAgKiAuLi4gfVxuICAgICAqXG4gICAgICogdG8gdGhpczpcbiAgICAgKlxuICAgICAqIG1lbnUtaXRlbSB7Li4ufVxuICAgICAqXG4gICAgKiovXG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dCA9IGZ1bmN0aW9uIChjc3NUZXh0KSB7XG4gICAgICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICAgICAgdmFyIHIgPSAnJztcbiAgICAgICAgdmFyIG07XG4gICAgICAgIF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKChtID0gX2Nzc0NvbnRlbnRVbnNjb3BlZFJ1bGVSZS5leGVjKGNzc1RleHQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHJ1bGUgPSBtWzBdLnJlcGxhY2UobVsyXSwgJycpLnJlcGxhY2UobVsxXSwgbVs0XSk7XG4gICAgICAgICAgICByICs9IHJ1bGUgKyAnXFxuXFxuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8qXG4gICAgICogY29udmVydCBhIHJ1bGUgbGlrZSA6aG9zdCguZm9vKSA+IC5iYXIgeyB9XG4gICAgICpcbiAgICAgKiB0b1xuICAgICAqXG4gICAgICogLmZvbzxzY29wZU5hbWU+ID4gLmJhclxuICAgICovXG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fY29udmVydENvbG9uSG9zdCA9IGZ1bmN0aW9uIChjc3NUZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q29sb25SdWxlKGNzc1RleHQsIF9jc3NDb2xvbkhvc3RSZSwgdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKTtcbiAgICB9O1xuICAgIC8qXG4gICAgICogY29udmVydCBhIHJ1bGUgbGlrZSA6aG9zdC1jb250ZXh0KC5mb28pID4gLmJhciB7IH1cbiAgICAgKlxuICAgICAqIHRvXG4gICAgICpcbiAgICAgKiAuZm9vPHNjb3BlTmFtZT4gPiAuYmFyLCAuZm9vIHNjb3BlTmFtZSA+IC5iYXIgeyB9XG4gICAgICpcbiAgICAgKiBhbmRcbiAgICAgKlxuICAgICAqIDpob3N0LWNvbnRleHQoLmZvbzpob3N0KSAuYmFyIHsgLi4uIH1cbiAgICAgKlxuICAgICAqIHRvXG4gICAgICpcbiAgICAgKiAuZm9vPHNjb3BlTmFtZT4gLmJhciB7IC4uLiB9XG4gICAgKi9cbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb252ZXJ0Q29sb25Ib3N0Q29udGV4dCA9IGZ1bmN0aW9uIChjc3NUZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q29sb25SdWxlKGNzc1RleHQsIF9jc3NDb2xvbkhvc3RDb250ZXh0UmUsIHRoaXMuX2NvbG9uSG9zdENvbnRleHRQYXJ0UmVwbGFjZXIpO1xuICAgIH07XG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fY29udmVydENvbG9uUnVsZSA9IGZ1bmN0aW9uIChjc3NUZXh0LCByZWdFeHAsIHBhcnRSZXBsYWNlcikge1xuICAgICAgICAvLyBtWzFdID0gOmhvc3QoLWNvbnRleHQpLCBtWzJdID0gY29udGVudHMgb2YgKCksIG1bM10gcmVzdCBvZiBydWxlXG4gICAgICAgIHJldHVybiBjc3NUZXh0LnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBtW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobVsyXSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IG1bMl0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBwYXJ0c1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByLnB1c2gocGFydFJlcGxhY2VyKF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IsIHAsIG1bM10pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IgKyBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2NvbG9uSG9zdENvbnRleHRQYXJ0UmVwbGFjZXIgPSBmdW5jdGlvbiAoaG9zdCwgcGFydCwgc3VmZml4KSB7XG4gICAgICAgIGlmIChwYXJ0LmluZGV4T2YoX3BvbHlmaWxsSG9zdCkgPiAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9uSG9zdFBhcnRSZXBsYWNlcihob3N0LCBwYXJ0LCBzdWZmaXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhvc3QgKyBwYXJ0ICsgc3VmZml4ICsgJywgJyArIHBhcnQgKyAnICcgKyBob3N0ICsgc3VmZml4O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIgPSBmdW5jdGlvbiAoaG9zdCwgcGFydCwgc3VmZml4KSB7XG4gICAgICAgIHJldHVybiBob3N0ICsgcGFydC5yZXBsYWNlKF9wb2x5ZmlsbEhvc3QsICcnKSArIHN1ZmZpeDtcbiAgICB9O1xuICAgIC8qXG4gICAgICogQ29udmVydCBjb21iaW5hdG9ycyBsaWtlIDo6c2hhZG93IGFuZCBwc2V1ZG8tZWxlbWVudHMgbGlrZSA6OmNvbnRlbnRcbiAgICAgKiBieSByZXBsYWNpbmcgd2l0aCBzcGFjZS5cbiAgICAqL1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX2NvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMgPSBmdW5jdGlvbiAoY3NzVGV4dCkge1xuICAgICAgICByZXR1cm4gX3NoYWRvd0RPTVNlbGVjdG9yc1JlLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBwYXR0ZXJuKSB7IHJldHVybiByZXN1bHQucmVwbGFjZShwYXR0ZXJuLCAnICcpOyB9LCBjc3NUZXh0KTtcbiAgICB9O1xuICAgIC8vIGNoYW5nZSBhIHNlbGVjdG9yIGxpa2UgJ2RpdicgdG8gJ25hbWUgZGl2J1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX3Njb3BlU2VsZWN0b3JzID0gZnVuY3Rpb24gKGNzc1RleHQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc1J1bGVzKGNzc1RleHQsIGZ1bmN0aW9uIChydWxlKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBydWxlLmNvbnRlbnQ7XG4gICAgICAgICAgICBpZiAocnVsZS5zZWxlY3RvclswXSAhPSAnQCcpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciA9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zY29wZVNlbGVjdG9yKHJ1bGUuc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3RvciwgX3RoaXMuc3RyaWN0U3R5bGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0BtZWRpYScpIHx8IHJ1bGUuc2VsZWN0b3Iuc3RhcnRzV2l0aCgnQHN1cHBvcnRzJykgfHxcbiAgICAgICAgICAgICAgICBydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0BwYWdlJykgfHwgcnVsZS5zZWxlY3Rvci5zdGFydHNXaXRoKCdAZG9jdW1lbnQnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBfdGhpcy5fc2NvcGVTZWxlY3RvcnMocnVsZS5jb250ZW50LCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDc3NSdWxlKHNlbGVjdG9yLCBjb250ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9zY29wZVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IsIHN0cmljdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gc2VsZWN0b3Iuc3BsaXQoJywnKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocGFydCkgeyByZXR1cm4gcGFydC50cmltKCkuc3BsaXQoX3NoYWRvd0RlZXBTZWxlY3RvcnMpOyB9KVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZGVlcFBhcnRzKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBfX3JlYWQoZGVlcFBhcnRzKSwgc2hhbGxvd1BhcnQgPSBfYVswXSwgb3RoZXJQYXJ0cyA9IF9hLnNsaWNlKDEpO1xuICAgICAgICAgICAgdmFyIGFwcGx5U2NvcGUgPSBmdW5jdGlvbiAoc2hhbGxvd1BhcnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3NlbGVjdG9yTmVlZHNTY29waW5nKHNoYWxsb3dQYXJ0LCBzY29wZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaWN0ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9hcHBseVN0cmljdFNlbGVjdG9yU2NvcGUoc2hhbGxvd1BhcnQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3RvcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FwcGx5U2VsZWN0b3JTY29wZShzaGFsbG93UGFydCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaGFsbG93UGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkKFthcHBseVNjb3BlKHNoYWxsb3dQYXJ0KV0sIG90aGVyUGFydHMpLmpvaW4oJyAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgIH07XG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fc2VsZWN0b3JOZWVkc1Njb3BpbmcgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIHJlID0gdGhpcy5fbWFrZVNjb3BlTWF0Y2hlcihzY29wZVNlbGVjdG9yKTtcbiAgICAgICAgcmV0dXJuICFyZS50ZXN0KHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIFNoYWRvd0Nzcy5wcm90b3R5cGUuX21ha2VTY29wZU1hdGNoZXIgPSBmdW5jdGlvbiAoc2NvcGVTZWxlY3Rvcikge1xuICAgICAgICB2YXIgbHJlID0gL1xcWy9nO1xuICAgICAgICB2YXIgcnJlID0gL1xcXS9nO1xuICAgICAgICBzY29wZVNlbGVjdG9yID0gc2NvcGVTZWxlY3Rvci5yZXBsYWNlKGxyZSwgJ1xcXFxbJykucmVwbGFjZShycmUsICdcXFxcXScpO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXignICsgc2NvcGVTZWxlY3RvciArICcpJyArIF9zZWxlY3RvclJlU3VmZml4LCAnbScpO1xuICAgIH07XG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fYXBwbHlTZWxlY3RvclNjb3BlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpIHtcbiAgICAgICAgLy8gRGlmZmVyZW5jZSBmcm9tIHdlYmNvbXBvbmVudHMuanM6IHNjb3BlU2VsZWN0b3IgY291bGQgbm90IGJlIGFuIGFycmF5XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUoc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgfTtcbiAgICAvLyBzY29wZSB2aWEgbmFtZSBhbmQgW2lzPW5hbWVdXG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpIHtcbiAgICAgICAgLy8gSW4gQW5kcm9pZCBicm93c2VyLCB0aGUgbGFzdEluZGV4IGlzIG5vdCByZXNldCB3aGVuIHRoZSByZWdleCBpcyB1c2VkIGluIFN0cmluZy5yZXBsYWNlKClcbiAgICAgICAgX3BvbHlmaWxsSG9zdFJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmIChfcG9seWZpbGxIb3N0UmUudGVzdChzZWxlY3RvcikpIHtcbiAgICAgICAgICAgIHZhciByZXBsYWNlQnlfMSA9IHRoaXMuc3RyaWN0U3R5bGluZyA/IFwiW1wiICsgaG9zdFNlbGVjdG9yICsgXCJdXCIgOiBzY29wZVNlbGVjdG9yO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvclJlLCBmdW5jdGlvbiAoaG5jLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3Rvci5yZXBsYWNlKC8oW146XSopKDoqKSguKikvLCBmdW5jdGlvbiAoXywgYmVmb3JlLCBjb2xvbiwgYWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlZm9yZSArIHJlcGxhY2VCeV8xICsgY29sb24gKyBhZnRlcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoX3BvbHlmaWxsSG9zdFJlLCByZXBsYWNlQnlfMSArICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlU2VsZWN0b3IgKyAnICcgKyBzZWxlY3RvcjtcbiAgICB9O1xuICAgIC8vIHJldHVybiBhIHNlbGVjdG9yIHdpdGggW25hbWVdIHN1ZmZpeCBvbiBlYWNoIHNpbXBsZSBzZWxlY3RvclxuICAgIC8vIGUuZy4gLmZvby5iYXIgPiAuem90IGJlY29tZXMgLmZvb1tuYW1lXS5iYXJbbmFtZV0gPiAuem90W25hbWVdICAvKiogQGludGVybmFsICovXG4gICAgU2hhZG93Q3NzLnByb3RvdHlwZS5fYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBzY29wZVNlbGVjdG9yLCBob3N0U2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGlzUmUgPSAvXFxbaXM9KFteXFxdXSopXFxdL2c7XG4gICAgICAgIHNjb3BlU2VsZWN0b3IgPSBzY29wZVNlbGVjdG9yLnJlcGxhY2UoaXNSZSwgZnVuY3Rpb24gKF8pIHtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBwYXJ0c1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1swXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9ICdbJyArIHNjb3BlU2VsZWN0b3IgKyAnXSc7XG4gICAgICAgIHZhciBfc2NvcGVTZWxlY3RvclBhcnQgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgdmFyIHNjb3BlZFAgPSBwLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVkUCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwLmluZGV4T2YoX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvcikgPiAtMSkge1xuICAgICAgICAgICAgICAgIHNjb3BlZFAgPSBfdGhpcy5fYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlKHAsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgOmhvc3Qgc2luY2UgaXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBwLnJlcGxhY2UoX3BvbHlmaWxsSG9zdFJlLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IHQubWF0Y2goLyhbXjpdKikoOiopKC4qKS8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUCA9IG1hdGNoZXNbMV0gKyBhdHRyTmFtZSArIG1hdGNoZXNbMl0gKyBtYXRjaGVzWzNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNjb3BlZFA7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzYWZlQ29udGVudCA9IG5ldyBTYWZlU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICBzZWxlY3RvciA9IHNhZmVDb250ZW50LmNvbnRlbnQoKTtcbiAgICAgICAgdmFyIHNjb3BlZFNlbGVjdG9yID0gJyc7XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgdmFyIHNlcCA9IC8oIHw+fFxcK3x+KD8hPSkpXFxzKi9nO1xuICAgICAgICAvLyBJZiBhIHNlbGVjdG9yIGFwcGVhcnMgYmVmb3JlIDpob3N0IGl0IHNob3VsZCBub3QgYmUgc2hpbW1lZCBhcyBpdFxuICAgICAgICAvLyBtYXRjaGVzIG9uIGFuY2VzdG9yIGVsZW1lbnRzIGFuZCBub3Qgb24gZWxlbWVudHMgaW4gdGhlIGhvc3QncyBzaGFkb3dcbiAgICAgICAgLy8gYDpob3N0LWNvbnRleHQoZGl2KWAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgICAgICAgLy8gYC1zaGFkb3djc3Nob3N0LW5vLWNvbWJpbmF0b3JkaXYsIGRpdiAtc2hhZG93Y3NzaG9zdC1uby1jb21iaW5hdG9yYFxuICAgICAgICAvLyB0aGUgYGRpdmAgaXMgbm90IHBhcnQgb2YgdGhlIGNvbXBvbmVudCBpbiB0aGUgMm5kIHNlbGVjdG9ycyBhbmQgc2hvdWxkIG5vdCBiZSBzY29wZWQuXG4gICAgICAgIC8vIEhpc3RvcmljYWxseSBgY29tcG9uZW50LXRhZzpob3N0YCB3YXMgbWF0Y2hpbmcgdGhlIGNvbXBvbmVudCBzbyB3ZSBhbHNvIHdhbnQgdG8gcHJlc2VydmVcbiAgICAgICAgLy8gdGhpcyBiZWhhdmlvciB0byBhdm9pZCBicmVha2luZyBsZWdhY3kgYXBwcyAoaXQgc2hvdWxkIG5vdCBtYXRjaCkuXG4gICAgICAgIC8vIFRoZSBiZWhhdmlvciBzaG91bGQgYmU6XG4gICAgICAgIC8vIC0gYHRhZzpob3N0YCAtPiBgdGFnW2hdYCAodGhpcyBpcyB0byBhdm9pZCBicmVha2luZyBsZWdhY3kgYXBwcywgc2hvdWxkIG5vdCBtYXRjaCBhbnl0aGluZylcbiAgICAgICAgLy8gLSBgdGFnIDpob3N0YCAtPiBgdGFnIFtoXWAgKGB0YWdgIGlzIG5vdCBzY29wZWQgYmVjYXVzZSBpdCdzIGNvbnNpZGVyZWQgcGFydCBvZiBhXG4gICAgICAgIC8vICAgYDpob3N0LWNvbnRleHQodGFnKWApXG4gICAgICAgIHZhciBoYXNIb3N0ID0gc2VsZWN0b3IuaW5kZXhPZihfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yKSA+IC0xO1xuICAgICAgICAvLyBPbmx5IHNjb3BlIHBhcnRzIGFmdGVyIHRoZSBmaXJzdCBgLXNoYWRvd2Nzc2hvc3Qtbm8tY29tYmluYXRvcmAgd2hlbiBpdCBpcyBwcmVzZW50XG4gICAgICAgIHZhciBzaG91bGRTY29wZSA9ICFoYXNIb3N0O1xuICAgICAgICB3aGlsZSAoKHJlcyA9IHNlcC5leGVjKHNlbGVjdG9yKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBzZXBhcmF0b3IgPSByZXNbMV07XG4gICAgICAgICAgICB2YXIgcGFydF8xID0gc2VsZWN0b3Iuc2xpY2Uoc3RhcnRJbmRleCwgcmVzLmluZGV4KS50cmltKCk7XG4gICAgICAgICAgICBzaG91bGRTY29wZSA9IHNob3VsZFNjb3BlIHx8IHBhcnRfMS5pbmRleE9mKF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IpID4gLTE7XG4gICAgICAgICAgICB2YXIgc2NvcGVkUGFydCA9IHNob3VsZFNjb3BlID8gX3Njb3BlU2VsZWN0b3JQYXJ0KHBhcnRfMSkgOiBwYXJ0XzE7XG4gICAgICAgICAgICBzY29wZWRTZWxlY3RvciArPSBzY29wZWRQYXJ0ICsgXCIgXCIgKyBzZXBhcmF0b3IgKyBcIiBcIjtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBzZXAubGFzdEluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJ0ID0gc2VsZWN0b3Iuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuICAgICAgICBzaG91bGRTY29wZSA9IHNob3VsZFNjb3BlIHx8IHBhcnQuaW5kZXhPZihfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yKSA+IC0xO1xuICAgICAgICBzY29wZWRTZWxlY3RvciArPSBzaG91bGRTY29wZSA/IF9zY29wZVNlbGVjdG9yUGFydChwYXJ0KSA6IHBhcnQ7XG4gICAgICAgIC8vIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycyB3aXRoIHRoZWlyIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICByZXR1cm4gc2FmZUNvbnRlbnQucmVzdG9yZShzY29wZWRTZWxlY3Rvcik7XG4gICAgfTtcbiAgICBTaGFkb3dDc3MucHJvdG90eXBlLl9pbnNlcnRQb2x5ZmlsbEhvc3RJbkNzc1RleHQgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yLnJlcGxhY2UoX2NvbG9uSG9zdENvbnRleHRSZSwgX3BvbHlmaWxsSG9zdENvbnRleHQpXG4gICAgICAgICAgICAucmVwbGFjZShfY29sb25Ib3N0UmUsIF9wb2x5ZmlsbEhvc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIFNoYWRvd0Nzcztcbn0oKSk7XG52YXIgU2FmZVNlbGVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNhZmVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVycyA9IFtdO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgLy8gUmVwbGFjZXMgYXR0cmlidXRlIHNlbGVjdG9ycyB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgICAgLy8gVGhlIFdTIGluIFthdHRyPVwidmEgbHVlXCJdIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBhIHNlbGVjdG9yIHNlcGFyYXRvci5cbiAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC8oXFxbW15cXF1dKlxcXSkvZywgZnVuY3Rpb24gKF8sIGtlZXApIHtcbiAgICAgICAgICAgIHZhciByZXBsYWNlQnkgPSBcIl9fcGgtXCIgKyBfdGhpcy5pbmRleCArIFwiX19cIjtcbiAgICAgICAgICAgIF90aGlzLnBsYWNlaG9sZGVycy5wdXNoKGtlZXApO1xuICAgICAgICAgICAgX3RoaXMuaW5kZXgrKztcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlQnk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBSZXBsYWNlcyB0aGUgZXhwcmVzc2lvbiBpbiBgOm50aC1jaGlsZCgybiArIDEpYCB3aXRoIGEgcGxhY2Vob2xkZXIuXG4gICAgICAgIC8vIFdTIGFuZCBcIitcIiB3b3VsZCBvdGhlcndpc2UgYmUgaW50ZXJwcmV0ZWQgYXMgc2VsZWN0b3Igc2VwYXJhdG9ycy5cbiAgICAgICAgdGhpcy5fY29udGVudCA9IHNlbGVjdG9yLnJlcGxhY2UoLyg6bnRoLVstXFx3XSspKFxcKFteKV0rXFwpKS9nLCBmdW5jdGlvbiAoXywgcHNldWRvLCBleHApIHtcbiAgICAgICAgICAgIHZhciByZXBsYWNlQnkgPSBcIl9fcGgtXCIgKyBfdGhpcy5pbmRleCArIFwiX19cIjtcbiAgICAgICAgICAgIF90aGlzLnBsYWNlaG9sZGVycy5wdXNoKGV4cCk7XG4gICAgICAgICAgICBfdGhpcy5pbmRleCsrO1xuICAgICAgICAgICAgcmV0dXJuIHBzZXVkbyArIHJlcGxhY2VCeTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFNhZmVTZWxlY3Rvci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoL19fcGgtKFxcZCspX18vZywgZnVuY3Rpb24gKHBoLCBpbmRleCkgeyByZXR1cm4gX3RoaXMucGxhY2Vob2xkZXJzWytpbmRleF07IH0pO1xuICAgIH07XG4gICAgU2FmZVNlbGVjdG9yLnByb3RvdHlwZS5jb250ZW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY29udGVudDsgfTtcbiAgICByZXR1cm4gU2FmZVNlbGVjdG9yO1xufSgpKTtcbnZhciBfY3NzQ29udGVudE5leHRTZWxlY3RvclJlID0gL3BvbHlmaWxsLW5leHQtc2VsZWN0b3JbXn1dKmNvbnRlbnQ6W1xcc10qPyhbJ1wiXSkoLio/KVxcMVs7XFxzXSp9KFtee10qPyl7L2dpbTtcbnZhciBfY3NzQ29udGVudFJ1bGVSZSA9IC8ocG9seWZpbGwtcnVsZSlbXn1dKihjb250ZW50OltcXHNdKihbJ1wiXSkoLio/KVxcMylbO1xcc10qW159XSp9L2dpbTtcbnZhciBfY3NzQ29udGVudFVuc2NvcGVkUnVsZVJlID0gLyhwb2x5ZmlsbC11bnNjb3BlZC1ydWxlKVtefV0qKGNvbnRlbnQ6W1xcc10qKFsnXCJdKSguKj8pXFwzKVs7XFxzXSpbXn1dKn0vZ2ltO1xudmFyIF9wb2x5ZmlsbEhvc3QgPSAnLXNoYWRvd2Nzc2hvc3QnO1xuLy8gbm90ZTogOmhvc3QtY29udGV4dCBwcmUtcHJvY2Vzc2VkIHRvIC1zaGFkb3djc3Nob3N0Y29udGV4dC5cbnZhciBfcG9seWZpbGxIb3N0Q29udGV4dCA9ICctc2hhZG93Y3NzY29udGV4dCc7XG52YXIgX3BhcmVuU3VmZml4ID0gJykoPzpcXFxcKCgnICtcbiAgICAnKD86XFxcXChbXikoXSpcXFxcKXxbXikoXSopKz8nICtcbiAgICAnKVxcXFwpKT8oW14se10qKSc7XG52YXIgX2Nzc0NvbG9uSG9zdFJlID0gbmV3IFJlZ0V4cCgnKCcgKyBfcG9seWZpbGxIb3N0ICsgX3BhcmVuU3VmZml4LCAnZ2ltJyk7XG52YXIgX2Nzc0NvbG9uSG9zdENvbnRleHRSZSA9IG5ldyBSZWdFeHAoJygnICsgX3BvbHlmaWxsSG9zdENvbnRleHQgKyBfcGFyZW5TdWZmaXgsICdnaW0nKTtcbnZhciBfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yID0gX3BvbHlmaWxsSG9zdCArICctbm8tY29tYmluYXRvcic7XG52YXIgX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvclJlID0gLy1zaGFkb3djc3Nob3N0LW5vLWNvbWJpbmF0b3IoW15cXHNdKikvO1xudmFyIF9zaGFkb3dET01TZWxlY3RvcnNSZSA9IFtcbiAgICAvOjpzaGFkb3cvZyxcbiAgICAvOjpjb250ZW50L2csXG4gICAgLy8gRGVwcmVjYXRlZCBzZWxlY3RvcnNcbiAgICAvXFwvc2hhZG93LWRlZXBcXC8vZyxcbiAgICAvXFwvc2hhZG93XFwvL2csXG5dO1xuLy8gVGhlIGRlZXAgY29tYmluYXRvciBpcyBkZXByZWNhdGVkIGluIHRoZSBDU1Mgc3BlY1xuLy8gU3VwcG9ydCBmb3IgYD4+PmAsIGBkZWVwYCwgYDo6bmctZGVlcGAgaXMgdGhlbiBhbHNvIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC8xNzY3N1xudmFyIF9zaGFkb3dEZWVwU2VsZWN0b3JzID0gLyg/Oj4+Pil8KD86XFwvZGVlcFxcLyl8KD86OjpuZy1kZWVwKS9nO1xudmFyIF9zZWxlY3RvclJlU3VmZml4ID0gJyhbPlxcXFxzfitcXFsuLHs6XVtcXFxcc1xcXFxTXSopPyQnO1xudmFyIF9wb2x5ZmlsbEhvc3RSZSA9IC8tc2hhZG93Y3NzaG9zdC9naW07XG52YXIgX2NvbG9uSG9zdFJlID0gLzpob3N0L2dpbTtcbnZhciBfY29sb25Ib3N0Q29udGV4dFJlID0gLzpob3N0LWNvbnRleHQvZ2ltO1xudmFyIF9jb21tZW50UmUgPSAvXFwvXFwqXFxzKltcXHNcXFNdKj9cXCpcXC8vZztcbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHMoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShfY29tbWVudFJlLCAnJyk7XG59XG52YXIgX2NvbW1lbnRXaXRoSGFzaFJlID0gL1xcL1xcKlxccyojXFxzKnNvdXJjZShNYXBwaW5nKT9VUkw9W1xcc1xcU10rP1xcKlxcLy9nO1xuZnVuY3Rpb24gZXh0cmFjdENvbW1lbnRzV2l0aEhhc2goaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQubWF0Y2goX2NvbW1lbnRXaXRoSGFzaFJlKSB8fCBbXTtcbn1cbnZhciBfcnVsZVJlID0gLyhcXHMqKShbXjtcXHtcXH1dKz8pKFxccyopKCg/OnslQkxPQ0slfT9cXHMqOz8pfCg/Olxccyo7KSkvZztcbnZhciBfY3VybHlSZSA9IC8oW3t9XSkvZztcbnZhciBPUEVOX0NVUkxZID0gJ3snO1xudmFyIENMT1NFX0NVUkxZID0gJ30nO1xudmFyIEJMT0NLX1BMQUNFSE9MREVSID0gJyVCTE9DSyUnO1xudmFyIENzc1J1bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3NzUnVsZShzZWxlY3RvciwgY29udGVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBDc3NSdWxlO1xufSgpKTtcbmZ1bmN0aW9uIHByb2Nlc3NSdWxlcyhpbnB1dCwgcnVsZUNhbGxiYWNrKSB7XG4gICAgdmFyIGlucHV0V2l0aEVzY2FwZWRCbG9ja3MgPSBlc2NhcGVCbG9ja3MoaW5wdXQpO1xuICAgIHZhciBuZXh0QmxvY2tJbmRleCA9IDA7XG4gICAgcmV0dXJuIGlucHV0V2l0aEVzY2FwZWRCbG9ja3MuZXNjYXBlZFN0cmluZy5yZXBsYWNlKF9ydWxlUmUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG0gPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG1bX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2VsZWN0b3IgPSBtWzJdO1xuICAgICAgICB2YXIgY29udGVudCA9ICcnO1xuICAgICAgICB2YXIgc3VmZml4ID0gbVs0XTtcbiAgICAgICAgdmFyIGNvbnRlbnRQcmVmaXggPSAnJztcbiAgICAgICAgaWYgKHN1ZmZpeCAmJiBzdWZmaXguc3RhcnRzV2l0aCgneycgKyBCTE9DS19QTEFDRUhPTERFUikpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBpbnB1dFdpdGhFc2NhcGVkQmxvY2tzLmJsb2Nrc1tuZXh0QmxvY2tJbmRleCsrXTtcbiAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5zdWJzdHJpbmcoQkxPQ0tfUExBQ0VIT0xERVIubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICBjb250ZW50UHJlZml4ID0gJ3snO1xuICAgICAgICB9XG4gICAgICAgIHZhciBydWxlID0gcnVsZUNhbGxiYWNrKG5ldyBDc3NSdWxlKHNlbGVjdG9yLCBjb250ZW50KSk7XG4gICAgICAgIHJldHVybiBcIlwiICsgbVsxXSArIHJ1bGUuc2VsZWN0b3IgKyBtWzNdICsgY29udGVudFByZWZpeCArIHJ1bGUuY29udGVudCArIHN1ZmZpeDtcbiAgICB9KTtcbn1cbnZhciBTdHJpbmdXaXRoRXNjYXBlZEJsb2NrcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcyhlc2NhcGVkU3RyaW5nLCBibG9ja3MpIHtcbiAgICAgICAgdGhpcy5lc2NhcGVkU3RyaW5nID0gZXNjYXBlZFN0cmluZztcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBibG9ja3M7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcztcbn0oKSk7XG5mdW5jdGlvbiBlc2NhcGVCbG9ja3MoaW5wdXQpIHtcbiAgICB2YXIgaW5wdXRQYXJ0cyA9IGlucHV0LnNwbGl0KF9jdXJseVJlKTtcbiAgICB2YXIgcmVzdWx0UGFydHMgPSBbXTtcbiAgICB2YXIgZXNjYXBlZEJsb2NrcyA9IFtdO1xuICAgIHZhciBicmFja2V0Q291bnQgPSAwO1xuICAgIHZhciBjdXJyZW50QmxvY2tQYXJ0cyA9IFtdO1xuICAgIGZvciAodmFyIHBhcnRJbmRleCA9IDA7IHBhcnRJbmRleCA8IGlucHV0UGFydHMubGVuZ3RoOyBwYXJ0SW5kZXgrKykge1xuICAgICAgICB2YXIgcGFydCA9IGlucHV0UGFydHNbcGFydEluZGV4XTtcbiAgICAgICAgaWYgKHBhcnQgPT0gQ0xPU0VfQ1VSTFkpIHtcbiAgICAgICAgICAgIGJyYWNrZXRDb3VudC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFja2V0Q291bnQgPiAwKSB7XG4gICAgICAgICAgICBjdXJyZW50QmxvY2tQYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja1BhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkQmxvY2tzLnB1c2goY3VycmVudEJsb2NrUGFydHMuam9pbignJykpO1xuICAgICAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goQkxPQ0tfUExBQ0VIT0xERVIpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja1BhcnRzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0ID09IE9QRU5fQ1VSTFkpIHtcbiAgICAgICAgICAgIGJyYWNrZXRDb3VudCsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50QmxvY2tQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVzY2FwZWRCbG9ja3MucHVzaChjdXJyZW50QmxvY2tQYXJ0cy5qb2luKCcnKSk7XG4gICAgICAgIHJlc3VsdFBhcnRzLnB1c2goQkxPQ0tfUExBQ0VIT0xERVIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzKHJlc3VsdFBhcnRzLmpvaW4oJycpLCBlc2NhcGVkQmxvY2tzKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnO1xudmFyIEhPU1RfQVRUUiA9IFwiX25naG9zdC1cIiArIENPTVBPTkVOVF9WQVJJQUJMRTtcbnZhciBDT05URU5UX0FUVFIgPSBcIl9uZ2NvbnRlbnQtXCIgKyBDT01QT05FTlRfVkFSSUFCTEU7XG52YXIgU3R5bGVzQ29tcGlsZURlcGVuZGVuY3kgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3R5bGVzQ29tcGlsZURlcGVuZGVuY3kobmFtZSwgbW9kdWxlVXJsLCBzZXRWYWx1ZSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLm1vZHVsZVVybCA9IG1vZHVsZVVybDtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSA9IHNldFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gU3R5bGVzQ29tcGlsZURlcGVuZGVuY3k7XG59KCkpO1xudmFyIENvbXBpbGVkU3R5bGVzaGVldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlZFN0eWxlc2hlZXQob3V0cHV0Q3R4LCBzdHlsZXNWYXIsIGRlcGVuZGVuY2llcywgaXNTaGltbWVkLCBtZXRhKSB7XG4gICAgICAgIHRoaXMub3V0cHV0Q3R4ID0gb3V0cHV0Q3R4O1xuICAgICAgICB0aGlzLnN0eWxlc1ZhciA9IHN0eWxlc1ZhcjtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMuaXNTaGltbWVkID0gaXNTaGltbWVkO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuICAgIH1cbiAgICByZXR1cm4gQ29tcGlsZWRTdHlsZXNoZWV0O1xufSgpKTtcbnZhciBTdHlsZUNvbXBpbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0eWxlQ29tcGlsZXIoX3VybFJlc29sdmVyKSB7XG4gICAgICAgIHRoaXMuX3VybFJlc29sdmVyID0gX3VybFJlc29sdmVyO1xuICAgICAgICB0aGlzLl9zaGFkb3dDc3MgPSBuZXcgU2hhZG93Q3NzKCk7XG4gICAgfVxuICAgIFN0eWxlQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVDb21wb25lbnQgPSBmdW5jdGlvbiAob3V0cHV0Q3R4LCBjb21wKSB7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGNvbXAudGVtcGxhdGU7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21waWxlU3R5bGVzKG91dHB1dEN0eCwgY29tcCwgbmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoe1xuICAgICAgICAgICAgc3R5bGVzOiB0ZW1wbGF0ZS5zdHlsZXMsXG4gICAgICAgICAgICBzdHlsZVVybHM6IHRlbXBsYXRlLnN0eWxlVXJscyxcbiAgICAgICAgICAgIG1vZHVsZVVybDogaWRlbnRpZmllck1vZHVsZVVybChjb21wLnR5cGUpXG4gICAgICAgIH0pLCB0aGlzLm5lZWRzU3R5bGVTaGltKGNvbXApLCB0cnVlKTtcbiAgICB9O1xuICAgIFN0eWxlQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVTdHlsZXMgPSBmdW5jdGlvbiAob3V0cHV0Q3R4LCBjb21wLCBzdHlsZXNoZWV0LCBzaGltKSB7XG4gICAgICAgIGlmIChzaGltID09PSB2b2lkIDApIHsgc2hpbSA9IHRoaXMubmVlZHNTdHlsZVNoaW0oY29tcCk7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVTdHlsZXMob3V0cHV0Q3R4LCBjb21wLCBzdHlsZXNoZWV0LCBzaGltLCBmYWxzZSk7XG4gICAgfTtcbiAgICBTdHlsZUNvbXBpbGVyLnByb3RvdHlwZS5uZWVkc1N0eWxlU2hpbSA9IGZ1bmN0aW9uIChjb21wKSB7XG4gICAgICAgIHJldHVybiBjb21wLnRlbXBsYXRlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkO1xuICAgIH07XG4gICAgU3R5bGVDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVTdHlsZXMgPSBmdW5jdGlvbiAob3V0cHV0Q3R4LCBjb21wLCBzdHlsZXNoZWV0LCBzaGltLCBpc0NvbXBvbmVudFN0eWxlc2hlZXQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHN0eWxlRXhwcmVzc2lvbnMgPSBzdHlsZXNoZWV0LnN0eWxlcy5tYXAoZnVuY3Rpb24gKHBsYWluU3R5bGUpIHsgcmV0dXJuIGxpdGVyYWwoX3RoaXMuX3NoaW1JZk5lZWRlZChwbGFpblN0eWxlLCBzaGltKSk7IH0pO1xuICAgICAgICB2YXIgZGVwZW5kZW5jaWVzID0gW107XG4gICAgICAgIHN0eWxlc2hlZXQuc3R5bGVVcmxzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlVXJsKSB7XG4gICAgICAgICAgICB2YXIgZXhwckluZGV4ID0gc3R5bGVFeHByZXNzaW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAvLyBOb3RlOiBUaGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgZmlsbGVkIGxhdGVyLlxuICAgICAgICAgICAgc3R5bGVFeHByZXNzaW9ucy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2gobmV3IFN0eWxlc0NvbXBpbGVEZXBlbmRlbmN5KGdldFN0eWxlc1Zhck5hbWUobnVsbCksIHN0eWxlVXJsLCBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHN0eWxlRXhwcmVzc2lvbnNbZXhwckluZGV4XSA9IG91dHB1dEN0eC5pbXBvcnRFeHByKHZhbHVlKTsgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gc3R5bGVzIHZhcmlhYmxlIGNvbnRhaW5zIHBsYWluIHN0cmluZ3MgYW5kIGFycmF5cyBvZiBvdGhlciBzdHlsZXMgYXJyYXlzIChyZWN1cnNpdmUpLFxuICAgICAgICAvLyBzbyB3ZSBzZXQgaXRzIHR5cGUgdG8gZHluYW1pYy5cbiAgICAgICAgdmFyIHN0eWxlc1ZhciA9IGdldFN0eWxlc1Zhck5hbWUoaXNDb21wb25lbnRTdHlsZXNoZWV0ID8gY29tcCA6IG51bGwpO1xuICAgICAgICB2YXIgc3RtdCA9IHZhcmlhYmxlKHN0eWxlc1ZhcilcbiAgICAgICAgICAgIC5zZXQobGl0ZXJhbEFycihzdHlsZUV4cHJlc3Npb25zLCBuZXcgQXJyYXlUeXBlKERZTkFNSUNfVFlQRSwgW1R5cGVNb2RpZmllci5Db25zdF0pKSlcbiAgICAgICAgICAgIC50b0RlY2xTdG10KG51bGwsIGlzQ29tcG9uZW50U3R5bGVzaGVldCA/IFtTdG10TW9kaWZpZXIuRmluYWxdIDogW1xuICAgICAgICAgICAgU3RtdE1vZGlmaWVyLkZpbmFsLCBTdG10TW9kaWZpZXIuRXhwb3J0ZWRcbiAgICAgICAgXSk7XG4gICAgICAgIG91dHB1dEN0eC5zdGF0ZW1lbnRzLnB1c2goc3RtdCk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGlsZWRTdHlsZXNoZWV0KG91dHB1dEN0eCwgc3R5bGVzVmFyLCBkZXBlbmRlbmNpZXMsIHNoaW0sIHN0eWxlc2hlZXQpO1xuICAgIH07XG4gICAgU3R5bGVDb21waWxlci5wcm90b3R5cGUuX3NoaW1JZk5lZWRlZCA9IGZ1bmN0aW9uIChzdHlsZSwgc2hpbSkge1xuICAgICAgICByZXR1cm4gc2hpbSA/IHRoaXMuX3NoYWRvd0Nzcy5zaGltQ3NzVGV4dChzdHlsZSwgQ09OVEVOVF9BVFRSLCBIT1NUX0FUVFIpIDogc3R5bGU7XG4gICAgfTtcbiAgICByZXR1cm4gU3R5bGVDb21waWxlcjtcbn0oKSk7XG5mdW5jdGlvbiBnZXRTdHlsZXNWYXJOYW1lKGNvbXBvbmVudCkge1xuICAgIHZhciByZXN1bHQgPSBcInN0eWxlc1wiO1xuICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgcmVzdWx0ICs9IFwiX1wiICsgaWRlbnRpZmllck5hbWUoY29tcG9uZW50LnR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEEgcGF0aCBpcyBhbiBvcmRlcmVkIHNldCBvZiBlbGVtZW50cy4gVHlwaWNhbGx5IGEgcGF0aCBpcyB0byAgYVxuICogcGFydGljdWxhciBvZmZzZXQgaW4gYSBzb3VyY2UgZmlsZS4gVGhlIGhlYWQgb2YgdGhlIGxpc3QgaXMgdGhlIHRvcFxuICogbW9zdCBub2RlLiBUaGUgdGFpbCBpcyB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXQgZGlyZWN0bHkuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBleHByZXNzaW9uIGBhICsgYiArIGNgIG1pZ2h0IGhhdmUgYW4gYXN0IHRoYXQgbG9va3NcbiAqIGxpa2U6XG4gKiAgICAgK1xuICogICAgLyBcXFxuICogICBhICAgK1xuICogICAgICAvIFxcXG4gKiAgICAgYiAgIGNcbiAqXG4gKiBUaGUgcGF0aCB0byB0aGUgbm9kZSBhdCBvZmZzZXQgOSB3b3VsZCBiZSBgWycrJyBhdCAxLTEwLCAnKycgYXQgNy0xMCxcbiAqICdjJyBhdCA5LTEwXWAgYW5kIHRoZSBwYXRoIHRoZSBub2RlIGF0IG9mZnNldCAxIHdvdWxkIGJlXG4gKiBgWycrJyBhdCAxLTEwLCAnYScgYXQgMS0yXWAuXG4gKi9cbnZhciBBc3RQYXRoID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzdFBhdGgocGF0aCwgcG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApIHsgcG9zaXRpb24gPSAtMTsgfVxuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBc3RQYXRoLnByb3RvdHlwZSwgXCJlbXB0eVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMucGF0aCB8fCAhdGhpcy5wYXRoLmxlbmd0aDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFzdFBhdGgucHJvdG90eXBlLCBcImhlYWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucGF0aFswXTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFzdFBhdGgucHJvdG90eXBlLCBcInRhaWxcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIEFzdFBhdGgucHJvdG90eXBlLnBhcmVudE9mID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgdGhpcy5wYXRoW3RoaXMucGF0aC5pbmRleE9mKG5vZGUpIC0gMV07XG4gICAgfTtcbiAgICBBc3RQYXRoLnByb3RvdHlwZS5jaGlsZE9mID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnBhdGguaW5kZXhPZihub2RlKSArIDFdOyB9O1xuICAgIEFzdFBhdGgucHJvdG90eXBlLmZpcnN0ID0gZnVuY3Rpb24gKGN0b3IpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMucGF0aC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLnBhdGhbaV07XG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIGN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFzdFBhdGgucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkgeyB0aGlzLnBhdGgucHVzaChub2RlKTsgfTtcbiAgICBBc3RQYXRoLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnBhdGgucG9wKCk7IH07XG4gICAgcmV0dXJuIEFzdFBhdGg7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVGV4dCQzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRleHQodmFsdWUsIHNvdXJjZVNwYW4sIGkxOG4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmkxOG4gPSBpMThuO1xuICAgIH1cbiAgICBUZXh0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gVGV4dDtcbn0oKSk7XG52YXIgRXhwYW5zaW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4cGFuc2lvbihzd2l0Y2hWYWx1ZSwgdHlwZSwgY2FzZXMsIHNvdXJjZVNwYW4sIHN3aXRjaFZhbHVlU291cmNlU3BhbiwgaTE4bikge1xuICAgICAgICB0aGlzLnN3aXRjaFZhbHVlID0gc3dpdGNoVmFsdWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5zd2l0Y2hWYWx1ZVNvdXJjZVNwYW4gPSBzd2l0Y2hWYWx1ZVNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMuaTE4biA9IGkxOG47XG4gICAgfVxuICAgIEV4cGFuc2lvbi5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEV4cGFuc2lvbih0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gRXhwYW5zaW9uO1xufSgpKTtcbnZhciBFeHBhbnNpb25DYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4cGFuc2lvbkNhc2UodmFsdWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIHZhbHVlU291cmNlU3BhbiwgZXhwU291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMudmFsdWVTb3VyY2VTcGFuID0gdmFsdWVTb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmV4cFNvdXJjZVNwYW4gPSBleHBTb3VyY2VTcGFuO1xuICAgIH1cbiAgICBFeHBhbnNpb25DYXNlLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0RXhwYW5zaW9uQ2FzZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gRXhwYW5zaW9uQ2FzZTtcbn0oKSk7XG52YXIgQXR0cmlidXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgc291cmNlU3BhbiwgdmFsdWVTcGFuLCBpMThuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy52YWx1ZVNwYW4gPSB2YWx1ZVNwYW47XG4gICAgICAgIHRoaXMuaTE4biA9IGkxOG47XG4gICAgfVxuICAgIEF0dHJpYnV0ZS5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEF0dHJpYnV0ZSh0aGlzLCBjb250ZXh0KTsgfTtcbiAgICByZXR1cm4gQXR0cmlidXRlO1xufSgpKTtcbnZhciBFbGVtZW50JDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRWxlbWVudChuYW1lLCBhdHRycywgY2hpbGRyZW4sIHNvdXJjZVNwYW4sIHN0YXJ0U291cmNlU3BhbiwgZW5kU291cmNlU3BhbiwgaTE4bikge1xuICAgICAgICBpZiAoc3RhcnRTb3VyY2VTcGFuID09PSB2b2lkIDApIHsgc3RhcnRTb3VyY2VTcGFuID0gbnVsbDsgfVxuICAgICAgICBpZiAoZW5kU291cmNlU3BhbiA9PT0gdm9pZCAwKSB7IGVuZFNvdXJjZVNwYW4gPSBudWxsOyB9XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLnN0YXJ0U291cmNlU3BhbiA9IHN0YXJ0U291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5lbmRTb3VyY2VTcGFuID0gZW5kU291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pMThuID0gaTE4bjtcbiAgICB9XG4gICAgRWxlbWVudC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEVsZW1lbnQodGhpcywgY29udGV4dCk7IH07XG4gICAgcmV0dXJuIEVsZW1lbnQ7XG59KCkpO1xudmFyIENvbW1lbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tbWVudCh2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIENvbW1lbnQucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRDb21tZW50KHRoaXMsIGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBDb21tZW50O1xufSgpKTtcbmZ1bmN0aW9uIHZpc2l0QWxsJDEodmlzaXRvciwgbm9kZXMsIGNvbnRleHQpIHtcbiAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7IGNvbnRleHQgPSBudWxsOyB9XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciB2aXNpdCA9IHZpc2l0b3IudmlzaXQgP1xuICAgICAgICBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiB2aXNpdG9yLnZpc2l0KGFzdCwgY29udGV4dCkgfHwgYXN0LnZpc2l0KHZpc2l0b3IsIGNvbnRleHQpOyB9IDpcbiAgICAgICAgZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gYXN0LnZpc2l0KHZpc2l0b3IsIGNvbnRleHQpOyB9O1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICB2YXIgYXN0UmVzdWx0ID0gdmlzaXQoYXN0KTtcbiAgICAgICAgaWYgKGFzdFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXN0UmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG52YXIgUmVjdXJzaXZlVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZWN1cnNpdmVWaXNpdG9yKCkge1xuICAgIH1cbiAgICBSZWN1cnNpdmVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudmlzaXRDaGlsZHJlbihjb250ZXh0LCBmdW5jdGlvbiAodmlzaXQpIHtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5hdHRycyk7XG4gICAgICAgICAgICB2aXNpdChhc3QuY2hpbGRyZW4pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFJlY3Vyc2l2ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBSZWN1cnNpdmVWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgUmVjdXJzaXZlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4oY29udGV4dCwgZnVuY3Rpb24gKHZpc2l0KSB7IHZpc2l0KGFzdC5jYXNlcyk7IH0pO1xuICAgIH07XG4gICAgUmVjdXJzaXZlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFJlY3Vyc2l2ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2hpbGRyZW4gPSBmdW5jdGlvbiAoY29udGV4dCwgY2IpIHtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgdmFyIHQgPSB0aGlzO1xuICAgICAgICBmdW5jdGlvbiB2aXNpdChjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2aXNpdEFsbCQxKHQsIGNoaWxkcmVuLCBjb250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2IodmlzaXQpO1xuICAgICAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCByZXN1bHRzKTtcbiAgICB9O1xuICAgIHJldHVybiBSZWN1cnNpdmVWaXNpdG9yO1xufSgpKTtcbmZ1bmN0aW9uIHNwYW5PZihhc3QpIHtcbiAgICB2YXIgc3RhcnQgPSBhc3Quc291cmNlU3Bhbi5zdGFydC5vZmZzZXQ7XG4gICAgdmFyIGVuZCA9IGFzdC5zb3VyY2VTcGFuLmVuZC5vZmZzZXQ7XG4gICAgaWYgKGFzdCBpbnN0YW5jZW9mIEVsZW1lbnQkMSkge1xuICAgICAgICBpZiAoYXN0LmVuZFNvdXJjZVNwYW4pIHtcbiAgICAgICAgICAgIGVuZCA9IGFzdC5lbmRTb3VyY2VTcGFuLmVuZC5vZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXN0LmNoaWxkcmVuICYmIGFzdC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCA9IHNwYW5PZihhc3QuY2hpbGRyZW5bYXN0LmNoaWxkcmVuLmxlbmd0aCAtIDFdKS5lbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xufVxuZnVuY3Rpb24gZmluZE5vZGUobm9kZXMsIHBvc2l0aW9uKSB7XG4gICAgdmFyIHBhdGggPSBbXTtcbiAgICB2YXIgdmlzaXRvciA9IG5ldyAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgIF9fZXh0ZW5kcyhjbGFzc18xLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBjbGFzc18xKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzXzEucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICAgICAgdmFyIHNwYW4gPSBzcGFuT2YoYXN0KTtcbiAgICAgICAgICAgIGlmIChzcGFuLnN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgc3Bhbi5lbmQpIHtcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJldHVybmluZyBhIHZhbHVlIGhlcmUgd2lsbCByZXN1bHQgaW4gdGhlIGNoaWxkcmVuIGJlaW5nIHNraXBwZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbGFzc18xO1xuICAgIH0oUmVjdXJzaXZlVmlzaXRvcikpO1xuICAgIHZpc2l0QWxsJDEodmlzaXRvciwgbm9kZXMpO1xuICAgIHJldHVybiBuZXcgQXN0UGF0aChwYXRoLCBwb3NpdGlvbik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBUb2tlblR5cGU7XG4oZnVuY3Rpb24gKFRva2VuVHlwZSkge1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJUQUdfT1BFTl9TVEFSVFwiXSA9IDBdID0gXCJUQUdfT1BFTl9TVEFSVFwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJUQUdfT1BFTl9FTkRcIl0gPSAxXSA9IFwiVEFHX09QRU5fRU5EXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIlRBR19PUEVOX0VORF9WT0lEXCJdID0gMl0gPSBcIlRBR19PUEVOX0VORF9WT0lEXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIlRBR19DTE9TRVwiXSA9IDNdID0gXCJUQUdfQ0xPU0VcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiVEVYVFwiXSA9IDRdID0gXCJURVhUXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkVTQ0FQQUJMRV9SQVdfVEVYVFwiXSA9IDVdID0gXCJFU0NBUEFCTEVfUkFXX1RFWFRcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiUkFXX1RFWFRcIl0gPSA2XSA9IFwiUkFXX1RFWFRcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiQ09NTUVOVF9TVEFSVFwiXSA9IDddID0gXCJDT01NRU5UX1NUQVJUXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkNPTU1FTlRfRU5EXCJdID0gOF0gPSBcIkNPTU1FTlRfRU5EXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkNEQVRBX1NUQVJUXCJdID0gOV0gPSBcIkNEQVRBX1NUQVJUXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkNEQVRBX0VORFwiXSA9IDEwXSA9IFwiQ0RBVEFfRU5EXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkFUVFJfTkFNRVwiXSA9IDExXSA9IFwiQVRUUl9OQU1FXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkFUVFJfUVVPVEVcIl0gPSAxMl0gPSBcIkFUVFJfUVVPVEVcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiQVRUUl9WQUxVRVwiXSA9IDEzXSA9IFwiQVRUUl9WQUxVRVwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJET0NfVFlQRVwiXSA9IDE0XSA9IFwiRE9DX1RZUEVcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiRVhQQU5TSU9OX0ZPUk1fU1RBUlRcIl0gPSAxNV0gPSBcIkVYUEFOU0lPTl9GT1JNX1NUQVJUXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkVYUEFOU0lPTl9DQVNFX1ZBTFVFXCJdID0gMTZdID0gXCJFWFBBTlNJT05fQ0FTRV9WQUxVRVwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJFWFBBTlNJT05fQ0FTRV9FWFBfU1RBUlRcIl0gPSAxN10gPSBcIkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVFwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJFWFBBTlNJT05fQ0FTRV9FWFBfRU5EXCJdID0gMThdID0gXCJFWFBBTlNJT05fQ0FTRV9FWFBfRU5EXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkVYUEFOU0lPTl9GT1JNX0VORFwiXSA9IDE5XSA9IFwiRVhQQU5TSU9OX0ZPUk1fRU5EXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkVPRlwiXSA9IDIwXSA9IFwiRU9GXCI7XG59KShUb2tlblR5cGUgfHwgKFRva2VuVHlwZSA9IHt9KSk7XG52YXIgVG9rZW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVG9rZW4odHlwZSwgcGFydHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IHBhcnRzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICByZXR1cm4gVG9rZW47XG59KCkpO1xudmFyIFRva2VuRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRva2VuRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVG9rZW5FcnJvcihlcnJvck1zZywgdG9rZW5UeXBlLCBzcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNwYW4sIGVycm9yTXNnKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50b2tlblR5cGUgPSB0b2tlblR5cGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRva2VuRXJyb3I7XG59KFBhcnNlRXJyb3IpKTtcbnZhciBUb2tlbml6ZVJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb2tlbml6ZVJlc3VsdCh0b2tlbnMsIGVycm9ycykge1xuICAgICAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICAgIHJldHVybiBUb2tlbml6ZVJlc3VsdDtcbn0oKSk7XG5mdW5jdGlvbiB0b2tlbml6ZShzb3VyY2UsIHVybCwgZ2V0VGFnRGVmaW5pdGlvbiwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgcmV0dXJuIG5ldyBfVG9rZW5pemVyKG5ldyBQYXJzZVNvdXJjZUZpbGUoc291cmNlLCB1cmwpLCBnZXRUYWdEZWZpbml0aW9uLCBvcHRpb25zKS50b2tlbml6ZSgpO1xufVxudmFyIF9DUl9PUl9DUkxGX1JFR0VYUCA9IC9cXHJcXG4/L2c7XG5mdW5jdGlvbiBfdW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKGNoYXJDb2RlKSB7XG4gICAgdmFyIGNoYXIgPSBjaGFyQ29kZSA9PT0gJEVPRiA/ICdFT0YnIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgcmV0dXJuIFwiVW5leHBlY3RlZCBjaGFyYWN0ZXIgXFxcIlwiICsgY2hhciArIFwiXFxcIlwiO1xufVxuZnVuY3Rpb24gX3Vua25vd25FbnRpdHlFcnJvck1zZyhlbnRpdHlTcmMpIHtcbiAgICByZXR1cm4gXCJVbmtub3duIGVudGl0eSBcXFwiXCIgKyBlbnRpdHlTcmMgKyBcIlxcXCIgLSB1c2UgdGhlIFxcXCImIzxkZWNpbWFsPjtcXFwiIG9yICBcXFwiJiN4PGhleD47XFxcIiBzeW50YXhcIjtcbn1cbnZhciBfQ29udHJvbEZsb3dFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfQ29udHJvbEZsb3dFcnJvcihlcnJvcikge1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBfQ29udHJvbEZsb3dFcnJvcjtcbn0oKSk7XG4vLyBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUxL3N5bnRheC5odG1sI3dyaXRpbmdcbnZhciBfVG9rZW5pemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfZmlsZSBUaGUgaHRtbCBzb3VyY2UgZmlsZSBiZWluZyB0b2tlbml6ZWQuXG4gICAgICogQHBhcmFtIF9nZXRUYWdEZWZpbml0aW9uIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHJldHJpZXZlIGEgdGFnIGRlZmluaXRpb24gZm9yIGEgZ2l2ZW4gdGFnIG5hbWUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvZiB0aGUgdG9rZW5pemF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIF9Ub2tlbml6ZXIoX2ZpbGUsIF9nZXRUYWdEZWZpbml0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2dldFRhZ0RlZmluaXRpb24gPSBfZ2V0VGFnRGVmaW5pdGlvbjtcbiAgICAgICAgdGhpcy5fY3VycmVudFRva2VuU3RhcnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrID0gW107XG4gICAgICAgIHRoaXMuX2luSW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRva2VucyA9IFtdO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLl90b2tlbml6ZUljdSA9IG9wdGlvbnMudG9rZW5pemVFeHBhbnNpb25Gb3JtcyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyA9IG9wdGlvbnMuaW50ZXJwb2xhdGlvbkNvbmZpZyB8fCBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHO1xuICAgICAgICB0aGlzLl9sZWFkaW5nVHJpdmlhQ29kZVBvaW50cyA9XG4gICAgICAgICAgICBvcHRpb25zLmxlYWRpbmdUcml2aWFDaGFycyAmJiBvcHRpb25zLmxlYWRpbmdUcml2aWFDaGFycy5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMuY29kZVBvaW50QXQoMCkgfHwgMDsgfSk7XG4gICAgICAgIHZhciByYW5nZSA9IG9wdGlvbnMucmFuZ2UgfHwgeyBlbmRQb3M6IF9maWxlLmNvbnRlbnQubGVuZ3RoLCBzdGFydFBvczogMCwgc3RhcnRMaW5lOiAwLCBzdGFydENvbDogMCB9O1xuICAgICAgICB0aGlzLl9jdXJzb3IgPSBvcHRpb25zLmVzY2FwZWRTdHJpbmcgPyBuZXcgRXNjYXBlZENoYXJhY3RlckN1cnNvcihfZmlsZSwgcmFuZ2UpIDpcbiAgICAgICAgICAgIG5ldyBQbGFpbkNoYXJhY3RlckN1cnNvcihfZmlsZSwgcmFuZ2UpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbVxuICAgICAgICAvLyBJbiBvcmRlciB0byBrZWVwIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpbiB0aGUgc291cmNlLCB3ZSBjYW4gbm90XG4gICAgICAgIC8vIHByZS1wcm9jZXNzIGl0LlxuICAgICAgICAvLyBJbnN0ZWFkIENScyBhcmUgcHJvY2Vzc2VkIHJpZ2h0IGJlZm9yZSBpbnN0YW50aWF0aW5nIHRoZSB0b2tlbnMuXG4gICAgICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoX0NSX09SX0NSTEZfUkVHRVhQLCAnXFxuJyk7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnNvci5wZWVrKCkgIT09ICRFT0YpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuX2N1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRMVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkQkFORykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdHRlbXB0Q2hhckNvZGUoJExCUkFDS0VUKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDZGF0YShzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9hdHRlbXB0Q2hhckNvZGUoJE1JTlVTKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDb21tZW50KHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVEb2NUeXBlKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9hdHRlbXB0Q2hhckNvZGUoJFNMQVNIKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZVRhZ0Nsb3NlKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghKHRoaXMuX3Rva2VuaXplSWN1ICYmIHRoaXMuX3Rva2VuaXplRXhwYW5zaW9uRm9ybSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lVGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5FT0YpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgIHJldHVybiBuZXcgVG9rZW5pemVSZXN1bHQobWVyZ2VUZXh0VG9rZW5zKHRoaXMudG9rZW5zKSwgdGhpcy5lcnJvcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgd2hldGhlciBhbiBJQ1UgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZFxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl90b2tlbml6ZUV4cGFuc2lvbkZvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRXhwYW5zaW9uRm9ybVN0YXJ0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVFeHBhbnNpb25Gb3JtU3RhcnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0V4cGFuc2lvbkNhc2VTdGFydCh0aGlzLl9jdXJzb3IucGVlaygpKSAmJiB0aGlzLl9pc0luRXhwYW5zaW9uRm9ybSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25zdW1lRXhwYW5zaW9uQ2FzZVN0YXJ0KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3Vyc29yLnBlZWsoKSA9PT0gJFJCUkFDRSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5FeHBhbnNpb25DYXNlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lRXhwYW5zaW9uQ2FzZUVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5FeHBhbnNpb25Gb3JtKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lRXhwYW5zaW9uRm9ybUVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9iZWdpblRva2VuID0gZnVuY3Rpb24gKHR5cGUsIHN0YXJ0KSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7IHN0YXJ0ID0gdGhpcy5fY3Vyc29yLmNsb25lKCk7IH1cbiAgICAgICAgdGhpcy5fY3VycmVudFRva2VuU3RhcnQgPSBzdGFydDtcbiAgICAgICAgdGhpcy5fY3VycmVudFRva2VuVHlwZSA9IHR5cGU7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fZW5kVG9rZW4gPSBmdW5jdGlvbiAocGFydHMsIGVuZCkge1xuICAgICAgICBpZiAoZW5kID09PSB2b2lkIDApIHsgZW5kID0gdGhpcy5fY3Vyc29yLmNsb25lKCk7IH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb2tlblN0YXJ0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9rZW5FcnJvcignUHJvZ3JhbW1pbmcgZXJyb3IgLSBhdHRlbXB0ZWQgdG8gZW5kIGEgdG9rZW4gd2hlbiB0aGVyZSB3YXMgbm8gc3RhcnQgdG8gdGhlIHRva2VuJywgdGhpcy5fY3VycmVudFRva2VuVHlwZSwgdGhpcy5fY3Vyc29yLmdldFNwYW4oZW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb2tlblR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUb2tlbkVycm9yKCdQcm9ncmFtbWluZyBlcnJvciAtIGF0dGVtcHRlZCB0byBlbmQgYSB0b2tlbiB3aGljaCBoYXMgbm8gdG9rZW4gdHlwZScsIG51bGwsIHRoaXMuX2N1cnNvci5nZXRTcGFuKHRoaXMuX2N1cnJlbnRUb2tlblN0YXJ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRva2VuID0gbmV3IFRva2VuKHRoaXMuX2N1cnJlbnRUb2tlblR5cGUsIHBhcnRzLCB0aGlzLl9jdXJzb3IuZ2V0U3Bhbih0aGlzLl9jdXJyZW50VG9rZW5TdGFydCwgdGhpcy5fbGVhZGluZ1RyaXZpYUNvZGVQb2ludHMpKTtcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb2tlblN0YXJ0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFRva2VuVHlwZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jcmVhdGVFcnJvciA9IGZ1bmN0aW9uIChtc2csIHNwYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5FeHBhbnNpb25Gb3JtKCkpIHtcbiAgICAgICAgICAgIG1zZyArPSBcIiAoRG8geW91IGhhdmUgYW4gdW5lc2NhcGVkIFxcXCJ7XFxcIiBpbiB5b3VyIHRlbXBsYXRlPyBVc2UgXFxcInt7ICd7JyB9fVxcXCIpIHRvIGVzY2FwZSBpdC4pXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gbmV3IFRva2VuRXJyb3IobXNnLCB0aGlzLl9jdXJyZW50VG9rZW5UeXBlLCBzcGFuKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRva2VuU3RhcnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIG5ldyBfQ29udHJvbEZsb3dFcnJvcihlcnJvcik7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ3Vyc29yRXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSB0aGlzLl9jcmVhdGVFcnJvcihlLm1zZywgdGhpcy5fY3Vyc29yLmdldFNwYW4oZS5jdXJzb3IpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIF9Db250cm9sRmxvd0Vycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGUuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2F0dGVtcHRDaGFyQ29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICAgICAgICBpZiAodGhpcy5fY3Vyc29yLnBlZWsoKSA9PT0gY2hhckNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnNvci5hZHZhbmNlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYXR0ZW1wdENoYXJDb2RlQ2FzZUluc2Vuc2l0aXZlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gICAgICAgIGlmIChjb21wYXJlQ2hhckNvZGVDYXNlSW5zZW5zaXRpdmUodGhpcy5fY3Vyc29yLnBlZWsoKSwgY2hhckNvZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJzb3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX3JlcXVpcmVDaGFyQ29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICAgICAgICB2YXIgbG9jYXRpb24gPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhckNvZGUoY2hhckNvZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcihfdW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMuX2N1cnNvci5wZWVrKCkpLCB0aGlzLl9jdXJzb3IuZ2V0U3Bhbihsb2NhdGlvbikpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYXR0ZW1wdFN0ciA9IGZ1bmN0aW9uIChjaGFycykge1xuICAgICAgICB2YXIgbGVuID0gY2hhcnMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fY3Vyc29yLmNoYXJzTGVmdCgpIDwgbGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluaXRpYWxQb3NpdGlvbiA9IHRoaXMuX2N1cnNvci5jbG9uZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2F0dGVtcHRDaGFyQ29kZShjaGFycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGF0dGVtcHRpbmcgdG8gcGFyc2UgdGhlIHN0cmluZyBmYWlscywgd2Ugd2FudCB0byByZXNldCB0aGUgcGFyc2VyXG4gICAgICAgICAgICAgICAgLy8gdG8gd2hlcmUgaXQgd2FzIGJlZm9yZSB0aGUgYXR0ZW1wdFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IGluaXRpYWxQb3NpdGlvbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYXR0ZW1wdFN0ckNhc2VJbnNlbnNpdGl2ZSA9IGZ1bmN0aW9uIChjaGFycykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2F0dGVtcHRDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZShjaGFycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9yZXF1aXJlU3RyID0gZnVuY3Rpb24gKGNoYXJzKSB7XG4gICAgICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2N1cnNvci5jbG9uZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX2F0dGVtcHRTdHIoY2hhcnMpKSB7XG4gICAgICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcihfdW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMuX2N1cnNvci5wZWVrKCkpLCB0aGlzLl9jdXJzb3IuZ2V0U3Bhbihsb2NhdGlvbikpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbiA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHtcbiAgICAgICAgd2hpbGUgKCFwcmVkaWNhdGUodGhpcy5fY3Vyc29yLnBlZWsoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnNvci5hZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9yZXF1aXJlQ2hhckNvZGVVbnRpbEZuID0gZnVuY3Rpb24gKHByZWRpY2F0ZSwgbGVuKSB7XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuX2N1cnNvci5jbG9uZSgpO1xuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKHByZWRpY2F0ZSk7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgaWYgKGVuZC5kaWZmKHN0YXJ0KSA8IGxlbikge1xuICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3VuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLl9jdXJzb3IucGVlaygpKSwgdGhpcy5fY3Vyc29yLmdldFNwYW4oc3RhcnQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2F0dGVtcHRVbnRpbENoYXIgPSBmdW5jdGlvbiAoY2hhcikge1xuICAgICAgICB3aGlsZSAodGhpcy5fY3Vyc29yLnBlZWsoKSAhPT0gY2hhcikge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX3JlYWRDaGFyID0gZnVuY3Rpb24gKGRlY29kZUVudGl0aWVzKSB7XG4gICAgICAgIGlmIChkZWNvZGVFbnRpdGllcyAmJiB0aGlzLl9jdXJzb3IucGVlaygpID09PSAkQU1QRVJTQU5EKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlRW50aXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBEb24ndCByZWx5IHVwb24gcmVhZGluZyBkaXJlY3RseSBmcm9tIGBfaW5wdXRgIGFzIHRoZSBhY3R1YWwgY2hhciB2YWx1ZVxuICAgICAgICAgICAgLy8gbWF5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSBhbiBlc2NhcGUgc2VxdWVuY2UuXG4gICAgICAgICAgICB2YXIgY2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KHRoaXMuX2N1cnNvci5wZWVrKCkpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHJldHVybiBjaGFyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fZGVjb2RlRW50aXR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgaWYgKHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkSEFTSCkpIHtcbiAgICAgICAgICAgIHZhciBpc0hleCA9IHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkeCkgfHwgdGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRYKTtcbiAgICAgICAgICAgIHZhciBjb2RlU3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNEaWdpdEVudGl0eUVuZCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yLnBlZWsoKSAhPSAkU0VNSUNPTE9OKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3VuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLl9jdXJzb3IucGVlaygpKSwgdGhpcy5fY3Vyc29yLmdldFNwYW4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3RyTnVtID0gdGhpcy5fY3Vyc29yLmdldENoYXJzKGNvZGVTdGFydCk7XG4gICAgICAgICAgICB0aGlzLl9jdXJzb3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgY2hhckNvZGUgPSBwYXJzZUludChzdHJOdW0sIGlzSGV4ID8gMTYgOiAxMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IoX3Vua25vd25FbnRpdHlFcnJvck1zZyh0aGlzLl9jdXJzb3IuZ2V0Q2hhcnMoc3RhcnQpKSwgdGhpcy5fY3Vyc29yLmdldFNwYW4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbmFtZVN0YXJ0ID0gdGhpcy5fY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTmFtZWRFbnRpdHlFbmQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnNvci5wZWVrKCkgIT0gJFNFTUlDT0xPTikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IG5hbWVTdGFydDtcbiAgICAgICAgICAgICAgICByZXR1cm4gJyYnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHRoaXMuX2N1cnNvci5nZXRDaGFycyhuYW1lU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHZhciBjaGFyID0gTkFNRURfRU5USVRJRVNbbmFtZV8xXTtcbiAgICAgICAgICAgIGlmICghY2hhcikge1xuICAgICAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmtub3duRW50aXR5RXJyb3JNc2cobmFtZV8xKSwgdGhpcy5fY3Vyc29yLmdldFNwYW4oc3RhcnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjaGFyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZVJhd1RleHQgPSBmdW5jdGlvbiAoZGVjb2RlRW50aXRpZXMsIGVuZE1hcmtlclByZWRpY2F0ZSkge1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKGRlY29kZUVudGl0aWVzID8gVG9rZW5UeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCA6IFRva2VuVHlwZS5SQVdfVEVYVCk7XG4gICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIHRhZ0Nsb3NlU3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgIHZhciBmb3VuZEVuZE1hcmtlciA9IGVuZE1hcmtlclByZWRpY2F0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gdGFnQ2xvc2VTdGFydDtcbiAgICAgICAgICAgIGlmIChmb3VuZEVuZE1hcmtlcikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHMucHVzaCh0aGlzLl9yZWFkQ2hhcihkZWNvZGVFbnRpdGllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyhwYXJ0cy5qb2luKCcnKSldKTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lQ29tbWVudCA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5DT01NRU5UX1NUQVJULCBzdGFydCk7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkTUlOVVMpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgIHRoaXMuX2NvbnN1bWVSYXdUZXh0KGZhbHNlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYXR0ZW1wdFN0cignLS0+Jyk7IH0pO1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5DT01NRU5UX0VORCk7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVTdHIoJy0tPicpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUNkYXRhID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkNEQVRBX1NUQVJULCBzdGFydCk7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVTdHIoJ0NEQVRBWycpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgIHRoaXMuX2NvbnN1bWVSYXdUZXh0KGZhbHNlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYXR0ZW1wdFN0cignXV0+Jyk7IH0pO1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5DREFUQV9FTkQpO1xuICAgICAgICB0aGlzLl9yZXF1aXJlU3RyKCddXT4nKTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVEb2NUeXBlID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkRPQ19UWVBFLCBzdGFydCk7XG4gICAgICAgIHZhciBjb250ZW50U3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsQ2hhcigkR1QpO1xuICAgICAgICB2YXIgY29udGVudCA9IHRoaXMuX2N1cnNvci5nZXRDaGFycyhjb250ZW50U3RhcnQpO1xuICAgICAgICB0aGlzLl9jdXJzb3IuYWR2YW5jZSgpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbY29udGVudF0pO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVQcmVmaXhBbmROYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbmFtZU9yUHJlZml4U3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgdmFyIHByZWZpeCA9ICcnO1xuICAgICAgICB3aGlsZSAodGhpcy5fY3Vyc29yLnBlZWsoKSAhPT0gJENPTE9OICYmICFpc1ByZWZpeEVuZCh0aGlzLl9jdXJzb3IucGVlaygpKSkge1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZVN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5fY3Vyc29yLnBlZWsoKSA9PT0gJENPTE9OKSB7XG4gICAgICAgICAgICBwcmVmaXggPSB0aGlzLl9jdXJzb3IuZ2V0Q2hhcnMobmFtZU9yUHJlZml4U3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIG5hbWVTdGFydCA9IHRoaXMuX2N1cnNvci5jbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmFtZVN0YXJ0ID0gbmFtZU9yUHJlZml4U3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlVW50aWxGbihpc05hbWVFbmQsIHByZWZpeCA9PT0gJycgPyAwIDogMSk7XG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5fY3Vyc29yLmdldENoYXJzKG5hbWVTdGFydCk7XG4gICAgICAgIHJldHVybiBbcHJlZml4LCBuYW1lXTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lVGFnT3BlbiA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICB2YXIgdGFnTmFtZTtcbiAgICAgICAgdmFyIHByZWZpeDtcbiAgICAgICAgdmFyIG9wZW5UYWdUb2tlbjtcbiAgICAgICAgdmFyIHRva2Vuc0JlZm9yZVRhZ09wZW4gPSB0aGlzLnRva2Vucy5sZW5ndGg7XG4gICAgICAgIHZhciBpbm5lclN0YXJ0ID0gdGhpcy5fY3Vyc29yLmNsb25lKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzQXNjaWlMZXR0ZXIodGhpcy5fY3Vyc29yLnBlZWsoKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcihfdW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMuX2N1cnNvci5wZWVrKCkpLCB0aGlzLl9jdXJzb3IuZ2V0U3BhbihzdGFydCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3BlblRhZ1Rva2VuID0gdGhpcy5fY29uc3VtZVRhZ09wZW5TdGFydChzdGFydCk7XG4gICAgICAgICAgICBwcmVmaXggPSBvcGVuVGFnVG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgICB0YWdOYW1lID0gb3BlblRhZ1Rva2VuLnBhcnRzWzFdO1xuICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnNvci5wZWVrKCkgIT09ICRTTEFTSCAmJiB0aGlzLl9jdXJzb3IucGVlaygpICE9PSAkR1QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQXR0cmlidXRlTmFtZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXJDb2RlKCRFUSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQXR0cmlidXRlVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29uc3VtZVRhZ09wZW5FbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBfQ29udHJvbEZsb3dFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YXJ0IHRhZyBpcyBpbnZhbGlkIChpbmNsdWRpbmcgaW52YWxpZCBcImF0dHJpYnV0ZXNcIiksIGFzc3VtZSB3ZSB3YW50IGEgXCI8XCJcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJzb3IgPSBpbm5lclN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChvcGVuVGFnVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMubGVuZ3RoID0gdG9rZW5zQmVmb3JlVGFnT3BlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQmFjayB0byBiYWNrIHRleHQgdG9rZW5zIGFyZSBtZXJnZWQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLlRFWFQsIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmRUb2tlbihbJzwnXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGVudFRva2VuVHlwZSA9IHRoaXMuX2dldFRhZ0RlZmluaXRpb24odGFnTmFtZSkuY29udGVudFR5cGU7XG4gICAgICAgIGlmIChjb250ZW50VG9rZW5UeXBlID09PSBUYWdDb250ZW50VHlwZS5SQVdfVEVYVCkge1xuICAgICAgICAgICAgdGhpcy5fY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UocHJlZml4LCB0YWdOYW1lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudFRva2VuVHlwZSA9PT0gVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShwcmVmaXgsIHRhZ05hbWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UgPSBmdW5jdGlvbiAocHJlZml4LCB0YWdOYW1lLCBkZWNvZGVFbnRpdGllcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdGV4dFRva2VuID0gdGhpcy5fY29uc3VtZVJhd1RleHQoZGVjb2RlRW50aXRpZXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghX3RoaXMuX2F0dGVtcHRDaGFyQ29kZSgkTFQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmICghX3RoaXMuX2F0dGVtcHRDaGFyQ29kZSgkU0xBU0gpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgICBpZiAoIV90aGlzLl9hdHRlbXB0U3RyQ2FzZUluc2Vuc2l0aXZlKHRhZ05hbWUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIF90aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2F0dGVtcHRDaGFyQ29kZSgkR1QpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUuVEFHX0NMT1NFKTtcbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlVW50aWxGbihmdW5jdGlvbiAoY29kZSkgeyByZXR1cm4gY29kZSA9PT0gJEdUOyB9LCAzKTtcbiAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTsgLy8gQ29uc3VtZSB0aGUgYD5gXG4gICAgICAgIHRoaXMuX2VuZFRva2VuKFtwcmVmaXgsIHRhZ05hbWVdKTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lVGFnT3BlblN0YXJ0ID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLlRBR19PUEVOX1NUQVJULCBzdGFydCk7XG4gICAgICAgIHZhciBwYXJ0cyA9IHRoaXMuX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRUb2tlbihwYXJ0cyk7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhdHRyTmFtZVN0YXJ0ID0gdGhpcy5fY3Vyc29yLnBlZWsoKTtcbiAgICAgICAgaWYgKGF0dHJOYW1lU3RhcnQgPT09ICRTUSB8fCBhdHRyTmFtZVN0YXJ0ID09PSAkRFEpIHtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKF91bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2coYXR0ck5hbWVTdGFydCksIHRoaXMuX2N1cnNvci5nZXRTcGFuKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkFUVFJfTkFNRSk7XG4gICAgICAgIHZhciBwcmVmaXhBbmROYW1lID0gdGhpcy5fY29uc3VtZVByZWZpeEFuZE5hbWUoKTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4ocHJlZml4QW5kTmFtZSk7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fY29uc3VtZUF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9jdXJzb3IucGVlaygpID09PSAkU1EgfHwgdGhpcy5fY3Vyc29yLnBlZWsoKSA9PT0gJERRKSB7XG4gICAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5BVFRSX1FVT1RFKTtcbiAgICAgICAgICAgIHZhciBxdW90ZUNoYXIgPSB0aGlzLl9jdXJzb3IucGVlaygpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFtTdHJpbmcuZnJvbUNvZGVQb2ludChxdW90ZUNoYXIpXSk7XG4gICAgICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5BVFRSX1ZBTFVFKTtcbiAgICAgICAgICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2N1cnNvci5wZWVrKCkgIT09IHF1b3RlQ2hhcikge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCcnKTtcbiAgICAgICAgICAgIHRoaXMuX2VuZFRva2VuKFt0aGlzLl9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zKHZhbHVlKV0pO1xuICAgICAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUuQVRUUl9RVU9URSk7XG4gICAgICAgICAgICB0aGlzLl9jdXJzb3IuYWR2YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5fZW5kVG9rZW4oW1N0cmluZy5mcm9tQ29kZVBvaW50KHF1b3RlQ2hhcildKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkFUVFJfVkFMVUUpO1xuICAgICAgICAgICAgdmFyIHZhbHVlU3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZVVudGlsRm4oaXNOYW1lRW5kLCAxKTtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fY3Vyc29yLmdldENoYXJzKHZhbHVlU3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5fZW5kVG9rZW4oW3RoaXMuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnModmFsdWUpXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lVGFnT3BlbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRva2VuVHlwZSA9IHRoaXMuX2F0dGVtcHRDaGFyQ29kZSgkU0xBU0gpID8gVG9rZW5UeXBlLlRBR19PUEVOX0VORF9WT0lEIDogVG9rZW5UeXBlLlRBR19PUEVOX0VORDtcbiAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbih0b2tlblR5cGUpO1xuICAgICAgICB0aGlzLl9yZXF1aXJlQ2hhckNvZGUoJEdUKTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVUYWdDbG9zZSA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5UQUdfQ0xPU0UsIHN0YXJ0KTtcbiAgICAgICAgdGhpcy5fYXR0ZW1wdENoYXJDb2RlVW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICB2YXIgcHJlZml4QW5kTmFtZSA9IHRoaXMuX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk7XG4gICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRHVCk7XG4gICAgICAgIHRoaXMuX2VuZFRva2VuKHByZWZpeEFuZE5hbWUpO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVFeHBhbnNpb25Gb3JtU3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkVYUEFOU0lPTl9GT1JNX1NUQVJUKTtcbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRMQlJBQ0UpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5wdXNoKFRva2VuVHlwZS5FWFBBTlNJT05fRk9STV9TVEFSVCk7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLlJBV19URVhUKTtcbiAgICAgICAgdmFyIGNvbmRpdGlvbiA9IHRoaXMuX3JlYWRVbnRpbCgkQ09NTUEpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbY29uZGl0aW9uXSk7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkQ09NTUEpO1xuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLlJBV19URVhUKTtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLl9yZWFkVW50aWwoJENPTU1BKTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oW3R5cGVdKTtcbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRDT01NQSk7XG4gICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9jb25zdW1lRXhwYW5zaW9uQ2FzZVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5FWFBBTlNJT05fQ0FTRV9WQUxVRSk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3JlYWRVbnRpbCgkTEJSQUNFKS50cmltKCk7XG4gICAgICAgIHRoaXMuX2VuZFRva2VuKFt2YWx1ZV0pO1xuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgIHRoaXMuX2JlZ2luVG9rZW4oVG9rZW5UeXBlLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVCk7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVDaGFyQ29kZSgkTEJSQUNFKTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhckNvZGVVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5wdXNoKFRva2VuVHlwZS5FWFBBTlNJT05fQ0FTRV9FWFBfU1RBUlQpO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVFeHBhbnNpb25DYXNlRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5FWFBBTlNJT05fQ0FTRV9FWFBfRU5EKTtcbiAgICAgICAgdGhpcy5fcmVxdWlyZUNoYXJDb2RlKCRSQlJBQ0UpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgICAgIHRoaXMuX2F0dGVtcHRDaGFyQ29kZVVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLnBvcCgpO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVFeHBhbnNpb25Gb3JtRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9iZWdpblRva2VuKFRva2VuVHlwZS5FWFBBTlNJT05fRk9STV9FTkQpO1xuICAgICAgICB0aGlzLl9yZXF1aXJlQ2hhckNvZGUoJFJCUkFDRSk7XG4gICAgICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgICAgICAgdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLnBvcCgpO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2NvbnN1bWVUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihUb2tlblR5cGUuVEVYVCwgc3RhcnQpO1xuICAgICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgJiYgdGhpcy5fYXR0ZW1wdFN0cih0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnLnN0YXJ0KSkge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZy5zdGFydCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5JbnRlcnBvbGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgJiYgdGhpcy5faW5JbnRlcnBvbGF0aW9uICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fYXR0ZW1wdFN0cih0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnLmVuZCkpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcuZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbkludGVycG9sYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghdGhpcy5faXNUZXh0RW5kKCkpO1xuICAgICAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyhwYXJ0cy5qb2luKCcnKSldKTtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9pc1RleHRFbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJzb3IucGVlaygpID09PSAkTFQgfHwgdGhpcy5fY3Vyc29yLnBlZWsoKSA9PT0gJEVPRikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Rva2VuaXplSWN1ICYmICF0aGlzLl9pbkludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRXhwYW5zaW9uRm9ybVN0YXJ0KCkpIHtcbiAgICAgICAgICAgICAgICAvLyBzdGFydCBvZiBhbiBleHBhbnNpb24gZm9ybVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnNvci5wZWVrKCkgPT09ICRSQlJBQ0UgJiYgdGhpcy5faXNJbkV4cGFuc2lvbkNhc2UoKSkge1xuICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBhbmQgZXhwYW5zaW9uIGNhc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBfVG9rZW5pemVyLnByb3RvdHlwZS5fcmVhZFVudGlsID0gZnVuY3Rpb24gKGNoYXIpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5fY3Vyc29yLmNsb25lKCk7XG4gICAgICAgIHRoaXMuX2F0dGVtcHRVbnRpbENoYXIoY2hhcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJzb3IuZ2V0Q2hhcnMoc3RhcnQpO1xuICAgIH07XG4gICAgX1Rva2VuaXplci5wcm90b3R5cGUuX2lzSW5FeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFja1t0aGlzLl9leHBhbnNpb25DYXNlU3RhY2subGVuZ3RoIC0gMV0gPT09XG4gICAgICAgICAgICAgICAgVG9rZW5UeXBlLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVDtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLl9pc0luRXhwYW5zaW9uRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvbkNhc2VTdGFjay5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICB0aGlzLl9leHBhbnNpb25DYXNlU3RhY2tbdGhpcy5fZXhwYW5zaW9uQ2FzZVN0YWNrLmxlbmd0aCAtIDFdID09PVxuICAgICAgICAgICAgICAgIFRva2VuVHlwZS5FWFBBTlNJT05fRk9STV9TVEFSVDtcbiAgICB9O1xuICAgIF9Ub2tlbml6ZXIucHJvdG90eXBlLmlzRXhwYW5zaW9uRm9ybVN0YXJ0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fY3Vyc29yLnBlZWsoKSAhPT0gJExCUkFDRSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLl9jdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgIHZhciBpc0ludGVycG9sYXRpb24gPSB0aGlzLl9hdHRlbXB0U3RyKHRoaXMuX2ludGVycG9sYXRpb25Db25maWcuc3RhcnQpO1xuICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gc3RhcnQ7XG4gICAgICAgICAgICByZXR1cm4gIWlzSW50ZXJwb2xhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBfVG9rZW5pemVyO1xufSgpKTtcbmZ1bmN0aW9uIGlzTm90V2hpdGVzcGFjZShjb2RlKSB7XG4gICAgcmV0dXJuICFpc1doaXRlc3BhY2UoY29kZSkgfHwgY29kZSA9PT0gJEVPRjtcbn1cbmZ1bmN0aW9uIGlzTmFtZUVuZChjb2RlKSB7XG4gICAgcmV0dXJuIGlzV2hpdGVzcGFjZShjb2RlKSB8fCBjb2RlID09PSAkR1QgfHwgY29kZSA9PT0gJFNMQVNIIHx8XG4gICAgICAgIGNvZGUgPT09ICRTUSB8fCBjb2RlID09PSAkRFEgfHwgY29kZSA9PT0gJEVRO1xufVxuZnVuY3Rpb24gaXNQcmVmaXhFbmQoY29kZSkge1xuICAgIHJldHVybiAoY29kZSA8ICRhIHx8ICR6IDwgY29kZSkgJiYgKGNvZGUgPCAkQSB8fCAkWiA8IGNvZGUpICYmXG4gICAgICAgIChjb2RlIDwgJDAgfHwgY29kZSA+ICQ5KTtcbn1cbmZ1bmN0aW9uIGlzRGlnaXRFbnRpdHlFbmQoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09ICRTRU1JQ09MT04gfHwgY29kZSA9PSAkRU9GIHx8ICFpc0FzY2lpSGV4RGlnaXQoY29kZSk7XG59XG5mdW5jdGlvbiBpc05hbWVkRW50aXR5RW5kKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PSAkU0VNSUNPTE9OIHx8IGNvZGUgPT0gJEVPRiB8fCAhaXNBc2NpaUxldHRlcihjb2RlKTtcbn1cbmZ1bmN0aW9uIGlzRXhwYW5zaW9uQ2FzZVN0YXJ0KHBlZWspIHtcbiAgICByZXR1cm4gcGVlayA9PT0gJEVRIHx8IGlzQXNjaWlMZXR0ZXIocGVlaykgfHwgaXNEaWdpdChwZWVrKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVDaGFyQ29kZUNhc2VJbnNlbnNpdGl2ZShjb2RlMSwgY29kZTIpIHtcbiAgICByZXR1cm4gdG9VcHBlckNhc2VDaGFyQ29kZShjb2RlMSkgPT0gdG9VcHBlckNhc2VDaGFyQ29kZShjb2RlMik7XG59XG5mdW5jdGlvbiB0b1VwcGVyQ2FzZUNoYXJDb2RlKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6ID8gY29kZSAtICRhICsgJEEgOiBjb2RlO1xufVxuZnVuY3Rpb24gbWVyZ2VUZXh0VG9rZW5zKHNyY1Rva2Vucykge1xuICAgIHZhciBkc3RUb2tlbnMgPSBbXTtcbiAgICB2YXIgbGFzdERzdFRva2VuID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3JjVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0b2tlbiA9IHNyY1Rva2Vuc1tpXTtcbiAgICAgICAgaWYgKGxhc3REc3RUb2tlbiAmJiBsYXN0RHN0VG9rZW4udHlwZSA9PSBUb2tlblR5cGUuVEVYVCAmJiB0b2tlbi50eXBlID09IFRva2VuVHlwZS5URVhUKSB7XG4gICAgICAgICAgICBsYXN0RHN0VG9rZW4ucGFydHNbMF0gKz0gdG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgICBsYXN0RHN0VG9rZW4uc291cmNlU3Bhbi5lbmQgPSB0b2tlbi5zb3VyY2VTcGFuLmVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxhc3REc3RUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgZHN0VG9rZW5zLnB1c2gobGFzdERzdFRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZHN0VG9rZW5zO1xufVxudmFyIFBsYWluQ2hhcmFjdGVyQ3Vyc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYWluQ2hhcmFjdGVyQ3Vyc29yKGZpbGVPckN1cnNvciwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKGZpbGVPckN1cnNvciBpbnN0YW5jZW9mIFBsYWluQ2hhcmFjdGVyQ3Vyc29yKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlT3JDdXJzb3IuZmlsZTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBmaWxlT3JDdXJzb3IuaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLmVuZCA9IGZpbGVPckN1cnNvci5lbmQ7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gX19hc3NpZ24oe30sIGZpbGVPckN1cnNvci5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9ncmFtbWluZyBlcnJvcjogdGhlIHJhbmdlIGFyZ3VtZW50IG11c3QgYmUgcHJvdmlkZWQgd2l0aCBhIGZpbGUgYXJndW1lbnQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlT3JDdXJzb3I7XG4gICAgICAgICAgICB0aGlzLmlucHV0ID0gZmlsZU9yQ3Vyc29yLmNvbnRlbnQ7XG4gICAgICAgICAgICB0aGlzLmVuZCA9IHJhbmdlLmVuZFBvcztcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgcGVlazogLTEsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiByYW5nZS5zdGFydFBvcyxcbiAgICAgICAgICAgICAgICBsaW5lOiByYW5nZS5zdGFydExpbmUsXG4gICAgICAgICAgICAgICAgY29sdW1uOiByYW5nZS5zdGFydENvbCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgUGxhaW5DaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFBsYWluQ2hhcmFjdGVyQ3Vyc29yKHRoaXMpOyB9O1xuICAgIFBsYWluQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zdGF0ZS5wZWVrOyB9O1xuICAgIFBsYWluQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5jaGFyc0xlZnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVuZCAtIHRoaXMuc3RhdGUub2Zmc2V0OyB9O1xuICAgIFBsYWluQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5kaWZmID0gZnVuY3Rpb24gKG90aGVyKSB7IHJldHVybiB0aGlzLnN0YXRlLm9mZnNldCAtIG90aGVyLnN0YXRlLm9mZnNldDsgfTtcbiAgICBQbGFpbkNoYXJhY3RlckN1cnNvci5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHsgdGhpcy5hZHZhbmNlU3RhdGUodGhpcy5zdGF0ZSk7IH07XG4gICAgUGxhaW5DaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7IHRoaXMudXBkYXRlUGVlayh0aGlzLnN0YXRlKTsgfTtcbiAgICBQbGFpbkNoYXJhY3RlckN1cnNvci5wcm90b3R5cGUuZ2V0U3BhbiA9IGZ1bmN0aW9uIChzdGFydCwgbGVhZGluZ1RyaXZpYUNvZGVQb2ludHMpIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCB8fCB0aGlzO1xuICAgICAgICBpZiAobGVhZGluZ1RyaXZpYUNvZGVQb2ludHMpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQuY2xvbmUoKTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmRpZmYoc3RhcnQpID4gMCAmJiBsZWFkaW5nVHJpdmlhQ29kZVBvaW50cy5pbmRleE9mKHN0YXJ0LnBlZWsoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RhcnQuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VTb3VyY2VTcGFuKG5ldyBQYXJzZUxvY2F0aW9uKHN0YXJ0LmZpbGUsIHN0YXJ0LnN0YXRlLm9mZnNldCwgc3RhcnQuc3RhdGUubGluZSwgc3RhcnQuc3RhdGUuY29sdW1uKSwgbmV3IFBhcnNlTG9jYXRpb24odGhpcy5maWxlLCB0aGlzLnN0YXRlLm9mZnNldCwgdGhpcy5zdGF0ZS5saW5lLCB0aGlzLnN0YXRlLmNvbHVtbikpO1xuICAgIH07XG4gICAgUGxhaW5DaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLmdldENoYXJzID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydC5zdGF0ZS5vZmZzZXQsIHRoaXMuc3RhdGUub2Zmc2V0KTtcbiAgICB9O1xuICAgIFBsYWluQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5jaGFyQXQgPSBmdW5jdGlvbiAocG9zKSB7IHJldHVybiB0aGlzLmlucHV0LmNoYXJDb2RlQXQocG9zKTsgfTtcbiAgICBQbGFpbkNoYXJhY3RlckN1cnNvci5wcm90b3R5cGUuYWR2YW5jZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPj0gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXJzb3JFcnJvcignVW5leHBlY3RlZCBjaGFyYWN0ZXIgXCJFT0ZcIicsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJyZW50Q2hhciA9IHRoaXMuY2hhckF0KHN0YXRlLm9mZnNldCk7XG4gICAgICAgIGlmIChjdXJyZW50Q2hhciA9PT0gJExGKSB7XG4gICAgICAgICAgICBzdGF0ZS5saW5lKys7XG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc05ld0xpbmUoY3VycmVudENoYXIpKSB7XG4gICAgICAgICAgICBzdGF0ZS5jb2x1bW4rKztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5vZmZzZXQrKztcbiAgICAgICAgdGhpcy51cGRhdGVQZWVrKHN0YXRlKTtcbiAgICB9O1xuICAgIFBsYWluQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS51cGRhdGVQZWVrID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHN0YXRlLnBlZWsgPSBzdGF0ZS5vZmZzZXQgPj0gdGhpcy5lbmQgPyAkRU9GIDogdGhpcy5jaGFyQXQoc3RhdGUub2Zmc2V0KTtcbiAgICB9O1xuICAgIHJldHVybiBQbGFpbkNoYXJhY3RlckN1cnNvcjtcbn0oKSk7XG52YXIgRXNjYXBlZENoYXJhY3RlckN1cnNvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRXNjYXBlZENoYXJhY3RlckN1cnNvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFc2NhcGVkQ2hhcmFjdGVyQ3Vyc29yKGZpbGVPckN1cnNvciwgcmFuZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGZpbGVPckN1cnNvciBpbnN0YW5jZW9mIEVzY2FwZWRDaGFyYWN0ZXJDdXJzb3IpIHtcbiAgICAgICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZmlsZU9yQ3Vyc29yKSB8fCB0aGlzO1xuICAgICAgICAgICAgX3RoaXMuaW50ZXJuYWxTdGF0ZSA9IF9fYXNzaWduKHt9LCBmaWxlT3JDdXJzb3IuaW50ZXJuYWxTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZpbGVPckN1cnNvciwgcmFuZ2UpIHx8IHRoaXM7XG4gICAgICAgICAgICBfdGhpcy5pbnRlcm5hbFN0YXRlID0gX3RoaXMuc3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFc2NhcGVkQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5pbnRlcm5hbFN0YXRlO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmFkdmFuY2UuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzRXNjYXBlU2VxdWVuY2UoKTtcbiAgICB9O1xuICAgIEVzY2FwZWRDaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuaW5pdC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnByb2Nlc3NFc2NhcGVTZXF1ZW5jZSgpO1xuICAgIH07XG4gICAgRXNjYXBlZENoYXJhY3RlckN1cnNvci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRXNjYXBlZENoYXJhY3RlckN1cnNvcih0aGlzKTsgfTtcbiAgICBFc2NhcGVkQ2hhcmFjdGVyQ3Vyc29yLnByb3RvdHlwZS5nZXRDaGFycyA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICB2YXIgY3Vyc29yID0gc3RhcnQuY2xvbmUoKTtcbiAgICAgICAgdmFyIGNoYXJzID0gJyc7XG4gICAgICAgIHdoaWxlIChjdXJzb3IuaW50ZXJuYWxTdGF0ZS5vZmZzZXQgPCB0aGlzLmludGVybmFsU3RhdGUub2Zmc2V0KSB7XG4gICAgICAgICAgICBjaGFycyArPSBTdHJpbmcuZnJvbUNvZGVQb2ludChjdXJzb3IucGVlaygpKTtcbiAgICAgICAgICAgIGN1cnNvci5hZHZhbmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgZXNjYXBlIHNlcXVlbmNlIHRoYXQgc3RhcnRzIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0ZXh0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGBwZWVrYCBoYXMgdGhlIHVuZXNjYXBlZCB2YWx1ZSBvZiBlc2NhcGUgc2VxdWVuY2VzLlxuICAgICAqL1xuICAgIEVzY2FwZWRDaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLnByb2Nlc3NFc2NhcGVTZXF1ZW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHBlZWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5pbnRlcm5hbFN0YXRlLnBlZWs7IH07XG4gICAgICAgIGlmIChwZWVrKCkgPT09ICRCQUNLU0xBU0gpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgaGl0IGFuIGVzY2FwZSBzZXF1ZW5jZSBzbyB3ZSBuZWVkIHRoZSBpbnRlcm5hbCBzdGF0ZSB0byBiZWNvbWUgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgIC8vIG9mIHRoZSBleHRlcm5hbCBzdGF0ZS5cbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTdGF0ZSA9IF9fYXNzaWduKHt9LCB0aGlzLnN0YXRlKTtcbiAgICAgICAgICAgIC8vIE1vdmUgcGFzdCB0aGUgYmFja3NsYXNoXG4gICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGF0ZSh0aGlzLmludGVybmFsU3RhdGUpO1xuICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIHN0YW5kYXJkIGNvbnRyb2wgY2hhciBzZXF1ZW5jZXNcbiAgICAgICAgICAgIGlmIChwZWVrKCkgPT09ICRuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZWVrID0gJExGO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGVlaygpID09PSAkcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucGVlayA9ICRDUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBlZWsoKSA9PT0gJHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnBlZWsgPSAkVlRBQjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBlZWsoKSA9PT0gJHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnBlZWsgPSAkVEFCO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGVlaygpID09PSAkYikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucGVlayA9ICRCU1BBQ0U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwZWVrKCkgPT09ICRmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZWVrID0gJEZGO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm93IGNvbnNpZGVyIG1vcmUgY29tcGxleCBzZXF1ZW5jZXNcbiAgICAgICAgICAgIGVsc2UgaWYgKHBlZWsoKSA9PT0gJHUpIHtcbiAgICAgICAgICAgICAgICAvLyBVbmljb2RlIGNvZGUtcG9pbnQgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGF0ZSh0aGlzLmludGVybmFsU3RhdGUpOyAvLyBhZHZhbmNlIHBhc3QgdGhlIGB1YCBjaGFyXG4gICAgICAgICAgICAgICAgaWYgKHBlZWsoKSA9PT0gJExCUkFDRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBWYXJpYWJsZSBsZW5ndGggVW5pY29kZSwgZS5nLiBgXFx4ezEyM31gXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZVN0YXRlKHRoaXMuaW50ZXJuYWxTdGF0ZSk7IC8vIGFkdmFuY2UgcGFzdCB0aGUgYHtgIGNoYXJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoZSB2YXJpYWJsZSBudW1iZXIgb2YgaGV4IGRpZ2l0cyB1bnRpbCB3ZSBoaXQgYSBgfWAgY2hhclxuICAgICAgICAgICAgICAgICAgICB2YXIgZGlnaXRTdGFydCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aF8xID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBlZWsoKSAhPT0gJFJCUkFDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlU3RhdGUodGhpcy5pbnRlcm5hbFN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF8xKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZWVrID0gdGhpcy5kZWNvZGVIZXhEaWdpdHMoZGlnaXRTdGFydCwgbGVuZ3RoXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRml4ZWQgbGVuZ3RoIFVuaWNvZGUsIGUuZy4gYFxcdTEyMzRgXG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWdpdFN0YXJ0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGF0ZSh0aGlzLmludGVybmFsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGF0ZSh0aGlzLmludGVybmFsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2VTdGF0ZSh0aGlzLmludGVybmFsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnBlZWsgPSB0aGlzLmRlY29kZUhleERpZ2l0cyhkaWdpdFN0YXJ0LCA0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwZWVrKCkgPT09ICR4KSB7XG4gICAgICAgICAgICAgICAgLy8gSGV4IGNoYXIgY29kZSwgZS5nLiBgXFx4MkZgXG4gICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlU3RhdGUodGhpcy5pbnRlcm5hbFN0YXRlKTsgLy8gYWR2YW5jZSBwYXN0IHRoZSBgeGAgY2hhclxuICAgICAgICAgICAgICAgIHZhciBkaWdpdFN0YXJ0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZVN0YXRlKHRoaXMuaW50ZXJuYWxTdGF0ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZWVrID0gdGhpcy5kZWNvZGVIZXhEaWdpdHMoZGlnaXRTdGFydCwgMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09jdGFsRGlnaXQocGVlaygpKSkge1xuICAgICAgICAgICAgICAgIC8vIE9jdGFsIGNoYXIgY29kZSwgZS5nLiBgXFwwMTJgLFxuICAgICAgICAgICAgICAgIHZhciBvY3RhbCA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGhfMiA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpc09jdGFsRGlnaXQocGVlaygpKSAmJiBsZW5ndGhfMiA8IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIG9jdGFsICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KHBlZWsoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZVN0YXRlKHRoaXMuaW50ZXJuYWxTdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aF8yKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUucGVlayA9IHBhcnNlSW50KG9jdGFsLCA4KTtcbiAgICAgICAgICAgICAgICAvLyBCYWNrdXAgb25lIGNoYXJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU3RhdGUgPSBwcmV2aW91cy5pbnRlcm5hbFN0YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNOZXdMaW5lKHRoaXMuaW50ZXJuYWxTdGF0ZS5wZWVrKSkge1xuICAgICAgICAgICAgICAgIC8vIExpbmUgY29udGludWF0aW9uIGBcXGAgZm9sbG93ZWQgYnkgYSBuZXcgbGluZVxuICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZVN0YXRlKHRoaXMuaW50ZXJuYWxTdGF0ZSk7IC8vIGFkdmFuY2Ugb3ZlciB0aGUgbmV3bGluZVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmludGVybmFsU3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBgaWZgIGJsb2NrcyB3ZXJlIGV4ZWN1dGVkIHRoZW4gd2UganVzdCBoYXZlIGFuIGVzY2FwZWQgbm9ybWFsIGNoYXJhY3Rlci5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGF0IGNhc2Ugd2UganVzdCwgZWZmZWN0aXZlbHksIHNraXAgdGhlIGJhY2tzbGFzaCBmcm9tIHRoZSBjaGFyYWN0ZXIuXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5wZWVrID0gdGhpcy5pbnRlcm5hbFN0YXRlLnBlZWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEVzY2FwZWRDaGFyYWN0ZXJDdXJzb3IucHJvdG90eXBlLmRlY29kZUhleERpZ2l0cyA9IGZ1bmN0aW9uIChzdGFydCwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBoZXggPSB0aGlzLmlucHV0LnN1YnN0cihzdGFydC5pbnRlcm5hbFN0YXRlLm9mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgdmFyIGNoYXJDb2RlID0gcGFyc2VJbnQoaGV4LCAxNik7XG4gICAgICAgIGlmICghaXNOYU4oY2hhckNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydC5zdGF0ZSA9IHN0YXJ0LmludGVybmFsU3RhdGU7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3Vyc29yRXJyb3IoJ0ludmFsaWQgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlJywgc3RhcnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gRXNjYXBlZENoYXJhY3RlckN1cnNvcjtcbn0oUGxhaW5DaGFyYWN0ZXJDdXJzb3IpKTtcbnZhciBDdXJzb3JFcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDdXJzb3JFcnJvcihtc2csIGN1cnNvcikge1xuICAgICAgICB0aGlzLm1zZyA9IG1zZztcbiAgICAgICAgdGhpcy5jdXJzb3IgPSBjdXJzb3I7XG4gICAgfVxuICAgIHJldHVybiBDdXJzb3JFcnJvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBUcmVlRXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRyZWVFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUcmVlRXJyb3IoZWxlbWVudE5hbWUsIHNwYW4sIG1zZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBtc2cpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVHJlZUVycm9yLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbGVtZW50TmFtZSwgc3BhbiwgbXNnKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJlZUVycm9yKGVsZW1lbnROYW1lLCBzcGFuLCBtc2cpO1xuICAgIH07XG4gICAgcmV0dXJuIFRyZWVFcnJvcjtcbn0oUGFyc2VFcnJvcikpO1xudmFyIFBhcnNlVHJlZVJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQYXJzZVRyZWVSZXN1bHQocm9vdE5vZGVzLCBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5yb290Tm9kZXMgPSByb290Tm9kZXM7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICByZXR1cm4gUGFyc2VUcmVlUmVzdWx0O1xufSgpKTtcbnZhciBQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VyKGdldFRhZ0RlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5nZXRUYWdEZWZpbml0aW9uID0gZ2V0VGFnRGVmaW5pdGlvbjtcbiAgICB9XG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHVybCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdG9rZW5zQW5kRXJyb3JzID0gdG9rZW5pemUoc291cmNlLCB1cmwsIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgIHZhciB0cmVlQW5kRXJyb3JzID0gbmV3IF9UcmVlQnVpbGRlcih0b2tlbnNBbmRFcnJvcnMudG9rZW5zLCB0aGlzLmdldFRhZ0RlZmluaXRpb24pLmJ1aWxkKCk7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VUcmVlUmVzdWx0KHRyZWVBbmRFcnJvcnMucm9vdE5vZGVzLCB0b2tlbnNBbmRFcnJvcnMuZXJyb3JzLmNvbmNhdCh0cmVlQW5kRXJyb3JzLmVycm9ycykpO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcnNlcjtcbn0oKSk7XG52YXIgX1RyZWVCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIF9UcmVlQnVpbGRlcih0b2tlbnMsIGdldFRhZ0RlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgICAgIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbiA9IGdldFRhZ0RlZmluaXRpb247XG4gICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlcyA9IFtdO1xuICAgICAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrID0gW107XG4gICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICB9XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuX3BlZWsudHlwZSAhPT0gVG9rZW5UeXBlLkVPRikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLlRBR19PUEVOX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZVN0YXJ0VGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5UQUdfQ0xPU0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lRW5kVGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5DREFUQV9TVEFSVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlVm9pZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQ2RhdGEodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLkNPTU1FTlRfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZVZvaWRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZUNvbW1lbnQodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLlRFWFQgfHwgdGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUuUkFXX1RFWFQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5FU0NBUEFCTEVfUkFXX1RFWFQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZVZvaWRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZVRleHQodGhpcy5fYWR2YW5jZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLkVYUEFOU0lPTl9GT1JNX1NUQVJUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc3VtZUV4cGFuc2lvbih0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgb3RoZXIgdG9rZW5zLi4uXG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VUcmVlUmVzdWx0KHRoaXMuX3Jvb3ROb2RlcywgdGhpcy5fZXJyb3JzKTtcbiAgICB9O1xuICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2FkdmFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2ID0gdGhpcy5fcGVlaztcbiAgICAgICAgaWYgKHRoaXMuX2luZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgLy8gTm90ZTogdGhlcmUgaXMgYWx3YXlzIGFuIEVPRiB0b2tlbiBhdCB0aGUgZW5kXG4gICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlZWsgPSB0aGlzLnRva2Vuc1t0aGlzLl9pbmRleF07XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fYWR2YW5jZUlmID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2NvbnN1bWVDZGF0YSA9IGZ1bmN0aW9uIChzdGFydFRva2VuKSB7XG4gICAgICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICAgIHRoaXMuX2FkdmFuY2VJZihUb2tlblR5cGUuQ0RBVEFfRU5EKTtcbiAgICB9O1xuICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2NvbnN1bWVDb21tZW50ID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5fYWR2YW5jZUlmKFRva2VuVHlwZS5SQVdfVEVYVCk7XG4gICAgICAgIHRoaXMuX2FkdmFuY2VJZihUb2tlblR5cGUuQ09NTUVOVF9FTkQpO1xuICAgICAgICB2YXIgdmFsdWUgPSB0ZXh0ICE9IG51bGwgPyB0ZXh0LnBhcnRzWzBdLnRyaW0oKSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5ldyBDb21tZW50KHZhbHVlLCB0b2tlbi5zb3VyY2VTcGFuKSk7XG4gICAgfTtcbiAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9jb25zdW1lRXhwYW5zaW9uID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBzd2l0Y2hWYWx1ZSA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgIHZhciBjYXNlcyA9IFtdO1xuICAgICAgICAvLyByZWFkID1cbiAgICAgICAgd2hpbGUgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLkVYUEFOU0lPTl9DQVNFX1ZBTFVFKSB7XG4gICAgICAgICAgICB2YXIgZXhwQ2FzZSA9IHRoaXMuX3BhcnNlRXhwYW5zaW9uQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKCFleHBDYXNlKVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gZXJyb3JcbiAgICAgICAgICAgIGNhc2VzLnB1c2goZXhwQ2FzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZCB0aGUgZmluYWwgfVxuICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlICE9PSBUb2tlblR5cGUuRVhQQU5TSU9OX0ZPUk1fRU5EKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKG51bGwsIHRoaXMuX3BlZWsuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd9Jy5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3Bhbih0b2tlbi5zb3VyY2VTcGFuLnN0YXJ0LCB0aGlzLl9wZWVrLnNvdXJjZVNwYW4uZW5kKTtcbiAgICAgICAgdGhpcy5fYWRkVG9QYXJlbnQobmV3IEV4cGFuc2lvbihzd2l0Y2hWYWx1ZS5wYXJ0c1swXSwgdHlwZS5wYXJ0c1swXSwgY2FzZXMsIHNvdXJjZVNwYW4sIHN3aXRjaFZhbHVlLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fcGFyc2VFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgIC8vIHJlYWQge1xuICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlICE9PSBUb2tlblR5cGUuRVhQQU5TSU9OX0NBU0VfRVhQX1NUQVJUKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKG51bGwsIHRoaXMuX3BlZWsuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd7Jy5cIikpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZCB1bnRpbCB9XG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgdmFyIGV4cCA9IHRoaXMuX2NvbGxlY3RFeHBhbnNpb25FeHBUb2tlbnMoc3RhcnQpO1xuICAgICAgICBpZiAoIWV4cClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgICBleHAucHVzaChuZXcgVG9rZW4oVG9rZW5UeXBlLkVPRiwgW10sIGVuZC5zb3VyY2VTcGFuKSk7XG4gICAgICAgIC8vIHBhcnNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB7IGFuZCB9XG4gICAgICAgIHZhciBwYXJzZWRFeHAgPSBuZXcgX1RyZWVCdWlsZGVyKGV4cCwgdGhpcy5nZXRUYWdEZWZpbml0aW9uKS5idWlsZCgpO1xuICAgICAgICBpZiAocGFyc2VkRXhwLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLl9lcnJvcnMuY29uY2F0KHBhcnNlZEV4cC5lcnJvcnMpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKHZhbHVlLnNvdXJjZVNwYW4uc3RhcnQsIGVuZC5zb3VyY2VTcGFuLmVuZCk7XG4gICAgICAgIHZhciBleHBTb3VyY2VTcGFuID0gbmV3IFBhcnNlU291cmNlU3BhbihzdGFydC5zb3VyY2VTcGFuLnN0YXJ0LCBlbmQuc291cmNlU3Bhbi5lbmQpO1xuICAgICAgICByZXR1cm4gbmV3IEV4cGFuc2lvbkNhc2UodmFsdWUucGFydHNbMF0sIHBhcnNlZEV4cC5yb290Tm9kZXMsIHNvdXJjZVNwYW4sIHZhbHVlLnNvdXJjZVNwYW4sIGV4cFNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29sbGVjdEV4cGFuc2lvbkV4cFRva2VucyA9IGZ1bmN0aW9uIChzdGFydCkge1xuICAgICAgICB2YXIgZXhwID0gW107XG4gICAgICAgIHZhciBleHBhbnNpb25Gb3JtU3RhY2sgPSBbVG9rZW5UeXBlLkVYUEFOU0lPTl9DQVNFX0VYUF9TVEFSVF07XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUuRVhQQU5TSU9OX0ZPUk1fU1RBUlQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5FWFBBTlNJT05fQ0FTRV9FWFBfU1RBUlQpIHtcbiAgICAgICAgICAgICAgICBleHBhbnNpb25Gb3JtU3RhY2sucHVzaCh0aGlzLl9wZWVrLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLkVYUEFOU0lPTl9DQVNFX0VYUF9FTkQpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdE9uU3RhY2soZXhwYW5zaW9uRm9ybVN0YWNrLCBUb2tlblR5cGUuRVhQQU5TSU9OX0NBU0VfRVhQX1NUQVJUKSkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Gb3JtU3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHBhbnNpb25Gb3JtU3RhY2subGVuZ3RoID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goVHJlZUVycm9yLmNyZWF0ZShudWxsLCBzdGFydC5zb3VyY2VTcGFuLCBcIkludmFsaWQgSUNVIG1lc3NhZ2UuIE1pc3NpbmcgJ30nLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5FWFBBTlNJT05fRk9STV9FTkQpIHtcbiAgICAgICAgICAgICAgICBpZiAobGFzdE9uU3RhY2soZXhwYW5zaW9uRm9ybVN0YWNrLCBUb2tlblR5cGUuRVhQQU5TSU9OX0ZPUk1fU1RBUlQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvbkZvcm1TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKFRyZWVFcnJvci5jcmVhdGUobnVsbCwgc3RhcnQuc291cmNlU3BhbiwgXCJJbnZhbGlkIElDVSBtZXNzYWdlLiBNaXNzaW5nICd9Jy5cIikpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUuRU9GKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2goVHJlZUVycm9yLmNyZWF0ZShudWxsLCBzdGFydC5zb3VyY2VTcGFuLCBcIkludmFsaWQgSUNVIG1lc3NhZ2UuIE1pc3NpbmcgJ30nLlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleHAucHVzaCh0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9jb25zdW1lVGV4dCA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICB2YXIgdGV4dCA9IHRva2VuLnBhcnRzWzBdO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiAwICYmIHRleHRbMF0gPT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRfMSAhPSBudWxsICYmIHBhcmVudF8xLmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYWdEZWZpbml0aW9uKHBhcmVudF8xLm5hbWUpLmlnbm9yZUZpcnN0TGYpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVG9QYXJlbnQobmV3IFRleHQkMyh0ZXh0LCB0b2tlbi5zb3VyY2VTcGFuKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9UcmVlQnVpbGRlci5wcm90b3R5cGUuX2Nsb3NlVm9pZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlbCA9IHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsICYmIHRoaXMuZ2V0VGFnRGVmaW5pdGlvbihlbC5uYW1lKS5pc1ZvaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRTdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZVN0YXJ0VGFnID0gZnVuY3Rpb24gKHN0YXJ0VGFnVG9rZW4pIHtcbiAgICAgICAgdmFyIHByZWZpeCA9IHN0YXJ0VGFnVG9rZW4ucGFydHNbMF07XG4gICAgICAgIHZhciBuYW1lID0gc3RhcnRUYWdUb2tlbi5wYXJ0c1sxXTtcbiAgICAgICAgdmFyIGF0dHJzID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5BVFRSX05BTUUpIHtcbiAgICAgICAgICAgIGF0dHJzLnB1c2godGhpcy5fY29uc3VtZUF0dHIodGhpcy5fYWR2YW5jZSgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZ1bGxOYW1lID0gdGhpcy5fZ2V0RWxlbWVudEZ1bGxOYW1lKHByZWZpeCwgbmFtZSwgdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpKTtcbiAgICAgICAgdmFyIHNlbGZDbG9zaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIE5vdGU6IFRoZXJlIGNvdWxkIGhhdmUgYmVlbiBhIHRva2VuaXplciBlcnJvclxuICAgICAgICAvLyBzbyB0aGF0IHdlIGRvbid0IGdldCBhIHRva2VuIGZvciB0aGUgZW5kIHRhZy4uLlxuICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUuVEFHX09QRU5fRU5EX1ZPSUQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgIHNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciB0YWdEZWYgPSB0aGlzLmdldFRhZ0RlZmluaXRpb24oZnVsbE5hbWUpO1xuICAgICAgICAgICAgaWYgKCEodGFnRGVmLmNhblNlbGZDbG9zZSB8fCBnZXROc1ByZWZpeChmdWxsTmFtZSkgIT09IG51bGwgfHwgdGFnRGVmLmlzVm9pZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKGZ1bGxOYW1lLCBzdGFydFRhZ1Rva2VuLnNvdXJjZVNwYW4sIFwiT25seSB2b2lkIGFuZCBmb3JlaWduIGVsZW1lbnRzIGNhbiBiZSBzZWxmIGNsb3NlZCBcXFwiXCIgKyBzdGFydFRhZ1Rva2VuLnBhcnRzWzFdICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5UQUdfT1BFTl9FTkQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgIHNlbGZDbG9zaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuX3BlZWsuc291cmNlU3Bhbi5zdGFydDtcbiAgICAgICAgdmFyIHNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0VGFnVG9rZW4uc291cmNlU3Bhbi5zdGFydCwgZW5kKTtcbiAgICAgICAgdmFyIGVsID0gbmV3IEVsZW1lbnQkMShmdWxsTmFtZSwgYXR0cnMsIFtdLCBzcGFuLCBzcGFuLCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLl9wdXNoRWxlbWVudChlbCk7XG4gICAgICAgIGlmIChzZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgdGhpcy5fcG9wRWxlbWVudChmdWxsTmFtZSk7XG4gICAgICAgICAgICBlbC5lbmRTb3VyY2VTcGFuID0gc3BhbjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fcHVzaEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIHBhcmVudEVsID0gdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpO1xuICAgICAgICBpZiAocGFyZW50RWwgJiYgdGhpcy5nZXRUYWdEZWZpbml0aW9uKHBhcmVudEVsLm5hbWUpLmlzQ2xvc2VkQnlDaGlsZChlbC5uYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KGVsKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnB1c2goZWwpO1xuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZUVuZFRhZyA9IGZ1bmN0aW9uIChlbmRUYWdUb2tlbikge1xuICAgICAgICB2YXIgZnVsbE5hbWUgPSB0aGlzLl9nZXRFbGVtZW50RnVsbE5hbWUoZW5kVGFnVG9rZW4ucGFydHNbMF0sIGVuZFRhZ1Rva2VuLnBhcnRzWzFdLCB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCkpO1xuICAgICAgICBpZiAodGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCkuZW5kU291cmNlU3BhbiA9IGVuZFRhZ1Rva2VuLnNvdXJjZVNwYW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFnRGVmaW5pdGlvbihmdWxsTmFtZSkuaXNWb2lkKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKGZ1bGxOYW1lLCBlbmRUYWdUb2tlbi5zb3VyY2VTcGFuLCBcIlZvaWQgZWxlbWVudHMgZG8gbm90IGhhdmUgZW5kIHRhZ3MgXFxcIlwiICsgZW5kVGFnVG9rZW4ucGFydHNbMV0gKyBcIlxcXCJcIikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9wb3BFbGVtZW50KGZ1bGxOYW1lKSkge1xuICAgICAgICAgICAgdmFyIGVyck1zZyA9IFwiVW5leHBlY3RlZCBjbG9zaW5nIHRhZyBcXFwiXCIgKyBmdWxsTmFtZSArIFwiXFxcIi4gSXQgbWF5IGhhcHBlbiB3aGVuIHRoZSB0YWcgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgYnkgYW5vdGhlciB0YWcuIEZvciBtb3JlIGluZm8gc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNjbG9zaW5nLWVsZW1lbnRzLXRoYXQtaGF2ZS1pbXBsaWVkLWVuZC10YWdzXCI7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChUcmVlRXJyb3IuY3JlYXRlKGZ1bGxOYW1lLCBlbmRUYWdUb2tlbi5zb3VyY2VTcGFuLCBlcnJNc2cpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fcG9wRWxlbWVudCA9IGZ1bmN0aW9uIChmdWxsTmFtZSkge1xuICAgICAgICBmb3IgKHZhciBzdGFja0luZGV4ID0gdGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCAtIDE7IHN0YWNrSW5kZXggPj0gMDsgc3RhY2tJbmRleC0tKSB7XG4gICAgICAgICAgICB2YXIgZWwgPSB0aGlzLl9lbGVtZW50U3RhY2tbc3RhY2tJbmRleF07XG4gICAgICAgICAgICBpZiAoZWwubmFtZSA9PSBmdWxsTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRTdGFjay5zcGxpY2Uoc3RhY2tJbmRleCwgdGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCAtIHN0YWNrSW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldFRhZ0RlZmluaXRpb24oZWwubmFtZSkuY2xvc2VkQnlQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fY29uc3VtZUF0dHIgPSBmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bGxOYW1lID0gbWVyZ2VOc0FuZE5hbWUoYXR0ck5hbWUucGFydHNbMF0sIGF0dHJOYW1lLnBhcnRzWzFdKTtcbiAgICAgICAgdmFyIGVuZCA9IGF0dHJOYW1lLnNvdXJjZVNwYW4uZW5kO1xuICAgICAgICB2YXIgdmFsdWUgPSAnJztcbiAgICAgICAgdmFyIHZhbHVlU3BhbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuX3BlZWsudHlwZSA9PT0gVG9rZW5UeXBlLkFUVFJfUVVPVEUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcGVlay50eXBlID09PSBUb2tlblR5cGUuQVRUUl9WQUxVRSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlVG9rZW4gPSB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlVG9rZW4ucGFydHNbMF07XG4gICAgICAgICAgICBlbmQgPSB2YWx1ZVRva2VuLnNvdXJjZVNwYW4uZW5kO1xuICAgICAgICAgICAgdmFsdWVTcGFuID0gdmFsdWVUb2tlbi5zb3VyY2VTcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wZWVrLnR5cGUgPT09IFRva2VuVHlwZS5BVFRSX1FVT1RFKSB7XG4gICAgICAgICAgICB2YXIgcXVvdGVUb2tlbiA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgICAgICAgIGVuZCA9IHF1b3RlVG9rZW4uc291cmNlU3Bhbi5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUoZnVsbE5hbWUsIHZhbHVlLCBuZXcgUGFyc2VTb3VyY2VTcGFuKGF0dHJOYW1lLnNvdXJjZVNwYW4uc3RhcnQsIGVuZCksIHZhbHVlU3Bhbik7XG4gICAgfTtcbiAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9nZXRQYXJlbnRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCA+IDAgPyB0aGlzLl9lbGVtZW50U3RhY2tbdGhpcy5fZWxlbWVudFN0YWNrLmxlbmd0aCAtIDFdIDogbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBpbiB0aGUgRE9NIGFuZCB0aGUgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogYDxuZy1jb250YWluZXI+YCBlbGVtZW50cyBhcmUgc2tpcHBlZCBhcyB0aGV5IGFyZSBub3QgcmVuZGVyZWQgYXMgRE9NIGVsZW1lbnQuXG4gICAgICovXG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fZ2V0UGFyZW50RWxlbWVudFNraXBwaW5nQ29udGFpbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9lbGVtZW50U3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICghaXNOZ0NvbnRhaW5lcih0aGlzLl9lbGVtZW50U3RhY2tbaV0ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnQ6IHRoaXMuX2VsZW1lbnRTdGFja1tpXSwgY29udGFpbmVyOiBjb250YWluZXIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnRTdGFja1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBwYXJlbnQ6IG51bGwsIGNvbnRhaW5lcjogY29udGFpbmVyIH07XG4gICAgfTtcbiAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9hZGRUb1BhcmVudCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yb290Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgbm9kZSBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIHRoZSBjb250YWluZXIuXG4gICAgICogV2hlbiBubyBjb250YWluZXIgaXMgZ2l2ZW4sIHRoZSBub2RlIGlzIGFwcGVuZGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudC5cbiAgICAgKiBBbHNvIHVwZGF0ZXMgdGhlIGVsZW1lbnQgc3RhY2sgYWNjb3JkaW5nbHkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfVHJlZUJ1aWxkZXIucHJvdG90eXBlLl9pbnNlcnRCZWZvcmVDb250YWluZXIgPSBmdW5jdGlvbiAocGFyZW50LCBjb250YWluZXIsIG5vZGUpIHtcbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgY29udGFpbmVyIHdpdGggdGhlIG5ldyBub2RlIGluIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKGNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuW2luZGV4XSA9IG5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290Tm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudFN0YWNrLnNwbGljZSh0aGlzLl9lbGVtZW50U3RhY2suaW5kZXhPZihjb250YWluZXIpLCAwLCBub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1RyZWVCdWlsZGVyLnByb3RvdHlwZS5fZ2V0RWxlbWVudEZ1bGxOYW1lID0gZnVuY3Rpb24gKHByZWZpeCwgbG9jYWxOYW1lLCBwYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIGlmIChwcmVmaXggPT09ICcnKSB7XG4gICAgICAgICAgICBwcmVmaXggPSB0aGlzLmdldFRhZ0RlZmluaXRpb24obG9jYWxOYW1lKS5pbXBsaWNpdE5hbWVzcGFjZVByZWZpeCB8fCAnJztcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnICYmIHBhcmVudEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IGdldE5zUHJlZml4KHBhcmVudEVsZW1lbnQubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlTnNBbmROYW1lKHByZWZpeCwgbG9jYWxOYW1lKTtcbiAgICB9O1xuICAgIHJldHVybiBfVHJlZUJ1aWxkZXI7XG59KCkpO1xuZnVuY3Rpb24gbGFzdE9uU3RhY2soc3RhY2ssIGVsZW1lbnQpIHtcbiAgICByZXR1cm4gc3RhY2subGVuZ3RoID4gMCAmJiBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA9PT0gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEh0bWxQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEh0bWxQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSHRtbFBhcnNlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGdldEh0bWxUYWdEZWZpbml0aW9uKSB8fCB0aGlzO1xuICAgIH1cbiAgICBIdG1sUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHVybCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5wYXJzZS5jYWxsKHRoaXMsIHNvdXJjZSwgdXJsLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBIdG1sUGFyc2VyO1xufShQYXJzZXIpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFBSRVNFUlZFX1dTX0FUVFJfTkFNRSA9ICduZ1ByZXNlcnZlV2hpdGVzcGFjZXMnO1xudmFyIFNLSVBfV1NfVFJJTV9UQUdTID0gbmV3IFNldChbJ3ByZScsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICdzY3JpcHQnLCAnc3R5bGUnXSk7XG4vLyBFcXVpdmFsZW50IHRvIFxccyB3aXRoIFxcdTAwYTAgKG5vbi1icmVha2luZyBzcGFjZSkgZXhjbHVkZWQuXG4vLyBCYXNlZCBvbiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9SZWdFeHBcbnZhciBXU19DSEFSUyA9ICcgXFxmXFxuXFxyXFx0XFx2XFx1MTY4MFxcdTE4MGVcXHUyMDAwLVxcdTIwMGFcXHUyMDI4XFx1MjAyOVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdWZlZmYnO1xudmFyIE5PX1dTX1JFR0VYUCA9IG5ldyBSZWdFeHAoXCJbXlwiICsgV1NfQ0hBUlMgKyBcIl1cIik7XG52YXIgV1NfUkVQTEFDRV9SRUdFWFAgPSBuZXcgUmVnRXhwKFwiW1wiICsgV1NfQ0hBUlMgKyBcIl17Mix9XCIsICdnJyk7XG5mdW5jdGlvbiBoYXNQcmVzZXJ2ZVdoaXRlc3BhY2VzQXR0cihhdHRycykge1xuICAgIHJldHVybiBhdHRycy5zb21lKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09IFBSRVNFUlZFX1dTX0FUVFJfTkFNRTsgfSk7XG59XG4vKipcbiAqIEFuZ3VsYXIgRGFydCBpbnRyb2R1Y2VkICZuZ3NwOyBhcyBhIHBsYWNlaG9sZGVyIGZvciBub24tcmVtb3ZhYmxlIHNwYWNlLCBzZWU6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2FuZ3VsYXIvYmxvYi8wYmI2MTEzODdkMjlkNjViNWFmN2Y5ZDI1MTVhYjU3MWZkM2ZiZWU0L190ZXN0cy90ZXN0L2NvbXBpbGVyL3ByZXNlcnZlX3doaXRlc3BhY2VfdGVzdC5kYXJ0I0wyNS1MMzJcbiAqIEluIEFuZ3VsYXIgRGFydCAmbmdzcDsgaXMgY29udmVydGVkIHRvIHRoZSAweEU1MDAgUFVBIChQcml2YXRlIFVzZSBBcmVhcykgdW5pY29kZSBjaGFyYWN0ZXJcbiAqIGFuZCBsYXRlciBvbiByZXBsYWNlZCBieSBhIHNwYWNlLiBXZSBhcmUgcmUtaW1wbGVtZW50aW5nIHRoZSBzYW1lIGlkZWEgaGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZU5nc3AodmFsdWUpIHtcbiAgICAvLyBsZXhlciBpcyByZXBsYWNpbmcgdGhlICZuZ3NwOyBwc2V1ZG8tZW50aXR5IHdpdGggTkdTUF9VTklDT0RFXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChOR1NQX1VOSUNPREUsICdnJyksICcgJyk7XG59XG4vKipcbiAqIFRoaXMgdmlzaXRvciBjYW4gd2FsayBIVE1MIHBhcnNlIHRyZWUgYW5kIHJlbW92ZSAvIHRyaW0gdGV4dCBub2RlcyB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuICogLSBjb25zaWRlciBzcGFjZXMsIHRhYnMgYW5kIG5ldyBsaW5lcyBhcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnM7XG4gKiAtIGRyb3AgdGV4dCBub2RlcyBjb25zaXN0aW5nIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbmx5O1xuICogLSBmb3IgYWxsIG90aGVyIHRleHQgbm9kZXMgcmVwbGFjZSBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBvbmUgc3BhY2U7XG4gKiAtIGNvbnZlcnQgJm5nc3A7IHBzZXVkby1lbnRpdHkgdG8gYSBzaW5nbGUgc3BhY2U7XG4gKlxuICogUmVtb3ZhbCBhbmQgdHJpbW1pbmcgb2Ygd2hpdGVzcGFjZXMgaGF2ZSBwb3NpdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgKGxlc3MgY29kZSB0byBnZW5lcmF0ZVxuICogd2hpbGUgY29tcGlsaW5nIHRlbXBsYXRlcywgZmFzdGVyIHZpZXcgY3JlYXRpb24pLiBBdCB0aGUgc2FtZSB0aW1lIGl0IGNhbiBiZSBcImRlc3RydWN0aXZlXCJcbiAqIGluIHNvbWUgY2FzZXMgKHdoaXRlc3BhY2VzIGNhbiBpbmZsdWVuY2UgbGF5b3V0KS4gQmVjYXVzZSBvZiB0aGUgcG90ZW50aWFsIG9mIGJyZWFraW5nIGxheW91dFxuICogdGhpcyB2aXNpdG9yIGlzIG5vdCBhY3RpdmF0ZWQgYnkgZGVmYXVsdCBpbiBBbmd1bGFyIDUgYW5kIHBlb3BsZSBuZWVkIHRvIGV4cGxpY2l0bHkgb3B0LWluIGZvclxuICogd2hpdGVzcGFjZSByZW1vdmFsLiBUaGUgZGVmYXVsdCBvcHRpb24gZm9yIHdoaXRlc3BhY2UgcmVtb3ZhbCB3aWxsIGJlIHJldmlzaXRlZCBpbiBBbmd1bGFyIDZcbiAqIGFuZCBtaWdodCBiZSBjaGFuZ2VkIHRvIFwib25cIiBieSBkZWZhdWx0LlxuICovXG52YXIgV2hpdGVzcGFjZVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gV2hpdGVzcGFjZVZpc2l0b3IoKSB7XG4gICAgfVxuICAgIFdoaXRlc3BhY2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dCkge1xuICAgICAgICBpZiAoU0tJUF9XU19UUklNX1RBR1MuaGFzKGVsZW1lbnQubmFtZSkgfHwgaGFzUHJlc2VydmVXaGl0ZXNwYWNlc0F0dHIoZWxlbWVudC5hdHRycykpIHtcbiAgICAgICAgICAgIC8vIGRvbid0IGRlc2NlbnQgaW50byBlbGVtZW50cyB3aGVyZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHdoaXRlc3BhY2VzXG4gICAgICAgICAgICAvLyBidXQgc3RpbGwgdmlzaXQgYWxsIGF0dHJpYnV0ZXMgdG8gZWxpbWluYXRlIG9uZSB1c2VkIGFzIGEgbWFya2V0IHRvIHByZXNlcnZlIFdTXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQkMShlbGVtZW50Lm5hbWUsIHZpc2l0QWxsJDEodGhpcywgZWxlbWVudC5hdHRycyksIGVsZW1lbnQuY2hpbGRyZW4sIGVsZW1lbnQuc291cmNlU3BhbiwgZWxlbWVudC5zdGFydFNvdXJjZVNwYW4sIGVsZW1lbnQuZW5kU291cmNlU3BhbiwgZWxlbWVudC5pMThuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQkMShlbGVtZW50Lm5hbWUsIGVsZW1lbnQuYXR0cnMsIHZpc2l0QWxsJDEodGhpcywgZWxlbWVudC5jaGlsZHJlbiksIGVsZW1lbnQuc291cmNlU3BhbiwgZWxlbWVudC5zdGFydFNvdXJjZVNwYW4sIGVsZW1lbnQuZW5kU291cmNlU3BhbiwgZWxlbWVudC5pMThuKTtcbiAgICB9O1xuICAgIFdoaXRlc3BhY2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5uYW1lICE9PSBQUkVTRVJWRV9XU19BVFRSX05BTUUgPyBhdHRyaWJ1dGUgOiBudWxsO1xuICAgIH07XG4gICAgV2hpdGVzcGFjZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBpc05vdEJsYW5rID0gdGV4dC52YWx1ZS5tYXRjaChOT19XU19SRUdFWFApO1xuICAgICAgICBpZiAoaXNOb3RCbGFuaykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0JDMocmVwbGFjZU5nc3AodGV4dC52YWx1ZSkucmVwbGFjZShXU19SRVBMQUNFX1JFR0VYUCwgJyAnKSwgdGV4dC5zb3VyY2VTcGFuLCB0ZXh0LmkxOG4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgV2hpdGVzcGFjZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IHJldHVybiBjb21tZW50OyB9O1xuICAgIFdoaXRlc3BhY2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChleHBhbnNpb24sIGNvbnRleHQpIHsgcmV0dXJuIGV4cGFuc2lvbjsgfTtcbiAgICBXaGl0ZXNwYWNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGV4cGFuc2lvbkNhc2UsIGNvbnRleHQpIHsgcmV0dXJuIGV4cGFuc2lvbkNhc2U7IH07XG4gICAgcmV0dXJuIFdoaXRlc3BhY2VWaXNpdG9yO1xufSgpKTtcbmZ1bmN0aW9uIHJlbW92ZVdoaXRlc3BhY2VzKGh0bWxBc3RXaXRoRXJyb3JzKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZVRyZWVSZXN1bHQodmlzaXRBbGwkMShuZXcgV2hpdGVzcGFjZVZpc2l0b3IoKSwgaHRtbEFzdFdpdGhFcnJvcnMucm9vdE5vZGVzKSwgaHRtbEFzdFdpdGhFcnJvcnMuZXJyb3JzKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvY2xkci1zcGVjL3BsdXJhbC1ydWxlc1xudmFyIFBMVVJBTF9DQVNFUyA9IFsnemVybycsICdvbmUnLCAndHdvJywgJ2ZldycsICdtYW55JywgJ290aGVyJ107XG4vKipcbiAqIEV4cGFuZHMgc3BlY2lhbCBmb3JtcyBpbnRvIGVsZW1lbnRzLlxuICpcbiAqIEZvciBleGFtcGxlLFxuICpcbiAqIGBgYFxuICogeyBtZXNzYWdlcy5sZW5ndGgsIHBsdXJhbCxcbiAqICAgPTAge3plcm99XG4gKiAgID0xIHtvbmV9XG4gKiAgIG90aGVyIHttb3JlIHRoYW4gb25lfVxuICogfVxuICogYGBgXG4gKlxuICogd2lsbCBiZSBleHBhbmRlZCBpbnRvXG4gKlxuICogYGBgXG4gKiA8bmctY29udGFpbmVyIFtuZ1BsdXJhbF09XCJtZXNzYWdlcy5sZW5ndGhcIj5cbiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0wXCI+emVybzwvbmctdGVtcGxhdGU+XG4gKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MVwiPm9uZTwvbmctdGVtcGxhdGU+XG4gKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCJvdGhlclwiPm1vcmUgdGhhbiBvbmU8L25nLXRlbXBsYXRlPlxuICogPC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gZXhwYW5kTm9kZXMobm9kZXMpIHtcbiAgICB2YXIgZXhwYW5kZXIgPSBuZXcgX0V4cGFuZGVyKCk7XG4gICAgcmV0dXJuIG5ldyBFeHBhbnNpb25SZXN1bHQodmlzaXRBbGwkMShleHBhbmRlciwgbm9kZXMpLCBleHBhbmRlci5pc0V4cGFuZGVkLCBleHBhbmRlci5lcnJvcnMpO1xufVxudmFyIEV4cGFuc2lvblJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHBhbnNpb25SZXN1bHQobm9kZXMsIGV4cGFuZGVkLCBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgICAgICB0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICByZXR1cm4gRXhwYW5zaW9uUmVzdWx0O1xufSgpKTtcbnZhciBFeHBhbnNpb25FcnJvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRXhwYW5zaW9uRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXhwYW5zaW9uRXJyb3Ioc3BhbiwgZXJyb3JNc2cpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIHNwYW4sIGVycm9yTXNnKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gRXhwYW5zaW9uRXJyb3I7XG59KFBhcnNlRXJyb3IpKTtcbi8qKlxuICogRXhwYW5kIGV4cGFuc2lvbiBmb3JtcyAocGx1cmFsLCBzZWxlY3QpIHRvIGRpcmVjdGl2ZXNcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIF9FeHBhbmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfRXhwYW5kZXIoKSB7XG4gICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICBfRXhwYW5kZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBuZXcgRWxlbWVudCQxKGVsZW1lbnQubmFtZSwgZWxlbWVudC5hdHRycywgdmlzaXRBbGwkMSh0aGlzLCBlbGVtZW50LmNoaWxkcmVuKSwgZWxlbWVudC5zb3VyY2VTcGFuLCBlbGVtZW50LnN0YXJ0U291cmNlU3BhbiwgZWxlbWVudC5lbmRTb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIF9FeHBhbmRlci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IHJldHVybiBhdHRyaWJ1dGU7IH07XG4gICAgX0V4cGFuZGVyLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gdGV4dDsgfTtcbiAgICBfRXhwYW5kZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IHJldHVybiBjb21tZW50OyB9O1xuICAgIF9FeHBhbmRlci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBpY3UudHlwZSA9PSAncGx1cmFsJyA/IF9leHBhbmRQbHVyYWxGb3JtKGljdSwgdGhpcy5lcnJvcnMpIDpcbiAgICAgICAgICAgIF9leHBhbmREZWZhdWx0Rm9ybShpY3UsIHRoaXMuZXJyb3JzKTtcbiAgICB9O1xuICAgIF9FeHBhbmRlci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGljdUNhc2UsIGNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGJlIHJlYWNoZWQnKTtcbiAgICB9O1xuICAgIHJldHVybiBfRXhwYW5kZXI7XG59KCkpO1xuLy8gUGx1cmFsIGZvcm1zIGFyZSBleHBhbmRlZCB0byBgTmdQbHVyYWxgIGFuZCBgTmdQbHVyYWxDYXNlYHNcbmZ1bmN0aW9uIF9leHBhbmRQbHVyYWxGb3JtKGFzdCwgZXJyb3JzKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gYXN0LmNhc2VzLm1hcChmdW5jdGlvbiAoYykge1xuICAgICAgICBpZiAoUExVUkFMX0NBU0VTLmluZGV4T2YoYy52YWx1ZSkgPT0gLTEgJiYgIWMudmFsdWUubWF0Y2goL149XFxkKyQvKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IEV4cGFuc2lvbkVycm9yKGMudmFsdWVTb3VyY2VTcGFuLCBcIlBsdXJhbCBjYXNlcyBzaG91bGQgYmUgXFxcIj08bnVtYmVyPlxcXCIgb3Igb25lIG9mIFwiICsgUExVUkFMX0NBU0VTLmpvaW4oXCIsIFwiKSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBleHBhbnNpb25SZXN1bHQgPSBleHBhbmROb2RlcyhjLmV4cHJlc3Npb24pO1xuICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIF9fc3ByZWFkKGV4cGFuc2lvblJlc3VsdC5lcnJvcnMpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50JDEoXCJuZy10ZW1wbGF0ZVwiLCBbbmV3IEF0dHJpYnV0ZSgnbmdQbHVyYWxDYXNlJywgXCJcIiArIGMudmFsdWUsIGMudmFsdWVTb3VyY2VTcGFuKV0sIGV4cGFuc2lvblJlc3VsdC5ub2RlcywgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4sIGMuc291cmNlU3Bhbik7XG4gICAgfSk7XG4gICAgdmFyIHN3aXRjaEF0dHIgPSBuZXcgQXR0cmlidXRlKCdbbmdQbHVyYWxdJywgYXN0LnN3aXRjaFZhbHVlLCBhc3Quc3dpdGNoVmFsdWVTb3VyY2VTcGFuKTtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnQkMSgnbmctY29udGFpbmVyJywgW3N3aXRjaEF0dHJdLCBjaGlsZHJlbiwgYXN0LnNvdXJjZVNwYW4sIGFzdC5zb3VyY2VTcGFuLCBhc3Quc291cmNlU3Bhbik7XG59XG4vLyBJQ1UgbWVzc2FnZXMgKGV4Y2x1ZGluZyBwbHVyYWwgZm9ybSkgYXJlIGV4cGFuZGVkIHRvIGBOZ1N3aXRjaGAgIGFuZCBgTmdTd2l0Y2hDYXNlYHNcbmZ1bmN0aW9uIF9leHBhbmREZWZhdWx0Rm9ybShhc3QsIGVycm9ycykge1xuICAgIHZhciBjaGlsZHJlbiA9IGFzdC5jYXNlcy5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvblJlc3VsdCA9IGV4cGFuZE5vZGVzKGMuZXhwcmVzc2lvbik7XG4gICAgICAgIGVycm9ycy5wdXNoLmFwcGx5KGVycm9ycywgX19zcHJlYWQoZXhwYW5zaW9uUmVzdWx0LmVycm9ycykpO1xuICAgICAgICBpZiAoYy52YWx1ZSA9PT0gJ290aGVyJykge1xuICAgICAgICAgICAgLy8gb3RoZXIgaXMgdGhlIGRlZmF1bHQgY2FzZSB3aGVuIG5vIHZhbHVlcyBtYXRjaFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50JDEoXCJuZy10ZW1wbGF0ZVwiLCBbbmV3IEF0dHJpYnV0ZSgnbmdTd2l0Y2hEZWZhdWx0JywgJycsIGMudmFsdWVTb3VyY2VTcGFuKV0sIGV4cGFuc2lvblJlc3VsdC5ub2RlcywgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4sIGMuc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50JDEoXCJuZy10ZW1wbGF0ZVwiLCBbbmV3IEF0dHJpYnV0ZSgnbmdTd2l0Y2hDYXNlJywgXCJcIiArIGMudmFsdWUsIGMudmFsdWVTb3VyY2VTcGFuKV0sIGV4cGFuc2lvblJlc3VsdC5ub2RlcywgYy5zb3VyY2VTcGFuLCBjLnNvdXJjZVNwYW4sIGMuc291cmNlU3Bhbik7XG4gICAgfSk7XG4gICAgdmFyIHN3aXRjaEF0dHIgPSBuZXcgQXR0cmlidXRlKCdbbmdTd2l0Y2hdJywgYXN0LnN3aXRjaFZhbHVlLCBhc3Quc3dpdGNoVmFsdWVTb3VyY2VTcGFuKTtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnQkMSgnbmctY29udGFpbmVyJywgW3N3aXRjaEF0dHJdLCBjaGlsZHJlbiwgYXN0LnNvdXJjZVNwYW4sIGFzdC5zb3VyY2VTcGFuLCBhc3Quc291cmNlU3Bhbik7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfYTtcbi8qKlxuICogQSBzZWdtZW50IG9mIHRleHQgd2l0aGluIHRoZSB0ZW1wbGF0ZS5cbiAqL1xudmFyIFRleHRBc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGV4dEFzdCh2YWx1ZSwgbmdDb250ZW50SW5kZXgsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5nQ29udGVudEluZGV4ID0gbmdDb250ZW50SW5kZXg7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIFRleHRBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHsgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0KHRoaXMsIGNvbnRleHQpOyB9O1xuICAgIHJldHVybiBUZXh0QXN0O1xufSgpKTtcbi8qKlxuICogQSBib3VuZCBleHByZXNzaW9uIHdpdGhpbiB0aGUgdGV4dCBvZiBhIHRlbXBsYXRlLlxuICovXG52YXIgQm91bmRUZXh0QXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvdW5kVGV4dEFzdCh2YWx1ZSwgbmdDb250ZW50SW5kZXgsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm5nQ29udGVudEluZGV4ID0gbmdDb250ZW50SW5kZXg7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIEJvdW5kVGV4dEFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEJvdW5kVGV4dCh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBCb3VuZFRleHRBc3Q7XG59KCkpO1xuLyoqXG4gKiBBIHBsYWluIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICovXG52YXIgQXR0ckFzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBdHRyQXN0KG5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICB9XG4gICAgQXR0ckFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkgeyByZXR1cm4gdmlzaXRvci52aXNpdEF0dHIodGhpcywgY29udGV4dCk7IH07XG4gICAgcmV0dXJuIEF0dHJBc3Q7XG59KCkpO1xudmFyIEJvdW5kUHJvcGVydHlNYXBwaW5nID0gKF9hID0ge30sXG4gICAgX2FbNCAvKiBBbmltYXRpb24gKi9dID0gNCAvKiBBbmltYXRpb24gKi8sXG4gICAgX2FbMSAvKiBBdHRyaWJ1dGUgKi9dID0gMSAvKiBBdHRyaWJ1dGUgKi8sXG4gICAgX2FbMiAvKiBDbGFzcyAqL10gPSAyIC8qIENsYXNzICovLFxuICAgIF9hWzAgLyogUHJvcGVydHkgKi9dID0gMCAvKiBQcm9wZXJ0eSAqLyxcbiAgICBfYVszIC8qIFN0eWxlICovXSA9IDMgLyogU3R5bGUgKi8sXG4gICAgX2EpO1xuLyoqXG4gKiBBIGJpbmRpbmcgZm9yIGFuIGVsZW1lbnQgcHJvcGVydHkgKGUuZy4gYFtwcm9wZXJ0eV09XCJleHByZXNzaW9uXCJgKSBvciBhbiBhbmltYXRpb24gdHJpZ2dlciAoZS5nLlxuICogYFtAdHJpZ2dlcl09XCJzdGF0ZUV4cFwiYClcbiAqL1xudmFyIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0KG5hbWUsIHR5cGUsIHNlY3VyaXR5Q29udGV4dCwgdmFsdWUsIHVuaXQsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5zZWN1cml0eUNvbnRleHQgPSBzZWN1cml0eUNvbnRleHQ7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51bml0ID0gdW5pdDtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGlvbiA9IHRoaXMudHlwZSA9PT0gNCAvKiBBbmltYXRpb24gKi87XG4gICAgfVxuICAgIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LmZyb21Cb3VuZFByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgdmFyIHR5cGUgPSBCb3VuZFByb3BlcnR5TWFwcGluZ1twcm9wLnR5cGVdO1xuICAgICAgICByZXR1cm4gbmV3IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0KHByb3AubmFtZSwgdHlwZSwgcHJvcC5zZWN1cml0eUNvbnRleHQsIHByb3AudmFsdWUsIHByb3AudW5pdCwgcHJvcC5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RWxlbWVudFByb3BlcnR5KHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0O1xufSgpKTtcbi8qKlxuICogQSBiaW5kaW5nIGZvciBhbiBlbGVtZW50IGV2ZW50IChlLmcuIGAoZXZlbnQpPVwiaGFuZGxlcigpXCJgKSBvciBhbiBhbmltYXRpb24gdHJpZ2dlciBldmVudCAoZS5nLlxuICogYChAdHJpZ2dlci5waGFzZSk9XCJjYWxsYmFjaygkZXZlbnQpXCJgKS5cbiAqL1xudmFyIEJvdW5kRXZlbnRBc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQm91bmRFdmVudEFzdChuYW1lLCB0YXJnZXQsIHBoYXNlLCBoYW5kbGVyLCBzb3VyY2VTcGFuLCBoYW5kbGVyU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlO1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmhhbmRsZXJTcGFuID0gaGFuZGxlclNwYW47XG4gICAgICAgIHRoaXMuZnVsbE5hbWUgPSBCb3VuZEV2ZW50QXN0LmNhbGNGdWxsTmFtZSh0aGlzLm5hbWUsIHRoaXMudGFyZ2V0LCB0aGlzLnBoYXNlKTtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGlvbiA9ICEhdGhpcy5waGFzZTtcbiAgICB9XG4gICAgQm91bmRFdmVudEFzdC5jYWxjRnVsbE5hbWUgPSBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0LCBwaGFzZSkge1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgXCI6XCIgKyBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwaGFzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiQFwiICsgbmFtZSArIFwiLlwiICsgcGhhc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcbiAgICBCb3VuZEV2ZW50QXN0LmZyb21QYXJzZWRFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudHlwZSA9PT0gMCAvKiBSZWd1bGFyICovID8gZXZlbnQudGFyZ2V0T3JQaGFzZSA6IG51bGw7XG4gICAgICAgIHZhciBwaGFzZSA9IGV2ZW50LnR5cGUgPT09IDEgLyogQW5pbWF0aW9uICovID8gZXZlbnQudGFyZ2V0T3JQaGFzZSA6IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgQm91bmRFdmVudEFzdChldmVudC5uYW1lLCB0YXJnZXQsIHBoYXNlLCBldmVudC5oYW5kbGVyLCBldmVudC5zb3VyY2VTcGFuLCBldmVudC5oYW5kbGVyU3Bhbik7XG4gICAgfTtcbiAgICBCb3VuZEV2ZW50QXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RXZlbnQodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gQm91bmRFdmVudEFzdDtcbn0oKSk7XG4vKipcbiAqIEEgcmVmZXJlbmNlIGRlY2xhcmF0aW9uIG9uIGFuIGVsZW1lbnQgKGUuZy4gYGxldCBzb21lTmFtZT1cImV4cHJlc3Npb25cImApLlxuICovXG52YXIgUmVmZXJlbmNlQXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZmVyZW5jZUFzdChuYW1lLCB2YWx1ZSwgb3JpZ2luYWxWYWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZSA9IG9yaWdpbmFsVmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIFJlZmVyZW5jZUFzdC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAodmlzaXRvciwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZmVyZW5jZSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2VBc3Q7XG59KCkpO1xuLyoqXG4gKiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9uIGEgPG5nLXRlbXBsYXRlPiAoZS5nLiBgdmFyLXNvbWVOYW1lPVwic29tZUxvY2FsTmFtZVwiYCkuXG4gKi9cbnZhciBWYXJpYWJsZUFzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWYXJpYWJsZUFzdChuYW1lLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIFZhcmlhYmxlQXN0LmZyb21QYXJzZWRWYXJpYWJsZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVBc3Qodi5uYW1lLCB2LnZhbHVlLCB2LnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgVmFyaWFibGVBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRWYXJpYWJsZSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBWYXJpYWJsZUFzdDtcbn0oKSk7XG4vKipcbiAqIEFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaW4gYSB0ZW1wbGF0ZS5cbiAqL1xudmFyIEVsZW1lbnRBc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRWxlbWVudEFzdChuYW1lLCBhdHRycywgaW5wdXRzLCBvdXRwdXRzLCByZWZlcmVuY2VzLCBkaXJlY3RpdmVzLCBwcm92aWRlcnMsIGhhc1ZpZXdDb250YWluZXIsIHF1ZXJ5TWF0Y2hlcywgY2hpbGRyZW4sIG5nQ29udGVudEluZGV4LCBzb3VyY2VTcGFuLCBlbmRTb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuYXR0cnMgPSBhdHRycztcbiAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICAgICAgICB0aGlzLmhhc1ZpZXdDb250YWluZXIgPSBoYXNWaWV3Q29udGFpbmVyO1xuICAgICAgICB0aGlzLnF1ZXJ5TWF0Y2hlcyA9IHF1ZXJ5TWF0Y2hlcztcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB0aGlzLm5nQ29udGVudEluZGV4ID0gbmdDb250ZW50SW5kZXg7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgICAgIHRoaXMuZW5kU291cmNlU3BhbiA9IGVuZFNvdXJjZVNwYW47XG4gICAgfVxuICAgIEVsZW1lbnRBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50KHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRBc3Q7XG59KCkpO1xuLyoqXG4gKiBBIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50IGluY2x1ZGVkIGluIGFuIEFuZ3VsYXIgdGVtcGxhdGUuXG4gKi9cbnZhciBFbWJlZGRlZFRlbXBsYXRlQXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVtYmVkZGVkVGVtcGxhdGVBc3QoYXR0cnMsIG91dHB1dHMsIHJlZmVyZW5jZXMsIHZhcmlhYmxlcywgZGlyZWN0aXZlcywgcHJvdmlkZXJzLCBoYXNWaWV3Q29udGFpbmVyLCBxdWVyeU1hdGNoZXMsIGNoaWxkcmVuLCBuZ0NvbnRlbnRJbmRleCwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlcyA9IHJlZmVyZW5jZXM7XG4gICAgICAgIHRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xuICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVycztcbiAgICAgICAgdGhpcy5oYXNWaWV3Q29udGFpbmVyID0gaGFzVmlld0NvbnRhaW5lcjtcbiAgICAgICAgdGhpcy5xdWVyeU1hdGNoZXMgPSBxdWVyeU1hdGNoZXM7XG4gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgdGhpcy5uZ0NvbnRlbnRJbmRleCA9IG5nQ29udGVudEluZGV4O1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBFbWJlZGRlZFRlbXBsYXRlQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBFbWJlZGRlZFRlbXBsYXRlQXN0O1xufSgpKTtcbi8qKlxuICogQSBkaXJlY3RpdmUgcHJvcGVydHkgd2l0aCBhIGJvdW5kIHZhbHVlIChlLmcuIGAqbmdJZj1cImNvbmRpdGlvblwiKS5cbiAqL1xudmFyIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdChkaXJlY3RpdmVOYW1lLCB0ZW1wbGF0ZU5hbWUsIHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlTmFtZSA9IGRpcmVjdGl2ZU5hbWU7XG4gICAgICAgIHRoaXMudGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSh0aGlzLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIHJldHVybiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0O1xufSgpKTtcbi8qKlxuICogQSBkaXJlY3RpdmUgZGVjbGFyZWQgb24gYW4gZWxlbWVudC5cbiAqL1xudmFyIERpcmVjdGl2ZUFzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEaXJlY3RpdmVBc3QoZGlyZWN0aXZlLCBpbnB1dHMsIGhvc3RQcm9wZXJ0aWVzLCBob3N0RXZlbnRzLCBjb250ZW50UXVlcnlTdGFydElkLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlID0gZGlyZWN0aXZlO1xuICAgICAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICAgICAgdGhpcy5ob3N0UHJvcGVydGllcyA9IGhvc3RQcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLmhvc3RFdmVudHMgPSBob3N0RXZlbnRzO1xuICAgICAgICB0aGlzLmNvbnRlbnRRdWVyeVN0YXJ0SWQgPSBjb250ZW50UXVlcnlTdGFydElkO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgIH1cbiAgICBEaXJlY3RpdmVBc3QucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24gKHZpc2l0b3IsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaXJlY3RpdmUodGhpcywgY29udGV4dCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGlyZWN0aXZlQXN0O1xufSgpKTtcbi8qKlxuICogQSBwcm92aWRlciBkZWNsYXJlZCBvbiBhbiBlbGVtZW50XG4gKi9cbnZhciBQcm92aWRlckFzdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQcm92aWRlckFzdCh0b2tlbiwgbXVsdGlQcm92aWRlciwgZWFnZXIsIHByb3ZpZGVycywgcHJvdmlkZXJUeXBlLCBsaWZlY3ljbGVIb29rcywgc291cmNlU3BhbiwgaXNNb2R1bGUpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB0aGlzLm11bHRpUHJvdmlkZXIgPSBtdWx0aVByb3ZpZGVyO1xuICAgICAgICB0aGlzLmVhZ2VyID0gZWFnZXI7XG4gICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICAgICAgICB0aGlzLnByb3ZpZGVyVHlwZSA9IHByb3ZpZGVyVHlwZTtcbiAgICAgICAgdGhpcy5saWZlY3ljbGVIb29rcyA9IGxpZmVjeWNsZUhvb2tzO1xuICAgICAgICB0aGlzLnNvdXJjZVNwYW4gPSBzb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLmlzTW9kdWxlID0gaXNNb2R1bGU7XG4gICAgfVxuICAgIFByb3ZpZGVyQXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIE5vIHZpc2l0IG1ldGhvZCBpbiB0aGUgdmlzaXRvciBmb3Igbm93Li4uXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFByb3ZpZGVyQXN0O1xufSgpKTtcbnZhciBQcm92aWRlckFzdFR5cGU7XG4oZnVuY3Rpb24gKFByb3ZpZGVyQXN0VHlwZSkge1xuICAgIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGVbXCJQdWJsaWNTZXJ2aWNlXCJdID0gMF0gPSBcIlB1YmxpY1NlcnZpY2VcIjtcbiAgICBQcm92aWRlckFzdFR5cGVbUHJvdmlkZXJBc3RUeXBlW1wiUHJpdmF0ZVNlcnZpY2VcIl0gPSAxXSA9IFwiUHJpdmF0ZVNlcnZpY2VcIjtcbiAgICBQcm92aWRlckFzdFR5cGVbUHJvdmlkZXJBc3RUeXBlW1wiQ29tcG9uZW50XCJdID0gMl0gPSBcIkNvbXBvbmVudFwiO1xuICAgIFByb3ZpZGVyQXN0VHlwZVtQcm92aWRlckFzdFR5cGVbXCJEaXJlY3RpdmVcIl0gPSAzXSA9IFwiRGlyZWN0aXZlXCI7XG4gICAgUHJvdmlkZXJBc3RUeXBlW1Byb3ZpZGVyQXN0VHlwZVtcIkJ1aWx0aW5cIl0gPSA0XSA9IFwiQnVpbHRpblwiO1xufSkoUHJvdmlkZXJBc3RUeXBlIHx8IChQcm92aWRlckFzdFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBQb3NpdGlvbiB3aGVyZSBjb250ZW50IGlzIHRvIGJlIHByb2plY3RlZCAoaW5zdGFuY2Ugb2YgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZSkuXG4gKi9cbnZhciBOZ0NvbnRlbnRBc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdDb250ZW50QXN0KGluZGV4LCBuZ0NvbnRlbnRJbmRleCwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMubmdDb250ZW50SW5kZXggPSBuZ0NvbnRlbnRJbmRleDtcbiAgICAgICAgdGhpcy5zb3VyY2VTcGFuID0gc291cmNlU3BhbjtcbiAgICB9XG4gICAgTmdDb250ZW50QXN0LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uICh2aXNpdG9yLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TmdDb250ZW50KHRoaXMsIGNvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIE5nQ29udGVudEFzdDtcbn0oKSk7XG4vKipcbiAqIEEgdmlzaXRvciB0aGF0IGFjY2VwdHMgZWFjaCBub2RlIGJ1dCBkb2Vzbid0IGRvIGFueXRoaW5nLiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkXG4gKiBhcyB0aGUgYmFzZSBjbGFzcyBmb3IgYSB2aXNpdG9yIHRoYXQgaXMgb25seSBpbnRlcmVzdGVkIGluIGEgc3Vic2V0IG9mIHRoZSBub2RlIHR5cGVzLlxuICovXG52YXIgTnVsbFRlbXBsYXRlVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOdWxsVGVtcGxhdGVWaXNpdG9yKCkge1xuICAgIH1cbiAgICBOdWxsVGVtcGxhdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdE5nQ29udGVudCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBOdWxsVGVtcGxhdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVtYmVkZGVkVGVtcGxhdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbFRlbXBsYXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxUZW1wbGF0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0UmVmZXJlbmNlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxUZW1wbGF0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbFRlbXBsYXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFdmVudCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBOdWxsVGVtcGxhdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVsZW1lbnRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBOdWxsVGVtcGxhdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbFRlbXBsYXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRCb3VuZFRleHQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgTnVsbFRlbXBsYXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxUZW1wbGF0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGlyZWN0aXZlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIE51bGxUZW1wbGF0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgcmV0dXJuIE51bGxUZW1wbGF0ZVZpc2l0b3I7XG59KCkpO1xuLyoqXG4gKiBCYXNlIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSB2aXNpdG9yIHRoYXQgdmlzaXRzIGVhY2ggbm9kZVxuICogaW4gYW4gdGVtcGxhdGUgYXN0IHJlY3Vyc2l2ZWx5LlxuICovXG52YXIgUmVjdXJzaXZlVGVtcGxhdGVBc3RWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWN1cnNpdmVUZW1wbGF0ZUFzdFZpc2l0b3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVjdXJzaXZlVGVtcGxhdGVBc3RWaXNpdG9yKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICB9XG4gICAgLy8gTm9kZXMgd2l0aCBjaGlsZHJlblxuICAgIFJlY3Vyc2l2ZVRlbXBsYXRlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRFbWJlZGRlZFRlbXBsYXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENoaWxkcmVuKGNvbnRleHQsIGZ1bmN0aW9uICh2aXNpdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0LmF0dHJzKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5yZWZlcmVuY2VzKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC52YXJpYWJsZXMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0LmRpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0LnByb3ZpZGVycyk7XG4gICAgICAgICAgICB2aXNpdChhc3QuY2hpbGRyZW4pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZVRlbXBsYXRlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpdENoaWxkcmVuKGNvbnRleHQsIGZ1bmN0aW9uICh2aXNpdCkge1xuICAgICAgICAgICAgdmlzaXQoYXN0LmF0dHJzKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5pbnB1dHMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0Lm91dHB1dHMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0LnJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0LmRpcmVjdGl2ZXMpO1xuICAgICAgICAgICAgdmlzaXQoYXN0LnByb3ZpZGVycyk7XG4gICAgICAgICAgICB2aXNpdChhc3QuY2hpbGRyZW4pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFJlY3Vyc2l2ZVRlbXBsYXRlQXN0VmlzaXRvci5wcm90b3R5cGUudmlzaXREaXJlY3RpdmUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0Q2hpbGRyZW4oY29udGV4dCwgZnVuY3Rpb24gKHZpc2l0KSB7XG4gICAgICAgICAgICB2aXNpdChhc3QuaW5wdXRzKTtcbiAgICAgICAgICAgIHZpc2l0KGFzdC5ob3N0UHJvcGVydGllcyk7XG4gICAgICAgICAgICB2aXNpdChhc3QuaG9zdEV2ZW50cyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgUmVjdXJzaXZlVGVtcGxhdGVBc3RWaXNpdG9yLnByb3RvdHlwZS52aXNpdENoaWxkcmVuID0gZnVuY3Rpb24gKGNvbnRleHQsIGNiKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICAgIHZhciB0ID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gdmlzaXQoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRlbXBsYXRlVmlzaXRBbGwodCwgY2hpbGRyZW4sIGNvbnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYih2aXNpdCk7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIHJlc3VsdHMpO1xuICAgIH07XG4gICAgcmV0dXJuIFJlY3Vyc2l2ZVRlbXBsYXRlQXN0VmlzaXRvcjtcbn0oTnVsbFRlbXBsYXRlVmlzaXRvcikpO1xuLyoqXG4gKiBWaXNpdCBldmVyeSBub2RlIGluIGEgbGlzdCBvZiB7QGxpbmsgVGVtcGxhdGVBc3R9cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgVGVtcGxhdGVBc3RWaXNpdG9yfS5cbiAqL1xuZnVuY3Rpb24gdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBhc3RzLCBjb250ZXh0KSB7XG4gICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgeyBjb250ZXh0ID0gbnVsbDsgfVxuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgdmlzaXQgPSB2aXNpdG9yLnZpc2l0ID9cbiAgICAgICAgZnVuY3Rpb24gKGFzdCkgeyByZXR1cm4gdmlzaXRvci52aXNpdChhc3QsIGNvbnRleHQpIHx8IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTsgfSA6XG4gICAgICAgIGZ1bmN0aW9uIChhc3QpIHsgcmV0dXJuIGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTsgfTtcbiAgICBhc3RzLmZvckVhY2goZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICB2YXIgYXN0UmVzdWx0ID0gdmlzaXQoYXN0KTtcbiAgICAgICAgaWYgKGFzdFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYXN0UmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBQcm92aWRlckVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhQcm92aWRlckVycm9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFByb3ZpZGVyRXJyb3IobWVzc2FnZSwgc3Bhbikge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgc3BhbiwgbWVzc2FnZSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFByb3ZpZGVyRXJyb3I7XG59KFBhcnNlRXJyb3IpKTtcbnZhciBQcm92aWRlclZpZXdDb250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByb3ZpZGVyVmlld0NvbnRleHQocmVmbGVjdG9yLCBjb21wb25lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5yZWZsZWN0b3IgPSByZWZsZWN0b3I7XG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLnZpZXdRdWVyaWVzID0gX2dldFZpZXdRdWVyaWVzKGNvbXBvbmVudCk7XG4gICAgICAgIHRoaXMudmlld1Byb3ZpZGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29tcG9uZW50LnZpZXdQcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGlmIChfdGhpcy52aWV3UHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZShwcm92aWRlci50b2tlbikpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy52aWV3UHJvdmlkZXJzLnNldCh0b2tlblJlZmVyZW5jZShwcm92aWRlci50b2tlbiksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb3ZpZGVyVmlld0NvbnRleHQ7XG59KCkpO1xudmFyIFByb3ZpZGVyRWxlbWVudENvbnRleHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJvdmlkZXJFbGVtZW50Q29udGV4dCh2aWV3Q29udGV4dCwgX3BhcmVudCwgX2lzVmlld1Jvb3QsIF9kaXJlY3RpdmVBc3RzLCBhdHRycywgcmVmcywgaXNUZW1wbGF0ZSwgY29udGVudFF1ZXJ5U3RhcnRJZCwgX3NvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy52aWV3Q29udGV4dCA9IHZpZXdDb250ZXh0O1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICB0aGlzLl9pc1ZpZXdSb290ID0gX2lzVmlld1Jvb3Q7XG4gICAgICAgIHRoaXMuX2RpcmVjdGl2ZUFzdHMgPSBfZGlyZWN0aXZlQXN0cztcbiAgICAgICAgdGhpcy5fc291cmNlU3BhbiA9IF9zb3VyY2VTcGFuO1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm1lZFByb3ZpZGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fc2VlblByb3ZpZGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fcXVlcmllZFRva2VucyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1lZEhhc1ZpZXdDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXR0cnMgPSB7fTtcbiAgICAgICAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0ckFzdCkgeyByZXR1cm4gX3RoaXMuX2F0dHJzW2F0dHJBc3QubmFtZV0gPSBhdHRyQXN0LnZhbHVlOyB9KTtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZXNNZXRhID0gX2RpcmVjdGl2ZUFzdHMubWFwKGZ1bmN0aW9uIChkaXJlY3RpdmVBc3QpIHsgcmV0dXJuIGRpcmVjdGl2ZUFzdC5kaXJlY3RpdmU7IH0pO1xuICAgICAgICB0aGlzLl9hbGxQcm92aWRlcnMgPVxuICAgICAgICAgICAgX3Jlc29sdmVQcm92aWRlcnNGcm9tRGlyZWN0aXZlcyhkaXJlY3RpdmVzTWV0YSwgX3NvdXJjZVNwYW4sIHZpZXdDb250ZXh0LmVycm9ycyk7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRRdWVyaWVzID0gX2dldENvbnRlbnRRdWVyaWVzKGNvbnRlbnRRdWVyeVN0YXJ0SWQsIGRpcmVjdGl2ZXNNZXRhKTtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9hbGxQcm92aWRlcnMudmFsdWVzKCkpLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBfdGhpcy5fYWRkUXVlcnlSZWFkc1RvKHByb3ZpZGVyLnRva2VuLCBwcm92aWRlci50b2tlbiwgX3RoaXMuX3F1ZXJpZWRUb2tlbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVJlZklkID0gY3JlYXRlVG9rZW5Gb3JFeHRlcm5hbFJlZmVyZW5jZSh0aGlzLnZpZXdDb250ZXh0LnJlZmxlY3RvciwgSWRlbnRpZmllcnMuVGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgdGhpcy5fYWRkUXVlcnlSZWFkc1RvKHRlbXBsYXRlUmVmSWQsIHRlbXBsYXRlUmVmSWQsIHRoaXMuX3F1ZXJpZWRUb2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJlZnMuZm9yRWFjaChmdW5jdGlvbiAocmVmQXN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmYXVsdFF1ZXJ5VmFsdWUgPSByZWZBc3QudmFsdWUgfHxcbiAgICAgICAgICAgICAgICBjcmVhdGVUb2tlbkZvckV4dGVybmFsUmVmZXJlbmNlKF90aGlzLnZpZXdDb250ZXh0LnJlZmxlY3RvciwgSWRlbnRpZmllcnMuRWxlbWVudFJlZik7XG4gICAgICAgICAgICBfdGhpcy5fYWRkUXVlcnlSZWFkc1RvKHsgdmFsdWU6IHJlZkFzdC5uYW1lIH0sIGRlZmF1bHRRdWVyeVZhbHVlLCBfdGhpcy5fcXVlcmllZFRva2Vucyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5fcXVlcmllZFRva2Vucy5nZXQodGhpcy52aWV3Q29udGV4dC5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYpKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lZEhhc1ZpZXdDb250YWluZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJvdmlkZXJzIHRoYXQgd2Uga25vdyBhcmUgZWFnZXIgZmlyc3RcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9hbGxQcm92aWRlcnMudmFsdWVzKCkpLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICB2YXIgZWFnZXIgPSBwcm92aWRlci5lYWdlciB8fCBfdGhpcy5fcXVlcmllZFRva2Vucy5nZXQodG9rZW5SZWZlcmVuY2UocHJvdmlkZXIudG9rZW4pKTtcbiAgICAgICAgICAgIGlmIChlYWdlcikge1xuICAgICAgICAgICAgICAgIF90aGlzLl9nZXRPckNyZWF0ZUxvY2FsUHJvdmlkZXIocHJvdmlkZXIucHJvdmlkZXJUeXBlLCBwcm92aWRlci50b2tlbiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5hZnRlckVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIGNvbGxlY3QgbGF6eSBwcm92aWRlcnNcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9hbGxQcm92aWRlcnMudmFsdWVzKCkpLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBfdGhpcy5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyKHByb3ZpZGVyLnByb3ZpZGVyVHlwZSwgcHJvdmlkZXIudG9rZW4sIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUsIFwidHJhbnNmb3JtUHJvdmlkZXJzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBOb3RlOiBNYXBzIGtlZXAgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyLlxuICAgICAgICAgICAgdmFyIGxhenlQcm92aWRlcnMgPSBbXTtcbiAgICAgICAgICAgIHZhciBlYWdlclByb3ZpZGVycyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtZWRQcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZWFnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZWFnZXJQcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsYXp5UHJvdmlkZXJzLnB1c2gocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGxhenlQcm92aWRlcnMuY29uY2F0KGVhZ2VyUHJvdmlkZXJzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFByb3ZpZGVyRWxlbWVudENvbnRleHQucHJvdG90eXBlLCBcInRyYW5zZm9ybWVkRGlyZWN0aXZlQXN0c1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHNvcnRlZFByb3ZpZGVyVHlwZXMgPSB0aGlzLnRyYW5zZm9ybVByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiBwcm92aWRlci50b2tlbi5pZGVudGlmaWVyOyB9KTtcbiAgICAgICAgICAgIHZhciBzb3J0ZWREaXJlY3RpdmVzID0gdGhpcy5fZGlyZWN0aXZlQXN0cy5zbGljZSgpO1xuICAgICAgICAgICAgc29ydGVkRGlyZWN0aXZlcy5zb3J0KGZ1bmN0aW9uIChkaXIxLCBkaXIyKSB7IHJldHVybiBzb3J0ZWRQcm92aWRlclR5cGVzLmluZGV4T2YoZGlyMS5kaXJlY3RpdmUudHlwZSkgLVxuICAgICAgICAgICAgICAgIHNvcnRlZFByb3ZpZGVyVHlwZXMuaW5kZXhPZihkaXIyLmRpcmVjdGl2ZS50eXBlKTsgfSk7XG4gICAgICAgICAgICByZXR1cm4gc29ydGVkRGlyZWN0aXZlcztcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFByb3ZpZGVyRWxlbWVudENvbnRleHQucHJvdG90eXBlLCBcInF1ZXJ5TWF0Y2hlc1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFsbE1hdGNoZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJpZWRUb2tlbnMuZm9yRWFjaChmdW5jdGlvbiAobWF0Y2hlcykgeyBhbGxNYXRjaGVzLnB1c2guYXBwbHkoYWxsTWF0Y2hlcywgX19zcHJlYWQobWF0Y2hlcykpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBhbGxNYXRjaGVzO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5fYWRkUXVlcnlSZWFkc1RvID0gZnVuY3Rpb24gKHRva2VuLCBkZWZhdWx0VmFsdWUsIHF1ZXJ5UmVhZFRva2Vucykge1xuICAgICAgICB0aGlzLl9nZXRRdWVyaWVzRm9yKHRva2VuKS5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5VmFsdWUgPSBxdWVyeS5tZXRhLnJlYWQgfHwgZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdmFyIHRva2VuUmVmID0gdG9rZW5SZWZlcmVuY2UocXVlcnlWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgcXVlcnlNYXRjaGVzID0gcXVlcnlSZWFkVG9rZW5zLmdldCh0b2tlblJlZik7XG4gICAgICAgICAgICBpZiAoIXF1ZXJ5TWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHF1ZXJ5UmVhZFRva2Vucy5zZXQodG9rZW5SZWYsIHF1ZXJ5TWF0Y2hlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBxdWVyeU1hdGNoZXMucHVzaCh7IHF1ZXJ5SWQ6IHF1ZXJ5LnF1ZXJ5SWQsIHZhbHVlOiBxdWVyeVZhbHVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFByb3ZpZGVyRWxlbWVudENvbnRleHQucHJvdG90eXBlLl9nZXRRdWVyaWVzRm9yID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIGN1cnJlbnRFbCA9IHRoaXM7XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XG4gICAgICAgIHZhciBxdWVyaWVzO1xuICAgICAgICB3aGlsZSAoY3VycmVudEVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyaWVzID0gY3VycmVudEVsLl9jb250ZW50UXVlcmllcy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgICAgIGlmIChxdWVyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBfX3NwcmVhZChxdWVyaWVzLmZpbHRlcihmdW5jdGlvbiAocXVlcnkpIHsgcmV0dXJuIHF1ZXJ5Lm1ldGEuZGVzY2VuZGFudHMgfHwgZGlzdGFuY2UgPD0gMTsgfSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50RWwuX2RpcmVjdGl2ZUFzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50RWwgPSBjdXJyZW50RWwuX3BhcmVudDtcbiAgICAgICAgfVxuICAgICAgICBxdWVyaWVzID0gdGhpcy52aWV3Q29udGV4dC52aWV3UXVlcmllcy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgaWYgKHF1ZXJpZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoLmFwcGx5KHJlc3VsdCwgX19zcHJlYWQocXVlcmllcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcm92aWRlckVsZW1lbnRDb250ZXh0LnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyID0gZnVuY3Rpb24gKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIHRva2VuLCBlYWdlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzb2x2ZWRQcm92aWRlciA9IHRoaXMuX2FsbFByb3ZpZGVycy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlZFByb3ZpZGVyIHx8ICgocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkRpcmVjdGl2ZSB8fFxuICAgICAgICAgICAgcmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UpICYmXG4gICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLlByaXZhdGVTZXJ2aWNlKSB8fFxuICAgICAgICAgICAgKChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuUHJpdmF0ZVNlcnZpY2UgfHxcbiAgICAgICAgICAgICAgICByZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuUHVibGljU2VydmljZSkgJiZcbiAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkJ1aWx0aW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNmb3JtZWRQcm92aWRlckFzdCA9IHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWRQcm92aWRlckFzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUHJvdmlkZXJBc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlZW5Qcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGV4dC5lcnJvcnMucHVzaChuZXcgUHJvdmlkZXJFcnJvcihcIkNhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEgXCIgKyB0b2tlbk5hbWUodG9rZW4pLCB0aGlzLl9zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWVuUHJvdmlkZXJzLnNldCh0b2tlblJlZmVyZW5jZSh0b2tlbiksIHRydWUpO1xuICAgICAgICB2YXIgdHJhbnNmb3JtZWRQcm92aWRlcnMgPSByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRVc2VWYWx1ZSA9IHByb3ZpZGVyLnVzZVZhbHVlO1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVkVXNlRXhpc3RpbmcgPSBwcm92aWRlci51c2VFeGlzdGluZztcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZERlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0RpRGVwID0gX3RoaXMuX2dldERlcGVuZGVuY3kocmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUsIHsgdG9rZW46IHByb3ZpZGVyLnVzZUV4aXN0aW5nIH0sIGVhZ2VyKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdEaURlcC50b2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVXNlRXhpc3RpbmcgPSBleGlzdGluZ0RpRGVwLnRva2VuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRVc2VFeGlzdGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVXNlVmFsdWUgPSBleGlzdGluZ0RpRGVwLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUZhY3RvcnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVwcyA9IHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlRmFjdG9yeS5kaURlcHM7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtZWREZXBzID1cbiAgICAgICAgICAgICAgICAgICAgZGVwcy5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gX3RoaXMuX2dldERlcGVuZGVuY3kocmVzb2x2ZWRQcm92aWRlci5wcm92aWRlclR5cGUsIGRlcCwgZWFnZXIpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUNsYXNzLmRpRGVwcztcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZERlcHMgPVxuICAgICAgICAgICAgICAgICAgICBkZXBzLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBfdGhpcy5fZ2V0RGVwZW5kZW5jeShyZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVyVHlwZSwgZGVwLCBlYWdlcik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF90cmFuc2Zvcm1Qcm92aWRlcihwcm92aWRlciwge1xuICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0cmFuc2Zvcm1lZFVzZVZhbHVlLFxuICAgICAgICAgICAgICAgIGRlcHM6IHRyYW5zZm9ybWVkRGVwc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0ID1cbiAgICAgICAgICAgIF90cmFuc2Zvcm1Qcm92aWRlckFzdChyZXNvbHZlZFByb3ZpZGVyLCB7IGVhZ2VyOiBlYWdlciwgcHJvdmlkZXJzOiB0cmFuc2Zvcm1lZFByb3ZpZGVycyB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtZWRQcm92aWRlcnMuc2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSwgdHJhbnNmb3JtZWRQcm92aWRlckFzdCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0O1xuICAgIH07XG4gICAgUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUuX2dldExvY2FsRGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlLCBkZXAsIGVhZ2VyKSB7XG4gICAgICAgIGlmIChlYWdlciA9PT0gdm9pZCAwKSB7IGVhZ2VyID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKGRlcC5pc0F0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHRoaXMuX2F0dHJzW2RlcC50b2tlbi52YWx1ZV07XG4gICAgICAgICAgICByZXR1cm4geyBpc1ZhbHVlOiB0cnVlLCB2YWx1ZTogYXR0clZhbHVlID09IG51bGwgPyBudWxsIDogYXR0clZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlcC50b2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBhY2Nlc3MgYnVpbHRpbnRzXG4gICAgICAgICAgICBpZiAoKHJlcXVlc3RpbmdQcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5EaXJlY3RpdmUgfHxcbiAgICAgICAgICAgICAgICByZXF1ZXN0aW5nUHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuQ29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pID09PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250ZXh0LnJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuUmVuZGVyZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250ZXh0LnJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuRWxlbWVudFJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5DaGFuZ2VEZXRlY3RvclJlZikgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5UZW1wbGF0ZVJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5WaWV3Q29udGFpbmVyUmVmKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybWVkSGFzVmlld0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWNjZXNzIHRoZSBpbmplY3RvclxuICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGV4dC5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKElkZW50aWZpZXJzLkluamVjdG9yKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhY2Nlc3MgcHJvdmlkZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyKHJlcXVlc3RpbmdQcm92aWRlclR5cGUsIGRlcC50b2tlbiwgZWFnZXIpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgUHJvdmlkZXJFbGVtZW50Q29udGV4dC5wcm90b3R5cGUuX2dldERlcGVuZGVuY3kgPSBmdW5jdGlvbiAocmVxdWVzdGluZ1Byb3ZpZGVyVHlwZSwgZGVwLCBlYWdlcikge1xuICAgICAgICBpZiAoZWFnZXIgPT09IHZvaWQgMCkgeyBlYWdlciA9IGZhbHNlOyB9XG4gICAgICAgIHZhciBjdXJyRWxlbWVudCA9IHRoaXM7XG4gICAgICAgIHZhciBjdXJyRWFnZXIgPSBlYWdlcjtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGlmICghZGVwLmlzU2tpcFNlbGYpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX2dldExvY2FsRGVwZW5kZW5jeShyZXF1ZXN0aW5nUHJvdmlkZXJUeXBlLCBkZXAsIGVhZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVwLmlzU2VsZikge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQgJiYgZGVwLmlzT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBjaGVjayBwYXJlbnQgZWxlbWVudHNcbiAgICAgICAgICAgIHdoaWxlICghcmVzdWx0ICYmIGN1cnJFbGVtZW50Ll9wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldkVsZW1lbnQgPSBjdXJyRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjdXJyRWxlbWVudCA9IGN1cnJFbGVtZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZFbGVtZW50Ll9pc1ZpZXdSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJFYWdlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyRWxlbWVudC5fZ2V0TG9jYWxEZXBlbmRlbmN5KFByb3ZpZGVyQXN0VHlwZS5QdWJsaWNTZXJ2aWNlLCBkZXAsIGN1cnJFYWdlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayBASG9zdCByZXN0cmljdGlvblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWRlcC5pc0hvc3QgfHwgdGhpcy52aWV3Q29udGV4dC5jb21wb25lbnQuaXNIb3N0IHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQuY29tcG9uZW50LnR5cGUucmVmZXJlbmNlID09PSB0b2tlblJlZmVyZW5jZShkZXAudG9rZW4pIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlld0NvbnRleHQudmlld1Byb3ZpZGVycy5nZXQodG9rZW5SZWZlcmVuY2UoZGVwLnRva2VuKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXAuaXNPcHRpb25hbCA/IHsgaXNWYWx1ZTogdHJ1ZSwgdmFsdWU6IG51bGwgfSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdDb250ZXh0LmVycm9ycy5wdXNoKG5ldyBQcm92aWRlckVycm9yKFwiTm8gcHJvdmlkZXIgZm9yIFwiICsgdG9rZW5OYW1lKGRlcC50b2tlbiksIHRoaXMuX3NvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFByb3ZpZGVyRWxlbWVudENvbnRleHQ7XG59KCkpO1xudmFyIE5nTW9kdWxlUHJvdmlkZXJBbmFseXplciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ01vZHVsZVByb3ZpZGVyQW5hbHl6ZXIocmVmbGVjdG9yLCBuZ01vZHVsZSwgZXh0cmFQcm92aWRlcnMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5yZWZsZWN0b3IgPSByZWZsZWN0b3I7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9zZWVuUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fYWxsUHJvdmlkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBuZ01vZHVsZS50cmFuc2l0aXZlTW9kdWxlLm1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobmdNb2R1bGVUeXBlKSB7XG4gICAgICAgICAgICB2YXIgbmdNb2R1bGVQcm92aWRlciA9IHsgdG9rZW46IHsgaWRlbnRpZmllcjogbmdNb2R1bGVUeXBlIH0sIHVzZUNsYXNzOiBuZ01vZHVsZVR5cGUgfTtcbiAgICAgICAgICAgIF9yZXNvbHZlUHJvdmlkZXJzKFtuZ01vZHVsZVByb3ZpZGVyXSwgUHJvdmlkZXJBc3RUeXBlLlB1YmxpY1NlcnZpY2UsIHRydWUsIHNvdXJjZVNwYW4sIF90aGlzLl9lcnJvcnMsIF90aGlzLl9hbGxQcm92aWRlcnMsIC8qIGlzTW9kdWxlICovIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgX3Jlc29sdmVQcm92aWRlcnMobmdNb2R1bGUudHJhbnNpdGl2ZU1vZHVsZS5wcm92aWRlcnMubWFwKGZ1bmN0aW9uIChlbnRyeSkgeyByZXR1cm4gZW50cnkucHJvdmlkZXI7IH0pLmNvbmNhdChleHRyYVByb3ZpZGVycyksIFByb3ZpZGVyQXN0VHlwZS5QdWJsaWNTZXJ2aWNlLCBmYWxzZSwgc291cmNlU3BhbiwgdGhpcy5fZXJyb3JzLCB0aGlzLl9hbGxQcm92aWRlcnMsIFxuICAgICAgICAvKiBpc01vZHVsZSAqLyBmYWxzZSk7XG4gICAgfVxuICAgIE5nTW9kdWxlUHJvdmlkZXJBbmFseXplci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIEFycmF5LmZyb20odGhpcy5fYWxsUHJvdmlkZXJzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgICAgICAgICAgX3RoaXMuX2dldE9yQ3JlYXRlTG9jYWxQcm92aWRlcihwcm92aWRlci50b2tlbiwgcHJvdmlkZXIuZWFnZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuX2Vycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JTdHJpbmcgPSB0aGlzLl9lcnJvcnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlciBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvclN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogTWFwcyBrZWVwIHRoZWlyIGluc2VydGlvbiBvcmRlci5cbiAgICAgICAgdmFyIGxhenlQcm92aWRlcnMgPSBbXTtcbiAgICAgICAgdmFyIGVhZ2VyUHJvdmlkZXJzID0gW107XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIuZWFnZXIpIHtcbiAgICAgICAgICAgICAgICBlYWdlclByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxhenlQcm92aWRlcnMucHVzaChwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbGF6eVByb3ZpZGVycy5jb25jYXQoZWFnZXJQcm92aWRlcnMpO1xuICAgIH07XG4gICAgTmdNb2R1bGVQcm92aWRlckFuYWx5emVyLnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVMb2NhbFByb3ZpZGVyID0gZnVuY3Rpb24gKHRva2VuLCBlYWdlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzb2x2ZWRQcm92aWRlciA9IHRoaXMuX2FsbFByb3ZpZGVycy5nZXQodG9rZW5SZWZlcmVuY2UodG9rZW4pKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHJhbnNmb3JtZWRQcm92aWRlckFzdCA9IHRoaXMuX3RyYW5zZm9ybWVkUHJvdmlkZXJzLmdldCh0b2tlblJlZmVyZW5jZSh0b2tlbikpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWRQcm92aWRlckFzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkUHJvdmlkZXJBc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlZW5Qcm92aWRlcnMuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IFByb3ZpZGVyRXJyb3IoXCJDYW5ub3QgaW5zdGFudGlhdGUgY3ljbGljIGRlcGVuZGVuY3khIFwiICsgdG9rZW5OYW1lKHRva2VuKSwgcmVzb2x2ZWRQcm92aWRlci5zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWVuUHJvdmlkZXJzLnNldCh0b2tlblJlZmVyZW5jZSh0b2tlbiksIHRydWUpO1xuICAgICAgICB2YXIgdHJhbnNmb3JtZWRQcm92aWRlcnMgPSByZXNvbHZlZFByb3ZpZGVyLnByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRVc2VWYWx1ZSA9IHByb3ZpZGVyLnVzZVZhbHVlO1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVkVXNlRXhpc3RpbmcgPSBwcm92aWRlci51c2VFeGlzdGluZztcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZERlcHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0RpRGVwID0gX3RoaXMuX2dldERlcGVuZGVuY3koeyB0b2tlbjogcHJvdmlkZXIudXNlRXhpc3RpbmcgfSwgZWFnZXIsIHJlc29sdmVkUHJvdmlkZXIuc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRGlEZXAudG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nID0gZXhpc3RpbmdEaURlcC50b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkVXNlRXhpc3RpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFVzZVZhbHVlID0gZXhpc3RpbmdEaURlcC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlcHMgPSBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUZhY3RvcnkuZGlEZXBzO1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRGVwcyA9XG4gICAgICAgICAgICAgICAgICAgIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KGRlcCwgZWFnZXIsIHJlc29sdmVkUHJvdmlkZXIuc291cmNlU3Bhbik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVwcyA9IHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlQ2xhc3MuZGlEZXBzO1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkRGVwcyA9XG4gICAgICAgICAgICAgICAgICAgIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHsgcmV0dXJuIF90aGlzLl9nZXREZXBlbmRlbmN5KGRlcCwgZWFnZXIsIHJlc29sdmVkUHJvdmlkZXIuc291cmNlU3Bhbik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF90cmFuc2Zvcm1Qcm92aWRlcihwcm92aWRlciwge1xuICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiB0cmFuc2Zvcm1lZFVzZUV4aXN0aW5nLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0cmFuc2Zvcm1lZFVzZVZhbHVlLFxuICAgICAgICAgICAgICAgIGRlcHM6IHRyYW5zZm9ybWVkRGVwc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0ID1cbiAgICAgICAgICAgIF90cmFuc2Zvcm1Qcm92aWRlckFzdChyZXNvbHZlZFByb3ZpZGVyLCB7IGVhZ2VyOiBlYWdlciwgcHJvdmlkZXJzOiB0cmFuc2Zvcm1lZFByb3ZpZGVycyB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtZWRQcm92aWRlcnMuc2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSwgdHJhbnNmb3JtZWRQcm92aWRlckFzdCk7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFByb3ZpZGVyQXN0O1xuICAgIH07XG4gICAgTmdNb2R1bGVQcm92aWRlckFuYWx5emVyLnByb3RvdHlwZS5fZ2V0RGVwZW5kZW5jeSA9IGZ1bmN0aW9uIChkZXAsIGVhZ2VyLCByZXF1ZXN0b3JTb3VyY2VTcGFuKSB7XG4gICAgICAgIGlmIChlYWdlciA9PT0gdm9pZCAwKSB7IGVhZ2VyID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKCFkZXAuaXNTa2lwU2VsZiAmJiBkZXAudG9rZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gYWNjZXNzIHRoZSBpbmplY3RvclxuICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKElkZW50aWZpZXJzLkluamVjdG9yKSB8fFxuICAgICAgICAgICAgICAgIHRva2VuUmVmZXJlbmNlKGRlcC50b2tlbikgPT09XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpKSA7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9nZXRPckNyZWF0ZUxvY2FsUHJvdmlkZXIoZGVwLnRva2VuLCBlYWdlcikgIT0gbnVsbCkgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXA7XG4gICAgfTtcbiAgICByZXR1cm4gTmdNb2R1bGVQcm92aWRlckFuYWx5emVyO1xufSgpKTtcbmZ1bmN0aW9uIF90cmFuc2Zvcm1Qcm92aWRlcihwcm92aWRlciwgX2EpIHtcbiAgICB2YXIgdXNlRXhpc3RpbmcgPSBfYS51c2VFeGlzdGluZywgdXNlVmFsdWUgPSBfYS51c2VWYWx1ZSwgZGVwcyA9IF9hLmRlcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHByb3ZpZGVyLnRva2VuLFxuICAgICAgICB1c2VDbGFzczogcHJvdmlkZXIudXNlQ2xhc3MsXG4gICAgICAgIHVzZUV4aXN0aW5nOiB1c2VFeGlzdGluZyxcbiAgICAgICAgdXNlRmFjdG9yeTogcHJvdmlkZXIudXNlRmFjdG9yeSxcbiAgICAgICAgdXNlVmFsdWU6IHVzZVZhbHVlLFxuICAgICAgICBkZXBzOiBkZXBzLFxuICAgICAgICBtdWx0aTogcHJvdmlkZXIubXVsdGlcbiAgICB9O1xufVxuZnVuY3Rpb24gX3RyYW5zZm9ybVByb3ZpZGVyQXN0KHByb3ZpZGVyLCBfYSkge1xuICAgIHZhciBlYWdlciA9IF9hLmVhZ2VyLCBwcm92aWRlcnMgPSBfYS5wcm92aWRlcnM7XG4gICAgcmV0dXJuIG5ldyBQcm92aWRlckFzdChwcm92aWRlci50b2tlbiwgcHJvdmlkZXIubXVsdGlQcm92aWRlciwgcHJvdmlkZXIuZWFnZXIgfHwgZWFnZXIsIHByb3ZpZGVycywgcHJvdmlkZXIucHJvdmlkZXJUeXBlLCBwcm92aWRlci5saWZlY3ljbGVIb29rcywgcHJvdmlkZXIuc291cmNlU3BhbiwgcHJvdmlkZXIuaXNNb2R1bGUpO1xufVxuZnVuY3Rpb24gX3Jlc29sdmVQcm92aWRlcnNGcm9tRGlyZWN0aXZlcyhkaXJlY3RpdmVzLCBzb3VyY2VTcGFuLCB0YXJnZXRFcnJvcnMpIHtcbiAgICB2YXIgcHJvdmlkZXJzQnlUb2tlbiA9IG5ldyBNYXAoKTtcbiAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGl2ZSkge1xuICAgICAgICB2YXIgZGlyUHJvdmlkZXIgPSB7IHRva2VuOiB7IGlkZW50aWZpZXI6IGRpcmVjdGl2ZS50eXBlIH0sIHVzZUNsYXNzOiBkaXJlY3RpdmUudHlwZSB9O1xuICAgICAgICBfcmVzb2x2ZVByb3ZpZGVycyhbZGlyUHJvdmlkZXJdLCBkaXJlY3RpdmUuaXNDb21wb25lbnQgPyBQcm92aWRlckFzdFR5cGUuQ29tcG9uZW50IDogUHJvdmlkZXJBc3RUeXBlLkRpcmVjdGl2ZSwgdHJ1ZSwgc291cmNlU3BhbiwgdGFyZ2V0RXJyb3JzLCBwcm92aWRlcnNCeVRva2VuLCAvKiBpc01vZHVsZSAqLyBmYWxzZSk7XG4gICAgfSk7XG4gICAgLy8gTm90ZTogZGlyZWN0aXZlcyBuZWVkIHRvIGJlIGFibGUgdG8gb3ZlcndyaXRlIHByb3ZpZGVycyBvZiBhIGNvbXBvbmVudCFcbiAgICB2YXIgZGlyZWN0aXZlc1dpdGhDb21wb25lbnRGaXJzdCA9IGRpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGRpci5pc0NvbXBvbmVudDsgfSkuY29uY2F0KGRpcmVjdGl2ZXMuZmlsdGVyKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuICFkaXIuaXNDb21wb25lbnQ7IH0pKTtcbiAgICBkaXJlY3RpdmVzV2l0aENvbXBvbmVudEZpcnN0LmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGl2ZSkge1xuICAgICAgICBfcmVzb2x2ZVByb3ZpZGVycyhkaXJlY3RpdmUucHJvdmlkZXJzLCBQcm92aWRlckFzdFR5cGUuUHVibGljU2VydmljZSwgZmFsc2UsIHNvdXJjZVNwYW4sIHRhcmdldEVycm9ycywgcHJvdmlkZXJzQnlUb2tlbiwgLyogaXNNb2R1bGUgKi8gZmFsc2UpO1xuICAgICAgICBfcmVzb2x2ZVByb3ZpZGVycyhkaXJlY3RpdmUudmlld1Byb3ZpZGVycywgUHJvdmlkZXJBc3RUeXBlLlByaXZhdGVTZXJ2aWNlLCBmYWxzZSwgc291cmNlU3BhbiwgdGFyZ2V0RXJyb3JzLCBwcm92aWRlcnNCeVRva2VuLCAvKiBpc01vZHVsZSAqLyBmYWxzZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3ZpZGVyc0J5VG9rZW47XG59XG5mdW5jdGlvbiBfcmVzb2x2ZVByb3ZpZGVycyhwcm92aWRlcnMsIHByb3ZpZGVyVHlwZSwgZWFnZXIsIHNvdXJjZVNwYW4sIHRhcmdldEVycm9ycywgdGFyZ2V0UHJvdmlkZXJzQnlUb2tlbiwgaXNNb2R1bGUpIHtcbiAgICBwcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvdmlkZXIgPSB0YXJnZXRQcm92aWRlcnNCeVRva2VuLmdldCh0b2tlblJlZmVyZW5jZShwcm92aWRlci50b2tlbikpO1xuICAgICAgICBpZiAocmVzb2x2ZWRQcm92aWRlciAhPSBudWxsICYmICEhcmVzb2x2ZWRQcm92aWRlci5tdWx0aVByb3ZpZGVyICE9PSAhIXByb3ZpZGVyLm11bHRpKSB7XG4gICAgICAgICAgICB0YXJnZXRFcnJvcnMucHVzaChuZXcgUHJvdmlkZXJFcnJvcihcIk1peGluZyBtdWx0aSBhbmQgbm9uIG11bHRpIHByb3ZpZGVyIGlzIG5vdCBwb3NzaWJsZSBmb3IgdG9rZW4gXCIgKyB0b2tlbk5hbWUocmVzb2x2ZWRQcm92aWRlci50b2tlbiksIHNvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc29sdmVkUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHZhciBsaWZlY3ljbGVIb29rcyA9IHByb3ZpZGVyLnRva2VuLmlkZW50aWZpZXIgJiZcbiAgICAgICAgICAgICAgICBwcm92aWRlci50b2tlbi5pZGVudGlmaWVyLmxpZmVjeWNsZUhvb2tzID9cbiAgICAgICAgICAgICAgICBwcm92aWRlci50b2tlbi5pZGVudGlmaWVyLmxpZmVjeWNsZUhvb2tzIDpcbiAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgIHZhciBpc1VzZVZhbHVlID0gIShwcm92aWRlci51c2VDbGFzcyB8fCBwcm92aWRlci51c2VFeGlzdGluZyB8fCBwcm92aWRlci51c2VGYWN0b3J5KTtcbiAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJBc3QocHJvdmlkZXIudG9rZW4sICEhcHJvdmlkZXIubXVsdGksIGVhZ2VyIHx8IGlzVXNlVmFsdWUsIFtwcm92aWRlcl0sIHByb3ZpZGVyVHlwZSwgbGlmZWN5Y2xlSG9va3MsIHNvdXJjZVNwYW4sIGlzTW9kdWxlKTtcbiAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyc0J5VG9rZW4uc2V0KHRva2VuUmVmZXJlbmNlKHByb3ZpZGVyLnRva2VuKSwgcmVzb2x2ZWRQcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXByb3ZpZGVyLm11bHRpKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQcm92aWRlci5wcm92aWRlcnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIucHJvdmlkZXJzLnB1c2gocHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBfZ2V0Vmlld1F1ZXJpZXMoY29tcG9uZW50KSB7XG4gICAgLy8gTm90ZTogcXVlcmllcyBzdGFydCB3aXRoIGlkIDEgc28gd2UgY2FuIHVzZSB0aGUgbnVtYmVyIGluIGEgQmxvb20gZmlsdGVyIVxuICAgIHZhciB2aWV3UXVlcnlJZCA9IDE7XG4gICAgdmFyIHZpZXdRdWVyaWVzID0gbmV3IE1hcCgpO1xuICAgIGlmIChjb21wb25lbnQudmlld1F1ZXJpZXMpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdRdWVyaWVzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5KSB7IHJldHVybiBfYWRkUXVlcnlUb1Rva2VuTWFwKHZpZXdRdWVyaWVzLCB7IG1ldGE6IHF1ZXJ5LCBxdWVyeUlkOiB2aWV3UXVlcnlJZCsrIH0pOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdRdWVyaWVzO1xufVxuZnVuY3Rpb24gX2dldENvbnRlbnRRdWVyaWVzKGNvbnRlbnRRdWVyeVN0YXJ0SWQsIGRpcmVjdGl2ZXMpIHtcbiAgICB2YXIgY29udGVudFF1ZXJ5SWQgPSBjb250ZW50UXVlcnlTdGFydElkO1xuICAgIHZhciBjb250ZW50UXVlcmllcyA9IG5ldyBNYXAoKTtcbiAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGl2ZSwgZGlyZWN0aXZlSW5kZXgpIHtcbiAgICAgICAgaWYgKGRpcmVjdGl2ZS5xdWVyaWVzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmUucXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkgeyByZXR1cm4gX2FkZFF1ZXJ5VG9Ub2tlbk1hcChjb250ZW50UXVlcmllcywgeyBtZXRhOiBxdWVyeSwgcXVlcnlJZDogY29udGVudFF1ZXJ5SWQrKyB9KTsgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29udGVudFF1ZXJpZXM7XG59XG5mdW5jdGlvbiBfYWRkUXVlcnlUb1Rva2VuTWFwKG1hcCwgcXVlcnkpIHtcbiAgICBxdWVyeS5tZXRhLnNlbGVjdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICB2YXIgZW50cnkgPSBtYXAuZ2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSk7XG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gW107XG4gICAgICAgICAgICBtYXAuc2V0KHRva2VuUmVmZXJlbmNlKHRva2VuKSwgZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJ5LnB1c2gocXVlcnkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgU3R5bGVXaXRoSW1wb3J0cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdHlsZVdpdGhJbXBvcnRzKHN0eWxlLCBzdHlsZVVybHMpIHtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLnN0eWxlVXJscyA9IHN0eWxlVXJscztcbiAgICB9XG4gICAgcmV0dXJuIFN0eWxlV2l0aEltcG9ydHM7XG59KCkpO1xuZnVuY3Rpb24gaXNTdHlsZVVybFJlc29sdmFibGUodXJsKSB7XG4gICAgaWYgKHVybCA9PSBudWxsIHx8IHVybC5sZW5ndGggPT09IDAgfHwgdXJsWzBdID09ICcvJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzY2hlbWVNYXRjaCA9IHVybC5tYXRjaChVUkxfV0lUSF9TQ0hFTUFfUkVHRVhQKTtcbiAgICByZXR1cm4gc2NoZW1lTWF0Y2ggPT09IG51bGwgfHwgc2NoZW1lTWF0Y2hbMV0gPT0gJ3BhY2thZ2UnIHx8IHNjaGVtZU1hdGNoWzFdID09ICdhc3NldCc7XG59XG4vKipcbiAqIFJld3JpdGVzIHN0eWxlc2hlZXRzIGJ5IHJlc29sdmluZyBhbmQgcmVtb3ZpbmcgdGhlIEBpbXBvcnQgdXJscyB0aGF0XG4gKiBhcmUgZWl0aGVyIHJlbGF0aXZlIG9yIGRvbid0IGhhdmUgYSBgcGFja2FnZTpgIHNjaGVtZVxuICovXG5mdW5jdGlvbiBleHRyYWN0U3R5bGVVcmxzKHJlc29sdmVyLCBiYXNlVXJsLCBjc3NUZXh0KSB7XG4gICAgdmFyIGZvdW5kVXJscyA9IFtdO1xuICAgIHZhciBtb2RpZmllZENzc1RleHQgPSBjc3NUZXh0LnJlcGxhY2UoQ1NTX1NUUklQUEFCTEVfQ09NTUVOVF9SRUdFWFAsICcnKVxuICAgICAgICAucmVwbGFjZShDU1NfSU1QT1JUX1JFR0VYUCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbVtfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1cmwgPSBtWzFdIHx8IG1bMl07XG4gICAgICAgIGlmICghaXNTdHlsZVVybFJlc29sdmFibGUodXJsKSkge1xuICAgICAgICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZSBub24tcGFja2FnZSBhYnNvbHV0ZSBVUkxzIHdpdGggVVJJXG4gICAgICAgICAgICAvLyBzY2hlbWVcbiAgICAgICAgICAgIHJldHVybiBtWzBdO1xuICAgICAgICB9XG4gICAgICAgIGZvdW5kVXJscy5wdXNoKHJlc29sdmVyLnJlc29sdmUoYmFzZVVybCwgdXJsKSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFN0eWxlV2l0aEltcG9ydHMobW9kaWZpZWRDc3NUZXh0LCBmb3VuZFVybHMpO1xufVxudmFyIENTU19JTVBPUlRfUkVHRVhQID0gL0BpbXBvcnRcXHMrKD86dXJsXFwoKT9cXHMqKD86KD86WydcIl0oW14nXCJdKikpfChbXjtcXClcXHNdKikpW147XSo7Py9nO1xudmFyIENTU19TVFJJUFBBQkxFX0NPTU1FTlRfUkVHRVhQID0gL1xcL1xcKig/ISNcXHMqKD86c291cmNlVVJMfHNvdXJjZU1hcHBpbmdVUkwpPSlbXFxzXFxTXSs/XFwqXFwvL2c7XG52YXIgVVJMX1dJVEhfU0NIRU1BX1JFR0VYUCA9IC9eKFteOi8/I10rKTovO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUFJPUEVSVFlfUEFSVFNfU0VQQVJBVE9SID0gJy4nO1xudmFyIEFUVFJJQlVURV9QUkVGSVggPSAnYXR0cic7XG52YXIgQ0xBU1NfUFJFRklYID0gJ2NsYXNzJztcbnZhciBTVFlMRV9QUkVGSVggPSAnc3R5bGUnO1xudmFyIEFOSU1BVEVfUFJPUF9QUkVGSVggPSAnYW5pbWF0ZS0nO1xuLyoqXG4gKiBQYXJzZXMgYmluZGluZ3MgaW4gdGVtcGxhdGVzIGFuZCBpbiB0aGUgZGlyZWN0aXZlIGhvc3QgYXJlYS5cbiAqL1xudmFyIEJpbmRpbmdQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZGluZ1BhcnNlcihfZXhwclBhcnNlciwgX2ludGVycG9sYXRpb25Db25maWcsIF9zY2hlbWFSZWdpc3RyeSwgcGlwZXMsIGVycm9ycykge1xuICAgICAgICB0aGlzLl9leHByUGFyc2VyID0gX2V4cHJQYXJzZXI7XG4gICAgICAgIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcgPSBfaW50ZXJwb2xhdGlvbkNvbmZpZztcbiAgICAgICAgdGhpcy5fc2NoZW1hUmVnaXN0cnkgPSBfc2NoZW1hUmVnaXN0cnk7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICB0aGlzLnBpcGVzQnlOYW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXNlZFBpcGVzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBXaGVuIHRoZSBgcGlwZXNgIHBhcmFtZXRlciBpcyBgbnVsbGAsIGRvIG5vdCBjaGVjayBmb3IgdXNlZCBwaXBlc1xuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgaW4gSVZZIHdoZW4gd2UgbWlnaHQgbm90IGtub3cgdGhlIGF2YWlsYWJsZSBwaXBlcyBhdCBjb21waWxlIHRpbWVcbiAgICAgICAgaWYgKHBpcGVzKSB7XG4gICAgICAgICAgICB2YXIgcGlwZXNCeU5hbWVfMSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHBpcGVzLmZvckVhY2goZnVuY3Rpb24gKHBpcGUpIHsgcmV0dXJuIHBpcGVzQnlOYW1lXzEuc2V0KHBpcGUubmFtZSwgcGlwZSk7IH0pO1xuICAgICAgICAgICAgdGhpcy5waXBlc0J5TmFtZSA9IHBpcGVzQnlOYW1lXzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLCBcImludGVycG9sYXRpb25Db25maWdcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ludGVycG9sYXRpb25Db25maWc7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLmdldFVzZWRQaXBlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fdXNlZFBpcGVzLnZhbHVlcygpKTsgfTtcbiAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVCb3VuZEhvc3RQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGRpck1ldGEsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGRpck1ldGEuaG9zdFByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHZhciBib3VuZFByb3BzXzEgPSBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpck1ldGEuaG9zdFByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBkaXJNZXRhLmhvc3RQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnBhcnNlUHJvcGVydHlCaW5kaW5nKHByb3BOYW1lLCBleHByZXNzaW9uLCB0cnVlLCBzb3VyY2VTcGFuLCBbXSwgYm91bmRQcm9wc18xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihcIlZhbHVlIG9mIHRoZSBob3N0IHByb3BlcnR5IGJpbmRpbmcgXFxcIlwiICsgcHJvcE5hbWUgKyBcIlxcXCIgbmVlZHMgdG8gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIGV4cHJlc3Npb24gYnV0IGdvdCBcXFwiXCIgKyBleHByZXNzaW9uICsgXCJcXFwiIChcIiArIHR5cGVvZiBleHByZXNzaW9uICsgXCIpXCIsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJvdW5kUHJvcHNfMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLmNyZWF0ZURpcmVjdGl2ZUhvc3RQcm9wZXJ0eUFzdHMgPSBmdW5jdGlvbiAoZGlyTWV0YSwgZWxlbWVudFNlbGVjdG9yLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBib3VuZFByb3BzID0gdGhpcy5jcmVhdGVCb3VuZEhvc3RQcm9wZXJ0aWVzKGRpck1ldGEsIHNvdXJjZVNwYW4pO1xuICAgICAgICByZXR1cm4gYm91bmRQcm9wcyAmJlxuICAgICAgICAgICAgYm91bmRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHsgcmV0dXJuIF90aGlzLmNyZWF0ZUJvdW5kRWxlbWVudFByb3BlcnR5KGVsZW1lbnRTZWxlY3RvciwgcHJvcCk7IH0pO1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuY3JlYXRlRGlyZWN0aXZlSG9zdEV2ZW50QXN0cyA9IGZ1bmN0aW9uIChkaXJNZXRhLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChkaXJNZXRhLmhvc3RMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXRFdmVudHNfMSA9IFtdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlyTWV0YS5ob3N0TGlzdGVuZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gZGlyTWV0YS5ob3N0TGlzdGVuZXJzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cHJlc3Npb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHBhc3MgYSBtb3JlIGFjY3VyYXRlIGhhbmRsZXJTcGFuIGZvciB0aGlzIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYXJzZUV2ZW50KHByb3BOYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCBzb3VyY2VTcGFuLCBbXSwgdGFyZ2V0RXZlbnRzXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKFwiVmFsdWUgb2YgdGhlIGhvc3QgbGlzdGVuZXIgXFxcIlwiICsgcHJvcE5hbWUgKyBcIlxcXCIgbmVlZHMgdG8gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGFuIGV4cHJlc3Npb24gYnV0IGdvdCBcXFwiXCIgKyBleHByZXNzaW9uICsgXCJcXFwiIChcIiArIHR5cGVvZiBleHByZXNzaW9uICsgXCIpXCIsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldEV2ZW50c18xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUucGFyc2VJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGFzdCA9IHRoaXMuX2V4cHJQYXJzZXIucGFyc2VJbnRlcnBvbGF0aW9uKHZhbHVlLCBzb3VyY2VJbmZvLCB0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgICAgIGlmIChhc3QpXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXhwcmVzc2lvblBhcnNlckVycm9ycyhhc3QuZXJyb3JzLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGlwZXMoYXN0LCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIHJldHVybiBhc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiXCIgKyBlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKCdFUlJPUicsIHNvdXJjZUluZm8pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBQYXJzZSBhbiBpbmxpbmUgdGVtcGxhdGUgYmluZGluZy4gaWUgYDx0YWcgKnRwbEtleT1cIjx0cGxWYWx1ZT5cIj5gXG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUucGFyc2VJbmxpbmVUZW1wbGF0ZUJpbmRpbmcgPSBmdW5jdGlvbiAodHBsS2V5LCB0cGxWYWx1ZSwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzLCB0YXJnZXRWYXJzKSB7XG4gICAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX3BhcnNlVGVtcGxhdGVCaW5kaW5ncyh0cGxLZXksIHRwbFZhbHVlLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1tpXTtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nLmtleUlzVmFyKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0VmFycy5wdXNoKG5ldyBQYXJzZWRWYXJpYWJsZShiaW5kaW5nLmtleSwgYmluZGluZy5uYW1lLCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVByb3BlcnR5QXN0KGJpbmRpbmcua2V5LCBiaW5kaW5nLmV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycy5wdXNoKFtiaW5kaW5nLmtleSwgJyddKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlTGl0ZXJhbEF0dHIoYmluZGluZy5rZXksIG51bGwsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9wYXJzZVRlbXBsYXRlQmluZGluZ3MgPSBmdW5jdGlvbiAodHBsS2V5LCB0cGxWYWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc291cmNlSW5mbyA9IHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBiaW5kaW5nc1Jlc3VsdCA9IHRoaXMuX2V4cHJQYXJzZXIucGFyc2VUZW1wbGF0ZUJpbmRpbmdzKHRwbEtleSwgdHBsVmFsdWUsIHNvdXJjZUluZm8pO1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXhwcmVzc2lvblBhcnNlckVycm9ycyhiaW5kaW5nc1Jlc3VsdC5lcnJvcnMsIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgYmluZGluZ3NSZXN1bHQudGVtcGxhdGVCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2hlY2tQaXBlcyhiaW5kaW5nLmV4cHJlc3Npb24sIHNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmluZGluZ3NSZXN1bHQud2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAod2FybmluZykgeyBfdGhpcy5fcmVwb3J0RXJyb3Iod2FybmluZywgc291cmNlU3BhbiwgUGFyc2VFcnJvckxldmVsLldBUk5JTkcpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nc1Jlc3VsdC50ZW1wbGF0ZUJpbmRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlwiICsgZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLnBhcnNlTGl0ZXJhbEF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcykge1xuICAgICAgICBpZiAoaXNBbmltYXRpb25MYWJlbChuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoXCJBc3NpZ25pbmcgYW5pbWF0aW9uIHRyaWdnZXJzIHZpYSBAcHJvcD1cXFwiZXhwXFxcIiBhdHRyaWJ1dGVzIHdpdGggYW4gZXhwcmVzc2lvbiBpcyBpbnZhbGlkLlwiICtcbiAgICAgICAgICAgICAgICAgICAgXCIgVXNlIHByb3BlcnR5IGJpbmRpbmdzIChlLmcuIFtAcHJvcF09XFxcImV4cFxcXCIpIG9yIHVzZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCBhIHZhbHVlIChlLmcuIEBwcm9wKSBpbnN0ZWFkLlwiLCBzb3VyY2VTcGFuLCBQYXJzZUVycm9yTGV2ZWwuRVJST1IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGFyc2VBbmltYXRpb24obmFtZSwgdmFsdWUsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQcm9wcy5wdXNoKG5ldyBQYXJzZWRQcm9wZXJ0eShuYW1lLCB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKHZhbHVlLCAnJyksIFBhcnNlZFByb3BlcnR5VHlwZS5MSVRFUkFMX0FUVFIsIHNvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eUJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgaXNIb3N0LCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgdmFyIGlzQW5pbWF0aW9uUHJvcCA9IGZhbHNlO1xuICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKEFOSU1BVEVfUFJPUF9QUkVGSVgpKSB7XG4gICAgICAgICAgICBpc0FuaW1hdGlvblByb3AgPSB0cnVlO1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKEFOSU1BVEVfUFJPUF9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FuaW1hdGlvbkxhYmVsKG5hbWUpKSB7XG4gICAgICAgICAgICBpc0FuaW1hdGlvblByb3AgPSB0cnVlO1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FuaW1hdGlvblByb3ApIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlQW5pbWF0aW9uKG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZVByb3BlcnR5QXN0KG5hbWUsIHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBpc0hvc3QsIHNvdXJjZVNwYW4pLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKSB7XG4gICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUludGVycG9sYXRpb24odmFsdWUsIHNvdXJjZVNwYW4pO1xuICAgICAgICBpZiAoZXhwcikge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eUFzdChuYW1lLCBleHByLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlUHJvcGVydHlBc3QgPSBmdW5jdGlvbiAobmFtZSwgYXN0LCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpIHtcbiAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbbmFtZSwgYXN0LnNvdXJjZV0pO1xuICAgICAgICB0YXJnZXRQcm9wcy5wdXNoKG5ldyBQYXJzZWRQcm9wZXJ0eShuYW1lLCBhc3QsIFBhcnNlZFByb3BlcnR5VHlwZS5ERUZBVUxULCBzb3VyY2VTcGFuKSk7XG4gICAgfTtcbiAgICBCaW5kaW5nUGFyc2VyLnByb3RvdHlwZS5fcGFyc2VBbmltYXRpb24gPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBvY2N1ciB3aGVuIGEgQHRyaWdnZXIgaXMgbm90IHBhaXJlZCB3aXRoIGFuIGV4cHJlc3Npb24uXG4gICAgICAgIC8vIEZvciBhbmltYXRpb25zIGl0IGlzIHZhbGlkIHRvIG5vdCBoYXZlIGFuIGV4cHJlc3Npb24gc2luY2UgKi92b2lkXG4gICAgICAgIC8vIHN0YXRlcyB3aWxsIGJlIGFwcGxpZWQgYnkgYW5ndWxhciB3aGVuIHRoZSBlbGVtZW50IGlzIGF0dGFjaGVkL2RldGFjaGVkXG4gICAgICAgIHZhciBhc3QgPSB0aGlzLl9wYXJzZUJpbmRpbmcoZXhwcmVzc2lvbiB8fCAndW5kZWZpbmVkJywgZmFsc2UsIHNvdXJjZVNwYW4pO1xuICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycy5wdXNoKFtuYW1lLCBhc3Quc291cmNlXSk7XG4gICAgICAgIHRhcmdldFByb3BzLnB1c2gobmV3IFBhcnNlZFByb3BlcnR5KG5hbWUsIGFzdCwgUGFyc2VkUHJvcGVydHlUeXBlLkFOSU1BVElPTiwgc291cmNlU3BhbikpO1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlQmluZGluZyA9IGZ1bmN0aW9uICh2YWx1ZSwgaXNIb3N0QmluZGluZywgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgc291cmNlSW5mbyA9IChzb3VyY2VTcGFuICYmIHNvdXJjZVNwYW4uc3RhcnQgfHwgJyh1bmtub3duKScpLnRvU3RyaW5nKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgYXN0ID0gaXNIb3N0QmluZGluZyA/XG4gICAgICAgICAgICAgICAgdGhpcy5fZXhwclBhcnNlci5wYXJzZVNpbXBsZUJpbmRpbmcodmFsdWUsIHNvdXJjZUluZm8sIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9leHByUGFyc2VyLnBhcnNlQmluZGluZyh2YWx1ZSwgc291cmNlSW5mbywgdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgICAgICBpZiAoYXN0KVxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEV4cHJlc3Npb25QYXJzZXJFcnJvcnMoYXN0LmVycm9ycywgc291cmNlU3Bhbik7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1BpcGVzKGFzdCwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlwiICsgZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuY3JlYXRlQm91bmRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlbWVudFNlbGVjdG9yLCBib3VuZFByb3AsIHNraXBWYWxpZGF0aW9uLCBtYXBQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgaWYgKHNraXBWYWxpZGF0aW9uID09PSB2b2lkIDApIHsgc2tpcFZhbGlkYXRpb24gPSBmYWxzZTsgfVxuICAgICAgICBpZiAobWFwUHJvcGVydHlOYW1lID09PSB2b2lkIDApIHsgbWFwUHJvcGVydHlOYW1lID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoYm91bmRQcm9wLmlzQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJvdW5kRWxlbWVudFByb3BlcnR5KGJvdW5kUHJvcC5uYW1lLCA0IC8qIEFuaW1hdGlvbiAqLywgU2VjdXJpdHlDb250ZXh0Lk5PTkUsIGJvdW5kUHJvcC5leHByZXNzaW9uLCBudWxsLCBib3VuZFByb3Auc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVuaXQgPSBudWxsO1xuICAgICAgICB2YXIgYmluZGluZ1R5cGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBib3VuZFByb3BlcnR5TmFtZSA9IG51bGw7XG4gICAgICAgIHZhciBwYXJ0cyA9IGJvdW5kUHJvcC5uYW1lLnNwbGl0KFBST1BFUlRZX1BBUlRTX1NFUEFSQVRPUik7XG4gICAgICAgIHZhciBzZWN1cml0eUNvbnRleHRzID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBDaGVjayBmb3Igc3BlY2lhbCBjYXNlcyAocHJlZml4IHN0eWxlLCBhdHRyLCBjbGFzcylcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1swXSA9PSBBVFRSSUJVVEVfUFJFRklYKSB7XG4gICAgICAgICAgICAgICAgYm91bmRQcm9wZXJ0eU5hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXNraXBWYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlUHJvcGVydHlPckF0dHJpYnV0ZU5hbWUoYm91bmRQcm9wZXJ0eU5hbWUsIGJvdW5kUHJvcC5zb3VyY2VTcGFuLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0cyA9IGNhbGNQb3NzaWJsZVNlY3VyaXR5Q29udGV4dHModGhpcy5fc2NoZW1hUmVnaXN0cnksIGVsZW1lbnRTZWxlY3RvciwgYm91bmRQcm9wZXJ0eU5hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBuc1NlcGFyYXRvcklkeCA9IGJvdW5kUHJvcGVydHlOYW1lLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgICAgICBpZiAobnNTZXBhcmF0b3JJZHggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnMgPSBib3VuZFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgbnNTZXBhcmF0b3JJZHgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gYm91bmRQcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKG5zU2VwYXJhdG9ySWR4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gbWVyZ2VOc0FuZE5hbWUobnMsIG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gMSAvKiBBdHRyaWJ1dGUgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJ0c1swXSA9PSBDTEFTU19QUkVGSVgpIHtcbiAgICAgICAgICAgICAgICBib3VuZFByb3BlcnR5TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gMiAvKiBDbGFzcyAqLztcbiAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHRzID0gW1NlY3VyaXR5Q29udGV4dC5OT05FXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRzWzBdID09IFNUWUxFX1BSRUZJWCkge1xuICAgICAgICAgICAgICAgIHVuaXQgPSBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHNbMl0gOiBudWxsO1xuICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gcGFydHNbMV07XG4gICAgICAgICAgICAgICAgYmluZGluZ1R5cGUgPSAzIC8qIFN0eWxlICovO1xuICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dHMgPSBbU2VjdXJpdHlDb250ZXh0LlNUWUxFXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBub3QgYSBzcGVjaWFsIGNhc2UsIHVzZSB0aGUgZnVsbCBwcm9wZXJ0eSBuYW1lXG4gICAgICAgIGlmIChib3VuZFByb3BlcnR5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG1hcHBlZFByb3BOYW1lID0gdGhpcy5fc2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUoYm91bmRQcm9wLm5hbWUpO1xuICAgICAgICAgICAgYm91bmRQcm9wZXJ0eU5hbWUgPSBtYXBQcm9wZXJ0eU5hbWUgPyBtYXBwZWRQcm9wTmFtZSA6IGJvdW5kUHJvcC5uYW1lO1xuICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0cyA9IGNhbGNQb3NzaWJsZVNlY3VyaXR5Q29udGV4dHModGhpcy5fc2NoZW1hUmVnaXN0cnksIGVsZW1lbnRTZWxlY3RvciwgbWFwcGVkUHJvcE5hbWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gMCAvKiBQcm9wZXJ0eSAqLztcbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVByb3BlcnR5T3JBdHRyaWJ1dGVOYW1lKG1hcHBlZFByb3BOYW1lLCBib3VuZFByb3Auc291cmNlU3BhbiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQm91bmRFbGVtZW50UHJvcGVydHkoYm91bmRQcm9wZXJ0eU5hbWUsIGJpbmRpbmdUeXBlLCBzZWN1cml0eUNvbnRleHRzWzBdLCBib3VuZFByb3AuZXhwcmVzc2lvbiwgdW5pdCwgYm91bmRQcm9wLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUucGFyc2VFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCBoYW5kbGVyU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldEV2ZW50cykge1xuICAgICAgICBpZiAoaXNBbmltYXRpb25MYWJlbChuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEpO1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VBbmltYXRpb25FdmVudChuYW1lLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuLCBoYW5kbGVyU3BhbiwgdGFyZ2V0RXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlUmVndWxhckV2ZW50KG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIGhhbmRsZXJTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuY2FsY1Bvc3NpYmxlU2VjdXJpdHlDb250ZXh0cyA9IGZ1bmN0aW9uIChzZWxlY3RvciwgcHJvcE5hbWUsIGlzQXR0cmlidXRlKSB7XG4gICAgICAgIHZhciBwcm9wID0gdGhpcy5fc2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUocHJvcE5hbWUpO1xuICAgICAgICByZXR1cm4gY2FsY1Bvc3NpYmxlU2VjdXJpdHlDb250ZXh0cyh0aGlzLl9zY2hlbWFSZWdpc3RyeSwgc2VsZWN0b3IsIHByb3AsIGlzQXR0cmlidXRlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9wYXJzZUFuaW1hdGlvbkV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIGhhbmRsZXJTcGFuLCB0YXJnZXRFdmVudHMpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBzcGxpdEF0UGVyaW9kKG5hbWUsIFtuYW1lLCAnJ10pO1xuICAgICAgICB2YXIgZXZlbnROYW1lID0gbWF0Y2hlc1swXTtcbiAgICAgICAgdmFyIHBoYXNlID0gbWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocGhhc2UpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGhhc2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3QgPSB0aGlzLl9wYXJzZUFjdGlvbihleHByZXNzaW9uLCBoYW5kbGVyU3Bhbik7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEV2ZW50cy5wdXNoKG5ldyBQYXJzZWRFdmVudChldmVudE5hbWUsIHBoYXNlLCAxIC8qIEFuaW1hdGlvbiAqLywgYXN0LCBzb3VyY2VTcGFuLCBoYW5kbGVyU3BhbikpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlRoZSBwcm92aWRlZCBhbmltYXRpb24gb3V0cHV0IHBoYXNlIHZhbHVlIFxcXCJcIiArIHBoYXNlICsgXCJcXFwiIGZvciBcXFwiQFwiICsgZXZlbnROYW1lICsgXCJcXFwiIGlzIG5vdCBzdXBwb3J0ZWQgKHVzZSBzdGFydCBvciBkb25lKVwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlRoZSBhbmltYXRpb24gdHJpZ2dlciBvdXRwdXQgZXZlbnQgKEBcIiArIGV2ZW50TmFtZSArIFwiKSBpcyBtaXNzaW5nIGl0cyBwaGFzZSB2YWx1ZSBuYW1lIChzdGFydCBvciBkb25lIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkKVwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlUmVndWxhckV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGV4cHJlc3Npb24sIHNvdXJjZVNwYW4sIGhhbmRsZXJTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKSB7XG4gICAgICAgIC8vIGxvbmcgZm9ybWF0OiAndGFyZ2V0OiBldmVudE5hbWUnXG4gICAgICAgIHZhciBfYSA9IF9fcmVhZChzcGxpdEF0Q29sb24obmFtZSwgW251bGwsIG5hbWVdKSwgMiksIHRhcmdldCA9IF9hWzBdLCBldmVudE5hbWUgPSBfYVsxXTtcbiAgICAgICAgdmFyIGFzdCA9IHRoaXMuX3BhcnNlQWN0aW9uKGV4cHJlc3Npb24sIGhhbmRsZXJTcGFuKTtcbiAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbbmFtZSwgYXN0LnNvdXJjZV0pO1xuICAgICAgICB0YXJnZXRFdmVudHMucHVzaChuZXcgUGFyc2VkRXZlbnQoZXZlbnROYW1lLCB0YXJnZXQsIDAgLyogUmVndWxhciAqLywgYXN0LCBzb3VyY2VTcGFuLCBoYW5kbGVyU3BhbikpO1xuICAgICAgICAvLyBEb24ndCBkZXRlY3QgZGlyZWN0aXZlcyBmb3IgZXZlbnQgbmFtZXMgZm9yIG5vdyxcbiAgICAgICAgLy8gc28gZG9uJ3QgYWRkIHRoZSBldmVudCBuYW1lIHRvIHRoZSBtYXRjaGFibGVBdHRyc1xuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3BhcnNlQWN0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBzb3VyY2VJbmZvID0gKHNvdXJjZVNwYW4gJiYgc291cmNlU3Bhbi5zdGFydCB8fCAnKHVua25vd24nKS50b1N0cmluZygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGFzdCA9IHRoaXMuX2V4cHJQYXJzZXIucGFyc2VBY3Rpb24odmFsdWUsIHNvdXJjZUluZm8sIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICAgICAgaWYgKGFzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEV4cHJlc3Npb25QYXJzZXJFcnJvcnMoYXN0LmVycm9ycywgc291cmNlU3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFzdCB8fCBhc3QuYXN0IGluc3RhbmNlb2YgRW1wdHlFeHByKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoXCJFbXB0eSBleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWRcIiwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIud3JhcExpdGVyYWxQcmltaXRpdmUoJ0VSUk9SJywgc291cmNlSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jaGVja1BpcGVzKGFzdCwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICByZXR1cm4gYXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlwiICsgZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3JlcG9ydEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIHNvdXJjZVNwYW4sIGxldmVsKSB7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gUGFyc2VFcnJvckxldmVsLkVSUk9SOyB9XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFBhcnNlRXJyb3Ioc291cmNlU3BhbiwgbWVzc2FnZSwgbGV2ZWwpKTtcbiAgICB9O1xuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9yZXBvcnRFeHByZXNzaW9uUGFyc2VyRXJyb3JzID0gZnVuY3Rpb24gKGVycm9ycywgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIGVycm9yc18xID0gX192YWx1ZXMoZXJyb3JzKSwgZXJyb3JzXzFfMSA9IGVycm9yc18xLm5leHQoKTsgIWVycm9yc18xXzEuZG9uZTsgZXJyb3JzXzFfMSA9IGVycm9yc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IubWVzc2FnZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnNfMV8xICYmICFlcnJvcnNfMV8xLmRvbmUgJiYgKF9hID0gZXJyb3JzXzEucmV0dXJuKSkgX2EuY2FsbChlcnJvcnNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIHVzZWQgcGlwZXMgYXJlIGtub3duIGluIGB0aGlzLnBpcGVzQnlOYW1lYFxuICAgIEJpbmRpbmdQYXJzZXIucHJvdG90eXBlLl9jaGVja1BpcGVzID0gZnVuY3Rpb24gKGFzdCwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoYXN0ICYmIHRoaXMucGlwZXNCeU5hbWUpIHtcbiAgICAgICAgICAgIHZhciBjb2xsZWN0b3IgPSBuZXcgUGlwZUNvbGxlY3RvcigpO1xuICAgICAgICAgICAgYXN0LnZpc2l0KGNvbGxlY3Rvcik7XG4gICAgICAgICAgICBjb2xsZWN0b3IucGlwZXMuZm9yRWFjaChmdW5jdGlvbiAoYXN0LCBwaXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBwaXBlTWV0YSA9IF90aGlzLnBpcGVzQnlOYW1lLmdldChwaXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwaXBlTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJUaGUgcGlwZSAnXCIgKyBwaXBlTmFtZSArIFwiJyBjb3VsZCBub3QgYmUgZm91bmRcIiwgbmV3IFBhcnNlU291cmNlU3Bhbihzb3VyY2VTcGFuLnN0YXJ0Lm1vdmVCeShhc3Quc3Bhbi5zdGFydCksIHNvdXJjZVNwYW4uc3RhcnQubW92ZUJ5KGFzdC5zcGFuLmVuZCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl91c2VkUGlwZXMuc2V0KHBpcGVOYW1lLCBwaXBlTWV0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9wTmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgLyBhdHRyaWJ1dGVcbiAgICAgKiBAcGFyYW0gc291cmNlU3BhblxuICAgICAqIEBwYXJhbSBpc0F0dHIgdHJ1ZSB3aGVuIGJpbmRpbmcgdG8gYW4gYXR0cmlidXRlXG4gICAgICovXG4gICAgQmluZGluZ1BhcnNlci5wcm90b3R5cGUuX3ZhbGlkYXRlUHJvcGVydHlPckF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNvdXJjZVNwYW4sIGlzQXR0cikge1xuICAgICAgICB2YXIgcmVwb3J0ID0gaXNBdHRyID8gdGhpcy5fc2NoZW1hUmVnaXN0cnkudmFsaWRhdGVBdHRyaWJ1dGUocHJvcE5hbWUpIDpcbiAgICAgICAgICAgIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5LnZhbGlkYXRlUHJvcGVydHkocHJvcE5hbWUpO1xuICAgICAgICBpZiAocmVwb3J0LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihyZXBvcnQubXNnLCBzb3VyY2VTcGFuLCBQYXJzZUVycm9yTGV2ZWwuRVJST1IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmluZGluZ1BhcnNlcjtcbn0oKSk7XG52YXIgUGlwZUNvbGxlY3RvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUGlwZUNvbGxlY3RvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQaXBlQ29sbGVjdG9yKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucGlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUGlwZUNvbGxlY3Rvci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLnBpcGVzLnNldChhc3QubmFtZSwgYXN0KTtcbiAgICAgICAgYXN0LmV4cC52aXNpdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbChhc3QuYXJncywgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFBpcGVDb2xsZWN0b3I7XG59KFJlY3Vyc2l2ZUFzdFZpc2l0b3IkMSkpO1xuZnVuY3Rpb24gaXNBbmltYXRpb25MYWJlbChuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVbMF0gPT0gJ0AnO1xufVxuZnVuY3Rpb24gY2FsY1Bvc3NpYmxlU2VjdXJpdHlDb250ZXh0cyhyZWdpc3RyeSwgc2VsZWN0b3IsIHByb3BOYW1lLCBpc0F0dHJpYnV0ZSkge1xuICAgIHZhciBjdHhzID0gW107XG4gICAgQ3NzU2VsZWN0b3IucGFyc2Uoc2VsZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBlbGVtZW50TmFtZXMgPSBzZWxlY3Rvci5lbGVtZW50ID8gW3NlbGVjdG9yLmVsZW1lbnRdIDogcmVnaXN0cnkuYWxsS25vd25FbGVtZW50TmFtZXMoKTtcbiAgICAgICAgdmFyIG5vdEVsZW1lbnROYW1lcyA9IG5ldyBTZXQoc2VsZWN0b3Iubm90U2VsZWN0b3JzLmZpbHRlcihmdW5jdGlvbiAoc2VsZWN0b3IpIHsgcmV0dXJuIHNlbGVjdG9yLmlzRWxlbWVudFNlbGVjdG9yKCk7IH0pXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChzZWxlY3RvcikgeyByZXR1cm4gc2VsZWN0b3IuZWxlbWVudDsgfSkpO1xuICAgICAgICB2YXIgcG9zc2libGVFbGVtZW50TmFtZXMgPSBlbGVtZW50TmFtZXMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50TmFtZSkgeyByZXR1cm4gIW5vdEVsZW1lbnROYW1lcy5oYXMoZWxlbWVudE5hbWUpOyB9KTtcbiAgICAgICAgY3R4cy5wdXNoLmFwcGx5KGN0eHMsIF9fc3ByZWFkKHBvc3NpYmxlRWxlbWVudE5hbWVzLm1hcChmdW5jdGlvbiAoZWxlbWVudE5hbWUpIHsgcmV0dXJuIHJlZ2lzdHJ5LnNlY3VyaXR5Q29udGV4dChlbGVtZW50TmFtZSwgcHJvcE5hbWUsIGlzQXR0cmlidXRlKTsgfSkpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3R4cy5sZW5ndGggPT09IDAgPyBbU2VjdXJpdHlDb250ZXh0Lk5PTkVdIDogQXJyYXkuZnJvbShuZXcgU2V0KGN0eHMpKS5zb3J0KCk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBOR19DT05URU5UX1NFTEVDVF9BVFRSID0gJ3NlbGVjdCc7XG52YXIgTElOS19FTEVNRU5UID0gJ2xpbmsnO1xudmFyIExJTktfU1RZTEVfUkVMX0FUVFIgPSAncmVsJztcbnZhciBMSU5LX1NUWUxFX0hSRUZfQVRUUiA9ICdocmVmJztcbnZhciBMSU5LX1NUWUxFX1JFTF9WQUxVRSA9ICdzdHlsZXNoZWV0JztcbnZhciBTVFlMRV9FTEVNRU5UID0gJ3N0eWxlJztcbnZhciBTQ1JJUFRfRUxFTUVOVCA9ICdzY3JpcHQnO1xudmFyIE5HX05PTl9CSU5EQUJMRV9BVFRSID0gJ25nTm9uQmluZGFibGUnO1xudmFyIE5HX1BST0pFQ1RfQVMgPSAnbmdQcm9qZWN0QXMnO1xuZnVuY3Rpb24gcHJlcGFyc2VFbGVtZW50KGFzdCkge1xuICAgIHZhciBzZWxlY3RBdHRyID0gbnVsbDtcbiAgICB2YXIgaHJlZkF0dHIgPSBudWxsO1xuICAgIHZhciByZWxBdHRyID0gbnVsbDtcbiAgICB2YXIgbm9uQmluZGFibGUgPSBmYWxzZTtcbiAgICB2YXIgcHJvamVjdEFzID0gJyc7XG4gICAgYXN0LmF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgdmFyIGxjQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGxjQXR0ck5hbWUgPT0gTkdfQ09OVEVOVF9TRUxFQ1RfQVRUUikge1xuICAgICAgICAgICAgc2VsZWN0QXR0ciA9IGF0dHIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGNBdHRyTmFtZSA9PSBMSU5LX1NUWUxFX0hSRUZfQVRUUikge1xuICAgICAgICAgICAgaHJlZkF0dHIgPSBhdHRyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9SRUxfQVRUUikge1xuICAgICAgICAgICAgcmVsQXR0ciA9IGF0dHIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXR0ci5uYW1lID09IE5HX05PTl9CSU5EQUJMRV9BVFRSKSB7XG4gICAgICAgICAgICBub25CaW5kYWJsZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXR0ci5uYW1lID09IE5HX1BST0pFQ1RfQVMpIHtcbiAgICAgICAgICAgIGlmIChhdHRyLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0QXMgPSBhdHRyLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgc2VsZWN0QXR0ciA9IG5vcm1hbGl6ZU5nQ29udGVudFNlbGVjdChzZWxlY3RBdHRyKTtcbiAgICB2YXIgbm9kZU5hbWUgPSBhc3QubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuT1RIRVI7XG4gICAgaWYgKGlzTmdDb250ZW50KG5vZGVOYW1lKSkge1xuICAgICAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuTkdfQ09OVEVOVDtcbiAgICB9XG4gICAgZWxzZSBpZiAobm9kZU5hbWUgPT0gU1RZTEVfRUxFTUVOVCkge1xuICAgICAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGVOYW1lID09IFNDUklQVF9FTEVNRU5UKSB7XG4gICAgICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TQ1JJUFQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5vZGVOYW1lID09IExJTktfRUxFTUVOVCAmJiByZWxBdHRyID09IExJTktfU1RZTEVfUkVMX1ZBTFVFKSB7XG4gICAgICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByZXBhcnNlZEVsZW1lbnQodHlwZSwgc2VsZWN0QXR0ciwgaHJlZkF0dHIsIG5vbkJpbmRhYmxlLCBwcm9qZWN0QXMpO1xufVxudmFyIFByZXBhcnNlZEVsZW1lbnRUeXBlO1xuKGZ1bmN0aW9uIChQcmVwYXJzZWRFbGVtZW50VHlwZSkge1xuICAgIFByZXBhcnNlZEVsZW1lbnRUeXBlW1ByZXBhcnNlZEVsZW1lbnRUeXBlW1wiTkdfQ09OVEVOVFwiXSA9IDBdID0gXCJOR19DT05URU5UXCI7XG4gICAgUHJlcGFyc2VkRWxlbWVudFR5cGVbUHJlcGFyc2VkRWxlbWVudFR5cGVbXCJTVFlMRVwiXSA9IDFdID0gXCJTVFlMRVwiO1xuICAgIFByZXBhcnNlZEVsZW1lbnRUeXBlW1ByZXBhcnNlZEVsZW1lbnRUeXBlW1wiU1RZTEVTSEVFVFwiXSA9IDJdID0gXCJTVFlMRVNIRUVUXCI7XG4gICAgUHJlcGFyc2VkRWxlbWVudFR5cGVbUHJlcGFyc2VkRWxlbWVudFR5cGVbXCJTQ1JJUFRcIl0gPSAzXSA9IFwiU0NSSVBUXCI7XG4gICAgUHJlcGFyc2VkRWxlbWVudFR5cGVbUHJlcGFyc2VkRWxlbWVudFR5cGVbXCJPVEhFUlwiXSA9IDRdID0gXCJPVEhFUlwiO1xufSkoUHJlcGFyc2VkRWxlbWVudFR5cGUgfHwgKFByZXBhcnNlZEVsZW1lbnRUeXBlID0ge30pKTtcbnZhciBQcmVwYXJzZWRFbGVtZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFByZXBhcnNlZEVsZW1lbnQodHlwZSwgc2VsZWN0QXR0ciwgaHJlZkF0dHIsIG5vbkJpbmRhYmxlLCBwcm9qZWN0QXMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5zZWxlY3RBdHRyID0gc2VsZWN0QXR0cjtcbiAgICAgICAgdGhpcy5ocmVmQXR0ciA9IGhyZWZBdHRyO1xuICAgICAgICB0aGlzLm5vbkJpbmRhYmxlID0gbm9uQmluZGFibGU7XG4gICAgICAgIHRoaXMucHJvamVjdEFzID0gcHJvamVjdEFzO1xuICAgIH1cbiAgICByZXR1cm4gUHJlcGFyc2VkRWxlbWVudDtcbn0oKSk7XG5mdW5jdGlvbiBub3JtYWxpemVOZ0NvbnRlbnRTZWxlY3Qoc2VsZWN0QXR0cikge1xuICAgIGlmIChzZWxlY3RBdHRyID09PSBudWxsIHx8IHNlbGVjdEF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnKic7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RBdHRyO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQklORF9OQU1FX1JFR0VYUCA9IC9eKD86KD86KD86KGJpbmQtKXwobGV0LSl8KHJlZi18Iyl8KG9uLSl8KGJpbmRvbi0pfChAKSkoLispKXxcXFtcXCgoW15cXCldKylcXClcXF18XFxbKFteXFxdXSspXFxdfFxcKChbXlxcKV0rKVxcKSkkLztcbi8vIEdyb3VwIDEgPSBcImJpbmQtXCJcbnZhciBLV19CSU5EX0lEWCA9IDE7XG4vLyBHcm91cCAyID0gXCJsZXQtXCJcbnZhciBLV19MRVRfSURYID0gMjtcbi8vIEdyb3VwIDMgPSBcInJlZi0vI1wiXG52YXIgS1dfUkVGX0lEWCA9IDM7XG4vLyBHcm91cCA0ID0gXCJvbi1cIlxudmFyIEtXX09OX0lEWCA9IDQ7XG4vLyBHcm91cCA1ID0gXCJiaW5kb24tXCJcbnZhciBLV19CSU5ET05fSURYID0gNTtcbi8vIEdyb3VwIDYgPSBcIkBcIlxudmFyIEtXX0FUX0lEWCA9IDY7XG4vLyBHcm91cCA3ID0gdGhlIGlkZW50aWZpZXIgYWZ0ZXIgXCJiaW5kLVwiLCBcImxldC1cIiwgXCJyZWYtLyNcIiwgXCJvbi1cIiwgXCJiaW5kb24tXCIgb3IgXCJAXCJcbnZhciBJREVOVF9LV19JRFggPSA3O1xuLy8gR3JvdXAgOCA9IGlkZW50aWZpZXIgaW5zaWRlIFsoKV1cbnZhciBJREVOVF9CQU5BTkFfQk9YX0lEWCA9IDg7XG4vLyBHcm91cCA5ID0gaWRlbnRpZmllciBpbnNpZGUgW11cbnZhciBJREVOVF9QUk9QRVJUWV9JRFggPSA5O1xuLy8gR3JvdXAgMTAgPSBpZGVudGlmaWVyIGluc2lkZSAoKVxudmFyIElERU5UX0VWRU5UX0lEWCA9IDEwO1xudmFyIFRFTVBMQVRFX0FUVFJfUFJFRklYID0gJyonO1xudmFyIENMQVNTX0FUVFIgPSAnY2xhc3MnO1xudmFyIF9URVhUX0NTU19TRUxFQ1RPUjtcbmZ1bmN0aW9uIFRFWFRfQ1NTX1NFTEVDVE9SKCkge1xuICAgIGlmICghX1RFWFRfQ1NTX1NFTEVDVE9SKSB7XG4gICAgICAgIF9URVhUX0NTU19TRUxFQ1RPUiA9IENzc1NlbGVjdG9yLnBhcnNlKCcqJylbMF07XG4gICAgfVxuICAgIHJldHVybiBfVEVYVF9DU1NfU0VMRUNUT1I7XG59XG52YXIgVGVtcGxhdGVQYXJzZUVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUZW1wbGF0ZVBhcnNlRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGVtcGxhdGVQYXJzZUVycm9yKG1lc3NhZ2UsIHNwYW4sIGxldmVsKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBzcGFuLCBtZXNzYWdlLCBsZXZlbCkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRlbXBsYXRlUGFyc2VFcnJvcjtcbn0oUGFyc2VFcnJvcikpO1xudmFyIFRlbXBsYXRlUGFyc2VSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGVtcGxhdGVQYXJzZVJlc3VsdCh0ZW1wbGF0ZUFzdCwgdXNlZFBpcGVzLCBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUFzdCA9IHRlbXBsYXRlQXN0O1xuICAgICAgICB0aGlzLnVzZWRQaXBlcyA9IHVzZWRQaXBlcztcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgfVxuICAgIHJldHVybiBUZW1wbGF0ZVBhcnNlUmVzdWx0O1xufSgpKTtcbnZhciBUZW1wbGF0ZVBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZW1wbGF0ZVBhcnNlcihfY29uZmlnLCBfcmVmbGVjdG9yLCBfZXhwclBhcnNlciwgX3NjaGVtYVJlZ2lzdHJ5LCBfaHRtbFBhcnNlciwgX2NvbnNvbGUsIHRyYW5zZm9ybXMpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gX2NvbmZpZztcbiAgICAgICAgdGhpcy5fcmVmbGVjdG9yID0gX3JlZmxlY3RvcjtcbiAgICAgICAgdGhpcy5fZXhwclBhcnNlciA9IF9leHByUGFyc2VyO1xuICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgdGhpcy5faHRtbFBhcnNlciA9IF9odG1sUGFyc2VyO1xuICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtcyA9IHRyYW5zZm9ybXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUZW1wbGF0ZVBhcnNlci5wcm90b3R5cGUsIFwiZXhwcmVzc2lvblBhcnNlclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZXhwclBhcnNlcjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVGVtcGxhdGVQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBzY2hlbWFzLCB0ZW1wbGF0ZVVybCwgcHJlc2VydmVXaGl0ZXNwYWNlcykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy50cnlQYXJzZShjb21wb25lbnQsIHRlbXBsYXRlLCBkaXJlY3RpdmVzLCBwaXBlcywgc2NoZW1hcywgdGVtcGxhdGVVcmwsIHByZXNlcnZlV2hpdGVzcGFjZXMpO1xuICAgICAgICB2YXIgd2FybmluZ3MgPSByZXN1bHQuZXJyb3JzLmZpbHRlcihmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGVycm9yLmxldmVsID09PSBQYXJzZUVycm9yTGV2ZWwuV0FSTklORzsgfSk7XG4gICAgICAgIHZhciBlcnJvcnMgPSByZXN1bHQuZXJyb3JzLmZpbHRlcihmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIGVycm9yLmxldmVsID09PSBQYXJzZUVycm9yTGV2ZWwuRVJST1I7IH0pO1xuICAgICAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY29uc29sZS53YXJuKFwiVGVtcGxhdGUgcGFyc2Ugd2FybmluZ3M6XFxuXCIgKyB3YXJuaW5ncy5qb2luKCdcXG4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JTdHJpbmcgPSBlcnJvcnMuam9pbignXFxuJyk7XG4gICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcihcIlRlbXBsYXRlIHBhcnNlIGVycm9yczpcXG5cIiArIGVycm9yU3RyaW5nLCBlcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRlbXBsYXRlOiByZXN1bHQudGVtcGxhdGVBc3QsIHBpcGVzOiByZXN1bHQudXNlZFBpcGVzIH07XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlci5wcm90b3R5cGUudHJ5UGFyc2UgPSBmdW5jdGlvbiAoY29tcG9uZW50LCB0ZW1wbGF0ZSwgZGlyZWN0aXZlcywgcGlwZXMsIHNjaGVtYXMsIHRlbXBsYXRlVXJsLCBwcmVzZXJ2ZVdoaXRlc3BhY2VzKSB7XG4gICAgICAgIHZhciBodG1sUGFyc2VSZXN1bHQgPSB0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIHRoaXMuX2h0bWxQYXJzZXIucGFyc2UodGVtcGxhdGUsIHRlbXBsYXRlVXJsLCB7XG4gICAgICAgICAgICAgICAgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uQ29uZmlnOiB0aGlzLmdldEludGVycG9sYXRpb25Db25maWcoY29tcG9uZW50KVxuICAgICAgICAgICAgfSkgOlxuICAgICAgICAgICAgdGVtcGxhdGU7XG4gICAgICAgIGlmICghcHJlc2VydmVXaGl0ZXNwYWNlcykge1xuICAgICAgICAgICAgaHRtbFBhcnNlUmVzdWx0ID0gcmVtb3ZlV2hpdGVzcGFjZXMoaHRtbFBhcnNlUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cnlQYXJzZUh0bWwodGhpcy5leHBhbmRIdG1sKGh0bWxQYXJzZVJlc3VsdCksIGNvbXBvbmVudCwgZGlyZWN0aXZlcywgcGlwZXMsIHNjaGVtYXMpO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZXIucHJvdG90eXBlLnRyeVBhcnNlSHRtbCA9IGZ1bmN0aW9uIChodG1sQXN0V2l0aEVycm9ycywgY29tcG9uZW50LCBkaXJlY3RpdmVzLCBwaXBlcywgc2NoZW1hcykge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB2YXIgZXJyb3JzID0gaHRtbEFzdFdpdGhFcnJvcnMuZXJyb3JzO1xuICAgICAgICB2YXIgdXNlZFBpcGVzID0gW107XG4gICAgICAgIGlmIChodG1sQXN0V2l0aEVycm9ycy5yb290Tm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHVuaXFEaXJlY3RpdmVzID0gcmVtb3ZlU3VtbWFyeUR1cGxpY2F0ZXMoZGlyZWN0aXZlcyk7XG4gICAgICAgICAgICB2YXIgdW5pcVBpcGVzID0gcmVtb3ZlU3VtbWFyeUR1cGxpY2F0ZXMocGlwZXMpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyVmlld0NvbnRleHQgPSBuZXcgUHJvdmlkZXJWaWV3Q29udGV4dCh0aGlzLl9yZWZsZWN0b3IsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB2YXIgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQudGVtcGxhdGUgJiYgY29tcG9uZW50LnRlbXBsYXRlLmludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICBzdGFydDogY29tcG9uZW50LnRlbXBsYXRlLmludGVycG9sYXRpb25bMF0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogY29tcG9uZW50LnRlbXBsYXRlLmludGVycG9sYXRpb25bMV1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGJpbmRpbmdQYXJzZXIgPSBuZXcgQmluZGluZ1BhcnNlcih0aGlzLl9leHByUGFyc2VyLCBpbnRlcnBvbGF0aW9uQ29uZmlnLCB0aGlzLl9zY2hlbWFSZWdpc3RyeSwgdW5pcVBpcGVzLCBlcnJvcnMpO1xuICAgICAgICAgICAgdmFyIHBhcnNlVmlzaXRvciA9IG5ldyBUZW1wbGF0ZVBhcnNlVmlzaXRvcih0aGlzLl9yZWZsZWN0b3IsIHRoaXMuX2NvbmZpZywgcHJvdmlkZXJWaWV3Q29udGV4dCwgdW5pcURpcmVjdGl2ZXMsIGJpbmRpbmdQYXJzZXIsIHRoaXMuX3NjaGVtYVJlZ2lzdHJ5LCBzY2hlbWFzLCBlcnJvcnMpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdmlzaXRBbGwkMShwYXJzZVZpc2l0b3IsIGh0bWxBc3RXaXRoRXJyb3JzLnJvb3ROb2RlcywgRU1QVFlfRUxFTUVOVF9DT05URVhUKTtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoLmFwcGx5KGVycm9ycywgX19zcHJlYWQocHJvdmlkZXJWaWV3Q29udGV4dC5lcnJvcnMpKTtcbiAgICAgICAgICAgIHVzZWRQaXBlcy5wdXNoLmFwcGx5KHVzZWRQaXBlcywgX19zcHJlYWQoYmluZGluZ1BhcnNlci5nZXRVc2VkUGlwZXMoKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXNzZXJ0Tm9SZWZlcmVuY2VEdXBsaWNhdGlvbk9uVGVtcGxhdGUocmVzdWx0LCBlcnJvcnMpO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGVtcGxhdGVQYXJzZVJlc3VsdChyZXN1bHQsIHVzZWRQaXBlcywgZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybXMuZm9yRWFjaChmdW5jdGlvbiAodHJhbnNmb3JtKSB7IHJlc3VsdCA9IHRlbXBsYXRlVmlzaXRBbGwodHJhbnNmb3JtLCByZXN1bHQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRlbXBsYXRlUGFyc2VSZXN1bHQocmVzdWx0LCB1c2VkUGlwZXMsIGVycm9ycyk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlci5wcm90b3R5cGUuZXhwYW5kSHRtbCA9IGZ1bmN0aW9uIChodG1sQXN0V2l0aEVycm9ycywgZm9yY2VkKSB7XG4gICAgICAgIGlmIChmb3JjZWQgPT09IHZvaWQgMCkgeyBmb3JjZWQgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgZXJyb3JzID0gaHRtbEFzdFdpdGhFcnJvcnMuZXJyb3JzO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PSAwIHx8IGZvcmNlZCkge1xuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIElDVSBtZXNzYWdlcyB0byBhbmd1bGFyIGRpcmVjdGl2ZXNcbiAgICAgICAgICAgIHZhciBleHBhbmRlZEh0bWxBc3QgPSBleHBhbmROb2RlcyhodG1sQXN0V2l0aEVycm9ycy5yb290Tm9kZXMpO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2guYXBwbHkoZXJyb3JzLCBfX3NwcmVhZChleHBhbmRlZEh0bWxBc3QuZXJyb3JzKSk7XG4gICAgICAgICAgICBodG1sQXN0V2l0aEVycm9ycyA9IG5ldyBQYXJzZVRyZWVSZXN1bHQoZXhwYW5kZWRIdG1sQXN0Lm5vZGVzLCBlcnJvcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodG1sQXN0V2l0aEVycm9ycztcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VyLnByb3RvdHlwZS5nZXRJbnRlcnBvbGF0aW9uQ29uZmlnID0gZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGlvbkNvbmZpZy5mcm9tQXJyYXkoY29tcG9uZW50LnRlbXBsYXRlLmludGVycG9sYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgVGVtcGxhdGVQYXJzZXIucHJvdG90eXBlLl9hc3NlcnROb1JlZmVyZW5jZUR1cGxpY2F0aW9uT25UZW1wbGF0ZSA9IGZ1bmN0aW9uIChyZXN1bHQsIGVycm9ycykge1xuICAgICAgICB2YXIgZXhpc3RpbmdSZWZlcmVuY2VzID0gW107XG4gICAgICAgIHJlc3VsdC5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuICEhZWxlbWVudC5yZWZlcmVuY2VzOyB9KVxuICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIGVsZW1lbnQucmVmZXJlbmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIHZhciBuYW1lID0gcmVmZXJlbmNlLm5hbWU7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdSZWZlcmVuY2VzLmluZGV4T2YobmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdSZWZlcmVuY2VzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgVGVtcGxhdGVQYXJzZUVycm9yKFwiUmVmZXJlbmNlIFxcXCIjXCIgKyBuYW1lICsgXCJcXFwiIGlzIGRlZmluZWQgc2V2ZXJhbCB0aW1lc1wiLCByZWZlcmVuY2Uuc291cmNlU3BhbiwgUGFyc2VFcnJvckxldmVsLkVSUk9SKTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pOyB9KTtcbiAgICB9O1xuICAgIHJldHVybiBUZW1wbGF0ZVBhcnNlcjtcbn0oKSk7XG52YXIgVGVtcGxhdGVQYXJzZVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGVtcGxhdGVQYXJzZVZpc2l0b3IocmVmbGVjdG9yLCBjb25maWcsIHByb3ZpZGVyVmlld0NvbnRleHQsIGRpcmVjdGl2ZXMsIF9iaW5kaW5nUGFyc2VyLCBfc2NoZW1hUmVnaXN0cnksIF9zY2hlbWFzLCBfdGFyZ2V0RXJyb3JzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5wcm92aWRlclZpZXdDb250ZXh0ID0gcHJvdmlkZXJWaWV3Q29udGV4dDtcbiAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlciA9IF9iaW5kaW5nUGFyc2VyO1xuICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgdGhpcy5fc2NoZW1hcyA9IF9zY2hlbWFzO1xuICAgICAgICB0aGlzLl90YXJnZXRFcnJvcnMgPSBfdGFyZ2V0RXJyb3JzO1xuICAgICAgICB0aGlzLnNlbGVjdG9yTWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzSW5kZXggPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMubmdDb250ZW50Q291bnQgPSAwO1xuICAgICAgICAvLyBOb3RlOiBxdWVyaWVzIHN0YXJ0IHdpdGggaWQgMSBzbyB3ZSBjYW4gdXNlIHRoZSBudW1iZXIgaW4gYSBCbG9vbSBmaWx0ZXIhXG4gICAgICAgIHRoaXMuY29udGVudFF1ZXJ5U3RhcnRJZCA9IHByb3ZpZGVyVmlld0NvbnRleHQuY29tcG9uZW50LnZpZXdRdWVyaWVzLmxlbmd0aCArIDE7XG4gICAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlLCBpbmRleCkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gQ3NzU2VsZWN0b3IucGFyc2UoZGlyZWN0aXZlLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIF90aGlzLnNlbGVjdG9yTWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhzZWxlY3RvciwgZGlyZWN0aXZlKTtcbiAgICAgICAgICAgIF90aGlzLmRpcmVjdGl2ZXNJbmRleC5zZXQoZGlyZWN0aXZlLCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoZXhwYW5zaW9uLCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoZXhwYW5zaW9uQ2FzZSwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIHBhcmVudCkge1xuICAgICAgICB2YXIgbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KFRFWFRfQ1NTX1NFTEVDVE9SKCkpO1xuICAgICAgICB2YXIgdmFsdWVOb05nc3AgPSByZXBsYWNlTmdzcCh0ZXh0LnZhbHVlKTtcbiAgICAgICAgdmFyIGV4cHIgPSB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZU5vTmdzcCwgdGV4dC5zb3VyY2VTcGFuKTtcbiAgICAgICAgcmV0dXJuIGV4cHIgPyBuZXcgQm91bmRUZXh0QXN0KGV4cHIsIG5nQ29udGVudEluZGV4LCB0ZXh0LnNvdXJjZVNwYW4pIDpcbiAgICAgICAgICAgIG5ldyBUZXh0QXN0KHZhbHVlTm9OZ3NwLCBuZ0NvbnRlbnRJbmRleCwgdGV4dC5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdHRyQXN0KGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUudmFsdWUsIGF0dHJpYnV0ZS5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHBhcmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcXVlcnlTdGFydEluZGV4ID0gdGhpcy5jb250ZW50UXVlcnlTdGFydElkO1xuICAgICAgICB2YXIgZWxOYW1lID0gZWxlbWVudC5uYW1lO1xuICAgICAgICB2YXIgcHJlcGFyc2VkRWxlbWVudCA9IHByZXBhcnNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUIHx8XG4gICAgICAgICAgICBwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFKSB7XG4gICAgICAgICAgICAvLyBTa2lwcGluZyA8c2NyaXB0PiBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgICAgICAgLy8gU2tpcHBpbmcgPHN0eWxlPiBhcyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGVtXG4gICAgICAgICAgICAvLyBpbiB0aGUgU3R5bGVDb21waWxlclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEVTSEVFVCAmJlxuICAgICAgICAgICAgaXNTdHlsZVVybFJlc29sdmFibGUocHJlcGFyc2VkRWxlbWVudC5ocmVmQXR0cikpIHtcbiAgICAgICAgICAgIC8vIFNraXBwaW5nIHN0eWxlc2hlZXRzIHdpdGggZWl0aGVyIHJlbGF0aXZlIHVybHMgb3IgcGFja2FnZSBzY2hlbWUgYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgIC8vIHRoZW0gaW4gdGhlIFN0eWxlQ29tcGlsZXJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXRjaGFibGVBdHRycyA9IFtdO1xuICAgICAgICB2YXIgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMgPSBbXTtcbiAgICAgICAgdmFyIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMgPSBbXTtcbiAgICAgICAgdmFyIGVsZW1lbnRWYXJzID0gW107XG4gICAgICAgIHZhciBldmVudHMgPSBbXTtcbiAgICAgICAgdmFyIHRlbXBsYXRlRWxlbWVudE9yRGlyZWN0aXZlUHJvcHMgPSBbXTtcbiAgICAgICAgdmFyIHRlbXBsYXRlTWF0Y2hhYmxlQXR0cnMgPSBbXTtcbiAgICAgICAgdmFyIHRlbXBsYXRlRWxlbWVudFZhcnMgPSBbXTtcbiAgICAgICAgdmFyIGhhc0lubGluZVRlbXBsYXRlcyA9IGZhbHNlO1xuICAgICAgICB2YXIgYXR0cnMgPSBbXTtcbiAgICAgICAgdmFyIGlzVGVtcGxhdGVFbGVtZW50ID0gaXNOZ1RlbXBsYXRlKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIGVsZW1lbnQuYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgdmFyIHBhcnNlZFZhcmlhYmxlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGhhc0JpbmRpbmcgPSBfdGhpcy5fcGFyc2VBdHRyKGlzVGVtcGxhdGVFbGVtZW50LCBhdHRyLCBtYXRjaGFibGVBdHRycywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGV2ZW50cywgZWxlbWVudE9yRGlyZWN0aXZlUmVmcywgZWxlbWVudFZhcnMpO1xuICAgICAgICAgICAgZWxlbWVudFZhcnMucHVzaC5hcHBseShlbGVtZW50VmFycywgX19zcHJlYWQocGFyc2VkVmFyaWFibGVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gVmFyaWFibGVBc3QuZnJvbVBhcnNlZFZhcmlhYmxlKHYpOyB9KSkpO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlVmFsdWU7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVLZXk7XG4gICAgICAgICAgICB2YXIgbm9ybWFsaXplZE5hbWUgPSBfdGhpcy5fbm9ybWFsaXplQXR0cmlidXRlTmFtZShhdHRyLm5hbWUpO1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lLnN0YXJ0c1dpdGgoVEVNUExBVEVfQVRUUl9QUkVGSVgpKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVWYWx1ZSA9IGF0dHIudmFsdWU7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVLZXkgPSBub3JtYWxpemVkTmFtZS5zdWJzdHJpbmcoVEVNUExBVEVfQVRUUl9QUkVGSVgubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYXNUZW1wbGF0ZUJpbmRpbmcgPSB0ZW1wbGF0ZVZhbHVlICE9IG51bGw7XG4gICAgICAgICAgICBpZiAoaGFzVGVtcGxhdGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0lubGluZVRlbXBsYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoXCJDYW4ndCBoYXZlIG11bHRpcGxlIHRlbXBsYXRlIGJpbmRpbmdzIG9uIG9uZSBlbGVtZW50LiBVc2Ugb25seSBvbmUgYXR0cmlidXRlIHByZWZpeGVkIHdpdGggKlwiLCBhdHRyLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYXNJbmxpbmVUZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBwYXJzZWRWYXJpYWJsZXNfMSA9IFtdO1xuICAgICAgICAgICAgICAgIF90aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nKHRlbXBsYXRlS2V5LCB0ZW1wbGF0ZVZhbHVlLCBhdHRyLnNvdXJjZVNwYW4sIHRlbXBsYXRlTWF0Y2hhYmxlQXR0cnMsIHRlbXBsYXRlRWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIHBhcnNlZFZhcmlhYmxlc18xKTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVsZW1lbnRWYXJzLnB1c2guYXBwbHkodGVtcGxhdGVFbGVtZW50VmFycywgX19zcHJlYWQocGFyc2VkVmFyaWFibGVzXzEubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBWYXJpYWJsZUFzdC5mcm9tUGFyc2VkVmFyaWFibGUodik7IH0pKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhc0JpbmRpbmcgJiYgIWhhc1RlbXBsYXRlQmluZGluZykge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgdGhlIGJpbmRpbmdzIGFzIGF0dHJpYnV0ZXMgYXMgd2VsbCBpbiB0aGUgQVNUXG4gICAgICAgICAgICAgICAgYXR0cnMucHVzaChfdGhpcy52aXNpdEF0dHJpYnV0ZShhdHRyLCBudWxsKSk7XG4gICAgICAgICAgICAgICAgbWF0Y2hhYmxlQXR0cnMucHVzaChbYXR0ci5uYW1lLCBhdHRyLnZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZWxlbWVudENzc1NlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKGVsTmFtZSwgbWF0Y2hhYmxlQXR0cnMpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLl9wYXJzZURpcmVjdGl2ZXModGhpcy5zZWxlY3Rvck1hdGNoZXIsIGVsZW1lbnRDc3NTZWxlY3RvciksIGRpcmVjdGl2ZU1ldGFzID0gX2EuZGlyZWN0aXZlcywgbWF0Y2hFbGVtZW50ID0gX2EubWF0Y2hFbGVtZW50O1xuICAgICAgICB2YXIgcmVmZXJlbmNlcyA9IFtdO1xuICAgICAgICB2YXIgYm91bmREaXJlY3RpdmVQcm9wTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBkaXJlY3RpdmVBc3RzID0gdGhpcy5fY3JlYXRlRGlyZWN0aXZlQXN0cyhpc1RlbXBsYXRlRWxlbWVudCwgZWxlbWVudC5uYW1lLCBkaXJlY3RpdmVNZXRhcywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMsIGVsZW1lbnQuc291cmNlU3BhbiwgcmVmZXJlbmNlcywgYm91bmREaXJlY3RpdmVQcm9wTmFtZXMpO1xuICAgICAgICB2YXIgZWxlbWVudFByb3BzID0gdGhpcy5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyhlbGVtZW50Lm5hbWUsIGVsZW1lbnRPckRpcmVjdGl2ZVByb3BzLCBib3VuZERpcmVjdGl2ZVByb3BOYW1lcyk7XG4gICAgICAgIHZhciBpc1ZpZXdSb290ID0gcGFyZW50LmlzVGVtcGxhdGVFbGVtZW50IHx8IGhhc0lubGluZVRlbXBsYXRlcztcbiAgICAgICAgdmFyIHByb3ZpZGVyQ29udGV4dCA9IG5ldyBQcm92aWRlckVsZW1lbnRDb250ZXh0KHRoaXMucHJvdmlkZXJWaWV3Q29udGV4dCwgcGFyZW50LnByb3ZpZGVyQ29udGV4dCwgaXNWaWV3Um9vdCwgZGlyZWN0aXZlQXN0cywgYXR0cnMsIHJlZmVyZW5jZXMsIGlzVGVtcGxhdGVFbGVtZW50LCBxdWVyeVN0YXJ0SW5kZXgsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHZpc2l0QWxsJDEocHJlcGFyc2VkRWxlbWVudC5ub25CaW5kYWJsZSA/IE5PTl9CSU5EQUJMRV9WSVNJVE9SIDogdGhpcywgZWxlbWVudC5jaGlsZHJlbiwgRWxlbWVudENvbnRleHQuY3JlYXRlKGlzVGVtcGxhdGVFbGVtZW50LCBkaXJlY3RpdmVBc3RzLCBpc1RlbXBsYXRlRWxlbWVudCA/IHBhcmVudC5wcm92aWRlckNvbnRleHQgOiBwcm92aWRlckNvbnRleHQpKTtcbiAgICAgICAgcHJvdmlkZXJDb250ZXh0LmFmdGVyRWxlbWVudCgpO1xuICAgICAgICAvLyBPdmVycmlkZSB0aGUgYWN0dWFsIHNlbGVjdG9yIHdoZW4gdGhlIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlIGlzIHByb3ZpZGVkXG4gICAgICAgIHZhciBwcm9qZWN0aW9uU2VsZWN0b3IgPSBwcmVwYXJzZWRFbGVtZW50LnByb2plY3RBcyAhPSAnJyA/XG4gICAgICAgICAgICBDc3NTZWxlY3Rvci5wYXJzZShwcmVwYXJzZWRFbGVtZW50LnByb2plY3RBcylbMF0gOlxuICAgICAgICAgICAgZWxlbWVudENzc1NlbGVjdG9yO1xuICAgICAgICB2YXIgbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KHByb2plY3Rpb25TZWxlY3Rvcik7XG4gICAgICAgIHZhciBwYXJzZWRFbGVtZW50O1xuICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UKSB7XG4gICAgICAgICAgICAvLyBgPG5nLWNvbnRlbnQ+YCBlbGVtZW50XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJiAhZWxlbWVudC5jaGlsZHJlbi5ldmVyeShfaXNFbXB0eVRleHROb2RlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiPG5nLWNvbnRlbnQ+IGVsZW1lbnQgY2Fubm90IGhhdmUgY29udGVudC5cIiwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlZEVsZW1lbnQgPSBuZXcgTmdDb250ZW50QXN0KHRoaXMubmdDb250ZW50Q291bnQrKywgaGFzSW5saW5lVGVtcGxhdGVzID8gbnVsbCA6IG5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBgPG5nLXRlbXBsYXRlPmAgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5fYXNzZXJ0QWxsRXZlbnRzUHVibGlzaGVkQnlEaXJlY3RpdmVzKGRpcmVjdGl2ZUFzdHMsIGV2ZW50cyk7XG4gICAgICAgICAgICB0aGlzLl9hc3NlcnROb0NvbXBvbmVudHNOb3JFbGVtZW50QmluZGluZ3NPblRlbXBsYXRlKGRpcmVjdGl2ZUFzdHMsIGVsZW1lbnRQcm9wcywgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIHBhcnNlZEVsZW1lbnQgPSBuZXcgRW1iZWRkZWRUZW1wbGF0ZUFzdChhdHRycywgZXZlbnRzLCByZWZlcmVuY2VzLCBlbGVtZW50VmFycywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybWVkRGlyZWN0aXZlQXN0cywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybVByb3ZpZGVycywgcHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybWVkSGFzVmlld0NvbnRhaW5lciwgcHJvdmlkZXJDb250ZXh0LnF1ZXJ5TWF0Y2hlcywgY2hpbGRyZW4sIGhhc0lubGluZVRlbXBsYXRlcyA/IG51bGwgOiBuZ0NvbnRlbnRJbmRleCwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgb3RoZXIgdGhhbiBgPG5nLWNvbnRlbnQ+YCBhbmQgYDxuZy10ZW1wbGF0ZT5gXG4gICAgICAgICAgICB0aGlzLl9hc3NlcnRFbGVtZW50RXhpc3RzKG1hdGNoRWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50KGRpcmVjdGl2ZUFzdHMsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgICB2YXIgbmdDb250ZW50SW5kZXhfMSA9IGhhc0lubGluZVRlbXBsYXRlcyA/IG51bGwgOiBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KHByb2plY3Rpb25TZWxlY3Rvcik7XG4gICAgICAgICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IEVsZW1lbnRBc3QoZWxOYW1lLCBhdHRycywgZWxlbWVudFByb3BzLCBldmVudHMsIHJlZmVyZW5jZXMsIHByb3ZpZGVyQ29udGV4dC50cmFuc2Zvcm1lZERpcmVjdGl2ZUFzdHMsIHByb3ZpZGVyQ29udGV4dC50cmFuc2Zvcm1Qcm92aWRlcnMsIHByb3ZpZGVyQ29udGV4dC50cmFuc2Zvcm1lZEhhc1ZpZXdDb250YWluZXIsIHByb3ZpZGVyQ29udGV4dC5xdWVyeU1hdGNoZXMsIGNoaWxkcmVuLCBoYXNJbmxpbmVUZW1wbGF0ZXMgPyBudWxsIDogbmdDb250ZW50SW5kZXhfMSwgZWxlbWVudC5zb3VyY2VTcGFuLCBlbGVtZW50LmVuZFNvdXJjZVNwYW4gfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0lubGluZVRlbXBsYXRlcykge1xuICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgYXMgYSAqLWF0dHJpYnV0ZVxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlUXVlcnlTdGFydEluZGV4ID0gdGhpcy5jb250ZW50UXVlcnlTdGFydElkO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlU2VsZWN0b3IgPSBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IoJ25nLXRlbXBsYXRlJywgdGVtcGxhdGVNYXRjaGFibGVBdHRycyk7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgdGVtcGxhdGVTZWxlY3RvcikuZGlyZWN0aXZlcztcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUJvdW5kRGlyZWN0aXZlUHJvcE5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGlyZWN0aXZlQXN0cyA9IHRoaXMuX2NyZWF0ZURpcmVjdGl2ZUFzdHModHJ1ZSwgZWxOYW1lLCBkaXJlY3RpdmVzLCB0ZW1wbGF0ZUVsZW1lbnRPckRpcmVjdGl2ZVByb3BzLCBbXSwgZWxlbWVudC5zb3VyY2VTcGFuLCBbXSwgdGVtcGxhdGVCb3VuZERpcmVjdGl2ZVByb3BOYW1lcyk7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVFbGVtZW50UHJvcHMgPSB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKGVsTmFtZSwgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVCb3VuZERpcmVjdGl2ZVByb3BOYW1lcyk7XG4gICAgICAgICAgICB0aGlzLl9hc3NlcnROb0NvbXBvbmVudHNOb3JFbGVtZW50QmluZGluZ3NPblRlbXBsYXRlKHRlbXBsYXRlRGlyZWN0aXZlQXN0cywgdGVtcGxhdGVFbGVtZW50UHJvcHMsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVQcm92aWRlckNvbnRleHQgPSBuZXcgUHJvdmlkZXJFbGVtZW50Q29udGV4dCh0aGlzLnByb3ZpZGVyVmlld0NvbnRleHQsIHBhcmVudC5wcm92aWRlckNvbnRleHQsIHBhcmVudC5pc1RlbXBsYXRlRWxlbWVudCwgdGVtcGxhdGVEaXJlY3RpdmVBc3RzLCBbXSwgW10sIHRydWUsIHRlbXBsYXRlUXVlcnlTdGFydEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgdGVtcGxhdGVQcm92aWRlckNvbnRleHQuYWZ0ZXJFbGVtZW50KCk7XG4gICAgICAgICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IEVtYmVkZGVkVGVtcGxhdGVBc3QoW10sIFtdLCBbXSwgdGVtcGxhdGVFbGVtZW50VmFycywgdGVtcGxhdGVQcm92aWRlckNvbnRleHQudHJhbnNmb3JtZWREaXJlY3RpdmVBc3RzLCB0ZW1wbGF0ZVByb3ZpZGVyQ29udGV4dC50cmFuc2Zvcm1Qcm92aWRlcnMsIHRlbXBsYXRlUHJvdmlkZXJDb250ZXh0LnRyYW5zZm9ybWVkSGFzVmlld0NvbnRhaW5lciwgdGVtcGxhdGVQcm92aWRlckNvbnRleHQucXVlcnlNYXRjaGVzLCBbcGFyc2VkRWxlbWVudF0sIG5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWRFbGVtZW50O1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9wYXJzZUF0dHIgPSBmdW5jdGlvbiAoaXNUZW1wbGF0ZUVsZW1lbnQsIGF0dHIsIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcywgdGFyZ2V0RXZlbnRzLCB0YXJnZXRSZWZzLCB0YXJnZXRWYXJzKSB7XG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5fbm9ybWFsaXplQXR0cmlidXRlTmFtZShhdHRyLm5hbWUpO1xuICAgICAgICB2YXIgdmFsdWUgPSBhdHRyLnZhbHVlO1xuICAgICAgICB2YXIgc3JjU3BhbiA9IGF0dHIuc291cmNlU3BhbjtcbiAgICAgICAgdmFyIGJvdW5kRXZlbnRzID0gW107XG4gICAgICAgIHZhciBiaW5kUGFydHMgPSBuYW1lLm1hdGNoKEJJTkRfTkFNRV9SRUdFWFApO1xuICAgICAgICB2YXIgaGFzQmluZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoYmluZFBhcnRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoYXNCaW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChiaW5kUGFydHNbS1dfQklORF9JRFhdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9LV19JRFhdLCB2YWx1ZSwgZmFsc2UsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbS1dfTEVUX0lEWF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkZW50aWZpZXIgPSBiaW5kUGFydHNbSURFTlRfS1dfSURYXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VWYXJpYWJsZShpZGVudGlmaWVyLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0VmFycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlxcXCJsZXQtXFxcIiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBuZy10ZW1wbGF0ZSBlbGVtZW50cy5cIiwgc3JjU3Bhbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX1JFRl9JRFhdKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkZW50aWZpZXIgPSBiaW5kUGFydHNbSURFTlRfS1dfSURYXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVJlZmVyZW5jZShpZGVudGlmaWVyLCB2YWx1ZSwgc3JjU3BhbiwgdGFyZ2V0UmVmcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbS1dfT05fSURYXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VFdmVudChiaW5kUGFydHNbSURFTlRfS1dfSURYXSwgdmFsdWUsIHNyY1NwYW4sIGF0dHIudmFsdWVTcGFuIHx8IHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCBib3VuZEV2ZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbS1dfQklORE9OX0lEWF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9LV19JRFhdLCB2YWx1ZSwgZmFsc2UsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBc3NpZ25tZW50RXZlbnQoYmluZFBhcnRzW0lERU5UX0tXX0lEWF0sIHZhbHVlLCBzcmNTcGFuLCBhdHRyLnZhbHVlU3BhbiB8fCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgYm91bmRFdmVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX0FUX0lEWF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlTGl0ZXJhbEF0dHIobmFtZSwgdmFsdWUsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbSURFTlRfQkFOQU5BX0JPWF9JRFhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZVByb3BlcnR5QmluZGluZyhiaW5kUGFydHNbSURFTlRfQkFOQU5BX0JPWF9JRFhdLCB2YWx1ZSwgZmFsc2UsIHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBc3NpZ25tZW50RXZlbnQoYmluZFBhcnRzW0lERU5UX0JBTkFOQV9CT1hfSURYXSwgdmFsdWUsIHNyY1NwYW4sIGF0dHIudmFsdWVTcGFuIHx8IHNyY1NwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCBib3VuZEV2ZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbSURFTlRfUFJPUEVSVFlfSURYXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VQcm9wZXJ0eUJpbmRpbmcoYmluZFBhcnRzW0lERU5UX1BST1BFUlRZX0lEWF0sIHZhbHVlLCBmYWxzZSwgc3JjU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIHRhcmdldFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tJREVOVF9FVkVOVF9JRFhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZUV2ZW50KGJpbmRQYXJ0c1tJREVOVF9FVkVOVF9JRFhdLCB2YWx1ZSwgc3JjU3BhbiwgYXR0ci52YWx1ZVNwYW4gfHwgc3JjU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIGJvdW5kRXZlbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhc0JpbmRpbmcgPSB0aGlzLl9iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlJbnRlcnBvbGF0aW9uKG5hbWUsIHZhbHVlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzQmluZGluZykge1xuICAgICAgICAgICAgdGhpcy5fYmluZGluZ1BhcnNlci5wYXJzZUxpdGVyYWxBdHRyKG5hbWUsIHZhbHVlLCBzcmNTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldEV2ZW50cy5wdXNoLmFwcGx5KHRhcmdldEV2ZW50cywgX19zcHJlYWQoYm91bmRFdmVudHMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBCb3VuZEV2ZW50QXN0LmZyb21QYXJzZWRFdmVudChlKTsgfSkpKTtcbiAgICAgICAgcmV0dXJuIGhhc0JpbmRpbmc7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX25vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAoYXR0ck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIC9eZGF0YS0vaS50ZXN0KGF0dHJOYW1lKSA/IGF0dHJOYW1lLnN1YnN0cmluZyg1KSA6IGF0dHJOYW1lO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9wYXJzZVZhcmlhYmxlID0gZnVuY3Rpb24gKGlkZW50aWZpZXIsIHZhbHVlLCBzb3VyY2VTcGFuLCB0YXJnZXRWYXJzKSB7XG4gICAgICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlxcXCItXFxcIiBpcyBub3QgYWxsb3dlZCBpbiB2YXJpYWJsZSBuYW1lc1wiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRWYXJzLnB1c2gobmV3IFZhcmlhYmxlQXN0KGlkZW50aWZpZXIsIHZhbHVlLCBzb3VyY2VTcGFuKSk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX3BhcnNlUmVmZXJlbmNlID0gZnVuY3Rpb24gKGlkZW50aWZpZXIsIHZhbHVlLCBzb3VyY2VTcGFuLCB0YXJnZXRSZWZzKSB7XG4gICAgICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIlxcXCItXFxcIiBpcyBub3QgYWxsb3dlZCBpbiByZWZlcmVuY2UgbmFtZXNcIiwgc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0UmVmcy5wdXNoKG5ldyBFbGVtZW50T3JEaXJlY3RpdmVSZWYoaWRlbnRpZmllciwgdmFsdWUsIHNvdXJjZVNwYW4pKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fcGFyc2VBc3NpZ25tZW50RXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdmFsdWVTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0RXZlbnRzKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdQYXJzZXIucGFyc2VFdmVudChuYW1lICsgXCJDaGFuZ2VcIiwgZXhwcmVzc2lvbiArIFwiPSRldmVudFwiLCBzb3VyY2VTcGFuLCB2YWx1ZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRFdmVudHMpO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9wYXJzZURpcmVjdGl2ZXMgPSBmdW5jdGlvbiAoc2VsZWN0b3JNYXRjaGVyLCBlbGVtZW50Q3NzU2VsZWN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gTmVlZCB0byBzb3J0IHRoZSBkaXJlY3RpdmVzIHNvIHRoYXQgd2UgZ2V0IGNvbnNpc3RlbnQgcmVzdWx0cyB0aHJvdWdob3V0LFxuICAgICAgICAvLyBhcyBzZWxlY3Rvck1hdGNoZXIgdXNlcyBNYXBzIGluc2lkZS5cbiAgICAgICAgLy8gQWxzbyBkZWR1cGxpY2F0ZSBkaXJlY3RpdmVzIGFzIHRoZXkgbWlnaHQgbWF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lIVxuICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IG5ldyBBcnJheSh0aGlzLmRpcmVjdGl2ZXNJbmRleC5zaXplKTtcbiAgICAgICAgLy8gV2hldGhlciBhbnkgZGlyZWN0aXZlIHNlbGVjdG9yIG1hdGNoZXMgb24gdGhlIGVsZW1lbnQgbmFtZVxuICAgICAgICB2YXIgbWF0Y2hFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIHNlbGVjdG9yTWF0Y2hlci5tYXRjaChlbGVtZW50Q3NzU2VsZWN0b3IsIGZ1bmN0aW9uIChzZWxlY3RvciwgZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVzW190aGlzLmRpcmVjdGl2ZXNJbmRleC5nZXQoZGlyZWN0aXZlKV0gPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICBtYXRjaEVsZW1lbnQgPSBtYXRjaEVsZW1lbnQgfHwgc2VsZWN0b3IuaGFzRWxlbWVudFNlbGVjdG9yKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlyZWN0aXZlczogZGlyZWN0aXZlcy5maWx0ZXIoZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gISFkaXI7IH0pLFxuICAgICAgICAgICAgbWF0Y2hFbGVtZW50OiBtYXRjaEVsZW1lbnQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX2NyZWF0ZURpcmVjdGl2ZUFzdHMgPSBmdW5jdGlvbiAoaXNUZW1wbGF0ZUVsZW1lbnQsIGVsZW1lbnROYW1lLCBkaXJlY3RpdmVzLCBwcm9wcywgZWxlbWVudE9yRGlyZWN0aXZlUmVmcywgZWxlbWVudFNvdXJjZVNwYW4sIHRhcmdldFJlZmVyZW5jZXMsIHRhcmdldEJvdW5kRGlyZWN0aXZlUHJvcE5hbWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtYXRjaGVkUmVmZXJlbmNlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IG51bGw7XG4gICAgICAgIHZhciBkaXJlY3RpdmVBc3RzID0gZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24gKGRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdmFyIHNvdXJjZVNwYW4gPSBuZXcgUGFyc2VTb3VyY2VTcGFuKGVsZW1lbnRTb3VyY2VTcGFuLnN0YXJ0LCBlbGVtZW50U291cmNlU3Bhbi5lbmQsIFwiRGlyZWN0aXZlIFwiICsgaWRlbnRpZmllck5hbWUoZGlyZWN0aXZlLnR5cGUpKTtcbiAgICAgICAgICAgIGlmIChkaXJlY3RpdmUuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBkaXJlY3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGJvdW5kUHJvcGVydGllcyA9IF90aGlzLl9iaW5kaW5nUGFyc2VyLmNyZWF0ZURpcmVjdGl2ZUhvc3RQcm9wZXJ0eUFzdHMoZGlyZWN0aXZlLCBlbGVtZW50TmFtZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICB2YXIgaG9zdFByb3BlcnRpZXMgPSBib3VuZFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChwcm9wKSB7IHJldHVybiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdC5mcm9tQm91bmRQcm9wZXJ0eShwcm9wKTsgfSk7XG4gICAgICAgICAgICAvLyBOb3RlOiBXZSBuZWVkIHRvIGNoZWNrIHRoZSBob3N0IHByb3BlcnRpZXMgaGVyZSBhcyB3ZWxsLFxuICAgICAgICAgICAgLy8gYXMgd2UgZG9uJ3Qga25vdyB0aGUgZWxlbWVudCBuYW1lIGluIHRoZSBEaXJlY3RpdmVXcmFwcGVyQ29tcGlsZXIgeWV0LlxuICAgICAgICAgICAgaG9zdFByb3BlcnRpZXMgPSBfdGhpcy5fY2hlY2tQcm9wZXJ0aWVzSW5TY2hlbWEoZWxlbWVudE5hbWUsIGhvc3RQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRFdmVudHMgPSBfdGhpcy5fYmluZGluZ1BhcnNlci5jcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzKGRpcmVjdGl2ZSwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICBfdGhpcy5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzKGRpcmVjdGl2ZS5pbnB1dHMsIHByb3BzLCBkaXJlY3RpdmVQcm9wZXJ0aWVzLCB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BOYW1lcyk7XG4gICAgICAgICAgICBlbGVtZW50T3JEaXJlY3RpdmVSZWZzLmZvckVhY2goZnVuY3Rpb24gKGVsT3JEaXJSZWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoKGVsT3JEaXJSZWYudmFsdWUubGVuZ3RoID09PSAwICYmIGRpcmVjdGl2ZS5pc0NvbXBvbmVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGVsT3JEaXJSZWYuaXNSZWZlcmVuY2VUb0RpcmVjdGl2ZShkaXJlY3RpdmUpKSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZlcmVuY2VzLnB1c2gobmV3IFJlZmVyZW5jZUFzdChlbE9yRGlyUmVmLm5hbWUsIGNyZWF0ZVRva2VuRm9yUmVmZXJlbmNlKGRpcmVjdGl2ZS50eXBlLnJlZmVyZW5jZSksIGVsT3JEaXJSZWYudmFsdWUsIGVsT3JEaXJSZWYuc291cmNlU3BhbikpO1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVmZXJlbmNlcy5hZGQoZWxPckRpclJlZi5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBob3N0RXZlbnRzID0gcGFyc2VkRXZlbnRzLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gQm91bmRFdmVudEFzdC5mcm9tUGFyc2VkRXZlbnQoZSk7IH0pO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnRRdWVyeVN0YXJ0SWQgPSBfdGhpcy5jb250ZW50UXVlcnlTdGFydElkO1xuICAgICAgICAgICAgX3RoaXMuY29udGVudFF1ZXJ5U3RhcnRJZCArPSBkaXJlY3RpdmUucXVlcmllcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdGl2ZUFzdChkaXJlY3RpdmUsIGRpcmVjdGl2ZVByb3BlcnRpZXMsIGhvc3RQcm9wZXJ0aWVzLCBob3N0RXZlbnRzLCBjb250ZW50UXVlcnlTdGFydElkLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRPckRpcmVjdGl2ZVJlZnMuZm9yRWFjaChmdW5jdGlvbiAoZWxPckRpclJlZikge1xuICAgICAgICAgICAgaWYgKGVsT3JEaXJSZWYudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFJlZmVyZW5jZXMuaGFzKGVsT3JEaXJSZWYubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKFwiVGhlcmUgaXMgbm8gZGlyZWN0aXZlIHdpdGggXFxcImV4cG9ydEFzXFxcIiBzZXQgdG8gXFxcIlwiICsgZWxPckRpclJlZi52YWx1ZSArIFwiXFxcIlwiLCBlbE9yRGlyUmVmLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVmVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChpc1RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZWZUb2tlbiA9IGNyZWF0ZVRva2VuRm9yRXh0ZXJuYWxSZWZlcmVuY2UoX3RoaXMucmVmbGVjdG9yLCBJZGVudGlmaWVycy5UZW1wbGF0ZVJlZik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldFJlZmVyZW5jZXMucHVzaChuZXcgUmVmZXJlbmNlQXN0KGVsT3JEaXJSZWYubmFtZSwgcmVmVG9rZW4sIGVsT3JEaXJSZWYudmFsdWUsIGVsT3JEaXJSZWYuc291cmNlU3BhbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZUFzdHM7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX2NyZWF0ZURpcmVjdGl2ZVByb3BlcnR5QXN0cyA9IGZ1bmN0aW9uIChkaXJlY3RpdmVQcm9wZXJ0aWVzLCBib3VuZFByb3BzLCB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzLCB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BOYW1lcykge1xuICAgICAgICBpZiAoZGlyZWN0aXZlUHJvcGVydGllcykge1xuICAgICAgICAgICAgdmFyIGJvdW5kUHJvcHNCeU5hbWVfMSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGJvdW5kUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoYm91bmRQcm9wKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZWYWx1ZSA9IGJvdW5kUHJvcHNCeU5hbWVfMS5nZXQoYm91bmRQcm9wLm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghcHJldlZhbHVlIHx8IHByZXZWYWx1ZS5pc0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBbYV09XCJiXCIgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGE9XCJiXCIgb24gdGhlIHNhbWUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBib3VuZFByb3BzQnlOYW1lXzEuc2V0KGJvdW5kUHJvcC5uYW1lLCBib3VuZFByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGlyZWN0aXZlUHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoZGlyUHJvcCkge1xuICAgICAgICAgICAgICAgIHZhciBlbFByb3AgPSBkaXJlY3RpdmVQcm9wZXJ0aWVzW2RpclByb3BdO1xuICAgICAgICAgICAgICAgIHZhciBib3VuZFByb3AgPSBib3VuZFByb3BzQnlOYW1lXzEuZ2V0KGVsUHJvcCk7XG4gICAgICAgICAgICAgICAgLy8gQmluZGluZ3MgYXJlIG9wdGlvbmFsLCBzbyB0aGlzIGJpbmRpbmcgb25seSBuZWVkcyB0byBiZSBzZXQgdXAgaWYgYW4gZXhwcmVzc2lvbiBpcyBnaXZlbi5cbiAgICAgICAgICAgICAgICBpZiAoYm91bmRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldEJvdW5kRGlyZWN0aXZlUHJvcE5hbWVzLmFkZChib3VuZFByb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eUV4cHJlc3Npb24oYm91bmRQcm9wLmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzLnB1c2gobmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoZGlyUHJvcCwgYm91bmRQcm9wLm5hbWUsIGJvdW5kUHJvcC5leHByZXNzaW9uLCBib3VuZFByb3Auc291cmNlU3BhbikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyA9IGZ1bmN0aW9uIChlbGVtZW50TmFtZSwgcHJvcHMsIGJvdW5kRGlyZWN0aXZlUHJvcE5hbWVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBib3VuZEVsZW1lbnRQcm9wcyA9IFtdO1xuICAgICAgICBwcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgICAgICBpZiAoIXByb3AuaXNMaXRlcmFsICYmICFib3VuZERpcmVjdGl2ZVByb3BOYW1lcy5oYXMocHJvcC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciBib3VuZFByb3AgPSBfdGhpcy5fYmluZGluZ1BhcnNlci5jcmVhdGVCb3VuZEVsZW1lbnRQcm9wZXJ0eShlbGVtZW50TmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgICAgYm91bmRFbGVtZW50UHJvcHMucHVzaChCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdC5mcm9tQm91bmRQcm9wZXJ0eShib3VuZFByb3ApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGVja1Byb3BlcnRpZXNJblNjaGVtYShlbGVtZW50TmFtZSwgYm91bmRFbGVtZW50UHJvcHMpO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlcyA9IGZ1bmN0aW9uIChkaXJlY3RpdmVzKSB7XG4gICAgICAgIHJldHVybiBkaXJlY3RpdmVzLmZpbHRlcihmdW5jdGlvbiAoZGlyZWN0aXZlKSB7IHJldHVybiBkaXJlY3RpdmUuZGlyZWN0aXZlLmlzQ29tcG9uZW50OyB9KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fZmluZENvbXBvbmVudERpcmVjdGl2ZU5hbWVzID0gZnVuY3Rpb24gKGRpcmVjdGl2ZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVzKGRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHsgcmV0dXJuIGlkZW50aWZpZXJOYW1lKGRpcmVjdGl2ZS5kaXJlY3RpdmUudHlwZSk7IH0pO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50ID0gZnVuY3Rpb24gKGRpcmVjdGl2ZXMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudFR5cGVOYW1lcyA9IHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGVOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIk1vcmUgdGhhbiBvbmUgY29tcG9uZW50IG1hdGNoZWQgb24gdGhpcyBlbGVtZW50LlxcblwiICtcbiAgICAgICAgICAgICAgICBcIk1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGNvbXBvbmVudCdzIHNlbGVjdG9yIGNhbiBtYXRjaCBhIGdpdmVuIGVsZW1lbnQuXFxuXCIgK1xuICAgICAgICAgICAgICAgIChcIkNvbmZsaWN0aW5nIGNvbXBvbmVudHM6IFwiICsgY29tcG9uZW50VHlwZU5hbWVzLmpvaW4oJywnKSksIHNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYWtlIHN1cmUgdGhhdCBub24tYW5ndWxhciB0YWdzIGNvbmZvcm0gdG8gdGhlIHNjaGVtYXMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgYW4gYW5ndWxhciB0YWcgd2hlbiBhdCBsZWFzdCBvbmUgZGlyZWN0aXZlIHNlbGVjdG9yIG1hdGNoZXMgdGhlXG4gICAgICogdGFnIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWF0Y2hFbGVtZW50IFdoZXRoZXIgYW55IGRpcmVjdGl2ZSBoYXMgbWF0Y2hlZCBvbiB0aGUgdGFnIG5hbWVcbiAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgaHRtbCBlbGVtZW50XG4gICAgICovXG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9hc3NlcnRFbGVtZW50RXhpc3RzID0gZnVuY3Rpb24gKG1hdGNoRWxlbWVudCwgZWxlbWVudCkge1xuICAgICAgICB2YXIgZWxOYW1lID0gZWxlbWVudC5uYW1lLnJlcGxhY2UoL146eGh0bWw6LywgJycpO1xuICAgICAgICBpZiAoIW1hdGNoRWxlbWVudCAmJiAhdGhpcy5fc2NoZW1hUmVnaXN0cnkuaGFzRWxlbWVudChlbE5hbWUsIHRoaXMuX3NjaGVtYXMpKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSBcIidcIiArIGVsTmFtZSArIFwiJyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxcblwiO1xuICAgICAgICAgICAgZXJyb3JNc2cgKz1cbiAgICAgICAgICAgICAgICBcIjEuIElmICdcIiArIGVsTmFtZSArIFwiJyBpcyBhbiBBbmd1bGFyIGNvbXBvbmVudCwgdGhlbiB2ZXJpZnkgdGhhdCBpdCBpcyBwYXJ0IG9mIHRoaXMgbW9kdWxlLlxcblwiO1xuICAgICAgICAgICAgaWYgKGVsTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGVycm9yTXNnICs9XG4gICAgICAgICAgICAgICAgICAgIFwiMi4gSWYgJ1wiICsgZWxOYW1lICsgXCInIGlzIGEgV2ViIENvbXBvbmVudCB0aGVuIGFkZCAnQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQScgdG8gdGhlICdATmdNb2R1bGUuc2NoZW1hcycgb2YgdGhpcyBjb21wb25lbnQgdG8gc3VwcHJlc3MgdGhpcyBtZXNzYWdlLlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3JNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgXCIyLiBUbyBhbGxvdyBhbnkgZWxlbWVudCBhZGQgJ05PX0VSUk9SU19TQ0hFTUEnIHRvIHRoZSAnQE5nTW9kdWxlLnNjaGVtYXMnIG9mIHRoaXMgY29tcG9uZW50LlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3JNc2csIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fYXNzZXJ0Tm9Db21wb25lbnRzTm9yRWxlbWVudEJpbmRpbmdzT25UZW1wbGF0ZSA9IGZ1bmN0aW9uIChkaXJlY3RpdmVzLCBlbGVtZW50UHJvcHMsIHNvdXJjZVNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNvbXBvbmVudFR5cGVOYW1lcyA9IHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzKTtcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIkNvbXBvbmVudHMgb24gYW4gZW1iZWRkZWQgdGVtcGxhdGU6IFwiICsgY29tcG9uZW50VHlwZU5hbWVzLmpvaW4oJywnKSwgc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudFByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihcIlByb3BlcnR5IGJpbmRpbmcgXCIgKyBwcm9wLm5hbWUgKyBcIiBub3QgdXNlZCBieSBhbnkgZGlyZWN0aXZlIG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlLiBNYWtlIHN1cmUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZSBpcyBzcGVsbGVkIGNvcnJlY3RseSBhbmQgYWxsIGRpcmVjdGl2ZXMgYXJlIGxpc3RlZCBpbiB0aGUgXFxcIkBOZ01vZHVsZS5kZWNsYXJhdGlvbnNcXFwiLlwiLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVBhcnNlVmlzaXRvci5wcm90b3R5cGUuX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyA9IGZ1bmN0aW9uIChkaXJlY3RpdmVzLCBldmVudHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFsbERpcmVjdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRpcmVjdGl2ZS5kaXJlY3RpdmUub3V0cHV0cykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBkaXJlY3RpdmUuZGlyZWN0aXZlLm91dHB1dHNba107XG4gICAgICAgICAgICAgICAgYWxsRGlyZWN0aXZlRXZlbnRzLmFkZChldmVudE5hbWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgIT0gbnVsbCB8fCAhYWxsRGlyZWN0aXZlRXZlbnRzLmhhcyhldmVudC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihcIkV2ZW50IGJpbmRpbmcgXCIgKyBldmVudC5mdWxsTmFtZSArIFwiIG5vdCBlbWl0dGVkIGJ5IGFueSBkaXJlY3RpdmUgb24gYW4gZW1iZWRkZWQgdGVtcGxhdGUuIE1ha2Ugc3VyZSB0aGF0IHRoZSBldmVudCBuYW1lIGlzIHNwZWxsZWQgY29ycmVjdGx5IGFuZCBhbGwgZGlyZWN0aXZlcyBhcmUgbGlzdGVkIGluIHRoZSBcXFwiQE5nTW9kdWxlLmRlY2xhcmF0aW9uc1xcXCIuXCIsIGV2ZW50LnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlUGFyc2VWaXNpdG9yLnByb3RvdHlwZS5fY2hlY2tQcm9wZXJ0aWVzSW5TY2hlbWEgPSBmdW5jdGlvbiAoZWxlbWVudE5hbWUsIGJvdW5kUHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gTm90ZTogV2UgY2FuJ3QgZmlsdGVyIG91dCBlbXB0eSBleHByZXNzaW9ucyBiZWZvcmUgdGhpcyBtZXRob2QsXG4gICAgICAgIC8vIGFzIHdlIHN0aWxsIHdhbnQgdG8gdmFsaWRhdGUgdGhlbSFcbiAgICAgICAgcmV0dXJuIGJvdW5kUHJvcHMuZmlsdGVyKGZ1bmN0aW9uIChib3VuZFByb3ApIHtcbiAgICAgICAgICAgIGlmIChib3VuZFByb3AudHlwZSA9PT0gMCAvKiBQcm9wZXJ0eSAqLyAmJlxuICAgICAgICAgICAgICAgICFfdGhpcy5fc2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkoZWxlbWVudE5hbWUsIGJvdW5kUHJvcC5uYW1lLCBfdGhpcy5fc2NoZW1hcykpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSBcIkNhbid0IGJpbmQgdG8gJ1wiICsgYm91bmRQcm9wLm5hbWUgKyBcIicgc2luY2UgaXQgaXNuJ3QgYSBrbm93biBwcm9wZXJ0eSBvZiAnXCIgKyBlbGVtZW50TmFtZSArIFwiJy5cIjtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuc3RhcnRzV2l0aCgnbmctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2cgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxuMS4gSWYgJ1wiICsgYm91bmRQcm9wLm5hbWUgKyBcIicgaXMgYW4gQW5ndWxhciBkaXJlY3RpdmUsIHRoZW4gYWRkICdDb21tb25Nb2R1bGUnIHRvIHRoZSAnQE5nTW9kdWxlLmltcG9ydHMnIG9mIHRoaXMgY29tcG9uZW50LlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxcbjIuIFRvIGFsbG93IGFueSBwcm9wZXJ0eSBhZGQgJ05PX0VSUk9SU19TQ0hFTUEnIHRvIHRoZSAnQE5nTW9kdWxlLnNjaGVtYXMnIG9mIHRoaXMgY29tcG9uZW50LlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50TmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1zZyArPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4xLiBJZiAnXCIgKyBlbGVtZW50TmFtZSArIFwiJyBpcyBhbiBBbmd1bGFyIGNvbXBvbmVudCBhbmQgaXQgaGFzICdcIiArIGJvdW5kUHJvcC5uYW1lICsgXCInIGlucHV0LCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIHBhcnQgb2YgdGhpcyBtb2R1bGUuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIlxcbjIuIElmICdcIiArIGVsZW1lbnROYW1lICsgXCInIGlzIGEgV2ViIENvbXBvbmVudCB0aGVuIGFkZCAnQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQScgdG8gdGhlICdATmdNb2R1bGUuc2NoZW1hcycgb2YgdGhpcyBjb21wb25lbnQgdG8gc3VwcHJlc3MgdGhpcyBtZXNzYWdlLlwiKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcXG4zLiBUbyBhbGxvdyBhbnkgcHJvcGVydHkgYWRkICdOT19FUlJPUlNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudC5cIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKGVycm9yTXNnLCBib3VuZFByb3Auc291cmNlU3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gIWlzRW1wdHlFeHByZXNzaW9uKGJvdW5kUHJvcC52YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVGVtcGxhdGVQYXJzZVZpc2l0b3IucHJvdG90eXBlLl9yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlLCBzb3VyY2VTcGFuLCBsZXZlbCkge1xuICAgICAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IFBhcnNlRXJyb3JMZXZlbC5FUlJPUjsgfVxuICAgICAgICB0aGlzLl90YXJnZXRFcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcihzb3VyY2VTcGFuLCBtZXNzYWdlLCBsZXZlbCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRlbXBsYXRlUGFyc2VWaXNpdG9yO1xufSgpKTtcbnZhciBOb25CaW5kYWJsZVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9uQmluZGFibGVWaXNpdG9yKCkge1xuICAgIH1cbiAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChhc3QsIHBhcmVudCkge1xuICAgICAgICB2YXIgcHJlcGFyc2VkRWxlbWVudCA9IHByZXBhcnNlRWxlbWVudChhc3QpO1xuICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TQ1JJUFQgfHxcbiAgICAgICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUgfHxcbiAgICAgICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEVTSEVFVCkge1xuICAgICAgICAgICAgLy8gU2tpcHBpbmcgPHNjcmlwdD4gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgICAgIC8vIFNraXBwaW5nIDxzdHlsZT4gYW5kIHN0eWxlc2hlZXRzIGFzIHdlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZW1cbiAgICAgICAgICAgIC8vIGluIHRoZSBTdHlsZUNvbXBpbGVyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYXR0ck5hbWVBbmRWYWx1ZXMgPSBhc3QuYXR0cnMubWFwKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBbYXR0ci5uYW1lLCBhdHRyLnZhbHVlXTsgfSk7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IGNyZWF0ZUVsZW1lbnRDc3NTZWxlY3Rvcihhc3QubmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICAgICAgICB2YXIgbmdDb250ZW50SW5kZXggPSBwYXJlbnQuZmluZE5nQ29udGVudEluZGV4KHNlbGVjdG9yKTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdmlzaXRBbGwkMSh0aGlzLCBhc3QuY2hpbGRyZW4sIEVNUFRZX0VMRU1FTlRfQ09OVEVYVCk7XG4gICAgICAgIHJldHVybiBuZXcgRWxlbWVudEFzdChhc3QubmFtZSwgdmlzaXRBbGwkMSh0aGlzLCBhc3QuYXR0cnMpLCBbXSwgW10sIFtdLCBbXSwgW10sIGZhbHNlLCBbXSwgY2hpbGRyZW4sIG5nQ29udGVudEluZGV4LCBhc3Quc291cmNlU3BhbiwgYXN0LmVuZFNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJBc3QoYXR0cmlidXRlLm5hbWUsIGF0dHJpYnV0ZS52YWx1ZSwgYXR0cmlidXRlLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgcGFyZW50KSB7XG4gICAgICAgIHZhciBuZ0NvbnRlbnRJbmRleCA9IHBhcmVudC5maW5kTmdDb250ZW50SW5kZXgoVEVYVF9DU1NfU0VMRUNUT1IoKSk7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEFzdCh0ZXh0LnZhbHVlLCBuZ0NvbnRlbnRJbmRleCwgdGV4dC5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIE5vbkJpbmRhYmxlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoZXhwYW5zaW9uLCBjb250ZXh0KSB7IHJldHVybiBleHBhbnNpb247IH07XG4gICAgTm9uQmluZGFibGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoZXhwYW5zaW9uQ2FzZSwgY29udGV4dCkgeyByZXR1cm4gZXhwYW5zaW9uQ2FzZTsgfTtcbiAgICByZXR1cm4gTm9uQmluZGFibGVWaXNpdG9yO1xufSgpKTtcbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCBvciBkaXJlY3RpdmUgaW4gYSB0ZW1wbGF0ZS4gRS5nLiwgdGhlIHJlZmVyZW5jZSBpbiB0aGlzIHRlbXBsYXRlOlxuICpcbiAqIDxkaXYgI215TWVudT1cImNvb2xNZW51XCI+XG4gKlxuICogd291bGQgYmUge25hbWU6ICdteU1lbnUnLCB2YWx1ZTogJ2Nvb2xNZW51Jywgc291cmNlU3BhbjogLi4ufVxuICovXG52YXIgRWxlbWVudE9yRGlyZWN0aXZlUmVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVsZW1lbnRPckRpcmVjdGl2ZVJlZihuYW1lLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc291cmNlU3BhbiA9IHNvdXJjZVNwYW47XG4gICAgfVxuICAgIC8qKiBHZXRzIHdoZXRoZXIgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gZGlyZWN0aXZlLiAqL1xuICAgIEVsZW1lbnRPckRpcmVjdGl2ZVJlZi5wcm90b3R5cGUuaXNSZWZlcmVuY2VUb0RpcmVjdGl2ZSA9IGZ1bmN0aW9uIChkaXJlY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHNwbGl0RXhwb3J0QXMoZGlyZWN0aXZlLmV4cG9ydEFzKS5pbmRleE9mKHRoaXMudmFsdWUpICE9PSAtMTtcbiAgICB9O1xuICAgIHJldHVybiBFbGVtZW50T3JEaXJlY3RpdmVSZWY7XG59KCkpO1xuLyoqIFNwbGl0cyBhIHJhdywgcG90ZW50aWFsbHkgY29tbWEtZGVsaW1pdGVkIGBleHBvcnRBc2AgdmFsdWUgaW50byBhbiBhcnJheSBvZiBuYW1lcy4gKi9cbmZ1bmN0aW9uIHNwbGl0RXhwb3J0QXMoZXhwb3J0QXMpIHtcbiAgICByZXR1cm4gZXhwb3J0QXMgPyBleHBvcnRBcy5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS50cmltKCk7IH0pIDogW107XG59XG5mdW5jdGlvbiBzcGxpdENsYXNzZXMoY2xhc3NBdHRyVmFsdWUpIHtcbiAgICByZXR1cm4gY2xhc3NBdHRyVmFsdWUudHJpbSgpLnNwbGl0KC9cXHMrL2cpO1xufVxudmFyIEVsZW1lbnRDb250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVsZW1lbnRDb250ZXh0KGlzVGVtcGxhdGVFbGVtZW50LCBfbmdDb250ZW50SW5kZXhNYXRjaGVyLCBfd2lsZGNhcmROZ0NvbnRlbnRJbmRleCwgcHJvdmlkZXJDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQgPSBpc1RlbXBsYXRlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbmdDb250ZW50SW5kZXhNYXRjaGVyID0gX25nQ29udGVudEluZGV4TWF0Y2hlcjtcbiAgICAgICAgdGhpcy5fd2lsZGNhcmROZ0NvbnRlbnRJbmRleCA9IF93aWxkY2FyZE5nQ29udGVudEluZGV4O1xuICAgICAgICB0aGlzLnByb3ZpZGVyQ29udGV4dCA9IHByb3ZpZGVyQ29udGV4dDtcbiAgICB9XG4gICAgRWxlbWVudENvbnRleHQuY3JlYXRlID0gZnVuY3Rpb24gKGlzVGVtcGxhdGVFbGVtZW50LCBkaXJlY3RpdmVzLCBwcm92aWRlckNvbnRleHQpIHtcbiAgICAgICAgdmFyIG1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgICAgIHZhciB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDtcbiAgICAgICAgdmFyIGNvbXBvbmVudCA9IGRpcmVjdGl2ZXMuZmluZChmdW5jdGlvbiAoZGlyZWN0aXZlKSB7IHJldHVybiBkaXJlY3RpdmUuZGlyZWN0aXZlLmlzQ29tcG9uZW50OyB9KTtcbiAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgdmFyIG5nQ29udGVudFNlbGVjdG9ycyA9IGNvbXBvbmVudC5kaXJlY3RpdmUudGVtcGxhdGUubmdDb250ZW50U2VsZWN0b3JzO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZ0NvbnRlbnRTZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBuZ0NvbnRlbnRTZWxlY3RvcnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmROZ0NvbnRlbnRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVyLmFkZFNlbGVjdGFibGVzKENzc1NlbGVjdG9yLnBhcnNlKG5nQ29udGVudFNlbGVjdG9yc1tpXSksIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRDb250ZXh0KGlzVGVtcGxhdGVFbGVtZW50LCBtYXRjaGVyLCB3aWxkY2FyZE5nQ29udGVudEluZGV4LCBwcm92aWRlckNvbnRleHQpO1xuICAgIH07XG4gICAgRWxlbWVudENvbnRleHQucHJvdG90eXBlLmZpbmROZ0NvbnRlbnRJbmRleCA9IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICB2YXIgbmdDb250ZW50SW5kaWNlcyA9IFtdO1xuICAgICAgICB0aGlzLl9uZ0NvbnRlbnRJbmRleE1hdGNoZXIubWF0Y2goc2VsZWN0b3IsIGZ1bmN0aW9uIChzZWxlY3RvciwgbmdDb250ZW50SW5kZXgpIHsgbmdDb250ZW50SW5kaWNlcy5wdXNoKG5nQ29udGVudEluZGV4KTsgfSk7XG4gICAgICAgIG5nQ29udGVudEluZGljZXMuc29ydCgpO1xuICAgICAgICBpZiAodGhpcy5fd2lsZGNhcmROZ0NvbnRlbnRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICBuZ0NvbnRlbnRJbmRpY2VzLnB1c2godGhpcy5fd2lsZGNhcmROZ0NvbnRlbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5nQ29udGVudEluZGljZXMubGVuZ3RoID4gMCA/IG5nQ29udGVudEluZGljZXNbMF0gOiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIEVsZW1lbnRDb250ZXh0O1xufSgpKTtcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvcihlbGVtZW50TmFtZSwgYXR0cmlidXRlcykge1xuICAgIHZhciBjc3NTZWxlY3RvciA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgIHZhciBlbE5hbWVOb05zID0gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpWzFdO1xuICAgIGNzc1NlbGVjdG9yLnNldEVsZW1lbnQoZWxOYW1lTm9Ocyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbaV1bMF07XG4gICAgICAgIHZhciBhdHRyTmFtZU5vTnMgPSBzcGxpdE5zTmFtZShhdHRyTmFtZSlbMV07XG4gICAgICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2ldWzFdO1xuICAgICAgICBjc3NTZWxlY3Rvci5hZGRBdHRyaWJ1dGUoYXR0ck5hbWVOb05zLCBhdHRyVmFsdWUpO1xuICAgICAgICBpZiAoYXR0ck5hbWUudG9Mb3dlckNhc2UoKSA9PSBDTEFTU19BVFRSKSB7XG4gICAgICAgICAgICB2YXIgY2xhc3NlcyA9IHNwbGl0Q2xhc3NlcyhhdHRyVmFsdWUpO1xuICAgICAgICAgICAgY2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uIChjbGFzc05hbWUpIHsgcmV0dXJuIGNzc1NlbGVjdG9yLmFkZENsYXNzTmFtZShjbGFzc05hbWUpOyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3NzU2VsZWN0b3I7XG59XG52YXIgRU1QVFlfRUxFTUVOVF9DT05URVhUID0gbmV3IEVsZW1lbnRDb250ZXh0KHRydWUsIG5ldyBTZWxlY3Rvck1hdGNoZXIoKSwgbnVsbCwgbnVsbCk7XG52YXIgTk9OX0JJTkRBQkxFX1ZJU0lUT1IgPSBuZXcgTm9uQmluZGFibGVWaXNpdG9yKCk7XG5mdW5jdGlvbiBfaXNFbXB0eVRleHROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIFRleHQkMyAmJiBub2RlLnZhbHVlLnRyaW0oKS5sZW5ndGggPT0gMDtcbn1cbmZ1bmN0aW9uIHJlbW92ZVN1bW1hcnlEdXBsaWNhdGVzKGl0ZW1zKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmICghbWFwLmdldChpdGVtLnR5cGUucmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgbWFwLnNldChpdGVtLnR5cGUucmVmZXJlbmNlLCBpdGVtKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSk7XG59XG5mdW5jdGlvbiBpc0VtcHR5RXhwcmVzc2lvbihhc3QpIHtcbiAgICBpZiAoYXN0IGluc3RhbmNlb2YgQVNUV2l0aFNvdXJjZSkge1xuICAgICAgICBhc3QgPSBhc3QuYXN0O1xuICAgIH1cbiAgICByZXR1cm4gYXN0IGluc3RhbmNlb2YgRW1wdHlFeHByO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzdHlsZSBhbmQgY29udmVydHMgaXQgaW50byBvYmplY3QgbGl0ZXJhbC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHN0eWxlIGFzIHVzZWQgaW4gdGhlIGBzdHlsZWAgYXR0cmlidXRlIGluIEhUTUwuXG4gKiAgIEV4YW1wbGU6IGBjb2xvcjogcmVkOyBoZWlnaHQ6IGF1dG9gLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Ygc3R5bGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUgcGFpcnMsIGUuZy4gYFsnY29sb3InLCAncmVkJywgJ2hlaWdodCcsXG4gKiAnYXV0byddYFxuICovXG5mdW5jdGlvbiBwYXJzZSh2YWx1ZSkge1xuICAgIC8vIHdlIHVzZSBhIHN0cmluZyBhcnJheSBoZXJlIGluc3RlYWQgb2YgYSBzdHJpbmcgbWFwXG4gICAgLy8gYmVjYXVzZSBhIHN0cmluZy1tYXAgaXMgbm90IGd1YXJhbnRlZWQgdG8gcmV0YWluIHRoZVxuICAgIC8vIG9yZGVyIG9mIHRoZSBlbnRyaWVzIHdoZXJlYXMgYSBzdHJpbmcgYXJyYXkgY2FuIGJlXG4gICAgLy8gY29uc3RydXRlZCBpbiBhIFtrZXksIHZhbHVlLCBrZXksIHZhbHVlXSBmb3JtYXQuXG4gICAgdmFyIHN0eWxlcyA9IFtdO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcGFyZW5EZXB0aCA9IDA7XG4gICAgdmFyIHF1b3RlID0gMCAvKiBRdW90ZU5vbmUgKi87XG4gICAgdmFyIHZhbHVlU3RhcnQgPSAwO1xuICAgIHZhciBwcm9wU3RhcnQgPSAwO1xuICAgIHZhciBjdXJyZW50UHJvcCA9IG51bGw7XG4gICAgdmFyIHZhbHVlSGFzUXVvdGVzID0gZmFsc2U7XG4gICAgd2hpbGUgKGkgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHRva2VuID0gdmFsdWUuY2hhckNvZGVBdChpKyspO1xuICAgICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgICAgICBjYXNlIDQwIC8qIE9wZW5QYXJlbiAqLzpcbiAgICAgICAgICAgICAgICBwYXJlbkRlcHRoKys7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQxIC8qIENsb3NlUGFyZW4gKi86XG4gICAgICAgICAgICAgICAgcGFyZW5EZXB0aC0tO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOSAvKiBRdW90ZVNpbmdsZSAqLzpcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZVN0YXJ0IG5lZWRzIHRvIGJlIHRoZXJlIHNpbmNlIHByb3AgdmFsdWVzIGRvbid0XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBxdW90ZXMgaW4gQ1NTXG4gICAgICAgICAgICAgICAgdmFsdWVIYXNRdW90ZXMgPSB2YWx1ZUhhc1F1b3RlcyB8fCB2YWx1ZVN0YXJ0ID4gMDtcbiAgICAgICAgICAgICAgICBpZiAocXVvdGUgPT09IDAgLyogUXVvdGVOb25lICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMzkgLyogUXVvdGVTaW5nbGUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1b3RlID09PSAzOSAvKiBRdW90ZVNpbmdsZSAqLyAmJiB2YWx1ZS5jaGFyQ29kZUF0KGkgLSAxKSAhPT0gOTIgLyogQmFja1NsYXNoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMCAvKiBRdW90ZU5vbmUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzNCAvKiBRdW90ZURvdWJsZSAqLzpcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGxvZ2ljIGFzIGFib3ZlXG4gICAgICAgICAgICAgICAgdmFsdWVIYXNRdW90ZXMgPSB2YWx1ZUhhc1F1b3RlcyB8fCB2YWx1ZVN0YXJ0ID4gMDtcbiAgICAgICAgICAgICAgICBpZiAocXVvdGUgPT09IDAgLyogUXVvdGVOb25lICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMzQgLyogUXVvdGVEb3VibGUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHF1b3RlID09PSAzNCAvKiBRdW90ZURvdWJsZSAqLyAmJiB2YWx1ZS5jaGFyQ29kZUF0KGkgLSAxKSAhPT0gOTIgLyogQmFja1NsYXNoICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1b3RlID0gMCAvKiBRdW90ZU5vbmUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OCAvKiBDb2xvbiAqLzpcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRQcm9wICYmIHBhcmVuRGVwdGggPT09IDAgJiYgcXVvdGUgPT09IDAgLyogUXVvdGVOb25lICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wID0gaHlwaGVuYXRlKHZhbHVlLnN1YnN0cmluZyhwcm9wU3RhcnQsIGkgLSAxKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YXJ0ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDU5IC8qIFNlbWljb2xvbiAqLzpcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFByb3AgJiYgdmFsdWVTdGFydCA+IDAgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBxdW90ZSA9PT0gMCAvKiBRdW90ZU5vbmUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlVmFsID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIGkgLSAxKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKGN1cnJlbnRQcm9wLCB2YWx1ZUhhc1F1b3RlcyA/IHN0cmlwVW5uZWNlc3NhcnlRdW90ZXMoc3R5bGVWYWwpIDogc3R5bGVWYWwpO1xuICAgICAgICAgICAgICAgICAgICBwcm9wU3RhcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3AgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZUhhc1F1b3RlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3VycmVudFByb3AgJiYgdmFsdWVTdGFydCkge1xuICAgICAgICB2YXIgc3R5bGVWYWwgPSB2YWx1ZS5zdWJzdHIodmFsdWVTdGFydCkudHJpbSgpO1xuICAgICAgICBzdHlsZXMucHVzaChjdXJyZW50UHJvcCwgdmFsdWVIYXNRdW90ZXMgPyBzdHJpcFVubmVjZXNzYXJ5UXVvdGVzKHN0eWxlVmFsKSA6IHN0eWxlVmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlcztcbn1cbmZ1bmN0aW9uIHN0cmlwVW5uZWNlc3NhcnlRdW90ZXModmFsdWUpIHtcbiAgICB2YXIgcVMgPSB2YWx1ZS5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBxRSA9IHZhbHVlLmNoYXJDb2RlQXQodmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgaWYgKHFTID09IHFFICYmIChxUyA9PSAzOSAvKiBRdW90ZVNpbmdsZSAqLyB8fCBxUyA9PSAzNCAvKiBRdW90ZURvdWJsZSAqLykpIHtcbiAgICAgICAgdmFyIHRlbXBWYWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHRvIGF2b2lkIHVzaW5nIGEgbXVsdGktcXVvdGVkIHN0cmluZyB0aGF0IHdhcyBqdXN0IGNob21wZWRcbiAgICAgICAgLy8gKGUuZy4gYGZvbnQtZmFtaWx5OiBcIlZlcmRhbmFcIiwgXCJzYW5zLXNlcmlmXCJgKVxuICAgICAgICBpZiAodGVtcFZhbHVlLmluZGV4T2YoJ1xcJycpID09IC0xICYmIHRlbXBWYWx1ZS5pbmRleE9mKCdcIicpID09IC0xKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXBWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBoeXBoZW5hdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW2Etel1bQS1aXS9nLCBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdi5jaGFyQXQoMCkgKyAnLScgKyB2LmNoYXJBdCgxKTtcbiAgICB9KS50b0xvd2VyQ2FzZSgpO1xufVxuXG52YXIgSU1QT1JUQU5UX0ZMQUcgPSAnIWltcG9ydGFudCc7XG4vKipcbiAqIFByb2R1Y2VzIGNyZWF0aW9uL3VwZGF0ZSBpbnN0cnVjdGlvbnMgZm9yIGFsbCBzdHlsaW5nIGJpbmRpbmdzIChjbGFzcyBhbmQgc3R5bGUpXG4gKlxuICogSXQgYWxzbyBwcm9kdWNlcyB0aGUgY3JlYXRpb24gaW5zdHJ1Y3Rpb24gdG8gcmVnaXN0ZXIgYWxsIGluaXRpYWwgc3R5bGluZyB2YWx1ZXNcbiAqICh3aGljaCBhcmUgYWxsIHRoZSBzdGF0aWMgY2xhc3M9XCIuLi5cIiBhbmQgc3R5bGU9XCIuLi5cIiBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQgZXhpc3RcbiAqIG9uIGFuIGVsZW1lbnQgd2l0aGluIGEgdGVtcGxhdGUpLlxuICpcbiAqIFRoZSBidWlsZGVyIGNsYXNzIGJlbG93IGhhbmRsZXMgcHJvZHVjaW5nIGluc3RydWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczpcbiAqXG4gKiAtIFN0YXRpYyBzdHlsZS9jbGFzcyBhdHRyaWJ1dGVzIChzdHlsZT1cIi4uLlwiIGFuZCBjbGFzcz1cIi4uLlwiKVxuICogLSBEeW5hbWljIHN0eWxlL2NsYXNzIG1hcCBiaW5kaW5ncyAoW3N0eWxlXT1cIm1hcFwiIGFuZCBbY2xhc3NdPVwibWFwfHN0cmluZ1wiKVxuICogLSBEeW5hbWljIHN0eWxlL2NsYXNzIHByb3BlcnR5IGJpbmRpbmdzIChbc3R5bGUucHJvcF09XCJleHBcIiBhbmQgW2NsYXNzLm5hbWVdPVwiZXhwXCIpXG4gKlxuICogRHVlIHRvIHRoZSBjb21wbGV4IHJlbGF0aW9uc2hpcCBvZiBhbGwgb2YgdGhlc2UgY2FzZXMsIHRoZSBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkXG4gKiBmb3IgdGhlc2UgYXR0cmlidXRlcy9wcm9wZXJ0aWVzL2JpbmRpbmdzIG11c3QgYmUgZG9uZSBzbyBpbiB0aGUgY29ycmVjdCBvcmRlci4gVGhlXG4gKiBvcmRlciB3aGljaCB0aGVzZSBtdXN0IGJlIGdlbmVyYXRlZCBpcyBhcyBmb2xsb3dzOlxuICpcbiAqIGlmIChjcmVhdGVNb2RlKSB7XG4gKiAgIGVsZW1lbnRTdHlsaW5nKC4uLilcbiAqIH1cbiAqIGlmICh1cGRhdGVNb2RlKSB7XG4gKiAgIGVsZW1lbnRTdHlsaW5nTWFwKC4uLilcbiAqICAgZWxlbWVudFN0eWxlUHJvcCguLi4pXG4gKiAgIGVsZW1lbnRDbGFzc1Byb3AoLi4uKVxuICogICBlbGVtZW50U3R5bGluZ0FwcCguLi4pXG4gKiB9XG4gKlxuICogVGhlIGNyZWF0aW9uL3VwZGF0ZSBtZXRob2RzIHdpdGhpbiB0aGUgYnVpbGRlciBjbGFzcyBwcm9kdWNlIHRoZXNlIGluc3RydWN0aW9ucy5cbiAqL1xudmFyIFN0eWxpbmdCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0eWxpbmdCdWlsZGVyKF9lbGVtZW50SW5kZXhFeHByLCBfZGlyZWN0aXZlRXhwcikge1xuICAgICAgICB0aGlzLl9lbGVtZW50SW5kZXhFeHByID0gX2VsZW1lbnRJbmRleEV4cHI7XG4gICAgICAgIHRoaXMuX2RpcmVjdGl2ZUV4cHIgPSBfZGlyZWN0aXZlRXhwcjtcbiAgICAgICAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkgc3RhdGljIHN0eWxpbmcgdmFsdWVzIHByZXNlbnQgKi9cbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbFZhbHVlcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogIFdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkgc3R5bGluZyBiaW5kaW5ncyBwcmVzZW50XG4gICAgICAgICAqICAoaS5lLiBgW3N0eWxlXWAsIGBbY2xhc3NdYCwgYFtzdHlsZS5wcm9wXWAgb3IgYFtjbGFzcy5uYW1lXWApXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhc0JpbmRpbmdzID0gZmFsc2U7XG4gICAgICAgIC8qKiB0aGUgaW5wdXQgZm9yIFtjbGFzc10gKGlmIGl0IGV4aXN0cykgKi9cbiAgICAgICAgdGhpcy5fY2xhc3NNYXBJbnB1dCA9IG51bGw7XG4gICAgICAgIC8qKiB0aGUgaW5wdXQgZm9yIFtzdHlsZV0gKGlmIGl0IGV4aXN0cykgKi9cbiAgICAgICAgdGhpcy5fc3R5bGVNYXBJbnB1dCA9IG51bGw7XG4gICAgICAgIC8qKiBhbiBhcnJheSBvZiBlYWNoIFtzdHlsZS5wcm9wXSBpbnB1dCAqL1xuICAgICAgICB0aGlzLl9zaW5nbGVTdHlsZUlucHV0cyA9IG51bGw7XG4gICAgICAgIC8qKiBhbiBhcnJheSBvZiBlYWNoIFtjbGFzcy5uYW1lXSBpbnB1dCAqL1xuICAgICAgICB0aGlzLl9zaW5nbGVDbGFzc0lucHV0cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhc3RTdHlsaW5nSW5wdXQgPSBudWxsO1xuICAgICAgICAvLyBtYXBzIGFyZSB1c2VkIGluc3RlYWQgb2YgaGFzaCBtYXBzIGJlY2F1c2UgYSBNYXAgd2lsbFxuICAgICAgICAvLyByZXRhaW4gdGhlIG9yZGVyaW5nIG9mIHRoZSBrZXlzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiBlYWNoIHN0eWxlIGJpbmRpbmcgaW4gdGhlIHRlbXBsYXRlXG4gICAgICAgICAqIChlLmcuIGA8ZGl2IFtzdHlsZS53aWR0aF09XCJ3XCIgW3N0eWxlLmhlaWdodF09XCJoXCI+YCBpbXBsaWVzXG4gICAgICAgICAqIHRoYXQgYHdpZHRoPTBgIGFuZCBgaGVpZ2h0PTFgKVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3R5bGVzSW5kZXggPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiBlYWNoIGNsYXNzIGJpbmRpbmcgaW4gdGhlIHRlbXBsYXRlXG4gICAgICAgICAqIChlLmcuIGA8ZGl2IFtjbGFzcy5iaWddPVwiYlwiIFtjbGFzcy5oaWRkZW5dPVwiaFwiPmAgaW1wbGllc1xuICAgICAgICAgKiB0aGF0IGBiaWc9MGAgYW5kIGBoaWRkZW49MWApXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jbGFzc2VzSW5kZXggPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2luaXRpYWxTdHlsZVZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLl9pbml0aWFsQ2xhc3NWYWx1ZXMgPSBbXTtcbiAgICAgICAgLy8gY2VydGFpbiBzdHlsZSBwcm9wZXJ0aWVzIEFMV0FZUyBuZWVkIHNhbml0aXphdGlvblxuICAgICAgICAvLyB0aGlzIGlzIGNoZWNrZWQgZWFjaCB0aW1lIG5ldyBzdHlsZXMgYXJlIGVuY291bnRlcmVkXG4gICAgICAgIHRoaXMuX3VzZURlZmF1bHRTYW5pdGl6ZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgZ2l2ZW4gaW5wdXQgdG8gdGhlIHN0eWxpbmcgYnVpbGRlciB0byBiZSBsYXRlciB1c2VkIHdoZW4gcHJvZHVjaW5nIEFPVCBjb2RlLlxuICAgICAqXG4gICAgICogVGhlIGNvZGUgYmVsb3cgd2lsbCBvbmx5IGFjY2VwdCB0aGUgaW5wdXQgaWYgaXQgaXMgc29tZWhvdyB0aWVkIHRvIHN0eWxpbmcgKHdoZXRoZXIgaXQgYmVcbiAgICAgKiBzdHlsZS9jbGFzcyBiaW5kaW5ncyBvciBzdGF0aWMgc3R5bGUvY2xhc3MgYXR0cmlidXRlcykuXG4gICAgICovXG4gICAgU3R5bGluZ0J1aWxkZXIucHJvdG90eXBlLnJlZ2lzdGVyQm91bmRJbnB1dCA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAvLyBbYXR0ci5zdHlsZV0gb3IgW2F0dHIuY2xhc3NdIGFyZSBza2lwcGVkIGluIHRoZSBjb2RlIGJlbG93LFxuICAgICAgICAvLyB0aGV5IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBzdHlsaW5nLWJhc2VkIGJpbmRpbmdzIHNpbmNlXG4gICAgICAgIC8vIHRoZXkgYXJlIGludGVuZGVkIHRvIGJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIGF0dHIgYW5kXG4gICAgICAgIC8vIHdpbGwgdGhlcmVmb3JlIHNraXAgYWxsIHN0eWxlL2NsYXNzIHJlc29sdXRpb24gdGhhdCBpcyBwcmVzZW50XG4gICAgICAgIC8vIHdpdGggc3R5bGU9XCJcIiwgW3N0eWxlXT1cIlwiIGFuZCBbc3R5bGUucHJvcF09XCJcIiwgY2xhc3M9XCJcIixcbiAgICAgICAgLy8gW2NsYXNzLnByb3BdPVwiXCIuIFtjbGFzc109XCJcIiBhc3NpZ25tZW50c1xuICAgICAgICB2YXIgYmluZGluZyA9IG51bGw7XG4gICAgICAgIHZhciBuYW1lID0gaW5wdXQubmFtZTtcbiAgICAgICAgc3dpdGNoIChpbnB1dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDAgLyogUHJvcGVydHkgKi86XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IHRoaXMucmVnaXN0ZXJJbnB1dEJhc2VkT25OYW1lKG5hbWUsIGlucHV0LnZhbHVlLCBpbnB1dC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMyAvKiBTdHlsZSAqLzpcbiAgICAgICAgICAgICAgICBiaW5kaW5nID0gdGhpcy5yZWdpc3RlclN0eWxlSW5wdXQobmFtZSwgZmFsc2UsIGlucHV0LnZhbHVlLCBpbnB1dC5zb3VyY2VTcGFuLCBpbnB1dC51bml0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMiAvKiBDbGFzcyAqLzpcbiAgICAgICAgICAgICAgICBiaW5kaW5nID0gdGhpcy5yZWdpc3RlckNsYXNzSW5wdXQobmFtZSwgZmFsc2UsIGlucHV0LnZhbHVlLCBpbnB1dC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmluZGluZyA/IHRydWUgOiBmYWxzZTtcbiAgICB9O1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5yZWdpc3RlcklucHV0QmFzZWRPbk5hbWUgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3Bhbikge1xuICAgICAgICB2YXIgYmluZGluZyA9IG51bGw7XG4gICAgICAgIHZhciBuYW1lVG9NYXRjaCA9IG5hbWUuc3Vic3RyaW5nKDAsIDUpOyAvLyBjbGFzcyB8IHN0eWxlXG4gICAgICAgIHZhciBpc1N0eWxlID0gbmFtZVRvTWF0Y2ggPT09ICdzdHlsZSc7XG4gICAgICAgIHZhciBpc0NsYXNzID0gaXNTdHlsZSA/IGZhbHNlIDogKG5hbWVUb01hdGNoID09PSAnY2xhc3MnKTtcbiAgICAgICAgaWYgKGlzU3R5bGUgfHwgaXNDbGFzcykge1xuICAgICAgICAgICAgdmFyIGlzTWFwQmFzZWQgPSBuYW1lLmNoYXJBdCg1KSAhPT0gJy4nOyAvLyBzdHlsZS5wcm9wIG9yIGNsYXNzLnByb3AgbWFrZXMgdGhpcyBhIG5vXG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBuYW1lLnN1YnN0cihpc01hcEJhc2VkID8gNSA6IDYpOyAvLyB0aGUgZG90IGV4cGxhaW5zIHdoeSB0aGVyZSdzIGEgKzFcbiAgICAgICAgICAgIGlmIChpc1N0eWxlKSB7XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IHRoaXMucmVnaXN0ZXJTdHlsZUlucHV0KHByb3BlcnR5LCBpc01hcEJhc2VkLCBleHByZXNzaW9uLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJpbmRpbmcgPSB0aGlzLnJlZ2lzdGVyQ2xhc3NJbnB1dChwcm9wZXJ0eSwgaXNNYXBCYXNlZCwgZXhwcmVzc2lvbiwgc291cmNlU3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJpbmRpbmc7XG4gICAgfTtcbiAgICBTdHlsaW5nQnVpbGRlci5wcm90b3R5cGUucmVnaXN0ZXJTdHlsZUlucHV0ID0gZnVuY3Rpb24gKG5hbWUsIGlzTWFwQmFzZWQsIHZhbHVlLCBzb3VyY2VTcGFuLCB1bml0KSB7XG4gICAgICAgIGlmIChpc0VtcHR5RXhwcmVzc2lvbih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHBhcnNlUHJvcGVydHkobmFtZSksIHByb3BlcnR5ID0gX2EucHJvcGVydHksIGhhc092ZXJyaWRlRmxhZyA9IF9hLmhhc092ZXJyaWRlRmxhZywgYmluZGluZ1VuaXQgPSBfYS51bml0O1xuICAgICAgICB2YXIgZW50cnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wZXJ0eSxcbiAgICAgICAgICAgIHVuaXQ6IHVuaXQgfHwgYmluZGluZ1VuaXQsIHZhbHVlOiB2YWx1ZSwgc291cmNlU3Bhbjogc291cmNlU3BhbiwgaGFzT3ZlcnJpZGVGbGFnOiBoYXNPdmVycmlkZUZsYWdcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlzTWFwQmFzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZURlZmF1bHRTYW5pdGl6ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc3R5bGVNYXBJbnB1dCA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgKHRoaXMuX3NpbmdsZVN0eWxlSW5wdXRzID0gdGhpcy5fc2luZ2xlU3R5bGVJbnB1dHMgfHwgW10pLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgdGhpcy5fdXNlRGVmYXVsdFNhbml0aXplciA9IHRoaXMuX3VzZURlZmF1bHRTYW5pdGl6ZXIgfHwgaXNTdHlsZVNhbml0aXphYmxlKG5hbWUpO1xuICAgICAgICAgICAgcmVnaXN0ZXJJbnRvTWFwKHRoaXMuX3N0eWxlc0luZGV4LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGFzdFN0eWxpbmdJbnB1dCA9IGVudHJ5O1xuICAgICAgICB0aGlzLmhhc0JpbmRpbmdzID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH07XG4gICAgU3R5bGluZ0J1aWxkZXIucHJvdG90eXBlLnJlZ2lzdGVyQ2xhc3NJbnB1dCA9IGZ1bmN0aW9uIChuYW1lLCBpc01hcEJhc2VkLCB2YWx1ZSwgc291cmNlU3Bhbikge1xuICAgICAgICBpZiAoaXNFbXB0eUV4cHJlc3Npb24odmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSBwYXJzZVByb3BlcnR5KG5hbWUpLCBwcm9wZXJ0eSA9IF9hLnByb3BlcnR5LCBoYXNPdmVycmlkZUZsYWcgPSBfYS5oYXNPdmVycmlkZUZsYWc7XG4gICAgICAgIHZhciBlbnRyeSA9IHsgbmFtZTogcHJvcGVydHksIHZhbHVlOiB2YWx1ZSwgc291cmNlU3Bhbjogc291cmNlU3BhbiwgaGFzT3ZlcnJpZGVGbGFnOiBoYXNPdmVycmlkZUZsYWcsIHVuaXQ6IG51bGwgfTtcbiAgICAgICAgaWYgKGlzTWFwQmFzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzTWFwSW5wdXQgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICh0aGlzLl9zaW5nbGVDbGFzc0lucHV0cyA9IHRoaXMuX3NpbmdsZUNsYXNzSW5wdXRzIHx8IFtdKS5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIHJlZ2lzdGVySW50b01hcCh0aGlzLl9jbGFzc2VzSW5kZXgsIHByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYXN0U3R5bGluZ0lucHV0ID0gZW50cnk7XG4gICAgICAgIHRoaXMuaGFzQmluZGluZ3MgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgdGhlIGVsZW1lbnQncyBzdGF0aWMgc3R5bGUgc3RyaW5nIHZhbHVlIHRvIHRoZSBidWlsZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHlsZSBzdHJpbmcgKGUuZy4gYHdpZHRoOjEwMHB4OyBoZWlnaHQ6MjAwcHg7YClcbiAgICAgKi9cbiAgICBTdHlsaW5nQnVpbGRlci5wcm90b3R5cGUucmVnaXN0ZXJTdHlsZUF0dHIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbFN0eWxlVmFsdWVzID0gcGFyc2UodmFsdWUpO1xuICAgICAgICB0aGlzLl9oYXNJbml0aWFsVmFsdWVzID0gdHJ1ZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgZWxlbWVudCdzIHN0YXRpYyBjbGFzcyBzdHJpbmcgdmFsdWUgdG8gdGhlIGJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNsYXNzTmFtZSBzdHJpbmcgKGUuZy4gYGRpc2FibGVkIGdvbGQgem9vbWApXG4gICAgICovXG4gICAgU3R5bGluZ0J1aWxkZXIucHJvdG90eXBlLnJlZ2lzdGVyQ2xhc3NBdHRyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxDbGFzc1ZhbHVlcyA9IHZhbHVlLnRyaW0oKS5zcGxpdCgvXFxzKy9nKTtcbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbFZhbHVlcyA9IHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBlbmRzIGFsbCBzdHlsaW5nLXJlbGF0ZWQgZXhwcmVzc2lvbnMgdG8gdGhlIHByb3ZpZGVkIGF0dHJzIGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGF0dHJzIGFuIGV4aXN0aW5nIGFycmF5IHdoZXJlIGVhY2ggb2YgdGhlIHN0eWxpbmcgZXhwcmVzc2lvbnNcbiAgICAgKiB3aWxsIGJlIGluc2VydGVkIGludG8uXG4gICAgICovXG4gICAgU3R5bGluZ0J1aWxkZXIucHJvdG90eXBlLnBvcHVsYXRlSW5pdGlhbFN0eWxpbmdBdHRycyA9IGZ1bmN0aW9uIChhdHRycykge1xuICAgICAgICAvLyBbQ0xBU1NfTUFSS0VSLCAnZm9vJywgJ2JhcicsICdiYXonIC4uLl1cbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxDbGFzc1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF0dHJzLnB1c2gobGl0ZXJhbCgxIC8qIENsYXNzZXMgKi8pKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faW5pdGlhbENsYXNzVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMucHVzaChsaXRlcmFsKHRoaXMuX2luaXRpYWxDbGFzc1ZhbHVlc1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFtTVFlMRV9NQVJLRVIsICd3aWR0aCcsICcyMDBweCcsICdoZWlnaHQnLCAnMTAwcHgnLCAuLi5dXG4gICAgICAgIGlmICh0aGlzLl9pbml0aWFsU3R5bGVWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhdHRycy5wdXNoKGxpdGVyYWwoMiAvKiBTdHlsZXMgKi8pKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5faW5pdGlhbFN0eWxlVmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgYXR0cnMucHVzaChsaXRlcmFsKHRoaXMuX2luaXRpYWxTdHlsZVZhbHVlc1tpXSksIGxpdGVyYWwodGhpcy5faW5pdGlhbFN0eWxlVmFsdWVzW2kgKyAxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBhbGwgdGhlIGV4cHJlc3Npb25zIGFuZCBwYXJhbWV0ZXJzIGZvciBgZWxlbWVudEhvc3RBdHRyc2AuXG4gICAgICpcbiAgICAgKiBUaGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGlvbiBjb2RlIGJlbG93IGlzIHVzZWQgZm9yIHByb2R1Y2luZyB0aGUgQU9UIHN0YXRlbWVudCBjb2RlIHdoaWNoIGlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIHJlZ2lzdGVyaW5nIGluaXRpYWwgc3R5bGVzICh3aXRoaW4gYSBkaXJlY3RpdmUgaG9zdEJpbmRpbmdzJyBjcmVhdGlvbiBibG9jayksXG4gICAgICogYXMgd2VsbCBhcyBhbnkgb2YgdGhlIHByb3ZpZGVkIGF0dHJpYnV0ZSB2YWx1ZXMsIHRvIHRoZSBkaXJlY3RpdmUgaG9zdCBlbGVtZW50LlxuICAgICAqL1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5idWlsZEhvc3RBdHRyc0luc3RydWN0aW9uID0gZnVuY3Rpb24gKHNvdXJjZVNwYW4sIGF0dHJzLCBjb25zdGFudFBvb2wpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGl2ZUV4cHIgJiYgKGF0dHJzLmxlbmd0aCB8fCB0aGlzLl9oYXNJbml0aWFsVmFsdWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBzb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogSWRlbnRpZmllcnMkMS5lbGVtZW50SG9zdEF0dHJzLFxuICAgICAgICAgICAgICAgIGFsbG9jYXRlQmluZGluZ1Nsb3RzOiAwLFxuICAgICAgICAgICAgICAgIGJ1aWxkUGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtcyA9PiBlbGVtZW50SG9zdEF0dHJzKGFnZXREaXJlY3RpdmVDb250ZXh0KCl0dHJzKVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5wb3B1bGF0ZUluaXRpYWxTdHlsaW5nQXR0cnMoYXR0cnMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ckFycmF5ID0gIWF0dHJzLnNvbWUoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIgaW5zdGFuY2VvZiBXcmFwcGVkTm9kZUV4cHI7IH0pID9cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnN0YW50TGl0ZXJhbEZyb21BcnJheShjb25zdGFudFBvb2wsIGF0dHJzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsQXJyKGF0dHJzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFthdHRyQXJyYXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBCdWlsZHMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBhbGwgdGhlIGV4cHJlc3Npb25zIGFuZCBwYXJhbWV0ZXJzIGZvciBgZWxlbWVudFN0eWxpbmdgLlxuICAgICAqXG4gICAgICogVGhlIGluc3RydWN0aW9uIGdlbmVyYXRpb24gY29kZSBiZWxvdyBpcyB1c2VkIGZvciBwcm9kdWNpbmcgdGhlIEFPVCBzdGF0ZW1lbnQgY29kZSB3aGljaCBpc1xuICAgICAqIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBzdHlsZS9jbGFzcyBiaW5kaW5ncyB0byBhbiBlbGVtZW50LlxuICAgICAqL1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5idWlsZEVsZW1lbnRTdHlsaW5nSW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiAoc291cmNlU3BhbiwgY29uc3RhbnRQb29sKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciByZWZlcmVuY2UgPSB0aGlzLl9kaXJlY3RpdmVFeHByID8gSWRlbnRpZmllcnMkMS5lbGVtZW50SG9zdFN0eWxpbmcgOiBJZGVudGlmaWVycyQxLmVsZW1lbnRTdHlsaW5nO1xuICAgICAgICBpZiAodGhpcy5oYXNCaW5kaW5ncykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBzb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgIGFsbG9jYXRlQmluZGluZ1Nsb3RzOiAwLCByZWZlcmVuY2U6IHJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgICBidWlsZFBhcmFtczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHN0cmluZyBhcnJheSBvZiBldmVyeSBzdHlsZS1iYXNlZCBiaW5kaW5nXG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZUJpbmRpbmdQcm9wcyA9IF90aGlzLl9zaW5nbGVTdHlsZUlucHV0cyA/IF90aGlzLl9zaW5nbGVTdHlsZUlucHV0cy5tYXAoZnVuY3Rpb24gKGkpIHsgcmV0dXJuIGxpdGVyYWwoaS5uYW1lKTsgfSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzdHJpbmcgYXJyYXkgb2YgZXZlcnkgY2xhc3MtYmFzZWQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NCaW5kaW5nTmFtZXMgPSBfdGhpcy5fc2luZ2xlQ2xhc3NJbnB1dHMgPyBfdGhpcy5fc2luZ2xlQ2xhc3NJbnB1dHMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBsaXRlcmFsKGkubmFtZSk7IH0pIDogW107XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIHNhbHZhZ2Ugc3BhY2UgaW4gdGhlIEFPVCBnZW5lcmF0ZWQgY29kZSwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcGFzc2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBpbiBgbnVsbGAgaW50byBhIHBhcmFtIGlmIGFueSBmb2xsb3ctdXAgcGFyYW1zIGFyZSBub3QgdXNlZC4gVGhlcmVmb3JlLFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHdoZW4gYSB0cmFpbGluZyBwYXJhbSBpcyB1c2VkIHRoZW4gaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBudWxscyBpbiBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgIC8vIChvdGhlcndpc2UgYSBzaG9ydGVyIGFtb3VudCBvZiBwYXJhbXMgd2lsbCBiZSBmaWxsZWQpLiBUaGUgY29kZSBiZWxvdyBoZWxwc1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcGFyYW1zIGFyZSByZXF1aXJlZCBpbiB0aGUgZXhwcmVzc2lvbiBjb2RlLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBIT1NUOlxuICAgICAgICAgICAgICAgICAgICAvLyAgIG1pbiBwYXJhbXMgPT4gZWxlbWVudEhvc3RTdHlsaW5nKClcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtYXggcGFyYW1zID0+IGVsZW1lbnRIb3N0U3R5bGluZyhjbGFzc0JpbmRpbmdzLCBzdHlsZUJpbmRpbmdzLCBzYW5pdGl6ZXIpXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIFRlbXBsYXRlOlxuICAgICAgICAgICAgICAgICAgICAvLyAgIG1pbiBwYXJhbXMgPT4gZWxlbWVudFN0eWxpbmcoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgIG1heCBwYXJhbXMgPT4gZWxlbWVudFN0eWxpbmcoY2xhc3NCaW5kaW5ncywgc3R5bGVCaW5kaW5ncywgc2FuaXRpemVyKVxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZE51bWJlck9mQXJncyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fdXNlRGVmYXVsdFNhbml0aXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXJPZkFyZ3MgPSAzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlQmluZGluZ1Byb3BzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXJPZkFyZ3MgPSAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsYXNzQmluZGluZ05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXJPZkFyZ3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKHBhcmFtcywgY2xhc3NCaW5kaW5nTmFtZXMubGVuZ3RoID4gMCwgZ2V0Q29uc3RhbnRMaXRlcmFsRnJvbUFycmF5KGNvbnN0YW50UG9vbCwgY2xhc3NCaW5kaW5nTmFtZXMpLCAxLCBleHBlY3RlZE51bWJlck9mQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKHBhcmFtcywgc3R5bGVCaW5kaW5nUHJvcHMubGVuZ3RoID4gMCwgZ2V0Q29uc3RhbnRMaXRlcmFsRnJvbUFycmF5KGNvbnN0YW50UG9vbCwgc3R5bGVCaW5kaW5nUHJvcHMpLCAyLCBleHBlY3RlZE51bWJlck9mQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKHBhcmFtcywgX3RoaXMuX3VzZURlZmF1bHRTYW5pdGl6ZXIsIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5kZWZhdWx0U3R5bGVTYW5pdGl6ZXIpLCAzLCBleHBlY3RlZE51bWJlck9mQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhbiBpbnN0cnVjdGlvbiB3aXRoIGFsbCB0aGUgZXhwcmVzc2lvbnMgYW5kIHBhcmFtZXRlcnMgZm9yIGBlbGVtZW50U3R5bGluZ01hcGAuXG4gICAgICpcbiAgICAgKiBUaGUgaW5zdHJ1Y3Rpb24gZGF0YSB3aWxsIGNvbnRhaW4gYWxsIGV4cHJlc3Npb25zIGZvciBgZWxlbWVudFN0eWxpbmdNYXBgIHRvIGZ1bmN0aW9uXG4gICAgICogd2hpY2ggaW5jbHVkZSB0aGUgYFtzdHlsZV1gIGFuZCBgW2NsYXNzXWAgZXhwcmVzc2lvbiBwYXJhbXMgKGlmIHRoZXkgZXhpc3QpIGFzIHdlbGwgYXNcbiAgICAgKiB0aGUgc2FuaXRpemVyIGFuZCBkaXJlY3RpdmUgcmVmZXJlbmNlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgU3R5bGluZ0J1aWxkZXIucHJvdG90eXBlLmJ1aWxkRWxlbWVudFN0eWxpbmdNYXBJbnN0cnVjdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZUNvbnZlcnRlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fY2xhc3NNYXBJbnB1dCB8fCB0aGlzLl9zdHlsZU1hcElucHV0KSB7XG4gICAgICAgICAgICB2YXIgc3R5bGluZ0lucHV0ID0gdGhpcy5fY2xhc3NNYXBJbnB1dCB8fCB0aGlzLl9zdHlsZU1hcElucHV0O1xuICAgICAgICAgICAgdmFyIHRvdGFsQmluZGluZ1Nsb3RzUmVxdWlyZWQgPSAwO1xuICAgICAgICAgICAgLy8gdGhlc2UgdmFsdWVzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgdXBkYXRlIGJsb2NrIHNvIHRoYXQgdGhleSBjYW5cbiAgICAgICAgICAgIC8vIGJlIGV2YWx1dGVkICh0aGUgQVNUIHZpc2l0IGNhbGwpIGR1cmluZyBjcmVhdGlvbiB0aW1lIHNvIHRoYXQgYW55XG4gICAgICAgICAgICAvLyBwaXBlcyBjYW4gYmUgcGlja2VkIHVwIGluIHRpbWUgYmVmb3JlIHRoZSB0ZW1wbGF0ZSBpcyBidWlsdFxuICAgICAgICAgICAgdmFyIG1hcEJhc2VkQ2xhc3NWYWx1ZV8xID0gdGhpcy5fY2xhc3NNYXBJbnB1dCA/IHRoaXMuX2NsYXNzTWFwSW5wdXQudmFsdWUudmlzaXQodmFsdWVDb252ZXJ0ZXIpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChtYXBCYXNlZENsYXNzVmFsdWVfMSBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0b3RhbEJpbmRpbmdTbG90c1JlcXVpcmVkICs9IG1hcEJhc2VkQ2xhc3NWYWx1ZV8xLmV4cHJlc3Npb25zLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtYXBCYXNlZFN0eWxlVmFsdWVfMSA9IHRoaXMuX3N0eWxlTWFwSW5wdXQgPyB0aGlzLl9zdHlsZU1hcElucHV0LnZhbHVlLnZpc2l0KHZhbHVlQ29udmVydGVyKSA6IG51bGw7XG4gICAgICAgICAgICBpZiAobWFwQmFzZWRTdHlsZVZhbHVlXzEgaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdG90YWxCaW5kaW5nU2xvdHNSZXF1aXJlZCArPSBtYXBCYXNlZFN0eWxlVmFsdWVfMS5leHByZXNzaW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaXNIb3N0QmluZGluZ18xID0gdGhpcy5fZGlyZWN0aXZlRXhwcjtcbiAgICAgICAgICAgIHZhciByZWZlcmVuY2UgPSBpc0hvc3RCaW5kaW5nXzEgPyBJZGVudGlmaWVycyQxLmVsZW1lbnRIb3N0U3R5bGluZ01hcCA6IElkZW50aWZpZXJzJDEuZWxlbWVudFN0eWxpbmdNYXA7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IHN0eWxpbmdJbnB1dC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgIGFsbG9jYXRlQmluZGluZ1Nsb3RzOiB0b3RhbEJpbmRpbmdTbG90c1JlcXVpcmVkLFxuICAgICAgICAgICAgICAgIGJ1aWxkUGFyYW1zOiBmdW5jdGlvbiAoY29udmVydEZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhPU1Q6XG4gICAgICAgICAgICAgICAgICAgIC8vICAgbWluIHBhcmFtcyA9PiBlbGVtZW50SG9zdFN0eWxpbmdNYXAoY2xhc3NNYXApXG4gICAgICAgICAgICAgICAgICAgIC8vICAgbWF4IHBhcmFtcyA9PiBlbGVtZW50SG9zdFN0eWxpbmdNYXAoY2xhc3NNYXAsIHN0eWxlTWFwKVxuICAgICAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtaW4gcGFyYW1zID0+IGVsZW1lbnRTdHlsaW5nTWFwKGVsbUluZGV4LCBjbGFzc01hcClcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtYXggcGFyYW1zID0+IGVsZW1lbnRTdHlsaW5nTWFwKGVsbUluZGV4LCBjbGFzc01hcCwgc3R5bGVNYXApXG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0hvc3RCaW5kaW5nXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKF90aGlzLl9lbGVtZW50SW5kZXhFeHByKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgZXhwZWN0ZWROdW1iZXJPZkFyZ3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWFwQmFzZWRTdHlsZVZhbHVlXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTnVtYmVyT2ZBcmdzID0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXBCYXNlZENsYXNzVmFsdWVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggYW5kIGNsYXNzID0gMlxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXJPZkFyZ3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKHBhcmFtcywgbWFwQmFzZWRDbGFzc1ZhbHVlXzEsIG1hcEJhc2VkQ2xhc3NWYWx1ZV8xID8gY29udmVydEZuKG1hcEJhc2VkQ2xhc3NWYWx1ZV8xKSA6IG51bGwsIDEsIGV4cGVjdGVkTnVtYmVyT2ZBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0ocGFyYW1zLCBtYXBCYXNlZFN0eWxlVmFsdWVfMSwgbWFwQmFzZWRTdHlsZVZhbHVlXzEgPyBjb252ZXJ0Rm4obWFwQmFzZWRTdHlsZVZhbHVlXzEpIDogbnVsbCwgMiwgZXhwZWN0ZWROdW1iZXJPZkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdHlsaW5nQnVpbGRlci5wcm90b3R5cGUuX2J1aWxkU2luZ2xlSW5wdXRzID0gZnVuY3Rpb24gKHJlZmVyZW5jZSwgaXNIb3N0QmluZGluZywgaW5wdXRzLCBtYXBJbmRleCwgYWxsb3dVbml0cywgdmFsdWVDb252ZXJ0ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHRvdGFsQmluZGluZ1Nsb3RzUmVxdWlyZWQgPSAwO1xuICAgICAgICByZXR1cm4gaW5wdXRzLm1hcChmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBiaW5kaW5nSW5kZXggPSBtYXBJbmRleC5nZXQoaW5wdXQubmFtZSk7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dC52YWx1ZS52aXNpdCh2YWx1ZUNvbnZlcnRlcik7XG4gICAgICAgICAgICB0b3RhbEJpbmRpbmdTbG90c1JlcXVpcmVkICs9ICh2YWx1ZSBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pID8gdmFsdWUuZXhwcmVzc2lvbnMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc291cmNlU3BhbjogaW5wdXQuc291cmNlU3BhbixcbiAgICAgICAgICAgICAgICBhbGxvY2F0ZUJpbmRpbmdTbG90czogdG90YWxCaW5kaW5nU2xvdHNSZXF1aXJlZCwgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgICAgICAgICAgYnVpbGRQYXJhbXM6IGZ1bmN0aW9uIChjb252ZXJ0Rm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSE9TVDpcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtaW4gcGFyYW1zID0+IGVsZW1lbnRIb3N0U3R5bGluZ1Byb3AoYmluZGluZ0luZGV4LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtYXggcGFyYW1zID0+IGVsZW1lbnRIb3N0U3R5bGluZ1Byb3AoYmluZGluZ0luZGV4LCB2YWx1ZSwgb3ZlcnJpZGVGbGFnKVxuICAgICAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtaW4gcGFyYW1zID0+IGVsZW1lbnRTdHlsaW5nUHJvcChlbG1JbmRleCwgYmluZGluZ0luZGV4LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtYXggcGFyYW1zID0+IGVsZW1lbnRTdHlsaW5nUHJvcChlbG1JbmRleCwgYmluZGluZ0luZGV4LCB2YWx1ZSwgb3ZlcnJpZGVGbGFnKVxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNIb3N0QmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goX3RoaXMuX2VsZW1lbnRJbmRleEV4cHIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKGxpdGVyYWwoYmluZGluZ0luZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKGNvbnZlcnRGbih2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dVbml0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChsaXRlcmFsKGlucHV0LnVuaXQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlucHV0Lmhhc092ZXJyaWRlRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKE5VTExfRVhQUik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lmhhc092ZXJyaWRlRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2gobGl0ZXJhbCh0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5fYnVpbGRDbGFzc0lucHV0cyA9IGZ1bmN0aW9uICh2YWx1ZUNvbnZlcnRlcikge1xuICAgICAgICBpZiAodGhpcy5fc2luZ2xlQ2xhc3NJbnB1dHMpIHtcbiAgICAgICAgICAgIHZhciBpc0hvc3RCaW5kaW5nID0gISF0aGlzLl9kaXJlY3RpdmVFeHByO1xuICAgICAgICAgICAgdmFyIHJlZmVyZW5jZSA9IGlzSG9zdEJpbmRpbmcgPyBJZGVudGlmaWVycyQxLmVsZW1lbnRIb3N0Q2xhc3NQcm9wIDogSWRlbnRpZmllcnMkMS5lbGVtZW50Q2xhc3NQcm9wO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkU2luZ2xlSW5wdXRzKHJlZmVyZW5jZSwgaXNIb3N0QmluZGluZywgdGhpcy5fc2luZ2xlQ2xhc3NJbnB1dHMsIHRoaXMuX2NsYXNzZXNJbmRleCwgZmFsc2UsIHZhbHVlQ29udmVydGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBTdHlsaW5nQnVpbGRlci5wcm90b3R5cGUuX2J1aWxkU3R5bGVJbnB1dHMgPSBmdW5jdGlvbiAodmFsdWVDb252ZXJ0ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NpbmdsZVN0eWxlSW5wdXRzKSB7XG4gICAgICAgICAgICB2YXIgaXNIb3N0QmluZGluZyA9ICEhdGhpcy5fZGlyZWN0aXZlRXhwcjtcbiAgICAgICAgICAgIHZhciByZWZlcmVuY2UgPSBpc0hvc3RCaW5kaW5nID8gSWRlbnRpZmllcnMkMS5lbGVtZW50SG9zdFN0eWxlUHJvcCA6IElkZW50aWZpZXJzJDEuZWxlbWVudFN0eWxlUHJvcDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWlsZFNpbmdsZUlucHV0cyhyZWZlcmVuY2UsIGlzSG9zdEJpbmRpbmcsIHRoaXMuX3NpbmdsZVN0eWxlSW5wdXRzLCB0aGlzLl9zdHlsZXNJbmRleCwgdHJ1ZSwgdmFsdWVDb252ZXJ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5fYnVpbGRBcHBseUZuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgaXNIb3N0QmluZGluZyA9IHRoaXMuX2RpcmVjdGl2ZUV4cHI7XG4gICAgICAgIHZhciByZWZlcmVuY2UgPSBpc0hvc3RCaW5kaW5nID8gSWRlbnRpZmllcnMkMS5lbGVtZW50SG9zdFN0eWxpbmdBcHBseSA6IElkZW50aWZpZXJzJDEuZWxlbWVudFN0eWxpbmdBcHBseTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IHRoaXMuX2xhc3RTdHlsaW5nSW5wdXQgPyB0aGlzLl9sYXN0U3R5bGluZ0lucHV0LnNvdXJjZVNwYW4gOiBudWxsLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgICAgICBhbGxvY2F0ZUJpbmRpbmdTbG90czogMCxcbiAgICAgICAgICAgIGJ1aWxkUGFyYW1zOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gSE9TVDpcbiAgICAgICAgICAgICAgICAvLyAgIHBhcmFtcyA9PiBlbGVtZW50SG9zdFN0eWxpbmdBcHBseSgpXG4gICAgICAgICAgICAgICAgLy8gVGVtcGxhdGU6XG4gICAgICAgICAgICAgICAgLy8gICBwYXJhbXMgPT4gZWxlbWVudFN0eWxpbmdBcHBseShlbG1JbmRleClcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIb3N0QmluZGluZyA/IFtdIDogW190aGlzLl9lbGVtZW50SW5kZXhFeHByXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYWxsIGluc3RydWN0aW9ucyB3aGljaCBjb250YWluIHRoZSBleHByZXNzaW9ucyB0aGF0IHdpbGwgYmUgcGxhY2VkXG4gICAgICogaW50byB0aGUgdXBkYXRlIGJsb2NrIG9mIGEgdGVtcGxhdGUgZnVuY3Rpb24gb3IgYSBkaXJlY3RpdmUgaG9zdEJpbmRpbmdzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIFN0eWxpbmdCdWlsZGVyLnByb3RvdHlwZS5idWlsZFVwZGF0ZUxldmVsSW5zdHJ1Y3Rpb25zID0gZnVuY3Rpb24gKHZhbHVlQ29udmVydGVyKSB7XG4gICAgICAgIHZhciBpbnN0cnVjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQmluZGluZ3MpIHtcbiAgICAgICAgICAgIHZhciBtYXBJbnN0cnVjdGlvbiA9IHRoaXMuYnVpbGRFbGVtZW50U3R5bGluZ01hcEluc3RydWN0aW9uKHZhbHVlQ29udmVydGVyKTtcbiAgICAgICAgICAgIGlmIChtYXBJbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKG1hcEluc3RydWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoLmFwcGx5KGluc3RydWN0aW9ucywgX19zcHJlYWQodGhpcy5fYnVpbGRTdHlsZUlucHV0cyh2YWx1ZUNvbnZlcnRlcikpKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoLmFwcGx5KGluc3RydWN0aW9ucywgX19zcHJlYWQodGhpcy5fYnVpbGRDbGFzc0lucHV0cyh2YWx1ZUNvbnZlcnRlcikpKTtcbiAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKHRoaXMuX2J1aWxkQXBwbHlGbigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICAgIH07XG4gICAgcmV0dXJuIFN0eWxpbmdCdWlsZGVyO1xufSgpKTtcbmZ1bmN0aW9uIHJlZ2lzdGVySW50b01hcChtYXAsIGtleSkge1xuICAgIGlmICghbWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIG1hcC5zZXQoa2V5LCBtYXAuc2l6ZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNTdHlsZVNhbml0aXphYmxlKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcCA9PT0gJ2JhY2tncm91bmQtaW1hZ2UnIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kJyB8fCBwcm9wID09PSAnYm9yZGVyLWltYWdlJyB8fFxuICAgICAgICBwcm9wID09PSAnZmlsdGVyJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZScgfHwgcHJvcCA9PT0gJ2xpc3Qtc3R5bGUtaW1hZ2UnO1xufVxuLyoqXG4gKiBTaW1wbGUgaGVscGVyIGZ1bmN0aW9uIHRvIGVpdGhlciBwcm92aWRlIHRoZSBjb25zdGFudCBsaXRlcmFsIHRoYXQgd2lsbCBob3VzZSB0aGUgdmFsdWVcbiAqIGhlcmUgb3IgYSBudWxsIHZhbHVlIGlmIHRoZSBwcm92aWRlZCB2YWx1ZXMgYXJlIGVtcHR5LlxuICovXG5mdW5jdGlvbiBnZXRDb25zdGFudExpdGVyYWxGcm9tQXJyYXkoY29uc3RhbnRQb29sLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IGNvbnN0YW50UG9vbC5nZXRDb25zdExpdGVyYWwobGl0ZXJhbEFycih2YWx1ZXMpLCB0cnVlKSA6IE5VTExfRVhQUjtcbn1cbi8qKlxuICogU2ltcGxlIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFkZHMgYSBwYXJhbWV0ZXIgb3IgZG9lcyBub3RoaW5nIGF0IGFsbCBkZXBlbmRpbmcgb24gdGhlIHByb3ZpZGVkXG4gKiBwcmVkaWNhdGUgYW5kIHRvdGFsRXhwZWN0ZWRBcmdzIHZhbHVlc1xuICovXG5mdW5jdGlvbiBhZGRQYXJhbShwYXJhbXMsIHByZWRpY2F0ZSwgdmFsdWUsIGFyZ051bWJlciwgdG90YWxFeHBlY3RlZEFyZ3MpIHtcbiAgICBpZiAocHJlZGljYXRlICYmIHZhbHVlKSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJnTnVtYmVyIDwgdG90YWxFeHBlY3RlZEFyZ3MpIHtcbiAgICAgICAgcGFyYW1zLnB1c2goTlVMTF9FWFBSKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVByb3BlcnR5KG5hbWUpIHtcbiAgICB2YXIgaGFzT3ZlcnJpZGVGbGFnID0gZmFsc2U7XG4gICAgdmFyIG92ZXJyaWRlSW5kZXggPSBuYW1lLmluZGV4T2YoSU1QT1JUQU5UX0ZMQUcpO1xuICAgIGlmIChvdmVycmlkZUluZGV4ICE9PSAtMSkge1xuICAgICAgICBuYW1lID0gb3ZlcnJpZGVJbmRleCA+IDAgPyBuYW1lLnN1YnN0cmluZygwLCBvdmVycmlkZUluZGV4KSA6ICcnO1xuICAgICAgICBoYXNPdmVycmlkZUZsYWcgPSB0cnVlO1xuICAgIH1cbiAgICB2YXIgdW5pdCA9ICcnO1xuICAgIHZhciBwcm9wZXJ0eSA9IG5hbWU7XG4gICAgdmFyIHVuaXRJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgICBpZiAodW5pdEluZGV4ID4gMCkge1xuICAgICAgICB1bml0ID0gbmFtZS5zdWJzdHIodW5pdEluZGV4ICsgMSk7XG4gICAgICAgIHByb3BlcnR5ID0gbmFtZS5zdWJzdHJpbmcoMCwgdW5pdEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJvcGVydHk6IHByb3BlcnR5LCB1bml0OiB1bml0LCBoYXNPdmVycmlkZUZsYWc6IGhhc092ZXJyaWRlRmxhZyB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVG9rZW5UeXBlJDE7XG4oZnVuY3Rpb24gKFRva2VuVHlwZSkge1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJDaGFyYWN0ZXJcIl0gPSAwXSA9IFwiQ2hhcmFjdGVyXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIklkZW50aWZpZXJcIl0gPSAxXSA9IFwiSWRlbnRpZmllclwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJLZXl3b3JkXCJdID0gMl0gPSBcIktleXdvcmRcIjtcbiAgICBUb2tlblR5cGVbVG9rZW5UeXBlW1wiU3RyaW5nXCJdID0gM10gPSBcIlN0cmluZ1wiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJPcGVyYXRvclwiXSA9IDRdID0gXCJPcGVyYXRvclwiO1xuICAgIFRva2VuVHlwZVtUb2tlblR5cGVbXCJOdW1iZXJcIl0gPSA1XSA9IFwiTnVtYmVyXCI7XG4gICAgVG9rZW5UeXBlW1Rva2VuVHlwZVtcIkVycm9yXCJdID0gNl0gPSBcIkVycm9yXCI7XG59KShUb2tlblR5cGUkMSB8fCAoVG9rZW5UeXBlJDEgPSB7fSkpO1xudmFyIEtFWVdPUkRTID0gWyd2YXInLCAnbGV0JywgJ2FzJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ3RydWUnLCAnZmFsc2UnLCAnaWYnLCAnZWxzZScsICd0aGlzJ107XG52YXIgTGV4ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGV4ZXIoKSB7XG4gICAgfVxuICAgIExleGVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHZhciBzY2FubmVyID0gbmV3IF9TY2FubmVyKHRleHQpO1xuICAgICAgICB2YXIgdG9rZW5zID0gW107XG4gICAgICAgIHZhciB0b2tlbiA9IHNjYW5uZXIuc2NhblRva2VuKCk7XG4gICAgICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB0b2tlbiA9IHNjYW5uZXIuc2NhblRva2VuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9O1xuICAgIHJldHVybiBMZXhlcjtcbn0oKSk7XG52YXIgVG9rZW4kMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb2tlbihpbmRleCwgdHlwZSwgbnVtVmFsdWUsIHN0clZhbHVlKSB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5udW1WYWx1ZSA9IG51bVZhbHVlO1xuICAgICAgICB0aGlzLnN0clZhbHVlID0gc3RyVmFsdWU7XG4gICAgfVxuICAgIFRva2VuLnByb3RvdHlwZS5pc0NoYXJhY3RlciA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuQ2hhcmFjdGVyICYmIHRoaXMubnVtVmFsdWUgPT0gY29kZTtcbiAgICB9O1xuICAgIFRva2VuLnByb3RvdHlwZS5pc051bWJlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUkMS5OdW1iZXI7IH07XG4gICAgVG9rZW4ucHJvdG90eXBlLmlzU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZSQxLlN0cmluZzsgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUuaXNPcGVyYXRvciA9IGZ1bmN0aW9uIChvcGVyYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZSQxLk9wZXJhdG9yICYmIHRoaXMuc3RyVmFsdWUgPT0gb3BlcmF0b3I7XG4gICAgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUuaXNJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50eXBlID09IFRva2VuVHlwZSQxLklkZW50aWZpZXI7IH07XG4gICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUkMS5LZXl3b3JkOyB9O1xuICAgIFRva2VuLnByb3RvdHlwZS5pc0tleXdvcmRMZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICdsZXQnOyB9O1xuICAgIFRva2VuLnByb3RvdHlwZS5pc0tleXdvcmRBcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUkMS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gJ2FzJzsgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUuaXNLZXl3b3JkTnVsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUkMS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gJ251bGwnOyB9O1xuICAgIFRva2VuLnByb3RvdHlwZS5pc0tleXdvcmRVbmRlZmluZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICd1bmRlZmluZWQnO1xuICAgIH07XG4gICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZFRydWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICd0cnVlJzsgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUuaXNLZXl3b3JkRmFsc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICdmYWxzZSc7IH07XG4gICAgVG9rZW4ucHJvdG90eXBlLmlzS2V5d29yZFRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09ICd0aGlzJzsgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUuaXNFcnJvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMudHlwZSA9PSBUb2tlblR5cGUkMS5FcnJvcjsgfTtcbiAgICBUb2tlbi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnR5cGUgPT0gVG9rZW5UeXBlJDEuTnVtYmVyID8gdGhpcy5udW1WYWx1ZSA6IC0xOyB9O1xuICAgIFRva2VuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlJDEuQ2hhcmFjdGVyOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUkMS5JZGVudGlmaWVyOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUkMS5LZXl3b3JkOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUkMS5PcGVyYXRvcjpcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlJDEuU3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUkMS5FcnJvcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJWYWx1ZTtcbiAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlJDEuTnVtYmVyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm51bVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVG9rZW47XG59KCkpO1xuZnVuY3Rpb24gbmV3Q2hhcmFjdGVyVG9rZW4oaW5kZXgsIGNvZGUpIHtcbiAgICByZXR1cm4gbmV3IFRva2VuJDEoaW5kZXgsIFRva2VuVHlwZSQxLkNoYXJhY3RlciwgY29kZSwgU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7XG59XG5mdW5jdGlvbiBuZXdJZGVudGlmaWVyVG9rZW4oaW5kZXgsIHRleHQpIHtcbiAgICByZXR1cm4gbmV3IFRva2VuJDEoaW5kZXgsIFRva2VuVHlwZSQxLklkZW50aWZpZXIsIDAsIHRleHQpO1xufVxuZnVuY3Rpb24gbmV3S2V5d29yZFRva2VuKGluZGV4LCB0ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlbiQxKGluZGV4LCBUb2tlblR5cGUkMS5LZXl3b3JkLCAwLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIG5ld09wZXJhdG9yVG9rZW4oaW5kZXgsIHRleHQpIHtcbiAgICByZXR1cm4gbmV3IFRva2VuJDEoaW5kZXgsIFRva2VuVHlwZSQxLk9wZXJhdG9yLCAwLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIG5ld1N0cmluZ1Rva2VuKGluZGV4LCB0ZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlbiQxKGluZGV4LCBUb2tlblR5cGUkMS5TdHJpbmcsIDAsIHRleHQpO1xufVxuZnVuY3Rpb24gbmV3TnVtYmVyVG9rZW4oaW5kZXgsIG4pIHtcbiAgICByZXR1cm4gbmV3IFRva2VuJDEoaW5kZXgsIFRva2VuVHlwZSQxLk51bWJlciwgbiwgJycpO1xufVxuZnVuY3Rpb24gbmV3RXJyb3JUb2tlbihpbmRleCwgbWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgVG9rZW4kMShpbmRleCwgVG9rZW5UeXBlJDEuRXJyb3IsIDAsIG1lc3NhZ2UpO1xufVxudmFyIEVPRiA9IG5ldyBUb2tlbiQxKC0xLCBUb2tlblR5cGUkMS5DaGFyYWN0ZXIsIDAsICcnKTtcbnZhciBfU2Nhbm5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfU2Nhbm5lcihpbnB1dCkge1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMucGVlayA9IDA7XG4gICAgICAgIHRoaXMuaW5kZXggPSAtMTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICBfU2Nhbm5lci5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wZWVrID0gKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoID8gJEVPRiA6IHRoaXMuaW5wdXQuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcbiAgICB9O1xuICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuVG9rZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQsIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB2YXIgcGVlayA9IHRoaXMucGVlaywgaW5kZXggPSB0aGlzLmluZGV4O1xuICAgICAgICAvLyBTa2lwIHdoaXRlc3BhY2UuXG4gICAgICAgIHdoaWxlIChwZWVrIDw9ICRTUEFDRSkge1xuICAgICAgICAgICAgaWYgKCsraW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcGVlayA9ICRFT0Y7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWVrID0gaW5wdXQuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZWVrID0gcGVlaztcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgaWRlbnRpZmllcnMgYW5kIG51bWJlcnMuXG4gICAgICAgIGlmIChpc0lkZW50aWZpZXJTdGFydChwZWVrKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5JZGVudGlmaWVyKCk7XG4gICAgICAgIGlmIChpc0RpZ2l0KHBlZWspKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbk51bWJlcihpbmRleCk7XG4gICAgICAgIHZhciBzdGFydCA9IGluZGV4O1xuICAgICAgICBzd2l0Y2ggKHBlZWspIHtcbiAgICAgICAgICAgIGNhc2UgJFBFUklPRDpcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNEaWdpdCh0aGlzLnBlZWspID8gdGhpcy5zY2FuTnVtYmVyKHN0YXJ0KSA6XG4gICAgICAgICAgICAgICAgICAgIG5ld0NoYXJhY3RlclRva2VuKHN0YXJ0LCAkUEVSSU9EKTtcbiAgICAgICAgICAgIGNhc2UgJExQQVJFTjpcbiAgICAgICAgICAgIGNhc2UgJFJQQVJFTjpcbiAgICAgICAgICAgIGNhc2UgJExCUkFDRTpcbiAgICAgICAgICAgIGNhc2UgJFJCUkFDRTpcbiAgICAgICAgICAgIGNhc2UgJExCUkFDS0VUOlxuICAgICAgICAgICAgY2FzZSAkUkJSQUNLRVQ6XG4gICAgICAgICAgICBjYXNlICRDT01NQTpcbiAgICAgICAgICAgIGNhc2UgJENPTE9OOlxuICAgICAgICAgICAgY2FzZSAkU0VNSUNPTE9OOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5DaGFyYWN0ZXIoc3RhcnQsIHBlZWspO1xuICAgICAgICAgICAgY2FzZSAkU1E6XG4gICAgICAgICAgICBjYXNlICREUTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuU3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlICRIQVNIOlxuICAgICAgICAgICAgY2FzZSAkUExVUzpcbiAgICAgICAgICAgIGNhc2UgJE1JTlVTOlxuICAgICAgICAgICAgY2FzZSAkU1RBUjpcbiAgICAgICAgICAgIGNhc2UgJFNMQVNIOlxuICAgICAgICAgICAgY2FzZSAkUEVSQ0VOVDpcbiAgICAgICAgICAgIGNhc2UgJENBUkVUOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5PcGVyYXRvcihzdGFydCwgU3RyaW5nLmZyb21DaGFyQ29kZShwZWVrKSk7XG4gICAgICAgICAgICBjYXNlICRRVUVTVElPTjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAnPycsICRQRVJJT0QsICcuJyk7XG4gICAgICAgICAgICBjYXNlICRMVDpcbiAgICAgICAgICAgIGNhc2UgJEdUOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZy5mcm9tQ2hhckNvZGUocGVlayksICRFUSwgJz0nKTtcbiAgICAgICAgICAgIGNhc2UgJEJBTkc6XG4gICAgICAgICAgICBjYXNlICRFUTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCBTdHJpbmcuZnJvbUNoYXJDb2RlKHBlZWspLCAkRVEsICc9JywgJEVRLCAnPScpO1xuICAgICAgICAgICAgY2FzZSAkQU1QRVJTQU5EOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICcmJywgJEFNUEVSU0FORCwgJyYnKTtcbiAgICAgICAgICAgIGNhc2UgJEJBUjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0LCAnfCcsICRCQVIsICd8Jyk7XG4gICAgICAgICAgICBjYXNlICROQlNQOlxuICAgICAgICAgICAgICAgIHdoaWxlIChpc1doaXRlc3BhY2UodGhpcy5wZWVrKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiVW5leHBlY3RlZCBjaGFyYWN0ZXIgW1wiICsgU3RyaW5nLmZyb21DaGFyQ29kZShwZWVrKSArIFwiXVwiLCAwKTtcbiAgICB9O1xuICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuQ2hhcmFjdGVyID0gZnVuY3Rpb24gKHN0YXJ0LCBjb2RlKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICByZXR1cm4gbmV3Q2hhcmFjdGVyVG9rZW4oc3RhcnQsIGNvZGUpO1xuICAgIH07XG4gICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5PcGVyYXRvciA9IGZ1bmN0aW9uIChzdGFydCwgc3RyKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICByZXR1cm4gbmV3T3BlcmF0b3JUb2tlbihzdGFydCwgc3RyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRva2VuaXplIGEgMi8zIGNoYXIgbG9uZyBvcGVyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IGluZGV4IGluIHRoZSBleHByZXNzaW9uXG4gICAgICogQHBhcmFtIG9uZSBmaXJzdCBzeW1ib2wgKGFsd2F5cyBwYXJ0IG9mIHRoZSBvcGVyYXRvcilcbiAgICAgKiBAcGFyYW0gdHdvQ29kZSBjb2RlIHBvaW50IGZvciB0aGUgc2Vjb25kIHN5bWJvbFxuICAgICAqIEBwYXJhbSB0d28gc2Vjb25kIHN5bWJvbCAocGFydCBvZiB0aGUgb3BlcmF0b3Igd2hlbiB0aGUgc2Vjb25kIGNvZGUgcG9pbnQgbWF0Y2hlcylcbiAgICAgKiBAcGFyYW0gdGhyZWVDb2RlIGNvZGUgcG9pbnQgZm9yIHRoZSB0aGlyZCBzeW1ib2xcbiAgICAgKiBAcGFyYW0gdGhyZWUgdGhpcmQgc3ltYm9sIChwYXJ0IG9mIHRoZSBvcGVyYXRvciB3aGVuIHByb3ZpZGVkIGFuZCBtYXRjaGVzIHNvdXJjZSBleHByZXNzaW9uKVxuICAgICAqL1xuICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuQ29tcGxleE9wZXJhdG9yID0gZnVuY3Rpb24gKHN0YXJ0LCBvbmUsIHR3b0NvZGUsIHR3bywgdGhyZWVDb2RlLCB0aHJlZSkge1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgdmFyIHN0ciA9IG9uZTtcbiAgICAgICAgaWYgKHRoaXMucGVlayA9PSB0d29Db2RlKSB7XG4gICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHN0ciArPSB0d287XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRocmVlQ29kZSAhPSBudWxsICYmIHRoaXMucGVlayA9PSB0aHJlZUNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgc3RyICs9IHRocmVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdPcGVyYXRvclRva2VuKHN0YXJ0LCBzdHIpO1xuICAgIH07XG4gICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5JZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSlcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgICByZXR1cm4gS0VZV09SRFMuaW5kZXhPZihzdHIpID4gLTEgPyBuZXdLZXl3b3JkVG9rZW4oc3RhcnQsIHN0cikgOlxuICAgICAgICAgICAgbmV3SWRlbnRpZmllclRva2VuKHN0YXJ0LCBzdHIpO1xuICAgIH07XG4gICAgX1NjYW5uZXIucHJvdG90eXBlLnNjYW5OdW1iZXIgPSBmdW5jdGlvbiAoc3RhcnQpIHtcbiAgICAgICAgdmFyIHNpbXBsZSA9ICh0aGlzLmluZGV4ID09PSBzdGFydCk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBTa2lwIGluaXRpYWwgZGlnaXQuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoaXNEaWdpdCh0aGlzLnBlZWspKSA7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBlZWsgPT0gJFBFUklPRCkge1xuICAgICAgICAgICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFeHBvbmVudFN0YXJ0KHRoaXMucGVlaykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFeHBvbmVudFNpZ24odGhpcy5wZWVrKSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KHRoaXMucGVlaykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdJbnZhbGlkIGV4cG9uZW50JywgLTEpO1xuICAgICAgICAgICAgICAgIHNpbXBsZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgICB2YXIgdmFsdWUgPSBzaW1wbGUgPyBwYXJzZUludEF1dG9SYWRpeChzdHIpIDogcGFyc2VGbG9hdChzdHIpO1xuICAgICAgICByZXR1cm4gbmV3TnVtYmVyVG9rZW4oc3RhcnQsIHZhbHVlKTtcbiAgICB9O1xuICAgIF9TY2FubmVyLnByb3RvdHlwZS5zY2FuU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLnBlZWs7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBTa2lwIGluaXRpYWwgcXVvdGUuXG4gICAgICAgIHZhciBidWZmZXIgPSAnJztcbiAgICAgICAgdmFyIG1hcmtlciA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQ7XG4gICAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT0gcXVvdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBlZWsgPT0gJEJBQ0tTTEFTSCkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkQ29kZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBUUzIuMS1pbnRyb2R1Y2VkIHR5cGUgc3RyaWN0bmVzc1xuICAgICAgICAgICAgICAgIHRoaXMucGVlayA9IHRoaXMucGVlaztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZWVrID09ICR1KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDQgY2hhcmFjdGVyIGhleCBjb2RlIGZvciB1bmljb2RlIGNoYXJhY3Rlci5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGhleCA9IGlucHV0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL15bMC05YS1mXSskL2kudGVzdChoZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRDb2RlID0gcGFyc2VJbnQoaGV4LCAxNik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihcIkludmFsaWQgdW5pY29kZSBlc2NhcGUgW1xcXFx1XCIgKyBoZXggKyBcIl1cIiwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZWRDb2RlID0gdW5lc2NhcGUodGhpcy5wZWVrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuZXNjYXBlZENvZGUpO1xuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMuaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBlZWsgPT0gJEVPRikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBsYXN0ID0gaW5wdXQuc3Vic3RyaW5nKG1hcmtlciwgdGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBTa2lwIHRlcm1pbmF0aW5nIHF1b3RlLlxuICAgICAgICByZXR1cm4gbmV3U3RyaW5nVG9rZW4oc3RhcnQsIGJ1ZmZlciArIGxhc3QpO1xuICAgIH07XG4gICAgX1NjYW5uZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIG9mZnNldCkge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLmluZGV4ICsgb2Zmc2V0O1xuICAgICAgICByZXR1cm4gbmV3RXJyb3JUb2tlbihwb3NpdGlvbiwgXCJMZXhlciBFcnJvcjogXCIgKyBtZXNzYWdlICsgXCIgYXQgY29sdW1uIFwiICsgcG9zaXRpb24gKyBcIiBpbiBleHByZXNzaW9uIFtcIiArIHRoaXMuaW5wdXQgKyBcIl1cIik7XG4gICAgfTtcbiAgICByZXR1cm4gX1NjYW5uZXI7XG59KCkpO1xuZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZSkge1xuICAgIHJldHVybiAoJGEgPD0gY29kZSAmJiBjb2RlIDw9ICR6KSB8fCAoJEEgPD0gY29kZSAmJiBjb2RlIDw9ICRaKSB8fFxuICAgICAgICAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xufVxuZnVuY3Rpb24gaXNJZGVudGlmaWVyKGlucHV0KSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNjYW5uZXIgPSBuZXcgX1NjYW5uZXIoaW5wdXQpO1xuICAgIGlmICghaXNJZGVudGlmaWVyU3RhcnQoc2Nhbm5lci5wZWVrKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHNjYW5uZXIuYWR2YW5jZSgpO1xuICAgIHdoaWxlIChzY2FubmVyLnBlZWsgIT09ICRFT0YpIHtcbiAgICAgICAgaWYgKCFpc0lkZW50aWZpZXJQYXJ0KHNjYW5uZXIucGVlaykpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHNjYW5uZXIuYWR2YW5jZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnQoY29kZSkge1xuICAgIHJldHVybiBpc0FzY2lpTGV0dGVyKGNvZGUpIHx8IGlzRGlnaXQoY29kZSkgfHwgKGNvZGUgPT0gJF8pIHx8XG4gICAgICAgIChjb2RlID09ICQkKTtcbn1cbmZ1bmN0aW9uIGlzRXhwb25lbnRTdGFydChjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT0gJGUgfHwgY29kZSA9PSAkRTtcbn1cbmZ1bmN0aW9uIGlzRXhwb25lbnRTaWduKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA9PSAkTUlOVVMgfHwgY29kZSA9PSAkUExVUztcbn1cbmZ1bmN0aW9uIGlzUXVvdGUoY29kZSkge1xuICAgIHJldHVybiBjb2RlID09PSAkU1EgfHwgY29kZSA9PT0gJERRIHx8IGNvZGUgPT09ICRCVDtcbn1cbmZ1bmN0aW9uIHVuZXNjYXBlKGNvZGUpIHtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAkbjpcbiAgICAgICAgICAgIHJldHVybiAkTEY7XG4gICAgICAgIGNhc2UgJGY6XG4gICAgICAgICAgICByZXR1cm4gJEZGO1xuICAgICAgICBjYXNlICRyOlxuICAgICAgICAgICAgcmV0dXJuICRDUjtcbiAgICAgICAgY2FzZSAkdDpcbiAgICAgICAgICAgIHJldHVybiAkVEFCO1xuICAgICAgICBjYXNlICR2OlxuICAgICAgICAgICAgcmV0dXJuICRWVEFCO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VJbnRBdXRvUmFkaXgodGV4dCkge1xuICAgIHZhciByZXN1bHQgPSBwYXJzZUludCh0ZXh0KTtcbiAgICBpZiAoaXNOYU4ocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyAnICsgdGV4dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBTcGxpdEludGVycG9sYXRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3BsaXRJbnRlcnBvbGF0aW9uKHN0cmluZ3MsIGV4cHJlc3Npb25zLCBvZmZzZXRzKSB7XG4gICAgICAgIHRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gb2Zmc2V0cztcbiAgICB9XG4gICAgcmV0dXJuIFNwbGl0SW50ZXJwb2xhdGlvbjtcbn0oKSk7XG52YXIgVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQodGVtcGxhdGVCaW5kaW5ncywgd2FybmluZ3MsIGVycm9ycykge1xuICAgICAgICB0aGlzLnRlbXBsYXRlQmluZGluZ3MgPSB0ZW1wbGF0ZUJpbmRpbmdzO1xuICAgICAgICB0aGlzLndhcm5pbmdzID0gd2FybmluZ3M7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICByZXR1cm4gVGVtcGxhdGVCaW5kaW5nUGFyc2VSZXN1bHQ7XG59KCkpO1xuZnVuY3Rpb24gX2NyZWF0ZUludGVycG9sYXRlUmVnRXhwKGNvbmZpZykge1xuICAgIHZhciBwYXR0ZXJuID0gZXNjYXBlUmVnRXhwKGNvbmZpZy5zdGFydCkgKyAnKFtcXFxcc1xcXFxTXSo/KScgKyBlc2NhcGVSZWdFeHAoY29uZmlnLmVuZCk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbn1cbnZhciBQYXJzZXIkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQYXJzZXIoX2xleGVyKSB7XG4gICAgICAgIHRoaXMuX2xleGVyID0gX2xleGVyO1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQWN0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgICAgIHRoaXMuX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgIHZhciBzb3VyY2VUb0xleCA9IHRoaXMuX3N0cmlwQ29tbWVudHMoaW5wdXQpO1xuICAgICAgICB2YXIgdG9rZW5zID0gdGhpcy5fbGV4ZXIudG9rZW5pemUodGhpcy5fc3RyaXBDb21tZW50cyhpbnB1dCkpO1xuICAgICAgICB2YXIgYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2Vucywgc291cmNlVG9MZXgubGVuZ3RoLCB0cnVlLCB0aGlzLmVycm9ycywgaW5wdXQubGVuZ3RoIC0gc291cmNlVG9MZXgubGVuZ3RoKVxuICAgICAgICAgICAgLnBhcnNlQ2hhaW4oKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKGFzdCwgaW5wdXQsIGxvY2F0aW9uLCB0aGlzLmVycm9ycyk7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZyA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb25Db25maWcgPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRzsgfVxuICAgICAgICB2YXIgYXN0ID0gdGhpcy5fcGFyc2VCaW5kaW5nQXN0KGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbiwgdGhpcy5lcnJvcnMpO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNpbXBsZUJpbmRpbmcgPSBmdW5jdGlvbiAoaW5wdXQsIGxvY2F0aW9uLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgdmFyIGFzdCA9IHRoaXMuX3BhcnNlQmluZGluZ0FzdChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICB2YXIgZXJyb3JzID0gU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2soYXN0KTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcIkhvc3QgYmluZGluZyBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIFwiICsgZXJyb3JzLmpvaW4oJyAnKSwgaW5wdXQsIGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFTVFdpdGhTb3VyY2UoYXN0LCBpbnB1dCwgbG9jYXRpb24sIHRoaXMuZXJyb3JzKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuX3JlcG9ydEVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGlucHV0LCBlcnJMb2NhdGlvbiwgY3R4TG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2VyRXJyb3IobWVzc2FnZSwgaW5wdXQsIGVyckxvY2F0aW9uLCBjdHhMb2NhdGlvbikpO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5fcGFyc2VCaW5kaW5nQXN0ID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICAvLyBRdW90ZXMgZXhwcmVzc2lvbnMgdXNlIDNyZC1wYXJ0eSBleHByZXNzaW9uIGxhbmd1YWdlLiBXZSBkb24ndCB3YW50IHRvIHVzZVxuICAgICAgICAvLyBvdXIgbGV4ZXIgb3IgcGFyc2VyIGZvciB0aGF0LCBzbyB3ZSBjaGVjayBmb3IgdGhhdCBhaGVhZCBvZiB0aW1lLlxuICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLl9wYXJzZVF1b3RlKGlucHV0LCBsb2NhdGlvbik7XG4gICAgICAgIGlmIChxdW90ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVvdGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hlY2tOb0ludGVycG9sYXRpb24oaW5wdXQsIGxvY2F0aW9uLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgdmFyIHNvdXJjZVRvTGV4ID0gdGhpcy5fc3RyaXBDb21tZW50cyhpbnB1dCk7XG4gICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLl9sZXhlci50b2tlbml6ZShzb3VyY2VUb0xleCk7XG4gICAgICAgIHJldHVybiBuZXcgX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCBzb3VyY2VUb0xleC5sZW5ndGgsIGZhbHNlLCB0aGlzLmVycm9ycywgaW5wdXQubGVuZ3RoIC0gc291cmNlVG9MZXgubGVuZ3RoKVxuICAgICAgICAgICAgLnBhcnNlQ2hhaW4oKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuX3BhcnNlUXVvdGUgPSBmdW5jdGlvbiAoaW5wdXQsIGxvY2F0aW9uKSB7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBwcmVmaXhTZXBhcmF0b3JJbmRleCA9IGlucHV0LmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHByZWZpeFNlcGFyYXRvckluZGV4ID09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBwcmVmaXggPSBpbnB1dC5zdWJzdHJpbmcoMCwgcHJlZml4U2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFpc0lkZW50aWZpZXIocHJlZml4KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgdW5pbnRlcnByZXRlZEV4cHJlc3Npb24gPSBpbnB1dC5zdWJzdHJpbmcocHJlZml4U2VwYXJhdG9ySW5kZXggKyAxKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdW90ZShuZXcgUGFyc2VTcGFuKDAsIGlucHV0Lmxlbmd0aCksIHByZWZpeCwgdW5pbnRlcnByZXRlZEV4cHJlc3Npb24sIGxvY2F0aW9uKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUJpbmRpbmdzID0gZnVuY3Rpb24gKHRwbEtleSwgdHBsVmFsdWUsIGxvY2F0aW9uKSB7XG4gICAgICAgIHZhciB0b2tlbnMgPSB0aGlzLl9sZXhlci50b2tlbml6ZSh0cGxWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgX1BhcnNlQVNUKHRwbFZhbHVlLCBsb2NhdGlvbiwgdG9rZW5zLCB0cGxWYWx1ZS5sZW5ndGgsIGZhbHNlLCB0aGlzLmVycm9ycywgMClcbiAgICAgICAgICAgIC5wYXJzZVRlbXBsYXRlQmluZGluZ3ModHBsS2V5KTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgICAgIHZhciBzcGxpdCA9IHRoaXMuc3BsaXRJbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbiwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgIGlmIChzcGxpdCA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwbGl0LmV4cHJlc3Npb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB2YXIgZXhwcmVzc2lvblRleHQgPSBzcGxpdC5leHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBzb3VyY2VUb0xleCA9IHRoaXMuX3N0cmlwQ29tbWVudHMoZXhwcmVzc2lvblRleHQpO1xuICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKHNvdXJjZVRvTGV4KTtcbiAgICAgICAgICAgIHZhciBhc3QgPSBuZXcgX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCBzb3VyY2VUb0xleC5sZW5ndGgsIGZhbHNlLCB0aGlzLmVycm9ycywgc3BsaXQub2Zmc2V0c1tpXSArIChleHByZXNzaW9uVGV4dC5sZW5ndGggLSBzb3VyY2VUb0xleC5sZW5ndGgpKVxuICAgICAgICAgICAgICAgIC5wYXJzZUNoYWluKCk7XG4gICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKGFzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKG5ldyBJbnRlcnBvbGF0aW9uKG5ldyBQYXJzZVNwYW4oMCwgaW5wdXQgPT0gbnVsbCA/IDAgOiBpbnB1dC5sZW5ndGgpLCBzcGxpdC5zdHJpbmdzLCBleHByZXNzaW9ucyksIGlucHV0LCBsb2NhdGlvbiwgdGhpcy5lcnJvcnMpO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zcGxpdEludGVycG9sYXRpb24gPSBmdW5jdGlvbiAoaW5wdXQsIGxvY2F0aW9uLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIGlmIChpbnRlcnBvbGF0aW9uQ29uZmlnID09PSB2b2lkIDApIHsgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IERFRkFVTFRfSU5URVJQT0xBVElPTl9DT05GSUc7IH1cbiAgICAgICAgdmFyIHJlZ2V4cCA9IF9jcmVhdGVJbnRlcnBvbGF0ZVJlZ0V4cChpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQocmVnZXhwKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyaW5ncyA9IFtdO1xuICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgdmFyIG9mZnNldHMgPSBbXTtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBmaXhlZCBzdHJpbmdcbiAgICAgICAgICAgICAgICBzdHJpbmdzLnB1c2gocGFydCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHBhcnQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGFydC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBpbnRlcnBvbGF0aW9uQ29uZmlnLnN0YXJ0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgIG9mZnNldHMucHVzaChvZmZzZXQpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBwYXJ0Lmxlbmd0aCArIGludGVycG9sYXRpb25Db25maWcuZW5kLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKCdCbGFuayBleHByZXNzaW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gaW50ZXJwb2xhdGVkIHN0cmluZ3MnLCBpbnB1dCwgXCJhdCBjb2x1bW4gXCIgKyB0aGlzLl9maW5kSW50ZXJwb2xhdGlvbkVycm9yQ29sdW1uKHBhcnRzLCBpLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSArIFwiIGluXCIsIGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKCckaW1wbGljdCcpO1xuICAgICAgICAgICAgICAgIG9mZnNldHMucHVzaChvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU3BsaXRJbnRlcnBvbGF0aW9uKHN0cmluZ3MsIGV4cHJlc3Npb25zLCBvZmZzZXRzKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUud3JhcExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoaW5wdXQsIGxvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShuZXcgTGl0ZXJhbFByaW1pdGl2ZShuZXcgUGFyc2VTcGFuKDAsIGlucHV0ID09IG51bGwgPyAwIDogaW5wdXQubGVuZ3RoKSwgaW5wdXQpLCBpbnB1dCwgbG9jYXRpb24sIHRoaXMuZXJyb3JzKTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuX3N0cmlwQ29tbWVudHMgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9jb21tZW50U3RhcnQoaW5wdXQpO1xuICAgICAgICByZXR1cm4gaSAhPSBudWxsID8gaW5wdXQuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKSA6IGlucHV0O1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5fY29tbWVudFN0YXJ0ID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIHZhciBvdXRlclF1b3RlID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaGFyID0gaW5wdXQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IGlucHV0LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICAgICAgaWYgKGNoYXIgPT09ICRTTEFTSCAmJiBuZXh0Q2hhciA9PSAkU0xBU0ggJiYgb3V0ZXJRdW90ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgaWYgKG91dGVyUXVvdGUgPT09IGNoYXIpIHtcbiAgICAgICAgICAgICAgICBvdXRlclF1b3RlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG91dGVyUXVvdGUgPT0gbnVsbCAmJiBpc1F1b3RlKGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgb3V0ZXJRdW90ZSA9IGNoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLl9jaGVja05vSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uIChpbnB1dCwgbG9jYXRpb24sIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgdmFyIHJlZ2V4cCA9IF9jcmVhdGVJbnRlcnBvbGF0ZVJlZ0V4cChpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQocmVnZXhwKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFwiR290IGludGVycG9sYXRpb24gKFwiICsgaW50ZXJwb2xhdGlvbkNvbmZpZy5zdGFydCArIGludGVycG9sYXRpb25Db25maWcuZW5kICsgXCIpIHdoZXJlIGV4cHJlc3Npb24gd2FzIGV4cGVjdGVkXCIsIGlucHV0LCBcImF0IGNvbHVtbiBcIiArIHRoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIDEsIGludGVycG9sYXRpb25Db25maWcpICsgXCIgaW5cIiwgbG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLl9maW5kSW50ZXJwb2xhdGlvbkVycm9yQ29sdW1uID0gZnVuY3Rpb24gKHBhcnRzLCBwYXJ0SW5FcnJJZHgsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgdmFyIGVyckxvY2F0aW9uID0gJyc7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydEluRXJySWR4OyBqKyspIHtcbiAgICAgICAgICAgIGVyckxvY2F0aW9uICs9IGogJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICBwYXJ0c1tqXSA6XG4gICAgICAgICAgICAgICAgXCJcIiArIGludGVycG9sYXRpb25Db25maWcuc3RhcnQgKyBwYXJ0c1tqXSArIGludGVycG9sYXRpb25Db25maWcuZW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJMb2NhdGlvbi5sZW5ndGg7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyc2VyO1xufSgpKTtcbnZhciBfUGFyc2VBU1QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCBpbnB1dExlbmd0aCwgcGFyc2VBY3Rpb24sIGVycm9ycywgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgICB0aGlzLnRva2VucyA9IHRva2VucztcbiAgICAgICAgdGhpcy5pbnB1dExlbmd0aCA9IGlucHV0TGVuZ3RoO1xuICAgICAgICB0aGlzLnBhcnNlQWN0aW9uID0gcGFyc2VBY3Rpb247XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5ycGFyZW5zRXhwZWN0ZWQgPSAwO1xuICAgICAgICB0aGlzLnJicmFja2V0c0V4cGVjdGVkID0gMDtcbiAgICAgICAgdGhpcy5yYnJhY2VzRXhwZWN0ZWQgPSAwO1xuICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB9XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICB2YXIgaSA9IHRoaXMuaW5kZXggKyBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBpIDwgdGhpcy50b2tlbnMubGVuZ3RoID8gdGhpcy50b2tlbnNbaV0gOiBFT0Y7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX1BhcnNlQVNULnByb3RvdHlwZSwgXCJuZXh0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnBlZWsoMCk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfUGFyc2VBU1QucHJvdG90eXBlLCBcImlucHV0SW5kZXhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkgPyB0aGlzLm5leHQuaW5kZXggKyB0aGlzLm9mZnNldCA6XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dExlbmd0aCArIHRoaXMub2Zmc2V0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnNwYW4gPSBmdW5jdGlvbiAoc3RhcnQpIHsgcmV0dXJuIG5ldyBQYXJzZVNwYW4oc3RhcnQsIHRoaXMuaW5wdXRJbmRleCk7IH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24gKCkgeyB0aGlzLmluZGV4Kys7IH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5vcHRpb25hbENoYXJhY3RlciA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLm5leHQuaXNDaGFyYWN0ZXIoY29kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGVla0tleXdvcmRMZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLm5leHQuaXNLZXl3b3JkTGV0KCk7IH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5wZWVrS2V5d29yZEFzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5uZXh0LmlzS2V5d29yZEFzKCk7IH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5leHBlY3RDaGFyYWN0ZXIgPSBmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3Rlcihjb2RlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5lcnJvcihcIk1pc3NpbmcgZXhwZWN0ZWQgXCIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUub3B0aW9uYWxPcGVyYXRvciA9IGZ1bmN0aW9uIChvcCkge1xuICAgICAgICBpZiAodGhpcy5uZXh0LmlzT3BlcmF0b3Iob3ApKSB7XG4gICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLmV4cGVjdE9wZXJhdG9yID0gZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3Iob3BlcmF0b3IpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVycm9yKFwiTWlzc2luZyBleHBlY3RlZCBvcGVyYXRvciBcIiArIG9wZXJhdG9yKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLm5leHQ7XG4gICAgICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihcIlVuZXhwZWN0ZWQgdG9rZW4gXCIgKyBuICsgXCIsIGV4cGVjdGVkIGlkZW50aWZpZXIgb3Iga2V5d29yZFwiKTtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIG4udG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZE9yU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbiA9IHRoaXMubmV4dDtcbiAgICAgICAgaWYgKCFuLmlzSWRlbnRpZmllcigpICYmICFuLmlzS2V5d29yZCgpICYmICFuLmlzU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuIFwiICsgbiArIFwiLCBleHBlY3RlZCBpZGVudGlmaWVyLCBrZXl3b3JkLCBvciBzdHJpbmdcIik7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIHJldHVybiBuLnRvU3RyaW5nKCk7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlQ2hhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBycyA9IFtdO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0SW5kZXg7XG4gICAgICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICBleHBycy5wdXNoKGV4cHIpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFNFTUlDT0xPTikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcignQmluZGluZyBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIGNoYWluZWQgZXhwcmVzc2lvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICAgICAgICAgIH0gLy8gcmVhZCBhbGwgc2VtaWNvbG9uc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuICdcIiArIHRoaXMubmV4dCArIFwiJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwcnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RXhwcih0aGlzLnNwYW4oc3RhcnQpKTtcbiAgICAgICAgaWYgKGV4cHJzLmxlbmd0aCA9PSAxKVxuICAgICAgICAgICAgcmV0dXJuIGV4cHJzWzBdO1xuICAgICAgICByZXR1cm4gbmV3IENoYWluKHRoaXMuc3BhbihzdGFydCksIGV4cHJzKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VQaXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignfCcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZUFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoJ0Nhbm5vdCBoYXZlIGEgcGlwZSBpbiBhbiBhY3Rpb24gZXhwcmVzc2lvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSB0aGlzLmV4cGVjdElkZW50aWZpZXJPcktleXdvcmQoKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT0xPTikpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluZGluZ1BpcGUodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgcmVzdWx0LCBuYW1lXzEsIGFyZ3MpO1xuICAgICAgICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCd8JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb25hbCgpOyB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VDb25kaXRpb25hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUxvZ2ljYWxPcigpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc/JykpIHtcbiAgICAgICAgICAgIHZhciB5ZXMgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgICAgICAgdmFyIG5vID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT0xPTikpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcIkNvbmRpdGlvbmFsIGV4cHJlc3Npb24gXCIgKyBleHByZXNzaW9uICsgXCIgcmVxdWlyZXMgYWxsIDMgZXhwcmVzc2lvbnNcIik7XG4gICAgICAgICAgICAgICAgbm8gPSBuZXcgRW1wdHlFeHByKHRoaXMuc3BhbihzdGFydCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm8gPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbCh0aGlzLnNwYW4oc3RhcnQpLCByZXN1bHQsIHllcywgbm8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUxvZ2ljYWxPciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gJ3x8J1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUxvZ2ljYWxBbmQoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignfHwnKSkge1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUxvZ2ljYWxBbmQoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgJ3x8JywgcmVzdWx0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VMb2dpY2FsQW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAnJiYnXG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlRXF1YWxpdHkoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignJiYnKSkge1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZUVxdWFsaXR5KCk7XG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KHRoaXMuc3BhbihyZXN1bHQuc3Bhbi5zdGFydCksICcmJicsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlRXF1YWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICc9PScsJyE9JywnPT09JywnIT09J1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZVJlbGF0aW9uYWwoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZSQxLk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm5leHQuc3RyVmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPT0nOlxuICAgICAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnIT0nOlxuICAgICAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnBhcnNlUmVsYXRpb25hbCgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KHRoaXMuc3BhbihyZXN1bHQuc3Bhbi5zdGFydCksIG9wZXJhdG9yLCByZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZVJlbGF0aW9uYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICc8JywgJz4nLCAnPD0nLCAnPj0nXG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlQWRkaXRpdmUoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZSQxLk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm5leHQuc3RyVmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMucGFyc2VBZGRpdGl2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KHRoaXMuc3BhbihyZXN1bHQuc3Bhbi5zdGFydCksIG9wZXJhdG9yLCByZXN1bHQsIHJpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgX1BhcnNlQVNULnByb3RvdHlwZS5wYXJzZUFkZGl0aXZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAnKycsICctJ1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZU11bHRpcGxpY2F0aXZlKCk7XG4gICAgICAgIHdoaWxlICh0aGlzLm5leHQudHlwZSA9PSBUb2tlblR5cGUkMS5PcGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gdGhpcy5uZXh0LnN0clZhbHVlO1xuICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5wYXJzZU11bHRpcGxpY2F0aXZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgb3BlcmF0b3IsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlTXVsdGlwbGljYXRpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICcqJywgJyUnLCAnLydcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucGFyc2VQcmVmaXgoKTtcbiAgICAgICAgd2hpbGUgKHRoaXMubmV4dC50eXBlID09IFRva2VuVHlwZSQxLk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm5leHQuc3RyVmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgb3BlcmF0b3IsIHJlc3VsdCwgcmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlUHJlZml4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5uZXh0LnR5cGUgPT0gVG9rZW5UeXBlJDEuT3BlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHRoaXMubmV4dC5zdHJWYWx1ZTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmluYXJ5KHRoaXMuc3BhbihzdGFydCksICctJywgcmVzdWx0LCBuZXcgTGl0ZXJhbFByaW1pdGl2ZShuZXcgUGFyc2VTcGFuKHN0YXJ0LCBzdGFydCksIDApKTtcbiAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGFyc2VQcmVmaXgoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnkodGhpcy5zcGFuKHN0YXJ0KSwgb3BlcmF0b3IsIG5ldyBMaXRlcmFsUHJpbWl0aXZlKG5ldyBQYXJzZVNwYW4oc3RhcnQsIHN0YXJ0KSwgMCksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZml4Tm90KHRoaXMuc3BhbihzdGFydCksIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VDYWxsQ2hhaW4oKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VDYWxsQ2hhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlUHJpbWFyeSgpO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFBFUklPRCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnBhcnNlQWNjZXNzTWVtYmVyT3JNZXRob2RDYWxsKHJlc3VsdCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc/LicpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTEJSQUNLRVQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYnJhY2tldHNFeHBlY3RlZCsrO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQtLTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNLRVQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz0nKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEtleWVkV3JpdGUodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgcmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBLZXllZFJlYWQodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgcmVzdWx0LCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExQQVJFTikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZCsrO1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gdGhpcy5wYXJzZUNhbGxBcmd1bWVudHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZC0tO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSUEFSRU4pO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGdW5jdGlvbkNhbGwodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgcmVzdWx0LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignIScpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE5vbk51bGxBc3NlcnQodGhpcy5zcGFuKHJlc3VsdC5zcGFuLnN0YXJ0KSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VQcmltYXJ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0SW5kZXg7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRMUEFSRU4pKSB7XG4gICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZCsrO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZC0tO1xuICAgICAgICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmROdWxsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKHRoaXMuc3BhbihzdGFydCksIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmRVbmRlZmluZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodGhpcy5zcGFuKHN0YXJ0KSwgdm9pZCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQuaXNLZXl3b3JkVHJ1ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0aGlzLnNwYW4oc3RhcnQpLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQuaXNLZXl3b3JkRmFsc2UoKSkge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodGhpcy5zcGFuKHN0YXJ0KSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0tleXdvcmRUaGlzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsaWNpdFJlY2VpdmVyKHRoaXMuc3BhbihzdGFydCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExCUkFDS0VUKSkge1xuICAgICAgICAgICAgdGhpcy5yYnJhY2tldHNFeHBlY3RlZCsrO1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5wYXJzZUV4cHJlc3Npb25MaXN0KCRSQlJBQ0tFVCk7XG4gICAgICAgICAgICB0aGlzLnJicmFja2V0c0V4cGVjdGVkLS07XG4gICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNLRVQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQXJyYXkodGhpcy5zcGFuKHN0YXJ0KSwgZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkTEJSQUNFKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsTWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5uZXh0LmlzSWRlbnRpZmllcigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChuZXcgSW1wbGljaXRSZWNlaXZlcih0aGlzLnNwYW4oc3RhcnQpKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubmV4dC5pc051bWJlcigpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLm5leHQudG9OdW1iZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKHRoaXMuc3BhbihzdGFydCksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgdmFyIGxpdGVyYWxWYWx1ZSA9IHRoaXMubmV4dC50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodGhpcy5zcGFuKHN0YXJ0KSwgbGl0ZXJhbFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmluZGV4ID49IHRoaXMudG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcihcIlVuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246IFwiICsgdGhpcy5pbnB1dCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RXhwcih0aGlzLnNwYW4oc3RhcnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJVbmV4cGVjdGVkIHRva2VuIFwiICsgdGhpcy5uZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFeHByKHRoaXMuc3BhbihzdGFydCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvbkxpc3QgPSBmdW5jdGlvbiAodGVybWluYXRvcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICghdGhpcy5uZXh0LmlzQ2hhcmFjdGVyKHRlcm1pbmF0b3IpKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYXJzZVBpcGUoKSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT01NQSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlTGl0ZXJhbE1hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmlucHV0SW5kZXg7XG4gICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRMQlJBQ0UpO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFJCUkFDRSkpIHtcbiAgICAgICAgICAgIHRoaXMucmJyYWNlc0V4cGVjdGVkKys7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIHF1b3RlZCA9IHRoaXMubmV4dC5pc1N0cmluZygpO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB0aGlzLmV4cGVjdElkZW50aWZpZXJPcktleXdvcmRPclN0cmluZygpO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaCh7IGtleToga2V5LCBxdW90ZWQ6IHF1b3RlZCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkQ09MT04pO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgICAgICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09NTUEpKTtcbiAgICAgICAgICAgIHRoaXMucmJyYWNlc0V4cGVjdGVkLS07XG4gICAgICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXAodGhpcy5zcGFuKHN0YXJ0KSwga2V5cywgdmFsdWVzKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwgPSBmdW5jdGlvbiAocmVjZWl2ZXIsIGlzU2FmZSkge1xuICAgICAgICBpZiAoaXNTYWZlID09PSB2b2lkIDApIHsgaXNTYWZlID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHN0YXJ0ID0gcmVjZWl2ZXIuc3Bhbi5zdGFydDtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRMUEFSRU4pKSB7XG4gICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZCsrO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLnBhcnNlQ2FsbEFyZ3VtZW50cygpO1xuICAgICAgICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICAgICAgICB0aGlzLnJwYXJlbnNFeHBlY3RlZC0tO1xuICAgICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLnNwYW4oc3RhcnQpO1xuICAgICAgICAgICAgcmV0dXJuIGlzU2FmZSA/IG5ldyBTYWZlTWV0aG9kQ2FsbChzcGFuLCByZWNlaXZlciwgaWQsIGFyZ3MpIDpcbiAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbChzcGFuLCByZWNlaXZlciwgaWQsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzU2FmZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz0nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKCdUaGUgXFwnPy5cXCcgb3BlcmF0b3IgY2Fubm90IGJlIHVzZWQgaW4gdGhlIGFzc2lnbm1lbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUV4cHIodGhpcy5zcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhZmVQcm9wZXJ0eVJlYWQodGhpcy5zcGFuKHN0YXJ0KSwgcmVjZWl2ZXIsIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKCdCaW5kaW5ncyBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUV4cHIodGhpcy5zcGFuKHN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlXcml0ZSh0aGlzLnNwYW4oc3RhcnQpLCByZWNlaXZlciwgaWQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlSZWFkKHRoaXMuc3BhbihzdGFydCksIHJlY2VpdmVyLCBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlQ2FsbEFyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkUlBBUkVOKSlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgdmFyIHBvc2l0aW9uYWxzID0gW107XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHBvc2l0aW9uYWxzLnB1c2godGhpcy5wYXJzZVBpcGUoKSk7XG4gICAgICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbmFscztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIsIGEga2V5d29yZCwgYSBzdHJpbmcgd2l0aCBhbiBvcHRpb25hbCBgLWAgaW4gYmV0d2Vlbi5cbiAgICAgKi9cbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICB2YXIgb3BlcmF0b3JGb3VuZCA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmcoKTtcbiAgICAgICAgICAgIG9wZXJhdG9yRm91bmQgPSB0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJy0nKTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRvckZvdW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICctJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAob3BlcmF0b3JGb3VuZCk7XG4gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTtcbiAgICB9O1xuICAgIC8vIFBhcnNlcyB0aGUgQVNUIGZvciBgPHNvbWUtdGFnICp0cGxLZXk9QVNUPmBcbiAgICBfUGFyc2VBU1QucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVCaW5kaW5ncyA9IGZ1bmN0aW9uICh0cGxLZXkpIHtcbiAgICAgICAgdmFyIGZpcnN0QmluZGluZyA9IHRydWU7XG4gICAgICAgIHZhciBiaW5kaW5ncyA9IFtdO1xuICAgICAgICB2YXIgd2FybmluZ3MgPSBbXTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICAgICAgdmFyIHJhd0tleSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBrZXkgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgaXNWYXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChmaXJzdEJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByYXdLZXkgPSBrZXkgPSB0cGxLZXk7XG4gICAgICAgICAgICAgICAgZmlyc3RCaW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpc1ZhciA9IHRoaXMucGVla0tleXdvcmRMZXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYXIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgICAgICAgIHJhd0tleSA9IHRoaXMuZXhwZWN0VGVtcGxhdGVCaW5kaW5nS2V5KCk7XG4gICAgICAgICAgICAgICAga2V5ID0gaXNWYXIgPyByYXdLZXkgOiB0cGxLZXkgKyByYXdLZXlbMF0udG9VcHBlckNhc2UoKSArIHJhd0tleS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09MT04pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5hbWVfMiA9IG51bGw7XG4gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaXNWYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc9JykpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZV8yID0gdGhpcy5leHBlY3RUZW1wbGF0ZUJpbmRpbmdLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVfMiA9ICdcXCRpbXBsaWNpdCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wZWVrS2V5d29yZEFzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTsgLy8gY29uc3VtZSBgYXNgXG4gICAgICAgICAgICAgICAgbmFtZV8yID0gcmF3S2V5O1xuICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuZXhwZWN0VGVtcGxhdGVCaW5kaW5nS2V5KCk7IC8vIHJlYWQgbG9jYWwgdmFyIG5hbWVcbiAgICAgICAgICAgICAgICBpc1ZhciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5leHQgIT09IEVPRiAmJiAhdGhpcy5wZWVrS2V5d29yZExldCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0XzEgPSB0aGlzLmlucHV0SW5kZXg7XG4gICAgICAgICAgICAgICAgdmFyIGFzdCA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0XzEgLSB0aGlzLm9mZnNldCwgdGhpcy5pbnB1dEluZGV4IC0gdGhpcy5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIHNvdXJjZSwgdGhpcy5sb2NhdGlvbiwgdGhpcy5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChuZXcgVGVtcGxhdGVCaW5kaW5nKHRoaXMuc3BhbihzdGFydCksIGtleSwgaXNWYXIsIG5hbWVfMiwgZXhwcmVzc2lvbikpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGVla0tleXdvcmRBcygpICYmICFpc1Zhcikge1xuICAgICAgICAgICAgICAgIHZhciBsZXRTdGFydCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkdmFuY2UoKTsgLy8gY29uc3VtZSBgYXNgXG4gICAgICAgICAgICAgICAgdmFyIGxldE5hbWUgPSB0aGlzLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSgpOyAvLyByZWFkIGxvY2FsIHZhciBuYW1lXG4gICAgICAgICAgICAgICAgYmluZGluZ3MucHVzaChuZXcgVGVtcGxhdGVCaW5kaW5nKHRoaXMuc3BhbihsZXRTdGFydCksIGxldE5hbWUsIHRydWUsIGtleSwgbnVsbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRTRU1JQ09MT04pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09NTUEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZUJpbmRpbmdQYXJzZVJlc3VsdChiaW5kaW5ncywgd2FybmluZ3MsIHRoaXMuZXJyb3JzKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSB2b2lkIDApIHsgaW5kZXggPSBudWxsOyB9XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFBhcnNlckVycm9yKG1lc3NhZ2UsIHRoaXMuaW5wdXQsIHRoaXMubG9jYXRpb25UZXh0KGluZGV4KSwgdGhpcy5sb2NhdGlvbikpO1xuICAgICAgICB0aGlzLnNraXAoKTtcbiAgICB9O1xuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUubG9jYXRpb25UZXh0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7IGluZGV4ID0gbnVsbDsgfVxuICAgICAgICBpZiAoaW5kZXggPT0gbnVsbClcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgcmV0dXJuIChpbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkgPyBcImF0IGNvbHVtbiBcIiArICh0aGlzLnRva2Vuc1tpbmRleF0uaW5kZXggKyAxKSArIFwiIGluXCIgOlxuICAgICAgICAgICAgXCJhdCB0aGUgZW5kIG9mIHRoZSBleHByZXNzaW9uXCI7XG4gICAgfTtcbiAgICAvLyBFcnJvciByZWNvdmVyeSBzaG91bGQgc2tpcCB0b2tlbnMgdW50aWwgaXQgZW5jb3VudGVycyBhIHJlY292ZXJ5IHBvaW50LiBza2lwKCkgdHJlYXRzXG4gICAgLy8gdGhlIGVuZCBvZiBpbnB1dCBhbmQgYSAnOycgYXMgdW5jb25kaXRpb25hbGx5IGEgcmVjb3ZlcnkgcG9pbnQuIEl0IGFsc28gdHJlYXRzICcpJyxcbiAgICAvLyAnfScgYW5kICddJyBhcyBjb25kaXRpb25hbCByZWNvdmVyeSBwb2ludHMgaWYgb25lIG9mIGNhbGxpbmcgcHJvZHVjdGlvbnMgaXMgZXhwZWN0aW5nXG4gICAgLy8gb25lIG9mIHRoZXNlIHN5bWJvbHMuIFRoaXMgYWxsb3dzIHNraXAoKSB0byByZWNvdmVyIGZyb20gZXJyb3JzIHN1Y2ggYXMgJyhhLikgKyAxJyBhbGxvd2luZ1xuICAgIC8vIG1vcmUgb2YgdGhlIEFTVCB0byBiZSByZXRhaW5lZCAoaXQgZG9lc24ndCBza2lwIGFueSB0b2tlbnMgYXMgdGhlICcpJyBpcyByZXRhaW5lZCBiZWNhdXNlXG4gICAgLy8gb2YgdGhlICcoJyBiZWdpbnMgYW4gJygnIDxleHByPiAnKScgcHJvZHVjdGlvbikuIFRoZSByZWNvdmVyeSBwb2ludHMgb2YgZ3JvdXBpbmcgc3ltYm9sc1xuICAgIC8vIG11c3QgYmUgY29uZGl0aW9uYWwgYXMgdGhleSBtdXN0IGJlIHNraXBwZWQgaWYgbm9uZSBvZiB0aGUgY2FsbGluZyBwcm9kdWN0aW9ucyBhcmUgbm90XG4gICAgLy8gZXhwZWN0aW5nIHRoZSBjbG9zaW5nIHRva2VuIGVsc2Ugd2Ugd2lsbCBuZXZlciBtYWtlIHByb2dyZXNzIGluIHRoZSBjYXNlIG9mIGFuXG4gICAgLy8gZXh0cmFuZW91cyBncm91cCBjbG9zaW5nIHN5bWJvbCAoc3VjaCBhcyBhIHN0cmF5ICcpJykuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGZvciAnOycgYmVjYXVzZVxuICAgIC8vIHBhcnNlQ2hhaW4oKSBpcyBhbHdheXMgdGhlIHJvb3QgcHJvZHVjdGlvbiBhbmQgaXQgZXhwZWN0cyBhICc7Jy5cbiAgICAvLyBJZiBhIHByb2R1Y3Rpb24gZXhwZWN0cyBvbmUgb2YgdGhlc2UgdG9rZW4gaXQgaW5jcmVtZW50cyB0aGUgY29ycmVzcG9uZGluZyBuZXN0aW5nIGNvdW50LFxuICAgIC8vIGFuZCB0aGVuIGRlY3JlbWVudHMgaXQganVzdCBwcmlvciB0byBjaGVja2luZyBpZiB0aGUgdG9rZW4gaXMgaW4gdGhlIGlucHV0LlxuICAgIF9QYXJzZUFTVC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG4gPSB0aGlzLm5leHQ7XG4gICAgICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoICYmICFuLmlzQ2hhcmFjdGVyKCRTRU1JQ09MT04pICYmXG4gICAgICAgICAgICAodGhpcy5ycGFyZW5zRXhwZWN0ZWQgPD0gMCB8fCAhbi5pc0NoYXJhY3RlcigkUlBBUkVOKSkgJiZcbiAgICAgICAgICAgICh0aGlzLnJicmFjZXNFeHBlY3RlZCA8PSAwIHx8ICFuLmlzQ2hhcmFjdGVyKCRSQlJBQ0UpKSAmJlxuICAgICAgICAgICAgKHRoaXMucmJyYWNrZXRzRXhwZWN0ZWQgPD0gMCB8fCAhbi5pc0NoYXJhY3RlcigkUkJSQUNLRVQpKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dC5pc0Vycm9yKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBQYXJzZXJFcnJvcih0aGlzLm5leHQudG9TdHJpbmcoKSwgdGhpcy5pbnB1dCwgdGhpcy5sb2NhdGlvblRleHQoKSwgdGhpcy5sb2NhdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgICBuID0gdGhpcy5uZXh0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gX1BhcnNlQVNUO1xufSgpKTtcbnZhciBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlcigpIHtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB9XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2sgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgICAgIHZhciBzID0gbmV3IFNpbXBsZUV4cHJlc3Npb25DaGVja2VyKCk7XG4gICAgICAgIGFzdC52aXNpdChzKTtcbiAgICAgICAgcmV0dXJuIHMuZXJyb3JzO1xuICAgIH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0SW1wbGljaXRSZWNlaXZlciA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRJbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdExpdGVyYWxQcmltaXRpdmUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0UHJvcGVydHlSZWFkID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdFByb3BlcnR5V3JpdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdFNhZmVNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXkgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHRoaXMudmlzaXRBbGwoYXN0LmV4cHJlc3Npb25zKTsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpOyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEJpbmFyeSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRQcmVmaXhOb3QgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0Tm9uTnVsbEFzc2VydCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRDb25kaXRpb25hbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRQaXBlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB0aGlzLmVycm9ycy5wdXNoKCdwaXBlcycpOyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEtleWVkUmVhZCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci5wcm90b3R5cGUudmlzaXRLZXllZFdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnByb3RvdHlwZS52aXNpdEFsbCA9IGZ1bmN0aW9uIChhc3RzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhc3RzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pO1xuICAgIH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0Q2hhaW4gPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIucHJvdG90eXBlLnZpc2l0UXVvdGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgcmV0dXJuIFNpbXBsZUV4cHJlc3Npb25DaGVja2VyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT09PT09PT09PT0gUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICA9PT09PT09PT09PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy9cbi8vICAgICAgICBETyBOT1QgRURJVCBUSElTIExJU1QgT0YgU0VDVVJJVFkgU0VOU0lUSVZFIFBST1BFUlRJRVMgV0lUSE9VVCBBIFNFQ1VSSVRZIFJFVklFVyFcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWNoIG91dCB0byBtcHJvYnN0IGZvciBkZXRhaWxzLlxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8qKiBNYXAgZnJvbSB0YWdOYW1lfHByb3BlcnR5TmFtZSBTZWN1cml0eUNvbnRleHQuIFByb3BlcnRpZXMgYXBwbHlpbmcgdG8gYWxsIHRhZ3MgdXNlICcqJy4gKi9cbnZhciBfU0VDVVJJVFlfU0NIRU1BO1xuZnVuY3Rpb24gU0VDVVJJVFlfU0NIRU1BKCkge1xuICAgIGlmICghX1NFQ1VSSVRZX1NDSEVNQSkge1xuICAgICAgICBfU0VDVVJJVFlfU0NIRU1BID0ge307XG4gICAgICAgIC8vIENhc2UgaXMgaW5zaWduaWZpY2FudCBiZWxvdywgYWxsIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyBhcmUgbG93ZXItY2FzZWQgZm9yIGxvb2t1cC5cbiAgICAgICAgcmVnaXN0ZXJDb250ZXh0KFNlY3VyaXR5Q29udGV4dC5IVE1MLCBbXG4gICAgICAgICAgICAnaWZyYW1lfHNyY2RvYycsXG4gICAgICAgICAgICAnKnxpbm5lckhUTUwnLFxuICAgICAgICAgICAgJyp8b3V0ZXJIVE1MJyxcbiAgICAgICAgXSk7XG4gICAgICAgIHJlZ2lzdGVyQ29udGV4dChTZWN1cml0eUNvbnRleHQuU1RZTEUsIFsnKnxzdHlsZSddKTtcbiAgICAgICAgLy8gTkI6IG5vIFNDUklQVCBjb250ZXh0cyBoZXJlLCB0aGV5IGFyZSBuZXZlciBhbGxvd2VkIGR1ZSB0byB0aGUgcGFyc2VyIHN0cmlwcGluZyB0aGVtLlxuICAgICAgICByZWdpc3RlckNvbnRleHQoU2VjdXJpdHlDb250ZXh0LlVSTCwgW1xuICAgICAgICAgICAgJyp8Zm9ybUFjdGlvbicsICdhcmVhfGhyZWYnLCAnYXJlYXxwaW5nJywgJ2F1ZGlvfHNyYycsICdhfGhyZWYnLFxuICAgICAgICAgICAgJ2F8cGluZycsICdibG9ja3F1b3RlfGNpdGUnLCAnYm9keXxiYWNrZ3JvdW5kJywgJ2RlbHxjaXRlJywgJ2Zvcm18YWN0aW9uJyxcbiAgICAgICAgICAgICdpbWd8c3JjJywgJ2ltZ3xzcmNzZXQnLCAnaW5wdXR8c3JjJywgJ2luc3xjaXRlJywgJ3F8Y2l0ZScsXG4gICAgICAgICAgICAnc291cmNlfHNyYycsICdzb3VyY2V8c3Jjc2V0JywgJ3RyYWNrfHNyYycsICd2aWRlb3xwb3N0ZXInLCAndmlkZW98c3JjJyxcbiAgICAgICAgXSk7XG4gICAgICAgIHJlZ2lzdGVyQ29udGV4dChTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCBbXG4gICAgICAgICAgICAnYXBwbGV0fGNvZGUnLFxuICAgICAgICAgICAgJ2FwcGxldHxjb2RlYmFzZScsXG4gICAgICAgICAgICAnYmFzZXxocmVmJyxcbiAgICAgICAgICAgICdlbWJlZHxzcmMnLFxuICAgICAgICAgICAgJ2ZyYW1lfHNyYycsXG4gICAgICAgICAgICAnaGVhZHxwcm9maWxlJyxcbiAgICAgICAgICAgICdodG1sfG1hbmlmZXN0JyxcbiAgICAgICAgICAgICdpZnJhbWV8c3JjJyxcbiAgICAgICAgICAgICdsaW5rfGhyZWYnLFxuICAgICAgICAgICAgJ21lZGlhfHNyYycsXG4gICAgICAgICAgICAnb2JqZWN0fGNvZGViYXNlJyxcbiAgICAgICAgICAgICdvYmplY3R8ZGF0YScsXG4gICAgICAgICAgICAnc2NyaXB0fHNyYycsXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gX1NFQ1VSSVRZX1NDSEVNQTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyQ29udGV4dChjdHgsIHNwZWNzKSB7XG4gICAgdmFyIGVfMSwgX2E7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgc3BlY3NfMSA9IF9fdmFsdWVzKHNwZWNzKSwgc3BlY3NfMV8xID0gc3BlY3NfMS5uZXh0KCk7ICFzcGVjc18xXzEuZG9uZTsgc3BlY3NfMV8xID0gc3BlY3NfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBzcGVjID0gc3BlY3NfMV8xLnZhbHVlO1xuICAgICAgICAgICAgX1NFQ1VSSVRZX1NDSEVNQVtzcGVjLnRvTG93ZXJDYXNlKCldID0gY3R4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc3BlY3NfMV8xICYmICFzcGVjc18xXzEuZG9uZSAmJiAoX2EgPSBzcGVjc18xLnJldHVybikpIF9hLmNhbGwoc3BlY3NfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbGVtZW50U2NoZW1hUmVnaXN0cnkoKSB7XG4gICAgfVxuICAgIHJldHVybiBFbGVtZW50U2NoZW1hUmVnaXN0cnk7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQk9PTEVBTiA9ICdib29sZWFuJztcbnZhciBOVU1CRVIgPSAnbnVtYmVyJztcbnZhciBTVFJJTkcgPSAnc3RyaW5nJztcbnZhciBPQkpFQ1QgPSAnb2JqZWN0Jztcbi8qKlxuICogVGhpcyBhcnJheSByZXByZXNlbnRzIHRoZSBET00gc2NoZW1hLiBJdCBlbmNvZGVzIGluaGVyaXRhbmNlLCBwcm9wZXJ0aWVzLCBhbmQgZXZlbnRzLlxuICpcbiAqICMjIE92ZXJ2aWV3XG4gKlxuICogRWFjaCBsaW5lIHJlcHJlc2VudHMgb25lIGtpbmQgb2YgZWxlbWVudC4gVGhlIGBlbGVtZW50X2luaGVyaXRhbmNlYCBhbmQgcHJvcGVydGllcyBhcmUgam9pbmVkXG4gKiB1c2luZyBgZWxlbWVudF9pbmhlcml0YW5jZXxwcm9wZXJ0aWVzYCBzeW50YXguXG4gKlxuICogIyMgRWxlbWVudCBJbmhlcml0YW5jZVxuICpcbiAqIFRoZSBgZWxlbWVudF9pbmhlcml0YW5jZWAgY2FuIGJlIGZ1cnRoZXIgc3ViZGl2aWRlZCBhcyBgZWxlbWVudDEsZWxlbWVudDIsLi4uXnBhcmVudEVsZW1lbnRgLlxuICogSGVyZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBhcmUgc2VwYXJhdGVkIGJ5IGAsYCAoY29tbWFzKS4gRXZlcnkgZWxlbWVudCBpbiB0aGUgbGlzdFxuICogaGFzIGlkZW50aWNhbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEFuIGBlbGVtZW50YCBtYXkgaW5oZXJpdCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZnJvbSBgcGFyZW50RWxlbWVudGAgSWYgbm8gYF5wYXJlbnRFbGVtZW50YCBpc1xuICogc3BlY2lmaWVkIHRoZW4gYFwiXCJgIChibGFuaykgZWxlbWVudCBpcyBhc3N1bWVkLlxuICpcbiAqIE5PVEU6IFRoZSBibGFuayBlbGVtZW50IGluaGVyaXRzIGZyb20gcm9vdCBgW0VsZW1lbnRdYCBlbGVtZW50LCB0aGUgc3VwZXIgZWxlbWVudCBvZiBhbGxcbiAqIGVsZW1lbnRzLlxuICpcbiAqIE5PVEUgYW4gZWxlbWVudCBwcmVmaXggc3VjaCBhcyBgOnN2ZzpgIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIHNjaGVtYS5cbiAqXG4gKiAjIyBQcm9wZXJ0aWVzXG4gKlxuICogRWFjaCBlbGVtZW50IGhhcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHNlcGFyYXRlZCBieSBgLGAgKGNvbW1hcykuIEVhY2ggcHJvcGVydHkgY2FuIGJlIHByZWZpeGVkXG4gKiBieSBhIHNwZWNpYWwgY2hhcmFjdGVyIGRlc2lnbmF0aW5nIGl0cyB0eXBlOlxuICpcbiAqIC0gKG5vIHByZWZpeCk6IHByb3BlcnR5IGlzIGEgc3RyaW5nLlxuICogLSBgKmA6IHByb3BlcnR5IHJlcHJlc2VudHMgYW4gZXZlbnQuXG4gKiAtIGAhYDogcHJvcGVydHkgaXMgYSBib29sZWFuLlxuICogLSBgI2A6IHByb3BlcnR5IGlzIGEgbnVtYmVyLlxuICogLSBgJWA6IHByb3BlcnR5IGlzIGFuIG9iamVjdC5cbiAqXG4gKiAjIyBRdWVyeVxuICpcbiAqIFRoZSBjbGFzcyBjcmVhdGVzIGFuIGludGVybmFsIHNxdWFzIHJlcHJlc2VudGF0aW9uIHdoaWNoIGFsbG93cyB0byBlYXNpbHkgYW5zd2VyIHRoZSBxdWVyeSBvZlxuICogaWYgYSBnaXZlbiBwcm9wZXJ0eSBleGlzdCBvbiBhIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogTk9URTogV2UgZG9uJ3QgeWV0IHN1cHBvcnQgcXVlcnlpbmcgZm9yIHR5cGVzIG9yIGV2ZW50cy5cbiAqIE5PVEU6IFRoaXMgc2NoZW1hIGlzIGF1dG8gZXh0cmFjdGVkIGZyb20gYHNjaGVtYV9leHRyYWN0b3IudHNgIGxvY2F0ZWQgaW4gdGhlIHRlc3QgZm9sZGVyLFxuICogICAgICAgc2VlIGRvbV9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeV9zcGVjLnRzXG4gKi9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09PT09PT09PT09IFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgIC0gIFMgVCBPIFAgICAtICBTIFQgTyBQICAgLSAgUyBUIE8gUCAgPT09PT09PT09PT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vXG4vLyAgICAgICAgICAgICAgICAgICAgICAgRE8gTk9UIEVESVQgVEhJUyBET00gU0NIRU1BIFdJVEhPVVQgQSBTRUNVUklUWSBSRVZJRVchXG4vL1xuLy8gTmV3bHkgYWRkZWQgcHJvcGVydGllcyBtdXN0IGJlIHNlY3VyaXR5IHJldmlld2VkIGFuZCBhc3NpZ25lZCBhbiBhcHByb3ByaWF0ZSBTZWN1cml0eUNvbnRleHQgaW5cbi8vIGRvbV9zZWN1cml0eV9zY2hlbWEudHMuIFJlYWNoIG91dCB0byBtcHJvYnN0ICYgcmphbWV0IGZvciBkZXRhaWxzLlxuLy9cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbnZhciBTQ0hFTUEgPSBbXG4gICAgJ1tFbGVtZW50XXx0ZXh0Q29udGVudCwlY2xhc3NMaXN0LGNsYXNzTmFtZSxpZCxpbm5lckhUTUwsKmJlZm9yZWNvcHksKmJlZm9yZWN1dCwqYmVmb3JlcGFzdGUsKmNvcHksKmN1dCwqcGFzdGUsKnNlYXJjaCwqc2VsZWN0c3RhcnQsKndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UsKndlYmtpdGZ1bGxzY3JlZW5lcnJvciwqd2hlZWwsb3V0ZXJIVE1MLCNzY3JvbGxMZWZ0LCNzY3JvbGxUb3Asc2xvdCcgK1xuICAgICAgICAvKiBhZGRlZCBtYW51YWxseSB0byBhdm9pZCBicmVha2luZyBjaGFuZ2VzICovXG4gICAgICAgICcsKm1lc3NhZ2UsKm1vemZ1bGxzY3JlZW5jaGFuZ2UsKm1vemZ1bGxzY3JlZW5lcnJvciwqbW96cG9pbnRlcmxvY2tjaGFuZ2UsKm1venBvaW50ZXJsb2NrZXJyb3IsKndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IsKndlYmdsY29udGV4dGxvc3QsKndlYmdsY29udGV4dHJlc3RvcmVkJyxcbiAgICAnW0hUTUxFbGVtZW50XV5bRWxlbWVudF18YWNjZXNzS2V5LGNvbnRlbnRFZGl0YWJsZSxkaXIsIWRyYWdnYWJsZSwhaGlkZGVuLGlubmVyVGV4dCxsYW5nLCphYm9ydCwqYXV4Y2xpY2ssKmJsdXIsKmNhbmNlbCwqY2FucGxheSwqY2FucGxheXRocm91Z2gsKmNoYW5nZSwqY2xpY2ssKmNsb3NlLCpjb250ZXh0bWVudSwqY3VlY2hhbmdlLCpkYmxjbGljaywqZHJhZywqZHJhZ2VuZCwqZHJhZ2VudGVyLCpkcmFnbGVhdmUsKmRyYWdvdmVyLCpkcmFnc3RhcnQsKmRyb3AsKmR1cmF0aW9uY2hhbmdlLCplbXB0aWVkLCplbmRlZCwqZXJyb3IsKmZvY3VzLCpnb3Rwb2ludGVyY2FwdHVyZSwqaW5wdXQsKmludmFsaWQsKmtleWRvd24sKmtleXByZXNzLCprZXl1cCwqbG9hZCwqbG9hZGVkZGF0YSwqbG9hZGVkbWV0YWRhdGEsKmxvYWRzdGFydCwqbG9zdHBvaW50ZXJjYXB0dXJlLCptb3VzZWRvd24sKm1vdXNlZW50ZXIsKm1vdXNlbGVhdmUsKm1vdXNlbW92ZSwqbW91c2VvdXQsKm1vdXNlb3ZlciwqbW91c2V1cCwqbW91c2V3aGVlbCwqcGF1c2UsKnBsYXksKnBsYXlpbmcsKnBvaW50ZXJjYW5jZWwsKnBvaW50ZXJkb3duLCpwb2ludGVyZW50ZXIsKnBvaW50ZXJsZWF2ZSwqcG9pbnRlcm1vdmUsKnBvaW50ZXJvdXQsKnBvaW50ZXJvdmVyLCpwb2ludGVydXAsKnByb2dyZXNzLCpyYXRlY2hhbmdlLCpyZXNldCwqcmVzaXplLCpzY3JvbGwsKnNlZWtlZCwqc2Vla2luZywqc2VsZWN0LCpzaG93LCpzdGFsbGVkLCpzdWJtaXQsKnN1c3BlbmQsKnRpbWV1cGRhdGUsKnRvZ2dsZSwqdm9sdW1lY2hhbmdlLCp3YWl0aW5nLG91dGVyVGV4dCwhc3BlbGxjaGVjaywlc3R5bGUsI3RhYkluZGV4LHRpdGxlLCF0cmFuc2xhdGUnLFxuICAgICdhYmJyLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiLGJkaSxiZG8sY2l0ZSxjb2RlLGRkLGRmbixkdCxlbSxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGksa2JkLG1haW4sbWFyayxuYXYsbm9zY3JpcHQscmIscnAscnQscnRjLHJ1YnkscyxzYW1wLHNlY3Rpb24sc21hbGwsc3Ryb25nLHN1YixzdXAsdSx2YXIsd2JyXltIVE1MRWxlbWVudF18YWNjZXNzS2V5LGNvbnRlbnRFZGl0YWJsZSxkaXIsIWRyYWdnYWJsZSwhaGlkZGVuLGlubmVyVGV4dCxsYW5nLCphYm9ydCwqYXV4Y2xpY2ssKmJsdXIsKmNhbmNlbCwqY2FucGxheSwqY2FucGxheXRocm91Z2gsKmNoYW5nZSwqY2xpY2ssKmNsb3NlLCpjb250ZXh0bWVudSwqY3VlY2hhbmdlLCpkYmxjbGljaywqZHJhZywqZHJhZ2VuZCwqZHJhZ2VudGVyLCpkcmFnbGVhdmUsKmRyYWdvdmVyLCpkcmFnc3RhcnQsKmRyb3AsKmR1cmF0aW9uY2hhbmdlLCplbXB0aWVkLCplbmRlZCwqZXJyb3IsKmZvY3VzLCpnb3Rwb2ludGVyY2FwdHVyZSwqaW5wdXQsKmludmFsaWQsKmtleWRvd24sKmtleXByZXNzLCprZXl1cCwqbG9hZCwqbG9hZGVkZGF0YSwqbG9hZGVkbWV0YWRhdGEsKmxvYWRzdGFydCwqbG9zdHBvaW50ZXJjYXB0dXJlLCptb3VzZWRvd24sKm1vdXNlZW50ZXIsKm1vdXNlbGVhdmUsKm1vdXNlbW92ZSwqbW91c2VvdXQsKm1vdXNlb3ZlciwqbW91c2V1cCwqbW91c2V3aGVlbCwqcGF1c2UsKnBsYXksKnBsYXlpbmcsKnBvaW50ZXJjYW5jZWwsKnBvaW50ZXJkb3duLCpwb2ludGVyZW50ZXIsKnBvaW50ZXJsZWF2ZSwqcG9pbnRlcm1vdmUsKnBvaW50ZXJvdXQsKnBvaW50ZXJvdmVyLCpwb2ludGVydXAsKnByb2dyZXNzLCpyYXRlY2hhbmdlLCpyZXNldCwqcmVzaXplLCpzY3JvbGwsKnNlZWtlZCwqc2Vla2luZywqc2VsZWN0LCpzaG93LCpzdGFsbGVkLCpzdWJtaXQsKnN1c3BlbmQsKnRpbWV1cGRhdGUsKnRvZ2dsZSwqdm9sdW1lY2hhbmdlLCp3YWl0aW5nLG91dGVyVGV4dCwhc3BlbGxjaGVjaywlc3R5bGUsI3RhYkluZGV4LHRpdGxlLCF0cmFuc2xhdGUnLFxuICAgICdtZWRpYV5bSFRNTEVsZW1lbnRdfCFhdXRvcGxheSwhY29udHJvbHMsJWNvbnRyb2xzTGlzdCwlY3Jvc3NPcmlnaW4sI2N1cnJlbnRUaW1lLCFkZWZhdWx0TXV0ZWQsI2RlZmF1bHRQbGF5YmFja1JhdGUsIWRpc2FibGVSZW1vdGVQbGF5YmFjaywhbG9vcCwhbXV0ZWQsKmVuY3J5cHRlZCwqd2FpdGluZ2ZvcmtleSwjcGxheWJhY2tSYXRlLHByZWxvYWQsc3JjLCVzcmNPYmplY3QsI3ZvbHVtZScsXG4gICAgJzpzdmc6XltIVE1MRWxlbWVudF18KmFib3J0LCphdXhjbGljaywqYmx1ciwqY2FuY2VsLCpjYW5wbGF5LCpjYW5wbGF5dGhyb3VnaCwqY2hhbmdlLCpjbGljaywqY2xvc2UsKmNvbnRleHRtZW51LCpjdWVjaGFuZ2UsKmRibGNsaWNrLCpkcmFnLCpkcmFnZW5kLCpkcmFnZW50ZXIsKmRyYWdsZWF2ZSwqZHJhZ292ZXIsKmRyYWdzdGFydCwqZHJvcCwqZHVyYXRpb25jaGFuZ2UsKmVtcHRpZWQsKmVuZGVkLCplcnJvciwqZm9jdXMsKmdvdHBvaW50ZXJjYXB0dXJlLCppbnB1dCwqaW52YWxpZCwqa2V5ZG93biwqa2V5cHJlc3MsKmtleXVwLCpsb2FkLCpsb2FkZWRkYXRhLCpsb2FkZWRtZXRhZGF0YSwqbG9hZHN0YXJ0LCpsb3N0cG9pbnRlcmNhcHR1cmUsKm1vdXNlZG93biwqbW91c2VlbnRlciwqbW91c2VsZWF2ZSwqbW91c2Vtb3ZlLCptb3VzZW91dCwqbW91c2VvdmVyLCptb3VzZXVwLCptb3VzZXdoZWVsLCpwYXVzZSwqcGxheSwqcGxheWluZywqcG9pbnRlcmNhbmNlbCwqcG9pbnRlcmRvd24sKnBvaW50ZXJlbnRlciwqcG9pbnRlcmxlYXZlLCpwb2ludGVybW92ZSwqcG9pbnRlcm91dCwqcG9pbnRlcm92ZXIsKnBvaW50ZXJ1cCwqcHJvZ3Jlc3MsKnJhdGVjaGFuZ2UsKnJlc2V0LCpyZXNpemUsKnNjcm9sbCwqc2Vla2VkLCpzZWVraW5nLCpzZWxlY3QsKnNob3csKnN0YWxsZWQsKnN1Ym1pdCwqc3VzcGVuZCwqdGltZXVwZGF0ZSwqdG9nZ2xlLCp2b2x1bWVjaGFuZ2UsKndhaXRpbmcsJXN0eWxlLCN0YWJJbmRleCcsXG4gICAgJzpzdmc6Z3JhcGhpY3NeOnN2Zzp8JyxcbiAgICAnOnN2ZzphbmltYXRpb25eOnN2Zzp8KmJlZ2luLCplbmQsKnJlcGVhdCcsXG4gICAgJzpzdmc6Z2VvbWV0cnleOnN2Zzp8JyxcbiAgICAnOnN2Zzpjb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uXjpzdmc6fCcsXG4gICAgJzpzdmc6Z3JhZGllbnReOnN2Zzp8JyxcbiAgICAnOnN2Zzp0ZXh0Q29udGVudF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6dGV4dFBvc2l0aW9uaW5nXjpzdmc6dGV4dENvbnRlbnR8JyxcbiAgICAnYV5bSFRNTEVsZW1lbnRdfGNoYXJzZXQsY29vcmRzLGRvd25sb2FkLGhhc2gsaG9zdCxob3N0bmFtZSxocmVmLGhyZWZsYW5nLG5hbWUscGFzc3dvcmQscGF0aG5hbWUscGluZyxwb3J0LHByb3RvY29sLHJlZmVycmVyUG9saWN5LHJlbCxyZXYsc2VhcmNoLHNoYXBlLHRhcmdldCx0ZXh0LHR5cGUsdXNlcm5hbWUnLFxuICAgICdhcmVhXltIVE1MRWxlbWVudF18YWx0LGNvb3Jkcyxkb3dubG9hZCxoYXNoLGhvc3QsaG9zdG5hbWUsaHJlZiwhbm9IcmVmLHBhc3N3b3JkLHBhdGhuYW1lLHBpbmcscG9ydCxwcm90b2NvbCxyZWZlcnJlclBvbGljeSxyZWwsc2VhcmNoLHNoYXBlLHRhcmdldCx1c2VybmFtZScsXG4gICAgJ2F1ZGlvXm1lZGlhfCcsXG4gICAgJ2JyXltIVE1MRWxlbWVudF18Y2xlYXInLFxuICAgICdiYXNlXltIVE1MRWxlbWVudF18aHJlZix0YXJnZXQnLFxuICAgICdib2R5XltIVE1MRWxlbWVudF18YUxpbmssYmFja2dyb3VuZCxiZ0NvbG9yLGxpbmssKmJlZm9yZXVubG9hZCwqYmx1ciwqZXJyb3IsKmZvY3VzLCpoYXNoY2hhbmdlLCpsYW5ndWFnZWNoYW5nZSwqbG9hZCwqbWVzc2FnZSwqb2ZmbGluZSwqb25saW5lLCpwYWdlaGlkZSwqcGFnZXNob3csKnBvcHN0YXRlLCpyZWplY3Rpb25oYW5kbGVkLCpyZXNpemUsKnNjcm9sbCwqc3RvcmFnZSwqdW5oYW5kbGVkcmVqZWN0aW9uLCp1bmxvYWQsdGV4dCx2TGluaycsXG4gICAgJ2J1dHRvbl5bSFRNTEVsZW1lbnRdfCFhdXRvZm9jdXMsIWRpc2FibGVkLGZvcm1BY3Rpb24sZm9ybUVuY3R5cGUsZm9ybU1ldGhvZCwhZm9ybU5vVmFsaWRhdGUsZm9ybVRhcmdldCxuYW1lLHR5cGUsdmFsdWUnLFxuICAgICdjYW52YXNeW0hUTUxFbGVtZW50XXwjaGVpZ2h0LCN3aWR0aCcsXG4gICAgJ2NvbnRlbnReW0hUTUxFbGVtZW50XXxzZWxlY3QnLFxuICAgICdkbF5bSFRNTEVsZW1lbnRdfCFjb21wYWN0JyxcbiAgICAnZGF0YWxpc3ReW0hUTUxFbGVtZW50XXwnLFxuICAgICdkZXRhaWxzXltIVE1MRWxlbWVudF18IW9wZW4nLFxuICAgICdkaWFsb2deW0hUTUxFbGVtZW50XXwhb3BlbixyZXR1cm5WYWx1ZScsXG4gICAgJ2Rpcl5bSFRNTEVsZW1lbnRdfCFjb21wYWN0JyxcbiAgICAnZGl2XltIVE1MRWxlbWVudF18YWxpZ24nLFxuICAgICdlbWJlZF5bSFRNTEVsZW1lbnRdfGFsaWduLGhlaWdodCxuYW1lLHNyYyx0eXBlLHdpZHRoJyxcbiAgICAnZmllbGRzZXReW0hUTUxFbGVtZW50XXwhZGlzYWJsZWQsbmFtZScsXG4gICAgJ2ZvbnReW0hUTUxFbGVtZW50XXxjb2xvcixmYWNlLHNpemUnLFxuICAgICdmb3JtXltIVE1MRWxlbWVudF18YWNjZXB0Q2hhcnNldCxhY3Rpb24sYXV0b2NvbXBsZXRlLGVuY29kaW5nLGVuY3R5cGUsbWV0aG9kLG5hbWUsIW5vVmFsaWRhdGUsdGFyZ2V0JyxcbiAgICAnZnJhbWVeW0hUTUxFbGVtZW50XXxmcmFtZUJvcmRlcixsb25nRGVzYyxtYXJnaW5IZWlnaHQsbWFyZ2luV2lkdGgsbmFtZSwhbm9SZXNpemUsc2Nyb2xsaW5nLHNyYycsXG4gICAgJ2ZyYW1lc2V0XltIVE1MRWxlbWVudF18Y29scywqYmVmb3JldW5sb2FkLCpibHVyLCplcnJvciwqZm9jdXMsKmhhc2hjaGFuZ2UsKmxhbmd1YWdlY2hhbmdlLCpsb2FkLCptZXNzYWdlLCpvZmZsaW5lLCpvbmxpbmUsKnBhZ2VoaWRlLCpwYWdlc2hvdywqcG9wc3RhdGUsKnJlamVjdGlvbmhhbmRsZWQsKnJlc2l6ZSwqc2Nyb2xsLCpzdG9yYWdlLCp1bmhhbmRsZWRyZWplY3Rpb24sKnVubG9hZCxyb3dzJyxcbiAgICAnaHJeW0hUTUxFbGVtZW50XXxhbGlnbixjb2xvciwhbm9TaGFkZSxzaXplLHdpZHRoJyxcbiAgICAnaGVhZF5bSFRNTEVsZW1lbnRdfCcsXG4gICAgJ2gxLGgyLGgzLGg0LGg1LGg2XltIVE1MRWxlbWVudF18YWxpZ24nLFxuICAgICdodG1sXltIVE1MRWxlbWVudF18dmVyc2lvbicsXG4gICAgJ2lmcmFtZV5bSFRNTEVsZW1lbnRdfGFsaWduLCFhbGxvd0Z1bGxzY3JlZW4sZnJhbWVCb3JkZXIsaGVpZ2h0LGxvbmdEZXNjLG1hcmdpbkhlaWdodCxtYXJnaW5XaWR0aCxuYW1lLHJlZmVycmVyUG9saWN5LCVzYW5kYm94LHNjcm9sbGluZyxzcmMsc3JjZG9jLHdpZHRoJyxcbiAgICAnaW1nXltIVE1MRWxlbWVudF18YWxpZ24sYWx0LGJvcmRlciwlY3Jvc3NPcmlnaW4sI2hlaWdodCwjaHNwYWNlLCFpc01hcCxsb25nRGVzYyxsb3dzcmMsbmFtZSxyZWZlcnJlclBvbGljeSxzaXplcyxzcmMsc3Jjc2V0LHVzZU1hcCwjdnNwYWNlLCN3aWR0aCcsXG4gICAgJ2lucHV0XltIVE1MRWxlbWVudF18YWNjZXB0LGFsaWduLGFsdCxhdXRvY2FwaXRhbGl6ZSxhdXRvY29tcGxldGUsIWF1dG9mb2N1cywhY2hlY2tlZCwhZGVmYXVsdENoZWNrZWQsZGVmYXVsdFZhbHVlLGRpck5hbWUsIWRpc2FibGVkLCVmaWxlcyxmb3JtQWN0aW9uLGZvcm1FbmN0eXBlLGZvcm1NZXRob2QsIWZvcm1Ob1ZhbGlkYXRlLGZvcm1UYXJnZXQsI2hlaWdodCwhaW5jcmVtZW50YWwsIWluZGV0ZXJtaW5hdGUsbWF4LCNtYXhMZW5ndGgsbWluLCNtaW5MZW5ndGgsIW11bHRpcGxlLG5hbWUscGF0dGVybixwbGFjZWhvbGRlciwhcmVhZE9ubHksIXJlcXVpcmVkLHNlbGVjdGlvbkRpcmVjdGlvbiwjc2VsZWN0aW9uRW5kLCNzZWxlY3Rpb25TdGFydCwjc2l6ZSxzcmMsc3RlcCx0eXBlLHVzZU1hcCx2YWx1ZSwldmFsdWVBc0RhdGUsI3ZhbHVlQXNOdW1iZXIsI3dpZHRoJyxcbiAgICAnbGleW0hUTUxFbGVtZW50XXx0eXBlLCN2YWx1ZScsXG4gICAgJ2xhYmVsXltIVE1MRWxlbWVudF18aHRtbEZvcicsXG4gICAgJ2xlZ2VuZF5bSFRNTEVsZW1lbnRdfGFsaWduJyxcbiAgICAnbGlua15bSFRNTEVsZW1lbnRdfGFzLGNoYXJzZXQsJWNyb3NzT3JpZ2luLCFkaXNhYmxlZCxocmVmLGhyZWZsYW5nLGludGVncml0eSxtZWRpYSxyZWZlcnJlclBvbGljeSxyZWwsJXJlbExpc3QscmV2LCVzaXplcyx0YXJnZXQsdHlwZScsXG4gICAgJ21hcF5bSFRNTEVsZW1lbnRdfG5hbWUnLFxuICAgICdtYXJxdWVlXltIVE1MRWxlbWVudF18YmVoYXZpb3IsYmdDb2xvcixkaXJlY3Rpb24saGVpZ2h0LCNoc3BhY2UsI2xvb3AsI3Njcm9sbEFtb3VudCwjc2Nyb2xsRGVsYXksIXRydWVTcGVlZCwjdnNwYWNlLHdpZHRoJyxcbiAgICAnbWVudV5bSFRNTEVsZW1lbnRdfCFjb21wYWN0JyxcbiAgICAnbWV0YV5bSFRNTEVsZW1lbnRdfGNvbnRlbnQsaHR0cEVxdWl2LG5hbWUsc2NoZW1lJyxcbiAgICAnbWV0ZXJeW0hUTUxFbGVtZW50XXwjaGlnaCwjbG93LCNtYXgsI21pbiwjb3B0aW11bSwjdmFsdWUnLFxuICAgICdpbnMsZGVsXltIVE1MRWxlbWVudF18Y2l0ZSxkYXRlVGltZScsXG4gICAgJ29sXltIVE1MRWxlbWVudF18IWNvbXBhY3QsIXJldmVyc2VkLCNzdGFydCx0eXBlJyxcbiAgICAnb2JqZWN0XltIVE1MRWxlbWVudF18YWxpZ24sYXJjaGl2ZSxib3JkZXIsY29kZSxjb2RlQmFzZSxjb2RlVHlwZSxkYXRhLCFkZWNsYXJlLGhlaWdodCwjaHNwYWNlLG5hbWUsc3RhbmRieSx0eXBlLHVzZU1hcCwjdnNwYWNlLHdpZHRoJyxcbiAgICAnb3B0Z3JvdXBeW0hUTUxFbGVtZW50XXwhZGlzYWJsZWQsbGFiZWwnLFxuICAgICdvcHRpb25eW0hUTUxFbGVtZW50XXwhZGVmYXVsdFNlbGVjdGVkLCFkaXNhYmxlZCxsYWJlbCwhc2VsZWN0ZWQsdGV4dCx2YWx1ZScsXG4gICAgJ291dHB1dF5bSFRNTEVsZW1lbnRdfGRlZmF1bHRWYWx1ZSwlaHRtbEZvcixuYW1lLHZhbHVlJyxcbiAgICAncF5bSFRNTEVsZW1lbnRdfGFsaWduJyxcbiAgICAncGFyYW1eW0hUTUxFbGVtZW50XXxuYW1lLHR5cGUsdmFsdWUsdmFsdWVUeXBlJyxcbiAgICAncGljdHVyZV5bSFRNTEVsZW1lbnRdfCcsXG4gICAgJ3ByZV5bSFRNTEVsZW1lbnRdfCN3aWR0aCcsXG4gICAgJ3Byb2dyZXNzXltIVE1MRWxlbWVudF18I21heCwjdmFsdWUnLFxuICAgICdxLGJsb2NrcXVvdGUsY2l0ZV5bSFRNTEVsZW1lbnRdfCcsXG4gICAgJ3NjcmlwdF5bSFRNTEVsZW1lbnRdfCFhc3luYyxjaGFyc2V0LCVjcm9zc09yaWdpbiwhZGVmZXIsZXZlbnQsaHRtbEZvcixpbnRlZ3JpdHksc3JjLHRleHQsdHlwZScsXG4gICAgJ3NlbGVjdF5bSFRNTEVsZW1lbnRdfCFhdXRvZm9jdXMsIWRpc2FibGVkLCNsZW5ndGgsIW11bHRpcGxlLG5hbWUsIXJlcXVpcmVkLCNzZWxlY3RlZEluZGV4LCNzaXplLHZhbHVlJyxcbiAgICAnc2hhZG93XltIVE1MRWxlbWVudF18JyxcbiAgICAnc2xvdF5bSFRNTEVsZW1lbnRdfG5hbWUnLFxuICAgICdzb3VyY2VeW0hUTUxFbGVtZW50XXxtZWRpYSxzaXplcyxzcmMsc3Jjc2V0LHR5cGUnLFxuICAgICdzcGFuXltIVE1MRWxlbWVudF18JyxcbiAgICAnc3R5bGVeW0hUTUxFbGVtZW50XXwhZGlzYWJsZWQsbWVkaWEsdHlwZScsXG4gICAgJ2NhcHRpb25eW0hUTUxFbGVtZW50XXxhbGlnbicsXG4gICAgJ3RoLHRkXltIVE1MRWxlbWVudF18YWJicixhbGlnbixheGlzLGJnQ29sb3IsY2gsY2hPZmYsI2NvbFNwYW4saGVhZGVycyxoZWlnaHQsIW5vV3JhcCwjcm93U3BhbixzY29wZSx2QWxpZ24sd2lkdGgnLFxuICAgICdjb2wsY29sZ3JvdXBeW0hUTUxFbGVtZW50XXxhbGlnbixjaCxjaE9mZiwjc3Bhbix2QWxpZ24sd2lkdGgnLFxuICAgICd0YWJsZV5bSFRNTEVsZW1lbnRdfGFsaWduLGJnQ29sb3IsYm9yZGVyLCVjYXB0aW9uLGNlbGxQYWRkaW5nLGNlbGxTcGFjaW5nLGZyYW1lLHJ1bGVzLHN1bW1hcnksJXRGb290LCV0SGVhZCx3aWR0aCcsXG4gICAgJ3RyXltIVE1MRWxlbWVudF18YWxpZ24sYmdDb2xvcixjaCxjaE9mZix2QWxpZ24nLFxuICAgICd0Zm9vdCx0aGVhZCx0Ym9keV5bSFRNTEVsZW1lbnRdfGFsaWduLGNoLGNoT2ZmLHZBbGlnbicsXG4gICAgJ3RlbXBsYXRlXltIVE1MRWxlbWVudF18JyxcbiAgICAndGV4dGFyZWFeW0hUTUxFbGVtZW50XXxhdXRvY2FwaXRhbGl6ZSwhYXV0b2ZvY3VzLCNjb2xzLGRlZmF1bHRWYWx1ZSxkaXJOYW1lLCFkaXNhYmxlZCwjbWF4TGVuZ3RoLCNtaW5MZW5ndGgsbmFtZSxwbGFjZWhvbGRlciwhcmVhZE9ubHksIXJlcXVpcmVkLCNyb3dzLHNlbGVjdGlvbkRpcmVjdGlvbiwjc2VsZWN0aW9uRW5kLCNzZWxlY3Rpb25TdGFydCx2YWx1ZSx3cmFwJyxcbiAgICAndGl0bGVeW0hUTUxFbGVtZW50XXx0ZXh0JyxcbiAgICAndHJhY2teW0hUTUxFbGVtZW50XXwhZGVmYXVsdCxraW5kLGxhYmVsLHNyYyxzcmNsYW5nJyxcbiAgICAndWxeW0hUTUxFbGVtZW50XXwhY29tcGFjdCx0eXBlJyxcbiAgICAndW5rbm93bl5bSFRNTEVsZW1lbnRdfCcsXG4gICAgJ3ZpZGVvXm1lZGlhfCNoZWlnaHQscG9zdGVyLCN3aWR0aCcsXG4gICAgJzpzdmc6YV46c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6YW5pbWF0ZV46c3ZnOmFuaW1hdGlvbnwnLFxuICAgICc6c3ZnOmFuaW1hdGVNb3Rpb25eOnN2ZzphbmltYXRpb258JyxcbiAgICAnOnN2ZzphbmltYXRlVHJhbnNmb3JtXjpzdmc6YW5pbWF0aW9ufCcsXG4gICAgJzpzdmc6Y2lyY2xlXjpzdmc6Z2VvbWV0cnl8JyxcbiAgICAnOnN2ZzpjbGlwUGF0aF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6ZGVmc146c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6ZGVzY146c3ZnOnwnLFxuICAgICc6c3ZnOmRpc2NhcmReOnN2Zzp8JyxcbiAgICAnOnN2ZzplbGxpcHNlXjpzdmc6Z2VvbWV0cnl8JyxcbiAgICAnOnN2ZzpmZUJsZW5kXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVDb2xvck1hdHJpeF46c3ZnOnwnLFxuICAgICc6c3ZnOmZlQ29tcG9uZW50VHJhbnNmZXJeOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZUNvbXBvc2l0ZV46c3ZnOnwnLFxuICAgICc6c3ZnOmZlQ29udm9sdmVNYXRyaXheOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZURpZmZ1c2VMaWdodGluZ146c3ZnOnwnLFxuICAgICc6c3ZnOmZlRGlzcGxhY2VtZW50TWFwXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVEaXN0YW50TGlnaHReOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZURyb3BTaGFkb3deOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZUZsb29kXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVGdW5jQV46c3ZnOmNvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb258JyxcbiAgICAnOnN2ZzpmZUZ1bmNCXjpzdmc6Y29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbnwnLFxuICAgICc6c3ZnOmZlRnVuY0deOnN2Zzpjb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9ufCcsXG4gICAgJzpzdmc6ZmVGdW5jUl46c3ZnOmNvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb258JyxcbiAgICAnOnN2ZzpmZUdhdXNzaWFuQmx1cl46c3ZnOnwnLFxuICAgICc6c3ZnOmZlSW1hZ2VeOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZU1lcmdlXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVNZXJnZU5vZGVeOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZU1vcnBob2xvZ3leOnN2Zzp8JyxcbiAgICAnOnN2ZzpmZU9mZnNldF46c3ZnOnwnLFxuICAgICc6c3ZnOmZlUG9pbnRMaWdodF46c3ZnOnwnLFxuICAgICc6c3ZnOmZlU3BlY3VsYXJMaWdodGluZ146c3ZnOnwnLFxuICAgICc6c3ZnOmZlU3BvdExpZ2h0Xjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVUaWxlXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmVUdXJidWxlbmNlXjpzdmc6fCcsXG4gICAgJzpzdmc6ZmlsdGVyXjpzdmc6fCcsXG4gICAgJzpzdmc6Zm9yZWlnbk9iamVjdF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6Z146c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6aW1hZ2VeOnN2ZzpncmFwaGljc3wnLFxuICAgICc6c3ZnOmxpbmVeOnN2ZzpnZW9tZXRyeXwnLFxuICAgICc6c3ZnOmxpbmVhckdyYWRpZW50Xjpzdmc6Z3JhZGllbnR8JyxcbiAgICAnOnN2ZzptcGF0aF46c3ZnOnwnLFxuICAgICc6c3ZnOm1hcmtlcl46c3ZnOnwnLFxuICAgICc6c3ZnOm1hc2teOnN2Zzp8JyxcbiAgICAnOnN2ZzptZXRhZGF0YV46c3ZnOnwnLFxuICAgICc6c3ZnOnBhdGheOnN2ZzpnZW9tZXRyeXwnLFxuICAgICc6c3ZnOnBhdHRlcm5eOnN2Zzp8JyxcbiAgICAnOnN2Zzpwb2x5Z29uXjpzdmc6Z2VvbWV0cnl8JyxcbiAgICAnOnN2Zzpwb2x5bGluZV46c3ZnOmdlb21ldHJ5fCcsXG4gICAgJzpzdmc6cmFkaWFsR3JhZGllbnReOnN2ZzpncmFkaWVudHwnLFxuICAgICc6c3ZnOnJlY3ReOnN2ZzpnZW9tZXRyeXwnLFxuICAgICc6c3ZnOnN2Z146c3ZnOmdyYXBoaWNzfCNjdXJyZW50U2NhbGUsI3pvb21BbmRQYW4nLFxuICAgICc6c3ZnOnNjcmlwdF46c3ZnOnx0eXBlJyxcbiAgICAnOnN2ZzpzZXReOnN2ZzphbmltYXRpb258JyxcbiAgICAnOnN2ZzpzdG9wXjpzdmc6fCcsXG4gICAgJzpzdmc6c3R5bGVeOnN2Zzp8IWRpc2FibGVkLG1lZGlhLHRpdGxlLHR5cGUnLFxuICAgICc6c3ZnOnN3aXRjaF46c3ZnOmdyYXBoaWNzfCcsXG4gICAgJzpzdmc6c3ltYm9sXjpzdmc6fCcsXG4gICAgJzpzdmc6dHNwYW5eOnN2Zzp0ZXh0UG9zaXRpb25pbmd8JyxcbiAgICAnOnN2Zzp0ZXh0Xjpzdmc6dGV4dFBvc2l0aW9uaW5nfCcsXG4gICAgJzpzdmc6dGV4dFBhdGheOnN2Zzp0ZXh0Q29udGVudHwnLFxuICAgICc6c3ZnOnRpdGxlXjpzdmc6fCcsXG4gICAgJzpzdmc6dXNlXjpzdmc6Z3JhcGhpY3N8JyxcbiAgICAnOnN2Zzp2aWV3Xjpzdmc6fCN6b29tQW5kUGFuJyxcbiAgICAnZGF0YV5bSFRNTEVsZW1lbnRdfHZhbHVlJyxcbiAgICAna2V5Z2VuXltIVE1MRWxlbWVudF18IWF1dG9mb2N1cyxjaGFsbGVuZ2UsIWRpc2FibGVkLGZvcm0sa2V5dHlwZSxuYW1lJyxcbiAgICAnbWVudWl0ZW1eW0hUTUxFbGVtZW50XXx0eXBlLGxhYmVsLGljb24sIWRpc2FibGVkLCFjaGVja2VkLHJhZGlvZ3JvdXAsIWRlZmF1bHQnLFxuICAgICdzdW1tYXJ5XltIVE1MRWxlbWVudF18JyxcbiAgICAndGltZV5bSFRNTEVsZW1lbnRdfGRhdGVUaW1lJyxcbiAgICAnOnN2ZzpjdXJzb3JeOnN2Zzp8Jyxcbl07XG52YXIgX0FUVFJfVE9fUFJPUCA9IHtcbiAgICAnY2xhc3MnOiAnY2xhc3NOYW1lJyxcbiAgICAnZm9yJzogJ2h0bWxGb3InLFxuICAgICdmb3JtYWN0aW9uJzogJ2Zvcm1BY3Rpb24nLFxuICAgICdpbm5lckh0bWwnOiAnaW5uZXJIVE1MJyxcbiAgICAncmVhZG9ubHknOiAncmVhZE9ubHknLFxuICAgICd0YWJpbmRleCc6ICd0YWJJbmRleCcsXG59O1xudmFyIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX3NjaGVtYSA9IHt9O1xuICAgICAgICBTQ0hFTUEuZm9yRWFjaChmdW5jdGlvbiAoZW5jb2RlZFR5cGUpIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0ge307XG4gICAgICAgICAgICB2YXIgX2EgPSBfX3JlYWQoZW5jb2RlZFR5cGUuc3BsaXQoJ3wnKSwgMiksIHN0clR5cGUgPSBfYVswXSwgc3RyUHJvcGVydGllcyA9IF9hWzFdO1xuICAgICAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBzdHJQcm9wZXJ0aWVzLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB2YXIgX2IgPSBfX3JlYWQoc3RyVHlwZS5zcGxpdCgnXicpLCAyKSwgdHlwZU5hbWVzID0gX2JbMF0sIHN1cGVyTmFtZSA9IF9iWzFdO1xuICAgICAgICAgICAgdHlwZU5hbWVzLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAodGFnKSB7IHJldHVybiBfdGhpcy5fc2NoZW1hW3RhZy50b0xvd2VyQ2FzZSgpXSA9IHR5cGU7IH0pO1xuICAgICAgICAgICAgdmFyIHN1cGVyVHlwZSA9IHN1cGVyTmFtZSAmJiBfdGhpcy5fc2NoZW1hW3N1cGVyTmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICAgIGlmIChzdXBlclR5cGUpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzdXBlclR5cGUpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHsgdHlwZVtwcm9wXSA9IHN1cGVyVHlwZVtwcm9wXTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgeWV0IHN1cHBvcnQgZXZlbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGV2ZXIgYWxsb3dpbmcgdG8gYmluZCB0byBldmVudHMsIEdPIFRIUk9VR0ggQSBTRUNVUklUWSBSRVZJRVcsIGFsbG93aW5nIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbG1vc3QgY2VydGFpbmx5IGludHJvZHVjZSBiYWQgWFNTIHZ1bG5lcmFiaWxpdGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlW3Byb3BlcnR5LnN1YnN0cmluZygxKV0gPSBFVkVOVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVbcHJvcGVydHkuc3Vic3RyaW5nKDEpXSA9IEJPT0xFQU47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlW3Byb3BlcnR5LnN1YnN0cmluZygxKV0gPSBOVU1CRVI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlW3Byb3BlcnR5LnN1YnN0cmluZygxKV0gPSBPQkpFQ1Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVbcHJvcGVydHldID0gU1RSSU5HO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuaGFzUHJvcGVydHkgPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcE5hbWUsIHNjaGVtYU1ldGFzKSB7XG4gICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBOT19FUlJPUlNfU0NIRU1BLm5hbWU7IH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgaWYgKGlzTmdDb250YWluZXIodGFnTmFtZSkgfHwgaXNOZ0NvbnRlbnQodGFnTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2NoZW1hTWV0YXMuc29tZShmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEubmFtZSA9PT0gQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQS5uYW1lOyB9KSkge1xuICAgICAgICAgICAgICAgIC8vIENhbid0IHRlbGwgbm93IGFzIHdlIGRvbid0IGtub3cgd2hpY2ggcHJvcGVydGllcyBhIGN1c3RvbSBlbGVtZW50IHdpbGwgZ2V0XG4gICAgICAgICAgICAgICAgLy8gb25jZSBpdCBpcyBpbnN0YW50aWF0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxlbWVudFByb3BlcnRpZXMgPSB0aGlzLl9zY2hlbWFbdGFnTmFtZS50b0xvd2VyQ2FzZSgpXSB8fCB0aGlzLl9zY2hlbWFbJ3Vua25vd24nXTtcbiAgICAgICAgcmV0dXJuICEhZWxlbWVudFByb3BlcnRpZXNbcHJvcE5hbWVdO1xuICAgIH07XG4gICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5oYXNFbGVtZW50ID0gZnVuY3Rpb24gKHRhZ05hbWUsIHNjaGVtYU1ldGFzKSB7XG4gICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBOT19FUlJPUlNfU0NIRU1BLm5hbWU7IH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgaWYgKGlzTmdDb250YWluZXIodGFnTmFtZSkgfHwgaXNOZ0NvbnRlbnQodGFnTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzY2hlbWFNZXRhcy5zb21lKGZ1bmN0aW9uIChzY2hlbWEpIHsgcmV0dXJuIHNjaGVtYS5uYW1lID09PSBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLm5hbWU7IH0pKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgYW55IGN1c3RvbSBlbGVtZW50c1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXRoaXMuX3NjaGVtYVt0YWdOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogc2VjdXJpdHlDb250ZXh0IHJldHVybnMgdGhlIHNlY3VyaXR5IGNvbnRleHQgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRE9NIHRhZy5cbiAgICAgKlxuICAgICAqIFRhZyBhbmQgcHJvcGVydHkgbmFtZSBhcmUgc3RhdGljYWxseSBrbm93biBhbmQgY2Fubm90IGNoYW5nZSBhdCBydW50aW1lLCBpLmUuIGl0IGlzIG5vdFxuICAgICAqIHBvc3NpYmxlIHRvIGJpbmQgYSB2YWx1ZSBpbnRvIGEgY2hhbmdpbmcgYXR0cmlidXRlIG9yIHRhZyBuYW1lLlxuICAgICAqXG4gICAgICogVGhlIGZpbHRlcmluZyBpcyBiYXNlZCBvbiBhIGxpc3Qgb2YgYWxsb3dlZCB0YWdzfGF0dHJpYnV0ZXMuIEFsbCBhdHRyaWJ1dGVzIGluIHRoZSBzY2hlbWFcbiAgICAgKiBhYm92ZSBhcmUgYXNzdW1lZCB0byBoYXZlIHRoZSAnTk9ORScgc2VjdXJpdHkgY29udGV4dCwgaS5lLiB0aGF0IHRoZXkgYXJlIHNhZmUgaW5lcnRcbiAgICAgKiBzdHJpbmcgdmFsdWVzLiBPbmx5IHNwZWNpZmljIHdlbGwga25vd24gYXR0YWNrIHZlY3RvcnMgYXJlIGFzc2lnbmVkIHRoZWlyIGFwcHJvcHJpYXRlIGNvbnRleHQuXG4gICAgICovXG4gICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5zZWN1cml0eUNvbnRleHQgPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcE5hbWUsIGlzQXR0cmlidXRlKSB7XG4gICAgICAgIGlmIChpc0F0dHJpYnV0ZSkge1xuICAgICAgICAgICAgLy8gTkI6IEZvciBzZWN1cml0eSBwdXJwb3NlcywgdXNlIHRoZSBtYXBwZWQgcHJvcGVydHkgbmFtZSwgbm90IHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgICAgICAgIHByb3BOYW1lID0gdGhpcy5nZXRNYXBwZWRQcm9wTmFtZShwcm9wTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFrZSBzdXJlIGNvbXBhcmlzb25zIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBzbyB0aGF0IGNhc2UgZGlmZmVyZW5jZXMgYmV0d2VlbiBhdHRyaWJ1dGUgYW5kXG4gICAgICAgIC8vIHByb3BlcnR5IG5hbWVzIGRvIG5vdCBoYXZlIGEgc2VjdXJpdHkgaW1wYWN0LlxuICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwcm9wTmFtZSA9IHByb3BOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBjdHggPSBTRUNVUklUWV9TQ0hFTUEoKVt0YWdOYW1lICsgJ3wnICsgcHJvcE5hbWVdO1xuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgICByZXR1cm4gY3R4O1xuICAgICAgICB9XG4gICAgICAgIGN0eCA9IFNFQ1VSSVRZX1NDSEVNQSgpWycqfCcgKyBwcm9wTmFtZV07XG4gICAgICAgIHJldHVybiBjdHggPyBjdHggOiBTZWN1cml0eUNvbnRleHQuTk9ORTtcbiAgICB9O1xuICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuZ2V0TWFwcGVkUHJvcE5hbWUgPSBmdW5jdGlvbiAocHJvcE5hbWUpIHsgcmV0dXJuIF9BVFRSX1RPX1BST1BbcHJvcE5hbWVdIHx8IHByb3BOYW1lOyB9O1xuICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXBvbmVudEVsZW1lbnROYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ25nLWNvbXBvbmVudCc7IH07XG4gICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS52YWxpZGF0ZVByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJCaW5kaW5nIHRvIGV2ZW50IHByb3BlcnR5ICdcIiArIG5hbWUgKyBcIicgaXMgZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucywgXCIgK1xuICAgICAgICAgICAgICAgIChcInBsZWFzZSB1c2UgKFwiICsgbmFtZS5zbGljZSgyKSArIFwiKT0uLi5cIikgK1xuICAgICAgICAgICAgICAgIChcIlxcbklmICdcIiArIG5hbWUgKyBcIicgaXMgYSBkaXJlY3RpdmUgaW5wdXQsIG1ha2Ugc3VyZSB0aGUgZGlyZWN0aXZlIGlzIGltcG9ydGVkIGJ5IHRoZVwiKSArXG4gICAgICAgICAgICAgICAgXCIgY3VycmVudCBtb2R1bGUuXCI7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbXNnOiBtc2cgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkucHJvdG90eXBlLnZhbGlkYXRlQXR0cmlidXRlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdvbicpKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gXCJCaW5kaW5nIHRvIGV2ZW50IGF0dHJpYnV0ZSAnXCIgKyBuYW1lICsgXCInIGlzIGRpc2FsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIFwiICtcbiAgICAgICAgICAgICAgICAoXCJwbGVhc2UgdXNlIChcIiArIG5hbWUuc2xpY2UoMikgKyBcIik9Li4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1zZzogbXNnIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5hbGxLbm93bkVsZW1lbnROYW1lcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3NjaGVtYSk7IH07XG4gICAgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LnByb3RvdHlwZS5ub3JtYWxpemVBbmltYXRpb25TdHlsZVByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgIHJldHVybiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKHByb3BOYW1lKTtcbiAgICB9O1xuICAgIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeS5wcm90b3R5cGUubm9ybWFsaXplQW5pbWF0aW9uU3R5bGVWYWx1ZSA9IGZ1bmN0aW9uIChjYW1lbENhc2VQcm9wLCB1c2VyUHJvdmlkZWRQcm9wLCB2YWwpIHtcbiAgICAgICAgdmFyIHVuaXQgPSAnJztcbiAgICAgICAgdmFyIHN0clZhbCA9IHZhbC50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgdmFyIGVycm9yTXNnID0gbnVsbDtcbiAgICAgICAgaWYgKF9pc1BpeGVsRGltZW5zaW9uU3R5bGUoY2FtZWxDYXNlUHJvcCkgJiYgdmFsICE9PSAwICYmIHZhbCAhPT0gJzAnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWxBbmRTdWZmaXhNYXRjaCA9IHZhbC5tYXRjaCgvXlsrLV0/W1xcZFxcLl0rKFthLXpdKikkLyk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbEFuZFN1ZmZpeE1hdGNoICYmIHZhbEFuZFN1ZmZpeE1hdGNoWzFdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTXNnID0gXCJQbGVhc2UgcHJvdmlkZSBhIENTUyB1bml0IHZhbHVlIGZvciBcIiArIHVzZXJQcm92aWRlZFByb3AgKyBcIjpcIiArIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVycm9yTXNnLCB2YWx1ZTogc3RyVmFsICsgdW5pdCB9O1xuICAgIH07XG4gICAgcmV0dXJuIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeTtcbn0oRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KSk7XG5mdW5jdGlvbiBfaXNQaXhlbERpbWVuc2lvblN0eWxlKHByb3ApIHtcbiAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjYXNlICdoZWlnaHQnOlxuICAgICAgICBjYXNlICdtaW5XaWR0aCc6XG4gICAgICAgIGNhc2UgJ21pbkhlaWdodCc6XG4gICAgICAgIGNhc2UgJ21heFdpZHRoJzpcbiAgICAgICAgY2FzZSAnbWF4SGVpZ2h0JzpcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgY2FzZSAnZm9udFNpemUnOlxuICAgICAgICBjYXNlICdvdXRsaW5lV2lkdGgnOlxuICAgICAgICBjYXNlICdvdXRsaW5lT2Zmc2V0JzpcbiAgICAgICAgY2FzZSAncGFkZGluZ1RvcCc6XG4gICAgICAgIGNhc2UgJ3BhZGRpbmdMZWZ0JzpcbiAgICAgICAgY2FzZSAncGFkZGluZ0JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ3BhZGRpbmdSaWdodCc6XG4gICAgICAgIGNhc2UgJ21hcmdpblRvcCc6XG4gICAgICAgIGNhc2UgJ21hcmdpbkxlZnQnOlxuICAgICAgICBjYXNlICdtYXJnaW5Cb3R0b20nOlxuICAgICAgICBjYXNlICdtYXJnaW5SaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvcmRlclJhZGl1cyc6XG4gICAgICAgIGNhc2UgJ2JvcmRlcldpZHRoJzpcbiAgICAgICAgY2FzZSAnYm9yZGVyVG9wV2lkdGgnOlxuICAgICAgICBjYXNlICdib3JkZXJMZWZ0V2lkdGgnOlxuICAgICAgICBjYXNlICdib3JkZXJSaWdodFdpZHRoJzpcbiAgICAgICAgY2FzZSAnYm9yZGVyQm90dG9tV2lkdGgnOlxuICAgICAgICBjYXNlICd0ZXh0SW5kZW50JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEJJTkRfTkFNRV9SRUdFWFAkMSA9IC9eKD86KD86KD86KGJpbmQtKXwobGV0LSl8KHJlZi18Iyl8KG9uLSl8KGJpbmRvbi0pfChAKSkoLispKXxcXFtcXCgoW15cXCldKylcXClcXF18XFxbKFteXFxdXSspXFxdfFxcKChbXlxcKV0rKVxcKSkkLztcbi8vIEdyb3VwIDEgPSBcImJpbmQtXCJcbnZhciBLV19CSU5EX0lEWCQxID0gMTtcbi8vIEdyb3VwIDIgPSBcImxldC1cIlxudmFyIEtXX0xFVF9JRFgkMSA9IDI7XG4vLyBHcm91cCAzID0gXCJyZWYtLyNcIlxudmFyIEtXX1JFRl9JRFgkMSA9IDM7XG4vLyBHcm91cCA0ID0gXCJvbi1cIlxudmFyIEtXX09OX0lEWCQxID0gNDtcbi8vIEdyb3VwIDUgPSBcImJpbmRvbi1cIlxudmFyIEtXX0JJTkRPTl9JRFgkMSA9IDU7XG4vLyBHcm91cCA2ID0gXCJAXCJcbnZhciBLV19BVF9JRFgkMSA9IDY7XG4vLyBHcm91cCA3ID0gdGhlIGlkZW50aWZpZXIgYWZ0ZXIgXCJiaW5kLVwiLCBcImxldC1cIiwgXCJyZWYtLyNcIiwgXCJvbi1cIiwgXCJiaW5kb24tXCIgb3IgXCJAXCJcbnZhciBJREVOVF9LV19JRFgkMSA9IDc7XG4vLyBHcm91cCA4ID0gaWRlbnRpZmllciBpbnNpZGUgWygpXVxudmFyIElERU5UX0JBTkFOQV9CT1hfSURYJDEgPSA4O1xuLy8gR3JvdXAgOSA9IGlkZW50aWZpZXIgaW5zaWRlIFtdXG52YXIgSURFTlRfUFJPUEVSVFlfSURYJDEgPSA5O1xuLy8gR3JvdXAgMTAgPSBpZGVudGlmaWVyIGluc2lkZSAoKVxudmFyIElERU5UX0VWRU5UX0lEWCQxID0gMTA7XG52YXIgVEVNUExBVEVfQVRUUl9QUkVGSVgkMSA9ICcqJztcbmZ1bmN0aW9uIGh0bWxBc3RUb1JlbmRlcjNBc3QoaHRtbE5vZGVzLCBiaW5kaW5nUGFyc2VyKSB7XG4gICAgdmFyIHRyYW5zZm9ybWVyID0gbmV3IEh0bWxBc3RUb0l2eUFzdChiaW5kaW5nUGFyc2VyKTtcbiAgICB2YXIgaXZ5Tm9kZXMgPSB2aXNpdEFsbCQxKHRyYW5zZm9ybWVyLCBodG1sTm9kZXMpO1xuICAgIC8vIEVycm9ycyBtaWdodCBvcmlnaW5hdGUgaW4gZWl0aGVyIHRoZSBiaW5kaW5nIHBhcnNlciBvciB0aGUgaHRtbCB0byBpdnkgdHJhbnNmb3JtZXJcbiAgICB2YXIgYWxsRXJyb3JzID0gYmluZGluZ1BhcnNlci5lcnJvcnMuY29uY2F0KHRyYW5zZm9ybWVyLmVycm9ycyk7XG4gICAgdmFyIGVycm9ycyA9IGFsbEVycm9ycy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUubGV2ZWwgPT09IFBhcnNlRXJyb3JMZXZlbC5FUlJPUjsgfSk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBlcnJvclN0cmluZyA9IGVycm9ycy5qb2luKCdcXG4nKTtcbiAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoXCJUZW1wbGF0ZSBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvclN0cmluZywgZXJyb3JzKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZXM6IGl2eU5vZGVzLFxuICAgICAgICBlcnJvcnM6IGFsbEVycm9ycyxcbiAgICAgICAgc3R5bGVVcmxzOiB0cmFuc2Zvcm1lci5zdHlsZVVybHMsXG4gICAgICAgIHN0eWxlczogdHJhbnNmb3JtZXIuc3R5bGVzLFxuICAgIH07XG59XG52YXIgSHRtbEFzdFRvSXZ5QXN0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEh0bWxBc3RUb0l2eUFzdChiaW5kaW5nUGFyc2VyKSB7XG4gICAgICAgIHRoaXMuYmluZGluZ1BhcnNlciA9IGJpbmRpbmdQYXJzZXI7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMuc3R5bGVzID0gW107XG4gICAgICAgIHRoaXMuc3R5bGVVcmxzID0gW107XG4gICAgfVxuICAgIC8vIEhUTUwgdmlzaXRvclxuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHZhciBwcmVwYXJzZWRFbGVtZW50ID0gcHJlcGFyc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TQ1JJUFQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50cyA9IHRleHRDb250ZW50cyhlbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChjb250ZW50cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVzLnB1c2goY29udGVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUICYmXG4gICAgICAgICAgICBpc1N0eWxlVXJsUmVzb2x2YWJsZShwcmVwYXJzZWRFbGVtZW50LmhyZWZBdHRyKSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZVVybHMucHVzaChwcmVwYXJzZWRFbGVtZW50LmhyZWZBdHRyKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYSBgPG5nLXRlbXBsYXRlPmBcbiAgICAgICAgdmFyIGlzVGVtcGxhdGVFbGVtZW50ID0gaXNOZ1RlbXBsYXRlKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIHZhciBwYXJzZWRQcm9wZXJ0aWVzID0gW107XG4gICAgICAgIHZhciBib3VuZEV2ZW50cyA9IFtdO1xuICAgICAgICB2YXIgdmFyaWFibGVzID0gW107XG4gICAgICAgIHZhciByZWZlcmVuY2VzID0gW107XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gW107XG4gICAgICAgIHZhciBpMThuQXR0cnNNZXRhID0ge307XG4gICAgICAgIHZhciB0ZW1wbGF0ZVBhcnNlZFByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgdmFyIHRlbXBsYXRlVmFyaWFibGVzID0gW107XG4gICAgICAgIC8vIFdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGFueSAqLWF0dHJpYnV0ZVxuICAgICAgICB2YXIgZWxlbWVudEhhc0lubGluZVRlbXBsYXRlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKGVsZW1lbnQuYXR0cnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBoYXNCaW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWROYW1lID0gbm9ybWFsaXplQXR0cmlidXRlTmFtZShhdHRyaWJ1dGUubmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gYCphdHRyYCBkZWZpbmVzIHRlbXBsYXRlIGJpbmRpbmdzXG4gICAgICAgICAgICAgICAgdmFyIGlzVGVtcGxhdGVCaW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5pMThuKSB7XG4gICAgICAgICAgICAgICAgICAgIGkxOG5BdHRyc01ldGFbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLmkxOG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkTmFtZS5zdGFydHNXaXRoKFRFTVBMQVRFX0FUVFJfUFJFRklYJDEpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICotYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEhhc0lubGluZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKFwiQ2FuJ3QgaGF2ZSBtdWx0aXBsZSB0ZW1wbGF0ZSBiaW5kaW5ncyBvbiBvbmUgZWxlbWVudC4gVXNlIG9ubHkgb25lIGF0dHJpYnV0ZSBwcmVmaXhlZCB3aXRoICpcIiwgYXR0cmlidXRlLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzVGVtcGxhdGVCaW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEhhc0lubGluZVRlbXBsYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlVmFsdWUgPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUtleSA9IG5vcm1hbGl6ZWROYW1lLnN1YnN0cmluZyhURU1QTEFURV9BVFRSX1BSRUZJWCQxLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWRWYXJpYWJsZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nUGFyc2VyLnBhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nKHRlbXBsYXRlS2V5LCB0ZW1wbGF0ZVZhbHVlLCBhdHRyaWJ1dGUuc291cmNlU3BhbiwgW10sIHRlbXBsYXRlUGFyc2VkUHJvcGVydGllcywgcGFyc2VkVmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVWYXJpYWJsZXMucHVzaC5hcHBseSh0ZW1wbGF0ZVZhcmlhYmxlcywgX19zcHJlYWQocGFyc2VkVmFyaWFibGVzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFZhcmlhYmxlKHYubmFtZSwgdi52YWx1ZSwgdi5zb3VyY2VTcGFuKTsgfSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YXJpYWJsZXMsIGV2ZW50cywgcHJvcGVydHkgYmluZGluZ3MsIGludGVycG9sYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaGFzQmluZGluZyA9IHRoaXMucGFyc2VBdHRyaWJ1dGUoaXNUZW1wbGF0ZUVsZW1lbnQsIGF0dHJpYnV0ZSwgW10sIHBhcnNlZFByb3BlcnRpZXMsIGJvdW5kRXZlbnRzLCB2YXJpYWJsZXMsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWhhc0JpbmRpbmcgJiYgIWlzVGVtcGxhdGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgdGhlIGJpbmRpbmdzIGFzIGF0dHJpYnV0ZXMgYXMgd2VsbCBpbiB0aGUgQVNUXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCh0aGlzLnZpc2l0QXR0cmlidXRlKGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHZpc2l0QWxsJDEocHJlcGFyc2VkRWxlbWVudC5ub25CaW5kYWJsZSA/IE5PTl9CSU5EQUJMRV9WSVNJVE9SJDEgOiB0aGlzLCBlbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgdmFyIHBhcnNlZEVsZW1lbnQ7XG4gICAgICAgIGlmIChwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLk5HX0NPTlRFTlQpIHtcbiAgICAgICAgICAgIC8vIGA8bmctY29udGVudD5gXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJlxuICAgICAgICAgICAgICAgICFlbGVtZW50LmNoaWxkcmVuLmV2ZXJ5KGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBpc0VtcHR5VGV4dE5vZGUobm9kZSkgfHwgaXNDb21tZW50Tm9kZShub2RlKTsgfSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKFwiPG5nLWNvbnRlbnQ+IGVsZW1lbnQgY2Fubm90IGhhdmUgY29udGVudC5cIiwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IHByZXBhcnNlZEVsZW1lbnQuc2VsZWN0QXR0cjtcbiAgICAgICAgICAgIHZhciBhdHRycyA9IGVsZW1lbnQuYXR0cnMubWFwKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBfdGhpcy52aXNpdEF0dHJpYnV0ZShhdHRyKTsgfSk7XG4gICAgICAgICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IENvbnRlbnQoc2VsZWN0b3IsIGF0dHJzLCBlbGVtZW50LnNvdXJjZVNwYW4sIGVsZW1lbnQuaTE4bik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGA8bmctdGVtcGxhdGU+YFxuICAgICAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5leHRyYWN0QXR0cmlidXRlcyhlbGVtZW50Lm5hbWUsIHBhcnNlZFByb3BlcnRpZXMsIGkxOG5BdHRyc01ldGEpO1xuICAgICAgICAgICAgcGFyc2VkRWxlbWVudCA9IG5ldyBUZW1wbGF0ZShlbGVtZW50Lm5hbWUsIGF0dHJpYnV0ZXMsIGF0dHJzLmJvdW5kLCBib3VuZEV2ZW50cywgWyAvKiBubyB0ZW1wbGF0ZSBhdHRyaWJ1dGVzICovXSwgY2hpbGRyZW4sIHJlZmVyZW5jZXMsIHZhcmlhYmxlcywgZWxlbWVudC5zb3VyY2VTcGFuLCBlbGVtZW50LnN0YXJ0U291cmNlU3BhbiwgZWxlbWVudC5lbmRTb3VyY2VTcGFuLCBlbGVtZW50LmkxOG4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGF0dHJzID0gdGhpcy5leHRyYWN0QXR0cmlidXRlcyhlbGVtZW50Lm5hbWUsIHBhcnNlZFByb3BlcnRpZXMsIGkxOG5BdHRyc01ldGEpO1xuICAgICAgICAgICAgcGFyc2VkRWxlbWVudCA9IG5ldyBFbGVtZW50KGVsZW1lbnQubmFtZSwgYXR0cmlidXRlcywgYXR0cnMuYm91bmQsIGJvdW5kRXZlbnRzLCBjaGlsZHJlbiwgcmVmZXJlbmNlcywgZWxlbWVudC5zb3VyY2VTcGFuLCBlbGVtZW50LnN0YXJ0U291cmNlU3BhbiwgZWxlbWVudC5lbmRTb3VyY2VTcGFuLCBlbGVtZW50LmkxOG4pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50SGFzSW5saW5lVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgbm9kZSBpcyBhbiBpbmxpbmUtdGVtcGxhdGUgKGUuZy4gaGFzICpuZ0ZvcikgdGhlbiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHRlbXBsYXRlXG4gICAgICAgICAgICAvLyBub2RlIHRoYXQgY29udGFpbnMgdGhpcyBub2RlLlxuICAgICAgICAgICAgLy8gTW9yZW92ZXIsIGlmIHRoZSBub2RlIGlzIGFuIGVsZW1lbnQsIHRoZW4gd2UgbmVlZCB0byBob2lzdCBpdHMgYXR0cmlidXRlcyB0byB0aGUgdGVtcGxhdGVcbiAgICAgICAgICAgIC8vIG5vZGUgZm9yIG1hdGNoaW5nIGFnYWluc3QgY29udGVudCBwcm9qZWN0aW9uIHNlbGVjdG9ycy5cbiAgICAgICAgICAgIHZhciBhdHRycyA9IHRoaXMuZXh0cmFjdEF0dHJpYnV0ZXMoJ25nLXRlbXBsYXRlJywgdGVtcGxhdGVQYXJzZWRQcm9wZXJ0aWVzLCBpMThuQXR0cnNNZXRhKTtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZUF0dHJzXzEgPSBbXTtcbiAgICAgICAgICAgIGF0dHJzLmxpdGVyYWwuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gdGVtcGxhdGVBdHRyc18xLnB1c2goYXR0cik7IH0pO1xuICAgICAgICAgICAgYXR0cnMuYm91bmQuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gdGVtcGxhdGVBdHRyc18xLnB1c2goYXR0cik7IH0pO1xuICAgICAgICAgICAgdmFyIGhvaXN0ZWRBdHRycyA9IHBhcnNlZEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50ID9cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHBhcnNlZEVsZW1lbnQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBwYXJzZWRFbGVtZW50LmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogcGFyc2VkRWxlbWVudC5vdXRwdXRzLFxuICAgICAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAgICAgIHsgYXR0cmlidXRlczogW10sIGlucHV0czogW10sIG91dHB1dHM6IFtdIH07XG4gICAgICAgICAgICAvLyBUT0RPKHBrKTogdGVzdCBmb3IgdGhpcyBjYXNlXG4gICAgICAgICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IFRlbXBsYXRlKHBhcnNlZEVsZW1lbnQubmFtZSwgaG9pc3RlZEF0dHJzLmF0dHJpYnV0ZXMsIGhvaXN0ZWRBdHRycy5pbnB1dHMsIGhvaXN0ZWRBdHRycy5vdXRwdXRzLCB0ZW1wbGF0ZUF0dHJzXzEsIFtwYXJzZWRFbGVtZW50XSwgWyAvKiBubyByZWZlcmVuY2VzICovXSwgdGVtcGxhdGVWYXJpYWJsZXMsIGVsZW1lbnQuc291cmNlU3BhbiwgZWxlbWVudC5zdGFydFNvdXJjZVNwYW4sIGVsZW1lbnQuZW5kU291cmNlU3BhbiwgZWxlbWVudC5pMThuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VkRWxlbWVudDtcbiAgICB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLnZhbHVlLCBhdHRyaWJ1dGUuc291cmNlU3BhbiwgYXR0cmlidXRlLnZhbHVlU3BhbiwgYXR0cmlidXRlLmkxOG4pO1xuICAgIH07XG4gICAgSHRtbEFzdFRvSXZ5QXN0LnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRUZXh0V2l0aEludGVycG9sYXRpb24odGV4dC52YWx1ZSwgdGV4dC5zb3VyY2VTcGFuLCB0ZXh0LmkxOG4pO1xuICAgIH07XG4gICAgSHRtbEFzdFRvSXZ5QXN0LnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChleHBhbnNpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1ldGEgPSBleHBhbnNpb24uaTE4bjtcbiAgICAgICAgLy8gZG8gbm90IGdlbmVyYXRlIEljdSBpbiBjYXNlIGl0IHdhcyBjcmVhdGVkXG4gICAgICAgIC8vIG91dHNpZGUgb2YgaTE4biBibG9jayBpbiBhIHRlbXBsYXRlXG4gICAgICAgIGlmICghbWV0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhcnMgPSB7fTtcbiAgICAgICAgdmFyIHBsYWNlaG9sZGVycyA9IHt9O1xuICAgICAgICAvLyBleHRyYWN0IFZBUnMgZnJvbSBJQ1VzIC0gd2UgcHJvY2VzcyB0aGVtIHNlcGFyYXRlbHkgd2hpbGVcbiAgICAgICAgLy8gYXNzZW1ibGluZyByZXN1bHRpbmcgbWVzc2FnZSB2aWEgZ29vZy5nZXRNc2cgZnVuY3Rpb24sIHNpbmNlXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gcGFzcyB0aGVtIHRvIHRvcC1sZXZlbCBnb29nLmdldE1zZyBjYWxsXG4gICAgICAgIE9iamVjdC5rZXlzKG1ldGEucGxhY2Vob2xkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IG1ldGEucGxhY2Vob2xkZXJzW2tleV07XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoSTE4Tl9JQ1VfVkFSX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gX3RoaXMuYmluZGluZ1BhcnNlci5pbnRlcnBvbGF0aW9uQ29uZmlnO1xuICAgICAgICAgICAgICAgIC8vIElDVSBleHByZXNzaW9uIGlzIGEgcGxhaW4gc3RyaW5nLCBub3Qgd3JhcHBlZCBpbnRvIHN0YXJ0XG4gICAgICAgICAgICAgICAgLy8gYW5kIGVuZCB0YWdzLCBzbyB3ZSB3cmFwIGl0IGJlZm9yZSBwYXNzaW5nIHRvIGJpbmRpbmcgcGFyc2VyXG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZWQgPSBcIlwiICsgY29uZmlnLnN0YXJ0ICsgdmFsdWUgKyBjb25maWcuZW5kO1xuICAgICAgICAgICAgICAgIHZhcnNba2V5XSA9IF90aGlzLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbih3cmFwcGVkLCBleHBhbnNpb24uc291cmNlU3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcnNba2V5XSA9IF90aGlzLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbih2YWx1ZSwgZXhwYW5zaW9uLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBJY3UodmFycywgcGxhY2Vob2xkZXJzLCBleHBhbnNpb24uc291cmNlU3BhbiwgbWV0YSk7XG4gICAgfTtcbiAgICBIdG1sQXN0VG9JdnlBc3QucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChleHBhbnNpb25DYXNlKSB7IHJldHVybiBudWxsOyB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgLy8gY29udmVydCB2aWV3IGVuZ2luZSBgUGFyc2VkUHJvcGVydHlgIHRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBJVllcbiAgICBIdG1sQXN0VG9JdnlBc3QucHJvdG90eXBlLmV4dHJhY3RBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGVsZW1lbnROYW1lLCBwcm9wZXJ0aWVzLCBpMThuUHJvcHNNZXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBib3VuZCA9IFtdO1xuICAgICAgICB2YXIgbGl0ZXJhbCA9IFtdO1xuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgIHZhciBpMThuID0gaTE4blByb3BzTWV0YVtwcm9wLm5hbWVdO1xuICAgICAgICAgICAgaWYgKHByb3AuaXNMaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgbGl0ZXJhbC5wdXNoKG5ldyBUZXh0QXR0cmlidXRlKHByb3AubmFtZSwgcHJvcC5leHByZXNzaW9uLnNvdXJjZSB8fCAnJywgcHJvcC5zb3VyY2VTcGFuLCB1bmRlZmluZWQsIGkxOG4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB2YWxpZGF0aW9uIGlzIHNraXBwZWQgYW5kIHByb3BlcnR5IG1hcHBpbmcgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAvLyBkdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhIGdpdmVuIHByb3AgaXMgbm90IGFuXG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgb2YgYSBkaXJlY3RpdmUgYW5kIGRpcmVjdGl2ZSBtYXRjaGluZyBoYXBwZW5zIGF0IHJ1bnRpbWUuXG4gICAgICAgICAgICAgICAgdmFyIGJlcCA9IF90aGlzLmJpbmRpbmdQYXJzZXIuY3JlYXRlQm91bmRFbGVtZW50UHJvcGVydHkoZWxlbWVudE5hbWUsIHByb3AsIC8qIHNraXBWYWxpZGF0aW9uICovIHRydWUsIC8qIG1hcFByb3BlcnR5TmFtZSAqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYm91bmQucHVzaChCb3VuZEF0dHJpYnV0ZS5mcm9tQm91bmRFbGVtZW50UHJvcGVydHkoYmVwLCBpMThuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBib3VuZDogYm91bmQsIGxpdGVyYWw6IGxpdGVyYWwgfTtcbiAgICB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUucGFyc2VBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoaXNUZW1wbGF0ZUVsZW1lbnQsIGF0dHJpYnV0ZSwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcywgYm91bmRFdmVudHMsIHZhcmlhYmxlcywgcmVmZXJlbmNlcykge1xuICAgICAgICB2YXIgbmFtZSA9IG5vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlLm5hbWUpO1xuICAgICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgICAgIHZhciBzcmNTcGFuID0gYXR0cmlidXRlLnNvdXJjZVNwYW47XG4gICAgICAgIHZhciBiaW5kUGFydHMgPSBuYW1lLm1hdGNoKEJJTkRfTkFNRV9SRUdFWFAkMSk7XG4gICAgICAgIHZhciBoYXNCaW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChiaW5kUGFydHMpIHtcbiAgICAgICAgICAgIGhhc0JpbmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGJpbmRQYXJ0c1tLV19CSU5EX0lEWCQxXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9LV19JRFgkMV0sIHZhbHVlLCBmYWxzZSwgc3JjU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbS1dfTEVUX0lEWCQxXSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWRlbnRpZmllciA9IGJpbmRQYXJ0c1tJREVOVF9LV19JRFgkMV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VWYXJpYWJsZShpZGVudGlmaWVyLCB2YWx1ZSwgc3JjU3BhbiwgdmFyaWFibGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoXCJcXFwibGV0LVxcXCIgaXMgb25seSBzdXBwb3J0ZWQgb24gbmctdGVtcGxhdGUgZWxlbWVudHMuXCIsIHNyY1NwYW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tLV19SRUZfSURYJDFdKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkZW50aWZpZXIgPSBiaW5kUGFydHNbSURFTlRfS1dfSURYJDFdO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VSZWZlcmVuY2UoaWRlbnRpZmllciwgdmFsdWUsIHNyY1NwYW4sIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX09OX0lEWCQxXSkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRpbmdQYXJzZXIucGFyc2VFdmVudChiaW5kUGFydHNbSURFTlRfS1dfSURYJDFdLCB2YWx1ZSwgc3JjU3BhbiwgYXR0cmlidXRlLnZhbHVlU3BhbiB8fCBzcmNTcGFuLCBtYXRjaGFibGVBdHRyaWJ1dGVzLCBldmVudHMpO1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50cyhldmVudHMsIGJvdW5kRXZlbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tLV19CSU5ET05fSURYJDFdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9LV19JRFgkMV0sIHZhbHVlLCBmYWxzZSwgc3JjU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbSURFTlRfS1dfSURYJDFdLCB2YWx1ZSwgc3JjU3BhbiwgYXR0cmlidXRlLnZhbHVlU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgYm91bmRFdmVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYmluZFBhcnRzW0tXX0FUX0lEWCQxXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ1BhcnNlci5wYXJzZUxpdGVyYWxBdHRyKG5hbWUsIHZhbHVlLCBzcmNTcGFuLCBtYXRjaGFibGVBdHRyaWJ1dGVzLCBwYXJzZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJpbmRQYXJ0c1tJREVOVF9CQU5BTkFfQk9YX0lEWCQxXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ1BhcnNlci5wYXJzZVByb3BlcnR5QmluZGluZyhiaW5kUGFydHNbSURFTlRfQkFOQU5BX0JPWF9JRFgkMV0sIHZhbHVlLCBmYWxzZSwgc3JjU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbSURFTlRfQkFOQU5BX0JPWF9JRFgkMV0sIHZhbHVlLCBzcmNTcGFuLCBhdHRyaWJ1dGUudmFsdWVTcGFuLCBtYXRjaGFibGVBdHRyaWJ1dGVzLCBib3VuZEV2ZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbSURFTlRfUFJPUEVSVFlfSURYJDFdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nUGFyc2VyLnBhcnNlUHJvcGVydHlCaW5kaW5nKGJpbmRQYXJ0c1tJREVOVF9QUk9QRVJUWV9JRFgkMV0sIHZhbHVlLCBmYWxzZSwgc3JjU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChiaW5kUGFydHNbSURFTlRfRVZFTlRfSURYJDFdKSB7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ1BhcnNlci5wYXJzZUV2ZW50KGJpbmRQYXJ0c1tJREVOVF9FVkVOVF9JRFgkMV0sIHZhbHVlLCBzcmNTcGFuLCBhdHRyaWJ1dGUudmFsdWVTcGFuIHx8IHNyY1NwYW4sIG1hdGNoYWJsZUF0dHJpYnV0ZXMsIGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgYWRkRXZlbnRzKGV2ZW50cywgYm91bmRFdmVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFzQmluZGluZyA9IHRoaXMuYmluZGluZ1BhcnNlci5wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbihuYW1lLCB2YWx1ZSwgc3JjU3BhbiwgbWF0Y2hhYmxlQXR0cmlidXRlcywgcGFyc2VkUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0JpbmRpbmc7XG4gICAgfTtcbiAgICBIdG1sQXN0VG9JdnlBc3QucHJvdG90eXBlLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgc291cmNlU3BhbiwgaTE4bikge1xuICAgICAgICB2YXIgdmFsdWVOb05nc3AgPSByZXBsYWNlTmdzcCh2YWx1ZSk7XG4gICAgICAgIHZhciBleHByID0gdGhpcy5iaW5kaW5nUGFyc2VyLnBhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZU5vTmdzcCwgc291cmNlU3Bhbik7XG4gICAgICAgIHJldHVybiBleHByID8gbmV3IEJvdW5kVGV4dChleHByLCBzb3VyY2VTcGFuLCBpMThuKSA6IG5ldyBUZXh0KHZhbHVlTm9OZ3NwLCBzb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUucGFyc2VWYXJpYWJsZSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbiwgdmFyaWFibGVzKSB7XG4gICAgICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKFwiXFxcIi1cXFwiIGlzIG5vdCBhbGxvd2VkIGluIHZhcmlhYmxlIG5hbWVzXCIsIHNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIHZhcmlhYmxlcy5wdXNoKG5ldyBWYXJpYWJsZShpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbikpO1xuICAgIH07XG4gICAgSHRtbEFzdFRvSXZ5QXN0LnByb3RvdHlwZS5wYXJzZVJlZmVyZW5jZSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbiwgcmVmZXJlbmNlcykge1xuICAgICAgICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihcIlxcXCItXFxcIiBpcyBub3QgYWxsb3dlZCBpbiByZWZlcmVuY2UgbmFtZXNcIiwgc291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmVmZXJlbmNlcy5wdXNoKG5ldyBSZWZlcmVuY2UoaWRlbnRpZmllciwgdmFsdWUsIHNvdXJjZVNwYW4pKTtcbiAgICB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUucGFyc2VBc3NpZ25tZW50RXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgdmFsdWVTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgYm91bmRFdmVudHMpIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLmJpbmRpbmdQYXJzZXIucGFyc2VFdmVudChuYW1lICsgXCJDaGFuZ2VcIiwgZXhwcmVzc2lvbiArIFwiPSRldmVudFwiLCBzb3VyY2VTcGFuLCB2YWx1ZVNwYW4gfHwgc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsIGV2ZW50cyk7XG4gICAgICAgIGFkZEV2ZW50cyhldmVudHMsIGJvdW5kRXZlbnRzKTtcbiAgICB9O1xuICAgIEh0bWxBc3RUb0l2eUFzdC5wcm90b3R5cGUucmVwb3J0RXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZSwgc291cmNlU3BhbiwgbGV2ZWwpIHtcbiAgICAgICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSBQYXJzZUVycm9yTGV2ZWwuRVJST1I7IH1cbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2VFcnJvcihzb3VyY2VTcGFuLCBtZXNzYWdlLCBsZXZlbCkpO1xuICAgIH07XG4gICAgcmV0dXJuIEh0bWxBc3RUb0l2eUFzdDtcbn0oKSk7XG52YXIgTm9uQmluZGFibGVWaXNpdG9yJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9uQmluZGFibGVWaXNpdG9yKCkge1xuICAgIH1cbiAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgdmFyIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoYXN0KTtcbiAgICAgICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUIHx8XG4gICAgICAgICAgICBwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFIHx8XG4gICAgICAgICAgICBwcmVwYXJzZWRFbGVtZW50LnR5cGUgPT09IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVQpIHtcbiAgICAgICAgICAgIC8vIFNraXBwaW5nIDxzY3JpcHQ+IGZvciBzZWN1cml0eSByZWFzb25zXG4gICAgICAgICAgICAvLyBTa2lwcGluZyA8c3R5bGU+IGFuZCBzdHlsZXNoZWV0cyBhcyB3ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGVtXG4gICAgICAgICAgICAvLyBpbiB0aGUgU3R5bGVDb21waWxlclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdmlzaXRBbGwkMSh0aGlzLCBhc3QuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoYXN0Lm5hbWUsIHZpc2l0QWxsJDEodGhpcywgYXN0LmF0dHJzKSwgXG4gICAgICAgIC8qIGlucHV0cyAqLyBbXSwgLyogb3V0cHV0cyAqLyBbXSwgY2hpbGRyZW4sIC8qIHJlZmVyZW5jZXMgKi8gW10sIGFzdC5zb3VyY2VTcGFuLCBhc3Quc3RhcnRTb3VyY2VTcGFuLCBhc3QuZW5kU291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50KSB7IHJldHVybiBudWxsOyB9O1xuICAgIE5vbkJpbmRhYmxlVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLnZhbHVlLCBhdHRyaWJ1dGUuc291cmNlU3BhbiwgdW5kZWZpbmVkLCBhdHRyaWJ1dGUuaTE4bik7XG4gICAgfTtcbiAgICBOb25CaW5kYWJsZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7IHJldHVybiBuZXcgVGV4dCh0ZXh0LnZhbHVlLCB0ZXh0LnNvdXJjZVNwYW4pOyB9O1xuICAgIE5vbkJpbmRhYmxlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoZXhwYW5zaW9uKSB7IHJldHVybiBudWxsOyB9O1xuICAgIE5vbkJpbmRhYmxlVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGV4cGFuc2lvbkNhc2UpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgcmV0dXJuIE5vbkJpbmRhYmxlVmlzaXRvcjtcbn0oKSk7XG52YXIgTk9OX0JJTkRBQkxFX1ZJU0lUT1IkMSA9IG5ldyBOb25CaW5kYWJsZVZpc2l0b3IkMSgpO1xuZnVuY3Rpb24gbm9ybWFsaXplQXR0cmlidXRlTmFtZShhdHRyTmFtZSkge1xuICAgIHJldHVybiAvXmRhdGEtL2kudGVzdChhdHRyTmFtZSkgPyBhdHRyTmFtZS5zdWJzdHJpbmcoNSkgOiBhdHRyTmFtZTtcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50cyhldmVudHMsIGJvdW5kRXZlbnRzKSB7XG4gICAgYm91bmRFdmVudHMucHVzaC5hcHBseShib3VuZEV2ZW50cywgX19zcHJlYWQoZXZlbnRzLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gQm91bmRFdmVudC5mcm9tUGFyc2VkRXZlbnQoZSk7IH0pKSk7XG59XG5mdW5jdGlvbiBpc0VtcHR5VGV4dE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgVGV4dCQzICYmIG5vZGUudmFsdWUudHJpbSgpLmxlbmd0aCA9PSAwO1xufVxuZnVuY3Rpb24gaXNDb21tZW50Tm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBDb21tZW50O1xufVxuZnVuY3Rpb24gdGV4dENvbnRlbnRzKG5vZGUpIHtcbiAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggIT09IDEgfHwgIShub2RlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgVGV4dCQzKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuWzBdLnZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFRhZ1R5cGU7XG4oZnVuY3Rpb24gKFRhZ1R5cGUpIHtcbiAgICBUYWdUeXBlW1RhZ1R5cGVbXCJFTEVNRU5UXCJdID0gMF0gPSBcIkVMRU1FTlRcIjtcbiAgICBUYWdUeXBlW1RhZ1R5cGVbXCJURU1QTEFURVwiXSA9IDFdID0gXCJURU1QTEFURVwiO1xufSkoVGFnVHlwZSB8fCAoVGFnVHlwZSA9IHt9KSk7XG4vKipcbiAqIEdlbmVyYXRlcyBhbiBvYmplY3QgdGhhdCBpcyB1c2VkIGFzIGEgc2hhcmVkIHN0YXRlIGJldHdlZW4gcGFyZW50IGFuZCBhbGwgY2hpbGQgY29udGV4dHMuXG4gKi9cbmZ1bmN0aW9uIHNldHVwUmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIHsgZ2V0VW5pcXVlSWQ6IGdldFNlcU51bWJlckdlbmVyYXRvcigpLCBpY3VzOiBuZXcgTWFwKCkgfTtcbn1cbi8qKlxuICogSTE4bkNvbnRleHQgaXMgYSBoZWxwZXIgY2xhc3Mgd2hpY2gga2VlcHMgdHJhY2sgb2YgYWxsIGkxOG4tcmVsYXRlZCBhc3BlY3RzXG4gKiAoYWNjdW11bGF0ZXMgcGxhY2Vob2xkZXJzLCBiaW5kaW5ncywgZXRjKSBiZXR3ZWVuIGkxOG5TdGFydCBhbmQgaTE4bkVuZCBpbnN0cnVjdGlvbnMuXG4gKlxuICogV2hlbiB3ZSBlbnRlciBhIG5lc3RlZCB0ZW1wbGF0ZSwgdGhlIHRvcC1sZXZlbCBjb250ZXh0IGlzIGJlaW5nIHBhc3NlZCBkb3duXG4gKiB0byB0aGUgbmVzdGVkIGNvbXBvbmVudCwgd2hpY2ggdXNlcyB0aGlzIGNvbnRleHQgdG8gZ2VuZXJhdGUgYSBjaGlsZCBpbnN0YW5jZVxuICogb2YgSTE4bkNvbnRleHQgY2xhc3MgKHRvIGhhbmRsZSBuZXN0ZWQgdGVtcGxhdGUpIGFuZCBhdCB0aGUgZW5kLCByZWNvbmNpbGVzIGl0IGJhY2tcbiAqIHdpdGggdGhlIHBhcmVudCBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBpbmRleCBJbnN0cnVjdGlvbiBpbmRleCBvZiBpMThuU3RhcnQsIHdoaWNoIGluaXRpYXRlcyB0aGlzIGNvbnRleHRcbiAqIEBwYXJhbSByZWYgUmVmZXJlbmNlIHRvIGEgdHJhbnNsYXRpb24gY29uc3QgdGhhdCByZXByZXNlbnRzIHRoZSBjb250ZW50IGlmIHRodXMgY29udGV4dFxuICogQHBhcmFtIGxldmVsIE5lc3RuZyBsZXZlbCBkZWZpbmVkIGZvciBjaGlsZCBjb250ZXh0c1xuICogQHBhcmFtIHRlbXBsYXRlSW5kZXggSW5zdHJ1Y3Rpb24gaW5kZXggb2YgYSB0ZW1wbGF0ZSB3aGljaCB0aGlzIGNvbnRleHQgYmVsb25ncyB0b1xuICogQHBhcmFtIG1ldGEgTWV0YSBpbmZvcm1hdGlvbiAoaWQsIG1lYW5pbmcsIGRlc2NyaXB0aW9uLCBldGMpIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHRcbiAqL1xudmFyIEkxOG5Db250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEkxOG5Db250ZXh0KGluZGV4LCByZWYsIGxldmVsLCB0ZW1wbGF0ZUluZGV4LCBtZXRhLCByZWdpc3RyeSkge1xuICAgICAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IDA7IH1cbiAgICAgICAgaWYgKHRlbXBsYXRlSW5kZXggPT09IHZvaWQgMCkgeyB0ZW1wbGF0ZUluZGV4ID0gbnVsbDsgfVxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgICAgIHRoaXMudGVtcGxhdGVJbmRleCA9IHRlbXBsYXRlSW5kZXg7XG4gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuaXNFbWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3VucmVzb2x2ZWRDdHhDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5ID0gcmVnaXN0cnkgfHwgc2V0dXBSZWdpc3RyeSgpO1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5fcmVnaXN0cnkuZ2V0VW5pcXVlSWQoKTtcbiAgICB9XG4gICAgSTE4bkNvbnRleHQucHJvdG90eXBlLmFwcGVuZFRhZyA9IGZ1bmN0aW9uICh0eXBlLCBub2RlLCBpbmRleCwgY2xvc2VkKSB7XG4gICAgICAgIGlmIChub2RlLmlzVm9pZCAmJiBjbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gaWdub3JlIFwiY2xvc2VcIiBmb3Igdm9pZCB0YWdzXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBoID0gbm9kZS5pc1ZvaWQgfHwgIWNsb3NlZCA/IG5vZGUuc3RhcnROYW1lIDogbm9kZS5jbG9zZU5hbWU7XG4gICAgICAgIHZhciBjb250ZW50ID0geyB0eXBlOiB0eXBlLCBpbmRleDogaW5kZXgsIGN0eDogdGhpcy5pZCwgaXNWb2lkOiBub2RlLmlzVm9pZCwgY2xvc2VkOiBjbG9zZWQgfTtcbiAgICAgICAgdXBkYXRlUGxhY2Vob2xkZXJNYXAodGhpcy5wbGFjZWhvbGRlcnMsIHBoLCBjb250ZW50KTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJMThuQ29udGV4dC5wcm90b3R5cGUsIFwiaWN1c1wiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVnaXN0cnkuaWN1czsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEkxOG5Db250ZXh0LnByb3RvdHlwZSwgXCJpc1Jvb3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubGV2ZWwgPT09IDA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShJMThuQ29udGV4dC5wcm90b3R5cGUsIFwiaXNSZXNvbHZlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fdW5yZXNvbHZlZEN0eENvdW50ID09PSAwOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBJMThuQ29udGV4dC5wcm90b3R5cGUuZ2V0U2VyaWFsaXplZFBsYWNlaG9sZGVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWVzLCBrZXkpIHsgcmV0dXJuIHJlc3VsdC5zZXQoa2V5LCB2YWx1ZXMubWFwKHNlcmlhbGl6ZVBsYWNlaG9sZGVyVmFsdWUpKTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICAvLyBwdWJsaWMgQVBJIHRvIGFjY3VtdWxhdGUgaTE4bi1yZWxhdGVkIGNvbnRlbnRcbiAgICBJMThuQ29udGV4dC5wcm90b3R5cGUuYXBwZW5kQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nKSB7IHRoaXMuYmluZGluZ3MuYWRkKGJpbmRpbmcpOyB9O1xuICAgIEkxOG5Db250ZXh0LnByb3RvdHlwZS5hcHBlbmRJY3UgPSBmdW5jdGlvbiAobmFtZSwgcmVmKSB7XG4gICAgICAgIHVwZGF0ZVBsYWNlaG9sZGVyTWFwKHRoaXMuX3JlZ2lzdHJ5LmljdXMsIG5hbWUsIHJlZik7XG4gICAgfTtcbiAgICBJMThuQ29udGV4dC5wcm90b3R5cGUuYXBwZW5kQm91bmRUZXh0ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHBocyA9IGFzc2VtYmxlQm91bmRUZXh0UGxhY2Vob2xkZXJzKG5vZGUsIHRoaXMuYmluZGluZ3Muc2l6ZSwgdGhpcy5pZCk7XG4gICAgICAgIHBocy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZXMsIGtleSkgeyByZXR1cm4gdXBkYXRlUGxhY2Vob2xkZXJNYXAuYXBwbHkodm9pZCAwLCBfX3NwcmVhZChbX3RoaXMucGxhY2Vob2xkZXJzLCBrZXldLCB2YWx1ZXMpKTsgfSk7XG4gICAgfTtcbiAgICBJMThuQ29udGV4dC5wcm90b3R5cGUuYXBwZW5kVGVtcGxhdGUgPSBmdW5jdGlvbiAobm9kZSwgaW5kZXgpIHtcbiAgICAgICAgLy8gYWRkIG9wZW4gYW5kIGNsb3NlIHRhZ3MgYXQgdGhlIHNhbWUgdGltZSxcbiAgICAgICAgLy8gc2luY2Ugd2UgcHJvY2VzcyBuZXN0ZWQgdGVtcGxhdGVzIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5hcHBlbmRUYWcoVGFnVHlwZS5URU1QTEFURSwgbm9kZSwgaW5kZXgsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5hcHBlbmRUYWcoVGFnVHlwZS5URU1QTEFURSwgbm9kZSwgaW5kZXgsIHRydWUpO1xuICAgICAgICB0aGlzLl91bnJlc29sdmVkQ3R4Q291bnQrKztcbiAgICB9O1xuICAgIEkxOG5Db250ZXh0LnByb3RvdHlwZS5hcHBlbmRFbGVtZW50ID0gZnVuY3Rpb24gKG5vZGUsIGluZGV4LCBjbG9zZWQpIHtcbiAgICAgICAgdGhpcy5hcHBlbmRUYWcoVGFnVHlwZS5FTEVNRU5ULCBub2RlLCBpbmRleCwgY2xvc2VkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhbiBpbnN0YW5jZSBvZiBhIGNoaWxkIGNvbnRleHQgYmFzZWQgb24gdGhlIHJvb3Qgb25lLFxuICAgICAqIHdoZW4gd2UgZW50ZXIgYSBuZXN0ZWQgdGVtcGxhdGUgd2l0aGluIEkxOG4gc2VjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBJbnN0cnVjdGlvbiBpbmRleCBvZiBjb3JyZXNwb25kaW5nIGkxOG5TdGFydCwgd2hpY2ggaW5pdGlhdGVzIHRoaXMgY29udGV4dFxuICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUluZGV4IEluc3RydWN0aW9uIGluZGV4IG9mIGEgdGVtcGxhdGUgd2hpY2ggdGhpcyBjb250ZXh0IGJlbG9uZ3MgdG9cbiAgICAgKiBAcGFyYW0gbWV0YSBNZXRhIGluZm9ybWF0aW9uIChpZCwgbWVhbmluZywgZGVzY3JpcHRpb24sIGV0YykgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dFxuICAgICAqXG4gICAgICogQHJldHVybnMgSTE4bkNvbnRleHQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBJMThuQ29udGV4dC5wcm90b3R5cGUuZm9ya0NoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIChpbmRleCwgdGVtcGxhdGVJbmRleCwgbWV0YSkge1xuICAgICAgICByZXR1cm4gbmV3IEkxOG5Db250ZXh0KGluZGV4LCB0aGlzLnJlZiwgdGhpcy5sZXZlbCArIDEsIHRlbXBsYXRlSW5kZXgsIG1ldGEsIHRoaXMuX3JlZ2lzdHJ5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlY29uY2lsZXMgY2hpbGQgY29udGV4dCBpbnRvIHBhcmVudCBvbmUgb25jZSB0aGUgZW5kIG9mIHRoZSBpMThuIGJsb2NrIGlzIHJlYWNoZWQgKGkxOG5FbmQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ2hpbGQgSTE4bkNvbnRleHQgaW5zdGFuY2UgdG8gYmUgcmVjb25jaWxlZCB3aXRoIHBhcmVudCBjb250ZXh0LlxuICAgICAqL1xuICAgIEkxOG5Db250ZXh0LnByb3RvdHlwZS5yZWNvbmNpbGVDaGlsZENvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAvLyBzZXQgdGhlIHJpZ2h0IGNvbnRleHQgaWQgZm9yIG9wZW4gYW5kIGNsb3NlXG4gICAgICAgIC8vIHRlbXBsYXRlIHRhZ3MsIHNvIHdlIGNhbiB1c2UgaXQgYXMgc3ViLWJsb2NrIGlkc1xuICAgICAgICBbJ3N0YXJ0JywgJ2Nsb3NlJ10uZm9yRWFjaChmdW5jdGlvbiAob3ApIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjb250ZXh0Lm1ldGFbb3AgKyBcIk5hbWVcIl07XG4gICAgICAgICAgICB2YXIgcGhzID0gX3RoaXMucGxhY2Vob2xkZXJzLmdldChrZXkpIHx8IFtdO1xuICAgICAgICAgICAgdmFyIHRhZyA9IHBocy5maW5kKGZpbmRUZW1wbGF0ZUZuKF90aGlzLmlkLCBjb250ZXh0LnRlbXBsYXRlSW5kZXgpKTtcbiAgICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgICAgICB0YWcuY3R4ID0gY29udGV4dC5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlY29uY2lsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgdmFyIGNoaWxkUGhzID0gY29udGV4dC5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGNoaWxkUGhzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlcywga2V5KSB7XG4gICAgICAgICAgICB2YXIgcGhzID0gX3RoaXMucGxhY2Vob2xkZXJzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKCFwaHMpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5wbGFjZWhvbGRlcnMuc2V0KGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBtYXRjaGluZyB0ZW1wbGF0ZS4uLlxuICAgICAgICAgICAgdmFyIHRtcGxJZHggPSBmaW5kSW5kZXgocGhzLCBmaW5kVGVtcGxhdGVGbihjb250ZXh0LmlkLCBjb250ZXh0LnRlbXBsYXRlSW5kZXgpKTtcbiAgICAgICAgICAgIGlmICh0bXBsSWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICAvLyAuLi4gaWYgZm91bmQgLSByZXBsYWNlIGl0IHdpdGggbmVzdGVkIHRlbXBsYXRlIGNvbnRlbnRcbiAgICAgICAgICAgICAgICB2YXIgaXNDbG9zZVRhZyA9IGtleS5zdGFydHNXaXRoKCdDTE9TRScpO1xuICAgICAgICAgICAgICAgIHZhciBpc1RlbXBsYXRlVGFnID0ga2V5LmVuZHNXaXRoKCdORy1URU1QTEFURScpO1xuICAgICAgICAgICAgICAgIGlmIChpc1RlbXBsYXRlVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgdGVtcGxhdGUncyBjb250ZW50IGlzIHBsYWNlZCBiZWZvcmUgb3IgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IHRlbXBsYXRlIHRhZywgZGVwZW5kaW5nIG9uIHRoZSBvcGVuL2Nsb3NlIGF0cnJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICBwaHMuc3BsaWNlLmFwcGx5KHBocywgX19zcHJlYWQoW3RtcGxJZHggKyAoaXNDbG9zZVRhZyA/IDAgOiAxKSwgMF0sIHZhbHVlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IGlzQ2xvc2VUYWcgPyB2YWx1ZXMubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpZHhdLnRtcGwgPSBwaHNbdG1wbElkeF07XG4gICAgICAgICAgICAgICAgICAgIHBocy5zcGxpY2UuYXBwbHkocGhzLCBfX3NwcmVhZChbdG1wbElkeCwgMV0sIHZhbHVlcykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIC4uLiBvdGhlcndpc2UganVzdCBhcHBlbmQgY29udGVudCB0byBwbGFjZWhvbGRlciB2YWx1ZVxuICAgICAgICAgICAgICAgIHBocy5wdXNoLmFwcGx5KHBocywgX19zcHJlYWQodmFsdWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5wbGFjZWhvbGRlcnMuc2V0KGtleSwgcGhzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3VucmVzb2x2ZWRDdHhDb3VudC0tO1xuICAgIH07XG4gICAgcmV0dXJuIEkxOG5Db250ZXh0O1xufSgpKTtcbi8vXG4vLyBIZWxwZXIgbWV0aG9kc1xuLy9cbmZ1bmN0aW9uIHdyYXAoc3ltYm9sLCBpbmRleCwgY29udGV4dElkLCBjbG9zZWQpIHtcbiAgICB2YXIgc3RhdGUgPSBjbG9zZWQgPyAnLycgOiAnJztcbiAgICByZXR1cm4gd3JhcEkxOG5QbGFjZWhvbGRlcihcIlwiICsgc3RhdGUgKyBzeW1ib2wgKyBpbmRleCwgY29udGV4dElkKTtcbn1cbmZ1bmN0aW9uIHdyYXBUYWcoc3ltYm9sLCBfYSwgY2xvc2VkKSB7XG4gICAgdmFyIGluZGV4ID0gX2EuaW5kZXgsIGN0eCA9IF9hLmN0eCwgaXNWb2lkID0gX2EuaXNWb2lkO1xuICAgIHJldHVybiBpc1ZvaWQgPyB3cmFwKHN5bWJvbCwgaW5kZXgsIGN0eCkgKyB3cmFwKHN5bWJvbCwgaW5kZXgsIGN0eCwgdHJ1ZSkgOlxuICAgICAgICB3cmFwKHN5bWJvbCwgaW5kZXgsIGN0eCwgY2xvc2VkKTtcbn1cbmZ1bmN0aW9uIGZpbmRUZW1wbGF0ZUZuKGN0eCwgdGVtcGxhdGVJbmRleCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodG9rZW4pIHsgcmV0dXJuIHR5cGVvZiB0b2tlbiA9PT0gJ29iamVjdCcgJiYgdG9rZW4udHlwZSA9PT0gVGFnVHlwZS5URU1QTEFURSAmJlxuICAgICAgICB0b2tlbi5pbmRleCA9PT0gdGVtcGxhdGVJbmRleCAmJiB0b2tlbi5jdHggPT09IGN0eDsgfTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBsYWNlaG9sZGVyVmFsdWUodmFsdWUpIHtcbiAgICB2YXIgZWxlbWVudCA9IGZ1bmN0aW9uIChkYXRhLCBjbG9zZWQpIHsgcmV0dXJuIHdyYXBUYWcoJyMnLCBkYXRhLCBjbG9zZWQpOyB9O1xuICAgIHZhciB0ZW1wbGF0ZSA9IGZ1bmN0aW9uIChkYXRhLCBjbG9zZWQpIHsgcmV0dXJuIHdyYXBUYWcoJyonLCBkYXRhLCBjbG9zZWQpOyB9O1xuICAgIHN3aXRjaCAodmFsdWUudHlwZSkge1xuICAgICAgICBjYXNlIFRhZ1R5cGUuRUxFTUVOVDpcbiAgICAgICAgICAgIC8vIGNsb3NlIGVsZW1lbnQgdGFnXG4gICAgICAgICAgICBpZiAodmFsdWUuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQodmFsdWUsIHRydWUpICsgKHZhbHVlLnRtcGwgPyB0ZW1wbGF0ZSh2YWx1ZS50bXBsLCB0cnVlKSA6ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9wZW4gZWxlbWVudCB0YWcgdGhhdCBhbHNvIGluaXRpYXRlcyBhIHRlbXBsYXRlXG4gICAgICAgICAgICBpZiAodmFsdWUudG1wbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZSh2YWx1ZS50bXBsKSArIGVsZW1lbnQodmFsdWUpICtcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlLmlzVm9pZCA/IHRlbXBsYXRlKHZhbHVlLnRtcGwsIHRydWUpIDogJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQodmFsdWUpO1xuICAgICAgICBjYXNlIFRhZ1R5cGUuVEVNUExBVEU6XG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGUodmFsdWUsIHZhbHVlLmNsb3NlZCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTID0ge1xuICAgICdBJzogJ0xJTksnLFxuICAgICdCJzogJ0JPTERfVEVYVCcsXG4gICAgJ0JSJzogJ0xJTkVfQlJFQUsnLFxuICAgICdFTSc6ICdFTVBIQVNJU0VEX1RFWFQnLFxuICAgICdIMSc6ICdIRUFESU5HX0xFVkVMMScsXG4gICAgJ0gyJzogJ0hFQURJTkdfTEVWRUwyJyxcbiAgICAnSDMnOiAnSEVBRElOR19MRVZFTDMnLFxuICAgICdINCc6ICdIRUFESU5HX0xFVkVMNCcsXG4gICAgJ0g1JzogJ0hFQURJTkdfTEVWRUw1JyxcbiAgICAnSDYnOiAnSEVBRElOR19MRVZFTDYnLFxuICAgICdIUic6ICdIT1JJWk9OVEFMX1JVTEUnLFxuICAgICdJJzogJ0lUQUxJQ19URVhUJyxcbiAgICAnTEknOiAnTElTVF9JVEVNJyxcbiAgICAnTElOSyc6ICdNRURJQV9MSU5LJyxcbiAgICAnT0wnOiAnT1JERVJFRF9MSVNUJyxcbiAgICAnUCc6ICdQQVJBR1JBUEgnLFxuICAgICdRJzogJ1FVT1RBVElPTicsXG4gICAgJ1MnOiAnU1RSSUtFVEhST1VHSF9URVhUJyxcbiAgICAnU01BTEwnOiAnU01BTExfVEVYVCcsXG4gICAgJ1NVQic6ICdTVUJTVFJJUFQnLFxuICAgICdTVVAnOiAnU1VQRVJTQ1JJUFQnLFxuICAgICdUQk9EWSc6ICdUQUJMRV9CT0RZJyxcbiAgICAnVEQnOiAnVEFCTEVfQ0VMTCcsXG4gICAgJ1RGT09UJzogJ1RBQkxFX0ZPT1RFUicsXG4gICAgJ1RIJzogJ1RBQkxFX0hFQURFUl9DRUxMJyxcbiAgICAnVEhFQUQnOiAnVEFCTEVfSEVBREVSJyxcbiAgICAnVFInOiAnVEFCTEVfUk9XJyxcbiAgICAnVFQnOiAnTU9OT1NQQUNFRF9URVhUJyxcbiAgICAnVSc6ICdVTkRFUkxJTkVEX1RFWFQnLFxuICAgICdVTCc6ICdVTk9SREVSRURfTElTVCcsXG59O1xuLyoqXG4gKiBDcmVhdGVzIHVuaXF1ZSBuYW1lcyBmb3IgcGxhY2Vob2xkZXIgd2l0aCBkaWZmZXJlbnQgY29udGVudC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzYW1lIHBsYWNlaG9sZGVyIG5hbWUgd2hlbiB0aGUgY29udGVudCBpcyBpZGVudGljYWwuXG4gKi9cbnZhciBQbGFjZWhvbGRlclJlZ2lzdHJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYWNlaG9sZGVyUmVnaXN0cnkoKSB7XG4gICAgICAgIC8vIENvdW50IHRoZSBvY2N1cnJlbmNlIG9mIHRoZSBiYXNlIG5hbWUgdG9wIGdlbmVyYXRlIGEgdW5pcXVlIG5hbWVcbiAgICAgICAgdGhpcy5fcGxhY2VIb2xkZXJOYW1lQ291bnRzID0ge307XG4gICAgICAgIC8vIE1hcHMgc2lnbmF0dXJlIHRvIHBsYWNlaG9sZGVyIG5hbWVzXG4gICAgICAgIHRoaXMuX3NpZ25hdHVyZVRvTmFtZSA9IHt9O1xuICAgIH1cbiAgICBQbGFjZWhvbGRlclJlZ2lzdHJ5LnByb3RvdHlwZS5nZXRTdGFydFRhZ1BsYWNlaG9sZGVyTmFtZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHJzLCBpc1ZvaWQpIHtcbiAgICAgICAgdmFyIHNpZ25hdHVyZSA9IHRoaXMuX2hhc2hUYWcodGFnLCBhdHRycywgaXNWb2lkKTtcbiAgICAgICAgaWYgKHRoaXMuX3NpZ25hdHVyZVRvTmFtZVtzaWduYXR1cmVdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVwcGVyVGFnID0gdGFnLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHZhciBiYXNlTmFtZSA9IFRBR19UT19QTEFDRUhPTERFUl9OQU1FU1t1cHBlclRhZ10gfHwgXCJUQUdfXCIgKyB1cHBlclRhZztcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLl9nZW5lcmF0ZVVuaXF1ZU5hbWUoaXNWb2lkID8gYmFzZU5hbWUgOiBcIlNUQVJUX1wiICsgYmFzZU5hbWUpO1xuICAgICAgICB0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH07XG4gICAgUGxhY2Vob2xkZXJSZWdpc3RyeS5wcm90b3R5cGUuZ2V0Q2xvc2VUYWdQbGFjZWhvbGRlck5hbWUgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLl9oYXNoQ2xvc2luZ1RhZyh0YWcpO1xuICAgICAgICBpZiAodGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXBwZXJUYWcgPSB0YWcudG9VcHBlckNhc2UoKTtcbiAgICAgICAgdmFyIGJhc2VOYW1lID0gVEFHX1RPX1BMQUNFSE9MREVSX05BTUVTW3VwcGVyVGFnXSB8fCBcIlRBR19cIiArIHVwcGVyVGFnO1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuX2dlbmVyYXRlVW5pcXVlTmFtZShcIkNMT1NFX1wiICsgYmFzZU5hbWUpO1xuICAgICAgICB0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXSA9IG5hbWU7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH07XG4gICAgUGxhY2Vob2xkZXJSZWdpc3RyeS5wcm90b3R5cGUuZ2V0UGxhY2Vob2xkZXJOYW1lID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRlbnQpIHtcbiAgICAgICAgdmFyIHVwcGVyTmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgdmFyIHNpZ25hdHVyZSA9IFwiUEg6IFwiICsgdXBwZXJOYW1lICsgXCI9XCIgKyBjb250ZW50O1xuICAgICAgICBpZiAodGhpcy5fc2lnbmF0dXJlVG9OYW1lW3NpZ25hdHVyZV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdW5pcXVlTmFtZSA9IHRoaXMuX2dlbmVyYXRlVW5pcXVlTmFtZSh1cHBlck5hbWUpO1xuICAgICAgICB0aGlzLl9zaWduYXR1cmVUb05hbWVbc2lnbmF0dXJlXSA9IHVuaXF1ZU5hbWU7XG4gICAgICAgIHJldHVybiB1bmlxdWVOYW1lO1xuICAgIH07XG4gICAgUGxhY2Vob2xkZXJSZWdpc3RyeS5wcm90b3R5cGUuZ2V0VW5pcXVlUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVVbmlxdWVOYW1lKG5hbWUudG9VcHBlckNhc2UoKSk7XG4gICAgfTtcbiAgICAvLyBHZW5lcmF0ZSBhIGhhc2ggZm9yIGEgdGFnIC0gZG9lcyBub3QgdGFrZSBhdHRyaWJ1dGUgb3JkZXIgaW50byBhY2NvdW50XG4gICAgUGxhY2Vob2xkZXJSZWdpc3RyeS5wcm90b3R5cGUuX2hhc2hUYWcgPSBmdW5jdGlvbiAodGFnLCBhdHRycywgaXNWb2lkKSB7XG4gICAgICAgIHZhciBzdGFydCA9IFwiPFwiICsgdGFnO1xuICAgICAgICB2YXIgc3RyQXR0cnMgPSBPYmplY3Qua2V5cyhhdHRycykuc29ydCgpLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gXCIgXCIgKyBuYW1lICsgXCI9XCIgKyBhdHRyc1tuYW1lXTsgfSkuam9pbignJyk7XG4gICAgICAgIHZhciBlbmQgPSBpc1ZvaWQgPyAnLz4nIDogXCI+PC9cIiArIHRhZyArIFwiPlwiO1xuICAgICAgICByZXR1cm4gc3RhcnQgKyBzdHJBdHRycyArIGVuZDtcbiAgICB9O1xuICAgIFBsYWNlaG9sZGVyUmVnaXN0cnkucHJvdG90eXBlLl9oYXNoQ2xvc2luZ1RhZyA9IGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIHRoaXMuX2hhc2hUYWcoXCIvXCIgKyB0YWcsIHt9LCBmYWxzZSk7IH07XG4gICAgUGxhY2Vob2xkZXJSZWdpc3RyeS5wcm90b3R5cGUuX2dlbmVyYXRlVW5pcXVlTmFtZSA9IGZ1bmN0aW9uIChiYXNlKSB7XG4gICAgICAgIHZhciBzZWVuID0gdGhpcy5fcGxhY2VIb2xkZXJOYW1lQ291bnRzLmhhc093blByb3BlcnR5KGJhc2UpO1xuICAgICAgICBpZiAoIXNlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3BsYWNlSG9sZGVyTmFtZUNvdW50c1tiYXNlXSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWQgPSB0aGlzLl9wbGFjZUhvbGRlck5hbWVDb3VudHNbYmFzZV07XG4gICAgICAgIHRoaXMuX3BsYWNlSG9sZGVyTmFtZUNvdW50c1tiYXNlXSA9IGlkICsgMTtcbiAgICAgICAgcmV0dXJuIGJhc2UgKyBcIl9cIiArIGlkO1xuICAgIH07XG4gICAgcmV0dXJuIFBsYWNlaG9sZGVyUmVnaXN0cnk7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX2V4cFBhcnNlciA9IG5ldyBQYXJzZXIkMShuZXcgTGV4ZXIoKSk7XG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBjb252ZXJ0aW5nIGh0bWwgbm9kZXMgdG8gYW4gaTE4biBNZXNzYWdlIGdpdmVuIGFuIGludGVycG9sYXRpb25Db25maWdcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSTE4bk1lc3NhZ2VGYWN0b3J5KGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICB2YXIgdmlzaXRvciA9IG5ldyBfSTE4blZpc2l0b3IoX2V4cFBhcnNlciwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlcywgbWVhbmluZywgZGVzY3JpcHRpb24sIGlkLCB2aXNpdE5vZGVGbikge1xuICAgICAgICByZXR1cm4gdmlzaXRvci50b0kxOG5NZXNzYWdlKG5vZGVzLCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgaWQsIHZpc2l0Tm9kZUZuKTtcbiAgICB9O1xufVxudmFyIF9JMThuVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfSTE4blZpc2l0b3IoX2V4cHJlc3Npb25QYXJzZXIsIF9pbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2V4cHJlc3Npb25QYXJzZXIgPSBfZXhwcmVzc2lvblBhcnNlcjtcbiAgICAgICAgdGhpcy5faW50ZXJwb2xhdGlvbkNvbmZpZyA9IF9pbnRlcnBvbGF0aW9uQ29uZmlnO1xuICAgIH1cbiAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnRvSTE4bk1lc3NhZ2UgPSBmdW5jdGlvbiAobm9kZXMsIG1lYW5pbmcsIGRlc2NyaXB0aW9uLCBpZCwgdmlzaXROb2RlRm4pIHtcbiAgICAgICAgdGhpcy5faXNJY3UgPSBub2Rlcy5sZW5ndGggPT0gMSAmJiBub2Rlc1swXSBpbnN0YW5jZW9mIEV4cGFuc2lvbjtcbiAgICAgICAgdGhpcy5faWN1RGVwdGggPSAwO1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclJlZ2lzdHJ5ID0gbmV3IFBsYWNlaG9sZGVyUmVnaXN0cnkoKTtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXJUb0NvbnRlbnQgPSB7fTtcbiAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXJUb01lc3NhZ2UgPSB7fTtcbiAgICAgICAgdGhpcy5fdmlzaXROb2RlRm4gPSB2aXNpdE5vZGVGbjtcbiAgICAgICAgdmFyIGkxOG5vZGVzID0gdmlzaXRBbGwkMSh0aGlzLCBub2Rlcywge30pO1xuICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoaTE4bm9kZXMsIHRoaXMuX3BsYWNlaG9sZGVyVG9Db250ZW50LCB0aGlzLl9wbGFjZWhvbGRlclRvTWVzc2FnZSwgbWVhbmluZywgZGVzY3JpcHRpb24sIGlkKTtcbiAgICB9O1xuICAgIF9JMThuVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0Tm9kZSA9IGZ1bmN0aW9uIChodG1sLCBpMThuKSB7XG4gICAgICAgIGlmICh0aGlzLl92aXNpdE5vZGVGbikge1xuICAgICAgICAgICAgdGhpcy5fdmlzaXROb2RlRm4oaHRtbCwgaTE4bik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGkxOG47XG4gICAgfTtcbiAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbCwgY29udGV4dCkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSB2aXNpdEFsbCQxKHRoaXMsIGVsLmNoaWxkcmVuKTtcbiAgICAgICAgdmFyIGF0dHJzID0ge307XG4gICAgICAgIGVsLmF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgIC8vIERvIG5vdCB2aXNpdCB0aGUgYXR0cmlidXRlcywgdHJhbnNsYXRhYmxlIG9uZXMgYXJlIHRvcC1sZXZlbCBBU1RzXG4gICAgICAgICAgICBhdHRyc1thdHRyLm5hbWVdID0gYXR0ci52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBpc1ZvaWQgPSBnZXRIdG1sVGFnRGVmaW5pdGlvbihlbC5uYW1lKS5pc1ZvaWQ7XG4gICAgICAgIHZhciBzdGFydFBoTmFtZSA9IHRoaXMuX3BsYWNlaG9sZGVyUmVnaXN0cnkuZ2V0U3RhcnRUYWdQbGFjZWhvbGRlck5hbWUoZWwubmFtZSwgYXR0cnMsIGlzVm9pZCk7XG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyVG9Db250ZW50W3N0YXJ0UGhOYW1lXSA9IGVsLnNvdXJjZVNwYW4udG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIGNsb3NlUGhOYW1lID0gJyc7XG4gICAgICAgIGlmICghaXNWb2lkKSB7XG4gICAgICAgICAgICBjbG9zZVBoTmFtZSA9IHRoaXMuX3BsYWNlaG9sZGVyUmVnaXN0cnkuZ2V0Q2xvc2VUYWdQbGFjZWhvbGRlck5hbWUoZWwubmFtZSk7XG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudFtjbG9zZVBoTmFtZV0gPSBcIjwvXCIgKyBlbC5uYW1lICsgXCI+XCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgVGFnUGxhY2Vob2xkZXIoZWwubmFtZSwgYXR0cnMsIHN0YXJ0UGhOYW1lLCBjbG9zZVBoTmFtZSwgY2hpbGRyZW4sIGlzVm9pZCwgZWwuc291cmNlU3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpdE5vZGUoZWwsIG5vZGUpO1xuICAgIH07XG4gICAgX0kxOG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbihhdHRyaWJ1dGUudmFsdWUsIGF0dHJpYnV0ZS5zb3VyY2VTcGFuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0Tm9kZShhdHRyaWJ1dGUsIG5vZGUpO1xuICAgIH07XG4gICAgX0kxOG5WaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX3Zpc2l0VGV4dFdpdGhJbnRlcnBvbGF0aW9uKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpdE5vZGUodGV4dCwgbm9kZSk7XG4gICAgfTtcbiAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgIF9JMThuVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2ljdURlcHRoKys7XG4gICAgICAgIHZhciBpMThuSWN1Q2FzZXMgPSB7fTtcbiAgICAgICAgdmFyIGkxOG5JY3UgPSBuZXcgSWN1JDEoaWN1LnN3aXRjaFZhbHVlLCBpY3UudHlwZSwgaTE4bkljdUNhc2VzLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgICAgIGljdS5jYXNlcy5mb3JFYWNoKGZ1bmN0aW9uIChjYXplKSB7XG4gICAgICAgICAgICBpMThuSWN1Q2FzZXNbY2F6ZS52YWx1ZV0gPSBuZXcgQ29udGFpbmVyKGNhemUuZXhwcmVzc2lvbi5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMsIHt9KTsgfSksIGNhemUuZXhwU291cmNlU3Bhbik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pY3VEZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy5faXNJY3UgfHwgdGhpcy5faWN1RGVwdGggPiAwKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm5zIGFuIElDVSBub2RlIHdoZW46XG4gICAgICAgICAgICAvLyAtIHRoZSBtZXNzYWdlICh2cyBhIHBhcnQgb2YgdGhlIG1lc3NhZ2UpIGlzIGFuIElDVSBtZXNzYWdlLCBvclxuICAgICAgICAgICAgLy8gLSB0aGUgSUNVIG1lc3NhZ2UgaXMgbmVzdGVkLlxuICAgICAgICAgICAgdmFyIGV4cFBoID0gdGhpcy5fcGxhY2Vob2xkZXJSZWdpc3RyeS5nZXRVbmlxdWVQbGFjZWhvbGRlcihcIlZBUl9cIiArIGljdS50eXBlKTtcbiAgICAgICAgICAgIGkxOG5JY3UuZXhwcmVzc2lvblBsYWNlaG9sZGVyID0gZXhwUGg7XG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudFtleHBQaF0gPSBpY3Uuc3dpdGNoVmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXROb2RlKGljdSwgaTE4bkljdSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSByZXR1cm5zIGEgcGxhY2Vob2xkZXJcbiAgICAgICAgLy8gSUNVIHBsYWNlaG9sZGVycyBzaG91bGQgbm90IGJlIHJlcGxhY2VkIHdpdGggdGhlaXIgb3JpZ2luYWwgY29udGVudCBidXQgd2l0aCB0aGUgdGhlaXJcbiAgICAgICAgLy8gdHJhbnNsYXRpb25zLiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2aXNpdG9yICh0aGV5IGFyZSBub3QgcmUtZW50cmFudCkgdG8gY29tcHV0ZSB0aGVcbiAgICAgICAgLy8gbWVzc2FnZSBpZC5cbiAgICAgICAgLy8gVE9ETyh2aWNiKTogYWRkIGEgaHRtbC5Ob2RlIC0+IGkxOG4uTWVzc2FnZSBjYWNoZSB0byBhdm9pZCBoYXZpbmcgdG8gcmUtY3JlYXRlIHRoZSBtc2dcbiAgICAgICAgdmFyIHBoTmFtZSA9IHRoaXMuX3BsYWNlaG9sZGVyUmVnaXN0cnkuZ2V0UGxhY2Vob2xkZXJOYW1lKCdJQ1UnLCBpY3Uuc291cmNlU3Bhbi50b1N0cmluZygpKTtcbiAgICAgICAgdmFyIHZpc2l0b3IgPSBuZXcgX0kxOG5WaXNpdG9yKHRoaXMuX2V4cHJlc3Npb25QYXJzZXIsIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvTWVzc2FnZVtwaE5hbWVdID0gdmlzaXRvci50b0kxOG5NZXNzYWdlKFtpY3VdLCAnJywgJycsICcnKTtcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgSWN1UGxhY2Vob2xkZXIoaTE4bkljdSwgcGhOYW1lLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpdE5vZGUoaWN1LCBub2RlKTtcbiAgICB9O1xuICAgIF9JMThuVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGljdUNhc2UsIGNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBjb2RlJyk7XG4gICAgfTtcbiAgICBfSTE4blZpc2l0b3IucHJvdG90eXBlLl92aXNpdFRleHRXaXRoSW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uICh0ZXh0LCBzb3VyY2VTcGFuKSB7XG4gICAgICAgIHZhciBzcGxpdEludGVycG9sYXRpb24gPSB0aGlzLl9leHByZXNzaW9uUGFyc2VyLnNwbGl0SW50ZXJwb2xhdGlvbih0ZXh0LCBzb3VyY2VTcGFuLnN0YXJ0LnRvU3RyaW5nKCksIHRoaXMuX2ludGVycG9sYXRpb25Db25maWcpO1xuICAgICAgICBpZiAoIXNwbGl0SW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgLy8gTm8gZXhwcmVzc2lvbiwgcmV0dXJuIGEgc2luZ2xlIHRleHRcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGV4dCQxKHRleHQsIHNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBhIGdyb3VwIG9mIHRleHQgKyBleHByZXNzaW9uc1xuICAgICAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIobm9kZXMsIHNvdXJjZVNwYW4pO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLl9pbnRlcnBvbGF0aW9uQ29uZmlnLCBzRGVsaW1pdGVyID0gX2Euc3RhcnQsIGVEZWxpbWl0ZXIgPSBfYS5lbmQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3MubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IHNwbGl0SW50ZXJwb2xhdGlvbi5leHByZXNzaW9uc1tpXTtcbiAgICAgICAgICAgIHZhciBiYXNlTmFtZSA9IF9leHRyYWN0UGxhY2Vob2xkZXJOYW1lKGV4cHJlc3Npb24pIHx8ICdJTlRFUlBPTEFUSU9OJztcbiAgICAgICAgICAgIHZhciBwaE5hbWUgPSB0aGlzLl9wbGFjZWhvbGRlclJlZ2lzdHJ5LmdldFBsYWNlaG9sZGVyTmFtZShiYXNlTmFtZSwgZXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZiAoc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3NbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgZW1wdHkgc3RyaW5nc1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobmV3IFRleHQkMShzcGxpdEludGVycG9sYXRpb24uc3RyaW5nc1tpXSwgc291cmNlU3BhbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZXMucHVzaChuZXcgUGxhY2Vob2xkZXIoZXhwcmVzc2lvbiwgcGhOYW1lLCBzb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRvQ29udGVudFtwaE5hbWVdID0gc0RlbGltaXRlciArIGV4cHJlc3Npb24gKyBlRGVsaW1pdGVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBsYXN0IGluZGV4IGNvbnRhaW5zIG5vIGV4cHJlc3Npb25cbiAgICAgICAgdmFyIGxhc3RTdHJpbmdJZHggPSBzcGxpdEludGVycG9sYXRpb24uc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAoc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3NbbGFzdFN0cmluZ0lkeF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKG5ldyBUZXh0JDEoc3BsaXRJbnRlcnBvbGF0aW9uLnN0cmluZ3NbbGFzdFN0cmluZ0lkeF0sIHNvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgIH07XG4gICAgcmV0dXJuIF9JMThuVmlzaXRvcjtcbn0oKSk7XG52YXIgX0NVU1RPTV9QSF9FWFAgPSAvXFwvXFwvW1xcc1xcU10qaTE4bltcXHNcXFNdKlxcKFtcXHNcXFNdKnBoW1xcc1xcU10qPVtcXHNcXFNdKihcInwnKShbXFxzXFxTXSo/KVxcMVtcXHNcXFNdKlxcKS9nO1xuZnVuY3Rpb24gX2V4dHJhY3RQbGFjZWhvbGRlck5hbWUoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQuc3BsaXQoX0NVU1RPTV9QSF9FWFApWzJdO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBzZXRJMThuUmVmcyhodG1sLCBpMThuKSB7XG4gICAgaHRtbC5pMThuID0gaTE4bjtcbn1cbi8qKlxuICogVGhpcyB2aXNpdG9yIHdhbGtzIG92ZXIgSFRNTCBwYXJzZSB0cmVlIGFuZCBjb252ZXJ0cyBpbmZvcm1hdGlvbiBzdG9yZWQgaW5cbiAqIGkxOG4tcmVsYXRlZCBhdHRyaWJ1dGVzIChcImkxOG5cIiBhbmQgXCJpMThuLSpcIikgaW50byBpMThuIG1ldGEgb2JqZWN0IHRoYXQgaXNcbiAqIHN0b3JlZCB3aXRoIG90aGVyIGVsZW1lbnQncyBhbmQgYXR0cmlidXRlJ3MgaW5mb3JtYXRpb24uXG4gKi9cbnZhciBJMThuTWV0YVZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSTE4bk1ldGFWaXNpdG9yKGludGVycG9sYXRpb25Db25maWcsIGtlZXBJMThuQXR0cnMpIHtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb25Db25maWcgPT09IHZvaWQgMCkgeyBpbnRlcnBvbGF0aW9uQ29uZmlnID0gREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRzsgfVxuICAgICAgICBpZiAoa2VlcEkxOG5BdHRycyA9PT0gdm9pZCAwKSB7IGtlZXBJMThuQXR0cnMgPSBmYWxzZTsgfVxuICAgICAgICB0aGlzLmludGVycG9sYXRpb25Db25maWcgPSBpbnRlcnBvbGF0aW9uQ29uZmlnO1xuICAgICAgICB0aGlzLmtlZXBJMThuQXR0cnMgPSBrZWVwSTE4bkF0dHJzO1xuICAgICAgICAvLyBpMThuIG1lc3NhZ2UgZ2VuZXJhdGlvbiBmYWN0b3J5XG4gICAgICAgIHRoaXMuX2NyZWF0ZUkxOG5NZXNzYWdlID0gY3JlYXRlSTE4bk1lc3NhZ2VGYWN0b3J5KGludGVycG9sYXRpb25Db25maWcpO1xuICAgIH1cbiAgICBJMThuTWV0YVZpc2l0b3IucHJvdG90eXBlLl9nZW5lcmF0ZUkxOG5NZXNzYWdlID0gZnVuY3Rpb24gKG5vZGVzLCBtZXRhLCB2aXNpdE5vZGVGbikge1xuICAgICAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7IG1ldGEgPSAnJzsgfVxuICAgICAgICB2YXIgcGFyc2VkID0gdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnID8gcGFyc2VJMThuTWV0YShtZXRhKSA6IG1ldGFGcm9tSTE4bk1lc3NhZ2UobWV0YSk7XG4gICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5fY3JlYXRlSTE4bk1lc3NhZ2Uobm9kZXMsIHBhcnNlZC5tZWFuaW5nIHx8ICcnLCBwYXJzZWQuZGVzY3JpcHRpb24gfHwgJycsIHBhcnNlZC5pZCB8fCAnJywgdmlzaXROb2RlRm4pO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaWQpIHtcbiAgICAgICAgICAgIC8vIGdlbmVyYXRlIChvciByZXN0b3JlKSBtZXNzYWdlIGlkIGlmIG5vdCBzcGVjaWZpZWQgaW4gdGVtcGxhdGVcbiAgICAgICAgICAgIG1lc3NhZ2UuaWQgPSB0eXBlb2YgbWV0YSAhPT0gJ3N0cmluZycgJiYgbWV0YS5pZCB8fCBkZWNpbWFsRGlnZXN0KG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH07XG4gICAgSTE4bk1ldGFWaXNpdG9yLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dCkge1xuICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcbiAgICAgICAgaWYgKGhhc0kxOG5BdHRycyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdmFyIGF0dHJzID0gW107XG4gICAgICAgICAgICB2YXIgYXR0cnNNZXRhID0ge307XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMoZWxlbWVudC5hdHRycyksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHIgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIubmFtZSA9PT0gSTE4Tl9BVFRSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb290ICdpMThuJyBub2RlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkxOG5fMSA9IGVsZW1lbnQuaTE4biB8fCBhdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLl9nZW5lcmF0ZUkxOG5NZXNzYWdlKGVsZW1lbnQuY2hpbGRyZW4sIGkxOG5fMSwgc2V0STE4blJlZnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGFzc2lnbiBlbXB0eSBpMThuIG1ldGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaTE4biA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0ci5uYW1lLnN0YXJ0c1dpdGgoSTE4Tl9BVFRSX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICdpMThuLSonIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBhdHRyLm5hbWUuc2xpY2UoSTE4Tl9BVFRSX1BSRUZJWC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNNZXRhW2tleV0gPSBhdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWkxOG4gYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9hID0gX2MucmV0dXJuKSkgX2EuY2FsbChfYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHNldCBpMThuIG1ldGEgZm9yIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhhdHRyc01ldGEpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dHJzXzEgPSBfX3ZhbHVlcyhhdHRycyksIGF0dHJzXzFfMSA9IGF0dHJzXzEubmV4dCgpOyAhYXR0cnNfMV8xLmRvbmU7IGF0dHJzXzFfMSA9IGF0dHJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IGF0dHJzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXRhID0gYXR0cnNNZXRhW2F0dHIubmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgY3JlYXRlIHRyYW5zbGF0aW9uIGZvciBlbXB0eSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YSAhPT0gdW5kZWZpbmVkICYmIGF0dHIudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmkxOG4gPSB0aGlzLl9nZW5lcmF0ZUkxOG5NZXNzYWdlKFthdHRyXSwgYXR0ci5pMThuIHx8IG1ldGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnNfMV8xICYmICFhdHRyc18xXzEuZG9uZSAmJiAoX2IgPSBhdHRyc18xLnJldHVybikpIF9iLmNhbGwoYXR0cnNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5rZWVwSTE4bkF0dHJzKSB7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGVsZW1lbnQncyBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIC8vIGtlZXBpbmcgb25seSBub24taTE4biByZWxhdGVkIG9uZXNcbiAgICAgICAgICAgICAgICBlbGVtZW50LmF0dHJzID0gYXR0cnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCBlbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcbiAgICBJMThuTWV0YVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGV4cGFuc2lvbiwgY29udGV4dCkge1xuICAgICAgICB2YXIgbWVzc2FnZTtcbiAgICAgICAgdmFyIG1ldGEgPSBleHBhbnNpb24uaTE4bjtcbiAgICAgICAgaWYgKG1ldGEgaW5zdGFuY2VvZiBJY3VQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgLy8gc2V0IElDVSBwbGFjZWhvbGRlciBuYW1lIChlLmcuIFwiSUNVXzFcIiksXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZWQgd2hpbGUgcHJvY2Vzc2luZyByb290IGVsZW1lbnQgY29udGVudHMsXG4gICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcmVmZXJlbmNlIGl0IHdoZW4gd2Ugb3V0cHV0IHRyYW5zbGF0aW9uXG4gICAgICAgICAgICB2YXIgbmFtZV8xID0gbWV0YS5uYW1lO1xuICAgICAgICAgICAgbWVzc2FnZSA9IHRoaXMuX2dlbmVyYXRlSTE4bk1lc3NhZ2UoW2V4cGFuc2lvbl0sIG1ldGEpO1xuICAgICAgICAgICAgdmFyIGljdSA9IGljdUZyb21JMThuTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIGljdS5uYW1lID0gbmFtZV8xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gd2hlbiBJQ1UgaXMgYSByb290IGxldmVsIHRyYW5zbGF0aW9uXG4gICAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fZ2VuZXJhdGVJMThuTWVzc2FnZShbZXhwYW5zaW9uXSwgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwYW5zaW9uLmkxOG4gPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gZXhwYW5zaW9uO1xuICAgIH07XG4gICAgSTE4bk1ldGFWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gdGV4dDsgfTtcbiAgICBJMThuTWV0YVZpc2l0b3IucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkgeyByZXR1cm4gYXR0cmlidXRlOyB9O1xuICAgIEkxOG5NZXRhVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQsIGNvbnRleHQpIHsgcmV0dXJuIGNvbW1lbnQ7IH07XG4gICAgSTE4bk1ldGFWaXNpdG9yLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoZXhwYW5zaW9uQ2FzZSwgY29udGV4dCkgeyByZXR1cm4gZXhwYW5zaW9uQ2FzZTsgfTtcbiAgICByZXR1cm4gSTE4bk1ldGFWaXNpdG9yO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGZvcm1hdFBoID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBcInskXCIgKyBmb3JtYXRJMThuUGxhY2Vob2xkZXJOYW1lKHZhbHVlKSArIFwifVwiOyB9O1xuLyoqXG4gKiBUaGlzIHZpc2l0b3Igd2Fsa3Mgb3ZlciBpMThuIHRyZWUgYW5kIGdlbmVyYXRlcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLFxuICogaW5jbHVkaW5nIElDVXMgYW5kIHBsYWNlaG9sZGVycyBpbiB7JFBMQUNFSE9MREVSfSBmb3JtYXQuXG4gKi9cbnZhciBTZXJpYWxpemVyVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXJpYWxpemVyVmlzaXRvcigpIHtcbiAgICB9XG4gICAgU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiB0ZXh0LnZhbHVlOyB9O1xuICAgIFNlcmlhbGl6ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXIsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZC52aXNpdChfdGhpcyk7IH0pLmpvaW4oJycpO1xuICAgIH07XG4gICAgU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1ID0gZnVuY3Rpb24gKGljdSwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc3RyQ2FzZXMgPSBPYmplY3Qua2V5cyhpY3UuY2FzZXMpLm1hcChmdW5jdGlvbiAoaykgeyByZXR1cm4gayArIFwiIHtcIiArIGljdS5jYXNlc1trXS52aXNpdChfdGhpcykgKyBcIn1cIjsgfSk7XG4gICAgICAgIHJldHVybiBcIntcIiArIGljdS5leHByZXNzaW9uUGxhY2Vob2xkZXIgKyBcIiwgXCIgKyBpY3UudHlwZSArIFwiLCBcIiArIHN0ckNhc2VzLmpvaW4oJyAnKSArIFwifVwiO1xuICAgIH07XG4gICAgU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGFnUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHBoLmlzVm9pZCA/XG4gICAgICAgICAgICBmb3JtYXRQaChwaC5zdGFydE5hbWUpIDpcbiAgICAgICAgICAgIFwiXCIgKyBmb3JtYXRQaChwaC5zdGFydE5hbWUpICsgcGguY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gY2hpbGQudmlzaXQoX3RoaXMpOyB9KS5qb2luKCcnKSArIGZvcm1hdFBoKHBoLmNsb3NlTmFtZSk7XG4gICAgfTtcbiAgICBTZXJpYWxpemVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkgeyByZXR1cm4gZm9ybWF0UGgocGgubmFtZSk7IH07XG4gICAgU2VyaWFsaXplclZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHsgcmV0dXJuIGZvcm1hdFBoKHBoLm5hbWUpOyB9O1xuICAgIHJldHVybiBTZXJpYWxpemVyVmlzaXRvcjtcbn0oKSk7XG52YXIgc2VyaWFsaXplclZpc2l0b3IkMSA9IG5ldyBTZXJpYWxpemVyVmlzaXRvcigpO1xuZnVuY3Rpb24gZ2V0U2VyaWFsaXplZEkxOG5Db250ZW50KG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gbWVzc2FnZS5ub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoc2VyaWFsaXplclZpc2l0b3IkMSwgbnVsbCk7IH0pLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBTZWxlY3RvciBhdHRyaWJ1dGUgbmFtZSBvZiBgPG5nLWNvbnRlbnQ+YFxudmFyIE5HX0NPTlRFTlRfU0VMRUNUX0FUVFIkMSA9ICdzZWxlY3QnO1xuLy8gQXR0cmlidXRlIG5hbWUgb2YgYG5nUHJvamVjdEFzYC5cbnZhciBOR19QUk9KRUNUX0FTX0FUVFJfTkFNRSA9ICduZ1Byb2plY3RBcyc7XG4vLyBMaXN0IG9mIHN1cHBvcnRlZCBnbG9iYWwgdGFyZ2V0cyBmb3IgZXZlbnQgbGlzdGVuZXJzXG52YXIgR0xPQkFMX1RBUkdFVF9SRVNPTFZFUlMgPSBuZXcgTWFwKFtbJ3dpbmRvdycsIElkZW50aWZpZXJzJDEucmVzb2x2ZVdpbmRvd10sIFsnZG9jdW1lbnQnLCBJZGVudGlmaWVycyQxLnJlc29sdmVEb2N1bWVudF0sIFsnYm9keScsIElkZW50aWZpZXJzJDEucmVzb2x2ZUJvZHldXSk7XG52YXIgTEVBRElOR19UUklWSUFfQ0hBUlMgPSBbJyAnLCAnXFxuJywgJ1xccicsICdcXHQnXTtcbi8vICBpZiAocmYgJiBmbGFncykgeyAuLiB9XG5mdW5jdGlvbiByZW5kZXJGbGFnQ2hlY2tJZlN0bXQoZmxhZ3MsIHN0YXRlbWVudHMpIHtcbiAgICByZXR1cm4gaWZTdG10KHZhcmlhYmxlKFJFTkRFUl9GTEFHUykuYml0d2lzZUFuZChsaXRlcmFsKGZsYWdzKSwgbnVsbCwgZmFsc2UpLCBzdGF0ZW1lbnRzKTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVFdmVudExpc3RlbmVyUGFyYW1ldGVycyhldmVudEFzdCwgaGFuZGxlck5hbWUsIHNjb3BlKSB7XG4gICAgaWYgKGhhbmRsZXJOYW1lID09PSB2b2lkIDApIHsgaGFuZGxlck5hbWUgPSBudWxsOyB9XG4gICAgaWYgKHNjb3BlID09PSB2b2lkIDApIHsgc2NvcGUgPSBudWxsOyB9XG4gICAgdmFyIHR5cGUgPSBldmVudEFzdC50eXBlLCBuYW1lID0gZXZlbnRBc3QubmFtZSwgdGFyZ2V0ID0gZXZlbnRBc3QudGFyZ2V0LCBwaGFzZSA9IGV2ZW50QXN0LnBoYXNlLCBoYW5kbGVyID0gZXZlbnRBc3QuaGFuZGxlcjtcbiAgICBpZiAodGFyZ2V0ICYmICFHTE9CQUxfVEFSR0VUX1JFU09MVkVSUy5oYXModGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGdsb2JhbCB0YXJnZXQgJ1wiICsgdGFyZ2V0ICsgXCInIGRlZmluZWQgZm9yICdcIiArIG5hbWUgKyBcIicgZXZlbnQuXFxuICAgICAgICBTdXBwb3J0ZWQgbGlzdCBvZiBnbG9iYWwgdGFyZ2V0czogXCIgKyBBcnJheS5mcm9tKEdMT0JBTF9UQVJHRVRfUkVTT0xWRVJTLmtleXMoKSkgKyBcIi5cIik7XG4gICAgfVxuICAgIHZhciBpbXBsaWNpdFJlY2VpdmVyRXhwciA9IChzY29wZSA9PT0gbnVsbCB8fCBzY29wZS5iaW5kaW5nTGV2ZWwgPT09IDApID9cbiAgICAgICAgdmFyaWFibGUoQ09OVEVYVF9OQU1FKSA6XG4gICAgICAgIHNjb3BlLmdldE9yQ3JlYXRlU2hhcmVkQ29udGV4dFZhcigwKTtcbiAgICB2YXIgYmluZGluZ0V4cHIgPSBjb252ZXJ0QWN0aW9uQmluZGluZyhzY29wZSwgaW1wbGljaXRSZWNlaXZlckV4cHIsIGhhbmRsZXIsICdiJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZXJyb3IoJ1VuZXhwZWN0ZWQgaW50ZXJwb2xhdGlvbicpOyB9LCBldmVudEFzdC5oYW5kbGVyU3Bhbik7XG4gICAgdmFyIHN0YXRlbWVudHMgPSBbXTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoLmFwcGx5KHN0YXRlbWVudHMsIF9fc3ByZWFkKHNjb3BlLnJlc3RvcmVWaWV3U3RhdGVtZW50KCkpKTtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoLmFwcGx5KHN0YXRlbWVudHMsIF9fc3ByZWFkKHNjb3BlLnZhcmlhYmxlRGVjbGFyYXRpb25zKCkpKTtcbiAgICB9XG4gICAgc3RhdGVtZW50cy5wdXNoLmFwcGx5KHN0YXRlbWVudHMsIF9fc3ByZWFkKGJpbmRpbmdFeHByLnJlbmRlcjNTdG10cykpO1xuICAgIHZhciBldmVudE5hbWUgPSB0eXBlID09PSAxIC8qIEFuaW1hdGlvbiAqLyA/IHByZXBhcmVTeW50aGV0aWNMaXN0ZW5lck5hbWUobmFtZSwgcGhhc2UpIDogbmFtZTtcbiAgICB2YXIgZm5OYW1lID0gaGFuZGxlck5hbWUgJiYgc2FuaXRpemVJZGVudGlmaWVyKGhhbmRsZXJOYW1lKTtcbiAgICB2YXIgZm5BcmdzID0gW25ldyBGblBhcmFtKCckZXZlbnQnLCBEWU5BTUlDX1RZUEUpXTtcbiAgICB2YXIgaGFuZGxlckZuID0gZm4oZm5BcmdzLCBzdGF0ZW1lbnRzLCBJTkZFUlJFRF9UWVBFLCBudWxsLCBmbk5hbWUpO1xuICAgIHZhciBwYXJhbXMgPSBbbGl0ZXJhbChldmVudE5hbWUpLCBoYW5kbGVyRm5dO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgcGFyYW1zLnB1c2gobGl0ZXJhbChmYWxzZSksIC8vIGB1c2VDYXB0dXJlYCBmbGFnLCBkZWZhdWx0cyB0byBgZmFsc2VgXG4gICAgICAgIGltcG9ydEV4cHIoR0xPQkFMX1RBUkdFVF9SRVNPTFZFUlMuZ2V0KHRhcmdldCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbn1cbnZhciBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIoY29uc3RhbnRQb29sLCBwYXJlbnRCaW5kaW5nU2NvcGUsIGxldmVsLCBjb250ZXh0TmFtZSwgaTE4bkNvbnRleHQsIHRlbXBsYXRlSW5kZXgsIHRlbXBsYXRlTmFtZSwgZGlyZWN0aXZlTWF0Y2hlciwgZGlyZWN0aXZlcywgcGlwZVR5cGVCeU5hbWUsIHBpcGVzLCBfbmFtZXNwYWNlLCByZWxhdGl2ZUNvbnRleHRGaWxlUGF0aCwgaTE4blVzZUV4dGVybmFsSWRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gdm9pZCAwKSB7IGxldmVsID0gMDsgfVxuICAgICAgICB0aGlzLmNvbnN0YW50UG9vbCA9IGNvbnN0YW50UG9vbDtcbiAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICAgICAgICB0aGlzLmNvbnRleHROYW1lID0gY29udGV4dE5hbWU7XG4gICAgICAgIHRoaXMuaTE4bkNvbnRleHQgPSBpMThuQ29udGV4dDtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZUluZGV4ID0gdGVtcGxhdGVJbmRleDtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlTWF0Y2hlciA9IGRpcmVjdGl2ZU1hdGNoZXI7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgIHRoaXMucGlwZVR5cGVCeU5hbWUgPSBwaXBlVHlwZUJ5TmFtZTtcbiAgICAgICAgdGhpcy5waXBlcyA9IHBpcGVzO1xuICAgICAgICB0aGlzLl9uYW1lc3BhY2UgPSBfbmFtZXNwYWNlO1xuICAgICAgICB0aGlzLnJlbGF0aXZlQ29udGV4dEZpbGVQYXRoID0gcmVsYXRpdmVDb250ZXh0RmlsZVBhdGg7XG4gICAgICAgIHRoaXMuaTE4blVzZUV4dGVybmFsSWRzID0gaTE4blVzZUV4dGVybmFsSWRzO1xuICAgICAgICB0aGlzLl9kYXRhSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9iaW5kaW5nQ29udGV4dCA9IDA7XG4gICAgICAgIHRoaXMuX3ByZWZpeENvZGUgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGdlbmVyYXRlIGNyZWF0aW9uIG1vZGUgaW5zdHJ1Y3Rpb25zLiBXZSBzdG9yZSB0aGVtIGhlcmUgYXMgd2UgcHJvY2Vzc1xuICAgICAgICAgKiB0aGUgdGVtcGxhdGUgc28gYmluZGluZ3MgaW4gbGlzdGVuZXJzIGFyZSByZXNvbHZlZCBvbmx5IG9uY2UgYWxsIG5vZGVzIGhhdmUgYmVlbiB2aXNpdGVkLlxuICAgICAgICAgKiBUaGlzIGVuc3VyZXMgYWxsIGxvY2FsIHJlZnMgYW5kIGNvbnRleHQgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgZm9yIG1hdGNoaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fY3JlYXRpb25Db2RlRm5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IG9mIGNhbGxiYWNrcyB0byBnZW5lcmF0ZSB1cGRhdGUgbW9kZSBpbnN0cnVjdGlvbnMuIFdlIHN0b3JlIHRoZW0gaGVyZSBhcyB3ZSBwcm9jZXNzXG4gICAgICAgICAqIHRoZSB0ZW1wbGF0ZSBzbyBiaW5kaW5ncyBhcmUgcmVzb2x2ZWQgb25seSBvbmNlIGFsbCBub2RlcyBoYXZlIGJlZW4gdmlzaXRlZC4gVGhpcyBlbnN1cmVzXG4gICAgICAgICAqIGFsbCBsb2NhbCByZWZzIGFuZCBjb250ZXh0IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIGZvciBtYXRjaGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvZGVGbnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1lbW9yaXplcyB0aGUgbGFzdCBub2RlIGluZGV4IGZvciB3aGljaCBhIHNlbGVjdCBpbnN0cnVjdGlvbiBoYXMgYmVlbiBnZW5lcmF0ZWQuXG4gICAgICAgICAqIFdlJ3JlIGluaXRpYWxpemluZyB0aGlzIHRvIC0xIHRvIGVuc3VyZSB0aGUgYHNlbGVjdCgwKWAgaW5zdHJ1Y3Rpb24gaXMgZ2VuZXJhdGVkIGJlZm9yZSBhbnlcbiAgICAgICAgICogcmVsZXZhbnQgdXBkYXRlIGluc3RydWN0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2xhc3ROb2RlSW5kZXhXaXRoRmx1c2ggPSAtMTtcbiAgICAgICAgLyoqIFRlbXBvcmFyeSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgZ2VuZXJhdGVkIGZyb20gdmlzaXRpbmcgcGlwZXMsIGxpdGVyYWxzLCBldGMuICovXG4gICAgICAgIHRoaXMuX3RlbXBWYXJpYWJsZXMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGJ1aWxkIG5lc3RlZCB0ZW1wbGF0ZXMuIE5lc3RlZCB0ZW1wbGF0ZXMgbXVzdCBub3QgYmUgdmlzaXRlZCB1bnRpbFxuICAgICAgICAgKiBhZnRlciB0aGUgcGFyZW50IHRlbXBsYXRlIGhhcyBmaW5pc2hlZCB2aXNpdGluZyBhbGwgb2YgaXRzIG5vZGVzLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGxcbiAgICAgICAgICogbG9jYWwgcmVmIGJpbmRpbmdzIGluIG5lc3RlZCB0ZW1wbGF0ZXMgYXJlIGFibGUgdG8gZmluZCBsb2NhbCByZWYgdmFsdWVzIGlmIHRoZSByZWZzXG4gICAgICAgICAqIGFyZSBkZWZpbmVkIGFmdGVyIHRoZSB0ZW1wbGF0ZSBkZWNsYXJhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX25lc3RlZFRlbXBsYXRlRm5zID0gW107XG4gICAgICAgIHRoaXMuX3Vuc3VwcG9ydGVkID0gdW5zdXBwb3J0ZWQ7XG4gICAgICAgIC8vIGkxOG4gY29udGV4dCBsb2NhbCB0byB0aGlzIHRlbXBsYXRlXG4gICAgICAgIHRoaXMuaTE4biA9IG51bGw7XG4gICAgICAgIC8vIE51bWJlciBvZiBzbG90cyB0byByZXNlcnZlIGZvciBwdXJlRnVuY3Rpb25zXG4gICAgICAgIHRoaXMuX3B1cmVGdW5jdGlvblNsb3RzID0gMDtcbiAgICAgICAgLy8gTnVtYmVyIG9mIGJpbmRpbmcgc2xvdHNcbiAgICAgICAgdGhpcy5fYmluZGluZ1Nsb3RzID0gMDtcbiAgICAgICAgLy8gUHJvamVjdGlvbiBzbG90cyBmb3VuZCBpbiB0aGUgdGVtcGxhdGUuIFByb2plY3Rpb24gc2xvdHMgY2FuIGRpc3RyaWJ1dGUgcHJvamVjdGVkXG4gICAgICAgIC8vIG5vZGVzIGJhc2VkIG9uIGEgc2VsZWN0b3IsIG9yIGNhbiBqdXN0IHVzZSB0aGUgd2lsZGNhcmQgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICAgICAgLy8gYWxsIG5vZGVzIHdoaWNoIGFyZW4ndCBtYXRjaGluZyBhbnkgc2VsZWN0b3IuXG4gICAgICAgIHRoaXMuX25nQ29udGVudFJlc2VydmVkU2xvdHMgPSBbXTtcbiAgICAgICAgLy8gTnVtYmVyIG9mIG5vbi1kZWZhdWx0IHNlbGVjdG9ycyBmb3VuZCBpbiBhbGwgcGFyZW50IHRlbXBsYXRlcyBvZiB0aGlzIHRlbXBsYXRlLiBXZSBuZWVkIHRvXG4gICAgICAgIC8vIHRyYWNrIGl0IHRvIHByb3Blcmx5IGFkanVzdCBwcm9qZWN0aW9uIHNsb3QgaW5kZXggaW4gdGhlIGBwcm9qZWN0aW9uYCBpbnN0cnVjdGlvbi5cbiAgICAgICAgdGhpcy5fbmdDb250ZW50U2VsZWN0b3JzT2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gRXhwcmVzc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGltcGxpY2l0IHJlY2VpdmVyIHdoZW4gY29udmVydGluZyB0ZW1wbGF0ZVxuICAgICAgICAvLyBleHByZXNzaW9ucyB0byBvdXRwdXQgQVNULlxuICAgICAgICB0aGlzLl9pbXBsaWNpdFJlY2VpdmVyRXhwciA9IG51bGw7XG4gICAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHRoZSB0ZW1wbGF0ZSBvciBlbGVtZW50IGRpcmVjdGx5LlxuICAgICAgICB0aGlzLnZpc2l0UmVmZXJlbmNlID0gaW52YWxpZCQxO1xuICAgICAgICB0aGlzLnZpc2l0VmFyaWFibGUgPSBpbnZhbGlkJDE7XG4gICAgICAgIHRoaXMudmlzaXRUZXh0QXR0cmlidXRlID0gaW52YWxpZCQxO1xuICAgICAgICB0aGlzLnZpc2l0Qm91bmRBdHRyaWJ1dGUgPSBpbnZhbGlkJDE7XG4gICAgICAgIHRoaXMudmlzaXRCb3VuZEV2ZW50ID0gaW52YWxpZCQxO1xuICAgICAgICB0aGlzLl9iaW5kaW5nU2NvcGUgPSBwYXJlbnRCaW5kaW5nU2NvcGUubmVzdGVkU2NvcGUobGV2ZWwpO1xuICAgICAgICAvLyBUdXJuIHRoZSByZWxhdGl2ZSBjb250ZXh0IGZpbGUgcGF0aCBpbnRvIGFuIGlkZW50aWZpZXIgYnkgcmVwbGFjaW5nIG5vbi1hbHBoYW51bWVyaWNcbiAgICAgICAgLy8gY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmVzLlxuICAgICAgICB0aGlzLmZpbGVCYXNlZEkxOG5TdWZmaXggPSByZWxhdGl2ZUNvbnRleHRGaWxlUGF0aC5yZXBsYWNlKC9bXkEtWmEtejAtOV0vZywgJ18nKSArICdfJztcbiAgICAgICAgdGhpcy5fdmFsdWVDb252ZXJ0ZXIgPSBuZXcgVmFsdWVDb252ZXJ0ZXIoY29uc3RhbnRQb29sLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5hbGxvY2F0ZURhdGFTbG90KCk7IH0sIGZ1bmN0aW9uIChudW1TbG90cykgeyByZXR1cm4gX3RoaXMuYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cyhudW1TbG90cyk7IH0sIGZ1bmN0aW9uIChuYW1lLCBsb2NhbE5hbWUsIHNsb3QsIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgcGlwZVR5cGUgPSBwaXBlVHlwZUJ5TmFtZS5nZXQobmFtZSk7XG4gICAgICAgICAgICBpZiAocGlwZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5waXBlcy5hZGQocGlwZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuX2JpbmRpbmdTY29wZS5zZXQoX3RoaXMubGV2ZWwsIGxvY2FsTmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgX3RoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihudWxsLCBJZGVudGlmaWVycyQxLnBpcGUsIFtsaXRlcmFsKHNsb3QpLCBsaXRlcmFsKG5hbWUpXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5yZWdpc3RlckNvbnRleHRWYXJpYWJsZXMgPSBmdW5jdGlvbiAodmFyaWFibGUkMSkge1xuICAgICAgICB2YXIgc2NvcGVkTmFtZSA9IHRoaXMuX2JpbmRpbmdTY29wZS5mcmVzaFJlZmVyZW5jZU5hbWUoKTtcbiAgICAgICAgdmFyIHJldHJpZXZhbExldmVsID0gdGhpcy5sZXZlbDtcbiAgICAgICAgdmFyIGxocyA9IHZhcmlhYmxlKHZhcmlhYmxlJDEubmFtZSArIHNjb3BlZE5hbWUpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nU2NvcGUuc2V0KHJldHJpZXZhbExldmVsLCB2YXJpYWJsZSQxLm5hbWUsIGxocywgMSAvKiBDT05URVhUICovLCBmdW5jdGlvbiAoc2NvcGUsIHJlbGF0aXZlTGV2ZWwpIHtcbiAgICAgICAgICAgIHZhciByaHM7XG4gICAgICAgICAgICBpZiAoc2NvcGUuYmluZGluZ0xldmVsID09PSByZXRyaWV2YWxMZXZlbCkge1xuICAgICAgICAgICAgICAgIC8vIGUuZy4gY3R4XG4gICAgICAgICAgICAgICAgcmhzID0gdmFyaWFibGUoQ09OVEVYVF9OQU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzaGFyZWRDdHhWYXIgPSBzY29wZS5nZXRTaGFyZWRDb250ZXh0TmFtZShyZXRyaWV2YWxMZXZlbCk7XG4gICAgICAgICAgICAgICAgLy8gZS5nLiBjdHhfcjAgICBPUiAgeCgyKTtcbiAgICAgICAgICAgICAgICByaHMgPSBzaGFyZWRDdHhWYXIgPyBzaGFyZWRDdHhWYXIgOiBnZW5lcmF0ZU5leHRDb250ZXh0RXhwcihyZWxhdGl2ZUxldmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gY29uc3QgJGl0ZW0kID0geCgyKS4kaW1wbGljaXQ7XG4gICAgICAgICAgICByZXR1cm4gW2xocy5zZXQocmhzLnByb3AodmFyaWFibGUkMS52YWx1ZSB8fCBJTVBMSUNJVF9SRUZFUkVOQ0UpKS50b0NvbnN0RGVjbCgpXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5idWlsZFRlbXBsYXRlRnVuY3Rpb24gPSBmdW5jdGlvbiAobm9kZXMsIHZhcmlhYmxlcywgbmdDb250ZW50U2VsZWN0b3JzT2Zmc2V0LCBpMThuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChuZ0NvbnRlbnRTZWxlY3RvcnNPZmZzZXQgPT09IHZvaWQgMCkgeyBuZ0NvbnRlbnRTZWxlY3RvcnNPZmZzZXQgPSAwOyB9XG4gICAgICAgIHRoaXMuX25nQ29udGVudFNlbGVjdG9yc09mZnNldCA9IG5nQ29udGVudFNlbGVjdG9yc09mZnNldDtcbiAgICAgICAgaWYgKHRoaXMuX25hbWVzcGFjZSAhPT0gSWRlbnRpZmllcnMkMS5uYW1lc3BhY2VIVE1MKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24obnVsbCwgdGhpcy5fbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdmFyaWFibGUgYmluZGluZ3NcbiAgICAgICAgdmFyaWFibGVzLmZvckVhY2goZnVuY3Rpb24gKHYpIHsgcmV0dXJuIF90aGlzLnJlZ2lzdGVyQ29udGV4dFZhcmlhYmxlcyh2KTsgfSk7XG4gICAgICAgIC8vIEluaXRpYXRlIGkxOG4gY29udGV4dCBpbiBjYXNlOlxuICAgICAgICAvLyAtIHRoaXMgdGVtcGxhdGUgaGFzIHBhcmVudCBpMThuIGNvbnRleHRcbiAgICAgICAgLy8gLSBvciB0aGUgdGVtcGxhdGUgaGFzIGkxOG4gbWV0YSBhc3NvY2lhdGVkIHdpdGggaXQsXG4gICAgICAgIC8vICAgYnV0IGl0J3Mgbm90IGluaXRpYXRlZCBieSB0aGUgRWxlbWVudCAoZS5nLiA8bmctdGVtcGxhdGUgaTE4bj4pXG4gICAgICAgIHZhciBpbml0STE4bkNvbnRleHQgPSB0aGlzLmkxOG5Db250ZXh0IHx8IChpc0kxOG5Sb290Tm9kZShpMThuKSAmJiAhaXNTaW5nbGVJMThuSWN1KGkxOG4pICYmXG4gICAgICAgICAgICAhKGlzU2luZ2xlRWxlbWVudFRlbXBsYXRlKG5vZGVzKSAmJiBub2Rlc1swXS5pMThuID09PSBpMThuKSk7XG4gICAgICAgIHZhciBzZWxmQ2xvc2luZ0kxOG5JbnN0cnVjdGlvbiA9IGhhc1RleHRDaGlsZHJlbk9ubHkobm9kZXMpO1xuICAgICAgICBpZiAoaW5pdEkxOG5Db250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5TdGFydChudWxsLCBpMThuLCBzZWxmQ2xvc2luZ0kxOG5JbnN0cnVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgaW5pdGlhbCBwYXNzIHRocm91Z2ggdGhlIG5vZGVzIG9mIHRoaXMgdGVtcGxhdGUuIEluIHRoaXMgcGFzcywgd2VcbiAgICAgICAgLy8gcXVldWUgYWxsIGNyZWF0aW9uIG1vZGUgYW5kIHVwZGF0ZSBtb2RlIGluc3RydWN0aW9ucyBmb3IgZ2VuZXJhdGlvbiBpbiB0aGUgc2Vjb25kXG4gICAgICAgIC8vIHBhc3MuIEl0J3MgbmVjZXNzYXJ5IHRvIHNlcGFyYXRlIHRoZSBwYXNzZXMgdG8gZW5zdXJlIGxvY2FsIHJlZnMgYXJlIGRlZmluZWQgYmVmb3JlXG4gICAgICAgIC8vIHJlc29sdmluZyBiaW5kaW5ncy4gV2UgYWxzbyBjb3VudCBiaW5kaW5ncyBpbiB0aGlzIHBhc3MgYXMgd2Ugd2FsayBib3VuZCBleHByZXNzaW9ucy5cbiAgICAgICAgdmlzaXRBbGwodGhpcywgbm9kZXMpO1xuICAgICAgICAvLyBBZGQgdG90YWwgYmluZGluZyBjb3VudCB0byBwdXJlIGZ1bmN0aW9uIGNvdW50IHNvIHB1cmUgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25zIGFyZVxuICAgICAgICAvLyBnZW5lcmF0ZWQgd2l0aCB0aGUgY29ycmVjdCBzbG90IG9mZnNldCB3aGVuIHVwZGF0ZSBpbnN0cnVjdGlvbnMgYXJlIHByb2Nlc3NlZC5cbiAgICAgICAgdGhpcy5fcHVyZUZ1bmN0aW9uU2xvdHMgKz0gdGhpcy5fYmluZGluZ1Nsb3RzO1xuICAgICAgICAvLyBQaXBlcyBhcmUgd2Fsa2VkIGluIHRoZSBmaXJzdCBwYXNzICh0byBlbnF1ZXVlIGBwaXBlKClgIGNyZWF0aW9uIGluc3RydWN0aW9ucyBhbmRcbiAgICAgICAgLy8gYHBpcGVCaW5kYCB1cGRhdGUgaW5zdHJ1Y3Rpb25zKSwgc28gd2UgaGF2ZSB0byB1cGRhdGUgdGhlIHNsb3Qgb2Zmc2V0cyBtYW51YWxseVxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBiaW5kaW5ncy5cbiAgICAgICAgdGhpcy5fdmFsdWVDb252ZXJ0ZXIudXBkYXRlUGlwZVNsb3RPZmZzZXRzKHRoaXMuX2JpbmRpbmdTbG90cyk7XG4gICAgICAgIC8vIE5lc3RlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBwcm9jZXNzZWQgYmVmb3JlIGNyZWF0aW9uIGluc3RydWN0aW9ucyBzbyB0ZW1wbGF0ZSgpXG4gICAgICAgIC8vIGluc3RydWN0aW9ucyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIGNvcnJlY3QgaW50ZXJuYWwgY29uc3QgY291bnQuXG4gICAgICAgIHRoaXMuX25lc3RlZFRlbXBsYXRlRm5zLmZvckVhY2goZnVuY3Rpb24gKGJ1aWxkVGVtcGxhdGVGbikgeyByZXR1cm4gYnVpbGRUZW1wbGF0ZUZuKCk7IH0pO1xuICAgICAgICAvLyBPdXRwdXQgdGhlIGBwcm9qZWN0aW9uRGVmYCBpbnN0cnVjdGlvbiB3aGVuIHNvbWUgYDxuZy1jb250ZW50PmAgdGFncyBhcmUgcHJlc2VudC5cbiAgICAgICAgLy8gVGhlIGBwcm9qZWN0aW9uRGVmYCBpbnN0cnVjdGlvbiBpcyBvbmx5IGVtaXR0ZWQgZm9yIHRoZSBjb21wb25lbnQgdGVtcGxhdGUgYW5kXG4gICAgICAgIC8vIGlzIHNraXBwZWQgZm9yIG5lc3RlZCB0ZW1wbGF0ZXMgKDxuZy10ZW1wbGF0ZT4gdGFncykuXG4gICAgICAgIGlmICh0aGlzLmxldmVsID09PSAwICYmIHRoaXMuX25nQ29udGVudFJlc2VydmVkU2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCB0aGUgYHByb2plY3Rpb25EZWZgIGluc3RydWN0aW9ucyBjcmVhdGVzIG9uZSBzbG90IGZvciB0aGUgd2lsZGNhcmRcbiAgICAgICAgICAgIC8vIHNlbGVjdG9yIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC4gVGhlcmVmb3JlIHdlIG9ubHkgd2FudCB0byBhbGxvY2F0ZSBhIG5ld1xuICAgICAgICAgICAgLy8gYXJyYXkgZm9yIHRoZSBwcm9qZWN0aW9uIHNsb3RzIGlmIHRoZSBkZWZhdWx0IHByb2plY3Rpb24gc2xvdCBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgICAgICAgIGlmICh0aGlzLl9uZ0NvbnRlbnRSZXNlcnZlZFNsb3RzLmxlbmd0aCA+IDEgfHwgdGhpcy5fbmdDb250ZW50UmVzZXJ2ZWRTbG90c1swXSAhPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIzUmVzZXJ2ZWRTbG90cyA9IHRoaXMuX25nQ29udGVudFJlc2VydmVkU2xvdHMubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzICE9PSAnKicgPyBwYXJzZVNlbGVjdG9yVG9SM1NlbGVjdG9yKHMpIDogczsgfSk7XG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHRoaXMuY29uc3RhbnRQb29sLmdldENvbnN0TGl0ZXJhbChhc0xpdGVyYWwocjNSZXNlcnZlZFNsb3RzKSwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2luY2Ugd2UgYWNjdW11bGF0ZSBuZ0NvbnRlbnQgc2VsZWN0b3JzIHdoaWxlIHByb2Nlc3NpbmcgdGVtcGxhdGUgZWxlbWVudHMsXG4gICAgICAgICAgICAvLyB3ZSAqcHJlcGVuZCogYHByb2plY3Rpb25EZWZgIHRvIGNyZWF0aW9uIGluc3RydWN0aW9ucyBibG9jaywgdG8gcHV0IGl0IGJlZm9yZVxuICAgICAgICAgICAgLy8gYW55IGBwcm9qZWN0aW9uYCBpbnN0cnVjdGlvbnNcbiAgICAgICAgICAgIHRoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihudWxsLCBJZGVudGlmaWVycyQxLnByb2plY3Rpb25EZWYsIHBhcmFtZXRlcnMsIC8qIHByZXBlbmQgKi8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXRJMThuQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5pMThuRW5kKG51bGwsIHNlbGZDbG9zaW5nSTE4bkluc3RydWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNyZWF0aW9uIG1vZGUgaW5zdHJ1Y3Rpb25zIChlLmcuIHJlc29sdmUgYmluZGluZ3MgaW4gbGlzdGVuZXJzKVxuICAgICAgICB2YXIgY3JlYXRpb25TdGF0ZW1lbnRzID0gdGhpcy5fY3JlYXRpb25Db2RlRm5zLm1hcChmdW5jdGlvbiAoZm4pIHsgcmV0dXJuIGZuKCk7IH0pO1xuICAgICAgICAvLyBHZW5lcmF0ZSBhbGwgdGhlIHVwZGF0ZSBtb2RlIGluc3RydWN0aW9ucyAoZS5nLiByZXNvbHZlIHByb3BlcnR5IG9yIHRleHQgYmluZGluZ3MpXG4gICAgICAgIHZhciB1cGRhdGVTdGF0ZW1lbnRzID0gdGhpcy5fdXBkYXRlQ29kZUZucy5tYXAoZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbigpOyB9KTtcbiAgICAgICAgLy8gIFZhcmlhYmxlIGRlY2xhcmF0aW9uIG11c3Qgb2NjdXIgYWZ0ZXIgYmluZGluZyByZXNvbHV0aW9uIHNvIHdlIGNhbiBnZW5lcmF0ZSBjb250ZXh0XG4gICAgICAgIC8vICBpbnN0cnVjdGlvbnMgdGhhdCBidWlsZCBvbiBlYWNoIG90aGVyLlxuICAgICAgICAvLyBlLmcuIGNvbnN0IGIgPSBuZXh0Q29udGV4dCgpLiRpbXBsaWNpdCgpOyBjb25zdCBiID0gbmV4dENvbnRleHQoKTtcbiAgICAgICAgdmFyIGNyZWF0aW9uVmFyaWFibGVzID0gdGhpcy5fYmluZGluZ1Njb3BlLnZpZXdTbmFwc2hvdFN0YXRlbWVudHMoKTtcbiAgICAgICAgdmFyIHVwZGF0ZVZhcmlhYmxlcyA9IHRoaXMuX2JpbmRpbmdTY29wZS52YXJpYWJsZURlY2xhcmF0aW9ucygpLmNvbmNhdCh0aGlzLl90ZW1wVmFyaWFibGVzKTtcbiAgICAgICAgdmFyIGNyZWF0aW9uQmxvY2sgPSBjcmVhdGlvblN0YXRlbWVudHMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICBbcmVuZGVyRmxhZ0NoZWNrSWZTdG10KDEgLyogQ3JlYXRlICovLCBjcmVhdGlvblZhcmlhYmxlcy5jb25jYXQoY3JlYXRpb25TdGF0ZW1lbnRzKSldIDpcbiAgICAgICAgICAgIFtdO1xuICAgICAgICB2YXIgdXBkYXRlQmxvY2sgPSB1cGRhdGVTdGF0ZW1lbnRzLmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgW3JlbmRlckZsYWdDaGVja0lmU3RtdCgyIC8qIFVwZGF0ZSAqLywgdXBkYXRlVmFyaWFibGVzLmNvbmNhdCh1cGRhdGVTdGF0ZW1lbnRzKSldIDpcbiAgICAgICAgICAgIFtdO1xuICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgIC8vIGkuZS4gKHJmOiBSZW5kZXJGbGFncywgY3R4OiBhbnkpXG4gICAgICAgIFtuZXcgRm5QYXJhbShSRU5ERVJfRkxBR1MsIE5VTUJFUl9UWVBFKSwgbmV3IEZuUGFyYW0oQ09OVEVYVF9OQU1FLCBudWxsKV0sIF9fc3ByZWFkKHRoaXMuX3ByZWZpeENvZGUsIGNyZWF0aW9uQmxvY2ssIHVwZGF0ZUJsb2NrKSwgSU5GRVJSRURfVFlQRSwgbnVsbCwgdGhpcy50ZW1wbGF0ZU5hbWUpO1xuICAgIH07XG4gICAgLy8gTG9jYWxSZXNvbHZlclxuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmdldExvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHRoaXMuX2JpbmRpbmdTY29wZS5nZXQobmFtZSk7IH07XG4gICAgLy8gTG9jYWxSZXNvbHZlclxuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLm5vdGlmeUltcGxpY2l0UmVjZWl2ZXJVc2UgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2JpbmRpbmdTY29wZS5ub3RpZnlJbXBsaWNpdFJlY2VpdmVyVXNlKCk7IH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuaTE4blRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBwYXJhbXMsIHJlZiwgdHJhbnNmb3JtRm4pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAocGFyYW1zID09PSB2b2lkIDApIHsgcGFyYW1zID0ge307IH1cbiAgICAgICAgdmFyIF9yZWYgPSByZWYgfHwgdmFyaWFibGUodGhpcy5jb25zdGFudFBvb2wudW5pcXVlTmFtZShUUkFOU0xBVElPTl9QUkVGSVgpKTtcbiAgICAgICAgLy8gQ2xvc3VyZSBDb21waWxlciByZXF1aXJlcyBjb25zdCBuYW1lcyB0byBzdGFydCB3aXRoIGBNU0dfYCBidXQgZGlzYWxsb3dzIGFueSBvdGhlciBjb25zdCB0b1xuICAgICAgICAvLyBzdGFydCB3aXRoIGBNU0dfYC4gV2UgZGVmaW5lIGEgdmFyaWFibGUgc3RhcnRpbmcgd2l0aCBgTVNHX2AganVzdCBmb3IgdGhlIGBnb29nLmdldE1zZ2AgY2FsbFxuICAgICAgICB2YXIgY2xvc3VyZVZhciA9IHRoaXMuaTE4bkdlbmVyYXRlQ2xvc3VyZVZhcihtZXNzYWdlLmlkKTtcbiAgICAgICAgdmFyIF9wYXJhbXMgPSB7fTtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIF9wYXJhbXNbZm9ybWF0STE4blBsYWNlaG9sZGVyTmFtZShrZXkpXSA9IHBhcmFtc1trZXldOyB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0YSA9IG1ldGFGcm9tSTE4bk1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIHZhciBjb250ZW50ID0gZ2V0U2VyaWFsaXplZEkxOG5Db250ZW50KG1lc3NhZ2UpO1xuICAgICAgICB2YXIgc3RhdGVtZW50cyA9IGdldFRyYW5zbGF0aW9uRGVjbFN0bXRzKF9yZWYsIGNsb3N1cmVWYXIsIGNvbnRlbnQsIG1ldGEsIF9wYXJhbXMsIHRyYW5zZm9ybUZuKTtcbiAgICAgICAgKF9hID0gdGhpcy5jb25zdGFudFBvb2wuc3RhdGVtZW50cykucHVzaC5hcHBseShfYSwgX19zcHJlYWQoc3RhdGVtZW50cykpO1xuICAgICAgICByZXR1cm4gX3JlZjtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmkxOG5BcHBlbmRCaW5kaW5ncyA9IGZ1bmN0aW9uIChleHByZXNzaW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXhwcmVzc2lvbikgeyByZXR1cm4gX3RoaXMuaTE4bi5hcHBlbmRCaW5kaW5nKGV4cHJlc3Npb24pOyB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuaTE4bkJpbmRQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgYm91bmQgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1trZXldO1xuICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBUZXh0KSB7XG4gICAgICAgICAgICAgICAgYm91bmRba2V5XSA9IGxpdGVyYWwocHJvcC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBwcm9wLnZhbHVlLnZpc2l0KF90aGlzLl92YWx1ZUNvbnZlcnRlcik7XG4gICAgICAgICAgICAgICAgX3RoaXMuYWxsb2NhdGVCaW5kaW5nU2xvdHModmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ3MgPSB2YWx1ZS5zdHJpbmdzLCBleHByZXNzaW9ucyA9IHZhbHVlLmV4cHJlc3Npb25zO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5pMThuLCBpZCA9IF9hLmlkLCBiaW5kaW5ncyA9IF9hLmJpbmRpbmdzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBhc3NlbWJsZUkxOG5Cb3VuZFN0cmluZyhzdHJpbmdzLCBiaW5kaW5ncy5zaXplLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmkxOG5BcHBlbmRCaW5kaW5ncyhleHByZXNzaW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kW2tleV0gPSBsaXRlcmFsKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5pMThuR2VuZXJhdGVDbG9zdXJlVmFyID0gZnVuY3Rpb24gKG1lc3NhZ2VJZCkge1xuICAgICAgICB2YXIgbmFtZTtcbiAgICAgICAgdmFyIHN1ZmZpeCA9IHRoaXMuZmlsZUJhc2VkSTE4blN1ZmZpeC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpcy5pMThuVXNlRXh0ZXJuYWxJZHMpIHtcbiAgICAgICAgICAgIHZhciBwcmVmaXggPSBnZXRUcmFuc2xhdGlvbkNvbnN0UHJlZml4KFwiRVhURVJOQUxfXCIpO1xuICAgICAgICAgICAgdmFyIHVuaXF1ZVN1ZmZpeCA9IHRoaXMuY29uc3RhbnRQb29sLnVuaXF1ZU5hbWUoc3VmZml4KTtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiICsgcHJlZml4ICsgc2FuaXRpemVJZGVudGlmaWVyKG1lc3NhZ2VJZCkgKyBcIiQkXCIgKyB1bmlxdWVTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJlZml4ID0gZ2V0VHJhbnNsYXRpb25Db25zdFByZWZpeChzdWZmaXgpO1xuICAgICAgICAgICAgbmFtZSA9IHRoaXMuY29uc3RhbnRQb29sLnVuaXF1ZU5hbWUocHJlZml4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFyaWFibGUobmFtZSk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5pMThuVXBkYXRlUmVmID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGljdXMgPSBjb250ZXh0LmljdXMsIG1ldGEgPSBjb250ZXh0Lm1ldGEsIGlzUm9vdCA9IGNvbnRleHQuaXNSb290LCBpc1Jlc29sdmVkID0gY29udGV4dC5pc1Jlc29sdmVkLCBpc0VtaXR0ZWQgPSBjb250ZXh0LmlzRW1pdHRlZDtcbiAgICAgICAgaWYgKGlzUm9vdCAmJiBpc1Jlc29sdmVkICYmICFpc0VtaXR0ZWQgJiYgIWlzU2luZ2xlSTE4bkljdShtZXRhKSkge1xuICAgICAgICAgICAgY29udGV4dC5pc0VtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVycyA9IGNvbnRleHQuZ2V0U2VyaWFsaXplZFBsYWNlaG9sZGVycygpO1xuICAgICAgICAgICAgdmFyIGljdU1hcHBpbmdfMSA9IHt9O1xuICAgICAgICAgICAgdmFyIHBhcmFtc18xID0gcGxhY2Vob2xkZXJzLnNpemUgPyBwbGFjZWhvbGRlcnNUb1BhcmFtcyhwbGFjZWhvbGRlcnMpIDoge307XG4gICAgICAgICAgICBpZiAoaWN1cy5zaXplKSB7XG4gICAgICAgICAgICAgICAgaWN1cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWZzLCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9uZSBJQ1UgZGVmaW5lZCBmb3IgYSBnaXZlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxhY2Vob2xkZXIgLSBqdXN0IG91dHB1dCBpdHMgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfMVtrZXldID0gcmVmc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBvdGhlcndpc2Ugd2UgbmVlZCB0byBhY3RpdmF0ZSBwb3N0LXByb2Nlc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlcGxhY2UgSUNVIHBsYWNlaG9sZGVycyB3aXRoIHByb3BlciB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IHdyYXBJMThuUGxhY2Vob2xkZXIoXCJcIiArIEkxOE5fSUNVX01BUFBJTkdfUFJFRklYICsga2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc18xW2tleV0gPSBsaXRlcmFsKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGljdU1hcHBpbmdfMVtrZXldID0gbGl0ZXJhbEFycihyZWZzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdHJhbnNsYXRpb24gcmVxdWlyZXMgcG9zdCBwcm9jZXNzaW5nIGluIDIgY2FzZXM6XG4gICAgICAgICAgICAvLyAtIGlmIHdlIGhhdmUgcGxhY2Vob2xkZXJzIHdpdGggbXVsdGlwbGUgdmFsdWVzIChleC4gYFNUQVJUX0RJVmA6IFvvv70jMe+/vSwg77+9IzLvv70sIC4uLl0pXG4gICAgICAgICAgICAvLyAtIGlmIHdlIGhhdmUgbXVsdGlwbGUgSUNVcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIHBsYWNlaG9sZGVyIG5hbWVcbiAgICAgICAgICAgIHZhciBuZWVkc1Bvc3Rwcm9jZXNzaW5nID0gQXJyYXkuZnJvbShwbGFjZWhvbGRlcnMudmFsdWVzKCkpLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5sZW5ndGggPiAxOyB9KSB8fFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGljdU1hcHBpbmdfMSkubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIHRyYW5zZm9ybUZuID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKG5lZWRzUG9zdHByb2Nlc3NpbmcpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GbiA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbcmF3XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGljdU1hcHBpbmdfMSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2gobWFwTGl0ZXJhbChpY3VNYXBwaW5nXzEsIHRydWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb24obnVsbCwgSWRlbnRpZmllcnMkMS5pMThuUG9zdHByb2Nlc3MsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmkxOG5UcmFuc2xhdGUobWV0YSwgcGFyYW1zXzEsIGNvbnRleHQucmVmLCB0cmFuc2Zvcm1Gbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmkxOG5TdGFydCA9IGZ1bmN0aW9uIChzcGFuLCBtZXRhLCBzZWxmQ2xvc2luZykge1xuICAgICAgICBpZiAoc3BhbiA9PT0gdm9pZCAwKSB7IHNwYW4gPSBudWxsOyB9XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuYWxsb2NhdGVEYXRhU2xvdCgpO1xuICAgICAgICBpZiAodGhpcy5pMThuQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5pMThuID0gdGhpcy5pMThuQ29udGV4dC5mb3JrQ2hpbGRDb250ZXh0KGluZGV4LCB0aGlzLnRlbXBsYXRlSW5kZXgsIG1ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHJlZl8xID0gdmFyaWFibGUodGhpcy5jb25zdGFudFBvb2wudW5pcXVlTmFtZShUUkFOU0xBVElPTl9QUkVGSVgpKTtcbiAgICAgICAgICAgIHRoaXMuaTE4biA9IG5ldyBJMThuQ29udGV4dChpbmRleCwgcmVmXzEsIDAsIHRoaXMudGVtcGxhdGVJbmRleCwgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2VuZXJhdGUgaTE4blN0YXJ0IGluc3RydWN0aW9uXG4gICAgICAgIHZhciBfYSA9IHRoaXMuaTE4biwgaWQgPSBfYS5pZCwgcmVmID0gX2EucmVmO1xuICAgICAgICB2YXIgcGFyYW1zID0gW2xpdGVyYWwoaW5kZXgpLCByZWZdO1xuICAgICAgICBpZiAoaWQgPiAwKSB7XG4gICAgICAgICAgICAvLyBkbyBub3QgcHVzaCAzcmQgYXJndW1lbnQgKHN1Yi1ibG9jayBpZClcbiAgICAgICAgICAgIC8vIGludG8gaTE4blN0YXJ0IGNhbGwgZm9yIHRvcCBsZXZlbCBpMThuIGNvbnRleHRcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKGxpdGVyYWwoaWQpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24oc3Bhbiwgc2VsZkNsb3NpbmcgPyBJZGVudGlmaWVycyQxLmkxOG4gOiBJZGVudGlmaWVycyQxLmkxOG5TdGFydCwgcGFyYW1zKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmkxOG5FbmQgPSBmdW5jdGlvbiAoc3Bhbiwgc2VsZkNsb3NpbmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHNwYW4gPT09IHZvaWQgMCkgeyBzcGFuID0gbnVsbDsgfVxuICAgICAgICBpZiAoIXRoaXMuaTE4bikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpMThuRW5kIGlzIGV4ZWN1dGVkIHdpdGggbm8gaTE4biBjb250ZXh0IHByZXNlbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pMThuQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5pMThuQ29udGV4dC5yZWNvbmNpbGVDaGlsZENvbnRleHQodGhpcy5pMThuKTtcbiAgICAgICAgICAgIHRoaXMuaTE4blVwZGF0ZVJlZih0aGlzLmkxOG5Db250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaTE4blVwZGF0ZVJlZih0aGlzLmkxOG4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldHVwIGFjY3VtdWxhdGVkIGJpbmRpbmdzXG4gICAgICAgIHZhciBfYSA9IHRoaXMuaTE4biwgaW5kZXggPSBfYS5pbmRleCwgYmluZGluZ3MgPSBfYS5iaW5kaW5ncztcbiAgICAgICAgaWYgKGJpbmRpbmdzLnNpemUpIHtcbiAgICAgICAgICAgIGJpbmRpbmdzLmZvckVhY2goZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVJbnN0cnVjdGlvbihpbmRleCwgc3BhbiwgSWRlbnRpZmllcnMkMS5pMThuRXhwLCBmdW5jdGlvbiAoKSB7IHJldHVybiBbX3RoaXMuY29udmVydFByb3BlcnR5QmluZGluZyhiaW5kaW5nKV07IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluc3RydWN0aW9uKGluZGV4LCBzcGFuLCBJZGVudGlmaWVycyQxLmkxOG5BcHBseSwgW2xpdGVyYWwoaW5kZXgpXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZWxmQ2xvc2luZykge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKHNwYW4sIElkZW50aWZpZXJzJDEuaTE4bkVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pMThuID0gbnVsbDsgLy8gcmVzZXQgbG9jYWwgaTE4biBjb250ZXh0XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS52aXNpdENvbnRlbnQgPSBmdW5jdGlvbiAobmdDb250ZW50KSB7XG4gICAgICAgIHZhciBzbG90ID0gdGhpcy5hbGxvY2F0ZURhdGFTbG90KCk7XG4gICAgICAgIHZhciBwcm9qZWN0aW9uU2xvdElkeCA9IHRoaXMuX25nQ29udGVudFNlbGVjdG9yc09mZnNldCArIHRoaXMuX25nQ29udGVudFJlc2VydmVkU2xvdHMubGVuZ3RoO1xuICAgICAgICB2YXIgcGFyYW1ldGVycyA9IFtsaXRlcmFsKHNsb3QpXTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fbmdDb250ZW50UmVzZXJ2ZWRTbG90cy5wdXNoKG5nQ29udGVudC5zZWxlY3Rvcik7XG4gICAgICAgIG5nQ29udGVudC5hdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGUubmFtZSwgdmFsdWUgPSBhdHRyaWJ1dGUudmFsdWU7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gTkdfUFJPSkVDVF9BU19BVFRSX05BTUUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2guYXBwbHkoYXR0cmlidXRlcywgX19zcHJlYWQoZ2V0TmdQcm9qZWN0QXNMaXRlcmFsKGF0dHJpYnV0ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSAhPT0gTkdfQ09OVEVOVF9TRUxFQ1RfQVRUUiQxKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGxpdGVyYWwobmFtZSksIGxpdGVyYWwodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChsaXRlcmFsKHByb2plY3Rpb25TbG90SWR4KSwgbGl0ZXJhbEFycihhdHRyaWJ1dGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvamVjdGlvblNsb3RJZHggIT09IDApIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChsaXRlcmFsKHByb2plY3Rpb25TbG90SWR4KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKG5nQ29udGVudC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLnByb2plY3Rpb24sIHBhcmFtZXRlcnMpO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlSW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiAobmFtZXNwYWNlS2V5KSB7XG4gICAgICAgIHN3aXRjaCAobmFtZXNwYWNlS2V5KSB7XG4gICAgICAgICAgICBjYXNlICdtYXRoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllcnMkMS5uYW1lc3BhY2VNYXRoTUw7XG4gICAgICAgICAgICBjYXNlICdzdmcnOlxuICAgICAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVycyQxLm5hbWVzcGFjZVNWRztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXJzJDEubmFtZXNwYWNlSFRNTDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuYWRkTmFtZXNwYWNlSW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiAobnNJbnN0cnVjdGlvbiwgZWxlbWVudCkge1xuICAgICAgICB0aGlzLl9uYW1lc3BhY2UgPSBuc0luc3RydWN0aW9uO1xuICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudC5zb3VyY2VTcGFuLCBuc0luc3RydWN0aW9uKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB2YXIgZWxlbWVudEluZGV4ID0gdGhpcy5hbGxvY2F0ZURhdGFTbG90KCk7XG4gICAgICAgIHZhciBzdHlsaW5nQnVpbGRlciA9IG5ldyBTdHlsaW5nQnVpbGRlcihsaXRlcmFsKGVsZW1lbnRJbmRleCksIG51bGwpO1xuICAgICAgICB2YXIgaXNOb25CaW5kYWJsZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGlzSTE4blJvb3RFbGVtZW50ID0gaXNJMThuUm9vdE5vZGUoZWxlbWVudC5pMThuKSAmJiAhaXNTaW5nbGVJMThuSWN1KGVsZW1lbnQuaTE4bik7XG4gICAgICAgIGlmIChpc0kxOG5Sb290RWxlbWVudCAmJiB0aGlzLmkxOG4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBtYXJrIGFuIGVsZW1lbnQgYXMgdHJhbnNsYXRhYmxlIGluc2lkZSBvZiBhIHRyYW5zbGF0YWJsZSBzZWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpMThuQXR0cnMgPSBbXTtcbiAgICAgICAgdmFyIG91dHB1dEF0dHJzID0gW107XG4gICAgICAgIHZhciBfYiA9IF9fcmVhZChzcGxpdE5zTmFtZShlbGVtZW50Lm5hbWUpLCAyKSwgbmFtZXNwYWNlS2V5ID0gX2JbMF0sIGVsZW1lbnROYW1lID0gX2JbMV07XG4gICAgICAgIHZhciBpc05nQ29udGFpbmVyJDEgPSBpc05nQ29udGFpbmVyKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgc3R5bGluZywgaTE4biwgbmdOb25CaW5kYWJsZSBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBmb3IgKHZhciBfYyA9IF9fdmFsdWVzKGVsZW1lbnQuYXR0cmlidXRlcyksIF9kID0gX2MubmV4dCgpOyAhX2QuZG9uZTsgX2QgPSBfYy5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSBhdHRyLm5hbWUsIHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZV8xID09PSBOT05fQklOREFCTEVfQVRUUikge1xuICAgICAgICAgICAgICAgICAgICBpc05vbkJpbmRhYmxlTW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVfMSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgICAgICAgICBzdHlsaW5nQnVpbGRlci5yZWdpc3RlclN0eWxlQXR0cih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVfMSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICBzdHlsaW5nQnVpbGRlci5yZWdpc3RlckNsYXNzQXR0cih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci5pMThuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGFjZSBhdHRyaWJ1dGVzIGludG8gYSBzZXBhcmF0ZSBhcnJheSBmb3IgaTE4biBwcm9jZXNzaW5nLCBidXQgYWxzbyBrZWVwIHN1Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgaW4gdGhlIG1haW4gbGlzdCB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGZvciBkaXJlY3RpdmUgbWF0Y2hpbmcgYXQgcnVudGltZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oRlctMTI0OCk6IHByZXZlbnQgYXR0cmlidXRlcyBkdXBsaWNhdGlvbiBpbiBgaTE4bkF0dHJpYnV0ZXNgIGFuZCBgZWxlbWVudFN0YXJ0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJndW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuQXR0cnMucHVzaChhdHRyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRBdHRycy5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE1hdGNoIGRpcmVjdGl2ZXMgb24gbm9uIGkxOG4gYXR0cmlidXRlc1xuICAgICAgICB0aGlzLm1hdGNoRGlyZWN0aXZlcyhlbGVtZW50Lm5hbWUsIGVsZW1lbnQpO1xuICAgICAgICAvLyBSZWd1bGFyIGVsZW1lbnQgb3IgbmctY29udGFpbmVyIGNyZWF0aW9uIG1vZGVcbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSBbbGl0ZXJhbChlbGVtZW50SW5kZXgpXTtcbiAgICAgICAgaWYgKCFpc05nQ29udGFpbmVyJDEpIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChsaXRlcmFsKGVsZW1lbnROYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gW107XG4gICAgICAgIHZhciBhbGxPdGhlcklucHV0cyA9IFtdO1xuICAgICAgICBlbGVtZW50LmlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHN0eWxpbmdJbnB1dFdhc1NldCA9IHN0eWxpbmdCdWlsZGVyLnJlZ2lzdGVyQm91bmRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXN0eWxpbmdJbnB1dFdhc1NldCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC50eXBlID09PSAwIC8qIFByb3BlcnR5ICovICYmIGlucHV0LmkxOG4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhY2UgYXR0cmlidXRlcyBpbnRvIGEgc2VwYXJhdGUgYXJyYXkgZm9yIGkxOG4gcHJvY2Vzc2luZywgYnV0IGFsc28ga2VlcCBzdWNoXG4gICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgaW4gdGhlIG1haW4gbGlzdCB0byBtYWtlIHRoZW0gYXZhaWxhYmxlIGZvciBkaXJlY3RpdmUgbWF0Y2hpbmcgYXQgcnVudGltZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhGVy0xMjQ4KTogcHJldmVudCBhdHRyaWJ1dGVzIGR1cGxpY2F0aW9uIGluIGBpMThuQXR0cmlidXRlc2AgYW5kIGBlbGVtZW50U3RhcnRgXG4gICAgICAgICAgICAgICAgICAgIC8vIGFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICBpMThuQXR0cnMucHVzaChpbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFsbE90aGVySW5wdXRzLnB1c2goaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0QXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgaWYgKGF0dHIubmFtZSA9PT0gTkdfUFJPSkVDVF9BU19BVFRSX05BTUUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2guYXBwbHkoYXR0cmlidXRlcywgX19zcHJlYWQoZ2V0TmdQcm9qZWN0QXNMaXRlcmFsKGF0dHIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2guYXBwbHkoYXR0cmlidXRlcywgX19zcHJlYWQoZ2V0QXR0cmlidXRlTmFtZUxpdGVyYWxzKGF0dHIubmFtZSksIFtsaXRlcmFsKGF0dHIudmFsdWUpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZXMgZm9yIGRpcmVjdGl2ZSBhbmQgcHJvamVjdGlvbiBtYXRjaGluZyBwdXJwb3Nlc1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2guYXBwbHkoYXR0cmlidXRlcywgX19zcHJlYWQodGhpcy5wcmVwYXJlTm9uUmVuZGVyQXR0cnMoYWxsT3RoZXJJbnB1dHMsIGVsZW1lbnQub3V0cHV0cywgc3R5bGluZ0J1aWxkZXIpKSk7XG4gICAgICAgIHBhcmFtZXRlcnMucHVzaCh0aGlzLnRvQXR0cnNQYXJhbShhdHRyaWJ1dGVzKSk7XG4gICAgICAgIC8vIGxvY2FsIHJlZnMgKGV4LjogPGRpdiAjZm9vICNiYXI9XCJiYXpcIj4pXG4gICAgICAgIHBhcmFtZXRlcnMucHVzaCh0aGlzLnByZXBhcmVSZWZzUGFyYW1ldGVyKGVsZW1lbnQucmVmZXJlbmNlcykpO1xuICAgICAgICB2YXIgd2FzSW5OYW1lc3BhY2UgPSB0aGlzLl9uYW1lc3BhY2U7XG4gICAgICAgIHZhciBjdXJyZW50TmFtZXNwYWNlID0gdGhpcy5nZXROYW1lc3BhY2VJbnN0cnVjdGlvbihuYW1lc3BhY2VLZXkpO1xuICAgICAgICAvLyBJZiB0aGUgbmFtZXNwYWNlIGlzIGNoYW5naW5nIG5vdywgaW5jbHVkZSBhbiBpbnN0cnVjdGlvbiB0byBjaGFuZ2UgaXRcbiAgICAgICAgLy8gZHVyaW5nIGVsZW1lbnQgY3JlYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50TmFtZXNwYWNlICE9PSB3YXNJbk5hbWVzcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5hZGROYW1lc3BhY2VJbnN0cnVjdGlvbihjdXJyZW50TmFtZXNwYWNlLCBlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pMThuKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG4uYXBwZW5kRWxlbWVudChlbGVtZW50LmkxOG4sIGVsZW1lbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhhc0NoaWxkcmVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFpc0kxOG5Sb290RWxlbWVudCAmJiBfdGhpcy5pMThuKSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGFwcGVuZCB0ZXh0IG5vZGUgaW5zdHJ1Y3Rpb25zIGFuZCBJQ1VzIGluc2lkZSBpMThuIHNlY3Rpb24sXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgZXhjbHVkZSB0aGVtIHdoaWxlIGNhbGN1bGF0aW5nIHdoZXRoZXIgY3VycmVudCBlbGVtZW50IGhhcyBjaGlsZHJlblxuICAgICAgICAgICAgICAgIHJldHVybiAhaGFzVGV4dENoaWxkcmVuT25seShlbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjcmVhdGVTZWxmQ2xvc2luZ0luc3RydWN0aW9uID0gIXN0eWxpbmdCdWlsZGVyLmhhc0JpbmRpbmdzICYmICFpc05nQ29udGFpbmVyJDEgJiZcbiAgICAgICAgICAgIGVsZW1lbnQub3V0cHV0cy5sZW5ndGggPT09IDAgJiYgaTE4bkF0dHJzLmxlbmd0aCA9PT0gMCAmJiAhaGFzQ2hpbGRyZW4oKTtcbiAgICAgICAgdmFyIGNyZWF0ZVNlbGZDbG9zaW5nSTE4bkluc3RydWN0aW9uID0gIWNyZWF0ZVNlbGZDbG9zaW5nSW5zdHJ1Y3Rpb24gJiZcbiAgICAgICAgICAgICFzdHlsaW5nQnVpbGRlci5oYXNCaW5kaW5ncyAmJiBoYXNUZXh0Q2hpbGRyZW5Pbmx5KGVsZW1lbnQuY2hpbGRyZW4pO1xuICAgICAgICBpZiAoY3JlYXRlU2VsZkNsb3NpbmdJbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKGVsZW1lbnQuc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS5lbGVtZW50LCB0cmltVHJhaWxpbmdOdWxscyhwYXJhbWV0ZXJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudC5zb3VyY2VTcGFuLCBpc05nQ29udGFpbmVyJDEgPyBJZGVudGlmaWVycyQxLmVsZW1lbnRDb250YWluZXJTdGFydCA6IElkZW50aWZpZXJzJDEuZWxlbWVudFN0YXJ0LCB0cmltVHJhaWxpbmdOdWxscyhwYXJhbWV0ZXJzKSk7XG4gICAgICAgICAgICBpZiAoaXNOb25CaW5kYWJsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLmRpc2FibGVCaW5kaW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwcm9jZXNzIGkxOG4gZWxlbWVudCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAoaTE4bkF0dHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBoYXNCaW5kaW5nc18xID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGkxOG5BdHRyQXJnc18xID0gW107XG4gICAgICAgICAgICAgICAgaTE4bkF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBhdHRyLmkxOG47XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bkF0dHJBcmdzXzEucHVzaChsaXRlcmFsKGF0dHIubmFtZSksIF90aGlzLmkxOG5UcmFuc2xhdGUobWVzc2FnZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnZlcnRlZCA9IGF0dHIudmFsdWUudmlzaXQoX3RoaXMuX3ZhbHVlQ29udmVydGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmFsbG9jYXRlQmluZGluZ1Nsb3RzKGNvbnZlcnRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkIGluc3RhbmNlb2YgSW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlcnMgPSBhc3NlbWJsZUJvdW5kVGV4dFBsYWNlaG9sZGVycyhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gcGxhY2Vob2xkZXJzVG9QYXJhbXMocGxhY2Vob2xkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuQXR0ckFyZ3NfMS5wdXNoKGxpdGVyYWwoYXR0ci5uYW1lKSwgX3RoaXMuaTE4blRyYW5zbGF0ZShtZXNzYWdlLCBwYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQuZXhwcmVzc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAoZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNCaW5kaW5nc18xID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBfdGhpcy5jb252ZXJ0RXhwcmVzc2lvbkJpbmRpbmcoZXhwcmVzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUluc3RydWN0aW9uKGVsZW1lbnRJbmRleCwgZWxlbWVudC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLmkxOG5FeHAsIFtiaW5kaW5nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaTE4bkF0dHJBcmdzXzEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpdGVyYWwodGhpcy5hbGxvY2F0ZURhdGFTbG90KCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMuY29uc3RhbnRQb29sLmdldENvbnN0TGl0ZXJhbChsaXRlcmFsQXJyKGkxOG5BdHRyQXJnc18xKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihlbGVtZW50LnNvdXJjZVNwYW4sIElkZW50aWZpZXJzJDEuaTE4bkF0dHJpYnV0ZXMsIFtpbmRleCwgYXJnc10pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmluZGluZ3NfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbnN0cnVjdGlvbihlbGVtZW50SW5kZXgsIGVsZW1lbnQuc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS5pMThuQXBwbHksIFtpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHN0eWxlIGJpbmRpbmdzIGNvZGUgaXMgcGxhY2VkIGludG8gdHdvIGRpc3RpbmN0IGJsb2NrcyB3aXRoaW4gdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIEFPVFxuICAgICAgICAgICAgLy8gY29kZTogY3JlYXRpb24gYW5kIHVwZGF0ZS4gVGhlIGNyZWF0aW9uIGNvZGUgY29udGFpbnMgdGhlIGBlbGVtZW50U3R5bGluZ2AgaW5zdHJ1Y3Rpb25zXG4gICAgICAgICAgICAvLyB3aGljaCB3aWxsIGFwcGx5IHRoZSBjb2xsZWN0ZWQgYmluZGluZyB2YWx1ZXMgdG8gdGhlIGVsZW1lbnQuIGBlbGVtZW50U3R5bGluZ2AgaXNcbiAgICAgICAgICAgIC8vIGRlc2lnbmVkIHRvIHJ1biBpbnNpZGUgb2YgYGVsZW1lbnRTdGFydGAgYW5kIGBlbGVtZW50RW5kYC4gVGhlIHVwZGF0ZSBpbnN0cnVjdGlvbnNcbiAgICAgICAgICAgIC8vICh0aGluZ3MgbGlrZSBgZWxlbWVudFN0eWxlUHJvcGAsIGBlbGVtZW50Q2xhc3NQcm9wYCwgZXRjLi4pIGFyZSBhcHBsaWVkIGxhdGVyIG9uIGluIHRoaXNcbiAgICAgICAgICAgIC8vIGZpbGVcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0eWxpbmdJbnN0cnVjdGlvbihzdHlsaW5nQnVpbGRlci5idWlsZEVsZW1lbnRTdHlsaW5nSW5zdHJ1Y3Rpb24oZWxlbWVudC5zb3VyY2VTcGFuLCB0aGlzLmNvbnN0YW50UG9vbCksIHRydWUpO1xuICAgICAgICAgICAgLy8gR2VuZXJhdGUgTGlzdGVuZXJzIChvdXRwdXRzKVxuICAgICAgICAgICAgZWxlbWVudC5vdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dEFzdCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24ob3V0cHV0QXN0LnNvdXJjZVNwYW4sIElkZW50aWZpZXJzJDEubGlzdGVuZXIsIF90aGlzLnByZXBhcmVMaXN0ZW5lclBhcmFtZXRlcihlbGVtZW50Lm5hbWUsIG91dHB1dEFzdCwgZWxlbWVudEluZGV4KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIE5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIGtlZXAgaTE4bi9pMThuU3RhcnQgaW5zdHJ1Y3Rpb25zIGFmdGVyIGkxOG5BdHRyaWJ1dGVzIGFuZFxuICAgICAgICAgICAgLy8gbGlzdGVuZXJzLCB0byBtYWtlIHN1cmUgaTE4bkF0dHJpYnV0ZXMgaW5zdHJ1Y3Rpb24gdGFyZ2V0cyBjdXJyZW50IGVsZW1lbnQgYXQgcnVudGltZS5cbiAgICAgICAgICAgIGlmIChpc0kxOG5Sb290RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaTE4blN0YXJ0KGVsZW1lbnQuc291cmNlU3BhbiwgZWxlbWVudC5pMThuLCBjcmVhdGVTZWxmQ2xvc2luZ0kxOG5JbnN0cnVjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGNvZGUgaGVyZSB3aWxsIGNvbGxlY3QgYWxsIHVwZGF0ZS1sZXZlbCBzdHlsaW5nIGluc3RydWN0aW9ucyBhbmQgYWRkIHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIHVwZGF0ZSBibG9jayBvZiB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gQU9UIGNvZGUuIEluc3RydWN0aW9ucyBsaWtlIGBlbGVtZW50U3R5bGVQcm9wYCxcbiAgICAgICAgLy8gYGVsZW1lbnRTdHlsaW5nTWFwYCwgYGVsZW1lbnRDbGFzc1Byb3BgIGFuZCBgZWxlbWVudFN0eWxpbmdBcHBseWAgYXJlIGFsbCBnZW5lcmF0ZWRcbiAgICAgICAgLy8gYW5kIGFzc2lnbiBpbiB0aGUgY29kZSBiZWxvdy5cbiAgICAgICAgc3R5bGluZ0J1aWxkZXIuYnVpbGRVcGRhdGVMZXZlbEluc3RydWN0aW9ucyh0aGlzLl92YWx1ZUNvbnZlcnRlcikuZm9yRWFjaChmdW5jdGlvbiAoaW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9iaW5kaW5nU2xvdHMgKz0gaW5zdHJ1Y3Rpb24uYWxsb2NhdGVCaW5kaW5nU2xvdHM7XG4gICAgICAgICAgICBfdGhpcy5wcm9jZXNzU3R5bGluZ0luc3RydWN0aW9uKGluc3RydWN0aW9uLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGUgcmVhc29uIHdoeSBgdW5kZWZpbmVkYCBpcyB1c2VkIGlzIGJlY2F1c2UgdGhlIHJlbmRlcmVyIHVuZGVyc3RhbmRzIHRoaXMgYXMgYVxuICAgICAgICAvLyBzcGVjaWFsIHZhbHVlIHRvIHN5bWJvbGl6ZSB0aGF0IHRoZXJlIGlzIG5vIFJIUyB0byB0aGlzIGJpbmRpbmdcbiAgICAgICAgLy8gVE9ETyAobWF0c2tvKTogcmV2aXNpdCB0aGlzIG9uY2UgRlctOTU5IGlzIGFwcHJvYWNoZWRcbiAgICAgICAgdmFyIGVtcHR5VmFsdWVCaW5kSW5zdHJ1Y3Rpb24gPSBsaXRlcmFsKHVuZGVmaW5lZCk7XG4gICAgICAgIC8vIEdlbmVyYXRlIGVsZW1lbnQgaW5wdXQgYmluZGluZ3NcbiAgICAgICAgYWxsT3RoZXJJbnB1dHMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBpbnB1dFR5cGUgPSBpbnB1dC50eXBlO1xuICAgICAgICAgICAgaWYgKGlucHV0VHlwZSA9PT0gNCAvKiBBbmltYXRpb24gKi8pIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVfMSA9IGlucHV0LnZhbHVlLnZpc2l0KF90aGlzLl92YWx1ZUNvbnZlcnRlcik7XG4gICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9uIGJpbmRpbmdzIGNhbiBiZSBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzOlxuICAgICAgICAgICAgICAgIC8vIDEuIFtAYmluZGluZ109XCJmb29FeHBcIlxuICAgICAgICAgICAgICAgIC8vIDIuIFtAYmluZGluZ109XCJ7dmFsdWU6Zm9vRXhwLCBwYXJhbXM6ey4uLn19XCJcbiAgICAgICAgICAgICAgICAvLyAzLiBbQGJpbmRpbmddXG4gICAgICAgICAgICAgICAgLy8gNC4gQGJpbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBBbGwgZm9ybWF0cyB3aWxsIGJlIHZhbGlkIGZvciB3aGVuIGEgc3ludGhldGljIGJpbmRpbmcgaXMgY3JlYXRlZC5cbiAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uaW5nIGZvciB0aGlzIGlzIGJlY2F1c2UgdGhlIHJlbmRlcmVyIHNob3VsZCBnZXQgZWFjaFxuICAgICAgICAgICAgICAgIC8vIHN5bnRoZXRpYyBiaW5kaW5nIHZhbHVlIGluIHRoZSBvcmRlciBvZiB0aGUgYXJyYXkgdGhhdCB0aGV5IGFyZVxuICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgaW4uLi5cbiAgICAgICAgICAgICAgICB2YXIgaGFzVmFsdWVfMSA9IHZhbHVlXzEgaW5zdGFuY2VvZiBMaXRlcmFsUHJpbWl0aXZlID8gISF2YWx1ZV8xLnZhbHVlIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICBfdGhpcy5hbGxvY2F0ZUJpbmRpbmdTbG90cyh2YWx1ZV8xKTtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ05hbWVfMSA9IHByZXBhcmVTeW50aGV0aWNQcm9wZXJ0eU5hbWUoaW5wdXQubmFtZSk7XG4gICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlSW5zdHJ1Y3Rpb24oZWxlbWVudEluZGV4LCBpbnB1dC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLnByb3BlcnR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsKGJpbmRpbmdOYW1lXzEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGhhc1ZhbHVlXzEgPyBfdGhpcy5jb252ZXJ0UHJvcGVydHlCaW5kaW5nKHZhbHVlXzEsIC8qIHNraXBCaW5kRm4gKi8gdHJ1ZSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5VmFsdWVCaW5kSW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBza2lwIGF0dHJpYnV0ZXMgd2l0aCBhc3NvY2lhdGVkIGkxOG4gY29udGV4dCwgc2luY2UgdGhlc2UgYXR0cmlidXRlcyBhcmUgaGFuZGxlZFxuICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlbHkgYW5kIGNvcnJlc3BvbmRpbmcgYGkxOG5FeHBgIGFuZCBgaTE4bkFwcGx5YCBpbnN0cnVjdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuaTE4bilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZV8yID0gaW5wdXQudmFsdWUudmlzaXQoX3RoaXMuX3ZhbHVlQ29udmVydGVyKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVfMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbXNfMiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EgPSBfX3JlYWQoc3BsaXROc05hbWUoaW5wdXQubmFtZSksIDIpLCBhdHRyTmFtZXNwYWNlID0gX2FbMF0sIGF0dHJOYW1lXzEgPSBfYVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQXR0cmlidXRlQmluZGluZyA9IGlucHV0VHlwZSA9PT0gMSAvKiBBdHRyaWJ1dGUgKi87XG4gICAgICAgICAgICAgICAgICAgIHZhciBzYW5pdGl6YXRpb25SZWYgPSByZXNvbHZlU2FuaXRpemF0aW9uRm4oaW5wdXQuc2VjdXJpdHlDb250ZXh0LCBpc0F0dHJpYnV0ZUJpbmRpbmcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2FuaXRpemF0aW9uUmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zXzIucHVzaChzYW5pdGl6YXRpb25SZWYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVzcGFjZUxpdGVyYWwgPSBsaXRlcmFsKGF0dHJOYW1lc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhbml0aXphdGlvblJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc18yLnB1c2gobmFtZXNwYWNlTGl0ZXJhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXNuJ3QgYSBzYW5pdGl6YXRpb24gcmVmLCB3ZSBuZWVkIHRvIGFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIGV4dHJhIHBhcmFtIHNvIHRoYXQgd2UgY2FuIHBhc3MgaW4gdGhlIG5hbWVzcGFjZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfMi5wdXNoKGxpdGVyYWwobnVsbCksIG5hbWVzcGFjZUxpdGVyYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmFsbG9jYXRlQmluZGluZ1Nsb3RzKHZhbHVlXzIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlID09PSAwIC8qIFByb3BlcnR5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVfMiBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy51cGRhdGVJbnN0cnVjdGlvbihlbGVtZW50SW5kZXgsIGlucHV0LnNvdXJjZVNwYW4sIGdldFByb3BlcnR5SW50ZXJwb2xhdGlvbkV4cHJlc3Npb24odmFsdWVfMiksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkKFtsaXRlcmFsKGF0dHJOYW1lXzEpXSwgX3RoaXMuZ2V0VXBkYXRlSW5zdHJ1Y3Rpb25Bcmd1bWVudHModmFsdWVfMiksIHBhcmFtc18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kLCB1bi1pbnRlcnBvbGF0ZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUluc3RydWN0aW9uKGVsZW1lbnRJbmRleCwgaW5wdXQuc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS5wcm9wZXJ0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19zcHJlYWQoW2xpdGVyYWwoYXR0ck5hbWVfMSksIF90aGlzLmNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcodmFsdWVfMiwgdHJ1ZSldLCBwYXJhbXNfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25fMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGUgPT09IDIgLyogQ2xhc3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbl8xID0gSWRlbnRpZmllcnMkMS5lbGVtZW50Q2xhc3NQcm9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fMSA9IElkZW50aWZpZXJzJDEuZWxlbWVudEF0dHJpYnV0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUluc3RydWN0aW9uKGVsZW1lbnRJbmRleCwgaW5wdXQuc291cmNlU3BhbiwgaW5zdHJ1Y3Rpb25fMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3NwcmVhZChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwoZWxlbWVudEluZGV4KSwgbGl0ZXJhbChhdHRyTmFtZV8xKSwgX3RoaXMuY29udmVydFByb3BlcnR5QmluZGluZyh2YWx1ZV8yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHBhcmFtc18yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gVHJhdmVyc2UgZWxlbWVudCBjaGlsZCBub2Rlc1xuICAgICAgICB2aXNpdEFsbCh0aGlzLCBlbGVtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgaWYgKCFpc0kxOG5Sb290RWxlbWVudCAmJiB0aGlzLmkxOG4pIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bi5hcHBlbmRFbGVtZW50KGVsZW1lbnQuaTE4biwgZWxlbWVudEluZGV4LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNyZWF0ZVNlbGZDbG9zaW5nSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgICAgIC8vIEZpbmlzaCBlbGVtZW50IGNvbnN0cnVjdGlvbiBtb2RlLlxuICAgICAgICAgICAgdmFyIHNwYW4gPSBlbGVtZW50LmVuZFNvdXJjZVNwYW4gfHwgZWxlbWVudC5zb3VyY2VTcGFuO1xuICAgICAgICAgICAgaWYgKGlzSTE4blJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pMThuRW5kKHNwYW4sIGNyZWF0ZVNlbGZDbG9zaW5nSTE4bkluc3RydWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05vbkJpbmRhYmxlTW9kZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihzcGFuLCBJZGVudGlmaWVycyQxLmVuYWJsZUJpbmRpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihzcGFuLCBpc05nQ29udGFpbmVyJDEgPyBJZGVudGlmaWVycyQxLmVsZW1lbnRDb250YWluZXJFbmQgOiBJZGVudGlmaWVycyQxLmVsZW1lbnRFbmQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS52aXNpdFRlbXBsYXRlID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBOR19URU1QTEFURV9UQUdfTkFNRSA9ICduZy10ZW1wbGF0ZSc7XG4gICAgICAgIHZhciB0ZW1wbGF0ZUluZGV4ID0gdGhpcy5hbGxvY2F0ZURhdGFTbG90KCk7XG4gICAgICAgIGlmICh0aGlzLmkxOG4pIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bi5hcHBlbmRUZW1wbGF0ZSh0ZW1wbGF0ZS5pMThuLCB0ZW1wbGF0ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGFnTmFtZSA9IHNhbml0aXplSWRlbnRpZmllcih0ZW1wbGF0ZS50YWdOYW1lIHx8ICcnKTtcbiAgICAgICAgdmFyIGNvbnRleHROYW1lID0gXCJcIiArIHRoaXMuY29udGV4dE5hbWUgKyAodGFnTmFtZSA/ICdfJyArIHRhZ05hbWUgOiAnJykgKyBcIl9cIiArIHRlbXBsYXRlSW5kZXg7XG4gICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBjb250ZXh0TmFtZSArIFwiX1RlbXBsYXRlXCI7XG4gICAgICAgIHZhciBwYXJhbWV0ZXJzID0gW1xuICAgICAgICAgICAgbGl0ZXJhbCh0ZW1wbGF0ZUluZGV4KSxcbiAgICAgICAgICAgIHZhcmlhYmxlKHRlbXBsYXRlTmFtZSksXG4gICAgICAgICAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB0YWcncyBuYW1lc3BhY2UgaGVyZSwgYmVjYXVzZSB3ZSBpbmZlclxuICAgICAgICAgICAgLy8gaXQgYmFzZWQgb24gdGhlIHBhcmVudCBub2RlcyBpbnNpZGUgdGhlIHRlbXBsYXRlIGluc3RydWN0aW9uLlxuICAgICAgICAgICAgbGl0ZXJhbCh0ZW1wbGF0ZS50YWdOYW1lID8gc3BsaXROc05hbWUodGVtcGxhdGUudGFnTmFtZSlbMV0gOiB0ZW1wbGF0ZS50YWdOYW1lKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gZmluZCBkaXJlY3RpdmVzIG1hdGNoaW5nIG9uIGEgZ2l2ZW4gPG5nLXRlbXBsYXRlPiBub2RlXG4gICAgICAgIHRoaXMubWF0Y2hEaXJlY3RpdmVzKE5HX1RFTVBMQVRFX1RBR19OQU1FLCB0ZW1wbGF0ZSk7XG4gICAgICAgIC8vIHByZXBhcmUgYXR0cmlidXRlcyBwYXJhbWV0ZXIgKGluY2x1ZGluZyBhdHRyaWJ1dGVzIHVzZWQgZm9yIGRpcmVjdGl2ZSBtYXRjaGluZylcbiAgICAgICAgdmFyIGF0dHJzRXhwcnMgPSBbXTtcbiAgICAgICAgdGVtcGxhdGUuYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7IGF0dHJzRXhwcnMucHVzaChhc0xpdGVyYWwoYS5uYW1lKSwgYXNMaXRlcmFsKGEudmFsdWUpKTsgfSk7XG4gICAgICAgIGF0dHJzRXhwcnMucHVzaC5hcHBseShhdHRyc0V4cHJzLCBfX3NwcmVhZCh0aGlzLnByZXBhcmVOb25SZW5kZXJBdHRycyh0ZW1wbGF0ZS5pbnB1dHMsIHRlbXBsYXRlLm91dHB1dHMsIHVuZGVmaW5lZCwgdGVtcGxhdGUudGVtcGxhdGVBdHRycykpKTtcbiAgICAgICAgcGFyYW1ldGVycy5wdXNoKHRoaXMudG9BdHRyc1BhcmFtKGF0dHJzRXhwcnMpKTtcbiAgICAgICAgLy8gbG9jYWwgcmVmcyAoZXguOiA8bmctdGVtcGxhdGUgI2Zvbz4pXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5yZWZlcmVuY2VzICYmIHRlbXBsYXRlLnJlZmVyZW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2godGhpcy5wcmVwYXJlUmVmc1BhcmFtZXRlcih0ZW1wbGF0ZS5yZWZlcmVuY2VzKSk7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2goaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnRlbXBsYXRlUmVmRXh0cmFjdG9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvblxuICAgICAgICB2YXIgdGVtcGxhdGVWaXNpdG9yID0gbmV3IFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIodGhpcy5jb25zdGFudFBvb2wsIHRoaXMuX2JpbmRpbmdTY29wZSwgdGhpcy5sZXZlbCArIDEsIGNvbnRleHROYW1lLCB0aGlzLmkxOG4sIHRlbXBsYXRlSW5kZXgsIHRlbXBsYXRlTmFtZSwgdGhpcy5kaXJlY3RpdmVNYXRjaGVyLCB0aGlzLmRpcmVjdGl2ZXMsIHRoaXMucGlwZVR5cGVCeU5hbWUsIHRoaXMucGlwZXMsIHRoaXMuX25hbWVzcGFjZSwgdGhpcy5maWxlQmFzZWRJMThuU3VmZml4LCB0aGlzLmkxOG5Vc2VFeHRlcm5hbElkcyk7XG4gICAgICAgIC8vIE5lc3RlZCB0ZW1wbGF0ZXMgbXVzdCBub3QgYmUgdmlzaXRlZCB1bnRpbCBhZnRlciB0aGVpciBwYXJlbnQgdGVtcGxhdGVzIGhhdmUgY29tcGxldGVkXG4gICAgICAgIC8vIHByb2Nlc3NpbmcsIHNvIHRoZXkgYXJlIHF1ZXVlZCBoZXJlIHVudGlsIGFmdGVyIHRoZSBpbml0aWFsIHBhc3MuIE90aGVyd2lzZSwgd2Ugd291bGRuJ3RcbiAgICAgICAgLy8gYmUgYWJsZSB0byBzdXBwb3J0IGJpbmRpbmdzIGluIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gbG9jYWwgcmVmcyB0aGF0IG9jY3VyIGFmdGVyIHRoZVxuICAgICAgICAvLyB0ZW1wbGF0ZSBkZWZpbml0aW9uLiBlLmcuIDxkaXYgKm5nSWY9XCJzaG93aW5nXCI+e3sgZm9vIH19PC9kaXY+ICA8ZGl2ICNmb28+PC9kaXY+XG4gICAgICAgIHRoaXMuX25lc3RlZFRlbXBsYXRlRm5zLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRnVuY3Rpb25FeHByID0gdGVtcGxhdGVWaXNpdG9yLmJ1aWxkVGVtcGxhdGVGdW5jdGlvbih0ZW1wbGF0ZS5jaGlsZHJlbiwgdGVtcGxhdGUudmFyaWFibGVzLCBfdGhpcy5fbmdDb250ZW50UmVzZXJ2ZWRTbG90cy5sZW5ndGggKyBfdGhpcy5fbmdDb250ZW50U2VsZWN0b3JzT2Zmc2V0LCB0ZW1wbGF0ZS5pMThuKTtcbiAgICAgICAgICAgIF90aGlzLmNvbnN0YW50UG9vbC5zdGF0ZW1lbnRzLnB1c2godGVtcGxhdGVGdW5jdGlvbkV4cHIudG9EZWNsU3RtdCh0ZW1wbGF0ZU5hbWUsIG51bGwpKTtcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVZpc2l0b3IuX25nQ29udGVudFJlc2VydmVkU2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgKF9hID0gX3RoaXMuX25nQ29udGVudFJlc2VydmVkU2xvdHMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkKHRlbXBsYXRlVmlzaXRvci5fbmdDb250ZW50UmVzZXJ2ZWRTbG90cykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZS5nLiB0ZW1wbGF0ZSgxLCBNeUNvbXBfVGVtcGxhdGVfMSlcbiAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKHRlbXBsYXRlLnNvdXJjZVNwYW4sIElkZW50aWZpZXJzJDEudGVtcGxhdGVDcmVhdGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuc3BsaWNlKDIsIDAsIGxpdGVyYWwodGVtcGxhdGVWaXNpdG9yLmdldENvbnN0Q291bnQoKSksIGxpdGVyYWwodGVtcGxhdGVWaXNpdG9yLmdldFZhckNvdW50KCkpKTtcbiAgICAgICAgICAgIHJldHVybiB0cmltVHJhaWxpbmdOdWxscyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGhhbmRsZSBwcm9wZXJ0eSBiaW5kaW5ncyBlLmcuIMm1ybVwcm9wZXJ0eSgnbmdGb3JPZicsIGN0eC5pdGVtcyksIGV0IGFsO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUHJvcGVydHlCaW5kaW5ncyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmRleCwgdGVtcGxhdGUudGVtcGxhdGVBdHRycyk7XG4gICAgICAgIC8vIE9ubHkgYWRkIG5vcm1hbCBpbnB1dC9vdXRwdXQgYmluZGluZyBpbnN0cnVjdGlvbnMgb24gZXhwbGljaXQgbmctdGVtcGxhdGUgZWxlbWVudHMuXG4gICAgICAgIGlmICh0ZW1wbGF0ZS50YWdOYW1lID09PSBOR19URU1QTEFURV9UQUdfTkFNRSkge1xuICAgICAgICAgICAgLy8gQWRkIHRoZSBpbnB1dCBiaW5kaW5nc1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVByb3BlcnR5QmluZGluZ3ModGVtcGxhdGUsIHRlbXBsYXRlSW5kZXgsIHRlbXBsYXRlLmlucHV0cyk7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBsaXN0ZW5lcnMgZm9yIGRpcmVjdGl2ZSBvdXRwdXRcbiAgICAgICAgICAgIHRlbXBsYXRlLm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0QXN0KSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRpb25JbnN0cnVjdGlvbihvdXRwdXRBc3Quc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS5saXN0ZW5lciwgX3RoaXMucHJlcGFyZUxpc3RlbmVyUGFyYW1ldGVyKCduZ190ZW1wbGF0ZScsIG91dHB1dEFzdCwgdGVtcGxhdGVJbmRleCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLnZpc2l0Qm91bmRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuaTE4bikge1xuICAgICAgICAgICAgdmFyIHZhbHVlXzMgPSB0ZXh0LnZhbHVlLnZpc2l0KHRoaXMuX3ZhbHVlQ29udmVydGVyKTtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGVCaW5kaW5nU2xvdHModmFsdWVfMyk7XG4gICAgICAgICAgICBpZiAodmFsdWVfMyBpbnN0YW5jZW9mIEludGVycG9sYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmkxOG4uYXBwZW5kQm91bmRUZXh0KHRleHQuaTE4bik7XG4gICAgICAgICAgICAgICAgdGhpcy5pMThuQXBwZW5kQmluZGluZ3ModmFsdWVfMy5leHByZXNzaW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IHRoaXMuYWxsb2NhdGVEYXRhU2xvdCgpO1xuICAgICAgICB0aGlzLmNyZWF0aW9uSW5zdHJ1Y3Rpb24odGV4dC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLnRleHQsIFtsaXRlcmFsKG5vZGVJbmRleCldKTtcbiAgICAgICAgdmFyIHZhbHVlID0gdGV4dC52YWx1ZS52aXNpdCh0aGlzLl92YWx1ZUNvbnZlcnRlcik7XG4gICAgICAgIHRoaXMuYWxsb2NhdGVCaW5kaW5nU2xvdHModmFsdWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUluc3RydWN0aW9uKG5vZGVJbmRleCwgdGV4dC5zb3VyY2VTcGFuLCBJZGVudGlmaWVycyQxLnRleHRCaW5kaW5nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBbbGl0ZXJhbChub2RlSW5kZXgpLCBfdGhpcy5jb252ZXJ0UHJvcGVydHlCaW5kaW5nKHZhbHVlKV07IH0pO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgLy8gd2hlbiBhIHRleHQgZWxlbWVudCBpcyBsb2NhdGVkIHdpdGhpbiBhIHRyYW5zbGF0YWJsZVxuICAgICAgICAvLyBibG9jaywgd2UgZXhjbHVkZSB0aGlzIHRleHQgZWxlbWVudCBmcm9tIGluc3RydWN0aW9ucyBzZXQsXG4gICAgICAgIC8vIHNpbmNlIGl0IHdpbGwgYmUgY2FwdHVyZWQgaW4gaTE4biBjb250ZW50IGFuZCBwcm9jZXNzZWQgYXQgcnVudGltZVxuICAgICAgICBpZiAoIXRoaXMuaTE4bikge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKHRleHQuc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS50ZXh0LCBbbGl0ZXJhbCh0aGlzLmFsbG9jYXRlRGF0YVNsb3QoKSksIGxpdGVyYWwodGV4dC52YWx1ZSldKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1KSB7XG4gICAgICAgIHZhciBpbml0V2FzSW52b2tlZCA9IGZhbHNlO1xuICAgICAgICAvLyBpZiBhbiBJQ1Ugd2FzIGNyZWF0ZWQgb3V0c2lkZSBvZiBpMThuIGJsb2NrLCB3ZSBzdGlsbCB0cmVhdFxuICAgICAgICAvLyBpdCBhcyBhIHRyYW5zbGF0YWJsZSBlbnRpdHkgYW5kIGludm9rZSBpMThuU3RhcnQgYW5kIGkxOG5FbmRcbiAgICAgICAgLy8gdG8gZ2VuZXJhdGUgaTE4biBjb250ZXh0IGFuZCB0aGUgbmVjZXNzYXJ5IGluc3RydWN0aW9uc1xuICAgICAgICBpZiAoIXRoaXMuaTE4bikge1xuICAgICAgICAgICAgaW5pdFdhc0ludm9rZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pMThuU3RhcnQobnVsbCwgaWN1LmkxOG4sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpMThuID0gdGhpcy5pMThuO1xuICAgICAgICB2YXIgdmFycyA9IHRoaXMuaTE4bkJpbmRQcm9wcyhpY3UudmFycyk7XG4gICAgICAgIHZhciBwbGFjZWhvbGRlcnMgPSB0aGlzLmkxOG5CaW5kUHJvcHMoaWN1LnBsYWNlaG9sZGVycyk7XG4gICAgICAgIC8vIG91dHB1dCBJQ1UgZGlyZWN0bHkgYW5kIGtlZXAgSUNVIHJlZmVyZW5jZSBpbiBjb250ZXh0XG4gICAgICAgIHZhciBtZXNzYWdlID0gaWN1LmkxOG47XG4gICAgICAgIHZhciB0cmFuc2Zvcm1GbiA9IGZ1bmN0aW9uIChyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbihudWxsLCBJZGVudGlmaWVycyQxLmkxOG5Qb3N0cHJvY2VzcywgW3JhdywgbWFwTGl0ZXJhbCh2YXJzLCB0cnVlKV0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBpbiBjYXNlIHRoZSB3aG9sZSBpMThuIG1lc3NhZ2UgaXMgYSBzaW5nbGUgSUNVIC0gd2UgZG8gbm90IG5lZWQgdG9cbiAgICAgICAgLy8gY3JlYXRlIGEgc2VwYXJhdGUgdG9wLWxldmVsIHRyYW5zbGF0aW9uLCB3ZSBjYW4gdXNlIHRoZSByb290IHJlZiBpbnN0ZWFkXG4gICAgICAgIC8vIGFuZCBtYWtlIHRoaXMgSUNVIGEgdG9wLWxldmVsIHRyYW5zbGF0aW9uXG4gICAgICAgIGlmIChpc1NpbmdsZUkxOG5JY3UoaTE4bi5tZXRhKSkge1xuICAgICAgICAgICAgdGhpcy5pMThuVHJhbnNsYXRlKG1lc3NhZ2UsIHBsYWNlaG9sZGVycywgaTE4bi5yZWYsIHRyYW5zZm9ybUZuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIG91dHB1dCBJQ1UgZGlyZWN0bHkgYW5kIGtlZXAgSUNVIHJlZmVyZW5jZSBpbiBjb250ZXh0XG4gICAgICAgICAgICB2YXIgcmVmID0gdGhpcy5pMThuVHJhbnNsYXRlKG1lc3NhZ2UsIHBsYWNlaG9sZGVycywgdW5kZWZpbmVkLCB0cmFuc2Zvcm1Gbik7XG4gICAgICAgICAgICBpMThuLmFwcGVuZEljdShpY3VGcm9tSTE4bk1lc3NhZ2UobWVzc2FnZSkubmFtZSwgcmVmKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdFdhc0ludm9rZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaTE4bkVuZChudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmFsbG9jYXRlRGF0YVNsb3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhSW5kZXgrKzsgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5nZXRDb25zdENvdW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YUluZGV4OyB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmdldFZhckNvdW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHVyZUZ1bmN0aW9uU2xvdHM7IH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuZ2V0TmdDb250ZW50U2VsZWN0b3JzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmdDb250ZW50UmVzZXJ2ZWRTbG90cy5sZW5ndGggP1xuICAgICAgICAgICAgdGhpcy5jb25zdGFudFBvb2wuZ2V0Q29uc3RMaXRlcmFsKGFzTGl0ZXJhbCh0aGlzLl9uZ0NvbnRlbnRSZXNlcnZlZFNsb3RzKSwgdHJ1ZSkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmJpbmRpbmdDb250ZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJcIiArIHRoaXMuX2JpbmRpbmdDb250ZXh0Kys7IH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUudGVtcGxhdGVQcm9wZXJ0eUJpbmRpbmdzID0gZnVuY3Rpb24gKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZGV4LCBhdHRycykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBhdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQm91bmRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVfNCA9IGlucHV0LnZhbHVlLnZpc2l0KF90aGlzLl92YWx1ZUNvbnZlcnRlcik7XG4gICAgICAgICAgICAgICAgX3RoaXMuYWxsb2NhdGVCaW5kaW5nU2xvdHModmFsdWVfNCk7XG4gICAgICAgICAgICAgICAgX3RoaXMudXBkYXRlSW5zdHJ1Y3Rpb24odGVtcGxhdGVJbmRleCwgdGVtcGxhdGUuc291cmNlU3BhbiwgSWRlbnRpZmllcnMkMS5wcm9wZXJ0eSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gW2xpdGVyYWwoaW5wdXQubmFtZSksIF90aGlzLmNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcodmFsdWVfNCwgdHJ1ZSldOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBCaW5kaW5ncyBtdXN0IG9ubHkgYmUgcmVzb2x2ZWQgYWZ0ZXIgYWxsIGxvY2FsIHJlZnMgaGF2ZSBiZWVuIHZpc2l0ZWQsIHNvIGFsbFxuICAgIC8vIGluc3RydWN0aW9ucyBhcmUgcXVldWVkIGluIGNhbGxiYWNrcyB0aGF0IGV4ZWN1dGUgb25jZSB0aGUgaW5pdGlhbCBwYXNzIGhhcyBjb21wbGV0ZWQuXG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHN1cHBvcnQgbG9jYWwgcmVmcyB0aGF0IGFyZSBkZWZpbmVkIGFmdGVyIHRoZWlyXG4gICAgLy8gYmluZGluZ3MuIGUuZy4ge3sgZm9vIH19IDxkaXYgI2Zvbz48L2Rpdj5cbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5pbnN0cnVjdGlvbkZuID0gZnVuY3Rpb24gKGZucywgc3BhbiwgcmVmZXJlbmNlLCBwYXJhbXNPckZuLCBwcmVwZW5kKSB7XG4gICAgICAgIGlmIChwcmVwZW5kID09PSB2b2lkIDApIHsgcHJlcGVuZCA9IGZhbHNlOyB9XG4gICAgICAgIGZuc1twcmVwZW5kID8gJ3Vuc2hpZnQnIDogJ3B1c2gnXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gQXJyYXkuaXNBcnJheShwYXJhbXNPckZuKSA/IHBhcmFtc09yRm4gOiBwYXJhbXNPckZuKCk7XG4gICAgICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb24oc3BhbiwgcmVmZXJlbmNlLCBwYXJhbXMpLnRvU3RtdCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLnByb2Nlc3NTdHlsaW5nSW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiAoaW5zdHJ1Y3Rpb24sIGNyZWF0ZU1vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKGluc3RydWN0aW9uKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uLmJ1aWxkUGFyYW1zKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gX3RoaXMuY29udmVydFByb3BlcnR5QmluZGluZyh2YWx1ZSwgdHJ1ZSk7IH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjcmVhdGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGlvbkluc3RydWN0aW9uKGluc3RydWN0aW9uLnNvdXJjZVNwYW4sIGluc3RydWN0aW9uLnJlZmVyZW5jZSwgcGFyYW1zRm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJbnN0cnVjdGlvbigtMSwgaW5zdHJ1Y3Rpb24uc291cmNlU3BhbiwgaW5zdHJ1Y3Rpb24ucmVmZXJlbmNlLCBwYXJhbXNGbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmNyZWF0aW9uSW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiAoc3BhbiwgcmVmZXJlbmNlLCBwYXJhbXNPckZuLCBwcmVwZW5kKSB7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25Gbih0aGlzLl9jcmVhdGlvbkNvZGVGbnMsIHNwYW4sIHJlZmVyZW5jZSwgcGFyYW1zT3JGbiB8fCBbXSwgcHJlcGVuZCk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS51cGRhdGVJbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIChub2RlSW5kZXgsIHNwYW4sIHJlZmVyZW5jZSwgcGFyYW1zT3JGbikge1xuICAgICAgICBpZiAodGhpcy5fbGFzdE5vZGVJbmRleFdpdGhGbHVzaCA8IG5vZGVJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5pbnN0cnVjdGlvbkZuKHRoaXMuX3VwZGF0ZUNvZGVGbnMsIHNwYW4sIElkZW50aWZpZXJzJDEuc2VsZWN0LCBbbGl0ZXJhbChub2RlSW5kZXgpXSk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Tm9kZUluZGV4V2l0aEZsdXNoID0gbm9kZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25Gbih0aGlzLl91cGRhdGVDb2RlRm5zLCBzcGFuLCByZWZlcmVuY2UsIHBhcmFtc09yRm4gfHwgW10pO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cyA9IGZ1bmN0aW9uIChudW1TbG90cykge1xuICAgICAgICB2YXIgb3JpZ2luYWxTbG90cyA9IHRoaXMuX3B1cmVGdW5jdGlvblNsb3RzO1xuICAgICAgICB0aGlzLl9wdXJlRnVuY3Rpb25TbG90cyArPSBudW1TbG90cztcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2xvdHM7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5hbGxvY2F0ZUJpbmRpbmdTbG90cyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nU2xvdHMgKz0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uID8gdmFsdWUuZXhwcmVzc2lvbnMubGVuZ3RoIDogMTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgYW4gZXhwcmVzc2lvbiB0aGF0IHJlZmVycyB0byB0aGUgaW1wbGljaXQgcmVjZWl2ZXIuIFRoZSBpbXBsaWNpdFxuICAgICAqIHJlY2VpdmVyIGlzIGFsd2F5cyB0aGUgcm9vdCBsZXZlbCBjb250ZXh0LlxuICAgICAqL1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmdldEltcGxpY2l0UmVjZWl2ZXJFeHByID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5faW1wbGljaXRSZWNlaXZlckV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbXBsaWNpdFJlY2VpdmVyRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faW1wbGljaXRSZWNlaXZlckV4cHIgPSB0aGlzLmxldmVsID09PSAwID9cbiAgICAgICAgICAgIHZhcmlhYmxlKENPTlRFWFRfTkFNRSkgOlxuICAgICAgICAgICAgdGhpcy5fYmluZGluZ1Njb3BlLmdldE9yQ3JlYXRlU2hhcmVkQ29udGV4dFZhcigwKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmNvbnZlcnRFeHByZXNzaW9uQmluZGluZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgY29udmVydGVkUHJvcGVydHlCaW5kaW5nID0gY29udmVydFByb3BlcnR5QmluZGluZyh0aGlzLCB0aGlzLmdldEltcGxpY2l0UmVjZWl2ZXJFeHByKCksIHZhbHVlLCB0aGlzLmJpbmRpbmdDb250ZXh0KCksIEJpbmRpbmdGb3JtLlRyeVNpbXBsZSk7XG4gICAgICAgIHZhciB2YWxFeHByID0gY29udmVydGVkUHJvcGVydHlCaW5kaW5nLmN1cnJWYWxFeHByO1xuICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmJpbmQpLmNhbGxGbihbdmFsRXhwcl0pO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUuY29udmVydFByb3BlcnR5QmluZGluZyA9IGZ1bmN0aW9uICh2YWx1ZSwgc2tpcEJpbmRGbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBpbnRlcnBvbGF0aW9uRm4gPSB2YWx1ZSBpbnN0YW5jZW9mIEludGVycG9sYXRpb24gPyBpbnRlcnBvbGF0ZSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVycm9yKCdVbmV4cGVjdGVkIGludGVycG9sYXRpb24nKTsgfTtcbiAgICAgICAgdmFyIGNvbnZlcnRlZFByb3BlcnR5QmluZGluZyA9IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcodGhpcywgdGhpcy5nZXRJbXBsaWNpdFJlY2VpdmVyRXhwcigpLCB2YWx1ZSwgdGhpcy5iaW5kaW5nQ29udGV4dCgpLCBCaW5kaW5nRm9ybS5UcnlTaW1wbGUsIGludGVycG9sYXRpb25Gbik7XG4gICAgICAgIHZhciB2YWxFeHByID0gY29udmVydGVkUHJvcGVydHlCaW5kaW5nLmN1cnJWYWxFeHByO1xuICAgICAgICAoX2EgPSB0aGlzLl90ZW1wVmFyaWFibGVzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZChjb252ZXJ0ZWRQcm9wZXJ0eUJpbmRpbmcuc3RtdHMpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGlvbiB8fCBza2lwQmluZEZuID8gdmFsRXhwciA6XG4gICAgICAgICAgICBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuYmluZCkuY2FsbEZuKFt2YWxFeHByXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHZXRzIGEgbGlzdCBvZiBhcmd1bWVudCBleHByZXNzaW9ucyB0byBwYXNzIHRvIGFuIHVwZGF0ZSBpbnN0cnVjdGlvbiBleHByZXNzaW9uLiBBbHNvIHVwZGF0ZXNcbiAgICAgKiB0aGUgdGVtcCB2YXJpYWJsZXMgc3RhdGUgd2l0aCB0ZW1wIHZhcmlhYmxlcyB0aGF0IHdlcmUgaWRlbnRpZmllZCBhcyBuZWVkaW5nIHRvIGJlIGNyZWF0ZWRcbiAgICAgKiB3aGlsZSB2aXNpdGluZyB0aGUgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb3JpZ2luYWwgZXhwcmVzc2lvbiB3ZSB3aWxsIGJlIHJlc29sdmluZyBhbiBhcmd1bWVudHMgbGlzdCBmcm9tLlxuICAgICAqL1xuICAgIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIucHJvdG90eXBlLmdldFVwZGF0ZUluc3RydWN0aW9uQXJndW1lbnRzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF9iID0gY29udmVydFVwZGF0ZUFyZ3VtZW50cyh0aGlzLCB0aGlzLmdldEltcGxpY2l0UmVjZWl2ZXJFeHByKCksIHZhbHVlLCB0aGlzLmJpbmRpbmdDb250ZXh0KCkpLCBhcmdzID0gX2IuYXJncywgc3RtdHMgPSBfYi5zdG10cztcbiAgICAgICAgKF9hID0gdGhpcy5fdGVtcFZhcmlhYmxlcykucHVzaC5hcHBseShfYSwgX19zcHJlYWQoc3RtdHMpKTtcbiAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURlZmluaXRpb25CdWlsZGVyLnByb3RvdHlwZS5tYXRjaERpcmVjdGl2ZXMgPSBmdW5jdGlvbiAodGFnTmFtZSwgZWxPclRwbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5kaXJlY3RpdmVNYXRjaGVyKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSBjcmVhdGVDc3NTZWxlY3Rvcih0YWdOYW1lLCBnZXRBdHRyc0ZvckRpcmVjdGl2ZU1hdGNoaW5nKGVsT3JUcGwpKTtcbiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlTWF0Y2hlci5tYXRjaChzZWxlY3RvciwgZnVuY3Rpb24gKGNzc1NlbGVjdG9yLCBzdGF0aWNUeXBlKSB7IF90aGlzLmRpcmVjdGl2ZXMuYWRkKHN0YXRpY1R5cGUpOyB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJlcGFyZXMgYWxsIGF0dHJpYnV0ZSBleHByZXNzaW9uIHZhbHVlcyBmb3IgdGhlIGBUQXR0cmlidXRlc2AgYXJyYXkuXG4gICAgICpcbiAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHByb3Blcmx5IGNvbnN0cnVjdCBhbiBhdHRyaWJ1dGVzIGFycmF5IHRoYXRcbiAgICAgKiBpcyBwYXNzZWQgaW50byB0aGUgYGVsZW1lbnRTdGFydGAgKG9yIGp1c3QgYGVsZW1lbnRgKSBmdW5jdGlvbnMuIEJlY2F1c2UgdGhlcmVcbiAgICAgKiBhcmUgbWFueSBkaWZmZXJlbnQgdHlwZXMgb2YgYXR0cmlidXRlcywgdGhlIGFycmF5IG5lZWRzIHRvIGJlIGNvbnN0cnVjdGVkIGluIGFcbiAgICAgKiBzcGVjaWFsIHdheSBzbyB0aGF0IGBlbGVtZW50U3RhcnRgIGNhbiBwcm9wZXJseSBldmFsdWF0ZSB0aGVtLlxuICAgICAqXG4gICAgICogVGhlIGZvcm1hdCBsb29rcyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBhdHRycyA9IFtwcm9wLCB2YWx1ZSwgcHJvcDIsIHZhbHVlMixcbiAgICAgKiAgIENMQVNTRVMsIGNsYXNzMSwgY2xhc3MyLFxuICAgICAqICAgU1RZTEVTLCBzdHlsZTEsIHZhbHVlMSwgc3R5bGUyLCB2YWx1ZTIsXG4gICAgICogICBCSU5ESU5HUywgbmFtZTEsIG5hbWUyLCBuYW1lMyxcbiAgICAgKiAgIFRFTVBMQVRFLCBuYW1lNCwgbmFtZTUsIC4uLl1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgZnVsbHkgaWdub3JlIGFsbCBzeW50aGV0aWMgKEBmb28pIGF0dHJpYnV0ZSB2YWx1ZXNcbiAgICAgKiBiZWNhdXNlIHRob3NlIHZhbHVlcyBhcmUgaW50ZW5kZWQgdG8gYWx3YXlzIGJlIGdlbmVyYXRlZCBhcyBwcm9wZXJ0eSBpbnN0cnVjdGlvbnMuXG4gICAgICovXG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUucHJlcGFyZU5vblJlbmRlckF0dHJzID0gZnVuY3Rpb24gKGlucHV0cywgb3V0cHV0cywgc3R5bGVzLCB0ZW1wbGF0ZUF0dHJzKSB7XG4gICAgICAgIGlmICh0ZW1wbGF0ZUF0dHJzID09PSB2b2lkIDApIHsgdGVtcGxhdGVBdHRycyA9IFtdOyB9XG4gICAgICAgIHZhciBhbHJlYWR5U2VlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGF0dHJFeHBycyA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRBdHRyRXhwcihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlTZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJFeHBycy5wdXNoLmFwcGx5KGF0dHJFeHBycywgX19zcHJlYWQoZ2V0QXR0cmlidXRlTmFtZUxpdGVyYWxzKGtleSkpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiBhdHRyRXhwcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlTZWVuLmFkZChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJFeHBycy5wdXNoKGxpdGVyYWwoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXQncyBpbXBvcnRhbnQgdGhhdCB0aGlzIG9jY3VycyBiZWZvcmUgQklORElOR1MgYW5kIFRFTVBMQVRFIGJlY2F1c2Ugb25jZSBgZWxlbWVudFN0YXJ0YFxuICAgICAgICAvLyBjb21lcyBhY3Jvc3MgdGhlIEJJTkRJTkdTIG9yIFRFTVBMQVRFIG1hcmtlcnMgdGhlbiBpdCB3aWxsIGNvbnRpbnVlIHJlYWRpbmcgZWFjaCB2YWx1ZSBhc1xuICAgICAgICAvLyBhcyBzaW5nbGUgcHJvcGVydHkgdmFsdWUgY2VsbCBieSBjZWxsLlxuICAgICAgICBpZiAoc3R5bGVzKSB7XG4gICAgICAgICAgICBzdHlsZXMucG9wdWxhdGVJbml0aWFsU3R5bGluZ0F0dHJzKGF0dHJFeHBycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0cy5sZW5ndGggfHwgb3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBhdHRyc1N0YXJ0SW5kZXggPSBhdHRyRXhwcnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnR5cGUgIT09IDQgLyogQW5pbWF0aW9uICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJFeHByKGlucHV0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQudHlwZSAhPT0gMSAvKiBBbmltYXRpb24gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkQXR0ckV4cHIob3V0cHV0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjaGVhcCB3YXkgb2YgYWRkaW5nIHRoZSBtYXJrZXIgb25seSBhZnRlciBhbGwgdGhlIGlucHV0L291dHB1dFxuICAgICAgICAgICAgLy8gdmFsdWVzIGhhdmUgYmVlbiBmaWx0ZXJlZCAoYnkgbm90IGluY2x1ZGluZyB0aGUgYW5pbWF0aW9uIG9uZXMpIGFuZCBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGV4cHJlc3Npb25zLiBUaGUgbWFya2VyIGlzIGltcG9ydGFudCBiZWNhdXNlIGl0IHRlbGxzIHRoZSBydW50aW1lXG4gICAgICAgICAgICAvLyBjb2RlIHRoYXQgdGhpcyBpcyB3aGVyZSBhdHRyaWJ1dGVzIHdpdGhvdXQgdmFsdWVzIHN0YXJ0Li4uXG4gICAgICAgICAgICBpZiAoYXR0ckV4cHJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGF0dHJFeHBycy5zcGxpY2UoYXR0cnNTdGFydEluZGV4LCAwLCBsaXRlcmFsKDMgLyogQmluZGluZ3MgKi8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGVtcGxhdGVBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF0dHJFeHBycy5wdXNoKGxpdGVyYWwoNCAvKiBUZW1wbGF0ZSAqLykpO1xuICAgICAgICAgICAgdGVtcGxhdGVBdHRycy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhZGRBdHRyRXhwcihhdHRyLm5hbWUpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0ckV4cHJzO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUudG9BdHRyc1BhcmFtID0gZnVuY3Rpb24gKGF0dHJzRXhwcnMpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJzRXhwcnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50UG9vbC5nZXRDb25zdExpdGVyYWwobGl0ZXJhbEFycihhdHRyc0V4cHJzKSwgdHJ1ZSkgOlxuICAgICAgICAgICAgVFlQRURfTlVMTF9FWFBSO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUucHJlcGFyZVJlZnNQYXJhbWV0ZXIgPSBmdW5jdGlvbiAocmVmZXJlbmNlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXJlZmVyZW5jZXMgfHwgcmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBUWVBFRF9OVUxMX0VYUFI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlZnNQYXJhbSA9IGZsYXR0ZW4ocmVmZXJlbmNlcy5tYXAoZnVuY3Rpb24gKHJlZmVyZW5jZSkge1xuICAgICAgICAgICAgdmFyIHNsb3QgPSBfdGhpcy5hbGxvY2F0ZURhdGFTbG90KCk7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgdXBkYXRlIHRlbXBvcmFyeS5cbiAgICAgICAgICAgIHZhciB2YXJpYWJsZU5hbWUgPSBfdGhpcy5fYmluZGluZ1Njb3BlLmZyZXNoUmVmZXJlbmNlTmFtZSgpO1xuICAgICAgICAgICAgdmFyIHJldHJpZXZhbExldmVsID0gX3RoaXMubGV2ZWw7XG4gICAgICAgICAgICB2YXIgbGhzID0gdmFyaWFibGUodmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgIF90aGlzLl9iaW5kaW5nU2NvcGUuc2V0KHJldHJpZXZhbExldmVsLCByZWZlcmVuY2UubmFtZSwgbGhzLCAwIC8qIERFRkFVTFQgKi8sIGZ1bmN0aW9uIChzY29wZSwgcmVsYXRpdmVMZXZlbCkge1xuICAgICAgICAgICAgICAgIC8vIGUuZy4gbmV4dENvbnRleHQoMik7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRDb250ZXh0U3RtdCA9IHJlbGF0aXZlTGV2ZWwgPiAwID8gW2dlbmVyYXRlTmV4dENvbnRleHRFeHByKHJlbGF0aXZlTGV2ZWwpLnRvU3RtdCgpXSA6IFtdO1xuICAgICAgICAgICAgICAgIC8vIGUuZy4gY29uc3QgJGZvbyQgPSByZWZlcmVuY2UoMSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZkV4cHIgPSBsaHMuc2V0KGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5yZWZlcmVuY2UpLmNhbGxGbihbbGl0ZXJhbChzbG90KV0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dENvbnRleHRTdG10LmNvbmNhdChyZWZFeHByLnRvQ29uc3REZWNsKCkpO1xuICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gW3JlZmVyZW5jZS5uYW1lLCByZWZlcmVuY2UudmFsdWVdO1xuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0YW50UG9vbC5nZXRDb25zdExpdGVyYWwoYXNMaXRlcmFsKHJlZnNQYXJhbSksIHRydWUpO1xuICAgIH07XG4gICAgVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlci5wcm90b3R5cGUucHJlcGFyZUxpc3RlbmVyUGFyYW1ldGVyID0gZnVuY3Rpb24gKHRhZ05hbWUsIG91dHB1dEFzdCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBvdXRwdXRBc3QubmFtZTtcbiAgICAgICAgICAgIHZhciBiaW5kaW5nRm5OYW1lID0gb3V0cHV0QXN0LnR5cGUgPT09IDEgLyogQW5pbWF0aW9uICovID9cbiAgICAgICAgICAgICAgICAvLyBzeW50aGV0aWMgQGxpc3RlbmVyLmZvbyB2YWx1ZXMgYXJlIHRyZWF0ZWQgdGhlIGV4YWN0IHNhbWUgYXMgYXJlIHN0YW5kYXJkIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHByZXBhcmVTeW50aGV0aWNMaXN0ZW5lckZ1bmN0aW9uTmFtZShldmVudE5hbWUsIG91dHB1dEFzdC5waGFzZSkgOlxuICAgICAgICAgICAgICAgIHNhbml0aXplSWRlbnRpZmllcihldmVudE5hbWUpO1xuICAgICAgICAgICAgdmFyIGhhbmRsZXJOYW1lID0gX3RoaXMudGVtcGxhdGVOYW1lICsgXCJfXCIgKyB0YWdOYW1lICsgXCJfXCIgKyBiaW5kaW5nRm5OYW1lICsgXCJfXCIgKyBpbmRleCArIFwiX2xpc3RlbmVyXCI7XG4gICAgICAgICAgICB2YXIgc2NvcGUgPSBfdGhpcy5fYmluZGluZ1Njb3BlLm5lc3RlZFNjb3BlKF90aGlzLl9iaW5kaW5nU2NvcGUuYmluZGluZ0xldmVsKTtcbiAgICAgICAgICAgIHJldHVybiBwcmVwYXJlRXZlbnRMaXN0ZW5lclBhcmFtZXRlcnMob3V0cHV0QXN0LCBoYW5kbGVyTmFtZSwgc2NvcGUpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXI7XG59KCkpO1xudmFyIFZhbHVlQ29udmVydGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhWYWx1ZUNvbnZlcnRlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBWYWx1ZUNvbnZlcnRlcihjb25zdGFudFBvb2wsIGFsbG9jYXRlU2xvdCwgYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cywgZGVmaW5lUGlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb25zdGFudFBvb2wgPSBjb25zdGFudFBvb2w7XG4gICAgICAgIF90aGlzLmFsbG9jYXRlU2xvdCA9IGFsbG9jYXRlU2xvdDtcbiAgICAgICAgX3RoaXMuYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cyA9IGFsbG9jYXRlUHVyZUZ1bmN0aW9uU2xvdHM7XG4gICAgICAgIF90aGlzLmRlZmluZVBpcGUgPSBkZWZpbmVQaXBlO1xuICAgICAgICBfdGhpcy5fcGlwZUJpbmRFeHBycyA9IFtdO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIEFzdE1lbW9yeUVmZmljaWVudFRyYW5zZm9ybWVyXG4gICAgVmFsdWVDb252ZXJ0ZXIucHJvdG90eXBlLnZpc2l0UGlwZSA9IGZ1bmN0aW9uIChwaXBlLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIEFsbG9jYXRlIGEgc2xvdCB0byBjcmVhdGUgdGhlIHBpcGVcbiAgICAgICAgdmFyIHNsb3QgPSB0aGlzLmFsbG9jYXRlU2xvdCgpO1xuICAgICAgICB2YXIgc2xvdFBzZXVkb0xvY2FsID0gXCJQSVBFOlwiICsgc2xvdDtcbiAgICAgICAgLy8gQWxsb2NhdGUgb25lIHNsb3QgZm9yIHRoZSByZXN1bHQgcGx1cyBvbmUgc2xvdCBwZXIgcGlwZSBhcmd1bWVudFxuICAgICAgICB2YXIgcHVyZUZ1bmN0aW9uU2xvdCA9IHRoaXMuYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cygyICsgcGlwZS5hcmdzLmxlbmd0aCk7XG4gICAgICAgIHZhciB0YXJnZXQgPSBuZXcgUHJvcGVydHlSZWFkKHBpcGUuc3BhbiwgbmV3IEltcGxpY2l0UmVjZWl2ZXIocGlwZS5zcGFuKSwgc2xvdFBzZXVkb0xvY2FsKTtcbiAgICAgICAgdmFyIF9hID0gcGlwZUJpbmRpbmdDYWxsSW5mbyhwaXBlLmFyZ3MpLCBpZGVudGlmaWVyID0gX2EuaWRlbnRpZmllciwgaXNWYXJMZW5ndGggPSBfYS5pc1Zhckxlbmd0aDtcbiAgICAgICAgdGhpcy5kZWZpbmVQaXBlKHBpcGUubmFtZSwgc2xvdFBzZXVkb0xvY2FsLCBzbG90LCBpbXBvcnRFeHByKGlkZW50aWZpZXIpKTtcbiAgICAgICAgdmFyIGFyZ3MgPSBfX3NwcmVhZChbcGlwZS5leHBdLCBwaXBlLmFyZ3MpO1xuICAgICAgICB2YXIgY29udmVydGVkQXJncyA9IGlzVmFyTGVuZ3RoID8gdGhpcy52aXNpdEFsbChbbmV3IExpdGVyYWxBcnJheShwaXBlLnNwYW4sIGFyZ3MpXSkgOiB0aGlzLnZpc2l0QWxsKGFyZ3MpO1xuICAgICAgICB2YXIgcGlwZUJpbmRFeHByID0gbmV3IEZ1bmN0aW9uQ2FsbChwaXBlLnNwYW4sIHRhcmdldCwgX19zcHJlYWQoW1xuICAgICAgICAgICAgbmV3IExpdGVyYWxQcmltaXRpdmUocGlwZS5zcGFuLCBzbG90KSxcbiAgICAgICAgICAgIG5ldyBMaXRlcmFsUHJpbWl0aXZlKHBpcGUuc3BhbiwgcHVyZUZ1bmN0aW9uU2xvdClcbiAgICAgICAgXSwgY29udmVydGVkQXJncykpO1xuICAgICAgICB0aGlzLl9waXBlQmluZEV4cHJzLnB1c2gocGlwZUJpbmRFeHByKTtcbiAgICAgICAgcmV0dXJuIHBpcGVCaW5kRXhwcjtcbiAgICB9O1xuICAgIFZhbHVlQ29udmVydGVyLnByb3RvdHlwZS51cGRhdGVQaXBlU2xvdE9mZnNldHMgPSBmdW5jdGlvbiAoYmluZGluZ1Nsb3RzKSB7XG4gICAgICAgIHRoaXMuX3BpcGVCaW5kRXhwcnMuZm9yRWFjaChmdW5jdGlvbiAocGlwZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBzbG90IG9mZnNldCBhcmcgKGluZGV4IDEpIHRvIGFjY291bnQgZm9yIGJpbmRpbmcgc2xvdHNcbiAgICAgICAgICAgIHZhciBzbG90T2Zmc2V0ID0gcGlwZS5hcmdzWzFdO1xuICAgICAgICAgICAgc2xvdE9mZnNldC52YWx1ZSArPSBiaW5kaW5nU2xvdHM7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVmFsdWVDb252ZXJ0ZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5ID0gZnVuY3Rpb24gKGFycmF5LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBuZXcgQnVpbHRpbkZ1bmN0aW9uQ2FsbChhcnJheS5zcGFuLCB0aGlzLnZpc2l0QWxsKGFycmF5LmV4cHJlc3Npb25zKSwgZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGxpdGVyYWwgaGFzIGNhbGN1bGF0ZWQgKG5vbi1saXRlcmFsKSBlbGVtZW50cyB0cmFuc2Zvcm0gaXQgaW50b1xuICAgICAgICAgICAgLy8gY2FsbHMgdG8gbGl0ZXJhbCBmYWN0b3JpZXMgdGhhdCBjb21wb3NlIHRoZSBsaXRlcmFsIGFuZCB3aWxsIGNhY2hlIGludGVybWVkaWF0ZVxuICAgICAgICAgICAgLy8gdmFsdWVzLiBPdGhlcndpc2UsIGp1c3QgcmV0dXJuIGFuIGxpdGVyYWwgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWVzLlxuICAgICAgICAgICAgdmFyIGxpdGVyYWwgPSBsaXRlcmFsQXJyKHZhbHVlcyk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLmlzQ29uc3RhbnQoKTsgfSkgP1xuICAgICAgICAgICAgICAgIF90aGlzLmNvbnN0YW50UG9vbC5nZXRDb25zdExpdGVyYWwobGl0ZXJhbCwgdHJ1ZSkgOlxuICAgICAgICAgICAgICAgIGdldExpdGVyYWxGYWN0b3J5KF90aGlzLmNvbnN0YW50UG9vbCwgbGl0ZXJhbCwgX3RoaXMuYWxsb2NhdGVQdXJlRnVuY3Rpb25TbG90cyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVmFsdWVDb252ZXJ0ZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbE1hcCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBCdWlsdGluRnVuY3Rpb25DYWxsKG1hcC5zcGFuLCB0aGlzLnZpc2l0QWxsKG1hcC52YWx1ZXMpLCBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbGl0ZXJhbCBoYXMgY2FsY3VsYXRlZCAobm9uLWxpdGVyYWwpIGVsZW1lbnRzICB0cmFuc2Zvcm0gaXQgaW50b1xuICAgICAgICAgICAgLy8gY2FsbHMgdG8gbGl0ZXJhbCBmYWN0b3JpZXMgdGhhdCBjb21wb3NlIHRoZSBsaXRlcmFsIGFuZCB3aWxsIGNhY2hlIGludGVybWVkaWF0ZVxuICAgICAgICAgICAgLy8gdmFsdWVzLiBPdGhlcndpc2UsIGp1c3QgcmV0dXJuIGFuIGxpdGVyYWwgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWVzLlxuICAgICAgICAgICAgdmFyIGxpdGVyYWwgPSBsaXRlcmFsTWFwKHZhbHVlcy5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgeyByZXR1cm4gKHsga2V5OiBtYXAua2V5c1tpbmRleF0ua2V5LCB2YWx1ZTogdmFsdWUsIHF1b3RlZDogbWFwLmtleXNbaW5kZXhdLnF1b3RlZCB9KTsgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShmdW5jdGlvbiAoYSkgeyByZXR1cm4gYS5pc0NvbnN0YW50KCk7IH0pID9cbiAgICAgICAgICAgICAgICBfdGhpcy5jb25zdGFudFBvb2wuZ2V0Q29uc3RMaXRlcmFsKGxpdGVyYWwsIHRydWUpIDpcbiAgICAgICAgICAgICAgICBnZXRMaXRlcmFsRmFjdG9yeShfdGhpcy5jb25zdGFudFBvb2wsIGxpdGVyYWwsIF90aGlzLmFsbG9jYXRlUHVyZUZ1bmN0aW9uU2xvdHMpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBWYWx1ZUNvbnZlcnRlcjtcbn0oQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIpKTtcbi8vIFBpcGVzIGFsd2F5cyBoYXZlIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIsIHRoZSB2YWx1ZSB0aGV5IG9wZXJhdGUgb25cbnZhciBwaXBlQmluZGluZ0lkZW50aWZpZXJzID0gW0lkZW50aWZpZXJzJDEucGlwZUJpbmQxLCBJZGVudGlmaWVycyQxLnBpcGVCaW5kMiwgSWRlbnRpZmllcnMkMS5waXBlQmluZDMsIElkZW50aWZpZXJzJDEucGlwZUJpbmQ0XTtcbmZ1bmN0aW9uIHBpcGVCaW5kaW5nQ2FsbEluZm8oYXJncykge1xuICAgIHZhciBpZGVudGlmaWVyID0gcGlwZUJpbmRpbmdJZGVudGlmaWVyc1thcmdzLmxlbmd0aF07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllciB8fCBJZGVudGlmaWVycyQxLnBpcGVCaW5kVixcbiAgICAgICAgaXNWYXJMZW5ndGg6ICFpZGVudGlmaWVyLFxuICAgIH07XG59XG52YXIgcHVyZUZ1bmN0aW9uSWRlbnRpZmllcnMgPSBbXG4gICAgSWRlbnRpZmllcnMkMS5wdXJlRnVuY3Rpb24wLCBJZGVudGlmaWVycyQxLnB1cmVGdW5jdGlvbjEsIElkZW50aWZpZXJzJDEucHVyZUZ1bmN0aW9uMiwgSWRlbnRpZmllcnMkMS5wdXJlRnVuY3Rpb24zLCBJZGVudGlmaWVycyQxLnB1cmVGdW5jdGlvbjQsXG4gICAgSWRlbnRpZmllcnMkMS5wdXJlRnVuY3Rpb241LCBJZGVudGlmaWVycyQxLnB1cmVGdW5jdGlvbjYsIElkZW50aWZpZXJzJDEucHVyZUZ1bmN0aW9uNywgSWRlbnRpZmllcnMkMS5wdXJlRnVuY3Rpb244XG5dO1xuZnVuY3Rpb24gcHVyZUZ1bmN0aW9uQ2FsbEluZm8oYXJncykge1xuICAgIHZhciBpZGVudGlmaWVyID0gcHVyZUZ1bmN0aW9uSWRlbnRpZmllcnNbYXJncy5sZW5ndGhdO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIgfHwgSWRlbnRpZmllcnMkMS5wdXJlRnVuY3Rpb25WLFxuICAgICAgICBpc1Zhckxlbmd0aDogIWlkZW50aWZpZXIsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGluc3RydWN0aW9uKHNwYW4sIHJlZmVyZW5jZSwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIGltcG9ydEV4cHIocmVmZXJlbmNlLCBudWxsLCBzcGFuKS5jYWxsRm4ocGFyYW1zLCBzcGFuKTtcbn1cbi8vIGUuZy4geCgyKTtcbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dENvbnRleHRFeHByKHJlbGF0aXZlTGV2ZWxEaWZmKSB7XG4gICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5uZXh0Q29udGV4dClcbiAgICAgICAgLmNhbGxGbihyZWxhdGl2ZUxldmVsRGlmZiA+IDEgPyBbbGl0ZXJhbChyZWxhdGl2ZUxldmVsRGlmZildIDogW10pO1xufVxuZnVuY3Rpb24gZ2V0TGl0ZXJhbEZhY3RvcnkoY29uc3RhbnRQb29sLCBsaXRlcmFsJDEsIGFsbG9jYXRlU2xvdHMpIHtcbiAgICB2YXIgX2EgPSBjb25zdGFudFBvb2wuZ2V0TGl0ZXJhbEZhY3RvcnkobGl0ZXJhbCQxKSwgbGl0ZXJhbEZhY3RvcnkgPSBfYS5saXRlcmFsRmFjdG9yeSwgbGl0ZXJhbEZhY3RvcnlBcmd1bWVudHMgPSBfYS5saXRlcmFsRmFjdG9yeUFyZ3VtZW50cztcbiAgICAvLyBBbGxvY2F0ZSAxIHNsb3QgZm9yIHRoZSByZXN1bHQgcGx1cyAxIHBlciBhcmd1bWVudFxuICAgIHZhciBzdGFydFNsb3QgPSBhbGxvY2F0ZVNsb3RzKDEgKyBsaXRlcmFsRmFjdG9yeUFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGxpdGVyYWxGYWN0b3J5QXJndW1lbnRzLmxlbmd0aCA+IDAgfHwgZXJyb3IoXCJFeHBlY3RlZCBhcmd1bWVudHMgdG8gYSBsaXRlcmFsIGZhY3RvcnkgZnVuY3Rpb25cIik7XG4gICAgdmFyIF9iID0gcHVyZUZ1bmN0aW9uQ2FsbEluZm8obGl0ZXJhbEZhY3RvcnlBcmd1bWVudHMpLCBpZGVudGlmaWVyID0gX2IuaWRlbnRpZmllciwgaXNWYXJMZW5ndGggPSBfYi5pc1Zhckxlbmd0aDtcbiAgICAvLyBMaXRlcmFsIGZhY3RvcmllcyBhcmUgcHVyZSBmdW5jdGlvbnMgdGhhdCBvbmx5IG5lZWQgdG8gYmUgcmUtaW52b2tlZCB3aGVuIHRoZSBwYXJhbWV0ZXJzXG4gICAgLy8gY2hhbmdlLlxuICAgIHZhciBhcmdzID0gW1xuICAgICAgICBsaXRlcmFsKHN0YXJ0U2xvdCksXG4gICAgICAgIGxpdGVyYWxGYWN0b3J5LFxuICAgIF07XG4gICAgaWYgKGlzVmFyTGVuZ3RoKSB7XG4gICAgICAgIGFyZ3MucHVzaChsaXRlcmFsQXJyKGxpdGVyYWxGYWN0b3J5QXJndW1lbnRzKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhcmdzLnB1c2guYXBwbHkoYXJncywgX19zcHJlYWQobGl0ZXJhbEZhY3RvcnlBcmd1bWVudHMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGltcG9ydEV4cHIoaWRlbnRpZmllcikuY2FsbEZuKGFyZ3MpO1xufVxuLyoqXG4gKiBHZXRzIGFuIGFycmF5IG9mIGxpdGVyYWxzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGFuIGV4cHJlc3Npb25cbiAqIHRvIHJlcHJlc2VudCB0aGUgbmFtZSBhbmQgbmFtZXNwYWNlIG9mIGFuIGF0dHJpYnV0ZS4gRS5nLlxuICogYDp4bGluazpocmVmYCB0dXJucyBpbnRvIGBbQXR0cmlidXRlTWFya2VyLk5hbWVzcGFjZVVSSSwgJ3hsaW5rJywgJ2hyZWYnXWAuXG4gKlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgYXR0cmlidXRlLCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cmlidXRlTmFtZUxpdGVyYWxzKG5hbWUpIHtcbiAgICB2YXIgX2EgPSBfX3JlYWQoc3BsaXROc05hbWUobmFtZSksIDIpLCBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBfYVswXSwgYXR0cmlidXRlTmFtZSA9IF9hWzFdO1xuICAgIHZhciBuYW1lTGl0ZXJhbCA9IGxpdGVyYWwoYXR0cmlidXRlTmFtZSk7XG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbGl0ZXJhbCgwIC8qIE5hbWVzcGFjZVVSSSAqLyksIGxpdGVyYWwoYXR0cmlidXRlTmFtZXNwYWNlKSwgbmFtZUxpdGVyYWxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtuYW1lTGl0ZXJhbF07XG59XG4vKiogVGhlIHByZWZpeCB1c2VkIHRvIGdldCBhIHNoYXJlZCBjb250ZXh0IGluIEJpbmRpbmdTY29wZSdzIG1hcC4gKi9cbnZhciBTSEFSRURfQ09OVEVYVF9LRVkgPSAnJCRzaGFyZWRfY3R4JCQnO1xudmFyIEJpbmRpbmdTY29wZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nU2NvcGUoYmluZGluZ0xldmVsLCBwYXJlbnQpIHtcbiAgICAgICAgaWYgKGJpbmRpbmdMZXZlbCA9PT0gdm9pZCAwKSB7IGJpbmRpbmdMZXZlbCA9IDA7IH1cbiAgICAgICAgaWYgKHBhcmVudCA9PT0gdm9pZCAwKSB7IHBhcmVudCA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5iaW5kaW5nTGV2ZWwgPSBiaW5kaW5nTGV2ZWw7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICAvKiogS2VlcHMgYSBtYXAgZnJvbSBsb2NhbCB2YXJpYWJsZXMgdG8gdGhlaXIgQmluZGluZ0RhdGEuICovXG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZU5hbWVJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucmVzdG9yZVZpZXdWYXJpYWJsZSA9IG51bGw7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCaW5kaW5nU2NvcGUsIFwiUk9PVF9TQ09QRVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFCaW5kaW5nU2NvcGUuX1JPT1RfU0NPUEUpIHtcbiAgICAgICAgICAgICAgICBCaW5kaW5nU2NvcGUuX1JPT1RfU0NPUEUgPSBuZXcgQmluZGluZ1Njb3BlKCkuc2V0KDAsICckZXZlbnQnLCB2YXJpYWJsZSgnJGV2ZW50JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdTY29wZS5fUk9PVF9TQ09QRTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjdXJyZW50Lm1hcC5nZXQobmFtZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBsb2NhbCBjb3B5IGFuZCByZXNldCB0aGUgYGRlY2xhcmVgIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmFsTGV2ZWw6IHZhbHVlLnJldHJpZXZhbExldmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGhzOiB2YWx1ZS5saHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlTG9jYWxDYWxsYmFjazogdmFsdWUuZGVjbGFyZUxvY2FsQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiB2YWx1ZS5wcmlvcml0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVmOiB2YWx1ZS5sb2NhbFJlZlxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgdmFsdWUgbG9jYWxseS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUG9zc2libHkgZ2VuZXJhdGUgYSBzaGFyZWQgY29udGV4dCB2YXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZUdlbmVyYXRlU2hhcmVkQ29udGV4dFZhcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVSZXN0b3JlVmlldyh2YWx1ZS5yZXRyaWV2YWxMZXZlbCwgdmFsdWUubG9jYWxSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZGVjbGFyZUxvY2FsQ2FsbGJhY2sgJiYgIXZhbHVlLmRlY2xhcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZGVjbGFyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5saHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIGFyZSBsb29raW5nIGZvciBhIHByb3BlcnR5IG9uIHRoZSB0b3AgbGV2ZWwgY29tcG9uZW50XG4gICAgICAgIC8vIC0gSWYgbGV2ZWwgPT09IDAsIHdlIGFyZSBvbiB0aGUgdG9wIGFuZCBkb24ndCBuZWVkIHRvIHJlLWRlY2xhcmUgYGN0eGAuXG4gICAgICAgIC8vIC0gSWYgbGV2ZWwgPiAwLCB3ZSBhcmUgaW4gYW4gZW1iZWRkZWQgdmlldy4gV2UgbmVlZCB0byByZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGVcbiAgICAgICAgLy8gbG9jYWwgdmFyIHdlIHVzZWQgdG8gc3RvcmUgdGhlIGNvbXBvbmVudCBjb250ZXh0LCBlLmcuIGNvbnN0ICRjb21wJCA9IHgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ0xldmVsID09PSAwID8gbnVsbCA6IHRoaXMuZ2V0Q29tcG9uZW50UHJvcGVydHkobmFtZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBsb2NhbCB2YXJpYWJsZSBmb3IgbGF0ZXIgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJldHJpZXZhbExldmVsIFRoZSBsZXZlbCBmcm9tIHdoaWNoIHRoaXMgdmFsdWUgY2FuIGJlIHJldHJpZXZlZFxuICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhcmlhYmxlLlxuICAgICAqIEBwYXJhbSBsaHMgQVNUIHJlcHJlc2VudGluZyB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGBsZXQgbGhzID0gcmhzO2AuXG4gICAgICogQHBhcmFtIHByaW9yaXR5IFRoZSBzb3J0aW5nIHByaW9yaXR5IG9mIHRoaXMgdmFyXG4gICAgICogQHBhcmFtIGRlY2xhcmVMb2NhbENhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiBkZWNsYXJpbmcgdGhpcyBsb2NhbCB2YXJcbiAgICAgKiBAcGFyYW0gbG9jYWxSZWYgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIGxvY2FsIHJlZlxuICAgICAqL1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHJldHJpZXZhbExldmVsLCBuYW1lLCBsaHMsIHByaW9yaXR5LCBkZWNsYXJlTG9jYWxDYWxsYmFjaywgbG9jYWxSZWYpIHtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB2b2lkIDApIHsgcHJpb3JpdHkgPSAwIC8qIERFRkFVTFQgKi87IH1cbiAgICAgICAgaWYgKHRoaXMubWFwLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaWYgKGxvY2FsUmVmKSB7XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHRocm93IGFuIGVycm9yIGlmIGl0J3MgYSBsb2NhbCByZWYgYW5kIGRvIG5vdCB1cGRhdGUgZXhpc3RpbmcgdmFsdWUsXG4gICAgICAgICAgICAgICAgLy8gc28gdGhlIGZpcnN0IGRlZmluZWQgcmVmIGlzIGFsd2F5cyByZXR1cm5lZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9yKFwiVGhlIG5hbWUgXCIgKyBuYW1lICsgXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIHNjb3BlIHRvIGJlIFwiICsgdGhpcy5tYXAuZ2V0KG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcC5zZXQobmFtZSwge1xuICAgICAgICAgICAgcmV0cmlldmFsTGV2ZWw6IHJldHJpZXZhbExldmVsLFxuICAgICAgICAgICAgbGhzOiBsaHMsXG4gICAgICAgICAgICBkZWNsYXJlOiBmYWxzZSxcbiAgICAgICAgICAgIGRlY2xhcmVMb2NhbENhbGxiYWNrOiBkZWNsYXJlTG9jYWxDYWxsYmFjayxcbiAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSxcbiAgICAgICAgICAgIGxvY2FsUmVmOiBsb2NhbFJlZiB8fCBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIExvY2FsUmVzb2x2ZXIuXG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5nZXRMb2NhbCA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiB0aGlzLmdldChuYW1lKTsgfTtcbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIExvY2FsUmVzb2x2ZXIuXG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5ub3RpZnlJbXBsaWNpdFJlY2VpdmVyVXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nTGV2ZWwgIT09IDApIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBpbXBsaWNpdCByZWNlaXZlciBpcyBhY2Nlc3NlZCBpbiBhbiBlbWJlZGRlZCB2aWV3LCB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkZWNsYXJlIGEgc2hhcmVkIGNvbnRleHQgdmFyaWFibGUgZm9yIHRoZSBjdXJyZW50IHRlbXBsYXRlXG4gICAgICAgICAgICAvLyBpbiB0aGUgdXBkYXRlIHZhcmlhYmxlcy5cbiAgICAgICAgICAgIHRoaXMubWFwLmdldChTSEFSRURfQ09OVEVYVF9LRVkgKyAwKS5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5uZXN0ZWRTY29wZSA9IGZ1bmN0aW9uIChsZXZlbCkge1xuICAgICAgICB2YXIgbmV3U2NvcGUgPSBuZXcgQmluZGluZ1Njb3BlKGxldmVsLCB0aGlzKTtcbiAgICAgICAgaWYgKGxldmVsID4gMClcbiAgICAgICAgICAgIG5ld1Njb3BlLmdlbmVyYXRlU2hhcmVkQ29udGV4dFZhcigwKTtcbiAgICAgICAgcmV0dXJuIG5ld1Njb3BlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyBvciBjcmVhdGVzIGEgc2hhcmVkIGNvbnRleHQgdmFyaWFibGUgYW5kIHJldHVybnMgaXRzIGV4cHJlc3Npb24uIE5vdGUgdGhhdFxuICAgICAqIHRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBzaGFyZWQgdmFyaWFibGUgd2lsbCBiZSBkZWNsYXJlZC4gVmFyaWFibGVzIGluIHRoZVxuICAgICAqIGJpbmRpbmcgc2NvcGUgd2lsbCBiZSBvbmx5IGRlY2xhcmVkIGlmIHRoZXkgYXJlIHVzZWQuXG4gICAgICovXG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5nZXRPckNyZWF0ZVNoYXJlZENvbnRleHRWYXIgPSBmdW5jdGlvbiAocmV0cmlldmFsTGV2ZWwpIHtcbiAgICAgICAgdmFyIGJpbmRpbmdLZXkgPSBTSEFSRURfQ09OVEVYVF9LRVkgKyByZXRyaWV2YWxMZXZlbDtcbiAgICAgICAgaWYgKCF0aGlzLm1hcC5oYXMoYmluZGluZ0tleSkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVTaGFyZWRDb250ZXh0VmFyKHJldHJpZXZhbExldmVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGJpbmRpbmdLZXkpLmxocztcbiAgICB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUuZ2V0U2hhcmVkQ29udGV4dE5hbWUgPSBmdW5jdGlvbiAocmV0cmlldmFsTGV2ZWwpIHtcbiAgICAgICAgdmFyIHNoYXJlZEN0eE9iaiA9IHRoaXMubWFwLmdldChTSEFSRURfQ09OVEVYVF9LRVkgKyByZXRyaWV2YWxMZXZlbCk7XG4gICAgICAgIHJldHVybiBzaGFyZWRDdHhPYmogJiYgc2hhcmVkQ3R4T2JqLmRlY2xhcmUgPyBzaGFyZWRDdHhPYmoubGhzIDogbnVsbDtcbiAgICB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUubWF5YmVHZW5lcmF0ZVNoYXJlZENvbnRleHRWYXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlLnByaW9yaXR5ID09PSAxIC8qIENPTlRFWFQgKi8gJiZcbiAgICAgICAgICAgIHZhbHVlLnJldHJpZXZhbExldmVsIDwgdGhpcy5iaW5kaW5nTGV2ZWwpIHtcbiAgICAgICAgICAgIHZhciBzaGFyZWRDdHhPYmogPSB0aGlzLm1hcC5nZXQoU0hBUkVEX0NPTlRFWFRfS0VZICsgdmFsdWUucmV0cmlldmFsTGV2ZWwpO1xuICAgICAgICAgICAgaWYgKHNoYXJlZEN0eE9iaikge1xuICAgICAgICAgICAgICAgIHNoYXJlZEN0eE9iai5kZWNsYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVTaGFyZWRDb250ZXh0VmFyKHZhbHVlLnJldHJpZXZhbExldmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5nZW5lcmF0ZVNoYXJlZENvbnRleHRWYXIgPSBmdW5jdGlvbiAocmV0cmlldmFsTGV2ZWwpIHtcbiAgICAgICAgdmFyIGxocyA9IHZhcmlhYmxlKENPTlRFWFRfTkFNRSArIHRoaXMuZnJlc2hSZWZlcmVuY2VOYW1lKCkpO1xuICAgICAgICB0aGlzLm1hcC5zZXQoU0hBUkVEX0NPTlRFWFRfS0VZICsgcmV0cmlldmFsTGV2ZWwsIHtcbiAgICAgICAgICAgIHJldHJpZXZhbExldmVsOiByZXRyaWV2YWxMZXZlbCxcbiAgICAgICAgICAgIGxoczogbGhzLFxuICAgICAgICAgICAgZGVjbGFyZUxvY2FsQ2FsbGJhY2s6IGZ1bmN0aW9uIChzY29wZSwgcmVsYXRpdmVMZXZlbCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGN0eF9yMCA9IG5leHRDb250ZXh0KDIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbbGhzLnNldChnZW5lcmF0ZU5leHRDb250ZXh0RXhwcihyZWxhdGl2ZUxldmVsKSkudG9Db25zdERlY2woKV07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVjbGFyZTogZmFsc2UsXG4gICAgICAgICAgICBwcmlvcml0eTogMiAvKiBTSEFSRURfQ09OVEVYVCAqLyxcbiAgICAgICAgICAgIGxvY2FsUmVmOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUuZ2V0Q29tcG9uZW50UHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgY29tcG9uZW50VmFsdWUgPSB0aGlzLm1hcC5nZXQoU0hBUkVEX0NPTlRFWFRfS0VZICsgMCk7XG4gICAgICAgIGNvbXBvbmVudFZhbHVlLmRlY2xhcmUgPSB0cnVlO1xuICAgICAgICB0aGlzLm1heWJlUmVzdG9yZVZpZXcoMCwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50VmFsdWUubGhzLnByb3AobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nU2NvcGUucHJvdG90eXBlLm1heWJlUmVzdG9yZVZpZXcgPSBmdW5jdGlvbiAocmV0cmlldmFsTGV2ZWwsIGxvY2FsUmVmTG9va3VwKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzdG9yZSB0aGUgY3VycmVudCB2aWV3IGluIGxpc3RlbmVyIGZucyBpZjpcbiAgICAgICAgLy8gMSAtIHdlIGFyZSBhY2Nlc3NpbmcgYSB2YWx1ZSBpbiBhIHBhcmVudCB2aWV3LCB3aGljaCByZXF1aXJlcyB3YWxraW5nIHRoZSB2aWV3IHRyZWUgcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gdXNpbmcgdGhlIGN0eCBhcmcuIEluIHRoaXMgY2FzZSwgdGhlIHJldHJpZXZhbCBhbmQgYmluZGluZyBsZXZlbCB3aWxsIGJlIGRpZmZlcmVudC5cbiAgICAgICAgLy8gMiAtIHdlIGFyZSBsb29raW5nIHVwIGEgbG9jYWwgcmVmLCB3aGljaCByZXF1aXJlcyByZXN0b3JpbmcgdGhlIHZpZXcgd2hlcmUgdGhlIGxvY2FsXG4gICAgICAgIC8vIHJlZiBpcyBzdG9yZWRcbiAgICAgICAgaWYgKHRoaXMuaXNMaXN0ZW5lclNjb3BlKCkgJiYgKHJldHJpZXZhbExldmVsIDwgdGhpcy5iaW5kaW5nTGV2ZWwgfHwgbG9jYWxSZWZMb29rdXApKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50LnJlc3RvcmVWaWV3VmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBwYXJlbnQgc2F2ZXMgdmFyaWFibGUgdG8gZ2VuZXJhdGUgYSBzaGFyZWQgYGNvbnN0ICRzJCA9IGdldEN1cnJlbnRWaWV3KCk7YCBpbnN0cnVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJlc3RvcmVWaWV3VmFyaWFibGUgPSB2YXJpYWJsZSh0aGlzLnBhcmVudC5mcmVzaFJlZmVyZW5jZU5hbWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVWaWV3VmFyaWFibGUgPSB0aGlzLnBhcmVudC5yZXN0b3JlVmlld1ZhcmlhYmxlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCaW5kaW5nU2NvcGUucHJvdG90eXBlLnJlc3RvcmVWaWV3U3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyByZXN0b3JlVmlldygkc3RhdGUkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdG9yZVZpZXdWYXJpYWJsZSA/XG4gICAgICAgICAgICBbaW5zdHJ1Y3Rpb24obnVsbCwgSWRlbnRpZmllcnMkMS5yZXN0b3JlVmlldywgW3RoaXMucmVzdG9yZVZpZXdWYXJpYWJsZV0pLnRvU3RtdCgpXSA6XG4gICAgICAgICAgICBbXTtcbiAgICB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUudmlld1NuYXBzaG90U3RhdGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY29uc3QgJHN0YXRlJCA9IGdldEN1cnJlbnRWaWV3KCk7XG4gICAgICAgIHZhciBnZXRDdXJyZW50Vmlld0luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24obnVsbCwgSWRlbnRpZmllcnMkMS5nZXRDdXJyZW50VmlldywgW10pO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0b3JlVmlld1ZhcmlhYmxlID9cbiAgICAgICAgICAgIFt0aGlzLnJlc3RvcmVWaWV3VmFyaWFibGUuc2V0KGdldEN1cnJlbnRWaWV3SW5zdHJ1Y3Rpb24pLnRvQ29uc3REZWNsKCldIDpcbiAgICAgICAgICAgIFtdO1xuICAgIH07XG4gICAgQmluZGluZ1Njb3BlLnByb3RvdHlwZS5pc0xpc3RlbmVyU2NvcGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5iaW5kaW5nTGV2ZWwgPT09IHRoaXMuYmluZGluZ0xldmVsOyB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUudmFyaWFibGVEZWNsYXJhdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjdXJyZW50Q29udGV4dExldmVsID0gMDtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5tYXAudmFsdWVzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUuZGVjbGFyZTsgfSlcbiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBiLnJldHJpZXZhbExldmVsIC0gYS5yZXRyaWV2YWxMZXZlbCB8fCBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTsgfSlcbiAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHN0bXRzLCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGxldmVsRGlmZiA9IF90aGlzLmJpbmRpbmdMZXZlbCAtIHZhbHVlLnJldHJpZXZhbExldmVsO1xuICAgICAgICAgICAgdmFyIGN1cnJTdG10cyA9IHZhbHVlLmRlY2xhcmVMb2NhbENhbGxiYWNrKF90aGlzLCBsZXZlbERpZmYgLSBjdXJyZW50Q29udGV4dExldmVsKTtcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZXh0TGV2ZWwgPSBsZXZlbERpZmY7XG4gICAgICAgICAgICByZXR1cm4gc3RtdHMuY29uY2F0KGN1cnJTdG10cyk7XG4gICAgICAgIH0sIFtdKTtcbiAgICB9O1xuICAgIEJpbmRpbmdTY29wZS5wcm90b3R5cGUuZnJlc2hSZWZlcmVuY2VOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgIC8vIEZpbmQgdGhlIHRvcCBzY29wZSBhcyBpdCBtYWludGFpbnMgdGhlIGdsb2JhbCByZWZlcmVuY2UgY291bnRcbiAgICAgICAgd2hpbGUgKGN1cnJlbnQucGFyZW50KVxuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgICAgICB2YXIgcmVmID0gXCJcIiArIFJFRkVSRU5DRV9QUkVGSVggKyBjdXJyZW50LnJlZmVyZW5jZU5hbWVJbmRleCsrO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdTY29wZTtcbn0oKSk7XG4vKipcbiAqIENyZWF0ZXMgYSBgQ3NzU2VsZWN0b3JgIGdpdmVuIGEgdGFnIG5hbWUgYW5kIGEgbWFwIG9mIGF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3NzU2VsZWN0b3IodGFnLCBhdHRyaWJ1dGVzKSB7XG4gICAgdmFyIGNzc1NlbGVjdG9yID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgY3NzU2VsZWN0b3Iuc2V0RWxlbWVudCh0YWcpO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcbiAgICAgICAgY3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSB2YWx1ZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7IHJldHVybiBjc3NTZWxlY3Rvci5hZGRDbGFzc05hbWUoY2xhc3NOYW1lKTsgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY3NzU2VsZWN0b3I7XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgb3V0IG9mIGFuIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlc1xuICogd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHRoZSBpbnN0cnVjdGlvbiBwYXJhbWV0ZXJzLlxuICovXG5mdW5jdGlvbiBnZXROZ1Byb2plY3RBc0xpdGVyYWwoYXR0cmlidXRlKSB7XG4gICAgLy8gUGFyc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbnRvIGEgQ3NzU2VsZWN0b3JMaXN0LiBOb3RlIHRoYXQgd2Ugb25seSB0YWtlIHRoZVxuICAgIC8vIGZpcnN0IHNlbGVjdG9yLCBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgc2VsZWN0b3JzIGluIG5nUHJvamVjdEFzLlxuICAgIHZhciBwYXJzZWRSM1NlbGVjdG9yID0gcGFyc2VTZWxlY3RvclRvUjNTZWxlY3RvcihhdHRyaWJ1dGUudmFsdWUpWzBdO1xuICAgIHJldHVybiBbbGl0ZXJhbCg1IC8qIFByb2plY3RBcyAqLyksIGFzTGl0ZXJhbChwYXJzZWRSM1NlbGVjdG9yKV07XG59XG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShhcmdzKSB7XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoMSk7IC8vIElnbm9yZSB0aGUgbGVuZ3RoIHByZWZpeCBhZGRlZCBmb3IgcmVuZGVyMlxuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uMSkuY2FsbEZuKGFyZ3MpO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmludGVycG9sYXRpb24yKS5jYWxsRm4oYXJncyk7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuaW50ZXJwb2xhdGlvbjMpLmNhbGxGbihhcmdzKTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uNCkuY2FsbEZuKGFyZ3MpO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uNSkuY2FsbEZuKGFyZ3MpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uNikuY2FsbEZuKGFyZ3MpO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uNykuY2FsbEZuKGFyZ3MpO1xuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5pbnRlcnBvbGF0aW9uOCkuY2FsbEZuKGFyZ3MpO1xuICAgIH1cbiAgICAoYXJncy5sZW5ndGggPj0gMTkgJiYgYXJncy5sZW5ndGggJSAyID09IDEpIHx8XG4gICAgICAgIGVycm9yKFwiSW52YWxpZCBpbnRlcnBvbGF0aW9uIGFyZ3VtZW50IGxlbmd0aCBcIiArIGFyZ3MubGVuZ3RoKTtcbiAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmludGVycG9sYXRpb25WKS5jYWxsRm4oW2xpdGVyYWxBcnIoYXJncyldKTtcbn1cbi8qKlxuICogR2V0cyB0aGUgaW5zdHJ1Y3Rpb24gdG8gZ2VuZXJhdGUgZm9yIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eVxuICogQHBhcmFtIGludGVycG9sYXRpb24gQW4gSW50ZXJwb2xhdGlvbiBBU1RcbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbnRlcnBvbGF0aW9uRXhwcmVzc2lvbihpbnRlcnBvbGF0aW9uKSB7XG4gICAgc3dpdGNoIChnZXRJbnRlcnBvbGF0aW9uQXJnc0xlbmd0aChpbnRlcnBvbGF0aW9uKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllcnMkMS5wcm9wZXJ0eUludGVycG9sYXRlO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllcnMkMS5wcm9wZXJ0eUludGVycG9sYXRlMTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXJzJDEucHJvcGVydHlJbnRlcnBvbGF0ZTI7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVycyQxLnByb3BlcnR5SW50ZXJwb2xhdGUzO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllcnMkMS5wcm9wZXJ0eUludGVycG9sYXRlNDtcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVycyQxLnByb3BlcnR5SW50ZXJwb2xhdGU1O1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXJzJDEucHJvcGVydHlJbnRlcnBvbGF0ZTY7XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllcnMkMS5wcm9wZXJ0eUludGVycG9sYXRlNztcbiAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVycyQxLnByb3BlcnR5SW50ZXJwb2xhdGU4O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIElkZW50aWZpZXJzJDEucHJvcGVydHlJbnRlcnBvbGF0ZVY7XG4gICAgfVxufVxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGV4cGVjdGVkIHRvIGJlIHBhc3NlZCB0byBhIGdlbmVyYXRlZCBpbnN0cnVjdGlvbiBpbiB0aGUgY2FzZSBvZlxuICogaW50ZXJwb2xhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBBbiBpbnRlcnBvbGF0aW9uIGFzdFxuICovXG5mdW5jdGlvbiBnZXRJbnRlcnBvbGF0aW9uQXJnc0xlbmd0aChpbnRlcnBvbGF0aW9uKSB7XG4gICAgdmFyIGV4cHJlc3Npb25zID0gaW50ZXJwb2xhdGlvbi5leHByZXNzaW9ucywgc3RyaW5ncyA9IGludGVycG9sYXRpb24uc3RyaW5ncztcbiAgICBpZiAoZXhwcmVzc2lvbnMubGVuZ3RoID09PSAxICYmIHN0cmluZ3MubGVuZ3RoID09PSAyICYmIHN0cmluZ3NbMF0gPT09ICcnICYmIHN0cmluZ3NbMV0gPT09ICcnKSB7XG4gICAgICAgIC8vIElmIHRoZSBpbnRlcnBvbGF0aW9uIGhhcyBvbmUgaW50ZXJwb2xhdGVkIHZhbHVlLCBidXQgdGhlIHByZWZpeCBhbmQgc3VmZml4IGFyZSBib3RoIGVtcHR5XG4gICAgICAgIC8vIHN0cmluZ3MsIHdlIG9ubHkgcGFzcyBvbmUgYXJndW1lbnQsIHRvIGEgc3BlY2lhbCBpbnN0cnVjdGlvbiBsaWtlIGBwcm9wZXJ0eUludGVycG9sYXRlYCBvclxuICAgICAgICAvLyBgdGV4dEludGVycG9sYXRlYC5cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnMubGVuZ3RoICsgc3RyaW5ncy5sZW5ndGg7XG4gICAgfVxufVxuLyoqXG4gKiBQYXJzZSBhIHRlbXBsYXRlIGludG8gcmVuZGVyMyBgTm9kZWBzIGFuZCBhZGRpdGlvbmFsIG1ldGFkYXRhLCB3aXRoIG5vIG90aGVyIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0gdGVtcGxhdGUgdGV4dCBvZiB0aGUgdGVtcGxhdGUgdG8gcGFyc2VcbiAqIEBwYXJhbSB0ZW1wbGF0ZVVybCBVUkwgdG8gdXNlIGZvciBzb3VyY2UgbWFwcGluZyBvZiB0aGUgcGFyc2VkIHRlbXBsYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIG1vZGlmeSBob3cgdGhlIHRlbXBsYXRlIGlzIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCB0ZW1wbGF0ZVVybCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIGludGVycG9sYXRpb25Db25maWcgPSBvcHRpb25zLmludGVycG9sYXRpb25Db25maWcsIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXM7XG4gICAgdmFyIGJpbmRpbmdQYXJzZXIgPSBtYWtlQmluZGluZ1BhcnNlcihpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICB2YXIgaHRtbFBhcnNlciA9IG5ldyBIdG1sUGFyc2VyKCk7XG4gICAgdmFyIHBhcnNlUmVzdWx0ID0gaHRtbFBhcnNlci5wYXJzZSh0ZW1wbGF0ZSwgdGVtcGxhdGVVcmwsIF9fYXNzaWduKHt9LCBvcHRpb25zLCB7IHRva2VuaXplRXhwYW5zaW9uRm9ybXM6IHRydWUsIGxlYWRpbmdUcml2aWFDaGFyczogTEVBRElOR19UUklWSUFfQ0hBUlMgfSkpO1xuICAgIGlmIChwYXJzZVJlc3VsdC5lcnJvcnMgJiYgcGFyc2VSZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3JzOiBwYXJzZVJlc3VsdC5lcnJvcnMsIG5vZGVzOiBbXSwgc3R5bGVVcmxzOiBbXSwgc3R5bGVzOiBbXSB9O1xuICAgIH1cbiAgICB2YXIgcm9vdE5vZGVzID0gcGFyc2VSZXN1bHQucm9vdE5vZGVzO1xuICAgIC8vIHByb2Nlc3MgaTE4biBtZXRhIGluZm9ybWF0aW9uIChzY2FuIGF0dHJpYnV0ZXMsIGdlbmVyYXRlIGlkcylcbiAgICAvLyBiZWZvcmUgd2UgcnVuIHdoaXRlc3BhY2UgcmVtb3ZhbCBwcm9jZXNzLCBiZWNhdXNlIGV4aXN0aW5nIGkxOG5cbiAgICAvLyBleHRyYWN0aW9uIHByb2Nlc3MgKG5nIHhpMThuKSByZWxpZXMgb24gYSByYXcgY29udGVudCB0byBnZW5lcmF0ZVxuICAgIC8vIG1lc3NhZ2UgaWRzXG4gICAgcm9vdE5vZGVzID1cbiAgICAgICAgdmlzaXRBbGwkMShuZXcgSTE4bk1ldGFWaXNpdG9yKGludGVycG9sYXRpb25Db25maWcsICFwcmVzZXJ2ZVdoaXRlc3BhY2VzKSwgcm9vdE5vZGVzKTtcbiAgICBpZiAoIXByZXNlcnZlV2hpdGVzcGFjZXMpIHtcbiAgICAgICAgcm9vdE5vZGVzID0gdmlzaXRBbGwkMShuZXcgV2hpdGVzcGFjZVZpc2l0b3IoKSwgcm9vdE5vZGVzKTtcbiAgICAgICAgLy8gcnVuIGkxOG4gbWV0YSB2aXNpdG9yIGFnYWluIGluIGNhc2Ugd2UgcmVtb3ZlIHdoaXRlc3BhY2VzLCBiZWNhdXNlXG4gICAgICAgIC8vIHRoYXQgbWlnaHQgYWZmZWN0IGdlbmVyYXRlZCBpMThuIG1lc3NhZ2UgY29udGVudC4gRHVyaW5nIHRoaXMgcGFzc1xuICAgICAgICAvLyBpMThuIElEcyBnZW5lcmF0ZWQgYXQgdGhlIGZpcnN0IHBhc3Mgd2lsbCBiZSBwcmVzZXJ2ZWQsIHNvIHdlIGNhbiBtaW1pY1xuICAgICAgICAvLyBleGlzdGluZyBleHRyYWN0aW9uIHByb2Nlc3MgKG5nIHhpMThuKVxuICAgICAgICByb290Tm9kZXMgPSB2aXNpdEFsbCQxKG5ldyBJMThuTWV0YVZpc2l0b3IoaW50ZXJwb2xhdGlvbkNvbmZpZywgLyoga2VlcEkxOG5BdHRycyAqLyBmYWxzZSksIHJvb3ROb2Rlcyk7XG4gICAgfVxuICAgIHZhciBfYSA9IGh0bWxBc3RUb1JlbmRlcjNBc3Qocm9vdE5vZGVzLCBiaW5kaW5nUGFyc2VyKSwgbm9kZXMgPSBfYS5ub2RlcywgZXJyb3JzID0gX2EuZXJyb3JzLCBzdHlsZVVybHMgPSBfYS5zdHlsZVVybHMsIHN0eWxlcyA9IF9hLnN0eWxlcztcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yczogZXJyb3JzLCBub2RlczogW10sIHN0eWxlVXJsczogW10sIHN0eWxlczogW10gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbm9kZXM6IG5vZGVzLCBzdHlsZVVybHM6IHN0eWxlVXJscywgc3R5bGVzOiBzdHlsZXMgfTtcbn1cbi8qKlxuICogQ29uc3RydWN0IGEgYEJpbmRpbmdQYXJzZXJgIHdpdGggYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG1ha2VCaW5kaW5nUGFyc2VyKGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICBpZiAoaW50ZXJwb2xhdGlvbkNvbmZpZyA9PT0gdm9pZCAwKSB7IGludGVycG9sYXRpb25Db25maWcgPSBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHOyB9XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUGFyc2VyKG5ldyBQYXJzZXIkMShuZXcgTGV4ZXIoKSksIGludGVycG9sYXRpb25Db25maWcsIG5ldyBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkoKSwgbnVsbCwgW10pO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVNhbml0aXphdGlvbkZuKGNvbnRleHQsIGlzQXR0cmlidXRlKSB7XG4gICAgc3dpdGNoIChjb250ZXh0KSB7XG4gICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LkhUTUw6XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnNhbml0aXplSHRtbCk7XG4gICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlNDUklQVDpcbiAgICAgICAgICAgIHJldHVybiBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuc2FuaXRpemVTY3JpcHQpO1xuICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5TVFlMRTpcbiAgICAgICAgICAgIC8vIHRoZSBjb21waWxlciBkb2VzIG5vdCBmaWxsIGluIGFuIGluc3RydWN0aW9uIGZvciBbc3R5bGUucHJvcD9dIGJpbmRpbmdcbiAgICAgICAgICAgIC8vIHZhbHVlcyBiZWNhdXNlIHRoZSBzdHlsZSBhbGdvcml0aG0ga25vd3MgaW50ZXJuYWxseSB3aGF0IHByb3BzIGFyZSBzdWJqZWN0XG4gICAgICAgICAgICAvLyB0byBzYW5pdGl6YXRpb24gKG9ubHkgW2F0dHIuc3R5bGVdIHZhbHVlcyBhcmUgZXhwbGljaXRseSBzYW5pdGl6ZWQpXG4gICAgICAgICAgICByZXR1cm4gaXNBdHRyaWJ1dGUgPyBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuc2FuaXRpemVTdHlsZSkgOiBudWxsO1xuICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5VUkw6XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnNhbml0aXplVXJsKTtcbiAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMOlxuICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5zYW5pdGl6ZVJlc291cmNlVXJsKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU2luZ2xlRWxlbWVudFRlbXBsYXRlKGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiBjaGlsZHJlblswXSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIFRleHQgfHwgbm9kZSBpbnN0YW5jZW9mIEJvdW5kVGV4dCB8fCBub2RlIGluc3RhbmNlb2YgSWN1O1xufVxuZnVuY3Rpb24gaGFzVGV4dENoaWxkcmVuT25seShjaGlsZHJlbikge1xuICAgIHJldHVybiBjaGlsZHJlbi5ldmVyeShpc1RleHROb2RlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEVNUFRZX0FSUkFZID0gW107XG4vLyBUaGlzIHJlZ2V4IG1hdGNoZXMgYW55IGJpbmRpbmcgbmFtZXMgdGhhdCBjb250YWluIHRoZSBcImF0dHIuXCIgcHJlZml4LCBlLmcuIFwiYXR0ci5yZXF1aXJlZFwiXG4vLyBJZiB0aGVyZSBpcyBhIG1hdGNoLCB0aGUgZmlyc3QgbWF0Y2hpbmcgZ3JvdXAgd2lsbCBjb250YWluIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBiaW5kLlxudmFyIEFUVFJfUkVHRVggPSAvYXR0clxcLihbXlxcXV0rKS87XG5mdW5jdGlvbiBnZXRTdHlsaW5nUHJlZml4KG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgNSk7IC8vIHN0eWxlIG9yIGNsYXNzXG59XG5mdW5jdGlvbiBiYXNlRGlyZWN0aXZlRmllbGRzKG1ldGEsIGNvbnN0YW50UG9vbCwgYmluZGluZ1BhcnNlcikge1xuICAgIHZhciBkZWZpbml0aW9uTWFwID0gbmV3IERlZmluaXRpb25NYXAoKTtcbiAgICAvLyBlLmcuIGB0eXBlOiBNeURpcmVjdGl2ZWBcbiAgICBkZWZpbml0aW9uTWFwLnNldCgndHlwZScsIG1ldGEudHlwZSk7XG4gICAgLy8gZS5nLiBgc2VsZWN0b3JzOiBbWycnLCAnc29tZURpcicsICcnXV1gXG4gICAgZGVmaW5pdGlvbk1hcC5zZXQoJ3NlbGVjdG9ycycsIGNyZWF0ZURpcmVjdGl2ZVNlbGVjdG9yKG1ldGEuc2VsZWN0b3IpKTtcbiAgICAvLyBlLmcuIGBmYWN0b3J5OiAoKSA9PiBuZXcgTXlBcHAoZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKWBcbiAgICB2YXIgcmVzdWx0ID0gY29tcGlsZUZhY3RvcnlGdW5jdGlvbih7XG4gICAgICAgIG5hbWU6IG1ldGEubmFtZSxcbiAgICAgICAgdHlwZTogbWV0YS50eXBlLFxuICAgICAgICBkZXBzOiBtZXRhLmRlcHMsXG4gICAgICAgIGluamVjdEZuOiBJZGVudGlmaWVycyQxLmRpcmVjdGl2ZUluamVjdCxcbiAgICB9KTtcbiAgICBkZWZpbml0aW9uTWFwLnNldCgnZmFjdG9yeScsIHJlc3VsdC5mYWN0b3J5KTtcbiAgICBpZiAobWV0YS5xdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gZS5nLiBgY29udGVudFF1ZXJpZXM6IChyZiwgY3R4LCBkaXJJbmRleCkgPT4geyAuLi4gfVxuICAgICAgICBkZWZpbml0aW9uTWFwLnNldCgnY29udGVudFF1ZXJpZXMnLCBjcmVhdGVDb250ZW50UXVlcmllc0Z1bmN0aW9uKG1ldGEucXVlcmllcywgY29uc3RhbnRQb29sLCBtZXRhLm5hbWUpKTtcbiAgICB9XG4gICAgaWYgKG1ldGEudmlld1F1ZXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGRlZmluaXRpb25NYXAuc2V0KCd2aWV3UXVlcnknLCBjcmVhdGVWaWV3UXVlcmllc0Z1bmN0aW9uKG1ldGEudmlld1F1ZXJpZXMsIGNvbnN0YW50UG9vbCwgbWV0YS5uYW1lKSk7XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgaG9zdFZhcnNDb3VudCB0byBudW1iZXIgb2YgYm91bmQgaG9zdCBwcm9wZXJ0aWVzIChpbnRlcnBvbGF0aW9ucyBpbGxlZ2FsKSxcbiAgICAvLyBleGNlcHQgJ3N0eWxlJyBhbmQgJ2NsYXNzJyBwcm9wZXJ0aWVzLCBzaW5jZSB0aGV5IHNob3VsZCAqbm90KiBhbGxvY2F0ZSBob3N0IHZhciBzbG90c1xuICAgIHZhciBob3N0VmFyc0NvdW50ID0gT2JqZWN0LmtleXMobWV0YS5ob3N0LnByb3BlcnRpZXMpXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHByZWZpeCA9IGdldFN0eWxpbmdQcmVmaXgobmFtZSk7XG4gICAgICAgIHJldHVybiBwcmVmaXggIT09ICdzdHlsZScgJiYgcHJlZml4ICE9PSAnY2xhc3MnO1xuICAgIH0pXG4gICAgICAgIC5sZW5ndGg7XG4gICAgdmFyIGVsVmFyRXhwID0gdmFyaWFibGUoJ2VsSW5kZXgnKTtcbiAgICB2YXIgY29udGV4dFZhckV4cCA9IHZhcmlhYmxlKENPTlRFWFRfTkFNRSk7XG4gICAgdmFyIHN0eWxlQnVpbGRlciA9IG5ldyBTdHlsaW5nQnVpbGRlcihlbFZhckV4cCwgY29udGV4dFZhckV4cCk7XG4gICAgdmFyIF9hID0gbWV0YS5ob3N0LnNwZWNpYWxBdHRyaWJ1dGVzLCBzdHlsZUF0dHIgPSBfYS5zdHlsZUF0dHIsIGNsYXNzQXR0ciA9IF9hLmNsYXNzQXR0cjtcbiAgICBpZiAoc3R5bGVBdHRyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3R5bGVCdWlsZGVyLnJlZ2lzdGVyU3R5bGVBdHRyKHN0eWxlQXR0cik7XG4gICAgfVxuICAgIGlmIChjbGFzc0F0dHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzdHlsZUJ1aWxkZXIucmVnaXN0ZXJDbGFzc0F0dHIoY2xhc3NBdHRyKTtcbiAgICB9XG4gICAgLy8gZS5nLiBgaG9zdEJpbmRpbmdzOiAocmYsIGN0eCwgZWxJbmRleCkgPT4geyAuLi4gfVxuICAgIGRlZmluaXRpb25NYXAuc2V0KCdob3N0QmluZGluZ3MnLCBjcmVhdGVIb3N0QmluZGluZ3NGdW5jdGlvbihtZXRhLCBlbFZhckV4cCwgY29udGV4dFZhckV4cCwgbWV0YS5ob3N0LmF0dHJpYnV0ZXMsIHN0eWxlQnVpbGRlciwgYmluZGluZ1BhcnNlciwgY29uc3RhbnRQb29sLCBob3N0VmFyc0NvdW50KSk7XG4gICAgLy8gZS5nICdpbnB1dHM6IHthOiAnYSd9YFxuICAgIGRlZmluaXRpb25NYXAuc2V0KCdpbnB1dHMnLCBjb25kaXRpb25hbGx5Q3JlYXRlTWFwT2JqZWN0TGl0ZXJhbChtZXRhLmlucHV0cywgdHJ1ZSkpO1xuICAgIC8vIGUuZyAnb3V0cHV0czoge2E6ICdhJ31gXG4gICAgZGVmaW5pdGlvbk1hcC5zZXQoJ291dHB1dHMnLCBjb25kaXRpb25hbGx5Q3JlYXRlTWFwT2JqZWN0TGl0ZXJhbChtZXRhLm91dHB1dHMpKTtcbiAgICBpZiAobWV0YS5leHBvcnRBcyAhPT0gbnVsbCkge1xuICAgICAgICBkZWZpbml0aW9uTWFwLnNldCgnZXhwb3J0QXMnLCBsaXRlcmFsQXJyKG1ldGEuZXhwb3J0QXMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBsaXRlcmFsKGUpOyB9KSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBkZWZpbml0aW9uTWFwOiBkZWZpbml0aW9uTWFwLCBzdGF0ZW1lbnRzOiByZXN1bHQuc3RhdGVtZW50cyB9O1xufVxuLyoqXG4gKiBBZGQgZmVhdHVyZXMgdG8gdGhlIGRlZmluaXRpb24gbWFwLlxuICovXG5mdW5jdGlvbiBhZGRGZWF0dXJlcyhkZWZpbml0aW9uTWFwLCBtZXRhKSB7XG4gICAgLy8gZS5nLiBgZmVhdHVyZXM6IFtOZ09uQ2hhbmdlc0ZlYXR1cmUoKV1gXG4gICAgdmFyIGZlYXR1cmVzID0gW107XG4gICAgdmFyIHByb3ZpZGVycyA9IG1ldGEucHJvdmlkZXJzO1xuICAgIHZhciB2aWV3UHJvdmlkZXJzID0gbWV0YS52aWV3UHJvdmlkZXJzO1xuICAgIGlmIChwcm92aWRlcnMgfHwgdmlld1Byb3ZpZGVycykge1xuICAgICAgICB2YXIgYXJncyA9IFtwcm92aWRlcnMgfHwgbmV3IExpdGVyYWxBcnJheUV4cHIoW10pXTtcbiAgICAgICAgaWYgKHZpZXdQcm92aWRlcnMpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh2aWV3UHJvdmlkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5Qcm92aWRlcnNGZWF0dXJlKS5jYWxsRm4oYXJncykpO1xuICAgIH1cbiAgICBpZiAobWV0YS51c2VzSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuSW5oZXJpdERlZmluaXRpb25GZWF0dXJlKSk7XG4gICAgfVxuICAgIGlmIChtZXRhLmxpZmVjeWNsZS51c2VzT25DaGFuZ2VzKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLk5nT25DaGFuZ2VzRmVhdHVyZSkuY2FsbEZuKEVNUFRZX0FSUkFZKSk7XG4gICAgfVxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2ZlYXR1cmVzJywgbGl0ZXJhbEFycihmZWF0dXJlcykpO1xuICAgIH1cbn1cbi8qKlxuICogQ29tcGlsZSBhIGRpcmVjdGl2ZSBmb3IgdGhlIHJlbmRlcjMgcnVudGltZSBhcyBkZWZpbmVkIGJ5IHRoZSBgUjNEaXJlY3RpdmVNZXRhZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVEaXJlY3RpdmVGcm9tTWV0YWRhdGEobWV0YSwgY29uc3RhbnRQb29sLCBiaW5kaW5nUGFyc2VyKSB7XG4gICAgdmFyIF9hID0gYmFzZURpcmVjdGl2ZUZpZWxkcyhtZXRhLCBjb25zdGFudFBvb2wsIGJpbmRpbmdQYXJzZXIpLCBkZWZpbml0aW9uTWFwID0gX2EuZGVmaW5pdGlvbk1hcCwgc3RhdGVtZW50cyA9IF9hLnN0YXRlbWVudHM7XG4gICAgYWRkRmVhdHVyZXMoZGVmaW5pdGlvbk1hcCwgbWV0YSk7XG4gICAgdmFyIGV4cHJlc3Npb24gPSBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuZGVmaW5lRGlyZWN0aXZlKS5jYWxsRm4oW2RlZmluaXRpb25NYXAudG9MaXRlcmFsTWFwKCldKTtcbiAgICBpZiAoIW1ldGEuc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGlyZWN0aXZlIFwiICsgbWV0YS5uYW1lICsgXCIgaGFzIG5vIHNlbGVjdG9yLCBwbGVhc2UgYWRkIGl0IVwiKTtcbiAgICB9XG4gICAgdmFyIHR5cGUgPSBjcmVhdGVUeXBlRm9yRGVmKG1ldGEsIElkZW50aWZpZXJzJDEuRGlyZWN0aXZlRGVmV2l0aE1ldGEpO1xuICAgIHJldHVybiB7IGV4cHJlc3Npb246IGV4cHJlc3Npb24sIHR5cGU6IHR5cGUsIHN0YXRlbWVudHM6IHN0YXRlbWVudHMgfTtcbn1cbi8qKlxuICogQ29tcGlsZSBhIGJhc2UgZGVmaW5pdGlvbiBmb3IgdGhlIHJlbmRlcjMgcnVudGltZSBhcyBkZWZpbmVkIGJ5IHtAbGluayBSM0Jhc2VSZWZNZXRhZGF0YX1cbiAqIEBwYXJhbSBtZXRhIHRoZSBtZXRhZGF0YSB1c2VkIGZvciBjb21waWxhdGlvbi5cbiAqL1xuZnVuY3Rpb24gY29tcGlsZUJhc2VEZWZGcm9tTWV0YWRhdGEobWV0YSwgY29uc3RhbnRQb29sKSB7XG4gICAgdmFyIGRlZmluaXRpb25NYXAgPSBuZXcgRGVmaW5pdGlvbk1hcCgpO1xuICAgIGlmIChtZXRhLmlucHV0cykge1xuICAgICAgICB2YXIgaW5wdXRzXzEgPSBtZXRhLmlucHV0cztcbiAgICAgICAgdmFyIGlucHV0c01hcCA9IE9iamVjdC5rZXlzKGlucHV0c18xKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHYgPSBpbnB1dHNfMVtrZXldO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2KSA/IGxpdGVyYWxBcnIodi5tYXAoZnVuY3Rpb24gKHZ4KSB7IHJldHVybiBsaXRlcmFsKHZ4KTsgfSkpIDogbGl0ZXJhbCh2KTtcbiAgICAgICAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHF1b3RlZDogZmFsc2UgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRlZmluaXRpb25NYXAuc2V0KCdpbnB1dHMnLCBsaXRlcmFsTWFwKGlucHV0c01hcCkpO1xuICAgIH1cbiAgICBpZiAobWV0YS5vdXRwdXRzKSB7XG4gICAgICAgIHZhciBvdXRwdXRzXzEgPSBtZXRhLm91dHB1dHM7XG4gICAgICAgIHZhciBvdXRwdXRzTWFwID0gT2JqZWN0LmtleXMob3V0cHV0c18xKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gbGl0ZXJhbChvdXRwdXRzXzFba2V5XSk7XG4gICAgICAgICAgICByZXR1cm4geyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBxdW90ZWQ6IGZhbHNlIH07XG4gICAgICAgIH0pO1xuICAgICAgICBkZWZpbml0aW9uTWFwLnNldCgnb3V0cHV0cycsIGxpdGVyYWxNYXAob3V0cHV0c01hcCkpO1xuICAgIH1cbiAgICBpZiAobWV0YS52aWV3UXVlcmllcyAmJiBtZXRhLnZpZXdRdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ3ZpZXdRdWVyeScsIGNyZWF0ZVZpZXdRdWVyaWVzRnVuY3Rpb24obWV0YS52aWV3UXVlcmllcywgY29uc3RhbnRQb29sKSk7XG4gICAgfVxuICAgIGlmIChtZXRhLnF1ZXJpZXMgJiYgbWV0YS5xdWVyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2NvbnRlbnRRdWVyaWVzJywgY3JlYXRlQ29udGVudFF1ZXJpZXNGdW5jdGlvbihtZXRhLnF1ZXJpZXMsIGNvbnN0YW50UG9vbCkpO1xuICAgIH1cbiAgICB2YXIgZXhwcmVzc2lvbiA9IGltcG9ydEV4cHIoSWRlbnRpZmllcnMkMS5kZWZpbmVCYXNlKS5jYWxsRm4oW2RlZmluaXRpb25NYXAudG9MaXRlcmFsTWFwKCldKTtcbiAgICB2YXIgdHlwZSA9IG5ldyBFeHByZXNzaW9uVHlwZShpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuQmFzZURlZikpO1xuICAgIHJldHVybiB7IGV4cHJlc3Npb246IGV4cHJlc3Npb24sIHR5cGU6IHR5cGUgfTtcbn1cbi8qKlxuICogQ29tcGlsZSBhIGNvbXBvbmVudCBmb3IgdGhlIHJlbmRlcjMgcnVudGltZSBhcyBkZWZpbmVkIGJ5IHRoZSBgUjNDb21wb25lbnRNZXRhZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVDb21wb25lbnRGcm9tTWV0YWRhdGEobWV0YSwgY29uc3RhbnRQb29sLCBiaW5kaW5nUGFyc2VyKSB7XG4gICAgdmFyIGVfMSwgX2E7XG4gICAgdmFyIF9iID0gYmFzZURpcmVjdGl2ZUZpZWxkcyhtZXRhLCBjb25zdGFudFBvb2wsIGJpbmRpbmdQYXJzZXIpLCBkZWZpbml0aW9uTWFwID0gX2IuZGVmaW5pdGlvbk1hcCwgc3RhdGVtZW50cyA9IF9iLnN0YXRlbWVudHM7XG4gICAgYWRkRmVhdHVyZXMoZGVmaW5pdGlvbk1hcCwgbWV0YSk7XG4gICAgdmFyIHNlbGVjdG9yID0gbWV0YS5zZWxlY3RvciAmJiBDc3NTZWxlY3Rvci5wYXJzZShtZXRhLnNlbGVjdG9yKTtcbiAgICB2YXIgZmlyc3RTZWxlY3RvciA9IHNlbGVjdG9yICYmIHNlbGVjdG9yWzBdO1xuICAgIC8vIGUuZy4gYGF0dHI6IFtcImNsYXNzXCIsIFwiLm15LmFwcFwiXWBcbiAgICAvLyBUaGlzIGlzIG9wdGlvbmFsIGFuIG9ubHkgaW5jbHVkZWQgaWYgdGhlIGZpcnN0IHNlbGVjdG9yIG9mIGEgY29tcG9uZW50IHNwZWNpZmllcyBhdHRyaWJ1dGVzLlxuICAgIGlmIChmaXJzdFNlbGVjdG9yKSB7XG4gICAgICAgIHZhciBzZWxlY3RvckF0dHJpYnV0ZXMgPSBmaXJzdFNlbGVjdG9yLmdldEF0dHJzKCk7XG4gICAgICAgIGlmIChzZWxlY3RvckF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWZpbml0aW9uTWFwLnNldCgnYXR0cnMnLCBjb25zdGFudFBvb2wuZ2V0Q29uc3RMaXRlcmFsKGxpdGVyYWxBcnIoc2VsZWN0b3JBdHRyaWJ1dGVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlICE9IG51bGwgPyBsaXRlcmFsKHZhbHVlKSA6IGxpdGVyYWwodW5kZWZpbmVkKTsgfSkpLCBcbiAgICAgICAgICAgIC8qIGZvcmNlU2hhcmVkICovIHRydWUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSB0aGUgQ1NTIG1hdGNoZXIgdGhhdCByZWNvZ25pemUgZGlyZWN0aXZlXG4gICAgdmFyIGRpcmVjdGl2ZU1hdGNoZXIgPSBudWxsO1xuICAgIGlmIChtZXRhLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMobWV0YS5kaXJlY3RpdmVzKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZSA9IF9kLnZhbHVlLCBzZWxlY3Rvcl8xID0gX2Uuc2VsZWN0b3IsIGV4cHJlc3Npb25fMSA9IF9lLmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgbWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhDc3NTZWxlY3Rvci5wYXJzZShzZWxlY3Rvcl8xKSwgZXhwcmVzc2lvbl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZU1hdGNoZXIgPSBtYXRjaGVyO1xuICAgIH1cbiAgICAvLyBlLmcuIGB0ZW1wbGF0ZTogZnVuY3Rpb24gTXlDb21wb25lbnRfVGVtcGxhdGUoX2N0eCwgX2NtKSB7Li4ufWBcbiAgICB2YXIgdGVtcGxhdGVUeXBlTmFtZSA9IG1ldGEubmFtZTtcbiAgICB2YXIgdGVtcGxhdGVOYW1lID0gdGVtcGxhdGVUeXBlTmFtZSA/IHRlbXBsYXRlVHlwZU5hbWUgKyBcIl9UZW1wbGF0ZVwiIDogbnVsbDtcbiAgICB2YXIgZGlyZWN0aXZlc1VzZWQgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHBpcGVzVXNlZCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgY2hhbmdlRGV0ZWN0aW9uID0gbWV0YS5jaGFuZ2VEZXRlY3Rpb247XG4gICAgdmFyIHRlbXBsYXRlID0gbWV0YS50ZW1wbGF0ZTtcbiAgICB2YXIgdGVtcGxhdGVCdWlsZGVyID0gbmV3IFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIoY29uc3RhbnRQb29sLCBCaW5kaW5nU2NvcGUuUk9PVF9TQ09QRSwgMCwgdGVtcGxhdGVUeXBlTmFtZSwgbnVsbCwgbnVsbCwgdGVtcGxhdGVOYW1lLCBkaXJlY3RpdmVNYXRjaGVyLCBkaXJlY3RpdmVzVXNlZCwgbWV0YS5waXBlcywgcGlwZXNVc2VkLCBJZGVudGlmaWVycyQxLm5hbWVzcGFjZUhUTUwsIG1ldGEucmVsYXRpdmVDb250ZXh0RmlsZVBhdGgsIG1ldGEuaTE4blVzZUV4dGVybmFsSWRzKTtcbiAgICB2YXIgdGVtcGxhdGVGdW5jdGlvbkV4cHJlc3Npb24gPSB0ZW1wbGF0ZUJ1aWxkZXIuYnVpbGRUZW1wbGF0ZUZ1bmN0aW9uKHRlbXBsYXRlLm5vZGVzLCBbXSk7XG4gICAgLy8gV2UgbmVlZCB0byBwcm92aWRlIHRoaXMgc28gdGhhdCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29tcG9uZW50cyBrbm93IHdoYXRcbiAgICAvLyBwcm9qZWN0ZWQgY29udGVudCBibG9ja3MgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBjb21wb25lbnQgd2hlbiBpdCBpcyBpbnN0YW50aWF0ZWQuXG4gICAgdmFyIG5nQ29udGVudFNlbGVjdG9ycyA9IHRlbXBsYXRlQnVpbGRlci5nZXROZ0NvbnRlbnRTZWxlY3RvcnMoKTtcbiAgICBpZiAobmdDb250ZW50U2VsZWN0b3JzKSB7XG4gICAgICAgIGRlZmluaXRpb25NYXAuc2V0KCduZ0NvbnRlbnRTZWxlY3RvcnMnLCBuZ0NvbnRlbnRTZWxlY3RvcnMpO1xuICAgIH1cbiAgICAvLyBlLmcuIGBjb25zdHM6IDJgXG4gICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2NvbnN0cycsIGxpdGVyYWwodGVtcGxhdGVCdWlsZGVyLmdldENvbnN0Q291bnQoKSkpO1xuICAgIC8vIGUuZy4gYHZhcnM6IDJgXG4gICAgZGVmaW5pdGlvbk1hcC5zZXQoJ3ZhcnMnLCBsaXRlcmFsKHRlbXBsYXRlQnVpbGRlci5nZXRWYXJDb3VudCgpKSk7XG4gICAgZGVmaW5pdGlvbk1hcC5zZXQoJ3RlbXBsYXRlJywgdGVtcGxhdGVGdW5jdGlvbkV4cHJlc3Npb24pO1xuICAgIC8vIGUuZy4gYGRpcmVjdGl2ZXM6IFtNeURpcmVjdGl2ZV1gXG4gICAgaWYgKGRpcmVjdGl2ZXNVc2VkLnNpemUpIHtcbiAgICAgICAgdmFyIGRpcmVjdGl2ZXNFeHByID0gbGl0ZXJhbEFycihBcnJheS5mcm9tKGRpcmVjdGl2ZXNVc2VkKSk7XG4gICAgICAgIGlmIChtZXRhLndyYXBEaXJlY3RpdmVzQW5kUGlwZXNJbkNsb3N1cmUpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZXNFeHByID0gZm4oW10sIFtuZXcgUmV0dXJuU3RhdGVtZW50KGRpcmVjdGl2ZXNFeHByKV0pO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluaXRpb25NYXAuc2V0KCdkaXJlY3RpdmVzJywgZGlyZWN0aXZlc0V4cHIpO1xuICAgIH1cbiAgICAvLyBlLmcuIGBwaXBlczogW015UGlwZV1gXG4gICAgaWYgKHBpcGVzVXNlZC5zaXplKSB7XG4gICAgICAgIHZhciBwaXBlc0V4cHIgPSBsaXRlcmFsQXJyKEFycmF5LmZyb20ocGlwZXNVc2VkKSk7XG4gICAgICAgIGlmIChtZXRhLndyYXBEaXJlY3RpdmVzQW5kUGlwZXNJbkNsb3N1cmUpIHtcbiAgICAgICAgICAgIHBpcGVzRXhwciA9IGZuKFtdLCBbbmV3IFJldHVyblN0YXRlbWVudChwaXBlc0V4cHIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ3BpcGVzJywgcGlwZXNFeHByKTtcbiAgICB9XG4gICAgaWYgKG1ldGEuZW5jYXBzdWxhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICBtZXRhLmVuY2Fwc3VsYXRpb24gPSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICB9XG4gICAgLy8gZS5nLiBgc3R5bGVzOiBbc3RyMSwgc3RyMl1gXG4gICAgaWYgKG1ldGEuc3R5bGVzICYmIG1ldGEuc3R5bGVzLmxlbmd0aCkge1xuICAgICAgICB2YXIgc3R5bGVWYWx1ZXMgPSBtZXRhLmVuY2Fwc3VsYXRpb24gPT0gVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQgP1xuICAgICAgICAgICAgY29tcGlsZVN0eWxlcyhtZXRhLnN0eWxlcywgQ09OVEVOVF9BVFRSLCBIT1NUX0FUVFIpIDpcbiAgICAgICAgICAgIG1ldGEuc3R5bGVzO1xuICAgICAgICB2YXIgc3RyaW5ncyA9IHN0eWxlVmFsdWVzLm1hcChmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBsaXRlcmFsKHN0cik7IH0pO1xuICAgICAgICBkZWZpbml0aW9uTWFwLnNldCgnc3R5bGVzJywgbGl0ZXJhbEFycihzdHJpbmdzKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGEuZW5jYXBzdWxhdGlvbiA9PT0gVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gc3R5bGUsIGRvbid0IGdlbmVyYXRlIGNzcyBzZWxlY3RvcnMgb24gZWxlbWVudHNcbiAgICAgICAgbWV0YS5lbmNhcHN1bGF0aW9uID0gVmlld0VuY2Fwc3VsYXRpb24uTm9uZTtcbiAgICB9XG4gICAgLy8gT25seSBzZXQgdmlldyBlbmNhcHN1bGF0aW9uIGlmIGl0J3Mgbm90IHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG1ldGEuZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQpIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2VuY2Fwc3VsYXRpb24nLCBsaXRlcmFsKG1ldGEuZW5jYXBzdWxhdGlvbikpO1xuICAgIH1cbiAgICAvLyBlLmcuIGBhbmltYXRpb246IFt0cmlnZ2VyKCcxMjMnLCBbXSldYFxuICAgIGlmIChtZXRhLmFuaW1hdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2RhdGEnLCBsaXRlcmFsTWFwKFt7IGtleTogJ2FuaW1hdGlvbicsIHZhbHVlOiBtZXRhLmFuaW1hdGlvbnMsIHF1b3RlZDogZmFsc2UgfV0pKTtcbiAgICB9XG4gICAgLy8gT25seSBzZXQgdGhlIGNoYW5nZSBkZXRlY3Rpb24gZmxhZyBpZiBpdCdzIGRlZmluZWQgYW5kIGl0J3Mgbm90IHRoZSBkZWZhdWx0LlxuICAgIGlmIChjaGFuZ2VEZXRlY3Rpb24gIT0gbnVsbCAmJiBjaGFuZ2VEZXRlY3Rpb24gIT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQpIHtcbiAgICAgICAgZGVmaW5pdGlvbk1hcC5zZXQoJ2NoYW5nZURldGVjdGlvbicsIGxpdGVyYWwoY2hhbmdlRGV0ZWN0aW9uKSk7XG4gICAgfVxuICAgIC8vIE9uIHRoZSB0eXBlIHNpZGUsIHJlbW92ZSBuZXdsaW5lcyBmcm9tIHRoZSBzZWxlY3RvciBhcyBpdCB3aWxsIG5lZWQgdG8gZml0IGludG8gYSBUeXBlU2NyaXB0XG4gICAgLy8gc3RyaW5nIGxpdGVyYWwsIHdoaWNoIG11c3QgYmUgb24gb25lIGxpbmUuXG4gICAgdmFyIHNlbGVjdG9yRm9yVHlwZSA9IChtZXRhLnNlbGVjdG9yIHx8ICcnKS5yZXBsYWNlKC9cXG4vZywgJycpO1xuICAgIHZhciBleHByZXNzaW9uID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmRlZmluZUNvbXBvbmVudCkuY2FsbEZuKFtkZWZpbml0aW9uTWFwLnRvTGl0ZXJhbE1hcCgpXSk7XG4gICAgdmFyIHR5cGUgPSBjcmVhdGVUeXBlRm9yRGVmKG1ldGEsIElkZW50aWZpZXJzJDEuQ29tcG9uZW50RGVmV2l0aE1ldGEpO1xuICAgIHJldHVybiB7IGV4cHJlc3Npb246IGV4cHJlc3Npb24sIHR5cGU6IHR5cGUsIHN0YXRlbWVudHM6IHN0YXRlbWVudHMgfTtcbn1cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBgY29tcGlsZURpcmVjdGl2ZWAgd2hpY2ggZGVwZW5kcyBvbiByZW5kZXIyIGdsb2JhbCBhbmFseXNpcyBkYXRhIGFzIGl0cyBpbnB1dFxuICogaW5zdGVhZCBvZiB0aGUgYFIzRGlyZWN0aXZlTWV0YWRhdGFgLlxuICpcbiAqIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYCBpcyBjb21wdXRlZCBmcm9tIGBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFgIGFuZCBvdGhlciBzdGF0aWNhbGx5IHJlZmxlY3RlZFxuICogaW5mb3JtYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVEaXJlY3RpdmVGcm9tUmVuZGVyMihvdXRwdXRDdHgsIGRpcmVjdGl2ZSwgcmVmbGVjdG9yLCBiaW5kaW5nUGFyc2VyKSB7XG4gICAgdmFyIG5hbWUgPSBpZGVudGlmaWVyTmFtZShkaXJlY3RpdmUudHlwZSk7XG4gICAgbmFtZSB8fCBlcnJvcihcIkNhbm5vdCByZXNvbHZlciB0aGUgbmFtZSBvZiBcIiArIGRpcmVjdGl2ZS50eXBlKTtcbiAgICB2YXIgZGVmaW5pdGlvbkZpZWxkID0gb3V0cHV0Q3R4LmNvbnN0YW50UG9vbC5wcm9wZXJ0eU5hbWVPZigxIC8qIERpcmVjdGl2ZSAqLyk7XG4gICAgdmFyIG1ldGEgPSBkaXJlY3RpdmVNZXRhZGF0YUZyb21HbG9iYWxNZXRhZGF0YShkaXJlY3RpdmUsIG91dHB1dEN0eCwgcmVmbGVjdG9yKTtcbiAgICB2YXIgcmVzID0gY29tcGlsZURpcmVjdGl2ZUZyb21NZXRhZGF0YShtZXRhLCBvdXRwdXRDdHguY29uc3RhbnRQb29sLCBiaW5kaW5nUGFyc2VyKTtcbiAgICAvLyBDcmVhdGUgdGhlIHBhcnRpYWwgY2xhc3MgdG8gYmUgbWVyZ2VkIHdpdGggdGhlIGFjdHVhbCBjbGFzcy5cbiAgICBvdXRwdXRDdHguc3RhdGVtZW50cy5wdXNoKG5ldyBDbGFzc1N0bXQobmFtZSwgbnVsbCwgW25ldyBDbGFzc0ZpZWxkKGRlZmluaXRpb25GaWVsZCwgSU5GRVJSRURfVFlQRSwgW1N0bXRNb2RpZmllci5TdGF0aWNdLCByZXMuZXhwcmVzc2lvbildLCBbXSwgbmV3IENsYXNzTWV0aG9kKG51bGwsIFtdLCBbXSksIFtdKSk7XG59XG4vKipcbiAqIEEgd3JhcHBlciBhcm91bmQgYGNvbXBpbGVDb21wb25lbnRgIHdoaWNoIGRlcGVuZHMgb24gcmVuZGVyMiBnbG9iYWwgYW5hbHlzaXMgZGF0YSBhcyBpdHMgaW5wdXRcbiAqIGluc3RlYWQgb2YgdGhlIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYC5cbiAqXG4gKiBgUjNDb21wb25lbnRNZXRhZGF0YWAgaXMgY29tcHV0ZWQgZnJvbSBgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhYCBhbmQgb3RoZXIgc3RhdGljYWxseSByZWZsZWN0ZWRcbiAqIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiBjb21waWxlQ29tcG9uZW50RnJvbVJlbmRlcjIob3V0cHV0Q3R4LCBjb21wb25lbnQsIHJlbmRlcjNBc3QsIHJlZmxlY3RvciwgYmluZGluZ1BhcnNlciwgZGlyZWN0aXZlVHlwZUJ5U2VsLCBwaXBlVHlwZUJ5TmFtZSkge1xuICAgIHZhciBuYW1lID0gaWRlbnRpZmllck5hbWUoY29tcG9uZW50LnR5cGUpO1xuICAgIG5hbWUgfHwgZXJyb3IoXCJDYW5ub3QgcmVzb2x2ZXIgdGhlIG5hbWUgb2YgXCIgKyBjb21wb25lbnQudHlwZSk7XG4gICAgdmFyIGRlZmluaXRpb25GaWVsZCA9IG91dHB1dEN0eC5jb25zdGFudFBvb2wucHJvcGVydHlOYW1lT2YoMiAvKiBDb21wb25lbnQgKi8pO1xuICAgIHZhciBzdW1tYXJ5ID0gY29tcG9uZW50LnRvU3VtbWFyeSgpO1xuICAgIC8vIENvbXB1dGUgdGhlIFIzQ29tcG9uZW50TWV0YWRhdGEgZnJvbSB0aGUgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhXG4gICAgdmFyIG1ldGEgPSBfX2Fzc2lnbih7fSwgZGlyZWN0aXZlTWV0YWRhdGFGcm9tR2xvYmFsTWV0YWRhdGEoY29tcG9uZW50LCBvdXRwdXRDdHgsIHJlZmxlY3RvciksIHsgc2VsZWN0b3I6IGNvbXBvbmVudC5zZWxlY3RvciwgdGVtcGxhdGU6IHsgbm9kZXM6IHJlbmRlcjNBc3Qubm9kZXMgfSwgZGlyZWN0aXZlczogW10sIHBpcGVzOiB0eXBlTWFwVG9FeHByZXNzaW9uTWFwKHBpcGVUeXBlQnlOYW1lLCBvdXRwdXRDdHgpLCB2aWV3UXVlcmllczogcXVlcmllc0Zyb21HbG9iYWxNZXRhZGF0YShjb21wb25lbnQudmlld1F1ZXJpZXMsIG91dHB1dEN0eCksIHdyYXBEaXJlY3RpdmVzQW5kUGlwZXNJbkNsb3N1cmU6IGZhbHNlLCBzdHlsZXM6IChzdW1tYXJ5LnRlbXBsYXRlICYmIHN1bW1hcnkudGVtcGxhdGUuc3R5bGVzKSB8fCBFTVBUWV9BUlJBWSwgZW5jYXBzdWxhdGlvbjogKHN1bW1hcnkudGVtcGxhdGUgJiYgc3VtbWFyeS50ZW1wbGF0ZS5lbmNhcHN1bGF0aW9uKSB8fCBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCwgaW50ZXJwb2xhdGlvbjogREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRywgYW5pbWF0aW9uczogbnVsbCwgdmlld1Byb3ZpZGVyczogY29tcG9uZW50LnZpZXdQcm92aWRlcnMubGVuZ3RoID4gMCA/IG5ldyBXcmFwcGVkTm9kZUV4cHIoY29tcG9uZW50LnZpZXdQcm92aWRlcnMpIDogbnVsbCwgcmVsYXRpdmVDb250ZXh0RmlsZVBhdGg6ICcnLCBpMThuVXNlRXh0ZXJuYWxJZHM6IHRydWUgfSk7XG4gICAgdmFyIHJlcyA9IGNvbXBpbGVDb21wb25lbnRGcm9tTWV0YWRhdGEobWV0YSwgb3V0cHV0Q3R4LmNvbnN0YW50UG9vbCwgYmluZGluZ1BhcnNlcik7XG4gICAgLy8gQ3JlYXRlIHRoZSBwYXJ0aWFsIGNsYXNzIHRvIGJlIG1lcmdlZCB3aXRoIHRoZSBhY3R1YWwgY2xhc3MuXG4gICAgb3V0cHV0Q3R4LnN0YXRlbWVudHMucHVzaChuZXcgQ2xhc3NTdG10KG5hbWUsIG51bGwsIFtuZXcgQ2xhc3NGaWVsZChkZWZpbml0aW9uRmllbGQsIElORkVSUkVEX1RZUEUsIFtTdG10TW9kaWZpZXIuU3RhdGljXSwgcmVzLmV4cHJlc3Npb24pXSwgW10sIG5ldyBDbGFzc01ldGhvZChudWxsLCBbXSwgW10pLCBbXSkpO1xufVxuLyoqXG4gKiBDb21wdXRlIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYCBnaXZlbiBgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhYCBhbmQgYSBgQ29tcGlsZVJlZmxlY3RvcmAuXG4gKi9cbmZ1bmN0aW9uIGRpcmVjdGl2ZU1ldGFkYXRhRnJvbUdsb2JhbE1ldGFkYXRhKGRpcmVjdGl2ZSwgb3V0cHV0Q3R4LCByZWZsZWN0b3IpIHtcbiAgICAvLyBUaGUgZ2xvYmFsLWFuYWx5c2lzIGJhc2VkIEl2eSBtb2RlIGluIG5nYyBpcyBubyBsb25nZXIgdXRpbGl6ZWQvc3VwcG9ydGVkLlxuICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQnKTtcbn1cbi8qKlxuICogQ29udmVydCBgQ29tcGlsZVF1ZXJ5TWV0YWRhdGFgIGludG8gYFIzUXVlcnlNZXRhZGF0YWAuXG4gKi9cbmZ1bmN0aW9uIHF1ZXJpZXNGcm9tR2xvYmFsTWV0YWRhdGEocXVlcmllcywgb3V0cHV0Q3R4KSB7XG4gICAgcmV0dXJuIHF1ZXJpZXMubWFwKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgICAgICB2YXIgcmVhZCA9IG51bGw7XG4gICAgICAgIGlmIChxdWVyeS5yZWFkICYmIHF1ZXJ5LnJlYWQuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmVhZCA9IG91dHB1dEN0eC5pbXBvcnRFeHByKHF1ZXJ5LnJlYWQuaWRlbnRpZmllci5yZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IHF1ZXJ5LnByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIGZpcnN0OiBxdWVyeS5maXJzdCxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogc2VsZWN0b3JzRnJvbUdsb2JhbE1ldGFkYXRhKHF1ZXJ5LnNlbGVjdG9ycywgb3V0cHV0Q3R4KSxcbiAgICAgICAgICAgIGRlc2NlbmRhbnRzOiBxdWVyeS5kZXNjZW5kYW50cywgcmVhZDogcmVhZCxcbiAgICAgICAgICAgIHN0YXRpYzogISFxdWVyeS5zdGF0aWNcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ29udmVydCBgQ29tcGlsZVRva2VuTWV0YWRhdGFgIGZvciBxdWVyeSBzZWxlY3RvcnMgaW50byBlaXRoZXIgYW4gZXhwcmVzc2lvbiBmb3IgYSBwcmVkaWNhdGVcbiAqIHR5cGUsIG9yIGEgbGlzdCBvZiBzdHJpbmcgcHJlZGljYXRlcy5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0b3JzRnJvbUdsb2JhbE1ldGFkYXRhKHNlbGVjdG9ycywgb3V0cHV0Q3R4KSB7XG4gICAgaWYgKHNlbGVjdG9ycy5sZW5ndGggPiAxIHx8IChzZWxlY3RvcnMubGVuZ3RoID09IDEgJiYgc2VsZWN0b3JzWzBdLnZhbHVlKSkge1xuICAgICAgICB2YXIgc2VsZWN0b3JTdHJpbmdzID0gc2VsZWN0b3JzLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnZhbHVlOyB9KTtcbiAgICAgICAgc2VsZWN0b3JTdHJpbmdzLnNvbWUoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiAhdmFsdWU7IH0pICYmXG4gICAgICAgICAgICBlcnJvcignRm91bmQgYSB0eXBlIGFtb25nIHRoZSBzdHJpbmcgc2VsZWN0b3JzIGV4cGVjdGVkJyk7XG4gICAgICAgIHJldHVybiBvdXRwdXRDdHguY29uc3RhbnRQb29sLmdldENvbnN0TGl0ZXJhbChsaXRlcmFsQXJyKHNlbGVjdG9yU3RyaW5ncy5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBsaXRlcmFsKHZhbHVlKTsgfSkpKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdG9ycy5sZW5ndGggPT0gMSkge1xuICAgICAgICB2YXIgZmlyc3QgPSBzZWxlY3RvcnNbMF07XG4gICAgICAgIGlmIChmaXJzdC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0Q3R4LmltcG9ydEV4cHIoZmlyc3QuaWRlbnRpZmllci5yZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVycm9yKCdVbmV4cGVjdGVkIHF1ZXJ5IGZvcm0nKTtcbiAgICByZXR1cm4gTlVMTF9FWFBSO1xufVxuZnVuY3Rpb24gcHJlcGFyZVF1ZXJ5UGFyYW1zKHF1ZXJ5LCBjb25zdGFudFBvb2wpIHtcbiAgICB2YXIgcGFyYW1ldGVycyA9IFtcbiAgICAgICAgZ2V0UXVlcnlQcmVkaWNhdGUocXVlcnksIGNvbnN0YW50UG9vbCksXG4gICAgICAgIGxpdGVyYWwocXVlcnkuZGVzY2VuZGFudHMpLFxuICAgICAgICBxdWVyeS5yZWFkIHx8IGxpdGVyYWwobnVsbCksXG4gICAgXTtcbiAgICByZXR1cm4gcGFyYW1ldGVycztcbn1cbi8vIFR1cm4gYSBkaXJlY3RpdmUgc2VsZWN0b3IgaW50byBhbiBSMy1jb21wYXRpYmxlIHNlbGVjdG9yIGZvciBkaXJlY3RpdmUgZGVmXG5mdW5jdGlvbiBjcmVhdGVEaXJlY3RpdmVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiBhc0xpdGVyYWwocGFyc2VTZWxlY3RvclRvUjNTZWxlY3RvcihzZWxlY3RvcikpO1xufVxuZnVuY3Rpb24gY29udmVydEF0dHJpYnV0ZXNUb0V4cHJlc3Npb25zKGF0dHJpYnV0ZXMpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhdHRyaWJ1dGVzKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGF0dHJpYnV0ZXNba2V5XTtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGxpdGVyYWwoa2V5KSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufVxuLy8gRGVmaW5lIGFuZCB1cGRhdGUgYW55IGNvbnRlbnQgcXVlcmllc1xuZnVuY3Rpb24gY3JlYXRlQ29udGVudFF1ZXJpZXNGdW5jdGlvbihxdWVyaWVzLCBjb25zdGFudFBvb2wsIG5hbWUpIHtcbiAgICB2YXIgZV8zLCBfYTtcbiAgICB2YXIgY3JlYXRlU3RhdGVtZW50cyA9IFtdO1xuICAgIHZhciB1cGRhdGVTdGF0ZW1lbnRzID0gW107XG4gICAgdmFyIHRlbXBBbGxvY2F0b3IgPSB0ZW1wb3JhcnlBbGxvY2F0b3IodXBkYXRlU3RhdGVtZW50cywgVEVNUE9SQVJZX05BTUUpO1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIHF1ZXJpZXNfMSA9IF9fdmFsdWVzKHF1ZXJpZXMpLCBxdWVyaWVzXzFfMSA9IHF1ZXJpZXNfMS5uZXh0KCk7ICFxdWVyaWVzXzFfMS5kb25lOyBxdWVyaWVzXzFfMSA9IHF1ZXJpZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBxdWVyeSA9IHF1ZXJpZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gY3JlYXRpb24sIGUuZy4gcjMuY29udGVudFF1ZXJ5KGRpckluZGV4LCBzb21lUHJlZGljYXRlLCB0cnVlLCBudWxsKTtcbiAgICAgICAgICAgIHZhciBhcmdzID0gX19zcHJlYWQoW3ZhcmlhYmxlKCdkaXJJbmRleCcpXSwgcHJlcGFyZVF1ZXJ5UGFyYW1zKHF1ZXJ5LCBjb25zdGFudFBvb2wpKTtcbiAgICAgICAgICAgIHZhciBxdWVyeUluc3RydWN0aW9uID0gcXVlcnkuc3RhdGljID8gSWRlbnRpZmllcnMkMS5zdGF0aWNDb250ZW50UXVlcnkgOiBJZGVudGlmaWVycyQxLmNvbnRlbnRRdWVyeTtcbiAgICAgICAgICAgIGNyZWF0ZVN0YXRlbWVudHMucHVzaChpbXBvcnRFeHByKHF1ZXJ5SW5zdHJ1Y3Rpb24pLmNhbGxGbihhcmdzKS50b1N0bXQoKSk7XG4gICAgICAgICAgICAvLyB1cGRhdGUsIGUuZy4gKHIzLnF1ZXJ5UmVmcmVzaCh0bXAgPSByMy5sb2FkQ29udGVudFF1ZXJ5KCkpICYmIChjdHguc29tZURpciA9IHRtcCkpO1xuICAgICAgICAgICAgdmFyIHRlbXBvcmFyeSA9IHRlbXBBbGxvY2F0b3IoKTtcbiAgICAgICAgICAgIHZhciBnZXRRdWVyeUxpc3QgPSBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEubG9hZENvbnRlbnRRdWVyeSkuY2FsbEZuKFtdKTtcbiAgICAgICAgICAgIHZhciByZWZyZXNoID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnF1ZXJ5UmVmcmVzaCkuY2FsbEZuKFt0ZW1wb3Jhcnkuc2V0KGdldFF1ZXJ5TGlzdCldKTtcbiAgICAgICAgICAgIHZhciB1cGRhdGVEaXJlY3RpdmUgPSB2YXJpYWJsZShDT05URVhUX05BTUUpXG4gICAgICAgICAgICAgICAgLnByb3AocXVlcnkucHJvcGVydHlOYW1lKVxuICAgICAgICAgICAgICAgIC5zZXQocXVlcnkuZmlyc3QgPyB0ZW1wb3JhcnkucHJvcCgnZmlyc3QnKSA6IHRlbXBvcmFyeSk7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZW1lbnRzLnB1c2gocmVmcmVzaC5hbmQodXBkYXRlRGlyZWN0aXZlKS50b1N0bXQoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChxdWVyaWVzXzFfMSAmJiAhcXVlcmllc18xXzEuZG9uZSAmJiAoX2EgPSBxdWVyaWVzXzEucmV0dXJuKSkgX2EuY2FsbChxdWVyaWVzXzEpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICB9XG4gICAgdmFyIGNvbnRlbnRRdWVyaWVzRm5OYW1lID0gbmFtZSA/IG5hbWUgKyBcIl9Db250ZW50UXVlcmllc1wiIDogbnVsbDtcbiAgICByZXR1cm4gZm4oW1xuICAgICAgICBuZXcgRm5QYXJhbShSRU5ERVJfRkxBR1MsIE5VTUJFUl9UWVBFKSwgbmV3IEZuUGFyYW0oQ09OVEVYVF9OQU1FLCBudWxsKSxcbiAgICAgICAgbmV3IEZuUGFyYW0oJ2RpckluZGV4JywgbnVsbClcbiAgICBdLCBbXG4gICAgICAgIHJlbmRlckZsYWdDaGVja0lmU3RtdCgxIC8qIENyZWF0ZSAqLywgY3JlYXRlU3RhdGVtZW50cyksXG4gICAgICAgIHJlbmRlckZsYWdDaGVja0lmU3RtdCgyIC8qIFVwZGF0ZSAqLywgdXBkYXRlU3RhdGVtZW50cylcbiAgICBdLCBJTkZFUlJFRF9UWVBFLCBudWxsLCBjb250ZW50UXVlcmllc0ZuTmFtZSk7XG59XG5mdW5jdGlvbiBzdHJpbmdBc1R5cGUoc3RyKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25UeXBlKGxpdGVyYWwoc3RyKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdNYXBBc1R5cGUobWFwKSB7XG4gICAgdmFyIG1hcFZhbHVlcyA9IE9iamVjdC5rZXlzKG1hcCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gQXJyYXkuaXNBcnJheShtYXBba2V5XSkgPyBtYXBba2V5XVswXSA6IG1hcFtrZXldO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICB2YWx1ZTogbGl0ZXJhbCh2YWx1ZSksXG4gICAgICAgICAgICBxdW90ZWQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb25UeXBlKGxpdGVyYWxNYXAobWFwVmFsdWVzKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdBcnJheUFzVHlwZShhcnIpIHtcbiAgICByZXR1cm4gYXJyLmxlbmd0aCA+IDAgPyBleHByZXNzaW9uVHlwZShsaXRlcmFsQXJyKGFyci5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBsaXRlcmFsKHZhbHVlKTsgfSkpKSA6XG4gICAgICAgIE5PTkVfVFlQRTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVR5cGVGb3JEZWYobWV0YSwgdHlwZUJhc2UpIHtcbiAgICAvLyBPbiB0aGUgdHlwZSBzaWRlLCByZW1vdmUgbmV3bGluZXMgZnJvbSB0aGUgc2VsZWN0b3IgYXMgaXQgd2lsbCBuZWVkIHRvIGZpdCBpbnRvIGEgVHlwZVNjcmlwdFxuICAgIC8vIHN0cmluZyBsaXRlcmFsLCB3aGljaCBtdXN0IGJlIG9uIG9uZSBsaW5lLlxuICAgIHZhciBzZWxlY3RvckZvclR5cGUgPSAobWV0YS5zZWxlY3RvciB8fCAnJykucmVwbGFjZSgvXFxuL2csICcnKTtcbiAgICByZXR1cm4gZXhwcmVzc2lvblR5cGUoaW1wb3J0RXhwcih0eXBlQmFzZSwgW1xuICAgICAgICB0eXBlV2l0aFBhcmFtZXRlcnMobWV0YS50eXBlLCBtZXRhLnR5cGVBcmd1bWVudENvdW50KSxcbiAgICAgICAgc3RyaW5nQXNUeXBlKHNlbGVjdG9yRm9yVHlwZSksXG4gICAgICAgIG1ldGEuZXhwb3J0QXMgIT09IG51bGwgPyBzdHJpbmdBcnJheUFzVHlwZShtZXRhLmV4cG9ydEFzKSA6IE5PTkVfVFlQRSxcbiAgICAgICAgc3RyaW5nTWFwQXNUeXBlKG1ldGEuaW5wdXRzKSxcbiAgICAgICAgc3RyaW5nTWFwQXNUeXBlKG1ldGEub3V0cHV0cyksXG4gICAgICAgIHN0cmluZ0FycmF5QXNUeXBlKG1ldGEucXVlcmllcy5tYXAoZnVuY3Rpb24gKHEpIHsgcmV0dXJuIHEucHJvcGVydHlOYW1lOyB9KSksXG4gICAgXSkpO1xufVxuLy8gRGVmaW5lIGFuZCB1cGRhdGUgYW55IHZpZXcgcXVlcmllc1xuZnVuY3Rpb24gY3JlYXRlVmlld1F1ZXJpZXNGdW5jdGlvbih2aWV3UXVlcmllcywgY29uc3RhbnRQb29sLCBuYW1lKSB7XG4gICAgdmFyIGNyZWF0ZVN0YXRlbWVudHMgPSBbXTtcbiAgICB2YXIgdXBkYXRlU3RhdGVtZW50cyA9IFtdO1xuICAgIHZhciB0ZW1wQWxsb2NhdG9yID0gdGVtcG9yYXJ5QWxsb2NhdG9yKHVwZGF0ZVN0YXRlbWVudHMsIFRFTVBPUkFSWV9OQU1FKTtcbiAgICB2aWV3UXVlcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgICAgICB2YXIgcXVlcnlJbnN0cnVjdGlvbiA9IHF1ZXJ5LnN0YXRpYyA/IElkZW50aWZpZXJzJDEuc3RhdGljVmlld1F1ZXJ5IDogSWRlbnRpZmllcnMkMS52aWV3UXVlcnk7XG4gICAgICAgIC8vIGNyZWF0aW9uLCBlLmcuIHIzLnZpZXdRdWVyeShzb21lUHJlZGljYXRlLCB0cnVlKTtcbiAgICAgICAgdmFyIHF1ZXJ5RGVmaW5pdGlvbiA9IGltcG9ydEV4cHIocXVlcnlJbnN0cnVjdGlvbikuY2FsbEZuKHByZXBhcmVRdWVyeVBhcmFtcyhxdWVyeSwgY29uc3RhbnRQb29sKSk7XG4gICAgICAgIGNyZWF0ZVN0YXRlbWVudHMucHVzaChxdWVyeURlZmluaXRpb24udG9TdG10KCkpO1xuICAgICAgICAvLyB1cGRhdGUsIGUuZy4gKHIzLnF1ZXJ5UmVmcmVzaCh0bXAgPSByMy5sb2FkVmlld1F1ZXJ5KCkpICYmIChjdHguc29tZURpciA9IHRtcCkpO1xuICAgICAgICB2YXIgdGVtcG9yYXJ5ID0gdGVtcEFsbG9jYXRvcigpO1xuICAgICAgICB2YXIgZ2V0UXVlcnlMaXN0ID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmxvYWRWaWV3UXVlcnkpLmNhbGxGbihbXSk7XG4gICAgICAgIHZhciByZWZyZXNoID0gaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLnF1ZXJ5UmVmcmVzaCkuY2FsbEZuKFt0ZW1wb3Jhcnkuc2V0KGdldFF1ZXJ5TGlzdCldKTtcbiAgICAgICAgdmFyIHVwZGF0ZURpcmVjdGl2ZSA9IHZhcmlhYmxlKENPTlRFWFRfTkFNRSlcbiAgICAgICAgICAgIC5wcm9wKHF1ZXJ5LnByb3BlcnR5TmFtZSlcbiAgICAgICAgICAgIC5zZXQocXVlcnkuZmlyc3QgPyB0ZW1wb3JhcnkucHJvcCgnZmlyc3QnKSA6IHRlbXBvcmFyeSk7XG4gICAgICAgIHVwZGF0ZVN0YXRlbWVudHMucHVzaChyZWZyZXNoLmFuZCh1cGRhdGVEaXJlY3RpdmUpLnRvU3RtdCgpKTtcbiAgICB9KTtcbiAgICB2YXIgdmlld1F1ZXJ5Rm5OYW1lID0gbmFtZSA/IG5hbWUgKyBcIl9RdWVyeVwiIDogbnVsbDtcbiAgICByZXR1cm4gZm4oW25ldyBGblBhcmFtKFJFTkRFUl9GTEFHUywgTlVNQkVSX1RZUEUpLCBuZXcgRm5QYXJhbShDT05URVhUX05BTUUsIG51bGwpXSwgW1xuICAgICAgICByZW5kZXJGbGFnQ2hlY2tJZlN0bXQoMSAvKiBDcmVhdGUgKi8sIGNyZWF0ZVN0YXRlbWVudHMpLFxuICAgICAgICByZW5kZXJGbGFnQ2hlY2tJZlN0bXQoMiAvKiBVcGRhdGUgKi8sIHVwZGF0ZVN0YXRlbWVudHMpXG4gICAgXSwgSU5GRVJSRURfVFlQRSwgbnVsbCwgdmlld1F1ZXJ5Rm5OYW1lKTtcbn1cbi8vIFJldHVybiBhIGhvc3QgYmluZGluZyBmdW5jdGlvbiBvciBudWxsIGlmIG9uZSBpcyBub3QgbmVjZXNzYXJ5LlxuZnVuY3Rpb24gY3JlYXRlSG9zdEJpbmRpbmdzRnVuY3Rpb24obWV0YSwgZWxWYXJFeHAsIGJpbmRpbmdDb250ZXh0LCBzdGF0aWNBdHRyaWJ1dGVzQW5kVmFsdWVzLCBzdHlsZUJ1aWxkZXIsIGJpbmRpbmdQYXJzZXIsIGNvbnN0YW50UG9vbCwgaG9zdFZhcnNDb3VudCkge1xuICAgIHZhciBjcmVhdGVTdGF0ZW1lbnRzID0gW107XG4gICAgdmFyIHVwZGF0ZVN0YXRlbWVudHMgPSBbXTtcbiAgICB2YXIgdG90YWxIb3N0VmFyc0NvdW50ID0gaG9zdFZhcnNDb3VudDtcbiAgICB2YXIgaG9zdEJpbmRpbmdTb3VyY2VTcGFuID0gbWV0YS50eXBlU291cmNlU3BhbjtcbiAgICB2YXIgZGlyZWN0aXZlU3VtbWFyeSA9IG1ldGFkYXRhQXNTdW1tYXJ5KG1ldGEpO1xuICAgIHZhciB2YWx1ZUNvbnZlcnRlcjtcbiAgICB2YXIgZ2V0VmFsdWVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdmFsdWVDb252ZXJ0ZXIpIHtcbiAgICAgICAgICAgIHZhciBob3N0VmFyc0NvdW50Rm4gPSBmdW5jdGlvbiAobnVtU2xvdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxWYXJzQ291bnQgPSB0b3RhbEhvc3RWYXJzQ291bnQ7XG4gICAgICAgICAgICAgICAgdG90YWxIb3N0VmFyc0NvdW50ICs9IG51bVNsb3RzO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFZhcnNDb3VudDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YWx1ZUNvbnZlcnRlciA9IG5ldyBWYWx1ZUNvbnZlcnRlcihjb25zdGFudFBvb2wsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVycm9yKCdVbmV4cGVjdGVkIG5vZGUnKTsgfSwgLy8gbmV3IG5vZGVzIGFyZSBpbGxlZ2FsIGhlcmVcbiAgICAgICAgICAgIGhvc3RWYXJzQ291bnRGbiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gZXJyb3IoJ1VuZXhwZWN0ZWQgcGlwZScpOyB9KTsgLy8gcGlwZXMgYXJlIGlsbGVnYWwgaGVyZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZUNvbnZlcnRlcjtcbiAgICB9O1xuICAgIC8vIENhbGN1bGF0ZSBob3N0IGV2ZW50IGJpbmRpbmdzXG4gICAgdmFyIGV2ZW50QmluZGluZ3MgPSBiaW5kaW5nUGFyc2VyLmNyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMoZGlyZWN0aXZlU3VtbWFyeSwgaG9zdEJpbmRpbmdTb3VyY2VTcGFuKTtcbiAgICBpZiAoZXZlbnRCaW5kaW5ncyAmJiBldmVudEJpbmRpbmdzLmxlbmd0aCkge1xuICAgICAgICB2YXIgbGlzdGVuZXJzID0gY3JlYXRlSG9zdExpc3RlbmVycyhldmVudEJpbmRpbmdzLCBtZXRhKTtcbiAgICAgICAgY3JlYXRlU3RhdGVtZW50cy5wdXNoLmFwcGx5KGNyZWF0ZVN0YXRlbWVudHMsIF9fc3ByZWFkKGxpc3RlbmVycykpO1xuICAgIH1cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGhvc3QgcHJvcGVydHkgYmluZGluZ3NcbiAgICB2YXIgYmluZGluZ3MgPSBiaW5kaW5nUGFyc2VyLmNyZWF0ZUJvdW5kSG9zdFByb3BlcnRpZXMoZGlyZWN0aXZlU3VtbWFyeSwgaG9zdEJpbmRpbmdTb3VyY2VTcGFuKTtcbiAgICAoYmluZGluZ3MgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBiaW5kaW5nLm5hbWU7XG4gICAgICAgIHZhciBzdHlsaW5nSW5wdXRXYXNTZXQgPSBzdHlsZUJ1aWxkZXIucmVnaXN0ZXJJbnB1dEJhc2VkT25OYW1lKG5hbWUsIGJpbmRpbmcuZXhwcmVzc2lvbiwgYmluZGluZy5zb3VyY2VTcGFuKTtcbiAgICAgICAgaWYgKCFzdHlsaW5nSW5wdXRXYXNTZXQpIHtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgbGl0ZXJhbCBhcnJheXMgYW5kIGxpdGVyYWwgb2JqZWN0c1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gYmluZGluZy5leHByZXNzaW9uLnZpc2l0KGdldFZhbHVlQ29udmVydGVyKCkpO1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdFeHByID0gYmluZGluZ0ZuKGJpbmRpbmdDb250ZXh0LCB2YWx1ZSk7XG4gICAgICAgICAgICB2YXIgX2EgPSBnZXRCaW5kaW5nTmFtZUFuZEluc3RydWN0aW9uKGJpbmRpbmcpLCBiaW5kaW5nTmFtZSA9IF9hLmJpbmRpbmdOYW1lLCBpbnN0cnVjdGlvbiA9IF9hLmluc3RydWN0aW9uLCBpc0F0dHJpYnV0ZSA9IF9hLmlzQXR0cmlidXRlO1xuICAgICAgICAgICAgdmFyIHNlY3VyaXR5Q29udGV4dHMgPSBiaW5kaW5nUGFyc2VyLmNhbGNQb3NzaWJsZVNlY3VyaXR5Q29udGV4dHMobWV0YS5zZWxlY3RvciB8fCAnJywgYmluZGluZ05hbWUsIGlzQXR0cmlidXRlKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGNvbnRleHQpIHsgcmV0dXJuIGNvbnRleHQgIT09IFNlY3VyaXR5Q29udGV4dC5OT05FOyB9KTtcbiAgICAgICAgICAgIHZhciBzYW5pdGl6ZXJGbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAoc2VjdXJpdHlDb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VjdXJpdHlDb250ZXh0cy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0cy5pbmRleE9mKFNlY3VyaXR5Q29udGV4dC5VUkwpID4gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0cy5pbmRleE9mKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzb21lIFVSTCBhdHRyaWJ1dGVzIChzdWNoIGFzIFwic3JjXCIgYW5kIFwiaHJlZlwiKSB0aGF0IG1heSBiZSBhIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgZGlmZmVyZW50IHNlY3VyaXR5IGNvbnRleHRzLiBJbiB0aGlzIGNhc2Ugd2UgdXNlIHNwZWNpYWwgc2FudGl0aXphdGlvbiBmdW5jdGlvbiBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSBhY3R1YWwgc2FuaXRpemVyIGF0IHJ1bnRpbWUgYmFzZWQgb24gYSB0YWcgbmFtZSB0aGF0IGlzIHByb3ZpZGVkIHdoaWxlXG4gICAgICAgICAgICAgICAgICAgIC8vIGludm9raW5nIHNhbml0aXphdGlvbiBmdW5jdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgc2FuaXRpemVyRm4gPSBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuc2FuaXRpemVVcmxPclJlc291cmNlVXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNhbml0aXplckZuID0gcmVzb2x2ZVNhbml0aXphdGlvbkZuKHNlY3VyaXR5Q29udGV4dHNbMF0sIGlzQXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaXNQcm9wZXJ0eUluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gPT09IElkZW50aWZpZXJzJDEucHJvcGVydHk7XG4gICAgICAgICAgICB2YXIgaW5zdHJ1Y3Rpb25QYXJhbXMgPSBpc1Byb3BlcnR5SW5zdHJ1Y3Rpb24gP1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbChiaW5kaW5nTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdFeHByLmN1cnJWYWxFeHByLFxuICAgICAgICAgICAgICAgIF0gOlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgZWxWYXJFeHAsXG4gICAgICAgICAgICAgICAgICAgIGxpdGVyYWwoYmluZGluZ05hbWUpLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFeHByKElkZW50aWZpZXJzJDEuYmluZCkuY2FsbEZuKFtiaW5kaW5nRXhwci5jdXJyVmFsRXhwcl0pLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoc2FuaXRpemVyRm4pIHtcbiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvblBhcmFtcy5wdXNoKHNhbml0aXplckZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNhbml0aXplckZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBgbnVsbGAgaW4gZnJvbnQgb2YgYG5hdGl2ZU9ubHlgIGZsYWcgaWYgbm8gc2FuaXRpemVyIGZuIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25QYXJhbXMucHVzaChsaXRlcmFsKG51bGwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaG9zdCBiaW5kaW5ncyBtdXN0IGhhdmUgbmF0aXZlT25seSBwcm9wIHNldCB0byB0cnVlXG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25QYXJhbXMucHVzaChsaXRlcmFsKHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlbWVudHMucHVzaC5hcHBseSh1cGRhdGVTdGF0ZW1lbnRzLCBfX3NwcmVhZChiaW5kaW5nRXhwci5zdG10cykpO1xuICAgICAgICAgICAgdXBkYXRlU3RhdGVtZW50cy5wdXNoKGltcG9ydEV4cHIoaW5zdHJ1Y3Rpb24pLmNhbGxGbihpbnN0cnVjdGlvblBhcmFtcykudG9TdG10KCkpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gc2luY2Ugd2UncmUgZGVhbGluZyB3aXRoIGRpcmVjdGl2ZXMvY29tcG9uZW50cyBhbmQgYm90aCBoYXZlIGhvc3RCaW5kaW5nXG4gICAgLy8gZnVuY3Rpb25zLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc3BlY2lhbCBob3N0QXR0cnMgaW5zdHJ1Y3Rpb24gdGhhdCBkZWFsc1xuICAgIC8vIHdpdGggYm90aCB0aGUgYXNzaWdubWVudCBvZiBzdHlsaW5nIGFzIHdlbGwgYXMgc3RhdGljIGF0dHJpYnV0ZXMgdG8gdGhlIGhvc3RcbiAgICAvLyBlbGVtZW50LiBUaGUgaW5zdHJ1Y3Rpb24gYmVsb3cgd2lsbCBpbnN0cnVjdCBhbGwgaW5pdGlhbCBzdHlsaW5nIChzdHlsaW5nXG4gICAgLy8gdGhhdCBpcyBpbnNpZGUgb2YgYSBob3N0IGJpbmRpbmcgd2l0aGluIGEgZGlyZWN0aXZlL2NvbXBvbmVudCkgdG8gYmUgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgaG9zdCBlbGVtZW50IGFsb25nc2lkZSBhbnkgb2YgdGhlIHByb3ZpZGVkIGhvc3QgYXR0cmlidXRlcyB0aGF0IHdlcmVcbiAgICAvLyBjb2xsZWN0ZWQgZWFybGllci5cbiAgICB2YXIgaG9zdEF0dHJzID0gY29udmVydEF0dHJpYnV0ZXNUb0V4cHJlc3Npb25zKHN0YXRpY0F0dHJpYnV0ZXNBbmRWYWx1ZXMpO1xuICAgIHZhciBob3N0SW5zdHJ1Y3Rpb24gPSBzdHlsZUJ1aWxkZXIuYnVpbGRIb3N0QXR0cnNJbnN0cnVjdGlvbihudWxsLCBob3N0QXR0cnMsIGNvbnN0YW50UG9vbCk7XG4gICAgaWYgKGhvc3RJbnN0cnVjdGlvbikge1xuICAgICAgICBjcmVhdGVTdGF0ZW1lbnRzLnB1c2goY3JlYXRlU3R5bGluZ1N0bXQoaG9zdEluc3RydWN0aW9uLCBiaW5kaW5nQ29udGV4dCwgYmluZGluZ0ZuKSk7XG4gICAgfVxuICAgIGlmIChzdHlsZUJ1aWxkZXIuaGFzQmluZGluZ3MpIHtcbiAgICAgICAgLy8gc2luZ3VsYXIgc3R5bGUvY2xhc3MgYmluZGluZ3MgKHRoaW5ncyBsaWtlIGBbc3R5bGUucHJvcF1gIGFuZCBgW2NsYXNzLm5hbWVdYClcbiAgICAgICAgLy8gTVVTVCBiZSByZWdpc3RlcmVkIG9uIGEgZ2l2ZW4gZWxlbWVudCB3aXRoaW4gdGhlIGNvbXBvbmVudC9kaXJlY3RpdmVcbiAgICAgICAgLy8gdGVtcGxhdGVGbi9ob3N0QmluZGluZ3NGbiBmdW5jdGlvbnMuIFRoZSBpbnN0cnVjdGlvbiBiZWxvdyB3aWxsIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gd2hhdCBhbGwgdGhlIGJpbmRpbmdzIGFyZSBhbmQgdGhlbiBnZW5lcmF0ZSB0aGUgc3RhdGVtZW50cyByZXF1aXJlZCB0byByZWdpc3RlclxuICAgICAgICAvLyB0aG9zZSBiaW5kaW5ncyB0byB0aGUgZWxlbWVudCB2aWEgYGVsZW1lbnRTdHlsaW5nYC5cbiAgICAgICAgdmFyIGVsZW1lbnRTdHlsaW5nSW5zdHJ1Y3Rpb24gPSBzdHlsZUJ1aWxkZXIuYnVpbGRFbGVtZW50U3R5bGluZ0luc3RydWN0aW9uKG51bGwsIGNvbnN0YW50UG9vbCk7XG4gICAgICAgIGlmIChlbGVtZW50U3R5bGluZ0luc3RydWN0aW9uKSB7XG4gICAgICAgICAgICBjcmVhdGVTdGF0ZW1lbnRzLnB1c2goY3JlYXRlU3R5bGluZ1N0bXQoZWxlbWVudFN0eWxpbmdJbnN0cnVjdGlvbiwgYmluZGluZ0NvbnRleHQsIGJpbmRpbmdGbikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmFsbHkgZWFjaCBiaW5kaW5nIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIG5lZWQgdG8gYmUgYWRkZWQgdG9cbiAgICAgICAgLy8gdGhlIHVwZGF0ZSBibG9jayBvZiBhIGNvbXBvbmVudC9kaXJlY3RpdmUgdGVtcGxhdGVGbi9ob3N0QmluZGluZ3NGbiBzbyB0aGF0IHRoZSBiaW5kaW5nc1xuICAgICAgICAvLyBhcmUgZXZhbHVhdGVkIGFuZCB1cGRhdGVkIGZvciB0aGUgZWxlbWVudC5cbiAgICAgICAgc3R5bGVCdWlsZGVyLmJ1aWxkVXBkYXRlTGV2ZWxJbnN0cnVjdGlvbnMoZ2V0VmFsdWVDb252ZXJ0ZXIoKSkuZm9yRWFjaChmdW5jdGlvbiAoaW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlbWVudHMucHVzaChjcmVhdGVTdHlsaW5nU3RtdChpbnN0cnVjdGlvbiwgYmluZGluZ0NvbnRleHQsIGJpbmRpbmdGbikpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRvdGFsSG9zdFZhcnNDb3VudCkge1xuICAgICAgICBjcmVhdGVTdGF0ZW1lbnRzLnVuc2hpZnQoaW1wb3J0RXhwcihJZGVudGlmaWVycyQxLmFsbG9jSG9zdFZhcnMpLmNhbGxGbihbbGl0ZXJhbCh0b3RhbEhvc3RWYXJzQ291bnQpXSkudG9TdG10KCkpO1xuICAgIH1cbiAgICBpZiAoY3JlYXRlU3RhdGVtZW50cy5sZW5ndGggPiAwIHx8IHVwZGF0ZVN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgaG9zdEJpbmRpbmdzRm5OYW1lID0gbWV0YS5uYW1lID8gbWV0YS5uYW1lICsgXCJfSG9zdEJpbmRpbmdzXCIgOiBudWxsO1xuICAgICAgICB2YXIgc3RhdGVtZW50cyA9IFtdO1xuICAgICAgICBpZiAoY3JlYXRlU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2gocmVuZGVyRmxhZ0NoZWNrSWZTdG10KDEgLyogQ3JlYXRlICovLCBjcmVhdGVTdGF0ZW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZVN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3RhdGVtZW50cy5wdXNoKHJlbmRlckZsYWdDaGVja0lmU3RtdCgyIC8qIFVwZGF0ZSAqLywgdXBkYXRlU3RhdGVtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbihbXG4gICAgICAgICAgICBuZXcgRm5QYXJhbShSRU5ERVJfRkxBR1MsIE5VTUJFUl9UWVBFKSwgbmV3IEZuUGFyYW0oQ09OVEVYVF9OQU1FLCBudWxsKSxcbiAgICAgICAgICAgIG5ldyBGblBhcmFtKGVsVmFyRXhwLm5hbWUsIE5VTUJFUl9UWVBFKVxuICAgICAgICBdLCBzdGF0ZW1lbnRzLCBJTkZFUlJFRF9UWVBFLCBudWxsLCBob3N0QmluZGluZ3NGbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGJpbmRpbmdGbihpbXBsaWNpdCwgdmFsdWUpIHtcbiAgICByZXR1cm4gY29udmVydFByb3BlcnR5QmluZGluZyhudWxsLCBpbXBsaWNpdCwgdmFsdWUsICdiJywgQmluZGluZ0Zvcm0uVHJ5U2ltcGxlLCBmdW5jdGlvbiAoKSB7IHJldHVybiBlcnJvcignVW5leHBlY3RlZCBpbnRlcnBvbGF0aW9uJyk7IH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlU3R5bGluZ1N0bXQoaW5zdHJ1Y3Rpb24sIGJpbmRpbmdDb250ZXh0LCBiaW5kaW5nRm4pIHtcbiAgICB2YXIgcGFyYW1zID0gaW5zdHJ1Y3Rpb24uYnVpbGRQYXJhbXMoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBiaW5kaW5nRm4oYmluZGluZ0NvbnRleHQsIHZhbHVlKS5jdXJyVmFsRXhwcjsgfSk7XG4gICAgcmV0dXJuIGltcG9ydEV4cHIoaW5zdHJ1Y3Rpb24ucmVmZXJlbmNlLCBudWxsLCBpbnN0cnVjdGlvbi5zb3VyY2VTcGFuKVxuICAgICAgICAuY2FsbEZuKHBhcmFtcywgaW5zdHJ1Y3Rpb24uc291cmNlU3BhbilcbiAgICAgICAgLnRvU3RtdCgpO1xufVxuZnVuY3Rpb24gZ2V0QmluZGluZ05hbWVBbmRJbnN0cnVjdGlvbihiaW5kaW5nKSB7XG4gICAgdmFyIGJpbmRpbmdOYW1lID0gYmluZGluZy5uYW1lO1xuICAgIHZhciBpbnN0cnVjdGlvbjtcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBhdHRyIGJpbmRpbmcgb3IgYSBwcm9wZXJ0eSBiaW5kaW5nXG4gICAgdmFyIGF0dHJNYXRjaGVzID0gYmluZGluZ05hbWUubWF0Y2goQVRUUl9SRUdFWCk7XG4gICAgaWYgKGF0dHJNYXRjaGVzKSB7XG4gICAgICAgIGJpbmRpbmdOYW1lID0gYXR0ck1hdGNoZXNbMV07XG4gICAgICAgIGluc3RydWN0aW9uID0gSWRlbnRpZmllcnMkMS5lbGVtZW50QXR0cmlidXRlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGJpbmRpbmcuaXNBbmltYXRpb24pIHtcbiAgICAgICAgICAgIGJpbmRpbmdOYW1lID0gcHJlcGFyZVN5bnRoZXRpY1Byb3BlcnR5TmFtZShiaW5kaW5nTmFtZSk7XG4gICAgICAgICAgICAvLyBob3N0IGJpbmRpbmdzIHRoYXQgaGF2ZSBhIHN5bnRoZXRpYyBwcm9wZXJ0eSAoZS5nLiBAZm9vKSBzaG91bGQgYWx3YXlzIGJlIHJlbmRlcmVkXG4gICAgICAgICAgICAvLyBpbiB0aGUgY29udGV4dCBvZiB0aGUgY29tcG9uZW50IGFuZCBub3QgdGhlIHBhcmVudC4gVGhlcmVmb3JlIHRoZXJlIGlzIGEgc3BlY2lhbFxuICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eSBpbnN0cnVjdGlvbiBhdmFpbGFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgICAgIGluc3RydWN0aW9uID0gSWRlbnRpZmllcnMkMS5jb21wb25lbnRIb3N0U3ludGhldGljUHJvcGVydHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnN0cnVjdGlvbiA9IElkZW50aWZpZXJzJDEucHJvcGVydHk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYmluZGluZ05hbWU6IGJpbmRpbmdOYW1lLCBpbnN0cnVjdGlvbjogaW5zdHJ1Y3Rpb24sIGlzQXR0cmlidXRlOiAhIWF0dHJNYXRjaGVzIH07XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0TGlzdGVuZXJzKGV2ZW50QmluZGluZ3MsIG1ldGEpIHtcbiAgICByZXR1cm4gZXZlbnRCaW5kaW5ncy5tYXAoZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgdmFyIGJpbmRpbmdOYW1lID0gYmluZGluZy5uYW1lICYmIHNhbml0aXplSWRlbnRpZmllcihiaW5kaW5nLm5hbWUpO1xuICAgICAgICB2YXIgYmluZGluZ0ZuTmFtZSA9IGJpbmRpbmcudHlwZSA9PT0gMSAvKiBBbmltYXRpb24gKi8gP1xuICAgICAgICAgICAgcHJlcGFyZVN5bnRoZXRpY0xpc3RlbmVyRnVuY3Rpb25OYW1lKGJpbmRpbmdOYW1lLCBiaW5kaW5nLnRhcmdldE9yUGhhc2UpIDpcbiAgICAgICAgICAgIGJpbmRpbmdOYW1lO1xuICAgICAgICB2YXIgaGFuZGxlck5hbWUgPSBtZXRhLm5hbWUgJiYgYmluZGluZ05hbWUgPyBtZXRhLm5hbWUgKyBcIl9cIiArIGJpbmRpbmdGbk5hbWUgKyBcIl9Ib3N0QmluZGluZ0hhbmRsZXJcIiA6IG51bGw7XG4gICAgICAgIHZhciBwYXJhbXMgPSBwcmVwYXJlRXZlbnRMaXN0ZW5lclBhcmFtZXRlcnMoQm91bmRFdmVudC5mcm9tUGFyc2VkRXZlbnQoYmluZGluZyksIGhhbmRsZXJOYW1lKTtcbiAgICAgICAgdmFyIGluc3RydWN0aW9uID0gYmluZGluZy50eXBlID09IDEgLyogQW5pbWF0aW9uICovID8gSWRlbnRpZmllcnMkMS5jb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXIgOiBJZGVudGlmaWVycyQxLmxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihpbnN0cnVjdGlvbikuY2FsbEZuKHBhcmFtcykudG9TdG10KCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBtZXRhZGF0YUFzU3VtbWFyeShtZXRhKSB7XG4gICAgLy8gY2xhbmctZm9ybWF0IG9mZlxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQmluZGluZ1BhcnNlciwgd2hpY2ggb25seSBkZWFscyB3aXRoIGxpc3RlbmVycyBhbmQgcHJvcGVydGllcy4gVGhlcmUncyBub1xuICAgICAgICAvLyBuZWVkIHRvIHBhc3MgYXR0cmlidXRlcyB0byBpdC5cbiAgICAgICAgaG9zdEF0dHJpYnV0ZXM6IHt9LFxuICAgICAgICBob3N0TGlzdGVuZXJzOiBtZXRhLmhvc3QubGlzdGVuZXJzLFxuICAgICAgICBob3N0UHJvcGVydGllczogbWV0YS5ob3N0LnByb3BlcnRpZXMsXG4gICAgfTtcbiAgICAvLyBjbGFuZy1mb3JtYXQgb25cbn1cbmZ1bmN0aW9uIHR5cGVNYXBUb0V4cHJlc3Npb25NYXAobWFwLCBvdXRwdXRDdHgpIHtcbiAgICAvLyBDb252ZXJ0IGVhY2ggbWFwIGVudHJ5IGludG8gYW5vdGhlciBlbnRyeSB3aGVyZSB0aGUgdmFsdWUgaXMgYW4gZXhwcmVzc2lvbiBpbXBvcnRpbmcgdGhlIHR5cGUuXG4gICAgdmFyIGVudHJpZXMgPSBBcnJheS5mcm9tKG1hcCkubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICB2YXIgX2IgPSBfX3JlYWQoX2EsIDIpLCBrZXkgPSBfYlswXSwgdHlwZSA9IF9iWzFdO1xuICAgICAgICByZXR1cm4gW2tleSwgb3V0cHV0Q3R4LmltcG9ydEV4cHIodHlwZSldO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXcgTWFwKGVudHJpZXMpO1xufVxudmFyIEhPU1RfUkVHX0VYUCQxID0gL14oPzpcXFsoW15cXF1dKylcXF0pfCg/OlxcKChbXlxcKV0rKVxcKSkkLztcbmZ1bmN0aW9uIHBhcnNlSG9zdEJpbmRpbmdzKGhvc3QpIHtcbiAgICB2YXIgZV80LCBfYTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuICAgIHZhciBsaXN0ZW5lcnMgPSB7fTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHt9O1xuICAgIHZhciBzcGVjaWFsQXR0cmlidXRlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXMoaG9zdCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gX2MudmFsdWU7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBob3N0W2tleV07XG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGtleS5tYXRjaChIT1NUX1JFR19FWFAkMSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhhbHhodWIpOiBtYWtlIHRoaXMgYSBkaWFnbm9zdGljLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGJpbmRpbmcgbXVzdCBiZSBzdHJpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsQXR0cmlidXRlcy5jbGFzc0F0dHIgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHlsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYWx4aHViKTogbWFrZSB0aGlzIGEgZGlhZ25vc3RpYy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSBiaW5kaW5nIG11c3QgYmUgc3RyaW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEF0dHJpYnV0ZXMuc3R5bGVBdHRyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1trZXldID0gbGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXRjaGVzWzEgLyogQmluZGluZyAqL10gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYWx4aHViKTogbWFrZSB0aGlzIGEgZGlhZ25vc3RpYy5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvcGVydHkgYmluZGluZyBtdXN0IGJlIHN0cmluZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc3ludGhldGljIHByb3BlcnRpZXMgKHRoZSBvbmVzIHRoYXQgaGF2ZSBhIGBAYCBhcyBhIHByZWZpeClcbiAgICAgICAgICAgICAgICAvLyBhcmUgc3RpbGwgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIHByb3BlcnRpZXMuIFRoZXJlZm9yZVxuICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHBvaW50IGluIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIG1hcC5cbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW21hdGNoZXNbMSAvKiBCaW5kaW5nICovXV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoZXNbMiAvKiBFdmVudCAqL10gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYWx4aHViKTogbWFrZSB0aGlzIGEgZGlhZ25vc3RpYy5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXZlbnQgYmluZGluZyBtdXN0IGJlIHN0cmluZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzW21hdGNoZXNbMiAvKiBFdmVudCAqL11dID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfNF8xKSB7IGVfNCA9IHsgZXJyb3I6IGVfNF8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiB7IGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsIGxpc3RlbmVyczogbGlzdGVuZXJzLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBzcGVjaWFsQXR0cmlidXRlczogc3BlY2lhbEF0dHJpYnV0ZXMgfTtcbn1cbi8qKlxuICogVmVyaWZpZXMgaG9zdCBiaW5kaW5ncyBhbmQgcmV0dXJucyB0aGUgbGlzdCBvZiBlcnJvcnMgKGlmIGFueSkuIEVtcHR5IGFycmF5IGluZGljYXRlcyB0aGF0IGFcbiAqIGdpdmVuIHNldCBvZiBob3N0IGJpbmRpbmdzIGhhcyBubyBlcnJvcnMuXG4gKlxuICogQHBhcmFtIGJpbmRpbmdzIHNldCBvZiBob3N0IGJpbmRpbmdzIHRvIHZlcmlmeS5cbiAqIEBwYXJhbSBzb3VyY2VTcGFuIHNvdXJjZSBzcGFuIHdoZXJlIGhvc3QgYmluZGluZ3Mgd2VyZSBkZWZpbmVkLlxuICogQHJldHVybnMgYXJyYXkgb2YgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHNldCBvZiBob3N0IGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiB2ZXJpZnlIb3N0QmluZGluZ3MoYmluZGluZ3MsIHNvdXJjZVNwYW4pIHtcbiAgICB2YXIgc3VtbWFyeSA9IG1ldGFkYXRhQXNTdW1tYXJ5KHsgaG9zdDogYmluZGluZ3MgfSk7XG4gICAgLy8gVE9ETzogYWJzdHJhY3Qgb3V0IGhvc3QgYmluZGluZ3MgdmVyaWZpY2F0aW9uIGxvZ2ljIGFuZCB1c2UgaXQgaW5zdGVhZCBvZlxuICAgIC8vIGNyZWF0aW5nIGV2ZW50cyBhbmQgcHJvcGVydGllcyBBU1RzIHRvIGRldGVjdCBlcnJvcnMgKEZXLTk5NilcbiAgICB2YXIgYmluZGluZ1BhcnNlciA9IG1ha2VCaW5kaW5nUGFyc2VyKCk7XG4gICAgYmluZGluZ1BhcnNlci5jcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzKHN1bW1hcnksIHNvdXJjZVNwYW4pO1xuICAgIGJpbmRpbmdQYXJzZXIuY3JlYXRlQm91bmRIb3N0UHJvcGVydGllcyhzdW1tYXJ5LCBzb3VyY2VTcGFuKTtcbiAgICByZXR1cm4gYmluZGluZ1BhcnNlci5lcnJvcnM7XG59XG5mdW5jdGlvbiBjb21waWxlU3R5bGVzKHN0eWxlcywgc2VsZWN0b3IsIGhvc3RTZWxlY3Rvcikge1xuICAgIHZhciBzaGFkb3dDc3MgPSBuZXcgU2hhZG93Q3NzKCk7XG4gICAgcmV0dXJuIHN0eWxlcy5tYXAoZnVuY3Rpb24gKHN0eWxlKSB7IHJldHVybiBzaGFkb3dDc3Muc2hpbUNzc1RleHQoc3R5bGUsIHNlbGVjdG9yLCBob3N0U2VsZWN0b3IpOyB9KTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgZG9jdW1lbnRzIGJ5IFVSTCB0aGF0IHRoZSBjb21waWxlciB1c2VzXG4gKiB0byBsb2FkIHRlbXBsYXRlcy5cbiAqL1xudmFyIFJlc291cmNlTG9hZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlc291cmNlTG9hZGVyKCkge1xuICAgIH1cbiAgICBSZXNvdXJjZUxvYWRlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gJyc7IH07XG4gICAgcmV0dXJuIFJlc291cmNlTG9hZGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIENvbXBpbGVyRmFjYWRlSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlckZhY2FkZUltcGwoaml0RXZhbHVhdG9yKSB7XG4gICAgICAgIGlmIChqaXRFdmFsdWF0b3IgPT09IHZvaWQgMCkgeyBqaXRFdmFsdWF0b3IgPSBuZXcgSml0RXZhbHVhdG9yKCk7IH1cbiAgICAgICAgdGhpcy5qaXRFdmFsdWF0b3IgPSBqaXRFdmFsdWF0b3I7XG4gICAgICAgIHRoaXMuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlID0gUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlO1xuICAgICAgICB0aGlzLlJlc291cmNlTG9hZGVyID0gUmVzb3VyY2VMb2FkZXI7XG4gICAgICAgIHRoaXMuZWxlbWVudFNjaGVtYVJlZ2lzdHJ5ID0gbmV3IERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpO1xuICAgIH1cbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNvbXBpbGVQaXBlID0gZnVuY3Rpb24gKGFuZ3VsYXJDb3JlRW52LCBzb3VyY2VNYXBVcmwsIGZhY2FkZSkge1xuICAgICAgICB2YXIgcmVzID0gY29tcGlsZVBpcGVGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgICAgbmFtZTogZmFjYWRlLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBuZXcgV3JhcHBlZE5vZGVFeHByKGZhY2FkZS50eXBlKSxcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudENvdW50OiBmYWNhZGUudHlwZUFyZ3VtZW50Q291bnQsXG4gICAgICAgICAgICBkZXBzOiBjb252ZXJ0UjNEZXBlbmRlbmN5TWV0YWRhdGFBcnJheShmYWNhZGUuZGVwcyksXG4gICAgICAgICAgICBwaXBlTmFtZTogZmFjYWRlLnBpcGVOYW1lLFxuICAgICAgICAgICAgcHVyZTogZmFjYWRlLnB1cmUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5qaXRFeHByZXNzaW9uKHJlcy5leHByZXNzaW9uLCBhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCByZXMuc3RhdGVtZW50cyk7XG4gICAgfTtcbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNvbXBpbGVJbmplY3RhYmxlID0gZnVuY3Rpb24gKGFuZ3VsYXJDb3JlRW52LCBzb3VyY2VNYXBVcmwsIGZhY2FkZSkge1xuICAgICAgICB2YXIgX2EgPSBjb21waWxlSW5qZWN0YWJsZSh7XG4gICAgICAgICAgICBuYW1lOiBmYWNhZGUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBXcmFwcGVkTm9kZUV4cHIoZmFjYWRlLnR5cGUpLFxuICAgICAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IGZhY2FkZS50eXBlQXJndW1lbnRDb3VudCxcbiAgICAgICAgICAgIHByb3ZpZGVkSW46IGNvbXB1dGVQcm92aWRlZEluKGZhY2FkZS5wcm92aWRlZEluKSxcbiAgICAgICAgICAgIHVzZUNsYXNzOiB3cmFwRXhwcmVzc2lvbihmYWNhZGUsIFVTRV9DTEFTUyksXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiB3cmFwRXhwcmVzc2lvbihmYWNhZGUsIFVTRV9GQUNUT1JZKSxcbiAgICAgICAgICAgIHVzZVZhbHVlOiB3cmFwRXhwcmVzc2lvbihmYWNhZGUsIFVTRV9WQUxVRSksXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogd3JhcEV4cHJlc3Npb24oZmFjYWRlLCBVU0VfRVhJU1RJTkcpLFxuICAgICAgICAgICAgY3RvckRlcHM6IGNvbnZlcnRSM0RlcGVuZGVuY3lNZXRhZGF0YUFycmF5KGZhY2FkZS5jdG9yRGVwcyksXG4gICAgICAgICAgICB1c2VyRGVwczogY29udmVydFIzRGVwZW5kZW5jeU1ldGFkYXRhQXJyYXkoZmFjYWRlLnVzZXJEZXBzKSB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pLCBleHByZXNzaW9uID0gX2EuZXhwcmVzc2lvbiwgc3RhdGVtZW50cyA9IF9hLnN0YXRlbWVudHM7XG4gICAgICAgIHJldHVybiB0aGlzLmppdEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgYW5ndWxhckNvcmVFbnYsIHNvdXJjZU1hcFVybCwgc3RhdGVtZW50cyk7XG4gICAgfTtcbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNvbXBpbGVJbmplY3RvciA9IGZ1bmN0aW9uIChhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCBmYWNhZGUpIHtcbiAgICAgICAgdmFyIG1ldGEgPSB7XG4gICAgICAgICAgICBuYW1lOiBmYWNhZGUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IG5ldyBXcmFwcGVkTm9kZUV4cHIoZmFjYWRlLnR5cGUpLFxuICAgICAgICAgICAgZGVwczogY29udmVydFIzRGVwZW5kZW5jeU1ldGFkYXRhQXJyYXkoZmFjYWRlLmRlcHMpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBuZXcgV3JhcHBlZE5vZGVFeHByKGZhY2FkZS5wcm92aWRlcnMpLFxuICAgICAgICAgICAgaW1wb3J0czogZmFjYWRlLmltcG9ydHMubWFwKGZ1bmN0aW9uIChpKSB7IHJldHVybiBuZXcgV3JhcHBlZE5vZGVFeHByKGkpOyB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHJlcyA9IGNvbXBpbGVJbmplY3RvcihtZXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaml0RXhwcmVzc2lvbihyZXMuZXhwcmVzc2lvbiwgYW5ndWxhckNvcmVFbnYsIHNvdXJjZU1hcFVybCwgcmVzLnN0YXRlbWVudHMpO1xuICAgIH07XG4gICAgQ29tcGlsZXJGYWNhZGVJbXBsLnByb3RvdHlwZS5jb21waWxlTmdNb2R1bGUgPSBmdW5jdGlvbiAoYW5ndWxhckNvcmVFbnYsIHNvdXJjZU1hcFVybCwgZmFjYWRlKSB7XG4gICAgICAgIHZhciBtZXRhID0ge1xuICAgICAgICAgICAgdHlwZTogbmV3IFdyYXBwZWROb2RlRXhwcihmYWNhZGUudHlwZSksXG4gICAgICAgICAgICBib290c3RyYXA6IGZhY2FkZS5ib290c3RyYXAubWFwKHdyYXBSZWZlcmVuY2UpLFxuICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBmYWNhZGUuZGVjbGFyYXRpb25zLm1hcCh3cmFwUmVmZXJlbmNlKSxcbiAgICAgICAgICAgIGltcG9ydHM6IGZhY2FkZS5pbXBvcnRzLm1hcCh3cmFwUmVmZXJlbmNlKSxcbiAgICAgICAgICAgIGV4cG9ydHM6IGZhY2FkZS5leHBvcnRzLm1hcCh3cmFwUmVmZXJlbmNlKSxcbiAgICAgICAgICAgIGVtaXRJbmxpbmU6IHRydWUsXG4gICAgICAgICAgICBjb250YWluc0ZvcndhcmREZWNsczogZmFsc2UsXG4gICAgICAgICAgICBzY2hlbWFzOiBmYWNhZGUuc2NoZW1hcyA/IGZhY2FkZS5zY2hlbWFzLm1hcCh3cmFwUmVmZXJlbmNlKSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIHZhciByZXMgPSBjb21waWxlTmdNb2R1bGUobWV0YSk7XG4gICAgICAgIHJldHVybiB0aGlzLmppdEV4cHJlc3Npb24ocmVzLmV4cHJlc3Npb24sIGFuZ3VsYXJDb3JlRW52LCBzb3VyY2VNYXBVcmwsIFtdKTtcbiAgICB9O1xuICAgIENvbXBpbGVyRmFjYWRlSW1wbC5wcm90b3R5cGUuY29tcGlsZURpcmVjdGl2ZSA9IGZ1bmN0aW9uIChhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCBmYWNhZGUpIHtcbiAgICAgICAgdmFyIGNvbnN0YW50UG9vbCA9IG5ldyBDb25zdGFudFBvb2woKTtcbiAgICAgICAgdmFyIGJpbmRpbmdQYXJzZXIgPSBtYWtlQmluZGluZ1BhcnNlcigpO1xuICAgICAgICB2YXIgbWV0YSA9IGNvbnZlcnREaXJlY3RpdmVGYWNhZGVUb01ldGFkYXRhKGZhY2FkZSk7XG4gICAgICAgIHZhciByZXMgPSBjb21waWxlRGlyZWN0aXZlRnJvbU1ldGFkYXRhKG1ldGEsIGNvbnN0YW50UG9vbCwgYmluZGluZ1BhcnNlcik7XG4gICAgICAgIHZhciBwcmVTdGF0ZW1lbnRzID0gX19zcHJlYWQoY29uc3RhbnRQb29sLnN0YXRlbWVudHMsIHJlcy5zdGF0ZW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaml0RXhwcmVzc2lvbihyZXMuZXhwcmVzc2lvbiwgYW5ndWxhckNvcmVFbnYsIHNvdXJjZU1hcFVybCwgcHJlU3RhdGVtZW50cyk7XG4gICAgfTtcbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNvbXBpbGVDb21wb25lbnQgPSBmdW5jdGlvbiAoYW5ndWxhckNvcmVFbnYsIHNvdXJjZU1hcFVybCwgZmFjYWRlKSB7XG4gICAgICAgIC8vIFRoZSBDb25zdGFudFBvb2wgaXMgYSByZXF1aXJlbWVudCBvZiB0aGUgSklUJ2VyLlxuICAgICAgICB2YXIgY29uc3RhbnRQb29sID0gbmV3IENvbnN0YW50UG9vbCgpO1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IGZhY2FkZS5pbnRlcnBvbGF0aW9uID9cbiAgICAgICAgICAgIEludGVycG9sYXRpb25Db25maWcuZnJvbUFycmF5KGZhY2FkZS5pbnRlcnBvbGF0aW9uKSA6XG4gICAgICAgICAgICBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHO1xuICAgICAgICAvLyBQYXJzZSB0aGUgdGVtcGxhdGUgYW5kIGNoZWNrIGZvciBlcnJvcnMuXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IHBhcnNlVGVtcGxhdGUoZmFjYWRlLnRlbXBsYXRlLCBzb3VyY2VNYXBVcmwsIHsgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFjYWRlLnByZXNlcnZlV2hpdGVzcGFjZXMsIGludGVycG9sYXRpb25Db25maWc6IGludGVycG9sYXRpb25Db25maWcgfSk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5lcnJvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIGVycm9ycyA9IHRlbXBsYXRlLmVycm9ycy5tYXAoZnVuY3Rpb24gKGVycikgeyByZXR1cm4gZXJyLnRvU3RyaW5nKCk7IH0pLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvcnMgZHVyaW5nIEpJVCBjb21waWxhdGlvbiBvZiB0ZW1wbGF0ZSBmb3IgXCIgKyBmYWNhZGUubmFtZSArIFwiOiBcIiArIGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcGlsZSB0aGUgY29tcG9uZW50IG1ldGFkYXRhLCBpbmNsdWRpbmcgdGVtcGxhdGUsIGludG8gYW4gZXhwcmVzc2lvbi5cbiAgICAgICAgLy8gVE9ETyhhbHhodWIpOiBpbXBsZW1lbnQgaW5wdXRzLCBvdXRwdXRzLCBxdWVyaWVzLCBldGMuXG4gICAgICAgIHZhciByZXMgPSBjb21waWxlQ29tcG9uZW50RnJvbU1ldGFkYXRhKF9fYXNzaWduKHt9LCBmYWNhZGUsIGNvbnZlcnREaXJlY3RpdmVGYWNhZGVUb01ldGFkYXRhKGZhY2FkZSksIHsgc2VsZWN0b3I6IGZhY2FkZS5zZWxlY3RvciB8fCB0aGlzLmVsZW1lbnRTY2hlbWFSZWdpc3RyeS5nZXREZWZhdWx0Q29tcG9uZW50RWxlbWVudE5hbWUoKSwgdGVtcGxhdGU6IHRlbXBsYXRlLCB3cmFwRGlyZWN0aXZlc0FuZFBpcGVzSW5DbG9zdXJlOiBmYWxzZSwgc3R5bGVzOiBmYWNhZGUuc3R5bGVzIHx8IFtdLCBlbmNhcHN1bGF0aW9uOiBmYWNhZGUuZW5jYXBzdWxhdGlvbiwgaW50ZXJwb2xhdGlvbjogaW50ZXJwb2xhdGlvbkNvbmZpZywgY2hhbmdlRGV0ZWN0aW9uOiBmYWNhZGUuY2hhbmdlRGV0ZWN0aW9uLCBhbmltYXRpb25zOiBmYWNhZGUuYW5pbWF0aW9ucyAhPSBudWxsID8gbmV3IFdyYXBwZWROb2RlRXhwcihmYWNhZGUuYW5pbWF0aW9ucykgOiBudWxsLCB2aWV3UHJvdmlkZXJzOiBmYWNhZGUudmlld1Byb3ZpZGVycyAhPSBudWxsID8gbmV3IFdyYXBwZWROb2RlRXhwcihmYWNhZGUudmlld1Byb3ZpZGVycykgOlxuICAgICAgICAgICAgICAgIG51bGwsIHJlbGF0aXZlQ29udGV4dEZpbGVQYXRoOiAnJywgaTE4blVzZUV4dGVybmFsSWRzOiB0cnVlIH0pLCBjb25zdGFudFBvb2wsIG1ha2VCaW5kaW5nUGFyc2VyKGludGVycG9sYXRpb25Db25maWcpKTtcbiAgICAgICAgdmFyIHByZVN0YXRlbWVudHMgPSBfX3NwcmVhZChjb25zdGFudFBvb2wuc3RhdGVtZW50cywgcmVzLnN0YXRlbWVudHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5qaXRFeHByZXNzaW9uKHJlcy5leHByZXNzaW9uLCBhbmd1bGFyQ29yZUVudiwgXCJuZzovLy9cIiArIGZhY2FkZS5uYW1lICsgXCIuanNcIiwgcHJlU3RhdGVtZW50cyk7XG4gICAgfTtcbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNvbXBpbGVCYXNlID0gZnVuY3Rpb24gKGFuZ3VsYXJDb3JlRW52LCBzb3VyY2VNYXBVcmwsIGZhY2FkZSkge1xuICAgICAgICB2YXIgY29uc3RhbnRQb29sID0gbmV3IENvbnN0YW50UG9vbCgpO1xuICAgICAgICB2YXIgbWV0YSA9IF9fYXNzaWduKHt9LCBmYWNhZGUsIHsgdmlld1F1ZXJpZXM6IGZhY2FkZS52aWV3UXVlcmllcyA/IGZhY2FkZS52aWV3UXVlcmllcy5tYXAoY29udmVydFRvUjNRdWVyeU1ldGFkYXRhKSA6XG4gICAgICAgICAgICAgICAgZmFjYWRlLnZpZXdRdWVyaWVzLCBxdWVyaWVzOiBmYWNhZGUucXVlcmllcyA/IGZhY2FkZS5xdWVyaWVzLm1hcChjb252ZXJ0VG9SM1F1ZXJ5TWV0YWRhdGEpIDogZmFjYWRlLnF1ZXJpZXMgfSk7XG4gICAgICAgIHZhciByZXMgPSBjb21waWxlQmFzZURlZkZyb21NZXRhZGF0YShtZXRhLCBjb25zdGFudFBvb2wpO1xuICAgICAgICByZXR1cm4gdGhpcy5qaXRFeHByZXNzaW9uKHJlcy5leHByZXNzaW9uLCBhbmd1bGFyQ29yZUVudiwgc291cmNlTWFwVXJsLCBjb25zdGFudFBvb2wuc3RhdGVtZW50cyk7XG4gICAgfTtcbiAgICBDb21waWxlckZhY2FkZUltcGwucHJvdG90eXBlLmNyZWF0ZVBhcnNlU291cmNlU3BhbiA9IGZ1bmN0aW9uIChraW5kLCB0eXBlTmFtZSwgc291cmNlVXJsKSB7XG4gICAgICAgIHJldHVybiByM0ppdFR5cGVTb3VyY2VTcGFuKGtpbmQsIHR5cGVOYW1lLCBzb3VyY2VVcmwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSklUIGNvbXBpbGVzIGFuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhhdCBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlZiB0aGUgZGVmaW5pdGlvbiB3aGljaCB3aWxsIGJlIGNvbXBpbGVkIGFuZCBleGVjdXRlZCB0byBnZXQgdGhlIHZhbHVlIHRvIHBhdGNoXG4gICAgICogQHBhcmFtIGNvbnRleHQgYW4gb2JqZWN0IG1hcCBvZiBAYW5ndWxhci9jb3JlIHN5bWJvbCBuYW1lcyB0byBzeW1ib2xzIHdoaWNoIHdpbGwgYmUgYXZhaWxhYmxlXG4gICAgICogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAgICAgKiBAcGFyYW0gc291cmNlVXJsIGEgVVJMIHRvIHVzZSBmb3IgdGhlIHNvdXJjZSBtYXAgb2YgdGhlIGNvbXBpbGVkIGV4cHJlc3Npb25cbiAgICAgKiBAcGFyYW0gcHJlU3RhdGVtZW50cyBhIGNvbGxlY3Rpb24gb2Ygc3RhdGVtZW50cyB0aGF0IHNob3VsZCBiZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIENvbXBpbGVyRmFjYWRlSW1wbC5wcm90b3R5cGUuaml0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChkZWYsIGNvbnRleHQsIHNvdXJjZVVybCwgcHJlU3RhdGVtZW50cykge1xuICAgICAgICAvLyBUaGUgQ29uc3RhbnRQb29sIG1heSBjb250YWluIFN0YXRlbWVudHMgd2hpY2ggZGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZmluYWwgZXhwcmVzc2lvbi5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCBpdHMgc3RhdGVtZW50cyBuZWVkIHRvIHByZWNlZGUgdGhlIGFjdHVhbCBKSVQgb3BlcmF0aW9uLiBUaGUgZmluYWwgc3RhdGVtZW50IGlzIGFcbiAgICAgICAgLy8gZGVjbGFyYXRpb24gb2YgJGRlZiB3aGljaCBpcyBzZXQgdG8gdGhlIGV4cHJlc3Npb24gYmVpbmcgY29tcGlsZWQuXG4gICAgICAgIHZhciBzdGF0ZW1lbnRzID0gX19zcHJlYWQocHJlU3RhdGVtZW50cywgW1xuICAgICAgICAgICAgbmV3IERlY2xhcmVWYXJTdG10KCckZGVmJywgZGVmLCB1bmRlZmluZWQsIFtTdG10TW9kaWZpZXIuRXhwb3J0ZWRdKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmppdEV2YWx1YXRvci5ldmFsdWF0ZVN0YXRlbWVudHMoc291cmNlVXJsLCBzdGF0ZW1lbnRzLCBuZXcgUjNKaXRSZWZsZWN0b3IoY29udGV4dCksIC8qIGVuYWJsZVNvdXJjZU1hcHMgKi8gdHJ1ZSk7XG4gICAgICAgIHJldHVybiByZXNbJyRkZWYnXTtcbiAgICB9O1xuICAgIHJldHVybiBDb21waWxlckZhY2FkZUltcGw7XG59KCkpO1xudmFyIFVTRV9DTEFTUyA9IE9iamVjdC5rZXlzKHsgdXNlQ2xhc3M6IG51bGwgfSlbMF07XG52YXIgVVNFX0ZBQ1RPUlkgPSBPYmplY3Qua2V5cyh7IHVzZUZhY3Rvcnk6IG51bGwgfSlbMF07XG52YXIgVVNFX1ZBTFVFID0gT2JqZWN0LmtleXMoeyB1c2VWYWx1ZTogbnVsbCB9KVswXTtcbnZhciBVU0VfRVhJU1RJTkcgPSBPYmplY3Qua2V5cyh7IHVzZUV4aXN0aW5nOiBudWxsIH0pWzBdO1xudmFyIHdyYXBSZWZlcmVuY2UgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgd3JhcHBlZCA9IG5ldyBXcmFwcGVkTm9kZUV4cHIodmFsdWUpO1xuICAgIHJldHVybiB7IHZhbHVlOiB3cmFwcGVkLCB0eXBlOiB3cmFwcGVkIH07XG59O1xuZnVuY3Rpb24gY29udmVydFRvUjNRdWVyeU1ldGFkYXRhKGZhY2FkZSkge1xuICAgIHJldHVybiBfX2Fzc2lnbih7fSwgZmFjYWRlLCB7IHByZWRpY2F0ZTogQXJyYXkuaXNBcnJheShmYWNhZGUucHJlZGljYXRlKSA/IGZhY2FkZS5wcmVkaWNhdGUgOlxuICAgICAgICAgICAgbmV3IFdyYXBwZWROb2RlRXhwcihmYWNhZGUucHJlZGljYXRlKSwgcmVhZDogZmFjYWRlLnJlYWQgPyBuZXcgV3JhcHBlZE5vZGVFeHByKGZhY2FkZS5yZWFkKSA6IG51bGwsIHN0YXRpYzogZmFjYWRlLnN0YXRpYyB9KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnREaXJlY3RpdmVGYWNhZGVUb01ldGFkYXRhKGZhY2FkZSkge1xuICAgIHZhciBpbnB1dHNGcm9tTWV0YWRhdGEgPSBwYXJzZUlucHV0T3V0cHV0cyhmYWNhZGUuaW5wdXRzIHx8IFtdKTtcbiAgICB2YXIgb3V0cHV0c0Zyb21NZXRhZGF0YSA9IHBhcnNlSW5wdXRPdXRwdXRzKGZhY2FkZS5vdXRwdXRzIHx8IFtdKTtcbiAgICB2YXIgcHJvcE1ldGFkYXRhID0gZmFjYWRlLnByb3BNZXRhZGF0YTtcbiAgICB2YXIgaW5wdXRzRnJvbVR5cGUgPSB7fTtcbiAgICB2YXIgb3V0cHV0c0Zyb21UeXBlID0ge307XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgaWYgKHByb3BNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YVtmaWVsZF0uZm9yRWFjaChmdW5jdGlvbiAoYW5uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzSW5wdXQoYW5uKSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHNGcm9tVHlwZVtmaWVsZF0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgYW5uLmJpbmRpbmdQcm9wZXJ0eU5hbWUgPyBbYW5uLmJpbmRpbmdQcm9wZXJ0eU5hbWUsIGZpZWxkXSA6IGZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc091dHB1dChhbm4pKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHNGcm9tVHlwZVtmaWVsZF0gPSBhbm4uYmluZGluZ1Byb3BlcnR5TmFtZSB8fCBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgZmllbGQgaW4gcHJvcE1ldGFkYXRhKSB7XG4gICAgICAgIF9sb29wXzEoZmllbGQpO1xuICAgIH1cbiAgICByZXR1cm4gX19hc3NpZ24oe30sIGZhY2FkZSwgeyB0eXBlU291cmNlU3BhbjogZmFjYWRlLnR5cGVTb3VyY2VTcGFuLCB0eXBlOiBuZXcgV3JhcHBlZE5vZGVFeHByKGZhY2FkZS50eXBlKSwgZGVwczogY29udmVydFIzRGVwZW5kZW5jeU1ldGFkYXRhQXJyYXkoZmFjYWRlLmRlcHMpLCBob3N0OiBleHRyYWN0SG9zdEJpbmRpbmdzKGZhY2FkZS5ob3N0LCBmYWNhZGUucHJvcE1ldGFkYXRhLCBmYWNhZGUudHlwZVNvdXJjZVNwYW4pLCBpbnB1dHM6IF9fYXNzaWduKHt9LCBpbnB1dHNGcm9tTWV0YWRhdGEsIGlucHV0c0Zyb21UeXBlKSwgb3V0cHV0czogX19hc3NpZ24oe30sIG91dHB1dHNGcm9tTWV0YWRhdGEsIG91dHB1dHNGcm9tVHlwZSksIHF1ZXJpZXM6IGZhY2FkZS5xdWVyaWVzLm1hcChjb252ZXJ0VG9SM1F1ZXJ5TWV0YWRhdGEpLCBwcm92aWRlcnM6IGZhY2FkZS5wcm92aWRlcnMgIT0gbnVsbCA/IG5ldyBXcmFwcGVkTm9kZUV4cHIoZmFjYWRlLnByb3ZpZGVycykgOiBudWxsLCB2aWV3UXVlcmllczogZmFjYWRlLnZpZXdRdWVyaWVzLm1hcChjb252ZXJ0VG9SM1F1ZXJ5TWV0YWRhdGEpIH0pO1xufVxuZnVuY3Rpb24gd3JhcEV4cHJlc3Npb24ob2JqLCBwcm9wZXJ0eSkge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE5vZGVFeHByKG9ialtwcm9wZXJ0eV0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlUHJvdmlkZWRJbihwcm92aWRlZEluKSB7XG4gICAgaWYgKHByb3ZpZGVkSW4gPT0gbnVsbCB8fCB0eXBlb2YgcHJvdmlkZWRJbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsRXhwcihwcm92aWRlZEluKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE5vZGVFeHByKHByb3ZpZGVkSW4pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRSM0RlcGVuZGVuY3lNZXRhZGF0YShmYWNhZGUpIHtcbiAgICB2YXIgdG9rZW5FeHByO1xuICAgIGlmIChmYWNhZGUudG9rZW4gPT09IG51bGwpIHtcbiAgICAgICAgdG9rZW5FeHByID0gbmV3IExpdGVyYWxFeHByKG51bGwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmYWNhZGUucmVzb2x2ZWQgPT09IFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5BdHRyaWJ1dGUpIHtcbiAgICAgICAgdG9rZW5FeHByID0gbmV3IExpdGVyYWxFeHByKGZhY2FkZS50b2tlbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0b2tlbkV4cHIgPSBuZXcgV3JhcHBlZE5vZGVFeHByKGZhY2FkZS50b2tlbik7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuOiB0b2tlbkV4cHIsXG4gICAgICAgIHJlc29sdmVkOiBmYWNhZGUucmVzb2x2ZWQsXG4gICAgICAgIGhvc3Q6IGZhY2FkZS5ob3N0LFxuICAgICAgICBvcHRpb25hbDogZmFjYWRlLm9wdGlvbmFsLFxuICAgICAgICBzZWxmOiBmYWNhZGUuc2VsZixcbiAgICAgICAgc2tpcFNlbGY6IGZhY2FkZS5za2lwU2VsZlxuICAgIH07XG59XG5mdW5jdGlvbiBjb252ZXJ0UjNEZXBlbmRlbmN5TWV0YWRhdGFBcnJheShmYWNhZGVzKSB7XG4gICAgcmV0dXJuIGZhY2FkZXMgPT0gbnVsbCA/IG51bGwgOiBmYWNhZGVzLm1hcChjb252ZXJ0UjNEZXBlbmRlbmN5TWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gZXh0cmFjdEhvc3RCaW5kaW5ncyhob3N0LCBwcm9wTWV0YWRhdGEsIHNvdXJjZVNwYW4pIHtcbiAgICAvLyBGaXJzdCBwYXJzZSB0aGUgZGVjbGFyYXRpb25zIGZyb20gdGhlIG1ldGFkYXRhLlxuICAgIHZhciBiaW5kaW5ncyA9IHBhcnNlSG9zdEJpbmRpbmdzKGhvc3QgfHwge30pO1xuICAgIC8vIEFmdGVyIHRoYXQgY2hlY2sgaG9zdCBiaW5kaW5ncyBmb3IgZXJyb3JzXG4gICAgdmFyIGVycm9ycyA9IHZlcmlmeUhvc3RCaW5kaW5ncyhiaW5kaW5ncywgc291cmNlU3Bhbik7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9ycy5tYXAoZnVuY3Rpb24gKGVycm9yKSB7IHJldHVybiBlcnJvci5tc2c7IH0pLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgaWYgKHByb3BNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YVtmaWVsZF0uZm9yRWFjaChmdW5jdGlvbiAoYW5uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzSG9zdEJpbmRpbmcoYW5uKSkge1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncy5wcm9wZXJ0aWVzW2Fubi5ob3N0UHJvcGVydHlOYW1lIHx8IGZpZWxkXSA9IGZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0hvc3RMaXN0ZW5lcihhbm4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzLmxpc3RlbmVyc1thbm4uZXZlbnROYW1lIHx8IGZpZWxkXSA9IGZpZWxkICsgXCIoXCIgKyAoYW5uLmFyZ3MgfHwgW10pLmpvaW4oJywnKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBOZXh0LCBsb29wIG92ZXIgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCwgbG9va2luZyBmb3IgQEhvc3RCaW5kaW5nIGFuZCBASG9zdExpc3RlbmVyLlxuICAgIGZvciAodmFyIGZpZWxkIGluIHByb3BNZXRhZGF0YSkge1xuICAgICAgICBfbG9vcF8yKGZpZWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRpbmdzO1xufVxuZnVuY3Rpb24gaXNIb3N0QmluZGluZyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5uZ01ldGFkYXRhTmFtZSA9PT0gJ0hvc3RCaW5kaW5nJztcbn1cbmZ1bmN0aW9uIGlzSG9zdExpc3RlbmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLm5nTWV0YWRhdGFOYW1lID09PSAnSG9zdExpc3RlbmVyJztcbn1cbmZ1bmN0aW9uIGlzSW5wdXQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUubmdNZXRhZGF0YU5hbWUgPT09ICdJbnB1dCc7XG59XG5mdW5jdGlvbiBpc091dHB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5uZ01ldGFkYXRhTmFtZSA9PT0gJ091dHB1dCc7XG59XG5mdW5jdGlvbiBwYXJzZUlucHV0T3V0cHV0cyh2YWx1ZXMpIHtcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZShmdW5jdGlvbiAobWFwLCB2YWx1ZSkge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQodmFsdWUuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKHBpZWNlKSB7IHJldHVybiBwaWVjZS50cmltKCk7IH0pLCAyKSwgZmllbGQgPSBfYVswXSwgcHJvcGVydHkgPSBfYVsxXTtcbiAgICAgICAgbWFwW2ZpZWxkXSA9IHByb3BlcnR5IHx8IGZpZWxkO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIHB1Ymxpc2hGYWNhZGUoZ2xvYmFsKSB7XG4gICAgdmFyIG5nID0gZ2xvYmFsLm5nIHx8IChnbG9iYWwubmcgPSB7fSk7XG4gICAgbmcuybVjb21waWxlckZhY2FkZSA9IG5ldyBDb21waWxlckZhY2FkZUltcGwoKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFZFUlNJT04kMSA9IG5ldyBWZXJzaW9uKCc4LjAuMycpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQ29tcGlsZXJDb25maWcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZXJDb25maWcoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX2EgPT09IHZvaWQgMCA/IHt9IDogX2EsIF9jID0gX2IuZGVmYXVsdEVuY2Fwc3VsYXRpb24sIGRlZmF1bHRFbmNhcHN1bGF0aW9uID0gX2MgPT09IHZvaWQgMCA/IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkIDogX2MsIF9kID0gX2IudXNlSml0LCB1c2VKaXQgPSBfZCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9kLCBfZSA9IF9iLmppdERldk1vZGUsIGppdERldk1vZGUgPSBfZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfZSwgX2YgPSBfYi5taXNzaW5nVHJhbnNsYXRpb24sIG1pc3NpbmdUcmFuc2xhdGlvbiA9IF9mID09PSB2b2lkIDAgPyBudWxsIDogX2YsIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBfYi5wcmVzZXJ2ZVdoaXRlc3BhY2VzLCBzdHJpY3RJbmplY3Rpb25QYXJhbWV0ZXJzID0gX2Iuc3RyaWN0SW5qZWN0aW9uUGFyYW1ldGVycztcbiAgICAgICAgdGhpcy5kZWZhdWx0RW5jYXBzdWxhdGlvbiA9IGRlZmF1bHRFbmNhcHN1bGF0aW9uO1xuICAgICAgICB0aGlzLnVzZUppdCA9ICEhdXNlSml0O1xuICAgICAgICB0aGlzLmppdERldk1vZGUgPSAhIWppdERldk1vZGU7XG4gICAgICAgIHRoaXMubWlzc2luZ1RyYW5zbGF0aW9uID0gbWlzc2luZ1RyYW5zbGF0aW9uO1xuICAgICAgICB0aGlzLnByZXNlcnZlV2hpdGVzcGFjZXMgPSBwcmVzZXJ2ZVdoaXRlc3BhY2VzRGVmYXVsdChub1VuZGVmaW5lZChwcmVzZXJ2ZVdoaXRlc3BhY2VzKSk7XG4gICAgICAgIHRoaXMuc3RyaWN0SW5qZWN0aW9uUGFyYW1ldGVycyA9IHN0cmljdEluamVjdGlvblBhcmFtZXRlcnMgPT09IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBDb21waWxlckNvbmZpZztcbn0oKSk7XG5mdW5jdGlvbiBwcmVzZXJ2ZVdoaXRlc3BhY2VzRGVmYXVsdChwcmVzZXJ2ZVdoaXRlc3BhY2VzT3B0aW9uLCBkZWZhdWx0U2V0dGluZykge1xuICAgIGlmIChkZWZhdWx0U2V0dGluZyA9PT0gdm9pZCAwKSB7IGRlZmF1bHRTZXR0aW5nID0gZmFsc2U7IH1cbiAgICByZXR1cm4gcHJlc2VydmVXaGl0ZXNwYWNlc09wdGlvbiA9PT0gbnVsbCA/IGRlZmF1bHRTZXR0aW5nIDogcHJlc2VydmVXaGl0ZXNwYWNlc09wdGlvbjtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIERpcmVjdGl2ZU5vcm1hbGl6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlyZWN0aXZlTm9ybWFsaXplcihfcmVzb3VyY2VMb2FkZXIsIF91cmxSZXNvbHZlciwgX2h0bWxQYXJzZXIsIF9jb25maWcpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VMb2FkZXIgPSBfcmVzb3VyY2VMb2FkZXI7XG4gICAgICAgIHRoaXMuX3VybFJlc29sdmVyID0gX3VybFJlc29sdmVyO1xuICAgICAgICB0aGlzLl9odG1sUGFyc2VyID0gX2h0bWxQYXJzZXI7XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUuY2xlYXIoKTsgfTtcbiAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKG5vcm1hbGl6ZWREaXJlY3RpdmUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCFub3JtYWxpemVkRGlyZWN0aXZlLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRlbXBsYXRlID0gbm9ybWFsaXplZERpcmVjdGl2ZS50ZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VMb2FkZXJDYWNoZS5kZWxldGUodGVtcGxhdGUudGVtcGxhdGVVcmwpO1xuICAgICAgICB0ZW1wbGF0ZS5leHRlcm5hbFN0eWxlc2hlZXRzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlc2hlZXQpIHsgX3RoaXMuX3Jlc291cmNlTG9hZGVyQ2FjaGUuZGVsZXRlKHN0eWxlc2hlZXQubW9kdWxlVXJsKTsgfSk7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5fZmV0Y2ggPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9yZXNvdXJjZUxvYWRlckNhY2hlLmdldCh1cmwpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5fcmVzb3VyY2VMb2FkZXIuZ2V0KHVybCk7XG4gICAgICAgICAgICB0aGlzLl9yZXNvdXJjZUxvYWRlckNhY2hlLnNldCh1cmwsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLm5vcm1hbGl6ZVRlbXBsYXRlID0gZnVuY3Rpb24gKHByZW5vcm1EYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChpc0RlZmluZWQocHJlbm9ybURhdGEudGVtcGxhdGUpKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHByZW5vcm1EYXRhLnRlbXBsYXRlVXJsKSkge1xuICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKFwiJ1wiICsgc3RyaW5naWZ5KHByZW5vcm1EYXRhLmNvbXBvbmVudFR5cGUpICsgXCInIGNvbXBvbmVudCBjYW5ub3QgZGVmaW5lIGJvdGggdGVtcGxhdGUgYW5kIHRlbXBsYXRlVXJsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmVub3JtRGF0YS50ZW1wbGF0ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcihcIlRoZSB0ZW1wbGF0ZSBzcGVjaWZpZWQgZm9yIGNvbXBvbmVudCBcIiArIHN0cmluZ2lmeShwcmVub3JtRGF0YS5jb21wb25lbnRUeXBlKSArIFwiIGlzIG5vdCBhIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RlZmluZWQocHJlbm9ybURhdGEudGVtcGxhdGVVcmwpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByZW5vcm1EYXRhLnRlbXBsYXRlVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKFwiVGhlIHRlbXBsYXRlVXJsIHNwZWNpZmllZCBmb3IgY29tcG9uZW50IFwiICsgc3RyaW5naWZ5KHByZW5vcm1EYXRhLmNvbXBvbmVudFR5cGUpICsgXCIgaXMgbm90IGEgc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoXCJObyB0ZW1wbGF0ZSBzcGVjaWZpZWQgZm9yIGNvbXBvbmVudCBcIiArIHN0cmluZ2lmeShwcmVub3JtRGF0YS5jb21wb25lbnRUeXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRGVmaW5lZChwcmVub3JtRGF0YS5wcmVzZXJ2ZVdoaXRlc3BhY2VzKSAmJlxuICAgICAgICAgICAgdHlwZW9mIHByZW5vcm1EYXRhLnByZXNlcnZlV2hpdGVzcGFjZXMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoXCJUaGUgcHJlc2VydmVXaGl0ZXNwYWNlcyBvcHRpb24gZm9yIGNvbXBvbmVudCBcIiArIHN0cmluZ2lmeShwcmVub3JtRGF0YS5jb21wb25lbnRUeXBlKSArIFwiIG11c3QgYmUgYSBib29sZWFuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMudGhlbih0aGlzLl9wcmVQYXJzZVRlbXBsYXRlKHByZW5vcm1EYXRhKSwgZnVuY3Rpb24gKHByZXBhcnNlZFRlbXBsYXRlKSB7IHJldHVybiBfdGhpcy5fbm9ybWFsaXplVGVtcGxhdGVNZXRhZGF0YShwcmVub3JtRGF0YSwgcHJlcGFyc2VkVGVtcGxhdGUpOyB9KTtcbiAgICB9O1xuICAgIERpcmVjdGl2ZU5vcm1hbGl6ZXIucHJvdG90eXBlLl9wcmVQYXJzZVRlbXBsYXRlID0gZnVuY3Rpb24gKHByZW5vbURhdGEpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHRlbXBsYXRlO1xuICAgICAgICB2YXIgdGVtcGxhdGVVcmw7XG4gICAgICAgIGlmIChwcmVub21EYXRhLnRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gcHJlbm9tRGF0YS50ZW1wbGF0ZTtcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsID0gcHJlbm9tRGF0YS5tb2R1bGVVcmw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA9IHRoaXMuX3VybFJlc29sdmVyLnJlc29sdmUocHJlbm9tRGF0YS5tb2R1bGVVcmwsIHByZW5vbURhdGEudGVtcGxhdGVVcmwpO1xuICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLl9mZXRjaCh0ZW1wbGF0ZVVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN5bmNBc3luYy50aGVuKHRlbXBsYXRlLCBmdW5jdGlvbiAodGVtcGxhdGUpIHsgcmV0dXJuIF90aGlzLl9wcmVwYXJzZUxvYWRlZFRlbXBsYXRlKHByZW5vbURhdGEsIHRlbXBsYXRlLCB0ZW1wbGF0ZVVybCk7IH0pO1xuICAgIH07XG4gICAgRGlyZWN0aXZlTm9ybWFsaXplci5wcm90b3R5cGUuX3ByZXBhcnNlTG9hZGVkVGVtcGxhdGUgPSBmdW5jdGlvbiAocHJlbm9ybURhdGEsIHRlbXBsYXRlLCB0ZW1wbGF0ZUFic1VybCkge1xuICAgICAgICB2YXIgaXNJbmxpbmUgPSAhIXByZW5vcm1EYXRhLnRlbXBsYXRlO1xuICAgICAgICB2YXIgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IEludGVycG9sYXRpb25Db25maWcuZnJvbUFycmF5KHByZW5vcm1EYXRhLmludGVycG9sYXRpb24pO1xuICAgICAgICB2YXIgdGVtcGxhdGVVcmwgPSB0ZW1wbGF0ZVNvdXJjZVVybCh7IHJlZmVyZW5jZTogcHJlbm9ybURhdGEubmdNb2R1bGVUeXBlIH0sIHsgdHlwZTogeyByZWZlcmVuY2U6IHByZW5vcm1EYXRhLmNvbXBvbmVudFR5cGUgfSB9LCB7IGlzSW5saW5lOiBpc0lubGluZSwgdGVtcGxhdGVVcmw6IHRlbXBsYXRlQWJzVXJsIH0pO1xuICAgICAgICB2YXIgcm9vdE5vZGVzQW5kRXJyb3JzID0gdGhpcy5faHRtbFBhcnNlci5wYXJzZSh0ZW1wbGF0ZSwgdGVtcGxhdGVVcmwsIHsgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSwgaW50ZXJwb2xhdGlvbkNvbmZpZzogaW50ZXJwb2xhdGlvbkNvbmZpZyB9KTtcbiAgICAgICAgaWYgKHJvb3ROb2Rlc0FuZEVycm9ycy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGVycm9yU3RyaW5nID0gcm9vdE5vZGVzQW5kRXJyb3JzLmVycm9ycy5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIHRocm93IHN5bnRheEVycm9yKFwiVGVtcGxhdGUgcGFyc2UgZXJyb3JzOlxcblwiICsgZXJyb3JTdHJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0ZW1wbGF0ZU1ldGFkYXRhU3R5bGVzID0gdGhpcy5fbm9ybWFsaXplU3R5bGVzaGVldChuZXcgQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSh7IHN0eWxlczogcHJlbm9ybURhdGEuc3R5bGVzLCBtb2R1bGVVcmw6IHByZW5vcm1EYXRhLm1vZHVsZVVybCB9KSk7XG4gICAgICAgIHZhciB2aXNpdG9yID0gbmV3IFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yKCk7XG4gICAgICAgIHZpc2l0QWxsJDEodmlzaXRvciwgcm9vdE5vZGVzQW5kRXJyb3JzLnJvb3ROb2Rlcyk7XG4gICAgICAgIHZhciB0ZW1wbGF0ZVN0eWxlcyA9IHRoaXMuX25vcm1hbGl6ZVN0eWxlc2hlZXQobmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBzdHlsZXM6IHZpc2l0b3Iuc3R5bGVzLCBzdHlsZVVybHM6IHZpc2l0b3Iuc3R5bGVVcmxzLCBtb2R1bGVVcmw6IHRlbXBsYXRlQWJzVXJsIH0pKTtcbiAgICAgICAgdmFyIHN0eWxlcyA9IHRlbXBsYXRlTWV0YWRhdGFTdHlsZXMuc3R5bGVzLmNvbmNhdCh0ZW1wbGF0ZVN0eWxlcy5zdHlsZXMpO1xuICAgICAgICB2YXIgaW5saW5lU3R5bGVVcmxzID0gdGVtcGxhdGVNZXRhZGF0YVN0eWxlcy5zdHlsZVVybHMuY29uY2F0KHRlbXBsYXRlU3R5bGVzLnN0eWxlVXJscyk7XG4gICAgICAgIHZhciBzdHlsZVVybHMgPSB0aGlzXG4gICAgICAgICAgICAuX25vcm1hbGl6ZVN0eWxlc2hlZXQobmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBzdHlsZVVybHM6IHByZW5vcm1EYXRhLnN0eWxlVXJscywgbW9kdWxlVXJsOiBwcmVub3JtRGF0YS5tb2R1bGVVcmwgfSkpXG4gICAgICAgICAgICAuc3R5bGVVcmxzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6IHRlbXBsYXRlQWJzVXJsLCBpc0lubGluZTogaXNJbmxpbmUsXG4gICAgICAgICAgICBodG1sQXN0OiByb290Tm9kZXNBbmRFcnJvcnMsIHN0eWxlczogc3R5bGVzLCBpbmxpbmVTdHlsZVVybHM6IGlubGluZVN0eWxlVXJscywgc3R5bGVVcmxzOiBzdHlsZVVybHMsXG4gICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IHZpc2l0b3IubmdDb250ZW50U2VsZWN0b3JzLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgRGlyZWN0aXZlTm9ybWFsaXplci5wcm90b3R5cGUuX25vcm1hbGl6ZVRlbXBsYXRlTWV0YWRhdGEgPSBmdW5jdGlvbiAocHJlbm9ybURhdGEsIHByZXBhcnNlZFRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMudGhlbih0aGlzLl9sb2FkTWlzc2luZ0V4dGVybmFsU3R5bGVzaGVldHMocHJlcGFyc2VkVGVtcGxhdGUuc3R5bGVVcmxzLmNvbmNhdChwcmVwYXJzZWRUZW1wbGF0ZS5pbmxpbmVTdHlsZVVybHMpKSwgZnVuY3Rpb24gKGV4dGVybmFsU3R5bGVzaGVldHMpIHsgcmV0dXJuIF90aGlzLl9ub3JtYWxpemVMb2FkZWRUZW1wbGF0ZU1ldGFkYXRhKHByZW5vcm1EYXRhLCBwcmVwYXJzZWRUZW1wbGF0ZSwgZXh0ZXJuYWxTdHlsZXNoZWV0cyk7IH0pO1xuICAgIH07XG4gICAgRGlyZWN0aXZlTm9ybWFsaXplci5wcm90b3R5cGUuX25vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlTWV0YWRhdGEgPSBmdW5jdGlvbiAocHJlbm9ybURhdGEsIHByZXBhcnNlZFRlbXBsYXRlLCBzdHlsZXNoZWV0cykge1xuICAgICAgICAvLyBBbGdvcml0aG06XG4gICAgICAgIC8vIC0gcHJvZHVjZSBleGFjdGx5IDEgZW50cnkgcGVyIG9yaWdpbmFsIHN0eWxlVXJsIGluXG4gICAgICAgIC8vIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLmV4dGVybmFsU3R5bGVzaGVldHMgd2l0aCBhbGwgc3R5bGVzIGlubGluZWRcbiAgICAgICAgLy8gLSBpbmxpbmUgYWxsIHN0eWxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSB0ZW1wbGF0ZSBpbnRvIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLnN0eWxlcy5cbiAgICAgICAgLy8gUmVhc29uOiBiZSBhYmxlIHRvIGRldGVybWluZSBob3cgbWFueSBzdHlsZXNoZWV0cyB0aGVyZSBhcmUgZXZlbiB3aXRob3V0IGxvYWRpbmdcbiAgICAgICAgLy8gdGhlIHRlbXBsYXRlIG5vciB0aGUgc3R5bGVzaGVldHMsIHNvIHdlIGNhbiBjcmVhdGUgYSBzdHViIGZvciBUeXBlU2NyaXB0IGFsd2F5cyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIChhcyByZXNvdXJjZSBsb2FkaW5nIG1heSBiZSBhc3luYylcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHN0eWxlcyA9IF9fc3ByZWFkKHByZXBhcnNlZFRlbXBsYXRlLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuX2lubGluZVN0eWxlcyhwcmVwYXJzZWRUZW1wbGF0ZS5pbmxpbmVTdHlsZVVybHMsIHN0eWxlc2hlZXRzLCBzdHlsZXMpO1xuICAgICAgICB2YXIgc3R5bGVVcmxzID0gcHJlcGFyc2VkVGVtcGxhdGUuc3R5bGVVcmxzO1xuICAgICAgICB2YXIgZXh0ZXJuYWxTdHlsZXNoZWV0cyA9IHN0eWxlVXJscy5tYXAoZnVuY3Rpb24gKHN0eWxlVXJsKSB7XG4gICAgICAgICAgICB2YXIgc3R5bGVzaGVldCA9IHN0eWxlc2hlZXRzLmdldChzdHlsZVVybCk7XG4gICAgICAgICAgICB2YXIgc3R5bGVzID0gX19zcHJlYWQoc3R5bGVzaGVldC5zdHlsZXMpO1xuICAgICAgICAgICAgX3RoaXMuX2lubGluZVN0eWxlcyhzdHlsZXNoZWV0LnN0eWxlVXJscywgc3R5bGVzaGVldHMsIHN0eWxlcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBtb2R1bGVVcmw6IHN0eWxlVXJsLCBzdHlsZXM6IHN0eWxlcyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBlbmNhcHN1bGF0aW9uID0gcHJlbm9ybURhdGEuZW5jYXBzdWxhdGlvbjtcbiAgICAgICAgaWYgKGVuY2Fwc3VsYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgZW5jYXBzdWxhdGlvbiA9IHRoaXMuX2NvbmZpZy5kZWZhdWx0RW5jYXBzdWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5jYXBzdWxhdGlvbiA9PT0gVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQgJiYgc3R5bGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgc3R5bGVVcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZW5jYXBzdWxhdGlvbiA9IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSh7XG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBlbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgdGVtcGxhdGU6IHByZXBhcnNlZFRlbXBsYXRlLnRlbXBsYXRlLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmw6IHByZXBhcnNlZFRlbXBsYXRlLnRlbXBsYXRlVXJsLFxuICAgICAgICAgICAgaHRtbEFzdDogcHJlcGFyc2VkVGVtcGxhdGUuaHRtbEFzdCwgc3R5bGVzOiBzdHlsZXMsIHN0eWxlVXJsczogc3R5bGVVcmxzLFxuICAgICAgICAgICAgbmdDb250ZW50U2VsZWN0b3JzOiBwcmVwYXJzZWRUZW1wbGF0ZS5uZ0NvbnRlbnRTZWxlY3RvcnMsXG4gICAgICAgICAgICBhbmltYXRpb25zOiBwcmVub3JtRGF0YS5hbmltYXRpb25zLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbjogcHJlbm9ybURhdGEuaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIGlzSW5saW5lOiBwcmVwYXJzZWRUZW1wbGF0ZS5pc0lubGluZSwgZXh0ZXJuYWxTdHlsZXNoZWV0czogZXh0ZXJuYWxTdHlsZXNoZWV0cyxcbiAgICAgICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IHByZXNlcnZlV2hpdGVzcGFjZXNEZWZhdWx0KHByZW5vcm1EYXRhLnByZXNlcnZlV2hpdGVzcGFjZXMsIHRoaXMuX2NvbmZpZy5wcmVzZXJ2ZVdoaXRlc3BhY2VzKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5faW5saW5lU3R5bGVzID0gZnVuY3Rpb24gKHN0eWxlVXJscywgc3R5bGVzaGVldHMsIHRhcmdldFN0eWxlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBzdHlsZVVybHMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVVcmwpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZXNoZWV0ID0gc3R5bGVzaGVldHMuZ2V0KHN0eWxlVXJsKTtcbiAgICAgICAgICAgIHN0eWxlc2hlZXQuc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7IHJldHVybiB0YXJnZXRTdHlsZXMucHVzaChzdHlsZSk7IH0pO1xuICAgICAgICAgICAgX3RoaXMuX2lubGluZVN0eWxlcyhzdHlsZXNoZWV0LnN0eWxlVXJscywgc3R5bGVzaGVldHMsIHRhcmdldFN0eWxlcyk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRGlyZWN0aXZlTm9ybWFsaXplci5wcm90b3R5cGUuX2xvYWRNaXNzaW5nRXh0ZXJuYWxTdHlsZXNoZWV0cyA9IGZ1bmN0aW9uIChzdHlsZVVybHMsIGxvYWRlZFN0eWxlc2hlZXRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChsb2FkZWRTdHlsZXNoZWV0cyA9PT0gdm9pZCAwKSB7IGxvYWRlZFN0eWxlc2hlZXRzID0gbmV3IE1hcCgpOyB9XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMudGhlbihTeW5jQXN5bmMuYWxsKHN0eWxlVXJscy5maWx0ZXIoZnVuY3Rpb24gKHN0eWxlVXJsKSB7IHJldHVybiAhbG9hZGVkU3R5bGVzaGVldHMuaGFzKHN0eWxlVXJsKTsgfSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHN0eWxlVXJsKSB7IHJldHVybiBTeW5jQXN5bmMudGhlbihfdGhpcy5fZmV0Y2goc3R5bGVVcmwpLCBmdW5jdGlvbiAobG9hZGVkU3R5bGUpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZXNoZWV0ID0gX3RoaXMuX25vcm1hbGl6ZVN0eWxlc2hlZXQobmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBzdHlsZXM6IFtsb2FkZWRTdHlsZV0sIG1vZHVsZVVybDogc3R5bGVVcmwgfSkpO1xuICAgICAgICAgICAgbG9hZGVkU3R5bGVzaGVldHMuc2V0KHN0eWxlVXJsLCBzdHlsZXNoZWV0KTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbG9hZE1pc3NpbmdFeHRlcm5hbFN0eWxlc2hlZXRzKHN0eWxlc2hlZXQuc3R5bGVVcmxzLCBsb2FkZWRTdHlsZXNoZWV0cyk7XG4gICAgICAgIH0pOyB9KSksIGZ1bmN0aW9uIChfKSB7IHJldHVybiBsb2FkZWRTdHlsZXNoZWV0czsgfSk7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVOb3JtYWxpemVyLnByb3RvdHlwZS5fbm9ybWFsaXplU3R5bGVzaGVldCA9IGZ1bmN0aW9uIChzdHlsZXNoZWV0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBtb2R1bGVVcmwgPSBzdHlsZXNoZWV0Lm1vZHVsZVVybDtcbiAgICAgICAgdmFyIGFsbFN0eWxlVXJscyA9IHN0eWxlc2hlZXQuc3R5bGVVcmxzLmZpbHRlcihpc1N0eWxlVXJsUmVzb2x2YWJsZSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gX3RoaXMuX3VybFJlc29sdmVyLnJlc29sdmUobW9kdWxlVXJsLCB1cmwpOyB9KTtcbiAgICAgICAgdmFyIGFsbFN0eWxlcyA9IHN0eWxlc2hlZXQuc3R5bGVzLm1hcChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHZhciBzdHlsZVdpdGhJbXBvcnRzID0gZXh0cmFjdFN0eWxlVXJscyhfdGhpcy5fdXJsUmVzb2x2ZXIsIG1vZHVsZVVybCwgc3R5bGUpO1xuICAgICAgICAgICAgYWxsU3R5bGVVcmxzLnB1c2guYXBwbHkoYWxsU3R5bGVVcmxzLCBfX3NwcmVhZChzdHlsZVdpdGhJbXBvcnRzLnN0eWxlVXJscykpO1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlV2l0aEltcG9ydHMuc3R5bGU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVTdHlsZXNoZWV0TWV0YWRhdGEoeyBzdHlsZXM6IGFsbFN0eWxlcywgc3R5bGVVcmxzOiBhbGxTdHlsZVVybHMsIG1vZHVsZVVybDogbW9kdWxlVXJsIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIERpcmVjdGl2ZU5vcm1hbGl6ZXI7XG59KCkpO1xudmFyIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yKCkge1xuICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9IFtdO1xuICAgICAgICB0aGlzLnN0eWxlcyA9IFtdO1xuICAgICAgICB0aGlzLnN0eWxlVXJscyA9IFtdO1xuICAgICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50ID0gMDtcbiAgICB9XG4gICAgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoYXN0KTtcbiAgICAgICAgc3dpdGNoIChwcmVwYXJzZWRFbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUHJlcGFyc2VkRWxlbWVudFR5cGUuTkdfQ09OVEVOVDpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycy5wdXNoKHByZXBhcnNlZEVsZW1lbnQuc2VsZWN0QXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRTpcbiAgICAgICAgICAgICAgICB2YXIgdGV4dENvbnRlbnRfMSA9ICcnO1xuICAgICAgICAgICAgICAgIGFzdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUZXh0JDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50XzEgKz0gY2hpbGQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlcy5wdXNoKHRleHRDb250ZW50XzEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUOlxuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGVVcmxzLnB1c2gocHJlcGFyc2VkRWxlbWVudC5ocmVmQXR0cik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgICBpZiAocHJlcGFyc2VkRWxlbWVudC5ub25CaW5kYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudC0tO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB2aXNpdEFsbCQxKHRoaXMsIGFzdC5jYXNlcyk7IH07XG4gICAgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCBhc3QuZXhwcmVzc2lvbik7XG4gICAgfTtcbiAgICBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgIFRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IHJldHVybiBudWxsOyB9O1xuICAgIHJldHVybiBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBRVUVSWV9NRVRBREFUQV9JREVOVElGSUVSUyA9IFtcbiAgICBjcmVhdGVWaWV3Q2hpbGQsXG4gICAgY3JlYXRlVmlld0NoaWxkcmVuLFxuICAgIGNyZWF0ZUNvbnRlbnRDaGlsZCxcbiAgICBjcmVhdGVDb250ZW50Q2hpbGRyZW4sXG5dO1xuLypcbiAqIFJlc29sdmUgYSBgVHlwZWAgZm9yIHtAbGluayBEaXJlY3RpdmV9LlxuICpcbiAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgdG8gY3JlYXRlIGN1c3RvbSBiZWhhdmlvci5cbiAqXG4gKiBTZWUge0BsaW5rIENvbXBpbGVyfVxuICovXG52YXIgRGlyZWN0aXZlUmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlyZWN0aXZlUmVzb2x2ZXIoX3JlZmxlY3Rvcikge1xuICAgICAgICB0aGlzLl9yZWZsZWN0b3IgPSBfcmVmbGVjdG9yO1xuICAgIH1cbiAgICBEaXJlY3RpdmVSZXNvbHZlci5wcm90b3R5cGUuaXNEaXJlY3RpdmUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgdHlwZU1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgcmV0dXJuIHR5cGVNZXRhZGF0YSAmJiB0eXBlTWV0YWRhdGEuc29tZShpc0RpcmVjdGl2ZU1ldGFkYXRhKTtcbiAgICB9O1xuICAgIERpcmVjdGl2ZVJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHR5cGUsIHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kID09PSB2b2lkIDApIHsgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgdHlwZU1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgaWYgKHR5cGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gZmluZExhc3QodHlwZU1ldGFkYXRhLCBpc0RpcmVjdGl2ZU1ldGFkYXRhKTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdG9yLnByb3BNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgICAgICAgICB2YXIgZ3VhcmRzID0gdGhpcy5fcmVmbGVjdG9yLmd1YXJkcyh0eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YShtZXRhZGF0YSwgcHJvcGVydHlNZXRhZGF0YSwgZ3VhcmRzLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBEaXJlY3RpdmUgYW5ub3RhdGlvbiBmb3VuZCBvbiBcIiArIHN0cmluZ2lmeSh0eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVSZXNvbHZlci5wcm90b3R5cGUuX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEgPSBmdW5jdGlvbiAoZG0sIHByb3BlcnR5TWV0YWRhdGEsIGd1YXJkcywgZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICB2YXIgaW5wdXRzID0gW107XG4gICAgICAgIHZhciBvdXRwdXRzID0gW107XG4gICAgICAgIHZhciBob3N0ID0ge307XG4gICAgICAgIHZhciBxdWVyaWVzID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnR5TWV0YWRhdGEpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBmaW5kTGFzdChwcm9wZXJ0eU1ldGFkYXRhW3Byb3BOYW1lXSwgZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGNyZWF0ZUlucHV0LmlzVHlwZU9mKGEpOyB9KTtcbiAgICAgICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5iaW5kaW5nUHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0cy5wdXNoKHByb3BOYW1lICsgXCI6IFwiICsgaW5wdXQuYmluZGluZ1Byb3BlcnR5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG91dHB1dCA9IGZpbmRMYXN0KHByb3BlcnR5TWV0YWRhdGFbcHJvcE5hbWVdLCBmdW5jdGlvbiAoYSkgeyByZXR1cm4gY3JlYXRlT3V0cHV0LmlzVHlwZU9mKGEpOyB9KTtcbiAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmJpbmRpbmdQcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHByb3BOYW1lICsgXCI6IFwiICsgb3V0cHV0LmJpbmRpbmdQcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaG9zdEJpbmRpbmdzID0gcHJvcGVydHlNZXRhZGF0YVtwcm9wTmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChhKSB7IHJldHVybiBjcmVhdGVIb3N0QmluZGluZy5pc1R5cGVPZihhKTsgfSk7XG4gICAgICAgICAgICBob3N0QmluZGluZ3MuZm9yRWFjaChmdW5jdGlvbiAoaG9zdEJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG9zdEJpbmRpbmcuaG9zdFByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRXaXRoID0gaG9zdEJpbmRpbmcuaG9zdFByb3BlcnR5TmFtZVswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0V2l0aCA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJASG9zdEJpbmRpbmcgY2FuIG5vdCBiaW5kIHRvIGV2ZW50cy4gVXNlIEBIb3N0TGlzdGVuZXIgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRXaXRoID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkBIb3N0QmluZGluZyBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgcHJvcGVydHkgbmFtZSwgJ2NsYXNzLjxuYW1lPicsIG9yICdhdHRyLjxuYW1lPicuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhvc3RbXCJbXCIgKyBob3N0QmluZGluZy5ob3N0UHJvcGVydHlOYW1lICsgXCJdXCJdID0gcHJvcE5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBob3N0W1wiW1wiICsgcHJvcE5hbWUgKyBcIl1cIl0gPSBwcm9wTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBob3N0TGlzdGVuZXJzID0gcHJvcGVydHlNZXRhZGF0YVtwcm9wTmFtZV0uZmlsdGVyKGZ1bmN0aW9uIChhKSB7IHJldHVybiBjcmVhdGVIb3N0TGlzdGVuZXIuaXNUeXBlT2YoYSk7IH0pO1xuICAgICAgICAgICAgaG9zdExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChob3N0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGhvc3RMaXN0ZW5lci5hcmdzIHx8IFtdO1xuICAgICAgICAgICAgICAgIGhvc3RbXCIoXCIgKyBob3N0TGlzdGVuZXIuZXZlbnROYW1lICsgXCIpXCJdID0gcHJvcE5hbWUgKyBcIihcIiArIGFyZ3Muam9pbignLCcpICsgXCIpXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBxdWVyeSA9IGZpbmRMYXN0KHByb3BlcnR5TWV0YWRhdGFbcHJvcE5hbWVdLCBmdW5jdGlvbiAoYSkgeyByZXR1cm4gUVVFUllfTUVUQURBVEFfSURFTlRJRklFUlMuc29tZShmdW5jdGlvbiAoaSkgeyByZXR1cm4gaS5pc1R5cGVPZihhKTsgfSk7IH0pO1xuICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcXVlcmllc1twcm9wTmFtZV0gPSBxdWVyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXJnZShkbSwgaW5wdXRzLCBvdXRwdXRzLCBob3N0LCBxdWVyaWVzLCBndWFyZHMsIGRpcmVjdGl2ZVR5cGUpO1xuICAgIH07XG4gICAgRGlyZWN0aXZlUmVzb2x2ZXIucHJvdG90eXBlLl9leHRyYWN0UHVibGljTmFtZSA9IGZ1bmN0aW9uIChkZWYpIHsgcmV0dXJuIHNwbGl0QXRDb2xvbihkZWYsIFtudWxsLCBkZWZdKVsxXS50cmltKCk7IH07XG4gICAgRGlyZWN0aXZlUmVzb2x2ZXIucHJvdG90eXBlLl9kZWR1cGVCaW5kaW5ncyA9IGZ1bmN0aW9uIChiaW5kaW5ncykge1xuICAgICAgICB2YXIgbmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHZhciBwdWJsaWNOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIHJldmVyc2VkUmVzdWx0ID0gW107XG4gICAgICAgIC8vIGdvIGxhc3QgdG8gZmlyc3QgdG8gYWxsb3cgbGF0ZXIgZW50cmllcyB0byBvdmVyd3JpdGUgcHJldmlvdXMgZW50cmllc1xuICAgICAgICBmb3IgKHZhciBpID0gYmluZGluZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBiaW5kaW5nID0gYmluZGluZ3NbaV07XG4gICAgICAgICAgICB2YXIgbmFtZV8xID0gdGhpcy5fZXh0cmFjdFB1YmxpY05hbWUoYmluZGluZyk7XG4gICAgICAgICAgICBwdWJsaWNOYW1lcy5hZGQobmFtZV8xKTtcbiAgICAgICAgICAgIGlmICghbmFtZXMuaGFzKG5hbWVfMSkpIHtcbiAgICAgICAgICAgICAgICBuYW1lcy5hZGQobmFtZV8xKTtcbiAgICAgICAgICAgICAgICByZXZlcnNlZFJlc3VsdC5wdXNoKGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXZlcnNlZFJlc3VsdC5yZXZlcnNlKCk7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVSZXNvbHZlci5wcm90b3R5cGUuX21lcmdlID0gZnVuY3Rpb24gKGRpcmVjdGl2ZSwgaW5wdXRzLCBvdXRwdXRzLCBob3N0LCBxdWVyaWVzLCBndWFyZHMsIGRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgdmFyIG1lcmdlZElucHV0cyA9IHRoaXMuX2RlZHVwZUJpbmRpbmdzKGRpcmVjdGl2ZS5pbnB1dHMgPyBkaXJlY3RpdmUuaW5wdXRzLmNvbmNhdChpbnB1dHMpIDogaW5wdXRzKTtcbiAgICAgICAgdmFyIG1lcmdlZE91dHB1dHMgPSB0aGlzLl9kZWR1cGVCaW5kaW5ncyhkaXJlY3RpdmUub3V0cHV0cyA/IGRpcmVjdGl2ZS5vdXRwdXRzLmNvbmNhdChvdXRwdXRzKSA6IG91dHB1dHMpO1xuICAgICAgICB2YXIgbWVyZ2VkSG9zdCA9IGRpcmVjdGl2ZS5ob3N0ID8gX19hc3NpZ24oe30sIGRpcmVjdGl2ZS5ob3N0LCBob3N0KSA6IGhvc3Q7XG4gICAgICAgIHZhciBtZXJnZWRRdWVyaWVzID0gZGlyZWN0aXZlLnF1ZXJpZXMgPyBfX2Fzc2lnbih7fSwgZGlyZWN0aXZlLnF1ZXJpZXMsIHF1ZXJpZXMpIDogcXVlcmllcztcbiAgICAgICAgaWYgKGNyZWF0ZUNvbXBvbmVudC5pc1R5cGVPZihkaXJlY3RpdmUpKSB7XG4gICAgICAgICAgICB2YXIgY29tcCA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb21wb25lbnQoe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBjb21wLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGlucHV0czogbWVyZ2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lcmdlZE91dHB1dHMsXG4gICAgICAgICAgICAgICAgaG9zdDogbWVyZ2VkSG9zdCxcbiAgICAgICAgICAgICAgICBleHBvcnRBczogY29tcC5leHBvcnRBcyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogY29tcC5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBxdWVyaWVzOiBtZXJnZWRRdWVyaWVzLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogY29tcC5jaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBjb21wLnByb3ZpZGVycyxcbiAgICAgICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiBjb21wLnZpZXdQcm92aWRlcnMsXG4gICAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBjb21wLmVudHJ5Q29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogY29tcC50ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogY29tcC50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IGNvbXAuc3R5bGVzLFxuICAgICAgICAgICAgICAgIHN0eWxlVXJsczogY29tcC5zdHlsZVVybHMsXG4gICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogY29tcC5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnM6IGNvbXAuYW5pbWF0aW9ucyxcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uOiBjb21wLmludGVycG9sYXRpb24sXG4gICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZGlyZWN0aXZlLnByZXNlcnZlV2hpdGVzcGFjZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEaXJlY3RpdmUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBkaXJlY3RpdmUuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiBtZXJnZWRJbnB1dHMsXG4gICAgICAgICAgICAgICAgb3V0cHV0czogbWVyZ2VkT3V0cHV0cyxcbiAgICAgICAgICAgICAgICBob3N0OiBtZXJnZWRIb3N0LFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiBkaXJlY3RpdmUuZXhwb3J0QXMsXG4gICAgICAgICAgICAgICAgcXVlcmllczogbWVyZ2VkUXVlcmllcyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IGRpcmVjdGl2ZS5wcm92aWRlcnMsIGd1YXJkczogZ3VhcmRzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIERpcmVjdGl2ZVJlc29sdmVyO1xufSgpKTtcbmZ1bmN0aW9uIGlzRGlyZWN0aXZlTWV0YWRhdGEodHlwZSkge1xuICAgIHJldHVybiBjcmVhdGVEaXJlY3RpdmUuaXNUeXBlT2YodHlwZSkgfHwgY3JlYXRlQ29tcG9uZW50LmlzVHlwZU9mKHR5cGUpO1xufVxuZnVuY3Rpb24gZmluZExhc3QoYXJyLCBjb25kaXRpb24pIHtcbiAgICBmb3IgKHZhciBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oYXJyW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFycltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBbiBpMThuIGVycm9yLlxuICovXG52YXIgSTE4bkVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhJMThuRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSTE4bkVycm9yKHNwYW4sIG1zZykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgc3BhbiwgbXNnKSB8fCB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gSTE4bkVycm9yO1xufShQYXJzZUVycm9yKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfSTE4Tl9BVFRSID0gJ2kxOG4nO1xudmFyIF9JMThOX0FUVFJfUFJFRklYID0gJ2kxOG4tJztcbnZhciBfSTE4Tl9DT01NRU5UX1BSRUZJWF9SRUdFWFAgPSAvXmkxOG46Py87XG52YXIgTUVBTklOR19TRVBBUkFUT1IgPSAnfCc7XG52YXIgSURfU0VQQVJBVE9SID0gJ0BAJztcbnZhciBpMThuQ29tbWVudHNXYXJuZWQgPSBmYWxzZTtcbi8qKlxuICogRXh0cmFjdCB0cmFuc2xhdGFibGUgbWVzc2FnZXMgZnJvbSBhbiBodG1sIEFTVFxuICovXG5mdW5jdGlvbiBleHRyYWN0TWVzc2FnZXMobm9kZXMsIGludGVycG9sYXRpb25Db25maWcsIGltcGxpY2l0VGFncywgaW1wbGljaXRBdHRycykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9WaXNpdG9yJDIoaW1wbGljaXRUYWdzLCBpbXBsaWNpdEF0dHJzKTtcbiAgICByZXR1cm4gdmlzaXRvci5leHRyYWN0KG5vZGVzLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbn1cbmZ1bmN0aW9uIG1lcmdlVHJhbnNsYXRpb25zKG5vZGVzLCB0cmFuc2xhdGlvbnMsIGludGVycG9sYXRpb25Db25maWcsIGltcGxpY2l0VGFncywgaW1wbGljaXRBdHRycykge1xuICAgIHZhciB2aXNpdG9yID0gbmV3IF9WaXNpdG9yJDIoaW1wbGljaXRUYWdzLCBpbXBsaWNpdEF0dHJzKTtcbiAgICByZXR1cm4gdmlzaXRvci5tZXJnZShub2RlcywgdHJhbnNsYXRpb25zLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbn1cbnZhciBFeHRyYWN0aW9uUmVzdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4dHJhY3Rpb25SZXN1bHQobWVzc2FnZXMsIGVycm9ycykge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICByZXR1cm4gRXh0cmFjdGlvblJlc3VsdDtcbn0oKSk7XG52YXIgX1Zpc2l0b3JNb2RlO1xuKGZ1bmN0aW9uIChfVmlzaXRvck1vZGUpIHtcbiAgICBfVmlzaXRvck1vZGVbX1Zpc2l0b3JNb2RlW1wiRXh0cmFjdFwiXSA9IDBdID0gXCJFeHRyYWN0XCI7XG4gICAgX1Zpc2l0b3JNb2RlW19WaXNpdG9yTW9kZVtcIk1lcmdlXCJdID0gMV0gPSBcIk1lcmdlXCI7XG59KShfVmlzaXRvck1vZGUgfHwgKF9WaXNpdG9yTW9kZSA9IHt9KSk7XG4vKipcbiAqIFRoaXMgVmlzaXRvciBpcyB1c2VkOlxuICogMS4gdG8gZXh0cmFjdCBhbGwgdGhlIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGZyb20gYW4gaHRtbCBBU1QgKHNlZSBgZXh0cmFjdCgpYCksXG4gKiAyLiB0byByZXBsYWNlIHRoZSB0cmFuc2xhdGFibGUgc3RyaW5ncyB3aXRoIHRoZSBhY3R1YWwgdHJhbnNsYXRpb25zIChzZWUgYG1lcmdlKClgKVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgX1Zpc2l0b3IkMiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfVmlzaXRvcihfaW1wbGljaXRUYWdzLCBfaW1wbGljaXRBdHRycykge1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFRhZ3MgPSBfaW1wbGljaXRUYWdzO1xuICAgICAgICB0aGlzLl9pbXBsaWNpdEF0dHJzID0gX2ltcGxpY2l0QXR0cnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSB0cmVlXG4gICAgICovXG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAobm9kZXMsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5faW5pdChfVmlzaXRvck1vZGUuRXh0cmFjdCwgaW50ZXJwb2xhdGlvbkNvbmZpZyk7XG4gICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMsIG51bGwpOyB9KTtcbiAgICAgICAgaWYgKHRoaXMuX2luSTE4bkJsb2NrKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSwgJ1VuY2xvc2VkIGJsb2NrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBFeHRyYWN0aW9uUmVzdWx0KHRoaXMuX21lc3NhZ2VzLCB0aGlzLl9lcnJvcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRyZWUgd2hlcmUgYWxsIHRyYW5zbGF0YWJsZSBub2RlcyBhcmUgdHJhbnNsYXRlZFxuICAgICAqL1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uIChub2RlcywgdHJhbnNsYXRpb25zLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuX2luaXQoX1Zpc2l0b3JNb2RlLk1lcmdlLCBpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zO1xuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzaW5nbGUgZmFrZSByb290IGVsZW1lbnRcbiAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgRWxlbWVudCQxKCd3cmFwcGVyJywgW10sIG5vZGVzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgdmFyIHRyYW5zbGF0ZWROb2RlID0gd3JhcHBlci52aXNpdCh0aGlzLCBudWxsKTtcbiAgICAgICAgaWYgKHRoaXMuX2luSTE4bkJsb2NrKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihub2Rlc1tub2Rlcy5sZW5ndGggLSAxXSwgJ1VuY2xvc2VkIGJsb2NrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVRyZWVSZXN1bHQodHJhbnNsYXRlZE5vZGUuY2hpbGRyZW4sIHRoaXMuX2Vycm9ycyk7XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGljdUNhc2UsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gUGFyc2UgY2FzZXMgZm9yIHRyYW5zbGF0YWJsZSBodG1sIGF0dHJpYnV0ZXNcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB2aXNpdEFsbCQxKHRoaXMsIGljdUNhc2UuZXhwcmVzc2lvbiwgY29udGV4dCk7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBfVmlzaXRvck1vZGUuTWVyZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwYW5zaW9uQ2FzZShpY3VDYXNlLnZhbHVlLCBleHByZXNzaW9uLCBpY3VDYXNlLnNvdXJjZVNwYW4sIGljdUNhc2UudmFsdWVTb3VyY2VTcGFuLCBpY3VDYXNlLmV4cFNvdXJjZVNwYW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX21heUJlQWRkQmxvY2tDaGlsZHJlbihpY3UpO1xuICAgICAgICB2YXIgd2FzSW5JY3UgPSB0aGlzLl9pbkljdTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbkljdSkge1xuICAgICAgICAgICAgLy8gbmVzdGVkIElDVSBtZXNzYWdlcyBzaG91bGQgbm90IGJlIGV4dHJhY3RlZCBidXQgdG9wLWxldmVsIHRyYW5zbGF0ZWQgYXMgYSB3aG9sZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTWVzc2FnZShbaWN1XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pbkljdSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhc2VzID0gdmlzaXRBbGwkMSh0aGlzLCBpY3UuY2FzZXMsIGNvbnRleHQpO1xuICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gX1Zpc2l0b3JNb2RlLk1lcmdlKSB7XG4gICAgICAgICAgICBpY3UgPSBuZXcgRXhwYW5zaW9uKGljdS5zd2l0Y2hWYWx1ZSwgaWN1LnR5cGUsIGNhc2VzLCBpY3Uuc291cmNlU3BhbiwgaWN1LnN3aXRjaFZhbHVlU291cmNlU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5JY3UgPSB3YXNJbkljdTtcbiAgICAgICAgcmV0dXJuIGljdTtcbiAgICB9O1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkge1xuICAgICAgICB2YXIgaXNPcGVuaW5nID0gX2lzT3BlbmluZ0NvbW1lbnQoY29tbWVudCk7XG4gICAgICAgIGlmIChpc09wZW5pbmcgJiYgdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGNvbW1lbnQsICdDb3VsZCBub3Qgc3RhcnQgYSBibG9jayBpbnNpZGUgYSB0cmFuc2xhdGFibGUgc2VjdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0Nsb3NpbmcgPSBfaXNDbG9zaW5nQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgaWYgKGlzQ2xvc2luZyAmJiAhdGhpcy5faW5JMThuQmxvY2spIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGNvbW1lbnQsICdUcnlpbmcgdG8gY2xvc2UgYW4gdW5vcGVuZWQgYmxvY2snKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2luSTE4bk5vZGUgJiYgIXRoaXMuX2luSWN1KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luSTE4bkJsb2NrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT3BlbmluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZXByZWNhdGVkIGZyb20gdjUgeW91IHNob3VsZCB1c2UgPG5nLWNvbnRhaW5lciBpMThuPiBpbnN0ZWFkIG9mIGkxOG4gY29tbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpMThuQ29tbWVudHNXYXJuZWQgJiYgY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5Db21tZW50c1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGV0YWlscyA9IGNvbW1lbnQuc291cmNlU3Bhbi5kZXRhaWxzID8gXCIsIFwiICsgY29tbWVudC5zb3VyY2VTcGFuLmRldGFpbHMgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8ob2NvbWJlKTogdXNlIGEgbG9nIHNlcnZpY2Ugb25jZSB0aGVyZSBpcyBhIHB1YmxpYyBvbmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJJMThuIGNvbW1lbnRzIGFyZSBkZXByZWNhdGVkLCB1c2UgYW4gPG5nLWNvbnRhaW5lcj4gZWxlbWVudCBpbnN0ZWFkIChcIiArIGNvbW1lbnQuc291cmNlU3Bhbi5zdGFydCArIGRldGFpbHMgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5JMThuQmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja1N0YXJ0RGVwdGggPSB0aGlzLl9kZXB0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmxvY2tDaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja01lYW5pbmdBbmREZXNjID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQudmFsdWUucmVwbGFjZShfSTE4Tl9DT01NRU5UX1BSRUZJWF9SRUdFWFAsICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29wZW5UcmFuc2xhdGFibGVTZWN0aW9uKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc0Nsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlcHRoID09IHRoaXMuX2Jsb2NrU3RhcnREZXB0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VUcmFuc2xhdGFibGVTZWN0aW9uKGNvbW1lbnQsIHRoaXMuX2Jsb2NrQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5JMThuQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5fYWRkTWVzc2FnZSh0aGlzLl9ibG9ja0NoaWxkcmVuLCB0aGlzLl9ibG9ja01lYW5pbmdBbmREZXNjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGF0dHJpYnV0ZXMgaW4gc2VjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IHRoaXMuX3RyYW5zbGF0ZU1lc3NhZ2UoY29tbWVudCwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRBbGwkMSh0aGlzLCBub2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihjb21tZW50LCAnSTE4TiBibG9ja3Mgc2hvdWxkIG5vdCBjcm9zcyBlbGVtZW50IGJvdW5kYXJpZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbWF5QmVBZGRCbG9ja0NoaWxkcmVuKHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9tYXlCZUFkZEJsb2NrQ2hpbGRyZW4oZWwpO1xuICAgICAgICB0aGlzLl9kZXB0aCsrO1xuICAgICAgICB2YXIgd2FzSW5JMThuTm9kZSA9IHRoaXMuX2luSTE4bk5vZGU7XG4gICAgICAgIHZhciB3YXNJbkltcGxpY2l0Tm9kZSA9IHRoaXMuX2luSW1wbGljaXROb2RlO1xuICAgICAgICB2YXIgY2hpbGROb2RlcyA9IFtdO1xuICAgICAgICB2YXIgdHJhbnNsYXRlZENoaWxkTm9kZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEV4dHJhY3Q6XG4gICAgICAgIC8vIC0gdG9wIGxldmVsIG5vZGVzIHdpdGggdGhlIChpbXBsaWNpdCkgXCJpMThuXCIgYXR0cmlidXRlIGlmIG5vdCBhbHJlYWR5IGluIGEgc2VjdGlvblxuICAgICAgICAvLyAtIElDVSBtZXNzYWdlc1xuICAgICAgICB2YXIgaTE4bkF0dHIgPSBfZ2V0STE4bkF0dHIoZWwpO1xuICAgICAgICB2YXIgaTE4bk1ldGEgPSBpMThuQXR0ciA/IGkxOG5BdHRyLnZhbHVlIDogJyc7XG4gICAgICAgIHZhciBpc0ltcGxpY2l0ID0gdGhpcy5faW1wbGljaXRUYWdzLnNvbWUoZnVuY3Rpb24gKHRhZykgeyByZXR1cm4gZWwubmFtZSA9PT0gdGFnOyB9KSAmJiAhdGhpcy5faW5JY3UgJiZcbiAgICAgICAgICAgICF0aGlzLl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvbjtcbiAgICAgICAgdmFyIGlzVG9wTGV2ZWxJbXBsaWNpdCA9ICF3YXNJbkltcGxpY2l0Tm9kZSAmJiBpc0ltcGxpY2l0O1xuICAgICAgICB0aGlzLl9pbkltcGxpY2l0Tm9kZSA9IHdhc0luSW1wbGljaXROb2RlIHx8IGlzSW1wbGljaXQ7XG4gICAgICAgIGlmICghdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24gJiYgIXRoaXMuX2luSWN1KSB7XG4gICAgICAgICAgICBpZiAoaTE4bkF0dHIgfHwgaXNUb3BMZXZlbEltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5JMThuTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLl9hZGRNZXNzYWdlKGVsLmNoaWxkcmVuLCBpMThuTWV0YSk7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlZENoaWxkTm9kZXMgPSB0aGlzLl90cmFuc2xhdGVNZXNzYWdlKGVsLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09IF9WaXNpdG9yTW9kZS5FeHRyYWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzVHJhbnNsYXRhYmxlID0gaTE4bkF0dHIgfHwgaXNUb3BMZXZlbEltcGxpY2l0O1xuICAgICAgICAgICAgICAgIGlmIChpc1RyYW5zbGF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlblRyYW5zbGF0YWJsZVNlY3Rpb24oZWwpO1xuICAgICAgICAgICAgICAgIHZpc2l0QWxsJDEodGhpcywgZWwuY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGlmIChpc1RyYW5zbGF0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VUcmFuc2xhdGFibGVTZWN0aW9uKGVsLCBlbC5jaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaTE4bkF0dHIgfHwgaXNUb3BMZXZlbEltcGxpY2l0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZWwsICdDb3VsZCBub3QgbWFyayBhbiBlbGVtZW50IGFzIHRyYW5zbGF0YWJsZSBpbnNpZGUgYSB0cmFuc2xhdGFibGUgc2VjdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT0gX1Zpc2l0b3JNb2RlLkV4dHJhY3QpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXNjZW5kIGludG8gY2hpbGQgbm9kZXMgZm9yIGV4dHJhY3Rpb25cbiAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW9kZSA9PT0gX1Zpc2l0b3JNb2RlLk1lcmdlKSB7XG4gICAgICAgICAgICB2YXIgdmlzaXROb2RlcyA9IHRyYW5zbGF0ZWRDaGlsZE5vZGVzIHx8IGVsLmNoaWxkcmVuO1xuICAgICAgICAgICAgdmlzaXROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciB2aXNpdGVkID0gY2hpbGQudmlzaXQoX3RoaXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkICYmICFfdGhpcy5faXNJblRyYW5zbGF0YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGFkZCB0aGUgY2hpbGRyZW4gZnJvbSB0cmFuc2xhdGFibGUgc2VjdGlvbnMgKD0gaTE4biBibG9ja3MgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhleSB3aWxsIGJlIGFkZGVkIGxhdGVyIGluIHRoaXMgbG9vcCB3aGVuIHRoZSBibG9jayBjbG9zZXMgKGkuZS4gb24gYDwhLS0gL2kxOG4gLS0+YClcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2RlcyA9IGNoaWxkTm9kZXMuY29uY2F0KHZpc2l0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Zpc2l0QXR0cmlidXRlc09mKGVsKTtcbiAgICAgICAgdGhpcy5fZGVwdGgtLTtcbiAgICAgICAgdGhpcy5faW5JMThuTm9kZSA9IHdhc0luSTE4bk5vZGU7XG4gICAgICAgIHRoaXMuX2luSW1wbGljaXROb2RlID0gd2FzSW5JbXBsaWNpdE5vZGU7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBfVmlzaXRvck1vZGUuTWVyZ2UpIHtcbiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkQXR0cnMgPSB0aGlzLl90cmFuc2xhdGVBdHRyaWJ1dGVzKGVsKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudCQxKGVsLm5hbWUsIHRyYW5zbGF0ZWRBdHRycywgY2hpbGROb2RlcywgZWwuc291cmNlU3BhbiwgZWwuc3RhcnRTb3VyY2VTcGFuLCBlbC5lbmRTb3VyY2VTcGFuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS52aXNpdEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUsIGNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZSBjb2RlJyk7XG4gICAgfTtcbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAobW9kZSwgaW50ZXJwb2xhdGlvbkNvbmZpZykge1xuICAgICAgICB0aGlzLl9tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5faW5JMThuQmxvY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faW5JMThuTm9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMuX2luSWN1ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21zZ0NvdW50QXRTZWN0aW9uU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IFtdO1xuICAgICAgICB0aGlzLl9pbkltcGxpY2l0Tm9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jcmVhdGVJMThuTWVzc2FnZSA9IGNyZWF0ZUkxOG5NZXNzYWdlRmFjdG9yeShpbnRlcnBvbGF0aW9uQ29uZmlnKTtcbiAgICB9O1xuICAgIC8vIGxvb2tzIGZvciB0cmFuc2xhdGFibGUgYXR0cmlidXRlc1xuICAgIF9WaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRBdHRyaWJ1dGVzT2YgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4cGxpY2l0QXR0ck5hbWVUb1ZhbHVlID0ge307XG4gICAgICAgIHZhciBpbXBsaWNpdEF0dHJOYW1lcyA9IHRoaXMuX2ltcGxpY2l0QXR0cnNbZWwubmFtZV0gfHwgW107XG4gICAgICAgIGVsLmF0dHJzLmZpbHRlcihmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lLnN0YXJ0c1dpdGgoX0kxOE5fQVRUUl9QUkVGSVgpOyB9KVxuICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGV4cGxpY2l0QXR0ck5hbWVUb1ZhbHVlW2F0dHIubmFtZS5zbGljZShfSTE4Tl9BVFRSX1BSRUZJWC5sZW5ndGgpXSA9XG4gICAgICAgICAgICBhdHRyLnZhbHVlOyB9KTtcbiAgICAgICAgZWwuYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgICAgICAgICAgaWYgKGF0dHIubmFtZSBpbiBleHBsaWNpdEF0dHJOYW1lVG9WYWx1ZSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9hZGRNZXNzYWdlKFthdHRyXSwgZXhwbGljaXRBdHRyTmFtZVRvVmFsdWVbYXR0ci5uYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpbXBsaWNpdEF0dHJOYW1lcy5zb21lKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBhdHRyLm5hbWUgPT09IG5hbWU7IH0pKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX2FkZE1lc3NhZ2UoW2F0dHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvLyBhZGQgYSB0cmFuc2xhdGFibGUgbWVzc2FnZVxuICAgIF9WaXNpdG9yLnByb3RvdHlwZS5fYWRkTWVzc2FnZSA9IGZ1bmN0aW9uIChhc3QsIG1zZ01ldGEpIHtcbiAgICAgICAgaWYgKGFzdC5sZW5ndGggPT0gMCB8fFxuICAgICAgICAgICAgYXN0Lmxlbmd0aCA9PSAxICYmIGFzdFswXSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSAmJiAhYXN0WzBdLnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBEbyBub3QgY3JlYXRlIGVtcHR5IG1lc3NhZ2VzXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSBfcGFyc2VNZXNzYWdlTWV0YShtc2dNZXRhKSwgbWVhbmluZyA9IF9hLm1lYW5pbmcsIGRlc2NyaXB0aW9uID0gX2EuZGVzY3JpcHRpb24sIGlkID0gX2EuaWQ7XG4gICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5fY3JlYXRlSTE4bk1lc3NhZ2UoYXN0LCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgaWQpO1xuICAgICAgICB0aGlzLl9tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9O1xuICAgIC8vIFRyYW5zbGF0ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgZ2l2ZW4gdGhlIGBUcmFuc2xhdGlvbkJ1bmRsZWBcbiAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIHRyYW5zbGF0aW5nIGVsZW1lbnRzIC8gYmxvY2tzIC0gc2VlIGBfdHJhbnNsYXRlQXR0cmlidXRlc2AgZm9yIGF0dHJpYnV0ZXNcbiAgICAvLyBuby1vcCB3aGVuIGNhbGxlZCBpbiBleHRyYWN0aW9uIG1vZGUgKHJldHVybnMgW10pXG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLl90cmFuc2xhdGVNZXNzYWdlID0gZnVuY3Rpb24gKGVsLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlICYmIHRoaXMuX21vZGUgPT09IF9WaXNpdG9yTW9kZS5NZXJnZSkge1xuICAgICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5fdHJhbnNsYXRpb25zLmdldChtZXNzYWdlKTtcbiAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVsLCBcIlRyYW5zbGF0aW9uIHVuYXZhaWxhYmxlIGZvciBtZXNzYWdlIGlkPVxcXCJcIiArIHRoaXMuX3RyYW5zbGF0aW9ucy5kaWdlc3QobWVzc2FnZSkgKyBcIlxcXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgLy8gdHJhbnNsYXRlIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQgYW5kIHJlbW92ZSBpMThuIHNwZWNpZmljIGF0dHJpYnV0ZXNcbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX3RyYW5zbGF0ZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBlbC5hdHRycztcbiAgICAgICAgdmFyIGkxOG5QYXJzZWRNZXNzYWdlTWV0YSA9IHt9O1xuICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyLm5hbWUuc3RhcnRzV2l0aChfSTE4Tl9BVFRSX1BSRUZJWCkpIHtcbiAgICAgICAgICAgICAgICBpMThuUGFyc2VkTWVzc2FnZU1ldGFbYXR0ci5uYW1lLnNsaWNlKF9JMThOX0FUVFJfUFJFRklYLmxlbmd0aCldID1cbiAgICAgICAgICAgICAgICAgICAgX3BhcnNlTWVzc2FnZU1ldGEoYXR0ci52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgdHJhbnNsYXRlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgICAgICAgICBpZiAoYXR0ci5uYW1lID09PSBfSTE4Tl9BVFRSIHx8IGF0dHIubmFtZS5zdGFydHNXaXRoKF9JMThOX0FUVFJfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIC8vIHN0cmlwIGkxOG4gc3BlY2lmaWMgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdHRyLnZhbHVlICYmIGF0dHIudmFsdWUgIT0gJycgJiYgaTE4blBhcnNlZE1lc3NhZ2VNZXRhLmhhc093blByb3BlcnR5KGF0dHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2EgPSBpMThuUGFyc2VkTWVzc2FnZU1ldGFbYXR0ci5uYW1lXSwgbWVhbmluZyA9IF9hLm1lYW5pbmcsIGRlc2NyaXB0aW9uID0gX2EuZGVzY3JpcHRpb24sIGlkID0gX2EuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBfdGhpcy5fY3JlYXRlSTE4bk1lc3NhZ2UoW2F0dHJdLCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgaWQpO1xuICAgICAgICAgICAgICAgIHZhciBub2RlcyA9IF90aGlzLl90cmFuc2xhdGlvbnMuZ2V0KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChub2Rlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRBdHRyaWJ1dGVzLnB1c2gobmV3IEF0dHJpYnV0ZShhdHRyLm5hbWUsICcnLCBhdHRyLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2Rlc1swXSBpbnN0YW5jZW9mIFRleHQkMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbm9kZXNbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkQXR0cmlidXRlcy5wdXNoKG5ldyBBdHRyaWJ1dGUoYXR0ci5uYW1lLCB2YWx1ZSwgYXR0ci5zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3IoZWwsIFwiVW5leHBlY3RlZCB0cmFuc2xhdGlvbiBmb3IgYXR0cmlidXRlIFxcXCJcIiArIGF0dHIubmFtZSArIFwiXFxcIiAoaWQ9XFxcIlwiICsgKGlkIHx8IF90aGlzLl90cmFuc2xhdGlvbnMuZGlnZXN0KG1lc3NhZ2UpKSArIFwiXFxcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihlbCwgXCJUcmFuc2xhdGlvbiB1bmF2YWlsYWJsZSBmb3IgYXR0cmlidXRlIFxcXCJcIiArIGF0dHIubmFtZSArIFwiXFxcIiAoaWQ9XFxcIlwiICsgKGlkIHx8IF90aGlzLl90cmFuc2xhdGlvbnMuZGlnZXN0KG1lc3NhZ2UpKSArIFwiXFxcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlZEF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkQXR0cmlidXRlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBibG9jayB3aGVuOlxuICAgICAqIC0gd2UgYXJlIGluIGEgYmxvY2ssXG4gICAgICogLSB3ZSBhcmUgbm90IGluc2lkZSBhIElDVSBtZXNzYWdlICh0aG9zZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5KSxcbiAgICAgKiAtIHRoZSBub2RlIGlzIGEgXCJkaXJlY3QgY2hpbGRcIiBvZiB0aGUgYmxvY2tcbiAgICAgKi9cbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX21heUJlQWRkQmxvY2tDaGlsZHJlbiA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbkkxOG5CbG9jayAmJiAhdGhpcy5faW5JY3UgJiYgdGhpcy5fZGVwdGggPT0gdGhpcy5fYmxvY2tTdGFydERlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9ibG9ja0NoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBzdGFydCBvZiBhIHNlY3Rpb24sIHNlZSBgX2Nsb3NlVHJhbnNsYXRhYmxlU2VjdGlvbmBcbiAgICAgKi9cbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX29wZW5UcmFuc2xhdGFibGVTZWN0aW9uID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihub2RlLCAnVW5leHBlY3RlZCBzZWN0aW9uIHN0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tc2dDb3VudEF0U2VjdGlvblN0YXJ0ID0gdGhpcy5fbWVzc2FnZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX1Zpc2l0b3IucHJvdG90eXBlLCBcIl9pc0luVHJhbnNsYXRhYmxlU2VjdGlvblwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRyYW5zbGF0YWJsZSBzZWN0aW9uIGNvdWxkIGJlOlxuICAgICAgICAgKiAtIHRoZSBjb250ZW50IG9mIHRyYW5zbGF0YWJsZSBlbGVtZW50LFxuICAgICAgICAgKiAtIG5vZGVzIGJldHdlZW4gYDwhLS0gaTE4biAtLT5gIGFuZCBgPCEtLSAvaTE4biAtLT5gIGNvbW1lbnRzXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tc2dDb3VudEF0U2VjdGlvblN0YXJ0ICE9PSB2b2lkIDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIFRlcm1pbmF0ZXMgYSBzZWN0aW9uLlxuICAgICAqXG4gICAgICogSWYgYSBzZWN0aW9uIGhhcyBvbmx5IG9uZSBzaWduaWZpY2FudCBjaGlsZHJlbiAoY29tbWVudHMgbm90IHNpZ25pZmljYW50KSB0aGVuIHdlIHNob3VsZCBub3RcbiAgICAgKiBrZWVwIHRoZSBtZXNzYWdlIGZyb20gdGhpcyBjaGlsZHJlbjpcbiAgICAgKlxuICAgICAqIGA8cCBpMThuPVwibWVhbmluZ3xkZXNjcmlwdGlvblwiPntJQ1UgbWVzc2FnZX08L3A+YCB3b3VsZCBwcm9kdWNlIHR3byBtZXNzYWdlczpcbiAgICAgKiAtIG9uZSBmb3IgdGhlIDxwPiBjb250ZW50IHdpdGggbWVhbmluZyBhbmQgZGVzY3JpcHRpb24sXG4gICAgICogLSBhbm90aGVyIG9uZSBmb3IgdGhlIElDVSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBjYXNlIHRoZSBsYXN0IG1lc3NhZ2UgaXMgZGlzY2FyZGVkIGFzIGl0IGNvbnRhaW5zIGxlc3MgaW5mb3JtYXRpb24gKHRoZSBBU1QgaXNcbiAgICAgKiBvdGhlcndpc2UgaWRlbnRpY2FsKS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB3ZSBzaG91bGQgc3RpbGwga2VlcCBtZXNzYWdlcyBleHRyYWN0ZWQgZnJvbSBhdHRyaWJ1dGVzIGluc2lkZSB0aGUgc2VjdGlvbiAoaWUgaW4gdGhlXG4gICAgICogSUNVIG1lc3NhZ2UgaGVyZSlcbiAgICAgKi9cbiAgICBfVmlzaXRvci5wcm90b3R5cGUuX2Nsb3NlVHJhbnNsYXRhYmxlU2VjdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBkaXJlY3RDaGlsZHJlbikge1xuICAgICAgICBpZiAoIXRoaXMuX2lzSW5UcmFuc2xhdGFibGVTZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihub2RlLCAnVW5leHBlY3RlZCBzZWN0aW9uIGVuZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5fbXNnQ291bnRBdFNlY3Rpb25TdGFydDtcbiAgICAgICAgdmFyIHNpZ25pZmljYW50Q2hpbGRyZW4gPSBkaXJlY3RDaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24gKGNvdW50LCBub2RlKSB7IHJldHVybiBjb3VudCArIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCA/IDAgOiAxKTsgfSwgMCk7XG4gICAgICAgIGlmIChzaWduaWZpY2FudENoaWxkcmVuID09IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9tZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IHN0YXJ0SW5kZXg7IGktLSkge1xuICAgICAgICAgICAgICAgIHZhciBhc3QgPSB0aGlzLl9tZXNzYWdlc1tpXS5ub2RlcztcbiAgICAgICAgICAgICAgICBpZiAoIShhc3QubGVuZ3RoID09IDEgJiYgYXN0WzBdIGluc3RhbmNlb2YgVGV4dCQxKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZXNzYWdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tc2dDb3VudEF0U2VjdGlvblN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgX1Zpc2l0b3IucHJvdG90eXBlLl9yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChub2RlLCBtc2cpIHtcbiAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihub2RlLnNvdXJjZVNwYW4sIG1zZykpO1xuICAgIH07XG4gICAgcmV0dXJuIF9WaXNpdG9yO1xufSgpKTtcbmZ1bmN0aW9uIF9pc09wZW5pbmdDb21tZW50KG4pIHtcbiAgICByZXR1cm4gISEobiBpbnN0YW5jZW9mIENvbW1lbnQgJiYgbi52YWx1ZSAmJiBuLnZhbHVlLnN0YXJ0c1dpdGgoJ2kxOG4nKSk7XG59XG5mdW5jdGlvbiBfaXNDbG9zaW5nQ29tbWVudChuKSB7XG4gICAgcmV0dXJuICEhKG4gaW5zdGFuY2VvZiBDb21tZW50ICYmIG4udmFsdWUgJiYgbi52YWx1ZSA9PT0gJy9pMThuJyk7XG59XG5mdW5jdGlvbiBfZ2V0STE4bkF0dHIocCkge1xuICAgIHJldHVybiBwLmF0dHJzLmZpbmQoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZSA9PT0gX0kxOE5fQVRUUjsgfSkgfHwgbnVsbDtcbn1cbmZ1bmN0aW9uIF9wYXJzZU1lc3NhZ2VNZXRhKGkxOG4pIHtcbiAgICBpZiAoIWkxOG4pXG4gICAgICAgIHJldHVybiB7IG1lYW5pbmc6ICcnLCBkZXNjcmlwdGlvbjogJycsIGlkOiAnJyB9O1xuICAgIHZhciBpZEluZGV4ID0gaTE4bi5pbmRleE9mKElEX1NFUEFSQVRPUik7XG4gICAgdmFyIGRlc2NJbmRleCA9IGkxOG4uaW5kZXhPZihNRUFOSU5HX1NFUEFSQVRPUik7XG4gICAgdmFyIF9hID0gX19yZWFkKChpZEluZGV4ID4gLTEpID8gW2kxOG4uc2xpY2UoMCwgaWRJbmRleCksIGkxOG4uc2xpY2UoaWRJbmRleCArIDIpXSA6IFtpMThuLCAnJ10sIDIpLCBtZWFuaW5nQW5kRGVzYyA9IF9hWzBdLCBpZCA9IF9hWzFdO1xuICAgIHZhciBfYiA9IF9fcmVhZCgoZGVzY0luZGV4ID4gLTEpID9cbiAgICAgICAgW21lYW5pbmdBbmREZXNjLnNsaWNlKDAsIGRlc2NJbmRleCksIG1lYW5pbmdBbmREZXNjLnNsaWNlKGRlc2NJbmRleCArIDEpXSA6XG4gICAgICAgIFsnJywgbWVhbmluZ0FuZERlc2NdLCAyKSwgbWVhbmluZyA9IF9iWzBdLCBkZXNjcmlwdGlvbiA9IF9iWzFdO1xuICAgIHJldHVybiB7IG1lYW5pbmc6IG1lYW5pbmcsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiwgaWQ6IGlkIH07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBYbWxUYWdEZWZpbml0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFhtbFRhZ0RlZmluaXRpb24oKSB7XG4gICAgICAgIHRoaXMuY2xvc2VkQnlQYXJlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IFRhZ0NvbnRlbnRUeXBlLlBBUlNBQkxFX0RBVEE7XG4gICAgICAgIHRoaXMuaXNWb2lkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaWdub3JlRmlyc3RMZiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhblNlbGZDbG9zZSA9IHRydWU7XG4gICAgfVxuICAgIFhtbFRhZ0RlZmluaXRpb24ucHJvdG90eXBlLnJlcXVpcmVFeHRyYVBhcmVudCA9IGZ1bmN0aW9uIChjdXJyZW50UGFyZW50KSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBYbWxUYWdEZWZpbml0aW9uLnByb3RvdHlwZS5pc0Nsb3NlZEJ5Q2hpbGQgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgcmV0dXJuIFhtbFRhZ0RlZmluaXRpb247XG59KCkpO1xudmFyIF9UQUdfREVGSU5JVElPTiA9IG5ldyBYbWxUYWdEZWZpbml0aW9uKCk7XG5mdW5jdGlvbiBnZXRYbWxUYWdEZWZpbml0aW9uKHRhZ05hbWUpIHtcbiAgICByZXR1cm4gX1RBR19ERUZJTklUSU9OO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgWG1sUGFyc2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhYbWxQYXJzZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gWG1sUGFyc2VyKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZ2V0WG1sVGFnRGVmaW5pdGlvbikgfHwgdGhpcztcbiAgICB9XG4gICAgWG1sUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChzb3VyY2UsIHVybCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5wYXJzZS5jYWxsKHRoaXMsIHNvdXJjZSwgdXJsLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHJldHVybiBYbWxQYXJzZXI7XG59KFBhcnNlcikpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgX1ZFUlNJT04gPSAnMS4yJztcbnZhciBfWE1MTlMgPSAndXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMic7XG4vLyBUT0RPKHZpY2IpOiBtYWtlIHRoaXMgYSBwYXJhbSAocy9fLy0vKVxudmFyIF9ERUZBVUxUX1NPVVJDRV9MQU5HID0gJ2VuJztcbnZhciBfUExBQ0VIT0xERVJfVEFHJDEgPSAneCc7XG52YXIgX01BUktFUl9UQUcgPSAnbXJrJztcbnZhciBfRklMRV9UQUcgPSAnZmlsZSc7XG52YXIgX1NPVVJDRV9UQUckMSA9ICdzb3VyY2UnO1xudmFyIF9TRUdNRU5UX1NPVVJDRV9UQUcgPSAnc2VnLXNvdXJjZSc7XG52YXIgX1RBUkdFVF9UQUcgPSAndGFyZ2V0JztcbnZhciBfVU5JVF9UQUcgPSAndHJhbnMtdW5pdCc7XG52YXIgX0NPTlRFWFRfR1JPVVBfVEFHID0gJ2NvbnRleHQtZ3JvdXAnO1xudmFyIF9DT05URVhUX1RBRyA9ICdjb250ZXh0Jztcbi8vIGh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3hsaWZmL3YxLjIvb3MveGxpZmYtY29yZS5odG1sXG4vLyBodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy94bGlmZi92MS4yL3hsaWZmLXByb2ZpbGUtaHRtbC94bGlmZi1wcm9maWxlLWh0bWwtMS4yLmh0bWxcbnZhciBYbGlmZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoWGxpZmYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gWGxpZmYoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgWGxpZmYucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG1lc3NhZ2VzLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIHZpc2l0b3IgPSBuZXcgX1dyaXRlVmlzaXRvcigpO1xuICAgICAgICB2YXIgdHJhbnNVbml0cyA9IFtdO1xuICAgICAgICBtZXNzYWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICB2YXIgY29udGV4dFRhZ3MgPSBbXTtcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dEdyb3VwVGFnID0gbmV3IFRhZyhfQ09OVEVYVF9HUk9VUF9UQUcsIHsgcHVycG9zZTogJ2xvY2F0aW9uJyB9KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0R3JvdXBUYWcuY2hpbGRyZW4ucHVzaChuZXcgQ1IoMTApLCBuZXcgVGFnKF9DT05URVhUX1RBRywgeyAnY29udGV4dC10eXBlJzogJ3NvdXJjZWZpbGUnIH0sIFtuZXcgVGV4dCQyKHNvdXJjZS5maWxlUGF0aCldKSwgbmV3IENSKDEwKSwgbmV3IFRhZyhfQ09OVEVYVF9UQUcsIHsgJ2NvbnRleHQtdHlwZSc6ICdsaW5lbnVtYmVyJyB9LCBbbmV3IFRleHQkMihcIlwiICsgc291cmNlLnN0YXJ0TGluZSldKSwgbmV3IENSKDgpKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0VGFncy5wdXNoKG5ldyBDUig4KSwgY29udGV4dEdyb3VwVGFnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIHRyYW5zVW5pdCA9IG5ldyBUYWcoX1VOSVRfVEFHLCB7IGlkOiBtZXNzYWdlLmlkLCBkYXRhdHlwZTogJ2h0bWwnIH0pO1xuICAgICAgICAgICAgKF9hID0gdHJhbnNVbml0LmNoaWxkcmVuKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZChbbmV3IENSKDgpLCBuZXcgVGFnKF9TT1VSQ0VfVEFHJDEsIHt9LCB2aXNpdG9yLnNlcmlhbGl6ZShtZXNzYWdlLm5vZGVzKSldLCBjb250ZXh0VGFncykpO1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0cmFuc1VuaXQuY2hpbGRyZW4ucHVzaChuZXcgQ1IoOCksIG5ldyBUYWcoJ25vdGUnLCB7IHByaW9yaXR5OiAnMScsIGZyb206ICdkZXNjcmlwdGlvbicgfSwgW25ldyBUZXh0JDIobWVzc2FnZS5kZXNjcmlwdGlvbildKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZWFuaW5nKSB7XG4gICAgICAgICAgICAgICAgdHJhbnNVbml0LmNoaWxkcmVuLnB1c2gobmV3IENSKDgpLCBuZXcgVGFnKCdub3RlJywgeyBwcmlvcml0eTogJzEnLCBmcm9tOiAnbWVhbmluZycgfSwgW25ldyBUZXh0JDIobWVzc2FnZS5tZWFuaW5nKV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYW5zVW5pdC5jaGlsZHJlbi5wdXNoKG5ldyBDUig2KSk7XG4gICAgICAgICAgICB0cmFuc1VuaXRzLnB1c2gobmV3IENSKDYpLCB0cmFuc1VuaXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJvZHkgPSBuZXcgVGFnKCdib2R5Jywge30sIF9fc3ByZWFkKHRyYW5zVW5pdHMsIFtuZXcgQ1IoNCldKSk7XG4gICAgICAgIHZhciBmaWxlID0gbmV3IFRhZygnZmlsZScsIHtcbiAgICAgICAgICAgICdzb3VyY2UtbGFuZ3VhZ2UnOiBsb2NhbGUgfHwgX0RFRkFVTFRfU09VUkNFX0xBTkcsXG4gICAgICAgICAgICBkYXRhdHlwZTogJ3BsYWludGV4dCcsXG4gICAgICAgICAgICBvcmlnaW5hbDogJ25nMi50ZW1wbGF0ZScsXG4gICAgICAgIH0sIFtuZXcgQ1IoNCksIGJvZHksIG5ldyBDUigyKV0pO1xuICAgICAgICB2YXIgeGxpZmYgPSBuZXcgVGFnKCd4bGlmZicsIHsgdmVyc2lvbjogX1ZFUlNJT04sIHhtbG5zOiBfWE1MTlMgfSwgW25ldyBDUigyKSwgZmlsZSwgbmV3IENSKCldKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZShbXG4gICAgICAgICAgICBuZXcgRGVjbGFyYXRpb24oeyB2ZXJzaW9uOiAnMS4wJywgZW5jb2Rpbmc6ICdVVEYtOCcgfSksIG5ldyBDUigpLCB4bGlmZiwgbmV3IENSKClcbiAgICAgICAgXSk7XG4gICAgfTtcbiAgICBYbGlmZi5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChjb250ZW50LCB1cmwpIHtcbiAgICAgICAgLy8geGxpZmYgdG8geG1sIG5vZGVzXG4gICAgICAgIHZhciB4bGlmZlBhcnNlciA9IG5ldyBYbGlmZlBhcnNlcigpO1xuICAgICAgICB2YXIgX2EgPSB4bGlmZlBhcnNlci5wYXJzZShjb250ZW50LCB1cmwpLCBsb2NhbGUgPSBfYS5sb2NhbGUsIG1zZ0lkVG9IdG1sID0gX2EubXNnSWRUb0h0bWwsIGVycm9ycyA9IF9hLmVycm9ycztcbiAgICAgICAgLy8geG1sIG5vZGVzIHRvIGkxOG4gbm9kZXNcbiAgICAgICAgdmFyIGkxOG5Ob2Rlc0J5TXNnSWQgPSB7fTtcbiAgICAgICAgdmFyIGNvbnZlcnRlciA9IG5ldyBYbWxUb0kxOG4oKTtcbiAgICAgICAgT2JqZWN0LmtleXMobXNnSWRUb0h0bWwpLmZvckVhY2goZnVuY3Rpb24gKG1zZ0lkKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBjb252ZXJ0ZXIuY29udmVydChtc2dJZFRvSHRtbFttc2dJZF0sIHVybCksIGkxOG5Ob2RlcyA9IF9hLmkxOG5Ob2RlcywgZSA9IF9hLmVycm9ycztcbiAgICAgICAgICAgIGVycm9ycy5wdXNoLmFwcGx5KGVycm9ycywgX19zcHJlYWQoZSkpO1xuICAgICAgICAgICAgaTE4bk5vZGVzQnlNc2dJZFttc2dJZF0gPSBpMThuTm9kZXM7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwieGxpZmYgcGFyc2UgZXJyb3JzOlxcblwiICsgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsb2NhbGU6IGxvY2FsZSwgaTE4bk5vZGVzQnlNc2dJZDogaTE4bk5vZGVzQnlNc2dJZCB9O1xuICAgIH07XG4gICAgWGxpZmYucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHJldHVybiBkaWdlc3QobWVzc2FnZSk7IH07XG4gICAgcmV0dXJuIFhsaWZmO1xufShTZXJpYWxpemVyKSk7XG52YXIgX1dyaXRlVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBfV3JpdGVWaXNpdG9yKCkge1xuICAgIH1cbiAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyByZXR1cm4gW25ldyBUZXh0JDIodGV4dC52YWx1ZSldOyB9O1xuICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICAgICAgY29udGFpbmVyLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGVzLnB1c2guYXBwbHkobm9kZXMsIF9fc3ByZWFkKG5vZGUudmlzaXQoX3RoaXMpKSk7IH0pO1xuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfTtcbiAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdSA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5vZGVzID0gW25ldyBUZXh0JDIoXCJ7XCIgKyBpY3UuZXhwcmVzc2lvblBsYWNlaG9sZGVyICsgXCIsIFwiICsgaWN1LnR5cGUgKyBcIiwgXCIpXTtcbiAgICAgICAgT2JqZWN0LmtleXMoaWN1LmNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoLmFwcGx5KG5vZGVzLCBfX3NwcmVhZChbbmV3IFRleHQkMihjICsgXCIge1wiKV0sIGljdS5jYXNlc1tjXS52aXNpdChfdGhpcyksIFtuZXcgVGV4dCQyKFwifSBcIildKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBub2Rlcy5wdXNoKG5ldyBUZXh0JDIoXCJ9XCIpKTtcbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH07XG4gICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgY3R5cGUgPSBnZXRDdHlwZUZvclRhZyhwaC50YWcpO1xuICAgICAgICBpZiAocGguaXNWb2lkKSB7XG4gICAgICAgICAgICAvLyB2b2lkIHRhZ3MgaGF2ZSBubyBjaGlsZHJlbiBub3IgY2xvc2luZyB0YWdzXG4gICAgICAgICAgICByZXR1cm4gW25ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQxLCB7IGlkOiBwaC5zdGFydE5hbWUsIGN0eXBlOiBjdHlwZSwgJ2VxdWl2LXRleHQnOiBcIjxcIiArIHBoLnRhZyArIFwiLz5cIiB9KV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0VGFnUGggPSBuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUckMSwgeyBpZDogcGguc3RhcnROYW1lLCBjdHlwZTogY3R5cGUsICdlcXVpdi10ZXh0JzogXCI8XCIgKyBwaC50YWcgKyBcIj5cIiB9KTtcbiAgICAgICAgdmFyIGNsb3NlVGFnUGggPSBuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUckMSwgeyBpZDogcGguY2xvc2VOYW1lLCBjdHlwZTogY3R5cGUsICdlcXVpdi10ZXh0JzogXCI8L1wiICsgcGgudGFnICsgXCI+XCIgfSk7XG4gICAgICAgIHJldHVybiBfX3NwcmVhZChbc3RhcnRUYWdQaF0sIHRoaXMuc2VyaWFsaXplKHBoLmNoaWxkcmVuKSwgW2Nsb3NlVGFnUGhdKTtcbiAgICB9O1xuICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUckMSwgeyBpZDogcGgubmFtZSwgJ2VxdWl2LXRleHQnOiBcInt7XCIgKyBwaC52YWx1ZSArIFwifX1cIiB9KV07XG4gICAgfTtcbiAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBlcXVpdlRleHQgPSBcIntcIiArIHBoLnZhbHVlLmV4cHJlc3Npb24gKyBcIiwgXCIgKyBwaC52YWx1ZS50eXBlICsgXCIsIFwiICsgT2JqZWN0LmtleXMocGgudmFsdWUuY2FzZXMpLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlICsgJyB7Li4ufSc7IH0pLmpvaW4oJyAnKSArIFwifVwiO1xuICAgICAgICByZXR1cm4gW25ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQxLCB7IGlkOiBwaC5uYW1lLCAnZXF1aXYtdGV4dCc6IGVxdWl2VGV4dCB9KV07XG4gICAgfTtcbiAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAobm9kZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgX19zcHJlYWQobm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSkpKTtcbiAgICB9O1xuICAgIHJldHVybiBfV3JpdGVWaXNpdG9yO1xufSgpKTtcbi8vIFRPRE8odmljYik6IGFkZCBlcnJvciBtYW5hZ2VtZW50IChzdHJ1Y3R1cmUpXG4vLyBFeHRyYWN0IG1lc3NhZ2VzIGFzIHhtbCBub2RlcyBmcm9tIHRoZSB4bGlmZiBmaWxlXG52YXIgWGxpZmZQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gWGxpZmZQYXJzZXIoKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IG51bGw7XG4gICAgfVxuICAgIFhsaWZmUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uICh4bGlmZiwgdXJsKSB7XG4gICAgICAgIHRoaXMuX3VuaXRNbFN0cmluZyA9IG51bGw7XG4gICAgICAgIHRoaXMuX21zZ0lkVG9IdG1sID0ge307XG4gICAgICAgIHZhciB4bWwgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2UoeGxpZmYsIHVybCk7XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IHhtbC5lcnJvcnM7XG4gICAgICAgIHZpc2l0QWxsJDEodGhpcywgeG1sLnJvb3ROb2RlcywgbnVsbCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtc2dJZFRvSHRtbDogdGhpcy5fbXNnSWRUb0h0bWwsXG4gICAgICAgICAgICBlcnJvcnM6IHRoaXMuX2Vycm9ycyxcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIF9VTklUX1RBRzpcbiAgICAgICAgICAgICAgICB0aGlzLl91bml0TWxTdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBpZEF0dHIgPSBlbGVtZW50LmF0dHJzLmZpbmQoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZSA9PT0gJ2lkJzsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpZEF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCI8XCIgKyBfVU5JVF9UQUcgKyBcIj4gbWlzc2VzIHRoZSBcXFwiaWRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkQXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21zZ0lkVG9IdG1sLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCJEdXBsaWNhdGVkIHRyYW5zbGF0aW9ucyBmb3IgbXNnIFwiICsgaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCBlbGVtZW50LmNoaWxkcmVuLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fdW5pdE1sU3RyaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZ0lkVG9IdG1sW2lkXSA9IHRoaXMuX3VuaXRNbFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsZW1lbnQsIFwiTWVzc2FnZSBcIiArIGlkICsgXCIgbWlzc2VzIGEgdHJhbnNsYXRpb25cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhvc2UgdGFnc1xuICAgICAgICAgICAgY2FzZSBfU09VUkNFX1RBRyQxOlxuICAgICAgICAgICAgY2FzZSBfU0VHTUVOVF9TT1VSQ0VfVEFHOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfVEFSR0VUX1RBRzpcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJUZXh0U3RhcnQgPSBlbGVtZW50LnN0YXJ0U291cmNlU3Bhbi5lbmQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclRleHRFbmQgPSBlbGVtZW50LmVuZFNvdXJjZVNwYW4uc3RhcnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gZWxlbWVudC5zdGFydFNvdXJjZVNwYW4uc3RhcnQuZmlsZS5jb250ZW50O1xuICAgICAgICAgICAgICAgIHZhciBpbm5lclRleHQgPSBjb250ZW50LnNsaWNlKGlubmVyVGV4dFN0YXJ0LCBpbm5lclRleHRFbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VuaXRNbFN0cmluZyA9IGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgX0ZJTEVfVEFHOlxuICAgICAgICAgICAgICAgIHZhciBsb2NhbGVBdHRyID0gZWxlbWVudC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICd0YXJnZXQtbGFuZ3VhZ2UnOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAobG9jYWxlQXR0cikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSBsb2NhbGVBdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOiBhc3NlcnQgZmlsZSBzdHJ1Y3R1cmUsIHhsaWZmIHZlcnNpb25cbiAgICAgICAgICAgICAgICAvLyBGb3Igbm93IG9ubHkgcmVjdXJzZSBvbiB1bmhhbmRsZWQgbm9kZXNcbiAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBYbGlmZlBhcnNlci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IH07XG4gICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IH07XG4gICAgWGxpZmZQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGV4cGFuc2lvbiwgY29udGV4dCkgeyB9O1xuICAgIFhsaWZmUGFyc2VyLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoZXhwYW5zaW9uQ2FzZSwgY29udGV4dCkgeyB9O1xuICAgIFhsaWZmUGFyc2VyLnByb3RvdHlwZS5fYWRkRXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKG5vZGUuc291cmNlU3BhbiwgbWVzc2FnZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFhsaWZmUGFyc2VyO1xufSgpKTtcbi8vIENvbnZlcnQgbWwgbm9kZXMgKHhsaWZmIHN5bnRheCkgdG8gaTE4biBub2Rlc1xudmFyIFhtbFRvSTE4biA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBYbWxUb0kxOG4oKSB7XG4gICAgfVxuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChtZXNzYWdlLCB1cmwpIHtcbiAgICAgICAgdmFyIHhtbEljdSA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZShtZXNzYWdlLCB1cmwsIHsgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0geG1sSWN1LmVycm9ycztcbiAgICAgICAgdmFyIGkxOG5Ob2RlcyA9IHRoaXMuX2Vycm9ycy5sZW5ndGggPiAwIHx8IHhtbEljdS5yb290Tm9kZXMubGVuZ3RoID09IDAgP1xuICAgICAgICAgICAgW10gOiBbXS5jb25jYXQuYXBwbHkoW10sIF9fc3ByZWFkKHZpc2l0QWxsJDEodGhpcywgeG1sSWN1LnJvb3ROb2RlcykpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGkxOG5Ob2RlczogaTE4bk5vZGVzLFxuICAgICAgICAgICAgZXJyb3JzOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiBuZXcgVGV4dCQxKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7IH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGVsLm5hbWUgPT09IF9QTEFDRUhPTERFUl9UQUckMSkge1xuICAgICAgICAgICAgdmFyIG5hbWVBdHRyID0gZWwuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSAnaWQnOyB9KTtcbiAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXIoJycsIG5hbWVBdHRyLnZhbHVlLCBlbC5zb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIjxcIiArIF9QTEFDRUhPTERFUl9UQUckMSArIFwiPiBtaXNzZXMgdGhlIFxcXCJpZFxcXCIgYXR0cmlidXRlXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLm5hbWUgPT09IF9NQVJLRVJfVEFHKSB7XG4gICAgICAgICAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBfX3NwcmVhZCh2aXNpdEFsbCQxKHRoaXMsIGVsLmNoaWxkcmVuKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIlVuZXhwZWN0ZWQgdGFnXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRFeHBhbnNpb24gPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBjYXNlTWFwID0ge307XG4gICAgICAgIHZpc2l0QWxsJDEodGhpcywgaWN1LmNhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICBjYXNlTWFwW2MudmFsdWVdID0gbmV3IENvbnRhaW5lcihjLm5vZGVzLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IEljdSQxKGljdS5zd2l0Y2hWYWx1ZSwgaWN1LnR5cGUsIGNhc2VNYXAsIGljdS5zb3VyY2VTcGFuKTtcbiAgICB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGljdUNhc2UsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBpY3VDYXNlLnZhbHVlLFxuICAgICAgICAgICAgbm9kZXM6IHZpc2l0QWxsJDEodGhpcywgaWN1Q2FzZS5leHByZXNzaW9uKSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQsIGNvbnRleHQpIHsgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkgeyB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUuX2FkZEVycm9yID0gZnVuY3Rpb24gKG5vZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihub2RlLnNvdXJjZVNwYW4sIG1lc3NhZ2UpKTtcbiAgICB9O1xuICAgIHJldHVybiBYbWxUb0kxOG47XG59KCkpO1xuZnVuY3Rpb24gZ2V0Q3R5cGVGb3JUYWcodGFnKSB7XG4gICAgc3dpdGNoICh0YWcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdicic6XG4gICAgICAgICAgICByZXR1cm4gJ2xiJztcbiAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFwieC1cIiArIHRhZztcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfVkVSU0lPTiQxID0gJzIuMCc7XG52YXIgX1hNTE5TJDEgPSAndXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjIuMCc7XG4vLyBUT0RPKHZpY2IpOiBtYWtlIHRoaXMgYSBwYXJhbSAocy9fLy0vKVxudmFyIF9ERUZBVUxUX1NPVVJDRV9MQU5HJDEgPSAnZW4nO1xudmFyIF9QTEFDRUhPTERFUl9UQUckMiA9ICdwaCc7XG52YXIgX1BMQUNFSE9MREVSX1NQQU5OSU5HX1RBRyA9ICdwYyc7XG52YXIgX01BUktFUl9UQUckMSA9ICdtcmsnO1xudmFyIF9YTElGRl9UQUcgPSAneGxpZmYnO1xudmFyIF9TT1VSQ0VfVEFHJDIgPSAnc291cmNlJztcbnZhciBfVEFSR0VUX1RBRyQxID0gJ3RhcmdldCc7XG52YXIgX1VOSVRfVEFHJDEgPSAndW5pdCc7XG4vLyBodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy94bGlmZi94bGlmZi1jb3JlL3YyLjAvb3MveGxpZmYtY29yZS12Mi4wLW9zLmh0bWxcbnZhciBYbGlmZjIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFhsaWZmMiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBYbGlmZjIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgWGxpZmYyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChtZXNzYWdlcywgbG9jYWxlKSB7XG4gICAgICAgIHZhciB2aXNpdG9yID0gbmV3IF9Xcml0ZVZpc2l0b3IkMSgpO1xuICAgICAgICB2YXIgdW5pdHMgPSBbXTtcbiAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIHVuaXQgPSBuZXcgVGFnKF9VTklUX1RBRyQxLCB7IGlkOiBtZXNzYWdlLmlkIH0pO1xuICAgICAgICAgICAgdmFyIG5vdGVzID0gbmV3IFRhZygnbm90ZXMnKTtcbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc2NyaXB0aW9uIHx8IG1lc3NhZ2UubWVhbmluZykge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vdGVzLmNoaWxkcmVuLnB1c2gobmV3IENSKDgpLCBuZXcgVGFnKCdub3RlJywgeyBjYXRlZ29yeTogJ2Rlc2NyaXB0aW9uJyB9LCBbbmV3IFRleHQkMihtZXNzYWdlLmRlc2NyaXB0aW9uKV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVhbmluZykge1xuICAgICAgICAgICAgICAgICAgICBub3Rlcy5jaGlsZHJlbi5wdXNoKG5ldyBDUig4KSwgbmV3IFRhZygnbm90ZScsIHsgY2F0ZWdvcnk6ICdtZWFuaW5nJyB9LCBbbmV3IFRleHQkMihtZXNzYWdlLm1lYW5pbmcpXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBub3Rlcy5jaGlsZHJlbi5wdXNoKG5ldyBDUig4KSwgbmV3IFRhZygnbm90ZScsIHsgY2F0ZWdvcnk6ICdsb2NhdGlvbicgfSwgW1xuICAgICAgICAgICAgICAgICAgICBuZXcgVGV4dCQyKHNvdXJjZS5maWxlUGF0aCArIFwiOlwiICsgc291cmNlLnN0YXJ0TGluZSArIChzb3VyY2UuZW5kTGluZSAhPT0gc291cmNlLnN0YXJ0TGluZSA/ICcsJyArIHNvdXJjZS5lbmRMaW5lIDogJycpKVxuICAgICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm90ZXMuY2hpbGRyZW4ucHVzaChuZXcgQ1IoNikpO1xuICAgICAgICAgICAgdW5pdC5jaGlsZHJlbi5wdXNoKG5ldyBDUig2KSwgbm90ZXMpO1xuICAgICAgICAgICAgdmFyIHNlZ21lbnQgPSBuZXcgVGFnKCdzZWdtZW50Jyk7XG4gICAgICAgICAgICBzZWdtZW50LmNoaWxkcmVuLnB1c2gobmV3IENSKDgpLCBuZXcgVGFnKF9TT1VSQ0VfVEFHJDIsIHt9LCB2aXNpdG9yLnNlcmlhbGl6ZShtZXNzYWdlLm5vZGVzKSksIG5ldyBDUig2KSk7XG4gICAgICAgICAgICB1bml0LmNoaWxkcmVuLnB1c2gobmV3IENSKDYpLCBzZWdtZW50LCBuZXcgQ1IoNCkpO1xuICAgICAgICAgICAgdW5pdHMucHVzaChuZXcgQ1IoNCksIHVuaXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGZpbGUgPSBuZXcgVGFnKCdmaWxlJywgeyAnb3JpZ2luYWwnOiAnbmcudGVtcGxhdGUnLCBpZDogJ25naTE4bicgfSwgX19zcHJlYWQodW5pdHMsIFtuZXcgQ1IoMildKSk7XG4gICAgICAgIHZhciB4bGlmZiA9IG5ldyBUYWcoX1hMSUZGX1RBRywgeyB2ZXJzaW9uOiBfVkVSU0lPTiQxLCB4bWxuczogX1hNTE5TJDEsIHNyY0xhbmc6IGxvY2FsZSB8fCBfREVGQVVMVF9TT1VSQ0VfTEFORyQxIH0sIFtuZXcgQ1IoMiksIGZpbGUsIG5ldyBDUigpXSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemUoW1xuICAgICAgICAgICAgbmV3IERlY2xhcmF0aW9uKHsgdmVyc2lvbjogJzEuMCcsIGVuY29kaW5nOiAnVVRGLTgnIH0pLCBuZXcgQ1IoKSwgeGxpZmYsIG5ldyBDUigpXG4gICAgICAgIF0pO1xuICAgIH07XG4gICAgWGxpZmYyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCkge1xuICAgICAgICAvLyB4bGlmZiB0byB4bWwgbm9kZXNcbiAgICAgICAgdmFyIHhsaWZmMlBhcnNlciA9IG5ldyBYbGlmZjJQYXJzZXIoKTtcbiAgICAgICAgdmFyIF9hID0geGxpZmYyUGFyc2VyLnBhcnNlKGNvbnRlbnQsIHVybCksIGxvY2FsZSA9IF9hLmxvY2FsZSwgbXNnSWRUb0h0bWwgPSBfYS5tc2dJZFRvSHRtbCwgZXJyb3JzID0gX2EuZXJyb3JzO1xuICAgICAgICAvLyB4bWwgbm9kZXMgdG8gaTE4biBub2Rlc1xuICAgICAgICB2YXIgaTE4bk5vZGVzQnlNc2dJZCA9IHt9O1xuICAgICAgICB2YXIgY29udmVydGVyID0gbmV3IFhtbFRvSTE4biQxKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKG1zZ0lkVG9IdG1sKS5mb3JFYWNoKGZ1bmN0aW9uIChtc2dJZCkge1xuICAgICAgICAgICAgdmFyIF9hID0gY29udmVydGVyLmNvbnZlcnQobXNnSWRUb0h0bWxbbXNnSWRdLCB1cmwpLCBpMThuTm9kZXMgPSBfYS5pMThuTm9kZXMsIGUgPSBfYS5lcnJvcnM7XG4gICAgICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIF9fc3ByZWFkKGUpKTtcbiAgICAgICAgICAgIGkxOG5Ob2Rlc0J5TXNnSWRbbXNnSWRdID0gaTE4bk5vZGVzO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInhsaWZmMiBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxvY2FsZTogbG9jYWxlLCBpMThuTm9kZXNCeU1zZ0lkOiBpMThuTm9kZXNCeU1zZ0lkIH07XG4gICAgfTtcbiAgICBYbGlmZjIucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHJldHVybiBkZWNpbWFsRGlnZXN0KG1lc3NhZ2UpOyB9O1xuICAgIHJldHVybiBYbGlmZjI7XG59KFNlcmlhbGl6ZXIpKTtcbnZhciBfV3JpdGVWaXNpdG9yJDEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX1dyaXRlVmlzaXRvcigpIHtcbiAgICB9XG4gICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNvbnRleHQpIHsgcmV0dXJuIFtuZXcgVGV4dCQyKHRleHQudmFsdWUpXTsgfTtcbiAgICBfV3JpdGVWaXNpdG9yLnByb3RvdHlwZS52aXNpdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjb250YWluZXIsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICAgIGNvbnRhaW5lci5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2Rlcy5wdXNoLmFwcGx5KG5vZGVzLCBfX3NwcmVhZChub2RlLnZpc2l0KF90aGlzKSkpOyB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH07XG4gICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBub2RlcyA9IFtuZXcgVGV4dCQyKFwie1wiICsgaWN1LmV4cHJlc3Npb25QbGFjZWhvbGRlciArIFwiLCBcIiArIGljdS50eXBlICsgXCIsIFwiKV07XG4gICAgICAgIE9iamVjdC5rZXlzKGljdS5jYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgbm9kZXMucHVzaC5hcHBseShub2RlcywgX19zcHJlYWQoW25ldyBUZXh0JDIoYyArIFwiIHtcIildLCBpY3UuY2FzZXNbY10udmlzaXQoX3RoaXMpLCBbbmV3IFRleHQkMihcIn0gXCIpXSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgbm9kZXMucHVzaChuZXcgVGV4dCQyKFwifVwiKSk7XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9O1xuICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0VGFnUGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlRm9yVGFnKHBoLnRhZyk7XG4gICAgICAgIGlmIChwaC5pc1ZvaWQpIHtcbiAgICAgICAgICAgIHZhciB0YWdQaCA9IG5ldyBUYWcoX1BMQUNFSE9MREVSX1RBRyQyLCB7XG4gICAgICAgICAgICAgICAgaWQ6ICh0aGlzLl9uZXh0UGxhY2Vob2xkZXJJZCsrKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGVxdWl2OiBwaC5zdGFydE5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBkaXNwOiBcIjxcIiArIHBoLnRhZyArIFwiLz5cIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFt0YWdQaF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhZ1BjID0gbmV3IFRhZyhfUExBQ0VIT0xERVJfU1BBTk5JTkdfVEFHLCB7XG4gICAgICAgICAgICBpZDogKHRoaXMuX25leHRQbGFjZWhvbGRlcklkKyspLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBlcXVpdlN0YXJ0OiBwaC5zdGFydE5hbWUsXG4gICAgICAgICAgICBlcXVpdkVuZDogcGguY2xvc2VOYW1lLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGRpc3BTdGFydDogXCI8XCIgKyBwaC50YWcgKyBcIj5cIixcbiAgICAgICAgICAgIGRpc3BFbmQ6IFwiPC9cIiArIHBoLnRhZyArIFwiPlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIG5vZGVzID0gW10uY29uY2F0LmFwcGx5KFtdLCBfX3NwcmVhZChwaC5jaGlsZHJlbi5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMpOyB9KSkpO1xuICAgICAgICBpZiAobm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiB0YWdQYy5jaGlsZHJlbi5wdXNoKG5vZGUpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhZ1BjLmNoaWxkcmVuLnB1c2gobmV3IFRleHQkMignJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGFnUGNdO1xuICAgIH07XG4gICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUudmlzaXRQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgaWRTdHIgPSAodGhpcy5fbmV4dFBsYWNlaG9sZGVySWQrKykudG9TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIFtuZXcgVGFnKF9QTEFDRUhPTERFUl9UQUckMiwge1xuICAgICAgICAgICAgICAgIGlkOiBpZFN0cixcbiAgICAgICAgICAgICAgICBlcXVpdjogcGgubmFtZSxcbiAgICAgICAgICAgICAgICBkaXNwOiBcInt7XCIgKyBwaC52YWx1ZSArIFwifX1cIixcbiAgICAgICAgICAgIH0pXTtcbiAgICB9O1xuICAgIF9Xcml0ZVZpc2l0b3IucHJvdG90eXBlLnZpc2l0SWN1UGxhY2Vob2xkZXIgPSBmdW5jdGlvbiAocGgsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNhc2VzID0gT2JqZWN0LmtleXMocGgudmFsdWUuY2FzZXMpLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlICsgJyB7Li4ufSc7IH0pLmpvaW4oJyAnKTtcbiAgICAgICAgdmFyIGlkU3RyID0gKHRoaXMuX25leHRQbGFjZWhvbGRlcklkKyspLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBbbmV3IFRhZyhfUExBQ0VIT0xERVJfVEFHJDIsIHsgaWQ6IGlkU3RyLCBlcXVpdjogcGgubmFtZSwgZGlzcDogXCJ7XCIgKyBwaC52YWx1ZS5leHByZXNzaW9uICsgXCIsIFwiICsgcGgudmFsdWUudHlwZSArIFwiLCBcIiArIGNhc2VzICsgXCJ9XCIgfSldO1xuICAgIH07XG4gICAgX1dyaXRlVmlzaXRvci5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX25leHRQbGFjZWhvbGRlcklkID0gMDtcbiAgICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgX19zcHJlYWQobm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSkpKTtcbiAgICB9O1xuICAgIHJldHVybiBfV3JpdGVWaXNpdG9yO1xufSgpKTtcbi8vIEV4dHJhY3QgbWVzc2FnZXMgYXMgeG1sIG5vZGVzIGZyb20gdGhlIHhsaWZmIGZpbGVcbnZhciBYbGlmZjJQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gWGxpZmYyUGFyc2VyKCkge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSBudWxsO1xuICAgIH1cbiAgICBYbGlmZjJQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHhsaWZmLCB1cmwpIHtcbiAgICAgICAgdGhpcy5fdW5pdE1sU3RyaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbXNnSWRUb0h0bWwgPSB7fTtcbiAgICAgICAgdmFyIHhtbCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSh4bGlmZiwgdXJsKTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0geG1sLmVycm9ycztcbiAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCB4bWwucm9vdE5vZGVzLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1zZ0lkVG9IdG1sOiB0aGlzLl9tc2dJZFRvSHRtbCxcbiAgICAgICAgICAgIGVycm9yczogdGhpcy5fZXJyb3JzLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBYbGlmZjJQYXJzZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAgIHN3aXRjaCAoZWxlbWVudC5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIF9VTklUX1RBRyQxOlxuICAgICAgICAgICAgICAgIHRoaXMuX3VuaXRNbFN0cmluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIGlkQXR0ciA9IGVsZW1lbnQuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSAnaWQnOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlkQXR0cikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbGVtZW50LCBcIjxcIiArIF9VTklUX1RBRyQxICsgXCI+IG1pc3NlcyB0aGUgXFxcImlkXFxcIiBhdHRyaWJ1dGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZEF0dHIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tc2dJZFRvSHRtbC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsZW1lbnQsIFwiRHVwbGljYXRlZCB0cmFuc2xhdGlvbnMgZm9yIG1zZyBcIiArIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0QWxsJDEodGhpcywgZWxlbWVudC5jaGlsZHJlbiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3VuaXRNbFN0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tc2dJZFRvSHRtbFtpZF0gPSB0aGlzLl91bml0TWxTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbGVtZW50LCBcIk1lc3NhZ2UgXCIgKyBpZCArIFwiIG1pc3NlcyBhIHRyYW5zbGF0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfU09VUkNFX1RBRyQyOlxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBzb3VyY2UgbWVzc2FnZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfVEFSR0VUX1RBRyQxOlxuICAgICAgICAgICAgICAgIHZhciBpbm5lclRleHRTdGFydCA9IGVsZW1lbnQuc3RhcnRTb3VyY2VTcGFuLmVuZC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGlubmVyVGV4dEVuZCA9IGVsZW1lbnQuZW5kU291cmNlU3Bhbi5zdGFydC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50LnN0YXJ0U291cmNlU3Bhbi5zdGFydC5maWxlLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgdmFyIGlubmVyVGV4dCA9IGNvbnRlbnQuc2xpY2UoaW5uZXJUZXh0U3RhcnQsIGlubmVyVGV4dEVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW5pdE1sU3RyaW5nID0gaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfWExJRkZfVEFHOlxuICAgICAgICAgICAgICAgIHZhciBsb2NhbGVBdHRyID0gZWxlbWVudC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICd0cmdMYW5nJzsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZUF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbG9jYWxlQXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZlcnNpb25BdHRyID0gZWxlbWVudC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICd2ZXJzaW9uJzsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25BdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gdmVyc2lvbkF0dHIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9PSAnMi4wJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCJUaGUgWExJRkYgZmlsZSB2ZXJzaW9uIFwiICsgdmVyc2lvbiArIFwiIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggWExJRkYgMi4wIHNlcmlhbGl6ZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBYbGlmZjJQYXJzZXIucHJvdG90eXBlLnZpc2l0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSwgY29udGV4dCkgeyB9O1xuICAgIFhsaWZmMlBhcnNlci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNvbnRleHQpIHsgfTtcbiAgICBYbGlmZjJQYXJzZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChjb21tZW50LCBjb250ZXh0KSB7IH07XG4gICAgWGxpZmYyUGFyc2VyLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChleHBhbnNpb24sIGNvbnRleHQpIHsgfTtcbiAgICBYbGlmZjJQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChleHBhbnNpb25DYXNlLCBjb250ZXh0KSB7IH07XG4gICAgWGxpZmYyUGFyc2VyLnByb3RvdHlwZS5fYWRkRXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKG5vZGUuc291cmNlU3BhbiwgbWVzc2FnZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFhsaWZmMlBhcnNlcjtcbn0oKSk7XG4vLyBDb252ZXJ0IG1sIG5vZGVzICh4bGlmZiBzeW50YXgpIHRvIGkxOG4gbm9kZXNcbnZhciBYbWxUb0kxOG4kMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBYbWxUb0kxOG4oKSB7XG4gICAgfVxuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChtZXNzYWdlLCB1cmwpIHtcbiAgICAgICAgdmFyIHhtbEljdSA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZShtZXNzYWdlLCB1cmwsIHsgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0geG1sSWN1LmVycm9ycztcbiAgICAgICAgdmFyIGkxOG5Ob2RlcyA9IHRoaXMuX2Vycm9ycy5sZW5ndGggPiAwIHx8IHhtbEljdS5yb290Tm9kZXMubGVuZ3RoID09IDAgP1xuICAgICAgICAgICAgW10gOiBbXS5jb25jYXQuYXBwbHkoW10sIF9fc3ByZWFkKHZpc2l0QWxsJDEodGhpcywgeG1sSWN1LnJvb3ROb2RlcykpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGkxOG5Ob2RlczogaTE4bk5vZGVzLFxuICAgICAgICAgICAgZXJyb3JzOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiBuZXcgVGV4dCQxKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7IH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc3dpdGNoIChlbC5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIF9QTEFDRUhPTERFUl9UQUckMjpcbiAgICAgICAgICAgICAgICB2YXIgbmFtZUF0dHIgPSBlbC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICdlcXVpdic7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lQXR0cikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBQbGFjZWhvbGRlcignJywgbmFtZUF0dHIudmFsdWUsIGVsLnNvdXJjZVNwYW4pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWwsIFwiPFwiICsgX1BMQUNFSE9MREVSX1RBRyQyICsgXCI+IG1pc3NlcyB0aGUgXFxcImVxdWl2XFxcIiBhdHRyaWJ1dGVcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF9QTEFDRUhPTERFUl9TUEFOTklOR19UQUc6XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0QXR0ciA9IGVsLmF0dHJzLmZpbmQoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZSA9PT0gJ2VxdWl2U3RhcnQnOyB9KTtcbiAgICAgICAgICAgICAgICB2YXIgZW5kQXR0ciA9IGVsLmF0dHJzLmZpbmQoZnVuY3Rpb24gKGF0dHIpIHsgcmV0dXJuIGF0dHIubmFtZSA9PT0gJ2VxdWl2RW5kJzsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydEF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWwsIFwiPFwiICsgX1BMQUNFSE9MREVSX1RBRyQyICsgXCI+IG1pc3NlcyB0aGUgXFxcImVxdWl2U3RhcnRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWVuZEF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWwsIFwiPFwiICsgX1BMQUNFSE9MREVSX1RBRyQyICsgXCI+IG1pc3NlcyB0aGUgXFxcImVxdWl2RW5kXFxcIiBhdHRyaWJ1dGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRJZCA9IHN0YXJ0QXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZElkID0gZW5kQXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBub2Rlcy5jb25jYXQuYXBwbHkobm9kZXMsIF9fc3ByZWFkKFtuZXcgUGxhY2Vob2xkZXIoJycsIHN0YXJ0SWQsIGVsLnNvdXJjZVNwYW4pXSwgZWwuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzLCBudWxsKTsgfSksIFtuZXcgUGxhY2Vob2xkZXIoJycsIGVuZElkLCBlbC5zb3VyY2VTcGFuKV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF9NQVJLRVJfVEFHJDE6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgX19zcHJlYWQodmlzaXRBbGwkMSh0aGlzLCBlbC5jaGlsZHJlbikpKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWwsIFwiVW5leHBlY3RlZCB0YWdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGljdSwgY29udGV4dCkge1xuICAgICAgICB2YXIgY2FzZU1hcCA9IHt9O1xuICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGljdS5jYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgY2FzZU1hcFtjLnZhbHVlXSA9IG5ldyBDb250YWluZXIoYy5ub2RlcywgaWN1LnNvdXJjZVNwYW4pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBJY3UkMShpY3Uuc3dpdGNoVmFsdWUsIGljdS50eXBlLCBjYXNlTWFwLCBpY3Uuc291cmNlU3Bhbik7XG4gICAgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uQ2FzZSA9IGZ1bmN0aW9uIChpY3VDYXNlLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogaWN1Q2FzZS52YWx1ZSxcbiAgICAgICAgICAgIG5vZGVzOiBbXS5jb25jYXQuYXBwbHkoW10sIF9fc3ByZWFkKHZpc2l0QWxsJDEodGhpcywgaWN1Q2FzZS5leHByZXNzaW9uKSkpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS5fYWRkRXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKG5vZGUuc291cmNlU3BhbiwgbWVzc2FnZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFhtbFRvSTE4bjtcbn0oKSk7XG5mdW5jdGlvbiBnZXRUeXBlRm9yVGFnKHRhZykge1xuICAgIHN3aXRjaCAodGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnYnInOlxuICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgY2FzZSAnaSc6XG4gICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgcmV0dXJuICdmbXQnO1xuICAgICAgICBjYXNlICdpbWcnOlxuICAgICAgICAgICAgcmV0dXJuICdpbWFnZSc7XG4gICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgcmV0dXJuICdsaW5rJztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIF9UUkFOU0xBVElPTlNfVEFHID0gJ3RyYW5zbGF0aW9uYnVuZGxlJztcbnZhciBfVFJBTlNMQVRJT05fVEFHID0gJ3RyYW5zbGF0aW9uJztcbnZhciBfUExBQ0VIT0xERVJfVEFHJDMgPSAncGgnO1xudmFyIFh0YiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoWHRiLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFh0YigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBYdGIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG1lc3NhZ2VzLCBsb2NhbGUpIHsgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCcpOyB9O1xuICAgIFh0Yi5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uIChjb250ZW50LCB1cmwpIHtcbiAgICAgICAgLy8geHRiIHRvIHhtbCBub2Rlc1xuICAgICAgICB2YXIgeHRiUGFyc2VyID0gbmV3IFh0YlBhcnNlcigpO1xuICAgICAgICB2YXIgX2EgPSB4dGJQYXJzZXIucGFyc2UoY29udGVudCwgdXJsKSwgbG9jYWxlID0gX2EubG9jYWxlLCBtc2dJZFRvSHRtbCA9IF9hLm1zZ0lkVG9IdG1sLCBlcnJvcnMgPSBfYS5lcnJvcnM7XG4gICAgICAgIC8vIHhtbCBub2RlcyB0byBpMThuIG5vZGVzXG4gICAgICAgIHZhciBpMThuTm9kZXNCeU1zZ0lkID0ge307XG4gICAgICAgIHZhciBjb252ZXJ0ZXIgPSBuZXcgWG1sVG9JMThuJDIoKTtcbiAgICAgICAgLy8gQmVjYXVzZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBsb2FkIHh0YiBmaWxlcyB0aGF0IHJlbHkgb24gZmVhdHVyZXMgbm90IHN1cHBvcnRlZCBieSBhbmd1bGFyLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGRlbGF5IHRoZSBjb252ZXJzaW9uIG9mIGh0bWwgdG8gaTE4biBub2RlcyBzbyB0aGF0IG5vbiBhbmd1bGFyIG1lc3NhZ2VzIGFyZSBub3RcbiAgICAgICAgLy8gY29udmVydGVkXG4gICAgICAgIE9iamVjdC5rZXlzKG1zZ0lkVG9IdG1sKS5mb3JFYWNoKGZ1bmN0aW9uIChtc2dJZCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gY29udmVydGVyLmNvbnZlcnQobXNnSWRUb0h0bWxbbXNnSWRdLCB1cmwpLCBpMThuTm9kZXMgPSBfYS5pMThuTm9kZXMsIGVycm9ycyA9IF9hLmVycm9ycztcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ4dGIgcGFyc2UgZXJyb3JzOlxcblwiICsgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkxOG5Ob2RlcztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjcmVhdGVMYXp5UHJvcGVydHkoaTE4bk5vZGVzQnlNc2dJZCwgbXNnSWQsIHZhbHVlRm4pO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInh0YiBwYXJzZSBlcnJvcnM6XFxuXCIgKyBlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxvY2FsZTogbG9jYWxlLCBpMThuTm9kZXNCeU1zZ0lkOiBpMThuTm9kZXNCeU1zZ0lkIH07XG4gICAgfTtcbiAgICBYdGIucHJvdG90eXBlLmRpZ2VzdCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7IHJldHVybiBkaWdlc3QkMShtZXNzYWdlKTsgfTtcbiAgICBYdGIucHJvdG90eXBlLmNyZWF0ZU5hbWVNYXBwZXIgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVBsYWNlaG9sZGVyTWFwcGVyKG1lc3NhZ2UsIHRvUHVibGljTmFtZSk7XG4gICAgfTtcbiAgICByZXR1cm4gWHRiO1xufShTZXJpYWxpemVyKSk7XG5mdW5jdGlvbiBjcmVhdGVMYXp5UHJvcGVydHkobWVzc2FnZXMsIGlkLCB2YWx1ZUZuKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2VzLCBpZCwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVGbigpO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2VzLCBpZCwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF8pIHsgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3Qgb3ZlcndyaXRlIGFuIFhUQiB0cmFuc2xhdGlvbicpOyB9LFxuICAgIH0pO1xufVxuLy8gRXh0cmFjdCBtZXNzYWdlcyBhcyB4bWwgbm9kZXMgZnJvbSB0aGUgeHRiIGZpbGVcbnZhciBYdGJQYXJzZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gWHRiUGFyc2VyKCkge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSBudWxsO1xuICAgIH1cbiAgICBYdGJQYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHh0YiwgdXJsKSB7XG4gICAgICAgIHRoaXMuX2J1bmRsZURlcHRoID0gMDtcbiAgICAgICAgdGhpcy5fbXNnSWRUb0h0bWwgPSB7fTtcbiAgICAgICAgLy8gV2UgY2FuIG5vdCBwYXJzZSB0aGUgSUNVIG1lc3NhZ2VzIGF0IHRoaXMgcG9pbnQgYXMgc29tZSBtZXNzYWdlcyBtaWdodCBub3Qgb3JpZ2luYXRlXG4gICAgICAgIC8vIGZyb20gQW5ndWxhciB0aGF0IGNvdWxkIG5vdCBiZSBsZXgnZC5cbiAgICAgICAgdmFyIHhtbCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSh4dGIsIHVybCk7XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IHhtbC5lcnJvcnM7XG4gICAgICAgIHZpc2l0QWxsJDEodGhpcywgeG1sLnJvb3ROb2Rlcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtc2dJZFRvSHRtbDogdGhpcy5fbXNnSWRUb0h0bWwsXG4gICAgICAgICAgICBlcnJvcnM6IHRoaXMuX2Vycm9ycyxcbiAgICAgICAgICAgIGxvY2FsZTogdGhpcy5fbG9jYWxlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgWHRiUGFyc2VyLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29udGV4dCkge1xuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQubmFtZSkge1xuICAgICAgICAgICAgY2FzZSBfVFJBTlNMQVRJT05TX1RBRzpcbiAgICAgICAgICAgICAgICB0aGlzLl9idW5kbGVEZXB0aCsrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9idW5kbGVEZXB0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCI8XCIgKyBfVFJBTlNMQVRJT05TX1RBRyArIFwiPiBlbGVtZW50cyBjYW4gbm90IGJlIG5lc3RlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxhbmdBdHRyID0gZWxlbWVudC5hdHRycy5maW5kKGZ1bmN0aW9uIChhdHRyKSB7IHJldHVybiBhdHRyLm5hbWUgPT09ICdsYW5nJzsgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmdBdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IGxhbmdBdHRyLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2aXNpdEFsbCQxKHRoaXMsIGVsZW1lbnQuY2hpbGRyZW4sIG51bGwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2J1bmRsZURlcHRoLS07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF9UUkFOU0xBVElPTl9UQUc6XG4gICAgICAgICAgICAgICAgdmFyIGlkQXR0ciA9IGVsZW1lbnQuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSAnaWQnOyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlkQXR0cikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihlbGVtZW50LCBcIjxcIiArIF9UUkFOU0xBVElPTl9UQUcgKyBcIj4gbWlzc2VzIHRoZSBcXFwiaWRcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGlkQXR0ci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21zZ0lkVG9IdG1sLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgXCJEdXBsaWNhdGVkIHRyYW5zbGF0aW9ucyBmb3IgbXNnIFwiICsgaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlubmVyVGV4dFN0YXJ0ID0gZWxlbWVudC5zdGFydFNvdXJjZVNwYW4uZW5kLm9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbm5lclRleHRFbmQgPSBlbGVtZW50LmVuZFNvdXJjZVNwYW4uc3RhcnQub2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBlbGVtZW50LnN0YXJ0U291cmNlU3Bhbi5zdGFydC5maWxlLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5uZXJUZXh0ID0gY29udGVudC5zbGljZShpbm5lclRleHRTdGFydCwgaW5uZXJUZXh0RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZ0lkVG9IdG1sW2lkXSA9IGlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWxlbWVudCwgJ1VuZXhwZWN0ZWQgdGFnJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFh0YlBhcnNlci5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgWHRiUGFyc2VyLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY29udGV4dCkgeyB9O1xuICAgIFh0YlBhcnNlci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKGNvbW1lbnQsIGNvbnRleHQpIHsgfTtcbiAgICBYdGJQYXJzZXIucHJvdG90eXBlLnZpc2l0RXhwYW5zaW9uID0gZnVuY3Rpb24gKGV4cGFuc2lvbiwgY29udGV4dCkgeyB9O1xuICAgIFh0YlBhcnNlci5wcm90b3R5cGUudmlzaXRFeHBhbnNpb25DYXNlID0gZnVuY3Rpb24gKGV4cGFuc2lvbkNhc2UsIGNvbnRleHQpIHsgfTtcbiAgICBYdGJQYXJzZXIucHJvdG90eXBlLl9hZGRFcnJvciA9IGZ1bmN0aW9uIChub2RlLCBtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2Vycm9ycy5wdXNoKG5ldyBJMThuRXJyb3Iobm9kZS5zb3VyY2VTcGFuLCBtZXNzYWdlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gWHRiUGFyc2VyO1xufSgpKTtcbi8vIENvbnZlcnQgbWwgbm9kZXMgKHh0YiBzeW50YXgpIHRvIGkxOG4gbm9kZXNcbnZhciBYbWxUb0kxOG4kMiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBYbWxUb0kxOG4oKSB7XG4gICAgfVxuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChtZXNzYWdlLCB1cmwpIHtcbiAgICAgICAgdmFyIHhtbEljdSA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZShtZXNzYWdlLCB1cmwsIHsgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5fZXJyb3JzID0geG1sSWN1LmVycm9ycztcbiAgICAgICAgdmFyIGkxOG5Ob2RlcyA9IHRoaXMuX2Vycm9ycy5sZW5ndGggPiAwIHx8IHhtbEljdS5yb290Tm9kZXMubGVuZ3RoID09IDAgP1xuICAgICAgICAgICAgW10gOlxuICAgICAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCB4bWxJY3Uucm9vdE5vZGVzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGkxOG5Ob2RlczogaTE4bk5vZGVzLFxuICAgICAgICAgICAgZXJyb3JzOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBYbWxUb0kxOG4ucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjb250ZXh0KSB7IHJldHVybiBuZXcgVGV4dCQxKHRleHQudmFsdWUsIHRleHQuc291cmNlU3Bhbik7IH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbiA9IGZ1bmN0aW9uIChpY3UsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNhc2VNYXAgPSB7fTtcbiAgICAgICAgdmlzaXRBbGwkMSh0aGlzLCBpY3UuY2FzZXMpLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgIGNhc2VNYXBbYy52YWx1ZV0gPSBuZXcgQ29udGFpbmVyKGMubm9kZXMsIGljdS5zb3VyY2VTcGFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgSWN1JDEoaWN1LnN3aXRjaFZhbHVlLCBpY3UudHlwZSwgY2FzZU1hcCwgaWN1LnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEV4cGFuc2lvbkNhc2UgPSBmdW5jdGlvbiAoaWN1Q2FzZSwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IGljdUNhc2UudmFsdWUsXG4gICAgICAgICAgICBub2RlczogdmlzaXRBbGwkMSh0aGlzLCBpY3VDYXNlLmV4cHJlc3Npb24pLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGVsLm5hbWUgPT09IF9QTEFDRUhPTERFUl9UQUckMykge1xuICAgICAgICAgICAgdmFyIG5hbWVBdHRyID0gZWwuYXR0cnMuZmluZChmdW5jdGlvbiAoYXR0cikgeyByZXR1cm4gYXR0ci5uYW1lID09PSAnbmFtZSc7IH0pO1xuICAgICAgICAgICAgaWYgKG5hbWVBdHRyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlcignJywgbmFtZUF0dHIudmFsdWUsIGVsLnNvdXJjZVNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYWRkRXJyb3IoZWwsIFwiPFwiICsgX1BMQUNFSE9MREVSX1RBRyQzICsgXCI+IG1pc3NlcyB0aGUgXFxcIm5hbWVcXFwiIGF0dHJpYnV0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZEVycm9yKGVsLCBcIlVuZXhwZWN0ZWQgdGFnXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS52aXNpdENvbW1lbnQgPSBmdW5jdGlvbiAoY29tbWVudCwgY29udGV4dCkgeyB9O1xuICAgIFhtbFRvSTE4bi5wcm90b3R5cGUudmlzaXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlLCBjb250ZXh0KSB7IH07XG4gICAgWG1sVG9JMThuLnByb3RvdHlwZS5fYWRkRXJyb3IgPSBmdW5jdGlvbiAobm9kZSwgbWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9lcnJvcnMucHVzaChuZXcgSTE4bkVycm9yKG5vZGUuc291cmNlU3BhbiwgbWVzc2FnZSkpO1xuICAgIH07XG4gICAgcmV0dXJuIFhtbFRvSTE4bjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSBjb250YWluZXIgZm9yIHRyYW5zbGF0ZWQgbWVzc2FnZXNcbiAqL1xudmFyIFRyYW5zbGF0aW9uQnVuZGxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYW5zbGF0aW9uQnVuZGxlKF9pMThuTm9kZXNCeU1zZ0lkLCBsb2NhbGUsIGRpZ2VzdCwgbWFwcGVyRmFjdG9yeSwgbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3ksIGNvbnNvbGUpIHtcbiAgICAgICAgaWYgKF9pMThuTm9kZXNCeU1zZ0lkID09PSB2b2lkIDApIHsgX2kxOG5Ob2Rlc0J5TXNnSWQgPSB7fTsgfVxuICAgICAgICBpZiAobWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kgPT09IHZvaWQgMCkgeyBtaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSA9IE1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5Lldhcm5pbmc7IH1cbiAgICAgICAgdGhpcy5faTE4bk5vZGVzQnlNc2dJZCA9IF9pMThuTm9kZXNCeU1zZ0lkO1xuICAgICAgICB0aGlzLmRpZ2VzdCA9IGRpZ2VzdDtcbiAgICAgICAgdGhpcy5tYXBwZXJGYWN0b3J5ID0gbWFwcGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5faTE4blRvSHRtbCA9IG5ldyBJMThuVG9IdG1sVmlzaXRvcihfaTE4bk5vZGVzQnlNc2dJZCwgbG9jYWxlLCBkaWdlc3QsIG1hcHBlckZhY3RvcnksIG1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5LCBjb25zb2xlKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIGBUcmFuc2xhdGlvbkJ1bmRsZWAgYnkgcGFyc2luZyB0aGUgZ2l2ZW4gYGNvbnRlbnRgIHdpdGggdGhlIGBzZXJpYWxpemVyYC5cbiAgICBUcmFuc2xhdGlvbkJ1bmRsZS5sb2FkID0gZnVuY3Rpb24gKGNvbnRlbnQsIHVybCwgc2VyaWFsaXplciwgbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3ksIGNvbnNvbGUpIHtcbiAgICAgICAgdmFyIF9hID0gc2VyaWFsaXplci5sb2FkKGNvbnRlbnQsIHVybCksIGxvY2FsZSA9IF9hLmxvY2FsZSwgaTE4bk5vZGVzQnlNc2dJZCA9IF9hLmkxOG5Ob2Rlc0J5TXNnSWQ7XG4gICAgICAgIHZhciBkaWdlc3RGbiA9IGZ1bmN0aW9uIChtKSB7IHJldHVybiBzZXJpYWxpemVyLmRpZ2VzdChtKTsgfTtcbiAgICAgICAgdmFyIG1hcHBlckZhY3RvcnkgPSBmdW5jdGlvbiAobSkgeyByZXR1cm4gc2VyaWFsaXplci5jcmVhdGVOYW1lTWFwcGVyKG0pOyB9O1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zbGF0aW9uQnVuZGxlKGkxOG5Ob2Rlc0J5TXNnSWQsIGxvY2FsZSwgZGlnZXN0Rm4sIG1hcHBlckZhY3RvcnksIG1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5LCBjb25zb2xlKTtcbiAgICB9O1xuICAgIC8vIFJldHVybnMgdGhlIHRyYW5zbGF0aW9uIGFzIEhUTUwgbm9kZXMgZnJvbSB0aGUgZ2l2ZW4gc291cmNlIG1lc3NhZ2UuXG4gICAgVHJhbnNsYXRpb25CdW5kbGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgdmFyIGh0bWwgPSB0aGlzLl9pMThuVG9IdG1sLmNvbnZlcnQoc3JjTXNnKTtcbiAgICAgICAgaWYgKGh0bWwuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGh0bWwuZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbC5ub2RlcztcbiAgICB9O1xuICAgIFRyYW5zbGF0aW9uQnVuZGxlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoc3JjTXNnKSB7IHJldHVybiB0aGlzLmRpZ2VzdChzcmNNc2cpIGluIHRoaXMuX2kxOG5Ob2Rlc0J5TXNnSWQ7IH07XG4gICAgcmV0dXJuIFRyYW5zbGF0aW9uQnVuZGxlO1xufSgpKTtcbnZhciBJMThuVG9IdG1sVmlzaXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJMThuVG9IdG1sVmlzaXRvcihfaTE4bk5vZGVzQnlNc2dJZCwgX2xvY2FsZSwgX2RpZ2VzdCwgX21hcHBlckZhY3RvcnksIF9taXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSwgX2NvbnNvbGUpIHtcbiAgICAgICAgaWYgKF9pMThuTm9kZXNCeU1zZ0lkID09PSB2b2lkIDApIHsgX2kxOG5Ob2Rlc0J5TXNnSWQgPSB7fTsgfVxuICAgICAgICB0aGlzLl9pMThuTm9kZXNCeU1zZ0lkID0gX2kxOG5Ob2Rlc0J5TXNnSWQ7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7XG4gICAgICAgIHRoaXMuX2RpZ2VzdCA9IF9kaWdlc3Q7XG4gICAgICAgIHRoaXMuX21hcHBlckZhY3RvcnkgPSBfbWFwcGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5fbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kgPSBfbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3k7XG4gICAgICAgIHRoaXMuX2NvbnNvbGUgPSBfY29uc29sZTtcbiAgICAgICAgdGhpcy5fY29udGV4dFN0YWNrID0gW107XG4gICAgICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgIH1cbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dFN0YWNrLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2Vycm9ycy5sZW5ndGggPSAwO1xuICAgICAgICAvLyBpMThuIHRvIHRleHRcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLl9jb252ZXJ0VG9UZXh0KHNyY01zZyk7XG4gICAgICAgIC8vIHRleHQgdG8gaHRtbFxuICAgICAgICB2YXIgdXJsID0gc3JjTXNnLm5vZGVzWzBdLnNvdXJjZVNwYW4uc3RhcnQuZmlsZS51cmw7XG4gICAgICAgIHZhciBodG1sID0gbmV3IEh0bWxQYXJzZXIoKS5wYXJzZSh0ZXh0LCB1cmwsIHsgdG9rZW5pemVFeHBhbnNpb25Gb3JtczogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVzOiBodG1sLnJvb3ROb2RlcyxcbiAgICAgICAgICAgIGVycm9yczogX19zcHJlYWQodGhpcy5fZXJyb3JzLCBodG1sLmVycm9ycyksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gYGNvbnZlcnQoKWAgdXNlcyBhbiBgSHRtbFBhcnNlcmAgdG8gcmV0dXJuIGBodG1sLk5vZGVgc1xuICAgICAgICAvLyB3ZSBzaG91bGQgdGhlbiBtYWtlIHN1cmUgdGhhdCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkXG4gICAgICAgIHJldHVybiBlc2NhcGVYbWwodGV4dC52YWx1ZSk7XG4gICAgfTtcbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBjb250YWluZXIuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uIChuKSB7IHJldHVybiBuLnZpc2l0KF90aGlzKTsgfSkuam9pbignJyk7XG4gICAgfTtcbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjYXNlcyA9IE9iamVjdC5rZXlzKGljdS5jYXNlcykubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBrICsgXCIge1wiICsgaWN1LmNhc2VzW2tdLnZpc2l0KF90aGlzKSArIFwifVwiOyB9KTtcbiAgICAgICAgLy8gVE9ETyh2aWNiKTogT25jZSBhbGwgZm9ybWF0IHN3aXRjaCB0byB1c2luZyBleHByZXNzaW9uIHBsYWNlaG9sZGVyc1xuICAgICAgICAvLyB3ZSBzaG91bGQgdGhyb3cgd2hlbiB0aGUgcGxhY2Vob2xkZXIgaXMgbm90IGluIHRoZSBzb3VyY2UgbWVzc2FnZVxuICAgICAgICB2YXIgZXhwID0gdGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVycy5oYXNPd25Qcm9wZXJ0eShpY3UuZXhwcmVzc2lvbikgP1xuICAgICAgICAgICAgdGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVyc1tpY3UuZXhwcmVzc2lvbl0gOlxuICAgICAgICAgICAgaWN1LmV4cHJlc3Npb247XG4gICAgICAgIHJldHVybiBcIntcIiArIGV4cCArIFwiLCBcIiArIGljdS50eXBlICsgXCIsIFwiICsgY2FzZXMuam9pbignICcpICsgXCJ9XCI7XG4gICAgfTtcbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUudmlzaXRQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgY29udGV4dCkge1xuICAgICAgICB2YXIgcGhOYW1lID0gdGhpcy5fbWFwcGVyKHBoLm5hbWUpO1xuICAgICAgICBpZiAodGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVycy5oYXNPd25Qcm9wZXJ0eShwaE5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVyc1twaE5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zcmNNc2cucGxhY2Vob2xkZXJUb01lc3NhZ2UuaGFzT3duUHJvcGVydHkocGhOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRUb1RleHQodGhpcy5fc3JjTXNnLnBsYWNlaG9sZGVyVG9NZXNzYWdlW3BoTmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZEVycm9yKHBoLCBcIlVua25vd24gcGxhY2Vob2xkZXIgXFxcIlwiICsgcGgubmFtZSArIFwiXFxcIlwiKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgLy8gTG9hZGVkIG1lc3NhZ2UgY29udGFpbnMgb25seSBwbGFjZWhvbGRlcnMgKHZzIHRhZyBhbmQgaWN1IHBsYWNlaG9sZGVycykuXG4gICAgLy8gSG93ZXZlciB3aGVuIGEgdHJhbnNsYXRpb24gY2FuIG5vdCBiZSBmb3VuZCwgd2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIHNvdXJjZSBtZXNzYWdlXG4gICAgLy8gd2hpY2ggY2FuIGNvbnRhaW4gdGFnIHBsYWNlaG9sZGVyc1xuICAgIEkxOG5Ub0h0bWxWaXNpdG9yLnByb3RvdHlwZS52aXNpdFRhZ1BsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciB0YWcgPSBcIlwiICsgcGgudGFnO1xuICAgICAgICB2YXIgYXR0cnMgPSBPYmplY3Qua2V5cyhwaC5hdHRycykubWFwKGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBuYW1lICsgXCI9XFxcIlwiICsgcGguYXR0cnNbbmFtZV0gKyBcIlxcXCJcIjsgfSkuam9pbignICcpO1xuICAgICAgICBpZiAocGguaXNWb2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gXCI8XCIgKyB0YWcgKyBcIiBcIiArIGF0dHJzICsgXCIvPlwiO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHBoLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy52aXNpdChfdGhpcyk7IH0pLmpvaW4oJycpO1xuICAgICAgICByZXR1cm4gXCI8XCIgKyB0YWcgKyBcIiBcIiArIGF0dHJzICsgXCI+XCIgKyBjaGlsZHJlbiArIFwiPC9cIiArIHRhZyArIFwiPlwiO1xuICAgIH07XG4gICAgLy8gTG9hZGVkIG1lc3NhZ2UgY29udGFpbnMgb25seSBwbGFjZWhvbGRlcnMgKHZzIHRhZyBhbmQgaWN1IHBsYWNlaG9sZGVycykuXG4gICAgLy8gSG93ZXZlciB3aGVuIGEgdHJhbnNsYXRpb24gY2FuIG5vdCBiZSBmb3VuZCwgd2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIHNvdXJjZSBtZXNzYWdlXG4gICAgLy8gd2hpY2ggY2FuIGNvbnRhaW4gdGFnIHBsYWNlaG9sZGVyc1xuICAgIEkxOG5Ub0h0bWxWaXNpdG9yLnByb3RvdHlwZS52aXNpdEljdVBsYWNlaG9sZGVyID0gZnVuY3Rpb24gKHBoLCBjb250ZXh0KSB7XG4gICAgICAgIC8vIEFuIElDVSBwbGFjZWhvbGRlciByZWZlcmVuY2VzIHRoZSBzb3VyY2UgbWVzc2FnZSB0byBiZSBzZXJpYWxpemVkXG4gICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0VG9UZXh0KHRoaXMuX3NyY01zZy5wbGFjZWhvbGRlclRvTWVzc2FnZVtwaC5uYW1lXSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgc291cmNlIG1lc3NhZ2UgdG8gYSB0cmFuc2xhdGVkIHRleHQgc3RyaW5nOlxuICAgICAqIC0gdGV4dCBub2RlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGVpciB0cmFuc2xhdGlvbixcbiAgICAgKiAtIHBsYWNlaG9sZGVycyBhcmUgcmVwbGFjZWQgd2l0aCB0aGVpciBjb250ZW50LFxuICAgICAqIC0gSUNVIG5vZGVzIGFyZSBjb252ZXJ0ZWQgdG8gSUNVIGV4cHJlc3Npb25zLlxuICAgICAqL1xuICAgIEkxOG5Ub0h0bWxWaXNpdG9yLnByb3RvdHlwZS5fY29udmVydFRvVGV4dCA9IGZ1bmN0aW9uIChzcmNNc2cpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGlkID0gdGhpcy5fZGlnZXN0KHNyY01zZyk7XG4gICAgICAgIHZhciBtYXBwZXIgPSB0aGlzLl9tYXBwZXJGYWN0b3J5ID8gdGhpcy5fbWFwcGVyRmFjdG9yeShzcmNNc2cpIDogbnVsbDtcbiAgICAgICAgdmFyIG5vZGVzO1xuICAgICAgICB0aGlzLl9jb250ZXh0U3RhY2sucHVzaCh7IG1zZzogdGhpcy5fc3JjTXNnLCBtYXBwZXI6IHRoaXMuX21hcHBlciB9KTtcbiAgICAgICAgdGhpcy5fc3JjTXNnID0gc3JjTXNnO1xuICAgICAgICBpZiAodGhpcy5faTE4bk5vZGVzQnlNc2dJZC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgYSB0cmFuc2xhdGlvbiB1c2UgaXRzIG5vZGVzIGFzIHRoZSBzb3VyY2VcbiAgICAgICAgICAgIC8vIEFuZCBjcmVhdGUgYSBtYXBwZXIgdG8gY29udmVydCBzZXJpYWxpemVkIHBsYWNlaG9sZGVyIG5hbWVzIHRvIGludGVybmFsIG5hbWVzXG4gICAgICAgICAgICBub2RlcyA9IHRoaXMuX2kxOG5Ob2Rlc0J5TXNnSWRbaWRdO1xuICAgICAgICAgICAgdGhpcy5fbWFwcGVyID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hcHBlciA/IG1hcHBlci50b0ludGVybmFsTmFtZShuYW1lKSA6IG5hbWU7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXaGVuIG5vIHRyYW5zbGF0aW9uIGhhcyBiZWVuIGZvdW5kXG4gICAgICAgICAgICAvLyAtIHJlcG9ydCBhbiBlcnJvciAvIGEgd2FybmluZyAvIG5vdGhpbmcsXG4gICAgICAgICAgICAvLyAtIHVzZSB0aGUgbm9kZXMgZnJvbSB0aGUgb3JpZ2luYWwgbWVzc2FnZVxuICAgICAgICAgICAgLy8gLSBwbGFjZWhvbGRlcnMgYXJlIGFscmVhZHkgaW50ZXJuYWwgYW5kIG5lZWQgbm8gbWFwcGVyXG4gICAgICAgICAgICBpZiAodGhpcy5fbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kgPT09IE1pc3NpbmdUcmFuc2xhdGlvblN0cmF0ZWd5LkVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2xvY2FsZSA/IFwiIGZvciBsb2NhbGUgXFxcIlwiICsgdGhpcy5fbG9jYWxlICsgXCJcXFwiXCIgOiAnJztcbiAgICAgICAgICAgICAgICB0aGlzLl9hZGRFcnJvcihzcmNNc2cubm9kZXNbMF0sIFwiTWlzc2luZyB0cmFuc2xhdGlvbiBmb3IgbWVzc2FnZSBcXFwiXCIgKyBpZCArIFwiXFxcIlwiICsgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NvbnNvbGUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9taXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSA9PT0gTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kuV2FybmluZykge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9sb2NhbGUgPyBcIiBmb3IgbG9jYWxlIFxcXCJcIiArIHRoaXMuX2xvY2FsZSArIFwiXFxcIlwiIDogJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29uc29sZS53YXJuKFwiTWlzc2luZyB0cmFuc2xhdGlvbiBmb3IgbWVzc2FnZSBcXFwiXCIgKyBpZCArIFwiXFxcIlwiICsgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVzID0gc3JjTXNnLm5vZGVzO1xuICAgICAgICAgICAgdGhpcy5fbWFwcGVyID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG5hbWU7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHQgPSBub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMpOyB9KS5qb2luKCcnKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9jb250ZXh0U3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMuX3NyY01zZyA9IGNvbnRleHQubXNnO1xuICAgICAgICB0aGlzLl9tYXBwZXIgPSBjb250ZXh0Lm1hcHBlcjtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcbiAgICBJMThuVG9IdG1sVmlzaXRvci5wcm90b3R5cGUuX2FkZEVycm9yID0gZnVuY3Rpb24gKGVsLCBtc2cpIHtcbiAgICAgICAgdGhpcy5fZXJyb3JzLnB1c2gobmV3IEkxOG5FcnJvcihlbC5zb3VyY2VTcGFuLCBtc2cpKTtcbiAgICB9O1xuICAgIHJldHVybiBJMThuVG9IdG1sVmlzaXRvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBJMThOSHRtbFBhcnNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJMThOSHRtbFBhcnNlcihfaHRtbFBhcnNlciwgdHJhbnNsYXRpb25zLCB0cmFuc2xhdGlvbnNGb3JtYXQsIG1pc3NpbmdUcmFuc2xhdGlvbiwgY29uc29sZSkge1xuICAgICAgICBpZiAobWlzc2luZ1RyYW5zbGF0aW9uID09PSB2b2lkIDApIHsgbWlzc2luZ1RyYW5zbGF0aW9uID0gTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kuV2FybmluZzsgfVxuICAgICAgICB0aGlzLl9odG1sUGFyc2VyID0gX2h0bWxQYXJzZXI7XG4gICAgICAgIGlmICh0cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBzZXJpYWxpemVyID0gY3JlYXRlU2VyaWFsaXplcih0cmFuc2xhdGlvbnNGb3JtYXQpO1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRpb25CdW5kbGUgPVxuICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uQnVuZGxlLmxvYWQodHJhbnNsYXRpb25zLCAnaTE4bicsIHNlcmlhbGl6ZXIsIG1pc3NpbmdUcmFuc2xhdGlvbiwgY29uc29sZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2xhdGlvbkJ1bmRsZSA9XG4gICAgICAgICAgICAgICAgbmV3IFRyYW5zbGF0aW9uQnVuZGxlKHt9LCBudWxsLCBkaWdlc3QsIHVuZGVmaW5lZCwgbWlzc2luZ1RyYW5zbGF0aW9uLCBjb25zb2xlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBJMThOSHRtbFBhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoc291cmNlLCB1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFyIGludGVycG9sYXRpb25Db25maWcgPSBvcHRpb25zLmludGVycG9sYXRpb25Db25maWcgfHwgREVGQVVMVF9JTlRFUlBPTEFUSU9OX0NPTkZJRztcbiAgICAgICAgdmFyIHBhcnNlUmVzdWx0ID0gdGhpcy5faHRtbFBhcnNlci5wYXJzZShzb3VyY2UsIHVybCwgX19hc3NpZ24oeyBpbnRlcnBvbGF0aW9uQ29uZmlnOiBpbnRlcnBvbGF0aW9uQ29uZmlnIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgaWYgKHBhcnNlUmVzdWx0LmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VUcmVlUmVzdWx0KHBhcnNlUmVzdWx0LnJvb3ROb2RlcywgcGFyc2VSZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VUcmFuc2xhdGlvbnMocGFyc2VSZXN1bHQucm9vdE5vZGVzLCB0aGlzLl90cmFuc2xhdGlvbkJ1bmRsZSwgaW50ZXJwb2xhdGlvbkNvbmZpZywgW10sIHt9KTtcbiAgICB9O1xuICAgIHJldHVybiBJMThOSHRtbFBhcnNlcjtcbn0oKSk7XG5mdW5jdGlvbiBjcmVhdGVTZXJpYWxpemVyKGZvcm1hdCkge1xuICAgIGZvcm1hdCA9IChmb3JtYXQgfHwgJ3hsZicpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgICAgY2FzZSAneG1iJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgWG1iKCk7XG4gICAgICAgIGNhc2UgJ3h0Yic6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFh0YigpO1xuICAgICAgICBjYXNlICd4bGlmZjInOlxuICAgICAgICBjYXNlICd4bGYyJzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgWGxpZmYyKCk7XG4gICAgICAgIGNhc2UgJ3hsaWZmJzpcbiAgICAgICAgY2FzZSAneGxmJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBuZXcgWGxpZmYoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBRVU9URURfS0VZUyA9ICckcXVvdGVkJCc7XG5mdW5jdGlvbiBjb252ZXJ0VmFsdWVUb091dHB1dEFzdChjdHgsIHZhbHVlLCB0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gbnVsbDsgfVxuICAgIHJldHVybiB2aXNpdFZhbHVlKHZhbHVlLCBuZXcgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIoY3R4KSwgdHlwZSk7XG59XG52YXIgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIoY3R4KSB7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgIH1cbiAgICBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRBcnJheSA9IGZ1bmN0aW9uIChhcnIsIHR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoYXJyLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZpc2l0VmFsdWUodmFsdWUsIF90aGlzLCBudWxsKTsgfSksIHR5cGUpO1xuICAgIH07XG4gICAgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwID0gZnVuY3Rpb24gKG1hcCwgdHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgICB2YXIgcXVvdGVkU2V0ID0gbmV3IFNldChtYXAgJiYgbWFwW1FVT1RFRF9LRVlTXSk7XG4gICAgICAgIE9iamVjdC5rZXlzKG1hcCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2gobmV3IExpdGVyYWxNYXBFbnRyeShrZXksIHZpc2l0VmFsdWUobWFwW2tleV0sIF90aGlzLCBudWxsKSwgcXVvdGVkU2V0LmhhcyhrZXkpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IExpdGVyYWxNYXBFeHByKGVudHJpZXMsIHR5cGUpO1xuICAgIH07XG4gICAgX1ZhbHVlT3V0cHV0QXN0VHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UHJpbWl0aXZlID0gZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7IHJldHVybiBsaXRlcmFsKHZhbHVlLCB0eXBlKTsgfTtcbiAgICBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRPdGhlciA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdHguaW1wb3J0RXhwcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBfVmFsdWVPdXRwdXRBc3RUcmFuc2Zvcm1lcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIG1hcEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4geyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLCBxdW90ZWQ6IGZhbHNlIH07XG59XG52YXIgSW5qZWN0YWJsZUNvbXBpbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluamVjdGFibGVDb21waWxlcihyZWZsZWN0b3IsIGFsd2F5c0dlbmVyYXRlRGVmKSB7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgICAgICB0aGlzLmFsd2F5c0dlbmVyYXRlRGVmID0gYWx3YXlzR2VuZXJhdGVEZWY7XG4gICAgICAgIHRoaXMudG9rZW5JbmplY3RvciA9IHJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuSW5qZWN0b3IpO1xuICAgIH1cbiAgICBJbmplY3RhYmxlQ29tcGlsZXIucHJvdG90eXBlLmRlcHNBcnJheSA9IGZ1bmN0aW9uIChkZXBzLCBjdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGRlcHMubWFwKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgICAgICAgIHZhciB0b2tlbiA9IGRlcDtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW3Rva2VuXTtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IDAgLyogRGVmYXVsdCAqLztcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGRlcFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Lm5nTWV0YWRhdGFOYW1lID09PSAnT3B0aW9uYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gOCAvKiBPcHRpb25hbCAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYubmdNZXRhZGF0YU5hbWUgPT09ICdTa2lwU2VsZicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSA0IC8qIFNraXBTZWxmICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodi5uZ01ldGFkYXRhTmFtZSA9PT0gJ1NlbGYnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gMiAvKiBTZWxmICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodi5uZ01ldGFkYXRhTmFtZSA9PT0gJ0luamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHYudG9rZW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdG9rZW5FeHByO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0b2tlbkV4cHIgPSBsaXRlcmFsKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuID09PSBfdGhpcy50b2tlbkluamVjdG9yKSB7XG4gICAgICAgICAgICAgICAgdG9rZW5FeHByID0gaW1wb3J0RXhwcihJZGVudGlmaWVycy5JTkpFQ1RPUik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2tlbkV4cHIgPSBjdHguaW1wb3J0RXhwcih0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmxhZ3MgIT09IDAgLyogRGVmYXVsdCAqLykge1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBbdG9rZW5FeHByLCBsaXRlcmFsKGZsYWdzKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcmdzID0gW3Rva2VuRXhwcl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycy5pbmplY3QpLmNhbGxGbihhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBJbmplY3RhYmxlQ29tcGlsZXIucHJvdG90eXBlLmZhY3RvcnlGb3IgPSBmdW5jdGlvbiAoaW5qZWN0YWJsZSwgY3R4KSB7XG4gICAgICAgIHZhciByZXRWYWx1ZTtcbiAgICAgICAgaWYgKGluamVjdGFibGUudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgICAgIHJldFZhbHVlID0gaW1wb3J0RXhwcihJZGVudGlmaWVycy5pbmplY3QpLmNhbGxGbihbY3R4LmltcG9ydEV4cHIoaW5qZWN0YWJsZS51c2VFeGlzdGluZyldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmplY3RhYmxlLnVzZUZhY3RvcnkpIHtcbiAgICAgICAgICAgIHZhciBkZXBzID0gaW5qZWN0YWJsZS5kZXBzIHx8IFtdO1xuICAgICAgICAgICAgaWYgKGRlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldFZhbHVlID0gY3R4LmltcG9ydEV4cHIoaW5qZWN0YWJsZS51c2VGYWN0b3J5KS5jYWxsRm4odGhpcy5kZXBzQXJyYXkoZGVwcywgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmltcG9ydEV4cHIoaW5qZWN0YWJsZS51c2VGYWN0b3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmplY3RhYmxlLnVzZVZhbHVlKSB7XG4gICAgICAgICAgICByZXRWYWx1ZSA9IGNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0KGN0eCwgaW5qZWN0YWJsZS51c2VWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY2xhenogPSBpbmplY3RhYmxlLnVzZUNsYXNzIHx8IGluamVjdGFibGUuc3ltYm9sO1xuICAgICAgICAgICAgdmFyIGRlcEFyZ3MgPSB0aGlzLmRlcHNBcnJheSh0aGlzLnJlZmxlY3Rvci5wYXJhbWV0ZXJzKGNsYXp6KSwgY3R4KTtcbiAgICAgICAgICAgIHJldFZhbHVlID0gbmV3IEluc3RhbnRpYXRlRXhwcihjdHguaW1wb3J0RXhwcihjbGF6eiksIGRlcEFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbihbXSwgW25ldyBSZXR1cm5TdGF0ZW1lbnQocmV0VmFsdWUpXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluamVjdGFibGUuc3ltYm9sLm5hbWUgKyAnX0ZhY3RvcnknKTtcbiAgICB9O1xuICAgIEluamVjdGFibGVDb21waWxlci5wcm90b3R5cGUuaW5qZWN0YWJsZURlZiA9IGZ1bmN0aW9uIChpbmplY3RhYmxlLCBjdHgpIHtcbiAgICAgICAgdmFyIHByb3ZpZGVkSW4gPSBOVUxMX0VYUFI7XG4gICAgICAgIGlmIChpbmplY3RhYmxlLnByb3ZpZGVkSW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGluamVjdGFibGUucHJvdmlkZWRJbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVkSW4gPSBOVUxMX0VYUFI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgaW5qZWN0YWJsZS5wcm92aWRlZEluID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVkSW4gPSBsaXRlcmFsKGluamVjdGFibGUucHJvdmlkZWRJbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlZEluID0gY3R4LmltcG9ydEV4cHIoaW5qZWN0YWJsZS5wcm92aWRlZEluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVmID0gW1xuICAgICAgICAgICAgbWFwRW50cnkoJ2ZhY3RvcnknLCB0aGlzLmZhY3RvcnlGb3IoaW5qZWN0YWJsZSwgY3R4KSksXG4gICAgICAgICAgICBtYXBFbnRyeSgndG9rZW4nLCBjdHguaW1wb3J0RXhwcihpbmplY3RhYmxlLnR5cGUucmVmZXJlbmNlKSksXG4gICAgICAgICAgICBtYXBFbnRyeSgncHJvdmlkZWRJbicsIHByb3ZpZGVkSW4pLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycy7Jtcm1ZGVmaW5lSW5qZWN0YWJsZSkuY2FsbEZuKFtsaXRlcmFsTWFwKGRlZildKTtcbiAgICB9O1xuICAgIEluamVjdGFibGVDb21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uIChpbmplY3RhYmxlLCBjdHgpIHtcbiAgICAgICAgaWYgKHRoaXMuYWx3YXlzR2VuZXJhdGVEZWYgfHwgaW5qZWN0YWJsZS5wcm92aWRlZEluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBpZGVudGlmaWVyTmFtZShpbmplY3RhYmxlLnR5cGUpO1xuICAgICAgICAgICAgdmFyIGNsYXp6ID0gbmV3IENsYXNzU3RtdChjbGFzc05hbWUsIG51bGwsIFtcbiAgICAgICAgICAgICAgICBuZXcgQ2xhc3NGaWVsZCgnbmdJbmplY3RhYmxlRGVmJywgSU5GRVJSRURfVFlQRSwgW1N0bXRNb2RpZmllci5TdGF0aWNdLCB0aGlzLmluamVjdGFibGVEZWYoaW5qZWN0YWJsZSwgY3R4KSksXG4gICAgICAgICAgICBdLCBbXSwgbmV3IENsYXNzTWV0aG9kKG51bGwsIFtdLCBbXSksIFtdKTtcbiAgICAgICAgICAgIGN0eC5zdGF0ZW1lbnRzLnB1c2goY2xhenopO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSW5qZWN0YWJsZUNvbXBpbGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFNUUklQX1NSQ19GSUxFX1NVRkZJWEVTID0gLyhcXC50c3xcXC5kXFwudHN8XFwuanN8XFwuanN4fFxcLnRzeCkkLztcbnZhciBHRU5FUkFURURfRklMRSA9IC9cXC5uZ2ZhY3RvcnlcXC58XFwubmdzdW1tYXJ5XFwuLztcbnZhciBKSVRfU1VNTUFSWV9GSUxFID0gL1xcLm5nc3VtbWFyeVxcLi87XG52YXIgSklUX1NVTU1BUllfTkFNRSA9IC9OZ1N1bW1hcnkkLztcbmZ1bmN0aW9uIG5nZmFjdG9yeUZpbGVQYXRoKGZpbGVQYXRoLCBmb3JjZVNvdXJjZUZpbGUpIHtcbiAgICBpZiAoZm9yY2VTb3VyY2VGaWxlID09PSB2b2lkIDApIHsgZm9yY2VTb3VyY2VGaWxlID0gZmFsc2U7IH1cbiAgICB2YXIgdXJsV2l0aFN1ZmZpeCA9IHNwbGl0VHlwZXNjcmlwdFN1ZmZpeChmaWxlUGF0aCwgZm9yY2VTb3VyY2VGaWxlKTtcbiAgICByZXR1cm4gdXJsV2l0aFN1ZmZpeFswXSArIFwiLm5nZmFjdG9yeVwiICsgbm9ybWFsaXplR2VuRmlsZVN1ZmZpeCh1cmxXaXRoU3VmZml4WzFdKTtcbn1cbmZ1bmN0aW9uIHN0cmlwR2VuZXJhdGVkRmlsZVN1ZmZpeChmaWxlUGF0aCkge1xuICAgIHJldHVybiBmaWxlUGF0aC5yZXBsYWNlKEdFTkVSQVRFRF9GSUxFLCAnLicpO1xufVxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRGaWxlKGZpbGVQYXRoKSB7XG4gICAgcmV0dXJuIEdFTkVSQVRFRF9GSUxFLnRlc3QoZmlsZVBhdGgpO1xufVxuZnVuY3Rpb24gc3BsaXRUeXBlc2NyaXB0U3VmZml4KHBhdGgsIGZvcmNlU291cmNlRmlsZSkge1xuICAgIGlmIChmb3JjZVNvdXJjZUZpbGUgPT09IHZvaWQgMCkgeyBmb3JjZVNvdXJjZUZpbGUgPSBmYWxzZTsgfVxuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuZC50cycpKSB7XG4gICAgICAgIHJldHVybiBbcGF0aC5zbGljZSgwLCAtNSksIGZvcmNlU291cmNlRmlsZSA/ICcudHMnIDogJy5kLnRzJ107XG4gICAgfVxuICAgIHZhciBsYXN0RG90ID0gcGF0aC5sYXN0SW5kZXhPZignLicpO1xuICAgIGlmIChsYXN0RG90ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gW3BhdGguc3Vic3RyaW5nKDAsIGxhc3REb3QpLCBwYXRoLnN1YnN0cmluZyhsYXN0RG90KV07XG4gICAgfVxuICAgIHJldHVybiBbcGF0aCwgJyddO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplR2VuRmlsZVN1ZmZpeChzcmNGaWxlU3VmZml4KSB7XG4gICAgcmV0dXJuIHNyY0ZpbGVTdWZmaXggPT09ICcudHN4JyA/ICcudHMnIDogc3JjRmlsZVN1ZmZpeDtcbn1cbmZ1bmN0aW9uIHN1bW1hcnlGaWxlTmFtZShmaWxlTmFtZSkge1xuICAgIHZhciBmaWxlTmFtZVdpdGhvdXRTdWZmaXggPSBmaWxlTmFtZS5yZXBsYWNlKFNUUklQX1NSQ19GSUxFX1NVRkZJWEVTLCAnJyk7XG4gICAgcmV0dXJuIGZpbGVOYW1lV2l0aG91dFN1ZmZpeCArIFwiLm5nc3VtbWFyeS5qc29uXCI7XG59XG5mdW5jdGlvbiBzdW1tYXJ5Rm9ySml0RmlsZU5hbWUoZmlsZU5hbWUsIGZvcmNlU291cmNlRmlsZSkge1xuICAgIGlmIChmb3JjZVNvdXJjZUZpbGUgPT09IHZvaWQgMCkgeyBmb3JjZVNvdXJjZUZpbGUgPSBmYWxzZTsgfVxuICAgIHZhciB1cmxXaXRoU3VmZml4ID0gc3BsaXRUeXBlc2NyaXB0U3VmZml4KHN0cmlwR2VuZXJhdGVkRmlsZVN1ZmZpeChmaWxlTmFtZSksIGZvcmNlU291cmNlRmlsZSk7XG4gICAgcmV0dXJuIHVybFdpdGhTdWZmaXhbMF0gKyBcIi5uZ3N1bW1hcnlcIiArIHVybFdpdGhTdWZmaXhbMV07XG59XG5mdW5jdGlvbiBzdHJpcFN1bW1hcnlGb3JKaXRGaWxlU3VmZml4KGZpbGVQYXRoKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLnJlcGxhY2UoSklUX1NVTU1BUllfRklMRSwgJy4nKTtcbn1cbmZ1bmN0aW9uIHN1bW1hcnlGb3JKaXROYW1lKHN5bWJvbE5hbWUpIHtcbiAgICByZXR1cm4gc3ltYm9sTmFtZSArIFwiTmdTdW1tYXJ5XCI7XG59XG5mdW5jdGlvbiBzdHJpcFN1bW1hcnlGb3JKaXROYW1lU3VmZml4KHN5bWJvbE5hbWUpIHtcbiAgICByZXR1cm4gc3ltYm9sTmFtZS5yZXBsYWNlKEpJVF9TVU1NQVJZX05BTUUsICcnKTtcbn1cbnZhciBMT1dFUkVEX1NZTUJPTCA9IC9cXHUwMjc1XFxkKy87XG5mdW5jdGlvbiBpc0xvd2VyZWRTeW1ib2wobmFtZSkge1xuICAgIHJldHVybiBMT1dFUkVEX1NZTUJPTC50ZXN0KG5hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlTG93ZXJlZFN5bWJvbChpZCkge1xuICAgIHJldHVybiBcIlxcdTAyNzVcIiArIGlkO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgTGlmZWN5Y2xlSG9va3M7XG4oZnVuY3Rpb24gKExpZmVjeWNsZUhvb2tzKSB7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3NbXCJPbkluaXRcIl0gPSAwXSA9IFwiT25Jbml0XCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3NbXCJPbkRlc3Ryb3lcIl0gPSAxXSA9IFwiT25EZXN0cm95XCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3NbXCJEb0NoZWNrXCJdID0gMl0gPSBcIkRvQ2hlY2tcIjtcbiAgICBMaWZlY3ljbGVIb29rc1tMaWZlY3ljbGVIb29rc1tcIk9uQ2hhbmdlc1wiXSA9IDNdID0gXCJPbkNoYW5nZXNcIjtcbiAgICBMaWZlY3ljbGVIb29rc1tMaWZlY3ljbGVIb29rc1tcIkFmdGVyQ29udGVudEluaXRcIl0gPSA0XSA9IFwiQWZ0ZXJDb250ZW50SW5pdFwiO1xuICAgIExpZmVjeWNsZUhvb2tzW0xpZmVjeWNsZUhvb2tzW1wiQWZ0ZXJDb250ZW50Q2hlY2tlZFwiXSA9IDVdID0gXCJBZnRlckNvbnRlbnRDaGVja2VkXCI7XG4gICAgTGlmZWN5Y2xlSG9va3NbTGlmZWN5Y2xlSG9va3NbXCJBZnRlclZpZXdJbml0XCJdID0gNl0gPSBcIkFmdGVyVmlld0luaXRcIjtcbiAgICBMaWZlY3ljbGVIb29rc1tMaWZlY3ljbGVIb29rc1tcIkFmdGVyVmlld0NoZWNrZWRcIl0gPSA3XSA9IFwiQWZ0ZXJWaWV3Q2hlY2tlZFwiO1xufSkoTGlmZWN5Y2xlSG9va3MgfHwgKExpZmVjeWNsZUhvb2tzID0ge30pKTtcbnZhciBMSUZFQ1lDTEVfSE9PS1NfVkFMVUVTID0gW1xuICAgIExpZmVjeWNsZUhvb2tzLk9uSW5pdCwgTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95LCBMaWZlY3ljbGVIb29rcy5Eb0NoZWNrLCBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXMsXG4gICAgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50SW5pdCwgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50Q2hlY2tlZCwgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdCxcbiAgICBMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdDaGVja2VkXG5dO1xuZnVuY3Rpb24gaGFzTGlmZWN5Y2xlSG9vayhyZWZsZWN0b3IsIGhvb2ssIHRva2VuKSB7XG4gICAgcmV0dXJuIHJlZmxlY3Rvci5oYXNMaWZlY3ljbGVIb29rKHRva2VuLCBnZXRIb29rTmFtZShob29rKSk7XG59XG5mdW5jdGlvbiBnZXRBbGxMaWZlY3ljbGVIb29rcyhyZWZsZWN0b3IsIHRva2VuKSB7XG4gICAgcmV0dXJuIExJRkVDWUNMRV9IT09LU19WQUxVRVMuZmlsdGVyKGZ1bmN0aW9uIChob29rKSB7IHJldHVybiBoYXNMaWZlY3ljbGVIb29rKHJlZmxlY3RvciwgaG9vaywgdG9rZW4pOyB9KTtcbn1cbmZ1bmN0aW9uIGdldEhvb2tOYW1lKGhvb2spIHtcbiAgICBzd2l0Y2ggKGhvb2spIHtcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkluaXQ6XG4gICAgICAgICAgICByZXR1cm4gJ25nT25Jbml0JztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3k6XG4gICAgICAgICAgICByZXR1cm4gJ25nT25EZXN0cm95JztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5Eb0NoZWNrOlxuICAgICAgICAgICAgcmV0dXJuICduZ0RvQ2hlY2snO1xuICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLk9uQ2hhbmdlczpcbiAgICAgICAgICAgIHJldHVybiAnbmdPbkNoYW5nZXMnO1xuICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQ6XG4gICAgICAgICAgICByZXR1cm4gJ25nQWZ0ZXJDb250ZW50SW5pdCc7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50Q2hlY2tlZDpcbiAgICAgICAgICAgIHJldHVybiAnbmdBZnRlckNvbnRlbnRDaGVja2VkJztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdJbml0OlxuICAgICAgICAgICAgcmV0dXJuICduZ0FmdGVyVmlld0luaXQnO1xuICAgICAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICAgICAgICByZXR1cm4gJ25nQWZ0ZXJWaWV3Q2hlY2tlZCc7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIGRlZmF1bHQgY2FzZSBpcyBub3QgbmVlZGVkIGJ5IFR5cGVTY3JpcHQgY29tcGlsZXIsIGFzIHRoZSBzd2l0Y2ggaXMgZXhoYXVzdGl2ZS5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIgQ2xvc3VyZSBDb21waWxlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgYW5kIHJlcG9ydHMgYW4gZXJyb3IgaW4gdHlwZWQgbW9kZS5cbiAgICAgICAgICAgIC8vIFRoZSBgdGhyb3cgbmV3IEVycm9yYCBiZWxvdyB3b3JrcyBhcm91bmQgdGhlIHByb2JsZW0sIGFuZCB0aGUgdW5leHBlY3RlZDogbmV2ZXIgdmFyaWFibGVcbiAgICAgICAgICAgIC8vIG1ha2VzIHN1cmUgdHNjIHN0aWxsIGNoZWNrcyB0aGlzIGNvZGUgaXMgdW5yZWFjaGFibGUuXG4gICAgICAgICAgICB2YXIgdW5leHBlY3RlZCA9IGhvb2s7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmV4cGVjdGVkIFwiICsgdW5leHBlY3RlZCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRVJST1JfQ09NUE9ORU5UX1RZUEUgPSAnbmdDb21wb25lbnRUeXBlJztcbi8vIERlc2lnbiBub3Rlczpcbi8vIC0gZG9uJ3QgbGF6aWx5IGNyZWF0ZSBtZXRhZGF0YTpcbi8vICAgRm9yIHNvbWUgbWV0YWRhdGEsIHdlIG5lZWQgdG8gZG8gYXN5bmMgd29yayBzb21ldGltZXMsXG4vLyAgIHNvIHRoZSB1c2VyIGhhcyB0byBraWNrIG9mZiB0aGlzIGxvYWRpbmcuXG4vLyAgIEJ1dCB3ZSB3YW50IHRvIHJlcG9ydCBlcnJvcnMgZXZlbiB3aGVuIHRoZSBhc3luYyB3b3JrIGlzXG4vLyAgIG5vdCByZXF1aXJlZCB0byBjaGVjayB0aGF0IHRoZSB1c2VyIHdvdWxkIGhhdmUgYmVlbiBhYmxlXG4vLyAgIHRvIHdhaXQgY29ycmVjdGx5LlxudmFyIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyKF9jb25maWcsIF9odG1sUGFyc2VyLCBfbmdNb2R1bGVSZXNvbHZlciwgX2RpcmVjdGl2ZVJlc29sdmVyLCBfcGlwZVJlc29sdmVyLCBfc3VtbWFyeVJlc29sdmVyLCBfc2NoZW1hUmVnaXN0cnksIF9kaXJlY3RpdmVOb3JtYWxpemVyLCBfY29uc29sZSwgX3N0YXRpY1N5bWJvbENhY2hlLCBfcmVmbGVjdG9yLCBfZXJyb3JDb2xsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gX2NvbmZpZztcbiAgICAgICAgdGhpcy5faHRtbFBhcnNlciA9IF9odG1sUGFyc2VyO1xuICAgICAgICB0aGlzLl9uZ01vZHVsZVJlc29sdmVyID0gX25nTW9kdWxlUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX2RpcmVjdGl2ZVJlc29sdmVyID0gX2RpcmVjdGl2ZVJlc29sdmVyO1xuICAgICAgICB0aGlzLl9waXBlUmVzb2x2ZXIgPSBfcGlwZVJlc29sdmVyO1xuICAgICAgICB0aGlzLl9zdW1tYXJ5UmVzb2x2ZXIgPSBfc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICB0aGlzLl9zY2hlbWFSZWdpc3RyeSA9IF9zY2hlbWFSZWdpc3RyeTtcbiAgICAgICAgdGhpcy5fZGlyZWN0aXZlTm9ybWFsaXplciA9IF9kaXJlY3RpdmVOb3JtYWxpemVyO1xuICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7XG4gICAgICAgIHRoaXMuX3N0YXRpY1N5bWJvbENhY2hlID0gX3N0YXRpY1N5bWJvbENhY2hlO1xuICAgICAgICB0aGlzLl9yZWZsZWN0b3IgPSBfcmVmbGVjdG9yO1xuICAgICAgICB0aGlzLl9lcnJvckNvbGxlY3RvciA9IF9lcnJvckNvbGxlY3RvcjtcbiAgICAgICAgdGhpcy5fbm9uTm9ybWFsaXplZERpcmVjdGl2ZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9kaXJlY3RpdmVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9waXBlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX25nTW9kdWxlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX25nTW9kdWxlT2ZUeXBlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fc2hhbGxvd01vZHVsZUNhY2hlID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0UmVmbGVjdG9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVmbGVjdG9yOyB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIGRpck1ldGEgPSB0aGlzLl9kaXJlY3RpdmVDYWNoZS5nZXQodHlwZSk7XG4gICAgICAgIHRoaXMuX2RpcmVjdGl2ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdGhpcy5fbm9uTm9ybWFsaXplZERpcmVjdGl2ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdGhpcy5fcGlwZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdGhpcy5fbmdNb2R1bGVPZlR5cGVzLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIG9mIHRoZSBOZ01vZHVsZSBhcyB0aGV5IGNvbnRhaW4gdHJhbnNpdGl2ZSBpbmZvcm1hdGlvbiFcbiAgICAgICAgdGhpcy5fbmdNb2R1bGVDYWNoZS5jbGVhcigpO1xuICAgICAgICBpZiAoZGlyTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aXZlTm9ybWFsaXplci5jbGVhckNhY2hlRm9yKGRpck1ldGEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuY2xlYXJDYWNoZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aXZlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fbm9uTm9ybWFsaXplZERpcmVjdGl2ZUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9waXBlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fbmdNb2R1bGVDYWNoZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9uZ01vZHVsZU9mVHlwZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fZGlyZWN0aXZlTm9ybWFsaXplci5jbGVhckNhY2hlKCk7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2NyZWF0ZVByb3h5Q2xhc3MgPSBmdW5jdGlvbiAoYmFzZVR5cGUsIG5hbWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gbnVsbDtcbiAgICAgICAgdmFyIHByb3h5Q2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWRlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZTogQ2xhc3MgXCIgKyBuYW1lICsgXCIgZm9yIHR5cGUgXCIgKyBzdHJpbmdpZnkoYmFzZVR5cGUpICsgXCIgaXMgbm90IGNvbXBpbGVkIHlldCFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgcHJveHlDbGFzcy5zZXREZWxlZ2F0ZSA9IGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICBkZWxlZ2F0ZSA9IGQ7XG4gICAgICAgICAgICBwcm94eUNsYXNzLnByb3RvdHlwZSA9IGQucHJvdG90eXBlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBNYWtlIHN0cmluZ2lmeSB3b3JrIGNvcnJlY3RseVxuICAgICAgICBwcm94eUNsYXNzLm92ZXJyaWRkZW5OYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHByb3h5Q2xhc3M7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0R2VuZXJhdGVkQ2xhc3MgPSBmdW5jdGlvbiAoZGlyVHlwZSwgbmFtZSkge1xuICAgICAgICBpZiAoZGlyVHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRpY1N5bWJvbENhY2hlLmdldChuZ2ZhY3RvcnlGaWxlUGF0aChkaXJUeXBlLmZpbGVQYXRoKSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUHJveHlDbGFzcyhkaXJUeXBlLCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldENvbXBvbmVudFZpZXdDbGFzcyA9IGZ1bmN0aW9uIChkaXJUeXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEdlbmVyYXRlZENsYXNzKGRpclR5cGUsIHZpZXdDbGFzc05hbWUoZGlyVHlwZSwgMCkpO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldEhvc3RDb21wb25lbnRWaWV3Q2xhc3MgPSBmdW5jdGlvbiAoZGlyVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRHZW5lcmF0ZWRDbGFzcyhkaXJUeXBlLCBob3N0Vmlld0NsYXNzTmFtZShkaXJUeXBlKSk7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0SG9zdENvbXBvbmVudFR5cGUgPSBmdW5jdGlvbiAoZGlyVHlwZSkge1xuICAgICAgICB2YXIgbmFtZSA9IGlkZW50aWZpZXJOYW1lKHsgcmVmZXJlbmNlOiBkaXJUeXBlIH0pICsgXCJfSG9zdFwiO1xuICAgICAgICBpZiAoZGlyVHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRpY1N5bWJvbENhY2hlLmdldChkaXJUeXBlLmZpbGVQYXRoLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUHJveHlDbGFzcyhkaXJUeXBlLCBuYW1lKTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXRSZW5kZXJlclR5cGUgPSBmdW5jdGlvbiAoZGlyVHlwZSkge1xuICAgICAgICBpZiAoZGlyVHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRpY1N5bWJvbENhY2hlLmdldChuZ2ZhY3RvcnlGaWxlUGF0aChkaXJUeXBlLmZpbGVQYXRoKSwgcmVuZGVyZXJUeXBlTmFtZShkaXJUeXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyByZXR1cm5pbmcgYW4gb2JqZWN0IGFzIHByb3h5LFxuICAgICAgICAgICAgLy8gdGhhdCB3ZSBmaWxsIGxhdGVyIGR1cmluZyBydW50aW1lIGNvbXBpbGF0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0Q29tcG9uZW50RmFjdG9yeSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgZGlyVHlwZSwgaW5wdXRzLCBvdXRwdXRzKSB7XG4gICAgICAgIGlmIChkaXJUeXBlIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGljU3ltYm9sQ2FjaGUuZ2V0KG5nZmFjdG9yeUZpbGVQYXRoKGRpclR5cGUuZmlsZVBhdGgpLCBjb21wb25lbnRGYWN0b3J5TmFtZShkaXJUeXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgaG9zdFZpZXcgPSB0aGlzLmdldEhvc3RDb21wb25lbnRWaWV3Q2xhc3MoZGlyVHlwZSk7XG4gICAgICAgICAgICAvLyBOb3RlOiBuZ0NvbnRlbnRTZWxlY3RvcnMgd2lsbCBiZSBmaWxsZWQgbGF0ZXIgb25jZSB0aGUgdGVtcGxhdGUgaXNcbiAgICAgICAgICAgIC8vIGxvYWRlZC5cbiAgICAgICAgICAgIHZhciBjcmVhdGVDb21wb25lbnRGYWN0b3J5ID0gdGhpcy5fcmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5jcmVhdGVDb21wb25lbnRGYWN0b3J5KTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb21wb25lbnRGYWN0b3J5KHNlbGVjdG9yLCBkaXJUeXBlLCBob3N0VmlldywgaW5wdXRzLCBvdXRwdXRzLCBbXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5pbml0Q29tcG9uZW50RmFjdG9yeSA9IGZ1bmN0aW9uIChmYWN0b3J5LCBuZ0NvbnRlbnRTZWxlY3RvcnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIShmYWN0b3J5IGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSkge1xuICAgICAgICAgICAgKF9hID0gZmFjdG9yeS5uZ0NvbnRlbnRTZWxlY3RvcnMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkKG5nQ29udGVudFNlbGVjdG9ycykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2xvYWRTdW1tYXJ5ID0gZnVuY3Rpb24gKHR5cGUsIGtpbmQpIHtcbiAgICAgICAgdmFyIHR5cGVTdW1tYXJ5ID0gdGhpcy5fc3VtbWFyeUNhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKCF0eXBlU3VtbWFyeSkge1xuICAgICAgICAgICAgdmFyIHN1bW1hcnkgPSB0aGlzLl9zdW1tYXJ5UmVzb2x2ZXIucmVzb2x2ZVN1bW1hcnkodHlwZSk7XG4gICAgICAgICAgICB0eXBlU3VtbWFyeSA9IHN1bW1hcnkgPyBzdW1tYXJ5LnR5cGUgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLnNldCh0eXBlLCB0eXBlU3VtbWFyeSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZVN1bW1hcnkgJiYgdHlwZVN1bW1hcnkuc3VtbWFyeUtpbmQgPT09IGtpbmQgPyB0eXBlU3VtbWFyeSA6IG51bGw7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0SG9zdENvbXBvbmVudE1ldGFkYXRhID0gZnVuY3Rpb24gKGNvbXBNZXRhLCBob3N0Vmlld1R5cGUpIHtcbiAgICAgICAgdmFyIGhvc3RUeXBlID0gdGhpcy5nZXRIb3N0Q29tcG9uZW50VHlwZShjb21wTWV0YS50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgIGlmICghaG9zdFZpZXdUeXBlKSB7XG4gICAgICAgICAgICBob3N0Vmlld1R5cGUgPSB0aGlzLmdldEhvc3RDb21wb25lbnRWaWV3Q2xhc3MoaG9zdFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6ICEgaXMgb2sgaGVyZSBhcyB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBub3JtYWxpemVkIGRpcmVjdGl2ZVxuICAgICAgICAvLyBtZXRhZGF0YSwgd2hpY2ggYWx3YXlzIGZpbGxzIGluIHRoZSBzZWxlY3Rvci5cbiAgICAgICAgdmFyIHRlbXBsYXRlID0gQ3NzU2VsZWN0b3IucGFyc2UoY29tcE1ldGEuc2VsZWN0b3IpWzBdLmdldE1hdGNoaW5nRWxlbWVudFRlbXBsYXRlKCk7XG4gICAgICAgIHZhciB0ZW1wbGF0ZVVybCA9ICcnO1xuICAgICAgICB2YXIgaHRtbEFzdCA9IHRoaXMuX2h0bWxQYXJzZXIucGFyc2UodGVtcGxhdGUsIHRlbXBsYXRlVXJsKTtcbiAgICAgICAgcmV0dXJuIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5jcmVhdGUoe1xuICAgICAgICAgICAgaXNIb3N0OiB0cnVlLFxuICAgICAgICAgICAgdHlwZTogeyByZWZlcmVuY2U6IGhvc3RUeXBlLCBkaURlcHM6IFtdLCBsaWZlY3ljbGVIb29rczogW10gfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICBodG1sQXN0OiBodG1sQXN0LFxuICAgICAgICAgICAgICAgIHN0eWxlczogW10sXG4gICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbXSxcbiAgICAgICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IFtdLFxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgIGlzSW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsU3R5bGVzaGVldHM6IFtdLFxuICAgICAgICAgICAgICAgIGludGVycG9sYXRpb246IG51bGwsXG4gICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiBudWxsLFxuICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxuICAgICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICAgICAgaG9zdDoge30sXG4gICAgICAgICAgICBpc0NvbXBvbmVudDogdHJ1ZSxcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnKicsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtdLFxuICAgICAgICAgICAgdmlld1Byb3ZpZGVyczogW10sXG4gICAgICAgICAgICBxdWVyaWVzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczoge30sXG4gICAgICAgICAgICB2aWV3UXVlcmllczogW10sXG4gICAgICAgICAgICBjb21wb25lbnRWaWV3VHlwZTogaG9zdFZpZXdUeXBlLFxuICAgICAgICAgICAgcmVuZGVyZXJUeXBlOiB7IGlkOiAnX19Ib3N0X18nLCBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLCBzdHlsZXM6IFtdLCBkYXRhOiB7fSB9LFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3Rvcnk6IG51bGxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUubG9hZERpcmVjdGl2ZU1ldGFkYXRhID0gZnVuY3Rpb24gKG5nTW9kdWxlVHlwZSwgZGlyZWN0aXZlVHlwZSwgaXNTeW5jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9kaXJlY3RpdmVDYWNoZS5oYXMoZGlyZWN0aXZlVHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZVR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZihkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5nZXROb25Ob3JtYWxpemVkRGlyZWN0aXZlTWV0YWRhdGEoZGlyZWN0aXZlVHlwZSksIGFubm90YXRpb24gPSBfYS5hbm5vdGF0aW9uLCBtZXRhZGF0YSA9IF9hLm1ldGFkYXRhO1xuICAgICAgICB2YXIgY3JlYXRlRGlyZWN0aXZlTWV0YWRhdGEgPSBmdW5jdGlvbiAodGVtcGxhdGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWREaXJNZXRhID0gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgaXNIb3N0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBtZXRhZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIGlzQ29tcG9uZW50OiBtZXRhZGF0YS5pc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogbWV0YWRhdGEuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgZXhwb3J0QXM6IG1ldGFkYXRhLmV4cG9ydEFzLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogbWV0YWRhdGEuY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlucHV0czogbWV0YWRhdGEuaW5wdXRzLFxuICAgICAgICAgICAgICAgIG91dHB1dHM6IG1ldGFkYXRhLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWV0YWRhdGEuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICBob3N0UHJvcGVydGllczogbWV0YWRhdGEuaG9zdFByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgaG9zdEF0dHJpYnV0ZXM6IG1ldGFkYXRhLmhvc3RBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyczogbWV0YWRhdGEucHJvdmlkZXJzLFxuICAgICAgICAgICAgICAgIHZpZXdQcm92aWRlcnM6IG1ldGFkYXRhLnZpZXdQcm92aWRlcnMsXG4gICAgICAgICAgICAgICAgcXVlcmllczogbWV0YWRhdGEucXVlcmllcyxcbiAgICAgICAgICAgICAgICBndWFyZHM6IG1ldGFkYXRhLmd1YXJkcyxcbiAgICAgICAgICAgICAgICB2aWV3UXVlcmllczogbWV0YWRhdGEudmlld1F1ZXJpZXMsXG4gICAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBtZXRhZGF0YS5lbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Vmlld1R5cGU6IG1ldGFkYXRhLmNvbXBvbmVudFZpZXdUeXBlLFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyVHlwZTogbWV0YWRhdGEucmVuZGVyZXJUeXBlLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3Rvcnk6IG1ldGFkYXRhLmNvbXBvbmVudEZhY3RvcnksXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlTWV0YWRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5pbml0Q29tcG9uZW50RmFjdG9yeShtZXRhZGF0YS5jb21wb25lbnRGYWN0b3J5LCB0ZW1wbGF0ZU1ldGFkYXRhLm5nQ29udGVudFNlbGVjdG9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fZGlyZWN0aXZlQ2FjaGUuc2V0KGRpcmVjdGl2ZVR5cGUsIG5vcm1hbGl6ZWREaXJNZXRhKTtcbiAgICAgICAgICAgIF90aGlzLl9zdW1tYXJ5Q2FjaGUuc2V0KGRpcmVjdGl2ZVR5cGUsIG5vcm1hbGl6ZWREaXJNZXRhLnRvU3VtbWFyeSgpKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0YWRhdGEuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IG1ldGFkYXRhLnRlbXBsYXRlO1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTWV0YSA9IHRoaXMuX2RpcmVjdGl2ZU5vcm1hbGl6ZXIubm9ybWFsaXplVGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlVHlwZTogbmdNb2R1bGVUeXBlLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IGRpcmVjdGl2ZVR5cGUsXG4gICAgICAgICAgICAgICAgbW9kdWxlVXJsOiB0aGlzLl9yZWZsZWN0b3IuY29tcG9uZW50TW9kdWxlVXJsKGRpcmVjdGl2ZVR5cGUsIGFubm90YXRpb24pLFxuICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IHRlbXBsYXRlLmVuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZS50ZW1wbGF0ZVVybCxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IHRlbXBsYXRlLnN0eWxlcyxcbiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IHRlbXBsYXRlLnN0eWxlVXJscyxcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zOiB0ZW1wbGF0ZS5hbmltYXRpb25zLFxuICAgICAgICAgICAgICAgIGludGVycG9sYXRpb246IHRlbXBsYXRlLmludGVycG9sYXRpb24sXG4gICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogdGVtcGxhdGUucHJlc2VydmVXaGl0ZXNwYWNlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHRlbXBsYXRlTWV0YSkgJiYgaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoY29tcG9uZW50U3RpbGxMb2FkaW5nRXJyb3IoZGlyZWN0aXZlVHlwZSksIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFN5bmNBc3luYy50aGVuKHRlbXBsYXRlTWV0YSwgY3JlYXRlRGlyZWN0aXZlTWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlyZWN0aXZlXG4gICAgICAgICAgICBjcmVhdGVEaXJlY3RpdmVNZXRhZGF0YShudWxsKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0Tm9uTm9ybWFsaXplZERpcmVjdGl2ZU1ldGFkYXRhID0gZnVuY3Rpb24gKGRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgZGlyZWN0aXZlVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjYWNoZUVudHJ5ID0gdGhpcy5fbm9uTm9ybWFsaXplZERpcmVjdGl2ZUNhY2hlLmdldChkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgaWYgKGNhY2hlRW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaXJNZXRhID0gdGhpcy5fZGlyZWN0aXZlUmVzb2x2ZXIucmVzb2x2ZShkaXJlY3RpdmVUeXBlLCBmYWxzZSk7XG4gICAgICAgIGlmICghZGlyTWV0YSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vbk5vcm1hbGl6ZWRUZW1wbGF0ZU1ldGFkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY3JlYXRlQ29tcG9uZW50LmlzVHlwZU9mKGRpck1ldGEpKSB7XG4gICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgIHZhciBjb21wTWV0YSA9IGRpck1ldGE7XG4gICAgICAgICAgICBhc3NlcnRBcnJheU9mU3RyaW5ncygnc3R5bGVzJywgY29tcE1ldGEuc3R5bGVzKTtcbiAgICAgICAgICAgIGFzc2VydEFycmF5T2ZTdHJpbmdzKCdzdHlsZVVybHMnLCBjb21wTWV0YS5zdHlsZVVybHMpO1xuICAgICAgICAgICAgYXNzZXJ0SW50ZXJwb2xhdGlvblN5bWJvbHMoJ2ludGVycG9sYXRpb24nLCBjb21wTWV0YS5pbnRlcnBvbGF0aW9uKTtcbiAgICAgICAgICAgIHZhciBhbmltYXRpb25zID0gY29tcE1ldGEuYW5pbWF0aW9ucztcbiAgICAgICAgICAgIG5vbk5vcm1hbGl6ZWRUZW1wbGF0ZU1ldGFkYXRhID0gbmV3IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBub1VuZGVmaW5lZChjb21wTWV0YS5lbmNhcHN1bGF0aW9uKSxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogbm9VbmRlZmluZWQoY29tcE1ldGEudGVtcGxhdGUpLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiBub1VuZGVmaW5lZChjb21wTWV0YS50ZW1wbGF0ZVVybCksXG4gICAgICAgICAgICAgICAgaHRtbEFzdDogbnVsbCxcbiAgICAgICAgICAgICAgICBzdHlsZXM6IGNvbXBNZXRhLnN0eWxlcyB8fCBbXSxcbiAgICAgICAgICAgICAgICBzdHlsZVVybHM6IGNvbXBNZXRhLnN0eWxlVXJscyB8fCBbXSxcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zOiBhbmltYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgICAgIGludGVycG9sYXRpb246IG5vVW5kZWZpbmVkKGNvbXBNZXRhLmludGVycG9sYXRpb24pLFxuICAgICAgICAgICAgICAgIGlzSW5saW5lOiAhIWNvbXBNZXRhLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsU3R5bGVzaGVldHM6IFtdLFxuICAgICAgICAgICAgICAgIG5nQ29udGVudFNlbGVjdG9yczogW10sXG4gICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogbm9VbmRlZmluZWQoZGlyTWV0YS5wcmVzZXJ2ZVdoaXRlc3BhY2VzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9IG51bGw7XG4gICAgICAgIHZhciB2aWV3UHJvdmlkZXJzID0gW107XG4gICAgICAgIHZhciBlbnRyeUNvbXBvbmVudE1ldGFkYXRhID0gW107XG4gICAgICAgIHZhciBzZWxlY3RvciA9IGRpck1ldGEuc2VsZWN0b3I7XG4gICAgICAgIGlmIChjcmVhdGVDb21wb25lbnQuaXNUeXBlT2YoZGlyTWV0YSkpIHtcbiAgICAgICAgICAgIC8vIENvbXBvbmVudFxuICAgICAgICAgICAgdmFyIGNvbXBNZXRhID0gZGlyTWV0YTtcbiAgICAgICAgICAgIGNoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gY29tcE1ldGEuY2hhbmdlRGV0ZWN0aW9uO1xuICAgICAgICAgICAgaWYgKGNvbXBNZXRhLnZpZXdQcm92aWRlcnMpIHtcbiAgICAgICAgICAgICAgICB2aWV3UHJvdmlkZXJzID0gdGhpcy5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEoY29tcE1ldGEudmlld1Byb3ZpZGVycywgZW50cnlDb21wb25lbnRNZXRhZGF0YSwgXCJ2aWV3UHJvdmlkZXJzIGZvciBcXFwiXCIgKyBzdHJpbmdpZnlUeXBlKGRpcmVjdGl2ZVR5cGUpICsgXCJcXFwiXCIsIFtdLCBkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21wTWV0YS5lbnRyeUNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudE1ldGFkYXRhID0gZmxhdHRlbkFuZERlZHVwZUFycmF5KGNvbXBNZXRhLmVudHJ5Q29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gX3RoaXMuX2dldEVudHJ5Q29tcG9uZW50TWV0YWRhdGEodHlwZSk7IH0pXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQoZW50cnlDb21wb25lbnRNZXRhZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgPSB0aGlzLl9zY2hlbWFSZWdpc3RyeS5nZXREZWZhdWx0Q29tcG9uZW50RWxlbWVudE5hbWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIERpcmVjdGl2ZVxuICAgICAgICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiRGlyZWN0aXZlIFwiICsgc3RyaW5naWZ5VHlwZShkaXJlY3RpdmVUeXBlKSArIFwiIGhhcyBubyBzZWxlY3RvciwgcGxlYXNlIGFkZCBpdCFcIiksIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gJ2Vycm9yJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvdmlkZXJzID0gW107XG4gICAgICAgIGlmIChkaXJNZXRhLnByb3ZpZGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBwcm92aWRlcnMgPSB0aGlzLl9nZXRQcm92aWRlcnNNZXRhZGF0YShkaXJNZXRhLnByb3ZpZGVycywgZW50cnlDb21wb25lbnRNZXRhZGF0YSwgXCJwcm92aWRlcnMgZm9yIFxcXCJcIiArIHN0cmluZ2lmeVR5cGUoZGlyZWN0aXZlVHlwZSkgKyBcIlxcXCJcIiwgW10sIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBxdWVyaWVzID0gW107XG4gICAgICAgIHZhciB2aWV3UXVlcmllcyA9IFtdO1xuICAgICAgICBpZiAoZGlyTWV0YS5xdWVyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJpZXMgPSB0aGlzLl9nZXRRdWVyaWVzTWV0YWRhdGEoZGlyTWV0YS5xdWVyaWVzLCBmYWxzZSwgZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgICB2aWV3UXVlcmllcyA9IHRoaXMuX2dldFF1ZXJpZXNNZXRhZGF0YShkaXJNZXRhLnF1ZXJpZXMsIHRydWUsIGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5jcmVhdGUoe1xuICAgICAgICAgICAgaXNIb3N0OiBmYWxzZSxcbiAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgIGV4cG9ydEFzOiBub1VuZGVmaW5lZChkaXJNZXRhLmV4cG9ydEFzKSxcbiAgICAgICAgICAgIGlzQ29tcG9uZW50OiAhIW5vbk5vcm1hbGl6ZWRUZW1wbGF0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgdHlwZTogdGhpcy5fZ2V0VHlwZU1ldGFkYXRhKGRpcmVjdGl2ZVR5cGUpLFxuICAgICAgICAgICAgdGVtcGxhdGU6IG5vbk5vcm1hbGl6ZWRUZW1wbGF0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICAgICAgICAgIGlucHV0czogZGlyTWV0YS5pbnB1dHMgfHwgW10sXG4gICAgICAgICAgICBvdXRwdXRzOiBkaXJNZXRhLm91dHB1dHMgfHwgW10sXG4gICAgICAgICAgICBob3N0OiBkaXJNZXRhLmhvc3QgfHwge30sXG4gICAgICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyB8fCBbXSxcbiAgICAgICAgICAgIHZpZXdQcm92aWRlcnM6IHZpZXdQcm92aWRlcnMgfHwgW10sXG4gICAgICAgICAgICBxdWVyaWVzOiBxdWVyaWVzIHx8IFtdLFxuICAgICAgICAgICAgZ3VhcmRzOiBkaXJNZXRhLmd1YXJkcyB8fCB7fSxcbiAgICAgICAgICAgIHZpZXdRdWVyaWVzOiB2aWV3UXVlcmllcyB8fCBbXSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogZW50cnlDb21wb25lbnRNZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbXBvbmVudFZpZXdUeXBlOiBub25Ob3JtYWxpemVkVGVtcGxhdGVNZXRhZGF0YSA/IHRoaXMuZ2V0Q29tcG9uZW50Vmlld0NsYXNzKGRpcmVjdGl2ZVR5cGUpIDpcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcmVuZGVyZXJUeXBlOiBub25Ob3JtYWxpemVkVGVtcGxhdGVNZXRhZGF0YSA/IHRoaXMuZ2V0UmVuZGVyZXJUeXBlKGRpcmVjdGl2ZVR5cGUpIDogbnVsbCxcbiAgICAgICAgICAgIGNvbXBvbmVudEZhY3Rvcnk6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub25Ob3JtYWxpemVkVGVtcGxhdGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgbWV0YWRhdGEuY29tcG9uZW50RmFjdG9yeSA9XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb21wb25lbnRGYWN0b3J5KHNlbGVjdG9yLCBkaXJlY3RpdmVUeXBlLCBtZXRhZGF0YS5pbnB1dHMsIG1ldGFkYXRhLm91dHB1dHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlRW50cnkgPSB7IG1ldGFkYXRhOiBtZXRhZGF0YSwgYW5ub3RhdGlvbjogZGlyTWV0YSB9O1xuICAgICAgICB0aGlzLl9ub25Ob3JtYWxpemVkRGlyZWN0aXZlQ2FjaGUuc2V0KGRpcmVjdGl2ZVR5cGUsIGNhY2hlRW50cnkpO1xuICAgICAgICByZXR1cm4gY2FjaGVFbnRyeTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW4gZGlyZWN0aXZlLlxuICAgICAqIFRoaXMgYXNzdW1lcyBgbG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhYCBoYXMgYmVlbiBjYWxsZWQgZmlyc3QuXG4gICAgICovXG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldERpcmVjdGl2ZU1ldGFkYXRhID0gZnVuY3Rpb24gKGRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgdmFyIGRpck1ldGEgPSB0aGlzLl9kaXJlY3RpdmVDYWNoZS5nZXQoZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgIGlmICghZGlyTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBnZXREaXJlY3RpdmVNZXRhZGF0YSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgbG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhIGZvciBhIG1vZHVsZSB0aGF0IGRlY2xhcmVzIGl0LiBEaXJlY3RpdmUgXCIgKyBzdHJpbmdpZnlUeXBlKGRpcmVjdGl2ZVR5cGUpICsgXCIuXCIpLCBkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlyTWV0YTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXREaXJlY3RpdmVTdW1tYXJ5ID0gZnVuY3Rpb24gKGRpclR5cGUpIHtcbiAgICAgICAgdmFyIGRpclN1bW1hcnkgPSB0aGlzLl9sb2FkU3VtbWFyeShkaXJUeXBlLCBDb21waWxlU3VtbWFyeUtpbmQuRGlyZWN0aXZlKTtcbiAgICAgICAgaWYgKCFkaXJTdW1tYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihzeW50YXhFcnJvcihcIklsbGVnYWwgc3RhdGU6IENvdWxkIG5vdCBsb2FkIHRoZSBzdW1tYXJ5IGZvciBkaXJlY3RpdmUgXCIgKyBzdHJpbmdpZnlUeXBlKGRpclR5cGUpICsgXCIuXCIpLCBkaXJUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlyU3VtbWFyeTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5pc0RpcmVjdGl2ZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2xvYWRTdW1tYXJ5KHR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUpIHx8XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVSZXNvbHZlci5pc0RpcmVjdGl2ZSh0eXBlKTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5pc1BpcGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9sb2FkU3VtbWFyeSh0eXBlLCBDb21waWxlU3VtbWFyeUtpbmQuUGlwZSkgfHxcbiAgICAgICAgICAgIHRoaXMuX3BpcGVSZXNvbHZlci5pc1BpcGUodHlwZSk7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuaXNOZ01vZHVsZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2xvYWRTdW1tYXJ5KHR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5OZ01vZHVsZSkgfHxcbiAgICAgICAgICAgIHRoaXMuX25nTW9kdWxlUmVzb2x2ZXIuaXNOZ01vZHVsZSh0eXBlKTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXROZ01vZHVsZVN1bW1hcnkgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSwgYWxyZWFkeUNvbGxlY3RpbmcpIHtcbiAgICAgICAgaWYgKGFscmVhZHlDb2xsZWN0aW5nID09PSB2b2lkIDApIHsgYWxyZWFkeUNvbGxlY3RpbmcgPSBudWxsOyB9XG4gICAgICAgIHZhciBtb2R1bGVTdW1tYXJ5ID0gdGhpcy5fbG9hZFN1bW1hcnkobW9kdWxlVHlwZSwgQ29tcGlsZVN1bW1hcnlLaW5kLk5nTW9kdWxlKTtcbiAgICAgICAgaWYgKCFtb2R1bGVTdW1tYXJ5KSB7XG4gICAgICAgICAgICB2YXIgbW9kdWxlTWV0YSA9IHRoaXMuZ2V0TmdNb2R1bGVNZXRhZGF0YShtb2R1bGVUeXBlLCBmYWxzZSwgYWxyZWFkeUNvbGxlY3RpbmcpO1xuICAgICAgICAgICAgbW9kdWxlU3VtbWFyeSA9IG1vZHVsZU1ldGEgPyBtb2R1bGVNZXRhLnRvU3VtbWFyeSgpIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChtb2R1bGVTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLnNldChtb2R1bGVUeXBlLCBtb2R1bGVTdW1tYXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlU3VtbWFyeTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBkZWNsYXJlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBvZiBhbiBOZ01vZHVsZS5cbiAgICAgKi9cbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUubG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGlzU3luYywgdGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aHJvd0lmTm90Rm91bmQgPT09IHZvaWQgMCkgeyB0aHJvd0lmTm90Rm91bmQgPSB0cnVlOyB9XG4gICAgICAgIHZhciBuZ01vZHVsZSA9IHRoaXMuZ2V0TmdNb2R1bGVNZXRhZGF0YShtb2R1bGVUeXBlLCB0aHJvd0lmTm90Rm91bmQpO1xuICAgICAgICB2YXIgbG9hZGluZyA9IFtdO1xuICAgICAgICBpZiAobmdNb2R1bGUpIHtcbiAgICAgICAgICAgIG5nTW9kdWxlLmRlY2xhcmVkRGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gX3RoaXMubG9hZERpcmVjdGl2ZU1ldGFkYXRhKG1vZHVsZVR5cGUsIGlkLnJlZmVyZW5jZSwgaXNTeW5jKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnB1c2gocHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IHJldHVybiBfdGhpcy5fbG9hZFBpcGVNZXRhZGF0YShpZC5yZWZlcmVuY2UpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZyk7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0U2hhbGxvd01vZHVsZU1ldGFkYXRhID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgdmFyIGNvbXBpbGVNZXRhID0gdGhpcy5fc2hhbGxvd01vZHVsZUNhY2hlLmdldChtb2R1bGVUeXBlKTtcbiAgICAgICAgaWYgKGNvbXBpbGVNZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU1ldGE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5nTW9kdWxlTWV0YSA9IGZpbmRMYXN0KHRoaXMuX3JlZmxlY3Rvci5zaGFsbG93QW5ub3RhdGlvbnMobW9kdWxlVHlwZSksIGNyZWF0ZU5nTW9kdWxlLmlzVHlwZU9mKTtcbiAgICAgICAgY29tcGlsZU1ldGEgPSB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLl9nZXRUeXBlTWV0YWRhdGEobW9kdWxlVHlwZSksXG4gICAgICAgICAgICByYXdFeHBvcnRzOiBuZ01vZHVsZU1ldGEuZXhwb3J0cyxcbiAgICAgICAgICAgIHJhd0ltcG9ydHM6IG5nTW9kdWxlTWV0YS5pbXBvcnRzLFxuICAgICAgICAgICAgcmF3UHJvdmlkZXJzOiBuZ01vZHVsZU1ldGEucHJvdmlkZXJzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9zaGFsbG93TW9kdWxlQ2FjaGUuc2V0KG1vZHVsZVR5cGUsIGNvbXBpbGVNZXRhKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVNZXRhO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldE5nTW9kdWxlTWV0YWRhdGEgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSwgdGhyb3dJZk5vdEZvdW5kLCBhbHJlYWR5Q29sbGVjdGluZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kID09PSB2b2lkIDApIHsgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICBpZiAoYWxyZWFkeUNvbGxlY3RpbmcgPT09IHZvaWQgMCkgeyBhbHJlYWR5Q29sbGVjdGluZyA9IG51bGw7IH1cbiAgICAgICAgbW9kdWxlVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKG1vZHVsZVR5cGUpO1xuICAgICAgICB2YXIgY29tcGlsZU1ldGEgPSB0aGlzLl9uZ01vZHVsZUNhY2hlLmdldChtb2R1bGVUeXBlKTtcbiAgICAgICAgaWYgKGNvbXBpbGVNZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU1ldGE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1ldGEgPSB0aGlzLl9uZ01vZHVsZVJlc29sdmVyLnJlc29sdmUobW9kdWxlVHlwZSwgdGhyb3dJZk5vdEZvdW5kKTtcbiAgICAgICAgaWYgKCFtZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVjbGFyZWREaXJlY3RpdmVzID0gW107XG4gICAgICAgIHZhciBleHBvcnRlZE5vbk1vZHVsZUlkZW50aWZpZXJzID0gW107XG4gICAgICAgIHZhciBkZWNsYXJlZFBpcGVzID0gW107XG4gICAgICAgIHZhciBpbXBvcnRlZE1vZHVsZXMgPSBbXTtcbiAgICAgICAgdmFyIGV4cG9ydGVkTW9kdWxlcyA9IFtdO1xuICAgICAgICB2YXIgcHJvdmlkZXJzID0gW107XG4gICAgICAgIHZhciBlbnRyeUNvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdmFyIGJvb3RzdHJhcENvbXBvbmVudHMgPSBbXTtcbiAgICAgICAgdmFyIHNjaGVtYXMgPSBbXTtcbiAgICAgICAgaWYgKG1ldGEuaW1wb3J0cykge1xuICAgICAgICAgICAgZmxhdHRlbkFuZERlZHVwZUFycmF5KG1ldGEuaW1wb3J0cykuZm9yRWFjaChmdW5jdGlvbiAoaW1wb3J0ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGltcG9ydGVkTW9kdWxlVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFR5cGUoaW1wb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZE1vZHVsZVR5cGUgPSBpbXBvcnRlZFR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydGVkVHlwZSAmJiBpbXBvcnRlZFR5cGUubmdNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZVdpdGhQcm92aWRlcnMgPSBpbXBvcnRlZFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGltcG9ydGVkTW9kdWxlVHlwZSA9IG1vZHVsZVdpdGhQcm92aWRlcnMubmdNb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGVXaXRoUHJvdmlkZXJzLnByb3ZpZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2guYXBwbHkocHJvdmlkZXJzLCBfX3NwcmVhZChfdGhpcy5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEobW9kdWxlV2l0aFByb3ZpZGVycy5wcm92aWRlcnMsIGVudHJ5Q29tcG9uZW50cywgXCJwcm92aWRlciBmb3IgdGhlIE5nTW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUoaW1wb3J0ZWRNb2R1bGVUeXBlKSArIFwiJ1wiLCBbXSwgaW1wb3J0ZWRUeXBlKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZE1vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLl9jaGVja1NlbGZJbXBvcnQobW9kdWxlVHlwZSwgaW1wb3J0ZWRNb2R1bGVUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5Q29sbGVjdGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHlDb2xsZWN0aW5nID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUNvbGxlY3RpbmcuaGFzKGltcG9ydGVkTW9kdWxlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihzeW50YXhFcnJvcihfdGhpcy5fZ2V0VHlwZURlc2NyaXB0b3IoaW1wb3J0ZWRNb2R1bGVUeXBlKSArIFwiICdcIiArIHN0cmluZ2lmeVR5cGUoaW1wb3J0ZWRUeXBlKSArIFwiJyBpcyBpbXBvcnRlZCByZWN1cnNpdmVseSBieSB0aGUgbW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIicuXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbHJlYWR5Q29sbGVjdGluZy5hZGQoaW1wb3J0ZWRNb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGltcG9ydGVkTW9kdWxlU3VtbWFyeSA9IF90aGlzLmdldE5nTW9kdWxlU3VtbWFyeShpbXBvcnRlZE1vZHVsZVR5cGUsIGFscmVhZHlDb2xsZWN0aW5nKTtcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeUNvbGxlY3RpbmcuZGVsZXRlKGltcG9ydGVkTW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW1wb3J0ZWRNb2R1bGVTdW1tYXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIFwiICsgX3RoaXMuX2dldFR5cGVEZXNjcmlwdG9yKGltcG9ydGVkVHlwZSkgKyBcIiAnXCIgKyBzdHJpbmdpZnlUeXBlKGltcG9ydGVkVHlwZSkgKyBcIicgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInLiBQbGVhc2UgYWRkIGEgQE5nTW9kdWxlIGFubm90YXRpb24uXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZE1vZHVsZXMucHVzaChpbXBvcnRlZE1vZHVsZVN1bW1hcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVW5leHBlY3RlZCB2YWx1ZSAnXCIgKyBzdHJpbmdpZnlUeXBlKGltcG9ydGVkVHlwZSkgKyBcIicgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmV4cG9ydHMpIHtcbiAgICAgICAgICAgIGZsYXR0ZW5BbmREZWR1cGVBcnJheShtZXRhLmV4cG9ydHMpLmZvckVhY2goZnVuY3Rpb24gKGV4cG9ydGVkVHlwZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZFR5cGUoZXhwb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlICdcIiArIHN0cmluZ2lmeVR5cGUoZXhwb3J0ZWRUeXBlKSArIFwiJyBleHBvcnRlZCBieSB0aGUgbW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIidcIiksIG1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYWxyZWFkeUNvbGxlY3RpbmcpXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlDb2xsZWN0aW5nID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5Q29sbGVjdGluZy5oYXMoZXhwb3J0ZWRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoX3RoaXMuX2dldFR5cGVEZXNjcmlwdG9yKGV4cG9ydGVkVHlwZSkgKyBcIiAnXCIgKyBzdHJpbmdpZnkoZXhwb3J0ZWRUeXBlKSArIFwiJyBpcyBleHBvcnRlZCByZWN1cnNpdmVseSBieSB0aGUgbW9kdWxlICdcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIidcIiksIG1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFscmVhZHlDb2xsZWN0aW5nLmFkZChleHBvcnRlZFR5cGUpO1xuICAgICAgICAgICAgICAgIHZhciBleHBvcnRlZE1vZHVsZVN1bW1hcnkgPSBfdGhpcy5nZXROZ01vZHVsZVN1bW1hcnkoZXhwb3J0ZWRUeXBlLCBhbHJlYWR5Q29sbGVjdGluZyk7XG4gICAgICAgICAgICAgICAgYWxyZWFkeUNvbGxlY3RpbmcuZGVsZXRlKGV4cG9ydGVkVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydGVkTW9kdWxlU3VtbWFyeSkge1xuICAgICAgICAgICAgICAgICAgICBleHBvcnRlZE1vZHVsZXMucHVzaChleHBvcnRlZE1vZHVsZVN1bW1hcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwb3J0ZWROb25Nb2R1bGVJZGVudGlmaWVycy5wdXNoKF90aGlzLl9nZXRJZGVudGlmaWVyTWV0YWRhdGEoZXhwb3J0ZWRUeXBlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyLCBzbyB3ZSByZWx5IG9uXG4gICAgICAgIC8vIGdldHRpbmcgYSBuZXcgaW5zdGFuY2UgZXZlcnkgdGltZSFcbiAgICAgICAgdmFyIHRyYW5zaXRpdmVNb2R1bGUgPSB0aGlzLl9nZXRUcmFuc2l0aXZlTmdNb2R1bGVNZXRhZGF0YShpbXBvcnRlZE1vZHVsZXMsIGV4cG9ydGVkTW9kdWxlcyk7XG4gICAgICAgIGlmIChtZXRhLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgZmxhdHRlbkFuZERlZHVwZUFycmF5KG1ldGEuZGVjbGFyYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChkZWNsYXJlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKGRlY2xhcmVkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVW5leHBlY3RlZCB2YWx1ZSAnXCIgKyBzdHJpbmdpZnlUeXBlKGRlY2xhcmVkVHlwZSkgKyBcIicgZGVjbGFyZWQgYnkgdGhlIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGVjbGFyZWRJZGVudGlmaWVyID0gX3RoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YShkZWNsYXJlZFR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0RpcmVjdGl2ZShkZWNsYXJlZFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpdmVNb2R1bGUuYWRkRGlyZWN0aXZlKGRlY2xhcmVkSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGlyZWN0aXZlcy5wdXNoKGRlY2xhcmVkSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9hZGRUeXBlVG9Nb2R1bGUoZGVjbGFyZWRUeXBlLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RoaXMuaXNQaXBlKGRlY2xhcmVkVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGl2ZU1vZHVsZS5hZGRQaXBlKGRlY2xhcmVkSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpdmVNb2R1bGUucGlwZXMucHVzaChkZWNsYXJlZElkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZFBpcGVzLnB1c2goZGVjbGFyZWRJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2FkZFR5cGVUb01vZHVsZShkZWNsYXJlZFR5cGUsIG1vZHVsZVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVW5leHBlY3RlZCBcIiArIF90aGlzLl9nZXRUeXBlRGVzY3JpcHRvcihkZWNsYXJlZFR5cGUpICsgXCIgJ1wiICsgc3RyaW5naWZ5VHlwZShkZWNsYXJlZFR5cGUpICsgXCInIGRlY2xhcmVkIGJ5IHRoZSBtb2R1bGUgJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJy4gUGxlYXNlIGFkZCBhIEBQaXBlL0BEaXJlY3RpdmUvQENvbXBvbmVudCBhbm5vdGF0aW9uLlwiKSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXhwb3J0ZWREaXJlY3RpdmVzID0gW107XG4gICAgICAgIHZhciBleHBvcnRlZFBpcGVzID0gW107XG4gICAgICAgIGV4cG9ydGVkTm9uTW9kdWxlSWRlbnRpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAoZXhwb3J0ZWRJZCkge1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpdmVNb2R1bGUuZGlyZWN0aXZlc1NldC5oYXMoZXhwb3J0ZWRJZC5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgZXhwb3J0ZWREaXJlY3RpdmVzLnB1c2goZXhwb3J0ZWRJZCk7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGl2ZU1vZHVsZS5hZGRFeHBvcnRlZERpcmVjdGl2ZShleHBvcnRlZElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRyYW5zaXRpdmVNb2R1bGUucGlwZXNTZXQuaGFzKGV4cG9ydGVkSWQucmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgIGV4cG9ydGVkUGlwZXMucHVzaChleHBvcnRlZElkKTtcbiAgICAgICAgICAgICAgICB0cmFuc2l0aXZlTW9kdWxlLmFkZEV4cG9ydGVkUGlwZShleHBvcnRlZElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRFcnJvcihzeW50YXhFcnJvcihcIkNhbid0IGV4cG9ydCBcIiArIF90aGlzLl9nZXRUeXBlRGVzY3JpcHRvcihleHBvcnRlZElkLnJlZmVyZW5jZSkgKyBcIiBcIiArIHN0cmluZ2lmeVR5cGUoZXhwb3J0ZWRJZC5yZWZlcmVuY2UpICsgXCIgZnJvbSBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIiBhcyBpdCB3YXMgbmVpdGhlciBkZWNsYXJlZCBub3IgaW1wb3J0ZWQhXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGUgcHJvdmlkZXJzIG9mIHRoZSBtb2R1bGUgaGF2ZSB0byBnbyBsYXN0XG4gICAgICAgIC8vIHNvIHRoYXQgdGhleSBvdmVyd3JpdGUgYW55IG90aGVyIHByb3ZpZGVyIHdlIGFscmVhZHkgYWRkZWQuXG4gICAgICAgIGlmIChtZXRhLnByb3ZpZGVycykge1xuICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2guYXBwbHkocHJvdmlkZXJzLCBfX3NwcmVhZCh0aGlzLl9nZXRQcm92aWRlcnNNZXRhZGF0YShtZXRhLnByb3ZpZGVycywgZW50cnlDb21wb25lbnRzLCBcInByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJ1wiLCBbXSwgbW9kdWxlVHlwZSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5lbnRyeUNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50cy5wdXNoLmFwcGx5KGVudHJ5Q29tcG9uZW50cywgX19zcHJlYWQoZmxhdHRlbkFuZERlZHVwZUFycmF5KG1ldGEuZW50cnlDb21wb25lbnRzKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIF90aGlzLl9nZXRFbnRyeUNvbXBvbmVudE1ldGFkYXRhKHR5cGUpOyB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmJvb3RzdHJhcCkge1xuICAgICAgICAgICAgZmxhdHRlbkFuZERlZHVwZUFycmF5KG1ldGEuYm9vdHN0cmFwKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJVbmV4cGVjdGVkIHZhbHVlICdcIiArIHN0cmluZ2lmeVR5cGUodHlwZSkgKyBcIicgdXNlZCBpbiB0aGUgYm9vdHN0cmFwIHByb3BlcnR5IG9mIG1vZHVsZSAnXCIgKyBzdHJpbmdpZnlUeXBlKG1vZHVsZVR5cGUpICsgXCInXCIpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib290c3RyYXBDb21wb25lbnRzLnB1c2goX3RoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YSh0eXBlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyeUNvbXBvbmVudHMucHVzaC5hcHBseShlbnRyeUNvbXBvbmVudHMsIF9fc3ByZWFkKGJvb3RzdHJhcENvbXBvbmVudHMubWFwKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiBfdGhpcy5fZ2V0RW50cnlDb21wb25lbnRNZXRhZGF0YSh0eXBlLnJlZmVyZW5jZSk7IH0pKSk7XG4gICAgICAgIGlmIChtZXRhLnNjaGVtYXMpIHtcbiAgICAgICAgICAgIHNjaGVtYXMucHVzaC5hcHBseShzY2hlbWFzLCBfX3NwcmVhZChmbGF0dGVuQW5kRGVkdXBlQXJyYXkobWV0YS5zY2hlbWFzKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVNZXRhID0gbmV3IENvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuX2dldFR5cGVNZXRhZGF0YShtb2R1bGVUeXBlKSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBlbnRyeUNvbXBvbmVudHMsXG4gICAgICAgICAgICBib290c3RyYXBDb21wb25lbnRzOiBib290c3RyYXBDb21wb25lbnRzLFxuICAgICAgICAgICAgc2NoZW1hczogc2NoZW1hcyxcbiAgICAgICAgICAgIGRlY2xhcmVkRGlyZWN0aXZlczogZGVjbGFyZWREaXJlY3RpdmVzLFxuICAgICAgICAgICAgZXhwb3J0ZWREaXJlY3RpdmVzOiBleHBvcnRlZERpcmVjdGl2ZXMsXG4gICAgICAgICAgICBkZWNsYXJlZFBpcGVzOiBkZWNsYXJlZFBpcGVzLFxuICAgICAgICAgICAgZXhwb3J0ZWRQaXBlczogZXhwb3J0ZWRQaXBlcyxcbiAgICAgICAgICAgIGltcG9ydGVkTW9kdWxlczogaW1wb3J0ZWRNb2R1bGVzLFxuICAgICAgICAgICAgZXhwb3J0ZWRNb2R1bGVzOiBleHBvcnRlZE1vZHVsZXMsXG4gICAgICAgICAgICB0cmFuc2l0aXZlTW9kdWxlOiB0cmFuc2l0aXZlTW9kdWxlLFxuICAgICAgICAgICAgaWQ6IG1ldGEuaWQgfHwgbnVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gdHJhbnNpdGl2ZU1vZHVsZS5hZGRFbnRyeUNvbXBvbmVudChpZCk7IH0pO1xuICAgICAgICBwcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHsgcmV0dXJuIHRyYW5zaXRpdmVNb2R1bGUuYWRkUHJvdmlkZXIocHJvdmlkZXIsIGNvbXBpbGVNZXRhLnR5cGUpOyB9KTtcbiAgICAgICAgdHJhbnNpdGl2ZU1vZHVsZS5hZGRNb2R1bGUoY29tcGlsZU1ldGEudHlwZSk7XG4gICAgICAgIHRoaXMuX25nTW9kdWxlQ2FjaGUuc2V0KG1vZHVsZVR5cGUsIGNvbXBpbGVNZXRhKTtcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVNZXRhO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9jaGVja1NlbGZJbXBvcnQgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSwgaW1wb3J0ZWRNb2R1bGVUeXBlKSB7XG4gICAgICAgIGlmIChtb2R1bGVUeXBlID09PSBpbXBvcnRlZE1vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiJ1wiICsgc3RyaW5naWZ5VHlwZShtb2R1bGVUeXBlKSArIFwiJyBtb2R1bGUgY2FuJ3QgaW1wb3J0IGl0c2VsZlwiKSwgbW9kdWxlVHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFR5cGVEZXNjcmlwdG9yID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRUeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RpcmVjdGl2ZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZGlyZWN0aXZlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzUGlwZSh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncGlwZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc05nTW9kdWxlKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdtb2R1bGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlLnByb3ZpZGUpIHtcbiAgICAgICAgICAgIHJldHVybiAncHJvdmlkZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndmFsdWUnO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9hZGRUeXBlVG9Nb2R1bGUgPSBmdW5jdGlvbiAodHlwZSwgbW9kdWxlVHlwZSkge1xuICAgICAgICB2YXIgb2xkTW9kdWxlID0gdGhpcy5fbmdNb2R1bGVPZlR5cGVzLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKG9sZE1vZHVsZSAmJiBvbGRNb2R1bGUgIT09IG1vZHVsZVR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVHlwZSBcIiArIHN0cmluZ2lmeVR5cGUodHlwZSkgKyBcIiBpcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbnMgb2YgMiBtb2R1bGVzOiBcIiArIHN0cmluZ2lmeVR5cGUob2xkTW9kdWxlKSArIFwiIGFuZCBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIiEgXCIgK1xuICAgICAgICAgICAgICAgIChcIlBsZWFzZSBjb25zaWRlciBtb3ZpbmcgXCIgKyBzdHJpbmdpZnlUeXBlKHR5cGUpICsgXCIgdG8gYSBoaWdoZXIgbW9kdWxlIHRoYXQgaW1wb3J0cyBcIiArIHN0cmluZ2lmeVR5cGUob2xkTW9kdWxlKSArIFwiIGFuZCBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIi4gXCIpICtcbiAgICAgICAgICAgICAgICAoXCJZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgXCIgKyBzdHJpbmdpZnlUeXBlKHR5cGUpICsgXCIgdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiBcIiArIHN0cmluZ2lmeVR5cGUob2xkTW9kdWxlKSArIFwiIGFuZCBcIiArIHN0cmluZ2lmeVR5cGUobW9kdWxlVHlwZSkgKyBcIi5cIikpLCBtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZ01vZHVsZU9mVHlwZXMuc2V0KHR5cGUsIG1vZHVsZVR5cGUpO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRUcmFuc2l0aXZlTmdNb2R1bGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChpbXBvcnRlZE1vZHVsZXMsIGV4cG9ydGVkTW9kdWxlcykge1xuICAgICAgICAvLyBjb2xsZWN0IGBwcm92aWRlcnNgIC8gYGVudHJ5Q29tcG9uZW50c2AgZnJvbSBhbGwgaW1wb3J0ZWQgYW5kIGFsbCBleHBvcnRlZCBtb2R1bGVzXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgVHJhbnNpdGl2ZUNvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKCk7XG4gICAgICAgIHZhciBtb2R1bGVzQnlUb2tlbiA9IG5ldyBNYXAoKTtcbiAgICAgICAgaW1wb3J0ZWRNb2R1bGVzLmNvbmNhdChleHBvcnRlZE1vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG1vZFN1bW1hcnkpIHtcbiAgICAgICAgICAgIG1vZFN1bW1hcnkubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2QpIHsgcmV0dXJuIHJlc3VsdC5hZGRNb2R1bGUobW9kKTsgfSk7XG4gICAgICAgICAgICBtb2RTdW1tYXJ5LmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wKSB7IHJldHVybiByZXN1bHQuYWRkRW50cnlDb21wb25lbnQoY29tcCk7IH0pO1xuICAgICAgICAgICAgdmFyIGFkZGVkVG9rZW5zID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgbW9kU3VtbWFyeS5wcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9rZW5SZWYgPSB0b2tlblJlZmVyZW5jZShlbnRyeS5wcm92aWRlci50b2tlbik7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZNb2R1bGVzID0gbW9kdWxlc0J5VG9rZW4uZ2V0KHRva2VuUmVmKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXZNb2R1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZNb2R1bGVzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVzQnlUb2tlbi5zZXQodG9rZW5SZWYsIHByZXZNb2R1bGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1vZHVsZVJlZiA9IGVudHJ5Lm1vZHVsZS5yZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIHByb3ZpZGVycyBvZiBvbmUgbW9kdWxlIG1heSBzdGlsbCBjb250YWluIG11bHRpcGxlIHByb3ZpZGVyc1xuICAgICAgICAgICAgICAgIC8vIHBlciB0b2tlbiAoZS5nLiBmb3IgbXVsdGkgcHJvdmlkZXJzKSwgYW5kIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlc2UuXG4gICAgICAgICAgICAgICAgaWYgKGFkZGVkVG9rZW5zLmhhcyh0b2tlblJlZikgfHwgIXByZXZNb2R1bGVzLmhhcyhtb2R1bGVSZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZNb2R1bGVzLmFkZChtb2R1bGVSZWYpO1xuICAgICAgICAgICAgICAgICAgICBhZGRlZFRva2Vucy5hZGQodG9rZW5SZWYpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkUHJvdmlkZXIoZW50cnkucHJvdmlkZXIsIGVudHJ5Lm1vZHVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBleHBvcnRlZE1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobW9kU3VtbWFyeSkge1xuICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZERpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHJlc3VsdC5hZGRFeHBvcnRlZERpcmVjdGl2ZShpZCk7IH0pO1xuICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7IHJldHVybiByZXN1bHQuYWRkRXhwb3J0ZWRQaXBlKGlkKTsgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpbXBvcnRlZE1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobW9kU3VtbWFyeSkge1xuICAgICAgICAgICAgbW9kU3VtbWFyeS5leHBvcnRlZERpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIHJlc3VsdC5hZGREaXJlY3RpdmUoaWQpOyB9KTtcbiAgICAgICAgICAgIG1vZFN1bW1hcnkuZXhwb3J0ZWRQaXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgeyByZXR1cm4gcmVzdWx0LmFkZFBpcGUoaWQpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldElkZW50aWZpZXJNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTtcbiAgICAgICAgcmV0dXJuIHsgcmVmZXJlbmNlOiB0eXBlIH07XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuaXNJbmplY3RhYmxlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIGFubm90YXRpb25zID0gdGhpcy5fcmVmbGVjdG9yLnRyeUFubm90YXRpb25zKHR5cGUpO1xuICAgICAgICByZXR1cm4gYW5ub3RhdGlvbnMuc29tZShmdW5jdGlvbiAoYW5uKSB7IHJldHVybiBjcmVhdGVJbmplY3RhYmxlLmlzVHlwZU9mKGFubik7IH0pO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldEluamVjdGFibGVTdW1tYXJ5ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1bW1hcnlLaW5kOiBDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuX2dldFR5cGVNZXRhZGF0YSh0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5nZXRJbmplY3RhYmxlTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZSwgZGVwZW5kZW5jaWVzLCB0aHJvd09uVW5rbm93bkRlcHMpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PT0gdm9pZCAwKSB7IGRlcGVuZGVuY2llcyA9IG51bGw7IH1cbiAgICAgICAgaWYgKHRocm93T25Vbmtub3duRGVwcyA9PT0gdm9pZCAwKSB7IHRocm93T25Vbmtub3duRGVwcyA9IHRydWU7IH1cbiAgICAgICAgdmFyIHR5cGVTdW1tYXJ5ID0gdGhpcy5fbG9hZFN1bW1hcnkodHlwZSwgQ29tcGlsZVN1bW1hcnlLaW5kLkluamVjdGFibGUpO1xuICAgICAgICB2YXIgdHlwZU1ldGFkYXRhID0gdHlwZVN1bW1hcnkgP1xuICAgICAgICAgICAgdHlwZVN1bW1hcnkudHlwZSA6XG4gICAgICAgICAgICB0aGlzLl9nZXRUeXBlTWV0YWRhdGEodHlwZSwgZGVwZW5kZW5jaWVzLCB0aHJvd09uVW5rbm93bkRlcHMpO1xuICAgICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0b3IuYW5ub3RhdGlvbnModHlwZSkuZmlsdGVyKGZ1bmN0aW9uIChhbm4pIHsgcmV0dXJuIGNyZWF0ZUluamVjdGFibGUuaXNUeXBlT2YoYW5uKTsgfSk7XG4gICAgICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZXRhID0gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzeW1ib2w6IHR5cGUsXG4gICAgICAgICAgICB0eXBlOiB0eXBlTWV0YWRhdGEsXG4gICAgICAgICAgICBwcm92aWRlZEluOiBtZXRhLnByb3ZpZGVkSW4sXG4gICAgICAgICAgICB1c2VWYWx1ZTogbWV0YS51c2VWYWx1ZSxcbiAgICAgICAgICAgIHVzZUNsYXNzOiBtZXRhLnVzZUNsYXNzLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IG1ldGEudXNlRXhpc3RpbmcsXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBtZXRhLnVzZUZhY3RvcnksXG4gICAgICAgICAgICBkZXBzOiBtZXRhLmRlcHMsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFR5cGVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0eXBlLCBkZXBlbmRlbmNpZXMsIHRocm93T25Vbmtub3duRGVwcykge1xuICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB2b2lkIDApIHsgZGVwZW5kZW5jaWVzID0gbnVsbDsgfVxuICAgICAgICBpZiAodGhyb3dPblVua25vd25EZXBzID09PSB2b2lkIDApIHsgdGhyb3dPblVua25vd25EZXBzID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgaWRlbnRpZmllciA9IHRoaXMuX2dldElkZW50aWZpZXJNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZTogaWRlbnRpZmllci5yZWZlcmVuY2UsXG4gICAgICAgICAgICBkaURlcHM6IHRoaXMuX2dldERlcGVuZGVuY2llc01ldGFkYXRhKGlkZW50aWZpZXIucmVmZXJlbmNlLCBkZXBlbmRlbmNpZXMsIHRocm93T25Vbmtub3duRGVwcyksXG4gICAgICAgICAgICBsaWZlY3ljbGVIb29rczogZ2V0QWxsTGlmZWN5Y2xlSG9va3ModGhpcy5fcmVmbGVjdG9yLCBpZGVudGlmaWVyLnJlZmVyZW5jZSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldEZhY3RvcnlNZXRhZGF0YSA9IGZ1bmN0aW9uIChmYWN0b3J5LCBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PT0gdm9pZCAwKSB7IGRlcGVuZGVuY2llcyA9IG51bGw7IH1cbiAgICAgICAgZmFjdG9yeSA9IHJlc29sdmVGb3J3YXJkUmVmKGZhY3RvcnkpO1xuICAgICAgICByZXR1cm4geyByZWZlcmVuY2U6IGZhY3RvcnksIGRpRGVwczogdGhpcy5fZ2V0RGVwZW5kZW5jaWVzTWV0YWRhdGEoZmFjdG9yeSwgZGVwZW5kZW5jaWVzKSB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBnaXZlbiBwaXBlLlxuICAgICAqIFRoaXMgYXNzdW1lcyBgbG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhYCBoYXMgYmVlbiBjYWxsZWQgZmlyc3QuXG4gICAgICovXG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldFBpcGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChwaXBlVHlwZSkge1xuICAgICAgICB2YXIgcGlwZU1ldGEgPSB0aGlzLl9waXBlQ2FjaGUuZ2V0KHBpcGVUeXBlKTtcbiAgICAgICAgaWYgKCFwaXBlTWV0YSkge1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBnZXRQaXBlTWV0YWRhdGEgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGxvYWROZ01vZHVsZURpcmVjdGl2ZUFuZFBpcGVNZXRhZGF0YSBmb3IgYSBtb2R1bGUgdGhhdCBkZWNsYXJlcyBpdC4gUGlwZSBcIiArIHN0cmluZ2lmeVR5cGUocGlwZVR5cGUpICsgXCIuXCIpLCBwaXBlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpcGVNZXRhIHx8IG51bGw7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuZ2V0UGlwZVN1bW1hcnkgPSBmdW5jdGlvbiAocGlwZVR5cGUpIHtcbiAgICAgICAgdmFyIHBpcGVTdW1tYXJ5ID0gdGhpcy5fbG9hZFN1bW1hcnkocGlwZVR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5QaXBlKTtcbiAgICAgICAgaWYgKCFwaXBlU3VtbWFyeSkge1xuICAgICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3Ioc3ludGF4RXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBDb3VsZCBub3QgbG9hZCB0aGUgc3VtbWFyeSBmb3IgcGlwZSBcIiArIHN0cmluZ2lmeVR5cGUocGlwZVR5cGUpICsgXCIuXCIpLCBwaXBlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpcGVTdW1tYXJ5O1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldE9yTG9hZFBpcGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChwaXBlVHlwZSkge1xuICAgICAgICB2YXIgcGlwZU1ldGEgPSB0aGlzLl9waXBlQ2FjaGUuZ2V0KHBpcGVUeXBlKTtcbiAgICAgICAgaWYgKCFwaXBlTWV0YSkge1xuICAgICAgICAgICAgcGlwZU1ldGEgPSB0aGlzLl9sb2FkUGlwZU1ldGFkYXRhKHBpcGVUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGlwZU1ldGE7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2xvYWRQaXBlTWV0YWRhdGEgPSBmdW5jdGlvbiAocGlwZVR5cGUpIHtcbiAgICAgICAgcGlwZVR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZihwaXBlVHlwZSk7XG4gICAgICAgIHZhciBwaXBlQW5ub3RhdGlvbiA9IHRoaXMuX3BpcGVSZXNvbHZlci5yZXNvbHZlKHBpcGVUeXBlKTtcbiAgICAgICAgdmFyIHBpcGVNZXRhID0gbmV3IENvbXBpbGVQaXBlTWV0YWRhdGEoe1xuICAgICAgICAgICAgdHlwZTogdGhpcy5fZ2V0VHlwZU1ldGFkYXRhKHBpcGVUeXBlKSxcbiAgICAgICAgICAgIG5hbWU6IHBpcGVBbm5vdGF0aW9uLm5hbWUsXG4gICAgICAgICAgICBwdXJlOiAhIXBpcGVBbm5vdGF0aW9uLnB1cmVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3BpcGVDYWNoZS5zZXQocGlwZVR5cGUsIHBpcGVNZXRhKTtcbiAgICAgICAgdGhpcy5fc3VtbWFyeUNhY2hlLnNldChwaXBlVHlwZSwgcGlwZU1ldGEudG9TdW1tYXJ5KCkpO1xuICAgICAgICByZXR1cm4gcGlwZU1ldGE7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldERlcGVuZGVuY2llc01ldGFkYXRhID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMsIGRlcGVuZGVuY2llcywgdGhyb3dPblVua25vd25EZXBzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aHJvd09uVW5rbm93bkRlcHMgPT09IHZvaWQgMCkgeyB0aHJvd09uVW5rbm93bkRlcHMgPSB0cnVlOyB9XG4gICAgICAgIHZhciBoYXNVbmtub3duRGVwcyA9IGZhbHNlO1xuICAgICAgICB2YXIgcGFyYW1zID0gZGVwZW5kZW5jaWVzIHx8IHRoaXMuX3JlZmxlY3Rvci5wYXJhbWV0ZXJzKHR5cGVPckZ1bmMpIHx8IFtdO1xuICAgICAgICB2YXIgZGVwZW5kZW5jaWVzTWV0YWRhdGEgPSBwYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgdmFyIGlzQXR0cmlidXRlID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaXNIb3N0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaXNTZWxmID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaXNTa2lwU2VsZiA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGlzT3B0aW9uYWwgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB0b2tlbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbUVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVIb3N0LmlzVHlwZU9mKHBhcmFtRW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc0hvc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNyZWF0ZVNlbGYuaXNUeXBlT2YocGFyYW1FbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3JlYXRlU2tpcFNlbGYuaXNUeXBlT2YocGFyYW1FbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2tpcFNlbGYgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNyZWF0ZU9wdGlvbmFsLmlzVHlwZU9mKHBhcmFtRW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc09wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjcmVhdGVBdHRyaWJ1dGUuaXNUeXBlT2YocGFyYW1FbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gcGFyYW1FbnRyeS5hdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNyZWF0ZUluamVjdC5pc1R5cGVPZihwYXJhbUVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBwYXJhbUVudHJ5LnRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNyZWF0ZUluamVjdGlvblRva2VuLmlzVHlwZU9mKHBhcmFtRW50cnkpIHx8IHBhcmFtRW50cnkgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gcGFyYW1FbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1ZhbGlkVHlwZShwYXJhbUVudHJ5KSAmJiB0b2tlbiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHBhcmFtRW50cnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRva2VuID0gcGFyYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhhc1Vua25vd25EZXBzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlOiBpc0F0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBpc0hvc3Q6IGlzSG9zdCxcbiAgICAgICAgICAgICAgICBpc1NlbGY6IGlzU2VsZixcbiAgICAgICAgICAgICAgICBpc1NraXBTZWxmOiBpc1NraXBTZWxmLFxuICAgICAgICAgICAgICAgIGlzT3B0aW9uYWw6IGlzT3B0aW9uYWwsXG4gICAgICAgICAgICAgICAgdG9rZW46IF90aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHRva2VuKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNVbmtub3duRGVwcykge1xuICAgICAgICAgICAgdmFyIGRlcHNUb2tlbnMgPSBkZXBlbmRlbmNpZXNNZXRhZGF0YS5tYXAoZnVuY3Rpb24gKGRlcCkgeyByZXR1cm4gZGVwLnRva2VuID8gc3RyaW5naWZ5VHlwZShkZXAudG9rZW4pIDogJz8nOyB9KS5qb2luKCcsICcpO1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIkNhbid0IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwiICsgc3RyaW5naWZ5VHlwZSh0eXBlT3JGdW5jKSArIFwiOiAoXCIgKyBkZXBzVG9rZW5zICsgXCIpLlwiO1xuICAgICAgICAgICAgaWYgKHRocm93T25Vbmtub3duRGVwcyB8fCB0aGlzLl9jb25maWcuc3RyaWN0SW5qZWN0aW9uUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKG1lc3NhZ2UpLCB0eXBlT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnNvbGUud2FybihcIldhcm5pbmc6IFwiICsgbWVzc2FnZSArIFwiIFRoaXMgd2lsbCBiZWNvbWUgYW4gZXJyb3IgaW4gQW5ndWxhciB2Ni54XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXNNZXRhZGF0YTtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0VG9rZW5NZXRhZGF0YSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICB0b2tlbiA9IHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKTtcbiAgICAgICAgdmFyIGNvbXBpbGVUb2tlbjtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbXBpbGVUb2tlbiA9IHsgdmFsdWU6IHRva2VuIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21waWxlVG9rZW4gPSB7IGlkZW50aWZpZXI6IHsgcmVmZXJlbmNlOiB0b2tlbiB9IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBpbGVUb2tlbjtcbiAgICB9O1xuICAgIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLnByb3RvdHlwZS5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEgPSBmdW5jdGlvbiAocHJvdmlkZXJzLCB0YXJnZXRFbnRyeUNvbXBvbmVudHMsIGRlYnVnSW5mbywgY29tcGlsZVByb3ZpZGVycywgdHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoY29tcGlsZVByb3ZpZGVycyA9PT0gdm9pZCAwKSB7IGNvbXBpbGVQcm92aWRlcnMgPSBbXTsgfVxuICAgICAgICBwcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIsIHByb3ZpZGVySWR4KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fZ2V0UHJvdmlkZXJzTWV0YWRhdGEocHJvdmlkZXIsIHRhcmdldEVudHJ5Q29tcG9uZW50cywgZGVidWdJbmZvLCBjb21waWxlUHJvdmlkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1ldGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICYmIHR5cGVvZiBwcm92aWRlciA9PT0gJ29iamVjdCcgJiYgcHJvdmlkZXIuaGFzT3duUHJvcGVydHkoJ3Byb3ZpZGUnKSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdmFsaWRhdGVQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWV0YSA9IG5ldyBQcm92aWRlck1ldGEocHJvdmlkZXIucHJvdmlkZSwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1ZhbGlkVHlwZShwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNZXRhID0gbmV3IFByb3ZpZGVyTWV0YShwcm92aWRlciwgeyB1c2VDbGFzczogcHJvdmlkZXIgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiRW5jb3VudGVyZWQgdW5kZWZpbmVkIHByb3ZpZGVyISBVc3VhbGx5IHRoaXMgbWVhbnMgeW91IGhhdmUgYSBjaXJjdWxhciBkZXBlbmRlbmNpZXMuIFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHVzaW5nICdiYXJyZWwnIGluZGV4LnRzIGZpbGVzLlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlcnNJbmZvID0gcHJvdmlkZXJzLnJlZHVjZShmdW5jdGlvbiAoc29GYXIsIHNlZW5Qcm92aWRlciwgc2VlblByb3ZpZGVySWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblByb3ZpZGVySWR4IDwgcHJvdmlkZXJJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb0Zhci5wdXNoKFwiXCIgKyBzdHJpbmdpZnlUeXBlKHNlZW5Qcm92aWRlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VlblByb3ZpZGVySWR4ID09IHByb3ZpZGVySWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29GYXIucHVzaChcIj9cIiArIHN0cmluZ2lmeVR5cGUoc2VlblByb3ZpZGVyKSArIFwiP1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlZW5Qcm92aWRlcklkeCA9PSBwcm92aWRlcklkeCArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb0Zhci5wdXNoKCcuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb0ZhcjtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiSW52YWxpZCBcIiArIChkZWJ1Z0luZm8gPyBkZWJ1Z0luZm8gOiAncHJvdmlkZXInKSArIFwiIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogW1wiICsgcHJvdmlkZXJzSW5mbyArIFwiXVwiKSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyTWV0YS50b2tlbiA9PT1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RW50cnlDb21wb25lbnRzLnB1c2guYXBwbHkodGFyZ2V0RW50cnlDb21wb25lbnRzLCBfX3NwcmVhZChfdGhpcy5fZ2V0RW50cnlDb21wb25lbnRzRnJvbVByb3ZpZGVyKHByb3ZpZGVyTWV0YSwgdHlwZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVQcm92aWRlcnMucHVzaChfdGhpcy5nZXRQcm92aWRlck1ldGFkYXRhKHByb3ZpZGVyTWV0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21waWxlUHJvdmlkZXJzO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl92YWxpZGF0ZVByb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIGlmIChwcm92aWRlci5oYXNPd25Qcm9wZXJ0eSgndXNlQ2xhc3MnKSAmJiBwcm92aWRlci51c2VDbGFzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihzeW50YXhFcnJvcihcIkludmFsaWQgcHJvdmlkZXIgZm9yIFwiICsgc3RyaW5naWZ5VHlwZShwcm92aWRlci5wcm92aWRlKSArIFwiLiB1c2VDbGFzcyBjYW5ub3QgYmUgXCIgKyBwcm92aWRlci51c2VDbGFzcyArIFwiLlxcbiAgICAgICAgICAgVXN1YWxseSBpdCBoYXBwZW5zIHdoZW46XFxuICAgICAgICAgICAxLiBUaGVyZSdzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSAobWlnaHQgYmUgY2F1c2VkIGJ5IHVzaW5nIGluZGV4LnRzIChiYXJyZWwpIGZpbGVzKS5cXG4gICAgICAgICAgIDIuIENsYXNzIHdhcyB1c2VkIGJlZm9yZSBpdCB3YXMgZGVjbGFyZWQuIFVzZSBmb3J3YXJkUmVmIGluIHRoaXMgY2FzZS5cIikpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldEVudHJ5Q29tcG9uZW50c0Zyb21Qcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlciwgdHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdO1xuICAgICAgICB2YXIgY29sbGVjdGVkSWRlbnRpZmllcnMgPSBbXTtcbiAgICAgICAgaWYgKHByb3ZpZGVyLnVzZUZhY3RvcnkgfHwgcHJvdmlkZXIudXNlRXhpc3RpbmcgfHwgcHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVGhlIEFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMgdG9rZW4gb25seSBzdXBwb3J0cyB1c2VWYWx1ZSFcIiksIHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJvdmlkZXIubXVsdGkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiVGhlIEFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMgdG9rZW4gb25seSBzdXBwb3J0cyAnbXVsdGkgPSB0cnVlJyFcIiksIHR5cGUpO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGV4dHJhY3RJZGVudGlmaWVycyhwcm92aWRlci51c2VWYWx1ZSwgY29sbGVjdGVkSWRlbnRpZmllcnMpO1xuICAgICAgICBjb2xsZWN0ZWRJZGVudGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBfdGhpcy5fZ2V0RW50cnlDb21wb25lbnRNZXRhZGF0YShpZGVudGlmaWVyLnJlZmVyZW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRFbnRyeUNvbXBvbmVudE1ldGFkYXRhID0gZnVuY3Rpb24gKGRpclR5cGUsIHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kID09PSB2b2lkIDApIHsgdGhyb3dJZk5vdEZvdW5kID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgZGlyTWV0YSA9IHRoaXMuZ2V0Tm9uTm9ybWFsaXplZERpcmVjdGl2ZU1ldGFkYXRhKGRpclR5cGUpO1xuICAgICAgICBpZiAoZGlyTWV0YSAmJiBkaXJNZXRhLm1ldGFkYXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb21wb25lbnRUeXBlOiBkaXJUeXBlLCBjb21wb25lbnRGYWN0b3J5OiBkaXJNZXRhLm1ldGFkYXRhLmNvbXBvbmVudEZhY3RvcnkgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlyU3VtbWFyeSA9IHRoaXMuX2xvYWRTdW1tYXJ5KGRpclR5cGUsIENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUpO1xuICAgICAgICBpZiAoZGlyU3VtbWFyeSAmJiBkaXJTdW1tYXJ5LmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm4geyBjb21wb25lbnRUeXBlOiBkaXJUeXBlLCBjb21wb25lbnRGYWN0b3J5OiBkaXJTdW1tYXJ5LmNvbXBvbmVudEZhY3RvcnkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhyb3dJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcihkaXJUeXBlLm5hbWUgKyBcIiBjYW5ub3QgYmUgdXNlZCBhcyBhbiBlbnRyeSBjb21wb25lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLl9nZXRJbmplY3RhYmxlVHlwZU1ldGFkYXRhID0gZnVuY3Rpb24gKHR5cGUsIGRlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB2b2lkIDApIHsgZGVwZW5kZW5jaWVzID0gbnVsbDsgfVxuICAgICAgICB2YXIgdHlwZVN1bW1hcnkgPSB0aGlzLl9sb2FkU3VtbWFyeSh0eXBlLCBDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZSk7XG4gICAgICAgIGlmICh0eXBlU3VtbWFyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVTdW1tYXJ5LnR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFR5cGVNZXRhZGF0YSh0eXBlLCBkZXBlbmRlbmNpZXMpO1xuICAgIH07XG4gICAgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIucHJvdG90eXBlLmdldFByb3ZpZGVyTWV0YWRhdGEgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICAgICAgdmFyIGNvbXBpbGVEZXBzID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgY29tcGlsZVR5cGVNZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHZhciBjb21waWxlRmFjdG9yeU1ldGFkYXRhID0gbnVsbDtcbiAgICAgICAgdmFyIHRva2VuID0gdGhpcy5fZ2V0VG9rZW5NZXRhZGF0YShwcm92aWRlci50b2tlbik7XG4gICAgICAgIGlmIChwcm92aWRlci51c2VDbGFzcykge1xuICAgICAgICAgICAgY29tcGlsZVR5cGVNZXRhZGF0YSA9XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2V0SW5qZWN0YWJsZVR5cGVNZXRhZGF0YShwcm92aWRlci51c2VDbGFzcywgcHJvdmlkZXIuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgIGNvbXBpbGVEZXBzID0gY29tcGlsZVR5cGVNZXRhZGF0YS5kaURlcHM7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIudG9rZW4gPT09IHByb3ZpZGVyLnVzZUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjb21waWxlVHlwZU1ldGFkYXRhIGFzIGl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGxpZmVjeWNsZUhvb2tzLi4uXG4gICAgICAgICAgICAgICAgdG9rZW4gPSB7IGlkZW50aWZpZXI6IGNvbXBpbGVUeXBlTWV0YWRhdGEgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgICAgICBjb21waWxlRmFjdG9yeU1ldGFkYXRhID0gdGhpcy5fZ2V0RmFjdG9yeU1ldGFkYXRhKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICBjb21waWxlRGVwcyA9IGNvbXBpbGVGYWN0b3J5TWV0YWRhdGEuZGlEZXBzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgICAgICB1c2VDbGFzczogY29tcGlsZVR5cGVNZXRhZGF0YSxcbiAgICAgICAgICAgIHVzZVZhbHVlOiBwcm92aWRlci51c2VWYWx1ZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNvbXBpbGVGYWN0b3J5TWV0YWRhdGEsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogcHJvdmlkZXIudXNlRXhpc3RpbmcgPyB0aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlcHM6IGNvbXBpbGVEZXBzLFxuICAgICAgICAgICAgbXVsdGk6IHByb3ZpZGVyLm11bHRpXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFF1ZXJpZXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChxdWVyaWVzLCBpc1ZpZXdRdWVyeSwgZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHF1ZXJpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gcXVlcmllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHF1ZXJ5LmlzVmlld1F1ZXJ5ID09PSBpc1ZpZXdRdWVyeSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKF90aGlzLl9nZXRRdWVyeU1ldGFkYXRhKHF1ZXJ5LCBwcm9wZXJ0eU5hbWUsIGRpcmVjdGl2ZVR5cGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX3F1ZXJ5VmFyQmluZGluZ3MgPSBmdW5jdGlvbiAoc2VsZWN0b3IpIHsgcmV0dXJuIHNlbGVjdG9yLnNwbGl0KC9cXHMqLFxccyovKTsgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX2dldFF1ZXJ5TWV0YWRhdGEgPSBmdW5jdGlvbiAocSwgcHJvcGVydHlOYW1lLCB0eXBlT3JGdW5jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBzZWxlY3RvcnM7XG4gICAgICAgIGlmICh0eXBlb2YgcS5zZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNlbGVjdG9ycyA9XG4gICAgICAgICAgICAgICAgdGhpcy5fcXVlcnlWYXJCaW5kaW5ncyhxLnNlbGVjdG9yKS5tYXAoZnVuY3Rpb24gKHZhck5hbWUpIHsgcmV0dXJuIF90aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHZhck5hbWUpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghcS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKHN5bnRheEVycm9yKFwiQ2FuJ3QgY29uc3RydWN0IGEgcXVlcnkgZm9yIHRoZSBwcm9wZXJ0eSBcXFwiXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIlxcXCIgb2YgXFxcIlwiICsgc3RyaW5naWZ5VHlwZSh0eXBlT3JGdW5jKSArIFwiXFxcIiBzaW5jZSB0aGUgcXVlcnkgc2VsZWN0b3Igd2Fzbid0IGRlZmluZWQuXCIpLCB0eXBlT3JGdW5jKTtcbiAgICAgICAgICAgICAgICBzZWxlY3RvcnMgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlbGVjdG9ycyA9IFt0aGlzLl9nZXRUb2tlbk1ldGFkYXRhKHEuc2VsZWN0b3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VsZWN0b3JzOiBzZWxlY3RvcnMsXG4gICAgICAgICAgICBmaXJzdDogcS5maXJzdCxcbiAgICAgICAgICAgIGRlc2NlbmRhbnRzOiBxLmRlc2NlbmRhbnRzLCBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHJlYWQ6IHEucmVhZCA/IHRoaXMuX2dldFRva2VuTWV0YWRhdGEocS5yZWFkKSA6IG51bGwsXG4gICAgICAgICAgICBzdGF0aWM6IHEuc3RhdGljXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb21waWxlTWV0YWRhdGFSZXNvbHZlci5wcm90b3R5cGUuX3JlcG9ydEVycm9yID0gZnVuY3Rpb24gKGVycm9yLCB0eXBlLCBvdGhlclR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Vycm9yQ29sbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvckNvbGxlY3RvcihlcnJvciwgdHlwZSk7XG4gICAgICAgICAgICBpZiAob3RoZXJUeXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXJyb3JDb2xsZWN0b3IoZXJyb3IsIG90aGVyVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyO1xufSgpKTtcbmZ1bmN0aW9uIGZsYXR0ZW5BcnJheSh0cmVlLCBvdXQpIHtcbiAgICBpZiAob3V0ID09PSB2b2lkIDApIHsgb3V0ID0gW107IH1cbiAgICBpZiAodHJlZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gcmVzb2x2ZUZvcndhcmRSZWYodHJlZVtpXSk7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGRlZHVwZUFycmF5KGFycmF5KSB7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoYXJyYXkpKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZmxhdHRlbkFuZERlZHVwZUFycmF5KHRyZWUpIHtcbiAgICByZXR1cm4gZGVkdXBlQXJyYXkoZmxhdHRlbkFycmF5KHRyZWUpKTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRUeXBlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkgfHwgKHZhbHVlIGluc3RhbmNlb2YgVHlwZSk7XG59XG5mdW5jdGlvbiBleHRyYWN0SWRlbnRpZmllcnModmFsdWUsIHRhcmdldElkZW50aWZpZXJzKSB7XG4gICAgdmlzaXRWYWx1ZSh2YWx1ZSwgbmV3IF9Db21waWxlVmFsdWVDb252ZXJ0ZXIoKSwgdGFyZ2V0SWRlbnRpZmllcnMpO1xufVxudmFyIF9Db21waWxlVmFsdWVDb252ZXJ0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKF9Db21waWxlVmFsdWVDb252ZXJ0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gX0NvbXBpbGVWYWx1ZUNvbnZlcnRlcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBfQ29tcGlsZVZhbHVlQ29udmVydGVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCB0YXJnZXRJZGVudGlmaWVycykge1xuICAgICAgICB0YXJnZXRJZGVudGlmaWVycy5wdXNoKHsgcmVmZXJlbmNlOiB2YWx1ZSB9KTtcbiAgICB9O1xuICAgIHJldHVybiBfQ29tcGlsZVZhbHVlQ29udmVydGVyO1xufShWYWx1ZVRyYW5zZm9ybWVyKSk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUeXBlKHR5cGUpIHtcbiAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHlwZS5uYW1lICsgXCIgaW4gXCIgKyB0eXBlLmZpbGVQYXRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ2lmeSh0eXBlKTtcbiAgICB9XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGF0IGEgY29tcG9uZW50IGlzIHN0aWxsIGJlaW5nIGxvYWRlZCBpbiBhIHN5bmNocm9ub3VzIGNvbXBpbGUuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvbmVudFN0aWxsTG9hZGluZ0Vycm9yKGNvbXBUeXBlKSB7XG4gICAgdmFyIGVycm9yID0gRXJyb3IoXCJDYW4ndCBjb21waWxlIHN5bmNocm9ub3VzbHkgYXMgXCIgKyBzdHJpbmdpZnkoY29tcFR5cGUpICsgXCIgaXMgc3RpbGwgYmVpbmcgbG9hZGVkIVwiKTtcbiAgICBlcnJvcltFUlJPUl9DT01QT05FTlRfVFlQRV0gPSBjb21wVHlwZTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHByb3ZpZGVyRGVmKGN0eCwgcHJvdmlkZXJBc3QpIHtcbiAgICB2YXIgZmxhZ3MgPSAwIC8qIE5vbmUgKi87XG4gICAgaWYgKCFwcm92aWRlckFzdC5lYWdlcikge1xuICAgICAgICBmbGFncyB8PSA0MDk2IC8qIExhenlQcm92aWRlciAqLztcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVyQXN0LnByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLlByaXZhdGVTZXJ2aWNlKSB7XG4gICAgICAgIGZsYWdzIHw9IDgxOTIgLyogUHJpdmF0ZVByb3ZpZGVyICovO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJBc3QuaXNNb2R1bGUpIHtcbiAgICAgICAgZmxhZ3MgfD0gMTA3Mzc0MTgyNCAvKiBUeXBlTW9kdWxlUHJvdmlkZXIgKi87XG4gICAgfVxuICAgIHByb3ZpZGVyQXN0LmxpZmVjeWNsZUhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGxpZmVjeWNsZUhvb2spIHtcbiAgICAgICAgLy8gZm9yIHJlZ3VsYXIgcHJvdmlkZXJzLCB3ZSBvbmx5IHN1cHBvcnQgbmdPbkRlc3Ryb3lcbiAgICAgICAgaWYgKGxpZmVjeWNsZUhvb2sgPT09IExpZmVjeWNsZUhvb2tzLk9uRGVzdHJveSB8fFxuICAgICAgICAgICAgcHJvdmlkZXJBc3QucHJvdmlkZXJUeXBlID09PSBQcm92aWRlckFzdFR5cGUuRGlyZWN0aXZlIHx8XG4gICAgICAgICAgICBwcm92aWRlckFzdC5wcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5Db21wb25lbnQpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IGxpZmVjeWNsZUhvb2tUb05vZGVGbGFnKGxpZmVjeWNsZUhvb2spO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgdmFyIF9hID0gcHJvdmlkZXJBc3QubXVsdGlQcm92aWRlciA/XG4gICAgICAgIG11bHRpUHJvdmlkZXJEZWYoY3R4LCBmbGFncywgcHJvdmlkZXJBc3QucHJvdmlkZXJzKSA6XG4gICAgICAgIHNpbmdsZVByb3ZpZGVyRGVmKGN0eCwgZmxhZ3MsIHByb3ZpZGVyQXN0LnByb3ZpZGVyVHlwZSwgcHJvdmlkZXJBc3QucHJvdmlkZXJzWzBdKSwgcHJvdmlkZXJFeHByID0gX2EucHJvdmlkZXJFeHByLCBwcm92aWRlckZsYWdzID0gX2EuZmxhZ3MsIGRlcHNFeHByID0gX2EuZGVwc0V4cHI7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdmlkZXJFeHByOiBwcm92aWRlckV4cHIsXG4gICAgICAgIGZsYWdzOiBwcm92aWRlckZsYWdzLCBkZXBzRXhwcjogZGVwc0V4cHIsXG4gICAgICAgIHRva2VuRXhwcjogdG9rZW5FeHByKGN0eCwgcHJvdmlkZXJBc3QudG9rZW4pLFxuICAgIH07XG59XG5mdW5jdGlvbiBtdWx0aVByb3ZpZGVyRGVmKGN0eCwgZmxhZ3MsIHByb3ZpZGVycykge1xuICAgIHZhciBhbGxEZXBEZWZzID0gW107XG4gICAgdmFyIGFsbFBhcmFtcyA9IFtdO1xuICAgIHZhciBleHBycyA9IHByb3ZpZGVycy5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyLCBwcm92aWRlckluZGV4KSB7XG4gICAgICAgIHZhciBleHByO1xuICAgICAgICBpZiAocHJvdmlkZXIudXNlQ2xhc3MpIHtcbiAgICAgICAgICAgIHZhciBkZXBFeHBycyA9IGNvbnZlcnREZXBzKHByb3ZpZGVySW5kZXgsIHByb3ZpZGVyLmRlcHMgfHwgcHJvdmlkZXIudXNlQ2xhc3MuZGlEZXBzKTtcbiAgICAgICAgICAgIGV4cHIgPSBjdHguaW1wb3J0RXhwcihwcm92aWRlci51c2VDbGFzcy5yZWZlcmVuY2UpLmluc3RhbnRpYXRlKGRlcEV4cHJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VGYWN0b3J5KSB7XG4gICAgICAgICAgICB2YXIgZGVwRXhwcnMgPSBjb252ZXJ0RGVwcyhwcm92aWRlckluZGV4LCBwcm92aWRlci5kZXBzIHx8IHByb3ZpZGVyLnVzZUZhY3RvcnkuZGlEZXBzKTtcbiAgICAgICAgICAgIGV4cHIgPSBjdHguaW1wb3J0RXhwcihwcm92aWRlci51c2VGYWN0b3J5LnJlZmVyZW5jZSkuY2FsbEZuKGRlcEV4cHJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm92aWRlci51c2VFeGlzdGluZykge1xuICAgICAgICAgICAgdmFyIGRlcEV4cHJzID0gY29udmVydERlcHMocHJvdmlkZXJJbmRleCwgW3sgdG9rZW46IHByb3ZpZGVyLnVzZUV4aXN0aW5nIH1dKTtcbiAgICAgICAgICAgIGV4cHIgPSBkZXBFeHByc1swXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGV4cHIgPSBjb252ZXJ0VmFsdWVUb091dHB1dEFzdChjdHgsIHByb3ZpZGVyLnVzZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcjtcbiAgICB9KTtcbiAgICB2YXIgcHJvdmlkZXJFeHByID0gZm4oYWxsUGFyYW1zLCBbbmV3IFJldHVyblN0YXRlbWVudChsaXRlcmFsQXJyKGV4cHJzKSldLCBJTkZFUlJFRF9UWVBFKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcm92aWRlckV4cHI6IHByb3ZpZGVyRXhwcixcbiAgICAgICAgZmxhZ3M6IGZsYWdzIHwgMTAyNCAvKiBUeXBlRmFjdG9yeVByb3ZpZGVyICovLFxuICAgICAgICBkZXBzRXhwcjogbGl0ZXJhbEFycihhbGxEZXBEZWZzKVxuICAgIH07XG4gICAgZnVuY3Rpb24gY29udmVydERlcHMocHJvdmlkZXJJbmRleCwgZGVwcykge1xuICAgICAgICByZXR1cm4gZGVwcy5tYXAoZnVuY3Rpb24gKGRlcCwgZGVwSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBwYXJhbU5hbWUgPSBcInBcIiArIHByb3ZpZGVySW5kZXggKyBcIl9cIiArIGRlcEluZGV4O1xuICAgICAgICAgICAgYWxsUGFyYW1zLnB1c2gobmV3IEZuUGFyYW0ocGFyYW1OYW1lLCBEWU5BTUlDX1RZUEUpKTtcbiAgICAgICAgICAgIGFsbERlcERlZnMucHVzaChkZXBEZWYoY3R4LCBkZXApKTtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZShwYXJhbU5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBzaW5nbGVQcm92aWRlckRlZihjdHgsIGZsYWdzLCBwcm92aWRlclR5cGUsIHByb3ZpZGVyTWV0YSkge1xuICAgIHZhciBwcm92aWRlckV4cHI7XG4gICAgdmFyIGRlcHM7XG4gICAgaWYgKHByb3ZpZGVyVHlwZSA9PT0gUHJvdmlkZXJBc3RUeXBlLkRpcmVjdGl2ZSB8fCBwcm92aWRlclR5cGUgPT09IFByb3ZpZGVyQXN0VHlwZS5Db21wb25lbnQpIHtcbiAgICAgICAgcHJvdmlkZXJFeHByID0gY3R4LmltcG9ydEV4cHIocHJvdmlkZXJNZXRhLnVzZUNsYXNzLnJlZmVyZW5jZSk7XG4gICAgICAgIGZsYWdzIHw9IDE2Mzg0IC8qIFR5cGVEaXJlY3RpdmUgKi87XG4gICAgICAgIGRlcHMgPSBwcm92aWRlck1ldGEuZGVwcyB8fCBwcm92aWRlck1ldGEudXNlQ2xhc3MuZGlEZXBzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHByb3ZpZGVyTWV0YS51c2VDbGFzcykge1xuICAgICAgICAgICAgcHJvdmlkZXJFeHByID0gY3R4LmltcG9ydEV4cHIocHJvdmlkZXJNZXRhLnVzZUNsYXNzLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBmbGFncyB8PSA1MTIgLyogVHlwZUNsYXNzUHJvdmlkZXIgKi87XG4gICAgICAgICAgICBkZXBzID0gcHJvdmlkZXJNZXRhLmRlcHMgfHwgcHJvdmlkZXJNZXRhLnVzZUNsYXNzLmRpRGVwcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwcm92aWRlck1ldGEudXNlRmFjdG9yeSkge1xuICAgICAgICAgICAgcHJvdmlkZXJFeHByID0gY3R4LmltcG9ydEV4cHIocHJvdmlkZXJNZXRhLnVzZUZhY3RvcnkucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGZsYWdzIHw9IDEwMjQgLyogVHlwZUZhY3RvcnlQcm92aWRlciAqLztcbiAgICAgICAgICAgIGRlcHMgPSBwcm92aWRlck1ldGEuZGVwcyB8fCBwcm92aWRlck1ldGEudXNlRmFjdG9yeS5kaURlcHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvdmlkZXJNZXRhLnVzZUV4aXN0aW5nKSB7XG4gICAgICAgICAgICBwcm92aWRlckV4cHIgPSBOVUxMX0VYUFI7XG4gICAgICAgICAgICBmbGFncyB8PSAyMDQ4IC8qIFR5cGVVc2VFeGlzdGluZ1Byb3ZpZGVyICovO1xuICAgICAgICAgICAgZGVwcyA9IFt7IHRva2VuOiBwcm92aWRlck1ldGEudXNlRXhpc3RpbmcgfV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm92aWRlckV4cHIgPSBjb252ZXJ0VmFsdWVUb091dHB1dEFzdChjdHgsIHByb3ZpZGVyTWV0YS51c2VWYWx1ZSk7XG4gICAgICAgICAgICBmbGFncyB8PSAyNTYgLyogVHlwZVZhbHVlUHJvdmlkZXIgKi87XG4gICAgICAgICAgICBkZXBzID0gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGRlcHNFeHByID0gbGl0ZXJhbEFycihkZXBzLm1hcChmdW5jdGlvbiAoZGVwKSB7IHJldHVybiBkZXBEZWYoY3R4LCBkZXApOyB9KSk7XG4gICAgcmV0dXJuIHsgcHJvdmlkZXJFeHByOiBwcm92aWRlckV4cHIsIGZsYWdzOiBmbGFncywgZGVwc0V4cHI6IGRlcHNFeHByIH07XG59XG5mdW5jdGlvbiB0b2tlbkV4cHIoY3R4LCB0b2tlbk1ldGEpIHtcbiAgICByZXR1cm4gdG9rZW5NZXRhLmlkZW50aWZpZXIgPyBjdHguaW1wb3J0RXhwcih0b2tlbk1ldGEuaWRlbnRpZmllci5yZWZlcmVuY2UpIDpcbiAgICAgICAgbGl0ZXJhbCh0b2tlbk1ldGEudmFsdWUpO1xufVxuZnVuY3Rpb24gZGVwRGVmKGN0eCwgZGVwKSB7XG4gICAgLy8gTm90ZTogdGhlIGZvbGxvd2luZyBmaWVsZHMgaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZCBvdXQgYnkgcHJvdmlkZXJfYW5hbHl6ZXI6XG4gICAgLy8gLSBpc0F0dHJpYnV0ZSwgaXNIb3N0XG4gICAgdmFyIGV4cHIgPSBkZXAuaXNWYWx1ZSA/IGNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0KGN0eCwgZGVwLnZhbHVlKSA6IHRva2VuRXhwcihjdHgsIGRlcC50b2tlbik7XG4gICAgdmFyIGZsYWdzID0gMCAvKiBOb25lICovO1xuICAgIGlmIChkZXAuaXNTa2lwU2VsZikge1xuICAgICAgICBmbGFncyB8PSAxIC8qIFNraXBTZWxmICovO1xuICAgIH1cbiAgICBpZiAoZGVwLmlzT3B0aW9uYWwpIHtcbiAgICAgICAgZmxhZ3MgfD0gMiAvKiBPcHRpb25hbCAqLztcbiAgICB9XG4gICAgaWYgKGRlcC5pc1NlbGYpIHtcbiAgICAgICAgZmxhZ3MgfD0gNCAvKiBTZWxmICovO1xuICAgIH1cbiAgICBpZiAoZGVwLmlzVmFsdWUpIHtcbiAgICAgICAgZmxhZ3MgfD0gOCAvKiBWYWx1ZSAqLztcbiAgICB9XG4gICAgcmV0dXJuIGZsYWdzID09PSAwIC8qIE5vbmUgKi8gPyBleHByIDogbGl0ZXJhbEFycihbbGl0ZXJhbChmbGFncyksIGV4cHJdKTtcbn1cbmZ1bmN0aW9uIGxpZmVjeWNsZUhvb2tUb05vZGVGbGFnKGxpZmVjeWNsZUhvb2spIHtcbiAgICB2YXIgbm9kZUZsYWcgPSAwIC8qIE5vbmUgKi87XG4gICAgc3dpdGNoIChsaWZlY3ljbGVIb29rKSB7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50Q2hlY2tlZDpcbiAgICAgICAgICAgIG5vZGVGbGFnID0gMjA5NzE1MiAvKiBBZnRlckNvbnRlbnRDaGVja2VkICovO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJDb250ZW50SW5pdDpcbiAgICAgICAgICAgIG5vZGVGbGFnID0gMTA0ODU3NiAvKiBBZnRlckNvbnRlbnRJbml0ICovO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3Q2hlY2tlZDpcbiAgICAgICAgICAgIG5vZGVGbGFnID0gODM4ODYwOCAvKiBBZnRlclZpZXdDaGVja2VkICovO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdDpcbiAgICAgICAgICAgIG5vZGVGbGFnID0gNDE5NDMwNCAvKiBBZnRlclZpZXdJbml0ICovO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuRG9DaGVjazpcbiAgICAgICAgICAgIG5vZGVGbGFnID0gMjYyMTQ0IC8qIERvQ2hlY2sgKi87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXM6XG4gICAgICAgICAgICBub2RlRmxhZyA9IDUyNDI4OCAvKiBPbkNoYW5nZXMgKi87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3k6XG4gICAgICAgICAgICBub2RlRmxhZyA9IDEzMTA3MiAvKiBPbkRlc3Ryb3kgKi87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkluaXQ6XG4gICAgICAgICAgICBub2RlRmxhZyA9IDY1NTM2IC8qIE9uSW5pdCAqLztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZUZsYWc7XG59XG5mdW5jdGlvbiBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJQcm92aWRlckRlZihyZWZsZWN0b3IsIGN0eCwgZmxhZ3MsIGVudHJ5Q29tcG9uZW50cykge1xuICAgIHZhciBlbnRyeUNvbXBvbmVudEZhY3RvcmllcyA9IGVudHJ5Q29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGVudHJ5Q29tcG9uZW50KSB7IHJldHVybiBjdHguaW1wb3J0RXhwcihlbnRyeUNvbXBvbmVudC5jb21wb25lbnRGYWN0b3J5KTsgfSk7XG4gICAgdmFyIHRva2VuID0gY3JlYXRlVG9rZW5Gb3JFeHRlcm5hbFJlZmVyZW5jZShyZWZsZWN0b3IsIElkZW50aWZpZXJzLkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7XG4gICAgdmFyIGNsYXNzTWV0YSA9IHtcbiAgICAgICAgZGlEZXBzOiBbXG4gICAgICAgICAgICB7IGlzVmFsdWU6IHRydWUsIHZhbHVlOiBsaXRlcmFsQXJyKGVudHJ5Q29tcG9uZW50RmFjdG9yaWVzKSB9LFxuICAgICAgICAgICAgeyB0b2tlbjogdG9rZW4sIGlzU2tpcFNlbGY6IHRydWUsIGlzT3B0aW9uYWw6IHRydWUgfSxcbiAgICAgICAgICAgIHsgdG9rZW46IGNyZWF0ZVRva2VuRm9yRXh0ZXJuYWxSZWZlcmVuY2UocmVmbGVjdG9yLCBJZGVudGlmaWVycy5OZ01vZHVsZVJlZikgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGlmZWN5Y2xlSG9va3M6IFtdLFxuICAgICAgICByZWZlcmVuY2U6IHJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuQ29kZWdlbkNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcilcbiAgICB9O1xuICAgIHZhciBfYSA9IHNpbmdsZVByb3ZpZGVyRGVmKGN0eCwgZmxhZ3MsIFByb3ZpZGVyQXN0VHlwZS5Qcml2YXRlU2VydmljZSwge1xuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIG11bHRpOiBmYWxzZSxcbiAgICAgICAgdXNlQ2xhc3M6IGNsYXNzTWV0YSxcbiAgICB9KSwgcHJvdmlkZXJFeHByID0gX2EucHJvdmlkZXJFeHByLCBwcm92aWRlckZsYWdzID0gX2EuZmxhZ3MsIGRlcHNFeHByID0gX2EuZGVwc0V4cHI7XG4gICAgcmV0dXJuIHsgcHJvdmlkZXJFeHByOiBwcm92aWRlckV4cHIsIGZsYWdzOiBwcm92aWRlckZsYWdzLCBkZXBzRXhwcjogZGVwc0V4cHIsIHRva2VuRXhwcjogdG9rZW5FeHByKGN0eCwgdG9rZW4pIH07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBOZ01vZHVsZUNvbXBpbGVSZXN1bHQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdNb2R1bGVDb21waWxlUmVzdWx0KG5nTW9kdWxlRmFjdG9yeVZhcikge1xuICAgICAgICB0aGlzLm5nTW9kdWxlRmFjdG9yeVZhciA9IG5nTW9kdWxlRmFjdG9yeVZhcjtcbiAgICB9XG4gICAgcmV0dXJuIE5nTW9kdWxlQ29tcGlsZVJlc3VsdDtcbn0oKSk7XG52YXIgTE9HX1ZBUiA9IHZhcmlhYmxlKCdfbCcpO1xudmFyIE5nTW9kdWxlQ29tcGlsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdNb2R1bGVDb21waWxlcihyZWZsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5yZWZsZWN0b3IgPSByZWZsZWN0b3I7XG4gICAgfVxuICAgIE5nTW9kdWxlQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoY3R4LCBuZ01vZHVsZU1ldGEsIGV4dHJhUHJvdmlkZXJzKSB7XG4gICAgICAgIHZhciBzb3VyY2VTcGFuID0gdHlwZVNvdXJjZVNwYW4oJ05nTW9kdWxlJywgbmdNb2R1bGVNZXRhLnR5cGUpO1xuICAgICAgICB2YXIgZW50cnlDb21wb25lbnRGYWN0b3JpZXMgPSBuZ01vZHVsZU1ldGEudHJhbnNpdGl2ZU1vZHVsZS5lbnRyeUNvbXBvbmVudHM7XG4gICAgICAgIHZhciBib290c3RyYXBDb21wb25lbnRzID0gbmdNb2R1bGVNZXRhLmJvb3RzdHJhcENvbXBvbmVudHM7XG4gICAgICAgIHZhciBwcm92aWRlclBhcnNlciA9IG5ldyBOZ01vZHVsZVByb3ZpZGVyQW5hbHl6ZXIodGhpcy5yZWZsZWN0b3IsIG5nTW9kdWxlTWV0YSwgZXh0cmFQcm92aWRlcnMsIHNvdXJjZVNwYW4pO1xuICAgICAgICB2YXIgcHJvdmlkZXJEZWZzID0gW2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlclByb3ZpZGVyRGVmKHRoaXMucmVmbGVjdG9yLCBjdHgsIDAgLyogTm9uZSAqLywgZW50cnlDb21wb25lbnRGYWN0b3JpZXMpXVxuICAgICAgICAgICAgLmNvbmNhdChwcm92aWRlclBhcnNlci5wYXJzZSgpLm1hcChmdW5jdGlvbiAocHJvdmlkZXIpIHsgcmV0dXJuIHByb3ZpZGVyRGVmKGN0eCwgcHJvdmlkZXIpOyB9KSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXJFeHByID0gX2EucHJvdmlkZXJFeHByLCBkZXBzRXhwciA9IF9hLmRlcHNFeHByLCBmbGFncyA9IF9hLmZsYWdzLCB0b2tlbkV4cHIgPSBfYS50b2tlbkV4cHI7XG4gICAgICAgICAgICByZXR1cm4gaW1wb3J0RXhwcihJZGVudGlmaWVycy5tb2R1bGVQcm92aWRlckRlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGZsYWdzKSwgdG9rZW5FeHByLCBwcm92aWRlckV4cHIsIGRlcHNFeHByXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBuZ01vZHVsZURlZiA9IGltcG9ydEV4cHIoSWRlbnRpZmllcnMubW9kdWxlRGVmKS5jYWxsRm4oW2xpdGVyYWxBcnIocHJvdmlkZXJEZWZzKV0pO1xuICAgICAgICB2YXIgbmdNb2R1bGVEZWZGYWN0b3J5ID0gZm4oW25ldyBGblBhcmFtKExPR19WQVIubmFtZSldLCBbbmV3IFJldHVyblN0YXRlbWVudChuZ01vZHVsZURlZildLCBJTkZFUlJFRF9UWVBFKTtcbiAgICAgICAgdmFyIG5nTW9kdWxlRmFjdG9yeVZhciA9IGlkZW50aWZpZXJOYW1lKG5nTW9kdWxlTWV0YS50eXBlKSArIFwiTmdGYWN0b3J5XCI7XG4gICAgICAgIHRoaXMuX2NyZWF0ZU5nTW9kdWxlRmFjdG9yeShjdHgsIG5nTW9kdWxlTWV0YS50eXBlLnJlZmVyZW5jZSwgaW1wb3J0RXhwcihJZGVudGlmaWVycy5jcmVhdGVNb2R1bGVGYWN0b3J5KS5jYWxsRm4oW1xuICAgICAgICAgICAgY3R4LmltcG9ydEV4cHIobmdNb2R1bGVNZXRhLnR5cGUucmVmZXJlbmNlKSxcbiAgICAgICAgICAgIGxpdGVyYWxBcnIoYm9vdHN0cmFwQ29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGlkKSB7IHJldHVybiBjdHguaW1wb3J0RXhwcihpZC5yZWZlcmVuY2UpOyB9KSksXG4gICAgICAgICAgICBuZ01vZHVsZURlZkZhY3RvcnlcbiAgICAgICAgXSkpO1xuICAgICAgICBpZiAobmdNb2R1bGVNZXRhLmlkKSB7XG4gICAgICAgICAgICB2YXIgaWQgPSB0eXBlb2YgbmdNb2R1bGVNZXRhLmlkID09PSAnc3RyaW5nJyA/IGxpdGVyYWwobmdNb2R1bGVNZXRhLmlkKSA6XG4gICAgICAgICAgICAgICAgY3R4LmltcG9ydEV4cHIobmdNb2R1bGVNZXRhLmlkKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RlckZhY3RvcnlTdG10ID0gaW1wb3J0RXhwcihJZGVudGlmaWVycy5SZWdpc3Rlck1vZHVsZUZhY3RvcnlGbilcbiAgICAgICAgICAgICAgICAuY2FsbEZuKFtpZCwgdmFyaWFibGUobmdNb2R1bGVGYWN0b3J5VmFyKV0pXG4gICAgICAgICAgICAgICAgLnRvU3RtdCgpO1xuICAgICAgICAgICAgY3R4LnN0YXRlbWVudHMucHVzaChyZWdpc3RlckZhY3RvcnlTdG10KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE5nTW9kdWxlQ29tcGlsZVJlc3VsdChuZ01vZHVsZUZhY3RvcnlWYXIpO1xuICAgIH07XG4gICAgTmdNb2R1bGVDb21waWxlci5wcm90b3R5cGUuY3JlYXRlU3R1YiA9IGZ1bmN0aW9uIChjdHgsIG5nTW9kdWxlUmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZU5nTW9kdWxlRmFjdG9yeShjdHgsIG5nTW9kdWxlUmVmZXJlbmNlLCBOVUxMX0VYUFIpO1xuICAgIH07XG4gICAgTmdNb2R1bGVDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZU5nTW9kdWxlRmFjdG9yeSA9IGZ1bmN0aW9uIChjdHgsIHJlZmVyZW5jZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIG5nTW9kdWxlRmFjdG9yeVZhciA9IGlkZW50aWZpZXJOYW1lKHsgcmVmZXJlbmNlOiByZWZlcmVuY2UgfSkgKyBcIk5nRmFjdG9yeVwiO1xuICAgICAgICB2YXIgbmdNb2R1bGVGYWN0b3J5U3RtdCA9IHZhcmlhYmxlKG5nTW9kdWxlRmFjdG9yeVZhcilcbiAgICAgICAgICAgIC5zZXQodmFsdWUpXG4gICAgICAgICAgICAudG9EZWNsU3RtdChpbXBvcnRUeXBlKElkZW50aWZpZXJzLk5nTW9kdWxlRmFjdG9yeSwgW2V4cHJlc3Npb25UeXBlKGN0eC5pbXBvcnRFeHByKHJlZmVyZW5jZSkpXSwgW1R5cGVNb2RpZmllci5Db25zdF0pLCBbU3RtdE1vZGlmaWVyLkZpbmFsLCBTdG10TW9kaWZpZXIuRXhwb3J0ZWRdKTtcbiAgICAgICAgY3R4LnN0YXRlbWVudHMucHVzaChuZ01vZHVsZUZhY3RvcnlTdG10KTtcbiAgICB9O1xuICAgIHJldHVybiBOZ01vZHVsZUNvbXBpbGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXNvbHZlcyB0eXBlcyB0byB7QGxpbmsgTmdNb2R1bGV9LlxuICovXG52YXIgTmdNb2R1bGVSZXNvbHZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ01vZHVsZVJlc29sdmVyKF9yZWZsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fcmVmbGVjdG9yID0gX3JlZmxlY3RvcjtcbiAgICB9XG4gICAgTmdNb2R1bGVSZXNvbHZlci5wcm90b3R5cGUuaXNOZ01vZHVsZSA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0aGlzLl9yZWZsZWN0b3IuYW5ub3RhdGlvbnModHlwZSkuc29tZShjcmVhdGVOZ01vZHVsZS5pc1R5cGVPZik7IH07XG4gICAgTmdNb2R1bGVSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh0eXBlLCB0aHJvd0lmTm90Rm91bmQpIHtcbiAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCA9PT0gdm9pZCAwKSB7IHRocm93SWZOb3RGb3VuZCA9IHRydWU7IH1cbiAgICAgICAgdmFyIG5nTW9kdWxlTWV0YSA9IGZpbmRMYXN0KHRoaXMuX3JlZmxlY3Rvci5hbm5vdGF0aW9ucyh0eXBlKSwgY3JlYXRlTmdNb2R1bGUuaXNUeXBlT2YpO1xuICAgICAgICBpZiAobmdNb2R1bGVNZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gbmdNb2R1bGVNZXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIE5nTW9kdWxlIG1ldGFkYXRhIGZvdW5kIGZvciAnXCIgKyBzdHJpbmdpZnkodHlwZSkgKyBcIicuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBOZ01vZHVsZVJlc29sdmVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gZGVidWdPdXRwdXRBc3RBc1R5cGVTY3JpcHQoYXN0KSB7XG4gICAgdmFyIGNvbnZlcnRlciA9IG5ldyBfVHNFbWl0dGVyVmlzaXRvcigpO1xuICAgIHZhciBjdHggPSBFbWl0dGVyVmlzaXRvckNvbnRleHQuY3JlYXRlUm9vdCgpO1xuICAgIHZhciBhc3RzID0gQXJyYXkuaXNBcnJheShhc3QpID8gYXN0IDogW2FzdF07XG4gICAgYXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgaWYgKGFzdCBpbnN0YW5jZW9mIFN0YXRlbWVudCkge1xuICAgICAgICAgICAgYXN0LnZpc2l0U3RhdGVtZW50KGNvbnZlcnRlciwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3QgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBhc3QudmlzaXRFeHByZXNzaW9uKGNvbnZlcnRlciwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhc3QgaW5zdGFuY2VvZiBUeXBlJDEpIHtcbiAgICAgICAgICAgIGFzdC52aXNpdFR5cGUoY29udmVydGVyLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG9uJ3Qga25vdyBob3cgdG8gcHJpbnQgZGVidWcgaW5mbyBmb3IgXCIgKyBhc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGN0eC50b1NvdXJjZSgpO1xufVxudmFyIFR5cGVTY3JpcHRFbWl0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFR5cGVTY3JpcHRFbWl0dGVyKCkge1xuICAgIH1cbiAgICBUeXBlU2NyaXB0RW1pdHRlci5wcm90b3R5cGUuZW1pdFN0YXRlbWVudHNBbmRDb250ZXh0ID0gZnVuY3Rpb24gKGdlbkZpbGVQYXRoLCBzdG10cywgcHJlYW1ibGUsIGVtaXRTb3VyY2VNYXBzLCByZWZlcmVuY2VGaWx0ZXIsIGltcG9ydEZpbHRlcikge1xuICAgICAgICBpZiAocHJlYW1ibGUgPT09IHZvaWQgMCkgeyBwcmVhbWJsZSA9ICcnOyB9XG4gICAgICAgIGlmIChlbWl0U291cmNlTWFwcyA9PT0gdm9pZCAwKSB7IGVtaXRTb3VyY2VNYXBzID0gdHJ1ZTsgfVxuICAgICAgICB2YXIgY29udmVydGVyID0gbmV3IF9Uc0VtaXR0ZXJWaXNpdG9yKHJlZmVyZW5jZUZpbHRlciwgaW1wb3J0RmlsdGVyKTtcbiAgICAgICAgdmFyIGN0eCA9IEVtaXR0ZXJWaXNpdG9yQ29udGV4dC5jcmVhdGVSb290KCk7XG4gICAgICAgIGNvbnZlcnRlci52aXNpdEFsbFN0YXRlbWVudHMoc3RtdHMsIGN0eCk7XG4gICAgICAgIHZhciBwcmVhbWJsZUxpbmVzID0gcHJlYW1ibGUgPyBwcmVhbWJsZS5zcGxpdCgnXFxuJykgOiBbXTtcbiAgICAgICAgY29udmVydGVyLnJlZXhwb3J0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWV4cG9ydHMsIGV4cG9ydGVkTW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgdmFyIHJlZXhwb3J0c0NvZGUgPSByZWV4cG9ydHMubWFwKGZ1bmN0aW9uIChyZWV4cG9ydCkgeyByZXR1cm4gcmVleHBvcnQubmFtZSArIFwiIGFzIFwiICsgcmVleHBvcnQuYXM7IH0pLmpvaW4oJywnKTtcbiAgICAgICAgICAgIHByZWFtYmxlTGluZXMucHVzaChcImV4cG9ydCB7XCIgKyByZWV4cG9ydHNDb2RlICsgXCJ9IGZyb20gJ1wiICsgZXhwb3J0ZWRNb2R1bGVOYW1lICsgXCInO1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnZlcnRlci5pbXBvcnRzV2l0aFByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCwgaW1wb3J0ZWRNb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICAvLyBOb3RlOiBjYW4ndCB3cml0ZSB0aGUgcmVhbCB3b3JkIGZvciBpbXBvcnQgYXMgaXQgc2NyZXdzIHVwIHN5c3RlbS5qcyBhdXRvIGRldGVjdGlvbi4uLlxuICAgICAgICAgICAgcHJlYW1ibGVMaW5lcy5wdXNoKFwiaW1wXCIgK1xuICAgICAgICAgICAgICAgIChcIm9ydCAqIGFzIFwiICsgcHJlZml4ICsgXCIgZnJvbSAnXCIgKyBpbXBvcnRlZE1vZHVsZU5hbWUgKyBcIic7XCIpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzbSA9IGVtaXRTb3VyY2VNYXBzID9cbiAgICAgICAgICAgIGN0eC50b1NvdXJjZU1hcEdlbmVyYXRvcihnZW5GaWxlUGF0aCwgcHJlYW1ibGVMaW5lcy5sZW5ndGgpLnRvSnNDb21tZW50KCkgOlxuICAgICAgICAgICAgJyc7XG4gICAgICAgIHZhciBsaW5lcyA9IF9fc3ByZWFkKHByZWFtYmxlTGluZXMsIFtjdHgudG9Tb3VyY2UoKSwgc21dKTtcbiAgICAgICAgaWYgKHNtKSB7XG4gICAgICAgICAgICAvLyBhbHdheXMgYWRkIGEgbmV3bGluZSBhdCB0aGUgZW5kLCBhcyBzb21lIHRvb2xzIGhhdmUgYnVncyB3aXRob3V0IGl0LlxuICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnNldFByZWFtYmxlTGluZUNvdW50KHByZWFtYmxlTGluZXMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHsgc291cmNlVGV4dDogbGluZXMuam9pbignXFxuJyksIGNvbnRleHQ6IGN0eCB9O1xuICAgIH07XG4gICAgVHlwZVNjcmlwdEVtaXR0ZXIucHJvdG90eXBlLmVtaXRTdGF0ZW1lbnRzID0gZnVuY3Rpb24gKGdlbkZpbGVQYXRoLCBzdG10cywgcHJlYW1ibGUpIHtcbiAgICAgICAgaWYgKHByZWFtYmxlID09PSB2b2lkIDApIHsgcHJlYW1ibGUgPSAnJzsgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbWl0U3RhdGVtZW50c0FuZENvbnRleHQoZ2VuRmlsZVBhdGgsIHN0bXRzLCBwcmVhbWJsZSkuc291cmNlVGV4dDtcbiAgICB9O1xuICAgIHJldHVybiBUeXBlU2NyaXB0RW1pdHRlcjtcbn0oKSk7XG52YXIgX1RzRW1pdHRlclZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKF9Uc0VtaXR0ZXJWaXNpdG9yLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIF9Uc0VtaXR0ZXJWaXNpdG9yKHJlZmVyZW5jZUZpbHRlciwgaW1wb3J0RmlsdGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGZhbHNlKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5yZWZlcmVuY2VGaWx0ZXIgPSByZWZlcmVuY2VGaWx0ZXI7XG4gICAgICAgIF90aGlzLmltcG9ydEZpbHRlciA9IGltcG9ydEZpbHRlcjtcbiAgICAgICAgX3RoaXMudHlwZUV4cHJlc3Npb24gPSAwO1xuICAgICAgICBfdGhpcy5pbXBvcnRzV2l0aFByZWZpeGVzID0gbmV3IE1hcCgpO1xuICAgICAgICBfdGhpcy5yZWV4cG9ydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHlwZSA9IGZ1bmN0aW9uICh0LCBjdHgsIGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGlmIChkZWZhdWx0VHlwZSA9PT0gdm9pZCAwKSB7IGRlZmF1bHRUeXBlID0gJ2FueSc7IH1cbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZUV4cHJlc3Npb24rKztcbiAgICAgICAgICAgIHQudmlzaXRUeXBlKHRoaXMsIGN0eCk7XG4gICAgICAgICAgICB0aGlzLnR5cGVFeHByZXNzaW9uLS07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgZGVmYXVsdFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRMaXRlcmFsRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhc3QudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGFzdC50eXBlICE9IElORkVSUkVEX1RZUEUpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChhc3QsIFwiKFwiICsgdmFsdWUgKyBcIiBhcyBhbnkpXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsRXhwci5jYWxsKHRoaXMsIGFzdCwgY3R4KTtcbiAgICB9O1xuICAgIC8vIFRlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgc3RyaWN0TnVsbENoZWNrIGVuYWJsZWQgY29uc3VtZXJzIG9mIG5nYyBlbWl0LlxuICAgIC8vIEluIFNOQyBtb2RlLCBbXSBoYXZlIHRoZSB0eXBlIG5ldmVyW10sIHNvIHdlIGNhc3QgaGVyZSB0byBhbnlbXS5cbiAgICAvLyBUT0RPOiBuYXJyb3cgdGhlIGNhc3QgdG8gYSBtb3JlIGV4cGxpY2l0IHR5cGUsIG9yIHVzZSBhIHBhdHRlcm4gdGhhdCBkb2VzIG5vdFxuICAgIC8vIHN0YXJ0IHdpdGggW10uY29uY2F0LiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9wdWxsLzExODQ2XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICBpZiAoYXN0LmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoYXN0LCAnKCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBfc3VwZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEFycmF5RXhwci5jYWxsKHRoaXMsIGFzdCwgY3R4KTtcbiAgICAgICAgaWYgKGFzdC5lbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY3R4LnByaW50KGFzdCwgJyBhcyBhbnlbXSknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RXh0ZXJuYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHRoaXMuX3Zpc2l0SWRlbnRpZmllcihhc3QudmFsdWUsIGFzdC50eXBlUGFyYW1zLCBjdHgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFzc2VydE5vdE51bGxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBfc3VwZXIucHJvdG90eXBlLnZpc2l0QXNzZXJ0Tm90TnVsbEV4cHIuY2FsbCh0aGlzLCBhc3QsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChhc3QsICchJyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlVmFyU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgaWYgKHN0bXQuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLkV4cG9ydGVkKSAmJiBzdG10LnZhbHVlIGluc3RhbmNlb2YgRXh0ZXJuYWxFeHByICYmXG4gICAgICAgICAgICAhc3RtdC50eXBlKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSByZWV4cG9ydFxuICAgICAgICAgICAgdmFyIF9hID0gc3RtdC52YWx1ZS52YWx1ZSwgbmFtZV8xID0gX2EubmFtZSwgbW9kdWxlTmFtZSA9IF9hLm1vZHVsZU5hbWU7XG4gICAgICAgICAgICBpZiAobW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciByZWV4cG9ydHMgPSB0aGlzLnJlZXhwb3J0cy5nZXQobW9kdWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVleHBvcnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVleHBvcnRzLnNldChtb2R1bGVOYW1lLCByZWV4cG9ydHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWV4cG9ydHMucHVzaCh7IG5hbWU6IG5hbWVfMSwgYXM6IHN0bXQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RtdC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuRXhwb3J0ZWQpKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJleHBvcnQgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdG10Lmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5GaW5hbCkpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChzdG10LCBcImNvbnN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsIFwidmFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChzdG10LCBcIiBcIiArIHN0bXQubmFtZSk7XG4gICAgICAgIHRoaXMuX3ByaW50Q29sb25UeXBlKHN0bXQudHlwZSwgY3R4KTtcbiAgICAgICAgaWYgKHN0bXQudmFsdWUpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChzdG10LCBcIiA9IFwiKTtcbiAgICAgICAgICAgIHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCI7XCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdFdyYXBwZWROb2RlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB2aXNpdCBhIFdyYXBwZWROb2RlRXhwciB3aGVuIG91dHB1dHRpbmcgVHlwZXNjcmlwdC4nKTtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdENhc3RFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKDxcIik7XG4gICAgICAgIGFzdC50eXBlLnZpc2l0VHlwZSh0aGlzLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIj5cIik7XG4gICAgICAgIGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCIpXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEluc3RhbnRpYXRlRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIm5ldyBcIik7XG4gICAgICAgIHRoaXMudHlwZUV4cHJlc3Npb24rKztcbiAgICAgICAgYXN0LmNsYXNzRXhwci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgdGhpcy50eXBlRXhwcmVzc2lvbi0tO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIihcIik7XG4gICAgICAgIHRoaXMudmlzaXRBbGxFeHByZXNzaW9ucyhhc3QuYXJncywgY3R4LCAnLCcpO1xuICAgICAgICBjdHgucHJpbnQoYXN0LCBcIilcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RGVjbGFyZUNsYXNzU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgY3R4LnB1c2hDbGFzcyhzdG10KTtcbiAgICAgICAgaWYgKHN0bXQuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLkV4cG9ydGVkKSkge1xuICAgICAgICAgICAgY3R4LnByaW50KHN0bXQsIFwiZXhwb3J0IFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJjbGFzcyBcIiArIHN0bXQubmFtZSk7XG4gICAgICAgIGlmIChzdG10LnBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCIgZXh0ZW5kcyBcIik7XG4gICAgICAgICAgICB0aGlzLnR5cGVFeHByZXNzaW9uKys7XG4gICAgICAgICAgICBzdG10LnBhcmVudC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgICAgIHRoaXMudHlwZUV4cHJlc3Npb24tLTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIiB7XCIpO1xuICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgIHN0bXQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7IHJldHVybiBfdGhpcy5fdmlzaXRDbGFzc0ZpZWxkKGZpZWxkLCBjdHgpOyB9KTtcbiAgICAgICAgaWYgKHN0bXQuY29uc3RydWN0b3JNZXRob2QgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdmlzaXRDbGFzc0NvbnN0cnVjdG9yKHN0bXQsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RtdC5nZXR0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGdldHRlcikgeyByZXR1cm4gX3RoaXMuX3Zpc2l0Q2xhc3NHZXR0ZXIoZ2V0dGVyLCBjdHgpOyB9KTtcbiAgICAgICAgc3RtdC5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkgeyByZXR1cm4gX3RoaXMuX3Zpc2l0Q2xhc3NNZXRob2QobWV0aG9kLCBjdHgpOyB9KTtcbiAgICAgICAgY3R4LmRlY0luZGVudCgpO1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIn1cIik7XG4gICAgICAgIGN0eC5wb3BDbGFzcygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRDbGFzc0ZpZWxkID0gZnVuY3Rpb24gKGZpZWxkLCBjdHgpIHtcbiAgICAgICAgaWYgKGZpZWxkLmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5Qcml2YXRlKSkge1xuICAgICAgICAgICAgLy8gY29tbWVudCBvdXQgYXMgYSB3b3JrYXJvdW5kIGZvciAjMTA5NjdcbiAgICAgICAgICAgIGN0eC5wcmludChudWxsLCBcIi8qcHJpdmF0ZSovIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLlN0YXRpYykpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChudWxsLCAnc3RhdGljICcpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChudWxsLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgdGhpcy5fcHJpbnRDb2xvblR5cGUoZmllbGQudHlwZSwgY3R4KTtcbiAgICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgJyA9ICcpO1xuICAgICAgICAgICAgZmllbGQuaW5pdGlhbGl6ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50bG4obnVsbCwgXCI7XCIpO1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzR2V0dGVyID0gZnVuY3Rpb24gKGdldHRlciwgY3R4KSB7XG4gICAgICAgIGlmIChnZXR0ZXIuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLlByaXZhdGUpKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgXCJwcml2YXRlIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnQobnVsbCwgXCJnZXQgXCIgKyBnZXR0ZXIubmFtZSArIFwiKClcIik7XG4gICAgICAgIHRoaXMuX3ByaW50Q29sb25UeXBlKGdldHRlci50eXBlLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnRsbihudWxsLCBcIiB7XCIpO1xuICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKGdldHRlci5ib2R5LCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludGxuKG51bGwsIFwifVwiKTtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRDbGFzc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJjb25zdHJ1Y3RvcihcIik7XG4gICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKHN0bXQuY29uc3RydWN0b3JNZXRob2QucGFyYW1zLCBjdHgpO1xuICAgICAgICBjdHgucHJpbnRsbihzdG10LCBcIikge1wiKTtcbiAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNvbnN0cnVjdG9yTWV0aG9kLmJvZHksIGN0eCk7XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9XCIpO1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl92aXNpdENsYXNzTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCwgY3R4KSB7XG4gICAgICAgIGlmIChtZXRob2QuaGFzTW9kaWZpZXIoU3RtdE1vZGlmaWVyLlByaXZhdGUpKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgXCJwcml2YXRlIFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjdHgucHJpbnQobnVsbCwgbWV0aG9kLm5hbWUgKyBcIihcIik7XG4gICAgICAgIHRoaXMuX3Zpc2l0UGFyYW1zKG1ldGhvZC5wYXJhbXMsIGN0eCk7XG4gICAgICAgIGN0eC5wcmludChudWxsLCBcIilcIik7XG4gICAgICAgIHRoaXMuX3ByaW50Q29sb25UeXBlKG1ldGhvZC50eXBlLCBjdHgsICd2b2lkJyk7XG4gICAgICAgIGN0eC5wcmludGxuKG51bGwsIFwiIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMobWV0aG9kLmJvZHksIGN0eCk7XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4obnVsbCwgXCJ9XCIpO1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVuY3Rpb25FeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGlmIChhc3QubmFtZSkge1xuICAgICAgICAgICAgY3R4LnByaW50KGFzdCwgJ2Z1bmN0aW9uICcpO1xuICAgICAgICAgICAgY3R4LnByaW50KGFzdCwgYXN0Lm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwiKFwiKTtcbiAgICAgICAgdGhpcy5fdmlzaXRQYXJhbXMoYXN0LnBhcmFtcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KGFzdCwgXCIpXCIpO1xuICAgICAgICB0aGlzLl9wcmludENvbG9uVHlwZShhc3QudHlwZSwgY3R4LCAndm9pZCcpO1xuICAgICAgICBpZiAoIWFzdC5uYW1lKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoYXN0LCBcIiA9PiBcIik7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnByaW50bG4oYXN0LCAneycpO1xuICAgICAgICBjdHguaW5jSW5kZW50KCk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKGFzdC5zdGF0ZW1lbnRzLCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludChhc3QsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXREZWNsYXJlRnVuY3Rpb25TdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICBpZiAoc3RtdC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuRXhwb3J0ZWQpKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQoc3RtdCwgXCJleHBvcnQgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChzdG10LCBcImZ1bmN0aW9uIFwiICsgc3RtdC5uYW1lICsgXCIoXCIpO1xuICAgICAgICB0aGlzLl92aXNpdFBhcmFtcyhzdG10LnBhcmFtcywgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KHN0bXQsIFwiKVwiKTtcbiAgICAgICAgdGhpcy5fcHJpbnRDb2xvblR5cGUoc3RtdC50eXBlLCBjdHgsICd2b2lkJyk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwiIHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5zdGF0ZW1lbnRzLCBjdHgpO1xuICAgICAgICBjdHguZGVjSW5kZW50KCk7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRUcnlDYXRjaFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIGN0eC5wcmludGxuKHN0bXQsIFwidHJ5IHtcIik7XG4gICAgICAgIGN0eC5pbmNJbmRlbnQoKTtcbiAgICAgICAgdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5ib2R5U3RtdHMsIGN0eCk7XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9IGNhdGNoIChcIiArIENBVENIX0VSUk9SX1ZBUiQxLm5hbWUgKyBcIikge1wiKTtcbiAgICAgICAgY3R4LmluY0luZGVudCgpO1xuICAgICAgICB2YXIgY2F0Y2hTdG10cyA9IFtDQVRDSF9TVEFDS19WQVIkMS5zZXQoQ0FUQ0hfRVJST1JfVkFSJDEucHJvcCgnc3RhY2snLCBudWxsKSkudG9EZWNsU3RtdChudWxsLCBbXG4gICAgICAgICAgICAgICAgU3RtdE1vZGlmaWVyLkZpbmFsXG4gICAgICAgICAgICBdKV0uY29uY2F0KHN0bXQuY2F0Y2hTdG10cyk7XG4gICAgICAgIHRoaXMudmlzaXRBbGxTdGF0ZW1lbnRzKGNhdGNoU3RtdHMsIGN0eCk7XG4gICAgICAgIGN0eC5kZWNJbmRlbnQoKTtcbiAgICAgICAgY3R4LnByaW50bG4oc3RtdCwgXCJ9XCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEJ1aWx0aW5UeXBlID0gZnVuY3Rpb24gKHR5cGUsIGN0eCkge1xuICAgICAgICB2YXIgdHlwZVN0cjtcbiAgICAgICAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpblR5cGVOYW1lLkJvb2w6XG4gICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdib29sZWFuJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpblR5cGVOYW1lLkR5bmFtaWM6XG4gICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdhbnknO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCdWlsdGluVHlwZU5hbWUuRnVuY3Rpb246XG4gICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdGdW5jdGlvbic7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJ1aWx0aW5UeXBlTmFtZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgdHlwZVN0ciA9ICdudW1iZXInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBCdWlsdGluVHlwZU5hbWUuSW50OlxuICAgICAgICAgICAgICAgIHR5cGVTdHIgPSAnbnVtYmVyJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpblR5cGVOYW1lLlN0cmluZzpcbiAgICAgICAgICAgICAgICB0eXBlU3RyID0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEJ1aWx0aW5UeXBlTmFtZS5Ob25lOlxuICAgICAgICAgICAgICAgIHR5cGVTdHIgPSAnbmV2ZXInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBidWlsdGluIHR5cGUgXCIgKyB0eXBlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChudWxsLCB0eXBlU3RyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uVHlwZSA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBhc3QudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIGlmIChhc3QudHlwZVBhcmFtcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY3R4LnByaW50KG51bGwsICc8Jyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0QWxsT2JqZWN0cyhmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gX3RoaXMudmlzaXRUeXBlKHR5cGUsIGN0eCk7IH0sIGFzdC50eXBlUGFyYW1zLCBjdHgsICcsJyk7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgJz4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS52aXNpdEFycmF5VHlwZSA9IGZ1bmN0aW9uICh0eXBlLCBjdHgpIHtcbiAgICAgICAgdGhpcy52aXNpdFR5cGUodHlwZS5vZiwgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KG51bGwsIFwiW11cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLnZpc2l0TWFwVHlwZSA9IGZ1bmN0aW9uICh0eXBlLCBjdHgpIHtcbiAgICAgICAgY3R4LnByaW50KG51bGwsIFwie1trZXk6IHN0cmluZ106XCIpO1xuICAgICAgICB0aGlzLnZpc2l0VHlwZSh0eXBlLnZhbHVlVHlwZSwgY3R4KTtcbiAgICAgICAgY3R4LnByaW50KG51bGwsIFwifVwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuZ2V0QnVpbHRpbk1ldGhvZE5hbWUgPSBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICAgIHZhciBuYW1lO1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLkNvbmNhdEFycmF5OlxuICAgICAgICAgICAgICAgIG5hbWUgPSAnY29uY2F0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5TdWJzY3JpYmVPYnNlcnZhYmxlOlxuICAgICAgICAgICAgICAgIG5hbWUgPSAnc3Vic2NyaWJlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5CaW5kOlxuICAgICAgICAgICAgICAgIG5hbWUgPSAnYmluZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiBtZXRob2Q6IFwiICsgbWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9O1xuICAgIF9Uc0VtaXR0ZXJWaXNpdG9yLnByb3RvdHlwZS5fdmlzaXRQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy52aXNpdEFsbE9iamVjdHMoZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgcGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBfdGhpcy5fcHJpbnRDb2xvblR5cGUocGFyYW0udHlwZSwgY3R4KTtcbiAgICAgICAgfSwgcGFyYW1zLCBjdHgsICcsJyk7XG4gICAgfTtcbiAgICBfVHNFbWl0dGVyVmlzaXRvci5wcm90b3R5cGUuX3Zpc2l0SWRlbnRpZmllciA9IGZ1bmN0aW9uICh2YWx1ZSwgdHlwZVBhcmFtcywgY3R4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSwgbW9kdWxlTmFtZSA9IHZhbHVlLm1vZHVsZU5hbWU7XG4gICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZUZpbHRlciAmJiB0aGlzLnJlZmVyZW5jZUZpbHRlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGN0eC5wcmludChudWxsLCAnKG51bGwgYXMgYW55KScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2R1bGVOYW1lICYmICghdGhpcy5pbXBvcnRGaWx0ZXIgfHwgIXRoaXMuaW1wb3J0RmlsdGVyKHZhbHVlKSkpIHtcbiAgICAgICAgICAgIHZhciBwcmVmaXggPSB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMuZ2V0KG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gXCJpXCIgKyB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMuc2l6ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydHNXaXRoUHJlZml4ZXMuc2V0KG1vZHVsZU5hbWUsIHByZWZpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgcHJlZml4ICsgXCIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5wcmludChudWxsLCBuYW1lKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZUV4cHJlc3Npb24gPiAwKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYSB0eXBlIGV4cHJlc3Npb24gdGhhdCByZWZlcnMgdG8gYSBnZW5lcmljIHR5cGUgdGhlbiBzdXBwbHlcbiAgICAgICAgICAgIC8vIHRoZSByZXF1aXJlZCB0eXBlIHBhcmFtZXRlcnMuIElmIHRoZXJlIHdlcmUgbm90IGVub3VnaCB0eXBlIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIC8vIHN1cHBsaWVkLCBzdXBwbHkgYW55IGFzIHRoZSB0eXBlLiBPdXRzaWRlIGEgdHlwZSBleHByZXNzaW9uIHRoZSByZWZlcmVuY2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBub3Qgc3VwcGx5IHR5cGUgcGFyYW1ldGVycyBhbmQgYmUgdHJlYXRlZCBhcyBhIHNpbXBsZSB2YWx1ZSByZWZlcmVuY2VcbiAgICAgICAgICAgIC8vIHRvIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBpdHNlbGYuXG4gICAgICAgICAgICB2YXIgc3VwcGxpZWRQYXJhbWV0ZXJzID0gdHlwZVBhcmFtcyB8fCBbXTtcbiAgICAgICAgICAgIGlmIChzdXBwbGllZFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5wcmludChudWxsLCBcIjxcIik7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdEFsbE9iamVjdHMoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHR5cGUudmlzaXRUeXBlKF90aGlzLCBjdHgpOyB9LCB0eXBlUGFyYW1zLCBjdHgsICcsJyk7XG4gICAgICAgICAgICAgICAgY3R4LnByaW50KG51bGwsIFwiPlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX1RzRW1pdHRlclZpc2l0b3IucHJvdG90eXBlLl9wcmludENvbG9uVHlwZSA9IGZ1bmN0aW9uICh0eXBlLCBjdHgsIGRlZmF1bHRUeXBlKSB7XG4gICAgICAgIGlmICh0eXBlICE9PSBJTkZFUlJFRF9UWVBFKSB7XG4gICAgICAgICAgICBjdHgucHJpbnQobnVsbCwgJzonKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXRUeXBlKHR5cGUsIGN0eCwgZGVmYXVsdFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gX1RzRW1pdHRlclZpc2l0b3I7XG59KEFic3RyYWN0RW1pdHRlclZpc2l0b3IpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBSZXNvbHZlIGEgYFR5cGVgIGZvciB7QGxpbmsgUGlwZX0uXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciB0byBjcmVhdGUgY3VzdG9tIGJlaGF2aW9yLlxuICpcbiAqIFNlZSB7QGxpbmsgQ29tcGlsZXJ9XG4gKi9cbnZhciBQaXBlUmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGlwZVJlc29sdmVyKF9yZWZsZWN0b3IpIHtcbiAgICAgICAgdGhpcy5fcmVmbGVjdG9yID0gX3JlZmxlY3RvcjtcbiAgICB9XG4gICAgUGlwZVJlc29sdmVyLnByb3RvdHlwZS5pc1BpcGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgdHlwZU1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgcmV0dXJuIHR5cGVNZXRhZGF0YSAmJiB0eXBlTWV0YWRhdGEuc29tZShjcmVhdGVQaXBlLmlzVHlwZU9mKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybiB7QGxpbmsgUGlwZX0gZm9yIGEgZ2l2ZW4gYFR5cGVgLlxuICAgICAqL1xuICAgIFBpcGVSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh0eXBlLCB0aHJvd0lmTm90Rm91bmQpIHtcbiAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCA9PT0gdm9pZCAwKSB7IHRocm93SWZOb3RGb3VuZCA9IHRydWU7IH1cbiAgICAgICAgdmFyIG1ldGFzID0gdGhpcy5fcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICAgICAgaWYgKG1ldGFzKSB7XG4gICAgICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IGZpbmRMYXN0KG1ldGFzLCBjcmVhdGVQaXBlLmlzVHlwZU9mKTtcbiAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRocm93SWZOb3RGb3VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gUGlwZSBkZWNvcmF0b3IgZm91bmQgb24gXCIgKyBzdHJpbmdpZnkodHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFBpcGVSZXNvbHZlcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogR2VuZXJhdGVzIGNvZGUgdGhhdCBpcyB1c2VkIHRvIHR5cGUgY2hlY2sgdGVtcGxhdGVzLlxuICovXG52YXIgVHlwZUNoZWNrQ29tcGlsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHlwZUNoZWNrQ29tcGlsZXIob3B0aW9ucywgcmVmbGVjdG9yKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbXBvcnRhbnQgbm90ZXM6XG4gICAgICogLSBUaGlzIG11c3Qgbm90IHByb2R1Y2UgbmV3IGBpbXBvcnRgIHN0YXRlbWVudHMsIGJ1dCBvbmx5IHJlZmVyIHRvIHR5cGVzIG91dHNpZGVcbiAgICAgKiAgIG9mIHRoZSBmaWxlIHZpYSB0aGUgdmFyaWFibGVzIHByb3ZpZGVkIHZpYSBleHRlcm5hbFJlZmVyZW5jZVZhcnMuXG4gICAgICogICBUaGlzIGFsbG93cyBUeXBlc2NyaXB0IHRvIHJldXNlIHRoZSBvbGQgcHJvZ3JhbSdzIHN0cnVjdHVyZSBhcyBubyBpbXBvcnRzIGhhdmUgY2hhbmdlZC5cbiAgICAgKiAtIFRoaXMgbXVzdCBub3QgcHJvZHVjZSBhbnkgZXhwb3J0cywgYXMgdGhpcyB3b3VsZCBwb2xsdXRlIHRoZSAuZC50cyBmaWxlXG4gICAgICogICBhbmQgYWxzbyB2aW9sYXRlIHRoZSBwb2ludCBhYm92ZS5cbiAgICAgKi9cbiAgICBUeXBlQ2hlY2tDb21waWxlci5wcm90b3R5cGUuY29tcGlsZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChjb21wb25lbnRJZCwgY29tcG9uZW50LCB0ZW1wbGF0ZSwgdXNlZFBpcGVzLCBleHRlcm5hbFJlZmVyZW5jZVZhcnMsIGN0eCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcGlwZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHVzZWRQaXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IHJldHVybiBwaXBlcy5zZXQocC5uYW1lLCBwLnR5cGUucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgIHZhciBlbWJlZGRlZFZpZXdDb3VudCA9IDA7XG4gICAgICAgIHZhciB2aWV3QnVpbGRlckZhY3RvcnkgPSBmdW5jdGlvbiAocGFyZW50LCBndWFyZHMpIHtcbiAgICAgICAgICAgIHZhciBlbWJlZGRlZFZpZXdJbmRleCA9IGVtYmVkZGVkVmlld0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdCdWlsZGVyKF90aGlzLm9wdGlvbnMsIF90aGlzLnJlZmxlY3RvciwgZXh0ZXJuYWxSZWZlcmVuY2VWYXJzLCBwYXJlbnQsIGNvbXBvbmVudC50eXBlLnJlZmVyZW5jZSwgY29tcG9uZW50LmlzSG9zdCwgZW1iZWRkZWRWaWV3SW5kZXgsIHBpcGVzLCBndWFyZHMsIGN0eCwgdmlld0J1aWxkZXJGYWN0b3J5KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHZpc2l0b3IgPSB2aWV3QnVpbGRlckZhY3RvcnkobnVsbCwgW10pO1xuICAgICAgICB2aXNpdG9yLnZpc2l0QWxsKFtdLCB0ZW1wbGF0ZSk7XG4gICAgICAgIHJldHVybiB2aXNpdG9yLmJ1aWxkKGNvbXBvbmVudElkKTtcbiAgICB9O1xuICAgIHJldHVybiBUeXBlQ2hlY2tDb21waWxlcjtcbn0oKSk7XG52YXIgRFlOQU1JQ19WQVJfTkFNRSA9ICdfYW55JztcbnZhciBUeXBlQ2hlY2tMb2NhbFJlc29sdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFR5cGVDaGVja0xvY2FsUmVzb2x2ZXIoKSB7XG4gICAgfVxuICAgIFR5cGVDaGVja0xvY2FsUmVzb2x2ZXIucHJvdG90eXBlLm5vdGlmeUltcGxpY2l0UmVjZWl2ZXJVc2UgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgVHlwZUNoZWNrTG9jYWxSZXNvbHZlci5wcm90b3R5cGUuZ2V0TG9jYWwgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gRXZlbnRIYW5kbGVyVmFycy5ldmVudC5uYW1lKSB7XG4gICAgICAgICAgICAvLyBSZWZlcmVuY2VzIHRvIHRoZSBldmVudCBzaG91bGQgbm90IGJlIHR5cGUtY2hlY2tlZC5cbiAgICAgICAgICAgIC8vIFRPRE8oY2h1Y2tqKTogZGV0ZXJtaW5lIGEgYmV0dGVyIHR5cGUgZm9yIHRoZSBldmVudC5cbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZShEWU5BTUlDX1ZBUl9OQU1FKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBUeXBlQ2hlY2tMb2NhbFJlc29sdmVyO1xufSgpKTtcbnZhciBkZWZhdWx0UmVzb2x2ZXIgPSBuZXcgVHlwZUNoZWNrTG9jYWxSZXNvbHZlcigpO1xudmFyIFZpZXdCdWlsZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdCdWlsZGVyKG9wdGlvbnMsIHJlZmxlY3RvciwgZXh0ZXJuYWxSZWZlcmVuY2VWYXJzLCBwYXJlbnQsIGNvbXBvbmVudCwgaXNIb3N0Q29tcG9uZW50LCBlbWJlZGRlZFZpZXdJbmRleCwgcGlwZXMsIGd1YXJkcywgY3R4LCB2aWV3QnVpbGRlckZhY3RvcnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5yZWZsZWN0b3IgPSByZWZsZWN0b3I7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxSZWZlcmVuY2VWYXJzID0gZXh0ZXJuYWxSZWZlcmVuY2VWYXJzO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgIHRoaXMuaXNIb3N0Q29tcG9uZW50ID0gaXNIb3N0Q29tcG9uZW50O1xuICAgICAgICB0aGlzLmVtYmVkZGVkVmlld0luZGV4ID0gZW1iZWRkZWRWaWV3SW5kZXg7XG4gICAgICAgIHRoaXMucGlwZXMgPSBwaXBlcztcbiAgICAgICAgdGhpcy5ndWFyZHMgPSBndWFyZHM7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgICAgICB0aGlzLnZpZXdCdWlsZGVyRmFjdG9yeSA9IHZpZXdCdWlsZGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5yZWZPdXRwdXRWYXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIHRoaXMudXBkYXRlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTtcbiAgICB9XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLmdldE91dHB1dFZhciA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciB2YXJOYW1lO1xuICAgICAgICBpZiAodHlwZSA9PT0gdGhpcy5jb21wb25lbnQgJiYgdGhpcy5pc0hvc3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhck5hbWUgPSBEWU5BTUlDX1ZBUl9OQU1FO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIHZhck5hbWUgPSB0aGlzLmV4dGVybmFsUmVmZXJlbmNlVmFycy5nZXQodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXJOYW1lID0gRFlOQU1JQ19WQVJfTkFNRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhck5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IHJlZmVycmluZyB0byBhIHR5cGUgd2l0aG91dCBhIHZhcmlhYmxlIFwiICsgSlNPTi5zdHJpbmdpZnkodHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJOYW1lO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLmdldFR5cGVHdWFyZEV4cHJlc3Npb25zID0gZnVuY3Rpb24gKGFzdCkge1xuICAgICAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcbiAgICAgICAgdmFyIHJlc3VsdCA9IF9fc3ByZWFkKHRoaXMuZ3VhcmRzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMoYXN0LmRpcmVjdGl2ZXMpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9lID0gX192YWx1ZXMoZGlyZWN0aXZlLmlucHV0cyksIF9mID0gX2UubmV4dCgpOyAhX2YuZG9uZTsgX2YgPSBfZS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IF9mLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd1YXJkID0gZGlyZWN0aXZlLmRpcmVjdGl2ZS5ndWFyZHNbaW5wdXQuZGlyZWN0aXZlTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3VhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlSWYgPSBndWFyZCA9PT0gJ1VzZUlmJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkOiBndWFyZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSWY6IHVzZUlmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiB7IGNvbnRleHQ6IHRoaXMuY29tcG9uZW50LCB2YWx1ZTogaW5wdXQudmFsdWUgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2YgJiYgIV9mLmRvbmUgJiYgKF9iID0gX2UucmV0dXJuKSkgX2IuY2FsbChfZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRBbGwgPSBmdW5jdGlvbiAodmFyaWFibGVzLCBhc3ROb2Rlcykge1xuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3ROb2Rlcyk7XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoY29tcG9uZW50SWQsIHRhcmdldFN0YXRlbWVudHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIGlmICh0YXJnZXRTdGF0ZW1lbnRzID09PSB2b2lkIDApIHsgdGFyZ2V0U3RhdGVtZW50cyA9IFtdOyB9XG4gICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIGNoaWxkLmJ1aWxkKGNvbXBvbmVudElkLCB0YXJnZXRTdGF0ZW1lbnRzKTsgfSk7XG4gICAgICAgIHZhciB2aWV3U3RtdHMgPSBbdmFyaWFibGUoRFlOQU1JQ19WQVJfTkFNRSkuc2V0KE5VTExfRVhQUikudG9EZWNsU3RtdChEWU5BTUlDX1RZUEUpXTtcbiAgICAgICAgdmFyIGJpbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIHRoaXMudXBkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChleHByZXNzaW9uKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5wcmVwcm9jZXNzVXBkYXRlRXhwcmVzc2lvbihleHByZXNzaW9uKSwgc291cmNlU3BhbiA9IF9hLnNvdXJjZVNwYW4sIGNvbnRleHQgPSBfYS5jb250ZXh0LCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IFwiXCIgKyBiaW5kaW5nQ291bnQrKztcbiAgICAgICAgICAgIHZhciBuYW1lUmVzb2x2ZXIgPSBjb250ZXh0ID09PSBfdGhpcy5jb21wb25lbnQgPyBfdGhpcyA6IGRlZmF1bHRSZXNvbHZlcjtcbiAgICAgICAgICAgIHZhciBfYiA9IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcobmFtZVJlc29sdmVyLCB2YXJpYWJsZShfdGhpcy5nZXRPdXRwdXRWYXIoY29udGV4dCkpLCB2YWx1ZSwgYmluZGluZ0lkLCBCaW5kaW5nRm9ybS5HZW5lcmFsKSwgc3RtdHMgPSBfYi5zdG10cywgY3VyclZhbEV4cHIgPSBfYi5jdXJyVmFsRXhwcjtcbiAgICAgICAgICAgIHN0bXRzLnB1c2gobmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoY3VyclZhbEV4cHIpKTtcbiAgICAgICAgICAgIHZpZXdTdG10cy5wdXNoLmFwcGx5KHZpZXdTdG10cywgX19zcHJlYWQoc3RtdHMubWFwKGZ1bmN0aW9uIChzdG10KSB7IHJldHVybiBhcHBseVNvdXJjZVNwYW5Ub1N0YXRlbWVudElmTmVlZGVkKHN0bXQsIHNvdXJjZVNwYW4pOyB9KSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgc291cmNlU3BhbiA9IF9hLnNvdXJjZVNwYW4sIGNvbnRleHQgPSBfYS5jb250ZXh0LCB2YWx1ZSA9IF9hLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IFwiXCIgKyBiaW5kaW5nQ291bnQrKztcbiAgICAgICAgICAgIHZhciBuYW1lUmVzb2x2ZXIgPSBjb250ZXh0ID09PSBfdGhpcy5jb21wb25lbnQgPyBfdGhpcyA6IGRlZmF1bHRSZXNvbHZlcjtcbiAgICAgICAgICAgIHZhciBzdG10cyA9IGNvbnZlcnRBY3Rpb25CaW5kaW5nKG5hbWVSZXNvbHZlciwgdmFyaWFibGUoX3RoaXMuZ2V0T3V0cHV0VmFyKGNvbnRleHQpKSwgdmFsdWUsIGJpbmRpbmdJZCkuc3RtdHM7XG4gICAgICAgICAgICB2aWV3U3RtdHMucHVzaC5hcHBseSh2aWV3U3RtdHMsIF9fc3ByZWFkKHN0bXRzLm1hcChmdW5jdGlvbiAoc3RtdCkgeyByZXR1cm4gYXBwbHlTb3VyY2VTcGFuVG9TdGF0ZW1lbnRJZk5lZWRlZChzdG10LCBzb3VyY2VTcGFuKTsgfSkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmd1YXJkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBndWFyZEV4cHJlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5ndWFyZHMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBndWFyZCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2QgPSB0aGlzLnByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uKGd1YXJkLmV4cHJlc3Npb24pLCBjb250ZXh0ID0gX2QuY29udGV4dCwgdmFsdWUgPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IFwiXCIgKyBiaW5kaW5nQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVSZXNvbHZlciA9IGNvbnRleHQgPT09IHRoaXMuY29tcG9uZW50ID8gdGhpcyA6IGRlZmF1bHRSZXNvbHZlcjtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHN1cHBvcnQgc2ltcGxlIGV4cHJlc3Npb25zIGFuZCBpZ25vcmUgb3RoZXJzIGFzIHRoZXlcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHVubGlrZWx5IHRvIGFmZmVjdCB0eXBlIG5hcnJvd2luZy5cbiAgICAgICAgICAgICAgICAgICAgdmFyIF9lID0gY29udmVydFByb3BlcnR5QmluZGluZyhuYW1lUmVzb2x2ZXIsIHZhcmlhYmxlKHRoaXMuZ2V0T3V0cHV0VmFyKGNvbnRleHQpKSwgdmFsdWUsIGJpbmRpbmdJZCwgQmluZGluZ0Zvcm0uVHJ5U2ltcGxlKSwgc3RtdHMgPSBfZS5zdG10cywgY3VyclZhbEV4cHIgPSBfZS5jdXJyVmFsRXhwcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3VhcmRDbGF1c2UgPSBndWFyZC51c2VJZiA/IGN1cnJWYWxFeHByIDogdGhpcy5jdHguaW1wb3J0RXhwcihndWFyZC5ndWFyZCkuY2FsbEZuKFtjdXJyVmFsRXhwcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmRFeHByZXNzaW9uID0gZ3VhcmRFeHByZXNzaW9uID8gZ3VhcmRFeHByZXNzaW9uLmFuZChndWFyZENsYXVzZSkgOiBndWFyZENsYXVzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChndWFyZEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB2aWV3U3RtdHMgPSBbbmV3IElmU3RtdChndWFyZEV4cHJlc3Npb24sIHZpZXdTdG10cyldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciB2aWV3TmFtZSA9IFwiX1ZpZXdfXCIgKyBjb21wb25lbnRJZCArIFwiX1wiICsgdGhpcy5lbWJlZGRlZFZpZXdJbmRleDtcbiAgICAgICAgdmFyIHZpZXdGYWN0b3J5ID0gbmV3IERlY2xhcmVGdW5jdGlvblN0bXQodmlld05hbWUsIFtdLCB2aWV3U3RtdHMpO1xuICAgICAgICB0YXJnZXRTdGF0ZW1lbnRzLnB1c2godmlld0ZhY3RvcnkpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0U3RhdGVtZW50cztcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS52aXNpdEJvdW5kVGV4dCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFzdFdpdGhTb3VyY2UgPSBhc3QudmFsdWU7XG4gICAgICAgIHZhciBpbnRlciA9IGFzdFdpdGhTb3VyY2UuYXN0O1xuICAgICAgICBpbnRlci5leHByZXNzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudXBkYXRlcy5wdXNoKHsgY29udGV4dDogX3RoaXMuY29tcG9uZW50LCB2YWx1ZTogZXhwciwgc291cmNlU3BhbjogYXN0LnNvdXJjZVNwYW4gfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRPclRlbXBsYXRlKGFzdCk7XG4gICAgICAgIC8vIE5vdGU6IFRoZSBvbGQgdmlldyBjb21waWxlciB1c2VkIHRvIHVzZSBhbiBgYW55YCB0eXBlXG4gICAgICAgIC8vIGZvciB0aGUgY29udGV4dCBpbiBhbnkgZW1iZWRkZWQgdmlldy5cbiAgICAgICAgLy8gV2Uga2VlcCB0aGlzIGJlaGFpdm9yIGJlaGluZCBhIGZsYWcgZm9yIG5vdy5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mdWxsVGVtcGxhdGVUeXBlQ2hlY2spIHtcbiAgICAgICAgICAgIC8vIEZpbmQgYW55IGFwcGxpY2FibGUgdHlwZSBndWFyZHMuIEZvciBleGFtcGxlLCBOZ0lmIGhhcyBhIHR5cGUgZ3VhcmQgb24gbmdJZlxuICAgICAgICAgICAgLy8gKHNlZSBOZ0lmLm5nSWZUeXBlR3VhcmQpIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHRlbXBsYXRlIGlzIG9ubHlcbiAgICAgICAgICAgIC8vIHN0YW1wZWQgb3V0IGlmIG5nSWYgaXMgdHJ1dGh5IHNvIGFueSBiaW5kaW5ncyBpbiB0aGUgdGVtcGxhdGUgY2FuIGFzc3VtZSB0aGF0LFxuICAgICAgICAgICAgLy8gaWYgYSBudWxsYWJsZSB0eXBlIGlzIHVzZWQgZm9yIG5nSWYsIHRoYXQgZXhwcmVzc2lvbiBpcyBub3QgbnVsbCBvciB1bmRlZmluZWQuXG4gICAgICAgICAgICB2YXIgZ3VhcmRzID0gdGhpcy5nZXRUeXBlR3VhcmRFeHByZXNzaW9ucyhhc3QpO1xuICAgICAgICAgICAgdmFyIGNoaWxkVmlzaXRvciA9IHRoaXMudmlld0J1aWxkZXJGYWN0b3J5KHRoaXMsIGd1YXJkcyk7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGRWaXNpdG9yKTtcbiAgICAgICAgICAgIGNoaWxkVmlzaXRvci52aXNpdEFsbChhc3QudmFyaWFibGVzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnZpc2l0RWxlbWVudE9yVGVtcGxhdGUoYXN0KTtcbiAgICAgICAgYXN0LmlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dEFzdCkge1xuICAgICAgICAgICAgX3RoaXMudXBkYXRlcy5wdXNoKHsgY29udGV4dDogX3RoaXMuY29tcG9uZW50LCB2YWx1ZTogaW5wdXRBc3QudmFsdWUsIHNvdXJjZVNwYW46IGlucHV0QXN0LnNvdXJjZVNwYW4gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW1wbGF0ZVZpc2l0QWxsKHRoaXMsIGFzdC5jaGlsZHJlbik7XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRFbGVtZW50T3JUZW1wbGF0ZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgYXN0LmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyQXN0KSB7IF90aGlzLnZpc2l0RGlyZWN0aXZlKGRpckFzdCk7IH0pO1xuICAgICAgICBhc3QucmVmZXJlbmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXRWYXJUeXBlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBvbGQgdmlldyBjb21waWxlciB1c2VkIHRvIHVzZSBhbiBgYW55YCB0eXBlXG4gICAgICAgICAgICAvLyBmb3IgZGlyZWN0aXZlcyBleHBvc2VkIHZpYSBgZXhwb3J0QXNgLlxuICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGlzIGJlaGFpdm9yIGJlaGluZCBhIGZsYWcgZm9yIG5vdy5cbiAgICAgICAgICAgIGlmIChyZWYudmFsdWUgJiYgcmVmLnZhbHVlLmlkZW50aWZpZXIgJiYgX3RoaXMub3B0aW9ucy5mdWxsVGVtcGxhdGVUeXBlQ2hlY2spIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJUeXBlID0gcmVmLnZhbHVlLmlkZW50aWZpZXIucmVmZXJlbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyVHlwZSA9IEJ1aWx0aW5UeXBlTmFtZS5EeW5hbWljO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMucmVmT3V0cHV0VmFycy5zZXQocmVmLm5hbWUsIG91dHB1dFZhclR5cGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXN0Lm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbiAob3V0cHV0QXN0KSB7XG4gICAgICAgICAgICBfdGhpcy5hY3Rpb25zLnB1c2goeyBjb250ZXh0OiBfdGhpcy5jb21wb25lbnQsIHZhbHVlOiBvdXRwdXRBc3QuaGFuZGxlciwgc291cmNlU3Bhbjogb3V0cHV0QXN0LnNvdXJjZVNwYW4gfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RGlyZWN0aXZlID0gZnVuY3Rpb24gKGRpckFzdCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZGlyVHlwZSA9IGRpckFzdC5kaXJlY3RpdmUudHlwZS5yZWZlcmVuY2U7XG4gICAgICAgIGRpckFzdC5pbnB1dHMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXQpIHsgcmV0dXJuIF90aGlzLnVwZGF0ZXMucHVzaCh7IGNvbnRleHQ6IF90aGlzLmNvbXBvbmVudCwgdmFsdWU6IGlucHV0LnZhbHVlLCBzb3VyY2VTcGFuOiBpbnB1dC5zb3VyY2VTcGFuIH0pOyB9KTtcbiAgICAgICAgLy8gTm90ZTogVGhlIG9sZCB2aWV3IGNvbXBpbGVyIHVzZWQgdG8gdXNlIGFuIGBhbnlgIHR5cGVcbiAgICAgICAgLy8gZm9yIGV4cHJlc3Npb25zIGluIGhvc3QgcHJvcGVydGllcyAvIGV2ZW50cy5cbiAgICAgICAgLy8gV2Uga2VlcCB0aGlzIGJlaGFpdm9yIGJlaGluZCBhIGZsYWcgZm9yIG5vdy5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mdWxsVGVtcGxhdGVUeXBlQ2hlY2spIHtcbiAgICAgICAgICAgIGRpckFzdC5ob3N0UHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dEFzdCkgeyByZXR1cm4gX3RoaXMudXBkYXRlcy5wdXNoKHsgY29udGV4dDogZGlyVHlwZSwgdmFsdWU6IGlucHV0QXN0LnZhbHVlLCBzb3VyY2VTcGFuOiBpbnB1dEFzdC5zb3VyY2VTcGFuIH0pOyB9KTtcbiAgICAgICAgICAgIGRpckFzdC5ob3N0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGhvc3RFdmVudEFzdCkgeyByZXR1cm4gX3RoaXMuYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBkaXJUeXBlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBob3N0RXZlbnRBc3QuaGFuZGxlcixcbiAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBob3N0RXZlbnRBc3Quc291cmNlU3BhblxuICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUubm90aWZ5SW1wbGljaXRSZWNlaXZlclVzZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuZ2V0TG9jYWwgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PSBFdmVudEhhbmRsZXJWYXJzLmV2ZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZSh0aGlzLmdldE91dHB1dFZhcihCdWlsdGluVHlwZU5hbWUuRHluYW1pYykpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGN1cnJCdWlsZGVyID0gdGhpczsgY3VyckJ1aWxkZXI7IGN1cnJCdWlsZGVyID0gY3VyckJ1aWxkZXIucGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0VmFyVHlwZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIC8vIGNoZWNrIHJlZmVyZW5jZXNcbiAgICAgICAgICAgIG91dHB1dFZhclR5cGUgPSBjdXJyQnVpbGRlci5yZWZPdXRwdXRWYXJzLmdldChuYW1lKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRWYXJUeXBlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayB2YXJpYWJsZXNcbiAgICAgICAgICAgICAgICB2YXIgdmFyQXN0ID0gY3VyckJ1aWxkZXIudmFyaWFibGVzLmZpbmQoZnVuY3Rpb24gKHZhckFzdCkgeyByZXR1cm4gdmFyQXN0Lm5hbWUgPT09IG5hbWU7IH0pO1xuICAgICAgICAgICAgICAgIGlmICh2YXJBc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0VmFyVHlwZSA9IEJ1aWx0aW5UeXBlTmFtZS5EeW5hbWljO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvdXRwdXRWYXJUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGUodGhpcy5nZXRPdXRwdXRWYXIob3V0cHV0VmFyVHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnBpcGVPdXRwdXRWYXIgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgcGlwZSA9IHRoaXMucGlwZXMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXBpcGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIklsbGVnYWwgU3RhdGU6IENvdWxkIG5vdCBmaW5kIHBpcGUgXCIgKyBuYW1lICsgXCIgaW4gdGVtcGxhdGUgb2YgXCIgKyB0aGlzLmNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3V0cHV0VmFyKHBpcGUpO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGV4cHJlc3Npb24uc291cmNlU3BhbixcbiAgICAgICAgICAgIGNvbnRleHQ6IGV4cHJlc3Npb24uY29udGV4dCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0UHJvcGVydHlCaW5kaW5nQnVpbHRpbnMoe1xuICAgICAgICAgICAgICAgIGNyZWF0ZUxpdGVyYWxBcnJheUNvbnZlcnRlcjogZnVuY3Rpb24gKGFyZ0NvdW50KSB7IHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJyID0gbGl0ZXJhbEFycihhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIG9sZCB2aWV3IGNvbXBpbGVyIHVzZWQgdG8gdXNlIGFuIGBhbnlgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFycmF5cy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9wdGlvbnMuZnVsbFRlbXBsYXRlVHlwZUNoZWNrID8gYXJyIDogYXJyLmNhc3QoRFlOQU1JQ19UWVBFKTtcbiAgICAgICAgICAgICAgICB9OyB9LFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxpdGVyYWxNYXBDb252ZXJ0ZXI6IGZ1bmN0aW9uIChrZXlzKSB7IHJldHVybiBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnRyaWVzID0ga2V5cy5tYXAoZnVuY3Rpb24gKGssIGkpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGsua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlZDogay5xdW90ZWQsXG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IGxpdGVyYWxNYXAoZW50cmllcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBvbGQgdmlldyBjb21waWxlciB1c2VkIHRvIHVzZSBhbiBgYW55YCB0eXBlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBtYXBzLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMub3B0aW9ucy5mdWxsVGVtcGxhdGVUeXBlQ2hlY2sgPyBtYXAgOiBtYXAuY2FzdChEWU5BTUlDX1RZUEUpO1xuICAgICAgICAgICAgICAgIH07IH0sXG4gICAgICAgICAgICAgICAgY3JlYXRlUGlwZUNvbnZlcnRlcjogZnVuY3Rpb24gKG5hbWUsIGFyZ0NvdW50KSB7IHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgb2xkIHZpZXcgY29tcGlsZXIgdXNlZCB0byB1c2UgYW4gYGFueWAgdHlwZVxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGlwZXMuXG4gICAgICAgICAgICAgICAgICAgIHZhciBwaXBlRXhwciA9IF90aGlzLm9wdGlvbnMuZnVsbFRlbXBsYXRlVHlwZUNoZWNrID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlKF90aGlzLnBpcGVPdXRwdXRWYXIobmFtZSkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlKF90aGlzLmdldE91dHB1dFZhcihCdWlsdGluVHlwZU5hbWUuRHluYW1pYykpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGlwZUV4cHIuY2FsbE1ldGhvZCgndHJhbnNmb3JtJywgYXJncyk7XG4gICAgICAgICAgICAgICAgfTsgfSxcbiAgICAgICAgICAgIH0sIGV4cHJlc3Npb24udmFsdWUpXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXROZ0NvbnRlbnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRSZWZlcmVuY2UgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RXZlbnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudFByb3BlcnR5ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS52aXNpdEF0dHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgcmV0dXJuIFZpZXdCdWlsZGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIENMQVNTX0FUVFIkMSA9ICdjbGFzcyc7XG52YXIgU1RZTEVfQVRUUiA9ICdzdHlsZSc7XG52YXIgSU1QTElDSVRfVEVNUExBVEVfVkFSID0gJ1xcJGltcGxpY2l0JztcbnZhciBWaWV3Q29tcGlsZVJlc3VsdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWaWV3Q29tcGlsZVJlc3VsdCh2aWV3Q2xhc3NWYXIsIHJlbmRlcmVyVHlwZVZhcikge1xuICAgICAgICB0aGlzLnZpZXdDbGFzc1ZhciA9IHZpZXdDbGFzc1ZhcjtcbiAgICAgICAgdGhpcy5yZW5kZXJlclR5cGVWYXIgPSByZW5kZXJlclR5cGVWYXI7XG4gICAgfVxuICAgIHJldHVybiBWaWV3Q29tcGlsZVJlc3VsdDtcbn0oKSk7XG52YXIgVmlld0NvbXBpbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdDb21waWxlcihfcmVmbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuX3JlZmxlY3RvciA9IF9yZWZsZWN0b3I7XG4gICAgfVxuICAgIFZpZXdDb21waWxlci5wcm90b3R5cGUuY29tcGlsZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChvdXRwdXRDdHgsIGNvbXBvbmVudCwgdGVtcGxhdGUsIHN0eWxlcywgdXNlZFBpcGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGVtYmVkZGVkVmlld0NvdW50ID0gMDtcbiAgICAgICAgdmFyIHN0YXRpY1F1ZXJ5SWRzID0gZmluZFN0YXRpY1F1ZXJ5SWRzKHRlbXBsYXRlKTtcbiAgICAgICAgdmFyIHJlbmRlckNvbXBvbmVudFZhck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSG9zdCkge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlXzEgPSBjb21wb25lbnQudGVtcGxhdGU7XG4gICAgICAgICAgICB2YXIgY3VzdG9tUmVuZGVyRGF0YSA9IFtdO1xuICAgICAgICAgICAgaWYgKHRlbXBsYXRlXzEuYW5pbWF0aW9ucyAmJiB0ZW1wbGF0ZV8xLmFuaW1hdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tUmVuZGVyRGF0YS5wdXNoKG5ldyBMaXRlcmFsTWFwRW50cnkoJ2FuaW1hdGlvbicsIGNvbnZlcnRWYWx1ZVRvT3V0cHV0QXN0KG91dHB1dEN0eCwgdGVtcGxhdGVfMS5hbmltYXRpb25zKSwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlbmRlckNvbXBvbmVudFZhciA9IHZhcmlhYmxlKHJlbmRlcmVyVHlwZU5hbWUoY29tcG9uZW50LnR5cGUucmVmZXJlbmNlKSk7XG4gICAgICAgICAgICByZW5kZXJDb21wb25lbnRWYXJOYW1lID0gcmVuZGVyQ29tcG9uZW50VmFyLm5hbWU7XG4gICAgICAgICAgICBvdXRwdXRDdHguc3RhdGVtZW50cy5wdXNoKHJlbmRlckNvbXBvbmVudFZhclxuICAgICAgICAgICAgICAgIC5zZXQoaW1wb3J0RXhwcihJZGVudGlmaWVycy5jcmVhdGVSZW5kZXJlclR5cGUyKS5jYWxsRm4oW25ldyBMaXRlcmFsTWFwRXhwcihbXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXRlcmFsTWFwRW50cnkoJ2VuY2Fwc3VsYXRpb24nLCBsaXRlcmFsKHRlbXBsYXRlXzEuZW5jYXBzdWxhdGlvbiksIGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IExpdGVyYWxNYXBFbnRyeSgnc3R5bGVzJywgc3R5bGVzLCBmYWxzZSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXRlcmFsTWFwRW50cnkoJ2RhdGEnLCBuZXcgTGl0ZXJhbE1hcEV4cHIoY3VzdG9tUmVuZGVyRGF0YSksIGZhbHNlKVxuICAgICAgICAgICAgICAgIF0pXSkpXG4gICAgICAgICAgICAgICAgLnRvRGVjbFN0bXQoaW1wb3J0VHlwZShJZGVudGlmaWVycy5SZW5kZXJlclR5cGUyKSwgW1N0bXRNb2RpZmllci5GaW5hbCwgU3RtdE1vZGlmaWVyLkV4cG9ydGVkXSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2aWV3QnVpbGRlckZhY3RvcnkgPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgZW1iZWRkZWRWaWV3SW5kZXggPSBlbWJlZGRlZFZpZXdDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3QnVpbGRlciQxKF90aGlzLl9yZWZsZWN0b3IsIG91dHB1dEN0eCwgcGFyZW50LCBjb21wb25lbnQsIGVtYmVkZGVkVmlld0luZGV4LCB1c2VkUGlwZXMsIHN0YXRpY1F1ZXJ5SWRzLCB2aWV3QnVpbGRlckZhY3RvcnkpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgdmlzaXRvciA9IHZpZXdCdWlsZGVyRmFjdG9yeShudWxsKTtcbiAgICAgICAgdmlzaXRvci52aXNpdEFsbChbXSwgdGVtcGxhdGUpO1xuICAgICAgICAoX2EgPSBvdXRwdXRDdHguc3RhdGVtZW50cykucHVzaC5hcHBseShfYSwgX19zcHJlYWQodmlzaXRvci5idWlsZCgpKSk7XG4gICAgICAgIHJldHVybiBuZXcgVmlld0NvbXBpbGVSZXN1bHQodmlzaXRvci52aWV3TmFtZSwgcmVuZGVyQ29tcG9uZW50VmFyTmFtZSk7XG4gICAgfTtcbiAgICByZXR1cm4gVmlld0NvbXBpbGVyO1xufSgpKTtcbnZhciBMT0dfVkFSJDEgPSB2YXJpYWJsZSgnX2wnKTtcbnZhciBWSUVXX1ZBUiA9IHZhcmlhYmxlKCdfdicpO1xudmFyIENIRUNLX1ZBUiA9IHZhcmlhYmxlKCdfY2snKTtcbnZhciBDT01QX1ZBUiA9IHZhcmlhYmxlKCdfY28nKTtcbnZhciBFVkVOVF9OQU1FX1ZBUiA9IHZhcmlhYmxlKCdlbicpO1xudmFyIEFMTE9XX0RFRkFVTFRfVkFSID0gdmFyaWFibGUoXCJhZFwiKTtcbnZhciBWaWV3QnVpbGRlciQxID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFZpZXdCdWlsZGVyKHJlZmxlY3Rvciwgb3V0cHV0Q3R4LCBwYXJlbnQsIGNvbXBvbmVudCwgZW1iZWRkZWRWaWV3SW5kZXgsIHVzZWRQaXBlcywgc3RhdGljUXVlcnlJZHMsIHZpZXdCdWlsZGVyRmFjdG9yeSkge1xuICAgICAgICB0aGlzLnJlZmxlY3RvciA9IHJlZmxlY3RvcjtcbiAgICAgICAgdGhpcy5vdXRwdXRDdHggPSBvdXRwdXRDdHg7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgdGhpcy5lbWJlZGRlZFZpZXdJbmRleCA9IGVtYmVkZGVkVmlld0luZGV4O1xuICAgICAgICB0aGlzLnVzZWRQaXBlcyA9IHVzZWRQaXBlcztcbiAgICAgICAgdGhpcy5zdGF0aWNRdWVyeUlkcyA9IHN0YXRpY1F1ZXJ5SWRzO1xuICAgICAgICB0aGlzLnZpZXdCdWlsZGVyRmFjdG9yeSA9IHZpZXdCdWlsZGVyRmFjdG9yeTtcbiAgICAgICAgdGhpcy5ub2RlcyA9IFtdO1xuICAgICAgICB0aGlzLnB1cmVQaXBlTm9kZUluZGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBOZWVkIE9iamVjdC5jcmVhdGUgc28gdGhhdCB3ZSBkb24ndCBoYXZlIGJ1aWx0aW4gdmFsdWVzLi4uXG4gICAgICAgIHRoaXMucmVmTm9kZUluZGljZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgICAgIC8vIFRPRE8odGJvc2NoKTogVGhlIG9sZCB2aWV3IGNvbXBpbGVyIHVzZWQgdG8gdXNlIGFuIGBhbnlgIHR5cGVcbiAgICAgICAgLy8gZm9yIHRoZSBjb250ZXh0IGluIGFueSBlbWJlZGRlZCB2aWV3LiBXZSBrZWVwIHRoaXMgYmVoYWl2b3IgZm9yIG5vd1xuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIGludHJvZHVjZSB0aGUgbmV3IHZpZXcgY29tcGlsZXIgd2l0aG91dCB0b28gbWFueSBlcnJvcnMuXG4gICAgICAgIHRoaXMuY29tcFR5cGUgPSB0aGlzLmVtYmVkZGVkVmlld0luZGV4ID4gMCA/XG4gICAgICAgICAgICBEWU5BTUlDX1RZUEUgOlxuICAgICAgICAgICAgZXhwcmVzc2lvblR5cGUob3V0cHV0Q3R4LmltcG9ydEV4cHIodGhpcy5jb21wb25lbnQudHlwZS5yZWZlcmVuY2UpKTtcbiAgICAgICAgdGhpcy52aWV3TmFtZSA9IHZpZXdDbGFzc05hbWUodGhpcy5jb21wb25lbnQudHlwZS5yZWZlcmVuY2UsIHRoaXMuZW1iZWRkZWRWaWV3SW5kZXgpO1xuICAgIH1cbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRBbGwgPSBmdW5jdGlvbiAodmFyaWFibGVzLCBhc3ROb2Rlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBwaXBlcyBmb3IgdGhlIHB1cmUgcGlwZXMgaW1tZWRpYXRlbHksIHNvIHRoYXQgd2Uga25vdyB0aGVpciBpbmRpY2VzLlxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVzZWRQaXBlcy5mb3JFYWNoKGZ1bmN0aW9uIChwaXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBpcGUucHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5wdXJlUGlwZU5vZGVJbmRpY2VzW3BpcGUubmFtZV0gPSBfdGhpcy5fY3JlYXRlUGlwZShudWxsLCBwaXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlJZHNfMSA9IHN0YXRpY1ZpZXdRdWVyeUlkcyh0aGlzLnN0YXRpY1F1ZXJ5SWRzKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LnZpZXdRdWVyaWVzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5LCBxdWVyeUluZGV4KSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogcXVlcmllcyBzdGFydCB3aXRoIGlkIDEgc28gd2UgY2FuIHVzZSB0aGUgbnVtYmVyIGluIGEgQmxvb20gZmlsdGVyIVxuICAgICAgICAgICAgICAgIHZhciBxdWVyeUlkID0gcXVlcnlJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdUeXBlID0gcXVlcnkuZmlyc3QgPyAwIC8qIEZpcnN0ICovIDogMSAvKiBBbGwgKi87XG4gICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gMTM0MjE3NzI4IC8qIFR5cGVWaWV3UXVlcnkgKi8gfCBjYWxjU3RhdGljRHluYW1pY1F1ZXJ5RmxhZ3MocXVlcnlJZHNfMSwgcXVlcnlJZCwgcXVlcnkpO1xuICAgICAgICAgICAgICAgIF90aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlU3BhbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUZsYWdzOiBmbGFncyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5xdWVyeURlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwoZmxhZ3MpLCBsaXRlcmFsKHF1ZXJ5SWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpdGVyYWxNYXBFeHByKFtuZXcgTGl0ZXJhbE1hcEVudHJ5KHF1ZXJ5LnByb3BlcnR5TmFtZSwgbGl0ZXJhbChiaW5kaW5nVHlwZSksIGZhbHNlKV0pXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3ROb2Rlcyk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAmJiAoYXN0Tm9kZXMubGVuZ3RoID09PSAwIHx8IG5lZWRzQWRkaXRpb25hbFJvb3ROb2RlKGFzdE5vZGVzKSkpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSB2aWV3IGlzIGFuIGVtYmVkZGVkIHZpZXcsIHRoZW4gd2UgbmVlZCB0byBhZGQgYW4gYWRkaXRpb25hbCByb290IG5vZGUgaW4gc29tZSBjYXNlc1xuICAgICAgICAgICAgdGhpcy5ub2Rlcy5wdXNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgc291cmNlU3BhbjogbnVsbCxcbiAgICAgICAgICAgICAgICBub2RlRmxhZ3M6IDEgLyogVHlwZUVsZW1lbnQgKi8sXG4gICAgICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5hbmNob3JEZWYpLmNhbGxGbihbXG4gICAgICAgICAgICAgICAgICAgIGxpdGVyYWwoMCAvKiBOb25lICovKSwgTlVMTF9FWFBSLCBOVUxMX0VYUFIsIGxpdGVyYWwoMClcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAodGFyZ2V0U3RhdGVtZW50cykge1xuICAgICAgICBpZiAodGFyZ2V0U3RhdGVtZW50cyA9PT0gdm9pZCAwKSB7IHRhcmdldFN0YXRlbWVudHMgPSBbXTsgfVxuICAgICAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7IHJldHVybiBjaGlsZC5idWlsZCh0YXJnZXRTdGF0ZW1lbnRzKTsgfSk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuX2NyZWF0ZU5vZGVFeHByZXNzaW9ucygpLCB1cGRhdGVSZW5kZXJlclN0bXRzID0gX2EudXBkYXRlUmVuZGVyZXJTdG10cywgdXBkYXRlRGlyZWN0aXZlc1N0bXRzID0gX2EudXBkYXRlRGlyZWN0aXZlc1N0bXRzLCBub2RlRGVmRXhwcnMgPSBfYS5ub2RlRGVmRXhwcnM7XG4gICAgICAgIHZhciB1cGRhdGVSZW5kZXJlckZuID0gdGhpcy5fY3JlYXRlVXBkYXRlRm4odXBkYXRlUmVuZGVyZXJTdG10cyk7XG4gICAgICAgIHZhciB1cGRhdGVEaXJlY3RpdmVzRm4gPSB0aGlzLl9jcmVhdGVVcGRhdGVGbih1cGRhdGVEaXJlY3RpdmVzU3RtdHMpO1xuICAgICAgICB2YXIgdmlld0ZsYWdzID0gMCAvKiBOb25lICovO1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50ICYmIHRoaXMuY29tcG9uZW50LmNoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoKSB7XG4gICAgICAgICAgICB2aWV3RmxhZ3MgfD0gMiAvKiBPblB1c2ggKi87XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZpZXdGYWN0b3J5ID0gbmV3IERlY2xhcmVGdW5jdGlvblN0bXQodGhpcy52aWV3TmFtZSwgW25ldyBGblBhcmFtKExPR19WQVIkMS5uYW1lKV0sIFtuZXcgUmV0dXJuU3RhdGVtZW50KGltcG9ydEV4cHIoSWRlbnRpZmllcnMudmlld0RlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKHZpZXdGbGFncyksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbEFycihub2RlRGVmRXhwcnMpLFxuICAgICAgICAgICAgICAgIHVwZGF0ZURpcmVjdGl2ZXNGbixcbiAgICAgICAgICAgICAgICB1cGRhdGVSZW5kZXJlckZuLFxuICAgICAgICAgICAgXSkpXSwgaW1wb3J0VHlwZShJZGVudGlmaWVycy5WaWV3RGVmaW5pdGlvbiksIHRoaXMuZW1iZWRkZWRWaWV3SW5kZXggPT09IDAgPyBbU3RtdE1vZGlmaWVyLkV4cG9ydGVkXSA6IFtdKTtcbiAgICAgICAgdGFyZ2V0U3RhdGVtZW50cy5wdXNoKHZpZXdGYWN0b3J5KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFN0YXRlbWVudHM7XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZVVwZGF0ZUZuID0gZnVuY3Rpb24gKHVwZGF0ZVN0bXRzKSB7XG4gICAgICAgIHZhciB1cGRhdGVGbjtcbiAgICAgICAgaWYgKHVwZGF0ZVN0bXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcmVTdG10cyA9IFtdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudC5pc0hvc3QgJiYgZmluZFJlYWRWYXJOYW1lcyh1cGRhdGVTdG10cykuaGFzKENPTVBfVkFSLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcHJlU3RtdHMucHVzaChDT01QX1ZBUi5zZXQoVklFV19WQVIucHJvcCgnY29tcG9uZW50JykpLnRvRGVjbFN0bXQodGhpcy5jb21wVHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlRm4gPSBmbihbXG4gICAgICAgICAgICAgICAgbmV3IEZuUGFyYW0oQ0hFQ0tfVkFSLm5hbWUsIElORkVSUkVEX1RZUEUpLFxuICAgICAgICAgICAgICAgIG5ldyBGblBhcmFtKFZJRVdfVkFSLm5hbWUsIElORkVSUkVEX1RZUEUpXG4gICAgICAgICAgICBdLCBfX3NwcmVhZChwcmVTdG10cywgdXBkYXRlU3RtdHMpLCBJTkZFUlJFRF9UWVBFKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVwZGF0ZUZuID0gTlVMTF9FWFBSO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cGRhdGVGbjtcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS52aXNpdE5nQ29udGVudCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gbmdDb250ZW50RGVmKG5nQ29udGVudEluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIpOiBOb2RlRGVmO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgbm9kZUZsYWdzOiA4IC8qIFR5cGVOZ0NvbnRlbnQgKi8sXG4gICAgICAgICAgICBub2RlRGVmOiBpbXBvcnRFeHByKElkZW50aWZpZXJzLm5nQ29udGVudERlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGFzdC5uZ0NvbnRlbnRJbmRleCksIGxpdGVyYWwoYXN0LmluZGV4KVxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSk7IH0pO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0VGV4dCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gU3RhdGljIHRleHQgbm9kZXMgaGF2ZSBubyBjaGVjayBmdW5jdGlvblxuICAgICAgICB2YXIgY2hlY2tJbmRleCA9IC0xO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgbm9kZUZsYWdzOiAyIC8qIFR5cGVUZXh0ICovLFxuICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy50ZXh0RGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoY2hlY2tJbmRleCksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChhc3QubmdDb250ZW50SW5kZXgpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWxBcnIoW2xpdGVyYWwoYXN0LnZhbHVlKV0pLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSk7IH0pO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0Qm91bmRUZXh0ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgIC8vIHJlc2VydmUgdGhlIHNwYWNlIGluIHRoZSBub2RlRGVmcyBhcnJheVxuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIHZhciBhc3RXaXRoU291cmNlID0gYXN0LnZhbHVlO1xuICAgICAgICB2YXIgaW50ZXIgPSBhc3RXaXRoU291cmNlLmFzdDtcbiAgICAgICAgdmFyIHVwZGF0ZVJlbmRlcmVyRXhwcmVzc2lvbnMgPSBpbnRlci5leHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGV4cHIsIGJpbmRpbmdJbmRleCkgeyByZXR1cm4gX3RoaXMuX3ByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uKHsgbm9kZUluZGV4OiBub2RlSW5kZXgsIGJpbmRpbmdJbmRleDogYmluZGluZ0luZGV4LCBzb3VyY2VTcGFuOiBhc3Quc291cmNlU3BhbiwgY29udGV4dDogQ09NUF9WQVIsIHZhbHVlOiBleHByIH0pOyB9KTtcbiAgICAgICAgLy8gQ2hlY2sgaW5kZXggaXMgdGhlIHNhbWUgYXMgdGhlIG5vZGUgaW5kZXggZHVyaW5nIGNvbXBpbGF0aW9uXG4gICAgICAgIC8vIFRoZXkgbWlnaHQgb25seSBkaWZmZXIgYXQgcnVudGltZVxuICAgICAgICB2YXIgY2hlY2tJbmRleCA9IG5vZGVJbmRleDtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlSW5kZXhdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgbm9kZUZsYWdzOiAyIC8qIFR5cGVUZXh0ICovLFxuICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy50ZXh0RGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoY2hlY2tJbmRleCksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChhc3QubmdDb250ZW50SW5kZXgpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWxBcnIoaW50ZXIuc3RyaW5ncy5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIGxpdGVyYWwocyk7IH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgdXBkYXRlUmVuZGVyZXI6IHVwZGF0ZVJlbmRlcmVyRXhwcmVzc2lvbnNcbiAgICAgICAgfSk7IH07XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRFbWJlZGRlZFRlbXBsYXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgIC8vIHJlc2VydmUgdGhlIHNwYWNlIGluIHRoZSBub2RlRGVmcyBhcnJheVxuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuX3Zpc2l0RWxlbWVudE9yVGVtcGxhdGUobm9kZUluZGV4LCBhc3QpLCBmbGFncyA9IF9hLmZsYWdzLCBxdWVyeU1hdGNoZXNFeHByID0gX2EucXVlcnlNYXRjaGVzRXhwciwgaG9zdEV2ZW50cyA9IF9hLmhvc3RFdmVudHM7XG4gICAgICAgIHZhciBjaGlsZFZpc2l0b3IgPSB0aGlzLnZpZXdCdWlsZGVyRmFjdG9yeSh0aGlzKTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkVmlzaXRvcik7XG4gICAgICAgIGNoaWxkVmlzaXRvci52aXNpdEFsbChhc3QudmFyaWFibGVzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgICB2YXIgY2hpbGRDb3VudCA9IHRoaXMubm9kZXMubGVuZ3RoIC0gbm9kZUluZGV4IC0gMTtcbiAgICAgICAgLy8gYW5jaG9yRGVmKFxuICAgICAgICAvLyAgIGZsYWdzOiBOb2RlRmxhZ3MsIG1hdGNoZWRRdWVyaWVzOiBbc3RyaW5nLCBRdWVyeVZhbHVlVHlwZV1bXSwgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgLy8gICBjaGlsZENvdW50OiBudW1iZXIsIGhhbmRsZUV2ZW50Rm4/OiBFbGVtZW50SGFuZGxlRXZlbnRGbiwgdGVtcGxhdGVGYWN0b3J5PzpcbiAgICAgICAgLy8gICBWaWV3RGVmaW5pdGlvbkZhY3RvcnkpOiBOb2RlRGVmO1xuICAgICAgICB0aGlzLm5vZGVzW25vZGVJbmRleF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgc291cmNlU3BhbjogYXN0LnNvdXJjZVNwYW4sXG4gICAgICAgICAgICBub2RlRmxhZ3M6IDEgLyogVHlwZUVsZW1lbnQgKi8gfCBmbGFncyxcbiAgICAgICAgICAgIG5vZGVEZWY6IGltcG9ydEV4cHIoSWRlbnRpZmllcnMuYW5jaG9yRGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoZmxhZ3MpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hlc0V4cHIsXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChhc3QubmdDb250ZW50SW5kZXgpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoY2hpbGRDb3VudCksXG4gICAgICAgICAgICAgICAgX3RoaXMuX2NyZWF0ZUVsZW1lbnRIYW5kbGVFdmVudEZuKG5vZGVJbmRleCwgaG9zdEV2ZW50cyksXG4gICAgICAgICAgICAgICAgdmFyaWFibGUoY2hpbGRWaXNpdG9yLnZpZXdOYW1lKSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0pOyB9O1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5vZGVJbmRleCA9IHRoaXMubm9kZXMubGVuZ3RoO1xuICAgICAgICAvLyByZXNlcnZlIHRoZSBzcGFjZSBpbiB0aGUgbm9kZURlZnMgYXJyYXkgc28gd2UgY2FuIGFkZCBjaGlsZHJlblxuICAgICAgICB0aGlzLm5vZGVzLnB1c2gobnVsbCk7XG4gICAgICAgIC8vIFVzaW5nIGEgbnVsbCBlbGVtZW50IG5hbWUgY3JlYXRlcyBhbiBhbmNob3IuXG4gICAgICAgIHZhciBlbE5hbWUgPSBpc05nQ29udGFpbmVyKGFzdC5uYW1lKSA/IG51bGwgOiBhc3QubmFtZTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fdmlzaXRFbGVtZW50T3JUZW1wbGF0ZShub2RlSW5kZXgsIGFzdCksIGZsYWdzID0gX2EuZmxhZ3MsIHVzZWRFdmVudHMgPSBfYS51c2VkRXZlbnRzLCBxdWVyeU1hdGNoZXNFeHByID0gX2EucXVlcnlNYXRjaGVzRXhwciwgZGlySG9zdEJpbmRpbmdzID0gX2EuaG9zdEJpbmRpbmdzLCBob3N0RXZlbnRzID0gX2EuaG9zdEV2ZW50cztcbiAgICAgICAgdmFyIGlucHV0RGVmcyA9IFtdO1xuICAgICAgICB2YXIgdXBkYXRlUmVuZGVyZXJFeHByZXNzaW9ucyA9IFtdO1xuICAgICAgICB2YXIgb3V0cHV0RGVmcyA9IFtdO1xuICAgICAgICBpZiAoZWxOYW1lKSB7XG4gICAgICAgICAgICB2YXIgaG9zdEJpbmRpbmdzID0gYXN0LmlucHV0c1xuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGlucHV0QXN0KSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IENPTVBfVkFSLFxuICAgICAgICAgICAgICAgIGlucHV0QXN0OiBpbnB1dEFzdCxcbiAgICAgICAgICAgICAgICBkaXJBc3Q6IG51bGwsXG4gICAgICAgICAgICB9KTsgfSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KGRpckhvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICBpZiAoaG9zdEJpbmRpbmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVJlbmRlcmVyRXhwcmVzc2lvbnMgPVxuICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3MubWFwKGZ1bmN0aW9uIChob3N0QmluZGluZywgYmluZGluZ0luZGV4KSB7IHJldHVybiBfdGhpcy5fcHJlcHJvY2Vzc1VwZGF0ZUV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogaG9zdEJpbmRpbmcuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0luZGV4OiBiaW5kaW5nSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBob3N0QmluZGluZy5pbnB1dEFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGhvc3RCaW5kaW5nLmlucHV0QXN0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgICAgICAgICBpbnB1dERlZnMgPSBob3N0QmluZGluZ3MubWFwKGZ1bmN0aW9uIChob3N0QmluZGluZykgeyByZXR1cm4gZWxlbWVudEJpbmRpbmdEZWYoaG9zdEJpbmRpbmcuaW5wdXRBc3QsIGhvc3RCaW5kaW5nLmRpckFzdCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0RGVmcyA9IHVzZWRFdmVudHMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChfYSwgMiksIHRhcmdldCA9IF9iWzBdLCBldmVudE5hbWUgPSBfYlsxXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGl0ZXJhbEFycihbbGl0ZXJhbCh0YXJnZXQpLCBsaXRlcmFsKGV2ZW50TmFtZSldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmNoaWxkcmVuKTtcbiAgICAgICAgdmFyIGNoaWxkQ291bnQgPSB0aGlzLm5vZGVzLmxlbmd0aCAtIG5vZGVJbmRleCAtIDE7XG4gICAgICAgIHZhciBjb21wQXN0ID0gYXN0LmRpcmVjdGl2ZXMuZmluZChmdW5jdGlvbiAoZGlyQXN0KSB7IHJldHVybiBkaXJBc3QuZGlyZWN0aXZlLmlzQ29tcG9uZW50OyB9KTtcbiAgICAgICAgdmFyIGNvbXBSZW5kZXJlclR5cGUgPSBOVUxMX0VYUFI7XG4gICAgICAgIHZhciBjb21wVmlldyA9IE5VTExfRVhQUjtcbiAgICAgICAgaWYgKGNvbXBBc3QpIHtcbiAgICAgICAgICAgIGNvbXBWaWV3ID0gdGhpcy5vdXRwdXRDdHguaW1wb3J0RXhwcihjb21wQXN0LmRpcmVjdGl2ZS5jb21wb25lbnRWaWV3VHlwZSk7XG4gICAgICAgICAgICBjb21wUmVuZGVyZXJUeXBlID0gdGhpcy5vdXRwdXRDdHguaW1wb3J0RXhwcihjb21wQXN0LmRpcmVjdGl2ZS5yZW5kZXJlclR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGluZGV4IGlzIHRoZSBzYW1lIGFzIHRoZSBub2RlIGluZGV4IGR1cmluZyBjb21waWxhdGlvblxuICAgICAgICAvLyBUaGV5IG1pZ2h0IG9ubHkgZGlmZmVyIGF0IHJ1bnRpbWVcbiAgICAgICAgdmFyIGNoZWNrSW5kZXggPSBub2RlSW5kZXg7XG4gICAgICAgIHRoaXMubm9kZXNbbm9kZUluZGV4XSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBzb3VyY2VTcGFuOiBhc3Quc291cmNlU3BhbixcbiAgICAgICAgICAgIG5vZGVGbGFnczogMSAvKiBUeXBlRWxlbWVudCAqLyB8IGZsYWdzLFxuICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5lbGVtZW50RGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoY2hlY2tJbmRleCksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChmbGFncyksXG4gICAgICAgICAgICAgICAgcXVlcnlNYXRjaGVzRXhwcixcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGFzdC5uZ0NvbnRlbnRJbmRleCksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChjaGlsZENvdW50KSxcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGVsTmFtZSksXG4gICAgICAgICAgICAgICAgZWxOYW1lID8gZml4ZWRBdHRyc0RlZihhc3QpIDogTlVMTF9FWFBSLFxuICAgICAgICAgICAgICAgIGlucHV0RGVmcy5sZW5ndGggPyBsaXRlcmFsQXJyKGlucHV0RGVmcykgOiBOVUxMX0VYUFIsXG4gICAgICAgICAgICAgICAgb3V0cHV0RGVmcy5sZW5ndGggPyBsaXRlcmFsQXJyKG91dHB1dERlZnMpIDogTlVMTF9FWFBSLFxuICAgICAgICAgICAgICAgIF90aGlzLl9jcmVhdGVFbGVtZW50SGFuZGxlRXZlbnRGbihub2RlSW5kZXgsIGhvc3RFdmVudHMpLFxuICAgICAgICAgICAgICAgIGNvbXBWaWV3LFxuICAgICAgICAgICAgICAgIGNvbXBSZW5kZXJlclR5cGUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHVwZGF0ZVJlbmRlcmVyOiB1cGRhdGVSZW5kZXJlckV4cHJlc3Npb25zXG4gICAgICAgIH0pOyB9O1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl92aXNpdEVsZW1lbnRPclRlbXBsYXRlID0gZnVuY3Rpb24gKG5vZGVJbmRleCwgYXN0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBmbGFncyA9IDAgLyogTm9uZSAqLztcbiAgICAgICAgaWYgKGFzdC5oYXNWaWV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgICBmbGFncyB8PSAxNjc3NzIxNiAvKiBFbWJlZGRlZFZpZXdzICovO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1c2VkRXZlbnRzID0gbmV3IE1hcCgpO1xuICAgICAgICBhc3Qub3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIF9hID0gZWxlbWVudEV2ZW50TmFtZUFuZFRhcmdldChldmVudCwgbnVsbCksIG5hbWUgPSBfYS5uYW1lLCB0YXJnZXQgPSBfYS50YXJnZXQ7XG4gICAgICAgICAgICB1c2VkRXZlbnRzLnNldChlbGVtZW50RXZlbnRGdWxsTmFtZSh0YXJnZXQsIG5hbWUpLCBbdGFyZ2V0LCBuYW1lXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBhc3QuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJBc3QpIHtcbiAgICAgICAgICAgIGRpckFzdC5ob3N0RXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hID0gZWxlbWVudEV2ZW50TmFtZUFuZFRhcmdldChldmVudCwgZGlyQXN0KSwgbmFtZSA9IF9hLm5hbWUsIHRhcmdldCA9IF9hLnRhcmdldDtcbiAgICAgICAgICAgICAgICB1c2VkRXZlbnRzLnNldChlbGVtZW50RXZlbnRGdWxsTmFtZSh0YXJnZXQsIG5hbWUpLCBbdGFyZ2V0LCBuYW1lXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBob3N0QmluZGluZ3MgPSBbXTtcbiAgICAgICAgdmFyIGhvc3RFdmVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5fdmlzaXRDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJQcm92aWRlcihhc3QuZGlyZWN0aXZlcyk7XG4gICAgICAgIGFzdC5wcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXJBc3QsIHByb3ZpZGVySW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBkaXJBc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgZGlySW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc3QuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbERpckFzdCwgaSkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbERpckFzdC5kaXJlY3RpdmUudHlwZS5yZWZlcmVuY2UgPT09IHRva2VuUmVmZXJlbmNlKHByb3ZpZGVyQXN0LnRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJBc3QgPSBsb2NhbERpckFzdDtcbiAgICAgICAgICAgICAgICAgICAgZGlySW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRpckFzdCkge1xuICAgICAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLl92aXNpdERpcmVjdGl2ZShwcm92aWRlckFzdCwgZGlyQXN0LCBkaXJJbmRleCwgbm9kZUluZGV4LCBhc3QucmVmZXJlbmNlcywgYXN0LnF1ZXJ5TWF0Y2hlcywgdXNlZEV2ZW50cywgX3RoaXMuc3RhdGljUXVlcnlJZHMuZ2V0KGFzdCkpLCBkaXJIb3N0QmluZGluZ3MgPSBfYS5ob3N0QmluZGluZ3MsIGRpckhvc3RFdmVudHMgPSBfYS5ob3N0RXZlbnRzO1xuICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5ncy5wdXNoLmFwcGx5KGhvc3RCaW5kaW5ncywgX19zcHJlYWQoZGlySG9zdEJpbmRpbmdzKSk7XG4gICAgICAgICAgICAgICAgaG9zdEV2ZW50cy5wdXNoLmFwcGx5KGhvc3RFdmVudHMsIF9fc3ByZWFkKGRpckhvc3RFdmVudHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLl92aXNpdFByb3ZpZGVyKHByb3ZpZGVyQXN0LCBhc3QucXVlcnlNYXRjaGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBxdWVyeU1hdGNoRXhwcnMgPSBbXTtcbiAgICAgICAgYXN0LnF1ZXJ5TWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShtYXRjaC52YWx1ZSkgPT09XG4gICAgICAgICAgICAgICAgX3RoaXMucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShJZGVudGlmaWVycy5FbGVtZW50UmVmKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlVHlwZSA9IDAgLyogRWxlbWVudFJlZiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuUmVmZXJlbmNlKG1hdGNoLnZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlID0gMyAvKiBWaWV3Q29udGFpbmVyUmVmICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5SZWZlcmVuY2UobWF0Y2gudmFsdWUpID09PVxuICAgICAgICAgICAgICAgIF90aGlzLnJlZmxlY3Rvci5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UoSWRlbnRpZmllcnMuVGVtcGxhdGVSZWYpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlID0gMiAvKiBUZW1wbGF0ZVJlZiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hFeHBycy5wdXNoKGxpdGVyYWxBcnIoW2xpdGVyYWwobWF0Y2gucXVlcnlJZCksIGxpdGVyYWwodmFsdWVUeXBlKV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFzdC5yZWZlcmVuY2VzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgdmFyIHZhbHVlVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghcmVmLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlID0gMSAvKiBSZW5kZXJFbGVtZW50ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5SZWZlcmVuY2UocmVmLnZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKElkZW50aWZpZXJzLlRlbXBsYXRlUmVmKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlVHlwZSA9IDIgLyogVGVtcGxhdGVSZWYgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVUeXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWZOb2RlSW5kaWNlc1tyZWYubmFtZV0gPSBub2RlSW5kZXg7XG4gICAgICAgICAgICAgICAgcXVlcnlNYXRjaEV4cHJzLnB1c2gobGl0ZXJhbEFycihbbGl0ZXJhbChyZWYubmFtZSksIGxpdGVyYWwodmFsdWVUeXBlKV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFzdC5vdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dEFzdCkge1xuICAgICAgICAgICAgaG9zdEV2ZW50cy5wdXNoKHsgY29udGV4dDogQ09NUF9WQVIsIGV2ZW50QXN0OiBvdXRwdXRBc3QsIGRpckFzdDogbnVsbCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgICAgICB1c2VkRXZlbnRzOiBBcnJheS5mcm9tKHVzZWRFdmVudHMudmFsdWVzKCkpLFxuICAgICAgICAgICAgcXVlcnlNYXRjaGVzRXhwcjogcXVlcnlNYXRjaEV4cHJzLmxlbmd0aCA/IGxpdGVyYWxBcnIocXVlcnlNYXRjaEV4cHJzKSA6IE5VTExfRVhQUixcbiAgICAgICAgICAgIGhvc3RCaW5kaW5nczogaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgaG9zdEV2ZW50czogaG9zdEV2ZW50c1xuICAgICAgICB9O1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl92aXNpdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChwcm92aWRlckFzdCwgZGlyQXN0LCBkaXJlY3RpdmVJbmRleCwgZWxlbWVudE5vZGVJbmRleCwgcmVmcywgcXVlcnlNYXRjaGVzLCB1c2VkRXZlbnRzLCBxdWVyeUlkcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgIC8vIHJlc2VydmUgdGhlIHNwYWNlIGluIHRoZSBub2RlRGVmcyBhcnJheSBzbyB3ZSBjYW4gYWRkIGNoaWxkcmVuXG4gICAgICAgIHRoaXMubm9kZXMucHVzaChudWxsKTtcbiAgICAgICAgZGlyQXN0LmRpcmVjdGl2ZS5xdWVyaWVzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5LCBxdWVyeUluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcXVlcnlJZCA9IGRpckFzdC5jb250ZW50UXVlcnlTdGFydElkICsgcXVlcnlJbmRleDtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IDY3MTA4ODY0IC8qIFR5cGVDb250ZW50UXVlcnkgKi8gfCBjYWxjU3RhdGljRHluYW1pY1F1ZXJ5RmxhZ3MocXVlcnlJZHMsIHF1ZXJ5SWQsIHF1ZXJ5KTtcbiAgICAgICAgICAgIHZhciBiaW5kaW5nVHlwZSA9IHF1ZXJ5LmZpcnN0ID8gMCAvKiBGaXJzdCAqLyA6IDEgLyogQWxsICovO1xuICAgICAgICAgICAgX3RoaXMubm9kZXMucHVzaChmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IGRpckFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgIG5vZGVGbGFnczogZmxhZ3MsXG4gICAgICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5xdWVyeURlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbChmbGFncyksIGxpdGVyYWwocXVlcnlJZCksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBMaXRlcmFsTWFwRXhwcihbbmV3IExpdGVyYWxNYXBFbnRyeShxdWVyeS5wcm9wZXJ0eU5hbWUsIGxpdGVyYWwoYmluZGluZ1R5cGUpLCBmYWxzZSldKVxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTm90ZTogdGhlIG9wZXJhdGlvbiBiZWxvdyBtaWdodCBhbHNvIGNyZWF0ZSBuZXcgbm9kZURlZnMsXG4gICAgICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IHRoZW0gdG8gYmUgYSBjaGlsZCBvZiBhIGRpcmVjdGl2ZSxcbiAgICAgICAgLy8gYXMgdGhleSBtaWdodCBiZSBhIHByb3ZpZGVyL3BpcGUgb24gdGhlaXIgb3duLlxuICAgICAgICAvLyBJLmUuIHdlIG9ubHkgYWxsb3cgcXVlcmllcyBhcyBjaGlsZHJlbiBvZiBkaXJlY3RpdmVzIG5vZGVzLlxuICAgICAgICB2YXIgY2hpbGRDb3VudCA9IHRoaXMubm9kZXMubGVuZ3RoIC0gbm9kZUluZGV4IC0gMTtcbiAgICAgICAgdmFyIF9hID0gdGhpcy5fdmlzaXRQcm92aWRlck9yRGlyZWN0aXZlKHByb3ZpZGVyQXN0LCBxdWVyeU1hdGNoZXMpLCBmbGFncyA9IF9hLmZsYWdzLCBxdWVyeU1hdGNoRXhwcnMgPSBfYS5xdWVyeU1hdGNoRXhwcnMsIHByb3ZpZGVyRXhwciA9IF9hLnByb3ZpZGVyRXhwciwgZGVwc0V4cHIgPSBfYS5kZXBzRXhwcjtcbiAgICAgICAgcmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICAgIGlmIChyZWYudmFsdWUgJiYgdG9rZW5SZWZlcmVuY2UocmVmLnZhbHVlKSA9PT0gdG9rZW5SZWZlcmVuY2UocHJvdmlkZXJBc3QudG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVmTm9kZUluZGljZXNbcmVmLm5hbWVdID0gbm9kZUluZGV4O1xuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hFeHBycy5wdXNoKGxpdGVyYWxBcnIoW2xpdGVyYWwocmVmLm5hbWUpLCBsaXRlcmFsKDQgLyogUHJvdmlkZXIgKi8pXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRpckFzdC5kaXJlY3RpdmUuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGZsYWdzIHw9IDMyNzY4IC8qIENvbXBvbmVudCAqLztcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5wdXREZWZzID0gZGlyQXN0LmlucHV0cy5tYXAoZnVuY3Rpb24gKGlucHV0QXN0LCBpbnB1dEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgbWFwVmFsdWUgPSBsaXRlcmFsQXJyKFtsaXRlcmFsKGlucHV0SW5kZXgpLCBsaXRlcmFsKGlucHV0QXN0LmRpcmVjdGl2ZU5hbWUpXSk7XG4gICAgICAgICAgICAvLyBOb3RlOiBpdCdzIGltcG9ydGFudCB0byBub3QgcXVvdGUgdGhlIGtleSBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHJlbmFtZXMgYnkgbWluaWZpZXJzIVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwRW50cnkoaW5wdXRBc3QuZGlyZWN0aXZlTmFtZSwgbWFwVmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBvdXRwdXREZWZzID0gW107XG4gICAgICAgIHZhciBkaXJNZXRhID0gZGlyQXN0LmRpcmVjdGl2ZTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGlyTWV0YS5vdXRwdXRzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGRpck1ldGEub3V0cHV0c1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAodXNlZEV2ZW50cy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIG5vdCBxdW90ZSB0aGUga2V5IHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgcmVuYW1lcyBieSBtaW5pZmllcnMhXG4gICAgICAgICAgICAgICAgb3V0cHV0RGVmcy5wdXNoKG5ldyBMaXRlcmFsTWFwRW50cnkocHJvcE5hbWUsIGxpdGVyYWwoZXZlbnROYW1lKSwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB1cGRhdGVEaXJlY3RpdmVFeHByZXNzaW9ucyA9IFtdO1xuICAgICAgICBpZiAoZGlyQXN0LmlucHV0cy5sZW5ndGggfHwgKGZsYWdzICYgKDI2MjE0NCAvKiBEb0NoZWNrICovIHwgNjU1MzYgLyogT25Jbml0ICovKSkgPiAwKSB7XG4gICAgICAgICAgICB1cGRhdGVEaXJlY3RpdmVFeHByZXNzaW9ucyA9XG4gICAgICAgICAgICAgICAgZGlyQXN0LmlucHV0cy5tYXAoZnVuY3Rpb24gKGlucHV0LCBiaW5kaW5nSW5kZXgpIHsgcmV0dXJuIF90aGlzLl9wcmVwcm9jZXNzVXBkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSW5kZXg6IGJpbmRpbmdJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlU3BhbjogaW5wdXQuc291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogQ09NUF9WQVIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpbnB1dC52YWx1ZVxuICAgICAgICAgICAgICAgIH0pOyB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlyQ29udGV4dEV4cHIgPSBpbXBvcnRFeHByKElkZW50aWZpZXJzLm5vZGVWYWx1ZSkuY2FsbEZuKFtWSUVXX1ZBUiwgbGl0ZXJhbChub2RlSW5kZXgpXSk7XG4gICAgICAgIHZhciBob3N0QmluZGluZ3MgPSBkaXJBc3QuaG9zdFByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChpbnB1dEFzdCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpckNvbnRleHRFeHByLFxuICAgICAgICAgICAgZGlyQXN0OiBkaXJBc3QsXG4gICAgICAgICAgICBpbnB1dEFzdDogaW5wdXRBc3QsXG4gICAgICAgIH0pOyB9KTtcbiAgICAgICAgdmFyIGhvc3RFdmVudHMgPSBkaXJBc3QuaG9zdEV2ZW50cy5tYXAoZnVuY3Rpb24gKGhvc3RFdmVudEFzdCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGNvbnRleHQ6IGRpckNvbnRleHRFeHByLFxuICAgICAgICAgICAgZXZlbnRBc3Q6IGhvc3RFdmVudEFzdCwgZGlyQXN0OiBkaXJBc3QsXG4gICAgICAgIH0pOyB9KTtcbiAgICAgICAgLy8gQ2hlY2sgaW5kZXggaXMgdGhlIHNhbWUgYXMgdGhlIG5vZGUgaW5kZXggZHVyaW5nIGNvbXBpbGF0aW9uXG4gICAgICAgIC8vIFRoZXkgbWlnaHQgb25seSBkaWZmZXIgYXQgcnVudGltZVxuICAgICAgICB2YXIgY2hlY2tJbmRleCA9IG5vZGVJbmRleDtcbiAgICAgICAgdGhpcy5ub2Rlc1tub2RlSW5kZXhdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGRpckFzdC5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgbm9kZUZsYWdzOiAxNjM4NCAvKiBUeXBlRGlyZWN0aXZlICovIHwgZmxhZ3MsXG4gICAgICAgICAgICBub2RlRGVmOiBpbXBvcnRFeHByKElkZW50aWZpZXJzLmRpcmVjdGl2ZURlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGNoZWNrSW5kZXgpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoZmxhZ3MpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hFeHBycy5sZW5ndGggPyBsaXRlcmFsQXJyKHF1ZXJ5TWF0Y2hFeHBycykgOiBOVUxMX0VYUFIsXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChjaGlsZENvdW50KSxcbiAgICAgICAgICAgICAgICBwcm92aWRlckV4cHIsXG4gICAgICAgICAgICAgICAgZGVwc0V4cHIsXG4gICAgICAgICAgICAgICAgaW5wdXREZWZzLmxlbmd0aCA/IG5ldyBMaXRlcmFsTWFwRXhwcihpbnB1dERlZnMpIDogTlVMTF9FWFBSLFxuICAgICAgICAgICAgICAgIG91dHB1dERlZnMubGVuZ3RoID8gbmV3IExpdGVyYWxNYXBFeHByKG91dHB1dERlZnMpIDogTlVMTF9FWFBSLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB1cGRhdGVEaXJlY3RpdmVzOiB1cGRhdGVEaXJlY3RpdmVFeHByZXNzaW9ucyxcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogZGlyQXN0LmRpcmVjdGl2ZS50eXBlLFxuICAgICAgICB9KTsgfTtcbiAgICAgICAgcmV0dXJuIHsgaG9zdEJpbmRpbmdzOiBob3N0QmluZGluZ3MsIGhvc3RFdmVudHM6IGhvc3RFdmVudHMgfTtcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS5fdmlzaXRQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlckFzdCwgcXVlcnlNYXRjaGVzKSB7XG4gICAgICAgIHRoaXMuX2FkZFByb3ZpZGVyTm9kZSh0aGlzLl92aXNpdFByb3ZpZGVyT3JEaXJlY3RpdmUocHJvdmlkZXJBc3QsIHF1ZXJ5TWF0Y2hlcykpO1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl92aXNpdENvbXBvbmVudEZhY3RvcnlSZXNvbHZlclByb3ZpZGVyID0gZnVuY3Rpb24gKGRpcmVjdGl2ZXMpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudERpck1ldGEgPSBkaXJlY3RpdmVzLmZpbmQoZnVuY3Rpb24gKGRpckFzdCkgeyByZXR1cm4gZGlyQXN0LmRpcmVjdGl2ZS5pc0NvbXBvbmVudDsgfSk7XG4gICAgICAgIGlmIChjb21wb25lbnREaXJNZXRhICYmIGNvbXBvbmVudERpck1ldGEuZGlyZWN0aXZlLmVudHJ5Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlclByb3ZpZGVyRGVmKHRoaXMucmVmbGVjdG9yLCB0aGlzLm91dHB1dEN0eCwgODE5MiAvKiBQcml2YXRlUHJvdmlkZXIgKi8sIGNvbXBvbmVudERpck1ldGEuZGlyZWN0aXZlLmVudHJ5Q29tcG9uZW50cyksIHByb3ZpZGVyRXhwciA9IF9hLnByb3ZpZGVyRXhwciwgZGVwc0V4cHIgPSBfYS5kZXBzRXhwciwgZmxhZ3MgPSBfYS5mbGFncywgdG9rZW5FeHByID0gX2EudG9rZW5FeHByO1xuICAgICAgICAgICAgdGhpcy5fYWRkUHJvdmlkZXJOb2RlKHtcbiAgICAgICAgICAgICAgICBwcm92aWRlckV4cHI6IHByb3ZpZGVyRXhwcixcbiAgICAgICAgICAgICAgICBkZXBzRXhwcjogZGVwc0V4cHIsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICAgICAgICAgIHRva2VuRXhwcjogdG9rZW5FeHByLFxuICAgICAgICAgICAgICAgIHF1ZXJ5TWF0Y2hFeHByczogW10sXG4gICAgICAgICAgICAgICAgc291cmNlU3BhbjogY29tcG9uZW50RGlyTWV0YS5zb3VyY2VTcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl9hZGRQcm92aWRlck5vZGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgIC8vIHByb3ZpZGVyRGVmKFxuICAgICAgICAvLyAgIGZsYWdzOiBOb2RlRmxhZ3MsIG1hdGNoZWRRdWVyaWVzOiBbc3RyaW5nLCBRdWVyeVZhbHVlVHlwZV1bXSwgdG9rZW46YW55LFxuICAgICAgICAvLyAgIHZhbHVlOiBhbnksIGRlcHM6IChbRGVwRmxhZ3MsIGFueV0gfCBhbnkpW10pOiBOb2RlRGVmO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IGRhdGEuc291cmNlU3BhbixcbiAgICAgICAgICAgIG5vZGVGbGFnczogZGF0YS5mbGFncyxcbiAgICAgICAgICAgIG5vZGVEZWY6IGltcG9ydEV4cHIoSWRlbnRpZmllcnMucHJvdmlkZXJEZWYpLmNhbGxGbihbXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChkYXRhLmZsYWdzKSxcbiAgICAgICAgICAgICAgICBkYXRhLnF1ZXJ5TWF0Y2hFeHBycy5sZW5ndGggPyBsaXRlcmFsQXJyKGRhdGEucXVlcnlNYXRjaEV4cHJzKSA6IE5VTExfRVhQUixcbiAgICAgICAgICAgICAgICBkYXRhLnRva2VuRXhwciwgZGF0YS5wcm92aWRlckV4cHIsIGRhdGEuZGVwc0V4cHJcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0pOyB9KTtcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS5fdmlzaXRQcm92aWRlck9yRGlyZWN0aXZlID0gZnVuY3Rpb24gKHByb3ZpZGVyQXN0LCBxdWVyeU1hdGNoZXMpIHtcbiAgICAgICAgdmFyIGZsYWdzID0gMCAvKiBOb25lICovO1xuICAgICAgICB2YXIgcXVlcnlNYXRjaEV4cHJzID0gW107XG4gICAgICAgIHF1ZXJ5TWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRva2VuUmVmZXJlbmNlKG1hdGNoLnZhbHVlKSA9PT0gdG9rZW5SZWZlcmVuY2UocHJvdmlkZXJBc3QudG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlNYXRjaEV4cHJzLnB1c2gobGl0ZXJhbEFycihbbGl0ZXJhbChtYXRjaC5xdWVyeUlkKSwgbGl0ZXJhbCg0IC8qIFByb3ZpZGVyICovKV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfYSA9IHByb3ZpZGVyRGVmKHRoaXMub3V0cHV0Q3R4LCBwcm92aWRlckFzdCksIHByb3ZpZGVyRXhwciA9IF9hLnByb3ZpZGVyRXhwciwgZGVwc0V4cHIgPSBfYS5kZXBzRXhwciwgcHJvdmlkZXJGbGFncyA9IF9hLmZsYWdzLCB0b2tlbkV4cHIgPSBfYS50b2tlbkV4cHI7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmbGFnczogZmxhZ3MgfCBwcm92aWRlckZsYWdzLFxuICAgICAgICAgICAgcXVlcnlNYXRjaEV4cHJzOiBxdWVyeU1hdGNoRXhwcnMsXG4gICAgICAgICAgICBwcm92aWRlckV4cHI6IHByb3ZpZGVyRXhwcixcbiAgICAgICAgICAgIGRlcHNFeHByOiBkZXBzRXhwcixcbiAgICAgICAgICAgIHRva2VuRXhwcjogdG9rZW5FeHByLFxuICAgICAgICAgICAgc291cmNlU3BhbjogcHJvdmlkZXJBc3Quc291cmNlU3BhblxuICAgICAgICB9O1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLmdldExvY2FsID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT0gRXZlbnRIYW5kbGVyVmFycy5ldmVudC5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gRXZlbnRIYW5kbGVyVmFycy5ldmVudDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VyclZpZXdFeHByID0gVklFV19WQVI7XG4gICAgICAgIGZvciAodmFyIGN1cnJCdWlsZGVyID0gdGhpczsgY3VyckJ1aWxkZXI7IGN1cnJCdWlsZGVyID0gY3VyckJ1aWxkZXIucGFyZW50LFxuICAgICAgICAgICAgY3VyclZpZXdFeHByID0gY3VyclZpZXdFeHByLnByb3AoJ3BhcmVudCcpLmNhc3QoRFlOQU1JQ19UWVBFKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgcmVmZXJlbmNlc1xuICAgICAgICAgICAgdmFyIHJlZk5vZGVJbmRleCA9IGN1cnJCdWlsZGVyLnJlZk5vZGVJbmRpY2VzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHJlZk5vZGVJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydEV4cHIoSWRlbnRpZmllcnMubm9kZVZhbHVlKS5jYWxsRm4oW2N1cnJWaWV3RXhwciwgbGl0ZXJhbChyZWZOb2RlSW5kZXgpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjaGVjayB2YXJpYWJsZXNcbiAgICAgICAgICAgIHZhciB2YXJBc3QgPSBjdXJyQnVpbGRlci52YXJpYWJsZXMuZmluZChmdW5jdGlvbiAodmFyQXN0KSB7IHJldHVybiB2YXJBc3QubmFtZSA9PT0gbmFtZTsgfSk7XG4gICAgICAgICAgICBpZiAodmFyQXN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhclZhbHVlID0gdmFyQXN0LnZhbHVlIHx8IElNUExJQ0lUX1RFTVBMQVRFX1ZBUjtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyclZpZXdFeHByLnByb3AoJ2NvbnRleHQnKS5wcm9wKHZhclZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS5ub3RpZnlJbXBsaWNpdFJlY2VpdmVyVXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBOb3QgbmVlZGVkIGluIFZpZXcgRW5naW5lIGFzIFZpZXcgRW5naW5lIHdhbGtzIHRocm91Z2ggdGhlIGdlbmVyYXRlZFxuICAgICAgICAvLyBleHByZXNzaW9ucyB0byBmaWd1cmUgb3V0IGlmIHRoZSBpbXBsaWNpdCByZWNlaXZlciBpcyB1c2VkIGFuZCBuZWVkc1xuICAgICAgICAvLyB0byBiZSBnZW5lcmF0ZWQgYXMgcGFydCBvZiB0aGUgcHJlLXVwZGF0ZSBzdGF0ZW1lbnRzLlxuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl9jcmVhdGVMaXRlcmFsQXJyYXlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoc291cmNlU3BhbiwgYXJnQ291bnQpIHtcbiAgICAgICAgaWYgKGFyZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWVFeHByXzEgPSBpbXBvcnRFeHByKElkZW50aWZpZXJzLkVNUFRZX0FSUkFZKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZUV4cHJfMTsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hlY2tJbmRleCA9IHRoaXMubm9kZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IHNvdXJjZVNwYW4sXG4gICAgICAgICAgICBub2RlRmxhZ3M6IDMyIC8qIFR5cGVQdXJlQXJyYXkgKi8sXG4gICAgICAgICAgICBub2RlRGVmOiBpbXBvcnRFeHByKElkZW50aWZpZXJzLnB1cmVBcnJheURlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICBsaXRlcmFsKGNoZWNrSW5kZXgpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoYXJnQ291bnQpLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSk7IH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHsgcmV0dXJuIGNhbGxDaGVja1N0bXQoY2hlY2tJbmRleCwgYXJncyk7IH07XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZUxpdGVyYWxNYXBDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoc291cmNlU3Bhbiwga2V5cykge1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZUV4cHJfMiA9IGltcG9ydEV4cHIoSWRlbnRpZmllcnMuRU1QVFlfTUFQKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZUV4cHJfMjsgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWFwID0gbGl0ZXJhbE1hcChrZXlzLm1hcChmdW5jdGlvbiAoZSwgaSkgeyByZXR1cm4gKF9fYXNzaWduKHt9LCBlLCB7IHZhbHVlOiBsaXRlcmFsKGkpIH0pKTsgfSkpO1xuICAgICAgICB2YXIgY2hlY2tJbmRleCA9IHRoaXMubm9kZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IHNvdXJjZVNwYW4sXG4gICAgICAgICAgICBub2RlRmxhZ3M6IDY0IC8qIFR5cGVQdXJlT2JqZWN0ICovLFxuICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5wdXJlT2JqZWN0RGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoY2hlY2tJbmRleCksXG4gICAgICAgICAgICAgICAgbWFwLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgfSk7IH0pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHsgcmV0dXJuIGNhbGxDaGVja1N0bXQoY2hlY2tJbmRleCwgYXJncyk7IH07XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZVBpcGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoZXhwcmVzc2lvbiwgbmFtZSwgYXJnQ291bnQpIHtcbiAgICAgICAgdmFyIHBpcGUgPSB0aGlzLnVzZWRQaXBlcy5maW5kKGZ1bmN0aW9uIChwaXBlU3VtbWFyeSkgeyByZXR1cm4gcGlwZVN1bW1hcnkubmFtZSA9PT0gbmFtZTsgfSk7XG4gICAgICAgIGlmIChwaXBlLnB1cmUpIHtcbiAgICAgICAgICAgIHZhciBjaGVja0luZGV4XzEgPSB0aGlzLm5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMubm9kZXMucHVzaChmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IGV4cHJlc3Npb24uc291cmNlU3BhbixcbiAgICAgICAgICAgICAgICBub2RlRmxhZ3M6IDEyOCAvKiBUeXBlUHVyZVBpcGUgKi8sXG4gICAgICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5wdXJlUGlwZURlZikuY2FsbEZuKFtcbiAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbChjaGVja0luZGV4XzEpLFxuICAgICAgICAgICAgICAgICAgICBsaXRlcmFsKGFyZ0NvdW50KSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgfSk7IH0pO1xuICAgICAgICAgICAgLy8gZmluZCB1bmRlcmx5aW5nIHBpcGUgaW4gdGhlIGNvbXBvbmVudCB2aWV3XG4gICAgICAgICAgICB2YXIgY29tcFZpZXdFeHByID0gVklFV19WQVI7XG4gICAgICAgICAgICB2YXIgY29tcEJ1aWxkZXIgPSB0aGlzO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBCdWlsZGVyLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbXBCdWlsZGVyID0gY29tcEJ1aWxkZXIucGFyZW50O1xuICAgICAgICAgICAgICAgIGNvbXBWaWV3RXhwciA9IGNvbXBWaWV3RXhwci5wcm9wKCdwYXJlbnQnKS5jYXN0KERZTkFNSUNfVFlQRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGlwZU5vZGVJbmRleCA9IGNvbXBCdWlsZGVyLnB1cmVQaXBlTm9kZUluZGljZXNbbmFtZV07XG4gICAgICAgICAgICB2YXIgcGlwZVZhbHVlRXhwcl8xID0gaW1wb3J0RXhwcihJZGVudGlmaWVycy5ub2RlVmFsdWUpLmNhbGxGbihbY29tcFZpZXdFeHByLCBsaXRlcmFsKHBpcGVOb2RlSW5kZXgpXSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFyZ3MpIHsgcmV0dXJuIGNhbGxVbndyYXBWYWx1ZShleHByZXNzaW9uLm5vZGVJbmRleCwgZXhwcmVzc2lvbi5iaW5kaW5nSW5kZXgsIGNhbGxDaGVja1N0bXQoY2hlY2tJbmRleF8xLCBbcGlwZVZhbHVlRXhwcl8xXS5jb25jYXQoYXJncykpKTsgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBub2RlSW5kZXggPSB0aGlzLl9jcmVhdGVQaXBlKGV4cHJlc3Npb24uc291cmNlU3BhbiwgcGlwZSk7XG4gICAgICAgICAgICB2YXIgbm9kZVZhbHVlRXhwcl8xID0gaW1wb3J0RXhwcihJZGVudGlmaWVycy5ub2RlVmFsdWUpLmNhbGxGbihbVklFV19WQVIsIGxpdGVyYWwobm9kZUluZGV4KV0pO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7IHJldHVybiBjYWxsVW53cmFwVmFsdWUoZXhwcmVzc2lvbi5ub2RlSW5kZXgsIGV4cHJlc3Npb24uYmluZGluZ0luZGV4LCBub2RlVmFsdWVFeHByXzEuY2FsbE1ldGhvZCgndHJhbnNmb3JtJywgYXJncykpOyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZVBpcGUgPSBmdW5jdGlvbiAoc291cmNlU3BhbiwgcGlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbm9kZUluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG4gICAgICAgIHZhciBmbGFncyA9IDAgLyogTm9uZSAqLztcbiAgICAgICAgcGlwZS50eXBlLmxpZmVjeWNsZUhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGxpZmVjeWNsZUhvb2spIHtcbiAgICAgICAgICAgIC8vIGZvciBwaXBlcywgd2Ugb25seSBzdXBwb3J0IG5nT25EZXN0cm95XG4gICAgICAgICAgICBpZiAobGlmZWN5Y2xlSG9vayA9PT0gTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gbGlmZWN5Y2xlSG9va1RvTm9kZUZsYWcobGlmZWN5Y2xlSG9vayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgZGVwRXhwcnMgPSBwaXBlLnR5cGUuZGlEZXBzLm1hcChmdW5jdGlvbiAoZGlEZXApIHsgcmV0dXJuIGRlcERlZihfdGhpcy5vdXRwdXRDdHgsIGRpRGVwKTsgfSk7XG4gICAgICAgIC8vIGZ1bmN0aW9uIHBpcGVEZWYoXG4gICAgICAgIC8vICAgZmxhZ3M6IE5vZGVGbGFncywgY3RvcjogYW55LCBkZXBzOiAoW0RlcEZsYWdzLCBhbnldIHwgYW55KVtdKTogTm9kZURlZlxuICAgICAgICB0aGlzLm5vZGVzLnB1c2goZnVuY3Rpb24gKCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIHNvdXJjZVNwYW46IHNvdXJjZVNwYW4sXG4gICAgICAgICAgICBub2RlRmxhZ3M6IDE2IC8qIFR5cGVQaXBlICovLFxuICAgICAgICAgICAgbm9kZURlZjogaW1wb3J0RXhwcihJZGVudGlmaWVycy5waXBlRGVmKS5jYWxsRm4oW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoZmxhZ3MpLCBfdGhpcy5vdXRwdXRDdHguaW1wb3J0RXhwcihwaXBlLnR5cGUucmVmZXJlbmNlKSwgbGl0ZXJhbEFycihkZXBFeHBycylcbiAgICAgICAgICAgIF0pXG4gICAgICAgIH0pOyB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGVJbmRleDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZvciB0aGUgQVNUIGluIGBVcGRhdGVFeHByZXNzaW9uLnZhbHVlYDpcbiAgICAgKiAtIGNyZWF0ZSBub2RlcyBmb3IgcGlwZXMsIGxpdGVyYWwgYXJyYXlzIGFuZCwgbGl0ZXJhbCBtYXBzLFxuICAgICAqIC0gdXBkYXRlIHRoZSBBU1QgdG8gcmVwbGFjZSBwaXBlcywgbGl0ZXJhbCBhcnJheXMgYW5kLCBsaXRlcmFsIG1hcHMgd2l0aCBjYWxscyB0byBjaGVjayBmbi5cbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IFRoaXMgbWlnaHQgY3JlYXRlIG5ldyBub2RlRGVmcyAoZm9yIHBpcGVzIGFuZCBsaXRlcmFsIGFycmF5cyBhbmQgbGl0ZXJhbCBtYXBzKSFcbiAgICAgKi9cbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX3ByZXByb2Nlc3NVcGRhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVJbmRleDogZXhwcmVzc2lvbi5ub2RlSW5kZXgsXG4gICAgICAgICAgICBiaW5kaW5nSW5kZXg6IGV4cHJlc3Npb24uYmluZGluZ0luZGV4LFxuICAgICAgICAgICAgc291cmNlU3BhbjogZXhwcmVzc2lvbi5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgY29udGV4dDogZXhwcmVzc2lvbi5jb250ZXh0LFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmdCdWlsdGlucyh7XG4gICAgICAgICAgICAgICAgY3JlYXRlTGl0ZXJhbEFycmF5Q29udmVydGVyOiBmdW5jdGlvbiAoYXJnQ291bnQpIHsgcmV0dXJuIF90aGlzLl9jcmVhdGVMaXRlcmFsQXJyYXlDb252ZXJ0ZXIoZXhwcmVzc2lvbi5zb3VyY2VTcGFuLCBhcmdDb3VudCk7IH0sXG4gICAgICAgICAgICAgICAgY3JlYXRlTGl0ZXJhbE1hcENvbnZlcnRlcjogZnVuY3Rpb24gKGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jcmVhdGVMaXRlcmFsTWFwQ29udmVydGVyKGV4cHJlc3Npb24uc291cmNlU3Bhbiwga2V5cyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjcmVhdGVQaXBlQ29udmVydGVyOiBmdW5jdGlvbiAobmFtZSwgYXJnQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jcmVhdGVQaXBlQ29udmVydGVyKGV4cHJlc3Npb24sIG5hbWUsIGFyZ0NvdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBleHByZXNzaW9uLnZhbHVlKVxuICAgICAgICB9O1xuICAgIH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLl9jcmVhdGVOb2RlRXhwcmVzc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdmFyIHVwZGF0ZUJpbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIHZhciB1cGRhdGVSZW5kZXJlclN0bXRzID0gW107XG4gICAgICAgIHZhciB1cGRhdGVEaXJlY3RpdmVzU3RtdHMgPSBbXTtcbiAgICAgICAgdmFyIG5vZGVEZWZFeHBycyA9IHRoaXMubm9kZXMubWFwKGZ1bmN0aW9uIChmYWN0b3J5LCBub2RlSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGZhY3RvcnkoKSwgbm9kZURlZiA9IF9hLm5vZGVEZWYsIG5vZGVGbGFncyA9IF9hLm5vZGVGbGFncywgdXBkYXRlRGlyZWN0aXZlcyA9IF9hLnVwZGF0ZURpcmVjdGl2ZXMsIHVwZGF0ZVJlbmRlcmVyID0gX2EudXBkYXRlUmVuZGVyZXIsIHNvdXJjZVNwYW4gPSBfYS5zb3VyY2VTcGFuO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZVJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmVuZGVyZXJTdG10cy5wdXNoLmFwcGx5KHVwZGF0ZVJlbmRlcmVyU3RtdHMsIF9fc3ByZWFkKGNyZWF0ZVVwZGF0ZVN0YXRlbWVudHMobm9kZUluZGV4LCBzb3VyY2VTcGFuLCB1cGRhdGVSZW5kZXJlciwgZmFsc2UpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlRGlyZWN0aXZlcykge1xuICAgICAgICAgICAgICAgIHVwZGF0ZURpcmVjdGl2ZXNTdG10cy5wdXNoLmFwcGx5KHVwZGF0ZURpcmVjdGl2ZXNTdG10cywgX19zcHJlYWQoY3JlYXRlVXBkYXRlU3RhdGVtZW50cyhub2RlSW5kZXgsIHNvdXJjZVNwYW4sIHVwZGF0ZURpcmVjdGl2ZXMsIChub2RlRmxhZ3MgJiAoMjYyMTQ0IC8qIERvQ2hlY2sgKi8gfCA2NTUzNiAvKiBPbkluaXQgKi8pKSA+IDApKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSB1c2UgYSBjb21tYSBleHByZXNzaW9uIHRvIGNhbGwgdGhlIGxvZyBmdW5jdGlvbiBiZWZvcmVcbiAgICAgICAgICAgIC8vIHRoZSBub2RlRGVmIGZ1bmN0aW9uLCBidXQgc3RpbGwgdXNlIHRoZSByZXN1bHQgb2YgdGhlIG5vZGVEZWYgZnVuY3Rpb25cbiAgICAgICAgICAgIC8vIGFzIHRoZSB2YWx1ZS5cbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIG9ubHkgYWRkIHRoZSBsb2dnZXIgdG8gZWxlbWVudHMgLyB0ZXh0IG5vZGVzLFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgZ2VuZXJhdGUgdG9vIG11Y2ggY29kZS5cbiAgICAgICAgICAgIHZhciBsb2dXaXRoTm9kZURlZiA9IG5vZGVGbGFncyAmIDMgLyogQ2F0UmVuZGVyTm9kZSAqLyA/XG4gICAgICAgICAgICAgICAgbmV3IENvbW1hRXhwcihbTE9HX1ZBUiQxLmNhbGxGbihbXSkuY2FsbEZuKFtdKSwgbm9kZURlZl0pIDpcbiAgICAgICAgICAgICAgICBub2RlRGVmO1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5U291cmNlU3BhblRvRXhwcmVzc2lvbklmTmVlZGVkKGxvZ1dpdGhOb2RlRGVmLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHVwZGF0ZVJlbmRlcmVyU3RtdHM6IHVwZGF0ZVJlbmRlcmVyU3RtdHMsIHVwZGF0ZURpcmVjdGl2ZXNTdG10czogdXBkYXRlRGlyZWN0aXZlc1N0bXRzLCBub2RlRGVmRXhwcnM6IG5vZGVEZWZFeHBycyB9O1xuICAgICAgICBmdW5jdGlvbiBjcmVhdGVVcGRhdGVTdGF0ZW1lbnRzKG5vZGVJbmRleCwgc291cmNlU3BhbiwgZXhwcmVzc2lvbnMsIGFsbG93RW1wdHlFeHBycykge1xuICAgICAgICAgICAgdmFyIHVwZGF0ZVN0bXRzID0gW107XG4gICAgICAgICAgICB2YXIgZXhwcnMgPSBleHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZVNwYW4gPSBfYS5zb3VyY2VTcGFuLCBjb250ZXh0ID0gX2EuY29udGV4dCwgdmFsdWUgPSBfYS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0lkID0gXCJcIiArIHVwZGF0ZUJpbmRpbmdDb3VudCsrO1xuICAgICAgICAgICAgICAgIHZhciBuYW1lUmVzb2x2ZXIgPSBjb250ZXh0ID09PSBDT01QX1ZBUiA/IHNlbGYgOiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBfYiA9IGNvbnZlcnRQcm9wZXJ0eUJpbmRpbmcobmFtZVJlc29sdmVyLCBjb250ZXh0LCB2YWx1ZSwgYmluZGluZ0lkLCBCaW5kaW5nRm9ybS5HZW5lcmFsKSwgc3RtdHMgPSBfYi5zdG10cywgY3VyclZhbEV4cHIgPSBfYi5jdXJyVmFsRXhwcjtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoLmFwcGx5KHVwZGF0ZVN0bXRzLCBfX3NwcmVhZChzdG10cy5tYXAoZnVuY3Rpb24gKHN0bXQpIHsgcmV0dXJuIGFwcGx5U291cmNlU3BhblRvU3RhdGVtZW50SWZOZWVkZWQoc3RtdCwgc291cmNlU3Bhbik7IH0pKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5U291cmNlU3BhblRvRXhwcmVzc2lvbklmTmVlZGVkKGN1cnJWYWxFeHByLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25zLmxlbmd0aCB8fCBhbGxvd0VtcHR5RXhwcnMpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdG10cy5wdXNoKGFwcGx5U291cmNlU3BhblRvU3RhdGVtZW50SWZOZWVkZWQoY2FsbENoZWNrU3RtdChub2RlSW5kZXgsIGV4cHJzKS50b1N0bXQoKSwgc291cmNlU3BhbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN0bXRzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUuX2NyZWF0ZUVsZW1lbnRIYW5kbGVFdmVudEZuID0gZnVuY3Rpb24gKG5vZGVJbmRleCwgaGFuZGxlcnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGhhbmRsZUV2ZW50U3RtdHMgPSBbXTtcbiAgICAgICAgdmFyIGhhbmRsZUV2ZW50QmluZGluZ0NvdW50ID0gMDtcbiAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gX2EuY29udGV4dCwgZXZlbnRBc3QgPSBfYS5ldmVudEFzdCwgZGlyQXN0ID0gX2EuZGlyQXN0O1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdJZCA9IFwiXCIgKyBoYW5kbGVFdmVudEJpbmRpbmdDb3VudCsrO1xuICAgICAgICAgICAgdmFyIG5hbWVSZXNvbHZlciA9IGNvbnRleHQgPT09IENPTVBfVkFSID8gX3RoaXMgOiBudWxsO1xuICAgICAgICAgICAgdmFyIF9iID0gY29udmVydEFjdGlvbkJpbmRpbmcobmFtZVJlc29sdmVyLCBjb250ZXh0LCBldmVudEFzdC5oYW5kbGVyLCBiaW5kaW5nSWQpLCBzdG10cyA9IF9iLnN0bXRzLCBhbGxvd0RlZmF1bHQgPSBfYi5hbGxvd0RlZmF1bHQ7XG4gICAgICAgICAgICB2YXIgdHJ1ZVN0bXRzID0gc3RtdHM7XG4gICAgICAgICAgICBpZiAoYWxsb3dEZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgdHJ1ZVN0bXRzLnB1c2goQUxMT1dfREVGQVVMVF9WQVIuc2V0KGFsbG93RGVmYXVsdC5hbmQoQUxMT1dfREVGQVVMVF9WQVIpKS50b1N0bXQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2MgPSBlbGVtZW50RXZlbnROYW1lQW5kVGFyZ2V0KGV2ZW50QXN0LCBkaXJBc3QpLCBldmVudFRhcmdldCA9IF9jLnRhcmdldCwgZXZlbnROYW1lID0gX2MubmFtZTtcbiAgICAgICAgICAgIHZhciBmdWxsRXZlbnROYW1lID0gZWxlbWVudEV2ZW50RnVsbE5hbWUoZXZlbnRUYXJnZXQsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBoYW5kbGVFdmVudFN0bXRzLnB1c2goYXBwbHlTb3VyY2VTcGFuVG9TdGF0ZW1lbnRJZk5lZWRlZChuZXcgSWZTdG10KGxpdGVyYWwoZnVsbEV2ZW50TmFtZSkuaWRlbnRpY2FsKEVWRU5UX05BTUVfVkFSKSwgdHJ1ZVN0bXRzKSwgZXZlbnRBc3Quc291cmNlU3BhbikpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGhhbmRsZUV2ZW50Rm47XG4gICAgICAgIGlmIChoYW5kbGVFdmVudFN0bXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcmVTdG10cyA9IFtBTExPV19ERUZBVUxUX1ZBUi5zZXQobGl0ZXJhbCh0cnVlKSkudG9EZWNsU3RtdChCT09MX1RZUEUpXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb21wb25lbnQuaXNIb3N0ICYmIGZpbmRSZWFkVmFyTmFtZXMoaGFuZGxlRXZlbnRTdG10cykuaGFzKENPTVBfVkFSLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcHJlU3RtdHMucHVzaChDT01QX1ZBUi5zZXQoVklFV19WQVIucHJvcCgnY29tcG9uZW50JykpLnRvRGVjbFN0bXQodGhpcy5jb21wVHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlRXZlbnRGbiA9IGZuKFtcbiAgICAgICAgICAgICAgICBuZXcgRm5QYXJhbShWSUVXX1ZBUi5uYW1lLCBJTkZFUlJFRF9UWVBFKSxcbiAgICAgICAgICAgICAgICBuZXcgRm5QYXJhbShFVkVOVF9OQU1FX1ZBUi5uYW1lLCBJTkZFUlJFRF9UWVBFKSxcbiAgICAgICAgICAgICAgICBuZXcgRm5QYXJhbShFdmVudEhhbmRsZXJWYXJzLmV2ZW50Lm5hbWUsIElORkVSUkVEX1RZUEUpXG4gICAgICAgICAgICBdLCBfX3NwcmVhZChwcmVTdG10cywgaGFuZGxlRXZlbnRTdG10cywgW25ldyBSZXR1cm5TdGF0ZW1lbnQoQUxMT1dfREVGQVVMVF9WQVIpXSksIElORkVSUkVEX1RZUEUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlRXZlbnRGbiA9IE5VTExfRVhQUjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlRXZlbnRGbjtcbiAgICB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS52aXNpdERpcmVjdGl2ZSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHsgfTtcbiAgICBWaWV3QnVpbGRlci5wcm90b3R5cGUudmlzaXRSZWZlcmVuY2UgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RXZlbnQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgVmlld0J1aWxkZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudFByb3BlcnR5ID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkgeyB9O1xuICAgIFZpZXdCdWlsZGVyLnByb3RvdHlwZS52aXNpdEF0dHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7IH07XG4gICAgcmV0dXJuIFZpZXdCdWlsZGVyO1xufSgpKTtcbmZ1bmN0aW9uIG5lZWRzQWRkaXRpb25hbFJvb3ROb2RlKGFzdE5vZGVzKSB7XG4gICAgdmFyIGxhc3RBc3ROb2RlID0gYXN0Tm9kZXNbYXN0Tm9kZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3RBc3ROb2RlIGluc3RhbmNlb2YgRW1iZWRkZWRUZW1wbGF0ZUFzdCkge1xuICAgICAgICByZXR1cm4gbGFzdEFzdE5vZGUuaGFzVmlld0NvbnRhaW5lcjtcbiAgICB9XG4gICAgaWYgKGxhc3RBc3ROb2RlIGluc3RhbmNlb2YgRWxlbWVudEFzdCkge1xuICAgICAgICBpZiAoaXNOZ0NvbnRhaW5lcihsYXN0QXN0Tm9kZS5uYW1lKSAmJiBsYXN0QXN0Tm9kZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZWVkc0FkZGl0aW9uYWxSb290Tm9kZShsYXN0QXN0Tm9kZS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhc3RBc3ROb2RlLmhhc1ZpZXdDb250YWluZXI7XG4gICAgfVxuICAgIHJldHVybiBsYXN0QXN0Tm9kZSBpbnN0YW5jZW9mIE5nQ29udGVudEFzdDtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRCaW5kaW5nRGVmKGlucHV0QXN0LCBkaXJBc3QpIHtcbiAgICB2YXIgaW5wdXRUeXBlID0gaW5wdXRBc3QudHlwZTtcbiAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xuICAgICAgICBjYXNlIDEgLyogQXR0cmlidXRlICovOlxuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoMSAvKiBUeXBlRWxlbWVudEF0dHJpYnV0ZSAqLyksIGxpdGVyYWwoaW5wdXRBc3QubmFtZSksXG4gICAgICAgICAgICAgICAgbGl0ZXJhbChpbnB1dEFzdC5zZWN1cml0eUNvbnRleHQpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgY2FzZSAwIC8qIFByb3BlcnR5ICovOlxuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoOCAvKiBUeXBlUHJvcGVydHkgKi8pLCBsaXRlcmFsKGlucHV0QXN0Lm5hbWUpLFxuICAgICAgICAgICAgICAgIGxpdGVyYWwoaW5wdXRBc3Quc2VjdXJpdHlDb250ZXh0KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIGNhc2UgNCAvKiBBbmltYXRpb24gKi86XG4gICAgICAgICAgICB2YXIgYmluZGluZ1R5cGUgPSA4IC8qIFR5cGVQcm9wZXJ0eSAqLyB8XG4gICAgICAgICAgICAgICAgKGRpckFzdCAmJiBkaXJBc3QuZGlyZWN0aXZlLmlzQ29tcG9uZW50ID8gMzIgLyogU3ludGhldGljSG9zdFByb3BlcnR5ICovIDpcbiAgICAgICAgICAgICAgICAgICAgMTYgLyogU3ludGhldGljUHJvcGVydHkgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoYmluZGluZ1R5cGUpLCBsaXRlcmFsKCdAJyArIGlucHV0QXN0Lm5hbWUpLCBsaXRlcmFsKGlucHV0QXN0LnNlY3VyaXR5Q29udGV4dClcbiAgICAgICAgICAgIF0pO1xuICAgICAgICBjYXNlIDIgLyogQ2xhc3MgKi86XG4gICAgICAgICAgICByZXR1cm4gbGl0ZXJhbEFycihbbGl0ZXJhbCgyIC8qIFR5cGVFbGVtZW50Q2xhc3MgKi8pLCBsaXRlcmFsKGlucHV0QXN0Lm5hbWUpLCBOVUxMX0VYUFJdKTtcbiAgICAgICAgY2FzZSAzIC8qIFN0eWxlICovOlxuICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoW1xuICAgICAgICAgICAgICAgIGxpdGVyYWwoNCAvKiBUeXBlRWxlbWVudFN0eWxlICovKSwgbGl0ZXJhbChpbnB1dEFzdC5uYW1lKSwgbGl0ZXJhbChpbnB1dEFzdC51bml0KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIGRlZmF1bHQgY2FzZSBpcyBub3QgbmVlZGVkIGJ5IFR5cGVTY3JpcHQgY29tcGlsZXIsIGFzIHRoZSBzd2l0Y2ggaXMgZXhoYXVzdGl2ZS5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIgQ2xvc3VyZSBDb21waWxlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgYW5kIHJlcG9ydHMgYW4gZXJyb3IgaW4gdHlwZWQgbW9kZS5cbiAgICAgICAgICAgIC8vIFRoZSBgdGhyb3cgbmV3IEVycm9yYCBiZWxvdyB3b3JrcyBhcm91bmQgdGhlIHByb2JsZW0sIGFuZCB0aGUgdW5leHBlY3RlZDogbmV2ZXIgdmFyaWFibGVcbiAgICAgICAgICAgIC8vIG1ha2VzIHN1cmUgdHNjIHN0aWxsIGNoZWNrcyB0aGlzIGNvZGUgaXMgdW5yZWFjaGFibGUuXG4gICAgICAgICAgICB2YXIgdW5leHBlY3RlZCA9IGlucHV0VHlwZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgXCIgKyB1bmV4cGVjdGVkKTtcbiAgICB9XG59XG5mdW5jdGlvbiBmaXhlZEF0dHJzRGVmKGVsZW1lbnRBc3QpIHtcbiAgICB2YXIgbWFwUmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBlbGVtZW50QXN0LmF0dHJzLmZvckVhY2goZnVuY3Rpb24gKGF0dHJBc3QpIHsgbWFwUmVzdWx0W2F0dHJBc3QubmFtZV0gPSBhdHRyQXN0LnZhbHVlOyB9KTtcbiAgICBlbGVtZW50QXN0LmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyQXN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGRpckFzdC5kaXJlY3RpdmUuaG9zdEF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGRpckFzdC5kaXJlY3RpdmUuaG9zdEF0dHJpYnV0ZXNbbmFtZV07XG4gICAgICAgICAgICB2YXIgcHJldlZhbHVlID0gbWFwUmVzdWx0W25hbWVdO1xuICAgICAgICAgICAgbWFwUmVzdWx0W25hbWVdID0gcHJldlZhbHVlICE9IG51bGwgPyBtZXJnZUF0dHJpYnV0ZVZhbHVlKG5hbWUsIHByZXZWYWx1ZSwgdmFsdWUpIDogdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIE5vdGU6IFdlIG5lZWQgdG8gc29ydCB0byBnZXQgYSBkZWZpbmVkIG91dHB1dCBvcmRlclxuICAgIC8vIGZvciB0ZXN0cyBhbmQgZm9yIGNhY2hpbmcgZ2VuZXJhdGVkIGFydGlmYWN0cy4uLlxuICAgIHJldHVybiBsaXRlcmFsQXJyKE9iamVjdC5rZXlzKG1hcFJlc3VsdCkuc29ydCgpLm1hcChmdW5jdGlvbiAoYXR0ck5hbWUpIHsgcmV0dXJuIGxpdGVyYWxBcnIoW2xpdGVyYWwoYXR0ck5hbWUpLCBsaXRlcmFsKG1hcFJlc3VsdFthdHRyTmFtZV0pXSk7IH0pKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQXR0cmlidXRlVmFsdWUoYXR0ck5hbWUsIGF0dHJWYWx1ZTEsIGF0dHJWYWx1ZTIpIHtcbiAgICBpZiAoYXR0ck5hbWUgPT0gQ0xBU1NfQVRUUiQxIHx8IGF0dHJOYW1lID09IFNUWUxFX0FUVFIpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJWYWx1ZTEgKyBcIiBcIiArIGF0dHJWYWx1ZTI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYXR0clZhbHVlMjtcbiAgICB9XG59XG5mdW5jdGlvbiBjYWxsQ2hlY2tTdG10KG5vZGVJbmRleCwgZXhwcnMpIHtcbiAgICBpZiAoZXhwcnMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgcmV0dXJuIENIRUNLX1ZBUi5jYWxsRm4oW1ZJRVdfVkFSLCBsaXRlcmFsKG5vZGVJbmRleCksIGxpdGVyYWwoMSAvKiBEeW5hbWljICovKSwgbGl0ZXJhbEFycihleHBycyldKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBDSEVDS19WQVIuY2FsbEZuKF9fc3ByZWFkKFtWSUVXX1ZBUiwgbGl0ZXJhbChub2RlSW5kZXgpLCBsaXRlcmFsKDAgLyogSW5saW5lICovKV0sIGV4cHJzKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2FsbFVud3JhcFZhbHVlKG5vZGVJbmRleCwgYmluZGluZ0lkeCwgZXhwcikge1xuICAgIHJldHVybiBpbXBvcnRFeHByKElkZW50aWZpZXJzLnVud3JhcFZhbHVlKS5jYWxsRm4oW1xuICAgICAgICBWSUVXX1ZBUiwgbGl0ZXJhbChub2RlSW5kZXgpLCBsaXRlcmFsKGJpbmRpbmdJZHgpLCBleHByXG4gICAgXSk7XG59XG5mdW5jdGlvbiBmaW5kU3RhdGljUXVlcnlJZHMobm9kZXMsIHJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgeyByZXN1bHQgPSBuZXcgTWFwKCk7IH1cbiAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciBzdGF0aWNRdWVyeUlkcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIGR5bmFtaWNRdWVyeUlkcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIHF1ZXJ5TWF0Y2hlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50QXN0KSB7XG4gICAgICAgICAgICBmaW5kU3RhdGljUXVlcnlJZHMobm9kZS5jaGlsZHJlbiwgcmVzdWx0KTtcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGREYXRhID0gcmVzdWx0LmdldChjaGlsZCk7XG4gICAgICAgICAgICAgICAgY2hpbGREYXRhLnN0YXRpY1F1ZXJ5SWRzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5SWQpIHsgcmV0dXJuIHN0YXRpY1F1ZXJ5SWRzLmFkZChxdWVyeUlkKTsgfSk7XG4gICAgICAgICAgICAgICAgY2hpbGREYXRhLmR5bmFtaWNRdWVyeUlkcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeUlkKSB7IHJldHVybiBkeW5hbWljUXVlcnlJZHMuYWRkKHF1ZXJ5SWQpOyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcXVlcnlNYXRjaGVzID0gbm9kZS5xdWVyeU1hdGNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVtYmVkZGVkVGVtcGxhdGVBc3QpIHtcbiAgICAgICAgICAgIGZpbmRTdGF0aWNRdWVyeUlkcyhub2RlLmNoaWxkcmVuLCByZXN1bHQpO1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZERhdGEgPSByZXN1bHQuZ2V0KGNoaWxkKTtcbiAgICAgICAgICAgICAgICBjaGlsZERhdGEuc3RhdGljUXVlcnlJZHMuZm9yRWFjaChmdW5jdGlvbiAocXVlcnlJZCkgeyByZXR1cm4gZHluYW1pY1F1ZXJ5SWRzLmFkZChxdWVyeUlkKTsgfSk7XG4gICAgICAgICAgICAgICAgY2hpbGREYXRhLmR5bmFtaWNRdWVyeUlkcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeUlkKSB7IHJldHVybiBkeW5hbWljUXVlcnlJZHMuYWRkKHF1ZXJ5SWQpOyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcXVlcnlNYXRjaGVzID0gbm9kZS5xdWVyeU1hdGNoZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5TWF0Y2hlcykge1xuICAgICAgICAgICAgcXVlcnlNYXRjaGVzLmZvckVhY2goZnVuY3Rpb24gKG1hdGNoKSB7IHJldHVybiBzdGF0aWNRdWVyeUlkcy5hZGQobWF0Y2gucXVlcnlJZCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGR5bmFtaWNRdWVyeUlkcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeUlkKSB7IHJldHVybiBzdGF0aWNRdWVyeUlkcy5kZWxldGUocXVlcnlJZCk7IH0pO1xuICAgICAgICByZXN1bHQuc2V0KG5vZGUsIHsgc3RhdGljUXVlcnlJZHM6IHN0YXRpY1F1ZXJ5SWRzLCBkeW5hbWljUXVlcnlJZHM6IGR5bmFtaWNRdWVyeUlkcyB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gc3RhdGljVmlld1F1ZXJ5SWRzKG5vZGVTdGF0aWNRdWVyeUlkcykge1xuICAgIHZhciBzdGF0aWNRdWVyeUlkcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZHluYW1pY1F1ZXJ5SWRzID0gbmV3IFNldCgpO1xuICAgIEFycmF5LmZyb20obm9kZVN0YXRpY1F1ZXJ5SWRzLnZhbHVlcygpKS5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICBlbnRyeS5zdGF0aWNRdWVyeUlkcy5mb3JFYWNoKGZ1bmN0aW9uIChxdWVyeUlkKSB7IHJldHVybiBzdGF0aWNRdWVyeUlkcy5hZGQocXVlcnlJZCk7IH0pO1xuICAgICAgICBlbnRyeS5keW5hbWljUXVlcnlJZHMuZm9yRWFjaChmdW5jdGlvbiAocXVlcnlJZCkgeyByZXR1cm4gZHluYW1pY1F1ZXJ5SWRzLmFkZChxdWVyeUlkKTsgfSk7XG4gICAgfSk7XG4gICAgZHluYW1pY1F1ZXJ5SWRzLmZvckVhY2goZnVuY3Rpb24gKHF1ZXJ5SWQpIHsgcmV0dXJuIHN0YXRpY1F1ZXJ5SWRzLmRlbGV0ZShxdWVyeUlkKTsgfSk7XG4gICAgcmV0dXJuIHsgc3RhdGljUXVlcnlJZHM6IHN0YXRpY1F1ZXJ5SWRzLCBkeW5hbWljUXVlcnlJZHM6IGR5bmFtaWNRdWVyeUlkcyB9O1xufVxuZnVuY3Rpb24gZWxlbWVudEV2ZW50TmFtZUFuZFRhcmdldChldmVudEFzdCwgZGlyQXN0KSB7XG4gICAgaWYgKGV2ZW50QXN0LmlzQW5pbWF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBcIkBcIiArIGV2ZW50QXN0Lm5hbWUgKyBcIi5cIiArIGV2ZW50QXN0LnBoYXNlLFxuICAgICAgICAgICAgdGFyZ2V0OiBkaXJBc3QgJiYgZGlyQXN0LmRpcmVjdGl2ZS5pc0NvbXBvbmVudCA/ICdjb21wb25lbnQnIDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50QXN0O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNhbGNTdGF0aWNEeW5hbWljUXVlcnlGbGFncyhxdWVyeUlkcywgcXVlcnlJZCwgcXVlcnkpIHtcbiAgICB2YXIgZmxhZ3MgPSAwIC8qIE5vbmUgKi87XG4gICAgLy8gTm90ZTogV2Ugb25seSBtYWtlIHF1ZXJpZXMgc3RhdGljIHRoYXQgcXVlcnkgZm9yIGEgc2luZ2xlIGl0ZW0uXG4gICAgLy8gVGhpcyBpcyBiZWNhdXNlIG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCB2aWV3IGNvbXBpbGVyLi4uXG4gICAgaWYgKHF1ZXJ5LmZpcnN0ICYmIHNob3VsZFJlc29sdmVBc1N0YXRpY1F1ZXJ5KHF1ZXJ5SWRzLCBxdWVyeUlkLCBxdWVyeSkpIHtcbiAgICAgICAgZmxhZ3MgfD0gMjY4NDM1NDU2IC8qIFN0YXRpY1F1ZXJ5ICovO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZmxhZ3MgfD0gNTM2ODcwOTEyIC8qIER5bmFtaWNRdWVyeSAqLztcbiAgICB9XG4gICAgcmV0dXJuIGZsYWdzO1xufVxuZnVuY3Rpb24gc2hvdWxkUmVzb2x2ZUFzU3RhdGljUXVlcnkocXVlcnlJZHMsIHF1ZXJ5SWQsIHF1ZXJ5KSB7XG4gICAgLy8gSWYgcXVlcnkuc3RhdGljIGhhcyBiZWVuIHNldCBieSB0aGUgdXNlciwgdXNlIHRoYXQgdmFsdWUgdG8gZGV0ZXJtaW5lIHdoZXRoZXJcbiAgICAvLyB0aGUgcXVlcnkgaXMgc3RhdGljLiBJZiBub25lIGhhcyBiZWVuIHNldCwgc29ydCB0aGUgcXVlcnkgaW50byBzdGF0aWMvZHluYW1pY1xuICAgIC8vIGJhc2VkIG9uIHF1ZXJ5IHJlc3VsdHMgKGkuZS4gZHluYW1pYyBpZiBDRCBuZWVkcyB0byBydW4gdG8gZ2V0IGFsbCByZXN1bHRzKS5cbiAgICByZXR1cm4gcXVlcnkuc3RhdGljIHx8XG4gICAgICAgIHF1ZXJ5LnN0YXRpYyA9PSBudWxsICYmXG4gICAgICAgICAgICAocXVlcnlJZHMuc3RhdGljUXVlcnlJZHMuaGFzKHF1ZXJ5SWQpIHx8ICFxdWVyeUlkcy5keW5hbWljUXVlcnlJZHMuaGFzKHF1ZXJ5SWQpKTtcbn1cbmZ1bmN0aW9uIGVsZW1lbnRFdmVudEZ1bGxOYW1lKHRhcmdldCwgbmFtZSkge1xuICAgIHJldHVybiB0YXJnZXQgPyB0YXJnZXQgKyBcIjpcIiArIG5hbWUgOiBuYW1lO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEEgY29udGFpbmVyIGZvciBtZXNzYWdlIGV4dHJhY3RlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMuXG4gKi9cbnZhciBNZXNzYWdlQnVuZGxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lc3NhZ2VCdW5kbGUoX2h0bWxQYXJzZXIsIF9pbXBsaWNpdFRhZ3MsIF9pbXBsaWNpdEF0dHJzLCBfbG9jYWxlKSB7XG4gICAgICAgIGlmIChfbG9jYWxlID09PSB2b2lkIDApIHsgX2xvY2FsZSA9IG51bGw7IH1cbiAgICAgICAgdGhpcy5faHRtbFBhcnNlciA9IF9odG1sUGFyc2VyO1xuICAgICAgICB0aGlzLl9pbXBsaWNpdFRhZ3MgPSBfaW1wbGljaXRUYWdzO1xuICAgICAgICB0aGlzLl9pbXBsaWNpdEF0dHJzID0gX2ltcGxpY2l0QXR0cnM7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VzID0gW107XG4gICAgfVxuICAgIE1lc3NhZ2VCdW5kbGUucHJvdG90eXBlLnVwZGF0ZUZyb21UZW1wbGF0ZSA9IGZ1bmN0aW9uIChodG1sLCB1cmwsIGludGVycG9sYXRpb25Db25maWcpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgaHRtbFBhcnNlclJlc3VsdCA9IHRoaXMuX2h0bWxQYXJzZXIucGFyc2UoaHRtbCwgdXJsLCB7IHRva2VuaXplRXhwYW5zaW9uRm9ybXM6IHRydWUsIGludGVycG9sYXRpb25Db25maWc6IGludGVycG9sYXRpb25Db25maWcgfSk7XG4gICAgICAgIGlmIChodG1sUGFyc2VyUmVzdWx0LmVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sUGFyc2VyUmVzdWx0LmVycm9ycztcbiAgICAgICAgfVxuICAgICAgICB2YXIgaTE4blBhcnNlclJlc3VsdCA9IGV4dHJhY3RNZXNzYWdlcyhodG1sUGFyc2VyUmVzdWx0LnJvb3ROb2RlcywgaW50ZXJwb2xhdGlvbkNvbmZpZywgdGhpcy5faW1wbGljaXRUYWdzLCB0aGlzLl9pbXBsaWNpdEF0dHJzKTtcbiAgICAgICAgaWYgKGkxOG5QYXJzZXJSZXN1bHQuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGkxOG5QYXJzZXJSZXN1bHQuZXJyb3JzO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuX21lc3NhZ2VzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZChpMThuUGFyc2VyUmVzdWx0Lm1lc3NhZ2VzKSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8vIFJldHVybiB0aGUgbWVzc2FnZSBpbiB0aGUgaW50ZXJuYWwgZm9ybWF0XG4gICAgLy8gVGhlIHB1YmxpYyAoc2VyaWFsaXplZCkgZm9ybWF0IG1pZ2h0IGJlIGRpZmZlcmVudCwgc2VlIHRoZSBgd3JpdGVgIG1ldGhvZC5cbiAgICBNZXNzYWdlQnVuZGxlLnByb3RvdHlwZS5nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2VzOyB9O1xuICAgIE1lc3NhZ2VCdW5kbGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKHNlcmlhbGl6ZXIsIGZpbHRlclNvdXJjZXMpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2VzID0ge307XG4gICAgICAgIHZhciBtYXBwZXJWaXNpdG9yID0gbmV3IE1hcFBsYWNlaG9sZGVyTmFtZXMoKTtcbiAgICAgICAgLy8gRGVkdXBsaWNhdGUgbWVzc2FnZXMgYmFzZWQgb24gdGhlaXIgSURcbiAgICAgICAgdGhpcy5fbWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgdmFyIGlkID0gc2VyaWFsaXplci5kaWdlc3QobWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VzLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXSA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAoX2EgPSBtZXNzYWdlc1tpZF0uc291cmNlcykucHVzaC5hcHBseShfYSwgX19zcHJlYWQobWVzc2FnZS5zb3VyY2VzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUcmFuc2Zvcm0gcGxhY2Vob2xkZXIgbmFtZXMgdXNpbmcgdGhlIHNlcmlhbGl6ZXIgbWFwcGluZ1xuICAgICAgICB2YXIgbXNnTGlzdCA9IE9iamVjdC5rZXlzKG1lc3NhZ2VzKS5tYXAoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICB2YXIgbWFwcGVyID0gc2VyaWFsaXplci5jcmVhdGVOYW1lTWFwcGVyKG1lc3NhZ2VzW2lkXSk7XG4gICAgICAgICAgICB2YXIgc3JjID0gbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgdmFyIG5vZGVzID0gbWFwcGVyID8gbWFwcGVyVmlzaXRvci5jb252ZXJ0KHNyYy5ub2RlcywgbWFwcGVyKSA6IHNyYy5ub2RlcztcbiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZE1lc3NhZ2UgPSBuZXcgTWVzc2FnZShub2Rlcywge30sIHt9LCBzcmMubWVhbmluZywgc3JjLmRlc2NyaXB0aW9uLCBpZCk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZE1lc3NhZ2Uuc291cmNlcyA9IHNyYy5zb3VyY2VzO1xuICAgICAgICAgICAgaWYgKGZpbHRlclNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZE1lc3NhZ2Uuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHsgcmV0dXJuIHNvdXJjZS5maWxlUGF0aCA9IGZpbHRlclNvdXJjZXMoc291cmNlLmZpbGVQYXRoKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRNZXNzYWdlO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZXIud3JpdGUobXNnTGlzdCwgdGhpcy5fbG9jYWxlKTtcbiAgICB9O1xuICAgIHJldHVybiBNZXNzYWdlQnVuZGxlO1xufSgpKTtcbi8vIFRyYW5zZm9ybSBhbiBpMThuIEFTVCBieSByZW5hbWluZyB0aGUgcGxhY2Vob2xkZXIgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gbWFwcGVyXG52YXIgTWFwUGxhY2Vob2xkZXJOYW1lcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWFwUGxhY2Vob2xkZXJOYW1lcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNYXBQbGFjZWhvbGRlck5hbWVzKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIE1hcFBsYWNlaG9sZGVyTmFtZXMucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAobm9kZXMsIG1hcHBlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbWFwcGVyID8gbm9kZXMubWFwKGZ1bmN0aW9uIChuKSB7IHJldHVybiBuLnZpc2l0KF90aGlzLCBtYXBwZXIpOyB9KSA6IG5vZGVzO1xuICAgIH07XG4gICAgTWFwUGxhY2Vob2xkZXJOYW1lcy5wcm90b3R5cGUudmlzaXRUYWdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgbWFwcGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBzdGFydE5hbWUgPSBtYXBwZXIudG9QdWJsaWNOYW1lKHBoLnN0YXJ0TmFtZSk7XG4gICAgICAgIHZhciBjbG9zZU5hbWUgPSBwaC5jbG9zZU5hbWUgPyBtYXBwZXIudG9QdWJsaWNOYW1lKHBoLmNsb3NlTmFtZSkgOiBwaC5jbG9zZU5hbWU7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHBoLmNoaWxkcmVuLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gbi52aXNpdChfdGhpcywgbWFwcGVyKTsgfSk7XG4gICAgICAgIHJldHVybiBuZXcgVGFnUGxhY2Vob2xkZXIocGgudGFnLCBwaC5hdHRycywgc3RhcnROYW1lLCBjbG9zZU5hbWUsIGNoaWxkcmVuLCBwaC5pc1ZvaWQsIHBoLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgTWFwUGxhY2Vob2xkZXJOYW1lcy5wcm90b3R5cGUudmlzaXRQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgbWFwcGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXIocGgudmFsdWUsIG1hcHBlci50b1B1YmxpY05hbWUocGgubmFtZSksIHBoLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgTWFwUGxhY2Vob2xkZXJOYW1lcy5wcm90b3R5cGUudmlzaXRJY3VQbGFjZWhvbGRlciA9IGZ1bmN0aW9uIChwaCwgbWFwcGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgSWN1UGxhY2Vob2xkZXIocGgudmFsdWUsIG1hcHBlci50b1B1YmxpY05hbWUocGgubmFtZSksIHBoLnNvdXJjZVNwYW4pO1xuICAgIH07XG4gICAgcmV0dXJuIE1hcFBsYWNlaG9sZGVyTmFtZXM7XG59KENsb25lVmlzaXRvcikpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgR2VuZXJhdGVkRmlsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBHZW5lcmF0ZWRGaWxlKHNyY0ZpbGVVcmwsIGdlbkZpbGVVcmwsIHNvdXJjZU9yU3RtdHMpIHtcbiAgICAgICAgdGhpcy5zcmNGaWxlVXJsID0gc3JjRmlsZVVybDtcbiAgICAgICAgdGhpcy5nZW5GaWxlVXJsID0gZ2VuRmlsZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VPclN0bXRzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2VPclN0bXRzO1xuICAgICAgICAgICAgdGhpcy5zdG10cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnN0bXRzID0gc291cmNlT3JTdG10cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBHZW5lcmF0ZWRGaWxlLnByb3RvdHlwZS5pc0VxdWl2YWxlbnQgPSBmdW5jdGlvbiAob3RoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2VuRmlsZVVybCAhPT0gb3RoZXIuZ2VuRmlsZVVybCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlID09PSBvdGhlci5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyLnN0bXRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiB0aGUgY29uc3RydWN0b3IgZ3VhcmFudGVlcyB0aGF0IGlmIHRoaXMuc291cmNlIGlzIG5vdCBmaWxsZWQsXG4gICAgICAgIC8vIHRoZW4gdGhpcy5zdG10cyBpcy5cbiAgICAgICAgcmV0dXJuIGFyZUFsbEVxdWl2YWxlbnQodGhpcy5zdG10cywgb3RoZXIuc3RtdHMpO1xuICAgIH07XG4gICAgcmV0dXJuIEdlbmVyYXRlZEZpbGU7XG59KCkpO1xuZnVuY3Rpb24gdG9UeXBlU2NyaXB0KGZpbGUsIHByZWFtYmxlKSB7XG4gICAgaWYgKHByZWFtYmxlID09PSB2b2lkIDApIHsgcHJlYW1ibGUgPSAnJzsgfVxuICAgIGlmICghZmlsZS5zdG10cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlOiBObyBzdG10cyBwcmVzZW50IG9uIEdlbmVyYXRlZEZpbGUgXCIgKyBmaWxlLmdlbkZpbGVVcmwpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFR5cGVTY3JpcHRFbWl0dGVyKCkuZW1pdFN0YXRlbWVudHMoZmlsZS5nZW5GaWxlVXJsLCBmaWxlLnN0bXRzLCBwcmVhbWJsZSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGxpc3RMYXp5Um91dGVzKG1vZHVsZU1ldGEsIHJlZmxlY3Rvcikge1xuICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgIHZhciBhbGxMYXp5Um91dGVzID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2MgPSBfX3ZhbHVlcyhtb2R1bGVNZXRhLnRyYW5zaXRpdmVNb2R1bGUucHJvdmlkZXJzKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIF9lID0gX2QudmFsdWUsIHByb3ZpZGVyID0gX2UucHJvdmlkZXIsIG1vZHVsZSA9IF9lLm1vZHVsZTtcbiAgICAgICAgICAgIGlmICh0b2tlblJlZmVyZW5jZShwcm92aWRlci50b2tlbikgPT09IHJlZmxlY3Rvci5ST1VURVMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbG9hZENoaWxkcmVuID0gX2NvbGxlY3RMb2FkQ2hpbGRyZW4ocHJvdmlkZXIudXNlVmFsdWUpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvYWRDaGlsZHJlbl8xID0gX192YWx1ZXMobG9hZENoaWxkcmVuKSwgbG9hZENoaWxkcmVuXzFfMSA9IGxvYWRDaGlsZHJlbl8xLm5leHQoKTsgIWxvYWRDaGlsZHJlbl8xXzEuZG9uZTsgbG9hZENoaWxkcmVuXzFfMSA9IGxvYWRDaGlsZHJlbl8xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdXRlID0gbG9hZENoaWxkcmVuXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbExhenlSb3V0ZXMucHVzaChwYXJzZUxhenlSb3V0ZShyb3V0ZSwgcmVmbGVjdG9yLCBtb2R1bGUucmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkQ2hpbGRyZW5fMV8xICYmICFsb2FkQ2hpbGRyZW5fMV8xLmRvbmUgJiYgKF9iID0gbG9hZENoaWxkcmVuXzEucmV0dXJuKSkgX2IuY2FsbChsb2FkQ2hpbGRyZW5fMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbExhenlSb3V0ZXM7XG59XG5mdW5jdGlvbiBfY29sbGVjdExvYWRDaGlsZHJlbihyb3V0ZXMsIHRhcmdldCkge1xuICAgIHZhciBlXzMsIF9hO1xuICAgIGlmICh0YXJnZXQgPT09IHZvaWQgMCkgeyB0YXJnZXQgPSBbXTsgfVxuICAgIGlmICh0eXBlb2Ygcm91dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICB0YXJnZXQucHVzaChyb3V0ZXMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJvdXRlcykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIHJvdXRlc18xID0gX192YWx1ZXMocm91dGVzKSwgcm91dGVzXzFfMSA9IHJvdXRlc18xLm5leHQoKTsgIXJvdXRlc18xXzEuZG9uZTsgcm91dGVzXzFfMSA9IHJvdXRlc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciByb3V0ZSA9IHJvdXRlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgX2NvbGxlY3RMb2FkQ2hpbGRyZW4ocm91dGUsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyb3V0ZXNfMV8xICYmICFyb3V0ZXNfMV8xLmRvbmUgJiYgKF9hID0gcm91dGVzXzEucmV0dXJuKSkgX2EuY2FsbChyb3V0ZXNfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAocm91dGVzLmxvYWRDaGlsZHJlbikge1xuICAgICAgICBfY29sbGVjdExvYWRDaGlsZHJlbihyb3V0ZXMubG9hZENoaWxkcmVuLCB0YXJnZXQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChyb3V0ZXMuY2hpbGRyZW4pIHtcbiAgICAgICAgX2NvbGxlY3RMb2FkQ2hpbGRyZW4ocm91dGVzLmNoaWxkcmVuLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gcGFyc2VMYXp5Um91dGUocm91dGUsIHJlZmxlY3RvciwgbW9kdWxlKSB7XG4gICAgdmFyIF9hID0gX19yZWFkKHJvdXRlLnNwbGl0KCcjJyksIDIpLCByb3V0ZVBhdGggPSBfYVswXSwgcm91dGVOYW1lID0gX2FbMV07XG4gICAgdmFyIHJlZmVyZW5jZWRNb2R1bGUgPSByZWZsZWN0b3IucmVzb2x2ZUV4dGVybmFsUmVmZXJlbmNlKHtcbiAgICAgICAgbW9kdWxlTmFtZTogcm91dGVQYXRoLFxuICAgICAgICBuYW1lOiByb3V0ZU5hbWUsXG4gICAgfSwgbW9kdWxlID8gbW9kdWxlLmZpbGVQYXRoIDogdW5kZWZpbmVkKTtcbiAgICByZXR1cm4geyByb3V0ZTogcm91dGUsIG1vZHVsZTogbW9kdWxlIHx8IHJlZmVyZW5jZWRNb2R1bGUsIHJlZmVyZW5jZWRNb2R1bGU6IHJlZmVyZW5jZWRNb2R1bGUgfTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFRTID0gL14oPyEuKlxcLmRcXC50cyQpLipcXC50cyQvO1xudmFyIFJlc29sdmVkU3RhdGljU3ltYm9sID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlc29sdmVkU3RhdGljU3ltYm9sKHN5bWJvbCwgbWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIFJlc29sdmVkU3RhdGljU3ltYm9sO1xufSgpKTtcbnZhciBTVVBQT1JURURfU0NIRU1BX1ZFUlNJT04gPSA0O1xuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIG1ldGFkYXRhIHBlciBzeW1ib2wsXG4gKiBhbmQgbm9ybWFsaXppbmcgcmVmZXJlbmNlcyBiZXR3ZWVuIHN5bWJvbHMuXG4gKlxuICogSW50ZXJuYWxseSwgaXQgb25seSB1c2VzIHN5bWJvbHMgd2l0aG91dCBtZW1iZXJzLFxuICogYW5kIGRlZHVjZXMgdGhlIHZhbHVlcyBmb3Igc3ltYm9scyB3aXRoIG1lbWJlcnMgYmFzZWRcbiAqIG9uIHRoZXNlIHN5bWJvbHMuXG4gKi9cbnZhciBTdGF0aWNTeW1ib2xSZXNvbHZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdGF0aWNTeW1ib2xSZXNvbHZlcihob3N0LCBzdGF0aWNTeW1ib2xDYWNoZSwgc3VtbWFyeVJlc29sdmVyLCBlcnJvclJlY29yZGVyKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXMuc3RhdGljU3ltYm9sQ2FjaGUgPSBzdGF0aWNTeW1ib2xDYWNoZTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5UmVzb2x2ZXIgPSBzdW1tYXJ5UmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlciA9IGVycm9yUmVjb3JkZXI7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gTm90ZTogdGhpcyB3aWxsIG9ubHkgY29udGFpbiBTdGF0aWNTeW1ib2xzIHdpdGhvdXQgbWVtYmVycyFcbiAgICAgICAgdGhpcy5yZXNvbHZlZFN5bWJvbHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRGaWxlUGF0aHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIC8vIE5vdGU6IHRoaXMgd2lsbCBvbmx5IGNvbnRhaW4gU3RhdGljU3ltYm9scyB3aXRob3V0IG1lbWJlcnMhXG4gICAgICAgIHRoaXMuaW1wb3J0QXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc3ltYm9sUmVzb3VyY2VQYXRocyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zeW1ib2xGcm9tRmlsZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5rbm93bkZpbGVOYW1lVG9Nb2R1bGVOYW1lcyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLnJlc29sdmVTeW1ib2wgPSBmdW5jdGlvbiAoc3RhdGljU3ltYm9sKSB7XG4gICAgICAgIGlmIChzdGF0aWNTeW1ib2wubWVtYmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVN5bWJvbE1lbWJlcnMoc3RhdGljU3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBhbHdheXMgYXNrIGZvciBhIHN1bW1hcnkgZmlyc3QsXG4gICAgICAgIC8vIGFzIHdlIG1pZ2h0IGhhdmUgcmVhZCBzaGFsbG93IG1ldGFkYXRhIHZpYSBhIC5kLnRzIGZpbGVcbiAgICAgICAgLy8gZm9yIHRoZSBzeW1ib2wuXG4gICAgICAgIHZhciByZXN1bHRGcm9tU3VtbWFyeSA9IHRoaXMuX3Jlc29sdmVTeW1ib2xGcm9tU3VtbWFyeShzdGF0aWNTeW1ib2wpO1xuICAgICAgICBpZiAocmVzdWx0RnJvbVN1bW1hcnkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRGcm9tU3VtbWFyeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0RnJvbUNhY2hlID0gdGhpcy5yZXNvbHZlZFN5bWJvbHMuZ2V0KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgIGlmIChyZXN1bHRGcm9tQ2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRGcm9tQ2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogU29tZSB1c2VycyB1c2UgbGlicmFyaWVzIHRoYXQgd2VyZSBub3QgY29tcGlsZWQgd2l0aCBuZ2MsIGkuZS4gdGhleSBkb24ndFxuICAgICAgICAvLyBoYXZlIHN1bW1hcmllcywgb25seSAuZC50cyBmaWxlcy4gU28gd2UgYWx3YXlzIG5lZWQgdG8gY2hlY2sgYm90aCwgdGhlIHN1bW1hcnlcbiAgICAgICAgLy8gYW5kIG1ldGFkYXRhLlxuICAgICAgICB0aGlzLl9jcmVhdGVTeW1ib2xzT2Yoc3RhdGljU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRTeW1ib2xzLmdldChzdGF0aWNTeW1ib2wpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogZ2V0SW1wb3J0QXMgcHJvZHVjZXMgYSBzeW1ib2wgdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBvcnQgdGhlIGdpdmVuIHN5bWJvbC5cbiAgICAgKiBUaGUgaW1wb3J0IG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBzeW1ib2wgaWYgdGhlIHN5bWJvbCBpcyBleHBvcnRlZCBmcm9tXG4gICAgICogYSBsaWJyYXJ5IHdpdGggYSBzdW1tYXJ5OyBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8gaW1wb3J0IHRoZSBzeW1ib2wgZnJvbSB0aGVcbiAgICAgKiBuZ2ZhY3RvcnkgcmUtZXhwb3J0IGluc3RlYWQgb2YgZGlyZWN0bHkgdG8gYXZvaWQgaW50cm9kdWNpbmcgYSBkaXJlY3QgZGVwZW5kZW5jeVxuICAgICAqIG9uIGFuIG90aGVyd2lzZSBpbmRpcmVjdCBkZXBlbmRlbmN5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXRpY1N5bWJvbCB0aGUgc3ltYm9sIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIGltcG9ydCBzeW1ib2xcbiAgICAgKi9cbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuZ2V0SW1wb3J0QXMgPSBmdW5jdGlvbiAoc3RhdGljU3ltYm9sLCB1c2VTdW1tYXJpZXMpIHtcbiAgICAgICAgaWYgKHVzZVN1bW1hcmllcyA9PT0gdm9pZCAwKSB7IHVzZVN1bW1hcmllcyA9IHRydWU7IH1cbiAgICAgICAgaWYgKHN0YXRpY1N5bWJvbC5tZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJhc2VTeW1ib2wgPSB0aGlzLmdldFN0YXRpY1N5bWJvbChzdGF0aWNTeW1ib2wuZmlsZVBhdGgsIHN0YXRpY1N5bWJvbC5uYW1lKTtcbiAgICAgICAgICAgIHZhciBiYXNlSW1wb3J0QXMgPSB0aGlzLmdldEltcG9ydEFzKGJhc2VTeW1ib2wsIHVzZVN1bW1hcmllcyk7XG4gICAgICAgICAgICByZXR1cm4gYmFzZUltcG9ydEFzID9cbiAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRpY1N5bWJvbChiYXNlSW1wb3J0QXMuZmlsZVBhdGgsIGJhc2VJbXBvcnRBcy5uYW1lLCBzdGF0aWNTeW1ib2wubWVtYmVycykgOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN1bW1hcml6ZWRGaWxlTmFtZSA9IHN0cmlwU3VtbWFyeUZvckppdEZpbGVTdWZmaXgoc3RhdGljU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgaWYgKHN1bW1hcml6ZWRGaWxlTmFtZSAhPT0gc3RhdGljU3ltYm9sLmZpbGVQYXRoKSB7XG4gICAgICAgICAgICB2YXIgc3VtbWFyaXplZE5hbWUgPSBzdHJpcFN1bW1hcnlGb3JKaXROYW1lU3VmZml4KHN0YXRpY1N5bWJvbC5uYW1lKTtcbiAgICAgICAgICAgIHZhciBiYXNlU3ltYm9sID0gdGhpcy5nZXRTdGF0aWNTeW1ib2woc3VtbWFyaXplZEZpbGVOYW1lLCBzdW1tYXJpemVkTmFtZSwgc3RhdGljU3ltYm9sLm1lbWJlcnMpO1xuICAgICAgICAgICAgdmFyIGJhc2VJbXBvcnRBcyA9IHRoaXMuZ2V0SW1wb3J0QXMoYmFzZVN5bWJvbCwgdXNlU3VtbWFyaWVzKTtcbiAgICAgICAgICAgIHJldHVybiBiYXNlSW1wb3J0QXMgP1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljU3ltYm9sKHN1bW1hcnlGb3JKaXRGaWxlTmFtZShiYXNlSW1wb3J0QXMuZmlsZVBhdGgpLCBzdW1tYXJ5Rm9ySml0TmFtZShiYXNlSW1wb3J0QXMubmFtZSksIGJhc2VTeW1ib2wubWVtYmVycykgOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh1c2VTdW1tYXJpZXMgJiYgdGhpcy5zdW1tYXJ5UmVzb2x2ZXIuZ2V0SW1wb3J0QXMoc3RhdGljU3ltYm9sKSkgfHwgbnVsbDtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuaW1wb3J0QXMuZ2V0KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGdldFJlc291cmNlUGF0aCBwcm9kdWNlcyB0aGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIHN5bWJvbCBhbmQgc2hvdWxkXG4gICAgICogYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHJlc291cmNlIHJlZmVyZW5jZXMgcmVjb3JkZWQgaW5cbiAgICAgKiBzeW1ib2wgbWV0YWRhdGEuXG4gICAgICovXG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldFJlc291cmNlUGF0aCA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sUmVzb3VyY2VQYXRocy5nZXQoc3RhdGljU3ltYm9sKSB8fCBzdGF0aWNTeW1ib2wuZmlsZVBhdGg7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBnZXRUeXBlQXJpdHkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIHRoZSBnaXZlbiBzeW1ib2xcbiAgICAgKiBoYXMuIElmIHRoZSBzeW1ib2wgaXMgbm90IGEgdHlwZSB0aGUgcmVzdWx0IGlzIG51bGwuXG4gICAgICovXG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldFR5cGVBcml0eSA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgLy8gSWYgdGhlIGZpbGUgaXMgYSBmYWN0b3J5L25nc3VtbWFyeSBmaWxlLCBkb24ndCByZXNvbHZlIHRoZSBzeW1ib2wgYXMgZG9pbmcgc28gd291bGRcbiAgICAgICAgLy8gY2F1c2UgdGhlIG1ldGFkYXRhIGZvciBhbiBmYWN0b3J5L25nc3VtbWFyeSBmaWxlIHRvIGJlIGxvYWRlZCB3aGljaCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICAvLyBBbGwgcmVmZXJlbmNlcyB0byBnZW5lcmF0ZWQgY2xhc3NlcyBtdXN0IGluY2x1ZGUgdGhlIGNvcnJlY3QgYXJpdHkgd2hlbmV2ZXJcbiAgICAgICAgLy8gZ2VuZXJhdGluZyBjb2RlLlxuICAgICAgICBpZiAoaXNHZW5lcmF0ZWRGaWxlKHN0YXRpY1N5bWJvbC5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXNvbHZlZFN5bWJvbCA9IHVud3JhcFJlc29sdmVkTWV0YWRhdGEodGhpcy5yZXNvbHZlU3ltYm9sKHN0YXRpY1N5bWJvbCkpO1xuICAgICAgICB3aGlsZSAocmVzb2x2ZWRTeW1ib2wgJiYgcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIHJlc29sdmVkU3ltYm9sID0gdW53cmFwUmVzb2x2ZWRNZXRhZGF0YSh0aGlzLnJlc29sdmVTeW1ib2wocmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHJlc29sdmVkU3ltYm9sICYmIHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhICYmIHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhLmFyaXR5KSB8fCBudWxsO1xuICAgIH07XG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldEtub3duTW9kdWxlTmFtZSA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rbm93bkZpbGVOYW1lVG9Nb2R1bGVOYW1lcy5nZXQoZmlsZVBhdGgpIHx8IG51bGw7XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUucmVjb3JkSW1wb3J0QXMgPSBmdW5jdGlvbiAoc291cmNlU3ltYm9sLCB0YXJnZXRTeW1ib2wpIHtcbiAgICAgICAgc291cmNlU3ltYm9sLmFzc2VydE5vTWVtYmVycygpO1xuICAgICAgICB0YXJnZXRTeW1ib2wuYXNzZXJ0Tm9NZW1iZXJzKCk7XG4gICAgICAgIHRoaXMuaW1wb3J0QXMuc2V0KHNvdXJjZVN5bWJvbCwgdGFyZ2V0U3ltYm9sKTtcbiAgICB9O1xuICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5yZWNvcmRNb2R1bGVOYW1lRm9yRmlsZU5hbWUgPSBmdW5jdGlvbiAoZmlsZU5hbWUsIG1vZHVsZU5hbWUpIHtcbiAgICAgICAgdGhpcy5rbm93bkZpbGVOYW1lVG9Nb2R1bGVOYW1lcy5zZXQoZmlsZU5hbWUsIG1vZHVsZU5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW52YWxpZGF0ZSBhbGwgaW5mb3JtYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBnaXZlbiBmaWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlIHRvIGludmFsaWRhdGVcbiAgICAgKi9cbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuaW52YWxpZGF0ZUZpbGUgPSBmdW5jdGlvbiAoZmlsZU5hbWUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZS5kZWxldGUoZmlsZU5hbWUpO1xuICAgICAgICB0aGlzLnJlc29sdmVkRmlsZVBhdGhzLmRlbGV0ZShmaWxlTmFtZSk7XG4gICAgICAgIHZhciBzeW1ib2xzID0gdGhpcy5zeW1ib2xGcm9tRmlsZS5nZXQoZmlsZU5hbWUpO1xuICAgICAgICBpZiAoc3ltYm9scykge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xGcm9tRmlsZS5kZWxldGUoZmlsZU5hbWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBzeW1ib2xzXzEgPSBfX3ZhbHVlcyhzeW1ib2xzKSwgc3ltYm9sc18xXzEgPSBzeW1ib2xzXzEubmV4dCgpOyAhc3ltYm9sc18xXzEuZG9uZTsgc3ltYm9sc18xXzEgPSBzeW1ib2xzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2wgPSBzeW1ib2xzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZFN5bWJvbHMuZGVsZXRlKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wb3J0QXMuZGVsZXRlKHN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sUmVzb3VyY2VQYXRocy5kZWxldGUoc3ltYm9sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbHNfMV8xICYmICFzeW1ib2xzXzFfMS5kb25lICYmIChfYSA9IHN5bWJvbHNfMS5yZXR1cm4pKSBfYS5jYWxsKHN5bWJvbHNfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5pZ25vcmVFcnJvcnNGb3IgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIHJlY29yZGVyID0gdGhpcy5lcnJvclJlY29yZGVyO1xuICAgICAgICB0aGlzLmVycm9yUmVjb3JkZXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlciA9IHJlY29yZGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuX3Jlc29sdmVTeW1ib2xNZW1iZXJzID0gZnVuY3Rpb24gKHN0YXRpY1N5bWJvbCkge1xuICAgICAgICB2YXIgbWVtYmVycyA9IHN0YXRpY1N5bWJvbC5tZW1iZXJzO1xuICAgICAgICB2YXIgYmFzZVJlc29sdmVkU3ltYm9sID0gdGhpcy5yZXNvbHZlU3ltYm9sKHRoaXMuZ2V0U3RhdGljU3ltYm9sKHN0YXRpY1N5bWJvbC5maWxlUGF0aCwgc3RhdGljU3ltYm9sLm5hbWUpKTtcbiAgICAgICAgaWYgKCFiYXNlUmVzb2x2ZWRTeW1ib2wpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiYXNlTWV0YWRhdGEgPSB1bndyYXBSZXNvbHZlZE1ldGFkYXRhKGJhc2VSZXNvbHZlZFN5bWJvbC5tZXRhZGF0YSk7XG4gICAgICAgIGlmIChiYXNlTWV0YWRhdGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRTdGF0aWNTeW1ib2woc3RhdGljU3ltYm9sLCB0aGlzLmdldFN0YXRpY1N5bWJvbChiYXNlTWV0YWRhdGEuZmlsZVBhdGgsIGJhc2VNZXRhZGF0YS5uYW1lLCBtZW1iZXJzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmFzZU1ldGFkYXRhICYmIGJhc2VNZXRhZGF0YS5fX3N5bWJvbGljID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICBpZiAoYmFzZU1ldGFkYXRhLnN0YXRpY3MgJiYgbWVtYmVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkU3RhdGljU3ltYm9sKHN0YXRpY1N5bWJvbCwgYmFzZU1ldGFkYXRhLnN0YXRpY3NbbWVtYmVyc1swXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gYmFzZU1ldGFkYXRhO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aCAmJiB2YWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVttZW1iZXJzW2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRTdGF0aWNTeW1ib2woc3RhdGljU3ltYm9sLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuX3Jlc29sdmVTeW1ib2xGcm9tU3VtbWFyeSA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgdmFyIHN1bW1hcnkgPSB0aGlzLnN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeShzdGF0aWNTeW1ib2wpO1xuICAgICAgICByZXR1cm4gc3VtbWFyeSA/IG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzdGF0aWNTeW1ib2wsIHN1bW1hcnkubWV0YWRhdGEpIDogbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGdldFN0YXRpY1N5bWJvbCBwcm9kdWNlcyBhIFR5cGUgd2hvc2UgbWV0YWRhdGEgaXMga25vd24gYnV0IHdob3NlIGltcGxlbWVudGF0aW9uIGlzIG5vdCBsb2FkZWQuXG4gICAgICogQWxsIHR5cGVzIHBhc3NlZCB0byB0aGUgU3RhdGljUmVzb2x2ZXIgc2hvdWxkIGJlIHBzZXVkby10eXBlcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWNsYXJhdGlvbkZpbGUgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWNsYXJlZFxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB0eXBlLlxuICAgICAqIEBwYXJhbSBtZW1iZXJzIGEgc3ltYm9sIGZvciBhIHN0YXRpYyBtZW1iZXIgb2YgdGhlIG5hbWVkIHR5cGVcbiAgICAgKi9cbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuZ2V0U3RhdGljU3ltYm9sID0gZnVuY3Rpb24gKGRlY2xhcmF0aW9uRmlsZSwgbmFtZSwgbWVtYmVycykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0aWNTeW1ib2xDYWNoZS5nZXQoZGVjbGFyYXRpb25GaWxlLCBuYW1lLCBtZW1iZXJzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGhhc0RlY29yYXRvcnMgY2hlY2tzIGEgZmlsZSdzIG1ldGFkYXRhIGZvciB0aGUgcHJlc2VuY2Ugb2YgZGVjb3JhdG9ycyB3aXRob3V0IGV2YWx1YXRpbmcgdGhlXG4gICAgICogbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsZVBhdGggdGhlIGFic29sdXRlIHBhdGggdG8gZXhhbWluZSBmb3IgZGVjb3JhdG9ycy5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBjbGFzcyBpbiB0aGUgZmlsZSBoYXMgYSBkZWNvcmF0b3IuXG4gICAgICovXG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmhhc0RlY29yYXRvcnMgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgdmFyIG1ldGFkYXRhID0gdGhpcy5nZXRNb2R1bGVNZXRhZGF0YShmaWxlUGF0aCk7XG4gICAgICAgIGlmIChtZXRhZGF0YVsnbWV0YWRhdGEnXSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGFkYXRhWydtZXRhZGF0YSddKS5zb21lKGZ1bmN0aW9uIChtZXRhZGF0YUtleSkge1xuICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IG1ldGFkYXRhWydtZXRhZGF0YSddW21ldGFkYXRhS2V5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkgJiYgZW50cnkuX19zeW1ib2xpYyA9PT0gJ2NsYXNzJyAmJiBlbnRyeS5kZWNvcmF0b3JzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldFN5bWJvbHNPZiA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICB2YXIgc3VtbWFyeVN5bWJvbHMgPSB0aGlzLnN1bW1hcnlSZXNvbHZlci5nZXRTeW1ib2xzT2YoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoc3VtbWFyeVN5bWJvbHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5U3ltYm9scztcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBTb21lIHVzZXJzIHVzZSBsaWJyYXJpZXMgdGhhdCB3ZXJlIG5vdCBjb21waWxlZCB3aXRoIG5nYywgaS5lLiB0aGV5IGRvbid0XG4gICAgICAgIC8vIGhhdmUgc3VtbWFyaWVzLCBvbmx5IC5kLnRzIGZpbGVzLCBidXQgYHN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlYCByZXR1cm5zIHRydWUuXG4gICAgICAgIHRoaXMuX2NyZWF0ZVN5bWJvbHNPZihmaWxlUGF0aCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVN5bWJvbHMgPSBbXTtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFN5bWJvbHMuZm9yRWFjaChmdW5jdGlvbiAocmVzb2x2ZWRTeW1ib2wpIHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZFN5bWJvbC5zeW1ib2wuZmlsZVBhdGggPT09IGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFTeW1ib2xzLnB1c2gocmVzb2x2ZWRTeW1ib2wuc3ltYm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YVN5bWJvbHM7XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuX2NyZWF0ZVN5bWJvbHNPZiA9IGZ1bmN0aW9uIChmaWxlUGF0aCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZWRGaWxlUGF0aHMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzb2x2ZWRGaWxlUGF0aHMuYWRkKGZpbGVQYXRoKTtcbiAgICAgICAgdmFyIHJlc29sdmVkU3ltYm9scyA9IFtdO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmdldE1vZHVsZU1ldGFkYXRhKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG1ldGFkYXRhWydpbXBvcnRBcyddKSB7XG4gICAgICAgICAgICAvLyBJbmRleCBidW5kbGUgaW5kaWNlcyBzaG91bGQgdXNlIHRoZSBpbXBvcnRBcyBtb2R1bGUgbmFtZSBkZWZpbmVkXG4gICAgICAgICAgICAvLyBpbiB0aGUgYnVuZGxlLlxuICAgICAgICAgICAgdGhpcy5rbm93bkZpbGVOYW1lVG9Nb2R1bGVOYW1lcy5zZXQoZmlsZVBhdGgsIG1ldGFkYXRhWydpbXBvcnRBcyddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgdGhlIHN5bWJvbHMgaW4gb25lIG9mIHRoZSByZS1leHBvcnQgbG9jYXRpb25cbiAgICAgICAgaWYgKG1ldGFkYXRhWydleHBvcnRzJ10pIHtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKG1vZHVsZUV4cG9ydCkge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgc3ltYm9scyBpbiB0aGUgbGlzdCBvZiBleHBsaWNpdGx5IHJlLWV4cG9ydGVkIHN5bWJvbHMuXG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZUV4cG9ydC5leHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlRXhwb3J0LmV4cG9ydC5mb3JFYWNoKGZ1bmN0aW9uIChleHBvcnRTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRTeW1ib2wgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sTmFtZSA9IGV4cG9ydFN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbE5hbWUgPSBleHBvcnRTeW1ib2wuYXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xOYW1lID0gdW5lc2NhcGVJZGVudGlmaWVyKHN5bWJvbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bU5hbWUgPSBzeW1ib2xOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRTeW1ib2wgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltTmFtZSA9IHVuZXNjYXBlSWRlbnRpZmllcihleHBvcnRTeW1ib2wubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRNb2R1bGUgPSBfdGhpcy5yZXNvbHZlTW9kdWxlKG1vZHVsZUV4cG9ydC5mcm9tLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0U3ltYm9sID0gX3RoaXMuZ2V0U3RhdGljU3ltYm9sKHJlc29sdmVkTW9kdWxlLCBzeW1OYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlU3ltYm9sID0gX3RoaXMuZ2V0U3RhdGljU3ltYm9sKGZpbGVQYXRoLCBzeW1ib2xOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFN5bWJvbHMucHVzaChfdGhpcy5jcmVhdGVFeHBvcnQoc291cmNlU3ltYm9sLCB0YXJnZXRTeW1ib2wpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdGhlIHN5bWJvbHMgdmlhIGV4cG9ydCAqIGRpcmVjdGl2ZXMuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZE1vZHVsZSA9IHRoaXNfMS5yZXNvbHZlTW9kdWxlKG1vZHVsZUV4cG9ydC5mcm9tLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5lc3RlZEV4cG9ydHMgPSB0aGlzXzEuZ2V0U3ltYm9sc09mKHJlc29sdmVkTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZEV4cG9ydHMuZm9yRWFjaChmdW5jdGlvbiAodGFyZ2V0U3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZVN5bWJvbCA9IF90aGlzLmdldFN0YXRpY1N5bWJvbChmaWxlUGF0aCwgdGFyZ2V0U3ltYm9sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU3ltYm9scy5wdXNoKF90aGlzLmNyZWF0ZUV4cG9ydChzb3VyY2VTeW1ib2wsIHRhcmdldFN5bWJvbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMobWV0YWRhdGFbJ2V4cG9ydHMnXSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUV4cG9ydCA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKG1vZHVsZUV4cG9ydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgYWN0dWFsIG1ldGFkYXRhLiBIYXMgdG8gYmUgYWZ0ZXIgdGhlIGV4cG9ydHNcbiAgICAgICAgLy8gYXMgdGhlcmUgbWlnaHQgYmUgY29sbGlzaW9ucyBpbiB0aGUgbmFtZXMsIGFuZCB3ZSB3YW50IHRoZSBzeW1ib2xzXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IG1vZHVsZSB0byB3aW4gb2Z0ZXIgcmVleHBvcnRzLlxuICAgICAgICBpZiAobWV0YWRhdGFbJ21ldGFkYXRhJ10pIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBkaXJlY3QgZGVjbGFyYXRpb25zIG9mIHRoZSBzeW1ib2xcbiAgICAgICAgICAgIHZhciB0b3BMZXZlbFN5bWJvbE5hbWVzXzEgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1ldGFkYXRhWydtZXRhZGF0YSddKS5tYXAodW5lc2NhcGVJZGVudGlmaWVyKSk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luc18xID0gbWV0YWRhdGFbJ29yaWdpbnMnXSB8fCB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1ldGFkYXRhWydtZXRhZGF0YSddKS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRhZGF0YUtleSkge1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xNZXRhID0gbWV0YWRhdGFbJ21ldGFkYXRhJ11bbWV0YWRhdGFLZXldO1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gdW5lc2NhcGVJZGVudGlmaWVyKG1ldGFkYXRhS2V5KTtcbiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0gX3RoaXMuZ2V0U3RhdGljU3ltYm9sKGZpbGVQYXRoLCBuYW1lKTtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luID0gb3JpZ2luc18xLmhhc093blByb3BlcnR5KG1ldGFkYXRhS2V5KSAmJiBvcmlnaW5zXzFbbWV0YWRhdGFLZXldO1xuICAgICAgICAgICAgICAgIGlmIChvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHN5bWJvbCBpcyBmcm9tIGEgYnVuZGxlZCBpbmRleCwgdXNlIHRoZSBkZWNsYXJhdGlvbiBsb2NhdGlvbiBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3ltYm9sIHNvIHJlbGF0aXZlIHJlZmVyZW5jZXMgKHN1Y2ggYXMgJy4vbXkuaHRtbCcpIHdpbGwgYmUgY2FsY3VsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5GaWxlUGF0aCA9IF90aGlzLnJlc29sdmVNb2R1bGUob3JpZ2luLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luRmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IHJlc29sdmUgb3JpZ2luYWwgc3ltYm9sIGZvciBcIiArIG9yaWdpbiArIFwiIGZyb20gXCIgKyBfdGhpcy5ob3N0LmdldE91dHB1dE5hbWUoZmlsZVBhdGgpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zeW1ib2xSZXNvdXJjZVBhdGhzLnNldChzeW1ib2wsIG9yaWdpbkZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlZFN5bWJvbHMucHVzaChfdGhpcy5jcmVhdGVSZXNvbHZlZFN5bWJvbChzeW1ib2wsIGZpbGVQYXRoLCB0b3BMZXZlbFN5bWJvbE5hbWVzXzEsIHN5bWJvbE1ldGEpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmVkU3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFN5bWJvbCkgeyByZXR1cm4gX3RoaXMucmVzb2x2ZWRTeW1ib2xzLnNldChyZXNvbHZlZFN5bWJvbC5zeW1ib2wsIHJlc29sdmVkU3ltYm9sKTsgfSk7XG4gICAgICAgIHRoaXMuc3ltYm9sRnJvbUZpbGUuc2V0KGZpbGVQYXRoLCByZXNvbHZlZFN5bWJvbHMubWFwKGZ1bmN0aW9uIChyZXNvbHZlZFN5bWJvbCkgeyByZXR1cm4gcmVzb2x2ZWRTeW1ib2wuc3ltYm9sOyB9KSk7XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuY3JlYXRlUmVzb2x2ZWRTeW1ib2wgPSBmdW5jdGlvbiAoc291cmNlU3ltYm9sLCB0b3BMZXZlbFBhdGgsIHRvcExldmVsU3ltYm9sTmFtZXMsIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIEZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgaGF2ZSBBbmd1bGFyIHN1bW1hcmllcyAvIG1ldGFkYXRhLFxuICAgICAgICAvLyB3ZSBvbmx5IGtlZXAgdGhlaXIgYXJpdHksIGJ1dCBub3RoaW5nIGVsc2VcbiAgICAgICAgLy8gKGUuZy4gdGhlaXIgY29uc3RydWN0b3IgcGFyYW1ldGVycykuXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgdG8gcHJldmVudCBpbnRyb2R1Y2luZyBkZWVwIGltcG9ydHNcbiAgICAgICAgLy8gYXMgd2UgZGlkbid0IGdlbmVyYXRlIC5uZ2ZhY3RvcnkudHMgZmlsZXMgd2l0aCBwcm9wZXIgcmVleHBvcnRzLlxuICAgICAgICB2YXIgaXNUc0ZpbGUgPSBUUy50ZXN0KHNvdXJjZVN5bWJvbC5maWxlUGF0aCk7XG4gICAgICAgIGlmICh0aGlzLnN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlKHNvdXJjZVN5bWJvbC5maWxlUGF0aCkgJiYgIWlzVHNGaWxlICYmIG1ldGFkYXRhICYmXG4gICAgICAgICAgICBtZXRhZGF0YVsnX19zeW1ib2xpYyddID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICB2YXIgdHJhbnNmb3JtZWRNZXRhXzEgPSB7IF9fc3ltYm9saWM6ICdjbGFzcycsIGFyaXR5OiBtZXRhZGF0YS5hcml0eSB9O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzb3VyY2VTeW1ib2wsIHRyYW5zZm9ybWVkTWV0YV8xKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX29yaWdpbmFsRmlsZU1lbW87XG4gICAgICAgIHZhciBnZXRPcmlnaW5hbE5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIV9vcmlnaW5hbEZpbGVNZW1vKSB7XG4gICAgICAgICAgICAgICAgLy8gR3Vlc3Mgd2hhdCB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGlzIGZyb20gdGhlIHJlZmVyZW5jZS4gSWYgaXQgaGFzIGEgYC5kLnRzYCBleHRlbnNpb25cbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGl0IHdpdGggYC50c2AuIElmIGl0IGFscmVhZHkgaGFzIGAudHNgIGp1c3QgbGVhdmUgaXQgaW4gcGxhY2UuIElmIGl0IGRvZXNuJ3QgaGF2ZVxuICAgICAgICAgICAgICAgIC8vIC50cyBvciAuZC50cywgYXBwZW5kIGAudHMnLiBBbHNvLCBpZiBpdCBpcyBpbiBgbm9kZV9tb2R1bGVzYCwgdHJpbSB0aGUgYG5vZGVfbW9kdWxlYFxuICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIGFzIGl0IGlzIG5vdCBpbXBvcnRhbnQgdG8gZmluZGluZyB0aGUgZmlsZS5cbiAgICAgICAgICAgICAgICBfb3JpZ2luYWxGaWxlTWVtbyA9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmhvc3QuZ2V0T3V0cHV0TmFtZSh0b3BMZXZlbFBhdGgucmVwbGFjZSgvKChcXC50cyl8KFxcLmRcXC50cyl8KSQvLCAnLnRzJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eLipub2RlX21vZHVsZXNbL1xcXFxdLywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfb3JpZ2luYWxGaWxlTWVtbztcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgUmVmZXJlbmNlVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgICAgICAgICBfX2V4dGVuZHMoUmVmZXJlbmNlVHJhbnNmb3JtZXIsIF9zdXBlcik7XG4gICAgICAgICAgICBmdW5jdGlvbiBSZWZlcmVuY2VUcmFuc2Zvcm1lcigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWZlcmVuY2VUcmFuc2Zvcm1lci5wcm90b3R5cGUudmlzaXRTdHJpbmdNYXAgPSBmdW5jdGlvbiAobWFwLCBmdW5jdGlvblBhcmFtcykge1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xpYyA9IG1hcFsnX19zeW1ib2xpYyddO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xpYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2xkTGVuID0gZnVuY3Rpb25QYXJhbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvblBhcmFtcy5wdXNoLmFwcGx5KGZ1bmN0aW9uUGFyYW1zLCBfX3NwcmVhZCgobWFwWydwYXJhbWV0ZXJzJ10gfHwgW10pKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfc3VwZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwLmNhbGwodGhpcywgbWFwLCBmdW5jdGlvblBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uUGFyYW1zLmxlbmd0aCA9IG9sZExlbjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ltYm9saWMgPT09ICdyZWZlcmVuY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBtYXBbJ21vZHVsZSddO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gbWFwWyduYW1lJ10gPyB1bmVzY2FwZUlkZW50aWZpZXIobWFwWyduYW1lJ10pIDogbWFwWyduYW1lJ107XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZVBhdGggPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gc2VsZi5yZXNvbHZlTW9kdWxlKG1vZHVsZSwgc291cmNlU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N5bWJvbGljOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIkNvdWxkIG5vdCByZXNvbHZlIFwiICsgbW9kdWxlICsgXCIgcmVsYXRpdmUgdG8gXCIgKyBzZWxmLmhvc3QuZ2V0TWV0YWRhdGFGb3Ioc291cmNlU3ltYm9sLmZpbGVQYXRoKSArIFwiLlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBtYXBbJ2xpbmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOiBtYXBbJ2NoYXJhY3RlciddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZ2V0T3JpZ2luYWxOYW1lKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3N5bWJvbGljOiAncmVzb2x2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbDogc2VsZi5nZXRTdGF0aWNTeW1ib2woZmlsZVBhdGgsIG5hbWVfMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogbWFwWydsaW5lJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyOiBtYXBbJ2NoYXJhY3RlciddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBnZXRPcmlnaW5hbE5hbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmdW5jdGlvblBhcmFtcy5pbmRleE9mKG5hbWVfMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBfX3N5bWJvbGljOiAncmVmZXJlbmNlJywgbmFtZTogbmFtZV8xIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9wTGV2ZWxTeW1ib2xOYW1lcy5oYXMobmFtZV8xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldFN0YXRpY1N5bWJvbCh0b3BMZXZlbFBhdGgsIG5hbWVfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ltYm9saWMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKHt9LCBtYXAsIHsgZmlsZU5hbWU6IGdldE9yaWdpbmFsTmFtZSgpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXRTdHJpbmdNYXAuY2FsbCh0aGlzLCBtYXAsIGZ1bmN0aW9uUGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIFJlZmVyZW5jZVRyYW5zZm9ybWVyO1xuICAgICAgICB9KFZhbHVlVHJhbnNmb3JtZXIpKTtcbiAgICAgICAgdmFyIHRyYW5zZm9ybWVkTWV0YSA9IHZpc2l0VmFsdWUobWV0YWRhdGEsIG5ldyBSZWZlcmVuY2VUcmFuc2Zvcm1lcigpLCBbXSk7XG4gICAgICAgIHZhciB1bndyYXBwZWRUcmFuc2Zvcm1lZE1ldGEgPSB1bndyYXBSZXNvbHZlZE1ldGFkYXRhKHRyYW5zZm9ybWVkTWV0YSk7XG4gICAgICAgIGlmICh1bndyYXBwZWRUcmFuc2Zvcm1lZE1ldGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUV4cG9ydChzb3VyY2VTeW1ib2wsIHVud3JhcHBlZFRyYW5zZm9ybWVkTWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFN0YXRpY1N5bWJvbChzb3VyY2VTeW1ib2wsIHRyYW5zZm9ybWVkTWV0YSk7XG4gICAgfTtcbiAgICBTdGF0aWNTeW1ib2xSZXNvbHZlci5wcm90b3R5cGUuY3JlYXRlRXhwb3J0ID0gZnVuY3Rpb24gKHNvdXJjZVN5bWJvbCwgdGFyZ2V0U3ltYm9sKSB7XG4gICAgICAgIHNvdXJjZVN5bWJvbC5hc3NlcnROb01lbWJlcnMoKTtcbiAgICAgICAgdGFyZ2V0U3ltYm9sLmFzc2VydE5vTWVtYmVycygpO1xuICAgICAgICBpZiAodGhpcy5zdW1tYXJ5UmVzb2x2ZXIuaXNMaWJyYXJ5RmlsZShzb3VyY2VTeW1ib2wuZmlsZVBhdGgpICYmXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlKHRhcmdldFN5bWJvbC5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBpcyBmb3IgYW4gbmcgbGlicmFyeSBpbXBvcnRpbmcgc3ltYm9scyBmcm9tIGEgcGxhaW4gdHMgbGlicmFyeVxuICAgICAgICAgICAgLy8gdHJhbnNpdGl2ZWx5LlxuICAgICAgICAgICAgLy8gTm90ZTogV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHdlIGRpc2NvdmVyIHN5bWJvbHMgaW4gdGhlIGRpcmVjdGlvblxuICAgICAgICAgICAgLy8gZnJvbSBzb3VyY2UgZmlsZXMgdG8gbGlicmFyeSBmaWxlc1xuICAgICAgICAgICAgdGhpcy5pbXBvcnRBcy5zZXQodGFyZ2V0U3ltYm9sLCB0aGlzLmdldEltcG9ydEFzKHNvdXJjZVN5bWJvbCkgfHwgc291cmNlU3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkU3RhdGljU3ltYm9sKHNvdXJjZVN5bWJvbCwgdGFyZ2V0U3ltYm9sKTtcbiAgICB9O1xuICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgY29udGV4dCwgcGF0aCkge1xuICAgICAgICBpZiAodGhpcy5lcnJvclJlY29yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yUmVjb3JkZXIoZXJyb3IsIChjb250ZXh0ICYmIGNvbnRleHQuZmlsZVBhdGgpIHx8IHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBtb2R1bGUgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1vZHVsZSBmaWxlLlxuICAgICAqL1xuICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5nZXRNb2R1bGVNZXRhZGF0YSA9IGZ1bmN0aW9uIChtb2R1bGUpIHtcbiAgICAgICAgdmFyIG1vZHVsZU1ldGFkYXRhID0gdGhpcy5tZXRhZGF0YUNhY2hlLmdldChtb2R1bGUpO1xuICAgICAgICBpZiAoIW1vZHVsZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgbW9kdWxlTWV0YWRhdGFzID0gdGhpcy5ob3N0LmdldE1ldGFkYXRhRm9yKG1vZHVsZSk7XG4gICAgICAgICAgICBpZiAobW9kdWxlTWV0YWRhdGFzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1heFZlcnNpb25fMSA9IC0xO1xuICAgICAgICAgICAgICAgIG1vZHVsZU1ldGFkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWQgJiYgbWRbJ3ZlcnNpb24nXSA+IG1heFZlcnNpb25fMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmVyc2lvbl8xID0gbWRbJ3ZlcnNpb24nXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1ldGFkYXRhID0gbWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbW9kdWxlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGVNZXRhZGF0YSA9XG4gICAgICAgICAgICAgICAgICAgIHsgX19zeW1ib2xpYzogJ21vZHVsZScsIHZlcnNpb246IFNVUFBPUlRFRF9TQ0hFTUFfVkVSU0lPTiwgbW9kdWxlOiBtb2R1bGUsIG1ldGFkYXRhOiB7fSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1vZHVsZU1ldGFkYXRhWyd2ZXJzaW9uJ10gIT0gU1VQUE9SVEVEX1NDSEVNQV9WRVJTSU9OKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IG1vZHVsZU1ldGFkYXRhWyd2ZXJzaW9uJ10gPT0gMiA/XG4gICAgICAgICAgICAgICAgICAgIFwiVW5zdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBcIiArIG1vZHVsZU1ldGFkYXRhWyd2ZXJzaW9uJ10gKyBcIiBmb3IgbW9kdWxlIFwiICsgbW9kdWxlICsgXCIuIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBuZ2NcIiA6XG4gICAgICAgICAgICAgICAgICAgIFwiTWV0YWRhdGEgdmVyc2lvbiBtaXNtYXRjaCBmb3IgbW9kdWxlIFwiICsgdGhpcy5ob3N0LmdldE91dHB1dE5hbWUobW9kdWxlKSArIFwiLCBmb3VuZCB2ZXJzaW9uIFwiICsgbW9kdWxlTWV0YWRhdGFbJ3ZlcnNpb24nXSArIFwiLCBleHBlY3RlZCBcIiArIFNVUFBPUlRFRF9TQ0hFTUFfVkVSU0lPTjtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFDYWNoZS5zZXQobW9kdWxlLCBtb2R1bGVNZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZU1ldGFkYXRhO1xuICAgIH07XG4gICAgU3RhdGljU3ltYm9sUmVzb2x2ZXIucHJvdG90eXBlLmdldFN5bWJvbEJ5TW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZSwgc3ltYm9sTmFtZSwgY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgICAgdmFyIGZpbGVQYXRoID0gdGhpcy5yZXNvbHZlTW9kdWxlKG1vZHVsZSwgY29udGFpbmluZ0ZpbGUpO1xuICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihcIkNvdWxkIG5vdCByZXNvbHZlIG1vZHVsZSBcIiArIG1vZHVsZSArIChjb250YWluaW5nRmlsZSA/ICcgcmVsYXRpdmUgdG8gJyArXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0LmdldE91dHB1dE5hbWUoY29udGFpbmluZ0ZpbGUpIDogJycpKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGF0aWNTeW1ib2woXCJFUlJPUjpcIiArIG1vZHVsZSwgc3ltYm9sTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGljU3ltYm9sKGZpbGVQYXRoLCBzeW1ib2xOYW1lKTtcbiAgICB9O1xuICAgIFN0YXRpY1N5bWJvbFJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZSwgY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhvc3QubW9kdWxlTmFtZVRvRmlsZU5hbWUobW9kdWxlLCBjb250YWluaW5nRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgcmVzb2x2ZSBtb2R1bGUgJ1wiICsgbW9kdWxlICsgXCInIHJlbGF0aXZlIHRvIGZpbGUgXCIgKyBjb250YWluaW5nRmlsZSk7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKGUsIHVuZGVmaW5lZCwgY29udGFpbmluZ0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIFN0YXRpY1N5bWJvbFJlc29sdmVyO1xufSgpKTtcbi8vIFJlbW92ZSBleHRyYSB1bmRlcnNjb3JlIGZyb20gZXNjYXBlZCBpZGVudGlmaWVyLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21hc3Rlci9zcmMvY29tcGlsZXIvdXRpbGl0aWVzLnRzXG5mdW5jdGlvbiB1bmVzY2FwZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgIHJldHVybiBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoJ19fXycpID8gaWRlbnRpZmllci5zdWJzdHIoMSkgOiBpZGVudGlmaWVyO1xufVxuZnVuY3Rpb24gdW53cmFwUmVzb2x2ZWRNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5fX3N5bWJvbGljID09PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5zeW1ib2w7XG4gICAgfVxuICAgIHJldHVybiBtZXRhZGF0YTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3VtbWFyaWVzKHNyY0ZpbGVOYW1lLCBmb3JKaXRDdHgsIHN1bW1hcnlSZXNvbHZlciwgc3ltYm9sUmVzb2x2ZXIsIHN5bWJvbHMsIHR5cGVzLCBjcmVhdGVFeHRlcm5hbFN5bWJvbFJlZXhwb3J0cykge1xuICAgIGlmIChjcmVhdGVFeHRlcm5hbFN5bWJvbFJlZXhwb3J0cyA9PT0gdm9pZCAwKSB7IGNyZWF0ZUV4dGVybmFsU3ltYm9sUmVleHBvcnRzID0gZmFsc2U7IH1cbiAgICB2YXIgdG9Kc29uU2VyaWFsaXplciA9IG5ldyBUb0pzb25TZXJpYWxpemVyKHN5bWJvbFJlc29sdmVyLCBzdW1tYXJ5UmVzb2x2ZXIsIHNyY0ZpbGVOYW1lKTtcbiAgICAvLyBmb3Igc3ltYm9scywgd2UgdXNlIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciB0aGUgY2xhc3MgbWV0YWRhdGEgaXRzZWxmXG4gICAgLy8gKHdlIGtlZXAgdGhlIHN0YXRpY3MgdGhvdWdoKSwgYXMgdGhlIGNsYXNzIG1ldGFkYXRhIGlzIGNvbnRhaW5lZCBpbiB0aGVcbiAgICAvLyBDb21waWxlVHlwZVN1bW1hcnkuXG4gICAgc3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChyZXNvbHZlZFN5bWJvbCkgeyByZXR1cm4gdG9Kc29uU2VyaWFsaXplci5hZGRTdW1tYXJ5KHsgc3ltYm9sOiByZXNvbHZlZFN5bWJvbC5zeW1ib2wsIG1ldGFkYXRhOiByZXNvbHZlZFN5bWJvbC5tZXRhZGF0YSB9KTsgfSk7XG4gICAgLy8gQWRkIHR5cGUgc3VtbWFyaWVzLlxuICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBzdW1tYXJ5ID0gX2Euc3VtbWFyeSwgbWV0YWRhdGEgPSBfYS5tZXRhZGF0YTtcbiAgICAgICAgdG9Kc29uU2VyaWFsaXplci5hZGRTdW1tYXJ5KHsgc3ltYm9sOiBzdW1tYXJ5LnR5cGUucmVmZXJlbmNlLCBtZXRhZGF0YTogdW5kZWZpbmVkLCB0eXBlOiBzdW1tYXJ5IH0pO1xuICAgIH0pO1xuICAgIHZhciBfYSA9IHRvSnNvblNlcmlhbGl6ZXIuc2VyaWFsaXplKGNyZWF0ZUV4dGVybmFsU3ltYm9sUmVleHBvcnRzKSwganNvbiA9IF9hLmpzb24sIGV4cG9ydEFzID0gX2EuZXhwb3J0QXM7XG4gICAgaWYgKGZvckppdEN0eCkge1xuICAgICAgICB2YXIgZm9ySml0U2VyaWFsaXplcl8xID0gbmV3IEZvckppdFNlcmlhbGl6ZXIoZm9ySml0Q3R4LCBzeW1ib2xSZXNvbHZlciwgc3VtbWFyeVJlc29sdmVyKTtcbiAgICAgICAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHZhciBzdW1tYXJ5ID0gX2Euc3VtbWFyeSwgbWV0YWRhdGEgPSBfYS5tZXRhZGF0YTtcbiAgICAgICAgICAgIGZvckppdFNlcmlhbGl6ZXJfMS5hZGRTb3VyY2VUeXBlKHN1bW1hcnksIG1ldGFkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvSnNvblNlcmlhbGl6ZXIudW5wcm9jZXNzZWRTeW1ib2xTdW1tYXJpZXNCeVN5bWJvbC5mb3JFYWNoKGZ1bmN0aW9uIChzdW1tYXJ5KSB7XG4gICAgICAgICAgICBpZiAoc3VtbWFyeVJlc29sdmVyLmlzTGlicmFyeUZpbGUoc3VtbWFyeS5zeW1ib2wuZmlsZVBhdGgpICYmIHN1bW1hcnkudHlwZSkge1xuICAgICAgICAgICAgICAgIGZvckppdFNlcmlhbGl6ZXJfMS5hZGRMaWJUeXBlKHN1bW1hcnkudHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmb3JKaXRTZXJpYWxpemVyXzEuc2VyaWFsaXplKGV4cG9ydEFzKTtcbiAgICB9XG4gICAgcmV0dXJuIHsganNvbjoganNvbiwgZXhwb3J0QXM6IGV4cG9ydEFzIH07XG59XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVN1bW1hcmllcyhzeW1ib2xDYWNoZSwgc3VtbWFyeVJlc29sdmVyLCBsaWJyYXJ5RmlsZU5hbWUsIGpzb24pIHtcbiAgICB2YXIgZGVzZXJpYWxpemVyID0gbmV3IEZyb21Kc29uRGVzZXJpYWxpemVyKHN5bWJvbENhY2hlLCBzdW1tYXJ5UmVzb2x2ZXIpO1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUobGlicmFyeUZpbGVOYW1lLCBqc29uKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZvckppdFN0dWIob3V0cHV0Q3R4LCByZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gY3JlYXRlU3VtbWFyeUZvckppdEZ1bmN0aW9uKG91dHB1dEN0eCwgcmVmZXJlbmNlLCBOVUxMX0VYUFIpO1xufVxuZnVuY3Rpb24gY3JlYXRlU3VtbWFyeUZvckppdEZ1bmN0aW9uKG91dHB1dEN0eCwgcmVmZXJlbmNlLCB2YWx1ZSkge1xuICAgIHZhciBmbk5hbWUgPSBzdW1tYXJ5Rm9ySml0TmFtZShyZWZlcmVuY2UubmFtZSk7XG4gICAgb3V0cHV0Q3R4LnN0YXRlbWVudHMucHVzaChmbihbXSwgW25ldyBSZXR1cm5TdGF0ZW1lbnQodmFsdWUpXSwgbmV3IEFycmF5VHlwZShEWU5BTUlDX1RZUEUpKS50b0RlY2xTdG10KGZuTmFtZSwgW1xuICAgICAgICBTdG10TW9kaWZpZXIuRmluYWwsIFN0bXRNb2RpZmllci5FeHBvcnRlZFxuICAgIF0pKTtcbn1cbnZhciBUb0pzb25TZXJpYWxpemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUb0pzb25TZXJpYWxpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRvSnNvblNlcmlhbGl6ZXIoc3ltYm9sUmVzb2x2ZXIsIHN1bW1hcnlSZXNvbHZlciwgc3JjRmlsZU5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3ltYm9sUmVzb2x2ZXIgPSBzeW1ib2xSZXNvbHZlcjtcbiAgICAgICAgX3RoaXMuc3VtbWFyeVJlc29sdmVyID0gc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICBfdGhpcy5zcmNGaWxlTmFtZSA9IHNyY0ZpbGVOYW1lO1xuICAgICAgICAvLyBOb3RlOiBUaGlzIG9ubHkgY29udGFpbnMgc3ltYm9scyB3aXRob3V0IG1lbWJlcnMuXG4gICAgICAgIF90aGlzLnN5bWJvbHMgPSBbXTtcbiAgICAgICAgX3RoaXMuaW5kZXhCeVN5bWJvbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgX3RoaXMucmVleHBvcnRlZEJ5ID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBUaGlzIG5vdyBjb250YWlucyBhIGBfX3N5bWJvbDogbnVtYmVyYCBpbiB0aGUgcGxhY2Ugb2ZcbiAgICAgICAgLy8gU3RhdGljU3ltYm9scywgYnV0IG90aGVyd2lzZSBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIG9yaWdpbmFsIG9iamVjdHMuXG4gICAgICAgIF90aGlzLnByb2Nlc3NlZFN1bW1hcnlCeVN5bWJvbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgX3RoaXMucHJvY2Vzc2VkU3VtbWFyaWVzID0gW107XG4gICAgICAgIF90aGlzLnVucHJvY2Vzc2VkU3ltYm9sU3VtbWFyaWVzQnlTeW1ib2wgPSBuZXcgTWFwKCk7XG4gICAgICAgIF90aGlzLm1vZHVsZU5hbWUgPSBzeW1ib2xSZXNvbHZlci5nZXRLbm93bk1vZHVsZU5hbWUoc3JjRmlsZU5hbWUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRvSnNvblNlcmlhbGl6ZXIucHJvdG90eXBlLmFkZFN1bW1hcnkgPSBmdW5jdGlvbiAoc3VtbWFyeSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgdW5wcm9jZXNzZWRTdW1tYXJ5ID0gdGhpcy51bnByb2Nlc3NlZFN5bWJvbFN1bW1hcmllc0J5U3ltYm9sLmdldChzdW1tYXJ5LnN5bWJvbCk7XG4gICAgICAgIHZhciBwcm9jZXNzZWRTdW1tYXJ5ID0gdGhpcy5wcm9jZXNzZWRTdW1tYXJ5QnlTeW1ib2wuZ2V0KHN1bW1hcnkuc3ltYm9sKTtcbiAgICAgICAgaWYgKCF1bnByb2Nlc3NlZFN1bW1hcnkpIHtcbiAgICAgICAgICAgIHVucHJvY2Vzc2VkU3VtbWFyeSA9IHsgc3ltYm9sOiBzdW1tYXJ5LnN5bWJvbCwgbWV0YWRhdGE6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgdGhpcy51bnByb2Nlc3NlZFN5bWJvbFN1bW1hcmllc0J5U3ltYm9sLnNldChzdW1tYXJ5LnN5bWJvbCwgdW5wcm9jZXNzZWRTdW1tYXJ5KTtcbiAgICAgICAgICAgIHByb2Nlc3NlZFN1bW1hcnkgPSB7IHN5bWJvbDogdGhpcy5wcm9jZXNzVmFsdWUoc3VtbWFyeS5zeW1ib2wsIDAgLyogTm9uZSAqLykgfTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkU3VtbWFyaWVzLnB1c2gocHJvY2Vzc2VkU3VtbWFyeSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFN1bW1hcnlCeVN5bWJvbC5zZXQoc3VtbWFyeS5zeW1ib2wsIHByb2Nlc3NlZFN1bW1hcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdW5wcm9jZXNzZWRTdW1tYXJ5Lm1ldGFkYXRhICYmIHN1bW1hcnkubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YV8xID0gc3VtbWFyeS5tZXRhZGF0YSB8fCB7fTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YV8xLl9fc3ltYm9saWMgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgY2xhc3Nlcywgd2Uga2VlcCBldmVyeXRoaW5nIGV4Y2VwdCB0aGVpciBjbGFzcyBkZWNvcmF0b3JzLlxuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga2VlcCBlLmcuIHRoZSBjdG9yIGFyZ3MsIG1ldGhvZCBuYW1lcywgbWV0aG9kIGRlY29yYXRvcnNcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBjbGFzcyBjYW4gYmUgZXh0ZW5kZWQgaW4gYW5vdGhlciBjb21waWxhdGlvbiB1bml0LlxuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtlZXAgdGhlIGNsYXNzIGRlY29yYXRvcnMgYXNcbiAgICAgICAgICAgICAgICAvLyAxKSB0aGV5IHJlZmVyIHRvIGRhdGFcbiAgICAgICAgICAgICAgICAvLyAgIHRoYXQgc2hvdWxkIG5vdCBjYXVzZSBhIHJlYnVpbGQgb2YgZG93bnN0cmVhbSBjb21waWxhdGlvbiB1bml0c1xuICAgICAgICAgICAgICAgIC8vICAgKGUuZy4gaW5saW5lIHRlbXBsYXRlcyBvZiBAQ29tcG9uZW50LCBvciBATmdNb2R1bGUuZGVjbGFyYXRpb25zKVxuICAgICAgICAgICAgICAgIC8vIDIpIHRoZWlyIGRhdGEgaXMgYWxyZWFkeSBjYXB0dXJlZCBpbiBUeXBlU3VtbWFyaWVzLCBlLmcuIERpcmVjdGl2ZVN1bW1hcnkuXG4gICAgICAgICAgICAgICAgdmFyIGNsb25lXzEgPSB7fTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtZXRhZGF0YV8xKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcE5hbWUgIT09ICdkZWNvcmF0b3JzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmVfMVtwcm9wTmFtZV0gPSBtZXRhZGF0YV8xW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhXzEgPSBjbG9uZV8xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDYWxsKG1ldGFkYXRhXzEpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Z1bmN0aW9uQ2FsbChtZXRhZGF0YV8xKSAmJiAhaXNNZXRob2RDYWxsT25WYXJpYWJsZShtZXRhZGF0YV8xKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBzdG9yZSBjb21wbGV4IGNhbGxzIGFzIHdlIHdvbid0IGJlIGFibGUgdG8gc2ltcGxpZnkgdGhlbSBhbnl3YXlzIGxhdGVyIG9uLlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV8xID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX19zeW1ib2xpYzogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdDb21wbGV4IGZ1bmN0aW9uIGNhbGxzIGFyZSBub3Qgc3VwcG9ydGVkLicsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBrZWVwIHN0b3JpbmcgY3RvciBjYWxscyBmb3IgZS5nLlxuICAgICAgICAgICAgLy8gYGV4cG9ydCBjb25zdCB4ID0gbmV3IEluamVjdGlvblRva2VuKC4uLilgXG4gICAgICAgICAgICB1bnByb2Nlc3NlZFN1bW1hcnkubWV0YWRhdGEgPSBtZXRhZGF0YV8xO1xuICAgICAgICAgICAgcHJvY2Vzc2VkU3VtbWFyeS5tZXRhZGF0YSA9IHRoaXMucHJvY2Vzc1ZhbHVlKG1ldGFkYXRhXzEsIDEgLyogUmVzb2x2ZVZhbHVlICovKTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YV8xIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5UmVzb2x2ZXIuaXNMaWJyYXJ5RmlsZShtZXRhZGF0YV8xLmZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvblN5bWJvbCA9IHRoaXMuc3ltYm9sc1t0aGlzLmluZGV4QnlTeW1ib2wuZ2V0KG1ldGFkYXRhXzEpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTG93ZXJlZFN5bWJvbChkZWNsYXJhdGlvblN5bWJvbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBzeW1ib2xzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGR1cmluZyBjb2RlZ2VuIGluIHRoZSB1c2VyIGZpbGUgY2FuIGhhdmUgYSByZWV4cG9ydFxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHVzZXIgdXNlZCBgZXhwb3J0ICpgLiBIb3dldmVyLCB3ZSBjYW4ndCByZWx5IG9uIHRoaXMgYXMgdHNpY2tsZSB3aWxsIGNoYW5nZVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhwb3J0ICpgIGludG8gbmFtZWQgZXhwb3J0cywgdXNpbmcgb25seSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdHlwZWNoZWNrZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFzIHdlIGludHJvZHVjZSB0aGUgbmV3IHN5bWJvbHMgYWZ0ZXIgdHlwZWNoZWNrLCBUc2lja2xlIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlbSxcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9taXRzIHRoZW0gd2hlbiBleHBhbmRpbmcgYGV4cG9ydCAqYC5cbiAgICAgICAgICAgICAgICAgICAgLy8gU28gd2UgaGF2ZSB0byBrZWVwIHJlZXhwb3J0aW5nIHRoZXNlIHN5bWJvbHMgbWFudWFsbHkgdmlhIC5uZ2ZhY3RvcnkgZmlsZXMuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVleHBvcnRlZEJ5LnNldChkZWNsYXJhdGlvblN5bWJvbCwgc3VtbWFyeS5zeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVucHJvY2Vzc2VkU3VtbWFyeS50eXBlICYmIHN1bW1hcnkudHlwZSkge1xuICAgICAgICAgICAgdW5wcm9jZXNzZWRTdW1tYXJ5LnR5cGUgPSBzdW1tYXJ5LnR5cGU7XG4gICAgICAgICAgICAvLyBOb3RlOiBXZSBkb24ndCBhZGQgdGhlIHN1bW1hcmllcyBvZiBhbGwgcmVmZXJlbmNlZCBzeW1ib2xzIGFzIGZvciB0aGUgUmVzb2x2ZWRTeW1ib2xzLFxuICAgICAgICAgICAgLy8gYXMgdGhlIHR5cGUgc3VtbWFyaWVzIGFscmVhZHkgY29udGFpbiB0aGUgdHJhbnNpdGl2ZSBkYXRhIHRoYXQgdGhleSByZXF1aXJlXG4gICAgICAgICAgICAvLyAoaW4gYSBtaW5pbWFsIHdheSkuXG4gICAgICAgICAgICBwcm9jZXNzZWRTdW1tYXJ5LnR5cGUgPSB0aGlzLnByb2Nlc3NWYWx1ZShzdW1tYXJ5LnR5cGUsIDAgLyogTm9uZSAqLyk7XG4gICAgICAgICAgICAvLyBleGNlcHQgZm9yIHJlZXhwb3J0ZWQgZGlyZWN0aXZlcyAvIHBpcGVzLCBzbyB3ZSBuZWVkIHRvIHN0b3JlXG4gICAgICAgICAgICAvLyB0aGVpciBzdW1tYXJpZXMgZXhwbGljaXRseS5cbiAgICAgICAgICAgIGlmIChzdW1tYXJ5LnR5cGUuc3VtbWFyeUtpbmQgPT09IENvbXBpbGVTdW1tYXJ5S2luZC5OZ01vZHVsZSkge1xuICAgICAgICAgICAgICAgIHZhciBuZ01vZHVsZVN1bW1hcnkgPSBzdW1tYXJ5LnR5cGU7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGVTdW1tYXJ5LmV4cG9ydGVkRGlyZWN0aXZlcy5jb25jYXQobmdNb2R1bGVTdW1tYXJ5LmV4cG9ydGVkUGlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2wgPSBpZC5yZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdW1tYXJ5UmVzb2x2ZXIuaXNMaWJyYXJ5RmlsZShzeW1ib2wuZmlsZVBhdGgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhX3RoaXMudW5wcm9jZXNzZWRTeW1ib2xTdW1tYXJpZXNCeVN5bWJvbC5oYXMoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1bW1hcnlfMSA9IF90aGlzLnN1bW1hcnlSZXNvbHZlci5yZXNvbHZlU3VtbWFyeShzeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnlfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZFN1bW1hcnkoc3VtbWFyeV8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY3JlYXRlRXh0ZXJuYWxTeW1ib2xSZWV4cG9ydHMgV2hldGhlciBleHRlcm5hbCBzdGF0aWMgc3ltYm9scyBzaG91bGQgYmUgcmUtZXhwb3J0ZWQuXG4gICAgICogVGhpcyBjYW4gYmUgZW5hYmxlZCBpZiBleHRlcm5hbCBzeW1ib2xzIHNob3VsZCBiZSByZS1leHBvcnRlZCBieSB0aGUgY3VycmVudCBtb2R1bGUgaW5cbiAgICAgKiBvcmRlciB0byBhdm9pZCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgbW9kdWxlIGRlcGVuZGVuY2llcyB3aGljaCBjYW4gYnJlYWsgc3RyaWN0IGRlcGVuZGVuY3lcbiAgICAgKiBlbmZvcmNlbWVudHMgKGFzIGluIEdvb2dsZTMpLiBSZWFkIG1vcmUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjU2NDRcbiAgICAgKi9cbiAgICBUb0pzb25TZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoY3JlYXRlRXh0ZXJuYWxTeW1ib2xSZWV4cG9ydHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGV4cG9ydEFzID0gW107XG4gICAgICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogdGhpcy5tb2R1bGVOYW1lLFxuICAgICAgICAgICAgc3VtbWFyaWVzOiB0aGlzLnByb2Nlc3NlZFN1bW1hcmllcyxcbiAgICAgICAgICAgIHN5bWJvbHM6IHRoaXMuc3ltYm9scy5tYXAoZnVuY3Rpb24gKHN5bWJvbCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2wuYXNzZXJ0Tm9NZW1iZXJzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGltcG9ydEFzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdW1tYXJ5UmVzb2x2ZXIuaXNMaWJyYXJ5RmlsZShzeW1ib2wuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWV4cG9ydFN5bWJvbCA9IF90aGlzLnJlZXhwb3J0ZWRCeS5nZXQoc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZXhwb3J0U3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBnaXZlbiBleHRlcm5hbCBzdGF0aWMgc3ltYm9sIGlzIGFscmVhZHkgbWFudWFsbHkgZXhwb3J0ZWQgYnkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyLCB3ZSBqdXN0IHByb3h5IHRoZSBleHRlcm5hbCBzdGF0aWMgc3ltYm9sIHJlZmVyZW5jZSB0byB0aGUgbWFudWFsIGV4cG9ydC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBBT1QgY29tcGlsZXIgaW1wb3J0cyB0aGUgZXh0ZXJuYWwgc3ltYm9sIHRocm91Z2ggdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGV4cG9ydCBhbmQgZG9lcyBub3QgaW50cm9kdWNlIGFub3RoZXIgZGVwZW5kZW5jeSB3aGljaCBpcyBub3QgbmVlZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QXMgPSBfdGhpcy5pbmRleEJ5U3ltYm9sLmdldChyZWV4cG9ydFN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3JlYXRlRXh0ZXJuYWxTeW1ib2xSZWV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGdpdmVuIGV4dGVybmFsIHN0YXRpYyBzeW1ib2wgaXMgKm5vdCogbWFudWFsbHkgZXhwb3J0ZWQgYnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyLCBhbmQgd2UgbWFudWFsbHkgY3JlYXRlIGEgcmUtZXhwb3J0IGluIHRoZSBmYWN0b3J5IGZpbGUgc28gdGhhdCB3ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgaW50cm9kdWNlIGFub3RoZXIgbW9kdWxlIGRlcGVuZGVuY3kuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcnVubmluZyB3aXRoaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhemVsIHNvIHRoYXQgdGhlIEFPVCBjb21waWxlciBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IG1vZHVsZSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhbiBicmVhayB0aGUgc3RyaWN0IGRlcGVuZGVuY3kgZW5mb3JjZW1lbnQuIChlLmcuIGFzIGluIEdvb2dsZTMpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIG1vcmUgYWJvdXQgdGhpcyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yNTY0NFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1bW1hcnkgPSBfdGhpcy51bnByb2Nlc3NlZFN5bWJvbFN1bW1hcmllc0J5U3ltYm9sLmdldChzeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdW1tYXJ5IHx8ICFzdW1tYXJ5Lm1ldGFkYXRhIHx8IHN1bW1hcnkubWV0YWRhdGEuX19zeW1ib2xpYyAhPT0gJ2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBcyA9IHN5bWJvbC5uYW1lICsgXCJfXCIgKyBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRBcy5wdXNoKHsgc3ltYm9sOiBzeW1ib2wsIGV4cG9ydEFzOiBpbXBvcnRBcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBfX3N5bWJvbDogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHN5bWJvbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogX3RoaXMuc3VtbWFyeVJlc29sdmVyLnRvU3VtbWFyeUZpbGVOYW1lKHN5bWJvbC5maWxlUGF0aCwgX3RoaXMuc3JjRmlsZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRBczogaW1wb3J0QXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGpzb246IGpzb24sIGV4cG9ydEFzOiBleHBvcnRBcyB9O1xuICAgIH07XG4gICAgVG9Kc29uU2VyaWFsaXplci5wcm90b3R5cGUucHJvY2Vzc1ZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBmbGFncykge1xuICAgICAgICByZXR1cm4gdmlzaXRWYWx1ZSh2YWx1ZSwgdGhpcywgZmxhZ3MpO1xuICAgIH07XG4gICAgVG9Kc29uU2VyaWFsaXplci5wcm90b3R5cGUudmlzaXRPdGhlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY29udGV4dCkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgIHZhciBiYXNlU3ltYm9sID0gdGhpcy5zeW1ib2xSZXNvbHZlci5nZXRTdGF0aWNTeW1ib2wodmFsdWUuZmlsZVBhdGgsIHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy52aXNpdFN0YXRpY1N5bWJvbChiYXNlU3ltYm9sLCBjb250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybiB7IF9fc3ltYm9sOiBpbmRleCwgbWVtYmVyczogdmFsdWUubWVtYmVycyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdHJpcCBsaW5lIGFuZCBjaGFyYWN0ZXIgbnVtYmVycyBmcm9tIG5nc3VtbWFyaWVzLlxuICAgICAqIEVtaXR0aW5nIHRoZW0gY2F1c2VzIHdoaXRlIHNwYWNlcyBjaGFuZ2VzIHRvIHJldHJpZ2dlciB1cHN0cmVhbVxuICAgICAqIHJlY29tcGlsYXRpb25zIGluIGJhemVsLlxuICAgICAqIFRPRE86IGZpbmQgb3V0IGEgd2F5IHRvIGhhdmUgbGluZSBhbmQgY2hhcmFjdGVyIG51bWJlcnMgaW4gZXJyb3JzIHdpdGhvdXRcbiAgICAgKiBleGNlc3NpdmUgcmVjb21waWxhdGlvbiBpbiBiYXplbC5cbiAgICAgKi9cbiAgICBUb0pzb25TZXJpYWxpemVyLnByb3RvdHlwZS52aXNpdFN0cmluZ01hcCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKG1hcFsnX19zeW1ib2xpYyddID09PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRWYWx1ZShtYXBbJ3N5bWJvbCddLCB0aGlzLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwWydfX3N5bWJvbGljJ10gPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBtYXBbJ2xpbmUnXTtcbiAgICAgICAgICAgIGRlbGV0ZSBtYXBbJ2NoYXJhY3RlciddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwLmNhbGwodGhpcywgbWFwLCBjb250ZXh0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgb3B0aW9ucy5yZXNvbHZlVmFsdWUgaXMgdHJ1ZSwgYW5kIHRoZSBzdW1tYXJ5IGZvciB0aGUgc3ltYm9sXG4gICAgICogcmVzb2x2ZWQgdG8gYSB0eXBlIG9yIGNvdWxkIG5vdCBiZSByZXNvbHZlZC5cbiAgICAgKi9cbiAgICBUb0pzb25TZXJpYWxpemVyLnByb3RvdHlwZS52aXNpdFN0YXRpY1N5bWJvbCA9IGZ1bmN0aW9uIChiYXNlU3ltYm9sLCBmbGFncykge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4QnlTeW1ib2wuZ2V0KGJhc2VTeW1ib2wpO1xuICAgICAgICB2YXIgc3VtbWFyeSA9IG51bGw7XG4gICAgICAgIGlmIChmbGFncyAmIDEgLyogUmVzb2x2ZVZhbHVlICovICYmXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlKGJhc2VTeW1ib2wuZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51bnByb2Nlc3NlZFN5bWJvbFN1bW1hcmllc0J5U3ltYm9sLmhhcyhiYXNlU3ltYm9sKSkge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGZvciB0aGlzIHN5bWJvbCB3YXMgYWxyZWFkeSBhZGRlZFxuICAgICAgICAgICAgICAgIC8vIC0+IG5vdGhpbmcgdG8gZG8uXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtbWFyeSA9IHRoaXMubG9hZFN1bW1hcnkoYmFzZVN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5Lm1ldGFkYXRhIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHN1bW1hcnkgaXMgYSByZWV4cG9ydFxuICAgICAgICAgICAgICAgIGluZGV4ID0gdGhpcy52aXNpdFN0YXRpY1N5bWJvbChzdW1tYXJ5Lm1ldGFkYXRhLCBmbGFncyk7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN1bW1hcnkgYXMgaXQgaXMganVzdCBhIHJlZXhwb3J0LCBzbyB3ZSBkb24ndCB3YW50IHRvIHN0b3JlIGl0LlxuICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6ID09IG9uIHB1cnBvc2UgdG8gY29tcGFyZSB3aXRoIHVuZGVmaW5lZCFcbiAgICAgICAgICAgIC8vIE5vIHN1bW1hcnkgYW5kIHRoZSBzeW1ib2wgaXMgYWxyZWFkeSBhZGRlZCAtPiBub3RoaW5nIHRvIGRvLlxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6ID09IG9uIHB1cnBvc2UgdG8gY29tcGFyZSB3aXRoIHVuZGVmaW5lZCFcbiAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5zeW1ib2xzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc3ltYm9scy5wdXNoKGJhc2VTeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXhCeVN5bWJvbC5zZXQoYmFzZVN5bWJvbCwgaW5kZXgpO1xuICAgICAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgICAgICAgdGhpcy5hZGRTdW1tYXJ5KHN1bW1hcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9O1xuICAgIFRvSnNvblNlcmlhbGl6ZXIucHJvdG90eXBlLmxvYWRTdW1tYXJ5ID0gZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB2YXIgc3VtbWFyeSA9IHRoaXMuc3VtbWFyeVJlc29sdmVyLnJlc29sdmVTdW1tYXJ5KHN5bWJvbCk7XG4gICAgICAgIGlmICghc3VtbWFyeSkge1xuICAgICAgICAgICAgLy8gc29tZSBzeW1ib2xzIG1pZ2h0IG9yaWdpbmF0ZSBmcm9tIGEgcGxhaW4gdHlwZXNjcmlwdCBsaWJyYXJ5XG4gICAgICAgICAgICAvLyB0aGF0IGp1c3QgZXhwb3J0ZWQgLmQudHMgYW5kIC5tZXRhZGF0YS5qc29uIGZpbGVzLCBpLmUuIHdoZXJlIG5vIHN1bW1hcnlcbiAgICAgICAgICAgIC8vIGZpbGVzIHdlcmUgY3JlYXRlZC5cbiAgICAgICAgICAgIHZhciByZXNvbHZlZFN5bWJvbCA9IHRoaXMuc3ltYm9sUmVzb2x2ZXIucmVzb2x2ZVN5bWJvbChzeW1ib2wpO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgc3VtbWFyeSA9IHsgc3ltYm9sOiByZXNvbHZlZFN5bWJvbC5zeW1ib2wsIG1ldGFkYXRhOiByZXNvbHZlZFN5bWJvbC5tZXRhZGF0YSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW1tYXJ5O1xuICAgIH07XG4gICAgcmV0dXJuIFRvSnNvblNlcmlhbGl6ZXI7XG59KFZhbHVlVHJhbnNmb3JtZXIpKTtcbnZhciBGb3JKaXRTZXJpYWxpemVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZvckppdFNlcmlhbGl6ZXIob3V0cHV0Q3R4LCBzeW1ib2xSZXNvbHZlciwgc3VtbWFyeVJlc29sdmVyKSB7XG4gICAgICAgIHRoaXMub3V0cHV0Q3R4ID0gb3V0cHV0Q3R4O1xuICAgICAgICB0aGlzLnN5bWJvbFJlc29sdmVyID0gc3ltYm9sUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuc3VtbWFyeVJlc29sdmVyID0gc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICB9XG4gICAgRm9ySml0U2VyaWFsaXplci5wcm90b3R5cGUuYWRkU291cmNlVHlwZSA9IGZ1bmN0aW9uIChzdW1tYXJ5LCBtZXRhZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaCh7IHN1bW1hcnk6IHN1bW1hcnksIG1ldGFkYXRhOiBtZXRhZGF0YSwgaXNMaWJyYXJ5OiBmYWxzZSB9KTtcbiAgICB9O1xuICAgIEZvckppdFNlcmlhbGl6ZXIucHJvdG90eXBlLmFkZExpYlR5cGUgPSBmdW5jdGlvbiAoc3VtbWFyeSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaCh7IHN1bW1hcnk6IHN1bW1hcnksIG1ldGFkYXRhOiBudWxsLCBpc0xpYnJhcnk6IHRydWUgfSk7XG4gICAgfTtcbiAgICBGb3JKaXRTZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemUgPSBmdW5jdGlvbiAoZXhwb3J0QXNBcnIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGVfMSwgX2EsIGVfMiwgX2IsIGVfMywgX2M7XG4gICAgICAgIHZhciBleHBvcnRBc0J5U3ltYm9sID0gbmV3IE1hcCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgZXhwb3J0QXNBcnJfMSA9IF9fdmFsdWVzKGV4cG9ydEFzQXJyKSwgZXhwb3J0QXNBcnJfMV8xID0gZXhwb3J0QXNBcnJfMS5uZXh0KCk7ICFleHBvcnRBc0Fycl8xXzEuZG9uZTsgZXhwb3J0QXNBcnJfMV8xID0gZXhwb3J0QXNBcnJfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2QgPSBleHBvcnRBc0Fycl8xXzEudmFsdWUsIHN5bWJvbCA9IF9kLnN5bWJvbCwgZXhwb3J0QXMgPSBfZC5leHBvcnRBcztcbiAgICAgICAgICAgICAgICBleHBvcnRBc0J5U3ltYm9sLnNldChzeW1ib2wsIGV4cG9ydEFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydEFzQXJyXzFfMSAmJiAhZXhwb3J0QXNBcnJfMV8xLmRvbmUgJiYgKF9hID0gZXhwb3J0QXNBcnJfMS5yZXR1cm4pKSBfYS5jYWxsKGV4cG9ydEFzQXJyXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBuZ01vZHVsZVN5bWJvbHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfZSA9IF9fdmFsdWVzKHRoaXMuZGF0YSksIF9mID0gX2UubmV4dCgpOyAhX2YuZG9uZTsgX2YgPSBfZS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2cgPSBfZi52YWx1ZSwgc3VtbWFyeSA9IF9nLnN1bW1hcnksIG1ldGFkYXRhID0gX2cubWV0YWRhdGEsIGlzTGlicmFyeSA9IF9nLmlzTGlicmFyeTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeS5zdW1tYXJ5S2luZCA9PT0gQ29tcGlsZVN1bW1hcnlLaW5kLk5nTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHN5bWJvbHMgdGhhdCByZWZlciB0byBOZ01vZHVsZSBjbGFzc2VzLlxuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBqdXN0IHJlbHkgb24gYHN1bW1hcnkudHlwZS5zdW1tYXJ5S2luZGAgdG8gZGV0ZXJtaW5lIHRoaXMgYXNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWRkIHRoZSBzdW1tYXJpZXMgb2YgYWxsIHJlZmVyZW5jZWQgc3ltYm9scyB3aGVuIHdlIHNlcmlhbGl6ZSB0eXBlIHN1bW1hcmllcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHNlcmlhbGl6ZVN1bW1hcmllcyBmb3IgZGV0YWlscy5cbiAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVTeW1ib2xzLmFkZChzdW1tYXJ5LnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZFN1bW1hcnkgPSBzdW1tYXJ5O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2ggPSBfX3ZhbHVlcyhtb2RTdW1tYXJ5Lm1vZHVsZXMpLCBfaiA9IF9oLm5leHQoKTsgIV9qLmRvbmU7IF9qID0gX2gubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IF9qLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlU3ltYm9scy5hZGQobW9kLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaiAmJiAhX2ouZG9uZSAmJiAoX2MgPSBfaC5yZXR1cm4pKSBfYy5jYWxsKF9oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzTGlicmFyeSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm5OYW1lID0gc3VtbWFyeUZvckppdE5hbWUoc3VtbWFyeS50eXBlLnJlZmVyZW5jZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3VtbWFyeUZvckppdEZ1bmN0aW9uKHRoaXMub3V0cHV0Q3R4LCBzdW1tYXJ5LnR5cGUucmVmZXJlbmNlLCB0aGlzLnNlcmlhbGl6ZVN1bW1hcnlXaXRoRGVwcyhzdW1tYXJ5LCBtZXRhZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9mICYmICFfZi5kb25lICYmIChfYiA9IF9lLnJldHVybikpIF9iLmNhbGwoX2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIG5nTW9kdWxlU3ltYm9scy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZVN5bWJvbCkge1xuICAgICAgICAgICAgaWYgKF90aGlzLnN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlKG5nTW9kdWxlU3ltYm9sLmZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHZhciBleHBvcnRBcyA9IGV4cG9ydEFzQnlTeW1ib2wuZ2V0KG5nTW9kdWxlU3ltYm9sKSB8fCBuZ01vZHVsZVN5bWJvbC5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBqaXRFeHBvcnRBc05hbWUgPSBzdW1tYXJ5Rm9ySml0TmFtZShleHBvcnRBcyk7XG4gICAgICAgICAgICAgICAgX3RoaXMub3V0cHV0Q3R4LnN0YXRlbWVudHMucHVzaCh2YXJpYWJsZShqaXRFeHBvcnRBc05hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXQoX3RoaXMuc2VyaWFsaXplU3VtbWFyeVJlZihuZ01vZHVsZVN5bWJvbCkpXG4gICAgICAgICAgICAgICAgICAgIC50b0RlY2xTdG10KG51bGwsIFtTdG10TW9kaWZpZXIuRXhwb3J0ZWRdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRm9ySml0U2VyaWFsaXplci5wcm90b3R5cGUuc2VyaWFsaXplU3VtbWFyeVdpdGhEZXBzID0gZnVuY3Rpb24gKHN1bW1hcnksIG1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBleHByZXNzaW9ucyA9IFt0aGlzLnNlcmlhbGl6ZVN1bW1hcnkoc3VtbWFyeSldO1xuICAgICAgICB2YXIgcHJvdmlkZXJzID0gW107XG4gICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIENvbXBpbGVOZ01vZHVsZU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoLmFwcGx5KGV4cHJlc3Npb25zLCBfX3NwcmVhZChcbiAgICAgICAgICAgIC8vIEZvciBkaXJlY3RpdmVzIC8gcGlwZXMsIHdlIG9ubHkgYWRkIHRoZSBkZWNsYXJlZCBvbmVzLFxuICAgICAgICAgICAgLy8gYW5kIHJlbHkgb24gdHJhbnNpdGl2ZWx5IGltcG9ydGluZyBOZ01vZHVsZXMgdG8gZ2V0IHRoZSB0cmFuc2l0aXZlXG4gICAgICAgICAgICAvLyBzdW1tYXJpZXMuXG4gICAgICAgICAgICBtZXRhZGF0YS5kZWNsYXJlZERpcmVjdGl2ZXMuY29uY2F0KG1ldGFkYXRhLmRlY2xhcmVkUGlwZXMpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gdHlwZS5yZWZlcmVuY2U7IH0pXG4gICAgICAgICAgICAgICAgLy8gRm9yIG1vZHVsZXMsXG4gICAgICAgICAgICAgICAgLy8gd2UgYWxzbyBhZGQgdGhlIHN1bW1hcmllcyBmb3IgbW9kdWxlc1xuICAgICAgICAgICAgICAgIC8vIGZyb20gbGlicmFyaWVzLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgb2sgYXMgd2UgcHJvZHVjZSByZWV4cG9ydHMgZm9yIGFsbCB0cmFuc2l0aXZlIG1vZHVsZXMuXG4gICAgICAgICAgICAgICAgLmNvbmNhdChtZXRhZGF0YS50cmFuc2l0aXZlTW9kdWxlLm1vZHVsZXMubWFwKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlLnJlZmVyZW5jZTsgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIHJlZiAhPT0gbWV0YWRhdGEudHlwZS5yZWZlcmVuY2U7IH0pKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHJlZikgeyByZXR1cm4gX3RoaXMuc2VyaWFsaXplU3VtbWFyeVJlZihyZWYpOyB9KSkpO1xuICAgICAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgdXNlIGBOZ01vZHVsZVN1bW1hcnkucHJvdmlkZXJzYCwgYXMgdGhhdCBvbmUgaXMgdHJhbnNpdGl2ZSxcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBhbHJlYWR5IGhhdmUgdHJhbnNpdGl2ZSBtb2R1bGVzLlxuICAgICAgICAgICAgcHJvdmlkZXJzID0gbWV0YWRhdGEucHJvdmlkZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1bW1hcnkuc3VtbWFyeUtpbmQgPT09IENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHZhciBkaXJTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAgICAgICAgIHByb3ZpZGVycyA9IGRpclN1bW1hcnkucHJvdmlkZXJzLmNvbmNhdChkaXJTdW1tYXJ5LnZpZXdQcm92aWRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IFdlIGNhbid0IGp1c3QgcmVmZXIgdG8gdGhlIGBuZ3N1bW1hcnkudHNgIGZpbGVzIGZvciBgdXNlQ2xhc3NgIHByb3ZpZGVycyAoYXMgd2UgZG8gZm9yXG4gICAgICAgIC8vIGRlY2xhcmVkRGlyZWN0aXZlcyAvIGRlY2xhcmVkUGlwZXMpLCBhcyB3ZSBhbGxvd1xuICAgICAgICAvLyBwcm92aWRlcnMgd2l0aG91dCBjdG9yIGFyZ3VtZW50cyB0byBza2lwIHRoZSBgQEluamVjdGFibGVgIGRlY29yYXRvcixcbiAgICAgICAgLy8gaS5lLiB3ZSBkaWRuJ3QgZ2VuZXJhdGUgLm5nc3VtbWFyeS50cyBmaWxlcyBmb3IgdGhlc2UuXG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2guYXBwbHkoZXhwcmVzc2lvbnMsIF9fc3ByZWFkKHByb3ZpZGVycy5maWx0ZXIoZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiAhIXByb3ZpZGVyLnVzZUNsYXNzOyB9KS5tYXAoZnVuY3Rpb24gKHByb3ZpZGVyKSB7IHJldHVybiBfdGhpcy5zZXJpYWxpemVTdW1tYXJ5KHtcbiAgICAgICAgICAgIHN1bW1hcnlLaW5kOiBDb21waWxlU3VtbWFyeUtpbmQuSW5qZWN0YWJsZSwgdHlwZTogcHJvdmlkZXIudXNlQ2xhc3NcbiAgICAgICAgfSk7IH0pKSk7XG4gICAgICAgIHJldHVybiBsaXRlcmFsQXJyKGV4cHJlc3Npb25zKTtcbiAgICB9O1xuICAgIEZvckppdFNlcmlhbGl6ZXIucHJvdG90eXBlLnNlcmlhbGl6ZVN1bW1hcnlSZWYgPSBmdW5jdGlvbiAodHlwZVN5bWJvbCkge1xuICAgICAgICB2YXIgaml0SW1wb3J0ZWRTeW1ib2wgPSB0aGlzLnN5bWJvbFJlc29sdmVyLmdldFN0YXRpY1N5bWJvbChzdW1tYXJ5Rm9ySml0RmlsZU5hbWUodHlwZVN5bWJvbC5maWxlUGF0aCksIHN1bW1hcnlGb3JKaXROYW1lKHR5cGVTeW1ib2wubmFtZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRDdHguaW1wb3J0RXhwcihqaXRJbXBvcnRlZFN5bWJvbCk7XG4gICAgfTtcbiAgICBGb3JKaXRTZXJpYWxpemVyLnByb3RvdHlwZS5zZXJpYWxpemVTdW1tYXJ5ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdmFyIG91dHB1dEN0eCA9IHRoaXMub3V0cHV0Q3R4O1xuICAgICAgICB2YXIgVHJhbnNmb3JtZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBUcmFuc2Zvcm1lcigpIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdEFycmF5ID0gZnVuY3Rpb24gKGFyciwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpdGVyYWxBcnIoYXJyLm1hcChmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIHZpc2l0VmFsdWUoZW50cnksIF90aGlzLCBjb250ZXh0KTsgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdFN0cmluZ01hcCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbE1hcEV4cHIoT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gbmV3IExpdGVyYWxNYXBFbnRyeShrZXksIHZpc2l0VmFsdWUobWFwW2tleV0sIF90aGlzLCBjb250ZXh0KSwgZmFsc2UpOyB9KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgVHJhbnNmb3JtZXIucHJvdG90eXBlLnZpc2l0UHJpbWl0aXZlID0gZnVuY3Rpb24gKHZhbHVlLCBjb250ZXh0KSB7IHJldHVybiBsaXRlcmFsKHZhbHVlKTsgfTtcbiAgICAgICAgICAgIFRyYW5zZm9ybWVyLnByb3RvdHlwZS52aXNpdE90aGVyID0gZnVuY3Rpb24gKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRDdHguaW1wb3J0RXhwcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIFN0YXRlOiBFbmNvdW50ZXJlZCB2YWx1ZSBcIiArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVyO1xuICAgICAgICB9KCkpO1xuICAgICAgICByZXR1cm4gdmlzaXRWYWx1ZShkYXRhLCBuZXcgVHJhbnNmb3JtZXIoKSwgbnVsbCk7XG4gICAgfTtcbiAgICByZXR1cm4gRm9ySml0U2VyaWFsaXplcjtcbn0oKSk7XG52YXIgRnJvbUpzb25EZXNlcmlhbGl6ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZyb21Kc29uRGVzZXJpYWxpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZyb21Kc29uRGVzZXJpYWxpemVyKHN5bWJvbENhY2hlLCBzdW1tYXJ5UmVzb2x2ZXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc3ltYm9sQ2FjaGUgPSBzeW1ib2xDYWNoZTtcbiAgICAgICAgX3RoaXMuc3VtbWFyeVJlc29sdmVyID0gc3VtbWFyeVJlc29sdmVyO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZyb21Kc29uRGVzZXJpYWxpemVyLnByb3RvdHlwZS5kZXNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChsaWJyYXJ5RmlsZU5hbWUsIGpzb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICB2YXIgYWxsSW1wb3J0QXMgPSBbXTtcbiAgICAgICAgdGhpcy5zeW1ib2xzID0gZGF0YS5zeW1ib2xzLm1hcChmdW5jdGlvbiAoc2VyaWFsaXplZFN5bWJvbCkgeyByZXR1cm4gX3RoaXMuc3ltYm9sQ2FjaGUuZ2V0KF90aGlzLnN1bW1hcnlSZXNvbHZlci5mcm9tU3VtbWFyeUZpbGVOYW1lKHNlcmlhbGl6ZWRTeW1ib2wuZmlsZVBhdGgsIGxpYnJhcnlGaWxlTmFtZSksIHNlcmlhbGl6ZWRTeW1ib2wubmFtZSk7IH0pO1xuICAgICAgICBkYXRhLnN5bWJvbHMuZm9yRWFjaChmdW5jdGlvbiAoc2VyaWFsaXplZFN5bWJvbCwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBfdGhpcy5zeW1ib2xzW2luZGV4XTtcbiAgICAgICAgICAgIHZhciBpbXBvcnRBcyA9IHNlcmlhbGl6ZWRTeW1ib2wuaW1wb3J0QXM7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydEFzID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGFsbEltcG9ydEFzLnB1c2goeyBzeW1ib2w6IHN5bWJvbCwgaW1wb3J0QXM6IF90aGlzLnN5bWJvbHNbaW1wb3J0QXNdIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGltcG9ydEFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGFsbEltcG9ydEFzLnB1c2goeyBzeW1ib2w6IHN5bWJvbCwgaW1wb3J0QXM6IF90aGlzLnN5bWJvbENhY2hlLmdldChuZ2ZhY3RvcnlGaWxlUGF0aChsaWJyYXJ5RmlsZU5hbWUpLCBpbXBvcnRBcykgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgc3VtbWFyaWVzID0gdmlzaXRWYWx1ZShkYXRhLnN1bW1hcmllcywgdGhpcywgbnVsbCk7XG4gICAgICAgIHJldHVybiB7IG1vZHVsZU5hbWU6IGRhdGEubW9kdWxlTmFtZSwgc3VtbWFyaWVzOiBzdW1tYXJpZXMsIGltcG9ydEFzOiBhbGxJbXBvcnRBcyB9O1xuICAgIH07XG4gICAgRnJvbUpzb25EZXNlcmlhbGl6ZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwID0gZnVuY3Rpb24gKG1hcCwgY29udGV4dCkge1xuICAgICAgICBpZiAoJ19fc3ltYm9sJyBpbiBtYXApIHtcbiAgICAgICAgICAgIHZhciBiYXNlU3ltYm9sID0gdGhpcy5zeW1ib2xzW21hcFsnX19zeW1ib2wnXV07XG4gICAgICAgICAgICB2YXIgbWVtYmVycyA9IG1hcFsnbWVtYmVycyddO1xuICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnMubGVuZ3RoID8gdGhpcy5zeW1ib2xDYWNoZS5nZXQoYmFzZVN5bWJvbC5maWxlUGF0aCwgYmFzZVN5bWJvbC5uYW1lLCBtZW1iZXJzKSA6XG4gICAgICAgICAgICAgICAgYmFzZVN5bWJvbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0U3RyaW5nTWFwLmNhbGwodGhpcywgbWFwLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEZyb21Kc29uRGVzZXJpYWxpemVyO1xufShWYWx1ZVRyYW5zZm9ybWVyKSk7XG5mdW5jdGlvbiBpc0NhbGwobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gbWV0YWRhdGEgJiYgbWV0YWRhdGEuX19zeW1ib2xpYyA9PT0gJ2NhbGwnO1xufVxuZnVuY3Rpb24gaXNGdW5jdGlvbkNhbGwobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gaXNDYWxsKG1ldGFkYXRhKSAmJiB1bndyYXBSZXNvbHZlZE1ldGFkYXRhKG1ldGFkYXRhLmV4cHJlc3Npb24pIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sO1xufVxuZnVuY3Rpb24gaXNNZXRob2RDYWxsT25WYXJpYWJsZShtZXRhZGF0YSkge1xuICAgIHJldHVybiBpc0NhbGwobWV0YWRhdGEpICYmIG1ldGFkYXRhLmV4cHJlc3Npb24gJiYgbWV0YWRhdGEuZXhwcmVzc2lvbi5fX3N5bWJvbGljID09PSAnc2VsZWN0JyAmJlxuICAgICAgICB1bndyYXBSZXNvbHZlZE1ldGFkYXRhKG1ldGFkYXRhLmV4cHJlc3Npb24uZXhwcmVzc2lvbikgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2w7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBBb3RDb21waWxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBb3RDb21waWxlcihfY29uZmlnLCBfb3B0aW9ucywgX2hvc3QsIHJlZmxlY3RvciwgX21ldGFkYXRhUmVzb2x2ZXIsIF90ZW1wbGF0ZVBhcnNlciwgX3N0eWxlQ29tcGlsZXIsIF92aWV3Q29tcGlsZXIsIF90eXBlQ2hlY2tDb21waWxlciwgX25nTW9kdWxlQ29tcGlsZXIsIF9pbmplY3RhYmxlQ29tcGlsZXIsIF9vdXRwdXRFbWl0dGVyLCBfc3VtbWFyeVJlc29sdmVyLCBfc3ltYm9sUmVzb2x2ZXIpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gX2NvbmZpZztcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLl9ob3N0ID0gX2hvc3Q7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlc29sdmVyID0gX21ldGFkYXRhUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlUGFyc2VyID0gX3RlbXBsYXRlUGFyc2VyO1xuICAgICAgICB0aGlzLl9zdHlsZUNvbXBpbGVyID0gX3N0eWxlQ29tcGlsZXI7XG4gICAgICAgIHRoaXMuX3ZpZXdDb21waWxlciA9IF92aWV3Q29tcGlsZXI7XG4gICAgICAgIHRoaXMuX3R5cGVDaGVja0NvbXBpbGVyID0gX3R5cGVDaGVja0NvbXBpbGVyO1xuICAgICAgICB0aGlzLl9uZ01vZHVsZUNvbXBpbGVyID0gX25nTW9kdWxlQ29tcGlsZXI7XG4gICAgICAgIHRoaXMuX2luamVjdGFibGVDb21waWxlciA9IF9pbmplY3RhYmxlQ29tcGlsZXI7XG4gICAgICAgIHRoaXMuX291dHB1dEVtaXR0ZXIgPSBfb3V0cHV0RW1pdHRlcjtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVJlc29sdmVyID0gX3N1bW1hcnlSZXNvbHZlcjtcbiAgICAgICAgdGhpcy5fc3ltYm9sUmVzb2x2ZXIgPSBfc3ltYm9sUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlQXN0Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2FuYWx5emVkRmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2FuYWx5emVkRmlsZXNGb3JJbmplY3RhYmxlcyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuY2xlYXJDYWNoZSgpOyB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5hbmFseXplTW9kdWxlc1N5bmMgPSBmdW5jdGlvbiAocm9vdEZpbGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhbmFseXplUmVzdWx0ID0gYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzKHJvb3RGaWxlcywgdGhpcy5faG9zdCwgdGhpcy5fc3ltYm9sUmVzb2x2ZXIsIHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIpO1xuICAgICAgICBhbmFseXplUmVzdWx0Lm5nTW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZSkgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIubG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhKG5nTW9kdWxlLnR5cGUucmVmZXJlbmNlLCB0cnVlKTsgfSk7XG4gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0O1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmFuYWx5emVNb2R1bGVzQXN5bmMgPSBmdW5jdGlvbiAocm9vdEZpbGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhbmFseXplUmVzdWx0ID0gYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzKHJvb3RGaWxlcywgdGhpcy5faG9zdCwgdGhpcy5fc3ltYm9sUmVzb2x2ZXIsIHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZVxuICAgICAgICAgICAgLmFsbChhbmFseXplUmVzdWx0Lm5nTW9kdWxlcy5tYXAoZnVuY3Rpb24gKG5nTW9kdWxlKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5sb2FkTmdNb2R1bGVEaXJlY3RpdmVBbmRQaXBlTWV0YWRhdGEobmdNb2R1bGUudHlwZS5yZWZlcmVuY2UsIGZhbHNlKTsgfSkpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiBhbmFseXplUmVzdWx0OyB9KTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fYW5hbHl6ZUZpbGUgPSBmdW5jdGlvbiAoZmlsZU5hbWUpIHtcbiAgICAgICAgdmFyIGFuYWx5emVkRmlsZSA9IHRoaXMuX2FuYWx5emVkRmlsZXMuZ2V0KGZpbGVOYW1lKTtcbiAgICAgICAgaWYgKCFhbmFseXplZEZpbGUpIHtcbiAgICAgICAgICAgIGFuYWx5emVkRmlsZSA9XG4gICAgICAgICAgICAgICAgYW5hbHl6ZUZpbGUodGhpcy5faG9zdCwgdGhpcy5fc3ltYm9sUmVzb2x2ZXIsIHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2FuYWx5emVkRmlsZXMuc2V0KGZpbGVOYW1lLCBhbmFseXplZEZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbmFseXplZEZpbGU7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2FuYWx5emVGaWxlRm9ySW5qZWN0YWJsZXMgPSBmdW5jdGlvbiAoZmlsZU5hbWUpIHtcbiAgICAgICAgdmFyIGFuYWx5emVkRmlsZSA9IHRoaXMuX2FuYWx5emVkRmlsZXNGb3JJbmplY3RhYmxlcy5nZXQoZmlsZU5hbWUpO1xuICAgICAgICBpZiAoIWFuYWx5emVkRmlsZSkge1xuICAgICAgICAgICAgYW5hbHl6ZWRGaWxlID0gYW5hbHl6ZUZpbGVGb3JJbmplY3RhYmxlcyh0aGlzLl9ob3N0LCB0aGlzLl9zeW1ib2xSZXNvbHZlciwgdGhpcy5fbWV0YWRhdGFSZXNvbHZlciwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fYW5hbHl6ZWRGaWxlc0ZvckluamVjdGFibGVzLnNldChmaWxlTmFtZSwgYW5hbHl6ZWRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYW5hbHl6ZWRGaWxlO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmZpbmRHZW5lcmF0ZWRGaWxlTmFtZXMgPSBmdW5jdGlvbiAoZmlsZU5hbWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGdlbkZpbGVOYW1lcyA9IFtdO1xuICAgICAgICB2YXIgZmlsZSA9IHRoaXMuX2FuYWx5emVGaWxlKGZpbGVOYW1lKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNyZWF0ZSBhIC5uZ2ZhY3RvcnkgaWYgd2UgaGF2ZSBhIGluamVjdGFibGUvZGlyZWN0aXZlL3BpcGUvTmdNb2R1bGVcbiAgICAgICAgLy8gb3IgYSByZWZlcmVuY2UgdG8gYSBub24gc291cmNlIGZpbGUuXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgaXMgb3ZlcmVzdGltYXRpbmcgdGhlIHJlcXVpcmVkIC5uZ2ZhY3RvcnkgZmlsZXMgYXMgdGhlIHJlYWwgY2FsY3VsYXRpb24gaXMgaGFyZGVyLlxuICAgICAgICAvLyBPbmx5IGRvIHRoaXMgZm9yIFN0dWJFbWl0RmxhZ3MuQmFzaWMsIGFzIGFkZGluZyBhIHR5cGUgY2hlY2sgYmxvY2tcbiAgICAgICAgLy8gZG9lcyBub3QgY2hhbmdlIHRoaXMgZmlsZSAoYXMgd2UgZ2VuZXJhdGUgdHlwZSBjaGVjayBibG9ja3MgYmFzZWQgb24gTmdNb2R1bGVzKS5cbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYWxsb3dFbXB0eUNvZGVnZW5GaWxlcyB8fCBmaWxlLmRpcmVjdGl2ZXMubGVuZ3RoIHx8IGZpbGUucGlwZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBmaWxlLmluamVjdGFibGVzLmxlbmd0aCB8fCBmaWxlLm5nTW9kdWxlcy5sZW5ndGggfHwgZmlsZS5leHBvcnRzTm9uU291cmNlRmlsZXMpIHtcbiAgICAgICAgICAgIGdlbkZpbGVOYW1lcy5wdXNoKG5nZmFjdG9yeUZpbGVQYXRoKGZpbGUuZmlsZU5hbWUsIHRydWUpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmVuYWJsZVN1bW1hcmllc0ZvckppdCkge1xuICAgICAgICAgICAgICAgIGdlbkZpbGVOYW1lcy5wdXNoKHN1bW1hcnlGb3JKaXRGaWxlTmFtZShmaWxlLmZpbGVOYW1lLCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZpbGVTdWZmaXggPSBub3JtYWxpemVHZW5GaWxlU3VmZml4KHNwbGl0VHlwZXNjcmlwdFN1ZmZpeChmaWxlLmZpbGVOYW1lLCB0cnVlKVsxXSk7XG4gICAgICAgIGZpbGUuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJTeW1ib2wpIHtcbiAgICAgICAgICAgIHZhciBjb21wTWV0YSA9IF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE5vbk5vcm1hbGl6ZWREaXJlY3RpdmVNZXRhZGF0YShkaXJTeW1ib2wpLm1ldGFkYXRhO1xuICAgICAgICAgICAgaWYgKCFjb21wTWV0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBNZXRhIGlzIGEgY29tcG9uZW50IGFuZCB0aGVyZWZvcmUgdGVtcGxhdGUgaXMgbm9uIG51bGwuXG4gICAgICAgICAgICBjb21wTWV0YS50ZW1wbGF0ZS5zdHlsZVVybHMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVVcmwpIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9ybWFsaXplZFVybCA9IF90aGlzLl9ob3N0LnJlc291cmNlTmFtZVRvRmlsZU5hbWUoc3R5bGVVcmwsIGZpbGUuZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghbm9ybWFsaXplZFVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzeW50YXhFcnJvcihcIkNvdWxkbid0IHJlc29sdmUgcmVzb3VyY2UgXCIgKyBzdHlsZVVybCArIFwiIHJlbGF0aXZlIHRvIFwiICsgZmlsZS5maWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZWVkc1NoaW0gPSAoY29tcE1ldGEudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY29uZmlnLmRlZmF1bHRFbmNhcHN1bGF0aW9uKSA9PT0gVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQ7XG4gICAgICAgICAgICAgICAgZ2VuRmlsZU5hbWVzLnB1c2goX3N0eWxlc01vZHVsZVVybChub3JtYWxpemVkVXJsLCBuZWVkc1NoaW0sIGZpbGVTdWZmaXgpKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX29wdGlvbnMuYWxsb3dFbXB0eUNvZGVnZW5GaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBnZW5GaWxlTmFtZXMucHVzaChfc3R5bGVzTW9kdWxlVXJsKG5vcm1hbGl6ZWRVcmwsICFuZWVkc1NoaW0sIGZpbGVTdWZmaXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBnZW5GaWxlTmFtZXM7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuZW1pdEJhc2ljU3R1YiA9IGZ1bmN0aW9uIChnZW5GaWxlTmFtZSwgb3JpZ2luYWxGaWxlTmFtZSkge1xuICAgICAgICB2YXIgb3V0cHV0Q3R4ID0gdGhpcy5fY3JlYXRlT3V0cHV0Q29udGV4dChnZW5GaWxlTmFtZSk7XG4gICAgICAgIGlmIChnZW5GaWxlTmFtZS5lbmRzV2l0aCgnLm5nZmFjdG9yeS50cycpKSB7XG4gICAgICAgICAgICBpZiAoIW9yaWdpbmFsRmlsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3NlcnRpb24gZXJyb3I6IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGZpbGUgZm9yIC5uZ2ZhY3RvcnkudHMgc3R1YnMuIEZpbGU6IFwiICsgZ2VuRmlsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsRmlsZSA9IHRoaXMuX2FuYWx5emVGaWxlKG9yaWdpbmFsRmlsZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmdGYWN0b3J5U3R1YihvdXRwdXRDdHgsIG9yaWdpbmFsRmlsZSwgMSAvKiBCYXNpYyAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VuRmlsZU5hbWUuZW5kc1dpdGgoJy5uZ3N1bW1hcnkudHMnKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlU3VtbWFyaWVzRm9ySml0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbiBlcnJvcjogcmVxdWlyZSB0aGUgb3JpZ2luYWwgZmlsZSBmb3IgLm5nc3VtbWFyeS50cyBzdHVicy4gRmlsZTogXCIgKyBnZW5GaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEZpbGUgPSB0aGlzLl9hbmFseXplRmlsZShvcmlnaW5hbEZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICBfY3JlYXRlRW1wdHlTdHViKG91dHB1dEN0eCk7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxGaWxlLm5nTW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZXhwb3J0cyB0aGF0IHVzZXIgY29kZSBjYW4gcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvckppdFN0dWIob3V0cHV0Q3R4LCBuZ01vZHVsZS50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VuRmlsZU5hbWUuZW5kc1dpdGgoJy5uZ3N0eWxlLnRzJykpIHtcbiAgICAgICAgICAgIF9jcmVhdGVFbXB0eVN0dWIob3V0cHV0Q3R4KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBmb3IgdGhlIHN0dWJzLCB3ZSBkb24ndCBuZWVkIGEgcHJvcGVydHkgc3JjRmlsZVVybCxcbiAgICAgICAgLy8gYXMgbGF0ZXIgb24gaW4gZW1pdEFsbEltcGxzIHdlIHdpbGwgY3JlYXRlIHRoZSBwcm9wZXIgR2VuZXJhdGVkRmlsZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gY29ycmVjdCBzcmNGaWxlVXJsLlxuICAgICAgICAvLyBUaGlzIGlzIGdvb2QgYXMgZS5nLiBmb3IgLm5nc3R5bGUudHMgZmlsZXMgd2UgY2FuJ3QgZGVyaXZlXG4gICAgICAgIC8vIHRoZSB1cmwgb2YgY29tcG9uZW50cyBiYXNlZCBvbiB0aGUgZ2VuRmlsZVVybC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVnZW5Tb3VyY2VNb2R1bGUoJ3Vua25vd24nLCBvdXRwdXRDdHgpO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmVtaXRUeXBlQ2hlY2tTdHViID0gZnVuY3Rpb24gKGdlbkZpbGVOYW1lLCBvcmlnaW5hbEZpbGVOYW1lKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbEZpbGUgPSB0aGlzLl9hbmFseXplRmlsZShvcmlnaW5hbEZpbGVOYW1lKTtcbiAgICAgICAgdmFyIG91dHB1dEN0eCA9IHRoaXMuX2NyZWF0ZU91dHB1dENvbnRleHQoZ2VuRmlsZU5hbWUpO1xuICAgICAgICBpZiAoZ2VuRmlsZU5hbWUuZW5kc1dpdGgoJy5uZ2ZhY3RvcnkudHMnKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmdGYWN0b3J5U3R1YihvdXRwdXRDdHgsIG9yaWdpbmFsRmlsZSwgMiAvKiBUeXBlQ2hlY2sgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRDdHguc3RhdGVtZW50cy5sZW5ndGggPiAwID9cbiAgICAgICAgICAgIHRoaXMuX2NvZGVnZW5Tb3VyY2VNb2R1bGUob3JpZ2luYWxGaWxlLmZpbGVOYW1lLCBvdXRwdXRDdHgpIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUubG9hZEZpbGVzQXN5bmMgPSBmdW5jdGlvbiAoZmlsZU5hbWVzLCB0c0ZpbGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBmaWxlcyA9IGZpbGVOYW1lcy5tYXAoZnVuY3Rpb24gKGZpbGVOYW1lKSB7IHJldHVybiBfdGhpcy5fYW5hbHl6ZUZpbGUoZmlsZU5hbWUpOyB9KTtcbiAgICAgICAgdmFyIGxvYWRpbmdQcm9taXNlcyA9IFtdO1xuICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiBmaWxlLm5nTW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdQcm9taXNlcy5wdXNoKF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmxvYWROZ01vZHVsZURpcmVjdGl2ZUFuZFBpcGVNZXRhZGF0YShuZ01vZHVsZS50eXBlLnJlZmVyZW5jZSwgZmFsc2UpKTtcbiAgICAgICAgfSk7IH0pO1xuICAgICAgICB2YXIgYW5hbHl6ZWRJbmplY3RhYmxlcyA9IHRzRmlsZXMubWFwKGZ1bmN0aW9uICh0c0ZpbGUpIHsgcmV0dXJuIF90aGlzLl9hbmFseXplRmlsZUZvckluamVjdGFibGVzKHRzRmlsZSk7IH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobG9hZGluZ1Byb21pc2VzKS50aGVuKGZ1bmN0aW9uIChfKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgYW5hbHl6ZWRNb2R1bGVzOiBtZXJnZUFuZFZhbGlkYXRlTmdGaWxlcyhmaWxlcyksXG4gICAgICAgICAgICBhbmFseXplZEluamVjdGFibGVzOiBhbmFseXplZEluamVjdGFibGVzLFxuICAgICAgICB9KTsgfSk7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUubG9hZEZpbGVzU3luYyA9IGZ1bmN0aW9uIChmaWxlTmFtZXMsIHRzRmlsZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGZpbGVzID0gZmlsZU5hbWVzLm1hcChmdW5jdGlvbiAoZmlsZU5hbWUpIHsgcmV0dXJuIF90aGlzLl9hbmFseXplRmlsZShmaWxlTmFtZSk7IH0pO1xuICAgICAgICBmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7IHJldHVybiBmaWxlLm5nTW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChuZ01vZHVsZSkgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIubG9hZE5nTW9kdWxlRGlyZWN0aXZlQW5kUGlwZU1ldGFkYXRhKG5nTW9kdWxlLnR5cGUucmVmZXJlbmNlLCB0cnVlKTsgfSk7IH0pO1xuICAgICAgICB2YXIgYW5hbHl6ZWRJbmplY3RhYmxlcyA9IHRzRmlsZXMubWFwKGZ1bmN0aW9uICh0c0ZpbGUpIHsgcmV0dXJuIF90aGlzLl9hbmFseXplRmlsZUZvckluamVjdGFibGVzKHRzRmlsZSk7IH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYW5hbHl6ZWRNb2R1bGVzOiBtZXJnZUFuZFZhbGlkYXRlTmdGaWxlcyhmaWxlcyksXG4gICAgICAgICAgICBhbmFseXplZEluamVjdGFibGVzOiBhbmFseXplZEluamVjdGFibGVzLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jcmVhdGVOZ0ZhY3RvcnlTdHViID0gZnVuY3Rpb24gKG91dHB1dEN0eCwgZmlsZSwgZW1pdEZsYWdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjb21wb25lbnRJZCA9IDA7XG4gICAgICAgIGZpbGUubmdNb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG5nTW9kdWxlTWV0YSwgbmdNb2R1bGVJbmRleCkge1xuICAgICAgICAgICAgLy8gTm90ZTogdGhlIGNvZGUgYmVsb3cgbmVlZHMgdG8gZXhlY3V0ZWQgZm9yIFN0dWJFbWl0RmxhZ3MuQmFzaWMgYW5kIFN0dWJFbWl0RmxhZ3MuVHlwZUNoZWNrLFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSAubmdmYWN0b3J5IGZpbGUgdG9vIG11Y2ggd2hlbiBhZGRpbmcgdGhlIHR5cGUtY2hlY2sgYmxvY2suXG4gICAgICAgICAgICAvLyBjcmVhdGUgZXhwb3J0cyB0aGF0IHVzZXIgY29kZSBjYW4gcmVmZXJlbmNlXG4gICAgICAgICAgICBfdGhpcy5fbmdNb2R1bGVDb21waWxlci5jcmVhdGVTdHViKG91dHB1dEN0eCwgbmdNb2R1bGVNZXRhLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIC8vIGFkZCByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2xzIGZyb20gdGhlIG1ldGFkYXRhLlxuICAgICAgICAgICAgLy8gVGhlc2UgY2FuIGJlIHVzZWQgYnkgdGhlIHR5cGUgY2hlY2sgYmxvY2sgZm9yIGNvbXBvbmVudHMsXG4gICAgICAgICAgICAvLyBhbmQgdGhleSBhbHNvIGNhdXNlIFR5cGVTY3JpcHQgdG8gaW5jbHVkZSB0aGVzZSBmaWxlcyBpbnRvIHRoZSBwcm9ncmFtIHRvbyxcbiAgICAgICAgICAgIC8vIHdoaWNoIHdpbGwgbWFrZSB0aGVtIHBhcnQgb2YgdGhlIGFuYWx5emVkRmlsZXMuXG4gICAgICAgICAgICB2YXIgZXh0ZXJuYWxSZWZlcmVuY2VzID0gX19zcHJlYWQobmdNb2R1bGVNZXRhLnRyYW5zaXRpdmVNb2R1bGUuZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQucmVmZXJlbmNlOyB9KSwgbmdNb2R1bGVNZXRhLnRyYW5zaXRpdmVNb2R1bGUucGlwZXMubWFwKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnJlZmVyZW5jZTsgfSksIG5nTW9kdWxlTWV0YS5pbXBvcnRlZE1vZHVsZXMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnR5cGUucmVmZXJlbmNlOyB9KSwgbmdNb2R1bGVNZXRhLmV4cG9ydGVkTW9kdWxlcy5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0udHlwZS5yZWZlcmVuY2U7IH0pLCBfdGhpcy5fZXh0ZXJuYWxJZGVudGlmaWVyUmVmZXJlbmNlcyhbSWRlbnRpZmllcnMuVGVtcGxhdGVSZWYsIElkZW50aWZpZXJzLkVsZW1lbnRSZWZdKSk7XG4gICAgICAgICAgICB2YXIgZXh0ZXJuYWxSZWZlcmVuY2VWYXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2VzLmZvckVhY2goZnVuY3Rpb24gKHJlZiwgdHlwZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2VWYXJzLnNldChyZWYsIFwiX2RlY2xcIiArIG5nTW9kdWxlSW5kZXggKyBcIl9cIiArIHR5cGVJbmRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV4dGVybmFsUmVmZXJlbmNlVmFycy5mb3JFYWNoKGZ1bmN0aW9uICh2YXJOYW1lLCByZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRDdHguc3RhdGVtZW50cy5wdXNoKHZhcmlhYmxlKHZhck5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXQoTlVMTF9FWFBSLmNhc3QoRFlOQU1JQ19UWVBFKSlcbiAgICAgICAgICAgICAgICAgICAgLnRvRGVjbFN0bXQoZXhwcmVzc2lvblR5cGUob3V0cHV0Q3R4LmltcG9ydEV4cHIocmVmZXJlbmNlLCAvKiB0eXBlUGFyYW1zICovIG51bGwsIC8qIHVzZVN1bW1hcmllcyAqLyBmYWxzZSkpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlbWl0RmxhZ3MgJiAyIC8qIFR5cGVDaGVjayAqLykge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdHlwZS1jaGVjayBibG9jayBmb3IgYWxsIGNvbXBvbmVudHMgb2YgdGhlIE5nTW9kdWxlXG4gICAgICAgICAgICAgICAgbmdNb2R1bGVNZXRhLmRlY2xhcmVkRGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJJZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcE1ldGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVNZXRhZGF0YShkaXJJZC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBNZXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQrKztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2NyZWF0ZVR5cGVDaGVja0Jsb2NrKG91dHB1dEN0eCwgY29tcE1ldGEudHlwZS5yZWZlcmVuY2UubmFtZSArIFwiX0hvc3RfXCIgKyBjb21wb25lbnRJZCwgbmdNb2R1bGVNZXRhLCBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRIb3N0Q29tcG9uZW50TWV0YWRhdGEoY29tcE1ldGEpLCBbY29tcE1ldGEudHlwZV0sIGV4dGVybmFsUmVmZXJlbmNlVmFycyk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jcmVhdGVUeXBlQ2hlY2tCbG9jayhvdXRwdXRDdHgsIGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlLm5hbWUgKyBcIl9cIiArIGNvbXBvbmVudElkLCBuZ01vZHVsZU1ldGEsIGNvbXBNZXRhLCBuZ01vZHVsZU1ldGEudHJhbnNpdGl2ZU1vZHVsZS5kaXJlY3RpdmVzLCBleHRlcm5hbFJlZmVyZW5jZVZhcnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG91dHB1dEN0eC5zdGF0ZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX2NyZWF0ZUVtcHR5U3R1YihvdXRwdXRDdHgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2V4dGVybmFsSWRlbnRpZmllclJlZmVyZW5jZXMgPSBmdW5jdGlvbiAocmVmZXJlbmNlcykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgcmVmZXJlbmNlc18xID0gX192YWx1ZXMocmVmZXJlbmNlcyksIHJlZmVyZW5jZXNfMV8xID0gcmVmZXJlbmNlc18xLm5leHQoKTsgIXJlZmVyZW5jZXNfMV8xLmRvbmU7IHJlZmVyZW5jZXNfMV8xID0gcmVmZXJlbmNlc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2UgPSByZWZlcmVuY2VzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBjcmVhdGVUb2tlbkZvckV4dGVybmFsUmVmZXJlbmNlKHRoaXMucmVmbGVjdG9yLCByZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRva2VuLmlkZW50aWZpZXIucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VzXzFfMSAmJiAhcmVmZXJlbmNlc18xXzEuZG9uZSAmJiAoX2EgPSByZWZlcmVuY2VzXzEucmV0dXJuKSkgX2EuY2FsbChyZWZlcmVuY2VzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZVR5cGVDaGVja0Jsb2NrID0gZnVuY3Rpb24gKGN0eCwgY29tcG9uZW50SWQsIG1vZHVsZU1ldGEsIGNvbXBNZXRhLCBkaXJlY3RpdmVzLCBleHRlcm5hbFJlZmVyZW5jZVZhcnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLl9wYXJzZVRlbXBsYXRlKGNvbXBNZXRhLCBtb2R1bGVNZXRhLCBkaXJlY3RpdmVzKSwgcGFyc2VkVGVtcGxhdGUgPSBfYi50ZW1wbGF0ZSwgdXNlZFBpcGVzID0gX2IucGlwZXM7XG4gICAgICAgIChfYSA9IGN0eC5zdGF0ZW1lbnRzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZCh0aGlzLl90eXBlQ2hlY2tDb21waWxlci5jb21waWxlQ29tcG9uZW50KGNvbXBvbmVudElkLCBjb21wTWV0YSwgcGFyc2VkVGVtcGxhdGUsIHVzZWRQaXBlcywgZXh0ZXJuYWxSZWZlcmVuY2VWYXJzLCBjdHgpKSk7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuZW1pdE1lc3NhZ2VCdW5kbGUgPSBmdW5jdGlvbiAoYW5hbHl6ZVJlc3VsdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgICAgdmFyIGh0bWxQYXJzZXIgPSBuZXcgSHRtbFBhcnNlcigpO1xuICAgICAgICAvLyBUT0RPKHZpY2IpOiBpbXBsaWNpdCB0YWdzICYgYXR0cmlidXRlc1xuICAgICAgICB2YXIgbWVzc2FnZUJ1bmRsZSA9IG5ldyBNZXNzYWdlQnVuZGxlKGh0bWxQYXJzZXIsIFtdLCB7fSwgbG9jYWxlKTtcbiAgICAgICAgYW5hbHl6ZVJlc3VsdC5maWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG4gICAgICAgICAgICB2YXIgY29tcE1ldGFzID0gW107XG4gICAgICAgICAgICBmaWxlLmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyZWN0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciBkaXJNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoZGlyZWN0aXZlVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpck1ldGEgJiYgZGlyTWV0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb21wTWV0YXMucHVzaChkaXJNZXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbXBNZXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wTWV0YSkge1xuICAgICAgICAgICAgICAgIHZhciBodG1sID0gY29tcE1ldGEudGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgVVJMIHBvaW50cyB0byBlaXRoZXIgYW4gSFRNTCBvciBUUyBmaWxlIGRlcGVuZGluZyBvbiB3aGV0aGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGZpbGUgaXMgdXNlZCB3aXRoIGB0ZW1wbGF0ZVVybDpgIG9yIGB0ZW1wbGF0ZTpgLCByZXNwZWN0aXZlbHkuXG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlVXJsID0gY29tcE1ldGEudGVtcGxhdGUudGVtcGxhdGVVcmw7XG4gICAgICAgICAgICAgICAgdmFyIGludGVycG9sYXRpb25Db25maWcgPSBJbnRlcnBvbGF0aW9uQ29uZmlnLmZyb21BcnJheShjb21wTWV0YS50ZW1wbGF0ZS5pbnRlcnBvbGF0aW9uKTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIF9fc3ByZWFkKG1lc3NhZ2VCdW5kbGUudXBkYXRlRnJvbVRlbXBsYXRlKGh0bWwsIHRlbXBsYXRlVXJsLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9ycy5tYXAoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUudG9TdHJpbmcoKTsgfSkuam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmVtaXRBbGxQYXJ0aWFsTW9kdWxlcyA9IGZ1bmN0aW9uIChfYSwgcjNGaWxlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZSA9IF9hLm5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUsIGZpbGVzID0gX2EuZmlsZXM7XG4gICAgICAgIHZhciBjb250ZXh0TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIChmaWxlTmFtZSkge1xuICAgICAgICAgICAgaWYgKCFjb250ZXh0TWFwLmhhcyhmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0TWFwLnNldChmaWxlTmFtZSwgX3RoaXMuX2NyZWF0ZU91dHB1dENvbnRleHQoZmlsZU5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0TWFwLmdldChmaWxlTmFtZSk7XG4gICAgICAgIH07XG4gICAgICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIF90aGlzLl9jb21waWxlUGFydGlhbE1vZHVsZShmaWxlLmZpbGVOYW1lLCBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLCBmaWxlLmRpcmVjdGl2ZXMsIGZpbGUucGlwZXMsIGZpbGUubmdNb2R1bGVzLCBmaWxlLmluamVjdGFibGVzLCBnZXRDb250ZXh0KGZpbGUuZmlsZU5hbWUpKTsgfSk7XG4gICAgICAgIHIzRmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkgeyByZXR1cm4gX3RoaXMuX2NvbXBpbGVTaGFsbG93TW9kdWxlcyhmaWxlLmZpbGVOYW1lLCBmaWxlLnNoYWxsb3dNb2R1bGVzLCBnZXRDb250ZXh0KGZpbGUuZmlsZU5hbWUpKTsgfSk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGNvbnRleHRNYXAudmFsdWVzKCkpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiAoe1xuICAgICAgICAgICAgZmlsZU5hbWU6IGNvbnRleHQuZ2VuRmlsZVBhdGgsXG4gICAgICAgICAgICBzdGF0ZW1lbnRzOiBfX3NwcmVhZChjb250ZXh0LmNvbnN0YW50UG9vbC5zdGF0ZW1lbnRzLCBjb250ZXh0LnN0YXRlbWVudHMpLFxuICAgICAgICB9KTsgfSk7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVTaGFsbG93TW9kdWxlcyA9IGZ1bmN0aW9uIChmaWxlTmFtZSwgc2hhbGxvd01vZHVsZXMsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgc2hhbGxvd01vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobW9kdWxlKSB7IHJldHVybiBjb21waWxlTmdNb2R1bGVGcm9tUmVuZGVyMihjb250ZXh0LCBtb2R1bGUsIF90aGlzLl9pbmplY3RhYmxlQ29tcGlsZXIpOyB9KTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZVBhcnRpYWxNb2R1bGUgPSBmdW5jdGlvbiAoZmlsZU5hbWUsIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZXMsIGluamVjdGFibGVzLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgICAgdmFyIHNjaGVtYVJlZ2lzdHJ5ID0gbmV3IERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpO1xuICAgICAgICB2YXIgaG9zdEJpbmRpbmdQYXJzZXIgPSBuZXcgQmluZGluZ1BhcnNlcih0aGlzLl90ZW1wbGF0ZVBhcnNlci5leHByZXNzaW9uUGFyc2VyLCBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHLCBzY2hlbWFSZWdpc3RyeSwgW10sIGVycm9ycyk7XG4gICAgICAgIC8vIFByb2Nlc3MgYWxsIGNvbXBvbmVudHMgYW5kIGRpcmVjdGl2ZXNcbiAgICAgICAgZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmVUeXBlKSB7XG4gICAgICAgICAgICB2YXIgZGlyZWN0aXZlTWV0YWRhdGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVNZXRhZGF0YShkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVNZXRhZGF0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLmdldChkaXJlY3RpdmVUeXBlKTtcbiAgICAgICAgICAgICAgICBtb2R1bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBtb2R1bGUgZm9yIGNvbXBvbmVudCAnXCIgKyBpZGVudGlmaWVyTmFtZShkaXJlY3RpdmVNZXRhZGF0YS50eXBlKSArIFwiJ1wiKTtcbiAgICAgICAgICAgICAgICB2YXIgaHRtbEFzdCA9IGRpcmVjdGl2ZU1ldGFkYXRhLnRlbXBsYXRlLmh0bWxBc3Q7XG4gICAgICAgICAgICAgICAgdmFyIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBkaXJlY3RpdmVNZXRhZGF0YS50ZW1wbGF0ZS5wcmVzZXJ2ZVdoaXRlc3BhY2VzO1xuICAgICAgICAgICAgICAgIGlmICghcHJlc2VydmVXaGl0ZXNwYWNlcykge1xuICAgICAgICAgICAgICAgICAgICBodG1sQXN0ID0gcmVtb3ZlV2hpdGVzcGFjZXMoaHRtbEFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZW5kZXIzQXN0ID0gaHRtbEFzdFRvUmVuZGVyM0FzdChodG1sQXN0LnJvb3ROb2RlcywgaG9zdEJpbmRpbmdQYXJzZXIpO1xuICAgICAgICAgICAgICAgIC8vIE1hcCBvZiBTdGF0aWNUeXBlIGJ5IGRpcmVjdGl2ZSBzZWxlY3RvcnNcbiAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aXZlVHlwZUJ5U2VsXzEgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZXNfMSA9IG1vZHVsZS50cmFuc2l0aXZlTW9kdWxlLmRpcmVjdGl2ZXMubWFwKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldERpcmVjdGl2ZVN1bW1hcnkoZGlyLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXNfMS5mb3JFYWNoKGZ1bmN0aW9uIChkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlVHlwZUJ5U2VsXzEuc2V0KGRpcmVjdGl2ZS5zZWxlY3RvciwgZGlyZWN0aXZlLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE1hcCBvZiBTdGF0aWNUeXBlIGJ5IHBpcGUgbmFtZXNcbiAgICAgICAgICAgICAgICB2YXIgcGlwZVR5cGVCeU5hbWVfMSA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICB2YXIgcGlwZXNfMSA9IG1vZHVsZS50cmFuc2l0aXZlTW9kdWxlLnBpcGVzLm1hcChmdW5jdGlvbiAocGlwZSkgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0UGlwZVN1bW1hcnkocGlwZS5yZWZlcmVuY2UpOyB9KTtcbiAgICAgICAgICAgICAgICBwaXBlc18xLmZvckVhY2goZnVuY3Rpb24gKHBpcGUpIHsgcGlwZVR5cGVCeU5hbWVfMS5zZXQocGlwZS5uYW1lLCBwaXBlLnR5cGUucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgICAgICAgICAgY29tcGlsZUNvbXBvbmVudEZyb21SZW5kZXIyKGNvbnRleHQsIGRpcmVjdGl2ZU1ldGFkYXRhLCByZW5kZXIzQXN0LCBfdGhpcy5yZWZsZWN0b3IsIGhvc3RCaW5kaW5nUGFyc2VyLCBkaXJlY3RpdmVUeXBlQnlTZWxfMSwgcGlwZVR5cGVCeU5hbWVfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21waWxlRGlyZWN0aXZlRnJvbVJlbmRlcjIoY29udGV4dCwgZGlyZWN0aXZlTWV0YWRhdGEsIF90aGlzLnJlZmxlY3RvciwgaG9zdEJpbmRpbmdQYXJzZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcGlwZXMuZm9yRWFjaChmdW5jdGlvbiAocGlwZVR5cGUpIHtcbiAgICAgICAgICAgIHZhciBwaXBlTWV0YWRhdGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRQaXBlTWV0YWRhdGEocGlwZVR5cGUpO1xuICAgICAgICAgICAgaWYgKHBpcGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbXBpbGVQaXBlRnJvbVJlbmRlcjIoY29udGV4dCwgcGlwZU1ldGFkYXRhLCBfdGhpcy5yZWZsZWN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaW5qZWN0YWJsZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5qZWN0YWJsZSkgeyByZXR1cm4gX3RoaXMuX2luamVjdGFibGVDb21waWxlci5jb21waWxlKGluamVjdGFibGUsIGNvbnRleHQpOyB9KTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5lbWl0QWxsUGFydGlhbE1vZHVsZXMyID0gZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIFVzaW5nIHJlZHVjZSBsaWtlIHRoaXMgaXMgYSBzZWxlY3QgbWFueSBwYXR0ZXJuICh3aGVyZSBtYXAgaXMgYSBzZWxlY3QgcGF0dGVybilcbiAgICAgICAgcmV0dXJuIGZpbGVzLnJlZHVjZShmdW5jdGlvbiAociwgZmlsZSkge1xuICAgICAgICAgICAgci5wdXNoLmFwcGx5KHIsIF9fc3ByZWFkKF90aGlzLl9lbWl0UGFydGlhbE1vZHVsZTIoZmlsZS5maWxlTmFtZSwgZmlsZS5pbmplY3RhYmxlcykpKTtcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9LCBbXSk7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2VtaXRQYXJ0aWFsTW9kdWxlMiA9IGZ1bmN0aW9uIChmaWxlTmFtZSwgaW5qZWN0YWJsZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9jcmVhdGVPdXRwdXRDb250ZXh0KGZpbGVOYW1lKTtcbiAgICAgICAgaW5qZWN0YWJsZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5qZWN0YWJsZSkgeyByZXR1cm4gX3RoaXMuX2luamVjdGFibGVDb21waWxlci5jb21waWxlKGluamVjdGFibGUsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgaWYgKGNvbnRleHQuc3RhdGVtZW50cyAmJiBjb250ZXh0LnN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt7IGZpbGVOYW1lOiBmaWxlTmFtZSwgc3RhdGVtZW50czogX19zcHJlYWQoY29udGV4dC5jb25zdGFudFBvb2wuc3RhdGVtZW50cywgY29udGV4dC5zdGF0ZW1lbnRzKSB9XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuZW1pdEFsbEltcGxzID0gZnVuY3Rpb24gKGFuYWx5emVSZXN1bHQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUgPSBhbmFseXplUmVzdWx0Lm5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUsIGZpbGVzID0gYW5hbHl6ZVJlc3VsdC5maWxlcztcbiAgICAgICAgdmFyIHNvdXJjZU1vZHVsZXMgPSBmaWxlcy5tYXAoZnVuY3Rpb24gKGZpbGUpIHsgcmV0dXJuIF90aGlzLl9jb21waWxlSW1wbEZpbGUoZmlsZS5maWxlTmFtZSwgbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZSwgZmlsZS5kaXJlY3RpdmVzLCBmaWxlLnBpcGVzLCBmaWxlLm5nTW9kdWxlcywgZmlsZS5pbmplY3RhYmxlcyk7IH0pO1xuICAgICAgICByZXR1cm4gZmxhdHRlbihzb3VyY2VNb2R1bGVzKTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZUltcGxGaWxlID0gZnVuY3Rpb24gKHNyY0ZpbGVVcmwsIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZXMsIGluamVjdGFibGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBmaWxlU3VmZml4ID0gbm9ybWFsaXplR2VuRmlsZVN1ZmZpeChzcGxpdFR5cGVzY3JpcHRTdWZmaXgoc3JjRmlsZVVybCwgdHJ1ZSlbMV0pO1xuICAgICAgICB2YXIgZ2VuZXJhdGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdmFyIG91dHB1dEN0eCA9IHRoaXMuX2NyZWF0ZU91dHB1dENvbnRleHQobmdmYWN0b3J5RmlsZVBhdGgoc3JjRmlsZVVybCwgdHJ1ZSkpO1xuICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoLmFwcGx5KGdlbmVyYXRlZEZpbGVzLCBfX3NwcmVhZCh0aGlzLl9jcmVhdGVTdW1tYXJ5KHNyY0ZpbGVVcmwsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZXMsIGluamVjdGFibGVzLCBvdXRwdXRDdHgpKSk7XG4gICAgICAgIC8vIGNvbXBpbGUgYWxsIG5nIG1vZHVsZXNcbiAgICAgICAgbmdNb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG5nTW9kdWxlTWV0YSkgeyByZXR1cm4gX3RoaXMuX2NvbXBpbGVNb2R1bGUob3V0cHV0Q3R4LCBuZ01vZHVsZU1ldGEpOyB9KTtcbiAgICAgICAgLy8gY29tcGlsZSBjb21wb25lbnRzXG4gICAgICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyVHlwZSkge1xuICAgICAgICAgICAgdmFyIGNvbXBNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoZGlyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWNvbXBNZXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5nTW9kdWxlID0gbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZS5nZXQoZGlyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW5nTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW50ZXJuYWwgRXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgdGhlIG1vZHVsZSBmb3IgY29tcG9uZW50IFwiICsgaWRlbnRpZmllck5hbWUoY29tcE1ldGEudHlwZSkgKyBcIiFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb21waWxlIHN0eWxlc1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudFN0eWxlc2hlZXQgPSBfdGhpcy5fc3R5bGVDb21waWxlci5jb21waWxlQ29tcG9uZW50KG91dHB1dEN0eCwgY29tcE1ldGEpO1xuICAgICAgICAgICAgLy8gTm90ZTogY29tcE1ldGEgaXMgYSBjb21wb25lbnQgYW5kIHRoZXJlZm9yZSB0ZW1wbGF0ZSBpcyBub24gbnVsbC5cbiAgICAgICAgICAgIGNvbXBNZXRhLnRlbXBsYXRlLmV4dGVybmFsU3R5bGVzaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVzaGVldE1ldGEpIHtcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBmaWxsIG5vbiBzaGltIGFuZCBzaGltIHN0eWxlIGZpbGVzIGFzIHRoZXkgbWlnaHRcbiAgICAgICAgICAgICAgICAvLyBiZSBzaGFyZWQgYnkgY29tcG9uZW50IHdpdGggYW5kIHdpdGhvdXQgVmlld0VuY2Fwc3VsYXRpb24uXG4gICAgICAgICAgICAgICAgdmFyIHNoaW0gPSBfdGhpcy5fc3R5bGVDb21waWxlci5uZWVkc1N0eWxlU2hpbShjb21wTWV0YSk7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVkRmlsZXMucHVzaChfdGhpcy5fY29kZWdlblN0eWxlcyhzcmNGaWxlVXJsLCBjb21wTWV0YSwgc3R5bGVzaGVldE1ldGEsIHNoaW0sIGZpbGVTdWZmaXgpKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX29wdGlvbnMuYWxsb3dFbXB0eUNvZGVnZW5GaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWRGaWxlcy5wdXNoKF90aGlzLl9jb2RlZ2VuU3R5bGVzKHNyY0ZpbGVVcmwsIGNvbXBNZXRhLCBzdHlsZXNoZWV0TWV0YSwgIXNoaW0sIGZpbGVTdWZmaXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNvbXBpbGUgY29tcG9uZW50c1xuICAgICAgICAgICAgdmFyIGNvbXBWaWV3VmFycyA9IF90aGlzLl9jb21waWxlQ29tcG9uZW50KG91dHB1dEN0eCwgY29tcE1ldGEsIG5nTW9kdWxlLCBuZ01vZHVsZS50cmFuc2l0aXZlTW9kdWxlLmRpcmVjdGl2ZXMsIGNvbXBvbmVudFN0eWxlc2hlZXQsIGZpbGVTdWZmaXgpO1xuICAgICAgICAgICAgX3RoaXMuX2NvbXBpbGVDb21wb25lbnRGYWN0b3J5KG91dHB1dEN0eCwgY29tcE1ldGEsIG5nTW9kdWxlLCBmaWxlU3VmZml4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvdXRwdXRDdHguc3RhdGVtZW50cy5sZW5ndGggPiAwIHx8IHRoaXMuX29wdGlvbnMuYWxsb3dFbXB0eUNvZGVnZW5GaWxlcykge1xuICAgICAgICAgICAgdmFyIHNyY01vZHVsZSA9IHRoaXMuX2NvZGVnZW5Tb3VyY2VNb2R1bGUoc3JjRmlsZVVybCwgb3V0cHV0Q3R4KTtcbiAgICAgICAgICAgIGdlbmVyYXRlZEZpbGVzLnVuc2hpZnQoc3JjTW9kdWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2VuZXJhdGVkRmlsZXM7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZVN1bW1hcnkgPSBmdW5jdGlvbiAoc3JjRmlsZU5hbWUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZXMsIGluamVjdGFibGVzLCBuZ0ZhY3RvcnlDdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHN5bWJvbFN1bW1hcmllcyA9IHRoaXMuX3N5bWJvbFJlc29sdmVyLmdldFN5bWJvbHNPZihzcmNGaWxlTmFtZSlcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHN5bWJvbCkgeyByZXR1cm4gX3RoaXMuX3N5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2woc3ltYm9sKTsgfSk7XG4gICAgICAgIHZhciB0eXBlRGF0YSA9IF9fc3ByZWFkKG5nTW9kdWxlcy5tYXAoZnVuY3Rpb24gKG1ldGEpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBzdW1tYXJ5OiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXROZ01vZHVsZVN1bW1hcnkobWV0YS50eXBlLnJlZmVyZW5jZSksXG4gICAgICAgICAgICBtZXRhZGF0YTogX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShtZXRhLnR5cGUucmVmZXJlbmNlKVxuICAgICAgICB9KTsgfSksIGRpcmVjdGl2ZXMubWFwKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBzdW1tYXJ5OiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVTdW1tYXJ5KHJlZiksXG4gICAgICAgICAgICBtZXRhZGF0YTogX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEocmVmKVxuICAgICAgICB9KTsgfSksIHBpcGVzLm1hcChmdW5jdGlvbiAocmVmKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgc3VtbWFyeTogX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0UGlwZVN1bW1hcnkocmVmKSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRQaXBlTWV0YWRhdGEocmVmKVxuICAgICAgICB9KTsgfSksIGluamVjdGFibGVzLm1hcChmdW5jdGlvbiAocmVmKSB7IHJldHVybiAoe1xuICAgICAgICAgICAgc3VtbWFyeTogX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0SW5qZWN0YWJsZVN1bW1hcnkocmVmLnN5bWJvbCksXG4gICAgICAgICAgICBtZXRhZGF0YTogX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0SW5qZWN0YWJsZVN1bW1hcnkocmVmLnN5bWJvbCkudHlwZVxuICAgICAgICB9KTsgfSkpO1xuICAgICAgICB2YXIgZm9ySml0T3V0cHV0Q3R4ID0gdGhpcy5fb3B0aW9ucy5lbmFibGVTdW1tYXJpZXNGb3JKaXQgP1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlT3V0cHV0Q29udGV4dChzdW1tYXJ5Rm9ySml0RmlsZU5hbWUoc3JjRmlsZU5hbWUsIHRydWUpKSA6XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICB2YXIgX2EgPSBzZXJpYWxpemVTdW1tYXJpZXMoc3JjRmlsZU5hbWUsIGZvckppdE91dHB1dEN0eCwgdGhpcy5fc3VtbWFyeVJlc29sdmVyLCB0aGlzLl9zeW1ib2xSZXNvbHZlciwgc3ltYm9sU3VtbWFyaWVzLCB0eXBlRGF0YSwgdGhpcy5fb3B0aW9ucy5jcmVhdGVFeHRlcm5hbFN5bWJvbEZhY3RvcnlSZWV4cG9ydHMpLCBqc29uID0gX2EuanNvbiwgZXhwb3J0QXMgPSBfYS5leHBvcnRBcztcbiAgICAgICAgZXhwb3J0QXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgIG5nRmFjdG9yeUN0eC5zdGF0ZW1lbnRzLnB1c2godmFyaWFibGUoZW50cnkuZXhwb3J0QXMpLnNldChuZ0ZhY3RvcnlDdHguaW1wb3J0RXhwcihlbnRyeS5zeW1ib2wpKS50b0RlY2xTdG10KG51bGwsIFtcbiAgICAgICAgICAgICAgICBTdG10TW9kaWZpZXIuRXhwb3J0ZWRcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBzdW1tYXJ5SnNvbiA9IG5ldyBHZW5lcmF0ZWRGaWxlKHNyY0ZpbGVOYW1lLCBzdW1tYXJ5RmlsZU5hbWUoc3JjRmlsZU5hbWUpLCBqc29uKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtzdW1tYXJ5SnNvbl07XG4gICAgICAgIGlmIChmb3JKaXRPdXRwdXRDdHgpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuX2NvZGVnZW5Tb3VyY2VNb2R1bGUoc3JjRmlsZU5hbWUsIGZvckppdE91dHB1dEN0eCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVNb2R1bGUgPSBmdW5jdGlvbiAob3V0cHV0Q3R4LCBuZ01vZHVsZSkge1xuICAgICAgICB2YXIgcHJvdmlkZXJzID0gW107XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmxvY2FsZSkge1xuICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRMb2NhbGUgPSB0aGlzLl9vcHRpb25zLmxvY2FsZS5yZXBsYWNlKC9fL2csICctJyk7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG9rZW46IGNyZWF0ZVRva2VuRm9yRXh0ZXJuYWxSZWZlcmVuY2UodGhpcy5yZWZsZWN0b3IsIElkZW50aWZpZXJzLkxPQ0FMRV9JRCksXG4gICAgICAgICAgICAgICAgdXNlVmFsdWU6IG5vcm1hbGl6ZWRMb2NhbGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5pMThuRm9ybWF0KSB7XG4gICAgICAgICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG9rZW46IGNyZWF0ZVRva2VuRm9yRXh0ZXJuYWxSZWZlcmVuY2UodGhpcy5yZWZsZWN0b3IsIElkZW50aWZpZXJzLlRSQU5TTEFUSU9OU19GT1JNQVQpLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLl9vcHRpb25zLmkxOG5Gb3JtYXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25nTW9kdWxlQ29tcGlsZXIuY29tcGlsZShvdXRwdXRDdHgsIG5nTW9kdWxlLCBwcm92aWRlcnMpO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlQ29tcG9uZW50RmFjdG9yeSA9IGZ1bmN0aW9uIChvdXRwdXRDdHgsIGNvbXBNZXRhLCBuZ01vZHVsZSwgZmlsZVN1ZmZpeCkge1xuICAgICAgICB2YXIgaG9zdE1ldGEgPSB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldEhvc3RDb21wb25lbnRNZXRhZGF0YShjb21wTWV0YSk7XG4gICAgICAgIHZhciBob3N0Vmlld0ZhY3RvcnlWYXIgPSB0aGlzLl9jb21waWxlQ29tcG9uZW50KG91dHB1dEN0eCwgaG9zdE1ldGEsIG5nTW9kdWxlLCBbY29tcE1ldGEudHlwZV0sIG51bGwsIGZpbGVTdWZmaXgpXG4gICAgICAgICAgICAudmlld0NsYXNzVmFyO1xuICAgICAgICB2YXIgY29tcEZhY3RvcnlWYXIgPSBjb21wb25lbnRGYWN0b3J5TmFtZShjb21wTWV0YS50eXBlLnJlZmVyZW5jZSk7XG4gICAgICAgIHZhciBpbnB1dHNFeHBycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb21wTWV0YS5pbnB1dHMpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSBjb21wTWV0YS5pbnB1dHNbcHJvcE5hbWVdO1xuICAgICAgICAgICAgLy8gRG9uJ3QgcXVvdGUgc28gdGhhdCB0aGUga2V5IGdldHMgbWluaWZpZWQuLi5cbiAgICAgICAgICAgIGlucHV0c0V4cHJzLnB1c2gobmV3IExpdGVyYWxNYXBFbnRyeShwcm9wTmFtZSwgbGl0ZXJhbCh0ZW1wbGF0ZU5hbWUpLCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXRzRXhwcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gY29tcE1ldGEub3V0cHV0cykge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IGNvbXBNZXRhLm91dHB1dHNbcHJvcE5hbWVdO1xuICAgICAgICAgICAgLy8gRG9uJ3QgcXVvdGUgc28gdGhhdCB0aGUga2V5IGdldHMgbWluaWZpZWQuLi5cbiAgICAgICAgICAgIG91dHB1dHNFeHBycy5wdXNoKG5ldyBMaXRlcmFsTWFwRW50cnkocHJvcE5hbWUsIGxpdGVyYWwodGVtcGxhdGVOYW1lKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXRDdHguc3RhdGVtZW50cy5wdXNoKHZhcmlhYmxlKGNvbXBGYWN0b3J5VmFyKVxuICAgICAgICAgICAgLnNldChpbXBvcnRFeHByKElkZW50aWZpZXJzLmNyZWF0ZUNvbXBvbmVudEZhY3RvcnkpLmNhbGxGbihbXG4gICAgICAgICAgICBsaXRlcmFsKGNvbXBNZXRhLnNlbGVjdG9yKSwgb3V0cHV0Q3R4LmltcG9ydEV4cHIoY29tcE1ldGEudHlwZS5yZWZlcmVuY2UpLFxuICAgICAgICAgICAgdmFyaWFibGUoaG9zdFZpZXdGYWN0b3J5VmFyKSwgbmV3IExpdGVyYWxNYXBFeHByKGlucHV0c0V4cHJzKSxcbiAgICAgICAgICAgIG5ldyBMaXRlcmFsTWFwRXhwcihvdXRwdXRzRXhwcnMpLFxuICAgICAgICAgICAgbGl0ZXJhbEFycihjb21wTWV0YS50ZW1wbGF0ZS5uZ0NvbnRlbnRTZWxlY3RvcnMubWFwKGZ1bmN0aW9uIChzZWxlY3RvcikgeyByZXR1cm4gbGl0ZXJhbChzZWxlY3Rvcik7IH0pKVxuICAgICAgICBdKSlcbiAgICAgICAgICAgIC50b0RlY2xTdG10KGltcG9ydFR5cGUoSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeSwgW2V4cHJlc3Npb25UeXBlKG91dHB1dEN0eC5pbXBvcnRFeHByKGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlKSldLCBbVHlwZU1vZGlmaWVyLkNvbnN0XSksIFtTdG10TW9kaWZpZXIuRmluYWwsIFN0bXRNb2RpZmllci5FeHBvcnRlZF0pKTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZUNvbXBvbmVudCA9IGZ1bmN0aW9uIChvdXRwdXRDdHgsIGNvbXBNZXRhLCBuZ01vZHVsZSwgZGlyZWN0aXZlSWRlbnRpZmllcnMsIGNvbXBvbmVudFN0eWxlcywgZmlsZVN1ZmZpeCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLl9wYXJzZVRlbXBsYXRlKGNvbXBNZXRhLCBuZ01vZHVsZSwgZGlyZWN0aXZlSWRlbnRpZmllcnMpLCBwYXJzZWRUZW1wbGF0ZSA9IF9hLnRlbXBsYXRlLCB1c2VkUGlwZXMgPSBfYS5waXBlcztcbiAgICAgICAgdmFyIHN0eWxlc0V4cHIgPSBjb21wb25lbnRTdHlsZXMgPyB2YXJpYWJsZShjb21wb25lbnRTdHlsZXMuc3R5bGVzVmFyKSA6IGxpdGVyYWxBcnIoW10pO1xuICAgICAgICB2YXIgdmlld1Jlc3VsdCA9IHRoaXMuX3ZpZXdDb21waWxlci5jb21waWxlQ29tcG9uZW50KG91dHB1dEN0eCwgY29tcE1ldGEsIHBhcnNlZFRlbXBsYXRlLCBzdHlsZXNFeHByLCB1c2VkUGlwZXMpO1xuICAgICAgICBpZiAoY29tcG9uZW50U3R5bGVzKSB7XG4gICAgICAgICAgICBfcmVzb2x2ZVN0eWxlU3RhdGVtZW50cyh0aGlzLl9zeW1ib2xSZXNvbHZlciwgY29tcG9uZW50U3R5bGVzLCB0aGlzLl9zdHlsZUNvbXBpbGVyLm5lZWRzU3R5bGVTaGltKGNvbXBNZXRhKSwgZmlsZVN1ZmZpeCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdSZXN1bHQ7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX3BhcnNlVGVtcGxhdGUgPSBmdW5jdGlvbiAoY29tcE1ldGEsIG5nTW9kdWxlLCBkaXJlY3RpdmVJZGVudGlmaWVycykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGVBc3RDYWNoZS5oYXMoY29tcE1ldGEudHlwZS5yZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVBc3RDYWNoZS5nZXQoY29tcE1ldGEudHlwZS5yZWZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmVzZXJ2ZVdoaXRlc3BhY2VzID0gY29tcE1ldGEudGVtcGxhdGUucHJlc2VydmVXaGl0ZXNwYWNlcztcbiAgICAgICAgdmFyIGRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVJZGVudGlmaWVycy5tYXAoZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlU3VtbWFyeShkaXIucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgIHZhciBwaXBlcyA9IG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUucGlwZXMubWFwKGZ1bmN0aW9uIChwaXBlKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXRQaXBlU3VtbWFyeShwaXBlLnJlZmVyZW5jZSk7IH0pO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fdGVtcGxhdGVQYXJzZXIucGFyc2UoY29tcE1ldGEsIGNvbXBNZXRhLnRlbXBsYXRlLmh0bWxBc3QsIGRpcmVjdGl2ZXMsIHBpcGVzLCBuZ01vZHVsZS5zY2hlbWFzLCB0ZW1wbGF0ZVNvdXJjZVVybChuZ01vZHVsZS50eXBlLCBjb21wTWV0YSwgY29tcE1ldGEudGVtcGxhdGUpLCBwcmVzZXJ2ZVdoaXRlc3BhY2VzKTtcbiAgICAgICAgdGhpcy5fdGVtcGxhdGVBc3RDYWNoZS5zZXQoY29tcE1ldGEudHlwZS5yZWZlcmVuY2UsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBBb3RDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZU91dHB1dENvbnRleHQgPSBmdW5jdGlvbiAoZ2VuRmlsZVBhdGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGltcG9ydEV4cHIkMSA9IGZ1bmN0aW9uIChzeW1ib2wsIHR5cGVQYXJhbXMsIHVzZVN1bW1hcmllcykge1xuICAgICAgICAgICAgaWYgKHR5cGVQYXJhbXMgPT09IHZvaWQgMCkgeyB0eXBlUGFyYW1zID0gbnVsbDsgfVxuICAgICAgICAgICAgaWYgKHVzZVN1bW1hcmllcyA9PT0gdm9pZCAwKSB7IHVzZVN1bW1hcmllcyA9IHRydWU7IH1cbiAgICAgICAgICAgIGlmICghKHN5bWJvbCBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBpZGVudGlmaWVyIFwiICsgSlNPTi5zdHJpbmdpZnkoc3ltYm9sKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXJpdHkgPSBfdGhpcy5fc3ltYm9sUmVzb2x2ZXIuZ2V0VHlwZUFyaXR5KHN5bWJvbCkgfHwgMDtcbiAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLl9zeW1ib2xSZXNvbHZlci5nZXRJbXBvcnRBcyhzeW1ib2wsIHVzZVN1bW1hcmllcykgfHwgc3ltYm9sLCBmaWxlUGF0aCA9IF9hLmZpbGVQYXRoLCBuYW1lID0gX2EubmFtZSwgbWVtYmVycyA9IF9hLm1lbWJlcnM7XG4gICAgICAgICAgICB2YXIgaW1wb3J0TW9kdWxlID0gX3RoaXMuX2ZpbGVOYW1lVG9Nb2R1bGVOYW1lKGZpbGVQYXRoLCBnZW5GaWxlUGF0aCk7XG4gICAgICAgICAgICAvLyBJdCBzaG91bGQgYmUgZ29vZCBlbm91Z2ggdG8gY29tcGFyZSBmaWxlUGF0aCB0byBnZW5GaWxlUGF0aCBhbmQgaWYgdGhleSBhcmUgZXF1YWxcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgc2VsZiByZWZlcmVuY2UuIEhvd2V2ZXIsIG5nZmFjdG9yeSBmaWxlcyBnZW5lcmF0ZSB0byAudHMgYnV0IHRoZWlyXG4gICAgICAgICAgICAvLyBzeW1ib2xzIGhhdmUgLmQudHMgc28gYSBzaW1wbGUgY29tcGFyZSBpcyBpbnN1ZmZpY2llbnQuIFRoZXkgc2hvdWxkIGJlIGNhbm9uaWNhbFxuICAgICAgICAgICAgLy8gYW5kIGlzIHRyYWNrZWQgYnkgIzE3NzA1LlxuICAgICAgICAgICAgdmFyIHNlbGZSZWZlcmVuY2UgPSBfdGhpcy5fZmlsZU5hbWVUb01vZHVsZU5hbWUoZ2VuRmlsZVBhdGgsIGdlbkZpbGVQYXRoKTtcbiAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gaW1wb3J0TW9kdWxlID09PSBzZWxmUmVmZXJlbmNlID8gbnVsbCA6IGltcG9ydE1vZHVsZTtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhIHR5cGUgZXhwcmVzc2lvbiB0aGF0IHJlZmVycyB0byBhIGdlbmVyaWMgdHlwZSB0aGVuIHN1cHBseVxuICAgICAgICAgICAgLy8gdGhlIHJlcXVpcmVkIHR5cGUgcGFyYW1ldGVycy4gSWYgdGhlcmUgd2VyZSBub3QgZW5vdWdoIHR5cGUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgLy8gc3VwcGxpZWQsIHN1cHBseSBhbnkgYXMgdGhlIHR5cGUuIE91dHNpZGUgYSB0eXBlIGV4cHJlc3Npb24gdGhlIHJlZmVyZW5jZVxuICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBzdXBwbHkgdHlwZSBwYXJhbWV0ZXJzIGFuZCBiZSB0cmVhdGVkIGFzIGEgc2ltcGxlIHZhbHVlIHJlZmVyZW5jZVxuICAgICAgICAgICAgLy8gdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGl0c2VsZi5cbiAgICAgICAgICAgIHZhciBzdXBwbGllZFR5cGVQYXJhbXMgPSB0eXBlUGFyYW1zIHx8IFtdO1xuICAgICAgICAgICAgdmFyIG1pc3NpbmdUeXBlUGFyYW1zQ291bnQgPSBhcml0eSAtIHN1cHBsaWVkVHlwZVBhcmFtcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgYWxsVHlwZVBhcmFtcyA9IHN1cHBsaWVkVHlwZVBhcmFtcy5jb25jYXQobmV3IEFycmF5KG1pc3NpbmdUeXBlUGFyYW1zQ291bnQpLmZpbGwoRFlOQU1JQ19UWVBFKSk7XG4gICAgICAgICAgICByZXR1cm4gbWVtYmVycy5yZWR1Y2UoZnVuY3Rpb24gKGV4cHIsIG1lbWJlck5hbWUpIHsgcmV0dXJuIGV4cHIucHJvcChtZW1iZXJOYW1lKTsgfSwgaW1wb3J0RXhwcihuZXcgRXh0ZXJuYWxSZWZlcmVuY2UobW9kdWxlTmFtZSwgbmFtZSwgbnVsbCksIGFsbFR5cGVQYXJhbXMpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdGVtZW50czogW10sIGdlbkZpbGVQYXRoOiBnZW5GaWxlUGF0aCwgaW1wb3J0RXhwcjogaW1wb3J0RXhwciQxLCBjb25zdGFudFBvb2w6IG5ldyBDb25zdGFudFBvb2woKSB9O1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9maWxlTmFtZVRvTW9kdWxlTmFtZSA9IGZ1bmN0aW9uIChpbXBvcnRlZEZpbGVQYXRoLCBjb250YWluaW5nRmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlSZXNvbHZlci5nZXRLbm93bk1vZHVsZU5hbWUoaW1wb3J0ZWRGaWxlUGF0aCkgfHxcbiAgICAgICAgICAgIHRoaXMuX3N5bWJvbFJlc29sdmVyLmdldEtub3duTW9kdWxlTmFtZShpbXBvcnRlZEZpbGVQYXRoKSB8fFxuICAgICAgICAgICAgdGhpcy5faG9zdC5maWxlTmFtZVRvTW9kdWxlTmFtZShpbXBvcnRlZEZpbGVQYXRoLCBjb250YWluaW5nRmlsZVBhdGgpO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLl9jb2RlZ2VuU3R5bGVzID0gZnVuY3Rpb24gKHNyY0ZpbGVVcmwsIGNvbXBNZXRhLCBzdHlsZXNoZWV0TWV0YWRhdGEsIGlzU2hpbW1lZCwgZmlsZVN1ZmZpeCkge1xuICAgICAgICB2YXIgb3V0cHV0Q3R4ID0gdGhpcy5fY3JlYXRlT3V0cHV0Q29udGV4dChfc3R5bGVzTW9kdWxlVXJsKHN0eWxlc2hlZXRNZXRhZGF0YS5tb2R1bGVVcmwsIGlzU2hpbW1lZCwgZmlsZVN1ZmZpeCkpO1xuICAgICAgICB2YXIgY29tcGlsZWRTdHlsZXNoZWV0ID0gdGhpcy5fc3R5bGVDb21waWxlci5jb21waWxlU3R5bGVzKG91dHB1dEN0eCwgY29tcE1ldGEsIHN0eWxlc2hlZXRNZXRhZGF0YSwgaXNTaGltbWVkKTtcbiAgICAgICAgX3Jlc29sdmVTdHlsZVN0YXRlbWVudHModGhpcy5fc3ltYm9sUmVzb2x2ZXIsIGNvbXBpbGVkU3R5bGVzaGVldCwgaXNTaGltbWVkLCBmaWxlU3VmZml4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvZGVnZW5Tb3VyY2VNb2R1bGUoc3JjRmlsZVVybCwgb3V0cHV0Q3R4KTtcbiAgICB9O1xuICAgIEFvdENvbXBpbGVyLnByb3RvdHlwZS5fY29kZWdlblNvdXJjZU1vZHVsZSA9IGZ1bmN0aW9uIChzcmNGaWxlVXJsLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRGaWxlKHNyY0ZpbGVVcmwsIGN0eC5nZW5GaWxlUGF0aCwgY3R4LnN0YXRlbWVudHMpO1xuICAgIH07XG4gICAgQW90Q29tcGlsZXIucHJvdG90eXBlLmxpc3RMYXp5Um91dGVzID0gZnVuY3Rpb24gKGVudHJ5Um91dGUsIGFuYWx5emVkTW9kdWxlcykge1xuICAgICAgICB2YXIgZV8yLCBfYSwgZV8zLCBfYjtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICBpZiAoZW50cnlSb3V0ZSkge1xuICAgICAgICAgICAgdmFyIHN5bWJvbCA9IHBhcnNlTGF6eVJvdXRlKGVudHJ5Um91dGUsIHRoaXMucmVmbGVjdG9yKS5yZWZlcmVuY2VkTW9kdWxlO1xuICAgICAgICAgICAgcmV0dXJuIHZpc2l0TGF6eVJvdXRlKHN5bWJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYW5hbHl6ZWRNb2R1bGVzKSB7XG4gICAgICAgICAgICB2YXIgYWxsTGF6eVJvdXRlcyA9IFtdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IF9fdmFsdWVzKGFuYWx5emVkTW9kdWxlcy5uZ01vZHVsZXMpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZ01vZHVsZSA9IF9kLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGF6eVJvdXRlcyA9IGxpc3RMYXp5Um91dGVzKG5nTW9kdWxlLCB0aGlzLnJlZmxlY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsYXp5Um91dGVzXzEgPSBfX3ZhbHVlcyhsYXp5Um91dGVzKSwgbGF6eVJvdXRlc18xXzEgPSBsYXp5Um91dGVzXzEubmV4dCgpOyAhbGF6eVJvdXRlc18xXzEuZG9uZTsgbGF6eVJvdXRlc18xXzEgPSBsYXp5Um91dGVzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhenlSb3V0ZSA9IGxhenlSb3V0ZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbExhenlSb3V0ZXMucHVzaChsYXp5Um91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eVJvdXRlc18xXzEgJiYgIWxhenlSb3V0ZXNfMV8xLmRvbmUgJiYgKF9iID0gbGF6eVJvdXRlc18xLnJldHVybikpIF9iLmNhbGwobGF6eVJvdXRlc18xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9hID0gX2MucmV0dXJuKSkgX2EuY2FsbChfYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbGxMYXp5Um91dGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWl0aGVyIHJvdXRlIG9yIGFuYWx5emVkTW9kdWxlcyBoYXMgdG8gYmUgc3BlY2lmaWVkIVwiKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB2aXNpdExhenlSb3V0ZShzeW1ib2wsIHNlZW5Sb3V0ZXMsIGFsbExhenlSb3V0ZXMpIHtcbiAgICAgICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICAgICAgaWYgKHNlZW5Sb3V0ZXMgPT09IHZvaWQgMCkgeyBzZWVuUm91dGVzID0gbmV3IFNldCgpOyB9XG4gICAgICAgICAgICBpZiAoYWxsTGF6eVJvdXRlcyA9PT0gdm9pZCAwKSB7IGFsbExhenlSb3V0ZXMgPSBbXTsgfVxuICAgICAgICAgICAgLy8gU3VwcG9ydCBwb2ludGluZyB0byBkZWZhdWx0IGV4cG9ydHMsIGJ1dCBzdG9wIHJlY3Vyc2luZyB0aGVyZSxcbiAgICAgICAgICAgIC8vIGFzIHRoZSBTdGF0aWNSZWZsZWN0b3IgZG9lcyBub3QgeWV0IHN1cHBvcnQgZGVmYXVsdCBleHBvcnRzLlxuICAgICAgICAgICAgaWYgKHNlZW5Sb3V0ZXMuaGFzKHN5bWJvbCkgfHwgIXN5bWJvbC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbExhenlSb3V0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWVuUm91dGVzLmFkZChzeW1ib2wpO1xuICAgICAgICAgICAgdmFyIGxhenlSb3V0ZXMgPSBsaXN0TGF6eVJvdXRlcyhzZWxmLl9tZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEoc3ltYm9sLCB0cnVlKSwgc2VsZi5yZWZsZWN0b3IpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsYXp5Um91dGVzXzIgPSBfX3ZhbHVlcyhsYXp5Um91dGVzKSwgbGF6eVJvdXRlc18yXzEgPSBsYXp5Um91dGVzXzIubmV4dCgpOyAhbGF6eVJvdXRlc18yXzEuZG9uZTsgbGF6eVJvdXRlc18yXzEgPSBsYXp5Um91dGVzXzIubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYXp5Um91dGUgPSBsYXp5Um91dGVzXzJfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYWxsTGF6eVJvdXRlcy5wdXNoKGxhenlSb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpc2l0TGF6eVJvdXRlKGxhenlSb3V0ZS5yZWZlcmVuY2VkTW9kdWxlLCBzZWVuUm91dGVzLCBhbGxMYXp5Um91dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhenlSb3V0ZXNfMl8xICYmICFsYXp5Um91dGVzXzJfMS5kb25lICYmIChfYSA9IGxhenlSb3V0ZXNfMi5yZXR1cm4pKSBfYS5jYWxsKGxhenlSb3V0ZXNfMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbGxMYXp5Um91dGVzO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQW90Q29tcGlsZXI7XG59KCkpO1xuZnVuY3Rpb24gX2NyZWF0ZUVtcHR5U3R1YihvdXRwdXRDdHgpIHtcbiAgICAvLyBOb3RlOiBXZSBuZWVkIHRvIHByb2R1Y2UgYXQgbGVhc3Qgb25lIGltcG9ydCBzdGF0ZW1lbnQgc28gdGhhdFxuICAgIC8vIFR5cGVTY3JpcHQga25vd3MgdGhhdCB0aGUgZmlsZSBpcyBhbiBlczYgbW9kdWxlLiBPdGhlcndpc2Ugb3VyIGdlbmVyYXRlZFxuICAgIC8vIGV4cG9ydHMgLyBpbXBvcnRzIHdvbid0IGJlIGVtaXR0ZWQgcHJvcGVybHkgYnkgVHlwZVNjcmlwdC5cbiAgICBvdXRwdXRDdHguc3RhdGVtZW50cy5wdXNoKGltcG9ydEV4cHIoSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeSkudG9TdG10KCkpO1xufVxuZnVuY3Rpb24gX3Jlc29sdmVTdHlsZVN0YXRlbWVudHMoc3ltYm9sUmVzb2x2ZXIsIGNvbXBpbGVSZXN1bHQsIG5lZWRzU2hpbSwgZmlsZVN1ZmZpeCkge1xuICAgIGNvbXBpbGVSZXN1bHQuZGVwZW5kZW5jaWVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgICBkZXAuc2V0VmFsdWUoc3ltYm9sUmVzb2x2ZXIuZ2V0U3RhdGljU3ltYm9sKF9zdHlsZXNNb2R1bGVVcmwoZGVwLm1vZHVsZVVybCwgbmVlZHNTaGltLCBmaWxlU3VmZml4KSwgZGVwLm5hbWUpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9zdHlsZXNNb2R1bGVVcmwoc3R5bGVzaGVldFVybCwgc2hpbSwgc3VmZml4KSB7XG4gICAgcmV0dXJuIFwiXCIgKyBzdHlsZXNoZWV0VXJsICsgKHNoaW0gPyAnLnNoaW0nIDogJycpICsgXCIubmdzdHlsZVwiICsgc3VmZml4O1xufVxuZnVuY3Rpb24gYW5hbHl6ZU5nTW9kdWxlcyhmaWxlTmFtZXMsIGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXRhZGF0YVJlc29sdmVyKSB7XG4gICAgdmFyIGZpbGVzID0gX2FuYWx5emVGaWxlc0luY2x1ZGluZ05vblByb2dyYW1GaWxlcyhmaWxlTmFtZXMsIGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXRhZGF0YVJlc29sdmVyKTtcbiAgICByZXR1cm4gbWVyZ2VBbmFseXplZEZpbGVzKGZpbGVzKTtcbn1cbmZ1bmN0aW9uIGFuYWx5emVBbmRWYWxpZGF0ZU5nTW9kdWxlcyhmaWxlTmFtZXMsIGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXRhZGF0YVJlc29sdmVyKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5hbHl6ZWRNb2R1bGVzKGFuYWx5emVOZ01vZHVsZXMoZmlsZU5hbWVzLCBob3N0LCBzdGF0aWNTeW1ib2xSZXNvbHZlciwgbWV0YWRhdGFSZXNvbHZlcikpO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVBbmFseXplZE1vZHVsZXMoYW5hbHl6ZWRNb2R1bGVzKSB7XG4gICAgaWYgKGFuYWx5emVkTW9kdWxlcy5zeW1ib2xzTWlzc2luZ01vZHVsZSAmJiBhbmFseXplZE1vZHVsZXMuc3ltYm9sc01pc3NpbmdNb2R1bGUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtZXNzYWdlcyA9IGFuYWx5emVkTW9kdWxlcy5zeW1ib2xzTWlzc2luZ01vZHVsZS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIkNhbm5vdCBkZXRlcm1pbmUgdGhlIG1vZHVsZSBmb3IgY2xhc3MgXCIgKyBzLm5hbWUgKyBcIiBpbiBcIiArIHMuZmlsZVBhdGggKyBcIiEgQWRkIFwiICsgcy5uYW1lICsgXCIgdG8gdGhlIE5nTW9kdWxlIHRvIGZpeCBpdC5cIjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IHN5bnRheEVycm9yKG1lc3NhZ2VzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuYWx5emVkTW9kdWxlcztcbn1cbi8vIEFuYWx5emVzIGFsbCBvZiB0aGUgcHJvZ3JhbSBmaWxlcyxcbi8vIGluY2x1ZGluZyBmaWxlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgcHJvZ3JhbVxuLy8gYnV0IGFyZSByZWZlcmVuY2VkIGJ5IGFuIE5nTW9kdWxlLlxuZnVuY3Rpb24gX2FuYWx5emVGaWxlc0luY2x1ZGluZ05vblByb2dyYW1GaWxlcyhmaWxlTmFtZXMsIGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXRhZGF0YVJlc29sdmVyKSB7XG4gICAgdmFyIHNlZW5GaWxlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZmlsZXMgPSBbXTtcbiAgICB2YXIgdmlzaXRGaWxlID0gZnVuY3Rpb24gKGZpbGVOYW1lKSB7XG4gICAgICAgIGlmIChzZWVuRmlsZXMuaGFzKGZpbGVOYW1lKSB8fCAhaG9zdC5pc1NvdXJjZUZpbGUoZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgc2VlbkZpbGVzLmFkZChmaWxlTmFtZSk7XG4gICAgICAgIHZhciBhbmFseXplZEZpbGUgPSBhbmFseXplRmlsZShob3N0LCBzdGF0aWNTeW1ib2xSZXNvbHZlciwgbWV0YWRhdGFSZXNvbHZlciwgZmlsZU5hbWUpO1xuICAgICAgICBmaWxlcy5wdXNoKGFuYWx5emVkRmlsZSk7XG4gICAgICAgIGFuYWx5emVkRmlsZS5uZ01vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobmdNb2R1bGUpIHtcbiAgICAgICAgICAgIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RNZXRhKSB7IHJldHVybiB2aXNpdEZpbGUobW9kTWV0YS5yZWZlcmVuY2UuZmlsZVBhdGgpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBmaWxlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZU5hbWUpIHsgcmV0dXJuIHZpc2l0RmlsZShmaWxlTmFtZSk7IH0pO1xuICAgIHJldHVybiBmaWxlcztcbn1cbmZ1bmN0aW9uIGFuYWx5emVGaWxlKGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXRhZGF0YVJlc29sdmVyLCBmaWxlTmFtZSkge1xuICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgdmFyIHBpcGVzID0gW107XG4gICAgdmFyIGluamVjdGFibGVzID0gW107XG4gICAgdmFyIG5nTW9kdWxlcyA9IFtdO1xuICAgIHZhciBoYXNEZWNvcmF0b3JzID0gc3RhdGljU3ltYm9sUmVzb2x2ZXIuaGFzRGVjb3JhdG9ycyhmaWxlTmFtZSk7XG4gICAgdmFyIGV4cG9ydHNOb25Tb3VyY2VGaWxlcyA9IGZhbHNlO1xuICAgIC8vIERvbid0IGFuYWx5emUgLmQudHMgZmlsZXMgdGhhdCBoYXZlIG5vIGRlY29yYXRvcnMgYXMgYSBzaG9ydGN1dFxuICAgIC8vIHRvIHNwZWVkIHVwIHRoZSBhbmFseXNpcy4gVGhpcyBwcmV2ZW50cyB1cyBmcm9tXG4gICAgLy8gcmVzb2x2aW5nIHRoZSByZWZlcmVuY2VzIGluIHRoZXNlIGZpbGVzLlxuICAgIC8vIE5vdGU6IGV4cG9ydHNOb25Tb3VyY2VGaWxlcyBpcyBvbmx5IG5lZWRlZCB3aGVuIGNvbXBpbGluZyB3aXRoIHN1bW1hcmllcyxcbiAgICAvLyB3aGljaCBpcyBub3QgdGhlIGNhc2Ugd2hlbiAuZC50cyBmaWxlcyBhcmUgdHJlYXRlZCBhcyBpbnB1dCBmaWxlcy5cbiAgICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcuZC50cycpIHx8IGhhc0RlY29yYXRvcnMpIHtcbiAgICAgICAgc3RhdGljU3ltYm9sUmVzb2x2ZXIuZ2V0U3ltYm9sc09mKGZpbGVOYW1lKS5mb3JFYWNoKGZ1bmN0aW9uIChzeW1ib2wpIHtcbiAgICAgICAgICAgIHZhciByZXNvbHZlZFN5bWJvbCA9IHN0YXRpY1N5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2woc3ltYm9sKTtcbiAgICAgICAgICAgIHZhciBzeW1ib2xNZXRhID0gcmVzb2x2ZWRTeW1ib2wubWV0YWRhdGE7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbE1ldGEgfHwgc3ltYm9sTWV0YS5fX3N5bWJvbGljID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzTmdTeW1ib2wgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzeW1ib2xNZXRhLl9fc3ltYm9saWMgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZXNvbHZlci5pc0RpcmVjdGl2ZShzeW1ib2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzTmdTeW1ib2wgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVzLnB1c2goc3ltYm9sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFSZXNvbHZlci5pc1BpcGUoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICBpc05nU3ltYm9sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcGlwZXMucHVzaChzeW1ib2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhZGF0YVJlc29sdmVyLmlzTmdNb2R1bGUoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmdNb2R1bGUgPSBtZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEoc3ltYm9sLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZ01vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZ1N5bWJvbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZXMucHVzaChuZ01vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YWRhdGFSZXNvbHZlci5pc0luamVjdGFibGUoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICBpc05nU3ltYm9sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluamVjdGFibGUgPSBtZXRhZGF0YVJlc29sdmVyLmdldEluamVjdGFibGVNZXRhZGF0YShzeW1ib2wsIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluamVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTmdTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICBleHBvcnRzTm9uU291cmNlRmlsZXMgPVxuICAgICAgICAgICAgICAgICAgICBleHBvcnRzTm9uU291cmNlRmlsZXMgfHwgaXNWYWx1ZUV4cG9ydGluZ05vblNvdXJjZUZpbGUoaG9zdCwgc3ltYm9sTWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlTmFtZTogZmlsZU5hbWUsIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXMsIHBpcGVzOiBwaXBlcywgbmdNb2R1bGVzOiBuZ01vZHVsZXMsIGluamVjdGFibGVzOiBpbmplY3RhYmxlcywgZXhwb3J0c05vblNvdXJjZUZpbGVzOiBleHBvcnRzTm9uU291cmNlRmlsZXMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFuYWx5emVGaWxlRm9ySW5qZWN0YWJsZXMoaG9zdCwgc3RhdGljU3ltYm9sUmVzb2x2ZXIsIG1ldGFkYXRhUmVzb2x2ZXIsIGZpbGVOYW1lKSB7XG4gICAgdmFyIGluamVjdGFibGVzID0gW107XG4gICAgdmFyIHNoYWxsb3dNb2R1bGVzID0gW107XG4gICAgaWYgKHN0YXRpY1N5bWJvbFJlc29sdmVyLmhhc0RlY29yYXRvcnMoZmlsZU5hbWUpKSB7XG4gICAgICAgIHN0YXRpY1N5bWJvbFJlc29sdmVyLmdldFN5bWJvbHNPZihmaWxlTmFtZSkuZm9yRWFjaChmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgICAgICB2YXIgcmVzb2x2ZWRTeW1ib2wgPSBzdGF0aWNTeW1ib2xSZXNvbHZlci5yZXNvbHZlU3ltYm9sKHN5bWJvbCk7XG4gICAgICAgICAgICB2YXIgc3ltYm9sTWV0YSA9IHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhO1xuICAgICAgICAgICAgaWYgKCFzeW1ib2xNZXRhIHx8IHN5bWJvbE1ldGEuX19zeW1ib2xpYyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzeW1ib2xNZXRhLl9fc3ltYm9saWMgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZXNvbHZlci5pc0luamVjdGFibGUoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5qZWN0YWJsZSA9IG1ldGFkYXRhUmVzb2x2ZXIuZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHN5bWJvbCwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5qZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXRhZGF0YVJlc29sdmVyLmlzTmdNb2R1bGUoc3ltYm9sKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gbWV0YWRhdGFSZXNvbHZlci5nZXRTaGFsbG93TW9kdWxlTWV0YWRhdGEoc3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvd01vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZmlsZU5hbWU6IGZpbGVOYW1lLCBpbmplY3RhYmxlczogaW5qZWN0YWJsZXMsIHNoYWxsb3dNb2R1bGVzOiBzaGFsbG93TW9kdWxlcyB9O1xufVxuZnVuY3Rpb24gaXNWYWx1ZUV4cG9ydGluZ05vblNvdXJjZUZpbGUoaG9zdCwgbWV0YWRhdGEpIHtcbiAgICB2YXIgZXhwb3J0c05vblNvdXJjZUZpbGVzID0gZmFsc2U7XG4gICAgdmFyIFZpc2l0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFZpc2l0b3IoKSB7XG4gICAgICAgIH1cbiAgICAgICAgVmlzaXRvci5wcm90b3R5cGUudmlzaXRBcnJheSA9IGZ1bmN0aW9uIChhcnIsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiAodikgeyByZXR1cm4gdmlzaXRWYWx1ZSh2LCBfdGhpcywgY29udGV4dCk7IH0pO1xuICAgICAgICB9O1xuICAgICAgICBWaXNpdG9yLnByb3RvdHlwZS52aXNpdFN0cmluZ01hcCA9IGZ1bmN0aW9uIChtYXAsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdmlzaXRWYWx1ZShtYXBba2V5XSwgX3RoaXMsIGNvbnRleHQpOyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgVmlzaXRvci5wcm90b3R5cGUudmlzaXRQcmltaXRpdmUgPSBmdW5jdGlvbiAodmFsdWUsIGNvbnRleHQpIHsgfTtcbiAgICAgICAgVmlzaXRvci5wcm90b3R5cGUudmlzaXRPdGhlciA9IGZ1bmN0aW9uICh2YWx1ZSwgY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGljU3ltYm9sICYmICFob3N0LmlzU291cmNlRmlsZSh2YWx1ZS5maWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICBleHBvcnRzTm9uU291cmNlRmlsZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gVmlzaXRvcjtcbiAgICB9KCkpO1xuICAgIHZpc2l0VmFsdWUobWV0YWRhdGEsIG5ldyBWaXNpdG9yKCksIG51bGwpO1xuICAgIHJldHVybiBleHBvcnRzTm9uU291cmNlRmlsZXM7XG59XG5mdW5jdGlvbiBtZXJnZUFuYWx5emVkRmlsZXMoYW5hbHl6ZWRGaWxlcykge1xuICAgIHZhciBhbGxOZ01vZHVsZXMgPSBbXTtcbiAgICB2YXIgbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZSA9IG5ldyBNYXAoKTtcbiAgICB2YXIgYWxsUGlwZXNBbmREaXJlY3RpdmVzID0gbmV3IFNldCgpO1xuICAgIGFuYWx5emVkRmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoYWYpIHtcbiAgICAgICAgYWYubmdNb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG5nTW9kdWxlKSB7XG4gICAgICAgICAgICBhbGxOZ01vZHVsZXMucHVzaChuZ01vZHVsZSk7XG4gICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJlZERpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZCkgeyByZXR1cm4gbmdNb2R1bGVCeVBpcGVPckRpcmVjdGl2ZS5zZXQoZC5yZWZlcmVuY2UsIG5nTW9kdWxlKTsgfSk7XG4gICAgICAgICAgICBuZ01vZHVsZS5kZWNsYXJlZFBpcGVzLmZvckVhY2goZnVuY3Rpb24gKHApIHsgcmV0dXJuIG5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUuc2V0KHAucmVmZXJlbmNlLCBuZ01vZHVsZSk7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWYuZGlyZWN0aXZlcy5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7IHJldHVybiBhbGxQaXBlc0FuZERpcmVjdGl2ZXMuYWRkKGQpOyB9KTtcbiAgICAgICAgYWYucGlwZXMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyByZXR1cm4gYWxsUGlwZXNBbmREaXJlY3RpdmVzLmFkZChwKTsgfSk7XG4gICAgfSk7XG4gICAgdmFyIHN5bWJvbHNNaXNzaW5nTW9kdWxlID0gW107XG4gICAgYWxsUGlwZXNBbmREaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICBpZiAoIW5nTW9kdWxlQnlQaXBlT3JEaXJlY3RpdmUuaGFzKHJlZikpIHtcbiAgICAgICAgICAgIHN5bWJvbHNNaXNzaW5nTW9kdWxlLnB1c2gocmVmKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5nTW9kdWxlczogYWxsTmdNb2R1bGVzLFxuICAgICAgICBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlOiBuZ01vZHVsZUJ5UGlwZU9yRGlyZWN0aXZlLFxuICAgICAgICBzeW1ib2xzTWlzc2luZ01vZHVsZTogc3ltYm9sc01pc3NpbmdNb2R1bGUsXG4gICAgICAgIGZpbGVzOiBhbmFseXplZEZpbGVzXG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlQW5kVmFsaWRhdGVOZ0ZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlQW5hbHl6ZWRNb2R1bGVzKG1lcmdlQW5hbHl6ZWRGaWxlcyhmaWxlcykpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRk9STUFUVEVEX01FU1NBR0UgPSAnbmdGb3JtYXR0ZWRNZXNzYWdlJztcbmZ1bmN0aW9uIGluZGVudFN0cihsZXZlbCkge1xuICAgIGlmIChsZXZlbCA8PSAwKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgaWYgKGxldmVsIDwgNilcbiAgICAgICAgcmV0dXJuIFsnJywgJyAnLCAnICAnLCAnICAgJywgJyAgICAnLCAnICAgICAnXVtsZXZlbF07XG4gICAgdmFyIGhhbGYgPSBpbmRlbnRTdHIoTWF0aC5mbG9vcihsZXZlbCAvIDIpKTtcbiAgICByZXR1cm4gaGFsZiArIGhhbGYgKyAobGV2ZWwgJSAyID09PSAxID8gJyAnIDogJycpO1xufVxuZnVuY3Rpb24gZm9ybWF0Q2hhaW4oY2hhaW4sIGluZGVudCkge1xuICAgIGlmIChpbmRlbnQgPT09IHZvaWQgMCkgeyBpbmRlbnQgPSAwOyB9XG4gICAgaWYgKCFjaGFpbilcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIHZhciBwb3NpdGlvbiA9IGNoYWluLnBvc2l0aW9uID9cbiAgICAgICAgY2hhaW4ucG9zaXRpb24uZmlsZU5hbWUgKyBcIihcIiArIChjaGFpbi5wb3NpdGlvbi5saW5lICsgMSkgKyBcIixcIiArIChjaGFpbi5wb3NpdGlvbi5jb2x1bW4gKyAxKSArIFwiKVwiIDpcbiAgICAgICAgJyc7XG4gICAgdmFyIHByZWZpeCA9IHBvc2l0aW9uICYmIGluZGVudCA9PT0gMCA/IHBvc2l0aW9uICsgXCI6IFwiIDogJyc7XG4gICAgdmFyIHBvc3RmaXggPSBwb3NpdGlvbiAmJiBpbmRlbnQgIT09IDAgPyBcIiBhdCBcIiArIHBvc2l0aW9uIDogJyc7XG4gICAgdmFyIG1lc3NhZ2UgPSBcIlwiICsgcHJlZml4ICsgY2hhaW4ubWVzc2FnZSArIHBvc3RmaXg7XG4gICAgcmV0dXJuIFwiXCIgKyBpbmRlbnRTdHIoaW5kZW50KSArIG1lc3NhZ2UgKyAoKGNoYWluLm5leHQgJiYgKCdcXG4nICsgZm9ybWF0Q2hhaW4oY2hhaW4ubmV4dCwgaW5kZW50ICsgMikpKSB8fCAnJyk7XG59XG5mdW5jdGlvbiBmb3JtYXR0ZWRFcnJvcihjaGFpbikge1xuICAgIHZhciBtZXNzYWdlID0gZm9ybWF0Q2hhaW4oY2hhaW4pICsgJy4nO1xuICAgIHZhciBlcnJvciA9IHN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yW0ZPUk1BVFRFRF9NRVNTQUdFXSA9IHRydWU7XG4gICAgZXJyb3IuY2hhaW4gPSBjaGFpbjtcbiAgICBlcnJvci5wb3NpdGlvbiA9IGNoYWluLnBvc2l0aW9uO1xuICAgIHJldHVybiBlcnJvcjtcbn1cbmZ1bmN0aW9uIGlzRm9ybWF0dGVkRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gISFlcnJvcltGT1JNQVRURURfTUVTU0FHRV07XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBBTkdVTEFSX0NPUkUgPSAnQGFuZ3VsYXIvY29yZSc7XG52YXIgQU5HVUxBUl9ST1VURVIgPSAnQGFuZ3VsYXIvcm91dGVyJztcbnZhciBISURERU5fS0VZID0gL15cXCQuKlxcJCQvO1xudmFyIElHTk9SRSA9IHtcbiAgICBfX3N5bWJvbGljOiAnaWdub3JlJ1xufTtcbnZhciBVU0VfVkFMVUUkMSA9ICd1c2VWYWx1ZSc7XG52YXIgUFJPVklERSA9ICdwcm92aWRlJztcbnZhciBSRUZFUkVOQ0VfU0VUID0gbmV3IFNldChbVVNFX1ZBTFVFJDEsICd1c2VGYWN0b3J5JywgJ2RhdGEnLCAnaWQnLCAnbG9hZENoaWxkcmVuJ10pO1xudmFyIFRZUEVHVUFSRF9QT1NURklYID0gJ1R5cGVHdWFyZCc7XG52YXIgVVNFX0lGID0gJ1VzZUlmJztcbmZ1bmN0aW9uIHNob3VsZElnbm9yZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5fX3N5bWJvbGljID09ICdpZ25vcmUnO1xufVxuLyoqXG4gKiBBIHN0YXRpYyByZWZsZWN0b3IgaW1wbGVtZW50cyBlbm91Z2ggb2YgdGhlIFJlZmxlY3RvciBBUEkgdGhhdCBpcyBuZWNlc3NhcnkgdG8gY29tcGlsZVxuICogdGVtcGxhdGVzIHN0YXRpY2FsbHkuXG4gKi9cbnZhciBTdGF0aWNSZWZsZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RhdGljUmVmbGVjdG9yKHN1bW1hcnlSZXNvbHZlciwgc3ltYm9sUmVzb2x2ZXIsIGtub3duTWV0YWRhdGFDbGFzc2VzLCBrbm93bk1ldGFkYXRhRnVuY3Rpb25zLCBlcnJvclJlY29yZGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChrbm93bk1ldGFkYXRhQ2xhc3NlcyA9PT0gdm9pZCAwKSB7IGtub3duTWV0YWRhdGFDbGFzc2VzID0gW107IH1cbiAgICAgICAgaWYgKGtub3duTWV0YWRhdGFGdW5jdGlvbnMgPT09IHZvaWQgMCkgeyBrbm93bk1ldGFkYXRhRnVuY3Rpb25zID0gW107IH1cbiAgICAgICAgdGhpcy5zdW1tYXJ5UmVzb2x2ZXIgPSBzdW1tYXJ5UmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuc3ltYm9sUmVzb2x2ZXIgPSBzeW1ib2xSZXNvbHZlcjtcbiAgICAgICAgdGhpcy5lcnJvclJlY29yZGVyID0gZXJyb3JSZWNvcmRlcjtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc2hhbGxvd0Fubm90YXRpb25DYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eUNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlckNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLm1ldGhvZENhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnN0YXRpY0NhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNvbnZlcnNpb25NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRFeHRlcm5hbFJlZmVyZW5jZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkZvclBhcmVudENsYXNzV2l0aFN1bW1hcnlLaW5kID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVDb252ZXJzaW9uTWFwKCk7XG4gICAgICAgIGtub3duTWV0YWRhdGFDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGtjKSB7IHJldHVybiBfdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKF90aGlzLmdldFN0YXRpY1N5bWJvbChrYy5maWxlUGF0aCwga2MubmFtZSksIGtjLmN0b3IpOyB9KTtcbiAgICAgICAga25vd25NZXRhZGF0YUZ1bmN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChrZikgeyByZXR1cm4gX3RoaXMuX3JlZ2lzdGVyRnVuY3Rpb24oX3RoaXMuZ2V0U3RhdGljU3ltYm9sKGtmLmZpbGVQYXRoLCBrZi5uYW1lKSwga2YuZm4pOyB9KTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uRm9yUGFyZW50Q2xhc3NXaXRoU3VtbWFyeUtpbmQuc2V0KENvbXBpbGVTdW1tYXJ5S2luZC5EaXJlY3RpdmUsIFtjcmVhdGVEaXJlY3RpdmUsIGNyZWF0ZUNvbXBvbmVudF0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25Gb3JQYXJlbnRDbGFzc1dpdGhTdW1tYXJ5S2luZC5zZXQoQ29tcGlsZVN1bW1hcnlLaW5kLlBpcGUsIFtjcmVhdGVQaXBlXSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkZvclBhcmVudENsYXNzV2l0aFN1bW1hcnlLaW5kLnNldChDb21waWxlU3VtbWFyeUtpbmQuTmdNb2R1bGUsIFtjcmVhdGVOZ01vZHVsZV0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25Gb3JQYXJlbnRDbGFzc1dpdGhTdW1tYXJ5S2luZC5zZXQoQ29tcGlsZVN1bW1hcnlLaW5kLkluamVjdGFibGUsIFtjcmVhdGVJbmplY3RhYmxlLCBjcmVhdGVQaXBlLCBjcmVhdGVEaXJlY3RpdmUsIGNyZWF0ZUNvbXBvbmVudCwgY3JlYXRlTmdNb2R1bGVdKTtcbiAgICB9XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRNb2R1bGVVcmwgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICB2YXIgc3RhdGljU3ltYm9sID0gdGhpcy5maW5kU3ltYm9sRGVjbGFyYXRpb24odHlwZU9yRnVuYyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFJlc29sdmVyLmdldFJlc291cmNlUGF0aChzdGF0aWNTeW1ib2wpO1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UgPSBmdW5jdGlvbiAocmVmLCBjb250YWluaW5nRmlsZSkge1xuICAgICAgICB2YXIga2V5ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNvbnRhaW5pbmdGaWxlKSB7XG4gICAgICAgICAgICBrZXkgPSByZWYubW9kdWxlTmFtZSArIFwiOlwiICsgcmVmLm5hbWU7XG4gICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25TeW1ib2xfMSA9IHRoaXMucmVzb2x2ZWRFeHRlcm5hbFJlZmVyZW5jZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25TeW1ib2xfMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25TeW1ib2xfMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVmU3ltYm9sID0gdGhpcy5zeW1ib2xSZXNvbHZlci5nZXRTeW1ib2xCeU1vZHVsZShyZWYubW9kdWxlTmFtZSwgcmVmLm5hbWUsIGNvbnRhaW5pbmdGaWxlKTtcbiAgICAgICAgdmFyIGRlY2xhcmF0aW9uU3ltYm9sID0gdGhpcy5maW5kU3ltYm9sRGVjbGFyYXRpb24ocmVmU3ltYm9sKTtcbiAgICAgICAgaWYgKCFjb250YWluaW5nRmlsZSkge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xSZXNvbHZlci5yZWNvcmRNb2R1bGVOYW1lRm9yRmlsZU5hbWUocmVmU3ltYm9sLmZpbGVQYXRoLCByZWYubW9kdWxlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnN5bWJvbFJlc29sdmVyLnJlY29yZEltcG9ydEFzKGRlY2xhcmF0aW9uU3ltYm9sLCByZWZTeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRFeHRlcm5hbFJlZmVyZW5jZXMuc2V0KGtleSwgZGVjbGFyYXRpb25TeW1ib2wpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNsYXJhdGlvblN5bWJvbDtcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuZmluZERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG1vZHVsZVVybCwgbmFtZSwgY29udGFpbmluZ0ZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFN5bWJvbERlY2xhcmF0aW9uKHRoaXMuc3ltYm9sUmVzb2x2ZXIuZ2V0U3ltYm9sQnlNb2R1bGUobW9kdWxlVXJsLCBuYW1lLCBjb250YWluaW5nRmlsZSkpO1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS50cnlGaW5kRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAobW9kdWxlVXJsLCBuYW1lLCBjb250YWluaW5nRmlsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xSZXNvbHZlci5pZ25vcmVFcnJvcnNGb3IoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZmluZERlY2xhcmF0aW9uKG1vZHVsZVVybCwgbmFtZSwgY29udGFpbmluZ0ZpbGUpOyB9KTtcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuZmluZFN5bWJvbERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB2YXIgcmVzb2x2ZWRTeW1ib2wgPSB0aGlzLnN5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2woc3ltYm9sKTtcbiAgICAgICAgaWYgKHJlc29sdmVkU3ltYm9sKSB7XG4gICAgICAgICAgICB2YXIgcmVzb2x2ZWRNZXRhZGF0YSA9IHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkTWV0YWRhdGEgJiYgcmVzb2x2ZWRNZXRhZGF0YS5fX3N5bWJvbGljID09PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRNZXRhZGF0YSA9IHJlc29sdmVkTWV0YWRhdGEuc3ltYm9sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc29sdmVkTWV0YWRhdGEgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kU3ltYm9sRGVjbGFyYXRpb24ocmVzb2x2ZWRTeW1ib2wubWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzeW1ib2w7XG4gICAgfTtcbiAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLnRyeUFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsUmVjb3JkZXIgPSB0aGlzLmVycm9yUmVjb3JkZXI7XG4gICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlciA9IGZ1bmN0aW9uIChlcnJvciwgZmlsZU5hbWUpIHsgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25zKHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5lcnJvclJlY29yZGVyID0gb3JpZ2luYWxSZWNvcmRlcjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5hbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucyh0eXBlLCBmdW5jdGlvbiAodHlwZSwgZGVjb3JhdG9ycykgeyByZXR1cm4gX3RoaXMuc2ltcGxpZnkodHlwZSwgZGVjb3JhdG9ycyk7IH0sIHRoaXMuYW5ub3RhdGlvbkNhY2hlKTtcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuc2hhbGxvd0Fubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zKHR5cGUsIGZ1bmN0aW9uICh0eXBlLCBkZWNvcmF0b3JzKSB7IHJldHVybiBfdGhpcy5zaW1wbGlmeSh0eXBlLCBkZWNvcmF0b3JzLCB0cnVlKTsgfSwgdGhpcy5zaGFsbG93QW5ub3RhdGlvbkNhY2hlKTtcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuX2Fubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGUsIHNpbXBsaWZ5LCBhbm5vdGF0aW9uQ2FjaGUpIHtcbiAgICAgICAgdmFyIGFubm90YXRpb25zID0gYW5ub3RhdGlvbkNhY2hlLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKCFhbm5vdGF0aW9ucykge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIHZhciBjbGFzc01ldGFkYXRhID0gdGhpcy5nZXRUeXBlTWV0YWRhdGEodHlwZSk7XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHRoaXMuZmluZFBhcmVudFR5cGUodHlwZSwgY2xhc3NNZXRhZGF0YSk7XG4gICAgICAgICAgICBpZiAocGFyZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRBbm5vdGF0aW9ucyA9IHRoaXMuYW5ub3RhdGlvbnMocGFyZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucHVzaC5hcHBseShhbm5vdGF0aW9ucywgX19zcHJlYWQocGFyZW50QW5ub3RhdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvd25Bbm5vdGF0aW9uc18xID0gW107XG4gICAgICAgICAgICBpZiAoY2xhc3NNZXRhZGF0YVsnZGVjb3JhdG9ycyddKSB7XG4gICAgICAgICAgICAgICAgb3duQW5ub3RhdGlvbnNfMSA9IHNpbXBsaWZ5KHR5cGUsIGNsYXNzTWV0YWRhdGFbJ2RlY29yYXRvcnMnXSk7XG4gICAgICAgICAgICAgICAgaWYgKG93bkFubm90YXRpb25zXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucHVzaC5hcHBseShhbm5vdGF0aW9ucywgX19zcHJlYWQob3duQW5ub3RhdGlvbnNfMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnRUeXBlICYmICF0aGlzLnN1bW1hcnlSZXNvbHZlci5pc0xpYnJhcnlGaWxlKHR5cGUuZmlsZVBhdGgpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5UmVzb2x2ZXIuaXNMaWJyYXJ5RmlsZShwYXJlbnRUeXBlLmZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzdW1tYXJ5ID0gdGhpcy5zdW1tYXJ5UmVzb2x2ZXIucmVzb2x2ZVN1bW1hcnkocGFyZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXF1aXJlZEFubm90YXRpb25UeXBlcyA9IHRoaXMuYW5ub3RhdGlvbkZvclBhcmVudENsYXNzV2l0aFN1bW1hcnlLaW5kLmdldChzdW1tYXJ5LnR5cGUuc3VtbWFyeUtpbmQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZUhhc1JlcXVpcmVkQW5ub3RhdGlvbiA9IHJlcXVpcmVkQW5ub3RhdGlvblR5cGVzLnNvbWUoZnVuY3Rpb24gKHJlcXVpcmVkVHlwZSkgeyByZXR1cm4gb3duQW5ub3RhdGlvbnNfMS5zb21lKGZ1bmN0aW9uIChhbm4pIHsgcmV0dXJuIHJlcXVpcmVkVHlwZS5pc1R5cGVPZihhbm4pOyB9KTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHlwZUhhc1JlcXVpcmVkQW5ub3RhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihmb3JtYXRNZXRhZGF0YUVycm9yKG1ldGFkYXRhRXJyb3IoXCJDbGFzcyBcIiArIHR5cGUubmFtZSArIFwiIGluIFwiICsgdHlwZS5maWxlUGF0aCArIFwiIGV4dGVuZHMgZnJvbSBhIFwiICsgQ29tcGlsZVN1bW1hcnlLaW5kW3N1bW1hcnkudHlwZS5zdW1tYXJ5S2luZF0gKyBcIiBpbiBhbm90aGVyIGNvbXBpbGF0aW9uIHVuaXQgd2l0aG91dCBkdXBsaWNhdGluZyB0aGUgZGVjb3JhdG9yXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtbWFyeSAqLyB1bmRlZmluZWQsIFwiUGxlYXNlIGFkZCBhIFwiICsgcmVxdWlyZWRBbm5vdGF0aW9uVHlwZXMubWFwKGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlLm5nTWV0YWRhdGFOYW1lOyB9KS5qb2luKCcgb3IgJykgKyBcIiBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzXCIpLCB0eXBlKSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbm5vdGF0aW9uQ2FjaGUuc2V0KHR5cGUsIGFubm90YXRpb25zLmZpbHRlcihmdW5jdGlvbiAoYW5uKSB7IHJldHVybiAhIWFubjsgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhbm5vdGF0aW9ucztcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUucHJvcE1ldGFkYXRhID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHByb3BNZXRhZGF0YSA9IHRoaXMucHJvcGVydHlDYWNoZS5nZXQodHlwZSk7XG4gICAgICAgIGlmICghcHJvcE1ldGFkYXRhKSB7XG4gICAgICAgICAgICB2YXIgY2xhc3NNZXRhZGF0YSA9IHRoaXMuZ2V0VHlwZU1ldGFkYXRhKHR5cGUpO1xuICAgICAgICAgICAgcHJvcE1ldGFkYXRhID0ge307XG4gICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHRoaXMuZmluZFBhcmVudFR5cGUodHlwZSwgY2xhc3NNZXRhZGF0YSk7XG4gICAgICAgICAgICBpZiAocGFyZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wTWV0YWRhdGFfMSA9IHRoaXMucHJvcE1ldGFkYXRhKHBhcmVudFR5cGUpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmVudFByb3BNZXRhZGF0YV8xKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJlbnRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwYXJlbnRQcm9wXSA9IHBhcmVudFByb3BNZXRhZGF0YV8xW3BhcmVudFByb3BdO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1lbWJlcnNfMSA9IGNsYXNzTWV0YWRhdGFbJ21lbWJlcnMnXSB8fCB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1lbWJlcnNfMSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcERhdGEgPSBtZW1iZXJzXzFbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcERhdGFcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoZnVuY3Rpb24gKGEpIHsgcmV0dXJuIGFbJ19fc3ltYm9saWMnXSA9PSAncHJvcGVydHknIHx8IGFbJ19fc3ltYm9saWMnXSA9PSAnbWV0aG9kJzsgfSk7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcE1ldGFkYXRhW3Byb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2guYXBwbHkoZGVjb3JhdG9ycywgX19zcHJlYWQocHJvcE1ldGFkYXRhW3Byb3BOYW1lXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcE5hbWVdID0gZGVjb3JhdG9ycztcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wWydkZWNvcmF0b3JzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9ycy5wdXNoLmFwcGx5KGRlY29yYXRvcnMsIF9fc3ByZWFkKF90aGlzLnNpbXBsaWZ5KHR5cGUsIHByb3BbJ2RlY29yYXRvcnMnXSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydHlDYWNoZS5zZXQodHlwZSwgcHJvcE1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhO1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5wYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IobmV3IEVycm9yKFwicGFyYW1ldGVycyByZWNlaXZlZCBcIiArIEpTT04uc3RyaW5naWZ5KHR5cGUpICsgXCIgd2hpY2ggaXMgbm90IGEgU3RhdGljU3ltYm9sXCIpLCB0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnNfMSA9IHRoaXMucGFyYW1ldGVyQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzXzEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xhc3NNZXRhZGF0YSA9IHRoaXMuZ2V0VHlwZU1ldGFkYXRhKHR5cGUpO1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gdGhpcy5maW5kUGFyZW50VHlwZSh0eXBlLCBjbGFzc01ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICB2YXIgbWVtYmVycyA9IGNsYXNzTWV0YWRhdGEgPyBjbGFzc01ldGFkYXRhWydtZW1iZXJzJ10gOiBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBjdG9yRGF0YSA9IG1lbWJlcnMgPyBtZW1iZXJzWydfX2N0b3JfXyddIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3RvckRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN0b3IgPSBjdG9yRGF0YS5maW5kKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhWydfX3N5bWJvbGljJ10gPT0gJ2NvbnN0cnVjdG9yJzsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByYXdQYXJhbWV0ZXJUeXBlcyA9IGN0b3JbJ3BhcmFtZXRlcnMnXSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlckRlY29yYXRvcnNfMSA9IHRoaXMuc2ltcGxpZnkodHlwZSwgY3RvclsncGFyYW1ldGVyRGVjb3JhdG9ycyddIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc18xID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJhd1BhcmFtZXRlclR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHJhd1BhcmFtVHlwZSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRSZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbVR5cGUgPSBfdGhpcy50cnlTaW1wbGlmeSh0eXBlLCByYXdQYXJhbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZXN1bHQucHVzaChwYXJhbVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvcnMgPSBwYXJhbWV0ZXJEZWNvcmF0b3JzXzEgPyBwYXJhbWV0ZXJEZWNvcmF0b3JzXzFbaW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVzdWx0LnB1c2guYXBwbHkobmVzdGVkUmVzdWx0LCBfX3NwcmVhZChkZWNvcmF0b3JzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEucHVzaChuZXN0ZWRSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXzEgPSB0aGlzLnBhcmFtZXRlcnMocGFyZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyc18xKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNfMSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlckNhY2hlLnNldCh0eXBlLCBwYXJhbWV0ZXJzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnNfMTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCBvbiB0eXBlIFwiICsgSlNPTi5zdHJpbmdpZnkodHlwZSkgKyBcIiB3aXRoIGVycm9yIFwiICsgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLl9tZXRob2ROYW1lcyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBtZXRob2ROYW1lcyA9IHRoaXMubWV0aG9kQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAoIW1ldGhvZE5hbWVzKSB7XG4gICAgICAgICAgICB2YXIgY2xhc3NNZXRhZGF0YSA9IHRoaXMuZ2V0VHlwZU1ldGFkYXRhKHR5cGUpO1xuICAgICAgICAgICAgbWV0aG9kTmFtZXMgPSB7fTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gdGhpcy5maW5kUGFyZW50VHlwZSh0eXBlLCBjbGFzc01ldGFkYXRhKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudE1ldGhvZE5hbWVzXzEgPSB0aGlzLl9tZXRob2ROYW1lcyhwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJlbnRNZXRob2ROYW1lc18xKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJlbnRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVzW3BhcmVudFByb3BdID0gcGFyZW50TWV0aG9kTmFtZXNfMVtwYXJlbnRQcm9wXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtZW1iZXJzXzIgPSBjbGFzc01ldGFkYXRhWydtZW1iZXJzJ10gfHwge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtZW1iZXJzXzIpLmZvckVhY2goZnVuY3Rpb24gKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BEYXRhID0gbWVtYmVyc18yW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB2YXIgaXNNZXRob2QgPSBwcm9wRGF0YS5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhWydfX3N5bWJvbGljJ10gPT0gJ21ldGhvZCc7IH0pO1xuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVzW3Byb3BOYW1lXSA9IG1ldGhvZE5hbWVzW3Byb3BOYW1lXSB8fCBpc01ldGhvZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXRob2RDYWNoZS5zZXQodHlwZSwgbWV0aG9kTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRob2ROYW1lcztcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuX3N0YXRpY01lbWJlcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgc3RhdGljTWVtYmVycyA9IHRoaXMuc3RhdGljQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAoIXN0YXRpY01lbWJlcnMpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc01ldGFkYXRhID0gdGhpcy5nZXRUeXBlTWV0YWRhdGEodHlwZSk7XG4gICAgICAgICAgICB2YXIgc3RhdGljTWVtYmVyRGF0YSA9IGNsYXNzTWV0YWRhdGFbJ3N0YXRpY3MnXSB8fCB7fTtcbiAgICAgICAgICAgIHN0YXRpY01lbWJlcnMgPSBPYmplY3Qua2V5cyhzdGF0aWNNZW1iZXJEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGljQ2FjaGUuc2V0KHR5cGUsIHN0YXRpY01lbWJlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0aWNNZW1iZXJzO1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5maW5kUGFyZW50VHlwZSA9IGZ1bmN0aW9uICh0eXBlLCBjbGFzc01ldGFkYXRhKSB7XG4gICAgICAgIHZhciBwYXJlbnRUeXBlID0gdGhpcy50cnlTaW1wbGlmeSh0eXBlLCBjbGFzc01ldGFkYXRhWydleHRlbmRzJ10pO1xuICAgICAgICBpZiAocGFyZW50VHlwZSBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudFR5cGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7XG4gICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihcImhhc0xpZmVjeWNsZUhvb2sgcmVjZWl2ZWQgXCIgKyBKU09OLnN0cmluZ2lmeSh0eXBlKSArIFwiIHdoaWNoIGlzIG5vdCBhIFN0YXRpY1N5bWJvbFwiKSwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX21ldGhvZE5hbWVzKHR5cGUpW2xjUHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIG9uIHR5cGUgXCIgKyBKU09OLnN0cmluZ2lmeSh0eXBlKSArIFwiIHdpdGggZXJyb3IgXCIgKyBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuZ3VhcmRzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG5ldyBFcnJvcihcImd1YXJkcyByZWNlaXZlZCBcIiArIEpTT04uc3RyaW5naWZ5KHR5cGUpICsgXCIgd2hpY2ggaXMgbm90IGEgU3RhdGljU3ltYm9sXCIpLCB0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RhdGljTWVtYmVycyA9IHRoaXMuX3N0YXRpY01lbWJlcnModHlwZSk7XG4gICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIHN0YXRpY01lbWJlcnNfMSA9IF9fdmFsdWVzKHN0YXRpY01lbWJlcnMpLCBzdGF0aWNNZW1iZXJzXzFfMSA9IHN0YXRpY01lbWJlcnNfMS5uZXh0KCk7ICFzdGF0aWNNZW1iZXJzXzFfMS5kb25lOyBzdGF0aWNNZW1iZXJzXzFfMSA9IHN0YXRpY01lbWJlcnNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gc3RhdGljTWVtYmVyc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVfMS5lbmRzV2l0aChUWVBFR1VBUkRfUE9TVEZJWCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gbmFtZV8xLnN1YnN0cigwLCBuYW1lXzEubGVuZ3RoIC0gVFlQRUdVQVJEX1BPU1RGSVgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZW5kc1dpdGgoVVNFX0lGKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuYW1lXzEuc3Vic3RyKDAsIHByb3BlcnR5Lmxlbmd0aCAtIFVTRV9JRi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBVU0VfSUY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0U3RhdGljU3ltYm9sKHR5cGUuZmlsZVBhdGgsIHR5cGUubmFtZSwgW25hbWVfMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0aWNNZW1iZXJzXzFfMSAmJiAhc3RhdGljTWVtYmVyc18xXzEuZG9uZSAmJiAoX2EgPSBzdGF0aWNNZW1iZXJzXzEucmV0dXJuKSkgX2EuY2FsbChzdGF0aWNNZW1iZXJzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAodHlwZSwgY3Rvcikge1xuICAgICAgICB0aGlzLmNvbnZlcnNpb25NYXAuc2V0KHR5cGUsIGZ1bmN0aW9uIChjb250ZXh0LCBhcmdzKSB7IHJldHVybiBuZXcgKGN0b3IuYmluZC5hcHBseShjdG9yLCBfX3NwcmVhZChbdm9pZCAwXSwgYXJncykpKSgpOyB9KTtcbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuX3JlZ2lzdGVyRnVuY3Rpb24gPSBmdW5jdGlvbiAodHlwZSwgZm4pIHtcbiAgICAgICAgdGhpcy5jb252ZXJzaW9uTWFwLnNldCh0eXBlLCBmdW5jdGlvbiAoY29udGV4dCwgYXJncykgeyByZXR1cm4gZm4uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSk7XG4gICAgfTtcbiAgICBTdGF0aWNSZWZsZWN0b3IucHJvdG90eXBlLmluaXRpYWxpemVDb252ZXJzaW9uTWFwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnSW5qZWN0YWJsZScpLCBjcmVhdGVJbmplY3RhYmxlKTtcbiAgICAgICAgdGhpcy5pbmplY3Rpb25Ub2tlbiA9IHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0luamVjdGlvblRva2VuJyk7XG4gICAgICAgIHRoaXMub3BhcXVlVG9rZW4gPSB0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdPcGFxdWVUb2tlbicpO1xuICAgICAgICB0aGlzLlJPVVRFUyA9IHRoaXMudHJ5RmluZERlY2xhcmF0aW9uKEFOR1VMQVJfUk9VVEVSLCAnUk9VVEVTJyk7XG4gICAgICAgIHRoaXMuQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUyA9XG4gICAgICAgICAgICB0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTJyk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdIb3N0JyksIGNyZWF0ZUhvc3QpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnU2VsZicpLCBjcmVhdGVTZWxmKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ1NraXBTZWxmJyksIGNyZWF0ZVNraXBTZWxmKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0luamVjdCcpLCBjcmVhdGVJbmplY3QpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnT3B0aW9uYWwnKSwgY3JlYXRlT3B0aW9uYWwpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnQXR0cmlidXRlJyksIGNyZWF0ZUF0dHJpYnV0ZSk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdDb250ZW50Q2hpbGQnKSwgY3JlYXRlQ29udGVudENoaWxkKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0NvbnRlbnRDaGlsZHJlbicpLCBjcmVhdGVDb250ZW50Q2hpbGRyZW4pO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnVmlld0NoaWxkJyksIGNyZWF0ZVZpZXdDaGlsZCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdWaWV3Q2hpbGRyZW4nKSwgY3JlYXRlVmlld0NoaWxkcmVuKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0lucHV0JyksIGNyZWF0ZUlucHV0KTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ091dHB1dCcpLCBjcmVhdGVPdXRwdXQpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnUGlwZScpLCBjcmVhdGVQaXBlKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0hvc3RCaW5kaW5nJyksIGNyZWF0ZUhvc3RCaW5kaW5nKTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0hvc3RMaXN0ZW5lcicpLCBjcmVhdGVIb3N0TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnRGlyZWN0aXZlJyksIGNyZWF0ZURpcmVjdGl2ZSk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdDb21wb25lbnQnKSwgY3JlYXRlQ29tcG9uZW50KTtcbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ05nTW9kdWxlJyksIGNyZWF0ZU5nTW9kdWxlKTtcbiAgICAgICAgLy8gTm90ZTogU29tZSBtZXRhZGF0YSBjbGFzc2VzIGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdpdGggUHJvdmlkZXIuZGVwcy5cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJEZWNvcmF0b3JPckNvbnN0cnVjdG9yKHRoaXMuZmluZERlY2xhcmF0aW9uKEFOR1VMQVJfQ09SRSwgJ0hvc3QnKSwgY3JlYXRlSG9zdCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdG9yT3JDb25zdHJ1Y3Rvcih0aGlzLmZpbmREZWNsYXJhdGlvbihBTkdVTEFSX0NPUkUsICdTZWxmJyksIGNyZWF0ZVNlbGYpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnU2tpcFNlbGYnKSwgY3JlYXRlU2tpcFNlbGYpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckRlY29yYXRvck9yQ29uc3RydWN0b3IodGhpcy5maW5kRGVjbGFyYXRpb24oQU5HVUxBUl9DT1JFLCAnT3B0aW9uYWwnKSwgY3JlYXRlT3B0aW9uYWwpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogZ2V0U3RhdGljU3ltYm9sIHByb2R1Y2VzIGEgVHlwZSB3aG9zZSBtZXRhZGF0YSBpcyBrbm93biBidXQgd2hvc2UgaW1wbGVtZW50YXRpb24gaXMgbm90IGxvYWRlZC5cbiAgICAgKiBBbGwgdHlwZXMgcGFzc2VkIHRvIHRoZSBTdGF0aWNSZXNvbHZlciBzaG91bGQgYmUgcHNldWRvLXR5cGVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlY2xhcmF0aW9uRmlsZSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB3aGVyZSB0aGUgc3ltYm9sIGlzIGRlY2xhcmVkXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUuXG4gICAgICovXG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5nZXRTdGF0aWNTeW1ib2wgPSBmdW5jdGlvbiAoZGVjbGFyYXRpb25GaWxlLCBuYW1lLCBtZW1iZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFJlc29sdmVyLmdldFN0YXRpY1N5bWJvbChkZWNsYXJhdGlvbkZpbGUsIG5hbWUsIG1lbWJlcnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2ltcGxpZnkgYnV0IGRpc2NhcmQgYW55IGVycm9yc1xuICAgICAqL1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUudHJ5U2ltcGxpZnkgPSBmdW5jdGlvbiAoY29udGV4dCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsUmVjb3JkZXIgPSB0aGlzLmVycm9yUmVjb3JkZXI7XG4gICAgICAgIHRoaXMuZXJyb3JSZWNvcmRlciA9IGZ1bmN0aW9uIChlcnJvciwgZmlsZU5hbWUpIHsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuc2ltcGxpZnkoY29udGV4dCwgdmFsdWUpO1xuICAgICAgICB0aGlzLmVycm9yUmVjb3JkZXIgPSBvcmlnaW5hbFJlY29yZGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuc2ltcGxpZnkgPSBmdW5jdGlvbiAoY29udGV4dCwgdmFsdWUsIGxhenkpIHtcbiAgICAgICAgaWYgKGxhenkgPT09IHZvaWQgMCkgeyBsYXp5ID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgc2NvcGUgPSBCaW5kaW5nU2NvcGUkMS5lbXB0eTtcbiAgICAgICAgdmFyIGNhbGxpbmcgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5SW5Db250ZXh0KGNvbnRleHQsIHZhbHVlLCBkZXB0aCwgcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVJlZmVyZW5jZVZhbHVlKHN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFN5bWJvbCA9IHNlbGYuc3ltYm9sUmVzb2x2ZXIucmVzb2x2ZVN5bWJvbChzdGF0aWNTeW1ib2wpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFN5bWJvbCA/IHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5RWFnZXJseSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeUluQ29udGV4dChjb250ZXh0LCB2YWx1ZSwgZGVwdGgsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gc2ltcGxpZnlMYXppbHkodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlJbkNvbnRleHQoY29udGV4dCwgdmFsdWUsIGRlcHRoLCByZWZlcmVuY2VzICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzaW1wbGlmeU5lc3RlZChuZXN0ZWRDb250ZXh0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChuZXN0ZWRDb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGhhc24ndCBjaGFuZ2VkIGxldCB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZSB1bm1vZGlmaWVkLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlJbkNvbnRleHQobmVzdGVkQ29udGV4dCwgdmFsdWUsIGRlcHRoICsgMSwgcmVmZXJlbmNlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeUluQ29udGV4dChuZXN0ZWRDb250ZXh0LCB2YWx1ZSwgZGVwdGggKyAxLCByZWZlcmVuY2VzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTWV0YWRhdGFFcnJvcihlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBtZXNzYWdlIHRleHQgdXAgYnV0IGFkZCBhIG1lc3NhZ2UgdG8gdGhlIGNoYWluIHRoYXQgZXhwbGFpbnMgaG93IHdlIGdvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuY2hhaW4gaW1wbGllcyBlLnN5bWJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1bW1hcnlNc2cgPSBlLmNoYWluID8gJ3JlZmVyZW5jZXMgXFwnJyArIGUuc3ltYm9sLm5hbWUgKyAnXFwnJyA6IGVycm9yU3VtbWFyeShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdW1tYXJ5ID0gXCInXCIgKyBuZXN0ZWRDb250ZXh0Lm5hbWUgKyBcIicgXCIgKyBzdW1tYXJ5TXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYWluID0geyBtZXNzYWdlOiBzdW1tYXJ5LCBwb3NpdGlvbjogZS5wb3NpdGlvbiwgbmV4dDogZS5jaGFpbiB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhjaHVja2opOiByZXRyaWV2ZSB0aGUgcG9zaXRpb24gaW5mb3JtYXRpb24gaW5kaXJlY3RseSBmcm9tIHRoZSBjb2xsZWN0b3JzIG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcCBpZiB0aGUgbWV0YWRhdGEgaXMgZnJvbSBhIC50cyBmaWxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmlzZTogZS5hZHZpc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogZS5jb250ZXh0LCBjaGFpbjogY2hhaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBuZXN0ZWRDb250ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIHByb2JhYmx5IGFuIGludGVybmFsIGVycm9yLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5Q2FsbChmdW5jdGlvblN5bWJvbCwgdGFyZ2V0RnVuY3Rpb24sIGFyZ3MsIHRhcmdldEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RnVuY3Rpb24gJiYgdGFyZ2V0RnVuY3Rpb25bJ19fc3ltYm9saWMnXSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsaW5nLmdldChmdW5jdGlvblN5bWJvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZWN1cnNpb24gaXMgbm90IHN1cHBvcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogXCJjYWxsZWQgJ1wiICsgZnVuY3Rpb25TeW1ib2wubmFtZSArIFwiJyByZWN1cnNpdmVseVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0YXJnZXRGdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb25TeW1ib2wpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVfMSA9IHRhcmdldEZ1bmN0aW9uWyd2YWx1ZSddO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlXzEgJiYgKGRlcHRoICE9IDAgfHwgdmFsdWVfMS5fX3N5bWJvbGljICE9ICdlcnJvcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB0YXJnZXRGdW5jdGlvblsncGFyYW1ldGVycyddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0cyA9IHRhcmdldEZ1bmN0aW9uLmRlZmF1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzLm1hcChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBzaW1wbGlmeU5lc3RlZChjb250ZXh0LCBhcmcpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChhcmcpIHsgcmV0dXJuIHNob3VsZElnbm9yZShhcmcpID8gdW5kZWZpbmVkIDogYXJnOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMgJiYgZGVmYXVsdHMubGVuZ3RoID4gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIF9fc3ByZWFkKGRlZmF1bHRzLnNsaWNlKGFyZ3MubGVuZ3RoKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBzaW1wbGlmeSh2YWx1ZSk7IH0pKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcuc2V0KGZ1bmN0aW9uU3ltYm9sLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25TY29wZSA9IEJpbmRpbmdTY29wZSQxLmJ1aWxkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uU2NvcGUuZGVmaW5lKHBhcmFtZXRlcnNbaV0sIGFyZ3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkU2NvcGUgPSBzY29wZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0XzE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBmdW5jdGlvblNjb3BlLmRvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEgPSBzaW1wbGlmeU5lc3RlZChmdW5jdGlvblN5bWJvbCwgdmFsdWVfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZSA9IG9sZFNjb3BlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XzE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nLmRlbGV0ZShmdW5jdGlvblN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGRlcHRoIGlzIDAgd2UgYXJlIGV2YWx1YXRpbmcgdGhlIHRvcCBsZXZlbCBleHByZXNzaW9uIHRoYXQgaXMgZGVzY3JpYmluZyBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlY29yYXRvci4gSW4gdGhpcyBjYXNlLCBpdCBpcyBhIGRlY29yYXRvciB3ZSBkb24ndCB1bmRlcnN0YW5kLCBzdWNoIGFzIGEgY3VzdG9tXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1hbmd1bGFyIGRlY29yYXRvciwgYW5kIHdlIHNob3VsZCBqdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElHTk9SRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRFeHByZXNzaW9uICYmIHRhcmdldEV4cHJlc3Npb24uX19zeW1ib2xpYyA9PSAncmVzb2x2ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5lID0gdGFyZ2V0RXhwcmVzc2lvbi5saW5lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcmFjdGVyID0gdGFyZ2V0RXhwcmVzc2lvbi5jaGFyYWN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IHRhcmdldEV4cHJlc3Npb24uZmlsZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsICYmIGxpbmUgIT0gbnVsbCAmJiBjaGFyYWN0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB7IGZpbGVOYW1lOiBmaWxlTmFtZSwgbGluZTogbGluZSwgY29sdW1uOiBjaGFyYWN0ZXIgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogRlVOQ1RJT05fQ0FMTF9OT1RfU1VQUE9SVEVELFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBmdW5jdGlvblN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRhcmdldEZ1bmN0aW9uLCBwb3NpdGlvbjogcG9zaXRpb25cbiAgICAgICAgICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNpbXBsaWZ5KGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgZV8yLCBfYSwgZV8zLCBfYjtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdF8yID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYyA9IF9fdmFsdWVzKGV4cHJlc3Npb24pLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYSBzcHJlYWQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0uX19zeW1ib2xpYyA9PT0gJ3NwcmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FsbCB3aXRoIHJlZmVyZW5jZXMgYXMgMCBiZWNhdXNlIHdlIHJlcXVpcmUgdGhlIGFjdHVhbCB2YWx1ZSBhbmQgY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbGVyYXRlIGEgcmVmZXJlbmNlIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcHJlYWRBcnJheSA9IHNpbXBsaWZ5RWFnZXJseShpdGVtLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzcHJlYWRBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3ByZWFkQXJyYXlfMSA9IF9fdmFsdWVzKHNwcmVhZEFycmF5KSwgc3ByZWFkQXJyYXlfMV8xID0gc3ByZWFkQXJyYXlfMS5uZXh0KCk7ICFzcHJlYWRBcnJheV8xXzEuZG9uZTsgc3ByZWFkQXJyYXlfMV8xID0gc3ByZWFkQXJyYXlfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwcmVhZEl0ZW0gPSBzcHJlYWRBcnJheV8xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF8yLnB1c2goc3ByZWFkSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHJlYWRBcnJheV8xXzEgJiYgIXNwcmVhZEFycmF5XzFfMS5kb25lICYmIChfYiA9IHNwcmVhZEFycmF5XzEucmV0dXJuKSkgX2IuY2FsbChzcHJlYWRBcnJheV8xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlXzIgPSBzaW1wbGlmeShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKHZhbHVlXzIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfMi5wdXNoKHZhbHVlXzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9hID0gX2MucmV0dXJuKSkgX2EuY2FsbChfYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdF8yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0YXRpY1N5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHNpbXBsaWZpY2F0aW9uIGF0IGJ1aWx0aW4gc3ltYm9scyBvciBpZiB3ZSBhcmUgaW4gYSByZWZlcmVuY2UgY29udGV4dCBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN5bWJvbCBkb2Vzbid0IGhhdmUgbWVtYmVycy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT09IHNlbGYuaW5qZWN0aW9uVG9rZW4gfHwgc2VsZi5jb252ZXJzaW9uTWFwLmhhcyhleHByZXNzaW9uKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmVyZW5jZXMgPiAwICYmICFleHByZXNzaW9uLm1lbWJlcnMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGljU3ltYm9sID0gZXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvblZhbHVlID0gcmVzb2x2ZVJlZmVyZW5jZVZhbHVlKHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25WYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsaWZ5TmVzdGVkKHN0YXRpY1N5bWJvbCwgZGVjbGFyYXRpb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljU3ltYm9sO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uWydfX3N5bWJvbGljJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0aWNTeW1ib2wgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4cHJlc3Npb25bJ19fc3ltYm9saWMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jpbm9wJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBzaW1wbGlmeShleHByZXNzaW9uWydsZWZ0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKGxlZnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ3JpZ2h0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSWdub3JlKHJpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uWydvcGVyYXRvciddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcmJic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgJiYgcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd8fCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgfHwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCB8IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgXiByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICYgcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICchPSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgIT09IHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ID4gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc8PCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPDwgcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc+Pic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgPj4gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICogcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgJSByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpZic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25kaXRpb24gPSBzaW1wbGlmeShleHByZXNzaW9uWydjb25kaXRpb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24gPyBzaW1wbGlmeShleHByZXNzaW9uWyd0aGVuRXhwcmVzc2lvbiddKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGlmeShleHByZXNzaW9uWydlbHNlRXhwcmVzc2lvbiddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmFuZCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ29wZXJhbmQnXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUob3BlcmFuZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChleHByZXNzaW9uWydvcGVyYXRvciddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtb3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhb3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB+b3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbmRleCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleFRhcmdldCA9IHNpbXBsaWZ5RWFnZXJseShleHByZXNzaW9uWydleHByZXNzaW9uJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzaW1wbGlmeUVhZ2VybHkoZXhwcmVzc2lvblsnaW5kZXgnXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleFRhcmdldCAmJiBpc1ByaW1pdGl2ZShpbmRleCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhUYXJnZXRbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVtYmVyID0gZXhwcmVzc2lvblsnbWVtYmVyJ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RDb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdFRhcmdldCA9IHNpbXBsaWZ5KGV4cHJlc3Npb25bJ2V4cHJlc3Npb24nXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RUYXJnZXQgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZW1iZXJzID0gc2VsZWN0VGFyZ2V0Lm1lbWJlcnMuY29uY2F0KG1lbWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RDb250ZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldFN0YXRpY1N5bWJvbChzZWxlY3RUYXJnZXQuZmlsZVBhdGgsIHNlbGVjdFRhcmdldC5uYW1lLCBtZW1iZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvblZhbHVlID0gcmVzb2x2ZVJlZmVyZW5jZVZhbHVlKHNlbGVjdENvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeU5lc3RlZChzZWxlY3RDb250ZXh0LCBkZWNsYXJhdGlvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RUYXJnZXQgJiYgaXNQcmltaXRpdmUobWVtYmVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeU5lc3RlZChzZWxlY3RDb250ZXh0LCBzZWxlY3RUYXJnZXRbbWVtYmVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZmVyZW5jZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoaXMgb25seSBoYXMgdG8gZGVhbCB3aXRoIHZhcmlhYmxlIHJlZmVyZW5jZXMsIGFzIHN5bWJvbCByZWZlcmVuY2VzIGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBjb252ZXJ0ZWQgaW50byAncmVzb2x2ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBTdGF0aWNTeW1ib2xSZXNvbHZlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMiA9IGV4cHJlc3Npb25bJ25hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2FsVmFsdWUgPSBzY29wZS5yZXNvbHZlKG5hbWVfMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFZhbHVlICE9IEJpbmRpbmdTY29wZSQxLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Jlc29sdmVkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW1wbGlmeShleHByZXNzaW9uLnN5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGVycm9yIGlzIHJlcG9ydGVkIGV2YWx1YXRpbmcgdGhlIHN5bWJvbCByZWNvcmQgdGhlIHBvc2l0aW9uIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGluIHRoZSBlcnJvciBzbyBpdCBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHJlcG9ydGVkIGluIHRoZSBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBmcm9tIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZXRhZGF0YUVycm9yKGUpICYmIGV4cHJlc3Npb24uZmlsZU5hbWUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ubGluZSAhPSBudWxsICYmIGV4cHJlc3Npb24uY2hhcmFjdGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBvc2l0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZXhwcmVzc2lvbi5maWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZXhwcmVzc2lvbi5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGV4cHJlc3Npb24uY2hhcmFjdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmV3JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjYWxsJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBpcyBhIGJ1aWx0LWluIGNvbnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljU3ltYm9sID0gc2ltcGxpZnlJbkNvbnRleHQoY29udGV4dCwgZXhwcmVzc2lvblsnZXhwcmVzc2lvbiddLCBkZXB0aCArIDEsIC8qIHJlZmVyZW5jZXMgKi8gMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWNTeW1ib2wgaW5zdGFuY2VvZiBTdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0aWNTeW1ib2wgPT09IHNlbGYuaW5qZWN0aW9uVG9rZW4gfHwgc3RhdGljU3ltYm9sID09PSBzZWxmLm9wYXF1ZVRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc29tZWJvZHkgY2FsbHMgbmV3IEluamVjdGlvblRva2VuLCBkb24ndCBjcmVhdGUgYW4gSW5qZWN0aW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHJhdGhlciByZXR1cm4gdGhlIHN5bWJvbCB0byB3aGljaCB0aGUgSW5qZWN0aW9uVG9rZW4gaXMgYXNzaWduZWQgdG8uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BhcXVlVG9rZW4gaXMgc3VwcG9ydGVkIHRvbyBhcyBpdCBpcyByZXF1aXJlZCBieSB0aGUgbGFuZ3VhZ2Ugc2VydmljZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgdjQgYW5kIHByaW9yIHZlcnNpb25zIG9mIEFuZ3VsYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnRXhwcmVzc2lvbnMgPSBleHByZXNzaW9uWydhcmd1bWVudHMnXSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb252ZXJ0ZXIgPSBzZWxmLmNvbnZlcnNpb25NYXAuZ2V0KHN0YXRpY1N5bWJvbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmdFeHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGFyZykgeyByZXR1cm4gc2ltcGxpZnlOZXN0ZWQoY29udGV4dCwgYXJnKTsgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoYXJnKSB7IHJldHVybiBzaG91bGRJZ25vcmUoYXJnKSA/IHVuZGVmaW5lZCA6IGFyZzsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcihjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gaXMgb25lIHdlIGNhbiBzaW1wbGlmeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0RnVuY3Rpb24gPSByZXNvbHZlUmVmZXJlbmNlVmFsdWUoc3RhdGljU3ltYm9sKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlDYWxsKHN0YXRpY1N5bWJvbCwgdGFyZ2V0RnVuY3Rpb24sIGFyZ0V4cHJlc3Npb25zLCBleHByZXNzaW9uWydleHByZXNzaW9uJ10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJR05PUkU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGV4cHJlc3Npb24ubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25bJ2xpbmUnXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGV4cHJlc3Npb24uY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogZXhwcmVzc2lvblsnZmlsZU5hbWUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZXhwcmVzc2lvblsnbGluZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGV4cHJlc3Npb25bJ2NoYXJhY3RlciddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSwgY29udGV4dDogZXhwcmVzc2lvbi5jb250ZXh0IH0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJR05PUkU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaWdub3JlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwU3RyaW5nTWFwKGV4cHJlc3Npb24sIGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJFRkVSRU5DRV9TRVQuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IFVTRV9WQUxVRSQxICYmIFBST1ZJREUgaW4gZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvdmlkZXIgZXhwcmVzc2lvbiwgY2hlY2sgZm9yIHNwZWNpYWwgdG9rZW5zIHRoYXQgbmVlZCB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyaW5nIGFuYWx5c2lzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZSA9IHNpbXBsaWZ5KGV4cHJlc3Npb24ucHJvdmlkZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlID09PSBzZWxmLlJPVVRFUyB8fCBwcm92aWRlID09IHNlbGYuQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsaWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltcGxpZnlMYXppbHkodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsaWZ5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBJR05PUkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2ltcGxpZnkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzaW1wbGlmeUluQ29udGV4dChjb250ZXh0LCB2YWx1ZSwgMCwgbGF6eSA/IDEgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXJyb3JSZWNvcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBmb3JtYXRNZXRhZGF0YUVycm9yKGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJZ25vcmUocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5nZXRUeXBlTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgcmVzb2x2ZWRTeW1ib2wgPSB0aGlzLnN5bWJvbFJlc29sdmVyLnJlc29sdmVTeW1ib2wodHlwZSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFN5bWJvbCAmJiByZXNvbHZlZFN5bWJvbC5tZXRhZGF0YSA/IHJlc29sdmVkU3ltYm9sLm1ldGFkYXRhIDpcbiAgICAgICAgICAgIHsgX19zeW1ib2xpYzogJ2NsYXNzJyB9O1xuICAgIH07XG4gICAgU3RhdGljUmVmbGVjdG9yLnByb3RvdHlwZS5yZXBvcnRFcnJvciA9IGZ1bmN0aW9uIChlcnJvciwgY29udGV4dCwgcGF0aCkge1xuICAgICAgICBpZiAodGhpcy5lcnJvclJlY29yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yUmVjb3JkZXIoZm9ybWF0TWV0YWRhdGFFcnJvcihlcnJvciwgY29udGV4dCksIChjb250ZXh0ICYmIGNvbnRleHQuZmlsZVBhdGgpIHx8IHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YXRpY1JlZmxlY3Rvci5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoX2EsIHJlcG9ydGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBfYS5tZXNzYWdlLCBzdW1tYXJ5ID0gX2Euc3VtbWFyeSwgYWR2aXNlID0gX2EuYWR2aXNlLCBwb3NpdGlvbiA9IF9hLnBvc2l0aW9uLCBjb250ZXh0ID0gX2EuY29udGV4dCwgdmFsdWUgPSBfYS52YWx1ZSwgc3ltYm9sID0gX2Euc3ltYm9sLCBjaGFpbiA9IF9hLmNoYWluO1xuICAgICAgICB0aGlzLnJlcG9ydEVycm9yKG1ldGFkYXRhRXJyb3IobWVzc2FnZSwgc3VtbWFyeSwgYWR2aXNlLCBwb3NpdGlvbiwgc3ltYm9sLCBjb250ZXh0LCBjaGFpbiksIHJlcG9ydGluZ0NvbnRleHQpO1xuICAgIH07XG4gICAgcmV0dXJuIFN0YXRpY1JlZmxlY3Rvcjtcbn0oKSk7XG52YXIgTUVUQURBVEFfRVJST1IgPSAnbmdNZXRhZGF0YUVycm9yJztcbmZ1bmN0aW9uIG1ldGFkYXRhRXJyb3IobWVzc2FnZSwgc3VtbWFyeSwgYWR2aXNlLCBwb3NpdGlvbiwgc3ltYm9sLCBjb250ZXh0LCBjaGFpbikge1xuICAgIHZhciBlcnJvciA9IHN5bnRheEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yW01FVEFEQVRBX0VSUk9SXSA9IHRydWU7XG4gICAgaWYgKGFkdmlzZSlcbiAgICAgICAgZXJyb3IuYWR2aXNlID0gYWR2aXNlO1xuICAgIGlmIChwb3NpdGlvbilcbiAgICAgICAgZXJyb3IucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBpZiAoc3VtbWFyeSlcbiAgICAgICAgZXJyb3Iuc3VtbWFyeSA9IHN1bW1hcnk7XG4gICAgaWYgKGNvbnRleHQpXG4gICAgICAgIGVycm9yLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIGlmIChjaGFpbilcbiAgICAgICAgZXJyb3IuY2hhaW4gPSBjaGFpbjtcbiAgICBpZiAoc3ltYm9sKVxuICAgICAgICBlcnJvci5zeW1ib2wgPSBzeW1ib2w7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuZnVuY3Rpb24gaXNNZXRhZGF0YUVycm9yKGVycm9yKSB7XG4gICAgcmV0dXJuICEhZXJyb3JbTUVUQURBVEFfRVJST1JdO1xufVxudmFyIFJFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTUyA9ICdSZWZlcmVuY2UgdG8gbm9uLWV4cG9ydGVkIGNsYXNzJztcbnZhciBWQVJJQUJMRV9OT1RfSU5JVElBTElaRUQgPSAnVmFyaWFibGUgbm90IGluaXRpYWxpemVkJztcbnZhciBERVNUUlVDVFVSRV9OT1RfU1VQUE9SVEVEID0gJ0Rlc3RydWN0dXJpbmcgbm90IHN1cHBvcnRlZCc7XG52YXIgQ09VTERfTk9UX1JFU09MVkVfVFlQRSA9ICdDb3VsZCBub3QgcmVzb2x2ZSB0eXBlJztcbnZhciBGVU5DVElPTl9DQUxMX05PVF9TVVBQT1JURUQgPSAnRnVuY3Rpb24gY2FsbCBub3Qgc3VwcG9ydGVkJztcbnZhciBSRUZFUkVOQ0VfVE9fTE9DQUxfU1lNQk9MID0gJ1JlZmVyZW5jZSB0byBhIGxvY2FsIHN5bWJvbCc7XG52YXIgTEFNQkRBX05PVF9TVVBQT1JURUQgPSAnTGFtYmRhIG5vdCBzdXBwb3J0ZWQnO1xuZnVuY3Rpb24gZXhwYW5kZWRNZXNzYWdlKG1lc3NhZ2UsIGNvbnRleHQpIHtcbiAgICBzd2l0Y2ggKG1lc3NhZ2UpIHtcbiAgICAgICAgY2FzZSBSRUZFUkVOQ0VfVE9fTk9ORVhQT1JURURfQ0xBU1M6XG4gICAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlJlZmVyZW5jZXMgdG8gYSBub24tZXhwb3J0ZWQgY2xhc3MgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gZGVjb3JhdG9ycyBidXQgXCIgKyBjb250ZXh0LmNsYXNzTmFtZSArIFwiIHdhcyByZWZlcmVuY2VkLlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfTk9UX0lOSVRJQUxJWkVEOlxuICAgICAgICAgICAgcmV0dXJuICdPbmx5IGluaXRpYWxpemVkIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzIGNhbiBiZSByZWZlcmVuY2VkIGluIGRlY29yYXRvcnMgYmVjYXVzZSB0aGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyBuZWVkZWQgYnkgdGhlIHRlbXBsYXRlIGNvbXBpbGVyJztcbiAgICAgICAgY2FzZSBERVNUUlVDVFVSRV9OT1RfU1VQUE9SVEVEOlxuICAgICAgICAgICAgcmV0dXJuICdSZWZlcmVuY2luZyBhbiBleHBvcnRlZCBkZXN0cnVjdHVyZWQgdmFyaWFibGUgb3IgY29uc3RhbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBkZWNvcmF0b3JzIGFuZCB0aGlzIHZhbHVlIGlzIG5lZWRlZCBieSB0aGUgdGVtcGxhdGUgY29tcGlsZXInO1xuICAgICAgICBjYXNlIENPVUxEX05PVF9SRVNPTFZFX1RZUEU6XG4gICAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0LnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQ291bGQgbm90IHJlc29sdmUgdHlwZSBcIiArIGNvbnRleHQudHlwZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBGVU5DVElPTl9DQUxMX05PVF9TVVBQT1JURUQ6XG4gICAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJGdW5jdGlvbiBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBpbiBkZWNvcmF0b3JzIGJ1dCAnXCIgKyBjb250ZXh0Lm5hbWUgKyBcIicgd2FzIGNhbGxlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICdGdW5jdGlvbiBjYWxscyBhcmUgbm90IHN1cHBvcnRlZCBpbiBkZWNvcmF0b3JzJztcbiAgICAgICAgY2FzZSBSRUZFUkVOQ0VfVE9fTE9DQUxfU1lNQk9MOlxuICAgICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiUmVmZXJlbmNlIHRvIGEgbG9jYWwgKG5vbi1leHBvcnRlZCkgc3ltYm9scyBhcmUgbm90IHN1cHBvcnRlZCBpbiBkZWNvcmF0b3JzIGJ1dCAnXCIgKyBjb250ZXh0Lm5hbWUgKyBcIicgd2FzIHJlZmVyZW5jZWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExBTUJEQV9OT1RfU1VQUE9SVEVEOlxuICAgICAgICAgICAgcmV0dXJuIFwiRnVuY3Rpb24gZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gZGVjb3JhdG9yc1wiO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbn1cbmZ1bmN0aW9uIG1lc3NhZ2VBZHZpc2UobWVzc2FnZSwgY29udGV4dCkge1xuICAgIHN3aXRjaCAobWVzc2FnZSkge1xuICAgICAgICBjYXNlIFJFRkVSRU5DRV9UT19OT05FWFBPUlRFRF9DTEFTUzpcbiAgICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQ29uc2lkZXIgZXhwb3J0aW5nICdcIiArIGNvbnRleHQuY2xhc3NOYW1lICsgXCInXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBERVNUUlVDVFVSRV9OT1RfU1VQUE9SVEVEOlxuICAgICAgICAgICAgcmV0dXJuICdDb25zaWRlciBzaW1wbGlmeWluZyB0byBhdm9pZCBkZXN0cnVjdHVyaW5nJztcbiAgICAgICAgY2FzZSBSRUZFUkVOQ0VfVE9fTE9DQUxfU1lNQk9MOlxuICAgICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiQ29uc2lkZXIgZXhwb3J0aW5nICdcIiArIGNvbnRleHQubmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTEFNQkRBX05PVF9TVVBQT1JURUQ6XG4gICAgICAgICAgICByZXR1cm4gXCJDb25zaWRlciBjaGFuZ2luZyB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBpbnRvIGFuIGV4cG9ydGVkIGZ1bmN0aW9uXCI7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBlcnJvclN1bW1hcnkoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3Iuc3VtbWFyeSkge1xuICAgICAgICByZXR1cm4gZXJyb3Iuc3VtbWFyeTtcbiAgICB9XG4gICAgc3dpdGNoIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgIGNhc2UgUkVGRVJFTkNFX1RPX05PTkVYUE9SVEVEX0NMQVNTOlxuICAgICAgICAgICAgaWYgKGVycm9yLmNvbnRleHQgJiYgZXJyb3IuY29udGV4dC5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJyZWZlcmVuY2VzIG5vbi1leHBvcnRlZCBjbGFzcyBcIiArIGVycm9yLmNvbnRleHQuY2xhc3NOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVkFSSUFCTEVfTk9UX0lOSVRJQUxJWkVEOlxuICAgICAgICAgICAgcmV0dXJuICdpcyBub3QgaW5pdGlhbGl6ZWQnO1xuICAgICAgICBjYXNlIERFU1RSVUNUVVJFX05PVF9TVVBQT1JURUQ6XG4gICAgICAgICAgICByZXR1cm4gJ2lzIGEgZGVzdHJ1Y3R1cmVkIHZhcmlhYmxlJztcbiAgICAgICAgY2FzZSBDT1VMRF9OT1RfUkVTT0xWRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICdjb3VsZCBub3QgYmUgcmVzb2x2ZWQnO1xuICAgICAgICBjYXNlIEZVTkNUSU9OX0NBTExfTk9UX1NVUFBPUlRFRDpcbiAgICAgICAgICAgIGlmIChlcnJvci5jb250ZXh0ICYmIGVycm9yLmNvbnRleHQubmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImNhbGxzICdcIiArIGVycm9yLmNvbnRleHQubmFtZSArIFwiJ1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiY2FsbHMgYSBmdW5jdGlvblwiO1xuICAgICAgICBjYXNlIFJFRkVSRU5DRV9UT19MT0NBTF9TWU1CT0w6XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29udGV4dCAmJiBlcnJvci5jb250ZXh0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJyZWZlcmVuY2VzIGxvY2FsIHZhcmlhYmxlIFwiICsgZXJyb3IuY29udGV4dC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwicmVmZXJlbmNlcyBhIGxvY2FsIHZhcmlhYmxlXCI7XG4gICAgfVxuICAgIHJldHVybiAnY29udGFpbnMgdGhlIGVycm9yJztcbn1cbmZ1bmN0aW9uIG1hcFN0cmluZ01hcChpbnB1dCwgdHJhbnNmb3JtKSB7XG4gICAgaWYgKCFpbnB1dClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhpbnB1dCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRyYW5zZm9ybShpbnB1dFtrZXldLCBrZXkpO1xuICAgICAgICBpZiAoIXNob3VsZElnbm9yZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChISURERU5fS0VZLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGtleSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKG8pIHtcbiAgICByZXR1cm4gbyA9PT0gbnVsbCB8fCAodHlwZW9mIG8gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG8gIT09ICdvYmplY3QnKTtcbn1cbnZhciBCaW5kaW5nU2NvcGUkMSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nU2NvcGUoKSB7XG4gICAgfVxuICAgIEJpbmRpbmdTY29wZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWZpbmU6IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuc2l6ZSA+IDAgPyBuZXcgUG9wdWxhdGVkU2NvcGUoY3VycmVudCkgOiBCaW5kaW5nU2NvcGUuZW1wdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBCaW5kaW5nU2NvcGUubWlzc2luZyA9IHt9O1xuICAgIEJpbmRpbmdTY29wZS5lbXB0eSA9IHsgcmVzb2x2ZTogZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIEJpbmRpbmdTY29wZS5taXNzaW5nOyB9IH07XG4gICAgcmV0dXJuIEJpbmRpbmdTY29wZTtcbn0oKSk7XG52YXIgUG9wdWxhdGVkU2NvcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBvcHVsYXRlZFNjb3BlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBvcHVsYXRlZFNjb3BlKGJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUG9wdWxhdGVkU2NvcGUucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncy5oYXMobmFtZSkgPyB0aGlzLmJpbmRpbmdzLmdldChuYW1lKSA6IEJpbmRpbmdTY29wZSQxLm1pc3Npbmc7XG4gICAgfTtcbiAgICByZXR1cm4gUG9wdWxhdGVkU2NvcGU7XG59KEJpbmRpbmdTY29wZSQxKSk7XG5mdW5jdGlvbiBmb3JtYXRNZXRhZGF0YU1lc3NhZ2VDaGFpbihjaGFpbiwgYWR2aXNlKSB7XG4gICAgdmFyIGV4cGFuZGVkID0gZXhwYW5kZWRNZXNzYWdlKGNoYWluLm1lc3NhZ2UsIGNoYWluLmNvbnRleHQpO1xuICAgIHZhciBuZXN0aW5nID0gY2hhaW4uc3ltYm9sID8gXCIgaW4gJ1wiICsgY2hhaW4uc3ltYm9sLm5hbWUgKyBcIidcIiA6ICcnO1xuICAgIHZhciBtZXNzYWdlID0gXCJcIiArIGV4cGFuZGVkICsgbmVzdGluZztcbiAgICB2YXIgcG9zaXRpb24gPSBjaGFpbi5wb3NpdGlvbjtcbiAgICB2YXIgbmV4dCA9IGNoYWluLm5leHQgP1xuICAgICAgICBmb3JtYXRNZXRhZGF0YU1lc3NhZ2VDaGFpbihjaGFpbi5uZXh0LCBhZHZpc2UpIDpcbiAgICAgICAgYWR2aXNlID8geyBtZXNzYWdlOiBhZHZpc2UgfSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlLCBwb3NpdGlvbjogcG9zaXRpb24sIG5leHQ6IG5leHQgfTtcbn1cbmZ1bmN0aW9uIGZvcm1hdE1ldGFkYXRhRXJyb3IoZSwgY29udGV4dCkge1xuICAgIGlmIChpc01ldGFkYXRhRXJyb3IoZSkpIHtcbiAgICAgICAgLy8gUHJvZHVjZSBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBhbmQgbGVhdmluZyBlbm91Z2ggaW5mb3JtYXRpb24gaW4gdGhlIG9yaWdpbmFsIGVycm9yXG4gICAgICAgIC8vIHRvIHJlY292ZXIgdGhlIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gdG8gZXZlbnR1YWxseSBwcm9kdWNlIGEgZGlhZ25vc3RpYyBlcnJvciBtZXNzYWdlLlxuICAgICAgICB2YXIgcG9zaXRpb24gPSBlLnBvc2l0aW9uO1xuICAgICAgICB2YXIgY2hhaW4gPSB7XG4gICAgICAgICAgICBtZXNzYWdlOiBcIkVycm9yIGR1cmluZyB0ZW1wbGF0ZSBjb21waWxlIG9mICdcIiArIGNvbnRleHQubmFtZSArIFwiJ1wiLFxuICAgICAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLFxuICAgICAgICAgICAgbmV4dDogeyBtZXNzYWdlOiBlLm1lc3NhZ2UsIG5leHQ6IGUuY2hhaW4sIGNvbnRleHQ6IGUuY29udGV4dCwgc3ltYm9sOiBlLnN5bWJvbCB9XG4gICAgICAgIH07XG4gICAgICAgIHZhciBhZHZpc2UgPSBlLmFkdmlzZSB8fCBtZXNzYWdlQWR2aXNlKGUubWVzc2FnZSwgZS5jb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZEVycm9yKGZvcm1hdE1ldGFkYXRhTWVzc2FnZUNoYWluKGNoYWluLCBhZHZpc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBBb3RTdW1tYXJ5UmVzb2x2ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQW90U3VtbWFyeVJlc29sdmVyKGhvc3QsIHN0YXRpY1N5bWJvbENhY2hlKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgICAgIHRoaXMuc3RhdGljU3ltYm9sQ2FjaGUgPSBzdGF0aWNTeW1ib2xDYWNoZTtcbiAgICAgICAgLy8gTm90ZTogdGhpcyB3aWxsIG9ubHkgY29udGFpbiBTdGF0aWNTeW1ib2xzIHdpdGhvdXQgbWVtYmVycyFcbiAgICAgICAgdGhpcy5zdW1tYXJ5Q2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMubG9hZGVkRmlsZVBhdGhzID0gbmV3IE1hcCgpO1xuICAgICAgICAvLyBOb3RlOiB0aGlzIHdpbGwgb25seSBjb250YWluIFN0YXRpY1N5bWJvbHMgd2l0aG91dCBtZW1iZXJzIVxuICAgICAgICB0aGlzLmltcG9ydEFzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmtub3duRmlsZU5hbWVUb01vZHVsZU5hbWVzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBBb3RTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmlzTGlicmFyeUZpbGUgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBzdHJpcCB0aGUgLm5nZmFjdG9yeS4gZmlsZSBwYXRoLFxuICAgICAgICAvLyBzbyB0aGlzIG1ldGhvZCBhbHNvIHdvcmtzIGZvciBnZW5lcmF0ZWQgZmlsZXNcbiAgICAgICAgLy8gKGZvciB3aGljaCBob3N0LmlzU291cmNlRmlsZSB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UpLlxuICAgICAgICByZXR1cm4gIXRoaXMuaG9zdC5pc1NvdXJjZUZpbGUoc3RyaXBHZW5lcmF0ZWRGaWxlU3VmZml4KGZpbGVQYXRoKSk7XG4gICAgfTtcbiAgICBBb3RTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLnRvU3VtbWFyeUZpbGVOYW1lID0gZnVuY3Rpb24gKGZpbGVQYXRoLCByZWZlcnJpbmdTcmNGaWxlTmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3N0LnRvU3VtbWFyeUZpbGVOYW1lKGZpbGVQYXRoLCByZWZlcnJpbmdTcmNGaWxlTmFtZSk7XG4gICAgfTtcbiAgICBBb3RTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmZyb21TdW1tYXJ5RmlsZU5hbWUgPSBmdW5jdGlvbiAoZmlsZU5hbWUsIHJlZmVycmluZ0xpYkZpbGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvc3QuZnJvbVN1bW1hcnlGaWxlTmFtZShmaWxlTmFtZSwgcmVmZXJyaW5nTGliRmlsZU5hbWUpO1xuICAgIH07XG4gICAgQW90U3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5yZXNvbHZlU3VtbWFyeSA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgdmFyIHJvb3RTeW1ib2wgPSBzdGF0aWNTeW1ib2wubWVtYmVycy5sZW5ndGggP1xuICAgICAgICAgICAgdGhpcy5zdGF0aWNTeW1ib2xDYWNoZS5nZXQoc3RhdGljU3ltYm9sLmZpbGVQYXRoLCBzdGF0aWNTeW1ib2wubmFtZSkgOlxuICAgICAgICAgICAgc3RhdGljU3ltYm9sO1xuICAgICAgICB2YXIgc3VtbWFyeSA9IHRoaXMuc3VtbWFyeUNhY2hlLmdldChyb290U3ltYm9sKTtcbiAgICAgICAgaWYgKCFzdW1tYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkU3VtbWFyeUZpbGUoc3RhdGljU3ltYm9sLmZpbGVQYXRoKTtcbiAgICAgICAgICAgIHN1bW1hcnkgPSB0aGlzLnN1bW1hcnlDYWNoZS5nZXQoc3RhdGljU3ltYm9sKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHJvb3RTeW1ib2wgPT09IHN0YXRpY1N5bWJvbCAmJiBzdW1tYXJ5KSB8fCBudWxsO1xuICAgIH07XG4gICAgQW90U3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5nZXRTeW1ib2xzT2YgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRTdW1tYXJ5RmlsZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuc3VtbWFyeUNhY2hlLmtleXMoKSkuZmlsdGVyKGZ1bmN0aW9uIChzeW1ib2wpIHsgcmV0dXJuIHN5bWJvbC5maWxlUGF0aCA9PT0gZmlsZVBhdGg7IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgQW90U3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5nZXRJbXBvcnRBcyA9IGZ1bmN0aW9uIChzdGF0aWNTeW1ib2wpIHtcbiAgICAgICAgc3RhdGljU3ltYm9sLmFzc2VydE5vTWVtYmVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRBcy5nZXQoc3RhdGljU3ltYm9sKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgZmlsZSBwYXRoIHRvIGEgbW9kdWxlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBgaW1wb3J0YC5cbiAgICAgKi9cbiAgICBBb3RTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmdldEtub3duTW9kdWxlTmFtZSA9IGZ1bmN0aW9uIChpbXBvcnRlZEZpbGVQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmtub3duRmlsZU5hbWVUb01vZHVsZU5hbWVzLmdldChpbXBvcnRlZEZpbGVQYXRoKSB8fCBudWxsO1xuICAgIH07XG4gICAgQW90U3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5hZGRTdW1tYXJ5ID0gZnVuY3Rpb24gKHN1bW1hcnkpIHsgdGhpcy5zdW1tYXJ5Q2FjaGUuc2V0KHN1bW1hcnkuc3ltYm9sLCBzdW1tYXJ5KTsgfTtcbiAgICBBb3RTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLl9sb2FkU3VtbWFyeUZpbGUgPSBmdW5jdGlvbiAoZmlsZVBhdGgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGhhc1N1bW1hcnkgPSB0aGlzLmxvYWRlZEZpbGVQYXRocy5nZXQoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoaGFzU3VtbWFyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzU3VtbWFyeTtcbiAgICAgICAgfVxuICAgICAgICB2YXIganNvbiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzTGlicmFyeUZpbGUoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICB2YXIgc3VtbWFyeUZpbGVQYXRoID0gc3VtbWFyeUZpbGVOYW1lKGZpbGVQYXRoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAganNvbiA9IHRoaXMuaG9zdC5sb2FkU3VtbWFyeShzdW1tYXJ5RmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbG9hZGluZyBzdW1tYXJ5IGZpbGUgXCIgKyBzdW1tYXJ5RmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaGFzU3VtbWFyeSA9IGpzb24gIT0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkZWRGaWxlUGF0aHMuc2V0KGZpbGVQYXRoLCBoYXNTdW1tYXJ5KTtcbiAgICAgICAgaWYgKGpzb24pIHtcbiAgICAgICAgICAgIHZhciBfYSA9IGRlc2VyaWFsaXplU3VtbWFyaWVzKHRoaXMuc3RhdGljU3ltYm9sQ2FjaGUsIHRoaXMsIGZpbGVQYXRoLCBqc29uKSwgbW9kdWxlTmFtZSA9IF9hLm1vZHVsZU5hbWUsIHN1bW1hcmllcyA9IF9hLnN1bW1hcmllcywgaW1wb3J0QXMgPSBfYS5pbXBvcnRBcztcbiAgICAgICAgICAgIHN1bW1hcmllcy5mb3JFYWNoKGZ1bmN0aW9uIChzdW1tYXJ5KSB7IHJldHVybiBfdGhpcy5zdW1tYXJ5Q2FjaGUuc2V0KHN1bW1hcnkuc3ltYm9sLCBzdW1tYXJ5KTsgfSk7XG4gICAgICAgICAgICBpZiAobW9kdWxlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMua25vd25GaWxlTmFtZVRvTW9kdWxlTmFtZXMuc2V0KGZpbGVQYXRoLCBtb2R1bGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGltcG9ydEFzLmZvckVhY2goZnVuY3Rpb24gKGltcG9ydEFzKSB7IF90aGlzLmltcG9ydEFzLnNldChpbXBvcnRBcy5zeW1ib2wsIGltcG9ydEFzLmltcG9ydEFzKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc1N1bW1hcnk7XG4gICAgfTtcbiAgICByZXR1cm4gQW90U3VtbWFyeVJlc29sdmVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQW90VXJsUmVzb2x2ZXIoaG9zdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uIChiYXNlUGF0aCwgdXJsKSB7XG4gICAgICAgICAgICB2YXIgZmlsZVBhdGggPSBob3N0LnJlc291cmNlTmFtZVRvRmlsZU5hbWUodXJsLCBiYXNlUGF0aCk7XG4gICAgICAgICAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoXCJDb3VsZG4ndCByZXNvbHZlIHJlc291cmNlIFwiICsgdXJsICsgXCIgZnJvbSBcIiArIGJhc2VQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgfVxuICAgIH07XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQW90Q29tcGlsZXIgYmFzZWQgb24gb3B0aW9ucyBhbmQgYSBob3N0LlxuICovXG5mdW5jdGlvbiBjcmVhdGVBb3RDb21waWxlcihjb21waWxlckhvc3QsIG9wdGlvbnMsIGVycm9yQ29sbGVjdG9yKSB7XG4gICAgdmFyIHRyYW5zbGF0aW9ucyA9IG9wdGlvbnMudHJhbnNsYXRpb25zIHx8ICcnO1xuICAgIHZhciB1cmxSZXNvbHZlciA9IGNyZWF0ZUFvdFVybFJlc29sdmVyKGNvbXBpbGVySG9zdCk7XG4gICAgdmFyIHN5bWJvbENhY2hlID0gbmV3IFN0YXRpY1N5bWJvbENhY2hlKCk7XG4gICAgdmFyIHN1bW1hcnlSZXNvbHZlciA9IG5ldyBBb3RTdW1tYXJ5UmVzb2x2ZXIoY29tcGlsZXJIb3N0LCBzeW1ib2xDYWNoZSk7XG4gICAgdmFyIHN5bWJvbFJlc29sdmVyID0gbmV3IFN0YXRpY1N5bWJvbFJlc29sdmVyKGNvbXBpbGVySG9zdCwgc3ltYm9sQ2FjaGUsIHN1bW1hcnlSZXNvbHZlcik7XG4gICAgdmFyIHN0YXRpY1JlZmxlY3RvciA9IG5ldyBTdGF0aWNSZWZsZWN0b3Ioc3VtbWFyeVJlc29sdmVyLCBzeW1ib2xSZXNvbHZlciwgW10sIFtdLCBlcnJvckNvbGxlY3Rvcik7XG4gICAgdmFyIGh0bWxQYXJzZXI7XG4gICAgaWYgKCEhb3B0aW9ucy5lbmFibGVJdnkpIHtcbiAgICAgICAgLy8gSXZ5IGhhbmRsZXMgaTE4biBhdCB0aGUgY29tcGlsZXIgbGV2ZWwgc28gd2UgbXVzdCB1c2UgYSByZWd1bGFyIHBhcnNlclxuICAgICAgICBodG1sUGFyc2VyID0gbmV3IEh0bWxQYXJzZXIoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGh0bWxQYXJzZXIgPSBuZXcgSTE4Tkh0bWxQYXJzZXIobmV3IEh0bWxQYXJzZXIoKSwgdHJhbnNsYXRpb25zLCBvcHRpb25zLmkxOG5Gb3JtYXQsIG9wdGlvbnMubWlzc2luZ1RyYW5zbGF0aW9uLCBjb25zb2xlKTtcbiAgICB9XG4gICAgdmFyIGNvbmZpZyA9IG5ldyBDb21waWxlckNvbmZpZyh7XG4gICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgICAgICAgdXNlSml0OiBmYWxzZSxcbiAgICAgICAgbWlzc2luZ1RyYW5zbGF0aW9uOiBvcHRpb25zLm1pc3NpbmdUcmFuc2xhdGlvbixcbiAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogb3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2VzLFxuICAgICAgICBzdHJpY3RJbmplY3Rpb25QYXJhbWV0ZXJzOiBvcHRpb25zLnN0cmljdEluamVjdGlvblBhcmFtZXRlcnMsXG4gICAgfSk7XG4gICAgdmFyIG5vcm1hbGl6ZXIgPSBuZXcgRGlyZWN0aXZlTm9ybWFsaXplcih7IGdldDogZnVuY3Rpb24gKHVybCkgeyByZXR1cm4gY29tcGlsZXJIb3N0LmxvYWRSZXNvdXJjZSh1cmwpOyB9IH0sIHVybFJlc29sdmVyLCBodG1sUGFyc2VyLCBjb25maWcpO1xuICAgIHZhciBleHByZXNzaW9uUGFyc2VyID0gbmV3IFBhcnNlciQxKG5ldyBMZXhlcigpKTtcbiAgICB2YXIgZWxlbWVudFNjaGVtYVJlZ2lzdHJ5ID0gbmV3IERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSgpO1xuICAgIHZhciB0bXBsUGFyc2VyID0gbmV3IFRlbXBsYXRlUGFyc2VyKGNvbmZpZywgc3RhdGljUmVmbGVjdG9yLCBleHByZXNzaW9uUGFyc2VyLCBlbGVtZW50U2NoZW1hUmVnaXN0cnksIGh0bWxQYXJzZXIsIGNvbnNvbGUsIFtdKTtcbiAgICB2YXIgcmVzb2x2ZXIgPSBuZXcgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIoY29uZmlnLCBodG1sUGFyc2VyLCBuZXcgTmdNb2R1bGVSZXNvbHZlcihzdGF0aWNSZWZsZWN0b3IpLCBuZXcgRGlyZWN0aXZlUmVzb2x2ZXIoc3RhdGljUmVmbGVjdG9yKSwgbmV3IFBpcGVSZXNvbHZlcihzdGF0aWNSZWZsZWN0b3IpLCBzdW1tYXJ5UmVzb2x2ZXIsIGVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgbm9ybWFsaXplciwgY29uc29sZSwgc3ltYm9sQ2FjaGUsIHN0YXRpY1JlZmxlY3RvciwgZXJyb3JDb2xsZWN0b3IpO1xuICAgIC8vIFRPRE8odmljYik6IGRvIG5vdCBwYXNzIG9wdGlvbnMuaTE4bkZvcm1hdCBoZXJlXG4gICAgdmFyIHZpZXdDb21waWxlciA9IG5ldyBWaWV3Q29tcGlsZXIoc3RhdGljUmVmbGVjdG9yKTtcbiAgICB2YXIgdHlwZUNoZWNrQ29tcGlsZXIgPSBuZXcgVHlwZUNoZWNrQ29tcGlsZXIob3B0aW9ucywgc3RhdGljUmVmbGVjdG9yKTtcbiAgICB2YXIgY29tcGlsZXIgPSBuZXcgQW90Q29tcGlsZXIoY29uZmlnLCBvcHRpb25zLCBjb21waWxlckhvc3QsIHN0YXRpY1JlZmxlY3RvciwgcmVzb2x2ZXIsIHRtcGxQYXJzZXIsIG5ldyBTdHlsZUNvbXBpbGVyKHVybFJlc29sdmVyKSwgdmlld0NvbXBpbGVyLCB0eXBlQ2hlY2tDb21waWxlciwgbmV3IE5nTW9kdWxlQ29tcGlsZXIoc3RhdGljUmVmbGVjdG9yKSwgbmV3IEluamVjdGFibGVDb21waWxlcihzdGF0aWNSZWZsZWN0b3IsICEhb3B0aW9ucy5lbmFibGVJdnkpLCBuZXcgVHlwZVNjcmlwdEVtaXR0ZXIoKSwgc3VtbWFyeVJlc29sdmVyLCBzeW1ib2xSZXNvbHZlcik7XG4gICAgcmV0dXJuIHsgY29tcGlsZXI6IGNvbXBpbGVyLCByZWZsZWN0b3I6IHN0YXRpY1JlZmxlY3RvciB9O1xufVxuXG52YXIgU3VtbWFyeVJlc29sdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN1bW1hcnlSZXNvbHZlcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIFN1bW1hcnlSZXNvbHZlcjtcbn0oKSk7XG52YXIgSml0U3VtbWFyeVJlc29sdmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEppdFN1bW1hcnlSZXNvbHZlcigpIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyaWVzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBKaXRTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmlzTGlicmFyeUZpbGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTtcbiAgICBKaXRTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLnRvU3VtbWFyeUZpbGVOYW1lID0gZnVuY3Rpb24gKGZpbGVOYW1lKSB7IHJldHVybiBmaWxlTmFtZTsgfTtcbiAgICBKaXRTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmZyb21TdW1tYXJ5RmlsZU5hbWUgPSBmdW5jdGlvbiAoZmlsZU5hbWUpIHsgcmV0dXJuIGZpbGVOYW1lOyB9O1xuICAgIEppdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUucmVzb2x2ZVN1bW1hcnkgPSBmdW5jdGlvbiAocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJpZXMuZ2V0KHJlZmVyZW5jZSkgfHwgbnVsbDtcbiAgICB9O1xuICAgIEppdFN1bW1hcnlSZXNvbHZlci5wcm90b3R5cGUuZ2V0U3ltYm9sc09mID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH07XG4gICAgSml0U3VtbWFyeVJlc29sdmVyLnByb3RvdHlwZS5nZXRJbXBvcnRBcyA9IGZ1bmN0aW9uIChyZWZlcmVuY2UpIHsgcmV0dXJuIHJlZmVyZW5jZTsgfTtcbiAgICBKaXRTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmdldEtub3duTW9kdWxlTmFtZSA9IGZ1bmN0aW9uIChmaWxlTmFtZSkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBKaXRTdW1tYXJ5UmVzb2x2ZXIucHJvdG90eXBlLmFkZFN1bW1hcnkgPSBmdW5jdGlvbiAoc3VtbWFyeSkgeyB0aGlzLl9zdW1tYXJpZXMuc2V0KHN1bW1hcnkuc3ltYm9sLCBzdW1tYXJ5KTsgfTtcbiAgICByZXR1cm4gSml0U3VtbWFyeVJlc29sdmVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gaW50ZXJwcmV0U3RhdGVtZW50cyhzdGF0ZW1lbnRzLCByZWZsZWN0b3IpIHtcbiAgICB2YXIgY3R4ID0gbmV3IF9FeGVjdXRpb25Db250ZXh0KG51bGwsIG51bGwsIG51bGwsIG5ldyBNYXAoKSk7XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgU3RhdGVtZW50SW50ZXJwcmV0ZXIocmVmbGVjdG9yKTtcbiAgICB2aXNpdG9yLnZpc2l0QWxsU3RhdGVtZW50cyhzdGF0ZW1lbnRzLCBjdHgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBjdHguZXhwb3J0cy5mb3JFYWNoKGZ1bmN0aW9uIChleHBvcnROYW1lKSB7IHJlc3VsdFtleHBvcnROYW1lXSA9IGN0eC52YXJzLmdldChleHBvcnROYW1lKTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIF9leGVjdXRlRnVuY3Rpb25TdGF0ZW1lbnRzKHZhck5hbWVzLCB2YXJWYWx1ZXMsIHN0YXRlbWVudHMsIGN0eCwgdmlzaXRvcikge1xuICAgIHZhciBjaGlsZEN0eCA9IGN0eC5jcmVhdGVDaGlsZFdpaHRMb2NhbFZhcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhck5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNoaWxkQ3R4LnZhcnMuc2V0KHZhck5hbWVzW2ldLCB2YXJWYWx1ZXNbaV0pO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdmlzaXRvci52aXNpdEFsbFN0YXRlbWVudHMoc3RhdGVtZW50cywgY2hpbGRDdHgpO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQudmFsdWUgOiBudWxsO1xufVxudmFyIF9FeGVjdXRpb25Db250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIF9FeGVjdXRpb25Db250ZXh0KHBhcmVudCwgaW5zdGFuY2UsIGNsYXNzTmFtZSwgdmFycykge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgICAgdGhpcy52YXJzID0gdmFycztcbiAgICAgICAgdGhpcy5leHBvcnRzID0gW107XG4gICAgfVxuICAgIF9FeGVjdXRpb25Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDaGlsZFdpaHRMb2NhbFZhcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgX0V4ZWN1dGlvbkNvbnRleHQodGhpcywgdGhpcy5pbnN0YW5jZSwgdGhpcy5jbGFzc05hbWUsIG5ldyBNYXAoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gX0V4ZWN1dGlvbkNvbnRleHQ7XG59KCkpO1xudmFyIFJldHVyblZhbHVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJldHVyblZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFJldHVyblZhbHVlO1xufSgpKTtcbmZ1bmN0aW9uIGNyZWF0ZUR5bmFtaWNDbGFzcyhfY2xhc3NTdG10LCBfY3R4LCBfdmlzaXRvcikge1xuICAgIHZhciBwcm9wZXJ0eURlc2NyaXB0b3JzID0ge307XG4gICAgX2NsYXNzU3RtdC5nZXR0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGdldHRlcikge1xuICAgICAgICAvLyBOb3RlOiB1c2UgYGZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGFycm93IGZ1bmN0aW9uIHRvIGNhcHR1cmUgYHRoaXNgXG4gICAgICAgIHByb3BlcnR5RGVzY3JpcHRvcnNbZ2V0dGVyLm5hbWVdID0ge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZUN0eCA9IG5ldyBfRXhlY3V0aW9uQ29udGV4dChfY3R4LCB0aGlzLCBfY2xhc3NTdG10Lm5hbWUsIF9jdHgudmFycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9leGVjdXRlRnVuY3Rpb25TdGF0ZW1lbnRzKFtdLCBbXSwgZ2V0dGVyLmJvZHksIGluc3RhbmNlQ3R4LCBfdmlzaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgX2NsYXNzU3RtdC5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICB2YXIgcGFyYW1OYW1lcyA9IG1ldGhvZC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gcGFyYW0ubmFtZTsgfSk7XG4gICAgICAgIC8vIE5vdGU6IHVzZSBgZnVuY3Rpb25gIGluc3RlYWQgb2YgYXJyb3cgZnVuY3Rpb24gdG8gY2FwdHVyZSBgdGhpc2BcbiAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yc1ttZXRob2QubmFtZV0gPSB7XG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlQ3R4ID0gbmV3IF9FeGVjdXRpb25Db250ZXh0KF9jdHgsIHRoaXMsIF9jbGFzc1N0bXQubmFtZSwgX2N0eC52YXJzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2V4ZWN1dGVGdW5jdGlvblN0YXRlbWVudHMocGFyYW1OYW1lcywgYXJncywgbWV0aG9kLmJvZHksIGluc3RhbmNlQ3R4LCBfdmlzaXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgdmFyIGN0b3JQYXJhbU5hbWVzID0gX2NsYXNzU3RtdC5jb25zdHJ1Y3Rvck1ldGhvZC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gcGFyYW0ubmFtZTsgfSk7XG4gICAgLy8gTm90ZTogdXNlIGBmdW5jdGlvbmAgaW5zdGVhZCBvZiBhcnJvdyBmdW5jdGlvbiB0byBjYXB0dXJlIGB0aGlzYFxuICAgIHZhciBjdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbnN0YW5jZUN0eCA9IG5ldyBfRXhlY3V0aW9uQ29udGV4dChfY3R4LCB0aGlzLCBfY2xhc3NTdG10Lm5hbWUsIF9jdHgudmFycyk7XG4gICAgICAgIF9jbGFzc1N0bXQuZmllbGRzLmZvckVhY2goZnVuY3Rpb24gKGZpZWxkKSB7IF90aGlzW2ZpZWxkLm5hbWVdID0gdW5kZWZpbmVkOyB9KTtcbiAgICAgICAgX2V4ZWN1dGVGdW5jdGlvblN0YXRlbWVudHMoY3RvclBhcmFtTmFtZXMsIGFyZ3MsIF9jbGFzc1N0bXQuY29uc3RydWN0b3JNZXRob2QuYm9keSwgaW5zdGFuY2VDdHgsIF92aXNpdG9yKTtcbiAgICB9O1xuICAgIHZhciBzdXBlckNsYXNzID0gX2NsYXNzU3RtdC5wYXJlbnQgPyBfY2xhc3NTdG10LnBhcmVudC52aXNpdEV4cHJlc3Npb24oX3Zpc2l0b3IsIF9jdHgpIDogT2JqZWN0O1xuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSwgcHJvcGVydHlEZXNjcmlwdG9ycyk7XG4gICAgcmV0dXJuIGN0b3I7XG59XG52YXIgU3RhdGVtZW50SW50ZXJwcmV0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RhdGVtZW50SW50ZXJwcmV0ZXIocmVmbGVjdG9yKSB7XG4gICAgICAgIHRoaXMucmVmbGVjdG9yID0gcmVmbGVjdG9yO1xuICAgIH1cbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUuZGVidWdBc3QgPSBmdW5jdGlvbiAoYXN0KSB7IHJldHVybiBkZWJ1Z091dHB1dEFzdEFzVHlwZVNjcmlwdChhc3QpOyB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdERlY2xhcmVWYXJTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICB2YXIgaW5pdGlhbFZhbHVlID0gc3RtdC52YWx1ZSA/IHN0bXQudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGN0eC52YXJzLnNldChzdG10Lm5hbWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIGlmIChzdG10Lmhhc01vZGlmaWVyKFN0bXRNb2RpZmllci5FeHBvcnRlZCkpIHtcbiAgICAgICAgICAgIGN0eC5leHBvcnRzLnB1c2goc3RtdC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFdyaXRlVmFyRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgdmFyIGN1cnJDdHggPSBjdHg7XG4gICAgICAgIHdoaWxlIChjdXJyQ3R4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdXJyQ3R4LnZhcnMuaGFzKGV4cHIubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyQ3R4LnZhcnMuc2V0KGV4cHIubmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJDdHggPSBjdXJyQ3R4LnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgZGVjbGFyZWQgdmFyaWFibGUgXCIgKyBleHByLm5hbWUpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0V3JhcHBlZE5vZGVFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGludGVycHJldCBhIFdyYXBwZWROb2RlRXhwci4nKTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFR5cGVvZkV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaW50ZXJwcmV0IGEgVHlwZW9mRXhwcicpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0UmVhZFZhckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIHZhck5hbWUgPSBhc3QubmFtZTtcbiAgICAgICAgaWYgKGFzdC5idWlsdGluICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYXN0LmJ1aWx0aW4pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5WYXIuU3VwZXI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHguaW5zdGFuY2UuX19wcm90b19fO1xuICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpblZhci5UaGlzOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4Lmluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpblZhci5DYXRjaEVycm9yOlxuICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gQ0FUQ0hfRVJST1JfVkFSJDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpblZhci5DYXRjaFN0YWNrOlxuICAgICAgICAgICAgICAgICAgICB2YXJOYW1lID0gQ0FUQ0hfU1RBQ0tfVkFSJDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiB2YXJpYWJsZSBcIiArIGFzdC5idWlsdGluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VyckN0eCA9IGN0eDtcbiAgICAgICAgd2hpbGUgKGN1cnJDdHggIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN1cnJDdHgudmFycy5oYXModmFyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VyckN0eC52YXJzLmdldCh2YXJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJDdHggPSBjdXJyQ3R4LnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgZGVjbGFyZWQgdmFyaWFibGUgXCIgKyB2YXJOYW1lKTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFdyaXRlS2V5RXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIHJlY2VpdmVyID0gZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgdmFyIGluZGV4ID0gZXhwci5pbmRleC52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgdmFyIHZhbHVlID0gZXhwci52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgcmVjZWl2ZXJbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFdyaXRlUHJvcEV4cHIgPSBmdW5jdGlvbiAoZXhwciwgY3R4KSB7XG4gICAgICAgIHZhciByZWNlaXZlciA9IGV4cHIucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGV4cHIudmFsdWUudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIHJlY2VpdmVyW2V4cHIubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0SW52b2tlTWV0aG9kRXhwciA9IGZ1bmN0aW9uIChleHByLCBjdHgpIHtcbiAgICAgICAgdmFyIHJlY2VpdmVyID0gZXhwci5yZWNlaXZlci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoZXhwci5hcmdzLCBjdHgpO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICBpZiAoZXhwci5idWlsdGluICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXhwci5idWlsdGluKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLkNvbmNhdEFycmF5OlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5jb25jYXQuYXBwbHkocmVjZWl2ZXIsIF9fc3ByZWFkKGFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBCdWlsdGluTWV0aG9kLlN1YnNjcmliZU9ic2VydmFibGU6XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlY2VpdmVyLnN1YnNjcmliZSh7IG5leHQ6IGFyZ3NbMF0gfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpbk1ldGhvZC5CaW5kOlxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5iaW5kLmFwcGx5KHJlY2VpdmVyLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gYnVpbHRpbiBtZXRob2QgXCIgKyBleHByLmJ1aWx0aW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVjZWl2ZXJbZXhwci5uYW1lXS5hcHBseShyZWNlaXZlciwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEludm9rZUZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoc3RtdC5hcmdzLCBjdHgpO1xuICAgICAgICB2YXIgZm5FeHByID0gc3RtdC5mbjtcbiAgICAgICAgaWYgKGZuRXhwciBpbnN0YW5jZW9mIFJlYWRWYXJFeHByICYmIGZuRXhwci5idWlsdGluID09PSBCdWlsdGluVmFyLlN1cGVyKSB7XG4gICAgICAgICAgICBjdHguaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmFwcGx5KGN0eC5pbnN0YW5jZSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmbiA9IHN0bXQuZm4udmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdFJldHVyblN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIHJldHVybiBuZXcgUmV0dXJuVmFsdWUoc3RtdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KSk7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXREZWNsYXJlQ2xhc3NTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICB2YXIgY2xhenogPSBjcmVhdGVEeW5hbWljQ2xhc3Moc3RtdCwgY3R4LCB0aGlzKTtcbiAgICAgICAgY3R4LnZhcnMuc2V0KHN0bXQubmFtZSwgY2xhenopO1xuICAgICAgICBpZiAoc3RtdC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuRXhwb3J0ZWQpKSB7XG4gICAgICAgICAgICBjdHguZXhwb3J0cy5wdXNoKHN0bXQubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRFeHByZXNzaW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIHN0bXQuZXhwci52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdElmU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgdmFyIGNvbmRpdGlvbiA9IHN0bXQuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC50cnVlQ2FzZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdG10LmZhbHNlQ2FzZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5mYWxzZUNhc2UsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRUcnlDYXRjaFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY3R4KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpdEFsbFN0YXRlbWVudHMoc3RtdC5ib2R5U3RtdHMsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZEN0eCA9IGN0eC5jcmVhdGVDaGlsZFdpaHRMb2NhbFZhcnMoKTtcbiAgICAgICAgICAgIGNoaWxkQ3R4LnZhcnMuc2V0KENBVENIX0VSUk9SX1ZBUiQyLCBlKTtcbiAgICAgICAgICAgIGNoaWxkQ3R4LnZhcnMuc2V0KENBVENIX1NUQUNLX1ZBUiQyLCBlLnN0YWNrKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsU3RhdGVtZW50cyhzdG10LmNhdGNoU3RtdHMsIGNoaWxkQ3R4KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0VGhyb3dTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGN0eCkge1xuICAgICAgICB0aHJvdyBzdG10LmVycm9yLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudFN0bXQgPSBmdW5jdGlvbiAoc3RtdCwgY29udGV4dCkgeyByZXR1cm4gbnVsbDsgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRKU0RvY0NvbW1lbnRTdG10ID0gZnVuY3Rpb24gKHN0bXQsIGNvbnRleHQpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0SW5zdGFudGlhdGVFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy52aXNpdEFsbEV4cHJlc3Npb25zKGFzdC5hcmdzLCBjdHgpO1xuICAgICAgICB2YXIgY2xhenogPSBhc3QuY2xhc3NFeHByLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICByZXR1cm4gbmV3IChjbGF6ei5iaW5kLmFwcGx5KGNsYXp6LCBfX3NwcmVhZChbdm9pZCAwXSwgYXJncykpKSgpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0TGl0ZXJhbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHsgcmV0dXJuIGFzdC52YWx1ZTsgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRFeHRlcm5hbEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdG9yLnJlc29sdmVFeHRlcm5hbFJlZmVyZW5jZShhc3QudmFsdWUpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Q29uZGl0aW9uYWxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIGlmIChhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN0LnRydWVDYXNlLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFzdC5mYWxzZUNhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFzdC5mYWxzZUNhc2UudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXROb3RFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAhYXN0LmNvbmRpdGlvbi52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEFzc2VydE5vdE51bGxFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHJldHVybiBhc3QuY29uZGl0aW9uLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0Q2FzdEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGFzdC52YWx1ZS52aXNpdEV4cHJlc3Npb24odGhpcywgY3R4KTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB2YXIgcGFyYW1OYW1lcyA9IGFzdC5wYXJhbXMubWFwKGZ1bmN0aW9uIChwYXJhbSkgeyByZXR1cm4gcGFyYW0ubmFtZTsgfSk7XG4gICAgICAgIHJldHVybiBfZGVjbGFyZUZuKHBhcmFtTmFtZXMsIGFzdC5zdGF0ZW1lbnRzLCBjdHgsIHRoaXMpO1xuICAgIH07XG4gICAgU3RhdGVtZW50SW50ZXJwcmV0ZXIucHJvdG90eXBlLnZpc2l0RGVjbGFyZUZ1bmN0aW9uU3RtdCA9IGZ1bmN0aW9uIChzdG10LCBjdHgpIHtcbiAgICAgICAgdmFyIHBhcmFtTmFtZXMgPSBzdG10LnBhcmFtcy5tYXAoZnVuY3Rpb24gKHBhcmFtKSB7IHJldHVybiBwYXJhbS5uYW1lOyB9KTtcbiAgICAgICAgY3R4LnZhcnMuc2V0KHN0bXQubmFtZSwgX2RlY2xhcmVGbihwYXJhbU5hbWVzLCBzdG10LnN0YXRlbWVudHMsIGN0eCwgdGhpcykpO1xuICAgICAgICBpZiAoc3RtdC5oYXNNb2RpZmllcihTdG10TW9kaWZpZXIuRXhwb3J0ZWQpKSB7XG4gICAgICAgICAgICBjdHguZXhwb3J0cy5wdXNoKHN0bXQubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRCaW5hcnlPcGVyYXRvckV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxocyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFzdC5saHMudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjdHgpOyB9O1xuICAgICAgICB2YXIgcmhzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gYXN0LnJocy52aXNpdEV4cHJlc3Npb24oX3RoaXMsIGN0eCk7IH07XG4gICAgICAgIHN3aXRjaCAoYXN0Lm9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkVxdWFsczpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPT0gcmhzKCk7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLklkZW50aWNhbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPT09IHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Ob3RFcXVhbHM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxocygpICE9IHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Ob3RJZGVudGljYWw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxocygpICE9PSByaHMoKTtcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuQW5kOlxuICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAmJiByaHMoKTtcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuT3I6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxocygpIHx8IHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5QbHVzOlxuICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSArIHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5NaW51czpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgLSByaHMoKTtcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuRGl2aWRlOlxuICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAvIHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5NdWx0aXBseTpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgKiByaHMoKTtcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTW9kdWxvOlxuICAgICAgICAgICAgICAgIHJldHVybiBsaHMoKSAlIHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5Mb3dlcjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPCByaHMoKTtcbiAgICAgICAgICAgIGNhc2UgQmluYXJ5T3BlcmF0b3IuTG93ZXJFcXVhbHM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxocygpIDw9IHJocygpO1xuICAgICAgICAgICAgY2FzZSBCaW5hcnlPcGVyYXRvci5CaWdnZXI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxocygpID4gcmhzKCk7XG4gICAgICAgICAgICBjYXNlIEJpbmFyeU9wZXJhdG9yLkJpZ2dlckVxdWFsczpcbiAgICAgICAgICAgICAgICByZXR1cm4gbGhzKCkgPj0gcmhzKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3BlcmF0b3IgXCIgKyBhc3Qub3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRSZWFkUHJvcEV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjdHgpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdmFyIHJlY2VpdmVyID0gYXN0LnJlY2VpdmVyLnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlclthc3QubmFtZV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRSZWFkS2V5RXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXRFeHByZXNzaW9uKHRoaXMsIGN0eCk7XG4gICAgICAgIHZhciBwcm9wID0gYXN0LmluZGV4LnZpc2l0RXhwcmVzc2lvbih0aGlzLCBjdHgpO1xuICAgICAgICByZXR1cm4gcmVjZWl2ZXJbcHJvcF07XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsQXJyYXlFeHByID0gZnVuY3Rpb24gKGFzdCwgY3R4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LmVudHJpZXMsIGN0eCk7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRMaXRlcmFsTWFwRXhwciA9IGZ1bmN0aW9uIChhc3QsIGN0eCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIGFzdC5lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiByZXN1bHRbZW50cnkua2V5XSA9IGVudHJ5LnZhbHVlLnZpc2l0RXhwcmVzc2lvbihfdGhpcywgY3R4KTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRDb21tYUV4cHIgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZpc2l0QWxsRXhwcmVzc2lvbnMoYXN0LnBhcnRzLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07XG4gICAgfTtcbiAgICBTdGF0ZW1lbnRJbnRlcnByZXRlci5wcm90b3R5cGUudmlzaXRBbGxFeHByZXNzaW9ucyA9IGZ1bmN0aW9uIChleHByZXNzaW9ucywgY3R4KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGV4cHIpIHsgcmV0dXJuIGV4cHIudmlzaXRFeHByZXNzaW9uKF90aGlzLCBjdHgpOyB9KTtcbiAgICB9O1xuICAgIFN0YXRlbWVudEludGVycHJldGVyLnByb3RvdHlwZS52aXNpdEFsbFN0YXRlbWVudHMgPSBmdW5jdGlvbiAoc3RhdGVtZW50cywgY3R4KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0bXQgPSBzdGF0ZW1lbnRzW2ldO1xuICAgICAgICAgICAgdmFyIHZhbCA9IHN0bXQudmlzaXRTdGF0ZW1lbnQodGhpcywgY3R4KTtcbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBSZXR1cm5WYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gU3RhdGVtZW50SW50ZXJwcmV0ZXI7XG59KCkpO1xuZnVuY3Rpb24gX2RlY2xhcmVGbih2YXJOYW1lcywgc3RhdGVtZW50cywgY3R4LCB2aXNpdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2V4ZWN1dGVGdW5jdGlvblN0YXRlbWVudHModmFyTmFtZXMsIGFyZ3MsIHN0YXRlbWVudHMsIGN0eCwgdmlzaXRvcik7XG4gICAgfTtcbn1cbnZhciBDQVRDSF9FUlJPUl9WQVIkMiA9ICdlcnJvcic7XG52YXIgQ0FUQ0hfU1RBQ0tfVkFSJDIgPSAnc3RhY2snO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFuIGludGVybmFsIG1vZHVsZSBvZiB0aGUgQW5ndWxhciBjb21waWxlciB0aGF0IGJlZ2lucyB3aXRoIGNvbXBvbmVudCB0eXBlcyxcbiAqIGV4dHJhY3RzIHRlbXBsYXRlcywgYW5kIGV2ZW50dWFsbHkgcHJvZHVjZXMgYSBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBjb21wb25lbnRcbiAqIHJlYWR5IGZvciBsaW5raW5nIGludG8gYW4gYXBwbGljYXRpb24uXG4gKlxuICogQHNlY3VyaXR5ICBXaGVuIGNvbXBpbGluZyB0ZW1wbGF0ZXMgYXQgcnVudGltZSwgeW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIGVudGlyZSB0ZW1wbGF0ZSBjb21lc1xuICogZnJvbSBhIHRydXN0ZWQgc291cmNlLiBBdHRhY2tlci1jb250cm9sbGVkIGRhdGEgaW50cm9kdWNlZCBieSBhIHRlbXBsYXRlIGNvdWxkIGV4cG9zZSB5b3VyXG4gKiBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuICBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuXG4gKi9cbnZhciBKaXRDb21waWxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBKaXRDb21waWxlcihfbWV0YWRhdGFSZXNvbHZlciwgX3RlbXBsYXRlUGFyc2VyLCBfc3R5bGVDb21waWxlciwgX3ZpZXdDb21waWxlciwgX25nTW9kdWxlQ29tcGlsZXIsIF9zdW1tYXJ5UmVzb2x2ZXIsIF9yZWZsZWN0b3IsIF9qaXRFdmFsdWF0b3IsIF9jb21waWxlckNvbmZpZywgX2NvbnNvbGUsIGdldEV4dHJhTmdNb2R1bGVQcm92aWRlcnMpIHtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFSZXNvbHZlciA9IF9tZXRhZGF0YVJlc29sdmVyO1xuICAgICAgICB0aGlzLl90ZW1wbGF0ZVBhcnNlciA9IF90ZW1wbGF0ZVBhcnNlcjtcbiAgICAgICAgdGhpcy5fc3R5bGVDb21waWxlciA9IF9zdHlsZUNvbXBpbGVyO1xuICAgICAgICB0aGlzLl92aWV3Q29tcGlsZXIgPSBfdmlld0NvbXBpbGVyO1xuICAgICAgICB0aGlzLl9uZ01vZHVsZUNvbXBpbGVyID0gX25nTW9kdWxlQ29tcGlsZXI7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlSZXNvbHZlciA9IF9zdW1tYXJ5UmVzb2x2ZXI7XG4gICAgICAgIHRoaXMuX3JlZmxlY3RvciA9IF9yZWZsZWN0b3I7XG4gICAgICAgIHRoaXMuX2ppdEV2YWx1YXRvciA9IF9qaXRFdmFsdWF0b3I7XG4gICAgICAgIHRoaXMuX2NvbXBpbGVyQ29uZmlnID0gX2NvbXBpbGVyQ29uZmlnO1xuICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7XG4gICAgICAgIHRoaXMuZ2V0RXh0cmFOZ01vZHVsZVByb3ZpZGVycyA9IGdldEV4dHJhTmdNb2R1bGVQcm92aWRlcnM7XG4gICAgICAgIHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZWRIb3N0VGVtcGxhdGVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZWREaXJlY3RpdmVXcmFwcGVyQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX2NvbXBpbGVkTmdNb2R1bGVDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fc2hhcmVkU3R5bGVzaGVldENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fYWRkZWRBb3RTdW1tYXJpZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTW9kdWxlU3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMuYXNzZXJ0U3luYyh0aGlzLl9jb21waWxlTW9kdWxlQW5kQ29tcG9uZW50cyhtb2R1bGVUeXBlLCB0cnVlKSk7XG4gICAgfTtcbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuY29tcGlsZU1vZHVsZUFzeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jb21waWxlTW9kdWxlQW5kQ29tcG9uZW50cyhtb2R1bGVUeXBlLCBmYWxzZSkpO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMuYXNzZXJ0U3luYyh0aGlzLl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50cyhtb2R1bGVUeXBlLCB0cnVlKSk7XG4gICAgfTtcbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHMobW9kdWxlVHlwZSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5nZXRDb21wb25lbnRGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgICB2YXIgc3VtbWFyeSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlU3VtbWFyeShjb21wb25lbnQpO1xuICAgICAgICByZXR1cm4gc3VtbWFyeS5jb21wb25lbnRGYWN0b3J5O1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLmxvYWRBb3RTdW1tYXJpZXMgPSBmdW5jdGlvbiAoc3VtbWFyaWVzKSB7XG4gICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgICAgICB0aGlzLl9hZGRBb3RTdW1tYXJpZXMoc3VtbWFyaWVzKTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fYWRkQW90U3VtbWFyaWVzID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZGRlZEFvdFN1bW1hcmllcy5oYXMoZm4pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWRkZWRBb3RTdW1tYXJpZXMuYWRkKGZuKTtcbiAgICAgICAgdmFyIHN1bW1hcmllcyA9IGZuKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3VtbWFyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZW50cnkgPSBzdW1tYXJpZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkQW90U3VtbWFyaWVzKGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzdW1tYXJ5ID0gZW50cnk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VtbWFyeVJlc29sdmVyLmFkZFN1bW1hcnkoeyBzeW1ib2w6IHN1bW1hcnkudHlwZS5yZWZlcmVuY2UsIG1ldGFkYXRhOiBudWxsLCB0eXBlOiBzdW1tYXJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuaGFzQW90U3VtbWFyeSA9IGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuICEhdGhpcy5fc3VtbWFyeVJlc29sdmVyLnJlc29sdmVTdW1tYXJ5KHJlZik7IH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9maWx0ZXJKaXRJZGVudGlmaWVycyA9IGZ1bmN0aW9uIChpZHMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGlkcy5tYXAoZnVuY3Rpb24gKG1vZCkgeyByZXR1cm4gbW9kLnJlZmVyZW5jZTsgfSkuZmlsdGVyKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuICFfdGhpcy5oYXNBb3RTdW1tYXJ5KHJlZik7IH0pO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlTW9kdWxlQW5kQ29tcG9uZW50cyA9IGZ1bmN0aW9uIChtb2R1bGVUeXBlLCBpc1N5bmMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFN5bmNBc3luYy50aGVuKHRoaXMuX2xvYWRNb2R1bGVzKG1vZHVsZVR5cGUsIGlzU3luYyksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl9jb21waWxlQ29tcG9uZW50cyhtb2R1bGVUeXBlLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY29tcGlsZU1vZHVsZShtb2R1bGVUeXBlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUsIGlzU3luYykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gU3luY0FzeW5jLnRoZW4odGhpcy5fbG9hZE1vZHVsZXMobW9kdWxlVHlwZSwgaXNTeW5jKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudEZhY3RvcmllcyA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuX2NvbXBpbGVDb21wb25lbnRzKG1vZHVsZVR5cGUsIGNvbXBvbmVudEZhY3Rvcmllcyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlRmFjdG9yeTogX3RoaXMuX2NvbXBpbGVNb2R1bGUobW9kdWxlVHlwZSksXG4gICAgICAgICAgICAgICAgY29tcG9uZW50RmFjdG9yaWVzOiBjb21wb25lbnRGYWN0b3JpZXNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9sb2FkTW9kdWxlcyA9IGZ1bmN0aW9uIChtYWluTW9kdWxlLCBpc1N5bmMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxvYWRpbmcgPSBbXTtcbiAgICAgICAgdmFyIG1haW5OZ01vZHVsZSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShtYWluTW9kdWxlKTtcbiAgICAgICAgLy8gTm90ZTogZm9yIHJ1bnRpbWUgY29tcGlsYXRpb24sIHdlIHdhbnQgdG8gdHJhbnNpdGl2ZWx5IGNvbXBpbGUgYWxsIG1vZHVsZXMsXG4gICAgICAgIC8vIHNvIHdlIGFsc28gbmVlZCB0byBsb2FkIHRoZSBkZWNsYXJlZCBkaXJlY3RpdmVzIC8gcGlwZXMgZm9yIGFsbCBuZXN0ZWQgbW9kdWxlcy5cbiAgICAgICAgdGhpcy5fZmlsdGVySml0SWRlbnRpZmllcnMobWFpbk5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcykuZm9yRWFjaChmdW5jdGlvbiAobmVzdGVkTmdNb2R1bGUpIHtcbiAgICAgICAgICAgIC8vIGdldE5nTW9kdWxlTWV0YWRhdGEgb25seSByZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIHBhc3NlZCBpbiBpcyBub3QgYW4gTmdNb2R1bGVcbiAgICAgICAgICAgIHZhciBtb2R1bGVNZXRhID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShuZXN0ZWROZ01vZHVsZSk7XG4gICAgICAgICAgICBfdGhpcy5fZmlsdGVySml0SWRlbnRpZmllcnMobW9kdWxlTWV0YS5kZWNsYXJlZERpcmVjdGl2ZXMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gX3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIubG9hZERpcmVjdGl2ZU1ldGFkYXRhKG1vZHVsZU1ldGEudHlwZS5yZWZlcmVuY2UsIHJlZiwgaXNTeW5jKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLnB1c2gocHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdGhpcy5fZmlsdGVySml0SWRlbnRpZmllcnMobW9kdWxlTWV0YS5kZWNsYXJlZFBpcGVzKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE9yTG9hZFBpcGVNZXRhZGF0YShyZWYpOyB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBTeW5jQXN5bmMuYWxsKGxvYWRpbmcpO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9jb21waWxlTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgdmFyIG5nTW9kdWxlRmFjdG9yeSA9IHRoaXMuX2NvbXBpbGVkTmdNb2R1bGVDYWNoZS5nZXQobW9kdWxlVHlwZSk7XG4gICAgICAgIGlmICghbmdNb2R1bGVGYWN0b3J5KSB7XG4gICAgICAgICAgICB2YXIgbW9kdWxlTWV0YSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShtb2R1bGVUeXBlKTtcbiAgICAgICAgICAgIC8vIEFsd2F5cyBwcm92aWRlIGEgYm91bmQgQ29tcGlsZXJcbiAgICAgICAgICAgIHZhciBleHRyYVByb3ZpZGVycyA9IHRoaXMuZ2V0RXh0cmFOZ01vZHVsZVByb3ZpZGVycyhtb2R1bGVNZXRhLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIHZhciBvdXRwdXRDdHggPSBjcmVhdGVPdXRwdXRDb250ZXh0KCk7XG4gICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IHRoaXMuX25nTW9kdWxlQ29tcGlsZXIuY29tcGlsZShvdXRwdXRDdHgsIG1vZHVsZU1ldGEsIGV4dHJhUHJvdmlkZXJzKTtcbiAgICAgICAgICAgIG5nTW9kdWxlRmFjdG9yeSA9IHRoaXMuX2ludGVycHJldE9ySml0KG5nTW9kdWxlSml0VXJsKG1vZHVsZU1ldGEpLCBvdXRwdXRDdHguc3RhdGVtZW50cylbY29tcGlsZVJlc3VsdC5uZ01vZHVsZUZhY3RvcnlWYXJdO1xuICAgICAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLnNldChtb2R1bGVNZXRhLnR5cGUucmVmZXJlbmNlLCBuZ01vZHVsZUZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZ01vZHVsZUZhY3Rvcnk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NvbXBpbGVDb21wb25lbnRzID0gZnVuY3Rpb24gKG1haW5Nb2R1bGUsIGFsbENvbXBvbmVudEZhY3Rvcmllcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgbmdNb2R1bGUgPSB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEobWFpbk1vZHVsZSk7XG4gICAgICAgIHZhciBtb2R1bGVCeUppdERpcmVjdGl2ZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIHRlbXBsYXRlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdmFyIHRyYW5zSml0TW9kdWxlcyA9IHRoaXMuX2ZpbHRlckppdElkZW50aWZpZXJzKG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUubW9kdWxlcyk7XG4gICAgICAgIHRyYW5zSml0TW9kdWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbE1vZCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsTW9kdWxlTWV0YSA9IF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldE5nTW9kdWxlTWV0YWRhdGEobG9jYWxNb2QpO1xuICAgICAgICAgICAgX3RoaXMuX2ZpbHRlckppdElkZW50aWZpZXJzKGxvY2FsTW9kdWxlTWV0YS5kZWNsYXJlZERpcmVjdGl2ZXMpLmZvckVhY2goZnVuY3Rpb24gKGRpclJlZikge1xuICAgICAgICAgICAgICAgIG1vZHVsZUJ5Sml0RGlyZWN0aXZlLnNldChkaXJSZWYsIGxvY2FsTW9kdWxlTWV0YSk7XG4gICAgICAgICAgICAgICAgdmFyIGRpck1ldGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVNZXRhZGF0YShkaXJSZWYpO1xuICAgICAgICAgICAgICAgIGlmIChkaXJNZXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQoX3RoaXMuX2NyZWF0ZUNvbXBpbGVkVGVtcGxhdGUoZGlyTWV0YSwgbG9jYWxNb2R1bGVNZXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxDb21wb25lbnRGYWN0b3JpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9IF90aGlzLl9jcmVhdGVDb21waWxlZEhvc3RUZW1wbGF0ZShkaXJNZXRhLnR5cGUucmVmZXJlbmNlLCBsb2NhbE1vZHVsZU1ldGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVzLmFkZCh0ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxDb21wb25lbnRGYWN0b3JpZXMucHVzaChkaXJNZXRhLmNvbXBvbmVudEZhY3RvcnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cmFuc0ppdE1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxNb2QpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbE1vZHVsZU1ldGEgPSBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXROZ01vZHVsZU1ldGFkYXRhKGxvY2FsTW9kKTtcbiAgICAgICAgICAgIF90aGlzLl9maWx0ZXJKaXRJZGVudGlmaWVycyhsb2NhbE1vZHVsZU1ldGEuZGVjbGFyZWREaXJlY3RpdmVzKS5mb3JFYWNoKGZ1bmN0aW9uIChkaXJSZWYpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlyTWV0YSA9IF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldERpcmVjdGl2ZU1ldGFkYXRhKGRpclJlZik7XG4gICAgICAgICAgICAgICAgaWYgKGRpck1ldGEuaXNDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyTWV0YS5lbnRyeUNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnlDb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlTWV0YSA9IG1vZHVsZUJ5Sml0RGlyZWN0aXZlLmdldChlbnRyeUNvbXBvbmVudFR5cGUuY29tcG9uZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZXMuYWRkKF90aGlzLl9jcmVhdGVDb21waWxlZEhvc3RUZW1wbGF0ZShlbnRyeUNvbXBvbmVudFR5cGUuY29tcG9uZW50VHlwZSwgbW9kdWxlTWV0YSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvY2FsTW9kdWxlTWV0YS5lbnRyeUNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnlDb21wb25lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5oYXNBb3RTdW1tYXJ5KGVudHJ5Q29tcG9uZW50VHlwZS5jb21wb25lbnRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlTWV0YSA9IG1vZHVsZUJ5Sml0RGlyZWN0aXZlLmdldChlbnRyeUNvbXBvbmVudFR5cGUuY29tcG9uZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlcy5hZGQoX3RoaXMuX2NyZWF0ZUNvbXBpbGVkSG9zdFRlbXBsYXRlKGVudHJ5Q29tcG9uZW50VHlwZS5jb21wb25lbnRUeXBlLCBtb2R1bGVNZXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW1wbGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAodGVtcGxhdGUpIHsgcmV0dXJuIF90aGlzLl9jb21waWxlVGVtcGxhdGUodGVtcGxhdGUpOyB9KTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5jbGVhckNhY2hlRm9yID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5jbGVhckNhY2hlRm9yKHR5cGUpO1xuICAgICAgICB0aGlzLl9jb21waWxlZEhvc3RUZW1wbGF0ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgdmFyIGNvbXBpbGVkVGVtcGxhdGUgPSB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAoY29tcGlsZWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmRlbGV0ZSh0eXBlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIE5vdGU6IGRvbid0IGNsZWFyIHRoZSBfYWRkZWRBb3RTdW1tYXJpZXMsIGFzIHRoZXkgZG9uJ3QgY2hhbmdlIVxuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlc29sdmVyLmNsZWFyQ2FjaGUoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2NvbXBpbGVkSG9zdFRlbXBsYXRlQ2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fY29tcGlsZWROZ01vZHVsZUNhY2hlLmNsZWFyKCk7XG4gICAgfTtcbiAgICBKaXRDb21waWxlci5wcm90b3R5cGUuX2NyZWF0ZUNvbXBpbGVkSG9zdFRlbXBsYXRlID0gZnVuY3Rpb24gKGNvbXBUeXBlLCBuZ01vZHVsZSkge1xuICAgICAgICBpZiAoIW5nTW9kdWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21wb25lbnQgXCIgKyBzdHJpbmdpZnkoY29tcFR5cGUpICsgXCIgaXMgbm90IHBhcnQgb2YgYW55IE5nTW9kdWxlIG9yIHRoZSBtb2R1bGUgaGFzIG5vdCBiZWVuIGltcG9ydGVkIGludG8geW91ciBtb2R1bGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb21waWxlZFRlbXBsYXRlID0gdGhpcy5fY29tcGlsZWRIb3N0VGVtcGxhdGVDYWNoZS5nZXQoY29tcFR5cGUpO1xuICAgICAgICBpZiAoIWNvbXBpbGVkVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHZhciBjb21wTWV0YSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0RGlyZWN0aXZlTWV0YWRhdGEoY29tcFR5cGUpO1xuICAgICAgICAgICAgYXNzZXJ0Q29tcG9uZW50KGNvbXBNZXRhKTtcbiAgICAgICAgICAgIHZhciBob3N0TWV0YSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0SG9zdENvbXBvbmVudE1ldGFkYXRhKGNvbXBNZXRhLCBjb21wTWV0YS5jb21wb25lbnRGYWN0b3J5LnZpZXdEZWZGYWN0b3J5KTtcbiAgICAgICAgICAgIGNvbXBpbGVkVGVtcGxhdGUgPVxuICAgICAgICAgICAgICAgIG5ldyBDb21waWxlZFRlbXBsYXRlKHRydWUsIGNvbXBNZXRhLnR5cGUsIGhvc3RNZXRhLCBuZ01vZHVsZSwgW2NvbXBNZXRhLnR5cGVdKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBpbGVkSG9zdFRlbXBsYXRlQ2FjaGUuc2V0KGNvbXBUeXBlLCBjb21waWxlZFRlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fY3JlYXRlQ29tcGlsZWRUZW1wbGF0ZSA9IGZ1bmN0aW9uIChjb21wTWV0YSwgbmdNb2R1bGUpIHtcbiAgICAgICAgdmFyIGNvbXBpbGVkVGVtcGxhdGUgPSB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuZ2V0KGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlKTtcbiAgICAgICAgaWYgKCFjb21waWxlZFRlbXBsYXRlKSB7XG4gICAgICAgICAgICBhc3NlcnRDb21wb25lbnQoY29tcE1ldGEpO1xuICAgICAgICAgICAgY29tcGlsZWRUZW1wbGF0ZSA9IG5ldyBDb21waWxlZFRlbXBsYXRlKGZhbHNlLCBjb21wTWV0YS50eXBlLCBjb21wTWV0YSwgbmdNb2R1bGUsIG5nTW9kdWxlLnRyYW5zaXRpdmVNb2R1bGUuZGlyZWN0aXZlcyk7XG4gICAgICAgICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlQ2FjaGUuc2V0KGNvbXBNZXRhLnR5cGUucmVmZXJlbmNlLCBjb21waWxlZFRlbXBsYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fY29tcGlsZVRlbXBsYXRlID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0ZW1wbGF0ZS5pc0NvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbXBNZXRhID0gdGVtcGxhdGUuY29tcE1ldGE7XG4gICAgICAgIHZhciBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciBvdXRwdXRDb250ZXh0ID0gY3JlYXRlT3V0cHV0Q29udGV4dCgpO1xuICAgICAgICB2YXIgY29tcG9uZW50U3R5bGVzaGVldCA9IHRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudChvdXRwdXRDb250ZXh0LCBjb21wTWV0YSk7XG4gICAgICAgIGNvbXBNZXRhLnRlbXBsYXRlLmV4dGVybmFsU3R5bGVzaGVldHMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVzaGVldE1ldGEpIHtcbiAgICAgICAgICAgIHZhciBjb21waWxlZFN0eWxlc2hlZXQgPSBfdGhpcy5fc3R5bGVDb21waWxlci5jb21waWxlU3R5bGVzKGNyZWF0ZU91dHB1dENvbnRleHQoKSwgY29tcE1ldGEsIHN0eWxlc2hlZXRNZXRhKTtcbiAgICAgICAgICAgIGV4dGVybmFsU3R5bGVzaGVldHNCeU1vZHVsZVVybC5zZXQoc3R5bGVzaGVldE1ldGEubW9kdWxlVXJsLCBjb21waWxlZFN0eWxlc2hlZXQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZVN0eWxlc0NvbXBpbGVSZXN1bHQoY29tcG9uZW50U3R5bGVzaGVldCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKTtcbiAgICAgICAgdmFyIHBpcGVzID0gdGVtcGxhdGUubmdNb2R1bGUudHJhbnNpdGl2ZU1vZHVsZS5waXBlcy5tYXAoZnVuY3Rpb24gKHBpcGUpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldFBpcGVTdW1tYXJ5KHBpcGUucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMuX3BhcnNlVGVtcGxhdGUoY29tcE1ldGEsIHRlbXBsYXRlLm5nTW9kdWxlLCB0ZW1wbGF0ZS5kaXJlY3RpdmVzKSwgcGFyc2VkVGVtcGxhdGUgPSBfYS50ZW1wbGF0ZSwgdXNlZFBpcGVzID0gX2EucGlwZXM7XG4gICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gdGhpcy5fdmlld0NvbXBpbGVyLmNvbXBpbGVDb21wb25lbnQob3V0cHV0Q29udGV4dCwgY29tcE1ldGEsIHBhcnNlZFRlbXBsYXRlLCB2YXJpYWJsZShjb21wb25lbnRTdHlsZXNoZWV0LnN0eWxlc1ZhciksIHVzZWRQaXBlcyk7XG4gICAgICAgIHZhciBldmFsUmVzdWx0ID0gdGhpcy5faW50ZXJwcmV0T3JKaXQodGVtcGxhdGVKaXRVcmwodGVtcGxhdGUubmdNb2R1bGUudHlwZSwgdGVtcGxhdGUuY29tcE1ldGEpLCBvdXRwdXRDb250ZXh0LnN0YXRlbWVudHMpO1xuICAgICAgICB2YXIgdmlld0NsYXNzID0gZXZhbFJlc3VsdFtjb21waWxlUmVzdWx0LnZpZXdDbGFzc1Zhcl07XG4gICAgICAgIHZhciByZW5kZXJlclR5cGUgPSBldmFsUmVzdWx0W2NvbXBpbGVSZXN1bHQucmVuZGVyZXJUeXBlVmFyXTtcbiAgICAgICAgdGVtcGxhdGUuY29tcGlsZWQodmlld0NsYXNzLCByZW5kZXJlclR5cGUpO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9wYXJzZVRlbXBsYXRlID0gZnVuY3Rpb24gKGNvbXBNZXRhLCBuZ01vZHVsZSwgZGlyZWN0aXZlSWRlbnRpZmllcnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gTm90ZTogISBpcyBvayBoZXJlIGFzIGNvbXBvbmVudHMgYWx3YXlzIGhhdmUgYSB0ZW1wbGF0ZS5cbiAgICAgICAgdmFyIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBjb21wTWV0YS50ZW1wbGF0ZS5wcmVzZXJ2ZVdoaXRlc3BhY2VzO1xuICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZUlkZW50aWZpZXJzLm1hcChmdW5jdGlvbiAoZGlyKSB7IHJldHVybiBfdGhpcy5fbWV0YWRhdGFSZXNvbHZlci5nZXREaXJlY3RpdmVTdW1tYXJ5KGRpci5yZWZlcmVuY2UpOyB9KTtcbiAgICAgICAgdmFyIHBpcGVzID0gbmdNb2R1bGUudHJhbnNpdGl2ZU1vZHVsZS5waXBlcy5tYXAoZnVuY3Rpb24gKHBpcGUpIHsgcmV0dXJuIF90aGlzLl9tZXRhZGF0YVJlc29sdmVyLmdldFBpcGVTdW1tYXJ5KHBpcGUucmVmZXJlbmNlKTsgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZVBhcnNlci5wYXJzZShjb21wTWV0YSwgY29tcE1ldGEudGVtcGxhdGUuaHRtbEFzdCwgZGlyZWN0aXZlcywgcGlwZXMsIG5nTW9kdWxlLnNjaGVtYXMsIHRlbXBsYXRlU291cmNlVXJsKG5nTW9kdWxlLnR5cGUsIGNvbXBNZXRhLCBjb21wTWV0YS50ZW1wbGF0ZSksIHByZXNlcnZlV2hpdGVzcGFjZXMpO1xuICAgIH07XG4gICAgSml0Q29tcGlsZXIucHJvdG90eXBlLl9yZXNvbHZlU3R5bGVzQ29tcGlsZVJlc3VsdCA9IGZ1bmN0aW9uIChyZXN1bHQsIGV4dGVybmFsU3R5bGVzaGVldHNCeU1vZHVsZVVybCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCwgaSkge1xuICAgICAgICAgICAgdmFyIG5lc3RlZENvbXBpbGVSZXN1bHQgPSBleHRlcm5hbFN0eWxlc2hlZXRzQnlNb2R1bGVVcmwuZ2V0KGRlcC5tb2R1bGVVcmwpO1xuICAgICAgICAgICAgdmFyIG5lc3RlZFN0eWxlc0FyciA9IF90aGlzLl9yZXNvbHZlQW5kRXZhbFN0eWxlc0NvbXBpbGVSZXN1bHQobmVzdGVkQ29tcGlsZVJlc3VsdCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKTtcbiAgICAgICAgICAgIGRlcC5zZXRWYWx1ZShuZXN0ZWRTdHlsZXNBcnIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5fcmVzb2x2ZUFuZEV2YWxTdHlsZXNDb21waWxlUmVzdWx0ID0gZnVuY3Rpb24gKHJlc3VsdCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVTdHlsZXNDb21waWxlUmVzdWx0KHJlc3VsdCwgZXh0ZXJuYWxTdHlsZXNoZWV0c0J5TW9kdWxlVXJsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVycHJldE9ySml0KHNoYXJlZFN0eWxlc2hlZXRKaXRVcmwocmVzdWx0Lm1ldGEsIHRoaXMuX3NoYXJlZFN0eWxlc2hlZXRDb3VudCsrKSwgcmVzdWx0Lm91dHB1dEN0eC5zdGF0ZW1lbnRzKVtyZXN1bHQuc3R5bGVzVmFyXTtcbiAgICB9O1xuICAgIEppdENvbXBpbGVyLnByb3RvdHlwZS5faW50ZXJwcmV0T3JKaXQgPSBmdW5jdGlvbiAoc291cmNlVXJsLCBzdGF0ZW1lbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29tcGlsZXJDb25maWcudXNlSml0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0U3RhdGVtZW50cyhzdGF0ZW1lbnRzLCB0aGlzLl9yZWZsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ppdEV2YWx1YXRvci5ldmFsdWF0ZVN0YXRlbWVudHMoc291cmNlVXJsLCBzdGF0ZW1lbnRzLCB0aGlzLl9yZWZsZWN0b3IsIHRoaXMuX2NvbXBpbGVyQ29uZmlnLmppdERldk1vZGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gSml0Q29tcGlsZXI7XG59KCkpO1xudmFyIENvbXBpbGVkVGVtcGxhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZWRUZW1wbGF0ZShpc0hvc3QsIGNvbXBUeXBlLCBjb21wTWV0YSwgbmdNb2R1bGUsIGRpcmVjdGl2ZXMpIHtcbiAgICAgICAgdGhpcy5pc0hvc3QgPSBpc0hvc3Q7XG4gICAgICAgIHRoaXMuY29tcFR5cGUgPSBjb21wVHlwZTtcbiAgICAgICAgdGhpcy5jb21wTWV0YSA9IGNvbXBNZXRhO1xuICAgICAgICB0aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgIHRoaXMuX3ZpZXdDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNDb21waWxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBDb21waWxlZFRlbXBsYXRlLnByb3RvdHlwZS5jb21waWxlZCA9IGZ1bmN0aW9uICh2aWV3Q2xhc3MsIHJlbmRlcmVyVHlwZSkge1xuICAgICAgICB0aGlzLl92aWV3Q2xhc3MgPSB2aWV3Q2xhc3M7XG4gICAgICAgIHRoaXMuY29tcE1ldGEuY29tcG9uZW50Vmlld1R5cGUuc2V0RGVsZWdhdGUodmlld0NsYXNzKTtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiByZW5kZXJlclR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcE1ldGEucmVuZGVyZXJUeXBlW3Byb3BdID0gcmVuZGVyZXJUeXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDb21waWxlZCA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcGlsZWRUZW1wbGF0ZTtcbn0oKSk7XG5mdW5jdGlvbiBhc3NlcnRDb21wb25lbnQobWV0YSkge1xuICAgIGlmICghbWV0YS5pc0NvbXBvbmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgY29tcGlsZSAnXCIgKyBpZGVudGlmaWVyTmFtZShtZXRhLnR5cGUpICsgXCInIGJlY2F1c2UgaXQgaXMgbm90IGEgY29tcG9uZW50LlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVPdXRwdXRDb250ZXh0KCkge1xuICAgIHZhciBpbXBvcnRFeHByJDEgPSBmdW5jdGlvbiAoc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBpbXBvcnRFeHByKHsgbmFtZTogaWRlbnRpZmllck5hbWUoc3ltYm9sKSwgbW9kdWxlTmFtZTogbnVsbCwgcnVudGltZTogc3ltYm9sIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHsgc3RhdGVtZW50czogW10sIGdlbkZpbGVQYXRoOiAnJywgaW1wb3J0RXhwcjogaW1wb3J0RXhwciQxLCBjb25zdGFudFBvb2w6IG5ldyBDb25zdGFudFBvb2woKSB9O1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scyB0aGF0IHRoZSBjb21waWxlciBuZWVkcy5cbiAqL1xudmFyIENvbXBpbGVSZWZsZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ29tcGlsZVJlZmxlY3RvcigpIHtcbiAgICB9XG4gICAgcmV0dXJuIENvbXBpbGVSZWZsZWN0b3I7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIENyZWF0ZSBhIHtAbGluayBVcmxSZXNvbHZlcn0gd2l0aCBubyBwYWNrYWdlIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVXJsUmVzb2x2ZXJXaXRob3V0UGFja2FnZVByZWZpeCgpIHtcbiAgICByZXR1cm4gbmV3IFVybFJlc29sdmVyKCk7XG59XG5mdW5jdGlvbiBjcmVhdGVPZmZsaW5lQ29tcGlsZVVybFJlc29sdmVyKCkge1xuICAgIHJldHVybiBuZXcgVXJsUmVzb2x2ZXIoJy4nKTtcbn1cbnZhciBVcmxSZXNvbHZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBVcmxSZXNvbHZlckltcGwoX3BhY2thZ2VQcmVmaXgpIHtcbiAgICAgICAgaWYgKF9wYWNrYWdlUHJlZml4ID09PSB2b2lkIDApIHsgX3BhY2thZ2VQcmVmaXggPSBudWxsOyB9XG4gICAgICAgIHRoaXMuX3BhY2thZ2VQcmVmaXggPSBfcGFja2FnZVByZWZpeDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIGB1cmxgIGdpdmVuIHRoZSBgYmFzZVVybGA6XG4gICAgICogLSB3aGVuIHRoZSBgdXJsYCBpcyBudWxsLCB0aGUgYGJhc2VVcmxgIGlzIHJldHVybmVkLFxuICAgICAqIC0gaWYgYHVybGAgaXMgcmVsYXRpdmUgKCdwYXRoL3RvL2hlcmUnLCAnLi9wYXRoL3RvL2hlcmUnKSwgdGhlIHJlc29sdmVkIHVybCBpcyBhIGNvbWJpbmF0aW9uIG9mXG4gICAgICogYGJhc2VVcmxgIGFuZCBgdXJsYCxcbiAgICAgKiAtIGlmIGB1cmxgIGlzIGFic29sdXRlIChpdCBoYXMgYSBzY2hlbWU6ICdodHRwOi8vJywgJ2h0dHBzOi8vJyBvciBzdGFydCB3aXRoICcvJyksIHRoZSBgdXJsYCBpc1xuICAgICAqIHJldHVybmVkIGFzIGlzIChpZ25vcmluZyB0aGUgYGJhc2VVcmxgKVxuICAgICAqL1xuICAgIFVybFJlc29sdmVySW1wbC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uIChiYXNlVXJsLCB1cmwpIHtcbiAgICAgICAgdmFyIHJlc29sdmVkVXJsID0gdXJsO1xuICAgICAgICBpZiAoYmFzZVVybCAhPSBudWxsICYmIGJhc2VVcmwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRVcmwgPSBfcmVzb2x2ZVVybChiYXNlVXJsLCByZXNvbHZlZFVybCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc29sdmVkUGFydHMgPSBfc3BsaXQocmVzb2x2ZWRVcmwpO1xuICAgICAgICB2YXIgcHJlZml4ID0gdGhpcy5fcGFja2FnZVByZWZpeDtcbiAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHJlc29sdmVkUGFydHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgcmVzb2x2ZWRQYXJ0c1tfQ29tcG9uZW50SW5kZXguU2NoZW1lXSA9PSAncGFja2FnZScpIHtcbiAgICAgICAgICAgIHZhciBwYXRoID0gcmVzb2x2ZWRQYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gICAgICAgICAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBcIi9cIiArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVXJsO1xuICAgIH07XG4gICAgcmV0dXJuIFVybFJlc29sdmVySW1wbDtcbn0oKSk7XG4vKipcbiAqIEV4dHJhY3QgdGhlIHNjaGVtZSBvZiBhIFVSTC5cbiAqL1xuZnVuY3Rpb24gZ2V0VXJsU2NoZW1lKHVybCkge1xuICAgIHZhciBtYXRjaCA9IF9zcGxpdCh1cmwpO1xuICAgIHJldHVybiAobWF0Y2ggJiYgbWF0Y2hbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0pIHx8ICcnO1xufVxuLy8gVGhlIGNvZGUgYmVsb3cgaXMgYWRhcHRlZCBmcm9tIFRyYWNldXI6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3RyYWNldXItY29tcGlsZXIvYmxvYi85NTExYzFkYWZhOTcyYmYwZGUxMjAyYThhODYzYmFkMDJmMGY5NWE4L3NyYy9ydW50aW1lL3VybC5qc1xuLyoqXG4gKiBCdWlsZHMgYSBVUkkgc3RyaW5nIGZyb20gYWxyZWFkeS1lbmNvZGVkIHBhcnRzLlxuICpcbiAqIE5vIGVuY29kaW5nIGlzIHBlcmZvcm1lZC4gIEFueSBjb21wb25lbnQgbWF5IGJlIG9taXR0ZWQgYXMgZWl0aGVyIG51bGwgb3JcbiAqIHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gb3B0X3NjaGVtZSBUaGUgc2NoZW1lIHN1Y2ggYXMgJ2h0dHAnLlxuICogQHBhcmFtIG9wdF91c2VySW5mbyBUaGUgdXNlciBuYW1lIGJlZm9yZSB0aGUgJ0AnLlxuICogQHBhcmFtIG9wdF9kb21haW4gVGhlIGRvbWFpbiBzdWNoIGFzICd3d3cuZ29vZ2xlLmNvbScsIGFscmVhZHlcbiAqICAgICBVUkktZW5jb2RlZC5cbiAqIEBwYXJhbSBvcHRfcG9ydCBUaGUgcG9ydCBudW1iZXIuXG4gKiBAcGFyYW0gb3B0X3BhdGggVGhlIHBhdGgsIGFscmVhZHkgVVJJLWVuY29kZWQuICBJZiBpdCBpcyBub3RcbiAqICAgICBlbXB0eSwgaXQgbXVzdCBiZWdpbiB3aXRoIGEgc2xhc2guXG4gKiBAcGFyYW0gb3B0X3F1ZXJ5RGF0YSBUaGUgVVJJLWVuY29kZWQgcXVlcnkgZGF0YS5cbiAqIEBwYXJhbSBvcHRfZnJhZ21lbnQgVGhlIFVSSS1lbmNvZGVkIGZyYWdtZW50IGlkZW50aWZpZXIuXG4gKiBAcmV0dXJuIFRoZSBmdWxseSBjb21iaW5lZCBVUkkuXG4gKi9cbmZ1bmN0aW9uIF9idWlsZEZyb21FbmNvZGVkUGFydHMob3B0X3NjaGVtZSwgb3B0X3VzZXJJbmZvLCBvcHRfZG9tYWluLCBvcHRfcG9ydCwgb3B0X3BhdGgsIG9wdF9xdWVyeURhdGEsIG9wdF9mcmFnbWVudCkge1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICBpZiAob3B0X3NjaGVtZSAhPSBudWxsKSB7XG4gICAgICAgIG91dC5wdXNoKG9wdF9zY2hlbWUgKyAnOicpO1xuICAgIH1cbiAgICBpZiAob3B0X2RvbWFpbiAhPSBudWxsKSB7XG4gICAgICAgIG91dC5wdXNoKCcvLycpO1xuICAgICAgICBpZiAob3B0X3VzZXJJbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgIG91dC5wdXNoKG9wdF91c2VySW5mbyArICdAJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0LnB1c2gob3B0X2RvbWFpbik7XG4gICAgICAgIGlmIChvcHRfcG9ydCAhPSBudWxsKSB7XG4gICAgICAgICAgICBvdXQucHVzaCgnOicgKyBvcHRfcG9ydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdF9wYXRoICE9IG51bGwpIHtcbiAgICAgICAgb3V0LnB1c2gob3B0X3BhdGgpO1xuICAgIH1cbiAgICBpZiAob3B0X3F1ZXJ5RGF0YSAhPSBudWxsKSB7XG4gICAgICAgIG91dC5wdXNoKCc/JyArIG9wdF9xdWVyeURhdGEpO1xuICAgIH1cbiAgICBpZiAob3B0X2ZyYWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgb3V0LnB1c2goJyMnICsgb3B0X2ZyYWdtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn1cbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGJyZWFraW5nIGEgVVJJIGludG8gaXRzIGNvbXBvbmVudCBwYXJ0cy5cbiAqXG4gKiB7QGxpbmsgaHR0cDovL3d3dy5nYml2LmNvbS9wcm90b2NvbHMvdXJpL3JmYy9yZmMzOTg2Lmh0bWwjUkZDMjIzNH0gc2F5c1xuICogQXMgdGhlIFwiZmlyc3QtbWF0Y2gtd2luc1wiIGFsZ29yaXRobSBpcyBpZGVudGljYWwgdG8gdGhlIFwiZ3JlZWR5XCJcbiAqIGRpc2FtYmlndWF0aW9uIG1ldGhvZCB1c2VkIGJ5IFBPU0lYIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGl0IGlzIG5hdHVyYWwgYW5kXG4gKiBjb21tb25wbGFjZSB0byB1c2UgYSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHBhcnNpbmcgdGhlIHBvdGVudGlhbCBmaXZlXG4gKiBjb21wb25lbnRzIG9mIGEgVVJJIHJlZmVyZW5jZS5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYnJlYWtpbmctZG93biBhXG4gKiB3ZWxsLWZvcm1lZCBVUkkgcmVmZXJlbmNlIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogPHByZT5cbiAqIF4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT9cbiAqICAxMiAgICAgICAgICAgIDMgIDQgICAgICAgICAgNSAgICAgICA2ICA3ICAgICAgICA4IDlcbiAqIDwvcHJlPlxuICpcbiAqIFRoZSBudW1iZXJzIGluIHRoZSBzZWNvbmQgbGluZSBhYm92ZSBhcmUgb25seSB0byBhc3Npc3QgcmVhZGFiaWxpdHk7IHRoZXlcbiAqIGluZGljYXRlIHRoZSByZWZlcmVuY2UgcG9pbnRzIGZvciBlYWNoIHN1YmV4cHJlc3Npb24gKGkuZS4sIGVhY2ggcGFpcmVkXG4gKiBwYXJlbnRoZXNpcykuIFdlIHJlZmVyIHRvIHRoZSB2YWx1ZSBtYXRjaGVkIGZvciBzdWJleHByZXNzaW9uIDxuPiBhcyAkPG4+LlxuICogRm9yIGV4YW1wbGUsIG1hdGNoaW5nIHRoZSBhYm92ZSBleHByZXNzaW9uIHRvXG4gKiA8cHJlPlxuICogICAgIGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvdXJpLyNSZWxhdGVkXG4gKiA8L3ByZT5cbiAqIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBzdWJleHByZXNzaW9uIG1hdGNoZXM6XG4gKiA8cHJlPlxuICogICAgJDEgPSBodHRwOlxuICogICAgJDIgPSBodHRwXG4gKiAgICAkMyA9IC8vd3d3Lmljcy51Y2kuZWR1XG4gKiAgICAkNCA9IHd3dy5pY3MudWNpLmVkdVxuICogICAgJDUgPSAvcHViL2lldGYvdXJpL1xuICogICAgJDYgPSA8dW5kZWZpbmVkPlxuICogICAgJDcgPSA8dW5kZWZpbmVkPlxuICogICAgJDggPSAjUmVsYXRlZFxuICogICAgJDkgPSBSZWxhdGVkXG4gKiA8L3ByZT5cbiAqIHdoZXJlIDx1bmRlZmluZWQ+IGluZGljYXRlcyB0aGF0IHRoZSBjb21wb25lbnQgaXMgbm90IHByZXNlbnQsIGFzIGlzIHRoZVxuICogY2FzZSBmb3IgdGhlIHF1ZXJ5IGNvbXBvbmVudCBpbiB0aGUgYWJvdmUgZXhhbXBsZS4gVGhlcmVmb3JlLCB3ZSBjYW5cbiAqIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIGZpdmUgY29tcG9uZW50cyBhc1xuICogPHByZT5cbiAqICAgIHNjaGVtZSAgICA9ICQyXG4gKiAgICBhdXRob3JpdHkgPSAkNFxuICogICAgcGF0aCAgICAgID0gJDVcbiAqICAgIHF1ZXJ5ICAgICA9ICQ3XG4gKiAgICBmcmFnbWVudCAgPSAkOVxuICogPC9wcmU+XG4gKlxuICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgYmVlbiBtb2RpZmllZCBzbGlnaHRseSB0byBleHBvc2UgdGhlXG4gKiB1c2VySW5mbywgZG9tYWluLCBhbmQgcG9ydCBzZXBhcmF0ZWx5IGZyb20gdGhlIGF1dGhvcml0eS5cbiAqIFRoZSBtb2RpZmllZCB2ZXJzaW9uIHlpZWxkc1xuICogPHByZT5cbiAqICAgICQxID0gaHR0cCAgICAgICAgICAgICAgc2NoZW1lXG4gKiAgICAkMiA9IDx1bmRlZmluZWQ+ICAgICAgIHVzZXJJbmZvIC1cXFxuICogICAgJDMgPSB3d3cuaWNzLnVjaS5lZHUgICBkb21haW4gICAgIHwgYXV0aG9yaXR5XG4gKiAgICAkNCA9IDx1bmRlZmluZWQ+ICAgICAgIHBvcnQgICAgIC0vXG4gKiAgICAkNSA9IC9wdWIvaWV0Zi91cmkvICAgIHBhdGhcbiAqICAgICQ2ID0gPHVuZGVmaW5lZD4gICAgICAgcXVlcnkgd2l0aG91dCA/XG4gKiAgICAkNyA9IFJlbGF0ZWQgICAgICAgICAgIGZyYWdtZW50IHdpdGhvdXQgI1xuICogPC9wcmU+XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIF9zcGxpdFJlID0gbmV3IFJlZ0V4cCgnXicgK1xuICAgICcoPzonICtcbiAgICAnKFteOi8/Iy5dKyknICsgLy8gc2NoZW1lIC0gaWdub3JlIHNwZWNpYWwgY2hhcmFjdGVyc1xuICAgIC8vIHVzZWQgYnkgb3RoZXIgVVJMIHBhcnRzIHN1Y2ggYXMgOixcbiAgICAvLyA/LCAvLCAjLCBhbmQgLlxuICAgICc6KT8nICtcbiAgICAnKD86Ly8nICtcbiAgICAnKD86KFteLz8jXSopQCk/JyArIC8vIHVzZXJJbmZvXG4gICAgJyhbXFxcXHdcXFxcZFxcXFwtXFxcXHUwMTAwLVxcXFx1ZmZmZi4lXSopJyArIC8vIGRvbWFpbiAtIHJlc3RyaWN0IHRvIGxldHRlcnMsXG4gICAgLy8gZGlnaXRzLCBkYXNoZXMsIGRvdHMsIHBlcmNlbnRcbiAgICAvLyBlc2NhcGVzLCBhbmQgdW5pY29kZSBjaGFyYWN0ZXJzLlxuICAgICcoPzo6KFswLTldKykpPycgKyAvLyBwb3J0XG4gICAgJyk/JyArXG4gICAgJyhbXj8jXSspPycgKyAvLyBwYXRoXG4gICAgJyg/OlxcXFw/KFteI10qKSk/JyArIC8vIHF1ZXJ5XG4gICAgJyg/OiMoLiopKT8nICsgLy8gZnJhZ21lbnRcbiAgICAnJCcpO1xuLyoqXG4gKiBUaGUgaW5kZXggb2YgZWFjaCBVUkkgY29tcG9uZW50IGluIHRoZSByZXR1cm4gdmFsdWUgb2YgZ29vZy51cmkudXRpbHMuc3BsaXQuXG4gKiBAZW51bSB7bnVtYmVyfVxuICovXG52YXIgX0NvbXBvbmVudEluZGV4O1xuKGZ1bmN0aW9uIChfQ29tcG9uZW50SW5kZXgpIHtcbiAgICBfQ29tcG9uZW50SW5kZXhbX0NvbXBvbmVudEluZGV4W1wiU2NoZW1lXCJdID0gMV0gPSBcIlNjaGVtZVwiO1xuICAgIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXhbXCJVc2VySW5mb1wiXSA9IDJdID0gXCJVc2VySW5mb1wiO1xuICAgIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXhbXCJEb21haW5cIl0gPSAzXSA9IFwiRG9tYWluXCI7XG4gICAgX0NvbXBvbmVudEluZGV4W19Db21wb25lbnRJbmRleFtcIlBvcnRcIl0gPSA0XSA9IFwiUG9ydFwiO1xuICAgIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXhbXCJQYXRoXCJdID0gNV0gPSBcIlBhdGhcIjtcbiAgICBfQ29tcG9uZW50SW5kZXhbX0NvbXBvbmVudEluZGV4W1wiUXVlcnlEYXRhXCJdID0gNl0gPSBcIlF1ZXJ5RGF0YVwiO1xuICAgIF9Db21wb25lbnRJbmRleFtfQ29tcG9uZW50SW5kZXhbXCJGcmFnbWVudFwiXSA9IDddID0gXCJGcmFnbWVudFwiO1xufSkoX0NvbXBvbmVudEluZGV4IHx8IChfQ29tcG9uZW50SW5kZXggPSB7fSkpO1xuLyoqXG4gKiBTcGxpdHMgYSBVUkkgaW50byBpdHMgY29tcG9uZW50IHBhcnRzLlxuICpcbiAqIEVhY2ggY29tcG9uZW50IGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIGNvbXBvbmVudCBpbmRpY2VzOyBmb3IgZXhhbXBsZTpcbiAqIDxwcmU+XG4gKiBnb29nLnVyaS51dGlscy5zcGxpdChzb21lU3RyKVtnb29nLnVyaS51dGlscy5Db21wb250ZW50SW5kZXguUVVFUllfREFUQV07XG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0gdXJpIFRoZSBVUkkgc3RyaW5nIHRvIGV4YW1pbmUuXG4gKiBAcmV0dXJuIEVhY2ggY29tcG9uZW50IHN0aWxsIFVSSS1lbmNvZGVkLlxuICogICAgIEVhY2ggY29tcG9uZW50IHRoYXQgaXMgcHJlc2VudCB3aWxsIGNvbnRhaW4gdGhlIGVuY29kZWQgdmFsdWUsIHdoZXJlYXNcbiAqICAgICBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHdpbGwgYmUgdW5kZWZpbmVkIG9yIGVtcHR5LCBkZXBlbmRpbmdcbiAqICAgICBvbiB0aGUgYnJvd3NlcidzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4gIE5ldmVyIG51bGwsIHNpbmNlXG4gKiAgICAgYXJiaXRyYXJ5IHN0cmluZ3MgbWF5IHN0aWxsIGxvb2sgbGlrZSBwYXRoIG5hbWVzLlxuICovXG5mdW5jdGlvbiBfc3BsaXQodXJpKSB7XG4gICAgcmV0dXJuIHVyaS5tYXRjaChfc3BsaXRSZSk7XG59XG4vKipcbiAgKiBSZW1vdmVzIGRvdCBzZWdtZW50cyBpbiBnaXZlbiBwYXRoIGNvbXBvbmVudCwgYXMgZGVzY3JpYmVkIGluXG4gICogUkZDIDM5ODYsIHNlY3Rpb24gNS4yLjQuXG4gICpcbiAgKiBAcGFyYW0gcGF0aCBBIG5vbi1lbXB0eSBwYXRoIGNvbXBvbmVudC5cbiAgKiBAcmV0dXJuIFBhdGggY29tcG9uZW50IHdpdGggcmVtb3ZlZCBkb3Qgc2VnbWVudHMuXG4gICovXG5mdW5jdGlvbiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCkge1xuICAgIGlmIChwYXRoID09ICcvJylcbiAgICAgICAgcmV0dXJuICcvJztcbiAgICB2YXIgbGVhZGluZ1NsYXNoID0gcGF0aFswXSA9PSAnLycgPyAnLycgOiAnJztcbiAgICB2YXIgdHJhaWxpbmdTbGFzaCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nID8gJy8nIDogJyc7XG4gICAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICB2YXIgdXAgPSAwO1xuICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHNlZ21lbnRzLmxlbmd0aDsgcG9zKyspIHtcbiAgICAgICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1twb3NdO1xuICAgICAgICBzd2l0Y2ggKHNlZ21lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgJyc6XG4gICAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJy4uJzpcbiAgICAgICAgICAgICAgICBpZiAob3V0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXArKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dC5wdXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsZWFkaW5nU2xhc2ggPT0gJycpIHtcbiAgICAgICAgd2hpbGUgKHVwLS0gPiAwKSB7XG4gICAgICAgICAgICBvdXQudW5zaGlmdCgnLi4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIG91dC5wdXNoKCcuJyk7XG4gICAgfVxuICAgIHJldHVybiBsZWFkaW5nU2xhc2ggKyBvdXQuam9pbignLycpICsgdHJhaWxpbmdTbGFzaDtcbn1cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgdGhlIHBhcnRzIGZyb20gc3BsaXQgYW5kIGNhbm9uaWNhbGl6ZXMgdGhlIHBhdGggcGFydFxuICogYW5kIHRoZW4gam9pbnMgYWxsIHRoZSBwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gX2pvaW5BbmRDYW5vbmljYWxpemVQYXRoKHBhcnRzKSB7XG4gICAgdmFyIHBhdGggPSBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gICAgcGF0aCA9IHBhdGggPT0gbnVsbCA/ICcnIDogX3JlbW92ZURvdFNlZ21lbnRzKHBhdGgpO1xuICAgIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXSA9IHBhdGg7XG4gICAgcmV0dXJuIF9idWlsZEZyb21FbmNvZGVkUGFydHMocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0sIHBhcnRzW19Db21wb25lbnRJbmRleC5Vc2VySW5mb10sIHBhcnRzW19Db21wb25lbnRJbmRleC5Eb21haW5dLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUG9ydF0sIHBhdGgsIHBhcnRzW19Db21wb25lbnRJbmRleC5RdWVyeURhdGFdLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguRnJhZ21lbnRdKTtcbn1cbi8qKlxuICogUmVzb2x2ZXMgYSBVUkwuXG4gKiBAcGFyYW0gYmFzZSBUaGUgVVJMIGFjdGluZyBhcyB0aGUgYmFzZSBVUkwuXG4gKiBAcGFyYW0gdG8gVGhlIFVSTCB0byByZXNvbHZlLlxuICovXG5mdW5jdGlvbiBfcmVzb2x2ZVVybChiYXNlLCB1cmwpIHtcbiAgICB2YXIgcGFydHMgPSBfc3BsaXQoZW5jb2RlVVJJKHVybCkpO1xuICAgIHZhciBiYXNlUGFydHMgPSBfc3BsaXQoYmFzZSk7XG4gICAgaWYgKHBhcnRzW19Db21wb25lbnRJbmRleC5TY2hlbWVdICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBwYXJ0c1tfQ29tcG9uZW50SW5kZXguU2NoZW1lXSA9IGJhc2VQYXJ0c1tfQ29tcG9uZW50SW5kZXguU2NoZW1lXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IF9Db21wb25lbnRJbmRleC5TY2hlbWU7IGkgPD0gX0NvbXBvbmVudEluZGV4LlBvcnQ7IGkrKykge1xuICAgICAgICBpZiAocGFydHNbaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcGFydHNbaV0gPSBiYXNlUGFydHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXVswXSA9PSAnLycpIHtcbiAgICAgICAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG4gICAgfVxuICAgIHZhciBwYXRoID0gYmFzZVBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXTtcbiAgICBpZiAocGF0aCA9PSBudWxsKVxuICAgICAgICBwYXRoID0gJy8nO1xuICAgIHZhciBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSArIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXTtcbiAgICBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF0gPSBwYXRoO1xuICAgIHJldHVybiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHMpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRXh0cmFjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEV4dHJhY3Rvcihob3N0LCBzdGF0aWNTeW1ib2xSZXNvbHZlciwgbWVzc2FnZUJ1bmRsZSwgbWV0YWRhdGFSZXNvbHZlcikge1xuICAgICAgICB0aGlzLmhvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLnN0YXRpY1N5bWJvbFJlc29sdmVyID0gc3RhdGljU3ltYm9sUmVzb2x2ZXI7XG4gICAgICAgIHRoaXMubWVzc2FnZUJ1bmRsZSA9IG1lc3NhZ2VCdW5kbGU7XG4gICAgICAgIHRoaXMubWV0YWRhdGFSZXNvbHZlciA9IG1ldGFkYXRhUmVzb2x2ZXI7XG4gICAgfVxuICAgIEV4dHJhY3Rvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChyb290RmlsZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hID0gYW5hbHl6ZUFuZFZhbGlkYXRlTmdNb2R1bGVzKHJvb3RGaWxlcywgdGhpcy5ob3N0LCB0aGlzLnN0YXRpY1N5bWJvbFJlc29sdmVyLCB0aGlzLm1ldGFkYXRhUmVzb2x2ZXIpLCBmaWxlcyA9IF9hLmZpbGVzLCBuZ01vZHVsZXMgPSBfYS5uZ01vZHVsZXM7XG4gICAgICAgIHJldHVybiBQcm9taXNlXG4gICAgICAgICAgICAuYWxsKG5nTW9kdWxlcy5tYXAoZnVuY3Rpb24gKG5nTW9kdWxlKSB7IHJldHVybiBfdGhpcy5tZXRhZGF0YVJlc29sdmVyLmxvYWROZ01vZHVsZURpcmVjdGl2ZUFuZFBpcGVNZXRhZGF0YShuZ01vZHVsZS50eXBlLnJlZmVyZW5jZSwgZmFsc2UpOyB9KSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgICAgICAgIGZpbGVzLmZvckVhY2goZnVuY3Rpb24gKGZpbGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tcE1ldGFzID0gW107XG4gICAgICAgICAgICAgICAgZmlsZS5kaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpck1ldGEgPSBfdGhpcy5tZXRhZGF0YVJlc29sdmVyLmdldERpcmVjdGl2ZU1ldGFkYXRhKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyTWV0YSAmJiBkaXJNZXRhLmlzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YXMucHVzaChkaXJNZXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbXBNZXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbCA9IGNvbXBNZXRhLnRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZSBVUkwgcG9pbnRzIHRvIGVpdGhlciBhbiBIVE1MIG9yIFRTIGZpbGUgZGVwZW5kaW5nIG9uXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIGZpbGUgaXMgdXNlZCB3aXRoIGB0ZW1wbGF0ZVVybDpgIG9yIGB0ZW1wbGF0ZTpgLFxuICAgICAgICAgICAgICAgICAgICAvLyByZXNwZWN0aXZlbHkuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZVVybCA9IGNvbXBNZXRhLnRlbXBsYXRlLnRlbXBsYXRlVXJsO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJwb2xhdGlvbkNvbmZpZyA9IEludGVycG9sYXRpb25Db25maWcuZnJvbUFycmF5KGNvbXBNZXRhLnRlbXBsYXRlLmludGVycG9sYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaC5hcHBseShlcnJvcnMsIF9fc3ByZWFkKF90aGlzLm1lc3NhZ2VCdW5kbGUudXBkYXRlRnJvbVRlbXBsYXRlKGh0bWwsIHRlbXBsYXRlVXJsLCBpbnRlcnBvbGF0aW9uQ29uZmlnKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnRvU3RyaW5nKCk7IH0pLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5tZXNzYWdlQnVuZGxlO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEV4dHJhY3Rvci5jcmVhdGUgPSBmdW5jdGlvbiAoaG9zdCwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBodG1sUGFyc2VyID0gbmV3IEh0bWxQYXJzZXIoKTtcbiAgICAgICAgdmFyIHVybFJlc29sdmVyID0gY3JlYXRlQW90VXJsUmVzb2x2ZXIoaG9zdCk7XG4gICAgICAgIHZhciBzeW1ib2xDYWNoZSA9IG5ldyBTdGF0aWNTeW1ib2xDYWNoZSgpO1xuICAgICAgICB2YXIgc3VtbWFyeVJlc29sdmVyID0gbmV3IEFvdFN1bW1hcnlSZXNvbHZlcihob3N0LCBzeW1ib2xDYWNoZSk7XG4gICAgICAgIHZhciBzdGF0aWNTeW1ib2xSZXNvbHZlciA9IG5ldyBTdGF0aWNTeW1ib2xSZXNvbHZlcihob3N0LCBzeW1ib2xDYWNoZSwgc3VtbWFyeVJlc29sdmVyKTtcbiAgICAgICAgdmFyIHN0YXRpY1JlZmxlY3RvciA9IG5ldyBTdGF0aWNSZWZsZWN0b3Ioc3VtbWFyeVJlc29sdmVyLCBzdGF0aWNTeW1ib2xSZXNvbHZlcik7XG4gICAgICAgIHZhciBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWcoeyBkZWZhdWx0RW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsIHVzZUppdDogZmFsc2UgfSk7XG4gICAgICAgIHZhciBub3JtYWxpemVyID0gbmV3IERpcmVjdGl2ZU5vcm1hbGl6ZXIoeyBnZXQ6IGZ1bmN0aW9uICh1cmwpIHsgcmV0dXJuIGhvc3QubG9hZFJlc291cmNlKHVybCk7IH0gfSwgdXJsUmVzb2x2ZXIsIGh0bWxQYXJzZXIsIGNvbmZpZyk7XG4gICAgICAgIHZhciBlbGVtZW50U2NoZW1hUmVnaXN0cnkgPSBuZXcgRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciByZXNvbHZlciA9IG5ldyBDb21waWxlTWV0YWRhdGFSZXNvbHZlcihjb25maWcsIGh0bWxQYXJzZXIsIG5ldyBOZ01vZHVsZVJlc29sdmVyKHN0YXRpY1JlZmxlY3RvciksIG5ldyBEaXJlY3RpdmVSZXNvbHZlcihzdGF0aWNSZWZsZWN0b3IpLCBuZXcgUGlwZVJlc29sdmVyKHN0YXRpY1JlZmxlY3RvciksIHN1bW1hcnlSZXNvbHZlciwgZWxlbWVudFNjaGVtYVJlZ2lzdHJ5LCBub3JtYWxpemVyLCBjb25zb2xlLCBzeW1ib2xDYWNoZSwgc3RhdGljUmVmbGVjdG9yKTtcbiAgICAgICAgLy8gVE9ETyh2aWNiKTogaW1wbGljaXQgdGFncyAmIGF0dHJpYnV0ZXNcbiAgICAgICAgdmFyIG1lc3NhZ2VCdW5kbGUgPSBuZXcgTWVzc2FnZUJ1bmRsZShodG1sUGFyc2VyLCBbXSwge30sIGxvY2FsZSk7XG4gICAgICAgIHZhciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKGhvc3QsIHN0YXRpY1N5bWJvbFJlc29sdmVyLCBtZXNzYWdlQnVuZGxlLCByZXNvbHZlcik7XG4gICAgICAgIHJldHVybiB7IGV4dHJhY3RvcjogZXh0cmFjdG9yLCBzdGF0aWNSZWZsZWN0b3I6IHN0YXRpY1JlZmxlY3RvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIEV4dHJhY3Rvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBQcm9jZXNzZXMgYFRhcmdldGBzIHdpdGggYSBnaXZlbiBzZXQgb2YgZGlyZWN0aXZlcyBhbmQgcGVyZm9ybXMgYSBiaW5kaW5nIG9wZXJhdGlvbiwgd2hpY2hcbiAqIHJldHVybnMgYW4gb2JqZWN0IHNpbWlsYXIgdG8gVHlwZVNjcmlwdCdzIGB0cy5UeXBlQ2hlY2tlcmAgdGhhdCBjb250YWlucyBrbm93bGVkZ2UgYWJvdXQgdGhlXG4gKiB0YXJnZXQuXG4gKi9cbnZhciBSM1RhcmdldEJpbmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSM1RhcmdldEJpbmRlcihkaXJlY3RpdmVNYXRjaGVyKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlTWF0Y2hlciA9IGRpcmVjdGl2ZU1hdGNoZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYSBiaW5kaW5nIG9wZXJhdGlvbiBvbiB0aGUgZ2l2ZW4gYFRhcmdldGAgYW5kIHJldHVybiBhIGBCb3VuZFRhcmdldGAgd2hpY2ggY29udGFpbnNcbiAgICAgKiBtZXRhZGF0YSBhYm91dCB0aGUgdHlwZXMgcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUuXG4gICAgICovXG4gICAgUjNUYXJnZXRCaW5kZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmICghdGFyZ2V0LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICAvLyBUT0RPKGFseGh1Yik6IGhhbmRsZSB0YXJnZXRzIHdoaWNoIGNvbnRhaW4gdGhpbmdzIGxpa2UgSG9zdEJpbmRpbmdzLCBldGMuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpbmRpbmcgd2l0aG91dCBhIHRlbXBsYXRlIG5vdCB5ZXQgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlyc3QsIHBhcnNlIHRoZSB0ZW1wbGF0ZSBpbnRvIGEgYFNjb3BlYCBzdHJ1Y3R1cmUuIFRoaXMgb3BlcmF0aW9uIGNhcHR1cmVzIHRoZSBzeW50YWN0aWNcbiAgICAgICAgLy8gc2NvcGVzIGluIHRoZSB0ZW1wbGF0ZSBhbmQgbWFrZXMgdGhlbSBhdmFpbGFibGUgZm9yIGxhdGVyIHVzZS5cbiAgICAgICAgdmFyIHNjb3BlID0gU2NvcGUuYXBwbHkodGFyZ2V0LnRlbXBsYXRlKTtcbiAgICAgICAgLy8gTmV4dCwgcGVyZm9ybSBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gdGhlIHRlbXBsYXRlIHVzaW5nIHRoZSBgRGlyZWN0aXZlQmluZGVyYC4gVGhpcyByZXR1cm5zOlxuICAgICAgICAvLyAgIC0gZGlyZWN0aXZlczogTWFwIG9mIG5vZGVzIChlbGVtZW50cyAmIG5nLXRlbXBsYXRlcykgdG8gdGhlIGRpcmVjdGl2ZXMgb24gdGhlbS5cbiAgICAgICAgLy8gICAtIGJpbmRpbmdzOiBNYXAgb2YgaW5wdXRzLCBvdXRwdXRzLCBhbmQgYXR0cmlidXRlcyB0byB0aGUgZGlyZWN0aXZlL2VsZW1lbnQgdGhhdCBjbGFpbXNcbiAgICAgICAgLy8gICAgIHRoZW0uIFRPRE8oYWx4aHViKTogaGFuZGxlIG11bHRpcGxlIGRpcmVjdGl2ZXMgY2xhaW1pbmcgYW4gaW5wdXQvb3V0cHV0L2V0Yy5cbiAgICAgICAgLy8gICAtIHJlZmVyZW5jZXM6IE1hcCBvZiAjcmVmZXJlbmNlcyB0byB0aGVpciB0YXJnZXRzLlxuICAgICAgICB2YXIgX2EgPSBEaXJlY3RpdmVCaW5kZXIuYXBwbHkodGFyZ2V0LnRlbXBsYXRlLCB0aGlzLmRpcmVjdGl2ZU1hdGNoZXIpLCBkaXJlY3RpdmVzID0gX2EuZGlyZWN0aXZlcywgYmluZGluZ3MgPSBfYS5iaW5kaW5ncywgcmVmZXJlbmNlcyA9IF9hLnJlZmVyZW5jZXM7XG4gICAgICAgIC8vIEZpbmFsbHksIHJ1biB0aGUgVGVtcGxhdGVCaW5kZXIgdG8gYmluZCByZWZlcmVuY2VzLCB2YXJpYWJsZXMsIGFuZCBvdGhlciBlbnRpdGllcyB3aXRoaW4gdGhlXG4gICAgICAgIC8vIHRlbXBsYXRlLiBUaGlzIGV4dHJhY3RzIGFsbCB0aGUgbWV0YWRhdGEgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiBkaXJlY3RpdmUgbWF0Y2hpbmcuXG4gICAgICAgIHZhciBfYiA9IFRlbXBsYXRlQmluZGVyLmFwcGx5KHRhcmdldC50ZW1wbGF0ZSwgc2NvcGUpLCBleHByZXNzaW9ucyA9IF9iLmV4cHJlc3Npb25zLCBzeW1ib2xzID0gX2Iuc3ltYm9scywgbmVzdGluZ0xldmVsID0gX2IubmVzdGluZ0xldmVsLCB1c2VkUGlwZXMgPSBfYi51c2VkUGlwZXM7XG4gICAgICAgIHJldHVybiBuZXcgUjNCb3VuZFRhcmdldCh0YXJnZXQsIGRpcmVjdGl2ZXMsIGJpbmRpbmdzLCByZWZlcmVuY2VzLCBleHByZXNzaW9ucywgc3ltYm9scywgbmVzdGluZ0xldmVsLCB1c2VkUGlwZXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFIzVGFyZ2V0QmluZGVyO1xufSgpKTtcbi8qKlxuICogUmVwcmVzZW50cyBhIGJpbmRpbmcgc2NvcGUgd2l0aGluIGEgdGVtcGxhdGUuXG4gKlxuICogQW55IHZhcmlhYmxlcywgcmVmZXJlbmNlcywgb3Igb3RoZXIgbmFtZWQgZW50aXRpZXMgZGVjbGFyZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSB3aWxsXG4gKiBiZSBjYXB0dXJlZCBhbmQgYXZhaWxhYmxlIGJ5IG5hbWUgaW4gYG5hbWVkRW50aXRpZXNgLiBBZGRpdGlvbmFsbHksIGNoaWxkIHRlbXBsYXRlcyB3aWxsXG4gKiBiZSBhbmFseXplZCBhbmQgaGF2ZSB0aGVpciBjaGlsZCBgU2NvcGVgcyBhdmFpbGFibGUgaW4gYGNoaWxkU2NvcGVzYC5cbiAqL1xudmFyIFNjb3BlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlKHBhcmVudFNjb3BlKSB7XG4gICAgICAgIHRoaXMucGFyZW50U2NvcGUgPSBwYXJlbnRTY29wZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5hbWVkIG1lbWJlcnMgb2YgdGhlIGBTY29wZWAsIHN1Y2ggYXMgYFJlZmVyZW5jZWBzIG9yIGBWYXJpYWJsZWBzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5uYW1lZEVudGl0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hpbGQgYFNjb3BlYHMgZm9yIGltbWVkaWF0ZWx5IG5lc3RlZCBgVGVtcGxhdGVgcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2hpbGRTY29wZXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYSB0ZW1wbGF0ZSAoZWl0aGVyIGFzIGEgYFRlbXBsYXRlYCBzdWItdGVtcGxhdGUgd2l0aCB2YXJpYWJsZXMsIG9yIGEgcGxhaW4gYXJyYXkgb2ZcbiAgICAgKiB0ZW1wbGF0ZSBgTm9kZWBzKSBhbmQgY29uc3RydWN0IGl0cyBgU2NvcGVgLlxuICAgICAqL1xuICAgIFNjb3BlLmFwcGx5ID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG4gICAgICAgIHZhciBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBzY29wZS5pbmdlc3QodGVtcGxhdGUpO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyB0aGUgdGVtcGxhdGUgYW5kIHBvcHVsYXRlIHRoZSBgU2NvcGVgLlxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5pbmdlc3QgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlcyBvbiBhbiA8bmctdGVtcGxhdGU+IGFyZSBkZWZpbmVkIGluIHRoZSBpbm5lciBzY29wZS5cbiAgICAgICAgICAgIHRlbXBsYXRlLnZhcmlhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBfdGhpcy52aXNpdFZhcmlhYmxlKG5vZGUpOyB9KTtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIG5vZGVzIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIHRlbXBsYXRlLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmlzaXQoX3RoaXMpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIG92ZXJhcmNoaW5nIGBUZW1wbGF0ZWAgaW5zdGFuY2UsIHNvIHByb2Nlc3MgdGhlIG5vZGVzIGRpcmVjdGx5LlxuICAgICAgICAgICAgdGVtcGxhdGUuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTY29wZS5wcm90b3R5cGUudmlzaXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gYEVsZW1lbnRgcyBpbiB0aGUgdGVtcGxhdGUgbWF5IGhhdmUgYFJlZmVyZW5jZWBzIHdoaWNoIGFyZSBjYXB0dXJlZCBpbiB0aGUgc2NvcGUuXG4gICAgICAgIGVsZW1lbnQucmVmZXJlbmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBfdGhpcy52aXNpdFJlZmVyZW5jZShub2RlKTsgfSk7XG4gICAgICAgIC8vIFJlY3Vyc2UgaW50byB0aGUgYEVsZW1lbnRgJ3MgY2hpbGRyZW4uXG4gICAgICAgIGVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52aXNpdChfdGhpcyk7IH0pO1xuICAgIH07XG4gICAgU2NvcGUucHJvdG90eXBlLnZpc2l0VGVtcGxhdGUgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gUmVmZXJlbmNlcyBvbiBhIDxuZy10ZW1wbGF0ZT4gYXJlIGRlZmluZWQgaW4gdGhlIG91dGVyIHNjb3BlLCBzbyBjYXB0dXJlIHRoZW0gYmVmb3JlXG4gICAgICAgIC8vIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlJ3MgY2hpbGQgc2NvcGUuXG4gICAgICAgIHRlbXBsYXRlLnJlZmVyZW5jZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gX3RoaXMudmlzaXRSZWZlcmVuY2Uobm9kZSk7IH0pO1xuICAgICAgICAvLyBOZXh0LCBjcmVhdGUgYW4gaW5uZXIgc2NvcGUgYW5kIHByb2Nlc3MgdGhlIHRlbXBsYXRlIHdpdGhpbiBpdC5cbiAgICAgICAgdmFyIHNjb3BlID0gbmV3IFNjb3BlKHRoaXMpO1xuICAgICAgICBzY29wZS5pbmdlc3QodGVtcGxhdGUpO1xuICAgICAgICB0aGlzLmNoaWxkU2NvcGVzLnNldCh0ZW1wbGF0ZSwgc2NvcGUpO1xuICAgIH07XG4gICAgU2NvcGUucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgICAgICAgLy8gRGVjbGFyZSB0aGUgdmFyaWFibGUgaWYgaXQncyBub3QgYWxyZWFkeS5cbiAgICAgICAgdGhpcy5tYXliZURlY2xhcmUodmFyaWFibGUpO1xuICAgIH07XG4gICAgU2NvcGUucHJvdG90eXBlLnZpc2l0UmVmZXJlbmNlID0gZnVuY3Rpb24gKHJlZmVyZW5jZSkge1xuICAgICAgICAvLyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBpZiBpdCdzIG5vdCBhbHJlYWR5LlxuICAgICAgICB0aGlzLm1heWJlRGVjbGFyZShyZWZlcmVuY2UpO1xuICAgIH07XG4gICAgLy8gVW51c2VkIHZpc2l0b3JzLlxuICAgIFNjb3BlLnByb3RvdHlwZS52aXNpdENvbnRlbnQgPSBmdW5jdGlvbiAoY29udGVudCkgeyB9O1xuICAgIFNjb3BlLnByb3RvdHlwZS52aXNpdEJvdW5kQXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHIpIHsgfTtcbiAgICBTY29wZS5wcm90b3R5cGUudmlzaXRCb3VuZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7IH07XG4gICAgU2NvcGUucHJvdG90eXBlLnZpc2l0Qm91bmRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsgfTtcbiAgICBTY29wZS5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsgfTtcbiAgICBTY29wZS5wcm90b3R5cGUudmlzaXRUZXh0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHIpIHsgfTtcbiAgICBTY29wZS5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1KSB7IH07XG4gICAgU2NvcGUucHJvdG90eXBlLm1heWJlRGVjbGFyZSA9IGZ1bmN0aW9uICh0aGluZykge1xuICAgICAgICAvLyBEZWNsYXJlIHNvbWV0aGluZyB3aXRoIGEgbmFtZSwgYXMgbG9uZyBhcyB0aGF0IG5hbWUgaXNuJ3QgdGFrZW4uXG4gICAgICAgIGlmICghdGhpcy5uYW1lZEVudGl0aWVzLmhhcyh0aGluZy5uYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lZEVudGl0aWVzLnNldCh0aGluZy5uYW1lLCB0aGluZyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExvb2sgdXAgYSB2YXJpYWJsZSB3aXRoaW4gdGhpcyBgU2NvcGVgLlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gcmVjdXJzZSBpbnRvIGEgcGFyZW50IGBTY29wZWAgaWYgaXQncyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgU2NvcGUucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVkRW50aXRpZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICAvLyBGb3VuZCBpbiB0aGUgbG9jYWwgc2NvcGUuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lZEVudGl0aWVzLmdldChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudFNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIE5vdCBpbiB0aGUgbG9jYWwgc2NvcGUsIGJ1dCB0aGVyZSdzIGEgcGFyZW50IHNjb3BlIHNvIGNoZWNrIHRoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50U2NvcGUubG9va3VwKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQXQgdGhlIHRvcCBsZXZlbCBhbmQgaXQgd2Fzbid0IGZvdW5kLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY2hpbGQgc2NvcGUgZm9yIGEgYFRlbXBsYXRlYC5cbiAgICAgKlxuICAgICAqIFRoaXMgc2hvdWxkIGFsd2F5cyBiZSBkZWZpbmVkLlxuICAgICAqL1xuICAgIFNjb3BlLnByb3RvdHlwZS5nZXRDaGlsZFNjb3BlID0gZnVuY3Rpb24gKHRlbXBsYXRlKSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmNoaWxkU2NvcGVzLmdldCh0ZW1wbGF0ZSk7XG4gICAgICAgIGlmIChyZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXNzZXJ0aW9uIGVycm9yOiBjaGlsZCBzY29wZSBmb3IgXCIgKyB0ZW1wbGF0ZSArIFwiIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmV0dXJuIFNjb3BlO1xufSgpKTtcbi8qKlxuICogUHJvY2Vzc2VzIGEgdGVtcGxhdGUgYW5kIG1hdGNoZXMgZGlyZWN0aXZlcyBvbiBub2RlcyAoZWxlbWVudHMgYW5kIHRlbXBsYXRlcykuXG4gKlxuICogVXN1YWxseSB1c2VkIHZpYSB0aGUgc3RhdGljIGBhcHBseSgpYCBtZXRob2QuXG4gKi9cbnZhciBEaXJlY3RpdmVCaW5kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGlyZWN0aXZlQmluZGVyKG1hdGNoZXIsIGRpcmVjdGl2ZXMsIGJpbmRpbmdzLCByZWZlcmVuY2VzKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlciA9IG1hdGNoZXI7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSBiaW5kaW5ncztcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0gcmVmZXJlbmNlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBhIHRlbXBsYXRlIChsaXN0IG9mIGBOb2RlYHMpIGFuZCBwZXJmb3JtIGRpcmVjdGl2ZSBtYXRjaGluZyBhZ2FpbnN0IGVhY2ggbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgbGlzdCBvZiB0ZW1wbGF0ZSBgTm9kZWBzIHRvIG1hdGNoIChyZWN1cnNpdmVseSkuXG4gICAgICogQHBhcmFtIHNlbGVjdG9yTWF0Y2hlciBhIGBTZWxlY3Rvck1hdGNoZXJgIGNvbnRhaW5pbmcgdGhlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgaW4gc2NvcGUgZm9yXG4gICAgICogdGhpcyB0ZW1wbGF0ZS5cbiAgICAgKiBAcmV0dXJucyB0aHJlZSBtYXBzIHdoaWNoIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgZGlyZWN0aXZlcyBpbiB0aGUgdGVtcGxhdGU6IHRoZVxuICAgICAqIGBkaXJlY3RpdmVzYCBtYXAgd2hpY2ggbGlzdHMgZGlyZWN0aXZlcyBtYXRjaGVkIG9uIGVhY2ggbm9kZSwgdGhlIGBiaW5kaW5nc2AgbWFwIHdoaWNoXG4gICAgICogaW5kaWNhdGVzIHdoaWNoIGRpcmVjdGl2ZXMgY2xhaW1lZCB3aGljaCBiaW5kaW5ncyAoaW5wdXRzLCBvdXRwdXRzLCBldGMpLCBhbmQgdGhlIGByZWZlcmVuY2VzYFxuICAgICAqIG1hcCB3aGljaCByZXNvbHZlcyAjcmVmZXJlbmNlcyAoYFJlZmVyZW5jZWBzKSB3aXRoaW4gdGhlIHRlbXBsYXRlIHRvIHRoZSBuYW1lZCBkaXJlY3RpdmUgb3JcbiAgICAgKiB0ZW1wbGF0ZSBub2RlLlxuICAgICAqL1xuICAgIERpcmVjdGl2ZUJpbmRlci5hcHBseSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgc2VsZWN0b3JNYXRjaGVyKSB7XG4gICAgICAgIHZhciBkaXJlY3RpdmVzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgYmluZGluZ3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHZhciByZWZlcmVuY2VzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbWF0Y2hlciA9IG5ldyBEaXJlY3RpdmVCaW5kZXIoc2VsZWN0b3JNYXRjaGVyLCBkaXJlY3RpdmVzLCBiaW5kaW5ncywgcmVmZXJlbmNlcyk7XG4gICAgICAgIG1hdGNoZXIuaW5nZXN0KHRlbXBsYXRlKTtcbiAgICAgICAgcmV0dXJuIHsgZGlyZWN0aXZlczogZGlyZWN0aXZlcywgYmluZGluZ3M6IGJpbmRpbmdzLCByZWZlcmVuY2VzOiByZWZlcmVuY2VzIH07XG4gICAgfTtcbiAgICBEaXJlY3RpdmVCaW5kZXIucHJvdG90eXBlLmluZ2VzdCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0ZW1wbGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfSk7XG4gICAgfTtcbiAgICBEaXJlY3RpdmVCaW5kZXIucHJvdG90eXBlLnZpc2l0RWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7IHRoaXMudmlzaXRFbGVtZW50T3JUZW1wbGF0ZShlbGVtZW50Lm5hbWUsIGVsZW1lbnQpOyB9O1xuICAgIERpcmVjdGl2ZUJpbmRlci5wcm90b3R5cGUudmlzaXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSkgeyB0aGlzLnZpc2l0RWxlbWVudE9yVGVtcGxhdGUoJ25nLXRlbXBsYXRlJywgdGVtcGxhdGUpOyB9O1xuICAgIERpcmVjdGl2ZUJpbmRlci5wcm90b3R5cGUudmlzaXRFbGVtZW50T3JUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0YWcsIG5vZGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLy8gRmlyc3QsIGRldGVybWluZSB0aGUgSFRNTCBzaGFwZSBvZiB0aGUgbm9kZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlyZWN0aXZlIG1hdGNoaW5nLlxuICAgICAgICAvLyBEbyB0aGlzIGJ5IGJ1aWxkaW5nIHVwIGEgYENzc1NlbGVjdG9yYCBmb3IgdGhlIG5vZGUuXG4gICAgICAgIHZhciBjc3NTZWxlY3RvciA9IG5ldyBDc3NTZWxlY3RvcigpO1xuICAgICAgICBjc3NTZWxlY3Rvci5zZXRFbGVtZW50KHRhZyk7XG4gICAgICAgIC8vIEFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBDU1Mgc2VsZWN0b3IuXG4gICAgICAgIHZhciBhdHRycyA9IGdldEF0dHJzRm9yRGlyZWN0aXZlTWF0Y2hpbmcobm9kZSk7XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBhdHRyc1tuYW1lXTtcbiAgICAgICAgICAgIGNzc1NlbGVjdG9yLmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBUcmVhdCB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgc3BlY2lhbGx5LlxuICAgICAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gdmFsdWUudHJpbSgpLnNwbGl0KC9cXHMrL2cpO1xuICAgICAgICAgICAgICAgIGNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7IHJldHVybiBjc3NTZWxlY3Rvci5hZGRDbGFzc05hbWUoY2xhc3NOYW1lKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBOZXh0LCB1c2UgdGhlIGBTZWxlY3Rvck1hdGNoZXJgIHRvIGdldCB0aGUgbGlzdCBvZiBkaXJlY3RpdmVzIG9uIHRoZSBub2RlLlxuICAgICAgICB2YXIgZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICB0aGlzLm1hdGNoZXIubWF0Y2goY3NzU2VsZWN0b3IsIGZ1bmN0aW9uIChfLCBkaXJlY3RpdmUpIHsgcmV0dXJuIGRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpOyB9KTtcbiAgICAgICAgaWYgKGRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnNldChub2RlLCBkaXJlY3RpdmVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZlIGFueSByZWZlcmVuY2VzIHRoYXQgYXJlIGNyZWF0ZWQgb24gdGhpcyBub2RlLlxuICAgICAgICBub2RlLnJlZmVyZW5jZXMuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgICAgICB2YXIgZGlyVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgICAgIC8vIElmIHRoZSByZWZlcmVuY2UgZXhwcmVzc2lvbiBpcyBlbXB0eSwgdGhlbiBpdCBtYXRjaGVzIHRoZSBcInByaW1hcnlcIiBkaXJlY3RpdmUgb24gdGhlIG5vZGVcbiAgICAgICAgICAgIC8vIChpZiB0aGVyZSBpcyBvbmUpLiBPdGhlcndpc2UgaXQgbWF0Y2hlcyB0aGUgaG9zdCBub2RlIGl0c2VsZiAoZWl0aGVyIGFuIGVsZW1lbnQgb3JcbiAgICAgICAgICAgIC8vIDxuZy10ZW1wbGF0ZT4gbm9kZSkuXG4gICAgICAgICAgICBpZiAocmVmLnZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGEgY29tcG9uZW50IGlmIHRoZXJlIGlzIG9uZS5cbiAgICAgICAgICAgICAgICBkaXJUYXJnZXQgPSBkaXJlY3RpdmVzLmZpbmQoZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gZGlyLmlzQ29tcG9uZW50OyB9KSB8fCBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRpcmVjdGl2ZSBleHBvcnRlZCB2aWEgZXhwb3J0QXMuIE9uZSBzaG91bGQgZXhpc3QuXG4gICAgICAgICAgICAgICAgZGlyVGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlcy5maW5kKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGRpci5leHBvcnRBcyAhPT0gbnVsbCAmJiBkaXIuZXhwb3J0QXMuc29tZShmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSByZWYudmFsdWU7IH0pOyB9KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhIG1hdGNoaW5nIGRpcmVjdGl2ZSB3YXMgZm91bmQsIGFuZCBlcnJvciBpZiBpdCB3YXNuJ3QuXG4gICAgICAgICAgICAgICAgaWYgKGRpclRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGFseGh1Yik6IFJldHVybiBhbiBlcnJvciB2YWx1ZSBoZXJlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRlbXBsYXRlIHZhbGlkYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbiBlcnJvcjogZmFpbGVkIHRvIGZpbmQgZGlyZWN0aXZlIHdpdGggZXhwb3J0QXM6IFwiICsgcmVmLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlyVGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyByZWZlcmVuY2UgcG9pbnRzIHRvIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgIF90aGlzLnJlZmVyZW5jZXMuc2V0KHJlZiwgeyBkaXJlY3RpdmU6IGRpclRhcmdldCwgbm9kZTogbm9kZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVmZXJlbmNlIHBvaW50cyB0byB0aGUgbm9kZSBpdHNlbGYuXG4gICAgICAgICAgICAgICAgX3RoaXMucmVmZXJlbmNlcy5zZXQocmVmLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEFzc29jaWF0ZSBhdHRyaWJ1dGVzL2JpbmRpbmdzIG9uIHRoZSBub2RlIHdpdGggZGlyZWN0aXZlcyBvciB3aXRoIHRoZSBub2RlIGl0c2VsZi5cbiAgICAgICAgdmFyIHByb2Nlc3NBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgZGlyID0gZGlyZWN0aXZlcy5maW5kKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGRpci5pbnB1dHMuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlLm5hbWUpOyB9KTtcbiAgICAgICAgICAgIGlmIChkaXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmJpbmRpbmdzLnNldChhdHRyaWJ1dGUsIGRpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5iaW5kaW5ncy5zZXQoYXR0cmlidXRlLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbm9kZS5hdHRyaWJ1dGVzLmZvckVhY2gocHJvY2Vzc0F0dHJpYnV0ZSk7XG4gICAgICAgIG5vZGUuaW5wdXRzLmZvckVhY2gocHJvY2Vzc0F0dHJpYnV0ZSk7XG4gICAgICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKHByb2Nlc3NBdHRyaWJ1dGUpO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7XG4gICAgICAgICAgICBub2RlLnRlbXBsYXRlQXR0cnMuZm9yRWFjaChwcm9jZXNzQXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNlIGludG8gdGhlIG5vZGUncyBjaGlsZHJlbi5cbiAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgeyByZXR1cm4gY2hpbGQudmlzaXQoX3RoaXMpOyB9KTtcbiAgICB9O1xuICAgIC8vIFVudXNlZCB2aXNpdG9ycy5cbiAgICBEaXJlY3RpdmVCaW5kZXIucHJvdG90eXBlLnZpc2l0Q29udGVudCA9IGZ1bmN0aW9uIChjb250ZW50KSB7IH07XG4gICAgRGlyZWN0aXZlQmluZGVyLnByb3RvdHlwZS52aXNpdFZhcmlhYmxlID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7IH07XG4gICAgRGlyZWN0aXZlQmluZGVyLnByb3RvdHlwZS52aXNpdFJlZmVyZW5jZSA9IGZ1bmN0aW9uIChyZWZlcmVuY2UpIHsgfTtcbiAgICBEaXJlY3RpdmVCaW5kZXIucHJvdG90eXBlLnZpc2l0VGV4dEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHsgfTtcbiAgICBEaXJlY3RpdmVCaW5kZXIucHJvdG90eXBlLnZpc2l0Qm91bmRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoYXR0cmlidXRlKSB7IH07XG4gICAgRGlyZWN0aXZlQmluZGVyLnByb3RvdHlwZS52aXNpdEJvdW5kRXZlbnQgPSBmdW5jdGlvbiAoYXR0cmlidXRlKSB7IH07XG4gICAgRGlyZWN0aXZlQmluZGVyLnByb3RvdHlwZS52aXNpdEJvdW5kQXR0cmlidXRlT3JFdmVudCA9IGZ1bmN0aW9uIChub2RlKSB7IH07XG4gICAgRGlyZWN0aXZlQmluZGVyLnByb3RvdHlwZS52aXNpdFRleHQgPSBmdW5jdGlvbiAodGV4dCkgeyB9O1xuICAgIERpcmVjdGl2ZUJpbmRlci5wcm90b3R5cGUudmlzaXRCb3VuZFRleHQgPSBmdW5jdGlvbiAodGV4dCkgeyB9O1xuICAgIERpcmVjdGl2ZUJpbmRlci5wcm90b3R5cGUudmlzaXRJY3UgPSBmdW5jdGlvbiAoaWN1KSB7IH07XG4gICAgcmV0dXJuIERpcmVjdGl2ZUJpbmRlcjtcbn0oKSk7XG4vKipcbiAqIFByb2Nlc3NlcyBhIHRlbXBsYXRlIGFuZCBleHRyYWN0IG1ldGFkYXRhIGFib3V0IGV4cHJlc3Npb25zIGFuZCBzeW1ib2xzIHdpdGhpbi5cbiAqXG4gKiBUaGlzIGlzIGEgY29tcGFuaW9uIHRvIHRoZSBgRGlyZWN0aXZlQmluZGVyYCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgZGlyZWN0aXZlcyBtYXRjaGVkXG4gKiB3aXRoaW4gdGhlIHRlbXBsYXRlIGluIG9yZGVyIHRvIG9wZXJhdGUuXG4gKlxuICogRXhwcmVzc2lvbnMgYXJlIHZpc2l0ZWQgYnkgdGhlIHN1cGVyY2xhc3MgYFJlY3Vyc2l2ZUFzdFZpc2l0b3JgLCB3aXRoIGN1c3RvbSBsb2dpYyBwcm92aWRlZFxuICogYnkgb3ZlcnJpZGRlbiBtZXRob2RzIGZyb20gdGhhdCB2aXNpdG9yLlxuICovXG52YXIgVGVtcGxhdGVCaW5kZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRlbXBsYXRlQmluZGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRlbXBsYXRlQmluZGVyKGJpbmRpbmdzLCBzeW1ib2xzLCB1c2VkUGlwZXMsIG5lc3RpbmdMZXZlbCwgc2NvcGUsIHRlbXBsYXRlLCBsZXZlbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5iaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgICAgICBfdGhpcy5zeW1ib2xzID0gc3ltYm9scztcbiAgICAgICAgX3RoaXMudXNlZFBpcGVzID0gdXNlZFBpcGVzO1xuICAgICAgICBfdGhpcy5uZXN0aW5nTGV2ZWwgPSBuZXN0aW5nTGV2ZWw7XG4gICAgICAgIF90aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIF90aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIF90aGlzLmxldmVsID0gbGV2ZWw7XG4gICAgICAgIF90aGlzLnBpcGVzVXNlZCA9IFtdO1xuICAgICAgICAvLyBTYXZlIGEgYml0IG9mIHByb2Nlc3NpbmcgdGltZSBieSBjb25zdHJ1Y3RpbmcgdGhpcyBjbG9zdXJlIGluIGFkdmFuY2UuXG4gICAgICAgIF90aGlzLnZpc2l0Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZpc2l0KF90aGlzKTsgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIGEgdGVtcGxhdGUgYW5kIGV4dHJhY3QgbWV0YWRhdGEgYWJvdXQgZXhwcmVzc2lvbnMgYW5kIHN5bWJvbHMgd2l0aGluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRlbXBsYXRlIHRoZSBub2RlcyBvZiB0aGUgdGVtcGxhdGUgdG8gcHJvY2Vzc1xuICAgICAqIEBwYXJhbSBzY29wZSB0aGUgYFNjb3BlYCBvZiB0aGUgdGVtcGxhdGUgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEByZXR1cm5zIHRocmVlIG1hcHMgd2hpY2ggY29udGFpbiBtZXRhZGF0YSBhYm91dCB0aGUgdGVtcGxhdGU6IGBleHByZXNzaW9uc2Agd2hpY2ggaW50ZXJwcmV0c1xuICAgICAqIHNwZWNpYWwgYEFTVGAgbm9kZXMgaW4gZXhwcmVzc2lvbnMgYXMgcG9pbnRpbmcgdG8gcmVmZXJlbmNlcyBvciB2YXJpYWJsZXMgZGVjbGFyZWQgd2l0aGluIHRoZVxuICAgICAqIHRlbXBsYXRlLCBgc3ltYm9sc2Agd2hpY2ggbWFwcyB0aG9zZSB2YXJpYWJsZXMgYW5kIHJlZmVyZW5jZXMgdG8gdGhlIG5lc3RlZCBgVGVtcGxhdGVgIHdoaWNoXG4gICAgICogZGVjbGFyZXMgdGhlbSwgaWYgYW55LCBhbmQgYG5lc3RpbmdMZXZlbGAgd2hpY2ggYXNzb2NpYXRlcyBlYWNoIGBUZW1wbGF0ZWAgd2l0aCBhIGludGVnZXJcbiAgICAgKiBuZXN0aW5nIGxldmVsIChob3cgbWFueSBsZXZlbHMgZGVlcCB3aXRoaW4gdGhlIHRlbXBsYXRlIHN0cnVjdHVyZSB0aGUgYFRlbXBsYXRlYCBpcyksIHN0YXJ0aW5nXG4gICAgICogYXQgMS5cbiAgICAgKi9cbiAgICBUZW1wbGF0ZUJpbmRlci5hcHBseSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgc2NvcGUpIHtcbiAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgc3ltYm9scyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG5lc3RpbmdMZXZlbCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIHVzZWRQaXBlcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgLy8gVGhlIHRvcC1sZXZlbCB0ZW1wbGF0ZSBoYXMgbmVzdGluZyBsZXZlbCAwLlxuICAgICAgICB2YXIgYmluZGVyID0gbmV3IFRlbXBsYXRlQmluZGVyKGV4cHJlc3Npb25zLCBzeW1ib2xzLCB1c2VkUGlwZXMsIG5lc3RpbmdMZXZlbCwgc2NvcGUsIHRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUgPyB0ZW1wbGF0ZSA6IG51bGwsIDApO1xuICAgICAgICBiaW5kZXIuaW5nZXN0KHRlbXBsYXRlKTtcbiAgICAgICAgcmV0dXJuIHsgZXhwcmVzc2lvbnM6IGV4cHJlc3Npb25zLCBzeW1ib2xzOiBzeW1ib2xzLCBuZXN0aW5nTGV2ZWw6IG5lc3RpbmdMZXZlbCwgdXNlZFBpcGVzOiB1c2VkUGlwZXMgfTtcbiAgICB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS5pbmdlc3QgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIC8vIEZvciA8bmctdGVtcGxhdGU+cywgcHJvY2VzcyBpbnB1dHMsIG91dHB1dHMsIHRlbXBsYXRlIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAvLyB2YXJpYWJsZXMsIGFuZCBjaGlsZCBub2Rlcy5cbiAgICAgICAgICAgIC8vIFJlZmVyZW5jZXMgd2VyZSBwcm9jZXNzZWQgaW4gdGhlIHNjb3BlIG9mIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLlxuICAgICAgICAgICAgdGVtcGxhdGUuaW5wdXRzLmZvckVhY2godGhpcy52aXNpdE5vZGUpO1xuICAgICAgICAgICAgdGVtcGxhdGUub3V0cHV0cy5mb3JFYWNoKHRoaXMudmlzaXROb2RlKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLnRlbXBsYXRlQXR0cnMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS52YXJpYWJsZXMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5jaGlsZHJlbi5mb3JFYWNoKHRoaXMudmlzaXROb2RlKTtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgbmVzdGluZyBsZXZlbC5cbiAgICAgICAgICAgIHRoaXMubmVzdGluZ0xldmVsLnNldCh0ZW1wbGF0ZSwgdGhpcy5sZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBWaXNpdCBlYWNoIG5vZGUgZnJvbSB0aGUgdG9wLWxldmVsIHRlbXBsYXRlLlxuICAgICAgICAgICAgdGVtcGxhdGUuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAvLyBWaXNpdCB0aGUgaW5wdXRzLCBvdXRwdXRzLCBhbmQgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgIGVsZW1lbnQuaW5wdXRzLmZvckVhY2godGhpcy52aXNpdE5vZGUpO1xuICAgICAgICBlbGVtZW50Lm91dHB1dHMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgIGVsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSkge1xuICAgICAgICAvLyBGaXJzdCwgdmlzaXQgaW5wdXRzLCBvdXRwdXRzIGFuZCB0ZW1wbGF0ZSBhdHRyaWJ1dGVzIG9mIHRoZSB0ZW1wbGF0ZSBub2RlLlxuICAgICAgICB0ZW1wbGF0ZS5pbnB1dHMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgIHRlbXBsYXRlLm91dHB1dHMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgIHRlbXBsYXRlLnRlbXBsYXRlQXR0cnMuZm9yRWFjaCh0aGlzLnZpc2l0Tm9kZSk7XG4gICAgICAgIC8vIFJlZmVyZW5jZXMgYXJlIGFsc28gZXZhbHVhdGVkIGluIHRoZSBvdXRlciBjb250ZXh0LlxuICAgICAgICB0ZW1wbGF0ZS5yZWZlcmVuY2VzLmZvckVhY2godGhpcy52aXNpdE5vZGUpO1xuICAgICAgICAvLyBOZXh0LCByZWN1cnNlIGludG8gdGhlIHRlbXBsYXRlIHVzaW5nIGl0cyBzY29wZSwgYW5kIGJ1bXBpbmcgdGhlIG5lc3RpbmcgbGV2ZWwgdXAgYnkgb25lLlxuICAgICAgICB2YXIgY2hpbGRTY29wZSA9IHRoaXMuc2NvcGUuZ2V0Q2hpbGRTY29wZSh0ZW1wbGF0ZSk7XG4gICAgICAgIHZhciBiaW5kZXIgPSBuZXcgVGVtcGxhdGVCaW5kZXIodGhpcy5iaW5kaW5ncywgdGhpcy5zeW1ib2xzLCB0aGlzLnVzZWRQaXBlcywgdGhpcy5uZXN0aW5nTGV2ZWwsIGNoaWxkU2NvcGUsIHRlbXBsYXRlLCB0aGlzLmxldmVsICsgMSk7XG4gICAgICAgIGJpbmRlci5pbmdlc3QodGVtcGxhdGUpO1xuICAgIH07XG4gICAgVGVtcGxhdGVCaW5kZXIucHJvdG90eXBlLnZpc2l0VmFyaWFibGUgPSBmdW5jdGlvbiAodmFyaWFibGUpIHtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGBWYXJpYWJsZWAgYXMgYSBzeW1ib2wgaW4gdGhlIGN1cnJlbnQgYFRlbXBsYXRlYC5cbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3ltYm9scy5zZXQodmFyaWFibGUsIHRoaXMudGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRSZWZlcmVuY2UgPSBmdW5jdGlvbiAocmVmZXJlbmNlKSB7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBgUmVmZXJlbmNlYCBhcyBhIHN5bWJvbCBpbiB0aGUgY3VycmVudCBgVGVtcGxhdGVgLlxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xzLnNldChyZWZlcmVuY2UsIHRoaXMudGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBVbnVzZWQgdGVtcGxhdGUgdmlzaXRvcnNcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRUZXh0ID0gZnVuY3Rpb24gKHRleHQpIHsgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRDb250ZW50ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHsgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRUZXh0QXR0cmlidXRlID0gZnVuY3Rpb24gKGF0dHJpYnV0ZSkgeyB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdEljdSA9IGZ1bmN0aW9uIChpY3UpIHsgfTtcbiAgICAvLyBUaGUgcmVtYWluaW5nIHZpc2l0b3JzIGFyZSBjb25jZXJuZWQgd2l0aCBwcm9jZXNzaW5nIEFTVCBleHByZXNzaW9ucyB3aXRoaW4gdGVtcGxhdGUgYmluZGluZ3NcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRCb3VuZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHsgYXR0cmlidXRlLnZhbHVlLnZpc2l0KHRoaXMpOyB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdEJvdW5kRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHsgZXZlbnQuaGFuZGxlci52aXNpdCh0aGlzKTsgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRCb3VuZFRleHQgPSBmdW5jdGlvbiAodGV4dCkgeyB0ZXh0LnZhbHVlLnZpc2l0KHRoaXMpOyB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdFBpcGUgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMudXNlZFBpcGVzLmFkZChhc3QubmFtZSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0UGlwZS5jYWxsKHRoaXMsIGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICAvLyBUaGVzZSBmaXZlIHR5cGVzIG9mIEFTVCBleHByZXNzaW9ucyBjYW4gcmVmZXIgdG8gZXhwcmVzc2lvbiByb290cywgd2hpY2ggY291bGQgYmUgdmFyaWFibGVzXG4gICAgLy8gb3IgcmVmZXJlbmNlcyBpbiB0aGUgY3VycmVudCBzY29wZS5cbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVJlYWQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMubWF5YmVNYXAoY29udGV4dCwgYXN0LCBhc3QubmFtZSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0UHJvcGVydHlSZWFkLmNhbGwodGhpcywgYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdFNhZmVQcm9wZXJ0eVJlYWQgPSBmdW5jdGlvbiAoYXN0LCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMubWF5YmVNYXAoY29udGV4dCwgYXN0LCBhc3QubmFtZSk7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnZpc2l0U2FmZVByb3BlcnR5UmVhZC5jYWxsKHRoaXMsIGFzdCwgY29udGV4dCk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZUJpbmRlci5wcm90b3R5cGUudmlzaXRQcm9wZXJ0eVdyaXRlID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLm1heWJlTWFwKGNvbnRleHQsIGFzdCwgYXN0Lm5hbWUpO1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS52aXNpdFByb3BlcnR5V3JpdGUuY2FsbCh0aGlzLCBhc3QsIGNvbnRleHQpO1xuICAgIH07XG4gICAgVGVtcGxhdGVCaW5kZXIucHJvdG90eXBlLnZpc2l0TWV0aG9kQ2FsbCA9IGZ1bmN0aW9uIChhc3QsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5tYXliZU1hcChjb250ZXh0LCBhc3QsIGFzdC5uYW1lKTtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUudmlzaXRNZXRob2RDYWxsLmNhbGwodGhpcywgYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS52aXNpdFNhZmVNZXRob2RDYWxsID0gZnVuY3Rpb24gKGFzdCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLm1heWJlTWFwKGNvbnRleHQsIGFzdCwgYXN0Lm5hbWUpO1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS52aXNpdFNhZmVNZXRob2RDYWxsLmNhbGwodGhpcywgYXN0LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIFRlbXBsYXRlQmluZGVyLnByb3RvdHlwZS5tYXliZU1hcCA9IGZ1bmN0aW9uIChzY29wZSwgYXN0LCBuYW1lKSB7XG4gICAgICAgIC8vIElmIHRoZSByZWNlaXZlciBvZiB0aGUgZXhwcmVzc2lvbiBpc24ndCB0aGUgYEltcGxpY2l0UmVjZWl2ZXJgLCB0aGlzIGlzbid0IHRoZSByb290IG9mIGFuXG4gICAgICAgIC8vIGBBU1RgIGV4cHJlc3Npb24gdGhhdCBtYXBzIHRvIGEgYFZhcmlhYmxlYCBvciBgUmVmZXJlbmNlYC5cbiAgICAgICAgaWYgKCEoYXN0LnJlY2VpdmVyIGluc3RhbmNlb2YgSW1wbGljaXRSZWNlaXZlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBuYW1lIGV4aXN0cyBpbiB0aGUgY3VycmVudCBzY29wZS4gSWYgc28sIG1hcCBpdC4gT3RoZXJ3aXNlLCB0aGUgbmFtZSBpc1xuICAgICAgICAvLyBwcm9iYWJseSBhIHByb3BlcnR5IG9uIHRoZSB0b3AtbGV2ZWwgY29tcG9uZW50IGNvbnRleHQuXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzLnNjb3BlLmxvb2t1cChuYW1lKTtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5zZXQoYXN0LCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVGVtcGxhdGVCaW5kZXI7XG59KFJlY3Vyc2l2ZUFzdFZpc2l0b3IkMSkpO1xuLyoqXG4gKiBNZXRhZGF0YSBjb250YWluZXIgZm9yIGEgYFRhcmdldGAgdGhhdCBhbGxvd3MgcXVlcmllcyBmb3Igc3BlY2lmaWMgYml0cyBvZiBtZXRhZGF0YS5cbiAqXG4gKiBTZWUgYEJvdW5kVGFyZ2V0YCBmb3IgZG9jdW1lbnRhdGlvbiBvbiB0aGUgaW5kaXZpZHVhbCBtZXRob2RzLlxuICovXG52YXIgUjNCb3VuZFRhcmdldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSM0JvdW5kVGFyZ2V0KHRhcmdldCwgZGlyZWN0aXZlcywgYmluZGluZ3MsIHJlZmVyZW5jZXMsIGV4cHJUYXJnZXRzLCBzeW1ib2xzLCBuZXN0aW5nTGV2ZWwsIHVzZWRQaXBlcykge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXMgPSByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmV4cHJUYXJnZXRzID0gZXhwclRhcmdldHM7XG4gICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHM7XG4gICAgICAgIHRoaXMubmVzdGluZ0xldmVsID0gbmVzdGluZ0xldmVsO1xuICAgICAgICB0aGlzLnVzZWRQaXBlcyA9IHVzZWRQaXBlcztcbiAgICB9XG4gICAgUjNCb3VuZFRhcmdldC5wcm90b3R5cGUuZ2V0RGlyZWN0aXZlc09mTm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGl2ZXMuZ2V0KG5vZGUpIHx8IG51bGw7XG4gICAgfTtcbiAgICBSM0JvdW5kVGFyZ2V0LnByb3RvdHlwZS5nZXRSZWZlcmVuY2VUYXJnZXQgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZXMuZ2V0KHJlZikgfHwgbnVsbDtcbiAgICB9O1xuICAgIFIzQm91bmRUYXJnZXQucHJvdG90eXBlLmdldENvbnN1bWVyT2ZCaW5kaW5nID0gZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3MuZ2V0KGJpbmRpbmcpIHx8IG51bGw7XG4gICAgfTtcbiAgICBSM0JvdW5kVGFyZ2V0LnByb3RvdHlwZS5nZXRFeHByZXNzaW9uVGFyZ2V0ID0gZnVuY3Rpb24gKGV4cHIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwclRhcmdldHMuZ2V0KGV4cHIpIHx8IG51bGw7XG4gICAgfTtcbiAgICBSM0JvdW5kVGFyZ2V0LnByb3RvdHlwZS5nZXRUZW1wbGF0ZU9mU3ltYm9sID0gZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xzLmdldChzeW1ib2wpIHx8IG51bGw7XG4gICAgfTtcbiAgICBSM0JvdW5kVGFyZ2V0LnByb3RvdHlwZS5nZXROZXN0aW5nTGV2ZWwgPSBmdW5jdGlvbiAodGVtcGxhdGUpIHsgcmV0dXJuIHRoaXMubmVzdGluZ0xldmVsLmdldCh0ZW1wbGF0ZSkgfHwgMDsgfTtcbiAgICBSM0JvdW5kVGFyZ2V0LnByb3RvdHlwZS5nZXRVc2VkRGlyZWN0aXZlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcnMpIHsgcmV0dXJuIGRpcnMuZm9yRWFjaChmdW5jdGlvbiAoZGlyKSB7IHJldHVybiBzZXQuYWRkKGRpcik7IH0pOyB9KTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2V0LnZhbHVlcygpKTtcbiAgICB9O1xuICAgIFIzQm91bmRUYXJnZXQucHJvdG90eXBlLmdldFVzZWRQaXBlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LmZyb20odGhpcy51c2VkUGlwZXMpOyB9O1xuICAgIHJldHVybiBSM0JvdW5kVGFyZ2V0O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gVGhpcyBmaWxlIG9ubHkgcmVleHBvcnRzIGNvbnRlbnQgb2YgdGhlIGBzcmNgIGZvbGRlci4gS2VlcCBpdCB0aGF0IHdheS5cbi8vIFRoaXMgZnVuY3Rpb24gY2FsbCBoYXMgYSBnbG9iYWwgc2lkZSBlZmZlY3RzIGFuZCBwdWJsaXNoZXMgdGhlIGNvbXBpbGVyIGludG8gZ2xvYmFsIG5hbWVzcGFjZSBmb3Jcbi8vIHRoZSBsYXRlIGJpbmRpbmcgb2YgdGhlIENvbXBpbGVyIHRvIHRoZSBAYW5ndWxhci9jb3JlIGZvciBqaXQgY29tcGlsYXRpb24uXG5wdWJsaXNoRmFjYWRlKF9nbG9iYWwpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUaGlzIGZpbGUgb25seSByZWV4cG9ydHMgY29udGVudCBvZiB0aGUgYHNyY2AgZm9sZGVyLiBLZWVwIGl0IHRoYXQgd2F5LlxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuZXhwb3J0IHsgY29yZSwgQ29tcGlsZXJDb25maWcsIHByZXNlcnZlV2hpdGVzcGFjZXNEZWZhdWx0LCBpc0xvd2VyZWRTeW1ib2wsIGNyZWF0ZUxvd2VyZWRTeW1ib2wsIElkZW50aWZpZXJzLCBKaXRDb21waWxlciwgQ29uc3RhbnRQb29sLCBEaXJlY3RpdmVSZXNvbHZlciwgUGlwZVJlc29sdmVyLCBOZ01vZHVsZVJlc29sdmVyLCBERUZBVUxUX0lOVEVSUE9MQVRJT05fQ09ORklHLCBJbnRlcnBvbGF0aW9uQ29uZmlnLCBOZ01vZHVsZUNvbXBpbGVyLCBBcnJheVR5cGUsIEFzc2VydE5vdE51bGwsIERZTkFNSUNfVFlQRSwgQmluYXJ5T3BlcmF0b3IsIEJpbmFyeU9wZXJhdG9yRXhwciwgQnVpbHRpbk1ldGhvZCwgQnVpbHRpblR5cGUsIEJ1aWx0aW5UeXBlTmFtZSwgQnVpbHRpblZhciwgQ2FzdEV4cHIsIENsYXNzRmllbGQsIENsYXNzTWV0aG9kLCBDbGFzc1N0bXQsIENvbW1hRXhwciwgQ29tbWVudFN0bXQsIENvbmRpdGlvbmFsRXhwciwgRGVjbGFyZUZ1bmN0aW9uU3RtdCwgRGVjbGFyZVZhclN0bXQsIEV4cHJlc3Npb24sIEV4cHJlc3Npb25TdGF0ZW1lbnQsIEV4cHJlc3Npb25UeXBlLCBFeHRlcm5hbEV4cHIsIEV4dGVybmFsUmVmZXJlbmNlLCBsaXRlcmFsTWFwLCBGdW5jdGlvbkV4cHIsIElmU3RtdCwgSW5zdGFudGlhdGVFeHByLCBJbnZva2VGdW5jdGlvbkV4cHIsIEludm9rZU1ldGhvZEV4cHIsIEpTRG9jQ29tbWVudFN0bXQsIExpdGVyYWxBcnJheUV4cHIsIExpdGVyYWxFeHByLCBMaXRlcmFsTWFwRXhwciwgTWFwVHlwZSwgTm90RXhwciwgUmVhZEtleUV4cHIsIFJlYWRQcm9wRXhwciwgUmVhZFZhckV4cHIsIFJldHVyblN0YXRlbWVudCwgVGhyb3dTdG10LCBUcnlDYXRjaFN0bXQsIFR5cGUkMSBhcyBUeXBlLCBXcmFwcGVkTm9kZUV4cHIsIFdyaXRlS2V5RXhwciwgV3JpdGVQcm9wRXhwciwgV3JpdGVWYXJFeHByLCBTdG10TW9kaWZpZXIsIFN0YXRlbWVudCwgVHlwZW9mRXhwciwgY29sbGVjdEV4dGVybmFsUmVmZXJlbmNlcywgRW1pdHRlclZpc2l0b3JDb250ZXh0LCBKaXRFdmFsdWF0b3IsIFZpZXdDb21waWxlciwgZmluZFN0YXRpY1F1ZXJ5SWRzLCBzdGF0aWNWaWV3UXVlcnlJZHMsIGdldFBhcnNlRXJyb3JzLCBpc1N5bnRheEVycm9yLCBzeW50YXhFcnJvciwgVmVyc2lvbiwgQm91bmRBdHRyaWJ1dGUgYXMgVG1wbEFzdEJvdW5kQXR0cmlidXRlLCBCb3VuZEV2ZW50IGFzIFRtcGxBc3RCb3VuZEV2ZW50LCBCb3VuZFRleHQgYXMgVG1wbEFzdEJvdW5kVGV4dCwgQ29udGVudCBhcyBUbXBsQXN0Q29udGVudCwgRWxlbWVudCBhcyBUbXBsQXN0RWxlbWVudCwgUmVmZXJlbmNlIGFzIFRtcGxBc3RSZWZlcmVuY2UsIFRlbXBsYXRlIGFzIFRtcGxBc3RUZW1wbGF0ZSwgVGV4dCBhcyBUbXBsQXN0VGV4dCwgVGV4dEF0dHJpYnV0ZSBhcyBUbXBsQXN0VGV4dEF0dHJpYnV0ZSwgVmFyaWFibGUgYXMgVG1wbEFzdFZhcmlhYmxlLCBJZGVudGlmaWVycyQxIGFzIFIzSWRlbnRpZmllcnMsIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSwgY29tcGlsZUluamVjdG9yLCBjb21waWxlTmdNb2R1bGUsIGNvbXBpbGVQaXBlRnJvbU1ldGFkYXRhLCBtYWtlQmluZGluZ1BhcnNlciwgcGFyc2VUZW1wbGF0ZSwgY29tcGlsZUJhc2VEZWZGcm9tTWV0YWRhdGEsIGNvbXBpbGVDb21wb25lbnRGcm9tTWV0YWRhdGEsIGNvbXBpbGVEaXJlY3RpdmVGcm9tTWV0YWRhdGEsIHBhcnNlSG9zdEJpbmRpbmdzLCB2ZXJpZnlIb3N0QmluZGluZ3MsIHB1Ymxpc2hGYWNhZGUsIFZFUlNJT04kMSBhcyBWRVJTSU9OLCBUZXh0QXN0LCBCb3VuZFRleHRBc3QsIEF0dHJBc3QsIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LCBCb3VuZEV2ZW50QXN0LCBSZWZlcmVuY2VBc3QsIFZhcmlhYmxlQXN0LCBFbGVtZW50QXN0LCBFbWJlZGRlZFRlbXBsYXRlQXN0LCBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBEaXJlY3RpdmVBc3QsIFByb3ZpZGVyQXN0LCBQcm92aWRlckFzdFR5cGUsIE5nQ29udGVudEFzdCwgTnVsbFRlbXBsYXRlVmlzaXRvciwgUmVjdXJzaXZlVGVtcGxhdGVBc3RWaXNpdG9yLCB0ZW1wbGF0ZVZpc2l0QWxsLCBzYW5pdGl6ZUlkZW50aWZpZXIsIGlkZW50aWZpZXJOYW1lLCBpZGVudGlmaWVyTW9kdWxlVXJsLCB2aWV3Q2xhc3NOYW1lLCByZW5kZXJlclR5cGVOYW1lLCBob3N0Vmlld0NsYXNzTmFtZSwgY29tcG9uZW50RmFjdG9yeU5hbWUsIENvbXBpbGVTdW1tYXJ5S2luZCwgdG9rZW5OYW1lLCB0b2tlblJlZmVyZW5jZSwgQ29tcGlsZVN0eWxlc2hlZXRNZXRhZGF0YSwgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEsIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcGlsZVBpcGVNZXRhZGF0YSwgQ29tcGlsZVNoYWxsb3dNb2R1bGVNZXRhZGF0YSwgQ29tcGlsZU5nTW9kdWxlTWV0YWRhdGEsIFRyYW5zaXRpdmVDb21waWxlTmdNb2R1bGVNZXRhZGF0YSwgUHJvdmlkZXJNZXRhLCBmbGF0dGVuLCB0ZW1wbGF0ZVNvdXJjZVVybCwgc2hhcmVkU3R5bGVzaGVldEppdFVybCwgbmdNb2R1bGVKaXRVcmwsIHRlbXBsYXRlSml0VXJsLCBjcmVhdGVBb3RVcmxSZXNvbHZlciwgY3JlYXRlQW90Q29tcGlsZXIsIEFvdENvbXBpbGVyLCBhbmFseXplTmdNb2R1bGVzLCBhbmFseXplQW5kVmFsaWRhdGVOZ01vZHVsZXMsIGFuYWx5emVGaWxlLCBhbmFseXplRmlsZUZvckluamVjdGFibGVzLCBtZXJnZUFuYWx5emVkRmlsZXMsIEdlbmVyYXRlZEZpbGUsIHRvVHlwZVNjcmlwdCwgZm9ybWF0dGVkRXJyb3IsIGlzRm9ybWF0dGVkRXJyb3IsIFN0YXRpY1JlZmxlY3RvciwgU3RhdGljU3ltYm9sLCBTdGF0aWNTeW1ib2xDYWNoZSwgUmVzb2x2ZWRTdGF0aWNTeW1ib2wsIFN0YXRpY1N5bWJvbFJlc29sdmVyLCB1bmVzY2FwZUlkZW50aWZpZXIsIHVud3JhcFJlc29sdmVkTWV0YWRhdGEsIEFvdFN1bW1hcnlSZXNvbHZlciwgQXN0UGF0aCwgU3VtbWFyeVJlc29sdmVyLCBKaXRTdW1tYXJ5UmVzb2x2ZXIsIENvbXBpbGVSZWZsZWN0b3IsIGNyZWF0ZVVybFJlc29sdmVyV2l0aG91dFBhY2thZ2VQcmVmaXgsIGNyZWF0ZU9mZmxpbmVDb21waWxlVXJsUmVzb2x2ZXIsIFVybFJlc29sdmVyLCBnZXRVcmxTY2hlbWUsIFJlc291cmNlTG9hZGVyLCBFbGVtZW50U2NoZW1hUmVnaXN0cnksIEV4dHJhY3RvciwgSTE4Tkh0bWxQYXJzZXIsIE1lc3NhZ2VCdW5kbGUsIFNlcmlhbGl6ZXIsIFhsaWZmLCBYbGlmZjIsIFhtYiwgWHRiLCBEaXJlY3RpdmVOb3JtYWxpemVyLCBQYXJzZXJFcnJvciwgUGFyc2VTcGFuLCBBU1QsIFF1b3RlLCBFbXB0eUV4cHIsIEltcGxpY2l0UmVjZWl2ZXIsIENoYWluLCBDb25kaXRpb25hbCwgUHJvcGVydHlSZWFkLCBQcm9wZXJ0eVdyaXRlLCBTYWZlUHJvcGVydHlSZWFkLCBLZXllZFJlYWQsIEtleWVkV3JpdGUsIEJpbmRpbmdQaXBlLCBMaXRlcmFsUHJpbWl0aXZlLCBMaXRlcmFsQXJyYXksIExpdGVyYWxNYXAsIEludGVycG9sYXRpb24sIEJpbmFyeSwgUHJlZml4Tm90LCBOb25OdWxsQXNzZXJ0LCBNZXRob2RDYWxsLCBTYWZlTWV0aG9kQ2FsbCwgRnVuY3Rpb25DYWxsLCBBU1RXaXRoU291cmNlLCBUZW1wbGF0ZUJpbmRpbmcsIE51bGxBc3RWaXNpdG9yLCBSZWN1cnNpdmVBc3RWaXNpdG9yJDEgYXMgUmVjdXJzaXZlQXN0VmlzaXRvciwgQXN0VHJhbnNmb3JtZXIkMSBhcyBBc3RUcmFuc2Zvcm1lciwgQXN0TWVtb3J5RWZmaWNpZW50VHJhbnNmb3JtZXIsIHZpc2l0QXN0Q2hpbGRyZW4sIFBhcnNlZFByb3BlcnR5LCBQYXJzZWRQcm9wZXJ0eVR5cGUsIFBhcnNlZEV2ZW50LCBQYXJzZWRWYXJpYWJsZSwgQm91bmRFbGVtZW50UHJvcGVydHksIFRva2VuVHlwZSQxIGFzIFRva2VuVHlwZSwgTGV4ZXIsIFRva2VuJDEgYXMgVG9rZW4sIEVPRiwgaXNJZGVudGlmaWVyLCBpc1F1b3RlLCBTcGxpdEludGVycG9sYXRpb24sIFRlbXBsYXRlQmluZGluZ1BhcnNlUmVzdWx0LCBQYXJzZXIkMSBhcyBQYXJzZXIsIF9QYXJzZUFTVCwgRVJST1JfQ09NUE9ORU5UX1RZUEUsIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLCBUZXh0JDMgYXMgVGV4dCwgRXhwYW5zaW9uLCBFeHBhbnNpb25DYXNlLCBBdHRyaWJ1dGUsIEVsZW1lbnQkMSBhcyBFbGVtZW50LCBDb21tZW50LCB2aXNpdEFsbCQxIGFzIHZpc2l0QWxsLCBSZWN1cnNpdmVWaXNpdG9yLCBmaW5kTm9kZSwgSHRtbFBhcnNlciwgUGFyc2VUcmVlUmVzdWx0LCBUcmVlRXJyb3IsIEh0bWxUYWdEZWZpbml0aW9uLCBnZXRIdG1sVGFnRGVmaW5pdGlvbiwgVGFnQ29udGVudFR5cGUsIHNwbGl0TnNOYW1lLCBpc05nQ29udGFpbmVyLCBpc05nQ29udGVudCwgaXNOZ1RlbXBsYXRlLCBnZXROc1ByZWZpeCwgbWVyZ2VOc0FuZE5hbWUsIE5BTUVEX0VOVElUSUVTLCBOR1NQX1VOSUNPREUsIGRlYnVnT3V0cHV0QXN0QXNUeXBlU2NyaXB0LCBUeXBlU2NyaXB0RW1pdHRlciwgUGFyc2VMb2NhdGlvbiwgUGFyc2VTb3VyY2VGaWxlLCBQYXJzZVNvdXJjZVNwYW4sIFBhcnNlRXJyb3JMZXZlbCwgUGFyc2VFcnJvciwgdHlwZVNvdXJjZVNwYW4sIHIzSml0VHlwZVNvdXJjZVNwYW4sIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgQ3NzU2VsZWN0b3IsIFNlbGVjdG9yTWF0Y2hlciwgU2VsZWN0b3JMaXN0Q29udGV4dCwgU2VsZWN0b3JDb250ZXh0LCBIT1NUX0FUVFIsIENPTlRFTlRfQVRUUiwgU3R5bGVzQ29tcGlsZURlcGVuZGVuY3ksIENvbXBpbGVkU3R5bGVzaGVldCwgU3R5bGVDb21waWxlciwgVGVtcGxhdGVQYXJzZUVycm9yLCBUZW1wbGF0ZVBhcnNlUmVzdWx0LCBUZW1wbGF0ZVBhcnNlciwgc3BsaXRDbGFzc2VzLCBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IsIHJlbW92ZVN1bW1hcnlEdXBsaWNhdGVzLCBpc0VtcHR5RXhwcmVzc2lvbiwgY29tcGlsZUluamVjdGFibGUsIFIzVGFyZ2V0QmluZGVyLCBSM0JvdW5kVGFyZ2V0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21waWxlci5qcy5tYXBcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIGlzRm9yY2VkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWZvcmNlZCcpO1xuXG4vKlxuICBvcHRpb25zLnRhcmdldCAgICAgIC0gbmFtZSBvZiB0aGUgdGFyZ2V0IG9iamVjdFxuICBvcHRpb25zLmdsb2JhbCAgICAgIC0gdGFyZ2V0IGlzIHRoZSBnbG9iYWwgb2JqZWN0XG4gIG9wdGlvbnMuc3RhdCAgICAgICAgLSBleHBvcnQgYXMgc3RhdGljIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucHJvdG8gICAgICAgLSBleHBvcnQgYXMgcHJvdG90eXBlIG1ldGhvZHMgb2YgdGFyZ2V0XG4gIG9wdGlvbnMucmVhbCAgICAgICAgLSByZWFsIHByb3RvdHlwZSBtZXRob2QgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLmZvcmNlZCAgICAgIC0gZXhwb3J0IGV2ZW4gaWYgdGhlIG5hdGl2ZSBmZWF0dXJlIGlzIGF2YWlsYWJsZVxuICBvcHRpb25zLmJpbmQgICAgICAgIC0gYmluZCBtZXRob2RzIHRvIHRoZSB0YXJnZXQsIHJlcXVpcmVkIGZvciB0aGUgYHB1cmVgIHZlcnNpb25cbiAgb3B0aW9ucy53cmFwICAgICAgICAtIHdyYXAgY29uc3RydWN0b3JzIHRvIHByZXZlbnRpbmcgZ2xvYmFsIHBvbGx1dGlvbiwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLnVuc2FmZSAgICAgIC0gdXNlIHRoZSBzaW1wbGUgYXNzaWdubWVudCBvZiBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRlbGV0ZSArIGRlZmluZVByb3BlcnR5XG4gIG9wdGlvbnMuc2hhbSAgICAgICAgLSBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gIG9wdGlvbnMuZW51bWVyYWJsZSAgLSBleHBvcnQgYXMgZW51bWVyYWJsZSBwcm9wZXJ0eVxuICBvcHRpb25zLm5vVGFyZ2V0R2V0IC0gcHJldmVudCBjYWxsaW5nIGEgZ2V0dGVyIG9uIHRhcmdldFxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMsIHNvdXJjZSkge1xuICB2YXIgVEFSR0VUID0gb3B0aW9ucy50YXJnZXQ7XG4gIHZhciBHTE9CQUwgPSBvcHRpb25zLmdsb2JhbDtcbiAgdmFyIFNUQVRJQyA9IG9wdGlvbnMuc3RhdDtcbiAgdmFyIEZPUkNFRCwgdGFyZ2V0LCBrZXksIHRhcmdldFByb3BlcnR5LCBzb3VyY2VQcm9wZXJ0eSwgZGVzY3JpcHRvcjtcbiAgaWYgKEdMT0JBTCkge1xuICAgIHRhcmdldCA9IGdsb2JhbDtcbiAgfSBlbHNlIGlmIChTVEFUSUMpIHtcbiAgICB0YXJnZXQgPSBnbG9iYWxbVEFSR0VUXSB8fCBzZXRHbG9iYWwoVEFSR0VULCB7fSk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gKGdsb2JhbFtUQVJHRVRdIHx8IHt9KS5wcm90b3R5cGU7XG4gIH1cbiAgaWYgKHRhcmdldCkgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgc291cmNlUHJvcGVydHkgPSBzb3VyY2Vba2V5XTtcbiAgICBpZiAob3B0aW9ucy5ub1RhcmdldEdldCkge1xuICAgICAgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG4gICAgICB0YXJnZXRQcm9wZXJ0eSA9IGRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci52YWx1ZTtcbiAgICB9IGVsc2UgdGFyZ2V0UHJvcGVydHkgPSB0YXJnZXRba2V5XTtcbiAgICBGT1JDRUQgPSBpc0ZvcmNlZChHTE9CQUwgPyBrZXkgOiBUQVJHRVQgKyAoU1RBVElDID8gJy4nIDogJyMnKSArIGtleSwgb3B0aW9ucy5mb3JjZWQpO1xuICAgIC8vIGNvbnRhaW5lZCBpbiB0YXJnZXRcbiAgICBpZiAoIUZPUkNFRCAmJiB0YXJnZXRQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVByb3BlcnR5ID09PSB0eXBlb2YgdGFyZ2V0UHJvcGVydHkpIGNvbnRpbnVlO1xuICAgICAgY29weUNvbnN0cnVjdG9yUHJvcGVydGllcyhzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0UHJvcGVydHkpO1xuICAgIH1cbiAgICAvLyBhZGQgYSBmbGFnIHRvIG5vdCBjb21wbGV0ZWx5IGZ1bGwgcG9seWZpbGxzXG4gICAgaWYgKG9wdGlvbnMuc2hhbSB8fCAodGFyZ2V0UHJvcGVydHkgJiYgdGFyZ2V0UHJvcGVydHkuc2hhbSkpIHtcbiAgICAgIGhpZGUoc291cmNlUHJvcGVydHksICdzaGFtJywgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICByZWRlZmluZSh0YXJnZXQsIGtleSwgc291cmNlUHJvcGVydHksIG9wdGlvbnMpO1xuICB9XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoaXQpICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX25vb3AgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcCc7XG5leHBvcnQgZnVuY3Rpb24gcGlwZSgpIHtcbiAgICB2YXIgZm5zID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgZm5zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBwaXBlRnJvbUFycmF5KGZucyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHtcbiAgICBpZiAoIWZucykge1xuICAgICAgICByZXR1cm4gbm9vcDtcbiAgICB9XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGZuc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBpcGVkKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBmbikgeyByZXR1cm4gZm4ocHJldik7IH0sIGlucHV0KTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGlwZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX3V0aWxfY2FuUmVwb3J0RXJyb3IsX3V0aWxfdG9TdWJzY3JpYmVyLF9pbnRlcm5hbF9zeW1ib2xfb2JzZXJ2YWJsZSxfdXRpbF9waXBlLF9jb25maWcgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgY2FuUmVwb3J0RXJyb3IgfSBmcm9tICcuL3V0aWwvY2FuUmVwb3J0RXJyb3InO1xuaW1wb3J0IHsgdG9TdWJzY3JpYmVyIH0gZnJvbSAnLi91dGlsL3RvU3Vic2NyaWJlcic7XG5pbXBvcnQgeyBvYnNlcnZhYmxlIGFzIFN5bWJvbF9vYnNlcnZhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUnO1xuaW1wb3J0IHsgcGlwZUZyb21BcnJheSB9IGZyb20gJy4vdXRpbC9waXBlJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbnZhciBPYnNlcnZhYmxlID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGUoc3Vic2NyaWJlKSB7XG4gICAgICAgIHRoaXMuX2lzU2NhbGFyID0gZmFsc2U7XG4gICAgICAgIGlmIChzdWJzY3JpYmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24gKG9wZXJhdG9yKSB7XG4gICAgICAgIHZhciBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKTtcbiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzO1xuICAgICAgICBvYnNlcnZhYmxlLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZS5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9yID0gdGhpcy5vcGVyYXRvcjtcbiAgICAgICAgdmFyIHNpbmsgPSB0b1N1YnNjcmliZXIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSk7XG4gICAgICAgIGlmIChvcGVyYXRvcikge1xuICAgICAgICAgICAgc2luay5hZGQob3BlcmF0b3IuY2FsbChzaW5rLCB0aGlzLnNvdXJjZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2luay5hZGQodGhpcy5zb3VyY2UgfHwgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nICYmICFzaW5rLnN5bmNFcnJvclRocm93YWJsZSkgP1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShzaW5rKSA6XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJ5U3Vic2NyaWJlKHNpbmspKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICAgICAgICAgIGlmIChzaW5rLnN5bmNFcnJvclRocm93YWJsZSkge1xuICAgICAgICAgICAgICAgIHNpbmsuc3luY0Vycm9yVGhyb3dhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHNpbmsuc3luY0Vycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHNpbmsuc3luY0Vycm9yVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaW5rO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3RyeVN1YnNjcmliZSA9IGZ1bmN0aW9uIChzaW5rKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgICAgICAgICAgICAgIHNpbmsuc3luY0Vycm9yVGhyb3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzaW5rLnN5bmNFcnJvclZhbHVlID0gZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhblJlcG9ydEVycm9yKHNpbmspKSB7XG4gICAgICAgICAgICAgICAgc2luay5lcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAobmV4dCwgcHJvbWlzZUN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7XG4gICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHN1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IF90aGlzLnN1YnNjcmliZShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QsIHJlc29sdmUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgIHJldHVybiBzb3VyY2UgJiYgc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9O1xuICAgIE9ic2VydmFibGUucHJvdG90eXBlW1N5bWJvbF9vYnNlcnZhYmxlXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgb3BlcmF0aW9uc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBpcGVGcm9tQXJyYXkob3BlcmF0aW9ucykodGhpcyk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlLnByb3RvdHlwZS50b1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZUN0b3IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7XG4gICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgX3RoaXMuc3Vic2NyaWJlKGZ1bmN0aW9uICh4KSB7IHJldHVybiB2YWx1ZSA9IHg7IH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIHJlamVjdChlcnIpOyB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNvbHZlKHZhbHVlKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgT2JzZXJ2YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmUpO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmFibGU7XG59KCkpO1xuZXhwb3J0IHsgT2JzZXJ2YWJsZSB9O1xuZnVuY3Rpb24gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpIHtcbiAgICBpZiAoIXByb21pc2VDdG9yKSB7XG4gICAgICAgIHByb21pc2VDdG9yID0gY29uZmlnLlByb21pc2UgfHwgUHJvbWlzZTtcbiAgICB9XG4gICAgaWYgKCFwcm9taXNlQ3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIFByb21pc2UgaW1wbCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZUN0b3I7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PYnNlcnZhYmxlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfU3Vic2NyaWJlcixfc3ltYm9sX3J4U3Vic2NyaWJlcixfT2JzZXJ2ZXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuaW1wb3J0IHsgcnhTdWJzY3JpYmVyIGFzIHJ4U3Vic2NyaWJlclN5bWJvbCB9IGZyb20gJy4uL3N5bWJvbC9yeFN1YnNjcmliZXInO1xuaW1wb3J0IHsgZW1wdHkgYXMgZW1wdHlPYnNlcnZlciB9IGZyb20gJy4uL09ic2VydmVyJztcbmV4cG9ydCBmdW5jdGlvbiB0b1N1YnNjcmliZXIobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIGlmIChuZXh0T3JPYnNlcnZlcikge1xuICAgICAgICBpZiAobmV4dE9yT2JzZXJ2ZXIgaW5zdGFuY2VvZiBTdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dE9yT2JzZXJ2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyW3J4U3Vic2NyaWJlclN5bWJvbF0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0T3JPYnNlcnZlcltyeFN1YnNjcmliZXJTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFuZXh0T3JPYnNlcnZlciAmJiAhZXJyb3IgJiYgIWNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3Vic2NyaWJlcihlbXB0eU9ic2VydmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpYmVyKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9TdWJzY3JpYmVyLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfU3Vic2NyaWJlciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAnLi4vU3Vic2NyaWJlcic7XG5leHBvcnQgZnVuY3Rpb24gY2FuUmVwb3J0RXJyb3Iob2JzZXJ2ZXIpIHtcbiAgICB3aGlsZSAob2JzZXJ2ZXIpIHtcbiAgICAgICAgdmFyIF9hID0gb2JzZXJ2ZXIsIGNsb3NlZF8xID0gX2EuY2xvc2VkLCBkZXN0aW5hdGlvbiA9IF9hLmRlc3RpbmF0aW9uLCBpc1N0b3BwZWQgPSBfYS5pc1N0b3BwZWQ7XG4gICAgICAgIGlmIChjbG9zZWRfMSB8fCBpc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgIG9ic2VydmVyID0gZGVzdGluYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jYW5SZXBvcnRFcnJvci5qcy5tYXBcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xuXG4vLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0eVxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhREVTQ1JJUFRPUlMsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGRlZmluZVByb3BlcnR5OiByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmZcbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgd2luZG93Lk1hdGggPT0gTWF0aCA/IHdpbmRvd1xuICA6IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIHRzbGliLF91dGlsX2lzRnVuY3Rpb24sX09ic2VydmVyLF9TdWJzY3JpcHRpb24sX2ludGVybmFsX3N5bWJvbF9yeFN1YnNjcmliZXIsX2NvbmZpZyxfdXRpbF9ob3N0UmVwb3J0RXJyb3IgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL3V0aWwvaXNGdW5jdGlvbic7XG5pbXBvcnQgeyBlbXB0eSBhcyBlbXB0eU9ic2VydmVyIH0gZnJvbSAnLi9PYnNlcnZlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyByeFN1YnNjcmliZXIgYXMgcnhTdWJzY3JpYmVyU3ltYm9sIH0gZnJvbSAnLi4vaW50ZXJuYWwvc3ltYm9sL3J4U3Vic2NyaWJlcic7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBob3N0UmVwb3J0RXJyb3IgfSBmcm9tICcuL3V0aWwvaG9zdFJlcG9ydEVycm9yJztcbnZhciBTdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU3Vic2NyaWJlcihkZXN0aW5hdGlvbk9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN5bmNFcnJvclZhbHVlID0gbnVsbDtcbiAgICAgICAgX3RoaXMuc3luY0Vycm9yVGhyb3duID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBlbXB0eU9ic2VydmVyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGlmICghZGVzdGluYXRpb25Pck5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBlbXB0eU9ic2VydmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbk9yTmV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc3luY0Vycm9yVGhyb3dhYmxlID0gZGVzdGluYXRpb25Pck5leHQuc3luY0Vycm9yVGhyb3dhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbk9yTmV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uT3JOZXh0LmFkZChfdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zeW5jRXJyb3JUaHJvd2FibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIoX3RoaXMsIGRlc3RpbmF0aW9uT3JOZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIF90aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIoX3RoaXMsIGRlc3RpbmF0aW9uT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGVbcnhTdWJzY3JpYmVyU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgU3Vic2NyaWJlci5jcmVhdGUgPSBmdW5jdGlvbiAobmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBzdWJzY3JpYmVyID0gbmV3IFN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgICAgICAgc3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX25leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgfTtcbiAgICBTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIFN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZUFuZFJlY3ljbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIF9wYXJlbnQgPSBfYS5fcGFyZW50LCBfcGFyZW50cyA9IF9hLl9wYXJlbnRzO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgICAgICB0aGlzLl9wYXJlbnRzID0gX3BhcmVudHM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgcmV0dXJuIFN1YnNjcmliZXI7XG59KFN1YnNjcmlwdGlvbikpO1xuZXhwb3J0IHsgU3Vic2NyaWJlciB9O1xudmFyIFNhZmVTdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFNhZmVTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFNhZmVTdWJzY3JpYmVyKF9wYXJlbnRTdWJzY3JpYmVyLCBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9wYXJlbnRTdWJzY3JpYmVyID0gX3BhcmVudFN1YnNjcmliZXI7XG4gICAgICAgIHZhciBuZXh0O1xuICAgICAgICB2YXIgY29udGV4dCA9IF90aGlzO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkpIHtcbiAgICAgICAgICAgIG5leHQgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkge1xuICAgICAgICAgICAgbmV4dCA9IG9ic2VydmVyT3JOZXh0Lm5leHQ7XG4gICAgICAgICAgICBlcnJvciA9IG9ic2VydmVyT3JOZXh0LmVycm9yO1xuICAgICAgICAgICAgY29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZTtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlck9yTmV4dCAhPT0gZW1wdHlPYnNlcnZlcikge1xuICAgICAgICAgICAgICAgIGNvbnRleHQgPSBPYmplY3QuY3JlYXRlKG9ic2VydmVyT3JOZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjb250ZXh0LnVuc3Vic2NyaWJlKSkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hZGQoY29udGV4dC51bnN1YnNjcmliZS5iaW5kKGNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGV4dC51bnN1YnNjcmliZSA9IF90aGlzLnVuc3Vic2NyaWJlLmJpbmQoX3RoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIF90aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgX3RoaXMuX25leHQgPSBuZXh0O1xuICAgICAgICBfdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgX3RoaXMuX2NvbXBsZXRlID0gY29tcGxldGU7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgU2FmZVN1YnNjcmliZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCAmJiB0aGlzLl9uZXh0KSB7XG4gICAgICAgICAgICB2YXIgX3BhcmVudFN1YnNjcmliZXIgPSB0aGlzLl9wYXJlbnRTdWJzY3JpYmVyO1xuICAgICAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIodGhpcy5fbmV4dCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fX3RyeU9yU2V0RXJyb3IoX3BhcmVudFN1YnNjcmliZXIsIHRoaXMuX25leHQsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgU2FmZVN1YnNjcmliZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB2YXIgX3BhcmVudFN1YnNjcmliZXIgPSB0aGlzLl9wYXJlbnRTdWJzY3JpYmVyO1xuICAgICAgICAgICAgdmFyIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgPSBjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZztcbiAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclVuc3ViKHRoaXMuX2Vycm9yLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgdGhpcy5fZXJyb3IsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgICAgICAgICAgICAgICAgICBfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JWYWx1ZSA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNhZmVTdWJzY3JpYmVyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgdmFyIF9wYXJlbnRTdWJzY3JpYmVyID0gdGhpcy5fcGFyZW50U3Vic2NyaWJlcjtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB3cmFwcGVkQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fY29tcGxldGUuY2FsbChfdGhpcy5fY29udGV4dCk7IH07XG4gICAgICAgICAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclVuc3ViKHdyYXBwZWRDb21wbGV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnRTdWJzY3JpYmVyLCB3cmFwcGVkQ29tcGxldGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTYWZlU3Vic2NyaWJlci5wcm90b3R5cGUuX190cnlPclVuc3ViID0gZnVuY3Rpb24gKGZuLCB2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzLl9jb250ZXh0LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNhZmVTdWJzY3JpYmVyLnByb3RvdHlwZS5fX3RyeU9yU2V0RXJyb3IgPSBmdW5jdGlvbiAocGFyZW50LCBmbiwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2FsbCcpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnQuc3luY0Vycm9yVmFsdWUgPSBlcnI7XG4gICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclRocm93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBTYWZlU3Vic2NyaWJlci5wcm90b3R5cGUuX3Vuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3BhcmVudFN1YnNjcmliZXIgPSB0aGlzLl9wYXJlbnRTdWJzY3JpYmVyO1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGFyZW50U3Vic2NyaWJlciA9IG51bGw7XG4gICAgICAgIF9wYXJlbnRTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2FmZVN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcbmV4cG9ydCB7IFNhZmVTdWJzY3JpYmVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJzY3JpYmVyLmpzLm1hcFxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgP1xuICAgICAgICBlcnJvcnMubGVuZ3RoICsgXCIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcXG5cIiArIGVycm9ycy5tYXAoZnVuY3Rpb24gKGVyciwgaSkgeyByZXR1cm4gaSArIDEgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKTsgfSkuam9pbignXFxuICAnKSA6ICcnO1xuICAgIHRoaXMubmFtZSA9ICdVbnN1YnNjcmlwdGlvbkVycm9yJztcbiAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICByZXR1cm4gdGhpcztcbn1cblVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsLnByb3RvdHlwZSA9IC8qQF9fUFVSRV9fKi8gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuZXhwb3J0IHZhciBVbnN1YnNjcmlwdGlvbkVycm9yID0gVW5zdWJzY3JpcHRpb25FcnJvckltcGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VbnN1YnNjcmlwdGlvbkVycm9yLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfdXRpbF9pc0FycmF5LF91dGlsX2lzT2JqZWN0LF91dGlsX2lzRnVuY3Rpb24sX3V0aWxfVW5zdWJzY3JpcHRpb25FcnJvciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi91dGlsL2lzQXJyYXknO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuL3V0aWwvaXNPYmplY3QnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4vdXRpbC9pc0Z1bmN0aW9uJztcbmltcG9ydCB7IFVuc3Vic2NyaXB0aW9uRXJyb3IgfSBmcm9tICcuL3V0aWwvVW5zdWJzY3JpcHRpb25FcnJvcic7XG52YXIgU3Vic2NyaXB0aW9uID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbih1bnN1YnNjcmliZSkge1xuICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG51bGw7XG4gICAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaGFzRXJyb3JzID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvcnM7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIF9wYXJlbnQgPSBfYS5fcGFyZW50LCBfcGFyZW50cyA9IF9hLl9wYXJlbnRzLCBfdW5zdWJzY3JpYmUgPSBfYS5fdW5zdWJzY3JpYmUsIF9zdWJzY3JpcHRpb25zID0gX2EuX3N1YnNjcmlwdGlvbnM7XG4gICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGFyZW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSBudWxsO1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgdmFyIGxlbiA9IF9wYXJlbnRzID8gX3BhcmVudHMubGVuZ3RoIDogMDtcbiAgICAgICAgd2hpbGUgKF9wYXJlbnQpIHtcbiAgICAgICAgICAgIF9wYXJlbnQucmVtb3ZlKHRoaXMpO1xuICAgICAgICAgICAgX3BhcmVudCA9ICsraW5kZXggPCBsZW4gJiYgX3BhcmVudHNbaW5kZXhdIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oX3Vuc3Vic2NyaWJlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfdW5zdWJzY3JpYmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGZsYXR0ZW5VbnN1YnNjcmlwdGlvbkVycm9ycyhlLmVycm9ycykgOiBbZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkoX3N1YnNjcmlwdGlvbnMpKSB7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgbGVuID0gX3N1YnNjcmlwdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ViID0gX3N1YnNjcmlwdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChzdWIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGUuZXJyb3JzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzRXJyb3JzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdWJzY3JpcHRpb25FcnJvcihlcnJvcnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0ZWFyZG93bikge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGVhcmRvd247XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIHRlYXJkb3duKSB7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbih0ZWFyZG93bik7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT09IHRoaXMgfHwgc3Vic2NyaXB0aW9uLmNsb3NlZCB8fCB0eXBlb2Ygc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghKHN1YnNjcmlwdGlvbiBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uX3N1YnNjcmlwdGlvbnMgPSBbdG1wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZWFyZG93bikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VucmVjb2duaXplZCB0ZWFyZG93biAnICsgdGVhcmRvd24gKyAnIGFkZGVkIHRvIFN1YnNjcmlwdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLl9hZGRQYXJlbnQodGhpcykpIHtcbiAgICAgICAgICAgIHZhciBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9ucztcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW3N1YnNjcmlwdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnM7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgc3Vic2NyaXB0aW9uSW5kZXggPSBzdWJzY3JpcHRpb25zLmluZGV4T2Yoc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShzdWJzY3JpcHRpb25JbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUuX2FkZFBhcmVudCA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgX3BhcmVudCA9IF9hLl9wYXJlbnQsIF9wYXJlbnRzID0gX2EuX3BhcmVudHM7XG4gICAgICAgIGlmIChfcGFyZW50ID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghX3BhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIV9wYXJlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnRzID0gW3BhcmVudF07XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfcGFyZW50cy5pbmRleE9mKHBhcmVudCkgPT09IC0xKSB7XG4gICAgICAgICAgICBfcGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBTdWJzY3JpcHRpb24uRU1QVFkgPSAoZnVuY3Rpb24gKGVtcHR5KSB7XG4gICAgICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBlbXB0eTtcbiAgICB9KG5ldyBTdWJzY3JpcHRpb24oKSkpO1xuICAgIHJldHVybiBTdWJzY3JpcHRpb247XG59KCkpO1xuZXhwb3J0IHsgU3Vic2NyaXB0aW9uIH07XG5mdW5jdGlvbiBmbGF0dGVuVW5zdWJzY3JpcHRpb25FcnJvcnMoZXJyb3JzKSB7XG4gICAgcmV0dXJuIGVycm9ycy5yZWR1Y2UoZnVuY3Rpb24gKGVycnMsIGVycikgeyByZXR1cm4gZXJycy5jb25jYXQoKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IpID8gZXJyLmVycm9ycyA6IGVycik7IH0sIFtdKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN1YnNjcmlwdGlvbi5qcy5tYXBcbiIsInZhciBzdG9yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5TeW1ib2w7XG52YXIgTkFUSVZFX1NZTUJPTCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uYXRpdmUtc3ltYm9sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcbnZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sKCdmb28nKSA9PT0gJ3N5bWJvbCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgY29uY2F0ID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdDtcbnZhciBvcmlnRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG52YXIgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcblx0dmFyIG9iaiA9IHt9O1xuXHR0cnkge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmosICd4JywgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IG9iaiB9KTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdFx0Zm9yICh2YXIgXyBpbiBvYmopIHsgLy8ganNjczppZ25vcmUgZGlzYWxsb3dVbnVzZWRWYXJpYWJsZXNcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIG9iai54ID09PSBvYmo7XG5cdH0gY2F0Y2ggKGUpIHsgLyogdGhpcyBpcyBJRSA4LiAqL1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gb3JpZ0RlZmluZVByb3BlcnR5ICYmIGFyZVByb3BlcnR5RGVzY3JpcHRvcnNTdXBwb3J0ZWQoKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgdmFsdWUsIHByZWRpY2F0ZSkge1xuXHRpZiAobmFtZSBpbiBvYmplY3QgJiYgKCFpc0Z1bmN0aW9uKHByZWRpY2F0ZSkgfHwgIXByZWRpY2F0ZSgpKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdG9yaWdEZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmplY3RbbmFtZV0gPSB2YWx1ZTtcblx0fVxufTtcblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXApIHtcblx0dmFyIHByZWRpY2F0ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXHR2YXIgcHJvcHMgPSBrZXlzKG1hcCk7XG5cdGlmIChoYXNTeW1ib2xzKSB7XG5cdFx0cHJvcHMgPSBjb25jYXQuY2FsbChwcm9wcywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtYXApKTtcblx0fVxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wc1tpXSwgbWFwW3Byb3BzW2ldXSwgcHJlZGljYXRlc1twcm9wc1tpXV0pO1xuXHR9XG59O1xuXG5kZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIXN1cHBvcnRzRGVzY3JpcHRvcnM7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydGllcztcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsInZhciBwYXRoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BhdGgnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgdmFyIFN5bWJvbCA9IHBhdGguU3ltYm9sIHx8IChwYXRoLlN5bWJvbCA9IHt9KTtcbiAgaWYgKCFoYXMoU3ltYm9sLCBOQU1FKSkgZGVmaW5lUHJvcGVydHkoU3ltYm9sLCBOQU1FLCB7XG4gICAgdmFsdWU6IHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZihOQU1FKVxuICB9KTtcbn07XG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJ2YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZvci1lYWNoJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5mb3IgKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gRE9NSXRlcmFibGVzKSB7XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW0NPTExFQ1RJT05fTkFNRV07XG4gIHZhciBDb2xsZWN0aW9uUHJvdG90eXBlID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlICYmIENvbGxlY3Rpb25Qcm90b3R5cGUuZm9yRWFjaCAhPT0gZm9yRWFjaCkgdHJ5IHtcbiAgICBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsICdmb3JFYWNoJywgZm9yRWFjaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgQ29sbGVjdGlvblByb3RvdHlwZS5mb3JFYWNoID0gZm9yRWFjaDtcbiAgfVxufVxuIiwidmFyIHdpbjtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aW4gPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICB3aW4gPSBzZWxmO1xufSBlbHNlIHtcbiAgICB3aW4gPSB7fTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3aW47XG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUICBQVVJFX0lNUE9SVFNfRU5EICovXG52YXIgX2VuYWJsZV9zdXBlcl9ncm9zc19tb2RlX3RoYXRfd2lsbF9jYXVzZV9iYWRfdGhpbmdzID0gZmFsc2U7XG5leHBvcnQgdmFyIGNvbmZpZyA9IHtcbiAgICBQcm9taXNlOiB1bmRlZmluZWQsXG4gICAgc2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSAvKkBfX1BVUkVfXyovIG5ldyBFcnJvcigpO1xuICAgICAgICAgICAgLypAX19QVVJFX18qLyBjb25zb2xlLndhcm4oJ0RFUFJFQ0FURUQhIFJ4SlMgd2FzIHNldCB0byB1c2UgZGVwcmVjYXRlZCBzeW5jaHJvbm91cyBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBieSBjb2RlIGF0OiBcXG4nICsgZXJyb3Iuc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5ncykge1xuICAgICAgICAgICAgLypAX19QVVJFX18qLyBjb25zb2xlLmxvZygnUnhKUzogQmFjayB0byBhIGJldHRlciBlcnJvciBiZWhhdmlvci4gVGhhbmsgeW91LiA8MycpO1xuICAgICAgICB9XG4gICAgICAgIF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5ncyA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcoKSB7XG4gICAgICAgIHJldHVybiBfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3M7XG4gICAgfSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFwXG4iLCIndXNlIHN0cmljdCc7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1mb3ItZWFjaCcpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogW10uZm9yRWFjaCAhPSBmb3JFYWNoIH0sIHsgZm9yRWFjaDogZm9yRWFjaCB9KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGltcGxlbWVudGF0aW9uO1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5cbi8vIGBUb0xlbmd0aGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2xlbmd0aFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGFyZ3VtZW50ID4gMCA/IG1pbih0b0ludGVnZXIoYXJndW1lbnQpLCAweDFGRkZGRkZGRkZGRkZGKSA6IDA7IC8vIDIgKiogNTMgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIGtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciB0b1N0cmluZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLy8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKHRvU3RyaW5nICE9PSBPYmplY3RQcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJykoT2JqZWN0UHJvdG90eXBlLCAndG9TdHJpbmcnLCB0b1N0cmluZywgeyB1bnNhZmU6IHRydWUgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGRlZmluZUl0ZXJhdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS1pdGVyYXRvcicpO1xudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkgeyB9XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcFxuIiwidmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbi8vIGBUb09iamVjdGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b29iamVjdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KSk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaWU4LWRvbS1kZWZpbmUnKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dyYXBwZWQtd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIG5hdGl2ZU9iamVjdENyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgZ2V0T3duUHJvcGVydHlOYW1lc0V4dGVybmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzLWV4dGVybmFsJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXByb3BlcnR5LWlzLWVudW1lcmFibGUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgSElEREVOID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKSgnaGlkZGVuJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIFNZTUJPTCA9ICdTeW1ib2wnO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoU1lNQk9MKTtcbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZjtcbnZhciBuYXRpdmVEZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyA9IGdldE93blByb3BlcnR5TmFtZXNFeHRlcm5hbC5mO1xudmFyICRTeW1ib2wgPSBnbG9iYWwuU3ltYm9sO1xudmFyIEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBuYXRpdmVKU09OU3RyaW5naWZ5ID0gSlNPTiAmJiBKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBUT19QUklNSVRJVkUgPSB3ZWxsS25vd25TeW1ib2woJ3RvUHJpbWl0aXZlJyk7XG52YXIgbmF0aXZlUHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIFdlbGxLbm93blN5bWJvbHNTdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgUU9iamVjdCA9IGdsb2JhbC5RT2JqZWN0O1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgVVNFX1NFVFRFUiA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2NyaXB0b3IgPSBERVNDUklQVE9SUyAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RDcmVhdGUobmF0aXZlRGVmaW5lUHJvcGVydHkoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0UHJvdG90eXBlLCBrZXkpO1xuICBpZiAoT2JqZWN0UHJvdG90eXBlRGVzY3JpcHRvcikgZGVsZXRlIE9iamVjdFByb3RvdHlwZVtrZXldO1xuICBuYXRpdmVEZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKTtcbiAgaWYgKE9iamVjdFByb3RvdHlwZURlc2NyaXB0b3IgJiYgaXQgIT09IE9iamVjdFByb3RvdHlwZSkge1xuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KE9iamVjdFByb3RvdHlwZSwga2V5LCBPYmplY3RQcm90b3R5cGVEZXNjcmlwdG9yKTtcbiAgfVxufSA6IG5hdGl2ZURlZmluZVByb3BlcnR5O1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uICh0YWcsIGRlc2NyaXB0aW9uKSB7XG4gIHZhciBzeW1ib2wgPSBBbGxTeW1ib2xzW3RhZ10gPSBuYXRpdmVPYmplY3RDcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc2V0SW50ZXJuYWxTdGF0ZShzeW1ib2wsIHtcbiAgICB0eXBlOiBTWU1CT0wsXG4gICAgdGFnOiB0YWcsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXG4gIH0pO1xuICBpZiAoIURFU0NSSVBUT1JTKSBzeW1ib2wuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgcmV0dXJuIHN5bWJvbDtcbn07XG5cbnZhciBpc1N5bWJvbCA9IE5BVElWRV9TWU1CT0wgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIE9iamVjdChpdCkgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90b3R5cGUpICRkZWZpbmVQcm9wZXJ0eShPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoaXQsIEhJRERFTikpIG5hdGl2ZURlZmluZVByb3BlcnR5KGl0LCBISURERU4sIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IG5hdGl2ZU9iamVjdENyZWF0ZShELCB7IGVudW1lcmFibGU6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzY3JpcHRvcihpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gbmF0aXZlRGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCk7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JbmRleGVkT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gbmF0aXZlT2JqZWN0Q3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKG5hdGl2ZU9iamVjdENyZWF0ZShpdCksIFApO1xufTtcblxudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90b3R5cGUgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPYmplY3RQcm90b3R5cGVTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSB0b0luZGV4ZWRPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvdHlwZSAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9iamVjdFByb3RvdHlwZVN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcblxudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICB2YXIgbmFtZXMgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAhaGFzKGhpZGRlbktleXMsIGtleSkpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90b3R5cGU7XG4gIHZhciBuYW1lcyA9IG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMoSVNfT1AgPyBPYmplY3RQcm90b3R5cGVTeW1ib2xzIDogdG9JbmRleGVkT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmIChoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvdHlwZSwga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBgU3ltYm9sYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLWNvbnN0cnVjdG9yXG5pZiAoIU5BVElWRV9TWU1CT0wpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdHJpbmcoYXJndW1lbnRzWzBdKTtcbiAgICB2YXIgdGFnID0gdWlkKGRlc2NyaXB0aW9uKTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG90eXBlKSBzZXR0ZXIuY2FsbChPYmplY3RQcm90b3R5cGVTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZiAoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2NyaXB0b3IodGhpcywgdGFnLCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBVU0VfU0VUVEVSKSBzZXRTeW1ib2xEZXNjcmlwdG9yKE9iamVjdFByb3RvdHlwZSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiBzZXR0ZXIgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnLCBkZXNjcmlwdGlvbik7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykudGFnO1xuICB9KTtcblxuICBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mID0gJGRlZmluZVByb3BlcnR5O1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gIHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1uYW1lcycpLmYgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzRXh0ZXJuYWwuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLVN5bWJvbC1kZXNjcmlwdGlvblxuICAgIG5hdGl2ZURlZmluZVByb3BlcnR5KCRTeW1ib2xbUFJPVE9UWVBFXSwgJ2Rlc2NyaXB0aW9uJywge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGdldEludGVybmFsU3RhdGUodGhpcykuZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFJU19QVVJFKSB7XG4gICAgICByZWRlZmluZShPYmplY3RQcm90b3R5cGUsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgeyB1bnNhZmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlZFdlbGxLbm93blN5bWJvbE1vZHVsZS5mID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gd3JhcCh3ZWxsS25vd25TeW1ib2wobmFtZSksIG5hbWUpO1xuICB9O1xufVxuXG4kZXhwb3J0KHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhTkFUSVZFX1NZTUJPTCB9LCB7IFN5bWJvbDogJFN5bWJvbCB9KTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9IG9iamVjdEtleXMoV2VsbEtub3duU3ltYm9sc1N0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHtcbiAgZGVmaW5lV2VsbEtub3duU3ltYm9sKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG59XG5cbiRleHBvcnQoeyB0YXJnZXQ6IFNZTUJPTCwgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB9LCB7XG4gIC8vIGBTeW1ib2wuZm9yYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmZvclxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyBgU3ltYm9sLmtleUZvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5rZXlmb3JcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2wnKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gU3ltYm9sUmVnaXN0cnkpIGlmIChTeW1ib2xSZWdpc3RyeVtrZXldID09PSBzeW0pIHJldHVybiBrZXk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24gKCkgeyBVU0VfU0VUVEVSID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IFVTRV9TRVRURVIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MLCBzaGFtOiAhREVTQ1JJUFRPUlMgfSwge1xuICAvLyBgT2JqZWN0LmNyZWF0ZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyBgT2JqZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmRlZmluZXByb3BlcnR5XG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIGBPYmplY3QuZGVmaW5lUHJvcGVydGllc2AgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyBgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRvd25wcm9wZXJ0eWRlc2NyaXB0b3JzXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvclxufSk7XG5cbiRleHBvcnQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFOQVRJVkVfU1lNQk9MIH0sIHtcbiAgLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5bmFtZXNcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5c3ltYm9sc1xuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyBgSlNPTi5zdHJpbmdpZnlgIG1ldGhvZCBiZWhhdmlvciB3aXRoIHN5bWJvbHNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24uc3RyaW5naWZ5XG5KU09OICYmICRleHBvcnQoeyB0YXJnZXQ6ICdKU09OJywgc3RhdDogdHJ1ZSwgZm9yY2VkOiAhTkFUSVZFX1NZTUJPTCB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBzeW1ib2wgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIHJldHVybiBuYXRpdmVKU09OU3RyaW5naWZ5KFtzeW1ib2xdKSAhPSAnW251bGxdJ1xuICAgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAgIHx8IG5hdGl2ZUpTT05TdHJpbmdpZnkoeyBhOiBzeW1ib2wgfSkgIT0gJ3t9J1xuICAgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gICAgfHwgbmF0aXZlSlNPTlN0cmluZ2lmeShPYmplY3Qoc3ltYm9sKSkgIT0gJ3t9Jztcbn0pIH0sIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBuYXRpdmVKU09OU3RyaW5naWZ5LmFwcGx5KEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gYFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnByb3RvdHlwZS1AQHRvcHJpbWl0aXZlXG5pZiAoISRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdKSBoaWRlKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyBgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXWAgcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZ1xuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgU1lNQk9MKTtcblxuaGlkZGVuS2V5c1tISURERU5dID0gdHJ1ZTtcbiIsIi8vIGBTeW1ib2wucHJvdG90eXBlLmRlc2NyaXB0aW9uYCBnZXR0ZXJcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5wcm90b3R5cGUuZGVzY3JpcHRpb25cbid1c2Ugc3RyaWN0JztcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcHktY29uc3RydWN0b3ItcHJvcGVydGllcycpO1xudmFyIE5hdGl2ZVN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5TeW1ib2w7XG5cbmlmIChERVNDUklQVE9SUyAmJiB0eXBlb2YgTmF0aXZlU3ltYm9sID09ICdmdW5jdGlvbicgJiYgKCEoJ2Rlc2NyaXB0aW9uJyBpbiBOYXRpdmVTeW1ib2wucHJvdG90eXBlKSB8fFxuICAvLyBTYWZhcmkgMTIgYnVnXG4gIE5hdGl2ZVN5bWJvbCgpLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWRcbikpIHtcbiAgdmFyIEVtcHR5U3RyaW5nRGVzY3JpcHRpb25TdG9yZSA9IHt9O1xuICAvLyB3cmFwIFN5bWJvbCBjb25zdHJ1Y3RvciBmb3IgY29ycmVjdCB3b3JrIHdpdGggdW5kZWZpbmVkIGRlc2NyaXB0aW9uXG4gIHZhciBTeW1ib2xXcmFwcGVyID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIHZhciBkZXNjcmlwdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPCAxIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RyaW5nKGFyZ3VtZW50c1swXSk7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMgaW5zdGFuY2VvZiBTeW1ib2xXcmFwcGVyXG4gICAgICA/IG5ldyBOYXRpdmVTeW1ib2woZGVzY3JpcHRpb24pXG4gICAgICAvLyBpbiBFZGdlIDEzLCBTdHJpbmcoU3ltYm9sKHVuZGVmaW5lZCkpID09PSAnU3ltYm9sKHVuZGVmaW5lZCknXG4gICAgICA6IGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyBOYXRpdmVTeW1ib2woKSA6IE5hdGl2ZVN5bWJvbChkZXNjcmlwdGlvbik7XG4gICAgaWYgKGRlc2NyaXB0aW9uID09PSAnJykgRW1wdHlTdHJpbmdEZXNjcmlwdGlvblN0b3JlW3Jlc3VsdF0gPSB0cnVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMoU3ltYm9sV3JhcHBlciwgTmF0aXZlU3ltYm9sKTtcbiAgdmFyIHN5bWJvbFByb3RvdHlwZSA9IFN5bWJvbFdyYXBwZXIucHJvdG90eXBlID0gTmF0aXZlU3ltYm9sLnByb3RvdHlwZTtcbiAgc3ltYm9sUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ltYm9sV3JhcHBlcjtcblxuICB2YXIgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBuYXRpdmUgPSBTdHJpbmcoTmF0aXZlU3ltYm9sKCd0ZXN0JykpID09ICdTeW1ib2wodGVzdCknO1xuICB2YXIgcmVnZXhwID0gL15TeW1ib2xcXCgoLiopXFwpW14pXSskLztcbiAgZGVmaW5lUHJvcGVydHkoc3ltYm9sUHJvdG90eXBlLCAnZGVzY3JpcHRpb24nLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZGVzY3JpcHRpb24oKSB7XG4gICAgICB2YXIgc3ltYm9sID0gaXNPYmplY3QodGhpcykgPyB0aGlzLnZhbHVlT2YoKSA6IHRoaXM7XG4gICAgICB2YXIgc3RyaW5nID0gc3ltYm9sVG9TdHJpbmcuY2FsbChzeW1ib2wpO1xuICAgICAgaWYgKGhhcyhFbXB0eVN0cmluZ0Rlc2NyaXB0aW9uU3RvcmUsIHN5bWJvbCkpIHJldHVybiAnJztcbiAgICAgIHZhciBkZXNjID0gbmF0aXZlID8gc3RyaW5nLnNsaWNlKDcsIC0xKSA6IHN0cmluZy5yZXBsYWNlKHJlZ2V4cCwgJyQxJyk7XG4gICAgICByZXR1cm4gZGVzYyA9PT0gJycgPyB1bmRlZmluZWQgOiBkZXNjO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgZ2xvYmFsOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwgeyBTeW1ib2w6IFN5bWJvbFdyYXBwZXIgfSk7XG59XG4iLCJ2YXIgRE9NSXRlcmFibGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvbS1pdGVyYWJsZXMnKTtcbnZhciBBcnJheUl0ZXJhdG9yTWV0aG9kcyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JNZXRob2RzLnZhbHVlcztcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdO1xuICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGhpZGUoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgaGlkZShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZXhwb3J0IHZhciBvYnNlcnZhYmxlID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9ic2VydmFibGUuanMubWFwXG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGFycmF5U3BlY2llc0NyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1zcGVjaWVzLWNyZWF0ZScpO1xudmFyIElTX0NPTkNBVF9TUFJFQURBQkxFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ2lzQ29uY2F0U3ByZWFkYWJsZScpO1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSAweDFGRkZGRkZGRkZGRkZGO1xudmFyIE1BWElNVU1fQUxMT1dFRF9JTkRFWF9FWENFRURFRCA9ICdNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWQnO1xuXG52YXIgSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCA9ICFyZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnJheSA9IFtdO1xuICBhcnJheVtJU19DT05DQVRfU1BSRUFEQUJMRV0gPSBmYWxzZTtcbiAgcmV0dXJuIGFycmF5LmNvbmNhdCgpWzBdICE9PSBhcnJheTtcbn0pO1xuXG52YXIgU1BFQ0lFU19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0JykoJ2NvbmNhdCcpO1xuXG52YXIgaXNDb25jYXRTcHJlYWRhYmxlID0gZnVuY3Rpb24gKE8pIHtcbiAgaWYgKCFpc09iamVjdChPKSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgc3ByZWFkYWJsZSA9IE9bSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICByZXR1cm4gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShPKTtcbn07XG5cbnZhciBGT1JDRUQgPSAhSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVCB8fCAhU1BFQ0lFU19TVVBQT1JUO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuY29uY2F0XG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAaXNDb25jYXRTcHJlYWRhYmxlIGFuZCBAQHNwZWNpZXNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogRk9SQ0VEIH0sIHtcbiAgY29uY2F0OiBmdW5jdGlvbiBjb25jYXQoYXJnKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIHZhciBuID0gMDtcbiAgICB2YXIgaSwgaywgbGVuZ3RoLCBsZW4sIEU7XG4gICAgZm9yIChpID0gLTEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgRSA9IGkgPT09IC0xID8gTyA6IGFyZ3VtZW50c1tpXTtcbiAgICAgIGlmIChpc0NvbmNhdFNwcmVhZGFibGUoRSkpIHtcbiAgICAgICAgbGVuID0gdG9MZW5ndGgoRS5sZW5ndGgpO1xuICAgICAgICBpZiAobiArIGxlbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHRocm93IFR5cGVFcnJvcihNQVhJTVVNX0FMTE9XRURfSU5ERVhfRVhDRUVERUQpO1xuICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyssIG4rKykgaWYgKGsgaW4gRSkgY3JlYXRlUHJvcGVydHkoQSwgbiwgRVtrXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA+PSBNQVhfU0FGRV9JTlRFR0VSKSB0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkoQSwgbisrLCBFKTtcbiAgICAgIH1cbiAgICB9XG4gICAgQS5sZW5ndGggPSBuO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcbnZhciBJbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0Jyk7XG52YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIEluZGV4ZWRPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShpdCkpO1xufTtcbiIsIi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3JcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgnaXRlcmF0b3InKTtcbiIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG52YXIgT2JqZWN0UHJvdG90eXBlID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG90eXBlIDogbnVsbDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGl0KSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogT2JqZWN0LmFzc2lnbiAhPT0gYXNzaWduIH0sIHsgYXNzaWduOiBhc3NpZ24gfSk7XG4iLCJ2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cycpO1xudmFyIEZBSUxTX09OX1BSSU1JVElWRVMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKShmdW5jdGlvbiAoKSB7IG5hdGl2ZUtleXMoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmtleXNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIGZvcmNlZDogRkFJTFNfT05fUFJJTUlUSVZFUyB9LCB7XG4gIGtleXM6IGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5cyh0b09iamVjdChpdCkpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG52YXIgU1RSSU5HX0lURVJBVE9SID0gJ1N0cmluZyBJdGVyYXRvcic7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcihTVFJJTkdfSVRFUkFUT1IpO1xuXG4vLyBgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLUBAaXRlcmF0b3JcbmRlZmluZUl0ZXJhdG9yKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBTVFJJTkdfSVRFUkFUT1IsXG4gICAgc3RyaW5nOiBTdHJpbmcoaXRlcmF0ZWQpLFxuICAgIGluZGV4OiAwXG4gIH0pO1xuLy8gYCVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lc3RyaW5naXRlcmF0b3Jwcm90b3R5cGUlLm5leHRcbn0sIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gIHZhciBzdHJpbmcgPSBzdGF0ZS5zdHJpbmc7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4O1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBzdHJpbmcubGVuZ3RoKSByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIHBvaW50ID0gY29kZVBvaW50QXQoc3RyaW5nLCBpbmRleCwgdHJ1ZSk7XG4gIHN0YXRlLmluZGV4ICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsInZhciBNYXAgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2VzLm1hcCcpO1xudmFyIFdlYWtNYXAgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2VzLndlYWstbWFwJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZCcpKCdtZXRhZGF0YScpO1xudmFyIHN0b3JlID0gc2hhcmVkLnN0b3JlIHx8IChzaGFyZWQuc3RvcmUgPSBuZXcgV2Vha01hcCgpKTtcblxudmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSkge1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgaWYgKCF0YXJnZXRNZXRhZGF0YSkge1xuICAgIGlmICghY3JlYXRlKSByZXR1cm47XG4gICAgc3RvcmUuc2V0KHRhcmdldCwgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgTWFwKCkpO1xuICB9XG4gIHZhciBrZXlNZXRhZGF0YSA9IHRhcmdldE1ldGFkYXRhLmdldCh0YXJnZXRLZXkpO1xuICBpZiAoIWtleU1ldGFkYXRhKSB7XG4gICAgaWYgKCFjcmVhdGUpIHJldHVybjtcbiAgICB0YXJnZXRNZXRhZGF0YS5zZXQodGFyZ2V0S2V5LCBrZXlNZXRhZGF0YSA9IG5ldyBNYXAoKSk7XG4gIH0gcmV0dXJuIGtleU1ldGFkYXRhO1xufTtcblxudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpO1xufTtcblxudmFyIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0YWRhdGFNYXAuZ2V0KE1ldGFkYXRhS2V5KTtcbn07XG5cbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgdHJ1ZSkuc2V0KE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlKTtcbn07XG5cbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKHRhcmdldCwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gIHZhciBrZXlzID0gW107XG4gIGlmIChtZXRhZGF0YU1hcCkgbWV0YWRhdGFNYXAuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7IGtleXMucHVzaChrZXkpOyB9KTtcbiAgcmV0dXJuIGtleXM7XG59O1xuXG52YXIgdG9NZXRhZGF0YUtleSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc3RvcmU6IHN0b3JlLFxuICBnZXRNYXA6IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAsXG4gIGhhczogb3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgZ2V0OiBvcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICBzZXQ6IG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gIGtleXM6IG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICB0b0tleTogdG9NZXRhZGF0YUtleVxufTtcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCBmdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZXJyKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHRocm93IGVycjsgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ob3N0UmVwb3J0RXJyb3IuanMubWFwXG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIG9iamVjdEhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcbnZhciBXZWFrTWFwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaGlkZShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsIi8vIGBBcnJheS5pc0FycmF5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmlzYXJyYXlcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSB9LCB7IGlzQXJyYXk6IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpIH0pO1xuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbEl0ZXJhdG9yKCkge1xuICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAnZnVuY3Rpb24nIHx8ICFTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuICdAQGl0ZXJhdG9yJztcbiAgICB9XG4gICAgcmV0dXJuIFN5bWJvbC5pdGVyYXRvcjtcbn1cbmV4cG9ydCB2YXIgaXRlcmF0b3IgPSAvKkBfX1BVUkVfXyovIGdldFN5bWJvbEl0ZXJhdG9yKCk7XG5leHBvcnQgdmFyICQkaXRlcmF0b3IgPSBpdGVyYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWl0ZXJhdG9yLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZnVuY3Rpb24gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsKCkge1xuICAgIEVycm9yLmNhbGwodGhpcyk7XG4gICAgdGhpcy5tZXNzYWdlID0gJ29iamVjdCB1bnN1YnNjcmliZWQnO1xuICAgIHRoaXMubmFtZSA9ICdPYmplY3RVbnN1YnNjcmliZWRFcnJvcic7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5PYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGwucHJvdG90eXBlID0gLypAX19QVVJFX18qLyBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5leHBvcnQgdmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IuanMubWFwXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBoYXNTeW1ib2xTaGFtID0gcmVxdWlyZSgnLi9zaGFtcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKSB7XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2Ygb3JpZ1N5bWJvbCgnZm9vJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCgnYmFyJykgIT09ICdzeW1ib2wnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdHJldHVybiBoYXNTeW1ib2xTaGFtKCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWxzXG5cdFNldCxcblx0TWFwLFxuXHRXZWFrU2V0LFxuXHRXZWFrTWFwLFxuXG5cdFByb21pc2UsXG5cblx0U3ltYm9sLFxuXHRQcm94eSxcblxuXHRBdG9taWNzLFxuXHRTaGFyZWRBcnJheUJ1ZmZlcixcblxuXHRBcnJheUJ1ZmZlcixcblx0RGF0YVZpZXcsXG5cdFVpbnQ4QXJyYXksXG5cdEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5LFxuXHRJbnQ4QXJyYXksXG5cdEludDE2QXJyYXksXG5cdEludDMyQXJyYXksXG5cdFVpbnQ4Q2xhbXBlZEFycmF5LFxuXHRVaW50MTZBcnJheSxcblx0VWludDMyQXJyYXksXG4qL1xuXG52YXIgdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNoYWRvdy1yZXN0cmljdGVkLW5hbWVzXG5cbnZhciBUaHJvd1R5cGVFcnJvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jcblx0PyAoZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICdjYWxsZWUnKS5nZXQ7IH0oKSlcblx0OiBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoKTsgfTtcblxudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnO1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHguX19wcm90b19fOyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cbnZhciBnZW5lcmF0b3I7IC8vID0gZnVuY3Rpb24gKiAoKSB7fTtcbnZhciBnZW5lcmF0b3JGdW5jdGlvbiA9IGdlbmVyYXRvciA/IGdldFByb3RvKGdlbmVyYXRvcikgOiB1bmRlZmluZWQ7XG52YXIgYXN5bmNGbjsgLy8gYXN5bmMgZnVuY3Rpb24oKSB7fTtcbnZhciBhc3luY0Z1bmN0aW9uID0gYXN5bmNGbiA/IGFzeW5jRm4uY29uc3RydWN0b3IgOiB1bmRlZmluZWQ7XG52YXIgYXN5bmNHZW47IC8vIGFzeW5jIGZ1bmN0aW9uICogKCkge307XG52YXIgYXN5bmNHZW5GdW5jdGlvbiA9IGFzeW5jR2VuID8gZ2V0UHJvdG8oYXN5bmNHZW4pIDogdW5kZWZpbmVkO1xudmFyIGFzeW5jR2VuSXRlcmF0b3IgPSBhc3luY0dlbiA/IGFzeW5jR2VuKCkgOiB1bmRlZmluZWQ7XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8oVWludDhBcnJheSk7XG5cbnZhciBJTlRSSU5TSUNTID0ge1xuXHQnJCAlQXJyYXklJzogQXJyYXksXG5cdCckICVBcnJheUJ1ZmZlciUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIsXG5cdCckICVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuXHQnJCAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSA6IHVuZGVmaW5lZCxcblx0JyQgJUFycmF5UHJvdG90eXBlJSc6IEFycmF5LnByb3RvdHlwZSxcblx0JyQgJUFycmF5UHJvdG9fZW50cmllcyUnOiBBcnJheS5wcm90b3R5cGUuZW50cmllcyxcblx0JyQgJUFycmF5UHJvdG9fZm9yRWFjaCUnOiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCxcblx0JyQgJUFycmF5UHJvdG9fa2V5cyUnOiBBcnJheS5wcm90b3R5cGUua2V5cyxcblx0JyQgJUFycmF5UHJvdG9fdmFsdWVzJSc6IEFycmF5LnByb3RvdHlwZS52YWx1ZXMsXG5cdCckICVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlJzogdW5kZWZpbmVkLFxuXHQnJCAlQXN5bmNGdW5jdGlvbiUnOiBhc3luY0Z1bmN0aW9uLFxuXHQnJCAlQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiBhc3luY0Z1bmN0aW9uID8gYXN5bmNGdW5jdGlvbi5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVBc3luY0dlbmVyYXRvciUnOiBhc3luY0dlbiA/IGdldFByb3RvKGFzeW5jR2VuSXRlcmF0b3IpIDogdW5kZWZpbmVkLFxuXHQnJCAlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBhc3luY0dlbkZ1bmN0aW9uLFxuXHQnJCAlQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogYXN5bmNHZW5GdW5jdGlvbiA/IGFzeW5jR2VuRnVuY3Rpb24ucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuXHQnJCAlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBhc3luY0dlbkl0ZXJhdG9yICYmIGhhc1N5bWJvbHMgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgPyBhc3luY0dlbkl0ZXJhdG9yW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIDogdW5kZWZpbmVkLFxuXHQnJCAlQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJCAlQm9vbGVhbiUnOiBCb29sZWFuLFxuXHQnJCAlQm9vbGVhblByb3RvdHlwZSUnOiBCb29sZWFuLnByb3RvdHlwZSxcblx0JyQgJURhdGFWaWV3JSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldyxcblx0JyQgJURhdGFWaWV3UHJvdG90eXBlJSc6IHR5cGVvZiBEYXRhVmlldyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBEYXRhVmlldy5wcm90b3R5cGUsXG5cdCckICVEYXRlJSc6IERhdGUsXG5cdCckICVEYXRlUHJvdG90eXBlJSc6IERhdGUucHJvdG90eXBlLFxuXHQnJCAlZGVjb2RlVVJJJSc6IGRlY29kZVVSSSxcblx0JyQgJWRlY29kZVVSSUNvbXBvbmVudCUnOiBkZWNvZGVVUklDb21wb25lbnQsXG5cdCckICVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJCAlZW5jb2RlVVJJQ29tcG9uZW50JSc6IGVuY29kZVVSSUNvbXBvbmVudCxcblx0JyQgJUVycm9yJSc6IEVycm9yLFxuXHQnJCAlRXJyb3JQcm90b3R5cGUlJzogRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyQgJUV2YWxFcnJvciUnOiBFdmFsRXJyb3IsXG5cdCckICVFdmFsRXJyb3JQcm90b3R5cGUlJzogRXZhbEVycm9yLnByb3RvdHlwZSxcblx0JyQgJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyQgJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheS5wcm90b3R5cGUsXG5cdCckICVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCckICVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXkucHJvdG90eXBlLFxuXHQnJCAlRnVuY3Rpb24lJzogRnVuY3Rpb24sXG5cdCckICVGdW5jdGlvblByb3RvdHlwZSUnOiBGdW5jdGlvbi5wcm90b3R5cGUsXG5cdCckICVHZW5lcmF0b3IlJzogZ2VuZXJhdG9yID8gZ2V0UHJvdG8oZ2VuZXJhdG9yKCkpIDogdW5kZWZpbmVkLFxuXHQnJCAlR2VuZXJhdG9yRnVuY3Rpb24lJzogZ2VuZXJhdG9yRnVuY3Rpb24sXG5cdCckICVHZW5lcmF0b3JQcm90b3R5cGUlJzogZ2VuZXJhdG9yRnVuY3Rpb24gPyBnZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG5cdCckICVJbnQ4QXJyYXklJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXksXG5cdCckICVJbnQ4QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIEludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXkucHJvdG90eXBlLFxuXHQnJCAlSW50MTZBcnJheSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQxNkFycmF5LFxuXHQnJCAlSW50MTZBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50MTZBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQ4QXJyYXkucHJvdG90eXBlLFxuXHQnJCAlSW50MzJBcnJheSUnOiB0eXBlb2YgSW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQzMkFycmF5LFxuXHQnJCAlSW50MzJBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgSW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBJbnQzMkFycmF5LnByb3RvdHlwZSxcblx0JyQgJWlzRmluaXRlJSc6IGlzRmluaXRlLFxuXHQnJCAlaXNOYU4lJzogaXNOYU4sXG5cdCckICVJdGVyYXRvclByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gZ2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkgOiB1bmRlZmluZWQsXG5cdCckICVKU09OJSc6IEpTT04sXG5cdCckICVKU09OUGFyc2UlJzogSlNPTi5wYXJzZSxcblx0JyQgJU1hcCUnOiB0eXBlb2YgTWFwID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IE1hcCxcblx0JyQgJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBNYXAgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCckICVNYXBQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAucHJvdG90eXBlLFxuXHQnJCAlTWF0aCUnOiBNYXRoLFxuXHQnJCAlTnVtYmVyJSc6IE51bWJlcixcblx0JyQgJU51bWJlclByb3RvdHlwZSUnOiBOdW1iZXIucHJvdG90eXBlLFxuXHQnJCAlT2JqZWN0JSc6IE9iamVjdCxcblx0JyQgJU9iamVjdFByb3RvdHlwZSUnOiBPYmplY3QucHJvdG90eXBlLFxuXHQnJCAlT2JqUHJvdG9fdG9TdHJpbmclJzogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxcblx0JyQgJU9ialByb3RvX3ZhbHVlT2YlJzogT2JqZWN0LnByb3RvdHlwZS52YWx1ZU9mLFxuXHQnJCAlcGFyc2VGbG9hdCUnOiBwYXJzZUZsb2F0LFxuXHQnJCAlcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCckICVQcm9taXNlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UsXG5cdCckICVQcm9taXNlUHJvdG90eXBlJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UucHJvdG90eXBlLFxuXHQnJCAlUHJvbWlzZVByb3RvX3RoZW4lJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5wcm90b3R5cGUudGhlbixcblx0JyQgJVByb21pc2VfYWxsJSc6IHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb21pc2UuYWxsLFxuXHQnJCAlUHJvbWlzZV9yZWplY3QlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5yZWplY3QsXG5cdCckICVQcm9taXNlX3Jlc29sdmUlJzogdHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogUHJvbWlzZS5yZXNvbHZlLFxuXHQnJCAlUHJveHklJzogdHlwZW9mIFByb3h5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFByb3h5LFxuXHQnJCAlUmFuZ2VFcnJvciUnOiBSYW5nZUVycm9yLFxuXHQnJCAlUmFuZ2VFcnJvclByb3RvdHlwZSUnOiBSYW5nZUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVJlZmVyZW5jZUVycm9yJSc6IFJlZmVyZW5jZUVycm9yLFxuXHQnJCAlUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogUmVmZXJlbmNlRXJyb3IucHJvdG90eXBlLFxuXHQnJCAlUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJCAlUmVnRXhwJSc6IFJlZ0V4cCxcblx0JyQgJVJlZ0V4cFByb3RvdHlwZSUnOiBSZWdFeHAucHJvdG90eXBlLFxuXHQnJCAlU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJCAlU2V0SXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIFNldCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgPyB1bmRlZmluZWQgOiBnZXRQcm90byhuZXcgU2V0KClbU3ltYm9sLml0ZXJhdG9yXSgpKSxcblx0JyQgJVNldFByb3RvdHlwZSUnOiB0eXBlb2YgU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFNldC5wcm90b3R5cGUsXG5cdCckICVTaGFyZWRBcnJheUJ1ZmZlciUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIsXG5cdCckICVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2hhcmVkQXJyYXlCdWZmZXIucHJvdG90eXBlLFxuXHQnJCAlU3RyaW5nJSc6IFN0cmluZyxcblx0JyQgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJCAlU3RyaW5nUHJvdG90eXBlJSc6IFN0cmluZy5wcm90b3R5cGUsXG5cdCckICVTeW1ib2wlJzogaGFzU3ltYm9scyA/IFN5bWJvbCA6IHVuZGVmaW5lZCxcblx0JyQgJVN5bWJvbFByb3RvdHlwZSUnOiBoYXNTeW1ib2xzID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJVN5bnRheEVycm9yJSc6IFN5bnRheEVycm9yLFxuXHQnJCAlU3ludGF4RXJyb3JQcm90b3R5cGUlJzogU3ludGF4RXJyb3IucHJvdG90eXBlLFxuXHQnJCAlVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG5cdCckICVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCckICVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXkgPyBUeXBlZEFycmF5LnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcblx0JyQgJVR5cGVFcnJvciUnOiBUeXBlRXJyb3IsXG5cdCckICVUeXBlRXJyb3JQcm90b3R5cGUlJzogVHlwZUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVVpbnQ4QXJyYXklJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheSxcblx0JyQgJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhBcnJheS5wcm90b3R5cGUsXG5cdCckICVVaW50OENsYW1wZWRBcnJheSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXksXG5cdCckICVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDhDbGFtcGVkQXJyYXkucHJvdG90eXBlLFxuXHQnJCAlVWludDE2QXJyYXklJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LFxuXHQnJCAlVWludDE2QXJyYXlQcm90b3R5cGUlJzogdHlwZW9mIFVpbnQxNkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQxNkFycmF5LnByb3RvdHlwZSxcblx0JyQgJVVpbnQzMkFycmF5JSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheSxcblx0JyQgJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50MzJBcnJheS5wcm90b3R5cGUsXG5cdCckICVVUklFcnJvciUnOiBVUklFcnJvcixcblx0JyQgJVVSSUVycm9yUHJvdG90eXBlJSc6IFVSSUVycm9yLnByb3RvdHlwZSxcblx0JyQgJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyQgJVdlYWtNYXBQcm90b3R5cGUlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcC5wcm90b3R5cGUsXG5cdCckICVXZWFrU2V0JSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQsXG5cdCckICVXZWFrU2V0UHJvdG90eXBlJSc6IHR5cGVvZiBXZWFrU2V0ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtTZXQucHJvdG90eXBlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHR5cGVvZiBhbGxvd01pc3NpbmcgIT09ICdib29sZWFuJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYWxsb3dNaXNzaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXG5cdHZhciBrZXkgPSAnJCAnICsgbmFtZTtcblx0aWYgKCEoa2V5IGluIElOVFJJTlNJQ1MpKSB7XG5cdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xuXHR9XG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGlmIC8vIGhvcGVmdWxseSB0aGlzIGlzIGltcG9zc2libGUgdG8gdGVzdCA6LSlcblx0aWYgKHR5cGVvZiBJTlRSSU5TSUNTW2tleV0gPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHR9XG5cdHJldHVybiBJTlRSSU5TSUNTW2tleV07XG59O1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3RvU3RyaW5nVGFnJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBUQUcsIFNUQVRJQykge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IFNUQVRJQyA/IGl0IDogaXQucHJvdG90eXBlLCBUT19TVFJJTkdfVEFHKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGl0LCBUT19TVFJJTkdfVEFHLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IFRBRyB9KTtcbiAgfVxufTtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGRlZmluZVByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcykge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoTyAhPT0gbnVsbCkge1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHkoKTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKVtJRV9QUk9UT10gPSB0cnVlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXkoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzRnVuY3Rpb24uanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIHRzbGliLF9PYnNlcnZhYmxlLF9TdWJzY3JpYmVyLF9TdWJzY3JpcHRpb24sX3V0aWxfT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IsX1N1YmplY3RTdWJzY3JpcHRpb24sX2ludGVybmFsX3N5bWJvbF9yeFN1YnNjcmliZXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4vU3Vic2NyaWJlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBPYmplY3RVbnN1YnNjcmliZWRFcnJvciB9IGZyb20gJy4vdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvcic7XG5pbXBvcnQgeyBTdWJqZWN0U3Vic2NyaXB0aW9uIH0gZnJvbSAnLi9TdWJqZWN0U3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHJ4U3Vic2NyaWJlciBhcyByeFN1YnNjcmliZXJTeW1ib2wgfSBmcm9tICcuLi9pbnRlcm5hbC9zeW1ib2wvcnhTdWJzY3JpYmVyJztcbnZhciBTdWJqZWN0U3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhTdWJqZWN0U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTdWJqZWN0U3Vic2NyaWJlcihkZXN0aW5hdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICByZXR1cm4gU3ViamVjdFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcbmV4cG9ydCB7IFN1YmplY3RTdWJzY3JpYmVyIH07XG52YXIgU3ViamVjdCA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhTdWJqZWN0LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN1YmplY3QoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9ic2VydmVycyA9IFtdO1xuICAgICAgICBfdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIF90aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnRocm93bkVycm9yID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBTdWJqZWN0LnByb3RvdHlwZVtyeFN1YnNjcmliZXJTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFN1YmplY3RTdWJzY3JpYmVyKHRoaXMpO1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uIChvcGVyYXRvcikge1xuICAgICAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpO1xuICAgICAgICBzdWJqZWN0Lm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgICAgIHJldHVybiBzdWJqZWN0O1xuICAgIH07XG4gICAgU3ViamVjdC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgICAgIHZhciBvYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVycztcbiAgICAgICAgICAgIHZhciBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb3B5W2ldLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aHJvd25FcnJvciA9IGVycjtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIHZhciBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoO1xuICAgICAgICB2YXIgY29weSA9IG9ic2VydmVycy5zbGljZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb3B5W2ldLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDtcbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IHRoaXMub2JzZXJ2ZXJzO1xuICAgICAgICB2YXIgbGVuID0gb2JzZXJ2ZXJzLmxlbmd0aDtcbiAgICAgICAgdmFyIGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29weVtpXS5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gbnVsbDtcbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsIHN1YnNjcmliZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdWJqZWN0LnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRoaXMudGhyb3duRXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFN1YmplY3RTdWJzY3JpcHRpb24odGhpcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFN1YmplY3QucHJvdG90eXBlLmFzT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgICAgICBvYnNlcnZhYmxlLnNvdXJjZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgIH07XG4gICAgU3ViamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAoZGVzdGluYXRpb24sIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFub255bW91c1N1YmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSk7XG4gICAgfTtcbiAgICByZXR1cm4gU3ViamVjdDtcbn0oT2JzZXJ2YWJsZSkpO1xuZXhwb3J0IHsgU3ViamVjdCB9O1xudmFyIEFub255bW91c1N1YmplY3QgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQW5vbnltb3VzU3ViamVjdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgICAgX3RoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFub255bW91c1N1YmplY3QucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLm5leHQpIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBbm9ueW1vdXNTdWJqZWN0LnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEFub255bW91c1N1YmplY3QucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uY29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQW5vbnltb3VzU3ViamVjdC5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdWJzY3JpcHRpb24uRU1QVFk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBBbm9ueW1vdXNTdWJqZWN0O1xufShTdWJqZWN0KSk7XG5leHBvcnQgeyBBbm9ueW1vdXNTdWJqZWN0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdWJqZWN0LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZXhwb3J0IHZhciByeFN1YnNjcmliZXIgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nXG4gICAgPyAvKkBfX1BVUkVfXyovIFN5bWJvbCgncnhTdWJzY3JpYmVyJylcbiAgICA6ICdAQHJ4U3Vic2NyaWJlcl8nICsgLypAX19QVVJFX18qLyBNYXRoLnJhbmRvbSgpO1xuZXhwb3J0IHZhciAkJHJ4U3Vic2NyaWJlciA9IHJ4U3Vic2NyaWJlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ4U3Vic2NyaWJlci5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX09ic2VydmFibGUsX1N1YnNjcmlwdGlvbixfdXRpbF9zdWJzY3JpYmVUb0FycmF5IFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuLi9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBzdWJzY3JpYmVUb0FycmF5IH0gZnJvbSAnLi4vdXRpbC9zdWJzY3JpYmVUb0FycmF5JztcbmV4cG9ydCBmdW5jdGlvbiBmcm9tQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikge1xuICAgIGlmICghc2NoZWR1bGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVUb0FycmF5KGlucHV0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgICAgIHZhciBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2krK10pO1xuICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLmFkZCh0aGlzLnNjaGVkdWxlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBzdWI7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21BcnJheS5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdG9yaWVzT2ZcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ByZXZpZXcuc3Rvcmllc09mO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNldEFkZG9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wcmV2aWV3LnNldEFkZG9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFkZERlY29yYXRvclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcHJldmlldy5hZGREZWNvcmF0b3I7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYWRkUGFyYW1ldGVyc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcHJldmlldy5hZGRQYXJhbWV0ZXJzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbmZpZ3VyZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcHJldmlldy5jb25maWd1cmU7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0U3Rvcnlib29rXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wcmV2aWV3LmdldFN0b3J5Ym9vaztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJmb3JjZVJlUmVuZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wcmV2aWV3LmZvcmNlUmVSZW5kZXI7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmF3XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wcmV2aWV3LnJhdztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb2R1bGVNZXRhZGF0YVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfZGVjb3JhdG9ycy5tb2R1bGVNZXRhZGF0YTtcbiAgfVxufSk7XG5cbnZhciBfcHJldmlldyA9IHJlcXVpcmUoXCIuL3ByZXZpZXdcIik7XG5cbnZhciBfZGVjb3JhdG9ycyA9IHJlcXVpcmUoXCIuL3ByZXZpZXcvYW5ndWxhci9kZWNvcmF0b3JzXCIpO1xuXG5pZiAobW9kdWxlICYmIG1vZHVsZS5ob3QgJiYgbW9kdWxlLmhvdC5kZWNsaW5lKSB7XG4gIG1vZHVsZS5ob3QuZGVjbGluZSgpO1xufSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZXMyMDE2Jyk7XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IHNldEdsb2JhbChTSEFSRUQsIHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246ICczLjAuMScsXG4gIG1vZGU6IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gaW50ZXJuYWxPYmplY3RLZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXRcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubG9nZ2VyID0gdm9pZCAwO1xudmFyIF9nbG9iYWwgPSBnbG9iYWwsXG4gICAgY29uc29sZSA9IF9nbG9iYWwuY29uc29sZTtcbi8qIHRzbGludDpkaXNhYmxlOiBuby1jb25zb2xlICovXG5cbnZhciBsb2dnZXIgPSB7XG4gIGRlYnVnOiBmdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgcmVzdFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnNvbGUuZGVidWcuYXBwbHkoY29uc29sZSwgW21lc3NhZ2VdLmNvbmNhdChyZXN0KSk7XG4gIH0sXG4gIGxvZzogZnVuY3Rpb24gbG9nKG1lc3NhZ2UpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgcmVzdFtfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgW21lc3NhZ2VdLmNvbmNhdChyZXN0KSk7XG4gIH0sXG4gIGluZm86IGZ1bmN0aW9uIGluZm8obWVzc2FnZSkge1xuICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuMyA+IDEgPyBfbGVuMyAtIDEgOiAwKSwgX2tleTMgPSAxOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICByZXN0W19rZXkzIC0gMV0gPSBhcmd1bWVudHNbX2tleTNdO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xlLmluZm8uYXBwbHkoY29uc29sZSwgW21lc3NhZ2VdLmNvbmNhdChyZXN0KSk7XG4gIH0sXG4gIHdhcm46IGZ1bmN0aW9uIHdhcm4obWVzc2FnZSkge1xuICAgIGZvciAodmFyIF9sZW40ID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuNCA+IDEgPyBfbGVuNCAtIDEgOiAwKSwgX2tleTQgPSAxOyBfa2V5NCA8IF9sZW40OyBfa2V5NCsrKSB7XG4gICAgICByZXN0W19rZXk0IC0gMV0gPSBhcmd1bWVudHNbX2tleTRdO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgW21lc3NhZ2VdLmNvbmNhdChyZXN0KSk7XG4gIH0sXG4gIGVycm9yOiBmdW5jdGlvbiBlcnJvcihtZXNzYWdlKSB7XG4gICAgZm9yICh2YXIgX2xlbjUgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW41ID4gMSA/IF9sZW41IC0gMSA6IDApLCBfa2V5NSA9IDE7IF9rZXk1IDwgX2xlbjU7IF9rZXk1KyspIHtcbiAgICAgIHJlc3RbX2tleTUgLSAxXSA9IGFyZ3VtZW50c1tfa2V5NV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgW21lc3NhZ2VdLmNvbmNhdChyZXN0KSk7XG4gIH1cbn07XG5leHBvcnRzLmxvZ2dlciA9IGxvZ2dlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TVE9SWV9USFJFV19FWENFUFRJT04gPSBleHBvcnRzLlNUT1JZX0NIQU5HRUQgPSBleHBvcnRzLlNUT1JZX0VSUk9SRUQgPSBleHBvcnRzLlNUT1JZX01JU1NJTkcgPSBleHBvcnRzLlNUT1JZX1JFTkRFUkVEID0gZXhwb3J0cy5TVE9SWV9SRU5ERVIgPSBleHBvcnRzLlNUT1JZX0FEREVEID0gZXhwb3J0cy5TVE9SWV9JTklUID0gZXhwb3J0cy5SRUdJU1RFUl9TVUJTQ1JJUFRJT04gPSBleHBvcnRzLkZPUkNFX1JFX1JFTkRFUiA9IGV4cG9ydHMuUFJFVklFV19LRVlET1dOID0gZXhwb3J0cy5TRUxFQ1RfU1RPUlkgPSBleHBvcnRzLlNUT1JJRVNfQ09ORklHVVJFRCA9IGV4cG9ydHMuU0VUX1NUT1JJRVMgPSBleHBvcnRzLkdFVF9TVE9SSUVTID0gZXhwb3J0cy5TRVRfQ1VSUkVOVF9TVE9SWSA9IGV4cG9ydHMuR0VUX0NVUlJFTlRfU1RPUlkgPSBleHBvcnRzLkNIQU5ORUxfQ1JFQVRFRCA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xudmFyIGV2ZW50czsgLy8gRW5hYmxlczogYGltcG9ydCBFdmVudHMgZnJvbSAuLi5gXG5cbihmdW5jdGlvbiAoZXZlbnRzKSB7XG4gIGV2ZW50c1tcIkNIQU5ORUxfQ1JFQVRFRFwiXSA9IFwiY2hhbm5lbENyZWF0ZWRcIjtcbiAgZXZlbnRzW1wiR0VUX0NVUlJFTlRfU1RPUllcIl0gPSBcImdldEN1cnJlbnRTdG9yeVwiO1xuICBldmVudHNbXCJTRVRfQ1VSUkVOVF9TVE9SWVwiXSA9IFwic2V0Q3VycmVudFN0b3J5XCI7XG4gIGV2ZW50c1tcIkdFVF9TVE9SSUVTXCJdID0gXCJnZXRTdG9yaWVzXCI7XG4gIGV2ZW50c1tcIlNFVF9TVE9SSUVTXCJdID0gXCJzZXRTdG9yaWVzXCI7XG4gIGV2ZW50c1tcIlNUT1JJRVNfQ09ORklHVVJFRFwiXSA9IFwic3Rvcmllc0NvbmZpZ3VyZWRcIjtcbiAgZXZlbnRzW1wiU0VMRUNUX1NUT1JZXCJdID0gXCJzZWxlY3RTdG9yeVwiO1xuICBldmVudHNbXCJQUkVWSUVXX0tFWURPV05cIl0gPSBcInByZXZpZXdLZXlkb3duXCI7XG4gIGV2ZW50c1tcIlNUT1JZX0FEREVEXCJdID0gXCJzdG9yeUFkZGVkXCI7XG4gIGV2ZW50c1tcIlNUT1JZX0NIQU5HRURcIl0gPSBcInN0b3J5Q2hhbmdlZFwiO1xuICBldmVudHNbXCJTVE9SWV9VTkNIQU5HRURcIl0gPSBcInN0b3J5VW5jaGFuZ2VkXCI7XG4gIGV2ZW50c1tcIkZPUkNFX1JFX1JFTkRFUlwiXSA9IFwiZm9yY2VSZVJlbmRlclwiO1xuICBldmVudHNbXCJSRUdJU1RFUl9TVUJTQ1JJUFRJT05cIl0gPSBcInJlZ2lzdGVyU3Vic2NyaXB0aW9uXCI7XG4gIGV2ZW50c1tcIlNUT1JZX0lOSVRcIl0gPSBcInN0b3J5SW5pdFwiO1xuICBldmVudHNbXCJTVE9SWV9SRU5ERVJcIl0gPSBcInN0b3J5UmVuZGVyXCI7XG4gIGV2ZW50c1tcIlNUT1JZX1JFTkRFUkVEXCJdID0gXCJzdG9yeVJlbmRlcmVkXCI7XG4gIGV2ZW50c1tcIlNUT1JZX01JU1NJTkdcIl0gPSBcInN0b3J5TWlzc2luZ1wiO1xuICBldmVudHNbXCJTVE9SWV9FUlJPUkVEXCJdID0gXCJzdG9yeUVycm9yZWRcIjtcbiAgZXZlbnRzW1wiU1RPUllfVEhSRVdfRVhDRVBUSU9OXCJdID0gXCJzdG9yeVRocmV3RXhjZXB0aW9uXCI7XG59KShldmVudHMgfHwgKGV2ZW50cyA9IHt9KSk7XG5cbnZhciBfZGVmYXVsdCA9IGV2ZW50czsgLy8gRW5hYmxlczogYGltcG9ydCAqIGFzIEV2ZW50cyBmcm9tIC4uLmAgb3IgYGltcG9ydCB7IENIQU5ORUxfQ1JFQVRFRCB9IGFzIEV2ZW50cyBmcm9tIC4uLmBcbi8vIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2RcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDtcbnZhciBfZXZlbnRzID0gZXZlbnRzLFxuICAgIENIQU5ORUxfQ1JFQVRFRCA9IF9ldmVudHMuQ0hBTk5FTF9DUkVBVEVEO1xuZXhwb3J0cy5DSEFOTkVMX0NSRUFURUQgPSBDSEFOTkVMX0NSRUFURUQ7XG52YXIgX2V2ZW50czIgPSBldmVudHMsXG4gICAgR0VUX0NVUlJFTlRfU1RPUlkgPSBfZXZlbnRzMi5HRVRfQ1VSUkVOVF9TVE9SWTtcbmV4cG9ydHMuR0VUX0NVUlJFTlRfU1RPUlkgPSBHRVRfQ1VSUkVOVF9TVE9SWTtcbnZhciBfZXZlbnRzMyA9IGV2ZW50cyxcbiAgICBTRVRfQ1VSUkVOVF9TVE9SWSA9IF9ldmVudHMzLlNFVF9DVVJSRU5UX1NUT1JZO1xuZXhwb3J0cy5TRVRfQ1VSUkVOVF9TVE9SWSA9IFNFVF9DVVJSRU5UX1NUT1JZO1xudmFyIF9ldmVudHM0ID0gZXZlbnRzLFxuICAgIEdFVF9TVE9SSUVTID0gX2V2ZW50czQuR0VUX1NUT1JJRVM7XG5leHBvcnRzLkdFVF9TVE9SSUVTID0gR0VUX1NUT1JJRVM7XG52YXIgX2V2ZW50czUgPSBldmVudHMsXG4gICAgU0VUX1NUT1JJRVMgPSBfZXZlbnRzNS5TRVRfU1RPUklFUztcbmV4cG9ydHMuU0VUX1NUT1JJRVMgPSBTRVRfU1RPUklFUztcbnZhciBfZXZlbnRzNiA9IGV2ZW50cyxcbiAgICBTVE9SSUVTX0NPTkZJR1VSRUQgPSBfZXZlbnRzNi5TVE9SSUVTX0NPTkZJR1VSRUQ7XG5leHBvcnRzLlNUT1JJRVNfQ09ORklHVVJFRCA9IFNUT1JJRVNfQ09ORklHVVJFRDtcbnZhciBfZXZlbnRzNyA9IGV2ZW50cyxcbiAgICBTRUxFQ1RfU1RPUlkgPSBfZXZlbnRzNy5TRUxFQ1RfU1RPUlk7XG5leHBvcnRzLlNFTEVDVF9TVE9SWSA9IFNFTEVDVF9TVE9SWTtcbnZhciBfZXZlbnRzOCA9IGV2ZW50cyxcbiAgICBQUkVWSUVXX0tFWURPV04gPSBfZXZlbnRzOC5QUkVWSUVXX0tFWURPV047XG5leHBvcnRzLlBSRVZJRVdfS0VZRE9XTiA9IFBSRVZJRVdfS0VZRE9XTjtcbnZhciBfZXZlbnRzOSA9IGV2ZW50cyxcbiAgICBGT1JDRV9SRV9SRU5ERVIgPSBfZXZlbnRzOS5GT1JDRV9SRV9SRU5ERVI7XG5leHBvcnRzLkZPUkNFX1JFX1JFTkRFUiA9IEZPUkNFX1JFX1JFTkRFUjtcbnZhciBfZXZlbnRzMTAgPSBldmVudHMsXG4gICAgUkVHSVNURVJfU1VCU0NSSVBUSU9OID0gX2V2ZW50czEwLlJFR0lTVEVSX1NVQlNDUklQVElPTjtcbmV4cG9ydHMuUkVHSVNURVJfU1VCU0NSSVBUSU9OID0gUkVHSVNURVJfU1VCU0NSSVBUSU9OO1xudmFyIF9ldmVudHMxMSA9IGV2ZW50cyxcbiAgICBTVE9SWV9JTklUID0gX2V2ZW50czExLlNUT1JZX0lOSVQ7XG5leHBvcnRzLlNUT1JZX0lOSVQgPSBTVE9SWV9JTklUO1xudmFyIF9ldmVudHMxMiA9IGV2ZW50cyxcbiAgICBTVE9SWV9BRERFRCA9IF9ldmVudHMxMi5TVE9SWV9BRERFRDtcbmV4cG9ydHMuU1RPUllfQURERUQgPSBTVE9SWV9BRERFRDtcbnZhciBfZXZlbnRzMTMgPSBldmVudHMsXG4gICAgU1RPUllfUkVOREVSID0gX2V2ZW50czEzLlNUT1JZX1JFTkRFUjtcbmV4cG9ydHMuU1RPUllfUkVOREVSID0gU1RPUllfUkVOREVSO1xudmFyIF9ldmVudHMxNCA9IGV2ZW50cyxcbiAgICBTVE9SWV9SRU5ERVJFRCA9IF9ldmVudHMxNC5TVE9SWV9SRU5ERVJFRDtcbmV4cG9ydHMuU1RPUllfUkVOREVSRUQgPSBTVE9SWV9SRU5ERVJFRDtcbnZhciBfZXZlbnRzMTUgPSBldmVudHMsXG4gICAgU1RPUllfTUlTU0lORyA9IF9ldmVudHMxNS5TVE9SWV9NSVNTSU5HO1xuZXhwb3J0cy5TVE9SWV9NSVNTSU5HID0gU1RPUllfTUlTU0lORztcbnZhciBfZXZlbnRzMTYgPSBldmVudHMsXG4gICAgU1RPUllfRVJST1JFRCA9IF9ldmVudHMxNi5TVE9SWV9FUlJPUkVEO1xuZXhwb3J0cy5TVE9SWV9FUlJPUkVEID0gU1RPUllfRVJST1JFRDtcbnZhciBfZXZlbnRzMTcgPSBldmVudHMsXG4gICAgU1RPUllfQ0hBTkdFRCA9IF9ldmVudHMxNy5TVE9SWV9DSEFOR0VEO1xuZXhwb3J0cy5TVE9SWV9DSEFOR0VEID0gU1RPUllfQ0hBTkdFRDtcbnZhciBfZXZlbnRzMTggPSBldmVudHMsXG4gICAgU1RPUllfVEhSRVdfRVhDRVBUSU9OID0gX2V2ZW50czE4LlNUT1JZX1RIUkVXX0VYQ0VQVElPTjtcbmV4cG9ydHMuU1RPUllfVEhSRVdfRVhDRVBUSU9OID0gU1RPUllfVEhSRVdfRVhDRVBUSU9OOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMnKTtcblxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVnRXhwJywgcHJvdG86IHRydWUsIGZvcmNlZDogLy4vLmV4ZWMgIT09IHJlZ2V4cEV4ZWMgfSwge1xuICBleGVjOiByZWdleHBFeGVjXG59KTtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIF9jb25maWcsX3V0aWxfaG9zdFJlcG9ydEVycm9yIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGhvc3RSZXBvcnRFcnJvciB9IGZyb20gJy4vdXRpbC9ob3N0UmVwb3J0RXJyb3InO1xuZXhwb3J0IHZhciBlbXB0eSA9IHtcbiAgICBjbG9zZWQ6IHRydWUsXG4gICAgbmV4dDogZnVuY3Rpb24gKHZhbHVlKSB7IH0sXG4gICAgZXJyb3I6IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHsgfVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU9ic2VydmVyLmpzLm1hcFxuIiwiLyogZXNsaW50LWRpc2FibGUgZ2xvYmFsLXJlcXVpcmUgKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBXZWxjb21lOiByZXF1aXJlKCcuL2Rpc3QvZGVtby93ZWxjb21lLmNvbXBvbmVudCcpLmRlZmF1bHQsXG4gIEJ1dHRvbjogcmVxdWlyZSgnLi9kaXN0L2RlbW8vYnV0dG9uLmNvbXBvbmVudCcpLmRlZmF1bHQsXG59O1xuIiwidmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7XG5cdGlmICgkYXNzaWduKSB7XG5cdFx0cmV0dXJuICRhc3NpZ24odGFyZ2V0LCBzb3VyY2UpO1xuXHR9XG5cblx0Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuXHRcdGlmIChoYXMoc291cmNlLCBrZXkpKSB7XG5cdFx0XHR0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciBFUzIwMTYgPSByZXF1aXJlKCcuL2VzMjAxNicpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9hc3NpZ24nKTtcbnZhciBmb3JFYWNoID0gcmVxdWlyZSgnLi9oZWxwZXJzL2ZvckVhY2gnKTtcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRpc0VudW1lcmFibGUgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgR2V0SW50cmluc2ljKCclT2JqZWN0UHJvdG90eXBlJScpLnByb3BlcnR5SXNFbnVtZXJhYmxlKTtcbnZhciAkcHVzaEFwcGx5ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmFwcGx5LCBHZXRJbnRyaW5zaWMoJyVBcnJheVByb3RvdHlwZSUnKS5wdXNoKTtcblxudmFyIEVTMjAxNyA9IGFzc2lnbihhc3NpZ24oe30sIEVTMjAxNiksIHtcblx0VG9JbmRleDogZnVuY3Rpb24gVG9JbmRleCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0dmFyIGludGVnZXJJbmRleCA9IHRoaXMuVG9JbnRlZ2VyKHZhbHVlKTtcblx0XHRpZiAoaW50ZWdlckluZGV4IDwgMCkge1xuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2luZGV4IG11c3QgYmUgPj0gMCcpO1xuXHRcdH1cblx0XHR2YXIgaW5kZXggPSB0aGlzLlRvTGVuZ3RoKGludGVnZXJJbmRleCk7XG5cdFx0aWYgKCF0aGlzLlNhbWVWYWx1ZVplcm8oaW50ZWdlckluZGV4LCBpbmRleCkpIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdpbmRleCBtdXN0IGJlID49IDAgYW5kIDwgMiAqKiA1MyAtIDEnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGluZGV4O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOC4wLyNzZWMtZW51bWVyYWJsZW93bnByb3BlcnRpZXNcblx0RW51bWVyYWJsZU93blByb3BlcnRpZXM6IGZ1bmN0aW9uIEVudW1lcmFibGVPd25Qcm9wZXJ0aWVzKE8sIGtpbmQpIHtcblx0XHR2YXIga2V5cyA9IEVTMjAxNi5FbnVtZXJhYmxlT3duTmFtZXMoTyk7XG5cdFx0aWYgKGtpbmQgPT09ICdrZXknKSB7XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9XG5cdFx0aWYgKGtpbmQgPT09ICd2YWx1ZScgfHwga2luZCA9PT0gJ2tleSt2YWx1ZScpIHtcblx0XHRcdHZhciByZXN1bHRzID0gW107XG5cdFx0XHRmb3JFYWNoKGtleXMsIGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0aWYgKCRpc0VudW1lcmFibGUoTywga2V5KSkge1xuXHRcdFx0XHRcdCRwdXNoQXBwbHkocmVzdWx0cywgW1xuXHRcdFx0XHRcdFx0a2luZCA9PT0gJ3ZhbHVlJyA/IE9ba2V5XSA6IFtrZXksIE9ba2V5XV1cblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwia2luZFwiIGlzIG5vdCBcImtleVwiLCBcInZhbHVlXCIsIG9yIFwia2V5K3ZhbHVlXCI6ICcgKyBraW5kKTtcblx0fVxufSk7XG5cbmRlbGV0ZSBFUzIwMTcuRW51bWVyYWJsZU93bk5hbWVzOyAvLyByZXBsYWNlZCB3aXRoIEVudW1lcmFibGVPd25Qcm9wZXJ0aWVzXG5cbm1vZHVsZS5leHBvcnRzID0gRVMyMDE3O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuLy8gTmFzaG9ybiB+IEpESzggYnVnXG52YXIgTkFTSE9STl9CVUcgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiYgIW5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoeyAxOiAyIH0sIDEpO1xuXG5leHBvcnRzLmYgPSBOQVNIT1JOX0JVRyA/IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKFYpIHtcbiAgdmFyIGRlc2NyaXB0b3IgPSBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgVik7XG4gIHJldHVybiAhIWRlc2NyaXB0b3IgJiYgZGVzY3JpcHRvci5lbnVtZXJhYmxlO1xufSA6IG5hdGl2ZVByb3BlcnR5SXNFbnVtZXJhYmxlO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVFlQRSwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHRhcmdldC5wdXNoKHZhbHVlKTsgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgIC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9ICFyZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJykoZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIEFycmF5LmZyb20oaXRlcmFibGUpO1xufSk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKVxufSk7XG4iLCJ2YXIgRGF0ZVByb3RvdHlwZSA9IERhdGUucHJvdG90eXBlO1xudmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgbmF0aXZlRGF0ZVRvU3RyaW5nID0gRGF0ZVByb3RvdHlwZVtUT19TVFJJTkddO1xudmFyIGdldFRpbWUgPSBEYXRlUHJvdG90eXBlLmdldFRpbWU7XG5cbi8vIGBEYXRlLnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kYXRlLnByb3RvdHlwZS50b3N0cmluZ1xuaWYgKG5ldyBEYXRlKE5hTikgKyAnJyAhPSBJTlZBTElEX0RBVEUpIHtcbiAgcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJykoRGF0ZVByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyBuYXRpdmVEYXRlVG9TdHJpbmcuY2FsbCh0aGlzKSA6IElOVkFMSURfREFURTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBmbGFncyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZmxhZ3MnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgbmF0aXZlVG9TdHJpbmcgPSAvLi9bVE9fU1RSSU5HXTtcblxudmFyIE5PVF9HRU5FUklDID0gZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmF0aXZlVG9TdHJpbmcuY2FsbCh7IHNvdXJjZTogJ2EnLCBmbGFnczogJ2InIH0pICE9ICcvYS9iJzsgfSk7XG4vLyBGRjQ0LSBSZWdFeHAjdG9TdHJpbmcgaGFzIGEgd3JvbmcgbmFtZVxudmFyIElOQ09SUkVDVF9OQU1FID0gbmF0aXZlVG9TdHJpbmcubmFtZSAhPSBUT19TVFJJTkc7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbmlmIChOT1RfR0VORVJJQyB8fCBJTkNPUlJFQ1RfTkFNRSkge1xuICByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKShSZWdFeHAucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciBSID0gYW5PYmplY3QodGhpcyk7XG4gICAgcmV0dXJuICcvJy5jb25jYXQoUi5zb3VyY2UsICcvJyxcbiAgICAgICdmbGFncycgaW4gUiA/IFIuZmxhZ3MgOiAhREVTQ1JJUFRPUlMgJiYgUiBpbnN0YW5jZW9mIFJlZ0V4cCA/IGZsYWdzLmNhbGwoUikgOiB1bmRlZmluZWQpO1xuICB9LCB7IHVuc2FmZTogdHJ1ZSB9KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBfZXhwb3J0TmFtZXMgPSB7fTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2luZGV4ID0gcmVxdWlyZShcIi4vaW5kZXhcIik7XG5cbk9iamVjdC5rZXlzKF9pbmRleCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfZXhwb3J0TmFtZXMsIGtleSkpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX2luZGV4W2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xuXG52YXIgX21ha2VEZWNvcmF0b3IgPSByZXF1aXJlKFwiLi9tYWtlLWRlY29yYXRvclwiKTtcblxuT2JqZWN0LmtleXMoX21ha2VEZWNvcmF0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX2V4cG9ydE5hbWVzLCBrZXkpKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9tYWtlRGVjb3JhdG9yW2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xuXG52YXIgX3N0b3J5Ym9va0NoYW5uZWxNb2NrID0gcmVxdWlyZShcIi4vc3Rvcnlib29rLWNoYW5uZWwtbW9ja1wiKTtcblxuT2JqZWN0LmtleXMoX3N0b3J5Ym9va0NoYW5uZWxNb2NrKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIgfHwga2V5ID09PSBcIl9fZXNNb2R1bGVcIikgcmV0dXJuO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF9leHBvcnROYW1lcywga2V5KSkgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBfc3Rvcnlib29rQ2hhbm5lbE1vY2tba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG4vLyBUaGVyZSBjYW4gb25seSBiZSAxIGRlZmF1bHQgZXhwb3J0IHBlciBlbnRyeSBwb2ludCBhbmQgaXQgaGFzIHRvIGJlIGRpcmVjdGx5IGZyb20gcHVibGljX2FwaVxuLy8gRXhwb3J0aW5nIHRoaXMgdHdpY2UgaW4gb3JkZXIgdG8gdG8gYmUgYWJsZSB0byBpbXBvcnQgaXQgbGlrZSB7IGFkZG9ucyB9IGluc3RlYWQgb2YgJ2FkZG9ucydcbi8vIHByZWZlciBpbXBvcnQgeyBhZGRvbnMgfSBmcm9tICdAc3Rvcnlib29rL2FkZG9ucycgb3ZlciBpbXBvcnQgYWRkb25zIGZyb20gJ0BzdG9yeWJvb2svYWRkb25zJ1xuLy9cbi8vIFNlZSBpbmRleC50c1xudmFyIF9kZWZhdWx0ID0gX2luZGV4LmFkZG9ucztcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvdXRpbHMnKTtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIE1FVEFEQVRBID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpKCdtZXRhJyk7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaWQgPSAwO1xuXG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZSB8fCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0cnVlO1xufTtcblxudmFyIHNldE1ldGFkYXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIGRlZmluZVByb3BlcnR5KGl0LCBNRVRBREFUQSwgeyB2YWx1ZToge1xuICAgIG9iamVjdElEOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3ZWFrRGF0YToge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG5cbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIGEgcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBREFUQV0ub2JqZWN0SUQ7XG59O1xuXG52YXIgZ2V0V2Vha0RhdGEgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIWhhcyhpdCwgTUVUQURBVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGFkYXRhKGl0KTtcbiAgLy8gcmV0dXJuIHRoZSBzdG9yZSBvZiB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBREFUQV0ud2Vha0RhdGE7XG59O1xuXG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpJTkcgJiYgbWV0YS5SRVFVSVJFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEFEQVRBKSkgc2V0TWV0YWRhdGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgbWV0YSA9IG1vZHVsZS5leHBvcnRzID0ge1xuICBSRVFVSVJFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWtEYXRhOiBnZXRXZWFrRGF0YSxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKVtNRVRBREFUQV0gPSB0cnVlO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG52YXIgQlJFQUsgPSB7fTtcblxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZm4sIHRoYXQsIEVOVFJJRVMsIElURVJBVE9SKSB7XG4gIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChmbiwgdGhhdCwgRU5UUklFUyA/IDIgOiAxKTtcbiAgdmFyIGl0ZXJhdG9yLCBpdGVyRm4sIGluZGV4LCBsZW5ndGgsIHJlc3VsdCwgc3RlcDtcblxuICBpZiAoSVRFUkFUT1IpIHtcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlO1xuICB9IGVsc2Uge1xuICAgIGl0ZXJGbiA9IGdldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoJ1RhcmdldCBpcyBub3QgaXRlcmFibGUnKTtcbiAgICAvLyBvcHRpbWlzYXRpb24gZm9yIGFycmF5IGl0ZXJhdG9yc1xuICAgIGlmIChpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlckZuKSkge1xuICAgICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIHJlc3VsdCA9IEVOVFJJRVMgPyBib3VuZEZ1bmN0aW9uKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGJvdW5kRnVuY3Rpb24oaXRlcmFibGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gQlJFQUspIHJldHVybiBCUkVBSztcbiAgICAgIH0gcmV0dXJuO1xuICAgIH1cbiAgICBpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTtcbiAgfVxuXG4gIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICBpZiAoY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyhpdGVyYXRvciwgYm91bmRGdW5jdGlvbiwgc3RlcC52YWx1ZSwgRU5UUklFUykgPT09IEJSRUFLKSByZXR1cm4gQlJFQUs7XG4gIH1cbn07XG5cbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZuVG9TdHIgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3NcXGIvO1xudmFyIGlzRVM2Q2xhc3NGbiA9IGZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGNvbnN0cnVjdG9yUmVnZXgudGVzdChmblN0cik7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGZ1bmN0aW9uXG5cdH1cbn07XG5cbnZhciB0cnlGdW5jdGlvbk9iamVjdCA9IGZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRpZiAoaXNFUzZDbGFzc0ZuKHZhbHVlKSkgeyByZXR1cm4gZmFsc2U7IH1cblx0XHRmblRvU3RyLmNhbGwodmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbnZhciBnZW5DbGFzcyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG52YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09ICdzeW1ib2wnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQ2FsbGFibGUodmFsdWUpIHtcblx0aWYgKCF2YWx1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmICF2YWx1ZS5wcm90b3R5cGUpIHsgcmV0dXJuIHRydWU7IH1cblx0aWYgKGhhc1RvU3RyaW5nVGFnKSB7IHJldHVybiB0cnlGdW5jdGlvbk9iamVjdCh2YWx1ZSk7IH1cblx0aWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdHZhciBzdHJDbGFzcyA9IHRvU3RyLmNhbGwodmFsdWUpO1xuXHRyZXR1cm4gc3RyQ2xhc3MgPT09IGZuQ2xhc3MgfHwgc3RyQ2xhc3MgPT09IGdlbkNsYXNzO1xufTtcbiIsInZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcblxuLy8gYFRvSW50ZWdlcmAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2ludGVnZXJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBpc05hTihhcmd1bWVudCA9ICthcmd1bWVudCkgPyAwIDogKGFyZ3VtZW50ID4gMCA/IGZsb29yIDogY2VpbCkoYXJndW1lbnQpO1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHJldHVybiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IGFycmF5LmNvbnN0cnVjdG9yID0ge307XG4gICAgY29uc3RydWN0b3JbU1BFQ0lFU10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4geyBmb286IDEgfTtcbiAgICB9O1xuICAgIHJldHVybiBhcnJheVtNRVRIT0RfTkFNRV0oQm9vbGVhbikuZm9vICE9PSAxO1xuICB9KTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHNwbGl0ID0gJycuc3BsaXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyB0aHJvd3MgYW4gZXJyb3IgaW4gcmhpbm8sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9yaGluby9pc3N1ZXMvMzQ2XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgcmV0dXJuICFPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKTtcbn0pID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjbGFzc29mKGl0KSA9PSAnU3RyaW5nJyA/IHNwbGl0LmNhbGwoaXQsICcnKSA6IE9iamVjdChpdCk7XG59IDogT2JqZWN0O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91aWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyIGludGVybmFsT2JqZWN0S2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbCcpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgcmVwbGFjZW1lbnQgPSAvI3xcXC5wcm90b3R5cGVcXC4vO1xuXG52YXIgaXNGb3JjZWQgPSBmdW5jdGlvbiAoZmVhdHVyZSwgZGV0ZWN0aW9uKSB7XG4gIHZhciB2YWx1ZSA9IGRhdGFbbm9ybWFsaXplKGZlYXR1cmUpXTtcbiAgcmV0dXJuIHZhbHVlID09IFBPTFlGSUxMID8gdHJ1ZVxuICAgIDogdmFsdWUgPT0gTkFUSVZFID8gZmFsc2VcbiAgICA6IHR5cGVvZiBkZXRlY3Rpb24gPT0gJ2Z1bmN0aW9uJyA/IGZhaWxzKGRldGVjdGlvbilcbiAgICA6ICEhZGV0ZWN0aW9uO1xufTtcblxudmFyIG5vcm1hbGl6ZSA9IGlzRm9yY2VkLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVwbGFjZW1lbnQsICcuJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbnZhciBkYXRhID0gaXNGb3JjZWQuZGF0YSA9IHt9O1xudmFyIE5BVElWRSA9IGlzRm9yY2VkLk5BVElWRSA9ICdOJztcbnZhciBQT0xZRklMTCA9IGlzRm9yY2VkLlBPTFlGSUxMID0gJ1AnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRm9yY2VkO1xuIiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIHZhbGlkYXRlU2V0UHJvdG90eXBlT2ZBcmd1bWVudHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdmFsaWRhdGUtc2V0LXByb3RvdHlwZS1vZi1hcmd1bWVudHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gZnVuY3Rpb24gKCkge1xuICB2YXIgY29ycmVjdFNldHRlciA9IGZhbHNlO1xuICB2YXIgdGVzdCA9IHt9O1xuICB2YXIgc2V0dGVyO1xuICB0cnkge1xuICAgIHNldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldDtcbiAgICBzZXR0ZXIuY2FsbCh0ZXN0LCBbXSk7XG4gICAgY29ycmVjdFNldHRlciA9IHRlc3QgaW5zdGFuY2VvZiBBcnJheTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzKE8sIHByb3RvKTtcbiAgICBpZiAoY29ycmVjdFNldHRlcikgc2V0dGVyLmNhbGwoTywgcHJvdG8pO1xuICAgIGVsc2UgTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICByZXR1cm4gTztcbiAgfTtcbn0oKSA6IHVuZGVmaW5lZCk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTUVUSE9EX05BTUUsIGFyZ3VtZW50KSB7XG4gIHZhciBtZXRob2QgPSBbXVtNRVRIT0RfTkFNRV07XG4gIHJldHVybiAhbWV0aG9kIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtY2FsbCxuby10aHJvdy1saXRlcmFsXG4gICAgbWV0aG9kLmNhbGwobnVsbCwgYXJndW1lbnQgfHwgZnVuY3Rpb24gKCkgeyB0aHJvdyAxOyB9LCAxKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVnZXhwRmxhZ3MgPSByZXF1aXJlKCcuL3JlZ2V4cC1mbGFncycpO1xuXG52YXIgbmF0aXZlRXhlYyA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYztcbi8vIFRoaXMgYWx3YXlzIHJlZmVycyB0byB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uLCBiZWNhdXNlIHRoZVxuLy8gU3RyaW5nI3JlcGxhY2UgcG9seWZpbGwgdXNlcyAuL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMuanMsXG4vLyB3aGljaCBsb2FkcyB0aGlzIGZpbGUgYmVmb3JlIHBhdGNoaW5nIHRoZSBtZXRob2QuXG52YXIgbmF0aXZlUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcblxudmFyIHBhdGNoZWRFeGVjID0gbmF0aXZlRXhlYztcblxudmFyIFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciByZTEgPSAvYS87XG4gIHZhciByZTIgPSAvYiovZztcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMSwgJ2EnKTtcbiAgbmF0aXZlRXhlYy5jYWxsKHJlMiwgJ2EnKTtcbiAgcmV0dXJuIHJlMS5sYXN0SW5kZXggIT09IDAgfHwgcmUyLmxhc3RJbmRleCAhPT0gMDtcbn0pKCk7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEO1xuXG5pZiAoUEFUQ0gpIHtcbiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikge1xuICAgIHZhciByZSA9IHRoaXM7XG4gICAgdmFyIGxhc3RJbmRleCwgcmVDb3B5LCBtYXRjaCwgaTtcblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHJlLnNvdXJjZSArICckKD8hXFxcXHMpJywgcmVnZXhwRmxhZ3MuY2FsbChyZSkpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZS5sYXN0SW5kZXg7XG5cbiAgICBtYXRjaCA9IG5hdGl2ZUV4ZWMuY2FsbChyZSwgc3RyKTtcblxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgJiYgbWF0Y2gpIHtcbiAgICAgIHJlLmxhc3RJbmRleCA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vXG4gICAgICBuYXRpdmVSZXBsYWNlLmNhbGwobWF0Y2hbMF0sIHJlQ29weSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYztcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9jbGFzc29mLXJhdycpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL3JlZ2V4cC1leGVjJyk7XG5cbi8vIGBSZWdFeHBFeGVjYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cGV4ZWNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFIsIFMpIHtcbiAgdmFyIGV4ZWMgPSBSLmV4ZWM7XG4gIGlmICh0eXBlb2YgZXhlYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciByZXN1bHQgPSBleGVjLmNhbGwoUiwgUyk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7XG4gIH1cblxuICByZXR1cm4gcmVnZXhwRXhlYy5jYWxsKFIsIFMpO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG5cbnZhciBSRVBMQUNFX1NVUFBPUlRTX05BTUVEX0dST1VQUyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vICNyZXBsYWNlIG5lZWRzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG5hbWVkIGdyb3Vwcy5cbiAgLy8gI21hdGNoIHdvcmtzIGZpbmUgYmVjYXVzZSBpdCBqdXN0IHJldHVybiB0aGUgZXhlYyByZXN1bHRzLCBldmVuIGlmIGl0IGhhc1xuICAvLyBhIFwiZ3JvcHNcIiBwcm9wZXJ0eS5cbiAgdmFyIHJlID0gLy4vO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICByZXN1bHQuZ3JvdXBzID0geyBhOiAnNycgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICByZXR1cm4gJycucmVwbGFjZShyZSwgJyQ8YT4nKSAhPT0gJzcnO1xufSk7XG5cbi8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuLy8gV2VleCBKUyBoYXMgZnJvemVuIGJ1aWx0LWluIHByb3RvdHlwZXMsIHNvIHVzZSB0cnkgLyBjYXRjaCB3cmFwcGVyXG52YXIgU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlID0gLyg/OikvO1xuICB2YXIgb3JpZ2luYWxFeGVjID0gcmUuZXhlYztcbiAgcmUuZXhlYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9yaWdpbmFsRXhlYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICB2YXIgcmVzdWx0ID0gJ2FiJy5zcGxpdChyZSk7XG4gIHJldHVybiByZXN1bHQubGVuZ3RoICE9PSAyIHx8IHJlc3VsdFswXSAhPT0gJ2EnIHx8IHJlc3VsdFsxXSAhPT0gJ2InO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgbGVuZ3RoLCBleGVjLCBzaGFtKSB7XG4gIHZhciBTWU1CT0wgPSB3ZWxsS25vd25TeW1ib2woS0VZKTtcblxuICB2YXIgREVMRUdBVEVTX1RPX1NZTUJPTCA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3RyaW5nIG1ldGhvZHMgY2FsbCBzeW1ib2wtbmFtZWQgUmVnRXAgbWV0aG9kc1xuICAgIHZhciBPID0ge307XG4gICAgT1tTWU1CT0xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfTtcbiAgICByZXR1cm4gJydbS0VZXShPKSAhPSA3O1xuICB9KTtcblxuICB2YXIgREVMRUdBVEVTX1RPX0VYRUMgPSBERUxFR0FURVNfVE9fU1lNQk9MICYmICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG5cbiAgICBpZiAoS0VZID09PSAnc3BsaXQnKSB7XG4gICAgICAvLyBSZWdFeHBbQEBzcGxpdF0gZG9lc24ndCBjYWxsIHRoZSByZWdleCdzIGV4ZWMgbWV0aG9kLCBidXQgZmlyc3QgY3JlYXRlc1xuICAgICAgLy8gYSBuZXcgb25lLiBXZSBuZWVkIHRvIHJldHVybiB0aGUgcGF0Y2hlZCByZWdleCB3aGVuIGNyZWF0aW5nIHRoZSBuZXcgb25lLlxuICAgICAgcmUuY29uc3RydWN0b3IgPSB7fTtcbiAgICAgIHJlLmNvbnN0cnVjdG9yW1NQRUNJRVNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gcmU7IH07XG4gICAgfVxuXG4gICAgcmVbU1lNQk9MXSgnJyk7XG4gICAgcmV0dXJuICFleGVjQ2FsbGVkO1xuICB9KTtcblxuICBpZiAoXG4gICAgIURFTEVHQVRFU19UT19TWU1CT0wgfHxcbiAgICAhREVMRUdBVEVTX1RPX0VYRUMgfHxcbiAgICAoS0VZID09PSAncmVwbGFjZScgJiYgIVJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTKSB8fFxuICAgIChLRVkgPT09ICdzcGxpdCcgJiYgIVNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQylcbiAgKSB7XG4gICAgdmFyIG5hdGl2ZVJlZ0V4cE1ldGhvZCA9IC8uL1tTWU1CT0xdO1xuICAgIHZhciBtZXRob2RzID0gZXhlYyhTWU1CT0wsICcnW0tFWV0sIGZ1bmN0aW9uIChuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgaWYgKHJlZ2V4cC5leGVjID09PSByZWdleHBFeGVjKSB7XG4gICAgICAgIGlmIChERUxFR0FURVNfVE9fU1lNQk9MICYmICFmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgIC8vIHBvbHlmaWxsZWQgZnVuY3Rpb24pLCBsZWFzaW5nIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgICAgICAgICAvLyBXZSBhdm9pZCBpdCBieSBkaXJlY3RseSBjYWxsaW5nIHRoZSBuYXRpdmUgQEBtZXRob2QgbWV0aG9kLlxuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbmF0aXZlTWV0aG9kLmNhbGwoc3RyLCByZWdleHAsIGFyZzIpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBkb25lOiBmYWxzZSB9O1xuICAgIH0pO1xuICAgIHZhciBzdHJpbmdNZXRob2QgPSBtZXRob2RzWzBdO1xuICAgIHZhciByZWdleE1ldGhvZCA9IG1ldGhvZHNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmluZ01ldGhvZCk7XG4gICAgcmVkZWZpbmUoUmVnRXhwLnByb3RvdHlwZSwgU1lNQk9MLCBsZW5ndGggPT0gMlxuICAgICAgLy8gMjEuMi41LjggUmVnRXhwLnByb3RvdHlwZVtAQHJlcGxhY2VdKHN0cmluZywgcmVwbGFjZVZhbHVlKVxuICAgICAgLy8gMjEuMi41LjExIFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF0oc3RyaW5nLCBsaW1pdClcbiAgICAgID8gZnVuY3Rpb24gKHN0cmluZywgYXJnKSB7IHJldHVybiByZWdleE1ldGhvZC5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJlZ2V4TWV0aG9kLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gICAgaWYgKHNoYW0pIGhpZGUoUmVnRXhwLnByb3RvdHlwZVtTWU1CT0xdLCAnc2hhbScsIHRydWUpO1xuICB9XG59O1xuIiwidmFyIGxpc3RDYWNoZUNsZWFyID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlQ2xlYXInKSxcbiAgICBsaXN0Q2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVEZWxldGUnKSxcbiAgICBsaXN0Q2FjaGVHZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVHZXQnKSxcbiAgICBsaXN0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVIYXMnKSxcbiAgICBsaXN0Q2FjaGVTZXQgPSByZXF1aXJlKCcuL19saXN0Q2FjaGVTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IExpc3RDYWNoZTtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NvY0luZGV4T2Y7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsInZhciBpc0tleWFibGUgPSByZXF1aXJlKCcuL19pc0tleWFibGUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBkYXRhIGZvciBgbWFwYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgcmVmZXJlbmNlIGtleS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFwRGF0YShtYXAsIGtleSkge1xuICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpXG4gICAgPyBkYXRhW3R5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyAnc3RyaW5nJyA6ICdoYXNoJ11cbiAgICA6IGRhdGEubWFwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcERhdGE7XG4iLCJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTGVuZ3RoID0gcmVxdWlyZSgnLi9pc0xlbmd0aCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUICBQVVJFX0lNUE9SVFNfRU5EICovXG5leHBvcnQgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IChmdW5jdGlvbiAoeCkgeyByZXR1cm4geCAmJiB0eXBlb2YgeC5sZW5ndGggPT09ICdudW1iZXInOyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzQXJyYXkuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUICBQVVJFX0lNUE9SVFNfRU5EICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzT2JqZWN0LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU3Vic2NyaXB0aW9uIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG52YXIgU3ViamVjdFN1YnNjcmlwdGlvbiA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhTdWJqZWN0U3Vic2NyaXB0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFN1YmplY3RTdWJzY3JpcHRpb24oc3ViamVjdCwgc3Vic2NyaWJlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5zdWJqZWN0ID0gc3ViamVjdDtcbiAgICAgICAgX3RoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgICAgIF90aGlzLmNsb3NlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFN1YmplY3RTdWJzY3JpcHRpb24ucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0O1xuICAgICAgICB2YXIgb2JzZXJ2ZXJzID0gc3ViamVjdC5vYnNlcnZlcnM7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IG51bGw7XG4gICAgICAgIGlmICghb2JzZXJ2ZXJzIHx8IG9ic2VydmVycy5sZW5ndGggPT09IDAgfHwgc3ViamVjdC5pc1N0b3BwZWQgfHwgc3ViamVjdC5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3Vic2NyaWJlckluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2YodGhpcy5zdWJzY3JpYmVyKTtcbiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG9ic2VydmVycy5zcGxpY2Uoc3Vic2NyaWJlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFN1YmplY3RTdWJzY3JpcHRpb247XG59KFN1YnNjcmlwdGlvbikpO1xuZXhwb3J0IHsgU3ViamVjdFN1YnNjcmlwdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3ViamVjdFN1YnNjcmlwdGlvbi5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NjaGVkdWxlcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc2NoZWR1bGUgPT09ICdmdW5jdGlvbic7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1NjaGVkdWxlci5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX09ic2VydmFibGUsX3N1YnNjcmliZVRvQXJyYXksX3N1YnNjcmliZVRvUHJvbWlzZSxfc3Vic2NyaWJlVG9JdGVyYWJsZSxfc3Vic2NyaWJlVG9PYnNlcnZhYmxlLF9pc0FycmF5TGlrZSxfaXNQcm9taXNlLF9pc09iamVjdCxfc3ltYm9sX2l0ZXJhdG9yLF9zeW1ib2xfb2JzZXJ2YWJsZSBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi4vT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBzdWJzY3JpYmVUb0FycmF5IH0gZnJvbSAnLi9zdWJzY3JpYmVUb0FycmF5JztcbmltcG9ydCB7IHN1YnNjcmliZVRvUHJvbWlzZSB9IGZyb20gJy4vc3Vic2NyaWJlVG9Qcm9taXNlJztcbmltcG9ydCB7IHN1YnNjcmliZVRvSXRlcmFibGUgfSBmcm9tICcuL3N1YnNjcmliZVRvSXRlcmFibGUnO1xuaW1wb3J0IHsgc3Vic2NyaWJlVG9PYnNlcnZhYmxlIH0gZnJvbSAnLi9zdWJzY3JpYmVUb09ic2VydmFibGUnO1xuaW1wb3J0IHsgaXNBcnJheUxpa2UgfSBmcm9tICcuL2lzQXJyYXlMaWtlJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4vaXNQcm9taXNlJztcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnLi9pc09iamVjdCc7XG5pbXBvcnQgeyBpdGVyYXRvciBhcyBTeW1ib2xfaXRlcmF0b3IgfSBmcm9tICcuLi9zeW1ib2wvaXRlcmF0b3InO1xuaW1wb3J0IHsgb2JzZXJ2YWJsZSBhcyBTeW1ib2xfb2JzZXJ2YWJsZSB9IGZyb20gJy4uL3N5bWJvbC9vYnNlcnZhYmxlJztcbmV4cG9ydCB2YXIgc3Vic2NyaWJlVG8gPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0Ll9pc1NjYWxhcikge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKCEhcmVzdWx0ICYmIHR5cGVvZiByZXN1bHRbU3ltYm9sX29ic2VydmFibGVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVUb09ic2VydmFibGUocmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheUxpa2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9BcnJheShyZXN1bHQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9Qcm9taXNlKHJlc3VsdCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEhcmVzdWx0ICYmIHR5cGVvZiByZXN1bHRbU3ltYm9sX2l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9JdGVyYWJsZShyZXN1bHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXNPYmplY3QocmVzdWx0KSA/ICdhbiBpbnZhbGlkIG9iamVjdCcgOiBcIidcIiArIHJlc3VsdCArIFwiJ1wiO1xuICAgICAgICB2YXIgbXNnID0gXCJZb3UgcHJvdmlkZWQgXCIgKyB2YWx1ZSArIFwiIHdoZXJlIGEgc3RyZWFtIHdhcyBleHBlY3RlZC5cIlxuICAgICAgICAgICAgKyAnIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBBcnJheSwgb3IgSXRlcmFibGUuJztcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJzY3JpYmVUby5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX3N5bWJvbF9vYnNlcnZhYmxlIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IG9ic2VydmFibGUgYXMgU3ltYm9sX29ic2VydmFibGUgfSBmcm9tICcuLi9zeW1ib2wvb2JzZXJ2YWJsZSc7XG5leHBvcnQgdmFyIHN1YnNjcmliZVRvT2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgdmFyIG9icyA9IG9ialtTeW1ib2xfb2JzZXJ2YWJsZV0oKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnMuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9icy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnNjcmliZVRvT2JzZXJ2YWJsZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCB2YXIgaXNBcnJheUxpa2UgPSAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeCAhPT0gJ2Z1bmN0aW9uJzsgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0FycmF5TGlrZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCB2YXIgc3Vic2NyaWJlVG9BcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSsrKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Vic2NyaWJlVG9BcnJheS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNQcm9taXNlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfaG9zdFJlcG9ydEVycm9yIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IGhvc3RSZXBvcnRFcnJvciB9IGZyb20gJy4vaG9zdFJlcG9ydEVycm9yJztcbmV4cG9ydCB2YXIgc3Vic2NyaWJlVG9Qcm9taXNlID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7IH0pXG4gICAgICAgICAgICAudGhlbihudWxsLCBob3N0UmVwb3J0RXJyb3IpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgICB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnNjcmliZVRvUHJvbWlzZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX3N5bWJvbF9pdGVyYXRvciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBpdGVyYXRvciBhcyBTeW1ib2xfaXRlcmF0b3IgfSBmcm9tICcuLi9zeW1ib2wvaXRlcmF0b3InO1xuZXhwb3J0IHZhciBzdWJzY3JpYmVUb0l0ZXJhYmxlID0gZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlW1N5bWJvbF9pdGVyYXRvcl0oKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoaXRlbS5kb25lKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7XG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdWJzY3JpYmVUb0l0ZXJhYmxlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU3Vic2NyaWJlciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcChwcm9qZWN0LCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1hcE9wZXJhdGlvbihzb3VyY2UpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBNYXBPcGVyYXRvcihwcm9qZWN0LCB0aGlzQXJnKSk7XG4gICAgfTtcbn1cbnZhciBNYXBPcGVyYXRvciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNYXBPcGVyYXRvcihwcm9qZWN0LCB0aGlzQXJnKSB7XG4gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7XG4gICAgfVxuICAgIE1hcE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpO1xuICAgIH07XG4gICAgcmV0dXJuIE1hcE9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCB7IE1hcE9wZXJhdG9yIH07XG52YXIgTWFwU3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhNYXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE1hcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByb2plY3QsIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnByb2plY3QgPSBwcm9qZWN0O1xuICAgICAgICBfdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIF90aGlzLnRoaXNBcmcgPSB0aGlzQXJnIHx8IF90aGlzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE1hcFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QuY2FsbCh0aGlzLnRoaXNBcmcsIHZhbHVlLCB0aGlzLmNvdW50KyspO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTtcbiAgICB9O1xuICAgIHJldHVybiBNYXBTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYXAuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIHRzbGliLF9TdWJzY3JpYmVyIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAnLi9TdWJzY3JpYmVyJztcbnZhciBJbm5lclN1YnNjcmliZXIgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoSW5uZXJTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElubmVyU3Vic2NyaWJlcihwYXJlbnQsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICBfdGhpcy5vdXRlclZhbHVlID0gb3V0ZXJWYWx1ZTtcbiAgICAgICAgX3RoaXMub3V0ZXJJbmRleCA9IG91dGVySW5kZXg7XG4gICAgICAgIF90aGlzLmluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJbm5lclN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeU5leHQodGhpcy5vdXRlclZhbHVlLCB2YWx1ZSwgdGhpcy5vdXRlckluZGV4LCB0aGlzLmluZGV4KyssIHRoaXMpO1xuICAgIH07XG4gICAgSW5uZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5fZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5RXJyb3IoZXJyb3IsIHRoaXMpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICBJbm5lclN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5Q29tcGxldGUodGhpcyk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBJbm5lclN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcbmV4cG9ydCB7IElubmVyU3Vic2NyaWJlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5uZXJTdWJzY3JpYmVyLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfSW5uZXJTdWJzY3JpYmVyLF9zdWJzY3JpYmVUbyBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBJbm5lclN1YnNjcmliZXIgfSBmcm9tICcuLi9Jbm5lclN1YnNjcmliZXInO1xuaW1wb3J0IHsgc3Vic2NyaWJlVG8gfSBmcm9tICcuL3N1YnNjcmliZVRvJztcbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVUb1Jlc3VsdChvdXRlclN1YnNjcmliZXIsIHJlc3VsdCwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCwgZGVzdGluYXRpb24pIHtcbiAgICBpZiAoZGVzdGluYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgICBkZXN0aW5hdGlvbiA9IG5ldyBJbm5lclN1YnNjcmliZXIob3V0ZXJTdWJzY3JpYmVyLCBvdXRlclZhbHVlLCBvdXRlckluZGV4KTtcbiAgICB9XG4gICAgaWYgKGRlc3RpbmF0aW9uLmNsb3NlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBzdWJzY3JpYmVUbyhyZXN1bHQpKGRlc3RpbmF0aW9uKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1YnNjcmliZVRvUmVzdWx0LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU3Vic2NyaWJlciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4vU3Vic2NyaWJlcic7XG52YXIgT3V0ZXJTdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKE91dGVyU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPdXRlclN1YnNjcmliZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgT3V0ZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICB9O1xuICAgIE91dGVyU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5RXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyb3IpO1xuICAgIH07XG4gICAgT3V0ZXJTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlDb21wbGV0ZSA9IGZ1bmN0aW9uIChpbm5lclN1Yikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gT3V0ZXJTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG5leHBvcnQgeyBPdXRlclN1YnNjcmliZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU91dGVyU3Vic2NyaWJlci5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgIFBVUkVfSU1QT1JUU19FTkQgKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eSh4KSB7XG4gICAgcmV0dXJuIHg7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZGVudGl0eS5qcy5tYXBcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGlzQXJncyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKTtcblxudmFyIG9yaWdLZXlzID0gT2JqZWN0LmtleXM7XG52YXIga2V5c1NoaW0gPSBvcmlnS2V5cyA/IGZ1bmN0aW9uIGtleXMobykgeyByZXR1cm4gb3JpZ0tleXMobyk7IH0gOiByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBvcmlnaW5hbEtleXMgPSBPYmplY3Qua2V5cztcblxua2V5c1NoaW0uc2hpbSA9IGZ1bmN0aW9uIHNoaW1PYmplY3RLZXlzKCkge1xuXHRpZiAoT2JqZWN0LmtleXMpIHtcblx0XHR2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9IChmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBTYWZhcmkgNS4wIGJ1Z1xuXHRcdFx0dmFyIGFyZ3MgPSBPYmplY3Qua2V5cyhhcmd1bWVudHMpO1xuXHRcdFx0cmV0dXJuIGFyZ3MgJiYgYXJncy5sZW5ndGggPT09IGFyZ3VtZW50cy5sZW5ndGg7XG5cdFx0fSgxLCAyKSk7XG5cdFx0aWYgKCFrZXlzV29ya3NXaXRoQXJndW1lbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyA9IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG5cdFx0XHRcdGlmIChpc0FyZ3Mob2JqZWN0KSkge1xuXHRcdFx0XHRcdHJldHVybiBvcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRPYmplY3Qua2V5cyA9IGtleXNTaGltO1xuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyB8fCBrZXlzU2hpbTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ga2V5c1NoaW07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSByZXF1aXJlKCdoYXMnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJ2VzLXRvLXByaW1pdGl2ZS9lczYnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnb2JqZWN0LWtleXMnKTtcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkVHlwZUVycm9yID0gR2V0SW50cmluc2ljKCclVHlwZUVycm9yJScpO1xudmFyICRTeW50YXhFcnJvciA9IEdldEludHJpbnNpYygnJVN5bnRheEVycm9yJScpO1xudmFyICRBcnJheSA9IEdldEludHJpbnNpYygnJUFycmF5JScpO1xudmFyICRTdHJpbmcgPSBHZXRJbnRyaW5zaWMoJyVTdHJpbmclJyk7XG52YXIgJE9iamVjdCA9IEdldEludHJpbnNpYygnJU9iamVjdCUnKTtcbnZhciAkTnVtYmVyID0gR2V0SW50cmluc2ljKCclTnVtYmVyJScpO1xudmFyICRTeW1ib2wgPSBHZXRJbnRyaW5zaWMoJyVTeW1ib2wlJywgdHJ1ZSk7XG52YXIgJFJlZ0V4cCA9IEdldEludHJpbnNpYygnJVJlZ0V4cCUnKTtcblxudmFyIGhhc1N5bWJvbHMgPSAhISRTeW1ib2w7XG5cbnZhciBhc3NlcnRSZWNvcmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzZXJ0UmVjb3JkJyk7XG52YXIgJGlzTmFOID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzTmFOJyk7XG52YXIgJGlzRmluaXRlID0gcmVxdWlyZSgnLi9oZWxwZXJzL2lzRmluaXRlJyk7XG52YXIgTUFYX1NBRkVfSU5URUdFUiA9ICROdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCBNYXRoLnBvdygyLCA1MykgLSAxO1xuXG52YXIgYXNzaWduID0gcmVxdWlyZSgnLi9oZWxwZXJzL2Fzc2lnbicpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvc2lnbicpO1xudmFyIG1vZCA9IHJlcXVpcmUoJy4vaGVscGVycy9tb2QnKTtcbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xudmFyIHBhcnNlSW50ZWdlciA9IHBhcnNlSW50O1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgYXJyYXlTbGljZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcbnZhciBzdHJTbGljZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG52YXIgaXNCaW5hcnkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgL14wYlswMV0rJC9pKTtcbnZhciBpc09jdGFsID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRSZWdFeHAucHJvdG90eXBlLnRlc3QsIC9eMG9bMC03XSskL2kpO1xudmFyIHJlZ2V4RXhlYyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkUmVnRXhwLnByb3RvdHlwZS5leGVjKTtcbnZhciBub25XUyA9IFsnXFx1MDA4NScsICdcXHUyMDBiJywgJ1xcdWZmZmUnXS5qb2luKCcnKTtcbnZhciBub25XU3JlZ2V4ID0gbmV3ICRSZWdFeHAoJ1snICsgbm9uV1MgKyAnXScsICdnJyk7XG52YXIgaGFzTm9uV1MgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFJlZ0V4cC5wcm90b3R5cGUudGVzdCwgbm9uV1NyZWdleCk7XG52YXIgaW52YWxpZEhleExpdGVyYWwgPSAvXlstK10weFswLTlhLWZdKyQvaTtcbnZhciBpc0ludmFsaWRIZXhMaXRlcmFsID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRSZWdFeHAucHJvdG90eXBlLnRlc3QsIGludmFsaWRIZXhMaXRlcmFsKTtcbnZhciAkY2hhckNvZGVBdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCAkU3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0KTtcblxudmFyIHRvU3RyID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuXG52YXIgJE51bWJlclZhbHVlT2YgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgR2V0SW50cmluc2ljKCclTnVtYmVyUHJvdG90eXBlJScpLnZhbHVlT2YpO1xudmFyICRCb29sZWFuVmFsdWVPZiA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBHZXRJbnRyaW5zaWMoJyVCb29sZWFuUHJvdG90eXBlJScpLnZhbHVlT2YpO1xudmFyICRTdHJpbmdWYWx1ZU9mID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIEdldEludHJpbnNpYygnJVN0cmluZ1Byb3RvdHlwZSUnKS52YWx1ZU9mKTtcbnZhciAkRGF0ZVZhbHVlT2YgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgR2V0SW50cmluc2ljKCclRGF0ZVByb3RvdHlwZSUnKS52YWx1ZU9mKTtcblxudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgJGFicyA9IE1hdGguYWJzO1xuXG52YXIgJE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG52YXIgJGdPUEQgPSAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxudmFyICRpc0V4dGVuc2libGUgPSAkT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9ICRPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8vIHdoaXRlc3BhY2UgZnJvbTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS41LjQuMjBcbi8vIGltcGxlbWVudGF0aW9uIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2Jsb2IvdjMuNC4wL2VzNS1zaGltLmpzI0wxMzA0LUwxMzI0XG52YXIgd3MgPSBbXG5cdCdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycsXG5cdCdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOCcsXG5cdCdcXHUyMDI5XFx1RkVGRidcbl0uam9pbignJyk7XG52YXIgdHJpbVJlZ2V4ID0gbmV3IFJlZ0V4cCgnKF5bJyArIHdzICsgJ10rKXwoWycgKyB3cyArICddKyQpJywgJ2cnKTtcbnZhciByZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xudmFyIHRyaW0gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0cmV0dXJuIHJlcGxhY2UodmFsdWUsIHRyaW1SZWdleCwgJycpO1xufTtcblxudmFyIEVTNSA9IHJlcXVpcmUoJy4vZXM1Jyk7XG5cbnZhciBoYXNSZWdFeHBNYXRjaGVyID0gcmVxdWlyZSgnaXMtcmVnZXgnKTtcblxuLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWFic3RyYWN0LW9wZXJhdGlvbnNcbnZhciBFUzYgPSBhc3NpZ24oYXNzaWduKHt9LCBFUzUpLCB7XG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWNhbGwtZi12LWFyZ3Ncblx0Q2FsbDogZnVuY3Rpb24gQ2FsbChGLCBWKSB7XG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IFtdO1xuXHRcdGlmICghdGhpcy5Jc0NhbGxhYmxlKEYpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcihGICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRyZXR1cm4gRi5hcHBseShWLCBhcmdzKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9wcmltaXRpdmVcblx0VG9QcmltaXRpdmU6IHRvUHJpbWl0aXZlLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2Jvb2xlYW5cblx0Ly8gVG9Cb29sZWFuOiBFUzUuVG9Cb29sZWFuLFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b251bWJlclxuXHRUb051bWJlcjogZnVuY3Rpb24gVG9OdW1iZXIoYXJndW1lbnQpIHtcblx0XHR2YXIgdmFsdWUgPSBpc1ByaW1pdGl2ZShhcmd1bWVudCkgPyBhcmd1bWVudCA6IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCAkTnVtYmVyKTtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAoaXNCaW5hcnkodmFsdWUpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHBhcnNlSW50ZWdlcihzdHJTbGljZSh2YWx1ZSwgMiksIDIpKTtcblx0XHRcdH0gZWxzZSBpZiAoaXNPY3RhbCh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuVG9OdW1iZXIocGFyc2VJbnRlZ2VyKHN0clNsaWNlKHZhbHVlLCAyKSwgOCkpO1xuXHRcdFx0fSBlbHNlIGlmIChoYXNOb25XUyh2YWx1ZSkgfHwgaXNJbnZhbGlkSGV4TGl0ZXJhbCh2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIE5hTjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciB0cmltbWVkID0gdHJpbSh2YWx1ZSk7XG5cdFx0XHRcdGlmICh0cmltbWVkICE9PSB2YWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLlRvTnVtYmVyKHRyaW1tZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAkTnVtYmVyKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9pbnRlZ2VyXG5cdC8vIFRvSW50ZWdlcjogRVM1LlRvTnVtYmVyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDMyXG5cdC8vIFRvSW50MzI6IEVTNS5Ub0ludDMyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b3VpbnQzMlxuXHQvLyBUb1VpbnQzMjogRVM1LlRvVWludDMyLFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b2ludDE2XG5cdFRvSW50MTY6IGZ1bmN0aW9uIFRvSW50MTYoYXJndW1lbnQpIHtcblx0XHR2YXIgaW50MTZiaXQgPSB0aGlzLlRvVWludDE2KGFyZ3VtZW50KTtcblx0XHRyZXR1cm4gaW50MTZiaXQgPj0gMHg4MDAwID8gaW50MTZiaXQgLSAweDEwMDAwIDogaW50MTZiaXQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDE2XG5cdC8vIFRvVWludDE2OiBFUzUuVG9VaW50MTYsXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvaW50OFxuXHRUb0ludDg6IGZ1bmN0aW9uIFRvSW50OChhcmd1bWVudCkge1xuXHRcdHZhciBpbnQ4Yml0ID0gdGhpcy5Ub1VpbnQ4KGFyZ3VtZW50KTtcblx0XHRyZXR1cm4gaW50OGJpdCA+PSAweDgwID8gaW50OGJpdCAtIDB4MTAwIDogaW50OGJpdDtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG91aW50OFxuXHRUb1VpbnQ4OiBmdW5jdGlvbiBUb1VpbnQ4KGFyZ3VtZW50KSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIoYXJndW1lbnQpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0dmFyIHBvc0ludCA9IHNpZ24obnVtYmVyKSAqICRmbG9vcigkYWJzKG51bWJlcikpO1xuXHRcdHJldHVybiBtb2QocG9zSW50LCAweDEwMCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvdWludDhjbGFtcFxuXHRUb1VpbnQ4Q2xhbXA6IGZ1bmN0aW9uIFRvVWludDhDbGFtcChhcmd1bWVudCkge1xuXHRcdHZhciBudW1iZXIgPSB0aGlzLlRvTnVtYmVyKGFyZ3VtZW50KTtcblx0XHRpZiAoJGlzTmFOKG51bWJlcikgfHwgbnVtYmVyIDw9IDApIHsgcmV0dXJuIDA7IH1cblx0XHRpZiAobnVtYmVyID49IDB4RkYpIHsgcmV0dXJuIDB4RkY7IH1cblx0XHR2YXIgZiA9ICRmbG9vcihhcmd1bWVudCk7XG5cdFx0aWYgKGYgKyAwLjUgPCBudW1iZXIpIHsgcmV0dXJuIGYgKyAxOyB9XG5cdFx0aWYgKG51bWJlciA8IGYgKyAwLjUpIHsgcmV0dXJuIGY7IH1cblx0XHRpZiAoZiAlIDIgIT09IDApIHsgcmV0dXJuIGYgKyAxOyB9XG5cdFx0cmV0dXJuIGY7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvc3RyaW5nXG5cdFRvU3RyaW5nOiBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzeW1ib2wnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcnKTtcblx0XHR9XG5cdFx0cmV0dXJuICRTdHJpbmcoYXJndW1lbnQpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy10b29iamVjdFxuXHRUb09iamVjdDogZnVuY3Rpb24gVG9PYmplY3QodmFsdWUpIHtcblx0XHR0aGlzLlJlcXVpcmVPYmplY3RDb2VyY2libGUodmFsdWUpO1xuXHRcdHJldHVybiAkT2JqZWN0KHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9wcm9wZXJ0eWtleVxuXHRUb1Byb3BlcnR5S2V5OiBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG5cdFx0dmFyIGtleSA9IHRoaXMuVG9QcmltaXRpdmUoYXJndW1lbnQsICRTdHJpbmcpO1xuXHRcdHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyA/IGtleSA6IHRoaXMuVG9TdHJpbmcoa2V5KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtdG9sZW5ndGhcblx0VG9MZW5ndGg6IGZ1bmN0aW9uIFRvTGVuZ3RoKGFyZ3VtZW50KSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMuVG9JbnRlZ2VyKGFyZ3VtZW50KTtcblx0XHRpZiAobGVuIDw9IDApIHsgcmV0dXJuIDA7IH0gLy8gaW5jbHVkZXMgY29udmVydGluZyAtMCB0byArMFxuXHRcdGlmIChsZW4gPiBNQVhfU0FGRV9JTlRFR0VSKSB7IHJldHVybiBNQVhfU0FGRV9JTlRFR0VSOyB9XG5cdFx0cmV0dXJuIGxlbjtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY2Fub25pY2FsbnVtZXJpY2luZGV4c3RyaW5nXG5cdENhbm9uaWNhbE51bWVyaWNJbmRleFN0cmluZzogZnVuY3Rpb24gQ2Fub25pY2FsTnVtZXJpY0luZGV4U3RyaW5nKGFyZ3VtZW50KSB7XG5cdFx0aWYgKHRvU3RyKGFyZ3VtZW50KSAhPT0gJ1tvYmplY3QgU3RyaW5nXScpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdtdXN0IGJlIGEgc3RyaW5nJyk7XG5cdFx0fVxuXHRcdGlmIChhcmd1bWVudCA9PT0gJy0wJykgeyByZXR1cm4gLTA7IH1cblx0XHR2YXIgbiA9IHRoaXMuVG9OdW1iZXIoYXJndW1lbnQpO1xuXHRcdGlmICh0aGlzLlNhbWVWYWx1ZSh0aGlzLlRvU3RyaW5nKG4pLCBhcmd1bWVudCkpIHsgcmV0dXJuIG47IH1cblx0XHRyZXR1cm4gdm9pZCAwO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1yZXF1aXJlb2JqZWN0Y29lcmNpYmxlXG5cdFJlcXVpcmVPYmplY3RDb2VyY2libGU6IEVTNS5DaGVja09iamVjdENvZXJjaWJsZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNhcnJheVxuXHRJc0FycmF5OiAkQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG5cdFx0cmV0dXJuIHRvU3RyKGFyZ3VtZW50KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNjYWxsYWJsZVxuXHQvLyBJc0NhbGxhYmxlOiBFUzUuSXNDYWxsYWJsZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNjb25zdHJ1Y3RvclxuXHRJc0NvbnN0cnVjdG9yOiBmdW5jdGlvbiBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG5cdFx0cmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gJ2Z1bmN0aW9uJyAmJiAhIWFyZ3VtZW50LnByb3RvdHlwZTsgLy8gdW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIHdheSB0byB0cnVseSBjaGVjayB0aGlzIHdpdGhvdXQgdHJ5L2NhdGNoIGBuZXcgYXJndW1lbnRgXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzZXh0ZW5zaWJsZS1vXG5cdElzRXh0ZW5zaWJsZTogT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zXG5cdFx0PyBmdW5jdGlvbiBJc0V4dGVuc2libGUob2JqKSB7XG5cdFx0XHRpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJGlzRXh0ZW5zaWJsZShvYmopO1xuXHRcdH1cblx0XHQ6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmopIHsgcmV0dXJuIHRydWU7IH0sIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtaXNpbnRlZ2VyXG5cdElzSW50ZWdlcjogZnVuY3Rpb24gSXNJbnRlZ2VyKGFyZ3VtZW50KSB7XG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCAhPT0gJ251bWJlcicgfHwgJGlzTmFOKGFyZ3VtZW50KSB8fCAhJGlzRmluaXRlKGFyZ3VtZW50KSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgYWJzID0gJGFicyhhcmd1bWVudCk7XG5cdFx0cmV0dXJuICRmbG9vcihhYnMpID09PSBhYnM7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWlzcHJvcGVydHlrZXlcblx0SXNQcm9wZXJ0eUtleTogZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuXHRcdHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N5bWJvbCc7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWlzcmVnZXhwXG5cdElzUmVnRXhwOiBmdW5jdGlvbiBJc1JlZ0V4cChhcmd1bWVudCkge1xuXHRcdGlmICghYXJndW1lbnQgfHwgdHlwZW9mIGFyZ3VtZW50ICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoaGFzU3ltYm9scykge1xuXHRcdFx0dmFyIGlzUmVnRXhwID0gYXJndW1lbnRbJFN5bWJvbC5tYXRjaF07XG5cdFx0XHRpZiAodHlwZW9mIGlzUmVnRXhwICE9PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyZXR1cm4gRVM1LlRvQm9vbGVhbihpc1JlZ0V4cCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBoYXNSZWdFeHBNYXRjaGVyKGFyZ3VtZW50KTtcblx0fSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtc2FtZXZhbHVlXG5cdC8vIFNhbWVWYWx1ZTogRVM1LlNhbWVWYWx1ZSxcblxuXHQvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtc2FtZXZhbHVlemVyb1xuXHRTYW1lVmFsdWVaZXJvOiBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcblx0XHRyZXR1cm4gKHggPT09IHkpIHx8ICgkaXNOYU4oeCkgJiYgJGlzTmFOKHkpKTtcblx0fSxcblxuXHQvKipcblx0ICogNy4zLjIgR2V0ViAoViwgUClcblx0ICogMS4gQXNzZXJ0OiBJc1Byb3BlcnR5S2V5KFApIGlzIHRydWUuXG5cdCAqIDIuIExldCBPIGJlIFRvT2JqZWN0KFYpLlxuXHQgKiAzLiBSZXR1cm5JZkFicnVwdChPKS5cblx0ICogNC4gUmV0dXJuIE8uW1tHZXRdXShQLCBWKS5cblx0ICovXG5cdEdldFY6IGZ1bmN0aW9uIEdldFYoViwgUCkge1xuXHRcdC8vIDcuMy4yLjFcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuMi4yLTNcblx0XHR2YXIgTyA9IHRoaXMuVG9PYmplY3QoVik7XG5cblx0XHQvLyA3LjMuMi40XG5cdFx0cmV0dXJuIE9bUF07XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy45IC0gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldG1ldGhvZFxuXHQgKiAxLiBBc3NlcnQ6IElzUHJvcGVydHlLZXkoUCkgaXMgdHJ1ZS5cblx0ICogMi4gTGV0IGZ1bmMgYmUgR2V0VihPLCBQKS5cblx0ICogMy4gUmV0dXJuSWZBYnJ1cHQoZnVuYykuXG5cdCAqIDQuIElmIGZ1bmMgaXMgZWl0aGVyIHVuZGVmaW5lZCBvciBudWxsLCByZXR1cm4gdW5kZWZpbmVkLlxuXHQgKiA1LiBJZiBJc0NhbGxhYmxlKGZ1bmMpIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uXG5cdCAqIDYuIFJldHVybiBmdW5jLlxuXHQgKi9cblx0R2V0TWV0aG9kOiBmdW5jdGlvbiBHZXRNZXRob2QoTywgUCkge1xuXHRcdC8vIDcuMy45LjFcblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS4yXG5cdFx0dmFyIGZ1bmMgPSB0aGlzLkdldFYoTywgUCk7XG5cblx0XHQvLyA3LjMuOS40XG5cdFx0aWYgKGZ1bmMgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHZvaWQgMDtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS41XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoZnVuYykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKFAgKyAnaXMgbm90IGEgZnVuY3Rpb24nKTtcblx0XHR9XG5cblx0XHQvLyA3LjMuOS42XG5cdFx0cmV0dXJuIGZ1bmM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIDcuMy4xIEdldCAoTywgUCkgLSBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtZ2V0LW8tcFxuXHQgKiAxLiBBc3NlcnQ6IFR5cGUoTykgaXMgT2JqZWN0LlxuXHQgKiAyLiBBc3NlcnQ6IElzUHJvcGVydHlLZXkoUCkgaXMgdHJ1ZS5cblx0ICogMy4gUmV0dXJuIE8uW1tHZXRdXShQLCBPKS5cblx0ICovXG5cdEdldDogZnVuY3Rpb24gR2V0KE8sIFApIHtcblx0XHQvLyA3LjMuMS4xXG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0Ly8gNy4zLjEuMlxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogSXNQcm9wZXJ0eUtleShQKSBpcyBub3QgdHJ1ZScpO1xuXHRcdH1cblx0XHQvLyA3LjMuMS4zXG5cdFx0cmV0dXJuIE9bUF07XG5cdH0sXG5cblx0VHlwZTogZnVuY3Rpb24gVHlwZSh4KSB7XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuICdTeW1ib2wnO1xuXHRcdH1cblx0XHRyZXR1cm4gRVM1LlR5cGUoeCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxuXHRTcGVjaWVzQ29uc3RydWN0b3I6IGZ1bmN0aW9uIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgQyA9IE8uY29uc3RydWN0b3I7XG5cdFx0aWYgKHR5cGVvZiBDID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGRlZmF1bHRDb25zdHJ1Y3Rvcjtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShDKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPLmNvbnN0cnVjdG9yIGlzIG5vdCBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0dmFyIFMgPSBoYXNTeW1ib2xzICYmICRTeW1ib2wuc3BlY2llcyA/IENbJFN5bWJvbC5zcGVjaWVzXSA6IHZvaWQgMDtcblx0XHRpZiAoUyA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZGVmYXVsdENvbnN0cnVjdG9yO1xuXHRcdH1cblx0XHRpZiAodGhpcy5Jc0NvbnN0cnVjdG9yKFMpKSB7XG5cdFx0XHRyZXR1cm4gUztcblx0XHR9XG5cdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ25vIGNvbnN0cnVjdG9yIGZvdW5kJyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNvbXBsZXRlcHJvcGVydHlkZXNjcmlwdG9yXG5cdENvbXBsZXRlUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBDb21wbGV0ZVByb3BlcnR5RGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0YXNzZXJ0UmVjb3JkKHRoaXMsICdQcm9wZXJ0eSBEZXNjcmlwdG9yJywgJ0Rlc2MnLCBEZXNjKTtcblxuXHRcdGlmICh0aGlzLklzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykgfHwgdGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tWYWx1ZV1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tWYWx1ZV1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tXcml0YWJsZV1dJykpIHtcblx0XHRcdFx0RGVzY1snW1tXcml0YWJsZV1dJ10gPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCFoYXMoRGVzYywgJ1tbR2V0XV0nKSkge1xuXHRcdFx0XHREZXNjWydbW0dldF1dJ10gPSB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWhhcyhEZXNjLCAnW1tTZXRdXScpKSB7XG5cdFx0XHRcdERlc2NbJ1tbU2V0XV0nXSA9IHZvaWQgMDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbRW51bWVyYWJsZV1dJykpIHtcblx0XHRcdERlc2NbJ1tbRW51bWVyYWJsZV1dJ10gPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFoYXMoRGVzYywgJ1tbQ29uZmlndXJhYmxlXV0nKSkge1xuXHRcdFx0RGVzY1snW1tDb25maWd1cmFibGVdXSddID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiBEZXNjO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1zZXQtby1wLXYtdGhyb3dcblx0U2V0OiBmdW5jdGlvbiBTZXQoTywgUCwgViwgVGhyb3cpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ08gbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdQIG11c3QgYmUgYSBQcm9wZXJ0eSBLZXknKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZShUaHJvdykgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1Rocm93IG11c3QgYmUgYSBCb29sZWFuJyk7XG5cdFx0fVxuXHRcdGlmIChUaHJvdykge1xuXHRcdFx0T1tQXSA9IFY7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0T1tQXSA9IFY7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWhhc293bnByb3BlcnR5XG5cdEhhc093blByb3BlcnR5OiBmdW5jdGlvbiBIYXNPd25Qcm9wZXJ0eShPLCBQKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBoYXMoTywgUCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWhhc3Byb3BlcnR5XG5cdEhhc1Byb3BlcnR5OiBmdW5jdGlvbiBIYXNQcm9wZXJ0eShPLCBQKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdPIG11c3QgYmUgYW4gT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHJldHVybiBQIGluIE87XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWlzY29uY2F0c3ByZWFkYWJsZVxuXHRJc0NvbmNhdFNwcmVhZGFibGU6IGZ1bmN0aW9uIElzQ29uY2F0U3ByZWFkYWJsZShPKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKGhhc1N5bWJvbHMgJiYgdHlwZW9mICRTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlID09PSAnc3ltYm9sJykge1xuXHRcdFx0dmFyIHNwcmVhZGFibGUgPSB0aGlzLkdldChPLCBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlKTtcblx0XHRcdGlmICh0eXBlb2Ygc3ByZWFkYWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHNwcmVhZGFibGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5Jc0FycmF5KE8pO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pbnZva2Vcblx0SW52b2tlOiBmdW5jdGlvbiBJbnZva2UoTywgUCkge1xuXHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KFApKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUCBtdXN0IGJlIGEgUHJvcGVydHkgS2V5Jyk7XG5cdFx0fVxuXHRcdHZhciBhcmd1bWVudHNMaXN0ID0gYXJyYXlTbGljZShhcmd1bWVudHMsIDIpO1xuXHRcdHZhciBmdW5jID0gdGhpcy5HZXRWKE8sIFApO1xuXHRcdHJldHVybiB0aGlzLkNhbGwoZnVuYywgTywgYXJndW1lbnRzTGlzdCk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWdldGl0ZXJhdG9yXG5cdEdldEl0ZXJhdG9yOiBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmosIG1ldGhvZCkge1xuXHRcdGlmICghaGFzU3ltYm9scykge1xuXHRcdFx0dGhyb3cgbmV3IFN5bnRheEVycm9yKCdFUy5HZXRJdGVyYXRvciBkZXBlbmRzIG9uIG5hdGl2ZSBpdGVyYXRvciBzdXBwb3J0LicpO1xuXHRcdH1cblxuXHRcdHZhciBhY3R1YWxNZXRob2QgPSBtZXRob2Q7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG5cdFx0XHRhY3R1YWxNZXRob2QgPSB0aGlzLkdldE1ldGhvZChvYmosICRTeW1ib2wuaXRlcmF0b3IpO1xuXHRcdH1cblx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLkNhbGwoYWN0dWFsTWV0aG9kLCBvYmopO1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVyYXRvcjtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JuZXh0XG5cdEl0ZXJhdG9yTmV4dDogZnVuY3Rpb24gSXRlcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWx1ZSkge1xuXHRcdHZhciByZXN1bHQgPSB0aGlzLkludm9rZShpdGVyYXRvciwgJ25leHQnLCBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFtdIDogW3ZhbHVlXSk7XG5cdFx0aWYgKHRoaXMuVHlwZShyZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIG5leHQgbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY29tcGxldGVcblx0SXRlcmF0b3JDb21wbGV0ZTogZnVuY3Rpb24gSXRlcmF0b3JDb21wbGV0ZShpdGVyUmVzdWx0KSB7XG5cdFx0aWYgKHRoaXMuVHlwZShpdGVyUmVzdWx0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKGl0ZXJSZXN1bHQpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuVG9Cb29sZWFuKHRoaXMuR2V0KGl0ZXJSZXN1bHQsICdkb25lJykpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1pdGVyYXRvcnZhbHVlXG5cdEl0ZXJhdG9yVmFsdWU6IGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlclJlc3VsdCkgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShpdGVyUmVzdWx0KSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLkdldChpdGVyUmVzdWx0LCAndmFsdWUnKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXRlcmF0b3JzdGVwXG5cdEl0ZXJhdG9yU3RlcDogZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuSXRlcmF0b3JOZXh0KGl0ZXJhdG9yKTtcblx0XHR2YXIgZG9uZSA9IHRoaXMuSXRlcmF0b3JDb21wbGV0ZShyZXN1bHQpO1xuXHRcdHJldHVybiBkb25lID09PSB0cnVlID8gZmFsc2UgOiByZXN1bHQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWl0ZXJhdG9yY2xvc2Vcblx0SXRlcmF0b3JDbG9zZTogZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikge1xuXHRcdGlmICh0aGlzLlR5cGUoaXRlcmF0b3IpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoaXRlcmF0b3IpIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ2FsbGFibGUoY29tcGxldGlvbikpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBjb21wbGV0aW9uIGlzIG5vdCBhIHRodW5rIGZvciBhIENvbXBsZXRpb24gUmVjb3JkJyk7XG5cdFx0fVxuXHRcdHZhciBjb21wbGV0aW9uVGh1bmsgPSBjb21wbGV0aW9uO1xuXG5cdFx0dmFyIGl0ZXJhdG9yUmV0dXJuID0gdGhpcy5HZXRNZXRob2QoaXRlcmF0b3IsICdyZXR1cm4nKTtcblxuXHRcdGlmICh0eXBlb2YgaXRlcmF0b3JSZXR1cm4gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gY29tcGxldGlvblRodW5rKCk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbXBsZXRpb25SZWNvcmQ7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBpbm5lclJlc3VsdCA9IHRoaXMuQ2FsbChpdGVyYXRvclJldHVybiwgaXRlcmF0b3IsIFtdKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHQvLyBpZiB3ZSBoaXQgaGVyZSwgdGhlbiBcImVcIiBpcyB0aGUgaW5uZXJSZXN1bHQgY29tcGxldGlvbiB0aGF0IG5lZWRzIHJlLXRocm93aW5nXG5cblx0XHRcdC8vIGlmIHRoZSBjb21wbGV0aW9uIGlzIG9mIHR5cGUgXCJ0aHJvd1wiLCB0aGlzIHdpbGwgdGhyb3cuXG5cdFx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7XG5cdFx0XHRjb21wbGV0aW9uVGh1bmsgPSBudWxsOyAvLyBlbnN1cmUgaXQncyBub3QgY2FsbGVkIHR3aWNlLlxuXG5cdFx0XHQvLyBpZiBub3QsIHRoZW4gcmV0dXJuIHRoZSBpbm5lclJlc3VsdCBjb21wbGV0aW9uXG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0XHRjb21wbGV0aW9uUmVjb3JkID0gY29tcGxldGlvblRodW5rKCk7IC8vIGlmIGlubmVyUmVzdWx0IHdvcmtlZCwgdGhlbiB0aHJvdyBpZiB0aGUgY29tcGxldGlvbiBkb2VzXG5cdFx0Y29tcGxldGlvblRodW5rID0gbnVsbDsgLy8gZW5zdXJlIGl0J3Mgbm90IGNhbGxlZCB0d2ljZS5cblxuXHRcdGlmICh0aGlzLlR5cGUoaW5uZXJSZXN1bHQpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ2l0ZXJhdG9yIC5yZXR1cm4gbXVzdCByZXR1cm4gYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBsZXRpb25SZWNvcmQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWNyZWF0ZWl0ZXJyZXN1bHRvYmplY3Rcblx0Q3JlYXRlSXRlclJlc3VsdE9iamVjdDogZnVuY3Rpb24gQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh2YWx1ZSwgZG9uZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoZG9uZSkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoZG9uZSkgaXMgbm90IEJvb2xlYW4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRvbmU6IGRvbmVcblx0XHR9O1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1yZWdleHBleGVjXG5cdFJlZ0V4cEV4ZWM6IGZ1bmN0aW9uIFJlZ0V4cEV4ZWMoUiwgUykge1xuXHRcdGlmICh0aGlzLlR5cGUoUikgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUiBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5UeXBlKFMpICE9PSAnU3RyaW5nJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1MgbXVzdCBiZSBhIFN0cmluZycpO1xuXHRcdH1cblx0XHR2YXIgZXhlYyA9IHRoaXMuR2V0KFIsICdleGVjJyk7XG5cdFx0aWYgKHRoaXMuSXNDYWxsYWJsZShleGVjKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMuQ2FsbChleGVjLCBSLCBbU10pO1xuXHRcdFx0aWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0aGlzLlR5cGUocmVzdWx0KSA9PT0gJ09iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdcImV4ZWNcIiBtZXRob2QgbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIE9iamVjdCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVnZXhFeGVjKFIsIFMpO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcblx0QXJyYXlTcGVjaWVzQ3JlYXRlOiBmdW5jdGlvbiBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG5cdFx0aWYgKCF0aGlzLklzSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDAnKTtcblx0XHR9XG5cdFx0dmFyIGxlbiA9IGxlbmd0aCA9PT0gMCA/IDAgOiBsZW5ndGg7XG5cdFx0dmFyIEM7XG5cdFx0dmFyIGlzQXJyYXkgPSB0aGlzLklzQXJyYXkob3JpZ2luYWxBcnJheSk7XG5cdFx0aWYgKGlzQXJyYXkpIHtcblx0XHRcdEMgPSB0aGlzLkdldChvcmlnaW5hbEFycmF5LCAnY29uc3RydWN0b3InKTtcblx0XHRcdC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjcm9zcy1yZWFsbSBub3JtYWwgQXJyYXksIGEgc2FtZS1yZWFsbSBBcnJheVxuXHRcdFx0Ly8gaWYgKHRoaXMuSXNDb25zdHJ1Y3RvcihDKSkge1xuXHRcdFx0Ly8gXHRpZiBDIGlzIGFub3RoZXIgcmVhbG0ncyBBcnJheSwgQyA9IHVuZGVmaW5lZFxuXHRcdFx0Ly8gXHRPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihBcnJheSkpKSA9PT0gbnVsbCA/XG5cdFx0XHQvLyB9XG5cdFx0XHRpZiAodGhpcy5UeXBlKEMpID09PSAnT2JqZWN0JyAmJiBoYXNTeW1ib2xzICYmICRTeW1ib2wuc3BlY2llcykge1xuXHRcdFx0XHRDID0gdGhpcy5HZXQoQywgJFN5bWJvbC5zcGVjaWVzKTtcblx0XHRcdFx0aWYgKEMgPT09IG51bGwpIHtcblx0XHRcdFx0XHRDID0gdm9pZCAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiAkQXJyYXkobGVuKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzQ29uc3RydWN0b3IoQykpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdDIG11c3QgYmUgYSBjb25zdHJ1Y3RvcicpO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IEMobGVuKTsgLy8gdGhpcy5Db25zdHJ1Y3QoQywgbGVuKTtcblx0fSxcblxuXHRDcmVhdGVEYXRhUHJvcGVydHk6IGZ1bmN0aW9uIENyZWF0ZURhdGFQcm9wZXJ0eShPLCBQLCBWKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXHRcdHZhciBvbGREZXNjID0gJGdPUEQoTywgUCk7XG5cdFx0dmFyIGV4dGVuc2libGUgPSBvbGREZXNjIHx8ICh0eXBlb2YgJGlzRXh0ZW5zaWJsZSAhPT0gJ2Z1bmN0aW9uJyB8fCAkaXNFeHRlbnNpYmxlKE8pKTtcblx0XHR2YXIgaW1tdXRhYmxlID0gb2xkRGVzYyAmJiAoIW9sZERlc2Mud3JpdGFibGUgfHwgIW9sZERlc2MuY29uZmlndXJhYmxlKTtcblx0XHRpZiAoaW1tdXRhYmxlIHx8ICFleHRlbnNpYmxlKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHZhciBuZXdEZXNjID0ge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBWLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9O1xuXHRcdCRkZWZpbmVQcm9wZXJ0eShPLCBQLCBuZXdEZXNjKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY3JlYXRlZGF0YXByb3BlcnR5b3J0aHJvd1xuXHRDcmVhdGVEYXRhUHJvcGVydHlPclRocm93OiBmdW5jdGlvbiBDcmVhdGVEYXRhUHJvcGVydHlPclRocm93KE8sIFAsIFYpIHtcblx0XHRpZiAodGhpcy5UeXBlKE8pICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFR5cGUoTykgaXMgbm90IE9iamVjdCcpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cdFx0dmFyIHN1Y2Nlc3MgPSB0aGlzLkNyZWF0ZURhdGFQcm9wZXJ0eShPLCBQLCBWKTtcblx0XHRpZiAoIXN1Y2Nlc3MpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCd1bmFibGUgdG8gY3JlYXRlIGRhdGEgcHJvcGVydHknKTtcblx0XHR9XG5cdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3RjcmVhdGVcblx0T2JqZWN0Q3JlYXRlOiBmdW5jdGlvbiBPYmplY3RDcmVhdGUocHJvdG8sIGludGVybmFsU2xvdHNMaXN0KSB7XG5cdFx0aWYgKHByb3RvICE9PSBudWxsICYmIHRoaXMuVHlwZShwcm90bykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogcHJvdG8gbXVzdCBiZSBudWxsIG9yIGFuIG9iamVjdCcpO1xuXHRcdH1cblx0XHR2YXIgc2xvdHMgPSBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IFtdIDogaW50ZXJuYWxTbG90c0xpc3Q7XG5cdFx0aWYgKHNsb3RzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2VzLWFic3RyYWN0IGRvZXMgbm90IHlldCBzdXBwb3J0IGludGVybmFsIHNsb3RzJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHByb3RvID09PSBudWxsICYmICEkT2JqZWN0Q3JlYXRlKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCduYXRpdmUgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBudWxsIG9iamVjdHMnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJE9iamVjdENyZWF0ZShwcm90byk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFkdmFuY2VzdHJpbmdpbmRleFxuXHRBZHZhbmNlU3RyaW5nSW5kZXg6IGZ1bmN0aW9uIEFkdmFuY2VTdHJpbmdJbmRleChTLCBpbmRleCwgdW5pY29kZSkge1xuXHRcdGlmICh0aGlzLlR5cGUoUykgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignUyBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5Jc0ludGVnZXIoaW5kZXgpIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyID49IDAgYW5kIDw9IDIqKjUzJyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLlR5cGUodW5pY29kZSkgIT09ICdCb29sZWFuJykge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHVuaWNvZGUgbXVzdCBiZSBhIEJvb2xlYW4nKTtcblx0XHR9XG5cdFx0aWYgKCF1bmljb2RlKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblx0XHR2YXIgbGVuZ3RoID0gUy5sZW5ndGg7XG5cdFx0aWYgKChpbmRleCArIDEpID49IGxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGluZGV4ICsgMTtcblx0XHR9XG5cblx0XHR2YXIgZmlyc3QgPSAkY2hhckNvZGVBdChTLCBpbmRleCk7XG5cdFx0aWYgKGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHZhciBzZWNvbmQgPSAkY2hhckNvZGVBdChTLCBpbmRleCArIDEpO1xuXHRcdGlmIChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggKyAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBpbmRleCArIDI7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1jcmVhdGVtZXRob2Rwcm9wZXJ0eVxuXHRDcmVhdGVNZXRob2RQcm9wZXJ0eTogZnVuY3Rpb24gQ3JlYXRlTWV0aG9kUHJvcGVydHkoTywgUCwgVikge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0dmFyIG5ld0Rlc2MgPSB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdHZhbHVlOiBWLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9O1xuXHRcdHJldHVybiAhISRkZWZpbmVQcm9wZXJ0eShPLCBQLCBuZXdEZXNjKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWRlZmluZXByb3BlcnR5b3J0aHJvd1xuXHREZWZpbmVQcm9wZXJ0eU9yVGhyb3c6IGZ1bmN0aW9uIERlZmluZVByb3BlcnR5T3JUaHJvdyhPLCBQLCBkZXNjKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBUeXBlKE8pIGlzIG5vdCBPYmplY3QnKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNQcm9wZXJ0eUtleShQKSkge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IElzUHJvcGVydHlLZXkoUCkgaXMgbm90IHRydWUnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gISEkZGVmaW5lUHJvcGVydHkoTywgUCwgZGVzYyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1kZWxldGVwcm9wZXJ0eW9ydGhyb3dcblx0RGVsZXRlUHJvcGVydHlPclRocm93OiBmdW5jdGlvbiBEZWxldGVQcm9wZXJ0eU9yVGhyb3coTywgUCkge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLklzUHJvcGVydHlLZXkoUCkpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBJc1Byb3BlcnR5S2V5KFApIGlzIG5vdCB0cnVlJyk7XG5cdFx0fVxuXG5cdFx0dmFyIHN1Y2Nlc3MgPSBkZWxldGUgT1tQXTtcblx0XHRpZiAoIXN1Y2Nlc3MpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0F0dGVtcHQgdG8gZGVsZXRlIHByb3BlcnR5IGZhaWxlZC4nKTtcblx0XHR9XG5cdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1lbnVtZXJhYmxlb3dubmFtZXNcblx0RW51bWVyYWJsZU93bk5hbWVzOiBmdW5jdGlvbiBFbnVtZXJhYmxlT3duTmFtZXMoTykge1xuXHRcdGlmICh0aGlzLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogVHlwZShPKSBpcyBub3QgT2JqZWN0Jyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGtleXMoTyk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW51bWJlci1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNOdW1iZXJWYWx1ZTogZnVuY3Rpb24gdGhpc051bWJlclZhbHVlKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdOdW1iZXInKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICROdW1iZXJWYWx1ZU9mKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtYm9vbGVhbi1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNCb29sZWFuVmFsdWU6IGZ1bmN0aW9uIHRoaXNCb29sZWFuVmFsdWUodmFsdWUpIHtcblx0XHRpZiAodGhpcy5UeXBlKHZhbHVlKSA9PT0gJ0Jvb2xlYW4nKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICRCb29sZWFuVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLXN0cmluZy1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNTdHJpbmdWYWx1ZTogZnVuY3Rpb24gdGhpc1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdTdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICRTdHJpbmdWYWx1ZU9mKHZhbHVlKTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtZGF0ZS1wcm90b3R5cGUtb2JqZWN0XG5cdHRoaXNUaW1lVmFsdWU6IGZ1bmN0aW9uIHRoaXNUaW1lVmFsdWUodmFsdWUpIHtcblx0XHRyZXR1cm4gJERhdGVWYWx1ZU9mKHZhbHVlKTtcblx0fVxufSk7XG5cbmRlbGV0ZSBFUzYuQ2hlY2tPYmplY3RDb2VyY2libGU7IC8vIHJlbmFtZWQgaW4gRVM2IHRvIFJlcXVpcmVPYmplY3RDb2VyY2libGVcblxubW9kdWxlLmV4cG9ydHMgPSBFUzY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUzIwMTUgPSByZXF1aXJlKCcuL2VzMjAxNScpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4vaGVscGVycy9hc3NpZ24nKTtcblxudmFyIEVTMjAxNiA9IGFzc2lnbihhc3NpZ24oe30sIEVTMjAxNSksIHtcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvZWNtYTI2Mi9wdWxsLzYwXG5cdFNhbWVWYWx1ZU5vbk51bWJlcjogZnVuY3Rpb24gU2FtZVZhbHVlTm9uTnVtYmVyKHgsIHkpIHtcblx0XHRpZiAodHlwZW9mIHggPT09ICdudW1iZXInIHx8IHR5cGVvZiB4ICE9PSB0eXBlb2YgeSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignU2FtZVZhbHVlTm9uTnVtYmVyIHJlcXVpcmVzIHR3byBub24tbnVtYmVyIHZhbHVlcyBvZiB0aGUgc2FtZSB0eXBlLicpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5TYW1lVmFsdWUoeCwgeSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVTMjAxNjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXF1aXJlUHJvbWlzZSgpIHtcblx0aWYgKHR5cGVvZiBQcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlgIHJlcXVpcmVzIGEgZ2xvYmFsIGBQcm9taXNlYCBiZSBhdmFpbGFibGUuJyk7XG5cdH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG5cbnZhciBFUzUgPSByZXF1aXJlKCcuL2VzNScpO1xudmFyIEVTMjAxNSA9IHJlcXVpcmUoJy4vZXMyMDE1Jyk7XG52YXIgRVMyMDE2ID0gcmVxdWlyZSgnLi9lczIwMTYnKTtcbnZhciBFUzIwMTcgPSByZXF1aXJlKCcuL2VzMjAxNycpO1xudmFyIEVTMjAxOCA9IHJlcXVpcmUoJy4vZXMyMDE4Jyk7XG5cbnZhciBFUyA9IHtcblx0RVM1OiBFUzUsXG5cdEVTNjogRVMyMDE1LFxuXHRFUzIwMTU6IEVTMjAxNSxcblx0RVM3OiBFUzIwMTYsXG5cdEVTMjAxNjogRVMyMDE2LFxuXHRFUzIwMTc6IEVTMjAxNyxcblx0RVMyMDE4OiBFUzIwMThcbn07XG5hc3NpZ24oRVMsIEVTNSk7XG5kZWxldGUgRVMuQ2hlY2tPYmplY3RDb2VyY2libGU7IC8vIHJlbmFtZWQgaW4gRVM2IHRvIFJlcXVpcmVPYmplY3RDb2VyY2libGVcbmFzc2lnbihFUywgRVMyMDE1KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFUztcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZXF1aXJlUHJvbWlzZSgpIHtcblx0aWYgKHR5cGVvZiBQcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYFByb21pc2UuYWxsU2V0dGxlZGAgcmVxdWlyZXMgYSBnbG9iYWwgYFByb21pc2VgIGJlIGF2YWlsYWJsZS4nKTtcblx0fVxuXHRpZiAodHlwZW9mIEFycmF5LmZyb20gIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdgUHJvbWlzZS5hbGxTZXR0bGVkYCByZXF1aXJlcyBgQXJyYXkuZnJvbWAgYmUgYXZhaWxhYmxlLicpO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKGtleSk7XG4gIGlmIChwcm9wZXJ0eUtleSBpbiBvYmplY3QpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYob2JqZWN0LCBwcm9wZXJ0eUtleSwgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGV4aXN0ID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZXhpc3QgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBoaWRlKGdsb2JhbCwga2V5LCB2YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZ2xvYmFsW2tleV0gPSB2YWx1ZTtcbiAgfSByZXR1cm4gdmFsdWU7XG59O1xuIiwiLy8gSUU4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IFtcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAndG9Mb2NhbGVTdHJpbmcnLFxuICAndG9TdHJpbmcnLFxuICAndmFsdWVPZidcbl07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBjcmVhdGVJdGVyYXRvckNvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3RvcicpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZGVmaW5lJyk7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSXRlcmF0b3JzQ29yZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gSXRlcmF0b3JzQ29yZS5JdGVyYXRvclByb3RvdHlwZTtcbnZhciBCVUdHWV9TQUZBUklfSVRFUkFUT1JTID0gSXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG52YXIgRU5UUklFUyA9ICdlbnRyaWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYWJsZSwgTkFNRSwgSXRlcmF0b3JDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcihJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcblxuICB2YXIgZ2V0SXRlcmF0aW9uTWV0aG9kID0gZnVuY3Rpb24gKEtJTkQpIHtcbiAgICBpZiAoS0lORCA9PT0gREVGQVVMVCAmJiBkZWZhdWx0SXRlcmF0b3IpIHJldHVybiBkZWZhdWx0SXRlcmF0b3I7XG4gICAgaWYgKCFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIEtJTkQgaW4gSXRlcmFibGVQcm90b3R5cGUpIHJldHVybiBJdGVyYWJsZVByb3RvdHlwZVtLSU5EXTtcbiAgICBzd2l0Y2ggKEtJTkQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgSXRlcmF0b3JDb25zdHJ1Y3Rvcih0aGlzLCBLSU5EKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIEVOVFJJRVM6IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcyk7IH07XG4gIH07XG5cbiAgdmFyIFRPX1NUUklOR19UQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSBmYWxzZTtcbiAgdmFyIEl0ZXJhYmxlUHJvdG90eXBlID0gSXRlcmFibGUucHJvdG90eXBlO1xuICB2YXIgbmF0aXZlSXRlcmF0b3IgPSBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl1cbiAgICB8fCBJdGVyYWJsZVByb3RvdHlwZVsnQEBpdGVyYXRvciddXG4gICAgfHwgREVGQVVMVCAmJiBJdGVyYWJsZVByb3RvdHlwZVtERUZBVUxUXTtcbiAgdmFyIGRlZmF1bHRJdGVyYXRvciA9ICFCVUdHWV9TQUZBUklfSVRFUkFUT1JTICYmIG5hdGl2ZUl0ZXJhdG9yIHx8IGdldEl0ZXJhdGlvbk1ldGhvZChERUZBVUxUKTtcbiAgdmFyIGFueU5hdGl2ZUl0ZXJhdG9yID0gTkFNRSA9PSAnQXJyYXknID8gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcyB8fCBuYXRpdmVJdGVyYXRvciA6IG5hdGl2ZUl0ZXJhdG9yO1xuICB2YXIgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBtZXRob2RzLCBLRVk7XG5cbiAgLy8gZml4IG5hdGl2ZVxuICBpZiAoYW55TmF0aXZlSXRlcmF0b3IpIHtcbiAgICBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbnlOYXRpdmVJdGVyYXRvci5jYWxsKG5ldyBJdGVyYWJsZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICBpZiAoIUlTX1BVUkUgJiYgZ2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlKSAhPT0gSXRlcmF0b3JQcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJdGVyYXRvclByb3RvdHlwZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZVtJVEVSQVRPUl0gIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGhpZGUoQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgVE9fU1RSSU5HX1RBRywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICBpZiAoSVNfUFVSRSkgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgICB9XG4gIH1cblxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZBVUxUID09IFZBTFVFUyAmJiBuYXRpdmVJdGVyYXRvciAmJiBuYXRpdmVJdGVyYXRvci5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgPSB0cnVlO1xuICAgIGRlZmF1bHRJdGVyYXRvciA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5hdGl2ZUl0ZXJhdG9yLmNhbGwodGhpcyk7IH07XG4gIH1cblxuICAvLyBkZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghSVNfUFVSRSB8fCBGT1JDRUQpICYmIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SXSAhPT0gZGVmYXVsdEl0ZXJhdG9yKSB7XG4gICAgaGlkZShJdGVyYWJsZVByb3RvdHlwZSwgSVRFUkFUT1IsIGRlZmF1bHRJdGVyYXRvcik7XG4gIH1cbiAgSXRlcmF0b3JzW05BTUVdID0gZGVmYXVsdEl0ZXJhdG9yO1xuXG4gIC8vIGV4cG9ydCBhZGRpdGlvbmFsIG1ldGhvZHNcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBnZXRJdGVyYXRpb25NZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/IGRlZmF1bHRJdGVyYXRvciA6IGdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6IGdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKVxuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChLRVkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMgfHwgSU5DT1JSRUNUX1ZBTFVFU19OQU1FIHx8ICEoS0VZIGluIEl0ZXJhYmxlUHJvdG90eXBlKSkge1xuICAgICAgICByZWRlZmluZShJdGVyYWJsZVByb3RvdHlwZSwgS0VZLCBtZXRob2RzW0tFWV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSAkZXhwb3J0KHsgdGFyZ2V0OiBOQU1FLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB9LCBtZXRob2RzKTtcbiAgfVxuXG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICBGLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGw7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYoKSkgIT09IEYucHJvdG90eXBlO1xufSk7XG4iLCJ2YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnaXRlcmF0b3InKTtcbnZhciBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIGNhbGxlZCA9IDA7XG4gIHZhciBpdGVyYXRvcldpdGhSZXR1cm4gPSB7XG4gICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHsgZG9uZTogISFjYWxsZWQrKyB9O1xuICAgIH0sXG4gICAgJ3JldHVybic6IGZ1bmN0aW9uICgpIHtcbiAgICAgIFNBRkVfQ0xPU0lORyA9IHRydWU7XG4gICAgfVxuICB9O1xuICBpdGVyYXRvcldpdGhSZXR1cm5bSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYywgU0tJUF9DTE9TSU5HKSB7XG4gIGlmICghU0tJUF9DTE9TSU5HICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIElURVJBVElPTl9TVVBQT1JUID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIG9iamVjdFtJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogSVRFUkFUSU9OX1NVUFBPUlQgPSB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICBleGVjKG9iamVjdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIElURVJBVElPTl9TVVBQT1JUO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbE1hcCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2RzJykoMSk7XG5cbnZhciBTUEVDSUVTX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKSgnbWFwJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUubWFwYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5tYXBcbi8vIHdpdGggYWRkaW5nIHN1cHBvcnQgb2YgQEBzcGVjaWVzXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6ICFTUEVDSUVTX1NVUFBPUlQgfSwge1xuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiBpbnRlcm5hbE1hcCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBpbnRlcm5hbFJlZHVjZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1yZWR1Y2UnKTtcblxudmFyIFNMT1BQWV9NRVRIT0QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCcpKCdyZWR1Y2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBTTE9QUFlfTUVUSE9EIH0sIHtcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiBpbnRlcm5hbFJlZHVjZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNbMV0sIGZhbHNlKTtcbiAgfVxufSk7XG4iLCJ2YXIgb2JqZWN0VG9BcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtdG8tYXJyYXknKTtcblxuLy8gYE9iamVjdC5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5lbnRyaWVzXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhPKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvQXJyYXkoTywgdHJ1ZSk7XG4gIH1cbn0pO1xuIiwidmFyIG9iamVjdFRvQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXRvLWFycmF5Jyk7XG5cbi8vIGBPYmplY3QudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC52YWx1ZXNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcyhPKSB7XG4gICAgcmV0dXJuIG9iamVjdFRvQXJyYXkoTyk7XG4gIH1cbn0pO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGUgPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgRnVuY3Rpb25Qcm90b3R5cGVUb1N0cmluZyA9IEZ1bmN0aW9uUHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyBGdW5jdGlvbiBpbnN0YW5jZXMgYC5uYW1lYCBwcm9wZXJ0eVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnVuY3Rpb24taW5zdGFuY2VzLW5hbWVcbmlmIChERVNDUklQVE9SUyAmJiAhKE5BTUUgaW4gRnVuY3Rpb25Qcm90b3R5cGUpKSB7XG4gIGRlZmluZVByb3BlcnR5KEZ1bmN0aW9uUHJvdG90eXBlLCBOQU1FLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uUHJvdG90eXBlVG9TdHJpbmcuY2FsbCh0aGlzKS5tYXRjaChuYW1lUkUpWzFdO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaW50ZXJuYWxGaWx0ZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kcycpKDIpO1xuXG52YXIgU1BFQ0lFU19TVVBQT1JUID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZC1oYXMtc3BlY2llcy1zdXBwb3J0JykoJ2ZpbHRlcicpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZmlsdGVyXG4vLyB3aXRoIGFkZGluZyBzdXBwb3J0IG9mIEBAc3BlY2llc1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhU1BFQ0lFU19TVVBQT1JUIH0sIHtcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gaW50ZXJuYWxGaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnc3BlY2llcycpO1xudmFyIG5hdGl2ZVNsaWNlID0gW10uc2xpY2U7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG5cbnZhciBTUEVDSUVTX1NVUFBPUlQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kLWhhcy1zcGVjaWVzLXN1cHBvcnQnKSgnc2xpY2UnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5zbGljZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc2xpY2Vcbi8vIGZhbGxiYWNrIGZvciBub3QgYXJyYXktbGlrZSBFUzMgc3RyaW5ncyBhbmQgRE9NIG9iamVjdHNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogIVNQRUNJRVNfU1VQUE9SVCB9LCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QodGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgayA9IHRvQWJzb2x1dGVJbmRleChzdGFydCwgbGVuZ3RoKTtcbiAgICB2YXIgZmluID0gdG9BYnNvbHV0ZUluZGV4KGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kLCBsZW5ndGgpO1xuICAgIC8vIGlubGluZSBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBmb3IgdXNhZ2UgbmF0aXZlIGBBcnJheSNzbGljZWAgd2hlcmUgaXQncyBwb3NzaWJsZVxuICAgIHZhciBDb25zdHJ1Y3RvciwgcmVzdWx0LCBuO1xuICAgIGlmIChpc0FycmF5KE8pKSB7XG4gICAgICBDb25zdHJ1Y3RvciA9IE8uY29uc3RydWN0b3I7XG4gICAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgICAgaWYgKHR5cGVvZiBDb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIChDb25zdHJ1Y3RvciA9PT0gQXJyYXkgfHwgaXNBcnJheShDb25zdHJ1Y3Rvci5wcm90b3R5cGUpKSkge1xuICAgICAgICBDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIENvbnN0cnVjdG9yID0gQ29uc3RydWN0b3JbU1BFQ0lFU107XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvciA9PT0gbnVsbCkgQ29uc3RydWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IgPT09IEFycmF5IHx8IENvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZVNsaWNlLmNhbGwoTywgaywgZmluKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ID0gbmV3IChDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDb25zdHJ1Y3RvcikobWF4KGZpbiAtIGssIDApKTtcbiAgICBmb3IgKG4gPSAwOyBrIDwgZmluOyBrKyssIG4rKykgaWYgKGsgaW4gTykgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBuLCBPW2tdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNldCA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXIgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG5cbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuXG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldCB8fCAhY2xlYXIpIHtcbiAgc2V0ID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soYmluZChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhiaW5kKHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGJpbmQocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoYmluZChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGNsZWFyOiBjbGVhclxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWxlbmd0aCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpKFxuICAnbWF0Y2gnLFxuICAxLFxuICBmdW5jdGlvbiAoTUFUQ0gsIG5hdGl2ZU1hdGNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5tYXRjaFxuICAgICAgZnVuY3Rpb24gbWF0Y2gocmVnZXhwKSB7XG4gICAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgICAgdmFyIG1hdGNoZXIgPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIgIT09IHVuZGVmaW5lZCA/IG1hdGNoZXIuY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICAgICAgfSxcbiAgICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAbWF0Y2hdYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBtYXRjaFxuICAgICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKG5hdGl2ZU1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG5cbiAgICAgICAgaWYgKCFyeC5nbG9iYWwpIHJldHVybiByZWdFeHBFeGVjKHJ4LCBTKTtcblxuICAgICAgICB2YXIgZnVsbFVuaWNvZGUgPSByeC51bmljb2RlO1xuICAgICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgICB2YXIgQSA9IFtdO1xuICAgICAgICB2YXIgbiA9IDA7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHdoaWxlICgocmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUykpICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICAgICAgbisrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuID09PSAwID8gbnVsbCA6IEE7XG4gICAgICB9XG4gICAgXTtcbiAgfVxuKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcblxuLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gY29kZVBvaW50QXQoUywgaW5kZXgsIHRydWUpLmxlbmd0aCA6IDEpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgc2FtZVZhbHVlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NhbWUtdmFsdWUnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAc2VhcmNoIGxvZ2ljXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpKFxuICAnc2VhcmNoJyxcbiAgMSxcbiAgZnVuY3Rpb24gKFNFQVJDSCwgbmF0aXZlU2VhcmNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc2VhcmNoYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc2VhcmNoXG4gICAgICBmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgICAgIHZhciBPID0gcmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgICAgdmFyIHNlYXJjaGVyID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtTRUFSQ0hdO1xuICAgICAgICByZXR1cm4gc2VhcmNoZXIgIT09IHVuZGVmaW5lZCA/IHNlYXJjaGVyLmNhbGwocmVnZXhwLCBPKSA6IG5ldyBSZWdFeHAocmVnZXhwKVtTRUFSQ0hdKFN0cmluZyhPKSk7XG4gICAgICB9LFxuICAgICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdYCBtZXRob2RcbiAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzZWFyY2hcbiAgICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVTZWFyY2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcblxuICAgICAgICB2YXIgcHJldmlvdXNMYXN0SW5kZXggPSByeC5sYXN0SW5kZXg7XG4gICAgICAgIGlmICghc2FtZVZhbHVlKHByZXZpb3VzTGFzdEluZGV4LCAwKSkgcngubGFzdEluZGV4ID0gMDtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAoIXNhbWVWYWx1ZShyeC5sYXN0SW5kZXgsIHByZXZpb3VzTGFzdEluZGV4KSkgcngubGFzdEluZGV4ID0gcHJldmlvdXNMYXN0SW5kZXg7XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgPyAtMSA6IHJlc3VsdC5pbmRleDtcbiAgICAgIH1cbiAgICBdO1xuICB9XG4pO1xuIiwiKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcubWVtb2l6ZXJpZmljID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmb3JjZVNpbWlsYXIpIHtcblx0aWYgKHR5cGVvZiBNYXAgIT09ICdmdW5jdGlvbicgfHwgZm9yY2VTaW1pbGFyKSB7XG5cdFx0dmFyIFNpbWlsYXIgPSBfZGVyZXFfKCcuL3NpbWlsYXInKTtcblx0XHRyZXR1cm4gbmV3IFNpbWlsYXIoKTtcblx0fVxuXHRlbHNlIHtcblx0XHRyZXR1cm4gbmV3IE1hcCgpO1xuXHR9XG59XG5cbn0se1wiLi9zaW1pbGFyXCI6Mn1dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gU2ltaWxhcigpIHtcblx0dGhpcy5saXN0ID0gW107XG5cdHRoaXMubGFzdEl0ZW0gPSB1bmRlZmluZWQ7XG5cdHRoaXMuc2l6ZSA9IDA7XG5cblx0cmV0dXJuIHRoaXM7XG59XG5cblNpbWlsYXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSkge1xuXHR2YXIgaW5kZXg7XG5cblx0aWYgKHRoaXMubGFzdEl0ZW0gJiYgdGhpcy5pc0VxdWFsKHRoaXMubGFzdEl0ZW0ua2V5LCBrZXkpKSB7XG5cdFx0cmV0dXJuIHRoaXMubGFzdEl0ZW0udmFsO1xuXHR9XG5cblx0aW5kZXggPSB0aGlzLmluZGV4T2Yoa2V5KTtcblx0aWYgKGluZGV4ID49IDApIHtcblx0XHR0aGlzLmxhc3RJdGVtID0gdGhpcy5saXN0W2luZGV4XTtcblx0XHRyZXR1cm4gdGhpcy5saXN0W2luZGV4XS52YWw7XG5cdH1cblxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuU2ltaWxhci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oa2V5LCB2YWwpIHtcblx0dmFyIGluZGV4O1xuXG5cdGlmICh0aGlzLmxhc3RJdGVtICYmIHRoaXMuaXNFcXVhbCh0aGlzLmxhc3RJdGVtLmtleSwga2V5KSkge1xuXHRcdHRoaXMubGFzdEl0ZW0udmFsID0gdmFsO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0aW5kZXggPSB0aGlzLmluZGV4T2Yoa2V5KTtcblx0aWYgKGluZGV4ID49IDApIHtcblx0XHR0aGlzLmxhc3RJdGVtID0gdGhpcy5saXN0W2luZGV4XTtcblx0XHR0aGlzLmxpc3RbaW5kZXhdLnZhbCA9IHZhbDtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHRoaXMubGFzdEl0ZW0gPSB7IGtleToga2V5LCB2YWw6IHZhbCB9O1xuXHR0aGlzLmxpc3QucHVzaCh0aGlzLmxhc3RJdGVtKTtcblx0dGhpcy5zaXplKys7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5TaW1pbGFyLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihrZXkpIHtcblx0dmFyIGluZGV4O1xuXG5cdGlmICh0aGlzLmxhc3RJdGVtICYmIHRoaXMuaXNFcXVhbCh0aGlzLmxhc3RJdGVtLmtleSwga2V5KSkge1xuXHRcdHRoaXMubGFzdEl0ZW0gPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpbmRleCA9IHRoaXMuaW5kZXhPZihrZXkpO1xuXHRpZiAoaW5kZXggPj0gMCkge1xuXHRcdHRoaXMuc2l6ZS0tO1xuXHRcdHJldHVybiB0aGlzLmxpc3Quc3BsaWNlKGluZGV4LCAxKVswXTtcblx0fVxuXG5cdHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5cbi8vIGltcG9ydGFudCB0aGF0IGhhcygpIGRvZXNuJ3QgdXNlIGdldCgpIGluIGNhc2UgYW4gZXhpc3Rpbmcga2V5IGhhcyBhIGZhbHN5IHZhbHVlLCBpbiB3aGljaCBjYXNlIGhhcygpIHdvdWxkIHJldHVybiBmYWxzZVxuU2ltaWxhci5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG5cdHZhciBpbmRleDtcblxuXHRpZiAodGhpcy5sYXN0SXRlbSAmJiB0aGlzLmlzRXF1YWwodGhpcy5sYXN0SXRlbS5rZXksIGtleSkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGluZGV4ID0gdGhpcy5pbmRleE9mKGtleSk7XG5cdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0dGhpcy5sYXN0SXRlbSA9IHRoaXMubGlzdFtpbmRleF07XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5TaW1pbGFyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHtcblx0dmFyIGk7XG5cdGZvciAoaSA9IDA7IGkgPCB0aGlzLnNpemU7IGkrKykge1xuXHRcdGNhbGxiYWNrLmNhbGwodGhpc0FyZyB8fCB0aGlzLCB0aGlzLmxpc3RbaV0udmFsLCB0aGlzLmxpc3RbaV0ua2V5LCB0aGlzKTtcblx0fVxufTtcblxuU2ltaWxhci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKGtleSkge1xuXHR2YXIgaTtcblx0Zm9yIChpID0gMDsgaSA8IHRoaXMuc2l6ZTsgaSsrKSB7XG5cdFx0aWYgKHRoaXMuaXNFcXVhbCh0aGlzLmxpc3RbaV0ua2V5LCBrZXkpKSB7XG5cdFx0XHRyZXR1cm4gaTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIC0xO1xufTtcblxuLy8gY2hlY2sgaWYgdGhlIG51bWJlcnMgYXJlIGVxdWFsLCBvciB3aGV0aGVyIHRoZXkgYXJlIGJvdGggcHJlY2lzZWx5IE5hTiAoaXNOYU4gcmV0dXJucyB0cnVlIGZvciBhbGwgbm9uLW51bWJlcnMpXG5TaW1pbGFyLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24odmFsMSwgdmFsMikge1xuXHRyZXR1cm4gdmFsMSA9PT0gdmFsMiB8fCAodmFsMSAhPT0gdmFsMSAmJiB2YWwyICE9PSB2YWwyKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2ltaWxhcjtcbn0se31dLDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xudmFyIE1hcE9yU2ltaWxhciA9IF9kZXJlcV8oJ21hcC1vci1zaW1pbGFyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpbWl0KSB7XG5cdHZhciBjYWNoZSA9IG5ldyBNYXBPclNpbWlsYXIodW5kZWZpbmVkID09PSAndHJ1ZScpLFxuXHRcdGxydSA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoZm4pIHtcblx0XHR2YXIgbWVtb2l6ZXJpZmljID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGN1cnJlbnRDYWNoZSA9IGNhY2hlLFxuXHRcdFx0XHRuZXdNYXAsXG5cdFx0XHRcdGZuUmVzdWx0LFxuXHRcdFx0XHRhcmdzTGVuZ3RoTWludXNPbmUgPSBhcmd1bWVudHMubGVuZ3RoIC0gMSxcblx0XHRcdFx0bHJ1UGF0aCA9IEFycmF5KGFyZ3NMZW5ndGhNaW51c09uZSArIDEpLFxuXHRcdFx0XHRpc01lbW9pemVkID0gdHJ1ZSxcblx0XHRcdFx0aTtcblxuXHRcdFx0aWYgKChtZW1vaXplcmlmaWMubnVtQXJncyB8fCBtZW1vaXplcmlmaWMubnVtQXJncyA9PT0gMCkgJiYgbWVtb2l6ZXJpZmljLm51bUFyZ3MgIT09IGFyZ3NMZW5ndGhNaW51c09uZSArIDEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNZW1vaXplcmlmaWMgZnVuY3Rpb25zIHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb29wIHRocm91Z2ggZWFjaCBhcmd1bWVudCB0byB0cmF2ZXJzZSB0aGUgbWFwIHRyZWVcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhcmdzTGVuZ3RoTWludXNPbmU7IGkrKykge1xuXHRcdFx0XHRscnVQYXRoW2ldID0ge1xuXHRcdFx0XHRcdGNhY2hlSXRlbTogY3VycmVudENhY2hlLFxuXHRcdFx0XHRcdGFyZzogYXJndW1lbnRzW2ldXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gY2xpbWIgdGhyb3VnaCB0aGUgaGllcmFyY2hpY2FsIG1hcCB0cmVlIHVudGlsIHRoZSBzZWNvbmQtbGFzdCBhcmd1bWVudCBoYXMgYmVlbiBmb3VuZCwgb3IgYW4gYXJndW1lbnQgaXMgbWlzc2luZy5cblx0XHRcdFx0Ly8gaWYgYWxsIGFyZ3VtZW50cyB1cCB0byB0aGUgc2Vjb25kLWxhc3QgaGF2ZSBiZWVuIGZvdW5kLCB0aGlzIHdpbGwgcG90ZW50aWFsbHkgYmUgYSBjYWNoZSBoaXQgKGRldGVybWluZWQgbGF0ZXIpXG5cdFx0XHRcdGlmIChjdXJyZW50Q2FjaGUuaGFzKGFyZ3VtZW50c1tpXSkpIHtcblx0XHRcdFx0XHRjdXJyZW50Q2FjaGUgPSBjdXJyZW50Q2FjaGUuZ2V0KGFyZ3VtZW50c1tpXSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpc01lbW9pemVkID0gZmFsc2U7XG5cblx0XHRcdFx0Ly8gbWFrZSBtYXBzIHVudGlsIGxhc3QgdmFsdWVcblx0XHRcdFx0bmV3TWFwID0gbmV3IE1hcE9yU2ltaWxhcih1bmRlZmluZWQgPT09ICd0cnVlJyk7XG5cdFx0XHRcdGN1cnJlbnRDYWNoZS5zZXQoYXJndW1lbnRzW2ldLCBuZXdNYXApO1xuXHRcdFx0XHRjdXJyZW50Q2FjaGUgPSBuZXdNYXA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmcsIGNoZWNrIGlmIGl0IGlzIHJlYWxseSBtZW1vaXplZFxuXHRcdFx0aWYgKGlzTWVtb2l6ZWQpIHtcblx0XHRcdFx0aWYgKGN1cnJlbnRDYWNoZS5oYXMoYXJndW1lbnRzW2FyZ3NMZW5ndGhNaW51c09uZV0pKSB7XG5cdFx0XHRcdFx0Zm5SZXN1bHQgPSBjdXJyZW50Q2FjaGUuZ2V0KGFyZ3VtZW50c1thcmdzTGVuZ3RoTWludXNPbmVdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRpc01lbW9pemVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpc01lbW9pemVkKSB7XG5cdFx0XHRcdGZuUmVzdWx0ID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcblx0XHRcdFx0Y3VycmVudENhY2hlLnNldChhcmd1bWVudHNbYXJnc0xlbmd0aE1pbnVzT25lXSwgZm5SZXN1bHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGltaXQgPiAwKSB7XG5cdFx0XHRcdGxydVBhdGhbYXJnc0xlbmd0aE1pbnVzT25lXSA9IHtcblx0XHRcdFx0XHRjYWNoZUl0ZW06IGN1cnJlbnRDYWNoZSxcblx0XHRcdFx0XHRhcmc6IGFyZ3VtZW50c1thcmdzTGVuZ3RoTWludXNPbmVdXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKGlzTWVtb2l6ZWQpIHtcblx0XHRcdFx0XHRtb3ZlVG9Nb3N0UmVjZW50THJ1KGxydSwgbHJ1UGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0bHJ1LnB1c2gobHJ1UGF0aCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAobHJ1Lmxlbmd0aCA+IGxpbWl0KSB7XG5cdFx0XHRcdFx0cmVtb3ZlQ2FjaGVkUmVzdWx0KGxydS5zaGlmdCgpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRtZW1vaXplcmlmaWMud2FzTWVtb2l6ZWQgPSBpc01lbW9pemVkO1xuXHRcdFx0bWVtb2l6ZXJpZmljLm51bUFyZ3MgPSBhcmdzTGVuZ3RoTWludXNPbmUgKyAxO1xuXG5cdFx0XHRyZXR1cm4gZm5SZXN1bHQ7XG5cdFx0fTtcblxuXHRcdG1lbW9pemVyaWZpYy5saW1pdCA9IGxpbWl0O1xuXHRcdG1lbW9pemVyaWZpYy53YXNNZW1vaXplZCA9IGZhbHNlO1xuXHRcdG1lbW9pemVyaWZpYy5jYWNoZSA9IGNhY2hlO1xuXHRcdG1lbW9pemVyaWZpYy5scnUgPSBscnU7XG5cblx0XHRyZXR1cm4gbWVtb2l6ZXJpZmljO1xuXHR9O1xufTtcblxuLy8gbW92ZSBjdXJyZW50IGFyZ3MgdG8gbW9zdCByZWNlbnQgcG9zaXRpb25cbmZ1bmN0aW9uIG1vdmVUb01vc3RSZWNlbnRMcnUobHJ1LCBscnVQYXRoKSB7XG5cdHZhciBscnVMZW4gPSBscnUubGVuZ3RoLFxuXHRcdGxydVBhdGhMZW4gPSBscnVQYXRoLmxlbmd0aCxcblx0XHRpc01hdGNoLFxuXHRcdGksIGlpO1xuXG5cdGZvciAoaSA9IDA7IGkgPCBscnVMZW47IGkrKykge1xuXHRcdGlzTWF0Y2ggPSB0cnVlO1xuXHRcdGZvciAoaWkgPSAwOyBpaSA8IGxydVBhdGhMZW47IGlpKyspIHtcblx0XHRcdGlmICghaXNFcXVhbChscnVbaV1baWldLmFyZywgbHJ1UGF0aFtpaV0uYXJnKSkge1xuXHRcdFx0XHRpc01hdGNoID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoaXNNYXRjaCkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0bHJ1LnB1c2gobHJ1LnNwbGljZShpLCAxKVswXSk7XG59XG5cbi8vIHJlbW92ZSBsZWFzdCByZWNlbnRseSB1c2VkIGNhY2hlIGl0ZW0gYW5kIGFsbCBkZWFkIGJyYW5jaGVzXG5mdW5jdGlvbiByZW1vdmVDYWNoZWRSZXN1bHQocmVtb3ZlZExydSkge1xuXHR2YXIgcmVtb3ZlZExydUxlbiA9IHJlbW92ZWRMcnUubGVuZ3RoLFxuXHRcdGN1cnJlbnRMcnUgPSByZW1vdmVkTHJ1W3JlbW92ZWRMcnVMZW4gLSAxXSxcblx0XHR0bXAsXG5cdFx0aTtcblxuXHRjdXJyZW50THJ1LmNhY2hlSXRlbS5kZWxldGUoY3VycmVudExydS5hcmcpO1xuXG5cdC8vIHdhbGsgZG93biB0aGUgdHJlZSByZW1vdmluZyBkZWFkIGJyYW5jaGVzIChzaXplIDApIGFsb25nIHRoZSB3YXlcblx0Zm9yIChpID0gcmVtb3ZlZExydUxlbiAtIDI7IGkgPj0gMDsgaS0tKSB7XG5cdFx0Y3VycmVudExydSA9IHJlbW92ZWRMcnVbaV07XG5cdFx0dG1wID0gY3VycmVudExydS5jYWNoZUl0ZW0uZ2V0KGN1cnJlbnRMcnUuYXJnKTtcblxuXHRcdGlmICghdG1wIHx8ICF0bXAuc2l6ZSkge1xuXHRcdFx0Y3VycmVudExydS5jYWNoZUl0ZW0uZGVsZXRlKGN1cnJlbnRMcnUuYXJnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBudW1iZXJzIGFyZSBlcXVhbCwgb3Igd2hldGhlciB0aGV5IGFyZSBib3RoIHByZWNpc2VseSBOYU4gKGlzTmFOIHJldHVybnMgdHJ1ZSBmb3IgYWxsIG5vbi1udW1iZXJzKVxuZnVuY3Rpb24gaXNFcXVhbCh2YWwxLCB2YWwyKSB7XG5cdHJldHVybiB2YWwxID09PSB2YWwyIHx8ICh2YWwxICE9PSB2YWwxICYmIHZhbDIgIT09IHZhbDIpO1xufVxufSx7XCJtYXAtb3Itc2ltaWxhclwiOjF9XX0se30sWzNdKSgzKVxufSk7IiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcDtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCJ2YXIgbWFwQ2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX21hcENhY2hlQ2xlYXInKSxcbiAgICBtYXBDYWNoZURlbGV0ZSA9IHJlcXVpcmUoJy4vX21hcENhY2hlRGVsZXRlJyksXG4gICAgbWFwQ2FjaGVHZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZUdldCcpLFxuICAgIG1hcENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVIYXMnKSxcbiAgICBtYXBDYWNoZVNldCA9IHJlcXVpcmUoJy4vX21hcENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcENhY2hlO1xuIiwidmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fZGVmaW5lUHJvcGVydHknKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlQXNzaWduVmFsdWU7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQcm90b3R5cGU7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKSxcbiAgICBzdHViRmFsc2UgPSByZXF1aXJlKCcuL3N0dWJGYWxzZScpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4zLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IEJ1ZmZlcigyKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgVWludDhBcnJheSgyKSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNCdWZmZXIgPSBuYXRpdmVJc0J1ZmZlciB8fCBzdHViRmFsc2U7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7XG4iLCJ2YXIgYmFzZUlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Jhc2VJc1R5cGVkQXJyYXknKSxcbiAgICBiYXNlVW5hcnkgPSByZXF1aXJlKCcuL19iYXNlVW5hcnknKSxcbiAgICBub2RlVXRpbCA9IHJlcXVpcmUoJy4vX25vZGVVdGlsJyk7XG5cbi8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG52YXIgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzVHlwZWRBcnJheSA9IG5vZGVJc1R5cGVkQXJyYXkgPyBiYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSkgOiBiYXNlSXNUeXBlZEFycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVHlwZWRBcnJheTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIEludGVybmFsTWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SX05BTUUsIHdyYXBwZXIsIGNvbW1vbiwgSVNfTUFQLCBJU19XRUFLKSB7XG4gIHZhciBOYXRpdmVDb25zdHJ1Y3RvciA9IGdsb2JhbFtDT05TVFJVQ1RPUl9OQU1FXTtcbiAgdmFyIE5hdGl2ZVByb3RvdHlwZSA9IE5hdGl2ZUNvbnN0cnVjdG9yICYmIE5hdGl2ZUNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgdmFyIENvbnN0cnVjdG9yID0gTmF0aXZlQ29uc3RydWN0b3I7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBleHBvcnRlZCA9IHt9O1xuXG4gIHZhciBmaXhNZXRob2QgPSBmdW5jdGlvbiAoS0VZKSB7XG4gICAgdmFyIG5hdGl2ZU1ldGhvZCA9IE5hdGl2ZVByb3RvdHlwZVtLRVldO1xuICAgIHJlZGVmaW5lKE5hdGl2ZVByb3RvdHlwZSwgS0VZLFxuICAgICAgS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHtcbiAgICAgICAgbmF0aXZlTWV0aG9kLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9IDogS0VZID09ICdkZWxldGUnID8gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IEtFWSA9PSAnZ2V0JyA/IGZ1bmN0aW9uIGdldChhKSB7XG4gICAgICAgIHJldHVybiBJU19XRUFLICYmICFpc09iamVjdChhKSA/IHVuZGVmaW5lZCA6IG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdoYXMnID8gZnVuY3Rpb24gaGFzKGEpIHtcbiAgICAgICAgcmV0dXJuIElTX1dFQUsgJiYgIWlzT2JqZWN0KGEpID8gZmFsc2UgOiBuYXRpdmVNZXRob2QuY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpO1xuICAgICAgfSA6IGZ1bmN0aW9uIHNldChhLCBiKSB7XG4gICAgICAgIG5hdGl2ZU1ldGhvZC5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSwgYik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHR5cGVvZiBOYXRpdmVDb25zdHJ1Y3RvciAhPSAnZnVuY3Rpb24nIHx8ICEoSVNfV0VBSyB8fCBOYXRpdmVQcm90b3R5cGUuZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIENvbnN0cnVjdG9yID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCwgQURERVIpO1xuICAgIEludGVybmFsTWV0YWRhdGFNb2R1bGUuUkVRVUlSRUQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGlzRm9yY2VkKENPTlNUUlVDVE9SX05BTUUsIHRydWUpKSB7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgdmFyIEFDQ0VQVF9JVEVSQUJMRVMgPSBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7IG5ldyBOYXRpdmVDb25zdHJ1Y3RvcihpdGVyYWJsZSk7IH0pO1xuICAgIC8vIGZvciBlYXJseSBpbXBsZW1lbnRhdGlvbnMgLTAgYW5kICswIG5vdCB0aGUgc2FtZVxuICAgIHZhciBCVUdHWV9aRVJPID0gIUlTX1dFQUsgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVjggfiBDaHJvbWl1bSA0Mi0gZmFpbHMgb25seSB3aXRoIDUrIGVsZW1lbnRzXG4gICAgICB2YXIgJGluc3RhbmNlID0gbmV3IE5hdGl2ZUNvbnN0cnVjdG9yKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIUFDQ0VQVF9JVEVSQUJMRVMpIHtcbiAgICAgIENvbnN0cnVjdG9yID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuICAgICAgICB2YXIgdGhhdCA9IGluaGVyaXRJZlJlcXVpcmVkKG5ldyBOYXRpdmVDb25zdHJ1Y3RvcigpLCB0YXJnZXQsIENvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgICAgIHJldHVybiB0aGF0O1xuICAgICAgfSk7XG4gICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBOYXRpdmVQcm90b3R5cGU7XG4gICAgICBOYXRpdmVQcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICBpZiAoVEhST1dTX09OX1BSSU1JVElWRVMgfHwgQlVHR1lfWkVSTykge1xuICAgICAgZml4TWV0aG9kKCdkZWxldGUnKTtcbiAgICAgIGZpeE1ldGhvZCgnaGFzJyk7XG4gICAgICBJU19NQVAgJiYgZml4TWV0aG9kKCdnZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoQlVHR1lfWkVSTyB8fCBIQVNOVF9DSEFJTklORykgZml4TWV0aG9kKEFEREVSKTtcblxuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgTmF0aXZlUHJvdG90eXBlLmNsZWFyKSBkZWxldGUgTmF0aXZlUHJvdG90eXBlLmNsZWFyO1xuICB9XG5cbiAgZXhwb3J0ZWRbQ09OU1RSVUNUT1JfTkFNRV0gPSBDb25zdHJ1Y3RvcjtcbiAgJGV4cG9ydCh7IGdsb2JhbDogdHJ1ZSwgZm9yY2VkOiBDb25zdHJ1Y3RvciAhPSBOYXRpdmVDb25zdHJ1Y3RvciB9LCBleHBvcnRlZCk7XG5cbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIENPTlNUUlVDVE9SX05BTUUpO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDb25zdHJ1Y3RvciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQ29uc3RydWN0b3I7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hY3Rpb24gPSBhY3Rpb247XG5cbnZhciBfdiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInV1aWQvdjFcIikpO1xuXG52YXIgX2FkZG9ucyA9IHJlcXVpcmUoXCJAc3Rvcnlib29rL2FkZG9uc1wiKTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuXG52YXIgX2NvbmZpZ3VyZUFjdGlvbnMgPSByZXF1aXJlKFwiLi9jb25maWd1cmVBY3Rpb25zXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gYWN0aW9uKG5hbWUpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgYWN0aW9uT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIF9jb25maWd1cmVBY3Rpb25zLmNvbmZpZywgb3B0aW9ucyk7XG5cbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBhY3Rpb25IYW5kbGVyKCkge1xuICAgIHZhciBjaGFubmVsID0gX2FkZG9ucy5hZGRvbnMuZ2V0Q2hhbm5lbCgpO1xuXG4gICAgdmFyIGlkID0gKDAsIF92W1wiZGVmYXVsdFwiXSkoKTtcbiAgICB2YXIgbWluRGVwdGggPSA1OyAvLyBhbnl0aGluZyBsZXNzIGlzIHJlYWxseSBqdXN0IHN0b3J5Ym9vayBpbnRlcm5hbHNcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgYWN0aW9uRGlzcGxheVRvRW1pdCA9IHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNvdW50OiAwLFxuICAgICAgZGF0YToge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBhcmdzOiBhcmdzXG4gICAgICB9LFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgYWN0aW9uT3B0aW9ucywge1xuICAgICAgICBkZXB0aDogbWluRGVwdGggKyAoYWN0aW9uT3B0aW9ucy5kZXB0aCB8fCAzKSxcbiAgICAgICAgYWxsb3dGdW5jdGlvbjogYWN0aW9uT3B0aW9ucy5hbGxvd0Z1bmN0aW9uIHx8IGZhbHNlXG4gICAgICB9KVxuICAgIH07XG4gICAgY2hhbm5lbC5lbWl0KF9jb25zdGFudHMuRVZFTlRfSUQsIGFjdGlvbkRpc3BsYXlUb0VtaXQpO1xuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY29uZmlndXJlQWN0aW9ucyA9IGV4cG9ydHMuY29uZmlnID0gdm9pZCAwO1xudmFyIGNvbmZpZyA9IHtcbiAgZGVwdGg6IDEwLFxuICBjbGVhck9uU3RvcnlDaGFuZ2U6IHRydWUsXG4gIGxpbWl0OiA1MFxufTtcbmV4cG9ydHMuY29uZmlnID0gY29uZmlnO1xuXG52YXIgY29uZmlndXJlQWN0aW9ucyA9IGZ1bmN0aW9uIGNvbmZpZ3VyZUFjdGlvbnMoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgT2JqZWN0LmFzc2lnbihjb25maWcsIG9wdGlvbnMpO1xufTtcblxuZXhwb3J0cy5jb25maWd1cmVBY3Rpb25zID0gY29uZmlndXJlQWN0aW9uczsiLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYWN0aW9ucyA9IGFjdGlvbnM7XG5cbnZhciBfYWN0aW9uID0gcmVxdWlyZShcIi4vYWN0aW9uXCIpO1xuXG52YXIgX2NvbmZpZ3VyZUFjdGlvbnMgPSByZXF1aXJlKFwiLi9jb25maWd1cmVBY3Rpb25zXCIpO1xuXG5mdW5jdGlvbiBhY3Rpb25zKCkge1xuICB2YXIgb3B0aW9ucyA9IF9jb25maWd1cmVBY3Rpb25zLmNvbmZpZztcblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIG5hbWVzID0gYXJnczsgLy8gbGFzdCBhcmd1bWVudCBjYW4gYmUgb3B0aW9uc1xuXG4gIGlmIChuYW1lcy5sZW5ndGggIT09IDEgJiYgdHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSAhPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgX2NvbmZpZ3VyZUFjdGlvbnMuY29uZmlnLCBuYW1lcy5wb3AoKSk7XG4gIH1cblxuICB2YXIgbmFtZXNPYmplY3QgPSBuYW1lc1swXTtcblxuICBpZiAobmFtZXMubGVuZ3RoICE9PSAxIHx8IHR5cGVvZiBuYW1lc09iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICBuYW1lc09iamVjdCA9IHt9O1xuICAgIG5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIG5hbWVzT2JqZWN0W25hbWVdID0gbmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBhY3Rpb25zT2JqZWN0ID0ge307XG4gIE9iamVjdC5rZXlzKG5hbWVzT2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgYWN0aW9uc09iamVjdFtuYW1lXSA9ICgwLCBfYWN0aW9uLmFjdGlvbikobmFtZXNPYmplY3RbbmFtZV0sIG9wdGlvbnMpO1xuICB9KTtcbiAgcmV0dXJuIGFjdGlvbnNPYmplY3Q7XG59IiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuXHR2YXIgc3RyID0gdG9TdHIuY2FsbCh2YWx1ZSk7XG5cdHZhciBpc0FyZ3MgPSBzdHIgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXHRpZiAoIWlzQXJncykge1xuXHRcdGlzQXJncyA9IHN0ciAhPT0gJ1tvYmplY3QgQXJyYXldJyAmJlxuXHRcdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcblx0XHRcdHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG5cdFx0XHR2YWx1ZS5sZW5ndGggPj0gMCAmJlxuXHRcdFx0dG9TdHIuY2FsbCh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXHR9XG5cdHJldHVybiBpc0FyZ3M7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gZnVuY3Rpb24gZnVuY3Rpb25zSGF2ZU5hbWVzKCkge1xuXHRyZXR1cm4gdHlwZW9mIGZ1bmN0aW9uIGYoKSB7fS5uYW1lID09PSAnc3RyaW5nJztcbn07XG5cbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZnVuY3Rpb25zSGF2ZU5hbWVzLmZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcyA9IGZ1bmN0aW9uIGZ1bmN0aW9uc0hhdmVDb25maWd1cmFibGVOYW1lcygpIHtcblx0cmV0dXJuIGZ1bmN0aW9uc0hhdmVOYW1lcygpICYmIGdPUEQgJiYgISFnT1BEKGZ1bmN0aW9uICgpIHt9LCAnbmFtZScpLmNvbmZpZ3VyYWJsZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb25zSGF2ZU5hbWVzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxuaWYgKGhhc1N5bWJvbHMpIHtcblx0dmFyIHN5bVRvU3RyID0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZztcblx0dmFyIHN5bVN0cmluZ1JlZ2V4ID0gL15TeW1ib2xcXCguKlxcKSQvO1xuXHR2YXIgaXNTeW1ib2xPYmplY3QgPSBmdW5jdGlvbiBpc1JlYWxTeW1ib2xPYmplY3QodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSAhPT0gJ3N5bWJvbCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHN5bVN0cmluZ1JlZ2V4LnRlc3Qoc3ltVG9TdHIuY2FsbCh2YWx1ZSkpO1xuXHR9O1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGlmICh0b1N0ci5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBpc1N5bWJvbE9iamVjdCh2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fTtcbn0gZWxzZSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuXHRcdC8vIHRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBTeW1ib2xzLlxuXHRcdHJldHVybiBmYWxzZSAmJiB2YWx1ZTtcblx0fTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4uL0dldEludHJpbnNpYycpO1xuXG52YXIgJFR5cGVFcnJvciA9IEdldEludHJpbnNpYygnJVR5cGVFcnJvciUnKTtcbnZhciAkU3ludGF4RXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVTeW50YXhFcnJvciUnKTtcblxudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xuXG52YXIgcHJlZGljYXRlcyA9IHtcbiAgLy8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXByb3BlcnR5LWRlc2NyaXB0b3Itc3BlY2lmaWNhdGlvbi10eXBlXG4gICdQcm9wZXJ0eSBEZXNjcmlwdG9yJzogZnVuY3Rpb24gaXNQcm9wZXJ0eURlc2NyaXB0b3IoRVMsIERlc2MpIHtcbiAgICBpZiAoRVMuVHlwZShEZXNjKSAhPT0gJ09iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGFsbG93ZWQgPSB7XG4gICAgICAnW1tDb25maWd1cmFibGVdXSc6IHRydWUsXG4gICAgICAnW1tFbnVtZXJhYmxlXV0nOiB0cnVlLFxuICAgICAgJ1tbR2V0XV0nOiB0cnVlLFxuICAgICAgJ1tbU2V0XV0nOiB0cnVlLFxuICAgICAgJ1tbVmFsdWVdXSc6IHRydWUsXG4gICAgICAnW1tXcml0YWJsZV1dJzogdHJ1ZVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gRGVzYykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICBpZiAoaGFzKERlc2MsIGtleSkgJiYgIWFsbG93ZWRba2V5XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzRGF0YSA9IGhhcyhEZXNjLCAnW1tWYWx1ZV1dJyk7XG4gICAgdmFyIElzQWNjZXNzb3IgPSBoYXMoRGVzYywgJ1tbR2V0XV0nKSB8fCBoYXMoRGVzYywgJ1tbU2V0XV0nKTtcbiAgICBpZiAoaXNEYXRhICYmIElzQWNjZXNzb3IpIHtcbiAgICAgIHRocm93IG5ldyAkVHlwZUVycm9yKCdQcm9wZXJ0eSBEZXNjcmlwdG9ycyBtYXkgbm90IGJlIGJvdGggYWNjZXNzb3IgYW5kIGRhdGEgZGVzY3JpcHRvcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXNzZXJ0UmVjb3JkKEVTLCByZWNvcmRUeXBlLCBhcmd1bWVudE5hbWUsIHZhbHVlKSB7XG4gIHZhciBwcmVkaWNhdGUgPSBwcmVkaWNhdGVzW3JlY29yZFR5cGVdO1xuICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Vua25vd24gcmVjb3JkIHR5cGU6ICcgKyByZWNvcmRUeXBlKTtcbiAgfVxuICBpZiAoIXByZWRpY2F0ZShFUywgdmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3ICRUeXBlRXJyb3IoYXJndW1lbnROYW1lICsgJyBtdXN0IGJlIGEgJyArIHJlY29yZFR5cGUpO1xuICB9XG4gIGNvbnNvbGUubG9nKHByZWRpY2F0ZShFUywgdmFsdWUpLCB2YWx1ZSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOYU4oYSkge1xuXHRyZXR1cm4gYSAhPT0gYTtcbn07XG4iLCJ2YXIgJGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIChhKSB7IHJldHVybiBhICE9PSBhOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc0Zpbml0ZSB8fCBmdW5jdGlvbiAoeCkgeyByZXR1cm4gdHlwZW9mIHggPT09ICdudW1iZXInICYmICEkaXNOYU4oeCkgJiYgeCAhPT0gSW5maW5pdHkgJiYgeCAhPT0gLUluZmluaXR5OyB9O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaWduKG51bWJlcikge1xuXHRyZXR1cm4gbnVtYmVyID49IDAgPyAxIDogLTE7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtb2QobnVtYmVyLCBtb2R1bG8pIHtcblx0dmFyIHJlbWFpbiA9IG51bWJlciAlIG1vZHVsbztcblx0cmV0dXJuIE1hdGguZmxvb3IocmVtYWluID49IDAgPyByZW1haW4gOiByZW1haW4gKyBtb2R1bG8pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEdldEludHJpbnNpYyA9IHJlcXVpcmUoJy4vR2V0SW50cmluc2ljJyk7XG5cbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcblxudmFyIGFzc2VydFJlY29yZCA9IHJlcXVpcmUoJy4vaGVscGVycy9hc3NlcnRSZWNvcmQnKTtcbnZhciAkaXNOYU4gPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNOYU4nKTtcbnZhciAkaXNGaW5pdGUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNGaW5pdGUnKTtcblxudmFyIHNpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvc2lnbicpO1xudmFyIG1vZCA9IHJlcXVpcmUoJy4vaGVscGVycy9tb2QnKTtcblxudmFyIElzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnZXMtdG8tcHJpbWl0aXZlL2VzNScpO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG5cbi8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDlcbnZhciBFUzUgPSB7XG5cdFRvUHJpbWl0aXZlOiB0b1ByaW1pdGl2ZSxcblxuXHRUb0Jvb2xlYW46IGZ1bmN0aW9uIFRvQm9vbGVhbih2YWx1ZSkge1xuXHRcdHJldHVybiAhIXZhbHVlO1xuXHR9LFxuXHRUb051bWJlcjogZnVuY3Rpb24gVG9OdW1iZXIodmFsdWUpIHtcblx0XHRyZXR1cm4gK3ZhbHVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWltcGxpY2l0LWNvZXJjaW9uXG5cdH0sXG5cdFRvSW50ZWdlcjogZnVuY3Rpb24gVG9JbnRlZ2VyKHZhbHVlKSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIodmFsdWUpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSkgeyByZXR1cm4gMDsgfVxuXHRcdGlmIChudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiBudW1iZXI7IH1cblx0XHRyZXR1cm4gc2lnbihudW1iZXIpICogTWF0aC5mbG9vcihNYXRoLmFicyhudW1iZXIpKTtcblx0fSxcblx0VG9JbnQzMjogZnVuY3Rpb24gVG9JbnQzMih4KSB7XG5cdFx0cmV0dXJuIHRoaXMuVG9OdW1iZXIoeCkgPj4gMDtcblx0fSxcblx0VG9VaW50MzI6IGZ1bmN0aW9uIFRvVWludDMyKHgpIHtcblx0XHRyZXR1cm4gdGhpcy5Ub051bWJlcih4KSA+Pj4gMDtcblx0fSxcblx0VG9VaW50MTY6IGZ1bmN0aW9uIFRvVWludDE2KHZhbHVlKSB7XG5cdFx0dmFyIG51bWJlciA9IHRoaXMuVG9OdW1iZXIodmFsdWUpO1xuXHRcdGlmICgkaXNOYU4obnVtYmVyKSB8fCBudW1iZXIgPT09IDAgfHwgISRpc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiAwOyB9XG5cdFx0dmFyIHBvc0ludCA9IHNpZ24obnVtYmVyKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobnVtYmVyKSk7XG5cdFx0cmV0dXJuIG1vZChwb3NJbnQsIDB4MTAwMDApO1xuXHR9LFxuXHRUb1N0cmluZzogZnVuY3Rpb24gVG9TdHJpbmcodmFsdWUpIHtcblx0XHRyZXR1cm4gJFN0cmluZyh2YWx1ZSk7XG5cdH0sXG5cdFRvT2JqZWN0OiBmdW5jdGlvbiBUb09iamVjdCh2YWx1ZSkge1xuXHRcdHRoaXMuQ2hlY2tPYmplY3RDb2VyY2libGUodmFsdWUpO1xuXHRcdHJldHVybiAkT2JqZWN0KHZhbHVlKTtcblx0fSxcblx0Q2hlY2tPYmplY3RDb2VyY2libGU6IGZ1bmN0aW9uIENoZWNrT2JqZWN0Q29lcmNpYmxlKHZhbHVlLCBvcHRNZXNzYWdlKSB7XG5cdFx0LyoganNoaW50IGVxbnVsbDp0cnVlICovXG5cdFx0aWYgKHZhbHVlID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKG9wdE1lc3NhZ2UgfHwgJ0Nhbm5vdCBjYWxsIG1ldGhvZCBvbiAnICsgdmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdElzQ2FsbGFibGU6IElzQ2FsbGFibGUsXG5cdFNhbWVWYWx1ZTogZnVuY3Rpb24gU2FtZVZhbHVlKHgsIHkpIHtcblx0XHRpZiAoeCA9PT0geSkgeyAvLyAwID09PSAtMCwgYnV0IHRoZXkgYXJlIG5vdCBpZGVudGljYWwuXG5cdFx0XHRpZiAoeCA9PT0gMCkgeyByZXR1cm4gMSAvIHggPT09IDEgLyB5OyB9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuICRpc05hTih4KSAmJiAkaXNOYU4oeSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04XG5cdFR5cGU6IGZ1bmN0aW9uIFR5cGUoeCkge1xuXHRcdGlmICh4ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gJ051bGwnO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gJ1VuZGVmaW5lZCc7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHJldHVybiAnT2JqZWN0Jztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuXHRcdFx0cmV0dXJuICdOdW1iZXInO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHggPT09ICdib29sZWFuJykge1xuXHRcdFx0cmV0dXJuICdCb29sZWFuJztcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB4ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuICdTdHJpbmcnO1xuXHRcdH1cblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtcHJvcGVydHktZGVzY3JpcHRvci1zcGVjaWZpY2F0aW9uLXR5cGVcblx0SXNQcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIElzUHJvcGVydHlEZXNjcmlwdG9yKERlc2MpIHtcblx0XHRpZiAodGhpcy5UeXBlKERlc2MpICE9PSAnT2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgYWxsb3dlZCA9IHtcblx0XHRcdCdbW0NvbmZpZ3VyYWJsZV1dJzogdHJ1ZSxcblx0XHRcdCdbW0VudW1lcmFibGVdXSc6IHRydWUsXG5cdFx0XHQnW1tHZXRdXSc6IHRydWUsXG5cdFx0XHQnW1tTZXRdXSc6IHRydWUsXG5cdFx0XHQnW1tWYWx1ZV1dJzogdHJ1ZSxcblx0XHRcdCdbW1dyaXRhYmxlXV0nOiB0cnVlXG5cdFx0fTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBEZXNjKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblx0XHRcdGlmIChoYXMoRGVzYywga2V5KSAmJiAhYWxsb3dlZFtrZXldKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgaXNEYXRhID0gaGFzKERlc2MsICdbW1ZhbHVlXV0nKTtcblx0XHR2YXIgSXNBY2Nlc3NvciA9IGhhcyhEZXNjLCAnW1tHZXRdXScpIHx8IGhhcyhEZXNjLCAnW1tTZXRdXScpO1xuXHRcdGlmIChpc0RhdGEgJiYgSXNBY2Nlc3Nvcikge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ1Byb3BlcnR5IERlc2NyaXB0b3JzIG1heSBub3QgYmUgYm90aCBhY2Nlc3NvciBhbmQgZGF0YSBkZXNjcmlwdG9ycycpO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC4xXG5cdElzQWNjZXNzb3JEZXNjcmlwdG9yOiBmdW5jdGlvbiBJc0FjY2Vzc29yRGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAoIWhhcyhEZXNjLCAnW1tHZXRdXScpICYmICFoYXMoRGVzYywgJ1tbU2V0XV0nKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjJcblx0SXNEYXRhRGVzY3JpcHRvcjogZnVuY3Rpb24gSXNEYXRhRGVzY3JpcHRvcihEZXNjKSB7XG5cdFx0aWYgKHR5cGVvZiBEZXNjID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAoIWhhcyhEZXNjLCAnW1tWYWx1ZV1dJykgJiYgIWhhcyhEZXNjLCAnW1tXcml0YWJsZV1dJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC4zXG5cdElzR2VuZXJpY0Rlc2NyaXB0b3I6IGZ1bmN0aW9uIElzR2VuZXJpY0Rlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRhc3NlcnRSZWNvcmQodGhpcywgJ1Byb3BlcnR5IERlc2NyaXB0b3InLCAnRGVzYycsIERlc2MpO1xuXG5cdFx0aWYgKCF0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpICYmICF0aGlzLklzRGF0YURlc2NyaXB0b3IoRGVzYykpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHQvLyBodHRwczovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC4xMC40XG5cdEZyb21Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIEZyb21Qcm9wZXJ0eURlc2NyaXB0b3IoRGVzYykge1xuXHRcdGlmICh0eXBlb2YgRGVzYyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBEZXNjO1xuXHRcdH1cblxuXHRcdGFzc2VydFJlY29yZCh0aGlzLCAnUHJvcGVydHkgRGVzY3JpcHRvcicsICdEZXNjJywgRGVzYyk7XG5cblx0XHRpZiAodGhpcy5Jc0RhdGFEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR2YWx1ZTogRGVzY1snW1tWYWx1ZV1dJ10sXG5cdFx0XHRcdHdyaXRhYmxlOiAhIURlc2NbJ1tbV3JpdGFibGVdXSddLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiAhIURlc2NbJ1tbRW51bWVyYWJsZV1dJ10sXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogISFEZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ11cblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICh0aGlzLklzQWNjZXNzb3JEZXNjcmlwdG9yKERlc2MpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXQ6IERlc2NbJ1tbR2V0XV0nXSxcblx0XHRcdFx0c2V0OiBEZXNjWydbW1NldF1dJ10sXG5cdFx0XHRcdGVudW1lcmFibGU6ICEhRGVzY1snW1tFbnVtZXJhYmxlXV0nXSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiAhIURlc2NbJ1tbQ29uZmlndXJhYmxlXV0nXVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3ICRUeXBlRXJyb3IoJ0Zyb21Qcm9wZXJ0eURlc2NyaXB0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bGx5IHBvcHVsYXRlZCBQcm9wZXJ0eSBEZXNjcmlwdG9yJyk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEwLjVcblx0VG9Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIFRvUHJvcGVydHlEZXNjcmlwdG9yKE9iaikge1xuXHRcdGlmICh0aGlzLlR5cGUoT2JqKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdUb1Byb3BlcnR5RGVzY3JpcHRvciByZXF1aXJlcyBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHR2YXIgZGVzYyA9IHt9O1xuXHRcdGlmIChoYXMoT2JqLCAnZW51bWVyYWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW0VudW1lcmFibGVdXSddID0gdGhpcy5Ub0Jvb2xlYW4oT2JqLmVudW1lcmFibGUpO1xuXHRcdH1cblx0XHRpZiAoaGFzKE9iaiwgJ2NvbmZpZ3VyYWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW0NvbmZpZ3VyYWJsZV1dJ10gPSB0aGlzLlRvQm9vbGVhbihPYmouY29uZmlndXJhYmxlKTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICd2YWx1ZScpKSB7XG5cdFx0XHRkZXNjWydbW1ZhbHVlXV0nXSA9IE9iai52YWx1ZTtcblx0XHR9XG5cdFx0aWYgKGhhcyhPYmosICd3cml0YWJsZScpKSB7XG5cdFx0XHRkZXNjWydbW1dyaXRhYmxlXV0nXSA9IHRoaXMuVG9Cb29sZWFuKE9iai53cml0YWJsZSk7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnZ2V0JykpIHtcblx0XHRcdHZhciBnZXR0ZXIgPSBPYmouZ2V0O1xuXHRcdFx0aWYgKHR5cGVvZiBnZXR0ZXIgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLklzQ2FsbGFibGUoZ2V0dGVyKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXR0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0XHR9XG5cdFx0XHRkZXNjWydbW0dldF1dJ10gPSBnZXR0ZXI7XG5cdFx0fVxuXHRcdGlmIChoYXMoT2JqLCAnc2V0JykpIHtcblx0XHRcdHZhciBzZXR0ZXIgPSBPYmouc2V0O1xuXHRcdFx0aWYgKHR5cGVvZiBzZXR0ZXIgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLklzQ2FsbGFibGUoc2V0dGVyKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignc2V0dGVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXHRcdFx0fVxuXHRcdFx0ZGVzY1snW1tTZXRdXSddID0gc2V0dGVyO1xuXHRcdH1cblxuXHRcdGlmICgoaGFzKGRlc2MsICdbW0dldF1dJykgfHwgaGFzKGRlc2MsICdbW1NldF1dJykpICYmIChoYXMoZGVzYywgJ1tbVmFsdWVdXScpIHx8IGhhcyhkZXNjLCAnW1tXcml0YWJsZV1dJykpKSB7XG5cdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignSW52YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9yLiBDYW5ub3QgYm90aCBzcGVjaWZ5IGFjY2Vzc29ycyBhbmQgYSB2YWx1ZSBvciB3cml0YWJsZSBhdHRyaWJ1dGUnKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRlc2M7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRVM1O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgcmVnZXhFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgdHJ5UmVnZXhFeGVjQ2FsbCA9IGZ1bmN0aW9uIHRyeVJlZ2V4RXhlYyh2YWx1ZSkge1xuXHR0cnkge1xuXHRcdHZhciBsYXN0SW5kZXggPSB2YWx1ZS5sYXN0SW5kZXg7XG5cdFx0dmFsdWUubGFzdEluZGV4ID0gMDtcblxuXHRcdHJlZ2V4RXhlYy5jYWxsKHZhbHVlKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHR2YWx1ZS5sYXN0SW5kZXggPSBsYXN0SW5kZXg7XG5cdH1cbn07XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIHJlZ2V4Q2xhc3MgPSAnW29iamVjdCBSZWdFeHBdJztcbnZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gJ3N5bWJvbCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNSZWdleCh2YWx1ZSkge1xuXHRpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKCFoYXNUb1N0cmluZ1RhZykge1xuXHRcdHJldHVybiB0b1N0ci5jYWxsKHZhbHVlKSA9PT0gcmVnZXhDbGFzcztcblx0fVxuXG5cdHZhciBkZXNjcmlwdG9yID0gZ09QRCh2YWx1ZSwgJ2xhc3RJbmRleCcpO1xuXHR2YXIgaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJyk7XG5cdGlmICghaGFzTGFzdEluZGV4RGF0YVByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHRyeVJlZ2V4RXhlY0NhbGwodmFsdWUpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArPSAxKSB7XG5cdFx0Y2FsbGJhY2soYXJyYXlbaV0sIGksIGFycmF5KTtcblx0fVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldEluZmVycmVkTmFtZTtcbnRyeSB7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuXHRnZXRJbmZlcnJlZE5hbWUgPSBGdW5jdGlvbigncycsICdyZXR1cm4geyBbc10oKSB7fSB9W3NdLm5hbWU7Jyk7XG59IGNhdGNoIChlKSB7fVxuXG52YXIgaW5mZXJyZWQgPSBmdW5jdGlvbiAoKSB7fTtcbm1vZHVsZS5leHBvcnRzID0gZ2V0SW5mZXJyZWROYW1lICYmIGluZmVycmVkLm5hbWUgPT09ICdpbmZlcnJlZCcgPyBnZXRJbmZlcnJlZE5hbWUgOiBudWxsO1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIGtleXMgPSByZXF1aXJlKCdvYmplY3Qta2V5cycpO1xuXG52YXIgRVMyMDE3ID0gcmVxdWlyZSgnLi9lczIwMTcnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL2hlbHBlcnMvYXNzaWduJyk7XG52YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4vaGVscGVycy9mb3JFYWNoJyk7XG5cbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCcuL0dldEludHJpbnNpYycpO1xuXG52YXIgJFN0cmluZyA9IEdldEludHJpbnNpYygnJVN0cmluZyUnKTtcbnZhciAkT2JqZWN0ID0gR2V0SW50cmluc2ljKCclT2JqZWN0JScpO1xuXG52YXIgJFN5bWJvbFByb3RvID0gR2V0SW50cmluc2ljKCclU3ltYm9sUHJvdG90eXBlJScsIHRydWUpO1xudmFyICRTeW1ib2xWYWx1ZU9mID0gJFN5bWJvbFByb3RvID8gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsICRTeW1ib2xQcm90by52YWx1ZU9mKSA6IG51bGw7XG52YXIgJFN0cmluZ1Byb3RvID0gR2V0SW50cmluc2ljKCclU3RyaW5nUHJvdG90eXBlJScpO1xudmFyICRjaGFyQXQgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFN0cmluZ1Byb3RvLmNoYXJBdCk7XG5cbnZhciAkUHJvbWlzZVJlc29sdmVPcmlnID0gR2V0SW50cmluc2ljKCclUHJvbWlzZV9yZXNvbHZlJScsIHRydWUpO1xudmFyICRQcm9taXNlUmVzb2x2ZSA9ICRQcm9taXNlUmVzb2x2ZU9yaWcgPyBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgJFByb21pc2VSZXNvbHZlT3JpZykgOiBudWxsO1xuXG52YXIgJGlzRW51bWVyYWJsZSA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBHZXRJbnRyaW5zaWMoJyVPYmplY3RQcm90b3R5cGUlJykucHJvcGVydHlJc0VudW1lcmFibGUpO1xudmFyICRwdXNoQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEdldEludHJpbnNpYygnJUFycmF5UHJvdG90eXBlJScpLnB1c2gpO1xudmFyICRnT1BTID0gJFN5bWJvbFZhbHVlT2YgPyAkT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA6IG51bGw7XG5cbnZhciBPd25Qcm9wZXJ0eUtleXMgPSBmdW5jdGlvbiBPd25Qcm9wZXJ0eUtleXMoRVMsIHNvdXJjZSkge1xuXHR2YXIgb3duS2V5cyA9IGtleXMoc291cmNlKTtcblx0aWYgKCRnT1BTKSB7XG5cdFx0JHB1c2hBcHBseShvd25LZXlzLCAkZ09QUyhzb3VyY2UpKTtcblx0fVxuXHRyZXR1cm4gb3duS2V5cztcbn07XG5cbnZhciBFUzIwMTggPSBhc3NpZ24oYXNzaWduKHt9LCBFUzIwMTcpLCB7XG5cdEVudW1lcmFibGVPd25Qcm9wZXJ0eU5hbWVzOiBFUzIwMTcuRW51bWVyYWJsZU93blByb3BlcnRpZXMsXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLXRoaXNzeW1ib2x2YWx1ZVxuXHR0aGlzU3ltYm9sVmFsdWU6IGZ1bmN0aW9uIHRoaXNTeW1ib2xWYWx1ZSh2YWx1ZSkge1xuXHRcdGlmICghJFN5bWJvbFZhbHVlT2YpIHtcblx0XHRcdHRocm93IG5ldyBTeW50YXhFcnJvcignU3ltYm9scyBhcmUgbm90IHN1cHBvcnRlZDsgdGhpc1N5bWJvbFZhbHVlIHJlcXVpcmVzIHRoYXQgYHZhbHVlYCBiZSBhIFN5bWJvbCBvciBhIFN5bWJvbCBvYmplY3QnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuVHlwZSh2YWx1ZSkgPT09ICdTeW1ib2wnKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiAkU3ltYm9sVmFsdWVPZih2YWx1ZSk7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvI3NlYy1pc3N0cmluZ3ByZWZpeFxuXHRJc1N0cmluZ1ByZWZpeDogZnVuY3Rpb24gSXNTdHJpbmdQcmVmaXgocCwgcSkge1xuXHRcdGlmICh0aGlzLlR5cGUocCkgIT09ICdTdHJpbmcnKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdBc3NlcnRpb24gZmFpbGVkOiBcInBcIiBtdXN0IGJlIGEgU3RyaW5nJyk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuVHlwZShxKSAhPT0gJ1N0cmluZycpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwicVwiIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRpZiAocCA9PT0gcSB8fCBwID09PSAnJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dmFyIHBMZW5ndGggPSBwLmxlbmd0aDtcblx0XHR2YXIgcUxlbmd0aCA9IHEubGVuZ3RoO1xuXHRcdGlmIChwTGVuZ3RoID49IHFMZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBhc3NlcnQ6IHBMZW5ndGggPCBxTGVuZ3RoXG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHBMZW5ndGg7IGkgKz0gMSkge1xuXHRcdFx0aWYgKCRjaGFyQXQocCwgaSkgIT09ICRjaGFyQXQocSwgaSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLXRvc3RyaW5nLWFwcGxpZWQtdG8tdGhlLW51bWJlci10eXBlXG5cdE51bWJlclRvU3RyaW5nOiBmdW5jdGlvbiBOdW1iZXJUb1N0cmluZyhtKSB7XG5cdFx0aWYgKHRoaXMuVHlwZShtKSAhPT0gJ051bWJlcicpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwibVwiIG11c3QgYmUgYSBTdHJpbmcnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJFN0cmluZyhtKTtcblx0fSxcblxuXHQvLyBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLWNvcHlkYXRhcHJvcGVydGllc1xuXHRDb3B5RGF0YVByb3BlcnRpZXM6IGZ1bmN0aW9uIENvcHlEYXRhUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSwgZXhjbHVkZWRJdGVtcykge1xuXHRcdGlmICh0aGlzLlR5cGUodGFyZ2V0KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwidGFyZ2V0XCIgbXVzdCBiZSBhbiBPYmplY3QnKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuSXNBcnJheShleGNsdWRlZEl0ZW1zKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXNzZXJ0aW9uIGZhaWxlZDogXCJleGNsdWRlZEl0ZW1zXCIgbXVzdCBiZSBhIExpc3Qgb2YgUHJvcGVydHkgS2V5cycpO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGV4Y2x1ZGVkSXRlbXMubGVuZ3RoOyBpICs9IDEpIHtcblx0XHRcdGlmICghdGhpcy5Jc1Byb3BlcnR5S2V5KGV4Y2x1ZGVkSXRlbXNbaV0pKSB7XG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IFwiZXhjbHVkZWRJdGVtc1wiIG11c3QgYmUgYSBMaXN0IG9mIFByb3BlcnR5IEtleXMnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcgfHwgc291cmNlID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdHZhciBFUyA9IHRoaXM7XG5cblx0XHR2YXIgZnJvbU9iaiA9IEVTLlRvT2JqZWN0KHNvdXJjZSk7XG5cblx0XHR2YXIgc291cmNlS2V5cyA9IE93blByb3BlcnR5S2V5cyhFUywgZnJvbU9iaik7XG5cdFx0Zm9yRWFjaChzb3VyY2VLZXlzLCBmdW5jdGlvbiAobmV4dEtleSkge1xuXHRcdFx0dmFyIGV4Y2x1ZGVkID0gZmFsc2U7XG5cblx0XHRcdGZvckVhY2goZXhjbHVkZWRJdGVtcywgZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0aWYgKEVTLlNhbWVWYWx1ZShlLCBuZXh0S2V5KSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdGV4Y2x1ZGVkID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBlbnVtZXJhYmxlID0gJGlzRW51bWVyYWJsZShmcm9tT2JqLCBuZXh0S2V5KSB8fCAoXG5cdFx0XHRcdC8vIHRoaXMgaXMgdG8gaGFuZGxlIHN0cmluZyBrZXlzIGJlaW5nIG5vbi1lbnVtZXJhYmxlIGluIG9sZGVyIGVuZ2luZXNcblx0XHRcdFx0dHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZydcblx0XHRcdFx0JiYgbmV4dEtleSA+PSAwXG5cdFx0XHRcdCYmIEVTLklzSW50ZWdlcihFUy5Ub051bWJlcihuZXh0S2V5KSlcblx0XHRcdCk7XG5cdFx0XHRpZiAoZXhjbHVkZWQgPT09IGZhbHNlICYmIGVudW1lcmFibGUpIHtcblx0XHRcdFx0dmFyIHByb3BWYWx1ZSA9IEVTLkdldChmcm9tT2JqLCBuZXh0S2V5KTtcblx0XHRcdFx0RVMuQ3JlYXRlRGF0YVByb3BlcnR5KHRhcmdldCwgbmV4dEtleSwgcHJvcFZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC8jc2VjLXByb21pc2UtcmVzb2x2ZVxuXHRQcm9taXNlUmVzb2x2ZTogZnVuY3Rpb24gUHJvbWlzZVJlc29sdmUoQywgeCkge1xuXHRcdGlmICghJFByb21pc2VSZXNvbHZlKSB7XG5cdFx0XHR0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBQcm9taXNlcy4nKTtcblx0XHR9XG5cdFx0cmV0dXJuICRQcm9taXNlUmVzb2x2ZShDLCB4KTtcblx0fVxufSk7XG5cbmRlbGV0ZSBFUzIwMTguRW51bWVyYWJsZU93blByb3BlcnRpZXM7IC8vIHJlcGxhY2VkIHdpdGggRW51bWVyYWJsZU93blByb3BlcnR5TmFtZXNcblxuZGVsZXRlIEVTMjAxOC5Jc1Byb3BlcnR5RGVzY3JpcHRvcjsgLy8gbm90IGFuIGFjdHVhbCBhYnN0cmFjdCBvcGVyYXRpb25cblxubW9kdWxlLmV4cG9ydHMgPSBFUzIwMTg7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0Jyk7XG52YXIgZmxhZ3NHZXR0ZXIgPSByZXF1aXJlKCdyZWdleHAucHJvdG90eXBlLmZsYWdzJyk7XG5cbnZhciBSZWdFeHBTdHJpbmdJdGVyYXRvciA9IHJlcXVpcmUoJy4vaGVscGVycy9SZWdFeHBTdHJpbmdJdGVyYXRvcicpO1xudmFyIE9yaWdSZWdFeHAgPSBSZWdFeHA7XG5cbnZhciBDcmVhdGVSZWdFeHBTdHJpbmdJdGVyYXRvciA9IGZ1bmN0aW9uIENyZWF0ZVJlZ0V4cFN0cmluZ0l0ZXJhdG9yKFIsIFMsIGdsb2JhbCwgZnVsbFVuaWNvZGUpIHtcblx0aWYgKEVTLlR5cGUoUykgIT09ICdTdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignXCJTXCIgdmFsdWUgbXVzdCBiZSBhIFN0cmluZycpO1xuXHR9XG5cdGlmIChFUy5UeXBlKGdsb2JhbCkgIT09ICdCb29sZWFuJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZ2xvYmFsXCIgdmFsdWUgbXVzdCBiZSBhIEJvb2xlYW4nKTtcblx0fVxuXHRpZiAoRVMuVHlwZShmdWxsVW5pY29kZSkgIT09ICdCb29sZWFuJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZnVsbFVuaWNvZGVcIiB2YWx1ZSBtdXN0IGJlIGEgQm9vbGVhbicpO1xuXHR9XG5cblx0dmFyIGl0ZXJhdG9yID0gbmV3IFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKFIsIFMsIGdsb2JhbCwgZnVsbFVuaWNvZGUpO1xuXHRyZXR1cm4gaXRlcmF0b3I7XG59O1xuXG52YXIgY29uc3RydWN0UmVnZXhXaXRoRmxhZ3MgPSBmdW5jdGlvbiBjb25zdHJ1Y3RSZWdleChDLCBSKSB7XG5cdHZhciBtYXRjaGVyO1xuXHR2YXIgZmxhZ3MgPSBFUy5HZXQoUiwgJ2ZsYWdzJyk7XG5cdGlmICh0eXBlb2YgZmxhZ3MgPT09ICdzdHJpbmcnKSB7XG5cdFx0bWF0Y2hlciA9IG5ldyBDKFIsIGZsYWdzKTtcblx0fSBlbHNlIGlmIChDID09PSBPcmlnUmVnRXhwKSB7XG5cdFx0Ly8gd29ya2Fyb3VuZCBmb3Igb2xkZXIgZW5naW5lcyB0aGF0IGxhY2sgUmVnRXhwLnByb3RvdHlwZS5mbGFnc1xuXHRcdGZsYWdzID0gZmxhZ3NHZXR0ZXIoUik7XG5cdFx0bWF0Y2hlciA9IG5ldyBDKFIuc291cmNlLCBmbGFncyk7XG5cdH0gZWxzZSB7XG5cdFx0ZmxhZ3MgPSBmbGFnc0dldHRlcihSKTtcblx0XHRtYXRjaGVyID0gbmV3IEMoUiwgZmxhZ3MpO1xuXHR9XG5cdHJldHVybiB7IGZsYWdzOiBmbGFncywgbWF0Y2hlcjogbWF0Y2hlciB9O1xufTtcblxudmFyIHJlZ2V4TWF0Y2hBbGwgPSBmdW5jdGlvbiBTeW1ib2xNYXRjaEFsbChzdHJpbmcpIHtcblx0dmFyIFIgPSB0aGlzO1xuXHRpZiAoRVMuVHlwZShSKSAhPT0gJ09iamVjdCcpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdcInRoaXNcIiB2YWx1ZSBtdXN0IGJlIGFuIE9iamVjdCcpO1xuXHR9XG5cdHZhciBTID0gRVMuVG9TdHJpbmcoc3RyaW5nKTtcblx0dmFyIEMgPSBFUy5TcGVjaWVzQ29uc3RydWN0b3IoUiwgT3JpZ1JlZ0V4cCk7XG5cblx0dmFyIHRtcCA9IGNvbnN0cnVjdFJlZ2V4V2l0aEZsYWdzKEMsIFIpO1xuXHQvLyB2YXIgZmxhZ3MgPSBFUy5Ub1N0cmluZyhFUy5HZXQoUiwgJ2ZsYWdzJykpO1xuXHR2YXIgZmxhZ3MgPSB0bXAuZmxhZ3M7XG5cdC8vIHZhciBtYXRjaGVyID0gRVMuQ29uc3RydWN0KEMsIFtSLCBmbGFnc10pO1xuXHR2YXIgbWF0Y2hlciA9IHRtcC5tYXRjaGVyO1xuXG5cdHZhciBsYXN0SW5kZXggPSBFUy5Ub0xlbmd0aChFUy5HZXQoUiwgJ2xhc3RJbmRleCcpKTtcblx0RVMuU2V0KG1hdGNoZXIsICdsYXN0SW5kZXgnLCBsYXN0SW5kZXgsIHRydWUpO1xuXHR2YXIgZ2xvYmFsID0gZmxhZ3MuaW5kZXhPZignZycpID4gLTE7XG5cdHZhciBmdWxsVW5pY29kZSA9IGZsYWdzLmluZGV4T2YoJ3UnKSA+IC0xO1xuXHRyZXR1cm4gQ3JlYXRlUmVnRXhwU3RyaW5nSXRlcmF0b3IobWF0Y2hlciwgUywgZ2xvYmFsLCBmdWxsVW5pY29kZSk7XG59O1xuXG52YXIgZGVmaW5lUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuaWYgKGRlZmluZVAgJiYgZ09QRCkge1xuXHR2YXIgZGVzYyA9IGdPUEQocmVnZXhNYXRjaEFsbCwgJ25hbWUnKTtcblx0aWYgKGRlc2MgJiYgZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRkZWZpbmVQKHJlZ2V4TWF0Y2hBbGwsICduYW1lJywgeyB2YWx1ZTogJ1tTeW1ib2wubWF0Y2hBbGxdJyB9KTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2V4TWF0Y2hBbGw7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0b09iamVjdCA9IE9iamVjdDtcbnZhciBUeXBlRXJyID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYWdzKCkge1xuXHRpZiAodGhpcyAhPSBudWxsICYmIHRoaXMgIT09IHRvT2JqZWN0KHRoaXMpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnIoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgZ2V0dGVyIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9ICcnO1xuXHRpZiAodGhpcy5nbG9iYWwpIHtcblx0XHRyZXN1bHQgKz0gJ2cnO1xuXHR9XG5cdGlmICh0aGlzLmlnbm9yZUNhc2UpIHtcblx0XHRyZXN1bHQgKz0gJ2knO1xuXHR9XG5cdGlmICh0aGlzLm11bHRpbGluZSkge1xuXHRcdHJlc3VsdCArPSAnbSc7XG5cdH1cblx0aWYgKHRoaXMuZG90QWxsKSB7XG5cdFx0cmVzdWx0ICs9ICdzJztcblx0fVxuXHRpZiAodGhpcy51bmljb2RlKSB7XG5cdFx0cmVzdWx0ICs9ICd1Jztcblx0fVxuXHRpZiAodGhpcy5zdGlja3kpIHtcblx0XHRyZXN1bHQgKz0gJ3knO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIFR5cGVFcnIgPSBUeXBlRXJyb3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdSZWdFeHAucHJvdG90eXBlLmZsYWdzIHJlcXVpcmVzIGEgdHJ1ZSBFUzUgZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBwcm9wZXJ0eSBkZXNjcmlwdG9ycycpO1xuXHR9XG5cdGlmICgvYS9taWcuZmxhZ3MgPT09ICdnaW0nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBnT1BEKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuXHRcdGlmIChkZXNjcmlwdG9yICYmIHR5cGVvZiBkZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKC9hLykuZG90QWxsID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHJldHVybiBkZXNjcmlwdG9yLmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xufTtcbiIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RvY3VtZW50LWNyZWF0ZS1lbGVtZW50JykoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnc3BlY2llcycpO1xuXG4vLyBgQXJyYXlTcGVjaWVzQ3JlYXRlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5c3BlY2llc2NyZWF0ZVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWxBcnJheSwgbGVuZ3RoKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbEFycmF5KSkge1xuICAgIEMgPSBvcmlnaW5hbEFycmF5LmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBlbHNlIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIG5ldyAoQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDKShsZW5ndGggPT09IDAgPyAwIDogbGVuZ3RoKTtcbn07XG4iLCIvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpO1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKSgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsInZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIFdlYWtNYXAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJykuV2Vha01hcDtcblxubW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyAmJiAvbmF0aXZlIGNvZGUvLnRlc3QobmF0aXZlRnVuY3Rpb25Ub1N0cmluZy5jYWxsKFdlYWtNYXApKTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vd24ta2V5cycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICB2YXIga2V5cyA9IG93bktleXMoc291cmNlKTtcbiAgdmFyIGRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHlNb2R1bGUuZjtcbiAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoIWhhcyh0YXJnZXQsIGtleSkpIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgfVxufTtcbiIsInZhciBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LW5hbWVzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpLlJlZmxlY3Q7XG5cbi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUuZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHJldHVybiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWFic29sdXRlLWluZGV4Jyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUueyBpbmRleE9mLCBpbmNsdWRlcyB9YCBtZXRob2RzIGltcGxlbWVudGF0aW9uXG4vLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5kZXhvZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSVNfSU5DTFVERVMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgZWwsIGZyb21JbmRleCkge1xuICAgIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IHRvQWJzb2x1dGVJbmRleChmcm9tSW5kZXgsIGxlbmd0aCk7XG4gICAgdmFyIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKSB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIGlmICh2YWx1ZSAhPSB2YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjaW5kZXhPZiBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pIHtcbiAgICAgIGlmIChPW2luZGV4XSA9PT0gZWwpIHJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gSGVscGVyIGZvciBhIHBvcHVsYXIgcmVwZWF0aW5nIGNhc2Ugb2YgdGhlIHNwZWM6XG4vLyBMZXQgaW50ZWdlciBiZSA/IFRvSW50ZWdlcihpbmRleCkuXG4vLyBJZiBpbnRlZ2VyIDwgMCwgbGV0IHJlc3VsdCBiZSBtYXgoKGxlbmd0aCArIGludGVnZXIpLCAwKTsgZWxzZSBsZXQgcmVzdWx0IGJlIG1pbihsZW5ndGgsIGxlbmd0aCkuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIHZhciBpbnRlZ2VyID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGludGVnZXIgPCAwID8gbWF4KGludGVnZXIgKyBsZW5ndGgsIDApIDogbWluKGludGVnZXIsIGxlbmd0aCk7XG59O1xuIiwidmFyIGNsYXNzb2ZSYXcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIENPUlJFQ1RfQVJHVU1FTlRTID0gY2xhc3NvZlJhdyhmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZXJyb3IpIHsgLyogZW1wdHkgKi8gfVxufTtcblxuLy8gZ2V0dGluZyB0YWcgZnJvbSBFUzYrIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIHRhZywgcmVzdWx0O1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAodGFnID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUT19TVFJJTkdfVEFHKSkgPT0gJ3N0cmluZycgPyB0YWdcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IENPUlJFQ1RfQVJHVU1FTlRTID8gY2xhc3NvZlJhdyhPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChyZXN1bHQgPSBjbGFzc29mUmF3KE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogcmVzdWx0O1xufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBERVNDUklQVE9SUyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyA9IG9iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihPLCBrZXkgPSBrZXlzW2krK10sIFByb3BlcnRpZXNba2V5XSk7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5kb2N1bWVudDtcblxubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9yaWdpbmFsTW9kdWxlKSB7XG5cdGlmICghb3JpZ2luYWxNb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0dmFyIG1vZHVsZSA9IE9iamVjdC5jcmVhdGUob3JpZ2luYWxNb2R1bGUpO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImV4cG9ydHNcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwidmFyIFVOU0NPUEFCTEVTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3Vuc2NvcGFibGVzJyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xuaWYgKEFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpIHtcbiAgaGlkZShBcnJheVByb3RvdHlwZSwgVU5TQ09QQUJMRVMsIGNyZWF0ZShudWxsKSk7XG59XG5cbi8vIGFkZCBhIGtleSB0byBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG5pZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBhbk9iamVjdChPKTtcbiAgaWYgKCFpc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIgKyBTdHJpbmcocHJvdG8pICsgJyBhcyBhIHByb3RvdHlwZScpO1xuICB9XG59O1xuIiwiLy8gaXRlcmFibGUgRE9NIGNvbGxlY3Rpb25zXG4vLyBmbGFnIC0gYGl0ZXJhYmxlYCBpbnRlcmZhY2UgLSAnZW50cmllcycsICdrZXlzJywgJ3ZhbHVlcycsICdmb3JFYWNoJyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IDAsXG4gIENTU1N0eWxlRGVjbGFyYXRpb246IDAsXG4gIENTU1ZhbHVlTGlzdDogMCxcbiAgQ2xpZW50UmVjdExpc3Q6IDAsXG4gIERPTVJlY3RMaXN0OiAwLFxuICBET01TdHJpbmdMaXN0OiAwLFxuICBET01Ub2tlbkxpc3Q6IDEsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiAwLFxuICBGaWxlTGlzdDogMCxcbiAgSFRNTEFsbENvbGxlY3Rpb246IDAsXG4gIEhUTUxDb2xsZWN0aW9uOiAwLFxuICBIVE1MRm9ybUVsZW1lbnQ6IDAsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiAwLFxuICBNZWRpYUxpc3Q6IDAsXG4gIE1pbWVUeXBlQXJyYXk6IDAsXG4gIE5hbWVkTm9kZU1hcDogMCxcbiAgTm9kZUxpc3Q6IDEsXG4gIFBhaW50UmVxdWVzdExpc3Q6IDAsXG4gIFBsdWdpbjogMCxcbiAgUGx1Z2luQXJyYXk6IDAsXG4gIFNWR0xlbmd0aExpc3Q6IDAsXG4gIFNWR051bWJlckxpc3Q6IDAsXG4gIFNWR1BhdGhTZWdMaXN0OiAwLFxuICBTVkdQb2ludExpc3Q6IDAsXG4gIFNWR1N0cmluZ0xpc3Q6IDAsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IDAsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsXG4gIFN0eWxlU2hlZXRMaXN0OiAwLFxuICBUZXh0VHJhY2tDdWVMaXN0OiAwLFxuICBUZXh0VHJhY2tMaXN0OiAwLFxuICBUb3VjaExpc3Q6IDBcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgbmF0aXZlRm9yRWFjaCA9IFtdLmZvckVhY2g7XG52YXIgaW50ZXJuYWxGb3JFYWNoID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZHMnKSgwKTtcblxudmFyIFNMT1BQWV9NRVRIT0QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2xvcHB5LWFycmF5LW1ldGhvZCcpKCdmb3JFYWNoJyk7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuZm9yZWFjaFxubW9kdWxlLmV4cG9ydHMgPSBTTE9QUFlfTUVUSE9EID8gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICByZXR1cm4gaW50ZXJuYWxGb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG59IDogbmF0aXZlRm9yRWFjaDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvclwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNsaWVudEFwaVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY2xpZW50X2FwaVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVmYXVsdERlY29yYXRlU3RvcnlcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2NsaWVudF9hcGkuZGVmYXVsdERlY29yYXRlU3Rvcnk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU3RvcnlTdG9yZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfc3Rvcnlfc3RvcmVbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbmZpZ0FwaVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfY29uZmlnX2FwaVtcImRlZmF1bHRcIl07XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3Vic2NyaXB0aW9uc1N0b3JlXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9zdWJzY3JpcHRpb25zX3N0b3JlW1wiZGVmYXVsdFwiXTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXRoVG9JZFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGF0aFRvSWRbXCJkZWZhdWx0XCJdO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFF1ZXJ5UGFyYW1zXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9xdWVyeXBhcmFtcy5nZXRRdWVyeVBhcmFtcztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRRdWVyeVBhcmFtXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9xdWVyeXBhcmFtcy5nZXRRdWVyeVBhcmFtO1xuICB9XG59KTtcblxudmFyIF9jbGllbnRfYXBpID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vY2xpZW50X2FwaVwiKSk7XG5cbnZhciBfc3Rvcnlfc3RvcmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0b3J5X3N0b3JlXCIpKTtcblxudmFyIF9jb25maWdfYXBpID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9jb25maWdfYXBpXCIpKTtcblxudmFyIF9zdWJzY3JpcHRpb25zX3N0b3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdWJzY3JpcHRpb25zX3N0b3JlXCIpKTtcblxudmFyIF9wYXRoVG9JZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGF0aFRvSWRcIikpO1xuXG52YXIgX3F1ZXJ5cGFyYW1zID0gcmVxdWlyZShcIi4vcXVlcnlwYXJhbXNcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IHt9OyBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH0iLCIndXNlIHN0cmljdCc7XG52YXIgaW50ZXJuYWxGaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LW1ldGhvZHMnKSg1KTtcbnZhciBGSU5EID0gJ2ZpbmQnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUsIGZvcmNlZDogU0tJUFNfSE9MRVMgfSwge1xuICBmaW5kOiBmdW5jdGlvbiBmaW5kKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsRmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUtQEB1bnNjb3BhYmxlc1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcycpKEZJTkQpO1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG4vLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBFTlRSSUVTKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEVOVFJJRVMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmV0dXJuTWV0aG9kID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXR1cm5NZXRob2QgIT09IHVuZGVmaW5lZCkgYW5PYmplY3QocmV0dXJuTWV0aG9kLmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpLmY7XG5cbi8vIFRPX0VOVFJJRVM6IHRydWUgIC0+IE9iamVjdC5lbnRyaWVzXG4vLyBUT19FTlRSSUVTOiBmYWxzZSAtPiBPYmplY3QudmFsdWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVE9fRU5UUklFUykge1xuICB2YXIgTyA9IHRvSW5kZXhlZE9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhPKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGlmIChwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpIHtcbiAgICByZXN1bHQucHVzaChUT19FTlRSSUVTID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldC1yZWdleHAucHJvdG90eXBlLmZsYWdzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSBhbk9iamVjdCh0aGlzKTtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuICBpZiAodGhhdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmICh0aGF0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG4gIGlmICh0aGF0Lm11bHRpbGluZSkgcmVzdWx0ICs9ICdtJztcbiAgaWYgKHRoYXQudW5pY29kZSkgcmVzdWx0ICs9ICd1JztcbiAgaWYgKHRoYXQuc3RpY2t5KSByZXN1bHQgKz0gJ3knO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2xcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXJcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZ1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZ1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5pbW1lZGlhdGVcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4cG9ydHMuQ2hhbm5lbCA9IHZvaWQgMDtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgZ2VuZXJhdGVSYW5kb21JZCA9IGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tSWQoKSB7XG4gIC8vIGdlbmVyYXRlcyBhIHJhbmRvbSAxMyBjaGFyYWN0ZXIgc3RyaW5nXG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyKTtcbn07XG5cbnZhciBDaGFubmVsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2hhbm5lbCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICB0cmFuc3BvcnQgPSBfcmVmLnRyYW5zcG9ydCxcbiAgICAgICAgX3JlZiRhc3luYyA9IF9yZWYuYXN5bmMsXG4gICAgICAgIGFzeW5jID0gX3JlZiRhc3luYyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGFzeW5jO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENoYW5uZWwpO1xuXG4gICAgdGhpcy5pc0FzeW5jID0gdm9pZCAwO1xuICAgIHRoaXMuc2VuZGVyID0gZ2VuZXJhdGVSYW5kb21JZCgpO1xuICAgIHRoaXMuZXZlbnRzID0ge307XG4gICAgdGhpcy50cmFuc3BvcnQgPSB2b2lkIDA7XG4gICAgdGhpcy5pc0FzeW5jID0gYXN5bmM7XG5cbiAgICBpZiAodHJhbnNwb3J0KSB7XG4gICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAgIHRoaXMudHJhbnNwb3J0LnNldEhhbmRsZXIoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ2hhbm5lbCwgW3tcbiAgICBrZXk6IFwiYWRkTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0gfHwgW107XG4gICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRQZWVyTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUGVlckxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBwZWVyTGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICAgIHBlZXJMaXN0ZW5lci5pZ25vcmVQZWVyID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBwZWVyTGlzdGVuZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBldmVudE5hbWUsXG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICAgIGZyb206IHRoaXMuc2VuZGVyXG4gICAgICB9O1xuICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID49IDEgJiYgYXJnc1swXSAmJiBhcmdzWzBdLm9wdGlvbnMpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1kZXN0cnVjdHVyaW5nXG4gICAgICAgIG9wdGlvbnMgPSBhcmdzWzBdLm9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgaWYgKF90aGlzMi50cmFuc3BvcnQpIHtcbiAgICAgICAgICBfdGhpczIudHJhbnNwb3J0LnNlbmQoZXZlbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMyLmhhbmRsZUV2ZW50KGV2ZW50LCB0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLmlzQXN5bmMpIHtcbiAgICAgICAgLy8gdG9kbyBJJ20gbm90IHN1cmUgaG93IHRvIHRlc3QgdGhpc1xuICAgICAgICBzZXRJbW1lZGlhdGUoaGFuZGxlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV2ZW50TmFtZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXZlbnROYW1lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmV2ZW50cyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxpc3RlbmVyQ291bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuZXJDb3VudChldmVudE5hbWUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycyhldmVudE5hbWUpO1xuICAgICAgcmV0dXJuIGxpc3RlbmVycyA/IGxpc3RlbmVycy5sZW5ndGggOiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsaXN0ZW5lcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuZXZlbnRzW2V2ZW50TmFtZV07XG4gICAgICByZXR1cm4gbGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBvbmNlTGlzdGVuZXIgPSB0aGlzLm9uY2VMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBvbmNlTGlzdGVuZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVBbGxMaXN0ZW5lcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgaWYgKCFldmVudE5hbWUpIHtcbiAgICAgICAgdGhpcy5ldmVudHMgPSB7fTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHNbZXZlbnROYW1lXSkge1xuICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbZXZlbnROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzKGV2ZW50TmFtZSk7XG5cbiAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IGxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgICByZXR1cm4gbCAhPT0gbGlzdGVuZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCkge1xuICAgICAgdmFyIGlzUGVlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMoZXZlbnQudHlwZSk7XG5cbiAgICAgIGlmIChsaXN0ZW5lcnMgJiYgKGlzUGVlciB8fCBldmVudC5mcm9tICE9PSB0aGlzLnNlbmRlcikpIHtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgcmV0dXJuICEoaXNQZWVyICYmIGZuLmlnbm9yZVBlZXIpICYmIGZuLmFwcGx5KHZvaWQgMCwgX3RvQ29uc3VtYWJsZUFycmF5KGV2ZW50LmFyZ3MpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9uY2VMaXN0ZW5lclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBvbmNlTGlzdGVuZXIgPSBmdW5jdGlvbiBvbmNlTGlzdGVuZXIoKSB7XG4gICAgICAgIF90aGlzMy5yZW1vdmVMaXN0ZW5lcihldmVudE5hbWUsIG9uY2VMaXN0ZW5lcik7XG5cbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBvbmNlTGlzdGVuZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1RyYW5zcG9ydFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuICEhdGhpcy50cmFuc3BvcnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENoYW5uZWw7XG59KCk7XG5cbmV4cG9ydHMuQ2hhbm5lbCA9IENoYW5uZWw7XG52YXIgX2RlZmF1bHQgPSBDaGFubmVsO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW50ZWdlcicpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MUyA9IC9cXCQoWyQmYCddfFxcZFxcZD98PFtePl0qPikvZztcbnZhciBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRCA9IC9cXCQoWyQmYCddfFxcZFxcZD8pL2c7XG5cbnZhciBtYXliZVRvU3RyaW5nID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gaXQgOiBTdHJpbmcoaXQpO1xufTtcblxuLy8gQEByZXBsYWNlIGxvZ2ljXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYycpKFxuICAncmVwbGFjZScsXG4gIDIsXG4gIGZ1bmN0aW9uIChSRVBMQUNFLCBuYXRpdmVSZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICAgIGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICAgIHZhciByZXBsYWNlciA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgICByZXR1cm4gcmVwbGFjZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gcmVwbGFjZXIuY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgICAgIDogbmF0aXZlUmVwbGFjZS5jYWxsKFN0cmluZyhPKSwgc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kXG4gICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAcmVwbGFjZVxuICAgICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUobmF0aXZlUmVwbGFjZSwgcmVnZXhwLCB0aGlzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG5cbiAgICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gdHlwZW9mIHJlcGxhY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgaWYgKCFmdW5jdGlvbmFsUmVwbGFjZSkgcmVwbGFjZVZhbHVlID0gU3RyaW5nKHJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcblxuICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICAgIGlmICghZ2xvYmFsKSBicmVhaztcblxuICAgICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG5cbiAgICAgICAgICB2YXIgbWF0Y2hlZCA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICAgIHZhciBwb3NpdGlvbiA9IG1heChtaW4odG9JbnRlZ2VyKHJlc3VsdC5pbmRleCksIFMubGVuZ3RoKSwgMCk7XG4gICAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgICAgLy8gICBjYXB0dXJlcyA9IHJlc3VsdC5zbGljZSgxKS5tYXAobWF5YmVUb1N0cmluZylcbiAgICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgICAvLyB0aGUgc2xpY2UgcG9seWZpbGwgd2hlbiBzbGljaW5nIG5hdGl2ZSBhcnJheXMpIFwiZG9lc24ndCB3b3JrXCIgaW4gc2FmYXJpIDkgYW5kXG4gICAgICAgICAgLy8gY2F1c2VzIGEgY3Jhc2ggKGh0dHBzOi8vcGFzdGViaW4uY29tL04yMVF6ZVFBKSB3aGVuIHRyeWluZyB0byBkZWJ1ZyBpdC5cbiAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICAgIHZhciBuYW1lZENhcHR1cmVzID0gcmVzdWx0Lmdyb3VwcztcbiAgICAgICAgICBpZiAoZnVuY3Rpb25hbFJlcGxhY2UpIHtcbiAgICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSByZXBsYWNlckFyZ3MucHVzaChuYW1lZENhcHR1cmVzKTtcbiAgICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IFN0cmluZyhyZXBsYWNlVmFsdWUuYXBwbHkodW5kZWZpbmVkLCByZXBsYWNlckFyZ3MpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBnZXRTdWJzdGl0dXRpb24obWF0Y2hlZCwgUywgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgICBhY2N1bXVsYXRlZFJlc3VsdCArPSBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24pICsgcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICBuZXh0U291cmNlUG9zaXRpb24gPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0ZWRSZXN1bHQgKyBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbik7XG4gICAgICB9XG4gICAgXTtcblxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldHN1YnN0aXR1dGlvblxuICAgIGZ1bmN0aW9uIGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcbiAgICAgIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICAgIHZhciBtID0gY2FwdHVyZXMubGVuZ3RoO1xuICAgICAgdmFyIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtcbiAgICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmFtZWRDYXB0dXJlcyA9IHRvT2JqZWN0KG5hbWVkQ2FwdHVyZXMpO1xuICAgICAgICBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUmVwbGFjZS5jYWxsKHJlcGxhY2VtZW50LCBzeW1ib2xzLCBmdW5jdGlvbiAobWF0Y2gsIGNoKSB7XG4gICAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgICBzd2l0Y2ggKGNoLmNoYXJBdCgwKSkge1xuICAgICAgICAgIGNhc2UgJyQnOiByZXR1cm4gJyQnO1xuICAgICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgICBjYXNlICdgJzogcmV0dXJuIHN0ci5zbGljZSgwLCBwb3NpdGlvbik7XG4gICAgICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0ci5zbGljZSh0YWlsUG9zKTtcbiAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgIGNhcHR1cmUgPSBuYW1lZENhcHR1cmVzW2NoLnNsaWNlKDEsIC0xKV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgICB2YXIgbiA9ICtjaDtcbiAgICAgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgICAgdmFyIGYgPSBmbG9vcihuIC8gMTApO1xuICAgICAgICAgICAgICBpZiAoZiA9PT0gMCkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHR1cmUgPT09IHVuZGVmaW5lZCA/ICcnIDogY2FwdHVyZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuKTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgTUFUQ0ggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKSgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpKCdzcGVjaWVzJyk7XG5cbi8vIGBTcGVjaWVzQ29uc3RydWN0b3JgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3BlY2llc2NvbnN0cnVjdG9yXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBkZWZhdWx0Q29uc3RydWN0b3IpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbnN0cnVjdG9yIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ciA6IFN0cmluZyhzdHIpO1xuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICApIHtcbiAgICAgICAgICAgIG91dCArPSBzdHJpbmcuY2hhckF0KGkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV0gKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAxO1xuICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcbiAgICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6ICdSRkMzOTg2JyxcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcbiIsInZhciBMaXN0Q2FjaGUgPSByZXF1aXJlKCcuL19MaXN0Q2FjaGUnKSxcbiAgICBzdGFja0NsZWFyID0gcmVxdWlyZSgnLi9fc3RhY2tDbGVhcicpLFxuICAgIHN0YWNrRGVsZXRlID0gcmVxdWlyZSgnLi9fc3RhY2tEZWxldGUnKSxcbiAgICBzdGFja0dldCA9IHJlcXVpcmUoJy4vX3N0YWNrR2V0JyksXG4gICAgc3RhY2tIYXMgPSByZXF1aXJlKCcuL19zdGFja0hhcycpLFxuICAgIHN0YWNrU2V0ID0gcmVxdWlyZSgnLi9fc3RhY2tTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICB0aGlzLnNpemUgPSBkYXRhLnNpemU7XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG5TdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IHN0YWNrRGVsZXRlO1xuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuU3RhY2sucHJvdG90eXBlLnNldCA9IHN0YWNrU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN0YWNrO1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwidmFyIGJhc2VBc3NpZ25WYWx1ZSA9IHJlcXVpcmUoJy4vX2Jhc2VBc3NpZ25WYWx1ZScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpO1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXNzaWduVmFsdWVgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYXNzaWduXG4gKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKCh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmICFlcShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzc2lnbk1lcmdlVmFsdWU7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyk7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmluZVByb3BlcnR5O1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gVWludDhBcnJheTtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIGJhc2VJc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vX2Jhc2VJc0FyZ3VtZW50cycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FyZ3VtZW50cyA9IGJhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IGJhc2VJc0FyZ3VtZW50cyA6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJndW1lbnRzO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwiLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2FmZUdldChvYmplY3QsIGtleSkge1xuICBpZiAoa2V5ID09PSAnY29uc3RydWN0b3InICYmIHR5cGVvZiBvYmplY3Rba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChrZXkgPT0gJ19fcHJvdG9fXycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2FmZUdldDtcbiIsInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsInZhciBiYXNlVGltZXMgPSByZXF1aXJlKCcuL19iYXNlVGltZXMnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNCdWZmZXIgPSByZXF1aXJlKCcuL2lzQnVmZmVyJyksXG4gICAgaXNJbmRleCA9IHJlcXVpcmUoJy4vX2lzSW5kZXgnKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluaGVyaXRlZCBTcGVjaWZ5IHJldHVybmluZyBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZXMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLCBpbmhlcml0ZWQpIHtcbiAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgIWlzQXJnICYmIGlzQnVmZmVyKHZhbHVlKSxcbiAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW10sXG4gICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpICYmXG4gICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgIGtleSA9PSAnbGVuZ3RoJyB8fFxuICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgIC8vIFBoYW50b21KUyAyIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIHR5cGVkIGFycmF5cy5cbiAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgaXNJbmRleChrZXksIGxlbmd0aClcbiAgICAgICAgKSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlMaWtlS2V5cztcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiIsInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlTb21lID0gcmVxdWlyZSgnLi9fYXJyYXlTb21lJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xuICBpZiAoc3RhY2tlZCAmJiBzdGFjay5nZXQob3RoZXIpKSB7XG4gICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gIH1cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgc2VlbiA9IChiaXRtYXNrICYgQ09NUEFSRV9VTk9SREVSRURfRkxBRykgPyBuZXcgU2V0Q2FjaGUgOiB1bmRlZmluZWQ7XG5cbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaylcbiAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgIH1cbiAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoc2Vlbikge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkge1xuICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlZW4ucHVzaChvdGhJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIShcbiAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICBzdGFja1snZGVsZXRlJ10ob3RoZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxdWFsQXJyYXlzO1xuIiwidmFyIGJhc2VHZXQgPSByZXF1aXJlKCcuL19iYXNlR2V0Jyk7XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLCB0aGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaW4gaXRzIHBsYWNlLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy43LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gKiAvLyA9PiAzXG4gKlxuICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICogLy8gPT4gJ2RlZmF1bHQnXG4gKi9cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5tYXBcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGV4cG9ydHMuY3JlYXRlU3Vic2NyaXB0aW9uc1N0b3JlID0gdm9pZCAwO1xuXG52YXIgY3JlYXRlU3Vic2NyaXB0aW9uc1N0b3JlID0gZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uc1N0b3JlKCkge1xuICB2YXIgc3Vic2NyaXBpb25zID0gbmV3IE1hcCgpO1xuICByZXR1cm4ge1xuICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiByZWdpc3RlcihzdWJzY3JpYmUpIHtcbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcGlvbnMuZ2V0KHN1YnNjcmliZSk7XG5cbiAgICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgICB1bnN1YnNjcmliZTogc3Vic2NyaWJlKClcbiAgICAgICAgfTtcbiAgICAgICAgc3Vic2NyaXBpb25zLnNldChzdWJzY3JpYmUsIHN1YnNjcmlwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHN1YnNjcmlwdGlvbi51c2VkID0gdHJ1ZTtcbiAgICB9LFxuICAgIG1hcmtBbGxBc1VudXNlZDogZnVuY3Rpb24gbWFya0FsbEFzVW51c2VkKCkge1xuICAgICAgc3Vic2NyaXBpb25zLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgc3Vic2NyaXB0aW9uLnVzZWQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xlYXJVbnVzZWQ6IGZ1bmN0aW9uIGNsZWFyVW51c2VkKCkge1xuICAgICAgc3Vic2NyaXBpb25zLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmlwaW9uLCBrZXkpIHtcbiAgICAgICAgaWYgKHN1YnNjcmlwaW9uLnVzZWQpIHJldHVybjtcbiAgICAgICAgc3Vic2NyaXBpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgc3Vic2NyaXBpb25zW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnRzLmNyZWF0ZVN1YnNjcmlwdGlvbnNTdG9yZSA9IGNyZWF0ZVN1YnNjcmlwdGlvbnNTdG9yZTtcblxudmFyIF9kZWZhdWx0ID0gY3JlYXRlU3Vic2NyaXB0aW9uc1N0b3JlKCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gYE1hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hcC1vYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uJykoJ01hcCcsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE1hcCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbi1zdHJvbmcnKSwgdHJ1ZSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgdGFyZ2V0LCBDKSB7XG4gIHZhciBTID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB2YXIgUDtcbiAgaWYgKFMgIT09IEMgJiYgdHlwZW9mIFMgPT0gJ2Z1bmN0aW9uJyAmJiAoUCA9IFMucHJvdG90eXBlKSAhPT0gQy5wcm90b3R5cGUgJiYgaXNPYmplY3QoUCkgJiYgc2V0UHJvdG90eXBlT2YpIHtcbiAgICBzZXRQcm90b3R5cGVPZih0aGF0LCBQKTtcbiAgfSByZXR1cm4gdGhhdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4taW5zdGFuY2UnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYXN0S2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJykuZmFzdEtleTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGludGVybmFsU3RhdGVHZXR0ZXJGb3IgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldHRlckZvcjtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgQ09OU1RSVUNUT1JfTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgICBzZXRJbnRlcm5hbFN0YXRlKHRoYXQsIHtcbiAgICAgICAgdHlwZTogQ09OU1RSVUNUT1JfTkFNRSxcbiAgICAgICAgaW5kZXg6IGNyZWF0ZShudWxsKSxcbiAgICAgICAgZmlyc3Q6IHVuZGVmaW5lZCxcbiAgICAgICAgbGFzdDogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiAwXG4gICAgICB9KTtcbiAgICAgIGlmICghREVTQ1JJUFRPUlMpIHRoYXQuc2l6ZSA9IDA7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBpdGVyYXRlKGl0ZXJhYmxlLCB0aGF0W0FEREVSXSwgdGhhdCwgSVNfTUFQKTtcbiAgICB9KTtcblxuICAgIHZhciBnZXRJbnRlcm5hbFN0YXRlID0gaW50ZXJuYWxTdGF0ZUdldHRlckZvcihDT05TVFJVQ1RPUl9OQU1FKTtcblxuICAgIHZhciBkZWZpbmUgPSBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICB2YXIgcHJldmlvdXMsIGluZGV4O1xuICAgICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLmxhc3QgPSBlbnRyeSA9IHtcbiAgICAgICAgICBpbmRleDogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyA9IHN0YXRlLmxhc3QsXG4gICAgICAgICAgbmV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbW92ZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc3RhdGUuZmlyc3QpIHN0YXRlLmZpcnN0ID0gZW50cnk7XG4gICAgICAgIGlmIChwcmV2aW91cykgcHJldmlvdXMubmV4dCA9IGVudHJ5O1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUrKztcbiAgICAgICAgZWxzZSB0aGF0LnNpemUrKztcbiAgICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSBzdGF0ZS5pbmRleFtpbmRleF0gPSBlbnRyeTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAvLyBmYXN0IGNhc2VcbiAgICAgIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgICAgIHZhciBlbnRyeTtcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSByZXR1cm4gc3RhdGUuaW5kZXhbaW5kZXhdO1xuICAgICAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gICAgICBmb3IgKGVudHJ5ID0gc3RhdGUuZmlyc3Q7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm5leHQpIHtcbiAgICAgICAgaWYgKGVudHJ5LmtleSA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGF0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBzdGF0ZS5pbmRleDtcbiAgICAgICAgdmFyIGVudHJ5ID0gc3RhdGUuZmlyc3Q7XG4gICAgICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgICAgIGVudHJ5LnJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wcmV2aW91cykgZW50cnkucHJldmlvdXMgPSBlbnRyeS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmluZGV4XTtcbiAgICAgICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZmlyc3QgPSBzdGF0ZS5sYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUgPSAwO1xuICAgICAgICBlbHNlIHRoYXQuc2l6ZSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhciBuZXh0ID0gZW50cnkubmV4dDtcbiAgICAgICAgICB2YXIgcHJldiA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICAgIGRlbGV0ZSBzdGF0ZS5pbmRleFtlbnRyeS5pbmRleF07XG4gICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHByZXYpIHByZXYubmV4dCA9IG5leHQ7XG4gICAgICAgICAgaWYgKG5leHQpIG5leHQucHJldmlvdXMgPSBwcmV2O1xuICAgICAgICAgIGlmIChzdGF0ZS5maXJzdCA9PSBlbnRyeSkgc3RhdGUuZmlyc3QgPSBuZXh0O1xuICAgICAgICAgIGlmIChzdGF0ZS5sYXN0ID09IGVudHJ5KSBzdGF0ZS5sYXN0ID0gcHJldjtcbiAgICAgICAgICBpZiAoREVTQ1JJUFRPUlMpIHN0YXRlLnNpemUtLTtcbiAgICAgICAgICBlbHNlIHRoYXQuc2l6ZS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uZXh0IDogc3RhdGUuZmlyc3QpIHtcbiAgICAgICAgICBib3VuZEZ1bmN0aW9uKGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yZW1vdmVkKSBlbnRyeSA9IGVudHJ5LnByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjcgTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuMi4zLjcgU2V0LnByb3RvdHlwZS5oYXModmFsdWUpXG4gICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBJU19NQVAgPyB7XG4gICAgICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhpcywga2V5KTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnZhbHVlO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICAvLyAyMy4yLjMuMSBTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZGVmaW5lUHJvcGVydHkoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNpemU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIENPTlNUUlVDVE9SX05BTUUsIElTX01BUCkge1xuICAgIHZhciBJVEVSQVRPUl9OQU1FID0gQ09OU1RSVUNUT1JfTkFNRSArICcgSXRlcmF0b3InO1xuICAgIHZhciBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG4gICAgdmFyIGdldEludGVybmFsSXRlcmF0b3JTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoSVRFUkFUT1JfTkFNRSk7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgIGRlZmluZUl0ZXJhdG9yKEMsIENPTlNUUlVDVE9SX05BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgc2V0SW50ZXJuYWxTdGF0ZSh0aGlzLCB7XG4gICAgICAgIHR5cGU6IElURVJBVE9SX05BTUUsXG4gICAgICAgIHRhcmdldDogaXRlcmF0ZWQsXG4gICAgICAgIHN0YXRlOiBnZXRJbnRlcm5hbENvbGxlY3Rpb25TdGF0ZShpdGVyYXRlZCksXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIGxhc3Q6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpO1xuICAgICAgdmFyIGtpbmQgPSBzdGF0ZS5raW5kO1xuICAgICAgdmFyIGVudHJ5ID0gc3RhdGUubGFzdDtcbiAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnJlbW92ZWQpIGVudHJ5ID0gZW50cnkucHJldmlvdXM7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCFzdGF0ZS50YXJnZXQgfHwgIShzdGF0ZS5sYXN0ID0gZW50cnkgPSBlbnRyeSA/IGVudHJ5Lm5leHQgOiBzdGF0ZS5zdGF0ZS5maXJzdCkpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgc3RhdGUudGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiB7IHZhbHVlOiBlbnRyeS5rZXksIGRvbmU6IGZhbHNlIH07XG4gICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IGVudHJ5LnZhbHVlLCBkb25lOiBmYWxzZSB9O1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IFtlbnRyeS5rZXksIGVudHJ5LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoQ09OU1RSVUNUT1JfTkFNRSk7XG4gIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQyA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkZWZpbmVQcm9wZXJ0eShDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGludGVybmFsSW5kZXhPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBuYXRpdmVJbmRleE9mID0gW10uaW5kZXhPZjtcblxudmFyIE5FR0FUSVZFX1pFUk8gPSAhIW5hdGl2ZUluZGV4T2YgJiYgMSAvIFsxXS5pbmRleE9mKDEsIC0wKSA8IDA7XG52YXIgU0xPUFBZX01FVEhPRCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zbG9wcHktYXJyYXktbWV0aG9kJykoJ2luZGV4T2YnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5pbmRleE9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IE5FR0FUSVZFX1pFUk8gfHwgU0xPUFBZX01FVEhPRCB9LCB7XG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gTkVHQVRJVkVfWkVST1xuICAgICAgLy8gY29udmVydCAtMCB0byArMFxuICAgICAgPyBuYXRpdmVJbmRleE9mLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMFxuICAgICAgOiBpbnRlcm5hbEluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxuLy8gYE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5kZWZpbmVwcm9wZXJ0aWVzXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6ICFERVNDUklQVE9SUywgc2hhbTogIURFU0NSSVBUT1JTIH0sIHtcbiAgZGVmaW5lUHJvcGVydGllczogcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcycpXG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBvbkZyZWV6ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1tZXRhZGF0YScpLm9uRnJlZXplO1xudmFyIG5hdGl2ZUZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG52YXIgRlJFRVpJTkcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnJlZXppbmcnKTtcbnZhciBGQUlMU19PTl9QUklNSVRJVkVTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJykoZnVuY3Rpb24gKCkgeyBuYXRpdmVGcmVlemUoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmZyZWV6ZWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QuZnJlZXplXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZBSUxTX09OX1BSSU1JVElWRVMsIHNoYW06ICFGUkVFWklORyB9LCB7XG4gIGZyZWV6ZTogZnVuY3Rpb24gZnJlZXplKGl0KSB7XG4gICAgcmV0dXJuIG5hdGl2ZUZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyBuYXRpdmVGcmVlemUob25GcmVlemUoaXQpKSA6IGl0O1xuICB9XG59KTtcbiIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQnKTtcbnZhciBzbGljZSA9IFtdLnNsaWNlO1xuXG52YXIgTVNJRSA9IC9NU0lFIC5cXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVja1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChmbiwgdGltZSAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBmYWxzZTtcbiAgICByZXR1cm4gc2V0KGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gOiBmbiwgdGltZSk7XG4gIH07XG59O1xuXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyBnbG9iYWw6IHRydWUsIGJpbmQ6IHRydWUsIGZvcmNlZDogTVNJRSB9LCB7XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ciA6IFN0cmluZyhzdHIpO1xuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICApIHtcbiAgICAgICAgICAgIG91dCArPSBzdHJpbmcuY2hhckF0KGkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV0gKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAxO1xuICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcbiAgICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6ICdSRkMzOTg2JyxcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLm1hdGNoXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBwYXRoVG9JZDtcblxuZnVuY3Rpb24gcGF0aFRvSWQocGF0aCkge1xuICB2YXIgbWF0Y2ggPSAocGF0aCB8fCAnJykubWF0Y2goL15cXC9zdG9yeVxcLyguKykvKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXRoICdcIi5jb25jYXQocGF0aCwgXCInLCAgbXVzdCBzdGFydCB3aXRoICcvc3RvcnkvJ1wiKSk7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hbMV07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlY1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRRdWVyeVBhcmFtID0gZXhwb3J0cy5nZXRRdWVyeVBhcmFtcyA9IHZvaWQgMDtcblxudmFyIF9nbG9iYWwgPSByZXF1aXJlKFwiZ2xvYmFsXCIpO1xuXG52YXIgX3FzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicXNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxudmFyIGdldFF1ZXJ5UGFyYW1zID0gZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbXMoKSB7XG4gIC8vIGRvY3VtZW50LmxvY2F0aW9uIGlzIG5vdCBkZWZpbmVkIGluIHJlYWN0LW5hdGl2ZVxuICBpZiAoX2dsb2JhbC5kb2N1bWVudCAmJiBfZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uICYmIF9nbG9iYWwuZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgcmV0dXJuIF9xc1tcImRlZmF1bHRcIl0ucGFyc2UoX2dsb2JhbC5kb2N1bWVudC5sb2NhdGlvbi5zZWFyY2gsIHtcbiAgICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge307XG59O1xuXG5leHBvcnRzLmdldFF1ZXJ5UGFyYW1zID0gZ2V0UXVlcnlQYXJhbXM7XG5cbnZhciBnZXRRdWVyeVBhcmFtID0gZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbShrZXkpIHtcbiAgdmFyIHBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1zKCk7XG4gIHJldHVybiBwYXJhbXNba2V5XTtcbn07XG5cbmV4cG9ydHMuZ2V0UXVlcnlQYXJhbSA9IGdldFF1ZXJ5UGFyYW07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEMsIGFyZ3NMZW5ndGgsIGFyZ3MpIHtcbiAgaWYgKCEoYXJnc0xlbmd0aCBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbGlzdCA9IFtdLCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgbGlzdFtpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1thcmdzTGVuZ3RoXSA9IEZ1bmN0aW9uKCdDLGEnLCAncmV0dXJuIG5ldyBDKCcgKyBsaXN0LmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1thcmdzTGVuZ3RoXShDLCBhcmdzKTtcbn07XG5cbi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBmdW5jdGlvbiBib3VuZCgvKiBhcmdzLi4uICovKSB7XG4gICAgdmFyIGFyZ3MgPSBwYXJ0QXJncy5jb25jYXQoYXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgYm91bmRGdW5jdGlvbiA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogZm4uYXBwbHkodGhhdCwgYXJncyk7XG4gIH07XG4gIGlmIChpc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZEZ1bmN0aW9uLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgcmV0dXJuIGJvdW5kRnVuY3Rpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgSVNfUFVSRSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1wdXJlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgaG9zdFJlcG9ydEVycm9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3NwZWNpZXMnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0O1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBnZXRJbnRlcm5hbFByb21pc2VTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFBST01JU0UpO1xudmFyIFByb21pc2VDb25zdHJ1Y3RvciA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciAkZmV0Y2ggPSBnbG9iYWwuZmV0Y2g7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG52YXIgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHk7XG52YXIgSVNfTk9ERSA9IGNsYXNzb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnO1xudmFyIERJU1BBVENIX0VWRU5UID0gISEoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgZ2xvYmFsLmRpc3BhdGNoRXZlbnQpO1xudmFyIFVOSEFORExFRF9SRUpFQ1RJT04gPSAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnZhciBSRUpFQ1RJT05fSEFORExFRCA9ICdyZWplY3Rpb25oYW5kbGVkJztcbnZhciBQRU5ESU5HID0gMDtcbnZhciBGVUxGSUxMRUQgPSAxO1xudmFyIFJFSkVDVEVEID0gMjtcbnZhciBIQU5ETEVEID0gMTtcbnZhciBVTkhBTkRMRUQgPSAyO1xudmFyIEludGVybmFsLCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgUHJvbWlzZVdyYXBwZXI7XG5cbnZhciBGT1JDRUQgPSBpc0ZvcmNlZChQUk9NSVNFLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICB2YXIgcHJvbWlzZSA9IFByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKDEpO1xuICB2YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4gIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW1NQRUNJRVNdID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gIH07XG4gIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgcmV0dXJuICEoKElTX05PREUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICYmICghSVNfUFVSRSB8fCBwcm9taXNlWydmaW5hbGx5J10pXG4gICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgLy8gdjggNi42IChOb2RlIDEwIGFuZCBDaHJvbWUgNjYpIGhhdmUgYSBidWcgd2l0aCByZXNvbHZpbmcgY3VzdG9tIHRoZW5hYmxlc1xuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgJiYgdjguaW5kZXhPZignNi42JykgIT09IDBcbiAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xKTtcbn0pO1xuXG52YXIgSU5DT1JSRUNUX0lURVJBVElPTiA9IEZPUkNFRCB8fCAhY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uKGZ1bmN0aW9uIChpdGVyYWJsZSkge1xuICBQcm9taXNlQ29uc3RydWN0b3IuYWxsKGl0ZXJhYmxlKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xuXG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCBpc1JlamVjdCkge1xuICBpZiAoc3RhdGUubm90aWZpZWQpIHJldHVybjtcbiAgc3RhdGUubm90aWZpZWQgPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBzdGF0ZS5yZWFjdGlvbnM7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIG9rID0gc3RhdGUuc3RhdGUgPT0gRlVMRklMTEVEO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5yZWplY3Rpb24gPT09IFVOSEFORExFRCkgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSwgc3RhdGUpO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0aW9uID0gSEFORExFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBzdGF0ZS5yZWFjdGlvbnMgPSBbXTtcbiAgICBzdGF0ZS5ub3RpZmllZCA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhc3RhdGUucmVqZWN0aW9uKSBvblVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gIH0pO1xufTtcblxudmFyIGRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgcHJvbWlzZSwgcmVhc29uKSB7XG4gIHZhciBldmVudCwgaGFuZGxlcjtcbiAgaWYgKERJU1BBVENIX0VWRU5UKSB7XG4gICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICBldmVudC5wcm9taXNlID0gcHJvbWlzZTtcbiAgICBldmVudC5yZWFzb24gPSByZWFzb247XG4gICAgZXZlbnQuaW5pdEV2ZW50KG5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gZWxzZSBldmVudCA9IHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiByZWFzb24gfTtcbiAgaWYgKGhhbmRsZXIgPSBnbG9iYWxbJ29uJyArIG5hbWVdKSBoYW5kbGVyKGV2ZW50KTtcbiAgZWxzZSBpZiAobmFtZSA9PT0gVU5IQU5ETEVEX1JFSkVDVElPTikgaG9zdFJlcG9ydEVycm9ycygnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywgcmVhc29uKTtcbn07XG5cbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gc3RhdGUudmFsdWU7XG4gICAgdmFyIElTX1VOSEFORExFRCA9IGlzVW5oYW5kbGVkKHN0YXRlKTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChJU19VTkhBTkRMRUQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoSVNfTk9ERSkge1xuICAgICAgICAgIHByb2Nlc3MuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChVTkhBTkRMRURfUkVKRUNUSU9OLCBwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIEJyb3dzZXJzIHNob3VsZCBub3QgdHJpZ2dlciBgcmVqZWN0aW9uSGFuZGxlZGAgZXZlbnQgaWYgaXQgd2FzIGhhbmRsZWQgaGVyZSwgTm9kZUpTIC0gc2hvdWxkXG4gICAgICBzdGF0ZS5yZWplY3Rpb24gPSBJU19OT0RFIHx8IGlzVW5oYW5kbGVkKHN0YXRlKSA/IFVOSEFORExFRCA6IEhBTkRMRUQ7XG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyByZXN1bHQudmFsdWU7XG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUucmVqZWN0aW9uICE9PSBIQU5ETEVEICYmICFzdGF0ZS5wYXJlbnQ7XG59O1xuXG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIGlmIChJU19OT0RFKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCwgcHJvbWlzZSwgc3RhdGUudmFsdWUpO1xuICB9KTtcbn07XG5cbnZhciBiaW5kID0gZnVuY3Rpb24gKGZuLCBwcm9taXNlLCBzdGF0ZSwgdW53cmFwKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBmbihwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCk7XG4gIH07XG59O1xuXG52YXIgaW50ZXJuYWxSZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIHZhbHVlLCB1bndyYXApIHtcbiAgaWYgKHN0YXRlLmRvbmUpIHJldHVybjtcbiAgc3RhdGUuZG9uZSA9IHRydWU7XG4gIGlmICh1bndyYXApIHN0YXRlID0gdW53cmFwO1xuICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICBzdGF0ZS5zdGF0ZSA9IFJFSkVDVEVEO1xuICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIHRydWUpO1xufTtcblxudmFyIGludGVybmFsUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICB2YXIgdGhlbiA9IGlzVGhlbmFibGUodmFsdWUpO1xuICAgIGlmICh0aGVuKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpLFxuICAgICAgICAgICAgYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgd3JhcHBlciwgc3RhdGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpbnRlcm5hbFJlamVjdChwcm9taXNlLCB3cmFwcGVyLCBlcnJvciwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHN0YXRlLnN0YXRlID0gRlVMRklMTEVEO1xuICAgICAgbm90aWZ5KHByb21pc2UsIHN0YXRlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHsgZG9uZTogZmFsc2UgfSwgZXJyb3IsIHN0YXRlKTtcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmIChGT1JDRUQpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgUHJvbWlzZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIGFuSW5zdGFuY2UodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoYmluZChpbnRlcm5hbFJlc29sdmUsIHRoaXMsIHN0YXRlKSwgYmluZChpbnRlcm5hbFJlamVjdCwgdGhpcywgc3RhdGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaW50ZXJuYWxSZWplY3QodGhpcywgc3RhdGUsIGVycm9yKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICAgIHR5cGU6IFBST01JU0UsXG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIG5vdGlmaWVkOiBmYWxzZSxcbiAgICAgIHBhcmVudDogZmFsc2UsXG4gICAgICByZWFjdGlvbnM6IFtdLFxuICAgICAgcmVqZWN0aW9uOiBmYWxzZSxcbiAgICAgIHN0YXRlOiBQRU5ESU5HLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH0pO1xuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJykoUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSwge1xuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS50aGVuYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS50aGVuXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxQcm9taXNlU3RhdGUodGhpcyk7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgUHJvbWlzZUNvbnN0cnVjdG9yKSk7XG4gICAgICByZWFjdGlvbi5vayA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiB0cnVlO1xuICAgICAgcmVhY3Rpb24uZmFpbCA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IElTX05PREUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHN0YXRlLnBhcmVudCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWFjdGlvbnMucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAoc3RhdGUuc3RhdGUgIT0gUEVORElORykgbm90aWZ5KHRoaXMsIHN0YXRlLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIGBQcm9taXNlLnByb3RvdHlwZS5jYXRjaGAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZShwcm9taXNlKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCBzdGF0ZSk7XG4gICAgdGhpcy5yZWplY3QgPSBiaW5kKGludGVybmFsUmVqZWN0LCBwcm9taXNlLCBzdGF0ZSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09IFByb21pc2VDb25zdHJ1Y3RvciB8fCBDID09PSBQcm9taXNlV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xuXG4gIC8vIHdyYXAgZmV0Y2ggcmVzdWx0XG4gIGlmICghSVNfUFVSRSAmJiB0eXBlb2YgJGZldGNoID09ICdmdW5jdGlvbicpICRleHBvcnQoeyBnbG9iYWw6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGZvcmNlZDogdHJ1ZSB9LCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZmV0Y2g6IGZ1bmN0aW9uIGZldGNoKGlucHV0KSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoUHJvbWlzZUNvbnN0cnVjdG9yLCAkZmV0Y2guYXBwbHkoZ2xvYmFsLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gIH0pO1xufVxuXG4kZXhwb3J0KHsgZ2xvYmFsOiB0cnVlLCB3cmFwOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7IFByb21pc2U6IFByb21pc2VDb25zdHJ1Y3RvciB9KTtcblxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJykoUHJvbWlzZUNvbnN0cnVjdG9yLCBQUk9NSVNFLCBmYWxzZSwgdHJ1ZSk7XG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcblxuUHJvbWlzZVdyYXBwZXIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGF0aCcpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlamVjdGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmVqZWN0XG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIGNhcGFiaWxpdHkucmVqZWN0LmNhbGwodW5kZWZpbmVkLCByKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuJGV4cG9ydCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJU19QVVJFIHx8IEZPUkNFRCB9LCB7XG4gIC8vIGBQcm9taXNlLnJlc29sdmVgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlc29sdmVcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKElTX1BVUkUgJiYgdGhpcyA9PT0gUHJvbWlzZVdyYXBwZXIgPyBQcm9taXNlQ29uc3RydWN0b3IgOiB0aGlzLCB4KTtcbiAgfVxufSk7XG5cbiRleHBvcnQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSU5DT1JSRUNUX0lURVJBVElPTiB9LCB7XG4gIC8vIGBQcm9taXNlLmFsbGAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UuYWxsXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xuXG52YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufTtcblxubW9kdWxlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQ1lDTElDX0tFWSA9IGV4cG9ydHMuRVZFTlRfSUQgPSBleHBvcnRzLlBBTkVMX0lEID0gZXhwb3J0cy5BRERPTl9JRCA9IHZvaWQgMDtcbnZhciBBRERPTl9JRCA9ICdzdG9yeWJvb2svYWN0aW9ucyc7XG5leHBvcnRzLkFERE9OX0lEID0gQURET05fSUQ7XG52YXIgUEFORUxfSUQgPSBcIlwiLmNvbmNhdChBRERPTl9JRCwgXCIvcGFuZWxcIik7XG5leHBvcnRzLlBBTkVMX0lEID0gUEFORUxfSUQ7XG52YXIgRVZFTlRfSUQgPSBcIlwiLmNvbmNhdChBRERPTl9JRCwgXCIvYWN0aW9uLWV2ZW50XCIpO1xuZXhwb3J0cy5FVkVOVF9JRCA9IEVWRU5UX0lEO1xudmFyIENZQ0xJQ19LRVkgPSAnJF9fX3N0b3J5Ym9vay5pc0N5Y2xpYyc7XG5leHBvcnRzLkNZQ0xJQ19LRVkgPSBDWUNMSUNfS0VZOyIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXBcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy53aXRoQWN0aW9ucyA9IGV4cG9ydHMuY3JlYXRlRGVjb3JhdG9yID0gdm9pZCAwO1xuXG52YXIgX2dsb2JhbCA9IHJlcXVpcmUoXCJnbG9iYWxcIik7XG5cbnZhciBfbG9kYXNoID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxudmFyIF9hZGRvbnMgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9hZGRvbnNcIik7XG5cbnZhciBfY29yZUV2ZW50cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBzdG9yeWJvb2svY29yZS1ldmVudHNcIikpO1xuXG52YXIgX2FjdGlvbnMgPSByZXF1aXJlKFwiLi9hY3Rpb25zXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyB2YXIgX2FyciA9IFtdOyB2YXIgX24gPSB0cnVlOyB2YXIgX2QgPSBmYWxzZTsgdmFyIF9lID0gdW5kZWZpbmVkOyB0cnkgeyBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7IF9hcnIucHVzaChfcy52YWx1ZSk7IGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsgfSB9IGNhdGNoIChlcnIpIHsgX2QgPSB0cnVlOyBfZSA9IGVycjsgfSBmaW5hbGx5IHsgdHJ5IHsgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpOyB9IGZpbmFsbHkgeyBpZiAoX2QpIHRocm93IF9lOyB9IH0gcmV0dXJuIF9hcnI7IH1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyOyB9XG5cbnZhciBsYXN0U3Vic2NyaXB0aW9uO1xudmFyIGxhc3RBcmdzO1xudmFyIGRlbGVnYXRlRXZlbnRTcGxpdHRlciA9IC9eKFxcUyspXFxzKiguKikkLztcbnZhciBpc0lFID0gX2dsb2JhbC5FbGVtZW50ICE9IG51bGwgJiYgIV9nbG9iYWwuRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcztcbnZhciBtYXRjaGVzTWV0aG9kID0gaXNJRSA/ICdtc01hdGNoZXNTZWxlY3RvcicgOiAnbWF0Y2hlcyc7XG5cbnZhciByb290ID0gX2dsb2JhbC5kb2N1bWVudCAmJiBfZ2xvYmFsLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jyk7XG5cbnZhciBoYXNNYXRjaEluQW5jZXN0cnkgPSBmdW5jdGlvbiBoYXNNYXRjaEluQW5jZXN0cnkoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgaWYgKGVsZW1lbnRbbWF0Y2hlc01ldGhvZF0oc2VsZWN0b3IpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gIGlmICghcGFyZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGhhc01hdGNoSW5BbmNlc3RyeShwYXJlbnQsIHNlbGVjdG9yKTtcbn07XG5cbnZhciBjcmVhdGVIYW5kbGVycyA9IGZ1bmN0aW9uIGNyZWF0ZUhhbmRsZXJzKGFjdGlvbnNGbikge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICB2YXIgYWN0aW9uc09iamVjdCA9IGFjdGlvbnNGbi5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYWN0aW9uc09iamVjdCkubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICBhY3Rpb24gPSBfcmVmMlsxXTtcblxuICAgIHZhciBfa2V5JG1hdGNoID0ga2V5Lm1hdGNoKGRlbGVnYXRlRXZlbnRTcGxpdHRlciksXG4gICAgICAgIF9rZXkkbWF0Y2gyID0gX3NsaWNlZFRvQXJyYXkoX2tleSRtYXRjaCwgMyksXG4gICAgICAgIF8gPSBfa2V5JG1hdGNoMlswXSxcbiAgICAgICAgZXZlbnROYW1lID0gX2tleSRtYXRjaDJbMV0sXG4gICAgICAgIHNlbGVjdG9yID0gX2tleSRtYXRjaDJbMl07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKGUpIHtcbiAgICAgICAgaWYgKCFzZWxlY3RvciB8fCBoYXNNYXRjaEluQW5jZXN0cnkoZS50YXJnZXQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIGFjdGlvbihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH0pO1xufTtcblxudmFyIGFjdGlvbnNTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiBhY3Rpb25zU3Vic2NyaXB0aW9uKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICBpZiAoISgwLCBfbG9kYXNoLmlzRXF1YWwpKGFyZ3MsIGxhc3RBcmdzKSkge1xuICAgIGxhc3RBcmdzID0gYXJnczsgLy8gQHRzLWlnbm9yZVxuXG4gICAgdmFyIGhhbmRsZXJzID0gY3JlYXRlSGFuZGxlcnMuYXBwbHkodm9pZCAwLCBhcmdzKTtcblxuICAgIGxhc3RTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiBsYXN0U3Vic2NyaXB0aW9uKCkge1xuICAgICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9IF9yZWYzLmV2ZW50TmFtZSxcbiAgICAgICAgICAgIGhhbmRsZXIgPSBfcmVmMy5oYW5kbGVyO1xuICAgICAgICByZXR1cm4gcm9vdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgICAgIHZhciBldmVudE5hbWUgPSBfcmVmNC5ldmVudE5hbWUsXG4gICAgICAgICAgICAgIGhhbmRsZXIgPSBfcmVmNC5oYW5kbGVyO1xuICAgICAgICAgIHJldHVybiByb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gbGFzdFN1YnNjcmlwdGlvbjtcbn07XG5cbnZhciBjcmVhdGVEZWNvcmF0b3IgPSBmdW5jdGlvbiBjcmVhdGVEZWNvcmF0b3IoYWN0aW9uc0ZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4zKSwgX2tleTMgPSAwOyBfa2V5MyA8IF9sZW4zOyBfa2V5MysrKSB7XG4gICAgICBhcmdzW19rZXkzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdG9yeUZuKSB7XG4gICAgICBpZiAocm9vdCAhPSBudWxsKSB7XG4gICAgICAgIF9hZGRvbnMuYWRkb25zLmdldENoYW5uZWwoKS5lbWl0KF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5SRUdJU1RFUl9TVUJTQ1JJUFRJT04sIGFjdGlvbnNTdWJzY3JpcHRpb24uYXBwbHkodm9pZCAwLCBbYWN0aW9uc0ZuXS5jb25jYXQoYXJncykpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0b3J5Rm4oKTtcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0cy5jcmVhdGVEZWNvcmF0b3IgPSBjcmVhdGVEZWNvcmF0b3I7XG52YXIgd2l0aEFjdGlvbnMgPSBjcmVhdGVEZWNvcmF0b3IoX2FjdGlvbnMuYWN0aW9ucyk7XG5leHBvcnRzLndpdGhBY3Rpb25zID0gd2l0aEFjdGlvbnM7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxudmFyIGhleFRhYmxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGFycmF5LnB1c2goJyUnICsgKChpIDwgMTYgPyAnMCcgOiAnJykgKyBpLnRvU3RyaW5nKDE2KSkudG9VcHBlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycmF5O1xufSgpKTtcblxudmFyIGNvbXBhY3RRdWV1ZSA9IGZ1bmN0aW9uIGNvbXBhY3RRdWV1ZShxdWV1ZSkge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWUucG9wKCk7XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmoubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtqXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdGVkLnB1c2gob2JqW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0ub2JqW2l0ZW0ucHJvcF0gPSBjb21wYWN0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgYXJyYXlUb09iamVjdCA9IGZ1bmN0aW9uIGFycmF5VG9PYmplY3Qoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VbaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbaV0gPSBzb3VyY2VbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIG1lcmdlID0gZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaChzb3VyY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKChvcHRpb25zICYmIChvcHRpb25zLnBsYWluT2JqZWN0cyB8fCBvcHRpb25zLmFsbG93UHJvdG90eXBlcykpIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0IHx8IHR5cGVvZiB0YXJnZXQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbdGFyZ2V0XS5jb25jYXQoc291cmNlKTtcbiAgICB9XG5cbiAgICB2YXIgbWVyZ2VUYXJnZXQgPSB0YXJnZXQ7XG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiAhaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIG1lcmdlVGFyZ2V0ID0gYXJyYXlUb09iamVjdCh0YXJnZXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoaGFzLmNhbGwodGFyZ2V0LCBpKSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRJdGVtID0gdGFyZ2V0W2ldO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRJdGVtICYmIHR5cGVvZiB0YXJnZXRJdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBtZXJnZSh0YXJnZXRJdGVtLCBpdGVtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gc291cmNlW2tleV07XG5cbiAgICAgICAgaWYgKGhhcy5jYWxsKGFjYywga2V5KSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBtZXJnZShhY2Nba2V5XSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIG1lcmdlVGFyZ2V0KTtcbn07XG5cbnZhciBhc3NpZ24gPSBmdW5jdGlvbiBhc3NpZ25TaW5nbGVTb3VyY2UodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIGFjY1trZXldID0gc291cmNlW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgdGFyZ2V0KTtcbn07XG5cbnZhciBkZWNvZGUgPSBmdW5jdGlvbiAoc3RyLCBkZWNvZGVyLCBjaGFyc2V0KSB7XG4gICAgdmFyIHN0cldpdGhvdXRQbHVzID0gc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpO1xuICAgIGlmIChjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgLy8gdW5lc2NhcGUgbmV2ZXIgdGhyb3dzLCBubyB0cnkuLi5jYXRjaCBuZWVkZWQ6XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cy5yZXBsYWNlKC8lWzAtOWEtZl17Mn0vZ2ksIHVuZXNjYXBlKTtcbiAgICB9XG4gICAgLy8gdXRmLThcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cldpdGhvdXRQbHVzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHJXaXRob3V0UGx1cztcbiAgICB9XG59O1xuXG52YXIgZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZGVmYXVsdEVuY29kZXIsIGNoYXJzZXQpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyIDogU3RyaW5nKHN0cik7XG5cbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHJldHVybiBlc2NhcGUoc3RyaW5nKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLCBmdW5jdGlvbiAoJDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJTI2JTIzJyArIHBhcnNlSW50KCQwLnNsaWNlKDIpLCAxNikgKyAnJTNCJztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIG91dCA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYyA9PT0gMHgyRCAvLyAtXG4gICAgICAgICAgICB8fCBjID09PSAweDJFIC8vIC5cbiAgICAgICAgICAgIHx8IGMgPT09IDB4NUYgLy8gX1xuICAgICAgICAgICAgfHwgYyA9PT0gMHg3RSAvLyB+XG4gICAgICAgICAgICB8fCAoYyA+PSAweDMwICYmIGMgPD0gMHgzOSkgLy8gMC05XG4gICAgICAgICAgICB8fCAoYyA+PSAweDQxICYmIGMgPD0gMHg1QSkgLy8gYS16XG4gICAgICAgICAgICB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSkgLy8gQS1aXG4gICAgICAgICkge1xuICAgICAgICAgICAgb3V0ICs9IHN0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgaGV4VGFibGVbY107XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEMwIHwgKGMgPj4gNildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweEQ4MDAgfHwgYyA+PSAweEUwMDApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIChoZXhUYWJsZVsweEUwIHwgKGMgPj4gMTIpXSArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpICs9IDE7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweDNGRikpO1xuICAgICAgICBvdXQgKz0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGFycmF5VG9PYmplY3Q6IGFycmF5VG9PYmplY3QsXG4gICAgYXNzaWduOiBhc3NpZ24sXG4gICAgY29tYmluZTogY29tYmluZSxcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogJ1JGQzM5ODYnLFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuIiwidmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF90ZW1wbGF0ZU9iamVjdCA9IF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoWycnLCAnJ10sIFsnJywgJyddKTtcblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChzdHJpbmdzLCByYXcpIHsgcmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3RyaW5ncywgeyByYXc6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUocmF3KSB9IH0pKTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIEBjbGFzcyBUZW1wbGF0ZVRhZ1xuICogQGNsYXNzZGVzYyBDb25zdW1lcyBhIHBpcGVsaW5lIG9mIGNvbXBvc2FibGUgdHJhbnNmb3JtZXIgcGx1Z2lucyBhbmQgcHJvZHVjZXMgYSB0ZW1wbGF0ZSB0YWcuXG4gKi9cbnZhciBUZW1wbGF0ZVRhZyA9IGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIGNvbnN0cnVjdHMgYSB0ZW1wbGF0ZSB0YWdcbiAgICogQGNvbnN0cnVjdHMgVGVtcGxhdGVUYWdcbiAgICogQHBhcmFtICB7Li4uT2JqZWN0fSBbLi4udHJhbnNmb3JtZXJzXSAtIGFuIGFycmF5IG9yIGFyZ3VtZW50cyBsaXN0IG9mIHRyYW5zZm9ybWVyc1xuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gICAgICAgICAgICAgICAgICAgIC0gYSB0ZW1wbGF0ZSB0YWdcbiAgICovXG4gIGZ1bmN0aW9uIFRlbXBsYXRlVGFnKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdHJhbnNmb3JtZXJzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICB0cmFuc2Zvcm1lcnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRlbXBsYXRlVGFnKTtcblxuICAgIHRoaXMudGFnID0gZnVuY3Rpb24gKHN0cmluZ3MpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgZXhwcmVzc2lvbnMgPSBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGV4cHJlc3Npb25zW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHN0cmluZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gaWYgdGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCBpcyBhIGZ1bmN0aW9uLCBhc3N1bWUgaXQgaXMgYSB0ZW1wbGF0ZSB0YWcgYW5kIHJldHVyblxuICAgICAgICAvLyBhbiBpbnRlcm1lZGlhcnkgdGFnIHRoYXQgcHJvY2Vzc2VzIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgdGFnLCBwYXNzaW5nIHRoZVxuICAgICAgICAvLyByZXN1bHQgdG8gb3VyIHRhZ1xuICAgICAgICByZXR1cm4gX3RoaXMuaW50ZXJpbVRhZy5iaW5kKF90aGlzLCBzdHJpbmdzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzdHJpbmdzID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIGlzIGEgc3RyaW5nLCBqdXN0IHRyYW5zZm9ybSBpdFxuICAgICAgICByZXR1cm4gX3RoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBlbHNlLCByZXR1cm4gYSB0cmFuc2Zvcm1lZCBlbmQgcmVzdWx0IG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlIHdpdGggb3VyIHRhZ1xuICAgICAgc3RyaW5ncyA9IHN0cmluZ3MubWFwKF90aGlzLnRyYW5zZm9ybVN0cmluZy5iaW5kKF90aGlzKSk7XG4gICAgICByZXR1cm4gX3RoaXMudHJhbnNmb3JtRW5kUmVzdWx0KHN0cmluZ3MucmVkdWNlKF90aGlzLnByb2Nlc3NTdWJzdGl0dXRpb25zLmJpbmQoX3RoaXMsIGV4cHJlc3Npb25zKSkpO1xuICAgIH07XG5cbiAgICAvLyBpZiBmaXJzdCBhcmd1bWVudCBpcyBhbiBhcnJheSwgZXh0cnVkZSBpdCBhcyBhIGxpc3Qgb2YgdHJhbnNmb3JtZXJzXG4gICAgaWYgKHRyYW5zZm9ybWVycy5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkodHJhbnNmb3JtZXJzWzBdKSkge1xuICAgICAgdHJhbnNmb3JtZXJzID0gdHJhbnNmb3JtZXJzWzBdO1xuICAgIH1cblxuICAgIC8vIGlmIGFueSB0cmFuc2Zvcm1lcnMgYXJlIGZ1bmN0aW9ucywgdGhpcyBtZWFucyB0aGV5IGFyZSBub3QgaW5pdGlhdGVkIC0gYXV0b21hdGljYWxseSBpbml0aWF0ZSB0aGVtXG4gICAgdGhpcy50cmFuc2Zvcm1lcnMgPSB0cmFuc2Zvcm1lcnMubWFwKGZ1bmN0aW9uICh0cmFuc2Zvcm1lcikge1xuICAgICAgcmV0dXJuIHR5cGVvZiB0cmFuc2Zvcm1lciA9PT0gJ2Z1bmN0aW9uJyA/IHRyYW5zZm9ybWVyKCkgOiB0cmFuc2Zvcm1lcjtcbiAgICB9KTtcblxuICAgIC8vIHJldHVybiBhbiBFUzIwMTUgdGVtcGxhdGUgdGFnXG4gICAgcmV0dXJuIHRoaXMudGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYWxsIHRyYW5zZm9ybWVycyB0byBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnZ2VkIHdpdGggdGhpcyBtZXRob2QuXG4gICAqIElmIGEgZnVuY3Rpb24gaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgYXNzdW1lcyB0aGUgZnVuY3Rpb24gaXMgYSB0ZW1wbGF0ZSB0YWdcbiAgICogYW5kIGFwcGxpZXMgaXQgdG8gdGhlIHRlbXBsYXRlLCByZXR1cm5pbmcgYSB0ZW1wbGF0ZSB0YWcuXG4gICAqIEBwYXJhbSAgeyhGdW5jdGlvbnxTdHJpbmd8QXJyYXk8U3RyaW5nPil9IHN0cmluZ3MgICAgICAgIC0gRWl0aGVyIGEgdGVtcGxhdGUgdGFnIG9yIGFuIGFycmF5IGNvbnRhaW5pbmcgdGVtcGxhdGUgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gIHsuLi4qfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5leHByZXNzaW9ucyAtIE9wdGlvbmFsIGxpc3Qgb2Ygc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAgICogQHJldHVybiB7KFN0cmluZ3xGdW5jdGlvbil9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBFaXRoZXIgYW4gaW50ZXJtZWRpYXJ5IHRhZyBmdW5jdGlvbiBvciB0aGUgcmVzdWx0cyBvZiBwcm9jZXNzaW5nIHRoZSB0ZW1wbGF0ZS5cbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoVGVtcGxhdGVUYWcsIFt7XG4gICAga2V5OiAnaW50ZXJpbVRhZycsXG5cblxuICAgIC8qKlxuICAgICAqIEFuIGludGVybWVkaWFyeSB0ZW1wbGF0ZSB0YWcgdGhhdCByZWNlaXZlcyBhIHRlbXBsYXRlIHRhZyBhbmQgcGFzc2VzIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgdGVtcGxhdGUgd2l0aCB0aGUgcmVjZWl2ZWRcbiAgICAgKiB0ZW1wbGF0ZSB0YWcgdG8gb3VyIG93biB0ZW1wbGF0ZSB0YWcuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259ICAgICAgICBuZXh0VGFnICAgICAgICAgIC0gdGhlIHJlY2VpdmVkIHRlbXBsYXRlIHRhZ1xuICAgICAqIEBwYXJhbSAge0FycmF5PFN0cmluZz59ICAgdGVtcGxhdGUgICAgICAgICAtIHRoZSB0ZW1wbGF0ZSB0byBwcm9jZXNzXG4gICAgICogQHBhcmFtICB7Li4uKn0gICAgICAgICAgICAuLi5zdWJzdGl0dXRpb25zIC0gYHN1YnN0aXR1dGlvbnNgIGlzIGFuIGFycmF5IG9mIGFsbCBzdWJzdGl0dXRpb25zIGluIHRoZSB0ZW1wbGF0ZVxuICAgICAqIEByZXR1cm4geyp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBmaW5hbCBwcm9jZXNzZWQgdmFsdWVcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJpbVRhZyhwcmV2aW91c1RhZywgdGVtcGxhdGUpIHtcbiAgICAgIGZvciAodmFyIF9sZW4zID0gYXJndW1lbnRzLmxlbmd0aCwgc3Vic3RpdHV0aW9ucyA9IEFycmF5KF9sZW4zID4gMiA/IF9sZW4zIC0gMiA6IDApLCBfa2V5MyA9IDI7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgc3Vic3RpdHV0aW9uc1tfa2V5MyAtIDJdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMudGFnKF90ZW1wbGF0ZU9iamVjdCwgcHJldmlvdXNUYWcuYXBwbHkodW5kZWZpbmVkLCBbdGVtcGxhdGVdLmNvbmNhdChzdWJzdGl0dXRpb25zKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGJ1bGsgcHJvY2Vzc2luZyBvbiB0aGUgdGFnZ2VkIHRlbXBsYXRlLCB0cmFuc2Zvcm1pbmcgZWFjaCBzdWJzdGl0dXRpb24gYW5kIHRoZW5cbiAgICAgKiBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRpbmcgdmFsdWVzIGludG8gYSBzdHJpbmcuXG4gICAgICogQHBhcmFtICB7QXJyYXk8Kj59IHN1YnN0aXR1dGlvbnMgLSBhbiBhcnJheSBvZiBhbGwgcmVtYWluaW5nIHN1YnN0aXR1dGlvbnMgcHJlc2VudCBpbiB0aGlzIHRlbXBsYXRlXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIHJlc3VsdFNvRmFyICAgLSB0aGlzIGl0ZXJhdGlvbidzIHJlc3VsdCBzdHJpbmcgc28gZmFyXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIHJlbWFpbmluZ1BhcnQgLSB0aGUgdGVtcGxhdGUgY2h1bmsgYWZ0ZXIgdGhlIGN1cnJlbnQgc3Vic3RpdHV0aW9uXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICAgICAgICAgLSB0aGUgcmVzdWx0IG9mIGpvaW5pbmcgdGhpcyBpdGVyYXRpb24ncyBwcm9jZXNzZWQgc3Vic3RpdHV0aW9uIHdpdGggdGhlIHJlc3VsdFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdwcm9jZXNzU3Vic3RpdHV0aW9ucycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NTdWJzdGl0dXRpb25zKHN1YnN0aXR1dGlvbnMsIHJlc3VsdFNvRmFyLCByZW1haW5pbmdQYXJ0KSB7XG4gICAgICB2YXIgc3Vic3RpdHV0aW9uID0gdGhpcy50cmFuc2Zvcm1TdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9ucy5zaGlmdCgpLCByZXN1bHRTb0Zhcik7XG4gICAgICByZXR1cm4gJycuY29uY2F0KHJlc3VsdFNvRmFyLCBzdWJzdGl0dXRpb24sIHJlbWFpbmluZ1BhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHRyYW5zZm9ybWVyLCBhcHBseWluZyB0aGUgdHJhbnNmb3JtZXIncyBgb25TdHJpbmdgIG1ldGhvZCB0byB0aGUgdGVtcGxhdGVcbiAgICAgKiBzdHJpbmdzIGJlZm9yZSBhbGwgc3Vic3RpdHV0aW9ucyBhcmUgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgc3RyIC0gVGhlIGlucHV0IHN0cmluZ1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30gICAgIC0gVGhlIGZpbmFsIHJlc3VsdHMgb2YgcHJvY2Vzc2luZyBlYWNoIHRyYW5zZm9ybWVyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3RyYW5zZm9ybVN0cmluZycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybVN0cmluZyhzdHIpIHtcbiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIGNiKHJlcywgdHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ub25TdHJpbmcgPyB0cmFuc2Zvcm0ub25TdHJpbmcocmVzKSA6IHJlcztcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1lcnMucmVkdWNlKGNiLCBzdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBzdWJzdGl0dXRpb24gaXMgZW5jb3VudGVyZWQsIGl0ZXJhdGVzIHRocm91Z2ggZWFjaCB0cmFuc2Zvcm1lciBhbmQgYXBwbGllcyB0aGUgdHJhbnNmb3JtZXInc1xuICAgICAqIGBvblN1YnN0aXR1dGlvbmAgbWV0aG9kIHRvIHRoZSBzdWJzdGl0dXRpb24uXG4gICAgICogQHBhcmFtICB7Kn0gICAgICBzdWJzdGl0dXRpb24gLSBUaGUgY3VycmVudCBzdWJzdGl0dXRpb25cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IHJlc3VsdFNvRmFyICAtIFRoZSByZXN1bHQgdXAgdG8gYW5kIGV4Y2x1ZGluZyB0aGlzIHN1YnN0aXR1dGlvbi5cbiAgICAgKiBAcmV0dXJuIHsqfSAgICAgICAgICAgICAgICAgICAtIFRoZSBmaW5hbCByZXN1bHQgb2YgYXBwbHlpbmcgYWxsIHN1YnN0aXR1dGlvbiB0cmFuc2Zvcm1hdGlvbnMuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3RyYW5zZm9ybVN1YnN0aXR1dGlvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgICB2YXIgY2IgPSBmdW5jdGlvbiBjYihyZXMsIHRyYW5zZm9ybSkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtLm9uU3Vic3RpdHV0aW9uID8gdHJhbnNmb3JtLm9uU3Vic3RpdHV0aW9uKHJlcywgcmVzdWx0U29GYXIpIDogcmVzO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybWVycy5yZWR1Y2UoY2IsIHN1YnN0aXR1dGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgdGhyb3VnaCBlYWNoIHRyYW5zZm9ybWVyLCBhcHBseWluZyB0aGUgdHJhbnNmb3JtZXIncyBgb25FbmRSZXN1bHRgIG1ldGhvZCB0byB0aGVcbiAgICAgKiB0ZW1wbGF0ZSBsaXRlcmFsIGFmdGVyIGFsbCBzdWJzdGl0dXRpb25zIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGVuZFJlc3VsdCAtIFRoZSBwcm9jZXNzZWQgdGVtcGxhdGUsIGp1c3QgYmVmb3JlIGl0IGlzIHJldHVybmVkIGZyb20gdGhlIHRhZ1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAgIC0gVGhlIGZpbmFsIHJlc3VsdHMgb2YgcHJvY2Vzc2luZyBlYWNoIHRyYW5zZm9ybWVyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3RyYW5zZm9ybUVuZFJlc3VsdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYW5zZm9ybUVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICAgIHZhciBjYiA9IGZ1bmN0aW9uIGNiKHJlcywgdHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0ub25FbmRSZXN1bHQgPyB0cmFuc2Zvcm0ub25FbmRSZXN1bHQocmVzKSA6IHJlcztcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1lcnMucmVkdWNlKGNiLCBlbmRSZXN1bHQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZW1wbGF0ZVRhZztcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgVGVtcGxhdGVUYWc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlVWlcxd2JHRjBaVlJoWnk5VVpXMXdiR0YwWlZSaFp5NXFjeUpkTENKdVlXMWxjeUk2V3lKVVpXMXdiR0YwWlZSaFp5SXNJblJ5WVc1elptOXliV1Z5Y3lJc0luUmhaeUlzSW5OMGNtbHVaM01pTENKbGVIQnlaWE56YVc5dWN5SXNJbWx1ZEdWeWFXMVVZV2NpTENKaWFXNWtJaXdpZEhKaGJuTm1iM0p0Ulc1a1VtVnpkV3gwSWl3aWJXRndJaXdpZEhKaGJuTm1iM0p0VTNSeWFXNW5JaXdpY21Wa2RXTmxJaXdpY0hKdlkyVnpjMU4xWW5OMGFYUjFkR2x2Ym5NaUxDSnNaVzVuZEdnaUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraUxDSjBjbUZ1YzJadmNtMWxjaUlzSW5CeVpYWnBiM1Z6VkdGbklpd2lkR1Z0Y0d4aGRHVWlMQ0p6ZFdKemRHbDBkWFJwYjI1eklpd2ljbVZ6ZFd4MFUyOUdZWElpTENKeVpXMWhhVzVwYm1kUVlYSjBJaXdpYzNWaWMzUnBkSFYwYVc5dUlpd2lkSEpoYm5ObWIzSnRVM1ZpYzNScGRIVjBhVzl1SWl3aWMyaHBablFpTENKamIyNWpZWFFpTENKemRISWlMQ0pqWWlJc0luSmxjeUlzSW5SeVlXNXpabTl5YlNJc0ltOXVVM1J5YVc1bklpd2liMjVUZFdKemRHbDBkWFJwYjI0aUxDSmxibVJTWlhOMWJIUWlMQ0p2YmtWdVpGSmxjM1ZzZENKZExDSnRZWEJ3YVc1bmN5STZJanM3T3pzN096czdRVUZCUVRzN096dEpRVWx4UWtFc1Z6dEJRVU51UWpzN096czdPMEZCVFVFc2VVSkJRVFpDTzBGQlFVRTdPMEZCUVVFc2MwTkJRV1JETEZsQlFXTTdRVUZCWkVFc2EwSkJRV003UVVGQlFUczdRVUZCUVRzN1FVRkJRU3hUUVhWQ04wSkRMRWRCZGtJMlFpeEhRWFZDZGtJc1ZVRkJRME1zVDBGQlJDeEZRVUUyUWp0QlFVRkJMSGxEUVVGb1FrTXNWMEZCWjBJN1FVRkJhRUpCTEcxQ1FVRm5RanRCUVVGQk96dEJRVU5xUXl4VlFVRkpMRTlCUVU5RUxFOUJRVkFzUzBGQmJVSXNWVUZCZGtJc1JVRkJiVU03UVVGRGFrTTdRVUZEUVR0QlFVTkJPMEZCUTBFc1pVRkJUeXhOUVVGTFJTeFZRVUZNTEVOQlFXZENReXhKUVVGb1FpeFJRVUV5UWtnc1QwRkJNMElzUTBGQlVEdEJRVU5FT3p0QlFVVkVMRlZCUVVrc1QwRkJUMEVzVDBGQlVDeExRVUZ0UWl4UlFVRjJRaXhGUVVGcFF6dEJRVU12UWp0QlFVTkJMR1ZCUVU4c1RVRkJTMGtzYTBKQlFVd3NRMEZCZDBKS0xFOUJRWGhDTEVOQlFWQTdRVUZEUkRzN1FVRkZSRHRCUVVOQlFTeG5Ra0ZCVlVFc1VVRkJVVXNzUjBGQlVpeERRVUZaTEUxQlFVdERMR1ZCUVV3c1EwRkJjVUpJTEVsQlFYSkNMRTlCUVZvc1EwRkJWanRCUVVOQkxHRkJRVThzVFVGQlMwTXNhMEpCUVV3c1EwRkRURW9zVVVGQlVVOHNUVUZCVWl4RFFVRmxMRTFCUVV0RExHOUNRVUZNTEVOQlFUQkNUQ3hKUVVFeFFpeFJRVUZ4UTBZc1YwRkJja01zUTBGQlppeERRVVJMTEVOQlFWQTdRVUZIUkN4TFFYcERORUk3TzBGQlF6TkNPMEZCUTBFc1VVRkJTVWdzWVVGQllWY3NUVUZCWWl4SFFVRnpRaXhEUVVGMFFpeEpRVUV5UWtNc1RVRkJUVU1zVDBGQlRpeERRVUZqWWl4aFFVRmhMRU5CUVdJc1EwRkJaQ3hEUVVFdlFpeEZRVUVyUkR0QlFVTTNSRUVzY1VKQlFXVkJMR0ZCUVdFc1EwRkJZaXhEUVVGbU8wRkJRMFE3TzBGQlJVUTdRVUZEUVN4VFFVRkxRU3haUVVGTUxFZEJRVzlDUVN4aFFVRmhUeXhIUVVGaUxFTkJRV2xDTEhWQ1FVRmxPMEZCUTJ4RUxHRkJRVThzVDBGQlQwOHNWMEZCVUN4TFFVRjFRaXhWUVVGMlFpeEhRVUZ2UTBFc1lVRkJjRU1zUjBGQmIwUkJMRmRCUVRORU8wRkJRMFFzUzBGR2JVSXNRMEZCY0VJN08wRkJTVUU3UVVGRFFTeFhRVUZQTEV0QlFVdGlMRWRCUVZvN1FVRkRSRHM3UVVGRlJEczdPenM3T3pzN096czdPenM3UVVFMFFrRTdPenM3T3pzN095dENRVkZYWXl4WExFVkJRV0ZETEZFc1JVRkJORUk3UVVGQlFTeDVRMEZCWmtNc1lVRkJaVHRCUVVGbVFTeHhRa0ZCWlR0QlFVRkJPenRCUVVOc1JDeGhRVUZQTEV0QlFVdG9RaXhIUVVGYUxHdENRVUZyUW1Nc09FSkJRVmxETEZGQlFWb3NVMEZCZVVKRExHRkJRWHBDTEVWQlFXeENPMEZCUTBRN08wRkJSVVE3T3pzN096czdPenM3TzNsRFFWRnhRa0VzWVN4RlFVRmxReXhYTEVWQlFXRkRMR0VzUlVGQlpUdEJRVU01UkN4VlFVRk5ReXhsUVVGbExFdEJRVXRETEhGQ1FVRk1MRU5CUTI1Q1NpeGpRVUZqU3l4TFFVRmtMRVZCUkcxQ0xFVkJSVzVDU2l4WFFVWnRRaXhEUVVGeVFqdEJRVWxCTEdGQlFVOHNSMEZCUjBzc1RVRkJTQ3hEUVVGVlRDeFhRVUZXTEVWQlFYVkNSU3haUVVGMlFpeEZRVUZ4UTBRc1lVRkJja01zUTBGQlVEdEJRVU5FT3p0QlFVVkVPenM3T3pzN096czdiME5CVFdkQ1N5eEhMRVZCUVVzN1FVRkRia0lzVlVGQlRVTXNTMEZCU3l4VFFVRk1RU3hGUVVGTExFTkJRVU5ETEVkQlFVUXNSVUZCVFVNc1UwRkJUanRCUVVGQkxHVkJRMVJCTEZWQlFWVkRMRkZCUVZZc1IwRkJjVUpFTEZWQlFWVkRMRkZCUVZZc1EwRkJiVUpHTEVkQlFXNUNMRU5CUVhKQ0xFZEJRU3REUVN4SFFVUjBRenRCUVVGQkxFOUJRVmc3UVVGRlFTeGhRVUZQTEV0QlFVc3hRaXhaUVVGTUxFTkJRV3RDVXl4TlFVRnNRaXhEUVVGNVFtZENMRVZCUVhwQ0xFVkJRVFpDUkN4SFFVRTNRaXhEUVVGUU8wRkJRMFE3TzBGQlJVUTdPenM3T3pzN096czdNRU5CVDNOQ1NpeFpMRVZCUVdOR0xGY3NSVUZCWVR0QlFVTXZReXhWUVVGTlR5eExRVUZMTEZOQlFVeEJMRVZCUVVzc1EwRkJRME1zUjBGQlJDeEZRVUZOUXl4VFFVRk9PMEZCUVVFc1pVRkRWRUVzVlVGQlZVVXNZMEZCVml4SFFVTkpSaXhWUVVGVlJTeGpRVUZXTEVOQlFYbENTQ3hIUVVGNlFpeEZRVUU0UWxJc1YwRkJPVUlzUTBGRVNpeEhRVVZKVVN4SFFVaExPMEZCUVVFc1QwRkJXRHRCUVVsQkxHRkJRVThzUzBGQlN6RkNMRmxCUVV3c1EwRkJhMEpUTEUxQlFXeENMRU5CUVhsQ1owSXNSVUZCZWtJc1JVRkJOa0pNTEZsQlFUZENMRU5CUVZBN1FVRkRSRHM3UVVGRlJEczdPenM3T3pzN08zVkRRVTF0UWxVc1V5eEZRVUZYTzBGQlF6VkNMRlZCUVUxTUxFdEJRVXNzVTBGQlRFRXNSVUZCU3l4RFFVRkRReXhIUVVGRUxFVkJRVTFETEZOQlFVNDdRVUZCUVN4bFFVTlVRU3hWUVVGVlNTeFhRVUZXTEVkQlFYZENTaXhWUVVGVlNTeFhRVUZXTEVOQlFYTkNUQ3hIUVVGMFFpeERRVUY0UWl4SFFVRnhSRUVzUjBGRU5VTTdRVUZCUVN4UFFVRllPMEZCUlVFc1lVRkJUeXhMUVVGTE1VSXNXVUZCVEN4RFFVRnJRbE1zVFVGQmJFSXNRMEZCZVVKblFpeEZRVUY2UWl4RlFVRTJRa3NzVTBGQk4wSXNRMEZCVUR0QlFVTkVPenM3T3pzN1pVRnVTR3RDTDBJc1Z5SXNJbVpwYkdVaU9pSlVaVzF3YkdGMFpWUmhaeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHFLbHh1SUNvZ1FHTnNZWE56SUZSbGJYQnNZWFJsVkdGblhHNGdLaUJBWTJ4aGMzTmtaWE5qSUVOdmJuTjFiV1Z6SUdFZ2NHbHdaV3hwYm1VZ2IyWWdZMjl0Y0c5ellXSnNaU0IwY21GdWMyWnZjbTFsY2lCd2JIVm5hVzV6SUdGdVpDQndjbTlrZFdObGN5QmhJSFJsYlhCc1lYUmxJSFJoWnk1Y2JpQXFMMXh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMnhoYzNNZ1ZHVnRjR3hoZEdWVVlXY2dlMXh1SUNBdktpcGNiaUFnSUNvZ1kyOXVjM1J5ZFdOMGN5QmhJSFJsYlhCc1lYUmxJSFJoWjF4dUlDQWdLaUJBWTI5dWMzUnlkV04wY3lCVVpXMXdiR0YwWlZSaFoxeHVJQ0FnS2lCQWNHRnlZVzBnSUhzdUxpNVBZbXBsWTNSOUlGc3VMaTUwY21GdWMyWnZjbTFsY25OZElDMGdZVzRnWVhKeVlYa2diM0lnWVhKbmRXMWxiblJ6SUd4cGMzUWdiMllnZEhKaGJuTm1iM0p0WlhKelhHNGdJQ0FxSUVCeVpYUjFjbTRnZTBaMWJtTjBhVzl1ZlNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xTQmhJSFJsYlhCc1lYUmxJSFJoWjF4dUlDQWdLaTljYmlBZ1kyOXVjM1J5ZFdOMGIzSW9MaTR1ZEhKaGJuTm1iM0p0WlhKektTQjdYRzRnSUNBZ0x5OGdhV1lnWm1seWMzUWdZWEpuZFcxbGJuUWdhWE1nWVc0Z1lYSnlZWGtzSUdWNGRISjFaR1VnYVhRZ1lYTWdZU0JzYVhOMElHOW1JSFJ5WVc1elptOXliV1Z5YzF4dUlDQWdJR2xtSUNoMGNtRnVjMlp2Y20xbGNuTXViR1Z1WjNSb0lENGdNQ0FtSmlCQmNuSmhlUzVwYzBGeWNtRjVLSFJ5WVc1elptOXliV1Z5YzFzd1hTa3BJSHRjYmlBZ0lDQWdJSFJ5WVc1elptOXliV1Z5Y3lBOUlIUnlZVzV6Wm05eWJXVnljMXN3WFR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2THlCcFppQmhibmtnZEhKaGJuTm1iM0p0WlhKeklHRnlaU0JtZFc1amRHbHZibk1zSUhSb2FYTWdiV1ZoYm5NZ2RHaGxlU0JoY21VZ2JtOTBJR2x1YVhScFlYUmxaQ0F0SUdGMWRHOXRZWFJwWTJGc2JIa2dhVzVwZEdsaGRHVWdkR2hsYlZ4dUlDQWdJSFJvYVhNdWRISmhibk5tYjNKdFpYSnpJRDBnZEhKaGJuTm1iM0p0WlhKekxtMWhjQ2gwY21GdWMyWnZjbTFsY2lBOVBpQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2RIbHdaVzltSUhSeVlXNXpabTl5YldWeUlEMDlQU0FuWm5WdVkzUnBiMjRuSUQ4Z2RISmhibk5tYjNKdFpYSW9LU0E2SUhSeVlXNXpabTl5YldWeU8xeHVJQ0FnSUgwcE8xeHVYRzRnSUNBZ0x5OGdjbVYwZFhKdUlHRnVJRVZUTWpBeE5TQjBaVzF3YkdGMFpTQjBZV2RjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTUwWVdjN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDb2dRWEJ3YkdsbGN5QmhiR3dnZEhKaGJuTm1iM0p0WlhKeklIUnZJR0VnZEdWdGNHeGhkR1VnYkdsMFpYSmhiQ0IwWVdkblpXUWdkMmwwYUNCMGFHbHpJRzFsZEdodlpDNWNiaUFnSUNvZ1NXWWdZU0JtZFc1amRHbHZiaUJwY3lCd1lYTnpaV1FnWVhNZ2RHaGxJR1pwY25OMElHRnlaM1Z0Wlc1MExDQmhjM04xYldWeklIUm9aU0JtZFc1amRHbHZiaUJwY3lCaElIUmxiWEJzWVhSbElIUmhaMXh1SUNBZ0tpQmhibVFnWVhCd2JHbGxjeUJwZENCMGJ5QjBhR1VnZEdWdGNHeGhkR1VzSUhKbGRIVnlibWx1WnlCaElIUmxiWEJzWVhSbElIUmhaeTVjYmlBZ0lDb2dRSEJoY21GdElDQjdLRVoxYm1OMGFXOXVmRk4wY21sdVozeEJjbkpoZVR4VGRISnBibWMrS1gwZ2MzUnlhVzVuY3lBZ0lDQWdJQ0FnTFNCRmFYUm9aWElnWVNCMFpXMXdiR0YwWlNCMFlXY2diM0lnWVc0Z1lYSnlZWGtnWTI5dWRHRnBibWx1WnlCMFpXMXdiR0YwWlNCemRISnBibWR6SUhObGNHRnlZWFJsWkNCaWVTQnBaR1Z1ZEdsbWFXVnlYRzRnSUNBcUlFQndZWEpoYlNBZ2V5NHVMaXA5SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUM0dUxtVjRjSEpsYzNOcGIyNXpJQzBnVDNCMGFXOXVZV3dnYkdsemRDQnZaaUJ6ZFdKemRHbDBkWFJwYjI0Z2RtRnNkV1Z6TGx4dUlDQWdLaUJBY21WMGRYSnVJSHNvVTNSeWFXNW5mRVoxYm1OMGFXOXVLWDBnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdElFVnBkR2hsY2lCaGJpQnBiblJsY20xbFpHbGhjbmtnZEdGbklHWjFibU4wYVc5dUlHOXlJSFJvWlNCeVpYTjFiSFJ6SUc5bUlIQnliMk5sYzNOcGJtY2dkR2hsSUhSbGJYQnNZWFJsTGx4dUlDQWdLaTljYmlBZ2RHRm5JRDBnS0hOMGNtbHVaM01zSUM0dUxtVjRjSEpsYzNOcGIyNXpLU0E5UGlCN1hHNGdJQ0FnYVdZZ0tIUjVjR1Z2WmlCemRISnBibWR6SUQwOVBTQW5ablZ1WTNScGIyNG5LU0I3WEc0Z0lDQWdJQ0F2THlCcFppQjBhR1VnWm1seWMzUWdZWEpuZFcxbGJuUWdjR0Z6YzJWa0lHbHpJR0VnWm5WdVkzUnBiMjRzSUdGemMzVnRaU0JwZENCcGN5QmhJSFJsYlhCc1lYUmxJSFJoWnlCaGJtUWdjbVYwZFhKdVhHNGdJQ0FnSUNBdkx5QmhiaUJwYm5SbGNtMWxaR2xoY25rZ2RHRm5JSFJvWVhRZ2NISnZZMlZ6YzJWeklIUm9aU0IwWlcxd2JHRjBaU0IxYzJsdVp5QjBhR1VnWVdadmNtVnRaVzUwYVc5dVpXUWdkR0ZuTENCd1lYTnphVzVuSUhSb1pWeHVJQ0FnSUNBZ0x5OGdjbVZ6ZFd4MElIUnZJRzkxY2lCMFlXZGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbWx1ZEdWeWFXMVVZV2N1WW1sdVpDaDBhR2x6TENCemRISnBibWR6S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUhOMGNtbHVaM01nUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQXZMeUJwWmlCMGFHVWdabWx5YzNRZ1lYSm5kVzFsYm5RZ2NHRnpjMlZrSUdseklHRWdjM1J5YVc1bkxDQnFkWE4wSUhSeVlXNXpabTl5YlNCcGRGeHVJQ0FnSUNBZ2NtVjBkWEp1SUhSb2FYTXVkSEpoYm5ObWIzSnRSVzVrVW1WemRXeDBLSE4wY21sdVozTXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJR1ZzYzJVc0lISmxkSFZ5YmlCaElIUnlZVzV6Wm05eWJXVmtJR1Z1WkNCeVpYTjFiSFFnYjJZZ2NISnZZMlZ6YzJsdVp5QjBhR1VnZEdWdGNHeGhkR1VnZDJsMGFDQnZkWElnZEdGblhHNGdJQ0FnYzNSeWFXNW5jeUE5SUhOMGNtbHVaM011YldGd0tIUm9hWE11ZEhKaGJuTm1iM0p0VTNSeWFXNW5MbUpwYm1Rb2RHaHBjeWtwTzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG5SeVlXNXpabTl5YlVWdVpGSmxjM1ZzZENoY2JpQWdJQ0FnSUhOMGNtbHVaM011Y21Wa2RXTmxLSFJvYVhNdWNISnZZMlZ6YzFOMVluTjBhWFIxZEdsdmJuTXVZbWx1WkNoMGFHbHpMQ0JsZUhCeVpYTnphVzl1Y3lrcExGeHVJQ0FnSUNrN1hHNGdJSDA3WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRUZ1SUdsdWRHVnliV1ZrYVdGeWVTQjBaVzF3YkdGMFpTQjBZV2NnZEdoaGRDQnlaV05sYVhabGN5QmhJSFJsYlhCc1lYUmxJSFJoWnlCaGJtUWdjR0Z6YzJWeklIUm9aU0J5WlhOMWJIUWdiMllnWTJGc2JHbHVaeUIwYUdVZ2RHVnRjR3hoZEdVZ2QybDBhQ0IwYUdVZ2NtVmpaV2wyWldSY2JpQWdJQ29nZEdWdGNHeGhkR1VnZEdGbklIUnZJRzkxY2lCdmQyNGdkR1Z0Y0d4aGRHVWdkR0ZuTGx4dUlDQWdLaUJBY0dGeVlXMGdJSHRHZFc1amRHbHZibjBnSUNBZ0lDQWdJRzVsZUhSVVlXY2dJQ0FnSUNBZ0lDQWdMU0IwYUdVZ2NtVmpaV2wyWldRZ2RHVnRjR3hoZEdVZ2RHRm5YRzRnSUNBcUlFQndZWEpoYlNBZ2UwRnljbUY1UEZOMGNtbHVaejU5SUNBZ2RHVnRjR3hoZEdVZ0lDQWdJQ0FnSUNBdElIUm9aU0IwWlcxd2JHRjBaU0IwYnlCd2NtOWpaWE56WEc0Z0lDQXFJRUJ3WVhKaGJTQWdleTR1TGlwOUlDQWdJQ0FnSUNBZ0lDQWdMaTR1YzNWaWMzUnBkSFYwYVc5dWN5QXRJR0J6ZFdKemRHbDBkWFJwYjI1ellDQnBjeUJoYmlCaGNuSmhlU0J2WmlCaGJHd2djM1ZpYzNScGRIVjBhVzl1Y3lCcGJpQjBhR1VnZEdWdGNHeGhkR1ZjYmlBZ0lDb2dRSEpsZEhWeWJpQjdLbjBnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDMGdkR2hsSUdacGJtRnNJSEJ5YjJObGMzTmxaQ0IyWVd4MVpWeHVJQ0FnS2k5Y2JpQWdhVzUwWlhKcGJWUmhaeWh3Y21WMmFXOTFjMVJoWnl3Z2RHVnRjR3hoZEdVc0lDNHVMbk4xWW5OMGFYUjFkR2x2Ym5NcElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NTBZV2RnSkh0d2NtVjJhVzkxYzFSaFp5aDBaVzF3YkdGMFpTd2dMaTR1YzNWaWMzUnBkSFYwYVc5dWN5bDlZRHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0FnS2lCUVpYSm1iM0p0Y3lCaWRXeHJJSEJ5YjJObGMzTnBibWNnYjI0Z2RHaGxJSFJoWjJkbFpDQjBaVzF3YkdGMFpTd2dkSEpoYm5ObWIzSnRhVzVuSUdWaFkyZ2djM1ZpYzNScGRIVjBhVzl1SUdGdVpDQjBhR1Z1WEc0Z0lDQXFJR052Ym1OaGRHVnVZWFJwYm1jZ2RHaGxJSEpsYzNWc2RHbHVaeUIyWVd4MVpYTWdhVzUwYnlCaElITjBjbWx1Wnk1Y2JpQWdJQ29nUUhCaGNtRnRJQ0I3UVhKeVlYazhLajU5SUhOMVluTjBhWFIxZEdsdmJuTWdMU0JoYmlCaGNuSmhlU0J2WmlCaGJHd2djbVZ0WVdsdWFXNW5JSE4xWW5OMGFYUjFkR2x2Ym5NZ2NISmxjMlZ1ZENCcGJpQjBhR2x6SUhSbGJYQnNZWFJsWEc0Z0lDQXFJRUJ3WVhKaGJTQWdlMU4wY21sdVozMGdJQ0J5WlhOMWJIUlRiMFpoY2lBZ0lDMGdkR2hwY3lCcGRHVnlZWFJwYjI0bmN5QnlaWE4xYkhRZ2MzUnlhVzVuSUhOdklHWmhjbHh1SUNBZ0tpQkFjR0Z5WVcwZ0lIdFRkSEpwYm1kOUlDQWdjbVZ0WVdsdWFXNW5VR0Z5ZENBdElIUm9aU0IwWlcxd2JHRjBaU0JqYUhWdWF5QmhablJsY2lCMGFHVWdZM1Z5Y21WdWRDQnpkV0p6ZEdsMGRYUnBiMjVjYmlBZ0lDb2dRSEpsZEhWeWJpQjdVM1J5YVc1bmZTQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0xTQjBhR1VnY21WemRXeDBJRzltSUdwdmFXNXBibWNnZEdocGN5QnBkR1Z5WVhScGIyNG5jeUJ3Y205alpYTnpaV1FnYzNWaWMzUnBkSFYwYVc5dUlIZHBkR2dnZEdobElISmxjM1ZzZEZ4dUlDQWdLaTljYmlBZ2NISnZZMlZ6YzFOMVluTjBhWFIxZEdsdmJuTW9jM1ZpYzNScGRIVjBhVzl1Y3l3Z2NtVnpkV3gwVTI5R1lYSXNJSEpsYldGcGJtbHVaMUJoY25RcElIdGNiaUFnSUNCamIyNXpkQ0J6ZFdKemRHbDBkWFJwYjI0Z1BTQjBhR2x6TG5SeVlXNXpabTl5YlZOMVluTjBhWFIxZEdsdmJpaGNiaUFnSUNBZ0lITjFZbk4wYVhSMWRHbHZibk11YzJocFpuUW9LU3hjYmlBZ0lDQWdJSEpsYzNWc2RGTnZSbUZ5TEZ4dUlDQWdJQ2s3WEc0Z0lDQWdjbVYwZFhKdUlDY25MbU52Ym1OaGRDaHlaWE4xYkhSVGIwWmhjaXdnYzNWaWMzUnBkSFYwYVc5dUxDQnlaVzFoYVc1cGJtZFFZWEowS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQkpkR1Z5WVhSbElIUm9jbTkxWjJnZ1pXRmphQ0IwY21GdWMyWnZjbTFsY2l3Z1lYQndiSGxwYm1jZ2RHaGxJSFJ5WVc1elptOXliV1Z5SjNNZ1lHOXVVM1J5YVc1bllDQnRaWFJvYjJRZ2RHOGdkR2hsSUhSbGJYQnNZWFJsWEc0Z0lDQXFJSE4wY21sdVozTWdZbVZtYjNKbElHRnNiQ0J6ZFdKemRHbDBkWFJwYjI1eklHRnlaU0J3Y205alpYTnpaV1F1WEc0Z0lDQXFJRUJ3WVhKaGJTQjdVM1J5YVc1bmZTQWdjM1J5SUMwZ1ZHaGxJR2x1Y0hWMElITjBjbWx1WjF4dUlDQWdLaUJBY21WMGRYSnVJSHRUZEhKcGJtZDlJQ0FnSUNBdElGUm9aU0JtYVc1aGJDQnlaWE4xYkhSeklHOW1JSEJ5YjJObGMzTnBibWNnWldGamFDQjBjbUZ1YzJadmNtMWxjbHh1SUNBZ0tpOWNiaUFnZEhKaGJuTm1iM0p0VTNSeWFXNW5LSE4wY2lrZ2UxeHVJQ0FnSUdOdmJuTjBJR05pSUQwZ0tISmxjeXdnZEhKaGJuTm1iM0p0S1NBOVBseHVJQ0FnSUNBZ2RISmhibk5tYjNKdExtOXVVM1J5YVc1bklEOGdkSEpoYm5ObWIzSnRMbTl1VTNSeWFXNW5LSEpsY3lrZ09pQnlaWE03WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11ZEhKaGJuTm1iM0p0WlhKekxuSmxaSFZqWlNoallpd2djM1J5S1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0tpQlhhR1Z1SUdFZ2MzVmljM1JwZEhWMGFXOXVJR2x6SUdWdVkyOTFiblJsY21Wa0xDQnBkR1Z5WVhSbGN5QjBhSEp2ZFdkb0lHVmhZMmdnZEhKaGJuTm1iM0p0WlhJZ1lXNWtJR0Z3Y0d4cFpYTWdkR2hsSUhSeVlXNXpabTl5YldWeUozTmNiaUFnSUNvZ1lHOXVVM1ZpYzNScGRIVjBhVzl1WUNCdFpYUm9iMlFnZEc4Z2RHaGxJSE4xWW5OMGFYUjFkR2x2Ymk1Y2JpQWdJQ29nUUhCaGNtRnRJQ0I3S24wZ0lDQWdJQ0J6ZFdKemRHbDBkWFJwYjI0Z0xTQlVhR1VnWTNWeWNtVnVkQ0J6ZFdKemRHbDBkWFJwYjI1Y2JpQWdJQ29nUUhCaGNtRnRJQ0I3VTNSeWFXNW5mU0J5WlhOMWJIUlRiMFpoY2lBZ0xTQlVhR1VnY21WemRXeDBJSFZ3SUhSdklHRnVaQ0JsZUdOc2RXUnBibWNnZEdocGN5QnpkV0p6ZEdsMGRYUnBiMjR1WEc0Z0lDQXFJRUJ5WlhSMWNtNGdleXA5SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUMwZ1ZHaGxJR1pwYm1Gc0lISmxjM1ZzZENCdlppQmhjSEJzZVdsdVp5QmhiR3dnYzNWaWMzUnBkSFYwYVc5dUlIUnlZVzV6Wm05eWJXRjBhVzl1Y3k1Y2JpQWdJQ292WEc0Z0lIUnlZVzV6Wm05eWJWTjFZbk4wYVhSMWRHbHZiaWh6ZFdKemRHbDBkWFJwYjI0c0lISmxjM1ZzZEZOdlJtRnlLU0I3WEc0Z0lDQWdZMjl1YzNRZ1kySWdQU0FvY21WekxDQjBjbUZ1YzJadmNtMHBJRDArWEc0Z0lDQWdJQ0IwY21GdWMyWnZjbTB1YjI1VGRXSnpkR2wwZFhScGIyNWNiaUFnSUNBZ0lDQWdQeUIwY21GdWMyWnZjbTB1YjI1VGRXSnpkR2wwZFhScGIyNG9jbVZ6TENCeVpYTjFiSFJUYjBaaGNpbGNiaUFnSUNBZ0lDQWdPaUJ5WlhNN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdWRISmhibk5tYjNKdFpYSnpMbkpsWkhWalpTaGpZaXdnYzNWaWMzUnBkSFYwYVc5dUtUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQWdLaUJKZEdWeVlYUmxjeUIwYUhKdmRXZG9JR1ZoWTJnZ2RISmhibk5tYjNKdFpYSXNJR0Z3Y0d4NWFXNW5JSFJvWlNCMGNtRnVjMlp2Y20xbGNpZHpJR0J2YmtWdVpGSmxjM1ZzZEdBZ2JXVjBhRzlrSUhSdklIUm9aVnh1SUNBZ0tpQjBaVzF3YkdGMFpTQnNhWFJsY21Gc0lHRm1kR1Z5SUdGc2JDQnpkV0p6ZEdsMGRYUnBiMjV6SUdoaGRtVWdabWx1YVhOb1pXUWdjSEp2WTJWemMybHVaeTVjYmlBZ0lDb2dRSEJoY21GdElDQjdVM1J5YVc1bmZTQmxibVJTWlhOMWJIUWdMU0JVYUdVZ2NISnZZMlZ6YzJWa0lIUmxiWEJzWVhSbExDQnFkWE4wSUdKbFptOXlaU0JwZENCcGN5QnlaWFIxY201bFpDQm1jbTl0SUhSb1pTQjBZV2RjYmlBZ0lDb2dRSEpsZEhWeWJpQjdVM1J5YVc1bmZTQWdJQ0FnSUNBZ0lDQWdMU0JVYUdVZ1ptbHVZV3dnY21WemRXeDBjeUJ2WmlCd2NtOWpaWE56YVc1bklHVmhZMmdnZEhKaGJuTm1iM0p0WlhKY2JpQWdJQ292WEc0Z0lIUnlZVzV6Wm05eWJVVnVaRkpsYzNWc2RDaGxibVJTWlhOMWJIUXBJSHRjYmlBZ0lDQmpiMjV6ZENCallpQTlJQ2h5WlhNc0lIUnlZVzV6Wm05eWJTa2dQVDVjYmlBZ0lDQWdJSFJ5WVc1elptOXliUzV2YmtWdVpGSmxjM1ZzZENBL0lIUnlZVzV6Wm05eWJTNXZia1Z1WkZKbGMzVnNkQ2h5WlhNcElEb2djbVZ6TzF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG5SeVlXNXpabTl5YldWeWN5NXlaV1IxWTJVb1kySXNJR1Z1WkZKbGMzVnNkQ2s3WEc0Z0lIMWNibjFjYmlKZGZRPT0iLCIvKipcbiAqIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyIHRoYXQgdHJpbXMgd2hpdGVzcGFjZSBvbiB0aGUgZW5kIHJlc3VsdCBvZiBhIHRhZ2dlZCB0ZW1wbGF0ZVxuICogQHBhcmFtICB7U3RyaW5nfSBzaWRlID0gJycgLSBUaGUgc2lkZSBvZiB0aGUgc3RyaW5nIHRvIHRyaW0uIENhbiBiZSAnc3RhcnQnIG9yICdlbmQnIChhbHRlcm5hdGl2ZWx5ICdsZWZ0JyBvciAncmlnaHQnKVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbnZhciB0cmltUmVzdWx0VHJhbnNmb3JtZXIgPSBmdW5jdGlvbiB0cmltUmVzdWx0VHJhbnNmb3JtZXIoKSB7XG4gIHZhciBzaWRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgcmV0dXJuIHtcbiAgICBvbkVuZFJlc3VsdDogZnVuY3Rpb24gb25FbmRSZXN1bHQoZW5kUmVzdWx0KSB7XG4gICAgICBpZiAoc2lkZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGVuZFJlc3VsdC50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIHNpZGUgPSBzaWRlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChzaWRlID09PSAnc3RhcnQnIHx8IHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICByZXR1cm4gZW5kUmVzdWx0LnJlcGxhY2UoL15cXHMqLywgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2lkZSA9PT0gJ2VuZCcgfHwgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICByZXR1cm4gZW5kUmVzdWx0LnJlcGxhY2UoL1xccyokLywgJycpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpZGUgbm90IHN1cHBvcnRlZDogJyArIHNpZGUpO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OTBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWEl2ZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxtcHpJbDBzSW01aGJXVnpJanBiSW5SeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbk5wWkdVaUxDSnZia1Z1WkZKbGMzVnNkQ0lzSW1WdVpGSmxjM1ZzZENJc0luUnlhVzBpTENKMGIweHZkMlZ5UTJGelpTSXNJbkpsY0d4aFkyVWlMQ0pGY25KdmNpSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRTdPenM3TzBGQlMwRXNTVUZCVFVFc2QwSkJRWGRDTEZOQlFYaENRU3h4UWtGQmQwSTdRVUZCUVN4TlFVRkRReXhKUVVGRUxIVkZRVUZSTEVWQlFWSTdRVUZCUVN4VFFVRm5RanRCUVVNMVEwTXNaVUZFTkVNc2RVSkJRMmhEUXl4VFFVUm5ReXhGUVVOeVFqdEJRVU55UWl4VlFVRkpSaXhUUVVGVExFVkJRV0lzUlVGQmFVSTdRVUZEWml4bFFVRlBSU3hWUVVGVlF5eEpRVUZXTEVWQlFWQTdRVUZEUkRzN1FVRkZSRWdzWVVGQlQwRXNTMEZCUzBrc1YwRkJUQ3hGUVVGUU96dEJRVVZCTEZWQlFVbEtMRk5CUVZNc1QwRkJWQ3hKUVVGdlFrRXNVMEZCVXl4TlFVRnFReXhGUVVGNVF6dEJRVU4yUXl4bFFVRlBSU3hWUVVGVlJ5eFBRVUZXTEVOQlFXdENMRTFCUVd4Q0xFVkJRVEJDTEVWQlFURkNMRU5CUVZBN1FVRkRSRHM3UVVGRlJDeFZRVUZKVEN4VFFVRlRMRXRCUVZRc1NVRkJhMEpCTEZOQlFWTXNUMEZCTDBJc1JVRkJkME03UVVGRGRFTXNaVUZCVDBVc1ZVRkJWVWNzVDBGQlZpeERRVUZyUWl4TlFVRnNRaXhGUVVFd1FpeEZRVUV4UWl4RFFVRlFPMEZCUTBRN08wRkJSVVFzV1VGQlRTeEpRVUZKUXl4TFFVRktMREJDUVVGcFEwNHNTVUZCYWtNc1EwRkJUanRCUVVORU8wRkJha0l5UXl4SFFVRm9RanRCUVVGQkxFTkJRVGxDT3p0QlFXOUNRU3hsUVVGbFJDeHhRa0ZCWmlJc0ltWnBiR1VpT2lKMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUZSbGJYQnNZWFJsVkdGbklIUnlZVzV6Wm05eWJXVnlJSFJvWVhRZ2RISnBiWE1nZDJocGRHVnpjR0ZqWlNCdmJpQjBhR1VnWlc1a0lISmxjM1ZzZENCdlppQmhJSFJoWjJkbFpDQjBaVzF3YkdGMFpWeHVJQ29nUUhCaGNtRnRJQ0I3VTNSeWFXNW5mU0J6YVdSbElEMGdKeWNnTFNCVWFHVWdjMmxrWlNCdlppQjBhR1VnYzNSeWFXNW5JSFJ2SUhSeWFXMHVJRU5oYmlCaVpTQW5jM1JoY25RbklHOXlJQ2RsYm1RbklDaGhiSFJsY201aGRHbDJaV3g1SUNkc1pXWjBKeUJ2Y2lBbmNtbG5hSFFuS1Z4dUlDb2dRSEpsZEhWeWJpQjdUMkpxWldOMGZTQWdJQ0FnSUNBZ0lDQWdMU0JoSUZSbGJYQnNZWFJsVkdGbklIUnlZVzV6Wm05eWJXVnlYRzRnS2k5Y2JtTnZibk4wSUhSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpQTlJQ2h6YVdSbElEMGdKeWNwSUQwK0lDaDdYRzRnSUc5dVJXNWtVbVZ6ZFd4MEtHVnVaRkpsYzNWc2RDa2dlMXh1SUNBZ0lHbG1JQ2h6YVdSbElEMDlQU0FuSnlrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdWdVpGSmxjM1ZzZEM1MGNtbHRLQ2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjMmxrWlNBOUlITnBaR1V1ZEc5TWIzZGxja05oYzJVb0tUdGNibHh1SUNBZ0lHbG1JQ2h6YVdSbElEMDlQU0FuYzNSaGNuUW5JSHg4SUhOcFpHVWdQVDA5SUNkc1pXWjBKeWtnZTF4dUlDQWdJQ0FnY21WMGRYSnVJR1Z1WkZKbGMzVnNkQzV5WlhCc1lXTmxLQzllWEZ4ektpOHNJQ2NuS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JwWmlBb2MybGtaU0E5UFQwZ0oyVnVaQ2NnZkh3Z2MybGtaU0E5UFQwZ0ozSnBaMmgwSnlrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdWdVpGSmxjM1ZzZEM1eVpYQnNZV05sS0M5Y1hITXFKQzhzSUNjbktUdGNiaUFnSUNCOVhHNWNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUZOcFpHVWdibTkwSUhOMWNIQnZjblJsWkRvZ0pIdHphV1JsZldBcE8xeHVJQ0I5TEZ4dWZTazdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJSFJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2p0Y2JpSmRmUT09IiwiZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbi8qKlxuICogc3RyaXBzIGluZGVudGF0aW9uIGZyb20gYSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUgPSAnaW5pdGlhbCcgLSB3aGV0aGVyIHRvIHJlbW92ZSBhbGwgaW5kZW50YXRpb24gb3IganVzdCBsZWFkaW5nIGluZGVudGF0aW9uLiBjYW4gYmUgJ2FsbCcgb3IgJ2luaXRpYWwnXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbnZhciBzdHJpcEluZGVudFRyYW5zZm9ybWVyID0gZnVuY3Rpb24gc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcigpIHtcbiAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdpbml0aWFsJztcbiAgcmV0dXJuIHtcbiAgICBvbkVuZFJlc3VsdDogZnVuY3Rpb24gb25FbmRSZXN1bHQoZW5kUmVzdWx0KSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgc2hvcnRlc3QgbGVhZGluZyBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgICB2YXIgbWF0Y2ggPSBlbmRSZXN1bHQubWF0Y2goL15bXlxcU1xcbl0qKD89XFxTKS9nbSk7XG4gICAgICAgIHZhciBpbmRlbnQgPSBtYXRjaCAmJiBNYXRoLm1pbi5hcHBseShNYXRoLCBfdG9Db25zdW1hYmxlQXJyYXkobWF0Y2gubWFwKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIHJldHVybiBlbC5sZW5ndGg7XG4gICAgICAgIH0pKSk7XG4gICAgICAgIGlmIChpbmRlbnQpIHtcbiAgICAgICAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnXi57JyArIGluZGVudCArICd9JywgJ2dtJyk7XG4gICAgICAgICAgcmV0dXJuIGVuZFJlc3VsdC5yZXBsYWNlKHJlZ2V4cCwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmRSZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggbGluZVxuICAgICAgICByZXR1cm4gZW5kUmVzdWx0LnJlcGxhY2UoL15bXlxcU1xcbl0rL2dtLCAnJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUwzTjBjbWx3U1c1a1pXNTBWSEpoYm5ObWIzSnRaWEl1YW5NaVhTd2libUZ0WlhNaU9sc2ljM1J5YVhCSmJtUmxiblJVY21GdWMyWnZjbTFsY2lJc0luUjVjR1VpTENKdmJrVnVaRkpsYzNWc2RDSXNJbVZ1WkZKbGMzVnNkQ0lzSW0xaGRHTm9JaXdpYVc1a1pXNTBJaXdpVFdGMGFDSXNJbTFwYmlJc0ltMWhjQ0lzSW1Wc0lpd2liR1Z1WjNSb0lpd2ljbVZuWlhod0lpd2lVbVZuUlhod0lpd2ljbVZ3YkdGalpTSXNJa1Z5Y205eUlsMHNJbTFoY0hCcGJtZHpJam9pT3p0QlFVRkJPenM3T3p0QlFVdEJMRWxCUVUxQkxIbENRVUY1UWl4VFFVRjZRa0VzYzBKQlFYbENPMEZCUVVFc1RVRkJRME1zU1VGQlJDeDFSVUZCVVN4VFFVRlNPMEZCUVVFc1UwRkJkVUk3UVVGRGNFUkRMR1ZCUkc5RUxIVkNRVU40UTBNc1UwRkVkME1zUlVGRE4wSTdRVUZEY2tJc1ZVRkJTVVlzVTBGQlV5eFRRVUZpTEVWQlFYZENPMEZCUTNSQ08wRkJRMEVzV1VGQlRVY3NVVUZCVVVRc1ZVRkJWVU1zUzBGQlZpeERRVUZuUWl4dFFrRkJhRUlzUTBGQlpEdEJRVU5CTEZsQlFVMURMRk5CUVZORUxGTkJRVk5GTEV0QlFVdERMRWRCUVV3c1owTkJRVmxJTEUxQlFVMUpMRWRCUVU0c1EwRkJWVHRCUVVGQkxHbENRVUZOUXl4SFFVRkhReXhOUVVGVU8wRkJRVUVzVTBGQlZpeERRVUZhTEVWQlFYaENPMEZCUTBFc1dVRkJTVXdzVFVGQlNpeEZRVUZaTzBGQlExWXNZMEZCVFUwc1UwRkJVeXhKUVVGSlF5eE5RVUZLTEZOQlFXbENVQ3hOUVVGcVFpeFJRVUUwUWl4SlFVRTFRaXhEUVVGbU8wRkJRMEVzYVVKQlFVOUdMRlZCUVZWVkxFOUJRVllzUTBGQmEwSkdMRTFCUVd4Q0xFVkJRVEJDTEVWQlFURkNMRU5CUVZBN1FVRkRSRHRCUVVORUxHVkJRVTlTTEZOQlFWQTdRVUZEUkR0QlFVTkVMRlZCUVVsR0xGTkJRVk1zUzBGQllpeEZRVUZ2UWp0QlFVTnNRanRCUVVOQkxHVkJRVTlGTEZWQlFWVlZMRTlCUVZZc1EwRkJhMElzWVVGQmJFSXNSVUZCYVVNc1JVRkJha01zUTBGQlVEdEJRVU5FTzBGQlEwUXNXVUZCVFN4SlFVRkpReXhMUVVGS0xHOUNRVUV5UW1Jc1NVRkJNMElzUTBGQlRqdEJRVU5FTzBGQmFrSnRSQ3hIUVVGMlFqdEJRVUZCTEVOQlFTOUNPenRCUVc5Q1FTeGxRVUZsUkN4elFrRkJaaUlzSW1acGJHVWlPaUp6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvcVhHNGdLaUJ6ZEhKcGNITWdhVzVrWlc1MFlYUnBiMjRnWm5KdmJTQmhJSFJsYlhCc1lYUmxJR3hwZEdWeVlXeGNiaUFxSUVCd1lYSmhiU0FnZTFOMGNtbHVaMzBnZEhsd1pTQTlJQ2RwYm1sMGFXRnNKeUF0SUhkb1pYUm9aWElnZEc4Z2NtVnRiM1psSUdGc2JDQnBibVJsYm5SaGRHbHZiaUJ2Y2lCcWRYTjBJR3hsWVdScGJtY2dhVzVrWlc1MFlYUnBiMjR1SUdOaGJpQmlaU0FuWVd4c0p5QnZjaUFuYVc1cGRHbGhiQ2RjYmlBcUlFQnlaWFIxY200Z2UwOWlhbVZqZEgwZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBdElHRWdWR1Z0Y0d4aGRHVlVZV2NnZEhKaGJuTm1iM0p0WlhKY2JpQXFMMXh1WTI5dWMzUWdjM1J5YVhCSmJtUmxiblJVY21GdWMyWnZjbTFsY2lBOUlDaDBlWEJsSUQwZ0oybHVhWFJwWVd3bktTQTlQaUFvZTF4dUlDQnZia1Z1WkZKbGMzVnNkQ2hsYm1SU1pYTjFiSFFwSUh0Y2JpQWdJQ0JwWmlBb2RIbHdaU0E5UFQwZ0oybHVhWFJwWVd3bktTQjdYRzRnSUNBZ0lDQXZMeUJ5WlcxdmRtVWdkR2hsSUhOb2IzSjBaWE4wSUd4bFlXUnBibWNnYVc1a1pXNTBZWFJwYjI0Z1puSnZiU0JsWVdOb0lHeHBibVZjYmlBZ0lDQWdJR052Ym5OMElHMWhkR05vSUQwZ1pXNWtVbVZ6ZFd4MExtMWhkR05vS0M5ZVcxNWNYRk5jWEc1ZEtpZy9QVnhjVXlrdloyMHBPMXh1SUNBZ0lDQWdZMjl1YzNRZ2FXNWtaVzUwSUQwZ2JXRjBZMmdnSmlZZ1RXRjBhQzV0YVc0b0xpNHViV0YwWTJndWJXRndLR1ZzSUQwK0lHVnNMbXhsYm1kMGFDa3BPMXh1SUNBZ0lDQWdhV1lnS0dsdVpHVnVkQ2tnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0J5WldkbGVIQWdQU0J1WlhjZ1VtVm5SWGh3S0dCZUxuc2tlMmx1WkdWdWRIMTlZQ3dnSjJkdEp5azdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmxibVJTWlhOMWJIUXVjbVZ3YkdGalpTaHlaV2RsZUhBc0lDY25LVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSEpsZEhWeWJpQmxibVJTWlhOMWJIUTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaDBlWEJsSUQwOVBTQW5ZV3hzSnlrZ2UxeHVJQ0FnSUNBZ0x5OGdjbVZ0YjNabElHRnNiQ0JwYm1SbGJuUmhkR2x2YmlCbWNtOXRJR1ZoWTJnZ2JHbHVaVnh1SUNBZ0lDQWdjbVYwZFhKdUlHVnVaRkpsYzNWc2RDNXlaWEJzWVdObEtDOWVXMTVjWEZOY1hHNWRLeTluYlN3Z0p5Y3BPMXh1SUNBZ0lIMWNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvWUZWdWEyNXZkMjRnZEhsd1pUb2dKSHQwZVhCbGZXQXBPMXh1SUNCOUxGeHVmU2s3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUhOMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSTdYRzRpWFgwPSIsIi8qKlxuICogUmVwbGFjZXMgdGFicywgbmV3bGluZXMgYW5kIHNwYWNlcyB3aXRoIHRoZSBjaG9zZW4gdmFsdWUgd2hlbiB0aGV5IG9jY3VyIGluIHNlcXVlbmNlc1xuICogQHBhcmFtICB7KFN0cmluZ3xSZWdFeHApfSByZXBsYWNlV2hhdCAtIHRoZSB2YWx1ZSBvciBwYXR0ZXJuIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkXG4gKiBAcGFyYW0gIHsqfSAgICAgICAgICAgICAgIHJlcGxhY2VXaXRoIC0gdGhlIHJlcGxhY2VtZW50IHZhbHVlXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgIC0gYSBUZW1wbGF0ZVRhZyB0cmFuc2Zvcm1lclxuICovXG52YXIgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyID0gZnVuY3Rpb24gcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKHJlcGxhY2VXaGF0LCByZXBsYWNlV2l0aCkge1xuICByZXR1cm4ge1xuICAgIG9uRW5kUmVzdWx0OiBmdW5jdGlvbiBvbkVuZFJlc3VsdChlbmRSZXN1bHQpIHtcbiAgICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgcmVxdWlyZXMgYXQgbGVhc3QgMiBhcmd1bWVudHMuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW5kUmVzdWx0LnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl5WlhCc1lXTmxVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSXZjbVZ3YkdGalpWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxtcHpJbDBzSW01aGJXVnpJanBiSW5KbGNHeGhZMlZTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaUlzSW5KbGNHeGhZMlZYYUdGMElpd2ljbVZ3YkdGalpWZHBkR2dpTENKdmJrVnVaRkpsYzNWc2RDSXNJbVZ1WkZKbGMzVnNkQ0lzSWtWeWNtOXlJaXdpY21Wd2JHRmpaU0pkTENKdFlYQndhVzVuY3lJNklrRkJRVUU3T3pzN096dEJRVTFCTEVsQlFVMUJMREpDUVVFeVFpeFRRVUV6UWtFc2QwSkJRVEpDTEVOQlFVTkRMRmRCUVVRc1JVRkJZME1zVjBGQlpEdEJRVUZCTEZOQlFTdENPMEZCUXpsRVF5eGxRVVE0UkN4MVFrRkRiRVJETEZOQlJHdEVMRVZCUTNaRE8wRkJRM0pDTEZWQlFVbElMR1ZCUVdVc1NVRkJaaXhKUVVGMVFrTXNaVUZCWlN4SlFVRXhReXhGUVVGblJEdEJRVU01UXl4alFVRk5MRWxCUVVsSExFdEJRVW9zUTBGRFNpeDVSRUZFU1N4RFFVRk9PMEZCUjBRN1FVRkRSQ3hoUVVGUFJDeFZRVUZWUlN4UFFVRldMRU5CUVd0Q1RDeFhRVUZzUWl4RlFVRXJRa01zVjBGQkwwSXNRMEZCVUR0QlFVTkVPMEZCVWpaRUxFZEJRUzlDTzBGQlFVRXNRMEZCYWtNN08wRkJWMEVzWlVGQlpVWXNkMEpCUVdZaUxDSm1hV3hsSWpvaWNtVndiR0ZqWlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9xWEc0Z0tpQlNaWEJzWVdObGN5QjBZV0p6TENCdVpYZHNhVzVsY3lCaGJtUWdjM0JoWTJWeklIZHBkR2dnZEdobElHTm9iM05sYmlCMllXeDFaU0IzYUdWdUlIUm9aWGtnYjJOamRYSWdhVzRnYzJWeGRXVnVZMlZ6WEc0Z0tpQkFjR0Z5WVcwZ0lIc29VM1J5YVc1bmZGSmxaMFY0Y0NsOUlISmxjR3hoWTJWWGFHRjBJQzBnZEdobElIWmhiSFZsSUc5eUlIQmhkSFJsY200Z2RHaGhkQ0J6YUc5MWJHUWdZbVVnY21Wd2JHRmpaV1JjYmlBcUlFQndZWEpoYlNBZ2V5cDlJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2NtVndiR0ZqWlZkcGRHZ2dMU0IwYUdVZ2NtVndiR0ZqWlcxbGJuUWdkbUZzZFdWY2JpQXFJRUJ5WlhSMWNtNGdlMDlpYW1WamRIMGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTFNCaElGUmxiWEJzWVhSbFZHRm5JSFJ5WVc1elptOXliV1Z5WEc0Z0tpOWNibU52Ym5OMElISmxjR3hoWTJWU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lBOUlDaHlaWEJzWVdObFYyaGhkQ3dnY21Wd2JHRmpaVmRwZEdncElEMCtJQ2g3WEc0Z0lHOXVSVzVrVW1WemRXeDBLR1Z1WkZKbGMzVnNkQ2tnZTF4dUlDQWdJR2xtSUNoeVpYQnNZV05sVjJoaGRDQTlQU0J1ZFd4c0lIeDhJSEpsY0d4aFkyVlhhWFJvSUQwOUlHNTFiR3dwSUh0Y2JpQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWhjYmlBZ0lDQWdJQ0FnSjNKbGNHeGhZMlZTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaUJ5WlhGMWFYSmxjeUJoZENCc1pXRnpkQ0F5SUdGeVozVnRaVzUwY3k0bkxGeHVJQ0FnSUNBZ0tUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJR1Z1WkZKbGMzVnNkQzV5WlhCc1lXTmxLSEpsY0d4aFkyVlhhR0YwTENCeVpYQnNZV05sVjJsMGFDazdYRzRnSUgwc1hHNTlLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnY21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlPMXh1SWwxOSIsInZhciByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgPSBmdW5jdGlvbiByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKSB7XG4gIHJldHVybiB7XG4gICAgb25TdWJzdGl0dXRpb246IGZ1bmN0aW9uIG9uU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbiwgcmVzdWx0U29GYXIpIHtcbiAgICAgIGlmIChyZXBsYWNlV2hhdCA9PSBudWxsIHx8IHJlcGxhY2VXaXRoID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgcmVxdWlyZXMgYXQgbGVhc3QgMiBhcmd1bWVudHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvIG5vdCB0b3VjaCBpZiBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgaWYgKHN1YnN0aXR1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uLnRvU3RyaW5nKCkucmVwbGFjZShyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWEl2Y21Wd2JHRmpaVk4xWW5OMGFYUjFkR2x2YmxSeVlXNXpabTl5YldWeUxtcHpJbDBzSW01aGJXVnpJanBiSW5KbGNHeGhZMlZUZFdKemRHbDBkWFJwYjI1VWNtRnVjMlp2Y20xbGNpSXNJbkpsY0d4aFkyVlhhR0YwSWl3aWNtVndiR0ZqWlZkcGRHZ2lMQ0p2YmxOMVluTjBhWFIxZEdsdmJpSXNJbk4xWW5OMGFYUjFkR2x2YmlJc0luSmxjM1ZzZEZOdlJtRnlJaXdpUlhKeWIzSWlMQ0owYjFOMGNtbHVaeUlzSW5KbGNHeGhZMlVpWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEVsQlFVMUJMR2xEUVVGcFF5eFRRVUZxUTBFc09FSkJRV2xETEVOQlFVTkRMRmRCUVVRc1JVRkJZME1zVjBGQlpEdEJRVUZCTEZOQlFTdENPMEZCUTNCRlF5eHJRa0ZFYjBVc01FSkJRM0pFUXl4WlFVUnhSQ3hGUVVOMlEwTXNWMEZFZFVNc1JVRkRNVUk3UVVGRGVFTXNWVUZCU1Vvc1pVRkJaU3hKUVVGbUxFbEJRWFZDUXl4bFFVRmxMRWxCUVRGRExFVkJRV2RFTzBGQlF6bERMR05CUVUwc1NVRkJTVWtzUzBGQlNpeERRVU5LTEN0RVFVUkpMRU5CUVU0N1FVRkhSRHM3UVVGRlJEdEJRVU5CTEZWQlFVbEdMR2RDUVVGblFpeEpRVUZ3UWl4RlFVRXdRanRCUVVONFFpeGxRVUZQUVN4WlFVRlFPMEZCUTBRc1QwRkdSQ3hOUVVWUE8wRkJRMHdzWlVGQlQwRXNZVUZCWVVjc1VVRkJZaXhIUVVGM1FrTXNUMEZCZUVJc1EwRkJaME5RTEZkQlFXaERMRVZCUVRaRFF5eFhRVUUzUXl4RFFVRlFPMEZCUTBRN1FVRkRSanRCUVdSdFJTeEhRVUV2UWp0QlFVRkJMRU5CUVhaRE96dEJRV2xDUVN4bFFVRmxSaXc0UWtGQlppSXNJbVpwYkdVaU9pSnlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWEl1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SmpiMjV6ZENCeVpYQnNZV05sVTNWaWMzUnBkSFYwYVc5dVZISmhibk5tYjNKdFpYSWdQU0FvY21Wd2JHRmpaVmRvWVhRc0lISmxjR3hoWTJWWGFYUm9LU0E5UGlBb2UxeHVJQ0J2YmxOMVluTjBhWFIxZEdsdmJpaHpkV0p6ZEdsMGRYUnBiMjRzSUhKbGMzVnNkRk52Um1GeUtTQjdYRzRnSUNBZ2FXWWdLSEpsY0d4aFkyVlhhR0YwSUQwOUlHNTFiR3dnZkh3Z2NtVndiR0ZqWlZkcGRHZ2dQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQW5jbVZ3YkdGalpWTjFZbk4wYVhSMWRHbHZibFJ5WVc1elptOXliV1Z5SUhKbGNYVnBjbVZ6SUdGMElHeGxZWE4wSURJZ1lYSm5kVzFsYm5SekxpY3NYRzRnSUNBZ0lDQXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHZJRVJ2SUc1dmRDQjBiM1ZqYUNCcFppQnVkV3hzSUc5eUlIVnVaR1ZtYVc1bFpGeHVJQ0FnSUdsbUlDaHpkV0p6ZEdsMGRYUnBiMjRnUFQwZ2JuVnNiQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSE4xWW5OMGFYUjFkR2x2Ymp0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdjbVYwZFhKdUlITjFZbk4wYVhSMWRHbHZiaTUwYjFOMGNtbHVaeWdwTG5KbGNHeGhZMlVvY21Wd2JHRmpaVmRvWVhRc0lISmxjR3hoWTJWWGFYUm9LVHRjYmlBZ0lDQjlYRzRnSUgwc1hHNTlLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnY21Wd2JHRmpaVk4xWW5OMGFYUjFkR2x2YmxSeVlXNXpabTl5YldWeU8xeHVJbDE5IiwidmFyIHJlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lciA9IGZ1bmN0aW9uIHJlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lcihyZXBsYWNlV2hhdCwgcmVwbGFjZVdpdGgpIHtcbiAgcmV0dXJuIHtcbiAgICBvblN0cmluZzogZnVuY3Rpb24gb25TdHJpbmcoc3RyKSB7XG4gICAgICBpZiAocmVwbGFjZVdoYXQgPT0gbnVsbCB8fCByZXBsYWNlV2l0aCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVwbGFjZVN0cmluZ1RyYW5zZm9ybWVyIHJlcXVpcmVzIGF0IGxlYXN0IDIgYXJndW1lbnRzLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocmVwbGFjZVdoYXQsIHJlcGxhY2VXaXRoKTtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlU3RyaW5nVHJhbnNmb3JtZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl5WlhCc1lXTmxVM1J5YVc1blZISmhibk5tYjNKdFpYSXZjbVZ3YkdGalpWTjBjbWx1WjFSeVlXNXpabTl5YldWeUxtcHpJbDBzSW01aGJXVnpJanBiSW5KbGNHeGhZMlZUZEhKcGJtZFVjbUZ1YzJadmNtMWxjaUlzSW5KbGNHeGhZMlZYYUdGMElpd2ljbVZ3YkdGalpWZHBkR2dpTENKdmJsTjBjbWx1WnlJc0luTjBjaUlzSWtWeWNtOXlJaXdpY21Wd2JHRmpaU0pkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzU1VGQlRVRXNNa0pCUVRKQ0xGTkJRVE5DUVN4M1FrRkJNa0lzUTBGQlEwTXNWMEZCUkN4RlFVRmpReXhYUVVGa08wRkJRVUVzVTBGQkswSTdRVUZET1VSRExGbEJSRGhFTEc5Q1FVTnlSRU1zUjBGRWNVUXNSVUZEYUVRN1FVRkRXaXhWUVVGSlNDeGxRVUZsTEVsQlFXWXNTVUZCZFVKRExHVkJRV1VzU1VGQk1VTXNSVUZCWjBRN1FVRkRPVU1zWTBGQlRTeEpRVUZKUnl4TFFVRktMRU5CUTBvc2VVUkJSRWtzUTBGQlRqdEJRVWRFT3p0QlFVVkVMR0ZCUVU5RUxFbEJRVWxGTEU5QlFVb3NRMEZCV1V3c1YwRkJXaXhGUVVGNVFrTXNWMEZCZWtJc1EwRkJVRHRCUVVORU8wRkJWRFpFTEVkQlFTOUNPMEZCUVVFc1EwRkJha003TzBGQldVRXNaVUZCWlVZc2QwSkJRV1lpTENKbWFXeGxJam9pY21Wd2JHRmpaVk4wY21sdVoxUnlZVzV6Wm05eWJXVnlMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaVkyOXVjM1FnY21Wd2JHRmpaVk4wY21sdVoxUnlZVzV6Wm05eWJXVnlJRDBnS0hKbGNHeGhZMlZYYUdGMExDQnlaWEJzWVdObFYybDBhQ2tnUFQ0Z0tIdGNiaUFnYjI1VGRISnBibWNvYzNSeUtTQjdYRzRnSUNBZ2FXWWdLSEpsY0d4aFkyVlhhR0YwSUQwOUlHNTFiR3dnZkh3Z2NtVndiR0ZqWlZkcGRHZ2dQVDBnYm5Wc2JDa2dlMXh1SUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtGeHVJQ0FnSUNBZ0lDQW5jbVZ3YkdGalpWTjBjbWx1WjFSeVlXNXpabTl5YldWeUlISmxjWFZwY21WeklHRjBJR3hsWVhOMElESWdZWEpuZFcxbGJuUnpMaWNzWEc0Z0lDQWdJQ0FwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpsZEhWeWJpQnpkSEl1Y21Wd2JHRmpaU2h5WlhCc1lXTmxWMmhoZEN3Z2NtVndiR0ZqWlZkcGRHZ3BPMXh1SUNCOUxGeHVmU2s3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUhKbGNHeGhZMlZUZEhKcGJtZFVjbUZ1YzJadmNtMWxjanRjYmlKZGZRPT0iLCJ2YXIgZGVmYXVsdHMgPSB7XG4gIHNlcGFyYXRvcjogJycsXG4gIGNvbmp1bmN0aW9uOiAnJyxcbiAgc2VyaWFsOiBmYWxzZVxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBzdWJzdGl0dXRpb24gdG8gYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3RcbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuc2VwYXJhdG9yID0gJyddIC0gdGhlIGNoYXJhY3RlciB0aGF0IHNlcGFyYXRlcyBlYWNoIGl0ZW1cbiAqIEBwYXJhbSAge1N0cmluZ30gW29wdHMuY29uanVuY3Rpb24gPSAnJ10gIC0gcmVwbGFjZSB0aGUgbGFzdCBzZXBhcmF0b3Igd2l0aCB0aGlzXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0cy5zZXJpYWwgPSBmYWxzZV0gLSBpbmNsdWRlIHRoZSBzZXBhcmF0b3IgYmVmb3JlIHRoZSBjb25qdW5jdGlvbj8gKE94Zm9yZCBjb21tYSB1c2UtY2FzZSlcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgLSBhIFRlbXBsYXRlVGFnIHRyYW5zZm9ybWVyXG4gKi9cbnZhciBpbmxpbmVBcnJheVRyYW5zZm9ybWVyID0gZnVuY3Rpb24gaW5saW5lQXJyYXlUcmFuc2Zvcm1lcigpIHtcbiAgdmFyIG9wdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGRlZmF1bHRzO1xuICByZXR1cm4ge1xuICAgIG9uU3Vic3RpdHV0aW9uOiBmdW5jdGlvbiBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIHJlc3VsdFNvRmFyKSB7XG4gICAgICAvLyBvbmx5IG9wZXJhdGUgb24gYXJyYXlzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzdWJzdGl0dXRpb24pKSB7XG4gICAgICAgIHZhciBhcnJheUxlbmd0aCA9IHN1YnN0aXR1dGlvbi5sZW5ndGg7XG4gICAgICAgIHZhciBzZXBhcmF0b3IgPSBvcHRzLnNlcGFyYXRvcjtcbiAgICAgICAgdmFyIGNvbmp1bmN0aW9uID0gb3B0cy5jb25qdW5jdGlvbjtcbiAgICAgICAgdmFyIHNlcmlhbCA9IG9wdHMuc2VyaWFsO1xuICAgICAgICAvLyBqb2luIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaW50byBhIHN0cmluZyB3aGVyZSBlYWNoIGl0ZW0gaXMgc2VwYXJhdGVkIGJ5IHNlcGFyYXRvclxuICAgICAgICAvLyBiZSBzdXJlIHRvIG1haW50YWluIGluZGVudGF0aW9uXG4gICAgICAgIHZhciBpbmRlbnQgPSByZXN1bHRTb0Zhci5tYXRjaCgvKFxcbj9bXlxcU1xcbl0rKSQvKTtcbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbi5qb2luKHNlcGFyYXRvciArIGluZGVudFsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uLmpvaW4oc2VwYXJhdG9yICsgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBjb25qdW5jdGlvbiBpcyBzZXQsIHJlcGxhY2UgdGhlIGxhc3Qgc2VwYXJhdG9yIHdpdGggY29uanVuY3Rpb24sIGJ1dCBvbmx5IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc3Vic3RpdHV0aW9uXG4gICAgICAgIGlmIChjb25qdW5jdGlvbiAmJiBhcnJheUxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBzdWJzdGl0dXRpb24ubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpICsgKHNlcmlhbCA/IHNlcGFyYXRvciA6ICcnKSArICcgJyArIGNvbmp1bmN0aW9uICsgc3Vic3RpdHV0aW9uLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gICAgfVxuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXBibXhwYm1WQmNuSmhlVlJ5WVc1elptOXliV1Z5TDJsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSXVhbk1pWFN3aWJtRnRaWE1pT2xzaVpHVm1ZWFZzZEhNaUxDSnpaWEJoY21GMGIzSWlMQ0pqYjI1cWRXNWpkR2x2YmlJc0luTmxjbWxoYkNJc0ltbHViR2x1WlVGeWNtRjVWSEpoYm5ObWIzSnRaWElpTENKdmNIUnpJaXdpYjI1VGRXSnpkR2wwZFhScGIyNGlMQ0p6ZFdKemRHbDBkWFJwYjI0aUxDSnlaWE4xYkhSVGIwWmhjaUlzSWtGeWNtRjVJaXdpYVhOQmNuSmhlU0lzSW1GeWNtRjVUR1Z1WjNSb0lpd2liR1Z1WjNSb0lpd2lhVzVrWlc1MElpd2liV0YwWTJnaUxDSnFiMmx1SWl3aWMyVndZWEpoZEc5eVNXNWtaWGdpTENKc1lYTjBTVzVrWlhoUFppSXNJbk5zYVdObElsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeEpRVUZOUVN4WFFVRlhPMEZCUTJaRExHRkJRVmNzUlVGRVNUdEJRVVZtUXl4bFFVRmhMRVZCUmtVN1FVRkhaa01zVlVGQlVUdEJRVWhQTEVOQlFXcENPenRCUVUxQk96czdPenM3T3p0QlFWRkJMRWxCUVUxRExIbENRVUY1UWl4VFFVRjZRa0VzYzBKQlFYbENPMEZCUVVFc1RVRkJRME1zU1VGQlJDeDFSVUZCVVV3c1VVRkJVanRCUVVGQkxGTkJRWE5DTzBGQlEyNUVUU3hyUWtGRWJVUXNNRUpCUTNCRFF5eFpRVVJ2UXl4RlFVTjBRa01zVjBGRWMwSXNSVUZEVkR0QlFVTjRRenRCUVVOQkxGVkJRVWxETEUxQlFVMURMRTlCUVU0c1EwRkJZMGdzV1VGQlpDeERRVUZLTEVWQlFXbERPMEZCUXk5Q0xGbEJRVTFKTEdOQlFXTktMR0ZCUVdGTExFMUJRV3BETzBGQlEwRXNXVUZCVFZnc1dVRkJXVWtzUzBGQlMwb3NVMEZCZGtJN1FVRkRRU3haUVVGTlF5eGpRVUZqUnl4TFFVRkxTQ3hYUVVGNlFqdEJRVU5CTEZsQlFVMURMRk5CUVZORkxFdEJRVXRHTEUxQlFYQkNPMEZCUTBFN1FVRkRRVHRCUVVOQkxGbEJRVTFWTEZOQlFWTk1MRmxCUVZsTkxFdEJRVm9zUTBGQmEwSXNaMEpCUVd4Q0xFTkJRV1k3UVVGRFFTeFpRVUZKUkN4TlFVRktMRVZCUVZrN1FVRkRWazRzZVVKQlFXVkJMR0ZCUVdGUkxFbEJRV0lzUTBGQmEwSmtMRmxCUVZsWkxFOUJRVThzUTBGQlVDeERRVUU1UWl4RFFVRm1PMEZCUTBRc1UwRkdSQ3hOUVVWUE8wRkJRMHhPTEhsQ1FVRmxRU3hoUVVGaFVTeEpRVUZpTEVOQlFXdENaQ3haUVVGWkxFZEJRVGxDTEVOQlFXWTdRVUZEUkR0QlFVTkVPMEZCUTBFc1dVRkJTVU1zWlVGQlpWTXNZMEZCWXl4RFFVRnFReXhGUVVGdlF6dEJRVU5zUXl4alFVRk5TeXhwUWtGQmFVSlVMR0ZCUVdGVkxGZEJRV0lzUTBGQmVVSm9RaXhUUVVGNlFpeERRVUYyUWp0QlFVTkJUU3g1UWtGRFJVRXNZVUZCWVZjc1MwRkJZaXhEUVVGdFFpeERRVUZ1UWl4RlFVRnpRa1lzWTBGQmRFSXNTMEZEUTJJc1UwRkJVMFlzVTBGQlZDeEhRVUZ4UWl4RlFVUjBRaXhKUVVWQkxFZEJSa0VzUjBGSFFVTXNWMEZJUVN4SFFVbEJTeXhoUVVGaFZ5eExRVUZpTEVOQlFXMUNSaXhwUWtGQmFVSXNRMEZCY0VNc1EwRk1SanRCUVUxRU8wRkJRMFk3UVVGRFJDeGhRVUZQVkN4WlFVRlFPMEZCUTBRN1FVRTFRbXRFTEVkQlFYUkNPMEZCUVVFc1EwRkJMMEk3TzBGQkswSkJMR1ZCUVdWSUxITkNRVUZtSWl3aVptbHNaU0k2SW1sdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKamIyNXpkQ0JrWldaaGRXeDBjeUE5SUh0Y2JpQWdjMlZ3WVhKaGRHOXlPaUFuSnl4Y2JpQWdZMjl1YW5WdVkzUnBiMjQ2SUNjbkxGeHVJQ0J6WlhKcFlXdzZJR1poYkhObExGeHVmVHRjYmx4dUx5b3FYRzRnS2lCRGIyNTJaWEowY3lCaGJpQmhjbkpoZVNCemRXSnpkR2wwZFhScGIyNGdkRzhnWVNCemRISnBibWNnWTI5dWRHRnBibWx1WnlCaElHeHBjM1JjYmlBcUlFQndZWEpoYlNBZ2UxTjBjbWx1WjMwZ1cyOXdkSE11YzJWd1lYSmhkRzl5SUQwZ0p5ZGRJQzBnZEdobElHTm9ZWEpoWTNSbGNpQjBhR0YwSUhObGNHRnlZWFJsY3lCbFlXTm9JR2wwWlcxY2JpQXFJRUJ3WVhKaGJTQWdlMU4wY21sdVozMGdXMjl3ZEhNdVkyOXVhblZ1WTNScGIyNGdQU0FuSjEwZ0lDMGdjbVZ3YkdGalpTQjBhR1VnYkdGemRDQnpaWEJoY21GMGIzSWdkMmwwYUNCMGFHbHpYRzRnS2lCQWNHRnlZVzBnSUh0Q2IyOXNaV0Z1ZlNCYmIzQjBjeTV6WlhKcFlXd2dQU0JtWVd4elpWMGdMU0JwYm1Oc2RXUmxJSFJvWlNCelpYQmhjbUYwYjNJZ1ltVm1iM0psSUhSb1pTQmpiMjVxZFc1amRHbHZiajhnS0U5NFptOXlaQ0JqYjIxdFlTQjFjMlV0WTJGelpTbGNiaUFxWEc0Z0tpQkFjbVYwZFhKdUlIdFBZbXBsWTNSOUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMU0JoSUZSbGJYQnNZWFJsVkdGbklIUnlZVzV6Wm05eWJXVnlYRzRnS2k5Y2JtTnZibk4wSUdsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSWdQU0FvYjNCMGN5QTlJR1JsWm1GMWJIUnpLU0E5UGlBb2UxeHVJQ0J2YmxOMVluTjBhWFIxZEdsdmJpaHpkV0p6ZEdsMGRYUnBiMjRzSUhKbGMzVnNkRk52Um1GeUtTQjdYRzRnSUNBZ0x5OGdiMjVzZVNCdmNHVnlZWFJsSUc5dUlHRnljbUY1YzF4dUlDQWdJR2xtSUNoQmNuSmhlUzVwYzBGeWNtRjVLSE4xWW5OMGFYUjFkR2x2YmlrcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdGeWNtRjVUR1Z1WjNSb0lEMGdjM1ZpYzNScGRIVjBhVzl1TG14bGJtZDBhRHRjYmlBZ0lDQWdJR052Ym5OMElITmxjR0Z5WVhSdmNpQTlJRzl3ZEhNdWMyVndZWEpoZEc5eU8xeHVJQ0FnSUNBZ1kyOXVjM1FnWTI5dWFuVnVZM1JwYjI0Z1BTQnZjSFJ6TG1OdmJtcDFibU4wYVc5dU8xeHVJQ0FnSUNBZ1kyOXVjM1FnYzJWeWFXRnNJRDBnYjNCMGN5NXpaWEpwWVd3N1hHNGdJQ0FnSUNBdkx5QnFiMmx1SUdWaFkyZ2dhWFJsYlNCcGJpQjBhR1VnWVhKeVlYa2dhVzUwYnlCaElITjBjbWx1WnlCM2FHVnlaU0JsWVdOb0lHbDBaVzBnYVhNZ2MyVndZWEpoZEdWa0lHSjVJSE5sY0dGeVlYUnZjbHh1SUNBZ0lDQWdMeThnWW1VZ2MzVnlaU0IwYnlCdFlXbHVkR0ZwYmlCcGJtUmxiblJoZEdsdmJseHVJQ0FnSUNBZ1kyOXVjM1FnYVc1a1pXNTBJRDBnY21WemRXeDBVMjlHWVhJdWJXRjBZMmdvTHloY1hHNC9XMTVjWEZOY1hHNWRLeWtrTHlrN1hHNGdJQ0FnSUNCcFppQW9hVzVrWlc1MEtTQjdYRzRnSUNBZ0lDQWdJSE4xWW5OMGFYUjFkR2x2YmlBOUlITjFZbk4wYVhSMWRHbHZiaTVxYjJsdUtITmxjR0Z5WVhSdmNpQXJJR2x1WkdWdWRGc3hYU2s3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0J6ZFdKemRHbDBkWFJwYjI0Z1BTQnpkV0p6ZEdsMGRYUnBiMjR1YW05cGJpaHpaWEJoY21GMGIzSWdLeUFuSUNjcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0x5OGdhV1lnWTI5dWFuVnVZM1JwYjI0Z2FYTWdjMlYwTENCeVpYQnNZV05sSUhSb1pTQnNZWE4wSUhObGNHRnlZWFJ2Y2lCM2FYUm9JR052Ym1wMWJtTjBhVzl1TENCaWRYUWdiMjVzZVNCcFppQjBhR1Z5WlNCcGN5QnRiM0psSUhSb1lXNGdiMjVsSUhOMVluTjBhWFIxZEdsdmJseHVJQ0FnSUNBZ2FXWWdLR052Ym1wMWJtTjBhVzl1SUNZbUlHRnljbUY1VEdWdVozUm9JRDRnTVNrZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCelpYQmhjbUYwYjNKSmJtUmxlQ0E5SUhOMVluTjBhWFIxZEdsdmJpNXNZWE4wU1c1a1pYaFBaaWh6WlhCaGNtRjBiM0lwTzF4dUlDQWdJQ0FnSUNCemRXSnpkR2wwZFhScGIyNGdQVnh1SUNBZ0lDQWdJQ0FnSUhOMVluTjBhWFIxZEdsdmJpNXpiR2xqWlNnd0xDQnpaWEJoY21GMGIzSkpibVJsZUNrZ0sxeHVJQ0FnSUNBZ0lDQWdJQ2h6WlhKcFlXd2dQeUJ6WlhCaGNtRjBiM0lnT2lBbkp5a2dLMXh1SUNBZ0lDQWdJQ0FnSUNjZ0p5QXJYRzRnSUNBZ0lDQWdJQ0FnWTI5dWFuVnVZM1JwYjI0Z0sxeHVJQ0FnSUNBZ0lDQWdJSE4xWW5OMGFYUjFkR2x2Ymk1emJHbGpaU2h6WlhCaGNtRjBiM0pKYm1SbGVDQXJJREVwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2MzVmljM1JwZEhWMGFXOXVPMXh1SUNCOUxGeHVmU2s3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSTdYRzRpWFgwPSIsInZhciBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyID0gZnVuY3Rpb24gc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcihzcGxpdEJ5KSB7XG4gIHJldHVybiB7XG4gICAgb25TdWJzdGl0dXRpb246IGZ1bmN0aW9uIG9uU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbiwgcmVzdWx0U29GYXIpIHtcbiAgICAgIGlmIChzcGxpdEJ5ICE9IG51bGwgJiYgdHlwZW9mIHNwbGl0QnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic3RpdHV0aW9uID09PSAnc3RyaW5nJyAmJiBzdWJzdGl0dXRpb24uaW5jbHVkZXMoc3BsaXRCeSkpIHtcbiAgICAgICAgICBzdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24uc3BsaXQoc3BsaXRCeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gc3BlY2lmeSBhIHN0cmluZyBjaGFyYWN0ZXIgdG8gc3BsaXQgYnkuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl6Y0d4cGRGTjBjbWx1WjFSeVlXNXpabTl5YldWeUwzTndiR2wwVTNSeWFXNW5WSEpoYm5ObWIzSnRaWEl1YW5NaVhTd2libUZ0WlhNaU9sc2ljM0JzYVhSVGRISnBibWRVY21GdWMyWnZjbTFsY2lJc0ltOXVVM1ZpYzNScGRIVjBhVzl1SWl3aWMzVmljM1JwZEhWMGFXOXVJaXdpY21WemRXeDBVMjlHWVhJaUxDSnpjR3hwZEVKNUlpd2lhVzVqYkhWa1pYTWlMQ0p6Y0d4cGRDSXNJa1Z5Y205eUlsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeEpRVUZOUVN4NVFrRkJlVUlzVTBGQmVrSkJMSE5DUVVGNVFqdEJRVUZCTEZOQlFWazdRVUZEZWtORExHdENRVVI1UXl3d1FrRkRNVUpETEZsQlJEQkNMRVZCUTFwRExGZEJSRmtzUlVGRFF6dEJRVU40UXl4VlFVRkpReXhYUVVGWExFbEJRVmdzU1VGQmJVSXNUMEZCVDBFc1QwRkJVQ3hMUVVGdFFpeFJRVUV4UXl4RlFVRnZSRHRCUVVOc1JDeFpRVUZKTEU5QlFVOUdMRmxCUVZBc1MwRkJkMElzVVVGQmVFSXNTVUZCYjBOQkxHRkJRV0ZITEZGQlFXSXNRMEZCYzBKRUxFOUJRWFJDTEVOQlFYaERMRVZCUVhkRk8wRkJRM1JGUml4NVFrRkJaVUVzWVVGQllVa3NTMEZCWWl4RFFVRnRRa1lzVDBGQmJrSXNRMEZCWmp0QlFVTkVPMEZCUTBZc1QwRktSQ3hOUVVsUE8wRkJRMHdzWTBGQlRTeEpRVUZKUnl4TFFVRktMRU5CUVZVc2NVUkJRVllzUTBGQlRqdEJRVU5FTzBGQlEwUXNZVUZCVDB3c1dVRkJVRHRCUVVORU8wRkJWbmRETEVkQlFWbzdRVUZCUVN4RFFVRXZRanM3UVVGaFFTeGxRVUZsUml4elFrRkJaaUlzSW1acGJHVWlPaUp6Y0d4cGRGTjBjbWx1WjFSeVlXNXpabTl5YldWeUxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpWTI5dWMzUWdjM0JzYVhSVGRISnBibWRVY21GdWMyWnZjbTFsY2lBOUlITndiR2wwUW5rZ1BUNGdLSHRjYmlBZ2IyNVRkV0p6ZEdsMGRYUnBiMjRvYzNWaWMzUnBkSFYwYVc5dUxDQnlaWE4xYkhSVGIwWmhjaWtnZTF4dUlDQWdJR2xtSUNoemNHeHBkRUo1SUNFOUlHNTFiR3dnSmlZZ2RIbHdaVzltSUhOd2JHbDBRbmtnUFQwOUlDZHpkSEpwYm1jbktTQjdYRzRnSUNBZ0lDQnBaaUFvZEhsd1pXOW1JSE4xWW5OMGFYUjFkR2x2YmlBOVBUMGdKM04wY21sdVp5Y2dKaVlnYzNWaWMzUnBkSFYwYVc5dUxtbHVZMngxWkdWektITndiR2wwUW5rcEtTQjdYRzRnSUNBZ0lDQWdJSE4xWW5OMGFYUjFkR2x2YmlBOUlITjFZbk4wYVhSMWRHbHZiaTV6Y0d4cGRDaHpjR3hwZEVKNUtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2RaYjNVZ2JtVmxaQ0IwYnlCemNHVmphV1o1SUdFZ2MzUnlhVzVuSUdOb1lYSmhZM1JsY2lCMGJ5QnpjR3hwZENCaWVTNG5LVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOMVluTjBhWFIxZEdsdmJqdGNiaUFnZlN4Y2JuMHBPMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0J6Y0d4cGRGTjBjbWx1WjFSeVlXNXpabTl5YldWeU8xeHVJbDE5IiwidmFyIGlzVmFsaWRWYWx1ZSA9IGZ1bmN0aW9uIGlzVmFsaWRWYWx1ZSh4KSB7XG4gIHJldHVybiB4ICE9IG51bGwgJiYgIU51bWJlci5pc05hTih4KSAmJiB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nO1xufTtcblxudmFyIHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgPSBmdW5jdGlvbiByZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyKCkge1xuICByZXR1cm4ge1xuICAgIG9uU3Vic3RpdHV0aW9uOiBmdW5jdGlvbiBvblN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHN1YnN0aXR1dGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbi5maWx0ZXIoaXNWYWxpZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWUoc3Vic3RpdHV0aW9uKSkge1xuICAgICAgICByZXR1cm4gc3Vic3RpdHV0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl5WlcxdmRtVk9iMjVRY21sdWRHbHVaMVpoYkhWbGMxUnlZVzV6Wm05eWJXVnlMM0psYlc5MlpVNXZibEJ5YVc1MGFXNW5WbUZzZFdWelZISmhibk5tYjNKdFpYSXVhbk1pWFN3aWJtRnRaWE1pT2xzaWFYTldZV3hwWkZaaGJIVmxJaXdpZUNJc0lrNTFiV0psY2lJc0ltbHpUbUZPSWl3aWNtVnRiM1psVG05dVVISnBiblJwYm1kV1lXeDFaWE5VY21GdWMyWnZjbTFsY2lJc0ltOXVVM1ZpYzNScGRIVjBhVzl1SWl3aWMzVmljM1JwZEhWMGFXOXVJaXdpUVhKeVlYa2lMQ0pwYzBGeWNtRjVJaXdpWm1sc2RHVnlJbDBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3hKUVVGTlFTeGxRVUZsTEZOQlFXWkJMRmxCUVdVN1FVRkJRU3hUUVVOdVFrTXNTMEZCU3l4SlFVRk1MRWxCUVdFc1EwRkJRME1zVDBGQlQwTXNTMEZCVUN4RFFVRmhSaXhEUVVGaUxFTkJRV1FzU1VGQmFVTXNUMEZCVDBFc1EwRkJVQ3hMUVVGaExGTkJSRE5DTzBGQlFVRXNRMEZCY2tJN08wRkJSMEVzU1VGQlRVY3NjVU5CUVhGRExGTkJRWEpEUVN4clEwRkJjVU03UVVGQlFTeFRRVUZQTzBGQlEyaEVReXhyUWtGRVowUXNNRUpCUTJwRFF5eFpRVVJwUXl4RlFVTnVRanRCUVVNelFpeFZRVUZKUXl4TlFVRk5ReXhQUVVGT0xFTkJRV05HTEZsQlFXUXNRMEZCU2l4RlFVRnBRenRCUVVNdlFpeGxRVUZQUVN4aFFVRmhSeXhOUVVGaUxFTkJRVzlDVkN4WlFVRndRaXhEUVVGUU8wRkJRMFE3UVVGRFJDeFZRVUZKUVN4aFFVRmhUU3haUVVGaUxFTkJRVW9zUlVGQlowTTdRVUZET1VJc1pVRkJUMEVzV1VGQlVEdEJRVU5FTzBGQlEwUXNZVUZCVHl4RlFVRlFPMEZCUTBRN1FVRlVLME1zUjBGQlVEdEJRVUZCTEVOQlFUTkRPenRCUVZsQkxHVkJRV1ZHTEd0RFFVRm1JaXdpWm1sc1pTSTZJbkpsYlc5MlpVNXZibEJ5YVc1MGFXNW5WbUZzZFdWelZISmhibk5tYjNKdFpYSXVhbk1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKamIyNXpkQ0JwYzFaaGJHbGtWbUZzZFdVZ1BTQjRJRDArWEc0Z0lIZ2dJVDBnYm5Wc2JDQW1KaUFoVG5WdFltVnlMbWx6VG1GT0tIZ3BJQ1ltSUhSNWNHVnZaaUI0SUNFOVBTQW5ZbTl2YkdWaGJpYzdYRzVjYm1OdmJuTjBJSEpsYlc5MlpVNXZibEJ5YVc1MGFXNW5WbUZzZFdWelZISmhibk5tYjNKdFpYSWdQU0FvS1NBOVBpQW9lMXh1SUNCdmJsTjFZbk4wYVhSMWRHbHZiaWh6ZFdKemRHbDBkWFJwYjI0cElIdGNiaUFnSUNCcFppQW9RWEp5WVhrdWFYTkJjbkpoZVNoemRXSnpkR2wwZFhScGIyNHBLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdjM1ZpYzNScGRIVjBhVzl1TG1acGJIUmxjaWhwYzFaaGJHbGtWbUZzZFdVcE8xeHVJQ0FnSUgxY2JpQWdJQ0JwWmlBb2FYTldZV3hwWkZaaGJIVmxLSE4xWW5OMGFYUjFkR2x2YmlrcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCemRXSnpkR2wwZFhScGIyNDdYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUFuSnp0Y2JpQWdmU3hjYm4wcE8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQnlaVzF2ZG1WT2IyNVFjbWx1ZEdsdVoxWmhiSFZsYzFSeVlXNXpabTl5YldWeU8xeHVJbDE5IiwiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbnZhciBjb21tYUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSwgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciwgdHJpbVJlc3VsdFRyYW5zZm9ybWVyKTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFMaXN0cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OWpiMjF0WVV4cGMzUnpMMk52YlcxaFRHbHpkSE11YW5NaVhTd2libUZ0WlhNaU9sc2lWR1Z0Y0d4aGRHVlVZV2NpTENKemRISnBjRWx1WkdWdWRGUnlZVzV6Wm05eWJXVnlJaXdpYVc1c2FXNWxRWEp5WVhsVWNtRnVjMlp2Y20xbGNpSXNJblJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lJc0ltTnZiVzFoVEdsemRITWlMQ0p6WlhCaGNtRjBiM0lpWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEU5QlFVOUJMRmRCUVZBc1RVRkJkMElzWjBKQlFYaENPMEZCUTBFc1QwRkJUME1zYzBKQlFWQXNUVUZCYlVNc01rSkJRVzVETzBGQlEwRXNUMEZCVDBNc2MwSkJRVkFzVFVGQmJVTXNNa0pCUVc1RE8wRkJRMEVzVDBGQlQwTXNjVUpCUVZBc1RVRkJhME1zTUVKQlFXeERPenRCUVVWQkxFbEJRVTFETEdGQlFXRXNTVUZCU1Vvc1YwRkJTaXhEUVVOcVFrVXNkVUpCUVhWQ0xFVkJRVVZITEZkQlFWY3NSMEZCWWl4RlFVRjJRaXhEUVVScFFpeEZRVVZxUWtvc2MwSkJSbWxDTEVWQlIycENSU3h4UWtGSWFVSXNRMEZCYmtJN08wRkJUVUVzWlVGQlpVTXNWVUZCWmlJc0ltWnBiR1VpT2lKamIyMXRZVXhwYzNSekxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJRlJsYlhCc1lYUmxWR0ZuSUdaeWIyMGdKeTR1TDFSbGJYQnNZWFJsVkdGbkp6dGNibWx0Y0c5eWRDQnpkSEpwY0VsdVpHVnVkRlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDNOMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSW5PMXh1YVcxd2IzSjBJR2x1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJZ1puSnZiU0FuTGk0dmFXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaWM3WEc1cGJYQnZjblFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwzUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaWM3WEc1Y2JtTnZibk4wSUdOdmJXMWhUR2x6ZEhNZ1BTQnVaWGNnVkdWdGNHeGhkR1ZVWVdjb1hHNGdJR2x1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJb2V5QnpaWEJoY21GMGIzSTZJQ2NzSnlCOUtTeGNiaUFnYzNSeWFYQkpibVJsYm5SVWNtRnVjMlp2Y20xbGNpeGNiaUFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxGeHVLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTI5dGJXRk1hWE4wY3p0Y2JpSmRmUT09IiwiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbnZhciBjb21tYUxpc3RzQW5kID0gbmV3IFRlbXBsYXRlVGFnKGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJywgY29uanVuY3Rpb246ICdhbmQnIH0pLCBzdHJpcEluZGVudFRyYW5zZm9ybWVyLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYUxpc3RzQW5kO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5amIyMXRZVXhwYzNSelFXNWtMMk52YlcxaFRHbHpkSE5CYm1RdWFuTWlYU3dpYm1GdFpYTWlPbHNpVkdWdGNHeGhkR1ZVWVdjaUxDSnpkSEpwY0VsdVpHVnVkRlJ5WVc1elptOXliV1Z5SWl3aWFXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaUlzSW5SeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbU52YlcxaFRHbHpkSE5CYm1RaUxDSnpaWEJoY21GMGIzSWlMQ0pqYjI1cWRXNWpkR2x2YmlKZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1QwRkJUMEVzVjBGQlVDeE5RVUYzUWl4blFrRkJlRUk3UVVGRFFTeFBRVUZQUXl4elFrRkJVQ3hOUVVGdFF5d3lRa0ZCYmtNN1FVRkRRU3hQUVVGUFF5eHpRa0ZCVUN4TlFVRnRReXd5UWtGQmJrTTdRVUZEUVN4UFFVRlBReXh4UWtGQlVDeE5RVUZyUXl3d1FrRkJiRU03TzBGQlJVRXNTVUZCVFVNc1owSkJRV2RDTEVsQlFVbEtMRmRCUVVvc1EwRkRjRUpGTEhWQ1FVRjFRaXhGUVVGRlJ5eFhRVUZYTEVkQlFXSXNSVUZCYTBKRExHRkJRV0VzUzBGQkwwSXNSVUZCZGtJc1EwRkViMElzUlVGRmNFSk1MSE5DUVVadlFpeEZRVWR3UWtVc2NVSkJTRzlDTEVOQlFYUkNPenRCUVUxQkxHVkJRV1ZETEdGQlFXWWlMQ0ptYVd4bElqb2lZMjl0YldGTWFYTjBjMEZ1WkM1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQlVaVzF3YkdGMFpWUmhaeUJtY205dElDY3VMaTlVWlcxd2JHRjBaVlJoWnljN1hHNXBiWEJ2Y25RZ2MzUnlhWEJKYm1SbGJuUlVjbUZ1YzJadmNtMWxjaUJtY205dElDY3VMaTl6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUp6dGNibWx0Y0c5eWRDQnBibXhwYm1WQmNuSmhlVlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDJsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSW5PMXh1YVcxd2IzSjBJSFJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TGk5MGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSW5PMXh1WEc1amIyNXpkQ0JqYjIxdFlVeHBjM1J6UVc1a0lEMGdibVYzSUZSbGJYQnNZWFJsVkdGbktGeHVJQ0JwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUtIc2djMlZ3WVhKaGRHOXlPaUFuTENjc0lHTnZibXAxYm1OMGFXOXVPaUFuWVc1a0p5QjlLU3hjYmlBZ2MzUnlhWEJKYm1SbGJuUlVjbUZ1YzJadmNtMWxjaXhjYmlBZ2RISnBiVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlMRnh1S1R0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kyOXRiV0ZNYVhOMGMwRnVaRHRjYmlKZGZRPT0iLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXIgZnJvbSAnLi4vc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxudmFyIGNvbW1hTGlzdHNPciA9IG5ldyBUZW1wbGF0ZVRhZyhpbmxpbmVBcnJheVRyYW5zZm9ybWVyKHsgc2VwYXJhdG9yOiAnLCcsIGNvbmp1bmN0aW9uOiAnb3InIH0pLCBzdHJpcEluZGVudFRyYW5zZm9ybWVyLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBjb21tYUxpc3RzT3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlqYjIxdFlVeHBjM1J6VDNJdlkyOXRiV0ZNYVhOMGMwOXlMbXB6SWwwc0ltNWhiV1Z6SWpwYklsUmxiWEJzWVhSbFZHRm5JaXdpYzNSeWFYQkpibVJsYm5SVWNtRnVjMlp2Y20xbGNpSXNJbWx1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJaUxDSjBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWElpTENKamIyMXRZVXhwYzNSelQzSWlMQ0p6WlhCaGNtRjBiM0lpTENKamIyNXFkVzVqZEdsdmJpSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNUMEZCVDBFc1YwRkJVQ3hOUVVGM1FpeG5Ra0ZCZUVJN1FVRkRRU3hQUVVGUFF5eHpRa0ZCVUN4TlFVRnRReXd5UWtGQmJrTTdRVUZEUVN4UFFVRlBReXh6UWtGQlVDeE5RVUZ0UXl3eVFrRkJia003UVVGRFFTeFBRVUZQUXl4eFFrRkJVQ3hOUVVGclF5d3dRa0ZCYkVNN08wRkJSVUVzU1VGQlRVTXNaVUZCWlN4SlFVRkpTaXhYUVVGS0xFTkJRMjVDUlN4MVFrRkJkVUlzUlVGQlJVY3NWMEZCVnl4SFFVRmlMRVZCUVd0Q1F5eGhRVUZoTEVsQlFTOUNMRVZCUVhaQ0xFTkJSRzFDTEVWQlJXNUNUQ3h6UWtGR2JVSXNSVUZIYmtKRkxIRkNRVWh0UWl4RFFVRnlRanM3UVVGTlFTeGxRVUZsUXl4WlFVRm1JaXdpWm1sc1pTSTZJbU52YlcxaFRHbHpkSE5QY2k1cWN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQlVaVzF3YkdGMFpWUmhaeUJtY205dElDY3VMaTlVWlcxd2JHRjBaVlJoWnljN1hHNXBiWEJ2Y25RZ2MzUnlhWEJKYm1SbGJuUlVjbUZ1YzJadmNtMWxjaUJtY205dElDY3VMaTl6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUp6dGNibWx0Y0c5eWRDQnBibXhwYm1WQmNuSmhlVlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDJsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSW5PMXh1YVcxd2IzSjBJSFJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TGk5MGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSW5PMXh1WEc1amIyNXpkQ0JqYjIxdFlVeHBjM1J6VDNJZ1BTQnVaWGNnVkdWdGNHeGhkR1ZVWVdjb1hHNGdJR2x1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJb2V5QnpaWEJoY21GMGIzSTZJQ2NzSnl3Z1kyOXVhblZ1WTNScGIyNDZJQ2R2Y2ljZ2ZTa3NYRzRnSUhOMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSXNYRzRnSUhSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpeGNiaWs3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOdmJXMWhUR2x6ZEhOUGNqdGNiaUpkZlE9PSIsImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuLi9zdHJpcEluZGVudFRyYW5zZm9ybWVyJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi4vc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciBmcm9tICcuLi9yZW1vdmVOb25QcmludGluZ1ZhbHVlc1RyYW5zZm9ybWVyJztcblxudmFyIGh0bWwgPSBuZXcgVGVtcGxhdGVUYWcoc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcignXFxuJyksIHJlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIsIGlubGluZUFycmF5VHJhbnNmb3JtZXIsIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcik7XG5cbmV4cG9ydCBkZWZhdWx0IGh0bWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTlvZEcxc0wyaDBiV3d1YW5NaVhTd2libUZ0WlhNaU9sc2lWR1Z0Y0d4aGRHVlVZV2NpTENKemRISnBjRWx1WkdWdWRGUnlZVzV6Wm05eWJXVnlJaXdpYVc1c2FXNWxRWEp5WVhsVWNtRnVjMlp2Y20xbGNpSXNJblJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lJc0luTndiR2wwVTNSeWFXNW5WSEpoYm5ObWIzSnRaWElpTENKeVpXMXZkbVZPYjI1UWNtbHVkR2x1WjFaaGJIVmxjMVJ5WVc1elptOXliV1Z5SWl3aWFIUnRiQ0pkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlQwRXNWMEZCVUN4TlFVRjNRaXhuUWtGQmVFSTdRVUZEUVN4UFFVRlBReXh6UWtGQlVDeE5RVUZ0UXl3eVFrRkJia003UVVGRFFTeFBRVUZQUXl4elFrRkJVQ3hOUVVGdFF5d3lRa0ZCYmtNN1FVRkRRU3hQUVVGUFF5eHhRa0ZCVUN4TlFVRnJReXd3UWtGQmJFTTdRVUZEUVN4UFFVRlBReXh6UWtGQlVDeE5RVUZ0UXl3eVFrRkJia003UVVGRFFTeFBRVUZQUXl4clEwRkJVQ3hOUVVFclF5eDFRMEZCTDBNN08wRkJSVUVzU1VGQlRVTXNUMEZCVHl4SlFVRkpUaXhYUVVGS0xFTkJRMWhKTEhWQ1FVRjFRaXhKUVVGMlFpeERRVVJYTEVWQlJWaERMR3REUVVaWExFVkJSMWhJTEhOQ1FVaFhMRVZCU1ZoRUxITkNRVXBYTEVWQlMxaEZMSEZDUVV4WExFTkJRV0k3TzBGQlVVRXNaVUZCWlVjc1NVRkJaaUlzSW1acGJHVWlPaUpvZEcxc0xtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJRlJsYlhCc1lYUmxWR0ZuSUdaeWIyMGdKeTR1TDFSbGJYQnNZWFJsVkdGbkp6dGNibWx0Y0c5eWRDQnpkSEpwY0VsdVpHVnVkRlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDNOMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSW5PMXh1YVcxd2IzSjBJR2x1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJZ1puSnZiU0FuTGk0dmFXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaWM3WEc1cGJYQnZjblFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwzUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaWM3WEc1cGJYQnZjblFnYzNCc2FYUlRkSEpwYm1kVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOXpjR3hwZEZOMGNtbHVaMVJ5WVc1elptOXliV1Z5Snp0Y2JtbHRjRzl5ZENCeVpXMXZkbVZPYjI1UWNtbHVkR2x1WjFaaGJIVmxjMVJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDNKbGJXOTJaVTV2YmxCeWFXNTBhVzVuVm1Gc2RXVnpWSEpoYm5ObWIzSnRaWEluTzF4dVhHNWpiMjV6ZENCb2RHMXNJRDBnYm1WM0lGUmxiWEJzWVhSbFZHRm5LRnh1SUNCemNHeHBkRk4wY21sdVoxUnlZVzV6Wm05eWJXVnlLQ2RjWEc0bktTeGNiaUFnY21WdGIzWmxUbTl1VUhKcGJuUnBibWRXWVd4MVpYTlVjbUZ1YzJadmNtMWxjaXhjYmlBZ2FXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaXhjYmlBZ2MzUnlhWEJKYm1SbGJuUlVjbUZ1YzJadmNtMWxjaXhjYmlBZ2RISnBiVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlMRnh1S1R0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ2FIUnRiRHRjYmlKZGZRPT0iLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXIgZnJvbSAnLi4vc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCBzcGxpdFN0cmluZ1RyYW5zZm9ybWVyIGZyb20gJy4uL3NwbGl0U3RyaW5nVHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXInO1xuXG52YXIgc2FmZUh0bWwgPSBuZXcgVGVtcGxhdGVUYWcoc3BsaXRTdHJpbmdUcmFuc2Zvcm1lcignXFxuJyksIGlubGluZUFycmF5VHJhbnNmb3JtZXIsIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsIHRyaW1SZXN1bHRUcmFuc2Zvcm1lciwgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC8mL2csICcmYW1wOycpLCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLzwvZywgJyZsdDsnKSwgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyKC8+L2csICcmZ3Q7JyksIHJlcGxhY2VTdWJzdGl0dXRpb25UcmFuc2Zvcm1lcigvXCIvZywgJyZxdW90OycpLCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoLycvZywgJyYjeDI3OycpLCByZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIoL2AvZywgJyYjeDYwOycpKTtcblxuZXhwb3J0IGRlZmF1bHQgc2FmZUh0bWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl6WVdabFNIUnRiQzl6WVdabFNIUnRiQzVxY3lKZExDSnVZVzFsY3lJNld5SlVaVzF3YkdGMFpWUmhaeUlzSW5OMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSWlMQ0pwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUlpd2lkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SWl3aWMzQnNhWFJUZEhKcGJtZFVjbUZ1YzJadmNtMWxjaUlzSW5KbGNHeGhZMlZUZFdKemRHbDBkWFJwYjI1VWNtRnVjMlp2Y20xbGNpSXNJbk5oWm1WSWRHMXNJbDBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3hQUVVGUFFTeFhRVUZRTEUxQlFYZENMR2RDUVVGNFFqdEJRVU5CTEU5QlFVOURMSE5DUVVGUUxFMUJRVzFETERKQ1FVRnVRenRCUVVOQkxFOUJRVTlETEhOQ1FVRlFMRTFCUVcxRExESkNRVUZ1UXp0QlFVTkJMRTlCUVU5RExIRkNRVUZRTEUxQlFXdERMREJDUVVGc1F6dEJRVU5CTEU5QlFVOURMSE5DUVVGUUxFMUJRVzFETERKQ1FVRnVRenRCUVVOQkxFOUJRVTlETERoQ1FVRlFMRTFCUVRKRExHMURRVUV6UXpzN1FVRkZRU3hKUVVGTlF5eFhRVUZYTEVsQlFVbE9MRmRCUVVvc1EwRkRaa2tzZFVKQlFYVkNMRWxCUVhaQ0xFTkJSR1VzUlVGRlprWXNjMEpCUm1Vc1JVRkhaa1FzYzBKQlNHVXNSVUZKWmtVc2NVSkJTbVVzUlVGTFprVXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRTlCUVhKRExFTkJUR1VzUlVGTlprRXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRTFCUVhKRExFTkJUbVVzUlVGUFprRXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRTFCUVhKRExFTkJVR1VzUlVGUlprRXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRkZCUVhKRExFTkJVbVVzUlVGVFprRXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRkZCUVhKRExFTkJWR1VzUlVGVlprRXNLMEpCUVN0Q0xFbEJRUzlDTEVWQlFYRkRMRkZCUVhKRExFTkJWbVVzUTBGQmFrSTdPMEZCWVVFc1pVRkJaVU1zVVVGQlppSXNJbVpwYkdVaU9pSnpZV1psU0hSdGJDNXFjeUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1sdGNHOXlkQ0JVWlcxd2JHRjBaVlJoWnlCbWNtOXRJQ2N1TGk5VVpXMXdiR0YwWlZSaFp5YzdYRzVwYlhCdmNuUWdjM1J5YVhCSmJtUmxiblJVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TGk5emRISnBjRWx1WkdWdWRGUnlZVzV6Wm05eWJXVnlKenRjYm1sdGNHOXlkQ0JwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwybHViR2x1WlVGeWNtRjVWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUhSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOTBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUhOd2JHbDBVM1J5YVc1blZISmhibk5tYjNKdFpYSWdabkp2YlNBbkxpNHZjM0JzYVhSVGRISnBibWRVY21GdWMyWnZjbTFsY2ljN1hHNXBiWEJ2Y25RZ2NtVndiR0ZqWlZOMVluTjBhWFIxZEdsdmJsUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHVMM0psY0d4aFkyVlRkV0p6ZEdsMGRYUnBiMjVVY21GdWMyWnZjbTFsY2ljN1hHNWNibU52Ym5OMElITmhabVZJZEcxc0lEMGdibVYzSUZSbGJYQnNZWFJsVkdGbktGeHVJQ0J6Y0d4cGRGTjBjbWx1WjFSeVlXNXpabTl5YldWeUtDZGNYRzRuS1N4Y2JpQWdhVzVzYVc1bFFYSnlZWGxVY21GdWMyWnZjbTFsY2l4Y2JpQWdjM1J5YVhCSmJtUmxiblJVY21GdWMyWnZjbTFsY2l4Y2JpQWdkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5TEZ4dUlDQnlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWElvTHlZdlp5d2dKeVpoYlhBN0p5a3NYRzRnSUhKbGNHeGhZMlZUZFdKemRHbDBkWFJwYjI1VWNtRnVjMlp2Y20xbGNpZ3ZQQzluTENBbkpteDBPeWNwTEZ4dUlDQnlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWElvTHo0dlp5d2dKeVpuZERzbktTeGNiaUFnY21Wd2JHRmpaVk4xWW5OMGFYUjFkR2x2YmxSeVlXNXpabTl5YldWeUtDOWNJaTluTENBbkpuRjFiM1E3Snlrc1hHNGdJSEpsY0d4aFkyVlRkV0p6ZEdsMGRYUnBiMjVVY21GdWMyWnZjbTFsY2lndkp5OW5MQ0FuSmlONE1qYzdKeWtzWEc0Z0lISmxjR3hoWTJWVGRXSnpkR2wwZFhScGIyNVVjbUZ1YzJadmNtMWxjaWd2WUM5bkxDQW5KaU40TmpBN0p5a3NYRzRwTzF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCellXWmxTSFJ0YkR0Y2JpSmRmUT09IiwiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxudmFyIG9uZUxpbmUgPSBuZXcgVGVtcGxhdGVUYWcocmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG4oPzpcXHMqKSkrL2csICcgJyksIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl2Ym1WTWFXNWxMMjl1WlV4cGJtVXVhbk1pWFN3aWJtRnRaWE1pT2xzaVZHVnRjR3hoZEdWVVlXY2lMQ0owY21sdFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJaUxDSnlaWEJzWVdObFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJaUxDSnZibVZNYVc1bElsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQUVN4WFFVRlFMRTFCUVhkQ0xHZENRVUY0UWp0QlFVTkJMRTlCUVU5RExIRkNRVUZRTEUxQlFXdERMREJDUVVGc1F6dEJRVU5CTEU5QlFVOURMSGRDUVVGUUxFMUJRWEZETERaQ1FVRnlRenM3UVVGRlFTeEpRVUZOUXl4VlFVRlZMRWxCUVVsSUxGZEJRVW9zUTBGRFpFVXNlVUpCUVhsQ0xHbENRVUY2UWl4RlFVRTBReXhIUVVFMVF5eERRVVJqTEVWQlJXUkVMSEZDUVVaakxFTkJRV2hDT3p0QlFVdEJMR1ZCUVdWRkxFOUJRV1lpTENKbWFXeGxJam9pYjI1bFRHbHVaUzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCVVpXMXdiR0YwWlZSaFp5Qm1jbTl0SUNjdUxpOVVaVzF3YkdGMFpWUmhaeWM3WEc1cGJYQnZjblFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwzUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaWM3WEc1cGJYQnZjblFnY21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHVMM0psY0d4aFkyVlNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpYzdYRzVjYm1OdmJuTjBJRzl1WlV4cGJtVWdQU0J1WlhjZ1ZHVnRjR3hoZEdWVVlXY29YRzRnSUhKbGNHeGhZMlZTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaWd2S0Q4NlhGeHVLRDg2WEZ4ektpa3BLeTluTENBbklDY3BMRnh1SUNCMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSXNYRzRwTzF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCdmJtVk1hVzVsTzF4dUlsMTkiLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG52YXIgb25lTGluZVRyaW0gPSBuZXcgVGVtcGxhdGVUYWcocmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXG5cXHMqKS9nLCAnJyksIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcik7XG5cbmV4cG9ydCBkZWZhdWx0IG9uZUxpbmVUcmltO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5dmJtVk1hVzVsVkhKcGJTOXZibVZNYVc1bFZISnBiUzVxY3lKZExDSnVZVzFsY3lJNld5SlVaVzF3YkdGMFpWUmhaeUlzSW5SeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbkpsY0d4aFkyVlNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbTl1WlV4cGJtVlVjbWx0SWwwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBRU3hYUVVGUUxFMUJRWGRDTEdkQ1FVRjRRanRCUVVOQkxFOUJRVTlETEhGQ1FVRlFMRTFCUVd0RExEQkNRVUZzUXp0QlFVTkJMRTlCUVU5RExIZENRVUZRTEUxQlFYRkRMRFpDUVVGeVF6czdRVUZGUVN4SlFVRk5ReXhqUVVGakxFbEJRVWxJTEZkQlFVb3NRMEZEYkVKRkxIbENRVUY1UWl4WlFVRjZRaXhGUVVGMVF5eEZRVUYyUXl4RFFVUnJRaXhGUVVWc1FrUXNjVUpCUm10Q0xFTkJRWEJDT3p0QlFVdEJMR1ZCUVdWRkxGZEJRV1lpTENKbWFXeGxJam9pYjI1bFRHbHVaVlJ5YVcwdWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUpwYlhCdmNuUWdWR1Z0Y0d4aGRHVlVZV2NnWm5KdmJTQW5MaTR2VkdWdGNHeGhkR1ZVWVdjbk8xeHVhVzF3YjNKMElIUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaUJtY205dElDY3VMaTkwY21sdFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJbk8xeHVhVzF3YjNKMElISmxjR3hoWTJWU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TGk5eVpYQnNZV05sVW1WemRXeDBWSEpoYm5ObWIzSnRaWEluTzF4dVhHNWpiMjV6ZENCdmJtVk1hVzVsVkhKcGJTQTlJRzVsZHlCVVpXMXdiR0YwWlZSaFp5aGNiaUFnY21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlLQzhvUHpwY1hHNWNYSE1xS1M5bkxDQW5KeWtzWEc0Z0lIUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaXhjYmlrN1hHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHOXVaVXhwYm1WVWNtbHRPMXh1SWwxOSIsImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxudmFyIG9uZUxpbmVDb21tYUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKGlubGluZUFycmF5VHJhbnNmb3JtZXIoeyBzZXBhcmF0b3I6ICcsJyB9KSwgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXZibVZNYVc1bFEyOXRiV0ZNYVhOMGN5OXZibVZNYVc1bFEyOXRiV0ZNYVhOMGN5NXFjeUpkTENKdVlXMWxjeUk2V3lKVVpXMXdiR0YwWlZSaFp5SXNJbWx1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJaUxDSjBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWElpTENKeVpYQnNZV05sVW1WemRXeDBWSEpoYm5ObWIzSnRaWElpTENKdmJtVk1hVzVsUTI5dGJXRk1hWE4wY3lJc0luTmxjR0Z5WVhSdmNpSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNUMEZCVDBFc1YwRkJVQ3hOUVVGM1FpeG5Ra0ZCZUVJN1FVRkRRU3hQUVVGUFF5eHpRa0ZCVUN4TlFVRnRReXd5UWtGQmJrTTdRVUZEUVN4UFFVRlBReXh4UWtGQlVDeE5RVUZyUXl3d1FrRkJiRU03UVVGRFFTeFBRVUZQUXl4M1FrRkJVQ3hOUVVGeFF5dzJRa0ZCY2tNN08wRkJSVUVzU1VGQlRVTXNiMEpCUVc5Q0xFbEJRVWxLTEZkQlFVb3NRMEZEZUVKRExIVkNRVUYxUWl4RlFVRkZTU3hYUVVGWExFZEJRV0lzUlVGQmRrSXNRMEZFZDBJc1JVRkZlRUpHTEhsQ1FVRjVRaXhWUVVGNlFpeEZRVUZ4UXl4SFFVRnlReXhEUVVaM1FpeEZRVWQ0UWtRc2NVSkJTSGRDTEVOQlFURkNPenRCUVUxQkxHVkJRV1ZGTEdsQ1FVRm1JaXdpWm1sc1pTSTZJbTl1WlV4cGJtVkRiMjF0WVV4cGMzUnpMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUZSbGJYQnNZWFJsVkdGbklHWnliMjBnSnk0dUwxUmxiWEJzWVhSbFZHRm5KenRjYm1sdGNHOXlkQ0JwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwybHViR2x1WlVGeWNtRjVWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUhSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOTBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUhKbGNHeGhZMlZTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaUJtY205dElDY3VMaTl5WlhCc1lXTmxVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSW5PMXh1WEc1amIyNXpkQ0J2Ym1WTWFXNWxRMjl0YldGTWFYTjBjeUE5SUc1bGR5QlVaVzF3YkdGMFpWUmhaeWhjYmlBZ2FXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaWg3SUhObGNHRnlZWFJ2Y2pvZ0p5d25JSDBwTEZ4dUlDQnlaWEJzWVdObFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJb0x5Zy9PbHhjY3lzcEwyY3NJQ2NnSnlrc1hHNGdJSFJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2l4Y2JpazdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJRzl1WlV4cGJtVkRiMjF0WVV4cGMzUnpPMXh1SWwxOSIsImltcG9ydCBUZW1wbGF0ZVRhZyBmcm9tICcuLi9UZW1wbGF0ZVRhZyc7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcbmltcG9ydCByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyJztcblxudmFyIG9uZUxpbmVDb21tYUxpc3RzT3IgPSBuZXcgVGVtcGxhdGVUYWcoaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ29yJyB9KSwgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lQ29tbWFMaXN0c09yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5dmJtVk1hVzVsUTI5dGJXRk1hWE4wYzA5eUwyOXVaVXhwYm1WRGIyMXRZVXhwYzNSelQzSXVhbk1pWFN3aWJtRnRaWE1pT2xzaVZHVnRjR3hoZEdWVVlXY2lMQ0pwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUlpd2lkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SWl3aWNtVndiR0ZqWlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SWl3aWIyNWxUR2x1WlVOdmJXMWhUR2x6ZEhOUGNpSXNJbk5sY0dGeVlYUnZjaUlzSW1OdmJtcDFibU4wYVc5dUlsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQUVN4WFFVRlFMRTFCUVhkQ0xHZENRVUY0UWp0QlFVTkJMRTlCUVU5RExITkNRVUZRTEUxQlFXMURMREpDUVVGdVF6dEJRVU5CTEU5QlFVOURMSEZDUVVGUUxFMUJRV3RETERCQ1FVRnNRenRCUVVOQkxFOUJRVTlETEhkQ1FVRlFMRTFCUVhGRExEWkNRVUZ5UXpzN1FVRkZRU3hKUVVGTlF5eHpRa0ZCYzBJc1NVRkJTVW9zVjBGQlNpeERRVU14UWtNc2RVSkJRWFZDTEVWQlFVVkpMRmRCUVZjc1IwRkJZaXhGUVVGclFrTXNZVUZCWVN4SlFVRXZRaXhGUVVGMlFpeERRVVF3UWl4RlFVVXhRa2dzZVVKQlFYbENMRlZCUVhwQ0xFVkJRWEZETEVkQlFYSkRMRU5CUmpCQ0xFVkJSekZDUkN4eFFrRklNRUlzUTBGQk5VSTdPMEZCVFVFc1pVRkJaVVVzYlVKQlFXWWlMQ0ptYVd4bElqb2liMjVsVEdsdVpVTnZiVzFoVEdsemRITlBjaTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCVVpXMXdiR0YwWlZSaFp5Qm1jbTl0SUNjdUxpOVVaVzF3YkdGMFpWUmhaeWM3WEc1cGJYQnZjblFnYVc1c2FXNWxRWEp5WVhsVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOXBibXhwYm1WQmNuSmhlVlJ5WVc1elptOXliV1Z5Snp0Y2JtbHRjRzl5ZENCMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSWdabkp2YlNBbkxpNHZkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5Snp0Y2JtbHRjRzl5ZENCeVpYQnNZV05sVW1WemRXeDBWSEpoYm5ObWIzSnRaWElnWm5KdmJTQW5MaTR2Y21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlKenRjYmx4dVkyOXVjM1FnYjI1bFRHbHVaVU52YlcxaFRHbHpkSE5QY2lBOUlHNWxkeUJVWlcxd2JHRjBaVlJoWnloY2JpQWdhVzVzYVc1bFFYSnlZWGxVY21GdWMyWnZjbTFsY2loN0lITmxjR0Z5WVhSdmNqb2dKeXduTENCamIyNXFkVzVqZEdsdmJqb2dKMjl5SnlCOUtTeGNiaUFnY21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlLQzhvUHpwY1hITXJLUzluTENBbklDY3BMRnh1SUNCMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSXNYRzRwTzF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCdmJtVk1hVzVsUTI5dGJXRk1hWE4wYzA5eU8xeHVJbDE5IiwiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4uL2lubGluZUFycmF5VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuaW1wb3J0IHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuXG52YXIgb25lTGluZUNvbW1hTGlzdHNBbmQgPSBuZXcgVGVtcGxhdGVUYWcoaW5saW5lQXJyYXlUcmFuc2Zvcm1lcih7IHNlcGFyYXRvcjogJywnLCBjb25qdW5jdGlvbjogJ2FuZCcgfSksIHJlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcigvKD86XFxzKykvZywgJyAnKSwgdHJpbVJlc3VsdFRyYW5zZm9ybWVyKTtcblxuZXhwb3J0IGRlZmF1bHQgb25lTGluZUNvbW1hTGlzdHNBbmQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl2Ym1WTWFXNWxRMjl0YldGTWFYTjBjMEZ1WkM5dmJtVk1hVzVsUTI5dGJXRk1hWE4wYzBGdVpDNXFjeUpkTENKdVlXMWxjeUk2V3lKVVpXMXdiR0YwWlZSaFp5SXNJbWx1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJaUxDSjBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWElpTENKeVpYQnNZV05sVW1WemRXeDBWSEpoYm5ObWIzSnRaWElpTENKdmJtVk1hVzVsUTI5dGJXRk1hWE4wYzBGdVpDSXNJbk5sY0dGeVlYUnZjaUlzSW1OdmJtcDFibU4wYVc5dUlsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQUVN4WFFVRlFMRTFCUVhkQ0xHZENRVUY0UWp0QlFVTkJMRTlCUVU5RExITkNRVUZRTEUxQlFXMURMREpDUVVGdVF6dEJRVU5CTEU5QlFVOURMSEZDUVVGUUxFMUJRV3RETERCQ1FVRnNRenRCUVVOQkxFOUJRVTlETEhkQ1FVRlFMRTFCUVhGRExEWkNRVUZ5UXpzN1FVRkZRU3hKUVVGTlF5eDFRa0ZCZFVJc1NVRkJTVW9zVjBGQlNpeERRVU16UWtNc2RVSkJRWFZDTEVWQlFVVkpMRmRCUVZjc1IwRkJZaXhGUVVGclFrTXNZVUZCWVN4TFFVRXZRaXhGUVVGMlFpeERRVVF5UWl4RlFVVXpRa2dzZVVKQlFYbENMRlZCUVhwQ0xFVkJRWEZETEVkQlFYSkRMRU5CUmpKQ0xFVkJSek5DUkN4eFFrRklNa0lzUTBGQk4wSTdPMEZCVFVFc1pVRkJaVVVzYjBKQlFXWWlMQ0ptYVd4bElqb2liMjVsVEdsdVpVTnZiVzFoVEdsemRITkJibVF1YW5NaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ1ZHVnRjR3hoZEdWVVlXY2dabkp2YlNBbkxpNHZWR1Z0Y0d4aGRHVlVZV2NuTzF4dWFXMXdiM0owSUdsdWJHbHVaVUZ5Y21GNVZISmhibk5tYjNKdFpYSWdabkp2YlNBbkxpNHZhVzVzYVc1bFFYSnlZWGxVY21GdWMyWnZjbTFsY2ljN1hHNXBiWEJ2Y25RZ2RISnBiVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHVMM1J5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2ljN1hHNXBiWEJ2Y25RZ2NtVndiR0ZqWlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDNKbGNHeGhZMlZTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaWM3WEc1Y2JtTnZibk4wSUc5dVpVeHBibVZEYjIxdFlVeHBjM1J6UVc1a0lEMGdibVYzSUZSbGJYQnNZWFJsVkdGbktGeHVJQ0JwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUtIc2djMlZ3WVhKaGRHOXlPaUFuTENjc0lHTnZibXAxYm1OMGFXOXVPaUFuWVc1a0p5QjlLU3hjYmlBZ2NtVndiR0ZqWlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5S0M4b1B6cGNYSE1yS1M5bkxDQW5JQ2NwTEZ4dUlDQjBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWElzWEc0cE8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQnZibVZNYVc1bFEyOXRiV0ZNYVhOMGMwRnVaRHRjYmlKZGZRPT0iLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXIgZnJvbSAnLi4vc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBmcm9tICcuLi9pbmxpbmVBcnJheVRyYW5zZm9ybWVyJztcbmltcG9ydCB0cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi4vdHJpbVJlc3VsdFRyYW5zZm9ybWVyJztcblxudmFyIGlubGluZUxpc3RzID0gbmV3IFRlbXBsYXRlVGFnKGlubGluZUFycmF5VHJhbnNmb3JtZXIsIHN0cmlwSW5kZW50VHJhbnNmb3JtZXIsIHRyaW1SZXN1bHRUcmFuc2Zvcm1lcik7XG5cbmV4cG9ydCBkZWZhdWx0IGlubGluZUxpc3RzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMM055WXk5cGJteHBibVZNYVhOMGN5OXBibXhwYm1WTWFYTjBjeTVxY3lKZExDSnVZVzFsY3lJNld5SlVaVzF3YkdGMFpWUmhaeUlzSW5OMGNtbHdTVzVrWlc1MFZISmhibk5tYjNKdFpYSWlMQ0pwYm14cGJtVkJjbkpoZVZSeVlXNXpabTl5YldWeUlpd2lkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SWl3aWFXNXNhVzVsVEdsemRITWlYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMRTlCUVU5QkxGZEJRVkFzVFVGQmQwSXNaMEpCUVhoQ08wRkJRMEVzVDBGQlQwTXNjMEpCUVZBc1RVRkJiVU1zTWtKQlFXNURPMEZCUTBFc1QwRkJUME1zYzBKQlFWQXNUVUZCYlVNc01rSkJRVzVETzBGQlEwRXNUMEZCVDBNc2NVSkJRVkFzVFVGQmEwTXNNRUpCUVd4RE96dEJRVVZCTEVsQlFVMURMR05CUVdNc1NVRkJTVW9zVjBGQlNpeERRVU5zUWtVc2MwSkJSR3RDTEVWQlJXeENSQ3h6UWtGR2EwSXNSVUZIYkVKRkxIRkNRVWhyUWl4RFFVRndRanM3UVVGTlFTeGxRVUZsUXl4WFFVRm1JaXdpWm1sc1pTSTZJbWx1YkdsdVpVeHBjM1J6TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElGUmxiWEJzWVhSbFZHRm5JR1p5YjIwZ0p5NHVMMVJsYlhCc1lYUmxWR0ZuSnp0Y2JtbHRjRzl5ZENCemRISnBjRWx1WkdWdWRGUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHVMM04wY21sd1NXNWtaVzUwVkhKaGJuTm1iM0p0WlhJbk8xeHVhVzF3YjNKMElHbHViR2x1WlVGeWNtRjVWSEpoYm5ObWIzSnRaWElnWm5KdmJTQW5MaTR2YVc1c2FXNWxRWEp5WVhsVWNtRnVjMlp2Y20xbGNpYzdYRzVwYlhCdmNuUWdkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR1TDNSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpYzdYRzVjYm1OdmJuTjBJR2x1YkdsdVpVeHBjM1J6SUQwZ2JtVjNJRlJsYlhCc1lYUmxWR0ZuS0Z4dUlDQnBibXhwYm1WQmNuSmhlVlJ5WVc1elptOXliV1Z5TEZ4dUlDQnpkSEpwY0VsdVpHVnVkRlJ5WVc1elptOXliV1Z5TEZ4dUlDQjBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWElzWEc0cE8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQnBibXhwYm1WTWFYTjBjenRjYmlKZGZRPT0iLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IGlubGluZUFycmF5VHJhbnNmb3JtZXIgZnJvbSAnLi4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lcic7XG5cbnZhciBvbmVMaW5lSW5saW5lTGlzdHMgPSBuZXcgVGVtcGxhdGVUYWcoaW5saW5lQXJyYXlUcmFuc2Zvcm1lciwgcmVwbGFjZVJlc3VsdFRyYW5zZm9ybWVyKC8oPzpcXHMrKS9nLCAnICcpLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBvbmVMaW5lSW5saW5lTGlzdHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl2Ym1WTWFXNWxTVzVzYVc1bFRHbHpkSE12YjI1bFRHbHVaVWx1YkdsdVpVeHBjM1J6TG1weklsMHNJbTVoYldWeklqcGJJbFJsYlhCc1lYUmxWR0ZuSWl3aWFXNXNhVzVsUVhKeVlYbFVjbUZ1YzJadmNtMWxjaUlzSW5SeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbkpsY0d4aFkyVlNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbTl1WlV4cGJtVkpibXhwYm1WTWFYTjBjeUpkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlQwRXNWMEZCVUN4TlFVRjNRaXhuUWtGQmVFSTdRVUZEUVN4UFFVRlBReXh6UWtGQlVDeE5RVUZ0UXl3eVFrRkJia003UVVGRFFTeFBRVUZQUXl4eFFrRkJVQ3hOUVVGclF5d3dRa0ZCYkVNN1FVRkRRU3hQUVVGUFF5eDNRa0ZCVUN4TlFVRnhReXcyUWtGQmNrTTdPMEZCUlVFc1NVRkJUVU1zY1VKQlFYRkNMRWxCUVVsS0xGZEJRVW9zUTBGRGVrSkRMSE5DUVVSNVFpeEZRVVY2UWtVc2VVSkJRWGxDTEZWQlFYcENMRVZCUVhGRExFZEJRWEpETEVOQlJubENMRVZCUjNwQ1JDeHhRa0ZJZVVJc1EwRkJNMEk3TzBGQlRVRXNaVUZCWlVVc2EwSkJRV1lpTENKbWFXeGxJam9pYjI1bFRHbHVaVWx1YkdsdVpVeHBjM1J6TG1weklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElGUmxiWEJzWVhSbFZHRm5JR1p5YjIwZ0p5NHVMMVJsYlhCc1lYUmxWR0ZuSnp0Y2JtbHRjRzl5ZENCcGJteHBibVZCY25KaGVWUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHVMMmx1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJbk8xeHVhVzF3YjNKMElIUnlhVzFTWlhOMWJIUlVjbUZ1YzJadmNtMWxjaUJtY205dElDY3VMaTkwY21sdFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJbk8xeHVhVzF3YjNKMElISmxjR3hoWTJWU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TGk5eVpYQnNZV05sVW1WemRXeDBWSEpoYm5ObWIzSnRaWEluTzF4dVhHNWpiMjV6ZENCdmJtVk1hVzVsU1c1c2FXNWxUR2x6ZEhNZ1BTQnVaWGNnVkdWdGNHeGhkR1ZVWVdjb1hHNGdJR2x1YkdsdVpVRnljbUY1VkhKaGJuTm1iM0p0WlhJc1hHNGdJSEpsY0d4aFkyVlNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpZ3ZLRDg2WEZ4ekt5a3ZaeXdnSnlBbktTeGNiaUFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxGeHVLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnYjI1bFRHbHVaVWx1YkdsdVpVeHBjM1J6TzF4dUlsMTkiLCJpbXBvcnQgVGVtcGxhdGVUYWcgZnJvbSAnLi4vVGVtcGxhdGVUYWcnO1xuaW1wb3J0IHN0cmlwSW5kZW50VHJhbnNmb3JtZXIgZnJvbSAnLi4vc3RyaXBJbmRlbnRUcmFuc2Zvcm1lcic7XG5pbXBvcnQgdHJpbVJlc3VsdFRyYW5zZm9ybWVyIGZyb20gJy4uL3RyaW1SZXN1bHRUcmFuc2Zvcm1lcic7XG5cbnZhciBzdHJpcEluZGVudCA9IG5ldyBUZW1wbGF0ZVRhZyhzdHJpcEluZGVudFRyYW5zZm9ybWVyLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBzdHJpcEluZGVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1TDNOeVl5OXpkSEpwY0VsdVpHVnVkQzl6ZEhKcGNFbHVaR1Z1ZEM1cWN5SmRMQ0p1WVcxbGN5STZXeUpVWlcxd2JHRjBaVlJoWnlJc0luTjBjbWx3U1c1a1pXNTBWSEpoYm5ObWIzSnRaWElpTENKMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSWlMQ0p6ZEhKcGNFbHVaR1Z1ZENKZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1QwRkJUMEVzVjBGQlVDeE5RVUYzUWl4blFrRkJlRUk3UVVGRFFTeFBRVUZQUXl4elFrRkJVQ3hOUVVGdFF5d3lRa0ZCYmtNN1FVRkRRU3hQUVVGUFF5eHhRa0ZCVUN4TlFVRnJReXd3UWtGQmJFTTdPMEZCUlVFc1NVRkJUVU1zWTBGQll5eEpRVUZKU0N4WFFVRktMRU5CUTJ4Q1F5eHpRa0ZFYTBJc1JVRkZiRUpETEhGQ1FVWnJRaXhEUVVGd1FqczdRVUZMUVN4bFFVRmxReXhYUVVGbUlpd2labWxzWlNJNkluTjBjbWx3U1c1a1pXNTBMbXB6SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUZSbGJYQnNZWFJsVkdGbklHWnliMjBnSnk0dUwxUmxiWEJzWVhSbFZHRm5KenRjYm1sdGNHOXlkQ0J6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dUwzTjBjbWx3U1c1a1pXNTBWSEpoYm5ObWIzSnRaWEluTzF4dWFXMXdiM0owSUhSeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOTBjbWx0VW1WemRXeDBWSEpoYm5ObWIzSnRaWEluTzF4dVhHNWpiMjV6ZENCemRISnBjRWx1WkdWdWRDQTlJRzVsZHlCVVpXMXdiR0YwWlZSaFp5aGNiaUFnYzNSeWFYQkpibVJsYm5SVWNtRnVjMlp2Y20xbGNpeGNiaUFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxGeHVLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnYzNSeWFYQkpibVJsYm5RN1hHNGlYWDA9IiwiaW1wb3J0IFRlbXBsYXRlVGFnIGZyb20gJy4uL1RlbXBsYXRlVGFnJztcbmltcG9ydCBzdHJpcEluZGVudFRyYW5zZm9ybWVyIGZyb20gJy4uL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHRyaW1SZXN1bHRUcmFuc2Zvcm1lciBmcm9tICcuLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuXG52YXIgc3RyaXBJbmRlbnRzID0gbmV3IFRlbXBsYXRlVGFnKHN0cmlwSW5kZW50VHJhbnNmb3JtZXIoJ2FsbCcpLCB0cmltUmVzdWx0VHJhbnNmb3JtZXIpO1xuXG5leHBvcnQgZGVmYXVsdCBzdHJpcEluZGVudHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUwzTnlZeTl6ZEhKcGNFbHVaR1Z1ZEhNdmMzUnlhWEJKYm1SbGJuUnpMbXB6SWwwc0ltNWhiV1Z6SWpwYklsUmxiWEJzWVhSbFZHRm5JaXdpYzNSeWFYQkpibVJsYm5SVWNtRnVjMlp2Y20xbGNpSXNJblJ5YVcxU1pYTjFiSFJVY21GdWMyWnZjbTFsY2lJc0luTjBjbWx3U1c1a1pXNTBjeUpkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzVDBGQlQwRXNWMEZCVUN4TlFVRjNRaXhuUWtGQmVFSTdRVUZEUVN4UFFVRlBReXh6UWtGQlVDeE5RVUZ0UXl3eVFrRkJia003UVVGRFFTeFBRVUZQUXl4eFFrRkJVQ3hOUVVGclF5d3dRa0ZCYkVNN08wRkJSVUVzU1VGQlRVTXNaVUZCWlN4SlFVRkpTQ3hYUVVGS0xFTkJRMjVDUXl4MVFrRkJkVUlzUzBGQmRrSXNRMEZFYlVJc1JVRkZia0pETEhGQ1FVWnRRaXhEUVVGeVFqczdRVUZMUVN4bFFVRmxReXhaUVVGbUlpd2labWxzWlNJNkluTjBjbWx3U1c1a1pXNTBjeTVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCVVpXMXdiR0YwWlZSaFp5Qm1jbTl0SUNjdUxpOVVaVzF3YkdGMFpWUmhaeWM3WEc1cGJYQnZjblFnYzNSeWFYQkpibVJsYm5SVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUxpOXpkSEpwY0VsdVpHVnVkRlJ5WVc1elptOXliV1Z5Snp0Y2JtbHRjRzl5ZENCMGNtbHRVbVZ6ZFd4MFZISmhibk5tYjNKdFpYSWdabkp2YlNBbkxpNHZkSEpwYlZKbGMzVnNkRlJ5WVc1elptOXliV1Z5Snp0Y2JseHVZMjl1YzNRZ2MzUnlhWEJKYm1SbGJuUnpJRDBnYm1WM0lGUmxiWEJzWVhSbFZHRm5LRnh1SUNCemRISnBjRWx1WkdWdWRGUnlZVzV6Wm05eWJXVnlLQ2RoYkd3bktTeGNiaUFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUxGeHVLVHRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnYzNSeWFYQkpibVJsYm5Sek8xeHVJbDE5IiwiLy8gY29yZVxuaW1wb3J0IF9UZW1wbGF0ZVRhZyBmcm9tICcuL1RlbXBsYXRlVGFnJztcbmV4cG9ydCB7IF9UZW1wbGF0ZVRhZyBhcyBUZW1wbGF0ZVRhZyB9O1xuXG4vLyB0cmFuc2Zvcm1lcnNcblxuaW1wb3J0IF90cmltUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi90cmltUmVzdWx0VHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgX3RyaW1SZXN1bHRUcmFuc2Zvcm1lciBhcyB0cmltUmVzdWx0VHJhbnNmb3JtZXIgfTtcbmltcG9ydCBfc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciBmcm9tICcuL3N0cmlwSW5kZW50VHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgX3N0cmlwSW5kZW50VHJhbnNmb3JtZXIgYXMgc3RyaXBJbmRlbnRUcmFuc2Zvcm1lciB9O1xuaW1wb3J0IF9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgZnJvbSAnLi9yZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgX3JlcGxhY2VSZXN1bHRUcmFuc2Zvcm1lciBhcyByZXBsYWNlUmVzdWx0VHJhbnNmb3JtZXIgfTtcbmltcG9ydCBfcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIGZyb20gJy4vcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyJztcbmV4cG9ydCB7IF9yZXBsYWNlU3Vic3RpdHV0aW9uVHJhbnNmb3JtZXIgYXMgcmVwbGFjZVN1YnN0aXR1dGlvblRyYW5zZm9ybWVyIH07XG5pbXBvcnQgX3JlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lciBmcm9tICcuL3JlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lcic7XG5leHBvcnQgeyBfcmVwbGFjZVN0cmluZ1RyYW5zZm9ybWVyIGFzIHJlcGxhY2VTdHJpbmdUcmFuc2Zvcm1lciB9O1xuaW1wb3J0IF9pbmxpbmVBcnJheVRyYW5zZm9ybWVyIGZyb20gJy4vaW5saW5lQXJyYXlUcmFuc2Zvcm1lcic7XG5leHBvcnQgeyBfaW5saW5lQXJyYXlUcmFuc2Zvcm1lciBhcyBpbmxpbmVBcnJheVRyYW5zZm9ybWVyIH07XG5pbXBvcnQgX3NwbGl0U3RyaW5nVHJhbnNmb3JtZXIgZnJvbSAnLi9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyJztcbmV4cG9ydCB7IF9zcGxpdFN0cmluZ1RyYW5zZm9ybWVyIGFzIHNwbGl0U3RyaW5nVHJhbnNmb3JtZXIgfTtcbmltcG9ydCBfcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciBmcm9tICcuL3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXInO1xuZXhwb3J0IHsgX3JlbW92ZU5vblByaW50aW5nVmFsdWVzVHJhbnNmb3JtZXIgYXMgcmVtb3ZlTm9uUHJpbnRpbmdWYWx1ZXNUcmFuc2Zvcm1lciB9O1xuXG4vLyB0YWdzXG5cbmltcG9ydCBfY29tbWFMaXN0cyBmcm9tICcuL2NvbW1hTGlzdHMnO1xuZXhwb3J0IHsgX2NvbW1hTGlzdHMgYXMgY29tbWFMaXN0cyB9O1xuaW1wb3J0IF9jb21tYUxpc3RzQW5kIGZyb20gJy4vY29tbWFMaXN0c0FuZCc7XG5leHBvcnQgeyBfY29tbWFMaXN0c0FuZCBhcyBjb21tYUxpc3RzQW5kIH07XG5pbXBvcnQgX2NvbW1hTGlzdHNPciBmcm9tICcuL2NvbW1hTGlzdHNPcic7XG5leHBvcnQgeyBfY29tbWFMaXN0c09yIGFzIGNvbW1hTGlzdHNPciB9O1xuaW1wb3J0IF9odG1sIGZyb20gJy4vaHRtbCc7XG5leHBvcnQgeyBfaHRtbCBhcyBodG1sIH07XG5pbXBvcnQgX2NvZGVCbG9jayBmcm9tICcuL2NvZGVCbG9jayc7XG5leHBvcnQgeyBfY29kZUJsb2NrIGFzIGNvZGVCbG9jayB9O1xuaW1wb3J0IF9zb3VyY2UgZnJvbSAnLi9zb3VyY2UnO1xuZXhwb3J0IHsgX3NvdXJjZSBhcyBzb3VyY2UgfTtcbmltcG9ydCBfc2FmZUh0bWwgZnJvbSAnLi9zYWZlSHRtbCc7XG5leHBvcnQgeyBfc2FmZUh0bWwgYXMgc2FmZUh0bWwgfTtcbmltcG9ydCBfb25lTGluZSBmcm9tICcuL29uZUxpbmUnO1xuZXhwb3J0IHsgX29uZUxpbmUgYXMgb25lTGluZSB9O1xuaW1wb3J0IF9vbmVMaW5lVHJpbSBmcm9tICcuL29uZUxpbmVUcmltJztcbmV4cG9ydCB7IF9vbmVMaW5lVHJpbSBhcyBvbmVMaW5lVHJpbSB9O1xuaW1wb3J0IF9vbmVMaW5lQ29tbWFMaXN0cyBmcm9tICcuL29uZUxpbmVDb21tYUxpc3RzJztcbmV4cG9ydCB7IF9vbmVMaW5lQ29tbWFMaXN0cyBhcyBvbmVMaW5lQ29tbWFMaXN0cyB9O1xuaW1wb3J0IF9vbmVMaW5lQ29tbWFMaXN0c09yIGZyb20gJy4vb25lTGluZUNvbW1hTGlzdHNPcic7XG5leHBvcnQgeyBfb25lTGluZUNvbW1hTGlzdHNPciBhcyBvbmVMaW5lQ29tbWFMaXN0c09yIH07XG5pbXBvcnQgX29uZUxpbmVDb21tYUxpc3RzQW5kIGZyb20gJy4vb25lTGluZUNvbW1hTGlzdHNBbmQnO1xuZXhwb3J0IHsgX29uZUxpbmVDb21tYUxpc3RzQW5kIGFzIG9uZUxpbmVDb21tYUxpc3RzQW5kIH07XG5pbXBvcnQgX2lubGluZUxpc3RzIGZyb20gJy4vaW5saW5lTGlzdHMnO1xuZXhwb3J0IHsgX2lubGluZUxpc3RzIGFzIGlubGluZUxpc3RzIH07XG5pbXBvcnQgX29uZUxpbmVJbmxpbmVMaXN0cyBmcm9tICcuL29uZUxpbmVJbmxpbmVMaXN0cyc7XG5leHBvcnQgeyBfb25lTGluZUlubGluZUxpc3RzIGFzIG9uZUxpbmVJbmxpbmVMaXN0cyB9O1xuaW1wb3J0IF9zdHJpcEluZGVudCBmcm9tICcuL3N0cmlwSW5kZW50JztcbmV4cG9ydCB7IF9zdHJpcEluZGVudCBhcyBzdHJpcEluZGVudCB9O1xuaW1wb3J0IF9zdHJpcEluZGVudHMgZnJvbSAnLi9zdHJpcEluZGVudHMnO1xuZXhwb3J0IHsgX3N0cmlwSW5kZW50cyBhcyBzdHJpcEluZGVudHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGJtUmxlQzVxY3lKZExDSnVZVzFsY3lJNld5SlVaVzF3YkdGMFpWUmhaeUlzSW5SeWFXMVNaWE4xYkhSVWNtRnVjMlp2Y20xbGNpSXNJbk4wY21sd1NXNWtaVzUwVkhKaGJuTm1iM0p0WlhJaUxDSnlaWEJzWVdObFVtVnpkV3gwVkhKaGJuTm1iM0p0WlhJaUxDSnlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWElpTENKeVpYQnNZV05sVTNSeWFXNW5WSEpoYm5ObWIzSnRaWElpTENKcGJteHBibVZCY25KaGVWUnlZVzV6Wm05eWJXVnlJaXdpYzNCc2FYUlRkSEpwYm1kVWNtRnVjMlp2Y20xbGNpSXNJbkpsYlc5MlpVNXZibEJ5YVc1MGFXNW5WbUZzZFdWelZISmhibk5tYjNKdFpYSWlMQ0pqYjIxdFlVeHBjM1J6SWl3aVkyOXRiV0ZNYVhOMGMwRnVaQ0lzSW1OdmJXMWhUR2x6ZEhOUGNpSXNJbWgwYld3aUxDSmpiMlJsUW14dlkyc2lMQ0p6YjNWeVkyVWlMQ0p6WVdabFNIUnRiQ0lzSW05dVpVeHBibVVpTENKdmJtVk1hVzVsVkhKcGJTSXNJbTl1WlV4cGJtVkRiMjF0WVV4cGMzUnpJaXdpYjI1bFRHbHVaVU52YlcxaFRHbHpkSE5QY2lJc0ltOXVaVXhwYm1WRGIyMXRZVXhwYzNSelFXNWtJaXdpYVc1c2FXNWxUR2x6ZEhNaUxDSnZibVZNYVc1bFNXNXNhVzVsVEdsemRITWlMQ0p6ZEhKcGNFbHVaR1Z1ZENJc0luTjBjbWx3U1c1a1pXNTBjeUpkTENKdFlYQndhVzVuY3lJNklrRkJRVUU3ZVVKQlEzZENMR1U3ZVVKQlFXcENRU3hYT3p0QlFVVlFPenR0UTBGRGEwTXNlVUk3YlVOQlFUTkNReXh4UWp0dlEwRkRORUlzTUVJN2IwTkJRVFZDUXl4elFqdHpRMEZET0VJc05FSTdjME5CUVRsQ1F5eDNRanMwUTBGRGIwTXNhME03TkVOQlFYQkRReXc0UWp0elEwRkRPRUlzTkVJN2MwTkJRVGxDUXl4M1FqdHZRMEZETkVJc01FSTdiME5CUVRWQ1F5eHpRanR2UTBGRE5FSXNNRUk3YjBOQlFUVkNReXh6UWp0blJFRkRkME1zYzBNN1owUkJRWGhEUXl4clF6czdRVUZGVURzN2QwSkJRM1ZDTEdNN2QwSkJRV2hDUXl4Vk96SkNRVU50UWl4cFFqc3lRa0ZCYmtKRExHRTdNRUpCUTJ0Q0xHZENPekJDUVVGc1FrTXNXVHRyUWtGRFZTeFJPMnRDUVVGV1F5eEpPM1ZDUVVObExHRTdkVUpCUVdaRExGTTdiMEpCUTFrc1ZUdHZRa0ZCV2tNc1RUdHpRa0ZEWXl4Wk8zTkNRVUZrUXl4Uk8zRkNRVU5oTEZjN2NVSkJRV0pETEU4N2VVSkJRMmxDTEdVN2VVSkJRV3BDUXl4WE95dENRVU4xUWl4eFFqc3JRa0ZCZGtKRExHbENPMmxEUVVONVFpeDFRanRwUTBGQmVrSkRMRzFDTzJ0RFFVTXdRaXgzUWp0clEwRkJNVUpETEc5Q08zbENRVU5wUWl4bE8zbENRVUZxUWtNc1Z6dG5RMEZEZDBJc2MwSTdaME5CUVhoQ1F5eHJRanQ1UWtGRGFVSXNaVHQ1UWtGQmFrSkRMRmM3TUVKQlEydENMR2RDT3pCQ1FVRnNRa01zV1NJc0ltWnBiR1VpT2lKcGJtUmxlQzVxY3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklpOHZJR052Y21WY2JtVjRjRzl5ZENCVVpXMXdiR0YwWlZSaFp5Qm1jbTl0SUNjdUwxUmxiWEJzWVhSbFZHRm5KenRjYmx4dUx5OGdkSEpoYm5ObWIzSnRaWEp6WEc1bGVIQnZjblFnZEhKcGJWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dmRISnBiVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlKenRjYm1WNGNHOXlkQ0J6ZEhKcGNFbHVaR1Z1ZEZSeVlXNXpabTl5YldWeUlHWnliMjBnSnk0dmMzUnlhWEJKYm1SbGJuUlVjbUZ1YzJadmNtMWxjaWM3WEc1bGVIQnZjblFnY21Wd2JHRmpaVkpsYzNWc2RGUnlZVzV6Wm05eWJXVnlJR1p5YjIwZ0p5NHZjbVZ3YkdGalpWSmxjM1ZzZEZSeVlXNXpabTl5YldWeUp6dGNibVY0Y0c5eWRDQnlaWEJzWVdObFUzVmljM1JwZEhWMGFXOXVWSEpoYm5ObWIzSnRaWElnWm5KdmJTQW5MaTl5WlhCc1lXTmxVM1ZpYzNScGRIVjBhVzl1VkhKaGJuTm1iM0p0WlhJbk8xeHVaWGh3YjNKMElISmxjR3hoWTJWVGRISnBibWRVY21GdWMyWnZjbTFsY2lCbWNtOXRJQ2N1TDNKbGNHeGhZMlZUZEhKcGJtZFVjbUZ1YzJadmNtMWxjaWM3WEc1bGVIQnZjblFnYVc1c2FXNWxRWEp5WVhsVWNtRnVjMlp2Y20xbGNpQm1jbTl0SUNjdUwybHViR2x1WlVGeWNtRjVWSEpoYm5ObWIzSnRaWEluTzF4dVpYaHdiM0owSUhOd2JHbDBVM1J5YVc1blZISmhibk5tYjNKdFpYSWdabkp2YlNBbkxpOXpjR3hwZEZOMGNtbHVaMVJ5WVc1elptOXliV1Z5Snp0Y2JtVjRjRzl5ZENCeVpXMXZkbVZPYjI1UWNtbHVkR2x1WjFaaGJIVmxjMVJ5WVc1elptOXliV1Z5SUdaeWIyMGdKeTR2Y21WdGIzWmxUbTl1VUhKcGJuUnBibWRXWVd4MVpYTlVjbUZ1YzJadmNtMWxjaWM3WEc1Y2JpOHZJSFJoWjNOY2JtVjRjRzl5ZENCamIyMXRZVXhwYzNSeklHWnliMjBnSnk0dlkyOXRiV0ZNYVhOMGN5YzdYRzVsZUhCdmNuUWdZMjl0YldGTWFYTjBjMEZ1WkNCbWNtOXRJQ2N1TDJOdmJXMWhUR2x6ZEhOQmJtUW5PMXh1Wlhod2IzSjBJR052YlcxaFRHbHpkSE5QY2lCbWNtOXRJQ2N1TDJOdmJXMWhUR2x6ZEhOUGNpYzdYRzVsZUhCdmNuUWdhSFJ0YkNCbWNtOXRJQ2N1TDJoMGJXd25PMXh1Wlhod2IzSjBJR052WkdWQ2JHOWpheUJtY205dElDY3VMMk52WkdWQ2JHOWpheWM3WEc1bGVIQnZjblFnYzI5MWNtTmxJR1p5YjIwZ0p5NHZjMjkxY21ObEp6dGNibVY0Y0c5eWRDQnpZV1psU0hSdGJDQm1jbTl0SUNjdUwzTmhabVZJZEcxc0p6dGNibVY0Y0c5eWRDQnZibVZNYVc1bElHWnliMjBnSnk0dmIyNWxUR2x1WlNjN1hHNWxlSEJ2Y25RZ2IyNWxUR2x1WlZSeWFXMGdabkp2YlNBbkxpOXZibVZNYVc1bFZISnBiU2M3WEc1bGVIQnZjblFnYjI1bFRHbHVaVU52YlcxaFRHbHpkSE1nWm5KdmJTQW5MaTl2Ym1WTWFXNWxRMjl0YldGTWFYTjBjeWM3WEc1bGVIQnZjblFnYjI1bFRHbHVaVU52YlcxaFRHbHpkSE5QY2lCbWNtOXRJQ2N1TDI5dVpVeHBibVZEYjIxdFlVeHBjM1J6VDNJbk8xeHVaWGh3YjNKMElHOXVaVXhwYm1WRGIyMXRZVXhwYzNSelFXNWtJR1p5YjIwZ0p5NHZiMjVsVEdsdVpVTnZiVzFoVEdsemRITkJibVFuTzF4dVpYaHdiM0owSUdsdWJHbHVaVXhwYzNSeklHWnliMjBnSnk0dmFXNXNhVzVsVEdsemRITW5PMXh1Wlhod2IzSjBJRzl1WlV4cGJtVkpibXhwYm1WTWFYTjBjeUJtY205dElDY3VMMjl1WlV4cGJtVkpibXhwYm1WTWFYTjBjeWM3WEc1bGVIQnZjblFnYzNSeWFYQkpibVJsYm5RZ1puSnZiU0FuTGk5emRISnBjRWx1WkdWdWRDYzdYRzVsZUhCdmNuUWdjM1J5YVhCSmJtUmxiblJ6SUdaeWIyMGdKeTR2YzNSeWFYQkpibVJsYm5Sekp6dGNiaUpkZlE9PSIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jb25zdGFudHMgPSByZXF1aXJlKFwiLi9jb25zdGFudHNcIik7XG5cbk9iamVjdC5rZXlzKF9jb25zdGFudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9jb25zdGFudHNba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbnZhciBfbW9kZWxzID0gcmVxdWlyZShcIi4vbW9kZWxzXCIpO1xuXG5PYmplY3Qua2V5cyhfbW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIgfHwga2V5ID09PSBcIl9fZXNNb2R1bGVcIikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBfbW9kZWxzW2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xuXG52YXIgX3ByZXZpZXcgPSByZXF1aXJlKFwiLi9wcmV2aWV3XCIpO1xuXG5PYmplY3Qua2V5cyhfcHJldmlldykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX3ByZXZpZXdba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmhvdCAmJiBtb2R1bGUuaG90LmRlY2xpbmUpIHtcbiAgbW9kdWxlLmhvdC5kZWNsaW5lKCk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc2xpY2VcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmZyZWV6ZVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuTGlua1RvID0gTGlua1RvO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibGlua1RvXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wcmV2aWV3LmxpbmtUbztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJocmVmVG9cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3ByZXZpZXcuaHJlZlRvO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIndpdGhMaW5rc1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcHJldmlldy53aXRoTGlua3M7XG4gIH1cbn0pO1xuXG52YXIgX2NvbW1vblRhZ3MgPSByZXF1aXJlKFwiY29tbW9uLXRhZ3NcIik7XG5cbnZhciBfcHJldmlldyA9IHJlcXVpcmUoXCIuL3ByZXZpZXdcIik7XG5cbmZ1bmN0aW9uIF90ZW1wbGF0ZU9iamVjdCgpIHtcbiAgdmFyIGRhdGEgPSBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKFtcIlxcbiAgICAgIExpbmtUbyBoYXMgbW92ZWQgdG8gYWRkb24tbGlua3MvcmVhY3Q6XFxuICAgICAgaW1wb3J0IExpbmtUbyBmcm9tICdAc3Rvcnlib29rL2FkZG9uLWxpbmtzL3JlYWN0JztcXG4gICAgXCJdKTtcblxuICBfdGVtcGxhdGVPYmplY3QgPSBmdW5jdGlvbiBfdGVtcGxhdGVPYmplY3QoKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH07XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoc3RyaW5ncywgcmF3KSB7IGlmICghcmF3KSB7IHJhdyA9IHN0cmluZ3Muc2xpY2UoMCk7IH0gcmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3RyaW5ncywgeyByYXc6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUocmF3KSB9IH0pKTsgfVxuXG52YXIgaGFzV2FybmVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIExpbmtUbygpIHtcbiAgaWYgKCFoYXNXYXJuZWQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoKDAsIF9jb21tb25UYWdzLnN0cmlwSW5kZW50cykoX3RlbXBsYXRlT2JqZWN0KCkpKTtcbiAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmlmIChtb2R1bGUgJiYgbW9kdWxlLmhvdCAmJiBtb2R1bGUuaG90LmRlY2xpbmUpIHtcbiAgbW9kdWxlLmhvdC5kZWNsaW5lKCk7XG59IiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfT2JzZXJ2YWJsZSxfdXRpbF9pc1Byb21pc2UsX3V0aWxfaXNBcnJheUxpa2UsX3V0aWxfaXNJbnRlcm9wT2JzZXJ2YWJsZSxfdXRpbF9pc0l0ZXJhYmxlLF9mcm9tQXJyYXksX2Zyb21Qcm9taXNlLF9mcm9tSXRlcmFibGUsX2Zyb21PYnNlcnZhYmxlLF91dGlsX3N1YnNjcmliZVRvIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuLi9PYnNlcnZhYmxlJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWwvaXNQcm9taXNlJztcbmltcG9ydCB7IGlzQXJyYXlMaWtlIH0gZnJvbSAnLi4vdXRpbC9pc0FycmF5TGlrZSc7XG5pbXBvcnQgeyBpc0ludGVyb3BPYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbC9pc0ludGVyb3BPYnNlcnZhYmxlJztcbmltcG9ydCB7IGlzSXRlcmFibGUgfSBmcm9tICcuLi91dGlsL2lzSXRlcmFibGUnO1xuaW1wb3J0IHsgZnJvbUFycmF5IH0gZnJvbSAnLi9mcm9tQXJyYXknO1xuaW1wb3J0IHsgZnJvbVByb21pc2UgfSBmcm9tICcuL2Zyb21Qcm9taXNlJztcbmltcG9ydCB7IGZyb21JdGVyYWJsZSB9IGZyb20gJy4vZnJvbUl0ZXJhYmxlJztcbmltcG9ydCB7IGZyb21PYnNlcnZhYmxlIH0gZnJvbSAnLi9mcm9tT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBzdWJzY3JpYmVUbyB9IGZyb20gJy4uL3V0aWwvc3Vic2NyaWJlVG8nO1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikge1xuICAgIGlmICghc2NoZWR1bGVyKSB7XG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG8oaW5wdXQpKTtcbiAgICB9XG4gICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0l0ZXJhYmxlKGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCB8fCBpbnB1dCkgKyAnIGlzIG5vdCBvYnNlcnZhYmxlJyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfc3ltYm9sX29ic2VydmFibGUgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgb2JzZXJ2YWJsZSBhcyBTeW1ib2xfb2JzZXJ2YWJsZSB9IGZyb20gJy4uL3N5bWJvbC9vYnNlcnZhYmxlJztcbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0ICYmIHR5cGVvZiBpbnB1dFtTeW1ib2xfb2JzZXJ2YWJsZV0gPT09ICdmdW5jdGlvbic7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0ludGVyb3BPYnNlcnZhYmxlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfT2JzZXJ2YWJsZSxfU3Vic2NyaXB0aW9uLF9zeW1ib2xfb2JzZXJ2YWJsZSxfdXRpbF9zdWJzY3JpYmVUb09ic2VydmFibGUgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJy4uL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IG9ic2VydmFibGUgYXMgU3ltYm9sX29ic2VydmFibGUgfSBmcm9tICcuLi9zeW1ib2wvb2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBzdWJzY3JpYmVUb09ic2VydmFibGUgfSBmcm9tICcuLi91dGlsL3N1YnNjcmliZVRvT2JzZXJ2YWJsZSc7XG5leHBvcnQgZnVuY3Rpb24gZnJvbU9ic2VydmFibGUoaW5wdXQsIHNjaGVkdWxlcikge1xuICAgIGlmICghc2NoZWR1bGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVUb09ic2VydmFibGUoaW5wdXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZSA9IGlucHV0W1N5bWJvbF9vYnNlcnZhYmxlXSgpO1xuICAgICAgICAgICAgICAgIHN1Yi5hZGQob2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAodmFsdWUpIHsgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsgfSkpOyB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycikgeyBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7IHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7IH0pKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uICgpIHsgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgeyByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpOyB9KSk7IH0sXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHN1YjtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJvbU9ic2VydmFibGUuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIF9PYnNlcnZhYmxlLF9TdWJzY3JpcHRpb24sX3V0aWxfc3Vic2NyaWJlVG9Qcm9taXNlIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuLi9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBzdWJzY3JpYmVUb1Byb21pc2UgfSBmcm9tICcuLi91dGlsL3N1YnNjcmliZVRvUHJvbWlzZSc7XG5leHBvcnQgZnVuY3Rpb24gZnJvbVByb21pc2UoaW5wdXQsIHNjaGVkdWxlcikge1xuICAgIGlmICghc2NoZWR1bGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVUb1Byb21pc2UoaW5wdXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7IHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycik7IH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBzdWI7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyb21Qcm9taXNlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfc3ltYm9sX2l0ZXJhdG9yIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IGl0ZXJhdG9yIGFzIFN5bWJvbF9pdGVyYXRvciB9IGZyb20gJy4uL3N5bWJvbC9pdGVyYXRvcic7XG5leHBvcnQgZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbU3ltYm9sX2l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzSXRlcmFibGUuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIF9PYnNlcnZhYmxlLF9TdWJzY3JpcHRpb24sX3N5bWJvbF9pdGVyYXRvcixfdXRpbF9zdWJzY3JpYmVUb0l0ZXJhYmxlIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuLi9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJy4uL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgeyBpdGVyYXRvciBhcyBTeW1ib2xfaXRlcmF0b3IgfSBmcm9tICcuLi9zeW1ib2wvaXRlcmF0b3InO1xuaW1wb3J0IHsgc3Vic2NyaWJlVG9JdGVyYWJsZSB9IGZyb20gJy4uL3V0aWwvc3Vic2NyaWJlVG9JdGVyYWJsZSc7XG5leHBvcnQgZnVuY3Rpb24gZnJvbUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSXRlcmFibGUgY2Fubm90IGJlIG51bGwnKTtcbiAgICB9XG4gICAgaWYgKCFzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZVRvSXRlcmFibGUoaW5wdXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgICAgICAgICAgdmFyIHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICAgIHZhciBpdGVyYXRvcjtcbiAgICAgICAgICAgIHN1Yi5hZGQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciAmJiB0eXBlb2YgaXRlcmF0b3IucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gaW5wdXRbU3ltYm9sX2l0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZG9uZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSByZXN1bHQuZG9uZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gc3ViO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcm9tSXRlcmFibGUuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZVwiKTtcblxucmVxdWlyZShcImFpcmJuYi1qcy1zaGltc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvZmVhdHVyZXMvc3ltYm9sXCIpOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbiAgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vdGFyZ2V0L2VzNScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCdlczUtc2hpbScpO1xucmVxdWlyZSgnZXM1LXNoaW0vZXM1LXNoYW0nKTtcblxucmVxdWlyZSgnLi9lczIwMTUnKTtcbiIsIi8qIVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG4gKiBAbGljZW5zZSBlczUtc2hpbSBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5IGNvbnRyaWJ1dG9ycywgTUlUIExpY2Vuc2VcbiAqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYlxuXG4vLyBBZGQgc2VtaWNvbG9uIHRvIHByZXZlbnQgSUlGRSBmcm9tIGJlaW5nIHBhc3NlZCBhcyBhcmd1bWVudCB0byBjb25jYXRlbmF0ZWQgY29kZS5cbjtcblxuLy8gVU1EIChVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24pXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3VtZGpzL3VtZC9ibG9iL21hc3Rlci90ZW1wbGF0ZXMvcmV0dXJuRXhwb3J0cy5qc1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZSwgZXhwb3J0cywgbW9kdWxlICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LnJldHVybkV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlXG4gICAgICogYXMgaXMgcG9zc2libGUgd2l0aCB0aGUgZmFjaWxpdGllcyBvZiBlcnN0d2hpbGUgZW5naW5lcy5cbiAgICAgKlxuICAgICAqIEFubm90YXRlZCBFUzU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8gKHNwZWNpZmljIGxpbmtzIGJlbG93KVxuICAgICAqIEVTNSBTcGVjOiBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRWNtYS0yNjIucGRmXG4gICAgICogUmVxdWlyZWQgcmVhZGluZzogaHR0cDovL2phdmFzY3JpcHR3ZWJsb2cud29yZHByZXNzLmNvbS8yMDExLzEyLzA1L2V4dGVuZGluZy1qYXZhc2NyaXB0LW5hdGl2ZXMvXG4gICAgICovXG5cbiAgICAvLyBTaG9ydGN1dCB0byBhbiBvZnRlbiBhY2Nlc3NlZCBwcm9wZXJ0aWVzLCBpbiBvcmRlciB0byBhdm9pZCBtdWx0aXBsZVxuICAgIC8vIGRlcmVmZXJlbmNlIHRoYXQgY29zdHMgdW5pdmVyc2FsbHkuIFRoaXMgYWxzbyBob2xkcyBhIHJlZmVyZW5jZSB0byBrbm93bi1nb29kXG4gICAgLy8gZnVuY3Rpb25zLlxuICAgIHZhciAkQXJyYXkgPSBBcnJheTtcbiAgICB2YXIgQXJyYXlQcm90b3R5cGUgPSAkQXJyYXkucHJvdG90eXBlO1xuICAgIHZhciAkT2JqZWN0ID0gT2JqZWN0O1xuICAgIHZhciBPYmplY3RQcm90b3R5cGUgPSAkT2JqZWN0LnByb3RvdHlwZTtcbiAgICB2YXIgJEZ1bmN0aW9uID0gRnVuY3Rpb247XG4gICAgdmFyIEZ1bmN0aW9uUHJvdG90eXBlID0gJEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgICB2YXIgJFN0cmluZyA9IFN0cmluZztcbiAgICB2YXIgU3RyaW5nUHJvdG90eXBlID0gJFN0cmluZy5wcm90b3R5cGU7XG4gICAgdmFyICROdW1iZXIgPSBOdW1iZXI7XG4gICAgdmFyIE51bWJlclByb3RvdHlwZSA9ICROdW1iZXIucHJvdG90eXBlO1xuICAgIHZhciBhcnJheV9zbGljZSA9IEFycmF5UHJvdG90eXBlLnNsaWNlO1xuICAgIHZhciBhcnJheV9zcGxpY2UgPSBBcnJheVByb3RvdHlwZS5zcGxpY2U7XG4gICAgdmFyIGFycmF5X3B1c2ggPSBBcnJheVByb3RvdHlwZS5wdXNoO1xuICAgIHZhciBhcnJheV91bnNoaWZ0ID0gQXJyYXlQcm90b3R5cGUudW5zaGlmdDtcbiAgICB2YXIgYXJyYXlfY29uY2F0ID0gQXJyYXlQcm90b3R5cGUuY29uY2F0O1xuICAgIHZhciBhcnJheV9qb2luID0gQXJyYXlQcm90b3R5cGUuam9pbjtcbiAgICB2YXIgY2FsbCA9IEZ1bmN0aW9uUHJvdG90eXBlLmNhbGw7XG4gICAgdmFyIGFwcGx5ID0gRnVuY3Rpb25Qcm90b3R5cGUuYXBwbHk7XG4gICAgdmFyIG1heCA9IE1hdGgubWF4O1xuICAgIHZhciBtaW4gPSBNYXRoLm1pbjtcblxuICAgIC8vIEhhdmluZyBhIHRvU3RyaW5nIGxvY2FsIHZhcmlhYmxlIG5hbWUgYnJlYWtzIGluIE9wZXJhIHNvIHVzZSB0b19zdHJpbmcuXG4gICAgdmFyIHRvX3N0cmluZyA9IE9iamVjdFByb3RvdHlwZS50b1N0cmluZztcblxuICAgIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBvbmUtdmFyLWRlY2xhcmF0aW9uLXBlci1saW5lLCBuby1yZWRlY2xhcmUsIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lICovXG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcbiAgICB2YXIgaXNDYWxsYWJsZTsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLWNhbGxhYmxlICovIHZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLCBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3MgLywgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0ZuKHZhbHVlKSB7IHRyeSB7IHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7IHZhciBzaW5nbGVTdHJpcHBlZCA9IGZuU3RyLnJlcGxhY2UoL1xcL1xcLy4qXFxuL2csICcnKTsgdmFyIG11bHRpU3RyaXBwZWQgPSBzaW5nbGVTdHJpcHBlZC5yZXBsYWNlKC9cXC9cXCpbLlxcc1xcU10qXFwqXFwvL2csICcnKTsgdmFyIHNwYWNlU3RyaXBwZWQgPSBtdWx0aVN0cmlwcGVkLnJlcGxhY2UoL1xcbi9tZywgJyAnKS5yZXBsYWNlKC8gezJ9L2csICcgJyk7IHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3Qoc3BhY2VTdHJpcHBlZCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyAvKiBub3QgYSBmdW5jdGlvbiAqLyB9IH0sIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpIHsgdHJ5IHsgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9LCBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJywgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLCBpc0NhbGxhYmxlID0gZnVuY3Rpb24gaXNDYWxsYWJsZSh2YWx1ZSkgeyBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfSBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9IGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9IGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfSB2YXIgc3RyQ2xhc3MgPSB0b19zdHJpbmcuY2FsbCh2YWx1ZSk7IHJldHVybiBzdHJDbGFzcyA9PT0gZm5DbGFzcyB8fCBzdHJDbGFzcyA9PT0gZ2VuQ2xhc3M7IH07XG5cbiAgICB2YXIgaXNSZWdleDsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLXJlZ2V4ICovIHZhciByZWdleEV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWMsIHRyeVJlZ2V4RXhlYyA9IGZ1bmN0aW9uIHRyeVJlZ2V4RXhlYyh2YWx1ZSkgeyB0cnkgeyByZWdleEV4ZWMuY2FsbCh2YWx1ZSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9LCByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7IGlzUmVnZXggPSBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7IGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfSByZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlSZWdleEV4ZWModmFsdWUpIDogdG9fc3RyaW5nLmNhbGwodmFsdWUpID09PSByZWdleENsYXNzOyB9O1xuICAgIHZhciBpc1N0cmluZzsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLXN0cmluZyAqLyB2YXIgc3RyVmFsdWUgPSBTdHJpbmcucHJvdG90eXBlLnZhbHVlT2YsIHRyeVN0cmluZ09iamVjdCA9IGZ1bmN0aW9uIHRyeVN0cmluZ09iamVjdCh2YWx1ZSkgeyB0cnkgeyBzdHJWYWx1ZS5jYWxsKHZhbHVlKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0sIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7IGlzU3RyaW5nID0gZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHsgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIHRydWU7IH0gaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybiBoYXNUb1N0cmluZ1RhZyA/IHRyeVN0cmluZ09iamVjdCh2YWx1ZSkgOiB0b19zdHJpbmcuY2FsbCh2YWx1ZSkgPT09IHN0cmluZ0NsYXNzOyB9O1xuICAgIC8qIGVzbGludC1lbmFibGUgb25lLXZhci1kZWNsYXJhdGlvbi1wZXItbGluZSwgbm8tcmVkZWNsYXJlLCBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG4gICAgLyogaW5saW5lZCBmcm9tIGh0dHA6Ly9ucG1qcy5jb20vZGVmaW5lLXByb3BlcnRpZXMgKi9cbiAgICB2YXIgc3VwcG9ydHNEZXNjcmlwdG9ycyA9ICRPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBvYmogPSB7fTtcbiAgICAgICAgICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAneCcsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiBvYmogfSk7XG4gICAgICAgICAgICBmb3IgKHZhciBfIGluIG9iaikgeyAvLyBqc2NzOmlnbm9yZSBkaXNhbGxvd1VudXNlZFZhcmlhYmxlc1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmoueCA9PT0gb2JqO1xuICAgICAgICB9IGNhdGNoIChlKSB7IC8qIHRoaXMgaXMgRVMzICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuICAgIHZhciBkZWZpbmVQcm9wZXJ0aWVzID0gKGZ1bmN0aW9uIChoYXMpIHtcbiAgICAgICAgLy8gRGVmaW5lIGNvbmZpZ3VyYWJsZSwgd3JpdGFibGUsIGFuZCBub24tZW51bWVyYWJsZSBwcm9wc1xuICAgICAgICAvLyBpZiB0aGV5IGRvbid0IGV4aXN0LlxuICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHk7XG4gICAgICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIG1ldGhvZCwgZm9yY2VBc3NpZ24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlQXNzaWduICYmIChuYW1lIGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGhvZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgbWV0aG9kLCBmb3JjZUFzc2lnbikge1xuICAgICAgICAgICAgICAgIGlmICghZm9yY2VBc3NpZ24gJiYgKG5hbWUgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdFtuYW1lXSA9IG1ldGhvZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBtYXAsIGZvcmNlQXNzaWduKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIG1hcCkge1xuICAgICAgICAgICAgICAgIGlmIChoYXMuY2FsbChtYXAsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwgbWFwW25hbWVdLCBmb3JjZUFzc2lnbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0oT2JqZWN0UHJvdG90eXBlLmhhc093blByb3BlcnR5KSk7XG5cbiAgICAvL1xuICAgIC8vIFV0aWxcbiAgICAvLyA9PT09PT1cbiAgICAvL1xuXG4gICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IC9oZWxwZXJzL2lzUHJpbWl0aXZlICovXG4gICAgdmFyIGlzUHJpbWl0aXZlID0gZnVuY3Rpb24gaXNQcmltaXRpdmUoaW5wdXQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgaW5wdXQ7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PT0gbnVsbCB8fCAodHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfTtcblxuICAgIHZhciBpc0FjdHVhbE5hTiA9ICROdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNBY3R1YWxOYU4oeCkge1xuICAgICAgICByZXR1cm4geCAhPT0geDtcbiAgICB9O1xuXG4gICAgdmFyIEVTID0ge1xuICAgICAgICAvLyBFUzUgOS40XG4gICAgICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuNFxuICAgICAgICAvLyBodHRwOi8vanNwZXJmLmNvbS90by1pbnRlZ2VyXG4gICAgICAgIC8qIHJlcGxhY2VhYmxlIHdpdGggaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9lcy1hYnN0cmFjdCBFUzUuVG9JbnRlZ2VyICovXG4gICAgICAgIFRvSW50ZWdlcjogZnVuY3Rpb24gVG9JbnRlZ2VyKG51bSkge1xuICAgICAgICAgICAgdmFyIG4gPSArbnVtO1xuICAgICAgICAgICAgaWYgKGlzQWN0dWFsTmFOKG4pKSB7XG4gICAgICAgICAgICAgICAgbiA9IDA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG4gIT09IDAgJiYgbiAhPT0gKDEgLyAwKSAmJiBuICE9PSAtKDEgLyAwKSkge1xuICAgICAgICAgICAgICAgIG4gPSAobiA+IDAgfHwgLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiByZXBsYWNlYWJsZSB3aXRoIGh0dHBzOi8vbnBtanMuY29tL3BhY2thZ2UvZXMtYWJzdHJhY3QgRVM1LlRvUHJpbWl0aXZlICovXG4gICAgICAgIFRvUHJpbWl0aXZlOiBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCkge1xuICAgICAgICAgICAgdmFyIHZhbCwgdmFsdWVPZiwgdG9TdHI7XG4gICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVPZiA9IGlucHV0LnZhbHVlT2Y7XG4gICAgICAgICAgICBpZiAoaXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlT2YuY2FsbChpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b1N0ciA9IGlucHV0LnRvU3RyaW5nO1xuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodG9TdHIpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gdG9TdHIuY2FsbChpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRVM1IDkuOVxuICAgICAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjlcbiAgICAgICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IEVTNS5Ub09iamVjdCAqL1xuICAgICAgICBUb09iamVjdDogZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsgLy8gdGhpcyBtYXRjaGVzIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgXCIgKyBvICsgJyB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkT2JqZWN0KG8pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qIHJlcGxhY2VhYmxlIHdpdGggaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9lcy1hYnN0cmFjdCBFUzUuVG9VaW50MzIgKi9cbiAgICAgICAgVG9VaW50MzI6IGZ1bmN0aW9uIFRvVWludDMyKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID4+PiAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gRnVuY3Rpb25cbiAgICAvLyA9PT09PT09PVxuICAgIC8vXG5cbiAgICAvLyBFUy01IDE1LjMuNC41XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMy40LjVcblxuICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEZ1bmN0aW9uUHJvdG90eXBlLCB7XG4gICAgICAgIGJpbmQ6IGZ1bmN0aW9uIGJpbmQodGhhdCkgeyAvLyAubGVuZ3RoIGlzIDFcbiAgICAgICAgICAgIC8vIDEuIExldCBUYXJnZXQgYmUgdGhlIHRoaXMgdmFsdWUuXG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICAgICAgICAgIC8vIDIuIElmIElzQ2FsbGFibGUoVGFyZ2V0KSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICcgKyB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4gTGV0IEEgYmUgYSBuZXcgKHBvc3NpYmx5IGVtcHR5KSBpbnRlcm5hbCBsaXN0IG9mIGFsbCBvZiB0aGVcbiAgICAgICAgICAgIC8vICAgYXJndW1lbnQgdmFsdWVzIHByb3ZpZGVkIGFmdGVyIHRoaXNBcmcgKGFyZzEsIGFyZzIgZXRjKSwgaW4gb3JkZXIuXG4gICAgICAgICAgICAvLyBYWFggc2xpY2VkQXJncyB3aWxsIHN0YW5kIGluIGZvciBcIkFcIiBpZiB1c2VkXG4gICAgICAgICAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsgLy8gZm9yIG5vcm1hbCBjYWxsXG4gICAgICAgICAgICAvLyA0LiBMZXQgRiBiZSBhIG5ldyBuYXRpdmUgRUNNQVNjcmlwdCBvYmplY3QuXG4gICAgICAgICAgICAvLyAxMS4gU2V0IHRoZSBbW1Byb3RvdHlwZV1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgdG8gdGhlIHN0YW5kYXJkXG4gICAgICAgICAgICAvLyAgIGJ1aWx0LWluIEZ1bmN0aW9uIHByb3RvdHlwZSBvYmplY3QgYXMgc3BlY2lmaWVkIGluIDE1LjMuMy4xLlxuICAgICAgICAgICAgLy8gMTIuIFNldCB0aGUgW1tDYWxsXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW5cbiAgICAgICAgICAgIC8vICAgMTUuMy40LjUuMS5cbiAgICAgICAgICAgIC8vIDEzLiBTZXQgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW5cbiAgICAgICAgICAgIC8vICAgMTUuMy40LjUuMi5cbiAgICAgICAgICAgIC8vIDE0LiBTZXQgdGhlIFtbSGFzSW5zdGFuY2VdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIGFzIGRlc2NyaWJlZCBpblxuICAgICAgICAgICAgLy8gICAxNS4zLjQuNS4zLlxuICAgICAgICAgICAgdmFyIGJvdW5kO1xuICAgICAgICAgICAgdmFyIGJpbmRlciA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMTUuMy40LjUuMiBbW0NvbnN0cnVjdF1dXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kIG9mIGEgZnVuY3Rpb24gb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAvLyBGIHRoYXQgd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIGFyZ3VtZW50cyBFeHRyYUFyZ3MsIHRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHRha2VuOlxuICAgICAgICAgICAgICAgICAgICAvLyAxLiBMZXQgdGFyZ2V0IGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tUYXJnZXRGdW5jdGlvbl1dXG4gICAgICAgICAgICAgICAgICAgIC8vICAgaW50ZXJuYWwgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIElmIHRhcmdldCBoYXMgbm8gW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QsIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gICBUeXBlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICAgICAgICAgICAgICAgICAgLy8gMy4gTGV0IGJvdW5kQXJncyBiZSB0aGUgdmFsdWUgb2YgRidzIFtbQm91bmRBcmdzXV0gaW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAvLyAgIHZhbHVlcyBhcyB0aGUgbGlzdCBFeHRyYUFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ29uc3RydWN0XV0gaW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBtZXRob2Qgb2YgdGFyZ2V0IHByb3ZpZGluZyBhcmdzIGFzIHRoZSBhcmd1bWVudHMuXG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGFwcGx5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfY29uY2F0LmNhbGwoYXJncywgYXJyYXlfc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAxNS4zLjQuNS4xIFtbQ2FsbF1dXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCwgRixcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGFuZCBhIGxpc3Qgb2YgYXJndW1lbnRzIEV4dHJhQXJncywgdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIDIuIExldCBib3VuZFRoaXMgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kVGhpc11dIGludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIDMuIExldCB0YXJnZXQgYmUgdGhlIHZhbHVlIG9mIEYncyBbW1RhcmdldEZ1bmN0aW9uXV0gaW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICBsaXN0IGJvdW5kQXJncyBpbiB0aGUgc2FtZSBvcmRlciBmb2xsb3dlZCBieSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAvLyAgIHZhbHVlcyBhcyB0aGUgbGlzdCBFeHRyYUFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAvLyAgIG9mIHRhcmdldCBwcm92aWRpbmcgYm91bmRUaGlzIGFzIHRoZSB0aGlzIHZhbHVlIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyAgIHByb3ZpZGluZyBhcmdzIGFzIHRoZSBhcmd1bWVudHMuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfY29uY2F0LmNhbGwoYXJncywgYXJyYXlfc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyAxNS4gSWYgdGhlIFtbQ2xhc3NdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBUYXJnZXQgaXMgXCJGdW5jdGlvblwiLCB0aGVuXG4gICAgICAgICAgICAvLyAgICAgYS4gTGV0IEwgYmUgdGhlIGxlbmd0aCBwcm9wZXJ0eSBvZiBUYXJnZXQgbWludXMgdGhlIGxlbmd0aCBvZiBBLlxuICAgICAgICAgICAgLy8gICAgIGIuIFNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIGVpdGhlciAwIG9yIEwsIHdoaWNoZXZlciBpc1xuICAgICAgICAgICAgLy8gICAgICAgbGFyZ2VyLlxuICAgICAgICAgICAgLy8gMTYuIEVsc2Ugc2V0IHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gMC5cblxuICAgICAgICAgICAgdmFyIGJvdW5kTGVuZ3RoID0gbWF4KDAsIHRhcmdldC5sZW5ndGggLSBhcmdzLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIC8vIDE3LiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byB0aGUgdmFsdWVzXG4gICAgICAgICAgICAvLyAgIHNwZWNpZmllZCBpbiAxNS4zLjUuMS5cbiAgICAgICAgICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYm91bmRMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFycmF5X3B1c2guY2FsbChib3VuZEFyZ3MsICckJyArIGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBYWFggQnVpbGQgYSBkeW5hbWljIGZ1bmN0aW9uIHdpdGggZGVzaXJlZCBhbW91bnQgb2YgYXJndW1lbnRzIGlzIHRoZSBvbmx5XG4gICAgICAgICAgICAvLyB3YXkgdG8gc2V0IHRoZSBsZW5ndGggcHJvcGVydHkgb2YgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIC8vIEluIGVudmlyb25tZW50cyB3aGVyZSBDb250ZW50IFNlY3VyaXR5IFBvbGljaWVzIGVuYWJsZWQgKENocm9tZSBleHRlbnNpb25zLFxuICAgICAgICAgICAgLy8gZm9yIGV4LikgYWxsIHVzZSBvZiBldmFsIG9yIEZ1bmN0aW9uIGNvc3RydWN0b3IgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIgaW4gYWxsIG9mIHRoZXNlIGVudmlyb25tZW50cyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBleGlzdHNcbiAgICAgICAgICAgIC8vIGFuZCBzbyB0aGlzIGNvZGUgd2lsbCBuZXZlciBiZSBleGVjdXRlZC5cbiAgICAgICAgICAgIGJvdW5kID0gJEZ1bmN0aW9uKCdiaW5kZXInLCAncmV0dXJuIGZ1bmN0aW9uICgnICsgYXJyYXlfam9pbi5jYWxsKGJvdW5kQXJncywgJywnKSArICcpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgZGFuZ2xpbmcgcmVmZXJlbmNlcy5cbiAgICAgICAgICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAvLyAxOC4gU2V0IHRoZSBbW0V4dGVuc2libGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRydWUuXG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIDE5LiBMZXQgdGhyb3dlciBiZSB0aGUgW1tUaHJvd1R5cGVFcnJvcl1dIGZ1bmN0aW9uIE9iamVjdCAoMTMuMi4zKS5cbiAgICAgICAgICAgIC8vIDIwLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aFxuICAgICAgICAgICAgLy8gICBhcmd1bWVudHMgXCJjYWxsZXJcIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLCBbW1NldF1dOlxuICAgICAgICAgICAgLy8gICB0aHJvd2VyLCBbW0VudW1lcmFibGVdXTogZmFsc2UsIFtbQ29uZmlndXJhYmxlXV06IGZhbHNlfSwgYW5kXG4gICAgICAgICAgICAvLyAgIGZhbHNlLlxuICAgICAgICAgICAgLy8gMjEuIENhbGwgdGhlIFtbRGVmaW5lT3duUHJvcGVydHldXSBpbnRlcm5hbCBtZXRob2Qgb2YgRiB3aXRoXG4gICAgICAgICAgICAvLyAgIGFyZ3VtZW50cyBcImFyZ3VtZW50c1wiLCBQcm9wZXJ0eURlc2NyaXB0b3Ige1tbR2V0XV06IHRocm93ZXIsXG4gICAgICAgICAgICAvLyAgIFtbU2V0XV06IHRocm93ZXIsIFtbRW51bWVyYWJsZV1dOiBmYWxzZSwgW1tDb25maWd1cmFibGVdXTogZmFsc2V9LFxuICAgICAgICAgICAgLy8gICBhbmQgZmFsc2UuXG5cbiAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgIC8vIE5PVEUgRnVuY3Rpb24gb2JqZWN0cyBjcmVhdGVkIHVzaW5nIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGRvIG5vdFxuICAgICAgICAgICAgLy8gaGF2ZSBhIHByb3RvdHlwZSBwcm9wZXJ0eSBvciB0aGUgW1tDb2RlXV0sIFtbRm9ybWFsUGFyYW1ldGVyc11dLCBhbmRcbiAgICAgICAgICAgIC8vIFtbU2NvcGVdXSBpbnRlcm5hbCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgLy8gWFhYIGNhbid0IGRlbGV0ZSBwcm90b3R5cGUgaW4gcHVyZS1qcy5cblxuICAgICAgICAgICAgLy8gMjIuIFJldHVybiBGLlxuICAgICAgICAgICAgcmV0dXJuIGJvdW5kO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBfUGxlYXNlIG5vdGU6IFNob3J0Y3V0cyBhcmUgZGVmaW5lZCBhZnRlciBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIGFzIHdlXG4gICAgLy8gdXNlIGl0IGluIGRlZmluaW5nIHNob3J0Y3V0cy5cbiAgICB2YXIgb3ducyA9IGNhbGwuYmluZChPYmplY3RQcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuICAgIHZhciB0b1N0ciA9IGNhbGwuYmluZChPYmplY3RQcm90b3R5cGUudG9TdHJpbmcpO1xuICAgIHZhciBhcnJheVNsaWNlID0gY2FsbC5iaW5kKGFycmF5X3NsaWNlKTtcbiAgICB2YXIgYXJyYXlTbGljZUFwcGx5ID0gYXBwbHkuYmluZChhcnJheV9zbGljZSk7XG4gICAgLyogZ2xvYmFscyBkb2N1bWVudCAqL1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXJyYXlTbGljZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2Rlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHZhciBvcmlnQXJyYXlTbGljZSA9IGFycmF5U2xpY2U7XG4gICAgICAgICAgICB2YXIgb3JpZ0FycmF5U2xpY2VBcHBseSA9IGFycmF5U2xpY2VBcHBseTtcbiAgICAgICAgICAgIGFycmF5U2xpY2UgPSBmdW5jdGlvbiBhcnJheVNsaWNlSUUoYXJyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IGFyci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcltpXSA9IGFycltpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdBcnJheVNsaWNlQXBwbHkociwgb3JpZ0FycmF5U2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJyYXlTbGljZUFwcGx5ID0gZnVuY3Rpb24gYXJyYXlTbGljZUFwcGx5SUUoYXJyLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdBcnJheVNsaWNlQXBwbHkoYXJyYXlTbGljZShhcnIpLCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHN0clNsaWNlID0gY2FsbC5iaW5kKFN0cmluZ1Byb3RvdHlwZS5zbGljZSk7XG4gICAgdmFyIHN0clNwbGl0ID0gY2FsbC5iaW5kKFN0cmluZ1Byb3RvdHlwZS5zcGxpdCk7XG4gICAgdmFyIHN0ckluZGV4T2YgPSBjYWxsLmJpbmQoU3RyaW5nUHJvdG90eXBlLmluZGV4T2YpO1xuICAgIHZhciBwdXNoQ2FsbCA9IGNhbGwuYmluZChhcnJheV9wdXNoKTtcbiAgICB2YXIgaXNFbnVtID0gY2FsbC5iaW5kKE9iamVjdFByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG4gICAgdmFyIGFycmF5U29ydCA9IGNhbGwuYmluZChBcnJheVByb3RvdHlwZS5zb3J0KTtcblxuICAgIC8vXG4gICAgLy8gQXJyYXlcbiAgICAvLyA9PT09PVxuICAgIC8vXG5cbiAgICB2YXIgaXNBcnJheSA9ICRBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7XG4gICAgICAgIHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH07XG5cbiAgICAvLyBFUzUgMTUuNC40LjEyXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjEzXG4gICAgLy8gUmV0dXJuIGxlbithcmdDb3VudC5cbiAgICAvLyBbYnVnZml4LCBpZWx0OF1cbiAgICAvLyBJRSA8IDggYnVnOiBbXS51bnNoaWZ0KDApID09PSB1bmRlZmluZWQgYnV0IHNob3VsZCBiZSBcIjFcIlxuICAgIHZhciBoYXNVbnNoaWZ0UmV0dXJuVmFsdWVCdWcgPSBbXS51bnNoaWZ0KDApICE9PSAxO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgdW5zaGlmdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXJyYXlfdW5zaGlmdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSwgaGFzVW5zaGlmdFJldHVyblZhbHVlQnVnKTtcblxuICAgIC8vIEVTNSAxNS40LjMuMlxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuMy4yXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvaXNBcnJheVxuICAgIGRlZmluZVByb3BlcnRpZXMoJEFycmF5LCB7IGlzQXJyYXk6IGlzQXJyYXkgfSk7XG5cbiAgICAvLyBUaGUgSXNDYWxsYWJsZSgpIGNoZWNrIGluIHRoZSBBcnJheSBmdW5jdGlvbnNcbiAgICAvLyBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgc3RyaWN0IGNoZWNrIG9uIHRoZVxuICAgIC8vIGludGVybmFsIGNsYXNzIG9mIHRoZSBvYmplY3QgdG8gdHJhcCBjYXNlcyB3aGVyZVxuICAgIC8vIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB3YXMgYWN0dWFsbHkgYSByZWd1bGFyXG4gICAgLy8gZXhwcmVzc2lvbiBsaXRlcmFsLCB3aGljaCBpbiBWOCBhbmRcbiAgICAvLyBKYXZhU2NyaXB0Q29yZSBpcyBhIHR5cGVvZiBcImZ1bmN0aW9uXCIuICBPbmx5IGluXG4gICAgLy8gVjggYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFscyBwZXJtaXR0ZWQgYXNcbiAgICAvLyByZWR1Y2UgcGFyYW1ldGVycywgc28gaXQgaXMgZGVzaXJhYmxlIGluIHRoZVxuICAgIC8vIGdlbmVyYWwgY2FzZSBmb3IgdGhlIHNoaW0gdG8gbWF0Y2ggdGhlIG1vcmVcbiAgICAvLyBzdHJpY3QgYW5kIGNvbW1vbiBiZWhhdmlvciBvZiByZWplY3RpbmcgcmVndWxhclxuICAgIC8vIGV4cHJlc3Npb25zLlxuXG4gICAgLy8gRVM1IDE1LjQuNC4xOFxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL2FycmF5L2ZvckVhY2hcblxuICAgIC8vIENoZWNrIGZhaWx1cmUgb2YgYnktaW5kZXggYWNjZXNzIG9mIHN0cmluZyBjaGFyYWN0ZXJzIChJRSA8IDkpXG4gICAgLy8gYW5kIGZhaWx1cmUgb2YgYDAgaW4gYm94ZWRTdHJpbmdgIChSaGlubylcbiAgICB2YXIgYm94ZWRTdHJpbmcgPSAkT2JqZWN0KCdhJyk7XG4gICAgdmFyIHNwbGl0U3RyaW5nID0gYm94ZWRTdHJpbmdbMF0gIT09ICdhJyB8fCAhKDAgaW4gYm94ZWRTdHJpbmcpO1xuXG4gICAgdmFyIHByb3Blcmx5Qm94ZXNDb250ZXh0ID0gZnVuY3Rpb24gcHJvcGVybHlCb3hlZChtZXRob2QpIHtcbiAgICAgICAgLy8gQ2hlY2sgbm9kZSAwLjYuMjEgYnVnIHdoZXJlIHRoaXJkIHBhcmFtZXRlciBpcyBub3QgYm94ZWRcbiAgICAgICAgdmFyIHByb3Blcmx5Qm94ZXNOb25TdHJpY3QgPSB0cnVlO1xuICAgICAgICB2YXIgcHJvcGVybHlCb3hlc1N0cmljdCA9IHRydWU7XG4gICAgICAgIHZhciB0aHJld0V4Y2VwdGlvbiA9IGZhbHNlO1xuICAgICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1ldGhvZC5jYWxsKCdmb28nLCBmdW5jdGlvbiAoXywgX18sIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVybHlCb3hlc05vblN0cmljdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBtZXRob2QuY2FsbChbMV0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgICAgICAgICAgICAgICAgIHByb3Blcmx5Qm94ZXNTdHJpY3QgPSB0eXBlb2YgdGhpcyA9PT0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgfSwgJ3gnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJld0V4Y2VwdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICEhbWV0aG9kICYmICF0aHJld0V4Y2VwdGlvbiAmJiBwcm9wZXJseUJveGVzTm9uU3RyaWN0ICYmIHByb3Blcmx5Qm94ZXNTdHJpY3Q7XG4gICAgfTtcblxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuLyosIHRoaXNBcmcqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBpID0gLTE7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIFQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLmZvckVhY2ggY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBjYWxsLCBwYXNzaW5nIGFyZ3VtZW50czpcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dCwgcHJvcGVydHkgdmFsdWUsIHByb3BlcnR5IGtleSwgdGhpc0FyZyBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tmbi5jYWxsKFQsIHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAhcHJvcGVybHlCb3hlc0NvbnRleHQoQXJyYXlQcm90b3R5cGUuZm9yRWFjaCkpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xOVxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xOVxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvbWFwXG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuLyosIHRoaXNBcmcqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gJEFycmF5KGxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgVDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIFQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUubWFwIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjYWxsYmFja2ZuKHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBjYWxsYmFja2ZuLmNhbGwoVCwgc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9LCAhcHJvcGVybHlCb3hlc0NvbnRleHQoQXJyYXlQcm90b3R5cGUubWFwKSk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjIwXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIwXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9maWx0ZXJcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4vKiwgdGhpc0FyZyovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIHZhciBUO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgVCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maWx0ZXIgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IGNhbGxiYWNrZm4odmFsdWUsIGksIG9iamVjdCkgOiBjYWxsYmFja2ZuLmNhbGwoVCwgdmFsdWUsIGksIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0sICFwcm9wZXJseUJveGVzQ29udGV4dChBcnJheVByb3RvdHlwZS5maWx0ZXIpKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTZcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTZcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9ldmVyeVxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4vKiwgdGhpc0FyZyovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBUO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgVCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5ldmVyeSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYgJiYgISh0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFja2ZuKHNlbGZbaV0sIGksIG9iamVjdCkgOiBjYWxsYmFja2ZuLmNhbGwoVCwgc2VsZltpXSwgaSwgb2JqZWN0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSwgIXByb3Blcmx5Qm94ZXNDb250ZXh0KEFycmF5UHJvdG90eXBlLmV2ZXJ5KSk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjE3XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjE3XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29tZVxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuLyosIHRoaXNBcmcgKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIFQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnNvbWUgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICh0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFja2ZuKHNlbGZbaV0sIGksIG9iamVjdCkgOiBjYWxsYmFja2ZuLmNhbGwoVCwgc2VsZltpXSwgaSwgb2JqZWN0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSwgIXByb3Blcmx5Qm94ZXNDb250ZXh0KEFycmF5UHJvdG90eXBlLnNvbWUpKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMjFcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMjFcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L3JlZHVjZVxuICAgIHZhciByZWR1Y2VDb2VyY2VzVG9PYmplY3QgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXlQcm90b3R5cGUucmVkdWNlKSB7XG4gICAgICAgIHJlZHVjZUNvZXJjZXNUb09iamVjdCA9IHR5cGVvZiBBcnJheVByb3RvdHlwZS5yZWR1Y2UuY2FsbCgnZXM1JywgZnVuY3Rpb24gKF8sIF9fLCBfX18sIGxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9KSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbi8qLCBpbml0aWFsVmFsdWUqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUucmVkdWNlIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpKytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tmbihyZXN1bHQsIHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSwgIXJlZHVjZUNvZXJjZXNUb09iamVjdCk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjIyXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuNC40LjIyXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9yZWR1Y2VSaWdodFxuICAgIHZhciByZWR1Y2VSaWdodENvZXJjZXNUb09iamVjdCA9IGZhbHNlO1xuICAgIGlmIChBcnJheVByb3RvdHlwZS5yZWR1Y2VSaWdodCkge1xuICAgICAgICByZWR1Y2VSaWdodENvZXJjZXNUb09iamVjdCA9IHR5cGVvZiBBcnJheVByb3RvdHlwZS5yZWR1Y2VSaWdodC5jYWxsKCdlczUnLCBmdW5jdGlvbiAoXywgX18sIF9fXywgbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH0pID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbi8qLCBpbml0aWFsKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBubyB2YWx1ZSB0byByZXR1cm4gaWYgbm8gaW5pdGlhbCB2YWx1ZSwgZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgdmFyIGkgPSBsZW5ndGggLSAxO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2ktLV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGFycmF5IGNvbnRhaW5zIG5vIHZhbHVlcywgbm8gaW5pdGlhbCB2YWx1ZSB0byByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgaWYgKC0taSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrZm4ocmVzdWx0LCBzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKGktLSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9LCAhcmVkdWNlUmlnaHRDb2VyY2VzVG9PYmplY3QpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xNFxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xNFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2ZcbiAgICB2YXIgaGFzRmlyZWZveDJJbmRleE9mQnVnID0gQXJyYXlQcm90b3R5cGUuaW5kZXhPZiAmJiBbMCwgMV0uaW5kZXhPZigxLCAyKSAhPT0gLTE7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQvKiwgZnJvbUluZGV4ICovKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpID0gRVMuVG9JbnRlZ2VyKGFyZ3VtZW50c1sxXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhhbmRsZSBuZWdhdGl2ZSBpbmRpY2VzXG4gICAgICAgICAgICBpID0gaSA+PSAwID8gaSA6IG1heCgwLCBsZW5ndGggKyBpKTtcbiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNlbGZbaV0gPT09IHNlYXJjaEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfSwgaGFzRmlyZWZveDJJbmRleE9mQnVnKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTVcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS40LjQuMTVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9sYXN0SW5kZXhPZlxuICAgIHZhciBoYXNGaXJlZm94Mkxhc3RJbmRleE9mQnVnID0gQXJyYXlQcm90b3R5cGUubGFzdEluZGV4T2YgJiYgWzAsIDFdLmxhc3RJbmRleE9mKDAsIC0zKSAhPT0gLTE7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudC8qLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG5cbiAgICAgICAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaSA9IGxlbmd0aCAtIDE7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBpID0gbWluKGksIEVTLlRvSW50ZWdlcihhcmd1bWVudHNbMV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZSBuZWdhdGl2ZSBpbmRpY2VzXG4gICAgICAgICAgICBpID0gaSA+PSAwID8gaSA6IGxlbmd0aCAtIE1hdGguYWJzKGkpO1xuICAgICAgICAgICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWFyY2hFbGVtZW50ID09PSBzZWxmW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH0sIGhhc0ZpcmVmb3gyTGFzdEluZGV4T2ZCdWcpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xMlxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjQuNC4xMlxuICAgIHZhciBzcGxpY2VOb29wUmV0dXJuc0VtcHR5QXJyYXkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYSA9IFsxLCAyXTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGEuc3BsaWNlKCk7XG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gMiAmJiBpc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA9PT0gMDtcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgLy8gU2FmYXJpIDUuMCBidWcgd2hlcmUgLnNwbGljZSgpIHJldHVybnMgdW5kZWZpbmVkXG4gICAgICAgIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheV9zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sICFzcGxpY2VOb29wUmV0dXJuc0VtcHR5QXJyYXkpO1xuXG4gICAgdmFyIHNwbGljZVdvcmtzV2l0aEVtcHR5T2JqZWN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9iaiA9IHt9O1xuICAgICAgICBBcnJheVByb3RvdHlwZS5zcGxpY2UuY2FsbChvYmosIDAsIDAsIDEpO1xuICAgICAgICByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMTtcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBtYXgoRVMuVG9JbnRlZ2VyKHRoaXMubGVuZ3RoKSwgMCk7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIGRlbGV0ZUNvdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBhcnJheVNsaWNlKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChhcmdzLCB0aGlzLmxlbmd0aCAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdzWzFdID0gRVMuVG9JbnRlZ2VyKGRlbGV0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlfc3BsaWNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfSwgIXNwbGljZVdvcmtzV2l0aEVtcHR5T2JqZWN0KTtcbiAgICB2YXIgc3BsaWNlV29ya3NXaXRoTGFyZ2VTcGFyc2VBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8yOTVcbiAgICAgICAgLy8gU2FmYXJpIDcvOCBicmVha3Mgd2l0aCBzcGFyc2UgYXJyYXlzIG9mIHNpemUgMWU1IG9yIGdyZWF0ZXJcbiAgICAgICAgdmFyIGFyciA9IG5ldyAkQXJyYXkoMWU1KTtcbiAgICAgICAgLy8gbm90ZTogdGhlIGluZGV4IE1VU1QgYmUgOCBvciBsYXJnZXIgb3IgdGhlIHRlc3Qgd2lsbCBmYWxzZSBwYXNzXG4gICAgICAgIGFycls4XSA9ICd4JztcbiAgICAgICAgYXJyLnNwbGljZSgxLCAxKTtcbiAgICAgICAgLy8gbm90ZTogdGhpcyB0ZXN0IG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIHRoZSBpbmRleE9mIHNoaW1cbiAgICAgICAgLy8gcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMzEzXG4gICAgICAgIHJldHVybiBhcnIuaW5kZXhPZigneCcpID09PSA3O1xuICAgIH0oKSk7XG4gICAgdmFyIHNwbGljZVdvcmtzV2l0aFNtYWxsU3BhcnNlQXJyYXlzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMjk1XG4gICAgICAgIC8vIE9wZXJhIDEyLjE1IGJyZWFrcyBvbiB0aGlzLCBubyBpZGVhIHdoeS5cbiAgICAgICAgdmFyIG4gPSAyNTY7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcbiAgICAgICAgYXJyW25dID0gJ2EnO1xuICAgICAgICBhcnIuc3BsaWNlKG4gKyAxLCAwLCAnYicpO1xuICAgICAgICByZXR1cm4gYXJyW25dID09PSAnYSc7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkge1xuICAgICAgICAgICAgdmFyIE8gPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBBID0gW107XG4gICAgICAgICAgICB2YXIgbGVuID0gRVMuVG9VaW50MzIoTy5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aXZlU3RhcnQgPSBFUy5Ub0ludGVnZXIoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGFjdHVhbFN0YXJ0ID0gcmVsYXRpdmVTdGFydCA8IDAgPyBtYXgoKGxlbiArIHJlbGF0aXZlU3RhcnQpLCAwKSA6IG1pbihyZWxhdGl2ZVN0YXJ0LCBsZW4pO1xuICAgICAgICAgICAgdmFyIGFjdHVhbERlbGV0ZUNvdW50ID0gbWluKG1heChFUy5Ub0ludGVnZXIoZGVsZXRlQ291bnQpLCAwKSwgbGVuIC0gYWN0dWFsU3RhcnQpO1xuXG4gICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICB2YXIgZnJvbTtcbiAgICAgICAgICAgIHdoaWxlIChrIDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gJFN0cmluZyhhY3R1YWxTdGFydCArIGspO1xuICAgICAgICAgICAgICAgIGlmIChvd25zKE8sIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIEFba10gPSBPW2Zyb21dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrICs9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpdGVtcyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICAgICAgICAgIHZhciBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdG87XG4gICAgICAgICAgICBpZiAoaXRlbUNvdW50IDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBrID0gYWN0dWFsU3RhcnQ7XG4gICAgICAgICAgICAgICAgdmFyIG1heEsgPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoayA8IG1heEspIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICRTdHJpbmcoayArIGFjdHVhbERlbGV0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG8gPSAkU3RyaW5nKGsgKyBpdGVtQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ducyhPLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9bdG9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgayA9IGxlbjtcbiAgICAgICAgICAgICAgICB2YXIgbWluSyA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaXRlbUNvdW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChrID4gbWluSykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1trIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGsgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1Db3VudCA+IGFjdHVhbERlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgayA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChrID4gYWN0dWFsU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICRTdHJpbmcoayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHRvID0gJFN0cmluZyhrICsgaXRlbUNvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25zKE8sIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1t0b107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgayAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgPSBhY3R1YWxTdGFydDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBPW2tdID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgayArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTy5sZW5ndGggPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGl0ZW1Db3VudDtcblxuICAgICAgICAgICAgcmV0dXJuIEE7XG4gICAgICAgIH1cbiAgICB9LCAhc3BsaWNlV29ya3NXaXRoTGFyZ2VTcGFyc2VBcnJheXMgfHwgIXNwbGljZVdvcmtzV2l0aFNtYWxsU3BhcnNlQXJyYXlzKTtcblxuICAgIHZhciBvcmlnaW5hbEpvaW4gPSBBcnJheVByb3RvdHlwZS5qb2luO1xuICAgIHZhciBoYXNTdHJpbmdKb2luQnVnO1xuICAgIHRyeSB7XG4gICAgICAgIGhhc1N0cmluZ0pvaW5CdWcgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKCcxMjMnLCAnLCcpICE9PSAnMSwyLDMnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFzU3RyaW5nSm9pbkJ1ZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNTdHJpbmdKb2luQnVnKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlcCA9IHR5cGVvZiBzZXBhcmF0b3IgPT09ICd1bmRlZmluZWQnID8gJywnIDogc2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEpvaW4uY2FsbChpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IHRoaXMsIHNlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGhhc1N0cmluZ0pvaW5CdWcpO1xuICAgIH1cblxuICAgIHZhciBoYXNKb2luVW5kZWZpbmVkQnVnID0gWzEsIDJdLmpvaW4odW5kZWZpbmVkKSAhPT0gJzEsMic7XG4gICAgaWYgKGhhc0pvaW5VbmRlZmluZWRCdWcpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICAgICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VwID0gdHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyAnLCcgOiBzZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSm9pbi5jYWxsKHRoaXMsIHNlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGhhc0pvaW5VbmRlZmluZWRCdWcpO1xuICAgIH1cblxuICAgIHZhciBwdXNoU2hpbSA9IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgICAgICB2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICB2YXIgbiA9IEVTLlRvVWludDMyKE8ubGVuZ3RoKTtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIE9bbiArIGldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIE8ubGVuZ3RoID0gbiArIGk7XG4gICAgICAgIHJldHVybiBuICsgaTtcbiAgICB9O1xuXG4gICAgdmFyIHB1c2hJc05vdEdlbmVyaWMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKG9iaiwgdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMSB8fCBvYmoubGVuZ3RoICE9PSAxIHx8IHR5cGVvZiBvYmpbMF0gIT09ICd1bmRlZmluZWQnIHx8ICFvd25zKG9iaiwgMCk7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkodGhpcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlfcHVzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHB1c2hTaGltLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9LCBwdXNoSXNOb3RHZW5lcmljKTtcblxuICAgIC8vIFRoaXMgZml4ZXMgYSB2ZXJ5IHdlaXJkIGJ1ZyBpbiBPcGVyYSAxMC42IHdoZW4gcHVzaGluZyBgdW5kZWZpbmVkXG4gICAgdmFyIHB1c2hVbmRlZmluZWRJc1dlaXJkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuICAgICAgICB2YXIgcmVzdWx0ID0gYXJyLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMSB8fCBhcnIubGVuZ3RoICE9PSAxIHx8IHR5cGVvZiBhcnJbMF0gIT09ICd1bmRlZmluZWQnIHx8ICFvd25zKGFyciwgMCk7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7IHB1c2g6IHB1c2hTaGltIH0sIHB1c2hVbmRlZmluZWRJc1dlaXJkKTtcblxuICAgIC8vIEVTNSAxNS4yLjMuMTRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4xMFxuICAgIC8vIEZpeCBib3hlZCBzdHJpbmcgYnVnXG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzbGljZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIHZhciBhcnIgPSBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlTbGljZUFwcGx5KGFyciwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH0sIHNwbGl0U3RyaW5nKTtcblxuICAgIHZhciBzb3J0SWdub3Jlc05vbkZ1bmN0aW9ucyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbMSwgMl0uc29ydChudWxsKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBbMSwgMl0uc29ydCh7fSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KCkpO1xuICAgIHZhciBzb3J0VGhyb3dzT25SZWdleCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBwcm9ibGVtIGluIEZpcmVmb3ggNCwgaW4gd2hpY2ggYHR5cGVvZiAvYS8gPT09ICdmdW5jdGlvbidgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbMSwgMl0uc29ydCgvYS8pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KCkpO1xuICAgIHZhciBzb3J0SWdub3Jlc1VuZGVmaW5lZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGFwcGxpZXMgaW4gSUUgOCwgZm9yIG9uZS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFsxLCAyXS5zb3J0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVGbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wYXJlRm4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5U29ydCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjb21wYXJlRm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnNvcnQgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlTb3J0KHRoaXMsIGNvbXBhcmVGbik7XG4gICAgICAgIH1cbiAgICB9LCBzb3J0SWdub3Jlc05vbkZ1bmN0aW9ucyB8fCAhc29ydElnbm9yZXNVbmRlZmluZWQgfHwgIXNvcnRUaHJvd3NPblJlZ2V4KTtcblxuICAgIC8vXG4gICAgLy8gT2JqZWN0XG4gICAgLy8gPT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTNSAxNS4yLjMuMTRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTRcblxuICAgIC8vIGh0dHA6Ly93aGF0dGhlaGVhZHNhaWQuY29tLzIwMTAvMTAvYS1zYWZlci1vYmplY3Qta2V5cy1jb21wYXRpYmlsaXR5LWltcGxlbWVudGF0aW9uXG4gICAgdmFyIGhhc0RvbnRFbnVtQnVnID0gIWlzRW51bSh7ICd0b1N0cmluZyc6IG51bGwgfSwgJ3RvU3RyaW5nJyk7IC8vIGpzY3M6aWdub3JlIGRpc2FsbG93UXVvdGVkS2V5c0luT2JqZWN0c1xuICAgIHZhciBoYXNQcm90b0VudW1CdWcgPSBpc0VudW0oZnVuY3Rpb24gKCkge30sICdwcm90b3R5cGUnKTtcbiAgICB2YXIgaGFzU3RyaW5nRW51bUJ1ZyA9ICFvd25zKCd4JywgJzAnKTtcbiAgICB2YXIgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgICB2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiBjdG9yICYmIGN0b3IucHJvdG90eXBlID09PSBvO1xuICAgIH07XG4gICAgdmFyIGV4Y2x1ZGVkS2V5cyA9IHtcbiAgICAgICAgJGFwcGxpY2F0aW9uQ2FjaGU6IHRydWUsXG4gICAgICAgICRjb25zb2xlOiB0cnVlLFxuICAgICAgICAkZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICRmcmFtZTogdHJ1ZSxcbiAgICAgICAgJGZyYW1lRWxlbWVudDogdHJ1ZSxcbiAgICAgICAgJGZyYW1lczogdHJ1ZSxcbiAgICAgICAgJGlubmVySGVpZ2h0OiB0cnVlLFxuICAgICAgICAkaW5uZXJXaWR0aDogdHJ1ZSxcbiAgICAgICAgJG9ubW96ZnVsbHNjcmVlbmNoYW5nZTogdHJ1ZSxcbiAgICAgICAgJG9ubW96ZnVsbHNjcmVlbmVycm9yOiB0cnVlLFxuICAgICAgICAkb3V0ZXJIZWlnaHQ6IHRydWUsXG4gICAgICAgICRvdXRlcldpZHRoOiB0cnVlLFxuICAgICAgICAkcGFnZVhPZmZzZXQ6IHRydWUsXG4gICAgICAgICRwYWdlWU9mZnNldDogdHJ1ZSxcbiAgICAgICAgJHBhcmVudDogdHJ1ZSxcbiAgICAgICAgJHNjcm9sbExlZnQ6IHRydWUsXG4gICAgICAgICRzY3JvbGxUb3A6IHRydWUsXG4gICAgICAgICRzY3JvbGxYOiB0cnVlLFxuICAgICAgICAkc2Nyb2xsWTogdHJ1ZSxcbiAgICAgICAgJHNlbGY6IHRydWUsXG4gICAgICAgICR3ZWJraXRJbmRleGVkREI6IHRydWUsXG4gICAgICAgICR3ZWJraXRTdG9yYWdlSW5mbzogdHJ1ZSxcbiAgICAgICAgJHdpbmRvdzogdHJ1ZSxcblxuICAgICAgICAkd2lkdGg6IHRydWUsXG4gICAgICAgICRoZWlnaHQ6IHRydWUsXG4gICAgICAgICR0b3A6IHRydWUsXG4gICAgICAgICRsb2NhbFN0b3JhZ2U6IHRydWVcbiAgICB9O1xuICAgIHZhciBoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiBnbG9iYWxzIHdpbmRvdyAqL1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBrIGluIHdpbmRvdykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1ZGVkS2V5c1snJCcgKyBrXSAmJiBvd25zKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKHdpbmRvd1trXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KCkpO1xuICAgIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAhaGFzQXV0b21hdGlvbkVxdWFsaXR5QnVnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG9iamVjdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGRvbnRFbnVtcyA9IFtcbiAgICAgICAgJ3RvU3RyaW5nJyxcbiAgICAgICAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgICAgICAgJ3ZhbHVlT2YnLFxuICAgICAgICAnaGFzT3duUHJvcGVydHknLFxuICAgICAgICAnaXNQcm90b3R5cGVPZicsXG4gICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXG4gICAgICAgICdjb25zdHJ1Y3RvcidcbiAgICBdO1xuICAgIHZhciBkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xuXG4gICAgLy8gdGFrZW4gZGlyZWN0bHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2lzLWFyZ3VtZW50cy9ibG9iL21hc3Rlci9pbmRleC5qc1xuICAgIC8vIGNhbiBiZSByZXBsYWNlZCB3aXRoIHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpIGlmIHdlIGV2ZXIgdXNlIGEgYnVpbGQgcHJvY2VzcyBpbnN0ZWFkXG4gICAgdmFyIGlzU3RhbmRhcmRBcmd1bWVudHMgPSBmdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHIodmFsdWUpID09PSAnW29iamVjdCBBcmd1bWVudHNdJztcbiAgICB9O1xuICAgIHZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbFxuICAgICAgICAgICAgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgJiYgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICYmIHZhbHVlLmxlbmd0aCA+PSAwXG4gICAgICAgICAgICAmJiAhaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICYmIGlzQ2FsbGFibGUodmFsdWUuY2FsbGVlKTtcbiAgICB9O1xuICAgIHZhciBpc0FyZ3VtZW50cyA9IGlzU3RhbmRhcmRBcmd1bWVudHMoYXJndW1lbnRzKSA/IGlzU3RhbmRhcmRBcmd1bWVudHMgOiBpc0xlZ2FjeUFyZ3VtZW50cztcblxuICAgIGRlZmluZVByb3BlcnRpZXMoJE9iamVjdCwge1xuICAgICAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGlzRm4gPSBpc0NhbGxhYmxlKG9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaXNBcmdzID0gaXNBcmd1bWVudHMob2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBpc09iamVjdCA9IG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JztcbiAgICAgICAgICAgIHZhciBpc1N0ciA9IGlzT2JqZWN0ICYmIGlzU3RyaW5nKG9iamVjdCk7XG5cbiAgICAgICAgICAgIGlmICghaXNPYmplY3QgJiYgIWlzRm4gJiYgIWlzQXJncykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRoZUtleXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBza2lwUHJvdG8gPSBoYXNQcm90b0VudW1CdWcgJiYgaXNGbjtcbiAgICAgICAgICAgIGlmICgoaXNTdHIgJiYgaGFzU3RyaW5nRW51bUJ1ZykgfHwgaXNBcmdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwodGhlS2V5cywgJFN0cmluZyhpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzQXJncykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHNraXBQcm90byAmJiBuYW1lID09PSAncHJvdG90eXBlJykgJiYgb3ducyhvYmplY3QsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbCh0aGVLZXlzLCAkU3RyaW5nKG5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNraXBDb25zdHJ1Y3RvciA9IGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneShvYmplY3QpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9udEVudW1zTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvbnRFbnVtID0gZG9udEVudW1zW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShza2lwQ29uc3RydWN0b3IgJiYgZG9udEVudW0gPT09ICdjb25zdHJ1Y3RvcicpICYmIG93bnMob2JqZWN0LCBkb250RW51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKHRoZUtleXMsIGRvbnRFbnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGVLZXlzO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cyA9ICRPYmplY3Qua2V5cyAmJiAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBTYWZhcmkgNS4wIGJ1Z1xuICAgICAgICByZXR1cm4gJE9iamVjdC5rZXlzKGFyZ3VtZW50cykubGVuZ3RoID09PSAyO1xuICAgIH0oMSwgMikpO1xuICAgIHZhciBrZXlzSGFzQXJndW1lbnRzTGVuZ3RoQnVnID0gJE9iamVjdC5rZXlzICYmIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdLZXlzID0gJE9iamVjdC5rZXlzKGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoICE9PSAxIHx8IGFyZ0tleXMubGVuZ3RoICE9PSAxIHx8IGFyZ0tleXNbMF0gIT09IDE7XG4gICAgfSgxKSk7XG4gICAgdmFyIG9yaWdpbmFsS2V5cyA9ICRPYmplY3Qua2V5cztcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKCRPYmplY3QsIHtcbiAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsS2V5cyhhcnJheVNsaWNlKG9iamVjdCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAha2V5c1dvcmtzV2l0aEFyZ3VtZW50cyB8fCBrZXlzSGFzQXJndW1lbnRzTGVuZ3RoQnVnKTtcblxuICAgIC8vXG4gICAgLy8gRGF0ZVxuICAgIC8vID09PT1cbiAgICAvL1xuXG4gICAgdmFyIGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnID0gbmV3IERhdGUoLTM1MDk4MjczMjk2MDAyOTIpLmdldFVUQ01vbnRoKCkgIT09IDA7XG4gICAgdmFyIGFOZWdhdGl2ZVRlc3REYXRlID0gbmV3IERhdGUoLTE1MDk4NDIyODk2MDAyOTIpO1xuICAgIHZhciBhUG9zaXRpdmVUZXN0RGF0ZSA9IG5ldyBEYXRlKDE0NDk2NjI0MDAwMDApO1xuICAgIHZhciBoYXNUb1VUQ1N0cmluZ0Zvcm1hdEJ1ZyA9IGFOZWdhdGl2ZVRlc3REYXRlLnRvVVRDU3RyaW5nKCkgIT09ICdNb24sIDAxIEphbiAtNDU4NzUgMTE6NTk6NTkgR01UJztcbiAgICB2YXIgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnO1xuICAgIHZhciBoYXNUb1N0cmluZ0Zvcm1hdEJ1ZztcbiAgICB2YXIgdGltZVpvbmVPZmZzZXQgPSBhTmVnYXRpdmVUZXN0RGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIGlmICh0aW1lWm9uZU9mZnNldCA8IC03MjApIHtcbiAgICAgICAgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnID0gYU5lZ2F0aXZlVGVzdERhdGUudG9EYXRlU3RyaW5nKCkgIT09ICdUdWUgSmFuIDAyIC00NTg3NSc7XG4gICAgICAgIGhhc1RvU3RyaW5nRm9ybWF0QnVnID0gISgvXlRodSBEZWMgMTAgMjAxNSBcXGRcXGQ6XFxkXFxkOlxcZFxcZCBHTVRbLStdXFxkXFxkXFxkXFxkKD86IHwkKS8pLnRlc3QoU3RyaW5nKGFQb3NpdGl2ZVRlc3REYXRlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnID0gYU5lZ2F0aXZlVGVzdERhdGUudG9EYXRlU3RyaW5nKCkgIT09ICdNb24gSmFuIDAxIC00NTg3NSc7XG4gICAgICAgIGhhc1RvU3RyaW5nRm9ybWF0QnVnID0gISgvXldlZCBEZWMgMDkgMjAxNSBcXGRcXGQ6XFxkXFxkOlxcZFxcZCBHTVRbLStdXFxkXFxkXFxkXFxkKD86IHwkKS8pLnRlc3QoU3RyaW5nKGFQb3NpdGl2ZVRlc3REYXRlKSk7XG4gICAgfVxuXG4gICAgdmFyIG9yaWdpbmFsR2V0RnVsbFllYXIgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0RnVsbFllYXIpO1xuICAgIHZhciBvcmlnaW5hbEdldE1vbnRoID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldE1vbnRoKTtcbiAgICB2YXIgb3JpZ2luYWxHZXREYXRlID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldERhdGUpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ0Z1bGxZZWFyID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0Z1bGxZZWFyKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENNb250aCA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENNb250aCk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDRGF0ZSA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENEYXRlKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENEYXkgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDRGF5KTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENIb3VycyA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENIb3Vycyk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDTWludXRlcyA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENNaW51dGVzKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENTZWNvbmRzID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ1NlY29uZHMpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ01pbGxpc2Vjb25kcyA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENNaWxsaXNlY29uZHMpO1xuICAgIHZhciBkYXlOYW1lID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXTtcbiAgICB2YXIgbW9udGhOYW1lID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIHZhciBkYXlzSW5Nb250aCA9IGZ1bmN0aW9uIGRheXNJbk1vbnRoKG1vbnRoLCB5ZWFyKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbEdldERhdGUobmV3IERhdGUoeWVhciwgbW9udGgsIDApKTtcbiAgICB9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhEYXRlLnByb3RvdHlwZSwge1xuICAgICAgICBnZXRGdWxsWWVhcjogZnVuY3Rpb24gZ2V0RnVsbFllYXIoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldEZ1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG9yaWdpbmFsR2V0TW9udGgodGhpcykgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5ZWFyICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5ZWFyO1xuICAgICAgICB9LFxuICAgICAgICBnZXRNb250aDogZnVuY3Rpb24gZ2V0TW9udGgoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldEZ1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gb3JpZ2luYWxHZXRNb250aCh0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9udGg7XG4gICAgICAgIH0sXG4gICAgICAgIGdldERhdGU6IGZ1bmN0aW9uIGdldERhdGUoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldEZ1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gb3JpZ2luYWxHZXRNb250aCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gb3JpZ2luYWxHZXREYXRlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG1vbnRoID4gMTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9udGggPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGF5cyA9IGRheXNJbk1vbnRoKDAsIHllYXIgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGRheXMgLSBkYXRlKSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VVRDRnVsbFllYXI6IGZ1bmN0aW9uIGdldFVUQ0Z1bGxZZWFyKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRVVENGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBvcmlnaW5hbEdldFVUQ01vbnRoKHRoaXMpID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWVhciArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWVhcjtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VVRDTW9udGg6IGZ1bmN0aW9uIGdldFVUQ01vbnRoKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRVVENGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgbW9udGggPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vbnRoO1xuICAgICAgICB9LFxuICAgICAgICBnZXRVVENEYXRlOiBmdW5jdGlvbiBnZXRVVENEYXRlKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRVVENGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG9yaWdpbmFsR2V0VVRDRGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRheXMgPSBkYXlzSW5Nb250aCgwLCB5ZWFyICsgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChkYXlzIC0gZGF0ZSkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH1cbiAgICB9LCBoYXNOZWdhdGl2ZU1vbnRoWWVhckJ1Zyk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIHRvVVRDU3RyaW5nOiBmdW5jdGlvbiB0b1VUQ1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGF5ID0gb3JpZ2luYWxHZXRVVENEYXkodGhpcyk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IG9yaWdpbmFsR2V0VVRDRGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICB2YXIgaG91ciA9IG9yaWdpbmFsR2V0VVRDSG91cnModGhpcyk7XG4gICAgICAgICAgICB2YXIgbWludXRlID0gb3JpZ2luYWxHZXRVVENNaW51dGVzKHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlY29uZCA9IG9yaWdpbmFsR2V0VVRDU2Vjb25kcyh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBkYXlOYW1lW2RheV0gKyAnLCAnXG4gICAgICAgICAgICAgICAgKyAoZGF0ZSA8IDEwID8gJzAnICsgZGF0ZSA6IGRhdGUpICsgJyAnXG4gICAgICAgICAgICAgICAgKyBtb250aE5hbWVbbW9udGhdICsgJyAnXG4gICAgICAgICAgICAgICAgKyB5ZWFyICsgJyAnXG4gICAgICAgICAgICAgICAgKyAoaG91ciA8IDEwID8gJzAnICsgaG91ciA6IGhvdXIpICsgJzonXG4gICAgICAgICAgICAgICAgKyAobWludXRlIDwgMTAgPyAnMCcgKyBtaW51dGUgOiBtaW51dGUpICsgJzonXG4gICAgICAgICAgICAgICAgKyAoc2Vjb25kIDwgMTAgPyAnMCcgKyBzZWNvbmQgOiBzZWNvbmQpICsgJyBHTVQnO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVNb250aFllYXJCdWcgfHwgaGFzVG9VVENTdHJpbmdGb3JtYXRCdWcpO1xuXG4gICAgLy8gT3BlcmEgMTIgaGFzIGAsYFxuICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZS5wcm90b3R5cGUsIHtcbiAgICAgICAgdG9EYXRlU3RyaW5nOiBmdW5jdGlvbiB0b0RhdGVTdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRheSA9IHRoaXMuZ2V0RGF5KCk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IHRoaXMuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gdGhpcy5nZXRNb250aCgpO1xuICAgICAgICAgICAgdmFyIHllYXIgPSB0aGlzLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF5TmFtZVtkYXldICsgJyAnXG4gICAgICAgICAgICAgICAgKyBtb250aE5hbWVbbW9udGhdICsgJyAnXG4gICAgICAgICAgICAgICAgKyAoZGF0ZSA8IDEwID8gJzAnICsgZGF0ZSA6IGRhdGUpICsgJyAnXG4gICAgICAgICAgICAgICAgKyB5ZWFyO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVNb250aFllYXJCdWcgfHwgaGFzVG9EYXRlU3RyaW5nRm9ybWF0QnVnKTtcblxuICAgIC8vIGNhbid0IHVzZSBkZWZpbmVQcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSBvZiB0b1N0cmluZyBlbnVtZXJhdGlvbiBpc3N1ZSBpbiBJRSA8PSA4XG4gICAgaWYgKGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnIHx8IGhhc1RvU3RyaW5nRm9ybWF0QnVnKSB7XG4gICAgICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRheSA9IHRoaXMuZ2V0RGF5KCk7XG4gICAgICAgICAgICB2YXIgZGF0ZSA9IHRoaXMuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gdGhpcy5nZXRNb250aCgpO1xuICAgICAgICAgICAgdmFyIHllYXIgPSB0aGlzLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICB2YXIgaG91ciA9IHRoaXMuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgIHZhciBtaW51dGUgPSB0aGlzLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgIHZhciBzZWNvbmQgPSB0aGlzLmdldFNlY29uZHMoKTtcbiAgICAgICAgICAgIHZhciB0aW1lem9uZU9mZnNldCA9IHRoaXMuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICAgIHZhciBob3Vyc09mZnNldCA9IE1hdGguZmxvb3IoTWF0aC5hYnModGltZXpvbmVPZmZzZXQpIC8gNjApO1xuICAgICAgICAgICAgdmFyIG1pbnV0ZXNPZmZzZXQgPSBNYXRoLmZsb29yKE1hdGguYWJzKHRpbWV6b25lT2Zmc2V0KSAlIDYwKTtcbiAgICAgICAgICAgIHJldHVybiBkYXlOYW1lW2RheV0gKyAnICdcbiAgICAgICAgICAgICAgICArIG1vbnRoTmFtZVttb250aF0gKyAnICdcbiAgICAgICAgICAgICAgICArIChkYXRlIDwgMTAgPyAnMCcgKyBkYXRlIDogZGF0ZSkgKyAnICdcbiAgICAgICAgICAgICAgICArIHllYXIgKyAnICdcbiAgICAgICAgICAgICAgICArIChob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cikgKyAnOidcbiAgICAgICAgICAgICAgICArIChtaW51dGUgPCAxMCA/ICcwJyArIG1pbnV0ZSA6IG1pbnV0ZSkgKyAnOidcbiAgICAgICAgICAgICAgICArIChzZWNvbmQgPCAxMCA/ICcwJyArIHNlY29uZCA6IHNlY29uZCkgKyAnIEdNVCdcbiAgICAgICAgICAgICAgICArICh0aW1lem9uZU9mZnNldCA+IDAgPyAnLScgOiAnKycpXG4gICAgICAgICAgICAgICAgKyAoaG91cnNPZmZzZXQgPCAxMCA/ICcwJyArIGhvdXJzT2Zmc2V0IDogaG91cnNPZmZzZXQpXG4gICAgICAgICAgICAgICAgKyAobWludXRlc09mZnNldCA8IDEwID8gJzAnICsgbWludXRlc09mZnNldCA6IG1pbnV0ZXNPZmZzZXQpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRlLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuOS41LjQzXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS41LjQzXG4gICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZVxuICAgIC8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lXG4gICAgLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLlxuICAgIC8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mXG4gICAgLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICB2YXIgbmVnYXRpdmVEYXRlID0gLTYyMTk4NzU1MjAwMDAwO1xuICAgIHZhciBuZWdhdGl2ZVllYXJTdHJpbmcgPSAnLTAwMDAwMSc7XG4gICAgdmFyIGhhc05lZ2F0aXZlRGF0ZUJ1ZyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICYmIG5ldyBEYXRlKG5lZ2F0aXZlRGF0ZSkudG9JU09TdHJpbmcoKS5pbmRleE9mKG5lZ2F0aXZlWWVhclN0cmluZykgPT09IC0xOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICB2YXIgaGFzU2FmYXJpNTFEYXRlQnVnID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgbmV3IERhdGUoLTEpLnRvSVNPU3RyaW5nKCkgIT09ICcxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVonO1xuXG4gICAgdmFyIGdldFRpbWUgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodGhpcykgfHwgIWlzRmluaXRlKGdldFRpbWUodGhpcykpKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRvcGUgUGhvdG9zaG9wIHJlcXVpcmVzIHRoZSBzZWNvbmQgY2hlY2suXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0RhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIGNhbGxlZCBvbiBub24tZmluaXRlIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xMTFcbiAgICAgICAgICAgIHllYXIgKz0gTWF0aC5mbG9vcihtb250aCAvIDEyKTtcbiAgICAgICAgICAgIG1vbnRoID0gKChtb250aCAlIDEyKSArIDEyKSAlIDEyO1xuXG4gICAgICAgICAgICAvLyB0aGUgZGF0ZSB0aW1lIHN0cmluZyBmb3JtYXQgaXMgc3BlY2lmaWVkIGluIDE1LjkuMS4xNS5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgbW9udGggKyAxLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsR2V0VVRDRGF0ZSh0aGlzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEdldFVUQ0hvdXJzKHRoaXMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsR2V0VVRDTWludXRlcyh0aGlzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEdldFVUQ1NlY29uZHModGhpcylcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB5ZWFyID0gKFxuICAgICAgICAgICAgICAgICh5ZWFyIDwgMCA/ICctJyA6ICh5ZWFyID4gOTk5OSA/ICcrJyA6ICcnKSlcbiAgICAgICAgICAgICAgICArIHN0clNsaWNlKCcwMDAwMCcgKyBNYXRoLmFicyh5ZWFyKSwgKDAgPD0geWVhciAmJiB5ZWFyIDw9IDk5OTkpID8gLTQgOiAtNilcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gcGFkIG1vbnRocywgZGF5cywgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzIHRvIGhhdmUgdHdvIGRpZ2l0cy5cbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBzdHJTbGljZSgnMDAnICsgcmVzdWx0W2ldLCAtMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwYWQgbWlsbGlzZWNvbmRzIHRvIGhhdmUgdGhyZWUgZGlnaXRzLlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB5ZWFyICsgJy0nICsgYXJyYXlTbGljZShyZXN1bHQsIDAsIDIpLmpvaW4oJy0nKVxuICAgICAgICAgICAgICAgICsgJ1QnICsgYXJyYXlTbGljZShyZXN1bHQsIDIpLmpvaW4oJzonKSArICcuJ1xuICAgICAgICAgICAgICAgICsgc3RyU2xpY2UoJzAwMCcgKyBvcmlnaW5hbEdldFVUQ01pbGxpc2Vjb25kcyh0aGlzKSwgLTMpICsgJ1onXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSwgaGFzTmVnYXRpdmVEYXRlQnVnIHx8IGhhc1NhZmFyaTUxRGF0ZUJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuOS41LjQ0XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS41LjQ0XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIERhdGUgb2JqZWN0IGZvciB1c2UgYnlcbiAgICAvLyBKU09OLnN0cmluZ2lmeSAoMTUuMTIuMykuXG4gICAgdmFyIGRhdGVUb0pTT05Jc1N1cHBvcnRlZCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9KU09OXG4gICAgICAgICAgICAgICAgJiYgbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICYmIG5ldyBEYXRlKG5lZ2F0aXZlRGF0ZSkudG9KU09OKCkuaW5kZXhPZihuZWdhdGl2ZVllYXJTdHJpbmcpICE9PSAtMVxuICAgICAgICAgICAgICAgICYmIERhdGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKHsgLy8gZ2VuZXJpY1xuICAgICAgICAgICAgICAgICAgICB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuICAgIGlmICghZGF0ZVRvSlNPTklzU3VwcG9ydGVkKSB7XG4gICAgICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTihrZXkpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRvSlNPTiBtZXRob2QgaXMgY2FsbGVkIHdpdGggYXJndW1lbnQga2V5LCB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBzdGVwcyBhcmUgdGFrZW46XG5cbiAgICAgICAgICAgIC8vIDEuICBMZXQgTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgVG9PYmplY3QsIGdpdmluZyBpdCB0aGUgdGhpc1xuICAgICAgICAgICAgLy8gdmFsdWUgYXMgaXRzIGFyZ3VtZW50LlxuICAgICAgICAgICAgLy8gMi4gTGV0IHR2IGJlIEVTLlRvUHJpbWl0aXZlKE8sIGhpbnQgTnVtYmVyKS5cbiAgICAgICAgICAgIHZhciBPID0gJE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciB0diA9IEVTLlRvUHJpbWl0aXZlKE8pO1xuICAgICAgICAgICAgLy8gMy4gSWYgdHYgaXMgYSBOdW1iZXIgYW5kIGlzIG5vdCBmaW5pdGUsIHJldHVybiBudWxsLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0diA9PT0gJ251bWJlcicgJiYgIWlzRmluaXRlKHR2KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNC4gTGV0IHRvSVNPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tHZXRdXSBpbnRlcm5hbCBtZXRob2Qgb2ZcbiAgICAgICAgICAgIC8vIE8gd2l0aCBhcmd1bWVudCBcInRvSVNPU3RyaW5nXCIuXG4gICAgICAgICAgICB2YXIgdG9JU08gPSBPLnRvSVNPU3RyaW5nO1xuICAgICAgICAgICAgLy8gNS4gSWYgSXNDYWxsYWJsZSh0b0lTTykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh0b0lTTykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0b0lTT1N0cmluZyBwcm9wZXJ0eSBpcyBub3QgY2FsbGFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDYuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZCBvZlxuICAgICAgICAgICAgLy8gIHRvSVNPIHdpdGggTyBhcyB0aGUgdGhpcyB2YWx1ZSBhbmQgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC5cbiAgICAgICAgICAgIHJldHVybiB0b0lTTy5jYWxsKE8pO1xuXG4gICAgICAgICAgICAvLyBOT1RFIDEgVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuXG5cbiAgICAgICAgICAgIC8vIE5PVEUgMiBUaGUgdG9KU09OIGZ1bmN0aW9uIGlzIGludGVudGlvbmFsbHkgZ2VuZXJpYzsgaXQgZG9lcyBub3RcbiAgICAgICAgICAgIC8vIHJlcXVpcmUgdGhhdCBpdHMgdGhpcyB2YWx1ZSBiZSBhIERhdGUgb2JqZWN0LiBUaGVyZWZvcmUsIGl0IGNhbiBiZVxuICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgdG8gb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBmb3IgdXNlIGFzIGEgbWV0aG9kLiBIb3dldmVyLFxuICAgICAgICAgICAgLy8gaXQgZG9lcyByZXF1aXJlIHRoYXQgYW55IHN1Y2ggb2JqZWN0IGhhdmUgYSB0b0lTT1N0cmluZyBtZXRob2QuIEFuXG4gICAgICAgICAgICAvLyBvYmplY3QgaXMgZnJlZSB0byB1c2UgdGhlIGFyZ3VtZW50IGtleSB0byBmaWx0ZXIgaXRzXG4gICAgICAgICAgICAvLyBzdHJpbmdpZmljYXRpb24uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjkuNC4yXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuOS40LjJcbiAgICAvLyBiYXNlZCBvbiB3b3JrIHNoYXJlZCBieSBEYW5pZWwgRnJpZXNlbiAoZGFudG1hbilcbiAgICAvLyBodHRwOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OVxuICAgIHZhciBzdXBwb3J0c0V4dGVuZGVkWWVhcnMgPSBEYXRlLnBhcnNlKCcrMDMzNjU4LTA5LTI3VDAxOjQ2OjQwLjAwMFonKSA9PT0gMWUxNTtcbiAgICB2YXIgYWNjZXB0c0ludmFsaWREYXRlcyA9ICFpc05hTihEYXRlLnBhcnNlKCcyMDEyLTA0LTA0VDI0OjAwOjAwLjUwMFonKSkgfHwgIWlzTmFOKERhdGUucGFyc2UoJzIwMTItMTEtMzFUMjM6NTk6NTkuMDAwWicpKSB8fCAhaXNOYU4oRGF0ZS5wYXJzZSgnMjAxMi0xMi0zMVQyMzo1OTo2MC4wMDBaJykpO1xuICAgIHZhciBkb2VzTm90UGFyc2VZMktOZXdZZWFyID0gaXNOYU4oRGF0ZS5wYXJzZSgnMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaJykpO1xuICAgIGlmIChkb2VzTm90UGFyc2VZMktOZXdZZWFyIHx8IGFjY2VwdHNJbnZhbGlkRGF0ZXMgfHwgIXN1cHBvcnRzRXh0ZW5kZWRZZWFycykge1xuICAgICAgICAvLyBYWFggZ2xvYmFsIGFzc2lnbm1lbnQgd29uJ3Qgd29yayBpbiBlbWJlZGRpbmdzIHRoYXQgdXNlXG4gICAgICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LlxuICAgICAgICAvKiBnbG9iYWwgRGF0ZTogdHJ1ZSAqL1xuICAgICAgICB2YXIgbWF4U2FmZVVuc2lnbmVkMzJCaXQgPSBNYXRoLnBvdygyLCAzMSkgLSAxO1xuICAgICAgICB2YXIgaGFzU2FmYXJpU2lnbmVkSW50QnVnID0gaXNBY3R1YWxOYU4obmV3IERhdGUoMTk3MCwgMCwgMSwgMCwgMCwgMCwgbWF4U2FmZVVuc2lnbmVkMzJCaXQgKyAxKS5nZXRUaW1lKCkpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtZ2xvYmFscywgbm8tZ2xvYmFsLWFzc2lnblxuICAgICAgICBEYXRlID0gKGZ1bmN0aW9uIChOYXRpdmVEYXRlKSB7XG4gICAgICAgICAgICAvLyBEYXRlLmxlbmd0aCA9PT0gN1xuICAgICAgICAgICAgdmFyIERhdGVTaGltID0gZnVuY3Rpb24gRGF0ZShZLCBNLCBELCBoLCBtLCBzLCBtcykge1xuICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBkYXRlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgTmF0aXZlRGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2Vjb25kcyA9IHM7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaWxsaXMgPSBtcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1NhZmFyaVNpZ25lZEludEJ1ZyAmJiBsZW5ndGggPj0gNyAmJiBtcyA+IG1heFNhZmVVbnNpZ25lZDMyQml0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBhIFNhZmFyaSA4LzkgYnVnIHdoZXJlIGl0IHRyZWF0cyB0aGUgc2Vjb25kcyBhcyBzaWduZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtc1RvU2hpZnQgPSBNYXRoLmZsb29yKG1zIC8gbWF4U2FmZVVuc2lnbmVkMzJCaXQpICogbWF4U2FmZVVuc2lnbmVkMzJCaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc1RvU2hpZnQgPSBNYXRoLmZsb29yKG1zVG9TaGlmdCAvIDFlMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICs9IHNUb1NoaWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzIC09IHNUb1NoaWZ0ICogMWUzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBsZW5ndGggPT09IDEgJiYgJFN0cmluZyhZKSA9PT0gWSAvLyBpc1N0cmluZyhZKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZXhwbGljaXRseSBwYXNzIGl0IHRocm91Z2ggcGFyc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBOYXRpdmVEYXRlKERhdGVTaGltLnBhcnNlKFkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBtYW51YWxseSBtYWtlIGNhbGxzIGRlcGVuZGluZyBvbiBhcmd1bWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDcgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzZWNvbmRzLCBtaWxsaXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW5ndGggPj0gNiA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgsIG0sIHNlY29uZHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDUgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW5ndGggPj0gNCA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQsIGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW5ndGggPj0gMyA/IG5ldyBOYXRpdmVEYXRlKFksIE0sIEQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDIgPyBuZXcgTmF0aXZlRGF0ZShZLCBNKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW5ndGggPj0gMSA/IG5ldyBOYXRpdmVEYXRlKFkgaW5zdGFuY2VvZiBOYXRpdmVEYXRlID8gK1kgOiBZKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IE5hdGl2ZURhdGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRlID0gTmF0aXZlRGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbWl4dXBzIHdpdGggdW5maXhlZCBEYXRlIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKGRhdGUsIHsgY29uc3RydWN0b3I6IERhdGVTaGltIH0sIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIDE1LjkuMS4xNSBEYXRlIFRpbWUgU3RyaW5nIEZvcm1hdC5cbiAgICAgICAgICAgIHZhciBpc29EYXRlRXhwcmVzc2lvbiA9IG5ldyBSZWdFeHAoJ14nXG4gICAgICAgICAgICAgICAgKyAnKFxcXFxkezR9fFsrLV1cXFxcZHs2fSknIC8vIGZvdXItZGlnaXQgeWVhciBjYXB0dXJlIG9yIHNpZ24gKyA2LWRpZ2l0IGV4dGVuZGVkIHllYXJcbiAgICAgICAgICAgICAgICArICcoPzotKFxcXFxkezJ9KScgLy8gb3B0aW9uYWwgbW9udGggY2FwdHVyZVxuICAgICAgICAgICAgICAgICsgJyg/Oi0oXFxcXGR7Mn0pJyAvLyBvcHRpb25hbCBkYXkgY2FwdHVyZVxuICAgICAgICAgICAgICAgICsgJyg/OicgLy8gY2FwdHVyZSBob3VyczptaW51dGVzOnNlY29uZHMubWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICsgJ1QoXFxcXGR7Mn0pJyAvLyBob3VycyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICsgJzooXFxcXGR7Mn0pJyAvLyBtaW51dGVzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgKyAnKD86JyAvLyBvcHRpb25hbCA6c2Vjb25kcy5taWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJzooXFxcXGR7Mn0pJyAvLyBzZWNvbmRzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJyg/OihcXFxcLlxcXFxkezEsfSkpPycgLy8gbWlsbGlzZWNvbmRzIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgKyAnKT8nXG4gICAgICAgICAgICAgICAgKyAnKCcgLy8gY2FwdHVyZSBVVEMgb2Zmc2V0IGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICArICdafCcgLy8gVVRDIGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgKyAnKD86JyAvLyBvZmZzZXQgc3BlY2lmaWVyICsvLWhvdXJzOm1pbnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJyhbLStdKScgLy8gc2lnbiBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICArICcoXFxcXGR7Mn0pJyAvLyBob3VycyBvZmZzZXQgY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnOihcXFxcZHsyfSknIC8vIG1pbnV0ZXMgb2Zmc2V0IGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgKyAnKSdcbiAgICAgICAgICAgICAgICArICcpPyk/KT8pPydcbiAgICAgICAgICAgICsgJyQnKTtcblxuICAgICAgICAgICAgdmFyIG1vbnRocyA9IFswLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCwgMzY1XTtcblxuICAgICAgICAgICAgdmFyIGRheUZyb21Nb250aCA9IGZ1bmN0aW9uIGRheUZyb21Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gbW9udGggPiAxID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgbW9udGhzW21vbnRoXVxuICAgICAgICAgICAgICAgICAgICArIE1hdGguZmxvb3IoKHllYXIgLSAxOTY5ICsgdCkgLyA0KVxuICAgICAgICAgICAgICAgICAgICAtIE1hdGguZmxvb3IoKHllYXIgLSAxOTAxICsgdCkgLyAxMDApXG4gICAgICAgICAgICAgICAgICAgICsgTWF0aC5mbG9vcigoeWVhciAtIDE2MDEgKyB0KSAvIDQwMClcbiAgICAgICAgICAgICAgICAgICAgKyAoMzY1ICogKHllYXIgLSAxOTcwKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIHRvVVRDID0gZnVuY3Rpb24gdG9VVEModCkge1xuICAgICAgICAgICAgICAgIHZhciBzID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgbXMgPSB0O1xuICAgICAgICAgICAgICAgIGlmIChoYXNTYWZhcmlTaWduZWRJbnRCdWcgJiYgbXMgPiBtYXhTYWZlVW5zaWduZWQzMkJpdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBhIFNhZmFyaSA4LzkgYnVnIHdoZXJlIGl0IHRyZWF0cyB0aGUgc2Vjb25kcyBhcyBzaWduZWRcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1zVG9TaGlmdCA9IE1hdGguZmxvb3IobXMgLyBtYXhTYWZlVW5zaWduZWQzMkJpdCkgKiBtYXhTYWZlVW5zaWduZWQzMkJpdDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNUb1NoaWZ0ID0gTWF0aC5mbG9vcihtc1RvU2hpZnQgLyAxZTMpO1xuICAgICAgICAgICAgICAgICAgICBzICs9IHNUb1NoaWZ0O1xuICAgICAgICAgICAgICAgICAgICBtcyAtPSBzVG9TaGlmdCAqIDFlMztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICROdW1iZXIobmV3IE5hdGl2ZURhdGUoMTk3MCwgMCwgMSwgMCwgMCwgcywgbXMpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIENvcHkgYW55IGN1c3RvbSBtZXRob2RzIGEgM3JkIHBhcnR5IGxpYnJhcnkgbWF5IGhhdmUgYWRkZWRcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBOYXRpdmVEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG93bnMoTmF0aXZlRGF0ZSwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBEYXRlU2hpbVtrZXldID0gTmF0aXZlRGF0ZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29weSBcIm5hdGl2ZVwiIG1ldGhvZHMgZXhwbGljaXRseTsgdGhleSBtYXkgYmUgbm9uLWVudW1lcmFibGVcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZVNoaW0sIHtcbiAgICAgICAgICAgICAgICBub3c6IE5hdGl2ZURhdGUubm93LFxuICAgICAgICAgICAgICAgIFVUQzogTmF0aXZlRGF0ZS5VVENcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgRGF0ZVNoaW0ucHJvdG90eXBlID0gTmF0aXZlRGF0ZS5wcm90b3R5cGU7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGVTaGltLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogRGF0ZVNoaW0gfSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIFVwZ3JhZGUgRGF0ZS5wYXJzZSB0byBoYW5kbGUgc2ltcGxpZmllZCBJU08gODYwMSBzdHJpbmdzXG4gICAgICAgICAgICB2YXIgcGFyc2VTaGltID0gZnVuY3Rpb24gcGFyc2Uoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gaXNvRGF0ZUV4cHJlc3Npb24uZXhlYyhzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBVVEMgb2Zmc2V0IGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICB2YXIgeWVhciA9ICROdW1iZXIobWF0Y2hbMV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSAkTnVtYmVyKG1hdGNoWzJdIHx8IDEpIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9ICROdW1iZXIobWF0Y2hbM10gfHwgMSkgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA9ICROdW1iZXIobWF0Y2hbNF0gfHwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW51dGUgPSAkTnVtYmVyKG1hdGNoWzVdIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gJE51bWJlcihtYXRjaFs2XSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kID0gTWF0aC5mbG9vcigkTnVtYmVyKG1hdGNoWzddIHx8IDApICogMTAwMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRpbWUgem9uZSBpcyBtaXNzZWQsIGxvY2FsIG9mZnNldCBzaG91bGQgYmUgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKEVTIDUuMSBidWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbWFzY3JpcHQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9jYWxUaW1lID0gQm9vbGVhbihtYXRjaFs0XSAmJiAhbWF0Y2hbOF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbk9mZnNldCA9IG1hdGNoWzldID09PSAnLScgPyAxIDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3VyT2Zmc2V0ID0gJE51bWJlcihtYXRjaFsxMF0gfHwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVPZmZzZXQgPSAkTnVtYmVyKG1hdGNoWzExXSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc01pbnV0ZXNPclNlY29uZHNPck1pbGxpc2Vjb25kcyA9IG1pbnV0ZSA+IDAgfHwgc2Vjb25kID4gMCB8fCBtaWxsaXNlY29uZCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPCAoaGFzTWludXRlc09yU2Vjb25kc09yTWlsbGlzZWNvbmRzID8gMjQgOiAyNSlcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIG1pbnV0ZSA8IDYwICYmIHNlY29uZCA8IDYwICYmIG1pbGxpc2Vjb25kIDwgMTAwMFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbW9udGggPiAtMSAmJiBtb250aCA8IDEyICYmIGhvdXJPZmZzZXQgPCAyNFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWludXRlT2Zmc2V0IDwgNjAgLy8gZGV0ZWN0IGludmFsaWQgb2Zmc2V0c1xuICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGF5ID4gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGRheSA8IChkYXlGcm9tTW9udGgoeWVhciwgbW9udGggKyAxKSAtIGRheUZyb21Nb250aCh5ZWFyLCBtb250aCkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGF5RnJvbU1vbnRoKHllYXIsIG1vbnRoKSArIGRheSkgKiAyNClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhvdXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChob3VyT2Zmc2V0ICogc2lnbk9mZnNldClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiA2MDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZXN1bHQgKyBtaW51dGUgKyAobWludXRlT2Zmc2V0ICogc2lnbk9mZnNldCkpICogNjApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAxMDAwKSArIG1pbGxpc2Vjb25kO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdG9VVEMocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtOC42NGUxNSA8PSByZXN1bHQgJiYgcmVzdWx0IDw9IDguNjRlMTUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBOYXRpdmVEYXRlLnBhcnNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhEYXRlU2hpbSwgeyBwYXJzZTogcGFyc2VTaGltIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gRGF0ZVNoaW07XG4gICAgICAgIH0oRGF0ZSkpO1xuICAgICAgICAvKiBnbG9iYWwgRGF0ZTogZmFsc2UgKi9cbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuOS40LjRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS45LjQuNFxuICAgIGlmICghRGF0ZS5ub3cpIHtcbiAgICAgICAgRGF0ZS5ub3cgPSBmdW5jdGlvbiBub3coKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBOdW1iZXJcbiAgICAvLyA9PT09PT1cbiAgICAvL1xuXG4gICAgLy8gRVM1LjEgMTUuNy40LjVcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS43LjQuNVxuICAgIHZhciBoYXNUb0ZpeGVkQnVncyA9IE51bWJlclByb3RvdHlwZS50b0ZpeGVkICYmIChcbiAgICAgICAgKDAuMDAwMDgpLnRvRml4ZWQoMykgIT09ICcwLjAwMCdcbiAgICAgICAgfHwgKDAuOSkudG9GaXhlZCgwKSAhPT0gJzEnXG4gICAgICAgIHx8ICgxLjI1NSkudG9GaXhlZCgyKSAhPT0gJzEuMjUnXG4gICAgICAgIHx8ICgxMDAwMDAwMDAwMDAwMDAwMTI4KS50b0ZpeGVkKDApICE9PSAnMTAwMDAwMDAwMDAwMDAwMDEyOCdcbiAgICApO1xuXG4gICAgdmFyIHRvRml4ZWRIZWxwZXJzID0ge1xuICAgICAgICBiYXNlOiAxZTcsXG4gICAgICAgIHNpemU6IDYsXG4gICAgICAgIGRhdGE6IFswLCAwLCAwLCAwLCAwLCAwXSxcbiAgICAgICAgbXVsdGlwbHk6IGZ1bmN0aW9uIG11bHRpcGx5KG4sIGMpIHtcbiAgICAgICAgICAgIHZhciBpID0gLTE7XG4gICAgICAgICAgICB2YXIgYzIgPSBjO1xuICAgICAgICAgICAgd2hpbGUgKCsraSA8IHRvRml4ZWRIZWxwZXJzLnNpemUpIHtcbiAgICAgICAgICAgICAgICBjMiArPSBuICogdG9GaXhlZEhlbHBlcnMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5kYXRhW2ldID0gYzIgJSB0b0ZpeGVkSGVscGVycy5iYXNlO1xuICAgICAgICAgICAgICAgIGMyID0gTWF0aC5mbG9vcihjMiAvIHRvRml4ZWRIZWxwZXJzLmJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkaXZpZGU6IGZ1bmN0aW9uIGRpdmlkZShuKSB7XG4gICAgICAgICAgICB2YXIgaSA9IHRvRml4ZWRIZWxwZXJzLnNpemU7XG4gICAgICAgICAgICB2YXIgYyA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgICAgICBjICs9IHRvRml4ZWRIZWxwZXJzLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMuZGF0YVtpXSA9IE1hdGguZmxvb3IoYyAvIG4pO1xuICAgICAgICAgICAgICAgIGMgPSAoYyAlIG4pICogdG9GaXhlZEhlbHBlcnMuYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbnVtVG9TdHJpbmc6IGZ1bmN0aW9uIG51bVRvU3RyaW5nKCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0b0ZpeGVkSGVscGVycy5zaXplO1xuICAgICAgICAgICAgdmFyIHMgPSAnJztcbiAgICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzICE9PSAnJyB8fCBpID09PSAwIHx8IHRvRml4ZWRIZWxwZXJzLmRhdGFbaV0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAkU3RyaW5nKHRvRml4ZWRIZWxwZXJzLmRhdGFbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBzdHJTbGljZSgnMDAwMDAwMCcsIDAsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0sXG4gICAgICAgIHBvdzogZnVuY3Rpb24gcG93KHgsIG4sIGFjYykge1xuICAgICAgICAgICAgcmV0dXJuIChuID09PSAwID8gYWNjIDogKG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYykpKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9nOiBmdW5jdGlvbiBsb2coeCkge1xuICAgICAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICAgICAgdmFyIHgyID0geDtcbiAgICAgICAgICAgIHdoaWxlICh4MiA+PSA0MDk2KSB7XG4gICAgICAgICAgICAgICAgbiArPSAxMjtcbiAgICAgICAgICAgICAgICB4MiAvPSA0MDk2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHgyID49IDIpIHtcbiAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgeDIgLz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciB0b0ZpeGVkU2hpbSA9IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgdmFyIGYsIHgsIHMsIG0sIGUsIHosIGosIGs7XG5cbiAgICAgICAgLy8gVGVzdCBmb3IgTmFOIGFuZCByb3VuZCBmcmFjdGlvbkRpZ2l0cyBkb3duXG4gICAgICAgIGYgPSAkTnVtYmVyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgZiA9IGlzQWN0dWFsTmFOKGYpID8gMCA6IE1hdGguZmxvb3IoZik7XG5cbiAgICAgICAgaWYgKGYgPCAwIHx8IGYgPiAyMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ051bWJlci50b0ZpeGVkIGNhbGxlZCB3aXRoIGludmFsaWQgbnVtYmVyIG9mIGRlY2ltYWxzJyk7XG4gICAgICAgIH1cblxuICAgICAgICB4ID0gJE51bWJlcih0aGlzKTtcblxuICAgICAgICBpZiAoaXNBY3R1YWxOYU4oeCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnTmFOJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGl0IGlzIHRvbyBiaWcgb3Igc21hbGwsIHJldHVybiB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBudW1iZXJcbiAgICAgICAgaWYgKHggPD0gLTFlMjEgfHwgeCA+PSAxZTIxKSB7XG4gICAgICAgICAgICByZXR1cm4gJFN0cmluZyh4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHMgPSAnJztcblxuICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgIHMgPSAnLSc7XG4gICAgICAgICAgICB4ID0gLXg7XG4gICAgICAgIH1cblxuICAgICAgICBtID0gJzAnO1xuXG4gICAgICAgIGlmICh4ID4gMWUtMjEpIHtcbiAgICAgICAgICAgIC8vIDFlLTIxIDwgeCA8IDFlMjFcbiAgICAgICAgICAgIC8vIC03MCA8IGxvZzIoeCkgPCA3MFxuICAgICAgICAgICAgZSA9IHRvRml4ZWRIZWxwZXJzLmxvZyh4ICogdG9GaXhlZEhlbHBlcnMucG93KDIsIDY5LCAxKSkgLSA2OTtcbiAgICAgICAgICAgIHogPSAoZSA8IDAgPyB4ICogdG9GaXhlZEhlbHBlcnMucG93KDIsIC1lLCAxKSA6IHggLyB0b0ZpeGVkSGVscGVycy5wb3coMiwgZSwgMSkpO1xuICAgICAgICAgICAgeiAqPSAweDEwMDAwMDAwMDAwMDAwOyAvLyBNYXRoLnBvdygyLCA1Mik7XG4gICAgICAgICAgICBlID0gNTIgLSBlO1xuXG4gICAgICAgICAgICAvLyAtMTggPCBlIDwgMTIyXG4gICAgICAgICAgICAvLyB4ID0geiAvIDIgXiBlXG4gICAgICAgICAgICBpZiAoZSA+IDApIHtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5tdWx0aXBseSgwLCB6KTtcbiAgICAgICAgICAgICAgICBqID0gZjtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChqID49IDcpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkoMWU3LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgaiAtPSA3O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KHRvRml4ZWRIZWxwZXJzLnBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICAgICAgICAgIGogPSBlIC0gMTtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRpdmlkZSgxIDw8IDIzKTtcbiAgICAgICAgICAgICAgICAgICAgaiAtPSAyMztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5kaXZpZGUoMSA8PCBqKTtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5tdWx0aXBseSgxLCAxKTtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5kaXZpZGUoMik7XG4gICAgICAgICAgICAgICAgbSA9IHRvRml4ZWRIZWxwZXJzLm51bVRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDAsIHopO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDEgPDwgKC1lKSwgMCk7XG4gICAgICAgICAgICAgICAgbSA9IHRvRml4ZWRIZWxwZXJzLm51bVRvU3RyaW5nKCkgKyBzdHJTbGljZSgnMC4wMDAwMDAwMDAwMDAwMDAwMDAwMCcsIDIsIDIgKyBmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmID4gMCkge1xuICAgICAgICAgICAgayA9IG0ubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoayA8PSBmKSB7XG4gICAgICAgICAgICAgICAgbSA9IHMgKyBzdHJTbGljZSgnMC4wMDAwMDAwMDAwMDAwMDAwMDAwJywgMCwgZiAtIGsgKyAyKSArIG07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG0gPSBzICsgc3RyU2xpY2UobSwgMCwgayAtIGYpICsgJy4nICsgc3RyU2xpY2UobSwgayAtIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbSA9IHMgKyBtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKE51bWJlclByb3RvdHlwZSwgeyB0b0ZpeGVkOiB0b0ZpeGVkU2hpbSB9LCBoYXNUb0ZpeGVkQnVncyk7XG5cbiAgICB2YXIgaGFzVG9QcmVjaXNpb25VbmRlZmluZWRCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMC50b1ByZWNpc2lvbih1bmRlZmluZWQpID09PSAnMSc7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSgpKTtcbiAgICB2YXIgb3JpZ2luYWxUb1ByZWNpc2lvbiA9IE51bWJlclByb3RvdHlwZS50b1ByZWNpc2lvbjtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKE51bWJlclByb3RvdHlwZSwge1xuICAgICAgICB0b1ByZWNpc2lvbjogZnVuY3Rpb24gdG9QcmVjaXNpb24ocHJlY2lzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHByZWNpc2lvbiA9PT0gJ3VuZGVmaW5lZCcgPyBvcmlnaW5hbFRvUHJlY2lzaW9uLmNhbGwodGhpcykgOiBvcmlnaW5hbFRvUHJlY2lzaW9uLmNhbGwodGhpcywgcHJlY2lzaW9uKTtcbiAgICAgICAgfVxuICAgIH0sIGhhc1RvUHJlY2lzaW9uVW5kZWZpbmVkQnVnKTtcblxuICAgIC8vXG4gICAgLy8gU3RyaW5nXG4gICAgLy8gPT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTNSAxNS41LjQuMTRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS41LjQuMTRcblxuICAgIC8vIFtidWdmaXgsIElFIGx0IDksIGZpcmVmb3ggNCwgS29ucXVlcm9yLCBPcGVyYSwgb2JzY3VyZSBicm93c2Vyc11cbiAgICAvLyBNYW55IGJyb3dzZXJzIGRvIG5vdCBzcGxpdCBwcm9wZXJseSB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb3IgdGhleVxuICAgIC8vIGRvIG5vdCBwZXJmb3JtIHRoZSBzcGxpdCBjb3JyZWN0bHkgdW5kZXIgb2JzY3VyZSBjb25kaXRpb25zLlxuICAgIC8vIFNlZSBodHRwOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvY3Jvc3MtYnJvd3Nlci1zcGxpdFxuICAgIC8vIEkndmUgdGVzdGVkIGluIG1hbnkgYnJvd3NlcnMgYW5kIHRoaXMgc2VlbXMgdG8gY292ZXIgdGhlIGRldmlhbnQgb25lczpcbiAgICAvLyAgICAnYWInLnNwbGl0KC8oPzphYikqLykgc2hvdWxkIGJlIFtcIlwiLCBcIlwiXSwgbm90IFtcIlwiXVxuICAgIC8vICAgICcuJy5zcGxpdCgvKC4/KSguPykvKSBzaG91bGQgYmUgW1wiXCIsIFwiLlwiLCBcIlwiLCBcIlwiXSwgbm90IFtcIlwiLCBcIlwiXVxuICAgIC8vICAgICd0ZXNzdCcuc3BsaXQoLyhzKSovKSBzaG91bGQgYmUgW1widFwiLCB1bmRlZmluZWQsIFwiZVwiLCBcInNcIiwgXCJ0XCJdLCBub3RcbiAgICAvLyAgICAgICBbdW5kZWZpbmVkLCBcInRcIiwgdW5kZWZpbmVkLCBcImVcIiwgLi4uXVxuICAgIC8vICAgICcnLnNwbGl0KC8uPy8pIHNob3VsZCBiZSBbXSwgbm90IFtcIlwiXVxuICAgIC8vICAgICcuJy5zcGxpdCgvKCkoKS8pIHNob3VsZCBiZSBbXCIuXCJdLCBub3QgW1wiXCIsIFwiXCIsIFwiLlwiXVxuXG4gICAgaWYgKFxuICAgICAgICAnYWInLnNwbGl0KC8oPzphYikqLykubGVuZ3RoICE9PSAyXG4gICAgICAgIHx8ICcuJy5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGggIT09IDRcbiAgICAgICAgfHwgJ3Rlc3N0Jy5zcGxpdCgvKHMpKi8pWzFdID09PSAndCdcbiAgICAgICAgfHwgJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpLmxlbmd0aCAhPT0gNFxuICAgICAgICB8fCAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgICAgICAgfHwgJy4nLnNwbGl0KC8oKSgpLykubGVuZ3RoID4gMVxuICAgICkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbXBsaWFudEV4ZWNOcGNnID0gdHlwZW9mICgvKCk/Py8pLmV4ZWMoJycpWzFdID09PSAndW5kZWZpbmVkJzsgLy8gTlBDRzogbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBcbiAgICAgICAgICAgIHZhciBtYXhTYWZlMzJCaXRJbnQgPSBNYXRoLnBvdygyLCAzMikgLSAxO1xuXG4gICAgICAgICAgICBTdHJpbmdQcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXBhcmF0b3IgPT09ICd1bmRlZmluZWQnICYmIGxpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgICAgICAgICAgIGlmICghaXNSZWdleChzZXBhcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJTcGxpdCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gKHNlcGFyYXRvci5pZ25vcmVDYXNlID8gJ2knIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2VwYXJhdG9yLm11bHRpbGluZSA/ICdtJyA6ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpIC8vIGluIEVTNlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyksIC8vIEZpcmVmb3ggMysgYW5kIEVTNlxuICAgICAgICAgICAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgc2VwYXJhdG9yQ29weSA9IG5ldyBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuICAgICAgICAgICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcjIgPSBuZXcgUmVnRXhwKCdeJyArIHNlcGFyYXRvckNvcHkuc291cmNlICsgJyQoPyFcXFxccyknLCBmbGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIFZhbHVlcyBmb3IgYGxpbWl0YCwgcGVyIHRoZSBzcGVjOlxuICAgICAgICAgICAgICAgICAqIElmIHVuZGVmaW5lZDogNDI5NDk2NzI5NSAvLyBtYXhTYWZlMzJCaXRJbnRcbiAgICAgICAgICAgICAgICAgKiBJZiAwLCBJbmZpbml0eSwgb3IgTmFOOiAwXG4gICAgICAgICAgICAgICAgICogSWYgcG9zaXRpdmUgbnVtYmVyOiBsaW1pdCA9IE1hdGguZmxvb3IobGltaXQpOyBpZiAobGltaXQgPiA0Mjk0OTY3Mjk1KSBsaW1pdCAtPSA0Mjk0OTY3Mjk2O1xuICAgICAgICAgICAgICAgICAqIElmIG5lZ2F0aXZlIG51bWJlcjogNDI5NDk2NzI5NiAtIE1hdGguZmxvb3IoTWF0aC5hYnMobGltaXQpKVxuICAgICAgICAgICAgICAgICAqIElmIG90aGVyOiBUeXBlLWNvbnZlcnQsIHRoZW4gdXNlIHRoZSBhYm92ZSBydWxlc1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHZhciBzcGxpdExpbWl0ID0gdHlwZW9mIGxpbWl0ID09PSAndW5kZWZpbmVkJyA/IG1heFNhZmUzMkJpdEludCA6IEVTLlRvVWludDMyKGxpbWl0KTtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IHNlcGFyYXRvckNvcHkuZXhlYyhzdHJpbmcpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwob3V0cHV0LCBzdHJTbGljZShzdHJpbmcsIGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3Vwc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZyAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMF0ucmVwbGFjZShzZXBhcmF0b3IyLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbaV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfcHVzaC5hcHBseShvdXRwdXQsIGFycmF5U2xpY2UobWF0Y2gsIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5sZW5ndGggPj0gc3BsaXRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHNlcGFyYXRvckNvcHkuZXhlYyhzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwob3V0cHV0LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChvdXRwdXQsIHN0clNsaWNlKHN0cmluZywgbGFzdExhc3RJbmRleCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IHNwbGl0TGltaXQgPyBhcnJheVNsaWNlKG91dHB1dCwgMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KCkpO1xuXG4gICAgLy8gW2J1Z2ZpeCwgY2hyb21lXVxuICAgIC8vIElmIHNlcGFyYXRvciBpcyB1bmRlZmluZWQsIHRoZW4gdGhlIHJlc3VsdCBhcnJheSBjb250YWlucyBqdXN0IG9uZSBTdHJpbmcsXG4gICAgLy8gd2hpY2ggaXMgdGhlIHRoaXMgdmFsdWUgKGNvbnZlcnRlZCB0byBhIFN0cmluZykuIElmIGxpbWl0IGlzIG5vdCB1bmRlZmluZWQsXG4gICAgLy8gdGhlbiB0aGUgb3V0cHV0IGFycmF5IGlzIHRydW5jYXRlZCBzbyB0aGF0IGl0IGNvbnRhaW5zIG5vIG1vcmUgdGhhbiBsaW1pdFxuICAgIC8vIGVsZW1lbnRzLlxuICAgIC8vIFwiMFwiLnNwbGl0KHVuZGVmaW5lZCwgMCkgLT4gW11cbiAgICB9IGVsc2UgaWYgKCcwJy5zcGxpdCh2b2lkIDAsIDApLmxlbmd0aCkge1xuICAgICAgICBTdHJpbmdQcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgJiYgbGltaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyU3BsaXQodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIHN0cl9yZXBsYWNlID0gU3RyaW5nUHJvdG90eXBlLnJlcGxhY2U7XG4gICAgdmFyIHJlcGxhY2VSZXBvcnRzR3JvdXBzQ29ycmVjdGx5ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgICAgICAneCcucmVwbGFjZSgveCguKT8vZywgZnVuY3Rpb24gKG1hdGNoLCBncm91cCkge1xuICAgICAgICAgICAgcHVzaENhbGwoZ3JvdXBzLCBncm91cCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgZ3JvdXBzWzBdID09PSAndW5kZWZpbmVkJztcbiAgICB9KCkpO1xuXG4gICAgaWYgKCFyZXBsYWNlUmVwb3J0c0dyb3Vwc0NvcnJlY3RseSkge1xuICAgICAgICBTdHJpbmdQcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2Uoc2VhcmNoVmFsdWUsIHJlcGxhY2VWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGlzRm4gPSBpc0NhbGxhYmxlKHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgICAgICB2YXIgaGFzQ2FwdHVyaW5nR3JvdXBzID0gaXNSZWdleChzZWFyY2hWYWx1ZSkgJiYgKC9cXClbKj9dLykudGVzdChzZWFyY2hWYWx1ZS5zb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCFpc0ZuIHx8ICFoYXNDYXB0dXJpbmdHcm91cHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UuY2FsbCh0aGlzLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHdyYXBwZWRSZXBsYWNlVmFsdWUgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbExhc3RJbmRleCA9IHNlYXJjaFZhbHVlLmxhc3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBzZWFyY2hWYWx1ZS5leGVjKG1hdGNoKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUubGFzdEluZGV4ID0gb3JpZ2luYWxMYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKGFyZ3MsIGFyZ3VtZW50c1tsZW5ndGggLSAyXSwgYXJndW1lbnRzW2xlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VWYWx1ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJfcmVwbGFjZS5jYWxsKHRoaXMsIHNlYXJjaFZhbHVlLCB3cmFwcGVkUmVwbGFjZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFQ01BLTI2MiwgM3JkIEIuMi4zXG4gICAgLy8gTm90IGFuIEVDTUFTY3JpcHQgc3RhbmRhcmQsIGFsdGhvdWdoIEVDTUFTY3JpcHQgM3JkIEVkaXRpb24gaGFzIGFcbiAgICAvLyBub24tbm9ybWF0aXZlIHNlY3Rpb24gc3VnZ2VzdGluZyB1bmlmb3JtIHNlbWFudGljcyBhbmQgaXQgc2hvdWxkIGJlXG4gICAgLy8gbm9ybWFsaXplZCBhY3Jvc3MgYWxsIGJyb3dzZXJzXG4gICAgLy8gW2J1Z2ZpeCwgSUUgbHQgOV0gSUUgPCA5IHN1YnN0cigpIHdpdGggbmVnYXRpdmUgdmFsdWUgbm90IHdvcmtpbmcgaW4gSUVcbiAgICB2YXIgc3RyaW5nX3N1YnN0ciA9IFN0cmluZ1Byb3RvdHlwZS5zdWJzdHI7XG4gICAgdmFyIGhhc05lZ2F0aXZlU3Vic3RyQnVnID0gJycuc3Vic3RyICYmICcwYicuc3Vic3RyKC0xKSAhPT0gJ2InO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3RyaW5nUHJvdG90eXBlLCB7XG4gICAgICAgIHN1YnN0cjogZnVuY3Rpb24gc3Vic3RyKHN0YXJ0LCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBub3JtYWxpemVkU3RhcnQgPSBzdGFydDtcbiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkU3RhcnQgPSBtYXgodGhpcy5sZW5ndGggKyBzdGFydCwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5nX3N1YnN0ci5jYWxsKHRoaXMsIG5vcm1hbGl6ZWRTdGFydCwgbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH0sIGhhc05lZ2F0aXZlU3Vic3RyQnVnKTtcblxuICAgIC8vIEVTNSAxNS41LjQuMjBcbiAgICAvLyB3aGl0ZXNwYWNlIGZyb206IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNS40LjIwXG4gICAgdmFyIHdzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJ1xuICAgICAgICArICdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOCdcbiAgICAgICAgKyAnXFx1MjAyOVxcdUZFRkYnO1xuICAgIHZhciB6ZXJvV2lkdGggPSAnXFx1MjAwYic7XG4gICAgdmFyIHdzUmVnZXhDaGFycyA9ICdbJyArIHdzICsgJ10nO1xuICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCdeJyArIHdzUmVnZXhDaGFycyArIHdzUmVnZXhDaGFycyArICcqJyk7XG4gICAgdmFyIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzUmVnZXhDaGFycyArIHdzUmVnZXhDaGFycyArICcqJCcpO1xuICAgIHZhciBoYXNUcmltV2hpdGVzcGFjZUJ1ZyA9IFN0cmluZ1Byb3RvdHlwZS50cmltICYmICh3cy50cmltKCkgfHwgIXplcm9XaWR0aC50cmltKCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3RyaW5nUHJvdG90eXBlLCB7XG4gICAgICAgIC8vIGh0dHA6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9mYXN0ZXItdHJpbS1qYXZhc2NyaXB0XG4gICAgICAgIC8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL3doaXRlc3BhY2UtZGV2aWF0aW9ucy9cbiAgICAgICAgdHJpbTogZnVuY3Rpb24gdHJpbSgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IFwiICsgdGhpcyArICcgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpO1xuICAgICAgICB9XG4gICAgfSwgaGFzVHJpbVdoaXRlc3BhY2VCdWcpO1xuICAgIHZhciB0cmltID0gY2FsbC5iaW5kKFN0cmluZy5wcm90b3R5cGUudHJpbSk7XG5cbiAgICB2YXIgaGFzTGFzdEluZGV4QnVnID0gU3RyaW5nUHJvdG90eXBlLmxhc3RJbmRleE9mICYmICdhYmPjgYLjgYQnLmxhc3RJbmRleE9mKCfjgYLjgYQnLCAyKSAhPT0gLTE7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmdQcm90b3R5cGUsIHtcbiAgICAgICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaFN0cmluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAndW5kZWZpbmVkJyB8fCB0aGlzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgXCIgKyB0aGlzICsgJyB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBTID0gJFN0cmluZyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWFyY2hTdHIgPSAkU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgICAgICAgICB2YXIgbnVtUG9zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAkTnVtYmVyKGFyZ3VtZW50c1sxXSkgOiBOYU47XG4gICAgICAgICAgICB2YXIgcG9zID0gaXNBY3R1YWxOYU4obnVtUG9zKSA/IEluZmluaXR5IDogRVMuVG9JbnRlZ2VyKG51bVBvcyk7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBtaW4obWF4KHBvcywgMCksIFMubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBzZWFyY2hMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGsgPSBzdGFydCArIHNlYXJjaExlbjtcbiAgICAgICAgICAgIHdoaWxlIChrID4gMCkge1xuICAgICAgICAgICAgICAgIGsgPSBtYXgoMCwgayAtIHNlYXJjaExlbik7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc3RySW5kZXhPZihzdHJTbGljZShTLCBrLCBzdGFydCArIHNlYXJjaExlbiksIHNlYXJjaFN0cik7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gayArIGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH0sIGhhc0xhc3RJbmRleEJ1Zyk7XG5cbiAgICB2YXIgb3JpZ2luYWxMYXN0SW5kZXhPZiA9IFN0cmluZ1Byb3RvdHlwZS5sYXN0SW5kZXhPZjtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN0cmluZ1Byb3RvdHlwZSwge1xuICAgICAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxMYXN0SW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfSwgU3RyaW5nUHJvdG90eXBlLmxhc3RJbmRleE9mLmxlbmd0aCAhPT0gMSk7XG5cbiAgICAvLyBFUy01IDE1LjEuMi4yXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJhZGl4XG4gICAgaWYgKHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgcGFyc2VJbnQod3MgKyAnMHgxNicpICE9PSAyMikge1xuICAgICAgICAvKiBnbG9iYWwgcGFyc2VJbnQ6IHRydWUgKi9cbiAgICAgICAgcGFyc2VJbnQgPSAoZnVuY3Rpb24gKG9yaWdQYXJzZUludCkge1xuICAgICAgICAgICAgdmFyIGhleFJlZ2V4ID0gL15bLStdPzBbeFhdLztcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBTeW1ib2xzIGluIG5vZGUgOC4zLzguNFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLXVudXNlZC1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgICAgICAnJyArIHN0cjsgLy8ganNjczppZ25vcmUgZGlzYWxsb3dJbXBsaWNpdFR5cGVDb252ZXJzaW9uXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHN0cmluZyA9IHRyaW0oU3RyaW5nKHN0cikpO1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0ZWRSYWRpeCA9ICROdW1iZXIocmFkaXgpIHx8IChoZXhSZWdleC50ZXN0KHN0cmluZykgPyAxNiA6IDEwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1BhcnNlSW50KHN0cmluZywgZGVmYXVsdGVkUmFkaXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfShwYXJzZUludCkpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4zXG4gICAgaWYgKDEgLyBwYXJzZUZsb2F0KCctMCcpICE9PSAtSW5maW5pdHkpIHtcbiAgICAgICAgLyogZ2xvYmFsIHBhcnNlRmxvYXQ6IHRydWUgKi9cbiAgICAgICAgcGFyc2VGbG9hdCA9IChmdW5jdGlvbiAob3JpZ1BhcnNlRmxvYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwYXJzZUZsb2F0KHN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhciBpbnB1dFN0cmluZyA9IHRyaW0oU3RyaW5nKHN0cmluZykpO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvcmlnUGFyc2VGbG9hdChpbnB1dFN0cmluZyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gMCAmJiBzdHJTbGljZShpbnB1dFN0cmluZywgMCwgMSkgPT09ICctJyA/IC0wIDogcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfShwYXJzZUZsb2F0KSk7XG4gICAgfVxuXG4gICAgaWYgKFN0cmluZyhuZXcgUmFuZ2VFcnJvcigndGVzdCcpKSAhPT0gJ1JhbmdlRXJyb3I6IHRlc3QnKSB7XG4gICAgICAgIHZhciBlcnJvclRvU3RyaW5nU2hpbSA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAndW5kZWZpbmVkJyB8fCB0aGlzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgXCIgKyB0aGlzICsgJyB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG5hbWUgPSAnRXJyb3InO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBuYW1lID0gJFN0cmluZyhuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtc2cgPSB0aGlzLm1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBtc2cgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBtc2cgPSAkU3RyaW5nKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXNnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtc2cpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYW1lICsgJzogJyArIG1zZztcbiAgICAgICAgfTtcbiAgICAgICAgLy8gY2FuJ3QgdXNlIGRlZmluZVByb3BlcnRpZXMgaGVyZSBiZWNhdXNlIG9mIHRvU3RyaW5nIGVudW1lcmF0aW9uIGlzc3VlIGluIElFIDw9IDhcbiAgICAgICAgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nID0gZXJyb3JUb1N0cmluZ1NoaW07XG4gICAgfVxuXG4gICAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICAgICAgdmFyIGVuc3VyZU5vbkVudW1lcmFibGUgPSBmdW5jdGlvbiAob2JqLCBwcm9wKSB7XG4gICAgICAgICAgICBpZiAoaXNFbnVtKG9iaiwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVzYy5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZW5zdXJlTm9uRW51bWVyYWJsZShFcnJvci5wcm90b3R5cGUsICdtZXNzYWdlJyk7XG4gICAgICAgIGlmIChFcnJvci5wcm90b3R5cGUubWVzc2FnZSAhPT0gJycpIHtcbiAgICAgICAgICAgIEVycm9yLnByb3RvdHlwZS5tZXNzYWdlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZW5zdXJlTm9uRW51bWVyYWJsZShFcnJvci5wcm90b3R5cGUsICduYW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKFN0cmluZygvYS9taWcpICE9PSAnL2EvZ2ltJykge1xuICAgICAgICB2YXIgcmVnZXhUb1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgdmFyIHN0ciA9ICcvJyArIHRoaXMuc291cmNlICsgJy8nO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZUNhc2UpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2knO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgc3RyICs9ICdtJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGNhbid0IHVzZSBkZWZpbmVQcm9wZXJ0aWVzIGhlcmUgYmVjYXVzZSBvZiB0b1N0cmluZyBlbnVtZXJhdGlvbiBpc3N1ZSBpbiBJRSA8PSA4XG4gICAgICAgIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcgPSByZWdleFRvU3RyaW5nO1xuICAgIH1cbn0pKTtcbiIsIi8qIVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG4gKiBAbGljZW5zZSBlczUtc2hpbSBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5IGNvbnRyaWJ1dG9ycywgTUlUIExpY2Vuc2VcbiAqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbi8vIHZpbTogdHM9NCBzdHM9NCBzdz00IGV4cGFuZHRhYlxuXG4vLyBBZGQgc2VtaWNvbG9uIHRvIHByZXZlbnQgSUlGRSBmcm9tIGJlaW5nIHBhc3NlZCBhcyBhcmd1bWVudCB0byBjb25jYXRlbmF0ZWQgY29kZS5cbjtcblxuLy8gVU1EIChVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24pXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3VtZGpzL3VtZC9ibG9iL21hc3Rlci90ZW1wbGF0ZXMvcmV0dXJuRXhwb3J0cy5qc1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZSwgZXhwb3J0cywgbW9kdWxlICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb21lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LnJldHVybkV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG5cbiAgICB2YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XG4gICAgdmFyIHByb3RvdHlwZU9mT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICB2YXIgb3ducyA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5oYXNPd25Qcm9wZXJ0eSk7XG4gICAgdmFyIGlzRW51bWVyYWJsZSA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG4gICAgdmFyIHRvU3RyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0LnRvU3RyaW5nKTtcblxuICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvcnMgY3JlYXRpbmcgc2hvcnRjdXRzLlxuICAgIHZhciBkZWZpbmVHZXR0ZXI7XG4gICAgdmFyIGRlZmluZVNldHRlcjtcbiAgICB2YXIgbG9va3VwR2V0dGVyO1xuICAgIHZhciBsb29rdXBTZXR0ZXI7XG4gICAgdmFyIHN1cHBvcnRzQWNjZXNzb3JzID0gb3ducyhwcm90b3R5cGVPZk9iamVjdCwgJ19fZGVmaW5lR2V0dGVyX18nKTtcbiAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllcyAqL1xuICAgICAgICBkZWZpbmVHZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19kZWZpbmVHZXR0ZXJfXyk7XG4gICAgICAgIGRlZmluZVNldHRlciA9IGNhbGwuYmluZChwcm90b3R5cGVPZk9iamVjdC5fX2RlZmluZVNldHRlcl9fKTtcbiAgICAgICAgbG9va3VwR2V0dGVyID0gY2FsbC5iaW5kKHByb3RvdHlwZU9mT2JqZWN0Ll9fbG9va3VwR2V0dGVyX18pO1xuICAgICAgICBsb29rdXBTZXR0ZXIgPSBjYWxsLmJpbmQocHJvdG90eXBlT2ZPYmplY3QuX19sb29rdXBTZXR0ZXJfXyk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUsIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllcyAqL1xuICAgIH1cblxuICAgIHZhciBpc1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKG8pIHtcbiAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCB8fCAodHlwZW9mIG8gIT09ICdvYmplY3QnICYmIHR5cGVvZiBvICE9PSAnZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gICAgLy8gRVM1IDE1LjIuMy4yXG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjJcbiAgICBpZiAoIU9iamVjdC5nZXRQcm90b3R5cGVPZikge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzI2lzc3VlLzJcbiAgICAgICAgLy8gaHR0cDovL2Vqb2huLm9yZy9ibG9nL29iamVjdGdldHByb3RvdHlwZW9mL1xuICAgICAgICAvLyByZWNvbW1lbmRlZCBieSBmc2NoYWVmZXIgb24gZ2l0aHViXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHN1cmUsIGFuZCB3ZWJyZWZsZWN0aW9uIHNheXMgXl9eXG4gICAgICAgIC8vIC4uLiB0aGlzIHdpbGwgbmVyZXZlciBwb3NzaWJseSByZXR1cm4gbnVsbFxuICAgICAgICAvLyAuLi4gT3BlcmEgTWluaSBicmVha3MgaGVyZSB3aXRoIGluZmluaXRlIGxvb3BzXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvXG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBvYmplY3QuX19wcm90b19fO1xuICAgICAgICAgICAgaWYgKHByb3RvIHx8IHByb3RvID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b1N0cihvYmplY3QuY29uc3RydWN0b3IpID09PSAnW29iamVjdCBGdW5jdGlvbl0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm90b3R5cGVPZk9iamVjdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ29ycmVjdGx5IHJldHVybiBudWxsIGZvciBPYmplY3RzIGNyZWF0ZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZShudWxsKWBcbiAgICAgICAgICAgICAgICAvLyAoc2hhbW1lZCBvciBuYXRpdmUpIG9yIGB7IF9fcHJvdG9fXzogbnVsbH1gLiAgQWxzbyByZXR1cm5zIG51bGwgZm9yXG4gICAgICAgICAgICAgICAgLy8gY3Jvc3MtcmVhbG0gb2JqZWN0cyBvbiBicm93c2VycyB0aGF0IGxhY2sgYF9fcHJvdG9fX2Agc3VwcG9ydCAobGlrZVxuICAgICAgICAgICAgICAgIC8vIElFIDwxMSksIGJ1dCB0aGF0J3MgdGhlIGJlc3Qgd2UgY2FuIGRvLlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEVTNSAxNS4yLjMuM1xuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4zXG5cbiAgICB2YXIgZG9lc0dldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmsgPSBmdW5jdGlvbiBkb2VzR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yV29yayhvYmplY3QpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9iamVjdC5zZW50aW5lbCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsICdzZW50aW5lbCcpLnZhbHVlID09PSAwO1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBjaGVjayB3aGV0aGVyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB3b3JrcyBpZiBpdCdzIGdpdmVuLiBPdGhlcndpc2UsIHNoaW0gcGFydGlhbGx5LlxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmtzT25PYmplY3QgPSBkb2VzR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yV29yayh7fSk7XG4gICAgICAgIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JXb3Jrc09uRG9tID0gdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgfHwgZG9lc0dldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICBpZiAoIWdldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmtzT25Eb20gfHwgIWdldE93blByb3BlcnR5RGVzY3JpcHRvcldvcmtzT25PYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JGYWxsYmFjayA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgfHwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yRmFsbGJhY2spIHtcbiAgICAgICAgdmFyIEVSUl9OT05fT0JKRUNUID0gJ09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgY2FsbGVkIG9uIGEgbm9uLW9iamVjdDogJztcblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZShvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihFUlJfTk9OX09CSkVDVCArIG9iamVjdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1ha2UgYSB2YWxpYW50IGF0dGVtcHQgdG8gdXNlIHRoZSByZWFsIGdldE93blByb3BlcnR5RGVzY3JpcHRvclxuICAgICAgICAgICAgLy8gZm9yIEk4J3MgRE9NIGVsZW1lbnRzLlxuICAgICAgICAgICAgaWYgKGdldE93blByb3BlcnR5RGVzY3JpcHRvckZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93blByb3BlcnR5RGVzY3JpcHRvckZhbGxiYWNrLmNhbGwoT2JqZWN0LCBvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yO1xuXG4gICAgICAgICAgICAvLyBJZiBvYmplY3QgZG9lcyBub3Qgb3ducyBwcm9wZXJ0eSByZXR1cm4gdW5kZWZpbmVkIGltbWVkaWF0ZWx5LlxuICAgICAgICAgICAgaWYgKCFvd25zKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG9iamVjdCBoYXMgYSBwcm9wZXJ0eSB0aGVuIGl0J3MgZm9yIHN1cmUgYGNvbmZpZ3VyYWJsZWAsIGFuZFxuICAgICAgICAgICAgLy8gcHJvYmFibHkgYGVudW1lcmFibGVgLiBEZXRlY3QgZW51bWVyYWJpbGl0eSB0aG91Z2guXG4gICAgICAgICAgICBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGlzRW51bWVyYWJsZShvYmplY3QsIHByb3BlcnR5KSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIEpTIGVuZ2luZSBzdXBwb3J0cyBhY2Nlc3NvciBwcm9wZXJ0aWVzIHRoZW4gcHJvcGVydHkgbWF5IGJlIGFcbiAgICAgICAgICAgIC8vIGdldHRlciBvciBzZXR0ZXIuXG4gICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMpIHtcbiAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBhIGdldHRlciBldmVuXG4gICAgICAgICAgICAgICAgLy8gaWYgb2JqZWN0IGhhcyBvd24gbm9uIGdldHRlciBwcm9wZXJ0eSBhbG9uZyB3aXRoIGEgc2FtZSBuYW1lZFxuICAgICAgICAgICAgICAgIC8vIGluaGVyaXRlZCBnZXR0ZXIuIFRvIGF2b2lkIG1pc2JlaGF2aW9yIHdlIHRlbXBvcmFyeSByZW1vdmVcbiAgICAgICAgICAgICAgICAvLyBgX19wcm90b19fYCBzbyB0aGF0IGBfX2xvb2t1cEdldHRlcl9fYCB3aWxsIHJldHVybiBnZXR0ZXIgb25seVxuICAgICAgICAgICAgICAgIC8vIGlmIGl0J3Mgb3duZWQgYnkgYW4gb2JqZWN0LlxuICAgICAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBvYmplY3QuX19wcm90b19fO1xuICAgICAgICAgICAgICAgIHZhciBub3RQcm90b3R5cGVPZk9iamVjdCA9IG9iamVjdCAhPT0gcHJvdG90eXBlT2ZPYmplY3Q7XG4gICAgICAgICAgICAgICAgLy8gYXZvaWQgcmVjdXJzaW9uIHByb2JsZW0sIGJyZWFraW5nIGluIE9wZXJhIE1pbmkgd2hlblxuICAgICAgICAgICAgICAgIC8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJylcbiAgICAgICAgICAgICAgICAvLyBvciBhbnkgb3RoZXIgT2JqZWN0LnByb3RvdHlwZSBhY2Nlc3NvclxuICAgICAgICAgICAgICAgIGlmIChub3RQcm90b3R5cGVPZk9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlT2ZPYmplY3Q7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB2YXIgc2V0dGVyID0gbG9va3VwU2V0dGVyKG9iamVjdCwgcHJvcGVydHkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vdFByb3RvdHlwZU9mT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UgaGF2ZSBnZXR0ZXIgYW5kIHNldHRlciB3ZSBjYW4gcHV0IHZhbHVlcyBiYWNrLlxuICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0ID0gZ2V0dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gc2V0dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IHdhcyBhY2Nlc3NvciBwcm9wZXJ0eSB3ZSdyZSBkb25lIGFuZCByZXR1cm4gaGVyZVxuICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBhZGRpbmcgYHZhbHVlYCB0byB0aGUgZGVzY3JpcHRvci5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgd2Uga25vdyB0aGF0IG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHRoYXQgaXNcbiAgICAgICAgICAgIC8vIG5vdCBhbiBhY2Nlc3NvciBzbyB3ZSBzZXQgaXQgYXMgYSB2YWx1ZSBhbmQgcmV0dXJuIGRlc2NyaXB0b3IuXG4gICAgICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH07XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuMi4zLjRcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNFxuICAgIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjIuMy41XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjVcbiAgICBpZiAoIU9iamVjdC5jcmVhdGUpIHtcblxuICAgICAgICAvLyBDb250cmlidXRlZCBieSBCcmFuZG9uIEJlbnZpZSwgT2N0b2JlciwgMjAxMlxuICAgICAgICB2YXIgY3JlYXRlRW1wdHk7XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0gISh7IF9fcHJvdG9fXzogbnVsbCB9IGluc3RhbmNlb2YgT2JqZWN0KTtcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBwcm9kdWNlcyBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgICAgLy8gaW4gT3BlcmEgTWluaSA9PiBub3QgYSByZWxpYWJsZSBjaGVja1xuICAgICAgICAvLyBPYmplY3QucHJvdG90eXBlLl9fcHJvdG9fXyA9PT0gbnVsbFxuXG4gICAgICAgIC8vIENoZWNrIGZvciBkb2N1bWVudC5kb21haW4gYW5kIGFjdGl2ZSB4IHN1cHBvcnRcbiAgICAgICAgLy8gTm8gbmVlZCB0byB1c2UgYWN0aXZlIHggYXBwcm9hY2ggd2hlbiBkb2N1bWVudC5kb21haW4gaXMgbm90IHNldFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xNTBcbiAgICAgICAgLy8gdmFyaWF0aW9uIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9raXRjYW1icmlkZ2UvZXM1LXNoaW0vY29tbWl0LzRmNzM4YWMwNjYzNDZcbiAgICAgICAgLyogZ2xvYmFsIEFjdGl2ZVhPYmplY3QgKi9cbiAgICAgICAgdmFyIHNob3VsZFVzZUFjdGl2ZVggPSBmdW5jdGlvbiBzaG91bGRVc2VBY3RpdmVYKCkge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGVhcmx5IGlmIGRvY3VtZW50LmRvbWFpbiBub3Qgc2V0XG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmRvbWFpbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gISFuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGlzIHN1cHBvcnRzIElFOCB3aGVuIGRvY3VtZW50LmRvbWFpbiBpcyB1c2VkXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuICAgICAgICAvLyB2YXJpYXRpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL2tpdGNhbWJyaWRnZS9lczUtc2hpbS9jb21taXQvNGY3MzhhYzA2NjM0NlxuICAgICAgICB2YXIgZ2V0RW1wdHlWaWFBY3RpdmVYID0gZnVuY3Rpb24gZ2V0RW1wdHlWaWFBY3RpdmVYKCkge1xuICAgICAgICAgICAgdmFyIGVtcHR5O1xuICAgICAgICAgICAgdmFyIHhEb2M7XG5cbiAgICAgICAgICAgIHhEb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTtcblxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9ICdzY3JpcHQnO1xuICAgICAgICAgICAgeERvYy53cml0ZSgnPCcgKyBzY3JpcHQgKyAnPjwvJyArIHNjcmlwdCArICc+Jyk7XG4gICAgICAgICAgICB4RG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIGVtcHR5ID0geERvYy5wYXJlbnRXaW5kb3cuT2JqZWN0LnByb3RvdHlwZTtcbiAgICAgICAgICAgIHhEb2MgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZW1wdHk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIHVzaW5nIGFuIGlmcmFtZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIGFjdGl2ZXggYXBwcm9hY2ggd2FzIGFkZGVkXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW0vaXNzdWVzLzE1MFxuICAgICAgICB2YXIgZ2V0RW1wdHlWaWFJRnJhbWUgPSBmdW5jdGlvbiBnZXRFbXB0eVZpYUlGcmFtZSgpIHtcbiAgICAgICAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgIHZhciBlbXB0eTtcblxuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zY3JpcHQtdXJsXG4gICAgICAgICAgICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JztcblxuICAgICAgICAgICAgZW1wdHkgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3QucHJvdG90eXBlO1xuICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gICAgICAgICAgICBpZnJhbWUgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gZW1wdHk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyogZ2xvYmFsIGRvY3VtZW50ICovXG4gICAgICAgIGlmIChzdXBwb3J0c1Byb3RvIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNyZWF0ZUVtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IF9fcHJvdG9fXzogbnVsbCB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEluIG9sZCBJRSBfX3Byb3RvX18gY2FuJ3QgYmUgdXNlZCB0byBtYW51YWxseSBzZXQgYG51bGxgLCBub3IgZG9lc1xuICAgICAgICAgICAgLy8gYW55IG90aGVyIG1ldGhvZCBleGlzdCB0byBtYWtlIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gbm90aGluZyxcbiAgICAgICAgICAgIC8vIGFzaWRlIGZyb20gT2JqZWN0LnByb3RvdHlwZSBpdHNlbGYuIEluc3RlYWQsIGNyZWF0ZSBhIG5ldyBnbG9iYWxcbiAgICAgICAgICAgIC8vIG9iamVjdCBhbmQgKnN0ZWFsKiBpdHMgT2JqZWN0LnByb3RvdHlwZSBhbmQgc3RyaXAgaXQgYmFyZS4gVGhpcyBpc1xuICAgICAgICAgICAgLy8gdXNlZCBhcyB0aGUgcHJvdG90eXBlIHRvIGNyZWF0ZSBudWxsYXJ5IG9iamVjdHMuXG4gICAgICAgICAgICBjcmVhdGVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggYXBwcm9hY2ggdG8gdXNlXG4gICAgICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMTUwXG4gICAgICAgICAgICAgICAgdmFyIGVtcHR5ID0gc2hvdWxkVXNlQWN0aXZlWCgpID8gZ2V0RW1wdHlWaWFBY3RpdmVYKCkgOiBnZXRFbXB0eVZpYUlGcmFtZSgpO1xuXG4gICAgICAgICAgICAgICAgZGVsZXRlIGVtcHR5LmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbXB0eS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZW1wdHkucHJvcGVydHlJc0VudW1lcmFibGU7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVtcHR5LmlzUHJvdG90eXBlT2Y7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVtcHR5LnRvTG9jYWxlU3RyaW5nO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbXB0eS50b1N0cmluZztcbiAgICAgICAgICAgICAgICBkZWxldGUgZW1wdHkudmFsdWVPZjtcblxuICAgICAgICAgICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgICAgICAgICAgRW1wdHkucHJvdG90eXBlID0gZW1wdHk7XG4gICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBmdXR1cmUgY2FsbHNcbiAgICAgICAgICAgICAgICBjcmVhdGVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUocHJvdG90eXBlLCBwcm9wZXJ0aWVzKSB7XG5cbiAgICAgICAgICAgIHZhciBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgVHlwZSA9IGZ1bmN0aW9uIFR5cGUoKSB7fTsgLy8gQW4gZW1wdHkgY29uc3RydWN0b3IuXG5cbiAgICAgICAgICAgIGlmIChwcm90b3R5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvYmplY3QgPSBjcmVhdGVFbXB0eSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvdG90eXBlICE9PSBudWxsICYmIGlzUHJpbWl0aXZlKHByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBgcGFyZW50YCBjYW4gYmUgYG51bGxgXG4gICAgICAgICAgICAgICAgICAgIC8vIE9SICphbnkqIGBpbnN0YW5jZW9mIE9iamVjdGAgIChPYmplY3R8RnVuY3Rpb258QXJyYXl8UmVnRXhwfGV0YylcbiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGB0eXBlb2ZgIHRobywgYi9jIGluIG9sZCBJRSwgRE9NIGVsZW1lbnRzIGFyZSBub3QgYGluc3RhbmNlb2YgT2JqZWN0YFxuICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIHRoZXkgYXJlIGluIG1vZGVybiBicm93c2Vycy4gVXNpbmcgYE9iamVjdC5jcmVhdGVgIG9uIERPTSBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyBpcy4uLmVyci4uLnByb2JhYmx5IGluYXBwcm9wcmlhdGUsIGJ1dCB0aGUgbmF0aXZlIHZlcnNpb24gYWxsb3dzIGZvciBpdC5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0IHByb3RvdHlwZSBtYXkgb25seSBiZSBhbiBPYmplY3Qgb3IgbnVsbCcpOyAvLyBzYW1lIG1zZyBhcyBDaHJvbWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgVHlwZS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgb2JqZWN0ID0gbmV3IFR5cGUoKTtcbiAgICAgICAgICAgICAgICAvLyBJRSBoYXMgbm8gYnVpbHQtaW4gaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5nZXRQcm90b3R5cGVPZmBcbiAgICAgICAgICAgICAgICAvLyBuZWl0aGVyIGBfX3Byb3RvX19gLCBidXQgdGhpcyBtYW51YWxseSBzZXR0aW5nIGBfX3Byb3RvX19gIHdpbGxcbiAgICAgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhhdCBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCB3aWxsIHdvcmsgYXMgZXhwZWN0ZWQgd2l0aFxuICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgY3JlYXRlZCB1c2luZyBgT2JqZWN0LmNyZWF0ZWBcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG9cbiAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuMi4zLjZcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuNlxuXG4gICAgLy8gUGF0Y2ggZm9yIFdlYktpdCBhbmQgSUU4IHN0YW5kYXJkIG1vZGVcbiAgICAvLyBEZXNpZ25lZCBieSBoYXggPGhheC5naXRodWIuY29tPlxuICAgIC8vIHJlbGF0ZWQgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMjaXNzdWUvNVxuICAgIC8vIElFOCBSZWZlcmVuY2U6XG4gICAgLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDI4MjkwMC5hc3B4XG4gICAgLy8gICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZDIyOTkxNi5hc3B4XG4gICAgLy8gV2ViS2l0IEJ1Z3M6XG4gICAgLy8gICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNjQyM1xuXG4gICAgdmFyIGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsgPSBmdW5jdGlvbiBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKG9iamVjdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgJ3NlbnRpbmVsJywge30pO1xuICAgICAgICAgICAgcmV0dXJuICdzZW50aW5lbCcgaW4gb2JqZWN0O1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBjaGVjayB3aGV0aGVyIGRlZmluZVByb3BlcnR5IHdvcmtzIGlmIGl0J3MgZ2l2ZW4uIE90aGVyd2lzZSxcbiAgICAvLyBzaGltIHBhcnRpYWxseS5cbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eVdvcmtzT25PYmplY3QgPSBkb2VzRGVmaW5lUHJvcGVydHlXb3JrKHt9KTtcbiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5V29ya3NPbkRvbSA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgIHx8IGRvZXNEZWZpbmVQcm9wZXJ0eVdvcmsoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgICAgICBpZiAoIWRlZmluZVByb3BlcnR5V29ya3NPbk9iamVjdCB8fCAhZGVmaW5lUHJvcGVydHlXb3Jrc09uRG9tKSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHlGYWxsYmFjayA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzRmFsbGJhY2sgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnR5IHx8IGRlZmluZVByb3BlcnR5RmFsbGJhY2spIHtcbiAgICAgICAgdmFyIEVSUl9OT05fT0JKRUNUX0RFU0NSSVBUT1IgPSAnUHJvcGVydHkgZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3Q6ICc7XG4gICAgICAgIHZhciBFUlJfTk9OX09CSkVDVF9UQVJHRVQgPSAnT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxlZCBvbiBub24tb2JqZWN0OiAnO1xuICAgICAgICB2YXIgRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEID0gJ2dldHRlcnMgJiBzZXR0ZXJzIGNhbiBub3QgYmUgZGVmaW5lZCBvbiB0aGlzIGphdmFzY3JpcHQgZW5naW5lJztcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBpZiAoaXNQcmltaXRpdmUob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfVEFSR0VUICsgb2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZShkZXNjcmlwdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX05PTl9PQkpFQ1RfREVTQ1JJUFRPUiArIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbWFrZSBhIHZhbGlhbnQgYXR0ZW1wdCB0byB1c2UgdGhlIHJlYWwgZGVmaW5lUHJvcGVydHlcbiAgICAgICAgICAgIC8vIGZvciBJOCdzIERPTSBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChkZWZpbmVQcm9wZXJ0eUZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5RmFsbGJhY2suY2FsbChPYmplY3QsIG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdGhlIHNoaW0gaWYgdGhlIHJlYWwgb25lIGRvZXNuJ3Qgd29ya1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgaXQncyBhIGRhdGEgcHJvcGVydHkuXG4gICAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gZmFpbCBzaWxlbnRseSBpZiAnd3JpdGFibGUnLCAnZW51bWVyYWJsZScsIG9yICdjb25maWd1cmFibGUnXG4gICAgICAgICAgICAgICAgLy8gYXJlIHJlcXVlc3RlZCBidXQgbm90IHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRlIGFwcHJvYWNoOlxuICAgICAgICAgICAgICAgIGlmICggLy8gY2FuJ3QgaW1wbGVtZW50IHRoZXNlIGZlYXR1cmVzOyBhbGxvdyBmYWxzZSBidXQgbm90IHRydWVcbiAgICAgICAgICAgICAgICAgICAgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci53cml0YWJsZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKCdlbnVtZXJhYmxlJyBpbiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLmVudW1lcmFibGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICgnY29uZmlndXJhYmxlJyBpbiBkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSlcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGltcGxlbWVudGF0aW9uIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBkb2VzIG5vdCBzdXBwb3J0IGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgb3Igd3JpdGFibGUuJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGxvb2t1cEdldHRlcihvYmplY3QsIHByb3BlcnR5KSB8fCBsb29rdXBTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzIGFjY2Vzc29ycyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gZW5naW5lcyBpbXBsZW1lbnRpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYF9fcHJvdG9fX2Agd2UgY2FuIHNhZmVseSBvdmVycmlkZSBgX19wcm90b19fYCB3aGlsZSBkZWZpbmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHByb3BlcnR5IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhpdCBhbiBpbmhlcml0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXNzb3IuXG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBvYmplY3QuX19wcm90b19fO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlT2ZPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGV0aW5nIGEgcHJvcGVydHkgYW55d2F5IHNpbmNlIGdldHRlciAvIHNldHRlciBtYXkgYmVcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZCBvbiBvYmplY3QgaXRzZWxmLlxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0W3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0W3Byb3BlcnR5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgb3JpZ2luYWwgYF9fcHJvdG9fX2AgYmFjayBub3cuXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYXNHZXR0ZXIgPSAnZ2V0JyBpbiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgICAgIHZhciBoYXNTZXR0ZXIgPSAnc2V0JyBpbiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydHNBY2Nlc3NvcnMgJiYgKGhhc0dldHRlciB8fCBoYXNTZXR0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJSX0FDQ0VTU09SU19OT1RfU1VQUE9SVEVEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoYXQgZmFyIHRoZW4gZ2V0dGVycyBhbmQgc2V0dGVycyBjYW4gYmUgZGVmaW5lZCAhIVxuICAgICAgICAgICAgICAgIGlmIChoYXNHZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lR2V0dGVyKG9iamVjdCwgcHJvcGVydHksIGRlc2NyaXB0b3IuZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhhc1NldHRlcikge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVTZXR0ZXIob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvci5zZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjIuMy43XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjdcbiAgICBpZiAoIU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIHx8IGRlZmluZVByb3BlcnRpZXNGYWxsYmFjaykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBtYWtlIGEgdmFsaWFudCBhdHRlbXB0IHRvIHVzZSB0aGUgcmVhbCBkZWZpbmVQcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoZGVmaW5lUHJvcGVydGllc0ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXNGYWxsYmFjay5jYWxsKE9iamVjdCwgb2JqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZSBzaGltIGlmIHRoZSByZWFsIG9uZSBkb2Vzbid0IHdvcmtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9PSAnX19wcm90b19fJykge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgcHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuMi4zLjhcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuOFxuICAgIGlmICghT2JqZWN0LnNlYWwpIHtcbiAgICAgICAgT2JqZWN0LnNlYWwgPSBmdW5jdGlvbiBzZWFsKG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKE9iamVjdChvYmplY3QpICE9PSBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3Quc2VhbCBjYW4gb25seSBiZSBjYWxsZWQgb24gT2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXRcbiAgICAgICAgICAgIC8vIGFsbG93cyBcInNlY3VyYWJsZVwiIGNvZGUgdG8gXCJncmFjZWZ1bGx5XCIgZGVncmFkZSB0byB3b3JraW5nXG4gICAgICAgICAgICAvLyBidXQgaW5zZWN1cmUgY29kZS5cbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjIuMy45XG4gICAgLy8gaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi4zLjlcbiAgICBpZiAoIU9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZShvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSAhPT0gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmZyZWV6ZSBjYW4gb25seSBiZSBjYWxsZWQgb24gT2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbWlzbGVhZGluZyBhbmQgYnJlYWtzIGZlYXR1cmUtZGV0ZWN0aW9uLCBidXRcbiAgICAgICAgICAgIC8vIGFsbG93cyBcInNlY3VyYWJsZVwiIGNvZGUgdG8gXCJncmFjZWZ1bGx5XCIgZGVncmFkZSB0byB3b3JraW5nXG4gICAgICAgICAgICAvLyBidXQgaW5zZWN1cmUgY29kZS5cbiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZGV0ZWN0IGEgUmhpbm8gYnVnIGFuZCBwYXRjaCBpdFxuICAgIHRyeSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKCkge30pO1xuICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBPYmplY3QuZnJlZXplID0gKGZ1bmN0aW9uIChmcmVlemVPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBmcmVlemUob2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplT2JqZWN0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfShPYmplY3QuZnJlZXplKSk7XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjIuMy4xMFxuICAgIC8vIGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDE1LjIuMy4xMFxuICAgIGlmICghT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7XG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKE9iamVjdChvYmplY3QpICE9PSBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QucHJldmVudEV4dGVuc2lvbnMgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIE9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0aGlzIGlzIG1pc2xlYWRpbmcgYW5kIGJyZWFrcyBmZWF0dXJlLWRldGVjdGlvbiwgYnV0XG4gICAgICAgICAgICAvLyBhbGxvd3MgXCJzZWN1cmFibGVcIiBjb2RlIHRvIFwiZ3JhY2VmdWxseVwiIGRlZ3JhZGUgdG8gd29ya2luZ1xuICAgICAgICAgICAgLy8gYnV0IGluc2VjdXJlIGNvZGUuXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEVTNSAxNS4yLjMuMTFcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTFcbiAgICBpZiAoIU9iamVjdC5pc1NlYWxlZCkge1xuICAgICAgICBPYmplY3QuaXNTZWFsZWQgPSBmdW5jdGlvbiBpc1NlYWxlZChvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSAhPT0gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmlzU2VhbGVkIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEVTNSAxNS4yLjMuMTJcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTJcbiAgICBpZiAoIU9iamVjdC5pc0Zyb3plbikge1xuICAgICAgICBPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiBpc0Zyb3plbihvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChPYmplY3Qob2JqZWN0KSAhPT0gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmlzRnJvemVuIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBPYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEVTNSAxNS4yLjMuMTNcbiAgICAvLyBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3gxNS4yLjMuMTNcbiAgICBpZiAoIU9iamVjdC5pc0V4dGVuc2libGUpIHtcbiAgICAgICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShvYmplY3QpIHtcbiAgICAgICAgICAgIC8vIDEuIElmIFR5cGUoTykgaXMgbm90IE9iamVjdCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uXG4gICAgICAgICAgICBpZiAoT2JqZWN0KG9iamVjdCkgIT09IG9iamVjdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5pc0V4dGVuc2libGUgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIE9iamVjdHMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIEJvb2xlYW4gdmFsdWUgb2YgdGhlIFtbRXh0ZW5zaWJsZV1dIGludGVybmFsIHByb3BlcnR5IG9mIE8uXG4gICAgICAgICAgICB2YXIgbmFtZSA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKG93bnMob2JqZWN0LCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIG5hbWUgKz0gJz8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqZWN0W25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IG93bnMob2JqZWN0LCBuYW1lKTtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmplY3RbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuXG59KSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJ2VzNi1zaGltJyk7XG5cbnJlcXVpcmUoJ2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL3NoaW0nKSgpO1xuXG5yZXF1aXJlKCcuL2VzMjAxNicpO1xuIiwiLyohXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL2VzNi1zaGltXG4gKiBAbGljZW5zZSBlczYtc2hpbSBDb3B5cmlnaHQgMjAxMy0yMDE2IGJ5IFBhdWwgTWlsbGVyIChodHRwOi8vcGF1bG1pbGxyLmNvbSlcbiAqICAgYW5kIGNvbnRyaWJ1dG9ycywgIE1JVCBMaWNlbnNlXG4gKiBlczYtc2hpbTogdjAuMzUuNFxuICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvZXM2LXNoaW0vYmxvYi8wLjM1LjMvTElDRU5TRVxuICogRGV0YWlscyBhbmQgZG9jdW1lbnRhdGlvbjpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvZXM2LXNoaW0vXG4gKi9cblxuLy8gVU1EIChVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24pXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3VtZGpzL3VtZC9ibG9iL21hc3Rlci9yZXR1cm5FeHBvcnRzLmpzXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgLypnbG9iYWwgZGVmaW5lLCBtb2R1bGUsIGV4cG9ydHMgKi9cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICBkZWZpbmUoZmFjdG9yeSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgLy8gbGlrZSBOb2RlLlxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgcm9vdC5yZXR1cm5FeHBvcnRzID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBfYXBwbHkgPSBGdW5jdGlvbi5jYWxsLmJpbmQoRnVuY3Rpb24uYXBwbHkpO1xuICB2YXIgX2NhbGwgPSBGdW5jdGlvbi5jYWxsLmJpbmQoRnVuY3Rpb24uY2FsbCk7XG4gIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cztcblxuICB2YXIgbm90ID0gZnVuY3Rpb24gbm90VGh1bmtlcihmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5vdFRodW5rKCkge1xuICAgICAgcmV0dXJuICFfYXBwbHkoZnVuYywgdGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9O1xuICB2YXIgdGhyb3dzRXJyb3IgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgIHRyeSB7XG4gICAgICBmdW5jKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9O1xuICB2YXIgdmFsdWVPckZhbHNlSWZUaHJvd3MgPSBmdW5jdGlvbiB2YWx1ZU9yRmFsc2VJZlRocm93cyhmdW5jKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNDYWxsYWJsZVdpdGhvdXROZXcgPSBub3QodGhyb3dzRXJyb3IpO1xuICB2YXIgYXJlUHJvcGVydHlEZXNjcmlwdG9yc1N1cHBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBpZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZXhpc3RzIGJ1dCB0aHJvd3MsIGl0J3MgSUUgOFxuICAgIHJldHVybiAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7IGdldDogZnVuY3Rpb24gKCkgeyB9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB9KTtcbiAgfTtcbiAgdmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSAhIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBhcmVQcm9wZXJ0eURlc2NyaXB0b3JzU3VwcG9ydGVkKCk7XG4gIHZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gZm9vKCkge30pLm5hbWUgPT09ICdmb28nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXBhcmVuc1xuXG4gIHZhciBfZm9yRWFjaCA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZm9yRWFjaCk7XG4gIHZhciBfcmVkdWNlID0gRnVuY3Rpb24uY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5yZWR1Y2UpO1xuICB2YXIgX2ZpbHRlciA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZmlsdGVyKTtcbiAgdmFyIF9zb21lID0gRnVuY3Rpb24uY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5zb21lKTtcblxuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCB2YWx1ZSwgZm9yY2UpIHtcbiAgICBpZiAoIWZvcmNlICYmIG5hbWUgaW4gb2JqZWN0KSB7IHJldHVybjsgfVxuICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmplY3RbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRGVmaW5lIGNvbmZpZ3VyYWJsZSwgd3JpdGFibGUgYW5kIG5vbi1lbnVtZXJhYmxlIHByb3BzXG4gIC8vIGlmIHRoZXkgZG9u4oCZdCBleGlzdC5cbiAgdmFyIGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqZWN0LCBtYXAsIGZvcmNlT3ZlcnJpZGUpIHtcbiAgICBfZm9yRWFjaChrZXlzKG1hcCksIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgbWV0aG9kID0gbWFwW25hbWVdO1xuICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCBtZXRob2QsICEhZm9yY2VPdmVycmlkZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIF90b1N0cmluZyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKTtcbiAgdmFyIGlzQ2FsbGFibGUgPSB0eXBlb2YgL2FiYy8gPT09ICdmdW5jdGlvbicgPyBmdW5jdGlvbiBJc0NhbGxhYmxlU2xvdyh4KSB7XG4gICAgLy8gU29tZSBvbGQgYnJvd3NlcnMgKElFLCBGRikgc2F5IHRoYXQgdHlwZW9mIC9hYmMvID09PSAnZnVuY3Rpb24nXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nICYmIF90b1N0cmluZyh4KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfSA6IGZ1bmN0aW9uIElzQ2FsbGFibGVGYXN0KHgpIHsgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nOyB9O1xuXG4gIHZhciBWYWx1ZSA9IHtcbiAgICBnZXR0ZXI6IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIGdldHRlcikge1xuICAgICAgaWYgKCFzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2dldHRlcnMgcmVxdWlyZSB0cnVlIEVTNSBzdXBwb3J0Jyk7XG4gICAgICB9XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGdldDogZ2V0dGVyXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByb3h5OiBmdW5jdGlvbiAob3JpZ2luYWxPYmplY3QsIGtleSwgdGFyZ2V0T2JqZWN0KSB7XG4gICAgICBpZiAoIXN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0dGVycyByZXF1aXJlIHRydWUgRVM1IHN1cHBvcnQnKTtcbiAgICAgIH1cbiAgICAgIHZhciBvcmlnaW5hbERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9yaWdpbmFsT2JqZWN0LCBrZXkpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldE9iamVjdCwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogb3JpZ2luYWxEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgZW51bWVyYWJsZTogb3JpZ2luYWxEZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gZ2V0S2V5KCkgeyByZXR1cm4gb3JpZ2luYWxPYmplY3Rba2V5XTsgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXRLZXkodmFsdWUpIHsgb3JpZ2luYWxPYmplY3Rba2V5XSA9IHZhbHVlOyB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHJlZGVmaW5lOiBmdW5jdGlvbiAob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpIHtcbiAgICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBkZWZpbmVCeURlc2NyaXB0b3I6IGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5LCBkZXNjcmlwdG9yKSB7XG4gICAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcik7XG4gICAgICB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgICBvYmplY3RbcHJvcGVydHldID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHByZXNlcnZlVG9TdHJpbmc6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZSAmJiBpc0NhbGxhYmxlKHNvdXJjZS50b1N0cmluZykpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCAndG9TdHJpbmcnLCBzb3VyY2UudG9TdHJpbmcuYmluZChzb3VyY2UpLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gU2ltcGxlIHNoaW0gZm9yIE9iamVjdC5jcmVhdGUgb24gRVMzIGJyb3dzZXJzXG4gIC8vICh1bmxpa2UgcmVhbCBzaGltLCBubyBhdHRlbXB0IHRvIHN1cHBvcnQgYHByb3RvdHlwZSA9PT0gbnVsbGApXG4gIHZhciBjcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIChwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICB2YXIgUHJvdG90eXBlID0gZnVuY3Rpb24gUHJvdG90eXBlKCkge307XG4gICAgUHJvdG90eXBlLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgICB2YXIgb2JqZWN0ID0gbmV3IFByb3RvdHlwZSgpO1xuICAgIGlmICh0eXBlb2YgcHJvcGVydGllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMocHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIFZhbHVlLmRlZmluZUJ5RGVzY3JpcHRvcihvYmplY3QsIGtleSwgcHJvcGVydGllc1trZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xuXG4gIHZhciBzdXBwb3J0c1N1YmNsYXNzaW5nID0gZnVuY3Rpb24gKEMsIGYpIHtcbiAgICBpZiAoIU9iamVjdC5zZXRQcm90b3R5cGVPZikgeyByZXR1cm4gZmFsc2U7IC8qIHNraXAgdGVzdCBvbiBJRSA8IDExICovIH1cbiAgICByZXR1cm4gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIFN1YiA9IGZ1bmN0aW9uIFN1YmNsYXNzKGFyZykge1xuICAgICAgICB2YXIgbyA9IG5ldyBDKGFyZyk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihvLCBTdWJjbGFzcy5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH07XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoU3ViLCBDKTtcbiAgICAgIFN1Yi5wcm90b3R5cGUgPSBjcmVhdGUoQy5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IFN1YiB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmKFN1Yik7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvKiBnbG9iYWwgc2VsZiwgd2luZG93LCBnbG9iYWwgKi9cbiAgICAvLyB0aGUgb25seSByZWxpYWJsZSBtZWFucyB0byBnZXQgdGhlIGdsb2JhbCBvYmplY3QgaXNcbiAgICAvLyBgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKWBcbiAgICAvLyBIb3dldmVyLCB0aGlzIGNhdXNlcyBDU1AgdmlvbGF0aW9ucyBpbiBDaHJvbWUgYXBwcy5cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiBzZWxmOyB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiB3aW5kb3c7IH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGdsb2JhbDsgfVxuICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Jyk7XG4gIH07XG5cbiAgdmFyIGdsb2JhbHMgPSBnZXRHbG9iYWwoKTtcbiAgdmFyIGdsb2JhbElzRmluaXRlID0gZ2xvYmFscy5pc0Zpbml0ZTtcbiAgdmFyIF9pbmRleE9mID0gRnVuY3Rpb24uY2FsbC5iaW5kKFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZik7XG4gIHZhciBfYXJyYXlJbmRleE9mQXBwbHkgPSBGdW5jdGlvbi5hcHBseS5iaW5kKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKTtcbiAgdmFyIF9jb25jYXQgPSBGdW5jdGlvbi5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLmNvbmNhdCk7XG4gIC8vIHZhciBfc29ydCA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuc29ydCk7XG4gIHZhciBfc3RyU2xpY2UgPSBGdW5jdGlvbi5jYWxsLmJpbmQoU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG4gIHZhciBfcHVzaCA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gIHZhciBfcHVzaEFwcGx5ID0gRnVuY3Rpb24uYXBwbHkuYmluZChBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gIHZhciBfc2hpZnQgPSBGdW5jdGlvbi5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLnNoaWZ0KTtcbiAgdmFyIF9tYXggPSBNYXRoLm1heDtcbiAgdmFyIF9taW4gPSBNYXRoLm1pbjtcbiAgdmFyIF9mbG9vciA9IE1hdGguZmxvb3I7XG4gIHZhciBfYWJzID0gTWF0aC5hYnM7XG4gIHZhciBfZXhwID0gTWF0aC5leHA7XG4gIHZhciBfbG9nID0gTWF0aC5sb2c7XG4gIHZhciBfc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIF9oYXNPd25Qcm9wZXJ0eSA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiAgdmFyIEFycmF5SXRlcmF0b3I7IC8vIG1ha2Ugb3VyIGltcGxlbWVudGF0aW9uIHByaXZhdGVcbiAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcblxuICB2YXIgT3JpZ01hcCA9IGdsb2JhbHMuTWFwO1xuICB2YXIgb3JpZ01hcERlbGV0ZSA9IE9yaWdNYXAgJiYgT3JpZ01hcC5wcm90b3R5cGVbJ2RlbGV0ZSddO1xuICB2YXIgb3JpZ01hcEdldCA9IE9yaWdNYXAgJiYgT3JpZ01hcC5wcm90b3R5cGUuZ2V0O1xuICB2YXIgb3JpZ01hcEhhcyA9IE9yaWdNYXAgJiYgT3JpZ01hcC5wcm90b3R5cGUuaGFzO1xuICB2YXIgb3JpZ01hcFNldCA9IE9yaWdNYXAgJiYgT3JpZ01hcC5wcm90b3R5cGUuc2V0O1xuXG4gIHZhciBTeW1ib2wgPSBnbG9iYWxzLlN5bWJvbCB8fCB7fTtcbiAgdmFyIHN5bWJvbFNwZWNpZXMgPSBTeW1ib2wuc3BlY2llcyB8fCAnQEBzcGVjaWVzJztcblxuICB2YXIgbnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAvLyBOYU4gIT09IE5hTiwgYnV0IHRoZXkgYXJlIGlkZW50aWNhbC5cbiAgICAvLyBOYU5zIGFyZSB0aGUgb25seSBub24tcmVmbGV4aXZlIHZhbHVlLCBpLmUuLCBpZiB4ICE9PSB4LFxuICAgIC8vIHRoZW4geCBpcyBOYU4uXG4gICAgLy8gaXNOYU4gaXMgYnJva2VuOiBpdCBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gbnVtYmVyLCBzb1xuICAgIC8vIGlzTmFOKCdmb28nKSA9PiB0cnVlXG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbiAgfTtcbiAgdmFyIG51bWJlcklzRmluaXRlID0gTnVtYmVyLmlzRmluaXRlIHx8IGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgZ2xvYmFsSXNGaW5pdGUodmFsdWUpO1xuICB9O1xuICB2YXIgX3NpZ24gPSBpc0NhbGxhYmxlKE1hdGguc2lnbikgPyBNYXRoLnNpZ24gOiBmdW5jdGlvbiBzaWduKHZhbHVlKSB7XG4gICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKG51bWJlciA9PT0gMCkgeyByZXR1cm4gbnVtYmVyOyB9XG4gICAgaWYgKG51bWJlcklzTmFOKG51bWJlcikpIHsgcmV0dXJuIG51bWJlcjsgfVxuICAgIHJldHVybiBudW1iZXIgPCAwID8gLTEgOiAxO1xuICB9O1xuICB2YXIgX2xvZzFwID0gZnVuY3Rpb24gbG9nMXAodmFsdWUpIHtcbiAgICB2YXIgeCA9IE51bWJlcih2YWx1ZSk7XG4gICAgaWYgKHggPCAtMSB8fCBudW1iZXJJc05hTih4KSkgeyByZXR1cm4gTmFOOyB9XG4gICAgaWYgKHggPT09IDAgfHwgeCA9PT0gSW5maW5pdHkpIHsgcmV0dXJuIHg7IH1cbiAgICBpZiAoeCA9PT0gLTEpIHsgcmV0dXJuIC1JbmZpbml0eTsgfVxuXG4gICAgcmV0dXJuICgxICsgeCkgLSAxID09PSAwID8geCA6IHggKiAoX2xvZygxICsgeCkgLyAoKDEgKyB4KSAtIDEpKTtcbiAgfTtcblxuICAvLyB0YWtlbiBkaXJlY3RseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvaXMtYXJndW1lbnRzL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4gIC8vIGNhbiBiZSByZXBsYWNlZCB3aXRoIHJlcXVpcmUoJ2lzLWFyZ3VtZW50cycpIGlmIHdlIGV2ZXIgdXNlIGEgYnVpbGQgcHJvY2VzcyBpbnN0ZWFkXG4gIHZhciBpc1N0YW5kYXJkQXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgICByZXR1cm4gX3RvU3RyaW5nKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSc7XG4gIH07XG4gIHZhciBpc0xlZ2FjeUFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJyAmJlxuICAgICAgdmFsdWUubGVuZ3RoID49IDAgJiZcbiAgICAgIF90b1N0cmluZyh2YWx1ZSkgIT09ICdbb2JqZWN0IEFycmF5XScgJiZcbiAgICAgIF90b1N0cmluZyh2YWx1ZS5jYWxsZWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICB9O1xuICB2YXIgaXNBcmd1bWVudHMgPSBpc1N0YW5kYXJkQXJndW1lbnRzKGFyZ3VtZW50cykgPyBpc1N0YW5kYXJkQXJndW1lbnRzIDogaXNMZWdhY3lBcmd1bWVudHM7XG5cbiAgdmFyIFR5cGUgPSB7XG4gICAgcHJpbWl0aXZlOiBmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA9PT0gbnVsbCB8fCAodHlwZW9mIHggIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHggIT09ICdvYmplY3QnKTsgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uICh4KSB7IHJldHVybiBfdG9TdHJpbmcoeCkgPT09ICdbb2JqZWN0IFN0cmluZ10nOyB9LFxuICAgIHJlZ2V4OiBmdW5jdGlvbiAoeCkgeyByZXR1cm4gX3RvU3RyaW5nKHgpID09PSAnW29iamVjdCBSZWdFeHBdJzsgfSxcbiAgICBzeW1ib2w6IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGdsb2JhbHMuU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB4ID09PSAnc3ltYm9sJztcbiAgICB9XG4gIH07XG5cbiAgdmFyIG92ZXJyaWRlTmF0aXZlID0gZnVuY3Rpb24gb3ZlcnJpZGVOYXRpdmUob2JqZWN0LCBwcm9wZXJ0eSwgcmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSBvYmplY3RbcHJvcGVydHldO1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHJlcGxhY2VtZW50LCB0cnVlKTtcbiAgICBWYWx1ZS5wcmVzZXJ2ZVRvU3RyaW5nKG9iamVjdFtwcm9wZXJ0eV0sIG9yaWdpbmFsKTtcbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG4gIHZhciBoYXNTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sWydmb3InXSA9PT0gJ2Z1bmN0aW9uJyAmJiBUeXBlLnN5bWJvbChTeW1ib2woKSk7XG5cbiAgLy8gVGhpcyBpcyBhIHByaXZhdGUgbmFtZSBpbiB0aGUgZXM2IHNwZWMsIGVxdWFsIHRvICdbU3ltYm9sLml0ZXJhdG9yXSdcbiAgLy8gd2UncmUgZ29pbmcgdG8gdXNlIGFuIGFyYml0cmFyeSBfLXByZWZpeGVkIG5hbWUgdG8gbWFrZSBvdXIgc2hpbXNcbiAgLy8gd29yayBwcm9wZXJseSB3aXRoIGVhY2ggb3RoZXIsIGV2ZW4gdGhvdWdoIHdlIGRvbid0IGhhdmUgZnVsbCBJdGVyYXRvclxuICAvLyBzdXBwb3J0LiAgVGhhdCBpcywgYEFycmF5LmZyb20obWFwLmtleXMoKSlgIHdpbGwgd29yaywgYnV0IHdlIGRvbid0XG4gIC8vIHByZXRlbmQgdG8gZXhwb3J0IGEgXCJyZWFsXCIgSXRlcmF0b3IgaW50ZXJmYWNlLlxuICB2YXIgJGl0ZXJhdG9yJCA9IFR5cGUuc3ltYm9sKFN5bWJvbC5pdGVyYXRvcikgPyBTeW1ib2wuaXRlcmF0b3IgOiAnX2VzNi1zaGltIGl0ZXJhdG9yXyc7XG4gIC8vIEZpcmVmb3ggc2hpcHMgYSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBuYW1lIEBAaXRlcmF0b3IuXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkwNzA3NyNjMTRcbiAgLy8gU28gdXNlIHRoYXQgbmFtZSBpZiB3ZSBkZXRlY3QgaXQuXG4gIGlmIChnbG9iYWxzLlNldCAmJiB0eXBlb2YgbmV3IGdsb2JhbHMuU2V0KClbJ0BAaXRlcmF0b3InXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICRpdGVyYXRvciQgPSAnQEBpdGVyYXRvcic7XG4gIH1cblxuICAvLyBSZWZsZWN0XG4gIGlmICghZ2xvYmFscy5SZWZsZWN0KSB7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFscywgJ1JlZmxlY3QnLCB7fSwgdHJ1ZSk7XG4gIH1cbiAgdmFyIFJlZmxlY3QgPSBnbG9iYWxzLlJlZmxlY3Q7XG5cbiAgdmFyICRTdHJpbmcgPSBTdHJpbmc7XG5cbiAgLyogZ2xvYmFsIGRvY3VtZW50ICovXG4gIHZhciBkb21BbGwgPSAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCAhZG9jdW1lbnQpID8gbnVsbCA6IGRvY3VtZW50LmFsbDtcbiAgdmFyIGlzTnVsbE9yVW5kZWZpbmVkID0gZG9tQWxsID09IG51bGwgPyBmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZCh4KSB7XG4gICAgcmV0dXJuIHggPT0gbnVsbDtcbiAgfSA6IGZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkQW5kTm90RG9jdW1lbnRBbGwoeCkge1xuICAgIHJldHVybiB4ID09IG51bGwgJiYgeCAhPT0gZG9tQWxsO1xuICB9O1xuXG4gIHZhciBFUyA9IHtcbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtY2FsbFxuICAgIENhbGw6IGZ1bmN0aW9uIENhbGwoRiwgVikge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IFtdO1xuICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKEYpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfYXBwbHkoRiwgViwgYXJncyk7XG4gICAgfSxcblxuICAgIFJlcXVpcmVPYmplY3RDb2VyY2libGU6IGZ1bmN0aW9uICh4LCBvcHRNZXNzYWdlKSB7XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihvcHRNZXNzYWdlIHx8ICdDYW5ub3QgY2FsbCBtZXRob2Qgb24gJyArIHgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfSxcblxuICAgIC8vIFRoaXMgbWlnaHQgbWlzcyB0aGUgXCIobm9uLXN0YW5kYXJkIGV4b3RpYyBhbmQgZG9lcyBub3QgaW1wbGVtZW50XG4gICAgLy8gW1tDYWxsXV0pXCIgY2FzZSBmcm9tXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXR5cGVvZi1vcGVyYXRvci1ydW50aW1lLXNlbWFudGljcy1ldmFsdWF0aW9uXG4gICAgLy8gYnV0IHdlIGNhbid0IGZpbmQgYW55IGV2aWRlbmNlIHRoZXNlIG9iamVjdHMgZXhpc3QgaW4gcHJhY3RpY2UuXG4gICAgLy8gSWYgd2UgZmluZCBzb21lIGluIHRoZSBmdXR1cmUsIHlvdSBjb3VsZCB0ZXN0IGBPYmplY3QoeCkgPT09IHhgLFxuICAgIC8vIHdoaWNoIGlzIHJlbGlhYmxlIGFjY29yZGluZyB0b1xuICAgIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b29iamVjdFxuICAgIC8vIGJ1dCBpcyBub3Qgd2VsbCBvcHRpbWl6ZWQgYnkgcnVudGltZXMgYW5kIGNyZWF0ZXMgYW4gb2JqZWN0XG4gICAgLy8gd2hlbmV2ZXIgaXQgcmV0dXJucyBmYWxzZSwgYW5kIHRodXMgaXMgdmVyeSBzbG93LlxuICAgIFR5cGVJc09iamVjdDogZnVuY3Rpb24gKHgpIHtcbiAgICAgIGlmICh4ID09PSB2b2lkIDAgfHwgeCA9PT0gbnVsbCB8fCB4ID09PSB0cnVlIHx8IHggPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgeCA9PT0gJ29iamVjdCcgfHwgeCA9PT0gZG9tQWxsO1xuICAgIH0sXG5cbiAgICBUb09iamVjdDogZnVuY3Rpb24gKG8sIG9wdE1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBPYmplY3QoRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZShvLCBvcHRNZXNzYWdlKSk7XG4gICAgfSxcblxuICAgIElzQ2FsbGFibGU6IGlzQ2FsbGFibGUsXG5cbiAgICBJc0NvbnN0cnVjdG9yOiBmdW5jdGlvbiAoeCkge1xuICAgICAgLy8gV2UgY2FuJ3QgdGVsbCBjYWxsYWJsZXMgZnJvbSBjb25zdHJ1Y3RvcnMgaW4gRVM1XG4gICAgICByZXR1cm4gRVMuSXNDYWxsYWJsZSh4KTtcbiAgICB9LFxuXG4gICAgVG9JbnQzMjogZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBFUy5Ub051bWJlcih4KSA+PiAwO1xuICAgIH0sXG5cbiAgICBUb1VpbnQzMjogZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBFUy5Ub051bWJlcih4KSA+Pj4gMDtcbiAgICB9LFxuXG4gICAgVG9OdW1iZXI6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKF90b1N0cmluZyh2YWx1ZSkgPT09ICdbb2JqZWN0IFN5bWJvbF0nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gK3ZhbHVlO1xuICAgIH0sXG5cbiAgICBUb0ludGVnZXI6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIG51bWJlciA9IEVTLlRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmIChudW1iZXJJc05hTihudW1iZXIpKSB7IHJldHVybiAwOyB9XG4gICAgICBpZiAobnVtYmVyID09PSAwIHx8ICFudW1iZXJJc0Zpbml0ZShudW1iZXIpKSB7IHJldHVybiBudW1iZXI7IH1cbiAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBfZmxvb3IoX2FicyhudW1iZXIpKTtcbiAgICB9LFxuXG4gICAgVG9MZW5ndGg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIGxlbiA9IEVTLlRvSW50ZWdlcih2YWx1ZSk7XG4gICAgICBpZiAobGVuIDw9IDApIHsgcmV0dXJuIDA7IH0gLy8gaW5jbHVkZXMgY29udmVydGluZyAtMCB0byArMFxuICAgICAgaWYgKGxlbiA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7IHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjsgfVxuICAgICAgcmV0dXJuIGxlbjtcbiAgICB9LFxuXG4gICAgU2FtZVZhbHVlOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgLy8gMCA9PT0gLTAsIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLlxuICAgICAgICBpZiAoYSA9PT0gMCkgeyByZXR1cm4gMSAvIGEgPT09IDEgLyBiOyB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcklzTmFOKGEpICYmIG51bWJlcklzTmFOKGIpO1xuICAgIH0sXG5cbiAgICBTYW1lVmFsdWVaZXJvOiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgLy8gc2FtZSBhcyBTYW1lVmFsdWUgZXhjZXB0IGZvciBTYW1lVmFsdWVaZXJvKCswLCAtMCkgPT0gdHJ1ZVxuICAgICAgcmV0dXJuIChhID09PSBiKSB8fCAobnVtYmVySXNOYU4oYSkgJiYgbnVtYmVySXNOYU4oYikpO1xuICAgIH0sXG5cbiAgICBJc0l0ZXJhYmxlOiBmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIEVTLlR5cGVJc09iamVjdChvKSAmJiAodHlwZW9mIG9bJGl0ZXJhdG9yJF0gIT09ICd1bmRlZmluZWQnIHx8IGlzQXJndW1lbnRzKG8pKTtcbiAgICB9LFxuXG4gICAgR2V0SXRlcmF0b3I6IGZ1bmN0aW9uIChvKSB7XG4gICAgICBpZiAoaXNBcmd1bWVudHMobykpIHtcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHN1cHBvcnQgZm9yIGBhcmd1bWVudHNgXG4gICAgICAgIHJldHVybiBuZXcgQXJyYXlJdGVyYXRvcihvLCAndmFsdWUnKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdEZuID0gRVMuR2V0TWV0aG9kKG8sICRpdGVyYXRvciQpO1xuICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKGl0Rm4pKSB7XG4gICAgICAgIC8vIEJldHRlciBkaWFnbm9zdGljcyBpZiBpdEZuIGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbHVlIGlzIG5vdCBhbiBpdGVyYWJsZScpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ID0gRVMuQ2FsbChpdEZuLCBvKTtcbiAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KGl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiYWQgaXRlcmF0b3InKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdDtcbiAgICB9LFxuXG4gICAgR2V0TWV0aG9kOiBmdW5jdGlvbiAobywgcCkge1xuICAgICAgdmFyIGZ1bmMgPSBFUy5Ub09iamVjdChvKVtwXTtcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChmdW5jKSkge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01ldGhvZCBub3QgY2FsbGFibGU6ICcgKyBwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jO1xuICAgIH0sXG5cbiAgICBJdGVyYXRvckNvbXBsZXRlOiBmdW5jdGlvbiAoaXRlclJlc3VsdCkge1xuICAgICAgcmV0dXJuICEhaXRlclJlc3VsdC5kb25lO1xuICAgIH0sXG5cbiAgICBJdGVyYXRvckNsb3NlOiBmdW5jdGlvbiAoaXRlcmF0b3IsIGNvbXBsZXRpb25Jc1Rocm93KSB7XG4gICAgICB2YXIgcmV0dXJuTWV0aG9kID0gRVMuR2V0TWV0aG9kKGl0ZXJhdG9yLCAncmV0dXJuJyk7XG4gICAgICBpZiAocmV0dXJuTWV0aG9kID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGlubmVyUmVzdWx0LCBpbm5lckV4Y2VwdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlubmVyUmVzdWx0ID0gRVMuQ2FsbChyZXR1cm5NZXRob2QsIGl0ZXJhdG9yKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaW5uZXJFeGNlcHRpb24gPSBlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBsZXRpb25Jc1Rocm93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbm5lckV4Y2VwdGlvbikge1xuICAgICAgICB0aHJvdyBpbm5lckV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KGlubmVyUmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSXRlcmF0b3IncyByZXR1cm4gbWV0aG9kIHJldHVybmVkIGEgbm9uLW9iamVjdC5cIik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIEl0ZXJhdG9yTmV4dDogZnVuY3Rpb24gKGl0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBpdC5uZXh0KGFyZ3VtZW50c1sxXSkgOiBpdC5uZXh0KCk7XG4gICAgICBpZiAoIUVTLlR5cGVJc09iamVjdChyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2JhZCBpdGVyYXRvcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgSXRlcmF0b3JTdGVwOiBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHZhciByZXN1bHQgPSBFUy5JdGVyYXRvck5leHQoaXQpO1xuICAgICAgdmFyIGRvbmUgPSBFUy5JdGVyYXRvckNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm4gZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgIH0sXG5cbiAgICBDb25zdHJ1Y3Q6IGZ1bmN0aW9uIChDLCBhcmdzLCBuZXdUYXJnZXQsIGlzRVM2aW50ZXJuYWwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSB0eXBlb2YgbmV3VGFyZ2V0ID09PSAndW5kZWZpbmVkJyA/IEMgOiBuZXdUYXJnZXQ7XG5cbiAgICAgIGlmICghaXNFUzZpbnRlcm5hbCAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBUcnkgdG8gdXNlIFJlZmxlY3QuY29uc3RydWN0IGlmIGF2YWlsYWJsZVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QoQywgYXJncywgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIC8vIE9LLCB3ZSBoYXZlIHRvIGZha2UgaXQuICBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZVxuICAgICAgLy8gQy5bW0NvbnN0cnVjdG9yS2luZF1dID09IFwiYmFzZVwiIC0tIGJ1dCB0aGF0J3MgdGhlIG9ubHlcbiAgICAgIC8vIGtpbmQgd2UgY2FuIG1ha2UgaW4gRVM1IGNvZGUgYW55d2F5LlxuXG4gICAgICAvLyBPcmRpbmFyeUNyZWF0ZUZyb21Db25zdHJ1Y3Rvcih0YXJnZXQsIFwiJU9iamVjdFByb3RvdHlwZSVcIilcbiAgICAgIHZhciBwcm90byA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICBpZiAoIUVTLlR5cGVJc09iamVjdChwcm90bykpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuICAgICAgfVxuICAgICAgdmFyIG9iaiA9IGNyZWF0ZShwcm90byk7XG4gICAgICAvLyBDYWxsIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciByZXN1bHQgPSBFUy5DYWxsKEMsIG9iaiwgYXJncyk7XG4gICAgICByZXR1cm4gRVMuVHlwZUlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBvYmo7XG4gICAgfSxcblxuICAgIFNwZWNpZXNDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKE8sIGRlZmF1bHRDb25zdHJ1Y3Rvcikge1xuICAgICAgdmFyIEMgPSBPLmNvbnN0cnVjdG9yO1xuICAgICAgaWYgKEMgPT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0cnVjdG9yO1xuICAgICAgfVxuICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QoQykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGNvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICB2YXIgUyA9IENbc3ltYm9sU3BlY2llc107XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoUykpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdHJ1Y3RvcjtcbiAgICAgIH1cbiAgICAgIGlmICghRVMuSXNDb25zdHJ1Y3RvcihTKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgQEBzcGVjaWVzJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUztcbiAgICB9LFxuXG4gICAgQ3JlYXRlSFRNTDogZnVuY3Rpb24gKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG4gICAgICB2YXIgUyA9IEVTLlRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB2YXIgcDEgPSAnPCcgKyB0YWc7XG4gICAgICBpZiAoYXR0cmlidXRlICE9PSAnJykge1xuICAgICAgICB2YXIgViA9IEVTLlRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgdmFyIGVzY2FwZWRWID0gVi5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG4gICAgICAgIHAxICs9ICcgJyArIGF0dHJpYnV0ZSArICc9XCInICsgZXNjYXBlZFYgKyAnXCInO1xuICAgICAgfVxuICAgICAgdmFyIHAyID0gcDEgKyAnPic7XG4gICAgICB2YXIgcDMgPSBwMiArIFM7XG4gICAgICByZXR1cm4gcDMgKyAnPC8nICsgdGFnICsgJz4nO1xuICAgIH0sXG5cbiAgICBJc1JlZ0V4cDogZnVuY3Rpb24gSXNSZWdFeHAoYXJndW1lbnQpIHtcbiAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KGFyZ3VtZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgaXNSZWdFeHAgPSBhcmd1bWVudFtTeW1ib2wubWF0Y2hdO1xuICAgICAgaWYgKHR5cGVvZiBpc1JlZ0V4cCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICEhaXNSZWdFeHA7XG4gICAgICB9XG4gICAgICByZXR1cm4gVHlwZS5yZWdleChhcmd1bWVudCk7XG4gICAgfSxcblxuICAgIFRvU3RyaW5nOiBmdW5jdGlvbiBUb1N0cmluZyhzdHJpbmcpIHtcbiAgICAgIHJldHVybiAkU3RyaW5nKHN0cmluZyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFdlbGwta25vd24gU3ltYm9sIHNoaW1zXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzICYmIGhhc1N5bWJvbHMpIHtcbiAgICB2YXIgZGVmaW5lV2VsbEtub3duU3ltYm9sID0gZnVuY3Rpb24gZGVmaW5lV2VsbEtub3duU3ltYm9sKG5hbWUpIHtcbiAgICAgIGlmIChUeXBlLnN5bWJvbChTeW1ib2xbbmFtZV0pKSB7XG4gICAgICAgIHJldHVybiBTeW1ib2xbbmFtZV07XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG4gICAgICB2YXIgc3ltID0gU3ltYm9sWydmb3InXSgnU3ltYm9sLicgKyBuYW1lKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTeW1ib2wsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHN5bVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3ltO1xuICAgIH07XG4gICAgaWYgKCFUeXBlLnN5bWJvbChTeW1ib2wuc2VhcmNoKSkge1xuICAgICAgdmFyIHN5bWJvbFNlYXJjaCA9IGRlZmluZVdlbGxLbm93blN5bWJvbCgnc2VhcmNoJyk7XG4gICAgICB2YXIgb3JpZ2luYWxTZWFyY2ggPSBTdHJpbmcucHJvdG90eXBlLnNlYXJjaDtcbiAgICAgIGRlZmluZVByb3BlcnR5KFJlZ0V4cC5wcm90b3R5cGUsIHN5bWJvbFNlYXJjaCwgZnVuY3Rpb24gc2VhcmNoKHN0cmluZykge1xuICAgICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbFNlYXJjaCwgc3RyaW5nLCBbdGhpc10pO1xuICAgICAgfSk7XG4gICAgICB2YXIgc2VhcmNoU2hpbSA9IGZ1bmN0aW9uIHNlYXJjaChyZWdleHApIHtcbiAgICAgICAgdmFyIE8gPSBFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHJlZ2V4cCkpIHtcbiAgICAgICAgICB2YXIgc2VhcmNoZXIgPSBFUy5HZXRNZXRob2QocmVnZXhwLCBzeW1ib2xTZWFyY2gpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gRVMuQ2FsbChzZWFyY2hlciwgcmVnZXhwLCBbT10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbFNlYXJjaCwgTywgW0VTLlRvU3RyaW5nKHJlZ2V4cCldKTtcbiAgICAgIH07XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAnc2VhcmNoJywgc2VhcmNoU2hpbSk7XG4gICAgfVxuICAgIGlmICghVHlwZS5zeW1ib2woU3ltYm9sLnJlcGxhY2UpKSB7XG4gICAgICB2YXIgc3ltYm9sUmVwbGFjZSA9IGRlZmluZVdlbGxLbm93blN5bWJvbCgncmVwbGFjZScpO1xuICAgICAgdmFyIG9yaWdpbmFsUmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbiAgICAgIGRlZmluZVByb3BlcnR5KFJlZ0V4cC5wcm90b3R5cGUsIHN5bWJvbFJlcGxhY2UsIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxSZXBsYWNlLCBzdHJpbmcsIFt0aGlzLCByZXBsYWNlVmFsdWVdKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIHJlcGxhY2VTaGltID0gZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICAgIHZhciBPID0gRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChzZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgICB2YXIgcmVwbGFjZXIgPSBFUy5HZXRNZXRob2Qoc2VhcmNoVmFsdWUsIHN5bWJvbFJlcGxhY2UpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gRVMuQ2FsbChyZXBsYWNlciwgc2VhcmNoVmFsdWUsIFtPLCByZXBsYWNlVmFsdWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxSZXBsYWNlLCBPLCBbRVMuVG9TdHJpbmcoc2VhcmNoVmFsdWUpLCByZXBsYWNlVmFsdWVdKTtcbiAgICAgIH07XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAncmVwbGFjZScsIHJlcGxhY2VTaGltKTtcbiAgICB9XG4gICAgaWYgKCFUeXBlLnN5bWJvbChTeW1ib2wuc3BsaXQpKSB7XG4gICAgICB2YXIgc3ltYm9sU3BsaXQgPSBkZWZpbmVXZWxsS25vd25TeW1ib2woJ3NwbGl0Jyk7XG4gICAgICB2YXIgb3JpZ2luYWxTcGxpdCA9IFN0cmluZy5wcm90b3R5cGUuc3BsaXQ7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShSZWdFeHAucHJvdG90eXBlLCBzeW1ib2xTcGxpdCwgZnVuY3Rpb24gc3BsaXQoc3RyaW5nLCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbFNwbGl0LCBzdHJpbmcsIFt0aGlzLCBsaW1pdF0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgc3BsaXRTaGltID0gZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgICB2YXIgTyA9IEVTLlJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBzcGxpdHRlciA9IEVTLkdldE1ldGhvZChzZXBhcmF0b3IsIHN5bWJvbFNwbGl0KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHNwbGl0dGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIEVTLkNhbGwoc3BsaXR0ZXIsIHNlcGFyYXRvciwgW08sIGxpbWl0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFUy5DYWxsKG9yaWdpbmFsU3BsaXQsIE8sIFtFUy5Ub1N0cmluZyhzZXBhcmF0b3IpLCBsaW1pdF0pO1xuICAgICAgfTtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKFN0cmluZy5wcm90b3R5cGUsICdzcGxpdCcsIHNwbGl0U2hpbSk7XG4gICAgfVxuICAgIHZhciBzeW1ib2xNYXRjaEV4aXN0cyA9IFR5cGUuc3ltYm9sKFN5bWJvbC5tYXRjaCk7XG4gICAgdmFyIHN0cmluZ01hdGNoSWdub3Jlc1N5bWJvbE1hdGNoID0gc3ltYm9sTWF0Y2hFeGlzdHMgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEZpcmVmb3ggNDEsIHRocm91Z2ggTmlnaHRseSA0NSBoYXMgU3ltYm9sLm1hdGNoLCBidXQgU3RyaW5nI21hdGNoIGlnbm9yZXMgaXQuXG4gICAgICAvLyBGaXJlZm94IDQwIGFuZCBiZWxvdyBoYXZlIFN5bWJvbC5tYXRjaCBidXQgU3RyaW5nI21hdGNoIHdvcmtzIGZpbmUuXG4gICAgICB2YXIgbyA9IHt9O1xuICAgICAgb1tTeW1ib2wubWF0Y2hdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gNDI7IH07XG4gICAgICByZXR1cm4gJ2EnLm1hdGNoKG8pICE9PSA0MjtcbiAgICB9KCkpO1xuICAgIGlmICghc3ltYm9sTWF0Y2hFeGlzdHMgfHwgc3RyaW5nTWF0Y2hJZ25vcmVzU3ltYm9sTWF0Y2gpIHtcbiAgICAgIHZhciBzeW1ib2xNYXRjaCA9IGRlZmluZVdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuICAgICAgdmFyIG9yaWdpbmFsTWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xuICAgICAgZGVmaW5lUHJvcGVydHkoUmVnRXhwLnByb3RvdHlwZSwgc3ltYm9sTWF0Y2gsIGZ1bmN0aW9uIG1hdGNoKHN0cmluZykge1xuICAgICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbE1hdGNoLCBzdHJpbmcsIFt0aGlzXSk7XG4gICAgICB9KTtcblxuICAgICAgdmFyIG1hdGNoU2hpbSA9IGZ1bmN0aW9uIG1hdGNoKHJlZ2V4cCkge1xuICAgICAgICB2YXIgTyA9IEVTLlJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQocmVnZXhwKSkge1xuICAgICAgICAgIHZhciBtYXRjaGVyID0gRVMuR2V0TWV0aG9kKHJlZ2V4cCwgc3ltYm9sTWF0Y2gpO1xuICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBFUy5DYWxsKG1hdGNoZXIsIHJlZ2V4cCwgW09dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxNYXRjaCwgTywgW0VTLlRvU3RyaW5nKHJlZ2V4cCldKTtcbiAgICAgIH07XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAnbWF0Y2gnLCBtYXRjaFNoaW0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciB3cmFwQ29uc3RydWN0b3IgPSBmdW5jdGlvbiB3cmFwQ29uc3RydWN0b3Iob3JpZ2luYWwsIHJlcGxhY2VtZW50LCBrZXlzVG9Ta2lwKSB7XG4gICAgVmFsdWUucHJlc2VydmVUb1N0cmluZyhyZXBsYWNlbWVudCwgb3JpZ2luYWwpO1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIC8vIHNldHMgdXAgcHJvcGVyIHByb3RvdHlwZSBjaGFpbiB3aGVyZSBwb3NzaWJsZVxuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9yaWdpbmFsLCByZXBsYWNlbWVudCk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICBfZm9yRWFjaChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcmlnaW5hbCksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSBpbiBub29wIHx8IGtleXNUb1NraXBba2V5XSkgeyByZXR1cm47IH1cbiAgICAgICAgVmFsdWUucHJveHkob3JpZ2luYWwsIGtleSwgcmVwbGFjZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mb3JFYWNoKE9iamVjdC5rZXlzKG9yaWdpbmFsKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5IGluIG5vb3AgfHwga2V5c1RvU2tpcFtrZXldKSB7IHJldHVybjsgfVxuICAgICAgICByZXBsYWNlbWVudFtrZXldID0gb3JpZ2luYWxba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXBsYWNlbWVudC5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgVmFsdWUucmVkZWZpbmUob3JpZ2luYWwucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCByZXBsYWNlbWVudCk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRTcGVjaWVzR2V0dGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcbiAgdmFyIGFkZERlZmF1bHRTcGVjaWVzID0gZnVuY3Rpb24gKEMpIHtcbiAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiAhX2hhc093blByb3BlcnR5KEMsIHN5bWJvbFNwZWNpZXMpKSB7XG4gICAgICBWYWx1ZS5nZXR0ZXIoQywgc3ltYm9sU3BlY2llcywgZGVmYXVsdFNwZWNpZXNHZXR0ZXIpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgYWRkSXRlcmF0b3IgPSBmdW5jdGlvbiAocHJvdG90eXBlLCBpbXBsKSB7XG4gICAgdmFyIGltcGxlbWVudGF0aW9uID0gaW1wbCB8fCBmdW5jdGlvbiBpdGVyYXRvcigpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCAkaXRlcmF0b3IkLCBpbXBsZW1lbnRhdGlvbik7XG4gICAgaWYgKCFwcm90b3R5cGVbJGl0ZXJhdG9yJF0gJiYgVHlwZS5zeW1ib2woJGl0ZXJhdG9yJCkpIHtcbiAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgYnVnZ3kgd2hlbiAkaXRlcmF0b3IkIGlzIGEgU3ltYm9sXG4gICAgICBwcm90b3R5cGVbJGl0ZXJhdG9yJF0gPSBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGNyZWF0ZURhdGFQcm9wZXJ0eSA9IGZ1bmN0aW9uIGNyZWF0ZURhdGFQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqZWN0W25hbWVdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuICB2YXIgY3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyA9IGZ1bmN0aW9uIGNyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3cob2JqZWN0LCBuYW1lLCB2YWx1ZSkge1xuICAgIGNyZWF0ZURhdGFQcm9wZXJ0eShvYmplY3QsIG5hbWUsIHZhbHVlKTtcbiAgICBpZiAoIUVTLlNhbWVWYWx1ZShvYmplY3RbbmFtZV0sIHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJvcGVydHkgaXMgbm9uY29uZmlndXJhYmxlJyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBlbXVsYXRlRVM2Y29uc3RydWN0ID0gZnVuY3Rpb24gKG8sIGRlZmF1bHROZXdUYXJnZXQsIGRlZmF1bHRQcm90bywgc2xvdHMpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGVzNSBhcHByb3hpbWF0aW9uIHRvIGVzNiBjb25zdHJ1Y3Qgc2VtYW50aWNzLiAgaW4gZXM2LFxuICAgIC8vICduZXcgRm9vJyBpbnZva2VzIEZvby5bW0NvbnN0cnVjdF1dIHdoaWNoIChmb3IgYWxtb3N0IGFsbCBvYmplY3RzKVxuICAgIC8vIGp1c3Qgc2V0cyB0aGUgaW50ZXJuYWwgdmFyaWFibGUgTmV3VGFyZ2V0IChpbiBlczYgc3ludGF4IGBuZXcudGFyZ2V0YClcbiAgICAvLyB0byBGb28gYW5kIHRoZW4gcmV0dXJucyBGb28oKS5cblxuICAgIC8vIE1hbnkgRVM2IG9iamVjdCB0aGVuIGhhdmUgY29uc3RydWN0b3JzIG9mIHRoZSBmb3JtOlxuICAgIC8vIDEuIElmIE5ld1RhcmdldCBpcyB1bmRlZmluZWQsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvblxuICAgIC8vIDIuIExldCB4eHggYnkgT3JkaW5hcnlDcmVhdGVGcm9tQ29uc3RydWN0b3IoTmV3VGFyZ2V0LCB5eXksIHp6eilcblxuICAgIC8vIFNvIHdlJ3JlIGdvaW5nIHRvIGVtdWxhdGUgdGhvc2UgZmlyc3QgdHdvIHN0ZXBzLlxuICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KG8pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25zdHJ1Y3RvciByZXF1aXJlcyBgbmV3YDogJyArIGRlZmF1bHROZXdUYXJnZXQubmFtZSk7XG4gICAgfVxuICAgIHZhciBwcm90byA9IGRlZmF1bHROZXdUYXJnZXQucHJvdG90eXBlO1xuICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgcHJvdG8gPSBkZWZhdWx0UHJvdG87XG4gICAgfVxuICAgIHZhciBvYmogPSBjcmVhdGUocHJvdG8pO1xuICAgIGZvciAodmFyIG5hbWUgaW4gc2xvdHMpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkoc2xvdHMsIG5hbWUpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNsb3RzW25hbWVdO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBGaXJlZm94IDMxIHJlcG9ydHMgdGhpcyBmdW5jdGlvbidzIGxlbmd0aCBhcyAwXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjI0ODRcbiAgaWYgKFN0cmluZy5mcm9tQ29kZVBvaW50ICYmIFN0cmluZy5mcm9tQ29kZVBvaW50Lmxlbmd0aCAhPT0gMSkge1xuICAgIHZhciBvcmlnaW5hbEZyb21Db2RlUG9pbnQgPSBTdHJpbmcuZnJvbUNvZGVQb2ludDtcbiAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcsICdmcm9tQ29kZVBvaW50JywgZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjb2RlUG9pbnRzKSB7XG4gICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbEZyb21Db2RlUG9pbnQsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgU3RyaW5nU2hpbXMgPSB7XG4gICAgZnJvbUNvZGVQb2ludDogZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjb2RlUG9pbnRzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB2YXIgbmV4dDtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV4dCA9IE51bWJlcihhcmd1bWVudHNbaV0pO1xuICAgICAgICBpZiAoIUVTLlNhbWVWYWx1ZShuZXh0LCBFUy5Ub0ludGVnZXIobmV4dCkpIHx8IG5leHQgPCAwIHx8IG5leHQgPiAweDEwRkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQgJyArIG5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPCAweDEwMDAwKSB7XG4gICAgICAgICAgX3B1c2gocmVzdWx0LCBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0IC09IDB4MTAwMDA7XG4gICAgICAgICAgX3B1c2gocmVzdWx0LCBTdHJpbmcuZnJvbUNoYXJDb2RlKChuZXh0ID4+IDEwKSArIDB4RDgwMCkpO1xuICAgICAgICAgIF9wdXNoKHJlc3VsdCwgU3RyaW5nLmZyb21DaGFyQ29kZSgobmV4dCAlIDB4NDAwKSArIDB4REMwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xuICAgIH0sXG5cbiAgICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgICAgdmFyIGNvb2tlZCA9IEVTLlRvT2JqZWN0KGNhbGxTaXRlLCAnYmFkIGNhbGxTaXRlJyk7XG4gICAgICB2YXIgcmF3U3RyaW5nID0gRVMuVG9PYmplY3QoY29va2VkLnJhdywgJ2JhZCByYXcgdmFsdWUnKTtcbiAgICAgIHZhciBsZW4gPSByYXdTdHJpbmcubGVuZ3RoO1xuICAgICAgdmFyIGxpdGVyYWxzZWdtZW50cyA9IEVTLlRvTGVuZ3RoKGxlbik7XG4gICAgICBpZiAobGl0ZXJhbHNlZ21lbnRzIDw9IDApIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nRWxlbWVudHMgPSBbXTtcbiAgICAgIHZhciBuZXh0SW5kZXggPSAwO1xuICAgICAgdmFyIG5leHRLZXksIG5leHQsIG5leHRTZWcsIG5leHRTdWI7XG4gICAgICB3aGlsZSAobmV4dEluZGV4IDwgbGl0ZXJhbHNlZ21lbnRzKSB7XG4gICAgICAgIG5leHRLZXkgPSBFUy5Ub1N0cmluZyhuZXh0SW5kZXgpO1xuICAgICAgICBuZXh0U2VnID0gRVMuVG9TdHJpbmcocmF3U3RyaW5nW25leHRLZXldKTtcbiAgICAgICAgX3B1c2goc3RyaW5nRWxlbWVudHMsIG5leHRTZWcpO1xuICAgICAgICBpZiAobmV4dEluZGV4ICsgMSA+PSBsaXRlcmFsc2VnbWVudHMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0ID0gbmV4dEluZGV4ICsgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbbmV4dEluZGV4ICsgMV0gOiAnJztcbiAgICAgICAgbmV4dFN1YiA9IEVTLlRvU3RyaW5nKG5leHQpO1xuICAgICAgICBfcHVzaChzdHJpbmdFbGVtZW50cywgbmV4dFN1Yik7XG4gICAgICAgIG5leHRJbmRleCArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ0VsZW1lbnRzLmpvaW4oJycpO1xuICAgIH1cbiAgfTtcbiAgaWYgKFN0cmluZy5yYXcgJiYgU3RyaW5nLnJhdyh7IHJhdzogeyAwOiAneCcsIDE6ICd5JywgbGVuZ3RoOiAyIH0gfSkgIT09ICd4eScpIHtcbiAgICAvLyBJRSAxMSBUUCBoYXMgYSBicm9rZW4gU3RyaW5nLnJhdyBpbXBsZW1lbnRhdGlvblxuICAgIG92ZXJyaWRlTmF0aXZlKFN0cmluZywgJ3JhdycsIFN0cmluZ1NoaW1zLnJhdyk7XG4gIH1cbiAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmcsIFN0cmluZ1NoaW1zKTtcblxuICAvLyBGYXN0IHJlcGVhdCwgdXNlcyB0aGUgYEV4cG9uZW50aWF0aW9uIGJ5IHNxdWFyaW5nYCBhbGdvcml0aG0uXG4gIC8vIFBlcmY6IGh0dHA6Ly9qc3BlcmYuY29tL3N0cmluZy1yZXBlYXQyLzJcbiAgdmFyIHN0cmluZ1JlcGVhdCA9IGZ1bmN0aW9uIHJlcGVhdChzLCB0aW1lcykge1xuICAgIGlmICh0aW1lcyA8IDEpIHsgcmV0dXJuICcnOyB9XG4gICAgaWYgKHRpbWVzICUgMikgeyByZXR1cm4gcmVwZWF0KHMsIHRpbWVzIC0gMSkgKyBzOyB9XG4gICAgdmFyIGhhbGYgPSByZXBlYXQocywgdGltZXMgLyAyKTtcbiAgICByZXR1cm4gaGFsZiArIGhhbGY7XG4gIH07XG4gIHZhciBzdHJpbmdNYXhMZW5ndGggPSBJbmZpbml0eTtcblxuICB2YXIgU3RyaW5nUHJvdG90eXBlU2hpbXMgPSB7XG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQodGltZXMpIHtcbiAgICAgIHZhciB0aGlzU3RyID0gRVMuVG9TdHJpbmcoRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICB2YXIgbnVtVGltZXMgPSBFUy5Ub0ludGVnZXIodGltZXMpO1xuICAgICAgaWYgKG51bVRpbWVzIDwgMCB8fCBudW1UaW1lcyA+PSBzdHJpbmdNYXhMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcGVhdCBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBpbmZpbml0eSBhbmQgbm90IG92ZXJmbG93IG1heGltdW0gc3RyaW5nIHNpemUnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdSZXBlYXQodGhpc1N0ciwgbnVtVGltZXMpO1xuICAgIH0sXG5cbiAgICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZykge1xuICAgICAgdmFyIFMgPSBFUy5Ub1N0cmluZyhFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICAgIGlmIChFUy5Jc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIG1ldGhvZCBcInN0YXJ0c1dpdGhcIiB3aXRoIGEgcmVnZXgnKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZWFyY2hTdHIgPSBFUy5Ub1N0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgICAgdmFyIHBvc2l0aW9uO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHBvc2l0aW9uID0gYXJndW1lbnRzWzFdO1xuICAgICAgfVxuICAgICAgdmFyIHN0YXJ0ID0gX21heChFUy5Ub0ludGVnZXIocG9zaXRpb24pLCAwKTtcbiAgICAgIHJldHVybiBfc3RyU2xpY2UoUywgc3RhcnQsIHN0YXJ0ICsgc2VhcmNoU3RyLmxlbmd0aCkgPT09IHNlYXJjaFN0cjtcbiAgICB9LFxuXG4gICAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZykge1xuICAgICAgdmFyIFMgPSBFUy5Ub1N0cmluZyhFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKTtcbiAgICAgIGlmIChFUy5Jc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIG1ldGhvZCBcImVuZHNXaXRoXCIgd2l0aCBhIHJlZ2V4Jyk7XG4gICAgICB9XG4gICAgICB2YXIgc2VhcmNoU3RyID0gRVMuVG9TdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICAgIHZhciBsZW4gPSBTLmxlbmd0aDtcbiAgICAgIHZhciBlbmRQb3NpdGlvbjtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIH1cbiAgICAgIHZhciBwb3MgPSB0eXBlb2YgZW5kUG9zaXRpb24gPT09ICd1bmRlZmluZWQnID8gbGVuIDogRVMuVG9JbnRlZ2VyKGVuZFBvc2l0aW9uKTtcbiAgICAgIHZhciBlbmQgPSBfbWluKF9tYXgocG9zLCAwKSwgbGVuKTtcbiAgICAgIHJldHVybiBfc3RyU2xpY2UoUywgZW5kIC0gc2VhcmNoU3RyLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoU3RyO1xuICAgIH0sXG5cbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nKSB7XG4gICAgICBpZiAoRVMuSXNSZWdFeHAoc2VhcmNoU3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImluY2x1ZGVzXCIgZG9lcyBub3QgYWNjZXB0IGEgUmVnRXhwJyk7XG4gICAgICB9XG4gICAgICB2YXIgc2VhcmNoU3RyID0gRVMuVG9TdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICAgIHZhciBwb3NpdGlvbjtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwb3NpdGlvbiA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIH1cbiAgICAgIC8vIFNvbWVob3cgdGhpcyB0cmljayBtYWtlcyBtZXRob2QgMTAwJSBjb21wYXQgd2l0aCB0aGUgc3BlYy5cbiAgICAgIHJldHVybiBfaW5kZXhPZih0aGlzLCBzZWFyY2hTdHIsIHBvc2l0aW9uKSAhPT0gLTE7XG4gICAgfSxcblxuICAgIGNvZGVQb2ludEF0OiBmdW5jdGlvbiBjb2RlUG9pbnRBdChwb3MpIHtcbiAgICAgIHZhciB0aGlzU3RyID0gRVMuVG9TdHJpbmcoRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICB2YXIgcG9zaXRpb24gPSBFUy5Ub0ludGVnZXIocG9zKTtcbiAgICAgIHZhciBsZW5ndGggPSB0aGlzU3RyLmxlbmd0aDtcbiAgICAgIGlmIChwb3NpdGlvbiA+PSAwICYmIHBvc2l0aW9uIDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBmaXJzdCA9IHRoaXNTdHIuY2hhckNvZGVBdChwb3NpdGlvbik7XG4gICAgICAgIHZhciBpc0VuZCA9IHBvc2l0aW9uICsgMSA9PT0gbGVuZ3RoO1xuICAgICAgICBpZiAoZmlyc3QgPCAweEQ4MDAgfHwgZmlyc3QgPiAweERCRkYgfHwgaXNFbmQpIHsgcmV0dXJuIGZpcnN0OyB9XG4gICAgICAgIHZhciBzZWNvbmQgPSB0aGlzU3RyLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKTtcbiAgICAgICAgaWYgKHNlY29uZCA8IDB4REMwMCB8fCBzZWNvbmQgPiAweERGRkYpIHsgcmV0dXJuIGZpcnN0OyB9XG4gICAgICAgIHJldHVybiAoKGZpcnN0IC0gMHhEODAwKSAqIDEwMjQpICsgKHNlY29uZCAtIDB4REMwMCkgKyAweDEwMDAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgaWYgKFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgJiYgJ2EnLmluY2x1ZGVzKCdhJywgSW5maW5pdHkpICE9PSBmYWxzZSkge1xuICAgIG92ZXJyaWRlTmF0aXZlKFN0cmluZy5wcm90b3R5cGUsICdpbmNsdWRlcycsIFN0cmluZ1Byb3RvdHlwZVNoaW1zLmluY2x1ZGVzKTtcbiAgfVxuXG4gIGlmIChTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGggJiYgU3RyaW5nLnByb3RvdHlwZS5lbmRzV2l0aCkge1xuICAgIHZhciBzdGFydHNXaXRoUmVqZWN0c1JlZ2V4ID0gdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkge1xuICAgICAgLyogdGhyb3dzIGlmIHNwZWMtY29tcGxpYW50ICovXG4gICAgICByZXR1cm4gJy9hLycuc3RhcnRzV2l0aCgvYS8pO1xuICAgIH0pO1xuICAgIHZhciBzdGFydHNXaXRoSGFuZGxlc0luZmluaXR5ID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICdhYmMnLnN0YXJ0c1dpdGgoJ2EnLCBJbmZpbml0eSkgPT09IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmICghc3RhcnRzV2l0aFJlamVjdHNSZWdleCB8fCAhc3RhcnRzV2l0aEhhbmRsZXNJbmZpbml0eSkge1xuICAgICAgLy8gRmlyZWZveCAoPCAzNz8pIGFuZCBJRSAxMSBUUCBoYXZlIGEgbm9uY29tcGxpYW50IHN0YXJ0c1dpdGggaW1wbGVtZW50YXRpb25cbiAgICAgIG92ZXJyaWRlTmF0aXZlKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJywgU3RyaW5nUHJvdG90eXBlU2hpbXMuc3RhcnRzV2l0aCk7XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnLCBTdHJpbmdQcm90b3R5cGVTaGltcy5lbmRzV2l0aCk7XG4gICAgfVxuICB9XG4gIGlmIChoYXNTeW1ib2xzKSB7XG4gICAgdmFyIHN0YXJ0c1dpdGhTdXBwb3J0c1N5bWJvbE1hdGNoID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlID0gL2EvO1xuICAgICAgcmVbU3ltYm9sLm1hdGNoXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICcvYS8nLnN0YXJ0c1dpdGgocmUpO1xuICAgIH0pO1xuICAgIGlmICghc3RhcnRzV2l0aFN1cHBvcnRzU3ltYm9sTWF0Y2gpIHtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKFN0cmluZy5wcm90b3R5cGUsICdzdGFydHNXaXRoJywgU3RyaW5nUHJvdG90eXBlU2hpbXMuc3RhcnRzV2l0aCk7XG4gICAgfVxuICAgIHZhciBlbmRzV2l0aFN1cHBvcnRzU3ltYm9sTWF0Y2ggPSB2YWx1ZU9yRmFsc2VJZlRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmUgPSAvYS87XG4gICAgICByZVtTeW1ib2wubWF0Y2hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy9hLycuZW5kc1dpdGgocmUpO1xuICAgIH0pO1xuICAgIGlmICghZW5kc1dpdGhTdXBwb3J0c1N5bWJvbE1hdGNoKSB7XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAnZW5kc1dpdGgnLCBTdHJpbmdQcm90b3R5cGVTaGltcy5lbmRzV2l0aCk7XG4gICAgfVxuICAgIHZhciBpbmNsdWRlc1N1cHBvcnRzU3ltYm9sTWF0Y2ggPSB2YWx1ZU9yRmFsc2VJZlRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmUgPSAvYS87XG4gICAgICByZVtTeW1ib2wubWF0Y2hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gJy9hLycuaW5jbHVkZXMocmUpO1xuICAgIH0pO1xuICAgIGlmICghaW5jbHVkZXNTdXBwb3J0c1N5bWJvbE1hdGNoKSB7XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCAnaW5jbHVkZXMnLCBTdHJpbmdQcm90b3R5cGVTaGltcy5pbmNsdWRlcyk7XG4gICAgfVxuICB9XG5cbiAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmcucHJvdG90eXBlLCBTdHJpbmdQcm90b3R5cGVTaGltcyk7XG5cbiAgLy8gd2hpdGVzcGFjZSBmcm9tOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjUuNC4yMFxuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9ibG9iL3YzLjQuMC9lczUtc2hpbS5qcyNMMTMwNC1MMTMyNFxuICB2YXIgd3MgPSBbXG4gICAgJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyxcbiAgICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjgnLFxuICAgICdcXHUyMDI5XFx1RkVGRidcbiAgXS5qb2luKCcnKTtcbiAgdmFyIHRyaW1SZWdleHAgPSBuZXcgUmVnRXhwKCcoXlsnICsgd3MgKyAnXSspfChbJyArIHdzICsgJ10rJCknLCAnZycpO1xuICB2YXIgdHJpbVNoaW0gPSBmdW5jdGlvbiB0cmltKCkge1xuICAgIHJldHVybiBFUy5Ub1N0cmluZyhFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKS5yZXBsYWNlKHRyaW1SZWdleHAsICcnKTtcbiAgfTtcbiAgdmFyIG5vbldTID0gWydcXHUwMDg1JywgJ1xcdTIwMGInLCAnXFx1ZmZmZSddLmpvaW4oJycpO1xuICB2YXIgbm9uV1NyZWdleCA9IG5ldyBSZWdFeHAoJ1snICsgbm9uV1MgKyAnXScsICdnJyk7XG4gIHZhciBpc0JhZEhleFJlZ2V4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG4gIHZhciBoYXNTdHJpbmdUcmltQnVnID0gbm9uV1MudHJpbSgpLmxlbmd0aCAhPT0gbm9uV1MubGVuZ3RoO1xuICBkZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAndHJpbScsIHRyaW1TaGltLCBoYXNTdHJpbmdUcmltQnVnKTtcblxuICAvLyBHaXZlbiBhbiBhcmd1bWVudCB4LCBpdCB3aWxsIHJldHVybiBhbiBJdGVyYXRvclJlc3VsdCBvYmplY3QsXG4gIC8vIHdpdGggdmFsdWUgc2V0IHRvIHggYW5kIGRvbmUgdG8gZmFsc2UuXG4gIC8vIEdpdmVuIG5vIGFyZ3VtZW50cywgaXQgd2lsbCByZXR1cm4gYW4gaXRlcmF0b3IgY29tcGxldGlvbiBvYmplY3QuXG4gIHZhciBpdGVyYXRvclJlc3VsdCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHgsIGRvbmU6IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfTtcbiAgfTtcblxuICAvLyBzZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuICB2YXIgU3RyaW5nSXRlcmF0b3IgPSBmdW5jdGlvbiAocykge1xuICAgIEVTLlJlcXVpcmVPYmplY3RDb2VyY2libGUocyk7XG4gICAgdGhpcy5fcyA9IEVTLlRvU3RyaW5nKHMpO1xuICAgIHRoaXMuX2kgPSAwO1xuICB9O1xuICBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMuX3M7XG4gICAgdmFyIGkgPSB0aGlzLl9pO1xuICAgIGlmICh0eXBlb2YgcyA9PT0gJ3VuZGVmaW5lZCcgfHwgaSA+PSBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fcyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiBpdGVyYXRvclJlc3VsdCgpO1xuICAgIH1cbiAgICB2YXIgZmlyc3QgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgdmFyIHNlY29uZCwgbGVuO1xuICAgIGlmIChmaXJzdCA8IDB4RDgwMCB8fCBmaXJzdCA+IDB4REJGRiB8fCAoaSArIDEpID09PSBzLmxlbmd0aCkge1xuICAgICAgbGVuID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vjb25kID0gcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgICAgIGxlbiA9IChzZWNvbmQgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGKSA/IDEgOiAyO1xuICAgIH1cbiAgICB0aGlzLl9pID0gaSArIGxlbjtcbiAgICByZXR1cm4gaXRlcmF0b3JSZXN1bHQocy5zdWJzdHIoaSwgbGVuKSk7XG4gIH07XG4gIGFkZEl0ZXJhdG9yKFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIGFkZEl0ZXJhdG9yKFN0cmluZy5wcm90b3R5cGUsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0l0ZXJhdG9yKHRoaXMpO1xuICB9KTtcblxuICB2YXIgQXJyYXlTaGltcyA9IHtcbiAgICBmcm9tOiBmdW5jdGlvbiBmcm9tKGl0ZW1zKSB7XG4gICAgICB2YXIgQyA9IHRoaXM7XG4gICAgICB2YXIgbWFwRm47XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgICB9XG4gICAgICB2YXIgbWFwcGluZywgVDtcbiAgICAgIGlmICh0eXBlb2YgbWFwRm4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG1hcHBpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghRVMuSXNDYWxsYWJsZShtYXBGbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tOiB3aGVuIHByb3ZpZGVkLCB0aGUgc2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICAgIFQgPSBhcmd1bWVudHNbMl07XG4gICAgICAgIH1cbiAgICAgICAgbWFwcGluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGF0IEFycmF5cyB3aWxsIHVzZSBBcnJheUl0ZXJhdG9yOlxuICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbWFzY3JpcHQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDE2XG4gICAgICB2YXIgdXNpbmdJdGVyYXRvciA9IHR5cGVvZiAoaXNBcmd1bWVudHMoaXRlbXMpIHx8IEVTLkdldE1ldGhvZChpdGVtcywgJGl0ZXJhdG9yJCkpICE9PSAndW5kZWZpbmVkJztcblxuICAgICAgdmFyIGxlbmd0aCwgcmVzdWx0LCBpO1xuICAgICAgaWYgKHVzaW5nSXRlcmF0b3IpIHtcbiAgICAgICAgcmVzdWx0ID0gRVMuSXNDb25zdHJ1Y3RvcihDKSA/IE9iamVjdChuZXcgQygpKSA6IFtdO1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBFUy5HZXRJdGVyYXRvcihpdGVtcyk7XG4gICAgICAgIHZhciBuZXh0LCBuZXh0VmFsdWU7XG5cbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgbmV4dCA9IEVTLkl0ZXJhdG9yU3RlcChpdGVyYXRvcik7XG4gICAgICAgICAgaWYgKG5leHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFZhbHVlID0gbmV4dC52YWx1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgICAgICAgbmV4dFZhbHVlID0gdHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gbWFwRm4obmV4dFZhbHVlLCBpKSA6IF9jYWxsKG1hcEZuLCBULCBuZXh0VmFsdWUsIGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV4dFZhbHVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIEVTLkl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIHRydWUpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGxlbmd0aCA9IGk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgYXJyYXlMaWtlID0gRVMuVG9PYmplY3QoaXRlbXMpO1xuICAgICAgICBsZW5ndGggPSBFUy5Ub0xlbmd0aChhcnJheUxpa2UubGVuZ3RoKTtcbiAgICAgICAgcmVzdWx0ID0gRVMuSXNDb25zdHJ1Y3RvcihDKSA/IE9iamVjdChuZXcgQyhsZW5ndGgpKSA6IG5ldyBBcnJheShsZW5ndGgpO1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhbHVlID0gYXJyYXlMaWtlW2ldO1xuICAgICAgICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IG1hcEZuKHZhbHVlLCBpKSA6IF9jYWxsKG1hcEZuLCBULCB2YWx1ZSwgaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3cocmVzdWx0LCBpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgdmFyIEMgPSB0aGlzO1xuICAgICAgdmFyIEEgPSBpc0FycmF5KEMpIHx8ICFFUy5Jc0NhbGxhYmxlKEMpID8gbmV3IEFycmF5KGxlbikgOiBFUy5Db25zdHJ1Y3QoQywgW2xlbl0pO1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBsZW47ICsraykge1xuICAgICAgICBjcmVhdGVEYXRhUHJvcGVydHlPclRocm93KEEsIGssIGFyZ3VtZW50c1trXSk7XG4gICAgICB9XG4gICAgICBBLmxlbmd0aCA9IGxlbjtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgfTtcbiAgZGVmaW5lUHJvcGVydGllcyhBcnJheSwgQXJyYXlTaGltcyk7XG4gIGFkZERlZmF1bHRTcGVjaWVzKEFycmF5KTtcblxuICAvLyBPdXIgQXJyYXlJdGVyYXRvciBpcyBwcml2YXRlOyBzZWVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9lczYtc2hpbS9pc3N1ZXMvMjUyXG4gIEFycmF5SXRlcmF0b3IgPSBmdW5jdGlvbiAoYXJyYXksIGtpbmQpIHtcbiAgICB0aGlzLmkgPSAwO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgICB0aGlzLmtpbmQgPSBraW5kO1xuICB9O1xuXG4gIGRlZmluZVByb3BlcnRpZXMoQXJyYXlJdGVyYXRvci5wcm90b3R5cGUsIHtcbiAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuYXJyYXk7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgQXJyYXlJdGVyYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGFuIEFycmF5SXRlcmF0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgYXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBsZW4gPSBFUy5Ub0xlbmd0aChhcnJheS5sZW5ndGgpO1xuICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgdmFyIGtpbmQgPSB0aGlzLmtpbmQ7XG4gICAgICAgICAgdmFyIHJldHZhbDtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gJ2tleScpIHtcbiAgICAgICAgICAgIHJldHZhbCA9IGk7XG4gICAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICByZXR2YWwgPSBhcnJheVtpXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICdlbnRyeScpIHtcbiAgICAgICAgICAgIHJldHZhbCA9IFtpLCBhcnJheVtpXV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaSA9IGkgKyAxO1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvclJlc3VsdChyZXR2YWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmFycmF5ID0gdm9pZCAwO1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KCk7XG4gICAgfVxuICB9KTtcbiAgYWRkSXRlcmF0b3IoQXJyYXlJdGVyYXRvci5wcm90b3R5cGUpO1xuXG4gIC8qXG4gIHZhciBvcmRlcktleXMgPSBmdW5jdGlvbiBvcmRlcktleXMoYSwgYikge1xuICAgIHZhciBhTnVtZXJpYyA9IFN0cmluZyhFUy5Ub0ludGVnZXIoYSkpID09PSBhO1xuICAgIHZhciBiTnVtZXJpYyA9IFN0cmluZyhFUy5Ub0ludGVnZXIoYikpID09PSBiO1xuICAgIGlmIChhTnVtZXJpYyAmJiBiTnVtZXJpYykge1xuICAgICAgcmV0dXJuIGIgLSBhO1xuICAgIH0gZWxzZSBpZiAoYU51bWVyaWMgJiYgIWJOdW1lcmljKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmICghYU51bWVyaWMgJiYgYk51bWVyaWMpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgZ2V0QWxsS2V5cyA9IGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgdmFyIG93bktleXMgPSBbXTtcbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgX3B1c2goX2hhc093blByb3BlcnR5KG9iamVjdCwga2V5KSA/IG93bktleXMgOiBrZXlzLCBrZXkpO1xuICAgIH1cbiAgICBfc29ydChvd25LZXlzLCBvcmRlcktleXMpO1xuICAgIF9zb3J0KGtleXMsIG9yZGVyS2V5cyk7XG5cbiAgICByZXR1cm4gX2NvbmNhdChvd25LZXlzLCBrZXlzKTtcbiAgfTtcbiAgKi9cblxuICAvLyBub3RlOiB0aGlzIGlzIHBvc2l0aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGRlcGVuZHMgb24gQXJyYXlJdGVyYXRvclxuICB2YXIgYXJyYXlPZlN1cHBvcnRzU3ViY2xhc3NpbmcgPSBBcnJheS5vZiA9PT0gQXJyYXlTaGltcy5vZiB8fCAoZnVuY3Rpb24gKCkge1xuICAgIC8vIERldGVjdHMgYSBidWcgaW4gV2Via2l0IG5pZ2h0bHkgcjE4MTg4NlxuICAgIHZhciBGb28gPSBmdW5jdGlvbiBGb28obGVuKSB7IHRoaXMubGVuZ3RoID0gbGVuOyB9O1xuICAgIEZvby5wcm90b3R5cGUgPSBbXTtcbiAgICB2YXIgZm9vQXJyID0gQXJyYXkub2YuYXBwbHkoRm9vLCBbMSwgMl0pO1xuICAgIHJldHVybiBmb29BcnIgaW5zdGFuY2VvZiBGb28gJiYgZm9vQXJyLmxlbmd0aCA9PT0gMjtcbiAgfSgpKTtcbiAgaWYgKCFhcnJheU9mU3VwcG9ydHNTdWJjbGFzc2luZykge1xuICAgIG92ZXJyaWRlTmF0aXZlKEFycmF5LCAnb2YnLCBBcnJheVNoaW1zLm9mKTtcbiAgfVxuXG4gIHZhciBBcnJheVByb3RvdHlwZVNoaW1zID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCkge1xuICAgICAgdmFyIG8gPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgIHZhciBsZW4gPSBFUy5Ub0xlbmd0aChvLmxlbmd0aCk7XG4gICAgICB2YXIgcmVsYXRpdmVUYXJnZXQgPSBFUy5Ub0ludGVnZXIodGFyZ2V0KTtcbiAgICAgIHZhciByZWxhdGl2ZVN0YXJ0ID0gRVMuVG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHZhciB0byA9IHJlbGF0aXZlVGFyZ2V0IDwgMCA/IF9tYXgobGVuICsgcmVsYXRpdmVUYXJnZXQsIDApIDogX21pbihyZWxhdGl2ZVRhcmdldCwgbGVuKTtcbiAgICAgIHZhciBmcm9tID0gcmVsYXRpdmVTdGFydCA8IDAgPyBfbWF4KGxlbiArIHJlbGF0aXZlU3RhcnQsIDApIDogX21pbihyZWxhdGl2ZVN0YXJ0LCBsZW4pO1xuICAgICAgdmFyIGVuZDtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICBlbmQgPSBhcmd1bWVudHNbMl07XG4gICAgICB9XG4gICAgICB2YXIgcmVsYXRpdmVFbmQgPSB0eXBlb2YgZW5kID09PSAndW5kZWZpbmVkJyA/IGxlbiA6IEVTLlRvSW50ZWdlcihlbmQpO1xuICAgICAgdmFyIGZpbmFsSXRlbSA9IHJlbGF0aXZlRW5kIDwgMCA/IF9tYXgobGVuICsgcmVsYXRpdmVFbmQsIDApIDogX21pbihyZWxhdGl2ZUVuZCwgbGVuKTtcbiAgICAgIHZhciBjb3VudCA9IF9taW4oZmluYWxJdGVtIC0gZnJvbSwgbGVuIC0gdG8pO1xuICAgICAgdmFyIGRpcmVjdGlvbiA9IDE7XG4gICAgICBpZiAoZnJvbSA8IHRvICYmIHRvIDwgKGZyb20gKyBjb3VudCkpIHtcbiAgICAgICAgZGlyZWN0aW9uID0gLTE7XG4gICAgICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgICAgICB0byArPSBjb3VudCAtIDE7XG4gICAgICB9XG4gICAgICB3aGlsZSAoY291bnQgPiAwKSB7XG4gICAgICAgIGlmIChmcm9tIGluIG8pIHtcbiAgICAgICAgICBvW3RvXSA9IG9bZnJvbV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIG9bdG9dO1xuICAgICAgICB9XG4gICAgICAgIGZyb20gKz0gZGlyZWN0aW9uO1xuICAgICAgICB0byArPSBkaXJlY3Rpb247XG4gICAgICAgIGNvdW50IC09IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbztcbiAgICB9LFxuXG4gICAgZmlsbDogZnVuY3Rpb24gZmlsbCh2YWx1ZSkge1xuICAgICAgdmFyIHN0YXJ0O1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHN0YXJ0ID0gYXJndW1lbnRzWzFdO1xuICAgICAgfVxuICAgICAgdmFyIGVuZDtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICBlbmQgPSBhcmd1bWVudHNbMl07XG4gICAgICB9XG4gICAgICB2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGxlbiA9IEVTLlRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIHN0YXJ0ID0gRVMuVG9JbnRlZ2VyKHR5cGVvZiBzdGFydCA9PT0gJ3VuZGVmaW5lZCcgPyAwIDogc3RhcnQpO1xuICAgICAgZW5kID0gRVMuVG9JbnRlZ2VyKHR5cGVvZiBlbmQgPT09ICd1bmRlZmluZWQnID8gbGVuIDogZW5kKTtcblxuICAgICAgdmFyIHJlbGF0aXZlU3RhcnQgPSBzdGFydCA8IDAgPyBfbWF4KGxlbiArIHN0YXJ0LCAwKSA6IF9taW4oc3RhcnQsIGxlbik7XG4gICAgICB2YXIgcmVsYXRpdmVFbmQgPSBlbmQgPCAwID8gbGVuICsgZW5kIDogZW5kO1xuXG4gICAgICBmb3IgKHZhciBpID0gcmVsYXRpdmVTdGFydDsgaSA8IGxlbiAmJiBpIDwgcmVsYXRpdmVFbmQ7ICsraSkge1xuICAgICAgICBPW2ldID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gTztcbiAgICB9LFxuXG4gICAgZmluZDogZnVuY3Rpb24gZmluZChwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBsaXN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICB2YXIgbGVuZ3RoID0gRVMuVG9MZW5ndGgobGlzdC5sZW5ndGgpO1xuICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKHByZWRpY2F0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkjZmluZDogcHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgfVxuICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMCwgdmFsdWU7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IGxpc3RbaV07XG4gICAgICAgIGlmICh0aGlzQXJnKSB7XG4gICAgICAgICAgaWYgKF9jYWxsKHByZWRpY2F0ZSwgdGhpc0FyZywgdmFsdWUsIGksIGxpc3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaSwgbGlzdCkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlKSB7XG4gICAgICB2YXIgbGlzdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvTGVuZ3RoKGxpc3QubGVuZ3RoKTtcbiAgICAgIGlmICghRVMuSXNDYWxsYWJsZShwcmVkaWNhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5I2ZpbmRJbmRleDogcHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgfVxuICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzQXJnKSB7XG4gICAgICAgICAgaWYgKF9jYWxsKHByZWRpY2F0ZSwgdGhpc0FyZywgbGlzdFtpXSwgaSwgbGlzdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcmVkaWNhdGUobGlzdFtpXSwgaSwgbGlzdCkpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH0sXG5cbiAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgICAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKHRoaXMsICdrZXknKTtcbiAgICB9LFxuXG4gICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IodGhpcywgJ3ZhbHVlJyk7XG4gICAgfSxcblxuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gbmV3IEFycmF5SXRlcmF0b3IodGhpcywgJ2VudHJ5Jyk7XG4gICAgfVxuICB9O1xuICAvLyBTYWZhcmkgNy4xIGRlZmluZXMgQXJyYXkja2V5cyBhbmQgQXJyYXkjZW50cmllcyBuYXRpdmVseSxcbiAgLy8gYnV0IHRoZSByZXN1bHRpbmcgQXJyYXlJdGVyYXRvciBvYmplY3RzIGRvbid0IGhhdmUgYSBcIm5leHRcIiBtZXRob2QuXG4gIGlmIChBcnJheS5wcm90b3R5cGUua2V5cyAmJiAhRVMuSXNDYWxsYWJsZShbMV0ua2V5cygpLm5leHQpKSB7XG4gICAgZGVsZXRlIEFycmF5LnByb3RvdHlwZS5rZXlzO1xuICB9XG4gIGlmIChBcnJheS5wcm90b3R5cGUuZW50cmllcyAmJiAhRVMuSXNDYWxsYWJsZShbMV0uZW50cmllcygpLm5leHQpKSB7XG4gICAgZGVsZXRlIEFycmF5LnByb3RvdHlwZS5lbnRyaWVzO1xuICB9XG5cbiAgLy8gQ2hyb21lIDM4IGRlZmluZXMgQXJyYXkja2V5cyBhbmQgQXJyYXkjZW50cmllcywgYW5kIEFycmF5I0BAaXRlcmF0b3IsIGJ1dCBub3QgQXJyYXkjdmFsdWVzXG4gIGlmIChBcnJheS5wcm90b3R5cGUua2V5cyAmJiBBcnJheS5wcm90b3R5cGUuZW50cmllcyAmJiAhQXJyYXkucHJvdG90eXBlLnZhbHVlcyAmJiBBcnJheS5wcm90b3R5cGVbJGl0ZXJhdG9yJF0pIHtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5LnByb3RvdHlwZSwge1xuICAgICAgdmFsdWVzOiBBcnJheS5wcm90b3R5cGVbJGl0ZXJhdG9yJF1cbiAgICB9KTtcbiAgICBpZiAoVHlwZS5zeW1ib2woU3ltYm9sLnVuc2NvcGFibGVzKSkge1xuICAgICAgQXJyYXkucHJvdG90eXBlW1N5bWJvbC51bnNjb3BhYmxlc10udmFsdWVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgLy8gQ2hyb21lIDQwIGRlZmluZXMgQXJyYXkjdmFsdWVzIHdpdGggdGhlIGluY29ycmVjdCBuYW1lLCBhbHRob3VnaCBBcnJheSN7a2V5cyxlbnRyaWVzfSBoYXZlIHRoZSBjb3JyZWN0IG5hbWVcbiAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcyAmJiBBcnJheS5wcm90b3R5cGUudmFsdWVzICYmIEFycmF5LnByb3RvdHlwZS52YWx1ZXMubmFtZSAhPT0gJ3ZhbHVlcycpIHtcbiAgICB2YXIgb3JpZ2luYWxBcnJheVByb3RvdHlwZVZhbHVlcyA9IEFycmF5LnByb3RvdHlwZS52YWx1ZXM7XG4gICAgb3ZlcnJpZGVOYXRpdmUoQXJyYXkucHJvdG90eXBlLCAndmFsdWVzJywgZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbEFycmF5UHJvdG90eXBlVmFsdWVzLCB0aGlzLCBhcmd1bWVudHMpOyB9KTtcbiAgICBkZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICRpdGVyYXRvciQsIEFycmF5LnByb3RvdHlwZS52YWx1ZXMsIHRydWUpO1xuICB9XG4gIGRlZmluZVByb3BlcnRpZXMoQXJyYXkucHJvdG90eXBlLCBBcnJheVByb3RvdHlwZVNoaW1zKTtcblxuICBpZiAoMSAvIFt0cnVlXS5pbmRleE9mKHRydWUsIC0wKSA8IDApIHtcbiAgICAvLyBpbmRleE9mIHdoZW4gZ2l2ZW4gYSBwb3NpdGlvbiBhcmcgb2YgLTAgc2hvdWxkIHJldHVybiArMC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9lY21hMjYyL3B1bGwvMzE2XG4gICAgZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnaW5kZXhPZicsIGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCkge1xuICAgICAgdmFyIHZhbHVlID0gX2FycmF5SW5kZXhPZkFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgKDEgLyB2YWx1ZSkgPCAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgYWRkSXRlcmF0b3IoQXJyYXkucHJvdG90eXBlLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnZhbHVlcygpOyB9KTtcbiAgLy8gQ2hyb21lIGRlZmluZXMga2V5cy92YWx1ZXMvZW50cmllcyBvbiBBcnJheSwgYnV0IGRvZXNuJ3QgZ2l2ZSB1c1xuICAvLyBhbnkgd2F5IHRvIGlkZW50aWZ5IGl0cyBpdGVyYXRvci4gIFNvIGFkZCBvdXIgb3duIHNoaW1tZWQgZmllbGQuXG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHtcbiAgICBhZGRJdGVyYXRvcihPYmplY3QuZ2V0UHJvdG90eXBlT2YoW10udmFsdWVzKCkpKTtcbiAgfVxuXG4gIC8vIG5vdGU6IHRoaXMgaXMgcG9zaXRpb25lZCBoZXJlIGJlY2F1c2UgaXQgcmVsaWVzIG9uIEFycmF5I2VudHJpZXNcbiAgdmFyIGFycmF5RnJvbVN3YWxsb3dzTmVnYXRpdmVMZW5ndGhzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBEZXRlY3RzIGEgRmlyZWZveCBidWcgaW4gdjMyXG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2Mzk5M1xuICAgIHJldHVybiB2YWx1ZU9yRmFsc2VJZlRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogLTEgfSkubGVuZ3RoID09PSAwO1xuICAgIH0pO1xuICB9KCkpO1xuICB2YXIgYXJyYXlGcm9tSGFuZGxlc0l0ZXJhYmxlcyA9IChmdW5jdGlvbiAoKSB7XG4gICAgLy8gRGV0ZWN0cyBhIGJ1ZyBpbiBXZWJraXQgbmlnaHRseSByMTgxODg2XG4gICAgdmFyIGFyciA9IEFycmF5LmZyb20oWzBdLmVudHJpZXMoKSk7XG4gICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDEgJiYgaXNBcnJheShhcnJbMF0pICYmIGFyclswXVswXSA9PT0gMCAmJiBhcnJbMF1bMV0gPT09IDA7XG4gIH0oKSk7XG4gIGlmICghYXJyYXlGcm9tU3dhbGxvd3NOZWdhdGl2ZUxlbmd0aHMgfHwgIWFycmF5RnJvbUhhbmRsZXNJdGVyYWJsZXMpIHtcbiAgICBvdmVycmlkZU5hdGl2ZShBcnJheSwgJ2Zyb20nLCBBcnJheVNoaW1zLmZyb20pO1xuICB9XG4gIHZhciBhcnJheUZyb21IYW5kbGVzVW5kZWZpbmVkTWFwRnVuY3Rpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIC8vIE1pY3Jvc29mdCBFZGdlIHYwLjExIHRocm93cyBpZiB0aGUgbWFwRm4gYXJndW1lbnQgaXMgKnByb3ZpZGVkKiBidXQgdW5kZWZpbmVkLFxuICAgIC8vIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IGNhcmUgaWYgaXQncyBwcm92aWRlZCBvciBub3QgLSB1bmRlZmluZWQgZG9lc24ndCB0aHJvdy5cbiAgICByZXR1cm4gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oWzBdLCB2b2lkIDApO1xuICAgIH0pO1xuICB9KCkpO1xuICBpZiAoIWFycmF5RnJvbUhhbmRsZXNVbmRlZmluZWRNYXBGdW5jdGlvbikge1xuICAgIHZhciBvcmlnQXJyYXlGcm9tID0gQXJyYXkuZnJvbTtcbiAgICBvdmVycmlkZU5hdGl2ZShBcnJheSwgJ2Zyb20nLCBmdW5jdGlvbiBmcm9tKGl0ZW1zKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ0FycmF5RnJvbSwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBfY2FsbChvcmlnQXJyYXlGcm9tLCB0aGlzLCBpdGVtcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaW50MzJzQXNPbmUgPSAtKE1hdGgucG93KDIsIDMyKSAtIDEpO1xuICB2YXIgdG9MZW5ndGhzQ29ycmVjdGx5ID0gZnVuY3Rpb24gKG1ldGhvZCwgcmV2ZXJzZWQpIHtcbiAgICB2YXIgb2JqID0geyBsZW5ndGg6IGludDMyc0FzT25lIH07XG4gICAgb2JqW3JldmVyc2VkID8gKG9iai5sZW5ndGggPj4+IDApIC0gMSA6IDBdID0gdHJ1ZTtcbiAgICByZXR1cm4gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgX2NhbGwobWV0aG9kLCBvYmosIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gbm90ZTogaW4gbm9uY29uZm9ybWluZyBicm93c2VycywgdGhpcyB3aWxsIGJlIGNhbGxlZFxuICAgICAgICAvLyAtMSA+Pj4gMCB0aW1lcywgd2hpY2ggaXMgNDI5NDk2NzI5NSwgc28gdGhlIHRocm93IG1hdHRlcnMuXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzaG91bGQgbm90IHJlYWNoIGhlcmUnKTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuICBpZiAoIXRvTGVuZ3Roc0NvcnJlY3RseShBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkpIHtcbiAgICB2YXIgb3JpZ2luYWxGb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgb3ZlcnJpZGVOYXRpdmUoQXJyYXkucHJvdG90eXBlLCAnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tGbikge1xuICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxGb3JFYWNoLCB0aGlzLmxlbmd0aCA+PSAwID8gdGhpcyA6IFtdLCBhcmd1bWVudHMpO1xuICAgIH0sIHRydWUpO1xuICB9XG4gIGlmICghdG9MZW5ndGhzQ29ycmVjdGx5KEFycmF5LnByb3RvdHlwZS5tYXApKSB7XG4gICAgdmFyIG9yaWdpbmFsTWFwID0gQXJyYXkucHJvdG90eXBlLm1hcDtcbiAgICBvdmVycmlkZU5hdGl2ZShBcnJheS5wcm90b3R5cGUsICdtYXAnLCBmdW5jdGlvbiBtYXAoY2FsbGJhY2tGbikge1xuICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxNYXAsIHRoaXMubGVuZ3RoID49IDAgPyB0aGlzIDogW10sIGFyZ3VtZW50cyk7XG4gICAgfSwgdHJ1ZSk7XG4gIH1cbiAgaWYgKCF0b0xlbmd0aHNDb3JyZWN0bHkoQXJyYXkucHJvdG90eXBlLmZpbHRlcikpIHtcbiAgICB2YXIgb3JpZ2luYWxGaWx0ZXIgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuICAgIG92ZXJyaWRlTmF0aXZlKEFycmF5LnByb3RvdHlwZSwgJ2ZpbHRlcicsIGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja0ZuKSB7XG4gICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbEZpbHRlciwgdGhpcy5sZW5ndGggPj0gMCA/IHRoaXMgOiBbXSwgYXJndW1lbnRzKTtcbiAgICB9LCB0cnVlKTtcbiAgfVxuICBpZiAoIXRvTGVuZ3Roc0NvcnJlY3RseShBcnJheS5wcm90b3R5cGUuc29tZSkpIHtcbiAgICB2YXIgb3JpZ2luYWxTb21lID0gQXJyYXkucHJvdG90eXBlLnNvbWU7XG4gICAgb3ZlcnJpZGVOYXRpdmUoQXJyYXkucHJvdG90eXBlLCAnc29tZScsIGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tGbikge1xuICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ2luYWxTb21lLCB0aGlzLmxlbmd0aCA+PSAwID8gdGhpcyA6IFtdLCBhcmd1bWVudHMpO1xuICAgIH0sIHRydWUpO1xuICB9XG4gIGlmICghdG9MZW5ndGhzQ29ycmVjdGx5KEFycmF5LnByb3RvdHlwZS5ldmVyeSkpIHtcbiAgICB2YXIgb3JpZ2luYWxFdmVyeSA9IEFycmF5LnByb3RvdHlwZS5ldmVyeTtcbiAgICBvdmVycmlkZU5hdGl2ZShBcnJheS5wcm90b3R5cGUsICdldmVyeScsIGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrRm4pIHtcbiAgICAgIHJldHVybiBFUy5DYWxsKG9yaWdpbmFsRXZlcnksIHRoaXMubGVuZ3RoID49IDAgPyB0aGlzIDogW10sIGFyZ3VtZW50cyk7XG4gICAgfSwgdHJ1ZSk7XG4gIH1cbiAgaWYgKCF0b0xlbmd0aHNDb3JyZWN0bHkoQXJyYXkucHJvdG90eXBlLnJlZHVjZSkpIHtcbiAgICB2YXIgb3JpZ2luYWxSZWR1Y2UgPSBBcnJheS5wcm90b3R5cGUucmVkdWNlO1xuICAgIG92ZXJyaWRlTmF0aXZlKEFycmF5LnByb3RvdHlwZSwgJ3JlZHVjZScsIGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja0ZuKSB7XG4gICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbFJlZHVjZSwgdGhpcy5sZW5ndGggPj0gMCA/IHRoaXMgOiBbXSwgYXJndW1lbnRzKTtcbiAgICB9LCB0cnVlKTtcbiAgfVxuICBpZiAoIXRvTGVuZ3Roc0NvcnJlY3RseShBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQsIHRydWUpKSB7XG4gICAgdmFyIG9yaWdpbmFsUmVkdWNlUmlnaHQgPSBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQ7XG4gICAgb3ZlcnJpZGVOYXRpdmUoQXJyYXkucHJvdG90eXBlLCAncmVkdWNlUmlnaHQnLCBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja0ZuKSB7XG4gICAgICByZXR1cm4gRVMuQ2FsbChvcmlnaW5hbFJlZHVjZVJpZ2h0LCB0aGlzLmxlbmd0aCA+PSAwID8gdGhpcyA6IFtdLCBhcmd1bWVudHMpO1xuICAgIH0sIHRydWUpO1xuICB9XG5cbiAgdmFyIGxhY2tzT2N0YWxTdXBwb3J0ID0gTnVtYmVyKCcwbzEwJykgIT09IDg7XG4gIHZhciBsYWNrc0JpbmFyeVN1cHBvcnQgPSBOdW1iZXIoJzBiMTAnKSAhPT0gMjtcbiAgdmFyIHRyaW1zTm9uV2hpdGVzcGFjZSA9IF9zb21lKG5vbldTLCBmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBOdW1iZXIoYyArIDAgKyBjKSA9PT0gMDtcbiAgfSk7XG4gIGlmIChsYWNrc09jdGFsU3VwcG9ydCB8fCBsYWNrc0JpbmFyeVN1cHBvcnQgfHwgdHJpbXNOb25XaGl0ZXNwYWNlKSB7XG4gICAgdmFyIE9yaWdOdW1iZXIgPSBOdW1iZXI7XG4gICAgdmFyIGJpbmFyeVJlZ2V4ID0gL14wYlswMV0rJC9pO1xuICAgIHZhciBvY3RhbFJlZ2V4ID0gL14wb1swLTddKyQvaTtcbiAgICAvLyBOb3RlIHRoYXQgaW4gSUUgOCwgUmVnRXhwLnByb3RvdHlwZS50ZXN0IGRvZXNuJ3Qgc2VlbSB0byBleGlzdDogaWUsIFwidGVzdFwiIGlzIGFuIG93biBwcm9wZXJ0eSBvZiByZWdleGVzLiB3dGYuXG4gICAgdmFyIGlzQmluYXJ5ID0gYmluYXJ5UmVnZXgudGVzdC5iaW5kKGJpbmFyeVJlZ2V4KTtcbiAgICB2YXIgaXNPY3RhbCA9IG9jdGFsUmVnZXgudGVzdC5iaW5kKG9jdGFsUmVnZXgpO1xuICAgIHZhciB0b1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIChPKSB7IC8vIG5lZWQgdG8gcmVwbGFjZSB0aGlzIHdpdGggYGVzLXRvLXByaW1pdGl2ZS9lczZgXG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBPLnZhbHVlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0ID0gTy52YWx1ZU9mKCk7XG4gICAgICAgIGlmIChUeXBlLnByaW1pdGl2ZShyZXN1bHQpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBPLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IE8udG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKFR5cGUucHJpbWl0aXZlKHJlc3VsdCkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBkZWZhdWx0IHZhbHVlJyk7XG4gICAgfTtcbiAgICB2YXIgaGFzTm9uV1MgPSBub25XU3JlZ2V4LnRlc3QuYmluZChub25XU3JlZ2V4KTtcbiAgICB2YXIgaXNCYWRIZXggPSBpc0JhZEhleFJlZ2V4LnRlc3QuYmluZChpc0JhZEhleFJlZ2V4KTtcbiAgICB2YXIgTnVtYmVyU2hpbSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB0aGlzIGlzIHdyYXBwZWQgaW4gYW4gSUlGRSBiZWNhdXNlIG9mIElFIDYtOCdzIHdhY2t5IHNjb3BpbmcgaXNzdWVzIHdpdGggbmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbnMuXG4gICAgICB2YXIgTnVtYmVyU2hpbSA9IGZ1bmN0aW9uIE51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgcHJpbVZhbHVlO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwcmltVmFsdWUgPSBUeXBlLnByaW1pdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHRvUHJpbWl0aXZlKHZhbHVlLCAnbnVtYmVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbVZhbHVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByaW1WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwcmltVmFsdWUgPSBFUy5DYWxsKHRyaW1TaGltLCBwcmltVmFsdWUpO1xuICAgICAgICAgIGlmIChpc0JpbmFyeShwcmltVmFsdWUpKSB7XG4gICAgICAgICAgICBwcmltVmFsdWUgPSBwYXJzZUludChfc3RyU2xpY2UocHJpbVZhbHVlLCAyKSwgMik7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc09jdGFsKHByaW1WYWx1ZSkpIHtcbiAgICAgICAgICAgIHByaW1WYWx1ZSA9IHBhcnNlSW50KF9zdHJTbGljZShwcmltVmFsdWUsIDIpLCA4KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc05vbldTKHByaW1WYWx1ZSkgfHwgaXNCYWRIZXgocHJpbVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbVZhbHVlID0gTmFOO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVjZWl2ZXIgPSB0aGlzO1xuICAgICAgICB2YXIgdmFsdWVPZlN1Y2NlZWRzID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIE9yaWdOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YuY2FsbChyZWNlaXZlcik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBOdW1iZXJTaGltICYmICF2YWx1ZU9mU3VjY2VlZHMpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9yaWdOdW1iZXIocHJpbVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3JpZ051bWJlcihwcmltVmFsdWUpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBOdW1iZXJTaGltO1xuICAgIH0oKSk7XG4gICAgd3JhcENvbnN0cnVjdG9yKE9yaWdOdW1iZXIsIE51bWJlclNoaW0sIHt9KTtcbiAgICAvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgRVMzIGJyb3dzZXJzLCB3aGVyZSB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBub24tZW51bWVyYWJsZS5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKE51bWJlclNoaW0sIHtcbiAgICAgIE5hTjogT3JpZ051bWJlci5OYU4sXG4gICAgICBNQVhfVkFMVUU6IE9yaWdOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgTUlOX1ZBTFVFOiBPcmlnTnVtYmVyLk1JTl9WQUxVRSxcbiAgICAgIE5FR0FUSVZFX0lORklOSVRZOiBPcmlnTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuICAgICAgUE9TSVRJVkVfSU5GSU5JVFk6IE9yaWdOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICB9KTtcbiAgICAvKiBnbG9iYWxzIE51bWJlcjogdHJ1ZSAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmLCBuby1nbG9iYWwtYXNzaWduICovXG4gICAgTnVtYmVyID0gTnVtYmVyU2hpbTtcbiAgICBWYWx1ZS5yZWRlZmluZShnbG9iYWxzLCAnTnVtYmVyJywgTnVtYmVyU2hpbSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bmRlZiwgbm8tZ2xvYmFsLWFzc2lnbiAqL1xuICAgIC8qIGdsb2JhbHMgTnVtYmVyOiBmYWxzZSAqL1xuICB9XG5cbiAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgZGVmaW5lUHJvcGVydGllcyhOdW1iZXIsIHtcbiAgICBNQVhfU0FGRV9JTlRFR0VSOiBtYXhTYWZlSW50ZWdlcixcbiAgICBNSU5fU0FGRV9JTlRFR0VSOiAtbWF4U2FmZUludGVnZXIsXG4gICAgRVBTSUxPTjogMi4yMjA0NDYwNDkyNTAzMTNlLTE2LFxuXG4gICAgcGFyc2VJbnQ6IGdsb2JhbHMucGFyc2VJbnQsXG4gICAgcGFyc2VGbG9hdDogZ2xvYmFscy5wYXJzZUZsb2F0LFxuXG4gICAgaXNGaW5pdGU6IG51bWJlcklzRmluaXRlLFxuXG4gICAgaXNJbnRlZ2VyOiBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBudW1iZXJJc0Zpbml0ZSh2YWx1ZSkgJiYgRVMuVG9JbnRlZ2VyKHZhbHVlKSA9PT0gdmFsdWU7XG4gICAgfSxcblxuICAgIGlzU2FmZUludGVnZXI6IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSAmJiBfYWJzKHZhbHVlKSA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9LFxuXG4gICAgaXNOYU46IG51bWJlcklzTmFOXG4gIH0pO1xuICAvLyBGaXJlZm94IDM3IGhhcyBhIGNvbmZvcm1pbmcgTnVtYmVyLnBhcnNlSW50LCBidXQgaXQncyBub3QgPT09IHRvIHRoZSBnbG9iYWwgcGFyc2VJbnQgKGZpeGVkIGluIHY0MClcbiAgZGVmaW5lUHJvcGVydHkoTnVtYmVyLCAncGFyc2VJbnQnLCBnbG9iYWxzLnBhcnNlSW50LCBOdW1iZXIucGFyc2VJbnQgIT09IGdsb2JhbHMucGFyc2VJbnQpO1xuXG4gIC8vIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gQXJyYXkjZmluZCBhbmQgQXJyYXkjZmluZEluZGV4IC0tIGVhcmx5XG4gIC8vIGltcGxlbWVudGF0aW9ucyBza2lwcGVkIGhvbGVzIGluIHNwYXJzZSBhcnJheXMuIChOb3RlIHRoYXQgdGhlXG4gIC8vIGltcGxlbWVudGF0aW9ucyBvZiBmaW5kL2ZpbmRJbmRleCBpbmRpcmVjdGx5IHVzZSBzaGltbWVkXG4gIC8vIG1ldGhvZHMgb2YgTnVtYmVyLCBzbyB0aGlzIHRlc3QgaGFzIHRvIGhhcHBlbiBkb3duIGhlcmUuKVxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1zcGFyc2UtYXJyYXlzICovXG4gIGlmIChbLCAxXS5maW5kKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0pID09PSAxKSB7XG4gICAgb3ZlcnJpZGVOYXRpdmUoQXJyYXkucHJvdG90eXBlLCAnZmluZCcsIEFycmF5UHJvdG90eXBlU2hpbXMuZmluZCk7XG4gIH1cbiAgaWYgKFssIDFdLmZpbmRJbmRleChmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9KSAhPT0gMCkge1xuICAgIG92ZXJyaWRlTmF0aXZlKEFycmF5LnByb3RvdHlwZSwgJ2ZpbmRJbmRleCcsIEFycmF5UHJvdG90eXBlU2hpbXMuZmluZEluZGV4KTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNwYXJzZS1hcnJheXMgKi9cblxuICB2YXIgaXNFbnVtZXJhYmxlT24gPSBGdW5jdGlvbi5iaW5kLmNhbGwoRnVuY3Rpb24uYmluZCwgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG4gIHZhciBlbnN1cmVFbnVtZXJhYmxlID0gZnVuY3Rpb24gZW5zdXJlRW51bWVyYWJsZShvYmosIHByb3ApIHtcbiAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiBpc0VudW1lcmFibGVPbihvYmosIHByb3ApKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7IGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgIH1cbiAgfTtcbiAgdmFyIHNsaWNlQXJncyA9IGZ1bmN0aW9uIHNsaWNlQXJncygpIHtcbiAgICAvLyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3BldGthYW50b25vdi9ibHVlYmlyZC93aWtpL09wdGltaXphdGlvbi1raWxsZXJzIzMyLWxlYWtpbmctYXJndW1lbnRzXG4gICAgLy8gYW5kIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1dlYlJlZmxlY3Rpb24vNDMyNzc2MmNiODdhOGM2MzRhMjlcbiAgICB2YXIgaW5pdGlhbCA9IE51bWJlcih0aGlzKTtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgZGVzaXJlZEFyZ0NvdW50ID0gbGVuIC0gaW5pdGlhbDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShkZXNpcmVkQXJnQ291bnQgPCAwID8gMCA6IGRlc2lyZWRBcmdDb3VudCk7XG4gICAgZm9yICh2YXIgaSA9IGluaXRpYWw7IGkgPCBsZW47ICsraSkge1xuICAgICAgYXJnc1tpIC0gaW5pdGlhbF0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9O1xuICB2YXIgYXNzaWduVG8gPSBmdW5jdGlvbiBhc3NpZ25Ubyhzb3VyY2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYXNzaWduVG9Tb3VyY2UodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gIH07XG4gIHZhciBhc3NpZ25SZWR1Y2VyID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gICAgdmFyIHNvdXJjZUtleXMgPSBrZXlzKE9iamVjdChzb3VyY2UpKTtcbiAgICB2YXIgc3ltYm9scztcbiAgICBpZiAoRVMuSXNDYWxsYWJsZShPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSkge1xuICAgICAgc3ltYm9scyA9IF9maWx0ZXIoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPYmplY3Qoc291cmNlKSksIGlzRW51bWVyYWJsZU9uKHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gX3JlZHVjZShfY29uY2F0KHNvdXJjZUtleXMsIHN5bWJvbHMgfHwgW10pLCBhc3NpZ25Ubyhzb3VyY2UpLCB0YXJnZXQpO1xuICB9O1xuXG4gIHZhciBPYmplY3RTaGltcyA9IHtcbiAgICAvLyAxOS4xLjMuMVxuICAgIGFzc2lnbjogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gICAgICB2YXIgdG8gPSBFUy5Ub09iamVjdCh0YXJnZXQsICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgIHJldHVybiBfcmVkdWNlKEVTLkNhbGwoc2xpY2VBcmdzLCAxLCBhcmd1bWVudHMpLCBhc3NpZ25SZWR1Y2VyLCB0byk7XG4gICAgfSxcblxuICAgIC8vIEFkZGVkIGluIFdlYktpdCBpbiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzODY1XG4gICAgaXM6IGZ1bmN0aW9uIGlzKGEsIGIpIHtcbiAgICAgIHJldHVybiBFUy5TYW1lVmFsdWUoYSwgYik7XG4gICAgfVxuICB9O1xuICB2YXIgYXNzaWduSGFzUGVuZGluZ0V4Y2VwdGlvbnMgPSBPYmplY3QuYXNzaWduICYmIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyAmJiAoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggMzcgc3RpbGwgaGFzIFwicGVuZGluZyBleGNlcHRpb25cIiBsb2dpYyBpbiBpdHMgT2JqZWN0LmFzc2lnbiBpbXBsZW1lbnRhdGlvbixcbiAgICAvLyB3aGljaCBpcyA3MiUgc2xvd2VyIHRoYW4gb3VyIHNoaW0sIGFuZCBGaXJlZm94IDQwJ3MgbmF0aXZlIGltcGxlbWVudGF0aW9uLlxuICAgIHZhciB0aHJvd2VyID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHsgMTogMiB9KTtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aHJvd2VyLCAneHknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdGhyb3dlclsxXSA9PT0gJ3knO1xuICAgIH1cbiAgfSgpKTtcbiAgaWYgKGFzc2lnbkhhc1BlbmRpbmdFeGNlcHRpb25zKSB7XG4gICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAnYXNzaWduJywgT2JqZWN0U2hpbXMuYXNzaWduKTtcbiAgfVxuICBkZWZpbmVQcm9wZXJ0aWVzKE9iamVjdCwgT2JqZWN0U2hpbXMpO1xuXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgdmFyIEVTNU9iamVjdFNoaW1zID0ge1xuICAgICAgLy8gMTkuMS4zLjlcbiAgICAgIC8vIHNoaW0gZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uLzU1OTM1NTRcbiAgICAgIHNldFByb3RvdHlwZU9mOiAoZnVuY3Rpb24gKE9iamVjdCwgbWFnaWMpIHtcbiAgICAgICAgdmFyIHNldDtcblxuICAgICAgICB2YXIgY2hlY2tBcmdzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gICAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QoTykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBzZXQgcHJvdG90eXBlIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShwcm90byA9PT0gbnVsbCB8fCBFUy5UeXBlSXNPYmplY3QocHJvdG8pKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FuIG9ubHkgc2V0IHByb3RvdHlwZSB0byBhbiBvYmplY3Qgb3IgbnVsbCcgKyBwcm90byk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICAgICAgICAgIGNoZWNrQXJncyhPLCBwcm90byk7XG4gICAgICAgICAgX2NhbGwoc2V0LCBPLCBwcm90byk7XG4gICAgICAgICAgcmV0dXJuIE87XG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyB0aGlzIHdvcmtzIGFscmVhZHkgaW4gRmlyZWZveCBhbmQgU2FmYXJpXG4gICAgICAgICAgc2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCBtYWdpYykuc2V0O1xuICAgICAgICAgIF9jYWxsKHNldCwge30sIG51bGwpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUgIT09IHt9W21hZ2ljXSkge1xuICAgICAgICAgICAgLy8gSUUgPCAxMSBjYW5ub3QgYmUgc2hpbW1lZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwcm9iYWJseSBDaHJvbWUgb3Igc29tZSBvbGQgTW9iaWxlIHN0b2NrIGJyb3dzZXJcbiAgICAgICAgICBzZXQgPSBmdW5jdGlvbiAocHJvdG8pIHtcbiAgICAgICAgICAgIHRoaXNbbWFnaWNdID0gcHJvdG87XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCAqKm5vdCoqIHdvcmtcbiAgICAgICAgICAvLyBpbiB0aG9zZSBicm93c2VycyB0aGF0IGRvIG5vdCBpbmhlcml0XG4gICAgICAgICAgLy8gX19wcm90b19fIGJ5IG1pc3Rha2UgZnJvbSBPYmplY3QucHJvdG90eXBlXG4gICAgICAgICAgLy8gaW4gdGhlc2UgY2FzZXMgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IGFuIGVycm9yXG4gICAgICAgICAgLy8gb3IgYXQgbGVhc3QgYmUgaW5mb3JtZWQgYWJvdXQgdGhlIGlzc3VlXG4gICAgICAgICAgc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPSBzZXRQcm90b3R5cGVPZihcbiAgICAgICAgICAgIHNldFByb3RvdHlwZU9mKHt9LCBudWxsKSxcbiAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGVcbiAgICAgICAgICApIGluc3RhbmNlb2YgT2JqZWN0O1xuICAgICAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09PSB0cnVlIG1lYW5zIGl0IHdvcmtzIGFzIG1lYW50XG4gICAgICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT09IGZhbHNlIG1lYW5zIGl0J3Mgbm90IDEwMCUgcmVsaWFibGVcbiAgICAgICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgLy8gb3JcbiAgICAgICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PSAgbnVsbCBtZWFucyBpdCdzIG5vdCBhIHBvbHlmaWxsXG4gICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQgd29ya3MgYXMgZXhwZWN0ZWRcbiAgICAgICAgICAvLyB3ZSBjYW4gZXZlbiBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX187XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldFByb3RvdHlwZU9mO1xuICAgICAgfShPYmplY3QsICdfX3Byb3RvX18nKSlcbiAgICB9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhPYmplY3QsIEVTNU9iamVjdFNoaW1zKTtcbiAgfVxuXG4gIC8vIFdvcmthcm91bmQgYnVnIGluIE9wZXJhIDEyIHdoZXJlIHNldFByb3RvdHlwZU9mKHgsIG51bGwpIGRvZXNuJ3Qgd29yayxcbiAgLy8gYnV0IE9iamVjdC5jcmVhdGUobnVsbCkgZG9lcy5cbiAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiZcbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3Quc2V0UHJvdG90eXBlT2Yoe30sIG51bGwpKSAhPT0gbnVsbCAmJlxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5jcmVhdGUobnVsbCkpID09PSBudWxsKSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBGQUtFTlVMTCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB2YXIgZ3BvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICAgICAgdmFyIHNwbyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBncG8obyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEZBS0VOVUxMID8gbnVsbCA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YgPSBmdW5jdGlvbiAobywgcCkge1xuICAgICAgICB2YXIgcHJvdG8gPSBwID09PSBudWxsID8gRkFLRU5VTEwgOiBwO1xuICAgICAgICByZXR1cm4gc3BvKG8sIHByb3RvKTtcbiAgICAgIH07XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPSBmYWxzZTtcbiAgICB9KCkpO1xuICB9XG5cbiAgdmFyIG9iamVjdEtleXNBY2NlcHRzUHJpbWl0aXZlcyA9ICF0aHJvd3NFcnJvcihmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3Qua2V5cygnZm9vJyk7IH0pO1xuICBpZiAoIW9iamVjdEtleXNBY2NlcHRzUHJpbWl0aXZlcykge1xuICAgIHZhciBvcmlnaW5hbE9iamVjdEtleXMgPSBPYmplY3Qua2V5cztcbiAgICBvdmVycmlkZU5hdGl2ZShPYmplY3QsICdrZXlzJywgZnVuY3Rpb24ga2V5cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsT2JqZWN0S2V5cyhFUy5Ub09iamVjdCh2YWx1ZSkpO1xuICAgIH0pO1xuICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgfVxuICB2YXIgb2JqZWN0S2V5c1JlamVjdHNSZWdleCA9IHRocm93c0Vycm9yKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5rZXlzKC9hL2cpOyB9KTtcbiAgaWYgKG9iamVjdEtleXNSZWplY3RzUmVnZXgpIHtcbiAgICB2YXIgcmVnZXhSZWplY3RpbmdPYmplY3RLZXlzID0gT2JqZWN0LmtleXM7XG4gICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAna2V5cycsIGZ1bmN0aW9uIGtleXModmFsdWUpIHtcbiAgICAgIGlmIChUeXBlLnJlZ2V4KHZhbHVlKSkge1xuICAgICAgICB2YXIgcmVnZXhLZXlzID0gW107XG4gICAgICAgIGZvciAodmFyIGsgaW4gdmFsdWUpIHtcbiAgICAgICAgICBpZiAoX2hhc093blByb3BlcnR5KHZhbHVlLCBrKSkge1xuICAgICAgICAgICAgX3B1c2gocmVnZXhLZXlzLCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZ2V4S2V5cztcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWdleFJlamVjdGluZ09iamVjdEtleXModmFsdWUpO1xuICAgIH0pO1xuICAgIGtleXMgPSBPYmplY3Qua2V5cztcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgIHZhciBvYmplY3RHT1BOQWNjZXB0c1ByaW1pdGl2ZXMgPSAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoJ2ZvbycpOyB9KTtcbiAgICBpZiAoIW9iamVjdEdPUE5BY2NlcHRzUHJpbWl0aXZlcykge1xuICAgICAgdmFyIGNhY2hlZFdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RHZXRPd25Qcm9wZXJ0eU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG4gICAgICBvdmVycmlkZU5hdGl2ZShPYmplY3QsICdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSkge1xuICAgICAgICB2YXIgdmFsID0gRVMuVG9PYmplY3QodmFsdWUpO1xuICAgICAgICBpZiAoX3RvU3RyaW5nKHZhbCkgPT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdEdldE93blByb3BlcnR5TmFtZXModmFsKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBJRSBidWcgd2hlcmUgbGF5b3V0IGVuZ2luZSBjYWxscyB1c2VybGFuZCBnT1BOIGZvciBjcm9zcy1kb21haW4gYHdpbmRvd2Agb2JqZWN0c1xuICAgICAgICAgICAgcmV0dXJuIF9jb25jYXQoW10sIGNhY2hlZFdpbmRvd05hbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsT2JqZWN0R2V0T3duUHJvcGVydHlOYW1lcyh2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgdmFyIG9iamVjdEdPUERBY2NlcHRzUHJpbWl0aXZlcyA9ICF0aHJvd3NFcnJvcihmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCdmb28nLCAnYmFyJyk7IH0pO1xuICAgIGlmICghb2JqZWN0R09QREFjY2VwdHNQcmltaXRpdmVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBwcm9wZXJ0eSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRVMuVG9PYmplY3QodmFsdWUpLCBwcm9wZXJ0eSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKE9iamVjdC5zZWFsKSB7XG4gICAgdmFyIG9iamVjdFNlYWxBY2NlcHRzUHJpbWl0aXZlcyA9ICF0aHJvd3NFcnJvcihmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3Quc2VhbCgnZm9vJyk7IH0pO1xuICAgIGlmICghb2JqZWN0U2VhbEFjY2VwdHNQcmltaXRpdmVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RTZWFsID0gT2JqZWN0LnNlYWw7XG4gICAgICBvdmVycmlkZU5hdGl2ZShPYmplY3QsICdzZWFsJywgZnVuY3Rpb24gc2VhbCh2YWx1ZSkge1xuICAgICAgICBpZiAoIUVTLlR5cGVJc09iamVjdCh2YWx1ZSkpIHsgcmV0dXJuIHZhbHVlOyB9XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFNlYWwodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChPYmplY3QuaXNTZWFsZWQpIHtcbiAgICB2YXIgb2JqZWN0SXNTZWFsZWRBY2NlcHRzUHJpbWl0aXZlcyA9ICF0aHJvd3NFcnJvcihmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuaXNTZWFsZWQoJ2ZvbycpOyB9KTtcbiAgICBpZiAoIW9iamVjdElzU2VhbGVkQWNjZXB0c1ByaW1pdGl2ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbE9iamVjdElzU2VhbGVkID0gT2JqZWN0LmlzU2VhbGVkO1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAnaXNTZWFsZWQnLCBmdW5jdGlvbiBpc1NlYWxlZCh2YWx1ZSkge1xuICAgICAgICBpZiAoIUVTLlR5cGVJc09iamVjdCh2YWx1ZSkpIHsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsT2JqZWN0SXNTZWFsZWQodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgdmFyIG9iamVjdEZyZWV6ZUFjY2VwdHNQcmltaXRpdmVzID0gIXRocm93c0Vycm9yKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5mcmVlemUoJ2ZvbycpOyB9KTtcbiAgICBpZiAoIW9iamVjdEZyZWV6ZUFjY2VwdHNQcmltaXRpdmVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RGcmVlemUgPSBPYmplY3QuZnJlZXplO1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAnZnJlZXplJywgZnVuY3Rpb24gZnJlZXplKHZhbHVlKSB7XG4gICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KHZhbHVlKSkgeyByZXR1cm4gdmFsdWU7IH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsT2JqZWN0RnJlZXplKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoT2JqZWN0LmlzRnJvemVuKSB7XG4gICAgdmFyIG9iamVjdElzRnJvemVuQWNjZXB0c1ByaW1pdGl2ZXMgPSAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmlzRnJvemVuKCdmb28nKTsgfSk7XG4gICAgaWYgKCFvYmplY3RJc0Zyb3plbkFjY2VwdHNQcmltaXRpdmVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RJc0Zyb3plbiA9IE9iamVjdC5pc0Zyb3plbjtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKE9iamVjdCwgJ2lzRnJvemVuJywgZnVuY3Rpb24gaXNGcm96ZW4odmFsdWUpIHtcbiAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QodmFsdWUpKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdElzRnJvemVuKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBpZiAoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7XG4gICAgdmFyIG9iamVjdFByZXZlbnRFeHRlbnNpb25zQWNjZXB0c1ByaW1pdGl2ZXMgPSAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKCdmb28nKTsgfSk7XG4gICAgaWYgKCFvYmplY3RQcmV2ZW50RXh0ZW5zaW9uc0FjY2VwdHNQcmltaXRpdmVzKSB7XG4gICAgICB2YXIgb3JpZ2luYWxPYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztcbiAgICAgIG92ZXJyaWRlTmF0aXZlKE9iamVjdCwgJ3ByZXZlbnRFeHRlbnNpb25zJywgZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QodmFsdWUpKSB7IHJldHVybiB2YWx1ZTsgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxPYmplY3RQcmV2ZW50RXh0ZW5zaW9ucyh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUpIHtcbiAgICB2YXIgb2JqZWN0SXNFeHRlbnNpYmxlQWNjZXB0c1ByaW1pdGl2ZXMgPSAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkgeyByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZSgnZm9vJyk7IH0pO1xuICAgIGlmICghb2JqZWN0SXNFeHRlbnNpYmxlQWNjZXB0c1ByaW1pdGl2ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbE9iamVjdElzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG4gICAgICBvdmVycmlkZU5hdGl2ZShPYmplY3QsICdpc0V4dGVuc2libGUnLCBmdW5jdGlvbiBpc0V4dGVuc2libGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QodmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxPYmplY3RJc0V4dGVuc2libGUodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YpIHtcbiAgICB2YXIgb2JqZWN0R2V0UHJvdG9BY2NlcHRzUHJpbWl0aXZlcyA9ICF0aHJvd3NFcnJvcihmdW5jdGlvbiAoKSB7IHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoJ2ZvbycpOyB9KTtcbiAgICBpZiAoIW9iamVjdEdldFByb3RvQWNjZXB0c1ByaW1pdGl2ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoT2JqZWN0LCAnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxHZXRQcm90byhFUy5Ub09iamVjdCh2YWx1ZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGhhc0ZsYWdzID0gc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnKTtcbiAgICByZXR1cm4gZGVzYyAmJiBFUy5Jc0NhbGxhYmxlKGRlc2MuZ2V0KTtcbiAgfSgpKTtcbiAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMgJiYgIWhhc0ZsYWdzKSB7XG4gICAgdmFyIHJlZ0V4cEZsYWdzR2V0dGVyID0gZnVuY3Rpb24gZmxhZ3MoKSB7XG4gICAgICBpZiAoIUVTLlR5cGVJc09iamVjdCh0aGlzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNZXRob2QgY2FsbGVkIG9uIGluY29tcGF0aWJsZSB0eXBlOiBtdXN0IGJlIGFuIG9iamVjdC4nKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAnJztcbiAgICAgIGlmICh0aGlzLmdsb2JhbCkge1xuICAgICAgICByZXN1bHQgKz0gJ2cnO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkge1xuICAgICAgICByZXN1bHQgKz0gJ2knO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubXVsdGlsaW5lKSB7XG4gICAgICAgIHJlc3VsdCArPSAnbSc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy51bmljb2RlKSB7XG4gICAgICAgIHJlc3VsdCArPSAndSc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGlja3kpIHtcbiAgICAgICAgcmVzdWx0ICs9ICd5JztcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIFZhbHVlLmdldHRlcihSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnLCByZWdFeHBGbGFnc0dldHRlcik7XG4gIH1cblxuICB2YXIgcmVnRXhwU3VwcG9ydHNGbGFnc1dpdGhSZWdleCA9IHN1cHBvcnRzRGVzY3JpcHRvcnMgJiYgdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBTdHJpbmcobmV3IFJlZ0V4cCgvYS9nLCAnaScpKSA9PT0gJy9hL2knO1xuICB9KTtcbiAgdmFyIHJlZ0V4cE5lZWRzVG9TdXBwb3J0U3ltYm9sTWF0Y2ggPSBoYXNTeW1ib2xzICYmIHN1cHBvcnRzRGVzY3JpcHRvcnMgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBFZGdlIDAuMTIgc3VwcG9ydHMgZmxhZ3MgZnVsbHksIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IFN5bWJvbC5tYXRjaFxuICAgIHZhciByZWdleCA9IC8uLztcbiAgICByZWdleFtTeW1ib2wubWF0Y2hdID0gZmFsc2U7XG4gICAgcmV0dXJuIFJlZ0V4cChyZWdleCkgPT09IHJlZ2V4O1xuICB9KCkpO1xuXG4gIHZhciByZWdleFRvU3RyaW5nSXNHZW5lcmljID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhYmMnIH0pID09PSAnL2FiYy8nO1xuICB9KTtcbiAgdmFyIHJlZ2V4VG9TdHJpbmdTdXBwb3J0c0dlbmVyaWNGbGFncyA9IHJlZ2V4VG9TdHJpbmdJc0dlbmVyaWMgJiYgdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSA9PT0gJy9hL2InO1xuICB9KTtcbiAgaWYgKCFyZWdleFRvU3RyaW5nSXNHZW5lcmljIHx8ICFyZWdleFRvU3RyaW5nU3VwcG9ydHNHZW5lcmljRmxhZ3MpIHtcbiAgICB2YXIgb3JpZ1JlZ0V4cFRvU3RyaW5nID0gUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZztcbiAgICBkZWZpbmVQcm9wZXJ0eShSZWdFeHAucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHZhciBSID0gRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcbiAgICAgIGlmIChUeXBlLnJlZ2V4KFIpKSB7XG4gICAgICAgIHJldHVybiBfY2FsbChvcmlnUmVnRXhwVG9TdHJpbmcsIFIpO1xuICAgICAgfVxuICAgICAgdmFyIHBhdHRlcm4gPSAkU3RyaW5nKFIuc291cmNlKTtcbiAgICAgIHZhciBmbGFncyA9ICRTdHJpbmcoUi5mbGFncyk7XG4gICAgICByZXR1cm4gJy8nICsgcGF0dGVybiArICcvJyArIGZsYWdzO1xuICAgIH0sIHRydWUpO1xuICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZywgb3JpZ1JlZ0V4cFRvU3RyaW5nKTtcbiAgfVxuXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzICYmICghcmVnRXhwU3VwcG9ydHNGbGFnc1dpdGhSZWdleCB8fCByZWdFeHBOZWVkc1RvU3VwcG9ydFN5bWJvbE1hdGNoKSkge1xuICAgIHZhciBmbGFnc0dldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJykuZ2V0O1xuICAgIHZhciBzb3VyY2VEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihSZWdFeHAucHJvdG90eXBlLCAnc291cmNlJykgfHwge307XG4gICAgdmFyIGxlZ2FjeVNvdXJjZUdldHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHByaW9yIHRvIGl0IGJlaW5nIGEgZ2V0dGVyLCBpdCdzIG93biArIG5vbmNvbmZpZ3VyYWJsZVxuICAgICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICAgIH07XG4gICAgdmFyIHNvdXJjZUdldHRlciA9IEVTLklzQ2FsbGFibGUoc291cmNlRGVzYy5nZXQpID8gc291cmNlRGVzYy5nZXQgOiBsZWdhY3lTb3VyY2VHZXR0ZXI7XG5cbiAgICB2YXIgT3JpZ1JlZ0V4cCA9IFJlZ0V4cDtcbiAgICB2YXIgUmVnRXhwU2hpbSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gUmVnRXhwKHBhdHRlcm4sIGZsYWdzKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuSXNSZWdFeHAgPSBFUy5Jc1JlZ0V4cChwYXR0ZXJuKTtcbiAgICAgICAgdmFyIGNhbGxlZFdpdGhOZXcgPSB0aGlzIGluc3RhbmNlb2YgUmVnRXhwO1xuICAgICAgICBpZiAoIWNhbGxlZFdpdGhOZXcgJiYgcGF0dGVybklzUmVnRXhwICYmIHR5cGVvZiBmbGFncyA9PT0gJ3VuZGVmaW5lZCcgJiYgcGF0dGVybi5jb25zdHJ1Y3RvciA9PT0gUmVnRXhwKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgUCA9IHBhdHRlcm47XG4gICAgICAgIHZhciBGID0gZmxhZ3M7XG4gICAgICAgIGlmIChUeXBlLnJlZ2V4KHBhdHRlcm4pKSB7XG4gICAgICAgICAgUCA9IEVTLkNhbGwoc291cmNlR2V0dGVyLCBwYXR0ZXJuKTtcbiAgICAgICAgICBGID0gdHlwZW9mIGZsYWdzID09PSAndW5kZWZpbmVkJyA/IEVTLkNhbGwoZmxhZ3NHZXR0ZXIsIHBhdHRlcm4pIDogZmxhZ3M7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoUCwgRik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybklzUmVnRXhwKSB7XG4gICAgICAgICAgUCA9IHBhdHRlcm4uc291cmNlO1xuICAgICAgICAgIEYgPSB0eXBlb2YgZmxhZ3MgPT09ICd1bmRlZmluZWQnID8gcGF0dGVybi5mbGFncyA6IGZsYWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgT3JpZ1JlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG4gICAgICB9O1xuICAgIH0oKSk7XG4gICAgd3JhcENvbnN0cnVjdG9yKE9yaWdSZWdFeHAsIFJlZ0V4cFNoaW0sIHtcbiAgICAgICRpbnB1dDogdHJ1ZSAvLyBDaHJvbWUgPCB2MzkgJiBPcGVyYSA8IDI2IGhhdmUgYSBub25zdGFuZGFyZCBcIiRpbnB1dFwiIHByb3BlcnR5XG4gICAgfSk7XG4gICAgLyogZ2xvYmFscyBSZWdFeHA6IHRydWUgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiwgbm8tZ2xvYmFsLWFzc2lnbiAqL1xuICAgIFJlZ0V4cCA9IFJlZ0V4cFNoaW07XG4gICAgVmFsdWUucmVkZWZpbmUoZ2xvYmFscywgJ1JlZ0V4cCcsIFJlZ0V4cFNoaW0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYsIG5vLWdsb2JhbC1hc3NpZ24gKi9cbiAgICAvKiBnbG9iYWxzIFJlZ0V4cDogZmFsc2UgKi9cbiAgfVxuXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgdmFyIHJlZ2V4R2xvYmFscyA9IHtcbiAgICAgIGlucHV0OiAnJF8nLFxuICAgICAgbGFzdE1hdGNoOiAnJCYnLFxuICAgICAgbGFzdFBhcmVuOiAnJCsnLFxuICAgICAgbGVmdENvbnRleHQ6ICckYCcsXG4gICAgICByaWdodENvbnRleHQ6ICckXFwnJ1xuICAgIH07XG4gICAgX2ZvckVhY2goa2V5cyhyZWdleEdsb2JhbHMpLCBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgaWYgKHByb3AgaW4gUmVnRXhwICYmICEocmVnZXhHbG9iYWxzW3Byb3BdIGluIFJlZ0V4cCkpIHtcbiAgICAgICAgVmFsdWUuZ2V0dGVyKFJlZ0V4cCwgcmVnZXhHbG9iYWxzW3Byb3BdLCBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZ0V4cFtwcm9wXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYWRkRGVmYXVsdFNwZWNpZXMoUmVnRXhwKTtcblxuICB2YXIgaW52ZXJzZUVwc2lsb24gPSAxIC8gTnVtYmVyLkVQU0lMT047XG4gIHZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiByb3VuZFRpZXNUb0V2ZW4obikge1xuICAgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgcmVkdWNlcyBkb3duIHRvIGByZXR1cm4gbmAsIGl0IHRha2VzIGFkdmFudGFnZSBvZiBidWlsdC1pbiByb3VuZGluZy5cbiAgICByZXR1cm4gKG4gKyBpbnZlcnNlRXBzaWxvbikgLSBpbnZlcnNlRXBzaWxvbjtcbiAgfTtcbiAgdmFyIEJJTkFSWV8zMl9FUFNJTE9OID0gTWF0aC5wb3coMiwgLTIzKTtcbiAgdmFyIEJJTkFSWV8zMl9NQVhfVkFMVUUgPSBNYXRoLnBvdygyLCAxMjcpICogKDIgLSBCSU5BUllfMzJfRVBTSUxPTik7XG4gIHZhciBCSU5BUllfMzJfTUlOX1ZBTFVFID0gTWF0aC5wb3coMiwgLTEyNik7XG4gIHZhciBFID0gTWF0aC5FO1xuICB2YXIgTE9HMkUgPSBNYXRoLkxPRzJFO1xuICB2YXIgTE9HMTBFID0gTWF0aC5MT0cxMEU7XG4gIHZhciBudW1iZXJDTFogPSBOdW1iZXIucHJvdG90eXBlLmNsejtcbiAgZGVsZXRlIE51bWJlci5wcm90b3R5cGUuY2x6OyAvLyBTYWZhcmkgOCBoYXMgTnVtYmVyI2NselxuXG4gIHZhciBNYXRoU2hpbXMgPSB7XG4gICAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHZhbHVlKSB7XG4gICAgICB2YXIgeCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAobnVtYmVySXNOYU4oeCkgfHwgdmFsdWUgPCAxKSB7IHJldHVybiBOYU47IH1cbiAgICAgIGlmICh4ID09PSAxKSB7IHJldHVybiAwOyB9XG4gICAgICBpZiAoeCA9PT0gSW5maW5pdHkpIHsgcmV0dXJuIHg7IH1cblxuICAgICAgdmFyIHhJbnZTcXVhcmVkID0gMSAvICh4ICogeCk7XG4gICAgICBpZiAoeCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIF9sb2cxcCh4IC0gMSArIChfc3FydCgxIC0geEludlNxdWFyZWQpICogeCkpO1xuICAgICAgfVxuICAgICAgdmFyIGhhbGZYID0geCAvIDI7XG4gICAgICByZXR1cm4gX2xvZzFwKGhhbGZYICsgKF9zcXJ0KDEgLSB4SW52U3F1YXJlZCkgKiBoYWxmWCkgLSAxKSArICgxIC8gTE9HMkUpO1xuICAgIH0sXG5cbiAgICBhc2luaDogZnVuY3Rpb24gYXNpbmgodmFsdWUpIHtcbiAgICAgIHZhciB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh4ID09PSAwIHx8ICFnbG9iYWxJc0Zpbml0ZSh4KSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cblxuICAgICAgdmFyIGEgPSBfYWJzKHgpO1xuICAgICAgdmFyIGFTcXVhcmVkID0gYSAqIGE7XG4gICAgICB2YXIgcyA9IF9zaWduKHgpO1xuICAgICAgaWYgKGEgPCAxKSB7XG4gICAgICAgIHJldHVybiBzICogX2xvZzFwKGEgKyAoYVNxdWFyZWQgLyAoX3NxcnQoYVNxdWFyZWQgKyAxKSArIDEpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcyAqIChfbG9nMXAoKGEgLyAyKSArIChfc3FydCgxICsgKDEgLyBhU3F1YXJlZCkpICogYSAvIDIpIC0gMSkgKyAoMSAvIExPRzJFKSk7XG4gICAgfSxcblxuICAgIGF0YW5oOiBmdW5jdGlvbiBhdGFuaCh2YWx1ZSkge1xuICAgICAgdmFyIHggPSBOdW1iZXIodmFsdWUpO1xuXG4gICAgICBpZiAoeCA9PT0gMCkgeyByZXR1cm4geDsgfVxuICAgICAgaWYgKHggPT09IC0xKSB7IHJldHVybiAtSW5maW5pdHk7IH1cbiAgICAgIGlmICh4ID09PSAxKSB7IHJldHVybiBJbmZpbml0eTsgfVxuICAgICAgaWYgKG51bWJlcklzTmFOKHgpIHx8IHggPCAtMSB8fCB4ID4gMSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuXG4gICAgICB2YXIgYSA9IF9hYnMoeCk7XG4gICAgICByZXR1cm4gX3NpZ24oeCkgKiBfbG9nMXAoMiAqIGEgLyAoMSAtIGEpKSAvIDI7XG4gICAgfSxcblxuICAgIGNicnQ6IGZ1bmN0aW9uIGNicnQodmFsdWUpIHtcbiAgICAgIHZhciB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh4ID09PSAwKSB7IHJldHVybiB4OyB9XG4gICAgICB2YXIgbmVnYXRlID0geCA8IDA7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKG5lZ2F0ZSkgeyB4ID0gLXg7IH1cbiAgICAgIGlmICh4ID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXN1bHQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IF9leHAoX2xvZyh4KSAvIDMpO1xuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3ViZV9yb290I051bWVyaWNhbF9tZXRob2RzXG4gICAgICAgIHJlc3VsdCA9ICgoeCAvIChyZXN1bHQgKiByZXN1bHQpKSArICgyICogcmVzdWx0KSkgLyAzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5lZ2F0ZSA/IC1yZXN1bHQgOiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGNsejMyOiBmdW5jdGlvbiBjbHozMih2YWx1ZSkge1xuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY21hc2NyaXB0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2NVxuICAgICAgdmFyIHggPSBOdW1iZXIodmFsdWUpO1xuICAgICAgdmFyIG51bWJlciA9IEVTLlRvVWludDMyKHgpO1xuICAgICAgaWYgKG51bWJlciA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyQ0xaID8gRVMuQ2FsbChudW1iZXJDTFosIG51bWJlcikgOiAzMSAtIF9mbG9vcihfbG9nKG51bWJlciArIDAuNSkgKiBMT0cyRSk7XG4gICAgfSxcblxuICAgIGNvc2g6IGZ1bmN0aW9uIGNvc2godmFsdWUpIHtcbiAgICAgIHZhciB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICh4ID09PSAwKSB7IHJldHVybiAxOyB9IC8vICswIG9yIC0wXG4gICAgICBpZiAobnVtYmVySXNOYU4oeCkpIHsgcmV0dXJuIE5hTjsgfVxuICAgICAgaWYgKCFnbG9iYWxJc0Zpbml0ZSh4KSkgeyByZXR1cm4gSW5maW5pdHk7IH1cblxuICAgICAgdmFyIHQgPSBfZXhwKF9hYnMoeCkgLSAxKTtcbiAgICAgIHJldHVybiAodCArICgxIC8gKHQgKiBFICogRSkpKSAqIChFIC8gMik7XG4gICAgfSxcblxuICAgIGV4cG0xOiBmdW5jdGlvbiBleHBtMSh2YWx1ZSkge1xuICAgICAgdmFyIHggPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHggPT09IC1JbmZpbml0eSkgeyByZXR1cm4gLTE7IH1cbiAgICAgIGlmICghZ2xvYmFsSXNGaW5pdGUoeCkgfHwgeCA9PT0gMCkgeyByZXR1cm4geDsgfVxuICAgICAgaWYgKF9hYnMoeCkgPiAwLjUpIHtcbiAgICAgICAgcmV0dXJuIF9leHAoeCkgLSAxO1xuICAgICAgfVxuICAgICAgLy8gQSBtb3JlIHByZWNpc2UgYXBwcm94aW1hdGlvbiB1c2luZyBUYXlsb3Igc2VyaWVzIGV4cGFuc2lvblxuICAgICAgLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL2VzNi1zaGltL2lzc3Vlcy8zMTQjaXNzdWVjb21tZW50LTcwMjkzOTg2XG4gICAgICB2YXIgdCA9IHg7XG4gICAgICB2YXIgc3VtID0gMDtcbiAgICAgIHZhciBuID0gMTtcbiAgICAgIHdoaWxlIChzdW0gKyB0ICE9PSBzdW0pIHtcbiAgICAgICAgc3VtICs9IHQ7XG4gICAgICAgIG4gKz0gMTtcbiAgICAgICAgdCAqPSB4IC8gbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdW07XG4gICAgfSxcblxuICAgIGh5cG90OiBmdW5jdGlvbiBoeXBvdCh4LCB5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgIHZhciBsYXJnZXN0ID0gMDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IF9hYnMoTnVtYmVyKGFyZ3VtZW50c1tpXSkpO1xuICAgICAgICBpZiAobGFyZ2VzdCA8IHZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0ICo9IChsYXJnZXN0IC8gdmFsdWUpICogKGxhcmdlc3QgLyB2YWx1ZSk7XG4gICAgICAgICAgcmVzdWx0ICs9IDE7XG4gICAgICAgICAgbGFyZ2VzdCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSB2YWx1ZSA+IDAgPyAodmFsdWUgLyBsYXJnZXN0KSAqICh2YWx1ZSAvIGxhcmdlc3QpIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXJnZXN0ID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZ2VzdCAqIF9zcXJ0KHJlc3VsdCk7XG4gICAgfSxcblxuICAgIGxvZzI6IGZ1bmN0aW9uIGxvZzIodmFsdWUpIHtcbiAgICAgIHJldHVybiBfbG9nKHZhbHVlKSAqIExPRzJFO1xuICAgIH0sXG5cbiAgICBsb2cxMDogZnVuY3Rpb24gbG9nMTAodmFsdWUpIHtcbiAgICAgIHJldHVybiBfbG9nKHZhbHVlKSAqIExPRzEwRTtcbiAgICB9LFxuXG4gICAgbG9nMXA6IF9sb2cxcCxcblxuICAgIHNpZ246IF9zaWduLFxuXG4gICAgc2luaDogZnVuY3Rpb24gc2luaCh2YWx1ZSkge1xuICAgICAgdmFyIHggPSBOdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKCFnbG9iYWxJc0Zpbml0ZSh4KSB8fCB4ID09PSAwKSB7IHJldHVybiB4OyB9XG5cbiAgICAgIHZhciBhID0gX2Ficyh4KTtcbiAgICAgIGlmIChhIDwgMSkge1xuICAgICAgICB2YXIgdSA9IE1hdGguZXhwbTEoYSk7XG4gICAgICAgIHJldHVybiBfc2lnbih4KSAqIHUgKiAoMSArICgxIC8gKHUgKyAxKSkpIC8gMjtcbiAgICAgIH1cbiAgICAgIHZhciB0ID0gX2V4cChhIC0gMSk7XG4gICAgICByZXR1cm4gX3NpZ24oeCkgKiAodCAtICgxIC8gKHQgKiBFICogRSkpKSAqIChFIC8gMik7XG4gICAgfSxcblxuICAgIHRhbmg6IGZ1bmN0aW9uIHRhbmgodmFsdWUpIHtcbiAgICAgIHZhciB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmIChudW1iZXJJc05hTih4KSB8fCB4ID09PSAwKSB7IHJldHVybiB4OyB9XG4gICAgICAvLyBjYW4gZXhpdCBlYXJseSBhdCArLTIwIGFzIEpTIGxvc2VzIHByZWNpc2lvbiBmb3IgdHJ1ZSB2YWx1ZSBhdCB0aGlzIGludGVnZXJcbiAgICAgIGlmICh4ID49IDIwKSB7IHJldHVybiAxOyB9XG4gICAgICBpZiAoeCA8PSAtMjApIHsgcmV0dXJuIC0xOyB9XG5cbiAgICAgIHJldHVybiAoTWF0aC5leHBtMSh4KSAtIE1hdGguZXhwbTEoLXgpKSAvIChfZXhwKHgpICsgX2V4cCgteCkpO1xuICAgIH0sXG5cbiAgICB0cnVuYzogZnVuY3Rpb24gdHJ1bmModmFsdWUpIHtcbiAgICAgIHZhciB4ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIHJldHVybiB4IDwgMCA/IC1fZmxvb3IoLXgpIDogX2Zsb29yKHgpO1xuICAgIH0sXG5cbiAgICBpbXVsOiBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICAgIC8vIHRha2VuIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsXG4gICAgICB2YXIgYSA9IEVTLlRvVWludDMyKHgpO1xuICAgICAgdmFyIGIgPSBFUy5Ub1VpbnQzMih5KTtcbiAgICAgIHZhciBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gICAgICB2YXIgYWwgPSBhICYgMHhmZmZmO1xuICAgICAgdmFyIGJoID0gKGIgPj4+IDE2KSAmIDB4ZmZmZjtcbiAgICAgIHZhciBibCA9IGIgJiAweGZmZmY7XG4gICAgICAvLyB0aGUgc2hpZnQgYnkgMCBmaXhlcyB0aGUgc2lnbiBvbiB0aGUgaGlnaCBwYXJ0XG4gICAgICAvLyB0aGUgZmluYWwgfDAgY29udmVydHMgdGhlIHVuc2lnbmVkIHZhbHVlIGludG8gYSBzaWduZWQgdmFsdWVcbiAgICAgIHJldHVybiAoYWwgKiBibCkgKyAoKCgoYWggKiBibCkgKyAoYWwgKiBiaCkpIDw8IDE2KSA+Pj4gMCkgfCAwO1xuICAgIH0sXG5cbiAgICBmcm91bmQ6IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gICAgICB2YXIgdiA9IE51bWJlcih4KTtcbiAgICAgIGlmICh2ID09PSAwIHx8IHYgPT09IEluZmluaXR5IHx8IHYgPT09IC1JbmZpbml0eSB8fCBudW1iZXJJc05hTih2KSkge1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH1cbiAgICAgIHZhciBzaWduID0gX3NpZ24odik7XG4gICAgICB2YXIgYWJzID0gX2Ficyh2KTtcbiAgICAgIGlmIChhYnMgPCBCSU5BUllfMzJfTUlOX1ZBTFVFKSB7XG4gICAgICAgIHJldHVybiBzaWduICogcm91bmRUaWVzVG9FdmVuKGFicyAvIEJJTkFSWV8zMl9NSU5fVkFMVUUgLyBCSU5BUllfMzJfRVBTSUxPTikgKiBCSU5BUllfMzJfTUlOX1ZBTFVFICogQklOQVJZXzMyX0VQU0lMT047XG4gICAgICB9XG4gICAgICAvLyBWZWx0a2FtcCdzIHNwbGl0dGluZyAoPylcbiAgICAgIHZhciBhID0gKDEgKyAoQklOQVJZXzMyX0VQU0lMT04gLyBOdW1iZXIuRVBTSUxPTikpICogYWJzO1xuICAgICAgdmFyIHJlc3VsdCA9IGEgLSAoYSAtIGFicyk7XG4gICAgICBpZiAocmVzdWx0ID4gQklOQVJZXzMyX01BWF9WQUxVRSB8fCBudW1iZXJJc05hTihyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiBzaWduICogSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2lnbiAqIHJlc3VsdDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHdpdGhpblVMUERpc3RhbmNlID0gZnVuY3Rpb24gd2l0aGluVUxQRGlzdGFuY2UocmVzdWx0LCBleHBlY3RlZCwgZGlzdGFuY2UpIHtcbiAgICByZXR1cm4gX2FicygxIC0gKHJlc3VsdCAvIGV4cGVjdGVkKSkgLyBOdW1iZXIuRVBTSUxPTiA8IChkaXN0YW5jZSB8fCA4KTtcbiAgfTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKE1hdGgsIE1hdGhTaGltcyk7XG4gIC8vIENocm9tZSA8IDQwIHNpbmggcmV0dXJucyDiiJ4gZm9yIGxhcmdlIG51bWJlcnNcbiAgZGVmaW5lUHJvcGVydHkoTWF0aCwgJ3NpbmgnLCBNYXRoU2hpbXMuc2luaCwgTWF0aC5zaW5oKDcxMCkgPT09IEluZmluaXR5KTtcbiAgLy8gQ2hyb21lIDwgNDAgY29zaCByZXR1cm5zIOKIniBmb3IgbGFyZ2UgbnVtYmVyc1xuICBkZWZpbmVQcm9wZXJ0eShNYXRoLCAnY29zaCcsIE1hdGhTaGltcy5jb3NoLCBNYXRoLmNvc2goNzEwKSA9PT0gSW5maW5pdHkpO1xuICAvLyBJRSAxMSBUUCBoYXMgYW4gaW1wcmVjaXNlIGxvZzFwOiByZXBvcnRzIE1hdGgubG9nMXAoLTFlLTE3KSBhcyAwXG4gIGRlZmluZVByb3BlcnR5KE1hdGgsICdsb2cxcCcsIE1hdGhTaGltcy5sb2cxcCwgTWF0aC5sb2cxcCgtMWUtMTcpICE9PSAtMWUtMTcpO1xuICAvLyBJRSAxMSBUUCBoYXMgYW4gaW1wcmVjaXNlIGFzaW5oOiByZXBvcnRzIE1hdGguYXNpbmgoLTFlNykgYXMgbm90IGV4YWN0bHkgZXF1YWwgdG8gLU1hdGguYXNpbmgoMWU3KVxuICBkZWZpbmVQcm9wZXJ0eShNYXRoLCAnYXNpbmgnLCBNYXRoU2hpbXMuYXNpbmgsIE1hdGguYXNpbmgoLTFlNykgIT09IC1NYXRoLmFzaW5oKDFlNykpO1xuICAvLyBDaHJvbWUgPCA1NCBhc2luaCByZXR1cm5zIOKIniBmb3IgbGFyZ2UgbnVtYmVycyBhbmQgc2hvdWxkIG5vdFxuICBkZWZpbmVQcm9wZXJ0eShNYXRoLCAnYXNpbmgnLCBNYXRoU2hpbXMuYXNpbmgsIE1hdGguYXNpbmgoMWUrMzAwKSA9PT0gSW5maW5pdHkpO1xuICAvLyBDaHJvbWUgPCA1NCBhdGFuaCBpbmNvcnJlY3RseSByZXR1cm5zIDAgZm9yIGxhcmdlIG51bWJlcnNcbiAgZGVmaW5lUHJvcGVydHkoTWF0aCwgJ2F0YW5oJywgTWF0aFNoaW1zLmF0YW5oLCBNYXRoLmF0YW5oKDFlLTMwMCkgPT09IDApO1xuICAvLyBDaHJvbWUgNDAgaGFzIGFuIGltcHJlY2lzZSBNYXRoLnRhbmggd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiAgZGVmaW5lUHJvcGVydHkoTWF0aCwgJ3RhbmgnLCBNYXRoU2hpbXMudGFuaCwgTWF0aC50YW5oKC0yZS0xNykgIT09IC0yZS0xNyk7XG4gIC8vIENocm9tZSA0MCBsb3NlcyBNYXRoLmFjb3NoIHByZWNpc2lvbiB3aXRoIGhpZ2ggbnVtYmVyc1xuICBkZWZpbmVQcm9wZXJ0eShNYXRoLCAnYWNvc2gnLCBNYXRoU2hpbXMuYWNvc2gsIE1hdGguYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkgPT09IEluZmluaXR5KTtcbiAgLy8gQ2hyb21lIDwgNTQgaGFzIGFuIGluYWNjdXJhdGUgYWNvc2ggZm9yIEVQU0lMT04gZGVsdGFzXG4gIGRlZmluZVByb3BlcnR5KE1hdGgsICdhY29zaCcsIE1hdGhTaGltcy5hY29zaCwgIXdpdGhpblVMUERpc3RhbmNlKE1hdGguYWNvc2goMSArIE51bWJlci5FUFNJTE9OKSwgTWF0aC5zcXJ0KDIgKiBOdW1iZXIuRVBTSUxPTikpKTtcbiAgLy8gRmlyZWZveCAzOCBvbiBXaW5kb3dzXG4gIGRlZmluZVByb3BlcnR5KE1hdGgsICdjYnJ0JywgTWF0aFNoaW1zLmNicnQsICF3aXRoaW5VTFBEaXN0YW5jZShNYXRoLmNicnQoMWUtMzAwKSwgMWUtMTAwKSk7XG4gIC8vIG5vZGUgMC4xMSBoYXMgYW4gaW1wcmVjaXNlIE1hdGguc2luaCB3aXRoIHZlcnkgc21hbGwgbnVtYmVyc1xuICBkZWZpbmVQcm9wZXJ0eShNYXRoLCAnc2luaCcsIE1hdGhTaGltcy5zaW5oLCBNYXRoLnNpbmgoLTJlLTE3KSAhPT0gLTJlLTE3KTtcbiAgLy8gRkYgMzUgb24gTGludXggcmVwb3J0cyAyMjAyNS40NjU3OTQ4MDY3MjUgZm9yIE1hdGguZXhwbTEoMTApXG4gIHZhciBleHBtMU9mVGVuID0gTWF0aC5leHBtMSgxMCk7XG4gIGRlZmluZVByb3BlcnR5KE1hdGgsICdleHBtMScsIE1hdGhTaGltcy5leHBtMSwgZXhwbTFPZlRlbiA+IDIyMDI1LjQ2NTc5NDgwNjcxOSB8fCBleHBtMU9mVGVuIDwgMjIwMjUuNDY1Nzk0ODA2NzE2NTE2OCk7XG5cbiAgdmFyIG9yaWdNYXRoUm91bmQgPSBNYXRoLnJvdW5kO1xuICAvLyBicmVha3MgaW4gZS5nLiBTYWZhcmkgOCwgSW50ZXJuZXQgRXhwbG9yZXIgMTEsIE9wZXJhIDEyXG4gIHZhciByb3VuZEhhbmRsZXNCb3VuZGFyeUNvbmRpdGlvbnMgPSBNYXRoLnJvdW5kKDAuNSAtIChOdW1iZXIuRVBTSUxPTiAvIDQpKSA9PT0gMCAmJlxuICAgIE1hdGgucm91bmQoLTAuNSArIChOdW1iZXIuRVBTSUxPTiAvIDMuOTkpKSA9PT0gMTtcblxuICAvLyBXaGVuIGVuZ2luZXMgdXNlIE1hdGguZmxvb3IoeCArIDAuNSkgaW50ZXJuYWxseSwgTWF0aC5yb3VuZCBjYW4gYmUgYnVnZ3kgZm9yIGxhcmdlIGludGVnZXJzLlxuICAvLyBUaGlzIGJlaGF2aW9yIHNob3VsZCBiZSBnb3Zlcm5lZCBieSBcInJvdW5kIHRvIG5lYXJlc3QsIHRpZXMgdG8gZXZlbiBtb2RlXCJcbiAgLy8gc2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10ZXJtcy1hbmQtZGVmaW5pdGlvbnMtbnVtYmVyLXR5cGVcbiAgLy8gVGhlc2UgYXJlIHRoZSBib3VuZGFyeSBjYXNlcyB3aGVyZSBpdCBicmVha3MuXG4gIHZhciBzbWFsbGVzdFBvc2l0aXZlTnVtYmVyV2hlcmVSb3VuZEJyZWFrcyA9IGludmVyc2VFcHNpbG9uICsgMTtcbiAgdmFyIGxhcmdlc3RQb3NpdGl2ZU51bWJlcldoZXJlUm91bmRCcmVha3MgPSAoMiAqIGludmVyc2VFcHNpbG9uKSAtIDE7XG4gIHZhciByb3VuZERvZXNOb3RJbmNyZWFzZUludGVnZXJzID0gW1xuICAgIHNtYWxsZXN0UG9zaXRpdmVOdW1iZXJXaGVyZVJvdW5kQnJlYWtzLFxuICAgIGxhcmdlc3RQb3NpdGl2ZU51bWJlcldoZXJlUm91bmRCcmVha3NcbiAgXS5ldmVyeShmdW5jdGlvbiAobnVtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobnVtKSA9PT0gbnVtO1xuICB9KTtcbiAgZGVmaW5lUHJvcGVydHkoTWF0aCwgJ3JvdW5kJywgZnVuY3Rpb24gcm91bmQoeCkge1xuICAgIHZhciBmbG9vciA9IF9mbG9vcih4KTtcbiAgICB2YXIgY2VpbCA9IGZsb29yID09PSAtMSA/IC0wIDogZmxvb3IgKyAxO1xuICAgIHJldHVybiB4IC0gZmxvb3IgPCAwLjUgPyBmbG9vciA6IGNlaWw7XG4gIH0sICFyb3VuZEhhbmRsZXNCb3VuZGFyeUNvbmRpdGlvbnMgfHwgIXJvdW5kRG9lc05vdEluY3JlYXNlSW50ZWdlcnMpO1xuICBWYWx1ZS5wcmVzZXJ2ZVRvU3RyaW5nKE1hdGgucm91bmQsIG9yaWdNYXRoUm91bmQpO1xuXG4gIHZhciBvcmlnSW11bCA9IE1hdGguaW11bDtcbiAgaWYgKE1hdGguaW11bCgweGZmZmZmZmZmLCA1KSAhPT0gLTUpIHtcbiAgICAvLyBTYWZhcmkgNi4xLCBhdCBsZWFzdCwgcmVwb3J0cyBcIjBcIiBmb3IgdGhpcyB2YWx1ZVxuICAgIE1hdGguaW11bCA9IE1hdGhTaGltcy5pbXVsO1xuICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoTWF0aC5pbXVsLCBvcmlnSW11bCk7XG4gIH1cbiAgaWYgKE1hdGguaW11bC5sZW5ndGggIT09IDIpIHtcbiAgICAvLyBTYWZhcmkgOC4wLjQgaGFzIGEgbGVuZ3RoIG9mIDFcbiAgICAvLyBmaXhlZCBpbiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNjU4XG4gICAgb3ZlcnJpZGVOYXRpdmUoTWF0aCwgJ2ltdWwnLCBmdW5jdGlvbiBpbXVsKHgsIHkpIHtcbiAgICAgIHJldHVybiBFUy5DYWxsKG9yaWdJbXVsLCBNYXRoLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gUHJvbWlzZXNcbiAgLy8gU2ltcGxlc3QgcG9zc2libGUgaW1wbGVtZW50YXRpb247IHVzZSBhIDNyZC1wYXJ0eSBsaWJyYXJ5IGlmIHlvdVxuICAvLyB3YW50IHRoZSBiZXN0IHBvc3NpYmxlIHNwZWVkIGFuZC9vciBsb25nIHN0YWNrIHRyYWNlcy5cbiAgdmFyIFByb21pc2VTaGltID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2V0VGltZW91dCA9IGdsb2JhbHMuc2V0VGltZW91dDtcbiAgICAvLyBzb21lIGVudmlyb25tZW50cyBkb24ndCBoYXZlIHNldFRpbWVvdXQgLSBubyB3YXkgdG8gc2hpbSBoZXJlLlxuICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuOyB9XG5cbiAgICBFUy5Jc1Byb21pc2UgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QocHJvbWlzZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBwcm9taXNlLl9wcm9taXNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHVuaW5pdGlhbGl6ZWQsIG9yIG1pc3Npbmcgb3VyIGhpZGRlbiBmaWVsZC5cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvLyBcIlByb21pc2VDYXBhYmlsaXR5XCIgaW4gdGhlIHNwZWMgaXMgd2hhdCBtb3N0IHByb21pc2UgaW1wbGVtZW50YXRpb25zXG4gICAgLy8gY2FsbCBhIFwiZGVmZXJyZWRcIi5cbiAgICB2YXIgUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgICAgaWYgKCFFUy5Jc0NvbnN0cnVjdG9yKEMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JhZCBwcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgICB9XG4gICAgICB2YXIgY2FwYWJpbGl0eSA9IHRoaXM7XG4gICAgICB2YXIgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChjYXBhYmlsaXR5LnJlc29sdmUgIT09IHZvaWQgMCB8fCBjYXBhYmlsaXR5LnJlamVjdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIFByb21pc2UgaW1wbGVtZW50YXRpb24hJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FwYWJpbGl0eS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgY2FwYWJpbGl0eS5yZWplY3QgPSByZWplY3Q7XG4gICAgICB9O1xuICAgICAgLy8gSW5pdGlhbGl6ZSBmaWVsZHMgdG8gaW5mb3JtIG9wdGltaXplcnMgYWJvdXQgdGhlIG9iamVjdCBzaGFwZS5cbiAgICAgIGNhcGFiaWxpdHkucmVzb2x2ZSA9IHZvaWQgMDtcbiAgICAgIGNhcGFiaWxpdHkucmVqZWN0ID0gdm9pZCAwO1xuICAgICAgY2FwYWJpbGl0eS5wcm9taXNlID0gbmV3IEMocmVzb2x2ZXIpO1xuICAgICAgaWYgKCEoRVMuSXNDYWxsYWJsZShjYXBhYmlsaXR5LnJlc29sdmUpICYmIEVTLklzQ2FsbGFibGUoY2FwYWJpbGl0eS5yZWplY3QpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYWQgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBmaW5kIGFuIGFwcHJvcHJpYXRlIHNldEltbWVkaWF0ZS1hbGlrZVxuICAgIHZhciBtYWtlWmVyb1RpbWVvdXQ7XG4gICAgLypnbG9iYWwgd2luZG93ICovXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIEVTLklzQ2FsbGFibGUod2luZG93LnBvc3RNZXNzYWdlKSkge1xuICAgICAgbWFrZVplcm9UaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBmcm9tIGh0dHA6Ly9kYmFyb24ub3JnL2xvZy8yMDEwMDMwOS1mYXN0ZXItdGltZW91dHNcbiAgICAgICAgdmFyIHRpbWVvdXRzID0gW107XG4gICAgICAgIHZhciBtZXNzYWdlTmFtZSA9ICd6ZXJvLXRpbWVvdXQtbWVzc2FnZSc7XG4gICAgICAgIHZhciBzZXRaZXJvVGltZW91dCA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgIF9wdXNoKHRpbWVvdXRzLCBmbik7XG4gICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKG1lc3NhZ2VOYW1lLCAnKicpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlTWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IHdpbmRvdyAmJiBldmVudC5kYXRhID09PSBtZXNzYWdlTmFtZSkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGltZW91dHMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgdmFyIGZuID0gX3NoaWZ0KHRpbWVvdXRzKTtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZU1lc3NhZ2UsIHRydWUpO1xuICAgICAgICByZXR1cm4gc2V0WmVyb1RpbWVvdXQ7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgbWFrZVByb21pc2VBc2FwID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQW4gZWZmaWNpZW50IHRhc2stc2NoZWR1bGVyIGJhc2VkIG9uIGEgcHJlLWV4aXN0aW5nIFByb21pc2VcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uLCB3aGljaCB3ZSBjYW4gdXNlIGV2ZW4gaWYgd2Ugb3ZlcnJpZGUgdGhlXG4gICAgICAvLyBnbG9iYWwgUHJvbWlzZSBiZWxvdyAoaW4gb3JkZXIgdG8gd29ya2Fyb3VuZCBidWdzKVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1JheW5vcy9vYnNlcnYtaGFzaC9pc3N1ZXMvMiNpc3N1ZWNvbW1lbnQtMzU4NTc2NzFcbiAgICAgIHZhciBQID0gZ2xvYmFscy5Qcm9taXNlO1xuICAgICAgdmFyIHByID0gUCAmJiBQLnJlc29sdmUgJiYgUC5yZXNvbHZlKCk7XG4gICAgICByZXR1cm4gcHIgJiYgZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgcmV0dXJuIHByLnRoZW4odGFzayk7XG4gICAgICB9O1xuICAgIH07XG4gICAgLypnbG9iYWwgcHJvY2VzcyAqL1xuICAgIHZhciBlbnF1ZXVlID0gRVMuSXNDYWxsYWJsZShnbG9iYWxzLnNldEltbWVkaWF0ZSkgP1xuICAgICAgZ2xvYmFscy5zZXRJbW1lZGlhdGUgOlxuICAgICAgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MubmV4dFRpY2sgPyBwcm9jZXNzLm5leHRUaWNrIDogbWFrZVByb21pc2VBc2FwKCkgfHxcbiAgICAgIChFUy5Jc0NhbGxhYmxlKG1ha2VaZXJvVGltZW91dCkgPyBtYWtlWmVyb1RpbWVvdXQoKSA6IGZ1bmN0aW9uICh0YXNrKSB7IHNldFRpbWVvdXQodGFzaywgMCk7IH0pOyAvLyBmYWxsYmFja1xuXG4gICAgLy8gQ29uc3RhbnRzIGZvciBQcm9taXNlIGltcGxlbWVudGF0aW9uXG4gICAgdmFyIFBST01JU0VfSURFTlRJVFkgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4geDsgfTtcbiAgICB2YXIgUFJPTUlTRV9USFJPV0VSID0gZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfTtcbiAgICB2YXIgUFJPTUlTRV9QRU5ESU5HID0gMDtcbiAgICB2YXIgUFJPTUlTRV9GVUxGSUxMRUQgPSAxO1xuICAgIHZhciBQUk9NSVNFX1JFSkVDVEVEID0gMjtcbiAgICAvLyBXZSBzdG9yZSBmdWxmaWxsL3JlamVjdCBoYW5kbGVycyBhbmQgY2FwYWJpbGl0aWVzIGluIGEgc2luZ2xlIGFycmF5LlxuICAgIHZhciBQUk9NSVNFX0ZVTEZJTExfT0ZGU0VUID0gMDtcbiAgICB2YXIgUFJPTUlTRV9SRUpFQ1RfT0ZGU0VUID0gMTtcbiAgICB2YXIgUFJPTUlTRV9DQVBBQklMSVRZX09GRlNFVCA9IDI7XG4gICAgLy8gVGhpcyBpcyB1c2VkIGluIGFuIG9wdGltaXphdGlvbiBmb3IgY2hhaW5pbmcgcHJvbWlzZXMgdmlhIHRoZW4uXG4gICAgdmFyIFBST01JU0VfRkFLRV9DQVBBQklMSVRZID0ge307XG5cbiAgICB2YXIgZW5xdWV1ZVByb21pc2VSZWFjdGlvbkpvYiA9IGZ1bmN0aW9uIChoYW5kbGVyLCBjYXBhYmlsaXR5LCBhcmd1bWVudCkge1xuICAgICAgZW5xdWV1ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByb21pc2VSZWFjdGlvbkpvYihoYW5kbGVyLCBjYXBhYmlsaXR5LCBhcmd1bWVudCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIHByb21pc2VSZWFjdGlvbkpvYiA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwcm9taXNlQ2FwYWJpbGl0eSwgYXJndW1lbnQpIHtcbiAgICAgIHZhciBoYW5kbGVyUmVzdWx0LCBmO1xuICAgICAgaWYgKHByb21pc2VDYXBhYmlsaXR5ID09PSBQUk9NSVNFX0ZBS0VfQ0FQQUJJTElUWSkge1xuICAgICAgICAvLyBGYXN0IGNhc2UsIHdoZW4gd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byBjaGFpbiB0aHJvdWdoIHRvIGFcbiAgICAgICAgLy8gKHJlYWwpIHByb21pc2VDYXBhYmlsaXR5LlxuICAgICAgICByZXR1cm4gaGFuZGxlcihhcmd1bWVudCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyUmVzdWx0ID0gaGFuZGxlcihhcmd1bWVudCk7XG4gICAgICAgIGYgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVyUmVzdWx0ID0gZTtcbiAgICAgICAgZiA9IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdDtcbiAgICAgIH1cbiAgICAgIGYoaGFuZGxlclJlc3VsdCk7XG4gICAgfTtcblxuICAgIHZhciBmdWxmaWxsUHJvbWlzZSA9IGZ1bmN0aW9uIChwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgdmFyIF9wcm9taXNlID0gcHJvbWlzZS5fcHJvbWlzZTtcbiAgICAgIHZhciBsZW5ndGggPSBfcHJvbWlzZS5yZWFjdGlvbkxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICAgIGVucXVldWVQcm9taXNlUmVhY3Rpb25Kb2IoXG4gICAgICAgICAgX3Byb21pc2UuZnVsZmlsbFJlYWN0aW9uSGFuZGxlcjAsXG4gICAgICAgICAgX3Byb21pc2UucmVhY3Rpb25DYXBhYmlsaXR5MCxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICApO1xuICAgICAgICBfcHJvbWlzZS5mdWxmaWxsUmVhY3Rpb25IYW5kbGVyMCA9IHZvaWQgMDtcbiAgICAgICAgX3Byb21pc2UucmVqZWN0UmVhY3Rpb25zMCA9IHZvaWQgMDtcbiAgICAgICAgX3Byb21pc2UucmVhY3Rpb25DYXBhYmlsaXR5MCA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMSwgaWR4ID0gMDsgaSA8IGxlbmd0aDsgaSsrLCBpZHggKz0gMykge1xuICAgICAgICAgICAgZW5xdWV1ZVByb21pc2VSZWFjdGlvbkpvYihcbiAgICAgICAgICAgICAgX3Byb21pc2VbaWR4ICsgUFJPTUlTRV9GVUxGSUxMX09GRlNFVF0sXG4gICAgICAgICAgICAgIF9wcm9taXNlW2lkeCArIFBST01JU0VfQ0FQQUJJTElUWV9PRkZTRVRdLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb21pc2VbaWR4ICsgUFJPTUlTRV9GVUxGSUxMX09GRlNFVF0gPSB2b2lkIDA7XG4gICAgICAgICAgICBwcm9taXNlW2lkeCArIFBST01JU0VfUkVKRUNUX09GRlNFVF0gPSB2b2lkIDA7XG4gICAgICAgICAgICBwcm9taXNlW2lkeCArIFBST01JU0VfQ0FQQUJJTElUWV9PRkZTRVRdID0gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgX3Byb21pc2UucmVzdWx0ID0gdmFsdWU7XG4gICAgICBfcHJvbWlzZS5zdGF0ZSA9IFBST01JU0VfRlVMRklMTEVEO1xuICAgICAgX3Byb21pc2UucmVhY3Rpb25MZW5ndGggPSAwO1xuICAgIH07XG5cbiAgICB2YXIgcmVqZWN0UHJvbWlzZSA9IGZ1bmN0aW9uIChwcm9taXNlLCByZWFzb24pIHtcbiAgICAgIHZhciBfcHJvbWlzZSA9IHByb21pc2UuX3Byb21pc2U7XG4gICAgICB2YXIgbGVuZ3RoID0gX3Byb21pc2UucmVhY3Rpb25MZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICBlbnF1ZXVlUHJvbWlzZVJlYWN0aW9uSm9iKFxuICAgICAgICAgIF9wcm9taXNlLnJlamVjdFJlYWN0aW9uSGFuZGxlcjAsXG4gICAgICAgICAgX3Byb21pc2UucmVhY3Rpb25DYXBhYmlsaXR5MCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgICAgX3Byb21pc2UuZnVsZmlsbFJlYWN0aW9uSGFuZGxlcjAgPSB2b2lkIDA7XG4gICAgICAgIF9wcm9taXNlLnJlamVjdFJlYWN0aW9uczAgPSB2b2lkIDA7XG4gICAgICAgIF9wcm9taXNlLnJlYWN0aW9uQ2FwYWJpbGl0eTAgPSB2b2lkIDA7XG4gICAgICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDEsIGlkeCA9IDA7IGkgPCBsZW5ndGg7IGkrKywgaWR4ICs9IDMpIHtcbiAgICAgICAgICAgIGVucXVldWVQcm9taXNlUmVhY3Rpb25Kb2IoXG4gICAgICAgICAgICAgIF9wcm9taXNlW2lkeCArIFBST01JU0VfUkVKRUNUX09GRlNFVF0sXG4gICAgICAgICAgICAgIF9wcm9taXNlW2lkeCArIFBST01JU0VfQ0FQQUJJTElUWV9PRkZTRVRdLFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9taXNlW2lkeCArIFBST01JU0VfRlVMRklMTF9PRkZTRVRdID0gdm9pZCAwO1xuICAgICAgICAgICAgcHJvbWlzZVtpZHggKyBQUk9NSVNFX1JFSkVDVF9PRkZTRVRdID0gdm9pZCAwO1xuICAgICAgICAgICAgcHJvbWlzZVtpZHggKyBQUk9NSVNFX0NBUEFCSUxJVFlfT0ZGU0VUXSA9IHZvaWQgMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIF9wcm9taXNlLnJlc3VsdCA9IHJlYXNvbjtcbiAgICAgIF9wcm9taXNlLnN0YXRlID0gUFJPTUlTRV9SRUpFQ1RFRDtcbiAgICAgIF9wcm9taXNlLnJlYWN0aW9uTGVuZ3RoID0gMDtcbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZVJlc29sdmluZ0Z1bmN0aW9ucyA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICB2YXIgYWxyZWFkeVJlc29sdmVkID0gZmFsc2U7XG4gICAgICB2YXIgcmVzb2x2ZSA9IGZ1bmN0aW9uIChyZXNvbHV0aW9uKSB7XG4gICAgICAgIHZhciB0aGVuO1xuICAgICAgICBpZiAoYWxyZWFkeVJlc29sdmVkKSB7IHJldHVybjsgfVxuICAgICAgICBhbHJlYWR5UmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICBpZiAocmVzb2x1dGlvbiA9PT0gcHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiByZWplY3RQcm9taXNlKHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ1NlbGYgcmVzb2x1dGlvbicpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUVTLlR5cGVJc09iamVjdChyZXNvbHV0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBmdWxmaWxsUHJvbWlzZShwcm9taXNlLCByZXNvbHV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4gPSByZXNvbHV0aW9uLnRoZW47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0UHJvbWlzZShwcm9taXNlLCBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUVTLklzQ2FsbGFibGUodGhlbikpIHtcbiAgICAgICAgICByZXR1cm4gZnVsZmlsbFByb21pc2UocHJvbWlzZSwgcmVzb2x1dGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZW5xdWV1ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvbWlzZVJlc29sdmVUaGVuYWJsZUpvYihwcm9taXNlLCByZXNvbHV0aW9uLCB0aGVuKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdmFyIHJlamVjdCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgaWYgKGFscmVhZHlSZXNvbHZlZCkgeyByZXR1cm47IH1cbiAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHJlamVjdFByb21pc2UocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIH07XG4gICAgICByZXR1cm4geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH07XG5cbiAgICB2YXIgb3B0aW1pemVkVGhlbiA9IGZ1bmN0aW9uICh0aGVuLCB0aGVuYWJsZSwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAvLyBPcHRpbWl6YXRpb246IHNpbmNlIHdlIGRpc2NhcmQgdGhlIHJlc3VsdCwgd2UgY2FuIHBhc3Mgb3VyXG4gICAgICAvLyBvd24gdGhlbiBpbXBsZW1lbnRhdGlvbiBhIHNwZWNpYWwgaGludCB0byBsZXQgaXQga25vdyBpdFxuICAgICAgLy8gZG9lc24ndCBoYXZlIHRvIGNyZWF0ZSBpdC4gIChUaGUgUFJPTUlTRV9GQUtFX0NBUEFCSUxJVFlcbiAgICAgIC8vIG9iamVjdCBpcyBsb2NhbCB0byB0aGlzIGltcGxlbWVudGF0aW9uIGFuZCB1bmZvcmdlYWJsZSBvdXRzaWRlLilcbiAgICAgIGlmICh0aGVuID09PSBQcm9taXNlJHByb3RvdHlwZSR0aGVuKSB7XG4gICAgICAgIF9jYWxsKHRoZW4sIHRoZW5hYmxlLCByZXNvbHZlLCByZWplY3QsIFBST01JU0VfRkFLRV9DQVBBQklMSVRZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9jYWxsKHRoZW4sIHRoZW5hYmxlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHByb21pc2VSZXNvbHZlVGhlbmFibGVKb2IgPSBmdW5jdGlvbiAocHJvbWlzZSwgdGhlbmFibGUsIHRoZW4pIHtcbiAgICAgIHZhciByZXNvbHZpbmdGdW5jdGlvbnMgPSBjcmVhdGVSZXNvbHZpbmdGdW5jdGlvbnMocHJvbWlzZSk7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlc29sdmluZ0Z1bmN0aW9ucy5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlc29sdmluZ0Z1bmN0aW9ucy5yZWplY3Q7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRpbWl6ZWRUaGVuKHRoZW4sIHRoZW5hYmxlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBQcm9taXNlJHByb3RvdHlwZSwgUHJvbWlzZSRwcm90b3R5cGUkdGhlbjtcbiAgICB2YXIgUHJvbWlzZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgUHJvbWlzZVNoaW0gPSBmdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlU2hpbSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb25zdHJ1Y3RvciBQcm9taXNlIHJlcXVpcmVzIFwibmV3XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl9wcm9taXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGNvbnN0cnVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3MuZWNtYXNjcmlwdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0ODJcbiAgICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKHJlc29sdmVyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBhIHZhbGlkIHJlc29sdmVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb21pc2UgPSBlbXVsYXRlRVM2Y29uc3RydWN0KHRoaXMsIFByb21pc2VTaGltLCBQcm9taXNlJHByb3RvdHlwZSwge1xuICAgICAgICAgIF9wcm9taXNlOiB7XG4gICAgICAgICAgICByZXN1bHQ6IHZvaWQgMCxcbiAgICAgICAgICAgIHN0YXRlOiBQUk9NSVNFX1BFTkRJTkcsXG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBcInJlYWN0aW9uc1wiIGFycmF5IGlzIGlubGluZWQgaGVyZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIG1vc3QgcHJvbWlzZXMgb25seSBoYXZlIG9uZSByZWFjdGlvbi5cbiAgICAgICAgICAgIC8vIFdlJ3ZlIGFsc28gZXhwbG9kZWQgdGhlICdyZWFjdGlvbicgb2JqZWN0IHRvIGlubGluZSB0aGVcbiAgICAgICAgICAgIC8vIFwiaGFuZGxlclwiIGFuZCBcImNhcGFiaWxpdHlcIiBmaWVsZHMsIHNpbmNlIGJvdGggZnVsZmlsbCBhbmRcbiAgICAgICAgICAgIC8vIHJlamVjdCByZWFjdGlvbnMgc2hhcmUgdGhlIHNhbWUgY2FwYWJpbGl0eS5cbiAgICAgICAgICAgIHJlYWN0aW9uTGVuZ3RoOiAwLFxuICAgICAgICAgICAgZnVsZmlsbFJlYWN0aW9uSGFuZGxlcjA6IHZvaWQgMCxcbiAgICAgICAgICAgIHJlamVjdFJlYWN0aW9uSGFuZGxlcjA6IHZvaWQgMCxcbiAgICAgICAgICAgIHJlYWN0aW9uQ2FwYWJpbGl0eTA6IHZvaWQgMFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciByZXNvbHZpbmdGdW5jdGlvbnMgPSBjcmVhdGVSZXNvbHZpbmdGdW5jdGlvbnMocHJvbWlzZSk7XG4gICAgICAgIHZhciByZWplY3QgPSByZXNvbHZpbmdGdW5jdGlvbnMucmVqZWN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc29sdmVyKHJlc29sdmluZ0Z1bmN0aW9ucy5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBQcm9taXNlU2hpbTtcbiAgICB9KCkpO1xuICAgIFByb21pc2UkcHJvdG90eXBlID0gUHJvbWlzZS5wcm90b3R5cGU7XG5cbiAgICB2YXIgX3Byb21pc2VBbGxSZXNvbHZlciA9IGZ1bmN0aW9uIChpbmRleCwgdmFsdWVzLCBjYXBhYmlsaXR5LCByZW1haW5pbmcpIHtcbiAgICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlO1xuICAgICAgICB2YWx1ZXNbaW5kZXhdID0geDtcbiAgICAgICAgaWYgKCgtLXJlbWFpbmluZy5jb3VudCkgPT09IDApIHtcbiAgICAgICAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlcyk7IC8vIGNhbGwgdy8gdGhpcz09PXVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICB2YXIgcGVyZm9ybVByb21pc2VBbGwgPSBmdW5jdGlvbiAoaXRlcmF0b3JSZWNvcmQsIEMsIHJlc3VsdENhcGFiaWxpdHkpIHtcbiAgICAgIHZhciBpdCA9IGl0ZXJhdG9yUmVjb3JkLml0ZXJhdG9yO1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHsgY291bnQ6IDEgfTtcbiAgICAgIHZhciBuZXh0LCBuZXh0VmFsdWU7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXh0ID0gRVMuSXRlcmF0b3JTdGVwKGl0KTtcbiAgICAgICAgICBpZiAobmV4dCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yUmVjb3JkLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHRWYWx1ZSA9IG5leHQudmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpdGVyYXRvclJlY29yZC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlc1tpbmRleF0gPSB2b2lkIDA7XG4gICAgICAgIHZhciBuZXh0UHJvbWlzZSA9IEMucmVzb2x2ZShuZXh0VmFsdWUpO1xuICAgICAgICB2YXIgcmVzb2x2ZUVsZW1lbnQgPSBfcHJvbWlzZUFsbFJlc29sdmVyKFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICByZXN1bHRDYXBhYmlsaXR5LFxuICAgICAgICAgIHJlbWFpbmluZ1xuICAgICAgICApO1xuICAgICAgICByZW1haW5pbmcuY291bnQgKz0gMTtcbiAgICAgICAgb3B0aW1pemVkVGhlbihuZXh0UHJvbWlzZS50aGVuLCBuZXh0UHJvbWlzZSwgcmVzb2x2ZUVsZW1lbnQsIHJlc3VsdENhcGFiaWxpdHkucmVqZWN0KTtcbiAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgIH1cbiAgICAgIGlmICgoLS1yZW1haW5pbmcuY291bnQpID09PSAwKSB7XG4gICAgICAgIHZhciByZXNvbHZlID0gcmVzdWx0Q2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICAgICByZXNvbHZlKHZhbHVlcyk7IC8vIGNhbGwgdy8gdGhpcz09PXVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9O1xuXG4gICAgdmFyIHBlcmZvcm1Qcm9taXNlUmFjZSA9IGZ1bmN0aW9uIChpdGVyYXRvclJlY29yZCwgQywgcmVzdWx0Q2FwYWJpbGl0eSkge1xuICAgICAgdmFyIGl0ID0gaXRlcmF0b3JSZWNvcmQuaXRlcmF0b3I7XG4gICAgICB2YXIgbmV4dCwgbmV4dFZhbHVlLCBuZXh0UHJvbWlzZTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV4dCA9IEVTLkl0ZXJhdG9yU3RlcChpdCk7XG4gICAgICAgICAgaWYgKG5leHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBJZiBpdGVyYWJsZSBoYXMgbm8gaXRlbXMsIHJlc3VsdGluZyBwcm9taXNlIHdpbGwgbmV2ZXJcbiAgICAgICAgICAgIC8vIHJlc29sdmU7IHNlZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kb21lbmljL3Byb21pc2VzLXVud3JhcHBpbmcvaXNzdWVzLzc1XG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNtYXNjcmlwdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1MTVcbiAgICAgICAgICAgIGl0ZXJhdG9yUmVjb3JkLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHRWYWx1ZSA9IG5leHQudmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpdGVyYXRvclJlY29yZC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIG5leHRQcm9taXNlID0gQy5yZXNvbHZlKG5leHRWYWx1ZSk7XG4gICAgICAgIG9wdGltaXplZFRoZW4obmV4dFByb21pc2UudGhlbiwgbmV4dFByb21pc2UsIHJlc3VsdENhcGFiaWxpdHkucmVzb2x2ZSwgcmVzdWx0Q2FwYWJpbGl0eS5yZWplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhQcm9taXNlLCB7XG4gICAgICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgICAgICB2YXIgQyA9IHRoaXM7XG4gICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KEMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZSBpcyBub3Qgb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhcGFiaWxpdHkgPSBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgICAgIHZhciBpdGVyYXRvciwgaXRlcmF0b3JSZWNvcmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXRlcmF0b3IgPSBFUy5HZXRJdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgICAgICAgaXRlcmF0b3JSZWNvcmQgPSB7IGl0ZXJhdG9yOiBpdGVyYXRvciwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICByZXR1cm4gcGVyZm9ybVByb21pc2VBbGwoaXRlcmF0b3JSZWNvcmQsIEMsIGNhcGFiaWxpdHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdmFyIGV4Y2VwdGlvbiA9IGU7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yUmVjb3JkICYmICFpdGVyYXRvclJlY29yZC5kb25lKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBFUy5JdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCB0cnVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVlKSB7XG4gICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgICAgICAgcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgcmFjZTogZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICAgICAgICB2YXIgQyA9IHRoaXM7XG4gICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KEMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZSBpcyBub3Qgb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhcGFiaWxpdHkgPSBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgICAgIHZhciBpdGVyYXRvciwgaXRlcmF0b3JSZWNvcmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXRlcmF0b3IgPSBFUy5HZXRJdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgICAgICAgaXRlcmF0b3JSZWNvcmQgPSB7IGl0ZXJhdG9yOiBpdGVyYXRvciwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICByZXR1cm4gcGVyZm9ybVByb21pc2VSYWNlKGl0ZXJhdG9yUmVjb3JkLCBDLCBjYXBhYmlsaXR5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHZhciBleGNlcHRpb24gPSBlO1xuICAgICAgICAgIGlmIChpdGVyYXRvclJlY29yZCAmJiAhaXRlcmF0b3JSZWNvcmQuZG9uZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgRVMuSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlZSkge1xuICAgICAgICAgICAgICBleGNlcHRpb24gPSBlZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICAgICAgIHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHJlYXNvbikge1xuICAgICAgICB2YXIgQyA9IHRoaXM7XG4gICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KEMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICAgICAgdmFyIHJlamVjdEZ1bmMgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAgICAgcmVqZWN0RnVuYyhyZWFzb24pOyAvLyBjYWxsIHdpdGggdGhpcz09PXVuZGVmaW5lZFxuICAgICAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICAgICAgfSxcblxuICAgICAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh2KSB7XG4gICAgICAgIC8vIFNlZSBodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvZml4aW5nLXByb21pc2UtcmVzb2x2ZSBmb3Igc3BlY1xuICAgICAgICB2YXIgQyA9IHRoaXM7XG4gICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KEMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRVMuSXNQcm9taXNlKHYpKSB7XG4gICAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdi5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICBpZiAoY29uc3RydWN0b3IgPT09IEMpIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICAgICAgdmFyIHJlc29sdmVGdW5jID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgICAgICByZXNvbHZlRnVuYyh2KTsgLy8gY2FsbCB3aXRoIHRoaXM9PT11bmRlZmluZWRcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlZmluZVByb3BlcnRpZXMoUHJvbWlzZSRwcm90b3R5cGUsIHtcbiAgICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG4gICAgICB9LFxuXG4gICAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gdGhpcztcbiAgICAgICAgaWYgKCFFUy5Jc1Byb21pc2UocHJvbWlzZSkpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignbm90IGEgcHJvbWlzZScpOyB9XG4gICAgICAgIHZhciBDID0gRVMuU3BlY2llc0NvbnN0cnVjdG9yKHByb21pc2UsIFByb21pc2UpO1xuICAgICAgICB2YXIgcmVzdWx0Q2FwYWJpbGl0eTtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlSXNJZ25vcmVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdID09PSBQUk9NSVNFX0ZBS0VfQ0FQQUJJTElUWTtcbiAgICAgICAgaWYgKHJldHVyblZhbHVlSXNJZ25vcmVkICYmIEMgPT09IFByb21pc2UpIHtcbiAgICAgICAgICByZXN1bHRDYXBhYmlsaXR5ID0gUFJPTUlTRV9GQUtFX0NBUEFCSUxJVFk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Q2FwYWJpbGl0eSA9IG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJmb3JtUHJvbWlzZVRoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHJlc3VsdENhcGFiaWxpdHkpXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSd2ZSBzcGxpdCB0aGUgJ3JlYWN0aW9uJyBvYmplY3QgaW50byBpdHMgdHdvXG4gICAgICAgIC8vIGNvbXBvbmVudHMsIFwiY2FwYWJpbGl0aWVzXCIgYW5kIFwiaGFuZGxlclwiXG4gICAgICAgIC8vIFwiY2FwYWJpbGl0aWVzXCIgaXMgYWx3YXlzIGVxdWFsIHRvIGByZXN1bHRDYXBhYmlsaXR5YFxuICAgICAgICB2YXIgZnVsZmlsbFJlYWN0aW9uSGFuZGxlciA9IEVTLklzQ2FsbGFibGUob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiBQUk9NSVNFX0lERU5USVRZO1xuICAgICAgICB2YXIgcmVqZWN0UmVhY3Rpb25IYW5kbGVyID0gRVMuSXNDYWxsYWJsZShvblJlamVjdGVkKSA/IG9uUmVqZWN0ZWQgOiBQUk9NSVNFX1RIUk9XRVI7XG4gICAgICAgIHZhciBfcHJvbWlzZSA9IHByb21pc2UuX3Byb21pc2U7XG4gICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgaWYgKF9wcm9taXNlLnN0YXRlID09PSBQUk9NSVNFX1BFTkRJTkcpIHtcbiAgICAgICAgICBpZiAoX3Byb21pc2UucmVhY3Rpb25MZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIF9wcm9taXNlLmZ1bGZpbGxSZWFjdGlvbkhhbmRsZXIwID0gZnVsZmlsbFJlYWN0aW9uSGFuZGxlcjtcbiAgICAgICAgICAgIF9wcm9taXNlLnJlamVjdFJlYWN0aW9uSGFuZGxlcjAgPSByZWplY3RSZWFjdGlvbkhhbmRsZXI7XG4gICAgICAgICAgICBfcHJvbWlzZS5yZWFjdGlvbkNhcGFiaWxpdHkwID0gcmVzdWx0Q2FwYWJpbGl0eTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGlkeCA9IDMgKiAoX3Byb21pc2UucmVhY3Rpb25MZW5ndGggLSAxKTtcbiAgICAgICAgICAgIF9wcm9taXNlW2lkeCArIFBST01JU0VfRlVMRklMTF9PRkZTRVRdID0gZnVsZmlsbFJlYWN0aW9uSGFuZGxlcjtcbiAgICAgICAgICAgIF9wcm9taXNlW2lkeCArIFBST01JU0VfUkVKRUNUX09GRlNFVF0gPSByZWplY3RSZWFjdGlvbkhhbmRsZXI7XG4gICAgICAgICAgICBfcHJvbWlzZVtpZHggKyBQUk9NSVNFX0NBUEFCSUxJVFlfT0ZGU0VUXSA9IHJlc3VsdENhcGFiaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9wcm9taXNlLnJlYWN0aW9uTGVuZ3RoICs9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoX3Byb21pc2Uuc3RhdGUgPT09IFBST01JU0VfRlVMRklMTEVEKSB7XG4gICAgICAgICAgdmFsdWUgPSBfcHJvbWlzZS5yZXN1bHQ7XG4gICAgICAgICAgZW5xdWV1ZVByb21pc2VSZWFjdGlvbkpvYihcbiAgICAgICAgICAgIGZ1bGZpbGxSZWFjdGlvbkhhbmRsZXIsXG4gICAgICAgICAgICByZXN1bHRDYXBhYmlsaXR5LFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKF9wcm9taXNlLnN0YXRlID09PSBQUk9NSVNFX1JFSkVDVEVEKSB7XG4gICAgICAgICAgdmFsdWUgPSBfcHJvbWlzZS5yZXN1bHQ7XG4gICAgICAgICAgZW5xdWV1ZVByb21pc2VSZWFjdGlvbkpvYihcbiAgICAgICAgICAgIHJlamVjdFJlYWN0aW9uSGFuZGxlcixcbiAgICAgICAgICAgIHJlc3VsdENhcGFiaWxpdHksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5leHBlY3RlZCBQcm9taXNlIHN0YXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBUaGlzIGhlbHBzIHRoZSBvcHRpbWl6ZXIgYnkgZW5zdXJpbmcgdGhhdCBtZXRob2RzIHdoaWNoIHRha2VcbiAgICAvLyBjYXBhYmlsaXRpZXMgYXJlbid0IHBvbHltb3JwaGljLlxuICAgIFBST01JU0VfRkFLRV9DQVBBQklMSVRZID0gbmV3IFByb21pc2VDYXBhYmlsaXR5KFByb21pc2UpO1xuICAgIFByb21pc2UkcHJvdG90eXBlJHRoZW4gPSBQcm9taXNlJHByb3RvdHlwZS50aGVuO1xuXG4gICAgcmV0dXJuIFByb21pc2U7XG4gIH0oKSk7XG5cbiAgLy8gQ2hyb21lJ3MgbmF0aXZlIFByb21pc2UgaGFzIGV4dHJhIG1ldGhvZHMgdGhhdCBpdCBzaG91bGRuJ3QgaGF2ZS4gTGV0J3MgcmVtb3ZlIHRoZW0uXG4gIGlmIChnbG9iYWxzLlByb21pc2UpIHtcbiAgICBkZWxldGUgZ2xvYmFscy5Qcm9taXNlLmFjY2VwdDtcbiAgICBkZWxldGUgZ2xvYmFscy5Qcm9taXNlLmRlZmVyO1xuICAgIGRlbGV0ZSBnbG9iYWxzLlByb21pc2UucHJvdG90eXBlLmNoYWluO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBQcm9taXNlU2hpbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIGV4cG9ydCB0aGUgUHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKGdsb2JhbHMsIHsgUHJvbWlzZTogUHJvbWlzZVNoaW0gfSk7XG4gICAgLy8gSW4gQ2hyb21lIDMzIChhbmQgdGhlcmVhYm91dHMpIFByb21pc2UgaXMgZGVmaW5lZCwgYnV0IHRoZVxuICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5IGluIGEgbnVtYmVyIG9mIHdheXMuICBMZXQncyBjaGVjayBzdWJjbGFzc2luZ1xuICAgIC8vIHN1cHBvcnQgdG8gc2VlIGlmIHdlIGhhdmUgYSBidWdneSBpbXBsZW1lbnRhdGlvbi5cbiAgICB2YXIgcHJvbWlzZVN1cHBvcnRzU3ViY2xhc3NpbmcgPSBzdXBwb3J0c1N1YmNsYXNzaW5nKGdsb2JhbHMuUHJvbWlzZSwgZnVuY3Rpb24gKFMpIHtcbiAgICAgIHJldHVybiBTLnJlc29sdmUoNDIpLnRoZW4oZnVuY3Rpb24gKCkge30pIGluc3RhbmNlb2YgUztcbiAgICB9KTtcbiAgICB2YXIgcHJvbWlzZUlnbm9yZXNOb25GdW5jdGlvblRoZW5DYWxsYmFja3MgPSAhdGhyb3dzRXJyb3IoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdsb2JhbHMuUHJvbWlzZS5yZWplY3QoNDIpLnRoZW4obnVsbCwgNSkudGhlbihudWxsLCBub29wKTtcbiAgICB9KTtcbiAgICB2YXIgcHJvbWlzZVJlcXVpcmVzT2JqZWN0Q29udGV4dCA9IHRocm93c0Vycm9yKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdsb2JhbHMuUHJvbWlzZS5jYWxsKDMsIG5vb3ApOyB9KTtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUoKSB3YXMgZXJyYXRhJ2VkIGxhdGUgaW4gdGhlIEVTNiBwcm9jZXNzLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MDc0MlxuICAgIC8vICAgICAgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxNjFcbiAgICAvLyBJdCBzZXJ2ZXMgYXMgYSBwcm94eSBmb3IgYSBudW1iZXIgb2Ygb3RoZXIgYnVncyBpbiBlYXJseSBQcm9taXNlXG4gICAgLy8gaW1wbGVtZW50YXRpb25zLlxuICAgIHZhciBwcm9taXNlUmVzb2x2ZUJyb2tlbiA9IChmdW5jdGlvbiAoUHJvbWlzZSkge1xuICAgICAgdmFyIHAgPSBQcm9taXNlLnJlc29sdmUoNSk7XG4gICAgICBwLmNvbnN0cnVjdG9yID0ge307XG4gICAgICB2YXIgcDIgPSBQcm9taXNlLnJlc29sdmUocCk7XG4gICAgICB0cnkge1xuICAgICAgICBwMi50aGVuKG51bGwsIG5vb3ApLnRoZW4obnVsbCwgbm9vcCk7IC8vIGF2b2lkIFwidW5jYXVnaHQgcmVqZWN0aW9uXCIgd2FybmluZ3MgaW4gY29uc29sZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdjggbmF0aXZlIFByb21pc2VzIGJyZWFrIGhlcmUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU3NTMxNFxuICAgICAgfVxuICAgICAgcmV0dXJuIHAgPT09IHAyOyAvLyBUaGlzICpzaG91bGQqIGJlIGZhbHNlIVxuICAgIH0oZ2xvYmFscy5Qcm9taXNlKSk7XG5cbiAgICAvLyBDaHJvbWUgNDYgKHByb2JhYmx5IG9sZGVyIHRvbykgZG9lcyBub3QgcmV0cmlldmUgYSB0aGVuYWJsZSdzIC50aGVuIHN5bmNocm9ub3VzbHlcbiAgICB2YXIgZ2V0c1RoZW5TeW5jaHJvbm91c2x5ID0gc3VwcG9ydHNEZXNjcmlwdG9ycyAmJiAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBnZXR0ZXItcmV0dXJuXG4gICAgICB2YXIgdGhlbmFibGUgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd0aGVuJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgY291bnQgKz0gMTsgfSB9KTtcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGVuYWJsZSk7XG4gICAgICByZXR1cm4gY291bnQgPT09IDE7XG4gICAgfSgpKTtcblxuICAgIHZhciBCYWRSZXNvbHZlclByb21pc2UgPSBmdW5jdGlvbiBCYWRSZXNvbHZlclByb21pc2UoZXhlY3V0b3IpIHtcbiAgICAgIHZhciBwID0gbmV3IFByb21pc2UoZXhlY3V0b3IpO1xuICAgICAgZXhlY3V0b3IoMywgZnVuY3Rpb24gKCkge30pO1xuICAgICAgdGhpcy50aGVuID0gcC50aGVuO1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IEJhZFJlc29sdmVyUHJvbWlzZTtcbiAgICB9O1xuICAgIEJhZFJlc29sdmVyUHJvbWlzZS5wcm90b3R5cGUgPSBQcm9taXNlLnByb3RvdHlwZTtcbiAgICBCYWRSZXNvbHZlclByb21pc2UuYWxsID0gUHJvbWlzZS5hbGw7XG4gICAgLy8gQ2hyb21lIENhbmFyeSA0OSAocHJvYmFibHkgb2xkZXIgdG9vKSBoYXMgc29tZSBpbXBsZW1lbnRhdGlvbiBidWdzXG4gICAgdmFyIGhhc0JhZFJlc29sdmVyUHJvbWlzZSA9IHZhbHVlT3JGYWxzZUlmVGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIUJhZFJlc29sdmVyUHJvbWlzZS5hbGwoWzEsIDJdKTtcbiAgICB9KTtcblxuICAgIGlmICghcHJvbWlzZVN1cHBvcnRzU3ViY2xhc3NpbmcgfHwgIXByb21pc2VJZ25vcmVzTm9uRnVuY3Rpb25UaGVuQ2FsbGJhY2tzIHx8XG4gICAgICAgICFwcm9taXNlUmVxdWlyZXNPYmplY3RDb250ZXh0IHx8IHByb21pc2VSZXNvbHZlQnJva2VuIHx8XG4gICAgICAgICFnZXRzVGhlblN5bmNocm9ub3VzbHkgfHwgaGFzQmFkUmVzb2x2ZXJQcm9taXNlKSB7XG4gICAgICAvKiBnbG9iYWxzIFByb21pc2U6IHRydWUgKi9cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmLCBuby1nbG9iYWwtYXNzaWduICovXG4gICAgICBQcm9taXNlID0gUHJvbWlzZVNoaW07XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmLCBuby1nbG9iYWwtYXNzaWduICovXG4gICAgICAvKiBnbG9iYWxzIFByb21pc2U6IGZhbHNlICovXG4gICAgICBvdmVycmlkZU5hdGl2ZShnbG9iYWxzLCAnUHJvbWlzZScsIFByb21pc2VTaGltKTtcbiAgICB9XG4gICAgaWYgKFByb21pc2UuYWxsLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdmFyIG9yaWdBbGwgPSBQcm9taXNlLmFsbDtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKFByb21pc2UsICdhbGwnLCBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICAgICAgcmV0dXJuIEVTLkNhbGwob3JpZ0FsbCwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoUHJvbWlzZS5yYWNlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdmFyIG9yaWdSYWNlID0gUHJvbWlzZS5yYWNlO1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoUHJvbWlzZSwgJ3JhY2UnLCBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgICAgIHJldHVybiBFUy5DYWxsKG9yaWdSYWNlLCB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChQcm9taXNlLnJlc29sdmUubGVuZ3RoICE9PSAxKSB7XG4gICAgICB2YXIgb3JpZ1Jlc29sdmUgPSBQcm9taXNlLnJlc29sdmU7XG4gICAgICBvdmVycmlkZU5hdGl2ZShQcm9taXNlLCAncmVzb2x2ZScsIGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgICAgICByZXR1cm4gRVMuQ2FsbChvcmlnUmVzb2x2ZSwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoUHJvbWlzZS5yZWplY3QubGVuZ3RoICE9PSAxKSB7XG4gICAgICB2YXIgb3JpZ1JlamVjdCA9IFByb21pc2UucmVqZWN0O1xuICAgICAgb3ZlcnJpZGVOYXRpdmUoUHJvbWlzZSwgJ3JlamVjdCcsIGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgICAgIHJldHVybiBFUy5DYWxsKG9yaWdSZWplY3QsIHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZW5zdXJlRW51bWVyYWJsZShQcm9taXNlLCAnYWxsJyk7XG4gICAgZW5zdXJlRW51bWVyYWJsZShQcm9taXNlLCAncmFjZScpO1xuICAgIGVuc3VyZUVudW1lcmFibGUoUHJvbWlzZSwgJ3Jlc29sdmUnKTtcbiAgICBlbnN1cmVFbnVtZXJhYmxlKFByb21pc2UsICdyZWplY3QnKTtcbiAgICBhZGREZWZhdWx0U3BlY2llcyhQcm9taXNlKTtcbiAgfVxuXG4gIC8vIE1hcCBhbmQgU2V0IHJlcXVpcmUgYSB0cnVlIEVTNSBlbnZpcm9ubWVudFxuICAvLyBUaGVpciBmYXN0IHBhdGggYWxzbyByZXF1aXJlcyB0aGF0IHRoZSBlbnZpcm9ubWVudCBwcmVzZXJ2ZVxuICAvLyBwcm9wZXJ0eSBpbnNlcnRpb24gb3JkZXIsIHdoaWNoIGlzIG5vdCBndWFyYW50ZWVkIGJ5IHRoZSBzcGVjLlxuICB2YXIgdGVzdE9yZGVyID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgYiA9IGtleXMoX3JlZHVjZShhLCBmdW5jdGlvbiAobywgaykge1xuICAgICAgb1trXSA9IHRydWU7XG4gICAgICByZXR1cm4gbztcbiAgICB9LCB7fSkpO1xuICAgIHJldHVybiBhLmpvaW4oJzonKSA9PT0gYi5qb2luKCc6Jyk7XG4gIH07XG4gIHZhciBwcmVzZXJ2ZXNJbnNlcnRpb25PcmRlciA9IHRlc3RPcmRlcihbJ3onLCAnYScsICdiYiddKTtcbiAgLy8gc29tZSBlbmdpbmVzIChlZywgQ2hyb21lKSBvbmx5IHByZXNlcnZlIGluc2VydGlvbiBvcmRlciBmb3Igc3RyaW5nIGtleXNcbiAgdmFyIHByZXNlcnZlc051bWVyaWNJbnNlcnRpb25PcmRlciA9IHRlc3RPcmRlcihbJ3onLCAxLCAnYScsICczJywgMl0pO1xuXG4gIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG5cbiAgICB2YXIgZmFzdGtleSA9IGZ1bmN0aW9uIGZhc3RrZXkoa2V5LCBza2lwSW5zZXJ0aW9uT3JkZXJDaGVjaykge1xuICAgICAgaWYgKCFza2lwSW5zZXJ0aW9uT3JkZXJDaGVjayAmJiAhcHJlc2VydmVzSW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoa2V5KSkge1xuICAgICAgICByZXR1cm4gJ14nICsgRVMuVG9TdHJpbmcoa2V5KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICckJyArIGtleTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gbm90ZSB0aGF0IC0wIHdpbGwgZ2V0IGNvZXJjZWQgdG8gXCIwXCIgd2hlbiB1c2VkIGFzIGEgcHJvcGVydHkga2V5XG4gICAgICAgIGlmICghcHJlc2VydmVzTnVtZXJpY0luc2VydGlvbk9yZGVyKSB7XG4gICAgICAgICAgcmV0dXJuICduJyArIGtleTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuICdiJyArIGtleTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG5cbiAgICB2YXIgZW1wdHlPYmplY3QgPSBmdW5jdGlvbiBlbXB0eU9iamVjdCgpIHtcbiAgICAgIC8vIGFjY29tb2RhdGUgc29tZSBvbGRlciBub3QtcXVpdGUtRVM1IGJyb3dzZXJzXG4gICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZSA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9O1xuXG4gICAgdmFyIGFkZEl0ZXJhYmxlVG9NYXAgPSBmdW5jdGlvbiBhZGRJdGVyYWJsZVRvTWFwKE1hcENvbnN0cnVjdG9yLCBtYXAsIGl0ZXJhYmxlKSB7XG4gICAgICBpZiAoaXNBcnJheShpdGVyYWJsZSkgfHwgVHlwZS5zdHJpbmcoaXRlcmFibGUpKSB7XG4gICAgICAgIF9mb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIUVTLlR5cGVJc09iamVjdChlbnRyeSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0l0ZXJhdG9yIHZhbHVlICcgKyBlbnRyeSArICcgaXMgbm90IGFuIGVudHJ5IG9iamVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXAuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYWJsZSBpbnN0YW5jZW9mIE1hcENvbnN0cnVjdG9yKSB7XG4gICAgICAgIF9jYWxsKE1hcENvbnN0cnVjdG9yLnByb3RvdHlwZS5mb3JFYWNoLCBpdGVyYWJsZSwgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyLCBhZGRlcjtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpdGVyYWJsZSkpIHtcbiAgICAgICAgICBhZGRlciA9IG1hcC5zZXQ7XG4gICAgICAgICAgaWYgKCFFUy5Jc0NhbGxhYmxlKGFkZGVyKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdiYWQgbWFwJyk7IH1cbiAgICAgICAgICBpdGVyID0gRVMuR2V0SXRlcmF0b3IoaXRlcmFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaXRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIG5leHQgPSBFUy5JdGVyYXRvclN0ZXAoaXRlcik7XG4gICAgICAgICAgICBpZiAobmV4dCA9PT0gZmFsc2UpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIHZhciBuZXh0SXRlbSA9IG5leHQudmFsdWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIUVTLlR5cGVJc09iamVjdChuZXh0SXRlbSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJdGVyYXRvciB2YWx1ZSAnICsgbmV4dEl0ZW0gKyAnIGlzIG5vdCBhbiBlbnRyeSBvYmplY3QnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY2FsbChhZGRlciwgbWFwLCBuZXh0SXRlbVswXSwgbmV4dEl0ZW1bMV0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBFUy5JdGVyYXRvckNsb3NlKGl0ZXIsIHRydWUpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGFkZEl0ZXJhYmxlVG9TZXQgPSBmdW5jdGlvbiBhZGRJdGVyYWJsZVRvU2V0KFNldENvbnN0cnVjdG9yLCBzZXQsIGl0ZXJhYmxlKSB7XG4gICAgICBpZiAoaXNBcnJheShpdGVyYWJsZSkgfHwgVHlwZS5zdHJpbmcoaXRlcmFibGUpKSB7XG4gICAgICAgIF9mb3JFYWNoKGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBzZXQuYWRkKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGl0ZXJhYmxlIGluc3RhbmNlb2YgU2V0Q29uc3RydWN0b3IpIHtcbiAgICAgICAgX2NhbGwoU2V0Q29uc3RydWN0b3IucHJvdG90eXBlLmZvckVhY2gsIGl0ZXJhYmxlLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBzZXQuYWRkKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXRlciwgYWRkZXI7XG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaXRlcmFibGUpKSB7XG4gICAgICAgICAgYWRkZXIgPSBzZXQuYWRkO1xuICAgICAgICAgIGlmICghRVMuSXNDYWxsYWJsZShhZGRlcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignYmFkIHNldCcpOyB9XG4gICAgICAgICAgaXRlciA9IEVTLkdldEl0ZXJhdG9yKGl0ZXJhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGl0ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHZhciBuZXh0ID0gRVMuSXRlcmF0b3JTdGVwKGl0ZXIpO1xuICAgICAgICAgICAgaWYgKG5leHQgPT09IGZhbHNlKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gbmV4dC52YWx1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIF9jYWxsKGFkZGVyLCBzZXQsIG5leHRWYWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIEVTLkl0ZXJhdG9yQ2xvc2UoaXRlciwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjb2xsZWN0aW9uU2hpbXMgPSB7XG4gICAgICBNYXA6IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGVtcHR5ID0ge307XG5cbiAgICAgICAgdmFyIE1hcEVudHJ5ID0gZnVuY3Rpb24gTWFwRW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgTWFwRW50cnkucHJvdG90eXBlLmlzUmVtb3ZlZCA9IGZ1bmN0aW9uIGlzUmVtb3ZlZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5rZXkgPT09IGVtcHR5O1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBpc01hcCA9IGZ1bmN0aW9uIGlzTWFwKG1hcCkge1xuICAgICAgICAgIHJldHVybiAhIW1hcC5fZXM2bWFwO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciByZXF1aXJlTWFwU2xvdCA9IGZ1bmN0aW9uIHJlcXVpcmVNYXBTbG90KG1hcCwgbWV0aG9kKSB7XG4gICAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QobWFwKSB8fCAhaXNNYXAobWFwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWV0aG9kIE1hcC5wcm90b3R5cGUuJyArIG1ldGhvZCArICcgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlciAnICsgRVMuVG9TdHJpbmcobWFwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBNYXBJdGVyYXRvciA9IGZ1bmN0aW9uIE1hcEl0ZXJhdG9yKG1hcCwga2luZCkge1xuICAgICAgICAgIHJlcXVpcmVNYXBTbG90KG1hcCwgJ1tbTWFwSXRlcmF0b3JdXScpO1xuICAgICAgICAgIHRoaXMuaGVhZCA9IG1hcC5faGVhZDtcbiAgICAgICAgICB0aGlzLmkgPSB0aGlzLmhlYWQ7XG4gICAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgfTtcblxuICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUgPSB7XG4gICAgICAgICAgaXNNYXBJdGVyYXRvcjogdHJ1ZSxcbiAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzTWFwSXRlcmF0b3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGEgTWFwSXRlcmF0b3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpID0gdGhpcy5pO1xuICAgICAgICAgICAgdmFyIGtpbmQgPSB0aGlzLmtpbmQ7XG4gICAgICAgICAgICB2YXIgaGVhZCA9IHRoaXMuaGVhZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JSZXN1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChpLmlzUmVtb3ZlZCgpICYmIGkgIT09IGhlYWQpIHtcbiAgICAgICAgICAgICAgLy8gYmFjayB1cCBvZmYgb2YgcmVtb3ZlZCBlbnRyaWVzXG4gICAgICAgICAgICAgIGkgPSBpLnByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgdW5yZXR1cm5lZCBlbGVtZW50LlxuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChpLm5leHQgIT09IGhlYWQpIHtcbiAgICAgICAgICAgICAgaSA9IGkubmV4dDtcbiAgICAgICAgICAgICAgaWYgKCFpLmlzUmVtb3ZlZCgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT09ICdrZXknKSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBpLmtleTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGkudmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtpLmtleSwgaS52YWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaSA9IGk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9uY2UgdGhlIGl0ZXJhdG9yIGlzIGRvbmUsIGl0IGlzIGRvbmUgZm9yZXZlci5cbiAgICAgICAgICAgIHRoaXMuaSA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclJlc3VsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkSXRlcmF0b3IoTWFwSXRlcmF0b3IucHJvdG90eXBlKTtcblxuICAgICAgICB2YXIgTWFwJHByb3RvdHlwZTtcbiAgICAgICAgdmFyIE1hcFNoaW0gPSBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnN0cnVjdG9yIE1hcCByZXF1aXJlcyBcIm5ld1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX2VzNm1hcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGNvbnN0cnVjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbWFwID0gZW11bGF0ZUVTNmNvbnN0cnVjdCh0aGlzLCBNYXAsIE1hcCRwcm90b3R5cGUsIHtcbiAgICAgICAgICAgIF9lczZtYXA6IHRydWUsXG4gICAgICAgICAgICBfaGVhZDogbnVsbCxcbiAgICAgICAgICAgIF9tYXA6IE9yaWdNYXAgPyBuZXcgT3JpZ01hcCgpIDogbnVsbCxcbiAgICAgICAgICAgIF9zaXplOiAwLFxuICAgICAgICAgICAgX3N0b3JhZ2U6IGVtcHR5T2JqZWN0KClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBoZWFkID0gbmV3IE1hcEVudHJ5KG51bGwsIG51bGwpO1xuICAgICAgICAgIC8vIGNpcmN1bGFyIGRvdWJseS1saW5rZWQgbGlzdC5cbiAgICAgICAgICAvKiBlc2xpbnQgbm8tbXVsdGktYXNzaWduOiAxICovXG4gICAgICAgICAgaGVhZC5uZXh0ID0gaGVhZC5wcmV2ID0gaGVhZDtcbiAgICAgICAgICBtYXAuX2hlYWQgPSBoZWFkO1xuXG4gICAgICAgICAgLy8gT3B0aW9uYWxseSBpbml0aWFsaXplIG1hcCBmcm9tIGl0ZXJhYmxlXG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGRJdGVyYWJsZVRvTWFwKE1hcCwgbWFwLCBhcmd1bWVudHNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgICB9O1xuICAgICAgICBNYXAkcHJvdG90eXBlID0gTWFwU2hpbS5wcm90b3R5cGU7XG5cbiAgICAgICAgVmFsdWUuZ2V0dGVyKE1hcCRwcm90b3R5cGUsICdzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbWV0aG9kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgTWFwJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKE1hcCRwcm90b3R5cGUsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgICAgIHJlcXVpcmVNYXBTbG90KHRoaXMsICdnZXQnKTtcbiAgICAgICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgICAgIHZhciBma2V5ID0gZmFzdGtleShrZXksIHRydWUpO1xuICAgICAgICAgICAgaWYgKGZrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gZmFzdCBPKDEpIHBhdGhcbiAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9zdG9yYWdlW2ZrZXldO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgIC8vIGZhc3Qgb2JqZWN0IGtleSBwYXRoXG4gICAgICAgICAgICAgIGVudHJ5ID0gb3JpZ01hcEdldC5jYWxsKHRoaXMuX21hcCwga2V5KTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgICAgICAgICAgdmFyIGkgPSBoZWFkO1xuICAgICAgICAgICAgd2hpbGUgKChpID0gaS5uZXh0KSAhPT0gaGVhZCkge1xuICAgICAgICAgICAgICBpZiAoRVMuU2FtZVZhbHVlWmVybyhpLmtleSwga2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICAgICAgcmVxdWlyZU1hcFNsb3QodGhpcywgJ2hhcycpO1xuICAgICAgICAgICAgdmFyIGZrZXkgPSBmYXN0a2V5KGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoZmtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBmYXN0IE8oMSkgcGF0aFxuICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuX3N0b3JhZ2VbZmtleV0gIT09ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAvLyBmYXN0IG9iamVjdCBrZXkgcGF0aFxuICAgICAgICAgICAgICByZXR1cm4gb3JpZ01hcEhhcy5jYWxsKHRoaXMuX21hcCwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHZhciBpID0gaGVhZDtcbiAgICAgICAgICAgIHdoaWxlICgoaSA9IGkubmV4dCkgIT09IGhlYWQpIHtcbiAgICAgICAgICAgICAgaWYgKEVTLlNhbWVWYWx1ZVplcm8oaS5rZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICByZXF1aXJlTWFwU2xvdCh0aGlzLCAnc2V0Jyk7XG4gICAgICAgICAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgICAgICB2YXIgaSA9IGhlYWQ7XG4gICAgICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgICAgICB2YXIgZmtleSA9IGZhc3RrZXkoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChma2V5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIGZhc3QgTygxKSBwYXRoXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc3RvcmFnZVtma2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlW2ZrZXldLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLl9zdG9yYWdlW2ZrZXldID0gbmV3IE1hcEVudHJ5KGtleSwgdmFsdWUpOyAvKiBlc2xpbnQgbm8tbXVsdGktYXNzaWduOiAxICovXG4gICAgICAgICAgICAgICAgaSA9IGhlYWQucHJldjtcbiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgICAgLy8gZmFzdCBvYmplY3Qga2V5IHBhdGhcbiAgICAgICAgICAgICAgaWYgKG9yaWdNYXBIYXMuY2FsbCh0aGlzLl9tYXAsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBvcmlnTWFwR2V0LmNhbGwodGhpcy5fbWFwLCBrZXkpLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSBuZXcgTWFwRW50cnkoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgb3JpZ01hcFNldC5jYWxsKHRoaXMuX21hcCwga2V5LCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgaSA9IGhlYWQucHJldjtcbiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2hcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKChpID0gaS5uZXh0KSAhPT0gaGVhZCkge1xuICAgICAgICAgICAgICBpZiAoRVMuU2FtZVZhbHVlWmVybyhpLmtleSwga2V5KSkge1xuICAgICAgICAgICAgICAgIGkudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW50cnkgPSBlbnRyeSB8fCBuZXcgTWFwRW50cnkoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoRVMuU2FtZVZhbHVlKC0wLCBrZXkpKSB7XG4gICAgICAgICAgICAgIGVudHJ5LmtleSA9ICswOyAvLyBjb2VyY2UgLTAgdG8gKzAgaW4gZW50cnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVudHJ5Lm5leHQgPSB0aGlzLl9oZWFkO1xuICAgICAgICAgICAgZW50cnkucHJldiA9IHRoaXMuX2hlYWQucHJldjtcbiAgICAgICAgICAgIGVudHJ5LnByZXYubmV4dCA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkubmV4dC5wcmV2ID0gZW50cnk7XG4gICAgICAgICAgICB0aGlzLl9zaXplICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJlcXVpcmVNYXBTbG90KHRoaXMsICdkZWxldGUnKTtcbiAgICAgICAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHZhciBpID0gaGVhZDtcbiAgICAgICAgICAgIHZhciBma2V5ID0gZmFzdGtleShrZXksIHRydWUpO1xuICAgICAgICAgICAgaWYgKGZrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gZmFzdCBPKDEpIHBhdGhcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zdG9yYWdlW2ZrZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpID0gdGhpcy5fc3RvcmFnZVtma2V5XS5wcmV2O1xuICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fc3RvcmFnZVtma2V5XTtcbiAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgICAvLyBmYXN0IG9iamVjdCBrZXkgcGF0aFxuICAgICAgICAgICAgICBpZiAoIW9yaWdNYXBIYXMuY2FsbCh0aGlzLl9tYXAsIGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaSA9IG9yaWdNYXBHZXQuY2FsbCh0aGlzLl9tYXAsIGtleSkucHJldjtcbiAgICAgICAgICAgICAgb3JpZ01hcERlbGV0ZS5jYWxsKHRoaXMuX21hcCwga2V5KTtcbiAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoKGkgPSBpLm5leHQpICE9PSBoZWFkKSB7XG4gICAgICAgICAgICAgIGlmIChFUy5TYW1lVmFsdWVaZXJvKGkua2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgaS5rZXkgPSBlbXB0eTtcbiAgICAgICAgICAgICAgICBpLnZhbHVlID0gZW1wdHk7XG4gICAgICAgICAgICAgICAgaS5wcmV2Lm5leHQgPSBpLm5leHQ7XG4gICAgICAgICAgICAgICAgaS5uZXh0LnByZXYgPSBpLnByZXY7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2l6ZSAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgICAgIC8qIGVzbGludCBuby1tdWx0aS1hc3NpZ246IDEgKi9cbiAgICAgICAgICAgIHJlcXVpcmVNYXBTbG90KHRoaXMsICdjbGVhcicpO1xuICAgICAgICAgICAgdGhpcy5fbWFwID0gT3JpZ01hcCA/IG5ldyBPcmlnTWFwKCkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlID0gZW1wdHlPYmplY3QoKTtcbiAgICAgICAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHZhciBpID0gaGVhZDtcbiAgICAgICAgICAgIHZhciBwID0gaS5uZXh0O1xuICAgICAgICAgICAgd2hpbGUgKChpID0gcCkgIT09IGhlYWQpIHtcbiAgICAgICAgICAgICAgaS5rZXkgPSBlbXB0eTtcbiAgICAgICAgICAgICAgaS52YWx1ZSA9IGVtcHR5O1xuICAgICAgICAgICAgICBwID0gaS5uZXh0O1xuICAgICAgICAgICAgICBpLm5leHQgPSBpLnByZXYgPSBoZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGVhZC5uZXh0ID0gaGVhZC5wcmV2ID0gaGVhZDtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgICAgICAgIHJlcXVpcmVNYXBTbG90KHRoaXMsICdrZXlzJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMsICdrZXknKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICAgICAgICByZXF1aXJlTWFwU2xvdCh0aGlzLCAndmFsdWVzJyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMsICd2YWx1ZScpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgICAgICAgcmVxdWlyZU1hcFNsb3QodGhpcywgJ2VudHJpZXMnKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcywgJ2tleSt2YWx1ZScpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXF1aXJlTWFwU2xvdCh0aGlzLCAnZm9yRWFjaCcpO1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG4gICAgICAgICAgICB2YXIgaXQgPSB0aGlzLmVudHJpZXMoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGVudHJ5ID0gaXQubmV4dCgpOyAhZW50cnkuZG9uZTsgZW50cnkgPSBpdC5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBfY2FsbChjYWxsYmFjaywgY29udGV4dCwgZW50cnkudmFsdWVbMV0sIGVudHJ5LnZhbHVlWzBdLCB0aGlzKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlbnRyeS52YWx1ZVsxXSwgZW50cnkudmFsdWVbMF0sIHRoaXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYWRkSXRlcmF0b3IoTWFwJHByb3RvdHlwZSwgTWFwJHByb3RvdHlwZS5lbnRyaWVzKTtcblxuICAgICAgICByZXR1cm4gTWFwU2hpbTtcbiAgICAgIH0oKSksXG5cbiAgICAgIFNldDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzU2V0ID0gZnVuY3Rpb24gaXNTZXQoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldC5fZXM2c2V0ICYmIHR5cGVvZiBzZXQuX3N0b3JhZ2UgIT09ICd1bmRlZmluZWQnO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgcmVxdWlyZVNldFNsb3QgPSBmdW5jdGlvbiByZXF1aXJlU2V0U2xvdChzZXQsIG1ldGhvZCkge1xuICAgICAgICAgIGlmICghRVMuVHlwZUlzT2JqZWN0KHNldCkgfHwgIWlzU2V0KHNldCkpIHtcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvZXM2LXNoaW0vaXNzdWVzLzE3NlxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU2V0LnByb3RvdHlwZS4nICsgbWV0aG9kICsgJyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyICcgKyBFUy5Ub1N0cmluZyhzZXQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgYSBNYXAgaXMgZXhwZW5zaXZlLiAgVG8gc3BlZWQgdXAgdGhlIGNvbW1vbiBjYXNlIG9mXG4gICAgICAgIC8vIFNldHMgY29udGFpbmluZyBvbmx5IHN0cmluZyBvciBudW1lcmljIGtleXMsIHdlIHVzZSBhbiBvYmplY3RcbiAgICAgICAgLy8gYXMgYmFja2luZyBzdG9yYWdlIGFuZCBsYXppbHkgY3JlYXRlIGEgZnVsbCBNYXAgb25seSB3aGVuXG4gICAgICAgIC8vIHJlcXVpcmVkLlxuICAgICAgICB2YXIgU2V0JHByb3RvdHlwZTtcbiAgICAgICAgdmFyIFNldFNoaW0gPSBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnN0cnVjdG9yIFNldCByZXF1aXJlcyBcIm5ld1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX2VzNnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQmFkIGNvbnN0cnVjdGlvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc2V0ID0gZW11bGF0ZUVTNmNvbnN0cnVjdCh0aGlzLCBTZXQsIFNldCRwcm90b3R5cGUsIHtcbiAgICAgICAgICAgIF9lczZzZXQ6IHRydWUsXG4gICAgICAgICAgICAnW1tTZXREYXRhXV0nOiBudWxsLFxuICAgICAgICAgICAgX3N0b3JhZ2U6IGVtcHR5T2JqZWN0KClcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIXNldC5fZXM2c2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiYWQgc2V0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3B0aW9uYWxseSBpbml0aWFsaXplIFNldCBmcm9tIGl0ZXJhYmxlXG4gICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhZGRJdGVyYWJsZVRvU2V0KFNldCwgc2V0LCBhcmd1bWVudHNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICB9O1xuICAgICAgICBTZXQkcHJvdG90eXBlID0gU2V0U2hpbS5wcm90b3R5cGU7XG5cbiAgICAgICAgdmFyIGRlY29kZUtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICB2YXIgayA9IGtleTtcbiAgICAgICAgICBpZiAoayA9PT0gJ15udWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmIChrID09PSAnXnVuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBmaXJzdCA9IGsuY2hhckF0KDApO1xuICAgICAgICAgICAgaWYgKGZpcnN0ID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9zdHJTbGljZShrLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09ICduJykge1xuICAgICAgICAgICAgICByZXR1cm4gK19zdHJTbGljZShrLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09ICdiJykge1xuICAgICAgICAgICAgICByZXR1cm4gayA9PT0gJ2J0cnVlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICtrO1xuICAgICAgICB9O1xuICAgICAgICAvLyBTd2l0Y2ggZnJvbSB0aGUgb2JqZWN0IGJhY2tpbmcgc3RvcmFnZSB0byBhIGZ1bGwgTWFwLlxuICAgICAgICB2YXIgZW5zdXJlTWFwID0gZnVuY3Rpb24gZW5zdXJlTWFwKHNldCkge1xuICAgICAgICAgIGlmICghc2V0WydbW1NldERhdGFdXSddKSB7XG4gICAgICAgICAgICB2YXIgbSA9IG5ldyBjb2xsZWN0aW9uU2hpbXMuTWFwKCk7XG4gICAgICAgICAgICBzZXRbJ1tbU2V0RGF0YV1dJ10gPSBtO1xuICAgICAgICAgICAgX2ZvckVhY2goa2V5cyhzZXQuX3N0b3JhZ2UpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIHZhciBrID0gZGVjb2RlS2V5KGtleSk7XG4gICAgICAgICAgICAgIG0uc2V0KGssIGspO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRbJ1tbU2V0RGF0YV1dJ10gPSBtO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXQuX3N0b3JhZ2UgPSBudWxsOyAvLyBmcmVlIG9sZCBiYWNraW5nIHN0b3JhZ2VcbiAgICAgICAgfTtcblxuICAgICAgICBWYWx1ZS5nZXR0ZXIoU2V0U2hpbS5wcm90b3R5cGUsICdzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlcXVpcmVTZXRTbG90KHRoaXMsICdzaXplJyk7XG4gICAgICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzKHRoaXMuX3N0b3JhZ2UpLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW5zdXJlTWFwKHRoaXMpO1xuICAgICAgICAgIHJldHVybiB0aGlzWydbW1NldERhdGFdXSddLnNpemU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlZmluZVByb3BlcnRpZXMoU2V0U2hpbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBoYXM6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgICAgICAgIHJlcXVpcmVTZXRTbG90KHRoaXMsICdoYXMnKTtcbiAgICAgICAgICAgIHZhciBma2V5O1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UgJiYgKGZrZXkgPSBmYXN0a2V5KGtleSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX3N0b3JhZ2VbZmtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnN1cmVNYXAodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1snW1tTZXREYXRhXV0nXS5oYXMoa2V5KTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYWRkOiBmdW5jdGlvbiBhZGQoa2V5KSB7XG4gICAgICAgICAgICByZXF1aXJlU2V0U2xvdCh0aGlzLCAnYWRkJyk7XG4gICAgICAgICAgICB2YXIgZmtleTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9yYWdlICYmIChma2V5ID0gZmFzdGtleShrZXkpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlW2ZrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnN1cmVNYXAodGhpcyk7XG4gICAgICAgICAgICB0aGlzWydbW1NldERhdGFdXSddLnNldChrZXksIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJlcXVpcmVTZXRTbG90KHRoaXMsICdkZWxldGUnKTtcbiAgICAgICAgICAgIHZhciBma2V5O1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UgJiYgKGZrZXkgPSBmYXN0a2V5KGtleSkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBoYXNGS2V5ID0gX2hhc093blByb3BlcnR5KHRoaXMuX3N0b3JhZ2UsIGZrZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gKGRlbGV0ZSB0aGlzLl9zdG9yYWdlW2ZrZXldKSAmJiBoYXNGS2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5zdXJlTWFwKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ1tbU2V0RGF0YV1dJ11bJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgICAgIHJlcXVpcmVTZXRTbG90KHRoaXMsICdjbGVhcicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZSA9IGVtcHR5T2JqZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpc1snW1tTZXREYXRhXV0nXSkge1xuICAgICAgICAgICAgICB0aGlzWydbW1NldERhdGFdXSddLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgICAgICAgICAgcmVxdWlyZVNldFNsb3QodGhpcywgJ3ZhbHVlcycpO1xuICAgICAgICAgICAgZW5zdXJlTWFwKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXRJdGVyYXRvcih0aGlzWydbW1NldERhdGFdXSddLnZhbHVlcygpKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICAgICAgICAgIHJlcXVpcmVTZXRTbG90KHRoaXMsICdlbnRyaWVzJyk7XG4gICAgICAgICAgICBlbnN1cmVNYXAodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNldEl0ZXJhdG9yKHRoaXNbJ1tbU2V0RGF0YV1dJ10uZW50cmllcygpKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmVxdWlyZVNldFNsb3QodGhpcywgJ2ZvckVhY2gnKTtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICAgICAgICAgICAgdmFyIGVudGlyZVNldCA9IHRoaXM7XG4gICAgICAgICAgICBlbnN1cmVNYXAoZW50aXJlU2V0KTtcbiAgICAgICAgICAgIHRoaXNbJ1tbU2V0RGF0YV1dJ10uZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICBpZiAoY29udGV4dCkge1xuICAgICAgICAgICAgICAgIF9jYWxsKGNhbGxiYWNrLCBjb250ZXh0LCBrZXksIGtleSwgZW50aXJlU2V0KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhrZXksIGtleSwgZW50aXJlU2V0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkoU2V0U2hpbS5wcm90b3R5cGUsICdrZXlzJywgU2V0U2hpbS5wcm90b3R5cGUudmFsdWVzLCB0cnVlKTtcbiAgICAgICAgYWRkSXRlcmF0b3IoU2V0U2hpbS5wcm90b3R5cGUsIFNldFNoaW0ucHJvdG90eXBlLnZhbHVlcyk7XG5cbiAgICAgICAgdmFyIFNldEl0ZXJhdG9yID0gZnVuY3Rpb24gU2V0SXRlcmF0b3IoaXQpIHtcbiAgICAgICAgICB0aGlzLml0ID0gaXQ7XG4gICAgICAgIH07XG4gICAgICAgIFNldEl0ZXJhdG9yLnByb3RvdHlwZSA9IHtcbiAgICAgICAgICBpc1NldEl0ZXJhdG9yOiB0cnVlLFxuICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTZXRJdGVyYXRvcikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb3QgYSBTZXRJdGVyYXRvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXQubmV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYWRkSXRlcmF0b3IoU2V0SXRlcmF0b3IucHJvdG90eXBlKTtcblxuICAgICAgICByZXR1cm4gU2V0U2hpbTtcbiAgICAgIH0oKSlcbiAgICB9O1xuXG4gICAgdmFyIGlzR29vZ2xlVHJhbnNsYXRlID0gZ2xvYmFscy5TZXQgJiYgIVNldC5wcm90b3R5cGVbJ2RlbGV0ZSddICYmIFNldC5wcm90b3R5cGUucmVtb3ZlICYmIFNldC5wcm90b3R5cGUuaXRlbXMgJiYgU2V0LnByb3RvdHlwZS5tYXAgJiYgQXJyYXkuaXNBcnJheShuZXcgU2V0KCkua2V5cyk7XG4gICAgaWYgKGlzR29vZ2xlVHJhbnNsYXRlKSB7XG4gICAgICAvLyBzcGVjaWFsLWNhc2UgZm9yY2UgcmVtb3ZhbCBvZiB3aWxkbHkgaW52YWxpZCBTZXQgaW1wbGVtZW50YXRpb24gaW4gR29vZ2xlIFRyYW5zbGF0ZSBpZnJhbWVzXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9lczYtc2hpbS9pc3N1ZXMvNDM4IC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9samhhcmIvc3RhdHVzLzg0OTMzNTU3MzExNDM2MzkwNFxuICAgICAgZ2xvYmFscy5TZXQgPSBjb2xsZWN0aW9uU2hpbXMuU2V0O1xuICAgIH1cbiAgICBpZiAoZ2xvYmFscy5NYXAgfHwgZ2xvYmFscy5TZXQpIHtcbiAgICAgIC8vIFNhZmFyaSA4LCBmb3IgZXhhbXBsZSwgZG9lc24ndCBhY2NlcHQgYW4gaXRlcmFibGUuXG4gICAgICB2YXIgbWFwQWNjZXB0c0FyZ3VtZW50cyA9IHZhbHVlT3JGYWxzZUlmVGhyb3dzKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXAoW1sxLCAyXV0pLmdldCgxKSA9PT0gMjsgfSk7XG4gICAgICBpZiAoIW1hcEFjY2VwdHNBcmd1bWVudHMpIHtcbiAgICAgICAgZ2xvYmFscy5NYXAgPSBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnN0cnVjdG9yIE1hcCByZXF1aXJlcyBcIm5ld1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBtID0gbmV3IE9yaWdNYXAoKTtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFkZEl0ZXJhYmxlVG9NYXAoTWFwLCBtLCBhcmd1bWVudHNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgbS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YobSwgZ2xvYmFscy5NYXAucHJvdG90eXBlKTtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfTtcbiAgICAgICAgZ2xvYmFscy5NYXAucHJvdG90eXBlID0gY3JlYXRlKE9yaWdNYXAucHJvdG90eXBlKTtcbiAgICAgICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFscy5NYXAucHJvdG90eXBlLCAnY29uc3RydWN0b3InLCBnbG9iYWxzLk1hcCwgdHJ1ZSk7XG4gICAgICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoZ2xvYmFscy5NYXAsIE9yaWdNYXApO1xuICAgICAgfVxuICAgICAgdmFyIHRlc3RNYXAgPSBuZXcgTWFwKCk7XG4gICAgICB2YXIgbWFwVXNlc1NhbWVWYWx1ZVplcm8gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDaHJvbWUgMzgtNDIsIG5vZGUgMC4xMS8wLjEyLCBpb2pzIDEvMiBhbHNvIGhhdmUgYSBidWcgd2hlbiB0aGUgTWFwIGhhcyBhIHNpemUgPiA0XG4gICAgICAgIHZhciBtID0gbmV3IE1hcChbWzEsIDBdLCBbMiwgMF0sIFszLCAwXSwgWzQsIDBdXSk7XG4gICAgICAgIG0uc2V0KC0wLCBtKTtcbiAgICAgICAgcmV0dXJuIG0uZ2V0KDApID09PSBtICYmIG0uZ2V0KC0wKSA9PT0gbSAmJiBtLmhhcygwKSAmJiBtLmhhcygtMCk7XG4gICAgICB9KCkpO1xuICAgICAgdmFyIG1hcFN1cHBvcnRzQ2hhaW5pbmcgPSB0ZXN0TWFwLnNldCgxLCAyKSA9PT0gdGVzdE1hcDtcbiAgICAgIGlmICghbWFwVXNlc1NhbWVWYWx1ZVplcm8gfHwgIW1hcFN1cHBvcnRzQ2hhaW5pbmcpIHtcbiAgICAgICAgb3ZlcnJpZGVOYXRpdmUoTWFwLnByb3RvdHlwZSwgJ3NldCcsIGZ1bmN0aW9uIHNldChrLCB2KSB7XG4gICAgICAgICAgX2NhbGwob3JpZ01hcFNldCwgdGhpcywgayA9PT0gMCA/IDAgOiBrLCB2KTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIW1hcFVzZXNTYW1lVmFsdWVaZXJvKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXMoTWFwLnByb3RvdHlwZSwge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KGspIHtcbiAgICAgICAgICAgIHJldHVybiBfY2FsbChvcmlnTWFwR2V0LCB0aGlzLCBrID09PSAwID8gMCA6IGspO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoaykge1xuICAgICAgICAgICAgcmV0dXJuIF9jYWxsKG9yaWdNYXBIYXMsIHRoaXMsIGsgPT09IDAgPyAwIDogayk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgVmFsdWUucHJlc2VydmVUb1N0cmluZyhNYXAucHJvdG90eXBlLmdldCwgb3JpZ01hcEdldCk7XG4gICAgICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoTWFwLnByb3RvdHlwZS5oYXMsIG9yaWdNYXBIYXMpO1xuICAgICAgfVxuICAgICAgdmFyIHRlc3RTZXQgPSBuZXcgU2V0KCk7XG4gICAgICB2YXIgc2V0VXNlc1NhbWVWYWx1ZVplcm8gPSBTZXQucHJvdG90eXBlWydkZWxldGUnXSAmJiBTZXQucHJvdG90eXBlLmFkZCAmJiBTZXQucHJvdG90eXBlLmhhcyAmJiAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgc1snZGVsZXRlJ10oMCk7XG4gICAgICAgIHMuYWRkKC0wKTtcbiAgICAgICAgcmV0dXJuICFzLmhhcygwKTtcbiAgICAgIH0odGVzdFNldCkpO1xuICAgICAgdmFyIHNldFN1cHBvcnRzQ2hhaW5pbmcgPSB0ZXN0U2V0LmFkZCgxKSA9PT0gdGVzdFNldDtcbiAgICAgIGlmICghc2V0VXNlc1NhbWVWYWx1ZVplcm8gfHwgIXNldFN1cHBvcnRzQ2hhaW5pbmcpIHtcbiAgICAgICAgdmFyIG9yaWdTZXRBZGQgPSBTZXQucHJvdG90eXBlLmFkZDtcbiAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQodikge1xuICAgICAgICAgIF9jYWxsKG9yaWdTZXRBZGQsIHRoaXMsIHYgPT09IDAgPyAwIDogdik7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoU2V0LnByb3RvdHlwZS5hZGQsIG9yaWdTZXRBZGQpO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXRVc2VzU2FtZVZhbHVlWmVybykge1xuICAgICAgICB2YXIgb3JpZ1NldEhhcyA9IFNldC5wcm90b3R5cGUuaGFzO1xuICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyh2KSB7XG4gICAgICAgICAgcmV0dXJuIF9jYWxsKG9yaWdTZXRIYXMsIHRoaXMsIHYgPT09IDAgPyAwIDogdik7XG4gICAgICAgIH07XG4gICAgICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoU2V0LnByb3RvdHlwZS5oYXMsIG9yaWdTZXRIYXMpO1xuICAgICAgICB2YXIgb3JpZ1NldERlbCA9IFNldC5wcm90b3R5cGVbJ2RlbGV0ZSddO1xuICAgICAgICBTZXQucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uIFNldERlbGV0ZSh2KSB7XG4gICAgICAgICAgcmV0dXJuIF9jYWxsKG9yaWdTZXREZWwsIHRoaXMsIHYgPT09IDAgPyAwIDogdik7XG4gICAgICAgIH07XG4gICAgICAgIFZhbHVlLnByZXNlcnZlVG9TdHJpbmcoU2V0LnByb3RvdHlwZVsnZGVsZXRlJ10sIG9yaWdTZXREZWwpO1xuICAgICAgfVxuICAgICAgdmFyIG1hcFN1cHBvcnRzU3ViY2xhc3NpbmcgPSBzdXBwb3J0c1N1YmNsYXNzaW5nKGdsb2JhbHMuTWFwLCBmdW5jdGlvbiAoTSkge1xuICAgICAgICB2YXIgbSA9IG5ldyBNKFtdKTtcbiAgICAgICAgLy8gRmlyZWZveCAzMiBpcyBvayB3aXRoIHRoZSBpbnN0YW50aWF0aW5nIHRoZSBzdWJjbGFzcyBidXQgd2lsbFxuICAgICAgICAvLyB0aHJvdyB3aGVuIHRoZSBtYXAgaXMgdXNlZC5cbiAgICAgICAgbS5zZXQoNDIsIDQyKTtcbiAgICAgICAgcmV0dXJuIG0gaW5zdGFuY2VvZiBNO1xuICAgICAgfSk7XG4gICAgICAvLyB3aXRob3V0IE9iamVjdC5zZXRQcm90b3R5cGVPZiwgc3ViY2xhc3NpbmcgaXMgbm90IHBvc3NpYmxlXG4gICAgICB2YXIgbWFwRmFpbHNUb1N1cHBvcnRTdWJjbGFzc2luZyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiAmJiAhbWFwU3VwcG9ydHNTdWJjbGFzc2luZztcbiAgICAgIHZhciBtYXBSZXF1aXJlc05ldyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICEoZ2xvYmFscy5NYXAoKSBpbnN0YW5jZW9mIGdsb2JhbHMuTWFwKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgVHlwZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9KCkpO1xuICAgICAgaWYgKGdsb2JhbHMuTWFwLmxlbmd0aCAhPT0gMCB8fCBtYXBGYWlsc1RvU3VwcG9ydFN1YmNsYXNzaW5nIHx8ICFtYXBSZXF1aXJlc05ldykge1xuICAgICAgICBnbG9iYWxzLk1hcCA9IGZ1bmN0aW9uIE1hcCgpIHtcbiAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29uc3RydWN0b3IgTWFwIHJlcXVpcmVzIFwibmV3XCInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG0gPSBuZXcgT3JpZ01hcCgpO1xuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWRkSXRlcmFibGVUb01hcChNYXAsIG0sIGFyZ3VtZW50c1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbGV0ZSBtLmNvbnN0cnVjdG9yO1xuICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihtLCBNYXAucHJvdG90eXBlKTtcbiAgICAgICAgICByZXR1cm4gbTtcbiAgICAgICAgfTtcbiAgICAgICAgZ2xvYmFscy5NYXAucHJvdG90eXBlID0gT3JpZ01hcC5wcm90b3R5cGU7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbHMuTWFwLnByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgZ2xvYmFscy5NYXAsIHRydWUpO1xuICAgICAgICBWYWx1ZS5wcmVzZXJ2ZVRvU3RyaW5nKGdsb2JhbHMuTWFwLCBPcmlnTWFwKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXRTdXBwb3J0c1N1YmNsYXNzaW5nID0gc3VwcG9ydHNTdWJjbGFzc2luZyhnbG9iYWxzLlNldCwgZnVuY3Rpb24gKFMpIHtcbiAgICAgICAgdmFyIHMgPSBuZXcgUyhbXSk7XG4gICAgICAgIHMuYWRkKDQyLCA0Mik7XG4gICAgICAgIHJldHVybiBzIGluc3RhbmNlb2YgUztcbiAgICAgIH0pO1xuICAgICAgLy8gd2l0aG91dCBPYmplY3Quc2V0UHJvdG90eXBlT2YsIHN1YmNsYXNzaW5nIGlzIG5vdCBwb3NzaWJsZVxuICAgICAgdmFyIHNldEZhaWxzVG9TdXBwb3J0U3ViY2xhc3NpbmcgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgJiYgIXNldFN1cHBvcnRzU3ViY2xhc3Npbmc7XG4gICAgICB2YXIgc2V0UmVxdWlyZXNOZXcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAhKGdsb2JhbHMuU2V0KCkgaW5zdGFuY2VvZiBnbG9iYWxzLlNldCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIFR5cGVFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSgpKTtcbiAgICAgIGlmIChnbG9iYWxzLlNldC5sZW5ndGggIT09IDAgfHwgc2V0RmFpbHNUb1N1cHBvcnRTdWJjbGFzc2luZyB8fCAhc2V0UmVxdWlyZXNOZXcpIHtcbiAgICAgICAgdmFyIE9yaWdTZXQgPSBnbG9iYWxzLlNldDtcbiAgICAgICAgZ2xvYmFscy5TZXQgPSBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnN0cnVjdG9yIFNldCByZXF1aXJlcyBcIm5ld1wiJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBzID0gbmV3IE9yaWdTZXQoKTtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFkZEl0ZXJhYmxlVG9TZXQoU2V0LCBzLCBhcmd1bWVudHNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWxldGUgcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocywgU2V0LnByb3RvdHlwZSk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH07XG4gICAgICAgIGdsb2JhbHMuU2V0LnByb3RvdHlwZSA9IE9yaWdTZXQucHJvdG90eXBlO1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxzLlNldC5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIGdsb2JhbHMuU2V0LCB0cnVlKTtcbiAgICAgICAgVmFsdWUucHJlc2VydmVUb1N0cmluZyhnbG9iYWxzLlNldCwgT3JpZ1NldCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3TWFwID0gbmV3IGdsb2JhbHMuTWFwKCk7XG4gICAgICB2YXIgbWFwSXRlcmF0aW9uVGhyb3dzU3RvcEl0ZXJhdG9yID0gIXZhbHVlT3JGYWxzZUlmVGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ld01hcC5rZXlzKCkubmV4dCgpLmRvbmU7XG4gICAgICB9KTtcbiAgICAgIC8qXG4gICAgICAgIC0gSW4gRmlyZWZveCA8IDIzLCBNYXAjc2l6ZSBpcyBhIGZ1bmN0aW9uLlxuICAgICAgICAtIEluIGFsbCBjdXJyZW50IEZpcmVmb3gsIFNldCNlbnRyaWVzL2tleXMvdmFsdWVzICYgTWFwI2NsZWFyIGRvIG5vdCBleGlzdFxuICAgICAgICAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg2OTk5NlxuICAgICAgICAtIEluIEZpcmVmb3ggMjQsIE1hcCBhbmQgU2V0IGRvIG5vdCBpbXBsZW1lbnQgZm9yRWFjaFxuICAgICAgICAtIEluIEZpcmVmb3ggMjUgYXQgbGVhc3QsIE1hcCBhbmQgU2V0IGFyZSBjYWxsYWJsZSB3aXRob3V0IFwibmV3XCJcbiAgICAgICovXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBnbG9iYWxzLk1hcC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgbmV3IGdsb2JhbHMuU2V0KCkuc2l6ZSAhPT0gMCB8fFxuICAgICAgICBuZXdNYXAuc2l6ZSAhPT0gMCB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFscy5NYXAucHJvdG90eXBlLmtleXMgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgdHlwZW9mIGdsb2JhbHMuU2V0LnByb3RvdHlwZS5rZXlzICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiBnbG9iYWxzLk1hcC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2YgZ2xvYmFscy5TZXQucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgaXNDYWxsYWJsZVdpdGhvdXROZXcoZ2xvYmFscy5NYXApIHx8XG4gICAgICAgIGlzQ2FsbGFibGVXaXRob3V0TmV3KGdsb2JhbHMuU2V0KSB8fFxuICAgICAgICB0eXBlb2YgbmV3TWFwLmtleXMoKS5uZXh0ICE9PSAnZnVuY3Rpb24nIHx8IC8vIFNhZmFyaSA4XG4gICAgICAgIG1hcEl0ZXJhdGlvblRocm93c1N0b3BJdGVyYXRvciB8fCAvLyBGaXJlZm94IDI1XG4gICAgICAgICFtYXBTdXBwb3J0c1N1YmNsYXNzaW5nXG4gICAgICApIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyhnbG9iYWxzLCB7XG4gICAgICAgICAgTWFwOiBjb2xsZWN0aW9uU2hpbXMuTWFwLFxuICAgICAgICAgIFNldDogY29sbGVjdGlvblNoaW1zLlNldFxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGdsb2JhbHMuU2V0LnByb3RvdHlwZS5rZXlzICE9PSBnbG9iYWxzLlNldC5wcm90b3R5cGUudmFsdWVzKSB7XG4gICAgICAgIC8vIEZpeGVkIGluIFdlYktpdCB3aXRoIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDQxOTBcbiAgICAgICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFscy5TZXQucHJvdG90eXBlLCAna2V5cycsIGdsb2JhbHMuU2V0LnByb3RvdHlwZS52YWx1ZXMsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaGltIGluY29tcGxldGUgaXRlcmF0b3IgaW1wbGVtZW50YXRpb25zLlxuICAgICAgYWRkSXRlcmF0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKChuZXcgZ2xvYmFscy5NYXAoKSkua2V5cygpKSk7XG4gICAgICBhZGRJdGVyYXRvcihPYmplY3QuZ2V0UHJvdG90eXBlT2YoKG5ldyBnbG9iYWxzLlNldCgpKS5rZXlzKCkpKTtcblxuICAgICAgaWYgKGZ1bmN0aW9uc0hhdmVOYW1lcyAmJiBnbG9iYWxzLlNldC5wcm90b3R5cGUuaGFzLm5hbWUgIT09ICdoYXMnKSB7XG4gICAgICAgIC8vIE1pY3Jvc29mdCBFZGdlIHYwLjExLjEwMDc0LjAgaXMgbWlzc2luZyBhIG5hbWUgb24gU2V0I2hhc1xuICAgICAgICB2YXIgYW5vbnltb3VzU2V0SGFzID0gZ2xvYmFscy5TZXQucHJvdG90eXBlLmhhcztcbiAgICAgICAgb3ZlcnJpZGVOYXRpdmUoZ2xvYmFscy5TZXQucHJvdG90eXBlLCAnaGFzJywgZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICAgIHJldHVybiBfY2FsbChhbm9ueW1vdXNTZXRIYXMsIHRoaXMsIGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKGdsb2JhbHMsIGNvbGxlY3Rpb25TaGltcyk7XG4gICAgYWRkRGVmYXVsdFNwZWNpZXMoZ2xvYmFscy5NYXApO1xuICAgIGFkZERlZmF1bHRTcGVjaWVzKGdsb2JhbHMuU2V0KTtcbiAgfVxuXG4gIHZhciB0aHJvd1VubGVzc1RhcmdldElzT2JqZWN0ID0gZnVuY3Rpb24gdGhyb3dVbmxlc3NUYXJnZXRJc09iamVjdCh0YXJnZXQpIHtcbiAgICBpZiAoIUVTLlR5cGVJc09iamVjdCh0YXJnZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gU29tZSBSZWZsZWN0IG1ldGhvZHMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhc1xuICAvLyB0aG9zZSBvbiB0aGUgT2JqZWN0IGdsb2JhbCwgZXhjZXB0IHRoYXQgYSBUeXBlRXJyb3IgaXMgdGhyb3duIGlmXG4gIC8vIHRhcmdldCBpc24ndCBhbiBvYmplY3QuIEFzIHdlbGwgYXMgcmV0dXJuaW5nIGEgYm9vbGVhbiBpbmRpY2F0aW5nXG4gIC8vIHRoZSBzdWNjZXNzIG9mIHRoZSBvcGVyYXRpb24uXG4gIHZhciBSZWZsZWN0U2hpbXMgPSB7XG4gICAgLy8gQXBwbHkgbWV0aG9kIGluIGEgZnVuY3Rpb25hbCBmb3JtLlxuICAgIGFwcGx5OiBmdW5jdGlvbiBhcHBseSgpIHtcbiAgICAgIHJldHVybiBFUy5DYWxsKEVTLkNhbGwsIG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIC8vIE5ldyBvcGVyYXRvciBpbiBhIGZ1bmN0aW9uYWwgZm9ybS5cbiAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChjb25zdHJ1Y3RvciwgYXJncykge1xuICAgICAgaWYgKCFFUy5Jc0NvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29uc3RydWN0b3IuJyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiBjb25zdHJ1Y3RvcjtcbiAgICAgIGlmICghRVMuSXNDb25zdHJ1Y3RvcihuZXdUYXJnZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25ldy50YXJnZXQgbXVzdCBiZSBhIGNvbnN0cnVjdG9yLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEVTLkNvbnN0cnVjdChjb25zdHJ1Y3RvciwgYXJncywgbmV3VGFyZ2V0LCAnaW50ZXJuYWwnKTtcbiAgICB9LFxuXG4gICAgLy8gV2hlbiBkZWxldGluZyBhIG5vbi1leGlzdGVudCBvciBjb25maWd1cmFibGUgcHJvcGVydHksXG4gICAgLy8gdHJ1ZSBpcyByZXR1cm5lZC5cbiAgICAvLyBXaGVuIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGEgbm9uLWNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSxcbiAgICAvLyBpdCB3aWxsIHJldHVybiBmYWxzZS5cbiAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24gZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3QodGFyZ2V0KTtcbiAgICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdpbGwgcmV0dXJuIHRydWUuXG4gICAgICByZXR1cm4gZGVsZXRlIHRhcmdldFtrZXldO1xuICAgIH0sXG5cbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyh0YXJnZXQsIGtleSkge1xuICAgICAgdGhyb3dVbmxlc3NUYXJnZXRJc09iamVjdCh0YXJnZXQpO1xuICAgICAgcmV0dXJuIGtleSBpbiB0YXJnZXQ7XG4gICAgfVxuICB9O1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgIE9iamVjdC5hc3NpZ24oUmVmbGVjdFNoaW1zLCB7XG4gICAgICAvLyBCYXNpY2FsbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBpbnRlcm5hbCBbW093blByb3BlcnR5S2V5c11dLlxuICAgICAgLy8gQ29uY2F0ZW5hdGluZyBwcm9wZXJ0eU5hbWVzIGFuZCBwcm9wZXJ0eVN5bWJvbHMgc2hvdWxkIGRvIHRoZSB0cmljay5cbiAgICAgIC8vIFRoaXMgc2hvdWxkIGNvbnRpbnVlIHRvIHdvcmsgdG9nZXRoZXIgd2l0aCBhIFN5bWJvbCBzaGltXG4gICAgICAvLyB3aGljaCBvdmVycmlkZXMgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgYW5kIGltcGxlbWVudHNcbiAgICAgIC8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMuXG4gICAgICBvd25LZXlzOiBmdW5jdGlvbiBvd25LZXlzKHRhcmdldCkge1xuICAgICAgICB0aHJvd1VubGVzc1RhcmdldElzT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KTtcblxuICAgICAgICBpZiAoRVMuSXNDYWxsYWJsZShPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSkge1xuICAgICAgICAgIF9wdXNoQXBwbHkoa2V5cywgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGNhbGxBbmRDYXRjaEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIENvbnZlcnRFeGNlcHRpb25Ub0Jvb2xlYW4oZnVuYykge1xuICAgIHJldHVybiAhdGhyb3dzRXJyb3IoZnVuYyk7XG4gIH07XG5cbiAgaWYgKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykge1xuICAgIE9iamVjdC5hc3NpZ24oUmVmbGVjdFNoaW1zLCB7XG4gICAgICBpc0V4dGVuc2libGU6IGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZSh0YXJnZXQpIHtcbiAgICAgICAgdGhyb3dVbmxlc3NUYXJnZXRJc09iamVjdCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpO1xuICAgICAgfSxcbiAgICAgIHByZXZlbnRFeHRlbnNpb25zOiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpIHtcbiAgICAgICAgdGhyb3dVbmxlc3NUYXJnZXRJc09iamVjdCh0YXJnZXQpO1xuICAgICAgICByZXR1cm4gY2FsbEFuZENhdGNoRXhjZXB0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHN1cHBvcnRzRGVzY3JpcHRvcnMpIHtcbiAgICB2YXIgaW50ZXJuYWxHZXQgPSBmdW5jdGlvbiBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpO1xuXG4gICAgICBpZiAoIWRlc2MpIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuXG4gICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGludGVybmFsR2V0KHBhcmVudCwga2V5LCByZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICgndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gRVMuQ2FsbChkZXNjLmdldCwgcmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH07XG5cbiAgICB2YXIgaW50ZXJuYWxTZXQgPSBmdW5jdGlvbiBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcblxuICAgICAgaWYgKCFkZXNjKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KTtcblxuICAgICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGludGVybmFsU2V0KHBhcmVudCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IHtcbiAgICAgICAgICB2YWx1ZTogdm9pZCAwLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICgndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgaWYgKCFkZXNjLndyaXRhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFFUy5UeXBlSXNPYmplY3QocmVjZWl2ZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4aXN0aW5nRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVjZWl2ZXIsIGtleSk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nRGVzYykge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgICBfY2FsbChkZXNjLnNldCwgcmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbihSZWZsZWN0U2hpbXMsIHtcbiAgICAgIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIGNhbGxBbmRDYXRjaEV4Y2VwdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBTeW50YXggaW4gYSBmdW5jdGlvbmFsIGZvcm0uXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICB0aHJvd1VubGVzc1RhcmdldElzT2JqZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdGFyZ2V0O1xuXG4gICAgICAgIHJldHVybiBpbnRlcm5hbEdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgfSxcblxuICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgdmFyIHJlY2VpdmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgPyBhcmd1bWVudHNbM10gOiB0YXJnZXQ7XG5cbiAgICAgICAgcmV0dXJuIGludGVybmFsU2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZikge1xuICAgIHZhciBvYmplY3REb3RHZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgICBSZWZsZWN0U2hpbXMuZ2V0UHJvdG90eXBlT2YgPSBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3QodGFyZ2V0KTtcbiAgICAgIHJldHVybiBvYmplY3REb3RHZXRQcm90b3R5cGVPZih0YXJnZXQpO1xuICAgIH07XG4gIH1cblxuICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mICYmIFJlZmxlY3RTaGltcy5nZXRQcm90b3R5cGVPZikge1xuICAgIHZhciB3aWxsQ3JlYXRlQ2lyY3VsYXJQcm90b3R5cGUgPSBmdW5jdGlvbiAob2JqZWN0LCBsYXN0UHJvdG8pIHtcbiAgICAgIHZhciBwcm90byA9IGxhc3RQcm90bztcbiAgICAgIHdoaWxlIChwcm90bykge1xuICAgICAgICBpZiAob2JqZWN0ID09PSBwcm90bykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHByb3RvID0gUmVmbGVjdFNoaW1zLmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgT2JqZWN0LmFzc2lnbihSZWZsZWN0U2hpbXMsIHtcbiAgICAgIC8vIFNldHMgdGhlIHByb3RvdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxuICAgICAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihvYmplY3QsIHByb3RvKSB7XG4gICAgICAgIHRocm93VW5sZXNzVGFyZ2V0SXNPYmplY3Qob2JqZWN0KTtcbiAgICAgICAgaWYgKHByb3RvICE9PSBudWxsICYmICFFUy5UeXBlSXNPYmplY3QocHJvdG8pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJvdG8gbXVzdCBiZSBhbiBvYmplY3Qgb3IgbnVsbCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhleSBhbHJlYWR5IGFyZSB0aGUgc2FtZSwgd2UncmUgZG9uZS5cbiAgICAgICAgaWYgKHByb3RvID09PSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbm5vdCBhbHRlciBwcm90b3R5cGUgaWYgb2JqZWN0IG5vdCBleHRlbnNpYmxlLlxuICAgICAgICBpZiAoUmVmbGVjdC5pc0V4dGVuc2libGUgJiYgIVJlZmxlY3QuaXNFeHRlbnNpYmxlKG9iamVjdCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgY3JlYXRlIGEgY2lyY3VsYXIgcHJvdG90eXBlIGNoYWluLlxuICAgICAgICBpZiAod2lsbENyZWF0ZUNpcmN1bGFyUHJvdG90eXBlKG9iamVjdCwgcHJvdG8pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKG9iamVjdCwgcHJvdG8pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHZhciBkZWZpbmVPck92ZXJyaWRlUmVmbGVjdFByb3BlcnR5ID0gZnVuY3Rpb24gKGtleSwgc2hpbSkge1xuICAgIGlmICghRVMuSXNDYWxsYWJsZShnbG9iYWxzLlJlZmxlY3Rba2V5XSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbHMuUmVmbGVjdCwga2V5LCBzaGltKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFjY2VwdHNQcmltaXRpdmVzID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgICBnbG9iYWxzLlJlZmxlY3Rba2V5XSgxKTtcbiAgICAgICAgZ2xvYmFscy5SZWZsZWN0W2tleV0oTmFOKTtcbiAgICAgICAgZ2xvYmFscy5SZWZsZWN0W2tleV0odHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG4gICAgICBpZiAoYWNjZXB0c1ByaW1pdGl2ZXMpIHtcbiAgICAgICAgb3ZlcnJpZGVOYXRpdmUoZ2xvYmFscy5SZWZsZWN0LCBrZXksIHNoaW0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgT2JqZWN0LmtleXMoUmVmbGVjdFNoaW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBkZWZpbmVPck92ZXJyaWRlUmVmbGVjdFByb3BlcnR5KGtleSwgUmVmbGVjdFNoaW1zW2tleV0pO1xuICB9KTtcbiAgdmFyIG9yaWdpbmFsUmVmbGVjdEdldFByb3RvID0gZ2xvYmFscy5SZWZsZWN0LmdldFByb3RvdHlwZU9mO1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzICYmIG9yaWdpbmFsUmVmbGVjdEdldFByb3RvICYmIG9yaWdpbmFsUmVmbGVjdEdldFByb3RvLm5hbWUgIT09ICdnZXRQcm90b3R5cGVPZicpIHtcbiAgICBvdmVycmlkZU5hdGl2ZShnbG9iYWxzLlJlZmxlY3QsICdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKHRhcmdldCkge1xuICAgICAgcmV0dXJuIF9jYWxsKG9yaWdpbmFsUmVmbGVjdEdldFByb3RvLCBnbG9iYWxzLlJlZmxlY3QsIHRhcmdldCk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGdsb2JhbHMuUmVmbGVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgIGlmICh2YWx1ZU9yRmFsc2VJZlRocm93cyhmdW5jdGlvbiAoKSB7XG4gICAgICBnbG9iYWxzLlJlZmxlY3Quc2V0UHJvdG90eXBlT2YoMSwge30pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSkpIHtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKGdsb2JhbHMuUmVmbGVjdCwgJ3NldFByb3RvdHlwZU9mJywgUmVmbGVjdFNoaW1zLnNldFByb3RvdHlwZU9mKTtcbiAgICB9XG4gIH1cbiAgaWYgKGdsb2JhbHMuUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgIGlmICghdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGJhc2ljID0gIWdsb2JhbHMuUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSgxLCAndGVzdCcsIHsgdmFsdWU6IDEgfSk7XG4gICAgICAvLyBcImV4dGVuc2libGVcIiBmYWlscyBvbiBFZGdlIDAuMTJcbiAgICAgIHZhciBleHRlbnNpYmxlID0gdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyAhPT0gJ2Z1bmN0aW9uJyB8fCAhZ2xvYmFscy5SZWZsZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSksICd0ZXN0Jywge30pO1xuICAgICAgcmV0dXJuIGJhc2ljICYmIGV4dGVuc2libGU7XG4gICAgfSkpIHtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKGdsb2JhbHMuUmVmbGVjdCwgJ2RlZmluZVByb3BlcnR5JywgUmVmbGVjdFNoaW1zLmRlZmluZVByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGdsb2JhbHMuUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICBpZiAoIXZhbHVlT3JGYWxzZUlmVGhyb3dzKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24gRigpIHt9O1xuICAgICAgcmV0dXJuIGdsb2JhbHMuUmVmbGVjdC5jb25zdHJ1Y3QoZnVuY3Rpb24gKCkge30sIFtdLCBGKSBpbnN0YW5jZW9mIEY7XG4gICAgfSkpIHtcbiAgICAgIG92ZXJyaWRlTmF0aXZlKGdsb2JhbHMuUmVmbGVjdCwgJ2NvbnN0cnVjdCcsIFJlZmxlY3RTaGltcy5jb25zdHJ1Y3QpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChTdHJpbmcobmV3IERhdGUoTmFOKSkgIT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgdmFyIGRhdGVUb1N0cmluZyA9IERhdGUucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIHZhciBzaGltbWVkRGF0ZVRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgdmFsdWVPZiA9ICt0aGlzO1xuICAgICAgaWYgKHZhbHVlT2YgIT09IHZhbHVlT2YpIHtcbiAgICAgICAgcmV0dXJuICdJbnZhbGlkIERhdGUnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEVTLkNhbGwoZGF0ZVRvU3RyaW5nLCB0aGlzKTtcbiAgICB9O1xuICAgIG92ZXJyaWRlTmF0aXZlKERhdGUucHJvdG90eXBlLCAndG9TdHJpbmcnLCBzaGltbWVkRGF0ZVRvU3RyaW5nKTtcbiAgfVxuXG4gIC8vIEFubmV4IEIgSFRNTCBtZXRob2RzXG4gIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1hZGRpdGlvbmFsLXByb3BlcnRpZXMtb2YtdGhlLXN0cmluZy5wcm90b3R5cGUtb2JqZWN0XG4gIHZhciBzdHJpbmdIVE1Mc2hpbXMgPSB7XG4gICAgYW5jaG9yOiBmdW5jdGlvbiBhbmNob3IobmFtZSkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAnYScsICduYW1lJywgbmFtZSk7IH0sXG4gICAgYmlnOiBmdW5jdGlvbiBiaWcoKSB7IHJldHVybiBFUy5DcmVhdGVIVE1MKHRoaXMsICdiaWcnLCAnJywgJycpOyB9LFxuICAgIGJsaW5rOiBmdW5jdGlvbiBibGluaygpIHsgcmV0dXJuIEVTLkNyZWF0ZUhUTUwodGhpcywgJ2JsaW5rJywgJycsICcnKTsgfSxcbiAgICBib2xkOiBmdW5jdGlvbiBib2xkKCkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAnYicsICcnLCAnJyk7IH0sXG4gICAgZml4ZWQ6IGZ1bmN0aW9uIGZpeGVkKCkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAndHQnLCAnJywgJycpOyB9LFxuICAgIGZvbnRjb2xvcjogZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKSB7IHJldHVybiBFUy5DcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpOyB9LFxuICAgIGZvbnRzaXplOiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7IHJldHVybiBFUy5DcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ3NpemUnLCBzaXplKTsgfSxcbiAgICBpdGFsaWNzOiBmdW5jdGlvbiBpdGFsaWNzKCkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAnaScsICcnLCAnJyk7IH0sXG4gICAgbGluazogZnVuY3Rpb24gbGluayh1cmwpIHsgcmV0dXJuIEVTLkNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnaHJlZicsIHVybCk7IH0sXG4gICAgc21hbGw6IGZ1bmN0aW9uIHNtYWxsKCkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAnc21hbGwnLCAnJywgJycpOyB9LFxuICAgIHN0cmlrZTogZnVuY3Rpb24gc3RyaWtlKCkgeyByZXR1cm4gRVMuQ3JlYXRlSFRNTCh0aGlzLCAnc3RyaWtlJywgJycsICcnKTsgfSxcbiAgICBzdWI6IGZ1bmN0aW9uIHN1YigpIHsgcmV0dXJuIEVTLkNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7IH0sXG4gICAgc3VwOiBmdW5jdGlvbiBzdWIoKSB7IHJldHVybiBFUy5DcmVhdGVIVE1MKHRoaXMsICdzdXAnLCAnJywgJycpOyB9XG4gIH07XG4gIF9mb3JFYWNoKE9iamVjdC5rZXlzKHN0cmluZ0hUTUxzaGltcyksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgbWV0aG9kID0gU3RyaW5nLnByb3RvdHlwZVtrZXldO1xuICAgIHZhciBzaG91bGRPdmVyd3JpdGUgPSBmYWxzZTtcbiAgICBpZiAoRVMuSXNDYWxsYWJsZShtZXRob2QpKSB7XG4gICAgICB2YXIgb3V0cHV0ID0gX2NhbGwobWV0aG9kLCAnJywgJyBcIiAnKTtcbiAgICAgIHZhciBxdW90ZXNDb3VudCA9IF9jb25jYXQoW10sIG91dHB1dC5tYXRjaCgvXCIvZykpLmxlbmd0aDtcbiAgICAgIHNob3VsZE92ZXJ3cml0ZSA9IG91dHB1dCAhPT0gb3V0cHV0LnRvTG93ZXJDYXNlKCkgfHwgcXVvdGVzQ291bnQgPiAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRPdmVyd3JpdGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkT3ZlcndyaXRlKSB7XG4gICAgICBvdmVycmlkZU5hdGl2ZShTdHJpbmcucHJvdG90eXBlLCBrZXksIHN0cmluZ0hUTUxzaGltc1trZXldKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBKU09Oc3RyaW5naWZpZXNTeW1ib2xzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBNaWNyb3NvZnQgRWRnZSB2MC4xMiBzdHJpbmdpZmllcyBTeW1ib2xzIGluY29ycmVjdGx5XG4gICAgaWYgKCFoYXNTeW1ib2xzKSB7IHJldHVybiBmYWxzZTsgfSAvLyBTeW1ib2xzIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgdmFyIHN0cmluZ2lmeSA9IHR5cGVvZiBKU09OID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgSlNPTi5zdHJpbmdpZnkgPT09ICdmdW5jdGlvbicgPyBKU09OLnN0cmluZ2lmeSA6IG51bGw7XG4gICAgaWYgKCFzdHJpbmdpZnkpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIEpTT04uc3RyaW5naWZ5IGlzIG5vdCBzdXBwb3J0ZWRcbiAgICBpZiAodHlwZW9mIHN0cmluZ2lmeShTeW1ib2woKSkgIT09ICd1bmRlZmluZWQnKSB7IHJldHVybiB0cnVlOyB9IC8vIFN5bWJvbHMgc2hvdWxkIGJlY29tZSBgdW5kZWZpbmVkYFxuICAgIGlmIChzdHJpbmdpZnkoW1N5bWJvbCgpXSkgIT09ICdbbnVsbF0nKSB7IHJldHVybiB0cnVlOyB9IC8vIFN5bWJvbHMgaW4gYXJyYXlzIHNob3VsZCBiZWNvbWUgYG51bGxgXG4gICAgdmFyIG9iaiA9IHsgYTogU3ltYm9sKCkgfTtcbiAgICBvYmpbU3ltYm9sKCldID0gdHJ1ZTtcbiAgICBpZiAoc3RyaW5naWZ5KG9iaikgIT09ICd7fScpIHsgcmV0dXJuIHRydWU7IH0gLy8gU3ltYm9sLXZhbHVlZCBrZXlzICphbmQqIFN5bWJvbC12YWx1ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgb21pdHRlZFxuICAgIHJldHVybiBmYWxzZTtcbiAgfSgpKTtcbiAgdmFyIEpTT05zdHJpbmdpZnlBY2NlcHRzT2JqZWN0U3ltYm9sID0gdmFsdWVPckZhbHNlSWZUaHJvd3MoZnVuY3Rpb24gKCkge1xuICAgIC8vIENocm9tZSA0NSB0aHJvd3Mgb24gc3RyaW5naWZ5aW5nIG9iamVjdCBzeW1ib2xzXG4gICAgaWYgKCFoYXNTeW1ib2xzKSB7IHJldHVybiB0cnVlOyB9IC8vIFN5bWJvbHMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoT2JqZWN0KFN5bWJvbCgpKSkgPT09ICd7fScgJiYgSlNPTi5zdHJpbmdpZnkoW09iamVjdChTeW1ib2woKSldKSA9PT0gJ1t7fV0nO1xuICB9KTtcbiAgaWYgKEpTT05zdHJpbmdpZmllc1N5bWJvbHMgfHwgIUpTT05zdHJpbmdpZnlBY2NlcHRzT2JqZWN0U3ltYm9sKSB7XG4gICAgdmFyIG9yaWdTdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcbiAgICBvdmVycmlkZU5hdGl2ZShKU09OLCAnc3RyaW5naWZ5JywgZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykgeyByZXR1cm47IH1cbiAgICAgIHZhciByZXBsYWNlcjtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXBsYWNlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIH1cbiAgICAgIHZhciBhcmdzID0gW3ZhbHVlXTtcbiAgICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHtcbiAgICAgICAgdmFyIHJlcGxhY2VGbiA9IEVTLklzQ2FsbGFibGUocmVwbGFjZXIpID8gcmVwbGFjZXIgOiBudWxsO1xuICAgICAgICB2YXIgd3JhcHBlZFJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsKSB7XG4gICAgICAgICAgdmFyIHBhcnNlZFZhbHVlID0gcmVwbGFjZUZuID8gX2NhbGwocmVwbGFjZUZuLCB0aGlzLCBrZXksIHZhbCkgOiB2YWw7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWRWYWx1ZSAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIGlmIChUeXBlLnN5bWJvbChwYXJzZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFzc2lnblRvKHt9KShwYXJzZWRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhcmdzLnB1c2god3JhcHBlZFJlcGxhY2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNyZWF0ZSB3cmFwcGVkIHJlcGxhY2VyIHRoYXQgaGFuZGxlcyBhbiBhcnJheSByZXBsYWNlcj9cbiAgICAgICAgYXJncy5wdXNoKHJlcGxhY2VyKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuICAgICAgICBhcmdzLnB1c2goYXJndW1lbnRzWzJdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnU3RyaW5naWZ5LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdsb2JhbHM7XG59KSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IHJlcXVpcmUoJ2Z1bmN0aW9ucy1oYXZlLW5hbWVzJykoKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBUeXBlRXJyID0gVHlwZUVycm9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1OYW1lKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG5cdFx0cmV0dXJuIHBvbHlmaWxsO1xuXHR9XG5cdGlmICghc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyKCdTaGltbWluZyBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSBzdXBwb3J0IHJlcXVpcmVzIEVTNSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHN1cHBvcnQuJyk7XG5cdH1cblx0dmFyIGZ1bmN0aW9uUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG5cdGRlZmluZVByb3BlcnR5KGZ1bmN0aW9uUHJvdG8sICduYW1lJywge1xuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHZhciBuYW1lID0gcG9seWZpbGwuY2FsbCh0aGlzKTtcblx0XHRcdGlmICh0aGlzICE9PSBmdW5jdGlvblByb3RvKSB7XG5cdFx0XHRcdGRlZmluZVByb3BlcnR5KHRoaXMsICduYW1lJywge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRcdFx0XHR2YWx1ZTogbmFtZSxcblx0XHRcdFx0XHR3cml0YWJsZTogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIga2V5c1NoaW07XG5pZiAoIU9iamVjdC5rZXlzKSB7XG5cdC8vIG1vZGlmaWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltXG5cdHZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXHR2YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXHR2YXIgaXNBcmdzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdsb2JhbC1yZXF1aXJlXG5cdHZhciBpc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHR2YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtZXJhYmxlLmNhbGwoeyB0b1N0cmluZzogbnVsbCB9LCAndG9TdHJpbmcnKTtcblx0dmFyIGhhc1Byb3RvRW51bUJ1ZyA9IGlzRW51bWVyYWJsZS5jYWxsKGZ1bmN0aW9uICgpIHt9LCAncHJvdG90eXBlJyk7XG5cdHZhciBkb250RW51bXMgPSBbXG5cdFx0J3RvU3RyaW5nJyxcblx0XHQndG9Mb2NhbGVTdHJpbmcnLFxuXHRcdCd2YWx1ZU9mJyxcblx0XHQnaGFzT3duUHJvcGVydHknLFxuXHRcdCdpc1Byb3RvdHlwZU9mJyxcblx0XHQncHJvcGVydHlJc0VudW1lcmFibGUnLFxuXHRcdCdjb25zdHJ1Y3Rvcidcblx0XTtcblx0dmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gKG8pIHtcblx0XHR2YXIgY3RvciA9IG8uY29uc3RydWN0b3I7XG5cdFx0cmV0dXJuIGN0b3IgJiYgY3Rvci5wcm90b3R5cGUgPT09IG87XG5cdH07XG5cdHZhciBleGNsdWRlZEtleXMgPSB7XG5cdFx0JGFwcGxpY2F0aW9uQ2FjaGU6IHRydWUsXG5cdFx0JGNvbnNvbGU6IHRydWUsXG5cdFx0JGV4dGVybmFsOiB0cnVlLFxuXHRcdCRmcmFtZTogdHJ1ZSxcblx0XHQkZnJhbWVFbGVtZW50OiB0cnVlLFxuXHRcdCRmcmFtZXM6IHRydWUsXG5cdFx0JGlubmVySGVpZ2h0OiB0cnVlLFxuXHRcdCRpbm5lcldpZHRoOiB0cnVlLFxuXHRcdCRvbm1vemZ1bGxzY3JlZW5jaGFuZ2U6IHRydWUsXG5cdFx0JG9ubW96ZnVsbHNjcmVlbmVycm9yOiB0cnVlLFxuXHRcdCRvdXRlckhlaWdodDogdHJ1ZSxcblx0XHQkb3V0ZXJXaWR0aDogdHJ1ZSxcblx0XHQkcGFnZVhPZmZzZXQ6IHRydWUsXG5cdFx0JHBhZ2VZT2Zmc2V0OiB0cnVlLFxuXHRcdCRwYXJlbnQ6IHRydWUsXG5cdFx0JHNjcm9sbExlZnQ6IHRydWUsXG5cdFx0JHNjcm9sbFRvcDogdHJ1ZSxcblx0XHQkc2Nyb2xsWDogdHJ1ZSxcblx0XHQkc2Nyb2xsWTogdHJ1ZSxcblx0XHQkc2VsZjogdHJ1ZSxcblx0XHQkd2Via2l0SW5kZXhlZERCOiB0cnVlLFxuXHRcdCR3ZWJraXRTdG9yYWdlSW5mbzogdHJ1ZSxcblx0XHQkd2luZG93OiB0cnVlXG5cdH07XG5cdHZhciBoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcgPSAoZnVuY3Rpb24gKCkge1xuXHRcdC8qIGdsb2JhbCB3aW5kb3cgKi9cblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdFx0Zm9yICh2YXIgayBpbiB3aW5kb3cpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIGhhcy5jYWxsKHdpbmRvdywgaykgJiYgd2luZG93W2tdICE9PSBudWxsICYmIHR5cGVvZiB3aW5kb3dba10gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKHdpbmRvd1trXSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0oKSk7XG5cdHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZUlmTm90QnVnZ3kgPSBmdW5jdGlvbiAobykge1xuXHRcdC8qIGdsb2JhbCB3aW5kb3cgKi9cblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1Zykge1xuXHRcdFx0cmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH07XG5cblx0a2V5c1NoaW0gPSBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuXHRcdHZhciBpc09iamVjdCA9IG9iamVjdCAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jztcblx0XHR2YXIgaXNGdW5jdGlvbiA9IHRvU3RyLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblx0XHR2YXIgaXNBcmd1bWVudHMgPSBpc0FyZ3Mob2JqZWN0KTtcblx0XHR2YXIgaXNTdHJpbmcgPSBpc09iamVjdCAmJiB0b1N0ci5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuXHRcdHZhciB0aGVLZXlzID0gW107XG5cblx0XHRpZiAoIWlzT2JqZWN0ICYmICFpc0Z1bmN0aW9uICYmICFpc0FyZ3VtZW50cykge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuXHRcdH1cblxuXHRcdHZhciBza2lwUHJvdG8gPSBoYXNQcm90b0VudW1CdWcgJiYgaXNGdW5jdGlvbjtcblx0XHRpZiAoaXNTdHJpbmcgJiYgb2JqZWN0Lmxlbmd0aCA+IDAgJiYgIWhhcy5jYWxsKG9iamVjdCwgMCkpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgKytpKSB7XG5cdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcoaSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpc0FyZ3VtZW50cyAmJiBvYmplY3QubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBvYmplY3QubGVuZ3RoOyArK2opIHtcblx0XHRcdFx0dGhlS2V5cy5wdXNoKFN0cmluZyhqKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAodmFyIG5hbWUgaW4gb2JqZWN0KSB7XG5cdFx0XHRcdGlmICghKHNraXBQcm90byAmJiBuYW1lID09PSAncHJvdG90eXBlJykgJiYgaGFzLmNhbGwob2JqZWN0LCBuYW1lKSkge1xuXHRcdFx0XHRcdHRoZUtleXMucHVzaChTdHJpbmcobmFtZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0RvbnRFbnVtQnVnKSB7XG5cdFx0XHR2YXIgc2tpcENvbnN0cnVjdG9yID0gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5KG9iamVjdCk7XG5cblx0XHRcdGZvciAodmFyIGsgPSAwOyBrIDwgZG9udEVudW1zLmxlbmd0aDsgKytrKSB7XG5cdFx0XHRcdGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bXNba10gPT09ICdjb25zdHJ1Y3RvcicpICYmIGhhcy5jYWxsKG9iamVjdCwgZG9udEVudW1zW2tdKSkge1xuXHRcdFx0XHRcdHRoZUtleXMucHVzaChkb250RW51bXNba10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0aGVLZXlzO1xuXHR9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBrZXlzU2hpbTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNDYWxsYWJsZSA9IHJlcXVpcmUoJ2lzLWNhbGxhYmxlJyk7XG52YXIgZnVuY3Rpb25zSGF2ZU5hbWVzID0gcmVxdWlyZSgnZnVuY3Rpb25zLWhhdmUtbmFtZXMnKSgpO1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcpO1xudmFyIHN0cmluZ01hdGNoID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUubWF0Y2gpO1xuXG52YXIgY2xhc3NSZWdleCA9IC9eY2xhc3MgLztcblxudmFyIGlzQ2xhc3MgPSBmdW5jdGlvbiBpc0NsYXNzQ29uc3RydWN0b3IoZm4pIHtcblx0aWYgKGlzQ2FsbGFibGUoZm4pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dHJ5IHtcblx0XHR2YXIgbWF0Y2ggPSBzdHJpbmdNYXRjaChmdW5jdGlvblRvU3RyaW5nKGZuKSwgY2xhc3NSZWdleCk7XG5cdFx0cmV0dXJuICEhbWF0Y2g7XG5cdH0gY2F0Y2ggKGUpIHt9XG5cdHJldHVybiBmYWxzZTtcbn07XG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteKFxcc10qKVxccyovO1xuXG52YXIgZnVuY3Rpb25Qcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXROYW1lKCkge1xuXHRpZiAoIWlzQ2xhc3ModGhpcykgJiYgIWlzQ2FsbGFibGUodGhpcykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUubmFtZSBzaGFtIGdldHRlciBjYWxsZWQgb24gbm9uLWZ1bmN0aW9uJyk7XG5cdH1cblx0aWYgKGZ1bmN0aW9uc0hhdmVOYW1lcykge1xuXHRcdHJldHVybiB0aGlzLm5hbWU7XG5cdH1cblx0aWYgKHRoaXMgPT09IGZ1bmN0aW9uUHJvdG8pIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0dmFyIHN0ciA9IGZ1bmN0aW9uVG9TdHJpbmcodGhpcyk7XG5cdHZhciBtYXRjaCA9IHN0cmluZ01hdGNoKHN0ciwgcmVnZXgpO1xuXHR2YXIgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuXHRyZXR1cm4gbmFtZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDEgKi9cblxudmFyIEVSUk9SX01FU1NBR0UgPSAnRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnO1xudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBmdW5jVHlwZSA9ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYmluZCh0aGF0KSB7XG4gICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09ICdmdW5jdGlvbicgfHwgdG9TdHIuY2FsbCh0YXJnZXQpICE9PSBmdW5jVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEVSUk9SX01FU1NBR0UgKyB0YXJnZXQpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICAgIHZhciBib3VuZDtcbiAgICB2YXIgYmluZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5hcHBseShcbiAgICAgICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGJvdW5kTGVuZ3RoID0gTWF0aC5tYXgoMCwgdGFyZ2V0Lmxlbmd0aCAtIGFyZ3MubGVuZ3RoKTtcbiAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZExlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJvdW5kQXJncy5wdXNoKCckJyArIGkpO1xuICAgIH1cblxuICAgIGJvdW5kID0gRnVuY3Rpb24oJ2JpbmRlcicsICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBib3VuZEFyZ3Muam9pbignLCcpICsgJyl7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgIGlmICh0YXJnZXQucHJvdG90eXBlKSB7XG4gICAgICAgIHZhciBFbXB0eSA9IGZ1bmN0aW9uIEVtcHR5KCkge307XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBib3VuZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIEFycmF5I2luY2x1ZGVzIGlzIHN0YWdlIDQsIGluIEVTNy9FUzIwMTZcbnJlcXVpcmUoJ2FycmF5LWluY2x1ZGVzL3NoaW0nKSgpO1xuXG5yZXF1aXJlKCcuL2VzMjAxNycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltQXJyYXlQcm90b3R5cGVJbmNsdWRlcygpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKFxuXHRcdEFycmF5LnByb3RvdHlwZSxcblx0XHR7IGluY2x1ZGVzOiBwb2x5ZmlsbCB9LFxuXHRcdHsgaW5jbHVkZXM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyAhPT0gcG9seWZpbGw7IH0gfVxuXHQpO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgfHwgaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVMgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC9lczYnKTtcbnZhciAkaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gaXNOYU4oYSkge1xuXHRyZXR1cm4gYSAhPT0gYTtcbn07XG52YXIgJGlzRmluaXRlID0gTnVtYmVyLmlzRmluaXRlIHx8IGZ1bmN0aW9uIGlzRmluaXRlKG4pIHtcblx0cmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiBnbG9iYWwuaXNGaW5pdGUobik7XG59O1xudmFyIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50KSB7XG5cdHZhciBmcm9tSW5kZXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IEVTLlRvSW50ZWdlcihhcmd1bWVudHNbMV0pIDogMDtcblx0aWYgKGluZGV4T2YgJiYgISRpc05hTihzZWFyY2hFbGVtZW50KSAmJiAkaXNGaW5pdGUoZnJvbUluZGV4KSAmJiB0eXBlb2Ygc2VhcmNoRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gaW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpID4gLTE7XG5cdH1cblxuXHR2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuXHR2YXIgbGVuZ3RoID0gRVMuVG9MZW5ndGgoTy5sZW5ndGgpO1xuXHRpZiAobGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cdHZhciBrID0gZnJvbUluZGV4ID49IDAgPyBmcm9tSW5kZXggOiBNYXRoLm1heCgwLCBsZW5ndGggKyBmcm9tSW5kZXgpO1xuXHR3aGlsZSAoayA8IGxlbmd0aCkge1xuXHRcdGlmIChFUy5TYW1lVmFsdWVaZXJvKHNlYXJjaEVsZW1lbnQsIE9ba10pKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0ayArPSAxO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9lczIwMTUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2VzMjAxNScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCc7XG5cbnZhciBpc1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vaGVscGVycy9pc1ByaW1pdGl2ZScpO1xudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xudmFyIGlzRGF0ZSA9IHJlcXVpcmUoJ2lzLWRhdGUtb2JqZWN0Jyk7XG52YXIgaXNTeW1ib2wgPSByZXF1aXJlKCdpcy1zeW1ib2wnKTtcblxudmFyIG9yZGluYXJ5VG9QcmltaXRpdmUgPSBmdW5jdGlvbiBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpIHtcblx0aWYgKHR5cGVvZiBPID09PSAndW5kZWZpbmVkJyB8fCBPID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgbWV0aG9kIG9uICcgKyBPKTtcblx0fVxuXHRpZiAodHlwZW9mIGhpbnQgIT09ICdzdHJpbmcnIHx8IChoaW50ICE9PSAnbnVtYmVyJyAmJiBoaW50ICE9PSAnc3RyaW5nJykpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdoaW50IG11c3QgYmUgXCJzdHJpbmdcIiBvciBcIm51bWJlclwiJyk7XG5cdH1cblx0dmFyIG1ldGhvZE5hbWVzID0gaGludCA9PT0gJ3N0cmluZycgPyBbJ3RvU3RyaW5nJywgJ3ZhbHVlT2YnXSA6IFsndmFsdWVPZicsICd0b1N0cmluZyddO1xuXHR2YXIgbWV0aG9kLCByZXN1bHQsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCBtZXRob2ROYW1lcy5sZW5ndGg7ICsraSkge1xuXHRcdG1ldGhvZCA9IE9bbWV0aG9kTmFtZXNbaV1dO1xuXHRcdGlmIChpc0NhbGxhYmxlKG1ldGhvZCkpIHtcblx0XHRcdHJlc3VsdCA9IG1ldGhvZC5jYWxsKE8pO1xuXHRcdFx0aWYgKGlzUHJpbWl0aXZlKHJlc3VsdCkpIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0dGhyb3cgbmV3IFR5cGVFcnJvcignTm8gZGVmYXVsdCB2YWx1ZScpO1xufTtcblxudmFyIEdldE1ldGhvZCA9IGZ1bmN0aW9uIEdldE1ldGhvZChPLCBQKSB7XG5cdHZhciBmdW5jID0gT1tQXTtcblx0aWYgKGZ1bmMgIT09IG51bGwgJiYgdHlwZW9mIGZ1bmMgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0aWYgKCFpc0NhbGxhYmxlKGZ1bmMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGZ1bmMgKyAnIHJldHVybmVkIGZvciBwcm9wZXJ0eSAnICsgUCArICcgb2Ygb2JqZWN0ICcgKyBPICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuXHRcdH1cblx0XHRyZXR1cm4gZnVuYztcblx0fVxuXHRyZXR1cm4gdm9pZCAwO1xufTtcblxuLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvcHJpbWl0aXZlXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFRvUHJpbWl0aXZlKGlucHV0KSB7XG5cdGlmIChpc1ByaW1pdGl2ZShpbnB1dCkpIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cblx0dmFyIGhpbnQgPSAnZGVmYXVsdCc7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdGlmIChhcmd1bWVudHNbMV0gPT09IFN0cmluZykge1xuXHRcdFx0aGludCA9ICdzdHJpbmcnO1xuXHRcdH0gZWxzZSBpZiAoYXJndW1lbnRzWzFdID09PSBOdW1iZXIpIHtcblx0XHRcdGhpbnQgPSAnbnVtYmVyJztcblx0XHR9XG5cdH1cblxuXHR2YXIgZXhvdGljVG9QcmltO1xuXHRpZiAoaGFzU3ltYm9scykge1xuXHRcdGlmIChTeW1ib2wudG9QcmltaXRpdmUpIHtcblx0XHRcdGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgU3ltYm9sLnRvUHJpbWl0aXZlKTtcblx0XHR9IGVsc2UgaWYgKGlzU3ltYm9sKGlucHV0KSkge1xuXHRcdFx0ZXhvdGljVG9QcmltID0gU3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mO1xuXHRcdH1cblx0fVxuXHRpZiAodHlwZW9mIGV4b3RpY1RvUHJpbSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR2YXIgcmVzdWx0ID0gZXhvdGljVG9QcmltLmNhbGwoaW5wdXQsIGhpbnQpO1xuXHRcdGlmIChpc1ByaW1pdGl2ZShyZXN1bHQpKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmFibGUgdG8gY29udmVydCBleG90aWMgb2JqZWN0IHRvIHByaW1pdGl2ZScpO1xuXHR9XG5cdGlmIChoaW50ID09PSAnZGVmYXVsdCcgJiYgKGlzRGF0ZShpbnB1dCkgfHwgaXNTeW1ib2woaW5wdXQpKSkge1xuXHRcdGhpbnQgPSAnc3RyaW5nJztcblx0fVxuXHRyZXR1cm4gb3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gJ2RlZmF1bHQnID8gJ251bWJlcicgOiBoaW50KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXREYXkgPSBEYXRlLnByb3RvdHlwZS5nZXREYXk7XG52YXIgdHJ5RGF0ZU9iamVjdCA9IGZ1bmN0aW9uIHRyeURhdGVPYmplY3QodmFsdWUpIHtcblx0dHJ5IHtcblx0XHRnZXREYXkuY2FsbCh2YWx1ZSk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbnZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZGF0ZUNsYXNzID0gJ1tvYmplY3QgRGF0ZV0nO1xudmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0RhdGVPYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdHJldHVybiBoYXNUb1N0cmluZ1RhZyA/IHRyeURhdGVPYmplY3QodmFsdWUpIDogdG9TdHIuY2FsbCh2YWx1ZSkgPT09IGRhdGVDbGFzcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMTddLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgaXNQcmltaXRpdmUgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNQcmltaXRpdmUnKTtcblxudmFyIGlzQ2FsbGFibGUgPSByZXF1aXJlKCdpcy1jYWxsYWJsZScpO1xuXG4vLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy04LjEyLjhcbnZhciBFUzVpbnRlcm5hbFNsb3RzID0ge1xuXHQnW1tEZWZhdWx0VmFsdWVdXSc6IGZ1bmN0aW9uIChPKSB7XG5cdFx0dmFyIGFjdHVhbEhpbnQ7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRhY3R1YWxIaW50ID0gYXJndW1lbnRzWzFdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhY3R1YWxIaW50ID0gdG9TdHIuY2FsbChPKSA9PT0gJ1tvYmplY3QgRGF0ZV0nID8gU3RyaW5nIDogTnVtYmVyO1xuXHRcdH1cblxuXHRcdGlmIChhY3R1YWxIaW50ID09PSBTdHJpbmcgfHwgYWN0dWFsSGludCA9PT0gTnVtYmVyKSB7XG5cdFx0XHR2YXIgbWV0aG9kcyA9IGFjdHVhbEhpbnQgPT09IFN0cmluZyA/IFsndG9TdHJpbmcnLCAndmFsdWVPZiddIDogWyd2YWx1ZU9mJywgJ3RvU3RyaW5nJ107XG5cdFx0XHR2YXIgdmFsdWUsIGk7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRpZiAoaXNDYWxsYWJsZShPW21ldGhvZHNbaV1dKSkge1xuXHRcdFx0XHRcdHZhbHVlID0gT1ttZXRob2RzW2ldXSgpO1xuXHRcdFx0XHRcdGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIGRlZmF1bHQgdmFsdWUnKTtcblx0XHR9XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBbW0RlZmF1bHRWYWx1ZV1dIGhpbnQgc3VwcGxpZWQnKTtcblx0fVxufTtcblxuLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOS4xXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIFRvUHJpbWl0aXZlKGlucHV0KSB7XG5cdGlmIChpc1ByaW1pdGl2ZShpbnB1dCkpIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0cmV0dXJuIEVTNWludGVybmFsU2xvdHNbJ1tbRGVmYXVsdFZhbHVlXV0nXShpbnB1dCwgYXJndW1lbnRzWzFdKTtcblx0fVxuXHRyZXR1cm4gRVM1aW50ZXJuYWxTbG90c1snW1tEZWZhdWx0VmFsdWVdXSddKGlucHV0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE9iamVjdC52YWx1ZXMvT2JqZWN0LmVudHJpZXMgYXJlIHN0YWdlIDQsIGluIEVTMjAxN1xucmVxdWlyZSgnb2JqZWN0LnZhbHVlcy9zaGltJykoKTtcbnJlcXVpcmUoJ29iamVjdC5lbnRyaWVzL3NoaW0nKSgpO1xuXG4vLyBTdHJpbmcjcGFkU3RhcnQvU3RyaW5nI3BhZEVuZCBhcmUgc3RhZ2UgNCwgaW4gRVMyMDE3XG5yZXF1aXJlKCdzdHJpbmcucHJvdG90eXBlLnBhZHN0YXJ0L3NoaW0nKSgpO1xucmVxdWlyZSgnc3RyaW5nLnByb3RvdHlwZS5wYWRlbmQvc2hpbScpKCk7XG5cbi8vIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIGlzIHN0YWdlIDQsIGluIEVTMjAxN1xucmVxdWlyZSgnb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnMvc2hpbScpKCk7XG5cbnJlcXVpcmUoJy4vZXMyMDE4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1WYWx1ZXMoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShPYmplY3QsIHsgdmFsdWVzOiBwb2x5ZmlsbCB9LCB7XG5cdFx0dmFsdWVzOiBmdW5jdGlvbiB0ZXN0VmFsdWVzKCkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC52YWx1ZXMgIT09IHBvbHlmaWxsO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIHR5cGVvZiBPYmplY3QudmFsdWVzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LnZhbHVlcyA6IGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXM3Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBpc0VudW1lcmFibGUgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsdWVzKE8pIHtcblx0dmFyIG9iaiA9IEVTLlJlcXVpcmVPYmplY3RDb2VyY2libGUoTyk7XG5cdHZhciB2YWxzID0gW107XG5cdGZvciAodmFyIGtleSBpbiBvYmopIHtcblx0XHRpZiAoaGFzKG9iaiwga2V5KSAmJiBpc0VudW1lcmFibGUob2JqLCBrZXkpKSB7XG5cdFx0XHR2YWxzLnB1c2gob2JqW2tleV0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFscztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1FbnRyaWVzKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoT2JqZWN0LCB7IGVudHJpZXM6IHBvbHlmaWxsIH0sIHtcblx0XHRlbnRyaWVzOiBmdW5jdGlvbiB0ZXN0RW50cmllcygpIHtcblx0XHRcdHJldHVybiBPYmplY3QuZW50cmllcyAhPT0gcG9seWZpbGw7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gdHlwZW9mIE9iamVjdC5lbnRyaWVzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmVudHJpZXMgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0L2VzNycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJ2hhcycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaXNFbnVtZXJhYmxlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVudHJpZXMoTykge1xuXHR2YXIgb2JqID0gRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZShPKTtcblx0dmFyIGVudHJ5cyA9IFtdO1xuXHRmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG5cdFx0aWYgKGhhcyhvYmosIGtleSkgJiYgaXNFbnVtZXJhYmxlKG9iaiwga2V5KSkge1xuXHRcdFx0ZW50cnlzLnB1c2goW2tleSwgb2JqW2tleV1dKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGVudHJ5cztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1QYWRTdGFydCgpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKFN0cmluZy5wcm90b3R5cGUsIHsgcGFkU3RhcnQ6IHBvbHlmaWxsIH0sIHsgcGFkU3RhcnQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgIT09IHBvbHlmaWxsOyB9IH0pO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdHJldHVybiB0eXBlb2YgU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCA9PT0gJ2Z1bmN0aW9uJyA/IFN0cmluZy5wcm90b3R5cGUucGFkU3RhcnQgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXM3Jyk7XG52YXIgc2xpY2UgPSBiaW5kLmNhbGwoRnVuY3Rpb24uY2FsbCwgU3RyaW5nLnByb3RvdHlwZS5zbGljZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFkU3RhcnQobWF4TGVuZ3RoKSB7XG5cdHZhciBPID0gRVMuUmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKTtcblx0dmFyIFMgPSBFUy5Ub1N0cmluZyhPKTtcblx0dmFyIHN0cmluZ0xlbmd0aCA9IEVTLlRvTGVuZ3RoKFMubGVuZ3RoKTtcblx0dmFyIGZpbGxTdHJpbmc7XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHRcdGZpbGxTdHJpbmcgPSBhcmd1bWVudHNbMV07XG5cdH1cblx0dmFyIGZpbGxlciA9IHR5cGVvZiBmaWxsU3RyaW5nID09PSAndW5kZWZpbmVkJyA/ICcnIDogRVMuVG9TdHJpbmcoZmlsbFN0cmluZyk7XG5cdGlmIChmaWxsZXIgPT09ICcnKSB7XG5cdFx0ZmlsbGVyID0gJyAnO1xuXHR9XG5cdHZhciBpbnRNYXhMZW5ndGggPSBFUy5Ub0xlbmd0aChtYXhMZW5ndGgpO1xuXHRpZiAoaW50TWF4TGVuZ3RoIDw9IHN0cmluZ0xlbmd0aCkge1xuXHRcdHJldHVybiBTO1xuXHR9XG5cdHZhciBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuXHR3aGlsZSAoZmlsbGVyLmxlbmd0aCA8IGZpbGxMZW4pIHtcblx0XHR2YXIgZkxlbiA9IGZpbGxlci5sZW5ndGg7XG5cdFx0dmFyIHJlbWFpbmluZ0NvZGVVbml0cyA9IGZpbGxMZW4gLSBmTGVuO1xuXHRcdGZpbGxlciArPSBmTGVuID4gcmVtYWluaW5nQ29kZVVuaXRzID8gc2xpY2UoZmlsbGVyLCAwLCByZW1haW5pbmdDb2RlVW5pdHMpIDogZmlsbGVyO1xuXHR9XG5cblx0dmFyIHRydW5jYXRlZFN0cmluZ0ZpbGxlciA9IGZpbGxlci5sZW5ndGggPiBmaWxsTGVuID8gc2xpY2UoZmlsbGVyLCAwLCBmaWxsTGVuKSA6IGZpbGxlcjtcblx0cmV0dXJuIHRydW5jYXRlZFN0cmluZ0ZpbGxlciArIFM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltUGFkRW5kKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgeyBwYWRFbmQ6IHBvbHlmaWxsIH0sIHsgcGFkRW5kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBTdHJpbmcucHJvdG90eXBlLnBhZEVuZCAhPT0gcG9seWZpbGw7IH0gfSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnBhZEVuZCA9PT0gJ2Z1bmN0aW9uJyA/IFN0cmluZy5wcm90b3R5cGUucGFkRW5kIDogaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0L2VzNycpO1xudmFyIHNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGgpIHtcblx0dmFyIE8gPSBFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpO1xuXHR2YXIgUyA9IEVTLlRvU3RyaW5nKE8pO1xuXHR2YXIgc3RyaW5nTGVuZ3RoID0gRVMuVG9MZW5ndGgoUy5sZW5ndGgpO1xuXHR2YXIgZmlsbFN0cmluZztcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG5cdFx0ZmlsbFN0cmluZyA9IGFyZ3VtZW50c1sxXTtcblx0fVxuXHR2YXIgZmlsbGVyID0gdHlwZW9mIGZpbGxTdHJpbmcgPT09ICd1bmRlZmluZWQnID8gJycgOiBFUy5Ub1N0cmluZyhmaWxsU3RyaW5nKTtcblx0aWYgKGZpbGxlciA9PT0gJycpIHtcblx0XHRmaWxsZXIgPSAnICc7XG5cdH1cblx0dmFyIGludE1heExlbmd0aCA9IEVTLlRvTGVuZ3RoKG1heExlbmd0aCk7XG5cdGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoKSB7XG5cdFx0cmV0dXJuIFM7XG5cdH1cblx0dmFyIGZpbGxMZW4gPSBpbnRNYXhMZW5ndGggLSBzdHJpbmdMZW5ndGg7XG5cdHdoaWxlIChmaWxsZXIubGVuZ3RoIDwgZmlsbExlbikge1xuXHRcdHZhciBmTGVuID0gZmlsbGVyLmxlbmd0aDtcblx0XHR2YXIgcmVtYWluaW5nQ29kZVVuaXRzID0gZmlsbExlbiAtIGZMZW47XG5cdFx0ZmlsbGVyICs9IGZMZW4gPiByZW1haW5pbmdDb2RlVW5pdHMgPyBzbGljZShmaWxsZXIsIDAsIHJlbWFpbmluZ0NvZGVVbml0cykgOiBmaWxsZXI7XG5cdH1cblxuXHR2YXIgdHJ1bmNhdGVkU3RyaW5nRmlsbGVyID0gZmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4gPyBzbGljZShmaWxsZXIsIDAsIGZpbGxMZW4pIDogZmlsbGVyO1xuXHRyZXR1cm4gUyArIHRydW5jYXRlZFN0cmluZ0ZpbGxlcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1HZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0T2JqZWN0LFxuXHRcdHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogcG9seWZpbGwgfSxcblx0XHR7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9PT0gJ2Z1bmN0aW9uJyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIDogaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVMgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC9lczcnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGdldERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGdldE93bk5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgZ2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgY29uY2F0ID0gRnVuY3Rpb24uY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5jb25jYXQpO1xudmFyIHJlZHVjZSA9IEZ1bmN0aW9uLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUucmVkdWNlKTtcbnZhciBnZXRBbGwgPSBnZXRTeW1ib2xzID8gZnVuY3Rpb24gKG9iaikge1xuXHRyZXR1cm4gY29uY2F0KGdldE93bk5hbWVzKG9iaiksIGdldFN5bWJvbHMob2JqKSk7XG59IDogZ2V0T3duTmFtZXM7XG5cbnZhciBpc0VTNSA9IEVTLklzQ2FsbGFibGUoZ2V0RGVzY3JpcHRvcikgJiYgRVMuSXNDYWxsYWJsZShnZXRPd25OYW1lcyk7XG5cbnZhciBzYWZlUHV0ID0gZnVuY3Rpb24gcHV0KG9iaiwgcHJvcCwgdmFsKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbWF4LXBhcmFtc1xuXHRpZiAoZGVmaW5lUHJvcGVydHkgJiYgcHJvcCBpbiBvYmopIHtcblx0XHRkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogdmFsLFxuXHRcdFx0d3JpdGFibGU6IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvYmpbcHJvcF0gPSB2YWw7XG5cdH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh2YWx1ZSkge1xuXHRFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHZhbHVlKTtcblx0aWYgKCFpc0VTNSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMgcmVxdWlyZXMgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcicpO1xuXHR9XG5cblx0dmFyIE8gPSBFUy5Ub09iamVjdCh2YWx1ZSk7XG5cdHJldHVybiByZWR1Y2UoZ2V0QWxsKE8pLCBmdW5jdGlvbiAoYWNjLCBrZXkpIHtcblx0XHR2YXIgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoTywga2V5KTtcblx0XHRpZiAodHlwZW9mIGRlc2NyaXB0b3IgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRzYWZlUHV0KGFjYywga2V5LCBkZXNjcmlwdG9yKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFjYztcblx0fSwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nKSB7XG4gIHJlcXVpcmUoJ3Byb21pc2UucHJvdG90eXBlLmZpbmFsbHkvYXV0bycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdsb2JhbC1yZXF1aXJlXG59XG5cbnJlcXVpcmUoJy4vZXMyMDE5Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vc2hpbScpKCk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXF1aXJlUHJvbWlzZSA9IHJlcXVpcmUoJy4vcmVxdWlyZVByb21pc2UnKTtcblxudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVByb21pc2VGaW5hbGx5KCkge1xuXHRyZXF1aXJlUHJvbWlzZSgpO1xuXG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShQcm9taXNlLnByb3RvdHlwZSwgeyAnZmluYWxseSc6IHBvbHlmaWxsIH0sIHtcblx0XHQnZmluYWxseSc6IGZ1bmN0aW9uIHRlc3RGaW5hbGx5KCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gIT09IHBvbHlmaWxsO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXF1aXJlUHJvbWlzZSA9IHJlcXVpcmUoJy4vcmVxdWlyZVByb21pc2UnKTtcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXF1aXJlUHJvbWlzZSgpO1xuXHRyZXR1cm4gdHlwZW9mIFByb21pc2UucHJvdG90eXBlWydmaW5hbGx5J10gPT09ICdmdW5jdGlvbicgPyBQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddIDogaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVxdWlyZVByb21pc2UgPSByZXF1aXJlKCcuL3JlcXVpcmVQcm9taXNlJyk7XG5cbnJlcXVpcmVQcm9taXNlKCk7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0L2VzNycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG5cbnZhciBwcm9taXNlUmVzb2x2ZSA9IGZ1bmN0aW9uIFByb21pc2VSZXNvbHZlKEMsIHZhbHVlKSB7XG5cdHJldHVybiBuZXcgQyhmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdHJlc29sdmUodmFsdWUpO1xuXHR9KTtcbn07XG5cbnZhciBPcmlnaW5hbFByb21pc2UgPSBQcm9taXNlO1xuXG52YXIgY3JlYXRlVGhlbkZpbmFsbHkgPSBmdW5jdGlvbiBDcmVhdGVUaGVuRmluYWxseShDLCBvbkZpbmFsbHkpIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdHZhciByZXN1bHQgPSBvbkZpbmFsbHkoKTtcblx0XHR2YXIgcHJvbWlzZSA9IHByb21pc2VSZXNvbHZlKEMsIHJlc3VsdCk7XG5cdFx0dmFyIHZhbHVlVGh1bmsgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fTtcblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKHZhbHVlVGh1bmspO1xuXHR9O1xufTtcblxudmFyIGNyZWF0ZUNhdGNoRmluYWxseSA9IGZ1bmN0aW9uIENyZWF0ZUNhdGNoRmluYWxseShDLCBvbkZpbmFsbHkpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChyZWFzb24pIHtcblx0XHR2YXIgcmVzdWx0ID0gb25GaW5hbGx5KCk7XG5cdFx0dmFyIHByb21pc2UgPSBwcm9taXNlUmVzb2x2ZShDLCByZXN1bHQpO1xuXHRcdHZhciB0aHJvd2VyID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dGhyb3cgcmVhc29uO1xuXHRcdH07XG5cdFx0cmV0dXJuIHByb21pc2UudGhlbih0aHJvd2VyKTtcblx0fTtcbn07XG5cbnZhciB0aGVuID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIE9yaWdpbmFsUHJvbWlzZS5wcm90b3R5cGUudGhlbik7XG5cbnZhciBwcm9taXNlRmluYWxseSA9IGZ1bmN0aW9uIGZpbmFsbHlfKG9uRmluYWxseSkge1xuXHQvKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiAwICovXG5cblx0dmFyIHByb21pc2UgPSB0aGlzO1xuXG5cdHRoZW4ocHJvbWlzZSwgbnVsbCwgZnVuY3Rpb24gKCkge30pOyAvLyB0aHJvdyBpZiBJc1Byb21pc2UodGhpcykgaXMgZmFsc2U7IGNhdGNoKCkgdG8gYXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5nc1xuXG5cdHZhciBDID0gRVMuU3BlY2llc0NvbnN0cnVjdG9yKHByb21pc2UsIE9yaWdpbmFsUHJvbWlzZSk7IC8vIG1heSB0aHJvd1xuXG5cdHZhciB0aGVuRmluYWxseSA9IG9uRmluYWxseTtcblx0dmFyIGNhdGNoRmluYWxseSA9IG9uRmluYWxseTtcblx0aWYgKEVTLklzQ2FsbGFibGUob25GaW5hbGx5KSkge1xuXHRcdHRoZW5GaW5hbGx5ID0gY3JlYXRlVGhlbkZpbmFsbHkoQywgb25GaW5hbGx5KTtcblx0XHRjYXRjaEZpbmFsbHkgPSBjcmVhdGVDYXRjaEZpbmFsbHkoQywgb25GaW5hbGx5KTtcblx0fVxuXG5cdHJldHVybiBwcm9taXNlLnRoZW4odGhlbkZpbmFsbHksIGNhdGNoRmluYWxseSk7XG59O1xuXG5pZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcikge1xuXHR2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvbWlzZUZpbmFsbHksICduYW1lJyk7XG5cdGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2VGaW5hbGx5LCAnbmFtZScsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogJ2ZpbmFsbHknIH0pO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHJvbWlzZUZpbmFsbHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJ2FycmF5LnByb3RvdHlwZS5mbGF0L2F1dG8nKTtcbnJlcXVpcmUoJ2FycmF5LnByb3RvdHlwZS5mbGF0bWFwL2F1dG8nKTtcblxucmVxdWlyZSgnc3ltYm9sLnByb3RvdHlwZS5kZXNjcmlwdGlvbi9hdXRvJyk7XG5cbnJlcXVpcmUoJ29iamVjdC5mcm9tZW50cmllcy9hdXRvJyk7XG5cbnJlcXVpcmUoJy4vZXMyMDIwJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJy4vc2hpbScpKCk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoaW1GbGF0KCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0QXJyYXkucHJvdG90eXBlLFxuXHRcdHsgZmxhdDogcG9seWZpbGwgfSxcblx0XHR7IGZsYXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5mbGF0ICE9PSBwb2x5ZmlsbDsgfSB9XG5cdCk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mbGF0IHx8IGltcGxlbWVudGF0aW9uO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXMyMDE3Jyk7XG5cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgKE1hdGgucG93KDIsIDUzKSAtIDEpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtcywgbWF4LXN0YXRlbWVudHNcbnZhciBGbGF0dGVuSW50b0FycmF5ID0gZnVuY3Rpb24gRmxhdHRlbkludG9BcnJheSh0YXJnZXQsIHNvdXJjZSwgc291cmNlTGVuLCBzdGFydCwgZGVwdGgpIHtcblx0dmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7XG5cdHZhciBzb3VyY2VJbmRleCA9IDA7XG5cblx0Lypcblx0dmFyIG1hcHBlckZ1bmN0aW9uO1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDUpIHtcblx0XHRtYXBwZXJGdW5jdGlvbiA9IGFyZ3VtZW50c1s1XTtcblx0fVxuXHQqL1xuXG5cdHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuXHRcdHZhciBQID0gRVMuVG9TdHJpbmcoc291cmNlSW5kZXgpO1xuXHRcdHZhciBleGlzdHMgPSBFUy5IYXNQcm9wZXJ0eShzb3VyY2UsIFApO1xuXHRcdGlmIChleGlzdHMpIHtcblx0XHRcdHZhciBlbGVtZW50ID0gRVMuR2V0KHNvdXJjZSwgUCk7XG5cdFx0XHQvKlxuXHRcdFx0aWYgKHR5cGVvZiBtYXBwZXJGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gNikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHRoaXNBcmcgaXMgcmVxdWlyZWQgd2hlbiBtYXBwZXJGdW5jdGlvbiBpcyBwcm92aWRlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW1lbnQgPSBFUy5DYWxsKG1hcHBlckZ1bmN0aW9uLCBhcmd1bWVudHNbNl0sIFtlbGVtZW50LCBzb3VyY2VJbmRleCwgc291cmNlXSk7XG5cdFx0XHR9XG5cdFx0XHQqL1xuXHRcdFx0dmFyIHNob3VsZEZsYXR0ZW4gPSBmYWxzZTtcblx0XHRcdGlmIChkZXB0aCA+IDApIHtcblx0XHRcdFx0c2hvdWxkRmxhdHRlbiA9IEVTLklzQXJyYXkoZWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2hvdWxkRmxhdHRlbikge1xuXHRcdFx0XHR2YXIgZWxlbWVudExlbiA9IEVTLlRvTGVuZ3RoKEVTLkdldChlbGVtZW50LCAnbGVuZ3RoJykpO1xuXHRcdFx0XHR0YXJnZXRJbmRleCA9IEZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBlbGVtZW50LCBlbGVtZW50TGVuLCB0YXJnZXRJbmRleCwgZGVwdGggLSAxKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICh0YXJnZXRJbmRleCA+PSBNQVhfU0FGRV9JTlRFR0VSKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignaW5kZXggdG9vIGxhcmdlJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0RVMuQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyh0YXJnZXQsIEVTLlRvU3RyaW5nKHRhcmdldEluZGV4KSwgZWxlbWVudCk7XG5cdFx0XHRcdHRhcmdldEluZGV4ICs9IDE7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHNvdXJjZUluZGV4ICs9IDE7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0SW5kZXg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYXQoKSB7XG5cdHZhciBPID0gRVMuVG9PYmplY3QodGhpcyk7XG5cdHZhciBzb3VyY2VMZW4gPSBFUy5Ub0xlbmd0aChFUy5HZXQoTywgJ2xlbmd0aCcpKTtcblxuXHR2YXIgZGVwdGhOdW0gPSAxO1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRkZXB0aE51bSA9IEVTLlRvSW50ZWdlcihhcmd1bWVudHNbMF0pO1xuXHR9XG5cblx0dmFyIEEgPSBFUy5BcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG5cdEZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgc291cmNlTGVuLCAwLCBkZXB0aE51bSk7XG5cdHJldHVybiBBO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9zaGltJykoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUZsYXRNYXAoKSB7XG5cdHZhciBwb2x5ZmlsbCA9IGdldFBvbHlmaWxsKCk7XG5cdGRlZmluZShcblx0XHRBcnJheS5wcm90b3R5cGUsXG5cdFx0eyBmbGF0TWFwOiBwb2x5ZmlsbCB9LFxuXHRcdHsgZmxhdE1hcDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZsYXRNYXAgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZsYXRNYXAgfHwgaW1wbGVtZW50YXRpb247XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRVMgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC9lczIwMTcnKTtcblxudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCAoTWF0aC5wb3coMiwgNTMpIC0gMSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtcGFyYW1zXG52YXIgRmxhdHRlbkludG9BcnJheSA9IGZ1bmN0aW9uIEZsYXR0ZW5JbnRvQXJyYXkodGFyZ2V0LCBzb3VyY2UsIHNvdXJjZUxlbiwgc3RhcnQsIGRlcHRoKSB7XG5cdHZhciB0YXJnZXRJbmRleCA9IHN0YXJ0O1xuXHR2YXIgc291cmNlSW5kZXggPSAwO1xuXG5cdHZhciBtYXBwZXJGdW5jdGlvbjtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiA1KSB7XG5cdFx0bWFwcGVyRnVuY3Rpb24gPSBhcmd1bWVudHNbNV07XG5cdH1cblxuXHR3aGlsZSAoc291cmNlSW5kZXggPCBzb3VyY2VMZW4pIHtcblx0XHR2YXIgUCA9IEVTLlRvU3RyaW5nKHNvdXJjZUluZGV4KTtcblx0XHR2YXIgZXhpc3RzID0gRVMuSGFzUHJvcGVydHkoc291cmNlLCBQKTtcblx0XHRpZiAoZXhpc3RzKSB7XG5cdFx0XHR2YXIgZWxlbWVudCA9IEVTLkdldChzb3VyY2UsIFApO1xuXHRcdFx0aWYgKHR5cGVvZiBtYXBwZXJGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gNikge1xuXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQ6IHRoaXNBcmcgaXMgcmVxdWlyZWQgd2hlbiBtYXBwZXJGdW5jdGlvbiBpcyBwcm92aWRlZCcpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW1lbnQgPSBFUy5DYWxsKG1hcHBlckZ1bmN0aW9uLCBhcmd1bWVudHNbNl0sIFtlbGVtZW50LCBzb3VyY2VJbmRleCwgc291cmNlXSk7XG5cdFx0XHR9XG5cdFx0XHR2YXIgc2hvdWxkRmxhdHRlbiA9IGZhbHNlO1xuXHRcdFx0aWYgKGRlcHRoID4gMCkge1xuXHRcdFx0XHRzaG91bGRGbGF0dGVuID0gRVMuSXNBcnJheShlbGVtZW50KTtcblx0XHRcdH1cblx0XHRcdGlmIChzaG91bGRGbGF0dGVuKSB7XG5cdFx0XHRcdHZhciBlbGVtZW50TGVuID0gRVMuVG9MZW5ndGgoRVMuR2V0KGVsZW1lbnQsICdsZW5ndGgnKSk7XG5cdFx0XHRcdHRhcmdldEluZGV4ID0gRmxhdHRlbkludG9BcnJheSh0YXJnZXQsIGVsZW1lbnQsIGVsZW1lbnRMZW4sIHRhcmdldEluZGV4LCBkZXB0aCAtIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHRhcmdldEluZGV4ID49IE1BWF9TQUZFX0lOVEVHRVIpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdpbmRleCB0b28gbGFyZ2UnKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRFUy5DcmVhdGVEYXRhUHJvcGVydHlPclRocm93KHRhcmdldCwgRVMuVG9TdHJpbmcodGFyZ2V0SW5kZXgpLCBlbGVtZW50KTtcblx0XHRcdFx0dGFyZ2V0SW5kZXggKz0gMTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c291cmNlSW5kZXggKz0gMTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRJbmRleDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuKSB7XG5cdHZhciBPID0gRVMuVG9PYmplY3QodGhpcyk7XG5cdHZhciBzb3VyY2VMZW4gPSBFUy5Ub0xlbmd0aChFUy5HZXQoTywgJ2xlbmd0aCcpKTtcblxuXHRpZiAoIUVTLklzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0fVxuXG5cdHZhciBUO1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRUID0gYXJndW1lbnRzWzFdO1xuXHR9XG5cblx0dmFyIEEgPSBFUy5BcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG5cdEZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgc291cmNlTGVuLCAwLCAxLCBjYWxsYmFja2ZuLCBUKTtcblx0cmV0dXJuIEE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCcuL3NoaW0nKSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcbnZhciBwb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBnZXRJbmZlcnJlZE5hbWUgPSByZXF1aXJlKCcuL2hlbHBlcnMvZ2V0SW5mZXJyZWROYW1lJyk7XG5cbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBzZXRQcm90byA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcblxudmFyIGRlZmluZSA9IGZ1bmN0aW9uIGRlZmluZUdldHRlcihnZXR0ZXIpIHtcblx0ZFAoU3ltYm9sLnByb3RvdHlwZSwgJ2Rlc2NyaXB0aW9uJywge1xuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0XHRnZXQ6IGdldHRlclxuXHR9KTtcbn07XG5cbnZhciBzaGltR2xvYmFsID0gZnVuY3Rpb24gc2hpbUdsb2JhbFN5bWJvbChnZXR0ZXIpIHtcblx0dmFyIG9yaWdTeW0gPSBGdW5jdGlvbi5hcHBseS5iaW5kKFN5bWJvbCk7XG5cdHZhciBlbXB0eVN0cmluZ3MgPSBPYmplY3QuY3JlYXRlID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXHR2YXIgU3ltTmV3ID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuXHRcdHZhciBzeW0gPSBvcmlnU3ltKHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSA9PT0gJycpIHtcblx0XHRcdGVtcHR5U3RyaW5nc1tzeW1dID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIHN5bTtcblx0fTtcblx0U3ltTmV3LnByb3RvdHlwZSA9IFN5bWJvbC5wcm90b3R5cGU7XG5cdHNldFByb3RvKFN5bU5ldywgU3ltYm9sKTtcblx0U3ltYm9sID0gU3ltTmV3OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5hdGl2ZS1yZWFzc2lnbiwgbm8tZ2xvYmFsLWFzc2lnblxuXG5cdHZhciBib3VuZEdldHRlciA9IEZ1bmN0aW9uLmNhbGwuYmluZChnZXR0ZXIpO1xuXHR2YXIgd3JhcHBlZEdldHRlciA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuXHRcdC8qIGVzbGludCBuby1pbnZhbGlkLXRoaXM6IDAgKi9cblx0XHR2YXIgc3ltYm9sRGVzY3JpcHRpb24gPSBib3VuZEdldHRlcih0aGlzKTtcblx0XHRpZiAoZW1wdHlTdHJpbmdzW3RoaXNdKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdHJldHVybiBzeW1ib2xEZXNjcmlwdGlvbjtcblx0fTtcblx0ZGVmaW5lKHdyYXBwZWRHZXR0ZXIpO1xuXHRyZXR1cm4gd3JhcHBlZEdldHRlcjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbVN5bWJvbERlc2NyaXB0aW9uKCkge1xuXHRpZiAoIWhhc1N5bWJvbHMpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0dmFyIGRlc2MgPSBnT1BEKFN5bWJvbC5wcm90b3R5cGUsICdkZXNjcmlwdGlvbicpO1xuXHR2YXIgZ2V0dGVyID0gcG9seWZpbGwoKTtcblx0dmFyIGlzTWlzc2luZyA9ICFkZXNjIHx8IHR5cGVvZiBkZXNjLmdldCAhPT0gJ2Z1bmN0aW9uJztcblx0dmFyIGlzQnJva2VuID0gIWlzTWlzc2luZyAmJiAodHlwZW9mIFN5bWJvbCgpLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyB8fCBTeW1ib2woJycpLmRlc2NyaXB0aW9uICE9PSAnJyk7XG5cdGlmIChpc01pc3NpbmcgfHwgaXNCcm9rZW4pIHtcblx0XHRpZiAoIWdldEluZmVycmVkTmFtZSkge1xuXHRcdFx0cmV0dXJuIHNoaW1HbG9iYWwoZ2V0dGVyKTtcblx0XHR9XG5cdFx0ZGVmaW5lKGdldHRlcik7XG5cdH1cblx0cmV0dXJuIGdldHRlcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVzY3JpcHRpb25Qb2x5ZmlsbCgpIHtcblx0aWYgKCFoYXNTeW1ib2xzIHx8IHR5cGVvZiBnT1BEICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0dmFyIGRlc2MgPSBnT1BEKFN5bWJvbC5wcm90b3R5cGUsICdkZXNjcmlwdGlvbicpO1xuXHRpZiAoIWRlc2MgfHwgdHlwZW9mIGRlc2MuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xuXHR9XG5cdGlmICh0eXBlb2YgZGVzYy5nZXQuY2FsbChTeW1ib2woKSkgIT09ICd1bmRlZmluZWQnIHx8IGRlc2MuZ2V0LmNhbGwoU3ltYm9sKCkpICE9PSAnJyB8fCBkZXNjLmdldC5jYWxsKFN5bWJvbCgnYScpKSAhPT0gJ2EnKSB7XG5cdFx0cmV0dXJuIGltcGxlbWVudGF0aW9uO1xuXHR9XG5cdHJldHVybiBkZXNjLmdldDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIHN5bVRvU3RyID0gaGFzU3ltYm9scyA/IEZ1bmN0aW9uLmNhbGwuYmluZChTeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nKSA6IG51bGw7XG52YXIgZ2V0SW5mZXJyZWROYW1lID0gcmVxdWlyZSgnLi9oZWxwZXJzL2dldEluZmVycmVkTmFtZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCkge1xuXHR2YXIgc3RyID0gc3ltVG9TdHIodGhpcyk7IC8vIHdpbGwgdGhyb3cgaWYgbm90IGEgU3ltYm9sXG5cblx0aWYgKGdldEluZmVycmVkTmFtZSkge1xuXHRcdHZhciBuYW1lID0gZ2V0SW5mZXJyZWROYW1lKHRoaXMpO1xuXHRcdGlmIChuYW1lID09PSAnJykgeyByZXR1cm47IH1cblx0XHRyZXR1cm4gbmFtZS5zbGljZSgxLCAtMSk7IC8vIG5hbWUuc2xpY2UoJ1snLmxlbmd0aCwgLSddJy5sZW5ndGgpO1xuXHR9XG5cblx0dmFyIGRlc2MgPSBzdHIuc2xpY2UoNywgLTEpOyAvLyBzdHIuc2xpY2UoJ1N5bWJvbCgnLmxlbmd0aCwgLScpJy5sZW5ndGgpO1xuXHRpZiAoZGVzYykge1xuXHRcdHJldHVybiBkZXNjO1xuXHR9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5yZXF1aXJlKCcuL3NoaW0nKSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltRW50cmllcygpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0ZGVmaW5lKE9iamVjdCwgeyBmcm9tRW50cmllczogcG9seWZpbGwgfSwge1xuXHRcdGZyb21FbnRyaWVzOiBmdW5jdGlvbiB0ZXN0RW50cmllcygpIHtcblx0XHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMgIT09IHBvbHlmaWxsO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmV0dXJuIHR5cGVvZiBPYmplY3QuZnJvbUVudHJpZXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuZnJvbUVudHJpZXMgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0L2VzMjAxNycpO1xuXG52YXIgVGhyb3dDb21wbGV0aW9uID0gZnVuY3Rpb24gVGhyb3coZXJyb3IpIHtcblx0dGhyb3cgZXJyb3I7XG59O1xuXG52YXIgbGVnYWN5QXNzaWduID0gZnVuY3Rpb24gYXNzaWduKG9iaiwgZW50cmllcykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHtcblx0XHR2YXIgZW50cnkgPSBlbnRyaWVzW2ldO1xuXHRcdGlmIChFUy5UeXBlKGVudHJ5KSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIHJldHVybmVkIGEgbm9uLW9iamVjdDsgZW50cnkgZXhwZWN0ZWQnKTtcblx0XHR9XG5cblx0XHR2YXIga2V5ID0gRVMuR2V0KGVudHJ5LCAnMCcpO1xuXHRcdHZhciB2YWx1ZSA9IEVTLkdldChlbnRyeSwgJzEnKTtcblx0XHR2YXIgcHJvcGVydHlLZXkgPSBFUy5Ub1Byb3BlcnR5S2V5KGtleSk7XG5cdFx0RVMuQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyhvYmosIHByb3BlcnR5S2V5LCB2YWx1ZSk7XG5cdH1cbn07XG5cbi8qIGdsb2JhbCBTeW1ib2wgKi9cblxudmFyIGhhc1N5bWJvbHMgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2woJ2ZvbycpID09PSAnc3ltYm9sJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmcm9tRW50cmllcyhpdGVyYWJsZSkge1xuXHRFUy5SZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0ZXJhYmxlKTtcblxuXHR2YXIgb2JqID0ge307XG5cblx0Ly8gdGhpcyBwYXJ0IGlzbid0IGluIHRoZSBzcGVjLCBpdCdzIGZvciBhIHJlYXNvbmFibGUgZmFsbGJhY2sgZm9yIHByZS1FUzYgZW52aXJvbm1lbnRzXG5cdGlmICghaGFzU3ltYm9scykge1xuXHRcdGlmICghRVMuSXNBcnJheShpdGVyYWJsZSkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgZW52aXJvbm1lbnQgbGFja3MgbmF0aXZlIFN5bWJvbHMsIGFuZCBjYW4gbm90IHN1cHBvcnQgbm9uLUFycmF5IGl0ZXJhYmxlcycpO1xuXHRcdH1cblx0XHRsZWdhY3lBc3NpZ24ob2JqLCBpdGVyYWJsZSk7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXG5cdC8qXG5cdHJldHVybiBFUy5BZGRFbnRyaWVzRnJvbUl0ZXJhYmxlKG9iaiwgaXRlcmFibGUsIEVTLkNyZWF0ZUJ1aWx0aW5GdW5jdGlvbignQ3JlYXRlRGF0YVByb3BlcnR5T25PYmplY3QnKSk7XG5cdGZ1bmN0aW9uIGFkZGVyKGtleSwgdmFsdWUpIHtcblx0XHR2YXIgTyA9IHRoaXM7XG5cdFx0dmFyIHByb3BlcnR5S2V5ID0gRVMuVG9Qcm9wZXJ0eUtleShrZXkpO1xuXHRcdENyZWF0ZURhdGFQcm9wZXJ0eU9yVGhyb3coTywgcHJvcGVydHlLZXksIHZhbHVlKTtcblx0fVxuXHQqL1xuXG5cdHZhciBpdGVyID0gRVMuR2V0SXRlcmF0b3IoaXRlcmFibGUpO1xuXHR3aGlsZSAodHJ1ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuXHRcdHZhciBuZXh0ID0gRVMuSXRlcmF0b3JTdGVwKGl0ZXIpO1xuXHRcdGlmIChuZXh0ID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIG9iajtcblx0XHR9XG5cblx0XHR2YXIgbmV4dEl0ZW0gPSBFUy5JdGVyYXRvclZhbHVlKG5leHQpO1xuXHRcdGlmIChFUy5UeXBlKG5leHRJdGVtKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIHJldHVybmVkIGEgbm9uLW9iamVjdDsgZW50cnkgZXhwZWN0ZWQnKTtcblx0XHRcdHJldHVybiBFUy5JdGVyYXRvckNsb3NlKGl0ZXIsIFRocm93Q29tcGxldGlvbihlcnJvcikpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIga2V5ID0gRVMuR2V0KG5leHRJdGVtLCAnMCcpO1xuXHRcdFx0dmFyIHZhbHVlID0gRVMuR2V0KG5leHRJdGVtLCAnMScpO1xuXHRcdFx0dmFyIHByb3BlcnR5S2V5ID0gRVMuVG9Qcm9wZXJ0eUtleShrZXkpO1xuXHRcdFx0RVMuQ3JlYXRlRGF0YVByb3BlcnR5T3JUaHJvdyhvYmosIHByb3BlcnR5S2V5LCB2YWx1ZSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIEVTLkl0ZXJhdG9yQ2xvc2UoaXRlciwgVGhyb3dDb21wbGV0aW9uKGUpKTtcblx0XHR9XG5cdH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnJlcXVpcmUoJ3N0cmluZy5wcm90b3R5cGUubWF0Y2hhbGwvYXV0bycpO1xuXG5yZXF1aXJlKCdnbG9iYWx0aGlzL2F1dG8nKTtcblxucmVxdWlyZSgncHJvbWlzZS5hbGxzZXR0bGVkL2F1dG8nKTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9zaGltJykoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciByZWdleE1hdGNoQWxsID0gcmVxdWlyZSgnLi9yZWdleHAtbWF0Y2hhbGwnKTtcblxudmFyIGRlZmluZVAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbU1hdGNoQWxsKCkge1xuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoXG5cdFx0U3RyaW5nLnByb3RvdHlwZSxcblx0XHR7IG1hdGNoQWxsOiBwb2x5ZmlsbCB9LFxuXHRcdHsgbWF0Y2hBbGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFN0cmluZy5wcm90b3R5cGUubWF0Y2hBbGwgIT09IHBvbHlmaWxsOyB9IH1cblx0KTtcblx0aWYgKGhhc1N5bWJvbHMpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1wcm9wZXJ0aWVzXG5cdFx0dmFyIHN5bWJvbCA9IFN5bWJvbC5tYXRjaEFsbCB8fCAoU3ltYm9sWydmb3InXSA/IFN5bWJvbFsnZm9yJ10oJ1N5bWJvbC5tYXRjaEFsbCcpIDogU3ltYm9sKCdTeW1ib2wubWF0Y2hBbGwnKSk7XG5cdFx0ZGVmaW5lKFxuXHRcdFx0U3ltYm9sLFxuXHRcdFx0eyBtYXRjaEFsbDogc3ltYm9sIH0sXG5cdFx0XHR7IG1hdGNoQWxsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBTeW1ib2wubWF0Y2hBbGwgIT09IHN5bWJvbDsgfSB9XG5cdFx0KTtcblxuXHRcdGlmIChkZWZpbmVQICYmIGdPUEQpIHtcblx0XHRcdHZhciBkZXNjID0gZ09QRChTeW1ib2wsIHN5bWJvbCk7XG5cdFx0XHRpZiAoIWRlc2MgfHwgZGVzYy5jb25maWd1cmFibGUpIHtcblx0XHRcdFx0ZGVmaW5lUChTeW1ib2wsIHN5bWJvbCwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0dmFsdWU6IHN5bWJvbCxcblx0XHRcdFx0XHR3cml0YWJsZTogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIGZ1bmMgPSB7fTtcblx0XHRmdW5jW3N5bWJvbF0gPSBSZWdFeHAucHJvdG90eXBlW3N5bWJvbF0gfHwgcmVnZXhNYXRjaEFsbDtcblx0XHR2YXIgcHJlZGljYXRlID0ge307XG5cdFx0cHJlZGljYXRlW3N5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBSZWdFeHAucHJvdG90eXBlW3N5bWJvbF0gIT09IHJlZ2V4TWF0Y2hBbGw7IH07XG5cdFx0ZGVmaW5lKFJlZ0V4cC5wcm90b3R5cGUsIGZ1bmMsIHByZWRpY2F0ZSk7XG5cdH1cblx0cmV0dXJuIHBvbHlmaWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGltcGxlbWVudGF0aW9uID0gcmVxdWlyZSgnLi9pbXBsZW1lbnRhdGlvbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldFBvbHlmaWxsKCkge1xuXHRyZXR1cm4gU3RyaW5nLnByb3RvdHlwZS5tYXRjaEFsbCB8fCBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBFUyA9IHJlcXVpcmUoJ2VzLWFic3RyYWN0Jyk7XG52YXIgaGFzU3ltYm9scyA9IHJlcXVpcmUoJ2hhcy1zeW1ib2xzJykoKTtcblxudmFyIHJlZ2V4TWF0Y2hBbGwgPSByZXF1aXJlKCcuL3JlZ2V4cC1tYXRjaGFsbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1hdGNoQWxsKHJlZ2V4cCkge1xuXHR2YXIgTyA9IEVTLlJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG5cblx0aWYgKHR5cGVvZiByZWdleHAgIT09ICd1bmRlZmluZWQnICYmIHJlZ2V4cCAhPT0gbnVsbCkge1xuXHRcdHZhciBtYXRjaGVyO1xuXHRcdGlmIChoYXNTeW1ib2xzICYmIHR5cGVvZiBTeW1ib2wubWF0Y2hBbGwgPT09ICdzeW1ib2wnKSB7XG5cdFx0XHRtYXRjaGVyID0gRVMuR2V0TWV0aG9kKHJlZ2V4cCwgU3ltYm9sLm1hdGNoQWxsKTtcblx0XHR9IGVsc2UgaWYgKEVTLklzUmVnRXhwKHJlZ2V4cCkpIHtcblx0XHRcdC8vIGZhbGxiYWNrIGZvciBwcmUtU3ltYm9sLm1hdGNoQWxsIGVudmlyb25tZW50c1xuXHRcdFx0bWF0Y2hlciA9IHJlZ2V4TWF0Y2hBbGw7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgbWF0Y2hlciAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBFUy5DYWxsKG1hdGNoZXIsIHJlZ2V4cCwgW09dKTtcblx0XHR9XG5cdH1cblxuXHR2YXIgUyA9IEVTLlRvU3RyaW5nKE8pO1xuXHQvLyB2YXIgcnggPSBFUy5SZWdFeHBDcmVhdGUocmVnZXhwLCAnZycpO1xuXHR2YXIgcnggPSBuZXcgUmVnRXhwKHJlZ2V4cCwgJ2cnKTtcblx0aWYgKGhhc1N5bWJvbHMgJiYgdHlwZW9mIFN5bWJvbC5tYXRjaEFsbCA9PT0gJ3N5bWJvbCcpIHtcblx0XHRyZXR1cm4gRVMuSW52b2tlKHJ4LCBTeW1ib2wubWF0Y2hBbGwsIFtTXSk7XG5cdH1cblx0Ly8gZmFsbGJhY2sgZm9yIHByZS1TeW1ib2wubWF0Y2hBbGwgZW52aXJvbm1lbnRzXG5cdHJldHVybiBFUy5DYWxsKHJlZ2V4TWF0Y2hBbGwsIHJ4LCBbU10pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcbnZhciBnZXRQb2x5ZmlsbCA9IHJlcXVpcmUoJy4vcG9seWZpbGwnKTtcbnZhciBzaGltID0gcmVxdWlyZSgnLi9zaGltJyk7XG5cbnZhciBmbGFnc0JvdW5kID0gRnVuY3Rpb24uY2FsbC5iaW5kKGltcGxlbWVudGF0aW9uKTtcblxuZGVmaW5lKGZsYWdzQm91bmQsIHtcblx0Z2V0UG9seWZpbGw6IGdldFBvbHlmaWxsLFxuXHRpbXBsZW1lbnRhdGlvbjogaW1wbGVtZW50YXRpb24sXG5cdHNoaW06IHNoaW1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYWdzQm91bmQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdXBwb3J0c0Rlc2NyaXB0b3JzID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKS5zdXBwb3J0c0Rlc2NyaXB0b3JzO1xudmFyIGdldFBvbHlmaWxsID0gcmVxdWlyZSgnLi9wb2x5ZmlsbCcpO1xudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIFR5cGVFcnIgPSBUeXBlRXJyb3I7XG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgcmVnZXggPSAvYS87XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUZsYWdzKCkge1xuXHRpZiAoIXN1cHBvcnRzRGVzY3JpcHRvcnMgfHwgIWdldFByb3RvKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnIoJ1JlZ0V4cC5wcm90b3R5cGUuZmxhZ3MgcmVxdWlyZXMgYSB0cnVlIEVTNSBlbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIHByb3BlcnR5IGRlc2NyaXB0b3JzJyk7XG5cdH1cblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0dmFyIHByb3RvID0gZ2V0UHJvdG8ocmVnZXgpO1xuXHR2YXIgZGVzY3JpcHRvciA9IGdPUEQocHJvdG8sICdmbGFncycpO1xuXHRpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5nZXQgIT09IHBvbHlmaWxsKSB7XG5cdFx0ZGVmaW5lUHJvcGVydHkocHJvdG8sICdmbGFncycsIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiBwb2x5ZmlsbFxuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBwb2x5ZmlsbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QnKTtcbnZhciBHZXRJbnRyaW5zaWMgPSByZXF1aXJlKCdlcy1hYnN0cmFjdC9HZXRJbnRyaW5zaWMnKTtcbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xuXG52YXIgaGlkZGVuID0gcmVxdWlyZSgnLi9oaWRkZW4nKSgpO1xudmFyIHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lc1xuXG52YXIgUmVnRXhwU3RyaW5nSXRlcmF0b3IgPSBmdW5jdGlvbiBSZWdFeHBTdHJpbmdJdGVyYXRvcihSLCBTLCBnbG9iYWwsIGZ1bGxVbmljb2RlKSB7XG5cdGlmIChFUy5UeXBlKFMpICE9PSAnU3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1MgbXVzdCBiZSBhIHN0cmluZycpO1xuXHR9XG5cdGlmIChFUy5UeXBlKGdsb2JhbCkgIT09ICdCb29sZWFuJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2dsb2JhbCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cdGlmIChFUy5UeXBlKGZ1bGxVbmljb2RlKSAhPT0gJ0Jvb2xlYW4nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignZnVsbFVuaWNvZGUgbXVzdCBiZSBhIGJvb2xlYW4nKTtcblx0fVxuXHRoaWRkZW4uc2V0KHRoaXMsICdbW0l0ZXJhdGluZ1JlZ0V4cF1dJywgUik7XG5cdGhpZGRlbi5zZXQodGhpcywgJ1tbSXRlcmF0ZWRTdHJpbmddXScsIFMpO1xuXHRoaWRkZW4uc2V0KHRoaXMsICdbW0dsb2JhbF1dJywgZ2xvYmFsKTtcblx0aGlkZGVuLnNldCh0aGlzLCAnW1tVbmljb2RlXV0nLCBmdWxsVW5pY29kZSk7XG5cdGhpZGRlbi5zZXQodGhpcywgJ1tbRG9uZV1dJywgZmFsc2UpO1xufTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gR2V0SW50cmluc2ljKCclSXRlcmF0b3JQcm90b3R5cGUlJywgdHJ1ZSk7XG5pZiAoSXRlcmF0b3JQcm90b3R5cGUpIHtcblx0UmVnRXhwU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlID0gRVMuT2JqZWN0Q3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbn1cblxuZGVmaW5lKFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSwge1xuXHRuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuXHRcdHZhciBPID0gdGhpcztcblx0XHRpZiAoRVMuVHlwZShPKSAhPT0gJ09iamVjdCcpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlY2VpdmVyIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5cdFx0fVxuXHRcdGlmIChcblx0XHRcdCEoTyBpbnN0YW5jZW9mIFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKVxuXHRcdFx0fHwgIWhpZGRlbi5oYXMoTywgJ1tbSXRlcmF0aW5nUmVnRXhwXV0nKVxuXHRcdFx0fHwgIWhpZGRlbi5oYXMoTywgJ1tbSXRlcmF0ZWRTdHJpbmddXScpXG5cdFx0XHR8fCAhaGlkZGVuLmhhcyhPLCAnW1tHbG9iYWxdXScpXG5cdFx0XHR8fCAhaGlkZGVuLmhhcyhPLCAnW1tVbmljb2RlXV0nKVxuXHRcdFx0fHwgIWhpZGRlbi5oYXMoTywgJ1tbRG9uZV1dJylcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIHZhbHVlIG11c3QgYmUgYSBSZWdFeHBTdHJpbmdJdGVyYXRvciBpbnN0YW5jZScpO1xuXHRcdH1cblx0XHRpZiAoaGlkZGVuLmdldChPLCAnW1tEb25lXV0nKSkge1xuXHRcdFx0cmV0dXJuIEVTLkNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QodW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cdFx0dmFyIFIgPSBoaWRkZW4uZ2V0KE8sICdbW0l0ZXJhdGluZ1JlZ0V4cF1dJyk7XG5cdFx0dmFyIFMgPSBoaWRkZW4uZ2V0KE8sICdbW0l0ZXJhdGVkU3RyaW5nXV0nKTtcblx0XHR2YXIgZ2xvYmFsID0gaGlkZGVuLmdldChPLCAnW1tHbG9iYWxdXScpO1xuXHRcdHZhciBmdWxsVW5pY29kZSA9IGhpZGRlbi5nZXQoTywgJ1tbVW5pY29kZV1dJyk7XG5cdFx0dmFyIG1hdGNoID0gRVMuUmVnRXhwRXhlYyhSLCBTKTtcblx0XHRpZiAobWF0Y2ggPT09IG51bGwpIHtcblx0XHRcdGhpZGRlbi5zZXQoTywgJ1tbRG9uZV1dJywgdHJ1ZSk7XG5cdFx0XHRyZXR1cm4gRVMuQ3JlYXRlSXRlclJlc3VsdE9iamVjdCh1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblx0XHRpZiAoZ2xvYmFsKSB7XG5cdFx0XHR2YXIgbWF0Y2hTdHIgPSBFUy5Ub1N0cmluZyhFUy5HZXQobWF0Y2gsICcwJykpO1xuXHRcdFx0aWYgKG1hdGNoU3RyID09PSAnJykge1xuXHRcdFx0XHR2YXIgdGhpc0luZGV4ID0gRVMuVG9MZW5ndGgoRVMuR2V0KFIsICdsYXN0SW5kZXgnKSk7XG5cdFx0XHRcdHZhciBuZXh0SW5kZXggPSBFUy5BZHZhbmNlU3RyaW5nSW5kZXgoUywgdGhpc0luZGV4LCBmdWxsVW5pY29kZSk7XG5cdFx0XHRcdEVTLlNldChSLCAnbGFzdEluZGV4JywgbmV4dEluZGV4LCB0cnVlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBFUy5DcmVhdGVJdGVyUmVzdWx0T2JqZWN0KG1hdGNoLCBmYWxzZSk7XG5cdFx0fVxuXHRcdGhpZGRlbi5zZXQoTywgJ1tbRG9uZV1dJywgdHJ1ZSk7XG5cdFx0cmV0dXJuIEVTLkNyZWF0ZUl0ZXJSZXN1bHRPYmplY3QobWF0Y2gsIGZhbHNlKTtcblx0fVxufSk7XG5pZiAoaGFzU3ltYm9scykge1xuXHR2YXIgZGVmaW5lUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0aWYgKFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdGlmIChkZWZpbmVQKSB7XG5cdFx0XHRkZWZpbmVQKFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHZhbHVlOiAnUmVnRXhwIFN0cmluZyBJdGVyYXRvcicsXG5cdFx0XHRcdHdyaXRhYmxlOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddID0gJ1JlZ0V4cCBTdHJpbmcgSXRlcmF0b3InO1xuXHRcdH1cblx0fVxuXG5cdGlmICghSXRlcmF0b3JQcm90b3R5cGUgJiYgU3ltYm9sLml0ZXJhdG9yKSB7XG5cdFx0dmFyIGZ1bmMgPSB7fTtcblx0XHRmdW5jW1N5bWJvbC5pdGVyYXRvcl0gPSBSZWdFeHBTdHJpbmdJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSB8fCBmdW5jdGlvbiBTeW1ib2xJdGVyYXRvcigpIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cdFx0dmFyIHByZWRpY2F0ZSA9IHt9O1xuXHRcdHByZWRpY2F0ZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdICE9PSBmdW5jW1N5bWJvbC5pdGVyYXRvcl07XG5cdFx0fTtcblx0XHRkZWZpbmUoUmVnRXhwU3RyaW5nSXRlcmF0b3IucHJvdG90eXBlLCBmdW5jLCBwcmVkaWNhdGUpO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVnRXhwU3RyaW5nSXRlcmF0b3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBkZWZpbmUgPSByZXF1aXJlKCdkZWZpbmUtcHJvcGVydGllcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldEhpZGRlbktleU1hbmFnZXIoKSB7XG5cdHZhciBzeW1ib2xDYWNoZSA9IHt9O1xuXHR2YXIgbWFrZUtleSA9IGZ1bmN0aW9uIGtleShwcm9wKSB7XG5cdFx0aWYgKHN5bWJvbENhY2hlWyckJyArIHByb3BdKSB7XG5cdFx0XHRyZXR1cm4gc3ltYm9sQ2FjaGVbJyQnICsgcHJvcF07XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRzeW1ib2xDYWNoZVsnJCcgKyBwcm9wXSA9IFN5bWJvbChwcm9wKTtcblx0XHRcdHJldHVybiBzeW1ib2xDYWNoZVsnJCcgKyBwcm9wXTtcblx0XHR9XG5cdFx0cmV0dXJuICdfX18gJyArIHByb3AgKyAnIF9fXyc7XG5cdH07XG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiBnZXQob2JqLCBwcm9wKSB7XG5cdFx0XHRyZXR1cm4gb2JqW21ha2VLZXkocHJvcCldO1xuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiBoYXMob2JqLCBwcm9wKSB7XG5cdFx0XHRyZXR1cm4gbWFrZUtleShwcm9wKSBpbiBvYmo7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uIHNldChvYmosIHByb3AsIHZhbHVlKSB7XG5cdFx0XHR2YXIga2V5ID0gbWFrZUtleShwcm9wKTtcblx0XHRcdGlmIChkZWZpbmUuc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9ialtrZXldID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9zaGltJykoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmluZSA9IHJlcXVpcmUoJ2RlZmluZS1wcm9wZXJ0aWVzJyk7XG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2hpbUdsb2JhbCgpIHtcblx0dmFyIHBvbHlmaWxsID0gZ2V0UG9seWZpbGwoKTtcblx0aWYgKGRlZmluZS5zdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHBvbHlmaWxsLCAnZ2xvYmFsVGhpcycpO1xuXHRcdGlmICghZGVzY3JpcHRvciB8fCAoZGVzY3JpcHRvci5jb25maWd1cmFibGUgJiYgKGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBkZXNjcmlwdG9yLndyaXRhYmxlIHx8IGdsb2JhbFRoaXMgIT09IHBvbHlmaWxsKSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBtYXgtbGVuXG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkocG9seWZpbGwsICdnbG9iYWxUaGlzJywge1xuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0XHR2YWx1ZTogcG9seWZpbGwsXG5cdFx0XHRcdHdyaXRhYmxlOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAnb2JqZWN0JyB8fCBnbG9iYWxUaGlzICE9PSBwb2x5ZmlsbCkge1xuXHRcdHBvbHlmaWxsLmdsb2JhbFRoaXMgPSBwb2x5ZmlsbDtcblx0fVxuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW1wbGVtZW50YXRpb24gPSByZXF1aXJlKCcuL2ltcGxlbWVudGF0aW9uJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0UG9seWZpbGwoKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsICE9PSAnb2JqZWN0JyB8fCAhZ2xvYmFsIHx8IGdsb2JhbC5NYXRoICE9PSBNYXRoIHx8IGdsb2JhbC5BcnJheSAhPT0gQXJyYXkpIHtcblx0XHRyZXR1cm4gaW1wbGVtZW50YXRpb247XG5cdH1cblx0cmV0dXJuIGdsb2JhbDtcbn07XG4iLCIvKiBnbG9iYWxzIHNlbGYsIHdpbmRvdywgZ2xvYmFsICovXG4vKiBlc2xpbnQgbm8tbmVnYXRlZC1jb25kaXRpb246IDAsIG5vLW5ldy1mdW5jOiAwICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbDtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxucmVxdWlyZSgnLi9zaGltJykoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcXVpcmVQcm9taXNlID0gcmVxdWlyZSgnLi9yZXF1aXJlUHJvbWlzZScpO1xuXG52YXIgZ2V0UG9seWZpbGwgPSByZXF1aXJlKCcuL3BvbHlmaWxsJyk7XG52YXIgZGVmaW5lID0gcmVxdWlyZSgnZGVmaW5lLXByb3BlcnRpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGltQWxsU2V0dGxlZCgpIHtcblx0cmVxdWlyZVByb21pc2UoKTtcblxuXHR2YXIgcG9seWZpbGwgPSBnZXRQb2x5ZmlsbCgpO1xuXHRkZWZpbmUoUHJvbWlzZSwgeyBhbGxTZXR0bGVkOiBwb2x5ZmlsbCB9LCB7XG5cdFx0YWxsU2V0dGxlZDogZnVuY3Rpb24gdGVzdEFsbFNldHRsZWQoKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkICE9PSBwb2x5ZmlsbDtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gcG9seWZpbGw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVxdWlyZVByb21pc2UgPSByZXF1aXJlKCcuL3JlcXVpcmVQcm9taXNlJyk7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQb2x5ZmlsbCgpIHtcblx0cmVxdWlyZVByb21pc2UoKTtcblx0cmV0dXJuIHR5cGVvZiBQcm9taXNlLmFsbFNldHRsZWQgPT09ICdmdW5jdGlvbicgPyBQcm9taXNlLmFsbFNldHRsZWQgOiBpbXBsZW1lbnRhdGlvbjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZXF1aXJlUHJvbWlzZSA9IHJlcXVpcmUoJy4vcmVxdWlyZVByb21pc2UnKTtcblxucmVxdWlyZVByb21pc2UoKTtcblxudmFyIEVTID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvZXMyMDE4Jyk7XG52YXIgZ2V0SW50cmluc2ljID0gcmVxdWlyZSgnZXMtYWJzdHJhY3QvR2V0SW50cmluc2ljJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJ2Z1bmN0aW9uLWJpbmQnKTtcblxudmFyIGFsbCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBnZXRJbnRyaW5zaWMoJyVQcm9taXNlX2FsbCUnKSk7XG52YXIgcmVqZWN0ID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIGdldEludHJpbnNpYygnJVByb21pc2VfcmVqZWN0JScpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhbGxTZXR0bGVkKGl0ZXJhYmxlKSB7XG5cdHZhciBDID0gdGhpcztcblx0aWYgKEVTLlR5cGUoQykgIT09ICdPYmplY3QnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignYHRoaXNgIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5cdH1cblx0cmV0dXJuIGFsbChDLCBBcnJheS5mcm9tKGl0ZXJhYmxlLCBmdW5jdGlvbiAoaXRlbSkge1xuXHRcdHZhciBvbkZ1bGZpbGwgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiB7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9O1xuXHRcdH07XG5cdFx0dmFyIG9uUmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuXHRcdFx0cmV0dXJuIHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IHJlYXNvbiB9O1xuXHRcdH07XG5cdFx0dmFyIGl0ZW1Qcm9taXNlID0gRVMuUHJvbWlzZVJlc29sdmUoQywgaXRlbSk7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBpdGVtUHJvbWlzZS50aGVuKG9uRnVsZmlsbCwgb25SZWplY3QpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiByZWplY3QoQywgZSk7XG5cdFx0fVxuXHR9KSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9lcy9zeW1ib2wnKTtcblxucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lc25leHQuc3ltYm9sLmRpc3Bvc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnN5bWJvbC5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5zeW1ib2wucGF0dGVybi1tYXRjaCcpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5jb25jYXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pcy1jb25jYXQtc3ByZWFkYWJsZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLm1hdGNoJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnNwbGl0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC50by1wcmltaXRpdmUnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnRvLXN0cmluZy10YWcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuc3ltYm9sLnVuc2NvcGFibGVzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLm1hdGgudG8tc3RyaW5nLXRhZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5qc29uLnRvLXN0cmluZy10YWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvcGF0aCcpLlN5bWJvbDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YnKTtcbnZhciBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJykoJ3RvU3RyaW5nVGFnJyk7XG52YXIgdGVzdCA9IHt9O1xuXG50ZXN0W1RPX1NUUklOR19UQUddID0gJ3onO1xuXG4vLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmluZyh0ZXN0KSAhPT0gJ1tvYmplY3Qgel0nID8gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbn0gOiB0ZXN0LnRvU3RyaW5nO1xuIiwidmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG5cbi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gb2JqZWN0S2V5cyhpdCk7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgaWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KTtcbiAgICB2YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuIiwiLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIG5hdGl2ZUdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlOYW1lcyhpdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJ1xuICAgID8gZ2V0V2luZG93TmFtZXMoaXQpXG4gICAgOiBuYXRpdmVHZXRPd25Qcm9wZXJ0eU5hbWVzKHRvSW5kZXhlZE9iamVjdChpdCkpO1xufTtcbiIsIi8vIGBTeW1ib2wuYXN5bmNJdGVyYXRvcmAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5hc3luY2l0ZXJhdG9yXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJykoJ2FzeW5jSXRlcmF0b3InKTtcbiIsIi8vIGBTeW1ib2wuaGFzSW5zdGFuY2VgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaGFzaW5zdGFuY2VcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgnaGFzSW5zdGFuY2UnKTtcbiIsIi8vIGBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLmlzY29uY2F0c3ByZWFkYWJsZVxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcbiIsIi8vIGBTeW1ib2wubWF0Y2hgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wubWF0Y2hcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgnbWF0Y2gnKTtcbiIsIi8vIGBTeW1ib2wucmVwbGFjZWAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5yZXBsYWNlXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJykoJ3JlcGxhY2UnKTtcbiIsIi8vIGBTeW1ib2wuc2VhcmNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3ltYm9sLnNlYXJjaFxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpKCdzZWFyY2gnKTtcbiIsIi8vIGBTeW1ib2wuc3BlY2llc2Agd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN5bWJvbC5zcGVjaWVzXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJykoJ3NwZWNpZXMnKTtcbiIsIi8vIGBTeW1ib2wuc3BsaXRgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuc3BsaXRcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgnc3BsaXQnKTtcbiIsIi8vIGBTeW1ib2wudG9QcmltaXRpdmVgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9wcmltaXRpdmVcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgndG9QcmltaXRpdmUnKTtcbiIsIi8vIGBTeW1ib2wudG9TdHJpbmdUYWdgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudG9zdHJpbmd0YWdcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgndG9TdHJpbmdUYWcnKTtcbiIsIi8vIGBTeW1ib2wudW5zY29wYWJsZXNgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wudW5zY29wYWJsZXNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtd2VsbC1rbm93bi1zeW1ib2wnKSgndW5zY29wYWJsZXMnKTtcbiIsIi8vIE1hdGhbQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1hdGgtQEB0b3N0cmluZ3RhZ1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJykoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbiIsIi8vIEpTT05bQEB0b1N0cmluZ1RhZ10gcHJvcGVydHlcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWpzb24tQEB0b3N0cmluZ3RhZ1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnJykocmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpLkpTT04sICdKU09OJywgdHJ1ZSk7XG4iLCIvLyBgU3ltYm9sLnBhdHRlcm5NYXRjaGAgd2VsbC1rbm93biBzeW1ib2xcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXVzaW5nLXN0YXRlbWVudFxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpKCdkaXNwb3NlJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYnNlcnZhYmxlXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJykoJ29ic2VydmFibGUnKTtcbiIsIi8vIGBTeW1ib2wucGF0dGVybk1hdGNoYCB3ZWxsLWtub3duIHN5bWJvbFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcGF0dGVybi1tYXRjaGluZ1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbCcpKCdwYXR0ZXJuTWF0Y2gnKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2dsb2JhbCA9IHJlcXVpcmUoXCJnbG9iYWxcIik7XG5cbl9nbG9iYWwud2luZG93LlNUT1JZQk9PS19SRUFDVF9DTEFTU0VTID0ge307IiwiJ3VzZSBzdHJpY3QnO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJykuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY3JlYXRlLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJdGVyYXRvckNvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICBJdGVyYXRvckNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yQ29uc3RydWN0b3IsIFRPX1NUUklOR19UQUcsIGZhbHNlLCB0cnVlKTtcbiAgSXRlcmF0b3JzW1RPX1NUUklOR19UQUddID0gcmV0dXJuVGhpcztcbiAgcmV0dXJuIEl0ZXJhdG9yQ29uc3RydWN0b3I7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZm9yY2VSZVJlbmRlciA9IGV4cG9ydHMuY29uZmlndXJlID0gZXhwb3J0cy5yYXcgPSBleHBvcnRzLmdldFN0b3J5Ym9vayA9IGV4cG9ydHMuY2xlYXJEZWNvcmF0b3JzID0gZXhwb3J0cy5hZGRQYXJhbWV0ZXJzID0gZXhwb3J0cy5hZGREZWNvcmF0b3IgPSBleHBvcnRzLnNldEFkZG9uID0gZXhwb3J0cy5zdG9yaWVzT2YgPSB2b2lkIDA7XG5cbnZhciBfY2xpZW50ID0gcmVxdWlyZShcIkBzdG9yeWJvb2svY29yZS9jbGllbnRcIik7XG5cbnJlcXVpcmUoXCIuL2dsb2JhbHNcIik7XG5cbnZhciBfcmVuZGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9yZW5kZXJcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxudmFyIF9zdGFydCA9ICgwLCBfY2xpZW50LnN0YXJ0KShfcmVuZGVyW1wiZGVmYXVsdFwiXSksXG4gICAgY2xpZW50QXBpID0gX3N0YXJ0LmNsaWVudEFwaSxcbiAgICBjb25maWdBcGkgPSBfc3RhcnQuY29uZmlnQXBpLFxuICAgIGZvcmNlUmVSZW5kZXIgPSBfc3RhcnQuZm9yY2VSZVJlbmRlcjtcblxuZXhwb3J0cy5mb3JjZVJlUmVuZGVyID0gZm9yY2VSZVJlbmRlcjtcbnZhciBzdG9yaWVzT2YgPSBjbGllbnRBcGkuc3Rvcmllc09mLFxuICAgIHNldEFkZG9uID0gY2xpZW50QXBpLnNldEFkZG9uLFxuICAgIGFkZERlY29yYXRvciA9IGNsaWVudEFwaS5hZGREZWNvcmF0b3IsXG4gICAgYWRkUGFyYW1ldGVycyA9IGNsaWVudEFwaS5hZGRQYXJhbWV0ZXJzLFxuICAgIGNsZWFyRGVjb3JhdG9ycyA9IGNsaWVudEFwaS5jbGVhckRlY29yYXRvcnMsXG4gICAgZ2V0U3Rvcnlib29rID0gY2xpZW50QXBpLmdldFN0b3J5Ym9vayxcbiAgICByYXcgPSBjbGllbnRBcGkucmF3O1xuZXhwb3J0cy5yYXcgPSByYXc7XG5leHBvcnRzLmdldFN0b3J5Ym9vayA9IGdldFN0b3J5Ym9vaztcbmV4cG9ydHMuY2xlYXJEZWNvcmF0b3JzID0gY2xlYXJEZWNvcmF0b3JzO1xuZXhwb3J0cy5hZGRQYXJhbWV0ZXJzID0gYWRkUGFyYW1ldGVycztcbmV4cG9ydHMuYWRkRGVjb3JhdG9yID0gYWRkRGVjb3JhdG9yO1xuZXhwb3J0cy5zZXRBZGRvbiA9IHNldEFkZG9uO1xuZXhwb3J0cy5zdG9yaWVzT2YgPSBzdG9yaWVzT2Y7XG52YXIgY29uZmlndXJlID0gY29uZmlnQXBpLmNvbmZpZ3VyZTtcbmV4cG9ydHMuY29uZmlndXJlID0gY29uZmlndXJlOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L2NsaWVudCcpLmRlZmF1bHQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcHJldmlldyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcHJldmlld1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG52YXIgX2RlZmF1bHQgPSBfcHJldmlld1tcImRlZmF1bHRcIl07XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IF9kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9jbGllbnRBcGkgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9jbGllbnQtYXBpXCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIkBzdG9yeWJvb2svcm91dGVyL3V0aWxzXCIpO1xuXG52YXIgX3N0YXJ0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdGFydFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG52YXIgX2RlZmF1bHQgPSB7XG4gIHN0YXJ0OiBfc3RhcnRbXCJkZWZhdWx0XCJdLFxuICB0b0lkOiBfdXRpbHMudG9JZCxcbiAgQ2xpZW50QXBpOiBfY2xpZW50QXBpLkNsaWVudEFwaSxcbiAgQ29uZmlnQXBpOiBfY2xpZW50QXBpLkNvbmZpZ0FwaSxcbiAgU3RvcnlTdG9yZTogX2NsaWVudEFwaS5TdG9yeVN0b3JlXG59O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBfZGVmYXVsdDsiLCJ2YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKS5mO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKDEpOyB9KTtcbnZhciBGT1JDRUQgPSAhREVTQ1JJUFRPUlMgfHwgRkFJTFNfT05fUFJJTUlUSVZFUztcblxuLy8gYE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gbmF0aXZlR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSW5kZXhlZE9iamVjdChpdCksIGtleSk7XG4gIH1cbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmRcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXBcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZW50cmllc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5c1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvclwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gZXhwb3J0cy5kZWZhdWx0RGVjb3JhdGVTdG9yeSA9IHZvaWQgMDtcblxudmFyIF9pc1BsYWluT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiaXMtcGxhaW4tb2JqZWN0XCIpKTtcblxudmFyIF9jbGllbnRMb2dnZXIgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9jbGllbnQtbG9nZ2VyXCIpO1xuXG52YXIgX2FkZG9ucyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBzdG9yeWJvb2svYWRkb25zXCIpKTtcblxudmFyIF9jb3JlRXZlbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9jb3JlLWV2ZW50c1wiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9yb3V0ZXIvdXRpbHNcIik7XG5cbnZhciBfbWVyZ2VXaXRoID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL21lcmdlV2l0aFwiKSk7XG5cbnZhciBfaXNFcXVhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImxvZGFzaC9pc0VxdWFsXCIpKTtcblxudmFyIF9nZXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvZ2V0XCIpKTtcblxudmFyIF9zdWJzY3JpcHRpb25zX3N0b3JlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdWJzY3JpcHRpb25zX3N0b3JlXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vLyBtZXJnZSB3aXRoIGNvbmNhdGVuYXRpbmcgYXJyYXlzLCBidXQgbm8gZHVwbGljYXRlc1xudmFyIG1lcmdlID0gZnVuY3Rpb24gbWVyZ2UoYSwgYikge1xuICByZXR1cm4gKDAsIF9tZXJnZVdpdGhbXCJkZWZhdWx0XCJdKSh7fSwgYSwgYiwgZnVuY3Rpb24gKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNyY1ZhbHVlKSAmJiBBcnJheS5pc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgc3JjVmFsdWUuZm9yRWFjaChmdW5jdGlvbiAocykge1xuICAgICAgICB2YXIgZXhpc3RpbmcgPSBvYmpWYWx1ZS5maW5kKGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgcmV0dXJuIG8gPT09IHMgfHwgKDAsIF9pc0VxdWFsW1wiZGVmYXVsdFwiXSkobywgcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgICBvYmpWYWx1ZS5wdXNoKHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgIF9jbGllbnRMb2dnZXIubG9nZ2VyLmxvZygndGhlIHR5cGVzIG1pc21hdGNoLCBwaWNraW5nJywgb2JqVmFsdWUpO1xuXG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSk7XG59O1xuXG52YXIgZGVmYXVsdERlY29yYXRlU3RvcnkgPSBmdW5jdGlvbiBkZWZhdWx0RGVjb3JhdGVTdG9yeShzdG9yeUZuLCBkZWNvcmF0b3JzKSB7XG4gIHJldHVybiBkZWNvcmF0b3JzLnJlZHVjZShmdW5jdGlvbiAoZGVjb3JhdGVkLCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIGRlY29yYXRvcihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRlZCggLy8gTVVUQVRJT04gIVxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnRleHQsIHAsIHtcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBPYmplY3QuYXNzaWduKGNvbnRleHQucGFyYW1ldGVycyB8fCB7fSwgcC5wYXJhbWV0ZXJzKVxuICAgICAgICB9LCB7XG4gICAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbihjb250ZXh0Lm9wdGlvbnMgfHwge30sIHAub3B0aW9ucylcbiAgICAgICAgfSkpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfTtcbiAgfSwgc3RvcnlGbik7XG59O1xuXG5leHBvcnRzLmRlZmF1bHREZWNvcmF0ZVN0b3J5ID0gZGVmYXVsdERlY29yYXRlU3Rvcnk7XG5cbnZhciBtZXRhU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gbWV0YVN1YnNjcmlwdGlvbigpIHtcbiAgX2FkZG9uc1tcImRlZmF1bHRcIl0uZ2V0Q2hhbm5lbCgpLm9uKF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5SRUdJU1RFUl9TVUJTQ1JJUFRJT04sIF9zdWJzY3JpcHRpb25zX3N0b3JlW1wiZGVmYXVsdFwiXS5yZWdpc3Rlcik7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX2FkZG9uc1tcImRlZmF1bHRcIl0uZ2V0Q2hhbm5lbCgpLnJlbW92ZUxpc3RlbmVyKF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5SRUdJU1RFUl9TVUJTQ1JJUFRJT04sIF9zdWJzY3JpcHRpb25zX3N0b3JlW1wiZGVmYXVsdFwiXS5yZWdpc3Rlcik7XG4gIH07XG59O1xuXG52YXIgd2l0aFN1YnNjcmlwdGlvblRyYWNraW5nID0gZnVuY3Rpb24gd2l0aFN1YnNjcmlwdGlvblRyYWNraW5nKHN0b3J5Rm4pIHtcbiAgaWYgKCFfYWRkb25zW1wiZGVmYXVsdFwiXS5oYXNDaGFubmVsKCkpIHtcbiAgICByZXR1cm4gc3RvcnlGbigpO1xuICB9XG5cbiAgX3N1YnNjcmlwdGlvbnNfc3RvcmVbXCJkZWZhdWx0XCJdLm1hcmtBbGxBc1VudXNlZCgpO1xuXG4gIF9zdWJzY3JpcHRpb25zX3N0b3JlW1wiZGVmYXVsdFwiXS5yZWdpc3RlcihtZXRhU3Vic2NyaXB0aW9uKTtcblxuICB2YXIgcmVzdWx0ID0gc3RvcnlGbigpO1xuXG4gIF9zdWJzY3JpcHRpb25zX3N0b3JlW1wiZGVmYXVsdFwiXS5jbGVhclVudXNlZCgpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG52YXIgQ2xpZW50QXBpID0gZnVuY3Rpb24gQ2xpZW50QXBpKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIHN0b3J5U3RvcmUgPSBfcmVmLnN0b3J5U3RvcmUsXG4gICAgICBfcmVmJGRlY29yYXRlU3RvcnkgPSBfcmVmLmRlY29yYXRlU3RvcnksXG4gICAgICBkZWNvcmF0ZVN0b3J5ID0gX3JlZiRkZWNvcmF0ZVN0b3J5ID09PSB2b2lkIDAgPyBkZWZhdWx0RGVjb3JhdGVTdG9yeSA6IF9yZWYkZGVjb3JhdGVTdG9yeTtcblxuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xpZW50QXBpKTtcblxuICB0aGlzLnNldEFkZG9uID0gZnVuY3Rpb24gKGFkZG9uKSB7XG4gICAgX3RoaXMuX2FkZG9ucyA9IE9iamVjdC5hc3NpZ24oe30sIF90aGlzLl9hZGRvbnMsIGFkZG9uKTtcbiAgfTtcblxuICB0aGlzLmdldFNlcGFyYXRvcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHtcbiAgICAgIGhpZXJhcmNoeVJvb3RTZXBhcmF0b3I6ICd8JyxcbiAgICAgIGhpZXJhcmNoeVNlcGFyYXRvcjogL1xcL3xcXC4vXG4gICAgfSwgX3RoaXMuX2dsb2JhbFBhcmFtZXRlcnMub3B0aW9ucyk7XG4gIH07XG5cbiAgdGhpcy5hZGREZWNvcmF0b3IgPSBmdW5jdGlvbiAoZGVjb3JhdG9yKSB7XG4gICAgX3RoaXMuX2dsb2JhbERlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICB9O1xuXG4gIHRoaXMuYWRkUGFyYW1ldGVycyA9IGZ1bmN0aW9uIChwYXJhbWV0ZXJzKSB7XG4gICAgX3RoaXMuX2dsb2JhbFBhcmFtZXRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBfdGhpcy5fZ2xvYmFsUGFyYW1ldGVycywgcGFyYW1ldGVycywge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2UoKDAsIF9nZXRbXCJkZWZhdWx0XCJdKShfdGhpcy5fZ2xvYmFsUGFyYW1ldGVycywgJ29wdGlvbnMnLCB7fSksICgwLCBfZ2V0W1wiZGVmYXVsdFwiXSkocGFyYW1ldGVycywgJ29wdGlvbnMnLCB7fSkpKVxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuY2xlYXJEZWNvcmF0b3JzID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9nbG9iYWxEZWNvcmF0b3JzID0gW107XG4gIH07XG5cbiAgdGhpcy5zdG9yaWVzT2YgPSBmdW5jdGlvbiAoa2luZCwgbSkge1xuICAgIGlmICgha2luZCAmJiB0eXBlb2Yga2luZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGtpbmQgcHJvdmlkZWQgZm9yIHN0b3JpZXMsIHNob3VsZCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmICghbSkge1xuICAgICAgX2NsaWVudExvZ2dlci5sb2dnZXIud2FybihcIk1pc3NpbmcgJ21vZHVsZScgcGFyYW1ldGVyIGZvciBzdG9yeSB3aXRoIGEga2luZCBvZiAnXCIuY29uY2F0KGtpbmQsIFwiJy4gSXQgd2lsbCBicmVhayB5b3VyIEhNUlwiKSk7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbS5ob3QgJiYgbS5ob3QuZGlzcG9zZSkge1xuICAgICAgbS5ob3QuZGlzcG9zZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfc3RvcnlTdG9yZSA9IF90aGlzLl9zdG9yeVN0b3JlO1xuXG4gICAgICAgIF9zdG9yeVN0b3JlLnJlbW92ZSgpOyAvLyBUT0RPOiByZWZhY3RvciB0aGlzXG4gICAgICAgIC8vIE1heWJlIG5vdCBuZWVkZWQgYXQgYWxsIGlmIHN0b3JpZXMgY2FuIGp1c3QgYmUgb3ZlcndyaXRlbiA/XG5cblxuICAgICAgICBfdGhpcy5fc3RvcnlTdG9yZS5yZW1vdmVTdG9yeUtpbmQoa2luZCk7XG5cbiAgICAgICAgX3RoaXMuX3N0b3J5U3RvcmUuaW5jcmVtZW50UmV2aXNpb24oKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBsb2NhbERlY29yYXRvcnMgPSBbXTtcbiAgICB2YXIgbG9jYWxQYXJhbWV0ZXJzID0ge307XG4gICAgdmFyIGhhc0FkZGVkID0gZmFsc2U7XG4gICAgdmFyIGFwaSA9IHtcbiAgICAgIGtpbmQ6IGtpbmRcbiAgICB9OyAvLyBhcHBseSBhZGRvbnNcblxuICAgIE9iamVjdC5rZXlzKF90aGlzLl9hZGRvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIHZhciBhZGRvbiA9IF90aGlzLl9hZGRvbnNbbmFtZV07XG5cbiAgICAgIGFwaVtuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZG9uLmFwcGx5KGFwaSwgYXJncyk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXBpLmFkZCA9IGZ1bmN0aW9uIChzdG9yeU5hbWUsIHN0b3J5Rm4sIHBhcmFtZXRlcnMpIHtcbiAgICAgIGhhc0FkZGVkID0gdHJ1ZTtcbiAgICAgIHZhciBfZ2xvYmFsUGFyYW1ldGVycyA9IF90aGlzLl9nbG9iYWxQYXJhbWV0ZXJzLFxuICAgICAgICAgIF9nbG9iYWxEZWNvcmF0b3JzID0gX3RoaXMuX2dsb2JhbERlY29yYXRvcnM7XG4gICAgICB2YXIgaWQgPSAoMCwgX3V0aWxzLnRvSWQpKGtpbmQsIHN0b3J5TmFtZSk7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3RvcnlOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9yIG1pc3Npbmcgc3RvcnlOYW1lIHByb3ZpZGVkIGZvciBhIFxcXCJcIi5jb25jYXQoa2luZCwgXCJcXFwiIHN0b3J5LlwiKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtICYmIG0uaG90ICYmIG0uaG90LmRpc3Bvc2UpIHtcbiAgICAgICAgbS5ob3QuZGlzcG9zZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF9zdG9yeVN0b3JlID0gX3RoaXMuX3N0b3J5U3RvcmU7XG5cbiAgICAgICAgICBfc3RvcnlTdG9yZS5yZW1vdmUoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbGVOYW1lID0gbSAmJiBtLmlkID8gXCJcIi5jb25jYXQobS5pZCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBfdGhpcyRnZXRTZXBhcmF0b3JzID0gX3RoaXMuZ2V0U2VwYXJhdG9ycygpLFxuICAgICAgICAgIGhpZXJhcmNoeVJvb3RTZXBhcmF0b3IgPSBfdGhpcyRnZXRTZXBhcmF0b3JzLmhpZXJhcmNoeVJvb3RTZXBhcmF0b3IsXG4gICAgICAgICAgaGllcmFyY2h5U2VwYXJhdG9yID0gX3RoaXMkZ2V0U2VwYXJhdG9ycy5oaWVyYXJjaHlTZXBhcmF0b3I7XG5cbiAgICAgIHZhciBiYXNlT3B0aW9ucyA9IHtcbiAgICAgICAgaGllcmFyY2h5Um9vdFNlcGFyYXRvcjogaGllcmFyY2h5Um9vdFNlcGFyYXRvcixcbiAgICAgICAgaGllcmFyY2h5U2VwYXJhdG9yOiBoaWVyYXJjaHlTZXBhcmF0b3JcbiAgICAgIH07XG4gICAgICB2YXIgYWxsUGFyYW0gPSBbe1xuICAgICAgICBvcHRpb25zOiBiYXNlT3B0aW9uc1xuICAgICAgfSwgX2dsb2JhbFBhcmFtZXRlcnMsIGxvY2FsUGFyYW1ldGVycywgcGFyYW1ldGVyc10ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHApIHtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhwKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgdmFyIF9yZWYzID0gX3NsaWNlZFRvQXJyYXkoX3JlZjIsIDIpLFxuICAgICAgICAgICAgICAgIGtleSA9IF9yZWYzWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3JlZjNbMV07XG5cbiAgICAgICAgICAgIHZhciBleGlzdGluZ1ZhbHVlID0gYWNjW2tleV07XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgX2lzUGxhaW5PYmplY3RbXCJkZWZhdWx0XCJdKSh2YWx1ZSkgJiYgKDAsIF9pc1BsYWluT2JqZWN0W1wiZGVmYXVsdFwiXSkoZXhpc3RpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgYWNjW2tleV0gPSBtZXJnZShleGlzdGluZ1ZhbHVlLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHtcbiAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuX3N0b3J5U3RvcmUuYWRkU3Rvcnkoe1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGtpbmQ6IGtpbmQsXG4gICAgICAgIG5hbWU6IHN0b3J5TmFtZSxcbiAgICAgICAgc3RvcnlGbjogc3RvcnlGbixcbiAgICAgICAgcGFyYW1ldGVyczogYWxsUGFyYW1cbiAgICAgIH0sIHtcbiAgICAgICAgYXBwbHlEZWNvcmF0b3JzOiBfdGhpcy5fZGVjb3JhdGVTdG9yeSxcbiAgICAgICAgZ2V0RGVjb3JhdG9yczogZnVuY3Rpb24gZ2V0RGVjb3JhdG9ycygpIHtcbiAgICAgICAgICByZXR1cm4gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShhbGxQYXJhbS5kZWNvcmF0b3JzIHx8IFtdKSwgbG9jYWxEZWNvcmF0b3JzLCBfdG9Db25zdW1hYmxlQXJyYXkoX2dsb2JhbERlY29yYXRvcnMpLCBbd2l0aFN1YnNjcmlwdGlvblRyYWNraW5nXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBpO1xuICAgIH07XG5cbiAgICBhcGkuYWRkRGVjb3JhdG9yID0gZnVuY3Rpb24gKGRlY29yYXRvcikge1xuICAgICAgaWYgKGhhc0FkZGVkKSB7XG4gICAgICAgIF9jbGllbnRMb2dnZXIubG9nZ2VyLndhcm4oXCJZb3UgaGF2ZSBhZGRlZCBhIGRlY29yYXRvciB0byB0aGUga2luZCAnXCIuY29uY2F0KGtpbmQsIFwiJyBhZnRlciBhIHN0b3J5IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQuXFxuSW4gU3Rvcnlib29rIDQgdGhpcyBhcHBsaWVkIHRoZSBkZWNvcmF0b3Igb25seSB0byBzdWJzZXF1ZW50IHN0b3JpZXMuIEluIFN0b3J5Ym9vayA1KyBpdCBhcHBsaWVzIHRvIGFsbCBzdG9yaWVzLlxcblRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IGludGVuZGVkLiBSZWFkIG1vcmUgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3N0b3J5Ym9va2pzL3N0b3J5Ym9vay9ibG9iL21hc3Rlci9NSUdSQVRJT04ubWRcIikpO1xuICAgICAgfVxuXG4gICAgICBsb2NhbERlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9O1xuXG4gICAgYXBpLmFkZFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAocGFyYW1ldGVycykge1xuICAgICAgbG9jYWxQYXJhbWV0ZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgbG9jYWxQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfTtcblxuICAgIHJldHVybiBhcGk7XG4gIH07XG5cbiAgdGhpcy5nZXRTdG9yeWJvb2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzLl9zdG9yeVN0b3JlLmdldFN0b3J5S2luZHMoKS5tYXAoZnVuY3Rpb24gKGtpbmQpIHtcbiAgICAgIHZhciBmaWxlTmFtZSA9IF90aGlzLl9zdG9yeVN0b3JlLmdldFN0b3J5RmlsZU5hbWUoa2luZCk7XG5cbiAgICAgIHZhciBzdG9yaWVzID0gX3RoaXMuX3N0b3J5U3RvcmUuZ2V0U3RvcmllcyhraW5kKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIHJlbmRlciA9IF90aGlzLl9zdG9yeVN0b3JlLmdldFN0b3J5V2l0aENvbnRleHQoa2luZCwgbmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgIHJlbmRlcjogcmVuZGVyXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lLFxuICAgICAgICBzdG9yaWVzOiBzdG9yaWVzXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMucmF3ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpcy5fc3RvcnlTdG9yZS5yYXcoKTtcbiAgfTtcblxuICB0aGlzLnN0b3JlID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpcy5fc3RvcnlTdG9yZTtcbiAgfTtcblxuICB0aGlzLl9zdG9yeVN0b3JlID0gc3RvcnlTdG9yZTtcbiAgdGhpcy5fYWRkb25zID0ge307XG4gIHRoaXMuX2dsb2JhbERlY29yYXRvcnMgPSBbXTtcbiAgdGhpcy5fZ2xvYmFsUGFyYW1ldGVycyA9IHt9O1xuICB0aGlzLl9kZWNvcmF0ZVN0b3J5ID0gZGVjb3JhdGVTdG9yeTtcblxuICBpZiAoIXN0b3J5U3RvcmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0b3J5U3RvcmUgaXMgcmVxdWlyZWQnKTtcbiAgfVxufTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBDbGllbnRBcGk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICByZXN1bHQgPSBuZXcgQygpO1xuICAgIGZvciAoOyEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZ1xuICAgICAgICA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKVxuICAgICAgICA6IHN0ZXAudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IHJlZHVjZSwgcmVkdWNlUmlnaHQgfWAgbWV0aG9kcyBpbXBsZW1lbnRhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLnJlZHVjZXJpZ2h0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBjYWxsYmFja2ZuLCBhcmd1bWVudHNMZW5ndGgsIG1lbW8sIGlzUmlnaHQpIHtcbiAgYUZ1bmN0aW9uKGNhbGxiYWNrZm4pO1xuICB2YXIgTyA9IHRvT2JqZWN0KHRoYXQpO1xuICB2YXIgc2VsZiA9IEluZGV4ZWRPYmplY3QoTyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBpbmRleCA9IGlzUmlnaHQgPyBsZW5ndGggLSAxIDogMDtcbiAgdmFyIGkgPSBpc1JpZ2h0ID8gLTEgOiAxO1xuICBpZiAoYXJndW1lbnRzTGVuZ3RoIDwgMikgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgICAgbWVtbyA9IHNlbGZbaW5kZXhdO1xuICAgICAgaW5kZXggKz0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCArPSBpO1xuICAgIGlmIChpc1JpZ2h0ID8gaW5kZXggPCAwIDogbGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ1JlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICB9XG4gIH1cbiAgZm9yICg7aXNSaWdodCA/IGluZGV4ID49IDAgOiBsZW5ndGggPiBpbmRleDsgaW5kZXggKz0gaSkgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICBtZW1vID0gY2FsbGJhY2tmbihtZW1vLCBzZWxmW2luZGV4XSwgaW5kZXgsIE8pO1xuICB9XG4gIHJldHVybiBtZW1vO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMnKTtcbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLW9iamVjdCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciBuYXRpdmVBc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gIW5hdGl2ZUFzc2lnbiB8fCByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgc3ltYm9sID0gU3ltYm9sKCk7XG4gIHZhciBhbHBoYWJldCA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbc3ltYm9sXSA9IDc7XG4gIGFscGhhYmV0LnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChjaHIpIHsgQltjaHJdID0gY2hyOyB9KTtcbiAgcmV0dXJuIG5hdGl2ZUFzc2lnbih7fSwgQSlbc3ltYm9sXSAhPSA3IHx8IG9iamVjdEtleXMobmF0aXZlQXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gYWxwaGFiZXQ7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUuZjtcbiAgdmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZjtcbiAgd2hpbGUgKGFyZ3VtZW50c0xlbmd0aCA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJbmRleGVkT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBvYmplY3RLZXlzKFMpLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoUykpIDogb2JqZWN0S2V5cyhTKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGopIGlmIChwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpIFRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiBuYXRpdmVBc3NpZ247XG4iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidHlwZXNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3R5cGVzLnR5cGVzO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlR5cGVzXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF90eXBlcy5UeXBlcztcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1N1cHBvcnRlZFR5cGVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3R5cGVzLmlzU3VwcG9ydGVkVHlwZTtcbiAgfVxufSk7XG5leHBvcnRzLmFkZG9ucyA9IGV4cG9ydHMuQWRkb25TdG9yZSA9IHZvaWQgMDtcblxudmFyIF9nbG9iYWwgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJnbG9iYWxcIikpO1xuXG52YXIgX2NsaWVudExvZ2dlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBzdG9yeWJvb2svY2xpZW50LWxvZ2dlclwiKSk7XG5cbnZhciBfdHlwZXMgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBBZGRvblN0b3JlID0gZnVuY3Rpb24gQWRkb25TdG9yZSgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQWRkb25TdG9yZSk7XG5cbiAgdGhpcy5sb2FkZXJzID0ge307XG4gIHRoaXMuZWxlbWVudHMgPSB7fTtcbiAgdGhpcy5jaGFubmVsID0gdm9pZCAwO1xuXG4gIHRoaXMuZ2V0Q2hhbm5lbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyB0aGlzLmNoYW5uZWwgc2hvdWxkIGdldCBvdmVyd3JpdHRlbiBieSBzZXRDaGFubmVsLiBJZiBpdCB3YXNuJ3QgY2FsbGVkIChlLmcuIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50KSwgdGhyb3cuXG4gICAgaWYgKCFfdGhpcy5jaGFubmVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY2Vzc2luZyBub24tZXhpc3RlbnQgYWRkb25zIGNoYW5uZWwsIHNlZSBodHRwczovL3N0b3J5Ym9vay5qcy5vcmcvYmFzaWNzL2ZhcS8jd2h5LWlzLXRoZXJlLW5vLWFkZG9ucy1jaGFubmVsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzLmNoYW5uZWw7XG4gIH07XG5cbiAgdGhpcy5oYXNDaGFubmVsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIV90aGlzLmNoYW5uZWw7XG4gIH07XG5cbiAgdGhpcy5zZXRDaGFubmVsID0gZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICBfdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiAgfTtcblxuICB0aGlzLmdldEVsZW1lbnRzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAoIV90aGlzLmVsZW1lbnRzW3R5cGVdKSB7XG4gICAgICBfdGhpcy5lbGVtZW50c1t0eXBlXSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t0eXBlXTtcbiAgfTtcblxuICB0aGlzLmFkZFBhbmVsID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICBfdGhpcy5hZGQobmFtZSwgT2JqZWN0LmFzc2lnbih7XG4gICAgICB0eXBlOiBfdHlwZXMudHlwZXMuUEFORUxcbiAgICB9LCBvcHRpb25zKSk7XG4gIH07XG5cbiAgdGhpcy5hZGQgPSBmdW5jdGlvbiAobmFtZSwgYWRkb24pIHtcbiAgICB2YXIgdHlwZSA9IGFkZG9uLnR5cGU7XG5cbiAgICB2YXIgY29sbGVjdGlvbiA9IF90aGlzLmdldEVsZW1lbnRzKHR5cGUpO1xuXG4gICAgY29sbGVjdGlvbltuYW1lXSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgaWQ6IG5hbWVcbiAgICB9LCBhZGRvbik7XG4gIH07XG5cbiAgdGhpcy5yZWdpc3RlciA9IGZ1bmN0aW9uIChuYW1lLCByZWdpc3RlckNhbGxiYWNrKSB7XG4gICAgaWYgKF90aGlzLmxvYWRlcnNbbmFtZV0pIHtcbiAgICAgIF9jbGllbnRMb2dnZXJbXCJkZWZhdWx0XCJdLndhcm4oXCJcIi5jb25jYXQobmFtZSwgXCIgd2FzIGxvYWRlZCB0d2ljZSwgdGhpcyBjb3VsZCBoYXZlIGJhZCBzaWRlLWVmZmVjdHNcIikpO1xuICAgIH1cblxuICAgIF90aGlzLmxvYWRlcnNbbmFtZV0gPSByZWdpc3RlckNhbGxiYWNrO1xuICB9O1xuXG4gIHRoaXMubG9hZEFkZG9ucyA9IGZ1bmN0aW9uIChhcGkpIHtcbiAgICBPYmplY3QudmFsdWVzKF90aGlzLmxvYWRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUoYXBpKTtcbiAgICB9KTtcbiAgfTtcbn07IC8vIEVuZm9yY2UgYWRkb25zIHN0b3JlIHRvIGJlIGEgc2luZ2xldG9uXG5cblxuZXhwb3J0cy5BZGRvblN0b3JlID0gQWRkb25TdG9yZTtcbnZhciBLRVkgPSAnX19TVE9SWUJPT0tfQURET05TJztcblxuZnVuY3Rpb24gZ2V0QWRkb25zU3RvcmUoKSB7XG4gIGlmICghX2dsb2JhbFtcImRlZmF1bHRcIl1bS0VZXSkge1xuICAgIF9nbG9iYWxbXCJkZWZhdWx0XCJdW0tFWV0gPSBuZXcgQWRkb25TdG9yZSgpO1xuICB9XG5cbiAgcmV0dXJuIF9nbG9iYWxbXCJkZWZhdWx0XCJdW0tFWV07XG59IC8vIEV4cG9ydGluZyB0aGlzIHR3aWNlIGluIG9yZGVyIHRvIHRvIGJlIGFibGUgdG8gaW1wb3J0IGl0IGxpa2UgeyBhZGRvbnMgfSBpbnN0ZWFkIG9mICdhZGRvbnMnXG4vLyBwcmVmZXIgaW1wb3J0IHsgYWRkb25zIH0gZnJvbSAnQHN0b3J5Ym9vay9hZGRvbnMnIG92ZXIgaW1wb3J0IGFkZG9ucyBmcm9tICdAc3Rvcnlib29rL2FkZG9ucydcbi8vXG4vLyBTZWUgcHVibGljX2FwaS50c1xuXG5cbnZhciBhZGRvbnMgPSBnZXRBZGRvbnNTdG9yZSgpO1xuZXhwb3J0cy5hZGRvbnMgPSBhZGRvbnM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC52YWx1ZXNcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlzU3VwcG9ydGVkVHlwZSA9IGlzU3VwcG9ydGVkVHlwZTtcbmV4cG9ydHMudHlwZXMgPSB2b2lkIDA7XG52YXIgdHlwZXM7XG5leHBvcnRzLnR5cGVzID0gdHlwZXM7XG5cbihmdW5jdGlvbiAodHlwZXMpIHtcbiAgdHlwZXNbXCJUQUJcIl0gPSBcInRhYlwiO1xuICB0eXBlc1tcIlBBTkVMXCJdID0gXCJwYW5lbFwiO1xuICB0eXBlc1tcIlRPT0xcIl0gPSBcInRvb2xcIjtcbiAgdHlwZXNbXCJQUkVWSUVXXCJdID0gXCJwcmV2aWV3XCI7XG4gIHR5cGVzW1wiTk9URVNfRUxFTUVOVFwiXSA9IFwibm90ZXMtZWxlbWVudFwiO1xufSkodHlwZXMgfHwgKGV4cG9ydHMudHlwZXMgPSB0eXBlcyA9IHt9KSk7XG5cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkVHlwZSh0eXBlKSB7XG4gIHJldHVybiAhIU9iamVjdC52YWx1ZXModHlwZXMpLmZpbmQoZnVuY3Rpb24gKHR5cGVWYWwpIHtcbiAgICByZXR1cm4gdHlwZVZhbCA9PT0gdHlwZTtcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWVcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubWFrZURlY29yYXRvciA9IHZvaWQgMDtcblxudmFyIF91dGlsRGVwcmVjYXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwidXRpbC1kZXByZWNhdGVcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxudmFyIG1ha2VEZWNvcmF0b3IgPSBmdW5jdGlvbiBtYWtlRGVjb3JhdG9yKF9yZWYpIHtcbiAgdmFyIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBwYXJhbWV0ZXJOYW1lID0gX3JlZi5wYXJhbWV0ZXJOYW1lLFxuICAgICAgd3JhcHBlciA9IF9yZWYud3JhcHBlcixcbiAgICAgIF9yZWYkc2tpcElmTm9QYXJhbWV0ZSA9IF9yZWYuc2tpcElmTm9QYXJhbWV0ZXJzT3JPcHRpb25zLFxuICAgICAgc2tpcElmTm9QYXJhbWV0ZXJzT3JPcHRpb25zID0gX3JlZiRza2lwSWZOb1BhcmFtZXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkc2tpcElmTm9QYXJhbWV0ZSxcbiAgICAgIF9yZWYkYWxsb3dEZXByZWNhdGVkVSA9IF9yZWYuYWxsb3dEZXByZWNhdGVkVXNhZ2UsXG4gICAgICBhbGxvd0RlcHJlY2F0ZWRVc2FnZSA9IF9yZWYkYWxsb3dEZXByZWNhdGVkVSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGFsbG93RGVwcmVjYXRlZFU7XG5cbiAgdmFyIGRlY29yYXRvciA9IGZ1bmN0aW9uIGRlY29yYXRvcihvcHRpb25zKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChnZXRTdG9yeSwgY29udGV4dCkge1xuICAgICAgdmFyIHBhcmFtZXRlcnMgPSBjb250ZXh0LnBhcmFtZXRlcnMgJiYgY29udGV4dC5wYXJhbWV0ZXJzW3BhcmFtZXRlck5hbWVdO1xuXG4gICAgICBpZiAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmRpc2FibGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFN0b3J5KGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2tpcElmTm9QYXJhbWV0ZXJzT3JPcHRpb25zICYmICFvcHRpb25zICYmICFwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBnZXRTdG9yeShjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdyYXBwZXIoZ2V0U3RvcnksIGNvbnRleHQsIHtcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICAgICAgfSk7XG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICAvLyBVc2VkIHdpdGhvdXQgb3B0aW9ucyBhcyAuYWRkRGVjb3JhdG9yKGRlY29yYXRvcilcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0b3IoKS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGlubmVyQXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBpbm5lckFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlZCBhcyBbLl1hZGREZWNvcmF0b3IoZGVjb3JhdG9yKG9wdGlvbnMpKVxuICAgICAgaWYgKGlubmVyQXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiBkZWNvcmF0b3IuYXBwbHkodm9pZCAwLCBhcmdzKS5hcHBseSh2b2lkIDAsIGlubmVyQXJncyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhbGxvd0RlcHJlY2F0ZWRVc2FnZSkge1xuICAgICAgICAvLyBVc2VkIHRvIHdyYXAgYSBzdG9yeSBkaXJlY3RseSAuYWRkKCdzdG9yeScsIGRlY29yYXRvcihvcHRpb25zKSgoKSA9PiA8U3RvcnkgLz4pKVxuICAgICAgICAvLyAgIFRoaXMgaXMgbm93IGRlcHJlY2F0ZWQ6XG4gICAgICAgIHJldHVybiAoMCwgX3V0aWxEZXByZWNhdGVbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgIHJldHVybiBkZWNvcmF0b3IuYXBwbHkodm9pZCAwLCBhcmdzKShpbm5lckFyZ3NbMF0sIGNvbnRleHQpO1xuICAgICAgICB9LCBcIlBhc3Npbmcgc3RvcmllcyBkaXJlY3RseSBpbnRvIFwiLmNvbmNhdChuYW1lLCBcIigpIGlzIGRlcHJlY2F0ZWQsXFxuICAgICAgICAgIGluc3RlYWQgdXNlIGFkZERlY29yYXRvcihcIikuY29uY2F0KG5hbWUsIFwiKSBhbmQgcGFzcyBvcHRpb25zIHdpdGggdGhlICdcIikuY29uY2F0KHBhcmFtZXRlck5hbWUsIFwiJyBwYXJhbWV0ZXJcIikpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXNzaW5nIHN0b3JpZXMgZGlyZWN0bHkgaW50byBcIi5jb25jYXQobmFtZSwgXCIoKSBpcyBub3QgYWxsb3dlZCxcXG4gICAgICAgIGluc3RlYWQgdXNlIGFkZERlY29yYXRvcihcIikuY29uY2F0KG5hbWUsIFwiKSBhbmQgcGFzcyBvcHRpb25zIHdpdGggdGhlICdcIikuY29uY2F0KHBhcmFtZXRlck5hbWUsIFwiJyBwYXJhbWV0ZXJcIikpO1xuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnRzLm1ha2VEZWNvcmF0b3IgPSBtYWtlRGVjb3JhdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLm1vY2tDaGFubmVsID0gbW9ja0NoYW5uZWw7XG5cbnZhciBfY2hhbm5lbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAc3Rvcnlib29rL2NoYW5uZWxzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG1vY2tDaGFubmVsKCkge1xuICB2YXIgdHJhbnNwb3J0ID0ge1xuICAgIHNldEhhbmRsZXI6IGZ1bmN0aW9uIHNldEhhbmRsZXIoKSB7fSxcbiAgICBzZW5kOiBmdW5jdGlvbiBzZW5kKCkge31cbiAgfTtcbiAgcmV0dXJuIG5ldyBfY2hhbm5lbHNbXCJkZWZhdWx0XCJdKHtcbiAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydFxuICB9KTtcbn0iLCJ2YXIgc2NvcGUgPSAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwpIHx8XG4gICAgICAgICAgICAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZikgfHxcbiAgICAgICAgICAgIHdpbmRvdztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHNjb3BlLCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbi8vIE9uIHNvbWUgZXhvdGljIGVudmlyb25tZW50cywgaXQncyBub3QgY2xlYXIgd2hpY2ggb2JqZWN0IGBzZXRpbW1lZGlhdGVgIHdhc1xuLy8gYWJsZSB0byBpbnN0YWxsIG9udG8uICBTZWFyY2ggZWFjaCBwb3NzaWJpbGl0eSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVcbi8vIGBzZXRpbW1lZGlhdGVgIGxpYnJhcnkuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLnNldEltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5zZXRJbW1lZGlhdGUpO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9ICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLmNsZWFySW1tZWRpYXRlKTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCB1bmRlZmluZWQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChnbG9iYWwuc2V0SW1tZWRpYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEhhbmRsZSA9IDE7IC8vIFNwZWMgc2F5cyBncmVhdGVyIHRoYW4gemVyb1xuICAgIHZhciB0YXNrc0J5SGFuZGxlID0ge307XG4gICAgdmFyIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gICAgdmFyIHJlZ2lzdGVySW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBDYWxsYmFjayBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjYWxsYmFjayA9IG5ldyBGdW5jdGlvbihcIlwiICsgY2FsbGJhY2spO1xuICAgICAgfVxuICAgICAgLy8gQ29weSBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDFdO1xuICAgICAgfVxuICAgICAgLy8gU3RvcmUgYW5kIHJlZ2lzdGVyIHRoZSB0YXNrXG4gICAgICB2YXIgdGFzayA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLCBhcmdzOiBhcmdzIH07XG4gICAgICB0YXNrc0J5SGFuZGxlW25leHRIYW5kbGVdID0gdGFzaztcbiAgICAgIHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpO1xuICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW4odGFzaykge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSB0YXNrLmNhbGxiYWNrO1xuICAgICAgICB2YXIgYXJncyA9IHRhc2suYXJncztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhbGxiYWNrKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bih0YXNrKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkgeyBydW5JZlByZXNlbnQoaGFuZGxlKTsgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FuVXNlUG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIFRoZSB0ZXN0IGFnYWluc3QgYGltcG9ydFNjcmlwdHNgIHByZXZlbnRzIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyBpbnN0YWxsZWQgaW5zaWRlIGEgd2ViIHdvcmtlcixcbiAgICAgICAgLy8gd2hlcmUgYGdsb2JhbC5wb3N0TWVzc2FnZWAgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFuZCBjYW4ndCBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuXG4gICAgICAgIGlmIChnbG9iYWwucG9zdE1lc3NhZ2UgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IHRydWU7XG4gICAgICAgICAgICB2YXIgb2xkT25NZXNzYWdlID0gZ2xvYmFsLm9ubWVzc2FnZTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKFwiXCIsIFwiKlwiKTtcbiAgICAgICAgICAgIGdsb2JhbC5vbm1lc3NhZ2UgPSBvbGRPbk1lc3NhZ2U7XG4gICAgICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICAvLyBJbnN0YWxscyBhbiBldmVudCBoYW5kbGVyIG9uIGBnbG9iYWxgIGZvciB0aGUgYG1lc3NhZ2VgIGV2ZW50OiBzZWVcbiAgICAgICAgLy8gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9ET00vd2luZG93LnBvc3RNZXNzYWdlXG4gICAgICAgIC8vICogaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvY29tbXMuaHRtbCNjcm9zc0RvY3VtZW50TWVzc2FnZXNcblxuICAgICAgICB2YXIgbWVzc2FnZVByZWZpeCA9IFwic2V0SW1tZWRpYXRlJFwiICsgTWF0aC5yYW5kb20oKSArIFwiJFwiO1xuICAgICAgICB2YXIgb25HbG9iYWxNZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IGdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudC5kYXRhID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KCtldmVudC5kYXRhLnNsaWNlKG1lc3NhZ2VQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlLCBmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbm1lc3NhZ2VcIiwgb25HbG9iYWxNZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGh0bWwgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIElmIHN1cHBvcnRlZCwgd2Ugc2hvdWxkIGF0dGFjaCB0byB0aGUgcHJvdG90eXBlIG9mIGdsb2JhbCwgc2luY2UgdGhhdCBpcyB3aGVyZSBzZXRUaW1lb3V0IGV0IGFsLiBsaXZlLlxuICAgIHZhciBhdHRhY2hUbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsKTtcbiAgICBhdHRhY2hUbyA9IGF0dGFjaFRvICYmIGF0dGFjaFRvLnNldFRpbWVvdXQgPyBhdHRhY2hUbyA6IGdsb2JhbDtcblxuICAgIC8vIERvbid0IGdldCBmb29sZWQgYnkgZS5nLiBicm93c2VyaWZ5IGVudmlyb25tZW50cy5cbiAgICBpZiAoe30udG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09IFwiW29iamVjdCBwcm9jZXNzXVwiKSB7XG4gICAgICAgIC8vIEZvciBOb2RlLmpzIGJlZm9yZSAwLjlcbiAgICAgICAgaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoY2FuVXNlUG9zdE1lc3NhZ2UoKSkge1xuICAgICAgICAvLyBGb3Igbm9uLUlFMTAgbW9kZXJuIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxQb3N0TWVzc2FnZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAvLyBGb3Igd2ViIHdvcmtlcnMsIHdoZXJlIHN1cHBvcnRlZFxuICAgICAgICBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChkb2MgJiYgXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIiBpbiBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSkge1xuICAgICAgICAvLyBGb3IgSUUgNuKAkzhcbiAgICAgICAgaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIG9sZGVyIGJyb3dzZXJzXG4gICAgICAgIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBhdHRhY2hUby5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGU7XG4gICAgYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGUgPSBjbGVhckltbWVkaWF0ZTtcbn0odHlwZW9mIHNlbGYgPT09IFwidW5kZWZpbmVkXCIgPyB0eXBlb2YgZ2xvYmFsID09PSBcInVuZGVmaW5lZFwiID8gdGhpcyA6IGdsb2JhbCA6IHNlbGYpKTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJyk7XG52YXIgRk9SQ0VEID0gIWdsb2JhbC5zZXRJbW1lZGlhdGUgfHwgIWdsb2JhbC5jbGVhckltbWVkaWF0ZTtcblxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgZ2xvYmFsOiB0cnVlLCBiaW5kOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCB9LCB7XG4gIHNldEltbWVkaWF0ZTogdGFzay5zZXQsXG4gIGNsZWFySW1tZWRpYXRlOiB0YXNrLmNsZWFyXG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXJcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGhcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvclwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucGFyc2VLaW5kID0gZXhwb3J0cy5nZXRNYXRjaCA9IGV4cG9ydHMuc3RyaW5naWZ5UXVlcnkgPSBleHBvcnRzLnF1ZXJ5RnJvbUxvY2F0aW9uID0gZXhwb3J0cy5xdWVyeUZyb21TdHJpbmcgPSBleHBvcnRzLnBhcnNlUGF0aCA9IGV4cG9ydHMudG9JZCA9IGV4cG9ydHMuc2FuaXRpemUgPSBleHBvcnRzLmtub3duTm9uVmlld01vZGVzUmVnZXggPSB2b2lkIDA7XG5cbnZhciBfcXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJxc1wiKSk7XG5cbnZhciBfbWVtb2l6ZXJpZmljID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibWVtb2l6ZXJpZmljXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIga25vd25Ob25WaWV3TW9kZXNSZWdleCA9IC8oc2V0dGluZ3MpLztcbmV4cG9ydHMua25vd25Ob25WaWV3TW9kZXNSZWdleCA9IGtub3duTm9uVmlld01vZGVzUmVnZXg7XG52YXIgc3BsaXRQYXRoUmVnZXggPSAvXFwvKFteL10rKVxcLyhbXi9dKyk/LzsgLy8gUmVtb3ZlIHB1bmN0dWF0aW9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2RhdmlkanJpY2UvOWQyYWY1MTEwMGU0MWM2YzRiNGFcblxudmFyIHNhbml0aXplID0gZnVuY3Rpb24gc2FuaXRpemUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgLnJlcGxhY2UoL1sg4oCZ4oCT4oCU4oCV4oCywr8nYH4hQCMkJV4mKigpX3wrXFwtPT87OidcIiwuPD5cXHtcXH1cXFtcXF1cXFxcXFwvXS9naSwgJy0nKS5yZXBsYWNlKC8tKy9nLCAnLScpLnJlcGxhY2UoL14tKy8sICcnKS5yZXBsYWNlKC8tKyQvLCAnJyk7XG59O1xuXG5leHBvcnRzLnNhbml0aXplID0gc2FuaXRpemU7XG5cbnZhciBzYW5pdGl6ZVNhZmUgPSBmdW5jdGlvbiBzYW5pdGl6ZVNhZmUoc3RyaW5nLCBwYXJ0KSB7XG4gIHZhciBzYW5pdGl6ZWQgPSBzYW5pdGl6ZShzdHJpbmcpO1xuXG4gIGlmIChzYW5pdGl6ZWQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBcIi5jb25jYXQocGFydCwgXCIgJ1wiKS5jb25jYXQoc3RyaW5nLCBcIicsIG11c3QgaW5jbHVkZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1wiKSk7XG4gIH1cblxuICByZXR1cm4gc2FuaXRpemVkO1xufTtcblxudmFyIHRvSWQgPSBmdW5jdGlvbiB0b0lkKGtpbmQsIG5hbWUpIHtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHNhbml0aXplU2FmZShraW5kLCAna2luZCcpLCBcIi0tXCIpLmNvbmNhdChzYW5pdGl6ZVNhZmUobmFtZSwgJ25hbWUnKSk7XG59O1xuXG5leHBvcnRzLnRvSWQgPSB0b0lkO1xudmFyIHBhcnNlUGF0aCA9ICgwLCBfbWVtb2l6ZXJpZmljW1wiZGVmYXVsdFwiXSkoMTAwMCkoZnVuY3Rpb24gKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB2aWV3TW9kZTogdW5kZWZpbmVkLFxuICAgIHN0b3J5SWQ6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGlmIChwYXRoKSB7XG4gICAgdmFyIF9yZWYgPSBwYXRoLm1hdGNoKHNwbGl0UGF0aFJlZ2V4KSB8fCBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0sXG4gICAgICAgIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMyksXG4gICAgICAgIHZpZXdNb2RlID0gX3JlZjJbMV0sXG4gICAgICAgIHN0b3J5SWQgPSBfcmVmMlsyXTtcblxuICAgIGlmICh2aWV3TW9kZSAmJiAhdmlld01vZGUubWF0Y2goa25vd25Ob25WaWV3TW9kZXNSZWdleCkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIHZpZXdNb2RlOiB2aWV3TW9kZSxcbiAgICAgICAgc3RvcnlJZDogc3RvcnlJZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuZXhwb3J0cy5wYXJzZVBhdGggPSBwYXJzZVBhdGg7XG52YXIgcXVlcnlGcm9tU3RyaW5nID0gKDAsIF9tZW1vaXplcmlmaWNbXCJkZWZhdWx0XCJdKSgxMDAwKShmdW5jdGlvbiAocykge1xuICByZXR1cm4gX3FzW1wiZGVmYXVsdFwiXS5wYXJzZShzLCB7XG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IHRydWVcbiAgfSk7XG59KTtcbmV4cG9ydHMucXVlcnlGcm9tU3RyaW5nID0gcXVlcnlGcm9tU3RyaW5nO1xuXG52YXIgcXVlcnlGcm9tTG9jYXRpb24gPSBmdW5jdGlvbiBxdWVyeUZyb21Mb2NhdGlvbihsb2NhdGlvbikge1xuICByZXR1cm4gcXVlcnlGcm9tU3RyaW5nKGxvY2F0aW9uLnNlYXJjaCk7XG59O1xuXG5leHBvcnRzLnF1ZXJ5RnJvbUxvY2F0aW9uID0gcXVlcnlGcm9tTG9jYXRpb247XG5cbnZhciBzdHJpbmdpZnlRdWVyeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeVF1ZXJ5KHF1ZXJ5KSB7XG4gIHJldHVybiBfcXNbXCJkZWZhdWx0XCJdLnN0cmluZ2lmeShxdWVyeSwge1xuICAgIGFkZFF1ZXJ5UHJlZml4OiB0cnVlLFxuICAgIGVuY29kZTogZmFsc2VcbiAgfSk7XG59O1xuXG5leHBvcnRzLnN0cmluZ2lmeVF1ZXJ5ID0gc3RyaW5naWZ5UXVlcnk7XG52YXIgZ2V0TWF0Y2ggPSAoMCwgX21lbW9pemVyaWZpY1tcImRlZmF1bHRcIl0pKDEwMDApKGZ1bmN0aW9uIChjdXJyZW50LCB0YXJnZXQpIHtcbiAgdmFyIHN0YXJ0c1dpdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIHZhciBzdGFydHNXaXRoVGFyZ2V0ID0gY3VycmVudCAmJiBzdGFydHNXaXRoICYmIGN1cnJlbnQuc3RhcnRzV2l0aCh0YXJnZXQpO1xuICB2YXIgY3VycmVudElzVGFyZ2V0ID0gdHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycgJiYgY3VycmVudCA9PT0gdGFyZ2V0O1xuICB2YXIgbWF0Y2hUYXJnZXQgPSBjdXJyZW50ICYmIHRhcmdldCAmJiBjdXJyZW50Lm1hdGNoKHRhcmdldCk7XG5cbiAgaWYgKHN0YXJ0c1dpdGhUYXJnZXQgfHwgY3VycmVudElzVGFyZ2V0IHx8IG1hdGNoVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IGN1cnJlbnRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59KTtcbmV4cG9ydHMuZ2V0TWF0Y2ggPSBnZXRNYXRjaDtcblxudmFyIHBhcnNlS2luZCA9IGZ1bmN0aW9uIHBhcnNlS2luZChraW5kLCBfcmVmMykge1xuICB2YXIgcm9vdFNlcGFyYXRvciA9IF9yZWYzLnJvb3RTZXBhcmF0b3IsXG4gICAgICBncm91cFNlcGFyYXRvciA9IF9yZWYzLmdyb3VwU2VwYXJhdG9yO1xuXG4gIHZhciBfa2luZCRzcGxpdCA9IGtpbmQuc3BsaXQocm9vdFNlcGFyYXRvciwgMiksXG4gICAgICBfa2luZCRzcGxpdDIgPSBfc2xpY2VkVG9BcnJheShfa2luZCRzcGxpdCwgMiksXG4gICAgICByb290ID0gX2tpbmQkc3BsaXQyWzBdLFxuICAgICAgcmVtYWluZGVyID0gX2tpbmQkc3BsaXQyWzFdO1xuXG4gIHZhciBncm91cHMgPSAocmVtYWluZGVyIHx8IGtpbmQpLnNwbGl0KGdyb3VwU2VwYXJhdG9yKS5maWx0ZXIoZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gISFpO1xuICB9KTsgLy8gd2hlbiB0aGVyZSdzIG5vIHJlbWFpbmRlciwgaXQgbWVhbnMgdGhlIHJvb3Qgd2Fzbid0IGZvdW5kL3NwbGl0XG5cbiAgcmV0dXJuIHtcbiAgICByb290OiByZW1haW5kZXIgPyByb290IDogbnVsbCxcbiAgICBncm91cHM6IGdyb3Vwc1xuICB9O1xufTtcblxuZXhwb3J0cy5wYXJzZUtpbmQgPSBwYXJzZUtpbmQ7IiwiLy8gYFNhbWVWYWx1ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zYW1ldmFsdWVcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmlzIHx8IGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4geCA9PT0geSA/IHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5IDogeCAhPSB4ICYmIHkgIT0geTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tbGVuZ3RoJyk7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZ2V4cC1leGVjJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcbnZhciBhcnJheVB1c2ggPSBbXS5wdXNoO1xudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIE1BWF9VSU5UMzIgPSAweEZGRkZGRkZGO1xuXG4vLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ3gnLCAneScpIC0+IC94L3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gIVJlZ0V4cChNQVhfVUlOVDMyLCAneScpOyB9KTtcblxuLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZpeC1yZWdleHAtd2VsbC1rbm93bi1zeW1ib2wtbG9naWMnKShcbiAgJ3NwbGl0JyxcbiAgMixcbiAgZnVuY3Rpb24gKFNQTElULCBuYXRpdmVTcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gICAgdmFyIGludGVybmFsU3BsaXQ7XG4gICAgaWYgKFxuICAgICAgJ2FiYmMnLnNwbGl0KC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgICAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9IDQgfHxcbiAgICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT0gMiB8fFxuICAgICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPSA0IHx8XG4gICAgICAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxIHx8XG4gICAgICAnJy5zcGxpdCgvLj8vKS5sZW5ndGhcbiAgICApIHtcbiAgICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSk7XG4gICAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtzdHJpbmddO1xuICAgICAgICAvLyBJZiBgc2VwYXJhdG9yYCBpcyBub3QgYSByZWdleCwgdXNlIG5hdGl2ZSBzcGxpdFxuICAgICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICByZXR1cm4gbmF0aXZlU3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgIHZhciBmbGFncyA9IChzZXBhcmF0b3IuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5zdGlja3kgPyAneScgOiAnJyk7XG4gICAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDtcbiAgICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgICAgdmFyIHNlcGFyYXRvckNvcHkgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgJ2cnKTtcbiAgICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgICAgbGFzdEluZGV4ID0gc2VwYXJhdG9yQ29weS5sYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKGxhc3RJbmRleCA+IGxhc3RMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmcubGVuZ3RoKSBhcnJheVB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID49IGxpbSkgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleCA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHkubGFzdEluZGV4Kys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbSA/IG91dHB1dC5zbGljZSgwLCBsaW0pIDogb3V0cHV0O1xuICAgICAgfTtcbiAgICAvLyBDaGFrcmEsIFY4XG4gICAgfSBlbHNlIGlmICgnMCcuc3BsaXQodW5kZWZpbmVkLCAwKS5sZW5ndGgpIHtcbiAgICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6IG5hdGl2ZVNwbGl0LmNhbGwodGhpcywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpbnRlcm5hbFNwbGl0ID0gbmF0aXZlU3BsaXQ7XG5cbiAgICByZXR1cm4gW1xuICAgICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc3BsaXRgIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zcGxpdFxuICAgICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgICB2YXIgTyA9IHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyk7XG4gICAgICAgIHZhciBzcGxpdHRlciA9IHNlcGFyYXRvciA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZXBhcmF0b3JbU1BMSVRdO1xuICAgICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gc3BsaXR0ZXIuY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KVxuICAgICAgICAgIDogaW50ZXJuYWxTcGxpdC5jYWxsKFN0cmluZyhPKSwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB9LFxuICAgICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF1gIG1ldGhvZFxuICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNwbGl0XG4gICAgICAvL1xuICAgICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gdGhlICd5JyBmbGFnLlxuICAgICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShpbnRlcm5hbFNwbGl0LCByZWdleHAsIHRoaXMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSBuYXRpdmVTcGxpdCk7XG4gICAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHZhciBmbGFncyA9IChyeC5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgKFNVUFBPUlRTX1kgPyAneScgOiAnZycpO1xuXG4gICAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAgIC8vIHNpbXVsYXRlIHRoZSAneScgZmxhZy5cbiAgICAgICAgdmFyIHNwbGl0dGVyID0gbmV3IEMoU1VQUE9SVFNfWSA/IHJ4IDogJ14oPzonICsgcnguc291cmNlICsgJyknLCBmbGFncyk7XG4gICAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIGlmIChTLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTKSA9PT0gbnVsbCA/IFtTXSA6IFtdO1xuICAgICAgICB2YXIgcCA9IDA7XG4gICAgICAgIHZhciBxID0gMDtcbiAgICAgICAgdmFyIEEgPSBbXTtcbiAgICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICAgIHNwbGl0dGVyLmxhc3RJbmRleCA9IFNVUFBPUlRTX1kgPyBxIDogMDtcbiAgICAgICAgICB2YXIgeiA9IGNhbGxSZWdFeHBFeGVjKHNwbGl0dGVyLCBTVVBQT1JUU19ZID8gUyA6IFMuc2xpY2UocSkpO1xuICAgICAgICAgIHZhciBlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHogPT09IG51bGwgfHxcbiAgICAgICAgICAgIChlID0gbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBBLnB1c2goUy5zbGljZShwLCBxKSk7XG4gICAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICBBLnB1c2goeltpXSk7XG4gICAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHEgPSBwID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQS5wdXNoKFMuc2xpY2UocCkpO1xuICAgICAgICByZXR1cm4gQTtcbiAgICAgIH1cbiAgICBdO1xuICB9LFxuICAhU1VQUE9SVFNfWVxuKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIFNUQVJUU19XSVRIID0gJ3N0YXJ0c1dpdGgnO1xudmFyIENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJykoU1RBUlRTX1dJVEgpO1xudmFyIG5hdGl2ZVN0YXJ0c1dpdGggPSAnJ1tTVEFSVFNfV0lUSF07XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGhgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5zdGFydHN3aXRoXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhQ09SUkVDVF9JU19SRUdFWFBfTE9HSUMgfSwge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gdmFsaWRhdGVBcmd1bWVudHModGhpcywgc2VhcmNoU3RyaW5nLCBTVEFSVFNfV0lUSCk7XG4gICAgdmFyIGluZGV4ID0gdG9MZW5ndGgoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIHRoYXQubGVuZ3RoKSk7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiBuYXRpdmVTdGFydHNXaXRoXG4gICAgICA/IG5hdGl2ZVN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIiwiLy8gaGVscGVyIGZvciBTdHJpbmcje3N0YXJ0c1dpdGgsIGVuZHNXaXRoLCBpbmNsdWRlc31cbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1yZWdleHAnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZy5wcm90b3R5cGUuJyArIE5BTUUgKyBcIiBkb2Vzbid0IGFjY2VwdCByZWdleFwiKTtcbiAgfSByZXR1cm4gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xufTtcbiIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpKCdtYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChNRVRIT0RfTkFNRSkge1xuICB2YXIgcmVnZXhwID0gLy4vO1xuICB0cnkge1xuICAgICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlZ2V4cFtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAnLy4vJ1tNRVRIT0RfTkFNRV0ocmVnZXhwKTtcbiAgICB9IGNhdGNoIChmKSB7IC8qIGVtcHR5ICovIH1cbiAgfSByZXR1cm4gZmFsc2U7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRzWydkZWZhdWx0J11dLFxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0XG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IG9iai5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChwcmVmaXgsIGtleSkgOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICAgICAgY2hhcnNldFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICBwcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgICAgICBjaGFyc2V0XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG52YXIgbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5jb2RlciAhPT0gbnVsbCAmJiBvcHRzLmVuY29kZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgZGVmYXVsdHMuY2hhcnNldDtcbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICBpZiAodHlwZW9mIG9wdHMuZm9ybWF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoIWhhcy5jYWxsKGZvcm1hdHMuZm9ybWF0dGVycywgb3B0cy5mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGZvcm1hdCBvcHRpb24gcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0ID0gb3B0cy5mb3JtYXQ7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcblxuICAgIHZhciBmaWx0ZXIgPSBkZWZhdWx0cy5maWx0ZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0FycmF5KG9wdHMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRzLmRlbGltaXRlcixcbiAgICAgICAgZW5jb2RlOiB0eXBlb2Ygb3B0cy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlLFxuICAgICAgICBlbmNvZGVyOiB0eXBlb2Ygb3B0cy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcixcbiAgICAgICAgZW5jb2RlVmFsdWVzT25seTogdHlwZW9mIG9wdHMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAob3B0cyAmJiAnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gJ2luZGljZXMnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW2FycmF5Rm9ybWF0XTtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgb3B0aW9ucy5za2lwTnVsbHMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXRcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKSwgdGhlIFwibnVtZXJpYyBlbnRpdHlcIiByZXByZXNlbnRhdGlvbiBvZiBhIGNoZWNrbWFya1xuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JUUyJTlDJTkzJic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVyOiB1dGlscy5kZWNvZGUsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZGVwdGg6IDUsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJiMoXFxkKyk7L2csIGZ1bmN0aW9uICgkMCwgbnVtYmVyU3RyKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG51bWJlclN0ciwgMTApKTtcbiAgICB9KTtcbn07XG5cbi8vIFRoaXMgaXMgd2hhdCBicm93c2VycyB3aWxsIHN1Ym1pdCB3aGVuIHRoZSDinJMgY2hhcmFjdGVyIG9jY3VycyBpbiBhblxuLy8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGJvZHkgYW5kIHRoZSBlbmNvZGluZyBvZiB0aGUgcGFnZSBjb250YWluaW5nXG4vLyB0aGUgZm9ybSBpcyBpc28tODg1OS0xLCBvciB3aGVuIHRoZSBzdWJtaXR0ZWQgZm9ybSBoYXMgYW4gYWNjZXB0LWNoYXJzZXRcbi8vIGF0dHJpYnV0ZSBvZiBpc28tODg1OS0xLiBQcmVzdW1hYmx5IGFsc28gd2l0aCBvdGhlciBjaGFyc2V0cyB0aGF0IGRvIG5vdCBjb250YWluXG4vLyB0aGUg4pyTIGNoYXJhY3Rlciwgc3VjaCBhcyB1cy1hc2NpaS5cbnZhciBpc29TZW50aW5lbCA9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpXG5cbi8vIFRoZXNlIGFyZSB0aGUgcGVyY2VudC1lbmNvZGVkIHV0Zi04IG9jdGV0cyByZXByZXNlbnRpbmcgYSBjaGVja21hcmssIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBhY3R1YWxseSBpcyB1dGYtOCBlbmNvZGVkLlxudmFyIGNoYXJzZXRTZW50aW5lbCA9ICd1dGY4PSVFMiU5QyU5Myc7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZShwb3MgKyAxKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuY29tbWEgJiYgdmFsLmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGxlYWYgPSB2YWw7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJyAmJiBvcHRpb25zLnBhcnNlQXJyYXlzKSB7XG4gICAgICAgICAgICBvYmogPSBbXS5jb25jYXQobGVhZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgICAgICAgIHZhciBjbGVhblJvb3QgPSByb290LmNoYXJBdCgwKSA9PT0gJ1snICYmIHJvb3QuY2hhckF0KHJvb3QubGVuZ3RoIC0gMSkgPT09ICddJyA/IHJvb3Quc2xpY2UoMSwgLTEpIDogcm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGNsZWFuUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGNsZWFuUm9vdCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBvYmogPSB7IDA6IGxlYWYgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIWlzTmFOKGluZGV4KVxuICAgICAgICAgICAgICAgICYmIHJvb3QgIT09IGNsZWFuUm9vdFxuICAgICAgICAgICAgICAgICYmIFN0cmluZyhpbmRleCkgPT09IGNsZWFuUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlICgoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucyk7XG59O1xuXG52YXIgbm9ybWFsaXplUGFyc2VPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlY29kZXIgIT09IG51bGwgJiYgb3B0cy5kZWNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdHMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICB2YXIgY2hhcnNldCA9IHR5cGVvZiBvcHRzLmNoYXJzZXQgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuY2hhcnNldCA6IG9wdHMuY2hhcnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGFsbG93UHJvdG90eXBlczogdHlwZW9mIG9wdHMuYWxsb3dQcm90b3R5cGVzID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93UHJvdG90eXBlcyA6IGRlZmF1bHRzLmFsbG93UHJvdG90eXBlcyxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICBkZXB0aDogdHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInID8gb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsInZhciBiYXNlTWVyZ2UgPSByZXF1aXJlKCcuL19iYXNlTWVyZ2UnKSxcbiAgICBjcmVhdGVBc3NpZ25lciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUFzc2lnbmVyJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgbWVyZ2VkIHZhbHVlcyBvZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZVxuICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICogICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSkge1xuICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdhJzogWzNdLCAnYic6IFs0XSB9O1xuICpcbiAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICogLy8gPT4geyAnYSc6IFsxLCAzXSwgJ2InOiBbMiwgNF0gfVxuICovXG52YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2VXaXRoO1xuIiwidmFyIFN0YWNrID0gcmVxdWlyZSgnLi9fU3RhY2snKSxcbiAgICBhc3NpZ25NZXJnZVZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduTWVyZ2VWYWx1ZScpLFxuICAgIGJhc2VGb3IgPSByZXF1aXJlKCcuL19iYXNlRm9yJyksXG4gICAgYmFzZU1lcmdlRGVlcCA9IHJlcXVpcmUoJy4vX2Jhc2VNZXJnZURlZXAnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBrZXlzSW4gPSByZXF1aXJlKCcuL2tleXNJbicpLFxuICAgIHNhZmVHZXQgPSByZXF1aXJlKCcuL19zYWZlR2V0Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVyZ2VgIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBtZXJnZWQgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAqICBjb3VudGVycGFydHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICA/IGN1c3RvbWl6ZXIoc2FmZUdldChvYmplY3QsIGtleSksIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgfSwga2V5c0luKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlTWVyZ2U7XG4iLCIvKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gW107XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlQ2xlYXI7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVEZWxldGU7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlR2V0O1xuIiwidmFyIGFzc29jSW5kZXhPZiA9IHJlcXVpcmUoJy4vX2Fzc29jSW5kZXhPZicpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVIYXM7XG4iLCJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVTZXQ7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqL1xuZnVuY3Rpb24gc3RhY2tDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0RlbGV0ZTtcbiIsIi8qKlxuICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja0dldDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RhY2tIYXM7XG4iLCJ2YXIgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyksXG4gICAgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFja1NldDtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNNYXNrZWQgPSByZXF1aXJlKCcuL19pc01hc2tlZCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnXG4pO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7XG4gIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNOYXRpdmU7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsInZhciBjb3JlSnNEYXRhID0gcmVxdWlyZSgnLi9fY29yZUpzRGF0YScpO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xudmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbn0oKSk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBmdW5jYCBoYXMgaXRzIHNvdXJjZSBtYXNrZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNNYXNrZWQoZnVuYykge1xuICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTWFza2VkO1xuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbm1vZHVsZS5leHBvcnRzID0gY29yZUpzRGF0YTtcbiIsIi8qKlxuICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZhbHVlO1xuIiwidmFyIEhhc2ggPSByZXF1aXJlKCcuL19IYXNoJyksXG4gICAgTGlzdENhY2hlID0gcmVxdWlyZSgnLi9fTGlzdENhY2hlJyksXG4gICAgTWFwID0gcmVxdWlyZSgnLi9fTWFwJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUNsZWFyO1xuIiwidmFyIGhhc2hDbGVhciA9IHJlcXVpcmUoJy4vX2hhc2hDbGVhcicpLFxuICAgIGhhc2hEZWxldGUgPSByZXF1aXJlKCcuL19oYXNoRGVsZXRlJyksXG4gICAgaGFzaEdldCA9IHJlcXVpcmUoJy4vX2hhc2hHZXQnKSxcbiAgICBoYXNoSGFzID0gcmVxdWlyZSgnLi9faGFzaEhhcycpLFxuICAgIGhhc2hTZXQgPSByZXF1aXJlKCcuL19oYXNoU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLlxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG5IYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDtcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG5IYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhhc2g7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKi9cbmZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsInZhciBuYXRpdmVDcmVhdGUgPSByZXF1aXJlKCcuL19uYXRpdmVDcmVhdGUnKTtcblxuLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIGhhc2ggdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgfVxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGhhc2hHZXQ7XG4iLCJ2YXIgbmF0aXZlQ3JlYXRlID0gcmVxdWlyZSgnLi9fbmF0aXZlQ3JlYXRlJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgaGFzaCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoSGFzO1xuIiwidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVHZXQoa2V5KSB7XG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVHZXQ7XG4iLCJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsInZhciBnZXRNYXBEYXRhID0gcmVxdWlyZSgnLi9fZ2V0TWFwRGF0YScpO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVTZXQ7XG4iLCJ2YXIgY3JlYXRlQmFzZUZvciA9IHJlcXVpcmUoJy4vX2NyZWF0ZUJhc2VGb3InKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKi9cbnZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGb3I7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVCYXNlRm9yO1xuIiwidmFyIGFzc2lnbk1lcmdlVmFsdWUgPSByZXF1aXJlKCcuL19hc3NpZ25NZXJnZVZhbHVlJyksXG4gICAgY2xvbmVCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUJ1ZmZlcicpLFxuICAgIGNsb25lVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vX2Nsb25lVHlwZWRBcnJheScpLFxuICAgIGNvcHlBcnJheSA9IHJlcXVpcmUoJy4vX2NvcHlBcnJheScpLFxuICAgIGluaXRDbG9uZU9iamVjdCA9IHJlcXVpcmUoJy4vX2luaXRDbG9uZU9iamVjdCcpLFxuICAgIGlzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pc0FyZ3VtZW50cycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4vaXNQbGFpbk9iamVjdCcpLFxuICAgIGlzVHlwZWRBcnJheSA9IHJlcXVpcmUoJy4vaXNUeXBlZEFycmF5JyksXG4gICAgc2FmZUdldCA9IHJlcXVpcmUoJy4vX3NhZmVHZXQnKSxcbiAgICB0b1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi90b1BsYWluT2JqZWN0Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlTWVyZ2VgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGdW5jIFRoZSBmdW5jdGlvbiB0byBtZXJnZSB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICogIGNvdW50ZXJwYXJ0cy5cbiAqL1xuZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICB2YXIgb2JqVmFsdWUgPSBzYWZlR2V0KG9iamVjdCwga2V5KSxcbiAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICBpZiAoc3RhY2tlZCkge1xuICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzQ29tbW9uKSB7XG4gICAgdmFyIGlzQXJyID0gaXNBcnJheShzcmNWYWx1ZSksXG4gICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gY29weUFycmF5KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzVHlwZWQpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGlmIChpc0NvbW1vbikge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgfVxuICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZU1lcmdlRGVlcDtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyByb290LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICBhbGxvY1Vuc2FmZSA9IEJ1ZmZlciA/IEJ1ZmZlci5hbGxvY1Vuc2FmZSA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgaWYgKGlzRGVlcCkge1xuICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICBidWZmZXIuY29weShyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lQnVmZmVyO1xuIiwidmFyIGNsb25lQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19jbG9uZUFycmF5QnVmZmVyJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB0eXBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcikgOiB0eXBlZEFycmF5LmJ1ZmZlcjtcbiAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVUeXBlZEFycmF5O1xuIiwidmFyIFVpbnQ4QXJyYXkgPSByZXF1aXJlKCcuL19VaW50OEFycmF5Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjbG9uZUFycmF5QnVmZmVyO1xuIiwiLyoqXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weUFycmF5O1xuIiwidmFyIGJhc2VDcmVhdGUgPSByZXF1aXJlKCcuL19iYXNlQ3JlYXRlJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpO1xuXG4vKipcbiAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gKi9cbmZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpXG4gICAgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKVxuICAgIDoge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5pdENsb25lT2JqZWN0O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VDcmVhdGU7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0FyZ3VtZW50cztcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWBcbiAqIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2VPYmplY3Q7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAqL1xuZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkZhbHNlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVW5hcnk7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4vKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbnZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgIGlmICh0eXBlcykge1xuICAgICAgcmV0dXJuIHR5cGVzO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICB9IGNhdGNoIChlKSB7fVxufSgpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDtcbiIsInZhciBjb3B5T2JqZWN0ID0gcmVxdWlyZSgnLi9fY29weU9iamVjdCcpLFxuICAgIGtleXNJbiA9IHJlcXVpcmUoJy4va2V5c0luJyk7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICoga2V5ZWQgcHJvcGVydGllcyBvZiBgdmFsdWVgIHRvIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBwbGFpbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICpcbiAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICovXG5mdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b1BsYWluT2JqZWN0O1xuIiwidmFyIGFzc2lnblZhbHVlID0gcmVxdWlyZSgnLi9fYXNzaWduVmFsdWUnKSxcbiAgICBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKTtcblxuLyoqXG4gKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1ZhbHVlID0gc291cmNlW2tleV07XG4gICAgfVxuICAgIGlmIChpc05ldykge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weU9iamVjdDtcbiIsInZhciBiYXNlQXNzaWduVmFsdWUgPSByZXF1aXJlKCcuL19iYXNlQXNzaWduVmFsdWUnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3NpZ25WYWx1ZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRpbWVzO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzSW4gPSByZXF1aXJlKCcuL19uYXRpdmVLZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXNJbihvYmplY3QpO1xuICB9XG4gIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5c0luO1xuIiwidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgbGVuZ3RoID0gMTtcbiAgICB9XG4gICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXNzaWduZXI7XG4iLCJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLCJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIiwiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwidmFyIGJhc2VTZXRUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VTZXRUb1N0cmluZycpLFxuICAgIHNob3J0T3V0ID0gcmVxdWlyZSgnLi9fc2hvcnRPdXQnKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUb1N0cmluZztcbiIsInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsIi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50O1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsInZhciBiYXNlSXNFcXVhbCA9IHJlcXVpcmUoJy4vX2Jhc2VJc0VxdWFsJyk7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICogZXF1aXZhbGVudC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogb2JqZWN0ID09PSBvdGhlcjtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXF1YWw7XG4iLCJ2YXIgYmFzZUlzRXF1YWxEZWVwID0gcmVxdWlyZSgnLi9fYmFzZUlzRXF1YWxEZWVwJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAqICAyIC0gUGFydGlhbCBjb21wYXJpc29uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZShvdGhlcikpKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gIH1cbiAgcmV0dXJuIGJhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzRXF1YWw7XG4iLCJ2YXIgU3RhY2sgPSByZXF1aXJlKCcuL19TdGFjaycpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBlcXVhbEJ5VGFnID0gcmVxdWlyZSgnLi9fZXF1YWxCeVRhZycpLFxuICAgIGVxdWFsT2JqZWN0cyA9IHJlcXVpcmUoJy4vX2VxdWFsT2JqZWN0cycpLFxuICAgIGdldFRhZyA9IHJlcXVpcmUoJy4vX2dldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc0J1ZmZlciA9IHJlcXVpcmUoJy4vaXNCdWZmZXInKSxcbiAgICBpc1R5cGVkQXJyYXkgPSByZXF1aXJlKCcuL2lzVHlwZWRBcnJheScpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICBvYmpUYWcgPSBvYmpJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG9iamVjdCksXG4gICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7XG5cbiAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XG5cbiAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgIG9iaklzT2JqID0gZmFsc2U7XG4gIH1cbiAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgfVxuICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcbiAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxuICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc1NhbWVUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNFcXVhbERlZXA7XG4iLCJ2YXIgTWFwQ2FjaGUgPSByZXF1aXJlKCcuL19NYXBDYWNoZScpLFxuICAgIHNldENhY2hlQWRkID0gcmVxdWlyZSgnLi9fc2V0Q2FjaGVBZGQnKSxcbiAgICBzZXRDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX3NldENhY2hlSGFzJyk7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG5TZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcblNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxubW9kdWxlLmV4cG9ydHMgPSBTZXRDYWNoZTtcbiIsIi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqXG4gKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBhZGRcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQGFsaWFzIHB1c2hcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7XG4gIHJldHVybiB0aGlzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlQWRkO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldENhY2hlSGFzO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gKiBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVNvbWU7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYWNoZUhhcztcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBVaW50OEFycmF5ID0gcmVxdWlyZSgnLi9fVWludDhBcnJheScpLFxuICAgIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGVxdWFsQXJyYXlzID0gcmVxdWlyZSgnLi9fZXF1YWxBcnJheXMnKSxcbiAgICBtYXBUb0FycmF5ID0gcmVxdWlyZSgnLi9fbWFwVG9BcnJheScpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXG4gICAgcmVnZXhwVGFnID0gJ1tvYmplY3QgUmVnRXhwXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGNvbXBhcmluZyBvYmplY3RzIG9mXG4gKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY29tcGFyaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3RzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7XG5cbiAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgYm9vbFRhZzpcbiAgICBjYXNlIGRhdGVUYWc6XG4gICAgY2FzZSBudW1iZXJUYWc6XG4gICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgIHJldHVybiBlcSgrb2JqZWN0LCArb3RoZXIpO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nXG4gICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICBjYXNlIG1hcFRhZzpcbiAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRztcbiAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXF1YWxCeVRhZztcbiIsIi8qKlxuICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAqL1xuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7XG5cbiAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwVG9BcnJheTtcbiIsIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VG9BcnJheTtcbiIsInZhciBnZXRBbGxLZXlzID0gcmVxdWlyZSgnLi9fZ2V0QWxsS2V5cycpO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcbiAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcXVhbE9iamVjdHM7XG4iLCJ2YXIgYmFzZUdldEFsbEtleXMgPSByZXF1aXJlKCcuL19iYXNlR2V0QWxsS2V5cycpLFxuICAgIGdldFN5bWJvbHMgPSByZXF1aXJlKCcuL19nZXRTeW1ib2xzJyksXG4gICAga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gIHJldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXMsIGdldFN5bWJvbHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFsbEtleXM7XG4iLCJ2YXIgYXJyYXlQdXNoID0gcmVxdWlyZSgnLi9fYXJyYXlQdXNoJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldEFsbEtleXM7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXJyYXlQdXNoO1xuIiwidmFyIGFycmF5RmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXlGaWx0ZXInKSxcbiAgICBzdHViQXJyYXkgPSByZXF1aXJlKCcuL3N0dWJBcnJheScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLlxuICovXG52YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpO1xuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3ltYm9scztcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZpbHRlcjtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R1YkFycmF5O1xuIiwidmFyIGFycmF5TGlrZUtleXMgPSByZXF1aXJlKCcuL19hcnJheUxpa2VLZXlzJyksXG4gICAgYmFzZUtleXMgPSByZXF1aXJlKCcuL19iYXNlS2V5cycpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlXG4gKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzO1xuIiwidmFyIGlzUHJvdG90eXBlID0gcmVxdWlyZSgnLi9faXNQcm90b3R5cGUnKSxcbiAgICBuYXRpdmVLZXlzID0gcmVxdWlyZSgnLi9fbmF0aXZlS2V5cycpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gIGlmICghaXNQcm90b3R5cGUob2JqZWN0KSkge1xuICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUtleXM7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUtleXM7XG4iLCJ2YXIgRGF0YVZpZXcgPSByZXF1aXJlKCcuL19EYXRhVmlldycpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpLFxuICAgIFByb21pc2UgPSByZXF1aXJlKCcuL19Qcm9taXNlJyksXG4gICAgU2V0ID0gcmVxdWlyZSgnLi9fU2V0JyksXG4gICAgV2Vha01hcCA9IHJlcXVpcmUoJy4vX1dlYWtNYXAnKSxcbiAgICBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIHRvU291cmNlID0gcmVxdWlyZSgnLi9fdG9Tb3VyY2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJztcblxudmFyIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbnZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSB0b1NvdXJjZShEYXRhVmlldyksXG4gICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICBzZXRDdG9yU3RyaW5nID0gdG9Tb3VyY2UoU2V0KSxcbiAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4vKipcbiAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG52YXIgZ2V0VGFnID0gYmFzZUdldFRhZztcblxuLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fFxuICAgIChNYXAgJiYgZ2V0VGFnKG5ldyBNYXApICE9IG1hcFRhZykgfHxcbiAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fFxuICAgIChXZWFrTWFwICYmIGdldFRhZyhuZXcgV2Vha01hcCkgIT0gd2Vha01hcFRhZykpIHtcbiAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksXG4gICAgICAgIEN0b3IgPSByZXN1bHQgPT0gb2JqZWN0VGFnID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsXG4gICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgIGlmIChjdG9yU3RyaW5nKSB7XG4gICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgY2FzZSBtYXBDdG9yU3RyaW5nOiByZXR1cm4gbWFwVGFnO1xuICAgICAgICBjYXNlIHByb21pc2VDdG9yU3RyaW5nOiByZXR1cm4gcHJvbWlzZVRhZztcbiAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUYWc7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKHJvb3QsICdEYXRhVmlldycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFWaWV3O1xuIiwidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBQcm9taXNlID0gZ2V0TmF0aXZlKHJvb3QsICdQcm9taXNlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcbiIsInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgU2V0ID0gZ2V0TmF0aXZlKHJvb3QsICdTZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZXQ7XG4iLCJ2YXIgZ2V0TmF0aXZlID0gcmVxdWlyZSgnLi9fZ2V0TmF0aXZlJyksXG4gICAgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xudmFyIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuIiwidmFyIGNhc3RQYXRoID0gcmVxdWlyZSgnLi9fY2FzdFBhdGgnKSxcbiAgICB0b0tleSA9IHJlcXVpcmUoJy4vX3RvS2V5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldDtcbiIsInZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNLZXkgPSByZXF1aXJlKCcuL19pc0tleScpLFxuICAgIHN0cmluZ1RvUGF0aCA9IHJlcXVpcmUoJy4vX3N0cmluZ1RvUGF0aCcpLFxuICAgIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhc3RQYXRoO1xuIiwidmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHJlSXNEZWVwUHJvcCA9IC9cXC58XFxbKD86W15bXFxdXSp8KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSo/XFwxKVxcXS8sXG4gICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHtcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdzeW1ib2wnIHx8IHR5cGUgPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICB2YWx1ZSA9PSBudWxsIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpIHx8ICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcbiAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5O1xuIiwidmFyIG1lbW9pemVDYXBwZWQgPSByZXF1aXJlKCcuL19tZW1vaXplQ2FwcGVkJyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZVByb3BOYW1lID0gL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbnZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICovXG52YXIgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZUNhcHBlZChmdW5jdGlvbihzdHJpbmcpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoMCkgPT09IDQ2IC8qIC4gKi8pIHtcbiAgICByZXN1bHQucHVzaCgnJyk7XG4gIH1cbiAgc3RyaW5nLnJlcGxhY2UocmVQcm9wTmFtZSwgZnVuY3Rpb24obWF0Y2gsIG51bWJlciwgcXVvdGUsIHN1YlN0cmluZykge1xuICAgIHJlc3VsdC5wdXNoKHF1b3RlID8gc3ViU3RyaW5nLnJlcGxhY2UocmVFc2NhcGVDaGFyLCAnJDEnKSA6IChudW1iZXIgfHwgbWF0Y2gpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdUb1BhdGg7XG4iLCJ2YXIgbWVtb2l6ZSA9IHJlcXVpcmUoJy4vbWVtb2l6ZScpO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZUNhcHBlZDtcbiIsInZhciBNYXBDYWNoZSA9IHJlcXVpcmUoJy4vX01hcENhY2hlJyk7XG5cbi8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudFxuICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGVcbiAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICpcbiAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiB2YWx1ZXMob3RoZXIpO1xuICogLy8gPT4gWzMsIDRdXG4gKlxuICogb2JqZWN0LmEgPSAyO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbMSwgMl1cbiAqXG4gKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS5cbiAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAqIHZhbHVlcyhvYmplY3QpO1xuICogLy8gPT4gWydhJywgJ2InXVxuICpcbiAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwO1xuICovXG5mdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7XG5cbiAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgcmV0dXJuIG1lbW9pemVkO1xufVxuXG4vLyBFeHBvc2UgYE1hcENhY2hlYC5cbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplO1xuIiwidmFyIGJhc2VUb1N0cmluZyA9IHJlcXVpcmUoJy4vX2Jhc2VUb1N0cmluZycpO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9TdHJpbmc7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgYXJyYXlNYXAgPSByZXF1aXJlKCcuL19hcnJheU1hcCcpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG52YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by50b1N0cmluZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHtcbiAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBSZWN1cnNpdmVseSBjb252ZXJ0IHZhbHVlcyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVG9TdHJpbmc7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TWFwO1xuIiwidmFyIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcga2V5IGlmIGl0J3Mgbm90IGEgc3RyaW5nIG9yIHN5bWJvbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b0tleTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXJcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2ZcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkubWFwXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zb3J0XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmZ1bmN0aW9uLm5hbWVcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuY3JlYXRlXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydGllc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5lbnRyaWVzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5mcmVlemVcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmdldC1wcm90b3R5cGUtb2ZcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnNldC1wcm90b3R5cGUtb2ZcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZ1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVyc1wiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX2dsb2JhbCA9IHJlcXVpcmUoXCJnbG9iYWxcIik7XG5cbnZhciBfcXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJxc1wiKSk7XG5cbnZhciBfZXZlbnRlbWl0dGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiZXZlbnRlbWl0dGVyM1wiKSk7XG5cbnZhciBfbWVtb2l6ZXJpZmljID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibWVtb2l6ZXJpZmljXCIpKTtcblxudmFyIF9kZWJvdW5jZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImxvZGFzaC9kZWJvdW5jZVwiKSk7XG5cbnZhciBfY29tbW9uVGFncyA9IHJlcXVpcmUoXCJjb21tb24tdGFnc1wiKTtcblxudmFyIF9jb3JlRXZlbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9jb3JlLWV2ZW50c1wiKSk7XG5cbnZhciBfY2xpZW50TG9nZ2VyID0gcmVxdWlyZShcIkBzdG9yeWJvb2svY2xpZW50LWxvZ2dlclwiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCJAc3Rvcnlib29rL3JvdXRlci91dGlsc1wiKTtcblxudmFyIF9wYXRoVG9JZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcGF0aFRvSWRcIikpO1xuXG52YXIgX3F1ZXJ5cGFyYW1zID0gcmVxdWlyZShcIi4vcXVlcnlwYXJhbXNcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5mdW5jdGlvbiBfdGVtcGxhdGVPYmplY3QoKSB7XG4gIHZhciBkYXRhID0gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbChbXCJcXG4gICAgICAgIFN0b3J5IHdpdGggaWQgXCIsIFwiIGFscmVhZHkgZXhpc3RzIGluIHRoZSBzdG9yZSFcXG5cXG4gICAgICAgIFBlcmhhcHMgeW91IGFkZGVkIHRoZSBzYW1lIHN0b3J5IHR3aWNlLCBvciB5b3UgaGF2ZSBhIG5hbWUgY29sbGlzaW9uP1xcbiAgICAgICAgU3RvcnkgaWRzIG5lZWQgdG8gYmUgdW5pcXVlIC0tIGVuc3VyZSB5b3UgYXJlbid0IHVzaW5nIHRoZSBzYW1lIG5hbWVzIG1vZG9sbyB1cmwtc2FuaXRpemF0aW9uLlxcbiAgICAgIFwiXSk7XG5cbiAgX3RlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gX3RlbXBsYXRlT2JqZWN0KCkge1xuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKHN0cmluZ3MsIHJhdykgeyBpZiAoIXJhdykgeyByYXcgPSBzdHJpbmdzLnNsaWNlKDApOyB9IHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0cmluZ3MsIHsgcmF3OiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKHJhdykgfSB9KSk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG4vLyBUT0RPOiB0aGVzZSBhcmUgY29waWVzIGZyb20gY29tcG9uZW50cy9uYXYvbGliXG4vLyByZWZhY3RvciB0byBEUllcbnZhciB0b0tleSA9IGZ1bmN0aW9uIHRvS2V5KGlucHV0KSB7XG4gIHJldHVybiBpbnB1dC5yZXBsYWNlKC9bXmEtejAtOV0rKFthLXowLTldKS9naSwgZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwYXJhbXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwYXJhbXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1sxXS50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn07XG5cbnZhciB0b0NoaWxkID0gZnVuY3Rpb24gdG9DaGlsZChpdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaXQpO1xufTtcblxudmFyIGNvdW50ID0gMDtcblxuZnVuY3Rpb24gZ2V0SWQoKSB7XG4gIGNvdW50ICs9IDE7XG4gIHJldHVybiBjb3VudDtcbn1cblxudmFyIHRvRXh0cmFjdGVkID0gZnVuY3Rpb24gdG9FeHRyYWN0ZWQob2JqKSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvYmopLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBfcmVmKSB7XG4gICAgdmFyIF9yZWYyID0gX3NsaWNlZFRvQXJyYXkoX3JlZiwgMiksXG4gICAgICAgIGtleSA9IF9yZWYyWzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWYyWzFdO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgX2RlZmluZVByb3BlcnR5KHt9LCBrZXksIHZhbHVlLnNsaWNlKCkuc29ydCgpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCBfZGVmaW5lUHJvcGVydHkoe30sIGtleSwgdmFsdWUpKTtcbiAgfSwge30pO1xufTtcblxudmFyIGdldElkRnJvbUxlZ2FjeVF1ZXJ5ID0gZnVuY3Rpb24gZ2V0SWRGcm9tTGVnYWN5UXVlcnkoX3JlZjMpIHtcbiAgdmFyIHBhdGggPSBfcmVmMy5wYXRoLFxuICAgICAgc2VsZWN0ZWRLaW5kID0gX3JlZjMuc2VsZWN0ZWRLaW5kLFxuICAgICAgc2VsZWN0ZWRTdG9yeSA9IF9yZWYzLnNlbGVjdGVkU3Rvcnk7XG4gIHJldHVybiBwYXRoICYmICgwLCBfcGF0aFRvSWRbXCJkZWZhdWx0XCJdKShwYXRoKSB8fCBzZWxlY3RlZEtpbmQgJiYgc2VsZWN0ZWRTdG9yeSAmJiAoMCwgX3V0aWxzLnRvSWQpKHNlbGVjdGVkS2luZCwgc2VsZWN0ZWRTdG9yeSk7XG59O1xuXG52YXIgU3RvcnlTdG9yZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuICBfaW5oZXJpdHMoU3RvcnlTdG9yZSwgX0V2ZW50RW1pdHRlcik7XG5cbiAgZnVuY3Rpb24gU3RvcnlTdG9yZShfcGFyYW1zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0b3J5U3RvcmUpO1xuXG4gICAgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfZ2V0UHJvdG90eXBlT2YoU3RvcnlTdG9yZSkuY2FsbCh0aGlzKSk7XG5cbiAgICBfdGhpcy5zZXRDaGFubmVsID0gZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgIF90aGlzLl9jaGFubmVsID0gY2hhbm5lbDtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0SWRPblBhdGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2dldFF1ZXJ5UGFyYW1zID0gKDAsIF9xdWVyeXBhcmFtcy5nZXRRdWVyeVBhcmFtcykoKSxcbiAgICAgICAgICBpZCA9IF9nZXRRdWVyeVBhcmFtcy5pZDtcblxuICAgICAgcmV0dXJuIGlkO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRQYXRoID0gZnVuY3Rpb24gKHN0b3J5SWQpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIHBhdGggPSBcIlwiLmNvbmNhdChfZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLCBcIj9cIikuY29uY2F0KF9xc1tcImRlZmF1bHRcIl0uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcywge1xuICAgICAgICBpZDogc3RvcnlJZFxuICAgICAgfSkpKTtcblxuICAgICAgX2dsb2JhbC5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHBhdGgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5mcm9tSWQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBkYXRhID0gX3RoaXMuX2RhdGFbaWRdO1xuXG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5nZXREZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBfY2xpZW50TG9nZ2VyLmxvZ2dlci53YXJuKCdmYWlsZWQgdG8gZ2V0IHN0b3J5OicsIF90aGlzLl9kYXRhKTtcblxuICAgICAgICBfY2xpZW50TG9nZ2VyLmxvZ2dlci5lcnJvcihlKTtcblxuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNldFNlbGVjdGlvbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBfdGhpcy5fc2VsZWN0aW9uID0gZGF0YTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZW1pdChfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uU1RPUllfUkVOREVSKTtcbiAgICAgIH0sIDEpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRTZWxlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuX3NlbGVjdGlvbjtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVtb3ZlID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICB2YXIgX2Fzc2VydFRoaXNJbml0aWFsaXplID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksXG4gICAgICAgICAgX2RhdGEgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemUuX2RhdGE7XG5cbiAgICAgIHZhciBzdG9yeSA9IF9kYXRhW2lkXTtcbiAgICAgIGRlbGV0ZSBfZGF0YVtpZF07XG5cbiAgICAgIGlmIChzdG9yeSkge1xuICAgICAgICB2YXIga2luZCA9IHN0b3J5LmtpbmQsXG4gICAgICAgICAgICBuYW1lID0gc3RvcnkubmFtZTtcblxuICAgICAgICB2YXIga2luZERhdGEgPSBfdGhpcy5fbGVnYWN5ZGF0YVt0b0tleShraW5kKV07XG5cbiAgICAgICAgaWYgKGtpbmREYXRhKSB7XG4gICAgICAgICAgZGVsZXRlIGtpbmREYXRhLnN0b3JpZXNbdG9LZXkobmFtZSldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnB1c2hUb01hbmFnZXIgPSAoMCwgX2RlYm91bmNlW1wiZGVmYXVsdFwiXSkoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLl9jaGFubmVsKSB7XG4gICAgICAgIHZhciBzdG9yaWVzID0gX3RoaXMuZXh0cmFjdCgpOyAvLyBzZW5kIHRvIHRoZSBwYXJlbnQgZnJhbWUuXG5cblxuICAgICAgICBfdGhpcy5fY2hhbm5lbC5lbWl0KF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5TRVRfU1RPUklFUywge1xuICAgICAgICAgIHN0b3JpZXM6IHN0b3JpZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gICAgX3RoaXMuX2xlZ2FjeWRhdGEgPSB7fTtcbiAgICBfdGhpcy5fZGF0YSA9IHt9O1xuICAgIF90aGlzLl9yZXZpc2lvbiA9IDA7XG4gICAgX3RoaXMuX3NlbGVjdGlvbiA9IHt9O1xuICAgIF90aGlzLl9jaGFubmVsID0gX3BhcmFtcy5jaGFubmVsO1xuXG4gICAgX3RoaXMub24oX2NvcmVFdmVudHNbXCJkZWZhdWx0XCJdLlNUT1JZX0lOSVQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdG9yeUlkID0gX3RoaXMuZ2V0SWRPblBhdGgoKTtcblxuICAgICAgaWYgKCFzdG9yeUlkKSB7XG4gICAgICAgIHZhciBxdWVyeSA9ICgwLCBfcXVlcnlwYXJhbXMuZ2V0UXVlcnlQYXJhbXMpKCk7XG4gICAgICAgIHN0b3J5SWQgPSBnZXRJZEZyb21MZWdhY3lRdWVyeShxdWVyeSk7XG5cbiAgICAgICAgaWYgKHN0b3J5SWQpIHtcbiAgICAgICAgICB2YXIgcGF0aCA9IHF1ZXJ5LnBhdGgsXG4gICAgICAgICAgICAgIHNlbGVjdGVkS2luZCA9IHF1ZXJ5LnNlbGVjdGVkS2luZCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRTdG9yeSA9IHF1ZXJ5LnNlbGVjdGVkU3RvcnksXG4gICAgICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocXVlcnksIFtcInBhdGhcIiwgXCJzZWxlY3RlZEtpbmRcIiwgXCJzZWxlY3RlZFN0b3J5XCJdKTtcblxuICAgICAgICAgIF90aGlzLnNldFBhdGgoc3RvcnlJZCwgcmVzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0U2VsZWN0aW9uKF90aGlzLmZyb21JZChzdG9yeUlkKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RvcnlTdG9yZSwgW3tcbiAgICBrZXk6IFwic2V0U2VwYXJhdG9yc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZXBhcmF0b3JzKGRhdGEpIHtcbiAgICAgIHRoaXMuc2VwYXJhdG9ycyA9IGRhdGE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByYXcoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fZGF0YSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgIHJldHVybiAhIWkuZ2V0RGVjb3JhdGVkO1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgICAgICB2YXIgaWQgPSBfcmVmNC5pZDtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5mcm9tSWQoaWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4dHJhY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXh0cmFjdCgpIHtcbiAgICAgIC8vIHJlbW92ZXMgZnVuY3Rpb24gdmFsdWVzIGZyb20gYWxsIHN0b3JpZXMgc28gdGhleSBhcmUgc2FmZSB0byB0cmFuc3BvcnQgb3ZlciB0aGUgY2hhbm5lbFxuICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX2RhdGEpLnJlZHVjZShmdW5jdGlvbiAoYSwgX3JlZjUpIHtcbiAgICAgICAgdmFyIF9yZWY2ID0gX3NsaWNlZFRvQXJyYXkoX3JlZjUsIDIpLFxuICAgICAgICAgICAgayA9IF9yZWY2WzBdLFxuICAgICAgICAgICAgdiA9IF9yZWY2WzFdO1xuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGEsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgaywgdG9FeHRyYWN0ZWQodikpKTtcbiAgICAgIH0sIHt9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkU3RvcnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkU3RvcnkoX3JlZjcsIF9yZWY4KSB7XG4gICAgICB2YXIgaWQgPSBfcmVmNy5pZCxcbiAgICAgICAgICBraW5kID0gX3JlZjcua2luZCxcbiAgICAgICAgICBuYW1lID0gX3JlZjcubmFtZSxcbiAgICAgICAgICBvcmlnaW5hbCA9IF9yZWY3LnN0b3J5Rm4sXG4gICAgICAgICAgX3JlZjckcGFyYW1ldGVycyA9IF9yZWY3LnBhcmFtZXRlcnMsXG4gICAgICAgICAgcGFyYW1ldGVycyA9IF9yZWY3JHBhcmFtZXRlcnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZjckcGFyYW1ldGVycztcbiAgICAgIHZhciBnZXREZWNvcmF0b3JzID0gX3JlZjguZ2V0RGVjb3JhdG9ycyxcbiAgICAgICAgICBhcHBseURlY29yYXRvcnMgPSBfcmVmOC5hcHBseURlY29yYXRvcnM7XG4gICAgICB2YXIgX2RhdGEgPSB0aGlzLl9kYXRhO1xuXG4gICAgICBpZiAoX2RhdGFbaWRdKSB7XG4gICAgICAgIF9jbGllbnRMb2dnZXIubG9nZ2VyLndhcm4oKDAsIF9jb21tb25UYWdzLnN0cmlwSW5kZW50cykoX3RlbXBsYXRlT2JqZWN0KCksIGlkKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpZGVudGlmaWNhdGlvbiA9IHtcbiAgICAgICAgaWQ6IGlkLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBzdG9yeTogbmFtZSAvLyBsZWdhY3lcblxuICAgICAgfTsgLy8gaW1tdXRhYmxlIG9yaWdpbmFsIHN0b3J5Rm5cblxuICAgICAgdmFyIGdldE9yaWdpbmFsID0gZnVuY3Rpb24gZ2V0T3JpZ2luYWwoKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbDtcbiAgICAgIH07IC8vIGxhemlseSBkZWNvcmF0ZSB0aGUgc3Rvcnkgd2hlbiBpdCdzIGxvYWRlZFxuXG5cbiAgICAgIHZhciBnZXREZWNvcmF0ZWQgPSAoMCwgX21lbW9pemVyaWZpY1tcImRlZmF1bHRcIl0pKDEpKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhnZXRPcmlnaW5hbCgpLCBnZXREZWNvcmF0b3JzKCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBzdG9yeUZuID0gZnVuY3Rpb24gc3RvcnlGbihwKSB7XG4gICAgICAgIHJldHVybiBnZXREZWNvcmF0ZWQoKShPYmplY3QuYXNzaWduKHt9LCBpZGVudGlmaWNhdGlvbiwge1xuICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtZXRlcnMsIHApXG4gICAgICAgIH0pKTtcbiAgICAgIH07XG5cbiAgICAgIF9kYXRhW2lkXSA9IHRvQ2hpbGQoT2JqZWN0LmFzc2lnbih7fSwgaWRlbnRpZmljYXRpb24sIHtcbiAgICAgICAgZ2V0RGVjb3JhdGVkOiBnZXREZWNvcmF0ZWQsXG4gICAgICAgIGdldE9yaWdpbmFsOiBnZXRPcmlnaW5hbCxcbiAgICAgICAgc3RvcnlGbjogc3RvcnlGbixcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICAgICAgfSkpOyAvLyBMRUdBQ1kgREFUQVxuXG4gICAgICB0aGlzLmFkZExlZ2FjeVN0b3J5KHtcbiAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgc3RvcnlGbjogc3RvcnlGbixcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICAgICAgfSk7IC8vIExFVCdTIFNFTkQgSVQgVE8gVEhFIE1BTkFHRVJcblxuICAgICAgdGhpcy5wdXNoVG9NYW5hZ2VyKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFJldmlzaW9uXCIsXG4gICAgLy8gT0xEIGFwaXNcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UmV2aXNpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmV2aXNpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluY3JlbWVudFJldmlzaW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluY3JlbWVudFJldmlzaW9uKCkge1xuICAgICAgdGhpcy5fcmV2aXNpb24gKz0gMTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTGVnYWN5U3RvcnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkTGVnYWN5U3RvcnkoX3JlZjkpIHtcbiAgICAgIHZhciBraW5kID0gX3JlZjkua2luZCxcbiAgICAgICAgICBuYW1lID0gX3JlZjkubmFtZSxcbiAgICAgICAgICBzdG9yeUZuID0gX3JlZjkuc3RvcnlGbixcbiAgICAgICAgICBfcmVmOSRwYXJhbWV0ZXJzID0gX3JlZjkucGFyYW1ldGVycyxcbiAgICAgICAgICBwYXJhbWV0ZXJzID0gX3JlZjkkcGFyYW1ldGVycyA9PT0gdm9pZCAwID8ge30gOiBfcmVmOSRwYXJhbWV0ZXJzO1xuICAgICAgdmFyIGsgPSB0b0tleShraW5kKTtcblxuICAgICAgaWYgKCF0aGlzLl9sZWdhY3lkYXRhW2tdKSB7XG4gICAgICAgIHRoaXMuX2xlZ2FjeWRhdGFba10gPSB7XG4gICAgICAgICAga2luZDoga2luZCxcbiAgICAgICAgICBmaWxlTmFtZTogcGFyYW1ldGVycy5maWxlTmFtZSxcbiAgICAgICAgICBpbmRleDogZ2V0SWQoKSxcbiAgICAgICAgICBzdG9yaWVzOiB7fVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sZWdhY3lkYXRhW2tdLnN0b3JpZXNbdG9LZXkobmFtZSldID0ge1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAvLyBraW5kLFxuICAgICAgICBpbmRleDogZ2V0SWQoKSxcbiAgICAgICAgc3Rvcnk6IHN0b3J5Rm4sXG4gICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN0b3J5S2luZHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RvcnlLaW5kcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX2xlZ2FjeWRhdGEpLmZpbHRlcihmdW5jdGlvbiAoa2luZCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoa2luZC5zdG9yaWVzKS5sZW5ndGggPiAwO1xuICAgICAgfSkuc29ydChmdW5jdGlvbiAoaW5mbzEsIGluZm8yKSB7XG4gICAgICAgIHJldHVybiBpbmZvMS5pbmRleCAtIGluZm8yLmluZGV4O1xuICAgICAgfSkubWFwKGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgIHJldHVybiBpbmZvLmtpbmQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3Rvcmllc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdG9yaWVzKGtpbmQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIga2V5ID0gdG9LZXkoa2luZCk7XG5cbiAgICAgIGlmICghdGhpcy5fbGVnYWN5ZGF0YVtrZXldKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2xlZ2FjeWRhdGFba2V5XS5zdG9yaWVzKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5fbGVnYWN5ZGF0YVtrZXldLnN0b3JpZXNbbmFtZV07XG4gICAgICB9KS5zb3J0KGZ1bmN0aW9uIChpbmZvMSwgaW5mbzIpIHtcbiAgICAgICAgcmV0dXJuIGluZm8xLmluZGV4IC0gaW5mbzIuaW5kZXg7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24gKGluZm8pIHtcbiAgICAgICAgcmV0dXJuIGluZm8ubmFtZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTdG9yeUZpbGVOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFN0b3J5RmlsZU5hbWUoa2luZCkge1xuICAgICAgdmFyIGtleSA9IHRvS2V5KGtpbmQpO1xuICAgICAgdmFyIHN0b3JpZXNLaW5kID0gdGhpcy5fbGVnYWN5ZGF0YVtrZXldO1xuXG4gICAgICBpZiAoIXN0b3JpZXNLaW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3Rvcmllc0tpbmQuZmlsZU5hbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN0b3J5QW5kUGFyYW1ldGVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTdG9yeUFuZFBhcmFtZXRlcnMoa2luZCwgbmFtZSkge1xuICAgICAgaWYgKCFraW5kIHx8ICFuYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3Rvcmllc0tpbmQgPSB0aGlzLl9sZWdhY3lkYXRhW3RvS2V5KGtpbmQpXTtcblxuICAgICAgaWYgKCFzdG9yaWVzS2luZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3J5SW5mbyA9IHN0b3JpZXNLaW5kLnN0b3JpZXNbdG9LZXkobmFtZSldO1xuXG4gICAgICBpZiAoIXN0b3J5SW5mbykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3J5ID0gc3RvcnlJbmZvLnN0b3J5LFxuICAgICAgICAgIHBhcmFtZXRlcnMgPSBzdG9yeUluZm8ucGFyYW1ldGVycztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0b3J5OiBzdG9yeSxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVyc1xuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U3RvcnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3Rvcnkoa2luZCwgbmFtZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldFN0b3J5QW5kUGFyYW1ldGVycyhraW5kLCBuYW1lKTtcbiAgICAgIHJldHVybiBkYXRhICYmIGRhdGEuc3Rvcnk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFN0b3J5V2l0aENvbnRleHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U3RvcnlXaXRoQ29udGV4dChraW5kLCBuYW1lKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0U3RvcnlBbmRQYXJhbWV0ZXJzKGtpbmQsIG5hbWUpO1xuXG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdG9yeSA9IGRhdGEuc3Rvcnk7XG4gICAgICByZXR1cm4gc3Rvcnk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZVN0b3J5S2luZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVTdG9yeUtpbmQoa2luZCkge1xuICAgICAgaWYgKHRoaXMuaGFzU3RvcnlLaW5kKGtpbmQpKSB7XG4gICAgICAgIHRoaXMuX2xlZ2FjeWRhdGFbdG9LZXkoa2luZCldLnN0b3JpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fZGF0YSA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2RhdGEpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBfcmVmMTApIHtcbiAgICAgICAgICB2YXIgX3JlZjExID0gX3NsaWNlZFRvQXJyYXkoX3JlZjEwLCAyKSxcbiAgICAgICAgICAgICAgaWQgPSBfcmVmMTFbMF0sXG4gICAgICAgICAgICAgIHN0b3J5ID0gX3JlZjExWzFdO1xuXG4gICAgICAgICAgaWYgKHN0b3J5LmtpbmQgIT09IGtpbmQpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWNjLCBfZGVmaW5lUHJvcGVydHkoe30sIGlkLCBzdG9yeSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzU3RvcnlLaW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc1N0b3J5S2luZChraW5kKSB7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9sZWdhY3lkYXRhW3RvS2V5KGtpbmQpXSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1N0b3J5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc1N0b3J5KGtpbmQsIG5hbWUpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZ2V0U3Rvcnkoa2luZCwgbmFtZSkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkdW1wU3RvcnlCb29rXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGR1bXBTdG9yeUJvb2soKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldFN0b3J5S2luZHMoKS5tYXAoZnVuY3Rpb24gKGtpbmQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICAgIHN0b3JpZXM6IF90aGlzNC5nZXRTdG9yaWVzKGtpbmQpXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNpemUoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fbGVnYWN5ZGF0YSkubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGVhblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhbigpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB0aGlzLmdldFN0b3J5S2luZHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChraW5kKSB7XG4gICAgICAgIHJldHVybiBkZWxldGUgX3RoaXM1Ll9sZWdhY3lkYXRhW3RvS2V5KGtpbmQpXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdG9yeVN0b3JlO1xufShfZXZlbnRlbWl0dGVyW1wiZGVmYXVsdFwiXSk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU3RvcnlTdG9yZTsiLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG5hdGl2ZVNvcnQgPSBbXS5zb3J0O1xudmFyIHRlc3QgPSBbMSwgMiwgM107XG5cbi8vIElFOC1cbnZhciBGQUlMU19PTl9VTkRFRklORUQgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHRlc3Quc29ydCh1bmRlZmluZWQpO1xufSk7XG4vLyBWOCBidWdcbnZhciBGQUlMU19PTl9OVUxMID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICB0ZXN0LnNvcnQobnVsbCk7XG59KTtcbi8vIE9sZCBXZWJLaXRcbnZhciBTTE9QUFlfTUVUSE9EID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Nsb3BweS1hcnJheS1tZXRob2QnKSgnc29ydCcpO1xuXG52YXIgRk9SQ0VEID0gRkFJTFNfT05fVU5ERUZJTkVEIHx8ICFGQUlMU19PTl9OVUxMIHx8IFNMT1BQWV9NRVRIT0Q7XG5cbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29ydFxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnQXJyYXknLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgIHJldHVybiBjb21wYXJlZm4gPT09IHVuZGVmaW5lZFxuICAgICAgPyBuYXRpdmVTb3J0LmNhbGwodG9PYmplY3QodGhpcykpXG4gICAgICA6IG5hdGl2ZVNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcbiIsIi8vIGBPYmplY3QuY3JlYXRlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5jcmVhdGVcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7XG4gIHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFyZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKVxufSwgeyBjcmVhdGU6IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJykgfSk7XG4iLCJ2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgbmF0aXZlR2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyJyk7XG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpKGZ1bmN0aW9uICgpIHsgbmF0aXZlR2V0UHJvdG90eXBlT2YoMSk7IH0pO1xuXG4vLyBgT2JqZWN0LmdldFByb3RvdHlwZU9mYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5nZXRwcm90b3R5cGVvZlxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHtcbiAgdGFyZ2V0OiAnT2JqZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGQUlMU19PTl9QUklNSVRJVkVTLCBzaGFtOiAhQ09SUkVDVF9QUk9UT1RZUEVfR0VUVEVSXG59LCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiBuYXRpdmVHZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9XG59KTtcblxuIiwiLy8gYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3Quc2V0cHJvdG90eXBlb2ZcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ09iamVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJylcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBwdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG52YXIgcHVzaFRvQXJyYXkgPSBmdW5jdGlvbiAoYXJyLCB2YWx1ZU9yQXJyYXkpIHtcbiAgICBwdXNoLmFwcGx5KGFyciwgaXNBcnJheSh2YWx1ZU9yQXJyYXkpID8gdmFsdWVPckFycmF5IDogW3ZhbHVlT3JBcnJheV0pO1xufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXR0ZXI6IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRzWydkZWZhdWx0J11dLFxuICAgIC8vIGRlcHJlY2F0ZWRcbiAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICBzZXJpYWxpemVEYXRlOiBmdW5jdGlvbiBzZXJpYWxpemVEYXRlKGRhdGUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSk7XG4gICAgfSxcbiAgICBza2lwTnVsbHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXR0ZXIsXG4gICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICBjaGFyc2V0XG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IG9iai5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChwcmVmaXgsIGtleSkgOiBwcmVmaXgsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICAgICAgY2hhcnNldFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICBwcmVmaXggKyAoYWxsb3dEb3RzID8gJy4nICsga2V5IDogJ1snICsga2V5ICsgJ10nKSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgICAgICBjaGFyc2V0XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG52YXIgbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cykge1xuICAgIGlmICghb3B0cykge1xuICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuZW5jb2RlciAhPT0gbnVsbCAmJiBvcHRzLmVuY29kZXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0cy5lbmNvZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIGNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgZGVmYXVsdHMuY2hhcnNldDtcbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICBpZiAodHlwZW9mIG9wdHMuZm9ybWF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoIWhhcy5jYWxsKGZvcm1hdHMuZm9ybWF0dGVycywgb3B0cy5mb3JtYXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGZvcm1hdCBvcHRpb24gcHJvdmlkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0ID0gb3B0cy5mb3JtYXQ7XG4gICAgfVxuICAgIHZhciBmb3JtYXR0ZXIgPSBmb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcblxuICAgIHZhciBmaWx0ZXIgPSBkZWZhdWx0cy5maWx0ZXI7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBpc0FycmF5KG9wdHMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRzLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhZGRRdWVyeVByZWZpeDogdHlwZW9mIG9wdHMuYWRkUXVlcnlQcmVmaXggPT09ICdib29sZWFuJyA/IG9wdHMuYWRkUXVlcnlQcmVmaXggOiBkZWZhdWx0cy5hZGRRdWVyeVByZWZpeCxcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBkZWxpbWl0ZXI6IHR5cGVvZiBvcHRzLmRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5kZWxpbWl0ZXIgOiBvcHRzLmRlbGltaXRlcixcbiAgICAgICAgZW5jb2RlOiB0eXBlb2Ygb3B0cy5lbmNvZGUgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlIDogZGVmYXVsdHMuZW5jb2RlLFxuICAgICAgICBlbmNvZGVyOiB0eXBlb2Ygb3B0cy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcixcbiAgICAgICAgZW5jb2RlVmFsdWVzT25seTogdHlwZW9mIG9wdHMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgICAgIGZvcm1hdHRlcjogZm9ybWF0dGVyLFxuICAgICAgICBzZXJpYWxpemVEYXRlOiB0eXBlb2Ygb3B0cy5zZXJpYWxpemVEYXRlID09PSAnZnVuY3Rpb24nID8gb3B0cy5zZXJpYWxpemVEYXRlIDogZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgc2tpcE51bGxzOiB0eXBlb2Ygb3B0cy5za2lwTnVsbHMgPT09ICdib29sZWFuJyA/IG9wdHMuc2tpcE51bGxzIDogZGVmYXVsdHMuc2tpcE51bGxzLFxuICAgICAgICBzb3J0OiB0eXBlb2Ygb3B0cy5zb3J0ID09PSAnZnVuY3Rpb24nID8gb3B0cy5zb3J0IDogbnVsbCxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgb3B0cykge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgdmFyIG9wdGlvbnMgPSBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpO1xuXG4gICAgdmFyIG9iaktleXM7XG4gICAgdmFyIGZpbHRlcjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaiA9IGZpbHRlcignJywgb2JqKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob3B0aW9ucy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlGb3JtYXQ7XG4gICAgaWYgKG9wdHMgJiYgb3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAob3B0cyAmJiAnaW5kaWNlcycgaW4gb3B0cykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuaW5kaWNlcyA/ICdpbmRpY2VzJyA6ICdyZXBlYXQnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gJ2luZGljZXMnO1xuICAgIH1cblxuICAgIHZhciBnZW5lcmF0ZUFycmF5UHJlZml4ID0gYXJyYXlQcmVmaXhHZW5lcmF0b3JzW2FycmF5Rm9ybWF0XTtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5za2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2hUb0FycmF5KGtleXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgb3B0aW9ucy5za2lwTnVsbHMsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZSA/IG9wdGlvbnMuZW5jb2RlciA6IG51bGwsXG4gICAgICAgICAgICBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuc29ydCxcbiAgICAgICAgICAgIG9wdGlvbnMuYWxsb3dEb3RzLFxuICAgICAgICAgICAgb3B0aW9ucy5zZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXRcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgdmFyIGpvaW5lZCA9IGtleXMuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKSwgdGhlIFwibnVtZXJpYyBlbnRpdHlcIiByZXByZXNlbnRhdGlvbiBvZiBhIGNoZWNrbWFya1xuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JUUyJTlDJTkzJic7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gam9pbmVkLmxlbmd0aCA+IDAgPyBwcmVmaXggKyBqb2luZWQgOiAnJztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYXJyYXlMaW1pdDogMjAsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGNvbW1hOiBmYWxzZSxcbiAgICBkZWNvZGVyOiB1dGlscy5kZWNvZGUsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZGVwdGg6IDUsXG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogZmFsc2UsXG4gICAgcGFyYW1ldGVyTGltaXQ6IDEwMDAsXG4gICAgcGFyc2VBcnJheXM6IHRydWUsXG4gICAgcGxhaW5PYmplY3RzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvJiMoXFxkKyk7L2csIGZ1bmN0aW9uICgkMCwgbnVtYmVyU3RyKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG51bWJlclN0ciwgMTApKTtcbiAgICB9KTtcbn07XG5cbi8vIFRoaXMgaXMgd2hhdCBicm93c2VycyB3aWxsIHN1Ym1pdCB3aGVuIHRoZSDinJMgY2hhcmFjdGVyIG9jY3VycyBpbiBhblxuLy8gYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGJvZHkgYW5kIHRoZSBlbmNvZGluZyBvZiB0aGUgcGFnZSBjb250YWluaW5nXG4vLyB0aGUgZm9ybSBpcyBpc28tODg1OS0xLCBvciB3aGVuIHRoZSBzdWJtaXR0ZWQgZm9ybSBoYXMgYW4gYWNjZXB0LWNoYXJzZXRcbi8vIGF0dHJpYnV0ZSBvZiBpc28tODg1OS0xLiBQcmVzdW1hYmx5IGFsc28gd2l0aCBvdGhlciBjaGFyc2V0cyB0aGF0IGRvIG5vdCBjb250YWluXG4vLyB0aGUg4pyTIGNoYXJhY3Rlciwgc3VjaCBhcyB1cy1hc2NpaS5cbnZhciBpc29TZW50aW5lbCA9ICd1dGY4PSUyNiUyMzEwMDAzJTNCJzsgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpXG5cbi8vIFRoZXNlIGFyZSB0aGUgcGVyY2VudC1lbmNvZGVkIHV0Zi04IG9jdGV0cyByZXByZXNlbnRpbmcgYSBjaGVja21hcmssIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdCBhY3R1YWxseSBpcyB1dGYtOCBlbmNvZGVkLlxudmFyIGNoYXJzZXRTZW50aW5lbCA9ICd1dGY4PSVFMiU5QyU5Myc7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcblxudmFyIHBhcnNlVmFsdWVzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0ge307XG4gICAgdmFyIGNsZWFuU3RyID0gb3B0aW9ucy5pZ25vcmVRdWVyeVByZWZpeCA/IHN0ci5yZXBsYWNlKC9eXFw/LywgJycpIDogc3RyO1xuICAgIHZhciBsaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgPT09IEluZmluaXR5ID8gdW5kZWZpbmVkIDogb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdDtcbiAgICB2YXIgcGFydHMgPSBjbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlciwgbGltaXQpO1xuICAgIHZhciBza2lwSW5kZXggPSAtMTsgLy8gS2VlcCB0cmFjayBvZiB3aGVyZSB0aGUgdXRmOCBzZW50aW5lbCB3YXMgZm91bmRcbiAgICB2YXIgaTtcblxuICAgIHZhciBjaGFyc2V0ID0gb3B0aW9ucy5jaGFyc2V0O1xuICAgIGlmIChvcHRpb25zLmNoYXJzZXRTZW50aW5lbCkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5pbmRleE9mKCd1dGY4PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzW2ldID09PSBjaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0c1tpXSA9PT0gaXNvU2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2tpcEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBpID0gcGFydHMubGVuZ3RoOyAvLyBUaGUgZXNsaW50IHNldHRpbmdzIGRvIG5vdCBhbGxvdyBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSA9PT0gc2tpcEluZGV4KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFydCA9IHBhcnRzW2ldO1xuXG4gICAgICAgIHZhciBicmFja2V0RXF1YWxzUG9zID0gcGFydC5pbmRleE9mKCddPScpO1xuICAgICAgICB2YXIgcG9zID0gYnJhY2tldEVxdWFsc1BvcyA9PT0gLTEgPyBwYXJ0LmluZGV4T2YoJz0nKSA6IGJyYWNrZXRFcXVhbHNQb3MgKyAxO1xuXG4gICAgICAgIHZhciBrZXksIHZhbDtcbiAgICAgICAgaWYgKHBvcyA9PT0gLTEpIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0KTtcbiAgICAgICAgICAgIHZhbCA9IG9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nID8gbnVsbCA6ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UoMCwgcG9zKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZShwb3MgKyAxKSwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzICYmIGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgdmFsID0gaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzKHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsICYmIG9wdGlvbnMuY29tbWEgJiYgdmFsLmluZGV4T2YoJywnKSA+IC0xKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdXRpbHMuY29tYmluZShvYmpba2V5XSwgdmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGxlYWYgPSB2YWw7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJyAmJiBvcHRpb25zLnBhcnNlQXJyYXlzKSB7XG4gICAgICAgICAgICBvYmogPSBbXS5jb25jYXQobGVhZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgICAgICAgIHZhciBjbGVhblJvb3QgPSByb290LmNoYXJBdCgwKSA9PT0gJ1snICYmIHJvb3QuY2hhckF0KHJvb3QubGVuZ3RoIC0gMSkgPT09ICddJyA/IHJvb3Quc2xpY2UoMSwgLTEpIDogcm9vdDtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGNsZWFuUm9vdCwgMTApO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnBhcnNlQXJyYXlzICYmIGNsZWFuUm9vdCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBvYmogPSB7IDA6IGxlYWYgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIWlzTmFOKGluZGV4KVxuICAgICAgICAgICAgICAgICYmIHJvb3QgIT09IGNsZWFuUm9vdFxuICAgICAgICAgICAgICAgICYmIFN0cmluZyhpbmRleCkgPT09IGNsZWFuUm9vdFxuICAgICAgICAgICAgICAgICYmIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICAmJiAob3B0aW9ucy5wYXJzZUFycmF5cyAmJiBpbmRleCA8PSBvcHRpb25zLmFycmF5TGltaXQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBvYmogPSBbXTtcbiAgICAgICAgICAgICAgICBvYmpbaW5kZXhdID0gbGVhZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgaWYgKCFnaXZlbktleSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGRvdCBub3RhdGlvbiB0byBicmFja2V0IG5vdGF0aW9uXG4gICAgdmFyIGtleSA9IG9wdGlvbnMuYWxsb3dEb3RzID8gZ2l2ZW5LZXkucmVwbGFjZSgvXFwuKFteLltdKykvZywgJ1skMV0nKSA6IGdpdmVuS2V5O1xuXG4gICAgLy8gVGhlIHJlZ2V4IGNodW5rc1xuXG4gICAgdmFyIGJyYWNrZXRzID0gLyhcXFtbXltcXF1dKl0pLztcbiAgICB2YXIgY2hpbGQgPSAvKFxcW1teW1xcXV0qXSkvZztcblxuICAgIC8vIEdldCB0aGUgcGFyZW50XG5cbiAgICB2YXIgc2VnbWVudCA9IGJyYWNrZXRzLmV4ZWMoa2V5KTtcbiAgICB2YXIgcGFyZW50ID0gc2VnbWVudCA/IGtleS5zbGljZSgwLCBzZWdtZW50LmluZGV4KSA6IGtleTtcblxuICAgIC8vIFN0YXNoIHRoZSBwYXJlbnQgaWYgaXQgZXhpc3RzXG5cbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIHBsYWluIG9iamVjdHMsIG9wdGlvbmFsbHkgcHJlZml4IGtleXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgb2JqZWN0IHByb3RvdHlwZSBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgcGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMucHVzaChwYXJlbnQpO1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBjaGlsZHJlbiBhcHBlbmRpbmcgdG8gdGhlIGFycmF5IHVudGlsIHdlIGhpdCBkZXB0aFxuXG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlICgoc2VnbWVudCA9IGNoaWxkLmV4ZWMoa2V5KSkgIT09IG51bGwgJiYgaSA8IG9wdGlvbnMuZGVwdGgpIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNlZ21lbnRbMV0uc2xpY2UoMSwgLTEpKSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93UHJvdG90eXBlcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzLnB1c2goc2VnbWVudFsxXSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBhIHJlbWFpbmRlciwganVzdCBhZGQgd2hhdGV2ZXIgaXMgbGVmdFxuXG4gICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAga2V5cy5wdXNoKCdbJyArIGtleS5zbGljZShzZWdtZW50LmluZGV4KSArICddJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlT2JqZWN0KGtleXMsIHZhbCwgb3B0aW9ucyk7XG59O1xuXG52YXIgbm9ybWFsaXplUGFyc2VPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmRlY29kZXIgIT09IG51bGwgJiYgb3B0cy5kZWNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdHMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICB2YXIgY2hhcnNldCA9IHR5cGVvZiBvcHRzLmNoYXJzZXQgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuY2hhcnNldCA6IG9wdHMuY2hhcnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGFsbG93UHJvdG90eXBlczogdHlwZW9mIG9wdHMuYWxsb3dQcm90b3R5cGVzID09PSAnYm9vbGVhbicgPyBvcHRzLmFsbG93UHJvdG90eXBlcyA6IGRlZmF1bHRzLmFsbG93UHJvdG90eXBlcyxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICBkZXB0aDogdHlwZW9mIG9wdHMuZGVwdGggPT09ICdudW1iZXInID8gb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucyk7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1lcmdlKG9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBub3cgPSByZXF1aXJlKCcuL25vdycpLFxuICAgIHRvTnVtYmVyID0gcmVxdWlyZSgnLi90b051bWJlcicpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nXG4gICAgICA/IG5hdGl2ZU1pbih0aW1lV2FpdGluZywgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpXG4gICAgICA6IHRpbWVXYWl0aW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vdztcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvTnVtYmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfZ2xvYmFsID0gcmVxdWlyZShcImdsb2JhbFwiKTtcblxudmFyIF9jb3JlRXZlbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9jb3JlLWV2ZW50c1wiKSk7XG5cbnZhciBfY2xpZW50TG9nZ2VyID0gcmVxdWlyZShcIkBzdG9yeWJvb2svY2xpZW50LWxvZ2dlclwiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIENvbmZpZ0FwaSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbmZpZ0FwaShfcmVmKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBjaGFubmVsID0gX3JlZi5jaGFubmVsLFxuICAgICAgICBzdG9yeVN0b3JlID0gX3JlZi5zdG9yeVN0b3JlLFxuICAgICAgICBjbGVhckRlY29yYXRvcnMgPSBfcmVmLmNsZWFyRGVjb3JhdG9ycyxcbiAgICAgICAgY2xpZW50QXBpID0gX3JlZi5jbGllbnRBcGk7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uZmlnQXBpKTtcblxuICAgIHRoaXMuY29uZmlndXJlID0gZnVuY3Rpb24gKGxvYWRlcnMsIG1vZHVsZSkge1xuICAgICAgdmFyIHJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IFtdO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGxvYWRlcnMpIHtcbiAgICAgICAgICAgIGxvYWRlcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBfY2xpZW50TG9nZ2VyLmxvZ2dlci5lcnJvcihlKTtcblxuICAgICAgICAgIGVycm9ycy5wdXNoKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfdGhpcy5fcmVuZGVyTWFpbigpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgX2NsaWVudExvZ2dlci5sb2dnZXIuZXJyb3IoZSk7XG5cbiAgICAgICAgICBlcnJvcnMucHVzaChlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG1vZHVsZS5ob3QgJiYgbW9kdWxlLmhvdC5zdGF0dXMoKSA9PT0gJ2FwcGx5Jykge1xuICAgICAgICAgICAgLy8gV2UgZ290IHRoaXMgaXNzdWUsIGFmdGVyIHdlYnBhY2sgZml4ZWQgaXQgYW5kIGFwcGx5aW5nIGl0LlxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGVycm9yIG1lc3NhZ2UgaXMgZGlzcGxheWVkIGZvcmV2ZXIgZXZlbiBpdCdzIGJlaW5nIGZpeGVkLlxuICAgICAgICAgICAgLy8gU28sIHdlJ2xsIGRldGVjdCBpdCByZWxvYWQgdGhlIHBhZ2UuXG4gICAgICAgICAgICBfY2xpZW50TG9nZ2VyLmxvZ2dlci5lcnJvcignUkVMT0FEIFRIRSBQQUdFJywgJ21vZHVsZS5ob3Quc3RhdHVzKCkgPT09IGFwcGx5Jyk7XG5cbiAgICAgICAgICAgIF9nbG9iYWwubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhY2Nlc3NpbmcgdGhlIHNpdGUsIGJ1dCB0aGUgZXJyb3IgaXMgbm90IGZpeGVkIHlldC5cbiAgICAgICAgICAgIC8vIFRoZXJlIHdlIGNhbiByZW5kZXIgdGhlIGVycm9yLlxuICAgICAgICAgICAgX3RoaXMuX3JlbmRlckVycm9yKGVycm9yc1swXSk7IC8vIENsZWFyIG91dCB0aGUgc3RvcmUgYXMgY2hhbmNlcyBhcyBvbmx5IHNvbWUgb2YgdGhlIHN0b3JpZXMgd2lsbCBoYXZlXG4gICAgICAgICAgICAvLyBtYWRlIGl0IGluIGJlZm9yZSB0aGUgZXJyb3Igd2FzIHRocm93blxuICAgICAgICAgICAgLy8gdGhpcy5fc3RvcnlTdG9yZS5jbGVhbigpO1xuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobW9kdWxlLmhvdCkge1xuICAgICAgICBtb2R1bGUuaG90LmFjY2VwdChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2V0VGltZW91dChyZW5kZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpcy5fY2xlYXJEZWNvcmF0b3JzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuX2NoYW5uZWwpIHtcbiAgICAgICAgLy8gaW4gQnJvd3NlclxuICAgICAgICByZW5kZXIoKTsgLy8gU2VuZCBhIHNpZ25hbCB0byB0aGUgbWFuYWdlciB0aGF0IGNvbmZpZ3VyZSgpIGlzIGRvbmUuIFdlIGRvIHRoaXMgaW4gYSB0aW1lb3V0XG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHN0b3J5X3N0b3JlIHNlbmRzIHN0b3JpZXMgaW4gYSBkZWJvdW5jZWQgZnVuY3Rpb24sIHdoaWNoIHJlc3VsdHMgaW5cbiAgICAgICAgLy8gYXMgc2V0VGltZW91dC4gV2Ugd2FudCB0byBlbnN1cmUgdGhpcyBoYXBwZW5zIGFmdGVyLCB0byBhdm9pZCBhIEZPVUMuXG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLl9jaGFubmVsLmVtaXQoX2NvcmVFdmVudHNbXCJkZWZhdWx0XCJdLlNUT1JJRVNfQ09ORklHVVJFRCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW4gTm9kZUpTXG4gICAgICAgIGxvYWRlcnMoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY2hhbm5lbCBjYW4gYmUgbnVsbCB3aGVuIHJ1bm5pbmcgaW4gbm9kZVxuICAgIC8vIGFsd2F5cyBjaGVjayB3aGV0aGVyIGNoYW5uZWwgaXMgYXZhaWxhYmxlXG4gICAgdGhpcy5fY2hhbm5lbCA9IGNoYW5uZWw7XG4gICAgdGhpcy5fc3RvcnlTdG9yZSA9IHN0b3J5U3RvcmU7XG4gICAgdGhpcy5fY2xlYXJEZWNvcmF0b3JzID0gY2xlYXJEZWNvcmF0b3JzO1xuICAgIHRoaXMuY2xpZW50QXBpID0gY2xpZW50QXBpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKENvbmZpZ0FwaSwgW3tcbiAgICBrZXk6IFwiX3JlbmRlck1haW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlbmRlck1haW4oKSB7XG4gICAgICAvLyBkbyBpbml0aWFsIHJlbmRlciBvZiBzdG9yeVxuICAgICAgdGhpcy5fc3RvcnlTdG9yZS5lbWl0KF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5TVE9SWV9JTklUKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3JlbmRlckVycm9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW5kZXJFcnJvcihlKSB7XG4gICAgICB2YXIgc3RhY2sgPSBlLnN0YWNrLFxuICAgICAgICAgIG1lc3NhZ2UgPSBlLm1lc3NhZ2U7XG4gICAgICB2YXIgZXJyb3IgPSB7XG4gICAgICAgIHN0YWNrOiBzdGFjayxcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZVxuICAgICAgfTtcblxuICAgICAgdGhpcy5fc3RvcnlTdG9yZS5zZXRTZWxlY3Rpb24oe1xuICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb25maWdBcGk7XG59KCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ29uZmlnQXBpOyIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2ZcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHN0YXJ0O1xuZXhwb3J0cy5nZXRDb250ZXh0ID0gdm9pZCAwO1xuXG52YXIgX2FkZG9ucyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBzdG9yeWJvb2svYWRkb25zXCIpKTtcblxudmFyIF9nbG9iYWwgPSByZXF1aXJlKFwiZ2xvYmFsXCIpO1xuXG52YXIgX2NoYW5uZWxQb3N0bWVzc2FnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBzdG9yeWJvb2svY2hhbm5lbC1wb3N0bWVzc2FnZVwiKSk7XG5cbnZhciBfY2xpZW50QXBpMiA9IHJlcXVpcmUoXCJAc3Rvcnlib29rL2NsaWVudC1hcGlcIik7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9yb3V0ZXIvdXRpbHNcIik7XG5cbnZhciBfY2xpZW50TG9nZ2VyID0gcmVxdWlyZShcIkBzdG9yeWJvb2svY2xpZW50LWxvZ2dlclwiKTtcblxudmFyIF9jb3JlRXZlbnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9jb3JlLWV2ZW50c1wiKSk7XG5cbnZhciBfdXRpbERlcHJlY2F0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInV0aWwtZGVwcmVjYXRlXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbnZhciBjbGFzc2VzID0ge1xuICBNQUlOOiAnc2Itc2hvdy1tYWluJyxcbiAgTk9QUkVWSUVXOiAnc2Itc2hvdy1ub3ByZXZpZXcnLFxuICBFUlJPUjogJ3NiLXNob3ctZXJyb3JkaXNwbGF5J1xufTtcblxuZnVuY3Rpb24gc2hvd01haW4oKSB7XG4gIF9nbG9iYWwuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzZXMuTk9QUkVWSUVXKTtcblxuICBfZ2xvYmFsLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLkVSUk9SKTtcblxuICBfZ2xvYmFsLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChjbGFzc2VzLk1BSU4pO1xufVxuXG5mdW5jdGlvbiBzaG93Tm9wcmV2aWV3KCkge1xuICBfZ2xvYmFsLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLk1BSU4pO1xuXG4gIF9nbG9iYWwuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzZXMuRVJST1IpO1xuXG4gIF9nbG9iYWwuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKGNsYXNzZXMuTk9QUkVWSUVXKTtcbn1cblxuZnVuY3Rpb24gc2hvd0Vycm9yRGlzcGxheShfcmVmKSB7XG4gIHZhciBtZXNzYWdlID0gX3JlZi5tZXNzYWdlLFxuICAgICAgc3RhY2sgPSBfcmVmLnN0YWNrO1xuICBfZ2xvYmFsLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1tZXNzYWdlJykudGV4dENvbnRlbnQgPSBtZXNzYWdlO1xuICBfZ2xvYmFsLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1zdGFjaycpLnRleHRDb250ZW50ID0gc3RhY2s7XG5cbiAgX2dsb2JhbC5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3Nlcy5NQUlOKTtcblxuICBfZ2xvYmFsLmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc2VzLk5PUFJFVklFVyk7XG5cbiAgX2dsb2JhbC5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoY2xhc3Nlcy5FUlJPUik7XG59IC8vIHNob3dFcnJvciBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGFwcCBsYXllcnMgdG8gaW5mb3JtIHRoZSB1c2VyIHRoZXkgaGF2ZSBkb25lIHNvbWV0aGluZ1xuLy8gd3JvbmcgLS0gZm9yIGluc3RhbmNlIHJldHVybmVkIHRoZSB3cm9uZyB0aGluZyBmcm9tIGEgc3RvcnlcblxuXG5mdW5jdGlvbiBzaG93RXJyb3IoX3JlZjIpIHtcbiAgdmFyIHRpdGxlID0gX3JlZjIudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbiA9IF9yZWYyLmRlc2NyaXB0aW9uO1xuXG4gIF9hZGRvbnNbXCJkZWZhdWx0XCJdLmdldENoYW5uZWwoKS5lbWl0KF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5TVE9SWV9FUlJPUkVELCB7XG4gICAgdGl0bGU6IHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblxuICB9KTtcblxuICBzaG93RXJyb3JEaXNwbGF5KHtcbiAgICBtZXNzYWdlOiB0aXRsZSxcbiAgICBzdGFjazogZGVzY3JpcHRpb25cbiAgfSk7XG59IC8vIHNob3dFeGNlcHRpb24gaXMgdXNlZCBpZiB3ZSBmYWlsIHRvIHJlbmRlciB0aGUgc3RvcnkgYW5kIGl0IGlzIHVuY2F1Z2h0IGJ5IHRoZSBhcHAgbGF5ZXJcblxuXG5mdW5jdGlvbiBzaG93RXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICBfYWRkb25zW1wiZGVmYXVsdFwiXS5nZXRDaGFubmVsKCkuZW1pdChfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uU1RPUllfVEhSRVdfRVhDRVBUSU9OLCBleGNlcHRpb24pO1xuXG4gIHNob3dFcnJvckRpc3BsYXkoZXhjZXB0aW9uKTsgLy8gTG9nIHRoZSBzdGFjayB0byB0aGUgY29uc29sZS4gU28sIHVzZXIgY291bGQgY2hlY2sgdGhlIHNvdXJjZSBjb2RlLlxuXG4gIF9jbGllbnRMb2dnZXIubG9nZ2VyLmVycm9yKGV4Y2VwdGlvbi5zdGFjayk7XG59XG5cbnZhciBpc0Jyb3dzZXIgPSBfZ2xvYmFsLm5hdmlnYXRvciAmJiBfZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQgJiYgX2dsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50ICE9PSAnc3RvcnlzaG90cycgJiYgIShfZ2xvYmFsLm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTm9kZS5qcycpID4gLTEpICYmICEoX2dsb2JhbC5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ2pzZG9tJykgPiAtMSk7XG5cbnZhciBnZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY2FjaGU7XG4gIHJldHVybiBmdW5jdGlvbiAoZGVjb3JhdGVTdG9yeSkge1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cblxuICAgIHZhciBjaGFubmVsID0gbnVsbDtcblxuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNoYW5uZWwgPSBfYWRkb25zW1wiZGVmYXVsdFwiXS5nZXRDaGFubmVsKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNoYW5uZWwgPSAoMCwgX2NoYW5uZWxQb3N0bWVzc2FnZVtcImRlZmF1bHRcIl0pKHtcbiAgICAgICAgICBwYWdlOiAncHJldmlldydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX2FkZG9uc1tcImRlZmF1bHRcIl0uc2V0Q2hhbm5lbChjaGFubmVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3RvcnlTdG9yZTtcbiAgICB2YXIgY2xpZW50QXBpO1xuXG4gICAgaWYgKHR5cGVvZiBfZ2xvYmFsLndpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgX2dsb2JhbC53aW5kb3cuX19TVE9SWUJPT0tfQ0xJRU5UX0FQSV9fKSB7XG4gICAgICBjbGllbnRBcGkgPSBfZ2xvYmFsLndpbmRvdy5fX1NUT1JZQk9PS19DTElFTlRfQVBJX187IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZVxuXG4gICAgICBzdG9yeVN0b3JlID0gY2xpZW50QXBpLl9zdG9yeVN0b3JlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yeVN0b3JlID0gbmV3IF9jbGllbnRBcGkyLlN0b3J5U3RvcmUoe1xuICAgICAgICBjaGFubmVsOiBjaGFubmVsXG4gICAgICB9KTtcbiAgICAgIGNsaWVudEFwaSA9IG5ldyBfY2xpZW50QXBpMi5DbGllbnRBcGkoe1xuICAgICAgICBzdG9yeVN0b3JlOiBzdG9yeVN0b3JlLFxuICAgICAgICBkZWNvcmF0ZVN0b3J5OiBkZWNvcmF0ZVN0b3J5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgX2NsaWVudEFwaSA9IGNsaWVudEFwaSxcbiAgICAgICAgY2xlYXJEZWNvcmF0b3JzID0gX2NsaWVudEFwaS5jbGVhckRlY29yYXRvcnM7XG4gICAgdmFyIGNvbmZpZ0FwaSA9IG5ldyBfY2xpZW50QXBpMi5Db25maWdBcGkoe1xuICAgICAgY2xlYXJEZWNvcmF0b3JzOiBjbGVhckRlY29yYXRvcnMsXG4gICAgICBzdG9yeVN0b3JlOiBzdG9yeVN0b3JlLFxuICAgICAgY2hhbm5lbDogY2hhbm5lbCxcbiAgICAgIGNsaWVudEFwaTogY2xpZW50QXBpXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbmZpZ0FwaTogY29uZmlnQXBpLFxuICAgICAgc3RvcnlTdG9yZTogc3RvcnlTdG9yZSxcbiAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICBjbGllbnRBcGk6IGNsaWVudEFwaSxcbiAgICAgIHNob3dNYWluOiBzaG93TWFpbixcbiAgICAgIHNob3dFcnJvcjogc2hvd0Vycm9yLFxuICAgICAgc2hvd0V4Y2VwdGlvbjogc2hvd0V4Y2VwdGlvblxuICAgIH07XG4gIH07XG59KCk7XG5cbmV4cG9ydHMuZ2V0Q29udGV4dCA9IGdldENvbnRleHQ7XG5cbmZ1bmN0aW9uIGZvY3VzSW5JbnB1dChldmVudCkge1xuICByZXR1cm4gL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkgfHwgZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0KHJlbmRlcikge1xuICB2YXIgX3JlZjMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgZGVjb3JhdGVTdG9yeSA9IF9yZWYzLmRlY29yYXRlU3Rvcnk7XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0KGRlY29yYXRlU3RvcnkpO1xuICB2YXIgY2xpZW50QXBpID0gY29udGV4dC5jbGllbnRBcGksXG4gICAgICBjaGFubmVsID0gY29udGV4dC5jaGFubmVsLFxuICAgICAgY29uZmlnQXBpID0gY29udGV4dC5jb25maWdBcGksXG4gICAgICBzdG9yeVN0b3JlID0gY29udGV4dC5zdG9yeVN0b3JlOyAvLyBQcm92aWRlIGFjY2VzcyB0byBleHRlcm5hbCBzY3JpcHRzIGlmIGB3aW5kb3dgIGlzIGRlZmluZWQuXG4gIC8vIE5PVEUgdGhpcyBpcyBkaWZmZXJlbnQgdG8gaXNCcm93c2VyLCBwcmltYXJpbHkgZm9yIHRoZSBKU0RPTSB1c2UgY2FzZVxuXG4gIHZhciBwcmV2aW91c0tpbmQgPSAnJztcbiAgdmFyIHByZXZpb3VzU3RvcnkgPSAnJztcbiAgdmFyIHByZXZpb3VzUmV2aXNpb24gPSAtMTtcblxuICB2YXIgcmVuZGVyTWFpbiA9IGZ1bmN0aW9uIHJlbmRlck1haW4oZm9yY2VSZW5kZXIpIHtcbiAgICB2YXIgcmV2aXNpb24gPSBzdG9yeVN0b3JlLmdldFJldmlzaW9uKCk7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHN0b3J5U3RvcmUuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICB2YXIgX3JlZjQgPSBzZWxlY3Rpb24gfHwge30sXG4gICAgICAgIGtpbmQgPSBfcmVmNC5raW5kLFxuICAgICAgICBuYW1lID0gX3JlZjQubmFtZSxcbiAgICAgICAgZ2V0RGVjb3JhdGVkID0gX3JlZjQuZ2V0RGVjb3JhdGVkLFxuICAgICAgICBpZCA9IF9yZWY0LmlkO1xuXG4gICAgaWYgKGdldERlY29yYXRlZCkge1xuICAgICAgLy8gUmVuZGVyIHN0b3J5IG9ubHkgaWYgc2VsZWN0ZWRLaW5kIG9yIHNlbGVjdGVkU3RvcnkgaGF2ZSBjaGFuZ2VkLlxuICAgICAgLy8gSG93ZXZlciwgd2UgRE8gd2FudCB0aGUgc3RvcnkgdG8gcmUtcmVuZGVyIGlmIHRoZSBzdG9yZSBpdHNlbGYgaGFzIGNoYW5nZWRcbiAgICAgIC8vICh3aGljaCBoYXBwZW5zIGF0IHRoZSBtb21lbnQgd2hlbiBITVIgb2NjdXJzKVxuICAgICAgaWYgKCFmb3JjZVJlbmRlciAmJiByZXZpc2lvbiA9PT0gcHJldmlvdXNSZXZpc2lvbiAmJiBraW5kID09PSBwcmV2aW91c0tpbmQgJiYgcHJldmlvdXNTdG9yeSA9PT0gbmFtZSkge1xuICAgICAgICBfYWRkb25zW1wiZGVmYXVsdFwiXS5nZXRDaGFubmVsKCkuZW1pdChfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uU1RPUllfVU5DSEFOR0VELCBpZCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZvcmNlUmVuZGVyICYmIHByZXZpb3VzS2luZCAmJiBwcmV2aW91c1N0b3J5KSB7XG4gICAgICAgIF9hZGRvbnNbXCJkZWZhdWx0XCJdLmdldENoYW5uZWwoKS5lbWl0KF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5TVE9SWV9DSEFOR0VELCBpZCk7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcihPYmplY3QuYXNzaWduKHt9LCBjb250ZXh0LCBzZWxlY3Rpb24sIHtcbiAgICAgICAgc2VsZWN0ZWRLaW5kOiBraW5kLFxuICAgICAgICBzZWxlY3RlZFN0b3J5OiBuYW1lLFxuICAgICAgICBmb3JjZVJlbmRlcjogZm9yY2VSZW5kZXJcbiAgICAgIH0pKTtcblxuICAgICAgX2FkZG9uc1tcImRlZmF1bHRcIl0uZ2V0Q2hhbm5lbCgpLmVtaXQoX2NvcmVFdmVudHNbXCJkZWZhdWx0XCJdLlNUT1JZX1JFTkRFUkVELCBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3dOb3ByZXZpZXcoKTtcblxuICAgICAgX2FkZG9uc1tcImRlZmF1bHRcIl0uZ2V0Q2hhbm5lbCgpLmVtaXQoX2NvcmVFdmVudHNbXCJkZWZhdWx0XCJdLlNUT1JZX01JU1NJTkcsIGlkKTtcbiAgICB9XG5cbiAgICBwcmV2aW91c1JldmlzaW9uID0gcmV2aXNpb247XG4gICAgcHJldmlvdXNLaW5kID0ga2luZDtcbiAgICBwcmV2aW91c1N0b3J5ID0gbmFtZTtcblxuICAgIGlmICghZm9yY2VSZW5kZXIpIHtcbiAgICAgIF9nbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuICB9OyAvLyBpbml0aWFsaXplIHRoZSBVSVxuXG5cbiAgdmFyIHJlbmRlclVJID0gZnVuY3Rpb24gcmVuZGVyVUkoZm9yY2VSZW5kZXIpIHtcbiAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZW5kZXJNYWluKGZvcmNlUmVuZGVyKTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHNob3dFeGNlcHRpb24oZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgZm9yY2VSZVJlbmRlciA9IGZ1bmN0aW9uIGZvcmNlUmVSZW5kZXIoKSB7XG4gICAgcmV0dXJuIHJlbmRlclVJKHRydWUpO1xuICB9OyAvLyBjaGFubmVsIGNhbiBiZSBudWxsIGluIE5vZGVKU1xuXG5cbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHZhciBkZXByZWNhdGVkVG9JZCA9ICgwLCBfdXRpbERlcHJlY2F0ZVtcImRlZmF1bHRcIl0pKF91dGlscy50b0lkLCBcIlBhc3NpbmcgbmFtZStraW5kIHRvIHRoZSBTRVRfQ1VSUkVOVF9TVE9SWSBldmVudCBpcyBkZXByZWNhdGVkLCB1c2UgYSBzdG9yeUlkIGluc3RlYWRcIik7XG4gICAgY2hhbm5lbC5vbihfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uRk9SQ0VfUkVfUkVOREVSLCBmb3JjZVJlUmVuZGVyKTtcbiAgICBjaGFubmVsLm9uKF9jb3JlRXZlbnRzW1wiZGVmYXVsdFwiXS5TRVRfQ1VSUkVOVF9TVE9SWSwgZnVuY3Rpb24gKF9yZWY1KSB7XG4gICAgICB2YXIgaW5wdXRTdG9yeUlkID0gX3JlZjUuc3RvcnlJZCxcbiAgICAgICAgICBuYW1lID0gX3JlZjUubmFtZSxcbiAgICAgICAgICBraW5kID0gX3JlZjUua2luZDtcbiAgICAgIHZhciBzdG9yeUlkID0gaW5wdXRTdG9yeUlkOyAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgICAgaWYgKCFzdG9yeUlkKSB7XG4gICAgICAgIGlmICghbmFtZSB8fCAha2luZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBwYXNzIGBzdG9yeUlkYCBpbnRvIFNFVF9DVVJSRU5UX1NUT1JZJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9yeUlkID0gZGVwcmVjYXRlZFRvSWQoa2luZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBkYXRhID0gc3RvcnlTdG9yZS5mcm9tSWQoc3RvcnlJZCk7XG4gICAgICBzdG9yeVN0b3JlLnNldFNlbGVjdGlvbihkYXRhKTtcbiAgICAgIHN0b3J5U3RvcmUuc2V0UGF0aChzdG9yeUlkKTtcbiAgICB9KTsgLy8gSGFuZGxlIGtleWJvYXJkIHNob3J0Y3V0c1xuXG4gICAgX2dsb2JhbC53aW5kb3cub25rZXlkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoIWZvY3VzSW5JbnB1dChldmVudCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSB0byBwaWNrIG9mZiB0aGUga2V5cyBvZiB0aGUgZXZlbnQgdGhhdCB3ZSBuZWVkIG9uIHRoZSBvdGhlciBzaWRlXG4gICAgICAgIHZhciBhbHRLZXkgPSBldmVudC5hbHRLZXksXG4gICAgICAgICAgICBjdHJsS2V5ID0gZXZlbnQuY3RybEtleSxcbiAgICAgICAgICAgIG1ldGFLZXkgPSBldmVudC5tZXRhS2V5LFxuICAgICAgICAgICAgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleSxcbiAgICAgICAgICAgIGtleSA9IGV2ZW50LmtleSxcbiAgICAgICAgICAgIGNvZGUgPSBldmVudC5jb2RlLFxuICAgICAgICAgICAga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7XG4gICAgICAgIGNoYW5uZWwuZW1pdChfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uUFJFVklFV19LRVlET1dOLCB7XG4gICAgICAgICAgZXZlbnQ6IHtcbiAgICAgICAgICAgIGFsdEtleTogYWx0S2V5LFxuICAgICAgICAgICAgY3RybEtleTogY3RybEtleSxcbiAgICAgICAgICAgIG1ldGFLZXk6IG1ldGFLZXksXG4gICAgICAgICAgICBzaGlmdEtleTogc2hpZnRLZXksXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgICBrZXlDb2RlOiBrZXlDb2RlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RvcnlTdG9yZS5vbihfY29yZUV2ZW50c1tcImRlZmF1bHRcIl0uU1RPUllfUkVOREVSLCByZW5kZXJVSSk7XG5cbiAgaWYgKHR5cGVvZiBfZ2xvYmFsLndpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBfZ2xvYmFsLndpbmRvdy5fX1NUT1JZQk9PS19DTElFTlRfQVBJX18gPSBjbGllbnRBcGk7XG4gICAgX2dsb2JhbC53aW5kb3cuX19TVE9SWUJPT0tfQURET05TX0NIQU5ORUxfXyA9IGNoYW5uZWw7IC8vIG1heSBub3QgYmUgZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgIGNsaWVudEFwaTogY2xpZW50QXBpLFxuICAgIGNvbmZpZ0FwaTogY29uZmlnQXBpLFxuICAgIGZvcmNlUmVSZW5kZXI6IGZvcmNlUmVSZW5kZXJcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2xcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLmRlc2NyaXB0aW9uXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXRcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pcy1hcnJheVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5kYXRlLnRvLXN0cmluZ1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5iaW5kXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3RvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNyZWF0ZUNoYW5uZWw7XG5leHBvcnRzLlBvc3Rtc2dUcmFuc3BvcnQgPSBleHBvcnRzLktFWSA9IHZvaWQgMDtcblxudmFyIF9nbG9iYWwgPSByZXF1aXJlKFwiZ2xvYmFsXCIpO1xuXG52YXIgX2NoYW5uZWxzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9jaGFubmVsc1wiKSk7XG5cbnZhciBfY2xpZW50TG9nZ2VyID0gcmVxdWlyZShcIkBzdG9yeWJvb2svY2xpZW50LWxvZ2dlclwiKTtcblxudmFyIF90ZWxlanNvbiA9IHJlcXVpcmUoXCJ0ZWxlanNvblwiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIEtFWSA9ICdzdG9yeWJvb2stY2hhbm5lbCc7IC8vIFRPRE86IHdlIHNob3VsZCBleHBvcnQgYSBtZXRob2QgZm9yIG9wZW5pbmcgY2hpbGQgd2luZG93cyBoZXJlIGFuZCBrZWVwIHRyYWNrIG9mIGVtLlxuLy8gdGhhdCB3YXkgd2UgY2FuIHNlbmQgcG9zdE1lc3NhZ2UgdG8gY2hpbGQgd2luZG93cyBhcyB3ZWxsLCBub3QganVzdCBpZnJhbWVcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYzNDAxNjAvaG93LXRvLWdldC10aGUtcmVmZXJlbmNlcy1vZi1hbGwtYWxyZWFkeS1vcGVuZWQtY2hpbGQtd2luZG93c1xuXG5leHBvcnRzLktFWSA9IEtFWTtcblxudmFyIFBvc3Rtc2dUcmFuc3BvcnQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXBhcmFtZXRlci1wcm9wZXJ0aWVzXG4gIGZ1bmN0aW9uIFBvc3Rtc2dUcmFuc3BvcnQoY29uZmlnKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBvc3Rtc2dUcmFuc3BvcnQpO1xuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5idWZmZXIgPSB2b2lkIDA7XG4gICAgdGhpcy5oYW5kbGVyID0gdm9pZCAwO1xuICAgIHRoaXMuY29ubmVjdGVkID0gdm9pZCAwO1xuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgdGhpcy5oYW5kbGVyID0gbnVsbDtcblxuICAgIF9nbG9iYWwud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyksIGZhbHNlKTsgLy8gQ2hlY2sgd2hldGhlciB0aGUgY29uZmlnLnBhZ2UgcGFyYW1ldGVyIGhhcyBhIHZhbGlkIHZhbHVlXG5cblxuICAgIGlmIChjb25maWcucGFnZSAhPT0gJ21hbmFnZXInICYmIGNvbmZpZy5wYWdlICE9PSAncHJldmlldycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBvc3Rtc2ctY2hhbm5lbDogXFxcImNvbmZpZy5wYWdlXFxcIiBjYW5ub3QgYmUgXFxcIlwiLmNvbmNhdChjb25maWcucGFnZSwgXCJcXFwiXCIpKTtcbiAgICB9XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUG9zdG1zZ1RyYW5zcG9ydCwgW3tcbiAgICBrZXk6IFwic2V0SGFuZGxlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhhbmRsZXIuYXBwbHkoX3RoaXMsIGFyZ3MpO1xuXG4gICAgICAgIGlmICghX3RoaXMuY29ubmVjdGVkICYmIF90aGlzLmdldFdpbmRvdygpKSB7XG4gICAgICAgICAgX3RoaXMuZmx1c2goKTtcblxuICAgICAgICAgIF90aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGBldmVudGAgdG8gdGhlIGFzc29jaWF0ZWQgd2luZG93LiBJZiB0aGUgd2luZG93IGRvZXMgbm90IHlldCBleGlzdFxuICAgICAqIHRoZSBldmVudCB3aWxsIGJlIHN0b3JlZCBpbiBhIGJ1ZmZlciBhbmQgc2VudCB3aGVuIHRoZSB3aW5kb3cgZXhpc3RzLlxuICAgICAqIEBwYXJhbSBldmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2VuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZW5kKGV2ZW50LCBvcHRpb25zKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGlmcmFtZVdpbmRvdyA9IHRoaXMuZ2V0V2luZG93KCk7XG5cbiAgICAgIGlmICghaWZyYW1lV2luZG93KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgX3RoaXMyLmJ1ZmZlci5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3Q6IHJlamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRlcHRoID0gMTU7XG4gICAgICB2YXIgYWxsb3dGdW5jdGlvbiA9IHRydWU7XG5cbiAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLmFsbG93RnVuY3Rpb24gPT09ICdib29sZWFuJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgYWxsb3dGdW5jdGlvbiA9IG9wdGlvbnMuYWxsb3dGdW5jdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMgJiYgTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLmRlcHRoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgZGVwdGggPSBvcHRpb25zLmRlcHRoO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGF0YSA9ICgwLCBfdGVsZWpzb24uc3RyaW5naWZ5KSh7XG4gICAgICAgIGtleTogS0VZLFxuICAgICAgICBldmVudDogZXZlbnRcbiAgICAgIH0sIHtcbiAgICAgICAgbWF4RGVwdGg6IGRlcHRoLFxuICAgICAgICBhbGxvd0Z1bmN0aW9uOiBhbGxvd0Z1bmN0aW9uXG4gICAgICB9KTsgLy8gVE9ETzogaW52ZXN0aWdhdGUgaHR0cDovL2Jsb2cudGVhbXRyZWVob3VzZS5jb20vY3Jvc3MtZG9tYWluLW1lc3NhZ2luZy13aXRoLXBvc3RtZXNzYWdlXG4gICAgICAvLyBtaWdodCByZXBsYWNlICcqJyB3aXRoIGRvY3VtZW50LmxvY2F0aW9uID9cblxuICAgICAgaWZyYW1lV2luZG93LnBvc3RNZXNzYWdlKGRhdGEsICcqJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmbHVzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuICAgICAgYnVmZmVyLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgX3RoaXMzLnNlbmQoaXRlbS5ldmVudCkudGhlbihpdGVtLnJlc29sdmUpW1wiY2F0Y2hcIl0oaXRlbS5yZWplY3QpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFdpbmRvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcucGFnZSA9PT0gJ21hbmFnZXInKSB7XG4gICAgICAgIC8vIEZJWE1FIHRoaXMgaXMgYSByZWFsbHkgYmFkIGlkZWEhIHVzZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy5cbiAgICAgICAgLy8gVGhpcyBmaW5kcyB0aGUgc3Rvcnlib29rIHByZXZpZXcgaWZyYW1lIHRvIHNlbmQgbWVzc2FnZXMgdG8uXG4gICAgICAgIHZhciBpZnJhbWUgPSBfZ2xvYmFsLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9yeWJvb2stcHJldmlldy1pZnJhbWUnKTtcblxuICAgICAgICBpZiAoIWlmcmFtZSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGlmcmFtZS5jb250ZW50V2luZG93O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2dsb2JhbC53aW5kb3cucGFyZW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoYW5kbGVFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFdmVudChyYXdFdmVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGRhdGEgPSByYXdFdmVudC5kYXRhO1xuXG4gICAgICAgIHZhciBfcmVmID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICYmICgwLCBfdGVsZWpzb24uaXNKU09OKShkYXRhKSA/ICgwLCBfdGVsZWpzb24ucGFyc2UpKGRhdGEpIDogZGF0YSxcbiAgICAgICAgICAgIGtleSA9IF9yZWYua2V5LFxuICAgICAgICAgICAgZXZlbnQgPSBfcmVmLmV2ZW50O1xuXG4gICAgICAgIGlmIChrZXkgPT09IEtFWSkge1xuICAgICAgICAgIF9jbGllbnRMb2dnZXIubG9nZ2VyLmRlYnVnLmFwcGx5KF9jbGllbnRMb2dnZXIubG9nZ2VyLCBbXCJtZXNzYWdlIGFycml2ZWQgYXQgXCIuY29uY2F0KHRoaXMuY29uZmlnLnBhZ2UpLCBldmVudC50eXBlXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGV2ZW50LmFyZ3MpKSk7XG5cbiAgICAgICAgICB0aGlzLmhhbmRsZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBfY2xpZW50TG9nZ2VyLmxvZ2dlci5lcnJvcihlcnJvcik7IC8vIGRlYnVnZ2VyO1xuXG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvc3Rtc2dUcmFuc3BvcnQ7XG59KCk7XG4vKipcbiAqIENyZWF0ZXMgYSBjaGFubmVsIHdoaWNoIGNvbW11bmljYXRlcyB3aXRoIGFuIGlmcmFtZSBvciBjaGlsZCB3aW5kb3cuXG4gKi9cblxuXG5leHBvcnRzLlBvc3Rtc2dUcmFuc3BvcnQgPSBQb3N0bXNnVHJhbnNwb3J0O1xuXG5mdW5jdGlvbiBjcmVhdGVDaGFubmVsKF9yZWYyKSB7XG4gIHZhciBwYWdlID0gX3JlZjIucGFnZTtcbiAgdmFyIHRyYW5zcG9ydCA9IG5ldyBQb3N0bXNnVHJhbnNwb3J0KHtcbiAgICBwYWdlOiBwYWdlXG4gIH0pO1xuICByZXR1cm4gbmV3IF9jaGFubmVsc1tcImRlZmF1bHRcIl0oe1xuICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0XG4gIH0pO1xufSIsIi8vIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYmluZFxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnRnVuY3Rpb24nLCBwcm90bzogdHJ1ZSB9LCB7XG4gIGJpbmQ6IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kJylcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc0ZvcmNlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1mb3JjZWQnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKS5mO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5JykuZjtcbnZhciBpbnRlcm5hbFN0cmluZ1RyaW0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3RyaW5nLXRyaW0nKTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciBOYXRpdmVOdW1iZXIgPSBnbG9iYWxbTlVNQkVSXTtcbnZhciBOdW1iZXJQcm90b3R5cGUgPSBOYXRpdmVOdW1iZXIucHJvdG90eXBlO1xuXG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ0xBU1NPRiA9IGNsYXNzb2YocmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKShOdW1iZXJQcm90b3R5cGUpKSA9PSBOVU1CRVI7XG52YXIgTkFUSVZFX1RSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gYFRvTnVtYmVyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvbnVtYmVyXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgdmFyIGZpcnN0LCB0aGlyZCwgcmFkaXgsIG1heENvZGUsIGRpZ2l0cywgbGVuZ3RoLCBpLCBjb2RlO1xuICBpZiAodHlwZW9mIGl0ID09ICdzdHJpbmcnICYmIGl0Lmxlbmd0aCA+IDIpIHtcbiAgICBpdCA9IE5BVElWRV9UUklNID8gaXQudHJpbSgpIDogaW50ZXJuYWxTdHJpbmdUcmltKGl0LCAzKTtcbiAgICBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIG9mIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIG9mIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGRpZ2l0cyA9IGl0LnNsaWNlKDIpO1xuICAgICAgbGVuZ3RoID0gZGlnaXRzLmxlbmd0aDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG4vLyBgTnVtYmVyYCBjb25zdHJ1Y3RvclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLWNvbnN0cnVjdG9yXG5pZiAoaXNGb3JjZWQoTlVNQkVSLCAhTmF0aXZlTnVtYmVyKCcgMG8xJykgfHwgIU5hdGl2ZU51bWJlcignMGIxJykgfHwgTmF0aXZlTnVtYmVyKCcrMHgxJykpKSB7XG4gIHZhciBOdW1iZXJXcmFwcGVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgTnVtYmVyV3JhcHBlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NMQVNTT0YgPyBmYWlscyhmdW5jdGlvbiAoKSB7IE51bWJlclByb3RvdHlwZS52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY2xhc3NvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IE5hdGl2ZU51bWJlcih0b051bWJlcihpdCkpLCB0aGF0LCBOdW1iZXJXcmFwcGVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpID8gZ2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVOdW1iZXIpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVMyMDE1IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVMyMDE1IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoTmF0aXZlTnVtYmVyLCBrZXkgPSBrZXlzW2pdKSAmJiAhaGFzKE51bWJlcldyYXBwZXIsIGtleSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KE51bWJlcldyYXBwZXIsIGtleSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5hdGl2ZU51bWJlciwga2V5KSk7XG4gICAgfVxuICB9XG4gIE51bWJlcldyYXBwZXIucHJvdG90eXBlID0gTnVtYmVyUHJvdG90eXBlO1xuICBOdW1iZXJQcm90b3R5cGUuY29uc3RydWN0b3IgPSBOdW1iZXJXcmFwcGVyO1xuICByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgTnVtYmVyV3JhcHBlcik7XG59XG4iLCJ2YXIgcmVxdWlyZU9iamVjdENvZXJjaWJsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZXF1aXJlLW9iamVjdC1jb2VyY2libGUnKTtcbnZhciB3aGl0ZXNwYWNlID0gJ1snICsgcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3doaXRlc3BhY2VzJykgKyAnXSc7XG52YXIgbHRyaW0gPSBSZWdFeHAoJ14nICsgd2hpdGVzcGFjZSArIHdoaXRlc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHdoaXRlc3BhY2UgKyB3aGl0ZXNwYWNlICsgJyokJyk7XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1TdGFydFxuLy8gMiAtPiBTdHJpbmcjdHJpbUVuZFxuLy8gMyAtPiBTdHJpbmcjdHJpbVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG4iLCIvLyBhIHN0cmluZyBvZiBhbGwgdmFsaWQgdW5pY29kZSB3aGl0ZXNwYWNlc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbm1vZHVsZS5leHBvcnRzID0gJ1xcdTAwMDlcXHUwMDBBXFx1MDAwQlxcdTAwMENcXHUwMDBEXFx1MDAyMFxcdTAwQTBcXHUxNjgwXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMEFcXHUyMDJGXFx1MjA1RlxcdTMwMDBcXHUyMDI4XFx1MjAyOVxcdUZFRkYnO1xuIiwiLy8gYE51bWJlci5pc0ludGVnZXJgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbnVtYmVyLmlzaW50ZWdlclxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnTnVtYmVyJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzSW50ZWdlcjogcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLWludGVnZXInKVxufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgTnVtYmVyLmlzSW50ZWdlcmAgbWV0aG9kIGltcGxlbWVudGF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNpbnRlZ2VyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJykuZjtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgbWFjcm90YXNrID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Rhc2snKS5zZXQ7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQnKTtcbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICEvKGlQaG9uZXxpUG9kfGlQYWQpLipBcHBsZVdlYktpdC9pLnRlc3QodXNlckFnZW50KSkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHZhciBjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGU7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY29uc29sZS5lcnJvcihhKSA6IGNvbnNvbGUuZXJyb3IoYSwgYik7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlLCB2YWx1ZTogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIHZhbHVlOiBlcnJvciB9O1xuICB9XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnBhcnNlID0gZXhwb3J0cy5zdHJpbmdpZnkgPSBleHBvcnRzLmlzSlNPTiA9IGV4cG9ydHMucmV2aXZlciA9IGV4cG9ydHMucmVwbGFjZXIgPSB2b2lkIDA7XG5cbnZhciBfZ2xvYmFsID0gcmVxdWlyZShcImdsb2JhbFwiKTtcblxudmFyIF9pc1JlZ2V4ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiaXMtcmVnZXhcIikpO1xuXG52YXIgX2lzRnVuY3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJpcy1mdW5jdGlvblwiKSk7XG5cbnZhciBfaXNTeW1ib2wgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJpcy1zeW1ib2xcIikpO1xuXG52YXIgX2lzb2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiaXNvYmplY3RcIikpO1xuXG52YXIgX2dldCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImxvZGFzaC9nZXRcIikpO1xuXG52YXIgX21lbW9pemVyaWZpYyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIm1lbW9pemVyaWZpY1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgcmVtb3ZlQ29kZUNvbW1lbnRzID0gZnVuY3Rpb24gcmVtb3ZlQ29kZUNvbW1lbnRzKGNvZGUpIHtcbiAgdmFyIGluUXVvdGVDaGFyID0gbnVsbDtcbiAgdmFyIGluQmxvY2tDb21tZW50ID0gZmFsc2U7XG4gIHZhciBpbkxpbmVDb21tZW50ID0gZmFsc2U7XG4gIHZhciBpblJlZ2V4TGl0ZXJhbCA9IGZhbHNlO1xuICB2YXIgbmV3Q29kZSA9ICcnO1xuXG4gIGlmIChjb2RlLmluZGV4T2YoJy8vJykgPj0gMCB8fCBjb2RlLmluZGV4T2YoJy8qJykgPj0gMCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKCFpblF1b3RlQ2hhciAmJiAhaW5CbG9ja0NvbW1lbnQgJiYgIWluTGluZUNvbW1lbnQgJiYgIWluUmVnZXhMaXRlcmFsKSB7XG4gICAgICAgIGlmIChjb2RlW2ldID09PSAnXCInIHx8IGNvZGVbaV0gPT09IFwiJ1wiIHx8IGNvZGVbaV0gPT09ICdgJykge1xuICAgICAgICAgIGluUXVvdGVDaGFyID0gY29kZVtpXTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlW2ldID09PSAnLycgJiYgY29kZVtpICsgMV0gPT09ICcqJykge1xuICAgICAgICAgIGluQmxvY2tDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlW2ldID09PSAnLycgJiYgY29kZVtpICsgMV0gPT09ICcvJykge1xuICAgICAgICAgIGluTGluZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGVbaV0gPT09ICcvJyAmJiBjb2RlW2kgKyAxXSAhPT0gJy8nKSB7XG4gICAgICAgICAgaW5SZWdleExpdGVyYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5RdW90ZUNoYXIgJiYgKGNvZGVbaV0gPT09IGluUXVvdGVDaGFyICYmIGNvZGVbaSAtIDFdICE9PSAnXFxcXCcgfHwgY29kZVtpXSA9PT0gJ1xcbicgJiYgaW5RdW90ZUNoYXIgIT09ICdgJykpIHtcbiAgICAgICAgICBpblF1b3RlQ2hhciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5SZWdleExpdGVyYWwgJiYgKGNvZGVbaV0gPT09ICcvJyAmJiBjb2RlW2kgLSAxXSAhPT0gJ1xcXFwnIHx8IGNvZGVbaV0gPT09ICdcXG4nKSkge1xuICAgICAgICAgIGluUmVnZXhMaXRlcmFsID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5CbG9ja0NvbW1lbnQgJiYgY29kZVtpIC0gMV0gPT09ICcvJyAmJiBjb2RlW2kgLSAyXSA9PT0gJyonKSB7XG4gICAgICAgICAgaW5CbG9ja0NvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbkxpbmVDb21tZW50ICYmIGNvZGVbaV0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgaW5MaW5lQ29tbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5CbG9ja0NvbW1lbnQgJiYgIWluTGluZUNvbW1lbnQpIHtcbiAgICAgICAgbmV3Q29kZSArPSBjb2RlW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdDb2RlID0gY29kZTtcbiAgfVxuXG4gIHJldHVybiBuZXdDb2RlO1xufTtcblxudmFyIGNsZWFuQ29kZSA9ICgwLCBfbWVtb2l6ZXJpZmljLmRlZmF1bHQpKDEwMDAwKShmdW5jdGlvbiAoY29kZSkge1xuICByZXR1cm4gcmVtb3ZlQ29kZUNvbW1lbnRzKGNvZGUpLnJlcGxhY2UoL1xcblxccyovZywgJycpIC8vIHJlbW92ZSBpbmRlbnRzICYgbmV3bGluZXNcbiAgLnRyaW0oKTtcbn0pO1xudmFyIGRhdGVGb3JtYXQgPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KFxcLlxcZHszfSk/WiQvO1xuXG52YXIgcmVwbGFjZXIgPSBmdW5jdGlvbiByZXBsYWNlcihvcHRpb25zKSB7XG4gIHZhciBvYmplY3RzO1xuICB2YXIgc3RhY2s7XG4gIHZhciBrZXlzO1xuICByZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShrZXksIHZhbHVlKSB7XG4gICAgLy8gIHZlcnkgZmlyc3QgaXRlcmF0aW9uXG4gICAgaWYgKGtleSA9PT0gJycpIHtcbiAgICAgIGtleXMgPSBbJ3Jvb3QnXTtcbiAgICAgIG9iamVjdHMgPSBbe1xuICAgICAgICBrZXlzOiAncm9vdCcsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfV07XG4gICAgICBzdGFjayA9IFtdO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gLy8gRnJvbSB0aGUgSlNPTi5zdHJpbmdpZnkncyBkb2M6XG4gICAgLy8gXCJUaGUgb2JqZWN0IGluIHdoaWNoIHRoZSBrZXkgd2FzIGZvdW5kIGlzIHByb3ZpZGVkIGFzIHRoZSByZXBsYWNlcidzIHRoaXMgcGFyYW1ldGVyLlwiIHRodXMgb25lIGNhbiBjb250cm9sIHRoZSBkZXB0aFxuXG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoICYmIHRoaXMgIT09IHN0YWNrWzBdKSB7XG4gICAgICBzdGFjay5zaGlmdCgpO1xuICAgICAga2V5cy5wb3AoKTtcbiAgICB9XG5cbiAgICBpZiAoKDAsIF9pc1JlZ2V4LmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICAgaWYgKCFvcHRpb25zLmFsbG93UmVnRXhwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBcIl9yZWdleHBfXCIuY29uY2F0KHZhbHVlLmZsYWdzLCBcInxcIikuY29uY2F0KHZhbHVlLnNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKCgwLCBfaXNGdW5jdGlvbi5kZWZhdWx0KSh2YWx1ZSkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hbGxvd0Z1bmN0aW9uKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIHZhciBzdHJpbmdpZmllZCA9IHZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGlmICghc3RyaW5naWZpZWQubWF0Y2goLyhcXFtuYXRpdmUgY29kZVxcXXxXRUJQQUNLX0lNUE9SVEVEX01PRFVMRXxfX3dlYnBhY2tfZXhwb3J0c19ffF9fd2VicGFja19yZXF1aXJlX18pLykpIHtcbiAgICAgICAgcmV0dXJuIFwiX2Z1bmN0aW9uX1wiLmNvbmNhdChuYW1lLCBcInxcIikuY29uY2F0KGNsZWFuQ29kZShzdHJpbmdpZmllZCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gXCJfZnVuY3Rpb25fXCIuY29uY2F0KG5hbWUsIFwifFwiKS5jb25jYXQoZnVuY3Rpb24gKCkge30udG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKCgwLCBfaXNTeW1ib2wuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYWxsb3dTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiX3N5bWJvbF9cIi5jb25jYXQodmFsdWUudG9TdHJpbmcoKS5zbGljZSg3LCAtMSkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGRhdGVGb3JtYXQudGVzdCh2YWx1ZSkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hbGxvd0RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFwiX2RhdGVfXCIuY29uY2F0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFvcHRpb25zLmFsbG93VW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnX3VuZGVmaW5lZF8nO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gJ18tSW5maW5pdHlfJztcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gJ19JbmZpbml0eV8nO1xuICAgICAgfVxuXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJ19OYU5fJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHN0YWNrLmxlbmd0aCA+PSBvcHRpb25zLm1heERlcHRoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiW0FycmF5KFwiLmNvbmNhdCh2YWx1ZS5sZW5ndGgsIFwiKV1cIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnW09iamVjdF0nO1xuICAgIH1cblxuICAgIHZhciBmb3VuZCA9IG9iamVjdHMuZmluZChmdW5jdGlvbiAobykge1xuICAgICAgcmV0dXJuIG8udmFsdWUgPT09IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgaWYgKHZhbHVlICYmICgwLCBfaXNvYmplY3QuZGVmYXVsdCkodmFsdWUpICYmIHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgJiYgdmFsdWUuY29uc3RydWN0b3IubmFtZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmFsbG93Q2xhc3MpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHZhbHVlLCB7XG4gICAgICAgICAgICAnX2NvbnN0cnVjdG9yLW5hbWVfJzogdmFsdWUuY29uc3RydWN0b3IubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7Ly8gaW1tdXRhYmxlIG9iamVjdHMgY2FuJ3QgYmUgd3JpdHRlbiB0byBhbmQgdGhyb3dcbiAgICAgICAgICAvLyB3ZSBjb3VsZCBtYWtlIGEgZGVlcCBjb3B5IGJ1dCBpZiB0aGUgdXNlciB2YWx1ZXMgdGhlIGNvcnJlY3QgaW5zdGFuY2UgbmFtZSxcbiAgICAgICAgICAvLyB0aGUgdXNlciBzaG91bGQgbWFrZSB0aGUgZGVlcCBjb3B5IHRoZW1zZWx2ZXMuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICBzdGFjay51bnNoaWZ0KHZhbHVlKTtcbiAgICAgIG9iamVjdHMucHVzaCh7XG4gICAgICAgIGtleXM6IGtleXMuam9pbignLicpLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gLy8gIGFjdHVhbGx5LCBoZXJlJ3MgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgdGhlIGtleXMga2VlcGluZyBpcyB1c2VmdWxcblxuXG4gICAgcmV0dXJuIFwiX2R1cGxpY2F0ZV9cIi5jb25jYXQoZm91bmQua2V5cyk7XG4gIH07XG59O1xuXG5leHBvcnRzLnJlcGxhY2VyID0gcmVwbGFjZXI7XG5cbnZhciByZXZpdmVyID0gZnVuY3Rpb24gcmV2aXZlcigpIHtcbiAgdmFyIHJlZnMgPSBbXTtcbiAgdmFyIHJvb3Q7XG4gIHJldHVybiBmdW5jdGlvbiByZXZpdmUoa2V5LCB2YWx1ZSkge1xuICAgIC8vIGxhc3QgaXRlcmF0aW9uID0gcm9vdFxuICAgIGlmIChrZXkgPT09ICcnKSB7XG4gICAgICByb290ID0gdmFsdWU7IC8vIHJlc3RvcmUgY3ljbGljIHJlZnNcblxuICAgICAgcmVmcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBfcmVmLnRhcmdldCxcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IF9yZWYuY29udGFpbmVyLFxuICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBfcmVmLnJlcGxhY2VtZW50O1xuXG4gICAgICAgIGlmIChyZXBsYWNlbWVudCA9PT0gJ3Jvb3QnKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgY29udGFpbmVyW3RhcmdldF0gPSByb290O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgIGNvbnRhaW5lclt0YXJnZXRdID0gKDAsIF9nZXQuZGVmYXVsdCkocm9vdCwgcmVwbGFjZW1lbnQucmVwbGFjZSgncm9vdC4nLCAnJykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoa2V5ID09PSAnX2NvbnN0cnVjdG9yLW5hbWVfJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gLy8gZGVhbCB3aXRoIGluc3RhbmNlIG5hbWVzXG5cblxuICAgIGlmICgoMCwgX2lzb2JqZWN0LmRlZmF1bHQpKHZhbHVlKSAmJiB2YWx1ZVsnX2NvbnN0cnVjdG9yLW5hbWVfJ10pIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWVbJ19jb25zdHJ1Y3Rvci1uYW1lXyddO1xuXG4gICAgICBpZiAobmFtZSAhPT0gJ09iamVjdCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAgIHZhciBGbiA9IG5ldyBGdW5jdGlvbihcInJldHVybiBmdW5jdGlvbiBcIi5jb25jYXQobmFtZSwgXCIoKXt9XCIpKSgpO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodmFsdWUsIG5ldyBGbigpKTtcbiAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cblxuICAgICAgZGVsZXRlIHZhbHVlWydfY29uc3RydWN0b3ItbmFtZV8nXTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdfZnVuY3Rpb25fJykpIHtcbiAgICAgIHZhciBfdmFsdWUkbWF0Y2ggPSB2YWx1ZS5tYXRjaCgvX2Z1bmN0aW9uXyhbXnxdKilcXHwoLiopLyksXG4gICAgICAgICAgX3ZhbHVlJG1hdGNoMiA9IF9zbGljZWRUb0FycmF5KF92YWx1ZSRtYXRjaCwgMyksXG4gICAgICAgICAgX25hbWUgPSBfdmFsdWUkbWF0Y2gyWzFdLFxuICAgICAgICAgIHNvdXJjZSA9IF92YWx1ZSRtYXRjaDJbMl07IC8vIGxhenkgZXZhbCBvZiB0aGUgZnVuY3Rpb25cblxuXG4gICAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24gcmVzdWx0KCkge1xuICAgICAgICB2YXIgZiA9IGV2YWwoXCIoXCIuY29uY2F0KHNvdXJjZSwgXCIpXCIpKTtcbiAgICAgICAgZi5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCAndG9TdHJpbmcnLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsICduYW1lJywge1xuICAgICAgICB2YWx1ZTogX25hbWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdfcmVnZXhwXycpKSB7XG4gICAgICAvLyB0aGlzIHNwbGl0IGlzbid0IHdvcmtpbmcgY29ycmVjdGx5XG4gICAgICB2YXIgX3ZhbHVlJG1hdGNoMyA9IHZhbHVlLm1hdGNoKC9fcmVnZXhwXyhbXnxdKilcXHwoLiopLyksXG4gICAgICAgICAgX3ZhbHVlJG1hdGNoNCA9IF9zbGljZWRUb0FycmF5KF92YWx1ZSRtYXRjaDMsIDMpLFxuICAgICAgICAgIGZsYWdzID0gX3ZhbHVlJG1hdGNoNFsxXSxcbiAgICAgICAgICBfc291cmNlID0gX3ZhbHVlJG1hdGNoNFsyXTtcblxuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoX3NvdXJjZSwgZmxhZ3MpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ19kYXRlXycpKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUucmVwbGFjZSgnX2RhdGVfJywgJycpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdfZHVwbGljYXRlXycpKSB7XG4gICAgICByZWZzLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IGtleSxcbiAgICAgICAgY29udGFpbmVyOiB0aGlzLFxuICAgICAgICByZXBsYWNlbWVudDogdmFsdWUucmVwbGFjZSgnX2R1cGxpY2F0ZV8nLCAnJylcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnX3N5bWJvbF8nKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbCh2YWx1ZS5yZXBsYWNlKCdfc3ltYm9sXycsICcnKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09ICdfdW5kZWZpbmVkXycpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09ICdfLUluZmluaXR5XycpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgPT09ICdfSW5maW5pdHlfJykge1xuICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlID09PSAnX05hTl8nKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn07XG5cbmV4cG9ydHMucmV2aXZlciA9IHJldml2ZXI7XG5cbnZhciBpc0pTT04gPSBmdW5jdGlvbiBpc0pTT04oaW5wdXQpIHtcbiAgcmV0dXJuIGlucHV0Lm1hdGNoKC9eW1xcW1xce1xcXCJcXH1dLipbXFxdXFx9XFxcIl0kLyk7XG59O1xuXG5leHBvcnRzLmlzSlNPTiA9IGlzSlNPTjtcbnZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgbWF4RGVwdGg6IDEwLFxuICBzcGFjZTogdW5kZWZpbmVkLFxuICBhbGxvd0Z1bmN0aW9uOiB0cnVlLFxuICBhbGxvd1JlZ0V4cDogdHJ1ZSxcbiAgYWxsb3dEYXRlOiB0cnVlLFxuICBhbGxvd0NsYXNzOiB0cnVlLFxuICBhbGxvd1VuZGVmaW5lZDogdHJ1ZSxcbiAgYWxsb3dTeW1ib2w6IHRydWVcbn07XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gIHZhciBtZXJnZWRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgcmVwbGFjZXIobWVyZ2VkT3B0aW9ucyksIG9wdGlvbnMuc3BhY2UpO1xufTtcblxuZXhwb3J0cy5zdHJpbmdpZnkgPSBzdHJpbmdpZnk7XG5cbnZhciBwYXJzZSA9IGZ1bmN0aW9uIHBhcnNlKGRhdGEpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSwgcmV2aXZlcigpKTtcbn07XG5cbmV4cG9ydHMucGFyc2UgPSBwYXJzZTsiLCJtb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb25cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmbikge1xuICB2YXIgc3RyaW5nID0gdG9TdHJpbmcuY2FsbChmbilcbiAgcmV0dXJuIHN0cmluZyA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgc3RyaW5nICE9PSAnW29iamVjdCBSZWdFeHBdJykgfHxcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgLy8gSUU4IGFuZCBiZWxvd1xuICAgICAoZm4gPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmNvbmZpcm0gfHxcbiAgICAgIGZuID09PSB3aW5kb3cucHJvbXB0KSlcbn07XG4iLCIvKiFcbiAqIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgQXJyYXkuaXNBcnJheSh2YWwpID09PSBmYWxzZTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9nbG9iYWwgPSByZXF1aXJlKFwiZ2xvYmFsXCIpO1xuXG5yZXF1aXJlKFwiLi9hbmd1bGFyLXBvbHlmaWxsc1wiKTtcblxuX2dsb2JhbC53aW5kb3cuU1RPUllCT09LX0VOViA9ICdhbmd1bGFyJzsiLCJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvZXMvcmVmbGVjdFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvcHJvcG9zYWxzL3JlZmxlY3QtbWV0YWRhdGFcIik7XG5cbnJlcXVpcmUoXCJ6b25lLmpzL2Rpc3Qvem9uZVwiKTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3QuYXBwbHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5kZWxldGUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJykuUmVmbGVjdDtcbiIsInZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIG5hdGl2ZUFwcGx5ID0gKHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5hcHBseTtcbnZhciBmdW5jdGlvbkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG5cbi8vIE1TIEVkZ2UgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxudmFyIE9QVElPTkFMX0FSR1VNRU5UU19MSVNUID0gIXJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgbmF0aXZlQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4vLyBgUmVmbGVjdC5hcHBseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmFwcGx5XG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBPUFRJT05BTF9BUkdVTUVOVFNfTElTVCB9LCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkge1xuICAgIGFGdW5jdGlvbih0YXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiBuYXRpdmVBcHBseVxuICAgICAgPyBuYXRpdmVBcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbiAgICAgIDogZnVuY3Rpb25BcHBseS5jYWxsKHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KTtcbiAgfVxufSk7XG4iLCJ2YXIgY3JlYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mdW5jdGlvbi1iaW5kJyk7XG52YXIgbmF0aXZlQ29uc3RydWN0ID0gKHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5jb25zdHJ1Y3Q7XG5cbi8vIGBSZWZsZWN0LmNvbnN0cnVjdGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmNvbnN0cnVjdFxuLy8gTVMgRWRnZSBzdXBwb3J0cyBvbmx5IDIgYXJndW1lbnRzIGFuZCBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4vLyBGRiBOaWdodGx5IHNldHMgdGhpcmQgYXJndW1lbnQgYXMgYG5ldy50YXJnZXRgLCBidXQgZG9lcyBub3QgY3JlYXRlIGB0aGlzYCBmcm9tIGl0XG52YXIgTkVXX1RBUkdFVF9CVUcgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEobmF0aXZlQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIG5hdGl2ZUNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG52YXIgRk9SQ0VEID0gTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUc7XG5cbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEZPUkNFRCwgc2hhbTogRk9SQ0VEIH0sIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgYUZ1bmN0aW9uKFRhcmdldCk7XG4gICAgYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIG5hdGl2ZUNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbi8vIE1TIEVkZ2UgaGFzIGJyb2tlbiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IC0gdGhyb3dpbmcgaW5zdGVhZCBvZiByZXR1cm5pbmcgZmFsc2VcbnZhciBFUlJPUl9JTlNURUFEX09GX0ZBTFNFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKHt9LCAxLCB7IHZhbHVlOiAxIH0pLCAxLCB7IHZhbHVlOiAyIH0pO1xufSk7XG5cbi8vIGBSZWZsZWN0LmRlZmluZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZGVmaW5lcHJvcGVydHlcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IEVSUk9SX0lOU1RFQURfT0ZfRkFMU0UsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICBwcm9wZXJ0eUtleSA9IHRvUHJpbWl0aXZlKHByb3BlcnR5S2V5LCB0cnVlKTtcbiAgICBhbk9iamVjdChhdHRyaWJ1dGVzKTtcbiAgICB0cnkge1xuICAgICAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZih0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsInZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZGVsZXRlcHJvcGVydHlcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlID8gZmFsc2UgOiBkZWxldGUgdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgfVxufSk7XG4iLCJ2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcblxuLy8gYFJlZmxlY3QuZ2V0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuZ2V0XG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogYXJndW1lbnRzWzJdO1xuICB2YXIgZGVzY3JpcHRvciwgcHJvdG90eXBlO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzY3JpcHRvciA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZS5mKHRhcmdldCwgcHJvcGVydHlLZXkpKSByZXR1cm4gaGFzKGRlc2NyaXB0b3IsICd2YWx1ZScpXG4gICAgPyBkZXNjcmlwdG9yLnZhbHVlXG4gICAgOiBkZXNjcmlwdG9yLmdldCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgaWYgKGlzT2JqZWN0KHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvdHlwZSwgcHJvcGVydHlLZXksIHJlY2VpdmVyKTtcbn1cblxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgeyBnZXQ6IGdldCB9KTtcbiIsInZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Rlc2NyaXB0b3JzJyk7XG5cbi8vIGBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LmdldG93bnByb3BlcnR5ZGVzY3JpcHRvclxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFERVNDUklQVE9SUyB9LCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTtcbiIsInZhciBvYmplY3RHZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxuLy8gYFJlZmxlY3QuZ2V0UHJvdG90eXBlT2ZgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVmbGVjdC5nZXRwcm90b3R5cGVvZlxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUsIHNoYW06ICFDT1JSRUNUX1BST1RPVFlQRV9HRVRURVIgfSwge1xuICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG4gICAgcmV0dXJuIG9iamVjdEdldFByb3RvdHlwZU9mKGFuT2JqZWN0KHRhcmdldCkpO1xuICB9XG59KTtcbiIsIi8vIGBSZWZsZWN0Lmhhc2AgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0Lmhhc1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBoYXM6IGZ1bmN0aW9uIGhhcyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIHByb3BlcnR5S2V5IGluIHRhcmdldDtcbiAgfVxufSk7XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb2JqZWN0SXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuLy8gYFJlZmxlY3QuaXNFeHRlbnNpYmxlYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QuaXNleHRlbnNpYmxlXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGlzRXh0ZW5zaWJsZTogZnVuY3Rpb24gaXNFeHRlbnNpYmxlKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcmV0dXJuIG9iamVjdElzRXh0ZW5zaWJsZSA/IG9iamVjdElzRXh0ZW5zaWJsZSh0YXJnZXQpIDogdHJ1ZTtcbiAgfVxufSk7XG4iLCIvLyBgUmVmbGVjdC5vd25LZXlzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3Qub3dua2V5c1xucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwgeyBvd25LZXlzOiByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb3duLWtleXMnKSB9KTtcbiIsInZhciBnZXRCdWlsdEluID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1idWlsdC1pbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIEZSRUVaSU5HID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZyZWV6aW5nJyk7XG5cbi8vIGBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZmxlY3QucHJldmVudGV4dGVuc2lvbnNcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlLCBzaGFtOiAhRlJFRVpJTkcgfSwge1xuICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgdmFyIG9iamVjdFByZXZlbnRFeHRlbnNpb25zID0gZ2V0QnVpbHRJbignT2JqZWN0JywgJ3ByZXZlbnRFeHRlbnNpb25zJyk7XG4gICAgICBpZiAob2JqZWN0UHJldmVudEV4dGVuc2lvbnMpIG9iamVjdFByZXZlbnRFeHRlbnNpb25zKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvck1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbi8vIGBSZWZsZWN0LnNldGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LnNldFxuZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXTtcbiAgdmFyIG93bkRlc2NyaXB0b3IgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JNb2R1bGUuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvdHlwZTtcbiAgaWYgKCFvd25EZXNjcmlwdG9yKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSB7XG4gICAgICByZXR1cm4gc2V0KHByb3RvdHlwZSwgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwKTtcbiAgfVxuICBpZiAoaGFzKG93bkRlc2NyaXB0b3IsICd2YWx1ZScpKSB7XG4gICAgaWYgKG93bkRlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlIHx8ICFpc09iamVjdChyZWNlaXZlcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5KSkge1xuICAgICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvci5nZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLnNldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgICAgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgfSBlbHNlIGRlZmluZVByb3BlcnR5TW9kdWxlLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgVikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjcmlwdG9yLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzY3JpcHRvci5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7IHNldDogc2V0IH0pO1xuIiwidmFyIG9iamVjdFNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cycpO1xuXG4vLyBgUmVmbGVjdC5zZXRQcm90b3R5cGVPZmAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWZsZWN0LnNldHByb3RvdHlwZW9mXG5pZiAob2JqZWN0U2V0UHJvdG90eXBlT2YpIHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgc2V0UHJvdG90eXBlT2Y6IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pIHtcbiAgICB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBvYmplY3RTZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZGVmaW5lLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lc25leHQucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QuaGFzLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzbmV4dC5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXNuZXh0LnJlZmxlY3QubWV0YWRhdGEnKTtcbiIsInZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5zZXQ7XG5cbi8vIGBSZWZsZWN0LmRlZmluZU1ldGFkYXRhYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGRlZmluZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbM10pO1xuICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZS1hbGwnKTtcbnZhciBJbnRlcm5hbE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLW1ldGFkYXRhJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb2xsZWN0aW9uLXdlYWsnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBlbmZvcmNlSXRlcm5hbFN0YXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJykuZW5mb3JjZTtcbnZhciBOQVRJVkVfV0VBS19NQVAgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwJyk7XG52YXIgSVNfSUUxMSA9ICFnbG9iYWwuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gZ2xvYmFsO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgSW50ZXJuYWxXZWFrTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG4vLyBgV2Vha01hcGAgY29uc3RydWN0b3Jcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdlYWttYXAtY29uc3RydWN0b3JcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24nKSgnV2Vha01hcCcsIHdyYXBwZXIsIHdlYWssIHRydWUsIHRydWUpO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG4vLyBXZSBjYW4ndCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gYmVjYXVzZSBpdCBjcmFzaCBzb21lIG9sZCBJRSBidWlsZHNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy80ODVcbmlmIChOQVRJVkVfV0VBS19NQVAgJiYgSVNfSUUxMSkge1xuICBJbnRlcm5hbFdlYWtNYXAgPSB3ZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsICdXZWFrTWFwJywgdHJ1ZSk7XG4gIEludGVybmFsTWV0YWRhdGFNb2R1bGUuUkVRVUlSRUQgPSB0cnVlO1xuICB2YXIgV2Vha01hcFByb3RvdHlwZSA9ICRXZWFrTWFwLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZURlbGV0ZSA9IFdlYWtNYXBQcm90b3R5cGVbJ2RlbGV0ZSddO1xuICB2YXIgbmF0aXZlSGFzID0gV2Vha01hcFByb3RvdHlwZS5oYXM7XG4gIHZhciBuYXRpdmVHZXQgPSBXZWFrTWFwUHJvdG90eXBlLmdldDtcbiAgdmFyIG5hdGl2ZVNldCA9IFdlYWtNYXBQcm90b3R5cGUuc2V0O1xuICByZWRlZmluZUFsbChXZWFrTWFwUHJvdG90eXBlLCB7XG4gICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChpc09iamVjdChrZXkpICYmICFpc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgICB2YXIgc3RhdGUgPSBlbmZvcmNlSXRlcm5hbFN0YXRlKHRoaXMpO1xuICAgICAgICBpZiAoIXN0YXRlLmZyb3plbikgc3RhdGUuZnJvemVuID0gbmV3IEludGVybmFsV2Vha01hcCgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlRGVsZXRlLmNhbGwodGhpcywga2V5KSB8fCBzdGF0ZS5mcm96ZW5bJ2RlbGV0ZSddKGtleSk7XG4gICAgICB9IHJldHVybiBuYXRpdmVEZWxldGUuY2FsbCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUhhcy5jYWxsKHRoaXMsIGtleSkgfHwgc3RhdGUuZnJvemVuLmhhcyhrZXkpO1xuICAgICAgfSByZXR1cm4gbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KTtcbiAgICB9LFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgaWYgKGlzT2JqZWN0KGtleSkgJiYgIWlzRXh0ZW5zaWJsZShrZXkpKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGVuZm9yY2VJdGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghc3RhdGUuZnJvemVuKSBzdGF0ZS5mcm96ZW4gPSBuZXcgSW50ZXJuYWxXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBuYXRpdmVIYXMuY2FsbCh0aGlzLCBrZXkpID8gbmF0aXZlR2V0LmNhbGwodGhpcywga2V5KSA6IHN0YXRlLmZyb3plbi5nZXQoa2V5KTtcbiAgICAgIH0gcmV0dXJuIG5hdGl2ZUdldC5jYWxsKHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoa2V5KSAmJiAhaXNFeHRlbnNpYmxlKGtleSkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZW5mb3JjZUl0ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5mcm96ZW4pIHN0YXRlLmZyb3plbiA9IG5ldyBJbnRlcm5hbFdlYWtNYXAoKTtcbiAgICAgICAgbmF0aXZlSGFzLmNhbGwodGhpcywga2V5KSA/IG5hdGl2ZVNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpIDogc3RhdGUuZnJvemVuLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBuYXRpdmVTZXQuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2Vha0RhdGEgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtbWV0YWRhdGEnKS5nZXRXZWFrRGF0YTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgaXRlcmF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRlJyk7XG52YXIgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgSW50ZXJuYWxTdGF0ZU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbnRlcm5hbC1zdGF0ZScpO1xudmFyIHNldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLnNldDtcbnZhciBpbnRlcm5hbFN0YXRlR2V0dGVyRm9yID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3I7XG52YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG52YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoc3RvcmUpIHtcbiAgcmV0dXJuIHN0b3JlLmZyb3plbiB8fCAoc3RvcmUuZnJvemVuID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xuXG52YXIgVW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5lbnRyaWVzID0gW107XG59O1xuXG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5lbnRyaWVzLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuXG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5lbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmVudHJpZXMsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBDT05TVFJVQ1RPUl9OQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBDT05TVFJVQ1RPUl9OQU1FKTtcbiAgICAgIHNldEludGVybmFsU3RhdGUodGhhdCwge1xuICAgICAgICB0eXBlOiBDT05TVFJVQ1RPUl9OQU1FLFxuICAgICAgICBpZDogaWQrKyxcbiAgICAgICAgZnJvemVuOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgaXRlcmF0ZShpdGVyYWJsZSwgdGhhdFtBRERFUl0sIHRoYXQsIElTX01BUCk7XG4gICAgfSk7XG5cbiAgICB2YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IGludGVybmFsU3RhdGVHZXR0ZXJGb3IoQ09OU1RSVUNUT1JfTkFNRSk7XG5cbiAgICB2YXIgZGVmaW5lID0gZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhhdCk7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGFuT2JqZWN0KGtleSksIHRydWUpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUoc3RhdGUpLnNldChrZXksIHZhbHVlKTtcbiAgICAgIGVsc2UgZGF0YVtzdGF0ZS5pZF0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGF0O1xuICAgIH07XG5cbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpICYmIGRlbGV0ZSBkYXRhW3N0YXRlLmlkXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUodGhpcyk7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZShzdGF0ZSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgc3RhdGUuaWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIElTX01BUCA/IHtcbiAgICAgIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWtEYXRhKGtleSk7XG4gICAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHN0YXRlKS5nZXQoa2V5KTtcbiAgICAgICAgICByZXR1cm4gZGF0YSA/IGRhdGFbc3RhdGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSA6IHtcbiAgICAgIC8vIDIzLjQuMy4xIFdlYWtTZXQucHJvdG90eXBlLmFkZCh2YWx1ZSlcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmUodGhpcywgdmFsdWUsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIEM7XG4gIH1cbn07XG4iLCJ2YXIgUmVmbGVjdE1ldGFkYXRhTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlZmxlY3QtbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5O1xudmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUuZ2V0TWFwO1xudmFyIHN0b3JlID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnN0b3JlO1xuXG4vLyBgUmVmbGVjdC5kZWxldGVNZXRhZGF0YWAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmJ1Y2t0b24vcmVmbGVjdC1tZXRhZGF0YVxucmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpKHsgdGFyZ2V0OiAnUmVmbGVjdCcsIHN0YXQ6IHRydWUgfSwge1xuICBkZWxldGVNZXRhZGF0YTogZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICAgIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YWRhdGFLZXkoYXJndW1lbnRzWzJdKTtcbiAgICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICAgIGlmIChtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkIHx8ICFtZXRhZGF0YU1hcFsnZGVsZXRlJ10obWV0YWRhdGFLZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG1ldGFkYXRhTWFwLnNpemUpIHJldHVybiB0cnVlO1xuICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICAgIHRhcmdldE1ldGFkYXRhWydkZWxldGUnXSh0YXJnZXRLZXkpO1xuICAgIHJldHVybiAhIXRhcmdldE1ldGFkYXRhLnNpemUgfHwgc3RvcmVbJ2RlbGV0ZSddKHRhcmdldCk7XG4gIH1cbn0pO1xuIiwidmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmhhcztcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLmdldDtcbnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5O1xuXG52YXIgb3JkaW5hcnlHZXRNZXRhZGF0YSA9IGZ1bmN0aW9uIChNZXRhZGF0YUtleSwgTywgUCkge1xuICB2YXIgaGFzT3duID0gb3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gIGlmIChoYXNPd24pIHJldHVybiBvcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IHVuZGVmaW5lZDtcbn07XG5cbi8vIGBSZWZsZWN0LmdldE1ldGFkYXRhYCBtZXRob2Rcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yYnVja3Rvbi9yZWZsZWN0LW1ldGFkYXRhXG5yZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0JykoeyB0YXJnZXQ6ICdSZWZsZWN0Jywgc3RhdDogdHJ1ZSB9LCB7XG4gIGdldE1ldGFkYXRhOiBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMl0pO1xuICAgIHJldHVybiBvcmRpbmFyeUdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpO1xuICB9XG59KTtcbiIsInZhciBTZXQgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2VzLnNldCcpO1xudmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1wcm90b3R5cGUtb2YnKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5rZXlzO1xudmFyIHRvTWV0YWRhdGFLZXkgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUudG9LZXk7XG5cbnZhciBmcm9tID0gZnVuY3Rpb24gKGl0ZXIpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpdGVyYXRlKGl0ZXIsIHJlc3VsdC5wdXNoLCByZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxudmFyIG9yZGluYXJ5TWV0YWRhdGFLZXlzID0gZnVuY3Rpb24gKE8sIFApIHtcbiAgdmFyIG9LZXlzID0gb3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gIHZhciBwYXJlbnQgPSBnZXRQcm90b3R5cGVPZihPKTtcbiAgaWYgKHBhcmVudCA9PT0gbnVsbCkgcmV0dXJuIG9LZXlzO1xuICB2YXIgcEtleXMgPSBvcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICByZXR1cm4gcEtleXMubGVuZ3RoID8gb0tleXMubGVuZ3RoID8gZnJvbShuZXcgU2V0KG9LZXlzLmNvbmNhdChwS2V5cykpKSA6IHBLZXlzIDogb0tleXM7XG59O1xuXG4vLyBgUmVmbGVjdC5nZXRNZXRhZGF0YUtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZ2V0TWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRNZXRhZGF0YUtleXModGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMV0pO1xuICAgIHJldHVybiBvcmRpbmFyeU1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGBTZXRgIGNvbnN0cnVjdG9yXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zZXQtb2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29sbGVjdGlvbicpKCdTZXQnLCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBTZXQoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwgcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvbGxlY3Rpb24tc3Ryb25nJykpO1xuIiwidmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5nZXQ7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcblxuLy8gYFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlPd25NZXRhZGF0YUtleXMgPSBSZWZsZWN0TWV0YWRhdGFNb2R1bGUua2V5cztcbnZhciB0b01ldGFkYXRhS2V5ID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnRvS2V5O1xuXG4vLyBgUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgZ2V0T3duTWV0YWRhdGFLZXlzOiBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gICAgdmFyIHRhcmdldEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhZGF0YUtleShhcmd1bWVudHNbMV0pO1xuICAgIHJldHVybiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhhbk9iamVjdCh0YXJnZXQpLCB0YXJnZXRLZXkpO1xuICB9XG59KTtcbiIsInZhciBSZWZsZWN0TWV0YWRhdGFNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVmbGVjdC1tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5oYXM7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IGZhbHNlO1xufTtcblxuLy8gYFJlZmxlY3QuaGFzTWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaGFzTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgb3JkaW5hcnlIYXNPd25NZXRhZGF0YSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS5oYXM7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcblxuLy8gYFJlZmxlY3QuaGFzT3duTWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgICB2YXIgdGFyZ2V0S2V5ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiB0b01ldGFkYXRhS2V5KGFyZ3VtZW50c1syXSk7XG4gICAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSk7XG4gIH1cbn0pO1xuIiwidmFyIFJlZmxlY3RNZXRhZGF0YU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWZsZWN0LW1ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgdG9NZXRhZGF0YUtleSA9IFJlZmxlY3RNZXRhZGF0YU1vZHVsZS50b0tleTtcbnZhciBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhID0gUmVmbGVjdE1ldGFkYXRhTW9kdWxlLnNldDtcblxuLy8gYFJlZmxlY3QubWV0YWRhdGFgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JidWNrdG9uL3JlZmxlY3QtbWV0YWRhdGFcbnJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKSh7IHRhcmdldDogJ1JlZmxlY3QnLCBzdGF0OiB0cnVlIH0sIHtcbiAgbWV0YWRhdGE6IGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIGtleSkge1xuICAgICAgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgYW5PYmplY3QodGFyZ2V0KSwgdG9NZXRhZGF0YUtleShrZXkpKTtcbiAgICB9O1xuICB9XG59KTtcbiIsIi8qKlxuKiBAbGljZW5zZVxuKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbipcbiogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChmYWN0b3J5KCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBab25lJDEgPSAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgIHZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbFsncGVyZm9ybWFuY2UnXTtcbiAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHtcbiAgICAgICAgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2VbJ21hcmsnXSAmJiBwZXJmb3JtYW5jZVsnbWFyayddKG5hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwZXJmb3JtYW5jZU1lYXN1cmUobmFtZSwgbGFiZWwpIHtcbiAgICAgICAgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2VbJ21lYXN1cmUnXSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddKG5hbWUsIGxhYmVsKTtcbiAgICB9XG4gICAgbWFyaygnWm9uZScpO1xuICAgIHZhciBjaGVja0R1cGxpY2F0ZSA9IGdsb2JhbFsoJ19fem9uZV9zeW1ib2xfX2ZvcmNlRHVwbGljYXRlWm9uZUNoZWNrJyldID09PSB0cnVlO1xuICAgIGlmIChnbG9iYWxbJ1pvbmUnXSkge1xuICAgICAgICAvLyBpZiBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cyAobWF5YmUgem9uZS5qcyB3YXMgYWxyZWFkeSBsb2FkZWQgb3JcbiAgICAgICAgLy8gc29tZSBvdGhlciBsaWIgYWxzbyByZWdpc3RlcmVkIGEgZ2xvYmFsIG9iamVjdCBuYW1lZCBab25lKSwgd2UgbWF5IG5lZWRcbiAgICAgICAgLy8gdG8gdGhyb3cgYW4gZXJyb3IsIGJ1dCBzb21ldGltZXMgdXNlciBtYXkgbm90IHdhbnQgdGhpcyBlcnJvci5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsXG4gICAgICAgIC8vIHdlIGhhdmUgdHdvIHdlYiBwYWdlcywgcGFnZTEgaW5jbHVkZXMgem9uZS5qcywgcGFnZTIgZG9lc24ndC5cbiAgICAgICAgLy8gYW5kIHRoZSAxc3QgdGltZSB1c2VyIGxvYWQgcGFnZTEgYW5kIHBhZ2UyLCBldmVyeXRoaW5nIHdvcmsgZmluZSxcbiAgICAgICAgLy8gYnV0IHdoZW4gdXNlciBsb2FkIHBhZ2UyIGFnYWluLCBlcnJvciBvY2N1cnMgYmVjYXVzZSBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgLy8gc28gd2UgYWRkIGEgZmxhZyB0byBsZXQgdXNlciBjaG9vc2Ugd2hldGhlciB0byB0aHJvdyB0aGlzIGVycm9yIG9yIG5vdC5cbiAgICAgICAgLy8gQnkgZGVmYXVsdCwgaWYgZXhpc3RpbmcgWm9uZSBpcyBmcm9tIHpvbmUuanMsIHdlIHdpbGwgbm90IHRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKGNoZWNrRHVwbGljYXRlIHx8IHR5cGVvZiBnbG9iYWxbJ1pvbmUnXS5fX3N5bWJvbF9fICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUgYWxyZWFkeSBsb2FkZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsWydab25lJ107XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIFpvbmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFpvbmUocGFyZW50LCB6b25lU3BlYykge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IHpvbmVTcGVjID8gem9uZVNwZWMubmFtZSB8fCAndW5uYW1lZCcgOiAnPHJvb3Q+JztcbiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlID1cbiAgICAgICAgICAgICAgICBuZXcgWm9uZURlbGVnYXRlKHRoaXMsIHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuX3pvbmVEZWxlZ2F0ZSwgem9uZVNwZWMpO1xuICAgICAgICB9XG4gICAgICAgIFpvbmUuYXNzZXJ0Wm9uZVBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsWydQcm9taXNlJ10gIT09IHBhdGNoZXNbJ1pvbmVBd2FyZVByb21pc2UnXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWm9uZS5qcyBoYXMgZGV0ZWN0ZWQgdGhhdCBab25lQXdhcmVQcm9taXNlIGAod2luZG93fGdsb2JhbCkuUHJvbWlzZWAgJyArXG4gICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcbiAgICAgICAgICAgICAgICAgICAgJ01vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2FmdGVyIFpvbmUuanMgKFBvbHlmaWxsaW5nIFByb21pc2UgYXBpIGlzIG5vdCBuZWNlc3Nhcnkgd2hlbiB6b25lLmpzIGlzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lLCBcInJvb3RcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHpvbmUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHpvbmUgPSB6b25lLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHpvbmU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmUsIFwiY3VycmVudFwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRab25lRnJhbWUuem9uZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgXCJjdXJyZW50VGFza1wiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRUYXNrO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFpvbmUuX19sb2FkX3BhdGNoID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQWxyZWFkeSBsb2FkZWQgcGF0Y2g6ICcgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghZ2xvYmFsWydfX1pvbmVfZGlzYWJsZV8nICsgbmFtZV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgcGVyZk5hbWUgPSAnWm9uZTonICsgbmFtZTtcbiAgICAgICAgICAgICAgICBtYXJrKHBlcmZOYW1lKTtcbiAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lLCBfYXBpKTtcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZU1lYXN1cmUocGVyZk5hbWUsIHBlcmZOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmUucHJvdG90eXBlLCBcInBhcmVudFwiLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lLnByb3RvdHlwZSwgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFpvbmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHZhciB6b25lID0gdGhpcy5nZXRab25lV2l0aChrZXkpO1xuICAgICAgICAgICAgaWYgKHpvbmUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHpvbmUuX3Byb3BlcnRpZXNba2V5XTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZS5wcm90b3R5cGUuZ2V0Wm9uZVdpdGggPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudCA9IHRoaXM7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Ll9wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZS5wcm90b3R5cGUuZm9yayA9IGZ1bmN0aW9uICh6b25lU3BlYykge1xuICAgICAgICAgICAgaWYgKCF6b25lU3BlYylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmVTcGVjIHJlcXVpcmVkIScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgc291cmNlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAnICsgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF9jYWxsYmFjayA9IHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnRlcmNlcHQodGhpcywgY2FsbGJhY2ssIHNvdXJjZSk7XG4gICAgICAgICAgICB2YXIgem9uZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBab25lLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBab25lLnByb3RvdHlwZS5ydW5HdWFyZGVkID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoYXBwbHlUaGlzID09PSB2b2lkIDApIHsgYXBwbHlUaGlzID0gbnVsbDsgfVxuICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFpvbmUucHJvdG90eXBlLnJ1blRhc2sgPSBmdW5jdGlvbiAodGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgIT0gdGhpcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICsgJzsgRXhlY3V0aW9uOiAnICsgdGhpcy5uYW1lICsgJyknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzc3OCwgc29tZXRpbWVzIGV2ZW50VGFza1xuICAgICAgICAgICAgLy8gd2lsbCBydW4gaW4gbm90U2NoZWR1bGVkKGNhbmNlbGVkKSBzdGF0ZSwgd2Ugc2hvdWxkIG5vdCB0cnkgdG9cbiAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cbiAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlID09PSBub3RTY2hlZHVsZWQgJiYgKHRhc2sudHlwZSA9PT0gZXZlbnRUYXNrIHx8IHRhc2sudHlwZSA9PT0gbWFjcm9UYXNrKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZUVudHJ5R3VhcmQgPSB0YXNrLnN0YXRlICE9IHJ1bm5pbmc7XG4gICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgdGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG4gICAgICAgICAgICB0YXNrLnJ1bkNvdW50Kys7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNUYXNrID0gX2N1cnJlbnRUYXNrO1xuICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gdGFzaztcbiAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0YXNrLnR5cGUgPT0gbWFjcm9UYXNrICYmIHRhc2suZGF0YSAmJiAhdGFzay5kYXRhLmlzUGVyaW9kaWMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXNrJ3Mgc3RhdGUgaXMgbm90U2NoZWR1bGVkIG9yIHVua25vd24sIHRoZW4gaXQgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHJlc2V0IHRoZSBzdGF0ZSB0byBzY2hlZHVsZWRcbiAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHRhc2suc3RhdGUgIT09IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2sudHlwZSA9PSBldmVudFRhc2sgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuaXNQZXJpb2RpYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGVkLCBydW5uaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGFza0NvdW50KHRhc2ssIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHJ1bm5pbmcsIG5vdFNjaGVkdWxlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gcHJldmlvdXNUYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBab25lLnByb3RvdHlwZS5zY2hlZHVsZVRhc2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgaWYgKHRhc2suem9uZSAmJiB0YXNrLnpvbmUgIT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFzayB3YXMgcmVzY2hlZHVsZWQsIHRoZSBuZXdab25lXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9yaWdpbmFsIHpvbmVcbiAgICAgICAgICAgICAgICB2YXIgbmV3Wm9uZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld1pvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1pvbmUgPT09IHRhc2suem9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byBcIiArIHRoaXMubmFtZSArIFwiIHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lIFwiICsgdGFzay56b25lLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTtcbiAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gW107XG4gICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlcztcbiAgICAgICAgICAgIHRhc2suX3pvbmUgPSB0aGlzO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZXJyIG1heSBmcm9tIHJlc2NoZWR1bGUsIHNvIHRoZSBmcm9tU3RhdGUgbWF5YmUgbm90U2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHVua25vd24sIHNjaGVkdWxpbmcsIG5vdFNjaGVkdWxlZCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj9cbiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFzay5fem9uZURlbGVnYXRlcyA9PT0gem9uZURlbGVnYXRlcykge1xuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgYmVjYXVzZSBpbnRlcm5hbGx5IHRoZSBkZWxlZ2F0ZSBjYW4gcmVzY2hlZHVsZSB0aGUgdGFzay5cbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PSBzY2hlZHVsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2sgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlTWFjcm9UYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWFjcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlRXZlbnRUYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2soZXZlbnRUYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcbiAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICsgJzsgRXhlY3V0aW9uOiAnICsgdGhpcy5uYW1lICsgJyknKTtcbiAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd25cbiAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgLTEpO1xuICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTtcbiAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQgPSBmdW5jdGlvbiAodGFzaywgY291bnQpIHtcbiAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gdGFzay5fem9uZURlbGVnYXRlcztcbiAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRhc2suX3pvbmVEZWxlZ2F0ZXMgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgem9uZURlbGVnYXRlc1tpXS5fdXBkYXRlVGFza0NvdW50KHRhc2sudHlwZSwgY291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBab25lLl9fc3ltYm9sX18gPSBfX3N5bWJvbF9fO1xuICAgICAgICByZXR1cm4gWm9uZTtcbiAgICB9KCkpO1xuICAgIHZhciBERUxFR0FURV9aUyA9IHtcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIG9uSGFzVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIGhhc1Rhc2tTdGF0ZSkgeyByZXR1cm4gZGVsZWdhdGUuaGFzVGFzayh0YXJnZXQsIGhhc1Rhc2tTdGF0ZSk7IH0sXG4gICAgICAgIG9uU2NoZWR1bGVUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNjaGVkdWxlVGFzayh0YXJnZXQsIHRhc2spO1xuICAgICAgICB9LFxuICAgICAgICBvbkludm9rZVRhc2s6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2FuY2VsVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spIHsgcmV0dXJuIGRlbGVnYXRlLmNhbmNlbFRhc2sodGFyZ2V0LCB0YXNrKTsgfVxuICAgIH07XG4gICAgdmFyIFpvbmVEZWxlZ2F0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gWm9uZURlbGVnYXRlKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykge1xuICAgICAgICAgICAgdGhpcy5fdGFza0NvdW50cyA9IHsgJ21pY3JvVGFzayc6IDAsICdtYWNyb1Rhc2snOiAwLCAnZXZlbnRUYXNrJzogMCB9O1xuICAgICAgICAgICAgdGhpcy56b25lID0gem9uZTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudERlbGVnYXRlID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICB0aGlzLl9mb3JrWlMgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMgJiYgem9uZVNwZWMub25Gb3JrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5fZm9ya1pTKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmtEbGd0ID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uRm9yayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmtDdXJyWm9uZSA9IHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkZvcmsgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS56b25lKTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHRaUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHREbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHREbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdEN1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS56b25lKTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpO1xuICAgICAgICAgICAgdGhpcy5faW52b2tlRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlRGxndCk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9IHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZSA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLnpvbmUpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JaUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvclpTKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckRsZ3QpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS56b25lKTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza1pTID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID0gem9uZVNwZWMgJiZcbiAgICAgICAgICAgICAgICAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS56b25lKTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2taUyk7XG4gICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVRhc2tEbGd0KTtcbiAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9XG4gICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLnpvbmUpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza1pTKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tEbGd0ID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0RsZ3QpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lID1cbiAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuem9uZSk7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3RPd25lciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9oYXNUYXNrQ3VyclpvbmUgPSBudWxsO1xuICAgICAgICAgICAgdmFyIHpvbmVTcGVjSGFzVGFzayA9IHpvbmVTcGVjICYmIHpvbmVTcGVjLm9uSGFzVGFzaztcbiAgICAgICAgICAgIHZhciBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcbiAgICAgICAgICAgIGlmICh6b25lU3BlY0hhc1Rhc2sgfHwgcGFyZW50SGFzVGFzaykge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIG5lZWQgdG8gcmVwb3J0IGhhc1Rhc2ssIHRoYW4gdGhpcyBaUyBuZWVkcyB0byBkbyByZWYgY291bnRpbmcgb24gdGFza3MuIEluIHN1Y2hcbiAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG4gICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gem9uZVNwZWNIYXNUYXNrID8gem9uZVNwZWMgOiBERUxFR0FURV9aUztcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSA9IHpvbmU7XG4gICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vblNjaGVkdWxlVGFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID0gdGhpcy56b25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uSW52b2tlVGFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrWlMgPSBERUxFR0FURV9aUztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0N1cnJab25lID0gdGhpcy56b25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uQ2FuY2VsVGFzaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrWlMgPSBERUxFR0FURV9aUztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lID0gdGhpcy56b25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmZvcmsgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgem9uZVNwZWMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JrWlMgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKSA6XG4gICAgICAgICAgICAgICAgbmV3IFpvbmUodGFyZ2V0Wm9uZSwgem9uZVNwZWMpO1xuICAgICAgICB9O1xuICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlMgP1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTLm9uSW50ZXJjZXB0KHRoaXMuX2ludGVyY2VwdERsZ3QsIHRoaXMuX2ludGVyY2VwdEN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSA6XG4gICAgICAgICAgICAgICAgY2FsbGJhY2s7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlWlMgPyB0aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LCB0aGlzLl9pbnZva2VDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIDpcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShhcHBseVRoaXMsIGFwcGx5QXJncyk7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFcnJvclpTID9cbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcikgOlxuICAgICAgICAgICAgICAgIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuc2NoZWR1bGVUYXNrID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIHRhc2spIHtcbiAgICAgICAgICAgIHZhciByZXR1cm5UYXNrID0gdGFzaztcbiAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZVRhc2taUykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzay5fem9uZURlbGVnYXRlcy5wdXNoKHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuICAgICAgICAgICAgICAgIGlmICghcmV0dXJuVGFzaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taUyA/IHRoaXMuX2ludm9rZVRhc2taUy5vbkludm9rZVRhc2sodGhpcy5faW52b2tlVGFza0RsZ3QsIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIDpcbiAgICAgICAgICAgICAgICB0YXNrLmNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5jYW5jZWxUYXNrID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIHRhc2spIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYW5jZWxUYXNrWlMpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2NhbmNlbFRhc2taUy5vbkNhbmNlbFRhc2sodGhpcy5fY2FuY2VsVGFza0RsZ3QsIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgdGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRhc2suY2FuY2VsRm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Rhc2sgaXMgbm90IGNhbmNlbGFibGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0YXNrLmNhbmNlbEZuKHRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmhhc1Rhc2sgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgaXNFbXB0eSkge1xuICAgICAgICAgICAgLy8gaGFzVGFzayBzaG91bGQgbm90IHRocm93IGVycm9yIHNvIG90aGVyIFpvbmVEZWxlZ2F0ZVxuICAgICAgICAgICAgLy8gY2FuIHN0aWxsIHRyaWdnZXIgaGFzVGFzayBjYWxsYmFja1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTLm9uSGFzVGFzayh0aGlzLl9oYXNUYXNrRGxndCwgdGhpcy5faGFzVGFza0N1cnJab25lLCB0YXJnZXRab25lLCBpc0VtcHR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKHRhcmdldFpvbmUsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuX3VwZGF0ZVRhc2tDb3VudCA9IGZ1bmN0aW9uICh0eXBlLCBjb3VudCkge1xuICAgICAgICAgICAgdmFyIGNvdW50cyA9IHRoaXMuX3Rhc2tDb3VudHM7XG4gICAgICAgICAgICB2YXIgcHJldiA9IGNvdW50c1t0eXBlXTtcbiAgICAgICAgICAgIHZhciBuZXh0ID0gY291bnRzW3R5cGVdID0gcHJldiArIGNvdW50O1xuICAgICAgICAgICAgaWYgKG5leHQgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb3JlIHRhc2tzIGV4ZWN1dGVkIHRoZW4gd2VyZSBzY2hlZHVsZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IG5leHQgPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBpc0VtcHR5ID0ge1xuICAgICAgICAgICAgICAgICAgICBtaWNyb1Rhc2s6IGNvdW50c1snbWljcm9UYXNrJ10gPiAwLFxuICAgICAgICAgICAgICAgICAgICBtYWNyb1Rhc2s6IGNvdW50c1snbWFjcm9UYXNrJ10gPiAwLFxuICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHR5cGVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzVGFzayh0aGlzLnpvbmUsIGlzRW1wdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gWm9uZURlbGVnYXRlO1xuICAgIH0oKSk7XG4gICAgdmFyIFpvbmVUYXNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBab25lVGFzayh0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikge1xuICAgICAgICAgICAgdGhpcy5fem9uZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJ1bkNvdW50ID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZXMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnbm90U2NoZWR1bGVkJztcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm4gPSBzY2hlZHVsZUZuO1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiBvcHRpb25zIHNob3VsZCBoYXZlIGludGVyZmFjZVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09IGV2ZW50VGFzayAmJiBvcHRpb25zICYmIG9wdGlvbnMudXNlRykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlID0gWm9uZVRhc2suaW52b2tlVGFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWm9uZVRhc2suaW52b2tlVGFzay5jYWxsKGdsb2JhbCwgc2VsZiwgdGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFpvbmVUYXNrLmludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBhcmdzKSB7XG4gICAgICAgICAgICBpZiAoIXRhc2spIHtcbiAgICAgICAgICAgICAgICB0YXNrID0gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMrKztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCB0YXJnZXQsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkcmFpbk1pY3JvVGFza1F1ZXVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVUYXNrLnByb3RvdHlwZSwgXCJ6b25lXCIsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lVGFzay5wcm90b3R5cGUsIFwic3RhdGVcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS5jYW5jZWxTY2hlZHVsZVJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uVG8obm90U2NoZWR1bGVkLCBzY2hlZHVsaW5nKTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLl90cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiAodG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUxIHx8IHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB0b1N0YXRlO1xuICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGVzID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlICsgXCIgJ1wiICsgdGhpcy5zb3VyY2UgKyBcIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnXCIgKyB0b1N0YXRlICsgXCInLCBleHBlY3Rpbmcgc3RhdGUgJ1wiICsgZnJvbVN0YXRlMSArIFwiJ1wiICsgKGZyb21TdGF0ZTIgPyAnIG9yIFxcJycgKyBmcm9tU3RhdGUyICsgJ1xcJycgOiAnJykgKyBcIiwgd2FzICdcIiArIHRoaXMuX3N0YXRlICsgXCInLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0eXBlb2YgdGhpcy5kYXRhLmhhbmRsZUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuaGFuZGxlSWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGFkZCB0b0pTT04gbWV0aG9kIHRvIHByZXZlbnQgY3ljbGljIGVycm9yIHdoZW5cbiAgICAgICAgLy8gY2FsbCBKU09OLnN0cmluZ2lmeSh6b25lVGFzaylcbiAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG4gICAgICAgICAgICAgICAgcnVuQ291bnQ6IHRoaXMucnVuQ291bnRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBab25lVGFzaztcbiAgICB9KCkpO1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vLyAgTUlDUk9UQVNLIFFVRVVFXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgdmFyIHN5bWJvbFNldFRpbWVvdXQgPSBfX3N5bWJvbF9fKCdzZXRUaW1lb3V0Jyk7XG4gICAgdmFyIHN5bWJvbFByb21pc2UgPSBfX3N5bWJvbF9fKCdQcm9taXNlJyk7XG4gICAgdmFyIHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG4gICAgdmFyIF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuICAgIHZhciBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgdmFyIG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcbiAgICBmdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKSB7XG4gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgcnVubmluZyBpbiBhbnkgdGFzaywgYW5kIHRoZXJlIGhhcyBub3QgYmVlbiBhbnl0aGluZyBzY2hlZHVsZWRcbiAgICAgICAgLy8gd2UgbXVzdCBib290c3RyYXAgdGhlIGluaXRpYWwgdGFzayBjcmVhdGlvbiBieSBtYW51YWxseSBzY2hlZHVsaW5nIHRoZSBkcmFpblxuICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PT0gMCAmJiBfbWljcm9UYXNrUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBXZSBhcmUgbm90IHJ1bm5pbmcgaW4gVGFzaywgc28gd2UgbmVlZCB0byBraWNrc3RhcnQgdGhlIG1pY3JvdGFzayBxdWV1ZS5cbiAgICAgICAgICAgIGlmICghbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdsb2JhbFtzeW1ib2xQcm9taXNlXSkge1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBnbG9iYWxbc3ltYm9sUHJvbWlzZV0ucmVzb2x2ZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hdGl2ZVRoZW4gPSBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2Vbc3ltYm9sVGhlbl07XG4gICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVUaGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBwYXRjaGFibGUsIHdlIG5lZWQgdG8gdXNlIGB0aGVuYCBkaXJlY3RseVxuICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSAxMDc4XG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRoZW4gPSBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2VbJ3RoZW4nXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmF0aXZlVGhlbi5jYWxsKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSwgZHJhaW5NaWNyb1Rhc2tRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbG9iYWxbc3ltYm9sU2V0VGltZW91dF0oZHJhaW5NaWNyb1Rhc2tRdWV1ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGFzayAmJiBfbWljcm9UYXNrUXVldWUucHVzaCh0YXNrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpIHtcbiAgICAgICAgaWYgKCFfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlKSB7XG4gICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlIChfbWljcm9UYXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gX21pY3JvVGFza1F1ZXVlO1xuICAgICAgICAgICAgICAgIF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBxdWV1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIG51bGwsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FwaS5vblVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG4gICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8vICBCT09UU1RSQVBcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICB2YXIgTk9fWk9ORSA9IHsgbmFtZTogJ05PIFpPTkUnIH07XG4gICAgdmFyIG5vdFNjaGVkdWxlZCA9ICdub3RTY2hlZHVsZWQnLCBzY2hlZHVsaW5nID0gJ3NjaGVkdWxpbmcnLCBzY2hlZHVsZWQgPSAnc2NoZWR1bGVkJywgcnVubmluZyA9ICdydW5uaW5nJywgY2FuY2VsaW5nID0gJ2NhbmNlbGluZycsIHVua25vd24gPSAndW5rbm93bic7XG4gICAgdmFyIG1pY3JvVGFzayA9ICdtaWNyb1Rhc2snLCBtYWNyb1Rhc2sgPSAnbWFjcm9UYXNrJywgZXZlbnRUYXNrID0gJ2V2ZW50VGFzayc7XG4gICAgdmFyIHBhdGNoZXMgPSB7fTtcbiAgICB2YXIgX2FwaSA9IHtcbiAgICAgICAgc3ltYm9sOiBfX3N5bWJvbF9fLFxuICAgICAgICBjdXJyZW50Wm9uZUZyYW1lOiBmdW5jdGlvbiAoKSB7IHJldHVybiBfY3VycmVudFpvbmVGcmFtZTsgfSxcbiAgICAgICAgb25VbmhhbmRsZWRFcnJvcjogbm9vcCxcbiAgICAgICAgbWljcm90YXNrRHJhaW5Eb25lOiBub29wLFxuICAgICAgICBzY2hlZHVsZU1pY3JvVGFzazogc2NoZWR1bGVNaWNyb1Rhc2ssXG4gICAgICAgIHNob3dVbmNhdWdodEVycm9yOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhWm9uZVtfX3N5bWJvbF9fKCdpZ25vcmVDb25zb2xlRXJyb3JVbmNhdWdodEVycm9yJyldOyB9LFxuICAgICAgICBwYXRjaEV2ZW50VGFyZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSxcbiAgICAgICAgcGF0Y2hPblByb3BlcnRpZXM6IG5vb3AsXG4gICAgICAgIHBhdGNoTWV0aG9kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LFxuICAgICAgICBiaW5kQXJndW1lbnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSxcbiAgICAgICAgcGF0Y2hUaGVuOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LFxuICAgICAgICBwYXRjaE1hY3JvVGFzazogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSxcbiAgICAgICAgc2V0TmF0aXZlUHJvbWlzZTogZnVuY3Rpb24gKE5hdGl2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBOYXRpdmVQcm9taXNlLnJlc29sdmUgc3RhdGljIGZ1bmN0aW9uXG4gICAgICAgICAgICAvLyBpcyBub3QgcmVhZHkgeWV0LCAoc3VjaCBhcyBjb3JlLWpzL2VzNi5wcm9taXNlKVxuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBoZXJlLlxuICAgICAgICAgICAgaWYgKE5hdGl2ZVByb21pc2UgJiYgdHlwZW9mIE5hdGl2ZVByb21pc2UucmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSA9IE5hdGl2ZVByb21pc2UucmVzb2x2ZSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGF0Y2hFdmVudFByb3RvdHlwZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSxcbiAgICAgICAgaXNJRU9yRWRnZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgIGdldEdsb2JhbE9iamVjdHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSxcbiAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sXG4gICAgICAgIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9LFxuICAgICAgICBPYmplY3RDcmVhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSxcbiAgICAgICAgQXJyYXlTbGljZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIHBhdGNoQ2xhc3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sXG4gICAgICAgIHdyYXBXaXRoQ3VycmVudFpvbmU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LFxuICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sXG4gICAgICAgIF9yZWRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LFxuICAgICAgICBwYXRjaENhbGxiYWNrczogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfVxuICAgIH07XG4gICAgdmFyIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IG51bGwsIHpvbmU6IG5ldyBab25lKG51bGwsIG51bGwpIH07XG4gICAgdmFyIF9jdXJyZW50VGFzayA9IG51bGw7XG4gICAgdmFyIF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPSAwO1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH1cbiAgICBmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdfX3pvbmVfc3ltYm9sX18nICsgbmFtZTtcbiAgICB9XG4gICAgcGVyZm9ybWFuY2VNZWFzdXJlKCdab25lJywgJ1pvbmUnKTtcbiAgICByZXR1cm4gZ2xvYmFsWydab25lJ10gPSBab25lO1xufSkodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIHx8IGdsb2JhbCk7XG5cbnZhciBfX3ZhbHVlcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuWm9uZS5fX2xvYWRfcGF0Y2goJ1pvbmVBd2FyZVByb21pc2UnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHtcbiAgICB2YXIgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICB2YXIgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcbiAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gKGNsYXNzTmFtZSA/IGNsYXNzTmFtZSA6ICcnKSArICc6ICcgKyBKU09OLnN0cmluZ2lmeShvYmopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmogPyBvYmoudG9TdHJpbmcoKSA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICAgIH1cbiAgICB2YXIgX19zeW1ib2xfXyA9IGFwaS5zeW1ib2w7XG4gICAgdmFyIF91bmNhdWdodFByb21pc2VFcnJvcnMgPSBbXTtcbiAgICB2YXIgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcbiAgICB2YXIgc3ltYm9sVGhlbiA9IF9fc3ltYm9sX18oJ3RoZW4nKTtcbiAgICB2YXIgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG4gICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoYXBpLnNob3dVbmNhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICAgIHZhciByZWplY3Rpb24gPSBlICYmIGUucmVqZWN0aW9uO1xuICAgICAgICAgICAgaWYgKHJlamVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvbjonLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5tZXNzYWdlIDogcmVqZWN0aW9uLCAnOyBab25lOicsIGUuem9uZS5uYW1lLCAnOyBUYXNrOicsIGUudGFzayAmJiBlLnRhc2suc291cmNlLCAnOyBWYWx1ZTonLCByZWplY3Rpb24sIHJlamVjdGlvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0aW9uLnN0YWNrIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFwaS5taWNyb3Rhc2tEcmFpbkRvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlIChfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnpvbmUucnVuR3VhcmRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodFByb21pc2VFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24oZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3aGlsZSAoX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHZhciBVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0wgPSBfX3N5bWJvbF9fKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpO1xuICAgIGZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlKSB7XG4gICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yKGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07XG4gICAgICAgICAgICBpZiAoaGFuZGxlciAmJiB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9yd2FyZFJlc29sdXRpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcbiAgICB9XG4gICAgdmFyIHN5bWJvbFN0YXRlID0gX19zeW1ib2xfXygnc3RhdGUnKTtcbiAgICB2YXIgc3ltYm9sVmFsdWUgPSBfX3N5bWJvbF9fKCd2YWx1ZScpO1xuICAgIHZhciBzeW1ib2xGaW5hbGx5ID0gX19zeW1ib2xfXygnZmluYWxseScpO1xuICAgIHZhciBzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUgPSBfX3N5bWJvbF9fKCdwYXJlbnRQcm9taXNlVmFsdWUnKTtcbiAgICB2YXIgc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlID0gX19zeW1ib2xfXygncGFyZW50UHJvbWlzZVN0YXRlJyk7XG4gICAgdmFyIHNvdXJjZSA9ICdQcm9taXNlLnRoZW4nO1xuICAgIHZhciBVTlJFU09MVkVEID0gbnVsbDtcbiAgICB2YXIgUkVTT0xWRUQgPSB0cnVlO1xuICAgIHZhciBSRUpFQ1RFRCA9IGZhbHNlO1xuICAgIHZhciBSRUpFQ1RFRF9OT19DQVRDSCA9IDA7XG4gICAgZnVuY3Rpb24gbWFrZVJlc29sdmVyKHByb21pc2UsIHN0YXRlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBzdGF0ZSwgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBEbyBub3QgcmV0dXJuIHZhbHVlIG9yIHlvdSB3aWxsIGJyZWFrIHRoZSBQcm9taXNlIHNwZWMuXG4gICAgICAgIH07XG4gICAgfVxuICAgIHZhciBvbmNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2FzQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiB3cmFwcGVyKHdyYXBwZWRGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAod2FzQ2FsbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FzQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkRnVuY3Rpb24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgVFlQRV9FUlJPUiA9ICdQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmJztcbiAgICB2YXIgQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCA9IF9fc3ltYm9sX18oJ2N1cnJlbnRUYXNrVHJhY2UnKTtcbiAgICAvLyBQcm9taXNlIFJlc29sdXRpb25cbiAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBzdGF0ZSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIG9uY2VXcmFwcGVyID0gb25jZSgpO1xuICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoVFlQRV9FUlJPUik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sU3RhdGVdID09PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgb25seSBnZXQgdmFsdWUudGhlbiBvbmNlIGJhc2VkIG9uIHByb21pc2Ugc3BlYy5cbiAgICAgICAgICAgIHZhciB0aGVuID0gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoZW4gPSB2YWx1ZSAmJiB2YWx1ZS50aGVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBvbmNlV3JhcHBlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgIT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShzeW1ib2xWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZVtzeW1ib2xTdGF0ZV0gIT09IFVOUkVTT0xWRUQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclJlamVjdGVkTm9DYXRjaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdmFsdWVbc3ltYm9sU3RhdGVdLCB2YWx1ZVtzeW1ib2xWYWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgIT09IFJFSkVDVEVEICYmIHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpKSwgb25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIGZhbHNlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uY2VXcmFwcGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gcHJvbWlzZVtzeW1ib2xWYWx1ZV07XG4gICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xWYWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9PT0gc3ltYm9sRmluYWxseSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvbWlzZSBpcyBnZW5lcmF0ZWQgYnkgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgaXMgcmVzb2x2ZWQsIHNob3VsZCBpZ25vcmUgdGhlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdXNlIHBhcmVudCBwcm9taXNlIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0YXNrIGluZm9ybWF0aW9uIGluIHZhbHVlIHdoZW4gZXJyb3Igb2NjdXJzLCBzbyB3ZSBjYW5cbiAgICAgICAgICAgICAgICAvLyBkbyBzb21lIGFkZGl0aW9uYWwgd29yayBzdWNoIGFzIHJlbmRlciBsb25nU3RhY2tUcmFjZVxuICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkVKRUNURUQgJiYgdmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsb25nU3RhY2tUcmFjZVpvbmUgaXMgaGVyZVxuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmIFpvbmUuY3VycmVudFRhc2suZGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgWm9uZS5jdXJyZW50VGFzay5kYXRhW2NyZWF0aW9uVHJhY2VdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkga2VlcCB0aGUgbG9uZyBzdGFjayB0cmFjZSBpbnRvIGVycm9yIHdoZW4gaW4gbG9uZ1N0YWNrVHJhY2Vab25lXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eSh2YWx1ZSwgQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCwgeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHRyYWNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdChwcm9taXNlLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PSAwICYmIHN0YXRlID09IFJFSkVDVEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURURfTk9fQ0FUQ0g7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcHJpbnQgbW9yZSByZWFkYWJsZSBlcnJvciBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICsgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAmJiB2YWx1ZS5zdGFjayA/ICdcXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvcl8xID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfMS5yZWplY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXzEucHJvbWlzZSA9IHByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xLnpvbmUgPSBab25lLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xLnRhc2sgPSBab25lLmN1cnJlbnRUYXNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKGVycm9yXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnNjaGVkdWxlTWljcm9UYXNrKCk7IC8vIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJ1bm5pbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZpbmcgYW4gYWxyZWFkeSByZXNvbHZlZCBwcm9taXNlIGlzIGEgbm9vcC5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHZhciBSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSID0gX19zeW1ib2xfXygncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKTtcbiAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG4gICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gUkVKRUNURURfTk9fQ0FUQ0gpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIG5vIGNhdGNoIHN0YXR1c1xuICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgLy8gaGVyZSB0byBoYW5kbGUgdGhlIHJlamVjdGVkIHByb21pc2UsIHdlIHNob3VsZCB0cmlnZ2VyXG4gICAgICAgICAgICAvLyB3aW5kb3dzLnJlamVjdGlvbmhhbmRsZWQgZXZlbnRIYW5kbGVyIG9yIG5vZGVqcyByZWplY3Rpb25IYW5kbGVkXG4gICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1JFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVJdO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCB7IHJlamVjdGlvbjogcHJvbWlzZVtzeW1ib2xWYWx1ZV0sIHByb21pc2U6IHByb21pc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9taXNlID09PSBfdW5jYXVnaHRQcm9taXNlRXJyb3JzW2ldLnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHByb21pc2UsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgY2xlYXJSZWplY3RlZE5vQ2F0Y2gocHJvbWlzZSk7XG4gICAgICAgIHZhciBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gcHJvbWlzZVN0YXRlID9cbiAgICAgICAgICAgICh0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicpID8gb25GdWxmaWxsZWQgOiBmb3J3YXJkUmVzb2x1dGlvbiA6XG4gICAgICAgICAgICAodHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicpID8gb25SZWplY3RlZCA6IGZvcndhcmRSZWplY3Rpb247XG4gICAgICAgIHpvbmUuc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9taXNlVmFsdWUgPSBwcm9taXNlW3N5bWJvbFZhbHVlXTtcbiAgICAgICAgICAgICAgICB2YXIgaXNGaW5hbGx5UHJvbWlzZSA9IGNoYWluUHJvbWlzZSAmJiBzeW1ib2xGaW5hbGx5ID09PSBjaGFpblByb21pc2Vbc3ltYm9sRmluYWxseV07XG4gICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGZyb20gZmluYWxseSBjYWxsLCBrZWVwIHBhcmVudCBwcm9taXNlJ3Mgc3RhdGUgYW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdID0gcGFyZW50UHJvbWlzZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBwYXNzIHZhbHVlIHRvIGZpbmFsbHkgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB6b25lLnJ1bihkZWxlZ2F0ZSwgdW5kZWZpbmVkLCBpc0ZpbmFsbHlQcm9taXNlICYmIGRlbGVnYXRlICE9PSBmb3J3YXJkUmVqZWN0aW9uICYmIGRlbGVnYXRlICE9PSBmb3J3YXJkUmVzb2x1dGlvbiA/XG4gICAgICAgICAgICAgICAgICAgIFtdIDpcbiAgICAgICAgICAgICAgICAgICAgW3BhcmVudFByb21pc2VWYWx1ZV0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNoYWluUHJvbWlzZSwgdHJ1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgZXJyb3Igb2NjdXJzLCBzaG91bGQgYWx3YXlzIHJldHVybiB0aGlzIGVycm9yXG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjaGFpblByb21pc2UpO1xuICAgIH1cbiAgICB2YXIgWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORyA9ICdmdW5jdGlvbiBab25lQXdhcmVQcm9taXNlKCkgeyBbbmF0aXZlIGNvZGVdIH0nO1xuICAgIHZhciBab25lQXdhcmVQcm9taXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICBmdW5jdGlvbiBab25lQXdhcmVQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xWYWx1ZV0gPSBbXTsgLy8gcXVldWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGV4ZWN1dG9yICYmIGV4ZWN1dG9yKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRVNPTFZFRCksIG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRUpFQ1RFRCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBab25lQXdhcmVQcm9taXNlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkc7XG4gICAgICAgIH07XG4gICAgICAgIFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRVNPTFZFRCwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgICAgICBab25lQXdhcmVQcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9taXNlKG5ldyB0aGlzKG51bGwpLCBSRUpFQ1RFRCwgZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBab25lQXdhcmVQcm9taXNlLnJhY2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIHZhciByZXNvbHZlO1xuICAgICAgICAgICAgdmFyIHJlamVjdDtcbiAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IHRoaXMoZnVuY3Rpb24gKHJlcywgcmVqKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2YWx1ZXNfMSA9IF9fdmFsdWVzKHZhbHVlcyksIHZhbHVlc18xXzEgPSB2YWx1ZXNfMS5uZXh0KCk7ICF2YWx1ZXNfMV8xLmRvbmU7IHZhbHVlc18xXzEgPSB2YWx1ZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNfMV8xICYmICF2YWx1ZXNfMV8xLmRvbmUgJiYgKF9hID0gdmFsdWVzXzEucmV0dXJuKSkgX2EuY2FsbCh2YWx1ZXNfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICBab25lQXdhcmVQcm9taXNlLmFsbCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICAgICAgdmFyIHJlc29sdmU7XG4gICAgICAgICAgICB2YXIgcmVqZWN0O1xuICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgdGhpcyhmdW5jdGlvbiAocmVzLCByZWopIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gU3RhcnQgYXQgMiB0byBwcmV2ZW50IHByZW1hdHVyZWx5IHJlc29sdmluZyBpZiAudGhlbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgICB2YXIgdW5yZXNvbHZlZENvdW50ID0gMjtcbiAgICAgICAgICAgIHZhciB2YWx1ZUluZGV4ID0gMDtcbiAgICAgICAgICAgIHZhciByZXNvbHZlZFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpc18xLnJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG4gICAgICAgICAgICAgICAgdmFsdWUudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZXNbY3VyVmFsdWVJbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQrKztcbiAgICAgICAgICAgICAgICB2YWx1ZUluZGV4Kys7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHZhbHVlc18yID0gX192YWx1ZXModmFsdWVzKSwgdmFsdWVzXzJfMSA9IHZhbHVlc18yLm5leHQoKTsgIXZhbHVlc18yXzEuZG9uZTsgdmFsdWVzXzJfMSA9IHZhbHVlc18yLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNfMl8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc18yXzEgJiYgIXZhbHVlc18yXzEuZG9uZSAmJiAoX2EgPSB2YWx1ZXNfMi5yZXR1cm4pKSBfYS5jYWxsKHZhbHVlc18yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTWFrZSB0aGUgdW5yZXNvbHZlZENvdW50IHplcm8tYmFzZWQgYWdhaW4uXG4gICAgICAgICAgICB1bnJlc29sdmVkQ291bnQgLT0gMjtcbiAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdQcm9taXNlJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBab25lQXdhcmVQcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5Qcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3IobnVsbCk7XG4gICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xWYWx1ZV0ucHVzaCh6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHRoaXMsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2ggPSBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcbiAgICAgICAgfTtcbiAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgICAgICAgICAgIHZhciBjaGFpblByb21pc2UgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcbiAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9IHN5bWJvbEZpbmFsbHk7XG4gICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xWYWx1ZV0ucHVzaCh6b25lLCBjaGFpblByb21pc2UsIG9uRmluYWxseSwgb25GaW5hbGx5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHRoaXMsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GaW5hbGx5LCBvbkZpbmFsbHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7XG4gICAgfSgpKTtcbiAgICAvLyBQcm90ZWN0IGFnYWluc3QgYWdncmVzc2l2ZSBvcHRpbWl6ZXJzIGRyb3BwaW5nIHNlZW1pbmdseSB1bnVzZWQgcHJvcGVydGllcy5cbiAgICAvLyBFLmcuIENsb3N1cmUgQ29tcGlsZXIgaW4gYWR2YW5jZWQgbW9kZS5cbiAgICBab25lQXdhcmVQcm9taXNlWydyZXNvbHZlJ10gPSBab25lQXdhcmVQcm9taXNlLnJlc29sdmU7XG4gICAgWm9uZUF3YXJlUHJvbWlzZVsncmVqZWN0J10gPSBab25lQXdhcmVQcm9taXNlLnJlamVjdDtcbiAgICBab25lQXdhcmVQcm9taXNlWydyYWNlJ10gPSBab25lQXdhcmVQcm9taXNlLnJhY2U7XG4gICAgWm9uZUF3YXJlUHJvbWlzZVsnYWxsJ10gPSBab25lQXdhcmVQcm9taXNlLmFsbDtcbiAgICB2YXIgTmF0aXZlUHJvbWlzZSA9IGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IGdsb2JhbFsnUHJvbWlzZSddO1xuICAgIHZhciBaT05FX0FXQVJFX1BST01JU0UgPSBab25lLl9fc3ltYm9sX18oJ1pvbmVBd2FyZVByb21pc2UnKTtcbiAgICB2YXIgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdQcm9taXNlJyk7XG4gICAgaWYgKCFkZXNjIHx8IGRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgIGRlc2MgJiYgZGVsZXRlIGRlc2Mud3JpdGFibGU7XG4gICAgICAgIGRlc2MgJiYgZGVsZXRlIGRlc2MudmFsdWU7XG4gICAgICAgIGlmICghZGVzYykge1xuICAgICAgICAgICAgZGVzYyA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IHNldCBab25lQXdhcmVQcm9taXNlLCB1c2UgcGF0Y2hlZCBvbmVcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gbmF0aXZlIG9uZS5cbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxbWk9ORV9BV0FSRV9QUk9NSVNFXSA/IGdsb2JhbFtaT05FX0FXQVJFX1BST01JU0VdIDogZ2xvYmFsW3N5bWJvbFByb21pc2VdO1xuICAgICAgICB9O1xuICAgICAgICBkZXNjLnNldCA9IGZ1bmN0aW9uIChOZXdOYXRpdmVQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoTmV3TmF0aXZlUHJvbWlzZSA9PT0gWm9uZUF3YXJlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBOZXdOYXRpdmVQcm9taXNlIGlzIFpvbmVBd2FyZVByb21pc2VcbiAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIGdsb2JhbFxuICAgICAgICAgICAgICAgIGdsb2JhbFtaT05FX0FXQVJFX1BST01JU0VdID0gTmV3TmF0aXZlUHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBOZXdOYXRpdmVQcm9taXNlIGlzIG5vdCBab25lQXdhcmVQcm9taXNlXG4gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGU6IGFmdGVyIGxvYWQgem9uZS5qcywgc29tZSBsaWJyYXJ5IGp1c3RcbiAgICAgICAgICAgICAgICAvLyBzZXQgZXM2LXByb21pc2UgdG8gZ2xvYmFsLCBpZiB3ZSBzZXQgaXQgdG8gZ2xvYmFsXG4gICAgICAgICAgICAgICAgLy8gZGlyZWN0bHksIGFzc2VydFpvbmVQYXRjaGVkIHdpbGwgZmFpbCBhbmQgYW5ndWxhclxuICAgICAgICAgICAgICAgIC8vIHdpbGwgbm90IGxvYWRlZCwgc28gd2UganVzdCBzZXQgdGhlIE5ld05hdGl2ZVByb21pc2VcbiAgICAgICAgICAgICAgICAvLyB0byBnbG9iYWxbc3ltYm9sUHJvbWlzZV0sIHNvIHRoZSByZXN1bHQgaXMganVzdCBsaWtlXG4gICAgICAgICAgICAgICAgLy8gd2UgbG9hZCBFUzYgUHJvbWlzZSBiZWZvcmUgem9uZS5qc1xuICAgICAgICAgICAgICAgIGdsb2JhbFtzeW1ib2xQcm9taXNlXSA9IE5ld05hdGl2ZVByb21pc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFOZXdOYXRpdmVQcm9taXNlLnByb3RvdHlwZVtzeW1ib2xUaGVuXSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRjaFRoZW4oTmV3TmF0aXZlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFwaS5zZXROYXRpdmVQcm9taXNlKE5ld05hdGl2ZVByb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShnbG9iYWwsICdQcm9taXNlJywgZGVzYyk7XG4gICAgfVxuICAgIGdsb2JhbFsnUHJvbWlzZSddID0gWm9uZUF3YXJlUHJvbWlzZTtcbiAgICB2YXIgc3ltYm9sVGhlblBhdGNoZWQgPSBfX3N5bWJvbF9fKCd0aGVuUGF0Y2hlZCcpO1xuICAgIGZ1bmN0aW9uIHBhdGNoVGhlbihDdG9yKSB7XG4gICAgICAgIHZhciBwcm90byA9IEN0b3IucHJvdG90eXBlO1xuICAgICAgICB2YXIgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcbiAgICAgICAgaWYgKHByb3AgJiYgKHByb3Aud3JpdGFibGUgPT09IGZhbHNlIHx8ICFwcm9wLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIEN0b3IucHJvdG90eXBlLnRoZW4gcHJvcGVydHlEZXNjcmlwdG9yIGlzIHdyaXRhYmxlIG9yIG5vdFxuICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsVGhlbiA9IHByb3RvLnRoZW47XG4gICAgICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAgICAgICAgcHJvdG9bc3ltYm9sVGhlbl0gPSBvcmlnaW5hbFRoZW47XG4gICAgICAgIEN0b3IucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25SZXNvbHZlLCBvblJlamVjdCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciB3cmFwcGVkID0gbmV3IFpvbmVBd2FyZVByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsVGhlbi5jYWxsKF90aGlzLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpO1xuICAgICAgICB9O1xuICAgICAgICBDdG9yW3N5bWJvbFRoZW5QYXRjaGVkXSA9IHRydWU7XG4gICAgfVxuICAgIGFwaS5wYXRjaFRoZW4gPSBwYXRjaFRoZW47XG4gICAgZnVuY3Rpb24gem9uZWlmeShmbikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJlc3VsdFByb21pc2UgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdFByb21pc2UgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY3RvciA9IHJlc3VsdFByb21pc2UuY29uc3RydWN0b3I7XG4gICAgICAgICAgICBpZiAoIWN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hUaGVuKGN0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChOYXRpdmVQcm9taXNlKSB7XG4gICAgICAgIHBhdGNoVGhlbihOYXRpdmVQcm9taXNlKTtcbiAgICAgICAgdmFyIGZldGNoXzEgPSBnbG9iYWxbJ2ZldGNoJ107XG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2hfMSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBnbG9iYWxbYXBpLnN5bWJvbCgnZmV0Y2gnKV0gPSBmZXRjaF8xO1xuICAgICAgICAgICAgZ2xvYmFsWydmZXRjaCddID0gem9uZWlmeShmZXRjaF8xKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGlzIGlzIG5vdCBwYXJ0IG9mIHB1YmxpYyBBUEksIGJ1dCBpdCBpcyB1c2VmdWwgZm9yIHRlc3RzLCBzbyB3ZSBleHBvc2UgaXQuXG4gICAgUHJvbWlzZVtab25lLl9fc3ltYm9sX18oJ3VuY2F1Z2h0UHJvbWlzZUVycm9ycycpXSA9IF91bmNhdWdodFByb21pc2VFcnJvcnM7XG4gICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2U7XG59KTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBTdXBwcmVzcyBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBhYm91dCB1bmtub3duICdab25lJyB2YXJpYWJsZVxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHt1bmRlZmluZWRWYXJzLGdsb2JhbFRoaXMsbWlzc2luZ1JlcXVpcmV9XG4gKi9cbi8vIGlzc3VlICM5ODksIHRvIHJlZHVjZSBidW5kbGUgc2l6ZSwgdXNlIHNob3J0IG5hbWVcbi8qKiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICovXG52YXIgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbi8qKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgKi9cbnZhciBPYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbi8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cbnZhciBPYmplY3RHZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbi8qKiBPYmplY3QuY3JlYXRlICovXG52YXIgT2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZTtcbi8qKiBBcnJheS5wcm90b3R5cGUuc2xpY2UgKi9cbnZhciBBcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuLyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG52YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NUUiA9ICdhZGRFdmVudExpc3RlbmVyJztcbi8qKiByZW1vdmVFdmVudExpc3RlbmVyIHN0cmluZyBjb25zdCAqL1xudmFyIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIgPSAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG4vKiogem9uZVN5bWJvbCBhZGRFdmVudExpc3RlbmVyICovXG52YXIgWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSID0gWm9uZS5fX3N5bWJvbF9fKEFERF9FVkVOVF9MSVNURU5FUl9TVFIpO1xuLyoqIHpvbmVTeW1ib2wgcmVtb3ZlRXZlbnRMaXN0ZW5lciAqL1xudmFyIFpPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUiA9IFpvbmUuX19zeW1ib2xfXyhSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSKTtcbi8qKiB0cnVlIHN0cmluZyBjb25zdCAqL1xudmFyIFRSVUVfU1RSID0gJ3RydWUnO1xuLyoqIGZhbHNlIHN0cmluZyBjb25zdCAqL1xudmFyIEZBTFNFX1NUUiA9ICdmYWxzZSc7XG4vKiogX196b25lX3N5bWJvbF9fIHN0cmluZyBjb25zdCAqL1xudmFyIFpPTkVfU1lNQk9MX1BSRUZJWCA9ICdfX3pvbmVfc3ltYm9sX18nO1xuZnVuY3Rpb24gd3JhcFdpdGhDdXJyZW50Wm9uZShjYWxsYmFjaywgc291cmNlKSB7XG4gICAgcmV0dXJuIFpvbmUuY3VycmVudC53cmFwKGNhbGxiYWNrLCBzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuICAgIHJldHVybiBab25lLmN1cnJlbnQuc2NoZWR1bGVNYWNyb1Rhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCk7XG59XG52YXIgem9uZVN5bWJvbCA9IFpvbmUuX19zeW1ib2xfXztcbnZhciBpc1dpbmRvd0V4aXN0cyA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIGludGVybmFsV2luZG93ID0gaXNXaW5kb3dFeGlzdHMgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XG52YXIgX2dsb2JhbCA9IGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93IHx8IHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyAmJiBzZWxmIHx8IGdsb2JhbDtcbnZhciBSRU1PVkVfQVRUUklCVVRFID0gJ3JlbW92ZUF0dHJpYnV0ZSc7XG52YXIgTlVMTF9PTl9QUk9QX1ZBTFVFID0gW251bGxdO1xuZnVuY3Rpb24gYmluZEFyZ3VtZW50cyhhcmdzLCBzb3VyY2UpIHtcbiAgICBmb3IgKHZhciBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGFyZ3NbaV0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGFyZ3NbaV0sIHNvdXJjZSArICdfJyArIGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHByb3RvdHlwZS5jb25zdHJ1Y3RvclsnbmFtZSddO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIG5hbWVfMSA9IGZuTmFtZXNbaV07XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IHByb3RvdHlwZVtuYW1lXzFdO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZV8xKTtcbiAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3RvdHlwZURlc2MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3RvdHlwZVtuYW1lXzFdID0gKGZ1bmN0aW9uIChkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBwYXRjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkodGhpcywgYmluZEFyZ3VtZW50cyhhcmd1bWVudHMsIHNvdXJjZSArICcuJyArIG5hbWVfMSkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHBhdGNoZWQsIGRlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcbiAgICAgICAgICAgIH0pKGRlbGVnYXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmbk5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIF9sb29wXzEoaSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3BlcnR5RGVzYykge1xuICAgIGlmICghcHJvcGVydHlEZXNjKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlEZXNjLndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhKHR5cGVvZiBwcm9wZXJ0eURlc2MuZ2V0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwcm9wZXJ0eURlc2Muc2V0ID09PSAndW5kZWZpbmVkJyk7XG59XG52YXIgaXNXZWJXb3JrZXIgPSAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpO1xuLy8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5XG4vLyB0aGlzIGNvZGUuXG52YXIgaXNOb2RlID0gKCEoJ253JyBpbiBfZ2xvYmFsKSAmJiB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHt9LnRvU3RyaW5nLmNhbGwoX2dsb2JhbC5wcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKTtcbnZhciBpc0Jyb3dzZXIgPSAhaXNOb2RlICYmICFpc1dlYldvcmtlciAmJiAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG4vLyB3ZSBhcmUgaW4gZWxlY3Ryb24gb2YgbncsIHNvIHdlIGFyZSBib3RoIGJyb3dzZXIgYW5kIG5vZGVqc1xuLy8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5XG4vLyB0aGlzIGNvZGUuXG52YXIgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHt9LnRvU3RyaW5nLmNhbGwoX2dsb2JhbC5wcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nICYmICFpc1dlYldvcmtlciAmJlxuICAgICEhKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93WydIVE1MRWxlbWVudCddKTtcbnZhciB6b25lU3ltYm9sRXZlbnROYW1lcyA9IHt9O1xudmFyIHdyYXBGbiA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzkxMSwgaW4gSUUsIHNvbWV0aW1lc1xuICAgIC8vIGV2ZW50IHdpbGwgYmUgdW5kZWZpbmVkLCBzbyB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cuZXZlbnRcbiAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudC50eXBlXTtcbiAgICBpZiAoIWV2ZW50TmFtZVN5bWJvbCkge1xuICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudC50eXBlXSA9IHpvbmVTeW1ib2woJ09OX1BST1BFUlRZJyArIGV2ZW50LnR5cGUpO1xuICAgIH1cbiAgICB2YXIgdGFyZ2V0ID0gdGhpcyB8fCBldmVudC50YXJnZXQgfHwgX2dsb2JhbDtcbiAgICB2YXIgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChpc0Jyb3dzZXIgJiYgdGFyZ2V0ID09PSBpbnRlcm5hbFdpbmRvdyAmJiBldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25pdHVyZVxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2xvYmFsRXZlbnRIYW5kbGVycy9vbmVycm9yI3dpbmRvdy5vbmVycm9yXG4gICAgICAgIC8vIGFuZCBvbmVycm9yIGNhbGxiYWNrIHdpbGwgcHJldmVudCBkZWZhdWx0IHdoZW4gY2FsbGJhY2sgcmV0dXJuIHRydWVcbiAgICAgICAgdmFyIGVycm9yRXZlbnQgPSBldmVudDtcbiAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIgJiZcbiAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXJyb3JFdmVudC5tZXNzYWdlLCBlcnJvckV2ZW50LmZpbGVuYW1lLCBlcnJvckV2ZW50LmxpbmVubywgZXJyb3JFdmVudC5jb2xubywgZXJyb3JFdmVudC5lcnJvcik7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IGxpc3RlbmVyICYmIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmICFyZXN1bHQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5mdW5jdGlvbiBwYXRjaFByb3BlcnR5KG9iaiwgcHJvcCwgcHJvdG90eXBlKSB7XG4gICAgdmFyIGRlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICBpZiAoIWRlc2MgJiYgcHJvdG90eXBlKSB7XG4gICAgICAgIC8vIHdoZW4gcGF0Y2ggd2luZG93IG9iamVjdCwgdXNlIHByb3RvdHlwZSB0byBjaGVjayBwcm9wIGV4aXN0IG9yIG5vdFxuICAgICAgICB2YXIgcHJvdG90eXBlRGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIHByb3ApO1xuICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuICAgICAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgdGhlIGRlc2NyaXB0b3Igbm90IGV4aXN0cyBvciBpcyBub3QgY29uZmlndXJhYmxlXG4gICAgLy8ganVzdCByZXR1cm5cbiAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG9uUHJvcFBhdGNoZWRTeW1ib2wgPSB6b25lU3ltYm9sKCdvbicgKyBwcm9wICsgJ3BhdGNoZWQnKTtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG9uUHJvcFBhdGNoZWRTeW1ib2wpICYmIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEgcHJvcGVydHkgZGVzY3JpcHRvciBjYW5ub3QgaGF2ZSBnZXR0ZXIvc2V0dGVyIGFuZCBiZSB3cml0YWJsZVxuICAgIC8vIGRlbGV0aW5nIHRoZSB3cml0YWJsZSBhbmQgdmFsdWUgcHJvcGVydGllcyBhdm9pZHMgdGhpcyBlcnJvcjpcbiAgICAvL1xuICAgIC8vIFR5cGVFcnJvcjogcHJvcGVydHkgZGVzY3JpcHRvcnMgbXVzdCBub3Qgc3BlY2lmeSBhIHZhbHVlIG9yIGJlIHdyaXRhYmxlIHdoZW4gYVxuICAgIC8vIGdldHRlciBvciBzZXR0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgZGVsZXRlIGRlc2Mud3JpdGFibGU7XG4gICAgZGVsZXRlIGRlc2MudmFsdWU7XG4gICAgdmFyIG9yaWdpbmFsRGVzY0dldCA9IGRlc2MuZ2V0O1xuICAgIHZhciBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcbiAgICAvLyBzdWJzdHIoMikgY3V6ICdvbmNsaWNrJyAtPiAnY2xpY2snLCBldGNcbiAgICB2YXIgZXZlbnROYW1lID0gcHJvcC5zdWJzdHIoMik7XG4gICAgdmFyIGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gICAgaWYgKCFldmVudE5hbWVTeW1ib2wpIHtcbiAgICAgICAgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHpvbmVTeW1ib2woJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZSk7XG4gICAgfVxuICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG4gICAgICAgIC8vIGluIHNvbWUgb2Ygd2luZG93cydzIG9ucHJvcGVydHkgY2FsbGJhY2ssIHRoaXMgaXMgdW5kZWZpbmVkXG4gICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaXRcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gX2dsb2JhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2aW91c1ZhbHVlID0gdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF07XG4gICAgICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHdyYXBGbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXNzdWUgIzk3OCwgd2hlbiBvbmxvYWQgaGFuZGxlciB3YXMgYWRkZWQgYmVmb3JlIGxvYWRpbmcgem9uZS5qc1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggb3JpZ2luYWxEZXNjU2V0XG4gICAgICAgIGlmIChvcmlnaW5hbERlc2NTZXQpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsRGVzY1NldC5hcHBseSh0YXJnZXQsIE5VTExfT05fUFJPUF9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGFyZ2V0W2V2ZW50TmFtZVN5bWJvbF0gPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgd3JhcEZuLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIFRoZSBnZXR0ZXIgd291bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgdW5hc3NpZ25lZCBwcm9wZXJ0aWVzIGJ1dCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhblxuICAgIC8vIHVuYXNzaWduZWQgcHJvcGVydHkgaXMgbnVsbFxuICAgIGRlc2MuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBpbiBzb21lIG9mIHdpbmRvd3MncyBvbnByb3BlcnR5IGNhbGxiYWNrLCB0aGlzIGlzIHVuZGVmaW5lZFxuICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgICAgICBpZiAoIXRhcmdldCAmJiBvYmogPT09IF9nbG9iYWwpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdO1xuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcmlnaW5hbERlc2NHZXQpIHtcbiAgICAgICAgICAgIC8vIHJlc3VsdCB3aWxsIGJlIG51bGwgd2hlbiB1c2UgaW5saW5lIGV2ZW50IGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIHN1Y2ggYXMgPGJ1dHRvbiBvbmNsaWNrPVwiZnVuYygpO1wiPk9LPC9idXR0b24+XG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBvbmNsaWNrIGZ1bmN0aW9uIGlzIGludGVybmFsIHJhdyB1bmNvbXBpbGVkIGhhbmRsZXJcbiAgICAgICAgICAgIC8vIHRoZSBvbmNsaWNrIHdpbGwgYmUgZXZhbHVhdGVkIHdoZW4gZmlyc3QgdGltZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9yXG4gICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzUyNVxuICAgICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIHVzZSBvcmlnaW5hbCBuYXRpdmUgZ2V0IHRvIHJldHJpZXZlIHRoZSBoYW5kbGVyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBvcmlnaW5hbERlc2NHZXQgJiYgb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjLnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpO1xuICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaE9uUHJvcGVydGllcyhvYmosIHByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGF0Y2hQcm9wZXJ0eShvYmosICdvbicgKyBwcm9wZXJ0aWVzW2ldLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgb25Qcm9wZXJ0aWVzID0gW107XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAocHJvcC5zdWJzdHIoMCwgMikgPT0gJ29uJykge1xuICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBwYXRjaFByb3BlcnR5KG9iaiwgb25Qcm9wZXJ0aWVzW2pdLCBwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgfVxufVxudmFyIG9yaWdpbmFsSW5zdGFuY2VLZXkgPSB6b25lU3ltYm9sKCdvcmlnaW5hbEluc3RhbmNlJyk7XG4vLyB3cmFwIHNvbWUgbmF0aXZlIEFQSSBvbiBgd2luZG93YFxuZnVuY3Rpb24gcGF0Y2hDbGFzcyhjbGFzc05hbWUpIHtcbiAgICB2YXIgT3JpZ2luYWxDbGFzcyA9IF9nbG9iYWxbY2xhc3NOYW1lXTtcbiAgICBpZiAoIU9yaWdpbmFsQ2xhc3MpXG4gICAgICAgIHJldHVybjtcbiAgICAvLyBrZWVwIG9yaWdpbmFsIGNsYXNzIGluIGdsb2JhbFxuICAgIF9nbG9iYWxbem9uZVN5bWJvbChjbGFzc05hbWUpXSA9IE9yaWdpbmFsQ2xhc3M7XG4gICAgX2dsb2JhbFtjbGFzc05hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYSA9IGJpbmRBcmd1bWVudHMoYXJndW1lbnRzLCBjbGFzc05hbWUpO1xuICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0sIGFbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZyBsaXN0IHRvbyBsb25nLicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBhdHRhY2ggb3JpZ2luYWwgZGVsZWdhdGUgdG8gcGF0Y2hlZCBmdW5jdGlvblxuICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBPcmlnaW5hbENsYXNzKGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgdmFyIHByb3A7XG4gICAgZm9yIChwcm9wIGluIGluc3RhbmNlKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDcyMVxuICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnWE1MSHR0cFJlcXVlc3QnICYmIHByb3AgPT09ICdyZXNwb25zZUJsb2InKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGVbcHJvcF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdLmFwcGx5KHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0sIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGUsIHByb3AsIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdID0gd3JhcFdpdGhDdXJyZW50Wm9uZShmbiwgY2xhc3NOYW1lICsgJy4nICsgcHJvcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpbiB3cmFwcGVkIGZ1bmN0aW9uIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBpdCBpbiBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0sIGZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSBmbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KHByb3ApKTtcbiAgICB9XG4gICAgZm9yIChwcm9wIGluIE9yaWdpbmFsQ2xhc3MpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdwcm90b3R5cGUnICYmIE9yaWdpbmFsQ2xhc3MuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBjb3B5U3ltYm9sUHJvcGVydGllcyhzcmMsIGRlc3QpIHtcbiAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc3JjKTtcbiAgICBzeW1ib2xzLmZvckVhY2goZnVuY3Rpb24gKHN5bWJvbCkge1xuICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc3JjLCBzeW1ib2wpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgc3ltYm9sLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3JjW3N5bWJvbF07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzYyAmJiAoIWRlc2Mud3JpdGFibGUgfHwgdHlwZW9mIGRlc2Muc2V0ICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBzcmNbc3ltYm9sXSBpcyBub3Qgd3JpdGFibGUgb3Igbm90IGhhdmUgYSBzZXR0ZXIsIGp1c3QgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3JjW3N5bWJvbF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjID8gZGVzYy5lbnVtZXJhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZGVzYyA/IGRlc2MuY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbnZhciBzaG91bGRDb3B5U3ltYm9sUHJvcGVydGllcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBwYXRjaE1ldGhvZCh0YXJnZXQsIG5hbWUsIHBhdGNoRm4pIHtcbiAgICB2YXIgcHJvdG8gPSB0YXJnZXQ7XG4gICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcbiAgICAgICAgLy8gc29tZWhvdyB3ZSBkaWQgbm90IGZpbmQgaXQsIGJ1dCB3ZSBjYW4gc2VlIGl0LiBUaGlzIGhhcHBlbnMgb24gSUUgZm9yIFdpbmRvdyBwcm9wZXJ0aWVzLlxuICAgICAgICBwcm90byA9IHRhcmdldDtcbiAgICB9XG4gICAgdmFyIGRlbGVnYXRlTmFtZSA9IHpvbmVTeW1ib2wobmFtZSk7XG4gICAgdmFyIGRlbGVnYXRlID0gbnVsbDtcbiAgICBpZiAocHJvdG8gJiYgIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pKSB7XG4gICAgICAgIGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSA9IHByb3RvW25hbWVdO1xuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHByb3RvW25hbWVdIGlzIHdyaXRhYmxlXG4gICAgICAgIC8vIHNvbWUgcHJvcGVydHkgaXMgcmVhZG9ubHkgaW4gc2FmYXJpLCBzdWNoIGFzIEh0bWxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50b0Jsb2JcbiAgICAgICAgdmFyIGRlc2MgPSBwcm90byAmJiBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuICAgICAgICBpZiAoaXNQcm9wZXJ0eVdyaXRhYmxlKGRlc2MpKSB7XG4gICAgICAgICAgICB2YXIgcGF0Y2hEZWxlZ2F0ZV8xID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXRjaERlbGVnYXRlXzEodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bbmFtZV0sIGRlbGVnYXRlKTtcbiAgICAgICAgICAgIGlmIChzaG91bGRDb3B5U3ltYm9sUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNvcHlTeW1ib2xQcm9wZXJ0aWVzKGRlbGVnYXRlLCBwcm90b1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGVnYXRlO1xufVxuLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3NhcnlcbmZ1bmN0aW9uIHBhdGNoTWFjcm9UYXNrKG9iaiwgZnVuY05hbWUsIG1ldGFDcmVhdG9yKSB7XG4gICAgdmFyIHNldE5hdGl2ZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7XG4gICAgICAgIGRhdGEuYXJnc1tkYXRhLmNiSWR4XSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRhc2suaW52b2tlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHNldE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTtcbiAgICAgICAgcmV0dXJuIHRhc2s7XG4gICAgfVxuICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKG9iaiwgZnVuY05hbWUsIGZ1bmN0aW9uIChkZWxlZ2F0ZSkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgdmFyIG1ldGEgPSBtZXRhQ3JlYXRvcihzZWxmLCBhcmdzKTtcbiAgICAgICAgaWYgKG1ldGEuY2JJZHggPj0gMCAmJiB0eXBlb2YgYXJnc1ttZXRhLmNiSWR4XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKG1ldGEubmFtZSwgYXJnc1ttZXRhLmNiSWR4XSwgbWV0YSwgc2NoZWR1bGVUYXNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9OyB9KTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHBhdGNoZWQsIG9yaWdpbmFsKSB7XG4gICAgcGF0Y2hlZFt6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7XG59XG52YXIgaXNEZXRlY3RlZElFT3JFZGdlID0gZmFsc2U7XG52YXIgaWVPckVkZ2UgPSBmYWxzZTtcbmZ1bmN0aW9uIGlzSUUoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHVhID0gaW50ZXJuYWxXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNJRU9yRWRnZSgpIHtcbiAgICBpZiAoaXNEZXRlY3RlZElFT3JFZGdlKSB7XG4gICAgICAgIHJldHVybiBpZU9yRWRnZTtcbiAgICB9XG4gICAgaXNEZXRlY3RlZElFT3JFZGdlID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgdWEgPSBpbnRlcm5hbFdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICBpZiAodWEuaW5kZXhPZignTVNJRSAnKSAhPT0gLTEgfHwgdWEuaW5kZXhPZignVHJpZGVudC8nKSAhPT0gLTEgfHwgdWEuaW5kZXhPZignRWRnZS8nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGllT3JFZGdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICB9XG4gICAgcmV0dXJuIGllT3JFZGdlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBvdmVycmlkZSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gbWFrZSB6b25lLmpzIHBhdGNoZWQgZnVuY3Rpb25cbi8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cblpvbmUuX19sb2FkX3BhdGNoKCd0b1N0cmluZycsIGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAvLyBwYXRjaCBGdW5jLnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlXG4gICAgdmFyIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbiAgICB2YXIgT1JJR0lOQUxfREVMRUdBVEVfU1lNQk9MID0gem9uZVN5bWJvbCgnT3JpZ2luYWxEZWxlZ2F0ZScpO1xuICAgIHZhciBQUk9NSVNFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ1Byb21pc2UnKTtcbiAgICB2YXIgRVJST1JfU1lNQk9MID0gem9uZVN5bWJvbCgnRXJyb3InKTtcbiAgICB2YXIgbmV3RnVuY3Rpb25Ub1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVsZWdhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsRGVsZWdhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHZhciBuYXRpdmVQcm9taXNlID0gZ2xvYmFsW1BST01JU0VfU1lNQk9MXTtcbiAgICAgICAgICAgICAgICBpZiAobmF0aXZlUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMgPT09IEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hdGl2ZUVycm9yID0gZ2xvYmFsW0VSUk9SX1NZTUJPTF07XG4gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIG5ld0Z1bmN0aW9uVG9TdHJpbmdbT1JJR0lOQUxfREVMRUdBVEVfU1lNQk9MXSA9IG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZztcbiAgICBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBuZXdGdW5jdGlvblRvU3RyaW5nO1xuICAgIC8vIHBhdGNoIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgdG8gbGV0IHRoZW0gbG9vayBsaWtlIG5hdGl2ZVxuICAgIHZhciBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICB2YXIgUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HID0gJ1tvYmplY3QgUHJvbWlzZV0nO1xuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIFBST01JU0VfT0JKRUNUX1RPX1NUUklORztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxPYmplY3RUb1N0cmluZy5jYWxsKHRoaXMpO1xuICAgIH07XG59KTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG52YXIgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyBhbiBpZGVudGlmaWVyIHRvIHRlbGwgWm9uZVRhc2sgZG8gbm90IGNyZWF0ZSBhIG5ldyBpbnZva2UgY2xvc3VyZVxudmFyIE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcbiAgICB1c2VHOiB0cnVlXG59O1xudmFyIHpvbmVTeW1ib2xFdmVudE5hbWVzJDEgPSB7fTtcbnZhciBnbG9iYWxTb3VyY2VzID0ge307XG52YXIgRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCA9IC9eX196b25lX3N5bWJvbF9fKFxcdyspKHRydWV8ZmFsc2UpJC87XG52YXIgSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTCA9ICgnX196b25lX3N5bWJvbF9fcHJvcGFnYXRpb25TdG9wcGVkJyk7XG5mdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaXMsIHBhdGNoT3B0aW9ucykge1xuICAgIHZhciBBRERfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5hZGQpIHx8IEFERF9FVkVOVF9MSVNURU5FUl9TVFI7XG4gICAgdmFyIFJFTU9WRV9FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtKSB8fCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSO1xuICAgIHZhciBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7XG4gICAgdmFyIFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm1BbGwpIHx8ICdyZW1vdmVBbGxMaXN0ZW5lcnMnO1xuICAgIHZhciB6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lciA9IHpvbmVTeW1ib2woQUREX0VWRU5UX0xJU1RFTkVSKTtcbiAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6JztcbiAgICB2YXIgUFJFUEVORF9FVkVOVF9MSVNURU5FUiA9ICdwcmVwZW5kTGlzdGVuZXInO1xuICAgIHZhciBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIFBSRVBFTkRfRVZFTlRfTElTVEVORVIgKyAnOic7XG4gICAgdmFyIGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkge1xuICAgICAgICAvLyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBjaGVjayBpc1JlbW92ZWQgd2hpY2ggaXMgc2V0XG4gICAgICAgIC8vIGJ5IHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbGVnYXRlID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG4gICAgICAgICAgICB0YXNrLmNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBkZWxlZ2F0ZS5oYW5kbGVFdmVudChldmVudCk7IH07XG4gICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnZva2Ugc3RhdGljIHRhc2suaW52b2tlXG4gICAgICAgIHRhc2suaW52b2tlKHRhc2ssIHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGFzay5vcHRpb25zO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7XG4gICAgICAgICAgICAvLyBpZiBvcHRpb25zLm9uY2UgaXMgdHJ1ZSwgYWZ0ZXIgaW52b2tlIG9uY2UgcmVtb3ZlIGxpc3RlbmVyIGhlcmVcbiAgICAgICAgICAgIC8vIG9ubHkgYnJvd3NlciBuZWVkIHRvIGRvIHRoaXMsIG5vZGVqcyBldmVudEVtaXR0ZXIgd2lsbCBjYWwgcmVtb3ZlTGlzdGVuZXJcbiAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZVxuICAgICAgICAgICAgdmFyIGRlbGVnYXRlXzEgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgdGFyZ2V0W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uY2FsbCh0YXJnZXQsIGV2ZW50LnR5cGUsIGRlbGVnYXRlXzEsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2VcbiAgICB2YXIgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzXG4gICAgICAgIC8vIGV2ZW50IHdpbGwgYmUgdW5kZWZpbmVkLCBzbyB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cuZXZlbnRcbiAgICAgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXZlbnQudGFyZ2V0IGlzIG5lZWRlZCBmb3IgU2Ftc3VuZyBUViBhbmQgU291cmNlQnVmZmVyXG4gICAgICAgIC8vIHx8IGdsb2JhbCBpcyBuZWVkZWQgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvMTkwXG4gICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuICAgICAgICB2YXIgdGFza3MgPSB0YXJnZXRbem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudC50eXBlXVtGQUxTRV9TVFJdXTtcbiAgICAgICAgaWYgKHRhc2tzKSB7XG4gICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlXG4gICAgICAgICAgICAvLyBmb3IgcGVyZm9ybWFuY2UgY29uY2VybiwgaWYgdGFzay5sZW5ndGggPT09IDEsIGp1c3QgaW52b2tlXG4gICAgICAgICAgICBpZiAodGFza3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy84MzZcbiAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSB0YXNrcyBhcnJheSBiZWZvcmUgaW52b2tlLCB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlbW92ZSBpdHNlbGYgb3Igb3RoZXIgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICB2YXIgY29weVRhc2tzID0gdGFza3Muc2xpY2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHlUYXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnRbSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTF0gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGludm9rZVRhc2soY29weVRhc2tzW2ldLCB0YXJnZXQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vIGdsb2JhbCBzaGFyZWQgem9uZUF3YXJlQ2FsbGJhY2sgdG8gaGFuZGxlIGFsbCBldmVudCBjYWxsYmFjayB3aXRoIGNhcHR1cmUgPSB0cnVlXG4gICAgdmFyIGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXNcbiAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuICAgICAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBldmVudC50YXJnZXQgaXMgbmVlZGVkIGZvciBTYW1zdW5nIFRWIGFuZCBTb3VyY2VCdWZmZXJcbiAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgZXZlbnQudGFyZ2V0IHx8IF9nbG9iYWw7XG4gICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFt6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdW1RSVUVfU1RSXV07XG4gICAgICAgIGlmICh0YXNrcykge1xuICAgICAgICAgICAgLy8gaW52b2tlIGFsbCB0YXNrcyB3aGljaCBhdHRhY2hlZCB0byBjdXJyZW50IHRhcmdldCB3aXRoIGdpdmVuIGV2ZW50LnR5cGUgYW5kIGNhcHR1cmUgPSBmYWxzZVxuICAgICAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIGlmIHRhc2subGVuZ3RoID09PSAxLCBqdXN0IGludm9rZVxuICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGludm9rZVRhc2sodGFza3NbMF0sIHRhcmdldCwgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvODM2XG4gICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgd2lsbCByZW1vdmUgaXRzZWxmIG9yIG90aGVyIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgdmFyIGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50W0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbnZva2VUYXNrKGNvcHlUYXNrc1tpXSwgdGFyZ2V0LCBldmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhvYmosIHBhdGNoT3B0aW9ucykge1xuICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnVzZUcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXNlR2xvYmFsQ2FsbGJhY2sgPSBwYXRjaE9wdGlvbnMudXNlRztcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsaWRhdGVIYW5kbGVyID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy52aDtcbiAgICAgICAgdmFyIGNoZWNrRHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuY2hrRHVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlID0gcGF0Y2hPcHRpb25zLmNoa0R1cDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmV0dXJuVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvdG8gPSBvYmo7XG4gICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkge1xuICAgICAgICAgICAgcHJvdG8gPSBPYmplY3RHZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkge1xuICAgICAgICAgICAgLy8gc29tZWhvdyB3ZSBkaWQgbm90IGZpbmQgaXQsIGJ1dCB3ZSBjYW4gc2VlIGl0LiBUaGlzIGhhcHBlbnMgb24gSUUgZm9yIFdpbmRvdyBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgcHJvdG8gPSBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm90bykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm90b1t6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lcl0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXZlbnROYW1lVG9TdHJpbmcgPSBwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLmV2ZW50TmFtZVRvU3RyaW5nO1xuICAgICAgICAvLyBhIHNoYXJlZCBnbG9iYWwgdGFza0RhdGEgdG8gcGFzcyBkYXRhIGZvciBzY2hlZHVsZUV2ZW50VGFza1xuICAgICAgICAvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGp1c3QgZm9yIHBhc3Mgc29tZSBkYXRhXG4gICAgICAgIHZhciB0YXNrRGF0YSA9IHt9O1xuICAgICAgICB2YXIgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSA9IHByb3RvW0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgIHZhciBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChSRU1PVkVfRVZFTlRfTElTVEVORVIpXSA9XG4gICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuICAgICAgICB2YXIgbmF0aXZlTGlzdGVuZXJzID0gcHJvdG9bem9uZVN5bWJvbChMSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9XG4gICAgICAgICAgICBwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdO1xuICAgICAgICB2YXIgbmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzID0gcHJvdG9bem9uZVN5bWJvbChSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUildID1cbiAgICAgICAgICAgIHByb3RvW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgdmFyIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyO1xuICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG4gICAgICAgICAgICBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciA9IHByb3RvW3pvbmVTeW1ib2wocGF0Y2hPcHRpb25zLnByZXBlbmQpXSA9XG4gICAgICAgICAgICAgICAgcHJvdG9bcGF0Y2hPcHRpb25zLnByZXBlbmRdO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrSXNQYXNzaXZlKHRhc2spIHtcbiAgICAgICAgICAgIGlmICghcGFzc2l2ZVN1cHBvcnRlZCAmJiB0eXBlb2YgdGFza0RhdGEub3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRhc2tEYXRhLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRhc2tEYXRhLm9wdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zIGlzIGEgbm9uLW51bGwgbm9uLXVuZGVmaW5lZCBvYmplY3RcbiAgICAgICAgICAgICAgICAvLyBwYXNzaXZlIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICAvLyBkb24ndCBwYXNzIG9wdGlvbnMgYXMgb2JqZWN0XG4gICAgICAgICAgICAgICAgLy8ganVzdCBwYXNzIGNhcHR1cmUgYXMgYSBib29sZWFuXG4gICAgICAgICAgICAgICAgdGFzay5vcHRpb25zID0gISF0YXNrRGF0YS5vcHRpb25zLmNhcHR1cmU7XG4gICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucyA9IHRhc2sub3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHRhc2sgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlLFxuICAgICAgICAgICAgLy8ganVzdCByZXR1cm4sIGJlY2F1c2Ugd2UgdXNlIHRoZSBzaGFyZWQgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgaGVyZS5cbiAgICAgICAgICAgIGlmICh0YXNrRGF0YS5pc0V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hlY2tJc1Bhc3NpdmUodGFzayk7XG4gICAgICAgICAgICByZXR1cm4gbmF0aXZlQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRhc2tEYXRhLnRhcmdldCwgdGFza0RhdGEuZXZlbnROYW1lLCB0YXNrRGF0YS5jYXB0dXJlID8gZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrIDogZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2ssIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY3VzdG9tQ2FuY2VsR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIC8vIGlmIHRhc2sgaXMgbm90IG1hcmtlZCBhcyBpc1JlbW92ZWQsIHRoaXMgY2FsbCBpcyBkaXJlY3RseVxuICAgICAgICAgICAgLy8gZnJvbSBab25lLnByb3RvdHlwZS5jYW5jZWxUYXNrLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB0YXNrXG4gICAgICAgICAgICAvLyBmcm9tIHRhc2tzTGlzdCBvZiB0YXJnZXQgZmlyc3RcbiAgICAgICAgICAgIGlmICghdGFzay5pc1JlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbdGFzay5ldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1t0YXNrLmNhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2sgPT09IHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pc1JlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5hbGxSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay50YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG4gICAgICAgICAgICAvLyB3ZSB3aWxsIHJlYWxseSByZW1vdmUgdGhlIGdsb2JhbCBldmVudCBjYWxsYmFjayxcbiAgICAgICAgICAgIC8vIGlmIG5vdCwgcmV0dXJuXG4gICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIGNoZWNrSXNQYXNzaXZlKHRhc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lci5jYWxsKHRhc2tEYXRhLnRhcmdldCwgdGFza0RhdGEuZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFza0RhdGEub3B0aW9ucyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjdXN0b21DYW5jZWxOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrLnRhcmdldCwgdGFzay5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrLm9wdGlvbnMpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGUgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbVNjaGVkdWxlR2xvYmFsIDogY3VzdG9tU2NoZWR1bGVOb25HbG9iYWw7XG4gICAgICAgIHZhciBjdXN0b21DYW5jZWwgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbUNhbmNlbEdsb2JhbCA6IGN1c3RvbUNhbmNlbE5vbkdsb2JhbDtcbiAgICAgICAgdmFyIGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlID0gZnVuY3Rpb24gKHRhc2ssIGRlbGVnYXRlKSB7XG4gICAgICAgICAgICB2YXIgdHlwZU9mRGVsZWdhdGUgPSB0eXBlb2YgZGVsZWdhdGU7XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVPZkRlbGVnYXRlID09PSAnZnVuY3Rpb24nICYmIHRhc2suY2FsbGJhY2sgPT09IGRlbGVnYXRlKSB8fFxuICAgICAgICAgICAgICAgICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgdGFzay5vcmlnaW5hbERlbGVnYXRlID09PSBkZWxlZ2F0ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb21wYXJlID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuZGlmZikgPyBwYXRjaE9wdGlvbnMuZGlmZiA6IGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlO1xuICAgICAgICB2YXIgYmxhY2tMaXN0ZWRFdmVudHMgPSBab25lW1pvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpXTtcbiAgICAgICAgdmFyIG1ha2VBZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIChuYXRpdmVMaXN0ZW5lciwgYWRkU291cmNlLCBjdXN0b21TY2hlZHVsZUZuLCBjdXN0b21DYW5jZWxGbiwgcmV0dXJuVGFyZ2V0LCBwcmVwZW5kKSB7XG4gICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0ID09PSB2b2lkIDApIHsgcmV0dXJuVGFyZ2V0ID0gZmFsc2U7IH1cbiAgICAgICAgICAgIGlmIChwcmVwZW5kID09PSB2b2lkIDApIHsgcHJlcGVuZCA9IGZhbHNlOyB9XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZSAmJiBldmVudE5hbWUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcGF0Y2ggdW5jYXVnaHRFeGNlcHRpb24gb2Ygbm9kZWpzIHRvIHByZXZlbnQgZW5kbGVzcyBsb29wXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkb24ndCBjcmVhdGUgdGhlIGJpbmQgZGVsZWdhdGUgZnVuY3Rpb24gZm9yIGhhbmRsZUV2ZW50XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBoZXJlIHRvIGltcHJvdmUgYWRkRXZlbnRMaXN0ZW5lciBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIHdoZW4gaW52b2tlXG4gICAgICAgICAgICAgICAgdmFyIGlzSGFuZGxlRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlbGVnYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzSGFuZGxlRXZlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVIYW5kbGVyICYmICF2YWxpZGF0ZUhhbmRsZXIobmF0aXZlTGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgICAgICBpZiAoYmxhY2tMaXN0ZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYmxhY2sgbGlzdFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsYWNrTGlzdGVkRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBibGFja0xpc3RlZEV2ZW50c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgICAgICAgICAgIHZhciBvbmNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmUgPSBvcHRpb25zID8gISFvcHRpb25zLmNhcHR1cmUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgb25jZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMub25jZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lO1xuICAgICAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29kZSBpcyBkdXBsaWNhdGUsIGJ1dCBJIGp1c3Qgd2FudCB0byBnZXQgc29tZSBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZhbHNlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBGQUxTRV9TVFI7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV1bRkFMU0VfU1RSXSA9IHN5bWJvbDtcbiAgICAgICAgICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IGNhcHR1cmUgPyBzeW1ib2xDYXB0dXJlIDogc3ltYm9sO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUYXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIHZhciBpc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXZlIHRhc2sgcmVnaXN0ZXJlZFxuICAgICAgICAgICAgICAgICAgICBpc0V4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4aXN0aW5nVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2tzW2ldLCBkZWxlZ2F0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBjYWxsYmFjaywgc2FtZSBjYXB0dXJlLCBzYW1lIGV2ZW50IG5hbWUsIGp1c3QgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc291cmNlO1xuICAgICAgICAgICAgICAgIHZhciBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0U291cmNlID0gZ2xvYmFsU291cmNlc1tjb25zdHJ1Y3Rvck5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlID0gdGFyZ2V0U291cmNlW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGNvbnN0cnVjdG9yTmFtZSArIGFkZFNvdXJjZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBvYmplY3QgYXMgdGFzay5kYXRhIHRvIHBhc3MgdGhvc2UgdGhpbmdzXG4gICAgICAgICAgICAgICAgLy8ganVzdCB1c2UgdGhlIGdsb2JhbCBzaGFyZWQgb25lXG4gICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKG9uY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWRkRXZlbnRMaXN0ZW5lciB3aXRoIG9uY2Ugb3B0aW9ucywgd2UgZG9uJ3QgcGFzcyBpdCB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgYWRkRXZlbnRMaXN0ZW5lciwgaW5zdGVhZCB3ZSBrZWVwIHRoZSBvbmNlIHNldHRpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGhhbmRsZSBvdXJzZWx2ZXMuXG4gICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMub25jZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgdGFza0RhdGEuY2FwdHVyZSA9IGNhcHR1cmU7XG4gICAgICAgICAgICAgICAgdGFza0RhdGEuZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgICAgICAgICAgIHRhc2tEYXRhLmlzRXhpc3RpbmcgPSBpc0V4aXN0aW5nO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8ga2VlcCB0YXNrRGF0YSBpbnRvIGRhdGEgdG8gYWxsb3cgb25TY2hlZHVsZUV2ZW50VGFzayB0byBhY2Nlc3MgdGhlIHRhc2sgaW5mb3JtYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRhc2tEYXRhID0gdGFza0RhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0YXNrID0gem9uZS5zY2hlZHVsZUV2ZW50VGFzayhzb3VyY2UsIGRlbGVnYXRlLCBkYXRhLCBjdXN0b21TY2hlZHVsZUZuLCBjdXN0b21DYW5jZWxGbik7XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGNsZWFyIHRhc2tEYXRhLnRhcmdldCB0byBhdm9pZCBtZW1vcnkgbGVha1xuICAgICAgICAgICAgICAgIC8vIGlzc3VlLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDQ0MlxuICAgICAgICAgICAgICAgIHRhc2tEYXRhLnRhcmdldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjbGVhciB1cCB0YXNrRGF0YSBiZWNhdXNlIGl0IGlzIGEgZ2xvYmFsIG9iamVjdFxuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEudGFza0RhdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHNhdmUgdGhvc2UgaW5mb3JtYXRpb24gdG8gdGFzayBpbiBjYXNlXG4gICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gbWF5IGNhbGwgdGFzay56b25lLmNhbmNlbFRhc2soKSBkaXJlY3RseVxuICAgICAgICAgICAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25jZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghKCFwYXNzaXZlU3VwcG9ydGVkICYmIHR5cGVvZiB0YXNrLm9wdGlvbnMgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IHN1cHBvcnQgcGFzc2l2ZSwgYW5kIHdlIHBhc3MgYW4gb3B0aW9uIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAvLyB0byBhZGRFdmVudExpc3RlbmVyLCB3ZSBzaG91bGQgc2F2ZSB0aGUgb3B0aW9ucyB0byB0YXNrXG4gICAgICAgICAgICAgICAgICAgIHRhc2sub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2sudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRhc2suY2FwdHVyZSA9IGNhcHR1cmU7XG4gICAgICAgICAgICAgICAgdGFzay5ldmVudE5hbWUgPSBldmVudE5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzSGFuZGxlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBkZWxlZ2F0ZSBmb3IgY29tcGFyZSB0byBjaGVjayBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgICAgdGFzay5vcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcHJlcGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnB1c2godGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnVuc2hpZnQodGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBwcm90b1tBRERfRVZFTlRfTElTVEVORVJdID0gbWFrZUFkZExpc3RlbmVyKG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIsIEFERF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwsIHJldHVyblRhcmdldCk7XG4gICAgICAgIGlmIChuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgcHJvdG9bUFJFUEVORF9FVkVOVF9MSVNURU5FUl0gPSBtYWtlQWRkTGlzdGVuZXIobmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIsIFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZVByZXBlbmQsIGN1c3RvbUNhbmNlbCwgcmV0dXJuVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhcHR1cmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZSA9IG9wdGlvbnMgPyAhIW9wdGlvbnMuY2FwdHVyZSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVIYW5kbGVyICYmXG4gICAgICAgICAgICAgICAgIXZhbGlkYXRlSGFuZGxlcihuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLCBkZWxlZ2F0ZSwgdGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07XG4gICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lO1xuICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW2NhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdUYXNrcyA9IHN5bWJvbEV2ZW50TmFtZSAmJiB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNSZW1vdmVkIHRvIGRhdGEgZm9yIGZhc3RlciBpbnZva2VUYXNrIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUgaGF2ZSBnb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFzay56b25lLmNhbmNlbFRhc2soZXhpc3RpbmdUYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaXNzdWUgOTMwLCBkaWRuJ3QgZmluZCB0aGUgZXZlbnQgbmFtZSBvciBjYWxsYmFja1xuICAgICAgICAgICAgLy8gZnJvbSB6b25lIGtlcHQgZXhpc3RpbmdUYXNrcywgdGhlIGNhbGxiYWNrIG1heWJlXG4gICAgICAgICAgICAvLyBhZGRlZCBvdXRzaWRlIG9mIHpvbmUsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgICAgICAgICAgLy8gdG8gdHJ5IHRvIHJlbW92ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YXNrcyA9IGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVycztcbiAgICAgICAgfTtcbiAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAoIWV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3AgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBldnROYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIG5vZGVqcyBFdmVudEVtaXR0ZXIsIHJlbW92ZUxpc3RlbmVyIGV2ZW50IGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1vbml0b3JpbmcgdGhlIHJlbW92ZUxpc3RlbmVyIGNhbGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIGp1c3Qga2VlcCByZW1vdmVMaXN0ZW5lciBldmVudExpc3RlbmVyIHVudGlsXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBldmVudExpc3RlbmVycyBhcmUgcmVtb3ZlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiBldnROYW1lICE9PSAncmVtb3ZlTGlzdGVuZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2dE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByZW1vdmVMaXN0ZW5lciBsaXN0ZW5lciBmaW5hbGx5XG4gICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCAncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW0ZBTFNFX1NUUl07XG4gICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xDYXB0dXJlRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tUUlVFX1NUUl07XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FwdHVyZVRhc2tzID0gdGFyZ2V0W3N5bWJvbENhcHR1cmVFdmVudE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW92ZVRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSByZW1vdmVUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZVRhc2tzID0gY2FwdHVyZVRhc2tzLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlbW92ZVRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSByZW1vdmVUYXNrc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGZvciBuYXRpdmUgdG9TdHJpbmcgcGF0Y2hcbiAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW0FERF9FVkVOVF9MSVNURU5FUl0sIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIpO1xuICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcik7XG4gICAgICAgIGlmIChuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0sIG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0sIG5hdGl2ZUxpc3RlbmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdHNbaV0gPSBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhhcGlzW2ldLCBwYXRjaE9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbmZ1bmN0aW9uIGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lKSB7XG4gICAgdmFyIGZvdW5kVGFza3MgPSBbXTtcbiAgICBmb3IgKHZhciBwcm9wIGluIHRhcmdldCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7XG4gICAgICAgIHZhciBldnROYW1lID0gbWF0Y2ggJiYgbWF0Y2hbMV07XG4gICAgICAgIGlmIChldnROYW1lICYmICghZXZlbnROYW1lIHx8IGV2dE5hbWUgPT09IGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIGlmICh0YXNrcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRUYXNrcy5wdXNoKHRhc2tzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kVGFza3M7XG59XG5mdW5jdGlvbiBwYXRjaEV2ZW50UHJvdG90eXBlKGdsb2JhbCwgYXBpKSB7XG4gICAgdmFyIEV2ZW50ID0gZ2xvYmFsWydFdmVudCddO1xuICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcbiAgICAgICAgYXBpLnBhdGNoTWV0aG9kKEV2ZW50LnByb3RvdHlwZSwgJ3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbicsIGZ1bmN0aW9uIChkZWxlZ2F0ZSkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIHNlbGZbSU1NRURJQVRFX1BST1BBR0FUSU9OX1NZTUJPTF0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG4gICAgICAgICAgICAvLyBpbiBjYXNlIGluIHNvbWUgaHlicmlkIGFwcGxpY2F0aW9uLCBzb21lIHBhcnQgb2ZcbiAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIHdpbGwgYmUgY29udHJvbGxlZCBieSB6b25lLCBzb21lIGFyZSBub3RcbiAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICB9OyB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHBhdGNoQ2FsbGJhY2tzKGFwaSwgdGFyZ2V0LCB0YXJnZXROYW1lLCBtZXRob2QsIGNhbGxiYWNrcykge1xuICAgIHZhciBzeW1ib2wgPSBab25lLl9fc3ltYm9sX18obWV0aG9kKTtcbiAgICBpZiAodGFyZ2V0W3N5bWJvbF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmF0aXZlRGVsZWdhdGUgPSB0YXJnZXRbc3ltYm9sXSA9IHRhcmdldFttZXRob2RdO1xuICAgIHRhcmdldFttZXRob2RdID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0YXJnZXROYW1lICsgXCIuXCIgKyBtZXRob2QgKyBcIjo6XCIgKyBjYWxsYmFjaztcbiAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb3B0cy5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXBpLndyYXBXaXRoQ3VycmVudFpvbmUoZGVzY3JpcHRvci52YWx1ZSwgc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eShvcHRzLnByb3RvdHlwZSwgY2FsbGJhY2ssIGRlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvdHlwZVtjYWxsYmFja10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZVtjYWxsYmFja10gPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShwcm90b3R5cGVbY2FsbGJhY2tdLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvdHlwZVtjYWxsYmFja10pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hdGl2ZURlbGVnYXRlLmNhbGwodGFyZ2V0LCBuYW1lLCBvcHRzLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIGFwaS5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGFyZ2V0W21ldGhvZF0sIG5hdGl2ZURlbGVnYXRlKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLypcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBDaHJvbWUgYW5kIENocm9tZSBtb2JpbGUsIHRvIGVuYWJsZVxuICogdGhpbmdzIGxpa2UgcmVkZWZpbmluZyBgY3JlYXRlZENhbGxiYWNrYCBvbiBhbiBlbGVtZW50LlxuICovXG52YXIgem9uZVN5bWJvbCQxID0gWm9uZS5fX3N5bWJvbF9fO1xudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IE9iamVjdFt6b25lU3ltYm9sJDEoJ2RlZmluZVByb3BlcnR5JyldID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3Rbem9uZVN5bWJvbCQxKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InKV0gPVxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG52YXIgdW5jb25maWd1cmFibGVzS2V5ID0gem9uZVN5bWJvbCQxKCd1bmNvbmZpZ3VyYWJsZXMnKTtcbmZ1bmN0aW9uIHByb3BlcnR5UGF0Y2goKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgZGVzYykge1xuICAgICAgICBpZiAoaXNVbmNvbmZpZ3VyYWJsZShvYmosIHByb3ApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgYXNzaWduIHRvIHJlYWQgb25seSBwcm9wZXJ0eSBcXCcnICsgcHJvcCArICdcXCcgb2YgJyArIG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyA9IGRlc2MuY29uZmlndXJhYmxlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICAgIGRlc2MgPSByZXdyaXRlRGVzY3JpcHRvcihvYmosIHByb3AsIGRlc2MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdHJ5RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjLCBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAob2JqLCBwcm9wcykge1xuICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgcHJvcHNbcHJvcF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAob2JqLCBwcm90bykge1xuICAgICAgICBpZiAodHlwZW9mIHByb3RvID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmlzRnJvemVuKHByb3RvKSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvdG8pLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICBwcm90b1twcm9wXSA9IHJld3JpdGVEZXNjcmlwdG9yKG9iaiwgcHJvcCwgcHJvdG9bcHJvcF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9jcmVhdGUob2JqLCBwcm90byk7XG4gICAgfTtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICB2YXIgZGVzYyA9IF9nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgaXNVbmNvbmZpZ3VyYWJsZShvYmosIHByb3ApKSB7XG4gICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgIH07XG59XG5mdW5jdGlvbiBfcmVkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpIHtcbiAgICB2YXIgb3JpZ2luYWxDb25maWd1cmFibGVGbGFnID0gZGVzYy5jb25maWd1cmFibGU7XG4gICAgZGVzYyA9IHJld3JpdGVEZXNjcmlwdG9yKG9iaiwgcHJvcCwgZGVzYyk7XG4gICAgcmV0dXJuIF90cnlEZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MsIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyk7XG59XG5mdW5jdGlvbiBpc1VuY29uZmlndXJhYmxlKG9iaiwgcHJvcCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW3VuY29uZmlndXJhYmxlc0tleV0gJiYgb2JqW3VuY29uZmlndXJhYmxlc0tleV1bcHJvcF07XG59XG5mdW5jdGlvbiByZXdyaXRlRGVzY3JpcHRvcihvYmosIHByb3AsIGRlc2MpIHtcbiAgICAvLyBpc3N1ZS05MjcsIGlmIHRoZSBkZXNjIGlzIGZyb3plbiwgZG9uJ3QgdHJ5IHRvIGNoYW5nZSB0aGUgZGVzY1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGRlc2MpKSB7XG4gICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAvLyBpc3N1ZS05MjcsIGlmIHRoZSBvYmogaXMgZnJvemVuLCBkb24ndCB0cnkgdG8gc2V0IHRoZSBkZXNjIHRvIG9ialxuICAgICAgICBpZiAoIW9ialt1bmNvbmZpZ3VyYWJsZXNLZXldICYmICFPYmplY3QuaXNGcm96ZW4ob2JqKSkge1xuICAgICAgICAgICAgX2RlZmluZVByb3BlcnR5KG9iaiwgdW5jb25maWd1cmFibGVzS2V5LCB7IHdyaXRhYmxlOiB0cnVlLCB2YWx1ZToge30gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9ialt1bmNvbmZpZ3VyYWJsZXNLZXldKSB7XG4gICAgICAgICAgICBvYmpbdW5jb25maWd1cmFibGVzS2V5XVtwcm9wXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc2M7XG59XG5mdW5jdGlvbiBfdHJ5RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjLCBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gX2RlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzYyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZGVzYy5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZXJyb3JzLCB3aGVuIHRoZSBjb25maWd1cmFibGUgZmxhZyB3YXMgbGlrZWx5IHNldCBieSByZXdyaXRlRGVzY3JpcHRvcigpLCBsZXQnc1xuICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCB0aGUgb3JpZ2luYWwgZmxhZyB2YWx1ZVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGVzYy5jb25maWd1cmFibGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlc2NKc29uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjSnNvbiA9IEpTT04uc3RyaW5naWZ5KGRlc2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY0pzb24gPSBkZXNjLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQXR0ZW1wdGluZyB0byBjb25maWd1cmUgJ1wiICsgcHJvcCArIFwiJyB3aXRoIGRlc2NyaXB0b3IgJ1wiICsgZGVzY0pzb24gKyBcIicgb24gb2JqZWN0ICdcIiArIG9iaiArIFwiJyBhbmQgZ290IGVycm9yLCBnaXZpbmcgdXA6IFwiICsgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuICovXG52YXIgZ2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TmFtZXMgPSBbXG4gICAgJ2Fib3J0JyxcbiAgICAnYW5pbWF0aW9uY2FuY2VsJyxcbiAgICAnYW5pbWF0aW9uZW5kJyxcbiAgICAnYW5pbWF0aW9uaXRlcmF0aW9uJyxcbiAgICAnYXV4Y2xpY2snLFxuICAgICdiZWZvcmVpbnB1dCcsXG4gICAgJ2JsdXInLFxuICAgICdjYW5jZWwnLFxuICAgICdjYW5wbGF5JyxcbiAgICAnY2FucGxheXRocm91Z2gnLFxuICAgICdjaGFuZ2UnLFxuICAgICdjb21wb3NpdGlvbnN0YXJ0JyxcbiAgICAnY29tcG9zaXRpb251cGRhdGUnLFxuICAgICdjb21wb3NpdGlvbmVuZCcsXG4gICAgJ2N1ZWNoYW5nZScsXG4gICAgJ2NsaWNrJyxcbiAgICAnY2xvc2UnLFxuICAgICdjb250ZXh0bWVudScsXG4gICAgJ2N1cmVjaGFuZ2UnLFxuICAgICdkYmxjbGljaycsXG4gICAgJ2RyYWcnLFxuICAgICdkcmFnZW5kJyxcbiAgICAnZHJhZ2VudGVyJyxcbiAgICAnZHJhZ2V4aXQnLFxuICAgICdkcmFnbGVhdmUnLFxuICAgICdkcmFnb3ZlcicsXG4gICAgJ2Ryb3AnLFxuICAgICdkdXJhdGlvbmNoYW5nZScsXG4gICAgJ2VtcHRpZWQnLFxuICAgICdlbmRlZCcsXG4gICAgJ2Vycm9yJyxcbiAgICAnZm9jdXMnLFxuICAgICdmb2N1c2luJyxcbiAgICAnZm9jdXNvdXQnLFxuICAgICdnb3Rwb2ludGVyY2FwdHVyZScsXG4gICAgJ2lucHV0JyxcbiAgICAnaW52YWxpZCcsXG4gICAgJ2tleWRvd24nLFxuICAgICdrZXlwcmVzcycsXG4gICAgJ2tleXVwJyxcbiAgICAnbG9hZCcsXG4gICAgJ2xvYWRzdGFydCcsXG4gICAgJ2xvYWRlZGRhdGEnLFxuICAgICdsb2FkZWRtZXRhZGF0YScsXG4gICAgJ2xvc3Rwb2ludGVyY2FwdHVyZScsXG4gICAgJ21vdXNlZG93bicsXG4gICAgJ21vdXNlZW50ZXInLFxuICAgICdtb3VzZWxlYXZlJyxcbiAgICAnbW91c2Vtb3ZlJyxcbiAgICAnbW91c2VvdXQnLFxuICAgICdtb3VzZW92ZXInLFxuICAgICdtb3VzZXVwJyxcbiAgICAnbW91c2V3aGVlbCcsXG4gICAgJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAncGF1c2UnLFxuICAgICdwbGF5JyxcbiAgICAncGxheWluZycsXG4gICAgJ3BvaW50ZXJjYW5jZWwnLFxuICAgICdwb2ludGVyZG93bicsXG4gICAgJ3BvaW50ZXJlbnRlcicsXG4gICAgJ3BvaW50ZXJsZWF2ZScsXG4gICAgJ3BvaW50ZXJsb2NrY2hhbmdlJyxcbiAgICAnbW96cG9pbnRlcmxvY2tjaGFuZ2UnLFxuICAgICd3ZWJraXRwb2ludGVybG9ja2VyY2hhbmdlJyxcbiAgICAncG9pbnRlcmxvY2tlcnJvcicsXG4gICAgJ21venBvaW50ZXJsb2NrZXJyb3InLFxuICAgICd3ZWJraXRwb2ludGVybG9ja2Vycm9yJyxcbiAgICAncG9pbnRlcm1vdmUnLFxuICAgICdwb2ludG91dCcsXG4gICAgJ3BvaW50ZXJvdmVyJyxcbiAgICAncG9pbnRlcnVwJyxcbiAgICAncHJvZ3Jlc3MnLFxuICAgICdyYXRlY2hhbmdlJyxcbiAgICAncmVzZXQnLFxuICAgICdyZXNpemUnLFxuICAgICdzY3JvbGwnLFxuICAgICdzZWVrZWQnLFxuICAgICdzZWVraW5nJyxcbiAgICAnc2VsZWN0JyxcbiAgICAnc2VsZWN0aW9uY2hhbmdlJyxcbiAgICAnc2VsZWN0c3RhcnQnLFxuICAgICdzaG93JyxcbiAgICAnc29ydCcsXG4gICAgJ3N0YWxsZWQnLFxuICAgICdzdWJtaXQnLFxuICAgICdzdXNwZW5kJyxcbiAgICAndGltZXVwZGF0ZScsXG4gICAgJ3ZvbHVtZWNoYW5nZScsXG4gICAgJ3RvdWNoY2FuY2VsJyxcbiAgICAndG91Y2htb3ZlJyxcbiAgICAndG91Y2hzdGFydCcsXG4gICAgJ3RvdWNoZW5kJyxcbiAgICAndHJhbnNpdGlvbmNhbmNlbCcsXG4gICAgJ3RyYW5zaXRpb25lbmQnLFxuICAgICd3YWl0aW5nJyxcbiAgICAnd2hlZWwnXG5dO1xudmFyIGRvY3VtZW50RXZlbnROYW1lcyA9IFtcbiAgICAnYWZ0ZXJzY3JpcHRleGVjdXRlJywgJ2JlZm9yZXNjcmlwdGV4ZWN1dGUnLCAnRE9NQ29udGVudExvYWRlZCcsICdmcmVlemUnLCAnZnVsbHNjcmVlbmNoYW5nZScsXG4gICAgJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsICdtc2Z1bGxzY3JlZW5jaGFuZ2UnLCAnZnVsbHNjcmVlbmVycm9yJyxcbiAgICAnbW96ZnVsbHNjcmVlbmVycm9yJywgJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvcicsICdtc2Z1bGxzY3JlZW5lcnJvcicsICdyZWFkeXN0YXRlY2hhbmdlJyxcbiAgICAndmlzaWJpbGl0eWNoYW5nZScsICdyZXN1bWUnXG5dO1xudmFyIHdpbmRvd0V2ZW50TmFtZXMgPSBbXG4gICAgJ2Fic29sdXRlZGV2aWNlb3JpZW50YXRpb24nLFxuICAgICdhZnRlcmlucHV0JyxcbiAgICAnYWZ0ZXJwcmludCcsXG4gICAgJ2FwcGluc3RhbGxlZCcsXG4gICAgJ2JlZm9yZWluc3RhbGxwcm9tcHQnLFxuICAgICdiZWZvcmVwcmludCcsXG4gICAgJ2JlZm9yZXVubG9hZCcsXG4gICAgJ2RldmljZWxpZ2h0JyxcbiAgICAnZGV2aWNlbW90aW9uJyxcbiAgICAnZGV2aWNlb3JpZW50YXRpb24nLFxuICAgICdkZXZpY2VvcmllbnRhdGlvbmFic29sdXRlJyxcbiAgICAnZGV2aWNlcHJveGltaXR5JyxcbiAgICAnaGFzaGNoYW5nZScsXG4gICAgJ2xhbmd1YWdlY2hhbmdlJyxcbiAgICAnbWVzc2FnZScsXG4gICAgJ21vemJlZm9yZXBhaW50JyxcbiAgICAnb2ZmbGluZScsXG4gICAgJ29ubGluZScsXG4gICAgJ3BhaW50JyxcbiAgICAncGFnZXNob3cnLFxuICAgICdwYWdlaGlkZScsXG4gICAgJ3BvcHN0YXRlJyxcbiAgICAncmVqZWN0aW9uaGFuZGxlZCcsXG4gICAgJ3N0b3JhZ2UnLFxuICAgICd1bmhhbmRsZWRyZWplY3Rpb24nLFxuICAgICd1bmxvYWQnLFxuICAgICd1c2VycHJveGltaXR5JyxcbiAgICAndnJkaXNwbHljb25uZWN0ZWQnLFxuICAgICd2cmRpc3BsYXlkaXNjb25uZWN0ZWQnLFxuICAgICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJ1xuXTtcbnZhciBodG1sRWxlbWVudEV2ZW50TmFtZXMgPSBbXG4gICAgJ2JlZm9yZWNvcHknLCAnYmVmb3JlY3V0JywgJ2JlZm9yZXBhc3RlJywgJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2RyYWdzdGFydCcsICdsb2FkZW5kJyxcbiAgICAnYW5pbWF0aW9uc3RhcnQnLCAnc2VhcmNoJywgJ3RyYW5zaXRpb25ydW4nLCAndHJhbnNpdGlvbnN0YXJ0JywgJ3dlYmtpdGFuaW1hdGlvbmVuZCcsXG4gICAgJ3dlYmtpdGFuaW1hdGlvbml0ZXJhdGlvbicsICd3ZWJraXRhbmltYXRpb25zdGFydCcsICd3ZWJraXR0cmFuc2l0aW9uZW5kJ1xuXTtcbnZhciBtZWRpYUVsZW1lbnRFdmVudE5hbWVzID0gWydlbmNyeXB0ZWQnLCAnd2FpdGluZ2ZvcmtleScsICdtc25lZWRrZXknLCAnbW96aW50ZXJydXB0YmVnaW4nLCAnbW96aW50ZXJydXB0ZW5kJ107XG52YXIgaWVFbGVtZW50RXZlbnROYW1lcyA9IFtcbiAgICAnYWN0aXZhdGUnLFxuICAgICdhZnRlcnVwZGF0ZScsXG4gICAgJ2FyaWFyZXF1ZXN0JyxcbiAgICAnYmVmb3JlYWN0aXZhdGUnLFxuICAgICdiZWZvcmVkZWFjdGl2YXRlJyxcbiAgICAnYmVmb3JlZWRpdGZvY3VzJyxcbiAgICAnYmVmb3JldXBkYXRlJyxcbiAgICAnY2VsbGNoYW5nZScsXG4gICAgJ2NvbnRyb2xzZWxlY3QnLFxuICAgICdkYXRhYXZhaWxhYmxlJyxcbiAgICAnZGF0YXNldGNoYW5nZWQnLFxuICAgICdkYXRhc2V0Y29tcGxldGUnLFxuICAgICdlcnJvcnVwZGF0ZScsXG4gICAgJ2ZpbHRlcmNoYW5nZScsXG4gICAgJ2xheW91dGNvbXBsZXRlJyxcbiAgICAnbG9zZWNhcHR1cmUnLFxuICAgICdtb3ZlJyxcbiAgICAnbW92ZWVuZCcsXG4gICAgJ21vdmVzdGFydCcsXG4gICAgJ3Byb3BlcnR5Y2hhbmdlJyxcbiAgICAncmVzaXplZW5kJyxcbiAgICAncmVzaXplc3RhcnQnLFxuICAgICdyb3dlbnRlcicsXG4gICAgJ3Jvd2V4aXQnLFxuICAgICdyb3dzZGVsZXRlJyxcbiAgICAncm93c2luc2VydGVkJyxcbiAgICAnY29tbWFuZCcsXG4gICAgJ2NvbXBhc3NuZWVkc2NhbGlicmF0aW9uJyxcbiAgICAnZGVhY3RpdmF0ZScsXG4gICAgJ2hlbHAnLFxuICAgICdtc2NvbnRlbnR6b29tJyxcbiAgICAnbXNtYW5pcHVsYXRpb25zdGF0ZWNoYW5nZWQnLFxuICAgICdtc2dlc3R1cmVjaGFuZ2UnLFxuICAgICdtc2dlc3R1cmVkb3VibGV0YXAnLFxuICAgICdtc2dlc3R1cmVlbmQnLFxuICAgICdtc2dlc3R1cmVob2xkJyxcbiAgICAnbXNnZXN0dXJlc3RhcnQnLFxuICAgICdtc2dlc3R1cmV0YXAnLFxuICAgICdtc2dvdHBvaW50ZXJjYXB0dXJlJyxcbiAgICAnbXNpbmVydGlhc3RhcnQnLFxuICAgICdtc2xvc3Rwb2ludGVyY2FwdHVyZScsXG4gICAgJ21zcG9pbnRlcmNhbmNlbCcsXG4gICAgJ21zcG9pbnRlcmRvd24nLFxuICAgICdtc3BvaW50ZXJlbnRlcicsXG4gICAgJ21zcG9pbnRlcmhvdmVyJyxcbiAgICAnbXNwb2ludGVybGVhdmUnLFxuICAgICdtc3BvaW50ZXJtb3ZlJyxcbiAgICAnbXNwb2ludGVyb3V0JyxcbiAgICAnbXNwb2ludGVyb3ZlcicsXG4gICAgJ21zcG9pbnRlcnVwJyxcbiAgICAncG9pbnRlcm91dCcsXG4gICAgJ21zc2l0ZW1vZGVqdW1wbGlzdGl0ZW1yZW1vdmVkJyxcbiAgICAnbXN0aHVtYm5haWxjbGljaycsXG4gICAgJ3N0b3AnLFxuICAgICdzdG9yYWdlY29tbWl0J1xuXTtcbnZhciB3ZWJnbEV2ZW50TmFtZXMgPSBbJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgJ3dlYmdsY29udGV4dGxvc3QnLCAnd2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciddO1xudmFyIGZvcm1FdmVudE5hbWVzID0gWydhdXRvY29tcGxldGUnLCAnYXV0b2NvbXBsZXRlZXJyb3InXTtcbnZhciBkZXRhaWxFdmVudE5hbWVzID0gWyd0b2dnbGUnXTtcbnZhciBmcmFtZUV2ZW50TmFtZXMgPSBbJ2xvYWQnXTtcbnZhciBmcmFtZVNldEV2ZW50TmFtZXMgPSBbJ2JsdXInLCAnZXJyb3InLCAnZm9jdXMnLCAnbG9hZCcsICdyZXNpemUnLCAnc2Nyb2xsJywgJ21lc3NhZ2VlcnJvciddO1xudmFyIG1hcnF1ZWVFdmVudE5hbWVzID0gWydib3VuY2UnLCAnZmluaXNoJywgJ3N0YXJ0J107XG52YXIgWE1MSHR0cFJlcXVlc3RFdmVudE5hbWVzID0gW1xuICAgICdsb2Fkc3RhcnQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnLCAnZXJyb3InLCAnbG9hZCcsICdwcm9ncmVzcycsICd0aW1lb3V0JywgJ2xvYWRlbmQnLFxuICAgICdyZWFkeXN0YXRlY2hhbmdlJ1xuXTtcbnZhciBJREJJbmRleEV2ZW50TmFtZXMgPSBbJ3VwZ3JhZGVuZWVkZWQnLCAnY29tcGxldGUnLCAnYWJvcnQnLCAnc3VjY2VzcycsICdlcnJvcicsICdibG9ja2VkJywgJ3ZlcnNpb25jaGFuZ2UnLCAnY2xvc2UnXTtcbnZhciB3ZWJzb2NrZXRFdmVudE5hbWVzID0gWydjbG9zZScsICdlcnJvcicsICdvcGVuJywgJ21lc3NhZ2UnXTtcbnZhciB3b3JrZXJFdmVudE5hbWVzID0gWydlcnJvcicsICdtZXNzYWdlJ107XG52YXIgZXZlbnROYW1lcyA9IGdsb2JhbEV2ZW50SGFuZGxlcnNFdmVudE5hbWVzLmNvbmNhdCh3ZWJnbEV2ZW50TmFtZXMsIGZvcm1FdmVudE5hbWVzLCBkZXRhaWxFdmVudE5hbWVzLCBkb2N1bWVudEV2ZW50TmFtZXMsIHdpbmRvd0V2ZW50TmFtZXMsIGh0bWxFbGVtZW50RXZlbnROYW1lcywgaWVFbGVtZW50RXZlbnROYW1lcyk7XG5mdW5jdGlvbiBmaWx0ZXJQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzIHx8IGlnbm9yZVByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvblByb3BlcnRpZXM7XG4gICAgfVxuICAgIHZhciB0aXAgPSBpZ25vcmVQcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAoaXApIHsgcmV0dXJuIGlwLnRhcmdldCA9PT0gdGFyZ2V0OyB9KTtcbiAgICBpZiAoIXRpcCB8fCB0aXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvblByb3BlcnRpZXM7XG4gICAgfVxuICAgIHZhciB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzID0gdGlwWzBdLmlnbm9yZVByb3BlcnRpZXM7XG4gICAgcmV0dXJuIG9uUHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24gKG9wKSB7IHJldHVybiB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzLmluZGV4T2Yob3ApID09PSAtMTsgfSk7XG59XG5mdW5jdGlvbiBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcywgcHJvdG90eXBlKSB7XG4gICAgLy8gY2hlY2sgd2hldGhlciB0YXJnZXQgaXMgYXZhaWxhYmxlLCBzb21ldGltZXMgdGFyZ2V0IHdpbGwgYmUgdW5kZWZpbmVkXG4gICAgLy8gYmVjYXVzZSBkaWZmZXJlbnQgYnJvd3NlciBvciBzb21lIDNyZCBwYXJ0eSBwbHVnaW4uXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgcGF0Y2hPblByb3BlcnRpZXModGFyZ2V0LCBmaWx0ZXJlZFByb3BlcnRpZXMsIHByb3RvdHlwZSk7XG59XG5mdW5jdGlvbiBwcm9wZXJ0eURlc2NyaXB0b3JQYXRjaChhcGksIF9nbG9iYWwpIHtcbiAgICBpZiAoaXNOb2RlICYmICFpc01peCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRzJyldKSB7XG4gICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBzdXBwb3J0c1dlYlNvY2tldCA9IHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnO1xuICAgIHZhciBpZ25vcmVQcm9wZXJ0aWVzID0gX2dsb2JhbFsnX19ab25lX2lnbm9yZV9vbl9wcm9wZXJ0aWVzJ107XG4gICAgLy8gZm9yIGJyb3dzZXJzIHRoYXQgd2UgY2FuIHBhdGNoIHRoZSBkZXNjcmlwdG9yOiAgQ2hyb21lICYgRmlyZWZveFxuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgICAgdmFyIGludGVybmFsV2luZG93ID0gd2luZG93O1xuICAgICAgICB2YXIgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gaXNJRSA/IFt7IHRhcmdldDogaW50ZXJuYWxXaW5kb3csIGlnbm9yZVByb3BlcnRpZXM6IFsnZXJyb3InXSB9XSA6IFtdO1xuICAgICAgICAvLyBpbiBJRS9FZGdlLCBvblByb3Agbm90IGV4aXN0IGluIHdpbmRvdyBvYmplY3QsIGJ1dCBpbiBXaW5kb3dQcm90b3R5cGVcbiAgICAgICAgLy8gc28gd2UgbmVlZCB0byBwYXNzIFdpbmRvd1Byb3RvdHlwZSB0byBjaGVjayBvblByb3AgZXhpc3Qgb3Igbm90XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKGludGVybmFsV2luZG93LCBldmVudE5hbWVzLmNvbmNhdChbJ21lc3NhZ2VlcnJvciddKSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhEb2N1bWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgICAgICBpZiAodHlwZW9mIGludGVybmFsV2luZG93WydTVkdFbGVtZW50J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvd1snU1ZHRWxlbWVudCddLnByb3RvdHlwZSwgZXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoRWxlbWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MRWxlbWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSwgbWVkaWFFbGVtZW50RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKEhUTUxGcmFtZVNldEVsZW1lbnQucHJvdG90eXBlLCB3aW5kb3dFdmVudE5hbWVzLmNvbmNhdChmcmFtZVNldEV2ZW50TmFtZXMpLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTEJvZHlFbGVtZW50LnByb3RvdHlwZSwgd2luZG93RXZlbnROYW1lcy5jb25jYXQoZnJhbWVTZXRFdmVudE5hbWVzKSwgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKEhUTUxGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBmcmFtZUV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIGZyYW1lRXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIHZhciBIVE1MTWFycXVlZUVsZW1lbnRfMSA9IGludGVybmFsV2luZG93WydIVE1MTWFycXVlZUVsZW1lbnQnXTtcbiAgICAgICAgaWYgKEhUTUxNYXJxdWVlRWxlbWVudF8xKSB7XG4gICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MTWFycXVlZUVsZW1lbnRfMS5wcm90b3R5cGUsIG1hcnF1ZWVFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgV29ya2VyXzEgPSBpbnRlcm5hbFdpbmRvd1snV29ya2VyJ107XG4gICAgICAgIGlmIChXb3JrZXJfMSkge1xuICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoV29ya2VyXzEucHJvdG90eXBlLCB3b3JrZXJFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSBfZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddO1xuICAgIGlmIChYTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIFNlcnZpY2VXb3JrZXIsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZVxuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUsIFhNTEh0dHBSZXF1ZXN0RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgfVxuICAgIHZhciBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gX2dsb2JhbFsnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddO1xuICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUsIFhNTEh0dHBSZXF1ZXN0RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgSURCSW5kZXggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQkluZGV4LnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCUmVxdWVzdC5wcm90b3R5cGUsIElEQkluZGV4RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQk9wZW5EQlJlcXVlc3QucHJvdG90eXBlLCBJREJJbmRleEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhJREJEYXRhYmFzZS5wcm90b3R5cGUsIElEQkluZGV4RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQlRyYW5zYWN0aW9uLnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCQ3Vyc29yLnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnRzV2ViU29ja2V0KSB7XG4gICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKFdlYlNvY2tldC5wcm90b3R5cGUsIHdlYnNvY2tldEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuWm9uZS5fX2xvYWRfcGF0Y2goJ3V0aWwnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHtcbiAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMgPSBwYXRjaE9uUHJvcGVydGllcztcbiAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcbiAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7XG4gICAgYXBpLnBhdGNoTWFjcm9UYXNrID0gcGF0Y2hNYWNyb1Rhc2s7XG4gICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgdG9cbiAgICAvLyBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLlxuICAgIC8vIEluIG5ld2VyIHZlcnNpb24gKD49MC45LjApLCB3ZSBjaGFuZ2UgdGhlIGVudiBuYW1lIHRvIGBfX3pvbmVfc3ltYm9sX19VTlBBVENIRURfRVZFTlRTYCB0byBrZWVwXG4gICAgLy8gdGhlIG5hbWUgY29uc2lzdGVudCB3aXRoIGFuZ3VsYXIgcmVwby5cbiAgICAvLyBUaGUgIGBfX3pvbmVfc3ltYm9sX19CTEFDS19MSVNURURfRVZFTlRTYCBpcyBkZXByZWNhdGVkLCBidXQgaXQgaXMgc3RpbGwgYmUgc3VwcG9ydGVkIGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHZhciBTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpO1xuICAgIHZhciBTWU1CT0xfVU5QQVRDSEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnVU5QQVRDSEVEX0VWRU5UUycpO1xuICAgIGlmIChnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdKSB7XG4gICAgICAgIGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU10gPSBnbG9iYWxbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSkge1xuICAgICAgICBab25lW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IFpvbmVbU1lNQk9MX1VOUEFUQ0hFRF9FVkVOVFNdID1cbiAgICAgICAgICAgIGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU107XG4gICAgfVxuICAgIGFwaS5wYXRjaEV2ZW50UHJvdG90eXBlID0gcGF0Y2hFdmVudFByb3RvdHlwZTtcbiAgICBhcGkucGF0Y2hFdmVudFRhcmdldCA9IHBhdGNoRXZlbnRUYXJnZXQ7XG4gICAgYXBpLmlzSUVPckVkZ2UgPSBpc0lFT3JFZGdlO1xuICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eSA9IE9iamVjdERlZmluZVByb3BlcnR5O1xuICAgIGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgYXBpLk9iamVjdENyZWF0ZSA9IE9iamVjdENyZWF0ZTtcbiAgICBhcGkuQXJyYXlTbGljZSA9IEFycmF5U2xpY2U7XG4gICAgYXBpLnBhdGNoQ2xhc3MgPSBwYXRjaENsYXNzO1xuICAgIGFwaS53cmFwV2l0aEN1cnJlbnRab25lID0gd3JhcFdpdGhDdXJyZW50Wm9uZTtcbiAgICBhcGkuZmlsdGVyUHJvcGVydGllcyA9IGZpbHRlclByb3BlcnRpZXM7XG4gICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCA9IGF0dGFjaE9yaWdpblRvUGF0Y2hlZDtcbiAgICBhcGkuX3JlZGVmaW5lUHJvcGVydHkgPSBfcmVkZWZpbmVQcm9wZXJ0eTtcbiAgICBhcGkucGF0Y2hDYWxsYmFja3MgPSBwYXRjaENhbGxiYWNrcztcbiAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICh7XG4gICAgICAgIGdsb2JhbFNvdXJjZXM6IGdsb2JhbFNvdXJjZXMsXG4gICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzOiB6b25lU3ltYm9sRXZlbnROYW1lcyQxLFxuICAgICAgICBldmVudE5hbWVzOiBldmVudE5hbWVzLFxuICAgICAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlcixcbiAgICAgICAgaXNNaXg6IGlzTWl4LFxuICAgICAgICBpc05vZGU6IGlzTm9kZSxcbiAgICAgICAgVFJVRV9TVFI6IFRSVUVfU1RSLFxuICAgICAgICBGQUxTRV9TVFI6IEZBTFNFX1NUUixcbiAgICAgICAgWk9ORV9TWU1CT0xfUFJFRklYOiBaT05FX1NZTUJPTF9QUkVGSVgsXG4gICAgICAgIEFERF9FVkVOVF9MSVNURU5FUl9TVFI6IEFERF9FVkVOVF9MSVNURU5FUl9TVFIsXG4gICAgICAgIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI6IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFJcbiAgICB9KTsgfTtcbn0pO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIGV2ZW50VGFyZ2V0TGVnYWN5UGF0Y2goX2dsb2JhbCwgYXBpKSB7XG4gICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgZXZlbnROYW1lcyA9IF9hLmV2ZW50TmFtZXMsIGdsb2JhbFNvdXJjZXMgPSBfYS5nbG9iYWxTb3VyY2VzLCB6b25lU3ltYm9sRXZlbnROYW1lcyA9IF9hLnpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiA9IF9hLlRSVUVfU1RSLCBGQUxTRV9TVFIgPSBfYS5GQUxTRV9TVFIsIFpPTkVfU1lNQk9MX1BSRUZJWCA9IF9hLlpPTkVfU1lNQk9MX1BSRUZJWDtcbiAgICB2YXIgV1RGX0lTU1VFXzU1NSA9ICdBbmNob3IsQXJlYSxBdWRpbyxCUixCYXNlLEJhc2VGb250LEJvZHksQnV0dG9uLENhbnZhcyxDb250ZW50LERMaXN0LERpcmVjdG9yeSxEaXYsRW1iZWQsRmllbGRTZXQsRm9udCxGb3JtLEZyYW1lLEZyYW1lU2V0LEhSLEhlYWQsSGVhZGluZyxIdG1sLElGcmFtZSxJbWFnZSxJbnB1dCxLZXlnZW4sTEksTGFiZWwsTGVnZW5kLExpbmssTWFwLE1hcnF1ZWUsTWVkaWEsTWVudSxNZXRhLE1ldGVyLE1vZCxPTGlzdCxPYmplY3QsT3B0R3JvdXAsT3B0aW9uLE91dHB1dCxQYXJhZ3JhcGgsUHJlLFByb2dyZXNzLFF1b3RlLFNjcmlwdCxTZWxlY3QsU291cmNlLFNwYW4sU3R5bGUsVGFibGVDYXB0aW9uLFRhYmxlQ2VsbCxUYWJsZUNvbCxUYWJsZSxUYWJsZVJvdyxUYWJsZVNlY3Rpb24sVGV4dEFyZWEsVGl0bGUsVHJhY2ssVUxpc3QsVW5rbm93bixWaWRlbyc7XG4gICAgdmFyIE5PX0VWRU5UX1RBUkdFVCA9ICdBcHBsaWNhdGlvbkNhY2hlLEV2ZW50U291cmNlLEZpbGVSZWFkZXIsSW5wdXRNZXRob2RDb250ZXh0LE1lZGlhQ29udHJvbGxlcixNZXNzYWdlUG9ydCxOb2RlLFBlcmZvcm1hbmNlLFNWR0VsZW1lbnRJbnN0YW5jZSxTaGFyZWRXb3JrZXIsVGV4dFRyYWNrLFRleHRUcmFja0N1ZSxUZXh0VHJhY2tMaXN0LFdlYktpdE5hbWVkRmxvdyxXaW5kb3csV29ya2VyLFdvcmtlckdsb2JhbFNjb3BlLFhNTEh0dHBSZXF1ZXN0LFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsWE1MSHR0cFJlcXVlc3RVcGxvYWQsSURCUmVxdWVzdCxJREJPcGVuREJSZXF1ZXN0LElEQkRhdGFiYXNlLElEQlRyYW5zYWN0aW9uLElEQkN1cnNvcixEQkluZGV4LFdlYlNvY2tldCdcbiAgICAgICAgLnNwbGl0KCcsJyk7XG4gICAgdmFyIEVWRU5UX1RBUkdFVCA9ICdFdmVudFRhcmdldCc7XG4gICAgdmFyIGFwaXMgPSBbXTtcbiAgICB2YXIgaXNXdGYgPSBfZ2xvYmFsWyd3dGYnXTtcbiAgICB2YXIgV1RGX0lTU1VFXzU1NV9BUlJBWSA9IFdURl9JU1NVRV81NTUuc3BsaXQoJywnKTtcbiAgICBpZiAoaXNXdGYpIHtcbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3I6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvdHJhY2luZy1mcmFtZXdvcmsvaXNzdWVzLzU1NVxuICAgICAgICBhcGlzID0gV1RGX0lTU1VFXzU1NV9BUlJBWS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuICdIVE1MJyArIHYgKyAnRWxlbWVudCc7IH0pLmNvbmNhdChOT19FVkVOVF9UQVJHRVQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChfZ2xvYmFsW0VWRU5UX1RBUkdFVF0pIHtcbiAgICAgICAgYXBpcy5wdXNoKEVWRU5UX1RBUkdFVCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBOb3RlOiBFdmVudFRhcmdldCBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBicm93c2VycyxcbiAgICAgICAgLy8gaWYgaXQncyBub3QgYXZhaWxhYmxlLCB3ZSBpbnN0ZWFkIHBhdGNoIHRoZSBBUElzIGluIHRoZSBJREwgdGhhdCBpbmhlcml0IGZyb20gRXZlbnRUYXJnZXRcbiAgICAgICAgYXBpcyA9IE5PX0VWRU5UX1RBUkdFVDtcbiAgICB9XG4gICAgdmFyIGlzRGlzYWJsZUlFQ2hlY2sgPSBfZ2xvYmFsWydfX1pvbmVfZGlzYWJsZV9JRV9jaGVjayddIHx8IGZhbHNlO1xuICAgIHZhciBpc0VuYWJsZUNyb3NzQ29udGV4dENoZWNrID0gX2dsb2JhbFsnX19ab25lX2VuYWJsZV9jcm9zc19jb250ZXh0X2NoZWNrJ10gfHwgZmFsc2U7XG4gICAgdmFyIGllT3JFZGdlID0gYXBpLmlzSUVPckVkZ2UoKTtcbiAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuYWRkRXZlbnRMaXN0ZW5lcjonO1xuICAgIHZhciBGVU5DVElPTl9XUkFQUEVSID0gJ1tvYmplY3QgRnVuY3Rpb25XcmFwcGVyXSc7XG4gICAgdmFyIEJST1dTRVJfVE9PTFMgPSAnZnVuY3Rpb24gX19CUk9XU0VSVE9PTFNfQ09OU09MRV9TQUZFRlVOQygpIHsgW25hdGl2ZSBjb2RlXSB9JztcbiAgICAvLyAgcHJlZGVmaW5lIGFsbCBfX3pvbmVfc3ltYm9sX18gKyBldmVudE5hbWUgKyB0cnVlL2ZhbHNlIHN0cmluZ1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTtcbiAgICAgICAgdmFyIGZhbHNlRXZlbnROYW1lID0gZXZlbnROYW1lICsgRkFMU0VfU1RSO1xuICAgICAgICB2YXIgdHJ1ZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIFRSVUVfU1RSO1xuICAgICAgICB2YXIgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7XG4gICAgICAgIHZhciBzeW1ib2xDYXB0dXJlID0gWk9ORV9TWU1CT0xfUFJFRklYICsgdHJ1ZUV2ZW50TmFtZTtcbiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG4gICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bVFJVRV9TVFJdID0gc3ltYm9sQ2FwdHVyZTtcbiAgICB9XG4gICAgLy8gIHByZWRlZmluZSBhbGwgdGFzay5zb3VyY2Ugc3RyaW5nXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBXVEZfSVNTVUVfNTU1Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBXVEZfSVNTVUVfNTU1X0FSUkFZW2ldO1xuICAgICAgICB2YXIgdGFyZ2V0cyA9IGdsb2JhbFNvdXJjZXNbdGFyZ2V0XSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGV2ZW50TmFtZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBldmVudE5hbWVzW2pdO1xuICAgICAgICAgICAgdGFyZ2V0c1tldmVudE5hbWVdID0gdGFyZ2V0ICsgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSArIGV2ZW50TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2hlY2tJRUFuZENyb3NzQ29udGV4dCA9IGZ1bmN0aW9uIChuYXRpdmVEZWxlZ2F0ZSwgZGVsZWdhdGUsIHRhcmdldCwgYXJncykge1xuICAgICAgICBpZiAoIWlzRGlzYWJsZUlFQ2hlY2sgJiYgaWVPckVkZ2UpIHtcbiAgICAgICAgICAgIGlmIChpc0VuYWJsZUNyb3NzQ29udGV4dENoZWNrKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3RTdHJpbmcgPSBkZWxlZ2F0ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRlc3RTdHJpbmcgPT09IEZVTkNUSU9OX1dSQVBQRVIgfHwgdGVzdFN0cmluZyA9PSBCUk9XU0VSX1RPT0xTKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVsZWdhdGUuYXBwbHkodGFyZ2V0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVsZWdhdGUuYXBwbHkodGFyZ2V0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB0ZXN0U3RyaW5nID0gZGVsZWdhdGUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRlc3RTdHJpbmcgPT09IEZVTkNUSU9OX1dSQVBQRVIgfHwgdGVzdFN0cmluZyA9PSBCUk9XU0VSX1RPT0xTKSkge1xuICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzRW5hYmxlQ3Jvc3NDb250ZXh0Q2hlY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVsZWdhdGUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG5hdGl2ZURlbGVnYXRlLmFwcGx5KHRhcmdldCwgYXJncyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgdmFyIGFwaVR5cGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB0eXBlID0gX2dsb2JhbFthcGlzW2ldXTtcbiAgICAgICAgYXBpVHlwZXMucHVzaCh0eXBlICYmIHR5cGUucHJvdG90eXBlKTtcbiAgICB9XG4gICAgLy8gdmggaXMgdmFsaWRhdGVIYW5kbGVyIHRvIGNoZWNrIGV2ZW50IGhhbmRsZXJcbiAgICAvLyBpcyB2YWxpZCBvciBub3QoZm9yIHNlY3VyaXR5IGNoZWNrKVxuICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaVR5cGVzLCB7IHZoOiBjaGVja0lFQW5kQ3Jvc3NDb250ZXh0IH0pO1xuICAgIFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSA9ICEhX2dsb2JhbFtFVkVOVF9UQVJHRVRdO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyB3ZSBoYXZlIHRvIHBhdGNoIHRoZSBpbnN0YW5jZSBzaW5jZSB0aGUgcHJvdG8gaXMgbm9uLWNvbmZpZ3VyYWJsZVxuZnVuY3Rpb24gYXBwbHkoYXBpLCBfZ2xvYmFsKSB7XG4gICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgQUREX0VWRU5UX0xJU1RFTkVSX1NUUiA9IF9hLkFERF9FVkVOVF9MSVNURU5FUl9TVFIsIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIgPSBfYS5SRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSO1xuICAgIHZhciBXUyA9IF9nbG9iYWwuV2ViU29ja2V0O1xuICAgIC8vIE9uIFNhZmFyaSB3aW5kb3cuRXZlbnRUYXJnZXQgZG9lc24ndCBleGlzdCBzbyBuZWVkIHRvIHBhdGNoIFdTIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyXG4gICAgLy8gT24gb2xkZXIgQ2hyb21lLCBubyBuZWVkIHNpbmNlIEV2ZW50VGFyZ2V0IHdhcyBhbHJlYWR5IHBhdGNoZWRcbiAgICBpZiAoIV9nbG9iYWwuRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgW1dTLnByb3RvdHlwZV0pO1xuICAgIH1cbiAgICBfZ2xvYmFsLldlYlNvY2tldCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIHZhciBzb2NrZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IG5ldyBXUyh4LCB5KSA6IG5ldyBXUyh4KTtcbiAgICAgICAgdmFyIHByb3h5U29ja2V0O1xuICAgICAgICB2YXIgcHJveHlTb2NrZXRQcm90bztcbiAgICAgICAgLy8gU2FmYXJpIDcuMCBoYXMgbm9uLWNvbmZpZ3VyYWJsZSBvd24gJ29ubWVzc2FnZScgYW5kIGZyaWVuZHMgcHJvcGVydGllcyBvbiB0aGUgc29ja2V0IGluc3RhbmNlXG4gICAgICAgIHZhciBvbm1lc3NhZ2VEZXNjID0gYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb2NrZXQsICdvbm1lc3NhZ2UnKTtcbiAgICAgICAgaWYgKG9ubWVzc2FnZURlc2MgJiYgb25tZXNzYWdlRGVzYy5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcm94eVNvY2tldCA9IGFwaS5PYmplY3RDcmVhdGUoc29ja2V0KTtcbiAgICAgICAgICAgIC8vIHNvY2tldCBoYXZlIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yICdvbm9wZW4nLCAnb25tZXNzYWdlJywgJ29uY2xvc2UnLCAnb25lcnJvcidcbiAgICAgICAgICAgIC8vIGJ1dCBwcm94eVNvY2tldCBub3QsIHNvIHdlIHdpbGwga2VlcCBzb2NrZXQgYXMgcHJvdG90eXBlIGFuZCBwYXNzIGl0IHRvXG4gICAgICAgICAgICAvLyBwYXRjaE9uUHJvcGVydGllcyBtZXRob2RcbiAgICAgICAgICAgIHByb3h5U29ja2V0UHJvdG8gPSBzb2NrZXQ7XG4gICAgICAgICAgICBbQUREX0VWRU5UX0xJU1RFTkVSX1NUUiwgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiwgJ3NlbmQnLCAnY2xvc2UnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgIHByb3h5U29ja2V0W3Byb3BOYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcGkuQXJyYXlTbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gQUREX0VWRU5UX0xJU1RFTkVSX1NUUiB8fCBwcm9wTmFtZSA9PT0gUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5U3ltYm9sID0gWm9uZS5fX3N5bWJvbF9fKCdPTl9QUk9QRVJUWScgKyBldmVudE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldFtwcm9wZXJ0eVN5bWJvbF0gPSBwcm94eVNvY2tldFtwcm9wZXJ0eVN5bWJvbF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldFtwcm9wTmFtZV0uYXBwbHkoc29ja2V0LCBhcmdzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBjYW4gcGF0Y2ggdGhlIHJlYWwgc29ja2V0XG4gICAgICAgICAgICBwcm94eVNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgfVxuICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMocHJveHlTb2NrZXQsIFsnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZScsICdvcGVuJ10sIHByb3h5U29ja2V0UHJvdG8pO1xuICAgICAgICByZXR1cm4gcHJveHlTb2NrZXQ7XG4gICAgfTtcbiAgICB2YXIgZ2xvYmFsV2ViU29ja2V0ID0gX2dsb2JhbFsnV2ViU29ja2V0J107XG4gICAgZm9yICh2YXIgcHJvcCBpbiBXUykge1xuICAgICAgICBnbG9iYWxXZWJTb2NrZXRbcHJvcF0gPSBXU1twcm9wXTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuICovXG5mdW5jdGlvbiBwcm9wZXJ0eURlc2NyaXB0b3JMZWdhY3lQYXRjaChhcGksIF9nbG9iYWwpIHtcbiAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBpc05vZGUgPSBfYS5pc05vZGUsIGlzTWl4ID0gX2EuaXNNaXg7XG4gICAgaWYgKGlzTm9kZSAmJiAhaXNNaXgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWNhblBhdGNoVmlhUHJvcGVydHlEZXNjcmlwdG9yKGFwaSwgX2dsb2JhbCkpIHtcbiAgICAgICAgdmFyIHN1cHBvcnRzV2ViU29ja2V0ID0gdHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIC8vIFNhZmFyaSwgQW5kcm9pZCBicm93c2VycyAoSmVsbHkgQmVhbilcbiAgICAgICAgcGF0Y2hWaWFDYXB0dXJpbmdBbGxUaGVFdmVudHMoYXBpKTtcbiAgICAgICAgYXBpLnBhdGNoQ2xhc3MoJ1hNTEh0dHBSZXF1ZXN0Jyk7XG4gICAgICAgIGlmIChzdXBwb3J0c1dlYlNvY2tldCkge1xuICAgICAgICAgICAgYXBwbHkoYXBpLCBfZ2xvYmFsKTtcbiAgICAgICAgfVxuICAgICAgICBab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRzJyldID0gdHJ1ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjYW5QYXRjaFZpYVByb3BlcnR5RGVzY3JpcHRvcihhcGksIF9nbG9iYWwpIHtcbiAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBpc0Jyb3dzZXIgPSBfYS5pc0Jyb3dzZXIsIGlzTWl4ID0gX2EuaXNNaXg7XG4gICAgaWYgKChpc0Jyb3dzZXIgfHwgaXNNaXgpICYmXG4gICAgICAgICFhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSwgJ29uY2xpY2snKSAmJlxuICAgICAgICB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gV2ViS2l0IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzQzNjRcbiAgICAgICAgLy8gSURMIGludGVyZmFjZSBhdHRyaWJ1dGVzIGFyZSBub3QgY29uZmlndXJhYmxlXG4gICAgICAgIHZhciBkZXNjID0gYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwgJ29uY2xpY2snKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyB0cnkgdG8gdXNlIG9uY2xpY2sgdG8gZGV0ZWN0IHdoZXRoZXIgd2UgY2FuIHBhdGNoIHZpYSBwcm9wZXJ0eURlc2NyaXB0b3JcbiAgICAgICAgLy8gYmVjYXVzZSBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyXG4gICAgICAgIGlmIChkZXNjKSB7XG4gICAgICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsICdvbmNsaWNrJywge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAhIWRpdi5vbmNsaWNrO1xuICAgICAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCAnb25jbGljaycsIGRlc2MpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSBfZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddO1xuICAgIGlmICghWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgLy8gWE1MSHR0cFJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZSBpbiBzZXJ2aWNlIHdvcmtlclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBPTl9SRUFEWV9TVEFURV9DSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbiAgICB2YXIgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG4gICAgdmFyIHhockRlc2MgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCBPTl9SRUFEWV9TVEFURV9DSEFOR0UpO1xuICAgIC8vIGFkZCBlbnVtZXJhYmxlIGFuZCBjb25maWd1cmFibGUgaGVyZSBiZWNhdXNlIGluIG9wZXJhXG4gICAgLy8gYnkgZGVmYXVsdCBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub25yZWFkeXN0YXRlY2hhbmdlIGlzIHVuZGVmaW5lZFxuICAgIC8vIHdpdGhvdXQgYWRkaW5nIGVudW1lcmFibGUgYW5kIGNvbmZpZ3VyYWJsZSB3aWxsIGNhdXNlIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAgIC8vIG5vbi1jb25maWd1cmFibGVcbiAgICAvLyBhbmQgaWYgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9ucmVhZHlzdGF0ZWNoYW5nZSBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHNldCBhIHJlYWwgZGVzYyBpbnN0ZWFkIGEgZmFrZSBvbmVcbiAgICBpZiAoeGhyRGVzYykge1xuICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsIE9OX1JFQURZX1NUQVRFX0NIQU5HRSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gISFyZXEub25yZWFkeXN0YXRlY2hhbmdlO1xuICAgICAgICAvLyByZXN0b3JlIG9yaWdpbmFsIGRlc2NcbiAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCBPTl9SRUFEWV9TVEFURV9DSEFOR0UsIHhockRlc2MgfHwge30pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdmFyIFNZTUJPTF9GQUtFX09OUkVBRFlTVEFURUNIQU5HRV8xID0gYXBpLnN5bWJvbCgnZmFrZScpO1xuICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsIE9OX1JFQURZX1NUQVRFX0NIQU5HRSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW1NZTUJPTF9GQUtFX09OUkVBRFlTVEFURUNIQU5HRV8xXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXNbU1lNQk9MX0ZBS0VfT05SRUFEWVNUQVRFQ0hBTkdFXzFdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHZhciBkZXRlY3RGdW5jID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZGV0ZWN0RnVuYztcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlcVtTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMV0gPT09IGRldGVjdEZ1bmM7XG4gICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8vIFdoZW5ldmVyIGFueSBldmVudExpc3RlbmVyIGZpcmVzLCB3ZSBjaGVjayB0aGUgZXZlbnRMaXN0ZW5lciB0YXJnZXQgYW5kIGFsbCBwYXJlbnRzXG4vLyBmb3IgYG9ud2hhdGV2ZXJgIHByb3BlcnRpZXMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHpvbmUtYm91bmQgZnVuY3Rpb25zXG4vLyAtIENocm9tZSAoZm9yIG5vdylcbmZ1bmN0aW9uIHBhdGNoVmlhQ2FwdHVyaW5nQWxsVGhlRXZlbnRzKGFwaSkge1xuICAgIHZhciBldmVudE5hbWVzID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKS5ldmVudE5hbWVzO1xuICAgIHZhciB1bmJvdW5kS2V5ID0gYXBpLnN5bWJvbCgndW5ib3VuZCcpO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgdmFyIHByb3BlcnR5ID0gZXZlbnROYW1lc1tpXTtcbiAgICAgICAgdmFyIG9ucHJvcGVydHkgPSAnb24nICsgcHJvcGVydHk7XG4gICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcihwcm9wZXJ0eSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB2YXIgZWx0ID0gZXZlbnQudGFyZ2V0LCBib3VuZCwgc291cmNlO1xuICAgICAgICAgICAgaWYgKGVsdCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9IGVsdC5jb25zdHJ1Y3RvclsnbmFtZSddICsgJy4nICsgb25wcm9wZXJ0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdXJjZSA9ICd1bmtub3duLicgKyBvbnByb3BlcnR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGVsdCkge1xuICAgICAgICAgICAgICAgIGlmIChlbHRbb25wcm9wZXJ0eV0gJiYgIWVsdFtvbnByb3BlcnR5XVt1bmJvdW5kS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBib3VuZCA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKGVsdFtvbnByb3BlcnR5XSwgc291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgYm91bmRbdW5ib3VuZEtleV0gPSBlbHRbb25wcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgICAgIGVsdFtvbnByb3BlcnR5XSA9IGJvdW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRWxlbWVudFBhdGNoKF9nbG9iYWwsIGFwaSkge1xuICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIGlzQnJvd3NlciA9IF9hLmlzQnJvd3NlciwgaXNNaXggPSBfYS5pc01peDtcbiAgICBpZiAoKCFpc0Jyb3dzZXIgJiYgIWlzTWl4KSB8fCAhKCdyZWdpc3RlckVsZW1lbnQnIGluIF9nbG9iYWwuZG9jdW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNhbGxiYWNrcyA9IFsnY3JlYXRlZENhbGxiYWNrJywgJ2F0dGFjaGVkQ2FsbGJhY2snLCAnZGV0YWNoZWRDYWxsYmFjaycsICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snXTtcbiAgICBhcGkucGF0Y2hDYWxsYmFja3MoYXBpLCBkb2N1bWVudCwgJ0RvY3VtZW50JywgJ3JlZ2lzdGVyRWxlbWVudCcsIGNhbGxiYWNrcyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuKGZ1bmN0aW9uIChfZ2xvYmFsKSB7XG4gICAgX2dsb2JhbFsnX196b25lX3N5bWJvbF9fbGVnYWN5UGF0Y2gnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIFpvbmUgPSBfZ2xvYmFsWydab25lJ107XG4gICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdyZWdpc3RlckVsZW1lbnQnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHtcbiAgICAgICAgICAgIHJlZ2lzdGVyRWxlbWVudFBhdGNoKGdsb2JhbCwgYXBpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldExlZ2FjeScsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkge1xuICAgICAgICAgICAgZXZlbnRUYXJnZXRMZWdhY3lQYXRjaChnbG9iYWwsIGFwaSk7XG4gICAgICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JMZWdhY3lQYXRjaChhcGksIGdsb2JhbCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59KSh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgfHwgdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgfHwgZ2xvYmFsKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3XG4gKiBAc3VwcHJlc3Mge21pc3NpbmdSZXF1aXJlfVxuICovXG52YXIgdGFza1N5bWJvbCA9IHpvbmVTeW1ib2woJ3pvbmVUYXNrJyk7XG5mdW5jdGlvbiBwYXRjaFRpbWVyKHdpbmRvdywgc2V0TmFtZSwgY2FuY2VsTmFtZSwgbmFtZVN1ZmZpeCkge1xuICAgIHZhciBzZXROYXRpdmUgPSBudWxsO1xuICAgIHZhciBjbGVhck5hdGl2ZSA9IG51bGw7XG4gICAgc2V0TmFtZSArPSBuYW1lU3VmZml4O1xuICAgIGNhbmNlbE5hbWUgKz0gbmFtZVN1ZmZpeDtcbiAgICB2YXIgdGFza3NCeUhhbmRsZUlkID0ge307XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7XG4gICAgICAgIGZ1bmN0aW9uIHRpbWVyKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0YXNrLmludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gaXNzdWUtOTM0LCB0YXNrIHdpbGwgYmUgY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpdCBpcyBhIHBlcmlvZGljIHRhc2sgc3VjaCBhc1xuICAgICAgICAgICAgICAgIC8vIHNldEludGVydmFsXG4gICAgICAgICAgICAgICAgaWYgKCEodGFzay5kYXRhICYmIHRhc2suZGF0YS5pc1BlcmlvZGljKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaGFuZGxlSWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub24tbm9kZWpzIGVudiwgd2UgcmVtb3ZlIHRpbWVySWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gbG9jYWwgY2FjaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbZGF0YS5oYW5kbGVJZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS5oYW5kbGVJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSB0YXNrIHJlZmVyZW5jZSBmcm9tIHRpbWVyIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5oYW5kbGVJZFt0YXNrU3ltYm9sXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5hcmdzWzBdID0gdGltZXI7XG4gICAgICAgIGRhdGEuaGFuZGxlSWQgPSBzZXROYXRpdmUuYXBwbHkod2luZG93LCBkYXRhLmFyZ3MpO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcbiAgICAgICAgcmV0dXJuIGNsZWFyTmF0aXZlKHRhc2suZGF0YS5oYW5kbGVJZCk7XG4gICAgfVxuICAgIHNldE5hdGl2ZSA9XG4gICAgICAgIHBhdGNoTWV0aG9kKHdpbmRvdywgc2V0TmFtZSwgZnVuY3Rpb24gKGRlbGVnYXRlKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcsXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5OiAobmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcpID8gYXJnc1sxXSB8fCAwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShzZXROYW1lLCBhcmdzWzBdLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOb2RlLmpzIG11c3QgYWRkaXRpb25hbGx5IHN1cHBvcnQgdGhlIHJlZiBhbmQgdW5yZWYgZnVuY3Rpb25zLlxuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0YXNrLmRhdGEuaGFuZGxlSWQ7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBub24gbm9kZWpzIGVudiwgd2Ugc2F2ZSBoYW5kbGVJZDogdGFza1xuICAgICAgICAgICAgICAgICAgICAvLyBtYXBwaW5nIGluIGxvY2FsIGNhY2hlIGZvciBjbGVhclRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgdGFza3NCeUhhbmRsZUlkW2hhbmRsZV0gPSB0YXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vZGVqcyBlbnYsIHdlIHNhdmUgdGFza1xuICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaW4gdGltZXJJZCBPYmplY3QgZm9yIGNsZWFyVGltZW91dFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVbdGFza1N5bWJvbF0gPSB0YXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGhhbmRsZSBpcyBudWxsLCBiZWNhdXNlIHNvbWUgcG9seWZpbGwgb3IgYnJvd3NlclxuICAgICAgICAgICAgICAgIC8vIG1heSByZXR1cm4gdW5kZWZpbmVkIGZyb20gc2V0VGltZW91dC9zZXRJbnRlcnZhbC9zZXRJbW1lZGlhdGUvcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSAmJiBoYW5kbGUucmVmICYmIGhhbmRsZS51bnJlZiAmJiB0eXBlb2YgaGFuZGxlLnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2sucmVmID0gaGFuZGxlLnJlZi5iaW5kKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhc2sudW5yZWYgPSBoYW5kbGUudW5yZWYuYmluZChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZSA9PT0gJ251bWJlcicgfHwgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTsgfSk7XG4gICAgY2xlYXJOYXRpdmUgPVxuICAgICAgICBwYXRjaE1ldGhvZCh3aW5kb3csIGNhbmNlbE5hbWUsIGZ1bmN0aW9uIChkZWxlZ2F0ZSkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IGFyZ3NbMF07XG4gICAgICAgICAgICB2YXIgdGFzaztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9uIG5vZGVqcyBlbnYuXG4gICAgICAgICAgICAgICAgdGFzayA9IHRhc2tzQnlIYW5kbGVJZFtpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBub2RlanMgZW52LlxuICAgICAgICAgICAgICAgIHRhc2sgPSBpZCAmJiBpZFt0YXNrU3ltYm9sXTtcbiAgICAgICAgICAgICAgICAvLyBvdGhlciBlbnZpcm9ubWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2sgPSBpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFzayAmJiB0eXBlb2YgdGFzay50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSAnbm90U2NoZWR1bGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAodGFzay5jYW5jZWxGbiAmJiB0YXNrLmRhdGEuaXNQZXJpb2RpYyB8fCB0YXNrLnJ1bkNvdW50ID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVJZFtpZF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkW3Rhc2tTeW1ib2xdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgY2FuY2VsIGFscmVhZHkgY2FuY2VsZWQgZnVuY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNhdXNlIGFuIGVycm9yIGJ5IGNhbGxpbmcgaXQgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgZGVsZWdhdGUuYXBwbHkod2luZG93LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTsgfSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmZ1bmN0aW9uIHBhdGNoQ3VzdG9tRWxlbWVudHMoX2dsb2JhbCwgYXBpKSB7XG4gICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNCcm93c2VyID0gX2EuaXNCcm93c2VyLCBpc01peCA9IF9hLmlzTWl4O1xuICAgIGlmICgoIWlzQnJvd3NlciAmJiAhaXNNaXgpIHx8ICFfZ2xvYmFsWydjdXN0b21FbGVtZW50cyddIHx8ICEoJ2N1c3RvbUVsZW1lbnRzJyBpbiBfZ2xvYmFsKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjYWxsYmFja3MgPSBbJ2Nvbm5lY3RlZENhbGxiYWNrJywgJ2Rpc2Nvbm5lY3RlZENhbGxiYWNrJywgJ2Fkb3B0ZWRDYWxsYmFjaycsICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snXTtcbiAgICBhcGkucGF0Y2hDYWxsYmFja3MoYXBpLCBfZ2xvYmFsLmN1c3RvbUVsZW1lbnRzLCAnY3VzdG9tRWxlbWVudHMnLCAnZGVmaW5lJywgY2FsbGJhY2tzKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gZXZlbnRUYXJnZXRQYXRjaChfZ2xvYmFsLCBhcGkpIHtcbiAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50VGFyZ2V0JyldKSB7XG4gICAgICAgIC8vIEV2ZW50VGFyZ2V0IGlzIGFscmVhZHkgcGF0Y2hlZC5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBldmVudE5hbWVzID0gX2EuZXZlbnROYW1lcywgem9uZVN5bWJvbEV2ZW50TmFtZXMgPSBfYS56b25lU3ltYm9sRXZlbnROYW1lcywgVFJVRV9TVFIgPSBfYS5UUlVFX1NUUiwgRkFMU0VfU1RSID0gX2EuRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggPSBfYS5aT05FX1NZTUJPTF9QUkVGSVg7XG4gICAgLy8gIHByZWRlZmluZSBhbGwgX196b25lX3N5bWJvbF9fICsgZXZlbnROYW1lICsgdHJ1ZS9mYWxzZSBzdHJpbmdcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbaV07XG4gICAgICAgIHZhciBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjtcbiAgICAgICAgdmFyIHRydWVFdmVudE5hbWUgPSBldmVudE5hbWUgKyBUUlVFX1NUUjtcbiAgICAgICAgdmFyIHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG4gICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSB7fTtcbiAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXVtGQUxTRV9TVFJdID0gc3ltYm9sO1xuICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG4gICAgfVxuICAgIHZhciBFVkVOVF9UQVJHRVQgPSBfZ2xvYmFsWydFdmVudFRhcmdldCddO1xuICAgIGlmICghRVZFTlRfVEFSR0VUIHx8ICFFVkVOVF9UQVJHRVQucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgW0VWRU5UX1RBUkdFVCAmJiBFVkVOVF9UQVJHRVQucHJvdG90eXBlXSk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBwYXRjaEV2ZW50JDEoZ2xvYmFsLCBhcGkpIHtcbiAgICBhcGkucGF0Y2hFdmVudFByb3RvdHlwZShnbG9iYWwsIGFwaSk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cbiAqL1xuWm9uZS5fX2xvYWRfcGF0Y2goJ2xlZ2FjeScsIGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICB2YXIgbGVnYWN5UGF0Y2ggPSBnbG9iYWxbWm9uZS5fX3N5bWJvbF9fKCdsZWdhY3lQYXRjaCcpXTtcbiAgICBpZiAobGVnYWN5UGF0Y2gpIHtcbiAgICAgICAgbGVnYWN5UGF0Y2goKTtcbiAgICB9XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCd0aW1lcnMnLCBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgdmFyIHNldCA9ICdzZXQnO1xuICAgIHZhciBjbGVhciA9ICdjbGVhcic7XG4gICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdUaW1lb3V0Jyk7XG4gICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdJbnRlcnZhbCcpO1xuICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnbW96UmVxdWVzdCcsICdtb3pDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcbiAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ3dlYmtpdFJlcXVlc3QnLCAnd2Via2l0Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCdibG9ja2luZycsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUpIHtcbiAgICB2YXIgYmxvY2tpbmdNZXRob2RzID0gWydhbGVydCcsICdwcm9tcHQnLCAnY29uZmlybSddO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tpbmdNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBuYW1lXzEgPSBibG9ja2luZ01ldGhvZHNbaV07XG4gICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgbmFtZV8xLCBmdW5jdGlvbiAoZGVsZWdhdGUsIHN5bWJvbCwgbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5ydW4oZGVsZWdhdGUsIGdsb2JhbCwgYXJncywgbmFtZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkge1xuICAgIHBhdGNoRXZlbnQkMShnbG9iYWwsIGFwaSk7XG4gICAgZXZlbnRUYXJnZXRQYXRjaChnbG9iYWwsIGFwaSk7XG4gICAgLy8gcGF0Y2ggWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCdzIGFkZEV2ZW50TGlzdGVuZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgIHZhciBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gZ2xvYmFsWydYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0J107XG4gICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBbWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGVdKTtcbiAgICB9XG4gICAgcGF0Y2hDbGFzcygnTXV0YXRpb25PYnNlcnZlcicpO1xuICAgIHBhdGNoQ2xhc3MoJ1dlYktpdE11dGF0aW9uT2JzZXJ2ZXInKTtcbiAgICBwYXRjaENsYXNzKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicpO1xuICAgIHBhdGNoQ2xhc3MoJ0ZpbGVSZWFkZXInKTtcbn0pO1xuWm9uZS5fX2xvYWRfcGF0Y2goJ29uX3Byb3BlcnR5JywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7XG4gICAgcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBnbG9iYWwpO1xuICAgIHByb3BlcnR5UGF0Y2goKTtcbn0pO1xuWm9uZS5fX2xvYWRfcGF0Y2goJ2N1c3RvbUVsZW1lbnRzJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7XG4gICAgcGF0Y2hDdXN0b21FbGVtZW50cyhnbG9iYWwsIGFwaSk7XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCdYSFInLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lKSB7XG4gICAgLy8gVHJlYXQgWE1MSHR0cFJlcXVlc3QgYXMgYSBtYWNyb3Rhc2suXG4gICAgcGF0Y2hYSFIoZ2xvYmFsKTtcbiAgICB2YXIgWEhSX1RBU0sgPSB6b25lU3ltYm9sKCd4aHJUYXNrJyk7XG4gICAgdmFyIFhIUl9TWU5DID0gem9uZVN5bWJvbCgneGhyU3luYycpO1xuICAgIHZhciBYSFJfTElTVEVORVIgPSB6b25lU3ltYm9sKCd4aHJMaXN0ZW5lcicpO1xuICAgIHZhciBYSFJfU0NIRURVTEVEID0gem9uZVN5bWJvbCgneGhyU2NoZWR1bGVkJyk7XG4gICAgdmFyIFhIUl9VUkwgPSB6b25lU3ltYm9sKCd4aHJVUkwnKTtcbiAgICB2YXIgWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQgPSB6b25lU3ltYm9sKCd4aHJFcnJvckJlZm9yZVNjaGVkdWxlZCcpO1xuICAgIGZ1bmN0aW9uIHBhdGNoWEhSKHdpbmRvdykge1xuICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0J107XG4gICAgICAgIGlmICghWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUgaW4gc2VydmljZSB3b3JrZXJcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmRQZW5kaW5nVGFzayh0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgIHZhciBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHZhciBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0XzEgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnXTtcbiAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0XzEpIHtcbiAgICAgICAgICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZSA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRfMS5wcm90b3R5cGU7XG4gICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICAgICAgb3JpUmVtb3ZlTGlzdGVuZXIgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcbiAgICAgICAgdmFyIFNDSEVEVUxFRCA9ICdzY2hlZHVsZWQnO1xuICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZGF0YS50YXJnZXQ7XG4gICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSBmYWxzZTtcbiAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gdGFyZ2V0W1hIUl9MSVNURU5FUl07XG4gICAgICAgICAgICBpZiAoIW9yaUFkZExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIgPSB0YXJnZXRbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lciA9IHRhcmdldFtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpUmVtb3ZlTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5ld0xpc3RlbmVyID0gdGFyZ2V0W1hIUl9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5yZWFkeVN0YXRlID09PSB0YXJnZXQuRE9ORSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgb24gc29tZSBicm93c2VycyBYTUxIdHRwUmVxdWVzdCB3aWxsIGZpcmUgb25yZWFkeXN0YXRlY2hhbmdlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHlTdGF0ZT00IG11bHRpcGxlIHRpbWVzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRhc2sgc3RhdGUgaGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gJiYgdGFzay5zdGF0ZSA9PT0gU0NIRURVTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSB4aHIgaGFzIHJlZ2lzdGVyZWQgb25sb2FkIGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGUgdGFzayBzaG91bGQgaW52b2tlIGFmdGVyIGFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25sb2FkIGxpc3RlbmVycyBmaW5pc2guXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZFRhc2tzID0gdGFyZ2V0WydfX3pvbmVfc3ltYm9sX19sb2FkZmFsc2UnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkVGFza3MgJiYgbG9hZFRhc2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JpSW52b2tlXzEgPSB0YXNrLmludm9rZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBsb2FkIHRoZSB0YXNrcyBhZ2FpbiwgYmVjYXVzZSBpbiBvdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZFRhc2tzID0gdGFyZ2V0WydfX3pvbmVfc3ltYm9sX19sb2FkZmFsc2UnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2FkVGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkVGFza3NbaV0gPT09IHRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3Muc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpSW52b2tlXzEuY2FsbCh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnB1c2godGFzayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFkYXRhLmFib3J0ZWQgJiYgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igb2NjdXJzIHdoZW4geGhyLnNlbmQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbmV3TGlzdGVuZXIpO1xuICAgICAgICAgICAgdmFyIHN0b3JlZFRhc2sgPSB0YXJnZXRbWEhSX1RBU0tdO1xuICAgICAgICAgICAgaWYgKCFzdG9yZWRUYXNrKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9UQVNLXSA9IHRhc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZW5kTmF0aXZlLmFwcGx5KHRhcmdldCwgZGF0YS5hcmdzKTtcbiAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwbGFjZWhvbGRlckNhbGxiYWNrKCkgeyB9XG4gICAgICAgIGZ1bmN0aW9uIGNsZWFyVGFzayh0YXNrKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHRhc2suZGF0YTtcbiAgICAgICAgICAgIC8vIE5vdGUgLSBpZGVhbGx5LCB3ZSB3b3VsZCBjYWxsIGRhdGEudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgaGVyZSwgYnV0IGl0J3MgdG9vIGxhdGVcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgaXQgZnJvbSBmaXJpbmcuIFNvIGluc3RlYWQsIHdlIHN0b3JlIGluZm8gZm9yIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAgICAgIGRhdGEuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoZGF0YS50YXJnZXQsIGRhdGEuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9wZW5OYXRpdmUgPSBwYXRjaE1ldGhvZChYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgJ29wZW4nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09IGZhbHNlO1xuICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG4gICAgICAgICAgICByZXR1cm4gb3Blbk5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgfTsgfSk7XG4gICAgICAgIHZhciBYTUxIVFRQUkVRVUVTVF9TT1VSQ0UgPSAnWE1MSHR0cFJlcXVlc3Quc2VuZCc7XG4gICAgICAgIHZhciBmZXRjaFRhc2tBYm9ydGluZyA9IHpvbmVTeW1ib2woJ2ZldGNoVGFza0Fib3J0aW5nJyk7XG4gICAgICAgIHZhciBmZXRjaFRhc2tTY2hlZHVsaW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrU2NoZWR1bGluZycpO1xuICAgICAgICB2YXIgc2VuZE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnc2VuZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG4gICAgICAgICAgICBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza1NjaGVkdWxpbmddID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBmZXRjaCBpcyBzY2hlZHVsaW5nLCBzbyB3ZSBhcmUgdXNpbmcgeGhyIHRvIHBvbHlmaWxsIGZldGNoXG4gICAgICAgICAgICAgICAgLy8gYW5kIGJlY2F1c2Ugd2UgYWxyZWFkeSBzY2hlZHVsZSBtYWNyb1Rhc2sgZm9yIGZldGNoLCB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBub3Qgc2NoZWR1bGUgYSBtYWNyb1Rhc2sgZm9yIHhociBhZ2FpblxuICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGZbWEhSX1NZTkNdKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIFhIUiBpcyBzeW5jIHRoZXJlIGlzIG5vIHRhc2sgdG8gc2NoZWR1bGUsIGp1c3QgZXhlY3V0ZSB0aGUgY29kZS5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyB0YXJnZXQ6IHNlbGYsIHVybDogc2VsZltYSFJfVVJMXSwgaXNQZXJpb2RpYzogZmFsc2UsIGFyZ3M6IGFyZ3MsIGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShYTUxIVFRQUkVRVUVTVF9TT1VSQ0UsIHBsYWNlaG9sZGVyQ2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZiAmJiBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJiAhb3B0aW9ucy5hYm9ydGVkICYmXG4gICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGludm9rZSB0YXNrIGluc3RlYWQgb2YgbGVhdmluZyBhIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFza1xuICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTsgfSk7XG4gICAgICAgIHZhciBhYm9ydE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnYWJvcnQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSBmaW5kUGVuZGluZ1Rhc2soc2VsZik7XG4gICAgICAgICAgICBpZiAodGFzayAmJiB0eXBlb2YgdGFzay50eXBlID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQsIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgLy8gRml4ICM1NjksIGNhbGwgYWJvcnQgbXVsdGlwbGUgdGltZXMgYmVmb3JlIGRvbmUgd2lsbCBjYXVzZVxuICAgICAgICAgICAgICAgIC8vIG1hY3JvVGFzayB0YXNrIGNvdW50IGJlIG5lZ2F0aXZlIG51bWJlclxuICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbEZuID09IG51bGwgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuYWJvcnRlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKFpvbmUuY3VycmVudFtmZXRjaFRhc2tBYm9ydGluZ10gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgYWJvcnQgaXMgY2FsbGVkIGZyb20gZmV0Y2ggcG9seWZpbGwsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgYWJvcnQgb2YgWEhSLlxuICAgICAgICAgICAgICAgIHJldHVybiBhYm9ydE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRyeWluZyB0byBhYm9ydCBhbiBYSFIgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCBzbyB0aGVyZSBpcyBub1xuICAgICAgICAgICAgLy8gdGFza1xuICAgICAgICAgICAgLy8gdG8gY2FuY2VsLiBEbyBub3RoaW5nLlxuICAgICAgICB9OyB9KTtcbiAgICB9XG59KTtcblpvbmUuX19sb2FkX3BhdGNoKCdnZW9sb2NhdGlvbicsIGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAvLy8gR0VPX0xPQ0FUSU9OXG4gICAgaWYgKGdsb2JhbFsnbmF2aWdhdG9yJ10gJiYgZ2xvYmFsWyduYXZpZ2F0b3InXS5nZW9sb2NhdGlvbikge1xuICAgICAgICBwYXRjaFByb3RvdHlwZShnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uLCBbJ2dldEN1cnJlbnRQb3NpdGlvbicsICd3YXRjaFBvc2l0aW9uJ10pO1xuICAgIH1cbn0pO1xuWm9uZS5fX2xvYWRfcGF0Y2goJ1Byb21pc2VSZWplY3Rpb25FdmVudCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUpIHtcbiAgICAvLyBoYW5kbGUgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXG4gICAgZnVuY3Rpb24gZmluZFByb21pc2VSZWplY3Rpb25IYW5kbGVyKGV2dE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG4gICAgICAgICAgICBldmVudFRhc2tzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50VGFzaykge1xuICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgICAgICAgICAgdmFyIFByb21pc2VSZWplY3Rpb25FdmVudCA9IGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J107XG4gICAgICAgICAgICAgICAgaWYgKFByb21pc2VSZWplY3Rpb25FdmVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IFByb21pc2VSZWplY3Rpb25FdmVudChldnROYW1lLCB7IHByb21pc2U6IGUucHJvbWlzZSwgcmVhc29uOiBlLnJlamVjdGlvbiB9KTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXNrLmludm9rZShldnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXSkge1xuICAgICAgICBab25lW3pvbmVTeW1ib2woJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyldID1cbiAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigndW5oYW5kbGVkcmVqZWN0aW9uJyk7XG4gICAgICAgIFpvbmVbem9uZVN5bWJvbCgncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKV0gPVxuICAgICAgICAgICAgZmluZFByb21pc2VSZWplY3Rpb25IYW5kbGVyKCdyZWplY3Rpb25oYW5kbGVkJyk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxufSkpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHJlbmRlcjtcblxudmFyIF9oZWxwZXJzID0gcmVxdWlyZShcIi4vYW5ndWxhci9oZWxwZXJzXCIpO1xuXG5mdW5jdGlvbiByZW5kZXIoX3JlZikge1xuICB2YXIgc3RvcnlGbiA9IF9yZWYuc3RvcnlGbixcbiAgICAgIHNob3dNYWluID0gX3JlZi5zaG93TWFpbixcbiAgICAgIGZvcmNlUmVuZGVyID0gX3JlZi5mb3JjZVJlbmRlcjtcbiAgc2hvd01haW4oKTtcbiAgKDAsIF9oZWxwZXJzLnJlbmRlck5nQXBwKShzdG9yeUZuLCBmb3JjZVJlbmRlcik7XG59IiwiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7IE5nTW9kdWxlTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IG1vZHVsZU1ldGFkYXRhID0gKG1ldGFkYXRhOiBQYXJ0aWFsPE5nTW9kdWxlTWV0YWRhdGE+KSA9PiAoc3RvcnlGbjogKCkgPT4gYW55KSA9PiB7XG4gIGNvbnN0IHN0b3J5ID0gc3RvcnlGbigpO1xuICBjb25zdCBzdG9yeU1ldGFkYXRhID0gc3RvcnkubW9kdWxlTWV0YWRhdGEgfHwge307XG4gIG1ldGFkYXRhID0gbWV0YWRhdGEgfHwge307XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdG9yeSxcbiAgICBtb2R1bGVNZXRhZGF0YToge1xuICAgICAgZGVjbGFyYXRpb25zOiBbLi4uKG1ldGFkYXRhLmRlY2xhcmF0aW9ucyB8fCBbXSksIC4uLihzdG9yeU1ldGFkYXRhLmRlY2xhcmF0aW9ucyB8fCBbXSldLFxuICAgICAgZW50cnlDb21wb25lbnRzOiBbXG4gICAgICAgIC4uLihtZXRhZGF0YS5lbnRyeUNvbXBvbmVudHMgfHwgW10pLFxuICAgICAgICAuLi4oc3RvcnlNZXRhZGF0YS5lbnRyeUNvbXBvbmVudHMgfHwgW10pLFxuICAgICAgXSxcbiAgICAgIGltcG9ydHM6IFsuLi4obWV0YWRhdGEuaW1wb3J0cyB8fCBbXSksIC4uLihzdG9yeU1ldGFkYXRhLmltcG9ydHMgfHwgW10pXSxcbiAgICAgIHNjaGVtYXM6IFsuLi4obWV0YWRhdGEuc2NoZW1hcyB8fCBbXSksIC4uLihzdG9yeU1ldGFkYXRhLnNjaGVtYXMgfHwgW10pXSxcbiAgICAgIHByb3ZpZGVyczogWy4uLihtZXRhZGF0YS5wcm92aWRlcnMgfHwgW10pLCAuLi4oc3RvcnlNZXRhZGF0YS5wcm92aWRlcnMgfHwgW10pXSxcbiAgICB9LFxuICB9O1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaFwiKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9BY3Rpb25EaXNwbGF5ID0gcmVxdWlyZShcIi4vQWN0aW9uRGlzcGxheVwiKTtcblxuT2JqZWN0LmtleXMoX0FjdGlvbkRpc3BsYXkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9BY3Rpb25EaXNwbGF5W2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xuXG52YXIgX0FjdGlvbk9wdGlvbnMgPSByZXF1aXJlKFwiLi9BY3Rpb25PcHRpb25zXCIpO1xuXG5PYmplY3Qua2V5cyhfQWN0aW9uT3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX0FjdGlvbk9wdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbnZhciBfQWN0aW9uc01hcCA9IHJlcXVpcmUoXCIuL0FjdGlvbnNNYXBcIik7XG5cbk9iamVjdC5rZXlzKF9BY3Rpb25zTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIgfHwga2V5ID09PSBcIl9fZXNNb2R1bGVcIikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBfQWN0aW9uc01hcFtrZXldO1xuICAgIH1cbiAgfSk7XG59KTtcblxudmFyIF9EZWNvcmF0b3JGdW5jdGlvbiA9IHJlcXVpcmUoXCIuL0RlY29yYXRvckZ1bmN0aW9uXCIpO1xuXG5PYmplY3Qua2V5cyhfRGVjb3JhdG9yRnVuY3Rpb24pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9EZWNvcmF0b3JGdW5jdGlvbltrZXldO1xuICAgIH1cbiAgfSk7XG59KTtcblxudmFyIF9IYW5kbGVyRnVuY3Rpb24gPSByZXF1aXJlKFwiLi9IYW5kbGVyRnVuY3Rpb25cIik7XG5cbk9iamVjdC5rZXlzKF9IYW5kbGVyRnVuY3Rpb24pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9IYW5kbGVyRnVuY3Rpb25ba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZm9yLWVhY2hcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmRlZmluZS1wcm9wZXJ0eVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5c1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2FjdGlvbiA9IHJlcXVpcmUoXCIuL2FjdGlvblwiKTtcblxuT2JqZWN0LmtleXMoX2FjdGlvbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX2FjdGlvbltrZXldO1xuICAgIH1cbiAgfSk7XG59KTtcblxudmFyIF9hY3Rpb25zID0gcmVxdWlyZShcIi4vYWN0aW9uc1wiKTtcblxuT2JqZWN0LmtleXMoX2FjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIiB8fCBrZXkgPT09IFwiX19lc01vZHVsZVwiKSByZXR1cm47XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIF9hY3Rpb25zW2tleV07XG4gICAgfVxuICB9KTtcbn0pO1xuXG52YXIgX2NvbmZpZ3VyZUFjdGlvbnMgPSByZXF1aXJlKFwiLi9jb25maWd1cmVBY3Rpb25zXCIpO1xuXG5PYmplY3Qua2V5cyhfY29uZmlndXJlQWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIGlmIChrZXkgPT09IFwiZGVmYXVsdFwiIHx8IGtleSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gX2NvbmZpZ3VyZUFjdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbnZhciBfZGVjb3JhdGVBY3Rpb24gPSByZXF1aXJlKFwiLi9kZWNvcmF0ZUFjdGlvblwiKTtcblxuT2JqZWN0LmtleXMoX2RlY29yYXRlQWN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIgfHwga2V5ID09PSBcIl9fZXNNb2R1bGVcIikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBfZGVjb3JhdGVBY3Rpb25ba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbnZhciBfd2l0aEFjdGlvbnMgPSByZXF1aXJlKFwiLi93aXRoQWN0aW9uc1wiKTtcblxuT2JqZWN0LmtleXMoX3dpdGhBY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIgfHwga2V5ID09PSBcIl9fZXNNb2R1bGVcIikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBfd2l0aEFjdGlvbnNba2V5XTtcbiAgICB9XG4gIH0pO1xufSk7IiwidmFyIHJuZyA9IHJlcXVpcmUoJy4vbGliL3JuZycpO1xudmFyIGJ5dGVzVG9VdWlkID0gcmVxdWlyZSgnLi9saWIvYnl0ZXNUb1V1aWQnKTtcblxuLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcbnZhciBfY2xvY2tzZXE7XG5cbi8vIFByZXZpb3VzIHV1aWQgY3JlYXRpb24gdGltZVxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLXV1aWQgZm9yIEFQSSBkZXRhaWxzXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgW107XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7XG5cbiAgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBybmcoKTtcbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW1xuICAgICAgICBzZWVkQnl0ZXNbMF0gfCAweDAxLFxuICAgICAgICBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XVxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9XG5cbiAgLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTtcblxuICAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG4gIHZhciBkdCA9IChtc2VjcyAtIF9sYXN0TVNlY3MpICsgKG5zZWNzIC0gX2xhc3ROU2VjcykvMTAwMDA7XG5cbiAgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9XG5cbiAgLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfVxuXG4gIC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1dWlkLnYxKCk6IENhblxcJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjJyk7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7XG5cbiAgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwO1xuXG4gIC8vIGB0aW1lX2xvd2BcbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjtcblxuICAvLyBgdGltZV9taWRgXG4gIHZhciB0bWggPSAobXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwKSAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjtcblxuICAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmO1xuXG4gIC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7XG5cbiAgLy8gYGNsb2NrX3NlcV9sb3dgXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjtcblxuICAvLyBgbm9kZWBcbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmID8gYnVmIDogYnl0ZXNUb1V1aWQoYik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdjE7XG4iLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiAgSW4gdGhlXG4vLyBicm93c2VyIHRoaXMgaXMgYSBsaXR0bGUgY29tcGxpY2F0ZWQgZHVlIHRvIHVua25vd24gcXVhbGl0eSBvZiBNYXRoLnJhbmRvbSgpXG4vLyBhbmQgaW5jb25zaXN0ZW50IHN1cHBvcnQgZm9yIHRoZSBgY3J5cHRvYCBBUEkuICBXZSBkbyB0aGUgYmVzdCB3ZSBjYW4gdmlhXG4vLyBmZWF0dXJlLWRldGVjdGlvblxuXG4vLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG9cbi8vIGltcGxlbWVudGF0aW9uLiBBbHNvLCBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gb24gSUUxMS5cbnZhciBnZXRSYW5kb21WYWx1ZXMgPSAodHlwZW9mKGNyeXB0bykgIT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mKG1zQ3J5cHRvKSAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSk7XG5cbmlmIChnZXRSYW5kb21WYWx1ZXMpIHtcbiAgLy8gV0hBVFdHIGNyeXB0byBSTkcgLSBodHRwOi8vd2lraS53aGF0d2cub3JnL3dpa2kvQ3J5cHRvXG4gIHZhciBybmRzOCA9IG5ldyBVaW50OEFycmF5KDE2KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gd2hhdHdnUk5HKCkge1xuICAgIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG4gICAgcmV0dXJuIHJuZHM4O1xuICB9O1xufSBlbHNlIHtcbiAgLy8gTWF0aC5yYW5kb20oKS1iYXNlZCAoUk5HKVxuICAvL1xuICAvLyBJZiBhbGwgZWxzZSBmYWlscywgdXNlIE1hdGgucmFuZG9tKCkuICBJdCdzIGZhc3QsIGJ1dCBpcyBvZiB1bnNwZWNpZmllZFxuICAvLyBxdWFsaXR5LlxuICB2YXIgcm5kcyA9IG5ldyBBcnJheSgxNik7XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtYXRoUk5HKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCByOyBpIDwgMTY7IGkrKykge1xuICAgICAgaWYgKChpICYgMHgwMykgPT09IDApIHIgPSBNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDA7XG4gICAgICBybmRzW2ldID0gciA+Pj4gKChpICYgMHgwMykgPDwgMykgJiAweGZmO1xuICAgIH1cblxuICAgIHJldHVybiBybmRzO1xuICB9O1xufVxuIiwiLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG52YXIgYnl0ZVRvSGV4ID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9VdWlkKGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBidGggPSBieXRlVG9IZXg7XG4gIC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG4gIHJldHVybiAoW2J0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sIFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJyxcblx0YnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLFxuXHRidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sXG5cdGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV1dKS5qb2luKCcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBieXRlc1RvVXVpZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuZGVzY3JpcHRpb25cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sLml0ZXJhdG9yXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb21cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucmVkdWNlXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmRhdGUudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5kZWZpbmUtcHJvcGVydHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZ1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlY29yYXRlID0gZXhwb3J0cy5kZWNvcmF0ZUFjdGlvbiA9IHZvaWQgMDtcblxudmFyIF9hY3Rpb24gPSByZXF1aXJlKFwiLi9hY3Rpb25cIik7XG5cbnZhciBfYWN0aW9ucyA9IHJlcXVpcmUoXCIuL2FjdGlvbnNcIik7XG5cbnZhciBfd2l0aEFjdGlvbnMgPSByZXF1aXJlKFwiLi93aXRoQWN0aW9uc1wiKTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcikgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IH1cblxudmFyIGFwcGx5RGVjb3JhdG9ycyA9IGZ1bmN0aW9uIGFwcGx5RGVjb3JhdG9ycyhkZWNvcmF0b3JzLCBhY3Rpb25DYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBfYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIF9hcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3JzLnJlZHVjZShmdW5jdGlvbiAoYXJncywgc3RvcnlGbikge1xuICAgICAgcmV0dXJuIHN0b3J5Rm4oYXJncyk7XG4gICAgfSwgX2FyZ3MpO1xuICAgIGFjdGlvbkNhbGxiYWNrLmFwcGx5KHZvaWQgMCwgX3RvQ29uc3VtYWJsZUFycmF5KGRlY29yYXRlZCkpO1xuICB9O1xufTtcblxudmFyIGRlY29yYXRlQWN0aW9uID0gZnVuY3Rpb24gZGVjb3JhdGVBY3Rpb24oZGVjb3JhdG9ycykge1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgY2FsbEFjdGlvbiA9ICgwLCBfYWN0aW9uLmFjdGlvbikobmFtZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhkZWNvcmF0b3JzLCBjYWxsQWN0aW9uKTtcbiAgfTtcbn07XG5cbmV4cG9ydHMuZGVjb3JhdGVBY3Rpb24gPSBkZWNvcmF0ZUFjdGlvbjtcblxudmFyIGRlY29yYXRlID0gZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycykge1xuICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdGVBY3Rpb24oZGVjb3JhdG9ycyk7XG5cbiAgdmFyIGRlY29yYXRlZEFjdGlvbnMgPSBmdW5jdGlvbiBkZWNvcmF0ZWRBY3Rpb25zKCkge1xuICAgIHZhciByYXdBY3Rpb25zID0gX2FjdGlvbnMuYWN0aW9ucy5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgYWN0aW9uc09iamVjdCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJhd0FjdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIGFjdGlvbnNPYmplY3RbbmFtZV0gPSBhcHBseURlY29yYXRvcnMoZGVjb3JhdG9ycywgcmF3QWN0aW9uc1tuYW1lXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbnNPYmplY3Q7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhY3Rpb246IGRlY29yYXRlZCxcbiAgICBhY3Rpb25zOiBkZWNvcmF0ZWRBY3Rpb25zLFxuICAgIHdpdGhBY3Rpb25zOiAoMCwgX3dpdGhBY3Rpb25zLmNyZWF0ZURlY29yYXRvcikoZGVjb3JhdGVkQWN0aW9ucylcbiAgfTtcbn07XG5cbmV4cG9ydHMuZGVjb3JhdGUgPSBkZWNvcmF0ZTsiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cbjsoZnVuY3Rpb24oKSB7XG5cbiAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovXG4gIHZhciB1bmRlZmluZWQ7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLiAqL1xuICB2YXIgVkVSU0lPTiA9ICc0LjE3LjE1JztcblxuICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbiAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbiAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xuICB2YXIgQ09SRV9FUlJPUl9URVhUID0gJ1Vuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xPXBvbnlmaWxsLicsXG4gICAgICBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbiAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xuICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqL1xuICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuICAvKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG4gIHZhciBQTEFDRUhPTERFUiA9ICdfX2xvZGFzaF9wbGFjZWhvbGRlcl9fJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqL1xuICB2YXIgQ0xPTkVfREVFUF9GTEFHID0gMSxcbiAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsXG4gICAgICBDTE9ORV9TWU1CT0xTX0ZMQUcgPSA0O1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xuICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gIHZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgICBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcgPSAxNixcbiAgICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NixcbiAgICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4gIC8qKiBVc2VkIGFzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYF8udHJ1bmNhdGVgLiAqL1xuICB2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEggPSAzMCxcbiAgICAgIERFRkFVTFRfVFJVTkNfT01JU1NJT04gPSAnLi4uJztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovXG4gIHZhciBIT1RfQ09VTlQgPSA4MDAsXG4gICAgICBIT1RfU1BBTiA9IDE2O1xuXG4gIC8qKiBVc2VkIHRvIGluZGljYXRlIHRoZSB0eXBlIG9mIGxhenkgaXRlcmF0ZWVzLiAqL1xuICB2YXIgTEFaWV9GSUxURVJfRkxBRyA9IDEsXG4gICAgICBMQVpZX01BUF9GTEFHID0gMixcbiAgICAgIExBWllfV0hJTEVfRkxBRyA9IDM7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG4gIHZhciBJTkZJTklUWSA9IDEgLyAwLFxuICAgICAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTEsXG4gICAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4LFxuICAgICAgTkFOID0gMCAvIDA7XG5cbiAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi9cbiAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LFxuICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsXG4gICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxO1xuXG4gIC8qKiBVc2VkIHRvIGFzc29jaWF0ZSB3cmFwIG1ldGhvZHMgd2l0aCB0aGVpciBiaXQgZmxhZ3MuICovXG4gIHZhciB3cmFwRmxhZ3MgPSBbXG4gICAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgICBbJ2JpbmQnLCBXUkFQX0JJTkRfRkxBR10sXG4gICAgWydiaW5kS2V5JywgV1JBUF9CSU5EX0tFWV9GTEFHXSxcbiAgICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgICBbJ2N1cnJ5UmlnaHQnLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUddLFxuICAgIFsnZmxpcCcsIFdSQVBfRkxJUF9GTEFHXSxcbiAgICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gICAgWydwYXJ0aWFsUmlnaHQnLCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBR10sXG4gICAgWydyZWFyZycsIFdSQVBfUkVBUkdfRkxBR11cbiAgXTtcblxuICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG4gIHZhciBhcmdzVGFnID0gJ1tvYmplY3QgQXJndW1lbnRzXScsXG4gICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgICBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICAgIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXScsXG4gICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgICAgZG9tRXhjVGFnID0gJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScsXG4gICAgICBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXScsXG4gICAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgICAgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJyxcbiAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgICAgc2V0VGFnID0gJ1tvYmplY3QgU2V0XScsXG4gICAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICAgIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nLFxuICAgICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXScsXG4gICAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nLFxuICAgICAgd2Vha1NldFRhZyA9ICdbb2JqZWN0IFdlYWtTZXRdJztcblxuICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLFxuICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxuICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLFxuICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXG4gICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJyxcbiAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGVtcHR5IHN0cmluZyBsaXRlcmFscyBpbiBjb21waWxlZCB0ZW1wbGF0ZSBzb3VyY2UuICovXG4gIHZhciByZUVtcHR5U3RyaW5nTGVhZGluZyA9IC9cXGJfX3AgXFwrPSAnJzsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXFxiKF9fcCBcXCs9KSAnJyBcXCsvZyxcbiAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXFwoLio/XFwpfFxcYl9fdFxcKSkgXFwrXFxuJyc7L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggSFRNTCBlbnRpdGllcyBhbmQgSFRNTCBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVFc2NhcGVkSHRtbCA9IC8mKD86YW1wfGx0fGd0fHF1b3R8IzM5KTsvZyxcbiAgICAgIHJlVW5lc2NhcGVkSHRtbCA9IC9bJjw+XCInXS9nLFxuICAgICAgcmVIYXNFc2NhcGVkSHRtbCA9IFJlZ0V4cChyZUVzY2FwZWRIdG1sLnNvdXJjZSksXG4gICAgICByZUhhc1VuZXNjYXBlZEh0bWwgPSBSZWdFeHAocmVVbmVzY2FwZWRIdG1sLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlID0gLzwlLShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUV2YWx1YXRlID0gLzwlKFtcXHNcXFNdKz8pJT4vZyxcbiAgICAgIHJlSW50ZXJwb2xhdGUgPSAvPCU9KFtcXHNcXFNdKz8pJT4vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUlzRGVlcFByb3AgPSAvXFwufFxcWyg/OlteW1xcXV0qfChbXCInXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqP1xcMSlcXF0vLFxuICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXFx3KiQvLFxuICAgICAgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAgICovXG4gIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXG4gICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nLFxuICAgICAgcmVUcmltU3RhcnQgPSAvXlxccysvLFxuICAgICAgcmVUcmltRW5kID0gL1xccyskLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbiAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vLFxuICAgICAgcmVXcmFwRGV0YWlscyA9IC9cXHtcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoICguKylcXF0gXFwqLyxcbiAgICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB3b3JkcyBjb21wb3NlZCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2hcbiAgICogW0VTIHRlbXBsYXRlIGRlbGltaXRlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzKS5cbiAgICovXG4gIHZhciByZUVzVGVtcGxhdGUgPSAvXFwkXFx7KFteXFxcXH1dKig/OlxcXFwuW15cXFxcfV0qKSopXFx9L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGAgZmxhZ3MgZnJvbSB0aGVpciBjb2VyY2VkIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUZsYWdzID0gL1xcdyokLztcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqL1xuICB2YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xuICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqL1xuICB2YXIgcmVMYXRpbiA9IC9bXFx4YzAtXFx4ZDZcXHhkOC1cXHhmNlxceGY4LVxceGZmXFx1MDEwMC1cXHUwMTdmXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi9cbiAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLztcblxuICAvKiogVXNlZCB0byBtYXRjaCB1bmVzY2FwZWQgY2hhcmFjdGVycyBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciByZVVuZXNjYXBlZFN0cmluZyA9IC9bJ1xcblxcclxcdTIwMjhcXHUyMDI5XFxcXF0vZztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG4gIHZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFxcXHUyNzAwLVxcXFx1MjdiZicsXG4gICAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFxcXHhhY1xcXFx4YjFcXFxceGQ3XFxcXHhmNycsXG4gICAgICByc05vbkNoYXJSYW5nZSA9ICdcXFxceDAwLVxcXFx4MmZcXFxceDNhLVxcXFx4NDBcXFxceDViLVxcXFx4NjBcXFxceDdiLVxcXFx4YmYnLFxuICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgICAgcnNTcGFjZVJhbmdlID0gJyBcXFxcdFxcXFx4MGJcXFxcZlxcXFx4YTBcXFxcdWZlZmZcXFxcblxcXFxyXFxcXHUyMDI4XFxcXHUyMDI5XFxcXHUxNjgwXFxcXHUxODBlXFxcXHUyMDAwXFxcXHUyMDAxXFxcXHUyMDAyXFxcXHUyMDAzXFxcXHUyMDA0XFxcXHUyMDA1XFxcXHUyMDA2XFxcXHUyMDA3XFxcXHUyMDA4XFxcXHUyMDA5XFxcXHUyMDBhXFxcXHUyMDJmXFxcXHUyMDVmXFxcXHUzMDAwJyxcbiAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXFxceGMwLVxcXFx4ZDZcXFxceGQ4LVxcXFx4ZGUnLFxuICAgICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbiAgdmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgICAgcnNBc3RyYWwgPSAnWycgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNCcmVhayA9ICdbJyArIHJzQnJlYWtSYW5nZSArICddJyxcbiAgICAgIHJzQ29tYm8gPSAnWycgKyByc0NvbWJvUmFuZ2UgKyAnXScsXG4gICAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsXG4gICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLFxuICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNGaXR6ID0gJ1xcXFx1ZDgzY1tcXFxcdWRmZmItXFxcXHVkZmZmXScsXG4gICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFxcXHVkODNjW1xcXFx1ZGRlNi1cXFxcdWRkZmZdKXsyfScsXG4gICAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbiAgdmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNNaXNjVXBwZXIgPSAnKD86JyArIHJzVXBwZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc09wdENvbnRyTG93ZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpkfGxsfG18cmV8c3x0fHZlKSk/JyxcbiAgICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgICAgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgICByc09yZExvd2VyID0gJ1xcXFxkKig/OjFzdHwybmR8M3JkfCg/IVsxMjNdKVxcXFxkdGgpKD89XFxcXGJ8W0EtWl9dKScsXG4gICAgICByc09yZFVwcGVyID0gJ1xcXFxkKig/OjFTVHwyTkR8M1JEfCg/IVsxMjNdKVxcXFxkVEgpKD89XFxcXGJ8W2Etel9dKScsXG4gICAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgICByc0Vtb2ppID0gJyg/OicgKyBbcnNEaW5nYmF0LCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc1NlcSxcbiAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xuICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTtcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaCBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpIGFuZFxuICAgKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzIGZvciBzeW1ib2xzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfZm9yX1N5bWJvbHMpLlxuICAgKi9cbiAgdmFyIHJlQ29tYm9NYXJrID0gUmVnRXhwKHJzQ29tYm8sICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbiAgdmFyIHJlVW5pY29kZSA9IFJlZ0V4cChyc0ZpdHogKyAnKD89JyArIHJzRml0eiArICcpfCcgKyByc1N5bWJvbCArIHJzU2VxLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG4gIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFtcbiAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsXG4gICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlcixcbiAgICByc09yZFVwcGVyLFxuICAgIHJzT3JkTG93ZXIsXG4gICAgcnNEaWdpdHMsXG4gICAgcnNFbW9qaVxuICBdLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB3aXRoIFt6ZXJvLXdpZHRoIGpvaW5lcnMgb3IgY29kZSBwb2ludHMgZnJvbSB0aGUgYXN0cmFsIHBsYW5lc10oaHR0cDovL2Vldi5lZS9ibG9nLzIwMTUvMDkvMTIvZGFyay1jb3JuZXJzLW9mLXVuaWNvZGUvKS4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3MgdGhhdCBuZWVkIGEgbW9yZSByb2J1c3QgcmVnZXhwIHRvIG1hdGNoIHdvcmRzLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlV29yZCA9IC9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO1xuXG4gIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi9cbiAgdmFyIGNvbnRleHRQcm9wcyA9IFtcbiAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsXG4gICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JyxcbiAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLFxuICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJyxcbiAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCdcbiAgXTtcblxuICAvKiogVXNlZCB0byBtYWtlIHRlbXBsYXRlIHNvdXJjZVVSTHMgZWFzaWVyIHRvIGlkZW50aWZ5LiAqL1xuICB2YXIgdGVtcGxhdGVDb3VudGVyID0gLTE7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqL1xuICB2YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgdHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ10gPSB0eXBlZEFycmF5VGFnc1tib29sVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2RhdGVUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPSB0eXBlZEFycmF5VGFnc1tyZWdleHBUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovXG4gIHZhciBjbG9uZWFibGVUYWdzID0ge307XG4gIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG4gIHZhciBkZWJ1cnJlZExldHRlcnMgPSB7XG4gICAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IGJsb2NrLlxuICAgICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAgICdcXHhlMCc6ICdhJywgICdcXHhlMSc6ICdhJywgJ1xceGUyJzogJ2EnLCAnXFx4ZTMnOiAnYScsICdcXHhlNCc6ICdhJywgJ1xceGU1JzogJ2EnLFxuICAgICdcXHhjNyc6ICdDJywgICdcXHhlNyc6ICdjJyxcbiAgICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICAgJ1xceGM4JzogJ0UnLCAgJ1xceGM5JzogJ0UnLCAnXFx4Y2EnOiAnRScsICdcXHhjYic6ICdFJyxcbiAgICAnXFx4ZTgnOiAnZScsICAnXFx4ZTknOiAnZScsICdcXHhlYSc6ICdlJywgJ1xceGViJzogJ2UnLFxuICAgICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICAgJ1xceGVjJzogJ2knLCAgJ1xceGVkJzogJ2knLCAnXFx4ZWUnOiAnaScsICdcXHhlZic6ICdpJyxcbiAgICAnXFx4ZDEnOiAnTicsICAnXFx4ZjEnOiAnbicsXG4gICAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICAgJ1xceGYyJzogJ28nLCAgJ1xceGYzJzogJ28nLCAnXFx4ZjQnOiAnbycsICdcXHhmNSc6ICdvJywgJ1xceGY2JzogJ28nLCAnXFx4ZjgnOiAnbycsXG4gICAgJ1xceGQ5JzogJ1UnLCAgJ1xceGRhJzogJ1UnLCAnXFx4ZGInOiAnVScsICdcXHhkYyc6ICdVJyxcbiAgICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAgICdcXHhkZCc6ICdZJywgICdcXHhmZCc6ICd5JywgJ1xceGZmJzogJ3knLFxuICAgICdcXHhjNic6ICdBZScsICdcXHhlNic6ICdhZScsXG4gICAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgICAnXFx4ZGYnOiAnc3MnLFxuICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suXG4gICAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICAgJ1xcdTAxMDEnOiAnYScsICAnXFx1MDEwMyc6ICdhJywgJ1xcdTAxMDUnOiAnYScsXG4gICAgJ1xcdTAxMDYnOiAnQycsICAnXFx1MDEwOCc6ICdDJywgJ1xcdTAxMGEnOiAnQycsICdcXHUwMTBjJzogJ0MnLFxuICAgICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgICAnXFx1MDEwZSc6ICdEJywgICdcXHUwMTEwJzogJ0QnLCAnXFx1MDEwZic6ICdkJywgJ1xcdTAxMTEnOiAnZCcsXG4gICAgJ1xcdTAxMTInOiAnRScsICAnXFx1MDExNCc6ICdFJywgJ1xcdTAxMTYnOiAnRScsICdcXHUwMTE4JzogJ0UnLCAnXFx1MDExYSc6ICdFJyxcbiAgICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAgICdcXHUwMTFjJzogJ0cnLCAgJ1xcdTAxMWUnOiAnRycsICdcXHUwMTIwJzogJ0cnLCAnXFx1MDEyMic6ICdHJyxcbiAgICAnXFx1MDExZCc6ICdnJywgICdcXHUwMTFmJzogJ2cnLCAnXFx1MDEyMSc6ICdnJywgJ1xcdTAxMjMnOiAnZycsXG4gICAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAgICdcXHUwMTI4JzogJ0knLCAgJ1xcdTAxMmEnOiAnSScsICdcXHUwMTJjJzogJ0knLCAnXFx1MDEyZSc6ICdJJywgJ1xcdTAxMzAnOiAnSScsXG4gICAgJ1xcdTAxMjknOiAnaScsICAnXFx1MDEyYic6ICdpJywgJ1xcdTAxMmQnOiAnaScsICdcXHUwMTJmJzogJ2knLCAnXFx1MDEzMSc6ICdpJyxcbiAgICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAgICdcXHUwMTM2JzogJ0snLCAgJ1xcdTAxMzcnOiAnaycsICdcXHUwMTM4JzogJ2snLFxuICAgICdcXHUwMTM5JzogJ0wnLCAgJ1xcdTAxM2InOiAnTCcsICdcXHUwMTNkJzogJ0wnLCAnXFx1MDEzZic6ICdMJywgJ1xcdTAxNDEnOiAnTCcsXG4gICAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgICAnXFx1MDE0Myc6ICdOJywgICdcXHUwMTQ1JzogJ04nLCAnXFx1MDE0Nyc6ICdOJywgJ1xcdTAxNGEnOiAnTicsXG4gICAgJ1xcdTAxNDQnOiAnbicsICAnXFx1MDE0Nic6ICduJywgJ1xcdTAxNDgnOiAnbicsICdcXHUwMTRiJzogJ24nLFxuICAgICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAgICdcXHUwMTRkJzogJ28nLCAgJ1xcdTAxNGYnOiAnbycsICdcXHUwMTUxJzogJ28nLFxuICAgICdcXHUwMTU0JzogJ1InLCAgJ1xcdTAxNTYnOiAnUicsICdcXHUwMTU4JzogJ1InLFxuICAgICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAgICdcXHUwMTVhJzogJ1MnLCAgJ1xcdTAxNWMnOiAnUycsICdcXHUwMTVlJzogJ1MnLCAnXFx1MDE2MCc6ICdTJyxcbiAgICAnXFx1MDE1Yic6ICdzJywgICdcXHUwMTVkJzogJ3MnLCAnXFx1MDE1Zic6ICdzJywgJ1xcdTAxNjEnOiAncycsXG4gICAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICAgJ1xcdTAxNjMnOiAndCcsICAnXFx1MDE2NSc6ICd0JywgJ1xcdTAxNjcnOiAndCcsXG4gICAgJ1xcdTAxNjgnOiAnVScsICAnXFx1MDE2YSc6ICdVJywgJ1xcdTAxNmMnOiAnVScsICdcXHUwMTZlJzogJ1UnLCAnXFx1MDE3MCc6ICdVJywgJ1xcdTAxNzInOiAnVScsXG4gICAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICAgJ1xcdTAxNzQnOiAnVycsICAnXFx1MDE3NSc6ICd3JyxcbiAgICAnXFx1MDE3Nic6ICdZJywgICdcXHUwMTc3JzogJ3knLCAnXFx1MDE3OCc6ICdZJyxcbiAgICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgICAnXFx1MDE3YSc6ICd6JywgICdcXHUwMTdjJzogJ3onLCAnXFx1MDE3ZSc6ICd6JyxcbiAgICAnXFx1MDEzMic6ICdJSicsICdcXHUwMTMzJzogJ2lqJyxcbiAgICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgICAnXFx1MDE0OSc6IFwiJ25cIiwgJ1xcdTAxN2YnOiAncydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLiAqL1xuICB2YXIgaHRtbEVzY2FwZXMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgIFwiJ1wiOiAnJiMzOTsnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi9cbiAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7XG4gICAgJyZhbXA7JzogJyYnLFxuICAgICcmbHQ7JzogJzwnLFxuICAgICcmZ3Q7JzogJz4nLFxuICAgICcmcXVvdDsnOiAnXCInLFxuICAgICcmIzM5Oyc6IFwiJ1wiXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuICovXG4gIHZhciBzdHJpbmdFc2NhcGVzID0ge1xuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxuJzogJ24nLFxuICAgICdcXHInOiAncicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIC8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG4gIHZhciBmcmVlUGFyc2VGbG9hdCA9IHBhcnNlRmxvYXQsXG4gICAgICBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbiAgdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG4gIHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbiAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbiAgdmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xuXG4gIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xuICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICAgIGlmICh0eXBlcykge1xuICAgICAgICByZXR1cm4gdHlwZXM7XG4gICAgICB9XG5cbiAgICAgIC8vIExlZ2FjeSBgcHJvY2Vzcy5iaW5kaW5nKCd1dGlsJylgIGZvciBOb2RlLmpzIDwgMTAuXG4gICAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfSgpKTtcblxuICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xuICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLFxuICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSxcbiAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLFxuICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsXG4gICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCxcbiAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAgICogd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgIGFuZCB0aGUgYXJndW1lbnRzIG9mIGBhcmdzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuXG4gICAqL1xuICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgICAgY2FzZSAyOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlGaWx0ZXIoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiAhIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIDApID4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhcnJheUluY2x1ZGVzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07XG4gICAgfVxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ucmVkdWNlUmlnaHRgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5Wy0tbGVuZ3RoXTtcbiAgICB9XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAgICogc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICB2YXIgYXNjaWlTaXplID0gYmFzZVByb3BlcnR5KCdsZW5ndGgnKTtcblxuICAvKipcbiAgICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5maW5kS2V5YCBhbmQgYF8uZmluZExhc3RLZXlgLFxuICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gXG4gICAqIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZvdW5kIGVsZW1lbnQgb3IgaXRzIGtleSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kS2V5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZWFjaEZ1bmMpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGtleSwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVzdWx0ID0ga2V5O1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkge1xuICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBmcm9tSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mV2l0aChhcnJheSwgdmFsdWUsIGZyb21JbmRleCwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lYW5gIGFuZCBgXy5tZWFuQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VNZWFuKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gbGVuZ3RoID8gKGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSAvIGxlbmd0aCkgOiBOQU47XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlPZmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydFxuICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAgdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRBY2N1bSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBvciBsYXN0IGVsZW1lbnQgb2ZcbiAgICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpXG4gICAgICAgIDogaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAgICogc29ydCBvcmRlciBvZiBgYXJyYXlgIGFuZCByZXBsYWNlcyBjcml0ZXJpYSBvYmplY3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZ1xuICAgKiB2YWx1ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgYXJyYXkuc29ydChjb21wYXJlcik7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnN1bWAgYW5kIGBfLnN1bUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIHJlc3VsdCxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBjdXJyZW50IDogKHJlc3VsdCArIGN1cnJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRpbWVzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHNcbiAgICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1BhaXJzYCBhbmQgYF8udG9QYWlyc0luYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5XG4gICAqIG9mIGtleS12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VUb1BhaXJzKG9iamVjdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtrZXksIG9iamVjdFtrZXldXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuXG4gICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lc1xuICAgKiBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBgY2FjaGVgIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBUaGUgY2FjaGUgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gICAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1TdGFydGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RyaW5nIHN5bWJvbFxuICAgKiB0aGF0IGlzIG5vdCBmb3VuZCBpbiB0aGUgY2hhcmFjdGVyIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0clN5bWJvbHMgVGhlIHN0cmluZyBzeW1ib2xzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVubWF0Y2hlZCBzdHJpbmcgc3ltYm9sLlxuICAgKi9cbiAgZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gICAgdmFyIGluZGV4ID0gc3RyU3ltYm9scy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGBwbGFjZWhvbGRlcmAgb2NjdXJyZW5jZXMgaW4gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LlxuICAgKi9cbiAgZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IDA7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChhcnJheVtsZW5ndGhdID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgICArK3Jlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmRlYnVycmAgdG8gY29udmVydCBMYXRpbi0xIFN1cHBsZW1lbnQgYW5kIExhdGluIEV4dGVuZGVkLUFcbiAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGV0dGVyIFRoZSBtYXRjaGVkIGxldHRlciB0byBkZWJ1cnIuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIGxldHRlci5cbiAgICovXG4gIHZhciBkZWJ1cnJMZXR0ZXIgPSBiYXNlUHJvcGVydHlPZihkZWJ1cnJlZExldHRlcnMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLmVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuXG4gICAqL1xuICB2YXIgZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udGVtcGxhdGVgIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nQ2hhcihjaHIpIHtcbiAgICByZXR1cm4gJ1xcXFwnICsgc3RyaW5nRXNjYXBlc1tjaHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgYSB3b3JkIGNvbXBvc2VkIG9mIFVuaWNvZGUgc3ltYm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHdvcmQgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHN0cmluZykge1xuICAgIHJldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgaXRlcmF0b3JgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlcmF0b3IgVGhlIGl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gaXRlcmF0b3JUb0FycmF5KGl0ZXJhdG9yKSB7XG4gICAgdmFyIGRhdGEsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCEoZGF0YSA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYG1hcGAgdG8gaXRzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG1hcCBUaGUgbWFwIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobWFwLnNpemUpO1xuXG4gICAgbWFwLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIGBwbGFjZWhvbGRlcmAgZWxlbWVudHMgaW4gYGFycmF5YCB3aXRoIGFuIGludGVybmFsIHBsYWNlaG9sZGVyXG4gICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZWlyIGluZGV4ZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gcGxhY2Vob2xkZXIgfHwgdmFsdWUgPT09IFBMQUNFSE9MREVSKSB7XG4gICAgICAgIGFycmF5W2luZGV4XSA9IFBMQUNFSE9MREVSO1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gICAqL1xuICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldCkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc2V0YCB0byBpdHMgdmFsdWUtdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9QYWlycyhzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFt2YWx1ZSwgdmFsdWVdO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluZGV4T2ZgIHdoaWNoIHBlcmZvcm1zIHN0cmljdCBlcXVhbGl0eVxuICAgKiBjb21wYXJpc29ucyBvZiB2YWx1ZXMsIGkuZS4gYD09PWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFycmF5W2luZGV4XSA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmxhc3RJbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkge1xuICAgIHZhciBpbmRleCA9IGZyb21JbmRleCArIDE7XG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykge1xuICAgIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgID8gdW5pY29kZVNpemUoc3RyaW5nKVxuICAgICAgOiBhc2NpaVNpemUoc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVUb0FycmF5KHN0cmluZylcbiAgICAgIDogYXNjaWlUb0FycmF5KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIHVuZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhIFVuaWNvZGUgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVTaXplKHN0cmluZykge1xuICAgIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgICB3aGlsZSAocmVVbmljb2RlLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgKytyZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZVdvcmQpIHx8IFtdO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB1c2luZyB0aGUgYGNvbnRleHRgIG9iamVjdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyT2YgX1xuICAgKiBAc2luY2UgMS4xLjBcbiAgICogQGNhdGVnb3J5IFV0aWxcbiAgICogQHBhcmFtIHtPYmplY3R9IFtjb250ZXh0PXJvb3RdIFRoZSBjb250ZXh0IG9iamVjdC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGEgbmV3IGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBfLm1peGluKHsgJ2Zvbyc6IF8uY29uc3RhbnQoJ2ZvbycpIH0pO1xuICAgKlxuICAgKiB2YXIgbG9kYXNoID0gXy5ydW5JbkNvbnRleHQoKTtcbiAgICogbG9kYXNoLm1peGluKHsgJ2Jhcic6IGxvZGFzaC5jb25zdGFudCgnYmFyJykgfSk7XG4gICAqXG4gICAqIF8uaXNGdW5jdGlvbihfLmZvbyk7XG4gICAqIC8vID0+IHRydWVcbiAgICogXy5pc0Z1bmN0aW9uKF8uYmFyKTtcbiAgICogLy8gPT4gZmFsc2VcbiAgICpcbiAgICogbG9kYXNoLmlzRnVuY3Rpb24obG9kYXNoLmZvbyk7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5iYXIpO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqXG4gICAqIC8vIENyZWF0ZSBhIHN1cGVkLXVwIGBkZWZlcmAgaW4gTm9kZS5qcy5cbiAgICogdmFyIGRlZmVyID0gXy5ydW5JbkNvbnRleHQoeyAnc2V0VGltZW91dCc6IHNldEltbWVkaWF0ZSB9KS5kZWZlcjtcbiAgICovXG4gIHZhciBydW5JbkNvbnRleHQgPSAoZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpIHtcbiAgICBjb250ZXh0ID0gY29udGV4dCA9PSBudWxsID8gcm9vdCA6IF8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwgY29udGV4dCwgXy5waWNrKHJvb3QsIGNvbnRleHRQcm9wcykpO1xuXG4gICAgLyoqIEJ1aWx0LWluIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEFycmF5ID0gY29udGV4dC5BcnJheSxcbiAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSxcbiAgICAgICAgRXJyb3IgPSBjb250ZXh0LkVycm9yLFxuICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sXG4gICAgICAgIE1hdGggPSBjb250ZXh0Lk1hdGgsXG4gICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LFxuICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCxcbiAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsXG4gICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yO1xuXG4gICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlLFxuICAgICAgICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbiAgICB2YXIgY29yZUpzRGF0YSA9IGNvbnRleHRbJ19fY29yZS1qc19zaGFyZWRfXyddO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xuICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAgIC8qKiBVc2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMuICovXG4gICAgdmFyIGlkQ291bnRlciA9IDA7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqL1xuICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTtcbiAgICAgIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJztcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byByZXNvbHZlIHRoZVxuICAgICAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICAgICAqIG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAgIC8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbiAgICB2YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbiAgICAvKiogVXNlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBgX2AgcmVmZXJlbmNlIGluIGBfLm5vQ29uZmxpY3RgLiAqL1xuICAgIHZhciBvbGREYXNoID0gcm9vdC5fO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbiAgICB2YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICAgICAgZnVuY1RvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuICAgICk7XG5cbiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IGNvbnRleHQuQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBTeW1ib2wgPSBjb250ZXh0LlN5bWJvbCxcbiAgICAgICAgVWludDhBcnJheSA9IGNvbnRleHQuVWludDhBcnJheSxcbiAgICAgICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQsXG4gICAgICAgIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLFxuICAgICAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLFxuICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLFxuICAgICAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZSxcbiAgICAgICAgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQsXG4gICAgICAgIHN5bUl0ZXJhdG9yID0gU3ltYm9sID8gU3ltYm9sLml0ZXJhdG9yIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9KCkpO1xuXG4gICAgLyoqIE1vY2tlZCBidWlsdC1pbnMuICovXG4gICAgdmFyIGN0eENsZWFyVGltZW91dCA9IGNvbnRleHQuY2xlYXJUaW1lb3V0ICE9PSByb290LmNsZWFyVGltZW91dCAmJiBjb250ZXh0LmNsZWFyVGltZW91dCxcbiAgICAgICAgY3R4Tm93ID0gRGF0ZSAmJiBEYXRlLm5vdyAhPT0gcm9vdC5EYXRlLm5vdyAmJiBEYXRlLm5vdyxcbiAgICAgICAgY3R4U2V0VGltZW91dCA9IGNvbnRleHQuc2V0VGltZW91dCAhPT0gcm9vdC5zZXRUaW1lb3V0ICYmIGNvbnRleHQuc2V0VGltZW91dDtcblxuICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbiAgICB2YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCxcbiAgICAgICAgbmF0aXZlRmxvb3IgPSBNYXRoLmZsb29yLFxuICAgICAgICBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxcbiAgICAgICAgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hdGl2ZUlzRmluaXRlID0gY29udGV4dC5pc0Zpbml0ZSxcbiAgICAgICAgbmF0aXZlSm9pbiA9IGFycmF5UHJvdG8uam9pbixcbiAgICAgICAgbmF0aXZlS2V5cyA9IG92ZXJBcmcoT2JqZWN0LmtleXMsIE9iamVjdCksXG4gICAgICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgICAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbmF0aXZlTm93ID0gRGF0ZS5ub3csXG4gICAgICAgIG5hdGl2ZVBhcnNlSW50ID0gY29udGV4dC5wYXJzZUludCxcbiAgICAgICAgbmF0aXZlUmFuZG9tID0gTWF0aC5yYW5kb20sXG4gICAgICAgIG5hdGl2ZVJldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG4gICAgdmFyIERhdGFWaWV3ID0gZ2V0TmF0aXZlKGNvbnRleHQsICdEYXRhVmlldycpLFxuICAgICAgICBNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ01hcCcpLFxuICAgICAgICBQcm9taXNlID0gZ2V0TmF0aXZlKGNvbnRleHQsICdQcm9taXNlJyksXG4gICAgICAgIFNldCA9IGdldE5hdGl2ZShjb250ZXh0LCAnU2V0JyksXG4gICAgICAgIFdlYWtNYXAgPSBnZXROYXRpdmUoY29udGV4dCwgJ1dlYWtNYXAnKSxcbiAgICAgICAgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG4gICAgLyoqIFVzZWQgdG8gc3RvcmUgZnVuY3Rpb24gbWV0YWRhdGEuICovXG4gICAgdmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwO1xuXG4gICAgLyoqIFVzZWQgdG8gbG9va3VwIHVubWluaWZpZWQgZnVuY3Rpb24gbmFtZXMuICovXG4gICAgdmFyIHJlYWxOYW1lcyA9IHt9O1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi9cbiAgICB2YXIgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxuICAgICAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICAgICAgcHJvbWlzZUN0b3JTdHJpbmcgPSB0b1NvdXJjZShQcm9taXNlKSxcbiAgICAgICAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXG4gICAgICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbiAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbiAgICB2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGltcGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcy4gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gYW5kIHJldHVybiBhcnJheXMsIGNvbGxlY3Rpb25zLFxuICAgICAqIGFuZCBmdW5jdGlvbnMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXIuIE1ldGhvZHMgdGhhdCByZXRyaWV2ZSBhIHNpbmdsZSB2YWx1ZVxuICAgICAqIG9yIG1heSByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgY2hhaW4gc2VxdWVuY2VcbiAgICAgKiBhbmQgcmV0dXJuIHRoZSB1bndyYXBwZWQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBFeHBsaWNpdCBjaGFpbiBzZXF1ZW5jZXMsIHdoaWNoIG11c3QgYmUgdW53cmFwcGVkIHdpdGggYF8jdmFsdWVgLCBtYXkgYmVcbiAgICAgKiBlbmFibGVkIHVzaW5nIGBfLmNoYWluYC5cbiAgICAgKlxuICAgICAqIFRoZSBleGVjdXRpb24gb2YgY2hhaW5lZCBtZXRob2RzIGlzIGxhenksIHRoYXQgaXMsIGl0J3MgZGVmZXJyZWQgdW50aWxcbiAgICAgKiBgXyN2YWx1ZWAgaXMgaW1wbGljaXRseSBvciBleHBsaWNpdGx5IGNhbGxlZC5cbiAgICAgKlxuICAgICAqIExhenkgZXZhbHVhdGlvbiBhbGxvd3Mgc2V2ZXJhbCBtZXRob2RzIHRvIHN1cHBvcnQgc2hvcnRjdXQgZnVzaW9uLlxuICAgICAqIFNob3J0Y3V0IGZ1c2lvbiBpcyBhbiBvcHRpbWl6YXRpb24gdG8gbWVyZ2UgaXRlcmF0ZWUgY2FsbHM7IHRoaXMgYXZvaWRzXG4gICAgICogdGhlIGNyZWF0aW9uIG9mIGludGVybWVkaWF0ZSBhcnJheXMgYW5kIGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mXG4gICAgICogaXRlcmF0ZWUgZXhlY3V0aW9ucy4gU2VjdGlvbnMgb2YgYSBjaGFpbiBzZXF1ZW5jZSBxdWFsaWZ5IGZvciBzaG9ydGN1dFxuICAgICAqIGZ1c2lvbiBpZiB0aGUgc2VjdGlvbiBpcyBhcHBsaWVkIHRvIGFuIGFycmF5IGFuZCBpdGVyYXRlZXMgYWNjZXB0IG9ubHlcbiAgICAgKiBvbmUgYXJndW1lbnQuIFRoZSBoZXVyaXN0aWMgZm9yIHdoZXRoZXIgYSBzZWN0aW9uIHF1YWxpZmllcyBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaXMgc3ViamVjdCB0byBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzXG4gICAgICogZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQuXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLlxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYEFycmF5YCBtZXRob2RzIGFyZTpcbiAgICAgKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgc2hpZnRgLCBgc29ydGAsIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBgU3RyaW5nYCBtZXRob2RzIGFyZTpcbiAgICAgKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbiBhcmU6XG4gICAgICogYGF0YCwgYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsIGBmaW5kYCxcbiAgICAgKiBgZmluZExhc3RgLCBgaGVhZGAsIGBpbml0aWFsYCwgYGxhc3RgLCBgbWFwYCwgYHJlamVjdGAsIGByZXZlcnNlYCwgYHNsaWNlYCxcbiAgICAgKiBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBhbmQgYHRvQXJyYXlgXG4gICAgICpcbiAgICAgKiBUaGUgY2hhaW5hYmxlIHdyYXBwZXIgbWV0aG9kcyBhcmU6XG4gICAgICogYGFmdGVyYCwgYGFyeWAsIGBhc3NpZ25gLCBgYXNzaWduSW5gLCBgYXNzaWduSW5XaXRoYCwgYGFzc2lnbldpdGhgLCBgYXRgLFxuICAgICAqIGBiZWZvcmVgLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2FzdEFycmF5YCwgYGNoYWluYCwgYGNodW5rYCxcbiAgICAgKiBgY29tbWl0YCwgYGNvbXBhY3RgLCBgY29uY2F0YCwgYGNvbmZvcm1zYCwgYGNvbnN0YW50YCwgYGNvdW50QnlgLCBgY3JlYXRlYCxcbiAgICAgKiBgY3VycnlgLCBgZGVib3VuY2VgLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGRlZmVyYCwgYGRlbGF5YCxcbiAgICAgKiBgZGlmZmVyZW5jZWAsIGBkaWZmZXJlbmNlQnlgLCBgZGlmZmVyZW5jZVdpdGhgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLFxuICAgICAqIGBkcm9wUmlnaHRXaGlsZWAsIGBkcm9wV2hpbGVgLCBgZXh0ZW5kYCwgYGV4dGVuZFdpdGhgLCBgZmlsbGAsIGBmaWx0ZXJgLFxuICAgICAqIGBmbGF0TWFwYCwgYGZsYXRNYXBEZWVwYCwgYGZsYXRNYXBEZXB0aGAsIGBmbGF0dGVuYCwgYGZsYXR0ZW5EZWVwYCxcbiAgICAgKiBgZmxhdHRlbkRlcHRoYCwgYGZsaXBgLCBgZmxvd2AsIGBmbG93UmlnaHRgLCBgZnJvbVBhaXJzYCwgYGZ1bmN0aW9uc2AsXG4gICAgICogYGZ1bmN0aW9uc0luYCwgYGdyb3VwQnlgLCBgaW5pdGlhbGAsIGBpbnRlcnNlY3Rpb25gLCBgaW50ZXJzZWN0aW9uQnlgLFxuICAgICAqIGBpbnRlcnNlY3Rpb25XaXRoYCwgYGludmVydGAsIGBpbnZlcnRCeWAsIGBpbnZva2VNYXBgLCBgaXRlcmF0ZWVgLCBga2V5QnlgLFxuICAgICAqIGBrZXlzYCwgYGtleXNJbmAsIGBtYXBgLCBgbWFwS2V5c2AsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsIGBtYXRjaGVzUHJvcGVydHlgLFxuICAgICAqIGBtZW1vaXplYCwgYG1lcmdlYCwgYG1lcmdlV2l0aGAsIGBtZXRob2RgLCBgbWV0aG9kT2ZgLCBgbWl4aW5gLCBgbmVnYXRlYCxcbiAgICAgKiBgbnRoQXJnYCwgYG9taXRgLCBgb21pdEJ5YCwgYG9uY2VgLCBgb3JkZXJCeWAsIGBvdmVyYCwgYG92ZXJBcmdzYCxcbiAgICAgKiBgb3ZlckV2ZXJ5YCwgYG92ZXJTb21lYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBhcnRpdGlvbmAsIGBwaWNrYCxcbiAgICAgKiBgcGlja0J5YCwgYHBsYW50YCwgYHByb3BlcnR5YCwgYHByb3BlcnR5T2ZgLCBgcHVsbGAsIGBwdWxsQWxsYCwgYHB1bGxBbGxCeWAsXG4gICAgICogYHB1bGxBbGxXaXRoYCwgYHB1bGxBdGAsIGBwdXNoYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVhcmdgLCBgcmVqZWN0YCxcbiAgICAgKiBgcmVtb3ZlYCwgYHJlc3RgLCBgcmV2ZXJzZWAsIGBzYW1wbGVTaXplYCwgYHNldGAsIGBzZXRXaXRoYCwgYHNodWZmbGVgLFxuICAgICAqIGBzbGljZWAsIGBzb3J0YCwgYHNvcnRCeWAsIGBzcGxpY2VgLCBgc3ByZWFkYCwgYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLFxuICAgICAqIGB0YWtlUmlnaHRXaGlsZWAsIGB0YWtlV2hpbGVgLCBgdGFwYCwgYHRocm90dGxlYCwgYHRocnVgLCBgdG9BcnJheWAsXG4gICAgICogYHRvUGFpcnNgLCBgdG9QYWlyc0luYCwgYHRvUGF0aGAsIGB0b1BsYWluT2JqZWN0YCwgYHRyYW5zZm9ybWAsIGB1bmFyeWAsXG4gICAgICogYHVuaW9uYCwgYHVuaW9uQnlgLCBgdW5pb25XaXRoYCwgYHVuaXFgLCBgdW5pcUJ5YCwgYHVuaXFXaXRoYCwgYHVuc2V0YCxcbiAgICAgKiBgdW5zaGlmdGAsIGB1bnppcGAsIGB1bnppcFdpdGhgLCBgdXBkYXRlYCwgYHVwZGF0ZVdpdGhgLCBgdmFsdWVzYCxcbiAgICAgKiBgdmFsdWVzSW5gLCBgd2l0aG91dGAsIGB3cmFwYCwgYHhvcmAsIGB4b3JCeWAsIGB4b3JXaXRoYCwgYHppcGAsXG4gICAgICogYHppcE9iamVjdGAsIGB6aXBPYmplY3REZWVwYCwgYW5kIGB6aXBXaXRoYFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAgICAgKiBgYWRkYCwgYGF0dGVtcHRgLCBgY2FtZWxDYXNlYCwgYGNhcGl0YWxpemVgLCBgY2VpbGAsIGBjbGFtcGAsIGBjbG9uZWAsXG4gICAgICogYGNsb25lRGVlcGAsIGBjbG9uZURlZXBXaXRoYCwgYGNsb25lV2l0aGAsIGBjb25mb3Jtc1RvYCwgYGRlYnVycmAsXG4gICAgICogYGRlZmF1bHRUb2AsIGBkaXZpZGVgLCBgZWFjaGAsIGBlYWNoUmlnaHRgLCBgZW5kc1dpdGhgLCBgZXFgLCBgZXNjYXBlYCxcbiAgICAgKiBgZXNjYXBlUmVnRXhwYCwgYGV2ZXJ5YCwgYGZpbmRgLCBgZmluZEluZGV4YCwgYGZpbmRLZXlgLCBgZmluZExhc3RgLFxuICAgICAqIGBmaW5kTGFzdEluZGV4YCwgYGZpbmRMYXN0S2V5YCwgYGZpcnN0YCwgYGZsb29yYCwgYGZvckVhY2hgLCBgZm9yRWFjaFJpZ2h0YCxcbiAgICAgKiBgZm9ySW5gLCBgZm9ySW5SaWdodGAsIGBmb3JPd25gLCBgZm9yT3duUmlnaHRgLCBgZ2V0YCwgYGd0YCwgYGd0ZWAsIGBoYXNgLFxuICAgICAqIGBoYXNJbmAsIGBoZWFkYCwgYGlkZW50aXR5YCwgYGluY2x1ZGVzYCwgYGluZGV4T2ZgLCBgaW5SYW5nZWAsIGBpbnZva2VgLFxuICAgICAqIGBpc0FyZ3VtZW50c2AsIGBpc0FycmF5YCwgYGlzQXJyYXlCdWZmZXJgLCBgaXNBcnJheUxpa2VgLCBgaXNBcnJheUxpa2VPYmplY3RgLFxuICAgICAqIGBpc0Jvb2xlYW5gLCBgaXNCdWZmZXJgLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsIGBpc0VtcHR5YCwgYGlzRXF1YWxgLFxuICAgICAqIGBpc0VxdWFsV2l0aGAsIGBpc0Vycm9yYCwgYGlzRmluaXRlYCwgYGlzRnVuY3Rpb25gLCBgaXNJbnRlZ2VyYCwgYGlzTGVuZ3RoYCxcbiAgICAgKiBgaXNNYXBgLCBgaXNNYXRjaGAsIGBpc01hdGNoV2l0aGAsIGBpc05hTmAsIGBpc05hdGl2ZWAsIGBpc05pbGAsIGBpc051bGxgLFxuICAgICAqIGBpc051bWJlcmAsIGBpc09iamVjdGAsIGBpc09iamVjdExpa2VgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsXG4gICAgICogYGlzU2FmZUludGVnZXJgLCBgaXNTZXRgLCBgaXNTdHJpbmdgLCBgaXNVbmRlZmluZWRgLCBgaXNUeXBlZEFycmF5YCxcbiAgICAgKiBgaXNXZWFrTWFwYCwgYGlzV2Vha1NldGAsIGBqb2luYCwgYGtlYmFiQ2FzZWAsIGBsYXN0YCwgYGxhc3RJbmRleE9mYCxcbiAgICAgKiBgbG93ZXJDYXNlYCwgYGxvd2VyRmlyc3RgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtYXhCeWAsIGBtZWFuYCwgYG1lYW5CeWAsXG4gICAgICogYG1pbmAsIGBtaW5CeWAsIGBtdWx0aXBseWAsIGBub0NvbmZsaWN0YCwgYG5vb3BgLCBgbm93YCwgYG50aGAsIGBwYWRgLFxuICAgICAqIGBwYWRFbmRgLCBgcGFkU3RhcnRgLCBgcGFyc2VJbnRgLCBgcG9wYCwgYHJhbmRvbWAsIGByZWR1Y2VgLCBgcmVkdWNlUmlnaHRgLFxuICAgICAqIGByZXBlYXRgLCBgcmVzdWx0YCwgYHJvdW5kYCwgYHJ1bkluQ29udGV4dGAsIGBzYW1wbGVgLCBgc2hpZnRgLCBgc2l6ZWAsXG4gICAgICogYHNuYWtlQ2FzZWAsIGBzb21lYCwgYHNvcnRlZEluZGV4YCwgYHNvcnRlZEluZGV4QnlgLCBgc29ydGVkTGFzdEluZGV4YCxcbiAgICAgKiBgc29ydGVkTGFzdEluZGV4QnlgLCBgc3RhcnRDYXNlYCwgYHN0YXJ0c1dpdGhgLCBgc3R1YkFycmF5YCwgYHN0dWJGYWxzZWAsXG4gICAgICogYHN0dWJPYmplY3RgLCBgc3R1YlN0cmluZ2AsIGBzdHViVHJ1ZWAsIGBzdWJ0cmFjdGAsIGBzdW1gLCBgc3VtQnlgLFxuICAgICAqIGB0ZW1wbGF0ZWAsIGB0aW1lc2AsIGB0b0Zpbml0ZWAsIGB0b0ludGVnZXJgLCBgdG9KU09OYCwgYHRvTGVuZ3RoYCxcbiAgICAgKiBgdG9Mb3dlcmAsIGB0b051bWJlcmAsIGB0b1NhZmVJbnRlZ2VyYCwgYHRvU3RyaW5nYCwgYHRvVXBwZXJgLCBgdHJpbWAsXG4gICAgICogYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYHRydW5jYXRlYCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYHVwcGVyQ2FzZWAsXG4gICAgICogYHVwcGVyRmlyc3RgLCBgdmFsdWVgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQG5hbWUgX1xuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyLCAzXSk7XG4gICAgICpcbiAgICAgKiAvLyBSZXR1cm5zIGFuIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiB3cmFwcGVkLnJlZHVjZShfLmFkZCk7XG4gICAgICogLy8gPT4gNlxuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhIHdyYXBwZWQgdmFsdWUuXG4gICAgICogdmFyIHNxdWFyZXMgPSB3cmFwcGVkLm1hcChzcXVhcmUpO1xuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoc3F1YXJlcy52YWx1ZSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbG9kYXNoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2Rhc2hXcmFwcGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnX193cmFwcGVkX18nKSkge1xuICAgICAgICAgIHJldHVybiB3cmFwcGVyQ2xvbmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBvYmplY3QoKSB7fVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmplY3RDcmVhdGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0O1xuICAgICAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KCkpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGZ1bmN0aW9uIHdob3NlIHByb3RvdHlwZSBjaGFpbiBzZXF1ZW5jZSB3cmFwcGVycyBpbmhlcml0IGZyb20uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMb2Rhc2goKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7XG4gICAgICB0aGlzLl9faW5kZXhfXyA9IDA7XG4gICAgICB0aGlzLl9fdmFsdWVzX18gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHRlbXBsYXRlIGRlbGltaXRlcnMgdXNlZCBieSBsb2Rhc2ggYXJlIGxpa2UgdGhvc2UgaW5cbiAgICAgKiBlbWJlZGRlZCBSdWJ5IChFUkIpIGFzIHdlbGwgYXMgRVMyMDE1IHRlbXBsYXRlIHN0cmluZ3MuIENoYW5nZSB0aGVcbiAgICAgKiBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqL1xuICAgIGxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzID0ge1xuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdlc2NhcGUnOiByZUVzY2FwZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBjb2RlIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXZhbHVhdGUnOiByZUV2YWx1YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gaW5qZWN0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtSZWdFeHB9XG4gICAgICAgKi9cbiAgICAgICdpbnRlcnBvbGF0ZSc6IHJlSW50ZXJwb2xhdGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3NcbiAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgKi9cbiAgICAgICd2YXJpYWJsZSc6ICcnLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gaW1wb3J0IHZhcmlhYmxlcyBpbnRvIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICovXG4gICAgICAnaW1wb3J0cyc6IHtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNcbiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgICAgICAgKi9cbiAgICAgICAgJ18nOiBsb2Rhc2hcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxuICAgIGxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbG9kYXNoO1xuXG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUgPSBiYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTtcbiAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExvZGFzaFdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbGF6eSB3cmFwcGVyIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBsYXp5IGV2YWx1YXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpIHtcbiAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgICAgIHRoaXMuX19kaXJfXyA9IDE7XG4gICAgICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGVlc19fID0gW107XG4gICAgICB0aGlzLl9fdGFrZUNvdW50X18gPSBNQVhfQVJSQVlfTEVOR1RIO1xuICAgICAgdGhpcy5fX3ZpZXdzX18gPSBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGxhenkgd3JhcHBlciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsb25lXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlDbG9uZSgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcy5fX3dyYXBwZWRfXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19kaXJfXyA9IHRoaXMuX19kaXJfXztcbiAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0aGlzLl9fZmlsdGVyZWRfXztcbiAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fID0gY29weUFycmF5KHRoaXMuX19pdGVyYXRlZXNfXyk7XG4gICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IHRoaXMuX190YWtlQ291bnRfXztcbiAgICAgIHJlc3VsdC5fX3ZpZXdzX18gPSBjb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgZGlyZWN0aW9uIG9mIGxhenkgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSByZXZlcnNlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IHJldmVyc2VkIGBMYXp5V3JhcHBlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhenlSZXZlcnNlKCkge1xuICAgICAgaWYgKHRoaXMuX19maWx0ZXJlZF9fKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIHJlc3VsdC5fX2Rpcl9fID0gLTE7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyAqPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdHMgdGhlIHVud3JhcHBlZCB2YWx1ZSBmcm9tIGl0cyBsYXp5IHdyYXBwZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5VmFsdWUoKSB7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksXG4gICAgICAgICAgZGlyID0gdGhpcy5fX2Rpcl9fLFxuICAgICAgICAgIGlzQXJyID0gaXNBcnJheShhcnJheSksXG4gICAgICAgICAgaXNSaWdodCA9IGRpciA8IDAsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gaXNBcnIgPyBhcnJheS5sZW5ndGggOiAwLFxuICAgICAgICAgIHZpZXcgPSBnZXRWaWV3KDAsIGFyckxlbmd0aCwgdGhpcy5fX3ZpZXdzX18pLFxuICAgICAgICAgIHN0YXJ0ID0gdmlldy5zdGFydCxcbiAgICAgICAgICBlbmQgPSB2aWV3LmVuZCxcbiAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCxcbiAgICAgICAgICBpbmRleCA9IGlzUmlnaHQgPyBlbmQgOiAoc3RhcnQgLSAxKSxcbiAgICAgICAgICBpdGVyYXRlZXMgPSB0aGlzLl9faXRlcmF0ZWVzX18sXG4gICAgICAgICAgaXRlckxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHRha2VDb3VudCA9IG5hdGl2ZU1pbihsZW5ndGgsIHRoaXMuX190YWtlQ291bnRfXyk7XG5cbiAgICAgIGlmICghaXNBcnIgfHwgKCFpc1JpZ2h0ICYmIGFyckxlbmd0aCA9PSBsZW5ndGggJiYgdGFrZUNvdW50ID09IGxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksIHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlIChsZW5ndGgtLSAmJiByZXNJbmRleCA8IHRha2VDb3VudCkge1xuICAgICAgICBpbmRleCArPSBkaXI7XG5cbiAgICAgICAgdmFyIGl0ZXJJbmRleCA9IC0xLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07XG5cbiAgICAgICAgd2hpbGUgKCsraXRlckluZGV4IDwgaXRlckxlbmd0aCkge1xuICAgICAgICAgIHZhciBkYXRhID0gaXRlcmF0ZWVzW2l0ZXJJbmRleF0sXG4gICAgICAgICAgICAgIGl0ZXJhdGVlID0gZGF0YS5pdGVyYXRlZSxcbiAgICAgICAgICAgICAgdHlwZSA9IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX01BUF9GTEFHKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXB1dGVkO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIWNvbXB1dGVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYExhenlXcmFwcGVyYCBpcyBhbiBpbnN0YW5jZSBvZiBgYmFzZUxvZGFzaGAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5hdGl2ZUNyZWF0ZSA/IG5hdGl2ZUNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaGFzaCBUaGUgaGFzaCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpID8gZGF0YVtrZXldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGhhc2ggYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIEhhc2hcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoU2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgICAgIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gICAgICBkYXRhW2tleV0gPSAobmF0aXZlQ3JlYXRlICYmIHZhbHVlID09PSB1bmRlZmluZWQpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBIYXNoYC5cbiAgICBIYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbiAgICBIYXNoLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBoYXNoRGVsZXRlO1xuICAgIEhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XG4gICAgSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbiAgICBIYXNoLnByb3RvdHlwZS5zZXQgPSBoYXNoU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gW107XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XG4gICAgICBpZiAoaW5kZXggPT0gbGFzdEluZGV4KSB7XG4gICAgICAgIGRhdGEucG9wKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGxpY2UuY2FsbChkYXRhLCBpbmRleCwgMSk7XG4gICAgICB9XG4gICAgICAtLXRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUdldChrZXkpIHtcbiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkIDogZGF0YVtpbmRleF1bMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICArK3RoaXMuc2l6ZTtcbiAgICAgICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG4gICAgTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgIHRoaXMuX19kYXRhX18gPSB7XG4gICAgICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLFxuICAgICAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAgYGtleWAgdG8gYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgc2V0XG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZVNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC5cbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBhZGRcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAYWxpYXMgcHVzaFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNhY2hlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU2V0Q2FjaGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuICAgIFNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xuICAgIFNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTGlzdENhY2hlKGVudHJpZXMpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbGVhclxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBkZWxldGVcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgcmVzdWx0ID0gZGF0YVsnZGVsZXRlJ10oa2V5KTtcblxuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHN0YWNrIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBTdGFja1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBzdGFjayBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSkge1xuICAgICAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgICAgICBpZiAoIU1hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7XG4gICAgICAgICAgcGFpcnMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgICAgIH1cbiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC5cbiAgICBTdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyO1xuICAgIFN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcbiAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7XG4gICAgU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzO1xuICAgIFN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgdGhlIGFycmF5LWxpa2UgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKSxcbiAgICAgICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50cyh2YWx1ZSksXG4gICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICAgICAgaXNUeXBlID0gIWlzQXJyICYmICFpc0FyZyAmJiAhaXNCdWZmICYmIGlzVHlwZWRBcnJheSh2YWx1ZSksXG4gICAgICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLFxuICAgICAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoXG4gICAgICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuXG4gICAgICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLlxuICAgICAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8XG4gICAgICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHxcbiAgICAgICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICAgICApKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGUoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbYmFzZVJhbmRvbSgwLCBsZW5ndGggLSAxKV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZVNpemVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zaHVmZmxlYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzaHVmZmxlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnJheVNodWZmbGUoYXJyYXkpIHtcbiAgICAgIHJldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnblxuICAgICAqIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIGB2YWx1ZWAgdG8gYGtleWAgb2YgYG9iamVjdGAgaWYgdGhlIGV4aXN0aW5nIHZhbHVlIGlzIG5vdCBlcXVpdmFsZW50XG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgICAgICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEoa2V5IGluIG9iamVjdCkpKSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBga2V5YCBpcyBmb3VuZCBpbiBgYXJyYXlgIG9mIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWdncmVnYXRlcyBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgb24gYGFjY3VtdWxhdG9yYCB3aXRoIGtleXMgdHJhbnNmb3JtZWRcbiAgICAgKiBieSBgaXRlcmF0ZWVgIGFuZCB2YWx1ZXMgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQWdncmVnYXRvcihjb2xsZWN0aW9uLCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXNcbiAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25JbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduSW4ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0XG4gICAgICogdmFsdWUgY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIGRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgICAgICAgJ2VudW1lcmFibGUnOiB0cnVlLFxuICAgICAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgICAgICd3cml0YWJsZSc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUF0KG9iamVjdCwgcGF0aHMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgIHNraXAgPSBvYmplY3QgPT0gbnVsbDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IHNraXAgPyB1bmRlZmluZWQgOiBnZXQob2JqZWN0LCBwYXRoc1tpbmRleF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbGFtcGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAobnVtYmVyID09PSBudW1iZXIpIHtcbiAgICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPD0gdXBwZXIgPyBudW1iZXIgOiB1cHBlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG51bWJlciA9IG51bWJlciA+PSBsb3dlciA/IG51bWJlciA6IGxvd2VyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3NcbiAgICAgKiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gRGVlcCBjbG9uZVxuICAgICAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllc1xuICAgICAqICA0IC0gQ2xvbmUgc3ltYm9sc1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsXG4gICAgICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRyxcbiAgICAgICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHO1xuXG4gICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICByZXN1bHQgPSBvYmplY3QgPyBjdXN0b21pemVyKHZhbHVlLCBrZXksIG9iamVjdCwgc3RhY2spIDogY3VzdG9taXplcih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpO1xuICAgICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IGluaXRDbG9uZUFycmF5KHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc0RlZXApIHtcbiAgICAgICAgICByZXR1cm4gY29weUFycmF5KHZhbHVlLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICAgIGlzRnVuYyA9IHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG5cbiAgICAgICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNGbGF0XG4gICAgICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKVxuICAgICAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHtcbiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLlxuICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkO1xuICAgICAgfVxuICAgICAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpO1xuXG4gICAgICBpZiAoaXNTZXQodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHtcbiAgICAgICAgICByZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3ViVmFsdWUsIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNNYXAodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIga2V5c0Z1bmMgPSBpc0Z1bGxcbiAgICAgICAgPyAoaXNGbGF0ID8gZ2V0QWxsS2V5c0luIDogZ2V0QWxsS2V5cylcbiAgICAgICAgOiAoaXNGbGF0ID8ga2V5c0luIDoga2V5cyk7XG5cbiAgICAgIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkIDoga2V5c0Z1bmModmFsdWUpO1xuICAgICAgYXJyYXlFYWNoKHByb3BzIHx8IHZhbHVlLCBmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7XG4gICAgICAgIGlmIChwcm9wcykge1xuICAgICAgICAgIGtleSA9IHN1YlZhbHVlO1xuICAgICAgICAgIHN1YlZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBhc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIHByb3BzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcykge1xuICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5ndGhdLFxuICAgICAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sXG4gICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgIGlmICgodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB8fCAhcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBgYXJnc2BcbiAgICAgKiB0byBwcm92aWRlIHRvIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3MpOyB9LCB3YWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZGlmZmVyZW5jZWAgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGV4Y2x1ZGluZyBtdWx0aXBsZSBhcnJheXMgb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgdmFsdWVzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aDtcblxuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHZhbHVlc0luZGV4LS0pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbdmFsdWVzSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyh2YWx1ZXMsIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JFYWNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqL1xuICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmV2ZXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICAgKiAgZWxzZSBgZmFsc2VgXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRydWU7XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ubWF4YCBhbmQgYF8ubWluYCB3aGljaCBhY2NlcHRzIGFcbiAgICAgKiBgY29tcGFyYXRvcmAgdG8gZGV0ZXJtaW5lIHRoZSBleHRyZW11bSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgdXNlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAoY3VycmVudCA9PT0gY3VycmVudCAmJiAhaXNTeW1ib2woY3VycmVudCkpXG4gICAgICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICB2YXIgY29tcHV0ZWQgPSBjdXJyZW50LFxuICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiBsZW5ndGgpID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICBpZiAoZW5kIDwgMCkge1xuICAgICAgICBlbmQgKz0gbGVuZ3RoO1xuICAgICAgfVxuICAgICAgZW5kID0gc3RhcnQgPiBlbmQgPyAwIDogdG9MZW5ndGgoZW5kKTtcbiAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkge1xuICAgICAgICBhcnJheVtzdGFydCsrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgcHJlZGljYXRlIHx8IChwcmVkaWNhdGUgPSBpc0ZsYXR0ZW5hYmxlKTtcbiAgICAgIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgXG4gICAgICogcHJvcGVydGllcyByZXR1cm5lZCBieSBga2V5c0Z1bmNgIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yID0gY3JlYXRlQmFzZUZvcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlRm9yYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXNcbiAgICAgKiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgdmFyIGJhc2VGb3JSaWdodCA9IGNyZWF0ZUJhc2VGb3IodHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duUmlnaHRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvclJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZ1bmN0aW9uc2Agd2hpY2ggY3JlYXRlcyBhbiBhcnJheSBvZlxuICAgICAqIGBvYmplY3RgIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZpbHRlcmVkIGZyb20gYHByb3BzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LCBwcm9wcykge1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoaW5kZXggJiYgaW5kZXggPT0gbGVuZ3RoKSA/IG9iamVjdCA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0QWxsS2V5c2AgYW5kIGBnZXRBbGxLZXlzSW5gIHdoaWNoIHVzZXNcbiAgICAgKiBga2V5c0Z1bmNgIGFuZCBgc3ltYm9sc0Z1bmNgIHRvIGdldCB0aGUgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmRcbiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzeW1ib2xzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzRnVuYywgc3ltYm9sc0Z1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICAgICAgcmV0dXJuIGlzQXJyYXkob2JqZWN0KSA/IHJlc3VsdCA6IGFycmF5UHVzaChyZXN1bHQsIHN5bWJvbHNGdW5jKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgICAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICAgICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ3RgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUd0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID4gb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCwga2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluUmFuZ2VgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgcmV0dXJuIG51bWJlciA+PSBuYXRpdmVNaW4oc3RhcnQsIGVuZCkgJiYgbnVtYmVyIDwgbmF0aXZlTWF4KHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5pbnRlcnNlY3Rpb25gLCB3aXRob3V0IHN1cHBvcnRcbiAgICAgKiBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2Ygc2hhcmVkIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmNsdWRlcyA9IGNvbXBhcmF0b3IgPyBhcnJheUluY2x1ZGVzV2l0aCA6IGFycmF5SW5jbHVkZXMsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXlzWzBdLmxlbmd0aCxcbiAgICAgICAgICBvdGhMZW5ndGggPSBhcnJheXMubGVuZ3RoLFxuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoLFxuICAgICAgICAgIGNhY2hlcyA9IEFycmF5KG90aExlbmd0aCksXG4gICAgICAgICAgbWF4TGVuZ3RoID0gSW5maW5pdHksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07XG4gICAgICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkge1xuICAgICAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgICAgICB9XG4gICAgICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7XG4gICAgICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpXG4gICAgICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBhcnJheSA9IGFycmF5c1swXTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICAgICAgaWYgKCEoc2VlblxuICAgICAgICAgICAgICA/IGNhY2hlSGFzKHNlZW4sIGNvbXB1dGVkKVxuICAgICAgICAgICAgICA6IGluY2x1ZGVzKHJlc3VsdCwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgb3RoSW5kZXggPSBvdGhMZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKC0tb3RoSW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1tvdGhJbmRleF07XG4gICAgICAgICAgICBpZiAoIShjYWNoZVxuICAgICAgICAgICAgICAgICAgPyBjYWNoZUhhcyhjYWNoZSwgY29tcHV0ZWQpXG4gICAgICAgICAgICAgICAgICA6IGluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWVuKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52ZXJ0YCBhbmQgYF8uaW52ZXJ0QnlgIHdoaWNoIGludmVydHNcbiAgICAgKiBgb2JqZWN0YCB3aXRoIHZhbHVlcyB0cmFuc2Zvcm1lZCBieSBgaXRlcmF0ZWVgIGFuZCBzZXQgYnkgYHNldHRlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIGl0ZXJhdGVlKHZhbHVlKSwga2V5LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBtZXRob2QgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICAgIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FycmF5QnVmZmVyYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRGF0ZWAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNEYXRlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBkYXRlVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzRXF1YWxgIHdoaWNoIHN1cHBvcnRzIHBhcnRpYWwgY29tcGFyaXNvbnNcbiAgICAgKiBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAxIC0gVW5vcmRlcmVkIGNvbXBhcmlzb25cbiAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLFxuICAgICAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gICAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcbiAgICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xuXG4gICAgICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gICAgICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICAgICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgb2JqSXNBcnIgPSB0cnVlO1xuICAgICAgICBvYmpJc09iaiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spXG4gICAgICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7XG4gICAgICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgICAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkge1xuICAgICAgICAgIHZhciBvYmpVbndyYXBwZWQgPSBvYmpJc1dyYXBwZWQgPyBvYmplY3QudmFsdWUoKSA6IG9iamVjdCxcbiAgICAgICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgICByZXR1cm4gZXF1YWxGdW5jKG9ialVud3JhcHBlZCwgb3RoVW53cmFwcGVkLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaXNTYW1lVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBtYXRjaERhdGEgVGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBpbmRleCxcbiAgICAgICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAhbGVuZ3RoO1xuICAgICAgfVxuICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIGlmICgobm9DdXN0b21pemVyICYmIGRhdGFbMl0pXG4gICAgICAgICAgICAgID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dXG4gICAgICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgICAgIHZhciBrZXkgPSBkYXRhWzBdLFxuICAgICAgICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgICAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHtcbiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghKHJlc3VsdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbixcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzUmVnRXhwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNSZWdFeHAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHJlZ2V4cFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1NldGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHNldFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pdGVyYXRlZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgaXRlcmF0ZWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XG4gICAgICAvLyBEb24ndCBzdG9yZSB0aGUgYHR5cGVvZmAgcmVzdWx0IGluIGEgdmFyaWFibGUgdG8gYXZvaWQgYSBKSVQgYnVnIGluIFNhZmFyaSA5LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICAgICAgOiBiYXNlTWF0Y2hlcyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNgIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XG4gICAgICBpZiAoIWlzUHJvdG90eXBlKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICBpZiAoIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubHRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDwgb3RoZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdO1xuXG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHZhciBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcbiAgICAgIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpXG4gICAgICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICAgICAgOiBiYXNlSXNFcXVhbChzcmNWYWx1ZSwgb2JqVmFsdWUsIENPTVBBUkVfUEFSVElBTF9GTEFHIHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1lcmdlYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgbWVyZ2VkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmIChvYmplY3QgPT09IHNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBiYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkge1xuICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgICBpZiAoaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgICAgYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgYmFzZU1lcmdlLCBjdXN0b21pemVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgICAgPyBjdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LCBrZXkpLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9LCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykge1xuICAgICAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksXG4gICAgICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSxcbiAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTtcblxuICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgc3RhY2tlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgPyBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwgKGtleSArICcnKSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkoc3JjVmFsdWUpLFxuICAgICAgICAgICAgaXNCdWZmID0gIWlzQXJyICYmIGlzQnVmZmVyKHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkge1xuICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7XG4gICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDb21tb24pIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpO1xuICAgICAgfVxuICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm50aGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTnRoKGFycmF5LCBuKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbiArPSBuIDwgMCA/IGxlbmd0aCA6IDA7XG4gICAgICByZXR1cm4gaXNJbmRleChuLCBsZW5ndGgpID8gYXJyYXlbbl0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xO1xuICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLmxlbmd0aCA/IGl0ZXJhdGVlcyA6IFtpZGVudGl0eV0sIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFsdWUgPSBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICAgIHZhciBsb3cgPSAwLFxuICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICB2YWxJc05hTiA9IHZhbHVlICE9PSB2YWx1ZSxcbiAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCxcbiAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKSxcbiAgICAgICAgICB2YWxJc1VuZGVmaW5lZCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksXG4gICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gY29tcHV0ZWQgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IGNvbXB1dGVkID09PSBjb21wdXRlZCxcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2woY29tcHV0ZWQpO1xuXG4gICAgICAgIGlmICh2YWxJc05hTikge1xuICAgICAgICAgIHZhciBzZXRMb3cgPSByZXRIaWdoZXN0IHx8IG90aElzUmVmbGV4aXZlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzVW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgKHJldEhpZ2hlc3QgfHwgb3RoSXNEZWZpbmVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc051bGwpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzTnVsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNTeW1ib2wpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiBvdGhJc0RlZmluZWQgJiYgIW90aElzTnVsbCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNTeW1ib2wpO1xuICAgICAgICB9IGVsc2UgaWYgKG90aElzTnVsbCB8fCBvdGhJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldExvdyA9IHJldEhpZ2hlc3QgPyAoY29tcHV0ZWQgPD0gdmFsdWUpIDogKGNvbXB1dGVkIDwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXRMb3cpIHtcbiAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVNaW4oaGlnaCwgTUFYX0FSUkFZX0lOREVYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0XG4gICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICBpZiAoIWluZGV4IHx8ICFlcShjb21wdXRlZCwgc2VlbikpIHtcbiAgICAgICAgICB2YXIgc2VlbiA9IGNvbXB1dGVkO1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlID09PSAwID8gMCA6IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0XG4gICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5BTjtcbiAgICAgIH1cbiAgICAgIHJldHVybiArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9TdHJpbmdgIHdoaWNoIGRvZXNuJ3QgY29udmVydCBudWxsaXNoXG4gICAgICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmlxQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaXNDb21tb24gPSB0cnVlLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHNlZW4gPSByZXN1bHQ7XG5cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTtcbiAgICAgICAgaWYgKHNldCkge1xuICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkge1xuICAgICAgICAgICAgaWYgKHNlZW5bc2VlbkluZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpbmNsdWRlcyhzZWVuLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5zZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIHRvIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbnNldChvYmplY3QsIHBhdGgpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgfHwgZGVsZXRlIG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7XG4gICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRyb3BXaGlsZWAgYW5kIGBfLnRha2VXaGlsZWBcbiAgICAgKiB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0Ryb3BdIFNwZWNpZnkgZHJvcHBpbmcgZWxlbWVudHMgaW5zdGVhZCBvZiB0YWtpbmcgdGhlbS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUsIGlzRHJvcCwgZnJvbVJpZ2h0KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTE7XG5cbiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpICYmXG4gICAgICAgIHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHt9XG5cbiAgICAgIHJldHVybiBpc0Ryb3BcbiAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSlcbiAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHdyYXBwZXJWYWx1ZWAgd2hpY2ggcmV0dXJucyB0aGUgcmVzdWx0IG9mXG4gICAgICogcGVyZm9ybWluZyBhIHNlcXVlbmNlIG9mIGFjdGlvbnMgb24gdGhlIHVud3JhcHBlZCBgdmFsdWVgLCB3aGVyZSBlYWNoXG4gICAgICogc3VjY2Vzc2l2ZSBhY3Rpb24gaXMgc3VwcGxpZWQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJldmlvdXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhY3Rpb25zIEFjdGlvbnMgdG8gcGVyZm9ybSB0byByZXNvbHZlIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VXcmFwcGVyVmFsdWUodmFsdWUsIGFjdGlvbnMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLCBmdW5jdGlvbihyZXN1bHQsIGFjdGlvbikge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmZ1bmMuYXBwbHkoYWN0aW9uLnRoaXNBcmcsIGFycmF5UHVzaChbcmVzdWx0XSwgYWN0aW9uLmFyZ3MpKTtcbiAgICAgIH0sIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLnhvcmAsIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLCB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5cyBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVhvcihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXlzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlVW5pcShhcnJheXNbMF0pIDogW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLFxuICAgICAgICAgICAgb3RoSW5kZXggPSAtMTtcblxuICAgICAgICB3aGlsZSAoKytvdGhJbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChvdGhJbmRleCAhPSBpbmRleCkge1xuICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF0gfHwgYXJyYXksIGFycmF5c1tvdGhJbmRleF0sIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihyZXN1bHQsIDEpLCBpdGVyYXRlZSwgY29tcGFyYXRvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnppcE9iamVjdGAgd2hpY2ggYXNzaWducyB2YWx1ZXMgdXNpbmcgYGFzc2lnbkZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICBhc3NpZ25GdW5jKHJlc3VsdCwgcHJvcHNbaW5kZXhdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYW4gZW1wdHkgYXJyYXkgaWYgaXQncyBub3QgYW4gYXJyYXkgbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0QXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpID8gdmFsdWUgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhIHBhdGggYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0tleSh2YWx1ZSwgb2JqZWN0KSA/IFt2YWx1ZV0gOiBzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGBiYXNlUmVzdGAgYWxpYXMgd2hpY2ggY2FuIGJlIHJlcGxhY2VkIHdpdGggYGlkZW50aXR5YCBieSBtb2R1bGVcbiAgICAgKiByZXBsYWNlbWVudCBwbHVnaW5zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgY2FzdFJlc3QgPSBiYXNlUmVzdDtcblxuICAgIC8qKlxuICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICAgICAgcmV0dXJuICghc3RhcnQgJiYgZW5kID49IGxlbmd0aCkgPyBhcnJheSA6IGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYGNsZWFyVGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL2NsZWFyVGltZW91dCkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gaWQgVGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0IG9mIHRoZSB0aW1lciB0byBjbGVhci5cbiAgICAgKi9cbiAgICB2YXIgY2xlYXJUaW1lb3V0ID0gY3R4Q2xlYXJUaW1lb3V0IHx8IGZ1bmN0aW9uKGlkKSB7XG4gICAgICByZXR1cm4gcm9vdC5jbGVhclRpbWVvdXQoaWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtcblxuICAgICAgYnVmZmVyLmNvcHkocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGBhcnJheUJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGFycmF5QnVmZmVyIFRoZSBhcnJheSBidWZmZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge0FycmF5QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYXJyYXkgYnVmZmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICBuZXcgVWludDhBcnJheShyZXN1bHQpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjtcbiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgcmVnZXhwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSwgcmVGbGFncy5leGVjKHJlZ2V4cCkpO1xuICAgICAgcmVzdWx0Lmxhc3RJbmRleCA9IHJlZ2V4cC5sYXN0SW5kZXg7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgYHN5bWJvbGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3ltYm9sIFRoZSBzeW1ib2wgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBzeW1ib2wgb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lU3ltYm9sKHN5bWJvbCkge1xuICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YgPyBPYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHtcbiAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlQXNjZW5kaW5nKHZhbHVlLCBvdGhlcikge1xuICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xuICAgICAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsXG4gICAgICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxuICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgICAgICBvdGhJc1N5bWJvbCA9IGlzU3ltYm9sKG90aGVyKTtcblxuICAgICAgICBpZiAoKCFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sICYmICF2YWxJc1N5bWJvbCAmJiB2YWx1ZSA+IG90aGVyKSB8fFxuICAgICAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCF2YWxJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcbiAgICAgICAgICAgIChvdGhJc051bGwgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLlxuICAgICAqXG4gICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvciBkZXNjZW5kaW5nIG9yIFwiYXNjXCIgZm9yIGFzY2VuZGluZyBzb3J0IG9yZGVyXG4gICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtib29sZWFuW118c3RyaW5nW119IG9yZGVycyBUaGUgb3JkZXIgdG8gc29ydCBieSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICAgICAgb3RoQ3JpdGVyaWEgPSBvdGhlci5jcml0ZXJpYSxcbiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXG4gICAgICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgaWYgKGluZGV4ID49IG9yZGVyc0xlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9yZGVyID0gb3JkZXJzW2luZGV4XTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnNcbiAgICAgIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gICAgICAvLyBgb2JqZWN0YCBhbmQgYG90aGVyYC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXNoa2VuYXMvdW5kZXJzY29yZS9wdWxsLzEyNDdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBhbHNvIGVuc3VyZXMgYSBzdGFibGUgc29ydCBpbiBWOCBhbmQgb3RoZXIgZW5naW5lcy5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLFxuICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsrYXJnc0luZGV4IDwgaG9sZGVyc0xlbmd0aCkge1xuICAgICAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgICAgIHJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAocmFuZ2VMZW5ndGgtLSkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4KytdID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAgICAgKiBpcyB0YWlsb3JlZCBmb3IgYF8ucGFydGlhbFJpZ2h0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgICAgIHZhciBhcmdzSW5kZXggPSAtMSxcbiAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgaG9sZGVyc0luZGV4ID0gLTEsXG4gICAgICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgICAgICByaWdodExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICAgICAgaXNVbmN1cnJpZWQgPSAhaXNDdXJyaWVkO1xuXG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkge1xuICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgICAgIH1cbiAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7XG4gICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgdGhlIHZhbHVlcyBvZiBgc291cmNlYCB0byBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7XG5cbiAgICAgIGFycmF5IHx8IChhcnJheSA9IEFycmF5KGxlbmd0aCkpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7XG4gICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbaW5kZXhdO1xuXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHMoc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzSW4oc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvcixcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgc2V0dGVyLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uYXNzaWduYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduZXIgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYXNzaWduZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpIHtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCxcbiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPiAxID8gc291cmNlc1tsZW5ndGggLSAxXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY3VzdG9taXplciA9IChhc3NpZ25lci5sZW5ndGggPiAzICYmIHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgPyAobGVuZ3RoLS0sIGN1c3RvbWl6ZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICAgIGN1c3RvbWl6ZXIgPSBsZW5ndGggPCAzID8gdW5kZWZpbmVkIDogY3VzdG9taXplcjtcbiAgICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSwgaW5kZXgsIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksXG4gICAgICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICAgICAgPyBzdHJpbmdUb0FycmF5KHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgICAgID8gc3RyU3ltYm9sc1swXVxuICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTtcblxuICAgICAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMSkuam9pbignJylcbiAgICAgICAgICA6IHN0cmluZy5zbGljZSgxKTtcblxuICAgICAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGluc3RhbmNlIG9mIGBDdG9yYCByZWdhcmRsZXNzIG9mXG4gICAgICogd2hldGhlciBpdCB3YXMgaW52b2tlZCBhcyBwYXJ0IG9mIGEgYG5ld2AgZXhwcmVzc2lvbiBvciBieSBgY2FsbGAgb3IgYGFwcGx5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ3RvciBUaGUgY29uc3RydWN0b3IgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN0b3IoQ3Rvcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBVc2UgYSBgc3dpdGNoYCBzdGF0ZW1lbnQgdG8gd29yayB3aXRoIGNsYXNzIGNvbnN0cnVjdG9ycy4gU2VlXG4gICAgICAgIC8vIGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtZnVuY3Rpb24tb2JqZWN0cy1jYWxsLXRoaXNhcmd1bWVudC1hcmd1bWVudHNsaXN0XG4gICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSk7XG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICAgICAgY2FzZSA3OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwgYXJnc1s2XSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgICAgICByZXN1bHQgPSBDdG9yLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcblxuICAgICAgICAvLyBNaW1pYyB0aGUgY29uc3RydWN0b3IncyBgcmV0dXJuYCBiZWhhdmlvci5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IHRoaXNCaW5kaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkge1xuICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKTtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IHJlcGxhY2VIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcblxuICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcmdzLCBob2xkZXJzLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkgLSBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8uZmluZGAgb3IgYF8uZmluZExhc3RgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaW5kSW5kZXhGdW5jIFRoZSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb2xsZWN0aW9uIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZpbmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmluZChmaW5kSW5kZXhGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpIHtcbiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKTtcbiAgICAgICAgICBjb2xsZWN0aW9uID0ga2V5cyhjb2xsZWN0aW9uKTtcbiAgICAgICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpO1xuICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCxcbiAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLFxuICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTtcblxuICAgICAgICBpZiAoZnJvbVJpZ2h0KSB7XG4gICAgICAgICAgZnVuY3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgdmFyIGZ1bmMgPSBmdW5jc1tpbmRleF07XG4gICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHByZXJlcSAmJiAhd3JhcHBlciAmJiBnZXRGdW5jTmFtZShmdW5jKSA9PSAnd3JhcHBlcicpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gbmV3IExvZGFzaFdyYXBwZXIoW10sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IHdyYXBwZXIgPyBpbmRleCA6IGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBmdW5jID0gZnVuY3NbaW5kZXhdO1xuXG4gICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICAgICAgICAgIGRhdGEgPSBmdW5jTmFtZSA9PSAnd3JhcHBlcicgPyBnZXREYXRhKGZ1bmMpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGRhdGEgJiYgaXNMYXppYWJsZShkYXRhWzBdKSAmJlxuICAgICAgICAgICAgICAgIGRhdGFbMV0gPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykgJiZcbiAgICAgICAgICAgICAgICAhZGF0YVs0XS5sZW5ndGggJiYgZGF0YVs5XSA9PSAxXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgd3JhcHBlciA9IHdyYXBwZXJbZ2V0RnVuY05hbWUoZGF0YVswXSldLmFwcGx5KHdyYXBwZXIsIGRhdGFbM10pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gKGZ1bmMubGVuZ3RoID09IDEgJiYgaXNMYXppYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgPyB3cmFwcGVyW2Z1bmNOYW1lXSgpXG4gICAgICAgICAgICAgIDogd3JhcHBlci50aHJ1KGZ1bmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgICAgIHZhbHVlID0gYXJnc1swXTtcblxuICAgICAgICAgIGlmICh3cmFwcGVyICYmIGFyZ3MubGVuZ3RoID09IDEgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgICByZXN1bHQgPSBsZW5ndGggPyBmdW5jc1tpbmRleF0uYXBwbHkodGhpcywgYXJncykgOiB2YWx1ZTtcblxuICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIG9wdGlvbmFsIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgYHRoaXNBcmdgLCBwYXJ0aWFsIGFwcGxpY2F0aW9uLCBhbmQgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc1JpZ2h0XSBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZFxuICAgICAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzUmlnaHRdIFRoZSBgcGFydGlhbHNSaWdodGAgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVIeWJyaWQoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNBcnkgPSBiaXRtYXNrICYgV1JBUF9BUllfRkxBRyxcbiAgICAgICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICAgICAgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRyxcbiAgICAgICAgICBpc0N1cnJpZWQgPSBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyksXG4gICAgICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IGdldEhvbGRlcih3cmFwcGVyKSxcbiAgICAgICAgICAgICAgaG9sZGVyc0NvdW50ID0gY291bnRIb2xkZXJzKGFyZ3MsIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHMpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpYWxzUmlnaHQpIHtcbiAgICAgICAgICBhcmdzID0gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsIGlzQ3VycmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoIC09IGhvbGRlcnNDb3VudDtcbiAgICAgICAgaWYgKGlzQ3VycmllZCAmJiBsZW5ndGggPCBhcml0eSkge1xuICAgICAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KFxuICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB0aGlzQXJnLFxuICAgICAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgICAgIGZuID0gaXNCaW5kS2V5ID8gdGhpc0JpbmRpbmdbZnVuY10gOiBmdW5jO1xuXG4gICAgICAgIGxlbmd0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnUG9zKSB7XG4gICAgICAgICAgYXJncyA9IHJlb3JkZXIoYXJncywgYXJnUG9zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZsaXAgJiYgbGVuZ3RoID4gMSkge1xuICAgICAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FyeSAmJiBhcnkgPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSB7XG4gICAgICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzQmluZGluZywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgdXNlZCBmb3IgYHVuZGVmaW5lZGAgYXJndW1lbnRzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvciwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG90aGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLm92ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcnJheUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBpdGVyYXRlZXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgb3ZlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVPdmVyKGFycmF5RnVuYykge1xuICAgICAgcmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGl0ZXJhdGVlcykge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgICAgdmFyIHRoaXNBcmcgPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBhcnJheUZ1bmMoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGl0ZXJhdGVlLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYCBiYXNlZCBvbiBgbGVuZ3RoYC4gVGhlIGBjaGFyc2Agc3RyaW5nXG4gICAgICogaXMgdHJ1bmNhdGVkIGlmIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBleGNlZWRzIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFkZGluZyhsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBjaGFycyA9IGNoYXJzID09PSB1bmRlZmluZWQgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpO1xuXG4gICAgICB2YXIgY2hhcnNMZW5ndGggPSBjaGFycy5sZW5ndGg7XG4gICAgICBpZiAoY2hhcnNMZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiBjaGFyc0xlbmd0aCA/IGJhc2VSZXBlYXQoY2hhcnMsIGxlbmd0aCkgOiBjaGFycztcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlUmVwZWF0KGNoYXJzLCBuYXRpdmVDZWlsKGxlbmd0aCAvIHN0cmluZ1NpemUoY2hhcnMpKSk7XG4gICAgICByZXR1cm4gaGFzVW5pY29kZShjaGFycylcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShyZXN1bHQpLCAwLCBsZW5ndGgpLmpvaW4oJycpXG4gICAgICAgIDogcmVzdWx0LnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICAgICAqIG9mIGB0aGlzQXJnYCBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBDdG9yID0gY3JlYXRlQ3RvcihmdW5jKTtcblxuICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLFxuICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuXG4gICAgICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgICAgICBhcmdzW2xlZnRJbmRleCsrXSA9IGFyZ3VtZW50c1srK2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICAgICAgZW5kID0gc3RlcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmQgPSBzdGFydDtcbiAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgICAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBjb250aW51ZSBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyYXBGdW5jIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGBmdW5jYCB3cmFwcGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQ3VycnkgPSBiaXRtYXNrICYgV1JBUF9DVVJSWV9GTEFHLFxuICAgICAgICAgIG5ld0hvbGRlcnMgPSBpc0N1cnJ5ID8gaG9sZGVycyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXdQYXJ0aWFsc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCA6IHBhcnRpYWxzO1xuXG4gICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpO1xuXG4gICAgICBpZiAoIShiaXRtYXNrICYgV1JBUF9DVVJSWV9CT1VORF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICAgICAgfVxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgICAgICBuZXdIb2xkZXJzUmlnaHQsIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkge1xuICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5yb3VuZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgTWF0aGAgbWV0aG9kIHRvIHVzZSB3aGVuIHJvdW5kaW5nLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJvdW5kIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvdW5kKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gTWF0aFttZXRob2ROYW1lXTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgICBwcmVjaXNpb24gPSBwcmVjaXNpb24gPT0gbnVsbCA/IDAgOiBuYXRpdmVNaW4odG9JbnRlZ2VyKHByZWNpc2lvbiksIDI5Mik7XG4gICAgICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgICAgIC8vIFNoaWZ0IHdpdGggZXhwb25lbnRpYWwgbm90YXRpb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgaXNzdWVzLlxuICAgICAgICAgIC8vIFNlZSBbTUROXShodHRwczovL21kbi5pby9yb3VuZCNFeGFtcGxlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgICAgICB2YWx1ZSA9IGZ1bmMocGFpclswXSArICdlJyArICgrcGFpclsxXSArIHByZWNpc2lvbikpO1xuXG4gICAgICAgICAgcGFpciA9ICh0b1N0cmluZyh2YWx1ZSkgKyAnZScpLnNwbGl0KCdlJyk7XG4gICAgICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jKG51bWJlcik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICAgICAqL1xuICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYF8udG9QYWlyc2Agb3IgYF8udG9QYWlyc0luYCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBhIGdpdmVuIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYWlycyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciB0YWcgPSBnZXRUYWcob2JqZWN0KTtcbiAgICAgICAgaWYgKHRhZyA9PSBtYXBUYWcpIHtcbiAgICAgICAgICByZXR1cm4gbWFwVG9BcnJheShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LCBrZXlzRnVuYyhvYmplY3QpKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZWl0aGVyIGN1cnJpZXMgb3IgaW52b2tlcyBgZnVuY2Agd2l0aCBvcHRpb25hbFxuICAgICAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLlxuICAgICAqICAgIDEgLSBgXy5iaW5kYFxuICAgICAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICAgICAqICAgIDQgLSBgXy5jdXJyeWAgb3IgYF8uY3VycnlSaWdodGAgb2YgYSBib3VuZCBmdW5jdGlvblxuICAgICAqICAgIDggLSBgXy5jdXJyeWBcbiAgICAgKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAgICAgKiAgIDMyIC0gYF8ucGFydGlhbGBcbiAgICAgKiAgIDY0IC0gYF8ucGFydGlhbFJpZ2h0YFxuICAgICAqICAxMjggLSBgXy5yZWFyZ2BcbiAgICAgKiAgMjU2IC0gYF8uYXJ5YFxuICAgICAqICA1MTIgLSBgXy5mbGlwYFxuICAgICAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVdyYXAoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICAgICAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gICAgICBpZiAoIWlzQmluZEtleSAmJiB0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXJ0aWFscyA/IHBhcnRpYWxzLmxlbmd0aCA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgICAgIGFyaXR5ID0gYXJpdHkgPT09IHVuZGVmaW5lZCA/IGFyaXR5IDogdG9JbnRlZ2VyKGFyaXR5KTtcbiAgICAgIGxlbmd0aCAtPSBob2xkZXJzID8gaG9sZGVycy5sZW5ndGggOiAwO1xuXG4gICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsXG4gICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzO1xuXG4gICAgICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHZhciBkYXRhID0gaXNCaW5kS2V5ID8gdW5kZWZpbmVkIDogZ2V0RGF0YShmdW5jKTtcblxuICAgICAgdmFyIG5ld0RhdGEgPSBbXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBwYXJ0aWFsc1JpZ2h0LCBob2xkZXJzUmlnaHQsXG4gICAgICAgIGFyZ1BvcywgYXJ5LCBhcml0eVxuICAgICAgXTtcblxuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgbWVyZ2VEYXRhKG5ld0RhdGEsIGRhdGEpO1xuICAgICAgfVxuICAgICAgZnVuYyA9IG5ld0RhdGFbMF07XG4gICAgICBiaXRtYXNrID0gbmV3RGF0YVsxXTtcbiAgICAgIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICAgICAgcGFydGlhbHMgPSBuZXdEYXRhWzNdO1xuICAgICAgaG9sZGVycyA9IG5ld0RhdGFbNF07XG4gICAgICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKVxuICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTtcblxuICAgICAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKTtcbiAgICAgIH0gZWxzZSBpZiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcgfHwgYml0bWFzayA9PSBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICAgICAgfSBlbHNlIGlmICgoYml0bWFzayA9PSBXUkFQX1BBUlRJQUxfRkxBRyB8fCBiaXRtYXNrID09IChXUkFQX0JJTkRfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHKSkgJiYgIWhvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdCA9IGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlSHlicmlkLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gICAgICB9XG4gICAgICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCwgbmV3RGF0YSksIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllc1xuICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIChlcShvYmpWYWx1ZSwgb2JqZWN0UHJvdG9ba2V5XSkgJiYgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gc3JjVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c0RlZXBgIHRvIGN1c3RvbWl6ZSBpdHMgYF8ubWVyZ2VgIHVzZSB0byBtZXJnZSBzb3VyY2VcbiAgICAgKiBvYmplY3RzIGludG8gZGVzdGluYXRpb24gb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdGhydS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBvYmpWYWx1ZSBUaGUgZGVzdGluYXRpb24gdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgc291cmNlIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHBhcmVudCBvYmplY3Qgb2YgYHNyY1ZhbHVlYC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZFxuICAgICAqICBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c01lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spIHtcbiAgICAgIGlmIChpc09iamVjdChvYmpWYWx1ZSkgJiYgaXNPYmplY3Qoc3JjVmFsdWUpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG9ialZhbHVlKTtcbiAgICAgICAgYmFzZU1lcmdlKG9ialZhbHVlLCBzcmNWYWx1ZSwgdW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7XG4gICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqVmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vbWl0YCB0byBjdXN0b21pemUgaXRzIGBfLmNsb25lRGVlcGAgdXNlIHRvIG9ubHkgY2xvbmUgcGxhaW5cbiAgICAgKiBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdW5jbG9uZWQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgdG8gZGVmZXIgY2xvbmluZyB0byBgXy5jbG9uZURlZXBgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICBpZiAoc3RhY2tlZCAmJiBzdGFjay5nZXQob3RoZXIpKSB7XG4gICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gdHJ1ZSxcbiAgICAgICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XG4gICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTtcblxuICAgICAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICAgICAgdmFyIGFyclZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWxcbiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKGFyclZhbHVlLCBvdGhWYWx1ZSwgaW5kZXgsIGFycmF5LCBvdGhlciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgaWYgKHNlZW4pIHtcbiAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHxcbiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaylcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAgICAgKiB0aGUgc2FtZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICAgICAqIGBCb29sZWFuYCwgYERhdGVgLCBgRXJyb3JgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCB0YWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAob2JqZWN0LmJ5dGVPZmZzZXQgIT0gb3RoZXIuYnl0ZU9mZnNldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmJ1ZmZlcjtcbiAgICAgICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIGNhc2UgYm9vbFRhZzpcbiAgICAgICAgY2FzZSBkYXRlVGFnOlxuICAgICAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLlxuICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuXG4gICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICAgICAgY2FzZSBlcnJvclRhZzpcbiAgICAgICAgICByZXR1cm4gb2JqZWN0Lm5hbWUgPT0gb3RoZXIubmFtZSAmJiBvYmplY3QubWVzc2FnZSA9PSBvdGhlci5tZXNzYWdlO1xuXG4gICAgICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICAvLyBDb2VyY2UgcmVnZXhlcyB0byBzdHJpbmdzIGFuZCB0cmVhdCBzdHJpbmdzLCBwcmltaXRpdmVzIGFuZCBvYmplY3RzLFxuICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuXG4gICAgICAgIGNhc2UgbWFwVGFnOlxuICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgICAgIGNvbnZlcnQgfHwgKGNvbnZlcnQgPSBzZXRUb0FycmF5KTtcblxuICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICAgICAgaWYgKHN0YWNrZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBiaXRtYXNrIHw9IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUc7XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICAgICAgb2JqUHJvcHMgPSBnZXRBbGxLZXlzKG9iamVjdCksXG4gICAgICAgICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxuICAgICAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoO1xuXG4gICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDtcbiAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leSdcbiAgICAgKi9cbiAgICB2YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZmxhdHRlbmVkIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aHJ1IGBpdGVyYXRlZWAgYW5kIGZsYXR0ZW5pbmcgdGhlIG1hcHBlZCByZXN1bHRzLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW24sIG5dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcChbMSwgMl0sIGR1cGxpY2F0ZSk7XG4gICAgICogLy8gPT4gWzEsIDEsIDIsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZWVwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwRGVlcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIElORklOSVRZKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZVxuICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7XG4gICAgICogICByZXR1cm4gW1tbbiwgbl1dXTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7XG4gICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHtcbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSksIGRlcHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIGVsZW1lbnQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciBcIkNvbGxlY3Rpb25zXCIgbWV0aG9kcywgb2JqZWN0cyB3aXRoIGEgXCJsZW5ndGhcIlxuICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBhbGlhcyBlYWNoXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gICAgICogQHNlZSBfLmZvckVhY2hSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLlxuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JFYWNoYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBhbGlhcyBlYWNoUmlnaHRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2hSaWdodChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMmAgdGhlbiBgMWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yRWFjaFJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2hSaWdodCA6IGJhc2VFYWNoUmlnaHQ7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgb3JkZXIgb2YgZ3JvdXBlZCB2YWx1ZXNcbiAgICAgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIGBjb2xsZWN0aW9uYC4gVGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiB2YWx1ZSBvZiBlYWNoIGtleSBpcyBhbiBhcnJheSBvZiBlbGVtZW50cyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGVcbiAgICAgKiBrZXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmdyb3VwQnkoWzYuMSwgNC4yLCA2LjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiB7ICc0JzogWzQuMl0sICc2JzogWzYuMSwgNi4zXSB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmdyb3VwQnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogWydvbmUnLCAndHdvJ10sICc1JzogWyd0aHJlZSddIH1cbiAgICAgKi9cbiAgICB2YXIgZ3JvdXBCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIFt2YWx1ZV0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3NcbiAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2VcbiAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzXG4gICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgICAgICBmcm9tSW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgZnJvbUluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKVxuICAgICAgICA/IChmcm9tSW5kZXggPD0gbGVuZ3RoICYmIGNvbGxlY3Rpb24uaW5kZXhPZih2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKVxuICAgICAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAsIHJldHVybmluZ1xuICAgICAqIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIGVhY2ggaW52b2tlZCBtZXRob2QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqIGFyZSBwcm92aWRlZCB0byBlYWNoIGludm9rZWQgbWV0aG9kLiBJZiBgcGF0aGAgaXMgYSBmdW5jdGlvbiwgaXQncyBpbnZva2VkXG4gICAgICogZm9yLCBhbmQgYHRoaXNgIGJvdW5kIHRvLCBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbnxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2Ugb3JcbiAgICAgKiAgdGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBlYWNoIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbnZva2VNYXAoW1s1LCAxLCA3XSwgWzMsIDIsIDFdXSwgJ3NvcnQnKTtcbiAgICAgKiAvLyA9PiBbWzEsIDUsIDddLCBbMSwgMiwgM11dXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbMTIzLCA0NTZdLCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCAnJyk7XG4gICAgICogLy8gPT4gW1snMScsICcyJywgJzMnXSwgWyc0JywgJzUnLCAnNiddXVxuICAgICAqL1xuICAgIHZhciBpbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBwYXRoLCBhcmdzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBpc0Z1bmMgPSB0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nLFxuICAgICAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gICAgICogZWFjaCBrZXkgaXMgdGhlIGxhc3QgZWxlbWVudCByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUga2V5LiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb21wb3NlZCBhZ2dyZWdhdGUgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbXG4gICAgICogICB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSxcbiAgICAgKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICAgICAqICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby5jb2RlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCAnZGlyJyk7XG4gICAgICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKi9cbiAgICB2YXIga2V5QnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZVxuICAgICAqIGBfLmV2ZXJ5YCwgYF8uZmlsdGVyYCwgYF8ubWFwYCwgYF8ubWFwVmFsdWVzYCwgYF8ucmVqZWN0YCwgYW5kIGBfLnNvbWVgLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFyeWAsIGBjaHVua2AsIGBjdXJyeWAsIGBjdXJyeVJpZ2h0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGV2ZXJ5YCxcbiAgICAgKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gICAgICogYHRlbXBsYXRlYCwgYHRyaW1gLCBgdHJpbUVuZGAsIGB0cmltU3RhcnRgLCBhbmQgYHdvcmRzYFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWFwKFs0LCA4XSwgc3F1YXJlKTtcbiAgICAgKiAvLyA9PiBbMTYsIDY0XVxuICAgICAqXG4gICAgICogXy5tYXAoeyAnYSc6IDQsICdiJzogOCB9LCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcCh1c2VycywgJ3VzZXInKTtcbiAgICAgKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0XG4gICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXNcbiAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mIFwiZGVzY1wiIGZvclxuICAgICAqIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5W118RnVuY3Rpb25bXXxPYmplY3RbXXxzdHJpbmdbXX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3JkZXJzXSBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gU29ydCBieSBgdXNlcmAgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBieSBgYWdlYCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIF8ub3JkZXJCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddLCBbJ2FzYycsICdkZXNjJ10pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMsIGd1YXJkKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheShpdGVyYXRlZXMpKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGl0ZXJhdGVlcyA9PSBudWxsID8gW10gOiBbaXRlcmF0ZWVzXTtcbiAgICAgIH1cbiAgICAgIG9yZGVycyA9IGd1YXJkID8gdW5kZWZpbmVkIDogb3JkZXJzO1xuICAgICAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcbiAgICAgICAgb3JkZXJzID0gb3JkZXJzID09IG51bGwgPyBbXSA6IFtvcmRlcnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoXG4gICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dXG4gICAgICovXG4gICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pO1xuXG4gICAgLyoqXG4gICAgICogUmVkdWNlcyBgY29sbGVjdGlvbmAgdG8gYSB2YWx1ZSB3aGljaCBpcyB0aGUgYWNjdW11bGF0ZWQgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYFxuICAgICAqIGlzIG5vdCBnaXZlbiwgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxcbiAgICAgKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC5cbiAgICAgKlxuICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLFxuICAgICAqIGFuZCBgc29ydEJ5YFxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAgICAgKiAgIHJldHVybiBzdW0gKyBuO1xuICAgICAqIH0sIDApO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVkdWNlKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH0sIHt9KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dO1xuICAgICAqXG4gICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikge1xuICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLFxuICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzO1xuXG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCksIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGJhc2VFYWNoUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5maWx0ZXJgOyB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmBcbiAgICAgKiB0aGF0IGBwcmVkaWNhdGVgIGRvZXMgKipub3QqKiByZXR1cm4gdHJ1dGh5IGZvci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8uZmlsdGVyXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ucmVqZWN0KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdChjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RmlsdGVyIDogYmFzZUZpbHRlcjtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBgbmAgcmFuZG9tIGVsZW1lbnRzIGF0IHVuaXF1ZSBrZXlzIGZyb20gYGNvbGxlY3Rpb25gIHVwIHRvIHRoZVxuICAgICAqIHNpemUgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlU2l6ZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFszLCAxXVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgNCk7XG4gICAgICogLy8gPT4gWzIsIDMsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuLCBndWFyZCkge1xuICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGVTaXplIDogYmFzZVNhbXBsZVNpemU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZVxuICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTtcbiAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiBgY29sbGVjdGlvbmAgYnkgcmV0dXJuaW5nIGl0cyBsZW5ndGggZm9yIGFycmF5LWxpa2VcbiAgICAgKiB2YWx1ZXMgb3IgdGhlIG51bWJlciBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBmb3Igb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiA3XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKSA/IHN0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcoY29sbGVjdGlvbik7XG4gICAgICBpZiAodGFnID09IG1hcFRhZyB8fCB0YWcgPT0gc2V0VGFnKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbnkqKiBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29tZShbbnVsbCwgMCwgJ3llcycsIGZhbHNlXSwgQm9vbGVhbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvbWUodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNvbWUgOiBiYXNlU29tZTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzLCBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSByZXN1bHRzIG9mXG4gICAgICogcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRocnUgZWFjaCBpdGVyYXRlZS4gVGhpcyBtZXRob2RcbiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAgICAgKiBlcXVhbCBlbGVtZW50cy4gVGhlIGl0ZXJhdGVlcyBhcmUgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzQgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgW2Z1bmN0aW9uKG8pIHsgcmV0dXJuIG8udXNlcjsgfV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXVxuICAgICAqXG4gICAgICogXy5zb3J0QnkodXNlcnMsIFsndXNlcicsICdhZ2UnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdLCBbJ2ZyZWQnLCA0OF1dXG4gICAgICovXG4gICAgdmFyIHNvcnRCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcykge1xuICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiAxICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgICAgICBpdGVyYXRlZXMgPSBbaXRlcmF0ZWVzWzBdXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG4gICAgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBEYXRlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICAgICAqIH0sIF8ubm93KCkpO1xuICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gICAgICovXG4gICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7XG4gICAgfTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5iZWZvcmVgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzXG4gICAgICogYGZ1bmNgIG9uY2UgaXQncyBjYWxsZWQgYG5gIG9yIG1vcmUgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGNhbGxzIGJlZm9yZSBgZnVuY2AgaXMgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgc2F2ZXMgPSBbJ3Byb2ZpbGUnLCAnc2V0dGluZ3MnXTtcbiAgICAgKlxuICAgICAqIHZhciBkb25lID0gXy5hZnRlcihzYXZlcy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coJ2RvbmUgc2F2aW5nIScpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogXy5mb3JFYWNoKHNhdmVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICogICBhc3luY1NhdmUoeyAndHlwZSc6IHR5cGUsICdjb21wbGV0ZSc6IGRvbmUgfSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnZG9uZSBzYXZpbmchJyBhZnRlciB0aGUgdHdvIGFzeW5jIHNhdmVzIGhhdmUgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFmdGVyKG4sIGZ1bmMpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICgtLW4gPCAxKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLFxuICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7XG4gICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBuO1xuICAgICAgbiA9IChmdW5jICYmIG4gPT0gbnVsbCkgPyBmdW5jLmxlbmd0aCA6IG47XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0FSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzXG4gICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7XG4gICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPD0gMSkge1xuICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgYHRoaXNBcmdgXG4gICAgICogYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIG5hdGl2ZSBgRnVuY3Rpb24jYmluZGAsIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYmluZC5cbiAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAndXNlcic6ICdmcmVkJyB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kKGdyZWV0LCBvYmplY3QsIF8sICchJyk7XG4gICAgICogYm91bmQoJ2hpJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUc7XG4gICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kKSk7XG4gICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYG9iamVjdFtrZXldYCB3aXRoIGBwYXJ0aWFsc2BcbiAgICAgKiBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgXy5iaW5kYCBieSBhbGxvd2luZyBib3VuZCBmdW5jdGlvbnMgdG8gcmVmZXJlbmNlXG4gICAgICogbWV0aG9kcyB0aGF0IG1heSBiZSByZWRlZmluZWQgb3IgZG9uJ3QgeWV0IGV4aXN0LiBTZWVcbiAgICAgKiBbUGV0ZXIgTWljaGF1eCdzIGFydGljbGVdKGh0dHA6Ly9wZXRlci5taWNoYXV4LmNhL2FydGljbGVzL2xhenktZnVuY3Rpb24tZGVmaW5pdGlvbi1wYXR0ZXJuKVxuICAgICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYF8uYmluZEtleS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ3VzZXInOiAnZnJlZCcsXG4gICAgICogICAnZ3JlZXQnOiBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogICB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsICdoaScpO1xuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpIGZyZWQhJ1xuICAgICAqXG4gICAgICogb2JqZWN0LmdyZWV0ID0gZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAneWEgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBib3VuZCgnIScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gQm91bmQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGl5YSBmcmVkISdcbiAgICAgKi9cbiAgICB2YXIgYmluZEtleSA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwga2V5LCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmRLZXkpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGtleSwgYml0bWFzaywgb2JqZWN0LCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzXG4gICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZVxuICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2BcbiAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGBcbiAgICAgKiBpcyBub3Qgc3VmZmljaWVudC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcyxcbiAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeShhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgxKSgyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMikoMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDEpKF8sIDMpKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnkucGxhY2Vob2xkZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2BcbiAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5UmlnaHQoYWJjKTtcbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMykoMikoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDIsIDMpKDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyLCAzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogY3VycmllZCgzKSgxLCBfKSgyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsIGFyaXR5LCBndWFyZCkge1xuICAgICAgYXJpdHkgPSBndWFyZCA/IHVuZGVmaW5lZCA6IGFyaXR5O1xuICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYXJpdHkpO1xuICAgICAgcmVzdWx0LnBsYWNlaG9sZGVyID0gY3VycnlSaWdodC5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAgICAgKiBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gICAgICpcbiAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsYXN0QXJncyxcbiAgICAgICAgICBsYXN0VGhpcyxcbiAgICAgICAgICBtYXhXYWl0LFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB0aW1lcklkLFxuICAgICAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgICAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICAgICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAgICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICAgICAgcmV0dXJuIG1heGluZ1xuICAgICAgICAgID8gbmF0aXZlTWluKHRpbWVXYWl0aW5nLCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSlcbiAgICAgICAgICA6IHRpbWVXYWl0aW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgICAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgICAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgICAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgICAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICAgICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgICAgIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICAgICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZlcnMgaW52b2tpbmcgdGhlIGBmdW5jYCB1bnRpbCB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcyBjbGVhcmVkLiBBbnlcbiAgICAgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVmZXIuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgJ2RlZmVycmVkJyk7XG4gICAgICogLy8gPT4gTG9ncyAnZGVmZXJyZWQnIGFmdGVyIG9uZSBtaWxsaXNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVmZXIgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIDEsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkge1xuICAgICAqICAgY29uc29sZS5sb2codGV4dCk7XG4gICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7XG4gICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuXG4gICAgICovXG4gICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIHJldmVyc2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZmxpcCBhcmd1bWVudHMgZm9yLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsaXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmbGlwcGVkID0gXy5mbGlwKGZ1bmN0aW9uKCkge1xuICAgICAqICAgcmV0dXJuIF8udG9BcnJheShhcmd1bWVudHMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogZmxpcHBlZCgnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+IFsnZCcsICdjJywgJ2InLCAnYSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxpcChmdW5jKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0ZMSVBfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbWVtb2l6ZXMgdGhlIHJlc3VsdCBvZiBgZnVuY2AuIElmIGByZXNvbHZlcmAgaXNcbiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlXG4gICAgICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gICAgICogcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uIGlzIHVzZWQgYXMgdGhlIG1hcCBjYWNoZSBrZXkuIFRoZSBgZnVuY2BcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY2FjaGUgaXMgZXhwb3NlZCBhcyB0aGUgYGNhY2hlYCBwcm9wZXJ0eSBvbiB0aGUgbWVtb2l6ZWRcbiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWBcbiAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICAgICAqIFtgTWFwYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcHJvcGVydGllcy1vZi10aGUtbWFwLXByb3RvdHlwZS1vYmplY3QpXG4gICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTtcbiAgICAgKlxuICAgICAqIHZhciB2YWx1ZXMgPSBfLm1lbW9pemUoXy52YWx1ZXMpO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogdmFsdWVzKG90aGVyKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKlxuICAgICAqIG9iamVjdC5hID0gMjtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKlxuICAgICAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICAgICAqIHZhbHVlcy5jYWNoZS5zZXQob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiB2YWx1ZXMob2JqZWN0KTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICpcbiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLlxuICAgICAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxuICAgICAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7XG4gICAgICByZXR1cm4gbWVtb2l6ZWQ7XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuXG4gICAgbWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgbmVnYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmVkaWNhdGUgYGZ1bmNgLiBUaGVcbiAgICAgKiBgZnVuY2AgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBwcmVkaWNhdGUgdG8gbmVnYXRlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG5lZ2F0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzRXZlbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMDtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbMSwgMiwgMywgNCwgNSwgNl0sIF8ubmVnYXRlKGlzRXZlbikpO1xuICAgICAqIC8vID0+IFsxLCAzLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5lZ2F0ZShwcmVkaWNhdGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGNhc2UgMDogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzKTtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSk7XG4gICAgICAgICAgY2FzZSAyOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzXG4gICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIGluaXRpYWxpemUoKTtcbiAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykge1xuICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudHMgdHJhbnNmb3JtZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbdHJhbnNmb3Jtcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm1zLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBkb3VibGVkKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyQXJncyhmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4gW3gsIHldO1xuICAgICAqIH0sIFtzcXVhcmUsIGRvdWJsZWRdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoOSwgMyk7XG4gICAgICogLy8gPT4gWzgxLCA2XVxuICAgICAqXG4gICAgICogZnVuYygxMCwgNSk7XG4gICAgICogLy8gPT4gWzEwMCwgMTBdXG4gICAgICovXG4gICAgdmFyIG92ZXJBcmdzID0gY2FzdFJlc3QoZnVuY3Rpb24oZnVuYywgdHJhbnNmb3Jtcykge1xuICAgICAgdHJhbnNmb3JtcyA9ICh0cmFuc2Zvcm1zLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodHJhbnNmb3Jtc1swXSkpXG4gICAgICAgID8gYXJyYXlNYXAodHJhbnNmb3Jtc1swXSwgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKVxuICAgICAgICA6IGFycmF5TWFwKGJhc2VGbGF0dGVuKHRyYW5zZm9ybXMsIDEpLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpO1xuXG4gICAgICB2YXIgZnVuY3NMZW5ndGggPSB0cmFuc2Zvcm1zLmxlbmd0aDtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGFyZ3MubGVuZ3RoLCBmdW5jc0xlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGVcbiAgICAgKiBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYmluZGAgZXhjZXB0IGl0IGRvZXMgKipub3QqKlxuICAgICAqIGFsdGVyIHRoZSBgdGhpc2AgYmluZGluZy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHlcbiAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjIuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7XG4gICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTtcbiAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wYXJ0aWFsYCBleGNlcHQgdGhhdCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiBhcmUgYXBwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5wYXJ0aWFsUmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGdyZWV0RnJlZCA9IF8ucGFydGlhbFJpZ2h0KGdyZWV0LCAnZnJlZCcpO1xuICAgICAqIGdyZWV0RnJlZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdoZWxsbycsIF8pO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKi9cbiAgICB2YXIgcGFydGlhbFJpZ2h0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHLCB1bmRlZmluZWQsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZ1xuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzXG4gICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHtcbiAgICAgKiAgIHJldHVybiBbYSwgYiwgY107XG4gICAgICogfSwgWzIsIDAsIDFdKTtcbiAgICAgKlxuICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJylcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKi9cbiAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGluZGV4ZXMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiBhbmQgYXJndW1lbnRzIGZyb20gYHN0YXJ0YCBhbmQgYmV5b25kIHByb3ZpZGVkIGFzXG4gICAgICogYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24gdGhlXG4gICAgICogW3Jlc3QgcGFyYW1ldGVyXShodHRwczovL21kbi5pby9yZXN0X3BhcmFtZXRlcnMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnJlc3QoZnVuY3Rpb24od2hhdCwgbmFtZXMpIHtcbiAgICAgKiAgIHJldHVybiB3aGF0ICsgJyAnICsgXy5pbml0aWFsKG5hbWVzKS5qb2luKCcsICcpICtcbiAgICAgKiAgICAgKF8uc2l6ZShuYW1lcykgPiAxID8gJywgJiAnIDogJycpICsgXy5sYXN0KG5hbWVzKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheSgnaGVsbG8nLCAnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcycpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXN0KGZ1bmMsIHN0YXJ0KSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IHN0YXJ0ID09PSB1bmRlZmluZWQgPyBzdGFydCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuYywgc3RhcnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZVxuICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZVxuICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHtcbiAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pO1xuICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nXG4gICAgICpcbiAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFtcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksXG4gICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkge1xuICAgICAqICAgcmV0dXJuIHggKyB5O1xuICAgICAqIH0pKTtcbiAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzZcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7XG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSxcbiAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7XG5cbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG90aGVyQXJncywgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICAgICAqIGV2ZXJ5IGB3YWl0YCBtaWxsaXNlY29uZHMuIFRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgXG4gICAgICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICAgICAqIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZSBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGBcbiAgICAgKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gICAgICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICAgICAqIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAgICAgKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIHRocm90dGxlZCBmdW5jdGlvblxuICAgICAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAgICAgKlxuICAgICAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICAgICAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAgICAgKlxuICAgICAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICAgICAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdzY3JvbGwnLCBfLnRocm90dGxlKHVwZGF0ZVBvc2l0aW9uLCAxMDApKTtcbiAgICAgKlxuICAgICAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICAgICAqIHZhciB0aHJvdHRsZWQgPSBfLnRocm90dGxlKHJlbmV3VG9rZW4sIDMwMDAwMCwgeyAndHJhaWxpbmcnOiBmYWxzZSB9KTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgdGhyb3R0bGVkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAgICAgJ21heFdhaXQnOiB3YWl0LFxuICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB1cCB0byBvbmUgYXJndW1lbnQsIGlnbm9yaW5nIGFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLnVuYXJ5KHBhcnNlSW50KSk7XG4gICAgICogLy8gPT4gWzYsIDgsIDEwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuYXJ5KGZ1bmMpIHtcbiAgICAgIHJldHVybiBhcnkoZnVuYywgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYHZhbHVlYCB0byBgd3JhcHBlcmAgYXMgaXRzIGZpcnN0XG4gICAgICogYXJndW1lbnQuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZnVuY3Rpb24gYXJlIGFwcGVuZGVkXG4gICAgICogdG8gdGhvc2UgcHJvdmlkZWQgdG8gdGhlIGB3cmFwcGVyYC4gVGhlIHdyYXBwZXIgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2BcbiAgICAgKiBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbd3JhcHBlcj1pZGVudGl0eV0gVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBwID0gXy53cmFwKF8uZXNjYXBlLCBmdW5jdGlvbihmdW5jLCB0ZXh0KSB7XG4gICAgICogICByZXR1cm4gJzxwPicgKyBmdW5jKHRleHQpICsgJzwvcD4nO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogcCgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnPHA+ZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzPC9wPidcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwKHZhbHVlLCB3cmFwcGVyKSB7XG4gICAgICByZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIGFzIGFuIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KDEpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW251bGxdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IFt1bmRlZmluZWRdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSgpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICogY29uc29sZS5sb2coXy5jYXN0QXJyYXkoYXJyYXkpID09PSBhcnJheSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheSgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbMF07XG4gICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZVxuICAgICAqIFtzdHJ1Y3R1cmVkIGNsb25lIGFsZ29yaXRobV0oaHR0cHM6Ly9tZG4uaW8vU3RydWN0dXJlZF9jbG9uZV9hbGdvcml0aG0pXG4gICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLFxuICAgICAqIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZFxuICAgICAqIGFycmF5cy4gVGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYGFyZ3VtZW50c2Agb2JqZWN0cyBhcmUgY2xvbmVkXG4gICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaFxuICAgICAqIGFzIGVycm9yIG9iamVjdHMsIGZ1bmN0aW9ucywgRE9NIG5vZGVzLCBhbmQgV2Vha01hcHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBzaGFsbG93ID0gXy5jbG9uZShvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsXG4gICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGhcbiAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTtcbiAgICAgKlxuICAgICAqIHZhciBkZWVwID0gXy5jbG9uZURlZXAob2JqZWN0cyk7XG4gICAgICogY29uc29sZS5sb2coZGVlcFswXSA9PT0gb2JqZWN0c1swXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBiYXNlQ2xvbmUodmFsdWUsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVXaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7XG4gICAgICogLy8gPT4gJ0JPRFknXG4gICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG9iamVjdGAgY29uZm9ybXMgdG8gYHNvdXJjZWAgYnkgaW52b2tpbmcgdGhlIHByZWRpY2F0ZVxuICAgICAqIHByb3BlcnRpZXMgb2YgYHNvdXJjZWAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMTsgfSB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDI7IH0gfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25mb3Jtc1RvKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlID09IG51bGwgfHwgYmFzZUNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lcShOYU4sIE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5sdFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0KDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uZ3QoMSwgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgZ3QgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VHdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmd0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlID49IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheSgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlCdWZmZXJgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXlCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUJ1ZmZlcihuZXcgQXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQXJyYXlCdWZmZXIgPSBub2RlSXNBcnJheUJ1ZmZlciA/IGJhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcikgOiBiYXNlSXNBcnJheUJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICAgICAqIGlzIGFuIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0FycmF5TGlrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQm9vbGVhbihudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgICAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKG5ldyBEYXRlKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRGF0ZSgnTW9uIEFwcmlsIDIzIDIwMTInKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc0RhdGUgPSBub2RlSXNEYXRlID8gYmFzZVVuYXJ5KG5vZGVJc0RhdGUpIDogYmFzZUlzRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIERPTSBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIERPTSBlbGVtZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbGVtZW50KCc8Ym9keT4nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRWxlbWVudCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgdmFsdWUubm9kZVR5cGUgPT09IDEgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gICAgICpcbiAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWRcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yXG4gICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHRydWUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eSgxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmVcbiAgICAgKiBlcXVpdmFsZW50LlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNvbXBhcmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLFxuICAgICAqIGRhdGUgb2JqZWN0cywgZXJyb3Igb2JqZWN0cywgbWFwcywgbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcyxcbiAgICAgKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICAgICAqIGJ5IHRoZWlyIG93biwgbm90IGluaGVyaXRlZCwgZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBGdW5jdGlvbnMgYW5kIERPTVxuICAgICAqIG5vZGVzIGFyZSBjb21wYXJlZCBieSBzdHJpY3QgZXF1YWxpdHksIGkuZS4gYD09PWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIG9iamVjdCA9PT0gb3RoZXI7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0VxdWFsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggdXAgdG9cbiAgICAgKiBzaXggYXJndW1lbnRzOiAob2JqVmFsdWUsIG90aFZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBvdGhlciwgc3RhY2tdKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgb3RoVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKG90aFZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAgICAgKiB2YXIgb3RoZXIgPSBbJ2hpJywgJ2dvb2RieWUnXTtcbiAgICAgKlxuICAgICAqIF8uaXNFcXVhbFdpdGgoYXJyYXksIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcXVhbFdpdGgodmFsdWUsIG90aGVyLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgdW5kZWZpbmVkLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGBFcnJvcmAsIGBFdmFsRXJyb3JgLCBgUmFuZ2VFcnJvcmAsIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAgICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Vycm9yKEVycm9yKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGVycm9yVGFnIHx8IHRhZyA9PSBkb21FeGNUYWcgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgcHJpbWl0aXZlIG51bWJlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzRmluaXRlYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzRmluaXRlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZShOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGaW5pdGUodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgbmF0aXZlSXNGaW5pdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc0ludGVnZXJgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0ludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIHZhbHVlID09IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0xlbmd0aCgnMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KHt9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICAgICAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2Uoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE1hcGAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzTWFwID0gbm9kZUlzTWFwID8gYmFzZVVuYXJ5KG5vZGVJc01hcCkgOiBiYXNlSXNNYXA7XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYG9iamVjdGAgYW5kIGBzb3VyY2VgIHRvXG4gICAgICogZGV0ZXJtaW5lIGlmIGBvYmplY3RgIGNvbnRhaW5zIGVxdWl2YWxlbnQgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8ubWF0Y2hlc2Agd2hlbiBgc291cmNlYCBpc1xuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2gob2JqZWN0LCB7ICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnNcbiAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmVcbiAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07XG4gICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9O1xuICAgICAqXG4gICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgTmFOYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzTmFOKSBhbmQgaXMgbm90IHRoZSBzYW1lIGFzXG4gICAgICogZ2xvYmFsIFtgaXNOYU5gXShodHRwczovL21kbi5pby9pc05hTikgd2hpY2ggcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogYHVuZGVmaW5lZGAgYW5kIG90aGVyIG5vbi1udW1iZXIgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKE5hTik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTihuZXcgTnVtYmVyKE5hTikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hTih1bmRlZmluZWQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOYU4odmFsdWUpIHtcbiAgICAgIC8vIEFuIGBOYU5gIHByaW1pdGl2ZSBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBgdG9TdHJpbmdUYWdgIGNoZWNrIGZpcnN0IHRvIGF2b2lkIGVycm9ycyB3aXRoIHNvbWVcbiAgICAgIC8vIEFjdGl2ZVggb2JqZWN0cyBpbiBJRS5cbiAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdmFsdWUgIT0gK3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZVxuICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uXG4gICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55XG4gICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0XG4gICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHNcbiAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSxcbiAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOYXRpdmUoXyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgbnVsbGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bGwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bGwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKG51bGwpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwodm9pZCAwKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmlsKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcigzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjguMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICAgIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgUmVnRXhwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoL2FiYy8pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNSZWdFeHAoJy9hYmMvJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNSZWdFeHAgPSBub2RlSXNSZWdFeHAgPyBiYXNlVW5hcnkobm9kZUlzUmVnRXhwKSA6IGJhc2VJc1JlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NFxuICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBiYXNlVW5hcnkobm9kZUlzU2V0KSA6IGJhc2VJc1NldDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN0cmluZywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKCdhYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3RyaW5nKDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBtYXAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IFdlYWtNYXApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrTWFwKG5ldyBNYXApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IHdlYWtNYXBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBXZWFrU2V0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgd2VhayBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFdlYWtTZXQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNXZWFrU2V0KG5ldyBTZXQpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSB3ZWFrU2V0VGFnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8uZ3RcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdCgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmx0KDMsIDEpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sdGUoMSwgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5sdGUoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHRlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8PSBvdGhlcjtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9BcnJheSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9BcnJheSgxKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KG51bGwpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpc1N0cmluZyh2YWx1ZSkgPyBzdHJpbmdUb0FycmF5KHZhbHVlKSA6IGNvcHlBcnJheSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoc3ltSXRlcmF0b3IgJiYgdmFsdWVbc3ltSXRlcmF0b3JdKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclRvQXJyYXkodmFsdWVbc3ltSXRlcmF0b3JdKCkpO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgZnVuYyA9IHRhZyA9PSBtYXBUYWcgPyBtYXBUb0FycmF5IDogKHRhZyA9PSBzZXRUYWcgPyBzZXRUb0FycmF5IDogdmFsdWVzKTtcblxuICAgICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTIuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKDMuMik7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDVlLTMyNFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoJzMuMicpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdG9OdW1iZXIodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgICAgIHJldHVybiBzaWduICogTUFYX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDhcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gdG9GaW5pdGUodmFsdWUpLFxuICAgICAgICAgIHJlbWFpbmRlciA9IHJlc3VsdCAlIDE7XG5cbiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgbGVuZ3RoIG9mIGFuXG4gICAgICogYXJyYXktbGlrZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA0Mjk0OTY3Mjk1XG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9MZW5ndGgodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAwLCBNQVhfQVJSQVlfTEVOR1RIKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiBJbmZpbml0eVxuICAgICAqXG4gICAgICogXy50b051bWJlcignMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgICAgIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgICAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICAgICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZ1xuICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc2FmZSBpbnRlZ2VyLiBBIHNhZmUgaW50ZWdlciBjYW4gYmUgY29tcGFyZWQgYW5kXG4gICAgICogcmVwcmVzZW50ZWQgY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICpcbiAgICAgKiBfLnRvU2FmZUludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NhZmVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgPyBiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwgLU1BWF9TQUZFX0lOVEVHRVIsIE1BWF9TQUZFX0lOVEVHRVIpXG4gICAgICAgIDogKHZhbHVlID09PSAwID8gdmFsdWUgOiAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIGBudWxsYFxuICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcobnVsbCk7XG4gICAgICogLy8gPT4gJydcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoLTApO1xuICAgICAqIC8vID0+ICctMCdcbiAgICAgKlxuICAgICAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiAnMSwyLDMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogU3Vic2VxdWVudCBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAgYW5kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYE9iamVjdC5hc3NpZ25gXShodHRwczovL21kbi5pby9PYmplY3QvYXNzaWduKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbkluXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMCB9LCBuZXcgRm9vLCBuZXcgQmFyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIGlmIChpc1Byb3RvdHlwZShzb3VyY2UpIHx8IGlzQXJyYXlMaWtlKHNvdXJjZSkpIHtcbiAgICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgc291cmNlW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBvd24gYW5kXG4gICAgICogaW5oZXJpdGVkIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZXh0ZW5kXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBCYXIoKSB7XG4gICAgICogICB0aGlzLmMgPSAzO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7XG4gICAgICogQmFyLnByb3RvdHlwZS5kID0gNDtcbiAgICAgKlxuICAgICAqIF8uYXNzaWduSW4oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDQgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25JbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgXG4gICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFdpdGhcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW5XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25XaXRoLCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIHZhciBhc3NpZ25XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBgcGF0aHNgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHBpY2tlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH0sIDRdIH07XG4gICAgICpcbiAgICAgKiBfLmF0KG9iamVjdCwgWydhWzBdLmIuYycsICdhWzFdJ10pO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciBhdCA9IGZsYXRSZXN0KGJhc2VBdCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYVxuICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgZ2l2ZW4sIGl0cyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllc1xuICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkge1xuICAgICAqICAgdGhpcy54ID0gMDtcbiAgICAgKiAgIHRoaXMueSA9IDA7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQ2lyY2xlKCkge1xuICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7XG4gICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGVcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlO1xuICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykge1xuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZVxuICAgICAqIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXMgdGhhdFxuICAgICAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAgICAgKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgICAgIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICAgICAgdmFyIHByb3BzID0ga2V5c0luKHNvdXJjZSk7XG4gICAgICAgIHZhciBwcm9wc0luZGV4ID0gLTE7XG4gICAgICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAoZXEodmFsdWUsIG9iamVjdFByb3RvW2tleV0pICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpIHtcbiAgICAgICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRlZmF1bHRzYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBhc3NpZ25zXG4gICAgICogZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5kZWZhdWx0c1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRzRGVlcCh7ICdhJzogeyAnYic6IDIgfSB9LCB7ICdhJzogeyAnYic6IDEsICdjJzogMyB9IH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogMiwgJ2MnOiAzIH0gfVxuICAgICAqL1xuICAgIHZhciBkZWZhdWx0c0RlZXAgPSBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICBhcmdzLnB1c2godW5kZWZpbmVkLCBjdXN0b21EZWZhdWx0c01lcmdlKTtcbiAgICAgIHJldHVybiBhcHBseShtZXJnZVdpdGgsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGtleSBvZiB0aGUgZmlyc3RcbiAgICAgKiBlbGVtZW50IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjEuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZEtleSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gICAgICogLy8gPT4gJ2Jhcm5leScgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93bik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kS2V5YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYSBjb2xsZWN0aW9uIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFJldHVybnMgdGhlIGtleSBvZiB0aGUgbWF0Y2hlZCBlbGVtZW50LFxuICAgICAqICBlbHNlIGB1bmRlZmluZWRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSB7XG4gICAgICogICAnYmFybmV5JzogIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgJ2ZyZWQnOiAgICB7ICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+IHJldHVybnMgJ3BlYmJsZXMnIGFzc3VtaW5nIGBfLmZpbmRLZXlgIHJldHVybnMgJ2Jhcm5leSdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+ICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEtleSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+ICdwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0S2V5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duUmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhblxuICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0XG4gICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvcihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckluYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JJblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJblJpZ2h0KG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYycsICdiJywgdGhlbiAnYScgYXNzdW1pbmcgYF8uZm9ySW5gIGxvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsXG4gICAgICAgID8gb2JqZWN0XG4gICAgICAgIDogYmFzZUZvclJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpLCBrZXlzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFuZFxuICAgICAqIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb25cbiAgICAgKiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9yT3duUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyAnYScgdGhlbiAnYicgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93bihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZlxuICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzXG4gICAgICogb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zSW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZnVuY3Rpb24gcHJvcGVydHkgbmFtZXMgZnJvbSBvd24gYW5kIGluaGVyaXRlZFxuICAgICAqIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLlxuICAgICAqIEBzZWUgXy5mdW5jdGlvbnNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gXy5jb25zdGFudCgnYScpO1xuICAgICAqICAgdGhpcy5iID0gXy5jb25zdGFudCgnYicpO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IF8uY29uc3RhbnQoJ2MnKTtcbiAgICAgKlxuICAgICAqIF8uZnVuY3Rpb25zSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VGdW5jdGlvbnMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzKG90aGVyLCAnYScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTtcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGludmVydGVkIGtleXMgYW5kIHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKiBJZiBgb2JqZWN0YCBjb250YWlucyBkdXBsaWNhdGUgdmFsdWVzLCBzdWJzZXF1ZW50IHZhbHVlcyBvdmVyd3JpdGVcbiAgICAgKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmludmVydChvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiAnYycsICcyJzogJ2InIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSBrZXk7XG4gICAgfSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW52ZXJ0YCBleGNlcHQgdGhhdCB0aGUgaW52ZXJ0ZWQgb2JqZWN0IGlzIGdlbmVyYXRlZFxuICAgICAqIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGVsZW1lbnQgb2YgYG9iamVjdGAgdGhydSBgaXRlcmF0ZWVgLiBUaGVcbiAgICAgKiBjb3JyZXNwb25kaW5nIGludmVydGVkIHZhbHVlIG9mIGVhY2ggaW52ZXJ0ZWQga2V5IGlzIGFuIGFycmF5IG9mIGtleXNcbiAgICAgKiByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgaW52ZXJ0ZWQgdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnRCeShvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuICdncm91cCcgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdncm91cDEnOiBbJ2EnLCAnYyddLCAnZ3JvdXAyJzogWydiJ10gfVxuICAgICAqL1xuICAgIHZhciBpbnZlcnRCeSA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIHZhbHVlKSkge1xuICAgICAgICByZXN1bHRbdmFsdWVdLnB1c2goa2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBba2V5XTtcbiAgICAgIH1cbiAgICB9LCBnZXRJdGVyYXRlZSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4gU2VlIHRoZVxuICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8ua2V5cygnaGknKTtcbiAgICAgKiAvLyA9PiBbJzAnLCAnMSddXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QpIDogYmFzZUtleXMob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0LCB0cnVlKSA6IGJhc2VLZXlzSW4ob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlXG4gICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC5cbiAgICAgKiBAc2VlIF8ubWFwVmFsdWVzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICAgICAqIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAgdGhydVxuICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOlxuICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcEtleXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2ZyZWQnOiAgICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgICdwZWJibGVzJzogeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2U7IH0pO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gICAgICogLy8gPT4geyAnZnJlZCc6IDQwLCAncGViYmxlcyc6IDEgfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKTtcblxuICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBtZXJnZXMgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlXG4gICAgICogZGVzdGluYXRpb24gb2JqZWN0LiBTb3VyY2UgcHJvcGVydGllcyB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAgYXJlXG4gICAgICogc2tpcHBlZCBpZiBhIGRlc3RpbmF0aW9uIHZhbHVlIGV4aXN0cy4gQXJyYXkgYW5kIHBsYWluIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnlcbiAgICAgKiBhc3NpZ25tZW50LiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFN1YnNlcXVlbnRcbiAgICAgKiBzb3VyY2VzIG92ZXJ3cml0ZSBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyBzb3VyY2VzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC41LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAnYSc6IFt7ICdiJzogMiB9LCB7ICdkJzogNCB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgb3RoZXIgPSB7XG4gICAgICogICAnYSc6IFt7ICdjJzogMyB9LCB7ICdlJzogNSB9XVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2UgPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpIHtcbiAgICAgIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZXJnZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2hcbiAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG1lcmdlZCB2YWx1ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2VcbiAgICAgKiBwcm9wZXJ0aWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgbWVyZ2luZyBpcyBoYW5kbGVkIGJ5IHRoZVxuICAgICAqIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCBzaXggYXJndW1lbnRzOlxuICAgICAqIChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgKiAgICAgcmV0dXJuIG9ialZhbHVlLmNvbmNhdChzcmNWYWx1ZSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbMV0sICdiJzogWzJdIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYSc6IFszXSwgJ2InOiBbNF0gfTtcbiAgICAgKlxuICAgICAqIF8ubWVyZ2VXaXRoKG9iamVjdCwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbMSwgM10sICdiJzogWzIsIDRdIH1cbiAgICAgKi9cbiAgICB2YXIgbWVyZ2VXaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlXG4gICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTtcbiAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9KTtcbiAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja0J5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2ZcbiAgICAgKiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBgb2JqZWN0YCB0aGF0XG4gICAgICogYHByZWRpY2F0ZWAgZG9lc24ndCByZXR1cm4gdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdHdvXG4gICAgICogYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdEJ5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYic6ICcyJyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gb21pdEJ5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gcGlja0J5KG9iamVjdCwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIHBpY2sgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB7fSA6IGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJuc1xuICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9O1xuICAgICAqXG4gICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICByZXR1cm4gW3Byb3BdO1xuICAgICAgfSk7XG4gICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpO1xuICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmdldGAgZXhjZXB0IHRoYXQgaWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzIGFcbiAgICAgKiBmdW5jdGlvbiBpdCdzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgaXRzIHBhcmVudCBvYmplY3QgYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHJlc29sdmUuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjMSc6IDMsICdjMic6IF8uY29uc3RhbnQoNCkgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMxJyk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMyJyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsIF8uY29uc3RhbnQoJ2RlZmF1bHQnKSk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVzdWx0KG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXhdKV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW5kZXggPSBsZW5ndGg7XG4gICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiBhIHBvcnRpb24gb2YgYHBhdGhgIGRvZXNuJ3QgZXhpc3QsXG4gICAgICogaXQncyBjcmVhdGVkLiBBcnJheXMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgaW5kZXggcHJvcGVydGllcyB3aGlsZSBvYmplY3RzXG4gICAgICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAgICAgKiBgcGF0aGAgY3JlYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLnNldChvYmplY3QsICdhWzBdLmIuYycsIDQpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LnhbMF0ueS56KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgXG4gICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8uc2V0V2l0aChvYmplY3QsICdbMF1bMV0nLCAnYScsIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0V2l0aChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkLXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YFxuICAgICAqIHdoaWNoIGNhbiBiZSBjb25zdW1lZCBieSBgXy5mcm9tUGFpcnNgLiBJZiBgb2JqZWN0YCBpcyBhIG1hcCBvciBzZXQsIGl0c1xuICAgICAqIGVudHJpZXMgYXJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGVudHJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl1dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnMgPSBjcmVhdGVUb1BhaXJzKGtleXMpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlyc1xuICAgICAqIGZvciBgb2JqZWN0YCB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXBcbiAgICAgKiBvciBzZXQsIGl0cyBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzSW5cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy50b1BhaXJzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgdmFyIHRvUGFpcnNJbiA9IGNyZWF0ZVRvUGFpcnMoa2V5c0luKTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXdcbiAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duXG4gICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdFxuICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGVcbiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7XG4gICAgICogICByZXN1bHQucHVzaChuICo9IG4pO1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA5XVxuICAgICAqXG4gICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiB9LCB7fSk7XG4gICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpO1xuICAgICAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICAgICAgdmFyIEN0b3IgPSBvYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yO1xuICAgICAgICBpZiAoaXNBcnJMaWtlKSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1bnNldC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiA3IH0gfV0gfTtcbiAgICAgKiBfLnVuc2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqXG4gICAgICogXy51bnNldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QpO1xuICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IHt9IH1dIH07XG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5zZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB0cnVlIDogYmFzZVVuc2V0KG9iamVjdCwgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlXG4gICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7XG4gICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICpcbiAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udXBkYXRlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjYuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHt9O1xuICAgICAqXG4gICAgICogXy51cGRhdGVXaXRoKG9iamVjdCwgJ1swXVsxXScsIF8uY29uc3RhbnQoJ2EnKSwgT2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcwJzogeyAnMSc6ICdhJyB9IH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGVXaXRoKG9iamVjdCwgcGF0aCwgdXBkYXRlciwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIGNhc3RGdW5jdGlvbih1cGRhdGVyKSwgY3VzdG9taXplcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqXG4gICAgICogXy52YWx1ZXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWydoJywgJ2knXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHlcbiAgICAgKiB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlVmFsdWVzKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gLTVcbiAgICAgKlxuICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHtcbiAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7XG4gICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwO1xuICAgICAgfVxuICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG93ZXIgPSB0b051bWJlcihsb3dlcik7XG4gICAgICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VDbGFtcCh0b051bWJlcihudW1iZXIpLCBsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgbmAgaXMgYmV0d2VlbiBgc3RhcnRgIGFuZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBJZlxuICAgICAqIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAgICAgKiBuZWdhdGl2ZSByYW5nZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ucmFuZ2UsIF8ucmFuZ2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMywgMiwgNCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDQsIDgpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDIsIDIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoMS4yLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNS4yLCA0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKC0zLCAtMiwgLTYpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7XG4gICAgICB9XG4gICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpO1xuICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgYSByYW5kb20gbnVtYmVyIGJldHdlZW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy5cbiAgICAgKiBJZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCBhIG51bWJlciBiZXR3ZWVuIGAwYCBhbmQgdGhlIGdpdmVuIG51bWJlclxuICAgICAqIGlzIHJldHVybmVkLiBJZiBgZmxvYXRpbmdgIGlzIGB0cnVlYCwgb3IgZWl0aGVyIGBsb3dlcmAgb3IgYHVwcGVyYCBhcmVcbiAgICAgKiBmbG9hdHMsIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGlzIHJldHVybmVkIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXI9MF0gVGhlIGxvd2VyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbdXBwZXI9MV0gVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zsb2F0aW5nXSBTcGVjaWZ5IHJldHVybmluZyBhIGZsb2F0aW5nLXBvaW50IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByYW5kb20gbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgwLCA1KTtcbiAgICAgKiAvLyA9PiBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSk7XG4gICAgICogLy8gPT4gYWxzbyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oNSwgdHJ1ZSk7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAwIGFuZCA1XG4gICAgICpcbiAgICAgKiBfLnJhbmRvbSgxLjIsIDUuMik7XG4gICAgICogLy8gPT4gYSBmbG9hdGluZy1wb2ludCBudW1iZXIgYmV0d2VlbiAxLjIgYW5kIDUuMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJhbmRvbShsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSB7XG4gICAgICBpZiAoZmxvYXRpbmcgJiYgdHlwZW9mIGZsb2F0aW5nICE9ICdib29sZWFuJyAmJiBpc0l0ZXJhdGVlQ2FsbChsb3dlciwgdXBwZXIsIGZsb2F0aW5nKSkge1xuICAgICAgICB1cHBlciA9IGZsb2F0aW5nID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyO1xuICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsb3dlciA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBmbG9hdGluZyA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPT09IHVuZGVmaW5lZCAmJiB1cHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgdXBwZXIgPSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGxvd2VyID0gdG9GaW5pdGUobG93ZXIpO1xuICAgICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHVwcGVyID0gbG93ZXI7XG4gICAgICAgICAgbG93ZXIgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwcGVyID0gdG9GaW5pdGUodXBwZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobG93ZXIgPiB1cHBlcikge1xuICAgICAgICB2YXIgdGVtcCA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVwcGVyO1xuICAgICAgICB1cHBlciA9IHRlbXA7XG4gICAgICB9XG4gICAgICBpZiAoZmxvYXRpbmcgfHwgbG93ZXIgJSAxIHx8IHVwcGVyICUgMSkge1xuICAgICAgICB2YXIgcmFuZCA9IG5hdGl2ZVJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gbmF0aXZlTWluKGxvd2VyICsgKHJhbmQgKiAodXBwZXIgLSBsb3dlciArIGZyZWVQYXJzZUZsb2F0KCcxZS0nICsgKChyYW5kICsgJycpLmxlbmd0aCAtIDEpKSkpLCB1cHBlcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIFtjYW1lbCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW1lbENhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FtZWwgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICpcbiAgICAgKiBfLmNhbWVsQ2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKi9cbiAgICB2YXIgY2FtZWxDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/IGNhcGl0YWxpemUod29yZCkgOiB3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZSBhbmQgdGhlIHJlbWFpbmluZ1xuICAgICAqIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY2FwaXRhbGl6ZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2FwaXRhbGl6ZSgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGcmVkJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyaW5nKSB7XG4gICAgICByZXR1cm4gdXBwZXJGaXJzdCh0b1N0cmluZyhzdHJpbmcpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKVxuICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSlcbiAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7XG4gICAgICogLy8gPT4gJ2RlamEgdnUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj1zdHJpbmcubGVuZ3RoXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBlbmRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2MnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYicsIDIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbmRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcblxuICAgICAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBsZW5ndGhcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTtcblxuICAgICAgdmFyIGVuZCA9IHBvc2l0aW9uO1xuICAgICAgcG9zaXRpb24gLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA+PSAwICYmIHN0cmluZy5zbGljZShwb3NpdGlvbiwgZW5kKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGNoYXJhY3RlcnMgXCImXCIsIFwiPFwiLCBcIj5cIiwgJ1wiJywgYW5kIFwiJ1wiIGluIGBzdHJpbmdgIHRvIHRoZWlyXG4gICAgICogY29ycmVzcG9uZGluZyBIVE1MIGVudGl0aWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQuIFRvIGVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogY2hhcmFjdGVycyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBUaG91Z2ggdGhlIFwiPlwiIGNoYXJhY3RlciBpcyBlc2NhcGVkIGZvciBzeW1tZXRyeSwgY2hhcmFjdGVycyBsaWtlXG4gICAgICogXCI+XCIgYW5kIFwiL1wiIGRvbid0IG5lZWQgZXNjYXBpbmcgaW4gSFRNTCBhbmQgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgKiB1bmxlc3MgdGhleSdyZSBwYXJ0IG9mIGEgdGFnIG9yIHVucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS4gU2VlXG4gICAgICogW01hdGhpYXMgQnluZW5zJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2FtYmlndW91cy1hbXBlcnNhbmRzKVxuICAgICAqICh1bmRlciBcInNlbWktcmVsYXRlZCBmdW4gZmFjdFwiKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggSFRNTCB5b3Ugc2hvdWxkIGFsd2F5c1xuICAgICAqIFtxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzXShodHRwOi8vd29ua28uY29tL3Bvc3QvaHRtbC1lc2NhcGluZykgdG8gcmVkdWNlXG4gICAgICogWFNTIHZlY3RvcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc1VuZXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlVW5lc2NhcGVkSHRtbCwgZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgdGhlIGBSZWdFeHBgIHNwZWNpYWwgY2hhcmFjdGVycyBcIl5cIiwgXCIkXCIsIFwiXFxcIiwgXCIuXCIsIFwiKlwiLCBcIitcIixcbiAgICAgKiBcIj9cIiwgXCIoXCIsIFwiKVwiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgYW5kIFwifFwiIGluIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gICAgICogLy8gPT4gJ1xcW2xvZGFzaFxcXVxcKGh0dHBzOi8vbG9kYXNoXFwuY29tL1xcKSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28tYmFyJ1xuICAgICAqL1xuICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKlxuICAgICAqIF8ubG93ZXJDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb28gYmFyJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIGxvd2VyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIF8ubG93ZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdmUkVEJ1xuICAgICAqL1xuICAgIHZhciBsb3dlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b0xvd2VyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuXG4gICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgOCk7XG4gICAgICogLy8gPT4gJyAgYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpO1xuICAgICAqIC8vID0+ICdfLWFiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICBpZiAoIWxlbmd0aCB8fCBzdHJMZW5ndGggPj0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgbWlkID0gKGxlbmd0aCAtIHN0ckxlbmd0aCkgLyAyO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVGbG9vcihtaWQpLCBjaGFycykgK1xuICAgICAgICBzdHJpbmcgK1xuICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUNlaWwobWlkKSwgY2hhcnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIHJpZ2h0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYpO1xuICAgICAqIC8vID0+ICdhYmMgICAnXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiY18tXydcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZEVuZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTtcblxuICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7XG4gICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpXG4gICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgc2lkZSBpZiBpdCdzIHNob3J0ZXIgdGhhbiBgbGVuZ3RoYC4gUGFkZGluZ1xuICAgICAqIGNoYXJhY3RlcnMgYXJlIHRydW5jYXRlZCBpZiB0aGV5IGV4Y2VlZCBgbGVuZ3RoYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnICAgYWJjJ1xuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNiwgJ18tJyk7XG4gICAgICogLy8gPT4gJ18tX2FiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDMpO1xuICAgICAqIC8vID0+ICdhYmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFkU3RhcnQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpICsgc3RyaW5nKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXNcbiAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYVxuICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlXG4gICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkge1xuICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHtcbiAgICAgICAgcmFkaXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChyYWRpeCkge1xuICAgICAgICByYWRpeCA9ICtyYWRpeDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwZWF0cyB0aGUgZ2l2ZW4gc3RyaW5nIGBuYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byByZXBlYXQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmcuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByZXBlYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCcqJywgMyk7XG4gICAgICogLy8gPT4gJyoqKidcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAyKTtcbiAgICAgKiAvLyA9PiAnYWJjYWJjJ1xuICAgICAqXG4gICAgICogXy5yZXBlYXQoJ2FiYycsIDApO1xuICAgICAqIC8vID0+ICcnXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgbiwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG4sIGd1YXJkKSA6IG4gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgbiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTtcbiAgICAgKiAvLyA9PiAnSGkgQmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTtcblxuICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoIDwgMyA/IHN0cmluZyA6IHN0cmluZy5yZXBsYWNlKGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gICAgICogW3NuYWtlIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc25ha2UgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNuYWtlQ2FzZSgnRm9vIEJhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJy0tRk9PLUJBUi0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb19iYXInXG4gICAgICovXG4gICAgdmFyIHNuYWtlQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICdfJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7XG4gICAgICogLy8gPT4gWydhJywgJ2InXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7XG4gICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX0FSUkFZX0xFTkdUSCA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKCFsaW1pdCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoXG4gICAgICAgICAgICB0eXBlb2Ygc2VwYXJhdG9yID09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoc2VwYXJhdG9yICE9IG51bGwgJiYgIWlzUmVnRXhwKHNlcGFyYXRvcikpXG4gICAgICAgICAgKSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKCFzZXBhcmF0b3IgJiYgaGFzVW5pY29kZShzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksIDAsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRm9vIEJhcidcbiAgICAgKlxuICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPTBdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgc3RyaW5nLmxlbmd0aCk7XG5cbiAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHN0cmluZy5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyB0YXJnZXQubGVuZ3RoKSA9PSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllc1xuICAgICAqIGluIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXJzLCBIVE1MLWVzY2FwZSBpbnRlcnBvbGF0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluXG4gICAgICogXCJlc2NhcGVcIiBkZWxpbWl0ZXJzLCBhbmQgZXhlY3V0ZSBKYXZhU2NyaXB0IGluIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXJzLiBEYXRhXG4gICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmdcbiAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplc1xuICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKVxuICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWVcbiAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuXG4gICAgICpcbiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWVcbiAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV1cbiAgICAgKiAgVGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmV2YWx1YXRlPV8udGVtcGxhdGVTZXR0aW5ncy5ldmFsdWF0ZV1cbiAgICAgKiAgVGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmltcG9ydHM9Xy50ZW1wbGF0ZVNldHRpbmdzLmltcG9ydHNdXG4gICAgICogIEFuIG9iamVjdCB0byBpbXBvcnQgaW50byB0aGUgdGVtcGxhdGUgYXMgZnJlZSB2YXJpYWJsZXMuXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IFtvcHRpb25zLmludGVycG9sYXRlPV8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZV1cbiAgICAgKiAgVGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddXG4gICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ11cbiAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIgdG8gY3JlYXRlIGEgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdmcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEhUTUwgXCJlc2NhcGVcIiBkZWxpbWl0ZXIgdG8gZXNjYXBlIGRhdGEgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzxiPjwlLSB2YWx1ZSAlPjwvYj4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICc8c2NyaXB0PicgfSk7XG4gICAgICogLy8gPT4gJzxiPiZsdDtzY3JpcHQmZ3Q7PC9iPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgXCJldmFsdWF0ZVwiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8JSBwcmludChcImhlbGxvIFwiICsgdXNlcik7ICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnYmFybmV5JyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gYmFybmV5ISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgRVMgdGVtcGxhdGUgbGl0ZXJhbCBkZWxpbWl0ZXIgYXMgYW4gXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvICR7IHVzZXIgfSEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ3BlYmJsZXMnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBwZWJibGVzISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSBiYWNrc2xhc2hlcyB0byB0cmVhdCBkZWxpbWl0ZXJzIGFzIHBsYWluIHRleHQuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCU9IFwiXFxcXDwlLSB2YWx1ZSAlXFxcXD5cIiAlPicpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJ2lnbm9yZWQnIH0pO1xuICAgICAqIC8vID0+ICc8JS0gdmFsdWUgJT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBpbXBvcnRzYCBvcHRpb24gdG8gaW1wb3J0IGBqUXVlcnlgIGFzIGBqcWAuXG4gICAgICogdmFyIHRleHQgPSAnPCUganEuZWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+JztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKHRleHQsIHsgJ2ltcG9ydHMnOiB7ICdqcSc6IGpRdWVyeSB9IH0pO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXJzJzogWydmcmVkJywgJ2Jhcm5leSddIH0pO1xuICAgICAqIC8vID0+ICc8bGk+ZnJlZDwvbGk+PGxpPmJhcm5leTwvbGk+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgc291cmNlVVJMYCBvcHRpb24gdG8gc3BlY2lmeSBhIGN1c3RvbSBzb3VyY2VVUkwgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyA8JT0gdXNlciAlPiEnLCB7ICdzb3VyY2VVUkwnOiAnL2Jhc2ljL2dyZWV0aW5nLmpzdCcgfSk7XG4gICAgICogY29tcGlsZWQoZGF0YSk7XG4gICAgICogLy8gPT4gRmluZCB0aGUgc291cmNlIG9mIFwiZ3JlZXRpbmcuanN0XCIgdW5kZXIgdGhlIFNvdXJjZXMgdGFiIG9yIFJlc291cmNlcyBwYW5lbCBvZiB0aGUgd2ViIGluc3BlY3Rvci5cbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHZhcmlhYmxlYCBvcHRpb24gdG8gZW5zdXJlIGEgd2l0aC1zdGF0ZW1lbnQgaXNuJ3QgdXNlZCBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGkgPCU9IGRhdGEudXNlciAlPiEnLCB7ICd2YXJpYWJsZSc6ICdkYXRhJyB9KTtcbiAgICAgKiBjb21waWxlZC5zb3VyY2U7XG4gICAgICogLy8gPT4gZnVuY3Rpb24oZGF0YSkge1xuICAgICAqIC8vICAgdmFyIF9fdCwgX19wID0gJyc7XG4gICAgICogLy8gICBfX3AgKz0gJ2hpICcgKyAoKF9fdCA9ICggZGF0YS51c2VyICkpID09IG51bGwgPyAnJyA6IF9fdCkgKyAnISc7XG4gICAgICogLy8gICByZXR1cm4gX19wO1xuICAgICAqIC8vIH1cbiAgICAgKlxuICAgICAqIC8vIFVzZSBjdXN0b20gdGVtcGxhdGUgZGVsaW1pdGVycy5cbiAgICAgKiBfLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGUgPSAve3soW1xcc1xcU10rPyl9fS9nO1xuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlISdcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bFxuICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLlxuICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1xcXG4gICAgICogICB2YXIgSlNUID0ge1xcXG4gICAgICogICAgIFwibWFpblwiOiAnICsgXy50ZW1wbGF0ZShtYWluVGV4dCkuc291cmNlICsgJ1xcXG4gICAgICogICB9O1xcXG4gICAgICogJyk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkge1xuICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKVxuICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuXG4gICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgb3B0aW9ucyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucywgc2V0dGluZ3MsIGN1c3RvbURlZmF1bHRzQXNzaWduSW4pO1xuXG4gICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSxcbiAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksXG4gICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpO1xuXG4gICAgICB2YXIgaXNFc2NhcGluZyxcbiAgICAgICAgICBpc0V2YWx1YXRpbmcsXG4gICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgIGludGVycG9sYXRlID0gb3B0aW9ucy5pbnRlcnBvbGF0ZSB8fCByZU5vTWF0Y2gsXG4gICAgICAgICAgc291cmNlID0gXCJfX3AgKz0gJ1wiO1xuXG4gICAgICAvLyBDb21waWxlIHRoZSByZWdleHAgdG8gbWF0Y2ggZWFjaCBkZWxpbWl0ZXIuXG4gICAgICB2YXIgcmVEZWxpbWl0ZXJzID0gUmVnRXhwKFxuICAgICAgICAob3B0aW9ucy5lc2NhcGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICBpbnRlcnBvbGF0ZS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAoaW50ZXJwb2xhdGUgPT09IHJlSW50ZXJwb2xhdGUgPyByZUVzVGVtcGxhdGUgOiByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArXG4gICAgICAgIChvcHRpb25zLmV2YWx1YXRlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wkJ1xuICAgICAgLCAnZycpO1xuXG4gICAgICAvLyBVc2UgYSBzb3VyY2VVUkwgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgICAvLyBUaGUgc291cmNlVVJMIGdldHMgaW5qZWN0ZWQgaW50byB0aGUgc291cmNlIHRoYXQncyBldmFsLWVkLCBzbyBiZSBjYXJlZnVsXG4gICAgICAvLyB3aXRoIGxvb2t1cCAoaW4gY2FzZSBvZiBlLmcuIHByb3RvdHlwZSBwb2xsdXRpb24pLCBhbmQgc3RyaXAgbmV3bGluZXMgaWYgYW55LlxuICAgICAgLy8gQSBuZXdsaW5lIHdvdWxkbid0IGJlIGEgdmFsaWQgc291cmNlVVJMIGFueXdheSwgYW5kIGl0J2QgZW5hYmxlIGNvZGUgaW5qZWN0aW9uLlxuICAgICAgdmFyIHNvdXJjZVVSTCA9ICcvLyMgc291cmNlVVJMPScgK1xuICAgICAgICAoaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnc291cmNlVVJMJylcbiAgICAgICAgICA/IChvcHRpb25zLnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9bXFxyXFxuXS9nLCAnICcpXG4gICAgICAgICAgOiAoJ2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbJyArICgrK3RlbXBsYXRlQ291bnRlcikgKyAnXScpXG4gICAgICAgICkgKyAnXFxuJztcblxuICAgICAgc3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlVmFsdWUsIGludGVycG9sYXRlVmFsdWUsIGVzVGVtcGxhdGVWYWx1ZSwgZXZhbHVhdGVWYWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIGludGVycG9sYXRlVmFsdWUgfHwgKGludGVycG9sYXRlVmFsdWUgPSBlc1RlbXBsYXRlVmFsdWUpO1xuXG4gICAgICAgIC8vIEVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuJ3QgYmUgaW5jbHVkZWQgaW4gc3RyaW5nIGxpdGVyYWxzLlxuICAgICAgICBzb3VyY2UgKz0gc3RyaW5nLnNsaWNlKGluZGV4LCBvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsIGVzY2FwZVN0cmluZ0NoYXIpO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLlxuICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG5fX2UoXCIgKyBlc2NhcGVWYWx1ZSArIFwiKSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGVWYWx1ZSArIFwiO1xcbl9fcCArPSAnXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHtcbiAgICAgICAgICBzb3VyY2UgKz0gXCInICtcXG4oKF9fdCA9IChcIiArIGludGVycG9sYXRlVmFsdWUgKyBcIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xcbidcIjtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDtcblxuICAgICAgICAvLyBUaGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIHByb2R1Y3RzIG5lZWRzIGBtYXRjaGAgcmV0dXJuZWQgaW5cbiAgICAgICAgLy8gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBgb2Zmc2V0YCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIHNvdXJjZSArPSBcIic7XFxuXCI7XG5cbiAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWRcbiAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi5cbiAgICAgIC8vIExpa2Ugd2l0aCBzb3VyY2VVUkwsIHdlIHRha2UgY2FyZSB0byBub3QgY2hlY2sgdGhlIG9wdGlvbidzIHByb3RvdHlwZSxcbiAgICAgIC8vIGFzIHRoaXMgY29uZmlndXJhdGlvbiBpcyBhIGNvZGUgaW5qZWN0aW9uIHZlY3Rvci5cbiAgICAgIHZhciB2YXJpYWJsZSA9IGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3ZhcmlhYmxlJykgJiYgb3B0aW9ucy52YXJpYWJsZTtcbiAgICAgIGlmICghdmFyaWFibGUpIHtcbiAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xcbicgKyBzb3VyY2UgKyAnXFxufVxcbic7XG4gICAgICB9XG4gICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuXG4gICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSlcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJylcbiAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7XG5cbiAgICAgIC8vIEZyYW1lIGNvZGUgYXMgdGhlIGZ1bmN0aW9uIGJvZHkuXG4gICAgICBzb3VyY2UgPSAnZnVuY3Rpb24oJyArICh2YXJpYWJsZSB8fCAnb2JqJykgKyAnKSB7XFxuJyArXG4gICAgICAgICh2YXJpYWJsZVxuICAgICAgICAgID8gJydcbiAgICAgICAgICA6ICdvYmogfHwgKG9iaiA9IHt9KTtcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBcInZhciBfX3QsIF9fcCA9ICcnXCIgK1xuICAgICAgICAoaXNFc2NhcGluZ1xuICAgICAgICAgICA/ICcsIF9fZSA9IF8uZXNjYXBlJ1xuICAgICAgICAgICA6ICcnXG4gICAgICAgICkgK1xuICAgICAgICAoaXNFdmFsdWF0aW5nXG4gICAgICAgICAgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcXG4nICtcbiAgICAgICAgICAgIFwiZnVuY3Rpb24gcHJpbnQoKSB7IF9fcCArPSBfX2ouY2FsbChhcmd1bWVudHMsICcnKSB9XFxuXCJcbiAgICAgICAgICA6ICc7XFxuJ1xuICAgICAgICApICtcbiAgICAgICAgc291cmNlICtcbiAgICAgICAgJ3JldHVybiBfX3BcXG59JztcblxuICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKVxuICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQsIGltcG9ydHNWYWx1ZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb3ZpZGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uJ3Mgc291cmNlIGJ5IGl0cyBgdG9TdHJpbmdgIG1ldGhvZCBvclxuICAgICAgLy8gdGhlIGBzb3VyY2VgIHByb3BlcnR5IGFzIGEgY29udmVuaWVuY2UgZm9yIGlubGluaW5nIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICBpZiAoaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tZm9vLWJhci0tJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vYmFyJ1xuICAgICAqXG4gICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIHVwcGVyIGNhc2UganVzdCBsaWtlXG4gICAgICogW1N0cmluZyN0b1VwcGVyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9VcHBlckNhc2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJy0tRk9PLUJBUi0tJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PQkFSJ1xuICAgICAqXG4gICAgICogXy50b1VwcGVyKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdfX0ZPT19CQVJfXydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1VwcGVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gICAgICogLy8gPT4gWydmb28nLCAnYmFyJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksXG4gICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQsIGVuZCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltRW5kKCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJyAgYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltRW5kKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnLV8tYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCAwLCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPXdoaXRlc3BhY2VdIFRoZSBjaGFyYWN0ZXJzIHRvIHRyaW0uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjICAnXG4gICAgICpcbiAgICAgKiBfLnRyaW1TdGFydCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJ2FiYy1fLSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltU3RhcnQoc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0KS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnVuY2F0ZXMgYHN0cmluZ2AgaWYgaXQncyBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoLlxuICAgICAqIFRoZSBsYXN0IGNoYXJhY3RlcnMgb2YgdGhlIHRydW5jYXRlZCBzdHJpbmcgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9taXNzaW9uXG4gICAgICogc3RyaW5nIHdoaWNoIGRlZmF1bHRzIHRvIFwiLi4uXCIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxlbmd0aD0zMF0gVGhlIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMub21pc3Npb249Jy4uLiddIFRoZSBzdHJpbmcgdG8gaW5kaWNhdGUgdGV4dCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW29wdGlvbnMuc2VwYXJhdG9yXSBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gdHJ1bmNhdGUgdG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJ1bmNhdGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycpO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm8uLi4nXG4gICAgICpcbiAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywge1xuICAgICAqICAgJ2xlbmd0aCc6IDI0LFxuICAgICAqICAgJ3NlcGFyYXRvcic6ICcgJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAvLD8gKy9cbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdvbWlzc2lvbic6ICcgWy4uLl0nXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZyBbLi4uXSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBERUZBVUxUX1RSVU5DX0xFTkdUSCxcbiAgICAgICAgICBvbWlzc2lvbiA9IERFRkFVTFRfVFJVTkNfT01JU1NJT047XG5cbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gJ3NlcGFyYXRvcicgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc2VwYXJhdG9yIDogc2VwYXJhdG9yO1xuICAgICAgICBsZW5ndGggPSAnbGVuZ3RoJyBpbiBvcHRpb25zID8gdG9JbnRlZ2VyKG9wdGlvbnMubGVuZ3RoKSA6IGxlbmd0aDtcbiAgICAgICAgb21pc3Npb24gPSAnb21pc3Npb24nIGluIG9wdGlvbnMgPyBiYXNlVG9TdHJpbmcob3B0aW9ucy5vbWlzc2lvbikgOiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTtcbiAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pO1xuICAgICAgaWYgKGVuZCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHNcbiAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKVxuICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpO1xuXG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uO1xuICAgICAgfVxuICAgICAgaWYgKHN0clN5bWJvbHMpIHtcbiAgICAgICAgZW5kICs9IChyZXN1bHQubGVuZ3RoIC0gZW5kKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1JlZ0V4cChzZXBhcmF0b3IpKSB7XG4gICAgICAgIGlmIChzdHJpbmcuc2xpY2UoZW5kKS5zZWFyY2goc2VwYXJhdG9yKSkge1xuICAgICAgICAgIHZhciBtYXRjaCxcbiAgICAgICAgICAgICAgc3Vic3RyaW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7XG4gICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCA/IGVuZCA6IG5ld0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmluZGV4T2YoYmFzZVRvU3RyaW5nKHNlcGFyYXRvciksIGVuZCkgIT0gZW5kKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaW52ZXJzZSBvZiBgXy5lc2NhcGVgOyB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGUgSFRNTCBlbnRpdGllc1xuICAgICAqIGAmYW1wO2AsIGAmbHQ7YCwgYCZndDtgLCBgJnF1b3Q7YCwgYW5kIGAmIzM5O2AgaW4gYHN0cmluZ2AgdG9cbiAgICAgKiB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm8gb3RoZXIgSFRNTCBlbnRpdGllcyBhcmUgdW5lc2NhcGVkLiBUbyB1bmVzY2FwZSBhZGRpdGlvbmFsXG4gICAgICogSFRNTCBlbnRpdGllcyB1c2UgYSB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGxpa2UgW19oZV9dKGh0dHBzOi8vbXRocy5iZS9oZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdW5lc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmVzY2FwZSgnZnJlZCwgYmFybmV5LCAmYW1wOyBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuZXNjYXBlKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzRXNjYXBlZEh0bWwudGVzdChzdHJpbmcpKVxuICAgICAgICA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlZEh0bWwsIHVuZXNjYXBlSHRtbENoYXIpXG4gICAgICAgIDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKlxuICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpO1xuICAgICAqIC8vID0+ICdGT08gQkFSJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKlxuICAgICAqIF8udXBwZXJGaXJzdCgnRlJFRCcpO1xuICAgICAqIC8vID0+ICdGUkVEJ1xuICAgICAqL1xuICAgIHZhciB1cHBlckZpcnN0ID0gY3JlYXRlQ2FzZUZpcnN0KCd0b1VwcGVyQ2FzZScpO1xuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gICAgICpcbiAgICAgKiBfLndvcmRzKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycsIC9bXiwgXSsvZyk7XG4gICAgICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdvcmRzKHN0cmluZywgcGF0dGVybiwgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwYXR0ZXJuID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBwYXR0ZXJuO1xuXG4gICAgICBpZiAocGF0dGVybiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHBhdHRlcm4pIHx8IFtdO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGludm9rZSBgZnVuY2AsIHJldHVybmluZyBlaXRoZXIgdGhlIHJlc3VsdCBvciB0aGUgY2F1Z2h0IGVycm9yXG4gICAgICogb2JqZWN0LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXR0ZW1wdC5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYGZ1bmNgIHJlc3VsdCBvciBlcnJvciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIHRocm93aW5nIGVycm9ycyBmb3IgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgICogdmFyIGVsZW1lbnRzID0gXy5hdHRlbXB0KGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICogICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICogfSwgJz5fPicpO1xuICAgICAqXG4gICAgICogaWYgKF8uaXNFcnJvcihlbGVtZW50cykpIHtcbiAgICAgKiAgIGVsZW1lbnRzID0gW107XG4gICAgICogfVxuICAgICAqL1xuICAgIHZhciBhdHRlbXB0ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBpc0Vycm9yKGUpID8gZSA6IG5ldyBFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmdcbiAgICAgKiBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgYm91bmQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYmluZCBhbmQgYXNzaWduIHRoZSBib3VuZCBtZXRob2RzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IG1ldGhvZE5hbWVzIFRoZSBvYmplY3QgbWV0aG9kIG5hbWVzIHRvIGJpbmQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHZpZXcgPSB7XG4gICAgICogICAnbGFiZWwnOiAnZG9jcycsXG4gICAgICogICAnY2xpY2snOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2NsaWNrZWQgJyArIHRoaXMubGFiZWwpO1xuICAgICAqICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmJpbmRBbGwodmlldywgWydjbGljayddKTtcbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdmlldy5jbGljayk7XG4gICAgICogLy8gPT4gTG9ncyAnY2xpY2tlZCBkb2NzJyB3aGVuIGNsaWNrZWQuXG4gICAgICovXG4gICAgdmFyIGJpbmRBbGwgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIG1ldGhvZE5hbWVzKSB7XG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKGtleSkge1xuICAgICAgICBrZXkgPSB0b0tleShrZXkpO1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIGJpbmQob2JqZWN0W2tleV0sIG9iamVjdCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uXG4gICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoW1xuICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSxcbiAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sXG4gICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV1cbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+ICdtYXRjaGVzIEInXG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pO1xuICAgICAqIC8vID0+ICdubyBtYXRjaCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7XG5cbiAgICAgIHBhaXJzID0gIWxlbmd0aCA/IFtdIDogYXJyYXlNYXAocGFpcnMsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYWlyWzFdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0b0l0ZXJhdGVlKHBhaXJbMF0pLCBwYWlyWzFdXTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2luZGV4XTtcbiAgICAgICAgICBpZiAoYXBwbHkocGFpclswXSwgdGhpcywgYXJncykpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseShwYWlyWzFdLCB0aGlzLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGhcbiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWZcbiAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoXG4gICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgYHZhbHVlYCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkIGluXG4gICAgICogaXRzIHBsYWNlLiBUaGUgYGRlZmF1bHRWYWx1ZWAgaXMgcmV0dXJuZWQgaWYgYHZhbHVlYCBpcyBgTmFOYCwgYG51bGxgLFxuICAgICAqIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTQuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRlZmF1bHRUbygxLCAxMCk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8odW5kZWZpbmVkLCAxMCk7XG4gICAgICogLy8gPT4gMTBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uc1xuICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbG93YCBleGNlcHQgdGhhdCBpdCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdFxuICAgICAqIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbZnVuY3NdIFRoZSBmdW5jdGlvbnMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAgICAgKiBAc2VlIF8uZmxvd1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3dSaWdodChbc3F1YXJlLCBfLmFkZF0pO1xuICAgICAqIGFkZFNxdWFyZSgxLCAyKTtcbiAgICAgKiAvLyA9PiA5XG4gICAgICovXG4gICAgdmFyIGZsb3dSaWdodCA9IGNyZWF0ZUZsb3codHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkXG4gICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlXG4gICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlXG4gICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50XG4gICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7XG4gICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7XG4gICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykge1xuICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpO1xuICAgICAqICAgfTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTtcbiAgICAgKiAvLyA9PiBbJ2RlZiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykge1xuICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gYSBnaXZlblxuICAgICAqIG9iamVjdCBhbmQgYHNvdXJjZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgZXF1aXZhbGVudFxuICAgICAqIHByb3BlcnR5IHZhbHVlcywgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uaXNNYXRjaGAgd2l0aCBgc291cmNlYFxuICAgICAqIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QgYHNvdXJjZWBcbiAgICAgKiB2YWx1ZXMgYWdhaW5zdCBhbnkgYXJyYXkgb3Igb2JqZWN0IHZhbHVlLCByZXNwZWN0aXZlbHkuIFNlZSBgXy5pc0VxdWFsYFxuICAgICAqIGZvciBhIGxpc3Qgb2Ygc3VwcG9ydGVkIHZhbHVlIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0sXG4gICAgICogICB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm1hdGNoZXMoeyAnYSc6IDQsICdjJzogNiB9KSk7XG4gICAgICogLy8gPT4gW3sgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSwgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZVxuICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZVxuICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3RcbiAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlXG4gICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSxcbiAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCwgYmFzZUNsb25lKHNyY1ZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LFxuICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqL1xuICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1ldGhvZGA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiB0aGUgbWV0aG9kIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZVxuICAgICAqIHByb3ZpZGVkIHRvIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjcuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBfLnRpbWVzKDMsIF8uY29uc3RhbnQpLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICpcbiAgICAgKiBfLm1hcChbWydhJywgJzInXSwgWydjJywgJzAnXV0sIF8ubWV0aG9kT2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZE9mID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYWxsIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBmdW5jdGlvbiBwcm9wZXJ0aWVzIG9mIGEgc291cmNlXG4gICAgICogb2JqZWN0IHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QuIElmIGBvYmplY3RgIGlzIGEgZnVuY3Rpb24sIHRoZW4gbWV0aG9kc1xuICAgICAqIGFyZSBhZGRlZCB0byBpdHMgcHJvdG90eXBlIGFzIHdlbGwuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVXNlIGBfLnJ1bkluQ29udGV4dGAgdG8gY3JlYXRlIGEgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdG9cbiAgICAgKiBhdm9pZCBjb25mbGljdHMgY2F1c2VkIGJ5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBbb2JqZWN0PWxvZGFzaF0gVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgZnVuY3Rpb25zIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNoYWluPXRydWVdIFNwZWNpZnkgd2hldGhlciBtaXhpbnMgYXJlIGNoYWluYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb258T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiB2b3dlbHMoc3RyaW5nKSB7XG4gICAgICogICByZXR1cm4gXy5maWx0ZXIoc3RyaW5nLCBmdW5jdGlvbih2KSB7XG4gICAgICogICAgIHJldHVybiAvW2FlaW91XS9pLnRlc3Qodik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9KTtcbiAgICAgKiBfLnZvd2VscygnZnJlZCcpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCkudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqXG4gICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSwgeyAnY2hhaW4nOiBmYWxzZSB9KTtcbiAgICAgKiBfKCdmcmVkJykudm93ZWxzKCk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaXhpbihvYmplY3QsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgICAgdmFyIHByb3BzID0ga2V5cyhzb3VyY2UpLFxuICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIHByb3BzKTtcblxuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJlxuICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkge1xuICAgICAgICBvcHRpb25zID0gc291cmNlO1xuICAgICAgICBzb3VyY2UgPSBvYmplY3Q7XG4gICAgICAgIG9iamVjdCA9IHRoaXM7XG4gICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7XG4gICAgICB9XG4gICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLFxuICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTtcblxuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICAgIHZhciBmdW5jID0gc291cmNlW21ldGhvZE5hbWVdO1xuICAgICAgICBvYmplY3RbbWV0aG9kTmFtZV0gPSBmdW5jO1xuICAgICAgICBpZiAoaXNGdW5jKSB7XG4gICAgICAgICAgb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNoYWluQWxsID0gdGhpcy5fX2NoYWluX187XG4gICAgICAgICAgICBpZiAoY2hhaW4gfHwgY2hhaW5BbGwpIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbnMgPSByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7XG5cbiAgICAgICAgICAgICAgYWN0aW9ucy5wdXNoKHsgJ2Z1bmMnOiBmdW5jLCAnYXJncyc6IGFyZ3VtZW50cywgJ3RoaXNBcmcnOiBvYmplY3QgfSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5fX2NoYWluX18gPSBjaGFpbkFsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KG9iamVjdCwgYXJyYXlQdXNoKFt0aGlzLnZhbHVlKCldLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnRzIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzIHByZXZpb3VzIHZhbHVlIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvXG4gICAgICogdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGBsb2Rhc2hgIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgbG9kYXNoID0gXy5ub0NvbmZsaWN0KCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgIGlmIChyb290Ll8gPT09IHRoaXMpIHtcbiAgICAgICAgcm9vdC5fID0gb2xkRGFzaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8ubm9vcCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG5vb3AoKSB7XG4gICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLFxuICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpO1xuICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTtcbiAgICAgKiAvLyA9PiAnYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBudGhBcmcobikge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgaXRlcmF0ZWVzYCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXNcbiAgICAgKiBhbmQgcmV0dXJucyB0aGVpciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBpdGVyYXRlZXMgdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlcihbTWF0aC5tYXgsIE1hdGgubWluXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKDEsIDIsIDMsIDQpO1xuICAgICAqIC8vID0+IFs0LCAxXVxuICAgICAqL1xuICAgIHZhciBvdmVyID0gY3JlYXRlT3ZlcihhcnJheU1hcCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbGwqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVyblxuICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dXG4gICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlclNvbWUoW0Jvb2xlYW4sIGlzRmluaXRlXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKCcxJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlclNvbWUgPSBjcmVhdGVPdmVyKGFycmF5U29tZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpO1xuICAgICAqIC8vID0+IFsyLCAxXVxuICAgICAqXG4gICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgICByZXR1cm4gaXNLZXkocGF0aCkgPyBiYXNlUHJvcGVydHkodG9LZXkocGF0aCkpIDogYmFzZVByb3BlcnR5RGVlcChwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zXG4gICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqXG4gICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7XG4gICAgICogLy8gPT4gWzIsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAgICAgKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICAgICAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICAgICAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZSg0KTtcbiAgICAgKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoLTQpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA1KTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICAgICAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIHZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluXG4gICAgICogZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoNCk7XG4gICAgICogLy8gPT4gWzMsIDIsIDEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoLTQpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpO1xuICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7XG4gICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7XG4gICAgICogLy8gPT4gWzEsIDEsIDFdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlUmlnaHQoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXMpO1xuICAgICAqIC8vID0+IFtbXSwgW11dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheXNbMF0gPT09IGFycmF5c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViQXJyYXkoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7fSwge31dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViU3RyaW5nKTtcbiAgICAgKiAvLyA9PiBbJycsICcnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJTdHJpbmcoKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViVHJ1ZSk7XG4gICAgICogLy8gPT4gW3RydWUsIHRydWVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YlRydWUoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddXG4gICAgICpcbiAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILFxuICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSk7XG4gICAgICBuIC09IE1BWF9BUlJBWV9MRU5HVEg7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlVGltZXMobGVuZ3RoLCBpdGVyYXRlZSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgICAgaXRlcmF0ZWUoaW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ11cbiAgICAgKlxuICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBJZiBgcHJlZml4YCBpcyBnaXZlbiwgdGhlIElEIGlzIGFwcGVuZGVkIHRvIGl0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ByZWZpeD0nJ10gVGhlIHZhbHVlIHRvIHByZWZpeCB0aGUgSUQgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmlxdWUgSUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoJ2NvbnRhY3RfJyk7XG4gICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0J1xuICAgICAqXG4gICAgICogXy51bmlxdWVJZCgpO1xuICAgICAqIC8vID0+ICcxMDUnXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcXVlSWQocHJlZml4KSB7XG4gICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjtcbiAgICAgIHJldHVybiB0b1N0cmluZyhwcmVmaXgpICsgaWQ7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uYWRkKDYsIDQpO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHtcbiAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHVwIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIHVwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdXAgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCB1cCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg0LjAwNik7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogXy5jZWlsKDYuMDA0LCAyKTtcbiAgICAgKiAvLyA9PiA2LjAxXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNjA0MCwgLTIpO1xuICAgICAqIC8vID0+IDYxMDBcbiAgICAgKi9cbiAgICB2YXIgY2VpbCA9IGNyZWF0ZVJvdW5kKCdjZWlsJyk7XG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpZGVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpdmlzb3IgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBkaXZpc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBxdW90aWVudC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kaXZpZGUoNiwgNCk7XG4gICAgICogLy8gPT4gMS41XG4gICAgICovXG4gICAgdmFyIGRpdmlkZSA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgICAgIHJldHVybiBkaXZpZGVuZCAvIGRpdmlzb3I7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4xMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mbG9vcig0LjAwNik7XG4gICAgICogLy8gPT4gNFxuICAgICAqXG4gICAgICogXy5mbG9vcigwLjA0NiwgMik7XG4gICAgICogLy8gPT4gMC4wNFxuICAgICAqXG4gICAgICogXy5mbG9vcig0MDYwLCAtMik7XG4gICAgICogLy8gPT4gNDAwMFxuICAgICAqL1xuICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWF4KFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gOFxuICAgICAqXG4gICAgICogXy5tYXgoW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1heChhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDIgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1lYW4oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbihhcnJheSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBpZGVudGl0eSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC43LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dO1xuICAgICAqXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksXG4gICAgICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWluKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogXy5taW4oW10pO1xuICAgICAqIC8vID0+IHVuZGVmaW5lZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1pbihhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaFxuICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07XG4gICAgICpcbiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4geyAnbic6IDEgfVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5taW5CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXVsdGlwbGllciBUaGUgZmlyc3QgbnVtYmVyIGluIGEgbXVsdGlwbGljYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpY2FuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHByb2R1Y3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubXVsdGlwbHkoNiwgNCk7XG4gICAgICogLy8gPT4gMjRcbiAgICAgKi9cbiAgICB2YXIgbXVsdGlwbHkgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG11bHRpcGxpZXIsIG11bHRpcGxpY2FuZCkge1xuICAgICAgcmV0dXJuIG11bHRpcGxpZXIgKiBtdWx0aXBsaWNhbmQ7XG4gICAgfSwgMSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICAgICAqIC8vID0+IDQuMDFcbiAgICAgKlxuICAgICAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQxMDBcbiAgICAgKi9cbiAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWludWVuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN1YnRyYWhlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnN1YnRyYWN0KDYsIDQpO1xuICAgICAqIC8vID0+IDJcbiAgICAgKi9cbiAgICB2YXIgc3VidHJhY3QgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsIHN1YnRyYWhlbmQpIHtcbiAgICAgIHJldHVybiBtaW51ZW5kIC0gc3VidHJhaGVuZDtcbiAgICB9LCAwKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNC4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdW0oWzQsIDIsIDgsIDZdKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgaWRlbnRpdHkpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpO1xuICAgICAqIC8vID0+IDIwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogMDtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0aGF0IHJldHVybiB3cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFmdGVyID0gYWZ0ZXI7XG4gICAgbG9kYXNoLmFyeSA9IGFyeTtcbiAgICBsb2Rhc2guYXNzaWduID0gYXNzaWduO1xuICAgIGxvZGFzaC5hc3NpZ25JbiA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5hc3NpZ25JbldpdGggPSBhc3NpZ25JbldpdGg7XG4gICAgbG9kYXNoLmFzc2lnbldpdGggPSBhc3NpZ25XaXRoO1xuICAgIGxvZGFzaC5hdCA9IGF0O1xuICAgIGxvZGFzaC5iZWZvcmUgPSBiZWZvcmU7XG4gICAgbG9kYXNoLmJpbmQgPSBiaW5kO1xuICAgIGxvZGFzaC5iaW5kQWxsID0gYmluZEFsbDtcbiAgICBsb2Rhc2guYmluZEtleSA9IGJpbmRLZXk7XG4gICAgbG9kYXNoLmNhc3RBcnJheSA9IGNhc3RBcnJheTtcbiAgICBsb2Rhc2guY2hhaW4gPSBjaGFpbjtcbiAgICBsb2Rhc2guY2h1bmsgPSBjaHVuaztcbiAgICBsb2Rhc2guY29tcGFjdCA9IGNvbXBhY3Q7XG4gICAgbG9kYXNoLmNvbmNhdCA9IGNvbmNhdDtcbiAgICBsb2Rhc2guY29uZCA9IGNvbmQ7XG4gICAgbG9kYXNoLmNvbmZvcm1zID0gY29uZm9ybXM7XG4gICAgbG9kYXNoLmNvbnN0YW50ID0gY29uc3RhbnQ7XG4gICAgbG9kYXNoLmNvdW50QnkgPSBjb3VudEJ5O1xuICAgIGxvZGFzaC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgbG9kYXNoLmN1cnJ5ID0gY3Vycnk7XG4gICAgbG9kYXNoLmN1cnJ5UmlnaHQgPSBjdXJyeVJpZ2h0O1xuICAgIGxvZGFzaC5kZWJvdW5jZSA9IGRlYm91bmNlO1xuICAgIGxvZGFzaC5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuICAgIGxvZGFzaC5kZWZhdWx0c0RlZXAgPSBkZWZhdWx0c0RlZXA7XG4gICAgbG9kYXNoLmRlZmVyID0gZGVmZXI7XG4gICAgbG9kYXNoLmRlbGF5ID0gZGVsYXk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlO1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlQnkgPSBkaWZmZXJlbmNlQnk7XG4gICAgbG9kYXNoLmRpZmZlcmVuY2VXaXRoID0gZGlmZmVyZW5jZVdpdGg7XG4gICAgbG9kYXNoLmRyb3AgPSBkcm9wO1xuICAgIGxvZGFzaC5kcm9wUmlnaHQgPSBkcm9wUmlnaHQ7XG4gICAgbG9kYXNoLmRyb3BSaWdodFdoaWxlID0gZHJvcFJpZ2h0V2hpbGU7XG4gICAgbG9kYXNoLmRyb3BXaGlsZSA9IGRyb3BXaGlsZTtcbiAgICBsb2Rhc2guZmlsbCA9IGZpbGw7XG4gICAgbG9kYXNoLmZpbHRlciA9IGZpbHRlcjtcbiAgICBsb2Rhc2guZmxhdE1hcCA9IGZsYXRNYXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZWVwID0gZmxhdE1hcERlZXA7XG4gICAgbG9kYXNoLmZsYXRNYXBEZXB0aCA9IGZsYXRNYXBEZXB0aDtcbiAgICBsb2Rhc2guZmxhdHRlbiA9IGZsYXR0ZW47XG4gICAgbG9kYXNoLmZsYXR0ZW5EZWVwID0gZmxhdHRlbkRlZXA7XG4gICAgbG9kYXNoLmZsYXR0ZW5EZXB0aCA9IGZsYXR0ZW5EZXB0aDtcbiAgICBsb2Rhc2guZmxpcCA9IGZsaXA7XG4gICAgbG9kYXNoLmZsb3cgPSBmbG93O1xuICAgIGxvZGFzaC5mbG93UmlnaHQgPSBmbG93UmlnaHQ7XG4gICAgbG9kYXNoLmZyb21QYWlycyA9IGZyb21QYWlycztcbiAgICBsb2Rhc2guZnVuY3Rpb25zID0gZnVuY3Rpb25zO1xuICAgIGxvZGFzaC5mdW5jdGlvbnNJbiA9IGZ1bmN0aW9uc0luO1xuICAgIGxvZGFzaC5ncm91cEJ5ID0gZ3JvdXBCeTtcbiAgICBsb2Rhc2guaW5pdGlhbCA9IGluaXRpYWw7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvbjtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uQnkgPSBpbnRlcnNlY3Rpb25CeTtcbiAgICBsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aCA9IGludGVyc2VjdGlvbldpdGg7XG4gICAgbG9kYXNoLmludmVydCA9IGludmVydDtcbiAgICBsb2Rhc2guaW52ZXJ0QnkgPSBpbnZlcnRCeTtcbiAgICBsb2Rhc2guaW52b2tlTWFwID0gaW52b2tlTWFwO1xuICAgIGxvZGFzaC5pdGVyYXRlZSA9IGl0ZXJhdGVlO1xuICAgIGxvZGFzaC5rZXlCeSA9IGtleUJ5O1xuICAgIGxvZGFzaC5rZXlzID0ga2V5cztcbiAgICBsb2Rhc2gua2V5c0luID0ga2V5c0luO1xuICAgIGxvZGFzaC5tYXAgPSBtYXA7XG4gICAgbG9kYXNoLm1hcEtleXMgPSBtYXBLZXlzO1xuICAgIGxvZGFzaC5tYXBWYWx1ZXMgPSBtYXBWYWx1ZXM7XG4gICAgbG9kYXNoLm1hdGNoZXMgPSBtYXRjaGVzO1xuICAgIGxvZGFzaC5tYXRjaGVzUHJvcGVydHkgPSBtYXRjaGVzUHJvcGVydHk7XG4gICAgbG9kYXNoLm1lbW9pemUgPSBtZW1vaXplO1xuICAgIGxvZGFzaC5tZXJnZSA9IG1lcmdlO1xuICAgIGxvZGFzaC5tZXJnZVdpdGggPSBtZXJnZVdpdGg7XG4gICAgbG9kYXNoLm1ldGhvZCA9IG1ldGhvZDtcbiAgICBsb2Rhc2gubWV0aG9kT2YgPSBtZXRob2RPZjtcbiAgICBsb2Rhc2gubWl4aW4gPSBtaXhpbjtcbiAgICBsb2Rhc2gubmVnYXRlID0gbmVnYXRlO1xuICAgIGxvZGFzaC5udGhBcmcgPSBudGhBcmc7XG4gICAgbG9kYXNoLm9taXQgPSBvbWl0O1xuICAgIGxvZGFzaC5vbWl0QnkgPSBvbWl0Qnk7XG4gICAgbG9kYXNoLm9uY2UgPSBvbmNlO1xuICAgIGxvZGFzaC5vcmRlckJ5ID0gb3JkZXJCeTtcbiAgICBsb2Rhc2gub3ZlciA9IG92ZXI7XG4gICAgbG9kYXNoLm92ZXJBcmdzID0gb3ZlckFyZ3M7XG4gICAgbG9kYXNoLm92ZXJFdmVyeSA9IG92ZXJFdmVyeTtcbiAgICBsb2Rhc2gub3ZlclNvbWUgPSBvdmVyU29tZTtcbiAgICBsb2Rhc2gucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgbG9kYXNoLnBhcnRpYWxSaWdodCA9IHBhcnRpYWxSaWdodDtcbiAgICBsb2Rhc2gucGFydGl0aW9uID0gcGFydGl0aW9uO1xuICAgIGxvZGFzaC5waWNrID0gcGljaztcbiAgICBsb2Rhc2gucGlja0J5ID0gcGlja0J5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIGxvZGFzaC5wcm9wZXJ0eU9mID0gcHJvcGVydHlPZjtcbiAgICBsb2Rhc2gucHVsbCA9IHB1bGw7XG4gICAgbG9kYXNoLnB1bGxBbGwgPSBwdWxsQWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsQnkgPSBwdWxsQWxsQnk7XG4gICAgbG9kYXNoLnB1bGxBbGxXaXRoID0gcHVsbEFsbFdpdGg7XG4gICAgbG9kYXNoLnB1bGxBdCA9IHB1bGxBdDtcbiAgICBsb2Rhc2gucmFuZ2UgPSByYW5nZTtcbiAgICBsb2Rhc2gucmFuZ2VSaWdodCA9IHJhbmdlUmlnaHQ7XG4gICAgbG9kYXNoLnJlYXJnID0gcmVhcmc7XG4gICAgbG9kYXNoLnJlamVjdCA9IHJlamVjdDtcbiAgICBsb2Rhc2gucmVtb3ZlID0gcmVtb3ZlO1xuICAgIGxvZGFzaC5yZXN0ID0gcmVzdDtcbiAgICBsb2Rhc2gucmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgbG9kYXNoLnNhbXBsZVNpemUgPSBzYW1wbGVTaXplO1xuICAgIGxvZGFzaC5zZXQgPSBzZXQ7XG4gICAgbG9kYXNoLnNldFdpdGggPSBzZXRXaXRoO1xuICAgIGxvZGFzaC5zaHVmZmxlID0gc2h1ZmZsZTtcbiAgICBsb2Rhc2guc2xpY2UgPSBzbGljZTtcbiAgICBsb2Rhc2guc29ydEJ5ID0gc29ydEJ5O1xuICAgIGxvZGFzaC5zb3J0ZWRVbmlxID0gc29ydGVkVW5pcTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcUJ5ID0gc29ydGVkVW5pcUJ5O1xuICAgIGxvZGFzaC5zcGxpdCA9IHNwbGl0O1xuICAgIGxvZGFzaC5zcHJlYWQgPSBzcHJlYWQ7XG4gICAgbG9kYXNoLnRhaWwgPSB0YWlsO1xuICAgIGxvZGFzaC50YWtlID0gdGFrZTtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0ID0gdGFrZVJpZ2h0O1xuICAgIGxvZGFzaC50YWtlUmlnaHRXaGlsZSA9IHRha2VSaWdodFdoaWxlO1xuICAgIGxvZGFzaC50YWtlV2hpbGUgPSB0YWtlV2hpbGU7XG4gICAgbG9kYXNoLnRhcCA9IHRhcDtcbiAgICBsb2Rhc2gudGhyb3R0bGUgPSB0aHJvdHRsZTtcbiAgICBsb2Rhc2gudGhydSA9IHRocnU7XG4gICAgbG9kYXNoLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIGxvZGFzaC50b1BhaXJzID0gdG9QYWlycztcbiAgICBsb2Rhc2gudG9QYWlyc0luID0gdG9QYWlyc0luO1xuICAgIGxvZGFzaC50b1BhdGggPSB0b1BhdGg7XG4gICAgbG9kYXNoLnRvUGxhaW5PYmplY3QgPSB0b1BsYWluT2JqZWN0O1xuICAgIGxvZGFzaC50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgbG9kYXNoLnVuYXJ5ID0gdW5hcnk7XG4gICAgbG9kYXNoLnVuaW9uID0gdW5pb247XG4gICAgbG9kYXNoLnVuaW9uQnkgPSB1bmlvbkJ5O1xuICAgIGxvZGFzaC51bmlvbldpdGggPSB1bmlvbldpdGg7XG4gICAgbG9kYXNoLnVuaXEgPSB1bmlxO1xuICAgIGxvZGFzaC51bmlxQnkgPSB1bmlxQnk7XG4gICAgbG9kYXNoLnVuaXFXaXRoID0gdW5pcVdpdGg7XG4gICAgbG9kYXNoLnVuc2V0ID0gdW5zZXQ7XG4gICAgbG9kYXNoLnVuemlwID0gdW56aXA7XG4gICAgbG9kYXNoLnVuemlwV2l0aCA9IHVuemlwV2l0aDtcbiAgICBsb2Rhc2gudXBkYXRlID0gdXBkYXRlO1xuICAgIGxvZGFzaC51cGRhdGVXaXRoID0gdXBkYXRlV2l0aDtcbiAgICBsb2Rhc2gudmFsdWVzID0gdmFsdWVzO1xuICAgIGxvZGFzaC52YWx1ZXNJbiA9IHZhbHVlc0luO1xuICAgIGxvZGFzaC53aXRob3V0ID0gd2l0aG91dDtcbiAgICBsb2Rhc2gud29yZHMgPSB3b3JkcztcbiAgICBsb2Rhc2gud3JhcCA9IHdyYXA7XG4gICAgbG9kYXNoLnhvciA9IHhvcjtcbiAgICBsb2Rhc2gueG9yQnkgPSB4b3JCeTtcbiAgICBsb2Rhc2gueG9yV2l0aCA9IHhvcldpdGg7XG4gICAgbG9kYXNoLnppcCA9IHppcDtcbiAgICBsb2Rhc2guemlwT2JqZWN0ID0gemlwT2JqZWN0O1xuICAgIGxvZGFzaC56aXBPYmplY3REZWVwID0gemlwT2JqZWN0RGVlcDtcbiAgICBsb2Rhc2guemlwV2l0aCA9IHppcFdpdGg7XG5cbiAgICAvLyBBZGQgYWxpYXNlcy5cbiAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47XG4gICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgbWl4aW4obG9kYXNoLCBsb2Rhc2gpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuXG4gICAgbG9kYXNoLmFkZCA9IGFkZDtcbiAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTtcbiAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7XG4gICAgbG9kYXNoLmNlaWwgPSBjZWlsO1xuICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wO1xuICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lO1xuICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7XG4gICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoO1xuICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7XG4gICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvO1xuICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7XG4gICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbztcbiAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlO1xuICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoO1xuICAgIGxvZGFzaC5lcSA9IGVxO1xuICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7XG4gICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDtcbiAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTtcbiAgICBsb2Rhc2guZmluZCA9IGZpbmQ7XG4gICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDtcbiAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7XG4gICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7XG4gICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4O1xuICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5O1xuICAgIGxvZGFzaC5mbG9vciA9IGZsb29yO1xuICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5mb3JJbiA9IGZvckluO1xuICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDtcbiAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duO1xuICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0O1xuICAgIGxvZGFzaC5nZXQgPSBnZXQ7XG4gICAgbG9kYXNoLmd0ID0gZ3Q7XG4gICAgbG9kYXNoLmd0ZSA9IGd0ZTtcbiAgICBsb2Rhc2guaGFzID0gaGFzO1xuICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luO1xuICAgIGxvZGFzaC5oZWFkID0gaGVhZDtcbiAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlcztcbiAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7XG4gICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlO1xuICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7XG4gICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7XG4gICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5O1xuICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTtcbiAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDtcbiAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuO1xuICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyO1xuICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7XG4gICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbiAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7XG4gICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsO1xuICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoO1xuICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjtcbiAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTtcbiAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG4gICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjtcbiAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDtcbiAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDtcbiAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7XG4gICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7XG4gICAgbG9kYXNoLmlzTmFOID0gaXNOYU47XG4gICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7XG4gICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7XG4gICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDtcbiAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjtcbiAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDtcbiAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlO1xuICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDtcbiAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7XG4gICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7XG4gICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7XG4gICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTtcbiAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcbiAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwO1xuICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7XG4gICAgbG9kYXNoLmpvaW4gPSBqb2luO1xuICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7XG4gICAgbG9kYXNoLmxhc3QgPSBsYXN0O1xuICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mO1xuICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7XG4gICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0O1xuICAgIGxvZGFzaC5sdCA9IGx0O1xuICAgIGxvZGFzaC5sdGUgPSBsdGU7XG4gICAgbG9kYXNoLm1heCA9IG1heDtcbiAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTtcbiAgICBsb2Rhc2gubWVhbiA9IG1lYW47XG4gICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTtcbiAgICBsb2Rhc2gubWluID0gbWluO1xuICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5O1xuICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7XG4gICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTtcbiAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7XG4gICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nO1xuICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlO1xuICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5O1xuICAgIGxvZGFzaC5udGggPSBudGg7XG4gICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0O1xuICAgIGxvZGFzaC5ub29wID0gbm9vcDtcbiAgICBsb2Rhc2gubm93ID0gbm93O1xuICAgIGxvZGFzaC5wYWQgPSBwYWQ7XG4gICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDtcbiAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDtcbiAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDtcbiAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tO1xuICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7XG4gICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7XG4gICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDtcbiAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDtcbiAgICBsb2Rhc2gucm91bmQgPSByb3VuZDtcbiAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0O1xuICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7XG4gICAgbG9kYXNoLnNpemUgPSBzaXplO1xuICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7XG4gICAgbG9kYXNoLnNvbWUgPSBzb21lO1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4O1xuICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTtcbiAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlO1xuICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcbiAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDtcbiAgICBsb2Rhc2guc3VtID0gc3VtO1xuICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5O1xuICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzO1xuICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlO1xuICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7XG4gICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7XG4gICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyO1xuICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyO1xuICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjtcbiAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7XG4gICAgbG9kYXNoLnRyaW0gPSB0cmltO1xuICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDtcbiAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0O1xuICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlO1xuICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlO1xuICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7XG4gICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0O1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVhY2ggPSBmb3JFYWNoO1xuICAgIGxvZGFzaC5lYWNoUmlnaHQgPSBmb3JFYWNoUmlnaHQ7XG4gICAgbG9kYXNoLmZpcnN0ID0gaGVhZDtcblxuICAgIG1peGluKGxvZGFzaCwgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNvdXJjZSA9IHt9O1xuICAgICAgYmFzZUZvck93bihsb2Rhc2gsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaC5wcm90b3R5cGUsIG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgc291cmNlW21ldGhvZE5hbWVdID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH0oKSksIHsgJ2NoYWluJzogZmFsc2UgfSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGxvZGFzaC5WRVJTSU9OID0gVkVSU0lPTjtcblxuICAgIC8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbiAgICBhcnJheUVhY2goWydiaW5kJywgJ2JpbmRLZXknLCAnY3VycnknLCAnY3VycnlSaWdodCcsICdwYXJ0aWFsJywgJ3BhcnRpYWxSaWdodCddLCBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgICBsb2Rhc2hbbWV0aG9kTmFtZV0ucGxhY2Vob2xkZXIgPSBsb2Rhc2g7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuXG4gICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQgPyAxIDogbmF0aXZlTWF4KHRvSW50ZWdlcihuKSwgMCk7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICh0aGlzLl9fZmlsdGVyZWRfXyAmJiAhaW5kZXgpXG4gICAgICAgICAgPyBuZXcgTGF6eVdyYXBwZXIodGhpcylcbiAgICAgICAgICA6IHRoaXMuY2xvbmUoKTtcblxuICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykge1xuICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goe1xuICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksXG4gICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZSArICdSaWdodCddID0gZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKClbbWV0aG9kTmFtZV0obikucmV2ZXJzZSgpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgdGhhdCBhY2NlcHQgYW4gYGl0ZXJhdGVlYCB2YWx1ZS5cbiAgICBhcnJheUVhY2goWydmaWx0ZXInLCAnbWFwJywgJ3Rha2VXaGlsZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIHR5cGUgPSBpbmRleCArIDEsXG4gICAgICAgICAgaXNGaWx0ZXIgPSB0eXBlID09IExBWllfRklMVEVSX0ZMQUcgfHwgdHlwZSA9PSBMQVpZX1dISUxFX0ZMQUc7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goe1xuICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSxcbiAgICAgICAgICAndHlwZSc6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgTGF6eVdyYXBwZXJgIG1ldGhvZHMgZm9yIGBfLmhlYWRgIGFuZCBgXy5sYXN0YC5cbiAgICBhcnJheUVhY2goWydoZWFkJywgJ2xhc3QnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0YWtlTmFtZSA9ICd0YWtlJyArIChpbmRleCA/ICdSaWdodCcgOiAnJyk7XG5cbiAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpc1t0YWtlTmFtZV0oMSkudmFsdWUoKVswXTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuXG4gICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fID8gbmV3IExhenlXcmFwcGVyKHRoaXMpIDogdGhpc1tkcm9wTmFtZV0oMSk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihpZGVudGl0eSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kTGFzdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIGlmICh0eXBlb2YgcGF0aCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkge1xuICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcztcbiAgICAgIGlmIChyZXN1bHQuX19maWx0ZXJlZF9fICYmIChzdGFydCA+IDAgfHwgZW5kIDwgMCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGFrZVJpZ2h0KC1zdGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5kcm9wKHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTtcbiAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUocHJlZGljYXRlKS5yZXZlcnNlKCk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWtlKE1BWF9BUlJBWV9MRU5HVEgpO1xuICAgIH07XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxcbiAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTtcblxuICAgICAgaWYgKCFsb2Rhc2hGdW5jKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXyxcbiAgICAgICAgICAgIGFyZ3MgPSBpc1Rha2VyID8gWzFdIDogYXJndW1lbnRzLFxuICAgICAgICAgICAgaXNMYXp5ID0gdmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixcbiAgICAgICAgICAgIGl0ZXJhdGVlID0gYXJnc1swXSxcbiAgICAgICAgICAgIHVzZUxhenkgPSBpc0xhenkgfHwgaXNBcnJheSh2YWx1ZSk7XG5cbiAgICAgICAgdmFyIGludGVyY2VwdG9yID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoRnVuYy5hcHBseShsb2Rhc2gsIGFycmF5UHVzaChbdmFsdWVdLCBhcmdzKSk7XG4gICAgICAgICAgcmV0dXJuIChpc1Rha2VyICYmIGNoYWluQWxsKSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhIFwibGVuZ3RoXCIgdmFsdWUgb3RoZXIgdGhhbiBgMWAuXG4gICAgICAgICAgaXNMYXp5ID0gdXNlTGF6eSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGFpbkFsbCA9IHRoaXMuX19jaGFpbl9fLFxuICAgICAgICAgICAgaXNIeWJyaWQgPSAhIXRoaXMuX19hY3Rpb25zX18ubGVuZ3RoLFxuICAgICAgICAgICAgaXNVbndyYXBwZWQgPSByZXRVbndyYXBwZWQgJiYgIWNoYWluQWxsLFxuICAgICAgICAgICAgb25seUxhenkgPSBpc0xhenkgJiYgIWlzSHlicmlkO1xuXG4gICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHtcbiAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpO1xuICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsIGNoYWluQWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNVbndyYXBwZWQgJiYgb25seUxhenkpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLnRocnUoaW50ZXJjZXB0b3IpO1xuICAgICAgICByZXR1cm4gaXNVbndyYXBwZWQgPyAoaXNUYWtlciA/IHJlc3VsdC52YWx1ZSgpWzBdIDogcmVzdWx0LnZhbHVlKCkpIDogcmVzdWx0O1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBgQXJyYXlgIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIGFycmF5RWFjaChbJ3BvcCcsICdwdXNoJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBhcnJheVByb3RvW21ldGhvZE5hbWVdLFxuICAgICAgICAgIGNoYWluTmFtZSA9IC9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdChtZXRob2ROYW1lKSA/ICd0YXAnIDogJ3RocnUnLFxuICAgICAgICAgIHJldFVud3JhcHBlZCA9IC9eKD86cG9wfHNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIE1hcCBtaW5pZmllZCBtZXRob2QgbmFtZXMgdG8gdGhlaXIgcmVhbCBuYW1lcy5cbiAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGxvZGFzaEZ1bmMgPSBsb2Rhc2hbbWV0aG9kTmFtZV07XG4gICAgICBpZiAobG9kYXNoRnVuYykge1xuICAgICAgICB2YXIga2V5ID0gbG9kYXNoRnVuYy5uYW1lICsgJyc7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIGtleSkpIHtcbiAgICAgICAgICByZWFsTmFtZXNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJlYWxOYW1lc1trZXldLnB1c2goeyAnbmFtZSc6IG1ldGhvZE5hbWUsICdmdW5jJzogbG9kYXNoRnVuYyB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlYWxOYW1lc1tjcmVhdGVIeWJyaWQodW5kZWZpbmVkLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3tcbiAgICAgICduYW1lJzogJ3dyYXBwZXInLFxuICAgICAgJ2Z1bmMnOiB1bmRlZmluZWRcbiAgICB9XTtcblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMYXp5V3JhcHBlcmAuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lID0gbGF6eUNsb25lO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5yZXZlcnNlID0gbGF6eVJldmVyc2U7XG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlID0gbGF6eVZhbHVlO1xuXG4gICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluO1xuICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50O1xuICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlO1xuICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTtcblxuICAgIC8vIEFkZCBsYXp5IGFsaWFzZXMuXG4gICAgbG9kYXNoLnByb3RvdHlwZS5maXJzdCA9IGxvZGFzaC5wcm90b3R5cGUuaGVhZDtcblxuICAgIGlmIChzeW1JdGVyYXRvcikge1xuICAgICAgbG9kYXNoLnByb3RvdHlwZVtzeW1JdGVyYXRvcl0gPSB3cmFwcGVyVG9JdGVyYXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIGxvZGFzaDtcbiAgfSk7XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLy8gRXhwb3J0IGxvZGFzaC5cbiAgdmFyIF8gPSBydW5JbkNvbnRleHQoKTtcblxuICAvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBjb25kaXRpb24gcGF0dGVybnMgbGlrZTpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIExvZGFzaCBvbiB0aGUgZ2xvYmFsIG9iamVjdCB0byBwcmV2ZW50IGVycm9ycyB3aGVuIExvZGFzaCBpc1xuICAgIC8vIGxvYWRlZCBieSBhIHNjcmlwdCB0YWcgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFNRCBsb2FkZXIuXG4gICAgLy8gU2VlIGh0dHA6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjbWlzbWF0Y2ggZm9yIG1vcmUgZGV0YWlscy5cbiAgICAvLyBVc2UgYF8ubm9Db25mbGljdGAgdG8gcmVtb3ZlIExvZGFzaCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QuXyA9IF87XG5cbiAgICAvLyBEZWZpbmUgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSBzbywgdGhyb3VnaCBwYXRoIG1hcHBpbmcsIGl0IGNhbiBiZVxuICAgIC8vIHJlZmVyZW5jZWQgYXMgdGhlIFwidW5kZXJzY29yZVwiIG1vZHVsZS5cbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxuICAvLyBDaGVjayBmb3IgYGV4cG9ydHNgIGFmdGVyIGBkZWZpbmVgIGluIGNhc2UgYSBidWlsZCBvcHRpbWl6ZXIgYWRkcyBpdC5cbiAgZWxzZSBpZiAoZnJlZU1vZHVsZSkge1xuICAgIC8vIEV4cG9ydCBmb3IgTm9kZS5qcy5cbiAgICAoZnJlZU1vZHVsZS5leHBvcnRzID0gXykuXyA9IF87XG4gICAgLy8gRXhwb3J0IGZvciBDb21tb25KUyBzdXBwb3J0LlxuICAgIGZyZWVFeHBvcnRzLl8gPSBfO1xuICB9XG4gIGVsc2Uge1xuICAgIC8vIEV4cG9ydCB0byB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuICB9XG59LmNhbGwodGhpcykpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuc3ltYm9sXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zeW1ib2wuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZyb21cIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXMtYXJyYXlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3JcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMuZGF0ZS50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmFzc2lnblwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QuZGVmaW5lLXByb3BlcnR5XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmdcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZVwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlY1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3JcIik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLndpdGhMaW5rcyA9IGV4cG9ydHMuaHJlZlRvID0gZXhwb3J0cy5saW5rVG8gPSBleHBvcnRzLm5hdmlnYXRlID0gdm9pZCAwO1xuXG52YXIgX2dsb2JhbCA9IHJlcXVpcmUoXCJnbG9iYWxcIik7XG5cbnZhciBfcXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJxc1wiKSk7XG5cbnZhciBfYWRkb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQHN0b3J5Ym9vay9hZGRvbnNcIikpO1xuXG52YXIgX2NvcmVFdmVudHMgPSByZXF1aXJlKFwiQHN0b3J5Ym9vay9jb3JlLWV2ZW50c1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCJAc3Rvcnlib29rL3JvdXRlci91dGlsc1wiKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSB9XG5cbnZhciBuYXZpZ2F0ZSA9IGZ1bmN0aW9uIG5hdmlnYXRlKHBhcmFtcykge1xuICByZXR1cm4gX2FkZG9uc1tcImRlZmF1bHRcIl0uZ2V0Q2hhbm5lbCgpLmVtaXQoX2NvcmVFdmVudHMuU0VMRUNUX1NUT1JZLCBwYXJhbXMpO1xufTtcblxuZXhwb3J0cy5uYXZpZ2F0ZSA9IG5hdmlnYXRlO1xuXG52YXIgZ2VuZXJhdGVVcmwgPSBmdW5jdGlvbiBnZW5lcmF0ZVVybChpZCkge1xuICB2YXIgbG9jYXRpb24gPSBfZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uO1xuXG4gIHZhciBxdWVyeSA9IF9xc1tcImRlZmF1bHRcIl0ucGFyc2UobG9jYXRpb24uc2VhcmNoLCB7XG4gICAgaWdub3JlUXVlcnlQcmVmaXg6IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIFwiXCIuY29uY2F0KGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lLCBcIj9cIikuY29uY2F0KF9xc1tcImRlZmF1bHRcIl0uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oe30sIHF1ZXJ5LCB7XG4gICAgaWQ6IGlkXG4gIH0pLCB7XG4gICAgZW5jb2RlOiBmYWxzZVxuICB9KSk7XG59O1xuXG52YXIgdmFsdWVPckNhbGwgPSBmdW5jdGlvbiB2YWx1ZU9yQ2FsbChhcmdzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nID8gdmFsdWUuYXBwbHkodm9pZCAwLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJncykpIDogdmFsdWU7XG4gIH07XG59O1xuXG52YXIgbGlua1RvID0gZnVuY3Rpb24gbGlua1RvKGtpbmQsIHN0b3J5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciByZXNvbHZlciA9IHZhbHVlT3JDYWxsKGFyZ3MpO1xuICAgIG5hdmlnYXRlKHtcbiAgICAgIGtpbmQ6IHJlc29sdmVyKGtpbmQpLFxuICAgICAgc3Rvcnk6IHJlc29sdmVyKHN0b3J5KVxuICAgIH0pO1xuICB9O1xufTtcblxuZXhwb3J0cy5saW5rVG8gPSBsaW5rVG87XG5cbnZhciBocmVmVG8gPSBmdW5jdGlvbiBocmVmVG8oa2luZCwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXNvbHZlKGdlbmVyYXRlVXJsKCgwLCBfdXRpbHMudG9JZCkoa2luZCwgbmFtZSkpKTtcbiAgfSk7XG59O1xuXG5leHBvcnRzLmhyZWZUbyA9IGhyZWZUbztcblxudmFyIGxpbmtzTGlzdGVuZXIgPSBmdW5jdGlvbiBsaW5rc0xpc3RlbmVyKGUpIHtcbiAgdmFyIHRhcmdldCA9IGUudGFyZ2V0O1xuXG4gIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIF9nbG9iYWwuSFRNTEVsZW1lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSB0YXJnZXQ7XG4gIHZhciBfZWxlbWVudCRkYXRhc2V0ID0gZWxlbWVudC5kYXRhc2V0LFxuICAgICAga2luZCA9IF9lbGVtZW50JGRhdGFzZXQuc2JLaW5kLFxuICAgICAgc3RvcnkgPSBfZWxlbWVudCRkYXRhc2V0LnNiU3Rvcnk7XG5cbiAgaWYgKGtpbmQgfHwgc3RvcnkpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgbmF2aWdhdGUoe1xuICAgICAga2luZDoga2luZCxcbiAgICAgIHN0b3J5OiBzdG9yeVxuICAgIH0pO1xuICB9XG59O1xuXG52YXIgaGFzTGlzdGVuZXIgPSBmYWxzZTtcblxudmFyIG9uID0gZnVuY3Rpb24gb24oKSB7XG4gIGlmICghaGFzTGlzdGVuZXIpIHtcbiAgICBoYXNMaXN0ZW5lciA9IHRydWU7XG5cbiAgICBfZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGlua3NMaXN0ZW5lcik7XG4gIH1cbn07XG5cbnZhciBvZmYgPSBmdW5jdGlvbiBvZmYoKSB7XG4gIGlmIChoYXNMaXN0ZW5lcikge1xuICAgIGhhc0xpc3RlbmVyID0gZmFsc2U7XG5cbiAgICBfZ2xvYmFsLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGlua3NMaXN0ZW5lcik7XG4gIH1cbn07XG5cbnZhciB3aXRoTGlua3MgPSBmdW5jdGlvbiB3aXRoTGlua3Moc3RvcnlGbikge1xuICBvbigpO1xuXG4gIF9hZGRvbnNbXCJkZWZhdWx0XCJdLmdldENoYW5uZWwoKS5vbmNlKF9jb3JlRXZlbnRzLlNUT1JZX0NIQU5HRUQsIG9mZik7XG5cbiAgcmV0dXJuIHN0b3J5Rm4oKTtcbn07XG5cbmV4cG9ydHMud2l0aExpbmtzID0gd2l0aExpbmtzOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgYXJyYXlQcmVmaXhHZW5lcmF0b3JzID0ge1xuICAgIGJyYWNrZXRzOiBmdW5jdGlvbiBicmFja2V0cyhwcmVmaXgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbXSc7XG4gICAgfSxcbiAgICBjb21tYTogJ2NvbW1hJyxcbiAgICBpbmRpY2VzOiBmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCwga2V5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnWycgKyBrZXkgKyAnXSc7XG4gICAgfSxcbiAgICByZXBlYXQ6IGZ1bmN0aW9uIHJlcGVhdChwcmVmaXgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICAgICAgcmV0dXJuIHByZWZpeDtcbiAgICB9XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWRkUXVlcnlQcmVmaXg6IGZhbHNlLFxuICAgIGFsbG93RG90czogZmFsc2UsXG4gICAgY2hhcnNldDogJ3V0Zi04JyxcbiAgICBjaGFyc2V0U2VudGluZWw6IGZhbHNlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGVuY29kZTogdHJ1ZSxcbiAgICBlbmNvZGVyOiB1dGlscy5lbmNvZGUsXG4gICAgZW5jb2RlVmFsdWVzT25seTogZmFsc2UsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0c1snZGVmYXVsdCddXSxcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgaW5kaWNlczogZmFsc2UsXG4gICAgc2VyaWFsaXplRGF0ZTogZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShkYXRlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiB0b0lTTy5jYWxsKGRhdGUpO1xuICAgIH0sXG4gICAgc2tpcE51bGxzOiBmYWxzZSxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IGZhbHNlXG59O1xuXG52YXIgc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgIG9iamVjdCxcbiAgICBwcmVmaXgsXG4gICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgc2tpcE51bGxzLFxuICAgIGVuY29kZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnQsXG4gICAgYWxsb3dEb3RzLFxuICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvYmogPSBmaWx0ZXIocHJlZml4LCBvYmopO1xuICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBvYmogPSBzZXJpYWxpemVEYXRlKG9iaik7XG4gICAgfSBlbHNlIGlmIChnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIGlzQXJyYXkob2JqKSkge1xuICAgICAgICBvYmogPSBvYmouam9pbignLCcpO1xuICAgIH1cblxuICAgIGlmIChvYmogPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHN0cmljdE51bGxIYW5kbGluZykge1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIgJiYgIWVuY29kZVZhbHVlc09ubHkgPyBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCkgOiBwcmVmaXg7XG4gICAgICAgIH1cblxuICAgICAgICBvYmogPSAnJztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG9iaiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCk7XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQpKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIocHJlZml4KSArICc9JyArIGZvcm1hdHRlcihTdHJpbmcob2JqKSldO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIHZhciBvYmpLZXlzO1xuICAgIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBwdXNoVG9BcnJheSh2YWx1ZXMsIHN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2Z1bmN0aW9uJyA/IGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpIDogcHJlZml4LFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgICAgIGNoYXJzZXRcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICAgICAgcHJlZml4ICsgKGFsbG93RG90cyA/ICcuJyArIGtleSA6ICdbJyArIGtleSArICddJyksXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBcnJheVByZWZpeCxcbiAgICAgICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICAgICAgc2tpcE51bGxzLFxuICAgICAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICAgICAgY2hhcnNldFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgb3B0cy5lbmNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkUXVlcnlQcmVmaXg6IHR5cGVvZiBvcHRzLmFkZFF1ZXJ5UHJlZml4ID09PSAnYm9vbGVhbicgPyBvcHRzLmFkZFF1ZXJ5UHJlZml4IDogZGVmYXVsdHMuYWRkUXVlcnlQcmVmaXgsXG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcixcbiAgICAgICAgc2VyaWFsaXplRGF0ZTogdHlwZW9mIG9wdHMuc2VyaWFsaXplRGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc2VyaWFsaXplRGF0ZSA6IGRlZmF1bHRzLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgIHNraXBOdWxsczogdHlwZW9mIG9wdHMuc2tpcE51bGxzID09PSAnYm9vbGVhbicgPyBvcHRzLnNraXBOdWxscyA6IGRlZmF1bHRzLnNraXBOdWxscyxcbiAgICAgICAgc29ydDogdHlwZW9mIG9wdHMuc29ydCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuc29ydCA6IG51bGwsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKTtcblxuICAgIHZhciBvYmpLZXlzO1xuICAgIHZhciBmaWx0ZXI7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgICAgICBvYmogPSBmaWx0ZXIoJycsIG9iaik7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KG9wdGlvbnMuZmlsdGVyKSkge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9XG5cbiAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5Rm9ybWF0O1xuICAgIGlmIChvcHRzICYmIG9wdHMuYXJyYXlGb3JtYXQgaW4gYXJyYXlQcmVmaXhHZW5lcmF0b3JzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5hcnJheUZvcm1hdDtcbiAgICB9IGVsc2UgaWYgKG9wdHMgJiYgJ2luZGljZXMnIGluIG9wdHMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRzLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuc29ydCkge1xuICAgICAgICBvYmpLZXlzLnNvcnQob3B0aW9ucy5zb3J0KTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iaktleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbaV07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoVG9BcnJheShrZXlzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0dGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgb3B0aW9ucy5jaGFyc2V0XG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIHZhciBqb2luZWQgPSBrZXlzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpO1xuICAgIHZhciBwcmVmaXggPSBvcHRpb25zLmFkZFF1ZXJ5UHJlZml4ID09PSB0cnVlID8gJz8nIDogJyc7XG5cbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQoJyYjMTAwMDM7JyksIHRoZSBcIm51bWVyaWMgZW50aXR5XCIgcmVwcmVzZW50YXRpb24gb2YgYSBjaGVja21hcmtcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lMjYlMjMxMDAwMyUzQiYnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCfinJMnKVxuICAgICAgICAgICAgcHJlZml4ICs9ICd1dGY4PSVFMiU5QyU5MyYnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAwID8gcHJlZml4ICsgam9pbmVkIDogJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBjb21tYTogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IGZhbHNlLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBhcnNlQXJyYXlzOiB0cnVlLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UocG9zICsgMSksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmNvbW1hICYmIHZhbC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucykge1xuICAgIHZhciBsZWFmID0gdmFsO1xuXG4gICAgZm9yICh2YXIgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBvYmo7XG4gICAgICAgIHZhciByb290ID0gY2hhaW5baV07XG5cbiAgICAgICAgaWYgKHJvb3QgPT09ICdbXScgJiYgb3B0aW9ucy5wYXJzZUFycmF5cykge1xuICAgICAgICAgICAgb2JqID0gW10uY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChjbGVhblJvb3QsIDEwKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wYXJzZUFycmF5cyAmJiBjbGVhblJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMucGFyc2VBcnJheXMgJiYgaW5kZXggPD0gb3B0aW9ucy5hcnJheUxpbWl0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICAgICAgb2JqW2luZGV4XSA9IGxlYWY7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ialtjbGVhblJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucykge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGp1c3QgYWRkIHdoYXRldmVyIGlzIGxlZnRcblxuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgIGtleXMucHVzaCgnWycgKyBrZXkuc2xpY2Uoc2VnbWVudC5pbmRleCkgKyAnXScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZU9iamVjdChrZXlzLCB2YWwsIG9wdGlvbnMpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIG9wdHMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFycmF5TGltaXQ6IHR5cGVvZiBvcHRzLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0cy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdCxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBjb21tYTogdHlwZW9mIG9wdHMuY29tbWEgPT09ICdib29sZWFuJyA/IG9wdHMuY29tbWEgOiBkZWZhdWx0cy5jb21tYSxcbiAgICAgICAgZGVjb2RlcjogdHlwZW9mIG9wdHMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXIsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcikgPyBvcHRzLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcixcbiAgICAgICAgZGVwdGg6IHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyA/IG9wdHMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aCxcbiAgICAgICAgaWdub3JlUXVlcnlQcmVmaXg6IG9wdHMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWUsXG4gICAgICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogdHlwZW9mIG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID09PSAnYm9vbGVhbicgPyBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA6IGRlZmF1bHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyxcbiAgICAgICAgcGFyYW1ldGVyTGltaXQ6IHR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdCxcbiAgICAgICAgcGFyc2VBcnJheXM6IG9wdHMucGFyc2VBcnJheXMgIT09IGZhbHNlLFxuICAgICAgICBwbGFpbk9iamVjdHM6IHR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHMsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0b3J5Ym9vay13ZWxjb21lLWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG1haW4+XG4gICAgICA8aDE+V2VsY29tZSB0byBzdG9yeWJvb2s8L2gxPlxuICAgICAgPHA+VGhpcyBpcyBhIFVJIGNvbXBvbmVudCBkZXYgZW52aXJvbm1lbnQgZm9yIHlvdXIgYXBwLjwvcD5cbiAgICAgIDxwPlxuICAgICAgICBXZSd2ZSBhZGRlZCBzb21lIGJhc2ljIHN0b3JpZXMgaW5zaWRlIHRoZVxuICAgICAgICA8c3BhbiBjbGFzcz1cImlubGluZS1jb2RlXCI+c3JjL3N0b3JpZXM8L3NwYW4+IGRpcmVjdG9yeS4gPGJyIC8+XG4gICAgICAgIEEgc3RvcnkgaXMgYSBzaW5nbGUgc3RhdGUgb2Ygb25lIG9yIG1vcmUgVUkgY29tcG9uZW50cy4gWW91IGNhbiBoYXZlIGFzIG1hbnkgc3RvcmllcyBhcyB5b3VcbiAgICAgICAgd2FudC4gPGJyIC8+XG4gICAgICAgIChCYXNpY2FsbHkgYSBzdG9yeSBpcyBsaWtlIGEgdmlzdWFsIHRlc3QgY2FzZS4pXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgU2VlIHRoZXNlIHNhbXBsZVxuICAgICAgICA8YSAoY2xpY2spPVwic2hvd0FwcC5lbWl0KCRldmVudClcIiByb2xlPVwiYnV0dG9uXCIgdGFiSW5kZXg9XCIwXCI+c3RvcmllczwvYT4gZm9yIGEgY29tcG9uZW50XG4gICAgICAgIGNhbGxlZCA8c3BhbiBjbGFzcz1cImlubGluZS1jb2RlXCI+QnV0dG9uPC9zcGFuPiAuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgSnVzdCBsaWtlIHRoYXQsIHlvdSBjYW4gYWRkIHlvdXIgb3duIGNvbXBvbmVudHMgYXMgc3Rvcmllcy4gPGJyIC8+XG4gICAgICAgIFlvdSBjYW4gYWxzbyBlZGl0IHRob3NlIGNvbXBvbmVudHMgYW5kIHNlZSBjaGFuZ2VzIHJpZ2h0IGF3YXkuIDxiciAvPlxuICAgICAgICAoVHJ5IGVkaXRpbmcgdGhlIDxzcGFuIGNsYXNzPVwiaW5saW5lLWNvZGVcIj5CdXR0b248L3NwYW4+IHN0b3JpZXMgbG9jYXRlZCBhdFxuICAgICAgICA8c3BhbiBjbGFzcz1cImlubGluZS1jb2RlXCI+c3JjL3N0b3JpZXMvaW5kZXguanM8L3NwYW4+LilcbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBVc3VhbGx5IHdlIGNyZWF0ZSBzdG9yaWVzIHdpdGggc21hbGxlciBVSSBjb21wb25lbnRzIGluIHRoZSBhcHAuPGJyIC8+XG4gICAgICAgIEhhdmUgYSBsb29rIGF0IHRoZVxuICAgICAgICA8YVxuICAgICAgICAgIGhyZWY9XCJodHRwczovL3N0b3J5Ym9vay5qcy5vcmcvYmFzaWNzL3dyaXRpbmctc3Rvcmllc1wiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIFdyaXRpbmcgU3Rvcmllc1xuICAgICAgICA8L2E+XG4gICAgICAgIHNlY3Rpb24gaW4gb3VyIGRvY3VtZW50YXRpb24uXG4gICAgICA8L3A+XG4gICAgICA8cCBjbGFzcz1cIm5vdGVcIj5cbiAgICAgICAgPGI+Tk9URTo8L2I+IDxiciAvPlxuICAgICAgICBIYXZlIGEgbG9vayBhdCB0aGUgPHNwYW4gY2xhc3M9XCJpbmxpbmUtY29kZVwiPi5zdG9yeWJvb2svd2VicGFjay5jb25maWcuanM8L3NwYW4+IHRvIGFkZFxuICAgICAgICB3ZWJwYWNrIGxvYWRlcnMgYW5kIHBsdWdpbnMgeW91IGFyZSB1c2luZyBpbiB0aGlzIHByb2plY3QuXG4gICAgICA8L3A+XG4gICAgPC9tYWluPlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICBtYWluIHtcbiAgICAgICAgcGFkZGluZzogMTVweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgJ1NlZ29lIFVJJywgQXJpYWwsIGZyZWVzYW5zLCBzYW5zLXNlcmlmO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuICAgICAgfVxuXG4gICAgICAubm90ZSB7XG4gICAgICAgIG9wYWNpdHk6IDAuNTtcbiAgICAgIH1cblxuICAgICAgLmlubGluZS1jb2RlIHtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBwYWRkaW5nOiAycHggNXB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWFlOWU5O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YyZjI7XG4gICAgICAgIGNvbG9yOiAjM2EzYTNhO1xuICAgICAgfVxuXG4gICAgICBhIHtcbiAgICAgICAgY29sb3I6ICMxNDc0ZjM7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxNDc0ZjM7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAycHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWxjb21lQ29tcG9uZW50IHtcbiAgQE91dHB1dCgpXG4gIHNob3dBcHAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0b3J5Ym9vay1idXR0b24tY29tcG9uZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uIChjbGljayk9XCJvbkNsaWNrLmVtaXQoJGV2ZW50KVwiPnt7IHRleHQgfX08L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgYnV0dG9uIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2VlZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgICAgcGFkZGluZzogM3B4IDEwcHg7XG4gICAgICAgIG1hcmdpbjogMTBweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHRleHQgPSAnJztcblxuICBAT3V0cHV0KClcbiAgb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xufVxuIiwiLypcblx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcblx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cblxudmFyIHN0eWxlc0luRG9tID0ge307XG5cbnZhclx0bWVtb2l6ZSA9IGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbztcblxuXHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdGlmICh0eXBlb2YgbWVtbyA9PT0gXCJ1bmRlZmluZWRcIikgbWVtbyA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0cmV0dXJuIG1lbW87XG5cdH07XG59O1xuXG52YXIgaXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuXHQvLyBUZXN0IGZvciBJRSA8PSA5IGFzIHByb3Bvc2VkIGJ5IEJyb3dzZXJoYWNrc1xuXHQvLyBAc2VlIGh0dHA6Ly9icm93c2VyaGFja3MuY29tLyNoYWNrLWU3MWQ4NjkyZjY1MzM0MTczZmVlNzE1YzIyMmNiODA1XG5cdC8vIFRlc3RzIGZvciBleGlzdGVuY2Ugb2Ygc3RhbmRhcmQgZ2xvYmFscyBpcyB0byBhbGxvdyBzdHlsZS1sb2FkZXJcblx0Ly8gdG8gb3BlcmF0ZSBjb3JyZWN0bHkgaW50byBub24tc3RhbmRhcmQgZW52aXJvbm1lbnRzXG5cdC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIvaXNzdWVzLzE3N1xuXHRyZXR1cm4gd2luZG93ICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmFsbCAmJiAhd2luZG93LmF0b2I7XG59KTtcblxudmFyIGdldFRhcmdldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHBhcmVudCkge1xuICBpZiAocGFyZW50KXtcbiAgICByZXR1cm4gcGFyZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcbiAgfVxuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpO1xufTtcblxudmFyIGdldEVsZW1lbnQgPSAoZnVuY3Rpb24gKGZuKSB7XG5cdHZhciBtZW1vID0ge307XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHRhcmdldCwgcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcGFzc2luZyBmdW5jdGlvbiBpbiBvcHRpb25zLCB0aGVuIHVzZSBpdCBmb3IgcmVzb2x2ZSBcImhlYWRcIiBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIFVzZWZ1bCBmb3IgU2hhZG93IFJvb3Qgc3R5bGUgaS5lXG4gICAgICAgICAgICAgICAgLy8ge1xuICAgICAgICAgICAgICAgIC8vICAgaW5zZXJ0SW50bzogZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNmb29cIikuc2hhZG93Um9vdCB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHR2YXIgc3R5bGVUYXJnZXQgPSBnZXRUYXJnZXQuY2FsbCh0aGlzLCB0YXJnZXQsIHBhcmVudCk7XG5cdFx0XHQvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXHRcdFx0aWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG5cdFx0XHRcdFx0Ly8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuXHRcdFx0XHR9IGNhdGNoKGUpIHtcblx0XHRcdFx0XHRzdHlsZVRhcmdldCA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuXHRcdH1cblx0XHRyZXR1cm4gbWVtb1t0YXJnZXRdXG5cdH07XG59KSgpO1xuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcbnZhclx0c2luZ2xldG9uQ291bnRlciA9IDA7XG52YXJcdHN0eWxlc0luc2VydGVkQXRUb3AgPSBbXTtcblxudmFyXHRmaXhVcmxzID0gcmVxdWlyZShcIi4vdXJsc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdGlmICh0eXBlb2YgREVCVUcgIT09IFwidW5kZWZpbmVkXCIgJiYgREVCVUcpIHtcblx0XHRpZiAodHlwZW9mIGRvY3VtZW50ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIik7XG5cdH1cblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRvcHRpb25zLmF0dHJzID0gdHlwZW9mIG9wdGlvbnMuYXR0cnMgPT09IFwib2JqZWN0XCIgPyBvcHRpb25zLmF0dHJzIDoge307XG5cblx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdC8vIHRhZ3MgaXQgd2lsbCBhbGxvdyBvbiBhIHBhZ2Vcblx0aWYgKCFvcHRpb25zLnNpbmdsZXRvbiAmJiB0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gIT09IFwiYm9vbGVhblwiKSBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcblxuXHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSA8aGVhZD4gZWxlbWVudFxuICAgICAgICBpZiAoIW9wdGlvbnMuaW5zZXJ0SW50bykgb3B0aW9ucy5pbnNlcnRJbnRvID0gXCJoZWFkXCI7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgYm90dG9tIG9mIHRoZSB0YXJnZXRcblx0aWYgKCFvcHRpb25zLmluc2VydEF0KSBvcHRpb25zLmluc2VydEF0ID0gXCJib3R0b21cIjtcblxuXHR2YXIgc3R5bGVzID0gbGlzdFRvU3R5bGVzKGxpc3QsIG9wdGlvbnMpO1xuXG5cdGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucyk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSAobmV3TGlzdCkge1xuXHRcdHZhciBtYXlSZW1vdmUgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0XHRkb21TdHlsZS5yZWZzLS07XG5cdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0fVxuXG5cdFx0aWYobmV3TGlzdCkge1xuXHRcdFx0dmFyIG5ld1N0eWxlcyA9IGxpc3RUb1N0eWxlcyhuZXdMaXN0LCBvcHRpb25zKTtcblx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtYXlSZW1vdmUubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblxuXHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSBkb21TdHlsZS5wYXJ0c1tqXSgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBzdHlsZXNJbkRvbVtkb21TdHlsZS5pZF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufTtcblxuZnVuY3Rpb24gYWRkU3R5bGVzVG9Eb20gKHN0eWxlcywgb3B0aW9ucykge1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdHZhciBkb21TdHlsZSA9IHN0eWxlc0luRG9tW2l0ZW0uaWRdO1xuXG5cdFx0aWYoZG9tU3R5bGUpIHtcblx0XHRcdGRvbVN0eWxlLnJlZnMrKztcblxuXHRcdFx0Zm9yKHZhciBqID0gMDsgaiA8IGRvbVN0eWxlLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IoOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHBhcnRzID0gW107XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZXNJbkRvbVtpdGVtLmlkXSA9IHtpZDogaXRlbS5pZCwgcmVmczogMSwgcGFydHM6IHBhcnRzfTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gbGlzdFRvU3R5bGVzIChsaXN0LCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZXMgPSBbXTtcblx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBpdGVtID0gbGlzdFtpXTtcblx0XHR2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcblx0XHR2YXIgY3NzID0gaXRlbVsxXTtcblx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdHZhciBzb3VyY2VNYXAgPSBpdGVtWzNdO1xuXHRcdHZhciBwYXJ0ID0ge2NzczogY3NzLCBtZWRpYTogbWVkaWEsIHNvdXJjZU1hcDogc291cmNlTWFwfTtcblxuXHRcdGlmKCFuZXdTdHlsZXNbaWRdKSBzdHlsZXMucHVzaChuZXdTdHlsZXNbaWRdID0ge2lkOiBpZCwgcGFydHM6IFtwYXJ0XX0pO1xuXHRcdGVsc2UgbmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHR9XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50IChvcHRpb25zLCBzdHlsZSkge1xuXHR2YXIgdGFyZ2V0ID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEludG8pXG5cblx0aWYgKCF0YXJnZXQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydEludG8nIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcblx0fVxuXG5cdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlc0luc2VydGVkQXRUb3Bbc3R5bGVzSW5zZXJ0ZWRBdFRvcC5sZW5ndGggLSAxXTtcblxuXHRpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ0b3BcIikge1xuXHRcdGlmICghbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIHRhcmdldC5maXJzdENoaWxkKTtcblx0XHR9IGVsc2UgaWYgKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdFx0fVxuXHRcdHN0eWxlc0luc2VydGVkQXRUb3AucHVzaChzdHlsZSk7XG5cdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwib2JqZWN0XCIgJiYgb3B0aW9ucy5pbnNlcnRBdC5iZWZvcmUpIHtcblx0XHR2YXIgbmV4dFNpYmxpbmcgPSBnZXRFbGVtZW50KG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlLCB0YXJnZXQpO1xuXHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoc3R5bGUsIG5leHRTaWJsaW5nKTtcblx0fSBlbHNlIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbU3R5bGUgTG9hZGVyXVxcblxcbiBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0JyAoJ29wdGlvbnMuaW5zZXJ0QXQnKSBmb3VuZC5cXG4gTXVzdCBiZSAndG9wJywgJ2JvdHRvbScsIG9yIE9iamVjdC5cXG4gKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyI2luc2VydGF0KVxcblwiKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQgKHN0eWxlKSB7XG5cdGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cdHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuXG5cdHZhciBpZHggPSBzdHlsZXNJbnNlcnRlZEF0VG9wLmluZGV4T2Yoc3R5bGUpO1xuXHRpZihpZHggPj0gMCkge1xuXHRcdHN0eWxlc0luc2VydGVkQXRUb3Auc3BsaWNlKGlkeCwgMSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblxuXHRpZihvcHRpb25zLmF0dHJzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0fVxuXG5cdGlmKG9wdGlvbnMuYXR0cnMubm9uY2UgPT09IHVuZGVmaW5lZCkge1xuXHRcdHZhciBub25jZSA9IGdldE5vbmNlKCk7XG5cdFx0aWYgKG5vbmNlKSB7XG5cdFx0XHRvcHRpb25zLmF0dHJzLm5vbmNlID0gbm9uY2U7XG5cdFx0fVxuXHR9XG5cblx0YWRkQXR0cnMoc3R5bGUsIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGUpO1xuXG5cdHJldHVybiBzdHlsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua0VsZW1lbnQgKG9wdGlvbnMpIHtcblx0dmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcblxuXHRpZihvcHRpb25zLmF0dHJzLnR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdG9wdGlvbnMuYXR0cnMudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0fVxuXHRvcHRpb25zLmF0dHJzLnJlbCA9IFwic3R5bGVzaGVldFwiO1xuXG5cdGFkZEF0dHJzKGxpbmssIG9wdGlvbnMuYXR0cnMpO1xuXHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgbGluayk7XG5cblx0cmV0dXJuIGxpbms7XG59XG5cbmZ1bmN0aW9uIGFkZEF0dHJzIChlbCwgYXR0cnMpIHtcblx0T2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHRcdGVsLnNldEF0dHJpYnV0ZShrZXksIGF0dHJzW2tleV0pO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9uY2UoKSB7XG5cdGlmICh0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRyZXR1cm4gX193ZWJwYWNrX25vbmNlX187XG59XG5cbmZ1bmN0aW9uIGFkZFN0eWxlIChvYmosIG9wdGlvbnMpIHtcblx0dmFyIHN0eWxlLCB1cGRhdGUsIHJlbW92ZSwgcmVzdWx0O1xuXG5cdC8vIElmIGEgdHJhbnNmb3JtIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLCBydW4gaXQgb24gdGhlIGNzc1xuXHRpZiAob3B0aW9ucy50cmFuc2Zvcm0gJiYgb2JqLmNzcykge1xuXHQgICAgcmVzdWx0ID0gdHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nXG5cdFx0ID8gb3B0aW9ucy50cmFuc2Zvcm0ob2JqLmNzcykgXG5cdFx0IDogb3B0aW9ucy50cmFuc2Zvcm0uZGVmYXVsdChvYmouY3NzKTtcblxuXHQgICAgaWYgKHJlc3VsdCkge1xuXHQgICAgXHQvLyBJZiB0cmFuc2Zvcm0gcmV0dXJucyBhIHZhbHVlLCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIHJ1bm5pbmcgcnVudGltZSB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIGNzcy5cblx0ICAgIFx0b2JqLmNzcyA9IHJlc3VsdDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICBcdC8vIElmIHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gcmV0dXJucyBhIGZhbHN5IHZhbHVlLCBkb24ndCBhZGQgdGhpcyBjc3MuXG5cdCAgICBcdC8vIFRoaXMgYWxsb3dzIGNvbmRpdGlvbmFsIGxvYWRpbmcgb2YgY3NzXG5cdCAgICBcdHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgIFx0XHQvLyBub29wXG5cdCAgICBcdH07XG5cdCAgICB9XG5cdH1cblxuXHRpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcblx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblxuXHRcdHN0eWxlID0gc2luZ2xldG9uIHx8IChzaW5nbGV0b24gPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXG5cdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCBmYWxzZSk7XG5cdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlLCBzdHlsZUluZGV4LCB0cnVlKTtcblxuXHR9IGVsc2UgaWYgKFxuXHRcdG9iai5zb3VyY2VNYXAgJiZcblx0XHR0eXBlb2YgVVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgVVJMLmNyZWF0ZU9iamVjdFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5yZXZva2VPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBCbG9iID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRcdHN0eWxlID0gY3JlYXRlTGlua0VsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gdXBkYXRlTGluay5iaW5kKG51bGwsIHN0eWxlLCBvcHRpb25zKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXG5cdFx0XHRpZihzdHlsZS5ocmVmKSBVUkwucmV2b2tlT2JqZWN0VVJMKHN0eWxlLmhyZWYpO1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0c3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG5cdFx0dXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlKTtcblx0XHRyZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuXHRcdH07XG5cdH1cblxuXHR1cGRhdGUob2JqKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG5ld09iaikge1xuXHRcdGlmIChuZXdPYmopIHtcblx0XHRcdGlmIChcblx0XHRcdFx0bmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJlxuXHRcdFx0XHRuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJlxuXHRcdFx0XHRuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR1cGRhdGUob2JqID0gbmV3T2JqKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVtb3ZlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG52YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHR2YXIgdGV4dFN0b3JlID0gW107XG5cblx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHR0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG5cblx0XHRyZXR1cm4gdGV4dFN0b3JlLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblx0fTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcgKHN0eWxlLCBpbmRleCwgcmVtb3ZlLCBvYmopIHtcblx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXG5cdGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdHZhciBjaGlsZE5vZGVzID0gc3R5bGUuY2hpbGROb2RlcztcblxuXHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGUucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuXG5cdFx0aWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRzdHlsZS5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHlsZS5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUb1RhZyAoc3R5bGUsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIG1lZGlhID0gb2JqLm1lZGlhO1xuXG5cdGlmKG1lZGlhKSB7XG5cdFx0c3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgbWVkaWEpXG5cdH1cblxuXHRpZihzdHlsZS5zdHlsZVNoZWV0KSB7XG5cdFx0c3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuXHR9IGVsc2Uge1xuXHRcdHdoaWxlKHN0eWxlLmZpcnN0Q2hpbGQpIHtcblx0XHRcdHN0eWxlLnJlbW92ZUNoaWxkKHN0eWxlLmZpcnN0Q2hpbGQpO1xuXHRcdH1cblxuXHRcdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmsgKGxpbmssIG9wdGlvbnMsIG9iaikge1xuXHR2YXIgY3NzID0gb2JqLmNzcztcblx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cblx0Lypcblx0XHRJZiBjb252ZXJ0VG9BYnNvbHV0ZVVybHMgaXNuJ3QgZGVmaW5lZCwgYnV0IHNvdXJjZW1hcHMgYXJlIGVuYWJsZWRcblx0XHRhbmQgdGhlcmUgaXMgbm8gcHVibGljUGF0aCBkZWZpbmVkIHRoZW4gbGV0cyB0dXJuIGNvbnZlcnRUb0Fic29sdXRlVXJsc1xuXHRcdG9uIGJ5IGRlZmF1bHQuICBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgY29udmVydFRvQWJzb2x1dGVVcmxzIG9wdGlvblxuXHRcdGRpcmVjdGx5XG5cdCovXG5cdHZhciBhdXRvRml4VXJscyA9IG9wdGlvbnMuY29udmVydFRvQWJzb2x1dGVVcmxzID09PSB1bmRlZmluZWQgJiYgc291cmNlTWFwO1xuXG5cdGlmIChvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyB8fCBhdXRvRml4VXJscykge1xuXHRcdGNzcyA9IGZpeFVybHMoY3NzKTtcblx0fVxuXG5cdGlmIChzb3VyY2VNYXApIHtcblx0XHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yNjYwMzg3NVxuXHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0fVxuXG5cdHZhciBibG9iID0gbmV3IEJsb2IoW2Nzc10sIHsgdHlwZTogXCJ0ZXh0L2Nzc1wiIH0pO1xuXG5cdHZhciBvbGRTcmMgPSBsaW5rLmhyZWY7XG5cblx0bGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuXHRpZihvbGRTcmMpIFVSTC5yZXZva2VPYmplY3RVUkwob2xkU3JjKTtcbn1cbiIsIlxuLyoqXG4gKiBXaGVuIHNvdXJjZSBtYXBzIGFyZSBlbmFibGVkLCBgc3R5bGUtbG9hZGVyYCB1c2VzIGEgbGluayBlbGVtZW50IHdpdGggYSBkYXRhLXVyaSB0b1xuICogZW1iZWQgdGhlIGNzcyBvbiB0aGUgcGFnZS4gVGhpcyBicmVha3MgYWxsIHJlbGF0aXZlIHVybHMgYmVjYXVzZSBub3cgdGhleSBhcmUgcmVsYXRpdmUgdG8gYVxuICogYnVuZGxlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcGFnZS5cbiAqXG4gKiBPbmUgc29sdXRpb24gaXMgdG8gb25seSB1c2UgZnVsbCB1cmxzLCBidXQgdGhhdCBtYXkgYmUgaW1wb3NzaWJsZS5cbiAqXG4gKiBJbnN0ZWFkLCB0aGlzIGZ1bmN0aW9uIFwiZml4ZXNcIiB0aGUgcmVsYXRpdmUgdXJscyB0byBiZSBhYnNvbHV0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcGFnZSBsb2NhdGlvbi5cbiAqXG4gKiBBIHJ1ZGltZW50YXJ5IHRlc3Qgc3VpdGUgaXMgbG9jYXRlZCBhdCBgdGVzdC9maXhVcmxzLmpzYCBhbmQgY2FuIGJlIHJ1biB2aWEgdGhlIGBucG0gdGVzdGAgY29tbWFuZC5cbiAqXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzKSB7XG4gIC8vIGdldCBjdXJyZW50IGxvY2F0aW9uXG4gIHZhciBsb2NhdGlvbiA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2F0aW9uO1xuXG4gIGlmICghbG9jYXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXhVcmxzIHJlcXVpcmVzIHdpbmRvdy5sb2NhdGlvblwiKTtcbiAgfVxuXG5cdC8vIGJsYW5rIG9yIG51bGw/XG5cdGlmICghY3NzIHx8IHR5cGVvZiBjc3MgIT09IFwic3RyaW5nXCIpIHtcblx0ICByZXR1cm4gY3NzO1xuICB9XG5cbiAgdmFyIGJhc2VVcmwgPSBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiArIGxvY2F0aW9uLmhvc3Q7XG4gIHZhciBjdXJyZW50RGlyID0gYmFzZVVybCArIGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoL1xcL1teXFwvXSokLywgXCIvXCIpO1xuXG5cdC8vIGNvbnZlcnQgZWFjaCB1cmwoLi4uKVxuXHQvKlxuXHRUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBqdXN0IGEgd2F5IHRvIHJlY3Vyc2l2ZWx5IG1hdGNoIGJyYWNrZXRzIHdpdGhpblxuXHRhIHN0cmluZy5cblxuXHQgL3VybFxccypcXCggID0gTWF0Y2ggb24gdGhlIHdvcmQgXCJ1cmxcIiB3aXRoIGFueSB3aGl0ZXNwYWNlIGFmdGVyIGl0IGFuZCB0aGVuIGEgcGFyZW5zXG5cdCAgICggID0gU3RhcnQgYSBjYXB0dXJpbmcgZ3JvdXBcblx0ICAgICAoPzogID0gU3RhcnQgYSBub24tY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgICAgIFteKShdICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAoPzogID0gU3RhcnQgYW5vdGhlciBub24tY2FwdHVyaW5nIGdyb3Vwc1xuXHQgICAgICAgICAgICAgICAgIFteKShdKyAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICB8ICA9IE9SXG5cdCAgICAgICAgICAgICAgICAgXFwoICA9IE1hdGNoIGEgc3RhcnQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICAgICAgW14pKF0qICA9IE1hdGNoIGFueXRoaW5nIHRoYXQgaXNuJ3QgYSBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgICAgIFxcKSAgPSBNYXRjaCBhIGVuZCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKSAgPSBFbmQgR3JvdXBcbiAgICAgICAgICAgICAgKlxcKSA9IE1hdGNoIGFueXRoaW5nIGFuZCB0aGVuIGEgY2xvc2UgcGFyZW5zXG4gICAgICAgICAgKSAgPSBDbG9zZSBub24tY2FwdHVyaW5nIGdyb3VwXG4gICAgICAgICAgKiAgPSBNYXRjaCBhbnl0aGluZ1xuICAgICAgICkgID0gQ2xvc2UgY2FwdHVyaW5nIGdyb3VwXG5cdCBcXCkgID0gTWF0Y2ggYSBjbG9zZSBwYXJlbnNcblxuXHQgL2dpICA9IEdldCBhbGwgbWF0Y2hlcywgbm90IHRoZSBmaXJzdC4gIEJlIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqL1xuXHR2YXIgZml4ZWRDc3MgPSBjc3MucmVwbGFjZSgvdXJsXFxzKlxcKCgoPzpbXikoXXxcXCgoPzpbXikoXSt8XFwoW14pKF0qXFwpKSpcXCkpKilcXCkvZ2ksIGZ1bmN0aW9uKGZ1bGxNYXRjaCwgb3JpZ1VybCkge1xuXHRcdC8vIHN0cmlwIHF1b3RlcyAoaWYgdGhleSBleGlzdClcblx0XHR2YXIgdW5xdW90ZWRPcmlnVXJsID0gb3JpZ1VybFxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LnJlcGxhY2UoL15cIiguKilcIiQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSlcblx0XHRcdC5yZXBsYWNlKC9eJyguKiknJC8sIGZ1bmN0aW9uKG8sICQxKXsgcmV0dXJuICQxOyB9KTtcblxuXHRcdC8vIGFscmVhZHkgYSBmdWxsIHVybD8gbm8gY2hhbmdlXG5cdFx0aWYgKC9eKCN8ZGF0YTp8aHR0cDpcXC9cXC98aHR0cHM6XFwvXFwvfGZpbGU6XFwvXFwvXFwvfFxccyokKS9pLnRlc3QodW5xdW90ZWRPcmlnVXJsKSkge1xuXHRcdCAgcmV0dXJuIGZ1bGxNYXRjaDtcblx0XHR9XG5cblx0XHQvLyBjb252ZXJ0IHRoZSB1cmwgdG8gYSBmdWxsIHVybFxuXHRcdHZhciBuZXdVcmw7XG5cblx0XHRpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvL1wiKSA9PT0gMCkge1xuXHRcdCAgXHQvL1RPRE86IHNob3VsZCB3ZSBhZGQgcHJvdG9jb2w/XG5cdFx0XHRuZXdVcmwgPSB1bnF1b3RlZE9yaWdVcmw7XG5cdFx0fSBlbHNlIGlmICh1bnF1b3RlZE9yaWdVcmwuaW5kZXhPZihcIi9cIikgPT09IDApIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHVybFxuXHRcdFx0bmV3VXJsID0gYmFzZVVybCArIHVucXVvdGVkT3JpZ1VybDsgLy8gYWxyZWFkeSBzdGFydHMgd2l0aCAnLydcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3Rvcnlcblx0XHRcdG5ld1VybCA9IGN1cnJlbnREaXIgKyB1bnF1b3RlZE9yaWdVcmwucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpOyAvLyBTdHJpcCBsZWFkaW5nICcuLydcblx0XHR9XG5cblx0XHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIHVybCguLi4pXG5cdFx0cmV0dXJuIFwidXJsKFwiICsgSlNPTi5zdHJpbmdpZnkobmV3VXJsKSArIFwiKVwiO1xuXHR9KTtcblxuXHQvLyBzZW5kIGJhY2sgdGhlIGZpeGVkIGNzc1xuXHRyZXR1cm4gZml4ZWRDc3M7XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZSBBbmd1bGFyIHY4LjAuM1xuICogKGMpIDIwMTAtMjAxOSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0YWJsZSwgRXZlbnRFbWl0dGVyLCBPcHRpb25hbCwgSW5qZWN0LCBMT0NBTEVfSUQsIMm1aXNMaXN0TGlrZUl0ZXJhYmxlLCDJtXN0cmluZ2lmeSwgSXRlcmFibGVEaWZmZXJzLCBLZXlWYWx1ZURpZmZlcnMsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgybXJtWRlZmluZURpcmVjdGl2ZSwgSW5wdXQsIERpcmVjdGl2ZSwgybXJtWVsZW1lbnRIb3N0U3R5bGluZywgybXJtWVsZW1lbnRIb3N0U3R5bGluZ01hcCwgybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5LCBOZ01vZHVsZVJlZiwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBUeXBlLCBJbmplY3RvciwgTmdNb2R1bGVGYWN0b3J5LCBWaWV3Q29udGFpbmVyUmVmLCBpc0Rldk1vZGUsIFRlbXBsYXRlUmVmLCBIb3N0LCBBdHRyaWJ1dGUsIFBpcGUsIMm1bG9vc2VJZGVudGljYWwsIFdyYXBwZWRWYWx1ZSwgybVpc1Byb21pc2UsIMm1aXNPYnNlcnZhYmxlLCBDaGFuZ2VEZXRlY3RvclJlZiwgTmdNb2R1bGUsIFZlcnNpb24sIMm1ybVkZWZpbmVJbmplY3RhYmxlLCDJtcm1aW5qZWN0LCBFcnJvckhhbmRsZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IF9fZGVjb3JhdGUsIF9fbWV0YWRhdGEsIF9fZXh0ZW5kcywgX19wYXJhbSwgX19yZWFkLCBfX3ZhbHVlcywgX19hc3NpZ24gfSBmcm9tICd0c2xpYic7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyLiBJbnN0ZWFkLCB1c2VcbiAqIHtAbGluayBMb2NhdGlvbn0uXG4gKlxuICogYFBsYXRmb3JtTG9jYXRpb25gIGVuY2Fwc3VsYXRlcyBhbGwgY2FsbHMgdG8gRE9NIGFwaXMsIHdoaWNoIGFsbG93cyB0aGUgUm91dGVyIHRvIGJlIHBsYXRmb3JtXG4gKiBhZ25vc3RpYy5cbiAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4gaGF2ZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgYFBsYXRmb3JtTG9jYXRpb25gIGZvciB0aGUgZGlmZmVyZW50XG4gKiBwbGF0Zm9ybXMgdGhhdCBhbmd1bGFyIHN1cHBvcnRzLiBGb3IgZXhhbXBsZSwgYEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJgIHByb3ZpZGVzIGFuXG4gKiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB0byB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCwgd2hpbGUgYEBhbmd1bGFyL3BsYXRmb3JtLXdlYndvcmtlcmAgcHJvdmlkZXNcbiAqIG9uZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggd2ViIHdvcmtlcnMuXG4gKlxuICogVGhlIGBQbGF0Zm9ybUxvY2F0aW9uYCBjbGFzcyBpcyB1c2VkIGRpcmVjdGx5IGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9XG4gKiB3aGVuIHRoZXkgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBET00gYXBpcyBsaWtlIHB1c2hTdGF0ZSwgcG9wU3RhdGUsIGV0Yy4uLlxuICpcbiAqIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBpbiB0dXJuIGlzIHVzZWQgYnkgdGhlIHtAbGluayBMb2NhdGlvbn0gc2VydmljZSB3aGljaCBpcyB1c2VkIGRpcmVjdGx5XG4gKiBieSB0aGUge0BsaW5rIFJvdXRlcn0gaW4gb3JkZXIgdG8gbmF2aWdhdGUgYmV0d2VlbiByb3V0ZXMuIFNpbmNlIGFsbCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB7QGxpbmtcbiAqIFJvdXRlcn0gL1xuICoge0BsaW5rIExvY2F0aW9ufSAvIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBhbmQgRE9NIGFwaXMgZmxvdyB0aHJvdWdoIHRoZSBgUGxhdGZvcm1Mb2NhdGlvbmBcbiAqIGNsYXNzIHRoZXkgYXJlIGFsbCBwbGF0Zm9ybSBpbmRlcGVuZGVudC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBQbGF0Zm9ybUxvY2F0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBsYXRmb3JtTG9jYXRpb24oKSB7XG4gICAgfVxuICAgIHJldHVybiBQbGF0Zm9ybUxvY2F0aW9uO1xufSgpKTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbmRpY2F0ZXMgd2hlbiBhIGxvY2F0aW9uIGlzIGluaXRpYWxpemVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIExPQ0FUSU9OX0lOSVRJQUxJWkVEID0gbmV3IEluamVjdGlvblRva2VuKCdMb2NhdGlvbiBJbml0aWFsaXplZCcpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEVuYWJsZXMgdGhlIGBMb2NhdGlvbmAgc2VydmljZSB0byByZWFkIHJvdXRlIHN0YXRlIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuXG4gKiBBbmd1bGFyIHByb3ZpZGVzIHR3byBzdHJhdGVnaWVzOlxuICogYEhhc2hMb2NhdGlvblN0cmF0ZWd5YCBhbmQgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YC5cbiAqXG4gKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgYFJvdXRlcmAgb3IgYExvY2F0aW9uYCBzZXJ2aWNlcyB0b1xuICogaW50ZXJhY3Qgd2l0aCBhcHBsaWNhdGlvbiByb3V0ZSBzdGF0ZS5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgcHJvZHVjZXMgVVJMcyBsaWtlXG4gKiA8Y29kZSBjbGFzcz1cIm5vLWF1dG8tbGlua1wiPmh0dHA6Ly9leGFtcGxlLmNvbSMvZm9vPC9jb2RlPixcbiAqIGFuZCBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgIHByb2R1Y2VzXG4gKiA8Y29kZSBjbGFzcz1cIm5vLWF1dG8tbGlua1wiPmh0dHA6Ly9leGFtcGxlLmNvbS9mb288L2NvZGU+IGFzIGFuIGVxdWl2YWxlbnQgVVJMLlxuICpcbiAqIFNlZSB0aGVzZSB0d28gY2xhc3NlcyBmb3IgbW9yZS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBMb2NhdGlvblN0cmF0ZWd5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvY2F0aW9uU3RyYXRlZ3koKSB7XG4gICAgfVxuICAgIHJldHVybiBMb2NhdGlvblN0cmF0ZWd5O1xufSgpKTtcbi8qKlxuICogQSBwcmVkZWZpbmVkIFtESSB0b2tlbl0oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pIGZvciB0aGUgYmFzZSBocmVmXG4gKiB0byBiZSB1c2VkIHdpdGggdGhlIGBQYXRoTG9jYXRpb25TdHJhdGVneWAuXG4gKiBUaGUgYmFzZSBocmVmIGlzIHRoZSBVUkwgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByZXNlcnZlZCB3aGVuIGdlbmVyYXRpbmdcbiAqIGFuZCByZWNvZ25pemluZyBVUkxzLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgdGhpcyB0b2tlbiB0byBjb25maWd1cmUgdGhlIHJvb3QgYXBwIGluamVjdG9yXG4gKiB3aXRoIGEgYmFzZSBocmVmIHZhbHVlLCBzbyB0aGF0IHRoZSBESSBmcmFtZXdvcmsgY2FuIHN1cHBseSB0aGUgZGVwZW5kZW5jeSBhbnl3aGVyZSBpbiB0aGUgYXBwLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7Q29tcG9uZW50LCBOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG4gKiBpbXBvcnQge0FQUF9CQVNFX0hSRUZ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG4gKlxuICogQE5nTW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IEFQUF9CQVNFX0hSRUYsIHVzZVZhbHVlOiAnL215L2FwcCd9XVxuICogfSlcbiAqIGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQVBQX0JBU0VfSFJFRiA9IG5ldyBJbmplY3Rpb25Ub2tlbignYXBwQmFzZUhyZWYnKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBBIHNlcnZpY2UgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIGEgYnJvd3NlcidzIFVSTC5cbiAqXG4gKiBEZXBlbmRpbmcgb24gdGhlIGBMb2NhdGlvblN0cmF0ZWd5YCB1c2VkLCBgTG9jYXRpb25gIHdpbGwgZWl0aGVyIHBlcnNpc3RcbiAqIHRvIHRoZSBVUkwncyBwYXRoIG9yIHRoZSBVUkwncyBoYXNoIHNlZ21lbnQuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBJdCdzIGJldHRlciB0byB1c2UgdGhlIHtAbGluayBSb3V0ZXIjbmF2aWdhdGV9IHNlcnZpY2UgdG8gdHJpZ2dlciByb3V0ZSBjaGFuZ2VzLiBVc2VcbiAqIGBMb2NhdGlvbmAgb25seSBpZiB5b3UgbmVlZCB0byBpbnRlcmFjdCB3aXRoIG9yIGNyZWF0ZSBub3JtYWxpemVkIFVSTHMgb3V0c2lkZSBvZlxuICogcm91dGluZy5cbiAqXG4gKiBgTG9jYXRpb25gIGlzIHJlc3BvbnNpYmxlIGZvciBub3JtYWxpemluZyB0aGUgVVJMIGFnYWluc3QgdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBocmVmLlxuICogQSBub3JtYWxpemVkIFVSTCBpcyBhYnNvbHV0ZSBmcm9tIHRoZSBVUkwgaG9zdCwgaW5jbHVkZXMgdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBocmVmLCBhbmQgaGFzIG5vXG4gKiB0cmFpbGluZyBzbGFzaDpcbiAqIC0gYC9teS9hcHAvdXNlci8xMjNgIGlzIG5vcm1hbGl6ZWRcbiAqIC0gYG15L2FwcC91c2VyLzEyM2AgKippcyBub3QqKiBub3JtYWxpemVkXG4gKiAtIGAvbXkvYXBwL3VzZXIvMTIzL2AgKippcyBub3QqKiBub3JtYWxpemVkXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiA8Y29kZS1leGFtcGxlIHBhdGg9J2NvbW1vbi9sb2NhdGlvbi90cy9wYXRoX2xvY2F0aW9uX2NvbXBvbmVudC50cydcbiAqIHJlZ2lvbj0nTG9jYXRpb25Db21wb25lbnQnPjwvY29kZS1leGFtcGxlPlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIExvY2F0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvY2F0aW9uKHBsYXRmb3JtU3RyYXRlZ3ksIHBsYXRmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX3VybENoYW5nZUxpc3RlbmVycyA9IFtdO1xuICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5ID0gcGxhdGZvcm1TdHJhdGVneTtcbiAgICAgICAgdmFyIGJyb3dzZXJCYXNlSHJlZiA9IHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuZ2V0QmFzZUhyZWYoKTtcbiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IHBsYXRmb3JtTG9jYXRpb247XG4gICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gTG9jYXRpb25fMS5zdHJpcFRyYWlsaW5nU2xhc2goX3N0cmlwSW5kZXhIdG1sKGJyb3dzZXJCYXNlSHJlZikpO1xuICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBfdGhpcy5fc3ViamVjdC5lbWl0KHtcbiAgICAgICAgICAgICAgICAndXJsJzogX3RoaXMucGF0aCh0cnVlKSxcbiAgICAgICAgICAgICAgICAncG9wJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAnc3RhdGUnOiBldi5zdGF0ZSxcbiAgICAgICAgICAgICAgICAndHlwZSc6IGV2LnR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIExvY2F0aW9uXzEgPSBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIFVSTCBwYXRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluY2x1ZGVIYXNoIFdoZXRoZXIgcGF0aCBoYXMgYW4gYW5jaG9yIGZyYWdtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgVVJMIHBhdGguXG4gICAgICovXG4gICAgLy8gVE9ETzogdnNhdmtpbi4gUmVtb3ZlIHRoZSBib29sZWFuIGZsYWcgYW5kIGFsd2F5cyBpbmNsdWRlIGhhc2ggb25jZSB0aGUgZGVwcmVjYXRlZCByb3V0ZXIgaXNcbiAgICAvLyByZW1vdmVkLlxuICAgIExvY2F0aW9uLnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gKGluY2x1ZGVIYXNoKSB7XG4gICAgICAgIGlmIChpbmNsdWRlSGFzaCA9PT0gdm9pZCAwKSB7IGluY2x1ZGVIYXNoID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplKHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucGF0aChpbmNsdWRlSGFzaCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaGlzdG9yeS5zdGF0ZSBvYmplY3QuXG4gICAgICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5nZXRTdGF0ZSgpOyB9O1xuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgdGhlIGdpdmVuIHBhdGggYW5kIGNvbXBhcmVzIHRvIHRoZSBjdXJyZW50IG5vcm1hbGl6ZWQgcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoIFRoZSBnaXZlbiBVUkwgcGF0aFxuICAgICAqIEBwYXJhbSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIFVSTCBwYXRoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IG5vcm1hbGl6ZWQgcGF0aCwgYGZhbHNlYFxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBMb2NhdGlvbi5wcm90b3R5cGUuaXNDdXJyZW50UGF0aEVxdWFsVG8gPSBmdW5jdGlvbiAocGF0aCwgcXVlcnkpIHtcbiAgICAgICAgaWYgKHF1ZXJ5ID09PSB2b2lkIDApIHsgcXVlcnkgPSAnJzsgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXRoKCkgPT0gdGhpcy5ub3JtYWxpemUocGF0aCArIExvY2F0aW9uXzEubm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTCwgcmV0dXJucyB0aGUgVVJMIHBhdGggYWZ0ZXIgc3RyaXBwaW5nIHRoZVxuICAgICAqIHRyYWlsaW5nIHNsYXNoZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIFVSTCBzdHJpbmcuXG4gICAgICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgcmV0dXJuIExvY2F0aW9uXzEuc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEJhc2VIcmVmKHRoaXMuX2Jhc2VIcmVmLCBfc3RyaXBJbmRleEh0bWwodXJsKSkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgVVJMLCByZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBleHRlcm5hbCBVUkwgcGF0aC5cbiAgICAgKiBJZiB0aGUgZ2l2ZW4gVVJMIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIGxlYWRpbmcgc2xhc2ggKGAnLydgKSwgdGhpcyBtZXRob2QgYWRkcyBvbmVcbiAgICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIFRoaXMgbWV0aG9kIGFsc28gYWRkcyBhIGhhc2ggaWYgYEhhc2hMb2NhdGlvblN0cmF0ZWd5YCBpc1xuICAgICAqIHVzZWQsIG9yIHRoZSBgQVBQX0JBU0VfSFJFRmAgaWYgdGhlIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgaW4gdXNlLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXJsIFN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyAgQSBub3JtYWxpemVkIHBsYXRmb3JtLXNwZWNpZmljIFVSTC5cbiAgICAgKi9cbiAgICBMb2NhdGlvbi5wcm90b3R5cGUucHJlcGFyZUV4dGVybmFsVXJsID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICBpZiAodXJsICYmIHVybFswXSAhPT0gJy8nKSB7XG4gICAgICAgICAgICB1cmwgPSAnLycgKyB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsKHVybCk7XG4gICAgfTtcbiAgICAvLyBUT0RPOiByZW5hbWUgdGhpcyBtZXRob2QgdG8gcHVzaFN0YXRlXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyB0aGUgYnJvd3NlcnMgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBVUkwsIGFuZCBwdXNoZXMgYVxuICAgICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXRoICBVUkwgcGF0aCB0byBub3JtYWxpenplXG4gICAgICogQHBhcmFtIHF1ZXJ5IFF1ZXJ5IHBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gc3RhdGUgTG9jYXRpb24gaGlzdG9yeSBzdGF0ZVxuICAgICAqXG4gICAgICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gKHBhdGgsIHF1ZXJ5LCBzdGF0ZSkge1xuICAgICAgICBpZiAocXVlcnkgPT09IHZvaWQgMCkgeyBxdWVyeSA9ICcnOyB9XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7IHN0YXRlID0gbnVsbDsgfVxuICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnB1c2hTdGF0ZShzdGF0ZSwgJycsIHBhdGgsIHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBMb2NhdGlvbl8xLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5KSksIHN0YXRlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoYW5nZXMgdGhlIGJyb3dzZXIncyBVUkwgdG8gYSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIFVSTCwgYW5kIHJlcGxhY2VzXG4gICAgICogdGhlIHRvcCBpdGVtIG9uIHRoZSBwbGF0Zm9ybSdzIGhpc3Rvcnkgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCAgVVJMIHBhdGggdG8gbm9ybWFsaXp6ZVxuICAgICAqIEBwYXJhbSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIHN0YXRlIExvY2F0aW9uIGhpc3Rvcnkgc3RhdGVcbiAgICAgKi9cbiAgICBMb2NhdGlvbi5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHBhdGgsIHF1ZXJ5LCBzdGF0ZSkge1xuICAgICAgICBpZiAocXVlcnkgPT09IHZvaWQgMCkgeyBxdWVyeSA9ICcnOyB9XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gdm9pZCAwKSB7IHN0YXRlID0gbnVsbDsgfVxuICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnJlcGxhY2VTdGF0ZShzdGF0ZSwgJycsIHBhdGgsIHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5fbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBMb2NhdGlvbl8xLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5KSksIHN0YXRlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyBmb3J3YXJkIGluIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuXG4gICAgICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLmZvcndhcmQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuZm9yd2FyZCgpOyB9O1xuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyBiYWNrIGluIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuXG4gICAgICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLmJhY2sgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuYmFjaygpOyB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIFVSTCBjaGFuZ2UgbGlzdGVuZXJzLiBUaGlzIEFQSSBjYW4gYmUgdXNlZCB0byBjYXRjaCB1cGRhdGVzIHBlcmZvcm1lZCBieSB0aGUgQW5ndWxhclxuICAgICAqIGZyYW1ld29yay4gVGhlc2UgYXJlIG5vdCBkZXRlY3RpYmxlIHRocm91Z2ggXCJwb3BzdGF0ZVwiIG9yIFwiaGFzaGNoYW5nZVwiIGV2ZW50cy5cbiAgICAgKi9cbiAgICBMb2NhdGlvbi5wcm90b3R5cGUub25VcmxDaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fdXJsQ2hhbmdlTGlzdGVuZXJzLnB1c2goZm4pO1xuICAgICAgICB0aGlzLnN1YnNjcmliZShmdW5jdGlvbiAodikgeyBfdGhpcy5fbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHYudXJsLCB2LnN0YXRlKTsgfSk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgTG9jYXRpb24ucHJvdG90eXBlLl9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnMgPSBmdW5jdGlvbiAodXJsLCBzdGF0ZSkge1xuICAgICAgICBpZiAodXJsID09PSB2b2lkIDApIHsgdXJsID0gJyc7IH1cbiAgICAgICAgdGhpcy5fdXJsQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7IHJldHVybiBmbih1cmwsIHN0YXRlKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gdGhlIHBsYXRmb3JtJ3MgYHBvcFN0YXRlYCBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgRXZlbnQgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgc3RhdGUgaGlzdG9yeSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFN1YnNjcmliZWQgZXZlbnRzLlxuICAgICAqL1xuICAgIExvY2F0aW9uLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiAob25OZXh0LCBvblRocm93LCBvblJldHVybikge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdC5zdWJzY3JpYmUoeyBuZXh0OiBvbk5leHQsIGVycm9yOiBvblRocm93LCBjb21wbGV0ZTogb25SZXR1cm4gfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHN0cmluZyBvZiB1cmwgcGFyYW1ldGVycywgcHJlcGVuZCB3aXRoIGA/YCBpZiBuZWVkZWQsIG90aGVyd2lzZSByZXR1cm4gdGhlXG4gICAgICogcGFyYW1ldGVycyBhcyBpcy5cbiAgICAgKlxuICAgICAqICBAcGFyYW0gIHBhcmFtcyBTdHJpbmcgb2YgVVJMIHBhcmFtZXRlcnNcbiAgICAgKlxuICAgICAqICBAcmV0dXJucyBVUkwgcGFyYW1ldGVycyBwcmVwZW5kZWQgd2l0aCBgP2Agb3IgdGhlIHBhcmFtZXRlcnMgYXMgaXMuXG4gICAgICovXG4gICAgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXMgJiYgcGFyYW1zWzBdICE9PSAnPycgPyAnPycgKyBwYXJhbXMgOiBwYXJhbXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBHaXZlbiAyIHBhcnRzIG9mIGEgVVJMLCBqb2luIHRoZW0gd2l0aCBhIHNsYXNoIGlmIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFydCAgVVJMIHN0cmluZ1xuICAgICAqIEBwYXJhbSBlbmQgICAgVVJMIHN0cmluZ1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBHaXZlbiBVUkwgc3RyaW5ncyBqb2luZWQgd2l0aCBhIHNsYXNoLCBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgTG9jYXRpb24uam9pbldpdGhTbGFzaCA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIGlmIChzdGFydC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNsYXNoZXMgPSAwO1xuICAgICAgICBpZiAoc3RhcnQuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgc2xhc2hlcysrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICBzbGFzaGVzKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNsYXNoZXMgPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2xhc2hlcyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSWYgVVJMIGhhcyBhIHRyYWlsaW5nIHNsYXNoLCByZW1vdmUgaXQsIG90aGVyd2lzZSByZXR1cm4gdGhlIFVSTCBhcyBpcy4gVGhlXG4gICAgICogbWV0aG9kIGxvb2tzIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlaXRoZXIgYCNgLCBgP2AsIG9yIHRoZSBlbmQgb2YgdGhlXG4gICAgICogbGluZSBhcyBgL2AgY2hhcmFjdGVycyBhbmQgcmVtb3ZlcyB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgb25lIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVVJMIHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybnMgUmV0dXJucyBhIFVSTCBzdHJpbmcgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZVxuICAgICAqIHJldHVybnMgdGhlIHN0cmluZyBhcyBpcy5cbiAgICAgKi9cbiAgICBMb2NhdGlvbi5zdHJpcFRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHVybC5tYXRjaCgvI3xcXD98JC8pO1xuICAgICAgICB2YXIgcGF0aEVuZElkeCA9IG1hdGNoICYmIG1hdGNoLmluZGV4IHx8IHVybC5sZW5ndGg7XG4gICAgICAgIHZhciBkcm9wcGVkU2xhc2hJZHggPSBwYXRoRW5kSWR4IC0gKHVybFtwYXRoRW5kSWR4IC0gMV0gPT09ICcvJyA/IDEgOiAwKTtcbiAgICAgICAgcmV0dXJuIHVybC5zbGljZSgwLCBkcm9wcGVkU2xhc2hJZHgpICsgdXJsLnNsaWNlKHBhdGhFbmRJZHgpO1xuICAgIH07XG4gICAgdmFyIExvY2F0aW9uXzE7XG4gICAgTG9jYXRpb24gPSBMb2NhdGlvbl8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtMb2NhdGlvblN0cmF0ZWd5LCBQbGF0Zm9ybUxvY2F0aW9uXSlcbiAgICBdLCBMb2NhdGlvbik7XG4gICAgcmV0dXJuIExvY2F0aW9uO1xufSgpKTtcbmZ1bmN0aW9uIF9zdHJpcEJhc2VIcmVmKGJhc2VIcmVmLCB1cmwpIHtcbiAgICByZXR1cm4gYmFzZUhyZWYgJiYgdXJsLnN0YXJ0c1dpdGgoYmFzZUhyZWYpID8gdXJsLnN1YnN0cmluZyhiYXNlSHJlZi5sZW5ndGgpIDogdXJsO1xufVxuZnVuY3Rpb24gX3N0cmlwSW5kZXhIdG1sKHVybCkge1xuICAgIHJldHVybiB1cmwucmVwbGFjZSgvXFwvaW5kZXguaHRtbCQvLCAnJyk7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvXG4gKiByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZVxuICogW2hhc2ggZnJhZ21lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpXG4gKiBvZiB0aGUgYnJvd3NlcidzIFVSTC5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjYWxsIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWVcbiAqIGBleGFtcGxlLmNvbSMvZm9vYC5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9sb2NhdGlvbi90cy9oYXNoX2xvY2F0aW9uX2NvbXBvbmVudC50cyByZWdpb249J0xvY2F0aW9uQ29tcG9uZW50J31cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBIYXNoTG9jYXRpb25TdHJhdGVneSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoSGFzaExvY2F0aW9uU3RyYXRlZ3ksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSGFzaExvY2F0aW9uU3RyYXRlZ3koX3BsYXRmb3JtTG9jYXRpb24sIF9iYXNlSHJlZikge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uO1xuICAgICAgICBfdGhpcy5fYmFzZUhyZWYgPSAnJztcbiAgICAgICAgaWYgKF9iYXNlSHJlZiAhPSBudWxsKSB7XG4gICAgICAgICAgICBfdGhpcy5fYmFzZUhyZWYgPSBfYmFzZUhyZWY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUub25Qb3BTdGF0ZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUoZm4pO1xuICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7XG4gICAgfTtcbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuZ2V0QmFzZUhyZWYgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9iYXNlSHJlZjsgfTtcbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIChpbmNsdWRlSGFzaCkge1xuICAgICAgICBpZiAoaW5jbHVkZUhhc2ggPT09IHZvaWQgMCkgeyBpbmNsdWRlSGFzaCA9IGZhbHNlOyB9XG4gICAgICAgIC8vIHRoZSBoYXNoIHZhbHVlIGlzIGFsd2F5cyBwcmVmaXhlZCB3aXRoIGEgYCNgXG4gICAgICAgIC8vIGFuZCBpZiBpdCBpcyBlbXB0eSB0aGVuIGl0IHdpbGwgc3RheSBlbXB0eVxuICAgICAgICB2YXIgcGF0aCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDtcbiAgICAgICAgaWYgKHBhdGggPT0gbnVsbClcbiAgICAgICAgICAgIHBhdGggPSAnIyc7XG4gICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7XG4gICAgfTtcbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucHJlcGFyZUV4dGVybmFsVXJsID0gZnVuY3Rpb24gKGludGVybmFsKSB7XG4gICAgICAgIHZhciB1cmwgPSBMb2NhdGlvbi5qb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7XG4gICAgICAgIHJldHVybiB1cmwubGVuZ3RoID4gMCA/ICgnIycgKyB1cmwpIDogdXJsO1xuICAgIH07XG4gICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHZhciB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICAgICAgaWYgKHVybC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCk7XG4gICAgfTtcbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgcGF0aCwgcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgdmFyIHVybCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBMb2NhdGlvbi5ub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB1cmwgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTtcbiAgICB9O1xuICAgIEhhc2hMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5mb3J3YXJkID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsgfTtcbiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuYmFjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCk7IH07XG4gICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDEsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDEsIEluamVjdChBUFBfQkFTRV9IUkVGKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbUGxhdGZvcm1Mb2NhdGlvbiwgU3RyaW5nXSlcbiAgICBdLCBIYXNoTG9jYXRpb25TdHJhdGVneSk7XG4gICAgcmV0dXJuIEhhc2hMb2NhdGlvblN0cmF0ZWd5O1xufShMb2NhdGlvblN0cmF0ZWd5KSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHtAbGluayBMb2NhdGlvblN0cmF0ZWd5fSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvXG4gKiByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZVxuICogW3BhdGhdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpIG9mIHRoZVxuICogYnJvd3NlcidzIFVSTC5cbiAqXG4gKiBJZiB5b3UncmUgdXNpbmcgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCwgeW91IG11c3QgcHJvdmlkZSBhIHtAbGluayBBUFBfQkFTRV9IUkVGfVxuICogb3IgYWRkIGEgYmFzZSBlbGVtZW50IHRvIHRoZSBkb2N1bWVudC4gVGhpcyBVUkwgcHJlZml4IHRoYXQgd2lsbCBiZSBwcmVzZXJ2ZWRcbiAqIHdoZW4gZ2VuZXJhdGluZyBhbmQgcmVjb2duaXppbmcgVVJMcy5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBwcm92aWRlIGFuIGBBUFBfQkFTRV9IUkVGYCBvZiBgJy9teS9hcHAnYCBhbmQgY2FsbFxuICogYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZVxuICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLlxuICpcbiAqIFNpbWlsYXJseSwgaWYgeW91IGFkZCBgPGJhc2UgaHJlZj0nL215L2FwcCcvPmAgdG8gdGhlIGRvY3VtZW50IGFuZCBjYWxsXG4gKiBgbG9jYXRpb24uZ28oJy9mb28nKWAsIHRoZSBicm93c2VyJ3MgVVJMIHdpbGwgYmVjb21lXG4gKiBgZXhhbXBsZS5jb20vbXkvYXBwL2Zvb2AuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvcGF0aF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgUGF0aExvY2F0aW9uU3RyYXRlZ3kgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFBhdGhMb2NhdGlvblN0cmF0ZWd5LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFBhdGhMb2NhdGlvblN0cmF0ZWd5KF9wbGF0Zm9ybUxvY2F0aW9uLCBocmVmKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9wbGF0Zm9ybUxvY2F0aW9uID0gX3BsYXRmb3JtTG9jYXRpb247XG4gICAgICAgIGlmIChocmVmID09IG51bGwpIHtcbiAgICAgICAgICAgIGhyZWYgPSBfdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5nZXRCYXNlSHJlZkZyb21ET00oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaHJlZiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYXNlIGhyZWYgc2V0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQVBQX0JBU0VfSFJFRiB0b2tlbiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5fYmFzZUhyZWYgPSBocmVmO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5vblBvcFN0YXRlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7XG4gICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKGZuKTtcbiAgICB9O1xuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5nZXRCYXNlSHJlZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2Jhc2VIcmVmOyB9O1xuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wcmVwYXJlRXh0ZXJuYWxVcmwgPSBmdW5jdGlvbiAoaW50ZXJuYWwpIHtcbiAgICAgICAgcmV0dXJuIExvY2F0aW9uLmpvaW5XaXRoU2xhc2godGhpcy5fYmFzZUhyZWYsIGludGVybmFsKTtcbiAgICB9O1xuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wYXRoID0gZnVuY3Rpb24gKGluY2x1ZGVIYXNoKSB7XG4gICAgICAgIGlmIChpbmNsdWRlSGFzaCA9PT0gdm9pZCAwKSB7IGluY2x1ZGVIYXNoID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHBhdGhuYW1lID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSArXG4gICAgICAgICAgICBMb2NhdGlvbi5ub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIHZhciBoYXNoID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oYXNoO1xuICAgICAgICByZXR1cm4gaGFzaCAmJiBpbmNsdWRlSGFzaCA/IFwiXCIgKyBwYXRobmFtZSArIGhhc2ggOiBwYXRobmFtZTtcbiAgICB9O1xuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5LnByb3RvdHlwZS5wdXNoU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHZhciBleHRlcm5hbFVybCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHVybCArIExvY2F0aW9uLm5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpO1xuICAgIH07XG4gICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCwgcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgdmFyIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCBleHRlcm5hbFVybCk7XG4gICAgfTtcbiAgICBQYXRoTG9jYXRpb25TdHJhdGVneS5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5mb3J3YXJkKCk7IH07XG4gICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJvdG90eXBlLmJhY2sgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpOyB9O1xuICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5ID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgX19wYXJhbSgxLCBPcHRpb25hbCgpKSwgX19wYXJhbSgxLCBJbmplY3QoQVBQX0JBU0VfSFJFRikpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1BsYXRmb3JtTG9jYXRpb24sIFN0cmluZ10pXG4gICAgXSwgUGF0aExvY2F0aW9uU3RyYXRlZ3kpO1xuICAgIHJldHVybiBQYXRoTG9jYXRpb25TdHJhdGVneTtcbn0oTG9jYXRpb25TdHJhdGVneSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZXG4vLyBTZWUgYW5ndWxhci90b29scy9ndWxwLXRhc2tzL2NsZHIvZXh0cmFjdC5qc1xudmFyIHUgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBwbHVyYWwobikge1xuICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSksIHYgPSBuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuPy8sICcnKS5sZW5ndGg7XG4gICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDU7XG59XG52YXIgbG9jYWxlRW4gPSBbXG4gICAgJ2VuJywgW1snYScsICdwJ10sIFsnQU0nLCAnUE0nXSwgdV0sIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLFxuICAgIFtcbiAgICAgICAgWydTJywgJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJ10sIFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgICAgIFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSxcbiAgICAgICAgWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddXG4gICAgXSxcbiAgICB1LFxuICAgIFtcbiAgICAgICAgWydKJywgJ0YnLCAnTScsICdBJywgJ00nLCAnSicsICdKJywgJ0EnLCAnUycsICdPJywgJ04nLCAnRCddLFxuICAgICAgICBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sXG4gICAgICAgIFtcbiAgICAgICAgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsXG4gICAgICAgICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcidcbiAgICAgICAgXVxuICAgIF0sXG4gICAgdSwgW1snQicsICdBJ10sIFsnQkMnLCAnQUQnXSwgWydCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJ11dLCAwLCBbNiwgMF0sXG4gICAgWydNL2QveXknLCAnTU1NIGQsIHknLCAnTU1NTSBkLCB5JywgJ0VFRUUsIE1NTU0gZCwgeSddLFxuICAgIFsnaDptbSBhJywgJ2g6bW06c3MgYScsICdoOm1tOnNzIGEgeicsICdoOm1tOnNzIGEgenp6eiddLCBbJ3sxfSwgezB9JywgdSwgJ3sxfSBcXCdhdFxcJyB7MH0nLCB1XSxcbiAgICBbJy4nLCAnLCcsICc7JywgJyUnLCAnKycsICctJywgJ0UnLCAnw5cnLCAn4oCwJywgJ+KInicsICdOYU4nLCAnOiddLFxuICAgIFsnIywjIzAuIyMjJywgJyMsIyMwJScsICfCpCMsIyMwLjAwJywgJyNFMCddLCAnJCcsICdVUyBEb2xsYXInLCB7fSwgcGx1cmFsXG5dO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIExPQ0FMRV9EQVRBID0ge307XG4vKipcbiAqIFJlZ2lzdGVyIGdsb2JhbCBkYXRhIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyLiBTZWUgdGhlXG4gKiBbXCJJMThuIGd1aWRlXCJdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykgdG8ga25vdyBob3cgdG8gaW1wb3J0IGFkZGl0aW9uYWwgbG9jYWxlIGRhdGEuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG4vLyBUaGUgc2lnbmF0dXJlIHJlZ2lzdGVyTG9jYWxlRGF0YShkYXRhOiBhbnksIGV4dHJhRGF0YT86IGFueSkgaXMgZGVwcmVjYXRlZCBzaW5jZSB2NS4xXG5mdW5jdGlvbiByZWdpc3RlckxvY2FsZURhdGEoZGF0YSwgbG9jYWxlSWQsIGV4dHJhRGF0YSkge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGV4dHJhRGF0YSA9IGxvY2FsZUlkO1xuICAgICAgICBsb2NhbGVJZCA9IGRhdGFbMCAvKiBMb2NhbGVJZCAqL107XG4gICAgfVxuICAgIGxvY2FsZUlkID0gbG9jYWxlSWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7XG4gICAgTE9DQUxFX0RBVEFbbG9jYWxlSWRdID0gZGF0YTtcbiAgICBpZiAoZXh0cmFEYXRhKSB7XG4gICAgICAgIExPQ0FMRV9EQVRBW2xvY2FsZUlkXVsxOSAvKiBFeHRyYURhdGEgKi9dID0gZXh0cmFEYXRhO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqIEBpbnRlcm5hbCAqL1xudmFyIENVUlJFTkNJRVNfRU4gPSB7XG4gICAgJ0FEUCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0FGTic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0FMTCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0FNRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0FPQSc6IFt1bmRlZmluZWQsICdLeiddLFxuICAgICdBUlMnOiBbdW5kZWZpbmVkLCAnJCddLFxuICAgICdBVUQnOiBbJ0EkJywgJyQnXSxcbiAgICAnQkFNJzogW3VuZGVmaW5lZCwgJ0tNJ10sXG4gICAgJ0JCRCc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ0JEVCc6IFt1bmRlZmluZWQsICfgp7MnXSxcbiAgICAnQkhEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSxcbiAgICAnQklGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnQk1EJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnQk5EJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnQk9CJzogW3VuZGVmaW5lZCwgJ0JzJ10sXG4gICAgJ0JSTCc6IFsnUiQnXSxcbiAgICAnQlNEJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnQldQJzogW3VuZGVmaW5lZCwgJ1AnXSxcbiAgICAnQllOJzogW3VuZGVmaW5lZCwgJ9GALicsIDJdLFxuICAgICdCWVInOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdCWkQnOiBbdW5kZWZpbmVkLCAnJCddLFxuICAgICdDQUQnOiBbJ0NBJCcsICckJywgMl0sXG4gICAgJ0NIRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sXG4gICAgJ0NMRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgNF0sXG4gICAgJ0NMUCc6IFt1bmRlZmluZWQsICckJywgMF0sXG4gICAgJ0NOWSc6IFsnQ07CpScsICfCpSddLFxuICAgICdDT1AnOiBbdW5kZWZpbmVkLCAnJCcsIDBdLFxuICAgICdDUkMnOiBbdW5kZWZpbmVkLCAn4oKhJywgMl0sXG4gICAgJ0NVQyc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ0NVUCc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ0NaSyc6IFt1bmRlZmluZWQsICdLxI0nLCAyXSxcbiAgICAnREpGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnREtLJzogW3VuZGVmaW5lZCwgJ2tyJywgMl0sXG4gICAgJ0RPUCc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ0VHUCc6IFt1bmRlZmluZWQsICdFwqMnXSxcbiAgICAnRVNQJzogW3VuZGVmaW5lZCwgJ+KCpycsIDBdLFxuICAgICdFVVInOiBbJ+KCrCddLFxuICAgICdGSkQnOiBbdW5kZWZpbmVkLCAnJCddLFxuICAgICdGS1AnOiBbdW5kZWZpbmVkLCAnwqMnXSxcbiAgICAnR0JQJzogWyfCoyddLFxuICAgICdHRUwnOiBbdW5kZWZpbmVkLCAn4oK+J10sXG4gICAgJ0dJUCc6IFt1bmRlZmluZWQsICfCoyddLFxuICAgICdHTkYnOiBbdW5kZWZpbmVkLCAnRkcnLCAwXSxcbiAgICAnR1RRJzogW3VuZGVmaW5lZCwgJ1EnXSxcbiAgICAnR1lEJzogW3VuZGVmaW5lZCwgJyQnLCAwXSxcbiAgICAnSEtEJzogWydISyQnLCAnJCddLFxuICAgICdITkwnOiBbdW5kZWZpbmVkLCAnTCddLFxuICAgICdIUksnOiBbdW5kZWZpbmVkLCAna24nXSxcbiAgICAnSFVGJzogW3VuZGVmaW5lZCwgJ0Z0JywgMl0sXG4gICAgJ0lEUic6IFt1bmRlZmluZWQsICdScCcsIDBdLFxuICAgICdJTFMnOiBbJ+KCqiddLFxuICAgICdJTlInOiBbJ+KCuSddLFxuICAgICdJUUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdJUlInOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdJU0snOiBbdW5kZWZpbmVkLCAna3InLCAwXSxcbiAgICAnSVRMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnSk1EJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnSk9EJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSxcbiAgICAnSlBZJzogWyfCpScsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0tIUic6IFt1bmRlZmluZWQsICfhn5snXSxcbiAgICAnS01GJzogW3VuZGVmaW5lZCwgJ0NGJywgMF0sXG4gICAgJ0tQVyc6IFt1bmRlZmluZWQsICfigqknLCAwXSxcbiAgICAnS1JXJzogWyfigqknLCB1bmRlZmluZWQsIDBdLFxuICAgICdLV0QnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLFxuICAgICdLWUQnOiBbdW5kZWZpbmVkLCAnJCddLFxuICAgICdLWlQnOiBbdW5kZWZpbmVkLCAn4oK4J10sXG4gICAgJ0xBSyc6IFt1bmRlZmluZWQsICfigq0nLCAwXSxcbiAgICAnTEJQJzogW3VuZGVmaW5lZCwgJ0zCoycsIDBdLFxuICAgICdMS1InOiBbdW5kZWZpbmVkLCAnUnMnXSxcbiAgICAnTFJEJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnTFRMJzogW3VuZGVmaW5lZCwgJ0x0J10sXG4gICAgJ0xVRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ0xWTCc6IFt1bmRlZmluZWQsICdMcyddLFxuICAgICdMWUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLFxuICAgICdNR0EnOiBbdW5kZWZpbmVkLCAnQXInLCAwXSxcbiAgICAnTUdGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnTU1LJzogW3VuZGVmaW5lZCwgJ0snLCAwXSxcbiAgICAnTU5UJzogW3VuZGVmaW5lZCwgJ+KCricsIDBdLFxuICAgICdNUk8nOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdNVVInOiBbdW5kZWZpbmVkLCAnUnMnLCAwXSxcbiAgICAnTVhOJzogWydNWCQnLCAnJCddLFxuICAgICdNWVInOiBbdW5kZWZpbmVkLCAnUk0nXSxcbiAgICAnTkFEJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnTkdOJzogW3VuZGVmaW5lZCwgJ+KCpiddLFxuICAgICdOSU8nOiBbdW5kZWZpbmVkLCAnQyQnXSxcbiAgICAnTk9LJzogW3VuZGVmaW5lZCwgJ2tyJywgMl0sXG4gICAgJ05QUic6IFt1bmRlZmluZWQsICdScyddLFxuICAgICdOWkQnOiBbJ05aJCcsICckJ10sXG4gICAgJ09NUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sXG4gICAgJ1BIUCc6IFt1bmRlZmluZWQsICfigrEnXSxcbiAgICAnUEtSJzogW3VuZGVmaW5lZCwgJ1JzJywgMF0sXG4gICAgJ1BMTic6IFt1bmRlZmluZWQsICd6xYInXSxcbiAgICAnUFlHJzogW3VuZGVmaW5lZCwgJ+KCsicsIDBdLFxuICAgICdST04nOiBbdW5kZWZpbmVkLCAnbGVpJ10sXG4gICAgJ1JTRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1JVQic6IFt1bmRlZmluZWQsICfigr0nXSxcbiAgICAnUlVSJzogW3VuZGVmaW5lZCwgJ9GALiddLFxuICAgICdSV0YnOiBbdW5kZWZpbmVkLCAnUkYnLCAwXSxcbiAgICAnU0JEJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnU0VLJzogW3VuZGVmaW5lZCwgJ2tyJywgMl0sXG4gICAgJ1NHRCc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ1NIUCc6IFt1bmRlZmluZWQsICfCoyddLFxuICAgICdTTEwnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdTT1MnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdTUkQnOiBbdW5kZWZpbmVkLCAnJCddLFxuICAgICdTU1AnOiBbdW5kZWZpbmVkLCAnwqMnXSxcbiAgICAnU1REJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnU1ROJzogW3VuZGVmaW5lZCwgJ0RiJ10sXG4gICAgJ1NZUCc6IFt1bmRlZmluZWQsICfCoycsIDBdLFxuICAgICdUSEInOiBbdW5kZWZpbmVkLCAn4Li/J10sXG4gICAgJ1RNTSc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1RORCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sXG4gICAgJ1RPUCc6IFt1bmRlZmluZWQsICdUJCddLFxuICAgICdUUkwnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdUUlknOiBbdW5kZWZpbmVkLCAn4oK6J10sXG4gICAgJ1RURCc6IFt1bmRlZmluZWQsICckJ10sXG4gICAgJ1RXRCc6IFsnTlQkJywgJyQnLCAyXSxcbiAgICAnVFpTJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnVUFIJzogW3VuZGVmaW5lZCwgJ+KCtCddLFxuICAgICdVR1gnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLFxuICAgICdVU0QnOiBbJyQnXSxcbiAgICAnVVlJJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnVVlVJzogW3VuZGVmaW5lZCwgJyQnXSxcbiAgICAnVVpTJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnVkVGJzogW3VuZGVmaW5lZCwgJ0JzJ10sXG4gICAgJ1ZORCc6IFsn4oKrJywgdW5kZWZpbmVkLCAwXSxcbiAgICAnVlVWJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSxcbiAgICAnWEFGJzogWydGQ0ZBJywgdW5kZWZpbmVkLCAwXSxcbiAgICAnWENEJzogWydFQyQnLCAnJCddLFxuICAgICdYT0YnOiBbJ0NGQScsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1hQRic6IFsnQ0ZQRicsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1lFUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1pBUic6IFt1bmRlZmluZWQsICdSJ10sXG4gICAgJ1pNSyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sXG4gICAgJ1pNVyc6IFt1bmRlZmluZWQsICdaSyddLFxuICAgICdaV0QnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdXG59O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEZvcm1hdCBzdHlsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgbnVtYmVycy5cbiAqIEBzZWUgYGdldExvY2FsZU51bWJlckZvcm1hdCgpYC5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTnVtYmVyRm9ybWF0U3R5bGU7XG4oZnVuY3Rpb24gKE51bWJlckZvcm1hdFN0eWxlKSB7XG4gICAgTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGVbXCJEZWNpbWFsXCJdID0gMF0gPSBcIkRlY2ltYWxcIjtcbiAgICBOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZVtcIlBlcmNlbnRcIl0gPSAxXSA9IFwiUGVyY2VudFwiO1xuICAgIE51bWJlckZvcm1hdFN0eWxlW051bWJlckZvcm1hdFN0eWxlW1wiQ3VycmVuY3lcIl0gPSAyXSA9IFwiQ3VycmVuY3lcIjtcbiAgICBOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZVtcIlNjaWVudGlmaWNcIl0gPSAzXSA9IFwiU2NpZW50aWZpY1wiO1xufSkoTnVtYmVyRm9ybWF0U3R5bGUgfHwgKE51bWJlckZvcm1hdFN0eWxlID0ge30pKTtcbi8qKlxuICogUGx1cmFsaXR5IGNhc2VzIHVzZWQgZm9yIHRyYW5zbGF0aW5nIHBsdXJhbHMgdG8gZGlmZmVyZW50IGxhbmd1YWdlcy5cbiAqXG4gKiBAc2VlIGBOZ1BsdXJhbGBcbiAqIEBzZWUgYE5nUGx1cmFsQ2FzZWBcbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaSAqL1xudmFyIFBsdXJhbDtcbihmdW5jdGlvbiAoUGx1cmFsKSB7XG4gICAgUGx1cmFsW1BsdXJhbFtcIlplcm9cIl0gPSAwXSA9IFwiWmVyb1wiO1xuICAgIFBsdXJhbFtQbHVyYWxbXCJPbmVcIl0gPSAxXSA9IFwiT25lXCI7XG4gICAgUGx1cmFsW1BsdXJhbFtcIlR3b1wiXSA9IDJdID0gXCJUd29cIjtcbiAgICBQbHVyYWxbUGx1cmFsW1wiRmV3XCJdID0gM10gPSBcIkZld1wiO1xuICAgIFBsdXJhbFtQbHVyYWxbXCJNYW55XCJdID0gNF0gPSBcIk1hbnlcIjtcbiAgICBQbHVyYWxbUGx1cmFsW1wiT3RoZXJcIl0gPSA1XSA9IFwiT3RoZXJcIjtcbn0pKFBsdXJhbCB8fCAoUGx1cmFsID0ge30pKTtcbi8qKlxuICogQ29udGV4dC1kZXBlbmRhbnQgdHJhbnNsYXRpb24gZm9ybXMgZm9yIHN0cmluZ3MuXG4gKiBUeXBpY2FsbHkgdGhlIHN0YW5kYWxvbmUgdmVyc2lvbiBpcyBmb3IgdGhlIG5vbWluYXRpdmUgZm9ybSBvZiB0aGUgd29yZCxcbiAqIGFuZCB0aGUgZm9ybWF0IHZlcnNpb24gaXMgdXNlZCBmb3IgdGhlIGdlbml0aXZlIGNhc2UuXG4gKiBAc2VlIFtDTERSIHdlYnNpdGVdKGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL3RyYW5zbGF0aW9uL2RhdGUtdGltZSNUT0MtU3RhbmQtQWxvbmUtdnMuLUZvcm1hdC1TdHlsZXMpXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1TdHlsZTtcbihmdW5jdGlvbiAoRm9ybVN0eWxlKSB7XG4gICAgRm9ybVN0eWxlW0Zvcm1TdHlsZVtcIkZvcm1hdFwiXSA9IDBdID0gXCJGb3JtYXRcIjtcbiAgICBGb3JtU3R5bGVbRm9ybVN0eWxlW1wiU3RhbmRhbG9uZVwiXSA9IDFdID0gXCJTdGFuZGFsb25lXCI7XG59KShGb3JtU3R5bGUgfHwgKEZvcm1TdHlsZSA9IHt9KSk7XG4vKipcbiAqIFN0cmluZyB3aWR0aHMgYXZhaWxhYmxlIGZvciB0cmFuc2xhdGlvbnMuXG4gKiBUaGUgc3BlY2lmaWMgY2hhcmFjdGVyIHdpZHRocyBhcmUgbG9jYWxlLXNwZWNpZmljLlxuICogRXhhbXBsZXMgYXJlIGdpdmVuIGZvciB0aGUgd29yZCBcIlN1bmRheVwiIGluIEVuZ2xpc2guXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVHJhbnNsYXRpb25XaWR0aDtcbihmdW5jdGlvbiAoVHJhbnNsYXRpb25XaWR0aCkge1xuICAgIC8qKiAxIGNoYXJhY3RlciBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICdTJyAqL1xuICAgIFRyYW5zbGF0aW9uV2lkdGhbVHJhbnNsYXRpb25XaWR0aFtcIk5hcnJvd1wiXSA9IDBdID0gXCJOYXJyb3dcIjtcbiAgICAvKiogMyBjaGFyYWN0ZXJzIGZvciBgZW4tVVNgLiBGb3IgZXhhbXBsZTogJ1N1bicgKi9cbiAgICBUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGhbXCJBYmJyZXZpYXRlZFwiXSA9IDFdID0gXCJBYmJyZXZpYXRlZFwiO1xuICAgIC8qKiBGdWxsIGxlbmd0aCBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6IFwiU3VuZGF5XCIgKi9cbiAgICBUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGhbXCJXaWRlXCJdID0gMl0gPSBcIldpZGVcIjtcbiAgICAvKiogMiBjaGFyYWN0ZXJzIGZvciBgZW4tVVNgLCBGb3IgZXhhbXBsZTogXCJTdVwiICovXG4gICAgVHJhbnNsYXRpb25XaWR0aFtUcmFuc2xhdGlvbldpZHRoW1wiU2hvcnRcIl0gPSAzXSA9IFwiU2hvcnRcIjtcbn0pKFRyYW5zbGF0aW9uV2lkdGggfHwgKFRyYW5zbGF0aW9uV2lkdGggPSB7fSkpO1xuLyoqXG4gKiBTdHJpbmcgd2lkdGhzIGF2YWlsYWJsZSBmb3IgZGF0ZS10aW1lIGZvcm1hdHMuXG4gKiBUaGUgc3BlY2lmaWMgY2hhcmFjdGVyIHdpZHRocyBhcmUgbG9jYWxlLXNwZWNpZmljLlxuICogRXhhbXBsZXMgYXJlIGdpdmVuIGZvciBgZW4tVVNgLlxuICpcbiAqIEBzZWUgYGdldExvY2FsZURhdGVGb3JtYXQoKWBcbiAqIEBzZWUgYGdldExvY2FsZVRpbWVGb3JtYXQoKWBgXG4gKiBAc2VlIGBnZXRMb2NhbGVEYXRlVGltZUZvcm1hdCgpYFxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1hdFdpZHRoO1xuKGZ1bmN0aW9uIChGb3JtYXRXaWR0aCkge1xuICAgIC8qKlxuICAgICAqIEZvciBgZW4tVVNgLCAnTS9kL3l5LCBoOm1tIGEnYFxuICAgICAqIChFeGFtcGxlOiBgNi8xNS8xNSwgOTowMyBBTWApXG4gICAgICovXG4gICAgRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGhbXCJTaG9ydFwiXSA9IDBdID0gXCJTaG9ydFwiO1xuICAgIC8qKlxuICAgICAqIEZvciBgZW4tVVNgLCBgJ01NTSBkLCB5LCBoOm1tOnNzIGEnYFxuICAgICAqIChFeGFtcGxlOiBgSnVuIDE1LCAyMDE1LCA5OjAzOjAxIEFNYClcbiAgICAgKi9cbiAgICBGb3JtYXRXaWR0aFtGb3JtYXRXaWR0aFtcIk1lZGl1bVwiXSA9IDFdID0gXCJNZWRpdW1cIjtcbiAgICAvKipcbiAgICAgKiBGb3IgYGVuLVVTYCwgYCdNTU1NIGQsIHksIGg6bW06c3MgYSB6J2BcbiAgICAgKiAoRXhhbXBsZTogYEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTSBHTVQrMWApXG4gICAgICovXG4gICAgRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGhbXCJMb25nXCJdID0gMl0gPSBcIkxvbmdcIjtcbiAgICAvKipcbiAgICAgKiBGb3IgYGVuLVVTYCwgYCdFRUVFLCBNTU1NIGQsIHksIGg6bW06c3MgYSB6enp6J2BcbiAgICAgKiAoRXhhbXBsZTogYE1vbmRheSwgSnVuZSAxNSwgMjAxNSBhdCA5OjAzOjAxIEFNIEdNVCswMTowMGApXG4gICAgICovXG4gICAgRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGhbXCJGdWxsXCJdID0gM10gPSBcIkZ1bGxcIjtcbn0pKEZvcm1hdFdpZHRoIHx8IChGb3JtYXRXaWR0aCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbHMgdGhhdCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVycyBpbiBudW1iZXIgcGF0dGVybnMuXG4gKiBFeGFtcGxlcyBhcmUgYmFzZWQgb24gYGVuLVVTYCB2YWx1ZXMuXG4gKlxuICogQHNlZSBgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKClgXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE51bWJlclN5bWJvbDtcbihmdW5jdGlvbiAoTnVtYmVyU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogRGVjaW1hbCBzZXBhcmF0b3IuXG4gICAgICogRm9yIGBlbi1VU2AsIHRoZSBkb3QgY2hhcmFjdGVyLlxuICAgICAqIEV4YW1wbGUgOiAyLDM0NWAuYDY3XG4gICAgICovXG4gICAgTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbFtcIkRlY2ltYWxcIl0gPSAwXSA9IFwiRGVjaW1hbFwiO1xuICAgIC8qKlxuICAgICAqIEdyb3VwaW5nIHNlcGFyYXRvciwgdHlwaWNhbGx5IGZvciB0aG91c2FuZHMuXG4gICAgICogRm9yIGBlbi1VU2AsIHRoZSBjb21tYSBjaGFyYWN0ZXIuXG4gICAgICogRXhhbXBsZTogMmAsYDM0NS42N1xuICAgICAqL1xuICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2xbXCJHcm91cFwiXSA9IDFdID0gXCJHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIExpc3QtaXRlbSBzZXBhcmF0b3IuXG4gICAgICogRXhhbXBsZTogXCJvbmUsIHR3bywgYW5kIHRocmVlXCJcbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiTGlzdFwiXSA9IDJdID0gXCJMaXN0XCI7XG4gICAgLyoqXG4gICAgICogU2lnbiBmb3IgcGVyY2VudGFnZSAob3V0IG9mIDEwMCkuXG4gICAgICogRXhhbXBsZTogMjMuNCVcbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiUGVyY2VudFNpZ25cIl0gPSAzXSA9IFwiUGVyY2VudFNpZ25cIjtcbiAgICAvKipcbiAgICAgKiBTaWduIGZvciBwb3NpdGl2ZSBudW1iZXJzLlxuICAgICAqIEV4YW1wbGU6ICsyM1xuICAgICAqL1xuICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2xbXCJQbHVzU2lnblwiXSA9IDRdID0gXCJQbHVzU2lnblwiO1xuICAgIC8qKlxuICAgICAqIFNpZ24gZm9yIG5lZ2F0aXZlIG51bWJlcnMuXG4gICAgICogRXhhbXBsZTogLTIzXG4gICAgICovXG4gICAgTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbFtcIk1pbnVzU2lnblwiXSA9IDVdID0gXCJNaW51c1NpZ25cIjtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlciBub3RhdGlvbiBmb3IgZXhwb25lbnRpYWwgdmFsdWUgKG4gdGltZXMgYSBwb3dlciBvZiAxMCkuXG4gICAgICogRXhhbXBsZTogMS4yRTNcbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiRXhwb25lbnRpYWxcIl0gPSA2XSA9IFwiRXhwb25lbnRpYWxcIjtcbiAgICAvKipcbiAgICAgKiBIdW1hbi1yZWFkYWJsZSBmb3JtYXQgb2YgZXhwb25lbnRpYWwuXG4gICAgICogRXhhbXBsZTogMS4yeDEwM1xuICAgICAqL1xuICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2xbXCJTdXBlcnNjcmlwdGluZ0V4cG9uZW50XCJdID0gN10gPSBcIlN1cGVyc2NyaXB0aW5nRXhwb25lbnRcIjtcbiAgICAvKipcbiAgICAgKiBTaWduIGZvciBwZXJtaWxsZSAob3V0IG9mIDEwMDApLlxuICAgICAqIEV4YW1wbGU6IDIzLjTigLBcbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiUGVyTWlsbGVcIl0gPSA4XSA9IFwiUGVyTWlsbGVcIjtcbiAgICAvKipcbiAgICAgKiBJbmZpbml0eSwgY2FuIGJlIHVzZWQgd2l0aCBwbHVzIGFuZCBtaW51cy5cbiAgICAgKiBFeGFtcGxlOiDiiJ4sICviiJ4sIC3iiJ5cbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiSW5maW5pdHlcIl0gPSA5XSA9IFwiSW5maW5pdHlcIjtcbiAgICAvKipcbiAgICAgKiBOb3QgYSBudW1iZXIuXG4gICAgICogRXhhbXBsZTogTmFOXG4gICAgICovXG4gICAgTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbFtcIk5hTlwiXSA9IDEwXSA9IFwiTmFOXCI7XG4gICAgLyoqXG4gICAgICogU3ltYm9sIHVzZWQgYmV0d2VlbiB0aW1lIHVuaXRzLlxuICAgICAqIEV4YW1wbGU6IDEwOjUyXG4gICAgICovXG4gICAgTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbFtcIlRpbWVTZXBhcmF0b3JcIl0gPSAxMV0gPSBcIlRpbWVTZXBhcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBEZWNpbWFsIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgRGVjaW1hbGApLlxuICAgICAqIEV4YW1wbGU6ICQyLDM0NS42N1xuICAgICAqL1xuICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2xbXCJDdXJyZW5jeURlY2ltYWxcIl0gPSAxMl0gPSBcIkN1cnJlbmN5RGVjaW1hbFwiO1xuICAgIC8qKlxuICAgICAqIEdyb3VwIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgR3JvdXBgKS5cbiAgICAgKiBFeGFtcGxlOiAkMiwzNDUuNjdcbiAgICAgKi9cbiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sW1wiQ3VycmVuY3lHcm91cFwiXSA9IDEzXSA9IFwiQ3VycmVuY3lHcm91cFwiO1xufSkoTnVtYmVyU3ltYm9sIHx8IChOdW1iZXJTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBUaGUgdmFsdWUgZm9yIGVhY2ggZGF5IG9mIHRoZSB3ZWVrLCBiYXNlZCBvbiB0aGUgYGVuLVVTYCBsb2NhbGVcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBXZWVrRGF5O1xuKGZ1bmN0aW9uIChXZWVrRGF5KSB7XG4gICAgV2Vla0RheVtXZWVrRGF5W1wiU3VuZGF5XCJdID0gMF0gPSBcIlN1bmRheVwiO1xuICAgIFdlZWtEYXlbV2Vla0RheVtcIk1vbmRheVwiXSA9IDFdID0gXCJNb25kYXlcIjtcbiAgICBXZWVrRGF5W1dlZWtEYXlbXCJUdWVzZGF5XCJdID0gMl0gPSBcIlR1ZXNkYXlcIjtcbiAgICBXZWVrRGF5W1dlZWtEYXlbXCJXZWRuZXNkYXlcIl0gPSAzXSA9IFwiV2VkbmVzZGF5XCI7XG4gICAgV2Vla0RheVtXZWVrRGF5W1wiVGh1cnNkYXlcIl0gPSA0XSA9IFwiVGh1cnNkYXlcIjtcbiAgICBXZWVrRGF5W1dlZWtEYXlbXCJGcmlkYXlcIl0gPSA1XSA9IFwiRnJpZGF5XCI7XG4gICAgV2Vla0RheVtXZWVrRGF5W1wiU2F0dXJkYXlcIl0gPSA2XSA9IFwiU2F0dXJkYXlcIjtcbn0pKFdlZWtEYXkgfHwgKFdlZWtEYXkgPSB7fSkpO1xuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxvY2FsZSBJRCBmcm9tIHRoZSBjdXJyZW50bHkgbG9hZGVkIGxvY2FsZS5cbiAqIFRoZSBsb2FkZWQgbG9jYWxlIGNvdWxkIGJlLCBmb3IgZXhhbXBsZSwgYSBnbG9iYWwgb25lIHJhdGhlciB0aGFuIGEgcmVnaW9uYWwgb25lLlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlLCBzdWNoIGFzIGBmci1GUmAuXG4gKiBAcmV0dXJucyBUaGUgbG9jYWxlIGNvZGUuIEZvciBleGFtcGxlLCBgZnJgLlxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZUlkKGxvY2FsZSkge1xuICAgIHJldHVybiBmaW5kTG9jYWxlRGF0YShsb2NhbGUpWzAgLyogTG9jYWxlSWQgKi9dO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgZGF5IHBlcmlvZCBzdHJpbmdzIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLlxuICpcbiAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICogQHBhcmFtIGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS5cbiAqIEBwYXJhbSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgbG9jYWxpemVkIHBlcmlvZCBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgYFtBTSwgUE1dYCBmb3IgYGVuLVVTYC5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybVN0eWxlLCB3aWR0aCkge1xuICAgIHZhciBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTtcbiAgICB2YXIgYW1QbURhdGEgPSBbZGF0YVsxIC8qIERheVBlcmlvZHNGb3JtYXQgKi9dLCBkYXRhWzIgLyogRGF5UGVyaW9kc1N0YW5kYWxvbmUgKi9dXTtcbiAgICB2YXIgYW1QbSA9IGdldExhc3REZWZpbmVkVmFsdWUoYW1QbURhdGEsIGZvcm1TdHlsZSk7XG4gICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoYW1QbSwgd2lkdGgpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgZGF5cyBvZiB0aGUgd2VlayBmb3IgdGhlIGdpdmVuIGxvY2FsZSwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uXG4gKiBAcGFyYW0gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGxvY2FsaXplZCBuYW1lIHN0cmluZ3MuXG4gKiBGb3IgZXhhbXBsZSxgW1N1bmRheSwgTW9uZGF5LCAuLi4gU2F0dXJkYXldYCBmb3IgYGVuLVVTYC5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVEYXlOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgdmFyIGRheXNEYXRhID0gW2RhdGFbMyAvKiBEYXlzRm9ybWF0ICovXSwgZGF0YVs0IC8qIERheXNTdGFuZGFsb25lICovXV07XG4gICAgdmFyIGRheXMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheXNEYXRhLCBmb3JtU3R5bGUpO1xuICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheXMsIHdpZHRoKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIG1vbnRocyBvZiB0aGUgeWVhciBmb3IgdGhlIGdpdmVuIGxvY2FsZSwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uXG4gKiBAcGFyYW0gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGxvY2FsaXplZCBuYW1lIHN0cmluZ3MuXG4gKiBGb3IgZXhhbXBsZSwgIGBbSmFudWFyeSwgRmVicnVhcnksIC4uLl1gIGZvciBgZW4tVVNgLlxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZU1vbnRoTmFtZXMobG9jYWxlLCBmb3JtU3R5bGUsIHdpZHRoKSB7XG4gICAgdmFyIGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpO1xuICAgIHZhciBtb250aHNEYXRhID0gW2RhdGFbNSAvKiBNb250aHNGb3JtYXQgKi9dLCBkYXRhWzYgLyogTW9udGhzU3RhbmRhbG9uZSAqL11dO1xuICAgIHZhciBtb250aHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKG1vbnRoc0RhdGEsIGZvcm1TdHlsZSk7XG4gICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUobW9udGhzLCB3aWR0aCk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBHcmVnb3JpYW4tY2FsZW5kYXIgZXJhcyBmb3IgdGhlIGdpdmVuIGxvY2FsZS5cbiAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICogQHBhcmFtIGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS5cbiAqIEBwYXJhbSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLlxuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBsb2NhbGl6ZWQgZXJhIHN0cmluZ3MuXG4gKiBGb3IgZXhhbXBsZSwgYFtBRCwgQkNdYCBmb3IgYGVuLVVTYC5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVFcmFOYW1lcyhsb2NhbGUsIHdpZHRoKSB7XG4gICAgdmFyIGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpO1xuICAgIHZhciBlcmFzRGF0YSA9IGRhdGFbNyAvKiBFcmFzICovXTtcbiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShlcmFzRGF0YSwgd2lkdGgpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayBmb3IgdGhlIGdpdmVuIGxvY2FsZS5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEByZXR1cm5zIEEgZGF5IGluZGV4IG51bWJlciwgdXNpbmcgdGhlIDAtYmFzZWQgd2Vlay1kYXkgaW5kZXggZm9yIGBlbi1VU2BcbiAqIChTdW5kYXkgPSAwLCBNb25kYXkgPSAxLCAuLi4pLlxuICogRm9yIGV4YW1wbGUsIGZvciBgZnItRlJgLCByZXR1cm5zIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlyc3QgZGF5IGlzIE1vbmRheS5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVGaXJzdERheU9mV2Vlayhsb2NhbGUpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgcmV0dXJuIGRhdGFbOCAvKiBGaXJzdERheU9mV2VlayAqL107XG59XG4vKipcbiAqIFJhbmdlIG9mIHdlZWsgZGF5cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRoZSB3ZWVrLWVuZCBmb3IgdGhlIGdpdmVuIGxvY2FsZS5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSByYW5nZSBvZiBkYXkgdmFsdWVzLCBgW3N0YXJ0RGF5LCBlbmREYXldYC5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVXZWVrRW5kUmFuZ2UobG9jYWxlKSB7XG4gICAgdmFyIGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpO1xuICAgIHJldHVybiBkYXRhWzkgLyogV2Vla2VuZFJhbmdlICovXTtcbn1cbi8qKlxuICogUmV0cmlldmVzIGEgbG9jYWxpemVkIGRhdGUtdmFsdWUgZm9ybWF0aW5nIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSB3aWR0aCBUaGUgZm9ybWF0IHR5cGUuXG4gKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGZvcm1hdGluZyBzdHJpbmcuXG4gKiBAc2VlIGBGb3JtYXRXaWR0aGBcbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YVsxMCAvKiBEYXRlRm9ybWF0ICovXSwgd2lkdGgpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBsb2NhbGl6ZWQgdGltZS12YWx1ZSBmb3JtYXR0aW5nIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSB3aWR0aCBUaGUgZm9ybWF0IHR5cGUuXG4gKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLlxuICogQHNlZSBgRm9ybWF0V2lkdGhgXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCB3aWR0aCkge1xuICAgIHZhciBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTtcbiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRhWzExIC8qIFRpbWVGb3JtYXQgKi9dLCB3aWR0aCk7XG59XG4vKipcbiAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXRpbWUgZm9ybWF0dGluZyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKiBAcGFyYW0gd2lkdGggVGhlIGZvcm1hdCB0eXBlLlxuICogQHJldHVybnMgVGhlIGxvY2FsaXplZCBmb3JtYXR0aW5nIHN0cmluZy5cbiAqIEBzZWUgYEZvcm1hdFdpZHRoYFxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgdmFyIGRhdGVUaW1lRm9ybWF0RGF0YSA9IGRhdGFbMTIgLyogRGF0ZVRpbWVGb3JtYXQgKi9dO1xuICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRhdGVUaW1lRm9ybWF0RGF0YSwgd2lkdGgpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBsb2NhbGl6ZWQgbnVtYmVyIHN5bWJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgcGxhY2Vob2xkZXJzIGluIG51bWJlciBmb3JtYXRzLlxuICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIGNvZGUuXG4gKiBAcGFyYW0gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9jYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgY2hhcmFjdGVyIGZvciB0aGUgbG9jYWxpemVkIHN5bWJvbC5cbiAqIEBzZWUgYE51bWJlclN5bWJvbGBcbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBzeW1ib2wpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgdmFyIHJlcyA9IGRhdGFbMTMgLyogTnVtYmVyU3ltYm9scyAqL11bc3ltYm9sXTtcbiAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHN5bWJvbCA9PT0gTnVtYmVyU3ltYm9sLkN1cnJlbmN5RGVjaW1hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFbMTMgLyogTnVtYmVyU3ltYm9scyAqL11bTnVtYmVyU3ltYm9sLkRlY2ltYWxdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhWzEzIC8qIE51bWJlclN5bWJvbHMgKi9dW051bWJlclN5bWJvbC5Hcm91cF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogUmV0cmlldmVzIGEgbnVtYmVyIGZvcm1hdCBmb3IgYSBnaXZlbiBsb2NhbGUuXG4gKlxuICogTnVtYmVycyBhcmUgZm9ybWF0dGVkIHVzaW5nIHBhdHRlcm5zLCBsaWtlIGAjLCMjIy4wMGAuIEZvciBleGFtcGxlLCB0aGUgcGF0dGVybiBgIywjIyMuMDBgXG4gKiB3aGVuIHVzZWQgdG8gZm9ybWF0IHRoZSBudW1iZXIgMTIzNDUuNjc4IGNvdWxkIHJlc3VsdCBpbiBcIjEyJzM0NSw2NzhcIi4gVGhhdCB3b3VsZCBoYXBwZW4gaWYgdGhlXG4gKiBncm91cGluZyBzZXBhcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgaXMgYW4gYXBvc3Ryb3BoZSwgYW5kIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyBhIGNvbW1hLlxuICpcbiAqIDxiPkltcG9ydGFudDo8L2I+IFRoZSBjaGFyYWN0ZXJzIGAuYCBgLGAgYDBgIGAjYCAoYW5kIG90aGVycyBiZWxvdykgYXJlIHNwZWNpYWwgcGxhY2Vob2xkZXJzXG4gKiB0aGF0IHN0YW5kIGZvciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IsIGFuZCBzbyBvbiwgYW5kIGFyZSBOT1QgcmVhbCBjaGFyYWN0ZXJzLlxuICogWW91IG11c3QgTk9UIFwidHJhbnNsYXRlXCIgdGhlIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUsIGRvbid0IGNoYW5nZSBgLmAgdG8gYCxgIGV2ZW4gdGhvdWdoIGluXG4gKiB5b3VyIGxhbmd1YWdlIHRoZSBkZWNpbWFsIHBvaW50IGlzIHdyaXR0ZW4gd2l0aCBhIGNvbW1hLiBUaGUgc3ltYm9scyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlXG4gKiBsb2NhbCBlcXVpdmFsZW50cywgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGBOdW1iZXJTeW1ib2xgIGZvciB5b3VyIGxhbmd1YWdlLlxuICpcbiAqIEhlcmUgYXJlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgdXNlZCBpbiBudW1iZXIgcGF0dGVybnM6XG4gKlxuICogfCBTeW1ib2wgfCBNZWFuaW5nIHxcbiAqIHwtLS0tLS0tLXwtLS0tLS0tLS18XG4gKiB8IC4gfCBSZXBsYWNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgdGhlIGRlY2ltYWwgcG9pbnQuIHxcbiAqIHwgLCB8IFJlcGxhY2VkIGJ5IHRoZSBcImdyb3VwaW5nXCIgKHRob3VzYW5kcykgc2VwYXJhdG9yLiB8XG4gKiB8IDAgfCBSZXBsYWNlZCBieSBhIGRpZ2l0IChvciB6ZXJvIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggZGlnaXRzKS4gfFxuICogfCAjIHwgUmVwbGFjZWQgYnkgYSBkaWdpdCAob3Igbm90aGluZyBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoKS4gfFxuICogfCDCpCB8IFJlcGxhY2VkIGJ5IGEgY3VycmVuY3kgc3ltYm9sLCBzdWNoIGFzICQgb3IgVVNELiB8XG4gKiB8ICUgfCBNYXJrcyBhIHBlcmNlbnQgZm9ybWF0LiBUaGUgJSBzeW1ib2wgbWF5IGNoYW5nZSBwb3NpdGlvbiwgYnV0IG11c3QgYmUgcmV0YWluZWQuIHxcbiAqIHwgRSB8IE1hcmtzIGEgc2NpZW50aWZpYyBmb3JtYXQuIFRoZSBFIHN5bWJvbCBtYXkgY2hhbmdlIHBvc2l0aW9uLCBidXQgbXVzdCBiZSByZXRhaW5lZC4gfFxuICogfCAnIHwgU3BlY2lhbCBjaGFyYWN0ZXJzIHVzZWQgYXMgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFyZSBxdW90ZWQgd2l0aCBBU0NJSSBzaW5nbGUgcXVvdGVzLiB8XG4gKlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBudW1lcmljIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCAoc3VjaCBhcyBgRGVjaW1hbGAgb3IgYEN1cnJlbmN5YC4pXG4gKiBAcmV0dXJucyBUaGUgbG9jYWxpemVkIGZvcm1hdCBzdHJpbmcuXG4gKiBAc2VlIGBOdW1iZXJGb3JtYXRTdHlsZWBcbiAqIEBzZWUgW0NMRFIgd2Vic2l0ZV0oaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vbnVtYmVyLXBhdHRlcm5zKVxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIHR5cGUpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgcmV0dXJuIGRhdGFbMTQgLyogTnVtYmVyRm9ybWF0cyAqL11bdHlwZV07XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc3ltYm9sIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW5jeSBmb3IgdGhlIG1haW4gY291bnRyeVxuICogY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGxvY2FsZS4gRm9yIGV4YW1wbGUsICckJyBmb3IgYGVuLVVTYC5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBsb2NhbGl6ZWQgc3ltYm9sIGNoYXJhY3RlcixcbiAqIG9yIGBudWxsYCBpZiB0aGUgbWFpbiBjb3VudHJ5IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZUN1cnJlbmN5U3ltYm9sKGxvY2FsZSkge1xuICAgIHZhciBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTtcbiAgICByZXR1cm4gZGF0YVsxNSAvKiBDdXJyZW5jeVN5bWJvbCAqL10gfHwgbnVsbDtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW5jeSBmb3IgdGhlIG1haW4gY291bnRyeSBjb3JyZXNwb25kaW5nXG4gKiB0byBhIGdpdmVuIGxvY2FsZS4gRm9yIGV4YW1wbGUsICdVUyBEb2xsYXInIGZvciBgZW4tVVNgLlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgY3VycmVuY3kgbmFtZSxcbiAqIG9yIGBudWxsYCBpZiB0aGUgbWFpbiBjb3VudHJ5IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZUN1cnJlbmN5TmFtZShsb2NhbGUpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgcmV0dXJuIGRhdGFbMTYgLyogQ3VycmVuY3lOYW1lICovXSB8fCBudWxsO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbmN5IHZhbHVlcyBmb3IgYSBnaXZlbiBsb2NhbGUuXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBjdXJyZW5jeSB2YWx1ZXMuXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICovXG5mdW5jdGlvbiBnZXRMb2NhbGVDdXJyZW5jaWVzKGxvY2FsZSkge1xuICAgIHZhciBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTtcbiAgICByZXR1cm4gZGF0YVsxNyAvKiBDdXJyZW5jaWVzICovXTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBwbHVyYWwgZnVuY3Rpb24gdXNlZCBieSBJQ1UgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHRoZSBwbHVyYWwgY2FzZSB0byB1c2VcbiAqIGZvciBhIGdpdmVuIGxvY2FsZS5cbiAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHBsdXJhbCBmdW5jdGlvbiBmb3IgdGhlIGxvY2FsZS5cbiAqIEBzZWUgYE5nUGx1cmFsYFxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZVBsdXJhbENhc2UobG9jYWxlKSB7XG4gICAgdmFyIGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpO1xuICAgIHJldHVybiBkYXRhWzE4IC8qIFBsdXJhbENhc2UgKi9dO1xufVxuZnVuY3Rpb24gY2hlY2tGdWxsRGF0YShkYXRhKSB7XG4gICAgaWYgKCFkYXRhWzE5IC8qIEV4dHJhRGF0YSAqL10pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBleHRyYSBsb2NhbGUgZGF0YSBmb3IgdGhlIGxvY2FsZSBcXFwiXCIgKyBkYXRhWzAgLyogTG9jYWxlSWQgKi9dICsgXCJcXFwiLiBVc2UgXFxcInJlZ2lzdGVyTG9jYWxlRGF0YVxcXCIgdG8gbG9hZCBuZXcgZGF0YS4gU2VlIHRoZSBcXFwiSTE4biBndWlkZVxcXCIgb24gYW5ndWxhci5pbyB0byBrbm93IG1vcmUuXCIpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0cmlldmVzIGxvY2FsZS1zcGVjaWZpYyBydWxlcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBkYXkgcGVyaW9kIHRvIHVzZVxuICogd2hlbiBtb3JlIHRoYW4gb25lIHBlcmlvZCBpcyBkZWZpbmVkIGZvciBhIGxvY2FsZS5cbiAqXG4gKiBUaGVyZSBpcyBhIHJ1bGUgZm9yIGVhY2ggZGVmaW5lZCBkYXkgcGVyaW9kLiBUaGVcbiAqIGZpcnN0IHJ1bGUgaXMgYXBwbGllZCB0byB0aGUgZmlyc3QgZGF5IHBlcmlvZCBhbmQgc28gb24uXG4gKiBGYWxsIGJhY2sgdG8gQU0vUE0gd2hlbiBubyBydWxlcyBhcmUgYXZhaWxhYmxlLlxuICpcbiAqIEEgcnVsZSBjYW4gc3BlY2lmeSBhIHBlcmlvZCBhcyB0aW1lIHJhbmdlLCBvciBhcyBhIHNpbmdsZSB0aW1lIHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHlvdSBoYXZlIGxvYWRlZCB0aGUgZnVsbCBsb2NhbGUgZGF0YS5cbiAqIFNlZSB0aGUgW1wiSTE4biBndWlkZVwiXShndWlkZS9pMThuI2kxOG4tcGlwZXMpLlxuICpcbiAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHJ1bGVzIGZvciB0aGUgbG9jYWxlLCBhIHNpbmdsZSB0aW1lIHZhbHVlIG9yIGFycmF5IG9mICpmcm9tLXRpbWUsIHRvLXRpbWUqLFxuICogb3IgbnVsbCBpZiBubyBwZXJpb2RzIGFyZSBhdmFpbGFibGUuXG4gKlxuICogQHNlZSBgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKClgXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcyhsb2NhbGUpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgY2hlY2tGdWxsRGF0YShkYXRhKTtcbiAgICB2YXIgcnVsZXMgPSBkYXRhWzE5IC8qIEV4dHJhRGF0YSAqL11bMiAvKiBFeHRyYURheVBlcmlvZHNSdWxlcyAqL10gfHwgW107XG4gICAgcmV0dXJuIHJ1bGVzLm1hcChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdFRpbWUocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtleHRyYWN0VGltZShydWxlWzBdKSwgZXh0cmFjdFRpbWUocnVsZVsxXSldO1xuICAgIH0pO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgbG9jYWxlLXNwZWNpZmljIGRheSBwZXJpb2RzLCB3aGljaCBpbmRpY2F0ZSByb3VnaGx5IGhvdyBhIGRheSBpcyBicm9rZW4gdXBcbiAqIGluIGRpZmZlcmVudCBsYW5ndWFnZXMuXG4gKiBGb3IgZXhhbXBsZSwgZm9yIGBlbi1VU2AsIHBlcmlvZHMgYXJlIG1vcm5pbmcsIG5vb24sIGFmdGVybm9vbiwgZXZlbmluZywgYW5kIG1pZG5pZ2h0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHlvdSBoYXZlIGxvYWRlZCB0aGUgZnVsbCBsb2NhbGUgZGF0YS5cbiAqIFNlZSB0aGUgW1wiSTE4biBndWlkZVwiXShndWlkZS9pMThuI2kxOG4tcGlwZXMpLlxuICpcbiAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICogQHBhcmFtIGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS5cbiAqIEBwYXJhbSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLlxuICogQHJldHVybnMgVGhlIHRyYW5zbGF0ZWQgZGF5LXBlcmlvZCBzdHJpbmdzLlxuICogQHNlZSBgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcygpYFxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGdldExvY2FsZUV4dHJhRGF5UGVyaW9kcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHtcbiAgICB2YXIgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7XG4gICAgY2hlY2tGdWxsRGF0YShkYXRhKTtcbiAgICB2YXIgZGF5UGVyaW9kc0RhdGEgPSBbXG4gICAgICAgIGRhdGFbMTkgLyogRXh0cmFEYXRhICovXVswIC8qIEV4dHJhRGF5UGVyaW9kRm9ybWF0cyAqL10sXG4gICAgICAgIGRhdGFbMTkgLyogRXh0cmFEYXRhICovXVsxIC8qIEV4dHJhRGF5UGVyaW9kU3RhbmRhbG9uZSAqL11cbiAgICBdO1xuICAgIHZhciBkYXlQZXJpb2RzID0gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlQZXJpb2RzRGF0YSwgZm9ybVN0eWxlKSB8fCBbXTtcbiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlQZXJpb2RzLCB3aWR0aCkgfHwgW107XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZmlyc3QgdmFsdWUgdGhhdCBpcyBkZWZpbmVkIGluIGFuIGFycmF5LCBnb2luZyBiYWNrd2FyZHMgZnJvbSBhbiBpbmRleCBwb3NpdGlvbi5cbiAqXG4gKiBUbyBhdm9pZCByZXBlYXRpbmcgdGhlIHNhbWUgZGF0YSAoYXMgd2hlbiB0aGUgXCJmb3JtYXRcIiBhbmQgXCJzdGFuZGFsb25lXCIgZm9ybXMgYXJlIHRoZSBzYW1lKVxuICogYWRkIHRoZSBmaXJzdCB2YWx1ZSB0byB0aGUgbG9jYWxlIGRhdGEgYXJyYXlzLCBhbmQgYWRkIG90aGVyIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIGRpZmZlcmVudC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBhcnJheSB0byByZXRyaWV2ZSBmcm9tLlxuICogQHBhcmFtIGluZGV4IEEgMC1iYXNlZCBpbmRleCBpbnRvIHRoZSBhcnJheSB0byBzdGFydCBmcm9tLlxuICogQHJldHVybnMgVGhlIHZhbHVlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZ2l2ZW4gaW5kZXggcG9zaXRpb24uXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRhLCBpbmRleCkge1xuICAgIGZvciAodmFyIGkgPSBpbmRleDsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgZGF0YSBBUEk6IGxvY2FsZSBkYXRhIHVuZGVmaW5lZCcpO1xufVxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgaG91cnMgYW5kIG1pbnV0ZXMgZnJvbSBhIHN0cmluZyBsaWtlIFwiMTU6NDVcIlxuICovXG5mdW5jdGlvbiBleHRyYWN0VGltZSh0aW1lKSB7XG4gICAgdmFyIF9hID0gX19yZWFkKHRpbWUuc3BsaXQoJzonKSwgMiksIGggPSBfYVswXSwgbSA9IF9hWzFdO1xuICAgIHJldHVybiB7IGhvdXJzOiAraCwgbWludXRlczogK20gfTtcbn1cbi8qKlxuICogRmluZHMgdGhlIGxvY2FsZSBkYXRhIGZvciBhIGdpdmVuIGxvY2FsZS5cbiAqXG4gKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgY29kZS5cbiAqIEByZXR1cm5zIFRoZSBsb2NhbGUgZGF0YS5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBmaW5kTG9jYWxlRGF0YShsb2NhbGUpIHtcbiAgICB2YXIgbm9ybWFsaXplZExvY2FsZSA9IGxvY2FsZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKTtcbiAgICB2YXIgbWF0Y2ggPSBMT0NBTEVfREFUQVtub3JtYWxpemVkTG9jYWxlXTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICAvLyBsZXQncyB0cnkgdG8gZmluZCBhIHBhcmVudCBsb2NhbGVcbiAgICB2YXIgcGFyZW50TG9jYWxlID0gbm9ybWFsaXplZExvY2FsZS5zcGxpdCgnLScpWzBdO1xuICAgIG1hdGNoID0gTE9DQUxFX0RBVEFbcGFyZW50TG9jYWxlXTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICBpZiAocGFyZW50TG9jYWxlID09PSAnZW4nKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGVFbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBsb2NhbGUgZGF0YSBmb3IgdGhlIGxvY2FsZSBcXFwiXCIgKyBsb2NhbGUgKyBcIlxcXCIuXCIpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbmN5IHN5bWJvbCBmb3IgYSBnaXZlbiBjdXJyZW5jeSBjb2RlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGRlZmF1bHQgYGVuLVVTYCBsb2NhbGUsIHRoZSBjb2RlIGBVU0RgIGNhblxuICogYmUgcmVwcmVzZW50ZWQgYnkgdGhlIG5hcnJvdyBzeW1ib2wgYCRgIG9yIHRoZSB3aWRlIHN5bWJvbCBgVVMkYC5cbiAqXG4gKiBAcGFyYW0gY29kZSBUaGUgY3VycmVuY3kgY29kZS5cbiAqIEBwYXJhbSBmb3JtYXQgVGhlIGZvcm1hdCwgYHdpZGVgIG9yIGBuYXJyb3dgLlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKlxuICogQHJldHVybnMgVGhlIHN5bWJvbCwgb3IgdGhlIGN1cnJlbmN5IGNvZGUgaWYgbm8gc3ltYm9sIGlzIGF2YWlsYWJsZS4wXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZ2V0Q3VycmVuY3lTeW1ib2woY29kZSwgZm9ybWF0LCBsb2NhbGUpIHtcbiAgICBpZiAobG9jYWxlID09PSB2b2lkIDApIHsgbG9jYWxlID0gJ2VuJzsgfVxuICAgIHZhciBjdXJyZW5jeSA9IGdldExvY2FsZUN1cnJlbmNpZXMobG9jYWxlKVtjb2RlXSB8fCBDVVJSRU5DSUVTX0VOW2NvZGVdIHx8IFtdO1xuICAgIHZhciBzeW1ib2xOYXJyb3cgPSBjdXJyZW5jeVsxIC8qIFN5bWJvbE5hcnJvdyAqL107XG4gICAgaWYgKGZvcm1hdCA9PT0gJ25hcnJvdycgJiYgdHlwZW9mIHN5bWJvbE5hcnJvdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHN5bWJvbE5hcnJvdztcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbmN5WzAgLyogU3ltYm9sICovXSB8fCBjb2RlO1xufVxuLy8gTW9zdCBjdXJyZW5jaWVzIGhhdmUgY2VudHMsIHRoYXQncyB3aHkgdGhlIGRlZmF1bHQgaXMgMlxudmFyIERFRkFVTFRfTkJfT0ZfQ1VSUkVOQ1lfRElHSVRTID0gMjtcbi8qKlxuICogUmVwb3J0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciBhIGdpdmVuIGN1cnJlbmN5LlxuICogVGhlIHZhbHVlIGRlcGVuZHMgdXBvbiB0aGUgcHJlc2VuY2Ugb2YgY2VudHMgaW4gdGhhdCBwYXJ0aWN1bGFyIGN1cnJlbmN5LlxuICpcbiAqIEBwYXJhbSBjb2RlIFRoZSBjdXJyZW5jeSBjb2RlLlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgdHlwaWNhbGx5IDAgb3IgMi5cbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXROdW1iZXJPZkN1cnJlbmN5RGlnaXRzKGNvZGUpIHtcbiAgICB2YXIgZGlnaXRzO1xuICAgIHZhciBjdXJyZW5jeSA9IENVUlJFTkNJRVNfRU5bY29kZV07XG4gICAgaWYgKGN1cnJlbmN5KSB7XG4gICAgICAgIGRpZ2l0cyA9IGN1cnJlbmN5WzIgLyogTmJPZkRpZ2l0cyAqL107XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZGlnaXRzID09PSAnbnVtYmVyJyA/IGRpZ2l0cyA6IERFRkFVTFRfTkJfT0ZfQ1VSUkVOQ1lfRElHSVRTO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgSVNPODYwMV9EQVRFX1JFR0VYID0gL14oXFxkezR9KS0/KFxcZFxcZCktPyhcXGRcXGQpKD86VChcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzpcXC4oXFxkKykpPyk/KT8oWnwoWystXSkoXFxkXFxkKTo/KFxcZFxcZCkpPyk/JC87XG4vLyAgICAxICAgICAgICAyICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUgICAgICAgICAgNiAgICAgICAgICA3ICAgICAgICAgIDggIDkgICAgIDEwICAgICAgMTFcbnZhciBOQU1FRF9GT1JNQVRTID0ge307XG52YXIgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXkd5TUx3V2RFYWJCaEhtc1N6Wk8nXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpHezEsNX18eXsxLDR9fE17MSw1fXxMezEsNX18d3sxLDJ9fFd7MX18ZHsxLDJ9fEV7MSw2fXxhezEsNX18YnsxLDV9fEJ7MSw1fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18U3sxLDN9fHp7MSw0fXxaezEsNX18T3sxLDR9KSkoW1xcc1xcU10qKS87XG52YXIgWm9uZVdpZHRoO1xuKGZ1bmN0aW9uIChab25lV2lkdGgpIHtcbiAgICBab25lV2lkdGhbWm9uZVdpZHRoW1wiU2hvcnRcIl0gPSAwXSA9IFwiU2hvcnRcIjtcbiAgICBab25lV2lkdGhbWm9uZVdpZHRoW1wiU2hvcnRHTVRcIl0gPSAxXSA9IFwiU2hvcnRHTVRcIjtcbiAgICBab25lV2lkdGhbWm9uZVdpZHRoW1wiTG9uZ1wiXSA9IDJdID0gXCJMb25nXCI7XG4gICAgWm9uZVdpZHRoW1pvbmVXaWR0aFtcIkV4dGVuZGVkXCJdID0gM10gPSBcIkV4dGVuZGVkXCI7XG59KShab25lV2lkdGggfHwgKFpvbmVXaWR0aCA9IHt9KSk7XG52YXIgRGF0ZVR5cGU7XG4oZnVuY3Rpb24gKERhdGVUeXBlKSB7XG4gICAgRGF0ZVR5cGVbRGF0ZVR5cGVbXCJGdWxsWWVhclwiXSA9IDBdID0gXCJGdWxsWWVhclwiO1xuICAgIERhdGVUeXBlW0RhdGVUeXBlW1wiTW9udGhcIl0gPSAxXSA9IFwiTW9udGhcIjtcbiAgICBEYXRlVHlwZVtEYXRlVHlwZVtcIkRhdGVcIl0gPSAyXSA9IFwiRGF0ZVwiO1xuICAgIERhdGVUeXBlW0RhdGVUeXBlW1wiSG91cnNcIl0gPSAzXSA9IFwiSG91cnNcIjtcbiAgICBEYXRlVHlwZVtEYXRlVHlwZVtcIk1pbnV0ZXNcIl0gPSA0XSA9IFwiTWludXRlc1wiO1xuICAgIERhdGVUeXBlW0RhdGVUeXBlW1wiU2Vjb25kc1wiXSA9IDVdID0gXCJTZWNvbmRzXCI7XG4gICAgRGF0ZVR5cGVbRGF0ZVR5cGVbXCJGcmFjdGlvbmFsU2Vjb25kc1wiXSA9IDZdID0gXCJGcmFjdGlvbmFsU2Vjb25kc1wiO1xuICAgIERhdGVUeXBlW0RhdGVUeXBlW1wiRGF5XCJdID0gN10gPSBcIkRheVwiO1xufSkoRGF0ZVR5cGUgfHwgKERhdGVUeXBlID0ge30pKTtcbnZhciBUcmFuc2xhdGlvblR5cGU7XG4oZnVuY3Rpb24gKFRyYW5zbGF0aW9uVHlwZSkge1xuICAgIFRyYW5zbGF0aW9uVHlwZVtUcmFuc2xhdGlvblR5cGVbXCJEYXlQZXJpb2RzXCJdID0gMF0gPSBcIkRheVBlcmlvZHNcIjtcbiAgICBUcmFuc2xhdGlvblR5cGVbVHJhbnNsYXRpb25UeXBlW1wiRGF5c1wiXSA9IDFdID0gXCJEYXlzXCI7XG4gICAgVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZVtcIk1vbnRoc1wiXSA9IDJdID0gXCJNb250aHNcIjtcbiAgICBUcmFuc2xhdGlvblR5cGVbVHJhbnNsYXRpb25UeXBlW1wiRXJhc1wiXSA9IDNdID0gXCJFcmFzXCI7XG59KShUcmFuc2xhdGlvblR5cGUgfHwgKFRyYW5zbGF0aW9uVHlwZSA9IHt9KSk7XG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEZvcm1hdHMgYSBkYXRlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBkYXRlIHRvIGZvcm1hdCwgYXMgYSBEYXRlLCBvciBhIG51bWJlciAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaClcbiAqIG9yIGFuIFtJU08gZGF0ZS10aW1lIHN0cmluZ10oaHR0cHM6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUpLlxuICogQHBhcmFtIGZvcm1hdCBUaGUgZGF0ZS10aW1lIGNvbXBvbmVudHMgdG8gaW5jbHVkZS4gU2VlIGBEYXRlUGlwZWAgZm9yIGRldGFpbHMuXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSB0aW1lem9uZSBUaGUgdGltZSB6b25lLiBBIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQgKHN1Y2ggYXMgYCcrMDQzMCdgKSxcbiAqIG9yIGEgc3RhbmRhcmQgVVRDL0dNVCBvciBjb250aW5lbnRhbCBVUyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLlxuICogSWYgbm90IHNwZWNpZmllZCwgdXNlcyBob3N0IHN5c3RlbSBzZXR0aW5ncy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nLlxuICpcbiAqIEBzZWUgYERhdGVQaXBlYFxuICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bilcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWUsIGZvcm1hdCwgbG9jYWxlLCB0aW1lem9uZSkge1xuICAgIHZhciBkYXRlID0gdG9EYXRlKHZhbHVlKTtcbiAgICB2YXIgbmFtZWRGb3JtYXQgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsIGZvcm1hdCk7XG4gICAgZm9ybWF0ID0gbmFtZWRGb3JtYXQgfHwgZm9ybWF0O1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIHZhciBtYXRjaDtcbiAgICB3aGlsZSAoZm9ybWF0KSB7XG4gICAgICAgIG1hdGNoID0gREFURV9GT1JNQVRTX1NQTElULmV4ZWMoZm9ybWF0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtYXQgPSBwYXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFydHMucHVzaChmb3JtYXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGRhdGVUaW1lem9uZU9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgICAgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgZGF0ZSA9IGNvbnZlcnRUaW1lem9uZVRvTG9jYWwoZGF0ZSwgdGltZXpvbmUsIHRydWUpO1xuICAgIH1cbiAgICB2YXIgdGV4dCA9ICcnO1xuICAgIHBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkYXRlRm9ybWF0dGVyID0gZ2V0RGF0ZUZvcm1hdHRlcih2YWx1ZSk7XG4gICAgICAgIHRleHQgKz0gZGF0ZUZvcm1hdHRlciA/XG4gICAgICAgICAgICBkYXRlRm9ybWF0dGVyKGRhdGUsIGxvY2FsZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KSA6XG4gICAgICAgICAgICB2YWx1ZSA9PT0gJ1xcJ1xcJycgPyAnXFwnJyA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcXCcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGV4dDtcbn1cbmZ1bmN0aW9uIGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgZm9ybWF0KSB7XG4gICAgdmFyIGxvY2FsZUlkID0gZ2V0TG9jYWxlSWQobG9jYWxlKTtcbiAgICBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXSA9IE5BTUVEX0ZPUk1BVFNbbG9jYWxlSWRdIHx8IHt9O1xuICAgIGlmIChOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdKSB7XG4gICAgICAgIHJldHVybiBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0VmFsdWUgPSAnJztcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICBjYXNlICdzaG9ydERhdGUnOlxuICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21lZGl1bURhdGUnOlxuICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb25nRGF0ZSc6XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmdWxsRGF0ZSc6XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzaG9ydFRpbWUnOlxuICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21lZGl1bVRpbWUnOlxuICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdsb25nVGltZSc6XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmdWxsVGltZSc6XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzaG9ydCc6XG4gICAgICAgICAgICB2YXIgc2hvcnRUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnc2hvcnRUaW1lJyk7XG4gICAgICAgICAgICB2YXIgc2hvcnREYXRlID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnc2hvcnREYXRlJyk7XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpLCBbc2hvcnRUaW1lLCBzaG9ydERhdGVdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICAgICAgdmFyIG1lZGl1bVRpbWUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdtZWRpdW1UaW1lJyk7XG4gICAgICAgICAgICB2YXIgbWVkaXVtRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ21lZGl1bURhdGUnKTtcbiAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5NZWRpdW0pLCBbbWVkaXVtVGltZSwgbWVkaXVtRGF0ZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xvbmcnOlxuICAgICAgICAgICAgdmFyIGxvbmdUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnbG9uZ1RpbWUnKTtcbiAgICAgICAgICAgIHZhciBsb25nRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2xvbmdEYXRlJyk7XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKSwgW2xvbmdUaW1lLCBsb25nRGF0ZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Z1bGwnOlxuICAgICAgICAgICAgdmFyIGZ1bGxUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnZnVsbFRpbWUnKTtcbiAgICAgICAgICAgIHZhciBmdWxsRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2Z1bGxEYXRlJyk7XG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKSwgW2Z1bGxUaW1lLCBmdWxsRGF0ZV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChmb3JtYXRWYWx1ZSkge1xuICAgICAgICBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdID0gZm9ybWF0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRWYWx1ZTtcbn1cbmZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKHN0ciwgb3B0X3ZhbHVlcykge1xuICAgIGlmIChvcHRfdmFsdWVzKSB7XG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXHsoW159XSspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIChvcHRfdmFsdWVzICE9IG51bGwgJiYga2V5IGluIG9wdF92YWx1ZXMpID8gb3B0X3ZhbHVlc1trZXldIDogbWF0Y2g7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gcGFkTnVtYmVyKG51bSwgZGlnaXRzLCBtaW51c1NpZ24sIHRyaW0sIG5lZ1dyYXApIHtcbiAgICBpZiAobWludXNTaWduID09PSB2b2lkIDApIHsgbWludXNTaWduID0gJy0nOyB9XG4gICAgdmFyIG5lZyA9ICcnO1xuICAgIGlmIChudW0gPCAwIHx8IChuZWdXcmFwICYmIG51bSA8PSAwKSkge1xuICAgICAgICBpZiAobmVnV3JhcCkge1xuICAgICAgICAgICAgbnVtID0gLW51bSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBudW0gPSAtbnVtO1xuICAgICAgICAgICAgbmVnID0gbWludXNTaWduO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzdHJOdW0gPSBTdHJpbmcobnVtKTtcbiAgICB3aGlsZSAoc3RyTnVtLmxlbmd0aCA8IGRpZ2l0cykge1xuICAgICAgICBzdHJOdW0gPSAnMCcgKyBzdHJOdW07XG4gICAgfVxuICAgIGlmICh0cmltKSB7XG4gICAgICAgIHN0ck51bSA9IHN0ck51bS5zdWJzdHIoc3RyTnVtLmxlbmd0aCAtIGRpZ2l0cyk7XG4gICAgfVxuICAgIHJldHVybiBuZWcgKyBzdHJOdW07XG59XG5mdW5jdGlvbiBmb3JtYXRGcmFjdGlvbmFsU2Vjb25kcyhtaWxsaXNlY29uZHMsIGRpZ2l0cykge1xuICAgIHZhciBzdHJNcyA9IHBhZE51bWJlcihtaWxsaXNlY29uZHMsIDMpO1xuICAgIHJldHVybiBzdHJNcy5zdWJzdHIoMCwgZGlnaXRzKTtcbn1cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIGRpZ2l0IHJlcHJlc2VudGF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRhdGVHZXR0ZXIobmFtZSwgc2l6ZSwgb2Zmc2V0LCB0cmltLCBuZWdXcmFwKSB7XG4gICAgaWYgKG9mZnNldCA9PT0gdm9pZCAwKSB7IG9mZnNldCA9IDA7IH1cbiAgICBpZiAodHJpbSA9PT0gdm9pZCAwKSB7IHRyaW0gPSBmYWxzZTsgfVxuICAgIGlmIChuZWdXcmFwID09PSB2b2lkIDApIHsgbmVnV3JhcCA9IGZhbHNlOyB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBnZXREYXRlUGFydChuYW1lLCBkYXRlKTtcbiAgICAgICAgaWYgKG9mZnNldCA+IDAgfHwgcGFydCA+IC1vZmZzZXQpIHtcbiAgICAgICAgICAgIHBhcnQgKz0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSBEYXRlVHlwZS5Ib3Vycykge1xuICAgICAgICAgICAgaWYgKHBhcnQgPT09IDAgJiYgb2Zmc2V0ID09PSAtMTIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRGcmFjdGlvbmFsU2Vjb25kcyhwYXJ0LCBzaXplKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbG9jYWxlTWludXMgPSBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKTtcbiAgICAgICAgcmV0dXJuIHBhZE51bWJlcihwYXJ0LCBzaXplLCBsb2NhbGVNaW51cywgdHJpbSwgbmVnV3JhcCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldERhdGVQYXJ0KHBhcnQsIGRhdGUpIHtcbiAgICBzd2l0Y2ggKHBhcnQpIHtcbiAgICAgICAgY2FzZSBEYXRlVHlwZS5GdWxsWWVhcjpcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNhc2UgRGF0ZVR5cGUuTW9udGg6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjYXNlIERhdGVUeXBlLkRhdGU6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgIGNhc2UgRGF0ZVR5cGUuSG91cnM6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICBjYXNlIERhdGVUeXBlLk1pbnV0ZXM6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIGNhc2UgRGF0ZVR5cGUuU2Vjb25kczpcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFNlY29uZHMoKTtcbiAgICAgICAgY2FzZSBEYXRlVHlwZS5GcmFjdGlvbmFsU2Vjb25kczpcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgICAgICBjYXNlIERhdGVUeXBlLkRheTpcbiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldERheSgpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBEYXRlVHlwZSB2YWx1ZSBcXFwiXCIgKyBwYXJ0ICsgXCJcXFwiLlwiKTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGZvcm1hdHRlciB0aGF0IHRyYW5zZm9ybXMgYSBkYXRlIGludG8gaXRzIGxvY2FsZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZnVuY3Rpb24gZGF0ZVN0ckdldHRlcihuYW1lLCB3aWR0aCwgZm9ybSwgZXh0ZW5kZWQpIHtcbiAgICBpZiAoZm9ybSA9PT0gdm9pZCAwKSB7IGZvcm0gPSBGb3JtU3R5bGUuRm9ybWF0OyB9XG4gICAgaWYgKGV4dGVuZGVkID09PSB2b2lkIDApIHsgZXh0ZW5kZWQgPSBmYWxzZTsgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBnZXREYXRlVHJhbnNsYXRpb24oZGF0ZSwgbG9jYWxlLCBuYW1lLCB3aWR0aCwgZm9ybSwgZXh0ZW5kZWQpO1xuICAgIH07XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsZSB0cmFuc2xhdGlvbiBvZiBhIGRhdGUgZm9yIGEgZ2l2ZW4gZm9ybSwgdHlwZSBhbmQgd2lkdGhcbiAqL1xuZnVuY3Rpb24gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLk1vbnRoczpcbiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVNb250aE5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0TW9udGgoKV07XG4gICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheXM6XG4gICAgICAgICAgICByZXR1cm4gZ2V0TG9jYWxlRGF5TmFtZXMobG9jYWxlLCBmb3JtLCB3aWR0aClbZGF0ZS5nZXREYXkoKV07XG4gICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHM6XG4gICAgICAgICAgICB2YXIgY3VycmVudEhvdXJzXzEgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgICAgICAgICB2YXIgY3VycmVudE1pbnV0ZXNfMSA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgaWYgKGV4dGVuZGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJ1bGVzID0gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcyhsb2NhbGUpO1xuICAgICAgICAgICAgICAgIHZhciBkYXlQZXJpb2RzXzEgPSBnZXRMb2NhbGVFeHRyYURheVBlcmlvZHMobG9jYWxlLCBmb3JtLCB3aWR0aCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdF8xO1xuICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2goZnVuY3Rpb24gKHJ1bGUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJ1bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JuaW5nLCBhZnRlcm5vb24sIGV2ZW5pbmcsIG5pZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2EgPSBydWxlWzBdLCBob3Vyc0Zyb20gPSBfYS5ob3VycywgbWludXRlc0Zyb20gPSBfYS5taW51dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9iID0gcnVsZVsxXSwgaG91cnNUbyA9IF9iLmhvdXJzLCBtaW51dGVzVG8gPSBfYi5taW51dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRIb3Vyc18xID49IGhvdXJzRnJvbSAmJiBjdXJyZW50TWludXRlc18xID49IG1pbnV0ZXNGcm9tICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRIb3Vyc18xIDwgaG91cnNUbyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudEhvdXJzXzEgPT09IGhvdXJzVG8gJiYgY3VycmVudE1pbnV0ZXNfMSA8IG1pbnV0ZXNUbykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEgPSBkYXlQZXJpb2RzXzFbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBub29uIG9yIG1pZG5pZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaG91cnMgPSBydWxlLmhvdXJzLCBtaW51dGVzID0gcnVsZS5taW51dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzID09PSBjdXJyZW50SG91cnNfMSAmJiBtaW51dGVzID09PSBjdXJyZW50TWludXRlc18xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEgPSBkYXlQZXJpb2RzXzFbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRfMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiBubyBydWxlcyBmb3IgdGhlIGRheSBwZXJpb2RzLCB3ZSB1c2UgYW0vcG0gYnkgZGVmYXVsdFxuICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsZURheVBlcmlvZHMobG9jYWxlLCBmb3JtLCB3aWR0aClbY3VycmVudEhvdXJzXzEgPCAxMiA/IDAgOiAxXTtcbiAgICAgICAgY2FzZSBUcmFuc2xhdGlvblR5cGUuRXJhczpcbiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVFcmFOYW1lcyhsb2NhbGUsIHdpZHRoKVtkYXRlLmdldEZ1bGxZZWFyKCkgPD0gMCA/IDAgOiAxXTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIFRoaXMgZGVmYXVsdCBjYXNlIGlzIG5vdCBuZWVkZWQgYnkgVHlwZVNjcmlwdCBjb21waWxlciwgYXMgdGhlIHN3aXRjaCBpcyBleGhhdXN0aXZlLlxuICAgICAgICAgICAgLy8gSG93ZXZlciBDbG9zdXJlIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCBhbmQgcmVwb3J0cyBhbiBlcnJvciBpbiB0eXBlZCBtb2RlLlxuICAgICAgICAgICAgLy8gVGhlIGB0aHJvdyBuZXcgRXJyb3JgIGJlbG93IHdvcmtzIGFyb3VuZCB0aGUgcHJvYmxlbSwgYW5kIHRoZSB1bmV4cGVjdGVkOiBuZXZlciB2YXJpYWJsZVxuICAgICAgICAgICAgLy8gbWFrZXMgc3VyZSB0c2Mgc3RpbGwgY2hlY2tzIHRoaXMgY29kZSBpcyB1bnJlYWNoYWJsZS5cbiAgICAgICAgICAgIHZhciB1bmV4cGVjdGVkID0gbmFtZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuZXhwZWN0ZWQgdHJhbnNsYXRpb24gdHlwZSBcIiArIHVuZXhwZWN0ZWQpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgYW5kIGFuIG9mZnNldCBpbnRvIGEgdGltZXpvbmUgd2l0aCBJU084NjAxIG9yXG4gKiBHTVQgZm9ybWF0IGRlcGVuZGluZyBvbiB0aGUgd2lkdGggKGVnOiBzaG9ydCA9ICswNDMwLCBzaG9ydDpHTVQgPSBHTVQrNCwgbG9uZyA9IEdNVCswNDozMCxcbiAqIGV4dGVuZGVkID0gKzA0OjMwKVxuICovXG5mdW5jdGlvbiB0aW1lWm9uZUdldHRlcih3aWR0aCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIHpvbmUgPSAtMSAqIG9mZnNldDtcbiAgICAgICAgdmFyIG1pbnVzU2lnbiA9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5NaW51c1NpZ24pO1xuICAgICAgICB2YXIgaG91cnMgPSB6b25lID4gMCA/IE1hdGguZmxvb3Ioem9uZSAvIDYwKSA6IE1hdGguY2VpbCh6b25lIC8gNjApO1xuICAgICAgICBzd2l0Y2ggKHdpZHRoKSB7XG4gICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5TaG9ydDpcbiAgICAgICAgICAgICAgICByZXR1cm4gKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAyLCBtaW51c1NpZ24pICtcbiAgICAgICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIsIG1pbnVzU2lnbik7XG4gICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5TaG9ydEdNVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0dNVCcgKyAoKHpvbmUgPj0gMCkgPyAnKycgOiAnJykgKyBwYWROdW1iZXIoaG91cnMsIDEsIG1pbnVzU2lnbik7XG4gICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5Mb25nOlxuICAgICAgICAgICAgICAgIHJldHVybiAnR01UJyArICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArICc6JyArXG4gICAgICAgICAgICAgICAgICAgIHBhZE51bWJlcihNYXRoLmFicyh6b25lICUgNjApLCAyLCBtaW51c1NpZ24pO1xuICAgICAgICAgICAgY2FzZSBab25lV2lkdGguRXh0ZW5kZWQ6XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1onO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArICc6JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gem9uZSB3aWR0aCBcXFwiXCIgKyB3aWR0aCArIFwiXFxcIlwiKTtcbiAgICAgICAgfVxuICAgIH07XG59XG52YXIgSkFOVUFSWSA9IDA7XG52YXIgVEhVUlNEQVkgPSA0O1xuZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7XG4gICAgdmFyIGZpcnN0RGF5T2ZZZWFyID0gKG5ldyBEYXRlKHllYXIsIEpBTlVBUlksIDEpKS5nZXREYXkoKTtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgMSArICgoZmlyc3REYXlPZlllYXIgPD0gVEhVUlNEQVkpID8gVEhVUlNEQVkgOiBUSFVSU0RBWSArIDcpIC0gZmlyc3REYXlPZlllYXIpO1xufVxuZnVuY3Rpb24gZ2V0VGh1cnNkYXlUaGlzV2VlayhkYXRldGltZSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRldGltZS5nZXRGdWxsWWVhcigpLCBkYXRldGltZS5nZXRNb250aCgpLCBkYXRldGltZS5nZXREYXRlKCkgKyAoVEhVUlNEQVkgLSBkYXRldGltZS5nZXREYXkoKSkpO1xufVxuZnVuY3Rpb24gd2Vla0dldHRlcihzaXplLCBtb250aEJhc2VkKSB7XG4gICAgaWYgKG1vbnRoQmFzZWQgPT09IHZvaWQgMCkgeyBtb250aEJhc2VkID0gZmFsc2U7IH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICBpZiAobW9udGhCYXNlZCkge1xuICAgICAgICAgICAgdmFyIG5iRGF5c0JlZm9yZTFzdERheU9mTW9udGggPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSkuZ2V0RGF5KCkgLSAxO1xuICAgICAgICAgICAgdmFyIHRvZGF5ID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgICAgICAgICByZXN1bHQgPSAxICsgTWF0aC5mbG9vcigodG9kYXkgKyBuYkRheXNCZWZvcmUxc3REYXlPZk1vbnRoKSAvIDcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGZpcnN0VGh1cnMgPSBnZXRGaXJzdFRodXJzZGF5T2ZZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgICAgICAgICB2YXIgdGhpc1RodXJzID0gZ2V0VGh1cnNkYXlUaGlzV2VlayhkYXRlKTtcbiAgICAgICAgICAgIHZhciBkaWZmID0gdGhpc1RodXJzLmdldFRpbWUoKSAtIGZpcnN0VGh1cnMuZ2V0VGltZSgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGgucm91bmQoZGlmZiAvIDYuMDQ4ZTgpOyAvLyA2LjA0OGU4IG1zIHBlciB3ZWVrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZE51bWJlcihyZXN1bHQsIHNpemUsIGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5NaW51c1NpZ24pKTtcbiAgICB9O1xufVxudmFyIERBVEVfRk9STUFUUyA9IHt9O1xuLy8gQmFzZWQgb24gQ0xEUiBmb3JtYXRzOlxuLy8gU2VlIGNvbXBsZXRlIGxpc3Q6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuLy8gU2VlIGFsc28gZXhwbGFuYXRpb25zOiBodHRwOi8vY2xkci51bmljb2RlLm9yZy90cmFuc2xhdGlvbi9kYXRlLXRpbWVcbi8vIFRPRE8ob2NvbWJlKTogc3VwcG9ydCBhbGwgbWlzc2luZyBjbGRyIGZvcm1hdHM6IFksIFUsIFEsIEQsIEYsIGUsIGMsIGosIEosIEMsIEEsIHYsIFYsIFgsIHhcbmZ1bmN0aW9uIGdldERhdGVGb3JtYXR0ZXIoZm9ybWF0KSB7XG4gICAgaWYgKERBVEVfRk9STUFUU1tmb3JtYXRdKSB7XG4gICAgICAgIHJldHVybiBEQVRFX0ZPUk1BVFNbZm9ybWF0XTtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlcjtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgICAvLyBFcmEgbmFtZSAoQUQvQkMpXG4gICAgICAgIGNhc2UgJ0cnOlxuICAgICAgICBjYXNlICdHRyc6XG4gICAgICAgIGNhc2UgJ0dHRyc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5FcmFzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdHR0dHJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkVyYXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnR0dHR0cnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRXJhcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIDEgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIsIGUuZy4gKEFEIDEgPT4gMSwgQUQgMTk5ID0+IDE5OSlcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAxLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gMiBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApXG4gICAgICAgIGNhc2UgJ3l5JzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDIsIDAsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIDMgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIsIHBhZGRlZCAoMDAwLTk5OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApXG4gICAgICAgIGNhc2UgJ3l5eSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAzLCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gNCBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciAoZS5nLiBBRCAxID0+IDAwMDEsIEFEIDIwMTAgPT4gMjAxMClcbiAgICAgICAgY2FzZSAneXl5eSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCA0LCAwLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKDEtMTIpLCBudW1lcmljXG4gICAgICAgIGNhc2UgJ00nOlxuICAgICAgICBjYXNlICdMJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTW9udGgsIDEsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01NJzpcbiAgICAgICAgY2FzZSAnTEwnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Nb250aCwgMiwgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgZm9ybWF0XG4gICAgICAgIGNhc2UgJ01NTSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01NTU0nOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLldpZGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01NTU1NJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIE1vbnRoIG9mIHRoZSB5ZWFyIChKYW51YXJ5LCAuLi4pLCBzdHJpbmcsIHN0YW5kYWxvbmVcbiAgICAgICAgY2FzZSAnTExMJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9XG4gICAgICAgICAgICAgICAgZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTExMTCc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPVxuICAgICAgICAgICAgICAgIGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTExMTEwnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID1cbiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gV2VlayBvZiB0aGUgeWVhciAoMSwgLi4uIDUyKVxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IHdlZWtHZXR0ZXIoMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnd3cnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gd2Vla0dldHRlcigyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBXZWVrIG9mIHRoZSBtb250aCAoMSwgLi4uKVxuICAgICAgICBjYXNlICdXJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IHdlZWtHZXR0ZXIoMSwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRGF5IG9mIHRoZSBtb250aCAoMS0zMSlcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkRhdGUsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRGF0ZSwgMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRGF5IG9mIHRoZSBXZWVrXG4gICAgICAgIGNhc2UgJ0UnOlxuICAgICAgICBjYXNlICdFRSc6XG4gICAgICAgIGNhc2UgJ0VFRSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdFRUVFJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnRUVFRUUnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5cywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0VFRUVFRSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLlNob3J0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBHZW5lcmljIHBlcmlvZCBvZiB0aGUgZGF5IChhbS1wbSlcbiAgICAgICAgY2FzZSAnYSc6XG4gICAgICAgIGNhc2UgJ2FhJzpcbiAgICAgICAgY2FzZSAnYWFhJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FhYWEnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhYWFhYSc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRXh0ZW5kZWQgcGVyaW9kIG9mIHRoZSBkYXkgKG1pZG5pZ2h0LCBhdCBuaWdodCwgLi4uKSwgc3RhbmRhbG9uZVxuICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgY2FzZSAnYmInOlxuICAgICAgICBjYXNlICdiYmInOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZCwgRm9ybVN0eWxlLlN0YW5kYWxvbmUsIHRydWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JiYmInOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmJiYmInOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3csIEZvcm1TdHlsZS5TdGFuZGFsb25lLCB0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBFeHRlbmRlZCBwZXJpb2Qgb2YgdGhlIGRheSAobWlkbmlnaHQsIG5pZ2h0LCAuLi4pLCBzdGFuZGFsb25lXG4gICAgICAgIGNhc2UgJ0InOlxuICAgICAgICBjYXNlICdCQic6XG4gICAgICAgIGNhc2UgJ0JCQic6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCQkJCJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9XG4gICAgICAgICAgICAgICAgZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdCQkJCQic6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdywgRm9ybVN0eWxlLkZvcm1hdCwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gSG91ciBpbiBBTS9QTSwgKDEtMTIpXG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMSwgLTEyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdoaCc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAyLCAtMTIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEhvdXIgb2YgdGhlIGRheSAoMC0yMylcbiAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBIb3VyIGluIGRheSwgcGFkZGVkICgwMC0yMylcbiAgICAgICAgY2FzZSAnSEgnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gTWludXRlIG9mIHRoZSBob3VyICgwLTU5KVxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTWludXRlcywgMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5NaW51dGVzLCAyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBTZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSlcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLlNlY29uZHMsIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NzJzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuU2Vjb25kcywgMik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzZWNvbmRcbiAgICAgICAgY2FzZSAnUyc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTUyc6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTU1MnOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5GcmFjdGlvbmFsU2Vjb25kcywgMyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGltZXpvbmUgSVNPODYwMSBzaG9ydCBmb3JtYXQgKC0wNDMwKVxuICAgICAgICBjYXNlICdaJzpcbiAgICAgICAgY2FzZSAnWlonOlxuICAgICAgICBjYXNlICdaWlonOlxuICAgICAgICAgICAgZm9ybWF0dGVyID0gdGltZVpvbmVHZXR0ZXIoWm9uZVdpZHRoLlNob3J0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBUaW1lem9uZSBJU084NjAxIGV4dGVuZGVkIGZvcm1hdCAoLTA0OjMwKVxuICAgICAgICBjYXNlICdaWlpaWic6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguRXh0ZW5kZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFRpbWV6b25lIEdNVCBzaG9ydCBmb3JtYXQgKEdNVCs0KVxuICAgICAgICBjYXNlICdPJzpcbiAgICAgICAgY2FzZSAnT08nOlxuICAgICAgICBjYXNlICdPT08nOlxuICAgICAgICAvLyBTaG91bGQgYmUgbG9jYXRpb24sIGJ1dCBmYWxsYmFjayB0byBmb3JtYXQgTyBpbnN0ZWFkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZGF0YSB5ZXRcbiAgICAgICAgY2FzZSAneic6XG4gICAgICAgIGNhc2UgJ3p6JzpcbiAgICAgICAgY2FzZSAnenp6JzpcbiAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5TaG9ydEdNVCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gVGltZXpvbmUgR01UIGxvbmcgZm9ybWF0IChHTVQrMDQzMClcbiAgICAgICAgY2FzZSAnT09PTyc6XG4gICAgICAgIGNhc2UgJ1paWlonOlxuICAgICAgICAvLyBTaG91bGQgYmUgbG9jYXRpb24sIGJ1dCBmYWxsYmFjayB0byBmb3JtYXQgTyBpbnN0ZWFkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZGF0YSB5ZXRcbiAgICAgICAgY2FzZSAnenp6eic6XG4gICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguTG9uZyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBEQVRFX0ZPUk1BVFNbZm9ybWF0XSA9IGZvcm1hdHRlcjtcbiAgICByZXR1cm4gZm9ybWF0dGVyO1xufVxuZnVuY3Rpb24gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZmFsbGJhY2spIHtcbiAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHksIEVkZ2UgMTMtMTUrXG4gICAgLy8gSUUvRWRnZSBkbyBub3QgXCJ1bmRlcnN0YW5kXCIgY29sb24gKGA6YCkgaW4gdGltZXpvbmVcbiAgICB0aW1lem9uZSA9IHRpbWV6b25lLnJlcGxhY2UoLzovZywgJycpO1xuICAgIHZhciByZXF1ZXN0ZWRUaW1lem9uZU9mZnNldCA9IERhdGUucGFyc2UoJ0phbiAwMSwgMTk3MCAwMDowMDowMCAnICsgdGltZXpvbmUpIC8gNjAwMDA7XG4gICAgcmV0dXJuIGlzTmFOKHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0KSA/IGZhbGxiYWNrIDogcmVxdWVzdGVkVGltZXpvbmVPZmZzZXQ7XG59XG5mdW5jdGlvbiBhZGREYXRlTWludXRlcyhkYXRlLCBtaW51dGVzKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTtcbiAgICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBtaW51dGVzKTtcbiAgICByZXR1cm4gZGF0ZTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRUaW1lem9uZVRvTG9jYWwoZGF0ZSwgdGltZXpvbmUsIHJldmVyc2UpIHtcbiAgICB2YXIgcmV2ZXJzZVZhbHVlID0gcmV2ZXJzZSA/IC0xIDogMTtcbiAgICB2YXIgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgIHZhciB0aW1lem9uZU9mZnNldCA9IHRpbWV6b25lVG9PZmZzZXQodGltZXpvbmUsIGRhdGVUaW1lem9uZU9mZnNldCk7XG4gICAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2VWYWx1ZSAqICh0aW1lem9uZU9mZnNldCAtIGRhdGVUaW1lem9uZU9mZnNldCkpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGRhdGUuXG4gKlxuICogU3VwcG9ydGVkIGlucHV0IGZvcm1hdHM6XG4gKiAtIGBEYXRlYFxuICogLSBudW1iZXI6IHRpbWVzdGFtcFxuICogLSBzdHJpbmc6IG51bWVyaWMgKGUuZy4gXCIxMjM0XCIpLCBJU08gYW5kIGRhdGUgc3RyaW5ncyBpbiBhIGZvcm1hdCBzdXBwb3J0ZWQgYnlcbiAqICAgW0RhdGUucGFyc2UoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS9wYXJzZSkuXG4gKiAgIE5vdGU6IElTTyBzdHJpbmdzIHdpdGhvdXQgdGltZSByZXR1cm4gYSBkYXRlIHdpdGhvdXQgdGltZW9mZnNldC5cbiAqXG4gKiBUaHJvd3MgaWYgdW5hYmxlIHRvIGNvbnZlcnQgdG8gYSBkYXRlLlxuICovXG5mdW5jdGlvbiB0b0RhdGUodmFsdWUpIHtcbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgIHZhciBwYXJzZWROYiA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAvLyBhbnkgc3RyaW5nIHRoYXQgb25seSBjb250YWlucyBudW1iZXJzLCBsaWtlIFwiMTIzNFwiIGJ1dCBub3QgbGlrZSBcIjEyMzRoZWxsb1wiXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUgLSBwYXJzZWROYikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWROYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9eKFxcZHs0fS1cXGR7MSwyfS1cXGR7MSwyfSkkLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgLyogRm9yIElTTyBTdHJpbmdzIHdpdGhvdXQgdGltZSB0aGUgZGF5LCBtb250aCBhbmQgeWVhciBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBJU08gU3RyaW5nXG4gICAgICAgICAgICBiZWZvcmUgRGF0ZSBjcmVhdGlvbiB0byBhdm9pZCB0aW1lIG9mZnNldCBhbmQgZXJyb3JzIGluIHRoZSBuZXcgRGF0ZS5cbiAgICAgICAgICAgIElmIHdlIG9ubHkgcmVwbGFjZSAnLScgd2l0aCAnLCcgaW4gdGhlIElTTyBTdHJpbmcgKFwiMjAxNSwwMSwwMVwiKSwgYW5kIHRyeSB0byBjcmVhdGUgYSBuZXdcbiAgICAgICAgICAgIGRhdGUsIHNvbWUgYnJvd3NlcnMgKGUuZy4gSUUgOSkgd2lsbCB0aHJvdyBhbiBpbnZhbGlkIERhdGUgZXJyb3IuXG4gICAgICAgICAgICBJZiB3ZSBsZWF2ZSB0aGUgJy0nIChcIjIwMTUtMDEtMDFcIikgYW5kIHRyeSB0byBjcmVhdGUgYSBuZXcgRGF0ZShcIjIwMTUtMDEtMDFcIikgdGhlIHRpbWVvZmZzZXRcbiAgICAgICAgICAgIGlzIGFwcGxpZWQuXG4gICAgICAgICAgICBOb3RlOiBJU08gbW9udGhzIGFyZSAwIGZvciBKYW51YXJ5LCAxIGZvciBGZWJydWFyeSwgLi4uICovXG4gICAgICAgICAgICB2YXIgX2EgPSBfX3JlYWQodmFsdWUuc3BsaXQoJy0nKS5tYXAoZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gK3ZhbDsgfSksIDMpLCB5ID0gX2FbMF0sIG0gPSBfYVsxXSwgZCA9IF9hWzJdO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWF0Y2ggPSB2b2lkIDA7XG4gICAgICAgIGlmIChtYXRjaCA9IHZhbHVlLm1hdGNoKElTTzg2MDFfREFURV9SRUdFWCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc29TdHJpbmdUb0RhdGUobWF0Y2gpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIGlmICghaXNEYXRlKGRhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBjb252ZXJ0IFxcXCJcIiArIHZhbHVlICsgXCJcXFwiIGludG8gYSBkYXRlXCIpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cbi8qKlxuICogQ29udmVydHMgYSBkYXRlIGluIElTTzg2MDEgdG8gYSBEYXRlLlxuICogVXNlZCBpbnN0ZWFkIG9mIGBEYXRlLnBhcnNlYCBiZWNhdXNlIG9mIGJyb3dzZXIgZGlzY3JlcGFuY2llcy5cbiAqL1xuZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgwKTtcbiAgICB2YXIgdHpIb3VyID0gMDtcbiAgICB2YXIgdHpNaW4gPSAwO1xuICAgIC8vIG1hdGNoWzhdIG1lYW5zIHRoYXQgdGhlIHN0cmluZyBjb250YWlucyBcIlpcIiAoVVRDKSBvciBhIHRpbWV6b25lIGxpa2UgXCIrMDE6MDBcIiBvciBcIiswMTAwXCJcbiAgICB2YXIgZGF0ZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENGdWxsWWVhciA6IGRhdGUuc2V0RnVsbFllYXI7XG4gICAgdmFyIHRpbWVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDSG91cnMgOiBkYXRlLnNldEhvdXJzO1xuICAgIC8vIGlmIHRoZXJlIGlzIGEgdGltZXpvbmUgZGVmaW5lZCBsaWtlIFwiKzAxOjAwXCIgb3IgXCIrMDEwMFwiXG4gICAgaWYgKG1hdGNoWzldKSB7XG4gICAgICAgIHR6SG91ciA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzEwXSk7XG4gICAgICAgIHR6TWluID0gTnVtYmVyKG1hdGNoWzldICsgbWF0Y2hbMTFdKTtcbiAgICB9XG4gICAgZGF0ZVNldHRlci5jYWxsKGRhdGUsIE51bWJlcihtYXRjaFsxXSksIE51bWJlcihtYXRjaFsyXSkgLSAxLCBOdW1iZXIobWF0Y2hbM10pKTtcbiAgICB2YXIgaCA9IE51bWJlcihtYXRjaFs0XSB8fCAwKSAtIHR6SG91cjtcbiAgICB2YXIgbSA9IE51bWJlcihtYXRjaFs1XSB8fCAwKSAtIHR6TWluO1xuICAgIHZhciBzID0gTnVtYmVyKG1hdGNoWzZdIHx8IDApO1xuICAgIHZhciBtcyA9IE1hdGgucm91bmQocGFyc2VGbG9hdCgnMC4nICsgKG1hdGNoWzddIHx8IDApKSAqIDEwMDApO1xuICAgIHRpbWVTZXR0ZXIuY2FsbChkYXRlLCBoLCBtLCBzLCBtcyk7XG4gICAgcmV0dXJuIGRhdGU7XG59XG5mdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZS52YWx1ZU9mKCkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgTlVNQkVSX0ZPUk1BVF9SRUdFWFAgPSAvXihcXGQrKT9cXC4oKFxcZCspKC0oXFxkKykpPyk/JC87XG52YXIgTUFYX0RJR0lUUyA9IDIyO1xudmFyIERFQ0lNQUxfU0VQID0gJy4nO1xudmFyIFpFUk9fQ0hBUiA9ICcwJztcbnZhciBQQVRURVJOX1NFUCA9ICc7JztcbnZhciBHUk9VUF9TRVAgPSAnLCc7XG52YXIgRElHSVRfQ0hBUiA9ICcjJztcbnZhciBDVVJSRU5DWV9DSEFSID0gJ8KkJztcbnZhciBQRVJDRU5UX0NIQVIgPSAnJSc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgdG8gYSBsb2NhbGUgc3RyaW5nIGJhc2VkIG9uIGEgc3R5bGUgYW5kIGEgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBmb3JtYXROdW1iZXJUb0xvY2FsZVN0cmluZyh2YWx1ZSwgcGF0dGVybiwgbG9jYWxlLCBncm91cFN5bWJvbCwgZGVjaW1hbFN5bWJvbCwgZGlnaXRzSW5mbywgaXNQZXJjZW50KSB7XG4gICAgaWYgKGlzUGVyY2VudCA9PT0gdm9pZCAwKSB7IGlzUGVyY2VudCA9IGZhbHNlOyB9XG4gICAgdmFyIGZvcm1hdHRlZFRleHQgPSAnJztcbiAgICB2YXIgaXNaZXJvID0gZmFsc2U7XG4gICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgZm9ybWF0dGVkVGV4dCA9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5JbmZpbml0eSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcGFyc2VkTnVtYmVyID0gcGFyc2VOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAoaXNQZXJjZW50KSB7XG4gICAgICAgICAgICBwYXJzZWROdW1iZXIgPSB0b1BlcmNlbnQocGFyc2VkTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWluSW50ID0gcGF0dGVybi5taW5JbnQ7XG4gICAgICAgIHZhciBtaW5GcmFjdGlvbiA9IHBhdHRlcm4ubWluRnJhYztcbiAgICAgICAgdmFyIG1heEZyYWN0aW9uID0gcGF0dGVybi5tYXhGcmFjO1xuICAgICAgICBpZiAoZGlnaXRzSW5mbykge1xuICAgICAgICAgICAgdmFyIHBhcnRzID0gZGlnaXRzSW5mby5tYXRjaChOVU1CRVJfRk9STUFUX1JFR0VYUCk7XG4gICAgICAgICAgICBpZiAocGFydHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGlnaXRzSW5mbyArIFwiIGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluZm9cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbWluSW50UGFydCA9IHBhcnRzWzFdO1xuICAgICAgICAgICAgdmFyIG1pbkZyYWN0aW9uUGFydCA9IHBhcnRzWzNdO1xuICAgICAgICAgICAgdmFyIG1heEZyYWN0aW9uUGFydCA9IHBhcnRzWzVdO1xuICAgICAgICAgICAgaWYgKG1pbkludFBhcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1pbkludCA9IHBhcnNlSW50QXV0b1JhZGl4KG1pbkludFBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1pbkZyYWN0aW9uUGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb24gPSBwYXJzZUludEF1dG9SYWRpeChtaW5GcmFjdGlvblBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1heEZyYWN0aW9uUGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbWF4RnJhY3Rpb24gPSBwYXJzZUludEF1dG9SYWRpeChtYXhGcmFjdGlvblBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWluRnJhY3Rpb25QYXJ0ICE9IG51bGwgJiYgbWluRnJhY3Rpb24gPiBtYXhGcmFjdGlvbikge1xuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uID0gbWluRnJhY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm91bmROdW1iZXIocGFyc2VkTnVtYmVyLCBtaW5GcmFjdGlvbiwgbWF4RnJhY3Rpb24pO1xuICAgICAgICB2YXIgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0cztcbiAgICAgICAgdmFyIGludGVnZXJMZW4gPSBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjtcbiAgICAgICAgdmFyIGV4cG9uZW50ID0gcGFyc2VkTnVtYmVyLmV4cG9uZW50O1xuICAgICAgICB2YXIgZGVjaW1hbHMgPSBbXTtcbiAgICAgICAgaXNaZXJvID0gZGlnaXRzLmV2ZXJ5KGZ1bmN0aW9uIChkKSB7IHJldHVybiAhZDsgfSk7XG4gICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVyc1xuICAgICAgICBmb3IgKDsgaW50ZWdlckxlbiA8IG1pbkludDsgaW50ZWdlckxlbisrKSB7XG4gICAgICAgICAgICBkaWdpdHMudW5zaGlmdCgwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwYWQgemVyb3MgZm9yIHNtYWxsIG51bWJlcnNcbiAgICAgICAgZm9yICg7IGludGVnZXJMZW4gPCAwOyBpbnRlZ2VyTGVuKyspIHtcbiAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGV4dHJhY3QgZGVjaW1hbHMgZGlnaXRzXG4gICAgICAgIGlmIChpbnRlZ2VyTGVuID4gMCkge1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBkaWdpdHMuc3BsaWNlKGludGVnZXJMZW4sIGRpZ2l0cy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBkaWdpdHM7XG4gICAgICAgICAgICBkaWdpdHMgPSBbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9ybWF0IHRoZSBpbnRlZ2VyIGRpZ2l0cyB3aXRoIGdyb3VwaW5nIHNlcGFyYXRvcnNcbiAgICAgICAgdmFyIGdyb3VwcyA9IFtdO1xuICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+PSBwYXR0ZXJuLmxnU2l6ZSkge1xuICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5sZ1NpemUsIGRpZ2l0cy5sZW5ndGgpLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IHBhdHRlcm4uZ1NpemUpIHtcbiAgICAgICAgICAgIGdyb3Vwcy51bnNoaWZ0KGRpZ2l0cy5zcGxpY2UoLXBhdHRlcm4uZ1NpemUsIGRpZ2l0cy5sZW5ndGgpLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLmpvaW4oJycpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ3JvdXBzLmpvaW4oZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgZ3JvdXBTeW1ib2wpKTtcbiAgICAgICAgLy8gYXBwZW5kIHRoZSBkZWNpbWFsIGRpZ2l0c1xuICAgICAgICBpZiAoZGVjaW1hbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIGRlY2ltYWxTeW1ib2wpICsgZGVjaW1hbHMuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9uZW50KSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5FeHBvbmVudGlhbCkgKyAnKycgKyBleHBvbmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWUgPCAwICYmICFpc1plcm8pIHtcbiAgICAgICAgZm9ybWF0dGVkVGV4dCA9IHBhdHRlcm4ubmVnUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ubmVnU3VmO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9ybWF0dGVkVGV4dCA9IHBhdHRlcm4ucG9zUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ucG9zU3VmO1xuICAgIH1cbiAgICByZXR1cm4gZm9ybWF0dGVkVGV4dDtcbn1cbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyBjdXJyZW5jeSB1c2luZyBsb2NhbGUgcnVsZXMuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gZm9ybWF0LlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKiBAcGFyYW0gY3VycmVuY3kgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVuY3kgc3ltYm9sIG9yIGl0cyBuYW1lLFxuICogc3VjaCBhcyBcIiRcIiBvciBcIkNhbmFkaWFuIERvbGxhclwiLiBVc2VkIGluIG91dHB1dCBzdHJpbmcsIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIG9wZXJhdGlvblxuICogb2YgdGhlIGZ1bmN0aW9uLlxuICogQHBhcmFtIGN1cnJlbmN5Q29kZSBUaGUgW0lTTyA0MjE3XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNDIxNylcbiAqIGN1cnJlbmN5IGNvZGUgdG8gdXNlIGluIHRoZSByZXN1bHQgc3RyaW5nLCBzdWNoIGFzIGBVU0RgIGZvciB0aGUgVVMgZG9sbGFyIGFuZCBgRVVSYCBmb3IgdGhlIGV1cm8uXG4gKiBAcGFyYW0gZGlnaXRJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHttaW5JbnRlZ2VyRGlnaXRzfS57bWluRnJhY3Rpb25EaWdpdHN9LXttYXhGcmFjdGlvbkRpZ2l0c31gLiBTZWUgYERlY2ltYWxQaXBlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgY3VycmVuY3kgdmFsdWUuXG4gKlxuICogQHNlZSBgZm9ybWF0TnVtYmVyKClgXG4gKiBAc2VlIGBEZWNpbWFsUGlwZWBcbiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSwgbG9jYWxlLCBjdXJyZW5jeSwgY3VycmVuY3lDb2RlLCBkaWdpdHNJbmZvKSB7XG4gICAgdmFyIGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5KTtcbiAgICB2YXIgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpO1xuICAgIHBhdHRlcm4ubWluRnJhYyA9IGdldE51bWJlck9mQ3VycmVuY3lEaWdpdHMoY3VycmVuY3lDb2RlKTtcbiAgICBwYXR0ZXJuLm1heEZyYWMgPSBwYXR0ZXJuLm1pbkZyYWM7XG4gICAgdmFyIHJlcyA9IGZvcm1hdE51bWJlclRvTG9jYWxlU3RyaW5nKHZhbHVlLCBwYXR0ZXJuLCBsb2NhbGUsIE51bWJlclN5bWJvbC5DdXJyZW5jeUdyb3VwLCBOdW1iZXJTeW1ib2wuQ3VycmVuY3lEZWNpbWFsLCBkaWdpdHNJbmZvKTtcbiAgICByZXR1cm4gcmVzXG4gICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsIGN1cnJlbmN5KVxuICAgICAgICAvLyBpZiB3ZSBoYXZlIDIgdGltZSB0aGUgY3VycmVuY3kgY2hhcmFjdGVyLCB0aGUgc2Vjb25kIG9uZSBpcyBpZ25vcmVkXG4gICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsICcnKTtcbn1cbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyBhIHBlcmNlbnRhZ2UgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuXG4gKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAqIEBwYXJhbSBkaWdpdEluZm8gRGVjaW1hbCByZXByZXNlbnRhdGlvbiBvcHRpb25zLCBzcGVjaWZpZWQgYnkgYSBzdHJpbmcgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBge21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfWAuIFNlZSBgRGVjaW1hbFBpcGVgIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBwZXJjZW50YWdlIHZhbHVlLlxuICpcbiAqIEBzZWUgYGZvcm1hdE51bWJlcigpYFxuICogQHNlZSBgRGVjaW1hbFBpcGVgXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICogQHB1YmxpY0FwaVxuICpcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGVyY2VudCh2YWx1ZSwgbG9jYWxlLCBkaWdpdHNJbmZvKSB7XG4gICAgdmFyIGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIE51bWJlckZvcm1hdFN0eWxlLlBlcmNlbnQpO1xuICAgIHZhciBwYXR0ZXJuID0gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKSk7XG4gICAgdmFyIHJlcyA9IGZvcm1hdE51bWJlclRvTG9jYWxlU3RyaW5nKHZhbHVlLCBwYXR0ZXJuLCBsb2NhbGUsIE51bWJlclN5bWJvbC5Hcm91cCwgTnVtYmVyU3ltYm9sLkRlY2ltYWwsIGRpZ2l0c0luZm8sIHRydWUpO1xuICAgIHJldHVybiByZXMucmVwbGFjZShuZXcgUmVnRXhwKFBFUkNFTlRfQ0hBUiwgJ2cnKSwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLlBlcmNlbnRTaWduKSk7XG59XG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgdGV4dCwgd2l0aCBncm91cCBzaXppbmcsIHNlcGFyYXRvciwgYW5kIG90aGVyXG4gKiBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZSBsb2NhbGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gZm9ybWF0LlxuICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gKiBAcGFyYW0gZGlnaXRJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHttaW5JbnRlZ2VyRGlnaXRzfS57bWluRnJhY3Rpb25EaWdpdHN9LXttYXhGcmFjdGlvbkRpZ2l0c31gLiBTZWUgYERlY2ltYWxQaXBlYCBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgdGV4dCBzdHJpbmcuXG4gKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0TnVtYmVyKHZhbHVlLCBsb2NhbGUsIGRpZ2l0c0luZm8pIHtcbiAgICB2YXIgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbCk7XG4gICAgdmFyIHBhdHRlcm4gPSBwYXJzZU51bWJlckZvcm1hdChmb3JtYXQsIGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5NaW51c1NpZ24pKTtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbyk7XG59XG5mdW5jdGlvbiBwYXJzZU51bWJlckZvcm1hdChmb3JtYXQsIG1pbnVzU2lnbikge1xuICAgIGlmIChtaW51c1NpZ24gPT09IHZvaWQgMCkgeyBtaW51c1NpZ24gPSAnLSc7IH1cbiAgICB2YXIgcCA9IHtcbiAgICAgICAgbWluSW50OiAxLFxuICAgICAgICBtaW5GcmFjOiAwLFxuICAgICAgICBtYXhGcmFjOiAwLFxuICAgICAgICBwb3NQcmU6ICcnLFxuICAgICAgICBwb3NTdWY6ICcnLFxuICAgICAgICBuZWdQcmU6ICcnLFxuICAgICAgICBuZWdTdWY6ICcnLFxuICAgICAgICBnU2l6ZTogMCxcbiAgICAgICAgbGdTaXplOiAwXG4gICAgfTtcbiAgICB2YXIgcGF0dGVyblBhcnRzID0gZm9ybWF0LnNwbGl0KFBBVFRFUk5fU0VQKTtcbiAgICB2YXIgcG9zaXRpdmUgPSBwYXR0ZXJuUGFydHNbMF07XG4gICAgdmFyIG5lZ2F0aXZlID0gcGF0dGVyblBhcnRzWzFdO1xuICAgIHZhciBwb3NpdGl2ZVBhcnRzID0gcG9zaXRpdmUuaW5kZXhPZihERUNJTUFMX1NFUCkgIT09IC0xID9cbiAgICAgICAgcG9zaXRpdmUuc3BsaXQoREVDSU1BTF9TRVApIDpcbiAgICAgICAgW1xuICAgICAgICAgICAgcG9zaXRpdmUuc3Vic3RyaW5nKDAsIHBvc2l0aXZlLmxhc3RJbmRleE9mKFpFUk9fQ0hBUikgKyAxKSxcbiAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZyhwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSlcbiAgICAgICAgXSwgaW50ZWdlciA9IHBvc2l0aXZlUGFydHNbMF0sIGZyYWN0aW9uID0gcG9zaXRpdmVQYXJ0c1sxXSB8fCAnJztcbiAgICBwLnBvc1ByZSA9IGludGVnZXIuc3Vic3RyKDAsIGludGVnZXIuaW5kZXhPZihESUdJVF9DSEFSKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFjdGlvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2ggPSBmcmFjdGlvbi5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjaCA9PT0gWkVST19DSEFSKSB7XG4gICAgICAgICAgICBwLm1pbkZyYWMgPSBwLm1heEZyYWMgPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjaCA9PT0gRElHSVRfQ0hBUikge1xuICAgICAgICAgICAgcC5tYXhGcmFjID0gaSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwLnBvc1N1ZiArPSBjaDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZ3JvdXBzID0gaW50ZWdlci5zcGxpdChHUk9VUF9TRVApO1xuICAgIHAuZ1NpemUgPSBncm91cHNbMV0gPyBncm91cHNbMV0ubGVuZ3RoIDogMDtcbiAgICBwLmxnU2l6ZSA9IChncm91cHNbMl0gfHwgZ3JvdXBzWzFdKSA/IChncm91cHNbMl0gfHwgZ3JvdXBzWzFdKS5sZW5ndGggOiAwO1xuICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICB2YXIgdHJ1bmtMZW4gPSBwb3NpdGl2ZS5sZW5ndGggLSBwLnBvc1ByZS5sZW5ndGggLSBwLnBvc1N1Zi5sZW5ndGgsIHBvcyA9IG5lZ2F0aXZlLmluZGV4T2YoRElHSVRfQ0hBUik7XG4gICAgICAgIHAubmVnUHJlID0gbmVnYXRpdmUuc3Vic3RyKDAsIHBvcykucmVwbGFjZSgvJy9nLCAnJyk7XG4gICAgICAgIHAubmVnU3VmID0gbmVnYXRpdmUuc3Vic3RyKHBvcyArIHRydW5rTGVuKS5yZXBsYWNlKC8nL2csICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAubmVnUHJlID0gbWludXNTaWduICsgcC5wb3NQcmU7XG4gICAgICAgIHAubmVnU3VmID0gcC5wb3NTdWY7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuLy8gVHJhbnNmb3JtcyBhIHBhcnNlZCBudW1iZXIgaW50byBhIHBlcmNlbnRhZ2UgYnkgbXVsdGlwbHlpbmcgaXQgYnkgMTAwXG5mdW5jdGlvbiB0b1BlcmNlbnQocGFyc2VkTnVtYmVyKSB7XG4gICAgLy8gaWYgdGhlIG51bWJlciBpcyAwLCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIGlmIChwYXJzZWROdW1iZXIuZGlnaXRzWzBdID09PSAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWROdW1iZXI7XG4gICAgfVxuICAgIC8vIEdldHRpbmcgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGRlY2ltYWxzXG4gICAgdmFyIGZyYWN0aW9uTGVuID0gcGFyc2VkTnVtYmVyLmRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjtcbiAgICBpZiAocGFyc2VkTnVtYmVyLmV4cG9uZW50KSB7XG4gICAgICAgIHBhcnNlZE51bWJlci5leHBvbmVudCArPSAyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGZyYWN0aW9uTGVuID09PSAwKSB7XG4gICAgICAgICAgICBwYXJzZWROdW1iZXIuZGlnaXRzLnB1c2goMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZnJhY3Rpb25MZW4gPT09IDEpIHtcbiAgICAgICAgICAgIHBhcnNlZE51bWJlci5kaWdpdHMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbiArPSAyO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkTnVtYmVyO1xufVxuLyoqXG4gKiBQYXJzZXMgYSBudW1iZXIuXG4gKiBTaWduaWZpY2FudCBiaXRzIG9mIHRoaXMgcGFyc2UgYWxnb3JpdGhtIGNhbWUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWlrZU1jbC9iaWcuanMvXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG51bSkge1xuICAgIHZhciBudW1TdHIgPSBNYXRoLmFicyhudW0pICsgJyc7XG4gICAgdmFyIGV4cG9uZW50ID0gMCwgZGlnaXRzLCBpbnRlZ2VyTGVuO1xuICAgIHZhciBpLCBqLCB6ZXJvcztcbiAgICAvLyBEZWNpbWFsIHBvaW50P1xuICAgIGlmICgoaW50ZWdlckxlbiA9IG51bVN0ci5pbmRleE9mKERFQ0lNQUxfU0VQKSkgPiAtMSkge1xuICAgICAgICBudW1TdHIgPSBudW1TdHIucmVwbGFjZShERUNJTUFMX1NFUCwgJycpO1xuICAgIH1cbiAgICAvLyBFeHBvbmVudGlhbCBmb3JtP1xuICAgIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkge1xuICAgICAgICAvLyBXb3JrIG91dCB0aGUgZXhwb25lbnQuXG4gICAgICAgIGlmIChpbnRlZ2VyTGVuIDwgMClcbiAgICAgICAgICAgIGludGVnZXJMZW4gPSBpO1xuICAgICAgICBpbnRlZ2VyTGVuICs9ICtudW1TdHIuc2xpY2UoaSArIDEpO1xuICAgICAgICBudW1TdHIgPSBudW1TdHIuc3Vic3RyaW5nKDAsIGkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpbnRlZ2VyTGVuIDwgMCkge1xuICAgICAgICAvLyBUaGVyZSB3YXMgbm8gZGVjaW1hbCBwb2ludCBvciBleHBvbmVudCBzbyBpdCBpcyBhbiBpbnRlZ2VyLlxuICAgICAgICBpbnRlZ2VyTGVuID0gbnVtU3RyLmxlbmd0aDtcbiAgICB9XG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLlxuICAgIGZvciAoaSA9IDA7IG51bVN0ci5jaGFyQXQoaSkgPT09IFpFUk9fQ0hBUjsgaSsrKSB7IC8qIGVtcHR5ICovXG4gICAgfVxuICAgIGlmIChpID09PSAoemVyb3MgPSBudW1TdHIubGVuZ3RoKSkge1xuICAgICAgICAvLyBUaGUgZGlnaXRzIGFyZSBhbGwgemVyby5cbiAgICAgICAgZGlnaXRzID0gWzBdO1xuICAgICAgICBpbnRlZ2VyTGVuID0gMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3NcbiAgICAgICAgemVyb3MtLTtcbiAgICAgICAgd2hpbGUgKG51bVN0ci5jaGFyQXQoemVyb3MpID09PSBaRVJPX0NIQVIpXG4gICAgICAgICAgICB6ZXJvcy0tO1xuICAgICAgICAvLyBUcmFpbGluZyB6ZXJvcyBhcmUgaW5zaWduaWZpY2FudCBzbyBpZ25vcmUgdGhlbVxuICAgICAgICBpbnRlZ2VyTGVuIC09IGk7XG4gICAgICAgIGRpZ2l0cyA9IFtdO1xuICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBhcnJheSBvZiBkaWdpdHMgd2l0aG91dCBsZWFkaW5nL3RyYWlsaW5nIHplcm9zLlxuICAgICAgICBmb3IgKGogPSAwOyBpIDw9IHplcm9zOyBpKyssIGorKykge1xuICAgICAgICAgICAgZGlnaXRzW2pdID0gTnVtYmVyKG51bVN0ci5jaGFyQXQoaSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRoZSBudW1iZXIgb3ZlcmZsb3dzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGlnaXRzIHRoZW4gdXNlIGFuIGV4cG9uZW50LlxuICAgIGlmIChpbnRlZ2VyTGVuID4gTUFYX0RJR0lUUykge1xuICAgICAgICBkaWdpdHMgPSBkaWdpdHMuc3BsaWNlKDAsIE1BWF9ESUdJVFMgLSAxKTtcbiAgICAgICAgZXhwb25lbnQgPSBpbnRlZ2VyTGVuIC0gMTtcbiAgICAgICAgaW50ZWdlckxlbiA9IDE7XG4gICAgfVxuICAgIHJldHVybiB7IGRpZ2l0czogZGlnaXRzLCBleHBvbmVudDogZXhwb25lbnQsIGludGVnZXJMZW46IGludGVnZXJMZW4gfTtcbn1cbi8qKlxuICogUm91bmQgdGhlIHBhcnNlZCBudW1iZXIgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcGFyc2VkTnVtYmVyIGluLXBsYWNlXG4gKi9cbmZ1bmN0aW9uIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhYywgbWF4RnJhYykge1xuICAgIGlmIChtaW5GcmFjID4gbWF4RnJhYykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uIChcIiArIG1pbkZyYWMgKyBcIikgaXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gKFwiICsgbWF4RnJhYyArIFwiKS5cIik7XG4gICAgfVxuICAgIHZhciBkaWdpdHMgPSBwYXJzZWROdW1iZXIuZGlnaXRzO1xuICAgIHZhciBmcmFjdGlvbkxlbiA9IGRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjtcbiAgICB2YXIgZnJhY3Rpb25TaXplID0gTWF0aC5taW4oTWF0aC5tYXgobWluRnJhYywgZnJhY3Rpb25MZW4pLCBtYXhGcmFjKTtcbiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0IHRvIHdoZXJlIHJvdW5kaW5nIGlzIHRvIG9jY3VyXG4gICAgdmFyIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjtcbiAgICB2YXIgZGlnaXQgPSBkaWdpdHNbcm91bmRBdF07XG4gICAgaWYgKHJvdW5kQXQgPiAwKSB7XG4gICAgICAgIC8vIERyb3AgZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YFxuICAgICAgICBkaWdpdHMuc3BsaWNlKE1hdGgubWF4KHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuLCByb3VuZEF0KSk7XG4gICAgICAgIC8vIFNldCBub24tZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YCB0byAwXG4gICAgICAgIGZvciAodmFyIGogPSByb3VuZEF0OyBqIDwgZGlnaXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBkaWdpdHNbal0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBXZSByb3VuZGVkIHRvIHplcm8gc28gcmVzZXQgdGhlIHBhcnNlZE51bWJlclxuICAgICAgICBmcmFjdGlvbkxlbiA9IE1hdGgubWF4KDAsIGZyYWN0aW9uTGVuKTtcbiAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4gPSAxO1xuICAgICAgICBkaWdpdHMubGVuZ3RoID0gTWF0aC5tYXgoMSwgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIDEpO1xuICAgICAgICBkaWdpdHNbMF0gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJvdW5kQXQ7IGkrKylcbiAgICAgICAgICAgIGRpZ2l0c1tpXSA9IDA7XG4gICAgfVxuICAgIGlmIChkaWdpdCA+PSA1KSB7XG4gICAgICAgIGlmIChyb3VuZEF0IC0gMSA8IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrID4gcm91bmRBdDsgay0tKSB7XG4gICAgICAgICAgICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7XG4gICAgICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDEpO1xuICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpZ2l0c1tyb3VuZEF0IC0gMV0rKztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBQYWQgb3V0IHdpdGggemVyb3MgdG8gZ2V0IHRoZSByZXF1aXJlZCBmcmFjdGlvbiBsZW5ndGhcbiAgICBmb3IgKDsgZnJhY3Rpb25MZW4gPCBNYXRoLm1heCgwLCBmcmFjdGlvblNpemUpOyBmcmFjdGlvbkxlbisrKVxuICAgICAgICBkaWdpdHMucHVzaCgwKTtcbiAgICB2YXIgZHJvcFRyYWlsaW5nWmVyb3MgPSBmcmFjdGlvblNpemUgIT09IDA7XG4gICAgLy8gTWluaW1hbCBsZW5ndGggPSBuYiBvZiBkZWNpbWFscyByZXF1aXJlZCArIGN1cnJlbnQgbmIgb2YgaW50ZWdlcnNcbiAgICAvLyBBbnkgbnVtYmVyIGJlc2lkZXMgdGhhdCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWYgaXQncyBhIHRyYWlsaW5nIDBcbiAgICB2YXIgbWluTGVuID0gbWluRnJhYyArIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuO1xuICAgIC8vIERvIGFueSBjYXJyeWluZywgZS5nLiBhIGRpZ2l0IHdhcyByb3VuZGVkIHVwIHRvIDEwXG4gICAgdmFyIGNhcnJ5ID0gZGlnaXRzLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uIChjYXJyeSwgZCwgaSwgZGlnaXRzKSB7XG4gICAgICAgIGQgPSBkICsgY2Fycnk7XG4gICAgICAgIGRpZ2l0c1tpXSA9IGQgPCAxMCA/IGQgOiBkIC0gMTA7IC8vIGQgJSAxMFxuICAgICAgICBpZiAoZHJvcFRyYWlsaW5nWmVyb3MpIHtcbiAgICAgICAgICAgIC8vIERvIG5vdCBrZWVwIG1lYW5pbmdsZXNzIGZyYWN0aW9uYWwgdHJhaWxpbmcgemVyb3MgKGUuZy4gMTUuNTIwMDAgLS0+IDE1LjUyKVxuICAgICAgICAgICAgaWYgKGRpZ2l0c1tpXSA9PT0gMCAmJiBpID49IG1pbkxlbikge1xuICAgICAgICAgICAgICAgIGRpZ2l0cy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRyb3BUcmFpbGluZ1plcm9zID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGQgPj0gMTAgPyAxIDogMDsgLy8gTWF0aC5mbG9vcihkIC8gMTApO1xuICAgIH0sIDApO1xuICAgIGlmIChjYXJyeSkge1xuICAgICAgICBkaWdpdHMudW5zaGlmdChjYXJyeSk7XG4gICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuKys7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VJbnRBdXRvUmFkaXgodGV4dCkge1xuICAgIHZhciByZXN1bHQgPSBwYXJzZUludCh0ZXh0KTtcbiAgICBpZiAoaXNOYU4ocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyAnICsgdGV4dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgZnJvbSB2NVxuICovXG52YXIgREVQUkVDQVRFRF9QTFVSQUxfRk4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1VzZVY0UGx1cmFscycpO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ0xvY2FsaXphdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0xvY2FsaXphdGlvbigpIHtcbiAgICB9XG4gICAgcmV0dXJuIE5nTG9jYWxpemF0aW9uO1xufSgpKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcGx1cmFsIGNhdGVnb3J5IGZvciBhIGdpdmVuIHZhbHVlLlxuICogLSBcIj12YWx1ZVwiIHdoZW4gdGhlIGNhc2UgZXhpc3RzLFxuICogLSB0aGUgcGx1cmFsIGNhdGVnb3J5IG90aGVyd2lzZVxuICovXG5mdW5jdGlvbiBnZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgY2FzZXMsIG5nTG9jYWxpemF0aW9uLCBsb2NhbGUpIHtcbiAgICB2YXIga2V5ID0gXCI9XCIgKyB2YWx1ZTtcbiAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAga2V5ID0gbmdMb2NhbGl6YXRpb24uZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIGxvY2FsZSk7XG4gICAgaWYgKGNhc2VzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICAgIGlmIChjYXNlcy5pbmRleE9mKCdvdGhlcicpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBsdXJhbCBtZXNzYWdlIGZvdW5kIGZvciB2YWx1ZSBcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgcGx1cmFsIGNhc2UgYmFzZWQgb24gdGhlIGxvY2FsZVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nTG9jYWxlTG9jYWxpemF0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOZ0xvY2FsZUxvY2FsaXphdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZ0xvY2FsZUxvY2FsaXphdGlvbihsb2NhbGUsIFxuICAgIC8qKiBAZGVwcmVjYXRlZCBmcm9tIHY1ICovXG4gICAgZGVwcmVjYXRlZFBsdXJhbEZuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmxvY2FsZSA9IGxvY2FsZTtcbiAgICAgICAgX3RoaXMuZGVwcmVjYXRlZFBsdXJhbEZuID0gZGVwcmVjYXRlZFBsdXJhbEZuO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE5nTG9jYWxlTG9jYWxpemF0aW9uLnByb3RvdHlwZS5nZXRQbHVyYWxDYXRlZ29yeSA9IGZ1bmN0aW9uICh2YWx1ZSwgbG9jYWxlKSB7XG4gICAgICAgIHZhciBwbHVyYWwgPSB0aGlzLmRlcHJlY2F0ZWRQbHVyYWxGbiA/IHRoaXMuZGVwcmVjYXRlZFBsdXJhbEZuKGxvY2FsZSB8fCB0aGlzLmxvY2FsZSwgdmFsdWUpIDpcbiAgICAgICAgICAgIGdldExvY2FsZVBsdXJhbENhc2UobG9jYWxlIHx8IHRoaXMubG9jYWxlKSh2YWx1ZSk7XG4gICAgICAgIHN3aXRjaCAocGx1cmFsKSB7XG4gICAgICAgICAgICBjYXNlIFBsdXJhbC5aZXJvOlxuICAgICAgICAgICAgICAgIHJldHVybiAnemVybyc7XG4gICAgICAgICAgICBjYXNlIFBsdXJhbC5PbmU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvbmUnO1xuICAgICAgICAgICAgY2FzZSBQbHVyYWwuVHdvOlxuICAgICAgICAgICAgICAgIHJldHVybiAndHdvJztcbiAgICAgICAgICAgIGNhc2UgUGx1cmFsLkZldzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zldyc7XG4gICAgICAgICAgICBjYXNlIFBsdXJhbC5NYW55OlxuICAgICAgICAgICAgICAgIHJldHVybiAnbWFueSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ0xvY2FsZUxvY2FsaXphdGlvbiA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIF9fcGFyYW0oMCwgSW5qZWN0KExPQ0FMRV9JRCkpLFxuICAgICAgICBfX3BhcmFtKDEsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDEsIEluamVjdChERVBSRUNBVEVEX1BMVVJBTF9GTikpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZywgT2JqZWN0XSlcbiAgICBdLCBOZ0xvY2FsZUxvY2FsaXphdGlvbik7XG4gICAgcmV0dXJuIE5nTG9jYWxlTG9jYWxpemF0aW9uO1xufShOZ0xvY2FsaXphdGlvbikpO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlXG4gKlxuICogQGRlcHJlY2F0ZWQgZnJvbSB2NSB0aGUgcGx1cmFsIGNhc2UgZnVuY3Rpb24gaXMgaW4gbG9jYWxlIGRhdGEgZmlsZXMgY29tbW9uL2xvY2FsZXMvKi50c1xuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBnZXRQbHVyYWxDYXNlKGxvY2FsZSwgbkxpa2UpIHtcbiAgICAvLyBUT0RPKHZpY2IpOiBsYXp5IGNvbXB1dGVcbiAgICBpZiAodHlwZW9mIG5MaWtlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuTGlrZSA9IHBhcnNlSW50KG5MaWtlLCAxMCk7XG4gICAgfVxuICAgIHZhciBuID0gbkxpa2U7XG4gICAgdmFyIG5EZWNpbWFsID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlxcLj8vLCAnJyk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yKE1hdGguYWJzKG4pKTtcbiAgICB2YXIgdiA9IG5EZWNpbWFsLmxlbmd0aDtcbiAgICB2YXIgZiA9IHBhcnNlSW50KG5EZWNpbWFsLCAxMCk7XG4gICAgdmFyIHQgPSBwYXJzZUludChuLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXFwuP3wwKyQvZywgJycpLCAxMCkgfHwgMDtcbiAgICB2YXIgbGFuZyA9IGxvY2FsZS5zcGxpdCgnLScpWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoIChsYW5nKSB7XG4gICAgICAgIGNhc2UgJ2FmJzpcbiAgICAgICAgY2FzZSAnYXNhJzpcbiAgICAgICAgY2FzZSAnYXonOlxuICAgICAgICBjYXNlICdiZW0nOlxuICAgICAgICBjYXNlICdiZXonOlxuICAgICAgICBjYXNlICdiZyc6XG4gICAgICAgIGNhc2UgJ2JyeCc6XG4gICAgICAgIGNhc2UgJ2NlJzpcbiAgICAgICAgY2FzZSAnY2dnJzpcbiAgICAgICAgY2FzZSAnY2hyJzpcbiAgICAgICAgY2FzZSAnY2tiJzpcbiAgICAgICAgY2FzZSAnZWUnOlxuICAgICAgICBjYXNlICdlbCc6XG4gICAgICAgIGNhc2UgJ2VvJzpcbiAgICAgICAgY2FzZSAnZXMnOlxuICAgICAgICBjYXNlICdldSc6XG4gICAgICAgIGNhc2UgJ2ZvJzpcbiAgICAgICAgY2FzZSAnZnVyJzpcbiAgICAgICAgY2FzZSAnZ3N3JzpcbiAgICAgICAgY2FzZSAnaGEnOlxuICAgICAgICBjYXNlICdoYXcnOlxuICAgICAgICBjYXNlICdodSc6XG4gICAgICAgIGNhc2UgJ2pnbyc6XG4gICAgICAgIGNhc2UgJ2ptYyc6XG4gICAgICAgIGNhc2UgJ2thJzpcbiAgICAgICAgY2FzZSAna2snOlxuICAgICAgICBjYXNlICdra2onOlxuICAgICAgICBjYXNlICdrbCc6XG4gICAgICAgIGNhc2UgJ2tzJzpcbiAgICAgICAgY2FzZSAna3NiJzpcbiAgICAgICAgY2FzZSAna3knOlxuICAgICAgICBjYXNlICdsYic6XG4gICAgICAgIGNhc2UgJ2xnJzpcbiAgICAgICAgY2FzZSAnbWFzJzpcbiAgICAgICAgY2FzZSAnbWdvJzpcbiAgICAgICAgY2FzZSAnbWwnOlxuICAgICAgICBjYXNlICdtbic6XG4gICAgICAgIGNhc2UgJ25iJzpcbiAgICAgICAgY2FzZSAnbmQnOlxuICAgICAgICBjYXNlICduZSc6XG4gICAgICAgIGNhc2UgJ25uJzpcbiAgICAgICAgY2FzZSAnbm5oJzpcbiAgICAgICAgY2FzZSAnbnluJzpcbiAgICAgICAgY2FzZSAnb20nOlxuICAgICAgICBjYXNlICdvcic6XG4gICAgICAgIGNhc2UgJ29zJzpcbiAgICAgICAgY2FzZSAncHMnOlxuICAgICAgICBjYXNlICdybSc6XG4gICAgICAgIGNhc2UgJ3JvZic6XG4gICAgICAgIGNhc2UgJ3J3ayc6XG4gICAgICAgIGNhc2UgJ3NhcSc6XG4gICAgICAgIGNhc2UgJ3NlaCc6XG4gICAgICAgIGNhc2UgJ3NuJzpcbiAgICAgICAgY2FzZSAnc28nOlxuICAgICAgICBjYXNlICdzcSc6XG4gICAgICAgIGNhc2UgJ3RhJzpcbiAgICAgICAgY2FzZSAndGUnOlxuICAgICAgICBjYXNlICd0ZW8nOlxuICAgICAgICBjYXNlICd0ayc6XG4gICAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgY2FzZSAndWcnOlxuICAgICAgICBjYXNlICd1eic6XG4gICAgICAgIGNhc2UgJ3ZvJzpcbiAgICAgICAgY2FzZSAndnVuJzpcbiAgICAgICAgY2FzZSAnd2FlJzpcbiAgICAgICAgY2FzZSAneG9nJzpcbiAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYWsnOlxuICAgICAgICBjYXNlICdsbic6XG4gICAgICAgIGNhc2UgJ21nJzpcbiAgICAgICAgY2FzZSAncGEnOlxuICAgICAgICBjYXNlICd0aSc6XG4gICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDAgJiYgbiA8PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYW0nOlxuICAgICAgICBjYXNlICdhcyc6XG4gICAgICAgIGNhc2UgJ2JuJzpcbiAgICAgICAgY2FzZSAnZmEnOlxuICAgICAgICBjYXNlICdndSc6XG4gICAgICAgIGNhc2UgJ2hpJzpcbiAgICAgICAgY2FzZSAna24nOlxuICAgICAgICBjYXNlICdtcic6XG4gICAgICAgIGNhc2UgJ3p1JzpcbiAgICAgICAgICAgIGlmIChpID09PSAwIHx8IG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdhcic6XG4gICAgICAgICAgICBpZiAobiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlplcm87XG4gICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAzICYmIG4gJSAxMDAgPD0gMTApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAobiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gOTkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYXN0JzpcbiAgICAgICAgY2FzZSAnY2EnOlxuICAgICAgICBjYXNlICdkZSc6XG4gICAgICAgIGNhc2UgJ2VuJzpcbiAgICAgICAgY2FzZSAnZXQnOlxuICAgICAgICBjYXNlICdmaSc6XG4gICAgICAgIGNhc2UgJ2Z5JzpcbiAgICAgICAgY2FzZSAnZ2wnOlxuICAgICAgICBjYXNlICdpdCc6XG4gICAgICAgIGNhc2UgJ25sJzpcbiAgICAgICAgY2FzZSAnc3YnOlxuICAgICAgICBjYXNlICdzdyc6XG4gICAgICAgIGNhc2UgJ3VyJzpcbiAgICAgICAgY2FzZSAneWknOlxuICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2JlJzpcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDEgJiYgIShuICUgMTAwID09PSAxMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSBNYXRoLmZsb29yKG4gJSAxMCkgJiYgbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAhKG4gJSAxMDAgPj0gMTIgJiYgbiAlIDEwMCA8PSAxNCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSAwIHx8IG4gJSAxMCA9PT0gTWF0aC5mbG9vcihuICUgMTApICYmIG4gJSAxMCA+PSA1ICYmIG4gJSAxMCA8PSA5IHx8XG4gICAgICAgICAgICAgICAgbiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDExICYmIG4gJSAxMDAgPD0gMTQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYnInOlxuICAgICAgICAgICAgaWYgKG4gJSAxMCA9PT0gMSAmJiAhKG4gJSAxMDAgPT09IDExIHx8IG4gJSAxMDAgPT09IDcxIHx8IG4gJSAxMDAgPT09IDkxKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuICUgMTAgPT09IDIgJiYgIShuICUgMTAwID09PSAxMiB8fCBuICUgMTAwID09PSA3MiB8fCBuICUgMTAwID09PSA5MikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSBNYXRoLmZsb29yKG4gJSAxMCkgJiYgKG4gJSAxMCA+PSAzICYmIG4gJSAxMCA8PSA0IHx8IG4gJSAxMCA9PT0gOSkgJiZcbiAgICAgICAgICAgICAgICAhKG4gJSAxMDAgPj0gMTAgJiYgbiAlIDEwMCA8PSAxOSB8fCBuICUgMTAwID49IDcwICYmIG4gJSAxMDAgPD0gNzkgfHxcbiAgICAgICAgICAgICAgICAgICAgbiAlIDEwMCA+PSA5MCAmJiBuICUgMTAwIDw9IDk5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICghKG4gPT09IDApICYmIG4gJSAxZTYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5NYW55O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnYnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ3NyJzpcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMCA9PT0gMSAmJiAhKGkgJSAxMDAgPT09IDExKSB8fCBmICUgMTAgPT09IDEgJiYgIShmICUgMTAwID09PSAxMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMiAmJiBpICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICEoaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KSB8fFxuICAgICAgICAgICAgICAgIGYgJSAxMCA9PT0gTWF0aC5mbG9vcihmICUgMTApICYmIGYgJSAxMCA+PSAyICYmIGYgJSAxMCA8PSA0ICYmXG4gICAgICAgICAgICAgICAgICAgICEoZiAlIDEwMCA+PSAxMiAmJiBmICUgMTAwIDw9IDE0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2NzJzpcbiAgICAgICAgY2FzZSAnc2snOlxuICAgICAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChpID09PSBNYXRoLmZsb29yKGkpICYmIGkgPj0gMiAmJiBpIDw9IDQgJiYgdiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICghKHYgPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2N5JzpcbiAgICAgICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKG4gPT09IDIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAobiA9PT0gMylcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmIChuID09PSA2KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2RhJzpcbiAgICAgICAgICAgIGlmIChuID09PSAxIHx8ICEodCA9PT0gMCkgJiYgKGkgPT09IDAgfHwgaSA9PT0gMSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdkc2InOlxuICAgICAgICBjYXNlICdoc2InOlxuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gMSB8fCBmICUgMTAwID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gMiB8fCBmICUgMTAwID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gTWF0aC5mbG9vcihpICUgMTAwKSAmJiBpICUgMTAwID49IDMgJiYgaSAlIDEwMCA8PSA0IHx8XG4gICAgICAgICAgICAgICAgZiAlIDEwMCA9PT0gTWF0aC5mbG9vcihmICUgMTAwKSAmJiBmICUgMTAwID49IDMgJiYgZiAlIDEwMCA8PSA0KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnZmYnOlxuICAgICAgICBjYXNlICdmcic6XG4gICAgICAgIGNhc2UgJ2h5JzpcbiAgICAgICAgY2FzZSAna2FiJzpcbiAgICAgICAgICAgIGlmIChpID09PSAwIHx8IGkgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdmaWwnOlxuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgKGkgPT09IDEgfHwgaSA9PT0gMiB8fCBpID09PSAzKSB8fFxuICAgICAgICAgICAgICAgIHYgPT09IDAgJiYgIShpICUgMTAgPT09IDQgfHwgaSAlIDEwID09PSA2IHx8IGkgJSAxMCA9PT0gOSkgfHxcbiAgICAgICAgICAgICAgICAhKHYgPT09IDApICYmICEoZiAlIDEwID09PSA0IHx8IGYgJSAxMCA9PT0gNiB8fCBmICUgMTAgPT09IDkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnZ2EnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAobiA9PT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMyAmJiBuIDw9IDYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDcgJiYgbiA8PSAxMClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdnZCc6XG4gICAgICAgICAgICBpZiAobiA9PT0gMSB8fCBuID09PSAxMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSAyIHx8IG4gPT09IDEyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKG4gPT09IE1hdGguZmxvb3IobikgJiYgKG4gPj0gMyAmJiBuIDw9IDEwIHx8IG4gPj0gMTMgJiYgbiA8PSAxOSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdndic6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5Ud287XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIChpICUgMTAwID09PSAwIHx8IGkgJSAxMDAgPT09IDIwIHx8IGkgJSAxMDAgPT09IDQwIHx8IGkgJSAxMDAgPT09IDYwIHx8IGkgJSAxMDAgPT09IDgwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICghKHYgPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2hlJzpcbiAgICAgICAgICAgIGlmIChpID09PSAxICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMiAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgIShuID49IDAgJiYgbiA8PSAxMCkgJiYgbiAlIDEwID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ2lzJzpcbiAgICAgICAgICAgIGlmICh0ID09PSAwICYmIGkgJSAxMCA9PT0gMSAmJiAhKGkgJSAxMDAgPT09IDExKSB8fCAhKHQgPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAna3NoJzpcbiAgICAgICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgIGlmIChuID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAna3cnOlxuICAgICAgICBjYXNlICduYXEnOlxuICAgICAgICBjYXNlICdzZSc6XG4gICAgICAgIGNhc2UgJ3Ntbic6XG4gICAgICAgICAgICBpZiAobiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuVHdvO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnbGFnJzpcbiAgICAgICAgICAgIGlmIChuID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuWmVybztcbiAgICAgICAgICAgIGlmICgoaSA9PT0gMCB8fCBpID09PSAxKSAmJiAhKG4gPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnbHQnOlxuICAgICAgICAgICAgaWYgKG4gJSAxMCA9PT0gMSAmJiAhKG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxOSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSBNYXRoLmZsb29yKG4gJSAxMCkgJiYgbiAlIDEwID49IDIgJiYgbiAlIDEwIDw9IDkgJiZcbiAgICAgICAgICAgICAgICAhKG4gJSAxMDAgPj0gMTEgJiYgbiAlIDEwMCA8PSAxOSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAoIShmID09PSAwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdsdic6XG4gICAgICAgIGNhc2UgJ3ByZyc6XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSAwIHx8IG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5IHx8XG4gICAgICAgICAgICAgICAgdiA9PT0gMiAmJiBmICUgMTAwID09PSBNYXRoLmZsb29yKGYgJSAxMDApICYmIGYgJSAxMDAgPj0gMTEgJiYgZiAlIDEwMCA8PSAxOSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlplcm87XG4gICAgICAgICAgICBpZiAobiAlIDEwID09PSAxICYmICEobiAlIDEwMCA9PT0gMTEpIHx8IHYgPT09IDIgJiYgZiAlIDEwID09PSAxICYmICEoZiAlIDEwMCA9PT0gMTEpIHx8XG4gICAgICAgICAgICAgICAgISh2ID09PSAyKSAmJiBmICUgMTAgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdtayc6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDEgfHwgZiAlIDEwID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnbXQnOlxuICAgICAgICAgICAgaWYgKG4gPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAobiA9PT0gMCB8fCBuICUgMTAwID09PSBNYXRoLmZsb29yKG4gJSAxMDApICYmIG4gJSAxMDAgPj0gMiAmJiBuICUgMTAwIDw9IDEwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgaWYgKG4gJSAxMDAgPT09IE1hdGguZmxvb3IobiAlIDEwMCkgJiYgbiAlIDEwMCA+PSAxMSAmJiBuICUgMTAwIDw9IDE5KVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuTWFueTtcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3BsJzpcbiAgICAgICAgICAgIGlmIChpID09PSAxICYmIHYgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IE1hdGguZmxvb3IoaSAlIDEwKSAmJiBpICUgMTAgPj0gMiAmJiBpICUgMTAgPD0gNCAmJlxuICAgICAgICAgICAgICAgICEoaSAlIDEwMCA+PSAxMiAmJiBpICUgMTAwIDw9IDE0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmICEoaSA9PT0gMSkgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDAgJiYgaSAlIDEwIDw9IDEgfHxcbiAgICAgICAgICAgICAgICB2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSA1ICYmIGkgJSAxMCA8PSA5IHx8XG4gICAgICAgICAgICAgICAgdiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICBpZiAobiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDAgJiYgbiA8PSAyICYmICEobiA9PT0gMikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdybyc6XG4gICAgICAgICAgICBpZiAoaSA9PT0gMSAmJiB2ID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKCEodiA9PT0gMCkgfHwgbiA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICEobiA9PT0gMSkgJiYgbiAlIDEwMCA9PT0gTWF0aC5mbG9vcihuICUgMTAwKSAmJiBuICUgMTAwID49IDEgJiYgbiAlIDEwMCA8PSAxOSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLkZldztcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgICAgIGNhc2UgJ3J1JzpcbiAgICAgICAgY2FzZSAndWsnOlxuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSAxICYmICEoaSAlIDEwMCA9PT0gMTEpKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwID09PSBNYXRoLmZsb29yKGkgJSAxMCkgJiYgaSAlIDEwID49IDIgJiYgaSAlIDEwIDw9IDQgJiZcbiAgICAgICAgICAgICAgICAhKGkgJSAxMDAgPj0gMTIgJiYgaSAlIDEwMCA8PSAxNCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5GZXc7XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAgPT09IDAgfHxcbiAgICAgICAgICAgICAgICB2ID09PSAwICYmIGkgJSAxMCA9PT0gTWF0aC5mbG9vcihpICUgMTApICYmIGkgJSAxMCA+PSA1ICYmIGkgJSAxMCA8PSA5IHx8XG4gICAgICAgICAgICAgICAgdiA9PT0gMCAmJiBpICUgMTAwID09PSBNYXRoLmZsb29yKGkgJSAxMDApICYmIGkgJSAxMDAgPj0gMTEgJiYgaSAlIDEwMCA8PSAxNClcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk1hbnk7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdzaGknOlxuICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgbiA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLk9uZTtcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMiAmJiBuIDw9IDEwKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAnc2knOlxuICAgICAgICAgICAgaWYgKG4gPT09IDAgfHwgbiA9PT0gMSB8fCBpID09PSAwICYmIGYgPT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICBjYXNlICdzbCc6XG4gICAgICAgICAgICBpZiAodiA9PT0gMCAmJiBpICUgMTAwID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT25lO1xuICAgICAgICAgICAgaWYgKHYgPT09IDAgJiYgaSAlIDEwMCA9PT0gMilcbiAgICAgICAgICAgICAgICByZXR1cm4gUGx1cmFsLlR3bztcbiAgICAgICAgICAgIGlmICh2ID09PSAwICYmIGkgJSAxMDAgPT09IE1hdGguZmxvb3IoaSAlIDEwMCkgJiYgaSAlIDEwMCA+PSAzICYmIGkgJSAxMDAgPD0gNCB8fCAhKHYgPT09IDApKVxuICAgICAgICAgICAgICAgIHJldHVybiBQbHVyYWwuRmV3O1xuICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PdGhlcjtcbiAgICAgICAgY2FzZSAndHptJzpcbiAgICAgICAgICAgIGlmIChuID09PSBNYXRoLmZsb29yKG4pICYmIG4gPj0gMCAmJiBuIDw9IDEgfHwgbiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID49IDExICYmIG4gPD0gOTkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBsdXJhbC5PbmU7XG4gICAgICAgICAgICByZXR1cm4gUGx1cmFsLk90aGVyO1xuICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIHNwZWNpZmljYXRpb24sIHRoZSBkZWZhdWx0IGlzIGFsd2F5cyBcIm90aGVyXCJcbiAgICAgICAgLy8gU3BlYzogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvY2xkci1zcGVjL3BsdXJhbC1ydWxlc1xuICAgICAgICAvLyA+IG90aGVyIChyZXF1aXJlZOKAlGdlbmVyYWwgcGx1cmFsIGZvcm0g4oCUIGFsc28gdXNlZCBpZiB0aGUgbGFuZ3VhZ2Ugb25seSBoYXMgYSBzaW5nbGUgZm9ybSlcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBQbHVyYWwuT3RoZXI7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBwYXJzZUNvb2tpZVZhbHVlKGNvb2tpZVN0ciwgbmFtZSkge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhjb29raWVTdHIuc3BsaXQoJzsnKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgIHZhciBjb29raWUgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIHZhciBlcUluZGV4ID0gY29va2llLmluZGV4T2YoJz0nKTtcbiAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZChlcUluZGV4ID09IC0xID8gW2Nvb2tpZSwgJyddIDogW2Nvb2tpZS5zbGljZSgwLCBlcUluZGV4KSwgY29va2llLnNsaWNlKGVxSW5kZXggKyAxKV0sIDIpLCBjb29raWVOYW1lID0gX2RbMF0sIGNvb2tpZVZhbHVlID0gX2RbMV07XG4gICAgICAgICAgICBpZiAoY29va2llTmFtZS50cmltKCkgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVXNlZCB0byBkaWZmIGFuZCBjb252ZXJ0IG5nU3R5bGUvbmdDbGFzcyBpbnN0cnVjdGlvbnMgaW50byBbc3R5bGVdIGFuZCBbY2xhc3NdIGJpbmRpbmdzLlxuICpcbiAqIG5nU3R5bGUgYW5kIG5nQ2xhc3MgYm90aCBhY2NlcHQgdmFyaW91cyBmb3JtcyBvZiBpbnB1dCBhbmQgYmVoYXZlIGRpZmZlcmVudGx5IHRoYW4gdGhhdFxuICogb2YgaG93IFtzdHlsZV0gYW5kIFtjbGFzc10gYmVoYXZlIGluIEFuZ3VsYXIuXG4gKlxuICogVGhlIGRpZmZlcmVuY2VzIGFyZTpcbiAqICAtIG5nU3R5bGUgYW5kIG5nQ2xhc3MgYm90aCAqKndhdGNoKiogdGhlaXIgYmluZGluZyB2YWx1ZXMgZm9yIGNoYW5nZXMgZWFjaCB0aW1lIENEIHJ1bnNcbiAqICAgIHdoaWxlIFtzdHlsZV0gYW5kIFtjbGFzc10gYmluZGluZ3MgZG8gbm90ICh0aGV5IGNoZWNrIGZvciBpZGVudGl0eSBjaGFuZ2VzKVxuICogIC0gbmdTdHlsZSBhbGxvd3MgZm9yIHVuaXQtYmFzZWQga2V5cyAoZS5nLiBgeydtYXgtd2lkdGgucHgnOnZhbHVlfWApIGFuZCBbc3R5bGVdIGRvZXMgbm90XG4gKiAgLSBuZ0NsYXNzIHN1cHBvcnRzIGFycmF5cyBvZiBjbGFzcyB2YWx1ZXMgYW5kIFtjbGFzc10gb25seSBhY2NlcHRzIG1hcCBhbmQgc3RyaW5nIHZhbHVlc1xuICogIC0gbmdDbGFzcyBhbGxvd3MgZm9yIG11bHRpcGxlIGNsYXNzTmFtZSBrZXlzIChzcGFjZS1zZXBhcmF0ZWQpIHdpdGhpbiBhbiBhcnJheSBvciBtYXBcbiAqICAgICAoYXMgdGhlICoga2V5KSB3aGlsZSBbY2xhc3NdIG9ubHkgYWNjZXB0cyBhIHNpbXBsZSBrZXkvdmFsdWUgbWFwIG9iamVjdFxuICpcbiAqIEhhdmluZyBBbmd1bGFyIHVuZGVyc3RhbmQgYW5kIGFkYXB0IHRvIGFsbCB0aGUgZGlmZmVyZW50IGZvcm1zIG9mIGJlaGF2aW9yIGlzIGNvbXBsaWNhdGVkXG4gKiBhbmQgdW5uZWNlc3NhcnkuIEluc3RlYWQsIG5nQ2xhc3MgYW5kIG5nU3R5bGUgc2hvdWxkIGhhdmUgdGhlaXIgaW5wdXQgdmFsdWVzIGJlIGNvbnZlcnRlZFxuICogaW50byBzb21ldGhpbmcgdGhhdCB0aGUgY29yZS1sZXZlbCBbc3R5bGVdIGFuZCBbY2xhc3NdIGJpbmRpbmdzIHVuZGVyc3RhbmQuXG4gKlxuICogVGhpcyBbU3R5bGluZ0RpZmZlcl0gY2xhc3MgaGFuZGxlcyB0aGlzIGNvbnZlcnNpb24gYnkgY3JlYXRpbmcgYSBuZXcgaW5wdXQgdmFsdWUgZWFjaCB0aW1lXG4gKiB0aGUgaW5uZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmRpbmcgdmFsdWUgaGF2ZSBjaGFuZ2VkLlxuICpcbiAqICMjIFdoeSBkbyB3ZSBjYXJlIGFib3V0IG5nU3R5bGUvbmdDbGFzcz9cbiAqIFRoZSBzdHlsaW5nIGFsZ29yaXRobSBjb2RlIChkb2N1bWVudGVkIGluc2lkZSBvZiBgcmVuZGVyMy9pbnRlcmZhY2VzL3N0eWxpbmcudHNgKSBuZWVkcyB0b1xuICogcmVzcGVjdCBhbmQgdW5kZXJzdGFuZCB0aGUgc3R5bGluZyB2YWx1ZXMgZW1pdHRlZCB0aHJvdWdoIG5nU3R5bGUgYW5kIG5nQ2xhc3MgKHdoZW4gdGhleVxuICogYXJlIHByZXNlbnQgYW5kIHVzZWQgaW4gYSB0ZW1wbGF0ZSkuXG4gKlxuICogSW5zdGVhZCBvZiBoYXZpbmcgdGhlc2UgZGlyZWN0aXZlcyBtYW5hZ2Ugc3R5bGluZyBvbiB0aGVpciBvd24sIHRoZXkgc2hvdWxkIGJlIGluY2x1ZGVkXG4gKiBpbnRvIHRoZSBBbmd1bGFyIHN0eWxpbmcgYWxnb3JpdGhtIHRoYXQgZXhpc3RzIGZvciBbc3R5bGVdIGFuZCBbY2xhc3NdIGJpbmRpbmdzLlxuICpcbiAqIEhlcmUncyB3aHk6XG4gKlxuICogLSBJZiBuZ1N0eWxlL25nQ2xhc3MgaXMgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIFtzdHlsZV0vW2NsYXNzXSBiaW5kaW5ncyB0aGVuIHRoZVxuICogICBzdHlsZXMgYW5kIGNsYXNzZXMgd291bGQgZmFsbCBvdXQgb2Ygc3luYyBhbmQgYmUgYXBwbGllZCBhbmQgdXBkYXRlZCBhdFxuICogICBpbmNvbnNpc3RlbnQgdGltZXNcbiAqIC0gQm90aCBuZ0NsYXNzL25nU3R5bGUgZG8gbm90IHJlc3BlY3QgW2NsYXNzLm5hbWVdIGFuZCBbc3R5bGUucHJvcF0gYmluZGluZ3NcbiAqICAgKHRoZXkgd2lsbCB3cml0ZSBvdmVyIHRoZW0gZ2l2ZW4gdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIGV2ZW50cylcbiAqXG4gKiAgIGBgYFxuICogICA8IS0tIGlmIGB3MWAgaXMgdXBkYXRlZCB0aGVuIGl0IHdpbGwgYWx3YXlzIG92ZXJyaWRlIGB3MmBcbiAqICAgICAgICBpZiBgdzJgIGlzIHVwZGF0ZWQgdGhlbiBpdCB3aWxsIGFsd2F5cyBvdmVycmlkZSBgdzFgXG4gKiAgICAgICAgaWYgYm90aCBhcmUgdXBkYXRlZCBhdCB0aGUgc2FtZSB0aW1lIHRoZW4gYHcxYCB3aW5zIC0tPlxuICogICA8ZGl2IFtuZ1N0eWxlXT1cInt3aWR0aDp3MX1cIiBbc3R5bGUud2lkdGhdPVwidzJcIj4uLi48L2Rpdj5cbiAqXG4gKiAgIDwhLS0gaWYgYHcxYCBpcyB1cGRhdGVkIHRoZW4gaXQgd2lsbCBhbHdheXMgbG9zZSB0byBgdzJgXG4gKiAgICAgICAgaWYgYHcyYCBpcyB1cGRhdGVkIHRoZW4gaXQgd2lsbCBhbHdheXMgb3ZlcnJpZGUgYHcxYFxuICogICAgICAgIGlmIGJvdGggYXJlIHVwZGF0ZWQgYXQgdGhlIHNhbWUgdGltZSB0aGVuIGB3MmAgd2lucyAtLT5cbiAqICAgPGRpdiBbc3R5bGVdPVwie3dpZHRoOncxfVwiIFtzdHlsZS53aWR0aF09XCJ3MlwiPi4uLjwvZGl2PlxuICogICBgYGBcbiAqIC0gbmdDbGFzcy9uZ1N0eWxlIHdlcmUgd3JpdHRlbiBhcyBhIGRpcmVjdGl2ZXMgYW5kIG1hZGUgdXNlIG9mIG1hcHMsIGNsb3N1cmVzIGFuZCBvdGhlclxuICogICBleHBlbnNpdmUgZGF0YSBzdHJ1Y3R1cmVzIHdoaWNoIHdlcmUgZXZhbHVhdGVkIGVhY2ggdGltZSBDRCBydW5zXG4gKi9cbnZhciBTdHlsaW5nRGlmZmVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN0eWxpbmdEaWZmZXIoX25hbWUsIF9vcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX25hbWUgPSBfbmFtZTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlVHlwZSA9IDAgLyogTnVsbCAqLztcbiAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlSWRlbnRpdHlDaGFuZ2UgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyAodXBkYXRlcykgdGhlIHN0eWxpbmcgdmFsdWUgd2l0aGluIHRoZSBkaWZmZXIuXG4gICAgICpcbiAgICAgKiBPbmx5IHdoZW4gYGhhc1ZhbHVlQ2hhbmdlZGAgaXMgY2FsbGVkIHRoZW4gdGhpcyBuZXcgdmFsdWUgd2lsbCBiZSBldmFsdXRlZFxuICAgICAqIGFuZCBjaGVja2VkIGFnYWluc3QgdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgc3R5bGluZyB2YWx1ZSBwcm92aWRlZCBmcm9tIHRoZSBuZ0NsYXNzL25nU3R5bGUgYmluZGluZ1xuICAgICAqL1xuICAgIFN0eWxpbmdEaWZmZXIucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlVHlwZSA9IDQgLyogQXJyYXkgKi87XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZXRWYWx1ZVR5cGUgPSA4IC8qIFNldCAqLztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLl9vcHRpb25zICYgNCAvKiBBbGxvd1N0cmluZ1ZhbHVlICovKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9uYW1lICsgJyBzdHJpbmcgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlVHlwZSA9IDEgLyogU3RyaW5nICovO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlVHlwZSA9IHZhbHVlID8gMiAvKiBNYXAgKi8gOiAwIC8qIE51bGwgKi87XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGFzdFNldFZhbHVlSWRlbnRpdHlDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sYXN0U2V0VmFsdWUgPSB2YWx1ZSB8fCBudWxsO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgYHNldFZhbHVlKClgIGlzIGNhbGxlZCwgYnV0IGl0IGNhbiBhbHNvIGJlXG4gICAgICogY2FsbGVkIGluY2FzZSB0aGUgZXhpc3RpbmcgdmFsdWUgKGlmIGl0J3MgYSBjb2xsZWN0aW9uKSBjaGFuZ2VzIGludGVybmFsbHkuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIGluZGVlZCBhIGNvbGxlY3Rpb24gaXQgd2lsbCBkbyB0aGUgbmVjZXNzYXJ5IGRpZmZpbmcgd29yayBhbmQgcHJvZHVjZSBhXG4gICAgICogbmV3IG9iamVjdCB2YWx1ZSBhcyBhc3NpZ24gdGhhdCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGluIHNvbWUgd2F5LlxuICAgICAqL1xuICAgIFN0eWxpbmdEaWZmZXIucHJvdG90eXBlLmhhc1ZhbHVlQ2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlSGFzQ2hhbmdlZCA9IHRoaXMuX2xhc3RTZXRWYWx1ZUlkZW50aXR5Q2hhbmdlO1xuICAgICAgICBpZiAoIXZhbHVlSGFzQ2hhbmdlZCAmJiAhKHRoaXMuX2xhc3RTZXRWYWx1ZVR5cGUgJiAxNCAvKiBDb2xsZWN0aW9uICovKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGZpbmFsVmFsdWUgPSBudWxsO1xuICAgICAgICB2YXIgdHJpbVZhbHVlcyA9ICh0aGlzLl9vcHRpb25zICYgMSAvKiBUcmltUHJvcGVydGllcyAqLykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHZhciBwYXJzZU91dFVuaXRzID0gKHRoaXMuX29wdGlvbnMgJiA4IC8qIEFsbG93VW5pdHMgKi8pID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB2YXIgYWxsb3dTdWJLZXlzID0gKHRoaXMuX29wdGlvbnMgJiAyIC8qIEFsbG93U3ViS2V5cyAqLykgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fbGFzdFNldFZhbHVlVHlwZSkge1xuICAgICAgICAgICAgLy8gY2FzZSAxOiBbaW5wdXRdPVwic3RyaW5nXCJcbiAgICAgICAgICAgIGNhc2UgMSAvKiBTdHJpbmcgKi86XG4gICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuX2xhc3RTZXRWYWx1ZS5zcGxpdCgvXFxzKy9nKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucyAmIDE2IC8qIEZvcmNlQXNNYXAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMuZm9yRWFjaChmdW5jdGlvbiAodG9rZW4sIGkpIHsgcmV0dXJuIGZpbmFsVmFsdWVbdG9rZW5dID0gdHJ1ZTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAoc3RyLCB0b2tlbiwgaSkgeyByZXR1cm4gc3RyICsgKGkgPyAnICcgOiAnJykgKyB0b2tlbjsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gY2FzZSAyOiBbaW5wdXRdPVwie2tleTp2YWx1ZX1cIlxuICAgICAgICAgICAgY2FzZSAyIC8qIE1hcCAqLzpcbiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5fbGFzdFNldFZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBjbGFzc0V4cCB2YWx1ZSBleGlzdHMgYW5kIHRoYXQgaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWFwIChvdGhlcndpc2UgYW4gaWRlbnRpdHkgY2hhbmdlIHdvdWxkIGhhdmUgb2NjdXJyZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhhc0NoYW5nZWQgPSBtYXBIYXNDaGFuZ2VkKGtleXMsIHRoaXMudmFsdWUsIG1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUhhc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBidWxpZE1hcEZyb21WYWx1ZXModGhpcy5fbmFtZSwgdHJpbVZhbHVlcywgcGFyc2VPdXRVbml0cywgYWxsb3dTdWJLZXlzLCBtYXAsIGtleXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGNhc2UgM2E6IFtpbnB1dF09XCJbc3RyMSwgc3RyMiwgLi4uXVwiXG4gICAgICAgICAgICAvLyBjYXNlIDNiOiBbaW5wdXRdPVwiU2V0XCJcbiAgICAgICAgICAgIGNhc2UgNCAvKiBBcnJheSAqLzpcbiAgICAgICAgICAgIGNhc2UgOCAvKiBTZXQgKi86XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5fbGFzdFNldFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5c18xID0gT2JqZWN0LmtleXModGhpcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlSGFzQ2hhbmdlZCA9ICFhcnJheUVxdWFsc0FycmF5KGtleXNfMSwgdmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bGlkTWFwRnJvbVZhbHVlcyh0aGlzLl9uYW1lLCB0cmltVmFsdWVzLCBwYXJzZU91dFVuaXRzLCBhbGxvd1N1YktleXMsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gY2FzZSA0OiBbaW5wdXRdPVwibnVsbHx1bmRlZmluZWRcIlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVIYXNDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gZmluYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVIYXNDaGFuZ2VkO1xuICAgIH07XG4gICAgcmV0dXJuIFN0eWxpbmdEaWZmZXI7XG59KCkpO1xuLyoqXG4gKiBidWlsZHMgYW5kIHJldHVybnMgYSBtYXAgYmFzZWQgb24gdGhlIHZhbHVlcyBpbnB1dCB2YWx1ZVxuICpcbiAqIElmIHRoZSBga2V5c2AgcGFyYW0gaXMgcHJvdmlkZWQgdGhlbiB0aGUgYHZhbHVlc2AgcGFyYW0gaXMgdHJlYXRlZCBhcyBhXG4gKiBzdHJpbmcgbWFwLiBPdGhlcndpc2UgYHZhbHVlc2AgaXMgdHJlYXRlZCBhcyBhIHN0cmluZyBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYnVsaWRNYXBGcm9tVmFsdWVzKGVycm9yUHJlZml4LCB0cmltLCBwYXJzZU91dFVuaXRzLCBhbGxvd1N1YktleXMsIHZhbHVlcywga2V5cykge1xuICAgIHZhciBtYXAgPSB7fTtcbiAgICBpZiAoa2V5cykge1xuICAgICAgICAvLyBjYXNlIDE6IG1hcFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAga2V5ID0gdHJpbSA/IGtleS50cmltKCkgOiBrZXk7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgIHNldE1hcFZhbHVlcyhtYXAsIGtleSwgdmFsdWUsIHBhcnNlT3V0VW5pdHMsIGFsbG93U3ViS2V5cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGNhc2UgMjogYXJyYXlcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkVmFsdWUoZXJyb3JQcmVmaXgsIHZhbHVlKTtcbiAgICAgICAgICAgIHZhbHVlID0gdHJpbSA/IHZhbHVlLnRyaW0oKSA6IHZhbHVlO1xuICAgICAgICAgICAgc2V0TWFwVmFsdWVzKG1hcCwgdmFsdWUsIHRydWUsIGZhbHNlLCBhbGxvd1N1YktleXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiBhc3NlcnRWYWxpZFZhbHVlKGVycm9yUHJlZml4LCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclByZWZpeCArIFwiIGNhbiBvbmx5IHRvZ2dsZSBDU1MgY2xhc3NlcyBleHByZXNzZWQgYXMgc3RyaW5ncywgZ290IFwiICsgdmFsdWUpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldE1hcFZhbHVlcyhtYXAsIGtleSwgdmFsdWUsIHBhcnNlT3V0VW5pdHMsIGFsbG93U3ViS2V5cykge1xuICAgIGlmIChhbGxvd1N1YktleXMgJiYga2V5LmluZGV4T2YoJyAnKSA+IDApIHtcbiAgICAgICAgdmFyIGlubmVyS2V5cyA9IGtleS5zcGxpdCgvXFxzKy9nKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbm5lcktleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHNldEluZGl2aWR1YWxNYXBWYWx1ZShtYXAsIGlubmVyS2V5c1tqXSwgdmFsdWUsIHBhcnNlT3V0VW5pdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzZXRJbmRpdmlkdWFsTWFwVmFsdWUobWFwLCBrZXksIHZhbHVlLCBwYXJzZU91dFVuaXRzKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzZXRJbmRpdmlkdWFsTWFwVmFsdWUobWFwLCBrZXksIHZhbHVlLCBwYXJzZU91dFVuaXRzKSB7XG4gICAgaWYgKHBhcnNlT3V0VW5pdHMpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IG5vcm1hbGl6ZVN0eWxlS2V5QW5kVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHZhbHVlID0gdmFsdWVzLnZhbHVlO1xuICAgICAgICBrZXkgPSB2YWx1ZXMua2V5O1xuICAgIH1cbiAgICBtYXBba2V5XSA9IHZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVLZXlBbmRWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgdmFyIGluZGV4ID0ga2V5LmluZGV4T2YoJy4nKTtcbiAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgIHZhciB1bml0ID0ga2V5LnN1YnN0cihpbmRleCArIDEpOyAvLyBpZ25vcmUgdGhlIC4gKFt3aWR0aC5weF09XCInNDAnXCIgPT4gXCI0MHB4XCIpXG4gICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyB3ZSBzaG91bGQgbm90IGNvbnZlcnQgbnVsbCB2YWx1ZXMgdG8gc3RyaW5nXG4gICAgICAgICAgICB2YWx1ZSArPSB1bml0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfTtcbn1cbmZ1bmN0aW9uIG1hcEhhc0NoYW5nZWQoa2V5cywgYSwgYikge1xuICAgIHZhciBvbGRLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgdmFyIG5ld0tleXMgPSBrZXlzO1xuICAgIC8vIHRoZSBrZXlzIGFyZSBkaWZmZXJlbnQgd2hpY2ggbWVhbnMgdGhlIG1hcCBjaGFuZ2VkXG4gICAgaWYgKCFhcnJheUVxdWFsc0FycmF5KG9sZEtleXMsIG5ld0tleXMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IG5ld0tleXNbaV07XG4gICAgICAgIGlmIChhW2tleV0gIT09IGJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gYXJyYXlFcXVhbHNBcnJheShhLCBiKSB7XG4gICAgaWYgKGEgJiYgYikge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChiLmluZGV4T2YoYVtpXSkgPT09IC0xKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFVzZWQgYXMgYSB0b2tlbiBmb3IgYW4gaW5qZWN0ZWQgc2VydmljZSB3aXRoaW4gdGhlIE5nQ2xhc3MgZGlyZWN0aXZlLlxuICpcbiAqIE5nQ2xhc3MgYmVoYXZlcyBkaWZmZXJlbmx5IHdoZXRoZXIgb3Igbm90IFZFIGlzIGJlaW5nIHVzZWQgb3Igbm90LiBJZlxuICogcHJlc2VudCB0aGVuIHRoZSBsZWdhY3kgbmdDbGFzcyBkaWZmaW5nIGFsZ29yaXRobSB3aWxsIGJlIHVzZWQgYXMgYW5cbiAqIGluamVjdGVkIHNlcnZpY2UuIE90aGVyd2lzZSB0aGUgbmV3IGRpZmZpbmcgYWxnb3JpdGhtICh3aGljaCBkZWxlZ2F0ZXNcbiAqIHRvIHRoZSBgW2NsYXNzXWAgYmluZGluZykgd2lsbCBiZSB1c2VkLiBUaGlzIHRvZ2dsZSBiZWhhdmlvciBpcyBkb25lIHNvXG4gKiB2aWEgdGhlIGl2eV9zd2l0Y2ggbWVjaGFuaXNtLlxuICovXG52YXIgTmdDbGFzc0ltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdDbGFzc0ltcGwoKSB7XG4gICAgfVxuICAgIHJldHVybiBOZ0NsYXNzSW1wbDtcbn0oKSk7XG52YXIgTmdDbGFzc1IySW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0NsYXNzUjJJbXBsKF9pdGVyYWJsZURpZmZlcnMsIF9rZXlWYWx1ZURpZmZlcnMsIF9uZ0VsLCBfcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXJzID0gX2l0ZXJhYmxlRGlmZmVycztcbiAgICAgICAgdGhpcy5fa2V5VmFsdWVEaWZmZXJzID0gX2tleVZhbHVlRGlmZmVycztcbiAgICAgICAgdGhpcy5fbmdFbCA9IF9uZ0VsO1xuICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjtcbiAgICAgICAgdGhpcy5faW5pdGlhbENsYXNzZXMgPSBbXTtcbiAgICB9XG4gICAgTmdDbGFzc1IySW1wbC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9O1xuICAgIE5nQ2xhc3NSMkltcGwucHJvdG90eXBlLnNldENsYXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpO1xuICAgICAgICB0aGlzLl9pbml0aWFsQ2xhc3NlcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5zcGxpdCgvXFxzKy8pIDogW107XG4gICAgICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7XG4gICAgfTtcbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5zZXROZ0NsYXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpO1xuICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpO1xuICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmF3Q2xhc3MgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUuc3BsaXQoL1xccysvKSA6IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fcmF3Q2xhc3MpIHtcbiAgICAgICAgICAgIGlmICjJtWlzTGlzdExpa2VJdGVyYWJsZSh0aGlzLl9yYXdDbGFzcykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gdGhpcy5fa2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5fcmF3Q2xhc3MpLmNyZWF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5hcHBseUNoYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pdGVyYWJsZURpZmZlcikge1xuICAgICAgICAgICAgdmFyIGl0ZXJhYmxlQ2hhbmdlcyA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVyLmRpZmYodGhpcy5fcmF3Q2xhc3MpO1xuICAgICAgICAgICAgaWYgKGl0ZXJhYmxlQ2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5SXRlcmFibGVDaGFuZ2VzKGl0ZXJhYmxlQ2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fa2V5VmFsdWVEaWZmZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZUNoYW5nZXMgPSB0aGlzLl9rZXlWYWx1ZURpZmZlci5kaWZmKHRoaXMuX3Jhd0NsYXNzKTtcbiAgICAgICAgICAgIGlmIChrZXlWYWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUtleVZhbHVlQ2hhbmdlcyhrZXlWYWx1ZUNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5fYXBwbHlLZXlWYWx1ZUNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gX3RoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpOyB9KTtcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkgeyByZXR1cm4gX3RoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpOyB9KTtcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5fYXBwbHlJdGVyYWJsZUNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oZnVuY3Rpb24gKHJlY29yZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQuaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLml0ZW0sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTmdDbGFzcyBjYW4gb25seSB0b2dnbGUgQ1NTIGNsYXNzZXMgZXhwcmVzc2VkIGFzIHN0cmluZ3MsIGdvdCBcIiArIMm1c3RyaW5naWZ5KHJlY29yZC5pdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiBfdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLml0ZW0sIGZhbHNlKTsgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGEgY29sbGVjdGlvbiBvZiBDU1MgY2xhc3NlcyB0byB0aGUgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBTZXQgYW5kIEFycmF5IENTUyBjbGFzcyBuYW1lcyBjb250YWluZWQgaW4gdGhvc2UgY29sbGVjdGlvbnMgYXJlIGFsd2F5c1xuICAgICAqIGFkZGVkLlxuICAgICAqIEZvciBhcmd1bWVudCBvZiB0eXBlIE1hcCBDU1MgY2xhc3MgbmFtZSBpbiB0aGUgbWFwJ3Mga2V5IGlzIHRvZ2dsZWQgYmFzZWQgb24gdGhlIHZhbHVlIChhZGRlZFxuICAgICAqIGZvciB0cnV0aHkgYW5kIHJlbW92ZWQgZm9yIGZhbHN5KS5cbiAgICAgKi9cbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5fYXBwbHlDbGFzc2VzID0gZnVuY3Rpb24gKHJhd0NsYXNzVmFsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChyYXdDbGFzc1ZhbCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmF3Q2xhc3NWYWwpIHx8IHJhd0NsYXNzVmFsIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmF3Q2xhc3NWYWwuZm9yRWFjaChmdW5jdGlvbiAoa2xhc3MpIHsgcmV0dXJuIF90aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgdHJ1ZSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmF3Q2xhc3NWYWwpLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7IHJldHVybiBfdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsICEhcmF3Q2xhc3NWYWxba2xhc3NdKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIGZyb20gdGhlIERPTSBlbGVtZW50LiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGNsZWFudXBcbiAgICAgKiBwdXJwb3Nlcy5cbiAgICAgKi9cbiAgICBOZ0NsYXNzUjJJbXBsLnByb3RvdHlwZS5fcmVtb3ZlQ2xhc3NlcyA9IGZ1bmN0aW9uIChyYXdDbGFzc1ZhbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAocmF3Q2xhc3NWYWwpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0NsYXNzVmFsKSB8fCByYXdDbGFzc1ZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJhd0NsYXNzVmFsLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7IHJldHVybiBfdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIGZhbHNlKTsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyYXdDbGFzc1ZhbCkuZm9yRWFjaChmdW5jdGlvbiAoa2xhc3MpIHsgcmV0dXJuIF90aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgZmFsc2UpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdDbGFzc1IySW1wbC5wcm90b3R5cGUuX3RvZ2dsZUNsYXNzID0gZnVuY3Rpb24gKGtsYXNzLCBlbmFibGVkKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGtsYXNzID0ga2xhc3MudHJpbSgpO1xuICAgICAgICBpZiAoa2xhc3MpIHtcbiAgICAgICAgICAgIGtsYXNzLnNwbGl0KC9cXHMrL2cpLmZvckVhY2goZnVuY3Rpb24gKGtsYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3JlbmRlcmVyLmFkZENsYXNzKF90aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsIGtsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhfdGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBrbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5nQ2xhc3NSMkltcGwgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0l0ZXJhYmxlRGlmZmVycywgS2V5VmFsdWVEaWZmZXJzLFxuICAgICAgICAgICAgRWxlbWVudFJlZiwgUmVuZGVyZXIyXSlcbiAgICBdLCBOZ0NsYXNzUjJJbXBsKTtcbiAgICByZXR1cm4gTmdDbGFzc1IySW1wbDtcbn0oKSk7XG52YXIgTmdDbGFzc1IzSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0NsYXNzUjNJbXBsKCkge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX25nQ2xhc3NEaWZmZXIgPSBuZXcgU3R5bGluZ0RpZmZlcignTmdDbGFzcycsIDEgLyogVHJpbVByb3BlcnRpZXMgKi8gfFxuICAgICAgICAgICAgMiAvKiBBbGxvd1N1YktleXMgKi8gfFxuICAgICAgICAgICAgNCAvKiBBbGxvd1N0cmluZ1ZhbHVlICovIHwgMTYgLyogRm9yY2VBc01hcCAqLyk7XG4gICAgICAgIHRoaXMuX2NsYXNzU3RyaW5nRGlmZmVyID0gbnVsbDtcbiAgICB9XG4gICAgTmdDbGFzc1IzSW1wbC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfTtcbiAgICBOZ0NsYXNzUjNJbXBsLnByb3RvdHlwZS5zZXRDbGFzcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBlYXJseSBleGl0IGluY2FzZSB0aGUgYmluZGluZyBnZXRzIGVtaXR0ZWQgYXMgYW4gZW1wdHkgdmFsdWUgd2hpY2hcbiAgICAgICAgLy8gbWVhbnMgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGluc3RhbnRpYXRlIGFuZCBkaWZmIHRoZSB2YWx1ZXMuLi5cbiAgICAgICAgaWYgKCF2YWx1ZSAmJiAhdGhpcy5fY2xhc3NTdHJpbmdEaWZmZXIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2NsYXNzU3RyaW5nRGlmZmVyID0gdGhpcy5fY2xhc3NTdHJpbmdEaWZmZXIgfHxcbiAgICAgICAgICAgIG5ldyBTdHlsaW5nRGlmZmVyKCdjbGFzcycsIDQgLyogQWxsb3dTdHJpbmdWYWx1ZSAqLyB8IDE2IC8qIEZvcmNlQXNNYXAgKi8pO1xuICAgICAgICB0aGlzLl9jbGFzc1N0cmluZ0RpZmZlci5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfTtcbiAgICBOZ0NsYXNzUjNJbXBsLnByb3RvdHlwZS5zZXROZ0NsYXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX25nQ2xhc3NEaWZmZXIuc2V0VmFsdWUodmFsdWUpO1xuICAgIH07XG4gICAgTmdDbGFzc1IzSW1wbC5wcm90b3R5cGUuYXBwbHlDaGFuZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xhc3NDaGFuZ2VkID0gdGhpcy5fY2xhc3NTdHJpbmdEaWZmZXIgPyB0aGlzLl9jbGFzc1N0cmluZ0RpZmZlci5oYXNWYWx1ZUNoYW5nZWQoKSA6IGZhbHNlO1xuICAgICAgICB2YXIgbmdDbGFzc0NoYW5nZWQgPSB0aGlzLl9uZ0NsYXNzRGlmZmVyLmhhc1ZhbHVlQ2hhbmdlZCgpO1xuICAgICAgICBpZiAoY2xhc3NDaGFuZ2VkIHx8IG5nQ2xhc3NDaGFuZ2VkKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9uZ0NsYXNzRGlmZmVyLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NsYXNzU3RyaW5nRGlmZmVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzVmFsdWUgPSB0aGlzLl9jbGFzc1N0cmluZ0RpZmZlci52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gX19hc3NpZ24oe30sIGNsYXNzVmFsdWUsIHZhbHVlKSA6IGNsYXNzVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdDbGFzc1IzSW1wbCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKClcbiAgICBdLCBOZ0NsYXNzUjNJbXBsKTtcbiAgICByZXR1cm4gTmdDbGFzc1IzSW1wbDtcbn0oKSk7XG4vLyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIGJvdGggTmdTdHlsZVIySW1wbCBhbmQgTmdTdHlsZVIzSW1wbCBhcmVcbi8vIG5vdCBpdnlfc3dpdGNoJ2QgYXdheSwgaW5zdGVhZCB0aGV5IGFyZSBvbmx5IGhvb2tlZCB1cCBpbnRvIHRoZVxuLy8gREkgdmlhIE5nU3R5bGUncyBkaXJlY3RpdmUncyBwcm92aWRlciBwcm9wZXJ0eS5cbnZhciBOZ0NsYXNzSW1wbFByb3ZpZGVyX19QUkVfUjNfXyA9IHtcbiAgICBwcm92aWRlOiBOZ0NsYXNzSW1wbCxcbiAgICB1c2VDbGFzczogTmdDbGFzc1IySW1wbFxufTtcbnZhciBOZ0NsYXNzSW1wbFByb3ZpZGVyX19QT1NUX1IzX18gPSB7XG4gICAgcHJvdmlkZTogTmdDbGFzc0ltcGwsXG4gICAgdXNlQ2xhc3M6IE5nQ2xhc3NSM0ltcGxcbn07XG52YXIgTmdDbGFzc0ltcGxQcm92aWRlciA9IE5nQ2xhc3NJbXBsUHJvdmlkZXJfX1BSRV9SM19fO1xuXG4vKlxuICogTmdDbGFzcyAoYXMgd2VsbCBhcyBOZ1N0eWxlKSBiZWhhdmVzIGRpZmZlcmVudGx5IHdoZW4gbG9hZGVkIGluIHRoZSBWRSBhbmQgd2hlbiBub3QuXG4gKlxuICogSWYgdGhlIFZFIGlzIHByZXNlbnQgKHdoaWNoIGlzIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBbmd1bGFyKSB0aGVuIE5nQ2xhc3Mgd2lsbCBpbmplY3RcbiAqIHRoZSBsZWdhY3kgZGlmZmluZyBhbGdvcml0aG0gYXMgYSBzZXJ2aWNlIGFuZCBkZWxlZ2F0ZSBhbGwgc3R5bGluZyBjaGFuZ2VzIHRvIHRoYXQuXG4gKlxuICogSWYgdGhlIFZFIGlzIG5vdCBwcmVzZW50IHRoZW4gTmdTdHlsZSB3aWxsIG5vcm1hbGl6ZSAodGhyb3VnaCB0aGUgaW5qZWN0ZWQgc2VydmljZSkgYW5kXG4gKiB0aGVuIHdyaXRlIGFsbCBzdHlsaW5nIGNoYW5nZXMgdG8gdGhlIGBbc3R5bGVdYCBiaW5kaW5nIGRpcmVjdGx5ICh0aHJvdWdoIGEgaG9zdCBiaW5kaW5nKS5cbiAqIFRoZW4gQW5ndWxhciB3aWxsIG5vdGljZSB0aGUgaG9zdCBiaW5kaW5nIGNoYW5nZSBhbmQgdHJlYXQgdGhlIGNoYW5nZXMgYXMgc3R5bGluZ1xuICogY2hhbmdlcyBhbmQgYXBwbHkgdGhlbSB2aWEgdGhlIGNvcmUgc3R5bGluZyBpbnN0cnVjdGlvbnMgdGhhdCBleGlzdCB3aXRoaW4gQW5ndWxhci5cbiAqL1xuLy8gdXNlZCB3aGVuIHRoZSBWRSBpcyBwcmVzZW50XG52YXIgbmdDbGFzc0RpcmVjdGl2ZURlZl9fUFJFX1IzX18gPSB1bmRlZmluZWQ7XG52YXIgybUwID0gZnVuY3Rpb24gKCkgeyB9LCDJtTEgPSBmdW5jdGlvbiAoKSB7IH0sIMm1MiA9IGZ1bmN0aW9uIChyZiwgY3R4LCBlbEluZGV4KSB7XG4gICAgaWYgKHJmICYgMSAvKiBDcmVhdGUgKi8pIHtcbiAgICAgICAgybXJtWVsZW1lbnRIb3N0U3R5bGluZygpO1xuICAgIH1cbiAgICBpZiAocmYgJiAyIC8qIFVwZGF0ZSAqLykge1xuICAgICAgICDJtcm1ZWxlbWVudEhvc3RTdHlsaW5nTWFwKGN0eC5nZXRWYWx1ZSgpKTtcbiAgICAgICAgybXJtWVsZW1lbnRIb3N0U3R5bGluZ0FwcGx5KCk7XG4gICAgfVxufTtcbi8vIHVzZWQgd2hlbiB0aGUgVkUgaXMgbm90IHByZXNlbnQgKG5vdGUgdGhlIGRpcmVjdGl2ZSB3aWxsXG4vLyBuZXZlciBiZSBpbnN0YW50aWF0ZWQgbm9ybWFsbHkgYmVjYXVzZSBpdCBpcyBhcGFydCBvZiBhXG4vLyBiYXNlIGNsYXNzKVxudmFyIG5nQ2xhc3NEaXJlY3RpdmVEZWZfX1BPU1RfUjNfXyA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoe1xuICAgIHR5cGU6IMm1MCxcbiAgICBzZWxlY3RvcnM6IG51bGwsXG4gICAgZmFjdG9yeTogybUxLFxuICAgIGhvc3RCaW5kaW5nczogybUyXG59KTtcbnZhciBuZ0NsYXNzRGlyZWN0aXZlRGVmID0gbmdDbGFzc0RpcmVjdGl2ZURlZl9fUFJFX1IzX187XG4vKipcbiAqIFNlcnZlcyBhcyB0aGUgYmFzZSBub24tVkUgY29udGFpbmVyIGZvciBOZ0NsYXNzLlxuICpcbiAqIFdoaWxlIHRoaXMgaXMgYSBiYXNlIGNsYXNzIHRoYXQgTmdDbGFzcyBleHRlbmRzIGZyb20sIHRoZVxuICogY2xhc3MgaXRzZWxmIGFjdHMgYXMgYSBjb250YWluZXIgZm9yIG5vbi1WRSBjb2RlIHRvIHNldHVwXG4gKiBhIGxpbmsgdG8gdGhlIGBbY2xhc3NdYCBob3N0IGJpbmRpbmcgKHZpYSB0aGUgc3RhdGljXG4gKiBgbmdEaXJlY3RpdmVEZWZgIHByb3BlcnR5IG9uIHRoZSBjbGFzcykuXG4gKlxuICogTm90ZSB0aGF0IHRoZSBgbmdEaXJlY3RpdmVEZWZgIHByb3BlcnR5J3MgY29kZSBpcyBzd2l0Y2hlZFxuICogZGVwZW5kaW5nIGlmIFZFIGlzIHByZXNlbnQgb3Igbm90ICh0aGlzIGFsbG93cyBmb3IgdGhlXG4gKiBiaW5kaW5nIGNvZGUgdG8gYmUgc2V0IG9ubHkgZm9yIG5ld2VyIHZlcnNpb25zIG9mIEFuZ3VsYXIpLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nQ2xhc3NCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nQ2xhc3NCYXNlKF9kZWxlZ2F0ZSkge1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IF9kZWxlZ2F0ZTtcbiAgICB9XG4gICAgTmdDbGFzc0Jhc2UucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0VmFsdWUoKTsgfTtcbiAgICBOZ0NsYXNzQmFzZS5uZ0RpcmVjdGl2ZURlZiA9IG5nQ2xhc3NEaXJlY3RpdmVEZWY7XG4gICAgcmV0dXJuIE5nQ2xhc3NCYXNlO1xufSgpKTtcbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiBgYGBcbiAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT1cIidmaXJzdCBzZWNvbmQnXCI+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKlxuICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPVwiWydmaXJzdCcsICdzZWNvbmQnXVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICpcbiAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT1cInsnZmlyc3QnOiB0cnVlLCAnc2Vjb25kJzogdHJ1ZSwgJ3RoaXJkJzogZmFsc2V9XCI+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKlxuICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPVwic3RyaW5nRXhwfGFycmF5RXhwfG9iakV4cFwiPi4uLjwvc29tZS1lbGVtZW50PlxuICpcbiAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT1cInsnY2xhc3MxIGNsYXNzMiBjbGFzczMnIDogdHJ1ZX1cIj4uLi48L3NvbWUtZWxlbWVudD5cbiAqIGBgYFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEFkZHMgYW5kIHJlbW92ZXMgQ1NTIGNsYXNzZXMgb24gYW4gSFRNTCBlbGVtZW50LlxuICpcbiAqIFRoZSBDU1MgY2xhc3NlcyBhcmUgdXBkYXRlZCBhcyBmb2xsb3dzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbjpcbiAqIC0gYHN0cmluZ2AgLSB0aGUgQ1NTIGNsYXNzZXMgbGlzdGVkIGluIHRoZSBzdHJpbmcgKHNwYWNlIGRlbGltaXRlZCkgYXJlIGFkZGVkLFxuICogLSBgQXJyYXlgIC0gdGhlIENTUyBjbGFzc2VzIGRlY2xhcmVkIGFzIEFycmF5IGVsZW1lbnRzIGFyZSBhZGRlZCxcbiAqIC0gYE9iamVjdGAgLSBrZXlzIGFyZSBDU1MgY2xhc3NlcyB0aGF0IGdldCBhZGRlZCB3aGVuIHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSB2YWx1ZVxuICogICAgICAgICAgICAgIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSwgb3RoZXJ3aXNlIHRoZXkgYXJlIHJlbW92ZWQuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdDbGFzcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdDbGFzcywgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZ0NsYXNzKGRlbGVnYXRlKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBkZWxlZ2F0ZSkgfHwgdGhpcztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nQ2xhc3MucHJvdG90eXBlLCBcImtsYXNzXCIsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy5fZGVsZWdhdGUuc2V0Q2xhc3ModmFsdWUpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdDbGFzcy5wcm90b3R5cGUsIFwibmdDbGFzc1wiLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWxlZ2F0ZS5zZXROZ0NsYXNzKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgTmdDbGFzcy5wcm90b3R5cGUubmdEb0NoZWNrID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9kZWxlZ2F0ZS5hcHBseUNoYW5nZXMoKTsgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ2NsYXNzJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBTdHJpbmcpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZ10pXG4gICAgXSwgTmdDbGFzcy5wcm90b3R5cGUsIFwia2xhc3NcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ0NsYXNzJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgTmdDbGFzcy5wcm90b3R5cGUsIFwibmdDbGFzc1wiLCBudWxsKTtcbiAgICBOZ0NsYXNzID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nQ2xhc3NdJywgcHJvdmlkZXJzOiBbTmdDbGFzc0ltcGxQcm92aWRlcl0gfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTmdDbGFzc0ltcGxdKVxuICAgIF0sIE5nQ2xhc3MpO1xuICAgIHJldHVybiBOZ0NsYXNzO1xufShOZ0NsYXNzQmFzZSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEluc3RhbnRpYXRlcyBhIHNpbmdsZSB7QGxpbmsgQ29tcG9uZW50fSB0eXBlIGFuZCBpbnNlcnRzIGl0cyBIb3N0IFZpZXcgaW50byBjdXJyZW50IFZpZXcuXG4gKiBgTmdDb21wb25lbnRPdXRsZXRgIHByb3ZpZGVzIGEgZGVjbGFyYXRpdmUgYXBwcm9hY2ggZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uLlxuICpcbiAqIGBOZ0NvbXBvbmVudE91dGxldGAgcmVxdWlyZXMgYSBjb21wb25lbnQgdHlwZSwgaWYgYSBmYWxzeSB2YWx1ZSBpcyBzZXQgdGhlIHZpZXcgd2lsbCBjbGVhciBhbmRcbiAqIGFueSBleGlzdGluZyBjb21wb25lbnQgd2lsbCBnZXQgZGVzdHJveWVkLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEZpbmUgdHVuZSBjb250cm9sXG4gKlxuICogWW91IGNhbiBjb250cm9sIHRoZSBjb21wb25lbnQgY3JlYXRpb24gcHJvY2VzcyBieSB1c2luZyB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIGF0dHJpYnV0ZXM6XG4gKlxuICogKiBgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcmA6IE9wdGlvbmFsIGN1c3RvbSB7QGxpbmsgSW5qZWN0b3J9IHRoYXQgd2lsbCBiZSB1c2VkIGFzIHBhcmVudCBmb3JcbiAqIHRoZSBDb21wb25lbnQuIERlZmF1bHRzIHRvIHRoZSBpbmplY3RvciBvZiB0aGUgY3VycmVudCB2aWV3IGNvbnRhaW5lci5cbiAqXG4gKiAqIGBuZ0NvbXBvbmVudE91dGxldENvbnRlbnRgOiBPcHRpb25hbCBsaXN0IG9mIHByb2plY3RhYmxlIG5vZGVzIHRvIGluc2VydCBpbnRvIHRoZSBjb250ZW50XG4gKiBzZWN0aW9uIG9mIHRoZSBjb21wb25lbnQsIGlmIGV4aXN0cy5cbiAqXG4gKiAqIGBuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeWA6IE9wdGlvbmFsIG1vZHVsZSBmYWN0b3J5IHRvIGFsbG93IGR5bmFtaWNhbGx5IGxvYWRpbmcgb3RoZXJcbiAqIG1vZHVsZSwgdGhlbiBsb2FkIGEgY29tcG9uZW50IGZyb20gdGhhdCBtb2R1bGUuXG4gKlxuICogIyMjIFN5bnRheFxuICpcbiAqIFNpbXBsZVxuICogYGBgXG4gKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD1cImNvbXBvbmVudFR5cGVFeHByZXNzaW9uXCI+PC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqXG4gKiBDdXN0b21pemVkIGluamVjdG9yL2NvbnRlbnRcbiAqIGBgYFxuICogPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9XCJjb21wb25lbnRUeXBlRXhwcmVzc2lvbjtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JFeHByZXNzaW9uO1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnROb2Rlc0V4cHJlc3Npb247XCI+XG4gKiA8L25nLWNvbnRhaW5lcj5cbiAqIGBgYFxuICpcbiAqIEN1c3RvbWl6ZWQgbmdNb2R1bGVGYWN0b3J5XG4gKiBgYGBcbiAqIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PVwiY29tcG9uZW50VHlwZUV4cHJlc3Npb247XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVGYWN0b3J5OiBtb2R1bGVGYWN0b3J5O1wiPlxuICogPC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqXG4gKiAjIyMgQSBzaW1wbGUgZXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vbmdDb21wb25lbnRPdXRsZXQvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nU2ltcGxlRXhhbXBsZSd9XG4gKlxuICogQSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6XG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9uZ0NvbXBvbmVudE91dGxldC90cy9tb2R1bGUudHMgcmVnaW9uPSdDb21wbGV0ZUV4YW1wbGUnfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqL1xudmFyIE5nQ29tcG9uZW50T3V0bGV0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nQ29tcG9uZW50T3V0bGV0KF92aWV3Q29udGFpbmVyUmVmKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbW9kdWxlUmVmID0gbnVsbDtcbiAgICB9XG4gICAgTmdDb21wb25lbnRPdXRsZXQucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5uZ0NvbXBvbmVudE91dGxldCkge1xuICAgICAgICAgICAgdmFyIGVsSW5qZWN0b3IgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3IgfHwgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvcjtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzWyduZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeSddKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZHVsZVJlZilcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50TW9kdWxlID0gZWxJbmplY3Rvci5nZXQoTmdNb2R1bGVSZWYpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5LmNyZWF0ZShwYXJlbnRNb2R1bGUuaW5qZWN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gdGhpcy5fbW9kdWxlUmVmID8gdGhpcy5fbW9kdWxlUmVmLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA6XG4gICAgICAgICAgICAgICAgZWxJbmplY3Rvci5nZXQoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMubmdDb21wb25lbnRPdXRsZXQpO1xuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsIGVsSW5qZWN0b3IsIHRoaXMubmdDb21wb25lbnRPdXRsZXRDb250ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdDb21wb25lbnRPdXRsZXQucHJvdG90eXBlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbW9kdWxlUmVmKVxuICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgVHlwZSlcbiAgICBdLCBOZ0NvbXBvbmVudE91dGxldC5wcm90b3R5cGUsIFwibmdDb21wb25lbnRPdXRsZXRcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEluamVjdG9yKVxuICAgIF0sIE5nQ29tcG9uZW50T3V0bGV0LnByb3RvdHlwZSwgXCJuZ0NvbXBvbmVudE91dGxldEluamVjdG9yXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBBcnJheSlcbiAgICBdLCBOZ0NvbXBvbmVudE91dGxldC5wcm90b3R5cGUsIFwibmdDb21wb25lbnRPdXRsZXRDb250ZW50XCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOZ01vZHVsZUZhY3RvcnkpXG4gICAgXSwgTmdDb21wb25lbnRPdXRsZXQucHJvdG90eXBlLCBcIm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5XCIsIHZvaWQgMCk7XG4gICAgTmdDb21wb25lbnRPdXRsZXQgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmdDb21wb25lbnRPdXRsZXRdJyB9KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtWaWV3Q29udGFpbmVyUmVmXSlcbiAgICBdLCBOZ0NvbXBvbmVudE91dGxldCk7XG4gICAgcmV0dXJuIE5nQ29tcG9uZW50T3V0bGV0O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ0Zvck9mQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0Zvck9mQ29udGV4dCgkaW1wbGljaXQsIG5nRm9yT2YsIGluZGV4LCBjb3VudCkge1xuICAgICAgICB0aGlzLiRpbXBsaWNpdCA9ICRpbXBsaWNpdDtcbiAgICAgICAgdGhpcy5uZ0Zvck9mID0gbmdGb3JPZjtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mQ29udGV4dC5wcm90b3R5cGUsIFwiZmlyc3RcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mQ29udGV4dC5wcm90b3R5cGUsIFwibGFzdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5jb3VudCAtIDE7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mQ29udGV4dC5wcm90b3R5cGUsIFwiZXZlblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5pbmRleCAlIDIgPT09IDA7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mQ29udGV4dC5wcm90b3R5cGUsIFwib2RkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAhdGhpcy5ldmVuOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gTmdGb3JPZkNvbnRleHQ7XG59KCkpO1xuLyoqXG4gKiBBIFtzdHJ1Y3R1cmFsIGRpcmVjdGl2ZV0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKSB0aGF0IHJlbmRlcnNcbiAqIGEgdGVtcGxhdGUgZm9yIGVhY2ggaXRlbSBpbiBhIGNvbGxlY3Rpb24uXG4gKiBUaGUgZGlyZWN0aXZlIGlzIHBsYWNlZCBvbiBhbiBlbGVtZW50LCB3aGljaCBiZWNvbWVzIHRoZSBwYXJlbnRcbiAqIG9mIHRoZSBjbG9uZWQgdGVtcGxhdGVzLlxuICpcbiAqIFRoZSBgbmdGb3JPZmAgZGlyZWN0aXZlIGlzIGdlbmVyYWxseSB1c2VkIGluIHRoZVxuICogW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIGAqbmdGb3JgLlxuICogSW4gdGhpcyBmb3JtLCB0aGUgdGVtcGxhdGUgdG8gYmUgcmVuZGVyZWQgZm9yIGVhY2ggaXRlcmF0aW9uIGlzIHRoZSBjb250ZW50XG4gKiBvZiBhbiBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBzaG9ydGhhbmQgc3ludGF4IHdpdGggc29tZSBvcHRpb25zLFxuICogY29udGFpbmVkIGluIGFuIGA8bGk+YCBlbGVtZW50LlxuICpcbiAqIGBgYFxuICogPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5Rm5cIj4uLi48L2xpPlxuICogYGBgXG4gKlxuICogVGhlIHNob3J0aGFuZCBmb3JtIGV4cGFuZHMgaW50byBhIGxvbmcgZm9ybSB0aGF0IHVzZXMgdGhlIGBuZ0Zvck9mYCBzZWxlY3RvclxuICogb24gYW4gYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuXG4gKiBUaGUgY29udGVudCBvZiB0aGUgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQgaXMgdGhlIGA8bGk+YCBlbGVtZW50IHRoYXQgaGVsZCB0aGVcbiAqIHNob3J0LWZvcm0gZGlyZWN0aXZlLlxuICpcbiAqIEhlcmUgaXMgdGhlIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIHNob3J0LWZvcm0gZXhhbXBsZS5cbiAqXG4gKiBgYGBcbiAqIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiIGxldC1pPVwiaW5kZXhcIiBbbmdGb3JUcmFja0J5XT1cInRyYWNrQnlGblwiPlxuICogICA8bGk+Li4uPC9saT5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqXG4gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgZXhwYW5kcyB0aGUgc2hvcnRoYW5kIHN5bnRheCBhcyBpdCBjb21waWxlcyB0aGUgdGVtcGxhdGUuXG4gKiBUaGUgY29udGV4dCBmb3IgZWFjaCBlbWJlZGRlZCB2aWV3IGlzIGxvZ2ljYWxseSBtZXJnZWQgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50XG4gKiBjb250ZXh0IGFjY29yZGluZyB0byBpdHMgbGV4aWNhbCBwb3NpdGlvbi5cbiAqXG4gKiBXaGVuIHVzaW5nIHRoZSBzaG9ydGhhbmQgc3ludGF4LCBBbmd1bGFyIGFsbG93cyBvbmx5IFtvbmUgc3RydWN0dXJhbCBkaXJlY3RpdmVcbiAqIG9uIGFuIGVsZW1lbnRdKGd1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcyNvbmUtc3RydWN0dXJhbC1kaXJlY3RpdmUtcGVyLWhvc3QtZWxlbWVudCkuXG4gKiBJZiB5b3Ugd2FudCB0byBpdGVyYXRlIGNvbmRpdGlvbmFsbHksIGZvciBleGFtcGxlLFxuICogcHV0IHRoZSBgKm5nSWZgIG9uIGEgY29udGFpbmVyIGVsZW1lbnQgdGhhdCB3cmFwcyB0aGUgYCpuZ0ZvcmAgZWxlbWVudC5cbiAqIEZvciBmdXRoZXIgZGlzY3Vzc2lvbiwgc2VlXG4gKiBbU3RydWN0dXJhbCBEaXJlY3RpdmVzXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjb25lLXBlci1lbGVtZW50KS5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBMb2NhbCB2YXJpYWJsZXNcbiAqXG4gKiBgTmdGb3JPZmAgcHJvdmlkZXMgZXhwb3J0ZWQgdmFsdWVzIHRoYXQgY2FuIGJlIGFsaWFzZWQgdG8gbG9jYWwgdmFyaWFibGVzLlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogIGBgYFxuICogPGxpICpuZ0Zvcj1cImxldCB1c2VyIG9mIHVzZXJPYnNlcnZhYmxlIHwgYXN5bmMgYXMgdXNlcnM7IGluZGV4IGFzIGk7IGZpcnN0IGFzIGlzRmlyc3RcIj5cbiAqICAgIHt7aX19L3t7dXNlcnMubGVuZ3RofX0uIHt7dXNlcn19IDxzcGFuICpuZ0lmPVwiaXNGaXJzdFwiPmRlZmF1bHQ8L3NwYW4+XG4gKiA8L2xpPlxuICogYGBgXG4gKlxuICogVGhlIGZvbGxvd2luZyBleHBvcnRlZCB2YWx1ZXMgY2FuIGJlIGFsaWFzZWQgdG8gbG9jYWwgdmFyaWFibGVzOlxuICpcbiAqIC0gYCRpbXBsaWNpdDogVGA6IFRoZSB2YWx1ZSBvZiB0aGUgaW5kaXZpZHVhbCBpdGVtcyBpbiB0aGUgaXRlcmFibGUgKGBuZ0Zvck9mYCkuXG4gKiAtIGBuZ0Zvck9mOiBOZ0l0ZXJhYmxlPFQ+YDogVGhlIHZhbHVlIG9mIHRoZSBpdGVyYWJsZSBleHByZXNzaW9uLiBVc2VmdWwgd2hlbiB0aGUgZXhwcmVzc2lvbiBpc1xuICogbW9yZSBjb21wbGV4IHRoZW4gYSBwcm9wZXJ0eSBhY2Nlc3MsIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgdGhlIGFzeW5jIHBpcGUgKGB1c2VyU3RyZWFtcyB8XG4gKiBhc3luY2ApLlxuICogLSBgaW5kZXg6IG51bWJlcmA6IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBpdGVyYWJsZS5cbiAqIC0gYGZpcnN0OiBib29sZWFuYDogVHJ1ZSB3aGVuIHRoZSBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS5cbiAqIC0gYGxhc3Q6IGJvb2xlYW5gOiBUcnVlIHdoZW4gdGhlIGl0ZW0gaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgaXRlcmFibGUuXG4gKiAtIGBldmVuOiBib29sZWFuYDogVHJ1ZSB3aGVuIHRoZSBpdGVtIGhhcyBhbiBldmVuIGluZGV4IGluIHRoZSBpdGVyYWJsZS5cbiAqIC0gYG9kZDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBoYXMgYW4gb2RkIGluZGV4IGluIHRoZSBpdGVyYWJsZS5cbiAqXG4gKiAjIyMgQ2hhbmdlIHByb3BhZ2F0aW9uXG4gKlxuICogV2hlbiB0aGUgY29udGVudHMgb2YgdGhlIGl0ZXJhdG9yIGNoYW5nZXMsIGBOZ0Zvck9mYCBtYWtlcyB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRvIHRoZSBET006XG4gKlxuICogKiBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQsIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpcyBhZGRlZCB0byB0aGUgRE9NLlxuICogKiBXaGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCwgaXRzIHRlbXBsYXRlIGluc3RhbmNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICogKiBXaGVuIGl0ZW1zIGFyZSByZW9yZGVyZWQsIHRoZWlyIHJlc3BlY3RpdmUgdGVtcGxhdGVzIGFyZSByZW9yZGVyZWQgaW4gdGhlIERPTS5cbiAqXG4gKiBBbmd1bGFyIHVzZXMgb2JqZWN0IGlkZW50aXR5IHRvIHRyYWNrIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucyB3aXRoaW4gdGhlIGl0ZXJhdG9yIGFuZCByZXByb2R1Y2VcbiAqIHRob3NlIGNoYW5nZXMgaW4gdGhlIERPTS4gVGhpcyBoYXMgaW1wb3J0YW50IGltcGxpY2F0aW9ucyBmb3IgYW5pbWF0aW9ucyBhbmQgYW55IHN0YXRlZnVsXG4gKiBjb250cm9scyB0aGF0IGFyZSBwcmVzZW50LCBzdWNoIGFzIGA8aW5wdXQ+YCBlbGVtZW50cyB0aGF0IGFjY2VwdCB1c2VyIGlucHV0LiBJbnNlcnRlZCByb3dzIGNhblxuICogYmUgYW5pbWF0ZWQgaW4sIGRlbGV0ZWQgcm93cyBjYW4gYmUgYW5pbWF0ZWQgb3V0LCBhbmQgdW5jaGFuZ2VkIHJvd3MgcmV0YWluIGFueSB1bnNhdmVkIHN0YXRlXG4gKiBzdWNoIGFzIHVzZXIgaW5wdXQuXG4gKiBGb3IgbW9yZSBvbiBhbmltYXRpb25zLCBzZWUgW1RyYW5zaXRpb25zIGFuZCBUcmlnZ2Vyc10oZ3VpZGUvdHJhbnNpdGlvbi1hbmQtdHJpZ2dlcnMpLlxuICpcbiAqIFRoZSBpZGVudGl0aWVzIG9mIGVsZW1lbnRzIGluIHRoZSBpdGVyYXRvciBjYW4gY2hhbmdlIHdoaWxlIHRoZSBkYXRhIGRvZXMgbm90LlxuICogVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIGlzIHByb2R1Y2VkIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0XG4gKiBSUEMgaXMgcmUtcnVuLiBFdmVuIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLCB0aGUgc2Vjb25kIHJlc3BvbnNlIHByb2R1Y2VzIG9iamVjdHMgd2l0aFxuICogZGlmZmVyZW50IGlkZW50aXRpZXMsIGFuZCBBbmd1bGFyIG11c3QgdGVhciBkb3duIHRoZSBlbnRpcmUgRE9NIGFuZCByZWJ1aWxkIGl0IChhcyBpZiBhbGwgb2xkXG4gKiBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgYW5kIGFsbCBuZXcgZWxlbWVudHMgaW5zZXJ0ZWQpLlxuICpcbiAqIFRvIGF2b2lkIHRoaXMgZXhwZW5zaXZlIG9wZXJhdGlvbiwgeW91IGNhbiBjdXN0b21pemUgdGhlIGRlZmF1bHQgdHJhY2tpbmcgYWxnb3JpdGhtLlxuICogYnkgc3VwcGx5aW5nIHRoZSBgdHJhY2tCeWAgb3B0aW9uIHRvIGBOZ0Zvck9mYC5cbiAqIGB0cmFja0J5YCB0YWtlcyBhIGZ1bmN0aW9uIHRoYXQgaGFzIHR3byBhcmd1bWVudHM6IGBpbmRleGAgYW5kIGBpdGVtYC5cbiAqIElmIGB0cmFja0J5YCBpcyBnaXZlbiwgQW5ndWxhciB0cmFja3MgY2hhbmdlcyBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBAc2VlIFtTdHJ1Y3R1cmFsIERpcmVjdGl2ZXNdKGd1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcylcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nRm9yT2YgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdGb3JPZihfdmlld0NvbnRhaW5lciwgX3RlbXBsYXRlLCBfZGlmZmVycykge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyID0gX3ZpZXdDb250YWluZXI7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlID0gX3RlbXBsYXRlO1xuICAgICAgICB0aGlzLl9kaWZmZXJzID0gX2RpZmZlcnM7XG4gICAgICAgIHRoaXMuX25nRm9yT2ZEaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mLnByb3RvdHlwZSwgXCJuZ0Zvck9mXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaXRlcmFibGUgZXhwcmVzc2lvbiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYVxuICAgICAgICAgKiBbdGVtcGxhdGUgaW5wdXQgdmFyaWFibGVdKGd1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcyN0ZW1wbGF0ZS1pbnB1dC12YXJpYWJsZSkuXG4gICAgICAgICAqL1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZ0Zvck9mKSB7XG4gICAgICAgICAgICB0aGlzLl9uZ0Zvck9mID0gbmdGb3JPZjtcbiAgICAgICAgICAgIHRoaXMuX25nRm9yT2ZEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mLnByb3RvdHlwZSwgXCJuZ0ZvclRyYWNrQnlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3RyYWNrQnlGbjsgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGhvdyB0byB0cmFjayBjaGFuZ2VzIGZvciBpdGVtcyBpbiB0aGUgaXRlcmFibGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFdoZW4gaXRlbXMgYXJlIGFkZGVkLCBtb3ZlZCwgb3IgcmVtb3ZlZCBpbiB0aGUgaXRlcmFibGUsXG4gICAgICAgICAqIHRoZSBkaXJlY3RpdmUgbXVzdCByZS1yZW5kZXIgdGhlIGFwcHJvcHJpYXRlIERPTSBub2Rlcy5cbiAgICAgICAgICogVG8gbWluaW1pemUgY2h1cm4gaW4gdGhlIERPTSwgb25seSBub2RlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgKiBhcmUgcmUtcmVuZGVyZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYXNzdW1lcyB0aGF0XG4gICAgICAgICAqIHRoZSBvYmplY3QgaW5zdGFuY2UgaWRlbnRpZmllcyB0aGUgbm9kZSBpbiB0aGUgaXRlcmFibGUuXG4gICAgICAgICAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBzdXBwbGllZCwgdGhlIGRpcmVjdGl2ZSB1c2VzXG4gICAgICAgICAqIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvIGlkZW50aWZ5IHRoZSBpdGVtIG5vZGUsXG4gICAgICAgICAqIHJhdGhlciB0aGFuIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0IGl0c2VsZi5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byBpbnB1dHMsXG4gICAgICAgICAqIHRoZSBpdGVyYXRpb24gaW5kZXggYW5kIHRoZSBub2RlIG9iamVjdCBJRC5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgZm4gIT0gbnVsbCAmJiB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOiB1c2UgYSBsb2cgc2VydmljZSBvbmNlIHRoZXJlIGlzIGEgcHVibGljIG9uZSBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwidHJhY2tCeSBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCBcIiArIEpTT04uc3RyaW5naWZ5KGZuKSArIFwiLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNlZSBodHRwczovL2FuZ3VsYXIuaW8vZG9jcy90cy9sYXRlc3QvYXBpL2NvbW1vbi9pbmRleC9OZ0Zvci1kaXJlY3RpdmUuaHRtbCMhI2NoYW5nZS1wcm9wYWdhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdHJhY2tCeUZuID0gZm47XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvck9mLnByb3RvdHlwZSwgXCJuZ0ZvclRlbXBsYXRlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZSB0aGF0IGlzIHN0YW1wZWQgb3V0IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGl0ZXJhYmxlLlxuICAgICAgICAgKiBAc2VlIFt0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGVdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCN0ZW1wbGF0ZS1yZWZlcmVuY2UtdmFyaWFibGVzLS12YXItKVxuICAgICAgICAgKi9cbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oVFMyLjEpOiBtYWtlIFRlbXBsYXRlUmVmPFBhcnRpYWw8TmdGb3JSb3dPZjxUPj4+IG9uY2Ugd2UgbW92ZSB0byBUUyB2Mi4xXG4gICAgICAgICAgICAvLyBUaGUgY3VycmVudCB0eXBlIGlzIHRvbyByZXN0cmljdGl2ZTsgYSB0ZW1wbGF0ZSB0aGF0IGp1c3QgdXNlcyBpbmRleCwgZm9yIGV4YW1wbGUsXG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgYWNjZXB0YWJsZS5cbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIGNoYW5nZXMgd2hlbiBuZWVkZWQuXG4gICAgICovXG4gICAgTmdGb3JPZi5wcm90b3R5cGUubmdEb0NoZWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fbmdGb3JPZkRpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJlYWN0IG9uIG5nRm9yT2YgY2hhbmdlcyBvbmx5IG9uY2UgYWxsIGlucHV0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWRcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX25nRm9yT2Y7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKHRoaXMubmdGb3JUcmFja0J5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICdcIiArIHZhbHVlICsgXCInIG9mIHR5cGUgJ1wiICsgZ2V0VHlwZU5hbWUodmFsdWUpICsgXCInLiBOZ0ZvciBvbmx5IHN1cHBvcnRzIGJpbmRpbmcgdG8gSXRlcmFibGVzIHN1Y2ggYXMgQXJyYXlzLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RpZmZlcikge1xuICAgICAgICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9uZ0Zvck9mKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VzKVxuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdGb3JPZi5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBpbnNlcnRUdXBsZXMgPSBbXTtcbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoT3BlcmF0aW9uKGZ1bmN0aW9uIChpdGVtLCBhZGp1c3RlZFByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucHJldmlvdXNJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBfdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoX3RoaXMuX3RlbXBsYXRlLCBuZXcgTmdGb3JPZkNvbnRleHQobnVsbCwgX3RoaXMuX25nRm9yT2YsIC0xLCAtMSksIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gbmV3IFJlY29yZFZpZXdUdXBsZShpdGVtLCB2aWV3KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRUdXBsZXMucHVzaCh0dXBsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50SW5kZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl92aWV3Q29udGFpbmVyLnJlbW92ZShhZGp1c3RlZFByZXZpb3VzSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBfdGhpcy5fdmlld0NvbnRhaW5lci5nZXQoYWRqdXN0ZWRQcmV2aW91c0luZGV4KTtcbiAgICAgICAgICAgICAgICBfdGhpcy5fdmlld0NvbnRhaW5lci5tb3ZlKHZpZXcsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gbmV3IFJlY29yZFZpZXdUdXBsZShpdGVtLCB2aWV3KTtcbiAgICAgICAgICAgICAgICBpbnNlcnRUdXBsZXMucHVzaCh0dXBsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluc2VydFR1cGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fcGVyVmlld0NoYW5nZShpbnNlcnRUdXBsZXNbaV0udmlldywgaW5zZXJ0VHVwbGVzW2ldLnJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlsZW4gPSB0aGlzLl92aWV3Q29udGFpbmVyLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyLmdldChpKTtcbiAgICAgICAgICAgIHZpZXdSZWYuY29udGV4dC5pbmRleCA9IGk7XG4gICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuY291bnQgPSBpbGVuO1xuICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0Lm5nRm9yT2YgPSB0aGlzLl9uZ0Zvck9mO1xuICAgICAgICB9XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZ1bmN0aW9uIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHZhciB2aWV3UmVmID0gX3RoaXMuX3ZpZXdDb250YWluZXIuZ2V0KHJlY29yZC5jdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE5nRm9yT2YucHJvdG90eXBlLl9wZXJWaWV3Q2hhbmdlID0gZnVuY3Rpb24gKHZpZXcsIHJlY29yZCkge1xuICAgICAgICB2aWV3LmNvbnRleHQuJGltcGxpY2l0ID0gcmVjb3JkLml0ZW07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBc3NlcnRzIHRoZSBjb3JyZWN0IHR5cGUgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSB0ZW1wbGF0ZSB0aGF0IGBOZ0Zvck9mYCB3aWxsIHJlbmRlci5cbiAgICAgKlxuICAgICAqIFRoZSBwcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHNpZ25hbCB0byB0aGUgSXZ5IHRlbXBsYXRlIHR5cGUtY2hlY2sgY29tcGlsZXIgdGhhdCB0aGVcbiAgICAgKiBgTmdGb3JPZmAgc3RydWN0dXJhbCBkaXJlY3RpdmUgcmVuZGVycyBpdHMgdGVtcGxhdGUgd2l0aCBhIHNwZWNpZmljIGNvbnRleHQgdHlwZS5cbiAgICAgKi9cbiAgICBOZ0Zvck9mLm5nVGVtcGxhdGVDb250ZXh0R3VhcmQgPSBmdW5jdGlvbiAoZGlyLCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCBOZ0Zvck9mLnByb3RvdHlwZSwgXCJuZ0Zvck9mXCIsIG51bGwpO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0Z1bmN0aW9uXSlcbiAgICBdLCBOZ0Zvck9mLnByb3RvdHlwZSwgXCJuZ0ZvclRyYWNrQnlcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBUZW1wbGF0ZVJlZiksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbVGVtcGxhdGVSZWZdKVxuICAgIF0sIE5nRm9yT2YucHJvdG90eXBlLCBcIm5nRm9yVGVtcGxhdGVcIiwgbnVsbCk7XG4gICAgTmdGb3JPZiA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ0Zvcl1bbmdGb3JPZl0nIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1ZpZXdDb250YWluZXJSZWYsIFRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgSXRlcmFibGVEaWZmZXJzXSlcbiAgICBdLCBOZ0Zvck9mKTtcbiAgICByZXR1cm4gTmdGb3JPZjtcbn0oKSk7XG52YXIgUmVjb3JkVmlld1R1cGxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlY29yZFZpZXdUdXBsZShyZWNvcmQsIHZpZXcpIHtcbiAgICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgfVxuICAgIHJldHVybiBSZWNvcmRWaWV3VHVwbGU7XG59KCkpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWUodHlwZSkge1xuICAgIHJldHVybiB0eXBlWyduYW1lJ10gfHwgdHlwZW9mIHR5cGU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB0aGF0IGNvbmRpdGlvbmFsbHkgaW5jbHVkZXMgYSB0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2ZcbiAqIGFuIGV4cHJlc3Npb24gY29lcmNlZCB0byBCb29sZWFuLlxuICogV2hlbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZSwgQW5ndWxhciByZW5kZXJzIHRoZSB0ZW1wbGF0ZVxuICogcHJvdmlkZWQgaW4gYSBgdGhlbmAgY2xhdXNlLCBhbmQgd2hlbiAgZmFsc2Ugb3IgbnVsbCxcbiAqIEFuZ3VsYXIgcmVuZGVycyB0aGUgdGVtcGxhdGUgcHJvdmlkZWQgaW4gYW4gb3B0aW9uYWwgYGVsc2VgIGNsYXVzZS4gVGhlIGRlZmF1bHRcbiAqIHRlbXBsYXRlIGZvciB0aGUgYGVsc2VgIGNsYXVzZSBpcyBibGFuay5cbiAqXG4gKiBBIFtzaG9ydGhhbmQgZm9ybV0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI3RoZS1hc3Rlcmlzay0tcHJlZml4KSBvZiB0aGUgZGlyZWN0aXZlLFxuICogYCpuZ0lmPVwiY29uZGl0aW9uXCJgLCBpcyBnZW5lcmFsbHkgdXNlZCwgcHJvdmlkZWRcbiAqIGFzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgYW5jaG9yIGVsZW1lbnQgZm9yIHRoZSBpbnNlcnRlZCB0ZW1wbGF0ZS5cbiAqIEFuZ3VsYXIgZXhwYW5kcyB0aGlzIGludG8gYSBtb3JlIGV4cGxpY2l0IHZlcnNpb24sIGluIHdoaWNoIHRoZSBhbmNob3IgZWxlbWVudFxuICogaXMgY29udGFpbmVkIGluIGFuIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LlxuICpcbiAqIFNpbXBsZSBmb3JtIHdpdGggc2hvcnRoYW5kIHN5bnRheDpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgKm5nSWY9XCJjb25kaXRpb25cIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PlxuICogYGBgXG4gKlxuICogU2ltcGxlIGZvcm0gd2l0aCBleHBhbmRlZCBzeW50YXg6XG4gKlxuICogYGBgXG4gKiA8bmctdGVtcGxhdGUgW25nSWZdPVwiY29uZGl0aW9uXCI+PGRpdj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpc1xuICogdHJ1ZS48L2Rpdj48L25nLXRlbXBsYXRlPlxuICogYGBgXG4gKlxuICogRm9ybSB3aXRoIGFuIFwiZWxzZVwiIGJsb2NrOlxuICpcbiAqIGBgYFxuICogPGRpdiAqbmdJZj1cImNvbmRpdGlvbjsgZWxzZSBlbHNlQmxvY2tcIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PlxuICogPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgZmFsc2UuPC9uZy10ZW1wbGF0ZT5cbiAqIGBgYFxuICpcbiAqIFNob3J0aGFuZCBmb3JtIHdpdGggXCJ0aGVuXCIgYW5kIFwiZWxzZVwiIGJsb2NrczpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgKm5nSWY9XCJjb25kaXRpb247IHRoZW4gdGhlbkJsb2NrIGVsc2UgZWxzZUJsb2NrXCI+PC9kaXY+XG4gKiA8bmctdGVtcGxhdGUgI3RoZW5CbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvbmctdGVtcGxhdGU+XG4gKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPlxuICogYGBgXG4gKlxuICogRm9ybSB3aXRoIHN0b3JpbmcgdGhlIHZhbHVlIGxvY2FsbHk6XG4gKlxuICogYGBgXG4gKiA8ZGl2ICpuZ0lmPVwiY29uZGl0aW9uIGFzIHZhbHVlOyBlbHNlIGVsc2VCbG9ja1wiPnt7dmFsdWV9fTwvZGl2PlxuICogPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiB2YWx1ZSBpcyBudWxsLjwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqIFRoZSBgKm5nSWZgIGRpcmVjdGl2ZSBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gY29uZGl0aW9uYWxseSBzaG93IGFuIGlubGluZSB0ZW1wbGF0ZSxcbiAqIGFzIHNlZW4gaW4gdGhlIGZvbGxvd2luZyAgZXhhbXBsZS5cbiAqIFRoZSBkZWZhdWx0IGBlbHNlYCB0ZW1wbGF0ZSBpcyBibGFuay5cbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZlNpbXBsZSd9XG4gKlxuICogIyMjIFNob3dpbmcgYW4gYWx0ZXJuYXRpdmUgdGVtcGxhdGUgdXNpbmcgYGVsc2VgXG4gKlxuICogVG8gZGlzcGxheSBhIHRlbXBsYXRlIHdoZW4gYGV4cHJlc3Npb25gIGV2YWx1YXRlcyB0byBmYWxzZSwgdXNlIGFuIGBlbHNlYCB0ZW1wbGF0ZVxuICogYmluZGluZyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuXG4gKiBUaGUgYGVsc2VgIGJpbmRpbmcgcG9pbnRzIHRvIGFuIGA8bmctdGVtcGxhdGU+YCAgZWxlbWVudCBsYWJlbGVkIGAjZWxzZUJsb2NrYC5cbiAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgY29tcG9uZW50IHZpZXcsIGJ1dCBpcyB0eXBpY2FsbHkgcGxhY2VkIHJpZ2h0IGFmdGVyXG4gKiBgbmdJZmAgZm9yIHJlYWRhYmlsaXR5LlxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vbmdJZi90cy9tb2R1bGUudHMgcmVnaW9uPSdOZ0lmRWxzZSd9XG4gKlxuICogIyMjIFVzaW5nIGFuIGV4dGVybmFsIGB0aGVuYCB0ZW1wbGF0ZVxuICpcbiAqIEluIHRoZSBwcmV2aW91cyBleGFtcGxlLCB0aGUgdGhlbi1jbGF1c2UgdGVtcGxhdGUgaXMgc3BlY2lmaWVkIGlubGluZSwgYXMgdGhlIGNvbnRlbnQgb2YgdGhlXG4gKiB0YWcgdGhhdCBjb250YWlucyB0aGUgYG5nSWZgIGRpcmVjdGl2ZS4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB0ZW1wbGF0ZSB0aGF0IGlzIGRlZmluZWRcbiAqIGV4dGVybmFsbHksIGJ5IHJlZmVyZW5jaW5nIGEgbGFiZWxlZCBgPG5nLXRlbXBsYXRlPmAgZWxlbWVudC4gV2hlbiB5b3UgZG8gdGhpcywgeW91IGNhblxuICogY2hhbmdlIHdoaWNoIHRlbXBsYXRlIHRvIHVzZSBhdCBydW50aW1lLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZUaGVuRWxzZSd9XG4gKlxuICogIyMjIFN0b3JpbmcgYSBjb25kaXRpb25hbCByZXN1bHQgaW4gYSB2YXJpYWJsZVxuICpcbiAqIFlvdSBtaWdodCB3YW50IHRvIHNob3cgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBzYW1lIG9iamVjdC4gSWYgeW91IGFyZSB3YWl0aW5nXG4gKiBmb3IgYXN5bmNocm9ub3VzIGRhdGEsIHRoZSBvYmplY3QgY2FuIGJlIHVuZGVmaW5lZC5cbiAqIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYG5nSWZgIGFuZCBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24gaW4gYSBsb2NhbFxuICogdmFyaWFibGUgYXMgc2hvd24gaW4gdGhlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS5cbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZkFzJ31cbiAqXG4gKiBUaGlzIGNvZGUgdXNlcyBvbmx5IG9uZSBgQXN5bmNQaXBlYCwgc28gb25seSBvbmUgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQuXG4gKiBUaGUgY29uZGl0aW9uYWwgc3RhdGVtZW50IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGB1c2VyU3RyZWFtfGFzeW5jYCBpbiB0aGUgbG9jYWwgdmFyaWFibGUgYHVzZXJgLlxuICogWW91IGNhbiB0aGVuIGJpbmQgdGhlIGxvY2FsIGB1c2VyYCByZXBlYXRlZGx5LlxuICpcbiAqIFRoZSBjb25kaXRpb25hbCBkaXNwbGF5cyB0aGUgZGF0YSBvbmx5IGlmIGB1c2VyU3RyZWFtYCByZXR1cm5zIGEgdmFsdWUsXG4gKiBzbyB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhlXG4gKiBbc2FmZS1uYXZpZ2F0aW9uLW9wZXJhdG9yXShndWlkZS90ZW1wbGF0ZS1zeW50YXgjc2FmZS1uYXZpZ2F0aW9uLW9wZXJhdG9yKSAoYD8uYClcbiAqIHRvIGd1YXJkIGFnYWluc3QgbnVsbCB2YWx1ZXMgd2hlbiBhY2Nlc3NpbmcgcHJvcGVydGllcy5cbiAqIFlvdSBjYW4gZGlzcGxheSBhbiBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZGF0YS5cbiAqXG4gKiAjIyMgU2hvcnRoYW5kIHN5bnRheFxuICpcbiAqIFRoZSBzaG9ydGhhbmQgc3ludGF4IGAqbmdJZmAgZXhwYW5kcyBpbnRvIHR3byBzZXBhcmF0ZSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uc1xuICogZm9yIHRoZSBcInRoZW5cIiBhbmQgXCJlbHNlXCIgY2xhdXNlcy4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc2hvcnRoYW5kIHN0YXRlbWVudCxcbiAqIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyBhIGxvYWRpbmcgcGFnZSB3aGlsZSB3YWl0aW5nIGZvciBkYXRhIHRvIGJlIGxvYWRlZC5cbiAqXG4gKiBgYGBcbiAqIDxkaXYgY2xhc3M9XCJoZXJvLWxpc3RcIiAqbmdJZj1cImhlcm9lcyBlbHNlIGxvYWRpbmdcIj5cbiAqICAuLi5cbiAqIDwvZGl2PlxuICpcbiAqIDxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAqICA8ZGl2PkxvYWRpbmcuLi48L2Rpdj5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIHNlZSB0aGF0IHRoZSBcImVsc2VcIiBjbGF1c2UgcmVmZXJlbmNlcyB0aGUgYDxuZy10ZW1wbGF0ZT5gXG4gKiB3aXRoIHRoZSBgI2xvYWRpbmdgIGxhYmVsLCBhbmQgdGhlIHRlbXBsYXRlIGZvciB0aGUgXCJ0aGVuXCIgY2xhdXNlXG4gKiBpcyBwcm92aWRlZCBhcyB0aGUgY29udGVudCBvZiB0aGUgYW5jaG9yIGVsZW1lbnQuXG4gKlxuICogSG93ZXZlciwgd2hlbiBBbmd1bGFyIGV4cGFuZHMgdGhlIHNob3J0aGFuZCBzeW50YXgsIGl0IGNyZWF0ZXNcbiAqIGFub3RoZXIgYDxuZy10ZW1wbGF0ZT5gIHRhZywgd2l0aCBgbmdJZmAgYW5kIGBuZ0lmRWxzZWAgZGlyZWN0aXZlcy5cbiAqIFRoZSBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIFwidGhlblwiIGNsYXVzZSBiZWNvbWVzXG4gKiB0aGUgY29udGVudCBvZiB0aGlzIHVubGFiZWxlZCBgPG5nLXRlbXBsYXRlPmAgdGFnLlxuICpcbiAqIGBgYFxuICogPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImhlcm8tbGlzdFwiIFtuZ0lmRWxzZV09XCJsb2FkaW5nXCI+XG4gKiAgPGRpdiBjbGFzcz1cImhlcm8tbGlzdFwiPlxuICogICAuLi5cbiAqICA8L2Rpdj5cbiAqIDwvbmctdGVtcGxhdGU+XG4gKlxuICogPG5nLXRlbXBsYXRlICNsb2FkaW5nPlxuICogIDxkaXY+TG9hZGluZy4uLjwvZGl2PlxuICogPC9uZy10ZW1wbGF0ZT5cbiAqIGBgYFxuICpcbiAqIFRoZSBwcmVzZW5jZSBvZiB0aGUgaW1wbGljaXQgdGVtcGxhdGUgb2JqZWN0IGhhcyBpbXBsaWNhdGlvbnMgZm9yIHRoZSBuZXN0aW5nIG9mXG4gKiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMuIEZvciBtb3JlIG9uIHRoaXMgc3ViamVjdCwgc2VlXG4gKiBbU3RydWN0dXJhbCBEaXJlY3RpdmVzXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1wZXItZWxlbWVudCkuXG4gKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdJZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0lmKF92aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyID0gX3ZpZXdDb250YWluZXI7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXcgTmdJZkNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZWxzZVRlbXBsYXRlUmVmID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdJZi5wcm90b3R5cGUsIFwibmdJZlwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgQm9vbGVhbiBleHByZXNzaW9uIHRvIGV2YWx1YXRlIGFzIHRoZSBjb25kaXRpb24gZm9yIHNob3dpbmcgYSB0ZW1wbGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dC4kaW1wbGljaXQgPSB0aGlzLl9jb250ZXh0Lm5nSWYgPSBjb25kaXRpb247XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVWaWV3KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0lmLnByb3RvdHlwZSwgXCJuZ0lmVGhlblwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHRlbXBsYXRlIHRvIHNob3cgaWYgdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgIGFzc2VydFRlbXBsYXRlKCduZ0lmVGhlbicsIHRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgIHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgICAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsOyAvLyBjbGVhciBwcmV2aW91cyB2aWV3IGlmIGFueS5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nSWYucHJvdG90eXBlLCBcIm5nSWZFbHNlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgdGVtcGxhdGUgdG8gc2hvdyBpZiB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgIGFzc2VydFRlbXBsYXRlKCduZ0lmRWxzZScsIHRlbXBsYXRlUmVmKTtcbiAgICAgICAgICAgIHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOyAvLyBjbGVhciBwcmV2aW91cyB2aWV3IGlmIGFueS5cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgTmdJZi5wcm90b3R5cGUuX3VwZGF0ZVZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZXh0LiRpbXBsaWNpdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl90aGVuVmlld1JlZikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RoZW5UZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aGVuVmlld1JlZiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90aGVuVGVtcGxhdGVSZWYsIHRoaXMuX2NvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZWxzZVZpZXdSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbHNlVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fZWxzZVRlbXBsYXRlUmVmLCB0aGlzLl9jb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFzc2VydCB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGJvdW5kIHRvIHRoZSBgbmdJZmAgaW5wdXQgd2l0aGluIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKlxuICAgICAqIFRoZSBwcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHNpZ25hbCB0byB0aGUgSXZ5IHRlbXBsYXRlIHR5cGUgY2hlY2sgY29tcGlsZXIgdGhhdCB3aGVuIHRoZVxuICAgICAqIGBOZ0lmYCBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSByZW5kZXJzIGl0cyB0ZW1wbGF0ZSwgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gYm91bmQgdG8gYG5nSWZgXG4gICAgICogc2hvdWxkIGJlIG5hcnJvd2VkIGluIHNvbWUgd2F5LiBGb3IgYE5nSWZgLCBpdCBpcyBuYXJyb3dlZCB0byBiZSBub24tbnVsbCwgd2hpY2ggYWxsb3dzIHRoZVxuICAgICAqIHN0cmljdE51bGxDaGVja3MgZmVhdHVyZSBvZiBUeXBlU2NyaXB0IHRvIHdvcmsgd2l0aCBgTmdJZmAuXG4gICAgICovXG4gICAgTmdJZi5uZ1RlbXBsYXRlR3VhcmRfbmdJZiA9IGZ1bmN0aW9uIChkaXIsIGV4cHIpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgTmdJZi5wcm90b3R5cGUsIFwibmdJZlwiLCBudWxsKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCBOZ0lmLnByb3RvdHlwZSwgXCJuZ0lmVGhlblwiLCBudWxsKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCBOZ0lmLnByb3RvdHlwZSwgXCJuZ0lmRWxzZVwiLCBudWxsKTtcbiAgICBOZ0lmID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nSWZdJyB9KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtWaWV3Q29udGFpbmVyUmVmLCBUZW1wbGF0ZVJlZl0pXG4gICAgXSwgTmdJZik7XG4gICAgcmV0dXJuIE5nSWY7XG59KCkpO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ0lmQ29udGV4dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ0lmQ29udGV4dCgpIHtcbiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSBudWxsO1xuICAgICAgICB0aGlzLm5nSWYgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gTmdJZkNvbnRleHQ7XG59KCkpO1xuZnVuY3Rpb24gYXNzZXJ0VGVtcGxhdGUocHJvcGVydHksIHRlbXBsYXRlUmVmKSB7XG4gICAgdmFyIGlzVGVtcGxhdGVSZWZPck51bGwgPSAhISghdGVtcGxhdGVSZWYgfHwgdGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KTtcbiAgICBpZiAoIWlzVGVtcGxhdGVSZWZPck51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByb3BlcnR5ICsgXCIgbXVzdCBiZSBhIFRlbXBsYXRlUmVmLCBidXQgcmVjZWl2ZWQgJ1wiICsgybVzdHJpbmdpZnkodGVtcGxhdGVSZWYpICsgXCInLlwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBTd2l0Y2hWaWV3ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFN3aXRjaFZpZXcoX3ZpZXdDb250YWluZXJSZWYsIF90ZW1wbGF0ZVJlZikge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlUmVmID0gX3RlbXBsYXRlUmVmO1xuICAgICAgICB0aGlzLl9jcmVhdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIFN3aXRjaFZpZXcucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICB9O1xuICAgIFN3aXRjaFZpZXcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgIH07XG4gICAgU3dpdGNoVmlldy5wcm90b3R5cGUuZW5mb3JjZVN0YXRlID0gZnVuY3Rpb24gKGNyZWF0ZWQpIHtcbiAgICAgICAgaWYgKGNyZWF0ZWQgJiYgIXRoaXMuX2NyZWF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWF0ZWQgJiYgdGhpcy5fY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBTd2l0Y2hWaWV3O1xufSgpKTtcbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICpcbiAqIEBkZXNjcmlwdGlvbiBBIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHRoYXQgYWRkcyBvciByZW1vdmVzIHRlbXBsYXRlcyAoZGlzcGxheWluZyBvciBoaWRpbmcgdmlld3MpXG4gKiB3aGVuIHRoZSBuZXh0IG1hdGNoIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogVGhlIGBbbmdTd2l0Y2hdYCBkaXJlY3RpdmUgb24gYSBjb250YWluZXIgc3BlY2lmaWVzIGFuIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIFRoZSBleHByZXNzaW9ucyB0byBtYXRjaCBhcmUgcHJvdmlkZWQgYnkgYG5nU3dpdGNoQ2FzZWAgZGlyZWN0aXZlcyBvbiB2aWV3cyB3aXRoaW4gdGhlIGNvbnRhaW5lci5cbiAqIC0gRXZlcnkgdmlldyB0aGF0IG1hdGNoZXMgaXMgcmVuZGVyZWQuXG4gKiAtIElmIHRoZXJlIGFyZSBubyBtYXRjaGVzLCBhIHZpZXcgd2l0aCB0aGUgYG5nU3dpdGNoRGVmYXVsdGAgZGlyZWN0aXZlIGlzIHJlbmRlcmVkLlxuICogLSBFbGVtZW50cyB3aXRoaW4gdGhlIGBbTmdTd2l0Y2hdYCBzdGF0ZW1lbnQgYnV0IG91dHNpZGUgb2YgYW55IGBOZ1N3aXRjaENhc2VgXG4gKiBvciBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgYXJlIHByZXNlcnZlZCBhdCB0aGUgbG9jYXRpb24uXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqIERlZmluZSBhIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgZGlyZWN0aXZlLCBhbmQgc3BlY2lmeSB0aGUgc3dpdGNoIGV4cHJlc3Npb25cbiAqIHRvIG1hdGNoIGFnYWluc3QgYXMgYW4gYXR0cmlidXRlOlxuICpcbiAqIGBgYFxuICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICogYGBgXG4gKlxuICogV2l0aGluIHRoZSBjb250YWluZXIsIGAqbmdTd2l0Y2hDYXNlYCBzdGF0ZW1lbnRzIHNwZWNpZnkgdGhlIG1hdGNoIGV4cHJlc3Npb25zXG4gKiBhcyBhdHRyaWJ1dGVzLiBJbmNsdWRlIGAqbmdTd2l0Y2hEZWZhdWx0YCBhcyB0aGUgZmluYWwgY2FzZS5cbiAqXG4gKiBgYGBcbiAqIDxjb250YWluZXItZWxlbWVudCBbbmdTd2l0Y2hdPVwic3dpdGNoX2V4cHJlc3Npb25cIj5cbiAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT1cIm1hdGNoX2V4cHJlc3Npb25fMVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICogLi4uXG4gKiAgICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKiA8L2NvbnRhaW5lci1lbGVtZW50PlxuICogYGBgXG4gKlxuICogIyMjIFVzYWdlIEV4YW1wbGVzXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgbW9yZSB0aGFuIG9uZSBjYXNlIHRvIGRpc3BsYXkgdGhlIHNhbWUgdmlldzpcbiAqXG4gKiBgYGBcbiAqIDxjb250YWluZXItZWxlbWVudCBbbmdTd2l0Y2hdPVwic3dpdGNoX2V4cHJlc3Npb25cIj5cbiAqICAgPCEtLSB0aGUgc2FtZSB2aWV3IGNhbiBiZSBzaG93biBpbiBtb3JlIHRoYW4gb25lIGNhc2UgLS0+XG4gKiAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT1cIm1hdGNoX2V4cHJlc3Npb25fMVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzJcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAqICAgPHNvbWUtb3RoZXItZWxlbWVudCAqbmdTd2l0Y2hDYXNlPVwibWF0Y2hfZXhwcmVzc2lvbl8zXCI+Li4uPC9zb21lLW90aGVyLWVsZW1lbnQ+XG4gKiAgIDwhLS1kZWZhdWx0IGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gbWF0Y2hlcyAtLT5cbiAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1lbGVtZW50PlxuICogPC9jb250YWluZXItZWxlbWVudD5cbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgY2FzZXMgY2FuIGJlIG5lc3RlZDpcbiAqIGBgYFxuICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPVwibWF0Y2hfZXhwcmVzc2lvbl8xXCI+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKiAgICAgICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzJcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAqICAgICAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT1cIm1hdGNoX2V4cHJlc3Npb25fM1wiPi4uLjwvc29tZS1vdGhlci1lbGVtZW50PlxuICogICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwibWF0Y2hfZXhwcmVzc2lvbl8zXCI+XG4gKiAgICAgICAgIDwhLS0gdXNlIGEgbmctY29udGFpbmVyIHRvIGdyb3VwIG11bHRpcGxlIHJvb3Qgbm9kZXMgLS0+XG4gKiAgICAgICAgIDxpbm5lci1lbGVtZW50PjwvaW5uZXItZWxlbWVudD5cbiAqICAgICAgICAgPGlubmVyLW90aGVyLWVsZW1lbnQ+PC9pbm5lci1vdGhlci1lbGVtZW50PlxuICogICAgICAgPC9uZy1jb250YWluZXI+XG4gKiAgICAgICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKiAgICAgPC9jb250YWluZXItZWxlbWVudD5cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBzZWUgYE5nU3dpdGNoQ2FzZWBcbiAqIEBzZWUgYE5nU3dpdGNoRGVmYXVsdGBcbiAqIEBzZWUgW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKVxuICpcbiAqL1xudmFyIE5nU3dpdGNoID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nU3dpdGNoKCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jYXNlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkID0gZmFsc2U7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1N3aXRjaC5wcm90b3R5cGUsIFwibmdTd2l0Y2hcIiwge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbmdTd2l0Y2ggPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYXNlQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBOZ1N3aXRjaC5wcm90b3R5cGUuX2FkZENhc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jYXNlQ291bnQrKzsgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgTmdTd2l0Y2gucHJvdG90eXBlLl9hZGREZWZhdWx0ID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kZWZhdWx0Vmlld3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRWaWV3cyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlZmF1bHRWaWV3cy5wdXNoKHZpZXcpO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIE5nU3dpdGNoLnByb3RvdHlwZS5fbWF0Y2hDYXNlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBtYXRjaGVkID0gdmFsdWUgPT0gdGhpcy5fbmdTd2l0Y2g7XG4gICAgICAgIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgPSB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkIHx8IG1hdGNoZWQ7XG4gICAgICAgIHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleCsrO1xuICAgICAgICBpZiAodGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID09PSB0aGlzLl9jYXNlQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURlZmF1bHRDYXNlcyghdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXggPSAwO1xuICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVkO1xuICAgIH07XG4gICAgTmdTd2l0Y2gucHJvdG90eXBlLl91cGRhdGVEZWZhdWx0Q2FzZXMgPSBmdW5jdGlvbiAodXNlRGVmYXVsdCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmYXVsdFZpZXdzICYmIHVzZURlZmF1bHQgIT09IHRoaXMuX2RlZmF1bHRVc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IHVzZURlZmF1bHQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2RlZmF1bHRWaWV3cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0VmlldyA9IHRoaXMuX2RlZmF1bHRWaWV3c1tpXTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0Vmlldy5lbmZvcmNlU3RhdGUodXNlRGVmYXVsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIE5nU3dpdGNoLnByb3RvdHlwZSwgXCJuZ1N3aXRjaFwiLCBudWxsKTtcbiAgICBOZ1N3aXRjaCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ1N3aXRjaF0nIH0pXG4gICAgXSwgTmdTd2l0Y2gpO1xuICAgIHJldHVybiBOZ1N3aXRjaDtcbn0oKSk7XG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFByb3ZpZGVzIGEgc3dpdGNoIGNhc2UgZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0IGFuIGVuY2xvc2luZyBgbmdTd2l0Y2hgIGV4cHJlc3Npb24uXG4gKiBXaGVuIHRoZSBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGdpdmVuIGBOZ1N3aXRjaENhc2VgIHRlbXBsYXRlIGlzIHJlbmRlcmVkLlxuICogSWYgbXVsdGlwbGUgbWF0Y2ggZXhwcmVzc2lvbnMgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uIHZhbHVlLCBhbGwgb2YgdGhlbSBhcmUgZGlzcGxheWVkLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogV2l0aGluIGEgc3dpdGNoIGNvbnRhaW5lciwgYCpuZ1N3aXRjaENhc2VgIHN0YXRlbWVudHMgc3BlY2lmeSB0aGUgbWF0Y2ggZXhwcmVzc2lvbnNcbiAqIGFzIGF0dHJpYnV0ZXMuIEluY2x1ZGUgYCpuZ1N3aXRjaERlZmF1bHRgIGFzIHRoZSBmaW5hbCBjYXNlLlxuICpcbiAqIGBgYFxuICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09XCJzd2l0Y2hfZXhwcmVzc2lvblwiPlxuICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9XCJtYXRjaF9leHByZXNzaW9uXzFcIj4uLi48L3NvbWUtZWxlbWVudD5cbiAqICAgLi4uXG4gKiAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdD4uLi48L3NvbWUtZWxlbWVudD5cbiAqIDwvY29udGFpbmVyLWVsZW1lbnQ+XG4gKiBgYGBcbiAqXG4gKiBFYWNoIHN3aXRjaC1jYXNlIHN0YXRlbWVudCBjb250YWlucyBhbiBpbi1saW5lIEhUTUwgdGVtcGxhdGUgb3IgdGVtcGxhdGUgcmVmZXJlbmNlXG4gKiB0aGF0IGRlZmluZXMgdGhlIHN1YnRyZWUgdG8gYmUgc2VsZWN0ZWQgaWYgdGhlIHZhbHVlIG9mIHRoZSBtYXRjaCBleHByZXNzaW9uXG4gKiBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogVW5saWtlIEphdmFTY3JpcHQsIHdoaWNoIHVzZXMgc3RyaWN0IGVxdWFsaXR5LCBBbmd1bGFyIHVzZXMgbG9vc2UgZXF1YWxpdHkuXG4gKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGVtcHR5IHN0cmluZywgYFwiXCJgIG1hdGNoZXMgMC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKiBAc2VlIGBOZ1N3aXRjaGBcbiAqIEBzZWUgYE5nU3dpdGNoRGVmYXVsdGBcbiAqXG4gKi9cbnZhciBOZ1N3aXRjaENhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdTd2l0Y2hDYXNlKHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmLCBuZ1N3aXRjaCkge1xuICAgICAgICB0aGlzLm5nU3dpdGNoID0gbmdTd2l0Y2g7XG4gICAgICAgIG5nU3dpdGNoLl9hZGRDYXNlKCk7XG4gICAgICAgIHRoaXMuX3ZpZXcgPSBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGNhc2UgbWF0Y2hpbmcuIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgKi9cbiAgICBOZ1N3aXRjaENhc2UucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fdmlldy5lbmZvcmNlU3RhdGUodGhpcy5uZ1N3aXRjaC5fbWF0Y2hDYXNlKHRoaXMubmdTd2l0Y2hDYXNlKSk7IH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgTmdTd2l0Y2hDYXNlLnByb3RvdHlwZSwgXCJuZ1N3aXRjaENhc2VcIiwgdm9pZCAwKTtcbiAgICBOZ1N3aXRjaENhc2UgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmdTd2l0Y2hDYXNlXScgfSksXG4gICAgICAgIF9fcGFyYW0oMiwgSG9zdCgpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtWaWV3Q29udGFpbmVyUmVmLCBUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgIE5nU3dpdGNoXSlcbiAgICBdLCBOZ1N3aXRjaENhc2UpO1xuICAgIHJldHVybiBOZ1N3aXRjaENhc2U7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogQ3JlYXRlcyBhIHZpZXcgdGhhdCBpcyByZW5kZXJlZCB3aGVuIG5vIGBOZ1N3aXRjaENhc2VgIGV4cHJlc3Npb25zXG4gKiBtYXRjaCB0aGUgYE5nU3dpdGNoYCBleHByZXNzaW9uLlxuICogVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIHRoZSBmaW5hbCBjYXNlIGluIGFuIGBOZ1N3aXRjaGAuXG4gKlxuICogQHB1YmxpY0FwaVxuICogQHNlZSBgTmdTd2l0Y2hgXG4gKiBAc2VlIGBOZ1N3aXRjaENhc2VgXG4gKlxuICovXG52YXIgTmdTd2l0Y2hEZWZhdWx0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nU3dpdGNoRGVmYXVsdCh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZiwgbmdTd2l0Y2gpIHtcbiAgICAgICAgbmdTd2l0Y2guX2FkZERlZmF1bHQobmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpKTtcbiAgICB9XG4gICAgTmdTd2l0Y2hEZWZhdWx0ID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nU3dpdGNoRGVmYXVsdF0nIH0pLFxuICAgICAgICBfX3BhcmFtKDIsIEhvc3QoKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbVmlld0NvbnRhaW5lclJlZiwgVGVtcGxhdGVSZWYsXG4gICAgICAgICAgICBOZ1N3aXRjaF0pXG4gICAgXSwgTmdTd2l0Y2hEZWZhdWx0KTtcbiAgICByZXR1cm4gTmdTd2l0Y2hEZWZhdWx0O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqIGBgYFxuICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPVwidmFsdWVcIj5cbiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0wXCI+dGhlcmUgaXMgbm90aGluZzwvbmctdGVtcGxhdGU+XG4gKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MVwiPnRoZXJlIGlzIG9uZTwvbmctdGVtcGxhdGU+XG4gKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCJmZXdcIj50aGVyZSBhcmUgYSBmZXc8L25nLXRlbXBsYXRlPlxuICogPC9zb21lLWVsZW1lbnQ+XG4gKiBgYGBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBBZGRzIC8gcmVtb3ZlcyBET00gc3ViLXRyZWVzIGJhc2VkIG9uIGEgbnVtZXJpYyB2YWx1ZS4gVGFpbG9yZWQgZm9yIHBsdXJhbGl6YXRpb24uXG4gKlxuICogRGlzcGxheXMgRE9NIHN1Yi10cmVlcyB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgb3IgZmFpbGluZyB0aGF0LCBET00gc3ViLXRyZWVzXG4gKiB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbidzIHBsdXJhbGl6YXRpb24gY2F0ZWdvcnkuXG4gKlxuICogVG8gdXNlIHRoaXMgZGlyZWN0aXZlIHlvdSBtdXN0IHByb3ZpZGUgYSBjb250YWluZXIgZWxlbWVudCB0aGF0IHNldHMgdGhlIGBbbmdQbHVyYWxdYCBhdHRyaWJ1dGVcbiAqIHRvIGEgc3dpdGNoIGV4cHJlc3Npb24uIElubmVyIGVsZW1lbnRzIHdpdGggYSBgW25nUGx1cmFsQ2FzZV1gIHdpbGwgZGlzcGxheSBiYXNlZCBvbiB0aGVpclxuICogZXhwcmVzc2lvbjpcbiAqIC0gaWYgYFtuZ1BsdXJhbENhc2VdYCBpcyBzZXQgdG8gYSB2YWx1ZSBzdGFydGluZyB3aXRoIGA9YCwgaXQgd2lsbCBvbmx5IGRpc3BsYXkgaWYgdGhlIHZhbHVlXG4gKiAgIG1hdGNoZXMgdGhlIHN3aXRjaCBleHByZXNzaW9uIGV4YWN0bHksXG4gKiAtIG90aGVyd2lzZSwgdGhlIHZpZXcgd2lsbCBiZSB0cmVhdGVkIGFzIGEgXCJjYXRlZ29yeSBtYXRjaFwiLCBhbmQgd2lsbCBvbmx5IGRpc3BsYXkgaWYgZXhhY3RcbiAqICAgdmFsdWUgbWF0Y2hlcyBhcmVuJ3QgZm91bmQgYW5kIHRoZSB2YWx1ZSBtYXBzIHRvIGl0cyBjYXRlZ29yeSBmb3IgdGhlIGRlZmluZWQgbG9jYWxlLlxuICpcbiAqIFNlZSBodHRwOi8vY2xkci51bmljb2RlLm9yZy9pbmRleC9jbGRyLXNwZWMvcGx1cmFsLXJ1bGVzXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdQbHVyYWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdQbHVyYWwoX2xvY2FsaXphdGlvbikge1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSBfbG9jYWxpemF0aW9uO1xuICAgICAgICB0aGlzLl9jYXNlVmlld3MgPSB7fTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nUGx1cmFsLnByb3RvdHlwZSwgXCJuZ1BsdXJhbFwiLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9zd2l0Y2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlldygpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBOZ1BsdXJhbC5wcm90b3R5cGUuYWRkQ2FzZSA9IGZ1bmN0aW9uICh2YWx1ZSwgc3dpdGNoVmlldykgeyB0aGlzLl9jYXNlVmlld3NbdmFsdWVdID0gc3dpdGNoVmlldzsgfTtcbiAgICBOZ1BsdXJhbC5wcm90b3R5cGUuX3VwZGF0ZVZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyVmlld3MoKTtcbiAgICAgICAgdmFyIGNhc2VzID0gT2JqZWN0LmtleXModGhpcy5fY2FzZVZpZXdzKTtcbiAgICAgICAgdmFyIGtleSA9IGdldFBsdXJhbENhdGVnb3J5KHRoaXMuX3N3aXRjaFZhbHVlLCBjYXNlcywgdGhpcy5fbG9jYWxpemF0aW9uKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVWaWV3KHRoaXMuX2Nhc2VWaWV3c1trZXldKTtcbiAgICB9O1xuICAgIE5nUGx1cmFsLnByb3RvdHlwZS5fY2xlYXJWaWV3cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVZpZXcpXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3LmRlc3Ryb3koKTtcbiAgICB9O1xuICAgIE5nUGx1cmFsLnByb3RvdHlwZS5fYWN0aXZhdGVWaWV3ID0gZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmlldy5jcmVhdGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBOdW1iZXIpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW051bWJlcl0pXG4gICAgXSwgTmdQbHVyYWwucHJvdG90eXBlLCBcIm5nUGx1cmFsXCIsIG51bGwpO1xuICAgIE5nUGx1cmFsID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nUGx1cmFsXScgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTmdMb2NhbGl6YXRpb25dKVxuICAgIF0sIE5nUGx1cmFsKTtcbiAgICByZXR1cm4gTmdQbHVyYWw7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogQ3JlYXRlcyBhIHZpZXcgdGhhdCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHtAbGluayBOZ1BsdXJhbH0gd2hlbiB0aGVcbiAqIGdpdmVuIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYWNjb3JkaW5nIHRvIENMRFIgcnVsZXMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqIGBgYFxuICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPVwidmFsdWVcIj5cbiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0wXCI+Li4uPC9uZy10ZW1wbGF0ZT5cbiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+Li4uPC9uZy10ZW1wbGF0ZT5cbiAqIDwvc29tZS1lbGVtZW50PlxuICpgYGBcbiAqXG4gKiBTZWUge0BsaW5rIE5nUGx1cmFsfSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nUGx1cmFsQ2FzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ1BsdXJhbENhc2UodmFsdWUsIHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyLCBuZ1BsdXJhbCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBpc0FOdW1iZXIgPSAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIG5nUGx1cmFsLmFkZENhc2UoaXNBTnVtYmVyID8gXCI9XCIgKyB2YWx1ZSA6IHZhbHVlLCBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZSkpO1xuICAgIH1cbiAgICBOZ1BsdXJhbENhc2UgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmdQbHVyYWxDYXNlXScgfSksXG4gICAgICAgIF9fcGFyYW0oMCwgQXR0cmlidXRlKCduZ1BsdXJhbENhc2UnKSksXG4gICAgICAgIF9fcGFyYW0oMywgSG9zdCgpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmcsIFRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgVmlld0NvbnRhaW5lclJlZiwgTmdQbHVyYWxdKVxuICAgIF0sIE5nUGx1cmFsQ2FzZSk7XG4gICAgcmV0dXJuIE5nUGx1cmFsQ2FzZTtcbn0oKSk7XG5cbi8qKlxuICogVXNlZCBhcyBhIHRva2VuIGZvciBhbiBpbmplY3RlZCBzZXJ2aWNlIHdpdGhpbiB0aGUgTmdTdHlsZSBkaXJlY3RpdmUuXG4gKlxuICogTmdTdHlsZSBiZWhhdmVzIGRpZmZlcmVubHkgd2hldGhlciBvciBub3QgVkUgaXMgYmVpbmcgdXNlZCBvciBub3QuIElmXG4gKiBwcmVzZW50IHRoZW4gdGhlIGxlZ2FjeSBuZ0NsYXNzIGRpZmZpbmcgYWxnb3JpdGhtIHdpbGwgYmUgdXNlZCBhcyBhblxuICogaW5qZWN0ZWQgc2VydmljZS4gT3RoZXJ3aXNlIHRoZSBuZXcgZGlmZmluZyBhbGdvcml0aG0gKHdoaWNoIGRlbGVnYXRlc1xuICogdG8gdGhlIGBbc3R5bGVdYCBiaW5kaW5nKSB3aWxsIGJlIHVzZWQuIFRoaXMgdG9nZ2xlIGJlaGF2aW9yIGlzIGRvbmUgc29cbiAqIHZpYSB0aGUgaXZ5X3N3aXRjaCBtZWNoYW5pc20uXG4gKi9cbnZhciBOZ1N0eWxlSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOZ1N0eWxlSW1wbCgpIHtcbiAgICB9XG4gICAgcmV0dXJuIE5nU3R5bGVJbXBsO1xufSgpKTtcbnZhciBOZ1N0eWxlUjJJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nU3R5bGVSMkltcGwoX25nRWwsIF9kaWZmZXJzLCBfcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5fbmdFbCA9IF9uZ0VsO1xuICAgICAgICB0aGlzLl9kaWZmZXJzID0gX2RpZmZlcnM7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgIH1cbiAgICBOZ1N0eWxlUjJJbXBsLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2Ygc3R5bGUgcHJvcGVydGllcywgc3BlY2lmaWVkIGFzIGNvbG9uLXNlcGFyYXRlZFxuICAgICAqIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiAqIFRoZSBrZXkgaXMgYSBzdHlsZSBuYW1lLCB3aXRoIGFuIG9wdGlvbmFsIGAuPHVuaXQ+YCBzdWZmaXhcbiAgICAgKiAgICAoc3VjaCBhcyAndG9wLnB4JywgJ2ZvbnQtc3R5bGUuZW0nKS5cbiAgICAgKiAqIFRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKi9cbiAgICBOZ1N0eWxlUjJJbXBsLnByb3RvdHlwZS5zZXROZ1N0eWxlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9uZ1N0eWxlID0gdmFsdWVzO1xuICAgICAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZXMpLmNyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBuZXcgc3R5bGVzIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBOZ1N0eWxlUjJJbXBsLnByb3RvdHlwZS5hcHBseUNoYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kaWZmZXIpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdTdHlsZVIySW1wbC5wcm90b3R5cGUuX2FwcGx5Q2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKGZ1bmN0aW9uIChyZWNvcmQpIHsgcmV0dXJuIF90aGlzLl9zZXRTdHlsZShyZWNvcmQua2V5LCBudWxsKTsgfSk7XG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiBfdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgICAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbShmdW5jdGlvbiAocmVjb3JkKSB7IHJldHVybiBfdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgIH07XG4gICAgTmdTdHlsZVIySW1wbC5wcm90b3R5cGUuX3NldFN0eWxlID0gZnVuY3Rpb24gKG5hbWVBbmRVbml0LCB2YWx1ZSkge1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQobmFtZUFuZFVuaXQuc3BsaXQoJy4nKSwgMiksIG5hbWUgPSBfYVswXSwgdW5pdCA9IF9hWzFdO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlICE9IG51bGwgJiYgdW5pdCA/IFwiXCIgKyB2YWx1ZSArIHVuaXQgOiB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdTdHlsZVIySW1wbCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbRWxlbWVudFJlZiwgS2V5VmFsdWVEaWZmZXJzLCBSZW5kZXJlcjJdKVxuICAgIF0sIE5nU3R5bGVSMkltcGwpO1xuICAgIHJldHVybiBOZ1N0eWxlUjJJbXBsO1xufSgpKTtcbnZhciBOZ1N0eWxlUjNJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nU3R5bGVSM0ltcGwoKSB7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IG5ldyBTdHlsaW5nRGlmZmVyKCdOZ1N0eWxlJywgOCAvKiBBbGxvd1VuaXRzICovKTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBOZ1N0eWxlUjNJbXBsLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9O1xuICAgIE5nU3R5bGVSM0ltcGwucHJvdG90eXBlLnNldE5nU3R5bGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy5fZGlmZmVyLnNldFZhbHVlKHZhbHVlKTsgfTtcbiAgICBOZ1N0eWxlUjNJbXBsLnByb3RvdHlwZS5hcHBseUNoYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kaWZmZXIuaGFzVmFsdWVDaGFuZ2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5fZGlmZmVyLnZhbHVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ1N0eWxlUjNJbXBsID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKVxuICAgIF0sIE5nU3R5bGVSM0ltcGwpO1xuICAgIHJldHVybiBOZ1N0eWxlUjNJbXBsO1xufSgpKTtcbi8vIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgYm90aCBOZ0NsYXNzUjJJbXBsIGFuZCBOZ0NsYXNzUjNJbXBsIGFyZVxuLy8gbm90IGl2eV9zd2l0Y2gnZCBhd2F5LCBpbnN0ZWFkIHRoZXkgYXJlIG9ubHkgaG9va2VkIHVwIGludG8gdGhlXG4vLyBESSB2aWEgTmdTdHlsZSdzIGRpcmVjdGl2ZSdzIHByb3ZpZGVyIHByb3BlcnR5LlxudmFyIE5nU3R5bGVJbXBsUHJvdmlkZXJfX1BSRV9SM19fID0ge1xuICAgIHByb3ZpZGU6IE5nU3R5bGVJbXBsLFxuICAgIHVzZUNsYXNzOiBOZ1N0eWxlUjJJbXBsXG59O1xudmFyIE5nU3R5bGVJbXBsUHJvdmlkZXJfX1BPU1RfUjNfXyA9IHtcbiAgICBwcm92aWRlOiBOZ1N0eWxlSW1wbCxcbiAgICB1c2VDbGFzczogTmdTdHlsZVIzSW1wbFxufTtcbnZhciBOZ1N0eWxlSW1wbFByb3ZpZGVyID0gTmdTdHlsZUltcGxQcm92aWRlcl9fUFJFX1IzX187XG5cbi8qXG4gKiBOZ1N0eWxlIChhcyB3ZWxsIGFzIE5nQ2xhc3MpIGJlaGF2ZXMgZGlmZmVyZW50bHkgd2hlbiBsb2FkZWQgaW4gdGhlIFZFIGFuZCB3aGVuIG5vdC5cbiAqXG4gKiBJZiB0aGUgVkUgaXMgcHJlc2VudCAod2hpY2ggaXMgZm9yIG9sZGVyIHZlcnNpb25zIG9mIEFuZ3VsYXIpIHRoZW4gTmdTdHlsZSB3aWxsIGluamVjdFxuICogdGhlIGxlZ2FjeSBkaWZmaW5nIGFsZ29yaXRobSBhcyBhIHNlcnZpY2UgYW5kIGRlbGVnYXRlIGFsbCBzdHlsaW5nIGNoYW5nZXMgdG8gdGhhdC5cbiAqXG4gKiBJZiB0aGUgVkUgaXMgbm90IHByZXNlbnQgdGhlbiBOZ1N0eWxlIHdpbGwgbm9ybWFsaXplICh0aHJvdWdoIHRoZSBpbmplY3RlZCBzZXJ2aWNlKSBhbmRcbiAqIHRoZW4gd3JpdGUgYWxsIHN0eWxpbmcgY2hhbmdlcyB0byB0aGUgYFtzdHlsZV1gIGJpbmRpbmcgZGlyZWN0bHkgKHRocm91Z2ggYSBob3N0IGJpbmRpbmcpLlxuICogVGhlbiBBbmd1bGFyIHdpbGwgbm90aWNlIHRoZSBob3N0IGJpbmRpbmcgY2hhbmdlIGFuZCB0cmVhdCB0aGUgY2hhbmdlcyBhcyBzdHlsaW5nXG4gKiBjaGFuZ2VzIGFuZCBhcHBseSB0aGVtIHZpYSB0aGUgY29yZSBzdHlsaW5nIGluc3RydWN0aW9ucyB0aGF0IGV4aXN0IHdpdGhpbiBBbmd1bGFyLlxuICovXG4vLyB1c2VkIHdoZW4gdGhlIFZFIGlzIHByZXNlbnRcbnZhciBuZ1N0eWxlRGlyZWN0aXZlRGVmX19QUkVfUjNfXyA9IHVuZGVmaW5lZDtcbnZhciDJtTAkMSA9IGZ1bmN0aW9uICgpIHsgfSwgybUxJDEgPSBmdW5jdGlvbiAoKSB7IH0sIMm1MiQxID0gZnVuY3Rpb24gKHJmLCBjdHgsIGVsSW5kZXgpIHtcbiAgICBpZiAocmYgJiAxIC8qIENyZWF0ZSAqLykge1xuICAgICAgICDJtcm1ZWxlbWVudEhvc3RTdHlsaW5nKCk7XG4gICAgfVxuICAgIGlmIChyZiAmIDIgLyogVXBkYXRlICovKSB7XG4gICAgICAgIMm1ybVlbGVtZW50SG9zdFN0eWxpbmdNYXAobnVsbCwgY3R4LmdldFZhbHVlKCkpO1xuICAgICAgICDJtcm1ZWxlbWVudEhvc3RTdHlsaW5nQXBwbHkoKTtcbiAgICB9XG59O1xuLy8gdXNlZCB3aGVuIHRoZSBWRSBpcyBub3QgcHJlc2VudCAobm90ZSB0aGUgZGlyZWN0aXZlIHdpbGxcbi8vIG5ldmVyIGJlIGluc3RhbnRpYXRlZCBub3JtYWxseSBiZWNhdXNlIGl0IGlzIGFwYXJ0IG9mIGFcbi8vIGJhc2UgY2xhc3MpXG52YXIgbmdTdHlsZURpcmVjdGl2ZURlZl9fUE9TVF9SM19fID0gybXJtWRlZmluZURpcmVjdGl2ZSh7XG4gICAgdHlwZTogybUwJDEsXG4gICAgc2VsZWN0b3JzOiBudWxsLFxuICAgIGZhY3Rvcnk6IMm1MSQxLFxuICAgIGhvc3RCaW5kaW5nczogybUyJDFcbn0pO1xudmFyIG5nU3R5bGVEaXJlY3RpdmVEZWYgPSBuZ1N0eWxlRGlyZWN0aXZlRGVmX19QUkVfUjNfXztcbi8qKlxuICogU2VydmVzIGFzIHRoZSBiYXNlIG5vbi1WRSBjb250YWluZXIgZm9yIE5nU3R5bGUuXG4gKlxuICogV2hpbGUgdGhpcyBpcyBhIGJhc2UgY2xhc3MgdGhhdCBOZ1N0eWxlIGV4dGVuZHMgZnJvbSwgdGhlXG4gKiBjbGFzcyBpdHNlbGYgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3Igbm9uLVZFIGNvZGUgdG8gc2V0dXBcbiAqIGEgbGluayB0byB0aGUgYFtzdHlsZV1gIGhvc3QgYmluZGluZyAodmlhIHRoZSBzdGF0aWNcbiAqIGBuZ0RpcmVjdGl2ZURlZmAgcHJvcGVydHkgb24gdGhlIGNsYXNzKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGBuZ0RpcmVjdGl2ZURlZmAgcHJvcGVydHkncyBjb2RlIGlzIHN3aXRjaGVkXG4gKiBkZXBlbmRpbmcgaWYgVkUgaXMgcHJlc2VudCBvciBub3QgKHRoaXMgYWxsb3dzIGZvciB0aGVcbiAqIGJpbmRpbmcgY29kZSB0byBiZSBzZXQgb25seSBmb3IgbmV3ZXIgdmVyc2lvbnMgb2YgQW5ndWxhcikuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdTdHlsZUJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdTdHlsZUJhc2UoX2RlbGVnYXRlKSB7XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlID0gX2RlbGVnYXRlO1xuICAgIH1cbiAgICBOZ1N0eWxlQmFzZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5nZXRWYWx1ZSgpOyB9O1xuICAgIE5nU3R5bGVCYXNlLm5nRGlyZWN0aXZlRGVmID0gbmdTdHlsZURpcmVjdGl2ZURlZjtcbiAgICByZXR1cm4gTmdTdHlsZUJhc2U7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBTZXQgdGhlIGZvbnQgb2YgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCB0byB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24uXG4gKlxuICogYGBgXG4gKiA8c29tZS1lbGVtZW50IFtuZ1N0eWxlXT1cInsnZm9udC1zdHlsZSc6IHN0eWxlRXhwfVwiPi4uLjwvc29tZS1lbGVtZW50PlxuICogYGBgXG4gKlxuICogU2V0IHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50IHRvIGEgcGl4ZWwgdmFsdWUgcmV0dXJuZWQgYnkgYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBgYGBcbiAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPVwieydtYXgtd2lkdGgucHgnOiB3aWR0aEV4cH1cIj4uLi48L3NvbWUtZWxlbWVudD5cbiAqIGBgYFxuICpcbiAqIFNldCBhIGNvbGxlY3Rpb24gb2Ygc3R5bGUgdmFsdWVzIHVzaW5nIGFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBgYGBcbiAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPVwib2JqRXhwXCI+Li4uPC9zb21lLWVsZW1lbnQ+XG4gKiBgYGBcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBBbiBhdHRyaWJ1dGUgZGlyZWN0aXZlIHRoYXQgdXBkYXRlcyBzdHlsZXMgZm9yIHRoZSBjb250YWluaW5nIEhUTUwgZWxlbWVudC5cbiAqIFNldHMgb25lIG9yIG1vcmUgc3R5bGUgcHJvcGVydGllcywgc3BlY2lmaWVkIGFzIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuXG4gKiBUaGUga2V5IGlzIGEgc3R5bGUgbmFtZSwgd2l0aCBhbiBvcHRpb25hbCBgLjx1bml0PmAgc3VmZml4XG4gKiAoc3VjaCBhcyAndG9wLnB4JywgJ2ZvbnQtc3R5bGUuZW0nKS5cbiAqIFRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAqIFRoZSByZXN1bHRpbmcgbm9uLW51bGwgdmFsdWUsIGV4cHJlc3NlZCBpbiB0aGUgZ2l2ZW4gdW5pdCxcbiAqIGlzIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBzdHlsZSBwcm9wZXJ0eS5cbiAqIElmIHRoZSByZXN1bHQgb2YgZXZhbHVhdGlvbiBpcyBudWxsLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBpcyByZW1vdmVkLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nU3R5bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5nU3R5bGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmdTdHlsZShkZWxlZ2F0ZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZGVsZWdhdGUpIHx8IHRoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ1N0eWxlLnByb3RvdHlwZSwgXCJuZ1N0eWxlXCIsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy5fZGVsZWdhdGUuc2V0TmdTdHlsZSh2YWx1ZSk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE5nU3R5bGUucHJvdG90eXBlLm5nRG9DaGVjayA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fZGVsZWdhdGUuYXBwbHlDaGFuZ2VzKCk7IH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ1N0eWxlJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgTmdTdHlsZS5wcm90b3R5cGUsIFwibmdTdHlsZVwiLCBudWxsKTtcbiAgICBOZ1N0eWxlID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nU3R5bGVdJywgcHJvdmlkZXJzOiBbTmdTdHlsZUltcGxQcm92aWRlcl0gfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbTmdTdHlsZUltcGxdKVxuICAgIF0sIE5nU3R5bGUpO1xuICAgIHJldHVybiBOZ1N0eWxlO1xufShOZ1N0eWxlQmFzZSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBJbnNlcnRzIGFuIGVtYmVkZGVkIHZpZXcgZnJvbSBhIHByZXBhcmVkIGBUZW1wbGF0ZVJlZmAuXG4gKlxuICogWW91IGNhbiBhdHRhY2ggYSBjb250ZXh0IG9iamVjdCB0byB0aGUgYEVtYmVkZGVkVmlld1JlZmAgYnkgc2V0dGluZyBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAuXG4gKiBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAgc2hvdWxkIGJlIGFuIG9iamVjdCwgdGhlIG9iamVjdCdzIGtleXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGJpbmRpbmdcbiAqIGJ5IHRoZSBsb2NhbCB0ZW1wbGF0ZSBgbGV0YCBkZWNsYXJhdGlvbnMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqIGBgYFxuICogPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmVmRXhwOyBjb250ZXh0OiBjb250ZXh0RXhwXCI+PC9uZy1jb250YWluZXI+XG4gKiBgYGBcbiAqXG4gKiBVc2luZyB0aGUga2V5IGAkaW1wbGljaXRgIGluIHRoZSBjb250ZXh0IG9iamVjdCB3aWxsIHNldCBpdHMgdmFsdWUgYXMgZGVmYXVsdC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vbmdUZW1wbGF0ZU91dGxldC90cy9tb2R1bGUudHMgcmVnaW9uPSdOZ1RlbXBsYXRlT3V0bGV0J31cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ1RlbXBsYXRlT3V0bGV0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5nVGVtcGxhdGVPdXRsZXQoX3ZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmO1xuICAgICAgICB0aGlzLl92aWV3UmVmID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgY29udGV4dCBvYmplY3QgdG8gYXR0YWNoIHRvIHRoZSB7QGxpbmsgRW1iZWRkZWRWaWV3UmVmfS4gVGhpcyBzaG91bGQgYmUgYW5cbiAgICAgICAgICogb2JqZWN0LCB0aGUgb2JqZWN0J3Mga2V5cyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYmluZGluZyBieSB0aGUgbG9jYWwgdGVtcGxhdGUgYGxldGBcbiAgICAgICAgICogZGVjbGFyYXRpb25zLlxuICAgICAgICAgKiBVc2luZyB0aGUga2V5IGAkaW1wbGljaXRgIGluIHRoZSBjb250ZXh0IG9iamVjdCB3aWxsIHNldCBpdHMgdmFsdWUgYXMgZGVmYXVsdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBzdHJpbmcgZGVmaW5pbmcgdGhlIHRlbXBsYXRlIHJlZmVyZW5jZSBhbmQgb3B0aW9uYWxseSB0aGUgY29udGV4dCBvYmplY3QgZm9yIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmdUZW1wbGF0ZU91dGxldCA9IG51bGw7XG4gICAgfVxuICAgIE5nVGVtcGxhdGVPdXRsZXQucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgdmFyIHJlY3JlYXRlVmlldyA9IHRoaXMuX3Nob3VsZFJlY3JlYXRlVmlldyhjaGFuZ2VzKTtcbiAgICAgICAgaWYgKHJlY3JlYXRlVmlldykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdSZWYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLnJlbW92ZSh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubmdUZW1wbGF0ZU91dGxldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLm5nVGVtcGxhdGVPdXRsZXQsIHRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdSZWYgJiYgdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogV2UgbmVlZCB0byByZS1jcmVhdGUgZXhpc3RpbmcgZW1iZWRkZWQgdmlldyBpZjpcbiAgICAgKiAtIHRlbXBsYXRlUmVmIGhhcyBjaGFuZ2VkXG4gICAgICogLSBjb250ZXh0IGhhcyBjaGFuZ2VzXG4gICAgICpcbiAgICAgKiBXZSBtYXJrIGNvbnRleHQgb2JqZWN0IGFzIGNoYW5nZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3RcbiAgICAgKiBzaGFwZSBjaGFuZ2VzIChuZXcgcHJvcGVydGllcyBhcmUgYWRkZWQgb3IgZXhpc3RpbmcgcHJvcGVydGllcyBhcmUgcmVtb3ZlZCkuXG4gICAgICogSW4gb3RoZXIgd29yZHMgd2UgY29uc2lkZXIgY29udGV4dCB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgXCJ0aGUgc2FtZVwiIGV2ZW5cbiAgICAgKiBpZiBvYmplY3QgcmVmZXJlbmNlIGNoYW5nZXMgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzQwNykuXG4gICAgICovXG4gICAgTmdUZW1wbGF0ZU91dGxldC5wcm90b3R5cGUuX3Nob3VsZFJlY3JlYXRlVmlldyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIHZhciBjdHhDaGFuZ2UgPSBjaGFuZ2VzWyduZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCddO1xuICAgICAgICByZXR1cm4gISFjaGFuZ2VzWyduZ1RlbXBsYXRlT3V0bGV0J10gfHwgKGN0eENoYW5nZSAmJiB0aGlzLl9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkKGN0eENoYW5nZSkpO1xuICAgIH07XG4gICAgTmdUZW1wbGF0ZU91dGxldC5wcm90b3R5cGUuX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQgPSBmdW5jdGlvbiAoY3R4Q2hhbmdlKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB2YXIgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7XG4gICAgICAgIHZhciBjdXJyQ3R4S2V5cyA9IE9iamVjdC5rZXlzKGN0eENoYW5nZS5jdXJyZW50VmFsdWUgfHwge30pO1xuICAgICAgICBpZiAocHJldkN0eEtleXMubGVuZ3RoID09PSBjdXJyQ3R4S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY3VyckN0eEtleXNfMSA9IF9fdmFsdWVzKGN1cnJDdHhLZXlzKSwgY3VyckN0eEtleXNfMV8xID0gY3VyckN0eEtleXNfMS5uZXh0KCk7ICFjdXJyQ3R4S2V5c18xXzEuZG9uZTsgY3VyckN0eEtleXNfMV8xID0gY3VyckN0eEtleXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BOYW1lID0gY3VyckN0eEtleXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldkN0eEtleXMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckN0eEtleXNfMV8xICYmICFjdXJyQ3R4S2V5c18xXzEuZG9uZSAmJiAoX2EgPSBjdXJyQ3R4S2V5c18xLnJldHVybikpIF9hLmNhbGwoY3VyckN0eEtleXNfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LnByb3RvdHlwZS5fdXBkYXRlRXhpc3RpbmdDb250ZXh0ID0gZnVuY3Rpb24gKGN0eCkge1xuICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMoT2JqZWN0LmtleXMoY3R4KSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcE5hbWUgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3UmVmLmNvbnRleHRbcHJvcE5hbWVdID0gdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dFtwcm9wTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgTmdUZW1wbGF0ZU91dGxldC5wcm90b3R5cGUsIFwibmdUZW1wbGF0ZU91dGxldENvbnRleHRcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBOZ1RlbXBsYXRlT3V0bGV0LnByb3RvdHlwZSwgXCJuZ1RlbXBsYXRlT3V0bGV0XCIsIHZvaWQgMCk7XG4gICAgTmdUZW1wbGF0ZU91dGxldCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ1RlbXBsYXRlT3V0bGV0XScgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbVmlld0NvbnRhaW5lclJlZl0pXG4gICAgXSwgTmdUZW1wbGF0ZU91dGxldCk7XG4gICAgcmV0dXJuIE5nVGVtcGxhdGVPdXRsZXQ7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBBbmd1bGFyIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gZWFjaCBhbmQgZXZlcnkgQW5ndWxhclxuICogYXBwbGljYXRpb24uXG4gKi9cbnZhciBDT01NT05fRElSRUNUSVZFUyA9IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIE5nRm9yT2YsXG4gICAgTmdJZixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nU3R5bGUsXG4gICAgTmdTd2l0Y2gsXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIE5nU3dpdGNoRGVmYXVsdCxcbiAgICBOZ1BsdXJhbCxcbiAgICBOZ1BsdXJhbENhc2UsXG5dO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IodHlwZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gRXJyb3IoXCJJbnZhbGlkUGlwZUFyZ3VtZW50OiAnXCIgKyB2YWx1ZSArIFwiJyBmb3IgcGlwZSAnXCIgKyDJtXN0cmluZ2lmeSh0eXBlKSArIFwiJ1wiKTtcbn1cblxudmFyIE51bWJlckZvcm1hdHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOdW1iZXJGb3JtYXR0ZXIoKSB7XG4gICAgfVxuICAgIE51bWJlckZvcm1hdHRlci5mb3JtYXQgPSBmdW5jdGlvbiAobnVtLCBsb2NhbGUsIHN0eWxlLCBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzID09PSB2b2lkIDApIHsgb3B0cyA9IHt9OyB9XG4gICAgICAgIHZhciBtaW5pbXVtSW50ZWdlckRpZ2l0cyA9IG9wdHMubWluaW11bUludGVnZXJEaWdpdHMsIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IG9wdHMubWluaW11bUZyYWN0aW9uRGlnaXRzLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSBvcHRzLm1heGltdW1GcmFjdGlvbkRpZ2l0cywgY3VycmVuY3kgPSBvcHRzLmN1cnJlbmN5LCBfYSA9IG9wdHMuY3VycmVuY3lBc1N5bWJvbCwgY3VycmVuY3lBc1N5bWJvbCA9IF9hID09PSB2b2lkIDAgPyBmYWxzZSA6IF9hO1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5pbXVtSW50ZWdlckRpZ2l0cyxcbiAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluaW11bUZyYWN0aW9uRGlnaXRzLFxuICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtRnJhY3Rpb25EaWdpdHMsXG4gICAgICAgICAgICBzdHlsZTogTnVtYmVyRm9ybWF0U3R5bGVbc3R5bGVdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHN0eWxlID09IE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5KSB7XG4gICAgICAgICAgICBvcHRpb25zLmN1cnJlbmN5ID0gdHlwZW9mIGN1cnJlbmN5ID09ICdzdHJpbmcnID8gY3VycmVuY3kgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcHRpb25zLmN1cnJlbmN5RGlzcGxheSA9IGN1cnJlbmN5QXNTeW1ib2wgPyAnc3ltYm9sJyA6ICdjb2RlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KG51bSk7XG4gICAgfTtcbiAgICByZXR1cm4gTnVtYmVyRm9ybWF0dGVyO1xufSgpKTtcbnZhciBEQVRFX0ZPUk1BVFNfU1BMSVQkMSA9IC8oKD86W155TUxkSGhtc2F6WkV3R2pKJ10rKXwoPzonKD86W14nXXwnJykqJyl8KD86RSt8eSt8TSt8TCt8ZCt8SCt8aCt8Sit8ait8bSt8cyt8YXx6fFp8Ryt8dyspKSguKikvO1xudmFyIFBBVFRFUk5fQUxJQVNFUyA9IHtcbiAgICAvLyBLZXlzIGFyZSBxdW90ZWQgc28gdGhleSBkbyBub3QgZ2V0IHJlbmFtZWQgZHVyaW5nIGNsb3N1cmUgY29tcGlsYXRpb24uXG4gICAgJ3lNTU1kam1zJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGNvbWJpbmUoW1xuICAgICAgICBkaWdpdENvbmRpdGlvbigneWVhcicsIDEpLFxuICAgICAgICBuYW1lQ29uZGl0aW9uKCdtb250aCcsIDMpLFxuICAgICAgICBkaWdpdENvbmRpdGlvbignZGF5JywgMSksXG4gICAgICAgIGRpZ2l0Q29uZGl0aW9uKCdob3VyJywgMSksXG4gICAgICAgIGRpZ2l0Q29uZGl0aW9uKCdtaW51dGUnLCAxKSxcbiAgICAgICAgZGlnaXRDb25kaXRpb24oJ3NlY29uZCcsIDEpLFxuICAgIF0pKSxcbiAgICAneU1kam0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkoY29tYmluZShbXG4gICAgICAgIGRpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpLCBkaWdpdENvbmRpdGlvbignZGF5JywgMSksXG4gICAgICAgIGRpZ2l0Q29uZGl0aW9uKCdob3VyJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtaW51dGUnLCAxKVxuICAgIF0pKSxcbiAgICAneU1NTU1FRUVFZCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtcbiAgICAgICAgZGlnaXRDb25kaXRpb24oJ3llYXInLCAxKSwgbmFtZUNvbmRpdGlvbignbW9udGgnLCA0KSwgbmFtZUNvbmRpdGlvbignd2Vla2RheScsIDQpLFxuICAgICAgICBkaWdpdENvbmRpdGlvbignZGF5JywgMSlcbiAgICBdKSksXG4gICAgJ3lNTU1NZCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtkaWdpdENvbmRpdGlvbigneWVhcicsIDEpLCBuYW1lQ29uZGl0aW9uKCdtb250aCcsIDQpLCBkaWdpdENvbmRpdGlvbignZGF5JywgMSldKSksXG4gICAgJ3lNTU1kJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGNvbWJpbmUoW2RpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIG5hbWVDb25kaXRpb24oJ21vbnRoJywgMyksIGRpZ2l0Q29uZGl0aW9uKCdkYXknLCAxKV0pKSxcbiAgICAneU1kJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGNvbWJpbmUoW2RpZ2l0Q29uZGl0aW9uKCd5ZWFyJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpLCBkaWdpdENvbmRpdGlvbignZGF5JywgMSldKSksXG4gICAgJ2ptcyc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShjb21iaW5lKFtkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCBkaWdpdENvbmRpdGlvbignc2Vjb25kJywgMSksIGRpZ2l0Q29uZGl0aW9uKCdtaW51dGUnLCAxKV0pKSxcbiAgICAnam0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkoY29tYmluZShbZGlnaXRDb25kaXRpb24oJ2hvdXInLCAxKSwgZGlnaXRDb25kaXRpb24oJ21pbnV0ZScsIDEpXSkpXG59O1xudmFyIERBVEVfRk9STUFUUyQxID0ge1xuICAgIC8vIEtleXMgYXJlIHF1b3RlZCBzbyB0aGV5IGRvIG5vdCBnZXQgcmVuYW1lZC5cbiAgICAneXl5eSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbigneWVhcicsIDQpKSxcbiAgICAneXknOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ3llYXInLCAyKSksXG4gICAgJ3knOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ3llYXInLCAxKSksXG4gICAgJ01NTU0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignbW9udGgnLCA0KSksXG4gICAgJ01NTSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShuYW1lQ29uZGl0aW9uKCdtb250aCcsIDMpKSxcbiAgICAnTU0nOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ21vbnRoJywgMikpLFxuICAgICdNJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdtb250aCcsIDEpKSxcbiAgICAnTExMTCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShuYW1lQ29uZGl0aW9uKCdtb250aCcsIDQpKSxcbiAgICAnTCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShuYW1lQ29uZGl0aW9uKCdtb250aCcsIDEpKSxcbiAgICAnZGQnOiBkYXRlUGFydEdldHRlckZhY3RvcnkoZGlnaXRDb25kaXRpb24oJ2RheScsIDIpKSxcbiAgICAnZCc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignZGF5JywgMSkpLFxuICAgICdISCc6IGRpZ2l0TW9kaWZpZXIoaG91ckV4dHJhY3RvcihkYXRlUGFydEdldHRlckZhY3RvcnkoaG91cjEyTW9kaWZ5KGRpZ2l0Q29uZGl0aW9uKCdob3VyJywgMiksIGZhbHNlKSkpKSxcbiAgICAnSCc6IGhvdXJFeHRyYWN0b3IoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGhvdXIxMk1vZGlmeShkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCBmYWxzZSkpKSxcbiAgICAnaGgnOiBkaWdpdE1vZGlmaWVyKGhvdXJFeHRyYWN0b3IoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGhvdXIxMk1vZGlmeShkaWdpdENvbmRpdGlvbignaG91cicsIDIpLCB0cnVlKSkpKSxcbiAgICAnaCc6IGhvdXJFeHRyYWN0b3IoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGhvdXIxMk1vZGlmeShkaWdpdENvbmRpdGlvbignaG91cicsIDEpLCB0cnVlKSkpLFxuICAgICdqaic6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignaG91cicsIDIpKSxcbiAgICAnaic6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignaG91cicsIDEpKSxcbiAgICAnbW0nOiBkaWdpdE1vZGlmaWVyKGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignbWludXRlJywgMikpKSxcbiAgICAnbSc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShkaWdpdENvbmRpdGlvbignbWludXRlJywgMSkpLFxuICAgICdzcyc6IGRpZ2l0TW9kaWZpZXIoZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdzZWNvbmQnLCAyKSkpLFxuICAgICdzJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdzZWNvbmQnLCAxKSksXG4gICAgLy8gd2hpbGUgSVNPIDg2MDEgcmVxdWlyZXMgZnJhY3Rpb25zIHRvIGJlIHByZWZpeGVkIHdpdGggYC5gIG9yIGAsYFxuICAgIC8vIHdlIGNhbiBiZSBqdXN0IHNhZmVseSByZWx5IG9uIHVzaW5nIGBzc3NgIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHNpbmdsZSBvciB0d28gZGlnaXRcbiAgICAvLyBmcmFjdGlvbnNcbiAgICAnc3NzJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KGRpZ2l0Q29uZGl0aW9uKCdzZWNvbmQnLCAzKSksXG4gICAgJ0VFRUUnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignd2Vla2RheScsIDQpKSxcbiAgICAnRUVFJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCAzKSksXG4gICAgJ0VFJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ3dlZWtkYXknLCAyKSksXG4gICAgJ0UnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignd2Vla2RheScsIDEpKSxcbiAgICAnYSc6IGhvdXJDbG9ja0V4dHJhY3RvcihkYXRlUGFydEdldHRlckZhY3RvcnkoaG91cjEyTW9kaWZ5KGRpZ2l0Q29uZGl0aW9uKCdob3VyJywgMSksIHRydWUpKSksXG4gICAgJ1onOiB0aW1lWm9uZUdldHRlciQxKCdzaG9ydCcpLFxuICAgICd6JzogdGltZVpvbmVHZXR0ZXIkMSgnbG9uZycpLFxuICAgICd3dyc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeSh7fSksXG4gICAgLy8gZmlyc3QgVGh1cnNkYXkgb2YgdGhlIHllYXIuIG5vdCBzdXBwb3J0ID9cbiAgICAndyc6IGRhdGVQYXJ0R2V0dGVyRmFjdG9yeSh7fSksXG4gICAgLy8gb2YgdGhlIHllYXIgbm90IHN1cHBvcnQgP1xuICAgICdHJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ2VyYScsIDEpKSxcbiAgICAnR0cnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignZXJhJywgMikpLFxuICAgICdHR0cnOiBkYXRlUGFydEdldHRlckZhY3RvcnkobmFtZUNvbmRpdGlvbignZXJhJywgMykpLFxuICAgICdHR0dHJzogZGF0ZVBhcnRHZXR0ZXJGYWN0b3J5KG5hbWVDb25kaXRpb24oJ2VyYScsIDQpKVxufTtcbmZ1bmN0aW9uIGRpZ2l0TW9kaWZpZXIoaW5uZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaW5uZXIoZGF0ZSwgbG9jYWxlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT0gMSA/ICcwJyArIHJlc3VsdCA6IHJlc3VsdDtcbiAgICB9O1xufVxuZnVuY3Rpb24gaG91ckNsb2NrRXh0cmFjdG9yKGlubmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsgcmV0dXJuIGlubmVyKGRhdGUsIGxvY2FsZSkuc3BsaXQoJyAnKVsxXTsgfTtcbn1cbmZ1bmN0aW9uIGhvdXJFeHRyYWN0b3IoaW5uZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkgeyByZXR1cm4gaW5uZXIoZGF0ZSwgbG9jYWxlKS5zcGxpdCgnICcpWzBdOyB9O1xufVxuZnVuY3Rpb24gaW50bERhdGVGb3JtYXQoZGF0ZSwgbG9jYWxlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgb3B0aW9ucykuZm9ybWF0KGRhdGUpLnJlcGxhY2UoL1tcXHUyMDBlXFx1MjAwZl0vZywgJycpO1xufVxuZnVuY3Rpb24gdGltZVpvbmVHZXR0ZXIkMSh0aW1lem9uZSkge1xuICAgIC8vIFRvIHdvcmthcm91bmQgYEludGxgIEFQSSByZXN0cmljdGlvbiBmb3Igc2luZ2xlIHRpbWV6b25lIGxldCBmb3JtYXQgd2l0aCAyNCBob3Vyc1xuICAgIHZhciBvcHRpb25zID0geyBob3VyOiAnMi1kaWdpdCcsIGhvdXIxMjogZmFsc2UsIHRpbWVab25lTmFtZTogdGltZXpvbmUgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaW50bERhdGVGb3JtYXQoZGF0ZSwgbG9jYWxlLCBvcHRpb25zKTtcbiAgICAgICAgLy8gVGhlbiBleHRyYWN0IGZpcnN0IDMgbGV0dGVycyB0aGF0IHJlbGF0ZWQgdG8gaG91cnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdC5zdWJzdHJpbmcoMykgOiAnJztcbiAgICB9O1xufVxuZnVuY3Rpb24gaG91cjEyTW9kaWZ5KG9wdGlvbnMsIHZhbHVlKSB7XG4gICAgb3B0aW9ucy5ob3VyMTIgPSB2YWx1ZTtcbiAgICByZXR1cm4gb3B0aW9ucztcbn1cbmZ1bmN0aW9uIGRpZ2l0Q29uZGl0aW9uKHByb3AsIGxlbikge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICByZXN1bHRbcHJvcF0gPSBsZW4gPT09IDIgPyAnMi1kaWdpdCcgOiAnbnVtZXJpYyc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG5hbWVDb25kaXRpb24ocHJvcCwgbGVuKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChsZW4gPCA0KSB7XG4gICAgICAgIHJlc3VsdFtwcm9wXSA9IGxlbiA+IDEgPyAnc2hvcnQnIDogJ25hcnJvdyc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHRbcHJvcF0gPSAnbG9uZyc7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb21iaW5lKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKG1lcmdlZCwgb3B0KSB7IHJldHVybiAoX19hc3NpZ24oe30sIG1lcmdlZCwgb3B0KSk7IH0sIHt9KTtcbn1cbmZ1bmN0aW9uIGRhdGVQYXJ0R2V0dGVyRmFjdG9yeShyZXQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkgeyByZXR1cm4gaW50bERhdGVGb3JtYXQoZGF0ZSwgbG9jYWxlLCByZXQpOyB9O1xufVxudmFyIERBVEVfRk9STUFUVEVSX0NBQ0hFID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZGF0ZUZvcm1hdHRlcihmb3JtYXQsIGRhdGUsIGxvY2FsZSkge1xuICAgIHZhciBmbiA9IFBBVFRFUk5fQUxJQVNFU1tmb3JtYXRdO1xuICAgIGlmIChmbilcbiAgICAgICAgcmV0dXJuIGZuKGRhdGUsIGxvY2FsZSk7XG4gICAgdmFyIGNhY2hlS2V5ID0gZm9ybWF0O1xuICAgIHZhciBwYXJ0cyA9IERBVEVfRk9STUFUVEVSX0NBQ0hFLmdldChjYWNoZUtleSk7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgICBwYXJ0cyA9IFtdO1xuICAgICAgICB2YXIgbWF0Y2ggPSB2b2lkIDA7XG4gICAgICAgIERBVEVfRk9STUFUU19TUExJVCQxLmV4ZWMoZm9ybWF0KTtcbiAgICAgICAgdmFyIF9mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHdoaWxlIChfZm9ybWF0KSB7XG4gICAgICAgICAgICBtYXRjaCA9IERBVEVfRk9STUFUU19TUExJVCQxLmV4ZWMoX2Zvcm1hdCk7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgX2Zvcm1hdCA9IHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChfZm9ybWF0KTtcbiAgICAgICAgICAgICAgICBfZm9ybWF0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBEQVRFX0ZPUk1BVFRFUl9DQUNIRS5zZXQoY2FjaGVLZXksIHBhcnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLnJlZHVjZShmdW5jdGlvbiAodGV4dCwgcGFydCkge1xuICAgICAgICB2YXIgZm4gPSBEQVRFX0ZPUk1BVFMkMVtwYXJ0XTtcbiAgICAgICAgcmV0dXJuIHRleHQgKyAoZm4gPyBmbihkYXRlLCBsb2NhbGUpIDogcGFydFRvVGltZShwYXJ0KSk7XG4gICAgfSwgJycpO1xufVxuZnVuY3Rpb24gcGFydFRvVGltZShwYXJ0KSB7XG4gICAgcmV0dXJuIHBhcnQgPT09ICdcXCdcXCcnID8gJ1xcJycgOiBwYXJ0LnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcXCcnKTtcbn1cbnZhciBEYXRlRm9ybWF0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVGb3JtYXR0ZXIoKSB7XG4gICAgfVxuICAgIERhdGVGb3JtYXR0ZXIuZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSwgcGF0dGVybikge1xuICAgICAgICByZXR1cm4gZGF0ZUZvcm1hdHRlcihwYXR0ZXJuLCBkYXRlLCBsb2NhbGUpO1xuICAgIH07XG4gICAgcmV0dXJuIERhdGVGb3JtYXR0ZXI7XG59KCkpO1xuXG4vKipcbiogQGxpY2Vuc2VcbiogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4qIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAgKi9cbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogRm9ybWF0cyBhIGRhdGUgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcy5cbiAqXG4gKiBXaGVyZTpcbiAqIC0gYGV4cHJlc3Npb25gIGlzIGEgZGF0ZSBvYmplY3Qgb3IgYSBudW1iZXIgKG1pbGxpc2Vjb25kcyBzaW5jZSBVVEMgZXBvY2gpIG9yIGFuIElTTyBzdHJpbmdcbiAqIChodHRwczovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSkuXG4gKiAtIGBmb3JtYXRgIGluZGljYXRlcyB3aGljaCBkYXRlL3RpbWUgY29tcG9uZW50cyB0byBpbmNsdWRlLiBUaGUgZm9ybWF0IGNhbiBiZSBwcmVkZWZpbmVkIGFzXG4gKiAgIHNob3duIGJlbG93IG9yIGN1c3RvbSBhcyBzaG93biBpbiB0aGUgdGFibGUuXG4gKiAgIC0gYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ3lNTU1kam1zJ2AgKGUuZy4gYFNlcCAzLCAyMDEwLCAxMjowNTowOCBQTWAgZm9yIGBlbi1VU2ApXG4gKiAgIC0gYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAneU1kam0nYCAoZS5nLiBgOS8zLzIwMTAsIDEyOjA1IFBNYCBmb3IgYGVuLVVTYClcbiAqICAgLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTUVFRUVkJ2AgKGUuZy4gYEZyaWRheSwgU2VwdGVtYmVyIDMsIDIwMTBgIGZvciBgZW4tVVNgKVxuICogICAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ3lNTU1NZCdgIChlLmcuIGBTZXB0ZW1iZXIgMywgMjAxMGAgZm9yIGBlbi1VU2ApXG4gKiAgIC0gYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NZCdgIChlLmcuIGBTZXAgMywgMjAxMGAgZm9yIGBlbi1VU2ApXG4gKiAgIC0gYCdzaG9ydERhdGUnYDogZXF1aXZhbGVudCB0byBgJ3lNZCdgIChlLmcuIGA5LzMvMjAxMGAgZm9yIGBlbi1VU2ApXG4gKiAgIC0gYCdtZWRpdW1UaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbXMnYCAoZS5nLiBgMTI6MDU6MDggUE1gIGZvciBgZW4tVVNgKVxuICogICAtIGAnc2hvcnRUaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbSdgIChlLmcuIGAxMjowNSBQTWAgZm9yIGBlbi1VU2ApXG4gKlxuICpcbiAqICB8IENvbXBvbmVudCB8IFN5bWJvbCB8IE5hcnJvdyB8IFNob3J0IEZvcm0gICB8IExvbmcgRm9ybSAgICAgICAgIHwgTnVtZXJpYyAgIHwgMi1kaWdpdCAgIHxcbiAqICB8LS0tLS0tLS0tLS18Oi0tLS0tLTp8LS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAqICB8IGVyYSAgICAgICB8ICAgRyAgICB8IEcgKEEpICB8IEdHRyAoQUQpICAgICB8IEdHR0cgKEFubm8gRG9taW5pKXwgLSAgICAgICAgIHwgLSAgICAgICAgIHxcbiAqICB8IHllYXIgICAgICB8ICAgeSAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgeSAoMjAxNSkgIHwgeXkgKDE1KSAgIHxcbiAqICB8IG1vbnRoICAgICB8ICAgTSAgICB8IEwgKFMpICB8IE1NTSAoU2VwKSAgICB8IE1NTU0gKFNlcHRlbWJlcikgIHwgTSAoOSkgICAgIHwgTU0gKDA5KSAgIHxcbiAqICB8IGRheSAgICAgICB8ICAgZCAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgZCAoMykgICAgIHwgZGQgKDAzKSAgIHxcbiAqICB8IHdlZWtkYXkgICB8ICAgRSAgICB8IEUgKFMpICB8IEVFRSAoU3VuKSAgICB8IEVFRUUgKFN1bmRheSkgICAgIHwgLSAgICAgICAgIHwgLSAgICAgICAgIHxcbiAqICB8IGhvdXIgICAgICB8ICAgaiAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgaiAoMTMpICAgIHwgamogKDEzKSAgIHxcbiAqICB8IGhvdXIxMiAgICB8ICAgaCAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgaCAoMSBQTSkgIHwgaGggKDAxIFBNKXxcbiAqICB8IGhvdXIyNCAgICB8ICAgSCAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgSCAoMTMpICAgIHwgSEggKDEzKSAgIHxcbiAqICB8IG1pbnV0ZSAgICB8ICAgbSAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgbSAoNSkgICAgIHwgbW0gKDA1KSAgIHxcbiAqICB8IHNlY29uZCAgICB8ICAgcyAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgcyAoOSkgICAgIHwgc3MgKDA5KSAgIHxcbiAqICB8IHRpbWV6b25lICB8ICAgeiAgICB8IC0gICAgICB8IC0gICAgICAgICAgICB8IHogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSl8IC0gIHwgLSAgICAgICAgIHxcbiAqICB8IHRpbWV6b25lICB8ICAgWiAgICB8IC0gICAgICB8IFogKEdNVC04OjAwKSB8IC0gICAgICAgICAgICAgICAgIHwgLSAgICAgICAgIHwgLSAgICAgICAgIHxcbiAqICB8IHRpbWV6b25lICB8ICAgYSAgICB8IC0gICAgICB8IGEgKFBNKSAgICAgICB8IC0gICAgICAgICAgICAgICAgIHwgLSAgICAgICAgIHwgLSAgICAgICAgIHxcbiAqXG4gKiBJbiBqYXZhc2NyaXB0LCBvbmx5IHRoZSBjb21wb25lbnRzIHNwZWNpZmllZCB3aWxsIGJlIHJlc3BlY3RlZCAobm90IHRoZSBvcmRlcmluZyxcbiAqIHB1bmN0dWF0aW9ucywgLi4uKSBhbmQgZGV0YWlscyBvZiB0aGUgZm9ybWF0dGluZyB3aWxsIGJlIGRlcGVuZGVudCBvbiB0aGUgbG9jYWxlLlxuICpcbiAqIFRpbWV6b25lIG9mIHRoZSBmb3JtYXR0ZWQgdGV4dCB3aWxsIGJlIHRoZSBsb2NhbCBzeXN0ZW0gdGltZXpvbmUgb2YgdGhlIGVuZC11c2VyJ3MgbWFjaGluZS5cbiAqXG4gKiBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGEgSVNPIHN0cmluZyB3aXRob3V0IHRpbWUgKGUuZy4gMjAxNi0wOS0xOSkgdGhlIHRpbWUgem9uZSBvZmZzZXQgaXMgbm90XG4gKiBhcHBsaWVkIGFuZCB0aGUgZm9ybWF0dGVkIHRleHQgd2lsbCBoYXZlIHRoZSBzYW1lIGRheSwgbW9udGggYW5kIHllYXIgb2YgdGhlIGV4cHJlc3Npb24uXG4gKlxuICogV0FSTklOR1M6XG4gKiAtIHRoaXMgcGlwZSBpcyBtYXJrZWQgYXMgcHVyZSBoZW5jZSBpdCB3aWxsIG5vdCBiZSByZS1ldmFsdWF0ZWQgd2hlbiB0aGUgaW5wdXQgaXMgbXV0YXRlZC5cbiAqICAgSW5zdGVhZCB1c2VycyBzaG91bGQgdHJlYXQgdGhlIGRhdGUgYXMgYW4gaW1tdXRhYmxlIG9iamVjdCBhbmQgY2hhbmdlIHRoZSByZWZlcmVuY2Ugd2hlbiB0aGVcbiAqICAgcGlwZSBuZWVkcyB0byByZS1ydW4gKHRoaXMgaXMgdG8gYXZvaWQgcmVmb3JtYXR0aW5nIHRoZSBkYXRlIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gcnVuXG4gKiAgIHdoaWNoIHdvdWxkIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24pLlxuICogLSB0aGlzIHBpcGUgdXNlcyB0aGUgSW50ZXJuYXRpb25hbGl6YXRpb24gQVBJLiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhXG4gKiAgIGJyb3dzZXJzLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogQXNzdW1pbmcgYGRhdGVPYmpgIGlzICh5ZWFyOiAyMDEwLCBtb250aDogOSwgZGF5OiAzLCBob3VyOiAxMiBQTSwgbWludXRlOiAwNSwgc2Vjb25kOiAwOClcbiAqIGluIHRoZSBfbG9jYWxfIHRpbWUgYW5kIGxvY2FsZSBpcyAnZW4tVVMnOlxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvZGF0ZV9waXBlLnRzIHJlZ2lvbj0nRGVwcmVjYXRlZERhdGVQaXBlJ31cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBEZXByZWNhdGVkRGF0ZVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwcmVjYXRlZERhdGVQaXBlKF9sb2NhbGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTtcbiAgICB9XG4gICAgRGVwcmVjYXRlZERhdGVQaXBlXzEgPSBEZXByZWNhdGVkRGF0ZVBpcGU7XG4gICAgRGVwcmVjYXRlZERhdGVQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIHBhdHRlcm4pIHtcbiAgICAgICAgaWYgKHBhdHRlcm4gPT09IHZvaWQgMCkgeyBwYXR0ZXJuID0gJ21lZGl1bURhdGUnOyB9XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSAhPT0gdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlJDEodmFsdWUpKSB7XG4gICAgICAgICAgICBkYXRlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzTmFOKHZhbHVlIC0gcGFyc2VGbG9hdCh2YWx1ZSkpKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUocGFyc2VGbG9hdCh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgL14oXFxkezR9LVxcZHsxLDJ9LVxcZHsxLDJ9KSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZvciBJU08gU3RyaW5ncyB3aXRob3V0IHRpbWUgdGhlIGRheSwgbW9udGggYW5kIHllYXIgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgSVNPIFN0cmluZ1xuICAgICAgICAgICAgICogYmVmb3JlIERhdGUgY3JlYXRpb24gdG8gYXZvaWQgdGltZSBvZmZzZXQgYW5kIGVycm9ycyBpbiB0aGUgbmV3IERhdGUuXG4gICAgICAgICAgICAgKiBJZiB3ZSBvbmx5IHJlcGxhY2UgJy0nIHdpdGggJywnIGluIHRoZSBJU08gU3RyaW5nIChcIjIwMTUsMDEsMDFcIiksIGFuZCB0cnkgdG8gY3JlYXRlIGEgbmV3XG4gICAgICAgICAgICAgKiBkYXRlLCBzb21lIGJyb3dzZXJzIChlLmcuIElFIDkpIHdpbGwgdGhyb3cgYW4gaW52YWxpZCBEYXRlIGVycm9yXG4gICAgICAgICAgICAgKiBJZiB3ZSBsZWF2ZSB0aGUgJy0nIChcIjIwMTUtMDEtMDFcIikgYW5kIHRyeSB0byBjcmVhdGUgYSBuZXcgRGF0ZShcIjIwMTUtMDEtMDFcIikgdGhlXG4gICAgICAgICAgICAgKiB0aW1lb2Zmc2V0XG4gICAgICAgICAgICAgKiBpcyBhcHBsaWVkXG4gICAgICAgICAgICAgKiBOb3RlOiBJU08gbW9udGhzIGFyZSAwIGZvciBKYW51YXJ5LCAxIGZvciBGZWJydWFyeSwgLi4uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBfYSA9IF9fcmVhZCh2YWx1ZS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbiAodmFsKSB7IHJldHVybiBwYXJzZUludCh2YWwsIDEwKTsgfSksIDMpLCB5ID0gX2FbMF0sIG0gPSBfYVsxXSwgZCA9IF9hWzJdO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0RhdGUkMShkYXRlKSkge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gdm9pZCAwO1xuICAgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSAmJiAobWF0Y2ggPSB2YWx1ZS5tYXRjaChJU084NjAxX0RBVEVfUkVHRVgpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUgPSBpc29TdHJpbmdUb0RhdGUobWF0Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKERlcHJlY2F0ZWREYXRlUGlwZV8xLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIERhdGVGb3JtYXR0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuX2xvY2FsZSwgRGVwcmVjYXRlZERhdGVQaXBlXzEuX0FMSUFTRVNbcGF0dGVybl0gfHwgcGF0dGVybik7XG4gICAgfTtcbiAgICB2YXIgRGVwcmVjYXRlZERhdGVQaXBlXzE7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlcHJlY2F0ZWREYXRlUGlwZS5fQUxJQVNFUyA9IHtcbiAgICAgICAgJ21lZGl1bSc6ICd5TU1NZGptcycsXG4gICAgICAgICdzaG9ydCc6ICd5TWRqbScsXG4gICAgICAgICdmdWxsRGF0ZSc6ICd5TU1NTUVFRUVkJyxcbiAgICAgICAgJ2xvbmdEYXRlJzogJ3lNTU1NZCcsXG4gICAgICAgICdtZWRpdW1EYXRlJzogJ3lNTU1kJyxcbiAgICAgICAgJ3Nob3J0RGF0ZSc6ICd5TWQnLFxuICAgICAgICAnbWVkaXVtVGltZSc6ICdqbXMnLFxuICAgICAgICAnc2hvcnRUaW1lJzogJ2ptJ1xuICAgIH07XG4gICAgRGVwcmVjYXRlZERhdGVQaXBlID0gRGVwcmVjYXRlZERhdGVQaXBlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdkYXRlJywgcHVyZTogdHJ1ZSB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoTE9DQUxFX0lEKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSlcbiAgICBdLCBEZXByZWNhdGVkRGF0ZVBpcGUpO1xuICAgIHJldHVybiBEZXByZWNhdGVkRGF0ZVBpcGU7XG59KCkpO1xuZnVuY3Rpb24gaXNEYXRlJDEodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZS52YWx1ZU9mKCkpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBmb3JtYXROdW1iZXIkMShwaXBlLCBsb2NhbGUsIHZhbHVlLCBzdHlsZSwgZGlnaXRzLCBjdXJyZW5jeSwgY3VycmVuY3lBc1N5bWJvbCkge1xuICAgIGlmIChjdXJyZW5jeSA9PT0gdm9pZCAwKSB7IGN1cnJlbmN5ID0gbnVsbDsgfVxuICAgIGlmIChjdXJyZW5jeUFzU3ltYm9sID09PSB2b2lkIDApIHsgY3VycmVuY3lBc1N5bWJvbCA9IGZhbHNlOyB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIC8vIENvbnZlcnQgc3RyaW5ncyB0byBudW1iZXJzXG4gICAgdmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTigrdmFsdWUgLSBwYXJzZUZsb2F0KHZhbHVlKSkgPyArdmFsdWUgOiB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IocGlwZSwgdmFsdWUpO1xuICAgIH1cbiAgICB2YXIgbWluSW50O1xuICAgIHZhciBtaW5GcmFjdGlvbjtcbiAgICB2YXIgbWF4RnJhY3Rpb247XG4gICAgaWYgKHN0eWxlICE9PSBOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeSkge1xuICAgICAgICAvLyByZWx5IG9uIEludGwgZGVmYXVsdCBmb3IgY3VycmVuY3lcbiAgICAgICAgbWluSW50ID0gMTtcbiAgICAgICAgbWluRnJhY3Rpb24gPSAwO1xuICAgICAgICBtYXhGcmFjdGlvbiA9IDM7XG4gICAgfVxuICAgIGlmIChkaWdpdHMpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gZGlnaXRzLm1hdGNoKE5VTUJFUl9GT1JNQVRfUkVHRVhQKTtcbiAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGlnaXRzICsgXCIgaXMgbm90IGEgdmFsaWQgZGlnaXQgaW5mbyBmb3IgbnVtYmVyIHBpcGVzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0c1sxXSAhPSBudWxsKSB7IC8vIG1pbiBpbnRlZ2VyIGRpZ2l0c1xuICAgICAgICAgICAgbWluSW50ID0gcGFyc2VJbnRBdXRvUmFkaXgocGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0c1szXSAhPSBudWxsKSB7IC8vIG1pbiBmcmFjdGlvbiBkaWdpdHNcbiAgICAgICAgICAgIG1pbkZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgocGFydHNbM10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0c1s1XSAhPSBudWxsKSB7IC8vIG1heCBmcmFjdGlvbiBkaWdpdHNcbiAgICAgICAgICAgIG1heEZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgocGFydHNbNV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXJGb3JtYXR0ZXIuZm9ybWF0KHZhbHVlLCBsb2NhbGUsIHN0eWxlLCB7XG4gICAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5JbnQsXG4gICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluRnJhY3Rpb24sXG4gICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWF4RnJhY3Rpb24sXG4gICAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcbiAgICAgICAgY3VycmVuY3lBc1N5bWJvbDogY3VycmVuY3lBc1N5bWJvbCxcbiAgICB9KTtcbn1cbi8qKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyB0ZXh0LiBHcm91cCBzaXppbmcgYW5kIHNlcGFyYXRvciBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljXG4gKiBjb25maWd1cmF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIGFjdGl2ZSBsb2NhbGUuXG4gKlxuICogd2hlcmUgYGV4cHJlc3Npb25gIGlzIGEgbnVtYmVyOlxuICogIC0gYGRpZ2l0SW5mb2AgaXMgYSBgc3RyaW5nYCB3aGljaCBoYXMgYSBmb2xsb3dpbmcgZm9ybWF0OiA8YnI+XG4gKiAgICAgPGNvZGU+e21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfTwvY29kZT5cbiAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2AgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIHRvIHVzZS4gRGVmYXVsdHMgdG8gYDFgLlxuICogICAtIGBtaW5GcmFjdGlvbkRpZ2l0c2AgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbi4gRGVmYXVsdHMgdG8gYDBgLlxuICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2AgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbi4gRGVmYXVsdHMgdG8gYDNgLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhY2NlcHRhYmxlIHJhbmdlIGZvciBlYWNoIG9mIHRoZXNlIG51bWJlcnMgYW5kIG90aGVyXG4gKiBkZXRhaWxzIHNlZSB5b3VyIG5hdGl2ZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5LlxuICpcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkgd2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzXG4gKiBhbmQgbWF5IHJlcXVpcmUgYSBwb2x5ZmlsbC4gU2VlIFtCcm93c2VyIFN1cHBvcnRdKGd1aWRlL2Jyb3dzZXItc3VwcG9ydCkgZm9yIGRldGFpbHMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvbnVtYmVyX3BpcGUudHMgcmVnaW9uPSdEZXByZWNhdGVkTnVtYmVyUGlwZSd9XG4gKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRGVwcmVjYXRlZERlY2ltYWxQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlcHJlY2F0ZWREZWNpbWFsUGlwZShfbG9jYWxlKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7XG4gICAgfVxuICAgIERlcHJlY2F0ZWREZWNpbWFsUGlwZV8xID0gRGVwcmVjYXRlZERlY2ltYWxQaXBlO1xuICAgIERlcHJlY2F0ZWREZWNpbWFsUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBkaWdpdHMpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlciQxKERlcHJlY2F0ZWREZWNpbWFsUGlwZV8xLCB0aGlzLl9sb2NhbGUsIHZhbHVlLCBOdW1iZXJGb3JtYXRTdHlsZS5EZWNpbWFsLCBkaWdpdHMpO1xuICAgIH07XG4gICAgdmFyIERlcHJlY2F0ZWREZWNpbWFsUGlwZV8xO1xuICAgIERlcHJlY2F0ZWREZWNpbWFsUGlwZSA9IERlcHJlY2F0ZWREZWNpbWFsUGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIFBpcGUoeyBuYW1lOiAnbnVtYmVyJyB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoTE9DQUxFX0lEKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSlcbiAgICBdLCBEZXByZWNhdGVkRGVjaW1hbFBpcGUpO1xuICAgIHJldHVybiBEZXByZWNhdGVkRGVjaW1hbFBpcGU7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyBwZXJjZW50YWdlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuXG4gKlxuICogLSBgZGlnaXRJbmZvYCBTZWUge0BsaW5rIERlY2ltYWxQaXBlfSBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24uXG4gKlxuICogV0FSTklORzogdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnNcbiAqIGFuZCBtYXkgcmVxdWlyZSBhIHBvbHlmaWxsLiBTZWUgW0Jyb3dzZXIgU3VwcG9ydF0oZ3VpZGUvYnJvd3Nlci1zdXBwb3J0KSBmb3IgZGV0YWlscy5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9waXBlcy90cy9wZXJjZW50X3BpcGUudHMgcmVnaW9uPSdEZXByZWNhdGVkUGVyY2VudFBpcGUnfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERlcHJlY2F0ZWRQZXJjZW50UGlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZXByZWNhdGVkUGVyY2VudFBpcGUoX2xvY2FsZSkge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlO1xuICAgIH1cbiAgICBEZXByZWNhdGVkUGVyY2VudFBpcGVfMSA9IERlcHJlY2F0ZWRQZXJjZW50UGlwZTtcbiAgICBEZXByZWNhdGVkUGVyY2VudFBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSwgZGlnaXRzKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXROdW1iZXIkMShEZXByZWNhdGVkUGVyY2VudFBpcGVfMSwgdGhpcy5fbG9jYWxlLCB2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuUGVyY2VudCwgZGlnaXRzKTtcbiAgICB9O1xuICAgIHZhciBEZXByZWNhdGVkUGVyY2VudFBpcGVfMTtcbiAgICBEZXByZWNhdGVkUGVyY2VudFBpcGUgPSBEZXByZWNhdGVkUGVyY2VudFBpcGVfMSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBQaXBlKHsgbmFtZTogJ3BlcmNlbnQnIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChMT0NBTEVfSUQpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKVxuICAgIF0sIERlcHJlY2F0ZWRQZXJjZW50UGlwZSk7XG4gICAgcmV0dXJuIERlcHJlY2F0ZWRQZXJjZW50UGlwZTtcbn0oKSk7XG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgY3VycmVuY3kgdXNpbmcgbG9jYWxlIHJ1bGVzLlxuICpcbiAqIFVzZSBgY3VycmVuY3lgIHRvIGZvcm1hdCBhIG51bWJlciBhcyBjdXJyZW5jeS5cbiAqXG4gKiAtIGBjdXJyZW5jeUNvZGVgIGlzIHRoZSBbSVNPIDQyMTddKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT180MjE3KSBjdXJyZW5jeSBjb2RlLCBzdWNoXG4gKiAgICBhcyBgVVNEYCBmb3IgdGhlIFVTIGRvbGxhciBhbmQgYEVVUmAgZm9yIHRoZSBldXJvLlxuICogLSBgc3ltYm9sRGlzcGxheWAgaXMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB1c2UgdGhlIGN1cnJlbmN5IHN5bWJvbCBvciBjb2RlLlxuICogICAtIGB0cnVlYDogdXNlIHN5bWJvbCAoZS5nLiBgJGApLlxuICogICAtIGBmYWxzZWAoZGVmYXVsdCk6IHVzZSBjb2RlIChlLmcuIGBVU0RgKS5cbiAqIC0gYGRpZ2l0SW5mb2AgU2VlIHtAbGluayBEZWNpbWFsUGlwZX0gZm9yIGRldGFpbGVkIGRlc2NyaXB0aW9uLlxuICpcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkgd2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzXG4gKiBhbmQgbWF5IHJlcXVpcmUgYSBwb2x5ZmlsbC4gU2VlIFtCcm93c2VyIFN1cHBvcnRdKGd1aWRlL2Jyb3dzZXItc3VwcG9ydCkgZm9yIGRldGFpbHMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvY3VycmVuY3lfcGlwZS50cyByZWdpb249J0RlcHJlY2F0ZWRDdXJyZW5jeVBpcGUnfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERlcHJlY2F0ZWRDdXJyZW5jeVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwcmVjYXRlZEN1cnJlbmN5UGlwZShfbG9jYWxlKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7XG4gICAgfVxuICAgIERlcHJlY2F0ZWRDdXJyZW5jeVBpcGVfMSA9IERlcHJlY2F0ZWRDdXJyZW5jeVBpcGU7XG4gICAgRGVwcmVjYXRlZEN1cnJlbmN5UGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBjdXJyZW5jeUNvZGUsIHN5bWJvbERpc3BsYXksIGRpZ2l0cykge1xuICAgICAgICBpZiAoY3VycmVuY3lDb2RlID09PSB2b2lkIDApIHsgY3VycmVuY3lDb2RlID0gJ1VTRCc7IH1cbiAgICAgICAgaWYgKHN5bWJvbERpc3BsYXkgPT09IHZvaWQgMCkgeyBzeW1ib2xEaXNwbGF5ID0gZmFsc2U7IH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlciQxKERlcHJlY2F0ZWRDdXJyZW5jeVBpcGVfMSwgdGhpcy5fbG9jYWxlLCB2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3ksIGRpZ2l0cywgY3VycmVuY3lDb2RlLCBzeW1ib2xEaXNwbGF5KTtcbiAgICB9O1xuICAgIHZhciBEZXByZWNhdGVkQ3VycmVuY3lQaXBlXzE7XG4gICAgRGVwcmVjYXRlZEN1cnJlbmN5UGlwZSA9IERlcHJlY2F0ZWRDdXJyZW5jeVBpcGVfMSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBQaXBlKHsgbmFtZTogJ2N1cnJlbmN5JyB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoTE9DQUxFX0lEKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSlcbiAgICBdLCBEZXByZWNhdGVkQ3VycmVuY3lQaXBlKTtcbiAgICByZXR1cm4gRGVwcmVjYXRlZEN1cnJlbmN5UGlwZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGRlcHJlY2F0ZWQgaTE4biBwaXBlcyB0aGF0IHJlcXVpcmUgaW50bCBhcGlcbiAqXG4gKiBAZGVwcmVjYXRlZCBmcm9tIHY1XG4gKi9cbnZhciBDT01NT05fREVQUkVDQVRFRF9JMThOX1BJUEVTID0gW0RlcHJlY2F0ZWREZWNpbWFsUGlwZSwgRGVwcmVjYXRlZFBlcmNlbnRQaXBlLCBEZXByZWNhdGVkQ3VycmVuY3lQaXBlLCBEZXByZWNhdGVkRGF0ZVBpcGVdO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgT2JzZXJ2YWJsZVN0cmF0ZWd5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE9ic2VydmFibGVTdHJhdGVneSgpIHtcbiAgICB9XG4gICAgT2JzZXJ2YWJsZVN0cmF0ZWd5LnByb3RvdHlwZS5jcmVhdGVTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoYXN5bmMsIHVwZGF0ZUxhdGVzdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhc3luYy5zdWJzY3JpYmUoeyBuZXh0OiB1cGRhdGVMYXRlc3RWYWx1ZSwgZXJyb3I6IGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0gfSk7XG4gICAgfTtcbiAgICBPYnNlcnZhYmxlU3RyYXRlZ3kucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOyB9O1xuICAgIE9ic2VydmFibGVTdHJhdGVneS5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikgeyBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsgfTtcbiAgICByZXR1cm4gT2JzZXJ2YWJsZVN0cmF0ZWd5O1xufSgpKTtcbnZhciBQcm9taXNlU3RyYXRlZ3kgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUHJvbWlzZVN0cmF0ZWd5KCkge1xuICAgIH1cbiAgICBQcm9taXNlU3RyYXRlZ3kucHJvdG90eXBlLmNyZWF0ZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIChhc3luYywgdXBkYXRlTGF0ZXN0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jLnRoZW4odXBkYXRlTGF0ZXN0VmFsdWUsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pO1xuICAgIH07XG4gICAgUHJvbWlzZVN0cmF0ZWd5LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikgeyB9O1xuICAgIFByb21pc2VTdHJhdGVneS5wcm90b3R5cGUub25EZXN0cm95ID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikgeyB9O1xuICAgIHJldHVybiBQcm9taXNlU3RyYXRlZ3k7XG59KCkpO1xudmFyIF9wcm9taXNlU3RyYXRlZ3kgPSBuZXcgUHJvbWlzZVN0cmF0ZWd5KCk7XG52YXIgX29ic2VydmFibGVTdHJhdGVneSA9IG5ldyBPYnNlcnZhYmxlU3RyYXRlZ3koKTtcbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogVW53cmFwcyBhIHZhbHVlIGZyb20gYW4gYXN5bmNocm9ub3VzIHByaW1pdGl2ZS5cbiAqXG4gKiBUaGUgYGFzeW5jYCBwaXBlIHN1YnNjcmliZXMgdG8gYW4gYE9ic2VydmFibGVgIG9yIGBQcm9taXNlYCBhbmQgcmV0dXJucyB0aGUgbGF0ZXN0IHZhbHVlIGl0IGhhc1xuICogZW1pdHRlZC4gV2hlbiBhIG5ldyB2YWx1ZSBpcyBlbWl0dGVkLCB0aGUgYGFzeW5jYCBwaXBlIG1hcmtzIHRoZSBjb21wb25lbnQgdG8gYmUgY2hlY2tlZCBmb3JcbiAqIGNoYW5nZXMuIFdoZW4gdGhlIGNvbXBvbmVudCBnZXRzIGRlc3Ryb3llZCwgdGhlIGBhc3luY2AgcGlwZSB1bnN1YnNjcmliZXMgYXV0b21hdGljYWxseSB0byBhdm9pZFxuICogcG90ZW50aWFsIG1lbW9yeSBsZWFrcy5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIFRoaXMgZXhhbXBsZSBiaW5kcyBhIGBQcm9taXNlYCB0byB0aGUgdmlldy4gQ2xpY2tpbmcgdGhlIGBSZXNvbHZlYCBidXR0b24gcmVzb2x2ZXMgdGhlXG4gKiBwcm9taXNlLlxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZVByb21pc2UnfVxuICpcbiAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0byB1c2UgYGFzeW5jYCB3aXRoIE9ic2VydmFibGVzLiBUaGUgZXhhbXBsZSBiZWxvdyBiaW5kcyB0aGUgYHRpbWVgIE9ic2VydmFibGVcbiAqIHRvIHRoZSB2aWV3LiBUaGUgT2JzZXJ2YWJsZSBjb250aW51b3VzbHkgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9waXBlcy90cy9hc3luY19waXBlLnRzIHJlZ2lvbj0nQXN5bmNQaXBlT2JzZXJ2YWJsZSd9XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQXN5bmNQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFzeW5jUGlwZShfcmVmKSB7XG4gICAgICAgIHRoaXMuX3JlZiA9IF9yZWY7XG4gICAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX29iaiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N0cmF0ZWd5ID0gbnVsbDtcbiAgICB9XG4gICAgQXN5bmNQaXBlXzEgPSBBc3luY1BpcGU7XG4gICAgQXN5bmNQaXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBc3luY1BpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vYmopIHtcbiAgICAgICAgICAgIGlmIChvYmopIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUob2JqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSB0aGlzLl9sYXRlc3RWYWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqICE9PSB0aGlzLl9vYmopIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShvYmopO1xuICAgICAgICB9XG4gICAgICAgIGlmICjJtWxvb3NlSWRlbnRpY2FsKHRoaXMuX2xhdGVzdFZhbHVlLCB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlO1xuICAgICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpO1xuICAgIH07XG4gICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9vYmogPSBvYmo7XG4gICAgICAgIHRoaXMuX3N0cmF0ZWd5ID0gdGhpcy5fc2VsZWN0U3RyYXRlZ3kob2JqKTtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBfdGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUob2JqLCB2YWx1ZSk7IH0pO1xuICAgIH07XG4gICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fc2VsZWN0U3RyYXRlZ3kgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIGlmICjJtWlzUHJvbWlzZShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gX3Byb21pc2VTdHJhdGVneTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoybVpc09ic2VydmFibGUob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlU3RyYXRlZ3k7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEFzeW5jUGlwZV8xLCBvYmopO1xuICAgIH07XG4gICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fc3RyYXRlZ3kuZGlzcG9zZSh0aGlzLl9zdWJzY3JpcHRpb24pO1xuICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLl9vYmogPSBudWxsO1xuICAgIH07XG4gICAgQXN5bmNQaXBlLnByb3RvdHlwZS5fdXBkYXRlTGF0ZXN0VmFsdWUgPSBmdW5jdGlvbiAoYXN5bmMsIHZhbHVlKSB7XG4gICAgICAgIGlmIChhc3luYyA9PT0gdGhpcy5fb2JqKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgQXN5bmNQaXBlXzE7XG4gICAgQXN5bmNQaXBlID0gQXN5bmNQaXBlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBQaXBlKHsgbmFtZTogJ2FzeW5jJywgcHVyZTogZmFsc2UgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQ2hhbmdlRGV0ZWN0b3JSZWZdKVxuICAgIF0sIEFzeW5jUGlwZSk7XG4gICAgcmV0dXJuIEFzeW5jUGlwZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVHJhbnNmb3JtcyB0ZXh0IHRvIGFsbCBsb3dlciBjYXNlLlxuICpcbiAqIEBzZWUgYFVwcGVyQ2FzZVBpcGVgXG4gKiBAc2VlIGBUaXRsZUNhc2VQaXBlYFxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIHZpZXcgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXJcbiAqIHRleHQsIGFuZCB0aGVuIHVzZXMgdGhlIHBpcGUgdG8gY29udmVydCB0aGUgaW5wdXQgdGV4dCB0byBhbGwgbG93ZXIgY2FzZS5cbiAqXG4gKiA8Y29kZS1leGFtcGxlIHBhdGg9XCJjb21tb24vcGlwZXMvdHMvbG93ZXJ1cHBlcl9waXBlLnRzXCIgcmVnaW9uPSdMb3dlclVwcGVyUGlwZSc+PC9jb2RlLWV4YW1wbGU+XG4gKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTG93ZXJDYXNlUGlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMb3dlckNhc2VQaXBlKCkge1xuICAgIH1cbiAgICBMb3dlckNhc2VQaXBlXzEgPSBMb3dlckNhc2VQaXBlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHRyYW5zZm9ybSB0byBsb3dlciBjYXNlLlxuICAgICAqL1xuICAgIExvd2VyQ2FzZVBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKExvd2VyQ2FzZVBpcGVfMSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH07XG4gICAgdmFyIExvd2VyQ2FzZVBpcGVfMTtcbiAgICBMb3dlckNhc2VQaXBlID0gTG93ZXJDYXNlUGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdsb3dlcmNhc2UnIH0pXG4gICAgXSwgTG93ZXJDYXNlUGlwZSk7XG4gICAgcmV0dXJuIExvd2VyQ2FzZVBpcGU7XG59KCkpO1xuLy9cbi8vIFJlZ2V4IGJlbG93IG1hdGNoZXMgYW55IFVuaWNvZGUgd29yZCBhbmQgY29tcGF0aWJsZSB3aXRoIEVTNS4gSW4gRVMyMDE4IHRoZSBzYW1lIHJlc3VsdFxuLy8gY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIC9cXHB7TH1cXFMqL2d1IGFuZCBhbHNvIGtub3duIGFzIFVuaWNvZGUgUHJvcGVydHkgRXNjYXBlc1xuLy8gKGh0dHA6Ly8yYWxpdHkuY29tLzIwMTcvMDcvcmVnZXhwLXVuaWNvZGUtcHJvcGVydHktZXNjYXBlcy5odG1sKS4gU2luY2UgdGhlcmUgaXMgbm9cbi8vIHRyYW5zcGlsYXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGRvd24gdG8gRVM1IHdpdGhvdXQgZXh0ZXJuYWwgdG9vbCwgdGhlIG9ubHkgc29sdXRpb24gaXNcbi8vIHRvIHVzZSBhbHJlYWR5IHRyYW5zcGlsZWQgZm9ybS4gRXhhbXBsZSBjYW4gYmUgZm91bmQgaGVyZSAtXG4vLyBodHRwczovL21vdGhlcmVmZi5pbi9yZWdleHB1I2lucHV0PXZhcityZWdleCslM0QrLyU1Q3AlN0JMJTdEL3UlM0ImdW5pY29kZVByb3BlcnR5RXNjYXBlPTFcbi8vXG52YXIgdW5pY29kZVdvcmRNYXRjaCA9IC8oPzpbQS1aYS16XFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwODYwLVxcdTA4NkFcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTA5RkNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQUY5XFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OC1cXHUwQzVBXFx1MEM2MFxcdTBDNjFcXHUwQzgwXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDU0LVxcdTBENTZcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZGMS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4ODRcXHUxODg3LVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE4M1xcdTIxODRcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJFMkZcXHUzMDA1XFx1MzAwNlxcdTMwMzEtXFx1MzAzNVxcdTMwM0JcXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJFXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkVBXFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RTVcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERjAwLVxcdURGMUZcXHVERjJELVxcdURGNDBcXHVERjQyLVxcdURGNDlcXHVERjUwLVxcdURGNzVcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENCMC1cXHVEQ0QzXFx1RENEOC1cXHVEQ0ZCXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTJCXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVERVxcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNEXFx1REY1MFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzAwLVxcdURDMzRcXHVEQzQ3LVxcdURDNEFcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVEREQ4LVxcdUREREJcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXFx1REYwMC1cXHVERjE5XXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERTAwXFx1REUwQi1cXHVERTMyXFx1REUzQVxcdURFNTBcXHVERTVDLVxcdURFODNcXHVERTg2LVxcdURFODlcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDdbXFx1REMwMC1cXHVEQzA4XFx1REMwQS1cXHVEQzJFXFx1REM0MFxcdURDNzItXFx1REM4RlxcdUREMDAtXFx1REQwNlxcdUREMDhcXHVERDA5XFx1REQwQi1cXHVERDMwXFx1REQ0Nl18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4MUMtXFx1RDgyMFxcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3MlxcdUQ4NzQtXFx1RDg3OV1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZcXHVERkUwXFx1REZFMV18XFx1RDgyMVtcXHVEQzAwLVxcdURGRUNdfFxcdUQ4MjJbXFx1REMwMC1cXHVERUYyXXxcXHVEODJDW1xcdURDMDAtXFx1REQxRVxcdURENzAtXFx1REVGQl18XFx1RDgyRltcXHVEQzAwLVxcdURDNkFcXHVEQzcwLVxcdURDN0NcXHVEQzgwLVxcdURDODhcXHVEQzkwLVxcdURDOTldfFxcdUQ4MzVbXFx1REMwMC1cXHVEQzU0XFx1REM1Ni1cXHVEQzlDXFx1REM5RVxcdURDOUZcXHVEQ0EyXFx1RENBNVxcdURDQTZcXHVEQ0E5LVxcdURDQUNcXHVEQ0FFLVxcdURDQjlcXHVEQ0JCXFx1RENCRC1cXHVEQ0MzXFx1RENDNS1cXHVERDA1XFx1REQwNy1cXHVERDBBXFx1REQwRC1cXHVERDE0XFx1REQxNi1cXHVERDFDXFx1REQxRS1cXHVERDM5XFx1REQzQi1cXHVERDNFXFx1REQ0MC1cXHVERDQ0XFx1REQ0NlxcdURENEEtXFx1REQ1MFxcdURENTItXFx1REVBNVxcdURFQTgtXFx1REVDMFxcdURFQzItXFx1REVEQVxcdURFREMtXFx1REVGQVxcdURFRkMtXFx1REYxNFxcdURGMTYtXFx1REYzNFxcdURGMzYtXFx1REY0RVxcdURGNTAtXFx1REY2RVxcdURGNzAtXFx1REY4OFxcdURGOEEtXFx1REZBOFxcdURGQUEtXFx1REZDMlxcdURGQzQtXFx1REZDQl18XFx1RDgzQVtcXHVEQzAwLVxcdURDQzRcXHVERDAwLVxcdURENDNdfFxcdUQ4M0JbXFx1REUwMC1cXHVERTAzXFx1REUwNS1cXHVERTFGXFx1REUyMVxcdURFMjJcXHVERTI0XFx1REUyN1xcdURFMjktXFx1REUzMlxcdURFMzQtXFx1REUzN1xcdURFMzlcXHVERTNCXFx1REU0MlxcdURFNDdcXHVERTQ5XFx1REU0QlxcdURFNEQtXFx1REU0RlxcdURFNTFcXHVERTUyXFx1REU1NFxcdURFNTdcXHVERTU5XFx1REU1QlxcdURFNURcXHVERTVGXFx1REU2MVxcdURFNjJcXHVERTY0XFx1REU2Ny1cXHVERTZBXFx1REU2Qy1cXHVERTcyXFx1REU3NC1cXHVERTc3XFx1REU3OS1cXHVERTdDXFx1REU3RVxcdURFODAtXFx1REU4OVxcdURFOEItXFx1REU5QlxcdURFQTEtXFx1REVBM1xcdURFQTUtXFx1REVBOVxcdURFQUItXFx1REVCQl18XFx1RDg2OVtcXHVEQzAwLVxcdURFRDZcXHVERjAwLVxcdURGRkZdfFxcdUQ4NkRbXFx1REMwMC1cXHVERjM0XFx1REY0MC1cXHVERkZGXXxcXHVEODZFW1xcdURDMDAtXFx1REMxRFxcdURDMjAtXFx1REZGRl18XFx1RDg3M1tcXHVEQzAwLVxcdURFQTFcXHVERUIwLVxcdURGRkZdfFxcdUQ4N0FbXFx1REMwMC1cXHVERkUwXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF0pXFxTKi9nO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIHRleHQgdG8gdGl0bGUgY2FzZS5cbiAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkLCBhbmQgdHJhbnNmb3JtcyB0aGVcbiAqIHJlc3Qgb2YgdGhlIHdvcmQgdG8gbG93ZXIgY2FzZS5cbiAqIFdvcmRzIGFyZSBkZWxpbWl0ZWQgYnkgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBzdWNoIGFzIGEgc3BhY2UsIHRhYiwgb3IgbGluZS1mZWVkIGNoYXJhY3Rlci5cbiAqXG4gKiBAc2VlIGBMb3dlckNhc2VQaXBlYFxuICogQHNlZSBgVXBwZXJDYXNlUGlwZWBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHZhcmlvdXMgc3RyaW5ncyBpbnRvIHRpdGxlIGNhc2UuXG4gKlxuICogPGNvZGUtZXhhbXBsZSBwYXRoPVwiY29tbW9uL3BpcGVzL3RzL3RpdGxlY2FzZV9waXBlLnRzXCIgcmVnaW9uPSdUaXRsZUNhc2VQaXBlJz48L2NvZGUtZXhhbXBsZT5cbiAqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBUaXRsZUNhc2VQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpdGxlQ2FzZVBpcGUoKSB7XG4gICAgfVxuICAgIFRpdGxlQ2FzZVBpcGVfMSA9IFRpdGxlQ2FzZVBpcGU7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtIHRvIHRpdGxlIGNhc2UuXG4gICAgICovXG4gICAgVGl0bGVDYXNlUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVGl0bGVDYXNlUGlwZV8xLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UodW5pY29kZVdvcmRNYXRjaCwgKGZ1bmN0aW9uICh0eHQpIHsgcmV0dXJuIHR4dFswXS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpOyB9KSk7XG4gICAgfTtcbiAgICB2YXIgVGl0bGVDYXNlUGlwZV8xO1xuICAgIFRpdGxlQ2FzZVBpcGUgPSBUaXRsZUNhc2VQaXBlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBQaXBlKHsgbmFtZTogJ3RpdGxlY2FzZScgfSlcbiAgICBdLCBUaXRsZUNhc2VQaXBlKTtcbiAgICByZXR1cm4gVGl0bGVDYXNlUGlwZTtcbn0oKSk7XG4vKipcbiAqIFRyYW5zZm9ybXMgdGV4dCB0byBhbGwgdXBwZXIgY2FzZS5cbiAqIEBzZWUgYExvd2VyQ2FzZVBpcGVgXG4gKiBAc2VlIGBUaXRsZUNhc2VQaXBlYFxuICpcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFVwcGVyQ2FzZVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVXBwZXJDYXNlUGlwZSgpIHtcbiAgICB9XG4gICAgVXBwZXJDYXNlUGlwZV8xID0gVXBwZXJDYXNlUGlwZTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdXBwZXIgY2FzZS5cbiAgICAgKi9cbiAgICBVcHBlckNhc2VQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihVcHBlckNhc2VQaXBlXzEsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICB9O1xuICAgIHZhciBVcHBlckNhc2VQaXBlXzE7XG4gICAgVXBwZXJDYXNlUGlwZSA9IFVwcGVyQ2FzZVBpcGVfMSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIFBpcGUoeyBuYW1lOiAndXBwZXJjYXNlJyB9KVxuICAgIF0sIFVwcGVyQ2FzZVBpcGUpO1xuICAgIHJldHVybiBVcHBlckNhc2VQaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gY2xhbmctZm9ybWF0IG9mZlxuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBGb3JtYXRzIGEgZGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLlxuICpcbiAqIE9ubHkgdGhlIGBlbi1VU2AgbG9jYWxlIGRhdGEgY29tZXMgd2l0aCBBbmd1bGFyLiBUbyBsb2NhbGl6ZSBkYXRlc1xuICogaW4gYW5vdGhlciBsYW5ndWFnZSwgeW91IG11c3QgaW1wb3J0IHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsZSBkYXRhLlxuICogU2VlIHRoZSBbSTE4biBndWlkZV0oZ3VpZGUvaTE4biNpMThuLXBpcGVzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAc2VlIGBmb3JtYXREYXRlKClgXG4gKlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogVGhlIHJlc3VsdCBvZiB0aGlzIHBpcGUgaXMgbm90IHJlZXZhbHVhdGVkIHdoZW4gdGhlIGlucHV0IGlzIG11dGF0ZWQuIFRvIGF2b2lkIHRoZSBuZWVkIHRvXG4gKiByZWZvcm1hdCB0aGUgZGF0ZSBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB0cmVhdCB0aGUgZGF0ZSBhcyBhbiBpbW11dGFibGUgb2JqZWN0XG4gKiBhbmQgY2hhbmdlIHRoZSByZWZlcmVuY2Ugd2hlbiB0aGUgcGlwZSBuZWVkcyB0byBydW4gYWdhaW4uXG4gKlxuICogIyMjIFByZS1kZWZpbmVkIGZvcm1hdCBvcHRpb25zXG4gKlxuICogRXhhbXBsZXMgYXJlIGdpdmVuIGluIGBlbi1VU2AgbG9jYWxlLlxuICpcbiAqIC0gYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5LCBoOm1tIGEnYCAoYDYvMTUvMTUsIDk6MDMgQU1gKS5cbiAqIC0gYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5LCBoOm1tOnNzIGEnYCAoYEp1biAxNSwgMjAxNSwgOTowMzowMSBBTWApLlxuICogLSBgJ2xvbmcnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSwgaDptbTpzcyBhIHonYCAoYEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTVxuICogR01UKzFgKS5cbiAqIC0gYCdmdWxsJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHksIGg6bW06c3MgYSB6enp6J2AgKGBNb25kYXksIEp1bmUgMTUsIDIwMTUgYXRcbiAqIDk6MDM6MDEgQU0gR01UKzAxOjAwYCkuXG4gKiAtIGAnc2hvcnREYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXknYCAoYDYvMTUvMTVgKS5cbiAqIC0gYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSdgIChgSnVuIDE1LCAyMDE1YCkuXG4gKiAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSdgIChgSnVuZSAxNSwgMjAxNWApLlxuICogLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHknYCAoYE1vbmRheSwgSnVuZSAxNSwgMjAxNWApLlxuICogLSBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbSBhJ2AgKGA5OjAzIEFNYCkuXG4gKiAtIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgKGA5OjAzOjAxIEFNYCkuXG4gKiAtIGAnbG9uZ1RpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSB6J2AgKGA5OjAzOjAxIEFNIEdNVCsxYCkuXG4gKiAtIGAnZnVsbFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSB6enp6J2AgKGA5OjAzOjAxIEFNIEdNVCswMTowMGApLlxuICpcbiAqICMjIyBDdXN0b20gZm9ybWF0IG9wdGlvbnNcbiAqXG4gKiBZb3UgY2FuIGNvbnN0cnVjdCBhIGZvcm1hdCBzdHJpbmcgdXNpbmcgc3ltYm9scyB0byBzcGVjaWZ5IHRoZSBjb21wb25lbnRzXG4gKiBvZiBhIGRhdGUtdGltZSB2YWx1ZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuXG4gKiBGb3JtYXQgZGV0YWlscyBkZXBlbmQgb24gdGhlIGxvY2FsZS5cbiAqIEZpZWxkcyBtYXJrZWQgd2l0aCAoKikgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBleHRyYSBkYXRhIHNldCBmb3IgdGhlIGdpdmVuIGxvY2FsZS5cbiAqXG4gKiAgfCBGaWVsZCB0eXBlICAgICAgICAgfCBGb3JtYXQgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogIHwgRXJhICAgICAgICAgICAgICAgIHwgRywgR0cgJiBHR0cgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBbm5vIERvbWluaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgWWVhciAgICAgICAgICAgICAgIHwgeSAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiwgMjAsIDIwMSwgMjAxNywgMjAxNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMiwgMjAsIDAxLCAxNywgNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwMiwgMDIwLCAyMDEsIDIwMTcsIDIwMTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICAgICAgfCBOdW1lcmljOiA0IGRpZ2l0cyBvciBtb3JlICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgIHwgMDAwMiwgMDAyMCwgMDIwMSwgMjAxNywgMjAxNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBNb250aCAgICAgICAgICAgICAgfCBNICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICAgICAgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXB0ZW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgTW9udGggc3RhbmRhbG9uZSAgIHwgTCAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgICAgIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwdGVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgICAgICB8IE5hcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8IFdlZWsgb2YgeWVhciAgICAgICB8IHcgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBXZWVrIG9mIG1vbnRoICAgICAgfCBXICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLi4uIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8IERheSBvZiBtb250aCAgICAgICB8IGQgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgV2VlayBkYXkgICAgICAgICAgIHwgRSwgRUUgJiBFRUUgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUdWVzZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICAgICAgfCBTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBQZXJpb2QgICAgICAgICAgICAgfCBhLCBhYSAmIGFhYSB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbS9wbSBvciBBTS9QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgICAgIHwgV2lkZSAoZmFsbGJhY2sgdG8gYGFgIHdoZW4gbWlzc2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFudGUgbWVyaWRpZW0vcG9zdCBtZXJpZGllbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBQZXJpb2QqICAgICAgICAgICAgfCBCLCBCQiAmIEJCQiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgICAgIHwgV2lkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFtLCBwbSwgbWlkbmlnaHQsIG5vb24sIG1vcm5pbmcsIGFmdGVybm9vbiwgZXZlbmluZywgbmlnaHQgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBQZXJpb2Qgc3RhbmRhbG9uZSogfCBiLCBiYiAmIGJiYiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgICAgIHwgV2lkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFtLCBwbSwgbWlkbmlnaHQsIG5vb24sIG1vcm5pbmcsIGFmdGVybm9vbiwgZXZlbmluZywgbmlnaHQgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBIb3VyIDEtMTIgICAgICAgICAgfCBoICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgSG91ciAwLTIzICAgICAgICAgIHwgSCAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8IE1pbnV0ZSAgICAgICAgICAgICB8IG0gICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgsIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDgsIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCBTZWNvbmQgICAgICAgICAgICAgfCBzICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgRnJhY3Rpb25hbCBzZWNvbmRzIHwgUyAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMC4uLiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMC4uLiA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAoPSBtaWxsaXNlY29uZHMpICAgICAgICAgICAgICB8IDAwMC4uLiA5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgWm9uZSAgICAgICAgICAgICAgIHwgeiwgenogJiB6enogfCBTaG9ydCBzcGVjaWZpYyBub24gbG9jYXRpb24gZm9ybWF0IChmYWxsYmFjayB0byBPKSAgICAgICAgICAgIHwgR01ULTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgICAgICB8IExvbmcgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gT09PTykgICAgICAgICAgfCBHTVQtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IFosIFpaICYgWlpaIHwgSVNPODYwMSBiYXNpYyBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0wODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgWlpaWiAgICAgICAgfCBMb25nIGxvY2FsaXplZCBHTVQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgfCAgICAgICAgICAgICAgICAgICAgfCBaWlpaWiAgICAgICB8IElTTzg2MDEgZXh0ZW5kZWQgZm9ybWF0ICsgWiBpbmRpY2F0b3IgZm9yIG9mZnNldCAwICg9IFhYWFhYKSAgfCAtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE8sIE9PICYgT09PIHwgU2hvcnQgbG9jYWxpemVkIEdNVCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogIHwgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICAgICAgfCBMb25nIGxvY2FsaXplZCBHTVQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTA4OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTm90ZSB0aGF0IHRpbWV6b25lIGNvcnJlY3Rpb24gaXMgbm90IGFwcGxpZWQgdG8gYW4gSVNPIHN0cmluZyB0aGF0IGhhcyBubyB0aW1lIGNvbXBvbmVudCwgc3VjaCBhcyBcIjIwMTYtMDktMTlcIlxuICpcbiAqICMjIyBGb3JtYXQgZXhhbXBsZXNcbiAqXG4gKiBUaGVzZSBleGFtcGxlcyB0cmFuc2Zvcm0gYSBkYXRlIGludG8gdmFyaW91cyBmb3JtYXRzLFxuICogYXNzdW1pbmcgdGhhdCBgZGF0ZU9iamAgaXMgYSBKYXZhU2NyaXB0IGBEYXRlYCBvYmplY3QgZm9yXG4gKiB5ZWFyOiAyMDE1LCBtb250aDogNiwgZGF5OiAxNSwgaG91cjogMjEsIG1pbnV0ZTogNDMsIHNlY29uZDogMTEsXG4gKiBnaXZlbiBpbiB0aGUgbG9jYWwgdGltZSBmb3IgdGhlIGBlbi1VU2AgbG9jYWxlLlxuICpcbiAqIGBgYFxuICoge3sgZGF0ZU9iaiB8IGRhdGUgfX0gICAgICAgICAgICAgICAvLyBvdXRwdXQgaXMgJ0p1biAxNSwgMjAxNSdcbiAqIHt7IGRhdGVPYmogfCBkYXRlOidtZWRpdW0nIH19ICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUsIDk6NDM6MTEgUE0nXG4gKiB7eyBkYXRlT2JqIHwgZGF0ZTonc2hvcnRUaW1lJyB9fSAgIC8vIG91dHB1dCBpcyAnOTo0MyBQTSdcbiAqIHt7IGRhdGVPYmogfCBkYXRlOidtbTpzcycgfX0gICAgICAgLy8gb3V0cHV0IGlzICc0MzoxMSdcbiAqIGBgYFxuICpcbiAqICMjIyBVc2FnZSBleGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBjb21wb25lbnQgdXNlcyBhIGRhdGUgcGlwZSB0byBkaXNwbGF5IHRoZSBjdXJyZW50IGRhdGUgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ2RhdGUtcGlwZScsXG4gKiAgdGVtcGxhdGU6IGA8ZGl2PlxuICogICAgPHA+VG9kYXkgaXMge3t0b2RheSB8IGRhdGV9fTwvcD5cbiAqICAgIDxwPk9yIGlmIHlvdSBwcmVmZXIsIHt7dG9kYXkgfCBkYXRlOidmdWxsRGF0ZSd9fTwvcD5cbiAqICAgIDxwPlRoZSB0aW1lIGlzIHt7dG9kYXkgfCBkYXRlOidoOm1tIGEgeid9fTwvcD5cbiAqICA8L2Rpdj5gXG4gKiB9KVxuICogLy8gR2V0IHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgYXMgYSBkYXRlLXRpbWUgdmFsdWUuXG4gKiBleHBvcnQgY2xhc3MgRGF0ZVBpcGVDb21wb25lbnQge1xuICogICB0b2RheTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuLy8gY2xhbmctZm9ybWF0IG9uXG52YXIgRGF0ZVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGF0ZVBpcGUobG9jYWxlKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgIH1cbiAgICBEYXRlUGlwZV8xID0gRGF0ZVBpcGU7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBkYXRlIGV4cHJlc3Npb246IGEgYERhdGVgIG9iamVjdCwgIGEgbnVtYmVyXG4gICAgICogKG1pbGxpc2Vjb25kcyBzaW5jZSBVVEMgZXBvY2gpLCBvciBhbiBJU08gc3RyaW5nIChodHRwczovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSkuXG4gICAgICogQHBhcmFtIGZvcm1hdCBUaGUgZGF0ZS90aW1lIGNvbXBvbmVudHMgdG8gaW5jbHVkZSwgdXNpbmcgcHJlZGVmaW5lZCBvcHRpb25zIG9yIGFcbiAgICAgKiBjdXN0b20gZm9ybWF0IHN0cmluZy5cbiAgICAgKiBAcGFyYW0gdGltZXpvbmUgQSB0aW1lem9uZSBvZmZzZXQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwgb3IgYSBzdGFuZGFyZFxuICAgICAqIFVUQy9HTVQgb3IgY29udGluZW50YWwgVVMgdGltZXpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0IGlzXG4gICAgICogdGhlIGxvY2FsIHN5c3RlbSB0aW1lem9uZSBvZiB0aGUgZW5kLXVzZXIncyBtYWNoaW5lLlxuICAgICAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LlxuICAgICAqIFNlZSBbU2V0dGluZyB5b3VyIGFwcCBsb2NhbGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC10aGUtbG9jYWxlLW9mLXlvdXItYXBwKS5cbiAgICAgKiBAcmV0dXJucyBBIGRhdGUgc3RyaW5nIGluIHRoZSBkZXNpcmVkIGZvcm1hdC5cbiAgICAgKi9cbiAgICBEYXRlUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXQsIHRpbWV6b25lLCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7IGZvcm1hdCA9ICdtZWRpdW1EYXRlJzsgfVxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0LCBsb2NhbGUgfHwgdGhpcy5sb2NhbGUsIHRpbWV6b25lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEYXRlUGlwZV8xLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIERhdGVQaXBlXzE7XG4gICAgRGF0ZVBpcGUgPSBEYXRlUGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdkYXRlJywgcHVyZTogdHJ1ZSB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoTE9DQUxFX0lEKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbU3RyaW5nXSlcbiAgICBdLCBEYXRlUGlwZSk7XG4gICAgcmV0dXJuIERhdGVQaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIF9JTlRFUlBPTEFUSU9OX1JFR0VYUCA9IC8jL2c7XG4vKipcbiAqIEBuZ01vZHVsZSBDb21tb25Nb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE1hcHMgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IHBsdXJhbGl6ZXMgdGhlIHZhbHVlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvaTE4bl9waXBlLnRzIHJlZ2lvbj0nSTE4blBsdXJhbFBpcGVDb21wb25lbnQnfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEkxOG5QbHVyYWxQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEkxOG5QbHVyYWxQaXBlKF9sb2NhbGl6YXRpb24pIHtcbiAgICAgICAgdGhpcy5fbG9jYWxpemF0aW9uID0gX2xvY2FsaXphdGlvbjtcbiAgICB9XG4gICAgSTE4blBsdXJhbFBpcGVfMSA9IEkxOG5QbHVyYWxQaXBlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIHRvIGJlIGZvcm1hdHRlZFxuICAgICAqIEBwYXJhbSBwbHVyYWxNYXAgYW4gb2JqZWN0IHRoYXQgbWltaWNzIHRoZSBJQ1UgZm9ybWF0LCBzZWVcbiAgICAgKiBodHRwOi8vdXNlcmd1aWRlLmljdS1wcm9qZWN0Lm9yZy9mb3JtYXRwYXJzZS9tZXNzYWdlcy5cbiAgICAgKiBAcGFyYW0gbG9jYWxlIGEgYHN0cmluZ2AgZGVmaW5pbmcgdGhlIGxvY2FsZSB0byB1c2UgKHVzZXMgdGhlIGN1cnJlbnQge0BsaW5rIExPQ0FMRV9JRH0gYnlcbiAgICAgKiBkZWZhdWx0KS5cbiAgICAgKi9cbiAgICBJMThuUGx1cmFsUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBwbHVyYWxNYXAsIGxvY2FsZSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVyYWxNYXAgIT09ICdvYmplY3QnIHx8IHBsdXJhbE1hcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEkxOG5QbHVyYWxQaXBlXzEsIHBsdXJhbE1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleSA9IGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBPYmplY3Qua2V5cyhwbHVyYWxNYXApLCB0aGlzLl9sb2NhbGl6YXRpb24sIGxvY2FsZSk7XG4gICAgICAgIHJldHVybiBwbHVyYWxNYXBba2V5XS5yZXBsYWNlKF9JTlRFUlBPTEFUSU9OX1JFR0VYUCwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcbiAgICB2YXIgSTE4blBsdXJhbFBpcGVfMTtcbiAgICBJMThuUGx1cmFsUGlwZSA9IEkxOG5QbHVyYWxQaXBlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBQaXBlKHsgbmFtZTogJ2kxOG5QbHVyYWwnLCBwdXJlOiB0cnVlIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW05nTG9jYWxpemF0aW9uXSlcbiAgICBdLCBJMThuUGx1cmFsUGlwZSk7XG4gICAgcmV0dXJuIEkxOG5QbHVyYWxQaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBHZW5lcmljIHNlbGVjdG9yIHRoYXQgZGlzcGxheXMgdGhlIHN0cmluZyB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKlxuICogSWYgbm9uZSBvZiB0aGUga2V5cyBvZiB0aGUgYG1hcHBpbmdgIG1hdGNoIHRoZSBgdmFsdWVgLCB0aGVuIHRoZSBjb250ZW50XG4gKiBvZiB0aGUgYG90aGVyYCBrZXkgaXMgcmV0dXJuZWQgd2hlbiBwcmVzZW50LCBvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2kxOG5fcGlwZS50cyByZWdpb249J0kxOG5TZWxlY3RQaXBlQ29tcG9uZW50J31cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBJMThuU2VsZWN0UGlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJMThuU2VsZWN0UGlwZSgpIHtcbiAgICB9XG4gICAgSTE4blNlbGVjdFBpcGVfMSA9IEkxOG5TZWxlY3RQaXBlO1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBhIHN0cmluZyB0byBiZSBpbnRlcm5hdGlvbmFsaXplZC5cbiAgICAgKiBAcGFyYW0gbWFwcGluZyBhbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkXG4gICAgICogZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgSTE4blNlbGVjdFBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSwgbWFwcGluZykge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoSTE4blNlbGVjdFBpcGVfMSwgbWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwcGluZ1t2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkoJ290aGVyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nWydvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9O1xuICAgIHZhciBJMThuU2VsZWN0UGlwZV8xO1xuICAgIEkxOG5TZWxlY3RQaXBlID0gSTE4blNlbGVjdFBpcGVfMSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIFBpcGUoeyBuYW1lOiAnaTE4blNlbGVjdCcsIHB1cmU6IHRydWUgfSlcbiAgICBdLCBJMThuU2VsZWN0UGlwZSk7XG4gICAgcmV0dXJuIEkxOG5TZWxlY3RQaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBDb252ZXJ0cyBhIHZhbHVlIGludG8gaXRzIEpTT04tZm9ybWF0IHJlcHJlc2VudGF0aW9uLiAgVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGNvbXBvbmVudCB1c2VzIGEgSlNPTiBwaXBlIHRvIGNvbnZlcnQgYW4gb2JqZWN0XG4gKiB0byBKU09OIGZvcm1hdCwgYW5kIGRpc3BsYXlzIHRoZSBzdHJpbmcgaW4gYm90aCBmb3JtYXRzIGZvciBjb21wYXJpc29uLlxuICpcbiAqIHtAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvanNvbl9waXBlLnRzIHJlZ2lvbj0nSnNvblBpcGUnfVxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEpzb25QaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEpzb25QaXBlKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmFsdWUgQSB2YWx1ZSBvZiBhbnkgdHlwZSB0byBjb252ZXJ0IGludG8gYSBKU09OLWZvcm1hdCBzdHJpbmcuXG4gICAgICovXG4gICAgSnNvblBpcGUucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpOyB9O1xuICAgIEpzb25QaXBlID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdqc29uJywgcHVyZTogZmFsc2UgfSlcbiAgICBdLCBKc29uUGlwZSk7XG4gICAgcmV0dXJuIEpzb25QaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gbWFrZUtleVZhbHVlUGFpcihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9O1xufVxuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUcmFuc2Zvcm1zIE9iamVjdCBvciBNYXAgaW50byBhbiBhcnJheSBvZiBrZXkgdmFsdWUgcGFpcnMuXG4gKlxuICogVGhlIG91dHB1dCBhcnJheSB3aWxsIGJlIG9yZGVyZWQgYnkga2V5cy5cbiAqIEJ5IGRlZmF1bHQgdGhlIGNvbXBhcmF0b3Igd2lsbCBiZSBieSBVbmljb2RlIHBvaW50IHZhbHVlLlxuICogWW91IGNhbiBvcHRpb25hbGx5IHBhc3MgYSBjb21wYXJlRm4gaWYgeW91ciBrZXlzIGFyZSBjb21wbGV4IHR5cGVzLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBUaGlzIGV4YW1wbGVzIHNob3cgaG93IGFuIE9iamVjdCBvciBhIE1hcCBjYW4gYmUgaXRlcmF0ZWQgYnkgbmdGb3Igd2l0aCB0aGUgdXNlIG9mIHRoaXMga2V5dmFsdWVcbiAqIHBpcGUuXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9waXBlcy90cy9rZXl2YWx1ZV9waXBlLnRzIHJlZ2lvbj0nS2V5VmFsdWVQaXBlJ31cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBLZXlWYWx1ZVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gS2V5VmFsdWVQaXBlKGRpZmZlcnMpIHtcbiAgICAgICAgdGhpcy5kaWZmZXJzID0gZGlmZmVycztcbiAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTtcbiAgICB9XG4gICAgS2V5VmFsdWVQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAoaW5wdXQsIGNvbXBhcmVGbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoY29tcGFyZUZuID09PSB2b2lkIDApIHsgY29tcGFyZUZuID0gZGVmYXVsdENvbXBhcmF0b3I7IH1cbiAgICAgICAgaWYgKCFpbnB1dCB8fCAoIShpbnB1dCBpbnN0YW5jZW9mIE1hcCkgJiYgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0JykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kaWZmZXIpIHtcbiAgICAgICAgICAgIC8vIG1ha2UgYSBkaWZmZXIgZm9yIHdoYXRldmVyIHR5cGUgd2UndmUgYmVlbiBwYXNzZWQgaW5cbiAgICAgICAgICAgIHRoaXMuZGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQoaW5wdXQpLmNyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaWZmZXJDaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZihpbnB1dCk7XG4gICAgICAgIGlmIChkaWZmZXJDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmtleVZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZGlmZmVyQ2hhbmdlcy5mb3JFYWNoSXRlbShmdW5jdGlvbiAocikge1xuICAgICAgICAgICAgICAgIF90aGlzLmtleVZhbHVlcy5wdXNoKG1ha2VLZXlWYWx1ZVBhaXIoci5rZXksIHIuY3VycmVudFZhbHVlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMua2V5VmFsdWVzLnNvcnQoY29tcGFyZUZuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5rZXlWYWx1ZXM7XG4gICAgfTtcbiAgICBLZXlWYWx1ZVBpcGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBQaXBlKHsgbmFtZTogJ2tleXZhbHVlJywgcHVyZTogZmFsc2UgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbS2V5VmFsdWVEaWZmZXJzXSlcbiAgICBdLCBLZXlWYWx1ZVBpcGUpO1xuICAgIHJldHVybiBLZXlWYWx1ZVBpcGU7XG59KCkpO1xuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3Ioa2V5VmFsdWVBLCBrZXlWYWx1ZUIpIHtcbiAgICB2YXIgYSA9IGtleVZhbHVlQS5rZXk7XG4gICAgdmFyIGIgPSBrZXlWYWx1ZUIua2V5O1xuICAgIC8vIGlmIHNhbWUgZXhpdCB3aXRoIDA7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiAwO1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHVuZGVmaW5lZCBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc29ydC5cbiAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gMTtcbiAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgbnVsbHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNvcnQuXG4gICAgaWYgKGEgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAxO1xuICAgIGlmIChiID09PSBudWxsKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBiID09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09ICdudW1iZXInICYmIHR5cGVvZiBiID09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBhIC0gYjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09ICdib29sZWFuJyAmJiB0eXBlb2YgYiA9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxO1xuICAgIH1cbiAgICAvLyBgYWAgYW5kIGBiYCBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLiBDb21wYXJlIHRoZWlyIHN0cmluZyB2YWx1ZXMuXG4gICAgdmFyIGFTdHJpbmcgPSBTdHJpbmcoYSk7XG4gICAgdmFyIGJTdHJpbmcgPSBTdHJpbmcoYik7XG4gICAgcmV0dXJuIGFTdHJpbmcgPT0gYlN0cmluZyA/IDAgOiBhU3RyaW5nIDwgYlN0cmluZyA/IC0xIDogMTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIGludG8gYSBzdHJpbmcsXG4gKiBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcyB0aGF0IGRldGVybWluZSBncm91cCBzaXppbmcgYW5kXG4gKiBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljXG4gKiBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiByb3VuZHMgb2ZmIHRvIHRoZSBuZWFyZXN0IHZhbHVlIHVzaW5nIHRoaXNcbiAqIFtyb3VuZGluZyBtZXRob2RdKGh0dHBzOi8vZW4ud2lraWJvb2tzLm9yZy93aWtpL0FyaXRobWV0aWMvUm91bmRpbmcpLlxuICogVGhlIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGF0IG9mIHRoZSBKYXZhU2NyaXB0IGBgYE1hdGgucm91bmQoKWBgYCBmdW5jdGlvbi5cbiAqIEluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZSwgdGhlIHBpcGUgcm91bmRzIGRvd24gd2hlcmVcbiAqIGBgYE1hdGgucm91bmQoKWBgYCByb3VuZHMgdXA6XG4gKlxuICogYGBgaHRtbFxuICogLTIuNSB8IG51bWJlcjonMS4wLTAnXG4gKiA+IC0zXG4gKiBNYXRoLnJvdW5kKC0yLjUpXG4gKiA+IC0yXG4gKiBgYGBcbiAqXG4gKiBAc2VlIGBmb3JtYXROdW1iZXIoKWBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnNcbiAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsXG4gKiB3aGVyZSB0aGUgY2FsbGVyJ3MgZGVmYXVsdCBsb2NhbGUgaXMgYGVuLVVTYC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIDxjb2RlLWV4YW1wbGUgcGF0aD1cImNvbW1vbi9waXBlcy90cy9udW1iZXJfcGlwZS50c1wiIHJlZ2lvbj0nTnVtYmVyUGlwZSc+PC9jb2RlLWV4YW1wbGU+XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRGVjaW1hbFBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVjaW1hbFBpcGUoX2xvY2FsZSkge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlO1xuICAgIH1cbiAgICBEZWNpbWFsUGlwZV8xID0gRGVjaW1hbFBpcGU7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkLlxuICAgICAqIEBwYXJhbSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nXG4gICAgICogaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PGJyPlxuICAgICAqIDxjb2RlPnttaW5JbnRlZ2VyRGlnaXRzfS57bWluRnJhY3Rpb25EaWdpdHN9LXttYXhGcmFjdGlvbkRpZ2l0c308L2NvZGU+LlxuICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuXG4gICAgICogRGVmYXVsdCBpcyBgMWAuXG4gICAgICogICAtIGBtaW5GcmFjdGlvbkRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuXG4gICAgICogRGVmYXVsdCBpcyBgMGAuXG4gICAgICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2A6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuXG4gICAgICogRGVmYXVsdCBpcyBgM2AuXG4gICAgICogQHBhcmFtIGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuXG4gICAgICogV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIGBMT0NBTEVfSURgLCB3aGljaCBpcyBgZW4tVVNgIGJ5IGRlZmF1bHQuXG4gICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLlxuICAgICAqL1xuICAgIERlY2ltYWxQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIGRpZ2l0c0luZm8sIGxvY2FsZSkge1xuICAgICAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuX2xvY2FsZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKG51bSwgbG9jYWxlLCBkaWdpdHNJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEZWNpbWFsUGlwZV8xLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIERlY2ltYWxQaXBlXzE7XG4gICAgRGVjaW1hbFBpcGUgPSBEZWNpbWFsUGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdudW1iZXInIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChMT0NBTEVfSUQpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKVxuICAgIF0sIERlY2ltYWxQaXBlKTtcbiAgICByZXR1cm4gRGVjaW1hbFBpcGU7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgcGVyY2VudGFnZVxuICogc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcyB0aGF0IGRldGVybWluZSBncm91cCBzaXppbmcgYW5kXG4gKiBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljXG4gKiBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBAc2VlIGBmb3JtYXRQZXJjZW50KClgXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIHBpcGUgdHJhbnNmb3JtcyBudW1iZXJzXG4gKiBpbnRvIHRleHQgc3RyaW5ncywgYWNjb3JkaW5nIHRvIHZhcmlvdXMgZm9ybWF0IHNwZWNpZmljYXRpb25zLFxuICogd2hlcmUgdGhlIGNhbGxlcidzIGRlZmF1bHQgbG9jYWxlIGlzIGBlbi1VU2AuXG4gKlxuICogPGNvZGUtZXhhbXBsZSBwYXRoPVwiY29tbW9uL3BpcGVzL3RzL3BlcmNlbnRfcGlwZS50c1wiIHJlZ2lvbj0nUGVyY2VudFBpcGUnPjwvY29kZS1leGFtcGxlPlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFBlcmNlbnRQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcmNlbnRQaXBlKF9sb2NhbGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTtcbiAgICB9XG4gICAgUGVyY2VudFBpcGVfMSA9IFBlcmNlbnRQaXBlO1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkIGFzIGEgcGVyY2VudGFnZS5cbiAgICAgKiBAcGFyYW0gZGlnaXRzSW5mbyBEZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9wdGlvbnMsIHNwZWNpZmllZCBieSBhIHN0cmluZ1xuICAgICAqIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0Ojxicj5cbiAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi5cbiAgICAgKiAgIC0gYG1pbkludGVnZXJEaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgICAqIERlZmF1bHQgaXMgYDFgLlxuICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgICAqIERlZmF1bHQgaXMgYDBgLlxuICAgICAqICAgLSBgbWF4RnJhY3Rpb25EaWdpdHNgOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgICAqIERlZmF1bHQgaXMgYDBgLlxuICAgICAqIEBwYXJhbSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLlxuICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LlxuICAgICAqIFNlZSBbU2V0dGluZyB5b3VyIGFwcCBsb2NhbGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC10aGUtbG9jYWxlLW9mLXlvdXItYXBwKS5cbiAgICAgKi9cbiAgICBQZXJjZW50UGlwZS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24gKHZhbHVlLCBkaWdpdHNJbmZvLCBsb2NhbGUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGxvY2FsZSA9IGxvY2FsZSB8fCB0aGlzLl9sb2NhbGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgbnVtID0gc3RyVG9OdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFBlcmNlbnQobnVtLCBsb2NhbGUsIGRpZ2l0c0luZm8pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKFBlcmNlbnRQaXBlXzEsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgUGVyY2VudFBpcGVfMTtcbiAgICBQZXJjZW50UGlwZSA9IFBlcmNlbnRQaXBlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBQaXBlKHsgbmFtZTogJ3BlcmNlbnQnIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChMT0NBTEVfSUQpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtTdHJpbmddKVxuICAgIF0sIFBlcmNlbnRQaXBlKTtcbiAgICByZXR1cm4gUGVyY2VudFBpcGU7XG59KCkpO1xuLyoqXG4gKiBAbmdNb2R1bGUgQ29tbW9uTW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgY3VycmVuY3kgc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlc1xuICogdGhhdCBkZXRlcm1pbmUgZ3JvdXAgc2l6aW5nIGFuZCBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLFxuICogYW5kIG90aGVyIGxvY2FsZS1zcGVjaWZpYyBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBAc2VlIGBnZXRDdXJyZW5jeVN5bWJvbCgpYFxuICogQHNlZSBgZm9ybWF0Q3VycmVuY3koKWBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnNcbiAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsXG4gKiB3aGVyZSB0aGUgY2FsbGVyJ3MgZGVmYXVsdCBsb2NhbGUgaXMgYGVuLVVTYC5cbiAqXG4gKiA8Y29kZS1leGFtcGxlIHBhdGg9XCJjb21tb24vcGlwZXMvdHMvY3VycmVuY3lfcGlwZS50c1wiIHJlZ2lvbj0nQ3VycmVuY3lQaXBlJz48L2NvZGUtZXhhbXBsZT5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBDdXJyZW5jeVBpcGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ3VycmVuY3lQaXBlKF9sb2NhbGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTtcbiAgICB9XG4gICAgQ3VycmVuY3lQaXBlXzEgPSBDdXJyZW5jeVBpcGU7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgY3VycmVuY3kuXG4gICAgICogQHBhcmFtIGN1cnJlbmN5Q29kZSBUaGUgW0lTTyA0MjE3XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fNDIxNykgY3VycmVuY3kgY29kZSxcbiAgICAgKiBzdWNoIGFzIGBVU0RgIGZvciB0aGUgVVMgZG9sbGFyIGFuZCBgRVVSYCBmb3IgdGhlIGV1cm8uXG4gICAgICogQHBhcmFtIGRpc3BsYXkgVGhlIGZvcm1hdCBmb3IgdGhlIGN1cnJlbmN5IGluZGljYXRvci4gT25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICogICAtIGBjb2RlYDogU2hvdyB0aGUgY29kZSAoc3VjaCBhcyBgVVNEYCkuXG4gICAgICogICAtIGBzeW1ib2xgKGRlZmF1bHQpOiBTaG93IHRoZSBzeW1ib2wgKHN1Y2ggYXMgYCRgKS5cbiAgICAgKiAgIC0gYHN5bWJvbC1uYXJyb3dgOiBVc2UgdGhlIG5hcnJvdyBzeW1ib2wgZm9yIGxvY2FsZXMgdGhhdCBoYXZlIHR3byBzeW1ib2xzIGZvciB0aGVpclxuICAgICAqIGN1cnJlbmN5LlxuICAgICAqIEZvciBleGFtcGxlLCB0aGUgQ2FuYWRpYW4gZG9sbGFyIENBRCBoYXMgdGhlIHN5bWJvbCBgQ0EkYCBhbmQgdGhlIHN5bWJvbC1uYXJyb3cgYCRgLiBJZiB0aGVcbiAgICAgKiBsb2NhbGUgaGFzIG5vIG5hcnJvdyBzeW1ib2wsIHVzZXMgdGhlIHN0YW5kYXJkIHN5bWJvbCBmb3IgdGhlIGxvY2FsZS5cbiAgICAgKiAgIC0gU3RyaW5nOiBVc2UgdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIGEgY29kZSBvciBhIHN5bWJvbC5cbiAgICAgKiBGb3IgZXhhbXBsZSwgYW4gZW1wdHkgc3RyaW5nIHdpbGwgc3VwcHJlc3MgdGhlIGN1cnJlbmN5ICYgc3ltYm9sLlxuICAgICAqICAgLSBCb29sZWFuIChtYXJrZWQgZGVwcmVjYXRlZCBpbiB2NSk6IGB0cnVlYCBmb3Igc3ltYm9sIGFuZCBmYWxzZSBmb3IgYGNvZGVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpZ2l0c0luZm8gRGVjaW1hbCByZXByZXNlbnRhdGlvbiBvcHRpb25zLCBzcGVjaWZpZWQgYnkgYSBzdHJpbmdcbiAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo8YnI+XG4gICAgICogPGNvZGU+e21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfTwvY29kZT4uXG4gICAgICogICAtIGBtaW5JbnRlZ2VyRGlnaXRzYDogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbCBwb2ludC5cbiAgICAgKiBEZWZhdWx0IGlzIGAxYC5cbiAgICAgKiAgIC0gYG1pbkZyYWN0aW9uRGlnaXRzYDogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC5cbiAgICAgKiBEZWZhdWx0IGlzIGAyYC5cbiAgICAgKiAgIC0gYG1heEZyYWN0aW9uRGlnaXRzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC5cbiAgICAgKiBEZWZhdWx0IGlzIGAyYC5cbiAgICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBudW1iZXIgd2lsbCBiZSBmb3JtYXR0ZWQgd2l0aCB0aGUgcHJvcGVyIGFtb3VudCBvZiBkaWdpdHMsXG4gICAgICogZGVwZW5kaW5nIG9uIHdoYXQgdGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpIHNwZWNpZmllcy5cbiAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIENhbmFkaWFuIGRvbGxhciBoYXMgMiBkaWdpdHMsIHdoZXJlYXMgdGhlIENoaWxlYW4gcGVzbyBoYXMgbm9uZS5cbiAgICAgKiBAcGFyYW0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS5cbiAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgYExPQ0FMRV9JRGAsIHdoaWNoIGlzIGBlbi1VU2AgYnkgZGVmYXVsdC5cbiAgICAgKiBTZWUgW1NldHRpbmcgeW91ciBhcHAgbG9jYWxlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkuXG4gICAgICovXG4gICAgQ3VycmVuY3lQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIGN1cnJlbmN5Q29kZSwgZGlzcGxheSwgZGlnaXRzSW5mbywgbG9jYWxlKSB7XG4gICAgICAgIGlmIChkaXNwbGF5ID09PSB2b2lkIDApIHsgZGlzcGxheSA9ICdzeW1ib2wnOyB9XG4gICAgICAgIGlmIChpc0VtcHR5KHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5fbG9jYWxlO1xuICAgICAgICBpZiAodHlwZW9mIGRpc3BsYXkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiV2FybmluZzogdGhlIGN1cnJlbmN5IHBpcGUgaGFzIGJlZW4gY2hhbmdlZCBpbiBBbmd1bGFyIHY1LiBUaGUgc3ltYm9sRGlzcGxheSBvcHRpb24gKHRoaXJkIHBhcmFtZXRlcikgaXMgbm93IGEgc3RyaW5nIGluc3RlYWQgb2YgYSBib29sZWFuLiBUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZSBcXFwiY29kZVxcXCIsIFxcXCJzeW1ib2xcXFwiIG9yIFxcXCJzeW1ib2wtbmFycm93XFxcIi5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSA/ICdzeW1ib2wnIDogJ2NvZGUnO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJyZW5jeSA9IGN1cnJlbmN5Q29kZSB8fCAnVVNEJztcbiAgICAgICAgaWYgKGRpc3BsYXkgIT09ICdjb2RlJykge1xuICAgICAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdzeW1ib2wnIHx8IGRpc3BsYXkgPT09ICdzeW1ib2wtbmFycm93Jykge1xuICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gZ2V0Q3VycmVuY3lTeW1ib2woY3VycmVuY3ksIGRpc3BsYXkgPT09ICdzeW1ib2wnID8gJ3dpZGUnIDogJ25hcnJvdycsIGxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW5jeSA9IGRpc3BsYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0Q3VycmVuY3kobnVtLCBsb2NhbGUsIGN1cnJlbmN5LCBjdXJyZW5jeUNvZGUsIGRpZ2l0c0luZm8pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEN1cnJlbmN5UGlwZV8xLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIEN1cnJlbmN5UGlwZV8xO1xuICAgIEN1cnJlbmN5UGlwZSA9IEN1cnJlbmN5UGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdjdXJyZW5jeScgfSksXG4gICAgICAgIF9fcGFyYW0oMCwgSW5qZWN0KExPQ0FMRV9JRCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1N0cmluZ10pXG4gICAgXSwgQ3VycmVuY3lQaXBlKTtcbiAgICByZXR1cm4gQ3VycmVuY3lQaXBlO1xufSgpKTtcbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlO1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIGludG8gYSBudW1iZXIgKGlmIG5lZWRlZCkuXG4gKi9cbmZ1bmN0aW9uIHN0clRvTnVtYmVyKHZhbHVlKSB7XG4gICAgLy8gQ29udmVydCBzdHJpbmdzIHRvIG51bWJlcnNcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oTnVtYmVyKHZhbHVlKSAtIHBhcnNlRmxvYXQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZhbHVlICsgXCIgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKlxuICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlgIG9yIGBTdHJpbmdgIGNvbnRhaW5pbmcgYSBzdWJzZXQgKHNsaWNlKSBvZiB0aGUgZWxlbWVudHMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiBBbGwgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBKYXZhU2NyaXB0IEFQSSBgQXJyYXkucHJvdG90eXBlLnNsaWNlKClgXG4gKiBhbmQgYFN0cmluZy5wcm90b3R5cGUuc2xpY2UoKWAuXG4gKlxuICogV2hlbiBvcGVyYXRpbmcgb24gYW4gYEFycmF5YCwgdGhlIHJldHVybmVkIGBBcnJheWAgaXMgYWx3YXlzIGEgY29weSBldmVuIHdoZW4gYWxsXG4gKiB0aGUgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkLlxuICpcbiAqIFdoZW4gb3BlcmF0aW5nIG9uIGEgYmxhbmsgdmFsdWUsIHRoZSBwaXBlIHJldHVybnMgdGhlIGJsYW5rIHZhbHVlLlxuICpcbiAqICMjIyBMaXN0IEV4YW1wbGVcbiAqXG4gKiBUaGlzIGBuZ0ZvcmAgZXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL3NsaWNlX3BpcGUudHMgcmVnaW9uPSdTbGljZVBpcGVfbGlzdCd9XG4gKlxuICogcHJvZHVjZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiBgYGBodG1sXG4gKiA8bGk+YjwvbGk+XG4gKiA8bGk+YzwvbGk+XG4gKiBgYGBcbiAqXG4gKiAjIyMgU3RyaW5nIEV4YW1wbGVzXG4gKlxuICoge0BleGFtcGxlIGNvbW1vbi9waXBlcy90cy9zbGljZV9waXBlLnRzIHJlZ2lvbj0nU2xpY2VQaXBlX3N0cmluZyd9XG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgU2xpY2VQaXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNsaWNlUGlwZSgpIHtcbiAgICB9XG4gICAgU2xpY2VQaXBlXzEgPSBTbGljZVBpcGU7XG4gICAgU2xpY2VQaXBlLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAodmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0cyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihTbGljZVBpcGVfMSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9O1xuICAgIFNsaWNlUGlwZS5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KG9iaik7IH07XG4gICAgdmFyIFNsaWNlUGlwZV8xO1xuICAgIFNsaWNlUGlwZSA9IFNsaWNlUGlwZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgUGlwZSh7IG5hbWU6ICdzbGljZScsIHB1cmU6IGZhbHNlIH0pXG4gICAgXSwgU2xpY2VQaXBlKTtcbiAgICByZXR1cm4gU2xpY2VQaXBlO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBwaXBlcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBpbiBlYWNoIGFuZCBldmVyeSBhcHBsaWNhdGlvbi5cbiAqL1xudmFyIENPTU1PTl9QSVBFUyA9IFtcbiAgICBBc3luY1BpcGUsXG4gICAgVXBwZXJDYXNlUGlwZSxcbiAgICBMb3dlckNhc2VQaXBlLFxuICAgIEpzb25QaXBlLFxuICAgIFNsaWNlUGlwZSxcbiAgICBEZWNpbWFsUGlwZSxcbiAgICBQZXJjZW50UGlwZSxcbiAgICBUaXRsZUNhc2VQaXBlLFxuICAgIEN1cnJlbmN5UGlwZSxcbiAgICBEYXRlUGlwZSxcbiAgICBJMThuUGx1cmFsUGlwZSxcbiAgICBJMThuU2VsZWN0UGlwZSxcbiAgICBLZXlWYWx1ZVBpcGUsXG5dO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBOb3RlOiBUaGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvY2F0aW9uIHByb3ZpZGVycyxcbi8vIGFzIHRoZXkgbmVlZCBzb21lIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB0byB3b3JrLlxuLyoqXG4gKiBFeHBvcnRzIGFsbCB0aGUgYmFzaWMgQW5ndWxhciBkaXJlY3RpdmVzIGFuZCBwaXBlcyxcbiAqIHN1Y2ggYXMgYE5nSWZgLCBgTmdGb3JPZmAsIGBEZWNpbWFsUGlwZWAsIGFuZCBzbyBvbi5cbiAqIFJlLWV4cG9ydGVkIGJ5IGBCcm93c2VyTW9kdWxlYCwgd2hpY2ggaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBpbiB0aGUgcm9vdFxuICogYEFwcE1vZHVsZWAgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcCB3aXRoIHRoZSBDTEkgYG5ld2AgY29tbWFuZC5cbiAqXG4gKiAqIFRoZSBgcHJvdmlkZXJzYCBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgTmdNb2R1bGUncyBpbmplY3RvciB0byBwcm92aWRlXG4gKiBsb2NhbGl6YXRpb24gZGVwZW5kZW5jaWVzIHRvIG1lbWJlcnMuXG4gKiAqIFRoZSBgZXhwb3J0c2Agb3B0aW9ucyBtYWtlIHRoZSBkZWNsYXJlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhdmFpbGFibGUgZm9yIGltcG9ydFxuICogYnkgb3RoZXIgTmdNb2R1bGVzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIENvbW1vbk1vZHVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21tb25Nb2R1bGUoKSB7XG4gICAgfVxuICAgIENvbW1vbk1vZHVsZSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBOZ01vZHVsZSh7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtDT01NT05fRElSRUNUSVZFUywgQ09NTU9OX1BJUEVTXSxcbiAgICAgICAgICAgIGV4cG9ydHM6IFtDT01NT05fRElSRUNUSVZFUywgQ09NTU9OX1BJUEVTXSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTmdMb2NhbGl6YXRpb24sIHVzZUNsYXNzOiBOZ0xvY2FsZUxvY2FsaXphdGlvbiB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSlcbiAgICBdLCBDb21tb25Nb2R1bGUpO1xuICAgIHJldHVybiBDb21tb25Nb2R1bGU7XG59KCkpO1xudmFyIMm1MCQyID0gZ2V0UGx1cmFsQ2FzZTtcbi8qKlxuICogQSBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgZGVwcmVjYXRlZCBpMThuIHBpcGVzLlxuICpcbiAqIEBkZXByZWNhdGVkIGZyb20gdjVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERlcHJlY2F0ZWRJMThOUGlwZXNNb2R1bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVwcmVjYXRlZEkxOE5QaXBlc01vZHVsZSgpIHtcbiAgICB9XG4gICAgRGVwcmVjYXRlZEkxOE5QaXBlc01vZHVsZSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBOZ01vZHVsZSh7XG4gICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtDT01NT05fREVQUkVDQVRFRF9JMThOX1BJUEVTXSxcbiAgICAgICAgICAgIGV4cG9ydHM6IFtDT01NT05fREVQUkVDQVRFRF9JMThOX1BJUEVTXSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogREVQUkVDQVRFRF9QTFVSQUxfRk4sIHVzZVZhbHVlOiDJtTAkMiB9XSxcbiAgICAgICAgfSlcbiAgICBdLCBEZXByZWNhdGVkSTE4TlBpcGVzTW9kdWxlKTtcbiAgICByZXR1cm4gRGVwcmVjYXRlZEkxOE5QaXBlc01vZHVsZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQSBESSBUb2tlbiByZXByZXNlbnRpbmcgdGhlIG1haW4gcmVuZGVyaW5nIGNvbnRleHQuIEluIGEgYnJvd3NlciB0aGlzIGlzIHRoZSBET00gRG9jdW1lbnQuXG4gKlxuICogTm90ZTogRG9jdW1lbnQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgQXBwbGljYXRpb24gQ29udGV4dCB3aGVuIEFwcGxpY2F0aW9uIGFuZCBSZW5kZXJpbmdcbiAqIENvbnRleHRzIGFyZSBub3QgdGhlIHNhbWUgKGUuZy4gd2hlbiBydW5uaW5nIHRoZSBhcHBsaWNhdGlvbiBpbnRvIGEgV2ViIFdvcmtlcikuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRE9DVU1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0RvY3VtZW50VG9rZW4nKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFBMQVRGT1JNX0JST1dTRVJfSUQgPSAnYnJvd3Nlcic7XG52YXIgUExBVEZPUk1fU0VSVkVSX0lEID0gJ3NlcnZlcic7XG52YXIgUExBVEZPUk1fV09SS0VSX0FQUF9JRCA9ICdicm93c2VyV29ya2VyQXBwJztcbnZhciBQTEFURk9STV9XT1JLRVJfVUlfSUQgPSAnYnJvd3NlcldvcmtlclVpJztcbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcGxhdGZvcm0gaWQgcmVwcmVzZW50cyBhIGJyb3dzZXIgcGxhdGZvcm0uXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpIHtcbiAgICByZXR1cm4gcGxhdGZvcm1JZCA9PT0gUExBVEZPUk1fQlJPV1NFUl9JRDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcGxhdGZvcm0gaWQgcmVwcmVzZW50cyBhIHNlcnZlciBwbGF0Zm9ybS5cbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gaXNQbGF0Zm9ybVNlcnZlcihwbGF0Zm9ybUlkKSB7XG4gICAgcmV0dXJuIHBsYXRmb3JtSWQgPT09IFBMQVRGT1JNX1NFUlZFUl9JRDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcGxhdGZvcm0gaWQgcmVwcmVzZW50cyBhIHdlYiB3b3JrZXIgYXBwIHBsYXRmb3JtLlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBpc1BsYXRmb3JtV29ya2VyQXBwKHBsYXRmb3JtSWQpIHtcbiAgICByZXR1cm4gcGxhdGZvcm1JZCA9PT0gUExBVEZPUk1fV09SS0VSX0FQUF9JRDtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcGxhdGZvcm0gaWQgcmVwcmVzZW50cyBhIHdlYiB3b3JrZXIgVUkgcGxhdGZvcm0uXG4gKiBAcHVibGljQXBpXG4gKi9cbmZ1bmN0aW9uIGlzUGxhdGZvcm1Xb3JrZXJVaShwbGF0Zm9ybUlkKSB7XG4gICAgcmV0dXJuIHBsYXRmb3JtSWQgPT09IFBMQVRGT1JNX1dPUktFUl9VSV9JRDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzguMC4zJyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogRGVmaW5lcyBhIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VyLiBJbXBsZW1lbnRlZCBieSBgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXJgLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFZpZXdwb3J0U2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmlld3BvcnRTY3JvbGxlcigpIHtcbiAgICB9XG4gICAgLy8gRGUtc3VnYXJlZCB0cmVlLXNoYWthYmxlIGluamVjdGlvblxuICAgIC8vIFNlZSAjMjM5MTdcbiAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICBWaWV3cG9ydFNjcm9sbGVyLm5nSW5qZWN0YWJsZURlZiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHtcbiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIoybXJtWluamVjdChET0NVTUVOVCksIHdpbmRvdywgybXJtWluamVjdChFcnJvckhhbmRsZXIpKTsgfVxuICAgIH0pO1xuICAgIHJldHVybiBWaWV3cG9ydFNjcm9sbGVyO1xufSgpKTtcbi8qKlxuICogTWFuYWdlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGZvciBhIGJyb3dzZXIgd2luZG93LlxuICovXG52YXIgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIoZG9jdW1lbnQsIHdpbmRvdywgZXJyb3JIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgICAgICB0aGlzLm9mZnNldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFswLCAwXTsgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgdG9wIG9mZnNldCB1c2VkIHdoZW4gc2Nyb2xsaW5nIHRvIGFuIGFuY2hvci5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IEEgcG9zaXRpb24gaW4gc2NyZWVuIGNvb3JkaW5hdGVzIChhIHR1cGxlIHdpdGggeCBhbmQgeSB2YWx1ZXMpXG4gICAgICogb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHRvcCBvZmZzZXQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKi9cbiAgICBCcm93c2VyVmlld3BvcnRTY3JvbGxlci5wcm90b3R5cGUuc2V0T2Zmc2V0ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvZmZzZXQpKSB7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9mZnNldDsgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLmdldFNjcm9sbFBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLndpbmRvdy5zY3JvbGxYLCB0aGlzLndpbmRvdy5zY3JvbGxZXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIG5ldyBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLnNjcm9sbFRvUG9zaXRpb24gPSBmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMud2luZG93LnNjcm9sbFRvKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNjcm9sbHMgdG8gYW4gYW5jaG9yIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIGFuY2hvciBUaGUgSUQgb2YgdGhlIGFuY2hvciBlbGVtZW50LlxuICAgICAqL1xuICAgIEJyb3dzZXJWaWV3cG9ydFNjcm9sbGVyLnByb3RvdHlwZS5zY3JvbGxUb0FuY2hvciA9IGZ1bmN0aW9uIChhbmNob3IpIHtcbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkpIHtcbiAgICAgICAgICAgIC8vIEVzY2FwZSBhbnl0aGluZyBwYXNzZWQgdG8gYHF1ZXJ5U2VsZWN0b3JgIGFzIGl0IGNhbiB0aHJvdyBlcnJvcnMgYW5kIHN0b3AgdGhlIGFwcGxpY2F0aW9uXG4gICAgICAgICAgICAvLyBmcm9tIHdvcmtpbmcgaWYgaW52YWxpZCB2YWx1ZXMgYXJlIHBhc3NlZC5cbiAgICAgICAgICAgIGlmICh0aGlzLndpbmRvdy5DU1MgJiYgdGhpcy53aW5kb3cuQ1NTLmVzY2FwZSkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IHRoaXMud2luZG93LkNTUy5lc2NhcGUoYW5jaG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvci5yZXBsYWNlKC8oXFxcInxcXCdcXCB8OnxcXC58XFxbfFxcXXwsfD0pL2csICdcXFxcJDEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsU2VsZWN0ZWRCeUlkID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgYW5jaG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoZWxTZWxlY3RlZEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBlbFNlbGVjdGVkQnlOYW1lID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J1wiICsgYW5jaG9yICsgXCInXVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChlbFNlbGVjdGVkQnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2FibGVzIGF1dG9tYXRpYyBzY3JvbGwgcmVzdG9yYXRpb24gcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuXG4gICAgICovXG4gICAgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLnNldEhpc3RvcnlTY3JvbGxSZXN0b3JhdGlvbiA9IGZ1bmN0aW9uIChzY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkge1xuICAgICAgICAgICAgdmFyIGhpc3RvcnlfMSA9IHRoaXMud2luZG93Lmhpc3Rvcnk7XG4gICAgICAgICAgICBpZiAoaGlzdG9yeV8xICYmIGhpc3RvcnlfMS5zY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICAgICAgICAgIGhpc3RvcnlfMS5zY3JvbGxSZXN0b3JhdGlvbiA9IHNjcm9sbFJlc3RvcmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBCcm93c2VyVmlld3BvcnRTY3JvbGxlci5wcm90b3R5cGUuc2Nyb2xsVG9FbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBsZWZ0ID0gcmVjdC5sZWZ0ICsgdGhpcy53aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgIHZhciB0b3AgPSByZWN0LnRvcCArIHRoaXMud2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcbiAgICAgICAgdGhpcy53aW5kb3cuc2Nyb2xsVG8obGVmdCAtIG9mZnNldFswXSwgdG9wIC0gb2Zmc2V0WzFdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdlIG9ubHkgc3VwcG9ydCBzY3JvbGwgcmVzdG9yYXRpb24gd2hlbiB3ZSBjYW4gZ2V0IGEgaG9sZCBvZiB3aW5kb3cuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMgYmVoYXZpb3Igd2hlbiBydW5uaW5nIGluIGEgd2ViIHdvcmtlci5cbiAgICAgKlxuICAgICAqIExpZnRpbmcgdGhpcyByZXN0cmljdGlvbiByaWdodCBub3cgd291bGQgcmVxdWlyZSBtb3JlIGNoYW5nZXMgaW4gdGhlIGRvbSBhZGFwdGVyLlxuICAgICAqIFNpbmNlIHdlYndvcmtlcnMgYXJlbid0IHdpZGVseSB1c2VkLCB3ZSB3aWxsIGxpZnQgaXQgb25jZSBSb3V0ZXJTY3JvbGxlciBpc1xuICAgICAqIGJhdHRsZS10ZXN0ZWQuXG4gICAgICovXG4gICAgQnJvd3NlclZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLnN1cHBvcnRTY3JvbGxSZXN0b3JhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMud2luZG93ICYmICEhdGhpcy53aW5kb3cuc2Nyb2xsVG87XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBCcm93c2VyVmlld3BvcnRTY3JvbGxlcjtcbn0oKSk7XG4vKipcbiAqIFByb3ZpZGVzIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aWV3cG9ydCBzY3JvbGxlci4gVGhpcyB3aWxsXG4gKiBsaXZlIGluIEBhbmd1bGFyL2NvbW1vbiBhcyBpdCB3aWxsIGJlIHVzZWQgYnkgYm90aCBwbGF0Zm9ybS1zZXJ2ZXIgYW5kIHBsYXRmb3JtLXdlYndvcmtlci5cbiAqL1xudmFyIE51bGxWaWV3cG9ydFNjcm9sbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE51bGxWaWV3cG9ydFNjcm9sbGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvblxuICAgICAqL1xuICAgIE51bGxWaWV3cG9ydFNjcm9sbGVyLnByb3RvdHlwZS5zZXRPZmZzZXQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7IH07XG4gICAgLyoqXG4gICAgICogRW1wdHkgaW1wbGVtZW50YXRpb25cbiAgICAgKi9cbiAgICBOdWxsVmlld3BvcnRTY3JvbGxlci5wcm90b3R5cGUuZ2V0U2Nyb2xsUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBbMCwgMF07IH07XG4gICAgLyoqXG4gICAgICogRW1wdHkgaW1wbGVtZW50YXRpb25cbiAgICAgKi9cbiAgICBOdWxsVmlld3BvcnRTY3JvbGxlci5wcm90b3R5cGUuc2Nyb2xsVG9Qb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3NpdGlvbikgeyB9O1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uXG4gICAgICovXG4gICAgTnVsbFZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLnNjcm9sbFRvQW5jaG9yID0gZnVuY3Rpb24gKGFuY2hvcikgeyB9O1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uXG4gICAgICovXG4gICAgTnVsbFZpZXdwb3J0U2Nyb2xsZXIucHJvdG90eXBlLnNldEhpc3RvcnlTY3JvbGxSZXN0b3JhdGlvbiA9IGZ1bmN0aW9uIChzY3JvbGxSZXN0b3JhdGlvbikgeyB9O1xuICAgIHJldHVybiBOdWxsVmlld3BvcnRTY3JvbGxlcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gVGhpcyBmaWxlIG9ubHkgcmVleHBvcnRzIGNvbnRlbnQgb2YgdGhlIGBzcmNgIGZvbGRlci4gS2VlcCBpdCB0aGF0IHdheS5cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCB7IENPTU1PTl9ESVJFQ1RJVkVTIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb21tb25fY29tbW9uX2UsIE5nQ2xhc3NJbXBsUHJvdmlkZXIgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvbW1vbl9jb21tb25faiwgTmdDbGFzc0ltcGxQcm92aWRlcl9fUFJFX1IzX18gYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvbW1vbl9jb21tb25faSwgTmdDbGFzc1IzSW1wbCBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29tbW9uX2NvbW1vbl9oLCBOZ1N0eWxlSW1wbFByb3ZpZGVyIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb21tb25fY29tbW9uX20sIE5nU3R5bGVJbXBsUHJvdmlkZXJfX1BSRV9SM19fIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb21tb25fY29tbW9uX2wsIE5nU3R5bGVSM0ltcGwgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvbW1vbl9jb21tb25faywgZmluZExvY2FsZURhdGEgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvbW1vbl9jb21tb25fZCwgREVQUkVDQVRFRF9QTFVSQUxfRk4gYXMgybVhbmd1bGFyX3BhY2thZ2VzX2NvbW1vbl9jb21tb25fYSwgZ2V0UGx1cmFsQ2FzZSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29tbW9uX2NvbW1vbl9iLCBDT01NT05fREVQUkVDQVRFRF9JMThOX1BJUEVTIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19jb21tb25fY29tbW9uX2csIENPTU1PTl9QSVBFUyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfY29tbW9uX2NvbW1vbl9mLCByZWdpc3RlckxvY2FsZURhdGEgYXMgybVyZWdpc3RlckxvY2FsZURhdGEsIHJlZ2lzdGVyTG9jYWxlRGF0YSwgZm9ybWF0RGF0ZSwgZm9ybWF0Q3VycmVuY3ksIGZvcm1hdE51bWJlciwgZm9ybWF0UGVyY2VudCwgTmdMb2NhbGVMb2NhbGl6YXRpb24sIE5nTG9jYWxpemF0aW9uLCBQbHVyYWwsIE51bWJlckZvcm1hdFN0eWxlLCBGb3JtU3R5bGUsIFRyYW5zbGF0aW9uV2lkdGgsIEZvcm1hdFdpZHRoLCBOdW1iZXJTeW1ib2wsIFdlZWtEYXksIGdldE51bWJlck9mQ3VycmVuY3lEaWdpdHMsIGdldEN1cnJlbmN5U3ltYm9sLCBnZXRMb2NhbGVEYXlQZXJpb2RzLCBnZXRMb2NhbGVEYXlOYW1lcywgZ2V0TG9jYWxlTW9udGhOYW1lcywgZ2V0TG9jYWxlSWQsIGdldExvY2FsZUVyYU5hbWVzLCBnZXRMb2NhbGVXZWVrRW5kUmFuZ2UsIGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBnZXRMb2NhbGVEYXRlRm9ybWF0LCBnZXRMb2NhbGVEYXRlVGltZUZvcm1hdCwgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcywgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzLCBnZXRMb2NhbGVQbHVyYWxDYXNlLCBnZXRMb2NhbGVUaW1lRm9ybWF0LCBnZXRMb2NhbGVOdW1iZXJTeW1ib2wsIGdldExvY2FsZU51bWJlckZvcm1hdCwgZ2V0TG9jYWxlQ3VycmVuY3lOYW1lLCBnZXRMb2NhbGVDdXJyZW5jeVN5bWJvbCwgcGFyc2VDb29raWVWYWx1ZSBhcyDJtXBhcnNlQ29va2llVmFsdWUsIENvbW1vbk1vZHVsZSwgRGVwcmVjYXRlZEkxOE5QaXBlc01vZHVsZSwgTmdDbGFzcywgTmdDbGFzc0Jhc2UsIE5nRm9yT2YsIE5nRm9yT2ZDb250ZXh0LCBOZ0lmLCBOZ0lmQ29udGV4dCwgTmdQbHVyYWwsIE5nUGx1cmFsQ2FzZSwgTmdTdHlsZSwgTmdTdHlsZUJhc2UsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIE5nU3dpdGNoRGVmYXVsdCwgTmdUZW1wbGF0ZU91dGxldCwgTmdDb21wb25lbnRPdXRsZXQsIERPQ1VNRU5ULCBBc3luY1BpcGUsIERhdGVQaXBlLCBJMThuUGx1cmFsUGlwZSwgSTE4blNlbGVjdFBpcGUsIEpzb25QaXBlLCBMb3dlckNhc2VQaXBlLCBDdXJyZW5jeVBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgU2xpY2VQaXBlLCBVcHBlckNhc2VQaXBlLCBUaXRsZUNhc2VQaXBlLCBLZXlWYWx1ZVBpcGUsIERlcHJlY2F0ZWREYXRlUGlwZSwgRGVwcmVjYXRlZEN1cnJlbmN5UGlwZSwgRGVwcmVjYXRlZERlY2ltYWxQaXBlLCBEZXByZWNhdGVkUGVyY2VudFBpcGUsIFBMQVRGT1JNX0JST1dTRVJfSUQgYXMgybVQTEFURk9STV9CUk9XU0VSX0lELCBQTEFURk9STV9TRVJWRVJfSUQgYXMgybVQTEFURk9STV9TRVJWRVJfSUQsIFBMQVRGT1JNX1dPUktFUl9BUFBfSUQgYXMgybVQTEFURk9STV9XT1JLRVJfQVBQX0lELCBQTEFURk9STV9XT1JLRVJfVUlfSUQgYXMgybVQTEFURk9STV9XT1JLRVJfVUlfSUQsIGlzUGxhdGZvcm1Ccm93c2VyLCBpc1BsYXRmb3JtU2VydmVyLCBpc1BsYXRmb3JtV29ya2VyQXBwLCBpc1BsYXRmb3JtV29ya2VyVWksIFZFUlNJT04sIFZpZXdwb3J0U2Nyb2xsZXIsIE51bGxWaWV3cG9ydFNjcm9sbGVyIGFzIMm1TnVsbFZpZXdwb3J0U2Nyb2xsZXIsIE5nQ2xhc3NJbXBsUHJvdmlkZXJfX1BPU1RfUjNfXyBhcyDJtU5nQ2xhc3NJbXBsUHJvdmlkZXJfX1BPU1RfUjNfXywgTmdDbGFzc1IySW1wbCBhcyDJtU5nQ2xhc3NSMkltcGwsIE5nQ2xhc3NJbXBsIGFzIMm1TmdDbGFzc0ltcGwsIE5nU3R5bGVJbXBsUHJvdmlkZXJfX1BPU1RfUjNfXyBhcyDJtU5nU3R5bGVJbXBsUHJvdmlkZXJfX1BPU1RfUjNfXywgTmdTdHlsZVIySW1wbCBhcyDJtU5nU3R5bGVSMkltcGwsIE5nU3R5bGVJbXBsIGFzIMm1TmdTdHlsZUltcGwsIG5nU3R5bGVEaXJlY3RpdmVEZWZfX1BPU1RfUjNfXyBhcyDJtW5nU3R5bGVEaXJlY3RpdmVEZWZfX1BPU1RfUjNfXywgbmdDbGFzc0RpcmVjdGl2ZURlZl9fUE9TVF9SM19fIGFzIMm1bmdDbGFzc0RpcmVjdGl2ZURlZl9fUE9TVF9SM19fLCBQbGF0Zm9ybUxvY2F0aW9uLCBMT0NBVElPTl9JTklUSUFMSVpFRCwgTG9jYXRpb25TdHJhdGVneSwgQVBQX0JBU0VfSFJFRiwgSGFzaExvY2F0aW9uU3RyYXRlZ3ksIFBhdGhMb2NhdGlvblN0cmF0ZWd5LCBMb2NhdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBBbmd1bGFyIHY4LjAuM1xuICogKGMpIDIwMTAtMjAxOSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuXG5pbXBvcnQgeyBfX2V4dGVuZHMsIF9fc3ByZWFkLCBfX2RlY29yYXRlLCBfX3BhcmFtLCBfX21ldGFkYXRhLCBfX2Fzc2lnbiB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IMm1cGFyc2VDb29raWVWYWx1ZSwgRE9DVU1FTlQsIFBsYXRmb3JtTG9jYXRpb24sIGlzUGxhdGZvcm1TZXJ2ZXIsIENvbW1vbk1vZHVsZSwgybVQTEFURk9STV9CUk9XU0VSX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IMm1Z2xvYmFsLCBJbmplY3RhYmxlLCBJbmplY3QsIEluamVjdGlvblRva2VuLCBBcHBsaWNhdGlvbkluaXRTdGF0dXMsIEFQUF9JTklUSUFMSVpFUiwgSW5qZWN0b3IsIHNldFRlc3RhYmlsaXR5R2V0dGVyLCBOZ1Byb2JlVG9rZW4sIE9wdGlvbmFsLCBBcHBsaWNhdGlvblJlZiwgTmdab25lLCBnZXREZWJ1Z05vZGUsIFZpZXdFbmNhcHN1bGF0aW9uLCBBUFBfSUQsIFJlbmRlcmVyU3R5bGVGbGFnczIsIFBMQVRGT1JNX0lELCDJtUNvbnNvbGUsIFNlY3VyaXR5Q29udGV4dCwgybVfc2FuaXRpemVIdG1sLCDJtV9zYW5pdGl6ZVN0eWxlLCDJtV9zYW5pdGl6ZVVybCwgUExBVEZPUk1fSU5JVElBTElaRVIsIFNhbml0aXplciwgY3JlYXRlUGxhdGZvcm1GYWN0b3J5LCBwbGF0Zm9ybUNvcmUsIEVycm9ySGFuZGxlciwgybVBUFBfUk9PVCwgUmVuZGVyZXJGYWN0b3J5MiwgVGVzdGFiaWxpdHksIE5nTW9kdWxlLCBBcHBsaWNhdGlvbk1vZHVsZSwgU2tpcFNlbGYsIMm1ybVpbmplY3QsIMm1ybVkZWZpbmVJbmplY3RhYmxlLCBWZXJzaW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBfRE9NID0gbnVsbDtcbmZ1bmN0aW9uIGdldERPTSgpIHtcbiAgICByZXR1cm4gX0RPTTtcbn1cbmZ1bmN0aW9uIHNldFJvb3REb21BZGFwdGVyKGFkYXB0ZXIpIHtcbiAgICBpZiAoIV9ET00pIHtcbiAgICAgICAgX0RPTSA9IGFkYXB0ZXI7XG4gICAgfVxufVxuLyogdHNsaW50OmRpc2FibGU6cmVxdWlyZVBhcmFtZXRlclR5cGUgKi9cbi8qKlxuICogUHJvdmlkZXMgRE9NIG9wZXJhdGlvbnMgaW4gYW4gZW52aXJvbm1lbnQtYWdub3N0aWMgd2F5LlxuICpcbiAqIEBzZWN1cml0eSBUcmVhZCBjYXJlZnVsbHkhIEludGVyYWN0aW5nIHdpdGggdGhlIERPTSBkaXJlY3RseSBpcyBkYW5nZXJvdXMgYW5kXG4gKiBjYW4gaW50cm9kdWNlIFhTUyByaXNrcy5cbiAqL1xudmFyIERvbUFkYXB0ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRG9tQWRhcHRlcigpIHtcbiAgICAgICAgdGhpcy5yZXNvdXJjZUxvYWRlclR5cGUgPSBudWxsO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRG9tQWRhcHRlci5wcm90b3R5cGUsIFwiYXR0clRvUHJvcE1hcFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGF0dHJpYnV0ZSBuYW1lcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHByb3BlcnR5IG5hbWVzIGZvciBjYXNlc1xuICAgICAgICAgKiB3aGVyZSBhdHRyaWJ1dGUgbmFtZSBkb2Vzbid0IG1hdGNoIHByb3BlcnR5IG5hbWUuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2F0dHJUb1Byb3BNYXA7IH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7IHRoaXMuX2F0dHJUb1Byb3BNYXAgPSB2YWx1ZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIERvbUFkYXB0ZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFueSBicm93c2VyIGVudmlyb25tZW50LlxuICpcbiAqIEBzZWN1cml0eSBUcmVhZCBjYXJlZnVsbHkhIEludGVyYWN0aW5nIHdpdGggdGhlIERPTSBkaXJlY3RseSBpcyBkYW5nZXJvdXMgYW5kXG4gKiBjYW4gaW50cm9kdWNlIFhTUyByaXNrcy5cbiAqL1xudmFyIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlcigpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2FuaW1hdGlvblByZWZpeCA9IG51bGw7XG4gICAgICAgIF90aGlzLl90cmFuc2l0aW9uRW5kID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50XzEgPSBfdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCBkb2N1bWVudCk7XG4gICAgICAgICAgICBpZiAoX3RoaXMuZ2V0U3R5bGUoZWxlbWVudF8xLCAnYW5pbWF0aW9uTmFtZScpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fYW5pbWF0aW9uUHJlZml4ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZG9tUHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9tUHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmdldFN0eWxlKGVsZW1lbnRfMSwgZG9tUHJlZml4ZXNbaV0gKyAnQW5pbWF0aW9uTmFtZScpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9hbmltYXRpb25QcmVmaXggPSAnLScgKyBkb21QcmVmaXhlc1tpXS50b0xvd2VyQ2FzZSgpICsgJy0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdHJhbnNFbmRFdmVudE5hbWVzXzEgPSB7XG4gICAgICAgICAgICAgICAgV2Via2l0VHJhbnNpdGlvbjogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgICAgICAgICAgIE1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICBPVHJhbnNpdGlvbjogJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0cmFuc0VuZEV2ZW50TmFtZXNfMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmdldFN0eWxlKGVsZW1lbnRfMSwga2V5KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl90cmFuc2l0aW9uRW5kID0gdHJhbnNFbmRFdmVudE5hbWVzXzFba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIF90aGlzLl9hbmltYXRpb25QcmVmaXggPSBudWxsO1xuICAgICAgICAgICAgX3RoaXMuX3RyYW5zaXRpb25FbmQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXREaXN0cmlidXRlZE5vZGVzID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5nZXREaXN0cmlidXRlZE5vZGVzKCk7IH07XG4gICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZXNvbHZlQW5kU2V0SHJlZiA9IGZ1bmN0aW9uIChlbCwgYmFzZVVybCwgaHJlZikge1xuICAgICAgICBlbC5ocmVmID0gaHJlZiA9PSBudWxsID8gYmFzZVVybCA6IGJhc2VVcmwgKyAnLy4uLycgKyBocmVmO1xuICAgIH07XG4gICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c0RPTUV2ZW50cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c05hdGl2ZVNoYWRvd0RPTSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBkb2N1bWVudC5ib2R5LmNyZWF0ZVNoYWRvd1Jvb3QgPT09ICdmdW5jdGlvbic7XG4gICAgfTtcbiAgICBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEFuaW1hdGlvblByZWZpeCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2FuaW1hdGlvblByZWZpeCA/IHRoaXMuX2FuaW1hdGlvblByZWZpeCA6ICcnOyB9O1xuICAgIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0VHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmQgPyB0aGlzLl90cmFuc2l0aW9uRW5kIDogJyc7IH07XG4gICAgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c0FuaW1hdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FuaW1hdGlvblByZWZpeCAhPSBudWxsICYmIHRoaXMuX3RyYW5zaXRpb25FbmQgIT0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXI7XG59KERvbUFkYXB0ZXIpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIF9hdHRyVG9Qcm9wTWFwID0ge1xuICAgICdjbGFzcyc6ICdjbGFzc05hbWUnLFxuICAgICdpbm5lckh0bWwnOiAnaW5uZXJIVE1MJyxcbiAgICAncmVhZG9ubHknOiAncmVhZE9ubHknLFxuICAgICd0YWJpbmRleCc6ICd0YWJJbmRleCcsXG59O1xudmFyIERPTV9LRVlfTE9DQVRJT05fTlVNUEFEID0gMztcbi8vIE1hcCB0byBjb252ZXJ0IHNvbWUga2V5IG9yIGtleUlkZW50aWZpZXIgdmFsdWVzIHRvIHdoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBnZXRFdmVudEtleVxudmFyIF9rZXlNYXAgPSB7XG4gICAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZFxuICAgIC8vIGNmIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy1rZXkvXG4gICAgJ1xcYic6ICdCYWNrc3BhY2UnLFxuICAgICdcXHQnOiAnVGFiJyxcbiAgICAnXFx4N0YnOiAnRGVsZXRlJyxcbiAgICAnXFx4MUInOiAnRXNjYXBlJyxcbiAgICAnRGVsJzogJ0RlbGV0ZScsXG4gICAgJ0VzYyc6ICdFc2NhcGUnLFxuICAgICdMZWZ0JzogJ0Fycm93TGVmdCcsXG4gICAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLFxuICAgICdVcCc6ICdBcnJvd1VwJyxcbiAgICAnRG93bic6ICdBcnJvd0Rvd24nLFxuICAgICdNZW51JzogJ0NvbnRleHRNZW51JyxcbiAgICAnU2Nyb2xsJzogJ1Njcm9sbExvY2snLFxuICAgICdXaW4nOiAnT1MnXG59O1xuLy8gVGhlcmUgaXMgYSBidWcgaW4gQ2hyb21lIGZvciBudW1lcmljIGtleXBhZCBrZXlzOlxuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1NTY1NFxuLy8gMSwgMiwgMyAuLi4gYXJlIHJlcG9ydGVkIGFzIEEsIEIsIEMgLi4uXG52YXIgX2Nocm9tZU51bUtleVBhZE1hcCA9IHtcbiAgICAnQSc6ICcxJyxcbiAgICAnQic6ICcyJyxcbiAgICAnQyc6ICczJyxcbiAgICAnRCc6ICc0JyxcbiAgICAnRSc6ICc1JyxcbiAgICAnRic6ICc2JyxcbiAgICAnRyc6ICc3JyxcbiAgICAnSCc6ICc4JyxcbiAgICAnSSc6ICc5JyxcbiAgICAnSic6ICcqJyxcbiAgICAnSyc6ICcrJyxcbiAgICAnTSc6ICctJyxcbiAgICAnTic6ICcuJyxcbiAgICAnTyc6ICcvJyxcbiAgICAnXFx4NjAnOiAnMCcsXG4gICAgJ1xceDkwJzogJ051bUxvY2snXG59O1xudmFyIMm1MCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoybVnbG9iYWxbJ05vZGUnXSkge1xuICAgICAgICByZXR1cm4gybVnbG9iYWxbJ05vZGUnXS5wcm90b3R5cGUuY29udGFpbnMgfHwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiAhISh0aGlzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpICYgMTYpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbnZhciBub2RlQ29udGFpbnMgPSAoybUwKSgpO1xuLyoqXG4gKiBBIGBEb21BZGFwdGVyYCBwb3dlcmVkIGJ5IGZ1bGwgYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZFxuICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlIG5vLWNvbnNvbGUgKi9cbnZhciBCcm93c2VyRG9tQWRhcHRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQnJvd3NlckRvbUFkYXB0ZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQnJvd3NlckRvbUFkYXB0ZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHRlbXBsYXRlSHRtbCkgeyB0aHJvdyBuZXcgRXJyb3IoJ3BhcnNlIG5vdCBpbXBsZW1lbnRlZCcpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLm1ha2VDdXJyZW50ID0gZnVuY3Rpb24gKCkgeyBzZXRSb290RG9tQWRhcHRlcihuZXcgQnJvd3NlckRvbUFkYXB0ZXIoKSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmhhc1Byb3BlcnR5ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsgcmV0dXJuIG5hbWUgaW4gZWxlbWVudDsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIHZhbHVlKSB7IGVsW25hbWVdID0gdmFsdWU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7IHJldHVybiBlbFtuYW1lXTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24gKGVsLCBtZXRob2ROYW1lLCBhcmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gZWwpW21ldGhvZE5hbWVdLmFwcGx5KF9hLCBfX3NwcmVhZChhcmdzKSk7XG4gICAgfTtcbiAgICAvLyBUT0RPKHRib3NjaCk6IG1vdmUgdGhpcyBpbnRvIGEgc2VwYXJhdGUgZW52aXJvbm1lbnQgY2xhc3Mgb25jZSB3ZSBoYXZlIGl0XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmxvZ0Vycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmICh3aW5kb3cuY29uc29sZSkge1xuICAgICAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUubG9nR3JvdXAgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICB3aW5kb3cuY29uc29sZS5ncm91cCAmJiB3aW5kb3cuY29uc29sZS5ncm91cChlcnJvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5sb2dHcm91cEVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICB3aW5kb3cuY29uc29sZS5ncm91cEVuZCAmJiB3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLCBcImF0dHJUb1Byb3BNYXBcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9hdHRyVG9Qcm9wTWFwOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAobm9kZUEsIG5vZGVCKSB7IHJldHVybiBub2RlQ29udGFpbnMuY2FsbChub2RlQSwgbm9kZUIpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yID0gZnVuY3Rpb24gKGVsLCBzZWxlY3RvcikgeyByZXR1cm4gZWwucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwgPSBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7IHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZWwsIGV2dCwgbGlzdGVuZXIpIHsgZWwuYWRkRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm9uQW5kQ2FuY2VsID0gZnVuY3Rpb24gKGVsLCBldnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZlxuICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhcnQvaXNzdWVzL2RldGFpbD9pZD0xNzQwNlxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTsgfTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGVsLCBldnQpIHsgZWwuZGlzcGF0Y2hFdmVudChldnQpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVNb3VzZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgICB2YXIgZXZ0ID0gdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgICAgICBldnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBldnQ7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnRUeXBlKSB7XG4gICAgICAgIHZhciBldnQgPSB0aGlzLmdldERlZmF1bHREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgICBldnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBldnQ7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5pc1ByZXZlbnRlZCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgcmV0dXJuIGV2dC5kZWZhdWx0UHJldmVudGVkIHx8IGV2dC5yZXR1cm5WYWx1ZSAhPSBudWxsICYmICFldnQucmV0dXJuVmFsdWU7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SW5uZXJIVE1MID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5pbm5lckhUTUw7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFRlbXBsYXRlQ29udGVudCA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICByZXR1cm4gJ2NvbnRlbnQnIGluIGVsICYmIHRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQoZWwpID8gZWwuY29udGVudCA6IG51bGw7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0T3V0ZXJIVE1MID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5vdXRlckhUTUw7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm5vZGVOYW1lID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUubm9kZU5hbWU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLm5vZGVWYWx1ZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5vZGVWYWx1ZTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnR5cGU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNQcm9wZXJ0eShub2RlLCAnY29udGVudCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5maXJzdENoaWxkID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5maXJzdENoaWxkOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5uZXh0U2libGluZyA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwubmV4dFNpYmxpbmc7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnBhcmVudEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLnBhcmVudE5vZGU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNoaWxkTm9kZXMgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNoaWxkTm9kZXM7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNoaWxkTm9kZXNBc0xpc3QgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgICAgICB2YXIgcmVzID0gbmV3IEFycmF5KGNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXNbaV0gPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY2xlYXJOb2RlcyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICB3aGlsZSAoZWwuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgZWwucmVtb3ZlQ2hpbGQoZWwuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChlbCwgbm9kZSkgeyBlbC5hcHBlbmRDaGlsZChub2RlKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAoZWwsIG5vZGUpIHsgZWwucmVtb3ZlQ2hpbGQobm9kZSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlcGxhY2VDaGlsZCA9IGZ1bmN0aW9uIChlbCwgbmV3Q2hpbGQsIG9sZENoaWxkKSB7IGVsLnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKHBhcmVudCwgcmVmLCBub2RlKSB7IHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW5zZXJ0QWxsQmVmb3JlID0gZnVuY3Rpb24gKHBhcmVudCwgcmVmLCBub2Rlcykge1xuICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7IHJldHVybiBwYXJlbnQuaW5zZXJ0QmVmb3JlKG4sIHJlZik7IH0pO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmluc2VydEFmdGVyID0gZnVuY3Rpb24gKHBhcmVudCwgcmVmLCBub2RlKSB7IHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgcmVmLm5leHRTaWJsaW5nKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0SW5uZXJIVE1MID0gZnVuY3Rpb24gKGVsLCB2YWx1ZSkgeyBlbC5pbm5lckhUTUwgPSB2YWx1ZTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwudGV4dENvbnRlbnQ7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbiAoZWwsIHZhbHVlKSB7IGVsLnRleHRDb250ZW50ID0gdmFsdWU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC52YWx1ZTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoZWwsIHZhbHVlKSB7IGVsLnZhbHVlID0gdmFsdWU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldENoZWNrZWQgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNoZWNrZWQ7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldENoZWNrZWQgPSBmdW5jdGlvbiAoZWwsIHZhbHVlKSB7IGVsLmNoZWNrZWQgPSB2YWx1ZTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlQ29tbWVudCA9IGZ1bmN0aW9uICh0ZXh0KSB7IHJldHVybiB0aGlzLmdldERlZmF1bHREb2N1bWVudCgpLmNyZWF0ZUNvbW1lbnQodGV4dCk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVRlbXBsYXRlID0gZnVuY3Rpb24gKGh0bWwpIHtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmdldERlZmF1bHREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgIHQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0YWdOYW1lLCBkb2MpIHtcbiAgICAgICAgZG9jID0gZG9jIHx8IHRoaXMuZ2V0RGVmYXVsdERvY3VtZW50KCk7XG4gICAgICAgIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMgPSBmdW5jdGlvbiAobnMsIHRhZ05hbWUsIGRvYykge1xuICAgICAgICBkb2MgPSBkb2MgfHwgdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKTtcbiAgICAgICAgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50TlMobnMsIHRhZ05hbWUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVRleHROb2RlID0gZnVuY3Rpb24gKHRleHQsIGRvYykge1xuICAgICAgICBkb2MgPSBkb2MgfHwgdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKTtcbiAgICAgICAgcmV0dXJuIGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVTY3JpcHRUYWcgPSBmdW5jdGlvbiAoYXR0ck5hbWUsIGF0dHJWYWx1ZSwgZG9jKSB7XG4gICAgICAgIGRvYyA9IGRvYyB8fCB0aGlzLmdldERlZmF1bHREb2N1bWVudCgpO1xuICAgICAgICB2YXIgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgnU0NSSVBUJyk7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVN0eWxlRWxlbWVudCA9IGZ1bmN0aW9uIChjc3MsIGRvYykge1xuICAgICAgICBkb2MgPSBkb2MgfHwgdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKTtcbiAgICAgICAgdmFyIHN0eWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoc3R5bGUsIHRoaXMuY3JlYXRlVGV4dE5vZGUoY3NzLCBkb2MpKTtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmNyZWF0ZVNoYWRvd1Jvb3QgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNyZWF0ZVNoYWRvd1Jvb3QoKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0U2hhZG93Um9vdCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuc2hhZG93Um9vdDsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0SG9zdCA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuaG9zdDsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG5hbWUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobmFtZSk7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuY2xhc3NMaXN0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnQuY2xhc3NMaXN0LCAwKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuYWRkQ2xhc3MgPSBmdW5jdGlvbiAoZWxlbWVudCwgY2xhc3NOYW1lKSB7IGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUpIHsgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmhhc0NsYXNzID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUsIHN0eWxlVmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5yZW1vdmVTdHlsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZW5hbWUpIHtcbiAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy83OTE2XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVuYW1lXSA9ICcnO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHN0eWxlbmFtZSkgeyByZXR1cm4gZWxlbWVudC5zdHlsZVtzdHlsZW5hbWVdOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5oYXNTdHlsZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUsIHN0eWxlVmFsdWUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRTdHlsZShlbGVtZW50LCBzdHlsZU5hbWUpIHx8ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGVWYWx1ZSA/IHZhbHVlID09IHN0eWxlVmFsdWUgOiB2YWx1ZS5sZW5ndGggPiAwO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnRhZ05hbWUgPSBmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC50YWdOYW1lOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5hdHRyaWJ1dGVNYXAgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgZWxBdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYXR0cmliID0gZWxBdHRycy5pdGVtKGkpO1xuICAgICAgICAgICAgcmVzLnNldChhdHRyaWIubmFtZSwgYXR0cmliLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaGFzQXR0cmlidXRlTlMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbnMsIGF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhucywgYXR0cmlidXRlKTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgYXR0cmlidXRlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24gKGVsZW1lbnQsIG5zLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZU5TKG5zLCBuYW1lKTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyA9IGZ1bmN0aW9uIChlbGVtZW50LCBucywgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhucywgbmFtZSwgdmFsdWUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBhdHRyaWJ1dGUpIHsgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlTlMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbnMsIG5hbWUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOUyhucywgbmFtZSk7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUudGVtcGxhdGVBd2FyZVJvb3QgPSBmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIHRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQoZWwpID8gdGhpcy5jb250ZW50KGVsKSA6IGVsOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5jcmVhdGVIdG1sRG9jdW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ2Zha2VUaXRsZScpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldERlZmF1bHREb2N1bWVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvY3VtZW50OyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0VGl0bGUgPSBmdW5jdGlvbiAoZG9jKSB7IHJldHVybiBkb2MudGl0bGU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldFRpdGxlID0gZnVuY3Rpb24gKGRvYywgbmV3VGl0bGUpIHsgZG9jLnRpdGxlID0gbmV3VGl0bGUgfHwgJyc7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmVsZW1lbnRNYXRjaGVzID0gZnVuY3Rpb24gKG4sIHNlbGVjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRWxlbWVudE5vZGUobikpIHtcbiAgICAgICAgICAgIHJldHVybiBuLm1hdGNoZXMgJiYgbi5tYXRjaGVzKHNlbGVjdG9yKSB8fFxuICAgICAgICAgICAgICAgIG4ubXNNYXRjaGVzU2VsZWN0b3IgJiYgbi5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikgfHxcbiAgICAgICAgICAgICAgICBuLndlYmtpdE1hdGNoZXNTZWxlY3RvciAmJiBuLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzVGVtcGxhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRWxlbWVudE5vZGUoZWwpICYmIGVsLm5vZGVOYW1lID09PSAnVEVNUExBVEUnO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzVGV4dE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzQ29tbWVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzRWxlbWVudE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmhhc1NoYWRvd1Jvb3QgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5zaGFkb3dSb290ICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmlzU2hhZG93Um9vdCA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudDsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuaW1wb3J0SW50b0RvYyA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRoaXMudGVtcGxhdGVBd2FyZVJvb3Qobm9kZSksIHRydWUpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5hZG9wdE5vZGUgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gZG9jdW1lbnQuYWRvcHROb2RlKG5vZGUpOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRIcmVmID0gZnVuY3Rpb24gKGVsKSB7IHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0RXZlbnRLZXkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGtleSA9IGV2ZW50LmtleTtcbiAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICBrZXkgPSBldmVudC5rZXlJZGVudGlmaWVyO1xuICAgICAgICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmRcbiAgICAgICAgICAgIC8vIFNhZmFyaSBjZlxuICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwNzEyMjEvZXZlbnRzLmh0bWwjRXZlbnRzLUtleWJvYXJkRXZlbnRzLUludGVyZmFjZXNcbiAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnVW5pZGVudGlmaWVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoa2V5LnN1YnN0cmluZygyKSwgMTYpKTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubG9jYXRpb24gPT09IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEICYmIF9jaHJvbWVOdW1LZXlQYWRNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDaHJvbWUgZm9yIG51bWVyaWMga2V5cGFkIGtleXM6XG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbiAgICAgICAgICAgICAgICAgICAgLy8gMSwgMiwgMyAuLi4gYXJlIHJlcG9ydGVkIGFzIEEsIEIsIEMgLi4uXG4gICAgICAgICAgICAgICAgICAgIGtleSA9IF9jaHJvbWVOdW1LZXlQYWRNYXBba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9rZXlNYXBba2V5XSB8fCBrZXk7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuZ2V0R2xvYmFsRXZlbnRUYXJnZXQgPSBmdW5jdGlvbiAoZG9jLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGRvYztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0ID09PSAnYm9keScpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2MuYm9keTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRIaXN0b3J5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gd2luZG93Lmhpc3Rvcnk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldExvY2F0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gd2luZG93LmxvY2F0aW9uOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRCYXNlSHJlZiA9IGZ1bmN0aW9uIChkb2MpIHtcbiAgICAgICAgdmFyIGhyZWYgPSBnZXRCYXNlRWxlbWVudEhyZWYoKTtcbiAgICAgICAgcmV0dXJuIGhyZWYgPT0gbnVsbCA/IG51bGwgOiByZWxhdGl2ZVBhdGgoaHJlZik7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucmVzZXRCYXNlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHsgYmFzZUVsZW1lbnQgPSBudWxsOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRVc2VyQWdlbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUuc2V0RGF0YSA9IGZ1bmN0aW9uIChlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnZGF0YS0nICsgbmFtZSwgdmFsdWUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtJyArIG5hbWUpO1xuICAgIH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiAoZWxlbWVudCkgeyByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsgfTtcbiAgICAvLyBUT0RPKHRib3NjaCk6IG1vdmUgdGhpcyBpbnRvIGEgc2VwYXJhdGUgZW52aXJvbm1lbnQgY2xhc3Mgb25jZSB3ZSBoYXZlIGl0XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnN1cHBvcnRzV2ViQW5pbWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIEVsZW1lbnQucHJvdG90eXBlWydhbmltYXRlJ10gPT09ICdmdW5jdGlvbic7XG4gICAgfTtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5wcm90b3R5cGUucGVyZm9ybWFuY2VOb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHBlcmZvcm1hbmNlLm5vdygpIGlzIG5vdCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzLCBzZWVcbiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNzZWFyY2g9cGVyZm9ybWFuY2Uubm93XG4gICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSA6XG4gICAgICAgICAgICBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5zdXBwb3J0c0Nvb2tpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICAgIEJyb3dzZXJEb21BZGFwdGVyLnByb3RvdHlwZS5nZXRDb29raWUgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gybVwYXJzZUNvb2tpZVZhbHVlKGRvY3VtZW50LmNvb2tpZSwgbmFtZSk7IH07XG4gICAgQnJvd3NlckRvbUFkYXB0ZXIucHJvdG90eXBlLnNldENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgICAgICAvLyBkb2N1bWVudC5jb29raWUgaXMgbWFnaWNhbCwgYXNzaWduaW5nIGludG8gaXQgYXNzaWducy9vdmVycmlkZXMgb25lIGNvb2tpZSB2YWx1ZSwgYnV0IGRvZXNcbiAgICAgICAgLy8gbm90IGNsZWFyIG90aGVyIGNvb2tpZXMuXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvd3NlckRvbUFkYXB0ZXI7XG59KEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlcikpO1xudmFyIGJhc2VFbGVtZW50ID0gbnVsbDtcbmZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpIHtcbiAgICBpZiAoIWJhc2VFbGVtZW50KSB7XG4gICAgICAgIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYmFzZScpO1xuICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmFzZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG59XG4vLyBiYXNlZCBvbiB1cmxVdGlscy5qcyBpbiBBbmd1bGFySlMgMVxudmFyIHVybFBhcnNpbmdOb2RlO1xuZnVuY3Rpb24gcmVsYXRpdmVQYXRoKHVybCkge1xuICAgIGlmICghdXJsUGFyc2luZ05vZGUpIHtcbiAgICAgICAgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgfVxuICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBzdXBwb3J0c1N0YXRlKCkge1xuICAgIHJldHVybiAhIXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuXG4gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuIEluc3RlYWQsIHVzZVxuICoge0BsaW5rIExvY2F0aW9ufS5cbiAqL1xudmFyIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbihfZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9kb2MgPSBfZG9jO1xuICAgICAgICBfdGhpcy5faW5pdCgpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8vIFRoaXMgaXMgbW92ZWQgdG8gaXRzIG93biBtZXRob2Qgc28gdGhhdCBgTW9ja1BsYXRmb3JtTG9jYXRpb25TdHJhdGVneWAgY2FuIG92ZXJ3cml0ZSBpdFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubG9jYXRpb24gPSBnZXRET00oKS5nZXRMb2NhdGlvbigpO1xuICAgICAgICB0aGlzLl9oaXN0b3J5ID0gZ2V0RE9NKCkuZ2V0SGlzdG9yeSgpO1xuICAgIH07XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLmdldEJhc2VIcmVmRnJvbURPTSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldERPTSgpLmdldEJhc2VIcmVmKHRoaXMuX2RvYyk7IH07XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLm9uUG9wU3RhdGUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCAnd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmbiwgZmFsc2UpO1xuICAgIH07XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLm9uSGFzaENoYW5nZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsICd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUsIFwiaHJlZlwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5sb2NhdGlvbi5ocmVmOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLCBcInByb3RvY29sXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmxvY2F0aW9uLnByb3RvY29sOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLCBcImhvc3RuYW1lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmxvY2F0aW9uLmhvc3RuYW1lOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLCBcInBvcnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubG9jYXRpb24ucG9ydDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZSwgXCJwYXRobmFtZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZTsgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UGF0aCkgeyB0aGlzLmxvY2F0aW9uLnBhdGhuYW1lID0gbmV3UGF0aDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZSwgXCJzZWFyY2hcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubG9jYXRpb24uc2VhcmNoOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLCBcImhhc2hcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMubG9jYXRpb24uaGFzaDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgICBpZiAoc3VwcG9ydHNTdGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLl9oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uLmhhc2ggPSB1cmw7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5yZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUsIHRpdGxlLCB1cmwpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzU3RhdGUoKSkge1xuICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gdXJsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5faGlzdG9yeS5mb3J3YXJkKCk7IH07XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24ucHJvdG90eXBlLmJhY2sgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2hpc3RvcnkuYmFjaygpOyB9O1xuICAgIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGU7IH07XG4gICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24gPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24pO1xuICAgIHJldHVybiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbjtcbn0oUGxhdGZvcm1Mb2NhdGlvbikpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFuIGlkIHRoYXQgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYmVpbmcgYm9vdHN0cmFwcGVkLCB0aGF0IHNob3VsZFxuICogbWF0Y2ggYWNyb3NzIHRoZSBjbGllbnQvc2VydmVyIGJvdW5kYXJ5LlxuICovXG52YXIgVFJBTlNJVElPTl9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignVFJBTlNJVElPTl9JRCcpO1xuZnVuY3Rpb24gYXBwSW5pdGlhbGl6ZXJGYWN0b3J5KHRyYW5zaXRpb25JZCwgZG9jdW1lbnQsIGluamVjdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGFwcGxpY2F0aW9uIGluaXRpYWxpemVycyB0byBiZSBjb21wbGV0ZWQgYmVmb3JlIHJlbW92aW5nIHRoZSBzdHlsZXMgc2V0IGJ5XG4gICAgICAgIC8vIHRoZSBzZXJ2ZXIuXG4gICAgICAgIGluamVjdG9yLmdldChBcHBsaWNhdGlvbkluaXRTdGF0dXMpLmRvbmVQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRvbSA9IGdldERPTSgpO1xuICAgICAgICAgICAgdmFyIHN0eWxlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShkb20ucXVlcnlTZWxlY3RvckFsbChkb2N1bWVudCwgXCJzdHlsZVtuZy10cmFuc2l0aW9uXVwiKSk7XG4gICAgICAgICAgICBzdHlsZXMuZmlsdGVyKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZG9tLmdldEF0dHJpYnV0ZShlbCwgJ25nLXRyYW5zaXRpb24nKSA9PT0gdHJhbnNpdGlvbklkOyB9KVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZG9tLnJlbW92ZShlbCk7IH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxudmFyIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUyA9IFtcbiAgICB7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgICAgdXNlRmFjdG9yeTogYXBwSW5pdGlhbGl6ZXJGYWN0b3J5LFxuICAgICAgICBkZXBzOiBbVFJBTlNJVElPTl9JRCwgRE9DVU1FTlQsIEluamVjdG9yXSxcbiAgICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuXTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIEJyb3dzZXJHZXRUZXN0YWJpbGl0eSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCcm93c2VyR2V0VGVzdGFiaWxpdHkoKSB7XG4gICAgfVxuICAgIEJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0ID0gZnVuY3Rpb24gKCkgeyBzZXRUZXN0YWJpbGl0eUdldHRlcihuZXcgQnJvd3NlckdldFRlc3RhYmlsaXR5KCkpOyB9O1xuICAgIEJyb3dzZXJHZXRUZXN0YWJpbGl0eS5wcm90b3R5cGUuYWRkVG9XaW5kb3cgPSBmdW5jdGlvbiAocmVnaXN0cnkpIHtcbiAgICAgICAgybVnbG9iYWxbJ2dldEFuZ3VsYXJUZXN0YWJpbGl0eSddID0gZnVuY3Rpb24gKGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICAgICAgaWYgKGZpbmRJbkFuY2VzdG9ycyA9PT0gdm9pZCAwKSB7IGZpbmRJbkFuY2VzdG9ycyA9IHRydWU7IH1cbiAgICAgICAgICAgIHZhciB0ZXN0YWJpbGl0eSA9IHJlZ2lzdHJ5LmZpbmRUZXN0YWJpbGl0eUluVHJlZShlbGVtLCBmaW5kSW5BbmNlc3RvcnMpO1xuICAgICAgICAgICAgaWYgKHRlc3RhYmlsaXR5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRlc3RhYmlsaXR5O1xuICAgICAgICB9O1xuICAgICAgICDJtWdsb2JhbFsnZ2V0QWxsQW5ndWxhclRlc3RhYmlsaXRpZXMnXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZ2lzdHJ5LmdldEFsbFRlc3RhYmlsaXRpZXMoKTsgfTtcbiAgICAgICAgybVnbG9iYWxbJ2dldEFsbEFuZ3VsYXJSb290RWxlbWVudHMnXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZ2lzdHJ5LmdldEFsbFJvb3RFbGVtZW50cygpOyB9O1xuICAgICAgICB2YXIgd2hlbkFsbFN0YWJsZSA9IGZ1bmN0aW9uIChjYWxsYmFjayAvKiogVE9ETyAjOTEwMCAqLykge1xuICAgICAgICAgICAgdmFyIHRlc3RhYmlsaXRpZXMgPSDJtWdsb2JhbFsnZ2V0QWxsQW5ndWxhclRlc3RhYmlsaXRpZXMnXSgpO1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gdGVzdGFiaWxpdGllcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZGlkV29yayA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGRlY3JlbWVudCA9IGZ1bmN0aW9uIChkaWRXb3JrXyAvKiogVE9ETyAjOTEwMCAqLykge1xuICAgICAgICAgICAgICAgIGRpZFdvcmsgPSBkaWRXb3JrIHx8IGRpZFdvcmtfO1xuICAgICAgICAgICAgICAgIGNvdW50LS07XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGlkV29yayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRlc3RhYmlsaXRpZXMuZm9yRWFjaChmdW5jdGlvbiAodGVzdGFiaWxpdHkgLyoqIFRPRE8gIzkxMDAgKi8pIHtcbiAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlKGRlY3JlbWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCHJtWdsb2JhbFsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXSkge1xuICAgICAgICAgICAgybVnbG9iYWxbJ2ZyYW1ld29ya1N0YWJpbGl6ZXJzJ10gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICDJtWdsb2JhbFsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXS5wdXNoKHdoZW5BbGxTdGFibGUpO1xuICAgIH07XG4gICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LnByb3RvdHlwZS5maW5kVGVzdGFiaWxpdHlJblRyZWUgPSBmdW5jdGlvbiAocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgICBpZiAoZWxlbSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdCA9IHJlZ2lzdHJ5LmdldFRlc3RhYmlsaXR5KGVsZW0pO1xuICAgICAgICBpZiAodCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZmluZEluQW5jZXN0b3JzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0RE9NKCkuaXNTaGFkb3dSb290KGVsZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGdldERPTSgpLmdldEhvc3QoZWxlbSksIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZ2V0RE9NKCkucGFyZW50RWxlbWVudChlbGVtKSwgdHJ1ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gQnJvd3NlckdldFRlc3RhYmlsaXR5O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBFeHBvcnRzIHRoZSB2YWx1ZSB1bmRlciBhIGdpdmVuIGBuYW1lYCBpbiB0aGUgZ2xvYmFsIHByb3BlcnR5IGBuZ2AuIEZvciBleGFtcGxlIGBuZy5wcm9iZWAgaWZcbiAqIGBuYW1lYCBpcyBgJ3Byb2JlJ2AuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIHVuZGVyIHdoaWNoIGl0IHdpbGwgYmUgZXhwb3J0ZWQuIEtlZXAgaW4gbWluZCB0aGlzIHdpbGwgYmUgYSBwcm9wZXJ0eSBvZiB0aGVcbiAqIGdsb2JhbCBgbmdgIG9iamVjdC5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXhwb3J0LlxuICovXG5mdW5jdGlvbiBleHBvcnROZ1ZhcihuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgQ09NUElMRUQgPT09ICd1bmRlZmluZWQnIHx8ICFDT01QSUxFRCkge1xuICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBleHBvcnQgYG5nYCB3aGVuIHVzaW5nIGNsb3N1cmUgZW5oYW5jZWQgb3B0aW1pemF0aW9uIGFzOlxuICAgICAgICAvLyAtIGNsb3N1cmUgZGVjbGFyZXMgZ2xvYmFscyBpdHNlbGYgZm9yIG1pbmlmaWVkIG5hbWVzLCB3aGljaCBzb21ldGltZXMgY2xvYmJlciBvdXIgYG5nYCBnbG9iYWxcbiAgICAgICAgLy8gLSB3ZSBjYW4ndCBkZWNsYXJlIGEgY2xvc3VyZSBleHRlcm4gYXMgdGhlIG5hbWVzcGFjZSBgbmdgIGlzIGFscmVhZHkgdXNlZCB3aXRoaW4gR29vZ2xlXG4gICAgICAgIC8vICAgZm9yIHR5cGluZ3MgZm9yIGFuZ3VsYXJKUyAodmlhIGBnb29nLnByb3ZpZGUoJ25nLi4uLicpYCkuXG4gICAgICAgIHZhciBuZyA9IMm1Z2xvYmFsWyduZyddID0gybVnbG9iYWxbJ25nJ10gfHwge307XG4gICAgICAgIG5nW25hbWVdID0gdmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgybUwJDEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoe1xuICAgICdBcHBsaWNhdGlvblJlZic6IEFwcGxpY2F0aW9uUmVmLFxuICAgICdOZ1pvbmUnOiBOZ1pvbmUsXG59KTsgfTtcbnZhciBDT1JFX1RPS0VOUyA9ICjJtTAkMSkoKTtcbnZhciBJTlNQRUNUX0dMT0JBTF9OQU1FID0gJ3Byb2JlJztcbnZhciBDT1JFX1RPS0VOU19HTE9CQUxfTkFNRSA9ICdjb3JlVG9rZW5zJztcbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBEZWJ1Z0VsZW1lbnR9IGZvciB0aGUgZ2l2ZW4gbmF0aXZlIERPTSBlbGVtZW50LCBvclxuICogbnVsbCBpZiB0aGUgZ2l2ZW4gbmF0aXZlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBBbmd1bGFyIHZpZXcgYXNzb2NpYXRlZFxuICogd2l0aCBpdC5cbiAqL1xuZnVuY3Rpb24gaW5zcGVjdE5hdGl2ZUVsZW1lbnQoZWxlbWVudCkge1xuICAgIHJldHVybiBnZXREZWJ1Z05vZGUoZWxlbWVudCk7XG59XG5mdW5jdGlvbiBfY3JlYXRlTmdQcm9iZShjb3JlVG9rZW5zKSB7XG4gICAgZXhwb3J0TmdWYXIoSU5TUEVDVF9HTE9CQUxfTkFNRSwgaW5zcGVjdE5hdGl2ZUVsZW1lbnQpO1xuICAgIGV4cG9ydE5nVmFyKENPUkVfVE9LRU5TX0dMT0JBTF9OQU1FLCBfX2Fzc2lnbih7fSwgQ09SRV9UT0tFTlMsIF9uZ1Byb2JlVG9rZW5zVG9NYXAoY29yZVRva2VucyB8fCBbXSkpKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5zcGVjdE5hdGl2ZUVsZW1lbnQ7IH07XG59XG5mdW5jdGlvbiBfbmdQcm9iZVRva2Vuc1RvTWFwKHRva2Vucykge1xuICAgIHJldHVybiB0b2tlbnMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCB0KSB7IHJldHVybiAocHJldlt0Lm5hbWVdID0gdC50b2tlbiwgcHJldik7IH0sIHt9KTtcbn1cbi8qKlxuICogSW4gSXZ5LCB3ZSBkb24ndCBzdXBwb3J0IE5nUHJvYmUgYmVjYXVzZSB3ZSBoYXZlIG91ciBvd24gc2V0IG9mIHRlc3RpbmcgdXRpbGl0aWVzXG4gKiB3aXRoIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogV2Ugc2hvdWxkbid0IGJyaW5nIGluIE5nUHJvYmUgYmVjYXVzZSBpdCBwcmV2ZW50cyBEZWJ1Z05vZGUgYW5kIGZyaWVuZHMgZnJvbVxuICogdHJlZS1zaGFraW5nIHByb3Blcmx5LlxuICovXG52YXIgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BPU1RfUjNfXyA9IFtdO1xuLyoqXG4gKiBQcm92aWRlcnMgd2hpY2ggc3VwcG9ydCBkZWJ1Z2dpbmcgQW5ndWxhciBhcHBsaWNhdGlvbnMgKGUuZy4gdmlhIGBuZy5wcm9iZWApLlxuICovXG52YXIgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BSRV9SM19fID0gW1xuICAgIHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgICB1c2VGYWN0b3J5OiBfY3JlYXRlTmdQcm9iZSxcbiAgICAgICAgZGVwczogW1xuICAgICAgICAgICAgW05nUHJvYmVUb2tlbiwgbmV3IE9wdGlvbmFsKCldLFxuICAgICAgICBdLFxuICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuXTtcbnZhciBFTEVNRU5UX1BST0JFX1BST1ZJREVSUyA9IEVMRU1FTlRfUFJPQkVfUFJPVklERVJTX19QUkVfUjNfXztcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBUaGUgaW5qZWN0aW9uIHRva2VuIGZvciB0aGUgZXZlbnQtbWFuYWdlciBwbHVnLWluIHNlcnZpY2UuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRVZFTlRfTUFOQUdFUl9QTFVHSU5TID0gbmV3IEluamVjdGlvblRva2VuKCdFdmVudE1hbmFnZXJQbHVnaW5zJyk7XG4vKipcbiAqIEFuIGluamVjdGFibGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIGV2ZW50IG1hbmFnZW1lbnQgZm9yIEFuZ3VsYXJcbiAqIHRocm91Z2ggYSBicm93c2VyIHBsdWctaW4uXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRXZlbnRNYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBldmVudC1tYW5hZ2VyIHNlcnZpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gRXZlbnRNYW5hZ2VyKHBsdWdpbnMsIF96b25lKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTtcbiAgICAgICAgdGhpcy5fZXZlbnROYW1lVG9QbHVnaW4gPSBuZXcgTWFwKCk7XG4gICAgICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC5tYW5hZ2VyID0gX3RoaXM7IH0pO1xuICAgICAgICB0aGlzLl9wbHVnaW5zID0gcGx1Z2lucy5zbGljZSgpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zLlxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnMuIFJlY2VpdmVzIHRoZVxuICAgICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyAgQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgaGFuZGxlci5cbiAgICAgKi9cbiAgICBFdmVudE1hbmFnZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7XG4gICAgICAgIHJldHVybiBwbHVnaW4uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgZ2xvYmFsIGhhbmRsZXIgZm9yIGFuIGV2ZW50IGluIGEgdGFyZ2V0IHZpZXcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IEEgdGFyZ2V0IGZvciBnbG9iYWwgZXZlbnQgbm90aWZpY2F0aW9ucy4gT25lIG9mIFwid2luZG93XCIsIFwiZG9jdW1lbnRcIiwgb3IgXCJib2R5XCIuXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbm90aWZpY2F0aW9uIG9jY3Vycy4gUmVjZWl2ZXMgdGhlXG4gICAgICogZXZlbnQgb2JqZWN0IGFzIGFuIGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIGhhbmRsZXIuXG4gICAgICovXG4gICAgRXZlbnRNYW5hZ2VyLnByb3RvdHlwZS5hZGRHbG9iYWxFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7XG4gICAgICAgIHJldHVybiBwbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBpbGF0aW9uIHpvbmUgaW4gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIEV2ZW50TWFuYWdlci5wcm90b3R5cGUuZ2V0Wm9uZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3pvbmU7IH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEV2ZW50TWFuYWdlci5wcm90b3R5cGUuX2ZpbmRQbHVnaW5Gb3IgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHZhciBwbHVnaW4gPSB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgaWYgKHBsdWdpbikge1xuICAgICAgICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGx1Z2lucyA9IHRoaXMuX3BsdWdpbnM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBsdWdpbl8xID0gcGx1Z2luc1tpXTtcbiAgICAgICAgICAgIGlmIChwbHVnaW5fMS5zdXBwb3J0cyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uc2V0KGV2ZW50TmFtZSwgcGx1Z2luXzEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW5fMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBldmVudCBtYW5hZ2VyIHBsdWdpbiBmb3VuZCBmb3IgZXZlbnQgXCIgKyBldmVudE5hbWUpO1xuICAgIH07XG4gICAgRXZlbnRNYW5hZ2VyID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoRVZFTlRfTUFOQUdFUl9QTFVHSU5TKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXksIE5nWm9uZV0pXG4gICAgXSwgRXZlbnRNYW5hZ2VyKTtcbiAgICByZXR1cm4gRXZlbnRNYW5hZ2VyO1xufSgpKTtcbnZhciBFdmVudE1hbmFnZXJQbHVnaW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRNYW5hZ2VyUGx1Z2luKF9kb2MpIHtcbiAgICAgICAgdGhpcy5fZG9jID0gX2RvYztcbiAgICB9XG4gICAgRXZlbnRNYW5hZ2VyUGx1Z2luLnByb3RvdHlwZS5hZGRHbG9iYWxFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCBlbGVtZW50KTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGV2ZW50IHRhcmdldCBcIiArIHRhcmdldCArIFwiIGZvciBldmVudCBcIiArIGV2ZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRNYW5hZ2VyUGx1Z2luO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFNoYXJlZFN0eWxlc0hvc3QgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2hhcmVkU3R5bGVzSG9zdCgpIHtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9zdHlsZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIFNoYXJlZFN0eWxlc0hvc3QucHJvdG90eXBlLmFkZFN0eWxlcyA9IGZ1bmN0aW9uIChzdHlsZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFkZGl0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAgICAgc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLl9zdHlsZXNTZXQuaGFzKHN0eWxlKSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9zdHlsZXNTZXQuYWRkKHN0eWxlKTtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbnMuYWRkKHN0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25TdHlsZXNBZGRlZChhZGRpdGlvbnMpO1xuICAgIH07XG4gICAgU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUub25TdHlsZXNBZGRlZCA9IGZ1bmN0aW9uIChhZGRpdGlvbnMpIHsgfTtcbiAgICBTaGFyZWRTdHlsZXNIb3N0LnByb3RvdHlwZS5nZXRBbGxTdHlsZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0eWxlc1NldCk7IH07XG4gICAgU2hhcmVkU3R5bGVzSG9zdCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKClcbiAgICBdLCBTaGFyZWRTdHlsZXNIb3N0KTtcbiAgICByZXR1cm4gU2hhcmVkU3R5bGVzSG9zdDtcbn0oKSk7XG52YXIgRG9tU2hhcmVkU3R5bGVzSG9zdCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRG9tU2hhcmVkU3R5bGVzSG9zdCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEb21TaGFyZWRTdHlsZXNIb3N0KF9kb2MpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2RvYyA9IF9kb2M7XG4gICAgICAgIF90aGlzLl9ob3N0Tm9kZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgIF90aGlzLl9zdHlsZU5vZGVzID0gbmV3IFNldCgpO1xuICAgICAgICBfdGhpcy5faG9zdE5vZGVzLmFkZChfZG9jLmhlYWQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERvbVNoYXJlZFN0eWxlc0hvc3QucHJvdG90eXBlLl9hZGRTdHlsZXNUb0hvc3QgPSBmdW5jdGlvbiAoc3R5bGVzLCBob3N0KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHN0eWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgICAgICAgdmFyIHN0eWxlRWwgPSBfdGhpcy5fZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgICAgICAgICBfdGhpcy5fc3R5bGVOb2Rlcy5hZGQoaG9zdC5hcHBlbmRDaGlsZChzdHlsZUVsKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUuYWRkSG9zdCA9IGZ1bmN0aW9uIChob3N0Tm9kZSkge1xuICAgICAgICB0aGlzLl9hZGRTdHlsZXNUb0hvc3QodGhpcy5fc3R5bGVzU2V0LCBob3N0Tm9kZSk7XG4gICAgICAgIHRoaXMuX2hvc3ROb2Rlcy5hZGQoaG9zdE5vZGUpO1xuICAgIH07XG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUucmVtb3ZlSG9zdCA9IGZ1bmN0aW9uIChob3N0Tm9kZSkgeyB0aGlzLl9ob3N0Tm9kZXMuZGVsZXRlKGhvc3ROb2RlKTsgfTtcbiAgICBEb21TaGFyZWRTdHlsZXNIb3N0LnByb3RvdHlwZS5vblN0eWxlc0FkZGVkID0gZnVuY3Rpb24gKGFkZGl0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoaG9zdE5vZGUpIHsgcmV0dXJuIF90aGlzLl9hZGRTdHlsZXNUb0hvc3QoYWRkaXRpb25zLCBob3N0Tm9kZSk7IH0pO1xuICAgIH07XG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdC5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3N0eWxlTm9kZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGVOb2RlKSB7IHJldHVybiBnZXRET00oKS5yZW1vdmUoc3R5bGVOb2RlKTsgfSk7IH07XG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKCksXG4gICAgICAgIF9fcGFyYW0oMCwgSW5qZWN0KERPQ1VNRU5UKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCBEb21TaGFyZWRTdHlsZXNIb3N0KTtcbiAgICByZXR1cm4gRG9tU2hhcmVkU3R5bGVzSG9zdDtcbn0oU2hhcmVkU3R5bGVzSG9zdCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgTkFNRVNQQUNFX1VSSVMgPSB7XG4gICAgJ3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgJ3hodG1sJzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLFxuICAgICd4bGluayc6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyxcbiAgICAneG1sJzogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsXG4gICAgJ3htbG5zJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvJyxcbn07XG52YXIgQ09NUE9ORU5UX1JFR0VYID0gLyVDT01QJS9nO1xudmFyIENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnO1xudmFyIEhPU1RfQVRUUiA9IFwiX25naG9zdC1cIiArIENPTVBPTkVOVF9WQVJJQUJMRTtcbnZhciBDT05URU5UX0FUVFIgPSBcIl9uZ2NvbnRlbnQtXCIgKyBDT01QT05FTlRfVkFSSUFCTEU7XG5mdW5jdGlvbiBzaGltQ29udGVudEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7XG4gICAgcmV0dXJuIENPTlRFTlRfQVRUUi5yZXBsYWNlKENPTVBPTkVOVF9SRUdFWCwgY29tcG9uZW50U2hvcnRJZCk7XG59XG5mdW5jdGlvbiBzaGltSG9zdEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7XG4gICAgcmV0dXJuIEhPU1RfQVRUUi5yZXBsYWNlKENPTVBPTkVOVF9SRUdFWCwgY29tcG9uZW50U2hvcnRJZCk7XG59XG5mdW5jdGlvbiBmbGF0dGVuU3R5bGVzKGNvbXBJZCwgc3R5bGVzLCB0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3R5bGUgPSBzdHlsZXNbaV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkge1xuICAgICAgICAgICAgZmxhdHRlblN0eWxlcyhjb21wSWQsIHN0eWxlLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUgPSBzdHlsZS5yZXBsYWNlKENPTVBPTkVOVF9SRUdFWCwgY29tcElkKTtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHN0eWxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZGVjb3JhdGVQcmV2ZW50RGVmYXVsdChldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBhbGxvd0RlZmF1bHRCZWhhdmlvciA9IGV2ZW50SGFuZGxlcihldmVudCk7XG4gICAgICAgIGlmIChhbGxvd0RlZmF1bHRCZWhhdmlvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIFRPRE8odGJvc2NoKTogbW92ZSBwcmV2ZW50RGVmYXVsdCBpbnRvIGV2ZW50IHBsdWdpbnMuLi5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbnZhciBEb21SZW5kZXJlckZhY3RvcnkyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERvbVJlbmRlcmVyRmFjdG9yeTIoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBhcHBJZCkge1xuICAgICAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGV2ZW50TWFuYWdlcjtcbiAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0ID0gc2hhcmVkU3R5bGVzSG9zdDtcbiAgICAgICAgdGhpcy5hcHBJZCA9IGFwcElkO1xuICAgICAgICB0aGlzLnJlbmRlcmVyQnlDb21wSWQgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFJlbmRlcmVyID0gbmV3IERlZmF1bHREb21SZW5kZXJlcjIoZXZlbnRNYW5hZ2VyKTtcbiAgICB9XG4gICAgRG9tUmVuZGVyZXJGYWN0b3J5Mi5wcm90b3R5cGUuY3JlYXRlUmVuZGVyZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSkge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHR5cGUuZW5jYXBzdWxhdGlvbikge1xuICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDoge1xuICAgICAgICAgICAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXJCeUNvbXBJZC5nZXQodHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlcikge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlciA9IG5ldyBFbXVsYXRlZEVuY2Fwc3VsYXRpb25Eb21SZW5kZXJlcjIodGhpcy5ldmVudE1hbmFnZXIsIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCwgdHlwZSwgdGhpcy5hcHBJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQodHlwZS5pZCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZW5kZXJlci5hcHBseVRvSG9zdChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZTpcbiAgICAgICAgICAgIGNhc2UgVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhZG93RG9tUmVuZGVyZXIodGhpcy5ldmVudE1hbmFnZXIsIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCwgZWxlbWVudCwgdHlwZSk7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVyQnlDb21wSWQuaGFzKHR5cGUuaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKHR5cGUuaWQsIHR5cGUuc3R5bGVzLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMoc3R5bGVzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlckJ5Q29tcElkLnNldCh0eXBlLmlkLCB0aGlzLmRlZmF1bHRSZW5kZXJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tUmVuZGVyZXJGYWN0b3J5Mi5wcm90b3R5cGUuYmVnaW4gPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgRG9tUmVuZGVyZXJGYWN0b3J5Mi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIERvbVJlbmRlcmVyRmFjdG9yeTIgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDIsIEluamVjdChBUFBfSUQpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtFdmVudE1hbmFnZXIsIERvbVNoYXJlZFN0eWxlc0hvc3QsIFN0cmluZ10pXG4gICAgXSwgRG9tUmVuZGVyZXJGYWN0b3J5Mik7XG4gICAgcmV0dXJuIERvbVJlbmRlcmVyRmFjdG9yeTI7XG59KCkpO1xudmFyIERlZmF1bHREb21SZW5kZXJlcjIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmYXVsdERvbVJlbmRlcmVyMihldmVudE1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7XG4gICAgICAgIHRoaXMuZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgfVxuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChuYW1lLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZXMgd2hlcmUgSXZ5IChub3QgVmlld0VuZ2luZSkgaXMgZ2l2aW5nIHVzIHRoZSBhY3R1YWwgbmFtZXNwYWNlLCB0aGUgbG9vayB1cCBieSBrZXlcbiAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCwgc28gd2UganVzdCByZXR1cm4gdGhlIG5hbWVzcGFjZSBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhOQU1FU1BBQ0VfVVJJU1tuYW1lc3BhY2VdIHx8IG5hbWVzcGFjZSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG4gICAgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5jcmVhdGVDb21tZW50ID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KHZhbHVlKTsgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5jcmVhdGVUZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7IH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUuYXBwZW5kQ2hpbGQgPSBmdW5jdGlvbiAocGFyZW50LCBuZXdDaGlsZCkgeyBwYXJlbnQuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOyB9O1xuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIChwYXJlbnQsIG5ld0NoaWxkLCByZWZDaGlsZCkge1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gKHBhcmVudCwgb2xkQ2hpbGQpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG9sZENoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUuc2VsZWN0Um9vdEVsZW1lbnQgPSBmdW5jdGlvbiAoc2VsZWN0b3JPck5vZGUsIHByZXNlcnZlQ29udGVudCkge1xuICAgICAgICB2YXIgZWwgPSB0eXBlb2Ygc2VsZWN0b3JPck5vZGUgPT09ICdzdHJpbmcnID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvck9yTm9kZSkgOlxuICAgICAgICAgICAgc2VsZWN0b3JPck5vZGU7XG4gICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzZWxlY3RvciBcXFwiXCIgKyBzZWxlY3Rvck9yTm9kZSArIFwiXFxcIiBkaWQgbm90IG1hdGNoIGFueSBlbGVtZW50c1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXByZXNlcnZlQ29udGVudCkge1xuICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWw7XG4gICAgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5wYXJlbnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTsgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5uZXh0U2libGluZyA9IGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLm5leHRTaWJsaW5nOyB9O1xuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSkge1xuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgICBuYW1lID0gbmFtZXNwYWNlICsgXCI6XCIgKyBuYW1lO1xuICAgICAgICAgICAgLy8gVE9ETyhiZW5sZXNoKTogSXZ5IG1heSBjYXVzZSBpc3N1ZXMgaGVyZSBiZWNhdXNlIGl0J3MgcGFzc2luZyBhcm91bmRcbiAgICAgICAgICAgIC8vIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlcywgdGhlcmVmb3JlIHRoaXMgbG9va3VwIHdpbGwgZmFpbC5cbiAgICAgICAgICAgIHZhciBuYW1lc3BhY2VVcmkgPSBOQU1FU1BBQ0VfVVJJU1tuYW1lc3BhY2VdO1xuICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVyaSkge1xuICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVyaSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIC8vIFRPRE8oYmVubGVzaCk6IEl2eSBtYXkgY2F1c2UgaXNzdWVzIGhlcmUgYmVjYXVzZSBpdCdzIHBhc3NpbmcgYXJvdW5kXG4gICAgICAgICAgICAvLyBmdWxsIFVSSXMgZm9yIG5hbWVzcGFjZXMsIHRoZXJlZm9yZSB0aGlzIGxvb2t1cCB3aWxsIGZhaWwuXG4gICAgICAgICAgICB2YXIgbmFtZXNwYWNlVXJpID0gTkFNRVNQQUNFX1VSSVNbbmFtZXNwYWNlXTtcbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVcmkpIHtcbiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVcmksIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhiZW5sZXNoKTogU2luY2UgaXZ5IGlzIHBhc3NpbmcgYXJvdW5kIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlc1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgcmVzdWx0IGluIHByb3BlcnRpZXMgbGlrZSBgaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc6Y3g9XCIxMjNcImAsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgd3JvbmcuXG4gICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKG5hbWVzcGFjZSArIFwiOlwiICsgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZmF1bHREb21SZW5kZXJlcjIucHJvdG90eXBlLmFkZENsYXNzID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7IGVsLmNsYXNzTGlzdC5hZGQobmFtZSk7IH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbiAoZWwsIG5hbWUpIHsgZWwuY2xhc3NMaXN0LnJlbW92ZShuYW1lKTsgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uIChlbCwgc3R5bGUsIHZhbHVlLCBmbGFncykge1xuICAgICAgICBpZiAoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZSwgdmFsdWUsICEhKGZsYWdzICYgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbC5zdHlsZVtzdHlsZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUucmVtb3ZlU3R5bGUgPSBmdW5jdGlvbiAoZWwsIHN0eWxlLCBmbGFncykge1xuICAgICAgICBpZiAoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKSB7XG4gICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJRSByZXF1aXJlcyAnJyBpbnN0ZWFkIG9mIG51bGxcbiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy83OTE2XG4gICAgICAgICAgICBlbC5zdHlsZVtzdHlsZV0gPSAnJztcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUuc2V0UHJvcGVydHkgPSBmdW5jdGlvbiAoZWwsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGNoZWNrTm9TeW50aGV0aWNQcm9wKG5hbWUsICdwcm9wZXJ0eScpO1xuICAgICAgICBlbFtuYW1lXSA9IHZhbHVlO1xuICAgIH07XG4gICAgRGVmYXVsdERvbVJlbmRlcmVyMi5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAobm9kZSwgdmFsdWUpIHsgbm9kZS5ub2RlVmFsdWUgPSB2YWx1ZTsgfTtcbiAgICBEZWZhdWx0RG9tUmVuZGVyZXIyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiAodGFyZ2V0LCBldmVudCwgY2FsbGJhY2spIHtcbiAgICAgICAgY2hlY2tOb1N5bnRoZXRpY1Byb3AoZXZlbnQsICdsaXN0ZW5lcicpO1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50TWFuYWdlci5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnQsIGRlY29yYXRlUHJldmVudERlZmF1bHQoY2FsbGJhY2spKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50LCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmYXVsdERvbVJlbmRlcmVyMjtcbn0oKSk7XG52YXIgybUwJDIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnQCcuY2hhckNvZGVBdCgwKTsgfTtcbnZhciBBVF9DSEFSQ09ERSA9ICjJtTAkMikoKTtcbmZ1bmN0aW9uIGNoZWNrTm9TeW50aGV0aWNQcm9wKG5hbWUsIG5hbWVLaW5kKSB7XG4gICAgaWYgKG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gQVRfQ0hBUkNPREUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRm91bmQgdGhlIHN5bnRoZXRpYyBcIiArIG5hbWVLaW5kICsgXCIgXCIgKyBuYW1lICsgXCIuIFBsZWFzZSBpbmNsdWRlIGVpdGhlciBcXFwiQnJvd3NlckFuaW1hdGlvbnNNb2R1bGVcXFwiIG9yIFxcXCJOb29wQW5pbWF0aW9uc01vZHVsZVxcXCIgaW4geW91ciBhcHBsaWNhdGlvbi5cIik7XG4gICAgfVxufVxudmFyIEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRW11bGF0ZWRFbmNhcHN1bGF0aW9uRG9tUmVuZGVyZXIyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGNvbXBvbmVudCwgYXBwSWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZXZlbnRNYW5hZ2VyKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAgIHZhciBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKGFwcElkICsgJy0nICsgY29tcG9uZW50LmlkLCBjb21wb25lbnQuc3R5bGVzLCBbXSk7XG4gICAgICAgIHNoYXJlZFN0eWxlc0hvc3QuYWRkU3R5bGVzKHN0eWxlcyk7XG4gICAgICAgIF90aGlzLmNvbnRlbnRBdHRyID0gc2hpbUNvbnRlbnRBdHRyaWJ1dGUoYXBwSWQgKyAnLScgKyBjb21wb25lbnQuaWQpO1xuICAgICAgICBfdGhpcy5ob3N0QXR0ciA9IHNoaW1Ib3N0QXR0cmlidXRlKGFwcElkICsgJy0nICsgY29tcG9uZW50LmlkKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBFbXVsYXRlZEVuY2Fwc3VsYXRpb25Eb21SZW5kZXJlcjIucHJvdG90eXBlLmFwcGx5VG9Ib3N0ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsgX3N1cGVyLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBlbGVtZW50LCB0aGlzLmhvc3RBdHRyLCAnJyk7IH07XG4gICAgRW11bGF0ZWRFbmNhcHN1bGF0aW9uRG9tUmVuZGVyZXIyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmVudCwgbmFtZSkge1xuICAgICAgICB2YXIgZWwgPSBfc3VwZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzLCBwYXJlbnQsIG5hbWUpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIGVsLCB0aGlzLmNvbnRlbnRBdHRyLCAnJyk7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9O1xuICAgIHJldHVybiBFbXVsYXRlZEVuY2Fwc3VsYXRpb25Eb21SZW5kZXJlcjI7XG59KERlZmF1bHREb21SZW5kZXJlcjIpKTtcbnZhciBTaGFkb3dEb21SZW5kZXJlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2hhZG93RG9tUmVuZGVyZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2hhZG93RG9tUmVuZGVyZXIoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBob3N0RWwsIGNvbXBvbmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBldmVudE1hbmFnZXIpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNoYXJlZFN0eWxlc0hvc3QgPSBzaGFyZWRTdHlsZXNIb3N0O1xuICAgICAgICBfdGhpcy5ob3N0RWwgPSBob3N0RWw7XG4gICAgICAgIF90aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb20pIHtcbiAgICAgICAgICAgIF90aGlzLnNoYWRvd1Jvb3QgPSBob3N0RWwuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuc2hhZG93Um9vdCA9IGhvc3RFbC5jcmVhdGVTaGFkb3dSb290KCk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuc2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0KF90aGlzLnNoYWRvd1Jvb3QpO1xuICAgICAgICB2YXIgc3R5bGVzID0gZmxhdHRlblN0eWxlcyhjb21wb25lbnQuaWQsIGNvbXBvbmVudC5zdHlsZXMsIFtdKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIHN0eWxlRWwudGV4dENvbnRlbnQgPSBzdHlsZXNbaV07XG4gICAgICAgICAgICBfdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHN0eWxlRWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgU2hhZG93RG9tUmVuZGVyZXIucHJvdG90eXBlLm5vZGVPclNoYWRvd1Jvb3QgPSBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZSA9PT0gdGhpcy5ob3N0RWwgPyB0aGlzLnNoYWRvd1Jvb3QgOiBub2RlOyB9O1xuICAgIFNoYWRvd0RvbVJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgeyB0aGlzLnNoYXJlZFN0eWxlc0hvc3QucmVtb3ZlSG9zdCh0aGlzLnNoYWRvd1Jvb3QpOyB9O1xuICAgIFNoYWRvd0RvbVJlbmRlcmVyLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChwYXJlbnQsIG5ld0NoaWxkKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmFwcGVuZENoaWxkLmNhbGwodGhpcywgdGhpcy5ub2RlT3JTaGFkb3dSb290KHBhcmVudCksIG5ld0NoaWxkKTtcbiAgICB9O1xuICAgIFNoYWRvd0RvbVJlbmRlcmVyLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiAocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLmNhbGwodGhpcywgdGhpcy5ub2RlT3JTaGFkb3dSb290KHBhcmVudCksIG5ld0NoaWxkLCByZWZDaGlsZCk7XG4gICAgfTtcbiAgICBTaGFkb3dEb21SZW5kZXJlci5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiAocGFyZW50LCBvbGRDaGlsZCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZW1vdmVDaGlsZC5jYWxsKHRoaXMsIHRoaXMubm9kZU9yU2hhZG93Um9vdChwYXJlbnQpLCBvbGRDaGlsZCk7XG4gICAgfTtcbiAgICBTaGFkb3dEb21SZW5kZXJlci5wcm90b3R5cGUucGFyZW50Tm9kZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVPclNoYWRvd1Jvb3QoX3N1cGVyLnByb3RvdHlwZS5wYXJlbnROb2RlLmNhbGwodGhpcywgdGhpcy5ub2RlT3JTaGFkb3dSb290KG5vZGUpKSk7XG4gICAgfTtcbiAgICByZXR1cm4gU2hhZG93RG9tUmVuZGVyZXI7XG59KERlZmF1bHREb21SZW5kZXJlcjIpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIMm1MCQzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKHR5cGVvZiBab25lICE9PSAndW5kZWZpbmVkJykgJiYgWm9uZVsnX19zeW1ib2xfXyddIHx8XG4gICAgZnVuY3Rpb24gKHYpIHsgcmV0dXJuICdfX3pvbmVfc3ltYm9sX18nICsgdjsgfTsgfTtcbi8qKlxuICogRGV0ZWN0IGlmIFpvbmUgaXMgcHJlc2VudC4gSWYgaXQgaXMgdGhlbiB1c2Ugc2ltcGxlIHpvbmUgYXdhcmUgJ2FkZEV2ZW50TGlzdGVuZXInXG4gKiBzaW5jZSBBbmd1bGFyIGNhbiBkbyBtdWNoIG1vcmVcbiAqIGVmZmljaWVudCBib29ra2VlcGluZyB0aGFuIFpvbmUgY2FuLCBiZWNhdXNlIHdlIGhhdmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gVGhpcyBzcGVlZHMgdXBcbiAqIGFkZEV2ZW50TGlzdGVuZXIgYnkgM3guXG4gKi9cbnZhciBfX3N5bWJvbF9fID0gKMm1MCQzKSgpO1xudmFyIEFERF9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oJ2FkZEV2ZW50TGlzdGVuZXInKTtcbnZhciBSRU1PVkVfRVZFTlRfTElTVEVORVIgPSBfX3N5bWJvbF9fKCdyZW1vdmVFdmVudExpc3RlbmVyJyk7XG52YXIgc3ltYm9sTmFtZXMgPSB7fTtcbnZhciBGQUxTRSA9ICdGQUxTRSc7XG52YXIgQU5HVUxBUiA9ICdBTkdVTEFSJztcbnZhciBOQVRJVkVfQUREX0xJU1RFTkVSID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xudmFyIE5BVElWRV9SRU1PVkVfTElTVEVORVIgPSAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG4vLyB1c2UgdGhlIHNhbWUgc3ltYm9sIHN0cmluZyB3aGljaCBpcyB1c2VkIGluIHpvbmUuanNcbnZhciBzdG9wU3ltYm9sID0gJ19fem9uZV9zeW1ib2xfX3Byb3BhZ2F0aW9uU3RvcHBlZCc7XG52YXIgc3RvcE1ldGhvZFN5bWJvbCA9ICdfX3pvbmVfc3ltYm9sX19zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24nO1xudmFyIMm1MSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYmxhY2tMaXN0ZWRFdmVudHMgPSAodHlwZW9mIFpvbmUgIT09ICd1bmRlZmluZWQnKSAmJiBab25lW19fc3ltYm9sX18oJ0JMQUNLX0xJU1RFRF9FVkVOVFMnKV07XG4gICAgaWYgKGJsYWNrTGlzdGVkRXZlbnRzKSB7XG4gICAgICAgIHZhciByZXNfMSA9IHt9O1xuICAgICAgICBibGFja0xpc3RlZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudE5hbWUpIHsgcmVzXzFbZXZlbnROYW1lXSA9IGV2ZW50TmFtZTsgfSk7XG4gICAgICAgIHJldHVybiByZXNfMTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG52YXIgYmxhY2tMaXN0ZWRNYXAgPSAoybUxKSgpO1xudmFyIGlzQmxhY2tMaXN0ZWRFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHtcbiAgICBpZiAoIWJsYWNrTGlzdGVkTWFwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGJsYWNrTGlzdGVkTWFwLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSk7XG59O1xuLy8gYSBnbG9iYWwgbGlzdGVuZXIgdG8gaGFuZGxlIGFsbCBkb20gZXZlbnQsXG4vLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBjbG9zdXJlIGV2ZXJ5IHRpbWVcbnZhciBnbG9iYWxMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBzeW1ib2xOYW1lID0gc3ltYm9sTmFtZXNbZXZlbnQudHlwZV07XG4gICAgaWYgKCFzeW1ib2xOYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRhc2tEYXRhcyA9IHRoaXNbc3ltYm9sTmFtZV07XG4gICAgaWYgKCF0YXNrRGF0YXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IFtldmVudF07XG4gICAgaWYgKHRhc2tEYXRhcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gaWYgdGFza0RhdGFzIG9ubHkgaGF2ZSBvbmUgZWxlbWVudCwganVzdCBpbnZva2UgaXRcbiAgICAgICAgdmFyIHRhc2tEYXRhID0gdGFza0RhdGFzWzBdO1xuICAgICAgICBpZiAodGFza0RhdGEuem9uZSAhPT0gWm9uZS5jdXJyZW50KSB7XG4gICAgICAgICAgICAvLyBvbmx5IHVzZSBab25lLnJ1biB3aGVuIFpvbmUuY3VycmVudCBub3QgZXF1YWxzIHRvIHN0b3JlZCB6b25lXG4gICAgICAgICAgICByZXR1cm4gdGFza0RhdGEuem9uZS5ydW4odGFza0RhdGEuaGFuZGxlciwgdGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFza0RhdGEuaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gY29weSB0YXNrcyBhcyBhIHNuYXBzaG90IHRvIGF2b2lkIGV2ZW50IGhhbmRsZXJzIHJlbW92ZVxuICAgICAgICAvLyBpdHNlbGYgb3Igb3RoZXJzXG4gICAgICAgIHZhciBjb3BpZWRUYXNrcyA9IHRhc2tEYXRhcy5zbGljZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllZFRhc2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBpZiBvdGhlciBsaXN0ZW5lciBjYWxsIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvblxuICAgICAgICAgICAgLy8ganVzdCBicmVha1xuICAgICAgICAgICAgaWYgKGV2ZW50W3N0b3BTeW1ib2xdID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGFza0RhdGEgPSBjb3BpZWRUYXNrc1tpXTtcbiAgICAgICAgICAgIGlmICh0YXNrRGF0YS56b25lICE9PSBab25lLmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZSBab25lLnJ1biB3aGVuIFpvbmUuY3VycmVudCBub3QgZXF1YWxzIHRvIHN0b3JlZCB6b25lXG4gICAgICAgICAgICAgICAgdGFza0RhdGEuem9uZS5ydW4odGFza0RhdGEuaGFuZGxlciwgdGhpcywgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrRGF0YS5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcbnZhciBEb21FdmVudHNQbHVnaW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERvbUV2ZW50c1BsdWdpbiwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBEb21FdmVudHNQbHVnaW4oZG9jLCBuZ1pvbmUsIHBsYXRmb3JtSWQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZG9jKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIGlmICghcGxhdGZvcm1JZCB8fCAhaXNQbGF0Zm9ybVNlcnZlcihwbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgX3RoaXMucGF0Y2hFdmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRG9tRXZlbnRzUGx1Z2luLnByb3RvdHlwZS5wYXRjaEV2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIEV2ZW50ID09PSAndW5kZWZpbmVkJyB8fCAhRXZlbnQgfHwgIUV2ZW50LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChFdmVudC5wcm90b3R5cGVbc3RvcE1ldGhvZFN5bWJvbF0pIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgcGF0Y2hlZCBieSB6b25lLmpzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRlbGVnYXRlID0gRXZlbnQucHJvdG90eXBlW3N0b3BNZXRob2RTeW1ib2xdID1cbiAgICAgICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcykge1xuICAgICAgICAgICAgICAgIHRoaXNbc3RvcFN5bWJvbF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc2hvdWxkIGNhbGwgbmF0aXZlIGRlbGVnYXRlIGluIGNhc2VcbiAgICAgICAgICAgIC8vIGluIHNvbWUgZW52aXJvbm1lbnQgcGFydCBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgICAgICAgIC8vIHdpbGwgbm90IHVzZSB0aGUgcGF0Y2hlZCBFdmVudFxuICAgICAgICAgICAgZGVsZWdhdGUgJiYgZGVsZWdhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8vIFRoaXMgcGx1Z2luIHNob3VsZCBjb21lIGxhc3QgaW4gdGhlIGxpc3Qgb2YgcGx1Z2lucywgYmVjYXVzZSBpdCBhY2NlcHRzIGFsbFxuICAgIC8vIGV2ZW50cy5cbiAgICBEb21FdmVudHNQbHVnaW4ucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgICBEb21FdmVudHNQbHVnaW4ucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciB6b25lSnNMb2FkZWQgPSBlbGVtZW50W0FERF9FVkVOVF9MSVNURU5FUl07XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGhhbmRsZXI7XG4gICAgICAgIC8vIGlmIHpvbmVqcyBpcyBsb2FkZWQgYW5kIGN1cnJlbnQgem9uZSBpcyBub3Qgbmdab25lXG4gICAgICAgIC8vIHdlIGtlZXAgWm9uZS5jdXJyZW50IG9uIHRhcmdldCBmb3IgbGF0ZXIgcmVzdG9yYXRpb24uXG4gICAgICAgIGlmICh6b25lSnNMb2FkZWQgJiYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkgfHwgaXNCbGFja0xpc3RlZEV2ZW50KGV2ZW50TmFtZSkpKSB7XG4gICAgICAgICAgICB2YXIgc3ltYm9sTmFtZSA9IHN5bWJvbE5hbWVzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICBpZiAoIXN5bWJvbE5hbWUpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xOYW1lID0gc3ltYm9sTmFtZXNbZXZlbnROYW1lXSA9IF9fc3ltYm9sX18oQU5HVUxBUiArIGV2ZW50TmFtZSArIEZBTFNFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0YXNrRGF0YXMgPSBlbGVtZW50W3N5bWJvbE5hbWVdO1xuICAgICAgICAgICAgdmFyIGdsb2JhbExpc3RlbmVyUmVnaXN0ZXJlZCA9IHRhc2tEYXRhcyAmJiB0YXNrRGF0YXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmICghdGFza0RhdGFzKSB7XG4gICAgICAgICAgICAgICAgdGFza0RhdGFzID0gZWxlbWVudFtzeW1ib2xOYW1lXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHpvbmUgPSBpc0JsYWNrTGlzdGVkRXZlbnQoZXZlbnROYW1lKSA/IFpvbmUucm9vdCA6IFpvbmUuY3VycmVudDtcbiAgICAgICAgICAgIGlmICh0YXNrRGF0YXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGFza0RhdGFzLnB1c2goeyB6b25lOiB6b25lLCBoYW5kbGVyOiBjYWxsYmFjayB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhc2tEYXRhcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFza0RhdGFzW2ldLmhhbmRsZXIgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFja1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFza0RhdGFzLnB1c2goeyB6b25lOiB6b25lLCBoYW5kbGVyOiBjYWxsYmFjayB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWdsb2JhbExpc3RlbmVyUmVnaXN0ZXJlZCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbQUREX0VWRU5UX0xJU1RFTkVSXShldmVudE5hbWUsIGdsb2JhbExpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50W05BVElWRV9BRERfTElTVEVORVJdKGV2ZW50TmFtZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGNhbGxiYWNrKTsgfTtcbiAgICB9O1xuICAgIERvbUV2ZW50c1BsdWdpbi5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHVuZGVybHlpbmdSZW1vdmUgPSB0YXJnZXRbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTtcbiAgICAgICAgLy8gem9uZS5qcyBub3QgbG9hZGVkLCB1c2UgbmF0aXZlIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICAgICAgaWYgKCF1bmRlcmx5aW5nUmVtb3ZlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W05BVElWRV9SRU1PVkVfTElTVEVORVJdLmFwcGx5KHRhcmdldCwgW2V2ZW50TmFtZSwgY2FsbGJhY2ssIGZhbHNlXSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN5bWJvbE5hbWUgPSBzeW1ib2xOYW1lc1tldmVudE5hbWVdO1xuICAgICAgICB2YXIgdGFza0RhdGFzID0gc3ltYm9sTmFtZSAmJiB0YXJnZXRbc3ltYm9sTmFtZV07XG4gICAgICAgIGlmICghdGFza0RhdGFzKSB7XG4gICAgICAgICAgICAvLyBhZGRFdmVudExpc3RlbmVyIG5vdCB1c2luZyBwYXRjaGVkIHZlcnNpb25cbiAgICAgICAgICAgIC8vIGp1c3QgY2FsbCBuYXRpdmUgcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtOQVRJVkVfUkVNT1ZFX0xJU1RFTkVSXS5hcHBseSh0YXJnZXQsIFtldmVudE5hbWUsIGNhbGxiYWNrLCBmYWxzZV0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpeCBpc3N1ZSAyMDUzMiwgc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlXG4gICAgICAgIC8vIGxpc3RlbmVyIHdoaWNoIHdhcyBhZGRlZCBpbnNpZGUgb2Ygbmdab25lXG4gICAgICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhc2tEYXRhcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gdGFza0RhdGFzIGlmIHRoZSBjYWxsYmFjayBlcXVhbHNcbiAgICAgICAgICAgIGlmICh0YXNrRGF0YXNbaV0uaGFuZGxlciA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGFza0RhdGFzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIGlmICh0YXNrRGF0YXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gYWxsIGxpc3RlbmVycyBhcmUgcmVtb3ZlZCwgd2UgY2FuIHJlbW92ZSB0aGUgZ2xvYmFsTGlzdGVuZXIgZnJvbSB0YXJnZXRcbiAgICAgICAgICAgICAgICB1bmRlcmx5aW5nUmVtb3ZlLmFwcGx5KHRhcmdldCwgW2V2ZW50TmFtZSwgZ2xvYmFsTGlzdGVuZXIsIGZhbHNlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBub3QgZm91bmQgaW4gdGFza0RhdGFzLCB0aGUgY2FsbGJhY2sgbWF5IGJlIGFkZGVkIGluc2lkZSBvZiBuZ1pvbmVcbiAgICAgICAgICAgIC8vIHVzZSBuYXRpdmUgcmVtb3ZlIGxpc3RlbmVyIHRvIHJlbW92ZSB0aGUgY2FsbGJhY2tcbiAgICAgICAgICAgIHRhcmdldFtOQVRJVkVfUkVNT1ZFX0xJU1RFTkVSXS5hcHBseSh0YXJnZXQsIFtldmVudE5hbWUsIGNhbGxiYWNrLCBmYWxzZV0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEb21FdmVudHNQbHVnaW4gPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX3BhcmFtKDIsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDIsIEluamVjdChQTEFURk9STV9JRCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdCwgTmdab25lLCBPYmplY3RdKVxuICAgIF0sIERvbUV2ZW50c1BsdWdpbik7XG4gICAgcmV0dXJuIERvbUV2ZW50c1BsdWdpbjtcbn0oRXZlbnRNYW5hZ2VyUGx1Z2luKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogU3VwcG9ydGVkIEhhbW1lckpTIHJlY29nbml6ZXIgZXZlbnQgbmFtZXMuXG4gKi9cbnZhciBFVkVOVF9OQU1FUyA9IHtcbiAgICAvLyBwYW5cbiAgICAncGFuJzogdHJ1ZSxcbiAgICAncGFuc3RhcnQnOiB0cnVlLFxuICAgICdwYW5tb3ZlJzogdHJ1ZSxcbiAgICAncGFuZW5kJzogdHJ1ZSxcbiAgICAncGFuY2FuY2VsJzogdHJ1ZSxcbiAgICAncGFubGVmdCc6IHRydWUsXG4gICAgJ3BhbnJpZ2h0JzogdHJ1ZSxcbiAgICAncGFudXAnOiB0cnVlLFxuICAgICdwYW5kb3duJzogdHJ1ZSxcbiAgICAvLyBwaW5jaFxuICAgICdwaW5jaCc6IHRydWUsXG4gICAgJ3BpbmNoc3RhcnQnOiB0cnVlLFxuICAgICdwaW5jaG1vdmUnOiB0cnVlLFxuICAgICdwaW5jaGVuZCc6IHRydWUsXG4gICAgJ3BpbmNoY2FuY2VsJzogdHJ1ZSxcbiAgICAncGluY2hpbic6IHRydWUsXG4gICAgJ3BpbmNob3V0JzogdHJ1ZSxcbiAgICAvLyBwcmVzc1xuICAgICdwcmVzcyc6IHRydWUsXG4gICAgJ3ByZXNzdXAnOiB0cnVlLFxuICAgIC8vIHJvdGF0ZVxuICAgICdyb3RhdGUnOiB0cnVlLFxuICAgICdyb3RhdGVzdGFydCc6IHRydWUsXG4gICAgJ3JvdGF0ZW1vdmUnOiB0cnVlLFxuICAgICdyb3RhdGVlbmQnOiB0cnVlLFxuICAgICdyb3RhdGVjYW5jZWwnOiB0cnVlLFxuICAgIC8vIHN3aXBlXG4gICAgJ3N3aXBlJzogdHJ1ZSxcbiAgICAnc3dpcGVsZWZ0JzogdHJ1ZSxcbiAgICAnc3dpcGVyaWdodCc6IHRydWUsXG4gICAgJ3N3aXBldXAnOiB0cnVlLFxuICAgICdzd2lwZWRvd24nOiB0cnVlLFxuICAgIC8vIHRhcFxuICAgICd0YXAnOiB0cnVlLFxufTtcbi8qKlxuICogREkgdG9rZW4gZm9yIHByb3ZpZGluZyBbSGFtbWVySlNdKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKSBzdXBwb3J0IHRvIEFuZ3VsYXIuXG4gKiBAc2VlIGBIYW1tZXJHZXN0dXJlQ29uZmlnYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEhBTU1FUl9HRVNUVVJFX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbignSGFtbWVyR2VzdHVyZUNvbmZpZycpO1xuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIGEge0BsaW5rIEhhbW1lckxvYWRlcn0gdG8gQW5ndWxhci5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBIQU1NRVJfTE9BREVSID0gbmV3IEluamVjdGlvblRva2VuKCdIYW1tZXJMb2FkZXInKTtcbi8qKlxuICogQW4gaW5qZWN0YWJsZSBbSGFtbWVySlMgTWFuYWdlcl0oaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvI2hhbW1lci5tYW5hZ2VyKVxuICogZm9yIGdlc3R1cmUgcmVjb2duaXRpb24uIENvbmZpZ3VyZXMgc3BlY2lmaWMgZXZlbnQgcmVjb2duaXRpb24uXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBIYW1tZXJHZXN0dXJlQ29uZmlnID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbW1lckdlc3R1cmVDb25maWcoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIHNldCBvZiBzdXBwb3J0ZWQgZXZlbnQgbmFtZXMgZm9yIGdlc3R1cmVzIHRvIGJlIHVzZWQgaW4gQW5ndWxhci5cbiAgICAgICAgICogQW5ndWxhciBzdXBwb3J0cyBhbGwgYnVpbHQtaW4gcmVjb2duaXplcnMsIGFzIGxpc3RlZCBpblxuICAgICAgICAgKiBbSGFtbWVySlMgZG9jdW1lbnRhdGlvbl0oaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby8pLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICogTWFwcyBnZXN0dXJlIGV2ZW50IG5hbWVzIHRvIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgICAgICAqIHRoYXQgc3BlY2lmeSBvdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBzcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICAgICAgICAqXG4gICAgICAgICogVGhlIGtleSBpcyBhIHN1cHBvcnRlZCBldmVudCBuYW1lIHRvIGJlIGNvbmZpZ3VyZWQsXG4gICAgICAgICogYW5kIHRoZSBvcHRpb25zIG9iamVjdCBjb250YWlucyBhIHNldCBvZiBwcm9wZXJ0aWVzLCB3aXRoIG92ZXJyaWRlIHZhbHVlc1xuICAgICAgICAqIHRvIGJlIGFwcGxpZWQgdG8gdGhlIG5hbWVkIHJlY29nbml6ZXIgZXZlbnQuXG4gICAgICAgICogRm9yIGV4YW1wbGUsIHRvIGRpc2FibGUgcmVjb2duaXRpb24gb2YgdGhlIHJvdGF0ZSBldmVudCwgc3BlY2lmeVxuICAgICAgICAqICBge1wicm90YXRlXCI6IHtcImVuYWJsZVwiOiBmYWxzZX19YC5cbiAgICAgICAgKlxuICAgICAgICAqIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgdGFrZSB0aGUgSGFtbWVySlMgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICAgICogRm9yIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBmb3Igd2hpY2ggZXZlbnRzLFxuICAgICAgICAqIGFuZCB0aGVpciBhbGxvd2VkIGFuZCBkZWZhdWx0IHZhbHVlcywgc2VlXG4gICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS5cbiAgICAgICAgKlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLm92ZXJyaWRlcyA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgW0hhbW1lckpTIE1hbmFnZXJdKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vYXBpLyNoYW1tZXIubWFuYWdlcilcbiAgICAgKiBhbmQgYXR0YWNoZXMgaXQgdG8gYSBnaXZlbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCB3aWxsIHJlY29nbml6ZSBnZXN0dXJlcy5cbiAgICAgKiBAcmV0dXJucyBBIEhhbW1lckpTIGV2ZW50LW1hbmFnZXIgb2JqZWN0LlxuICAgICAqL1xuICAgIEhhbW1lckdlc3R1cmVDb25maWcucHJvdG90eXBlLmJ1aWxkSGFtbWVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG1jID0gbmV3IEhhbW1lcihlbGVtZW50LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBtYy5nZXQoJ3BpbmNoJykuc2V0KHsgZW5hYmxlOiB0cnVlIH0pO1xuICAgICAgICBtYy5nZXQoJ3JvdGF0ZScpLnNldCh7IGVuYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMub3ZlcnJpZGVzKSB7XG4gICAgICAgICAgICBtYy5nZXQoZXZlbnROYW1lKS5zZXQodGhpcy5vdmVycmlkZXNbZXZlbnROYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1jO1xuICAgIH07XG4gICAgSGFtbWVyR2VzdHVyZUNvbmZpZyA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKClcbiAgICBdLCBIYW1tZXJHZXN0dXJlQ29uZmlnKTtcbiAgICByZXR1cm4gSGFtbWVyR2VzdHVyZUNvbmZpZztcbn0oKSk7XG52YXIgSGFtbWVyR2VzdHVyZXNQbHVnaW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEhhbW1lckdlc3R1cmVzUGx1Z2luLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEhhbW1lckdlc3R1cmVzUGx1Z2luKGRvYywgX2NvbmZpZywgY29uc29sZSwgbG9hZGVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRvYykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2NvbmZpZyA9IF9jb25maWc7XG4gICAgICAgIF90aGlzLmNvbnNvbGUgPSBjb25zb2xlO1xuICAgICAgICBfdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4ucHJvdG90eXBlLnN1cHBvcnRzID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoIUVWRU5UX05BTUVTLmhhc093blByb3BlcnR5KGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpKSAmJiAhdGhpcy5pc0N1c3RvbUV2ZW50KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdpbmRvdy5IYW1tZXIgJiYgIXRoaXMubG9hZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnNvbGUud2FybihcIlRoZSBcXFwiXCIgKyBldmVudE5hbWUgKyBcIlxcXCIgZXZlbnQgY2Fubm90IGJlIGJvdW5kIGJlY2F1c2UgSGFtbWVyLkpTIGlzIG5vdCBcIiArXG4gICAgICAgICAgICAgICAgXCJsb2FkZWQgYW5kIG5vIGN1c3RvbSBsb2FkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEhhbW1lckdlc3R1cmVzUGx1Z2luLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgem9uZSA9IHRoaXMubWFuYWdlci5nZXRab25lKCk7XG4gICAgICAgIGV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBJZiBIYW1tZXIgaXMgbm90IHByZXNlbnQgYnV0IGEgbG9hZGVyIGlzIHNwZWNpZmllZCwgd2UgZGVmZXIgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lclxuICAgICAgICAvLyB1bnRpbCBIYW1tZXIgaXMgbG9hZGVkLlxuICAgICAgICBpZiAoIXdpbmRvdy5IYW1tZXIgJiYgdGhpcy5sb2FkZXIpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgYGFkZEV2ZW50TGlzdGVuZXJgIG1ldGhvZCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBhZGRlZCBsaXN0ZW5lci5cbiAgICAgICAgICAgIC8vIFVudGlsIEhhbW1lciBpcyBsb2FkZWQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBuZWVkcyB0byAqY2FuY2VsKiB0aGUgcmVnaXN0cmF0aW9uIHJhdGhlclxuICAgICAgICAgICAgLy8gdGhhbiByZW1vdmUgYW55dGhpbmcuXG4gICAgICAgICAgICB2YXIgY2FuY2VsUmVnaXN0cmF0aW9uXzEgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBkZXJlZ2lzdGVyXzEgPSBmdW5jdGlvbiAoKSB7IGNhbmNlbFJlZ2lzdHJhdGlvbl8xID0gdHJ1ZTsgfTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyKClcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgSGFtbWVyIGlzbid0IGFjdHVhbGx5IGxvYWRlZCB3aGVuIHRoZSBjdXN0b20gbG9hZGVyIHJlc29sdmVzLCBnaXZlIHVwLlxuICAgICAgICAgICAgICAgIGlmICghd2luZG93LkhhbW1lcikge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jb25zb2xlLndhcm4oXCJUaGUgY3VzdG9tIEhBTU1FUl9MT0FERVIgY29tcGxldGVkLCBidXQgSGFtbWVyLkpTIGlzIG5vdCBwcmVzZW50LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3Rlcl8xID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2FuY2VsUmVnaXN0cmF0aW9uXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgSGFtbWVyIGlzIGxvYWRlZCBhbmQgdGhlIGxpc3RlbmVyIGlzIGJlaW5nIGxvYWRlZCBmb3IgcmVhbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIGNoYW5nZXMgZnJvbSBjYW5jZWxpbmcgcmVnaXN0cmF0aW9uIHRvIHJlbW92YWwuXG4gICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXJfMSA9IF90aGlzLmFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29uc29sZS53YXJuKFwiVGhlIFxcXCJcIiArIGV2ZW50TmFtZSArIFwiXFxcIiBldmVudCBjYW5ub3QgYmUgYm91bmQgYmVjYXVzZSB0aGUgY3VzdG9tIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJIYW1tZXIuSlMgbG9hZGVyIGZhaWxlZC5cIik7XG4gICAgICAgICAgICAgICAgZGVyZWdpc3Rlcl8xID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0ICpleGVjdXRlcyogYGRlcmVnaXN0ZXJgIChhbmQgbm90IGBkZXJlZ2lzdGVyYCBpdHNlbGYpIHNvIHRoYXQgd2VcbiAgICAgICAgICAgIC8vIGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGBkZXJlZ2lzdGVyYCBvbmNlIHRoZSBsaXN0ZW5lciBpcyBhZGRlZC4gVXNpbmcgYSBjbG9zdXJlIGluXG4gICAgICAgICAgICAvLyB0aGlzIHdheSBhbGxvd3MgdXMgdG8gYXZvaWQgYW55IGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHRyYWNrIGxpc3RlbmVyIHJlbW92YWwuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkZXJlZ2lzdGVyXzEoKTsgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGluZyB0aGUgbWFuYWdlciBiaW5kIGV2ZW50cywgbXVzdCBiZSBkb25lIG91dHNpZGUgb2YgYW5ndWxhclxuICAgICAgICAgICAgdmFyIG1jID0gX3RoaXMuX2NvbmZpZy5idWlsZEhhbW1lcihlbGVtZW50KTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudE9iaikge1xuICAgICAgICAgICAgICAgIHpvbmUucnVuR3VhcmRlZChmdW5jdGlvbiAoKSB7IGhhbmRsZXIoZXZlbnRPYmopOyB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtYy5vbihldmVudE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbWMub2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgbWMgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWMuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBtYy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBIYW1tZXJHZXN0dXJlc1BsdWdpbi5wcm90b3R5cGUuaXNDdXN0b21FdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsgcmV0dXJuIHRoaXMuX2NvbmZpZy5ldmVudHMuaW5kZXhPZihldmVudE5hbWUpID4gLTE7IH07XG4gICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4gPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX3BhcmFtKDEsIEluamVjdChIQU1NRVJfR0VTVFVSRV9DT05GSUcpKSxcbiAgICAgICAgX19wYXJhbSgzLCBPcHRpb25hbCgpKSwgX19wYXJhbSgzLCBJbmplY3QoSEFNTUVSX0xPQURFUikpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdCwgSGFtbWVyR2VzdHVyZUNvbmZpZywgybVDb25zb2xlLCBPYmplY3RdKVxuICAgIF0sIEhhbW1lckdlc3R1cmVzUGx1Z2luKTtcbiAgICByZXR1cm4gSGFtbWVyR2VzdHVyZXNQbHVnaW47XG59KEV2ZW50TWFuYWdlclBsdWdpbikpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIERlZmluZXMgc3VwcG9ydGVkIG1vZGlmaWVycyBmb3Iga2V5IGV2ZW50cy5cbiAqL1xudmFyIE1PRElGSUVSX0tFWVMgPSBbJ2FsdCcsICdjb250cm9sJywgJ21ldGEnLCAnc2hpZnQnXTtcbnZhciDJtTAkNCA9IGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gZXZlbnQuYWx0S2V5OyB9LCDJtTEkMSA9IGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gZXZlbnQuY3RybEtleTsgfSwgybUyID0gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBldmVudC5tZXRhS2V5OyB9LCDJtTMgPSBmdW5jdGlvbiAoZXZlbnQpIHsgcmV0dXJuIGV2ZW50LnNoaWZ0S2V5OyB9O1xuLyoqXG4gKiBSZXRyaWV2ZXMgbW9kaWZpZXJzIGZyb20ga2V5LWV2ZW50IG9iamVjdHMuXG4gKi9cbnZhciBNT0RJRklFUl9LRVlfR0VUVEVSUyA9IHtcbiAgICAnYWx0JzogybUwJDQsXG4gICAgJ2NvbnRyb2wnOiDJtTEkMSxcbiAgICAnbWV0YSc6IMm1MixcbiAgICAnc2hpZnQnOiDJtTNcbn07XG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqIEEgYnJvd3NlciBwbHVnLWluIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgaGFuZGxpbmcgb2Yga2V5IGV2ZW50cyBpbiBBbmd1bGFyLlxuICovXG52YXIgS2V5RXZlbnRzUGx1Z2luID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhLZXlFdmVudHNQbHVnaW4sIF9zdXBlcik7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGJyb3dzZXIgcGx1Zy1pbi5cbiAgICAgKiBAcGFyYW0gZG9jIFRoZSBkb2N1bWVudCBpbiB3aGljaCBrZXkgZXZlbnRzIHdpbGwgYmUgZGV0ZWN0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gS2V5RXZlbnRzUGx1Z2luKGRvYykge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgZG9jKSB8fCB0aGlzO1xuICAgIH1cbiAgICBLZXlFdmVudHNQbHVnaW5fMSA9IEtleUV2ZW50c1BsdWdpbjtcbiAgICAvKipcbiAgICAgICogUmVwb3J0cyB3aGV0aGVyIGEgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAgICAgICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBxdWVyeS5cbiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBuYW1lZCBrZXkgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIEtleUV2ZW50c1BsdWdpbi5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7IHJldHVybiBLZXlFdmVudHNQbHVnaW5fMS5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpICE9IG51bGw7IH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCBrZXkgZXZlbnQuXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMuXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUga2V5IGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnMuIFJlY2VpdmVzIHRoZVxuICAgICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC5cbiAgICAgKiBAcmV0dXJucyBUaGUga2V5IGV2ZW50IHRoYXQgd2FzIHJlZ2lzdGVyZWQuXG4gICAgKi9cbiAgICBLZXlFdmVudHNQbHVnaW4ucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHZhciBwYXJzZWRFdmVudCA9IEtleUV2ZW50c1BsdWdpbl8xLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgICAgIHZhciBvdXRzaWRlSGFuZGxlciA9IEtleUV2ZW50c1BsdWdpbl8xLmV2ZW50Q2FsbGJhY2socGFyc2VkRXZlbnRbJ2Z1bGxLZXknXSwgaGFuZGxlciwgdGhpcy5tYW5hZ2VyLmdldFpvbmUoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRET00oKS5vbkFuZENhbmNlbChlbGVtZW50LCBwYXJzZWRFdmVudFsnZG9tRXZlbnROYW1lJ10sIG91dHNpZGVIYW5kbGVyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBLZXlFdmVudHNQbHVnaW4ucGFyc2VFdmVudE5hbWUgPSBmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCcuJyk7XG4gICAgICAgIHZhciBkb21FdmVudE5hbWUgPSBwYXJ0cy5zaGlmdCgpO1xuICAgICAgICBpZiAoKHBhcnRzLmxlbmd0aCA9PT0gMCkgfHwgIShkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5ID0gS2V5RXZlbnRzUGx1Z2luXzEuX25vcm1hbGl6ZUtleShwYXJ0cy5wb3AoKSk7XG4gICAgICAgIHZhciBmdWxsS2V5ID0gJyc7XG4gICAgICAgIE1PRElGSUVSX0tFWVMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXJOYW1lKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJ0cy5pbmRleE9mKG1vZGlmaWVyTmFtZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgZnVsbEtleSArPSBtb2RpZmllck5hbWUgKyAnLic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmdWxsS2V5ICs9IGtleTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAwIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIHJldHVybmluZyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IGFub3RoZXIgcGx1Z2luIHByb2Nlc3MgdGhlIGV2ZW50XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdFsnZG9tRXZlbnROYW1lJ10gPSBkb21FdmVudE5hbWU7XG4gICAgICAgIHJlc3VsdFsnZnVsbEtleSddID0gZnVsbEtleTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIGZ1bGxLZXkgPSAnJztcbiAgICAgICAgdmFyIGtleSA9IGdldERPTSgpLmdldEV2ZW50S2V5KGV2ZW50KTtcbiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrZXkgPT09ICcgJykge1xuICAgICAgICAgICAga2V5ID0gJ3NwYWNlJzsgLy8gZm9yIHJlYWRhYmlsaXR5XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAnLicpIHtcbiAgICAgICAgICAgIGtleSA9ICdkb3QnOyAvLyBiZWNhdXNlICcuJyBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yIGluIGV2ZW50IG5hbWVzXG4gICAgICAgIH1cbiAgICAgICAgTU9ESUZJRVJfS0VZUy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllck5hbWUpIHtcbiAgICAgICAgICAgIGlmIChtb2RpZmllck5hbWUgIT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgdmFyIG1vZGlmaWVyR2V0dGVyID0gTU9ESUZJRVJfS0VZX0dFVFRFUlNbbW9kaWZpZXJOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXJHZXR0ZXIoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxLZXkgKz0gbW9kaWZpZXJOYW1lICsgJy4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZ1bGxLZXkgKz0ga2V5O1xuICAgICAgICByZXR1cm4gZnVsbEtleTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgYSBoYW5kbGVyIGNhbGxiYWNrIGZvciBhIGtleSBldmVudC5cbiAgICAgKiBAcGFyYW0gZnVsbEtleSBUaGUgZXZlbnQgbmFtZSB0aGF0IGNvbWJpbmVzIGFsbCBzaW11bHRhbmVvdXMga2V5c3Ryb2tlcy5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgZnVuY3Rpb24gdGhhdCByZXNwb25kcyB0byB0aGUga2V5IGV2ZW50LlxuICAgICAqIEBwYXJhbSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRoZSBldmVudCBvY2N1cnJlZC5cbiAgICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIEtleUV2ZW50c1BsdWdpbi5ldmVudENhbGxiYWNrID0gZnVuY3Rpb24gKGZ1bGxLZXksIGhhbmRsZXIsIHpvbmUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCAvKiogVE9ETyAjOTEwMCAqLykge1xuICAgICAgICAgICAgaWYgKEtleUV2ZW50c1BsdWdpbl8xLmdldEV2ZW50RnVsbEtleShldmVudCkgPT09IGZ1bGxLZXkpIHtcbiAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gaGFuZGxlcihldmVudCk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEtleUV2ZW50c1BsdWdpbi5fbm9ybWFsaXplS2V5ID0gZnVuY3Rpb24gKGtleU5hbWUpIHtcbiAgICAgICAgLy8gVE9ETzogc3dpdGNoIHRvIGEgTWFwIGlmIHRoZSBtYXBwaW5nIGdyb3dzIHRvbyBtdWNoXG4gICAgICAgIHN3aXRjaCAoa2V5TmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnZXNjJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2VzY2FwZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBrZXlOYW1lO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgS2V5RXZlbnRzUGx1Z2luXzE7XG4gICAgS2V5RXZlbnRzUGx1Z2luID0gS2V5RXZlbnRzUGx1Z2luXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgS2V5RXZlbnRzUGx1Z2luKTtcbiAgICByZXR1cm4gS2V5RXZlbnRzUGx1Z2luO1xufShFdmVudE1hbmFnZXJQbHVnaW4pKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBEb21TYW5pdGl6ZXIgaGVscHMgcHJldmVudGluZyBDcm9zcyBTaXRlIFNjcmlwdGluZyBTZWN1cml0eSBidWdzIChYU1MpIGJ5IHNhbml0aXppbmdcbiAqIHZhbHVlcyB0byBiZSBzYWZlIHRvIHVzZSBpbiB0aGUgZGlmZmVyZW50IERPTSBjb250ZXh0cy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgd2hlbiBiaW5kaW5nIGEgVVJMIGluIGFuIGA8YSBbaHJlZl09XCJzb21lVmFsdWVcIj5gIGh5cGVybGluaywgYHNvbWVWYWx1ZWAgd2lsbCBiZVxuICogc2FuaXRpemVkIHNvIHRoYXQgYW4gYXR0YWNrZXIgY2Fubm90IGluamVjdCBlLmcuIGEgYGphdmFzY3JpcHQ6YCBVUkwgdGhhdCB3b3VsZCBleGVjdXRlIGNvZGUgb25cbiAqIHRoZSB3ZWJzaXRlLlxuICpcbiAqIEluIHNwZWNpZmljIHNpdHVhdGlvbnMsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHNhbml0aXphdGlvbiwgZm9yIGV4YW1wbGUgaWYgdGhlXG4gKiBhcHBsaWNhdGlvbiBnZW51aW5lbHkgbmVlZHMgdG8gcHJvZHVjZSBhIGBqYXZhc2NyaXB0OmAgc3R5bGUgbGluayB3aXRoIGEgZHluYW1pYyB2YWx1ZSBpbiBpdC5cbiAqIFVzZXJzIGNhbiBieXBhc3Mgc2VjdXJpdHkgYnkgY29uc3RydWN0aW5nIGEgdmFsdWUgd2l0aCBvbmUgb2YgdGhlIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYFxuICogbWV0aG9kcywgYW5kIHRoZW4gYmluZGluZyB0byB0aGF0IHZhbHVlIGZyb20gdGhlIHRlbXBsYXRlLlxuICpcbiAqIFRoZXNlIHNpdHVhdGlvbnMgc2hvdWxkIGJlIHZlcnkgcmFyZSwgYW5kIGV4dHJhb3JkaW5hcnkgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGNyZWF0aW5nIGFcbiAqIENyb3NzIFNpdGUgU2NyaXB0aW5nIChYU1MpIHNlY3VyaXR5IGJ1ZyFcbiAqXG4gKiBXaGVuIHVzaW5nIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYCwgbWFrZSBzdXJlIHRvIGNhbGwgdGhlIG1ldGhvZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBhbmQgYXNcbiAqIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIHZhbHVlLCB0byBtYWtlIGl0IGVhc3kgdG8gdmVyaWZ5IG5vIHNlY3VyaXR5IGJ1ZyBpc1xuICogY3JlYXRlZCBieSBpdHMgdXNlLlxuICpcbiAqIEl0IGlzIG5vdCByZXF1aXJlZCAoYW5kIG5vdCByZWNvbW1lbmRlZCkgdG8gYnlwYXNzIHNlY3VyaXR5IGlmIHRoZSB2YWx1ZSBpcyBzYWZlLCBlLmcuIGEgVVJMIHRoYXRcbiAqIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBzdXNwaWNpb3VzIHByb3RvY29sLCBvciBhbiBIVE1MIHNuaXBwZXQgdGhhdCBkb2VzIG5vdCBjb250YWluIGRhbmdlcm91c1xuICogY29kZS4gVGhlIHNhbml0aXplciBsZWF2ZXMgc2FmZSB2YWx1ZXMgaW50YWN0LlxuICpcbiAqIEBzZWN1cml0eSBDYWxsaW5nIGFueSBvZiB0aGUgYGJ5cGFzc1NlY3VyaXR5VHJ1c3QuLi5gIEFQSXMgZGlzYWJsZXMgQW5ndWxhcidzIGJ1aWx0LWluXG4gKiBzYW5pdGl6YXRpb24gZm9yIHRoZSB2YWx1ZSBwYXNzZWQgaW4uIENhcmVmdWxseSBjaGVjayBhbmQgYXVkaXQgYWxsIHZhbHVlcyBhbmQgY29kZSBwYXRocyBnb2luZ1xuICogaW50byB0aGlzIGNhbGwuIE1ha2Ugc3VyZSBhbnkgdXNlciBkYXRhIGlzIGFwcHJvcHJpYXRlbHkgZXNjYXBlZCBmb3IgdGhpcyBzZWN1cml0eSBjb250ZXh0LlxuICogRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlIFtTZWN1cml0eSBHdWlkZV0oaHR0cDovL2cuY28vbmcvc2VjdXJpdHkpLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERvbVNhbml0aXplciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEb21TYW5pdGl6ZXIoKSB7XG4gICAgfVxuICAgIHJldHVybiBEb21TYW5pdGl6ZXI7XG59KCkpO1xudmFyIERvbVNhbml0aXplckltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKERvbVNhbml0aXplckltcGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRG9tU2FuaXRpemVySW1wbChfZG9jKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9kb2MgPSBfZG9jO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLnNhbml0aXplID0gZnVuY3Rpb24gKGN0eCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgc3dpdGNoIChjdHgpIHtcbiAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0Lk5PTkU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuSFRNTDpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTYWZlSHRtbEltcGwpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tOb3RTYWZlVmFsdWUodmFsdWUsICdIVE1MJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIMm1X3Nhbml0aXplSHRtbCh0aGlzLl9kb2MsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuU1RZTEU6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2FmZVN0eWxlSW1wbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja05vdFNhZmVWYWx1ZSh2YWx1ZSwgJ1N0eWxlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIMm1X3Nhbml0aXplU3R5bGUodmFsdWUpO1xuICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuU0NSSVBUOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNhZmVTY3JpcHRJbXBsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTm90U2FmZVZhbHVlKHZhbHVlLCAnU2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Jyk7XG4gICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5VUkw6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2FmZVJlc291cmNlVXJsSW1wbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNhZmVVcmxJbXBsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHJlc291cmNlIFVSTHMgaW4gVVJMIGNvbnRleHRzLCB0aGV5IGFyZSBzdHJpY3RseSBtb3JlIHRydXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTm90U2FmZVZhbHVlKHZhbHVlLCAnVVJMJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIMm1X3Nhbml0aXplVXJsKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNhZmVSZXNvdXJjZVVybEltcGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tOb3RTYWZlVmFsdWUodmFsdWUsICdSZXNvdXJjZVVSTCcpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zYWZlIHZhbHVlIHVzZWQgaW4gYSByZXNvdXJjZSBVUkwgY29udGV4dCAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcyknKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBTZWN1cml0eUNvbnRleHQgXCIgKyBjdHggKyBcIiAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmNoZWNrTm90U2FmZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2FmZVZhbHVlSW1wbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVxdWlyZWQgYSBzYWZlIFwiICsgZXhwZWN0ZWRUeXBlICsgXCIsIGdvdCBhIFwiICsgdmFsdWUuZ2V0VHlwZU5hbWUoKSArIFwiIFwiICtcbiAgICAgICAgICAgICAgICBcIihzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKVwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRG9tU2FuaXRpemVySW1wbC5wcm90b3R5cGUuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBTYWZlSHRtbEltcGwodmFsdWUpOyB9O1xuICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFNhZmVTdHlsZUltcGwodmFsdWUpOyB9O1xuICAgIERvbVNhbml0aXplckltcGwucHJvdG90eXBlLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIG5ldyBTYWZlU2NyaXB0SW1wbCh2YWx1ZSk7IH07XG4gICAgRG9tU2FuaXRpemVySW1wbC5wcm90b3R5cGUuYnlwYXNzU2VjdXJpdHlUcnVzdFVybCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gbmV3IFNhZmVVcmxJbXBsKHZhbHVlKTsgfTtcbiAgICBEb21TYW5pdGl6ZXJJbXBsLnByb3RvdHlwZS5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTYWZlUmVzb3VyY2VVcmxJbXBsKHZhbHVlKTtcbiAgICB9O1xuICAgIERvbVNhbml0aXplckltcGwgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgRG9tU2FuaXRpemVySW1wbCk7XG4gICAgcmV0dXJuIERvbVNhbml0aXplckltcGw7XG59KERvbVNhbml0aXplcikpO1xudmFyIFNhZmVWYWx1ZUltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2FmZVZhbHVlSW1wbChjaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5KSB7XG4gICAgICAgIHRoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSA9IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7XG4gICAgICAgIC8vIGVtcHR5XG4gICAgfVxuICAgIFNhZmVWYWx1ZUltcGwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJTYWZlVmFsdWUgbXVzdCB1c2UgW3Byb3BlcnR5XT1iaW5kaW5nOiBcIiArIHRoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSArXG4gICAgICAgICAgICBcIiAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylcIjtcbiAgICB9O1xuICAgIHJldHVybiBTYWZlVmFsdWVJbXBsO1xufSgpKTtcbnZhciBTYWZlSHRtbEltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFNhZmVIdG1sSW1wbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYWZlSHRtbEltcGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgU2FmZUh0bWxJbXBsLnByb3RvdHlwZS5nZXRUeXBlTmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdIVE1MJzsgfTtcbiAgICByZXR1cm4gU2FmZUh0bWxJbXBsO1xufShTYWZlVmFsdWVJbXBsKSk7XG52YXIgU2FmZVN0eWxlSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZVN0eWxlSW1wbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYWZlU3R5bGVJbXBsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFNhZmVTdHlsZUltcGwucHJvdG90eXBlLmdldFR5cGVOYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1N0eWxlJzsgfTtcbiAgICByZXR1cm4gU2FmZVN0eWxlSW1wbDtcbn0oU2FmZVZhbHVlSW1wbCkpO1xudmFyIFNhZmVTY3JpcHRJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhTYWZlU2NyaXB0SW1wbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYWZlU2NyaXB0SW1wbCgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICBTYWZlU2NyaXB0SW1wbC5wcm90b3R5cGUuZ2V0VHlwZU5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnU2NyaXB0JzsgfTtcbiAgICByZXR1cm4gU2FmZVNjcmlwdEltcGw7XG59KFNhZmVWYWx1ZUltcGwpKTtcbnZhciBTYWZlVXJsSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZVVybEltcGwsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gU2FmZVVybEltcGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgU2FmZVVybEltcGwucHJvdG90eXBlLmdldFR5cGVOYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1VSTCc7IH07XG4gICAgcmV0dXJuIFNhZmVVcmxJbXBsO1xufShTYWZlVmFsdWVJbXBsKSk7XG52YXIgU2FmZVJlc291cmNlVXJsSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoU2FmZVJlc291cmNlVXJsSW1wbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBTYWZlUmVzb3VyY2VVcmxJbXBsKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIFNhZmVSZXNvdXJjZVVybEltcGwucHJvdG90eXBlLmdldFR5cGVOYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1Jlc291cmNlVVJMJzsgfTtcbiAgICByZXR1cm4gU2FmZVJlc291cmNlVXJsSW1wbDtcbn0oU2FmZVZhbHVlSW1wbCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgybUwJDUgPSDJtVBMQVRGT1JNX0JST1dTRVJfSUQ7XG52YXIgSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlMgPSBbXG4gICAgeyBwcm92aWRlOiBQTEFURk9STV9JRCwgdXNlVmFsdWU6IMm1MCQ1IH0sXG4gICAgeyBwcm92aWRlOiBQTEFURk9STV9JTklUSUFMSVpFUiwgdXNlVmFsdWU6IGluaXREb21BZGFwdGVyLCBtdWx0aTogdHJ1ZSB9LFxuICAgIHsgcHJvdmlkZTogUGxhdGZvcm1Mb2NhdGlvbiwgdXNlQ2xhc3M6IEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLCBkZXBzOiBbRE9DVU1FTlRdIH0sXG4gICAgeyBwcm92aWRlOiBET0NVTUVOVCwgdXNlRmFjdG9yeTogX2RvY3VtZW50LCBkZXBzOiBbXSB9LFxuXTtcbi8qKlxuICogQHNlY3VyaXR5IFJlcGxhY2luZyBidWlsdC1pbiBzYW5pdGl6YXRpb24gcHJvdmlkZXJzIGV4cG9zZXMgdGhlIGFwcGxpY2F0aW9uIHRvIFhTUyByaXNrcy5cbiAqIEF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSBpbnRyb2R1Y2VkIGJ5IGFuIHVuc2FuaXRpemVkIHByb3ZpZGVyIGNvdWxkIGV4cG9zZSB5b3VyXG4gKiBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuIEZvciBtb3JlIGRldGFpbCwgc2VlIHRoZSBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS5cbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUyA9IFtcbiAgICB7IHByb3ZpZGU6IFNhbml0aXplciwgdXNlRXhpc3Rpbmc6IERvbVNhbml0aXplciB9LFxuICAgIHsgcHJvdmlkZTogRG9tU2FuaXRpemVyLCB1c2VDbGFzczogRG9tU2FuaXRpemVySW1wbCwgZGVwczogW0RPQ1VNRU5UXSB9LFxuXTtcbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgcGxhdGZvcm1Ccm93c2VyID0gY3JlYXRlUGxhdGZvcm1GYWN0b3J5KHBsYXRmb3JtQ29yZSwgJ2Jyb3dzZXInLCBJTlRFUk5BTF9CUk9XU0VSX1BMQVRGT1JNX1BST1ZJREVSUyk7XG5mdW5jdGlvbiBpbml0RG9tQWRhcHRlcigpIHtcbiAgICBCcm93c2VyRG9tQWRhcHRlci5tYWtlQ3VycmVudCgpO1xuICAgIEJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0KCk7XG59XG5mdW5jdGlvbiBlcnJvckhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvckhhbmRsZXIoKTtcbn1cbmZ1bmN0aW9uIF9kb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQ7XG59XG52YXIgQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTID0gW1xuICAgIEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUyxcbiAgICB7IHByb3ZpZGU6IMm1QVBQX1JPT1QsIHVzZVZhbHVlOiB0cnVlIH0sXG4gICAgeyBwcm92aWRlOiBFcnJvckhhbmRsZXIsIHVzZUZhY3Rvcnk6IGVycm9ySGFuZGxlciwgZGVwczogW10gfSxcbiAgICB7XG4gICAgICAgIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgICAgICAgdXNlQ2xhc3M6IERvbUV2ZW50c1BsdWdpbixcbiAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIGRlcHM6IFtET0NVTUVOVCwgTmdab25lLCBQTEFURk9STV9JRF1cbiAgICB9LFxuICAgIHsgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB1c2VDbGFzczogS2V5RXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZSwgZGVwczogW0RPQ1VNRU5UXSB9LFxuICAgIHtcbiAgICAgICAgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLFxuICAgICAgICB1c2VDbGFzczogSGFtbWVyR2VzdHVyZXNQbHVnaW4sXG4gICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICBkZXBzOiBbRE9DVU1FTlQsIEhBTU1FUl9HRVNUVVJFX0NPTkZJRywgybVDb25zb2xlLCBbbmV3IE9wdGlvbmFsKCksIEhBTU1FUl9MT0FERVJdXVxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBIQU1NRVJfR0VTVFVSRV9DT05GSUcsIHVzZUNsYXNzOiBIYW1tZXJHZXN0dXJlQ29uZmlnLCBkZXBzOiBbXSB9LFxuICAgIHtcbiAgICAgICAgcHJvdmlkZTogRG9tUmVuZGVyZXJGYWN0b3J5MixcbiAgICAgICAgdXNlQ2xhc3M6IERvbVJlbmRlcmVyRmFjdG9yeTIsXG4gICAgICAgIGRlcHM6IFtFdmVudE1hbmFnZXIsIERvbVNoYXJlZFN0eWxlc0hvc3QsIEFQUF9JRF1cbiAgICB9LFxuICAgIHsgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwgdXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyRmFjdG9yeTIgfSxcbiAgICB7IHByb3ZpZGU6IFNoYXJlZFN0eWxlc0hvc3QsIHVzZUV4aXN0aW5nOiBEb21TaGFyZWRTdHlsZXNIb3N0IH0sXG4gICAgeyBwcm92aWRlOiBEb21TaGFyZWRTdHlsZXNIb3N0LCB1c2VDbGFzczogRG9tU2hhcmVkU3R5bGVzSG9zdCwgZGVwczogW0RPQ1VNRU5UXSB9LFxuICAgIHsgcHJvdmlkZTogVGVzdGFiaWxpdHksIHVzZUNsYXNzOiBUZXN0YWJpbGl0eSwgZGVwczogW05nWm9uZV0gfSxcbiAgICB7IHByb3ZpZGU6IEV2ZW50TWFuYWdlciwgdXNlQ2xhc3M6IEV2ZW50TWFuYWdlciwgZGVwczogW0VWRU5UX01BTkFHRVJfUExVR0lOUywgTmdab25lXSB9LFxuICAgIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLFxuXTtcbi8qKlxuICogRXhwb3J0cyByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBmb3IgYWxsIEFuZ3VsYXIgYXBwcy5cbiAqIEluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYWxsIEFuZ3VsYXIgYXBwcyBjcmVhdGVkIHdpdGggdGhlIENMSVxuICogYG5ld2AgY29tbWFuZC5cbiAqIFJlLWV4cG9ydHMgYENvbW1vbk1vZHVsZWAgYW5kIGBBcHBsaWNhdGlvbk1vZHVsZWAsIG1ha2luZyB0aGVpclxuICogZXhwb3J0cyBhbmQgcHJvdmlkZXJzIGF2YWlsYWJsZSB0byBhbGwgYXBwcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBCcm93c2VyTW9kdWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJyb3dzZXJNb2R1bGUocGFyZW50TW9kdWxlKSB7XG4gICAgICAgIGlmIChwYXJlbnRNb2R1bGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJyb3dzZXJNb2R1bGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuIElmIHlvdSBuZWVkIGFjY2VzcyB0byBjb21tb24gZGlyZWN0aXZlcyBzdWNoIGFzIE5nSWYgYW5kIE5nRm9yIGZyb20gYSBsYXp5IGxvYWRlZCBtb2R1bGUsIGltcG9ydCBDb21tb25Nb2R1bGUgaW5zdGVhZC5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQnJvd3Nlck1vZHVsZV8xID0gQnJvd3Nlck1vZHVsZTtcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIGEgYnJvd3Nlci1iYXNlZCBhcHAgdG8gdHJhbnNpdGlvbiBmcm9tIGEgc2VydmVyLXJlbmRlcmVkIGFwcCwgaWZcbiAgICAgKiBvbmUgaXMgcHJlc2VudCBvbiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gaWRlbnRpZmllciBmb3IgdGhlIGFwcCB0byB0cmFuc2l0aW9uLlxuICAgICAqIFRoZSBJRCBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIG9mIHRoZSBhcHAuXG4gICAgICogQHJldHVybnMgVGhlIHJlY29uZmlndXJlZCBgQnJvd3Nlck1vZHVsZWAgdG8gaW1wb3J0IGludG8gdGhlIGFwcCdzIHJvb3QgYEFwcE1vZHVsZWAuXG4gICAgICovXG4gICAgQnJvd3Nlck1vZHVsZS53aXRoU2VydmVyVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBCcm93c2VyTW9kdWxlXzEsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEFQUF9JRCwgdXNlVmFsdWU6IHBhcmFtcy5hcHBJZCB9LFxuICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogVFJBTlNJVElPTl9JRCwgdXNlRXhpc3Rpbmc6IEFQUF9JRCB9LFxuICAgICAgICAgICAgICAgIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgQnJvd3Nlck1vZHVsZV8xO1xuICAgIEJyb3dzZXJNb2R1bGUgPSBCcm93c2VyTW9kdWxlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgTmdNb2R1bGUoeyBwcm92aWRlcnM6IEJST1dTRVJfTU9EVUxFX1BST1ZJREVSUywgZXhwb3J0czogW0NvbW1vbk1vZHVsZSwgQXBwbGljYXRpb25Nb2R1bGVdIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDAsIFNraXBTZWxmKCkpLCBfX3BhcmFtKDAsIEluamVjdChCcm93c2VyTW9kdWxlXzEpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIEJyb3dzZXJNb2R1bGUpO1xuICAgIHJldHVybiBCcm93c2VyTW9kdWxlO1xufSgpKTtcblxuLyoqXG4gKiBGYWN0b3J5IHRvIGNyZWF0ZSBNZXRhIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGEoKSB7XG4gICAgcmV0dXJuIG5ldyBNZXRhKMm1ybVpbmplY3QoRE9DVU1FTlQpKTtcbn1cbi8qKlxuICogQSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGFuZCBhZGQgbWV0YSB0YWdzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE1ldGEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWV0YShfZG9jKSB7XG4gICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7XG4gICAgICAgIHRoaXMuX2RvbSA9IGdldERPTSgpO1xuICAgIH1cbiAgICBNZXRhLnByb3RvdHlwZS5hZGRUYWcgPSBmdW5jdGlvbiAodGFnLCBmb3JjZUNyZWF0aW9uKSB7XG4gICAgICAgIGlmIChmb3JjZUNyZWF0aW9uID09PSB2b2lkIDApIHsgZm9yY2VDcmVhdGlvbiA9IGZhbHNlOyB9XG4gICAgICAgIGlmICghdGFnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodGFnLCBmb3JjZUNyZWF0aW9uKTtcbiAgICB9O1xuICAgIE1ldGEucHJvdG90eXBlLmFkZFRhZ3MgPSBmdW5jdGlvbiAodGFncywgZm9yY2VDcmVhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoZm9yY2VDcmVhdGlvbiA9PT0gdm9pZCAwKSB7IGZvcmNlQ3JlYXRpb24gPSBmYWxzZTsgfVxuICAgICAgICBpZiAoIXRhZ3MpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0YWdzLnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCB0YWcpIHtcbiAgICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChfdGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHRhZywgZm9yY2VDcmVhdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwgW10pO1xuICAgIH07XG4gICAgTWV0YS5wcm90b3R5cGUuZ2V0VGFnID0gZnVuY3Rpb24gKGF0dHJTZWxlY3Rvcikge1xuICAgICAgICBpZiAoIWF0dHJTZWxlY3RvcilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9tLnF1ZXJ5U2VsZWN0b3IodGhpcy5fZG9jLCBcIm1ldGFbXCIgKyBhdHRyU2VsZWN0b3IgKyBcIl1cIikgfHwgbnVsbDtcbiAgICB9O1xuICAgIE1ldGEucHJvdG90eXBlLmdldFRhZ3MgPSBmdW5jdGlvbiAoYXR0clNlbGVjdG9yKSB7XG4gICAgICAgIGlmICghYXR0clNlbGVjdG9yKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB2YXIgbGlzdCAvKk5vZGVMaXN0Ki8gPSB0aGlzLl9kb20ucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9kb2MsIFwibWV0YVtcIiArIGF0dHJTZWxlY3RvciArIFwiXVwiKTtcbiAgICAgICAgcmV0dXJuIGxpc3QgPyBbXS5zbGljZS5jYWxsKGxpc3QpIDogW107XG4gICAgfTtcbiAgICBNZXRhLnByb3RvdHlwZS51cGRhdGVUYWcgPSBmdW5jdGlvbiAodGFnLCBzZWxlY3Rvcikge1xuICAgICAgICBpZiAoIXRhZylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yIHx8IHRoaXMuX3BhcnNlU2VsZWN0b3IodGFnKTtcbiAgICAgICAgdmFyIG1ldGEgPSB0aGlzLmdldFRhZyhzZWxlY3Rvcik7XG4gICAgICAgIGlmIChtZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHRhZywgbWV0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0YWcsIHRydWUpO1xuICAgIH07XG4gICAgTWV0YS5wcm90b3R5cGUucmVtb3ZlVGFnID0gZnVuY3Rpb24gKGF0dHJTZWxlY3RvcikgeyB0aGlzLnJlbW92ZVRhZ0VsZW1lbnQodGhpcy5nZXRUYWcoYXR0clNlbGVjdG9yKSk7IH07XG4gICAgTWV0YS5wcm90b3R5cGUucmVtb3ZlVGFnRWxlbWVudCA9IGZ1bmN0aW9uIChtZXRhKSB7XG4gICAgICAgIGlmIChtZXRhKSB7XG4gICAgICAgICAgICB0aGlzLl9kb20ucmVtb3ZlKG1ldGEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBNZXRhLnByb3RvdHlwZS5fZ2V0T3JDcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKG1ldGEsIGZvcmNlQ3JlYXRpb24pIHtcbiAgICAgICAgaWYgKGZvcmNlQ3JlYXRpb24gPT09IHZvaWQgMCkgeyBmb3JjZUNyZWF0aW9uID0gZmFsc2U7IH1cbiAgICAgICAgaWYgKCFmb3JjZUNyZWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLl9wYXJzZVNlbGVjdG9yKG1ldGEpO1xuICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzLmdldFRhZyhzZWxlY3Rvcik7XG4gICAgICAgICAgICAvLyBJdCdzIGFsbG93ZWQgdG8gaGF2ZSBtdWx0aXBsZSBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgc28gaXQncyBub3QgZW5vdWdoIHRvXG4gICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHRoYXQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBwYWdlLiBXZSBhbHNvIG5lZWQgdG9cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgaGFzIHRhZyBhdHRyaWJ1dGVzXG4gICAgICAgICAgICBpZiAoZWxlbSAmJiB0aGlzLl9jb250YWluc0F0dHJpYnV0ZXMobWV0YSwgZWxlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9kb20uY3JlYXRlRWxlbWVudCgnbWV0YScpO1xuICAgICAgICB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXMobWV0YSwgZWxlbWVudCk7XG4gICAgICAgIHZhciBoZWFkID0gdGhpcy5fZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRoaXMuX2RvYywgJ2hlYWQnKVswXTtcbiAgICAgICAgdGhpcy5fZG9tLmFwcGVuZENoaWxkKGhlYWQsIGVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuICAgIE1ldGEucHJvdG90eXBlLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAodGFnLCBlbCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBPYmplY3Qua2V5cyh0YWcpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHsgcmV0dXJuIF90aGlzLl9kb20uc2V0QXR0cmlidXRlKGVsLCBwcm9wLCB0YWdbcHJvcF0pOyB9KTtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH07XG4gICAgTWV0YS5wcm90b3R5cGUuX3BhcnNlU2VsZWN0b3IgPSBmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHZhciBhdHRyID0gdGFnLm5hbWUgPyAnbmFtZScgOiAncHJvcGVydHknO1xuICAgICAgICByZXR1cm4gYXR0ciArIFwiPVxcXCJcIiArIHRhZ1thdHRyXSArIFwiXFxcIlwiO1xuICAgIH07XG4gICAgTWV0YS5wcm90b3R5cGUuX2NvbnRhaW5zQXR0cmlidXRlcyA9IGZ1bmN0aW9uICh0YWcsIGVsZW0pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhZykuZXZlcnkoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gX3RoaXMuX2RvbS5nZXRBdHRyaWJ1dGUoZWxlbSwga2V5KSA9PT0gdGFnW2tleV07IH0pO1xuICAgIH07XG4gICAgTWV0YS5uZ0luamVjdGFibGVEZWYgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGNyZWF0ZU1ldGEsIHRva2VuOiBNZXRhLCBwcm92aWRlZEluOiBcInJvb3RcIiB9KTtcbiAgICBNZXRhID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcsIHVzZUZhY3Rvcnk6IGNyZWF0ZU1ldGEsIGRlcHM6IFtdIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIEluamVjdChET0NVTUVOVCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgTWV0YSk7XG4gICAgcmV0dXJuIE1ldGE7XG59KCkpO1xuXG4vKipcbiAqIEZhY3RvcnkgdG8gY3JlYXRlIFRpdGxlIHNlcnZpY2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRpdGxlKCkge1xuICAgIHJldHVybiBuZXcgVGl0bGUoybXJtWluamVjdChET0NVTUVOVCkpO1xufVxuLyoqXG4gKiBBIHNlcnZpY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCB0aGUgdGl0bGUgb2YgYSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuXG4gKlxuICogU2luY2UgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBjYW4ndCBiZSBib290c3RyYXBwZWQgb24gdGhlIGVudGlyZSBIVE1MIGRvY3VtZW50IChgPGh0bWw+YCB0YWcpXG4gKiBpdCBpcyBub3QgcG9zc2libGUgdG8gYmluZCB0byB0aGUgYHRleHRgIHByb3BlcnR5IG9mIHRoZSBgSFRNTFRpdGxlRWxlbWVudGAgZWxlbWVudHNcbiAqIChyZXByZXNlbnRpbmcgdGhlIGA8dGl0bGU+YCB0YWcpLiBJbnN0ZWFkLCB0aGlzIHNlcnZpY2UgY2FuIGJlIHVzZWQgdG8gc2V0IGFuZCBnZXQgdGhlIGN1cnJlbnRcbiAqIHRpdGxlIHZhbHVlLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFRpdGxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRpdGxlKF9kb2MpIHtcbiAgICAgICAgdGhpcy5fZG9jID0gX2RvYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBIVE1MIGRvY3VtZW50LlxuICAgICAqL1xuICAgIFRpdGxlLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldERPTSgpLmdldFRpdGxlKHRoaXMuX2RvYyk7IH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBIVE1MIGRvY3VtZW50LlxuICAgICAqIEBwYXJhbSBuZXdUaXRsZVxuICAgICAqL1xuICAgIFRpdGxlLnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uIChuZXdUaXRsZSkgeyBnZXRET00oKS5zZXRUaXRsZSh0aGlzLl9kb2MsIG5ld1RpdGxlKTsgfTtcbiAgICBUaXRsZS5uZ0luamVjdGFibGVEZWYgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGNyZWF0ZVRpdGxlLCB0b2tlbjogVGl0bGUsIHByb3ZpZGVkSW46IFwicm9vdFwiIH0pO1xuICAgIFRpdGxlID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcsIHVzZUZhY3Rvcnk6IGNyZWF0ZVRpdGxlLCBkZXBzOiBbXSB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBJbmplY3QoRE9DVU1FTlQpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIFRpdGxlKTtcbiAgICByZXR1cm4gVGl0bGU7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgd2luID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHt9O1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQ2hhbmdlRGV0ZWN0aW9uUGVyZlJlY29yZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDaGFuZ2VEZXRlY3Rpb25QZXJmUmVjb3JkKG1zUGVyVGljaywgbnVtVGlja3MpIHtcbiAgICAgICAgdGhpcy5tc1BlclRpY2sgPSBtc1BlclRpY2s7XG4gICAgICAgIHRoaXMubnVtVGlja3MgPSBudW1UaWNrcztcbiAgICB9XG4gICAgcmV0dXJuIENoYW5nZURldGVjdGlvblBlcmZSZWNvcmQ7XG59KCkpO1xuLyoqXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgcHJvZmlsaW5nLXJlbGF0ZWQgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0XG4gKiBjb3JyZXNwb25kcyB0byB0aGUgYG5nLnByb2ZpbGVyYCBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gKi9cbnZhciBBbmd1bGFyUHJvZmlsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQW5ndWxhclByb2ZpbGVyKHJlZikge1xuICAgICAgICB0aGlzLmFwcFJlZiA9IHJlZi5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgLyoqXG4gICAgICogRXhlcmNpc2VzIGNoYW5nZSBkZXRlY3Rpb24gaW4gYSBsb29wIGFuZCB0aGVuIHByaW50cyB0aGUgYXZlcmFnZSBhbW91bnQgb2ZcbiAgICAgKiB0aW1lIGluIG1pbGxpc2Vjb25kcyBob3cgbG9uZyBhIHNpbmdsZSByb3VuZCBvZiBjaGFuZ2UgZGV0ZWN0aW9uIHRha2VzIGZvclxuICAgICAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVSS4gSXQgcnVucyBhIG1pbmltdW0gb2YgNSByb3VuZHMgZm9yIGEgbWluaW11bVxuICAgICAqIG9mIDUwMCBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBPcHRpb25hbGx5LCBhIHVzZXIgbWF5IHBhc3MgYSBgY29uZmlnYCBwYXJhbWV0ZXIgY29udGFpbmluZyBhIG1hcCBvZlxuICAgICAqIG9wdGlvbnMuIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAgICAgKlxuICAgICAqIGByZWNvcmRgIChib29sZWFuKSAtIGNhdXNlcyB0aGUgcHJvZmlsZXIgdG8gcmVjb3JkIGEgQ1BVIHByb2ZpbGUgd2hpbGVcbiAgICAgKiBpdCBleGVyY2lzZXMgdGhlIGNoYW5nZSBkZXRlY3Rvci4gRXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIG5nLnByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24oe3JlY29yZDogdHJ1ZX0pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQW5ndWxhclByb2ZpbGVyLnByb3RvdHlwZS50aW1lQ2hhbmdlRGV0ZWN0aW9uID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVjb3JkID0gY29uZmlnICYmIGNvbmZpZ1sncmVjb3JkJ107XG4gICAgICAgIHZhciBwcm9maWxlTmFtZSA9ICdDaGFuZ2UgRGV0ZWN0aW9uJztcbiAgICAgICAgLy8gUHJvZmlsZXIgaXMgbm90IGF2YWlsYWJsZSBpbiBBbmRyb2lkIGJyb3dzZXJzLCBub3IgaW4gSUUgOSB3aXRob3V0IGRldiB0b29scyBvcGVuZWRcbiAgICAgICAgdmFyIGlzUHJvZmlsZXJBdmFpbGFibGUgPSB3aW4uY29uc29sZS5wcm9maWxlICE9IG51bGw7XG4gICAgICAgIGlmIChyZWNvcmQgJiYgaXNQcm9maWxlckF2YWlsYWJsZSkge1xuICAgICAgICAgICAgd2luLmNvbnNvbGUucHJvZmlsZShwcm9maWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHN0YXJ0ID0gZ2V0RE9NKCkucGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgdmFyIG51bVRpY2tzID0gMDtcbiAgICAgICAgd2hpbGUgKG51bVRpY2tzIDwgNSB8fCAoZ2V0RE9NKCkucGVyZm9ybWFuY2VOb3coKSAtIHN0YXJ0KSA8IDUwMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBSZWYudGljaygpO1xuICAgICAgICAgICAgbnVtVGlja3MrKztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW5kID0gZ2V0RE9NKCkucGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgaWYgKHJlY29yZCAmJiBpc1Byb2ZpbGVyQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB3aW4uY29uc29sZS5wcm9maWxlRW5kKHByb2ZpbGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbXNQZXJUaWNrID0gKGVuZCAtIHN0YXJ0KSAvIG51bVRpY2tzO1xuICAgICAgICB3aW4uY29uc29sZS5sb2coXCJyYW4gXCIgKyBudW1UaWNrcyArIFwiIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzXCIpO1xuICAgICAgICB3aW4uY29uc29sZS5sb2cobXNQZXJUaWNrLnRvRml4ZWQoMikgKyBcIiBtcyBwZXIgY2hlY2tcIik7XG4gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlRGV0ZWN0aW9uUGVyZlJlY29yZChtc1BlclRpY2ssIG51bVRpY2tzKTtcbiAgICB9O1xuICAgIHJldHVybiBBbmd1bGFyUHJvZmlsZXI7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUFJPRklMRVJfR0xPQkFMX05BTUUgPSAncHJvZmlsZXInO1xuLyoqXG4gKiBFbmFibGVkIEFuZ3VsYXIgZGVidWcgdG9vbHMgdGhhdCBhcmUgYWNjZXNzaWJsZSB2aWEgeW91ciBicm93c2VyJ3NcbiAqIGRldmVsb3BlciBjb25zb2xlLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIDEuIE9wZW4gZGV2ZWxvcGVyIGNvbnNvbGUgKGUuZy4gaW4gQ2hyb21lIEN0cmwgKyBTaGlmdCArIGopXG4gKiAxLiBUeXBlIGBuZy5gICh1c3VhbGx5IHRoZSBjb25zb2xlIHdpbGwgc2hvdyBhdXRvLWNvbXBsZXRlIHN1Z2dlc3Rpb24pXG4gKiAxLiBUcnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gcHJvZmlsZXIgYG5nLnByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24oKWBcbiAqICAgIHRoZW4gaGl0IEVudGVyLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZW5hYmxlRGVidWdUb29scyhyZWYpIHtcbiAgICBleHBvcnROZ1ZhcihQUk9GSUxFUl9HTE9CQUxfTkFNRSwgbmV3IEFuZ3VsYXJQcm9maWxlcihyZWYpKTtcbiAgICByZXR1cm4gcmVmO1xufVxuLyoqXG4gKiBEaXNhYmxlcyBBbmd1bGFyIHRvb2xzLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZnVuY3Rpb24gZGlzYWJsZURlYnVnVG9vbHMoKSB7XG4gICAgZXhwb3J0TmdWYXIoUFJPRklMRVJfR0xPQkFMX05BTUUsIG51bGwpO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQpIHtcbiAgICB2YXIgZXNjYXBlZFRleHQgPSB7XG4gICAgICAgICcmJzogJyZhOycsXG4gICAgICAgICdcIic6ICcmcTsnLFxuICAgICAgICAnXFwnJzogJyZzOycsXG4gICAgICAgICc8JzogJyZsOycsXG4gICAgICAgICc+JzogJyZnOycsXG4gICAgfTtcbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bJlwiJzw+XS9nLCBmdW5jdGlvbiAocykgeyByZXR1cm4gZXNjYXBlZFRleHRbc107IH0pO1xufVxuZnVuY3Rpb24gdW5lc2NhcGVIdG1sKHRleHQpIHtcbiAgICB2YXIgdW5lc2NhcGVkVGV4dCA9IHtcbiAgICAgICAgJyZhOyc6ICcmJyxcbiAgICAgICAgJyZxOyc6ICdcIicsXG4gICAgICAgICcmczsnOiAnXFwnJyxcbiAgICAgICAgJyZsOyc6ICc8JyxcbiAgICAgICAgJyZnOyc6ICc+JyxcbiAgICB9O1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoLyZbXjtdKzsvZywgZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHVuZXNjYXBlZFRleHRbc107IH0pO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBgU3RhdGVLZXk8VD5gIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgdmFsdWUgb2YgdHlwZSBUIHdpdGggYFRyYW5zZmVyU3RhdGVgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiBjb25zdCBDT1VOVEVSX0tFWSA9IG1ha2VTdGF0ZUtleTxudW1iZXI+KCdjb3VudGVyJyk7XG4gKiBsZXQgdmFsdWUgPSAxMDtcbiAqXG4gKiB0cmFuc2ZlclN0YXRlLnNldChDT1VOVEVSX0tFWSwgdmFsdWUpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG5mdW5jdGlvbiBtYWtlU3RhdGVLZXkoa2V5KSB7XG4gICAgcmV0dXJuIGtleTtcbn1cbi8qKlxuICogQSBrZXkgdmFsdWUgc3RvcmUgdGhhdCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUgdG8gdGhlIGFwcGxpY2F0aW9uXG4gKiBvbiB0aGUgY2xpZW50IHNpZGUuXG4gKlxuICogYFRyYW5zZmVyU3RhdGVgIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGFuIGluamVjdGFibGUgdG9rZW4uIFRvIHVzZSBpdCBpbXBvcnRcbiAqIGBTZXJ2ZXJUcmFuc2ZlclN0YXRlTW9kdWxlYCBvbiB0aGUgc2VydmVyIGFuZCBgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGVgIG9uIHRoZSBjbGllbnQuXG4gKlxuICogVGhlIHZhbHVlcyBpbiB0aGUgc3RvcmUgYXJlIHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5L0pTT04ucGFyc2UuIFNvIG9ubHlcbiAqIGJvb2xlYW4sIG51bWJlciwgc3RyaW5nLCBudWxsIGFuZCBub24tY2xhc3Mgb2JqZWN0cyB3aWxsIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsemllZCBpbiBhXG4gKiBub24tbG9zc3kgbWFubmVyLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFRyYW5zZmVyU3RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhbnNmZXJTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdG9yZSA9IHt9O1xuICAgICAgICB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzID0ge307XG4gICAgfVxuICAgIFRyYW5zZmVyU3RhdGVfMSA9IFRyYW5zZmVyU3RhdGU7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFRyYW5zZmVyU3RhdGUuaW5pdCA9IGZ1bmN0aW9uIChpbml0U3RhdGUpIHtcbiAgICAgICAgdmFyIHRyYW5zZmVyU3RhdGUgPSBuZXcgVHJhbnNmZXJTdGF0ZV8xKCk7XG4gICAgICAgIHRyYW5zZmVyU3RhdGUuc3RvcmUgPSBpbml0U3RhdGU7XG4gICAgICAgIHJldHVybiB0cmFuc2ZlclN0YXRlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEga2V5LiBSZXR1cm4gYGRlZmF1bHRWYWx1ZWAgaWYga2V5IGlzIG5vdCBmb3VuZC5cbiAgICAgKi9cbiAgICBUcmFuc2ZlclN0YXRlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpcy5zdG9yZVtrZXldIDogZGVmYXVsdFZhbHVlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEga2V5LlxuICAgICAqL1xuICAgIFRyYW5zZmVyU3RhdGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7IHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlOyB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGtleSBmcm9tIHRoZSBzdG9yZS5cbiAgICAgKi9cbiAgICBUcmFuc2ZlclN0YXRlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5KSB7IGRlbGV0ZSB0aGlzLnN0b3JlW2tleV07IH07XG4gICAgLyoqXG4gICAgICogVGVzdCB3aGV0aGVyIGEga2V5IGV4aXN0cyBpbiB0aGUgc3RvcmUuXG4gICAgICovXG4gICAgVHJhbnNmZXJTdGF0ZS5wcm90b3R5cGUuaGFzS2V5ID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5zdG9yZS5oYXNPd25Qcm9wZXJ0eShrZXkpOyB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcHJvdmlkZSB0aGUgdmFsdWUgZm9yIGEga2V5IHdoZW4gYHRvSnNvbmAgaXMgY2FsbGVkLlxuICAgICAqL1xuICAgIFRyYW5zZmVyU3RhdGUucHJvdG90eXBlLm9uU2VyaWFsaXplID0gZnVuY3Rpb24gKGtleSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldID0gY2FsbGJhY2s7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0b3JlIHRvIEpTT04uXG4gICAgICovXG4gICAgVHJhbnNmZXJTdGF0ZS5wcm90b3R5cGUudG9Kc29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDYWxsIHRoZSBvblNlcmlhbGl6ZSBjYWxsYmFja3MgYW5kIHB1dCB0aG9zZSB2YWx1ZXMgaW50byB0aGUgc3RvcmUuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAnLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmUpO1xuICAgIH07XG4gICAgdmFyIFRyYW5zZmVyU3RhdGVfMTtcbiAgICBUcmFuc2ZlclN0YXRlID0gVHJhbnNmZXJTdGF0ZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIEluamVjdGFibGUoKVxuICAgIF0sIFRyYW5zZmVyU3RhdGUpO1xuICAgIHJldHVybiBUcmFuc2ZlclN0YXRlO1xufSgpKTtcbmZ1bmN0aW9uIGluaXRUcmFuc2ZlclN0YXRlKGRvYywgYXBwSWQpIHtcbiAgICAvLyBMb2NhdGUgdGhlIHNjcmlwdCB0YWcgd2l0aCB0aGUgSlNPTiBkYXRhIHRyYW5zZmVycmVkIGZyb20gdGhlIHNlcnZlci5cbiAgICAvLyBUaGUgaWQgb2YgdGhlIHNjcmlwdCB0YWcgaXMgc2V0IHRvIHRoZSBBbmd1bGFyIGFwcElkICsgJ3N0YXRlJy5cbiAgICB2YXIgc2NyaXB0ID0gZG9jLmdldEVsZW1lbnRCeUlkKGFwcElkICsgJy1zdGF0ZScpO1xuICAgIHZhciBpbml0aWFsU3RhdGUgPSB7fTtcbiAgICBpZiAoc2NyaXB0ICYmIHNjcmlwdC50ZXh0Q29udGVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlID0gSlNPTi5wYXJzZSh1bmVzY2FwZUh0bWwoc2NyaXB0LnRleHRDb250ZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIHdoaWxlIHJlc3RvcmluZyBUcmFuc2ZlclN0YXRlIGZvciBhcHAgJyArIGFwcElkLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gVHJhbnNmZXJTdGF0ZS5pbml0KGluaXRpYWxTdGF0ZSk7XG59XG4vKipcbiAqIE5nTW9kdWxlIHRvIGluc3RhbGwgb24gdGhlIGNsaWVudCBzaWRlIHdoaWxlIHVzaW5nIHRoZSBgVHJhbnNmZXJTdGF0ZWAgdG8gdHJhbnNmZXIgc3RhdGUgZnJvbVxuICogc2VydmVyIHRvIGNsaWVudC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZSgpIHtcbiAgICB9XG4gICAgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgTmdNb2R1bGUoe1xuICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBUcmFuc2ZlclN0YXRlLCB1c2VGYWN0b3J5OiBpbml0VHJhbnNmZXJTdGF0ZSwgZGVwczogW0RPQ1VNRU5ULCBBUFBfSURdIH1dLFxuICAgICAgICB9KVxuICAgIF0sIEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlKTtcbiAgICByZXR1cm4gQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGU7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIFByZWRpY2F0ZXMgZm9yIHVzZSB3aXRoIHtAbGluayBEZWJ1Z0VsZW1lbnR9J3MgcXVlcnkgZnVuY3Rpb25zLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ5KCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXRjaCBhbGwgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBFeGFtcGxlXG4gICAgICpcbiAgICAgKiB7QGV4YW1wbGUgcGxhdGZvcm0tYnJvd3Nlci9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9hbGwnfVxuICAgICAqL1xuICAgIEJ5LmFsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uIChkZWJ1Z0VsZW1lbnQpIHsgcmV0dXJuIHRydWU7IH07IH07XG4gICAgLyoqXG4gICAgICogTWF0Y2ggZWxlbWVudHMgYnkgdGhlIGdpdmVuIENTUyBzZWxlY3Rvci5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIEV4YW1wbGVcbiAgICAgKlxuICAgICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS1icm93c2VyL2RvbS9kZWJ1Zy90cy9ieS9ieS50cyByZWdpb249J2J5X2Nzcyd9XG4gICAgICovXG4gICAgQnkuY3NzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVidWdFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZ2V0RE9NKCkuZWxlbWVudE1hdGNoZXMoZGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHNlbGVjdG9yKSA6XG4gICAgICAgICAgICAgICAgZmFsc2U7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIGdpdmVuIGRpcmVjdGl2ZSBwcmVzZW50LlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgRXhhbXBsZVxuICAgICAqXG4gICAgICoge0BleGFtcGxlIHBsYXRmb3JtLWJyb3dzZXIvZG9tL2RlYnVnL3RzL2J5L2J5LnRzIHJlZ2lvbj0nYnlfZGlyZWN0aXZlJ31cbiAgICAgKi9cbiAgICBCeS5kaXJlY3RpdmUgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRlYnVnRWxlbWVudCkgeyByZXR1cm4gZGVidWdFbGVtZW50LnByb3ZpZGVyVG9rZW5zLmluZGV4T2YodHlwZSkgIT09IC0xOyB9O1xuICAgIH07XG4gICAgcmV0dXJuIEJ5O1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFZFUlNJT04gPSBuZXcgVmVyc2lvbignOC4wLjMnKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUaGlzIGZpbGUgb25seSByZWV4cG9ydHMgY29udGVudCBvZiB0aGUgYHNyY2AgZm9sZGVyLiBLZWVwIGl0IHRoYXQgd2F5LlxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0IHsgQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYywgX2RvY3VtZW50IGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYiwgZXJyb3JIYW5kbGVyIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfYSwgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfbCwgY3JlYXRlTWV0YSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfcGxhdGZvcm1fYnJvd3Nlcl9wbGF0Zm9ybV9icm93c2VyX2QsIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfcGxhdGZvcm1fYnJvd3Nlcl9wbGF0Zm9ybV9icm93c2VyX2ksIGFwcEluaXRpYWxpemVyRmFjdG9yeSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfcGxhdGZvcm1fYnJvd3Nlcl9wbGF0Zm9ybV9icm93c2VyX2gsIGNyZWF0ZVRpdGxlIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX3BsYXRmb3JtX2Jyb3dzZXJfZSwgaW5pdFRyYW5zZmVyU3RhdGUgYXMgybVhbmd1bGFyX3BhY2thZ2VzX3BsYXRmb3JtX2Jyb3dzZXJfcGxhdGZvcm1fYnJvd3Nlcl9mLCBFTEVNRU5UX1BST0JFX1BST1ZJREVSU19fUFJFX1IzX18gYXMgybVhbmd1bGFyX3BhY2thZ2VzX3BsYXRmb3JtX2Jyb3dzZXJfcGxhdGZvcm1fYnJvd3Nlcl9rLCBfY3JlYXRlTmdQcm9iZSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfcGxhdGZvcm1fYnJvd3Nlcl9wbGF0Zm9ybV9icm93c2VyX2osIEV2ZW50TWFuYWdlclBsdWdpbiBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfcGxhdGZvcm1fYnJvd3Nlcl9wbGF0Zm9ybV9icm93c2VyX2csIEJyb3dzZXJNb2R1bGUsIHBsYXRmb3JtQnJvd3NlciwgTWV0YSwgVGl0bGUsIGRpc2FibGVEZWJ1Z1Rvb2xzLCBlbmFibGVEZWJ1Z1Rvb2xzLCBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZSwgVHJhbnNmZXJTdGF0ZSwgbWFrZVN0YXRlS2V5LCBCeSwgRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCBFdmVudE1hbmFnZXIsIEhBTU1FUl9HRVNUVVJFX0NPTkZJRywgSEFNTUVSX0xPQURFUiwgSGFtbWVyR2VzdHVyZUNvbmZpZywgRG9tU2FuaXRpemVyLCBWRVJTSU9OLCBFTEVNRU5UX1BST0JFX1BST1ZJREVSU19fUE9TVF9SM19fIGFzIMm1RUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BPU1RfUjNfXywgQlJPV1NFUl9TQU5JVElaQVRJT05fUFJPVklERVJTIGFzIMm1QlJPV1NFUl9TQU5JVElaQVRJT05fUFJPVklERVJTLCBJTlRFUk5BTF9CUk9XU0VSX1BMQVRGT1JNX1BST1ZJREVSUyBhcyDJtUlOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTLCBpbml0RG9tQWRhcHRlciBhcyDJtWluaXREb21BZGFwdGVyLCBCcm93c2VyRG9tQWRhcHRlciBhcyDJtUJyb3dzZXJEb21BZGFwdGVyLCBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiBhcyDJtUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLCBUUkFOU0lUSU9OX0lEIGFzIMm1VFJBTlNJVElPTl9JRCwgQnJvd3NlckdldFRlc3RhYmlsaXR5IGFzIMm1QnJvd3NlckdldFRlc3RhYmlsaXR5LCBlc2NhcGVIdG1sIGFzIMm1ZXNjYXBlSHRtbCwgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlMgYXMgybVFTEVNRU5UX1BST0JFX1BST1ZJREVSUywgRG9tQWRhcHRlciBhcyDJtURvbUFkYXB0ZXIsIGdldERPTSBhcyDJtWdldERPTSwgc2V0Um9vdERvbUFkYXB0ZXIgYXMgybVzZXRSb290RG9tQWRhcHRlciwgRG9tUmVuZGVyZXJGYWN0b3J5MiBhcyDJtURvbVJlbmRlcmVyRmFjdG9yeTIsIE5BTUVTUEFDRV9VUklTIGFzIMm1TkFNRVNQQUNFX1VSSVMsIGZsYXR0ZW5TdHlsZXMgYXMgybVmbGF0dGVuU3R5bGVzLCBzaGltQ29udGVudEF0dHJpYnV0ZSBhcyDJtXNoaW1Db250ZW50QXR0cmlidXRlLCBzaGltSG9zdEF0dHJpYnV0ZSBhcyDJtXNoaW1Ib3N0QXR0cmlidXRlLCBEb21FdmVudHNQbHVnaW4gYXMgybVEb21FdmVudHNQbHVnaW4sIEhhbW1lckdlc3R1cmVzUGx1Z2luIGFzIMm1SGFtbWVyR2VzdHVyZXNQbHVnaW4sIEtleUV2ZW50c1BsdWdpbiBhcyDJtUtleUV2ZW50c1BsdWdpbiwgRG9tU2hhcmVkU3R5bGVzSG9zdCBhcyDJtURvbVNoYXJlZFN0eWxlc0hvc3QsIFNoYXJlZFN0eWxlc0hvc3QgYXMgybVTaGFyZWRTdHlsZXNIb3N0LCBEb21TYW5pdGl6ZXJJbXBsIGFzIMm1RG9tU2FuaXRpemVySW1wbCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGxhdGZvcm0tYnJvd3Nlci5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX09ic2VydmFibGUgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJy4uL09ic2VydmFibGUnO1xuZXhwb3J0IHZhciBFTVBUWSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHsgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsgfSk7XG5leHBvcnQgZnVuY3Rpb24gZW1wdHkoc2NoZWR1bGVyKSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlciA/IGVtcHR5U2NoZWR1bGVkKHNjaGVkdWxlcikgOiBFTVBUWTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbXB0eVNjaGVkdWxlZChzY2hlZHVsZXIpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHsgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7IHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7IH0pOyB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVtcHR5LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfT2JzZXJ2YWJsZSxfdXRpbF9pc0FycmF5LF9lbXB0eSxfdXRpbF9zdWJzY3JpYmVUb1Jlc3VsdCxfT3V0ZXJTdWJzY3JpYmVyLF9vcGVyYXRvcnNfbWFwIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi4vT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi4vdXRpbC9pc0FycmF5JztcbmltcG9ydCB7IEVNUFRZIH0gZnJvbSAnLi9lbXB0eSc7XG5pbXBvcnQgeyBzdWJzY3JpYmVUb1Jlc3VsdCB9IGZyb20gJy4uL3V0aWwvc3Vic2NyaWJlVG9SZXN1bHQnO1xuaW1wb3J0IHsgT3V0ZXJTdWJzY3JpYmVyIH0gZnJvbSAnLi4vT3V0ZXJTdWJzY3JpYmVyJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4uL29wZXJhdG9ycy9tYXAnO1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmtKb2luKCkge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0U2VsZWN0b3I7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2VzW3NvdXJjZXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzdWx0U2VsZWN0b3IgPSBzb3VyY2VzLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShzb3VyY2VzWzBdKSkge1xuICAgICAgICBzb3VyY2VzID0gc291cmNlc1swXTtcbiAgICB9XG4gICAgaWYgKHNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihzb3VyY2VzKS5waXBlKG1hcChmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gcmVzdWx0U2VsZWN0b3IuYXBwbHkodm9pZCAwLCBhcmdzKTsgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JrSm9pblN1YnNjcmliZXIoc3Vic2NyaWJlciwgc291cmNlcyk7XG4gICAgfSk7XG59XG52YXIgRm9ya0pvaW5TdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKEZvcmtKb2luU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBGb3JrSm9pblN1YnNjcmliZXIoZGVzdGluYXRpb24sIHNvdXJjZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgICBfdGhpcy5jb21wbGV0ZWQgPSAwO1xuICAgICAgICBfdGhpcy5oYXZlVmFsdWVzID0gMDtcbiAgICAgICAgdmFyIGxlbiA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgICBfdGhpcy52YWx1ZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgICAgICB2YXIgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdChfdGhpcywgc291cmNlLCBudWxsLCBpKTtcbiAgICAgICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIF90aGlzLmFkZChpbm5lclN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBGb3JrSm9pblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeU5leHQgPSBmdW5jdGlvbiAob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHtcbiAgICAgICAgdGhpcy52YWx1ZXNbb3V0ZXJJbmRleF0gPSBpbm5lclZhbHVlO1xuICAgICAgICBpZiAoIWlubmVyU3ViLl9oYXNWYWx1ZSkge1xuICAgICAgICAgICAgaW5uZXJTdWIuX2hhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGF2ZVZhbHVlcysrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBGb3JrSm9pblN1YnNjcmliZXIucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKGlubmVyU3ViKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGRlc3RpbmF0aW9uID0gX2EuZGVzdGluYXRpb24sIGhhdmVWYWx1ZXMgPSBfYS5oYXZlVmFsdWVzLCB2YWx1ZXMgPSBfYS52YWx1ZXM7XG4gICAgICAgIHZhciBsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICBpZiAoIWlubmVyU3ViLl9oYXNWYWx1ZSkge1xuICAgICAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBsZXRlZCsrO1xuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZWQgIT09IGxlbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXZlVmFsdWVzID09PSBsZW4pIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQodmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIEZvcmtKb2luU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb3JrSm9pbi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2UgQW5ndWxhciB2OC4wLjNcbiAqIChjKSAyMDEwLTIwMTkgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvL1xuICogTGljZW5zZTogTUlUXG4gKi9cblxuaW1wb3J0IHsgX19kZWNvcmF0ZSwgX19tZXRhZGF0YSwgX19wYXJhbSwgX19leHRlbmRzLCBfX2Fzc2lnbiwgX192YWx1ZXMsIF9fc3ByZWFkIH0gZnJvbSAndHNsaWInO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGZvcndhcmRSZWYsIERpcmVjdGl2ZSwgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBPcHRpb25hbCwgSW5qZWN0LCBTZWxmLCDJtWlzUHJvbWlzZSwgybVpc09ic2VydmFibGUsIEluamVjdGFibGUsIElucHV0LCBJbmplY3RvciwgSG9zdCwgybVsb29zZUlkZW50aWNhbCwgaXNEZXZNb2RlLCBFdmVudEVtaXR0ZXIsIFNraXBTZWxmLCBPdXRwdXQsIE5nTW9kdWxlLCBWZXJzaW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyDJtWdldERPTSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZm9ya0pvaW4sIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBVc2VkIHRvIHByb3ZpZGUgYSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciBmb3JtIGNvbnRyb2xzLlxuICpcbiAqIFNlZSBgRGVmYXVsdFZhbHVlQWNjZXNzb3JgIGZvciBob3cgdG8gaW1wbGVtZW50IG9uZS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOR19WQUxVRV9BQ0NFU1NPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdWYWx1ZUFjY2Vzc29yJyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBDSEVDS0JPWF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yOyB9KSxcbiAgICBtdWx0aTogdHJ1ZSxcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIGEgY2hlY2tib3ggaW5wdXRcbiAqIGVsZW1lbnQuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgVXNpbmcgYSBjaGVja2JveCB3aXRoIGEgcmVhY3RpdmUgZm9ybS5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGNoZWNrYm94IHdpdGggYSByZWFjdGl2ZSBmb3JtLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCByZW1lbWJlckxvZ2luQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICogYGBgXG4gKlxuICogYGBgXG4gKiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2Zvcm1Db250cm9sXT1cInJlbWVtYmVyTG9naW5Db250cm9sXCI+XG4gKiBgYGBcbiAqXG4gKiBAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjtcbiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAoXykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgXCJjaGVja2VkXCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWVcbiAgICAgKi9cbiAgICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS53cml0ZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NoZWNrZWQnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25DaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJPblRvdWNoZWQgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBcImRpc2FibGVkXCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBUaGUgZGlzYWJsZWQgdmFsdWVcbiAgICAgKi9cbiAgICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5zZXREaXNhYmxlZFN0YXRlID0gZnVuY3Rpb24gKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9O1xuICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHtcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnaW5wdXRbdHlwZT1jaGVja2JveF1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtmb3JtQ29udHJvbF0saW5wdXRbdHlwZT1jaGVja2JveF1bbmdNb2RlbF0nLFxuICAgICAgICAgICAgaG9zdDogeyAnKGNoYW5nZSknOiAnb25DaGFuZ2UoJGV2ZW50LnRhcmdldC5jaGVja2VkKScsICcoYmx1ciknOiAnb25Ub3VjaGVkKCknIH0sXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtDSEVDS0JPWF9WQUxVRV9BQ0NFU1NPUl1cbiAgICAgICAgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbUmVuZGVyZXIyLCBFbGVtZW50UmVmXSlcbiAgICBdLCBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yKTtcbiAgICByZXR1cm4gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIERlZmF1bHRWYWx1ZUFjY2Vzc29yOyB9KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcbi8qKlxuICogV2UgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBhZ2VudCBpcyBBbmRyb2lkIGJlY2F1c2UgY29tcG9zaXRpb24gZXZlbnRzXG4gKiBiZWhhdmUgZGlmZmVyZW50bHkgYmV0d2VlbiBpT1MgYW5kIEFuZHJvaWQuXG4gKi9cbmZ1bmN0aW9uIF9pc0FuZHJvaWQoKSB7XG4gICAgdmFyIHVzZXJBZ2VudCA9IMm1Z2V0RE9NKCkgPyDJtWdldERPTSgpLmdldFVzZXJBZ2VudCgpIDogJyc7XG4gICAgcmV0dXJuIC9hbmRyb2lkIChcXGQrKS8udGVzdCh1c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvdmlkZSB0aGlzIHRva2VuIHRvIGNvbnRyb2wgaWYgZm9ybSBkaXJlY3RpdmVzIGJ1ZmZlciBJTUUgaW5wdXQgdW50aWxcbiAqIHRoZSBcImNvbXBvc2l0aW9uZW5kXCIgZXZlbnQgb2NjdXJzLlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ09NUE9TSVRJT05fQlVGRkVSX01PREUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0NvbXBvc2l0aW9uRXZlbnRNb2RlJyk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGRlZmF1bHQgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBhIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyBvbiBpbnB1dFxuICogZWxlbWVudHMuIFRoZSBhY2Nlc3NvciBpcyB1c2VkIGJ5IHRoZSBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgLCBgRm9ybUNvbnRyb2xOYW1lYCwgYW5kXG4gKiBgTmdNb2RlbGAgZGlyZWN0aXZlcy5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBVc2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBhY2Nlc3NvclxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGFuIGlucHV0IGVsZW1lbnQgdGhhdCBhY3RpdmF0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgYWNjZXNzb3JcbiAqIChpbiB0aGlzIGNhc2UsIGEgdGV4dCBmaWVsZCkuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGZpcnN0TmFtZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImZpcnN0TmFtZUNvbnRyb2xcIj5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIERlZmF1bHRWYWx1ZUFjY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmF1bHRWYWx1ZUFjY2Vzc29yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYsIF9jb21wb3NpdGlvbk1vZGUpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjtcbiAgICAgICAgdGhpcy5fY29tcG9zaXRpb25Nb2RlID0gX2NvbXBvc2l0aW9uTW9kZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhbiBpbnB1dCBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKF8pIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGlzIGNyZWF0aW5nIGEgY29tcG9zaXRpb24gc3RyaW5nIChJTUUgZXZlbnRzKS4gKi9cbiAgICAgICAgdGhpcy5fY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGlvbk1vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRpb25Nb2RlID0gIV9pc0FuZHJvaWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBcInZhbHVlXCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWVcbiAgICAgKi9cbiAgICBEZWZhdWx0VmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbm9ybWFsaXplZFZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgRGVmYXVsdFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25DaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIHRvdWNoZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgRGVmYXVsdFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25Ub3VjaGVkID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMub25Ub3VjaGVkID0gZm47IH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgXCJkaXNhYmxlZFwiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlXG4gICAgICovXG4gICAgRGVmYXVsdFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnNldERpc2FibGVkU3RhdGUgPSBmdW5jdGlvbiAoaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5faGFuZGxlSW5wdXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb3NpdGlvbk1vZGUgfHwgKHRoaXMuX2NvbXBvc2l0aW9uTW9kZSAmJiAhdGhpcy5fY29tcG9zaW5nKSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBEZWZhdWx0VmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUuX2NvbXBvc2l0aW9uU3RhcnQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2NvbXBvc2luZyA9IHRydWU7IH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fY29tcG9zaXRpb25FbmQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0aW9uTW9kZSAmJiB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9O1xuICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ2lucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW2Zvcm1Db250cm9sTmFtZV0sdGV4dGFyZWFbZm9ybUNvbnRyb2xOYW1lXSxpbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKVtmb3JtQ29udHJvbF0sdGV4dGFyZWFbZm9ybUNvbnRyb2xdLGlucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW25nTW9kZWxdLHRleHRhcmVhW25nTW9kZWxdLFtuZ0RlZmF1bHRDb250cm9sXScsXG4gICAgICAgICAgICAvLyBUT0RPOiB2c2F2a2luIHJlcGxhY2UgdGhlIGFib3ZlIHNlbGVjdG9yIHdpdGggdGhlIG9uZSBiZWxvdyBpdCBvbmNlXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMDExIGlzIGltcGxlbWVudGVkXG4gICAgICAgICAgICAvLyBzZWxlY3RvcjogJ1tuZ01vZGVsXSxbZm9ybUNvbnRyb2xdLFtmb3JtQ29udHJvbE5hbWVdJyxcbiAgICAgICAgICAgIGhvc3Q6IHtcbiAgICAgICAgICAgICAgICAnKGlucHV0KSc6ICckYW55KHRoaXMpLl9oYW5kbGVJbnB1dCgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgICAgICAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gICAgICAgICAgICAgICAgJyhjb21wb3NpdGlvbnN0YXJ0KSc6ICckYW55KHRoaXMpLl9jb21wb3NpdGlvblN0YXJ0KCknLFxuICAgICAgICAgICAgICAgICcoY29tcG9zaXRpb25lbmQpJzogJyRhbnkodGhpcykuX2NvbXBvc2l0aW9uRW5kKCRldmVudC50YXJnZXQudmFsdWUpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW0RFRkFVTFRfVkFMVUVfQUNDRVNTT1JdXG4gICAgICAgIH0pLFxuICAgICAgICBfX3BhcmFtKDIsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDIsIEluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1JlbmRlcmVyMiwgRWxlbWVudFJlZiwgQm9vbGVhbl0pXG4gICAgXSwgRGVmYXVsdFZhbHVlQWNjZXNzb3IpO1xuICAgIHJldHVybiBEZWZhdWx0VmFsdWVBY2Nlc3Nvcjtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBCYXNlIGNsYXNzIGZvciBjb250cm9sIGRpcmVjdGl2ZXMuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgYFJlYWN0aXZlRm9ybXNNb2R1bGVgIGFuZCB0aGUgYEZvcm1zTW9kdWxlYC5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlKCkge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmVwb3J0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC52YWx1ZSA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInZhbGlkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdmFsaWQuIEEgY29udHJvbCBpcyBjb25zaWRlcmVkIHZhbGlkIGlmIG5vXG4gICAgICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIGV4aXN0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudmFsaWQgOiBudWxsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJpbnZhbGlkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgaW52YWxpZCwgbWVhbmluZyB0aGF0IGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuaW52YWxpZCA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInBlbmRpbmdcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlcG9ydHMgd2hldGhlciBhIGNvbnRyb2wgaXMgcGVuZGluZywgbWVhbmluZyB0aGF0IHRoYXQgYXN5bmMgdmFsaWRhdGlvbiBpcyBvY2N1cnJpbmcgYW5kXG4gICAgICAgICAqIGVycm9ycyBhcmUgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBpbnB1dCB2YWx1ZS4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXNcbiAgICAgICAgICogcmV0dXJuZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5wZW5kaW5nIDogbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiZGlzYWJsZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZCwgbWVhbmluZyB0aGF0IHRoZSBjb250cm9sIGlzIGRpc2FibGVkXG4gICAgICAgICAqIGluIHRoZSBVSSBhbmQgaXMgZXhlbXB0IGZyb20gdmFsaWRhdGlvbiBjaGVja3MgYW5kIGV4Y2x1ZGVkIGZyb20gYWdncmVnYXRlXG4gICAgICAgICAqIHZhbHVlcyBvZiBhbmNlc3RvciBjb250cm9scy4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5kaXNhYmxlZCA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcImVuYWJsZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyBlbmFibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbnRyb2wgaXMgaW5jbHVkZWQgaW4gYW5jZXN0b3JcbiAgICAgICAgICogY2FsY3VsYXRpb25zIG9mIHZhbGlkaXR5IG9yIHZhbHVlLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLmVuYWJsZWQgOiBudWxsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJlcnJvcnNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlcG9ydHMgdGhlIGNvbnRyb2wncyB2YWxpZGF0aW9uIGVycm9ycy4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5lcnJvcnMgOiBudWxsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJwcmlzdGluZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIHByaXN0aW5lLCBtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZFxuICAgICAgICAgKiB0aGUgdmFsdWUgaW4gdGhlIFVJLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnByaXN0aW5lIDogbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiZGlydHlcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXJ0eSwgbWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyBjaGFuZ2VkXG4gICAgICAgICAqIHRoZSB2YWx1ZSBpbiB0aGUgVUkuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuZGlydHkgOiBudWxsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJ0b3VjaGVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdG91Y2hlZCwgbWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0cmlnZ2VyZWRcbiAgICAgICAgICogYSBgYmx1cmAgZXZlbnQgb24gaXQuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudG91Y2hlZCA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInN0YXR1c1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmVwb3J0cyB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgb2YgdGhlIGNvbnRyb2wuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICAgKiAnVkFMSUQnLCAnSU5WQUxJRCcsICdESVNBQkxFRCcsIGFuZCAnUEVORElORycuXG4gICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuc3RhdHVzIDogbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwidW50b3VjaGVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdW50b3VjaGVkLCBtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgdHJpZ2dlcmVkXG4gICAgICAgICAqIGEgYGJsdXJgIGV2ZW50IG9uIGl0LiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnVudG91Y2hlZCA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInN0YXR1c0NoYW5nZXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYSBtdWx0aWNhc3Rpbmcgb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgdmFsaWRhdGlvbiBzdGF0dXMgd2hlbmV2ZXIgaXQgaXNcbiAgICAgICAgICogY2FsY3VsYXRlZCBmb3IgdGhlIGNvbnRyb2wuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMgOiBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJ2YWx1ZUNoYW5nZXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYSBtdWx0aWNhc3Rpbmcgb2JzZXJ2YWJsZSBvZiB2YWx1ZSBjaGFuZ2VzIGZvciB0aGUgY29udHJvbCB0aGF0IGVtaXRzIGV2ZXJ5IHRpbWUgdGhlXG4gICAgICAgICAqIHZhbHVlIG9mIHRoZSBjb250cm9sIGNoYW5nZXMgaW4gdGhlIFVJIG9yIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlcyA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC5cbiAgICAgICAgICogRWFjaCBpbmRleCBpcyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGNvbnRyb2wgb24gdGhhdCBsZXZlbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVzZXRzIHRoZSBjb250cm9sIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGlmIHRoZSBjb250cm9sIGlzIHByZXNlbnQuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgeyB2YWx1ZSA9IHVuZGVmaW5lZDsgfVxuICAgICAgICBpZiAodGhpcy5jb250cm9sKVxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlc2V0KHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoIGhhcyB0aGUgZXJyb3Igc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gcGF0aCBBIGxpc3Qgb2YgY29udHJvbCBuYW1lcyB0aGF0IGRlc2lnbmF0ZXMgaG93IHRvIG1vdmUgZnJvbSB0aGUgY3VycmVudCBjb250cm9sXG4gICAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgYEZvcm1Hcm91cGA6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICogICBhZGRyZXNzOiBuZXcgRm9ybUdyb3VwKHsgc3RyZWV0OiBuZXcgRm9ybUNvbnRyb2woKSB9KVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIHBhdGggdG8gdGhlICdzdHJlZXQnIGNvbnRyb2wgZnJvbSB0aGUgcm9vdCBmb3JtIHdvdWxkIGJlICdhZGRyZXNzJyAtPiAnc3RyZWV0Jy5cbiAgICAgKlxuICAgICAqIEl0IGNhbiBiZSBwcm92aWRlZCB0byB0aGlzIG1ldGhvZCBpbiBvbmUgb2YgdHdvIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiAxLiBBbiBhcnJheSBvZiBzdHJpbmcgY29udHJvbCBuYW1lcywgZS5nLiBgWydhZGRyZXNzJywgJ3N0cmVldCddYFxuICAgICAqIDEuIEEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgaW4gb25lIHN0cmluZywgZS5nLiBgJ2FkZHJlc3Muc3RyZWV0J2BcbiAgICAgKlxuICAgICAqIElmIG5vIHBhdGggaXMgZ2l2ZW4sIHRoaXMgbWV0aG9kIGNoZWNrcyBmb3IgdGhlIGVycm9yIG9uIHRoZSBjdXJyZW50IGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlcnJvciBpcyBwcmVzZW50IGluIHRoZSBjb250cm9sIGF0IHRoZSBnaXZlbiBwYXRoLlxuICAgICAqXG4gICAgICogSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIGZhbHNlIGlzIHJldHVybmVkLlxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUuaGFzRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3JDb2RlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuaGFzRXJyb3IoZXJyb3JDb2RlLCBwYXRoKSA6IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVwb3J0cyBlcnJvciBkYXRhIGZvciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gcGF0aCBBIGxpc3Qgb2YgY29udHJvbCBuYW1lcyB0aGF0IGRlc2lnbmF0ZXMgaG93IHRvIG1vdmUgZnJvbSB0aGUgY3VycmVudCBjb250cm9sXG4gICAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgYEZvcm1Hcm91cGA6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICogICBhZGRyZXNzOiBuZXcgRm9ybUdyb3VwKHsgc3RyZWV0OiBuZXcgRm9ybUNvbnRyb2woKSB9KVxuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIHBhdGggdG8gdGhlICdzdHJlZXQnIGNvbnRyb2wgZnJvbSB0aGUgcm9vdCBmb3JtIHdvdWxkIGJlICdhZGRyZXNzJyAtPiAnc3RyZWV0Jy5cbiAgICAgKlxuICAgICAqIEl0IGNhbiBiZSBwcm92aWRlZCB0byB0aGlzIG1ldGhvZCBpbiBvbmUgb2YgdHdvIGZvcm1hdHM6XG4gICAgICpcbiAgICAgKiAxLiBBbiBhcnJheSBvZiBzdHJpbmcgY29udHJvbCBuYW1lcywgZS5nLiBgWydhZGRyZXNzJywgJ3N0cmVldCddYFxuICAgICAqIDEuIEEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgaW4gb25lIHN0cmluZywgZS5nLiBgJ2FkZHJlc3Muc3RyZWV0J2BcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGVycm9yIGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBlcnJvci4gSWYgdGhlIGNvbnRyb2wgb3IgZXJyb3IgaXMgbm90IHByZXNlbnQsXG4gICAgICogbnVsbCBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLmdldEVycm9yID0gZnVuY3Rpb24gKGVycm9yQ29kZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCkgOiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGRpcmVjdGl2ZXMgdGhhdCBjb250YWluIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW5zdGFuY2VzIG9mIGBOZ0NvbnRyb2xgLlxuICogT25seSB1c2VkIGJ5IHRoZSBmb3JtcyBtb2R1bGUuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQ29udHJvbENvbnRhaW5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29udHJvbENvbnRhaW5lciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb250cm9sQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb250cm9sQ29udGFpbmVyLnByb3RvdHlwZSwgXCJmb3JtRGlyZWN0aXZlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgdG9wLWxldmVsIGZvcm0gZGlyZWN0aXZlIGZvciB0aGUgY29udHJvbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbnVsbDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnRyb2xDb250YWluZXIucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBDb250cm9sQ29udGFpbmVyO1xufShBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gdW5pbXBsZW1lbnRlZCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuaW1wbGVtZW50ZWQnKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGJhc2UgY2xhc3MgdGhhdCBhbGwgY29udHJvbCBgRm9ybUNvbnRyb2xgLWJhc2VkIGRpcmVjdGl2ZXMgZXh0ZW5kLiBJdCBiaW5kcyBhIGBGb3JtQ29udHJvbGBcbiAqIG9iamVjdCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nQ29udHJvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdDb250cm9sLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5nQ29udHJvbCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHBhcmVudCBmb3JtIGZvciB0aGUgY29udHJvbC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIGNvbnRyb2xcbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLm5hbWUgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSB2YWx1ZSBhY2Nlc3NvciBmb3IgdGhlIGNvbnRyb2xcbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLnZhbHVlQWNjZXNzb3IgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSB1bmNvbXBvc2VkIGFycmF5IG9mIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgZm9yIHRoZSBjb250cm9sXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuX3Jhd1ZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgdW5jb21wb3NlZCBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3JzIGZvciB0aGUgY29udHJvbFxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMgPSBbXTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdDb250cm9sLnByb3RvdHlwZSwgXCJ2YWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSByZWdpc3RlcmVkIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgdGhlIGNvbnRyb2xcbiAgICAgICAgICpcbiAgICAgICAgICogQHRocm93cyBBbiBleGNlcHRpb24gdGhhdCB0aGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWRcbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdDb250cm9sLnByb3RvdHlwZSwgXCJhc3luY1ZhbGlkYXRvclwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9uIGZvciB0aGUgY29udHJvbFxuICAgICAgICAgKlxuICAgICAgICAgKiBAdGhyb3dzIEFuIGV4Y2VwdGlvbiB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBOZ0NvbnRyb2w7XG59KEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgQWJzdHJhY3RDb250cm9sU3RhdHVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFic3RyYWN0Q29udHJvbFN0YXR1cyhjZCkge1xuICAgICAgICB0aGlzLl9jZCA9IGNkO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sU3RhdHVzLnByb3RvdHlwZSwgXCJuZ0NsYXNzVW50b3VjaGVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jZC5jb250cm9sID8gdGhpcy5fY2QuY29udHJvbC51bnRvdWNoZWQgOiBmYWxzZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbFN0YXR1cy5wcm90b3R5cGUsIFwibmdDbGFzc1RvdWNoZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnRvdWNoZWQgOiBmYWxzZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbFN0YXR1cy5wcm90b3R5cGUsIFwibmdDbGFzc1ByaXN0aW5lXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jZC5jb250cm9sID8gdGhpcy5fY2QuY29udHJvbC5wcmlzdGluZSA6IGZhbHNlOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sU3RhdHVzLnByb3RvdHlwZSwgXCJuZ0NsYXNzRGlydHlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLmRpcnR5IDogZmFsc2U7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2xTdGF0dXMucHJvdG90eXBlLCBcIm5nQ2xhc3NWYWxpZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wudmFsaWQgOiBmYWxzZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbFN0YXR1cy5wcm90b3R5cGUsIFwibmdDbGFzc0ludmFsaWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLmludmFsaWQgOiBmYWxzZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbFN0YXR1cy5wcm90b3R5cGUsIFwibmdDbGFzc1BlbmRpbmdcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnBlbmRpbmcgOiBmYWxzZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIEFic3RyYWN0Q29udHJvbFN0YXR1cztcbn0oKSk7XG52YXIgbmdDb250cm9sU3RhdHVzSG9zdCA9IHtcbiAgICAnW2NsYXNzLm5nLXVudG91Y2hlZF0nOiAnbmdDbGFzc1VudG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy10b3VjaGVkXSc6ICduZ0NsYXNzVG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy1wcmlzdGluZV0nOiAnbmdDbGFzc1ByaXN0aW5lJyxcbiAgICAnW2NsYXNzLm5nLWRpcnR5XSc6ICduZ0NsYXNzRGlydHknLFxuICAgICdbY2xhc3MubmctdmFsaWRdJzogJ25nQ2xhc3NWYWxpZCcsXG4gICAgJ1tjbGFzcy5uZy1pbnZhbGlkXSc6ICduZ0NsYXNzSW52YWxpZCcsXG4gICAgJ1tjbGFzcy5uZy1wZW5kaW5nXSc6ICduZ0NsYXNzUGVuZGluZycsXG59O1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERpcmVjdGl2ZSBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gQW5ndWxhciBmb3JtIGNvbnRyb2xzIHRoYXQgc2V0cyBDU1MgY2xhc3Nlc1xuICogYmFzZWQgb24gY29udHJvbCBzdGF0dXMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgQ1NTIGNsYXNzZXMgYXBwbGllZFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgYXBwbGllZCBhcyB0aGUgcHJvcGVydGllcyBiZWNvbWUgdHJ1ZTpcbiAqXG4gKiAqIG5nLXZhbGlkXG4gKiAqIG5nLWludmFsaWRcbiAqICogbmctcGVuZGluZ1xuICogKiBuZy1wcmlzdGluZVxuICogKiBuZy1kaXJ0eVxuICogKiBuZy11bnRvdWNoZWRcbiAqICogbmctdG91Y2hlZFxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nQ29udHJvbFN0YXR1cyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdDb250cm9sU3RhdHVzLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5nQ29udHJvbFN0YXR1cyhjZCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY2QpIHx8IHRoaXM7XG4gICAgfVxuICAgIE5nQ29udHJvbFN0YXR1cyA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tmb3JtQ29udHJvbE5hbWVdLFtuZ01vZGVsXSxbZm9ybUNvbnRyb2xdJywgaG9zdDogbmdDb250cm9sU3RhdHVzSG9zdCB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBTZWxmKCkpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW05nQ29udHJvbF0pXG4gICAgXSwgTmdDb250cm9sU3RhdHVzKTtcbiAgICByZXR1cm4gTmdDb250cm9sU3RhdHVzO1xufShBYnN0cmFjdENvbnRyb2xTdGF0dXMpKTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBEaXJlY3RpdmUgYXV0b21hdGljYWxseSBhcHBsaWVkIHRvIEFuZ3VsYXIgZm9ybSBncm91cHMgdGhhdCBzZXRzIENTUyBjbGFzc2VzXG4gKiBiYXNlZCBvbiBjb250cm9sIHN0YXR1cyAodmFsaWQvaW52YWxpZC9kaXJ0eS9ldGMpLlxuICpcbiAqIEBzZWUgYE5nQ29udHJvbFN0YXR1c2BcbiAqXG4gKiBAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ0NvbnRyb2xTdGF0dXNHcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdDb250cm9sU3RhdHVzR3JvdXAsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmdDb250cm9sU3RhdHVzR3JvdXAoY2QpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGNkKSB8fCB0aGlzO1xuICAgIH1cbiAgICBOZ0NvbnRyb2xTdGF0dXNHcm91cCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZm9ybUdyb3VwTmFtZV0sW2Zvcm1BcnJheU5hbWVdLFtuZ01vZGVsR3JvdXBdLFtmb3JtR3JvdXBdLGZvcm06bm90KFtuZ05vRm9ybV0pLFtuZ0Zvcm1dJyxcbiAgICAgICAgICAgIGhvc3Q6IG5nQ29udHJvbFN0YXR1c0hvc3RcbiAgICAgICAgfSksXG4gICAgICAgIF9fcGFyYW0oMCwgU2VsZigpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb250cm9sQ29udGFpbmVyXSlcbiAgICBdLCBOZ0NvbnRyb2xTdGF0dXNHcm91cCk7XG4gICAgcmV0dXJuIE5nQ29udHJvbFN0YXR1c0dyb3VwO1xufShBYnN0cmFjdENvbnRyb2xTdGF0dXMpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuZnVuY3Rpb24gaXNFbXB0eUlucHV0VmFsdWUodmFsdWUpIHtcbiAgICAvLyB3ZSBkb24ndCBjaGVjayBmb3Igc3RyaW5nIGhlcmUgc28gaXQgYWxzbyB3b3JrcyB3aXRoIGFycmF5c1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCA9PT0gMDtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBbiBgSW5qZWN0aW9uVG9rZW5gIGZvciByZWdpc3RlcmluZyBhZGRpdGlvbmFsIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoIGBBYnN0cmFjdENvbnRyb2xgcy5cbiAqXG4gKiBAc2VlIGBOR19BU1lOQ19WQUxJREFUT1JTYFxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIFByb3ZpZGluZyBhIGN1c3RvbSB2YWxpZGF0b3JcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmVnaXN0ZXJzIGEgY3VzdG9tIHZhbGlkYXRvciBkaXJlY3RpdmUuIEFkZGluZyB0aGUgdmFsaWRhdG9yIHRvIHRoZVxuICogZXhpc3RpbmcgY29sbGVjdGlvbiBvZiB2YWxpZGF0b3JzIHJlcXVpcmVzIHRoZSBgbXVsdGk6IHRydWVgIG9wdGlvbi5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbY3VzdG9tVmFsaWRhdG9yXScsXG4gKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlLCBtdWx0aTogdHJ1ZX1dXG4gKiB9KVxuICogY2xhc3MgQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAqICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICogICAgIHJldHVybiB7ICdjdXN0b20nOiB0cnVlIH07XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5HX1ZBTElEQVRPUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ05nVmFsaWRhdG9ycycpO1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIGBJbmplY3Rpb25Ub2tlbmAgZm9yIHJlZ2lzdGVyaW5nIGFkZGl0aW9uYWwgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoIGBBYnN0cmFjdENvbnRyb2xgcy5cbiAqXG4gKiBAc2VlIGBOR19WQUxJREFUT1JTYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5HX0FTWU5DX1ZBTElEQVRPUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ05nQXN5bmNWYWxpZGF0b3JzJyk7XG52YXIgRU1BSUxfUkVHRVhQID0gL14oPz0uezEsMjU0fSQpKD89LnsxLDY0fUApWy0hIyQlJicqKy8wLTk9P0EtWl5fYGEtent8fX5dKyhcXC5bLSEjJCUmJyorLzAtOT0/QS1aXl9gYS16e3x9fl0rKSpAW0EtWmEtejAtOV0oW0EtWmEtejAtOS1dezAsNjF9W0EtWmEtejAtOV0pPyhcXC5bQS1aYS16MC05XShbQS1aYS16MC05LV17MCw2MX1bQS1aYS16MC05XSk/KSokLztcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm92aWRlcyBhIHNldCBvZiBidWlsdC1pbiB2YWxpZGF0b3JzIHRoYXQgY2FuIGJlIHVzZWQgYnkgZm9ybSBjb250cm9scy5cbiAqXG4gKiBBIHZhbGlkYXRvciBpcyBhIGZ1bmN0aW9uIHRoYXQgcHJvY2Vzc2VzIGEgYEZvcm1Db250cm9sYCBvciBjb2xsZWN0aW9uIG9mXG4gKiBjb250cm9scyBhbmQgcmV0dXJucyBhbiBlcnJvciBtYXAgb3IgbnVsbC4gQSBudWxsIG1hcCBtZWFucyB0aGF0IHZhbGlkYXRpb24gaGFzIHBhc3NlZC5cbiAqXG4gKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKC9ndWlkZS9mb3JtLXZhbGlkYXRpb24pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgVmFsaWRhdG9ycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWYWxpZGF0b3JzKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgbnVtYmVyLlxuICAgICAqIFRoZSB2YWxpZGF0b3IgZXhpc3RzIG9ubHkgYXMgYSBmdW5jdGlvbiBhbmQgbm90IGFzIGEgZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKlxuICAgICAqICMjIyBWYWxpZGF0ZSBhZ2FpbnN0IGEgbWluaW11bSBvZiAzXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgyLCBWYWxpZGF0b3JzLm1pbigzKSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHttaW46IHttaW46IDMsIGFjdHVhbDogMn19XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlXG4gICAgICogYG1pbmAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICpcbiAgICAgKi9cbiAgICBWYWxpZGF0b3JzLm1pbiA9IGZ1bmN0aW9uIChtaW4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eUlucHV0VmFsdWUoY29udHJvbC52YWx1ZSkgfHwgaXNFbXB0eUlucHV0VmFsdWUobWluKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHBhcnNlRmxvYXQoY29udHJvbC52YWx1ZSk7XG4gICAgICAgICAgICAvLyBDb250cm9scyB3aXRoIE5hTiB2YWx1ZXMgYWZ0ZXIgcGFyc2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBub3QgaGF2aW5nIGFcbiAgICAgICAgICAgIC8vIG1pbmltdW0sIHBlciB0aGUgSFRNTCBmb3JtcyBzcGVjOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNhdHRyLWlucHV0LW1pblxuICAgICAgICAgICAgcmV0dXJuICFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPCBtaW4gPyB7ICdtaW4nOiB7ICdtaW4nOiBtaW4sICdhY3R1YWwnOiBjb250cm9sLnZhbHVlIH0gfSA6IG51bGw7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgbnVtYmVyLlxuICAgICAqIFRoZSB2YWxpZGF0b3IgZXhpc3RzIG9ubHkgYXMgYSBmdW5jdGlvbiBhbmQgbm90IGFzIGEgZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKlxuICAgICAqICMjIyBWYWxpZGF0ZSBhZ2FpbnN0IGEgbWF4aW11bSBvZiAxNVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woMTYsIFZhbGlkYXRvcnMubWF4KDE1KSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHttYXg6IHttYXg6IDE1LCBhY3R1YWw6IDE2fX1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGVcbiAgICAgKiBgbWF4YCBwcm9wZXJ0eSBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICAgKlxuICAgICAqL1xuICAgIFZhbGlkYXRvcnMubWF4ID0gZnVuY3Rpb24gKG1heCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSB8fCBpc0VtcHR5SW5wdXRWYWx1ZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKTtcbiAgICAgICAgICAgIC8vIENvbnRyb2xzIHdpdGggTmFOIHZhbHVlcyBhZnRlciBwYXJzaW5nIHNob3VsZCBiZSB0cmVhdGVkIGFzIG5vdCBoYXZpbmcgYVxuICAgICAgICAgICAgLy8gbWF4aW11bSwgcGVyIHRoZSBIVE1MIGZvcm1zIHNwZWM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9mb3Jtcy5odG1sI2F0dHItaW5wdXQtbWF4XG4gICAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+IG1heCA/IHsgJ21heCc6IHsgJ21heCc6IG1heCwgJ2FjdHVhbCc6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sIGhhdmUgYSBub24tZW1wdHkgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqXG4gICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIGlzIG5vbi1lbXB0eVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7cmVxdWlyZWQ6IHRydWV9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBlcnJvciBtYXAgd2l0aCB0aGUgYHJlcXVpcmVkYCBwcm9wZXJ0eVxuICAgICAqIGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgIHJldHVybiBpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSA/IHsgJ3JlcXVpcmVkJzogdHJ1ZSB9IDogbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sJ3MgdmFsdWUgYmUgdHJ1ZS4gVGhpcyB2YWxpZGF0b3IgaXMgY29tbW9ubHlcbiAgICAgKiB1c2VkIGZvciByZXF1aXJlZCBjaGVja2JveGVzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKlxuICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCB2YWx1ZSBpcyB0cnVlXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZFRydWUpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7cmVxdWlyZWQ6IHRydWV9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBlcnJvciBtYXAgdGhhdCBjb250YWlucyB0aGUgYHJlcXVpcmVkYCBwcm9wZXJ0eVxuICAgICAqIHNldCB0byBgdHJ1ZWAgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlZFRydWUgPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gY29udHJvbC52YWx1ZSA9PT0gdHJ1ZSA/IG51bGwgOiB7ICdyZXF1aXJlZCc6IHRydWUgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sJ3MgdmFsdWUgcGFzcyBhbiBlbWFpbCB2YWxpZGF0aW9uIHRlc3QuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqXG4gICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIG1hdGNoZXMgYSB2YWxpZCBlbWFpbCBwYXR0ZXJuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnYmFkQCcsIFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7ZW1haWw6IHRydWV9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBlcnJvciBtYXAgd2l0aCB0aGUgYGVtYWlsYCBwcm9wZXJ0eVxuICAgICAqIGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5lbWFpbCA9IGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9sc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFTUFJTF9SRUdFWFAudGVzdChjb250cm9sLnZhbHVlKSA/IG51bGwgOiB7ICdlbWFpbCc6IHRydWUgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWxcbiAgICAgKiB0byB0aGUgcHJvdmlkZWQgbWluaW11bSBsZW5ndGguIFRoaXMgdmFsaWRhdG9yIGlzIGFsc28gcHJvdmlkZWQgYnkgZGVmYXVsdCBpZiB5b3UgdXNlIHRoZVxuICAgICAqIHRoZSBIVE1MNSBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqXG4gICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIGhhcyBhIG1pbmltdW0gb2YgMyBjaGFyYWN0ZXJzXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnbmcnLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgzKSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHttaW5sZW5ndGg6IHtyZXF1aXJlZExlbmd0aDogMywgYWN0dWFsTGVuZ3RoOiAyfX1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQgbWlubGVuZ3RoPVwiNVwiPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVycm9yIG1hcCB3aXRoIHRoZVxuICAgICAqIGBtaW5sZW5ndGhgIGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLlxuICAgICAqL1xuICAgIFZhbGlkYXRvcnMubWluTGVuZ3RoID0gZnVuY3Rpb24gKG1pbkxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBjb250cm9sLnZhbHVlID8gY29udHJvbC52YWx1ZS5sZW5ndGggOiAwO1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCA8IG1pbkxlbmd0aCA/XG4gICAgICAgICAgICAgICAgeyAnbWlubGVuZ3RoJzogeyAncmVxdWlyZWRMZW5ndGgnOiBtaW5MZW5ndGgsICdhY3R1YWxMZW5ndGgnOiBsZW5ndGggfSB9IDpcbiAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbFxuICAgICAqIHRvIHRoZSBwcm92aWRlZCBtYXhpbXVtIGxlbmd0aC4gVGhpcyB2YWxpZGF0b3IgaXMgYWxzbyBwcm92aWRlZCBieSBkZWZhdWx0IGlmIHlvdSB1c2UgdGhlXG4gICAgICogdGhlIEhUTUw1IGBtYXhsZW5ndGhgIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICpcbiAgICAgKiAjIyMgVmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgaGFzIG1heGltdW0gb2YgNSBjaGFyYWN0ZXJzXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnQW5ndWxhcicsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUpKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge21heGxlbmd0aDoge3JlcXVpcmVkTGVuZ3RoOiA1LCBhY3R1YWxMZW5ndGg6IDd9fVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dCBtYXhsZW5ndGg9XCI1XCI+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlXG4gICAgICogYG1heGxlbmd0aGAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5tYXhMZW5ndGggPSBmdW5jdGlvbiAobWF4TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGNvbnRyb2wudmFsdWUgPyBjb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7XG4gICAgICAgICAgICByZXR1cm4gbGVuZ3RoID4gbWF4TGVuZ3RoID9cbiAgICAgICAgICAgICAgICB7ICdtYXhsZW5ndGgnOiB7ICdyZXF1aXJlZExlbmd0aCc6IG1heExlbmd0aCwgJ2FjdHVhbExlbmd0aCc6IGxlbmd0aCB9IH0gOlxuICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCdzIHZhbHVlIHRvIG1hdGNoIGEgcmVnZXggcGF0dGVybi4gVGhpcyB2YWxpZGF0b3IgaXMgYWxzb1xuICAgICAqIHByb3ZpZGVkIGJ5IGRlZmF1bHQgaWYgeW91IHVzZSB0aGUgSFRNTDUgYHBhdHRlcm5gIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBpZiBhIFJlZ2V4cCBpcyBwcm92aWRlZCwgdGhlIFJlZ2V4cCBpcyB1c2VkIGFzIGlzIHRvIHRlc3QgdGhlIHZhbHVlcy4gT24gdGhlIG90aGVyXG4gICAgICogaGFuZCwgaWYgYSBzdHJpbmcgaXMgcGFzc2VkLCB0aGUgYF5gIGNoYXJhY3RlciBpcyBwcmVwZW5kZWQgYW5kIHRoZSBgJGAgY2hhcmFjdGVyIGlzXG4gICAgICogYXBwZW5kZWQgdG8gdGhlIHByb3ZpZGVkIHN0cmluZyAoaWYgbm90IGFscmVhZHkgcHJlc2VudCksIGFuZCB0aGUgcmVzdWx0aW5nIHJlZ3VsYXJcbiAgICAgKiBleHByZXNzaW9uIGlzIHVzZWQgdG8gdGVzdCB0aGUgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKlxuICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCBvbmx5IGNvbnRhaW5zIGxldHRlcnMgb3Igc3BhY2VzXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnMScsIFZhbGlkYXRvcnMucGF0dGVybignW2EtekEtWiBdKicpKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge3BhdHRlcm46IHtyZXF1aXJlZFBhdHRlcm46ICdeW2EtekEtWiBdKiQnLCBhY3R1YWxWYWx1ZTogJzEnfX1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQgcGF0dGVybj1cIlthLXpBLVogXSpcIj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGVcbiAgICAgKiBgcGF0dGVybmAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5wYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgaWYgKCFwYXR0ZXJuKVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcjtcbiAgICAgICAgdmFyIHJlZ2V4O1xuICAgICAgICB2YXIgcmVnZXhTdHI7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlZ2V4U3RyID0gJyc7XG4gICAgICAgICAgICBpZiAocGF0dGVybi5jaGFyQXQoMCkgIT09ICdeJylcbiAgICAgICAgICAgICAgICByZWdleFN0ciArPSAnXic7XG4gICAgICAgICAgICByZWdleFN0ciArPSBwYXR0ZXJuO1xuICAgICAgICAgICAgaWYgKHBhdHRlcm4uY2hhckF0KHBhdHRlcm4ubGVuZ3RoIC0gMSkgIT09ICckJylcbiAgICAgICAgICAgICAgICByZWdleFN0ciArPSAnJCc7XG4gICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocmVnZXhTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnZXhTdHIgPSBwYXR0ZXJuLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICByZWdleCA9IHBhdHRlcm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eUlucHV0VmFsdWUoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QodmFsdWUpID8gbnVsbCA6XG4gICAgICAgICAgICAgICAgeyAncGF0dGVybic6IHsgJ3JlcXVpcmVkUGF0dGVybic6IHJlZ2V4U3RyLCAnYWN0dWFsVmFsdWUnOiB2YWx1ZSB9IH07XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBWYWxpZGF0b3IgdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yID0gZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIG51bGw7IH07XG4gICAgVmFsaWRhdG9ycy5jb21wb3NlID0gZnVuY3Rpb24gKHZhbGlkYXRvcnMpIHtcbiAgICAgICAgaWYgKCF2YWxpZGF0b3JzKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHZhciBwcmVzZW50VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMuZmlsdGVyKGlzUHJlc2VudCk7XG4gICAgICAgIGlmIChwcmVzZW50VmFsaWRhdG9ycy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBfbWVyZ2VFcnJvcnMoX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBDb21wb3NlIG11bHRpcGxlIGFzeW5jIHZhbGlkYXRvcnMgaW50byBhIHNpbmdsZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHVuaW9uXG4gICAgICogb2YgdGhlIGluZGl2aWR1YWwgZXJyb3Igb2JqZWN0cyBmb3IgdGhlIHByb3ZpZGVkIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlXG4gICAgICogbWVyZ2VkIGVycm9yIG9iamVjdHMgb2YgdGhlIGFzeW5jIHZhbGlkYXRvcnMgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAgKi9cbiAgICBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyA9IGZ1bmN0aW9uICh2YWxpZGF0b3JzKSB7XG4gICAgICAgIGlmICghdmFsaWRhdG9ycylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgcHJlc2VudFZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzLmZpbHRlcihpc1ByZXNlbnQpO1xuICAgICAgICBpZiAocHJlc2VudFZhbGlkYXRvcnMubGVuZ3RoID09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2YWJsZXMgPSBfZXhlY3V0ZUFzeW5jVmFsaWRhdG9ycyhjb250cm9sLCBwcmVzZW50VmFsaWRhdG9ycykubWFwKHRvT2JzZXJ2YWJsZSk7XG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4ob2JzZXJ2YWJsZXMpLnBpcGUobWFwKF9tZXJnZUVycm9ycykpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIFZhbGlkYXRvcnM7XG59KCkpO1xuZnVuY3Rpb24gaXNQcmVzZW50KG8pIHtcbiAgICByZXR1cm4gbyAhPSBudWxsO1xufVxuZnVuY3Rpb24gdG9PYnNlcnZhYmxlKHIpIHtcbiAgICB2YXIgb2JzID0gybVpc1Byb21pc2UocikgPyBmcm9tKHIpIDogcjtcbiAgICBpZiAoISjJtWlzT2JzZXJ2YWJsZShvYnMpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCB2YWxpZGF0b3IgdG8gcmV0dXJuIFByb21pc2Ugb3IgT2JzZXJ2YWJsZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBvYnM7XG59XG5mdW5jdGlvbiBfZXhlY3V0ZVZhbGlkYXRvcnMoY29udHJvbCwgdmFsaWRhdG9ycykge1xuICAgIHJldHVybiB2YWxpZGF0b3JzLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdihjb250cm9sKTsgfSk7XG59XG5mdW5jdGlvbiBfZXhlY3V0ZUFzeW5jVmFsaWRhdG9ycyhjb250cm9sLCB2YWxpZGF0b3JzKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnMubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2KGNvbnRyb2wpOyB9KTtcbn1cbmZ1bmN0aW9uIF9tZXJnZUVycm9ycyhhcnJheU9mRXJyb3JzKSB7XG4gICAgdmFyIHJlcyA9IGFycmF5T2ZFcnJvcnMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGVycm9ycykge1xuICAgICAgICByZXR1cm4gZXJyb3JzICE9IG51bGwgPyBfX2Fzc2lnbih7fSwgcmVzLCBlcnJvcnMpIDogcmVzO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPT09IDAgPyBudWxsIDogcmVzO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVWYWxpZGF0b3IodmFsaWRhdG9yKSB7XG4gICAgaWYgKHZhbGlkYXRvci52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMpIHsgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZShjKTsgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplQXN5bmNWYWxpZGF0b3IodmFsaWRhdG9yKSB7XG4gICAgaWYgKHZhbGlkYXRvci52YWxpZGF0ZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMpIHsgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0ZShjKTsgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3I7XG4gICAgfVxufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgTlVNQkVSX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE51bWJlclZhbHVlQWNjZXNzb3I7IH0pLFxuICAgIG11bHRpOiB0cnVlXG59O1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgbnVtYmVyIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gbnVtYmVyIGlucHV0IGNoYW5nZXMuXG4gKiBUaGUgdmFsdWUgYWNjZXNzb3IgaXMgdXNlZCBieSB0aGUgYEZvcm1Db250cm9sRGlyZWN0aXZlYCwgYEZvcm1Db250cm9sTmFtZWAsIGFuZCAgYE5nTW9kZWxgXG4gKiBkaXJlY3RpdmVzLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIFVzaW5nIGEgbnVtYmVyIGlucHV0IHdpdGggYSByZWFjdGl2ZSBmb3JtLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGEgbnVtYmVyIGlucHV0IHdpdGggYSByZWFjdGl2ZSBmb3JtLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB0b3RhbENvdW50Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICogYGBgXG4gKlxuICogYGBgXG4gKiA8aW5wdXQgdHlwZT1cIm51bWJlclwiIFtmb3JtQ29udHJvbF09XCJ0b3RhbENvdW50Q29udHJvbFwiPlxuICogYGBgXG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTnVtYmVyVmFsdWVBY2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOdW1iZXJWYWx1ZUFjY2Vzc29yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvciBpbnB1dCBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0XG4gICAgICAgICAqIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKF8pIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFwidmFsdWVcIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY2hlY2tlZCB2YWx1ZVxuICAgICAqL1xuICAgIE51bWJlclZhbHVlQWNjZXNzb3IucHJvdG90eXBlLndyaXRlVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gVGhlIHZhbHVlIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgZm9yIElFOSwgb3RoZXJ3aXNlIGl0IGlzIHNldCB0byAnbnVsbCcgd2hlbiBudWxsXG4gICAgICAgIHZhciBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBOdW1iZXJWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5yZWdpc3Rlck9uQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHsgZm4odmFsdWUgPT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh2YWx1ZSkpOyB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBOdW1iZXJWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5yZWdpc3Rlck9uVG91Y2hlZCA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFwiZGlzYWJsZWRcIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZVxuICAgICAqL1xuICAgIE51bWJlclZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnNldERpc2FibGVkU3RhdGUgPSBmdW5jdGlvbiAoaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH07XG4gICAgTnVtYmVyVmFsdWVBY2Nlc3NvciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdpbnB1dFt0eXBlPW51bWJlcl1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPW51bWJlcl1bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9bnVtYmVyXVtuZ01vZGVsXScsXG4gICAgICAgICAgICBob3N0OiB7XG4gICAgICAgICAgICAgICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAgICAgICAgICAgICAnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgICAgICAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtOVU1CRVJfVkFMVUVfQUNDRVNTT1JdXG4gICAgICAgIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1JlbmRlcmVyMiwgRWxlbWVudFJlZl0pXG4gICAgXSwgTnVtYmVyVmFsdWVBY2Nlc3Nvcik7XG4gICAgcmV0dXJuIE51bWJlclZhbHVlQWNjZXNzb3I7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUkFESU9fVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvcjsgfSksXG4gICAgbXVsdGk6IHRydWVcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ2xhc3MgdXNlZCBieSBBbmd1bGFyIHRvIHRyYWNrIHJhZGlvIGJ1dHRvbnMuIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAqL1xudmFyIFJhZGlvQ29udHJvbFJlZ2lzdHJ5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJhZGlvQ29udHJvbFJlZ2lzdHJ5KCkge1xuICAgICAgICB0aGlzLl9hY2Nlc3NvcnMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQWRkcyBhIGNvbnRyb2wgdG8gdGhlIGludGVybmFsIHJlZ2lzdHJ5LiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sUmVnaXN0cnkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChjb250cm9sLCBhY2Nlc3Nvcikge1xuICAgICAgICB0aGlzLl9hY2Nlc3NvcnMucHVzaChbY29udHJvbCwgYWNjZXNzb3JdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlbW92ZXMgYSBjb250cm9sIGZyb20gdGhlIGludGVybmFsIHJlZ2lzdHJ5LiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sUmVnaXN0cnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChhY2Nlc3Nvcikge1xuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fYWNjZXNzb3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYWNjZXNzb3JzW2ldWzFdID09PSBhY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc29ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTZWxlY3RzIGEgcmFkaW8gYnV0dG9uLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sUmVnaXN0cnkucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIChhY2Nlc3Nvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9hY2Nlc3NvcnMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgaWYgKF90aGlzLl9pc1NhbWVHcm91cChjLCBhY2Nlc3NvcikgJiYgY1sxXSAhPT0gYWNjZXNzb3IpIHtcbiAgICAgICAgICAgICAgICBjWzFdLmZpcmVVbmNoZWNrKGFjY2Vzc29yLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBSYWRpb0NvbnRyb2xSZWdpc3RyeS5wcm90b3R5cGUuX2lzU2FtZUdyb3VwID0gZnVuY3Rpb24gKGNvbnRyb2xQYWlyLCBhY2Nlc3Nvcikge1xuICAgICAgICBpZiAoIWNvbnRyb2xQYWlyWzBdLmNvbnRyb2wpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb250cm9sUGFpclswXS5fcGFyZW50ID09PSBhY2Nlc3Nvci5fY29udHJvbC5fcGFyZW50ICYmXG4gICAgICAgICAgICBjb250cm9sUGFpclsxXS5uYW1lID09PSBhY2Nlc3Nvci5uYW1lO1xuICAgIH07XG4gICAgUmFkaW9Db250cm9sUmVnaXN0cnkgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5qZWN0YWJsZSgpXG4gICAgXSwgUmFkaW9Db250cm9sUmVnaXN0cnkpO1xuICAgIHJldHVybiBSYWRpb0NvbnRyb2xSZWdpc3RyeTtcbn0oKSk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgcmFkaW8gY29udHJvbCB2YWx1ZXMgYW5kIGxpc3RlbmluZyB0byByYWRpbyBjb250cm9sXG4gKiBjaGFuZ2VzLiBUaGUgdmFsdWUgYWNjZXNzb3IgaXMgdXNlZCBieSB0aGUgYEZvcm1Db250cm9sRGlyZWN0aXZlYCwgYEZvcm1Db250cm9sTmFtZWAsIGFuZFxuICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgVXNpbmcgcmFkaW8gYnV0dG9ucyB3aXRoIHJlYWN0aXZlIGZvcm0gZGlyZWN0aXZlc1xuICpcbiAqIFRoZSBmb2xsb3cgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHJhZGlvIGJ1dHRvbnMgaW4gYSByZWFjdGl2ZSBmb3JtLiBXaGVuIHVzaW5nIHJhZGlvIGJ1dHRvbnMgaW5cbiAqIGEgcmVhY3RpdmUgZm9ybSwgcmFkaW8gYnV0dG9ucyBpbiB0aGUgc2FtZSBncm91cCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBgZm9ybUNvbnRyb2xOYW1lYC5cbiAqIFByb3ZpZGluZyBhIGBuYW1lYCBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuXG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL3JlYWN0aXZlUmFkaW9CdXR0b25zL3JlYWN0aXZlX3JhZGlvX2J1dHRvbl9leGFtcGxlLnRzIHJlZ2lvbj0nUmVhY3RpdmUnfVxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmLCBfcmVnaXN0cnksIF9pbmplY3Rvcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjtcbiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmO1xuICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IF9yZWdpc3RyeTtcbiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluaXRpYWxpemVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUubmdPbkluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQoTmdDb250cm9sKTtcbiAgICAgICAgdGhpcy5fY2hlY2tOYW1lKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdHJ5LmFkZCh0aGlzLl9jb250cm9sLCB0aGlzKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGJlZm9yZSB0aGUgZGlyZWN0aXZlJ3MgaW5zdGFuY2UgaXMgZGVzdHJveWVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3JlZ2lzdHJ5LnJlbW92ZSh0aGlzKTsgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTZXRzIHRoZSBcImNoZWNrZWRcIiBwcm9wZXJ0eSB2YWx1ZSBvbiB0aGUgcmFkaW8gaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY2hlY2tlZCB2YWx1ZVxuICAgICAqL1xuICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLndyaXRlVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB2YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2hlY2tlZCcsIHRoaXMuX3N0YXRlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJPbkNoYW5nZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9mbiA9IGZuO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZm4oX3RoaXMudmFsdWUpO1xuICAgICAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5LnNlbGVjdChfdGhpcyk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBcInZhbHVlXCIgb24gdGhlIHJhZGlvIGlucHV0IGVsZW1lbnQgYW5kIHVuY2hlY2tzIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUuZmlyZVVuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTsgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25Ub3VjaGVkID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMub25Ub3VjaGVkID0gZm47IH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgXCJkaXNhYmxlZFwiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlXG4gICAgICovXG4gICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUuc2V0RGlzYWJsZWRTdGF0ZSA9IGZ1bmN0aW9uIChpc0Rpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XG4gICAgfTtcbiAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fY2hlY2tOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5uYW1lICYmIHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMubmFtZSAhPT0gdGhpcy5mb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rocm93TmFtZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm5hbWUgJiYgdGhpcy5mb3JtQ29udHJvbE5hbWUpXG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmZvcm1Db250cm9sTmFtZTtcbiAgICB9O1xuICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLl90aHJvd05hbWVFcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXFxuICAgICAgSWYgeW91IGRlZmluZSBib3RoIGEgbmFtZSBhbmQgYSBmb3JtQ29udHJvbE5hbWUgYXR0cmlidXRlIG9uIHlvdXIgcmFkaW8gYnV0dG9uLCB0aGVpciB2YWx1ZXNcXG4gICAgICBtdXN0IG1hdGNoLiBFeDogPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBmb3JtQ29udHJvbE5hbWU9XFxcImZvb2RcXFwiIG5hbWU9XFxcImZvb2RcXFwiPlxcbiAgICBcIik7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZylcbiAgICBdLCBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZSwgXCJuYW1lXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBTdHJpbmcpXG4gICAgXSwgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUsIFwiZm9ybUNvbnRyb2xOYW1lXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUsIFwidmFsdWVcIiwgdm9pZCAwKTtcbiAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ2lucHV0W3R5cGU9cmFkaW9dW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1yYWRpb11bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9cmFkaW9dW25nTW9kZWxdJyxcbiAgICAgICAgICAgIGhvc3Q6IHsgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCknLCAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJyB9LFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbUkFESU9fVkFMVUVfQUNDRVNTT1JdXG4gICAgICAgIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1JlbmRlcmVyMiwgRWxlbWVudFJlZixcbiAgICAgICAgICAgIFJhZGlvQ29udHJvbFJlZ2lzdHJ5LCBJbmplY3Rvcl0pXG4gICAgXSwgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvcik7XG4gICAgcmV0dXJuIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3I7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgUkFOR0VfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gUmFuZ2VWYWx1ZUFjY2Vzc29yOyB9KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBhIHJhbmdlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gcmFuZ2UgaW5wdXQgY2hhbmdlcy5cbiAqIFRoZSB2YWx1ZSBhY2Nlc3NvciBpcyB1c2VkIGJ5IHRoZSBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgLCBgRm9ybUNvbnRyb2xOYW1lYCwgYW5kICBgTmdNb2RlbGBcbiAqIGRpcmVjdGl2ZXMuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgVXNpbmcgYSByYW5nZSBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGEgcmFuZ2UgaW5wdXQgd2l0aCBhIHJlYWN0aXZlIGZvcm0uXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGFnZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPGlucHV0IHR5cGU9XCJyYW5nZVwiIFtmb3JtQ29udHJvbF09XCJhZ2VDb250cm9sXCI+XG4gKiBgYGBcbiAqXG4gKiBAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBSYW5nZVZhbHVlQWNjZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZ2VWYWx1ZUFjY2Vzc29yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvciBpbnB1dCBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0XG4gICAgICAgICAqIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZnVuY3Rpb24gKF8pIHsgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFwidmFsdWVcIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY2hlY2tlZCB2YWx1ZVxuICAgICAqL1xuICAgIFJhbmdlVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5yZWdpc3Rlck9uQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAodmFsdWUpIHsgZm4odmFsdWUgPT0gJycgPyBudWxsIDogcGFyc2VGbG9hdCh2YWx1ZSkpOyB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBSYW5nZVZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25Ub3VjaGVkID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMub25Ub3VjaGVkID0gZm47IH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgXCJkaXNhYmxlZFwiIHByb3BlcnR5IG9uIHRoZSByYW5nZSBpbnB1dCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlXG4gICAgICovXG4gICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5zZXREaXNhYmxlZFN0YXRlID0gZnVuY3Rpb24gKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9O1xuICAgIFJhbmdlVmFsdWVBY2Nlc3NvciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdpbnB1dFt0eXBlPXJhbmdlXVtmb3JtQ29udHJvbE5hbWVdLGlucHV0W3R5cGU9cmFuZ2VdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPXJhbmdlXVtuZ01vZGVsXScsXG4gICAgICAgICAgICBob3N0OiB7XG4gICAgICAgICAgICAgICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAgICAgICAgICAgICAnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgICAgICAgICAgICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtSQU5HRV9WQUxVRV9BQ0NFU1NPUl1cbiAgICAgICAgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbUmVuZGVyZXIyLCBFbGVtZW50UmVmXSlcbiAgICBdLCBSYW5nZVZhbHVlQWNjZXNzb3IpO1xuICAgIHJldHVybiBSYW5nZVZhbHVlQWNjZXNzb3I7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRm9ybUVycm9yRXhhbXBsZXMgPSB7XG4gICAgZm9ybUNvbnRyb2xOYW1lOiBcIlxcbiAgICA8ZGl2IFtmb3JtR3JvdXBdPVxcXCJteUdyb3VwXFxcIj5cXG4gICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVxcXCJmaXJzdE5hbWVcXFwiPlxcbiAgICA8L2Rpdj5cXG5cXG4gICAgSW4geW91ciBjbGFzczpcXG5cXG4gICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XFxuICAgICAgIGZpcnN0TmFtZTogbmV3IEZvcm1Db250cm9sKClcXG4gICAgfSk7XCIsXG4gICAgZm9ybUdyb3VwTmFtZTogXCJcXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cXFwibXlHcm91cFxcXCI+XFxuICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT1cXFwicGVyc29uXFxcIj5cXG4gICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cXFwiZmlyc3ROYW1lXFxcIj5cXG4gICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcblxcbiAgICBJbiB5b3VyIGNsYXNzOlxcblxcbiAgICB0aGlzLm15R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcXG4gICAgICAgcGVyc29uOiBuZXcgRm9ybUdyb3VwKHsgZmlyc3ROYW1lOiBuZXcgRm9ybUNvbnRyb2woKSB9KVxcbiAgICB9KTtcIixcbiAgICBmb3JtQXJyYXlOYW1lOiBcIlxcbiAgICA8ZGl2IFtmb3JtR3JvdXBdPVxcXCJteUdyb3VwXFxcIj5cXG4gICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XFxcImNpdGllc1xcXCI+XFxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cXFwibGV0IGNpdHkgb2YgY2l0eUFycmF5LmNvbnRyb2xzOyBpbmRleCBhcyBpXFxcIj5cXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVxcXCJpXFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG5cXG4gICAgSW4geW91ciBjbGFzczpcXG5cXG4gICAgdGhpcy5jaXR5QXJyYXkgPSBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUNvbnRyb2woJ1NGJyldKTtcXG4gICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XFxuICAgICAgY2l0aWVzOiB0aGlzLmNpdHlBcnJheVxcbiAgICB9KTtcIixcbiAgICBuZ01vZGVsR3JvdXA6IFwiXFxuICAgIDxmb3JtPlxcbiAgICAgICA8ZGl2IG5nTW9kZWxHcm91cD1cXFwicGVyc29uXFxcIj5cXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVxcXCJwZXJzb24ubmFtZVxcXCIgbmFtZT1cXFwiZmlyc3ROYW1lXFxcIj5cXG4gICAgICAgPC9kaXY+XFxuICAgIDwvZm9ybT5cIixcbiAgICBuZ01vZGVsV2l0aEZvcm1Hcm91cDogXCJcXG4gICAgPGRpdiBbZm9ybUdyb3VwXT1cXFwibXlHcm91cFxcXCI+XFxuICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XFxcImZpcnN0TmFtZVxcXCI+XFxuICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cXFwic2hvd01vcmVDb250cm9sc1xcXCIgW25nTW9kZWxPcHRpb25zXT1cXFwie3N0YW5kYWxvbmU6IHRydWV9XFxcIj5cXG4gICAgPC9kaXY+XFxuICBcIlxufTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFJlYWN0aXZlRXJyb3JzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlYWN0aXZlRXJyb3JzKCkge1xuICAgIH1cbiAgICBSZWFjdGl2ZUVycm9ycy5jb250cm9sUGFyZW50RXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtQ29udHJvbE5hbWUgbXVzdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS4gIFlvdSdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cFxcbiAgICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuXFxuXFxuICAgICAgRXhhbXBsZTpcXG5cXG4gICAgICBcIiArIEZvcm1FcnJvckV4YW1wbGVzLmZvcm1Db250cm9sTmFtZSk7XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVycm9ycy5uZ01vZGVsR3JvdXBFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZvcm1Db250cm9sTmFtZSBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIG5nTW9kZWxHcm91cCBwYXJlbnQuIEl0IGlzIG9ubHkgY29tcGF0aWJsZSB3aXRoIHBhcmVudHNcXG4gICAgICAgdGhhdCBhbHNvIGhhdmUgYSBcXFwiZm9ybVxcXCIgcHJlZml4OiBmb3JtR3JvdXBOYW1lLCBmb3JtQXJyYXlOYW1lLCBvciBmb3JtR3JvdXAuXFxuXFxuICAgICAgIE9wdGlvbiAxOiAgVXBkYXRlIHRoZSBwYXJlbnQgdG8gYmUgZm9ybUdyb3VwTmFtZSAocmVhY3RpdmUgZm9ybSBzdHJhdGVneSlcXG5cXG4gICAgICAgIFwiICsgRm9ybUVycm9yRXhhbXBsZXMuZm9ybUdyb3VwTmFtZSArIFwiXFxuXFxuICAgICAgICBPcHRpb24gMjogVXNlIG5nTW9kZWwgaW5zdGVhZCBvZiBmb3JtQ29udHJvbE5hbWUgKHRlbXBsYXRlLWRyaXZlbiBzdHJhdGVneSlcXG5cXG4gICAgICAgIFwiICsgRm9ybUVycm9yRXhhbXBsZXMubmdNb2RlbEdyb3VwKTtcbiAgICB9O1xuICAgIFJlYWN0aXZlRXJyb3JzLm1pc3NpbmdGb3JtRXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtR3JvdXAgZXhwZWN0cyBhIEZvcm1Hcm91cCBpbnN0YW5jZS4gUGxlYXNlIHBhc3Mgb25lIGluLlxcblxcbiAgICAgICBFeGFtcGxlOlxcblxcbiAgICAgICBcIiArIEZvcm1FcnJvckV4YW1wbGVzLmZvcm1Db250cm9sTmFtZSk7XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVycm9ycy5ncm91cFBhcmVudEV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZm9ybUdyb3VwTmFtZSBtdXN0IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgWW91J2xsIHdhbnQgdG8gYWRkIGEgZm9ybUdyb3VwXFxuICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLlxcblxcbiAgICAgIEV4YW1wbGU6XFxuXFxuICAgICAgXCIgKyBGb3JtRXJyb3JFeGFtcGxlcy5mb3JtR3JvdXBOYW1lKTtcbiAgICB9O1xuICAgIFJlYWN0aXZlRXJyb3JzLmFycmF5UGFyZW50RXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtQXJyYXlOYW1lIG11c3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBZb3UnbGwgd2FudCB0byBhZGQgYSBmb3JtR3JvdXBcXG4gICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLlxcblxcbiAgICAgICAgRXhhbXBsZTpcXG5cXG4gICAgICAgIFwiICsgRm9ybUVycm9yRXhhbXBsZXMuZm9ybUFycmF5TmFtZSk7XG4gICAgfTtcbiAgICBSZWFjdGl2ZUVycm9ycy5kaXNhYmxlZEF0dHJXYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJcXG4gICAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpdGggYSByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZS4gSWYgeW91IHNldCBkaXNhYmxlZCB0byB0cnVlXFxuICAgICAgd2hlbiB5b3Ugc2V0IHVwIHRoaXMgY29udHJvbCBpbiB5b3VyIGNvbXBvbmVudCBjbGFzcywgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSB3aWxsIGFjdHVhbGx5IGJlIHNldCBpbiB0aGUgRE9NIGZvclxcbiAgICAgIHlvdS4gV2UgcmVjb21tZW5kIHVzaW5nIHRoaXMgYXBwcm9hY2ggdG8gYXZvaWQgJ2NoYW5nZWQgYWZ0ZXIgY2hlY2tlZCcgZXJyb3JzLlxcbiAgICAgICBcXG4gICAgICBFeGFtcGxlOiBcXG4gICAgICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XFxuICAgICAgICBmaXJzdDogbmV3IEZvcm1Db250cm9sKHt2YWx1ZTogJ05hbmN5JywgZGlzYWJsZWQ6IHRydWV9LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcXG4gICAgICAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnRHJldycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXFxuICAgICAgfSk7XFxuICAgIFwiKTtcbiAgICB9O1xuICAgIFJlYWN0aXZlRXJyb3JzLm5nTW9kZWxXYXJuaW5nID0gZnVuY3Rpb24gKGRpcmVjdGl2ZU5hbWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiXFxuICAgIEl0IGxvb2tzIGxpa2UgeW91J3JlIHVzaW5nIG5nTW9kZWwgb24gdGhlIHNhbWUgZm9ybSBmaWVsZCBhcyBcIiArIGRpcmVjdGl2ZU5hbWUgKyBcIi4gXFxuICAgIFN1cHBvcnQgZm9yIHVzaW5nIHRoZSBuZ01vZGVsIGlucHV0IHByb3BlcnR5IGFuZCBuZ01vZGVsQ2hhbmdlIGV2ZW50IHdpdGggXFxuICAgIHJlYWN0aXZlIGZvcm0gZGlyZWN0aXZlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBcXG4gICAgaW4gQW5ndWxhciB2Ny5cXG4gICAgXFxuICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIHNlZSBvdXIgQVBJIGRvY3MgaGVyZTpcXG4gICAgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9cIiArIChkaXJlY3RpdmVOYW1lID09PSAnZm9ybUNvbnRyb2wnID8gJ0Zvcm1Db250cm9sRGlyZWN0aXZlJ1xuICAgICAgICAgICAgOiAnRm9ybUNvbnRyb2xOYW1lJykgKyBcIiN1c2Utd2l0aC1uZ21vZGVsXFxuICAgIFwiKTtcbiAgICB9O1xuICAgIHJldHVybiBSZWFjdGl2ZUVycm9ycztcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBTRUxFQ1RfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3I7IH0pLFxuICAgIG11bHRpOiB0cnVlXG59O1xuZnVuY3Rpb24gX2J1aWxkVmFsdWVTdHJpbmcoaWQsIHZhbHVlKSB7XG4gICAgaWYgKGlkID09IG51bGwpXG4gICAgICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHZhbHVlID0gJ09iamVjdCc7XG4gICAgcmV0dXJuIChpZCArIFwiOiBcIiArIHZhbHVlKS5zbGljZSgwLCA1MCk7XG59XG5mdW5jdGlvbiBfZXh0cmFjdElkKHZhbHVlU3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgc2VsZWN0IGNvbnRyb2wgdmFsdWVzIGFuZCBsaXN0ZW5pbmcgdG8gc2VsZWN0IGNvbnRyb2xcbiAqIGNoYW5nZXMuIFRoZSB2YWx1ZSBhY2Nlc3NvciBpcyB1c2VkIGJ5IHRoZSBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgLCBgRm9ybUNvbnRyb2xOYW1lYCwgYW5kXG4gKiBgTmdNb2RlbGAgZGlyZWN0aXZlcy5cbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBVc2luZyBzZWxlY3QgY29udHJvbHMgaW4gYSByZWFjdGl2ZSBmb3JtXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IGhvdyB0byB1c2UgYSBzZWxlY3QgY29udHJvbCBpbiBhIHJlYWN0aXZlIGZvcm0uXG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL3JlYWN0aXZlU2VsZWN0Q29udHJvbC9yZWFjdGl2ZV9zZWxlY3RfY29udHJvbF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAqXG4gKiAjIyMgVXNpbmcgc2VsZWN0IGNvbnRyb2xzIGluIGEgdGVtcGxhdGUtZHJpdmVuIGZvcm1cbiAqXG4gKiBUbyB1c2UgYSBzZWxlY3QgaW4gYSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybSwgc2ltcGx5IGFkZCBhbiBgbmdNb2RlbGAgYW5kIGEgYG5hbWVgXG4gKiBhdHRyaWJ1dGUgdG8gdGhlIG1haW4gYDxzZWxlY3Q+YCB0YWcuXG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL3NlbGVjdENvbnRyb2wvc2VsZWN0X2NvbnRyb2xfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gKlxuICogIyMjIEN1c3RvbWl6aW5nIG9wdGlvbiBzZWxlY3Rpb25cbiAqXG4gKiBBbmd1bGFyIHVzZXMgb2JqZWN0IGlkZW50aXR5IHRvIHNlbGVjdCBvcHRpb24uIEl0J3MgcG9zc2libGUgZm9yIHRoZSBpZGVudGl0aWVzIG9mIGl0ZW1zXG4gKiB0byBjaGFuZ2Ugd2hpbGUgdGhlIGRhdGEgZG9lcyBub3QuIFRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHRoZSBpdGVtcyBhcmUgcHJvZHVjZWRcbiAqIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0IFJQQyBpcyByZS1ydW4uIEV2ZW4gaWYgdGhlIGRhdGEgaGFzbid0IGNoYW5nZWQsIHRoZVxuICogc2Vjb25kIHJlc3BvbnNlIHdpbGwgcHJvZHVjZSBvYmplY3RzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMuXG4gKlxuICogVG8gY3VzdG9taXplIHRoZSBkZWZhdWx0IG9wdGlvbiBjb21wYXJpc29uIGFsZ29yaXRobSwgYDxzZWxlY3Q+YCBzdXBwb3J0cyBgY29tcGFyZVdpdGhgIGlucHV0LlxuICogYGNvbXBhcmVXaXRoYCB0YWtlcyBhICoqZnVuY3Rpb24qKiB3aGljaCBoYXMgdHdvIGFyZ3VtZW50czogYG9wdGlvbjFgIGFuZCBgb3B0aW9uMmAuXG4gKiBJZiBgY29tcGFyZVdpdGhgIGlzIGdpdmVuLCBBbmd1bGFyIHNlbGVjdHMgb3B0aW9uIGJ5IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzZWxlY3RlZENvdW50cmllc0NvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPHNlbGVjdCBbY29tcGFyZVdpdGhdPVwiY29tcGFyZUZuXCIgIFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZENvdW50cmllc0NvbnRyb2xcIj5cbiAqICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb3VudHJ5IG9mIGNvdW50cmllc1wiIFtuZ1ZhbHVlXT1cImNvdW50cnlcIj5cbiAqICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fVxuICogICAgIDwvb3B0aW9uPlxuICogPC9zZWxlY3Q+XG4gKlxuICogY29tcGFyZUZuKGMxOiBDb3VudHJ5LCBjMjogQ291bnRyeSk6IGJvb2xlYW4ge1xuICogICAgIHJldHVybiBjMSAmJiBjMiA/IGMxLmlkID09PSBjMi5pZCA6IGMxID09PSBjMjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICoqTm90ZToqKiBXZSBsaXN0ZW4gdG8gdGhlICdjaGFuZ2UnIGV2ZW50IGJlY2F1c2UgJ2lucHV0JyBldmVudHMgYXJlbid0IGZpcmVkXG4gKiBmb3Igc2VsZWN0cyBpbiBGaXJlZm94IGFuZCBJRTpcbiAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwMjQzNTBcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzQ2NjAwNDUvXG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjtcbiAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX29wdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9pZENvdW50ZXIgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmdW5jdGlvbiAoXykgeyB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSDJtWxvb3NlSWRlbnRpY2FsO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLCBcImNvbXBhcmVXaXRoXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUcmFja3MgdGhlIG9wdGlvbiBjb21wYXJpc29uIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgaWRlbnRpdGllcyB3aGVuXG4gICAgICAgICAqIGNoZWNraW5nIGZvciBjaGFuZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb21wYXJlV2l0aCBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCBcIiArIEpTT04uc3RyaW5naWZ5KGZuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jb21wYXJlV2l0aCA9IGZuO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBcInZhbHVlXCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuIFRoZSBcInNlbGVjdGVkSW5kZXhcIlxuICAgICAqIHByb3BlcnR5IGlzIGFsc28gc2V0IGlmIGFuIElEIGlzIHByb3ZpZGVkIG9uIHRoZSBvcHRpb24gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgY2hlY2tlZCB2YWx1ZVxuICAgICAqL1xuICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS53cml0ZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5fZ2V0T3B0aW9uSWQodmFsdWUpO1xuICAgICAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWRJbmRleCcsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVTdHJpbmcgPSBfYnVpbGRWYWx1ZVN0cmluZyhpZCwgdmFsdWUpO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlU3RyaW5nKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25DaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZVN0cmluZykge1xuICAgICAgICAgICAgX3RoaXMudmFsdWUgPSBfdGhpcy5fZ2V0T3B0aW9uVmFsdWUodmFsdWVTdHJpbmcpO1xuICAgICAgICAgICAgZm4oX3RoaXMudmFsdWUpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJPblRvdWNoZWQgPSBmdW5jdGlvbiAoZm4pIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBcImRpc2FibGVkXCIgcHJvcGVydHkgb24gdGhlIHNlbGVjdCBpbnB1dCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlXG4gICAgICovXG4gICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnNldERpc2FibGVkU3RhdGUgPSBmdW5jdGlvbiAoaXNEaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fcmVnaXN0ZXJPcHRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAodGhpcy5faWRDb3VudGVyKyspLnRvU3RyaW5nKCk7IH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fZ2V0T3B0aW9uSWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmVXaXRoKHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpLCB2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fZ2V0T3B0aW9uVmFsdWUgPSBmdW5jdGlvbiAodmFsdWVTdHJpbmcpIHtcbiAgICAgICAgdmFyIGlkID0gX2V4dHJhY3RJZCh2YWx1ZVN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGlkKSA/IHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpIDogdmFsdWVTdHJpbmc7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtGdW5jdGlvbl0pXG4gICAgXSwgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLCBcImNvbXBhcmVXaXRoXCIsIG51bGwpO1xuICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ3NlbGVjdDpub3QoW211bHRpcGxlXSlbZm9ybUNvbnRyb2xOYW1lXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW2Zvcm1Db250cm9sXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW25nTW9kZWxdJyxcbiAgICAgICAgICAgIGhvc3Q6IHsgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJywgJyhibHVyKSc6ICdvblRvdWNoZWQoKScgfSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1NFTEVDVF9WQUxVRV9BQ0NFU1NPUl1cbiAgICAgICAgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbUmVuZGVyZXIyLCBFbGVtZW50UmVmXSlcbiAgICBdLCBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvcik7XG4gICAgcmV0dXJuIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yO1xufSgpKTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBNYXJrcyBgPG9wdGlvbj5gIGFzIGR5bmFtaWMsIHNvIEFuZ3VsYXIgY2FuIGJlIG5vdGlmaWVkIHdoZW4gb3B0aW9ucyBjaGFuZ2UuXG4gKlxuICogQHNlZSBgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JgXG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdTZWxlY3RPcHRpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdTZWxlY3RPcHRpb24oX2VsZW1lbnQsIF9yZW5kZXJlciwgX3NlbGVjdCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICB0aGlzLl9zZWxlY3QgPSBfc2VsZWN0O1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0KVxuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuX3NlbGVjdC5fcmVnaXN0ZXJPcHRpb24oKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nU2VsZWN0T3B0aW9uLnByb3RvdHlwZSwgXCJuZ1ZhbHVlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUcmFja3MgdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBvcHRpb24gZWxlbWVudC4gVW5saWtlIHRoZSB2YWx1ZSBiaW5kaW5nLFxuICAgICAgICAgKiBuZ1ZhbHVlIHN1cHBvcnRzIGJpbmRpbmcgdG8gb2JqZWN0cy5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0Ll9vcHRpb25NYXAuc2V0KHRoaXMuaWQsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZShfYnVpbGRWYWx1ZVN0cmluZyh0aGlzLmlkLCB2YWx1ZSkpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nU2VsZWN0T3B0aW9uLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJhY2tzIHNpbXBsZSBzdHJpbmcgdmFsdWVzIGJvdW5kIHRvIHRoZSBvcHRpb24gZWxlbWVudC5cbiAgICAgICAgICogRm9yIG9iamVjdHMsIHVzZSB0aGUgYG5nVmFsdWVgIGlucHV0IGJpbmRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QpXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIE5nU2VsZWN0T3B0aW9uLnByb3RvdHlwZS5fc2V0RWxlbWVudFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUncyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgKi9cbiAgICBOZ1NlbGVjdE9wdGlvbi5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWxlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdC5fb3B0aW9uTWFwLmRlbGV0ZSh0aGlzLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgnbmdWYWx1ZScpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIE5nU2VsZWN0T3B0aW9uLnByb3RvdHlwZSwgXCJuZ1ZhbHVlXCIsIG51bGwpO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgndmFsdWUnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCBOZ1NlbGVjdE9wdGlvbi5wcm90b3R5cGUsIFwidmFsdWVcIiwgbnVsbCk7XG4gICAgTmdTZWxlY3RPcHRpb24gPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdvcHRpb24nIH0pLFxuICAgICAgICBfX3BhcmFtKDIsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDIsIEhvc3QoKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbRWxlbWVudFJlZiwgUmVuZGVyZXIyLFxuICAgICAgICAgICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JdKVxuICAgIF0sIE5nU2VsZWN0T3B0aW9uKTtcbiAgICByZXR1cm4gTmdTZWxlY3RPcHRpb247XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgU0VMRUNUX01VTFRJUExFX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3I7IH0pLFxuICAgIG11bHRpOiB0cnVlXG59O1xuZnVuY3Rpb24gX2J1aWxkVmFsdWVTdHJpbmckMShpZCwgdmFsdWUpIHtcbiAgICBpZiAoaWQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJylcbiAgICAgICAgdmFsdWUgPSBcIidcIiArIHZhbHVlICsgXCInXCI7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHZhbHVlID0gJ09iamVjdCc7XG4gICAgcmV0dXJuIChpZCArIFwiOiBcIiArIHZhbHVlKS5zbGljZSgwLCA1MCk7XG59XG5mdW5jdGlvbiBfZXh0cmFjdElkJDEodmFsdWVTdHJpbmcpIHtcbiAgICByZXR1cm4gdmFsdWVTdHJpbmcuc3BsaXQoJzonKVswXTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBtdWx0aS1zZWxlY3QgY29udHJvbCB2YWx1ZXMgYW5kIGxpc3RlbmluZyB0byBtdWx0aS1zZWxlY3QgY29udHJvbFxuICogY2hhbmdlcy4gVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQgYE5nTW9kZWxgXG4gKiBkaXJlY3RpdmVzLlxuICpcbiAqIEBzZWUgYFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIFVzaW5nIGEgbXVsdGktc2VsZWN0IGNvbnRyb2xcbiAqXG4gKiBUaGUgZm9sbG93IGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byB1c2UgYSBtdWx0aS1zZWxlY3QgY29udHJvbCB3aXRoIGEgcmVhY3RpdmUgZm9ybS5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY291bnRyeUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcbiAqIGBgYFxuICpcbiAqIGBgYFxuICogPHNlbGVjdCBtdWx0aXBsZSBuYW1lPVwiY291bnRyaWVzXCIgW2Zvcm1Db250cm9sXT1cImNvdW50cnlDb250cm9sXCI+XG4gKiAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvdW50cnkgb2YgY291bnRyaWVzXCIgW25nVmFsdWVdPVwiY291bnRyeVwiPlxuICogICAgIHt7IGNvdW50cnkubmFtZSB9fVxuICogICA8L29wdGlvbj5cbiAqIDwvc2VsZWN0PlxuICogYGBgXG4gKlxuICogIyMjIEN1c3RvbWl6aW5nIG9wdGlvbiBzZWxlY3Rpb25cbiAqXG4gKiBUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgb3B0aW9uIGNvbXBhcmlzb24gYWxnb3JpdGhtLCBgPHNlbGVjdD5gIHN1cHBvcnRzIGBjb21wYXJlV2l0aGAgaW5wdXQuXG4gKiBTZWUgdGhlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHVzYWdlLlxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgdGhpcy5fb3B0aW9uTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX2lkQ291bnRlciA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChfKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBibHVyIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgICAgICB0aGlzLl9jb21wYXJlV2l0aCA9IMm1bG9vc2VJZGVudGljYWw7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZSwgXCJjb21wYXJlV2l0aFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJhY2tzIHRoZSBvcHRpb24gY29tcGFyaXNvbiBhbGdvcml0aG0gZm9yIHRyYWNraW5nIGlkZW50aXRpZXMgd2hlblxuICAgICAgICAgKiBjaGVja2luZyBmb3IgY2hhbmdlcy5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29tcGFyZVdpdGggbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgXCIgKyBKU09OLnN0cmluZ2lmeShmbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2V0cyB0aGUgXCJ2YWx1ZVwiIHByb3BlcnR5IG9uIG9uZSBvciBvZiBtb3JlXG4gICAgICogb2YgdGhlIHNlbGVjdCdzIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlXG4gICAgICovXG4gICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUud3JpdGVWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBvcHRpb25TZWxlY3RlZFN0YXRlU2V0dGVyO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgdmFsdWVzIHRvIGlkc1xuICAgICAgICAgICAgdmFyIGlkc18xID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBfdGhpcy5fZ2V0T3B0aW9uSWQodik7IH0pO1xuICAgICAgICAgICAgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlciA9IGZ1bmN0aW9uIChvcHQsIG8pIHsgb3B0Ll9zZXRTZWxlY3RlZChpZHNfMS5pbmRleE9mKG8udG9TdHJpbmcoKSkgPiAtMSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25TZWxlY3RlZFN0YXRlU2V0dGVyID0gZnVuY3Rpb24gKG9wdCwgbykgeyBvcHQuX3NldFNlbGVjdGVkKGZhbHNlKTsgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcHRpb25NYXAuZm9yRWFjaChvcHRpb25TZWxlY3RlZFN0YXRlU2V0dGVyKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXNcbiAgICAgKiBhbmQgd3JpdGVzIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvdG90eXBlLnJlZ2lzdGVyT25DaGFuZ2UgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZ1bmN0aW9uIChfKSB7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgICAgIGlmIChfLmhhc093blByb3BlcnR5KCdzZWxlY3RlZE9wdGlvbnMnKSkge1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gXy5zZWxlY3RlZE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvcHQgPSBvcHRpb25zLml0ZW0oaSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBfdGhpcy5fZ2V0T3B0aW9uVmFsdWUob3B0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERlZ3JhZGUgb24gSUVcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gXy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3B0ID0gb3B0aW9ucy5pdGVtKGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gX3RoaXMuX2dldE9wdGlvblZhbHVlKG9wdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy52YWx1ZSA9IHNlbGVjdGVkO1xuICAgICAgICAgICAgZm4oc2VsZWN0ZWQpO1xuICAgICAgICB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5yZWdpc3Rlck9uVG91Y2hlZCA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIFwiZGlzYWJsZWRcIiBwcm9wZXJ0eSBvbiB0aGUgc2VsZWN0IGlucHV0IGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBUaGUgZGlzYWJsZWQgdmFsdWVcbiAgICAgKi9cbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5zZXREaXNhYmxlZFN0YXRlID0gZnVuY3Rpb24gKGlzRGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fcmVnaXN0ZXJPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGlkID0gKHRoaXMuX2lkQ291bnRlcisrKS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLl9vcHRpb25NYXAuc2V0KGlkLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fZ2V0T3B0aW9uSWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmVXaXRoKHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpLl92YWx1ZSwgdmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLnByb3RvdHlwZS5fZ2V0T3B0aW9uVmFsdWUgPSBmdW5jdGlvbiAodmFsdWVTdHJpbmcpIHtcbiAgICAgICAgdmFyIGlkID0gX2V4dHJhY3RJZCQxKHZhbHVlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbk1hcC5oYXMoaWQpID8gdGhpcy5fb3B0aW9uTWFwLmdldChpZCkuX3ZhbHVlIDogdmFsdWVTdHJpbmc7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZ1bmN0aW9uKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtGdW5jdGlvbl0pXG4gICAgXSwgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvci5wcm90b3R5cGUsIFwiY29tcGFyZVdpdGhcIiwgbnVsbCk7XG4gICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdzZWxlY3RbbXVsdGlwbGVdW2Zvcm1Db250cm9sTmFtZV0sc2VsZWN0W211bHRpcGxlXVtmb3JtQ29udHJvbF0sc2VsZWN0W211bHRpcGxlXVtuZ01vZGVsXScsXG4gICAgICAgICAgICBob3N0OiB7ICcoY2hhbmdlKSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0KScsICcoYmx1ciknOiAnb25Ub3VjaGVkKCknIH0sXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtTRUxFQ1RfTVVMVElQTEVfVkFMVUVfQUNDRVNTT1JdXG4gICAgICAgIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW1JlbmRlcmVyMiwgRWxlbWVudFJlZl0pXG4gICAgXSwgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvcik7XG4gICAgcmV0dXJuIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3I7XG59KCkpO1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE1hcmtzIGA8b3B0aW9uPmAgYXMgZHluYW1pYywgc28gQW5ndWxhciBjYW4gYmUgbm90aWZpZWQgd2hlbiBvcHRpb25zIGNoYW5nZS5cbiAqXG4gKiBAc2VlIGBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24oX2VsZW1lbnQsIF9yZW5kZXJlciwgX3NlbGVjdCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyO1xuICAgICAgICB0aGlzLl9zZWxlY3QgPSBfc2VsZWN0O1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5fc2VsZWN0Ll9yZWdpc3Rlck9wdGlvbih0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLnByb3RvdHlwZSwgXCJuZ1ZhbHVlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUcmFja3MgdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBvcHRpb24gZWxlbWVudC4gVW5saWtlIHRoZSB2YWx1ZSBiaW5kaW5nLFxuICAgICAgICAgKiBuZ1ZhbHVlIHN1cHBvcnRzIGJpbmRpbmcgdG8gb2JqZWN0cy5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZShfYnVpbGRWYWx1ZVN0cmluZyQxKHRoaXMuaWQsIHZhbHVlKSk7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJhY2tzIHNpbXBsZSBzdHJpbmcgdmFsdWVzIGJvdW5kIHRvIHRoZSBvcHRpb24gZWxlbWVudC5cbiAgICAgICAgICogRm9yIG9iamVjdHMsIHVzZSB0aGUgYG5nVmFsdWVgIGlucHV0IGJpbmRpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlKF9idWlsZFZhbHVlU3RyaW5nJDEodGhpcy5pZCwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbi5wcm90b3R5cGUuX3NldEVsZW1lbnRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24ucHJvdG90eXBlLl9zZXRTZWxlY3RlZCA9IGZ1bmN0aW9uIChzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZCcsIHNlbGVjdGVkKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGJlZm9yZSB0aGUgZGlyZWN0aXZlJ3MgaW5zdGFuY2UgaXMgZGVzdHJveWVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICovXG4gICAgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLnByb3RvdHlwZS5uZ09uRGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0Ll9vcHRpb25NYXAuZGVsZXRlKHRoaXMuaWQpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ1ZhbHVlJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLnByb3RvdHlwZSwgXCJuZ1ZhbHVlXCIsIG51bGwpO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgndmFsdWUnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSlcbiAgICBdLCDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24ucHJvdG90eXBlLCBcInZhbHVlXCIsIG51bGwpO1xuICAgIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbiA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ29wdGlvbicgfSksXG4gICAgICAgIF9fcGFyYW0oMiwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMiwgSG9zdCgpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtFbGVtZW50UmVmLCBSZW5kZXJlcjIsXG4gICAgICAgICAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yXSlcbiAgICBdLCDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24pO1xuICAgIHJldHVybiDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb247XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBjb250cm9sUGF0aChuYW1lLCBwYXJlbnQpIHtcbiAgICByZXR1cm4gX19zcHJlYWQocGFyZW50LnBhdGgsIFtuYW1lXSk7XG59XG5mdW5jdGlvbiBzZXRVcENvbnRyb2woY29udHJvbCwgZGlyKSB7XG4gICAgaWYgKCFjb250cm9sKVxuICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdDYW5ub3QgZmluZCBjb250cm9sIHdpdGgnKTtcbiAgICBpZiAoIWRpci52YWx1ZUFjY2Vzc29yKVxuICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdObyB2YWx1ZSBhY2Nlc3NvciBmb3IgZm9ybSBjb250cm9sIHdpdGgnKTtcbiAgICBjb250cm9sLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbY29udHJvbC52YWxpZGF0b3IsIGRpci52YWxpZGF0b3JdKTtcbiAgICBjb250cm9sLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoW2NvbnRyb2wuYXN5bmNWYWxpZGF0b3IsIGRpci5hc3luY1ZhbGlkYXRvcl0pO1xuICAgIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoY29udHJvbC52YWx1ZSk7XG4gICAgc2V0VXBWaWV3Q2hhbmdlUGlwZWxpbmUoY29udHJvbCwgZGlyKTtcbiAgICBzZXRVcE1vZGVsQ2hhbmdlUGlwZWxpbmUoY29udHJvbCwgZGlyKTtcbiAgICBzZXRVcEJsdXJQaXBlbGluZShjb250cm9sLCBkaXIpO1xuICAgIGlmIChkaXIudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKSB7XG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKGZ1bmN0aW9uIChpc0Rpc2FibGVkKSB7IGRpci52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCk7IH0pO1xuICAgIH1cbiAgICAvLyByZS1ydW4gdmFsaWRhdGlvbiB3aGVuIHZhbGlkYXRvciBiaW5kaW5nIGNoYW5nZXMsIGUuZy4gbWlubGVuZ3RoPTMgLT4gbWlubGVuZ3RoPTRcbiAgICBkaXIuX3Jhd1ZhbGlkYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yKSB7XG4gICAgICAgIGlmICh2YWxpZGF0b3IucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSlcbiAgICAgICAgICAgIHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOyB9KTtcbiAgICB9KTtcbiAgICBkaXIuX3Jhd0FzeW5jVmFsaWRhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3IpIHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKVxuICAgICAgICAgICAgdmFsaWRhdG9yLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZnVuY3Rpb24gKCkgeyByZXR1cm4gY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7IH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gY2xlYW5VcENvbnRyb2woY29udHJvbCwgZGlyKSB7XG4gICAgZGlyLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZShmdW5jdGlvbiAoKSB7IHJldHVybiBfbm9Db250cm9sRXJyb3IoZGlyKTsgfSk7XG4gICAgZGlyLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPblRvdWNoZWQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX25vQ29udHJvbEVycm9yKGRpcik7IH0pO1xuICAgIGRpci5fcmF3VmFsaWRhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh2YWxpZGF0b3IpIHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3IucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShudWxsKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGRpci5fcmF3QXN5bmNWYWxpZGF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbGlkYXRvcikge1xuICAgICAgICBpZiAodmFsaWRhdG9yLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKG51bGwpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGNvbnRyb2wpXG4gICAgICAgIGNvbnRyb2wuX2NsZWFyQ2hhbmdlRm5zKCk7XG59XG5mdW5jdGlvbiBzZXRVcFZpZXdDaGFuZ2VQaXBlbGluZShjb250cm9sLCBkaXIpIHtcbiAgICBkaXIudmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlKGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICBjb250cm9sLl9wZW5kaW5nVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgY29udHJvbC5fcGVuZGluZ0NoYW5nZSA9IHRydWU7XG4gICAgICAgIGNvbnRyb2wuX3BlbmRpbmdEaXJ0eSA9IHRydWU7XG4gICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uID09PSAnY2hhbmdlJylcbiAgICAgICAgICAgIHVwZGF0ZUNvbnRyb2woY29udHJvbCwgZGlyKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNldFVwQmx1clBpcGVsaW5lKGNvbnRyb2wsIGRpcikge1xuICAgIGRpci52YWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29udHJvbC5fcGVuZGluZ1RvdWNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY29udHJvbC51cGRhdGVPbiA9PT0gJ2JsdXInICYmIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UpXG4gICAgICAgICAgICB1cGRhdGVDb250cm9sKGNvbnRyb2wsIGRpcik7XG4gICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uICE9PSAnc3VibWl0JylcbiAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udHJvbChjb250cm9sLCBkaXIpIHtcbiAgICBpZiAoY29udHJvbC5fcGVuZGluZ0RpcnR5KVxuICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgY29udHJvbC5zZXRWYWx1ZShjb250cm9sLl9wZW5kaW5nVmFsdWUsIHsgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSB9KTtcbiAgICBkaXIudmlld1RvTW9kZWxVcGRhdGUoY29udHJvbC5fcGVuZGluZ1ZhbHVlKTtcbiAgICBjb250cm9sLl9wZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBzZXRVcE1vZGVsQ2hhbmdlUGlwZWxpbmUoY29udHJvbCwgZGlyKSB7XG4gICAgY29udHJvbC5yZWdpc3Rlck9uQ2hhbmdlKGZ1bmN0aW9uIChuZXdWYWx1ZSwgZW1pdE1vZGVsRXZlbnQpIHtcbiAgICAgICAgLy8gY29udHJvbCAtPiB2aWV3XG4gICAgICAgIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUobmV3VmFsdWUpO1xuICAgICAgICAvLyBjb250cm9sIC0+IG5nTW9kZWxcbiAgICAgICAgaWYgKGVtaXRNb2RlbEV2ZW50KVxuICAgICAgICAgICAgZGlyLnZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNldFVwRm9ybUNvbnRhaW5lcihjb250cm9sLCBkaXIpIHtcbiAgICBpZiAoY29udHJvbCA9PSBudWxsKVxuICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdDYW5ub3QgZmluZCBjb250cm9sIHdpdGgnKTtcbiAgICBjb250cm9sLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbY29udHJvbC52YWxpZGF0b3IsIGRpci52YWxpZGF0b3JdKTtcbiAgICBjb250cm9sLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoW2NvbnRyb2wuYXN5bmNWYWxpZGF0b3IsIGRpci5hc3luY1ZhbGlkYXRvcl0pO1xufVxuZnVuY3Rpb24gX25vQ29udHJvbEVycm9yKGRpcikge1xuICAgIHJldHVybiBfdGhyb3dFcnJvcihkaXIsICdUaGVyZSBpcyBubyBGb3JtQ29udHJvbCBpbnN0YW5jZSBhdHRhY2hlZCB0byBmb3JtIGNvbnRyb2wgZWxlbWVudCB3aXRoJyk7XG59XG5mdW5jdGlvbiBfdGhyb3dFcnJvcihkaXIsIG1lc3NhZ2UpIHtcbiAgICB2YXIgbWVzc2FnZUVuZDtcbiAgICBpZiAoZGlyLnBhdGgubGVuZ3RoID4gMSkge1xuICAgICAgICBtZXNzYWdlRW5kID0gXCJwYXRoOiAnXCIgKyBkaXIucGF0aC5qb2luKCcgLT4gJykgKyBcIidcIjtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlyLnBhdGhbMF0pIHtcbiAgICAgICAgbWVzc2FnZUVuZCA9IFwibmFtZTogJ1wiICsgZGlyLnBhdGggKyBcIidcIjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1lc3NhZ2VFbmQgPSAndW5zcGVjaWZpZWQgbmFtZSBhdHRyaWJ1dGUnO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSArIFwiIFwiICsgbWVzc2FnZUVuZCk7XG59XG5mdW5jdGlvbiBjb21wb3NlVmFsaWRhdG9ycyh2YWxpZGF0b3JzKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnMgIT0gbnVsbCA/IFZhbGlkYXRvcnMuY29tcG9zZSh2YWxpZGF0b3JzLm1hcChub3JtYWxpemVWYWxpZGF0b3IpKSA6IG51bGw7XG59XG5mdW5jdGlvbiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHZhbGlkYXRvcnMpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9ycyAhPSBudWxsID8gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmModmFsaWRhdG9ycy5tYXAobm9ybWFsaXplQXN5bmNWYWxpZGF0b3IpKSA6XG4gICAgICAgIG51bGw7XG59XG5mdW5jdGlvbiBpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB2aWV3TW9kZWwpIHtcbiAgICBpZiAoIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21vZGVsJykpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1snbW9kZWwnXTtcbiAgICBpZiAoY2hhbmdlLmlzRmlyc3RDaGFuZ2UoKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICHJtWxvb3NlSWRlbnRpY2FsKHZpZXdNb2RlbCwgY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG59XG52YXIgQlVJTFRJTl9BQ0NFU1NPUlMgPSBbXG4gICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBSYW5nZVZhbHVlQWNjZXNzb3IsXG4gICAgTnVtYmVyVmFsdWVBY2Nlc3NvcixcbiAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IsXG5dO1xuZnVuY3Rpb24gaXNCdWlsdEluQWNjZXNzb3IodmFsdWVBY2Nlc3Nvcikge1xuICAgIHJldHVybiBCVUlMVElOX0FDQ0VTU09SUy5zb21lKGZ1bmN0aW9uIChhKSB7IHJldHVybiB2YWx1ZUFjY2Vzc29yLmNvbnN0cnVjdG9yID09PSBhOyB9KTtcbn1cbmZ1bmN0aW9uIHN5bmNQZW5kaW5nQ29udHJvbHMoZm9ybSwgZGlyZWN0aXZlcykge1xuICAgIGZvcm0uX3N5bmNQZW5kaW5nQ29udHJvbHMoKTtcbiAgICBkaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKGRpcikge1xuICAgICAgICB2YXIgY29udHJvbCA9IGRpci5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbC51cGRhdGVPbiA9PT0gJ3N1Ym1pdCcgJiYgY29udHJvbC5fcGVuZGluZ0NoYW5nZSkge1xuICAgICAgICAgICAgZGlyLnZpZXdUb01vZGVsVXBkYXRlKGNvbnRyb2wuX3BlbmRpbmdWYWx1ZSk7XG4gICAgICAgICAgICBjb250cm9sLl9wZW5kaW5nQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIFRPRE86IHZzYXZraW4gcmVtb3ZlIGl0IG9uY2UgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzAxMSBpcyBpbXBsZW1lbnRlZFxuZnVuY3Rpb24gc2VsZWN0VmFsdWVBY2Nlc3NvcihkaXIsIHZhbHVlQWNjZXNzb3JzKSB7XG4gICAgaWYgKCF2YWx1ZUFjY2Vzc29ycylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlQWNjZXNzb3JzKSlcbiAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnVmFsdWUgYWNjZXNzb3Igd2FzIG5vdCBwcm92aWRlZCBhcyBhbiBhcnJheSBmb3IgZm9ybSBjb250cm9sIHdpdGgnKTtcbiAgICB2YXIgZGVmYXVsdEFjY2Vzc29yID0gdW5kZWZpbmVkO1xuICAgIHZhciBidWlsdGluQWNjZXNzb3IgPSB1bmRlZmluZWQ7XG4gICAgdmFyIGN1c3RvbUFjY2Vzc29yID0gdW5kZWZpbmVkO1xuICAgIHZhbHVlQWNjZXNzb3JzLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgaWYgKHYuY29uc3RydWN0b3IgPT09IERlZmF1bHRWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgICAgICBkZWZhdWx0QWNjZXNzb3IgPSB2O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQnVpbHRJbkFjY2Vzc29yKHYpKSB7XG4gICAgICAgICAgICBpZiAoYnVpbHRpbkFjY2Vzc29yKVxuICAgICAgICAgICAgICAgIF90aHJvd0Vycm9yKGRpciwgJ01vcmUgdGhhbiBvbmUgYnVpbHQtaW4gdmFsdWUgYWNjZXNzb3IgbWF0Y2hlcyBmb3JtIGNvbnRyb2wgd2l0aCcpO1xuICAgICAgICAgICAgYnVpbHRpbkFjY2Vzc29yID0gdjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXN0b21BY2Nlc3NvcilcbiAgICAgICAgICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdNb3JlIHRoYW4gb25lIGN1c3RvbSB2YWx1ZSBhY2Nlc3NvciBtYXRjaGVzIGZvcm0gY29udHJvbCB3aXRoJyk7XG4gICAgICAgICAgICBjdXN0b21BY2Nlc3NvciA9IHY7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoY3VzdG9tQWNjZXNzb3IpXG4gICAgICAgIHJldHVybiBjdXN0b21BY2Nlc3NvcjtcbiAgICBpZiAoYnVpbHRpbkFjY2Vzc29yKVxuICAgICAgICByZXR1cm4gYnVpbHRpbkFjY2Vzc29yO1xuICAgIGlmIChkZWZhdWx0QWNjZXNzb3IpXG4gICAgICAgIHJldHVybiBkZWZhdWx0QWNjZXNzb3I7XG4gICAgX3Rocm93RXJyb3IoZGlyLCAnTm8gdmFsaWQgdmFsdWUgYWNjZXNzb3IgZm9yIGZvcm0gY29udHJvbCB3aXRoJyk7XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiByZW1vdmVEaXIobGlzdCwgZWwpIHtcbiAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YoZWwpO1xuICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG59XG4vLyBUT0RPKGthcmEpOiByZW1vdmUgYWZ0ZXIgZGVwcmVjYXRpb24gcGVyaW9kXG5mdW5jdGlvbiBfbmdNb2RlbFdhcm5pbmcobmFtZSwgdHlwZSwgaW5zdGFuY2UsIHdhcm5pbmdDb25maWcpIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHdhcm5pbmdDb25maWcgPT09ICduZXZlcicpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoKCh3YXJuaW5nQ29uZmlnID09PSBudWxsIHx8IHdhcm5pbmdDb25maWcgPT09ICdvbmNlJykgJiYgIXR5cGUuX25nTW9kZWxXYXJuaW5nU2VudE9uY2UpIHx8XG4gICAgICAgICh3YXJuaW5nQ29uZmlnID09PSAnYWx3YXlzJyAmJiAhaW5zdGFuY2UuX25nTW9kZWxXYXJuaW5nU2VudCkpIHtcbiAgICAgICAgUmVhY3RpdmVFcnJvcnMubmdNb2RlbFdhcm5pbmcobmFtZSk7XG4gICAgICAgIHR5cGUuX25nTW9kZWxXYXJuaW5nU2VudE9uY2UgPSB0cnVlO1xuICAgICAgICBpbnN0YW5jZS5fbmdNb2RlbFdhcm5pbmdTZW50ID0gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgdmFsaWQsIG1lYW5pbmcgdGhhdCBubyBlcnJvcnMgZXhpc3QgaW4gdGhlIGlucHV0IHZhbHVlLlxuICpcbiAqIEBzZWUgYHN0YXR1c2BcbiAqL1xudmFyIFZBTElEID0gJ1ZBTElEJztcbi8qKlxuICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgaW52YWxpZCwgbWVhbmluZyB0aGF0IGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gKlxuICogQHNlZSBgc3RhdHVzYFxuICovXG52YXIgSU5WQUxJRCA9ICdJTlZBTElEJztcbi8qKlxuICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgcGVuZGluZywgbWVhbmluZyB0aGF0IHRoYXQgYXN5bmMgdmFsaWRhdGlvbiBpcyBvY2N1cnJpbmcgYW5kXG4gKiBlcnJvcnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgaW5wdXQgdmFsdWUuXG4gKlxuICogQHNlZSBgbWFya0FzUGVuZGluZ2BcbiAqIEBzZWUgYHN0YXR1c2BcbiAqL1xudmFyIFBFTkRJTkcgPSAnUEVORElORyc7XG4vKipcbiAqIFJlcG9ydHMgdGhhdCBhIEZvcm1Db250cm9sIGlzIGRpc2FibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbnRyb2wgaXMgZXhlbXB0IGZyb20gYW5jZXN0b3JcbiAqIGNhbGN1bGF0aW9ucyBvZiB2YWxpZGl0eSBvciB2YWx1ZS5cbiAqXG4gKiBAc2VlIGBtYXJrQXNEaXNhYmxlZGBcbiAqIEBzZWUgYHN0YXR1c2BcbiAqL1xudmFyIERJU0FCTEVEID0gJ0RJU0FCTEVEJztcbmZ1bmN0aW9uIF9maW5kKGNvbnRyb2wsIHBhdGgsIGRlbGltaXRlcikge1xuICAgIGlmIChwYXRoID09IG51bGwpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoZGVsaW1pdGVyKTtcbiAgICB9XG4gICAgaWYgKHBhdGggaW5zdGFuY2VvZiBBcnJheSAmJiAocGF0aC5sZW5ndGggPT09IDApKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKHYsIG5hbWUpIHtcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybiB2LmNvbnRyb2xzLmhhc093blByb3BlcnR5KG5hbWUpID8gdi5jb250cm9sc1tuYW1lXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB2LmF0KG5hbWUpIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgY29udHJvbCk7XG59XG5mdW5jdGlvbiBjb2VyY2VUb1ZhbGlkYXRvcih2YWxpZGF0b3JPck9wdHMpIHtcbiAgICB2YXIgdmFsaWRhdG9yID0gKGlzT3B0aW9uc09iaih2YWxpZGF0b3JPck9wdHMpID8gdmFsaWRhdG9yT3JPcHRzLnZhbGlkYXRvcnMgOlxuICAgICAgICB2YWxpZGF0b3JPck9wdHMpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbGlkYXRvcikgPyBjb21wb3NlVmFsaWRhdG9ycyh2YWxpZGF0b3IpIDogdmFsaWRhdG9yIHx8IG51bGw7XG59XG5mdW5jdGlvbiBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpIHtcbiAgICB2YXIgb3JpZ0FzeW5jVmFsaWRhdG9yID0gKGlzT3B0aW9uc09iaih2YWxpZGF0b3JPck9wdHMpID8gdmFsaWRhdG9yT3JPcHRzLmFzeW5jVmFsaWRhdG9ycyA6XG4gICAgICAgIGFzeW5jVmFsaWRhdG9yKTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvcmlnQXN5bmNWYWxpZGF0b3IpID8gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyhvcmlnQXN5bmNWYWxpZGF0b3IpIDpcbiAgICAgICAgb3JpZ0FzeW5jVmFsaWRhdG9yIHx8IG51bGw7XG59XG5mdW5jdGlvbiBpc09wdGlvbnNPYmoodmFsaWRhdG9yT3JPcHRzKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvck9yT3B0cyAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbGlkYXRvck9yT3B0cykgJiZcbiAgICAgICAgdHlwZW9mIHZhbGlkYXRvck9yT3B0cyA9PT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGBGb3JtQ29udHJvbGAsIGBGb3JtR3JvdXBgLCBhbmQgYEZvcm1BcnJheWAuXG4gKlxuICogSXQgcHJvdmlkZXMgc29tZSBvZiB0aGUgc2hhcmVkIGJlaGF2aW9yIHRoYXQgYWxsIGNvbnRyb2xzIGFuZCBncm91cHMgb2YgY29udHJvbHMgaGF2ZSwgbGlrZVxuICogcnVubmluZyB2YWxpZGF0b3JzLCBjYWxjdWxhdGluZyBzdGF0dXMsIGFuZCByZXNldHRpbmcgc3RhdGUuIEl0IGFsc28gZGVmaW5lcyB0aGUgcHJvcGVydGllc1xuICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gYWxsIHN1Yi1jbGFzc2VzLCBsaWtlIGB2YWx1ZWAsIGB2YWxpZGAsIGFuZCBgZGlydHlgLiBJdCBzaG91bGRuJ3QgYmVcbiAqIGluc3RhbnRpYXRlZCBkaXJlY3RseS5cbiAqXG4gKiBAc2VlIFtGb3JtcyBHdWlkZV0oL2d1aWRlL2Zvcm1zKVxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKC9ndWlkZS9yZWFjdGl2ZS1mb3JtcylcbiAqIEBzZWUgW0R5bmFtaWMgRm9ybXMgR3VpZGVdKC9ndWlkZS9keW5hbWljLWZvcm0pXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgQWJzdHJhY3RDb250cm9sID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIEFic3RyYWN0Q29udHJvbCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3IgVGhlIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc3luY2hyb25vdXMgdmFsaWRpdHkgb2YgdGhpcyBjb250cm9sLlxuICAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvciBUaGUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhc3luY2hyb25vdXMgdmFsaWRpdHkgb2YgdGhpc1xuICAgICAqIGNvbnRyb2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gQWJzdHJhY3RDb250cm9sKHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3IgPSBhc3luY1ZhbGlkYXRvcjtcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYHByaXN0aW5lYCBpZiB0aGUgdXNlciBoYXMgbm90IHlldCBjaGFuZ2VkXG4gICAgICAgICAqIHRoZSB2YWx1ZSBpbiB0aGUgVUkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZCB0aGUgdmFsdWUgaW4gdGhlIFVJOyBjb21wYXJlIGBkaXJ0eWAuXG4gICAgICAgICAqIFByb2dyYW1tYXRpYyBjaGFuZ2VzIHRvIGEgY29udHJvbCdzIHZhbHVlIGRvIG5vdCBtYXJrIGl0IGRpcnR5LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wcmlzdGluZSA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnVlIGlmIHRoZSBjb250cm9sIGlzIG1hcmtlZCBhcyBgdG91Y2hlZGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEEgY29udHJvbCBpcyBtYXJrZWQgYHRvdWNoZWRgIG9uY2UgdGhlIHVzZXIgaGFzIHRyaWdnZXJlZFxuICAgICAgICAgKiBhIGBibHVyYCBldmVudCBvbiBpdC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG91Y2hlZCA9IGZhbHNlO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UgPSBbXTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUsIFwicGFyZW50XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwYXJlbnQgY29udHJvbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZSwgXCJ2YWxpZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYHZhbGlkYCB3aGVuIGl0cyBgc3RhdHVzYCBpcyBgVkFMSURgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250cm9sIGhhcyBwYXNzZWQgYWxsIG9mIGl0cyB2YWxpZGF0aW9uIHRlc3RzLFxuICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBWQUxJRDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUsIFwiaW52YWxpZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYGludmFsaWRgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBJTlZBTElEYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c31cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIGNvbnRyb2wgaGFzIGZhaWxlZCBvbmUgb3IgbW9yZSBvZiBpdHMgdmFsaWRhdGlvbiBjaGVja3MsXG4gICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zdGF0dXMgPT09IElOVkFMSUQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLCBcInBlbmRpbmdcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQSBjb250cm9sIGlzIGBwZW5kaW5nYCB3aGVuIGl0cyBgc3RhdHVzYCBpcyBgUEVORElOR2AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyBjb250cm9sIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbmR1Y3RpbmcgYSB2YWxpZGF0aW9uIGNoZWNrLFxuICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09IFBFTkRJTkc7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLCBcImRpc2FibGVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgY29udHJvbCBpcyBgZGlzYWJsZWRgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBESVNBQkxFRGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIERpc2FibGVkIGNvbnRyb2xzIGFyZSBleGVtcHQgZnJvbSB2YWxpZGF0aW9uIGNoZWNrcyBhbmRcbiAgICAgICAgICogYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZWlyIGFuY2VzdG9yXG4gICAgICAgICAqIGNvbnRyb2xzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfVxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250cm9sIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBESVNBQkxFRDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUsIFwiZW5hYmxlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYGVuYWJsZWRgIGFzIGxvbmcgYXMgaXRzIGBzdGF0dXNgIGlzIG5vdCBgRElTQUJMRURgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250cm9sIGhhcyBhbnkgc3RhdHVzIG90aGVyIHRoYW4gJ0RJU0FCTEVEJyxcbiAgICAgICAgICogZmFsc2UgaWYgdGhlIHN0YXR1cyBpcyAnRElTQUJMRUQnLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfVxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnN0YXR1cyAhPT0gRElTQUJMRUQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLCBcImRpcnR5XCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgY29udHJvbCBpcyBgZGlydHlgIGlmIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSB2YWx1ZVxuICAgICAgICAgKiBpbiB0aGUgVUkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHVzZXIgaGFzIGNoYW5nZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29udHJvbCBpbiB0aGUgVUk7IGNvbXBhcmUgYHByaXN0aW5lYC5cbiAgICAgICAgICogUHJvZ3JhbW1hdGljIGNoYW5nZXMgdG8gYSBjb250cm9sJ3MgdmFsdWUgZG8gbm90IG1hcmsgaXQgZGlydHkuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICF0aGlzLnByaXN0aW5lOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZSwgXCJ1bnRvdWNoZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogVHJ1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIHRvdWNoZWRcbiAgICAgICAgICpcbiAgICAgICAgICogQSBjb250cm9sIGlzIGB1bnRvdWNoZWRgIGlmIHRoZSB1c2VyIGhhcyBub3QgeWV0IHRyaWdnZXJlZFxuICAgICAgICAgKiBhIGBibHVyYCBldmVudCBvbiBpdC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gIXRoaXMudG91Y2hlZDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUsIFwidXBkYXRlT25cIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVwb3J0cyB0aGUgdXBkYXRlIHN0cmF0ZWd5IG9mIHRoZSBgQWJzdHJhY3RDb250cm9sYCAobWVhbmluZ1xuICAgICAgICAgKiB0aGUgZXZlbnQgb24gd2hpY2ggdGhlIGNvbnRyb2wgdXBkYXRlcyBpdHNlbGYpLlxuICAgICAgICAgKiBQb3NzaWJsZSB2YWx1ZXM6IGAnY2hhbmdlJ2AgfCBgJ2JsdXInYCB8IGAnc3VibWl0J2BcbiAgICAgICAgICogRGVmYXVsdCB2YWx1ZTogYCdjaGFuZ2UnYFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlT24gPyB0aGlzLl91cGRhdGVPbiA6ICh0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnVwZGF0ZU9uIDogJ2NoYW5nZScpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzeW5jaHJvbm91cyB2YWxpZGF0b3JzIHRoYXQgYXJlIGFjdGl2ZSBvbiB0aGlzIGNvbnRyb2wuICBDYWxsaW5nXG4gICAgICogdGhpcyBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBzeW5jIHZhbGlkYXRvcnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5zZXRWYWxpZGF0b3JzID0gZnVuY3Rpb24gKG5ld1ZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLnZhbGlkYXRvciA9IGNvZXJjZVRvVmFsaWRhdG9yKG5ld1ZhbGlkYXRvcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhc3luYyB2YWxpZGF0b3JzIHRoYXQgYXJlIGFjdGl2ZSBvbiB0aGlzIGNvbnRyb2wuIENhbGxpbmcgdGhpc1xuICAgICAqIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIGFzeW5jIHZhbGlkYXRvcnMuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5zZXRBc3luY1ZhbGlkYXRvcnMgPSBmdW5jdGlvbiAobmV3VmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0b3IgPSBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKG5ld1ZhbGlkYXRvcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbXB0aWVzIG91dCB0aGUgc3luYyB2YWxpZGF0b3IgbGlzdC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLmNsZWFyVmFsaWRhdG9ycyA9IGZ1bmN0aW9uICgpIHsgdGhpcy52YWxpZGF0b3IgPSBudWxsOyB9O1xuICAgIC8qKlxuICAgICAqIEVtcHRpZXMgb3V0IHRoZSBhc3luYyB2YWxpZGF0b3IgbGlzdC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLmNsZWFyQXN5bmNWYWxpZGF0b3JzID0gZnVuY3Rpb24gKCkgeyB0aGlzLmFzeW5jVmFsaWRhdG9yID0gbnVsbDsgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgdG91Y2hlZGAuIEEgY29udHJvbCBpcyB0b3VjaGVkIGJ5IGZvY3VzIGFuZFxuICAgICAqIGJsdXIgZXZlbnRzIHRoYXQgZG8gbm90IGNoYW5nZSB0aGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAc2VlIGBtYXJrQXNVbnRvdWNoZWQoKWBcbiAgICAgKiBAc2VlIGBtYXJrQXNEaXJ0eSgpYFxuICAgICAqIEBzZWUgYG1hcmtBc1ByaXN0aW5lKClgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlc1xuICAgICAqIGFuZCBlbWl0cyBldmVudHMgZXZlbnRzIGFmdGVyIG1hcmtpbmcgaXMgYXBwbGllZC5cbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsXG4gICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5tYXJrQXNUb3VjaGVkID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc1RvdWNoZWQob3B0cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnQgY29udHJvbHMgYXMgYHRvdWNoZWRgLlxuICAgICAqIEBzZWUgYG1hcmtBc1RvdWNoZWQoKWBcbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLm1hcmtBbGxBc1RvdWNoZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIGNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGB1bnRvdWNoZWRgLlxuICAgICAqXG4gICAgICogSWYgdGhlIGNvbnRyb2wgaGFzIGFueSBjaGlsZHJlbiwgYWxzbyBtYXJrcyBhbGwgY2hpbGRyZW4gYXMgYHVudG91Y2hlZGBcbiAgICAgKiBhbmQgcmVjYWxjdWxhdGVzIHRoZSBgdG91Y2hlZGAgc3RhdHVzIG9mIGFsbCBwYXJlbnQgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBAc2VlIGBtYXJrQXNUb3VjaGVkKClgXG4gICAgICogQHNlZSBgbWFya0FzRGlydHkoKWBcbiAgICAgKiBAc2VlIGBtYXJrQXNQcmlzdGluZSgpYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXNcbiAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSBtYXJraW5nIGlzIGFwcGxpZWQuXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLFxuICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUubWFya0FzVW50b3VjaGVkID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICAgICAgdGhpcy50b3VjaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdUb3VjaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY29udHJvbCkgeyBjb250cm9sLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pOyB9KTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKG9wdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgZGlydHlgLiBBIGNvbnRyb2wgYmVjb21lcyBkaXJ0eSB3aGVuXG4gICAgICogdGhlIGNvbnRyb2wncyB2YWx1ZSBpcyBjaGFuZ2VkIHRocm91Z2ggdGhlIFVJOyBjb21wYXJlIGBtYXJrQXNUb3VjaGVkYC5cbiAgICAgKlxuICAgICAqIEBzZWUgYG1hcmtBc1RvdWNoZWQoKWBcbiAgICAgKiBAc2VlIGBtYXJrQXNVbnRvdWNoZWQoKWBcbiAgICAgKiBAc2VlIGBtYXJrQXNQcmlzdGluZSgpYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXNcbiAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIGFmdGVyIG1hcmtpbmcgaXMgYXBwbGllZC5cbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsXG4gICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5tYXJrQXNEaXJ0eSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzID09PSB2b2lkIDApIHsgb3B0cyA9IHt9OyB9XG4gICAgICAgIHRoaXMucHJpc3RpbmUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KG9wdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgcHJpc3RpbmVgLlxuICAgICAqXG4gICAgICogSWYgdGhlIGNvbnRyb2wgaGFzIGFueSBjaGlsZHJlbiwgbWFya3MgYWxsIGNoaWxkcmVuIGFzIGBwcmlzdGluZWAsXG4gICAgICogYW5kIHJlY2FsY3VsYXRlcyB0aGUgYHByaXN0aW5lYCBzdGF0dXMgb2YgYWxsIHBhcmVudFxuICAgICAqIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogQHNlZSBgbWFya0FzVG91Y2hlZCgpYFxuICAgICAqIEBzZWUgYG1hcmtBc1VudG91Y2hlZCgpYFxuICAgICAqIEBzZWUgYG1hcmtBc0RpcnR5KClgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIGVtaXRzIGV2ZW50cyBhZnRlclxuICAgICAqIG1hcmtpbmcgaXMgYXBwbGllZC5cbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsXG4gICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuLlxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUubWFya0FzUHJpc3RpbmUgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgICAgICB0aGlzLnByaXN0aW5lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY29udHJvbCkgeyBjb250cm9sLm1hcmtBc1ByaXN0aW5lKHsgb25seVNlbGY6IHRydWUgfSk7IH0pO1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKG9wdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgY29udHJvbCBhcyBgcGVuZGluZ2AuXG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2wgaXMgcGVuZGluZyB3aGlsZSB0aGUgY29udHJvbCBwZXJmb3JtcyBhc3luYyB2YWxpZGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c31cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRzIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZFxuICAgICAqIGVtaXRzIGV2ZW50cyBhZnRlciBtYXJraW5nIGlzIGFwcGxpZWQuXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLFxuICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLi5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIHRoZSBgc3RhdHVzQ2hhbmdlc2BcbiAgICAgKiBvYnNlcnZhYmxlIGVtaXRzIGFuIGV2ZW50IHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgdGhlIGNvbnRyb2wgaXMgbWFya2VkIHBlbmRpbmcuXG4gICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgICAqXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5tYXJrQXNQZW5kaW5nID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICAgICAgdGhpcy5zdGF0dXMgPSBQRU5ESU5HO1xuICAgICAgICBpZiAob3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZXMuZW1pdCh0aGlzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc1BlbmRpbmcob3B0cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBjb250cm9sLiBUaGlzIG1lYW5zIHRoZSBjb250cm9sIGlzIGV4ZW1wdCBmcm9tIHZhbGlkYXRpb24gY2hlY2tzIGFuZFxuICAgICAqIGV4Y2x1ZGVkIGZyb20gdGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiBhbnkgcGFyZW50LiBJdHMgc3RhdHVzIGlzIGBESVNBQkxFRGAuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgY29udHJvbCBoYXMgY2hpbGRyZW4sIGFsbCBjaGlsZHJlbiBhcmUgYWxzbyBkaXNhYmxlZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXNcbiAgICAgKiBjaGFuZ2VzIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQuXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLFxuICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLi5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQuXG4gICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzID09PSB2b2lkIDApIHsgb3B0cyA9IHt9OyB9XG4gICAgICAgIC8vIElmIHBhcmVudCBoYXMgYmVlbiBtYXJrZWQgYXJ0aWZpY2lhbGx5IGRpcnR5IHdlIGRvbid0IHdhbnQgdG8gcmUtY2FsY3VsYXRlIHRoZVxuICAgICAgICAvLyBwYXJlbnQncyBkaXJ0aW5lc3MgYmFzZWQgb24gdGhlIGNoaWxkcmVuLlxuICAgICAgICB2YXIgc2tpcFByaXN0aW5lQ2hlY2sgPSB0aGlzLl9wYXJlbnRNYXJrZWREaXJ0eShvcHRzLm9ubHlTZWxmKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBESVNBQkxFRDtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wpIHsgY29udHJvbC5kaXNhYmxlKF9fYXNzaWduKHt9LCBvcHRzLCB7IG9ubHlTZWxmOiB0cnVlIH0pKTsgfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG4gICAgICAgIGlmIChvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZXMuZW1pdCh0aGlzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlQW5jZXN0b3JzKF9fYXNzaWduKHt9LCBvcHRzLCB7IHNraXBQcmlzdGluZUNoZWNrOiBza2lwUHJpc3RpbmVDaGVjayB9KSk7XG4gICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlRm4pIHsgcmV0dXJuIGNoYW5nZUZuKHRydWUpOyB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIGNvbnRyb2wuIFRoaXMgbWVhbnMgdGhlIGNvbnRyb2wgaXMgaW5jbHVkZWQgaW4gdmFsaWRhdGlvbiBjaGVja3MgYW5kXG4gICAgICogdGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiBpdHMgcGFyZW50LiBJdHMgc3RhdHVzIHJlY2FsY3VsYXRlcyBiYXNlZCBvbiBpdHMgdmFsdWUgYW5kXG4gICAgICogaXRzIHZhbGlkYXRvcnMuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgY29udHJvbCBoYXMgY2hpbGRyZW4sIGFsbCBjaGlsZHJlbiBhcmUgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0cyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmRcbiAgICAgKiBlbWl0cyBldmVudHMgd2hlbiBtYXJrZWQgYXMgdW50b3VjaGVkXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLFxuICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLi5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgZW5hYmxlZC5cbiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgICAgICAvLyBJZiBwYXJlbnQgaGFzIGJlZW4gbWFya2VkIGFydGlmaWNpYWxseSBkaXJ0eSB3ZSBkb24ndCB3YW50IHRvIHJlLWNhbGN1bGF0ZSB0aGVcbiAgICAgICAgLy8gcGFyZW50J3MgZGlydGluZXNzIGJhc2VkIG9uIHRoZSBjaGlsZHJlbi5cbiAgICAgICAgdmFyIHNraXBQcmlzdGluZUNoZWNrID0gdGhpcy5fcGFyZW50TWFya2VkRGlydHkob3B0cy5vbmx5U2VsZik7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gVkFMSUQ7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY29udHJvbCkgeyBjb250cm9sLmVuYWJsZShfX2Fzc2lnbih7fSwgb3B0cywgeyBvbmx5U2VsZjogdHJ1ZSB9KSk7IH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRzLmVtaXRFdmVudCB9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQW5jZXN0b3JzKF9fYXNzaWduKHt9LCBvcHRzLCB7IHNraXBQcmlzdGluZUNoZWNrOiBza2lwUHJpc3RpbmVDaGVjayB9KSk7XG4gICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UuZm9yRWFjaChmdW5jdGlvbiAoY2hhbmdlRm4pIHsgcmV0dXJuIGNoYW5nZUZuKGZhbHNlKTsgfSk7XG4gICAgfTtcbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl91cGRhdGVBbmNlc3RvcnMgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRzKTtcbiAgICAgICAgICAgIGlmICghb3B0cy5za2lwUHJpc3RpbmVDaGVjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlUHJpc3RpbmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlVG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcGFyZW50IFNldHMgdGhlIHBhcmVudCBvZiB0aGUgY29udHJvbFxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudCkgeyB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7IH07XG4gICAgLyoqXG4gICAgICogUmVjYWxjdWxhdGVzIHRoZSB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMgb2YgdGhlIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCBpdCBhbHNvIHVwZGF0ZXMgdGhlIHZhbHVlIGFuZCB2YWxpZGl0eSBvZiBpdHMgYW5jZXN0b3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZCBlbWl0cyBldmVudHNcbiAgICAgKiBhZnRlciB1cGRhdGVzIGFuZCB2YWxpZGl0eSBjaGVja3MgYXJlIGFwcGxpZWQuXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG9ubHkgdXBkYXRlIHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsXG4gICAgICogdXBkYXRlIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLi5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgdXBkYXRlZC5cbiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5ID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgPT09IHZvaWQgMCkgeyBvcHRzID0ge307IH1cbiAgICAgICAgdGhpcy5fc2V0SW5pdGlhbFN0YXR1cygpO1xuICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSB0aGlzLl9ydW5WYWxpZGF0b3IoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5fY2FsY3VsYXRlU3RhdHVzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IFZBTElEIHx8IHRoaXMuc3RhdHVzID09PSBQRU5ESU5HKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcnVuQXN5bmNWYWxpZGF0b3Iob3B0cy5lbWl0RXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0NoYW5nZXMuZW1pdCh0aGlzLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0cyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl91cGRhdGVUcmVlVmFsaWRpdHkgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7IGVtaXRFdmVudDogdHJ1ZSB9OyB9XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY3RybCkgeyByZXR1cm4gY3RybC5fdXBkYXRlVHJlZVZhbGlkaXR5KG9wdHMpOyB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0cy5lbWl0RXZlbnQgfSk7XG4gICAgfTtcbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl9zZXRJbml0aWFsU3RhdHVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuX2FsbENvbnRyb2xzRGlzYWJsZWQoKSA/IERJU0FCTEVEIDogVkFMSUQ7XG4gICAgfTtcbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl9ydW5WYWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRvciA/IHRoaXMudmFsaWRhdG9yKHRoaXMpIDogbnVsbDtcbiAgICB9O1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuX3J1bkFzeW5jVmFsaWRhdG9yID0gZnVuY3Rpb24gKGVtaXRFdmVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5hc3luY1ZhbGlkYXRvcikge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBQRU5ESU5HO1xuICAgICAgICAgICAgdmFyIG9icyA9IHRvT2JzZXJ2YWJsZSh0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgb2JzLnN1YnNjcmliZShmdW5jdGlvbiAoZXJyb3JzKSB7IHJldHVybiBfdGhpcy5zZXRFcnJvcnMoZXJyb3JzLCB7IGVtaXRFdmVudDogZW1pdEV2ZW50IH0pOyB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5fY2FuY2VsRXhpc3RpbmdTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIGVycm9ycyBvbiBhIGZvcm0gY29udHJvbCB3aGVuIHJ1bm5pbmcgdmFsaWRhdGlvbnMgbWFudWFsbHksIHJhdGhlciB0aGFuIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIGBzZXRFcnJvcnNgIGFsc28gdXBkYXRlcyB0aGUgdmFsaWRpdHkgb2YgdGhlIHBhcmVudCBjb250cm9sLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgTWFudWFsbHkgc2V0IHRoZSBlcnJvcnMgZm9yIGEgY29udHJvbFxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY29uc3QgbG9naW4gPSBuZXcgRm9ybUNvbnRyb2woJ3NvbWVMb2dpbicpO1xuICAgICAqIGxvZ2luLnNldEVycm9ycyh7XG4gICAgICogICBub3RVbmlxdWU6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGV4cGVjdChsb2dpbi52YWxpZCkudG9FcXVhbChmYWxzZSk7XG4gICAgICogZXhwZWN0KGxvZ2luLmVycm9ycykudG9FcXVhbCh7IG5vdFVuaXF1ZTogdHJ1ZSB9KTtcbiAgICAgKlxuICAgICAqIGxvZ2luLnNldFZhbHVlKCdzb21lT3RoZXJMb2dpbicpO1xuICAgICAqXG4gICAgICogZXhwZWN0KGxvZ2luLnZhbGlkKS50b0VxdWFsKHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuc2V0RXJyb3JzID0gZnVuY3Rpb24gKGVycm9ycywgb3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29udHJvbHNFcnJvcnMob3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhIGNoaWxkIGNvbnRyb2wgZ2l2ZW4gdGhlIGNvbnRyb2wncyBuYW1lIG9yIHBhdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGF0aCBBIGRvdC1kZWxpbWl0ZWQgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZy9udW1iZXIgdmFsdWVzIHRoYXQgZGVmaW5lIHRoZSBwYXRoIHRvIHRoZVxuICAgICAqIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBSZXRyaWV2ZSBhIG5lc3RlZCBjb250cm9sXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgdG8gZ2V0IGEgYG5hbWVgIGNvbnRyb2wgbmVzdGVkIHdpdGhpbiBhIGBwZXJzb25gIHN1Yi1ncm91cDpcbiAgICAgKlxuICAgICAqICogYHRoaXMuZm9ybS5nZXQoJ3BlcnNvbi5uYW1lJyk7YFxuICAgICAqXG4gICAgICogLU9SLVxuICAgICAqXG4gICAgICogKiBgdGhpcy5mb3JtLmdldChbJ3BlcnNvbicsICduYW1lJ10pO2BcbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiBfZmluZCh0aGlzLCBwYXRoLCAnLicpOyB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlcG9ydHMgZXJyb3IgZGF0YSBmb3IgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGNvZGUgb2YgdGhlIGVycm9yIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbFxuICAgICAqIHRvIHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGBGb3JtR3JvdXBgOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAqICAgYWRkcmVzczogbmV3IEZvcm1Hcm91cCh7IHN0cmVldDogbmV3IEZvcm1Db250cm9sKCkgfSlcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBwYXRoIHRvIHRoZSAnc3RyZWV0JyBjb250cm9sIGZyb20gdGhlIHJvb3QgZm9ybSB3b3VsZCBiZSAnYWRkcmVzcycgLT4gJ3N0cmVldCcuXG4gICAgICpcbiAgICAgKiBJdCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhpcyBtZXRob2QgaW4gb25lIG9mIHR3byBmb3JtYXRzOlxuICAgICAqXG4gICAgICogMS4gQW4gYXJyYXkgb2Ygc3RyaW5nIGNvbnRyb2wgbmFtZXMsIGUuZy4gYFsnYWRkcmVzcycsICdzdHJlZXQnXWBcbiAgICAgKiAxLiBBIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiBjb250cm9sIG5hbWVzIGluIG9uZSBzdHJpbmcsIGUuZy4gYCdhZGRyZXNzLnN0cmVldCdgXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBlcnJvciBkYXRhIGZvciB0aGF0IHBhcnRpY3VsYXIgZXJyb3IuIElmIHRoZSBjb250cm9sIG9yIGVycm9yIGlzIG5vdCBwcmVzZW50LFxuICAgICAqIG51bGwgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5nZXRFcnJvciA9IGZ1bmN0aW9uIChlcnJvckNvZGUsIHBhdGgpIHtcbiAgICAgICAgdmFyIGNvbnRyb2wgPSBwYXRoID8gdGhpcy5nZXQocGF0aCkgOiB0aGlzO1xuICAgICAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmVycm9ycyA/IGNvbnRyb2wuZXJyb3JzW2Vycm9yQ29kZV0gOiBudWxsO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIHBhdGggaGFzIHRoZSBlcnJvciBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIFRoZSBjb2RlIG9mIHRoZSBlcnJvciB0byBjaGVja1xuICAgICAqIEBwYXJhbSBwYXRoIEEgbGlzdCBvZiBjb250cm9sIG5hbWVzIHRoYXQgZGVzaWduYXRlcyBob3cgdG8gbW92ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2xcbiAgICAgKiB0byB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGZvciBlcnJvcnMuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBgRm9ybUdyb3VwYDpcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgKiAgIGFkZHJlc3M6IG5ldyBGb3JtR3JvdXAoeyBzdHJlZXQ6IG5ldyBGb3JtQ29udHJvbCgpIH0pXG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgcGF0aCB0byB0aGUgJ3N0cmVldCcgY29udHJvbCBmcm9tIHRoZSByb290IGZvcm0gd291bGQgYmUgJ2FkZHJlc3MnIC0+ICdzdHJlZXQnLlxuICAgICAqXG4gICAgICogSXQgY2FuIGJlIHByb3ZpZGVkIHRvIHRoaXMgbWV0aG9kIGluIG9uZSBvZiB0d28gZm9ybWF0czpcbiAgICAgKlxuICAgICAqIDEuIEFuIGFycmF5IG9mIHN0cmluZyBjb250cm9sIG5hbWVzLCBlLmcuIGBbJ2FkZHJlc3MnLCAnc3RyZWV0J11gXG4gICAgICogMS4gQSBwZXJpb2QtZGVsaW1pdGVkIGxpc3Qgb2YgY29udHJvbCBuYW1lcyBpbiBvbmUgc3RyaW5nLCBlLmcuIGAnYWRkcmVzcy5zdHJlZXQnYFxuICAgICAqXG4gICAgICogSWYgbm8gcGF0aCBpcyBnaXZlbiwgdGhpcyBtZXRob2QgY2hlY2tzIGZvciB0aGUgZXJyb3Igb24gdGhlIGN1cnJlbnQgY29udHJvbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGVycm9yIGlzIHByZXNlbnQgaW4gdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIHBhdGguXG4gICAgICpcbiAgICAgKiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgZmFsc2UgaXMgcmV0dXJuZWQuXG4gICAgICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5oYXNFcnJvciA9IGZ1bmN0aW9uIChlcnJvckNvZGUsIHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRFcnJvcihlcnJvckNvZGUsIHBhdGgpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUsIFwicm9vdFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHRvcC1sZXZlbCBhbmNlc3RvciBvZiB0aGlzIGNvbnRyb2wuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcztcbiAgICAgICAgICAgIHdoaWxlICh4Ll9wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB4ID0geC5fcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl91cGRhdGVDb250cm9sc0Vycm9ycyA9IGZ1bmN0aW9uIChlbWl0RXZlbnQpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLl9jYWxjdWxhdGVTdGF0dXMoKTtcbiAgICAgICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDaGFuZ2VzLmVtaXQodGhpcy5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoZW1pdEV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuX2luaXRPYnNlcnZhYmxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB9O1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuX2NhbGN1bGF0ZVN0YXR1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbENvbnRyb2xzRGlzYWJsZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBESVNBQkxFRDtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzKVxuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIGlmICh0aGlzLl9hbnlDb250cm9sc0hhdmVTdGF0dXMoUEVORElORykpXG4gICAgICAgICAgICByZXR1cm4gUEVORElORztcbiAgICAgICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhJTlZBTElEKSlcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICByZXR1cm4gVkFMSUQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5fYW55Q29udHJvbHNIYXZlU3RhdHVzID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW55Q29udHJvbHMoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIGNvbnRyb2wuc3RhdHVzID09PSBzdGF0dXM7IH0pO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuX2FueUNvbnRyb2xzRGlydHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbnlDb250cm9scyhmdW5jdGlvbiAoY29udHJvbCkgeyByZXR1cm4gY29udHJvbC5kaXJ0eTsgfSk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5fYW55Q29udHJvbHNUb3VjaGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW55Q29udHJvbHMoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIGNvbnRyb2wudG91Y2hlZDsgfSk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5fdXBkYXRlUHJpc3RpbmUgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgICAgICB0aGlzLnByaXN0aW5lID0gIXRoaXMuX2FueUNvbnRyb2xzRGlydHkoKTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZShvcHRzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEFic3RyYWN0Q29udHJvbC5wcm90b3R5cGUuX3VwZGF0ZVRvdWNoZWQgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7IG9wdHMgPSB7fTsgfVxuICAgICAgICB0aGlzLnRvdWNoZWQgPSB0aGlzLl9hbnlDb250cm9sc1RvdWNoZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikge1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKG9wdHMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5faXNCb3hlZFZhbHVlID0gZnVuY3Rpb24gKGZvcm1TdGF0ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGZvcm1TdGF0ZSA9PT0gJ29iamVjdCcgJiYgZm9ybVN0YXRlICE9PSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtU3RhdGUpLmxlbmd0aCA9PT0gMiAmJiAndmFsdWUnIGluIGZvcm1TdGF0ZSAmJiAnZGlzYWJsZWQnIGluIGZvcm1TdGF0ZTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSBmbjsgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RDb250cm9sLnByb3RvdHlwZS5fc2V0VXBkYXRlU3RyYXRlZ3kgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBpZiAoaXNPcHRpb25zT2JqKG9wdHMpICYmIG9wdHMudXBkYXRlT24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlT24gPSBvcHRzLnVwZGF0ZU9uO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDaGVjayB0byBzZWUgaWYgcGFyZW50IGhhcyBiZWVuIG1hcmtlZCBhcnRpZmljaWFsbHkgZGlydHkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBBYnN0cmFjdENvbnRyb2wucHJvdG90eXBlLl9wYXJlbnRNYXJrZWREaXJ0eSA9IGZ1bmN0aW9uIChvbmx5U2VsZikge1xuICAgICAgICB2YXIgcGFyZW50RGlydHkgPSB0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50LmRpcnR5O1xuICAgICAgICByZXR1cm4gIW9ubHlTZWxmICYmIHBhcmVudERpcnR5ICYmICF0aGlzLl9wYXJlbnQuX2FueUNvbnRyb2xzRGlydHkoKTtcbiAgICB9O1xuICAgIHJldHVybiBBYnN0cmFjdENvbnRyb2w7XG59KCkpO1xuLyoqXG4gKiBUcmFja3MgdGhlIHZhbHVlIGFuZCB2YWxpZGF0aW9uIHN0YXR1cyBvZiBhbiBpbmRpdmlkdWFsIGZvcm0gY29udHJvbC5cbiAqXG4gKiBUaGlzIGlzIG9uZSBvZiB0aGUgdGhyZWUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIG9mIEFuZ3VsYXIgZm9ybXMsIGFsb25nIHdpdGhcbiAqIGBGb3JtR3JvdXBgIGFuZCBgRm9ybUFycmF5YC4gSXQgZXh0ZW5kcyB0aGUgYEFic3RyYWN0Q29udHJvbGAgY2xhc3MgdGhhdFxuICogaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGFjY2Vzc2luZyB0aGUgdmFsdWUsIHZhbGlkYXRpb24gc3RhdHVzLFxuICogdXNlciBpbnRlcmFjdGlvbnMgYW5kIGV2ZW50cy5cbiAqXG4gKiBAc2VlIGBBYnN0cmFjdENvbnRyb2xgXG4gKiBAc2VlIFtSZWFjdGl2ZSBGb3JtcyBHdWlkZV0oZ3VpZGUvcmVhY3RpdmUtZm9ybXMpXG4gKiBAc2VlIFtVc2FnZSBOb3Rlc10oI3VzYWdlLW5vdGVzKVxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEluaXRpYWxpemluZyBGb3JtIENvbnRyb2xzXG4gKlxuICogSW5zdGFudGlhdGUgYSBgRm9ybUNvbnRyb2xgLCB3aXRoIGFuIGluaXRpYWwgdmFsdWUuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJ3NvbWUgdmFsdWUnKTtcbiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAgICAgLy8gJ3NvbWUgdmFsdWUnXG4gKmBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbml0aWFsaXplcyB0aGUgY29udHJvbCB3aXRoIGEgZm9ybSBzdGF0ZSBvYmplY3QuIFRoZSBgdmFsdWVgXG4gKiBhbmQgYGRpc2FibGVkYCBrZXlzIGFyZSByZXF1aXJlZCBpbiB0aGlzIGNhc2UuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJ24vYScsIGRpc2FibGVkOiB0cnVlIH0pO1xuICogY29uc29sZS5sb2coY29udHJvbC52YWx1ZSk7ICAgICAvLyAnbi9hJ1xuICogY29uc29sZS5sb2coY29udHJvbC5zdGF0dXMpOyAgICAvLyAnRElTQUJMRUQnXG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2wgd2l0aCBhIHN5bmMgdmFsaWRhdG9yLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAgICAgIC8vICcnXG4gKiBjb25zb2xlLmxvZyhjb250cm9sLnN0YXR1cyk7ICAgICAvLyAnSU5WQUxJRCdcbiAqIGBgYFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbml0aWFsaXplcyB0aGUgY29udHJvbCB1c2luZyBhbiBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywge1xuICogICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAqICAgIGFzeW5jVmFsaWRhdG9yczogbXlBc3luY1ZhbGlkYXRvclxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ29uZmlndXJlIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBvbiBhIGJsdXIgZXZlbnRcbiAqXG4gKiBTZXQgdGhlIGB1cGRhdGVPbmAgb3B0aW9uIHRvIGAnYmx1cidgIHRvIHVwZGF0ZSBvbiB0aGUgYmx1ciBgZXZlbnRgLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IHVwZGF0ZU9uOiAnYmx1cicgfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ29uZmlndXJlIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBvbiBhIHN1Ym1pdCBldmVudFxuICpcbiAqIFNldCB0aGUgYHVwZGF0ZU9uYCBvcHRpb24gdG8gYCdzdWJtaXQnYCB0byB1cGRhdGUgb24gYSBzdWJtaXQgYGV2ZW50YC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyB1cGRhdGVPbjogJ3N1Ym1pdCcgfSk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgUmVzZXQgdGhlIGNvbnRyb2wgYmFjayB0byBhbiBpbml0aWFsIHZhbHVlXG4gKlxuICogWW91IHJlc2V0IHRvIGEgc3BlY2lmaWMgZm9ybSBzdGF0ZSBieSBwYXNzaW5nIHRocm91Z2ggYSBzdGFuZGFsb25lXG4gKiB2YWx1ZSBvciBhIGZvcm0gc3RhdGUgb2JqZWN0IHRoYXQgY29udGFpbnMgYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkIHN0YXRlXG4gKiAodGhlc2UgYXJlIHRoZSBvbmx5IHR3byBwcm9wZXJ0aWVzIHRoYXQgY2Fubm90IGJlIGNhbGN1bGF0ZWQpLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpO1xuICpcbiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnTmFuY3knXG4gKlxuICogY29udHJvbC5yZXNldCgnRHJldycpO1xuICpcbiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnRHJldydcbiAqIGBgYFxuICpcbiAqICMjIyBSZXNldCB0aGUgY29udHJvbCBiYWNrIHRvIGFuIGluaXRpYWwgdmFsdWUgYW5kIGRpc2FibGVkXG4gKlxuICogYGBgXG4gKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpO1xuICpcbiAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnTmFuY3knXG4gKiBjb25zb2xlLmxvZyhjb250cm9sLnN0YXR1cyk7IC8vICdWQUxJRCdcbiAqXG4gKiBjb250cm9sLnJlc2V0KHsgdmFsdWU6ICdEcmV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gKlxuICogY29uc29sZS5sb2coY29udHJvbC52YWx1ZSk7IC8vICdEcmV3J1xuICogY29uc29sZS5sb2coY29udHJvbC5zdGF0dXMpOyAvLyAnRElTQUJMRUQnXG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBGb3JtQ29udHJvbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ybUNvbnRyb2wsIF9zdXBlcik7XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIGEgbmV3IGBGb3JtQ29udHJvbGAgaW5zdGFuY2UuXG4gICAgKlxuICAgICogQHBhcmFtIGZvcm1TdGF0ZSBJbml0aWFsaXplcyB0aGUgY29udHJvbCB3aXRoIGFuIGluaXRpYWwgdmFsdWUsXG4gICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS5cbiAgICAqXG4gICAgKiBAcGFyYW0gdmFsaWRhdG9yT3JPcHRzIEEgc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uLCBvciBhbiBhcnJheSBvZlxuICAgICogc3VjaCBmdW5jdGlvbnMsIG9yIGFuIGBBYnN0cmFjdENvbnRyb2xPcHRpb25zYCBvYmplY3QgdGhhdCBjb250YWlucyB2YWxpZGF0aW9uIGZ1bmN0aW9uc1xuICAgICogYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLlxuICAgICpcbiAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvciBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9uc1xuICAgICpcbiAgICAqL1xuICAgIGZ1bmN0aW9uIEZvcm1Db250cm9sKGZvcm1TdGF0ZSwgdmFsaWRhdG9yT3JPcHRzLCBhc3luY1ZhbGlkYXRvcikge1xuICAgICAgICBpZiAoZm9ybVN0YXRlID09PSB2b2lkIDApIHsgZm9ybVN0YXRlID0gbnVsbDsgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjb2VyY2VUb1ZhbGlkYXRvcih2YWxpZGF0b3JPck9wdHMpLCBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpKSB8fCB0aGlzO1xuICAgICAgICAvKiogQGludGVybmFsICovXG4gICAgICAgIF90aGlzLl9vbkNoYW5nZSA9IFtdO1xuICAgICAgICBfdGhpcy5fYXBwbHlGb3JtU3RhdGUoZm9ybVN0YXRlKTtcbiAgICAgICAgX3RoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KHZhbGlkYXRvck9yT3B0cyk7XG4gICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgX3RoaXMuX2luaXRPYnNlcnZhYmxlcygpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvbnRyb2wuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXNcbiAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzXG4gICAgICogZmFsc2UuXG4gICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kXG4gICAgICogYHZhbHVlQ2hhbmdlc2BcbiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGlzIHVwZGF0ZWQuXG4gICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgICAqICogYGVtaXRNb2RlbFRvVmlld0NoYW5nZWA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgICh0aGUgZGVmYXVsdCksIGVhY2ggY2hhbmdlIHRyaWdnZXJzIGFuXG4gICAgICogYG9uQ2hhbmdlYCBldmVudCB0b1xuICAgICAqIHVwZGF0ZSB0aGUgdmlldy5cbiAgICAgKiAqIGBlbWl0Vmlld1RvTW9kZWxDaGFuZ2VgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGVhY2ggY2hhbmdlIHRyaWdnZXJzIGFuXG4gICAgICogYG5nTW9kZWxDaGFuZ2VgXG4gICAgICogZXZlbnQgdG8gdXBkYXRlIHRoZSBtb2RlbC5cbiAgICAgKlxuICAgICAqL1xuICAgIEZvcm1Db250cm9sLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9vbkNoYW5nZS5sZW5ndGggJiYgb3B0aW9ucy5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZS5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2VGbikgeyByZXR1cm4gY2hhbmdlRm4oX3RoaXMudmFsdWUsIG9wdGlvbnMuZW1pdFZpZXdUb01vZGVsQ2hhbmdlICE9PSBmYWxzZSk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgdGhlIHZhbHVlIG9mIGEgY29udHJvbC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGFzIHtAbGluayBGb3JtQ29udHJvbCNzZXRWYWx1ZSBzZXRWYWx1ZX0gYXQgdGhpcyBsZXZlbC5cbiAgICAgKiBJdCBleGlzdHMgZm9yIHN5bW1ldHJ5IHdpdGgge0BsaW5rIEZvcm1Hcm91cCNwYXRjaFZhbHVlIHBhdGNoVmFsdWV9IG9uIGBGb3JtR3JvdXBzYCBhbmRcbiAgICAgKiBgRm9ybUFycmF5c2AsIHdoZXJlIGl0IGRvZXMgYmVoYXZlIGRpZmZlcmVudGx5LlxuICAgICAqXG4gICAgICogQHNlZSBgc2V0VmFsdWVgIGZvciBvcHRpb25zXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLnBhdGNoVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGZvcm0gY29udHJvbCwgbWFya2luZyBpdCBgcHJpc3RpbmVgIGFuZCBgdW50b3VjaGVkYCwgYW5kIHNldHRpbmdcbiAgICAgKiB0aGUgdmFsdWUgdG8gbnVsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JtU3RhdGUgUmVzZXRzIHRoZSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSxcbiAgICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzXG4gICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXNcbiAgICAgKiBmYWxzZS5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgcmVzZXQuXG4gICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgICAqXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKGZvcm1TdGF0ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAoZm9ybVN0YXRlID09PSB2b2lkIDApIHsgZm9ybVN0YXRlID0gbnVsbDsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9hcHBseUZvcm1TdGF0ZShmb3JtU3RhdGUpO1xuICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm1hcmtBc1VudG91Y2hlZChvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ0NoYW5nZSA9IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLl91cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBGb3JtQ29udHJvbC5wcm90b3R5cGUuX2FueUNvbnRyb2xzID0gZnVuY3Rpb24gKGNvbmRpdGlvbikgeyByZXR1cm4gZmFsc2U7IH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLl9hbGxDb250cm9sc0Rpc2FibGVkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5kaXNhYmxlZDsgfTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBjaGFuZ2UgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlc1xuICAgICAqL1xuICAgIEZvcm1Db250cm9sLnByb3RvdHlwZS5yZWdpc3Rlck9uQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMuX29uQ2hhbmdlLnB1c2goZm4pOyB9O1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEZvcm1Db250cm9sLnByb3RvdHlwZS5fY2xlYXJDaGFuZ2VGbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gW107XG4gICAgICAgIHRoaXMuX29uRGlzYWJsZWRDaGFuZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgZGlzYWJsZWQgZXZlbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdHVzIGNoYW5nZXMuXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICB0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLnB1c2goZm4pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLl9mb3JFYWNoQ2hpbGQgPSBmdW5jdGlvbiAoY2IpIHsgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUNvbnRyb2wucHJvdG90eXBlLl9zeW5jUGVuZGluZ0NvbnRyb2xzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy51cGRhdGVPbiA9PT0gJ3N1Ym1pdCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRGlydHkpXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdUb3VjaGVkKVxuICAgICAgICAgICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3BlbmRpbmdWYWx1ZSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBGb3JtQ29udHJvbC5wcm90b3R5cGUuX2FwcGx5Rm9ybVN0YXRlID0gZnVuY3Rpb24gKGZvcm1TdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5faXNCb3hlZFZhbHVlKGZvcm1TdGF0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWUgPSBmb3JtU3RhdGUudmFsdWU7XG4gICAgICAgICAgICBmb3JtU3RhdGUuZGlzYWJsZWQgPyB0aGlzLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KSA6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWUgPSBmb3JtU3RhdGU7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBGb3JtQ29udHJvbDtcbn0oQWJzdHJhY3RDb250cm9sKSk7XG4vKipcbiAqIFRyYWNrcyB0aGUgdmFsdWUgYW5kIHZhbGlkaXR5IHN0YXRlIG9mIGEgZ3JvdXAgb2YgYEZvcm1Db250cm9sYCBpbnN0YW5jZXMuXG4gKlxuICogQSBgRm9ybUdyb3VwYCBhZ2dyZWdhdGVzIHRoZSB2YWx1ZXMgb2YgZWFjaCBjaGlsZCBgRm9ybUNvbnRyb2xgIGludG8gb25lIG9iamVjdCxcbiAqIHdpdGggZWFjaCBjb250cm9sIG5hbWUgYXMgdGhlIGtleS4gIEl0IGNhbGN1bGF0ZXMgaXRzIHN0YXR1cyBieSByZWR1Y2luZyB0aGUgc3RhdHVzIHZhbHVlc1xuICogb2YgaXRzIGNoaWxkcmVuLiBGb3IgZXhhbXBsZSwgaWYgb25lIG9mIHRoZSBjb250cm9scyBpbiBhIGdyb3VwIGlzIGludmFsaWQsIHRoZSBlbnRpcmVcbiAqIGdyb3VwIGJlY29tZXMgaW52YWxpZC5cbiAqXG4gKiBgRm9ybUdyb3VwYCBpcyBvbmUgb2YgdGhlIHRocmVlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyB1c2VkIHRvIGRlZmluZSBmb3JtcyBpbiBBbmd1bGFyLFxuICogYWxvbmcgd2l0aCBgRm9ybUNvbnRyb2xgIGFuZCBgRm9ybUFycmF5YC5cbiAqXG4gKiBXaGVuIGluc3RhbnRpYXRpbmcgYSBgRm9ybUdyb3VwYCwgcGFzcyBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGQgY29udHJvbHMgYXMgdGhlIGZpcnN0XG4gKiBhcmd1bWVudC4gVGhlIGtleSBmb3IgZWFjaCBjaGlsZCByZWdpc3RlcnMgdGhlIG5hbWUgZm9yIHRoZSBjb250cm9sLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCAyIGNvbnRyb2xzXG4gKlxuICogYGBgXG4gKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JywgVmFsaWRhdG9ycy5taW5MZW5ndGgoMikpLFxuICogICBsYXN0OiBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnKSxcbiAqIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogJ05hbmN5JywgbGFzdDsgJ0RyZXcnfVxuICogY29uc29sZS5sb2coZm9ybS5zdGF0dXMpOyAgLy8gJ1ZBTElEJ1xuICogYGBgXG4gKlxuICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCBhIGdyb3VwLWxldmVsIHZhbGlkYXRvclxuICpcbiAqIFlvdSBpbmNsdWRlIGdyb3VwLWxldmVsIHZhbGlkYXRvcnMgYXMgdGhlIHNlY29uZCBhcmcsIG9yIGdyb3VwLWxldmVsIGFzeW5jXG4gKiB2YWxpZGF0b3JzIGFzIHRoZSB0aGlyZCBhcmcuIFRoZXNlIGNvbWUgaW4gaGFuZHkgd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIHZhbGlkYXRpb25cbiAqIHRoYXQgY29uc2lkZXJzIHRoZSB2YWx1ZSBvZiBtb3JlIHRoYW4gb25lIGNoaWxkIGNvbnRyb2wuXG4gKlxuICogYGBgXG4gKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gKiAgIHBhc3N3b3JkOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSxcbiAqICAgcGFzc3dvcmRDb25maXJtOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSxcbiAqIH0sIHBhc3N3b3JkTWF0Y2hWYWxpZGF0b3IpO1xuICpcbiAqXG4gKiBmdW5jdGlvbiBwYXNzd29yZE1hdGNoVmFsaWRhdG9yKGc6IEZvcm1Hcm91cCkge1xuICogICAgcmV0dXJuIGcuZ2V0KCdwYXNzd29yZCcpLnZhbHVlID09PSBnLmdldCgncGFzc3dvcmRDb25maXJtJykudmFsdWVcbiAqICAgICAgID8gbnVsbCA6IHsnbWlzbWF0Y2gnOiB0cnVlfTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIExpa2UgYEZvcm1Db250cm9sYCBpbnN0YW5jZXMsIHlvdSBjaG9vc2UgdG8gcGFzcyBpblxuICogdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycyBhcyBwYXJ0IG9mIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIGBgYFxuICogY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xuICogICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sKCcnKVxuICogICBwYXNzd29yZENvbmZpcm06IG5ldyBGb3JtQ29udHJvbCgnJylcbiAqIH0sIHsgdmFsaWRhdG9yczogcGFzc3dvcmRNYXRjaFZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3JzOiBvdGhlclZhbGlkYXRvciB9KTtcbiAqIGBgYFxuICpcbiAqICMjIyBTZXQgdGhlIHVwZGF0ZU9uIHByb3BlcnR5IGZvciBhbGwgY29udHJvbHMgaW4gYSBmb3JtIGdyb3VwXG4gKlxuICogVGhlIG9wdGlvbnMgb2JqZWN0IGlzIHVzZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCBjaGlsZFxuICogY29udHJvbCdzIGB1cGRhdGVPbmAgcHJvcGVydHkuIElmIHlvdSBzZXQgYHVwZGF0ZU9uYCB0byBgJ2JsdXInYCBhdCB0aGVcbiAqIGdyb3VwIGxldmVsLCBhbGwgY2hpbGQgY29udHJvbHMgZGVmYXVsdCB0byAnYmx1cicsIHVubGVzcyB0aGUgY2hpbGRcbiAqIGhhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhIGRpZmZlcmVudCBgdXBkYXRlT25gIHZhbHVlLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjID0gbmV3IEZvcm1Hcm91cCh7XG4gKiAgIG9uZTogbmV3IEZvcm1Db250cm9sKClcbiAqIH0sIHsgdXBkYXRlT246ICdibHVyJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1Hcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ybUdyb3VwLCBfc3VwZXIpO1xuICAgIC8qKlxuICAgICogQ3JlYXRlcyBhIG5ldyBgRm9ybUdyb3VwYCBpbnN0YW5jZS5cbiAgICAqXG4gICAgKiBAcGFyYW0gY29udHJvbHMgQSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbnRyb2xzLiBUaGUga2V5IGZvciBlYWNoIGNoaWxkIGlzIHRoZSBuYW1lXG4gICAgKiB1bmRlciB3aGljaCBpdCBpcyByZWdpc3RlcmVkLlxuICAgICpcbiAgICAqIEBwYXJhbSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mXG4gICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZnVuY3Rpb25zXG4gICAgKiBhbmQgYSB2YWxpZGF0aW9uIHRyaWdnZXIuXG4gICAgKlxuICAgICogQHBhcmFtIGFzeW5jVmFsaWRhdG9yIEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zXG4gICAgKlxuICAgICovXG4gICAgZnVuY3Rpb24gRm9ybUdyb3VwKGNvbnRyb2xzLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvZXJjZVRvVmFsaWRhdG9yKHZhbGlkYXRvck9yT3B0cyksIGNvZXJjZVRvQXN5bmNWYWxpZGF0b3IoYXN5bmNWYWxpZGF0b3IsIHZhbGlkYXRvck9yT3B0cykpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRyb2xzID0gY29udHJvbHM7XG4gICAgICAgIF90aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgICAgICAgX3RoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KHZhbGlkYXRvck9yT3B0cyk7XG4gICAgICAgIF90aGlzLl9zZXRVcENvbnRyb2xzKCk7XG4gICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBjb250cm9sIHdpdGggdGhlIGdyb3VwJ3MgbGlzdCBvZiBjb250cm9scy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHVwZGF0ZSB0aGUgdmFsdWUgb3IgdmFsaWRpdHkgb2YgdGhlIGNvbnRyb2wuXG4gICAgICogVXNlIHtAbGluayBGb3JtR3JvdXAjYWRkQ29udHJvbCBhZGRDb250cm9sfSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byByZWdpc3RlciBpbiB0aGUgY29sbGVjdGlvblxuICAgICAqIEBwYXJhbSBjb250cm9sIFByb3ZpZGVzIHRoZSBjb250cm9sIGZvciB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUucmVnaXN0ZXJDb250cm9sID0gZnVuY3Rpb24gKG5hbWUsIGNvbnRyb2wpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgdGhpcy5jb250cm9sc1tuYW1lXSA9IGNvbnRyb2w7XG4gICAgICAgIGNvbnRyb2wuc2V0UGFyZW50KHRoaXMpO1xuICAgICAgICBjb250cm9sLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpO1xuICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIGNvbnRyb2wgdG8gdGhpcyBncm91cC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGFsc28gdXBkYXRlcyB0aGUgdmFsdWUgYW5kIHZhbGlkaXR5IG9mIHRoZSBjb250cm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byBhZGQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0gY29udHJvbCBQcm92aWRlcyB0aGUgY29udHJvbCBmb3IgdGhlIGdpdmVuIG5hbWVcbiAgICAgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLmFkZENvbnRyb2wgPSBmdW5jdGlvbiAobmFtZSwgY29udHJvbCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgY29udHJvbCBmcm9tIHRoaXMgZ3JvdXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgY29udHJvbCBuYW1lIHRvIHJlbW92ZSBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgRm9ybUdyb3VwLnByb3RvdHlwZS5yZW1vdmVDb250cm9sID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzW25hbWVdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZShmdW5jdGlvbiAoKSB7IH0pO1xuICAgICAgICBkZWxldGUgKHRoaXMuY29udHJvbHNbbmFtZV0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgY29udHJvbCBuYW1lIHRvIHJlcGxhY2UgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0gY29udHJvbCBQcm92aWRlcyB0aGUgY29udHJvbCBmb3IgdGhlIGdpdmVuIG5hbWVcbiAgICAgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLnNldENvbnRyb2wgPSBmdW5jdGlvbiAobmFtZSwgY29udHJvbCkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sc1tuYW1lXSlcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHNbbmFtZV0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgICAgIGRlbGV0ZSAodGhpcy5jb250cm9sc1tuYW1lXSk7XG4gICAgICAgIGlmIChjb250cm9sKVxuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbnRyb2wobmFtZSwgY29udHJvbCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW4gZW5hYmxlZCBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdyb3VwLlxuICAgICAqXG4gICAgICogUmVwb3J0cyBmYWxzZSBmb3IgZGlzYWJsZWQgY29udHJvbHMuIElmIHlvdSdkIGxpa2UgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBpbiB0aGUgZ3JvdXBcbiAgICAgKiBvbmx5LCB1c2Uge0BsaW5rIEFic3RyYWN0Q29udHJvbCNnZXQgZ2V0fSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBjb2xsZWN0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBmYWxzZSBmb3IgZGlzYWJsZWQgY29udHJvbHMsIHRydWUgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoY29udHJvbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMuaGFzT3duUHJvcGVydHkoY29udHJvbE5hbWUpICYmIHRoaXMuY29udHJvbHNbY29udHJvbE5hbWVdLmVuYWJsZWQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAuIEl0IGFjY2VwdHMgYW4gb2JqZWN0IHRoYXQgbWF0Y2hlc1xuICAgICAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdyb3VwLCB3aXRoIGNvbnRyb2wgbmFtZXMgYXMga2V5cy5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIFNldCB0aGUgY29tcGxldGUgdmFsdWUgZm9yIHRoZSBmb3JtIGdyb3VwXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICogICBmaXJzdDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgICogICBsYXN0OiBuZXcgRm9ybUNvbnRyb2woKVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAgLy8ge2ZpcnN0OiBudWxsLCBsYXN0OiBudWxsfVxuICAgICAqXG4gICAgICogZm9ybS5zZXRWYWx1ZSh7Zmlyc3Q6ICdOYW5jeScsIGxhc3Q6ICdEcmV3J30pO1xuICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogJ05hbmN5JywgbGFzdDogJ0RyZXcnfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHRocm93cyBXaGVuIHN0cmljdCBjaGVja3MgZmFpbCwgc3VjaCBhcyBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGNvbnRyb2xcbiAgICAgKiB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgaWYgeW91IGV4Y2x1ZGluZyB0aGUgdmFsdWUgb2YgYSBjb250cm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBjb250cm9sIHRoYXQgbWF0Y2hlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBncm91cC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlc1xuICAgICAqIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzXG4gICAgICogZmFsc2UuXG4gICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kXG4gICAgICogYHZhbHVlQ2hhbmdlc2BcbiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGlzIHVwZGF0ZWQuXG4gICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgICAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdGhpcy5fY2hlY2tBbGxWYWx1ZXNQcmVzZW50KHZhbHVlKTtcbiAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIF90aGlzLl90aHJvd0lmQ29udHJvbE1pc3NpbmcobmFtZSk7XG4gICAgICAgICAgICBfdGhpcy5jb250cm9sc1tuYW1lXS5zZXRWYWx1ZSh2YWx1ZVtuYW1lXSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRpb25zLmVtaXRFdmVudCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgdGhlIHZhbHVlIG9mIHRoZSBgRm9ybUdyb3VwYC4gSXQgYWNjZXB0cyBhbiBvYmplY3Qgd2l0aCBjb250cm9sXG4gICAgICogbmFtZXMgYXMga2V5cywgYW5kIGRvZXMgaXRzIGJlc3QgdG8gbWF0Y2ggdGhlIHZhbHVlcyB0byB0aGUgY29ycmVjdCBjb250cm9sc1xuICAgICAqIGluIHRoZSBncm91cC5cbiAgICAgKlxuICAgICAqIEl0IGFjY2VwdHMgYm90aCBzdXBlci1zZXRzIGFuZCBzdWItc2V0cyBvZiB0aGUgZ3JvdXAgd2l0aG91dCB0aHJvd2luZyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICogIyMjIFBhdGNoIHRoZSB2YWx1ZSBmb3IgYSBmb3JtIGdyb3VwXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICogICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAqICAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgpXG4gICAgICogfSk7XG4gICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAgLy8ge2ZpcnN0OiBudWxsLCBsYXN0OiBudWxsfVxuICAgICAqXG4gICAgICogZm9ybS5wYXRjaFZhbHVlKHtmaXJzdDogJ05hbmN5J30pO1xuICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogJ05hbmN5JywgbGFzdDogbnVsbH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBncm91cC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmRcbiAgICAgKiBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIHZhbHVlIGlzIHBhdGNoZWQuXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzXG4gICAgICogdHJ1ZS5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC5cbiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuXG4gICAgICovXG4gICAgRm9ybUdyb3VwLnByb3RvdHlwZS5wYXRjaFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuY29udHJvbHNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5jb250cm9sc1tuYW1lXS5wYXRjaFZhbHVlKHZhbHVlW25hbWVdLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVzZXRzIHRoZSBgRm9ybUdyb3VwYCwgbWFya3MgYWxsIGRlc2NlbmRhbnRzIGFyZSBtYXJrZWQgYHByaXN0aW5lYCBhbmQgYHVudG91Y2hlZGAsIGFuZFxuICAgICAqIHRoZSB2YWx1ZSBvZiBhbGwgZGVzY2VuZGFudHMgdG8gbnVsbC5cbiAgICAgKlxuICAgICAqIFlvdSByZXNldCB0byBhIHNwZWNpZmljIGZvcm0gc3RhdGUgYnkgcGFzc2luZyBpbiBhIG1hcCBvZiBzdGF0ZXNcbiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB5b3VyIGZvcm0sIHdpdGggY29udHJvbCBuYW1lcyBhcyBrZXlzLiBUaGUgc3RhdGVcbiAgICAgKiBpcyBhIHN0YW5kYWxvbmUgdmFsdWUgb3IgYSBmb3JtIHN0YXRlIG9iamVjdCB3aXRoIGJvdGggYSB2YWx1ZSBhbmQgYSBkaXNhYmxlZFxuICAgICAqIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JtU3RhdGUgUmVzZXRzIHRoZSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSxcbiAgICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzXG4gICAgICogYW5kIGVtaXRzIGV2ZW50cyB3aGVuIHRoZSBncm91cCBpcyByZXNldC5cbiAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzXG4gICAgICogZmFsc2UuXG4gICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kXG4gICAgICogYHZhbHVlQ2hhbmdlc2BcbiAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHJlc2V0LlxuICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC5cbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eVxuICAgICAqIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHl9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEB1c2FnZU5vdGVzXG4gICAgICpcbiAgICAgKiAjIyMgUmVzZXQgdGhlIGZvcm0gZ3JvdXAgdmFsdWVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSxcbiAgICAgKiAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnbGFzdCBuYW1lJylcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgLy8ge2ZpcnN0OiAnZmlyc3QgbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnfVxuICAgICAqXG4gICAgICogZm9ybS5yZXNldCh7IGZpcnN0OiAnbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICduYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAjIyMgUmVzZXQgdGhlIGZvcm0gZ3JvdXAgdmFsdWVzIGFuZCBkaXNhYmxlZCBzdGF0dXNcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSxcbiAgICAgKiAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnbGFzdCBuYW1lJylcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGZvcm0ucmVzZXQoe1xuICAgICAqICAgZmlyc3Q6IHt2YWx1ZTogJ25hbWUnLCBkaXNhYmxlZDogdHJ1ZX0sXG4gICAgICogICBsYXN0OiAnbGFzdCdcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHRoaXMuZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICduYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9XG4gICAgICogY29uc29sZS5sb2codGhpcy5mb3JtLmdldCgnZmlyc3QnKS5zdGF0dXMpOyAgLy8gJ0RJU0FCTEVEJ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsgdmFsdWUgPSB7fTsgfVxuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wsIG5hbWUpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWVbbmFtZV0sIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl91cGRhdGVQcmlzdGluZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlVG91Y2hlZChvcHRpb25zKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAsIGluY2x1ZGluZyBhbnkgZGlzYWJsZWQgY29udHJvbHMuXG4gICAgICpcbiAgICAgKiBSZXRyaWV2ZXMgYWxsIHZhbHVlcyByZWdhcmRsZXNzIG9mIGRpc2FibGVkIHN0YXR1cy5cbiAgICAgKiBUaGUgYHZhbHVlYCBwcm9wZXJ0eSBpcyB0aGUgYmVzdCB3YXkgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXAsIGJlY2F1c2VcbiAgICAgKiBpdCBleGNsdWRlcyBkaXNhYmxlZCBjb250cm9scyBpbiB0aGUgYEZvcm1Hcm91cGAuXG4gICAgICovXG4gICAgRm9ybUdyb3VwLnByb3RvdHlwZS5nZXRSYXdWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LCBmdW5jdGlvbiAoYWNjLCBjb250cm9sLCBuYW1lKSB7XG4gICAgICAgICAgICBhY2NbbmFtZV0gPSBjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgPyBjb250cm9sLnZhbHVlIDogY29udHJvbC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUdyb3VwLnByb3RvdHlwZS5fc3luY1BlbmRpbmdDb250cm9scyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN1YnRyZWVVcGRhdGVkID0gdGhpcy5fcmVkdWNlQ2hpbGRyZW4oZmFsc2UsIGZ1bmN0aW9uICh1cGRhdGVkLCBjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNoaWxkLl9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgPyB0cnVlIDogdXBkYXRlZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdWJ0cmVlVXBkYXRlZClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3VidHJlZVVwZGF0ZWQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUdyb3VwLnByb3RvdHlwZS5fdGhyb3dJZkNvbnRyb2xNaXNzaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlxcbiAgICAgICAgVGhlcmUgYXJlIG5vIGZvcm0gY29udHJvbHMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZ3JvdXAgeWV0LiAgSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsXFxuICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS5cXG4gICAgICBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xzW25hbWVdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiBcIiArIG5hbWUgKyBcIi5cIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLl9mb3JFYWNoQ2hpbGQgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5jb250cm9scykuZm9yRWFjaChmdW5jdGlvbiAoaykgeyByZXR1cm4gY2IoX3RoaXMuY29udHJvbHNba10sIGspOyB9KTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLl9zZXRVcENvbnRyb2xzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0UGFyZW50KF90aGlzKTtcbiAgICAgICAgICAgIGNvbnRyb2wuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKF90aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLl91cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uICgpIHsgdGhpcy52YWx1ZSA9IHRoaXMuX3JlZHVjZVZhbHVlKCk7IH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUuX2FueUNvbnRyb2xzID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY29udHJvbCwgbmFtZSkge1xuICAgICAgICAgICAgcmVzID0gcmVzIHx8IChfdGhpcy5jb250YWlucyhuYW1lKSAmJiBjb25kaXRpb24oY29udHJvbCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLl9yZWR1Y2VWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LCBmdW5jdGlvbiAoYWNjLCBjb250cm9sLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5lbmFibGVkIHx8IF90aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgYWNjW25hbWVdID0gY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUuX3JlZHVjZUNoaWxkcmVuID0gZnVuY3Rpb24gKGluaXRWYWx1ZSwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IGluaXRWYWx1ZTtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uIChjb250cm9sLCBuYW1lKSB7IHJlcyA9IGZuKHJlcywgY29udHJvbCwgbmFtZSk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1Hcm91cC5wcm90b3R5cGUuX2FsbENvbnRyb2xzRGlzYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29udHJvbE5hbWUgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sc1tjb250cm9sTmFtZV0uZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmxlbmd0aCA+IDAgfHwgdGhpcy5kaXNhYmxlZDtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtR3JvdXAucHJvdG90eXBlLl9jaGVja0FsbFZhbHVlc1ByZXNlbnQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uIChjb250cm9sLCBuYW1lKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11c3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGZvcm0gY29udHJvbCB3aXRoIG5hbWU6ICdcIiArIG5hbWUgKyBcIicuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBGb3JtR3JvdXA7XG59KEFic3RyYWN0Q29udHJvbCkpO1xuLyoqXG4gKiBUcmFja3MgdGhlIHZhbHVlIGFuZCB2YWxpZGl0eSBzdGF0ZSBvZiBhbiBhcnJheSBvZiBgRm9ybUNvbnRyb2xgLFxuICogYEZvcm1Hcm91cGAgb3IgYEZvcm1BcnJheWAgaW5zdGFuY2VzLlxuICpcbiAqIEEgYEZvcm1BcnJheWAgYWdncmVnYXRlcyB0aGUgdmFsdWVzIG9mIGVhY2ggY2hpbGQgYEZvcm1Db250cm9sYCBpbnRvIGFuIGFycmF5LlxuICogSXQgY2FsY3VsYXRlcyBpdHMgc3RhdHVzIGJ5IHJlZHVjaW5nIHRoZSBzdGF0dXMgdmFsdWVzIG9mIGl0cyBjaGlsZHJlbi4gRm9yIGV4YW1wbGUsIGlmIG9uZSBvZlxuICogdGhlIGNvbnRyb2xzIGluIGEgYEZvcm1BcnJheWAgaXMgaW52YWxpZCwgdGhlIGVudGlyZSBhcnJheSBiZWNvbWVzIGludmFsaWQuXG4gKlxuICogYEZvcm1BcnJheWAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhcixcbiAqIGFsb25nIHdpdGggYEZvcm1Db250cm9sYCBhbmQgYEZvcm1Hcm91cGAuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgQ3JlYXRlIGFuIGFycmF5IG9mIGZvcm0gY29udHJvbHNcbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoW1xuICogICBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JywgVmFsaWRhdG9ycy5taW5MZW5ndGgoMikpLFxuICogICBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnKSxcbiAqIF0pO1xuICpcbiAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gWydOYW5jeScsICdEcmV3J11cbiAqIGNvbnNvbGUubG9nKGFyci5zdGF0dXMpOyAgLy8gJ1ZBTElEJ1xuICogYGBgXG4gKlxuICogIyMjIENyZWF0ZSBhIGZvcm0gYXJyYXkgd2l0aCBhcnJheS1sZXZlbCB2YWxpZGF0b3JzXG4gKlxuICogWW91IGluY2x1ZGUgYXJyYXktbGV2ZWwgdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycy4gVGhlc2UgY29tZSBpbiBoYW5keVxuICogd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIHZhbGlkYXRpb24gdGhhdCBjb25zaWRlcnMgdGhlIHZhbHVlIG9mIG1vcmUgdGhhbiBvbmUgY2hpbGRcbiAqIGNvbnRyb2wuXG4gKlxuICogVGhlIHR3byB0eXBlcyBvZiB2YWxpZGF0b3JzIGFyZSBwYXNzZWQgaW4gc2VwYXJhdGVseSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmdcbiAqIHJlc3BlY3RpdmVseSwgb3IgdG9nZXRoZXIgYXMgcGFydCBvZiBhbiBvcHRpb25zIG9iamVjdC5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoW1xuICogICBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JyksXG4gKiAgIG5ldyBGb3JtQ29udHJvbCgnRHJldycpXG4gKiBdLCB7dmFsaWRhdG9yczogbXlWYWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yczogbXlBc3luY1ZhbGlkYXRvcn0pO1xuICogYGBgXG4gKlxuICAqICMjIyBTZXQgdGhlIHVwZGF0ZU9uIHByb3BlcnR5IGZvciBhbGwgY29udHJvbHMgaW4gYSBmb3JtIGFycmF5XG4gKlxuICogVGhlIG9wdGlvbnMgb2JqZWN0IGlzIHVzZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCBjaGlsZFxuICogY29udHJvbCdzIGB1cGRhdGVPbmAgcHJvcGVydHkuIElmIHlvdSBzZXQgYHVwZGF0ZU9uYCB0byBgJ2JsdXInYCBhdCB0aGVcbiAqIGFycmF5IGxldmVsLCBhbGwgY2hpbGQgY29udHJvbHMgZGVmYXVsdCB0byAnYmx1cicsIHVubGVzcyB0aGUgY2hpbGRcbiAqIGhhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhIGRpZmZlcmVudCBgdXBkYXRlT25gIHZhbHVlLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBhcnIgPSBuZXcgRm9ybUFycmF5KFtcbiAqICAgIG5ldyBGb3JtQ29udHJvbCgpXG4gKiBdLCB7dXBkYXRlT246ICdibHVyJ30pO1xuICogYGBgXG4gKlxuICogIyMjIEFkZGluZyBvciByZW1vdmluZyBjb250cm9scyBmcm9tIGEgZm9ybSBhcnJheVxuICpcbiAqIFRvIGNoYW5nZSB0aGUgY29udHJvbHMgaW4gdGhlIGFycmF5LCB1c2UgdGhlIGBwdXNoYCwgYGluc2VydGAsIGByZW1vdmVBdGAgb3IgYGNsZWFyYCBtZXRob2RzXG4gKiBpbiBgRm9ybUFycmF5YCBpdHNlbGYuIFRoZXNlIG1ldGhvZHMgZW5zdXJlIHRoZSBjb250cm9scyBhcmUgcHJvcGVybHkgdHJhY2tlZCBpbiB0aGVcbiAqIGZvcm0ncyBoaWVyYXJjaHkuIERvIG5vdCBtb2RpZnkgdGhlIGFycmF5IG9mIGBBYnN0cmFjdENvbnRyb2xgcyB1c2VkIHRvIGluc3RhbnRpYXRlXG4gKiB0aGUgYEZvcm1BcnJheWAgZGlyZWN0bHksIGFzIHRoYXQgcmVzdWx0IGluIHN0cmFuZ2UgYW5kIHVuZXhwZWN0ZWQgYmVoYXZpb3Igc3VjaFxuICogYXMgYnJva2VuIGNoYW5nZSBkZXRlY3Rpb24uXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgRm9ybUFycmF5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb3JtQXJyYXksIF9zdXBlcik7XG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIGEgbmV3IGBGb3JtQXJyYXlgIGluc3RhbmNlLlxuICAgICpcbiAgICAqIEBwYXJhbSBjb250cm9scyBBbiBhcnJheSBvZiBjaGlsZCBjb250cm9scy4gRWFjaCBjaGlsZCBjb250cm9sIGlzIGdpdmVuIGFuIGluZGV4XG4gICAgKiB3aGVyZSBpdCBpcyByZWdpc3RlcmVkLlxuICAgICpcbiAgICAqIEBwYXJhbSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mXG4gICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZnVuY3Rpb25zXG4gICAgKiBhbmQgYSB2YWxpZGF0aW9uIHRyaWdnZXIuXG4gICAgKlxuICAgICogQHBhcmFtIGFzeW5jVmFsaWRhdG9yIEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zXG4gICAgKlxuICAgICovXG4gICAgZnVuY3Rpb24gRm9ybUFycmF5KGNvbnRyb2xzLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGNvZXJjZVRvVmFsaWRhdG9yKHZhbGlkYXRvck9yT3B0cyksIGNvZXJjZVRvQXN5bmNWYWxpZGF0b3IoYXN5bmNWYWxpZGF0b3IsIHZhbGlkYXRvck9yT3B0cykpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmNvbnRyb2xzID0gY29udHJvbHM7XG4gICAgICAgIF90aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgICAgICAgX3RoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KHZhbGlkYXRvck9yT3B0cyk7XG4gICAgICAgIF90aGlzLl9zZXRVcENvbnRyb2xzKCk7XG4gICAgICAgIF90aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGBBYnN0cmFjdENvbnRyb2xgIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gcmV0cmlldmUgdGhlIGNvbnRyb2xcbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiB0aGlzLmNvbnRyb2xzW2luZGV4XTsgfTtcbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBuZXcgYEFic3RyYWN0Q29udHJvbGAgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJvbCBGb3JtIGNvbnRyb2wgdG8gYmUgaW5zZXJ0ZWRcbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLnB1c2goY29udHJvbCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGEgbmV3IGBBYnN0cmFjdENvbnRyb2xgIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gaW5zZXJ0IHRoZSBjb250cm9sXG4gICAgICogQHBhcmFtIGNvbnRyb2wgRm9ybSBjb250cm9sIHRvIGJlIGluc2VydGVkXG4gICAgICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoaW5kZXgsIGNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy5zcGxpY2UoaW5kZXgsIDAsIGNvbnRyb2wpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2woY29udHJvbCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBjb250cm9sIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGluIHRoZSBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gcmVtb3ZlIHRoZSBjb250cm9sXG4gICAgICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5yZW1vdmVBdCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sc1tpbmRleF0pXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzW2luZGV4XS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgdGhpcy5jb250cm9scy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgY29udHJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gcmVwbGFjZSB0aGUgY29udHJvbFxuICAgICAqIEBwYXJhbSBjb250cm9sIFRoZSBgQWJzdHJhY3RDb250cm9sYCBjb250cm9sIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGNvbnRyb2xcbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLnNldENvbnRyb2wgPSBmdW5jdGlvbiAoaW5kZXgsIGNvbnRyb2wpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbaW5kZXhdKVxuICAgICAgICAgICAgdGhpcy5jb250cm9sc1tpbmRleF0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAwLCBjb250cm9sKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUFycmF5LnByb3RvdHlwZSwgXCJsZW5ndGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogTGVuZ3RoIG9mIHRoZSBjb250cm9sIGFycmF5LlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aDsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQXJyYXlgLiBJdCBhY2NlcHRzIGFuIGFycmF5IHRoYXQgbWF0Y2hlc1xuICAgICAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2wuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBzdHJpY3QgY2hlY2tzLCBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHlvdSB0cnlcbiAgICAgKiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgY29udHJvbCB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgaWYgeW91IGV4Y2x1ZGUgdGhlXG4gICAgICogdmFsdWUgb2YgYSBjb250cm9sLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgU2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBjb250cm9scyBpbiB0aGUgZm9ybSBhcnJheVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbXG4gICAgICogICBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICAgKiAgIG5ldyBGb3JtQ29udHJvbCgpXG4gICAgICogXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbbnVsbCwgbnVsbF1cbiAgICAgKlxuICAgICAqIGFyci5zZXRWYWx1ZShbJ05hbmN5JywgJ0RyZXcnXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbJ05hbmN5JywgJ0RyZXcnXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEFycmF5IG9mIHZhbHVlcyBmb3IgdGhlIGNvbnRyb2xzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJlIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmRcbiAgICAgKiBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIHZhbHVlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHRcbiAgICAgKiBpcyBmYWxzZS5cbiAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmRcbiAgICAgKiBgdmFsdWVDaGFuZ2VzYFxuICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC5cbiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuXG4gICAgICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICB0aGlzLl9jaGVja0FsbFZhbHVlc1ByZXNlbnQodmFsdWUpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChuZXdWYWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIF90aGlzLl90aHJvd0lmQ29udHJvbE1pc3NpbmcoaW5kZXgpO1xuICAgICAgICAgICAgX3RoaXMuYXQoaW5kZXgpLnNldFZhbHVlKG5ld1ZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUGF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQXJyYXlgLiBJdCBhY2NlcHRzIGFuIGFycmF5IHRoYXQgbWF0Y2hlcyB0aGVcbiAgICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2wsIGFuZCBkb2VzIGl0cyBiZXN0IHRvIG1hdGNoIHRoZSB2YWx1ZXMgdG8gdGhlIGNvcnJlY3RcbiAgICAgKiBjb250cm9scyBpbiB0aGUgZ3JvdXAuXG4gICAgICpcbiAgICAgKiBJdCBhY2NlcHRzIGJvdGggc3VwZXItc2V0cyBhbmQgc3ViLXNldHMgb2YgdGhlIGFycmF5IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAdXNhZ2VOb3Rlc1xuICAgICAqICMjIyBQYXRjaCB0aGUgdmFsdWVzIGZvciBjb250cm9scyBpbiBhIGZvcm0gYXJyYXlcbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoW1xuICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpXG4gICAgICogXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbbnVsbCwgbnVsbF1cbiAgICAgKlxuICAgICAqIGFyci5wYXRjaFZhbHVlKFsnTmFuY3knXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyLnZhbHVlKTsgICAvLyBbJ05hbmN5JywgbnVsbF1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBBcnJheSBvZiBsYXRlc3QgdmFsdWVzIGZvciB0aGUgY29udHJvbHNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZFxuICAgICAqIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlc1xuICAgICAqXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdFxuICAgICAqIGlzIGZhbHNlLlxuICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZFxuICAgICAqIGB2YWx1ZUNoYW5nZXNgXG4gICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLlxuICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC5cbiAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eVxuICAgICAqIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHl9IG1ldGhvZC5cbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLnBhdGNoVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAobmV3VmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoX3RoaXMuYXQoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuYXQoaW5kZXgpLnBhdGNoVmFsdWUobmV3VmFsdWUsIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIGBGb3JtQXJyYXlgIGFuZCBhbGwgZGVzY2VuZGFudHMgYXJlIG1hcmtlZCBgcHJpc3RpbmVgIGFuZCBgdW50b3VjaGVkYCwgYW5kIHRoZVxuICAgICAqIHZhbHVlIG9mIGFsbCBkZXNjZW5kYW50cyB0byBudWxsIG9yIG51bGwgbWFwcy5cbiAgICAgKlxuICAgICAqIFlvdSByZXNldCB0byBhIHNwZWNpZmljIGZvcm0gc3RhdGUgYnkgcGFzc2luZyBpbiBhbiBhcnJheSBvZiBzdGF0ZXNcbiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udHJvbC4gVGhlIHN0YXRlIGlzIGEgc3RhbmRhbG9uZSB2YWx1ZVxuICAgICAqIG9yIGEgZm9ybSBzdGF0ZSBvYmplY3Qgd2l0aCBib3RoIGEgdmFsdWUgYW5kIGEgZGlzYWJsZWQgc3RhdHVzLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgUmVzZXQgdGhlIHZhbHVlcyBpbiBhIGZvcm0gYXJyYXlcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbXG4gICAgICogICAgbmV3IEZvcm1Db250cm9sKCksXG4gICAgICogICAgbmV3IEZvcm1Db250cm9sKClcbiAgICAgKiBdKTtcbiAgICAgKiBhcnIucmVzZXQoWyduYW1lJywgJ2xhc3QgbmFtZSddKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHRoaXMuYXJyLnZhbHVlKTsgIC8vIFsnbmFtZScsICdsYXN0IG5hbWUnXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogIyMjIFJlc2V0IHRoZSB2YWx1ZXMgaW4gYSBmb3JtIGFycmF5IGFuZCB0aGUgZGlzYWJsZWQgc3RhdHVzIGZvciB0aGUgZmlyc3QgY29udHJvbFxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogdGhpcy5hcnIucmVzZXQoW1xuICAgICAqICAge3ZhbHVlOiAnbmFtZScsIGRpc2FibGVkOiB0cnVlfSxcbiAgICAgKiAgICdsYXN0J1xuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2codGhpcy5hcnIudmFsdWUpOyAgLy8gWyduYW1lJywgJ2xhc3QgbmFtZSddXG4gICAgICogY29uc29sZS5sb2codGhpcy5hcnIuZ2V0KDApLnN0YXR1cyk7ICAvLyAnRElTQUJMRUQnXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgY29udHJvbHNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZFxuICAgICAqIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlc1xuICAgICAqXG4gICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdFxuICAgICAqIGlzIGZhbHNlLlxuICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZFxuICAgICAqIGB2YWx1ZUNoYW5nZXNgXG4gICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCBpcyByZXNldC5cbiAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuXG4gICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHlcbiAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuXG4gICAgICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgeyB2YWx1ZSA9IFtdOyB9XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbiAoY29udHJvbCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWVbaW5kZXhdLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlUHJpc3RpbmUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRvdWNoZWQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRoZSBhZ2dyZWdhdGUgdmFsdWUgb2YgdGhlIGFycmF5LCBpbmNsdWRpbmcgYW55IGRpc2FibGVkIGNvbnRyb2xzLlxuICAgICAqXG4gICAgICogUmVwb3J0cyBhbGwgdmFsdWVzIHJlZ2FyZGxlc3Mgb2YgZGlzYWJsZWQgc3RhdHVzLlxuICAgICAqIEZvciBlbmFibGVkIGNvbnRyb2xzIG9ubHksIHRoZSBgdmFsdWVgIHByb3BlcnR5IGlzIHRoZSBiZXN0IHdheSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLmdldFJhd1ZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9scy5tYXAoZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgPyBjb250cm9sLnZhbHVlIDogY29udHJvbC5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbGwgY29udHJvbHMgaW4gdGhlIGBGb3JtQXJyYXlgLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKiAjIyMgUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGEgRm9ybUFycmF5XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoW1xuICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLFxuICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpXG4gICAgICogXSk7XG4gICAgICogY29uc29sZS5sb2coYXJyLmxlbmd0aCk7ICAvLyAyXG4gICAgICpcbiAgICAgKiBhcnIuY2xlYXIoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnIubGVuZ3RoKTsgIC8vIDBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEl0J3MgYSBzaW1wbGVyIGFuZCBtb3JlIGVmZmljaWVudCBhbHRlcm5hdGl2ZSB0byByZW1vdmluZyBhbGwgZWxlbWVudHMgb25lIGJ5IG9uZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbXG4gICAgICogICAgbmV3IEZvcm1Db250cm9sKCksXG4gICAgICogICAgbmV3IEZvcm1Db250cm9sKClcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIHdoaWxlIChhcnIubGVuZ3RoKSB7XG4gICAgICogICAgYXJyLnJlbW92ZUF0KDApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9scy5sZW5ndGggPCAxKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIGNvbnRyb2wuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKGZ1bmN0aW9uICgpIHsgfSk7IH0pO1xuICAgICAgICB0aGlzLmNvbnRyb2xzLnNwbGljZSgwKTtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5fc3luY1BlbmRpbmdDb250cm9scyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN1YnRyZWVVcGRhdGVkID0gdGhpcy5jb250cm9scy5yZWR1Y2UoZnVuY3Rpb24gKHVwZGF0ZWQsIGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQuX3N5bmNQZW5kaW5nQ29udHJvbHMoKSA/IHRydWUgOiB1cGRhdGVkO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIGlmIChzdWJ0cmVlVXBkYXRlZClcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3VidHJlZVVwZGF0ZWQ7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5fdGhyb3dJZkNvbnRyb2xNaXNzaW5nID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5jb250cm9scy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlxcbiAgICAgICAgVGhlcmUgYXJlIG5vIGZvcm0gY29udHJvbHMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgYXJyYXkgeWV0LiAgSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsXFxuICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS5cXG4gICAgICBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmF0KGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZm9ybSBjb250cm9sIGF0IGluZGV4IFwiICsgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5fZm9yRWFjaENoaWxkID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAoY29udHJvbCwgaW5kZXgpIHsgY2IoY29udHJvbCwgaW5kZXgpOyB9KTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLl91cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmZpbHRlcihmdW5jdGlvbiAoY29udHJvbCkgeyByZXR1cm4gY29udHJvbC5lbmFibGVkIHx8IF90aGlzLmRpc2FibGVkOyB9KVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIGNvbnRyb2wudmFsdWU7IH0pO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1BcnJheS5wcm90b3R5cGUuX2FueUNvbnRyb2xzID0gZnVuY3Rpb24gKGNvbmRpdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9scy5zb21lKGZ1bmN0aW9uIChjb250cm9sKSB7IHJldHVybiBjb250cm9sLmVuYWJsZWQgJiYgY29uZGl0aW9uKGNvbnRyb2wpOyB9KTtcbiAgICB9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBGb3JtQXJyYXkucHJvdG90eXBlLl9zZXRVcENvbnRyb2xzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wpIHsgcmV0dXJuIF90aGlzLl9yZWdpc3RlckNvbnRyb2woY29udHJvbCk7IH0pO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1BcnJheS5wcm90b3R5cGUuX2NoZWNrQWxsVmFsdWVzUHJlc2VudCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24gKGNvbnRyb2wsIGkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZVtpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBzdXBwbHkgYSB2YWx1ZSBmb3IgZm9ybSBjb250cm9sIGF0IGluZGV4OiBcIiArIGkgKyBcIi5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1BcnJheS5wcm90b3R5cGUuX2FsbENvbnRyb2xzRGlzYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0aGlzLmNvbnRyb2xzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBjb250cm9sID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZW5hYmxlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMubGVuZ3RoID4gMCB8fCB0aGlzLmRpc2FibGVkO1xuICAgIH07XG4gICAgRm9ybUFycmF5LnByb3RvdHlwZS5fcmVnaXN0ZXJDb250cm9sID0gZnVuY3Rpb24gKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7XG4gICAgICAgIGNvbnRyb2wuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSk7XG4gICAgfTtcbiAgICByZXR1cm4gRm9ybUFycmF5O1xufShBYnN0cmFjdENvbnRyb2wpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGZvcm1EaXJlY3RpdmVQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE5nRm9ybTsgfSlcbn07XG52YXIgybUwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyB9O1xudmFyIHJlc29sdmVkUHJvbWlzZSA9ICjJtTApKCk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIHRvcC1sZXZlbCBgRm9ybUdyb3VwYCBpbnN0YW5jZSBhbmQgYmluZHMgaXQgdG8gYSBmb3JtXG4gKiB0byB0cmFjayBhZ2dyZWdhdGUgZm9ybSB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMuXG4gKlxuICogQXMgc29vbiBhcyB5b3UgaW1wb3J0IHRoZSBgRm9ybXNNb2R1bGVgLCB0aGlzIGRpcmVjdGl2ZSBiZWNvbWVzIGFjdGl2ZSBieSBkZWZhdWx0IG9uXG4gKiBhbGwgYDxmb3JtPmAgdGFncy4gIFlvdSBkb24ndCBuZWVkIHRvIGFkZCBhIHNwZWNpYWwgc2VsZWN0b3IuXG4gKlxuICogWW91IG9wdGlvbmFsbHkgZXhwb3J0IHRoZSBkaXJlY3RpdmUgaW50byBhIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlIHVzaW5nIGBuZ0Zvcm1gIGFzIHRoZSBrZXlcbiAqIChleDogYCNteUZvcm09XCJuZ0Zvcm1cImApLiBUaGlzIGlzIG9wdGlvbmFsLCBidXQgdXNlZnVsLiAgTWFueSBwcm9wZXJ0aWVzIGZyb20gdGhlIHVuZGVybHlpbmdcbiAqIGBGb3JtR3JvdXBgIGluc3RhbmNlIGFyZSBkdXBsaWNhdGVkIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmLCBzbyBhIHJlZmVyZW5jZSB0byBpdFxuICogZ2l2ZXMgeW91IGFjY2VzcyB0byB0aGUgYWdncmVnYXRlIHZhbHVlIGFuZCB2YWxpZGl0eSBzdGF0dXMgb2YgdGhlIGZvcm0sIGFzIHdlbGwgYXNcbiAqIHVzZXIgaW50ZXJhY3Rpb24gcHJvcGVydGllcyBsaWtlIGBkaXJ0eWAgYW5kIGB0b3VjaGVkYC5cbiAqXG4gKiBUbyByZWdpc3RlciBjaGlsZCBjb250cm9scyB3aXRoIHRoZSBmb3JtLCB1c2UgYE5nTW9kZWxgIHdpdGggYSBgbmFtZWBcbiAqIGF0dHJpYnV0ZS4gWW91IG1heSB1c2UgYE5nTW9kZWxHcm91cGAgdG8gY3JlYXRlIHN1Yi1ncm91cHMgd2l0aGluIHRoZSBmb3JtLlxuICpcbiAqIElmIG5lY2Vzc2FyeSwgbGlzdGVuIHRvIHRoZSBkaXJlY3RpdmUncyBgbmdTdWJtaXRgIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHVzZXIgaGFzXG4gKiB0cmlnZ2VyZWQgYSBmb3JtIHN1Ym1pc3Npb24uIFRoZSBgbmdTdWJtaXRgIGV2ZW50IGVtaXRzIHRoZSBvcmlnaW5hbCBmb3JtXG4gKiBzdWJtaXNzaW9uIGV2ZW50LlxuICpcbiAqIEluIHRlbXBsYXRlIGRyaXZlbiBmb3JtcywgYWxsIGA8Zm9ybT5gIHRhZ3MgYXJlIGF1dG9tYXRpY2FsbHkgdGFnZ2VkIGFzIGBOZ0Zvcm1gLlxuICogVG8gaW1wb3J0IHRoZSBgRm9ybXNNb2R1bGVgIGJ1dCBza2lwIGl0cyB1c2FnZSBpbiBzb21lIGZvcm1zLFxuICogZm9yIGV4YW1wbGUsIHRvIHVzZSBuYXRpdmUgSFRNTDUgdmFsaWRhdGlvbiwgYWRkIHRoZSBgbmdOb0Zvcm1gIGFuZCB0aGUgYDxmb3JtPmBcbiAqIHRhZ3Mgd29uJ3QgY3JlYXRlIGFuIGBOZ0Zvcm1gIGRpcmVjdGl2ZS4gSW4gcmVhY3RpdmUgZm9ybXMsIHVzaW5nIGBuZ05vRm9ybWAgaXNcbiAqIHVubmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGA8Zm9ybT5gIHRhZ3MgYXJlIGluZXJ0LiBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZFxuICogcmVmcmFpbiBmcm9tIHVzaW5nIHRoZSBgZm9ybUdyb3VwYCBkaXJlY3RpdmUuXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgTWlncmF0aW5nIGZyb20gZGVwcmVjYXRlZCBuZ0Zvcm0gc2VsZWN0b3JcbiAqXG4gKiBTdXBwb3J0IGZvciB1c2luZyBgbmdGb3JtYCBlbGVtZW50IHNlbGVjdG9yIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkXG4gKiBpbiBBbmd1bGFyIHY5LlxuICpcbiAqIFRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCB0byBrZWVwIHNlbGVjdG9ycyBjb25zaXN0ZW50IHdpdGggb3RoZXIgY29yZSBBbmd1bGFyIHNlbGVjdG9ycyxcbiAqIGFzIGVsZW1lbnQgc2VsZWN0b3JzIGFyZSB0eXBpY2FsbHkgd3JpdHRlbiBpbiBrZWJhYi1jYXNlLlxuICpcbiAqIE5vdyBkZXByZWNhdGVkOlxuICogYGBgaHRtbFxuICogPG5nRm9ybSAjbXlGb3JtPVwibmdGb3JtXCI+XG4gKiBgYGBcbiAqXG4gKiBBZnRlcjpcbiAqIGBgYGh0bWxcbiAqIDxuZy1mb3JtICNteUZvcm09XCJuZ0Zvcm1cIj5cbiAqIGBgYFxuICpcbiAqICMjIyBMaXN0ZW5pbmcgZm9yIGZvcm0gc3VibWlzc2lvblxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gY2FwdHVyZSB0aGUgZm9ybSB2YWx1ZXMgZnJvbSB0aGUgXCJuZ1N1Ym1pdFwiIGV2ZW50LlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtL3NpbXBsZV9mb3JtX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICpcbiAqICMjIyBTZXR0aW5nIHRoZSB1cGRhdGUgb3B0aW9uc1xuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB5b3UgaG93IHRvIGNoYW5nZSB0aGUgXCJ1cGRhdGVPblwiIG9wdGlvbiBmcm9tIGl0cyBkZWZhdWx0IHVzaW5nXG4gKiBuZ0Zvcm1PcHRpb25zLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxmb3JtIFtuZ0Zvcm1PcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiPlxuICogICAgPGlucHV0IG5hbWU9XCJvbmVcIiBuZ01vZGVsPiAgPCEtLSB0aGlzIG5nTW9kZWwgd2lsbCB1cGRhdGUgb24gYmx1ciAtLT5cbiAqIDwvZm9ybT5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdGb3JtID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOZ0Zvcm0sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTmdGb3JtKHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZm9ybSBzdWJtaXNzaW9uIGhhcyBiZWVuIHRyaWdnZXJlZC5cbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5fZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEV2ZW50IGVtaXR0ZXIgZm9yIHRoZSBcIm5nU3VibWl0XCIgZXZlbnRcbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLm5nU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICBfdGhpcy5mb3JtID1cbiAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe30sIGNvbXBvc2VWYWxpZGF0b3JzKHZhbGlkYXRvcnMpLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9ycykpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSB2aWV3IGlzIGluaXRpYWxpemVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5uZ0FmdGVyVmlld0luaXQgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KCk7IH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nRm9ybS5wcm90b3R5cGUsIFwiZm9ybURpcmVjdGl2ZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nRm9ybS5wcm90b3R5cGUsIFwiY29udHJvbFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIGludGVybmFsIGBGb3JtR3JvdXBgIGluc3RhbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZvcm07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ0Zvcm0ucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAuIEJlY2F1c2UgdGhpcyBkaXJlY3RpdmVcbiAgICAgICAgICogYWx3YXlzIGxpdmVzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmb3JtLCBpdCBpcyBhbHdheXMgYW4gZW1wdHkgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdGb3JtLnByb3RvdHlwZSwgXCJjb250cm9sc1wiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmV0dXJucyBhIG1hcCBvZiB0aGUgY29udHJvbHMgaW4gdGhpcyBncm91cC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgdGhhdCBzZXRzIHVwIHRoZSBjb250cm9sIGRpcmVjdGl2ZSBpbiB0aGlzIGdyb3VwLCByZS1jYWxjdWxhdGVzIGl0cyB2YWx1ZVxuICAgICAqIGFuZCB2YWxpZGl0eSwgYW5kIGFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgTmdNb2RlbGAgZGlyZWN0aXZlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIE5nRm9ybS5wcm90b3R5cGUuYWRkQ29udHJvbCA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IF90aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgICAgICAgIGRpci5jb250cm9sID1cbiAgICAgICAgICAgICAgICBjb250YWluZXIucmVnaXN0ZXJDb250cm9sKGRpci5uYW1lLCBkaXIuY29udHJvbCk7XG4gICAgICAgICAgICBzZXRVcENvbnRyb2woZGlyLmNvbnRyb2wsIGRpcik7XG4gICAgICAgICAgICBkaXIuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIF90aGlzLl9kaXJlY3RpdmVzLnB1c2goZGlyKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgZnJvbSB0aGUgcHJvdmlkZWQgYE5nTW9kZWxgIGRpcmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBOZ01vZGVsYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5nZXRDb250cm9sID0gZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gdGhpcy5mb3JtLmdldChkaXIucGF0aCk7IH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVtb3ZlcyB0aGUgYE5nTW9kZWxgIGluc3RhbmNlIGZyb20gdGhlIGludGVybmFsIGxpc3Qgb2YgZGlyZWN0aXZlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGRpciBUaGUgYE5nTW9kZWxgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBOZ0Zvcm0ucHJvdG90eXBlLnJlbW92ZUNvbnRyb2wgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBfdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtb3ZlRGlyKF90aGlzLl9kaXJlY3RpdmVzLCBkaXIpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIEFkZHMgYSBuZXcgYE5nTW9kZWxHcm91cGAgZGlyZWN0aXZlIGluc3RhbmNlIHRvIHRoZSBmb3JtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpciBUaGUgYE5nTW9kZWxHcm91cGAgZGlyZWN0aXZlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIE5nRm9ybS5wcm90b3R5cGUuYWRkRm9ybUdyb3VwID0gZnVuY3Rpb24gKGRpcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXNvbHZlZFByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gX3RoaXMuX2ZpbmRDb250YWluZXIoZGlyLnBhdGgpO1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgICAgICBzZXRVcEZvcm1Db250YWluZXIoZ3JvdXAsIGRpcik7XG4gICAgICAgICAgICBjb250YWluZXIucmVnaXN0ZXJDb250cm9sKGRpci5uYW1lLCBncm91cCk7XG4gICAgICAgICAgICBncm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZW1vdmVzIHRoZSBgTmdNb2RlbEdyb3VwYCBkaXJlY3RpdmUgaW5zdGFuY2UgZnJvbSB0aGUgZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBOZ0Zvcm0ucHJvdG90eXBlLnJlbW92ZUZvcm1Hcm91cCA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IF90aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIucmVtb3ZlQ29udHJvbChkaXIubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmV0cmlldmVzIHRoZSBgRm9ybUdyb3VwYCBmb3IgYSBwcm92aWRlZCBgTmdNb2RlbEdyb3VwYCBkaXJlY3RpdmUgaW5zdGFuY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBOZ0Zvcm0ucHJvdG90eXBlLmdldEZvcm1Hcm91cCA9IGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOyB9O1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGBOZ0NvbnRyb2xgIGRpcmVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBOZ0NvbnRyb2xgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGRpcmVjdGl2ZSdzIGNvbnRyb2wuXG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS51cGRhdGVNb2RlbCA9IGZ1bmN0aW9uIChkaXIsIHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjdHJsID0gX3RoaXMuZm9ybS5nZXQoZGlyLnBhdGgpO1xuICAgICAgICAgICAgY3RybC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoaXMgYEZvcm1Hcm91cGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZVxuICAgICAqL1xuICAgIE5nRm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHsgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTsgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIFwic3VibWl0XCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLlxuICAgICAqIFRyaWdnZXJzIHRoZSBgbmdTdWJtaXRgIGVtaXR0ZXIgdG8gZW1pdCB0aGUgXCJzdWJtaXRcIiBldmVudCBhcyBpdHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAkZXZlbnQgVGhlIFwic3VibWl0XCIgZXZlbnQgb2JqZWN0XG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5vblN1Ym1pdCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBzeW5jUGVuZGluZ0NvbnRyb2xzKHRoaXMuZm9ybSwgdGhpcy5fZGlyZWN0aXZlcyk7XG4gICAgICAgIHRoaXMubmdTdWJtaXQuZW1pdCgkZXZlbnQpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIFwicmVzZXRcIiBldmVudCBpcyB0cmlnZ2VyZWQgb24gdGhlIGZvcm0uXG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5vblJlc2V0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLnJlc2V0Rm9ybSgpOyB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlc2V0cyB0aGUgZm9ybSB0byBhbiBpbml0aWFsIHZhbHVlIGFuZCByZXNldHMgaXRzIHN1Ym1pdHRlZCBzdGF0dXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGZvcm0uXG4gICAgICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5yZXNldEZvcm0gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsgdmFsdWUgPSB1bmRlZmluZWQ7IH1cbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIE5nRm9ybS5wcm90b3R5cGUuX3NldFVwZGF0ZVN0cmF0ZWd5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy51cGRhdGVPbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uX3VwZGF0ZU9uID0gdGhpcy5vcHRpb25zLnVwZGF0ZU9uO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgTmdGb3JtLnByb3RvdHlwZS5fZmluZENvbnRhaW5lciA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIHBhdGgucG9wKCk7XG4gICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA/IHRoaXMuZm9ybS5nZXQocGF0aCkgOiB0aGlzLmZvcm07XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ25nRm9ybU9wdGlvbnMnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBOZ0Zvcm0ucHJvdG90eXBlLCBcIm9wdGlvbnNcIiwgdm9pZCAwKTtcbiAgICBOZ0Zvcm0gPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHtcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnZm9ybTpub3QoW25nTm9Gb3JtXSk6bm90KFtmb3JtR3JvdXBdKSxuZ0Zvcm0sbmctZm9ybSxbbmdGb3JtXScsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdLFxuICAgICAgICAgICAgaG9zdDogeyAnKHN1Ym1pdCknOiAnb25TdWJtaXQoJGV2ZW50KScsICcocmVzZXQpJzogJ29uUmVzZXQoKScgfSxcbiAgICAgICAgICAgIG91dHB1dHM6IFsnbmdTdWJtaXQnXSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiAnbmdGb3JtJ1xuICAgICAgICB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBPcHRpb25hbCgpKSwgX19wYXJhbSgwLCBTZWxmKCkpLCBfX3BhcmFtKDAsIEluamVjdChOR19WQUxJREFUT1JTKSksXG4gICAgICAgIF9fcGFyYW0oMSwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMSwgU2VsZigpKSwgX19wYXJhbSgxLCBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0FycmF5LCBBcnJheV0pXG4gICAgXSwgTmdGb3JtKTtcbiAgICByZXR1cm4gTmdGb3JtO1xufShDb250cm9sQ29udGFpbmVyKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBUZW1wbGF0ZURyaXZlbkVycm9ycyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUZW1wbGF0ZURyaXZlbkVycm9ycygpIHtcbiAgICB9XG4gICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubW9kZWxQYXJlbnRFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlxcbiAgICAgIG5nTW9kZWwgY2Fubm90IGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9ybSBjb250cm9scyB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBUcnkgdXNpbmdcXG4gICAgICBmb3JtR3JvdXAncyBwYXJ0bmVyIGRpcmVjdGl2ZSBcXFwiZm9ybUNvbnRyb2xOYW1lXFxcIiBpbnN0ZWFkLiAgRXhhbXBsZTpcXG5cXG4gICAgICBcIiArIEZvcm1FcnJvckV4YW1wbGVzLmZvcm1Db250cm9sTmFtZSArIFwiXFxuXFxuICAgICAgT3IsIGlmIHlvdSdkIGxpa2UgdG8gYXZvaWQgcmVnaXN0ZXJpbmcgdGhpcyBmb3JtIGNvbnRyb2wsIGluZGljYXRlIHRoYXQgaXQncyBzdGFuZGFsb25lIGluIG5nTW9kZWxPcHRpb25zOlxcblxcbiAgICAgIEV4YW1wbGU6XFxuXFxuICAgICAgXCIgKyBGb3JtRXJyb3JFeGFtcGxlcy5uZ01vZGVsV2l0aEZvcm1Hcm91cCk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5mb3JtR3JvdXBOYW1lRXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcXG4gICAgICBuZ01vZGVsIGNhbm5vdCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGZvcm0gY29udHJvbHMgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXBOYW1lIG9yIGZvcm1BcnJheU5hbWUgZGlyZWN0aXZlLlxcblxcbiAgICAgIE9wdGlvbiAxOiBVc2UgZm9ybUNvbnRyb2xOYW1lIGluc3RlYWQgb2YgbmdNb2RlbCAocmVhY3RpdmUgc3RyYXRlZ3kpOlxcblxcbiAgICAgIFwiICsgRm9ybUVycm9yRXhhbXBsZXMuZm9ybUdyb3VwTmFtZSArIFwiXFxuXFxuICAgICAgT3B0aW9uIDI6ICBVcGRhdGUgbmdNb2RlbCdzIHBhcmVudCBiZSBuZ01vZGVsR3JvdXAgKHRlbXBsYXRlLWRyaXZlbiBzdHJhdGVneSk6XFxuXFxuICAgICAgXCIgKyBGb3JtRXJyb3JFeGFtcGxlcy5uZ01vZGVsR3JvdXApO1xuICAgIH07XG4gICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubWlzc2luZ05hbWVFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIklmIG5nTW9kZWwgaXMgdXNlZCB3aXRoaW4gYSBmb3JtIHRhZywgZWl0aGVyIHRoZSBuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBvciB0aGUgZm9ybVxcbiAgICAgIGNvbnRyb2wgbXVzdCBiZSBkZWZpbmVkIGFzICdzdGFuZGFsb25lJyBpbiBuZ01vZGVsT3B0aW9ucy5cXG5cXG4gICAgICBFeGFtcGxlIDE6IDxpbnB1dCBbKG5nTW9kZWwpXT1cXFwicGVyc29uLmZpcnN0TmFtZVxcXCIgbmFtZT1cXFwiZmlyc3RcXFwiPlxcbiAgICAgIEV4YW1wbGUgMjogPGlucHV0IFsobmdNb2RlbCldPVxcXCJwZXJzb24uZmlyc3ROYW1lXFxcIiBbbmdNb2RlbE9wdGlvbnNdPVxcXCJ7c3RhbmRhbG9uZTogdHJ1ZX1cXFwiPlwiKTtcbiAgICB9O1xuICAgIFRlbXBsYXRlRHJpdmVuRXJyb3JzLm1vZGVsR3JvdXBQYXJlbnRFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlxcbiAgICAgIG5nTW9kZWxHcm91cCBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuXFxuXFxuICAgICAgT3B0aW9uIDE6IFVzZSBmb3JtR3JvdXBOYW1lIGluc3RlYWQgb2YgbmdNb2RlbEdyb3VwIChyZWFjdGl2ZSBzdHJhdGVneSk6XFxuXFxuICAgICAgXCIgKyBGb3JtRXJyb3JFeGFtcGxlcy5mb3JtR3JvdXBOYW1lICsgXCJcXG5cXG4gICAgICBPcHRpb24gMjogIFVzZSBhIHJlZ3VsYXIgZm9ybSB0YWcgaW5zdGVhZCBvZiB0aGUgZm9ybUdyb3VwIGRpcmVjdGl2ZSAodGVtcGxhdGUtZHJpdmVuIHN0cmF0ZWd5KTpcXG5cXG4gICAgICBcIiArIEZvcm1FcnJvckV4YW1wbGVzLm5nTW9kZWxHcm91cCk7XG4gICAgfTtcbiAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5uZ0Zvcm1XYXJuaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJcXG4gICAgSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgJ25nRm9ybScuXFxuXFxuICAgIFN1cHBvcnQgZm9yIHVzaW5nIHRoZSAnbmdGb3JtJyBlbGVtZW50IHNlbGVjdG9yIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkXFxuICAgIGluIEFuZ3VsYXIgdjkuXFxuXFxuICAgIFVzZSAnbmctZm9ybScgaW5zdGVhZC5cXG5cXG4gICAgQmVmb3JlOlxcbiAgICA8bmdGb3JtICNteUZvcm09XFxcIm5nRm9ybVxcXCI+XFxuXFxuICAgIEFmdGVyOlxcbiAgICA8bmctZm9ybSAjbXlGb3JtPVxcXCJuZ0Zvcm1cXFwiPlxcbiAgICBcIik7XG4gICAgfTtcbiAgICByZXR1cm4gVGVtcGxhdGVEcml2ZW5FcnJvcnM7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogYEluamVjdGlvblRva2VuYCB0byBwcm92aWRlIHRvIHR1cm4gb2ZmIHRoZSB3YXJuaW5nIHdoZW4gdXNpbmcgJ25nRm9ybScgZGVwcmVjYXRlZCBzZWxlY3Rvci5cbiAqL1xudmFyIE5HX0ZPUk1fU0VMRUNUT1JfV0FSTklORyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdGb3JtU2VsZWN0b3JXYXJuaW5nJyk7XG4vKipcbiAqIFRoaXMgZGlyZWN0aXZlIGlzIHNvbGVseSB1c2VkIHRvIGRpc3BsYXkgd2FybmluZ3Mgd2hlbiB0aGUgZGVwcmVjYXRlZCBgbmdGb3JtYCBzZWxlY3RvciBpcyB1c2VkLlxuICpcbiAqIEBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBBbmd1bGFyIHY5LlxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBOZ0Zvcm1TZWxlY3Rvcldhcm5pbmcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTmdGb3JtU2VsZWN0b3JXYXJuaW5nKG5nRm9ybVdhcm5pbmcpIHtcbiAgICAgICAgaWYgKCgoIW5nRm9ybVdhcm5pbmcgfHwgbmdGb3JtV2FybmluZyA9PT0gJ29uY2UnKSAmJiAhTmdGb3JtU2VsZWN0b3JXYXJuaW5nXzEuX25nRm9ybVdhcm5pbmcpIHx8XG4gICAgICAgICAgICBuZ0Zvcm1XYXJuaW5nID09PSAnYWx3YXlzJykge1xuICAgICAgICAgICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubmdGb3JtV2FybmluZygpO1xuICAgICAgICAgICAgTmdGb3JtU2VsZWN0b3JXYXJuaW5nXzEuX25nRm9ybVdhcm5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIE5nRm9ybVNlbGVjdG9yV2FybmluZ18xID0gTmdGb3JtU2VsZWN0b3JXYXJuaW5nO1xuICAgIHZhciBOZ0Zvcm1TZWxlY3Rvcldhcm5pbmdfMTtcbiAgICAvKipcbiAgICAgKiBTdGF0aWMgcHJvcGVydHkgdXNlZCB0byB0cmFjayB3aGV0aGVyIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciB0aGlzIHNlbGVjdG9yIGhhcyBiZWVuIHNlbnQuXG4gICAgICogVXNlZCB0byBzdXBwb3J0IHdhcm5pbmcgY29uZmlnIG9mIFwib25jZVwiLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgTmdGb3JtU2VsZWN0b3JXYXJuaW5nLl9uZ0Zvcm1XYXJuaW5nID0gZmFsc2U7XG4gICAgTmdGb3JtU2VsZWN0b3JXYXJuaW5nID0gTmdGb3JtU2VsZWN0b3JXYXJuaW5nXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICduZ0Zvcm0nIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDAsIEluamVjdChOR19GT1JNX1NFTEVDVE9SX1dBUk5JTkcpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIE5nRm9ybVNlbGVjdG9yV2FybmluZyk7XG4gICAgcmV0dXJuIE5nRm9ybVNlbGVjdG9yV2FybmluZztcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGNvZGUgc2hhcmVkIGJldHdlZW4gdGhlIGBOZ01vZGVsR3JvdXBgIGFuZCBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlcy5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQW4gaW50ZXJuYWwgY2FsbGJhY2sgbWV0aG9kIHRyaWdnZXJlZCBvbiB0aGUgaW5zdGFuY2UgYWZ0ZXIgdGhlIGlucHV0cyBhcmUgc2V0LlxuICAgICAqIFJlZ2lzdGVycyB0aGUgZ3JvdXAgd2l0aCBpdHMgcGFyZW50IGdyb3VwLlxuICAgICAqL1xuICAgIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5uZ09uSW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tQYXJlbnRUeXBlKCk7XG4gICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRGb3JtR3JvdXAodGhpcyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBbiBpbnRlcm5hbCBjYWxsYmFjayBtZXRob2QgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgICAqIFJlbW92ZXMgdGhlIGdyb3VwIGZyb20gaXRzIHBhcmVudCBncm91cC5cbiAgICAgKi9cbiAgICBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVGb3JtR3JvdXAodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiY29udHJvbFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIGBGb3JtR3JvdXBgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Rm9ybUdyb3VwKHRoaXMpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAgZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29udHJvbFBhdGgodGhpcy5uYW1lLCB0aGlzLl9wYXJlbnQpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLCBcImZvcm1EaXJlY3RpdmVcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGdyb3VwIGlmIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUsIFwidmFsaWRhdG9yXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycyByZWdpc3RlcmVkIHdpdGggdGhpcyBncm91cC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiYXN5bmNWYWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLl9jaGVja1BhcmVudFR5cGUgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgcmV0dXJuIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlO1xufShDb250cm9sQ29udGFpbmVyKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBtb2RlbEdyb3VwUHJvdmlkZXIgPSB7XG4gICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBOZ01vZGVsR3JvdXA7IH0pXG59O1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgYEZvcm1Hcm91cGAgaW5zdGFuY2UgdG8gYSBET00gZWxlbWVudC5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIGFzIGEgY2hpbGQgb2YgYE5nRm9ybWAgKHdpdGhpbiBgPGZvcm0+YCB0YWdzKS5cbiAqXG4gKiBVc2UgdGhpcyBkaXJlY3RpdmUgdG8gdmFsaWRhdGUgYSBzdWItZ3JvdXAgb2YgeW91ciBmb3JtIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIHJlc3Qgb2YgeW91ciBmb3JtLCBvciBpZiBzb21lIHZhbHVlcyBpbiB5b3VyIGRvbWFpbiBtb2RlbCBtYWtlIG1vcmUgc2Vuc2VcbiAqIHRvIGNvbnN1bWUgdG9nZXRoZXIgaW4gYSBuZXN0ZWQgb2JqZWN0LlxuICpcbiAqIFByb3ZpZGUgYSBuYW1lIGZvciB0aGUgc3ViLWdyb3VwIGFuZCBpdCB3aWxsIGJlY29tZSB0aGUga2V5XG4gKiBmb3IgdGhlIHN1Yi1ncm91cCBpbiB0aGUgZm9ybSdzIGZ1bGwgdmFsdWUuIElmIHlvdSBuZWVkIGRpcmVjdCBhY2Nlc3MsIGV4cG9ydCB0aGUgZGlyZWN0aXZlIGludG9cbiAqIGEgbG9jYWwgdGVtcGxhdGUgdmFyaWFibGUgdXNpbmcgYG5nTW9kZWxHcm91cGAgKGV4OiBgI215R3JvdXA9XCJuZ01vZGVsR3JvdXBcImApLlxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIENvbnN1bWluZyBjb250cm9scyBpbiBhIGdyb3VwaW5nXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gY29tYmluZSBjb250cm9scyB0b2dldGhlciBpbiBhIHN1Yi1ncm91cFxuICogb2YgdGhlIGZvcm0uXG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL25nTW9kZWxHcm91cC9uZ19tb2RlbF9ncm91cF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAqXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIE5nTW9kZWxHcm91cCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdNb2RlbEdyb3VwLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5nTW9kZWxHcm91cChwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICBfdGhpcy5fdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG4gICAgICAgIF90aGlzLl9hc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTmdNb2RlbEdyb3VwXzEgPSBOZ01vZGVsR3JvdXA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIE5nTW9kZWxHcm91cC5wcm90b3R5cGUuX2NoZWNrUGFyZW50VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdNb2RlbEdyb3VwXzEpICYmICEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdGb3JtKSkge1xuICAgICAgICAgICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubW9kZWxHcm91cFBhcmVudEV4Y2VwdGlvbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgTmdNb2RlbEdyb3VwXzE7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ01vZGVsR3JvdXAnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZylcbiAgICBdLCBOZ01vZGVsR3JvdXAucHJvdG90eXBlLCBcIm5hbWVcIiwgdm9pZCAwKTtcbiAgICBOZ01vZGVsR3JvdXAgPSBOZ01vZGVsR3JvdXBfMSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tuZ01vZGVsR3JvdXBdJywgcHJvdmlkZXJzOiBbbW9kZWxHcm91cFByb3ZpZGVyXSwgZXhwb3J0QXM6ICduZ01vZGVsR3JvdXAnIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIEhvc3QoKSksIF9fcGFyYW0oMCwgU2tpcFNlbGYoKSksXG4gICAgICAgIF9fcGFyYW0oMSwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMSwgU2VsZigpKSwgX19wYXJhbSgxLCBJbmplY3QoTkdfVkFMSURBVE9SUykpLFxuICAgICAgICBfX3BhcmFtKDIsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDIsIFNlbGYoKSksIF9fcGFyYW0oMiwgSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb250cm9sQ29udGFpbmVyLCBBcnJheSwgQXJyYXldKVxuICAgIF0sIE5nTW9kZWxHcm91cCk7XG4gICAgcmV0dXJuIE5nTW9kZWxHcm91cDtcbn0oQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGZvcm1Db250cm9sQmluZGluZyA9IHtcbiAgICBwcm92aWRlOiBOZ0NvbnRyb2wsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gTmdNb2RlbDsgfSlcbn07XG52YXIgybUwJDEgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7IH07XG4vKipcbiAqIGBuZ01vZGVsYCBmb3JjZXMgYW4gYWRkaXRpb25hbCBjaGFuZ2UgZGV0ZWN0aW9uIHJ1biB3aGVuIGl0cyBpbnB1dHMgY2hhbmdlOlxuICogRS5nLjpcbiAqIGBgYFxuICogPGRpdj57e215TW9kZWwudmFsaWR9fTwvZGl2PlxuICogPGlucHV0IFsobmdNb2RlbCldPVwibXlWYWx1ZVwiICNteU1vZGVsPVwibmdNb2RlbFwiPlxuICogYGBgXG4gKiBJLmUuIGBuZ01vZGVsYCBjYW4gZXhwb3J0IGl0c2VsZiBvbiB0aGUgZWxlbWVudCBhbmQgdGhlbiBiZSB1c2VkIGluIHRoZSB0ZW1wbGF0ZS5cbiAqIE5vcm1hbGx5LCB0aGlzIHdvdWxkIHJlc3VsdCBpbiBleHByZXNzaW9ucyBiZWZvcmUgdGhlIGBpbnB1dGAgdGhhdCB1c2UgdGhlIGV4cG9ydGVkIGRpcmVjdGl2ZVxuICogdG8gaGF2ZSBhbmQgb2xkIHZhbHVlIGFzIHRoZXkgaGF2ZSBiZWVuXG4gKiBkaXJ0eSBjaGVja2VkIGJlZm9yZS4gQXMgdGhpcyBpcyBhIHZlcnkgY29tbW9uIGNhc2UgZm9yIGBuZ01vZGVsYCwgd2UgYWRkZWQgdGhpcyBzZWNvbmQgY2hhbmdlXG4gKiBkZXRlY3Rpb24gcnVuLlxuICpcbiAqIE5vdGVzOlxuICogLSB0aGlzIGlzIGp1c3Qgb25lIGV4dHJhIHJ1biBubyBtYXR0ZXIgaG93IG1hbnkgYG5nTW9kZWxgIGhhdmUgYmVlbiBjaGFuZ2VkLlxuICogLSB0aGlzIGlzIGEgZ2VuZXJhbCBwcm9ibGVtIHdoZW4gdXNpbmcgYGV4cG9ydEFzYCBmb3IgZGlyZWN0aXZlcyFcbiAqL1xudmFyIHJlc29sdmVkUHJvbWlzZSQxID0gKMm1MCQxKSgpO1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENyZWF0ZXMgYSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlIGZyb20gYSBkb21haW4gbW9kZWwgYW5kIGJpbmRzIGl0XG4gKiB0byBhIGZvcm0gY29udHJvbCBlbGVtZW50LlxuICpcbiAqIFRoZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlIHRyYWNrcyB0aGUgdmFsdWUsIHVzZXIgaW50ZXJhY3Rpb24sIGFuZFxuICogdmFsaWRhdGlvbiBzdGF0dXMgb2YgdGhlIGNvbnRyb2wgYW5kIGtlZXBzIHRoZSB2aWV3IHN5bmNlZCB3aXRoIHRoZSBtb2RlbC4gSWYgdXNlZFxuICogd2l0aGluIGEgcGFyZW50IGZvcm0sIHRoZSBkaXJlY3RpdmUgYWxzbyByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIGZvcm0gYXMgYSBjaGlsZFxuICogY29udHJvbC5cbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIGJ5IGl0c2VsZiBvciBhcyBwYXJ0IG9mIGEgbGFyZ2VyIGZvcm0uIFVzZSB0aGVcbiAqIGBuZ01vZGVsYCBzZWxlY3RvciB0byBhY3RpdmF0ZSBpdC5cbiAqXG4gKiBJdCBhY2NlcHRzIGEgZG9tYWluIG1vZGVsIGFzIGFuIG9wdGlvbmFsIGBJbnB1dGAuIElmIHlvdSBoYXZlIGEgb25lLXdheSBiaW5kaW5nXG4gKiB0byBgbmdNb2RlbGAgd2l0aCBgW11gIHN5bnRheCwgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBkb21haW4gbW9kZWwgaW4gdGhlIGNvbXBvbmVudFxuICogY2xhc3Mgc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHZpZXcuIElmIHlvdSBoYXZlIGEgdHdvLXdheSBiaW5kaW5nIHdpdGggYFsoKV1gIHN5bnRheFxuICogKGFsc28ga25vd24gYXMgJ2JhbmFuYS1ib3ggc3ludGF4JyksIHRoZSB2YWx1ZSBpbiB0aGUgVUkgYWx3YXlzIHN5bmNzIGJhY2sgdG9cbiAqIHRoZSBkb21haW4gbW9kZWwgaW4geW91ciBjbGFzcy5cbiAqXG4gKiBUbyBpbnNwZWN0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhc3NvY2lhdGVkIGBGb3JtQ29udHJvbGAgKGxpa2UgdmFsaWRpdHkgc3RhdGUpLFxuICogZXhwb3J0IHRoZSBkaXJlY3RpdmUgaW50byBhIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlIHVzaW5nIGBuZ01vZGVsYCBhcyB0aGUga2V5IChleDogYCNteVZhcj1cIm5nTW9kZWxcImApLlxuICogWW91IHRoZW4gYWNjZXNzIHRoZSBjb250cm9sIHVzaW5nIHRoZSBkaXJlY3RpdmUncyBgY29udHJvbGAgcHJvcGVydHksXG4gKiBidXQgbW9zdCBwcm9wZXJ0aWVzIHVzZWQgKGxpa2UgYHZhbGlkYCBhbmQgYGRpcnR5YCkgZmFsbCB0aHJvdWdoIHRvIHRoZSBjb250cm9sIGFueXdheSBmb3IgZGlyZWN0IGFjY2Vzcy5cbiAqIFNlZSBhIGZ1bGwgbGlzdCBvZiBwcm9wZXJ0aWVzIGRpcmVjdGx5IGF2YWlsYWJsZSBpbiBgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlYC5cbiAqXG4gKiBAc2VlIGBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICogQHNlZSBgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JgXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgVXNpbmcgbmdNb2RlbCBvbiBhIHN0YW5kYWxvbmUgY29udHJvbFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBhIHNpbXBsZSBzdGFuZGFsb25lIGNvbnRyb2wgdXNpbmcgYG5nTW9kZWxgOlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVOZ01vZGVsL3NpbXBsZV9uZ19tb2RlbF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAqXG4gKiBXaGVuIHVzaW5nIHRoZSBgbmdNb2RlbGAgd2l0aGluIGA8Zm9ybT5gIHRhZ3MsIHlvdSdsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGEgYG5hbWVgIGF0dHJpYnV0ZVxuICogc28gdGhhdCB0aGUgY29udHJvbCBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXJlbnQgZm9ybSB1bmRlciB0aGF0IG5hbWUuXG4gKlxuICogSW4gdGhlIGNvbnRleHQgb2YgYSBwYXJlbnQgZm9ybSwgaXQncyBvZnRlbiB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIG9uZS13YXkgb3IgdHdvLXdheSBiaW5kaW5nLFxuICogYXMgdGhlIHBhcmVudCBmb3JtIHN5bmNzIHRoZSB2YWx1ZSBmb3IgeW91LiBZb3UgYWNjZXNzIGl0cyBwcm9wZXJ0aWVzIGJ5IGV4cG9ydGluZyBpdCBpbnRvIGFcbiAqIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlIHVzaW5nIGBuZ0Zvcm1gIHN1Y2ggYXMgKGAjZj1cIm5nRm9ybVwiYCkuIFVzZSB0aGUgdmFyaWFibGUgd2hlcmVcbiAqIG5lZWRlZCBvbiBmb3JtIHN1Ym1pc3Npb24uXG4gKlxuICogSWYgeW91IGRvIG5lZWQgdG8gcG9wdWxhdGUgaW5pdGlhbCB2YWx1ZXMgaW50byB5b3VyIGZvcm0sIHVzaW5nIGEgb25lLXdheSBiaW5kaW5nIGZvclxuICogYG5nTW9kZWxgIHRlbmRzIHRvIGJlIHN1ZmZpY2llbnQgYXMgbG9uZyBhcyB5b3UgdXNlIHRoZSBleHBvcnRlZCBmb3JtJ3MgdmFsdWUgcmF0aGVyXG4gKiB0aGFuIHRoZSBkb21haW4gbW9kZWwncyB2YWx1ZSBvbiBzdWJtaXQuXG4gKlxuICogIyMjIFVzaW5nIG5nTW9kZWwgd2l0aGluIGEgZm9ybVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBjb250cm9scyB1c2luZyBgbmdNb2RlbGAgd2l0aGluIGEgZm9ybTpcbiAqXG4gKiB7QGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlRm9ybS9zaW1wbGVfZm9ybV9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAqXG4gKiAjIyMgVXNpbmcgYSBzdGFuZGFsb25lIG5nTW9kZWwgd2l0aGluIGEgZ3JvdXBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byB1c2UgYSBzdGFuZGFsb25lIG5nTW9kZWwgY29udHJvbFxuICogd2l0aGluIGEgZm9ybS4gVGhpcyBjb250cm9scyB0aGUgZGlzcGxheSBvZiB0aGUgZm9ybSwgYnV0IGRvZXNuJ3QgY29udGFpbiBmb3JtIGRhdGEuXG4gKlxuICogYGBgaHRtbFxuICogPGZvcm0+XG4gKiAgIDxpbnB1dCBuYW1lPVwibG9naW5cIiBuZ01vZGVsIHBsYWNlaG9sZGVyPVwiTG9naW5cIj5cbiAqICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIG5nTW9kZWwgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPiBTaG93IG1vcmUgb3B0aW9ucz9cbiAqIDwvZm9ybT5cbiAqIDwhLS0gZm9ybSB2YWx1ZToge2xvZ2luOiAnJ30gLS0+XG4gKiBgYGBcbiAqXG4gKiAjIyMgU2V0dGluZyB0aGUgbmdNb2RlbCBuYW1lIGF0dHJpYnV0ZSB0aHJvdWdoIG9wdGlvbnNcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGFuIGFsdGVybmF0ZSB3YXkgdG8gc2V0IHRoZSBuYW1lIGF0dHJpYnV0ZS4gVGhlIG5hbWUgYXR0cmlidXRlIGlzIHVzZWRcbiAqIHdpdGhpbiBhIGN1c3RvbSBmb3JtIGNvbXBvbmVudCwgYW5kIHRoZSBuYW1lIGBASW5wdXRgIHByb3BlcnR5IHNlcnZlcyBhIGRpZmZlcmVudCBwdXJwb3NlLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxmb3JtPlxuICogICA8bXktcGVyc29uLWNvbnRyb2wgbmFtZT1cIk5hbmN5XCIgbmdNb2RlbCBbbmdNb2RlbE9wdGlvbnNdPVwie25hbWU6ICd1c2VyJ31cIj5cbiAqICAgPC9teS1wZXJzb24tY29udHJvbD5cbiAqIDwvZm9ybT5cbiAqIDwhLS0gZm9ybSB2YWx1ZToge3VzZXI6ICcnfSAtLT5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTmdNb2RlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTmdNb2RlbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOZ01vZGVsKHBhcmVudCwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCB2YWx1ZUFjY2Vzc29ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgX3RoaXMuX3JlZ2lzdGVyZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBFdmVudCBlbWl0dGVyIGZvciBwcm9kdWNpbmcgdGhlIGBuZ01vZGVsQ2hhbmdlYCBldmVudCBhZnRlclxuICAgICAgICAgKiB0aGUgdmlldyBtb2RlbCB1cGRhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMudXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICBfdGhpcy5fcmF3VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMgfHwgW107XG4gICAgICAgIF90aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnMgfHwgW107XG4gICAgICAgIF90aGlzLnZhbHVlQWNjZXNzb3IgPSBzZWxlY3RWYWx1ZUFjY2Vzc29yKF90aGlzLCB2YWx1ZUFjY2Vzc29ycyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlXG4gICAgICogb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy5cbiAgICAgKi9cbiAgICBOZ01vZGVsLnByb3RvdHlwZS5uZ09uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrRm9yRXJyb3JzKCk7XG4gICAgICAgIGlmICghdGhpcy5fcmVnaXN0ZXJlZClcbiAgICAgICAgICAgIHRoaXMuX3NldFVwQ29udHJvbCgpO1xuICAgICAgICBpZiAoJ2lzRGlzYWJsZWQnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpc2FibGVkKGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB0aGlzLnZpZXdNb2RlbCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKHRoaXMubW9kZWwpO1xuICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsXG4gICAgICogdXNlIG9ubHkuXG4gICAgICovXG4gICAgTmdNb2RlbC5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7IHRoaXMuZm9ybURpcmVjdGl2ZSAmJiB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTsgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTmdNb2RlbC5wcm90b3R5cGUsIFwicGF0aFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLlxuICAgICAgICAgKiBFYWNoIGluZGV4IGlzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgY29udHJvbCBvbiB0aGF0IGxldmVsLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gY29udHJvbFBhdGgodGhpcy5uYW1lLCB0aGlzLl9wYXJlbnQpIDogW3RoaXMubmFtZV07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ01vZGVsLnByb3RvdHlwZSwgXCJmb3JtRGlyZWN0aXZlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgdG9wLWxldmVsIGRpcmVjdGl2ZSBmb3IgdGhpcyBjb250cm9sIGlmIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOZ01vZGVsLnByb3RvdHlwZSwgXCJ2YWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIHN5bmNocm9ub3VzIHZhbGlkYXRvcnNcbiAgICAgICAgICogcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5nTW9kZWwucHJvdG90eXBlLCBcImFzeW5jVmFsaWRhdG9yXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBBc3luYyB2YWxpZGF0b3IgZnVuY3Rpb24gY29tcG9zZWQgb2YgYWxsIHRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzXG4gICAgICAgICAqIGRpcmVjdGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU2V0cyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbCBhbmQgZW1pdHMgYW4gYG5nTW9kZWxDaGFuZ2VgIGV2ZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSBgbmdNb2RlbENoYW5nZWAuXG4gICAgICovXG4gICAgTmdNb2RlbC5wcm90b3R5cGUudmlld1RvTW9kZWxVcGRhdGUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdGhpcy52aWV3TW9kZWwgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUuZW1pdChuZXdWYWx1ZSk7XG4gICAgfTtcbiAgICBOZ01vZGVsLnByb3RvdHlwZS5fc2V0VXBDb250cm9sID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpO1xuICAgICAgICB0aGlzLl9pc1N0YW5kYWxvbmUoKSA/IHRoaXMuX3NldFVwU3RhbmRhbG9uZSgpIDpcbiAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRDb250cm9sKHRoaXMpO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIE5nTW9kZWwucHJvdG90eXBlLl9zZXRVcGRhdGVTdHJhdGVneSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudXBkYXRlT24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sLl91cGRhdGVPbiA9IHRoaXMub3B0aW9ucy51cGRhdGVPbjtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdNb2RlbC5wcm90b3R5cGUuX2lzU3RhbmRhbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9wYXJlbnQgfHwgISEodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zdGFuZGFsb25lKTtcbiAgICB9O1xuICAgIE5nTW9kZWwucHJvdG90eXBlLl9zZXRVcFN0YW5kYWxvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFVwQ29udHJvbCh0aGlzLmNvbnRyb2wsIHRoaXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBOZ01vZGVsLnByb3RvdHlwZS5fY2hlY2tGb3JFcnJvcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5faXNTdGFuZGFsb25lKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoZWNrTmFtZSgpO1xuICAgIH07XG4gICAgTmdNb2RlbC5wcm90b3R5cGUuX2NoZWNrUGFyZW50VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdNb2RlbEdyb3VwKSAmJlxuICAgICAgICAgICAgdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIFRlbXBsYXRlRHJpdmVuRXJyb3JzLmZvcm1Hcm91cE5hbWVFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nTW9kZWxHcm91cCkgJiYgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ0Zvcm0pKSB7XG4gICAgICAgICAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5tb2RlbFBhcmVudEV4Y2VwdGlvbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOZ01vZGVsLnByb3RvdHlwZS5fY2hlY2tOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5uYW1lKVxuICAgICAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWU7XG4gICAgICAgIGlmICghdGhpcy5faXNTdGFuZGFsb25lKCkgJiYgIXRoaXMubmFtZSkge1xuICAgICAgICAgICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubWlzc2luZ05hbWVFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTmdNb2RlbC5wcm90b3R5cGUuX3VwZGF0ZVZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJlc29sdmVkUHJvbWlzZSQxLnRoZW4oZnVuY3Rpb24gKCkgeyBfdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRWaWV3VG9Nb2RlbENoYW5nZTogZmFsc2UgfSk7IH0pO1xuICAgIH07XG4gICAgTmdNb2RlbC5wcm90b3R5cGUuX3VwZGF0ZURpc2FibGVkID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGRpc2FibGVkVmFsdWUgPSBjaGFuZ2VzWydpc0Rpc2FibGVkJ10uY3VycmVudFZhbHVlO1xuICAgICAgICB2YXIgaXNEaXNhYmxlZCA9IGRpc2FibGVkVmFsdWUgPT09ICcnIHx8IChkaXNhYmxlZFZhbHVlICYmIGRpc2FibGVkVmFsdWUgIT09ICdmYWxzZScpO1xuICAgICAgICByZXNvbHZlZFByb21pc2UkMS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChpc0Rpc2FibGVkICYmICFfdGhpcy5jb250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNEaXNhYmxlZCAmJiBfdGhpcy5jb250cm9sLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuY29udHJvbC5lbmFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZylcbiAgICBdLCBOZ01vZGVsLnByb3RvdHlwZSwgXCJuYW1lXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCdkaXNhYmxlZCcpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbilcbiAgICBdLCBOZ01vZGVsLnByb3RvdHlwZSwgXCJpc0Rpc2FibGVkXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ01vZGVsJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgTmdNb2RlbC5wcm90b3R5cGUsIFwibW9kZWxcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ25nTW9kZWxPcHRpb25zJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgTmdNb2RlbC5wcm90b3R5cGUsIFwib3B0aW9uc1wiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBPdXRwdXQoJ25nTW9kZWxDaGFuZ2UnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBOZ01vZGVsLnByb3RvdHlwZSwgXCJ1cGRhdGVcIiwgdm9pZCAwKTtcbiAgICBOZ01vZGVsID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ1tuZ01vZGVsXTpub3QoW2Zvcm1Db250cm9sTmFtZV0pOm5vdChbZm9ybUNvbnRyb2xdKScsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtmb3JtQ29udHJvbEJpbmRpbmddLFxuICAgICAgICAgICAgZXhwb3J0QXM6ICduZ01vZGVsJ1xuICAgICAgICB9KSxcbiAgICAgICAgX19wYXJhbSgwLCBPcHRpb25hbCgpKSwgX19wYXJhbSgwLCBIb3N0KCkpLFxuICAgICAgICBfX3BhcmFtKDEsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDEsIFNlbGYoKSksIF9fcGFyYW0oMSwgSW5qZWN0KE5HX1ZBTElEQVRPUlMpKSxcbiAgICAgICAgX19wYXJhbSgyLCBPcHRpb25hbCgpKSwgX19wYXJhbSgyLCBTZWxmKCkpLCBfX3BhcmFtKDIsIEluamVjdChOR19BU1lOQ19WQUxJREFUT1JTKSksXG4gICAgICAgIF9fcGFyYW0oMywgT3B0aW9uYWwoKSksIF9fcGFyYW0oMywgU2VsZigpKSwgX19wYXJhbSgzLCBJbmplY3QoTkdfVkFMVUVfQUNDRVNTT1IpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb250cm9sQ29udGFpbmVyLFxuICAgICAgICAgICAgQXJyYXksXG4gICAgICAgICAgICBBcnJheSwgQXJyYXldKVxuICAgIF0sIE5nTW9kZWwpO1xuICAgIHJldHVybiBOZ01vZGVsO1xufShOZ0NvbnRyb2wpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBBZGRzIGBub3ZhbGlkYXRlYCBhdHRyaWJ1dGUgdG8gYWxsIGZvcm1zIGJ5IGRlZmF1bHQuXG4gKlxuICogYG5vdmFsaWRhdGVgIGlzIHVzZWQgdG8gZGlzYWJsZSBicm93c2VyJ3MgbmF0aXZlIGZvcm0gdmFsaWRhdGlvbi5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgbmF0aXZlIHZhbGlkYXRpb24gd2l0aCBBbmd1bGFyIGZvcm1zLCBqdXN0IGFkZCBgbmdOYXRpdmVWYWxpZGF0ZWAgYXR0cmlidXRlOlxuICpcbiAqIGBgYFxuICogPGZvcm0gbmdOYXRpdmVWYWxpZGF0ZT48L2Zvcm0+XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKiBAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKi9cbnZhciDJtU5nTm9WYWxpZGF0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiDJtU5nTm9WYWxpZGF0ZSgpIHtcbiAgICB9XG4gICAgybVOZ05vVmFsaWRhdGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHtcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnZm9ybTpub3QoW25nTm9Gb3JtXSk6bm90KFtuZ05hdGl2ZVZhbGlkYXRlXSknLFxuICAgICAgICAgICAgaG9zdDogeyAnbm92YWxpZGF0ZSc6ICcnIH0sXG4gICAgICAgIH0pXG4gICAgXSwgybVOZ05vVmFsaWRhdGUpO1xuICAgIHJldHVybiDJtU5nTm9WYWxpZGF0ZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogVG9rZW4gdG8gcHJvdmlkZSB0byB0dXJuIG9mZiB0aGUgbmdNb2RlbCB3YXJuaW5nIG9uIGZvcm1Db250cm9sIGFuZCBmb3JtQ29udHJvbE5hbWUuXG4gKi9cbnZhciBOR19NT0RFTF9XSVRIX0ZPUk1fQ09OVFJPTF9XQVJOSU5HID0gbmV3IEluamVjdGlvblRva2VuKCdOZ01vZGVsV2l0aEZvcm1Db250cm9sV2FybmluZycpO1xudmFyIGZvcm1Db250cm9sQmluZGluZyQxID0ge1xuICAgIHByb3ZpZGU6IE5nQ29udHJvbCxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBGb3JtQ29udHJvbERpcmVjdGl2ZTsgfSlcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogKiBTeW5jcyBhIHN0YW5kYWxvbmUgYEZvcm1Db250cm9sYCBpbnN0YW5jZSB0byBhIGZvcm0gY29udHJvbCBlbGVtZW50LlxuICpcbiAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcylcbiAqIEBzZWUgYEZvcm1Db250cm9sYFxuICogQHNlZSBgQWJzdHJhY3RDb250cm9sYFxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIFJlZ2lzdGVyaW5nIGEgc2luZ2xlIGZvcm0gY29udHJvbFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd3MgaG93IHRvIHJlZ2lzdGVyIGEgc3RhbmRhbG9uZSBjb250cm9sIGFuZCBzZXQgaXRzIHZhbHVlLlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtQ29udHJvbC9zaW1wbGVfZm9ybV9jb250cm9sX2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICpcbiAqICMjIyBVc2Ugd2l0aCBuZ01vZGVsXG4gKlxuICogU3VwcG9ydCBmb3IgdXNpbmcgdGhlIGBuZ01vZGVsYCBpbnB1dCBwcm9wZXJ0eSBhbmQgYG5nTW9kZWxDaGFuZ2VgIGV2ZW50IHdpdGggcmVhY3RpdmVcbiAqIGZvcm0gZGlyZWN0aXZlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBBbmd1bGFyIHY3LlxuICpcbiAqIE5vdyBkZXByZWNhdGVkOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIFsobmdNb2RlbCldPVwidmFsdWVcIj5cbiAqIGBgYFxuICpcbiAqIGBgYHRzXG4gKiB0aGlzLnZhbHVlID0gJ3NvbWUgdmFsdWUnO1xuICogYGBgXG4gKlxuICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIGZvciBhIGZldyByZWFzb25zLiBGaXJzdCwgZGV2ZWxvcGVycyBoYXZlIGZvdW5kIHRoaXMgcGF0dGVyblxuICogY29uZnVzaW5nLiBJdCBzZWVtcyBsaWtlIHRoZSBhY3R1YWwgYG5nTW9kZWxgIGRpcmVjdGl2ZSBpcyBiZWluZyB1c2VkLCBidXQgaW4gZmFjdCBpdCdzXG4gKiBhbiBpbnB1dC9vdXRwdXQgcHJvcGVydHkgbmFtZWQgYG5nTW9kZWxgIG9uIHRoZSByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZSB0aGF0IHNpbXBseVxuICogYXBwcm94aW1hdGVzIChzb21lIG9mKSBpdHMgYmVoYXZpb3IuIFNwZWNpZmljYWxseSwgaXQgYWxsb3dzIGdldHRpbmcvc2V0dGluZyB0aGUgdmFsdWVcbiAqIGFuZCBpbnRlcmNlcHRpbmcgdmFsdWUgZXZlbnRzLiBIb3dldmVyLCBzb21lIG9mIGBuZ01vZGVsYCdzIG90aGVyIGZlYXR1cmVzIC0gbGlrZVxuICogZGVsYXlpbmcgdXBkYXRlcyB3aXRoYG5nTW9kZWxPcHRpb25zYCBvciBleHBvcnRpbmcgdGhlIGRpcmVjdGl2ZSAtIHNpbXBseSBkb24ndCB3b3JrLFxuICogd2hpY2ggaGFzIHVuZGVyc3RhbmRhYmx5IGNhdXNlZCBzb21lIGNvbmZ1c2lvbi5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhpcyBwYXR0ZXJuIG1peGVzIHRlbXBsYXRlLWRyaXZlbiBhbmQgcmVhY3RpdmUgZm9ybXMgc3RyYXRlZ2llcywgd2hpY2hcbiAqIHdlIGdlbmVyYWxseSBkb24ndCByZWNvbW1lbmQgYmVjYXVzZSBpdCBkb2Vzbid0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBmdWxsIGJlbmVmaXRzIG9mXG4gKiBlaXRoZXIgc3RyYXRlZ3kuIFNldHRpbmcgdGhlIHZhbHVlIGluIHRoZSB0ZW1wbGF0ZSB2aW9sYXRlcyB0aGUgdGVtcGxhdGUtYWdub3N0aWNcbiAqIHByaW5jaXBsZXMgYmVoaW5kIHJlYWN0aXZlIGZvcm1zLCB3aGVyZWFzIGFkZGluZyBhIGBGb3JtQ29udHJvbGAvYEZvcm1Hcm91cGAgbGF5ZXIgaW5cbiAqIHRoZSBjbGFzcyByZW1vdmVzIHRoZSBjb252ZW5pZW5jZSBvZiBkZWZpbmluZyBmb3JtcyBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogVG8gdXBkYXRlIHlvdXIgY29kZSBiZWZvcmUgdjcsIHlvdSdsbCB3YW50IHRvIGRlY2lkZSB3aGV0aGVyIHRvIHN0aWNrIHdpdGggcmVhY3RpdmUgZm9ybVxuICogZGlyZWN0aXZlcyAoYW5kIGdldC9zZXQgdmFsdWVzIHVzaW5nIHJlYWN0aXZlIGZvcm1zIHBhdHRlcm5zKSBvciBzd2l0Y2ggb3ZlciB0b1xuICogdGVtcGxhdGUtZHJpdmVuIGRpcmVjdGl2ZXMuXG4gKlxuICogQWZ0ZXIgKGNob2ljZSAxIC0gdXNlIHJlYWN0aXZlIGZvcm1zKTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8aW5wdXQgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIj5cbiAqIGBgYFxuICpcbiAqIGBgYHRzXG4gKiB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoJ3NvbWUgdmFsdWUnKTtcbiAqIGBgYFxuICpcbiAqIEFmdGVyIChjaG9pY2UgMiAtIHVzZSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMpOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCI+XG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogdGhpcy52YWx1ZSA9ICdzb21lIHZhbHVlJztcbiAqIGBgYFxuICpcbiAqIEJ5IGRlZmF1bHQsIHdoZW4geW91IHVzZSB0aGlzIHBhdHRlcm4sIHlvdSB3aWxsIHNlZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgb25jZSBpbiBkZXZcbiAqIG1vZGUuIFlvdSBjYW4gY2hvb3NlIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIGJ5IHByb3ZpZGluZyBhIGNvbmZpZyBmb3JcbiAqIGBSZWFjdGl2ZUZvcm1zTW9kdWxlYCBhdCBpbXBvcnQgdGltZTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0czogW1xuICogICBSZWFjdGl2ZUZvcm1zTW9kdWxlLndpdGhDb25maWcoe3dhcm5Pbk5nTW9kZWxXaXRoRm9ybUNvbnRyb2w6ICduZXZlcid9KTtcbiAqIF1cbiAqIGBgYFxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2hvb3NlIHRvIHN1cmZhY2UgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXNcbiAqIHBhdHRlcm4gd2l0aCBhIGNvbmZpZyB2YWx1ZSBvZiBgXCJhbHdheXNcImAuIFRoaXMgbWF5IGhlbHAgdG8gdHJhY2sgZG93biB3aGVyZSBpbiB0aGUgY29kZVxuICogdGhlIHBhdHRlcm4gaXMgYmVpbmcgdXNlZCBhcyB0aGUgY29kZSBpcyBiZWluZyB1cGRhdGVkLlxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBGb3JtQ29udHJvbERpcmVjdGl2ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ybUNvbnRyb2xEaXJlY3RpdmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9ybUNvbnRyb2xEaXJlY3RpdmUodmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCB2YWx1ZUFjY2Vzc29ycywgX25nTW9kZWxXYXJuaW5nQ29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZyA9IF9uZ01vZGVsV2FybmluZ0NvbmZpZztcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIGFzIG9mIHY2ICovXG4gICAgICAgIF90aGlzLnVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBJbnN0YW5jZSBwcm9wZXJ0eSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgYW4gbmdNb2RlbCB3YXJuaW5nIGhhcyBiZWVuIHNlbnQgb3V0IGZvciB0aGlzXG4gICAgICAgICAqIHBhcnRpY3VsYXIgYEZvcm1Db250cm9sRGlyZWN0aXZlYCBpbnN0YW5jZS4gVXNlZCB0byBzdXBwb3J0IHdhcm5pbmcgY29uZmlnIG9mIFwiYWx3YXlzXCIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX3RoaXMuX25nTW9kZWxXYXJuaW5nU2VudCA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5fcmF3VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMgfHwgW107XG4gICAgICAgIF90aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnMgfHwgW107XG4gICAgICAgIF90aGlzLnZhbHVlQWNjZXNzb3IgPSBzZWxlY3RWYWx1ZUFjY2Vzc29yKF90aGlzLCB2YWx1ZUFjY2Vzc29ycyk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgRm9ybUNvbnRyb2xEaXJlY3RpdmVfMSA9IEZvcm1Db250cm9sRGlyZWN0aXZlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiaXNEaXNhYmxlZFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJpZ2dlcnMgYSB3YXJuaW5nIHRoYXQgdGhpcyBpbnB1dCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCByZWFjdGl2ZSBmb3Jtcy5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGlzRGlzYWJsZWQpIHsgUmVhY3RpdmVFcnJvcnMuZGlzYWJsZWRBdHRyV2FybmluZygpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2VcbiAgICAgKiBvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLlxuICAgICAqL1xuICAgIEZvcm1Db250cm9sRGlyZWN0aXZlLnByb3RvdHlwZS5uZ09uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0NvbnRyb2xDaGFuZ2VkKGNoYW5nZXMpKSB7XG4gICAgICAgICAgICBzZXRVcENvbnRyb2wodGhpcy5mb3JtLCB0aGlzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZGlzYWJsZWQgJiYgdGhpcy52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7XG4gICAgICAgICAgICBfbmdNb2RlbFdhcm5pbmcoJ2Zvcm1Db250cm9sJywgRm9ybUNvbnRyb2xEaXJlY3RpdmVfMSwgdGhpcywgdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcpO1xuICAgICAgICAgICAgdGhpcy5mb3JtLnNldFZhbHVlKHRoaXMubW9kZWwpO1xuICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUNvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC5cbiAgICAgICAgICogRWFjaCBpbmRleCBpcyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGNvbnRyb2wgb24gdGhhdCBsZXZlbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwidmFsaWRhdG9yXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBTeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24gY29tcG9zZWQgb2YgYWxsIHRoZSBzeW5jaHJvbm91cyB2YWxpZGF0b3JzXG4gICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fcmF3VmFsaWRhdG9ycyk7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUsIFwiYXN5bmNWYWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXNcbiAgICAgICAgICogZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUNvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcImNvbnRyb2xcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRoZSBgRm9ybUNvbnRyb2xgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZvcm07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZpZXcgbW9kZWwgYW5kIGVtaXRzIGFuIGBuZ01vZGVsQ2hhbmdlYCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbC5cbiAgICAgKi9cbiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUudmlld1RvTW9kZWxVcGRhdGUgPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICAgICAgdGhpcy52aWV3TW9kZWwgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGUuZW1pdChuZXdWYWx1ZSk7XG4gICAgfTtcbiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm90b3R5cGUuX2lzQ29udHJvbENoYW5nZWQgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICByZXR1cm4gY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZm9ybScpO1xuICAgIH07XG4gICAgdmFyIEZvcm1Db250cm9sRGlyZWN0aXZlXzE7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogU3RhdGljIHByb3BlcnR5IHVzZWQgdG8gdHJhY2sgd2hldGhlciBhbnkgbmdNb2RlbCB3YXJuaW5ncyBoYXZlIGJlZW4gc2VudCBhY3Jvc3NcbiAgICAgKiBhbGwgaW5zdGFuY2VzIG9mIEZvcm1Db250cm9sRGlyZWN0aXZlLiBVc2VkIHRvIHN1cHBvcnQgd2FybmluZyBjb25maWcgb2YgXCJvbmNlXCIuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSA9IGZhbHNlO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgnZm9ybUNvbnRyb2wnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZvcm1Db250cm9sKVxuICAgIF0sIEZvcm1Db250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJmb3JtXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCdkaXNhYmxlZCcpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgQm9vbGVhbiksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQm9vbGVhbl0pXG4gICAgXSwgRm9ybUNvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcImlzRGlzYWJsZWRcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCduZ01vZGVsJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgRm9ybUNvbnRyb2xEaXJlY3RpdmUucHJvdG90eXBlLCBcIm1vZGVsXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgnbmdNb2RlbENoYW5nZScpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIEZvcm1Db250cm9sRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJ1cGRhdGVcIiwgdm9pZCAwKTtcbiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZSA9IEZvcm1Db250cm9sRGlyZWN0aXZlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZm9ybUNvbnRyb2xdJywgcHJvdmlkZXJzOiBbZm9ybUNvbnRyb2xCaW5kaW5nJDFdLCBleHBvcnRBczogJ25nRm9ybScgfSksXG4gICAgICAgIF9fcGFyYW0oMCwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMCwgU2VsZigpKSwgX19wYXJhbSgwLCBJbmplY3QoTkdfVkFMSURBVE9SUykpLFxuICAgICAgICBfX3BhcmFtKDEsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDEsIFNlbGYoKSksIF9fcGFyYW0oMSwgSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpKSxcbiAgICAgICAgX19wYXJhbSgyLCBPcHRpb25hbCgpKSwgX19wYXJhbSgyLCBTZWxmKCkpLCBfX3BhcmFtKDIsIEluamVjdChOR19WQUxVRV9BQ0NFU1NPUikpLFxuICAgICAgICBfX3BhcmFtKDMsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDMsIEluamVjdChOR19NT0RFTF9XSVRIX0ZPUk1fQ09OVFJPTF9XQVJOSU5HKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXksXG4gICAgICAgICAgICBBcnJheSwgQXJyYXksIE9iamVjdF0pXG4gICAgXSwgRm9ybUNvbnRyb2xEaXJlY3RpdmUpO1xuICAgIHJldHVybiBGb3JtQ29udHJvbERpcmVjdGl2ZTtcbn0oTmdDb250cm9sKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBmb3JtRGlyZWN0aXZlUHJvdmlkZXIkMSA9IHtcbiAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZvcm1Hcm91cERpcmVjdGl2ZTsgfSlcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIEJpbmRzIGFuIGV4aXN0aW5nIGBGb3JtR3JvdXBgIHRvIGEgRE9NIGVsZW1lbnQuXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgYWNjZXB0cyBhbiBleGlzdGluZyBgRm9ybUdyb3VwYCBpbnN0YW5jZS4gSXQgd2lsbCB0aGVuIHVzZSB0aGlzXG4gKiBgRm9ybUdyb3VwYCBpbnN0YW5jZSB0byBtYXRjaCBhbnkgY2hpbGQgYEZvcm1Db250cm9sYCwgYEZvcm1Hcm91cGAsXG4gKiBhbmQgYEZvcm1BcnJheWAgaW5zdGFuY2VzIHRvIGNoaWxkIGBGb3JtQ29udHJvbE5hbWVgLCBgRm9ybUdyb3VwTmFtZWAsXG4gKiBhbmQgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZXMuXG4gKlxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKVxuICogQHNlZSBgQWJzdHJhY3RDb250cm9sYFxuICpcbiAqICMjIyBSZWdpc3RlciBGb3JtIEdyb3VwXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlZ2lzdGVycyBhIGBGb3JtR3JvdXBgIHdpdGggZmlyc3QgbmFtZSBhbmQgbGFzdCBuYW1lIGNvbnRyb2xzLFxuICogYW5kIGxpc3RlbnMgZm9yIHRoZSAqbmdTdWJtaXQqIGV2ZW50IHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtR3JvdXAvc2ltcGxlX2Zvcm1fZ3JvdXBfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1Hcm91cERpcmVjdGl2ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ybUdyb3VwRGlyZWN0aXZlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcm1Hcm91cERpcmVjdGl2ZShfdmFsaWRhdG9ycywgX2FzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fdmFsaWRhdG9ycyA9IF92YWxpZGF0b3JzO1xuICAgICAgICBfdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gX2FzeW5jVmFsaWRhdG9ycztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGZvcm0gc3VibWlzc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuXG4gICAgICAgICAqL1xuICAgICAgICBfdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUcmFja3MgdGhlIGxpc3Qgb2YgYWRkZWQgYEZvcm1Db250cm9sTmFtZWAgaW5zdGFuY2VzXG4gICAgICAgICAqL1xuICAgICAgICBfdGhpcy5kaXJlY3RpdmVzID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJhY2tzIHRoZSBgRm9ybUdyb3VwYCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLmZvcm0gPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGZvcm0gc3VibWlzc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuXG4gICAgICAgICAqL1xuICAgICAgICBfdGhpcy5uZ1N1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tGb3JtUHJlc2VudCgpO1xuICAgICAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZm9ybScpKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVEb21WYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVnaXN0cmF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJmb3JtRGlyZWN0aXZlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXR1cm5zIHRoaXMgZGlyZWN0aXZlJ3MgaW5zdGFuY2UuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLCBcImNvbnRyb2xcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgdGhlIGBGb3JtR3JvdXBgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZvcm07IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAuIEJlY2F1c2UgdGhpcyBkaXJlY3RpdmVcbiAgICAgICAgICogYWx3YXlzIGxpdmVzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmb3JtLCBpdCBhbHdheXMgYW4gZW1wdHkgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgdGhhdCBzZXRzIHVwIHRoZSBjb250cm9sIGRpcmVjdGl2ZSBpbiB0aGlzIGdyb3VwLCByZS1jYWxjdWxhdGVzIGl0cyB2YWx1ZVxuICAgICAqIGFuZCB2YWxpZGl0eSwgYW5kIGFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGRpcmVjdGl2ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5hZGRDb250cm9sID0gZnVuY3Rpb24gKGRpcikge1xuICAgICAgICB2YXIgY3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpO1xuICAgICAgICBzZXRVcENvbnRyb2woY3RybCwgZGlyKTtcbiAgICAgICAgY3RybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnB1c2goZGlyKTtcbiAgICAgICAgcmV0dXJuIGN0cmw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgZnJvbSB0aGUgcHJvdmlkZWQgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5nZXRDb250cm9sID0gZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gdGhpcy5mb3JtLmdldChkaXIucGF0aCk7IH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVtb3ZlcyB0aGUgYEZvcm1Db250cm9sTmFtZWAgaW5zdGFuY2UgZnJvbSB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkaXJlY3RpdmVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5yZW1vdmVDb250cm9sID0gZnVuY3Rpb24gKGRpcikgeyByZW1vdmVEaXIodGhpcy5kaXJlY3RpdmVzLCBkaXIpOyB9O1xuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgYEZvcm1Hcm91cE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZSB0byB0aGUgZm9ybS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5hZGRGb3JtR3JvdXAgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgICAgIHZhciBjdHJsID0gdGhpcy5mb3JtLmdldChkaXIucGF0aCk7XG4gICAgICAgIHNldFVwRm9ybUNvbnRhaW5lcihjdHJsLCBkaXIpO1xuICAgICAgICBjdHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTm8tb3AgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZm9ybSBncm91cC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5yZW1vdmVGb3JtR3JvdXAgPSBmdW5jdGlvbiAoZGlyKSB7IH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmV0cmlldmVzIHRoZSBgRm9ybUdyb3VwYCBmb3IgYSBwcm92aWRlZCBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUuZ2V0Rm9ybUdyb3VwID0gZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gdGhpcy5mb3JtLmdldChkaXIucGF0aCk7IH07XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlIHRvIHRoZSBmb3JtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpciBUaGUgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLmFkZEZvcm1BcnJheSA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICAgICAgdmFyIGN0cmwgPSB0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTtcbiAgICAgICAgc2V0VXBGb3JtQ29udGFpbmVyKGN0cmwsIGRpcik7XG4gICAgICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBOby1vcCBtZXRob2QgdG8gcmVtb3ZlIHRoZSBmb3JtIGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpciBUaGUgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLnJlbW92ZUZvcm1BcnJheSA9IGZ1bmN0aW9uIChkaXIpIHsgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtQXJyYXlgIGZvciBhIHByb3ZpZGVkIGBGb3JtQXJyYXlOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlyIFRoZSBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLlxuICAgICAqL1xuICAgIEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUuZ2V0Rm9ybUFycmF5ID0gZnVuY3Rpb24gKGRpcikgeyByZXR1cm4gdGhpcy5mb3JtLmdldChkaXIucGF0aCk7IH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRpciBUaGUgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZGlyZWN0aXZlJ3MgY29udHJvbC5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLnVwZGF0ZU1vZGVsID0gZnVuY3Rpb24gKGRpciwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGN0cmwgPSB0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTtcbiAgICAgICAgY3RybC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgY2FsbGVkIHdpdGggdGhlIFwic3VibWl0XCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLlxuICAgICAqIFRyaWdnZXJzIHRoZSBgbmdTdWJtaXRgIGVtaXR0ZXIgdG8gZW1pdCB0aGUgXCJzdWJtaXRcIiBldmVudCBhcyBpdHMgcGF5bG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSAkZXZlbnQgVGhlIFwic3VibWl0XCIgZXZlbnQgb2JqZWN0XG4gICAgICovXG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5vblN1Ym1pdCA9IGZ1bmN0aW9uICgkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICBzeW5jUGVuZGluZ0NvbnRyb2xzKHRoaXMuZm9ybSwgdGhpcy5kaXJlY3RpdmVzKTtcbiAgICAgICAgdGhpcy5uZ1N1Ym1pdC5lbWl0KCRldmVudCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgXCJyZXNldFwiIGV2ZW50IGlzIHRyaWdnZXJlZCBvbiB0aGUgZm9ybS5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLm9uUmVzZXQgPSBmdW5jdGlvbiAoKSB7IHRoaXMucmVzZXRGb3JtKCk7IH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVzZXRzIHRoZSBmb3JtIHRvIGFuIGluaXRpYWwgdmFsdWUgYW5kIHJlc2V0cyBpdHMgc3VibWl0dGVkIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZm9ybS5cbiAgICAgKi9cbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLnJlc2V0Rm9ybSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgeyB2YWx1ZSA9IHVuZGVmaW5lZDsgfVxuICAgICAgICB0aGlzLmZvcm0ucmVzZXQodmFsdWUpO1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1Hcm91cERpcmVjdGl2ZS5wcm90b3R5cGUuX3VwZGF0ZURvbVZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuZm9yRWFjaChmdW5jdGlvbiAoZGlyKSB7XG4gICAgICAgICAgICB2YXIgbmV3Q3RybCA9IF90aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTtcbiAgICAgICAgICAgIGlmIChkaXIuY29udHJvbCAhPT0gbmV3Q3RybCkge1xuICAgICAgICAgICAgICAgIGNsZWFuVXBDb250cm9sKGRpci5jb250cm9sLCBkaXIpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdDdHJsKVxuICAgICAgICAgICAgICAgICAgICBzZXRVcENvbnRyb2wobmV3Q3RybCwgZGlyKTtcbiAgICAgICAgICAgICAgICBkaXIuY29udHJvbCA9IG5ld0N0cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfTtcbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLl91cGRhdGVSZWdpc3RyYXRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmZvcm0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl91cGRhdGVEb21WYWx1ZSgpOyB9KTtcbiAgICAgICAgaWYgKHRoaXMuX29sZEZvcm0pXG4gICAgICAgICAgICB0aGlzLl9vbGRGb3JtLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZShmdW5jdGlvbiAoKSB7IH0pO1xuICAgICAgICB0aGlzLl9vbGRGb3JtID0gdGhpcy5mb3JtO1xuICAgIH07XG4gICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZS5fdXBkYXRlVmFsaWRhdG9ycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN5bmMgPSBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5mb3JtLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdGhpcy5mb3JtLnZhbGlkYXRvciwgc3luY10pO1xuICAgICAgICB2YXIgYXN5bmMgPSBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX2FzeW5jVmFsaWRhdG9ycyk7XG4gICAgICAgIHRoaXMuZm9ybS5hc3luY1ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKFt0aGlzLmZvcm0uYXN5bmNWYWxpZGF0b3IsIGFzeW5jXSk7XG4gICAgfTtcbiAgICBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLl9jaGVja0Zvcm1QcmVzZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybSkge1xuICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMubWlzc2luZ0Zvcm1FeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCdmb3JtR3JvdXAnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEZvcm1Hcm91cClcbiAgICBdLCBGb3JtR3JvdXBEaXJlY3RpdmUucHJvdG90eXBlLCBcImZvcm1cIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3RvdHlwZSwgXCJuZ1N1Ym1pdFwiLCB2b2lkIDApO1xuICAgIEZvcm1Hcm91cERpcmVjdGl2ZSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZm9ybUdyb3VwXScsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXIkMV0sXG4gICAgICAgICAgICBob3N0OiB7ICcoc3VibWl0KSc6ICdvblN1Ym1pdCgkZXZlbnQpJywgJyhyZXNldCknOiAnb25SZXNldCgpJyB9LFxuICAgICAgICAgICAgZXhwb3J0QXM6ICduZ0Zvcm0nXG4gICAgICAgIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDAsIFNlbGYoKSksIF9fcGFyYW0oMCwgSW5qZWN0KE5HX1ZBTElEQVRPUlMpKSxcbiAgICAgICAgX19wYXJhbSgxLCBPcHRpb25hbCgpKSwgX19wYXJhbSgxLCBTZWxmKCkpLCBfX3BhcmFtKDEsIEluamVjdChOR19BU1lOQ19WQUxJREFUT1JTKSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbQXJyYXksIEFycmF5XSlcbiAgICBdLCBGb3JtR3JvdXBEaXJlY3RpdmUpO1xuICAgIHJldHVybiBGb3JtR3JvdXBEaXJlY3RpdmU7XG59KENvbnRyb2xDb250YWluZXIpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGZvcm1Hcm91cE5hbWVQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZvcm1Hcm91cE5hbWU7IH0pXG59O1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBTeW5jcyBhIG5lc3RlZCBgRm9ybUdyb3VwYCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBgRm9ybUdyb3VwRGlyZWN0aXZlYC5cbiAqXG4gKiBJdCBhY2NlcHRzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmVzdGVkIGBGb3JtR3JvdXBgIHRvIGxpbmssIGFuZFxuICogbG9va3MgZm9yIGEgYEZvcm1Hcm91cGAgcmVnaXN0ZXJlZCB3aXRoIHRoYXQgbmFtZSBpbiB0aGUgcGFyZW50XG4gKiBgRm9ybUdyb3VwYCBpbnN0YW5jZSB5b3UgcGFzc2VkIGludG8gYEZvcm1Hcm91cERpcmVjdGl2ZWAuXG4gKlxuICogVXNlIG5lc3RlZCBmb3JtIGdyb3VwcyB0byB2YWxpZGF0ZSBhIHN1Yi1ncm91cCBvZiBhXG4gKiBmb3JtIHNlcGFyYXRlbHkgZnJvbSB0aGUgcmVzdCBvciB0byBncm91cCB0aGUgdmFsdWVzIG9mIGNlcnRhaW5cbiAqIGNvbnRyb2xzIGludG8gdGhlaXIgb3duIG5lc3RlZCBvYmplY3QuXG4gKlxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKVxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEFjY2VzcyB0aGUgZ3JvdXAgYnkgbmFtZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI2dldCBnZXR9IG1ldGhvZCB0byBhY2Nlc3MgdGhlXG4gKiBhc3NvY2lhdGVkIGBGb3JtR3JvdXBgXG4gKlxuICogYGBgdHNcbiAqICAgdGhpcy5mb3JtLmdldCgnbmFtZScpO1xuICogYGBgXG4gKlxuICogIyMjIEFjY2VzcyBpbmRpdmlkdWFsIGNvbnRyb2xzIGluIHRoZSBncm91cFxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sI2dldCBnZXR9IG1ldGhvZCB0byBhY2Nlc3NcbiAqIGluZGl2aWR1YWwgY29udHJvbHMgd2l0aGluIHRoZSBncm91cCB1c2luZyBkb3Qgc3ludGF4LlxuICpcbiAqIGBgYHRzXG4gKiAgIHRoaXMuZm9ybS5nZXQoJ25hbWUuZmlyc3QnKTtcbiAqIGBgYFxuICpcbiAqICMjIyBSZWdpc3RlciBhIG5lc3RlZCBgRm9ybUdyb3VwYC5cbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmVnaXN0ZXJzIGEgbmVzdGVkICpuYW1lKiBgRm9ybUdyb3VwYCB3aXRoaW4gYW4gZXhpc3RpbmcgYEZvcm1Hcm91cGAsXG4gKiBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgbmVzdGVkIGBGb3JtR3JvdXBgIGFuZCBpbmRpdmlkdWFsIGNvbnRyb2xzLlxuICpcbiAqIHtAZXhhbXBsZSBmb3Jtcy90cy9uZXN0ZWRGb3JtR3JvdXAvbmVzdGVkX2Zvcm1fZ3JvdXBfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9XG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1Hcm91cE5hbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEZvcm1Hcm91cE5hbWUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRm9ybUdyb3VwTmFtZShwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICBfdGhpcy5fdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7XG4gICAgICAgIF90aGlzLl9hc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnM7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1Hcm91cE5hbWUucHJvdG90eXBlLl9jaGVja1BhcmVudFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfaGFzSW52YWxpZFBhcmVudCh0aGlzLl9wYXJlbnQpKSB7XG4gICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5ncm91cFBhcmVudEV4Y2VwdGlvbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ2Zvcm1Hcm91cE5hbWUnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZylcbiAgICBdLCBGb3JtR3JvdXBOYW1lLnByb3RvdHlwZSwgXCJuYW1lXCIsIHZvaWQgMCk7XG4gICAgRm9ybUdyb3VwTmFtZSA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tmb3JtR3JvdXBOYW1lXScsIHByb3ZpZGVyczogW2Zvcm1Hcm91cE5hbWVQcm92aWRlcl0gfSksXG4gICAgICAgIF9fcGFyYW0oMCwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMCwgSG9zdCgpKSwgX19wYXJhbSgwLCBTa2lwU2VsZigpKSxcbiAgICAgICAgX19wYXJhbSgxLCBPcHRpb25hbCgpKSwgX19wYXJhbSgxLCBTZWxmKCkpLCBfX3BhcmFtKDEsIEluamVjdChOR19WQUxJREFUT1JTKSksXG4gICAgICAgIF9fcGFyYW0oMiwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMiwgU2VsZigpKSwgX19wYXJhbSgyLCBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0NvbnRyb2xDb250YWluZXIsIEFycmF5LCBBcnJheV0pXG4gICAgXSwgRm9ybUdyb3VwTmFtZSk7XG4gICAgcmV0dXJuIEZvcm1Hcm91cE5hbWU7XG59KEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlKSk7XG52YXIgZm9ybUFycmF5TmFtZVByb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gRm9ybUFycmF5TmFtZTsgfSlcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIFN5bmNzIGEgbmVzdGVkIGBGb3JtQXJyYXlgIHRvIGEgRE9NIGVsZW1lbnQuXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoIGEgcGFyZW50IGBGb3JtR3JvdXBEaXJlY3RpdmVgIChzZWxlY3RvcjpcbiAqIGBbZm9ybUdyb3VwXWApLlxuICpcbiAqIEl0IGFjY2VwdHMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBuZXN0ZWQgYEZvcm1BcnJheWAgeW91IHdhbnQgdG8gbGluaywgYW5kXG4gKiB3aWxsIGxvb2sgZm9yIGEgYEZvcm1BcnJheWAgcmVnaXN0ZXJlZCB3aXRoIHRoYXQgbmFtZSBpbiB0aGUgcGFyZW50XG4gKiBgRm9ybUdyb3VwYCBpbnN0YW5jZSB5b3UgcGFzc2VkIGludG8gYEZvcm1Hcm91cERpcmVjdGl2ZWAuXG4gKlxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKVxuICogQHNlZSBgQWJzdHJhY3RDb250cm9sYFxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgZm9ybXMvdHMvbmVzdGVkRm9ybUFycmF5L25lc3RlZF9mb3JtX2FycmF5X2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfVxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBGb3JtQXJyYXlOYW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhGb3JtQXJyYXlOYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcm1BcnJheU5hbWUocGFyZW50LCB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnMpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgICAgX3RoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzO1xuICAgICAgICBfdGhpcy5fYXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGFyZSBpbml0aWFsaXplZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqXG4gICAgICogQHRocm93cyBJZiB0aGUgZGlyZWN0aXZlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBwYXJlbnQuXG4gICAgICovXG4gICAgRm9ybUFycmF5TmFtZS5wcm90b3R5cGUubmdPbkluaXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpO1xuICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkRm9ybUFycmF5KHRoaXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqL1xuICAgIEZvcm1BcnJheU5hbWUucHJvdG90eXBlLm5nT25EZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtRGlyZWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlRm9ybUFycmF5KHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUFycmF5TmFtZS5wcm90b3R5cGUsIFwiY29udHJvbFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIGBGb3JtQXJyYXlgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Rm9ybUFycmF5KHRoaXMpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUFycmF5TmFtZS5wcm90b3R5cGUsIFwiZm9ybURpcmVjdGl2ZVwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVGhlIHRvcC1sZXZlbCBkaXJlY3RpdmUgZm9yIHRoaXMgZ3JvdXAgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQXJyYXlOYW1lLnByb3RvdHlwZSwgXCJwYXRoXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgcGF0aCBmcm9tIHRoZSB0b3AtbGV2ZWwgZm9ybSB0byB0aGlzIGNvbnRyb2wuXG4gICAgICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbnRyb2xQYXRoKHRoaXMubmFtZSwgdGhpcy5fcGFyZW50KTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZvcm1BcnJheU5hbWUucHJvdG90eXBlLCBcInZhbGlkYXRvclwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycyByZWdpc3RlcmVkIHdpdGggdGhpc1xuICAgICAgICAgKiBkaXJlY3RpdmUuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUFycmF5TmFtZS5wcm90b3R5cGUsIFwiYXN5bmNWYWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBGb3JtQXJyYXlOYW1lLnByb3RvdHlwZS5fY2hlY2tQYXJlbnRUeXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX2hhc0ludmFsaWRQYXJlbnQodGhpcy5fcGFyZW50KSkge1xuICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMuYXJyYXlQYXJlbnRFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCdmb3JtQXJyYXlOYW1lJyksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBTdHJpbmcpXG4gICAgXSwgRm9ybUFycmF5TmFtZS5wcm90b3R5cGUsIFwibmFtZVwiLCB2b2lkIDApO1xuICAgIEZvcm1BcnJheU5hbWUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZm9ybUFycmF5TmFtZV0nLCBwcm92aWRlcnM6IFtmb3JtQXJyYXlOYW1lUHJvdmlkZXJdIH0pLFxuICAgICAgICBfX3BhcmFtKDAsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDAsIEhvc3QoKSksIF9fcGFyYW0oMCwgU2tpcFNlbGYoKSksXG4gICAgICAgIF9fcGFyYW0oMSwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMSwgU2VsZigpKSwgX19wYXJhbSgxLCBJbmplY3QoTkdfVkFMSURBVE9SUykpLFxuICAgICAgICBfX3BhcmFtKDIsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDIsIFNlbGYoKSksIF9fcGFyYW0oMiwgSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb250cm9sQ29udGFpbmVyLCBBcnJheSwgQXJyYXldKVxuICAgIF0sIEZvcm1BcnJheU5hbWUpO1xuICAgIHJldHVybiBGb3JtQXJyYXlOYW1lO1xufShDb250cm9sQ29udGFpbmVyKSk7XG5mdW5jdGlvbiBfaGFzSW52YWxpZFBhcmVudChwYXJlbnQpIHtcbiAgICByZXR1cm4gIShwYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBOYW1lKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cERpcmVjdGl2ZSkgJiZcbiAgICAgICAgIShwYXJlbnQgaW5zdGFuY2VvZiBGb3JtQXJyYXlOYW1lKTtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIGNvbnRyb2xOYW1lQmluZGluZyA9IHtcbiAgICBwcm92aWRlOiBOZ0NvbnRyb2wsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gRm9ybUNvbnRyb2xOYW1lOyB9KVxufTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTeW5jcyBhIGBGb3JtQ29udHJvbGAgaW4gYW4gZXhpc3RpbmcgYEZvcm1Hcm91cGAgdG8gYSBmb3JtIGNvbnRyb2xcbiAqIGVsZW1lbnQgYnkgbmFtZS5cbiAqXG4gKiBAc2VlIFtSZWFjdGl2ZSBGb3JtcyBHdWlkZV0oZ3VpZGUvcmVhY3RpdmUtZm9ybXMpXG4gKiBAc2VlIGBGb3JtQ29udHJvbGBcbiAqIEBzZWUgYEFic3RyYWN0Q29udHJvbGBcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBSZWdpc3RlciBgRm9ybUNvbnRyb2xgIHdpdGhpbiBhIGdyb3VwXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byByZWdpc3RlciBtdWx0aXBsZSBmb3JtIGNvbnRyb2xzIHdpdGhpbiBhIGZvcm0gZ3JvdXBcbiAqIGFuZCBzZXQgdGhlaXIgdmFsdWUuXG4gKlxuICoge0BleGFtcGxlIGZvcm1zL3RzL3NpbXBsZUZvcm1Hcm91cC9zaW1wbGVfZm9ybV9ncm91cF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J31cbiAqXG4gKiBUbyBzZWUgYGZvcm1Db250cm9sTmFtZWAgZXhhbXBsZXMgd2l0aCBkaWZmZXJlbnQgZm9ybSBjb250cm9sIHR5cGVzLCBzZWU6XG4gKlxuICogKiBSYWRpbyBidXR0b25zOiBgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvcmBcbiAqICogU2VsZWN0czogYFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yYFxuICpcbiAqICMjIyBVc2Ugd2l0aCBuZ01vZGVsXG4gKlxuICogU3VwcG9ydCBmb3IgdXNpbmcgdGhlIGBuZ01vZGVsYCBpbnB1dCBwcm9wZXJ0eSBhbmQgYG5nTW9kZWxDaGFuZ2VgIGV2ZW50IHdpdGggcmVhY3RpdmVcbiAqIGZvcm0gZGlyZWN0aXZlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBBbmd1bGFyIHY3LlxuICpcbiAqIE5vdyBkZXByZWNhdGVkOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICogICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3RcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCI+XG4gKiA8L2Zvcm0+XG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogdGhpcy52YWx1ZSA9ICdzb21lIHZhbHVlJztcbiAqIGBgYFxuICpcbiAqIFRoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBmb3IgYSBmZXcgcmVhc29ucy4gRmlyc3QsIGRldmVsb3BlcnMgaGF2ZSBmb3VuZCB0aGlzIHBhdHRlcm5cbiAqIGNvbmZ1c2luZy4gSXQgc2VlbXMgbGlrZSB0aGUgYWN0dWFsIGBuZ01vZGVsYCBkaXJlY3RpdmUgaXMgYmVpbmcgdXNlZCwgYnV0IGluIGZhY3QgaXQnc1xuICogYW4gaW5wdXQvb3V0cHV0IHByb3BlcnR5IG5hbWVkIGBuZ01vZGVsYCBvbiB0aGUgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmUgdGhhdCBzaW1wbHlcbiAqIGFwcHJveGltYXRlcyAoc29tZSBvZikgaXRzIGJlaGF2aW9yLiBTcGVjaWZpY2FsbHksIGl0IGFsbG93cyBnZXR0aW5nL3NldHRpbmcgdGhlIHZhbHVlXG4gKiBhbmQgaW50ZXJjZXB0aW5nIHZhbHVlIGV2ZW50cy4gSG93ZXZlciwgc29tZSBvZiBgbmdNb2RlbGAncyBvdGhlciBmZWF0dXJlcyAtIGxpa2VcbiAqIGRlbGF5aW5nIHVwZGF0ZXMgd2l0aGBuZ01vZGVsT3B0aW9uc2Agb3IgZXhwb3J0aW5nIHRoZSBkaXJlY3RpdmUgLSBzaW1wbHkgZG9uJ3Qgd29yayxcbiAqIHdoaWNoIGhhcyB1bmRlcnN0YW5kYWJseSBjYXVzZWQgc29tZSBjb25mdXNpb24uXG4gKlxuICogSW4gYWRkaXRpb24sIHRoaXMgcGF0dGVybiBtaXhlcyB0ZW1wbGF0ZS1kcml2ZW4gYW5kIHJlYWN0aXZlIGZvcm1zIHN0cmF0ZWdpZXMsIHdoaWNoXG4gKiB3ZSBnZW5lcmFsbHkgZG9uJ3QgcmVjb21tZW5kIGJlY2F1c2UgaXQgZG9lc24ndCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZnVsbCBiZW5lZml0cyBvZlxuICogZWl0aGVyIHN0cmF0ZWd5LiBTZXR0aW5nIHRoZSB2YWx1ZSBpbiB0aGUgdGVtcGxhdGUgdmlvbGF0ZXMgdGhlIHRlbXBsYXRlLWFnbm9zdGljXG4gKiBwcmluY2lwbGVzIGJlaGluZCByZWFjdGl2ZSBmb3Jtcywgd2hlcmVhcyBhZGRpbmcgYSBgRm9ybUNvbnRyb2xgL2BGb3JtR3JvdXBgIGxheWVyIGluXG4gKiB0aGUgY2xhc3MgcmVtb3ZlcyB0aGUgY29udmVuaWVuY2Ugb2YgZGVmaW5pbmcgZm9ybXMgaW4gdGhlIHRlbXBsYXRlLlxuICpcbiAqIFRvIHVwZGF0ZSB5b3VyIGNvZGUgYmVmb3JlIHY3LCB5b3UnbGwgd2FudCB0byBkZWNpZGUgd2hldGhlciB0byBzdGljayB3aXRoIHJlYWN0aXZlIGZvcm1cbiAqIGRpcmVjdGl2ZXMgKGFuZCBnZXQvc2V0IHZhbHVlcyB1c2luZyByZWFjdGl2ZSBmb3JtcyBwYXR0ZXJucykgb3Igc3dpdGNoIG92ZXIgdG9cbiAqIHRlbXBsYXRlLWRyaXZlbiBkaXJlY3RpdmVzLlxuICpcbiAqIEFmdGVyIChjaG9pY2UgMSAtIHVzZSByZWFjdGl2ZSBmb3Jtcyk6XG4gKlxuICogYGBgaHRtbFxuICogPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gKiAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJmaXJzdFwiPlxuICogPC9mb3JtPlxuICogYGBgXG4gKlxuICogYGBgdHNcbiAqIHRoaXMuZm9ybS5nZXQoJ2ZpcnN0Jykuc2V0VmFsdWUoJ3NvbWUgdmFsdWUnKTtcbiAqIGBgYFxuICpcbiAqIEFmdGVyIChjaG9pY2UgMiAtIHVzZSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMpOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCI+XG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogdGhpcy52YWx1ZSA9ICdzb21lIHZhbHVlJztcbiAqIGBgYFxuICpcbiAqIEJ5IGRlZmF1bHQsIHdoZW4geW91IHVzZSB0aGlzIHBhdHRlcm4sIHlvdSB3aWxsIHNlZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgb25jZSBpbiBkZXZcbiAqIG1vZGUuIFlvdSBjYW4gY2hvb3NlIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIGJ5IHByb3ZpZGluZyBhIGNvbmZpZyBmb3JcbiAqIGBSZWFjdGl2ZUZvcm1zTW9kdWxlYCBhdCBpbXBvcnQgdGltZTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0czogW1xuICogICBSZWFjdGl2ZUZvcm1zTW9kdWxlLndpdGhDb25maWcoe3dhcm5Pbk5nTW9kZWxXaXRoRm9ybUNvbnRyb2w6ICduZXZlcid9KVxuICogXVxuICogYGBgXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjaG9vc2UgdG8gc3VyZmFjZSBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgdGhpc1xuICogcGF0dGVybiB3aXRoIGEgY29uZmlnIHZhbHVlIG9mIGBcImFsd2F5c1wiYC4gVGhpcyBtYXkgaGVscCB0byB0cmFjayBkb3duIHdoZXJlIGluIHRoZSBjb2RlXG4gKiB0aGUgcGF0dGVybiBpcyBiZWluZyB1c2VkIGFzIHRoZSBjb2RlIGlzIGJlaW5nIHVwZGF0ZWQuXG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEZvcm1Db250cm9sTmFtZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoRm9ybUNvbnRyb2xOYW1lLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZvcm1Db250cm9sTmFtZShwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywgdmFsdWVBY2Nlc3NvcnMsIF9uZ01vZGVsV2FybmluZ0NvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcgPSBfbmdNb2RlbFdhcm5pbmdDb25maWc7XG4gICAgICAgIF90aGlzLl9hZGRlZCA9IGZhbHNlO1xuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgYXMgb2YgdjYgKi9cbiAgICAgICAgX3RoaXMudXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEluc3RhbmNlIHByb3BlcnR5IHVzZWQgdG8gdHJhY2sgd2hldGhlciBhbiBuZ01vZGVsIHdhcm5pbmcgaGFzIGJlZW4gc2VudCBvdXQgZm9yIHRoaXNcbiAgICAgICAgICogcGFydGljdWxhciBGb3JtQ29udHJvbE5hbWUgaW5zdGFuY2UuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiBcImFsd2F5c1wiLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aGlzLl9uZ01vZGVsV2FybmluZ1NlbnQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgICAgX3RoaXMuX3Jhd1ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICBfdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzID0gYXN5bmNWYWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICBfdGhpcy52YWx1ZUFjY2Vzc29yID0gc2VsZWN0VmFsdWVBY2Nlc3NvcihfdGhpcywgdmFsdWVBY2Nlc3NvcnMpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZvcm1Db250cm9sTmFtZV8xID0gRm9ybUNvbnRyb2xOYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQ29udHJvbE5hbWUucHJvdG90eXBlLCBcImlzRGlzYWJsZWRcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFRyaWdnZXJzIGEgd2FybmluZyB0aGF0IHRoaXMgaW5wdXQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggcmVhY3RpdmUgZm9ybXMuXG4gICAgICAgICAqL1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChpc0Rpc2FibGVkKSB7IFJlYWN0aXZlRXJyb3JzLmRpc2FibGVkQXR0cldhcm5pbmcoKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2xOYW1lLnByb3RvdHlwZS5uZ09uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIGlmICghdGhpcy5fYWRkZWQpXG4gICAgICAgICAgICB0aGlzLl9zZXRVcENvbnRyb2woKTtcbiAgICAgICAgaWYgKGlzUHJvcGVydHlVcGRhdGVkKGNoYW5nZXMsIHRoaXMudmlld01vZGVsKSkge1xuICAgICAgICAgICAgX25nTW9kZWxXYXJuaW5nKCdmb3JtQ29udHJvbE5hbWUnLCBGb3JtQ29udHJvbE5hbWVfMSwgdGhpcywgdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcpO1xuICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlLnVwZGF0ZU1vZGVsKHRoaXMsIHRoaXMubW9kZWwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAqL1xuICAgIEZvcm1Db250cm9sTmFtZS5wcm90b3R5cGUubmdPbkRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sKHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTZXRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2aWV3IG1vZGVsIGFuZCBlbWl0cyBhbiBgbmdNb2RlbENoYW5nZWAgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZpZXcgbW9kZWwuXG4gICAgICovXG4gICAgRm9ybUNvbnRyb2xOYW1lLnByb3RvdHlwZS52aWV3VG9Nb2RlbFVwZGF0ZSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgICAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGb3JtQ29udHJvbE5hbWUucHJvdG90eXBlLCBcInBhdGhcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBwYXRoIGZyb20gdGhlIHRvcC1sZXZlbCBmb3JtIHRvIHRoaXMgY29udHJvbC5cbiAgICAgICAgICogRWFjaCBpbmRleCBpcyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGNvbnRyb2wgb24gdGhhdCBsZXZlbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29udHJvbFBhdGgodGhpcy5uYW1lLCB0aGlzLl9wYXJlbnQpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUNvbnRyb2xOYW1lLnByb3RvdHlwZSwgXCJmb3JtRGlyZWN0aXZlXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUaGUgdG9wLWxldmVsIGRpcmVjdGl2ZSBmb3IgdGhpcyBncm91cCBpZiBwcmVzZW50LCBvdGhlcndpc2UgbnVsbC5cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUgOiBudWxsOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRm9ybUNvbnRyb2xOYW1lLnByb3RvdHlwZSwgXCJ2YWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIFN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIHN5bmNocm9ub3VzIHZhbGlkYXRvcnNcbiAgICAgICAgICogcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZvcm1Db250cm9sTmFtZS5wcm90b3R5cGUsIFwiYXN5bmNWYWxpZGF0b3JcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlc2NyaXB0aW9uXG4gICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXNcbiAgICAgICAgICogZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBGb3JtQ29udHJvbE5hbWUucHJvdG90eXBlLl9jaGVja1BhcmVudFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cE5hbWUpICYmXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSkge1xuICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMubmdNb2RlbEdyb3VwRXhjZXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBOYW1lKSAmJiAhKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEZvcm1Hcm91cERpcmVjdGl2ZSkgJiZcbiAgICAgICAgICAgICEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgRm9ybUFycmF5TmFtZSkpIHtcbiAgICAgICAgICAgIFJlYWN0aXZlRXJyb3JzLmNvbnRyb2xQYXJlbnRFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRm9ybUNvbnRyb2xOYW1lLnByb3RvdHlwZS5fc2V0VXBDb250cm9sID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jaGVja1BhcmVudFR5cGUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sID0gdGhpcy5mb3JtRGlyZWN0aXZlLmFkZENvbnRyb2wodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZGlzYWJsZWQgJiYgdGhpcy52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHZhciBGb3JtQ29udHJvbE5hbWVfMTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBTdGF0aWMgcHJvcGVydHkgdXNlZCB0byB0cmFjayB3aGV0aGVyIGFueSBuZ01vZGVsIHdhcm5pbmdzIGhhdmUgYmVlbiBzZW50IGFjcm9zc1xuICAgICAqIGFsbCBpbnN0YW5jZXMgb2YgRm9ybUNvbnRyb2xOYW1lLiBVc2VkIHRvIHN1cHBvcnQgd2FybmluZyBjb25maWcgb2YgXCJvbmNlXCIuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBGb3JtQ29udHJvbE5hbWUuX25nTW9kZWxXYXJuaW5nU2VudE9uY2UgPSBmYWxzZTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ2Zvcm1Db250cm9sTmFtZScpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKVxuICAgIF0sIEZvcm1Db250cm9sTmFtZS5wcm90b3R5cGUsIFwibmFtZVwiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgnZGlzYWJsZWQnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0Jvb2xlYW5dKVxuICAgIF0sIEZvcm1Db250cm9sTmFtZS5wcm90b3R5cGUsIFwiaXNEaXNhYmxlZFwiLCBudWxsKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoJ25nTW9kZWwnKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBGb3JtQ29udHJvbE5hbWUucHJvdG90eXBlLCBcIm1vZGVsXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgnbmdNb2RlbENoYW5nZScpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIEZvcm1Db250cm9sTmFtZS5wcm90b3R5cGUsIFwidXBkYXRlXCIsIHZvaWQgMCk7XG4gICAgRm9ybUNvbnRyb2xOYW1lID0gRm9ybUNvbnRyb2xOYW1lXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbZm9ybUNvbnRyb2xOYW1lXScsIHByb3ZpZGVyczogW2NvbnRyb2xOYW1lQmluZGluZ10gfSksXG4gICAgICAgIF9fcGFyYW0oMCwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMCwgSG9zdCgpKSwgX19wYXJhbSgwLCBTa2lwU2VsZigpKSxcbiAgICAgICAgX19wYXJhbSgxLCBPcHRpb25hbCgpKSwgX19wYXJhbSgxLCBTZWxmKCkpLCBfX3BhcmFtKDEsIEluamVjdChOR19WQUxJREFUT1JTKSksXG4gICAgICAgIF9fcGFyYW0oMiwgT3B0aW9uYWwoKSksIF9fcGFyYW0oMiwgU2VsZigpKSwgX19wYXJhbSgyLCBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykpLFxuICAgICAgICBfX3BhcmFtKDMsIE9wdGlvbmFsKCkpLCBfX3BhcmFtKDMsIFNlbGYoKSksIF9fcGFyYW0oMywgSW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SKSksXG4gICAgICAgIF9fcGFyYW0oNCwgT3B0aW9uYWwoKSksIF9fcGFyYW0oNCwgSW5qZWN0KE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcpKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtDb250cm9sQ29udGFpbmVyLFxuICAgICAgICAgICAgQXJyYXksXG4gICAgICAgICAgICBBcnJheSwgQXJyYXksIE9iamVjdF0pXG4gICAgXSwgRm9ybUNvbnRyb2xOYW1lKTtcbiAgICByZXR1cm4gRm9ybUNvbnRyb2xOYW1lO1xufShOZ0NvbnRyb2wpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYFJlcXVpcmVkVmFsaWRhdG9yYCB0byB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuXG4gKi9cbnZhciBSRVFVSVJFRF9WQUxJREFUT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBSZXF1aXJlZFZhbGlkYXRvcjsgfSksXG4gICAgbXVsdGk6IHRydWVcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LlxuICovXG52YXIgQ0hFQ0tCT1hfUkVRVUlSRURfVkFMSURBVE9SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoZnVuY3Rpb24gKCkgeyByZXR1cm4gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcjsgfSksXG4gICAgbXVsdGk6IHRydWVcbn07XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBkaXJlY3RpdmUgdGhhdCBhZGRzIHRoZSBgcmVxdWlyZWRgIHZhbGlkYXRvciB0byBhbnkgY29udHJvbHMgbWFya2VkIHdpdGggdGhlXG4gKiBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4gVGhlIGRpcmVjdGl2ZSBpcyBwcm92aWRlZCB3aXRoIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC5cbiAqXG4gKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbilcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBBZGRpbmcgYSByZXF1aXJlZCB2YWxpZGF0b3IgdXNpbmcgdGVtcGxhdGUtZHJpdmVuIGZvcm1zXG4gKlxuICogYGBgXG4gKiA8aW5wdXQgbmFtZT1cImZ1bGxOYW1lXCIgbmdNb2RlbCByZXF1aXJlZD5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFJlcXVpcmVkVmFsaWRhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlcXVpcmVkVmFsaWRhdG9yKCkge1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVxdWlyZWRWYWxpZGF0b3IucHJvdG90eXBlLCBcInJlcXVpcmVkXCIsIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAgICAgKiBUcmFja3MgY2hhbmdlcyB0byB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9yZXF1aXJlZDsgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgXCJcIiArIHZhbHVlICE9PSAnZmFsc2UnO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlKVxuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE1ldGhvZCB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGVtcHR5LlxuICAgICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLlxuICAgICAqL1xuICAgIFJlcXVpcmVkVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVkID8gVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSA6IG51bGw7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIFJlcXVpcmVkVmFsaWRhdG9yLnByb3RvdHlwZS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMuX29uQ2hhbmdlID0gZm47IH07XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgUmVxdWlyZWRWYWxpZGF0b3IucHJvdG90eXBlLCBcInJlcXVpcmVkXCIsIG51bGwpO1xuICAgIFJlcXVpcmVkVmFsaWRhdG9yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJzpub3QoW3R5cGU9Y2hlY2tib3hdKVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSw6bm90KFt0eXBlPWNoZWNrYm94XSlbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSw6bm90KFt0eXBlPWNoZWNrYm94XSlbcmVxdWlyZWRdW25nTW9kZWxdJyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1JFUVVJUkVEX1ZBTElEQVRPUl0sXG4gICAgICAgICAgICBob3N0OiB7ICdbYXR0ci5yZXF1aXJlZF0nOiAncmVxdWlyZWQgPyBcIlwiIDogbnVsbCcgfVxuICAgICAgICB9KVxuICAgIF0sIFJlcXVpcmVkVmFsaWRhdG9yKTtcbiAgICByZXR1cm4gUmVxdWlyZWRWYWxpZGF0b3I7XG59KCkpO1xuLyoqXG4gKiBBIERpcmVjdGl2ZSB0aGF0IGFkZHMgdGhlIGByZXF1aXJlZGAgdmFsaWRhdG9yIHRvIGNoZWNrYm94IGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYHJlcXVpcmVkYCBhdHRyaWJ1dGUuIFRoZSBkaXJlY3RpdmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuXG4gKlxuICogQHNlZSBbRm9ybSBWYWxpZGF0aW9uXShndWlkZS9mb3JtLXZhbGlkYXRpb24pXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgQWRkaW5nIGEgcmVxdWlyZWQgY2hlY2tib3ggdmFsaWRhdG9yIHVzaW5nIHRlbXBsYXRlLWRyaXZlbiBmb3Jtc1xuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgY2hlY2tib3ggcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuIG5nTW9kZWwgYmluZGluZy5cbiAqXG4gKiBgYGBcbiAqIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiYWN0aXZlXCIgbmdNb2RlbCByZXF1aXJlZD5cbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqL1xudmFyIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBNZXRob2QgdGhhdCB2YWxpZGF0ZXMgd2hldGhlciBvciBub3QgdGhlIGNoZWNrYm94IGhhcyBiZWVuIGNoZWNrZWQuXG4gICAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiByZXN1bHQgaWYgZW5hYmxlZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICovXG4gICAgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCA/IFZhbGlkYXRvcnMucmVxdWlyZWRUcnVlKGNvbnRyb2wpIDogbnVsbDtcbiAgICB9O1xuICAgIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgRGlyZWN0aXZlKHtcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnaW5wdXRbdHlwZT1jaGVja2JveF1bcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1jaGVja2JveF1bcmVxdWlyZWRdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF1bbmdNb2RlbF0nLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbQ0hFQ0tCT1hfUkVRVUlSRURfVkFMSURBVE9SXSxcbiAgICAgICAgICAgIGhvc3Q6IHsgJ1thdHRyLnJlcXVpcmVkXSc6ICdyZXF1aXJlZCA/IFwiXCIgOiBudWxsJyB9XG4gICAgICAgIH0pXG4gICAgXSwgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcik7XG4gICAgcmV0dXJuIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3I7XG59KFJlcXVpcmVkVmFsaWRhdG9yKSk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgRW1haWxWYWxpZGF0b3JgIHRvIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC5cbiAqL1xudmFyIEVNQUlMX1ZBTElEQVRPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIEVtYWlsVmFsaWRhdG9yOyB9KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcbi8qKlxuICogQSBkaXJlY3RpdmUgdGhhdCBhZGRzIHRoZSBgZW1haWxgIHZhbGlkYXRvciB0byBjb250cm9scyBtYXJrZWQgd2l0aCB0aGVcbiAqIGBlbWFpbGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LlxuICpcbiAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKVxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEFkZGluZyBhbiBlbWFpbCB2YWxpZGF0b3JcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhbiBlbWFpbCB2YWxpZGF0b3IgdG8gYW4gaW5wdXQgYXR0YWNoZWQgdG8gYW4gbmdNb2RlbCBiaW5kaW5nLlxuICpcbiAqIGBgYFxuICogPGlucHV0IHR5cGU9XCJlbWFpbFwiIG5hbWU9XCJlbWFpbFwiIG5nTW9kZWwgZW1haWw+XG4gKiA8aW5wdXQgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgbmdNb2RlbCBlbWFpbD1cInRydWVcIj5cbiAqIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBuYW1lPVwiZW1haWxcIiBuZ01vZGVsIFtlbWFpbF09XCJ0cnVlXCI+XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljQXBpXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKi9cbnZhciBFbWFpbFZhbGlkYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbWFpbFZhbGlkYXRvcigpIHtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVtYWlsVmFsaWRhdG9yLnByb3RvdHlwZSwgXCJlbWFpbFwiLCB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgICAgICogVHJhY2tzIGNoYW5nZXMgdG8gdGhlIGVtYWlsIGF0dHJpYnV0ZSBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS5cbiAgICAgICAgICovXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgYW4gZW1haWwgYWRkcmVzcyBpcyB2YWxpZC5cbiAgICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdCBpZiBlbmFibGVkLCBvdGhlcndpc2UgbnVsbC5cbiAgICAgKi9cbiAgICBFbWFpbFZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCA/IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbCkgOiBudWxsO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB2YWxpZGF0b3IgaW5wdXRzIGNoYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBFbWFpbFZhbGlkYXRvci5wcm90b3R5cGUucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkNoYW5nZSA9IGZuOyB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtPYmplY3RdKVxuICAgIF0sIEVtYWlsVmFsaWRhdG9yLnByb3RvdHlwZSwgXCJlbWFpbFwiLCBudWxsKTtcbiAgICBFbWFpbFZhbGlkYXRvciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZW1haWxdW2Zvcm1Db250cm9sTmFtZV0sW2VtYWlsXVtmb3JtQ29udHJvbF0sW2VtYWlsXVtuZ01vZGVsXScsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtFTUFJTF9WQUxJREFUT1JdXG4gICAgICAgIH0pXG4gICAgXSwgRW1haWxWYWxpZGF0b3IpO1xuICAgIHJldHVybiBFbWFpbFZhbGlkYXRvcjtcbn0oKSk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgTWluTGVuZ3RoVmFsaWRhdG9yYCB0byB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuXG4gKi9cbnZhciBNSU5fTEVOR1RIX1ZBTElEQVRPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1pbkxlbmd0aFZhbGlkYXRvcjsgfSksXG4gICAgbXVsdGk6IHRydWVcbn07XG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uIHRvIGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYG1pbmxlbmd0aGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0LXByb3ZpZGVyIGxpc3QuXG4gKlxuICogQHNlZSBbRm9ybSBWYWxpZGF0aW9uXShndWlkZS9mb3JtLXZhbGlkYXRpb24pXG4gKlxuICogQHVzYWdlTm90ZXNcbiAqXG4gKiAjIyMgQWRkaW5nIGEgbWluaW11bSBsZW5ndGggdmFsaWRhdG9yXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0b3IgdG8gYW4gaW5wdXQgYXR0YWNoZWQgdG8gYW5cbiAqIG5nTW9kZWwgYmluZGluZy5cbiAqXG4gKiBgYGBodG1sXG4gKiA8aW5wdXQgbmFtZT1cImZpcnN0TmFtZVwiIG5nTW9kZWwgbWlubGVuZ3RoPVwiNFwiPlxuICogYGBgXG4gKlxuICogQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGVcbiAqIEBuZ01vZHVsZSBGb3Jtc01vZHVsZVxuICogQHB1YmxpY0FwaVxuICovXG52YXIgTWluTGVuZ3RoVmFsaWRhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1pbkxlbmd0aFZhbGlkYXRvcigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlXG4gICAgICogb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy5cbiAgICAgKi9cbiAgICBNaW5MZW5ndGhWYWxpZGF0b3IucHJvdG90eXBlLm5nT25DaGFuZ2VzID0gZnVuY3Rpb24gKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKCdtaW5sZW5ndGgnIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVZhbGlkYXRvcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlKVxuICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIE1ldGhvZCB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIHRoZSB2YWx1ZSBtZWV0cyBhIG1pbmltdW0gbGVuZ3RoXG4gICAgICogcmVxdWlyZW1lbnQuIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLlxuICAgICAqL1xuICAgIE1pbkxlbmd0aFZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW5sZW5ndGggPT0gbnVsbCA/IG51bGwgOiB0aGlzLl92YWxpZGF0b3IoY29udHJvbCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIE1pbkxlbmd0aFZhbGlkYXRvci5wcm90b3R5cGUucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkNoYW5nZSA9IGZuOyB9O1xuICAgIE1pbkxlbmd0aFZhbGlkYXRvci5wcm90b3R5cGUuX2NyZWF0ZVZhbGlkYXRvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5taW5MZW5ndGgocGFyc2VJbnQodGhpcy5taW5sZW5ndGgsIDEwKSk7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFN0cmluZylcbiAgICBdLCBNaW5MZW5ndGhWYWxpZGF0b3IucHJvdG90eXBlLCBcIm1pbmxlbmd0aFwiLCB2b2lkIDApO1xuICAgIE1pbkxlbmd0aFZhbGlkYXRvciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBEaXJlY3RpdmUoe1xuICAgICAgICAgICAgc2VsZWN0b3I6ICdbbWlubGVuZ3RoXVtmb3JtQ29udHJvbE5hbWVdLFttaW5sZW5ndGhdW2Zvcm1Db250cm9sXSxbbWlubGVuZ3RoXVtuZ01vZGVsXScsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtNSU5fTEVOR1RIX1ZBTElEQVRPUl0sXG4gICAgICAgICAgICBob3N0OiB7ICdbYXR0ci5taW5sZW5ndGhdJzogJ21pbmxlbmd0aCA/IG1pbmxlbmd0aCA6IG51bGwnIH1cbiAgICAgICAgfSlcbiAgICBdLCBNaW5MZW5ndGhWYWxpZGF0b3IpO1xuICAgIHJldHVybiBNaW5MZW5ndGhWYWxpZGF0b3I7XG59KCkpO1xuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYE1heExlbmd0aFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LlxuICovXG52YXIgTUFYX0xFTkdUSF9WQUxJREFUT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBNYXhMZW5ndGhWYWxpZGF0b3I7IH0pLFxuICAgIG11bHRpOiB0cnVlXG59O1xuLyoqXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IGFkZHMgbWF4IGxlbmd0aCB2YWxpZGF0aW9uIHRvIGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYG1heGxlbmd0aGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LlxuICpcbiAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKVxuICpcbiAqIEB1c2FnZU5vdGVzXG4gKlxuICogIyMjIEFkZGluZyBhIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRvclxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgbWF4aW11bSBsZW5ndGggdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuXG4gKiBuZ01vZGVsIGJpbmRpbmcuXG4gKlxuICogYGBgaHRtbFxuICogPGlucHV0IG5hbWU9XCJmaXJzdE5hbWVcIiBuZ01vZGVsIG1heGxlbmd0aD1cIjI1XCI+XG4gKiBgYGBcbiAqXG4gKiBAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZVxuICogQG5nTW9kdWxlIEZvcm1zTW9kdWxlXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBNYXhMZW5ndGhWYWxpZGF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWF4TGVuZ3RoVmFsaWRhdG9yKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2VcbiAgICAgKiBvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLlxuICAgICAqL1xuICAgIE1heExlbmd0aFZhbGlkYXRvci5wcm90b3R5cGUubmdPbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICBpZiAoJ21heGxlbmd0aCcgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlVmFsaWRhdG9yKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIHZhbHVlIGV4Y2VlZHNcbiAgICAgKiB0aGUgbWF4aW11bSBsZW5ndGggcmVxdWlyZW1lbnQuXG4gICAgICovXG4gICAgTWF4TGVuZ3RoVmFsaWRhdG9yLnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIChjb250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1heGxlbmd0aCAhPSBudWxsID8gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpIDogbnVsbDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgdmFsaWRhdG9yIGlucHV0cyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgTWF4TGVuZ3RoVmFsaWRhdG9yLnByb3RvdHlwZS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlID0gZnVuY3Rpb24gKGZuKSB7IHRoaXMuX29uQ2hhbmdlID0gZm47IH07XG4gICAgTWF4TGVuZ3RoVmFsaWRhdG9yLnByb3RvdHlwZS5fY3JlYXRlVmFsaWRhdG9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLm1heExlbmd0aChwYXJzZUludCh0aGlzLm1heGxlbmd0aCwgMTApKTtcbiAgICB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgU3RyaW5nKVxuICAgIF0sIE1heExlbmd0aFZhbGlkYXRvci5wcm90b3R5cGUsIFwibWF4bGVuZ3RoXCIsIHZvaWQgMCk7XG4gICAgTWF4TGVuZ3RoVmFsaWRhdG9yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ1ttYXhsZW5ndGhdW2Zvcm1Db250cm9sTmFtZV0sW21heGxlbmd0aF1bZm9ybUNvbnRyb2xdLFttYXhsZW5ndGhdW25nTW9kZWxdJyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW01BWF9MRU5HVEhfVkFMSURBVE9SXSxcbiAgICAgICAgICAgIGhvc3Q6IHsgJ1thdHRyLm1heGxlbmd0aF0nOiAnbWF4bGVuZ3RoID8gbWF4bGVuZ3RoIDogbnVsbCcgfVxuICAgICAgICB9KVxuICAgIF0sIE1heExlbmd0aFZhbGlkYXRvcik7XG4gICAgcmV0dXJuIE1heExlbmd0aFZhbGlkYXRvcjtcbn0oKSk7XG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgUGF0dGVyblZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LlxuICovXG52YXIgUEFUVEVSTl9WQUxJREFUT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZihmdW5jdGlvbiAoKSB7IHJldHVybiBQYXR0ZXJuVmFsaWRhdG9yOyB9KSxcbiAgICBtdWx0aTogdHJ1ZVxufTtcbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIGRpcmVjdGl2ZSB0aGF0IGFkZHMgcmVnZXggcGF0dGVybiB2YWxpZGF0aW9uIHRvIGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYHBhdHRlcm5gIGF0dHJpYnV0ZS4gVGhlIHJlZ2V4IG11c3QgbWF0Y2ggdGhlIGVudGlyZSBjb250cm9sIHZhbHVlLlxuICogVGhlIGRpcmVjdGl2ZSBpcyBwcm92aWRlZCB3aXRoIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC5cbiAqXG4gKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbilcbiAqXG4gKiBAdXNhZ2VOb3Rlc1xuICpcbiAqICMjIyBBZGRpbmcgYSBwYXR0ZXJuIHZhbGlkYXRvclxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgcGF0dGVybiB2YWxpZGF0b3IgdG8gYW4gaW5wdXQgYXR0YWNoZWQgdG8gYW5cbiAqIG5nTW9kZWwgYmluZGluZy5cbiAqXG4gKiBgYGBodG1sXG4gKiA8aW5wdXQgbmFtZT1cImZpcnN0TmFtZVwiIG5nTW9kZWwgcGF0dGVybj1cIlthLXpBLVogXSpcIj5cbiAqIGBgYFxuICpcbiAqIEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiBAbmdNb2R1bGUgRm9ybXNNb2R1bGVcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIFBhdHRlcm5WYWxpZGF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGF0dGVyblZhbGlkYXRvcigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlXG4gICAgICogb25seS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy5cbiAgICAgKi9cbiAgICBQYXR0ZXJuVmFsaWRhdG9yLnByb3RvdHlwZS5uZ09uQ2hhbmdlcyA9IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgIGlmICgncGF0dGVybicgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlVmFsaWRhdG9yKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpXG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIHZhbHVlIG1hdGNoZXMgdGhlXG4gICAgICogdGhlIHBhdHRlcm4gcmVxdWlyZW1lbnQuXG4gICAgICovXG4gICAgUGF0dGVyblZhbGlkYXRvci5wcm90b3R5cGUudmFsaWRhdGUgPSBmdW5jdGlvbiAoY29udHJvbCkgeyByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpOyB9O1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgdmFsaWRhdG9yIGlucHV0cyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgUGF0dGVyblZhbGlkYXRvci5wcm90b3R5cGUucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSA9IGZ1bmN0aW9uIChmbikgeyB0aGlzLl9vbkNoYW5nZSA9IGZuOyB9O1xuICAgIFBhdHRlcm5WYWxpZGF0b3IucHJvdG90eXBlLl9jcmVhdGVWYWxpZGF0b3IgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBhdHRlcm4pOyB9O1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBJbnB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFBhdHRlcm5WYWxpZGF0b3IucHJvdG90eXBlLCBcInBhdHRlcm5cIiwgdm9pZCAwKTtcbiAgICBQYXR0ZXJuVmFsaWRhdG9yID0gX19kZWNvcmF0ZShbXG4gICAgICAgIERpcmVjdGl2ZSh7XG4gICAgICAgICAgICBzZWxlY3RvcjogJ1twYXR0ZXJuXVtmb3JtQ29udHJvbE5hbWVdLFtwYXR0ZXJuXVtmb3JtQ29udHJvbF0sW3BhdHRlcm5dW25nTW9kZWxdJyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1BBVFRFUk5fVkFMSURBVE9SXSxcbiAgICAgICAgICAgIGhvc3Q6IHsgJ1thdHRyLnBhdHRlcm5dJzogJ3BhdHRlcm4gPyBwYXR0ZXJuIDogbnVsbCcgfVxuICAgICAgICB9KVxuICAgIF0sIFBhdHRlcm5WYWxpZGF0b3IpO1xuICAgIHJldHVybiBQYXR0ZXJuVmFsaWRhdG9yO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIFNIQVJFRF9GT1JNX0RJUkVDVElWRVMgPSBbXG4gICAgybVOZ05vVmFsaWRhdGUsXG4gICAgTmdTZWxlY3RPcHRpb24sXG4gICAgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLFxuICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICAgIE51bWJlclZhbHVlQWNjZXNzb3IsXG4gICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLFxuICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5nQ29udHJvbFN0YXR1cyxcbiAgICBOZ0NvbnRyb2xTdGF0dXNHcm91cCxcbiAgICBSZXF1aXJlZFZhbGlkYXRvcixcbiAgICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gICAgTWF4TGVuZ3RoVmFsaWRhdG9yLFxuICAgIFBhdHRlcm5WYWxpZGF0b3IsXG4gICAgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcixcbiAgICBFbWFpbFZhbGlkYXRvcixcbl07XG52YXIgVEVNUExBVEVfRFJJVkVOX0RJUkVDVElWRVMgPSBbTmdNb2RlbCwgTmdNb2RlbEdyb3VwLCBOZ0Zvcm0sIE5nRm9ybVNlbGVjdG9yV2FybmluZ107XG52YXIgUkVBQ1RJVkVfRFJJVkVOX0RJUkVDVElWRVMgPSBbRm9ybUNvbnRyb2xEaXJlY3RpdmUsIEZvcm1Hcm91cERpcmVjdGl2ZSwgRm9ybUNvbnRyb2xOYW1lLCBGb3JtR3JvdXBOYW1lLCBGb3JtQXJyYXlOYW1lXTtcbi8qKlxuICogSW50ZXJuYWwgbW9kdWxlIHVzZWQgZm9yIHNoYXJpbmcgZGlyZWN0aXZlcyBiZXR3ZWVuIEZvcm1zTW9kdWxlIGFuZCBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKi9cbnZhciDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlKCkge1xuICAgIH1cbiAgICDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgTmdNb2R1bGUoe1xuICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBTSEFSRURfRk9STV9ESVJFQ1RJVkVTLFxuICAgICAgICAgICAgZXhwb3J0czogU0hBUkVEX0ZPUk1fRElSRUNUSVZFUyxcbiAgICAgICAgfSlcbiAgICBdLCDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUpO1xuICAgIHJldHVybiDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGU7XG59KCkpO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5mdW5jdGlvbiBpc0Fic3RyYWN0Q29udHJvbE9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zLmFzeW5jVmFsaWRhdG9ycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIG9wdGlvbnMudmFsaWRhdG9ycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIG9wdGlvbnMudXBkYXRlT24gIT09IHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGFuIGBBYnN0cmFjdENvbnRyb2xgIGZyb20gYSB1c2VyLXNwZWNpZmllZCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFRoZSBgRm9ybUJ1aWxkZXJgIHByb3ZpZGVzIHN5bnRhY3RpYyBzdWdhciB0aGF0IHNob3J0ZW5zIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBhIGBGb3JtQ29udHJvbGAsXG4gKiBgRm9ybUdyb3VwYCwgb3IgYEZvcm1BcnJheWAuIEl0IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBib2lsZXJwbGF0ZSBuZWVkZWQgdG8gYnVpbGQgY29tcGxleFxuICogZm9ybXMuXG4gKlxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKC9ndWlkZS9yZWFjdGl2ZS1mb3JtcylcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBGb3JtQnVpbGRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGb3JtQnVpbGRlcigpIHtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogQ29uc3RydWN0IGEgbmV3IGBGb3JtR3JvdXBgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyb2xzQ29uZmlnIEEgY29sbGVjdGlvbiBvZiBjaGlsZCBjb250cm9scy4gVGhlIGtleSBmb3IgZWFjaCBjaGlsZCBpcyB0aGUgbmFtZVxuICAgICAqIHVuZGVyIHdoaWNoIGl0IGlzIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgb2JqZWN0IGZvciB0aGUgYEZvcm1Hcm91cGAuIFRoZSBvYmplY3QgY2FuXG4gICAgICogaGF2ZSB0d28gc2hhcGVzOlxuICAgICAqXG4gICAgICogMSkgYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCAocHJlZmVycmVkKSwgd2hpY2ggY29uc2lzdHMgb2Y6XG4gICAgICogKiBgdmFsaWRhdG9yc2A6IEEgc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uLCBvciBhbiBhcnJheSBvZiB2YWxpZGF0b3IgZnVuY3Rpb25zXG4gICAgICogKiBgYXN5bmNWYWxpZGF0b3JzYDogQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnNcbiAgICAgKiAqIGB1cGRhdGVPbmA6IFRoZSBldmVudCB1cG9uIHdoaWNoIHRoZSBjb250cm9sIHNob3VsZCBiZSB1cGRhdGVkIChvcHRpb25zOiAnY2hhbmdlJyB8ICdibHVyJyB8XG4gICAgICogc3VibWl0JylcbiAgICAgKlxuICAgICAqIDIpIExlZ2FjeSBjb25maWd1cmF0aW9uIG9iamVjdCwgd2hpY2ggY29uc2lzdHMgb2Y6XG4gICAgICogKiBgdmFsaWRhdG9yYDogQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mIHZhbGlkYXRvciBmdW5jdGlvbnNcbiAgICAgKiAqIGBhc3luY1ZhbGlkYXRvcmA6IEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zXG4gICAgICpcbiAgICAgKi9cbiAgICBGb3JtQnVpbGRlci5wcm90b3R5cGUuZ3JvdXAgPSBmdW5jdGlvbiAoY29udHJvbHNDb25maWcsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0gbnVsbDsgfVxuICAgICAgICB2YXIgY29udHJvbHMgPSB0aGlzLl9yZWR1Y2VDb250cm9scyhjb250cm9sc0NvbmZpZyk7XG4gICAgICAgIHZhciB2YWxpZGF0b3JzID0gbnVsbDtcbiAgICAgICAgdmFyIGFzeW5jVmFsaWRhdG9ycyA9IG51bGw7XG4gICAgICAgIHZhciB1cGRhdGVPbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzQWJzdHJhY3RDb250cm9sT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIC8vIGBvcHRpb25zYCBhcmUgYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9ycyA9IG9wdGlvbnMudmFsaWRhdG9ycyAhPSBudWxsID8gb3B0aW9ucy52YWxpZGF0b3JzIDogbnVsbDtcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMgPSBvcHRpb25zLmFzeW5jVmFsaWRhdG9ycyAhPSBudWxsID8gb3B0aW9ucy5hc3luY1ZhbGlkYXRvcnMgOiBudWxsO1xuICAgICAgICAgICAgICAgIHVwZGF0ZU9uID0gb3B0aW9ucy51cGRhdGVPbiAhPSBudWxsID8gb3B0aW9ucy51cGRhdGVPbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGBvcHRpb25zYCBhcmUgbGVnYWN5IGZvcm0gZ3JvdXAgb3B0aW9uc1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBvcHRpb25zWyd2YWxpZGF0b3InXSAhPSBudWxsID8gb3B0aW9uc1sndmFsaWRhdG9yJ10gOiBudWxsO1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycyA9IG9wdGlvbnNbJ2FzeW5jVmFsaWRhdG9yJ10gIT0gbnVsbCA/IG9wdGlvbnNbJ2FzeW5jVmFsaWRhdG9yJ10gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzLCB7IGFzeW5jVmFsaWRhdG9yczogYXN5bmNWYWxpZGF0b3JzLCB1cGRhdGVPbjogdXBkYXRlT24sIHZhbGlkYXRvcnM6IHZhbGlkYXRvcnMgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb25cbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYEZvcm1Db250cm9sYCB3aXRoIHRoZSBnaXZlbiBzdGF0ZSwgdmFsaWRhdG9ycyBhbmQgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JtU3RhdGUgSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2wgd2l0aCBhbiBpbml0aWFsIHN0YXRlIHZhbHVlLCBvclxuICAgICAqIHdpdGggYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkIHN0YXR1cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mXG4gICAgICogc3VjaCBmdW5jdGlvbnMsIG9yIGFuIGBBYnN0cmFjdENvbnRyb2xPcHRpb25zYCBvYmplY3QgdGhhdCBjb250YWluc1xuICAgICAqIHZhbGlkYXRpb24gZnVuY3Rpb25zIGFuZCBhIHZhbGlkYXRpb24gdHJpZ2dlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhc3luY1ZhbGlkYXRvciBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yXG4gICAgICogZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHVzYWdlTm90ZXNcbiAgICAgKlxuICAgICAqICMjIyBJbml0aWFsaXplIGEgY29udHJvbCBhcyBkaXNhYmxlZFxuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJldHVybnMgYSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBpbiBhIGRpc2FibGVkIHN0YXRlLlxuICAgICAqXG4gICAgICogPGNvZGUtZXhhbXBsZSBwYXRoPVwiZm9ybXMvdHMvZm9ybUJ1aWxkZXIvZm9ybV9idWlsZGVyX2V4YW1wbGUudHNcIlxuICAgICAqICAgbGluZW51bXM9XCJmYWxzZVwiIHJlZ2lvbj1cImRpc2FibGVkLWNvbnRyb2xcIj5cbiAgICAgKiA8L2NvZGUtZXhhbXBsZT5cbiAgICAgKi9cbiAgICBGb3JtQnVpbGRlci5wcm90b3R5cGUuY29udHJvbCA9IGZ1bmN0aW9uIChmb3JtU3RhdGUsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBgRm9ybUFycmF5YCBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBjb25maWd1cmF0aW9ucyxcbiAgICAgKiB2YWxpZGF0b3JzIGFuZCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyb2xzQ29uZmlnIEFuIGFycmF5IG9mIGNoaWxkIGNvbnRyb2xzIG9yIGNvbnRyb2wgY29uZmlncy4gRWFjaFxuICAgICAqIGNoaWxkIGNvbnRyb2wgaXMgZ2l2ZW4gYW4gaW5kZXggd2hlbiBpdCBpcyByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2ZcbiAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zXG4gICAgICogdmFsaWRhdGlvbiBmdW5jdGlvbnMgYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFzeW5jVmFsaWRhdG9yIEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3JcbiAgICAgKiBmdW5jdGlvbnMuXG4gICAgICovXG4gICAgRm9ybUJ1aWxkZXIucHJvdG90eXBlLmFycmF5ID0gZnVuY3Rpb24gKGNvbnRyb2xzQ29uZmlnLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBjb250cm9scyA9IGNvbnRyb2xzQ29uZmlnLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gX3RoaXMuX2NyZWF0ZUNvbnRyb2woYyk7IH0pO1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1BcnJheShjb250cm9scywgdmFsaWRhdG9yT3JPcHRzLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgRm9ybUJ1aWxkZXIucHJvdG90eXBlLl9yZWR1Y2VDb250cm9scyA9IGZ1bmN0aW9uIChjb250cm9sc0NvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgY29udHJvbHMgPSB7fTtcbiAgICAgICAgT2JqZWN0LmtleXMoY29udHJvbHNDb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGNvbnRyb2xOYW1lKSB7XG4gICAgICAgICAgICBjb250cm9sc1tjb250cm9sTmFtZV0gPSBfdGhpcy5fY3JlYXRlQ29udHJvbChjb250cm9sc0NvbmZpZ1tjb250cm9sTmFtZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEZvcm1CdWlsZGVyLnByb3RvdHlwZS5fY3JlYXRlQ29udHJvbCA9IGZ1bmN0aW9uIChjb250cm9sQ29uZmlnKSB7XG4gICAgICAgIGlmIChjb250cm9sQ29uZmlnIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgY29udHJvbENvbmZpZyBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fFxuICAgICAgICAgICAgY29udHJvbENvbmZpZyBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb250cm9sQ29uZmlnKSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY29udHJvbENvbmZpZ1swXTtcbiAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBjb250cm9sQ29uZmlnLmxlbmd0aCA+IDEgPyBjb250cm9sQ29uZmlnWzFdIDogbnVsbDtcbiAgICAgICAgICAgIHZhciBhc3luY1ZhbGlkYXRvciA9IGNvbnRyb2xDb25maWcubGVuZ3RoID4gMiA/IGNvbnRyb2xDb25maWdbMl0gOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCh2YWx1ZSwgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sKGNvbnRyb2xDb25maWcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBGb3JtQnVpbGRlciA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKClcbiAgICBdLCBGb3JtQnVpbGRlcik7XG4gICAgcmV0dXJuIEZvcm1CdWlsZGVyO1xufSgpKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzguMC4zJyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogRXhwb3J0cyB0aGUgcmVxdWlyZWQgcHJvdmlkZXJzIGFuZCBkaXJlY3RpdmVzIGZvciB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMsXG4gKiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIGltcG9ydCBieSBOZ01vZHVsZXMgdGhhdCBpbXBvcnQgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBbRm9ybXMgR3VpZGVdKC9ndWlkZS9mb3JtcylcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBGb3Jtc01vZHVsZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGb3Jtc01vZHVsZSgpIHtcbiAgICB9XG4gICAgRm9ybXNNb2R1bGVfMSA9IEZvcm1zTW9kdWxlO1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqIFByb3ZpZGVzIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMgbW9kdWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdHMgQW4gb2JqZWN0IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgICAqICogYHdhcm5PbkRlcHJlY2F0ZWROZ0Zvcm1TZWxlY3RvcmAgQ29uZmlndXJlcyB3aGVuIHRvIGVtaXQgYSB3YXJuaW5nIHdoZW4gdGhlIGRlcHJlY2F0ZWRcbiAgICAgKiBgbmdGb3JtYCBzZWxlY3RvciBpcyB1c2VkLlxuICAgICAqL1xuICAgIEZvcm1zTW9kdWxlLndpdGhDb25maWcgPSBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmdNb2R1bGU6IEZvcm1zTW9kdWxlXzEsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX0ZPUk1fU0VMRUNUT1JfV0FSTklORywgdXNlVmFsdWU6IG9wdHMud2Fybk9uRGVwcmVjYXRlZE5nRm9ybVNlbGVjdG9yIH1dXG4gICAgICAgIH07XG4gICAgfTtcbiAgICB2YXIgRm9ybXNNb2R1bGVfMTtcbiAgICBGb3Jtc01vZHVsZSA9IEZvcm1zTW9kdWxlXzEgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgTmdNb2R1bGUoe1xuICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBURU1QTEFURV9EUklWRU5fRElSRUNUSVZFUyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1JhZGlvQ29udHJvbFJlZ2lzdHJ5XSxcbiAgICAgICAgICAgIGV4cG9ydHM6IFvJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUsIFRFTVBMQVRFX0RSSVZFTl9ESVJFQ1RJVkVTXVxuICAgICAgICB9KVxuICAgIF0sIEZvcm1zTW9kdWxlKTtcbiAgICByZXR1cm4gRm9ybXNNb2R1bGU7XG59KCkpO1xuLyoqXG4gKiBFeHBvcnRzIHRoZSByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBhbmQgZGlyZWN0aXZlcyBmb3IgcmVhY3RpdmUgZm9ybXMsXG4gKiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIGltcG9ydCBieSBOZ01vZHVsZXMgdGhhdCBpbXBvcnQgdGhpcyBtb2R1bGUuXG4gKiBAc2VlIFtGb3Jtc10oZ3VpZGUvcmVhY3RpdmUtZm9ybXMpXG4gKlxuICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKC9ndWlkZS9yZWFjdGl2ZS1mb3JtcylcbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBSZWFjdGl2ZUZvcm1zTW9kdWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlYWN0aXZlRm9ybXNNb2R1bGUoKSB7XG4gICAgfVxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVfMSA9IFJlYWN0aXZlRm9ybXNNb2R1bGU7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogUHJvdmlkZXMgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHJlYWN0aXZlIGZvcm1zIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRzIEFuIG9iamVjdCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICAgKiAqIGB3YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sYCBDb25maWd1cmVzIHdoZW4gdG8gZW1pdCBhIHdhcm5pbmcgd2hlbiBhbiBgbmdNb2RlbGBcbiAgICAgKiBiaW5kaW5nIGlzIHVzZWQgd2l0aCByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZXMuXG4gICAgICovXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZS53aXRoQ29uZmlnID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBSZWFjdGl2ZUZvcm1zTW9kdWxlXzEsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFt7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBvcHRzLndhcm5Pbk5nTW9kZWxXaXRoRm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgIH07XG4gICAgdmFyIFJlYWN0aXZlRm9ybXNNb2R1bGVfMTtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlID0gUmVhY3RpdmVGb3Jtc01vZHVsZV8xID0gX19kZWNvcmF0ZShbXG4gICAgICAgIE5nTW9kdWxlKHtcbiAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1JFQUNUSVZFX0RSSVZFTl9ESVJFQ1RJVkVTXSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW0Zvcm1CdWlsZGVyLCBSYWRpb0NvbnRyb2xSZWdpc3RyeV0sXG4gICAgICAgICAgICBleHBvcnRzOiBbybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlLCBSRUFDVElWRV9EUklWRU5fRElSRUNUSVZFU11cbiAgICAgICAgfSlcbiAgICBdLCBSZWFjdGl2ZUZvcm1zTW9kdWxlKTtcbiAgICByZXR1cm4gUmVhY3RpdmVGb3Jtc01vZHVsZTtcbn0oKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gVGhpcyBmaWxlIG9ubHkgcmVleHBvcnRzIGNvbnRlbnQgb2YgdGhlIGBzcmNgIGZvbGRlci4gS2VlcCBpdCB0aGF0IHdheS5cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCB7IMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfZCwgybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlLCBSRUFDVElWRV9EUklWRU5fRElSRUNUSVZFUyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfYywgU0hBUkVEX0ZPUk1fRElSRUNUSVZFUyBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfYSwgVEVNUExBVEVfRFJJVkVOX0RJUkVDVElWRVMgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2IsIENIRUNLQk9YX1ZBTFVFX0FDQ0VTU09SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19lLCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19mLCBBYnN0cmFjdENvbnRyb2xTdGF0dXMgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2csIG5nQ29udHJvbFN0YXR1c0hvc3QgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2gsIGZvcm1EaXJlY3RpdmVQcm92aWRlciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfaSwgTkdfRk9STV9TRUxFQ1RPUl9XQVJOSU5HIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19qLCBmb3JtQ29udHJvbEJpbmRpbmcgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2ssIG1vZGVsR3JvdXBQcm92aWRlciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfbCwgybVOZ05vVmFsaWRhdGUgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3osIMm1TmdOb1ZhbGlkYXRlLCBOVU1CRVJfVkFMVUVfQUNDRVNTT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX20sIFJBRElPX1ZBTFVFX0FDQ0VTU09SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19uLCBSYWRpb0NvbnRyb2xSZWdpc3RyeSBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfbywgUkFOR0VfVkFMVUVfQUNDRVNTT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3AsIE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3EsIGZvcm1Db250cm9sQmluZGluZyQxIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19yLCBjb250cm9sTmFtZUJpbmRpbmcgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3MsIGZvcm1EaXJlY3RpdmVQcm92aWRlciQxIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc190LCBmb3JtQXJyYXlOYW1lUHJvdmlkZXIgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3YsIGZvcm1Hcm91cE5hbWVQcm92aWRlciBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfdSwgU0VMRUNUX1ZBTFVFX0FDQ0VTU09SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc193LCDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24gYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX3ksIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbiwgU0VMRUNUX01VTFRJUExFX1ZBTFVFX0FDQ0VTU09SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc194LCBDSEVDS0JPWF9SRVFVSVJFRF9WQUxJREFUT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2JiLCBFTUFJTF9WQUxJREFUT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2JjLCBNQVhfTEVOR1RIX1ZBTElEQVRPUiBhcyDJtWFuZ3VsYXJfcGFja2FnZXNfZm9ybXNfZm9ybXNfYmUsIE1JTl9MRU5HVEhfVkFMSURBVE9SIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19mb3Jtc19mb3Jtc19iZCwgUEFUVEVSTl9WQUxJREFUT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2JmLCBSRVFVSVJFRF9WQUxJREFUT1IgYXMgybVhbmd1bGFyX3BhY2thZ2VzX2Zvcm1zX2Zvcm1zX2JhLCBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUsIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlLCBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBDb250cm9sQ29udGFpbmVyLCBOR19WQUxVRV9BQ0NFU1NPUiwgQ09NUE9TSVRJT05fQlVGRkVSX01PREUsIERlZmF1bHRWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIE5nQ29udHJvbFN0YXR1cywgTmdDb250cm9sU3RhdHVzR3JvdXAsIE5nRm9ybSwgTmdGb3JtU2VsZWN0b3JXYXJuaW5nLCBOZ01vZGVsLCBOZ01vZGVsR3JvdXAsIE51bWJlclZhbHVlQWNjZXNzb3IsIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IsIFJhbmdlVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2xEaXJlY3RpdmUsIEZvcm1Db250cm9sTmFtZSwgRm9ybUdyb3VwRGlyZWN0aXZlLCBGb3JtQXJyYXlOYW1lLCBGb3JtR3JvdXBOYW1lLCBOZ1NlbGVjdE9wdGlvbiwgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IsIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IsIEVtYWlsVmFsaWRhdG9yLCBNYXhMZW5ndGhWYWxpZGF0b3IsIE1pbkxlbmd0aFZhbGlkYXRvciwgUGF0dGVyblZhbGlkYXRvciwgUmVxdWlyZWRWYWxpZGF0b3IsIEZvcm1CdWlsZGVyLCBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfQVNZTkNfVkFMSURBVE9SUywgTkdfVkFMSURBVE9SUywgVmFsaWRhdG9ycywgVkVSU0lPTiwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1zLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZSBBbmd1bGFyIHY4LjAuM1xuICogKGMpIDIwMTAtMjAxOSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vXG4gKiBMaWNlbnNlOiBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJZGVudGlmaWVycywgZ2V0VXJsU2NoZW1lLCBzeW50YXhFcnJvciwgUHJvdmlkZXJNZXRhLCBDb21waWxlUmVmbGVjdG9yLCBSZXNvdXJjZUxvYWRlciwgSml0U3VtbWFyeVJlc29sdmVyLCBTdW1tYXJ5UmVzb2x2ZXIsIExleGVyLCBQYXJzZXIsIEh0bWxQYXJzZXIsIEkxOE5IdG1sUGFyc2VyLCBDb21waWxlckNvbmZpZywgVGVtcGxhdGVQYXJzZXIsIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgSml0RXZhbHVhdG9yLCBEaXJlY3RpdmVOb3JtYWxpemVyLCBVcmxSZXNvbHZlciwgQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIsIE5nTW9kdWxlUmVzb2x2ZXIsIERpcmVjdGl2ZVJlc29sdmVyLCBQaXBlUmVzb2x2ZXIsIFN0YXRpY1N5bWJvbENhY2hlLCBTdHlsZUNvbXBpbGVyLCBWaWV3Q29tcGlsZXIsIE5nTW9kdWxlQ29tcGlsZXIsIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSwgSml0Q29tcGlsZXIgfSBmcm9tICdAYW5ndWxhci9jb21waWxlcic7XG5pbXBvcnQgeyBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTLCBFbGVtZW50UmVmLCBOZ01vZHVsZVJlZiwgVmlld0NvbnRhaW5lclJlZiwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFJlbmRlcmVyMiwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgybVDb2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudEZhY3RvcnksIENvbXBvbmVudFJlZiwgTmdNb2R1bGVGYWN0b3J5LCDJtWNtZiwgybVtb2QsIMm1bXBkLCDJtXJlZ2lzdGVyTW9kdWxlRmFjdG9yeSwgSW5qZWN0b3IsIFZpZXdFbmNhcHN1bGF0aW9uLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgU2VjdXJpdHlDb250ZXh0LCBMT0NBTEVfSUQsIFRSQU5TTEFUSU9OU19GT1JNQVQsIMm1aW5saW5lSW50ZXJwb2xhdGUsIMm1aW50ZXJwb2xhdGUsIMm1RU1QVFlfQVJSQVksIMm1RU1QVFlfTUFQLCBSZW5kZXJlciwgybV2aWQsIMm1ZWxkLCDJtWFuZCwgybV0ZWQsIMm1ZGlkLCDJtXByZCwgybVxdWQsIMm1cGFkLCDJtXBvZCwgybVwcGQsIMm1cGlkLCDJtW5vdiwgybVuY2QsIMm1dW52LCDJtWNydCwgybVjY2YsIMm1UmVmbGVjdGlvbkNhcGFiaWxpdGllcywgybVzdHJpbmdpZnksIEluamVjdGlvblRva2VuLCBDb21waWxlciwgybVDb25zb2xlLCBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneSwgT3B0aW9uYWwsIEluamVjdCwgVFJBTlNMQVRJT05TLCBQQUNLQUdFX1JPT1RfVVJMLCBpc0Rldk1vZGUsIGNyZWF0ZVBsYXRmb3JtRmFjdG9yeSwgcGxhdGZvcm1Db3JlLCBDT01QSUxFUl9PUFRJT05TLCBDb21waWxlckZhY3RvcnksIEluamVjdGFibGUsIFBMQVRGT1JNX0lELCDJtWdsb2JhbCwgVmVyc2lvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgX19zcHJlYWQsIF9fZXh0ZW5kcywgX19kZWNvcmF0ZSB9IGZyb20gJ3RzbGliJztcbmltcG9ydCB7IMm1UExBVEZPUk1fQlJPV1NFUl9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyDJtUlOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciBNT0RVTEVfU1VGRklYID0gJyc7XG52YXIgYnVpbHRpbkV4dGVybmFsUmVmZXJlbmNlcyA9IGNyZWF0ZUJ1aWx0aW5FeHRlcm5hbFJlZmVyZW5jZXNNYXAoKTtcbnZhciBKaXRSZWZsZWN0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSml0UmVmbGVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBuZXcgybVSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCk7XG4gICAgfVxuICAgIEppdFJlZmxlY3Rvci5wcm90b3R5cGUuY29tcG9uZW50TW9kdWxlVXJsID0gZnVuY3Rpb24gKHR5cGUsIGNtcE1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBtb2R1bGVJZCA9IGNtcE1ldGFkYXRhLm1vZHVsZUlkO1xuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZUlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIHNjaGVtZSA9IGdldFVybFNjaGVtZShtb2R1bGVJZCk7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1lID8gbW9kdWxlSWQgOiBcInBhY2thZ2U6XCIgKyBtb2R1bGVJZCArIE1PRFVMRV9TVUZGSVg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kdWxlSWQgIT09IG51bGwgJiYgbW9kdWxlSWQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgdGhyb3cgc3ludGF4RXJyb3IoXCJtb2R1bGVJZCBzaG91bGQgYmUgYSBzdHJpbmcgaW4gXFxcIlwiICsgybVzdHJpbmdpZnkodHlwZSkgKyBcIlxcXCIuIFNlZSBodHRwczovL2dvby5nbC93SUREaUwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXFxuXCIgK1xuICAgICAgICAgICAgICAgIFwiSWYgeW91J3JlIHVzaW5nIFdlYnBhY2sgeW91IHNob3VsZCBpbmxpbmUgdGhlIHRlbXBsYXRlIGFuZCB0aGUgc3R5bGVzLCBzZWUgaHR0cHM6Ly9nb28uZ2wvWDJKOHpjLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIuL1wiICsgybVzdHJpbmdpZnkodHlwZSk7XG4gICAgfTtcbiAgICBKaXRSZWZsZWN0b3IucHJvdG90eXBlLnBhcmFtZXRlcnMgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gICAgfTtcbiAgICBKaXRSZWZsZWN0b3IucHJvdG90eXBlLnRyeUFubm90YXRpb25zID0gZnVuY3Rpb24gKHR5cGVPckZ1bmMpIHsgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnModHlwZU9yRnVuYyk7IH07XG4gICAgSml0UmVmbGVjdG9yLnByb3RvdHlwZS5hbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuYW5ub3RhdGlvbnModHlwZU9yRnVuYyk7XG4gICAgfTtcbiAgICBKaXRSZWZsZWN0b3IucHJvdG90eXBlLnNoYWxsb3dBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICh0eXBlT3JGdW5jKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCBpbiBKSVQgbW9kZScpO1xuICAgIH07XG4gICAgSml0UmVmbGVjdG9yLnByb3RvdHlwZS5wcm9wTWV0YWRhdGEgPSBmdW5jdGlvbiAodHlwZU9yRnVuYykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnByb3BNZXRhZGF0YSh0eXBlT3JGdW5jKTtcbiAgICB9O1xuICAgIEppdFJlZmxlY3Rvci5wcm90b3R5cGUuaGFzTGlmZWN5Y2xlSG9vayA9IGZ1bmN0aW9uICh0eXBlLCBsY1Byb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBsY1Byb3BlcnR5KTtcbiAgICB9O1xuICAgIEppdFJlZmxlY3Rvci5wcm90b3R5cGUuZ3VhcmRzID0gZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5ndWFyZHModHlwZSk7IH07XG4gICAgSml0UmVmbGVjdG9yLnByb3RvdHlwZS5yZXNvbHZlRXh0ZXJuYWxSZWZlcmVuY2UgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgICAgIHJldHVybiBidWlsdGluRXh0ZXJuYWxSZWZlcmVuY2VzLmdldChyZWYpIHx8IHJlZi5ydW50aW1lO1xuICAgIH07XG4gICAgcmV0dXJuIEppdFJlZmxlY3Rvcjtcbn0oKSk7XG5mdW5jdGlvbiBjcmVhdGVCdWlsdGluRXh0ZXJuYWxSZWZlcmVuY2VzTWFwKCkge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5BTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTLCBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLkVsZW1lbnRSZWYsIEVsZW1lbnRSZWYpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuTmdNb2R1bGVSZWYsIE5nTW9kdWxlUmVmKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlZpZXdDb250YWluZXJSZWYsIFZpZXdDb250YWluZXJSZWYpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlJlbmRlcmVyMiwgUmVuZGVyZXIyKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlF1ZXJ5TGlzdCwgUXVlcnlMaXN0KTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlRlbXBsYXRlUmVmLCBUZW1wbGF0ZVJlZik7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5Db2RlZ2VuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCDJtUNvZGVnZW5Db21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuQ29tcG9uZW50RmFjdG9yeSwgQ29tcG9uZW50RmFjdG9yeSk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5Db21wb25lbnRSZWYsIENvbXBvbmVudFJlZik7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5OZ01vZHVsZUZhY3RvcnksIE5nTW9kdWxlRmFjdG9yeSk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5jcmVhdGVNb2R1bGVGYWN0b3J5LCDJtWNtZik7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5tb2R1bGVEZWYsIMm1bW9kKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLm1vZHVsZVByb3ZpZGVyRGVmLCDJtW1wZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5SZWdpc3Rlck1vZHVsZUZhY3RvcnlGbiwgybVyZWdpc3Rlck1vZHVsZUZhY3RvcnkpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuSW5qZWN0b3IsIEluamVjdG9yKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlZpZXdFbmNhcHN1bGF0aW9uLCBWaWV3RW5jYXBzdWxhdGlvbik7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5DaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuU2VjdXJpdHlDb250ZXh0LCBTZWN1cml0eUNvbnRleHQpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuTE9DQUxFX0lELCBMT0NBTEVfSUQpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMuVFJBTlNMQVRJT05TX0ZPUk1BVCwgVFJBTlNMQVRJT05TX0ZPUk1BVCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5pbmxpbmVJbnRlcnBvbGF0ZSwgybVpbmxpbmVJbnRlcnBvbGF0ZSk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5pbnRlcnBvbGF0ZSwgybVpbnRlcnBvbGF0ZSk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5FTVBUWV9BUlJBWSwgybVFTVBUWV9BUlJBWSk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5FTVBUWV9NQVAsIMm1RU1QVFlfTUFQKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLlJlbmRlcmVyLCBSZW5kZXJlcik7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy52aWV3RGVmLCDJtXZpZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5lbGVtZW50RGVmLCDJtWVsZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5hbmNob3JEZWYsIMm1YW5kKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLnRleHREZWYsIMm1dGVkKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLmRpcmVjdGl2ZURlZiwgybVkaWQpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMucHJvdmlkZXJEZWYsIMm1cHJkKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLnF1ZXJ5RGVmLCDJtXF1ZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5wdXJlQXJyYXlEZWYsIMm1cGFkKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLnB1cmVPYmplY3REZWYsIMm1cG9kKTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLnB1cmVQaXBlRGVmLCDJtXBwZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5waXBlRGVmLCDJtXBpZCk7XG4gICAgbWFwLnNldChJZGVudGlmaWVycy5ub2RlVmFsdWUsIMm1bm92KTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLm5nQ29udGVudERlZiwgybVuY2QpO1xuICAgIG1hcC5zZXQoSWRlbnRpZmllcnMudW53cmFwVmFsdWUsIMm1dW52KTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLmNyZWF0ZVJlbmRlcmVyVHlwZTIsIMm1Y3J0KTtcbiAgICBtYXAuc2V0KElkZW50aWZpZXJzLmNyZWF0ZUNvbXBvbmVudEZhY3RvcnksIMm1Y2NmKTtcbiAgICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG52YXIgRVJST1JfQ09MTEVDVE9SX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdFcnJvckNvbGxlY3RvcicpO1xuLyoqXG4gKiBBIGRlZmF1bHQgcHJvdmlkZXIgZm9yIHtAbGluayBQQUNLQUdFX1JPT1RfVVJMfSB0aGF0IG1hcHMgdG8gJy8nLlxuICovXG52YXIgREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUiA9IHtcbiAgICBwcm92aWRlOiBQQUNLQUdFX1JPT1RfVVJMLFxuICAgIHVzZVZhbHVlOiAnLydcbn07XG52YXIgX05PX1JFU09VUkNFX0xPQURFUiA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gUmVzb3VyY2VMb2FkZXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gcHJvdmlkZWQuIENhbid0IHJlYWQgdGhlIHVybCBcXFwiXCIgKyB1cmwgKyBcIlxcXCJcIik7XG4gICAgfVxufTtcbnZhciBiYXNlSHRtbFBhcnNlciA9IG5ldyBJbmplY3Rpb25Ub2tlbignSHRtbFBhcnNlcicpO1xudmFyIENvbXBpbGVySW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21waWxlckltcGwoaW5qZWN0b3IsIF9tZXRhZGF0YVJlc29sdmVyLCB0ZW1wbGF0ZVBhcnNlciwgc3R5bGVDb21waWxlciwgdmlld0NvbXBpbGVyLCBuZ01vZHVsZUNvbXBpbGVyLCBzdW1tYXJ5UmVzb2x2ZXIsIGNvbXBpbGVSZWZsZWN0b3IsIGppdEV2YWx1YXRvciwgY29tcGlsZXJDb25maWcsIGNvbnNvbGUpIHtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFSZXNvbHZlciA9IF9tZXRhZGF0YVJlc29sdmVyO1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IG5ldyBKaXRDb21waWxlcihfbWV0YWRhdGFSZXNvbHZlciwgdGVtcGxhdGVQYXJzZXIsIHN0eWxlQ29tcGlsZXIsIHZpZXdDb21waWxlciwgbmdNb2R1bGVDb21waWxlciwgc3VtbWFyeVJlc29sdmVyLCBjb21waWxlUmVmbGVjdG9yLCBqaXRFdmFsdWF0b3IsIGNvbXBpbGVyQ29uZmlnLCBjb25zb2xlLCB0aGlzLmdldEV4dHJhTmdNb2R1bGVQcm92aWRlcnMuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjtcbiAgICB9XG4gICAgQ29tcGlsZXJJbXBsLnByb3RvdHlwZS5nZXRFeHRyYU5nTW9kdWxlUHJvdmlkZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0UHJvdmlkZXJNZXRhZGF0YShuZXcgUHJvdmlkZXJNZXRhKENvbXBpbGVyLCB7IHVzZVZhbHVlOiB0aGlzIH0pKV07XG4gICAgfTtcbiAgICBDb21waWxlckltcGwucHJvdG90eXBlLmNvbXBpbGVNb2R1bGVTeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmNvbXBpbGVNb2R1bGVTeW5jKG1vZHVsZVR5cGUpO1xuICAgIH07XG4gICAgQ29tcGlsZXJJbXBsLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQXN5bmMgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY29tcGlsZU1vZHVsZUFzeW5jKG1vZHVsZVR5cGUpO1xuICAgIH07XG4gICAgQ29tcGlsZXJJbXBsLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVsZWdhdGUuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jKG1vZHVsZVR5cGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmdNb2R1bGVGYWN0b3J5OiByZXN1bHQubmdNb2R1bGVGYWN0b3J5LFxuICAgICAgICAgICAgY29tcG9uZW50RmFjdG9yaWVzOiByZXN1bHQuY29tcG9uZW50RmFjdG9yaWVzLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQ29tcGlsZXJJbXBsLnByb3RvdHlwZS5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jID0gZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmMobW9kdWxlVHlwZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsgcmV0dXJuICh7XG4gICAgICAgICAgICBuZ01vZHVsZUZhY3Rvcnk6IHJlc3VsdC5uZ01vZHVsZUZhY3RvcnksXG4gICAgICAgICAgICBjb21wb25lbnRGYWN0b3JpZXM6IHJlc3VsdC5jb21wb25lbnRGYWN0b3JpZXMsXG4gICAgICAgIH0pOyB9KTtcbiAgICB9O1xuICAgIENvbXBpbGVySW1wbC5wcm90b3R5cGUubG9hZEFvdFN1bW1hcmllcyA9IGZ1bmN0aW9uIChzdW1tYXJpZXMpIHsgdGhpcy5fZGVsZWdhdGUubG9hZEFvdFN1bW1hcmllcyhzdW1tYXJpZXMpOyB9O1xuICAgIENvbXBpbGVySW1wbC5wcm90b3R5cGUuaGFzQW90U3VtbWFyeSA9IGZ1bmN0aW9uIChyZWYpIHsgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmhhc0FvdFN1bW1hcnkocmVmKTsgfTtcbiAgICBDb21waWxlckltcGwucHJvdG90eXBlLmdldENvbXBvbmVudEZhY3RvcnkgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5nZXRDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG4gICAgfTtcbiAgICBDb21waWxlckltcGwucHJvdG90eXBlLmNsZWFyQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX2RlbGVnYXRlLmNsZWFyQ2FjaGUoKTsgfTtcbiAgICBDb21waWxlckltcGwucHJvdG90eXBlLmNsZWFyQ2FjaGVGb3IgPSBmdW5jdGlvbiAodHlwZSkgeyB0aGlzLl9kZWxlZ2F0ZS5jbGVhckNhY2hlRm9yKHR5cGUpOyB9O1xuICAgIENvbXBpbGVySW1wbC5wcm90b3R5cGUuZ2V0TW9kdWxlSWQgPSBmdW5jdGlvbiAobW9kdWxlVHlwZSkge1xuICAgICAgICB2YXIgbWV0YSA9IHRoaXMuX21ldGFkYXRhUmVzb2x2ZXIuZ2V0TmdNb2R1bGVNZXRhZGF0YShtb2R1bGVUeXBlKTtcbiAgICAgICAgcmV0dXJuIG1ldGEgJiYgbWV0YS5pZCB8fCB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcGlsZXJJbXBsO1xufSgpKTtcbi8qKlxuICogQSBzZXQgb2YgcHJvdmlkZXJzIHRoYXQgcHJvdmlkZSBgSml0Q29tcGlsZXJgIGFuZCBpdHMgZGVwZW5kZW5jaWVzIHRvIHVzZSBmb3JcbiAqIHRlbXBsYXRlIGNvbXBpbGF0aW9uLlxuICovXG52YXIgQ09NUElMRVJfUFJPVklERVJTID0gW1xuICAgIHsgcHJvdmlkZTogQ29tcGlsZVJlZmxlY3RvciwgdXNlVmFsdWU6IG5ldyBKaXRSZWZsZWN0b3IoKSB9LFxuICAgIHsgcHJvdmlkZTogUmVzb3VyY2VMb2FkZXIsIHVzZVZhbHVlOiBfTk9fUkVTT1VSQ0VfTE9BREVSIH0sXG4gICAgeyBwcm92aWRlOiBKaXRTdW1tYXJ5UmVzb2x2ZXIsIGRlcHM6IFtdIH0sXG4gICAgeyBwcm92aWRlOiBTdW1tYXJ5UmVzb2x2ZXIsIHVzZUV4aXN0aW5nOiBKaXRTdW1tYXJ5UmVzb2x2ZXIgfSxcbiAgICB7IHByb3ZpZGU6IMm1Q29uc29sZSwgZGVwczogW10gfSxcbiAgICB7IHByb3ZpZGU6IExleGVyLCBkZXBzOiBbXSB9LFxuICAgIHsgcHJvdmlkZTogUGFyc2VyLCBkZXBzOiBbTGV4ZXJdIH0sXG4gICAge1xuICAgICAgICBwcm92aWRlOiBiYXNlSHRtbFBhcnNlcixcbiAgICAgICAgdXNlQ2xhc3M6IEh0bWxQYXJzZXIsXG4gICAgICAgIGRlcHM6IFtdLFxuICAgIH0sXG4gICAge1xuICAgICAgICBwcm92aWRlOiBJMThOSHRtbFBhcnNlcixcbiAgICAgICAgdXNlRmFjdG9yeTogZnVuY3Rpb24gKHBhcnNlciwgdHJhbnNsYXRpb25zLCBmb3JtYXQsIGNvbmZpZywgY29uc29sZSkge1xuICAgICAgICAgICAgdHJhbnNsYXRpb25zID0gdHJhbnNsYXRpb25zIHx8ICcnO1xuICAgICAgICAgICAgdmFyIG1pc3NpbmdUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9ucyA/IGNvbmZpZy5taXNzaW5nVHJhbnNsYXRpb24gOiBNaXNzaW5nVHJhbnNsYXRpb25TdHJhdGVneS5JZ25vcmU7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEkxOE5IdG1sUGFyc2VyKHBhcnNlciwgdHJhbnNsYXRpb25zLCBmb3JtYXQsIG1pc3NpbmdUcmFuc2xhdGlvbiwgY29uc29sZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlcHM6IFtcbiAgICAgICAgICAgIGJhc2VIdG1sUGFyc2VyLFxuICAgICAgICAgICAgW25ldyBPcHRpb25hbCgpLCBuZXcgSW5qZWN0KFRSQU5TTEFUSU9OUyldLFxuICAgICAgICAgICAgW25ldyBPcHRpb25hbCgpLCBuZXcgSW5qZWN0KFRSQU5TTEFUSU9OU19GT1JNQVQpXSxcbiAgICAgICAgICAgIFtDb21waWxlckNvbmZpZ10sXG4gICAgICAgICAgICBbybVDb25zb2xlXSxcbiAgICAgICAgXVxuICAgIH0sXG4gICAge1xuICAgICAgICBwcm92aWRlOiBIdG1sUGFyc2VyLFxuICAgICAgICB1c2VFeGlzdGluZzogSTE4Tkh0bWxQYXJzZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIHByb3ZpZGU6IFRlbXBsYXRlUGFyc2VyLCBkZXBzOiBbQ29tcGlsZXJDb25maWcsIENvbXBpbGVSZWZsZWN0b3IsXG4gICAgICAgICAgICBQYXJzZXIsIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSxcbiAgICAgICAgICAgIEkxOE5IdG1sUGFyc2VyLCDJtUNvbnNvbGVdXG4gICAgfSxcbiAgICB7IHByb3ZpZGU6IEppdEV2YWx1YXRvciwgdXNlQ2xhc3M6IEppdEV2YWx1YXRvciwgZGVwczogW10gfSxcbiAgICB7IHByb3ZpZGU6IERpcmVjdGl2ZU5vcm1hbGl6ZXIsIGRlcHM6IFtSZXNvdXJjZUxvYWRlciwgVXJsUmVzb2x2ZXIsIEh0bWxQYXJzZXIsIENvbXBpbGVyQ29uZmlnXSB9LFxuICAgIHsgcHJvdmlkZTogQ29tcGlsZU1ldGFkYXRhUmVzb2x2ZXIsIGRlcHM6IFtDb21waWxlckNvbmZpZywgSHRtbFBhcnNlciwgTmdNb2R1bGVSZXNvbHZlcixcbiAgICAgICAgICAgIERpcmVjdGl2ZVJlc29sdmVyLCBQaXBlUmVzb2x2ZXIsXG4gICAgICAgICAgICBTdW1tYXJ5UmVzb2x2ZXIsXG4gICAgICAgICAgICBFbGVtZW50U2NoZW1hUmVnaXN0cnksXG4gICAgICAgICAgICBEaXJlY3RpdmVOb3JtYWxpemVyLCDJtUNvbnNvbGUsXG4gICAgICAgICAgICBbT3B0aW9uYWwsIFN0YXRpY1N5bWJvbENhY2hlXSxcbiAgICAgICAgICAgIENvbXBpbGVSZWZsZWN0b3IsXG4gICAgICAgICAgICBbT3B0aW9uYWwsIEVSUk9SX0NPTExFQ1RPUl9UT0tFTl1dIH0sXG4gICAgREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUixcbiAgICB7IHByb3ZpZGU6IFN0eWxlQ29tcGlsZXIsIGRlcHM6IFtVcmxSZXNvbHZlcl0gfSxcbiAgICB7IHByb3ZpZGU6IFZpZXdDb21waWxlciwgZGVwczogW0NvbXBpbGVSZWZsZWN0b3JdIH0sXG4gICAgeyBwcm92aWRlOiBOZ01vZHVsZUNvbXBpbGVyLCBkZXBzOiBbQ29tcGlsZVJlZmxlY3Rvcl0gfSxcbiAgICB7IHByb3ZpZGU6IENvbXBpbGVyQ29uZmlnLCB1c2VWYWx1ZTogbmV3IENvbXBpbGVyQ29uZmlnKCkgfSxcbiAgICB7IHByb3ZpZGU6IENvbXBpbGVyLCB1c2VDbGFzczogQ29tcGlsZXJJbXBsLCBkZXBzOiBbSW5qZWN0b3IsIENvbXBpbGVNZXRhZGF0YVJlc29sdmVyLFxuICAgICAgICAgICAgVGVtcGxhdGVQYXJzZXIsIFN0eWxlQ29tcGlsZXIsXG4gICAgICAgICAgICBWaWV3Q29tcGlsZXIsIE5nTW9kdWxlQ29tcGlsZXIsXG4gICAgICAgICAgICBTdW1tYXJ5UmVzb2x2ZXIsIENvbXBpbGVSZWZsZWN0b3IsIEppdEV2YWx1YXRvciwgQ29tcGlsZXJDb25maWcsXG4gICAgICAgICAgICDJtUNvbnNvbGVdIH0sXG4gICAgeyBwcm92aWRlOiBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnksIGRlcHM6IFtdIH0sXG4gICAgeyBwcm92aWRlOiBFbGVtZW50U2NoZW1hUmVnaXN0cnksIHVzZUV4aXN0aW5nOiBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkgfSxcbiAgICB7IHByb3ZpZGU6IFVybFJlc29sdmVyLCBkZXBzOiBbUEFDS0FHRV9ST09UX1VSTF0gfSxcbiAgICB7IHByb3ZpZGU6IERpcmVjdGl2ZVJlc29sdmVyLCBkZXBzOiBbQ29tcGlsZVJlZmxlY3Rvcl0gfSxcbiAgICB7IHByb3ZpZGU6IFBpcGVSZXNvbHZlciwgZGVwczogW0NvbXBpbGVSZWZsZWN0b3JdIH0sXG4gICAgeyBwcm92aWRlOiBOZ01vZHVsZVJlc29sdmVyLCBkZXBzOiBbQ29tcGlsZVJlZmxlY3Rvcl0gfSxcbl07XG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xudmFyIEppdENvbXBpbGVyRmFjdG9yeSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKiBAaW50ZXJuYWwgKi9cbiAgICBmdW5jdGlvbiBKaXRDb21waWxlckZhY3RvcnkoZGVmYXVsdE9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHVzZUppdDogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgICAgICAgICAgIG1pc3NpbmdUcmFuc2xhdGlvbjogTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3kuV2FybmluZyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdE9wdGlvbnMgPSBfX3NwcmVhZChbY29tcGlsZXJPcHRpb25zXSwgZGVmYXVsdE9wdGlvbnMpO1xuICAgIH1cbiAgICBKaXRDb21waWxlckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZUNvbXBpbGVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0gW107IH1cbiAgICAgICAgdmFyIG9wdHMgPSBfbWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLmNvbmNhdChvcHRpb25zKSk7XG4gICAgICAgIHZhciBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZShbXG4gICAgICAgICAgICBDT01QSUxFUl9QUk9WSURFUlMsIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlOiBDb21waWxlckNvbmZpZyxcbiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZXJDb25maWcoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGV4cGxpY2l0IHZhbHVlcyBmcm9tIHRoZSBjb21waWxlciBvcHRpb25zIG92ZXJ3cml0ZSBvcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBhcHAgcHJvdmlkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VKaXQ6IG9wdHMudXNlSml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaml0RGV2TW9kZTogaXNEZXZNb2RlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgZXhwbGljaXQgdmFsdWVzIGZyb20gdGhlIGNvbXBpbGVyIG9wdGlvbnMgb3ZlcndyaXRlIG9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGFwcCBwcm92aWRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBvcHRzLmRlZmF1bHRFbmNhcHN1bGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1RyYW5zbGF0aW9uOiBvcHRzLm1pc3NpbmdUcmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IG9wdHMucHJlc2VydmVXaGl0ZXNwYWNlcyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXBzOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdHMucHJvdmlkZXJzXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KENvbXBpbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBKaXRDb21waWxlckZhY3Rvcnk7XG59KCkpO1xuZnVuY3Rpb24gX21lcmdlT3B0aW9ucyhvcHRpb25zQXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlSml0OiBfbGFzdERlZmluZWQob3B0aW9uc0Fyci5tYXAoZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIG9wdGlvbnMudXNlSml0OyB9KSksXG4gICAgICAgIGRlZmF1bHRFbmNhcHN1bGF0aW9uOiBfbGFzdERlZmluZWQob3B0aW9uc0Fyci5tYXAoZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIG9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb247IH0pKSxcbiAgICAgICAgcHJvdmlkZXJzOiBfbWVyZ2VBcnJheXMob3B0aW9uc0Fyci5tYXAoZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIG9wdGlvbnMucHJvdmlkZXJzOyB9KSksXG4gICAgICAgIG1pc3NpbmdUcmFuc2xhdGlvbjogX2xhc3REZWZpbmVkKG9wdGlvbnNBcnIubWFwKGZ1bmN0aW9uIChvcHRpb25zKSB7IHJldHVybiBvcHRpb25zLm1pc3NpbmdUcmFuc2xhdGlvbjsgfSkpLFxuICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBfbGFzdERlZmluZWQob3B0aW9uc0Fyci5tYXAoZnVuY3Rpb24gKG9wdGlvbnMpIHsgcmV0dXJuIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlczsgfSkpLFxuICAgIH07XG59XG5mdW5jdGlvbiBfbGFzdERlZmluZWQoYXJncykge1xuICAgIGZvciAodmFyIGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChhcmdzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBfbWVyZ2VBcnJheXMocGFydHMpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCkgeyByZXR1cm4gcGFydCAmJiByZXN1bHQucHVzaC5hcHBseShyZXN1bHQsIF9fc3ByZWFkKHBhcnQpKTsgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xudmFyIMm1MCA9IHt9O1xuLyoqXG4gKiBBIHBsYXRmb3JtIHRoYXQgaW5jbHVkZWQgY29yZVBsYXRmb3JtIGFuZCB0aGUgY29tcGlsZXIuXG4gKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgcGxhdGZvcm1Db3JlRHluYW1pYyA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShwbGF0Zm9ybUNvcmUsICdjb3JlRHluYW1pYycsIFtcbiAgICB7IHByb3ZpZGU6IENPTVBJTEVSX09QVElPTlMsIHVzZVZhbHVlOiDJtTAsIG11bHRpOiB0cnVlIH0sXG4gICAgeyBwcm92aWRlOiBDb21waWxlckZhY3RvcnksIHVzZUNsYXNzOiBKaXRDb21waWxlckZhY3RvcnksIGRlcHM6IFtDT01QSUxFUl9PUFRJT05TXSB9LFxuXSk7XG5cbnZhciBSZXNvdXJjZUxvYWRlckltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlc291cmNlTG9hZGVySW1wbCwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZXNvdXJjZUxvYWRlckltcGwoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgUmVzb3VyY2VMb2FkZXJJbXBsLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciByZXNvbHZlO1xuICAgICAgICB2YXIgcmVqZWN0O1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXMsIHJlaikge1xuICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgIHJlamVjdCA9IHJlajtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KVxuICAgICAgICAgICAgLy8gcmVzcG9uc2UvcmVzcG9uc2VUeXBlIHByb3BlcnRpZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFJlc291cmNlTG9hZGVyIExldmVsMiBzcGVjIChzdXBwb3J0ZWRcbiAgICAgICAgICAgIC8vIGJ5IElFMTApXG4gICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB4aHIucmVzcG9uc2UgfHwgeGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKVxuICAgICAgICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgLy8gZml4IHN0YXR1cyBjb2RlIHdoZW4gaXQgaXMgMCAoMCBzdGF0dXMgaXMgdW5kb2N1bWVudGVkKS5cbiAgICAgICAgICAgIC8vIE9jY3VycyB3aGVuIGFjY2Vzc2luZyBmaWxlIHJlc291cmNlcyBvciBvbiBBbmRyb2lkIDQuMSBzdG9jayBicm93c2VyXG4gICAgICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2UgPyAyMDAgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDIwMCA8PSBzdGF0dXMgJiYgc3RhdHVzIDw9IDMwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmVqZWN0KFwiRmFpbGVkIHRvIGxvYWQgXCIgKyB1cmwpOyB9O1xuICAgICAgICB4aHIuc2VuZCgpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuICAgIFJlc291cmNlTG9hZGVySW1wbCA9IF9fZGVjb3JhdGUoW1xuICAgICAgICBJbmplY3RhYmxlKClcbiAgICBdLCBSZXNvdXJjZUxvYWRlckltcGwpO1xuICAgIHJldHVybiBSZXNvdXJjZUxvYWRlckltcGw7XG59KFJlc291cmNlTG9hZGVyKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbnZhciDJtTAkMSA9IHsgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBSZXNvdXJjZUxvYWRlciwgdXNlQ2xhc3M6IFJlc291cmNlTG9hZGVySW1wbCwgZGVwczogW10gfV0gfSwgybUxID0gybVQTEFURk9STV9CUk9XU0VSX0lEO1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBJTlRFUk5BTF9CUk9XU0VSX0RZTkFNSUNfUExBVEZPUk1fUFJPVklERVJTID0gW1xuICAgIMm1SU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlMsXG4gICAge1xuICAgICAgICBwcm92aWRlOiBDT01QSUxFUl9PUFRJT05TLFxuICAgICAgICB1c2VWYWx1ZTogybUwJDEsXG4gICAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7IHByb3ZpZGU6IFBMQVRGT1JNX0lELCB1c2VWYWx1ZTogybUxIH0sXG5dO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFJlc291cmNlTG9hZGVyIHRoYXQgdXNlcyBhIHRlbXBsYXRlIGNhY2hlIHRvIGF2b2lkIGRvaW5nIGFuIGFjdHVhbFxuICogUmVzb3VyY2VMb2FkZXIuXG4gKlxuICogVGhlIHRlbXBsYXRlIGNhY2hlIG5lZWRzIHRvIGJlIGJ1aWx0IGFuZCBsb2FkZWQgaW50byB3aW5kb3cuJHRlbXBsYXRlQ2FjaGVcbiAqIHZpYSBhIHNlcGFyYXRlIG1lY2hhbmlzbS5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBDYWNoZWRSZXNvdXJjZUxvYWRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2FjaGVkUmVzb3VyY2VMb2FkZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2FjaGVkUmVzb3VyY2VMb2FkZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9jYWNoZSA9IMm1Z2xvYmFsLiR0ZW1wbGF0ZUNhY2hlO1xuICAgICAgICBpZiAoX3RoaXMuX2NhY2hlID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGVkUmVzb3VyY2VMb2FkZXI6IFRlbXBsYXRlIGNhY2hlIHdhcyBub3QgZm91bmQgaW4gJHRlbXBsYXRlQ2FjaGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDYWNoZWRSZXNvdXJjZUxvYWRlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHVybCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGUuaGFzT3duUHJvcGVydHkodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9jYWNoZVt1cmxdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ2FjaGVkUmVzb3VyY2VMb2FkZXI6IERpZCBub3QgZmluZCBjYWNoZWQgdGVtcGxhdGUgZm9yICcgKyB1cmwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2FjaGVkUmVzb3VyY2VMb2FkZXI7XG59KFJlc291cmNlTG9hZGVyKSk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbnZhciBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzguMC4zJyk7XG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgUkVTT1VSQ0VfQ0FDSEVfUFJPVklERVIgPSBbeyBwcm92aWRlOiBSZXNvdXJjZUxvYWRlciwgdXNlQ2xhc3M6IENhY2hlZFJlc291cmNlTG9hZGVyLCBkZXBzOiBbXSB9XTtcbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG52YXIgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShwbGF0Zm9ybUNvcmVEeW5hbWljLCAnYnJvd3NlckR5bmFtaWMnLCBJTlRFUk5BTF9CUk9XU0VSX0RZTkFNSUNfUExBVEZPUk1fUFJPVklERVJTKTtcblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuLy8gVGhpcyBmaWxlIG9ubHkgcmVleHBvcnRzIGNvbnRlbnQgb2YgdGhlIGBzcmNgIGZvbGRlci4gS2VlcCBpdCB0aGF0IHdheS5cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCB7IENhY2hlZFJlc291cmNlTG9hZGVyIGFzIMm1YW5ndWxhcl9wYWNrYWdlc19wbGF0Zm9ybV9icm93c2VyX2R5bmFtaWNfcGxhdGZvcm1fYnJvd3Nlcl9keW5hbWljX2EsIFJFU09VUkNFX0NBQ0hFX1BST1ZJREVSLCBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljLCBWRVJTSU9OLCBKaXRDb21waWxlckZhY3RvcnksIENvbXBpbGVySW1wbCBhcyDJtUNvbXBpbGVySW1wbCwgcGxhdGZvcm1Db3JlRHluYW1pYyBhcyDJtXBsYXRmb3JtQ29yZUR5bmFtaWMsIElOVEVSTkFMX0JST1dTRVJfRFlOQU1JQ19QTEFURk9STV9QUk9WSURFUlMgYXMgybVJTlRFUk5BTF9CUk9XU0VSX0RZTkFNSUNfUExBVEZPUk1fUFJPVklERVJTLCBSZXNvdXJjZUxvYWRlckltcGwgYXMgybVSZXNvdXJjZUxvYWRlckltcGwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsYXRmb3JtLWJyb3dzZXItZHluYW1pYy5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX29ic2VydmFibGVfZW1wdHksX29ic2VydmFibGVfb2YsX29ic2VydmFibGVfdGhyb3dFcnJvciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4vb2JzZXJ2YWJsZS9lbXB0eSc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJy4vb2JzZXJ2YWJsZS9vZic7XG5pbXBvcnQgeyB0aHJvd0Vycm9yIH0gZnJvbSAnLi9vYnNlcnZhYmxlL3Rocm93RXJyb3InO1xuZXhwb3J0IHZhciBOb3RpZmljYXRpb25LaW5kO1xuLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKE5vdGlmaWNhdGlvbktpbmQpIHtcbiAgICBOb3RpZmljYXRpb25LaW5kW1wiTkVYVFwiXSA9IFwiTlwiO1xuICAgIE5vdGlmaWNhdGlvbktpbmRbXCJFUlJPUlwiXSA9IFwiRVwiO1xuICAgIE5vdGlmaWNhdGlvbktpbmRbXCJDT01QTEVURVwiXSA9IFwiQ1wiO1xufSkoTm90aWZpY2F0aW9uS2luZCB8fCAoTm90aWZpY2F0aW9uS2luZCA9IHt9KSk7XG52YXIgTm90aWZpY2F0aW9uID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vdGlmaWNhdGlvbihraW5kLCB2YWx1ZSwgZXJyb3IpIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgICAgIHRoaXMuaGFzVmFsdWUgPSBraW5kID09PSBcIk5cIjtcbiAgICB9XG4gICAgTm90aWZpY2F0aW9uLnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiTlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0ICYmIG9ic2VydmVyLm5leHQodGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIFwiRVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvciAmJiBvYnNlcnZlci5lcnJvcih0aGlzLmVycm9yKTtcbiAgICAgICAgICAgIGNhc2UgXCJDXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlICYmIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUuZG8gPSBmdW5jdGlvbiAobmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgICAgIHZhciBraW5kID0gdGhpcy5raW5kO1xuICAgICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJOXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQgJiYgbmV4dCh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yICYmIGVycm9yKHRoaXMuZXJyb3IpO1xuICAgICAgICAgICAgY2FzZSBcIkNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGUgJiYgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTm90aWZpY2F0aW9uLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICBpZiAobmV4dE9yT2JzZXJ2ZXIgJiYgdHlwZW9mIG5leHRPck9ic2VydmVyLm5leHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmUobmV4dE9yT2JzZXJ2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG8obmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vdGlmaWNhdGlvbi5wcm90b3R5cGUudG9PYnNlcnZhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2luZCA9IHRoaXMua2luZDtcbiAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiTlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgXCJFXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lcnJvcik7XG4gICAgICAgICAgICBjYXNlIFwiQ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBub3RpZmljYXRpb24ga2luZCB2YWx1ZScpO1xuICAgIH07XG4gICAgTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uKFwiTlwiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbi51bmRlZmluZWRWYWx1ZU5vdGlmaWNhdGlvbjtcbiAgICB9O1xuICAgIE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24oXCJFXCIsIHVuZGVmaW5lZCwgZXJyKTtcbiAgICB9O1xuICAgIE5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbi5jb21wbGV0ZU5vdGlmaWNhdGlvbjtcbiAgICB9O1xuICAgIE5vdGlmaWNhdGlvbi5jb21wbGV0ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oXCJDXCIpO1xuICAgIE5vdGlmaWNhdGlvbi51bmRlZmluZWRWYWx1ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oXCJOXCIsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIE5vdGlmaWNhdGlvbjtcbn0oKSk7XG5leHBvcnQgeyBOb3RpZmljYXRpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vdGlmaWNhdGlvbi5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX0FzeW5jQWN0aW9uIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBc3luY0FjdGlvbiB9IGZyb20gJy4vQXN5bmNBY3Rpb24nO1xudmFyIFF1ZXVlQWN0aW9uID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFF1ZXVlQWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFF1ZXVlQWN0aW9uKHNjaGVkdWxlciwgd29yaykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2hlZHVsZXIsIHdvcmspIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgX3RoaXMud29yayA9IHdvcms7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUXVldWVBY3Rpb24ucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHN0YXRlLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZGVsYXkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcywgc3RhdGUsIGRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIuZmx1c2godGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgUXVldWVBY3Rpb24ucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIHJldHVybiAoZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkKSA/XG4gICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmV4ZWN1dGUuY2FsbCh0aGlzLCBzdGF0ZSwgZGVsYXkpIDpcbiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTtcbiAgICB9O1xuICAgIFF1ZXVlQWN0aW9uLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZCA9IGZ1bmN0aW9uIChzY2hlZHVsZXIsIGlkLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZGVsYXkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB8fCAoZGVsYXkgPT09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApKSB7XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZC5jYWxsKHRoaXMsIHNjaGVkdWxlciwgaWQsIGRlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZWR1bGVyLmZsdXNoKHRoaXMpO1xuICAgIH07XG4gICAgcmV0dXJuIFF1ZXVlQWN0aW9uO1xufShBc3luY0FjdGlvbikpO1xuZXhwb3J0IHsgUXVldWVBY3Rpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXVlQWN0aW9uLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfQWN0aW9uIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuL0FjdGlvbic7XG52YXIgQXN5bmNBY3Rpb24gPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQXN5bmNBY3Rpb24sIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXN5bmNBY3Rpb24oc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHNjaGVkdWxlciwgd29yaykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICAgICAgX3RoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGRlbGF5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQgfHwgdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBBc3luY0FjdGlvbi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQgPSBmdW5jdGlvbiAoc2NoZWR1bGVyLCBpZCwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGRlbGF5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkpO1xuICAgIH07XG4gICAgQXN5bmNBY3Rpb24ucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkID0gZnVuY3Rpb24gKHNjaGVkdWxlciwgaWQsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBkZWxheSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlbGF5ICE9PSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5ICYmIHRoaXMucGVuZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgICAgICBjbGVhckludGVydmFsKGlkKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEFzeW5jQWN0aW9uLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKHN0YXRlLCBkZWxheSkge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2V4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBBc3luY0FjdGlvbi5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIHZhciBlcnJvcmVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlcnJvclZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53b3JrKHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZXJyb3JlZCA9IHRydWU7XG4gICAgICAgICAgICBlcnJvclZhbHVlID0gISFlICYmIGUgfHwgbmV3IEVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvcmVkKSB7XG4gICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JWYWx1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXN5bmNBY3Rpb24ucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgICAgICB2YXIgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zO1xuICAgICAgICB2YXIgaW5kZXggPSBhY3Rpb25zLmluZGV4T2YodGhpcyk7XG4gICAgICAgIHRoaXMud29yayA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBudWxsO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIEFzeW5jQWN0aW9uO1xufShBY3Rpb24pKTtcbmV4cG9ydCB7IEFzeW5jQWN0aW9uIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY0FjdGlvbi5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YnNjcmlwdGlvbiBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vU3Vic2NyaXB0aW9uJztcbnZhciBBY3Rpb24gPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQWN0aW9uLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFjdGlvbihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgfVxuICAgIEFjdGlvbi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAoc3RhdGUsIGRlbGF5KSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBkZWxheSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gQWN0aW9uO1xufShTdWJzY3JpcHRpb24pKTtcbmV4cG9ydCB7IEFjdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWN0aW9uLmpzLm1hcFxuIiwidmFyIFNjaGVkdWxlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTY2hlZHVsZXIoU2NoZWR1bGVyQWN0aW9uLCBub3cpIHtcbiAgICAgICAgaWYgKG5vdyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBub3cgPSBTY2hlZHVsZXIubm93O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuU2NoZWR1bGVyQWN0aW9uID0gU2NoZWR1bGVyQWN0aW9uO1xuICAgICAgICB0aGlzLm5vdyA9IG5vdztcbiAgICB9XG4gICAgU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICh3b3JrLCBkZWxheSwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGRlbGF5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMuU2NoZWR1bGVyQWN0aW9uKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7XG4gICAgfTtcbiAgICBTY2hlZHVsZXIubm93ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gRGF0ZS5ub3coKTsgfTtcbiAgICByZXR1cm4gU2NoZWR1bGVyO1xufSgpKTtcbmV4cG9ydCB7IFNjaGVkdWxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2NoZWR1bGVyLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfUXVldWVBY3Rpb24sX1F1ZXVlU2NoZWR1bGVyIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IFF1ZXVlQWN0aW9uIH0gZnJvbSAnLi9RdWV1ZUFjdGlvbic7XG5pbXBvcnQgeyBRdWV1ZVNjaGVkdWxlciB9IGZyb20gJy4vUXVldWVTY2hlZHVsZXInO1xuZXhwb3J0IHZhciBxdWV1ZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1ZXVlU2NoZWR1bGVyKFF1ZXVlQWN0aW9uKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXF1ZXVlLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfQXN5bmNTY2hlZHVsZXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IEFzeW5jU2NoZWR1bGVyIH0gZnJvbSAnLi9Bc3luY1NjaGVkdWxlcic7XG52YXIgUXVldWVTY2hlZHVsZXIgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUXVldWVTY2hlZHVsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUXVldWVTY2hlZHVsZXIoKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFF1ZXVlU2NoZWR1bGVyO1xufShBc3luY1NjaGVkdWxlcikpO1xuZXhwb3J0IHsgUXVldWVTY2hlZHVsZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVF1ZXVlU2NoZWR1bGVyLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU2NoZWR1bGVyIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTY2hlZHVsZXIgfSBmcm9tICcuLi9TY2hlZHVsZXInO1xudmFyIEFzeW5jU2NoZWR1bGVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKEFzeW5jU2NoZWR1bGVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyKFNjaGVkdWxlckFjdGlvbiwgbm93KSB7XG4gICAgICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgbm93ID0gU2NoZWR1bGVyLm5vdztcbiAgICAgICAgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBTY2hlZHVsZXJBY3Rpb24sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAmJiBBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAhPT0gX3RoaXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmFjdGlvbnMgPSBbXTtcbiAgICAgICAgX3RoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIF90aGlzLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBc3luY1NjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAod29yaywgZGVsYXksIHN0YXRlKSB7XG4gICAgICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBkZWxheSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICYmIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICE9PSB0aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUuc2NoZWR1bGUod29yaywgZGVsYXksIHN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnNjaGVkdWxlLmNhbGwodGhpcywgd29yaywgZGVsYXksIHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQXN5bmNTY2hlZHVsZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSk7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgd2hpbGUgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBBc3luY1NjaGVkdWxlcjtcbn0oU2NoZWR1bGVyKSk7XG5leHBvcnQgeyBBc3luY1NjaGVkdWxlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QXN5bmNTY2hlZHVsZXIuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIF91dGlsX2lzU2NoZWR1bGVyLF9mcm9tQXJyYXksX2VtcHR5LF9zY2FsYXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgaXNTY2hlZHVsZXIgfSBmcm9tICcuLi91dGlsL2lzU2NoZWR1bGVyJztcbmltcG9ydCB7IGZyb21BcnJheSB9IGZyb20gJy4vZnJvbUFycmF5JztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi9lbXB0eSc7XG5pbXBvcnQgeyBzY2FsYXIgfSBmcm9tICcuL3NjYWxhcic7XG5leHBvcnQgZnVuY3Rpb24gb2YoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBzY2hlZHVsZXIgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKGlzU2NoZWR1bGVyKHNjaGVkdWxlcikpIHtcbiAgICAgICAgYXJncy5wb3AoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNjaGVkdWxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICByZXR1cm4gZW1wdHkoc2NoZWR1bGVyKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlciA/IGZyb21BcnJheShhcmdzLCBzY2hlZHVsZXIpIDogc2NhbGFyKGFyZ3NbMF0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheShhcmdzLCBzY2hlZHVsZXIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9mLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfT2JzZXJ2YWJsZSBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi4vT2JzZXJ2YWJsZSc7XG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyKHZhbHVlKSB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICByZXN1bHQuX2lzU2NhbGFyID0gdHJ1ZTtcbiAgICByZXN1bHQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2NhbGFyLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfT2JzZXJ2YWJsZSBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi4vT2JzZXJ2YWJsZSc7XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvciwgc2NoZWR1bGVyKSB7XG4gICAgaWYgKCFzY2hlZHVsZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7IHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTsgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24gKHN1YnNjcmliZXIpIHsgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaCwgMCwgeyBlcnJvcjogZXJyb3IsIHN1YnNjcmliZXI6IHN1YnNjcmliZXIgfSk7IH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRpc3BhdGNoKF9hKSB7XG4gICAgdmFyIGVycm9yID0gX2EuZXJyb3IsIHN1YnNjcmliZXIgPSBfYS5zdWJzY3JpYmVyO1xuICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3dFcnJvci5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YnNjcmliZXIsX05vdGlmaWNhdGlvbiBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uJztcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheSkge1xuICAgIGlmIChkZWxheSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGRlbGF5ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9ic2VydmVPbk9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgT2JzZXJ2ZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkpO1xuICAgIH07XG59XG52YXIgT2JzZXJ2ZU9uT3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2ZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkge1xuICAgICAgICBpZiAoZGVsYXkgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgZGVsYXkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7XG4gICAgfVxuICAgIE9ic2VydmVPbk9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgT2JzZXJ2ZU9uU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNjaGVkdWxlciwgdGhpcy5kZWxheSkpO1xuICAgIH07XG4gICAgcmV0dXJuIE9ic2VydmVPbk9wZXJhdG9yO1xufSgpKTtcbmV4cG9ydCB7IE9ic2VydmVPbk9wZXJhdG9yIH07XG52YXIgT2JzZXJ2ZU9uU3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhPYnNlcnZlT25TdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9ic2VydmVPblN1YnNjcmliZXIoZGVzdGluYXRpb24sIHNjaGVkdWxlciwgZGVsYXkpIHtcbiAgICAgICAgaWYgKGRlbGF5ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGRlbGF5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgICAgICBfdGhpcy5kZWxheSA9IGRlbGF5O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9ic2VydmVPblN1YnNjcmliZXIuZGlzcGF0Y2ggPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHZhciBub3RpZmljYXRpb24gPSBhcmcubm90aWZpY2F0aW9uLCBkZXN0aW5hdGlvbiA9IGFyZy5kZXN0aW5hdGlvbjtcbiAgICAgICAgbm90aWZpY2F0aW9uLm9ic2VydmUoZGVzdGluYXRpb24pO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICBPYnNlcnZlT25TdWJzY3JpYmVyLnByb3RvdHlwZS5zY2hlZHVsZU1lc3NhZ2UgPSBmdW5jdGlvbiAobm90aWZpY2F0aW9uKSB7XG4gICAgICAgIHZhciBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247XG4gICAgICAgIGRlc3RpbmF0aW9uLmFkZCh0aGlzLnNjaGVkdWxlci5zY2hlZHVsZShPYnNlcnZlT25TdWJzY3JpYmVyLmRpc3BhdGNoLCB0aGlzLmRlbGF5LCBuZXcgT2JzZXJ2ZU9uTWVzc2FnZShub3RpZmljYXRpb24sIHRoaXMuZGVzdGluYXRpb24pKSk7XG4gICAgfTtcbiAgICBPYnNlcnZlT25TdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpO1xuICAgIH07XG4gICAgT2JzZXJ2ZU9uU3Vic2NyaWJlci5wcm90b3R5cGUuX2Vycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb24uY3JlYXRlRXJyb3IoZXJyKSk7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9O1xuICAgIE9ic2VydmVPblN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZU1lc3NhZ2UoTm90aWZpY2F0aW9uLmNyZWF0ZUNvbXBsZXRlKCkpO1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JzZXJ2ZU9uU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcikpO1xuZXhwb3J0IHsgT2JzZXJ2ZU9uU3Vic2NyaWJlciB9O1xudmFyIE9ic2VydmVPbk1lc3NhZ2UgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gT2JzZXJ2ZU9uTWVzc2FnZShub3RpZmljYXRpb24sIGRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgfVxuICAgIHJldHVybiBPYnNlcnZlT25NZXNzYWdlO1xufSgpKTtcbmV4cG9ydCB7IE9ic2VydmVPbk1lc3NhZ2UgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9ic2VydmVPbi5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YmplY3QsX3NjaGVkdWxlcl9xdWV1ZSxfU3Vic2NyaXB0aW9uLF9vcGVyYXRvcnNfb2JzZXJ2ZU9uLF91dGlsX09iamVjdFVuc3Vic2NyaWJlZEVycm9yLF9TdWJqZWN0U3Vic2NyaXB0aW9uIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAnLi9TdWJqZWN0JztcbmltcG9ydCB7IHF1ZXVlIH0gZnJvbSAnLi9zY2hlZHVsZXIvcXVldWUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi9TdWJzY3JpcHRpb24nO1xuaW1wb3J0IHsgT2JzZXJ2ZU9uU3Vic2NyaWJlciB9IGZyb20gJy4vb3BlcmF0b3JzL29ic2VydmVPbic7XG5pbXBvcnQgeyBPYmplY3RVbnN1YnNjcmliZWRFcnJvciB9IGZyb20gJy4vdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvcic7XG5pbXBvcnQgeyBTdWJqZWN0U3Vic2NyaXB0aW9uIH0gZnJvbSAnLi9TdWJqZWN0U3Vic2NyaXB0aW9uJztcbnZhciBSZXBsYXlTdWJqZWN0ID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFJlcGxheVN1YmplY3QsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVwbGF5U3ViamVjdChidWZmZXJTaXplLCB3aW5kb3dUaW1lLCBzY2hlZHVsZXIpIHtcbiAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2luZG93VGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB3aW5kb3dUaW1lID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICB9XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICAgICAgX3RoaXMuX2V2ZW50cyA9IFtdO1xuICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gZmFsc2U7XG4gICAgICAgIF90aGlzLl9idWZmZXJTaXplID0gYnVmZmVyU2l6ZSA8IDEgPyAxIDogYnVmZmVyU2l6ZTtcbiAgICAgICAgX3RoaXMuX3dpbmRvd1RpbWUgPSB3aW5kb3dUaW1lIDwgMSA/IDEgOiB3aW5kb3dUaW1lO1xuICAgICAgICBpZiAod2luZG93VGltZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAgICAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIF90aGlzLm5leHQgPSBfdGhpcy5uZXh0SW5maW5pdGVUaW1lV2luZG93O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMubmV4dCA9IF90aGlzLm5leHRUaW1lV2luZG93O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVwbGF5U3ViamVjdC5wcm90b3R5cGUubmV4dEluZmluaXRlVGltZVdpbmRvdyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgX2V2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgICAgX2V2ZW50cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgaWYgKF9ldmVudHMubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgX2V2ZW50cy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9O1xuICAgIFJlcGxheVN1YmplY3QucHJvdG90eXBlLm5leHRUaW1lV2luZG93ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cy5wdXNoKG5ldyBSZXBsYXlFdmVudCh0aGlzLl9nZXROb3coKSwgdmFsdWUpKTtcbiAgICAgICAgdGhpcy5fdHJpbUJ1ZmZlclRoZW5HZXRFdmVudHMoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgIH07XG4gICAgUmVwbGF5U3ViamVjdC5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHZhciBfaW5maW5pdGVUaW1lV2luZG93ID0gdGhpcy5faW5maW5pdGVUaW1lV2luZG93O1xuICAgICAgICB2YXIgX2V2ZW50cyA9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyB0aGlzLl9ldmVudHMgOiB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpO1xuICAgICAgICB2YXIgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7XG4gICAgICAgIHZhciBsZW4gPSBfZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YmplY3RTdWJzY3JpcHRpb24odGhpcywgc3Vic2NyaWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVkdWxlcikge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5hZGQoc3Vic2NyaWJlciA9IG5ldyBPYnNlcnZlT25TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHNjaGVkdWxlcikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfaW5maW5pdGVUaW1lV2luZG93KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbiAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KF9ldmVudHNbaV0udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRoaXMudGhyb3duRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9O1xuICAgIFJlcGxheVN1YmplY3QucHJvdG90eXBlLl9nZXROb3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zY2hlZHVsZXIgfHwgcXVldWUpLm5vdygpO1xuICAgIH07XG4gICAgUmVwbGF5U3ViamVjdC5wcm90b3R5cGUuX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm93ID0gdGhpcy5fZ2V0Tm93KCk7XG4gICAgICAgIHZhciBfYnVmZmVyU2l6ZSA9IHRoaXMuX2J1ZmZlclNpemU7XG4gICAgICAgIHZhciBfd2luZG93VGltZSA9IHRoaXMuX3dpbmRvd1RpbWU7XG4gICAgICAgIHZhciBfZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgICB2YXIgZXZlbnRzQ291bnQgPSBfZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIHNwbGljZUNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKHNwbGljZUNvdW50IDwgZXZlbnRzQ291bnQpIHtcbiAgICAgICAgICAgIGlmICgobm93IC0gX2V2ZW50c1tzcGxpY2VDb3VudF0udGltZSkgPCBfd2luZG93VGltZSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BsaWNlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRzQ291bnQgPiBfYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgc3BsaWNlQ291bnQgPSBNYXRoLm1heChzcGxpY2VDb3VudCwgZXZlbnRzQ291bnQgLSBfYnVmZmVyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwbGljZUNvdW50ID4gMCkge1xuICAgICAgICAgICAgX2V2ZW50cy5zcGxpY2UoMCwgc3BsaWNlQ291bnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfZXZlbnRzO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcGxheVN1YmplY3Q7XG59KFN1YmplY3QpKTtcbmV4cG9ydCB7IFJlcGxheVN1YmplY3QgfTtcbnZhciBSZXBsYXlFdmVudCA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXBsYXlFdmVudCh0aW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBSZXBsYXlFdmVudDtcbn0oKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXBsYXlTdWJqZWN0LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCAgUFVSRV9JTVBPUlRTX0VORCAqL1xuZnVuY3Rpb24gRW1wdHlFcnJvckltcGwoKSB7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSAnbm8gZWxlbWVudHMgaW4gc2VxdWVuY2UnO1xuICAgIHRoaXMubmFtZSA9ICdFbXB0eUVycm9yJztcbiAgICByZXR1cm4gdGhpcztcbn1cbkVtcHR5RXJyb3JJbXBsLnByb3RvdHlwZSA9IC8qQF9fUFVSRV9fKi8gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuZXhwb3J0IHZhciBFbXB0eUVycm9yID0gRW1wdHlFcnJvckltcGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbXB0eUVycm9yLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU3Vic2NyaWJlciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZmlsdGVyT3BlcmF0b3JGdW5jdGlvbihzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBGaWx0ZXJPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXNBcmcpKTtcbiAgICB9O1xufVxudmFyIEZpbHRlck9wZXJhdG9yID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpbHRlck9wZXJhdG9yKHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZztcbiAgICB9XG4gICAgRmlsdGVyT3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBGaWx0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnRoaXNBcmcpKTtcbiAgICB9O1xuICAgIHJldHVybiBGaWx0ZXJPcGVyYXRvcjtcbn0oKSk7XG52YXIgRmlsdGVyU3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhGaWx0ZXJTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEZpbHRlclN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICBfdGhpcy50aGlzQXJnID0gdGhpc0FyZztcbiAgICAgICAgX3RoaXMuY291bnQgPSAwO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEZpbHRlclN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuY291bnQrKyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBGaWx0ZXJTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWx0ZXIuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUICBQVVJFX0lNUE9SVFNfRU5EICovXG5mdW5jdGlvbiBBcmd1bWVudE91dE9mUmFuZ2VFcnJvckltcGwoKSB7XG4gICAgRXJyb3IuY2FsbCh0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSAnYXJndW1lbnQgb3V0IG9mIHJhbmdlJztcbiAgICB0aGlzLm5hbWUgPSAnQXJndW1lbnRPdXRPZlJhbmdlRXJyb3InO1xuICAgIHJldHVybiB0aGlzO1xufVxuQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsLnByb3RvdHlwZSA9IC8qQF9fUFVSRV9fKi8gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO1xuZXhwb3J0IHZhciBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCB0c2xpYixfU3Vic2NyaWJlcixfdXRpbF9Bcmd1bWVudE91dE9mUmFuZ2VFcnJvcixfb2JzZXJ2YWJsZV9lbXB0eSBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgKiBhcyB0c2xpYl8xIGZyb20gXCJ0c2xpYlwiO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuaW1wb3J0IHsgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3IgfSBmcm9tICcuLi91dGlsL0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vb2JzZXJ2YWJsZS9lbXB0eSc7XG5leHBvcnQgZnVuY3Rpb24gdGFrZShjb3VudCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IFRha2VPcGVyYXRvcihjb3VudCkpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbnZhciBUYWtlT3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGFrZU9wZXJhdG9yKHRvdGFsKSB7XG4gICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDtcbiAgICAgICAgaWYgKHRoaXMudG90YWwgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVGFrZU9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFrZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy50b3RhbCkpO1xuICAgIH07XG4gICAgcmV0dXJuIFRha2VPcGVyYXRvcjtcbn0oKSk7XG52YXIgVGFrZVN1YnNjcmliZXIgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoVGFrZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGFrZVN1YnNjcmliZXIoZGVzdGluYXRpb24sIHRvdGFsKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50b3RhbCA9IHRvdGFsO1xuICAgICAgICBfdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVGFrZVN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMudG90YWw7XG4gICAgICAgIHZhciBjb3VudCA9ICsrdGhpcy5jb3VudDtcbiAgICAgICAgaWYgKGNvdW50IDw9IHRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvdW50ID09PSB0b3RhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUYWtlU3Vic2NyaWJlcjtcbn0oU3Vic2NyaWJlcikpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGFrZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YnNjcmliZXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFN1YnNjcmliZXIgfSBmcm9tICcuLi9TdWJzY3JpYmVyJztcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0SWZFbXB0eShkZWZhdWx0VmFsdWUpIHtcbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHsgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBEZWZhdWx0SWZFbXB0eU9wZXJhdG9yKGRlZmF1bHRWYWx1ZSkpOyB9O1xufVxudmFyIERlZmF1bHRJZkVtcHR5T3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmYXVsdElmRW1wdHlPcGVyYXRvcihkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIERlZmF1bHRJZkVtcHR5T3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kZWZhdWx0VmFsdWUpKTtcbiAgICB9O1xuICAgIHJldHVybiBEZWZhdWx0SWZFbXB0eU9wZXJhdG9yO1xufSgpKTtcbnZhciBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoRGVmYXVsdElmRW1wdHlTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIERlZmF1bHRJZkVtcHR5U3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIF90aGlzLmlzRW1wdHkgPSB0cnVlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIERlZmF1bHRJZkVtcHR5U3Vic2NyaWJlci5wcm90b3R5cGUuX25leHQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5pc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7XG4gICAgfTtcbiAgICBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmYXVsdElmRW1wdHlTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZhdWx0SWZFbXB0eS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YnNjcmliZXIsX3V0aWxfbm9vcCxfdXRpbF9pc0Z1bmN0aW9uIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAnLi4vU3Vic2NyaWJlcic7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vdXRpbC9ub29wJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL2lzRnVuY3Rpb24nO1xuZXhwb3J0IGZ1bmN0aW9uIHRhcChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRhcE9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgRG9PcGVyYXRvcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSk7XG4gICAgfTtcbn1cbnZhciBEb09wZXJhdG9yID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERvT3BlcmF0b3IobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICB0aGlzLm5leHRPck9ic2VydmVyID0gbmV4dE9yT2JzZXJ2ZXI7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlO1xuICAgIH1cbiAgICBEb09wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm5leHRPck9ic2VydmVyLCB0aGlzLmVycm9yLCB0aGlzLmNvbXBsZXRlKSk7XG4gICAgfTtcbiAgICByZXR1cm4gRG9PcGVyYXRvcjtcbn0oKSk7XG52YXIgVGFwU3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhUYXBTdWJzY3JpYmVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRhcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZGVzdGluYXRpb24pIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl90YXBOZXh0ID0gbm9vcDtcbiAgICAgICAgX3RoaXMuX3RhcEVycm9yID0gbm9vcDtcbiAgICAgICAgX3RoaXMuX3RhcENvbXBsZXRlID0gbm9vcDtcbiAgICAgICAgX3RoaXMuX3RhcEVycm9yID0gZXJyb3IgfHwgbm9vcDtcbiAgICAgICAgX3RoaXMuX3RhcENvbXBsZXRlID0gY29tcGxldGUgfHwgbm9vcDtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpKSB7XG4gICAgICAgICAgICBfdGhpcy5fY29udGV4dCA9IF90aGlzO1xuICAgICAgICAgICAgX3RoaXMuX3RhcE5leHQgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkge1xuICAgICAgICAgICAgX3RoaXMuX2NvbnRleHQgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgICAgICAgIF90aGlzLl90YXBOZXh0ID0gb2JzZXJ2ZXJPck5leHQubmV4dCB8fCBub29wO1xuICAgICAgICAgICAgX3RoaXMuX3RhcEVycm9yID0gb2JzZXJ2ZXJPck5leHQuZXJyb3IgfHwgbm9vcDtcbiAgICAgICAgICAgIF90aGlzLl90YXBDb21wbGV0ZSA9IG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlIHx8IG5vb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBUYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fdGFwTmV4dC5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgICB9O1xuICAgIFRhcFN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3RhcEVycm9yLmNhbGwodGhpcy5fY29udGV4dCwgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgIH07XG4gICAgVGFwU3Vic2NyaWJlci5wcm90b3R5cGUuX2NvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUuY2FsbCh0aGlzLl9jb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICB9O1xuICAgIHJldHVybiBUYXBTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10YXAuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIF90YXAsX3V0aWxfRW1wdHlFcnJvciBQVVJFX0lNUE9SVFNfRU5EICovXG5pbXBvcnQgeyB0YXAgfSBmcm9tICcuL3RhcCc7XG5pbXBvcnQgeyBFbXB0eUVycm9yIH0gZnJvbSAnLi4vdXRpbC9FbXB0eUVycm9yJztcbmV4cG9ydCB2YXIgdGhyb3dJZkVtcHR5ID0gZnVuY3Rpb24gKGVycm9yRmFjdG9yeSkge1xuICAgIGlmIChlcnJvckZhY3RvcnkgPT09IHZvaWQgMCkge1xuICAgICAgICBlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5O1xuICAgIH1cbiAgICByZXR1cm4gdGFwKHtcbiAgICAgICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7IHRoaXMuaGFzVmFsdWUgPSB0cnVlOyB9LFxuICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JGYWN0b3J5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3dJZkVtcHR5LmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfdXRpbF9FbXB0eUVycm9yLF9maWx0ZXIsX3Rha2UsX2RlZmF1bHRJZkVtcHR5LF90aHJvd0lmRW1wdHksX3V0aWxfaWRlbnRpdHkgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgRW1wdHlFcnJvciB9IGZyb20gJy4uL3V0aWwvRW1wdHlFcnJvcic7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAnLi90YWtlJztcbmltcG9ydCB7IGRlZmF1bHRJZkVtcHR5IH0gZnJvbSAnLi9kZWZhdWx0SWZFbXB0eSc7XG5pbXBvcnQgeyB0aHJvd0lmRW1wdHkgfSBmcm9tICcuL3Rocm93SWZFbXB0eSc7XG5pbXBvcnQgeyBpZGVudGl0eSB9IGZyb20gJy4uL3V0aWwvaWRlbnRpdHknO1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0KHByZWRpY2F0ZSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgdmFyIGhhc0RlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeyByZXR1cm4gc291cmNlLnBpcGUocHJlZGljYXRlID8gZmlsdGVyKGZ1bmN0aW9uICh2LCBpKSB7IHJldHVybiBwcmVkaWNhdGUodiwgaSwgc291cmNlKTsgfSkgOiBpZGVudGl0eSwgdGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eShmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRW1wdHlFcnJvcigpOyB9KSk7IH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXJzdC5qcy5tYXBcbiIsImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ1N0b3J5IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBTVE9SWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ1N0b3J5Pignc3RvcnknKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5LWZ1bmN0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWNvbnN0cnVjdG9yICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcGFyYW1ldGVyLXByb3BlcnRpZXMgKi9cbi8vIFdlIGNvdWxkIHVzZSBOZ0NvbXBvbmVudE91dGxldCBoZXJlIGJ1dCB0aGVyZSdzIGN1cnJlbnRseSBubyBlYXN5IHdheVxuLy8gdG8gcHJvdmlkZSBASW5wdXRzIGFuZCBzdWJzY3JpYmUgdG8gQE91dHB1dHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTUzNjBcbi8vIEZvciB0aGUgdGltZSBiZWluZywgdGhlIFZpZXdDb250YWluZXJSZWYgYXBwcm9hY2ggd29ya3MgcHJldHR5IHdlbGwuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgT25EZXN0cm95LFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNUT1JZIH0gZnJvbSAnLi4vYXBwLnRva2VuJztcbmltcG9ydCB7IE5nU3RvcnksIElDb2xsZWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdG9yeWJvb2stZHluYW1pYy1hcHAtcm9vdCcsXG4gIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlICN0YXJnZXQ+PC9uZy10ZW1wbGF0ZT4nLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3RhcmdldCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICB0YXJnZXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KFNUT1JZKSBwcml2YXRlIGRhdGE6IE9ic2VydmFibGU8TmdTdG9yeT5cbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoZGF0YTogTmdTdG9yeSkgPT4ge1xuICAgICAgdGhpcy50YXJnZXQuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbXBGYWN0b3J5ID0gdGhpcy5jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZGF0YS5jb21wb25lbnQpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy50YXJnZXQuY3JlYXRlQ29tcG9uZW50KGNvbXBGYWN0b3J5KTtcbiAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGNvbXBvbmVudFJlZjtcbiAgICAgIC8vIEZvciBzb21lIHJlYXNvbiwgbWFudWFsIGNoYW5nZSBkZXRlY3Rpb24gcmVmIGlzIG9ubHkgd29ya2luZyB3aGVuIGdldHRpbmcgdGhlIHJlZiBmcm9tIHRoZSBpbmplY3RvciAocmF0aGVyIHRoYW4gY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmKVxuICAgICAgY29uc3QgY2hpbGRDaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBjb21wb25lbnRSZWYuaW5qZWN0b3IuZ2V0KFxuICAgICAgICBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICAgKTtcblxuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmRhdGEuc3Vic2NyaWJlKG5ld0RhdGEgPT4ge1xuICAgICAgICB0aGlzLnNldFByb3BzKGluc3RhbmNlLCBuZXdEYXRhKTtcbiAgICAgICAgY2hpbGRDaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgLy8gTXVzdCBkZXRlY3QgY2hhbmdlcyBvbiB0aGUgY3VycmVudCBjb21wb25lbnQgaW4gb3JkZXIgdG8gdXBkYXRlIGFueSBjaGFuZ2VzIGluIGNoaWxkIGNvbXBvbmVudCdzIEBIb3N0QmluZGluZyBwcm9wZXJ0aWVzIChhbmd1bGFyL2FuZ3VsYXIjMjI1NjApXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhcmdldC5jbGVhcigpO1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0cyBhbmQgb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBzZXRQcm9wcyhpbnN0YW5jZTogYW55LCB7IHByb3BzID0ge30gfTogTmdTdG9yeSk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgPSB7fTtcbiAgICBjb25zdCBoYXNOZ09uQ2hhbmdlc0hvb2sgPSAhIWluc3RhbmNlLm5nT25DaGFuZ2VzO1xuXG4gICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgICBjb25zdCBpbnN0YW5jZVByb3BlcnR5ID0gaW5zdGFuY2Vba2V5XTtcblxuICAgICAgaWYgKCEoaW5zdGFuY2VQcm9wZXJ0eSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikgJiYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBpbnN0YW5jZVtrZXldID0gdmFsdWU7XG4gICAgICAgIGlmIChoYXNOZ09uQ2hhbmdlc0hvb2spIHtcbiAgICAgICAgICBjaGFuZ2VzW2tleV0gPSBuZXcgU2ltcGxlQ2hhbmdlKHVuZGVmaW5lZCwgdmFsdWUsIGluc3RhbmNlUHJvcGVydHkgPT09IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nICYmIGtleSAhPT0gJ25nTW9kZWxDaGFuZ2UnKSB7XG4gICAgICAgIGluc3RhbmNlUHJvcGVydHkuc3Vic2NyaWJlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY2FsbE5nT25DaGFuZ2VzSG9vayhpbnN0YW5jZSwgY2hhbmdlcyk7XG4gICAgdGhpcy5zZXROZ01vZGVsKGluc3RhbmNlLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgY2FsbCAnbmdPbkNoYW5nZXMnIGhvb2sgYmVjYXVzZSBhbmd1bGFyIGRvZXNuJ3QgZG8gdGhhdCBmb3IgZHluYW1pYyBjb21wb25lbnRzXG4gICAqIElzc3VlOiBbaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvODkwM11cbiAgICovXG4gIHByaXZhdGUgY2FsbE5nT25DaGFuZ2VzSG9vayhpbnN0YW5jZTogYW55LCBjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCkge1xuICAgICAgaW5zdGFuY2UubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIGNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSB0cnkgdG8gc2V0IG5nTW9kZWxcbiAgICovXG4gIHByaXZhdGUgc2V0TmdNb2RlbChpbnN0YW5jZTogYW55LCBwcm9wczogSUNvbGxlY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAocHJvcHMubmdNb2RlbCkge1xuICAgICAgaW5zdGFuY2Uud3JpdGVWYWx1ZShwcm9wcy5uZ01vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLm5nTW9kZWxDaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluc3RhbmNlLnJlZ2lzdGVyT25DaGFuZ2UocHJvcHMubmdNb2RlbENoYW5nZSk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBkb2N1bWVudCB9IGZyb20gJ2dsb2JhbCc7XG5pbXBvcnQgeyBlbmFibGVQcm9kTW9kZSwgTmdNb2R1bGUsIENvbXBvbmVudCwgTmdNb2R1bGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgcGxhdGZvcm1Ccm93c2VyRHluYW1pYyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7XG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcHBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvYXBwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTVE9SWSB9IGZyb20gJy4vYXBwLnRva2VuJztcbmltcG9ydCB7IE5nTW9kdWxlTWV0YWRhdGEsIElTdG9yeUZuLCBOZ1N0b3J5IH0gZnJvbSAnLi90eXBlcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgTk9ERV9FTlY6ICdzdHJpbmcnIHwgJ2RldmVsb3BtZW50JyB8IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5sZXQgcGxhdGZvcm06IGFueSA9IG51bGw7XG5sZXQgcHJvbWlzZXM6IFByb21pc2U8TmdNb2R1bGVSZWY8YW55Pj5bXSA9IFtdO1xuXG5jb25zdCBtb2R1bGVDbGFzcyA9IGNsYXNzIER5bmFtaWNNb2R1bGUge307XG5jb25zdCBjb21wb25lbnRDbGFzcyA9IGNsYXNzIER5bmFtaWNDb21wb25lbnQge307XG5cbnR5cGUgRHluYW1pY0NvbXBvbmVudFR5cGUgPSB0eXBlb2YgY29tcG9uZW50Q2xhc3M7XG5cbmNvbnN0IHN0b3J5RGF0YSA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuXG5jb25zdCBnZXRNb2R1bGUgPSAoXG4gIGRlY2xhcmF0aW9uczogKFR5cGU8YW55PiB8IGFueVtdKVtdLFxuICBlbnRyeUNvbXBvbmVudHM6IChUeXBlPGFueT4gfCBhbnlbXSlbXSxcbiAgYm9vdHN0cmFwOiAoVHlwZTxhbnk+IHwgYW55W10pW10sXG4gIGRhdGE6IE5nU3RvcnksXG4gIG1vZHVsZU1ldGFkYXRhOiBOZ01vZHVsZU1ldGFkYXRhXG4pID0+IHtcbiAgc3RvcnlEYXRhLm5leHQoZGF0YSk7XG5cbiAgY29uc3QgbW9kdWxlTWV0YSA9IHtcbiAgICBkZWNsYXJhdGlvbnM6IFsuLi5kZWNsYXJhdGlvbnMsIC4uLihtb2R1bGVNZXRhZGF0YS5kZWNsYXJhdGlvbnMgfHwgW10pXSxcbiAgICBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZSwgRm9ybXNNb2R1bGUsIC4uLihtb2R1bGVNZXRhZGF0YS5pbXBvcnRzIHx8IFtdKV0sXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBTVE9SWSwgdXNlVmFsdWU6IHN0b3J5RGF0YSB9LCAuLi4obW9kdWxlTWV0YWRhdGEucHJvdmlkZXJzIHx8IFtdKV0sXG4gICAgZW50cnlDb21wb25lbnRzOiBbLi4uZW50cnlDb21wb25lbnRzLCAuLi4obW9kdWxlTWV0YWRhdGEuZW50cnlDb21wb25lbnRzIHx8IFtdKV0sXG4gICAgc2NoZW1hczogWy4uLihtb2R1bGVNZXRhZGF0YS5zY2hlbWFzIHx8IFtdKV0sXG4gICAgYm9vdHN0cmFwOiBbLi4uYm9vdHN0cmFwXSxcbiAgfTtcblxuICByZXR1cm4gTmdNb2R1bGUobW9kdWxlTWV0YSkobW9kdWxlQ2xhc3MpO1xufTtcblxuY29uc3QgY3JlYXRlQ29tcG9uZW50RnJvbVRlbXBsYXRlID0gKHRlbXBsYXRlOiBzdHJpbmcsIHN0eWxlczogc3RyaW5nW10pID0+IHtcbiAgcmV0dXJuIENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGUsXG4gICAgc3R5bGVzLFxuICB9KShjb21wb25lbnRDbGFzcyk7XG59O1xuXG5jb25zdCBleHRyYWN0TmdNb2R1bGVNZXRhZGF0YSA9IChpbXBvcnRJdGVtOiBhbnkpOiBOZ01vZHVsZSA9PiB7XG4gIGNvbnN0IGRlY29yYXRvcktleSA9ICdfX2Fubm90YXRpb25zX18nO1xuICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9XG4gICAgUmVmbGVjdCAmJiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvclxuICAgICAgPyBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbXBvcnRJdGVtLCBkZWNvcmF0b3JLZXkpLnZhbHVlXG4gICAgICA6IGltcG9ydEl0ZW1bZGVjb3JhdG9yS2V5XTtcblxuICBpZiAoIWRlY29yYXRvcnMgfHwgZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5nTW9kdWxlRGVjb3JhdG9yOiBOZ01vZHVsZSB8IHVuZGVmaW5lZCA9IGRlY29yYXRvcnMuZmluZChcbiAgICBkZWNvcmF0b3IgPT4gZGVjb3JhdG9yIGluc3RhbmNlb2YgTmdNb2R1bGVcbiAgKTtcbiAgaWYgKCFuZ01vZHVsZURlY29yYXRvcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBuZ01vZHVsZURlY29yYXRvcjtcbn07XG5cbmNvbnN0IGdldEV4aXN0ZW5jZU9mQ29tcG9uZW50SW5Nb2R1bGVzID0gKFxuICBjb21wb25lbnQ6IGFueSxcbiAgZGVjbGFyYXRpb25zOiBhbnlbXSxcbiAgaW1wb3J0czogYW55W11cbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoZGVjbGFyYXRpb25zICYmIGRlY2xhcmF0aW9ucy5zb21lKGRlY2xhcmF0aW9uID0+IGRlY2xhcmF0aW9uID09PSBjb21wb25lbnQpKSB7XG4gICAgLy8gRm91bmQgY29tcG9uZW50IGluIGRlY2xhcmF0aW9ucyBhcnJheVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaW1wb3J0cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzLnNvbWUoaW1wb3J0SXRlbSA9PiB7XG4gICAgY29uc3QgZXh0cmFjdGVkTmdNb2R1bGVNZXRhZGF0YSA9IGV4dHJhY3ROZ01vZHVsZU1ldGFkYXRhKGltcG9ydEl0ZW0pO1xuICAgIGlmICghZXh0cmFjdGVkTmdNb2R1bGVNZXRhZGF0YSkge1xuICAgICAgLy8gTm90IGFuIE5nTW9kdWxlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBnZXRFeGlzdGVuY2VPZkNvbXBvbmVudEluTW9kdWxlcyhcbiAgICAgIGNvbXBvbmVudCxcbiAgICAgIGV4dHJhY3RlZE5nTW9kdWxlTWV0YWRhdGEuZGVjbGFyYXRpb25zLFxuICAgICAgZXh0cmFjdGVkTmdNb2R1bGVNZXRhZGF0YS5pbXBvcnRzXG4gICAgKTtcbiAgfSk7XG59O1xuXG5jb25zdCBpbml0TW9kdWxlID0gKHN0b3J5Rm46IElTdG9yeUZuKSA9PiB7XG4gIGNvbnN0IHN0b3J5T2JqID0gc3RvcnlGbigpO1xuICBjb25zdCB7IGNvbXBvbmVudCwgdGVtcGxhdGUsIHByb3BzLCBzdHlsZXMsIG1vZHVsZU1ldGFkYXRhID0ge30gfSA9IHN0b3J5T2JqO1xuXG4gIGNvbnN0IGlzQ3JlYXRpbmdDb21wb25lbnRGcm9tVGVtcGxhdGUgPSBCb29sZWFuKHRlbXBsYXRlKTtcblxuICBjb25zdCBBbm5vdGF0ZWRDb21wb25lbnQgPSBpc0NyZWF0aW5nQ29tcG9uZW50RnJvbVRlbXBsYXRlXG4gICAgPyBjcmVhdGVDb21wb25lbnRGcm9tVGVtcGxhdGUodGVtcGxhdGUsIHN0eWxlcylcbiAgICA6IGNvbXBvbmVudDtcblxuICBjb25zdCBjb21wb25lbnRSZXF1aWVzRGVjbGFyYXRpb24gPVxuICAgIGlzQ3JlYXRpbmdDb21wb25lbnRGcm9tVGVtcGxhdGUgfHxcbiAgICAhZ2V0RXhpc3RlbmNlT2ZDb21wb25lbnRJbk1vZHVsZXMoXG4gICAgICBjb21wb25lbnQsXG4gICAgICBtb2R1bGVNZXRhZGF0YS5kZWNsYXJhdGlvbnMsXG4gICAgICBtb2R1bGVNZXRhZGF0YS5pbXBvcnRzXG4gICAgKTtcblxuICBjb25zdCBjb21wb25lbnREZWNsYXJhdGlvbnMgPSBjb21wb25lbnRSZXF1aWVzRGVjbGFyYXRpb25cbiAgICA/IFtBcHBDb21wb25lbnQsIEFubm90YXRlZENvbXBvbmVudF1cbiAgICA6IFtBcHBDb21wb25lbnRdO1xuXG4gIGNvbnN0IHN0b3J5ID0ge1xuICAgIGNvbXBvbmVudDogQW5ub3RhdGVkQ29tcG9uZW50LFxuICAgIHByb3BzLFxuICB9O1xuXG4gIHJldHVybiBnZXRNb2R1bGUoXG4gICAgY29tcG9uZW50RGVjbGFyYXRpb25zLFxuICAgIFtBbm5vdGF0ZWRDb21wb25lbnRdLFxuICAgIFtBcHBDb21wb25lbnRdLFxuICAgIHN0b3J5LFxuICAgIG1vZHVsZU1ldGFkYXRhXG4gICk7XG59O1xuXG5jb25zdCBzdGF0aWNSb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKTtcbmNvbnN0IGluc2VydER5bmFtaWNSb290ID0gKCkgPT4ge1xuICBjb25zdCBhcHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdG9yeWJvb2stZHluYW1pYy1hcHAtcm9vdCcpO1xuICBzdGF0aWNSb290LmFwcGVuZENoaWxkKGFwcCk7XG59O1xuXG5jb25zdCBkcmF3ID0gKG5ld01vZHVsZTogRHluYW1pY0NvbXBvbmVudFR5cGUpOiB2b2lkID0+IHtcbiAgaWYgKCFwbGF0Zm9ybSkge1xuICAgIGluc2VydER5bmFtaWNSb290KCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgaWYgKHR5cGVvZiBOT0RFX0VOViA9PT0gJ3N0cmluZycgJiYgTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVuYWJsZVByb2RNb2RlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgfVxuXG4gICAgcGxhdGZvcm0gPSBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCk7XG4gICAgcHJvbWlzZXMucHVzaChwbGF0Zm9ybS5ib290c3RyYXBNb2R1bGUobmV3TW9kdWxlKSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4obW9kdWxlcyA9PiB7XG4gICAgICBtb2R1bGVzLmZvckVhY2gobW9kID0+IG1vZC5kZXN0cm95KCkpO1xuXG4gICAgICBpbnNlcnREeW5hbWljUm9vdCgpO1xuICAgICAgcHJvbWlzZXMgPSBbXTtcbiAgICAgIHByb21pc2VzLnB1c2gocGxhdGZvcm0uYm9vdHN0cmFwTW9kdWxlKG5ld01vZHVsZSkpO1xuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVuZGVyTmdBcHAgPSAoc3RvcnlGbjogSVN0b3J5Rm4sIGZvcmNlZDogYm9vbGVhbikgPT4ge1xuICBpZiAoIWZvcmNlZCkge1xuICAgIGRyYXcoaW5pdE1vZHVsZShzdG9yeUZuKSk7XG4gIH0gZWxzZSB7XG4gICAgc3RvcnlEYXRhLm5leHQoc3RvcnlGbigpKTtcbiAgfVxufTtcbiIsIi8qIVxuICogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBpc09iamVjdCBmcm9tICdpc29iamVjdCc7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0T2JqZWN0KG8pIHtcbiAgcmV0dXJuIGlzT2JqZWN0KG8pID09PSB0cnVlXG4gICAgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvKSB7XG4gIHZhciBjdG9yLHByb3Q7XG5cbiAgaWYgKGlzT2JqZWN0T2JqZWN0KG8pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIGhhcyBtb2RpZmllZCBjb25zdHJ1Y3RvclxuICBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgaWYgKHR5cGVvZiBjdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSWYgaGFzIG1vZGlmaWVkIHByb3RvdHlwZVxuICBwcm90ID0gY3Rvci5wcm90b3R5cGU7XG4gIGlmIChpc09iamVjdE9iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGFuIE9iamVjdC1zcGVjaWZpYyBtZXRob2RcbiAgaWYgKHByb3QuaGFzT3duUHJvcGVydHkoJ2lzUHJvdG90eXBlT2YnKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNb3N0IGxpa2VseSBhIHBsYWluIE9iamVjdFxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCIvKiFcbiAqIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHZhbCkgPT09IGZhbHNlO1xufTtcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YnNjcmliZXIgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IFN1YnNjcmliZXIgfSBmcm9tICcuLi9TdWJzY3JpYmVyJztcbmV4cG9ydCBmdW5jdGlvbiByZWZDb3VudCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gcmVmQ291bnRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IFJlZkNvdW50T3BlcmF0b3Ioc291cmNlKSk7XG4gICAgfTtcbn1cbnZhciBSZWZDb3VudE9wZXJhdG9yID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZkNvdW50T3BlcmF0b3IoY29ubmVjdGFibGUpIHtcbiAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IGNvbm5lY3RhYmxlO1xuICAgIH1cbiAgICBSZWZDb3VudE9wZXJhdG9yLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHN1YnNjcmliZXIsIHNvdXJjZSkge1xuICAgICAgICB2YXIgY29ubmVjdGFibGUgPSB0aGlzLmNvbm5lY3RhYmxlO1xuICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQrKztcbiAgICAgICAgdmFyIHJlZkNvdW50ZXIgPSBuZXcgUmVmQ291bnRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGNvbm5lY3RhYmxlKTtcbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUocmVmQ291bnRlcik7XG4gICAgICAgIGlmICghcmVmQ291bnRlci5jbG9zZWQpIHtcbiAgICAgICAgICAgIHJlZkNvdW50ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLmNvbm5lY3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFJlZkNvdW50T3BlcmF0b3I7XG59KCkpO1xudmFyIFJlZkNvdW50U3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhSZWZDb3VudFN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmQ291bnRTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZWZDb3VudFN1YnNjcmliZXIucHJvdG90eXBlLl91bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbm5lY3RhYmxlID0gdGhpcy5jb25uZWN0YWJsZTtcbiAgICAgICAgaWYgKCFjb25uZWN0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gbnVsbDtcbiAgICAgICAgdmFyIHJlZkNvdW50ID0gY29ubmVjdGFibGUuX3JlZkNvdW50O1xuICAgICAgICBpZiAocmVmQ291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQgPSByZWZDb3VudCAtIDE7XG4gICAgICAgIGlmIChyZWZDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbm5lY3Rpb24gPSB0aGlzLmNvbm5lY3Rpb247XG4gICAgICAgIHZhciBzaGFyZWRDb25uZWN0aW9uID0gY29ubmVjdGFibGUuX2Nvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaGFyZWRDb25uZWN0aW9uICYmICghY29ubmVjdGlvbiB8fCBzaGFyZWRDb25uZWN0aW9uID09PSBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgc2hhcmVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gUmVmQ291bnRTdWJzY3JpYmVyO1xufShTdWJzY3JpYmVyKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWZDb3VudC5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgdHNsaWIsX1N1YmplY3QsX09ic2VydmFibGUsX1N1YnNjcmliZXIsX1N1YnNjcmlwdGlvbixfb3BlcmF0b3JzX3JlZkNvdW50IFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCAqIGFzIHRzbGliXzEgZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBTdWJqZWN0U3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YmplY3QnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJy4uL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJy4uL1N1YnNjcmliZXInO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAnLi4vU3Vic2NyaXB0aW9uJztcbmltcG9ydCB7IHJlZkNvdW50IGFzIGhpZ2hlck9yZGVyUmVmQ291bnQgfSBmcm9tICcuLi9vcGVyYXRvcnMvcmVmQ291bnQnO1xudmFyIENvbm5lY3RhYmxlT2JzZXJ2YWJsZSA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhDb25uZWN0YWJsZU9ic2VydmFibGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGFibGVPYnNlcnZhYmxlKHNvdXJjZSwgc3ViamVjdEZhY3RvcnkpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBfdGhpcy5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5O1xuICAgICAgICBfdGhpcy5fcmVmQ291bnQgPSAwO1xuICAgICAgICBfdGhpcy5faXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN1YmplY3QoKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfTtcbiAgICBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlLmdldFN1YmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdWJqZWN0ID0gdGhpcy5fc3ViamVjdDtcbiAgICAgICAgaWYgKCFzdWJqZWN0IHx8IHN1YmplY3QuaXNTdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdWJqZWN0O1xuICAgIH07XG4gICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb247XG4gICAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5faXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmFkZCh0aGlzLnNvdXJjZVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUobmV3IENvbm5lY3RhYmxlU3Vic2NyaWJlcih0aGlzLmdldFN1YmplY3QoKSwgdGhpcykpKTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9O1xuICAgIENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGUucmVmQ291bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoaWdoZXJPcmRlclJlZkNvdW50KCkodGhpcyk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGFibGVPYnNlcnZhYmxlO1xufShPYnNlcnZhYmxlKSk7XG5leHBvcnQgeyBDb25uZWN0YWJsZU9ic2VydmFibGUgfTtcbnZhciBjb25uZWN0YWJsZVByb3RvID0gQ29ubmVjdGFibGVPYnNlcnZhYmxlLnByb3RvdHlwZTtcbmV4cG9ydCB2YXIgY29ubmVjdGFibGVPYnNlcnZhYmxlRGVzY3JpcHRvciA9IHtcbiAgICBvcGVyYXRvcjogeyB2YWx1ZTogbnVsbCB9LFxuICAgIF9yZWZDb3VudDogeyB2YWx1ZTogMCwgd3JpdGFibGU6IHRydWUgfSxcbiAgICBfc3ViamVjdDogeyB2YWx1ZTogbnVsbCwgd3JpdGFibGU6IHRydWUgfSxcbiAgICBfY29ubmVjdGlvbjogeyB2YWx1ZTogbnVsbCwgd3JpdGFibGU6IHRydWUgfSxcbiAgICBfc3Vic2NyaWJlOiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLl9zdWJzY3JpYmUgfSxcbiAgICBfaXNDb21wbGV0ZTogeyB2YWx1ZTogY29ubmVjdGFibGVQcm90by5faXNDb21wbGV0ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICBnZXRTdWJqZWN0OiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLmdldFN1YmplY3QgfSxcbiAgICBjb25uZWN0OiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLmNvbm5lY3QgfSxcbiAgICByZWZDb3VudDogeyB2YWx1ZTogY29ubmVjdGFibGVQcm90by5yZWZDb3VudCB9XG59O1xudmFyIENvbm5lY3RhYmxlU3Vic2NyaWJlciA9IC8qQF9fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhDb25uZWN0YWJsZVN1YnNjcmliZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29ubmVjdGFibGVTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBDb25uZWN0YWJsZVN1YnNjcmliZXIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fZXJyb3IuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH07XG4gICAgQ29ubmVjdGFibGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGFibGUuX2lzQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgQ29ubmVjdGFibGVTdWJzY3JpYmVyLnByb3RvdHlwZS5fdW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb25uZWN0YWJsZSA9IHRoaXMuY29ubmVjdGFibGU7XG4gICAgICAgIGlmIChjb25uZWN0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7XG4gICAgICAgICAgICB2YXIgY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uO1xuICAgICAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gMDtcbiAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9zdWJqZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ29ubmVjdGFibGVTdWJzY3JpYmVyO1xufShTdWJqZWN0U3Vic2NyaWJlcikpO1xudmFyIFJlZkNvdW50T3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVmQ291bnRPcGVyYXRvcihjb25uZWN0YWJsZSkge1xuICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7XG4gICAgfVxuICAgIFJlZkNvdW50T3BlcmF0b3IucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoc3Vic2NyaWJlciwgc291cmNlKSB7XG4gICAgICAgIHZhciBjb25uZWN0YWJsZSA9IHRoaXMuY29ubmVjdGFibGU7XG4gICAgICAgIGNvbm5lY3RhYmxlLl9yZWZDb3VudCsrO1xuICAgICAgICB2YXIgcmVmQ291bnRlciA9IG5ldyBSZWZDb3VudFN1YnNjcmliZXIoc3Vic2NyaWJlciwgY29ubmVjdGFibGUpO1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShyZWZDb3VudGVyKTtcbiAgICAgICAgaWYgKCFyZWZDb3VudGVyLmNsb3NlZCkge1xuICAgICAgICAgICAgcmVmQ291bnRlci5jb25uZWN0aW9uID0gY29ubmVjdGFibGUuY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gUmVmQ291bnRPcGVyYXRvcjtcbn0oKSk7XG52YXIgUmVmQ291bnRTdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFJlZkNvdW50U3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWZDb3VudFN1YnNjcmliZXIoZGVzdGluYXRpb24sIGNvbm5lY3RhYmxlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5jb25uZWN0YWJsZSA9IGNvbm5lY3RhYmxlO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFJlZkNvdW50U3Vic2NyaWJlci5wcm90b3R5cGUuX3Vuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29ubmVjdGFibGUgPSB0aGlzLmNvbm5lY3RhYmxlO1xuICAgICAgICBpZiAoIWNvbm5lY3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBudWxsO1xuICAgICAgICB2YXIgcmVmQ291bnQgPSBjb25uZWN0YWJsZS5fcmVmQ291bnQ7XG4gICAgICAgIGlmIChyZWZDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3RhYmxlLl9yZWZDb3VudCA9IHJlZkNvdW50IC0gMTtcbiAgICAgICAgaWYgKHJlZkNvdW50ID4gMSkge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbjtcbiAgICAgICAgdmFyIHNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5fY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgaWYgKHNoYXJlZENvbm5lY3Rpb24gJiYgKCFjb25uZWN0aW9uIHx8IHNoYXJlZENvbm5lY3Rpb24gPT09IGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBzaGFyZWRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZDb3VudFN1YnNjcmliZXI7XG59KFN1YnNjcmliZXIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbm5lY3RhYmxlT2JzZXJ2YWJsZS5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX29ic2VydmFibGVfQ29ubmVjdGFibGVPYnNlcnZhYmxlIFBVUkVfSU1QT1JUU19FTkQgKi9cbmltcG9ydCB7IGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgfSBmcm9tICcuLi9vYnNlcnZhYmxlL0Nvbm5lY3RhYmxlT2JzZXJ2YWJsZSc7XG5leHBvcnQgZnVuY3Rpb24gbXVsdGljYXN0KHN1YmplY3RPclN1YmplY3RGYWN0b3J5LCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiBtdWx0aWNhc3RPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgICB2YXIgc3ViamVjdEZhY3Rvcnk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdE9yU3ViamVjdEZhY3RvcnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN1YmplY3RGYWN0b3J5ID0gc3ViamVjdE9yU3ViamVjdEZhY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdWJqZWN0RmFjdG9yeSA9IGZ1bmN0aW9uIHN1YmplY3RGYWN0b3J5KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBNdWx0aWNhc3RPcGVyYXRvcihzdWJqZWN0RmFjdG9yeSwgc2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29ubmVjdGFibGUgPSBPYmplY3QuY3JlYXRlKHNvdXJjZSwgY29ubmVjdGFibGVPYnNlcnZhYmxlRGVzY3JpcHRvcik7XG4gICAgICAgIGNvbm5lY3RhYmxlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgY29ubmVjdGFibGUuc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0RmFjdG9yeTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RhYmxlO1xuICAgIH07XG59XG52YXIgTXVsdGljYXN0T3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTXVsdGljYXN0T3BlcmF0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0RmFjdG9yeTtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIH1cbiAgICBNdWx0aWNhc3RPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBzb3VyY2UpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjtcbiAgICAgICAgdmFyIHN1YmplY3QgPSB0aGlzLnN1YmplY3RGYWN0b3J5KCk7XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzZWxlY3RvcihzdWJqZWN0KS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5hZGQoc291cmNlLnN1YnNjcmliZShzdWJqZWN0KSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfTtcbiAgICByZXR1cm4gTXVsdGljYXN0T3BlcmF0b3I7XG59KCkpO1xuZXhwb3J0IHsgTXVsdGljYXN0T3BlcmF0b3IgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW11bHRpY2FzdC5qcy5tYXBcbiIsIi8qKiBQVVJFX0lNUE9SVFNfU1RBUlQgX211bHRpY2FzdCxfcmVmQ291bnQsX1N1YmplY3QgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgbXVsdGljYXN0IH0gZnJvbSAnLi9tdWx0aWNhc3QnO1xuaW1wb3J0IHsgcmVmQ291bnQgfSBmcm9tICcuL3JlZkNvdW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICcuLi9TdWJqZWN0JztcbmZ1bmN0aW9uIHNoYXJlU3ViamVjdEZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBTdWJqZWN0KCk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhcmUoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzb3VyY2UpIHsgcmV0dXJuIHJlZkNvdW50KCkobXVsdGljYXN0KHNoYXJlU3ViamVjdEZhY3RvcnkpKHNvdXJjZSkpOyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhcmUuanMubWFwXG4iLCIvKiogUFVSRV9JTVBPUlRTX1NUQVJUIHRzbGliLF91dGlsX3N1YnNjcmliZVRvUmVzdWx0LF9PdXRlclN1YnNjcmliZXIsX0lubmVyU3Vic2NyaWJlcixfbWFwLF9vYnNlcnZhYmxlX2Zyb20gUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0ICogYXMgdHNsaWJfMSBmcm9tIFwidHNsaWJcIjtcbmltcG9ydCB7IHN1YnNjcmliZVRvUmVzdWx0IH0gZnJvbSAnLi4vdXRpbC9zdWJzY3JpYmVUb1Jlc3VsdCc7XG5pbXBvcnQgeyBPdXRlclN1YnNjcmliZXIgfSBmcm9tICcuLi9PdXRlclN1YnNjcmliZXInO1xuaW1wb3J0IHsgSW5uZXJTdWJzY3JpYmVyIH0gZnJvbSAnLi4vSW5uZXJTdWJzY3JpYmVyJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJy4vbWFwJztcbmltcG9ydCB7IGZyb20gfSBmcm9tICcuLi9vYnNlcnZhYmxlL2Zyb20nO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7IHJldHVybiBzb3VyY2UucGlwZShtZXJnZU1hcChmdW5jdGlvbiAoYSwgaSkgeyByZXR1cm4gZnJvbShwcm9qZWN0KGEsIGkpKS5waXBlKG1hcChmdW5jdGlvbiAoYiwgaWkpIHsgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTsgfSkpOyB9LCBjb25jdXJyZW50KSk7IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgeyByZXR1cm4gc291cmNlLmxpZnQobmV3IE1lcmdlTWFwT3BlcmF0b3IocHJvamVjdCwgY29uY3VycmVudCkpOyB9O1xufVxudmFyIE1lcmdlTWFwT3BlcmF0b3IgPSAvKkBfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVyZ2VNYXBPcGVyYXRvcihwcm9qZWN0LCBjb25jdXJyZW50KSB7XG4gICAgICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICB9XG4gICAgTWVyZ2VNYXBPcGVyYXRvci5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uIChvYnNlcnZlciwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZU1hcFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJvamVjdCwgdGhpcy5jb25jdXJyZW50KSk7XG4gICAgfTtcbiAgICByZXR1cm4gTWVyZ2VNYXBPcGVyYXRvcjtcbn0oKSk7XG5leHBvcnQgeyBNZXJnZU1hcE9wZXJhdG9yIH07XG52YXIgTWVyZ2VNYXBTdWJzY3JpYmVyID0gLypAX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKE1lcmdlTWFwU3Vic2NyaWJlciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBNZXJnZU1hcFN1YnNjcmliZXIoZGVzdGluYXRpb24sIHByb2plY3QsIGNvbmN1cnJlbnQpIHtcbiAgICAgICAgaWYgKGNvbmN1cnJlbnQgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBkZXN0aW5hdGlvbikgfHwgdGhpcztcbiAgICAgICAgX3RoaXMucHJvamVjdCA9IHByb2plY3Q7XG4gICAgICAgIF90aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgICAgICBfdGhpcy5oYXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuYnVmZmVyID0gW107XG4gICAgICAgIF90aGlzLmFjdGl2ZSA9IDA7XG4gICAgICAgIF90aGlzLmluZGV4ID0gMDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBNZXJnZU1hcFN1YnNjcmliZXIucHJvdG90eXBlLl9uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSA8IHRoaXMuY29uY3VycmVudCkge1xuICAgICAgICAgICAgdGhpcy5fdHJ5TmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5fdHJ5TmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4Kys7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QodmFsdWUsIGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmUrKztcbiAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpO1xuICAgIH07XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5faW5uZXJTdWIgPSBmdW5jdGlvbiAoaXNoLCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGlubmVyU3Vic2NyaWJlciA9IG5ldyBJbm5lclN1YnNjcmliZXIodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uO1xuICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpYmVyKTtcbiAgICAgICAgc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgaXNoLCB2YWx1ZSwgaW5kZXgsIGlubmVyU3Vic2NyaWJlcik7XG4gICAgfTtcbiAgICBNZXJnZU1hcFN1YnNjcmliZXIucHJvdG90eXBlLl9jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgPT09IDAgJiYgdGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH07XG4gICAgTWVyZ2VNYXBTdWJzY3JpYmVyLnByb3RvdHlwZS5ub3RpZnlOZXh0ID0gZnVuY3Rpb24gKG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTtcbiAgICB9O1xuICAgIE1lcmdlTWFwU3Vic2NyaWJlci5wcm90b3R5cGUubm90aWZ5Q29tcGxldGUgPSBmdW5jdGlvbiAoaW5uZXJTdWIpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuICAgICAgICB0aGlzLnJlbW92ZShpbm5lclN1Yik7XG4gICAgICAgIHRoaXMuYWN0aXZlLS07XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dChidWZmZXIuc2hpZnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY3RpdmUgPT09IDAgJiYgdGhpcy5oYXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lcmdlTWFwU3Vic2NyaWJlcjtcbn0oT3V0ZXJTdWJzY3JpYmVyKSk7XG5leHBvcnQgeyBNZXJnZU1hcFN1YnNjcmliZXIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlTWFwLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfbWVyZ2VNYXAsX3V0aWxfaWRlbnRpdHkgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgbWVyZ2VNYXAgfSBmcm9tICcuL21lcmdlTWFwJztcbmltcG9ydCB7IGlkZW50aXR5IH0gZnJvbSAnLi4vdXRpbC9pZGVudGl0eSc7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICAgIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlTWFwKGlkZW50aXR5LCBjb25jdXJyZW50KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lcmdlQWxsLmpzLm1hcFxuIiwiLyoqIFBVUkVfSU1QT1JUU19TVEFSVCBfT2JzZXJ2YWJsZSxfdXRpbF9pc1NjaGVkdWxlcixfb3BlcmF0b3JzX21lcmdlQWxsLF9mcm9tQXJyYXkgUFVSRV9JTVBPUlRTX0VORCAqL1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJy4uL09ic2VydmFibGUnO1xuaW1wb3J0IHsgaXNTY2hlZHVsZXIgfSBmcm9tICcuLi91dGlsL2lzU2NoZWR1bGVyJztcbmltcG9ydCB7IG1lcmdlQWxsIH0gZnJvbSAnLi4vb3BlcmF0b3JzL21lcmdlQWxsJztcbmltcG9ydCB7IGZyb21BcnJheSB9IGZyb20gJy4vZnJvbUFycmF5JztcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZXMgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBvYnNlcnZhYmxlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICB2YXIgc2NoZWR1bGVyID0gbnVsbDtcbiAgICB2YXIgbGFzdCA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChpc1NjaGVkdWxlcihsYXN0KSkge1xuICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTtcbiAgICAgICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uY3VycmVudCA9IG9ic2VydmFibGVzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25jdXJyZW50ID0gb2JzZXJ2YWJsZXMucG9wKCk7XG4gICAgfVxuICAgIGlmIChzY2hlZHVsZXIgPT09IG51bGwgJiYgb2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxICYmIG9ic2VydmFibGVzWzBdIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZXNbMF07XG4gICAgfVxuICAgIHJldHVybiBtZXJnZUFsbChjb25jdXJyZW50KShmcm9tQXJyYXkob2JzZXJ2YWJsZXMsIHNjaGVkdWxlcikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVyZ2UuanMubWFwXG4iXSwic291cmNlUm9vdCI6IiJ9